ga-5-4/0000755000175000017500000000000012662210514010027 5ustar mbambaga-5-4/INSTALL0000644000175000017500000003633212662210476011076 0ustar mbambaInstallation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ga-5-4/global/0000755000175000017500000000000012662210461011270 5ustar mbambaga-5-4/global/X/0000755000175000017500000000000012662210454011501 5ustar mbambaga-5-4/global/X/xregion_scrollbars.c0000644000175000017500000000771612662210454015561 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "xregion.h" #include #define GA_ABS(x) (((x) < 0 )? -(x) : (x)) void DisplayIntervalValue() { (void) sprintf(interval_string, "%4d ms", interval); XtSetArg(arg[0], XtNlabel, interval_string); XtSetValues(interval_widget,arg,1); } void DisplaySlowdownValue() { (void) sprintf(slowdown_string, "%5.1f times", slowdown); XtSetArg(arg[0], XtNlabel, slowdown_string); XtSetValues(slowdown_widget,arg,1); } /**/ /* JJU: void ScrollProc(Widget scrollbar, caddr_t data, caddr_t position) */ void ScrollProc(Widget scrollbar, XtPointer data, XtPointer position) /* Called when the left or right buttons are used to step the scrollbar left or right. We have the responsibility of moving the scrollbar. */ { Dimension length; float fraction; float shown; /* Get the scrollbar length and move the scroll bar */ XtSetArg(arg[0], XtNlength, &length); XtGetValues(scrollbar, arg, 1); fraction = ((int) position)/ (double) length; interval = fraction*0.05*interval_max; interval = GA_MIN(interval, interval_max); interval = GA_MAX(interval, 1); fraction = (float) interval/ (float) interval_max; shown = -1.0; DisplayIntervalValue(); XawScrollbarSetThumb(scrollbar, fraction, shown); } /***** slowdown **********/ /* JJU: void ScrollProc2(Widget scrollbar, caddr_t data, caddr_t position) */ void ScrollProc2(Widget scrollbar, XtPointer data, XtPointer position) /* Called when the left or right buttons are used to step the scrollbar left or right. We have the responsibility of moving the scrollbar. */ { Dimension length; double fraction; float shown; /* Get the scrollbar length and move the scroll bar */ XtSetArg(arg[0], XtNlength, &length); XtGetValues(scrollbar, arg, 1); fraction -= ((int) position)/ (double) length; slowdown = fraction*0.2*slowdown_max; /* need to add small number to avoid domain error in log(0) */ slowdown = GA_MIN(slowdown,slowdown_max); slowdown = GA_MAX(slowdown, slowdown_min); /* scale current time according to the slowdown factor */ #ifdef DEBUG printf("before scaling %lu ( %ld %ld factor=%f) ",cur_time, slowdown,oldslowdown,(1.0*slowdown)/oldslowdown); #endif /* DEBUG */ cur_time = cur_time*slowdown/oldslowdown; #ifdef DEBUG printf("and after %lu\n ",cur_time); #endif /* DEBUG */ oldslowdown = slowdown; fraction = (float) slowdown/ (float) slowdown_max; shown = -1.0; DisplaySlowdownValue(); XawScrollbarSetThumb(scrollbar, (float)fraction, shown); } /**/ /* JJU: void JumpProc(Widget scrollbar, caddr_t data, caddr_t fraction_ptr) */ void JumpProc(Widget scrollbar, XtPointer data, XtPointer fraction_ptr) /* Called when the middle button is used to drag to the scrollbar. The scrollbar is moved for us. */ { float fraction = *(float *) fraction_ptr; interval = fraction*interval_max; interval = GA_MIN(interval, interval_max); interval = GA_MAX(interval, 1); DisplayIntervalValue(); } /**** slowdown ****/ /* JJU: void JumpProc2(Widget scrollbar, caddr_t data, caddr_t fraction_ptr) */ void JumpProc2(Widget scrollbar, XtPointer data, XtPointer fraction_ptr) /* Called when the middle button is used to drag to the scrollbar. The scrollbar is moved for us. */ { double exp_fraction; float fraction = *(float *) fraction_ptr; exp_fraction = pow(POW_BASE,(double)fraction); exp_fraction = (exp_fraction-1.)/ (pow(POW_BASE,1.) -1.); slowdown = exp_fraction*(slowdown_max-slowdown_min) + slowdown_min; slowdown = GA_MIN(slowdown,slowdown_max); slowdown = GA_MAX(slowdown, slowdown_min); /* scale current time according to the slowdown factor */ #ifdef DEBUG printf("before scaling %lu ( %ld %ld factor=%f) ",cur_time, slowdown,oldslowdown,(1.0*slowdown)/oldslowdown); #endif /* DEBUG */ cur_time = cur_time*slowdown/oldslowdown; #ifdef DEBUG printf("and after %lu\n ",cur_time); #endif /* DEBUG */ oldslowdown = slowdown; DisplaySlowdownValue(); } ga-5-4/global/X/xregion.h0000644000175000017500000001360712662210454013334 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* #define DEBUG */ #define INITSLOW 50. #define POW_BASE 100. extern void exit(); /* function prototypes */ extern void Error(char *message, int err_num); extern void UpdatePixRegion(int ilo, int ihi, int jlo, int jhi, int increment, double time); extern void DisplayPixRegion(int ilo, int ihi, int jlo, int jhi); extern void DisplaySlowdownValue(); extern void DisplayIntervalValue(); /* JJU: extern void ScrollProc(Widget scrollbar, caddr_t data, caddr_t position); */ extern void ScrollProc(Widget scrollbar, XtPointer data, XtPointer position); /* JJU: extern void ScrollProc2(Widget scrollbar, caddr_t data, caddr_t position); */ extern void ScrollProc2(Widget scrollbar, XtPointer data, XtPointer position); /* JJU: extern void JumpProc(Widget scrollbar, caddr_t data, caddr_t fraction_ptr); */ extern void JumpProc(Widget scrollbar, XtPointer data, XtPointer fraction_ptr); /* JJU: extern void JumpProc2(Widget scrollbar, caddr_t data, caddr_t fraction_ptr); */ extern void JumpProc2(Widget scrollbar, XtPointer data, XtPointer fraction_ptr); extern void DrawColorMap(); extern void PrintColorMapText(); extern void UpdateDisplay(); /* JJU: extern void TimeOutCallback(caddr_t data); */ extern void TimeOutCallback(XtPointer data, XtIntervalId *xtintervalid); /* JJU: extern void Exposed(Widget widget, caddr_t data, XEvent *event); */ extern void Exposed(Widget widget, XtPointer data, XEvent *event, Boolean *bln); /* JJU: extern void dismiss_dialog(Widget w, caddr_t data, XEvent *event) */ extern void dismiss_dialog(Widget widget, XtPointer data, XtPointer event); /* JJU: extern void Quit(Widget widget, caddr_t data, XEvent *event); */ extern void Quit(Widget widget, XtPointer data, XtPointer event); /* JJU: extern void StartStop(Widget widget, caddr_t data, XEvent *event); */ extern void StartStop(Widget widget, XtPointer data, XtPointer event); /* JJU: extern void start_view(Widget widget, caddr_t data, XEvent *event); */ extern void start_view(Widget widget, XtPointer data, XtPointer event); extern void Setcmap(); extern void ReadEventFile(char *filename); /* JJU: extern void running_coords(Widget widget, caddr_t data, XEvent *event); */ extern void running_coords(Widget widget, XtPointer data, XEvent *event, Boolean *bln); /* JJU: extern void running_overview(Widget widget, caddr_t data, XEvent *event); */ extern void running_overview(Widget widget, XtPointer data, XEvent *event, Boolean *bln); /* JJU: extern void draw_select_box(Widget widget, caddr_t data, XEvent *event); */ extern void draw_select_box(Widget widget, XtPointer data, XEvent *event, Boolean *bln); extern int in_display_region(int ilo, int ihi, int jlo, int jhi); extern XtAppContext create_overview(int argc, char **argv); extern void create_main_window(); extern void setup_drawing(); extern void dialog_box(char *dlg_str); extern void set_config(); /* Globals needed for display etc. */ #ifdef FIRST_TIME #define SCOPE #else #define SCOPE extern #endif /* FIRST_TIME */ SCOPE Widget top_level_widget, box_widget, start_stop_button, scroll_widget, interval_widget, scroll_widget2, slowdown_widget, coord_widget, dlg_top, dlg_btn, dlg_form, dlg_label, view_button, interval_label, slowdown_label, map_widget, quit_button, overview_widget, select_widget, overview_title, overview_shell, canvas_widget, title_widget; SCOPE XtAppContext xregion_app; SCOPE XtIntervalId timer; SCOPE long first_time; /* Used to set scroll bar on first expose */ SCOPE long interval_max; SCOPE long interval; /* 0.5s between exposures by default */ SCOPE double slowdown_max; SCOPE double slowdown_min; SCOPE double slowdown; /* slowdown factor for animation */ SCOPE double oldslowdown; SCOPE unsigned long int cur_time; /* current time */ SCOPE Arg arg[25]; SCOPE Display *display; SCOPE Window window, window_map; SCOPE int screen, depth; SCOPE Visual *visual; SCOPE XImage *image; SCOPE u_char *pict; SCOPE GC gc, gc_map; SCOPE char title[80]; SCOPE char interval_string[10], slowdown_string[11]; SCOPE int top_edge, bottom_edge, left_edge, right_edge; #define GA_MAX(a,b) (((a)>(b)) ? (a) : (b)) #define GA_MIN(a,b) (((a)<(b)) ? (a) : (b)) #define MAX_COL 16 SCOPE u_char cmap[MAX_COL+1]; SCOPE Colormap colormap; SCOPE int grid_x, grid_y; /* The size of the grid */ SCOPE int scale; /* No. of pixels per element */ SCOPE int pict_width; /* The size of the picture = grid_x * scale */ SCOPE int pict_height; /* The size of the picture = grid_y * scale */ SCOPE int overview_height, overview_width; SCOPE double overview_scale; SCOPE int *overlay_row, *overlay_col; SCOPE int rows, cols; SCOPE u_char *grid; SCOPE double *ltime; /* last event time */ SCOPE double *integr; /* access integral */ SCOPE double maxval; /* max value of integral, zero is default */ SCOPE u_char *flag; /* access flag */ SCOPE int working, animation; /*** trace variables and constants ***/ SCOPE long int num_events; SCOPE int *record; /* tracefile data */ SCOPE unsigned long int *ev_times; /* times of events */ SCOPE int cur_event; #define RECLEN 8 /*** end of trace variables and constants ***/ /* color constants */ SCOPE Pixel DEFAULT_FG; SCOPE Pixel DEFAULT_BG; SCOPE Pixel RBAND_COLOR; SCOPE Pixel SELECT_COLOR; SCOPE Pixel GRID_COLOR; SCOPE Pixel CANVAS_COLOR; ga-5-4/global/X/adjust.ed.Z0000755000175000017500000041603412662210454013530 0ustar mbamba1`p` 7rP  3f(aD  H`G1CAȍ!R  5EK4h@cJo)'M2nԸQ)ȁCA F"UV`OWayΐQrY@gИQuɧqkaQm #O+,y=8FCQa%\&6G8T - 5WyQDfQg S-7&[ 1 hRi8TUHN3LWR6HRQ" 8J)]E1au&hUդ Y%|مaH8V\sDrԦ^V)_T eafVbI5x'Ga49D `bVSHzʙg9PXhN v*(TTN[C 01JٕSUّ 2tiP}FP(H1YqvN u **ڸ)UUKX4%írü;AIiAX6 [FB$S D uĭ&,-dv-ʥQ"# qJ4ĔqBǎh2ki&*Q!6H&nXzIMf%s$U)e*PYk[08lWhT%W'6u Ʌ`ȵCUVHD&l/ЫhoFV{5ڃX֭dEb4cC.y} 5CAVf%6FѪ,u`(/P1gάgKK@ k9.󴷜_EPD*Dz@䃙JDň4, _q&CWf^*Rʒ=eI1XEmqwӗA#LFNh&^Six9Ԍe9"Eap xp,qQ0dH]ttn6SqU`@B" #eE풴P"H8  鞱 lLur623ݱI KzB3ao2Khgj$aVFR\eM"jȸ6ބ[C,jD͒diES$"im:^hA8TD8kRhtBL)yI jʦP"MԄ2Ĺt|ʦD$;<.bIʶ0s&[biE]>e!H:qޭQ\%ZY6I,g-o)$[Tg[HDn]_If9Roچz{pMliH$4k2Uz؇$y!.ƻ9l%oɂ)O}5iëThVdO,X$FK̔^I7FMڋ7e+D fF  m̝ؑWuUi"H[od<l[?6ճ4=8h.G [ yƬ=_hU>^ǶXYu@ǘdh˾Ot̶Im)+eVzY(9zzL]T4,vֻhzsf1AlT+Ec1V\̙V$y{.ƷUN asrwW/9S)@N4s5:ͷS4\\_g~WBL,_M:ۨLuB9[7S330=H٨`Fu ]iueJB=Zu=tq7`1N)9wGRTsW^0]s0bA앿&IO!$(hcnKnzusZ(5Jء}T5}7ɧA$ir,y1 Q1~-#b4zv*2Rd֦ *iQZ7LŖ2zIFJ"ms`6@3J!(ȫ]꤆2w 6zW0ͲXITեRM>6 9}xK,AA仆Ar+KQ 3djS=?c,^A'=~1PӨY7#^Mvuc5^_Sd 9ᒱ=\1ʟq=N&nɵO*h aXTjC`{$> 4E$fzlNooeNt-Aw,YA=?u$"Q* B*q! /N*fo/be_c" }G&cawgkHJN۳A{XR^S6ToF8{b۴1(dqA8[U;'Q0JQ#EEO2?Ռw^$r ]6.*Y8n,<϶O13:o?ʒ/ig SNώߒ-JV^"O{qHb!I]lO5s O@cSsv!ex5GEyn?0n+Cv%ӧ&whVĂRHP4%FD.߇f( Ѽ! ŨY{P('8ae"PqT1uuݵz0KP  Bf&X ag5'H' ]Dz$5`7Z /a1Fh "$D4K9rPHH KPme ©%Ԡ.ezXlqB(F(x?˥;]HhxS}L)RQN`\ bUD;?Q61ݳ\C*qEp ś9w ^uGRy1;8~ilᖼ$'S^Bxis哌r ;&(bS5αG!R%!I!FD̃y.Ëi7mJ96ĸ@PT s=BT ,avk с ,lV+`p 6 35(]' m4+'$T!bM9IQst- ~9_<Siߠs?5jN`bS= ōѩZ-V{~B]V8D8VIN#bo)&Op=Ϫni#]GÊ'SİuuN UTG]rB' UKֺWD ɫnuRj?[R !_M<;EEŪ6ʆLϊ31"Q:^)p 0W {^(qehFVGC]Ю6 "Ȗ:ؓ *bJaYE#<+huZk}=彦H5E\iS}N: _k1Ա^sX22$FX>O(FGrבRPb|GjB +ÚKM !vU9q(]" BQeȕa/[]@P~'%Wf!mlpe2YI*Nͯȇ#e)GVVhB9PۍB,W|,?5֊cD쨰+8eWW\TYJDi7-l Lbn+;5;86WuTYK+ipY6*HwhCu+9:R\ h` -)1[j>3J,3h5`FzBMfzs~\[zCrH9h=V(<~VI~ Xim_"7z%F J JrYsC^ "#/KKKmrKK549@]{Ꞌ)ý0i!aҚb䛾42Pb"dĵ)[[-irqs"VVe8E ke5nZjN0g`,6ŕLt2_< m©-XL -\3yHސ>(#Xr(2# Uo7(^$6h &XB/YP` D+ =Mi8#8|bqz )CH dY;D2VDq0 chqȌ?g)Hx" 4}+hNx8K[3$R$dLFrrģϚ|I|#Ǩ>t܄S4!׎L!wLc73@ s._*\3Eq$МQ(+C^bVʹMz¦cCi\(qC}>XEv5 ;ns5xW>-% rbPk!IqFi;RL!=59P`QMfk+b=@As# #b]+fii[q?1aI:cǺ0qJWu[-$Z^ދ#U?7G88J4x Ty܏H'/RW?{^ݒ贺Q:m;5&ny4WE 4mrR:h6|%"7h `"n Nq A*9ڰ&=)C;yHڧE k#B³u @BuL=ˆHqiaA\7%d28|'Ov3kl-mqioEb_=JkIY㮡*LhxH<{{CmۍM1c;_u9v1U~rI+cv8'u!n[tri|^SG AU~c̆3K>. sަ+&vz mybR,c1ŏDk&BYLvn➯nXAԷ!0Eಖ*fX;I؀[v]p!"w=n [o]"OwxFm tI *J=MrK()QfIx%Cو8xѬ-MxW9CIIoJē+1GWDQ?!00VF1hV"<| &cM1af}6ǫx#vXBKu<$e4hB2KzB@<+TM]Yn滑Uw兛-څwK'/֍hTNO2+NpbCZlÉ9]!쑽$ KIp߶z֕CU75s^ìct|Ѿ}~hm tx!m{'Ec<ɚy$G⬅oA(cA~[_ /#̨{S/3Oz~ۿd ֢jW%Е|~V!3>fuC_<4.Aц6Ga X+duɻ'czo_eG>Y YJ@8q4z>?Bga Õ7LG#5FǶ<(7h3w8g{S 'TZu(C3. }uJ'H(GdǍoKe{>?/ .ա2-˙PV%w="~W7p_tToӿc._; t wW%pIY4:d~{@_3 !@~j߷QtJy=ޡ az%# uy7BiBf5#dә~TLy G-|C1쀿r,q TdQuПtaFx|fs(\ 04_!ǬZ;`f|C 5 x}E5b B \'`5\>{d!ן8C[ߣgW z; 0qu^`AD66dwDPVw:P{edW#*zyA ҂`j@e sw`GW%Fās8 ]|1p`5mC4$!3фC%hJ҇d@;ls0q!E@(D,|QfIy 񚄂RA#%iMz mlv෧ D cMM%ML mA u^8:eL( 8 Z{DPSMpqw#lz 3ئvlWDF3~8@ځGS%hZK5vRK'\׭dx WH3;|!JB <6VFJZOY{T'Ղ#K9z8Ņ_QS7h:[D ̀@=M_[!g8ؼ|[H &aY)k+.1N aZmH!!manxap"!@"5!tWeBT-67I/&haw &JMFGOdL"*!z:H+G*h`;{ 0-Hbj(w;\`ns@])]ĵ^5,Qs!͠ W.ABo{Bu6с6aGb+]̷PT?Dmi4⹧ 6lXq#c^c1!0 ]K7#My7RtaΩyrWVw"%+vx :8P˦qg >BR^dij푷q8vD4B0L'K+1X ѡ7ߣ7&~x`_T{Ƞh"g`p.~k¸8 S`˜.ncO@GŵH#N -QJz$ R|0~{Y)N_ I)Q)Aۍa.s(:HnD?w?)0#CUp&fb#hu؇KcgXZ@}-1Om#̘]q^b(3yGc?^5w(߇%q4b^卯&cQߞa-,mm~P}!;6/74*MsCa3}JB5[] c̏K ."z,lՊ@(ΏU6\\Ad.+n  Wj7!HNU#hHB$~A BaF02!|eLD¿H>YCb]bXYbbwH$B9vmP7"8B2A$ O$DC8$䂢$D ğCq&}z,q#d32cЅdGy`Gd&tмl%8qIdD\,0$[e11Z`&dGuE ƼzՁ^52D#/HMdܑU٤<mLſM5bwABa&E!@^=|bnh|n& ߤjaBIs+Z }7Q І&!,ٍ$OPdQnKTQ>i m $@, 9RGȨ?]g`'M/J%*,SU6Pt7eP N7AԤC\7XAiye53 YEhdSP3M,~Cc7pَc=IP^U\XNĄTzCAPA>M'%>adA%١IHv^&)$IR8/hn釰Cˆ`*ΑLd m5;V5*&>:8PVpPzss]1~w p@bP@2Ą-bi_c y @IKCZޖ!5%QLEA$YFue'ؖ[\Hm hp|8NBKA\"B8fBۜ4%VI zko XPΖ[ε g̥!Ґ΁k"\#bwil [P3ked`I\?؈~Q&R$*'FI.df"Eey^ F#}5 qRmh/:v5Efdƛ"TR0/&ڜqe#2IW hI@RK6!|Pv.'Czk;H|ȃ &zjቮo(uu:Er-/{N\hM{X0MYU[a uڀef ^Idf;bRIHY +)JA)#fA%/ IOof:܈h 19>hnZ0ZR'"}`,R~R09rG?!:C\ )J$]AL }+\y<`N9*?sd=EdtmWedZ-UWgB;w< rbdi!P `-0Uqr&{6V'-Y-rQ)hLiebU1X_rh!p(FCSfD x&vA&li hNQ61J%VQsQf4CR(JFt藆TS0'~7[nVHC٣h@'\D㄀x @iz]fp=>$L~TViz1 i4iBI2*Q)$rRa9&9=Uyiovcih>R')GR`񤮥å@X:wdlZit:&ƕZ|Qxŧqo29ՏCLYŃp5{jlvzF5Y* v^P, /" 'EW]ޖݕt"f0ZY8lGpZ-j * oXaWӊJK*`iGS❐Jf0"jRQE^*ʣ:Q*Y j.=0RNɅd1C6clڌD]6NEYN'RZ &(LеkHq(6yZL8^L½,&mgռZk. ٲe{C @g02~\+\r-.tǐkfĶ^\y0lX} mX9Q8 6gąJa T6. jSP+ƳTݢ譽q*S-gnPj&L@JЁm Ąƾnܺ.RҞpbQmYKmcZhD Y~j<+Kؚq7,Q2 qAnCmX[KC +\Q1-;A]^Y=G+s@(+#cKBPfxsu ݯU:DD66uLh|w+Uy;b] ?kJI l80x8pDVfXfl3L̸+b[3t mk|Ea E,L"rd+G?m>kq8άŚ2W+dIUdp^KLf]ĺfK ȭZu.U(ʠK@ko7ͮ 3=0:TAkZW&Lr-n;Buj`@`@A.DnĢƊQ! ##Qdn񓚩ڮ} S^AE䪺a'Yidթ($1g&_jYZI=Zl-i,U7aNڎޞ$Ҽ0}΅!T4F۰Bi]d^cdG -Udi[oKD4uVu"4SS/d2j-BJBoNoњ@Ճr[/]ˢ yU4oP.+8WdQ+fxKoiX ' $h {,;CEnk}ۗ, e+`?TJok6Q50;/0KС+9(Q q#Dw. 6sֺf$O{$SK>pNJ▕AY$*Xx1{;~H\-O\#S-!z`qn?SEx[dXbA,p.bAhxhlO,Oυj ZIҕ7+XmKo]ljV_m& cE J PN0;j5wވ0>J+ oo!zy֫*ө7pM5o fprO,ܞ2\N#\ ) aPz 7JnKaϒ6l"тR̊e?(*,\aca#bt0n!oI;_mkI;M8됙O-PRGpTTo 'Z /SdY$Ʋ$4_ ;5zj鉈 J+$<%:HB*老RgI0խAܽPX2¤MQi'獇boCGib Q-Kjj G}7'!΁2FL$2'e"tBB+BW ~hG0Gu ]D"ƳRZP<Im4繰f~W [U%L$UNT,/V%nYL!+]L2\p[$u@g Ŗr];wLXg((,L7Ƅ<B=K_T |C.):a|3¦l^fTl] Y I_ܰE Dp lmAί`k1<ٺ-9b$roh[.HQDx{D̬LRӹm-ȥʚH mV1{*1+^s򱜌"g@`Lɱk!C F$i^D.~)elsM$] \s<%SiNjg 9o'U!&x(n^ 1IB ˜$˃,xB)ae˃Ύ|˙QT˼fdbBȥkv..?H>-%%w Z |ir<Ӵ `EӑmU20v /K^h-ʨJiU|4υF]"L\}0_~!@4!A8+& =4G=-)F|9< N`ꟼV.O# ͌^EYX'ēEĽ5%A\rLZ4ФDz×KsՃ?u$SW3xkˁQ(ԛGIdDKLesDLc W2lU*97mϾʡ*?{ΦsMDGbxt ȻϡA,iܼ=܍tzۿh;^_׻5B'W3q\]w,mk"l@Ne#cxcw݂zu 9qzxhgFECpC,b|YwoC#>z$&cSv&s:#dp&KO"G:MˢJ&~&#uųD߄h:ߙn4w;_ Rcl =U8x[ddv[o$j-'g-;2AEOKC){$.v/LNGЅd,nl\L o1lcCs;W Tm^2˧ssQ)4Ox}Ƒ)[ B\*5{}(am-Lgǟ9; 8_sM%r)sEְj$h6 v6_U5L^4(/@-ܢ)t8"0JI^$uåRQyJY0,EN*\t) )8 `M}OW;Ph(0.fЭywM ;CR" \&k  7 bczT^/C;C0G?fulfeF$F!瞫 49,B P` 噄7 kލɆ[>@8M+n+#$YI(~. Ϝunc( %G@7镓RΚ ϴ/}uC7S5{h(Pg{^h\*AKe_nTv?09-EK&9HTETC&Ey>EtLFg pc PS7~(y ) ]WFA]1&G]=5rj>/ ΍g (Qi:(AFQo{da.@:)C*Q82y$:-s`1X3R:ͼ9]l2"#邔.ΟJWqӡ.Fe5W ϞDVf.@A\५P8m1Z=~Gդ>(-7:_逭ꢢGmx åMQP};Cl C*{@цA':eYG֗Gj} |/-o k;f.u;ƾY9(q3WUi&%JS.]@X$"w}_VAԬ>;!ǔ33нaŸr^3dL;% F1\n!rtIҎ`_J>mǘͬ#8ncHȕN S?Z^~O/ ED{o{6D؏N(@O} ;~iN7{_͹>:64FpĤ>4GҭW9;bmc$#yCN+},ZjͧyH%D H%:ObǞ#ݩkB)j"/b0k!j}ٟ?%*Ʈ/~{YP3<n`b`"eluixGDK8 {BdڈT1Y|wů[/wu3>_M+umm>=Ϫͧ[P|AQ*k0*meWONS9Bߩgn] '`Ш%-KjhR>#LgQIZ,Yܴz7J;s=Μ^Q4DڢվD{F.Nɔ ?pgSdC{=N*h&pF1: =ӏXt=8c$5c`řO%^pwj] -(d‡/__Y 7|XH>w6|XLhFF^ I^M)̕6@.)~Rʿ$ Y{~ݪ[ROPn6gJE$ I*k뤗qDA{jOjG$wЫx9'_=PtL 2p5#3_5/U9g u=K(D:ղ>#-o+DH:|^'x>v1,~5p8μSޗl@T[;ct/]żRru1?p'{=%3 ݋%>՟ |+ARm E}Y`WnXb/ܗRk}c豚r+OtL=u7#pº-ȸ^obHj;ItBEVGJ9`y06F2m~>i(49R7zIc8?}soȩ@Z ,HVRR^OnT6[ZFOBGt^ HCBܷjJ&Wyo.8yD98^l/yާOitwm0>$$(y{,nTmyMaD4aLkA>baK,~X=*4f?3ܦo=>6!Eö5l#L$y:sF1Ą?"Fir9zs1^%18@1d8CL(GY(0{yFCWeQeC fx\͆QOO#kZ,gy F~UZy?{xs;QRƉ,f[hKh Q-×,H'mmL€EZF#;gd3I.g;]DW]y,|j~NDjj6~[!1$:_?H_7E?k#$*slVpxwsG%c`/T^q É-YlI@^b"t *p~qAnh#Lg˿8Vl+u/ЗkPU$Eh dXx͆bh mh(Iý4/"W'ck.)H@ЮZ[">s%w] bP=sp f =9 0X)/@7 fcXfxk6 eW/ERtKX-ֵR) ;~0}Lr  RN@}]X~Q D;yܐyx] (Oޣ?" _p/(V4 ןBq/(8i1'El  QA( ۋ80;Y?o{@B hU1/q@鏆a`t fAlUT|k,iiJwDg=M)AEL jF)A0dώt\@E$}Qu)A dvĵ@CGk{U}͆G7+H$`TxU **]\_ϿvU<QYAHj #~ų[8+fׁF9KwjAо[iđ7 saTZ K ?lm<  [>Ϡ AB@KT`e?A'jPj ak n(^2w $ j5 o/E⪇,lPI V]0^pI<)BG.Irp`Y 8h{{V)3z%R c/|hڴyAv.qƁ7ڀx0 ,?!p[IG1xK~! !t R ʫ bԳS@@R'M0ӹҌx#|6qjd#CT#i կؒ1#/44]hG\T( [spiA٠bKTn/L.@I'*14"N#68Y = _0WbT5ךRA yT@n0xeA@/q+X>ǗJHPGsljǪ'&|x>RFsC LgEI4Gd%a3KA_n3HkGF+ L=޵+߷R- ^ g?8e&~69oMf-5h- {8hh\ivrkxp+,TGvú] ;I/8 c>.C q »]A#2: }4C6Q!AlfxO3J _Fh5숆!+BZo+6(̰B!V!o0_dim+Њ2GKNjAL&l60aA`$|#{+cCX!Z(\pI :m8 ѯɿL0Ca'c 02j{@~:=8{$҇4W@Ddj<..]D-bdmp bϦ oK A"с86: W)cw ~A o/-"b UQ]{bv'h #k/޴!7qd%zfiAP"_{q@Ag[uyPP-s%w FNlL/:n}( g(ti H q= ͍@Z#"؛8 pI#U G"~"&cG)[c)> ${rCY8^:.~nJQ}~bK!4-dk?ohm Pnt9Ũ(8Q2FDxK={9` llultYEBVV cW5XQ #ʐmb>9I8J onC5LUT,|),c=ˢ4825Kp.'ߕSCt+\8 c+3Jdk;f&\SV^p^Qr\ i@BvƐjI SƢ섢 2uSŖb* tvo3a3 ^\;@zC0Tl^݆~!_ Q=EQn_1@"ŸV'銈 TJ^qx"*AhZ8O=OR Z#8&6̛0[6ȹhοG #0Fb`AH}G^\qacO7ς(]]@8ls xPE@(>~cFpG`͎ $@߇X+ pp.9eFFS={V:Q8+jq_E%c u՟1ZuC;"q){0Z?1Y= `F"٠ 9Bl$(.'DvY *iܓe]l4QT!W8m sO"?x[; \huk,2R'tb0Z1OXdA e}oɸad0HG1nàȄq $NĽQA|*bX2[ϸy#wF)7#$ fP ( H&"_6^ I(GA@Ҁ q/o1cg8mP2!R t!*P.9=~ߌd]!Z/|cmgsM`Lcƛ#EWe] &9 א@c:""{Mǘ\ XoX 8F "iPopsO3NWHG D4XxK 0Dw:0XȢ/>c&H6[E+oD95x܃(G1L r>1x9;&I"/!G{ 1!#|f+t|SN.&}C1|yu ÛN>rGf/Q .:vCj6<}SB,+%1]C,Y#]0B1gЄx2& !u"א !#OЂx08#Ђ >|g$3 C,zD>#TE99LsZDž R| J >K'DOV=*^2-%)0]{.:@0%=4-Fp&lk =ҥt l?Hs^5G 3K1[%e ,ɗNҝS /Ax/#GM ɸDL h.f@Q7/ 2Ça >$^>&|MB&4N . E%r 9R4N'bز\`B1i8 [z#s aN_z 5ws9[Cl)I4z*.}L҇Lɸ48LiLe)$_:&_7f(ad9#~Kl-\93} ',X>:Ǎ]QB|Lz-SM. 'q/30d jf L~5ä2cs4Iod G;J,Byw8X!3N; 4t*˼asTq#~B=Δ4Lfʥ.hU玙дK%Zk Gq( aLIw,ii~CsfфaH+M7 Tx(3MhysjtdM# !?Bh:Оа<9}d״pGxBN9+hn̐epsg%fG]jd d%]ٹK\j^Mc&%uf\٤,hcGĂR:Ա A]L9Ȉ i$waY*xrM JI-d@u}IA$ɖŎޗ،VrNKIt90+Y>_# mj<4ͯ&ʥfmR[5Qy- hRX[ it $oScHwD9@c tH2JRQ,oF 2Ҽ2cu ~ x7YL.R{L)uo6tYRdS`C'5 }(RB8OGG2Yo'/< lpA6_}L:D9<ވȬuH0Mh!)Y(Qf#ԀzGР \EdAW0)#5H̎MT MXu8Q ߤ(ɝA?gN" 3#`&]ր ,k`B%+ZQb`= S7u&@Cq(p<^Eo^CxEI`ag -" ,N`じ,J,f0V[)RmQ(#eVZkz!F,2 v5(PgeSX<% 3VEL~<ա{t8]tB O+~S_@OAqd#) 7y>%GID$pYrA %)2%8il ,Gq~%DĔ 5>75  ]uP3Hʈ: U4JT1r<[ah,5&EFMHEB,K$ uUFkԉ#Y\ExVh OKR/ӝYy8II#xVxOR_f3mMHA%yOlX>jO_4s#fonHtL6i;ILDj0s t$9]A( hQn3ÍV̑VLHi< ̓RYzM+w+zHSRU-9*O"O 6#rgTEA) t[0 tPb0JK#@2:{(J1Ԥ ROɔ:0AhOV{ǎ)cn4)AKM'&fC!p!iS(|PDeulѥjO[ޅ4X|_pztPBMHI%ua:k&%q@SCL%,~ L 7*0yb +DKP*qܖv20DXX 4RQpGTA> QlD*=(Swp8OXSJdN K{M.UٕKhN! uS? q靰0g".:<{)tbt@T `j\_ZI`WP*8bT宕lӹ'SS`& 6LJJ{GnꞬ # hk0$P7zP%Q3TގX2^ Jk6S CKj'CgN ՙ*b5 O܊>pr/T^i4 ]+wFӇ"!}~HmkVa[I'x REIg'u<21OߪyN*HrWQUSOj{*4-Ռ_WZ{1F a\MVQߪͥDҝ̥RLPrO6T9UccB$ @2'!UAv6WU4>U $>ɍ >adè p@ jU%gqp ɪEꙕt'dln!өpu%OM!:/0Vu\SP-N!ȀB֟jtչc=jX abK+rgd'5U 2eM}WVLɜ\F؆ɣdU*˼"JI)xf>ނ檗:^ͱŪфٺG 56WѷQ- Wp堈B(}ѫ'ul!ge<0b+GlԬmO[0h3(. mtN[nkФ QZn #1B!<`LP>=SMtkKdE,R,lOF$: ZP< #y6K[Fjk[[V@U-%Xb$ W\+S\vVI_&[^\'QhiAeM"aj&A:AɺomLںY\!6'JfIuUi-Ҋ-HHmY=Dخ[QOAz{3kz zZ[y"M+t ]K`+\]zsRf`WZ%;;~·A*zNM )fL~N>o@$@B>0^'C]@^8Qw 9 լ^KЇqAZı^U3pW(z^-TH5ӼVG&"w_TVkD@MΛWu :y啴J+98zi6X_ƓЗbS&;*`3hY΢M1v(lK$ b+v!4$?%ÃV|=CU_)4SЇ^jhE)؁QNzEGtF,F[z%^SN$u:Q؂`5Te5! ?L`Pjiz='96J6`@onЏ6Ūy-lq3nL=Plagh:,h"4ym,$_m=J:Xhyiiz5*/{Vi{>%Og*[IO %"سk VΒg JWsEARG,)sh=Y8CK%o̱Qa{}\fٰ`YD}.Z èBMhbd-7腎eU-Ws 1!B *͞ y±2fq0v?a2H& "UD|m"j;dP{ Kg̕&LqCHv]]A6V_YiZs0 &hy ,VЊ>{ h!ƶֲƨH\l!+Y{5N-m4Sxi +yV<~cZCXbA+-5v/%,X[jv tZm[0]َ FWPkl3W˶SӾl1;aaXɒf+˜bkGge [_jWԶ-be "nVEr {bJDrKm\ u1(ڗzؑ-͠rزkFڳdEt*x(c&b6vQAl dy `_0 VVɖ08>m aYF8ّ-=ۢ:SZ4q}(4l[ (N;V5t-veSC h7Evd[LzYm϶nrkVUgϚ*ڑIzK5uӕDR8Ҏʗ-ʣzAu4:AzIfM:5%$`{e?KC ;u[ƛ@&XgDZMLԶ燼 ;l`;` 5\٠xk8R!r(  ֳیf =gnY+QMƲ~Y.labSƢ{tNkɳ۩V߶p#g1xc!,aHƽnq\bf5؎A gǥgA$R@z?@`TU^& \4t-2|mZ&9,#4(a2f)X)ȦgdHXG Ze?h&{Z].-D_vQ簖\DB ]N{UwY:NhUȜ}qk\Z!WdI}k[\֓p=-;s2X[2Dppzׁl6_E[VI,PdܿέA%Y>Io苗E0{c\\T:qc<{޹[õ?@$]{ls=vuizf4mQm7%bVjېZUX0Ҍf]{eNԴJٟ6`-qEuw TnsY NmY9Ś5r\%MWj^tEC_6kBrJE-S)*M;\L! ?B\ل) ]lZJ[ٕi̱ eWPў\ @vnS#ܒg.v0@v8#A8aٺ\qq$v 'e'qAmR۞ܫ&ѿuZ)vCύld%WZ(c =5 8IApۍZKA:ijr'QMnAr!|)6:{`A 0uSf ZL#Dž}Lx {kujɭ) ֗DŽ`k˜eH.GS!jwxpݶ.4aƭUDkмUd\,\ >^5#0r1[:c !n3qJOn6;H:&燈bLt=-iyYZJ}ϪއmDL˻cG(Y|- Ádnx+oWגmlsM4D4Դ60@y/okᦉ xICwAu Ņ7gaHV[ܕNQ+od5@T݁1`Fo2GdHBhO^Ωa|yM<&wB秥ˬw'֥Ko`؁{wŭhvʺb-9+~ ]CG!K5f]֬ _/aUu^/u+b<&T$zZD扯Zs)?Whv  |{ތ׶{qTs,]M tdN/rqh]$/n;G[qv_.͚7y\M;E| Nֻ#h\x}i~L@-^{l~$bz~iH{D r__/dVqTq-Y'l}!%$+#r>BoLH%ϦlϭEDFd+O+6&kd~2wH-l  !xQ!ГiR_7}~cK?b-҅ "]*oҷnAF$H_w[ ":yA B@@q ԂOKnAF3":__ ̤<RdjW칡mI忕PK5l]@E$TQdd,Emo+-&A@ 0lV'Wꁐ42ү3=nd+5@H"w xy XhEﺗp|A~4: 0{`` *{pBDG$;%8\u2r *w*~2΁s7kΌ[LA|Hj@p&n|(A7n嗗Vh66 \2둭fFvR*bVڨBr:ku:iR^x0YU*`tE vf o=kRCxlAWQa 2]z/χ08 KR a!沂9j@b4BM;6MEkCd{` ׂz o A\cX,(ÉNz01B\ `ȼ 7C1lxvy\=0'oȴq)E#IGw>,#t횗KF¸ !G,0⿆aLvH-G0Dϙ /h u'm&: ;5DA 1TivjUcF[oH8!F9Ow psH+q+?̏=ф-2$s| qi@">j-3pu<#05ưRt''9'y6t^/8F,$B"90 '^ -\a"p‡@ΥxKh JLoM=%w!1 |q Qa;/q"j~31=}A!)/qbsqRlf_źUfGOOkBtÿ_bCd & K1)a\1 |/E[ADj%0"!-oxV^wXpS _ 1I3}qK#T5!T7vNxA6oJ#/tda0# /1cn},4݇PRdGn+㤱ըqk`bՅ`)ȿ$>&7l:}WÕc9);n7oCa㻱(c:XXc|p!`9LެqOah(;ؕq G^ϡ strL$ʢ u\#ȢJXޝ`|<Kc-a4g|s!R>VB=F%~ rcsb=vCpeV&a6~ S7Wb-w$uTb"!i9*E  ǏbGD!ǵȠ+-;y<1p.HJ%$Z#Y,uB^!&,&WȁGp؂< Ǎ"8~̬(چ=5~,`hx7_5425U/ ,8Qd b ]%+Cȅ7|b>h2!1,qHFJXmr% ĆB좩L] 1y睐;DZ1Yrq q4%/9UH&07 !~&!/;ưdWOƿ"+aʙlGA V'd0b KcdS[@H(`{}ڀaB7禡|?4\7 A@'S;=9k@18L+P>\#d8c9(Ӄ Q24YtS  ӰJB5兝NxKn(ʅ'C1*!l'.ThT0,J)W# ILɅTwsf ŷٰqF rn1-@2#q9QHjC7D \vBvaX~ge3DL(TCh&ʁr hY-p@ˁa&1;^aخDwUsʏ7I$:Xܖ13SVBHPD-crhyL+ -䗸!CmKBvRHp`_Geߦ%, Hݾe$BQ/ 0lzD-$4BB# ̡2{8 YgƤFA,i-*aC~Gz hi' T%4\tb@Jx2Pd81rwS:vN{ _gg,UT?9LNzVE@ʋd4 uGMMlhh&QB0Ai;}0rmn(fktu~:2(9N\a[dcqK*MmI-pX!љ8{Fi=mLI^U]l"VQe!A3\EC|43W I2|K"bvOo% !MwFcAn6/pJo}_KZ ](: @ Jd*#$AIѽP8$j8="t@,D[΅&Z'&NKC"(uSpXl&/(7|t7=2v :z9Wa|jϡgF^~AdRaeRҗF54'}ICtӡ K/t14?GTMHjK<{z9ALӵJ؎v{&לruPD"4\dRoԲ((;~Jcqdvl0ȿ LK0V)R@/|M3T Nz}GٗwTmt5Jp36h-nQOv8@Go{R#~7,5xj^J+ w2 V<Wn: x )Ht9-}/%P.z~q>"%jLjuH嘵\ևUrOَ+[IuKBKI?y5Eh-Ƌm;]&w fDž4u5 $tсz_kt ufXYgB2㌕>  :Jm 3&Ic|GY;,U3 L(Z * iZnΫRۚf^!Ce5OT+j uh6`g+'F݉=xc/24s>]ӮG5ҧJ[/!V|o0!TVCöؔ#հd0ғ.O#>M7Jp>0ŭ!dM+)a-" EZC]I3-FS_ٙ)W}_&FndYc-bLF)|lMDc Fc U"siV\βk՘s%)l[{&FJ"v2Eii}%FaƯ*6wn.#$uj 9Ӫkix-hcYr=h|tz3>$dGLbpN&jNA;^)AU lL2SFdG)ؠ F1>u >ell Rjfluԗ?CG~5 dJiY-K Qd׽)'1X}L7SرRX5zG bqK6*1;s\]ʵGOk9g)̏dҵ.:; q1m%zġᎰ HPA, 4gqZ9hsWN=4/A&E`͹v0ff m+S{ 1ka5+ lm9l.μSLٙa%Yk ^ 6eh"x E*3_;'9Dݫ6` !&h >jș9MIfCkto#gx\꫶P 98%;=52ִ3*q1[ɮMm@mfdb(DɎm_XW[}Ѧ(REr@lcQ,؞hG1S.x #͡mI,VbPis '}6m.efR6+54J`ۮ6Ԣmk5D]RcVO92|Z5B;R_j 1m6RT%n/;SZͤPnI҅Zp! E i޵ˠ]ʍhX{ltXY Xp4(e99C\d@,pBKI i|5ڪ ۝U*ssk;h6g>!Z8])[W^ivz.dh#Xtiq_0n{k(e_pj!$Ipۤ^Dn5/kA,٢H̀I%P Xݝ\ zl_z4 =n3yw4U `f;:L5p3n\S%e{MBB?mo{3oSь-BDX"#BыwVpZVCn=I'HܧڀD ͍Vp1ۗvl֏Yd]imJH\nB@lqjKW!͍?Y`Ϡ̺kqx5#whDh{JPn`^gi6~d]R]޽x"d_Np=Lݴ_¹\-bk5Ly(V2Jždw%|ɔ寲-ֲFoݝ"4PwR;-?%_##L?fkLa` M ȆJp2dRhsxgfޜmwZGށ-ŲnÙO'Aa&9mg3C5!wb ZNR`d{"$'쾀{$ ᄷ@23?iTVThl|"Co+htp gK7P]6Ml"7J@Dtd;9 O7{#02CėS+dv"G~|Wq,v {XD`@%&zcL[5d l7W"@~Te(*ǃݛ}$XZ;ǦtmxME7{ff Gljcv؟)!r-0մo蛯+!Ґ=5y}K l ס[Fmo^7[V} R{WWFU*p,]ouNVTRkܺ Dly,V~:1 3LNQ SyNx66d N'ǨӌDsc4 \LIn"pp ;Q %1Dl~]'.^)':7 ~ySb!d nzaBBow&@X,8q$WTp 8<s>Q 7a*@2H9/D] ïv9̀NzJ3XJIZq sww%;wFEjGS̤,| < /ؾ|]A#[Yw `¦Wǐ` >Vt?D^ޅɎk&\Xyy5uϪ<5l"y ]CvNkzRe \Ů`c1߷khHz/Wjx%\1abaB x|2|d* wVpr:$h +cF8 Ϋ\4]xyNQ!rEŒ*P m&jߖ[MsgsaѺFN+,m\OD9߈'<-^1M3z >3nlSu&o\u? 9aumk`|ݝoP#) :#ƙ$tLF^Jw q8`+k41ipcw9Hzw: {8ePE=l礥qi#3m!39#uܯ / Xc'FyHb\J1o,E›8yn΀:"w\JD}Ѕhr5W8}t[.#Ǹ#m.g$d[/@NXی~/ ҏ|^ Y=mRCHB៓㡟E|4d1rqoWpBal%H~ /#puQ'Ip qpbզ#(Ab+;%zDDI`I.es5w\ wqf 4fē+mJl ?;9[y^L wJ03FC\9[^<|■j*|(Q=k}mi(ˣt *8. $0srY7COܘ.D@KY@_SG%'If*w40vZ$H}(Mʝs?)\yYEN~8=/cdr_uNAS'^.33_GMهLe'r[4S-2HI<+&x+20skC4S\ڪx# N.= WFg^mc&'剂ّMar[$áG S`)W |ӶSi%:Ǽ(khb|~(ϱV9hxF։ [aF ¾aүK@ +Ӱ#׳I7Eya %B%v߉P@,TXvMۃ >uP^A{ &-~w{v"~2[ tf!uR4䠅,}>u̺b/o:4߻j07WC?ҳI='!$?K8 {Ο3 lT~;%.) @=F iҽqe'BU}@+.(&7i8 c~~PODM@#QnTm:Lw0^d~h-̕80L.|Yx0B뽬~?-0IG]Rt#uJlQdysHo>VP m .cX77UWG;|^'?l/z~@~n u*d+l}C0%5œnu|,!\pJ">k.ѰxI|ܜ|'@ סx{G 3K8$R*Ḻ'Ey>Ws >VxZ)5>_L==xp{/z Hx+1z7VzAQ׊˙Օzy_Q_'Fx\CM?&D˟D_ț*ήpy&:2U.#oW'ߪd.04=ltA&G*I"U lvMvOނ`XEy. r3|ųpa%=h4n <8G{ D kD!L~ iɳW‰̮=n[M<5_bC쫻]9av&UW?WbrSR`v>GVtG JcT Nߋ>PYح q%RwݕƧ&J|oZ%.:aퟗ'67y фL{MyHLA1]} a3paދkwr|[sX<ѠF$`?#D^p|#MF#Ny<=9/?YF:KSA=\Sc&;`^oV:0 W!ߢ;3WK?u~)QӋSb/)e2q @p{&2|K^]/AfKhl|GOWUz 4WN9 ޏ848ʍGOC~,֭o:AKoRCqdL}J~L/.&c1 .Bf`8A75WDؗ,wRk} /^Z~s!=|CrroŞF5=c(iQĻKɱҲ2p?i\LɌDhc gԿP0~ mШ{ Tbk.|Kp~h#Θ*;M/8[З\Ԡz):7&4@mWK&NRZoR/l8tzC ԻƘ!ey ;_W DQp ~2i\/bak1nN@z> 2ߌ 5x(Qez=a8i&Q?䷞#~5\W&6grʼn`g-xc33AaA?@8}yy5fcO{ D9oX GߎvHz=n䛣Cs0>m v:ό0|*Ͼy=C ]|0_H V5I탥0D'ѶΤ!*"՗&f#)'to0S6`{9xၼcirex#=V^ܗ''M8,rr"gvFGqE'@ޒfٌfJQrwf3K7c#Р޵(/({;Bzo߼e_ ֐w) uko@ѽAr0RI;(AdrՃ]JYr5+E)bK-uL߸>w q"ߧfT/|W}?\ q ~y葵 ;?zDw˭^9M 8nG`EM5%(%A [?5g)08.nr婒8̏&Ͳ#~ހk9pi;jH s{u|RHڬOʋ!d*2/O|[~NлOuvCr2~>7NTId~7kN|6}R?=F'L=eM |-Z($s=o-XQ_)ky3tOIEsMk&o v>RX#@U?:J]|_$:Cд%BgHzE?&:+>U)I5u;So{?DEwzrr‡@ӷ;CBԼK\#[|uP@&LZ'G耼ctx@#gOO ͟ˆ*q[#/ iC.߬tޕ6Rx8Cu5}קoNH*R[ܦv?:FF>O#]`с>?ܿFf<]KV!yFg@?N=4t}g#sjgU,Q^߼/ٕc1shX81=4o|mSZ*sY4 !HbJްVsXI[tx v i|Sae0+ wEE/ I|ӒG t~>~@oam N_+:1Q' rʾ>/r-ov$F>rM`o.:פ"%o#:m}L(La/4fD) 5{.lx VJVN*g~i8bw'.g1ٖQ؏ğmty:/UOLo!S@gb̓ggr} D њ}τu"I%n @F} #Oɯ0wT=o 94i1y  mL%aKl*tC~mt ?Fb8qy=D&~T @GN"gZu|Sk~;{zSdm"~l|%dw6z]i{ y= K}gDdj{"jCe ,)B7 GxM<SAF{]*0o!z}Nt{ 88p"Iy"rTzX],lZ{MZ@"n =5 C pG =8!hHs,r@Y_}J $+)}`(%Gp ?C3k?C3)fq; _$pE i Fo_zla' 2~!  m}$E|z4C7c"xk>}X @^ ~~U18aD1_ xN56~ ;P}~aF 8@3%[n +CNje;|Ձ(zk3(ЁB?ԁŁ$hnN~]1ea1}@H4)`%n\?B^NP5 7oyI@dwB~]n /|K|䁗 U)P`s]z; c fw1`u=slQ(ʂ)Ocp1mOu2m%O?4GH4E4 PwjWjRu~b>RoUs)hă~o+m:9Chy1AxrUv4U}CCo D CC~p\sC hR{uv RgMU"[)~2B8HY:gV !pgt{^s4 Dg*n W&hpヨ!]Vll hC}xi~~Mv8'9]7rmh-a7C'E #2ht {W~|lH%#Lc! yO7˃[?n`E^~]#GC6 ~,YۃN7e1iQ HCBp@~+ Q`j'4+mf!5cD&@@v{F%5a xsn @8E85tBs'|ktz{YL/Jc~k & [%G{}Wy.@ %[' ptʄtX 6Ł- K7Qm t$#)3$YgfpP!ӄpÁl5 ؂^ mBʄ}|h)(@ bgփS d l%7slQ2"wg?Hebu{}.~@ .ffC]!U@ %k; . :@^+-d>l8yT:nx'k#?7|K, $6nU5ue Q?($ ht{MtIIe>{Shd?RHl'GgYs7QPL*e'ph\.-BA_̈́H[,{fbaiNkEr@~<! Gd`^i&1]oS} "/ j^u _/F`eBt+'p^ c5 !(|- e@(6 ZK !}Pm}7i4|D P!* v=҅cP jCO H5E>%mw<0\{Q'VD~qpTy::oomu] )Å\jmr)zl !,fDd#q'{{]I샐r rRqJ >ZRr0W49($ES[E A#2]R[_zm GT_ 6TrHpȃ$|}b1q+n 18C%>!7 d! ytE5 s„w߁$J)΃ɄY? :,݂m؆ccHiejOP,gSdo" WL o4YLK"Lp{uE(8ք5 RTu0!I@qwGro .0~kUo R#(*``xJ _^O7f\5p&T}@ L{׆fC*P 8&oX8Kw*TUD vE[C- LJv@}򁴇0 x! 9fXއjpЀ  ^ 0e 6ck1% ^T; #5 m-*M8R*9IۆJ 9h[9hzg*n dkU`i U~,Xw"E&h|@|E]r^8]ׇ&nƅj(- #wSކ.4A(%N1хx lVPYR 3} +kU#e`')`$; %*1c %} @|ևχh=b9": k)j!L.\ErK'C7 Gvy0Px ^7"sDt Zp+ [ˀcfe} v%YU9Gl}q{A, 71"o }mEIw}EY%܁ŁF>w'^Y CY*1} HqXt N@vDDH%EA7 pGU8> n=&n· 8>TƈlLc"]}NPق\d- V^^VR'".W }$t} '3lzAw*e gx;IEكwEEROTEqFN]@x^oY;xN\AREAB,l9h^LLE)|$({]Mth"FBxL;!s |J%<nC d#?"9cz^&9AE/$Aeʼn(0;^HAq1ec}'F7mJk I\5fj>N8"/V jr@XEڄX^Z'4i'`G(H|E %g@/kh<7Ql i5 rF d0-R;%HkHA G>huO\; TJsp GC6N>q CW^MINOI|HAhz ?LwLR|THwim-wS?- JXCJB CJ*}`NPkY@B p FaIP*ӆ^P*Ap xTGU xlUv O8sbNR Cۋ@bNjKc4 bI2~3‹]TIy](̉HA1X9Ni- Z(rG%po^vǀ&Q Q!]_ k l;}eZn Di g#7'9kfN^|^/Z&]["Mj#q0! w#{G#-4+t; Z$q{ LiÃ4C 4 l^ AeWO`& g$? [ e!H n^F6wj@O.h҄ m|-ga`[S ,uUDsZE*HsyI@ ψx8; o{_ *bte7mnrt!?V}|!  э  {(\-d>}RM}ލz֍!([q okzD)0?|8d ?4cXٌoaa,\n&7JvE*G j[X7;I ̉XIvR;*gRCT!=tIxDmeQam 'I^8 iJ[o&;)?TxSJX JNmC Lb@ yiQ*\E?'4]^?i[:\va.h^!nZAMa=S Jc}By;ބ5u,S>*hZƍ*dW*xm=\Uu-I{ 7Jl ʌX-IYs:IN!2gNz`,Սҍ]Yv}[S o.}J̋፜ 5{R(Wπ荴|(Cf 5Zr&f@Uyfg!,u](]sPVc T$HwP^{c cڎ5kn=_zІ wR4]<^r?D kJtXŋ^Qڌ i6KWAZ@uQ CXZxFbZ+2gBZA/6`c+Ċ((y>s+ʎ|~-rԋ H !'7E>~3&gJ4*zCt J8ю7J"{ojPbtRyI(\[CP=‹`BheMOYt?`=O8o=VdĊ.rj7AӏXˏ &o<mjl,"]/q& Jqw  ]#91D>{X3^NȏL1x ^A%~J3c^< 5XJpXOj݌ҎB74! /sg?T=$ [p`",Wf :o`Ő=3Y)\VYoW % )Q/iZ1*уe]&Ȃ2y~;xǍNMtJfn`hyX(0 $ (&{K9G6Nf ʈ Ŋ_{ 9恐@`wĊ9=ÍGr]-]\2\*]̐2STzA.T`h 2xQU ' =Jqt6#03mk7m)YFG?h }-\͈q>X[#-I, ?ʎ("84(7x0 >>K,&w3` i6Ph ːn_ Z}m1@>O|6/0Y2ɉLA9] 36# 8܉Mz"=[i$~7Ol)$_r V$$l~8El$^6Ue]l|}H5,aml `G_* jB? 1 QtYy q,o 5V| @- E]S C z^8'W@/t'7@y$Y}A@2@-5Z3O"9[+ O"Uj ej5}$aPOn$,3xxO LP $0xFˑOhOW$DO"o?Dk Dh%)sO0@ (kO "wHM/g K8Y r0ȆaooЅ_x~t Α 3;CU2S]lNE`w]'NEO_@NE'3 - %= XHWNE)&NE fG"g!P/zm}&Ox% })&OqZtsԒ.V&OJ֒;9d8R&O$_3ޒp_P\z~ dB8_1^ ] & M=YzHYZjJlx.Ow˒ \yS.OOZ;*-ea X<8ɂ L L *V L.Te^Rt0C)OȒ#I#DJ*i6O}ߒF,K i6OŎ=6O6?ay ftu6O_0Qk6O`U6O&A뒶6Oy֌ e,zsas,zr0`o%|C tz$l t},z!s;rI}+ =W?({CD y*rR5l92l9t4W璱}?J .{{8C9)s {*_9S1"IdF 3E$$tspœS8%œƒϓ4$œALt(֓G ^7@ kx gl] GDz 4tBN^ be`WK 8 ؒ$^B{ ( Ok}MCO$ ߊaSGOe:>LČ _#Ñ/PCOlLԓ둡WyoCOCpГkhP `,|)?wld%Ir33/MsѓBZZ%;)Փ?1q @ %sc%*}rRE9>2vȒtV| ` Y#QCV]}tXO?7Vm]XOxv[XO@$r]7V>c_ ȁ hGYR D/-hs$cQ,`)WcpN|s#l-A*%F y `}܋%"ތ+WA cq|dOpHZ/O dO ϔO=zdO") q_ t*,ה>h ߔDea/W ۔s;ϔ  Oؔ{EPu% B { &\.gb蔱L 0o>jd]4!G%ӔܔAUYt甯A8Z!_~AH{} q;:ZnP>0  !@u:%i2/~ 1R0kxt)wtd$#F/_ߋ(/RG%x Q S6Ĕ#lÔ 'uK(, J,V`T4uȒ$u %dR–ctʑ%v"tZ5{%Z' I֌H`ܖL7• 1 xGp)=.xDjR=oDgłD>VbE Ԗ֕/)'=5 yN/ ZVr㒇f.D@5k^ N/d$m`a3 Bv#*K)2 b.{.B ^3= 1yM1 3j$=E8NjMC; d [di 5O1irGY=X"w:g͊ʕ5E %S c> Ǔ%}d)P S7s|]ok%`ylkKyHCK mk7ok&z Ԕp%ؓ+k Xp&xDQX`4hBDQu]ht T+wDQ >K>Z`7p {_(/zHHjXoŗ̒3oƖ я+%>9v ,{o[敲@]48"|֎;P}*q/"?P 0h(?P9 9@sNEAd[r.JP#RE(U`c+r$!k՗:vք | x" TeU->t+?m t+F0R `y`t8D."w `tvZ 6"?Pbm$v4 Cu/Q/_.q,@|bQ=dQ/KňT 5/#…BQ efvKf.G1qeхzp!|^ x]JSfՏ?z;$zGNdnZ:2 yyÓ,> Q ~.2S~T\UPvF|݅^-Kgx Àh@)9@l\v|[їt @:Ԙv>)A!+rbP`򓙒f&D~d8GltOB<Ԙ|ۘHhB 9@QtI;B@镨 B?NGy{f lgh\CaG#iĘu]PfԘJfbuVM:=[e$tDyPA'+h2CW$F~ "Ԙ*P@ ΍G<t$ME4Ę7Ϙ"NG6&v3RqfP/3zԘ yfPyt~zWfPyB"^ԔFqt %,f |BXC9RE$X~Ϙdh,\vDSyGVlW yWPHm3匑zw31- D33uG9g@ ]L ] Hyg)&`nw˘[Ώ G%5yp/u͙.wf̒Hr\C"~wc͙\qCu~A ld噭thu oC Nf ZUG*jYs~}!RHdWusN&i͙-^Kș^יKU Nvچss_ :sTzәÏ4 ,͙eJm Pyz: ]% NL2\BKu Mѕzni=͙7&^>? gYN:+Lu@qLHԙxaO~k "0Q̉J]s$6^ksg Ak[5՛v>t, sZeӐ☣i t .&P/ @A /cs;ۅrKwbs!&* ;4pSK*F7o)Kf F76SR՚Ϙ@~UMpt&E yD$<ns7הؒbI`D~ hoo^zŚ$  cR{g H a˘j0f sӒ9*K}oSFf1h `t "r] k  V#a.2U ?oؙO ]c{f RvKsl6œO͕#*Lo䖍 ? m̜FKrzi~jba Oltqޕœn:Ef!J8L",t%ƕϔav&*vzaY8& ڈdS#'(9rD _0 kKyFy+4)GBCw,kМ6Oo; Af="v i9՛\l^`9HZ{ Vhbi3-_ל 6 I*L} | 2;nٜhYP9 Ix$2Niٖ  .}cœi8Ǔ$?;pI9ʗcIy\yo% yt o=DX.jf ++o$B, v)DI_uy-IH|DѝXDrΛZXcӝu-ٝoҝɜ "햶C sޝp=,A)X{2H^K.9 ctW'АZViq1.: tӝ ߊ@~1ƕ{ 坷%)'H \ Bu !!C2^UQ6Śzk}.Q@$ݝ+J88t/LQNK5Cґ^-a͑=8 0^ven:iٚ˘r(t Y] _|S-9VX[ _ݖ X3k/ܚ$u "dTr} !f >7jvV̂*HOO:.$@H:Mԓo " ьg%Ogٚ7MM rEQՓ Y dyؙ"  ~r~V %('k )ɞ'4\)Жxd.'G ՞G< W K lΝrMDK "y .]昼1_bJBZN r YBGpŚ/$ f E53 W$ę I(O $Z DP3#.2:4O~O4dh2T IdhV@]>qz 'ٚX|{ Ś qt ]Fh*h^[*-P@B ^ DQ׀T F('a8(s^g:Gs+>.rw͇͎ҝ.y/Bs}ZmU|=P |= &𝧟 tzt|`EbE:XCcb\@=z\w:{|V-vP HYzΟE}>@;xq _\k$_cuL%39 ٟ L3I7lc#3L-A7 %yc-w1 Ǔ3(.+ M9kWP  +GHHOKlhO៏rԔkQɗ3w @ ,j2ݟE $.9ҟ55`&$^ ՚0qkD[j {ZȔH yb=։* V i)ib/XΟ(o-S 2.d,=ҟrs|3z w0j[U,)(mvsg i ~[rk4ZdV9M#nEgTfV 9P{y+R TN[3Q { 2m 0w"?0K/k*p6dh'|RN\6_à\Q)ˠ$z&(zh {OwWbP}| k&h T0B P0@|XQ, v\QgZiS~p̟A;'e!CN& 3S kQa+]͞b៸n#ts!WZ/r+Cߛ=SO:$ğS+,ޠS|Hf`TH ܔQ\Qٟ ~<+I/2D HYRbx 2~A!$% 5N& )WzϚ6% d_Ϡ5ݘ͞=+ "Gҟ4h\63: Ud4* 94B sH [&g| t`ӡ&WTgQ$¡gQ yrڡP s0(pGZ5~ҡ5ŝΡDӠ69BFxڡB'Y:m蝣 \Pe:C~ѡ@Dv vv v|=' 0 "g̒Ԟ2[j] ޘ 9b>yTPb։gN ͡ڡ^NkċT0$Ρ~Dk tڡY~R,)A 7u 3|X͟ .z u k dƒHrT0'bs\ @?sjѓ% PbtR/ h:*!Y >ʡ'Wj q?hF? T) g-m} H(R 4jؒzh% R 2}i3^R aL~  qr~3.W 1Q+6/m(|l mQ ND G )  EgKN   ^؜AxWh./ #:$m 8X<,"]H=%74C0xo*Jj, "?m31Gg"BpO}.J+ |h+iw r<ˠehiwKpT #d,IHqnҟIMPݜzqnLk@ ,-+4[Z{M+w/+c;%T<!oi(Cw/XBKH&V\,2 )Kr -p|f<Ɨ Hw@mW}&`$ʣ&[S0ÌKS}~RXsң d$|£֣Fڇt}qɣ YRK 壟LhMã>񣟣 z}٣Q@ڣ| ڒ/YL[QW$zTB[Q Λ $U ! %jQ3ΣAMLRt/zs<|]& )Tn;$}^sl%% 4pCX/៞%=bP(4X  9UȐ?ZPFT!' O m磁Wٟ&w|k l&t0c6% [D u!!n4x'1QFqYT / A{F # @\X*x&J*p(Ur ,O'\<EG]<(+X*'7"!(6&Cҟf"ɤ!("\!( n']3Ҥ &hߤpȤdl !Sy?-"|oPV',fyHP{y֤ (&O5/4K{YC M 41d}Y@('rOӠI(rbOo6.*iϤԈ qߤCZ vf4U  8ʤf J៖+lSx@N |U\^: |,Syפ K>1MUd'e$[% OUV)Vr HS?JtDhZ3m0{}$! - {7z ]tTh2[yOˢ  fQ  ] 8Z$[ejO'E-;)ɦ֦['VZt6\"(IaBr) !jVT+?^ ֦o2 ҟ~bFݞF?nr0t;֦ܦBS.2awQz覯2 Ħ*c磯Xab3Lq;󦢢t >ʘ v@, qU(xw8D~|=1`o^8ئU9b`9[u;OyG: ]T 3FHF[9yOWܥ֢%8kҟ|qj1 WTlx~O GK \5yC ;wc=YKY\,$} V&Z>DZ ݣ3mw/ 9"ȡ ccj> d*x>~ ݤ; 7vXXLHI*Y [N [&D[&Y - L˧+ *֧$4 G I`d Vcm"/ QN z-.xOgZA8 YYFD7ؒ$v4hWE,E] @ zy8{y-9S`̒s$  [|ϧ-_CC`3 Z fA^>ܚZR?y- CqR= z %Jjxz yD< 95#J  R1p( EEY ,ES|-%URק3[+Y3[!tO[^M HBMo1 R 3Q bCmt {Ĩ5{a{g0Q /d]a8"6P a#vl $I(gQ 2] A(Xtk!mi?T -p ^8tpʗ2M ٓȨH--|8vR>wBKğ>嚚vpdՓVPx9n.u )c(Λ,mhI*9*@xgI|Gx%?,:X7q;Rb&P -ji:Ȕi=CoSc4w7D yZobG^R@o&8{,E?z;2Ũe騫'!Z ZŦ}x9^ (˥|ƛy,o^ ,8`TCۊ˜&x1R!(JC_kC8Hԗ1%#vԩ֥ Z[⤭ snjyēANة v X:O-:!V9<ץ̓]Y |4y'sWptS5aT,שZ S5[Z=֩ 5z 5e 1tE-P?p"dItf[i+37\>$Dh f wDltgh )~ FfBXg_%婱8I'P fsw Z l*Û)QQHd5xG'[M Шةj$< o`>R|CF yB}Y YvW;uYpҨk{A4AXgYghyޘJl"lx2;$[ a 2 qARW)0$.4֪-ugZlX7P `}K'Mo%^ ND)z -e2R;kW ȪӪdV ܩBl:]kKE+Ye{J:ӪVySgr[ܨ+ WmC@S[]Ц&v-]*3ZhߟVP S6ߖcEϩHror\.v p{@zѢ\q\m,*d5{c*Rl1u `z=2 Vօ)Et>F?^B K=O r|A]il J ԀQh:>HD B|*ꪆ̪%Q} |ɪ8.&3wR;)Īɪ[ī) ӪV`ǫ䨣'8P H*w&(%;gƑc';- @dB/Nȫz *ӥv\eW’[ϪСE_4RNWm\ =% !"-bY ]_1 ?%pl;|, O2-/)/jY b~;xKwM8MK;]| p^b"?ed[ZM}}Svke@\cҪ JeP>VL~Uaզ)} bfwm Lw$8 g54] 7t@2 [H7gLދ]P NH J \ 8W?iK]Slө ѓūnV_Ɨv | zHiLi|4Y LJ@.gA~[Pedy[{ I5r="o|֬|ߦQnΩpPdI uWoz /vY,v˫ϩ A ' ]DE|t 7)nlH.;쬝n՞ة[$0)(]O+[,/r ɖԔL mK%R6˚w@Cc}L K@C]<T6v4/O pOs}$Vş?MŖ UA謠, ?  ^d?iR;>(xu] iR тZj/8uRwV P!Z- ߚt}\n}ݬqKZJhy Χou`=Ajŭϭ0ܩo6lo^(ӭ #Y R$fڭ߭<4ͭ_e =(̪Vd-(l $Rz $TT%-sXnb%Zgݭ}Q_T)6w5 c-%=- Gʭ}C4J$)^&R,k R} K]m4 %2K@zG 'B'6n­ #B#uw֝˜TZu O 3axO $v;V8ޭlV{o??=b~R6a`- Rtbhv㭰V_xѤ0|lyG4 Iw̬VKDCg R)*/UCn}m%:%}[[L4Uhc|Ȣ!ZVSV l! *S0;ݬҥÊE$.2}٨ʞK! ŪJb:ݮٮ S$ꮎߩc(ۮ(ܩ/ "H<)ċ;IO񮲪;x BX~ήe|A@:^@OG #N͞®Lr4VwuU:SNc.=|(RZ I.LUfz? ΆQ o#|EGD eӭ"Y+yOQ%`M9"sPQ 7(j}f ժ 6Ш/ՕQY 1-wD}Cp7 + r :@&4=hF Aө13rQ*Sfب H(]ɮ)f{I0Wܗ&) @0h9DojR78aH)ګY̫د?Ҡ}]j7qjFiFi $=s3`fE1 sޯDj_ׯuw_Wz4Fis Fr~+s&@.CsP쌊6p_ l̪~:eBQWW(ܩ&G^)_%;ʮίH[ 7ra)I- X!EY "kGZ  }i "EQx ;娓u.xB9(mqk<| ;}vZkk:z d)% BE˟k%[!5^>8 :D W1 E}^]"ҩc $◴B{Zeb>2oq`Gf]tٰJ n 9^H`r̔5cHת o 4^H#jj#؞h DB(Y嚯*_`A}(Wʕf`Aӭ6#d'+Aѱd&&M{p*P qaI6l& ]0M`H;ūNxfrh᱊czׅ2Yp+fA%c`MX @EIܩT  ݢХ& 'r/9"%-u K!=9 pHƱ˯ `Wܙt#_=($HX:,[<05۱QȰe89Ʊ`8*^.REX03XXRh$`sܚ`  7ѓ@z<'<&p 2 Mmwz_tQM$ l|VVЙ?]^^"T3SYl|"Xtwm 3 VvA9g 9G>DzL"A列0\ ѯԦ{ײJβ?aH,C@'B ڲ.*^ = 첾 m3\ J ݲ\V2sz\'H'^La(LaZ>*B Х* qؒJ ƲpHe"-',@c,+ R z9(Λba0Lkga( .FxAb$=[SD/S&So #B,mdyaXO@ӱRm.\a +b˲Jw0nǯk"ATW$brCxG; J" |YֲIϯbCTvҲA^,dO7bm hGsլȔ,[|VsM6'C+ B6/?1 4 lw0m܍r³˲}ڲ! Cq ; (n*$ c?''XBɲYֳEm87 iw|vf賫NFԳ ;*uqkH@ coڱֳ]?γN[ܗ wI\ u@ 7*uYʲ Z "ږ"Ƴ˗ꤚγzۯ,^ 4ՓT;r*'PَBt.(k۳7uP+V ˲w óyZO>[7a dQRhme}BV[kf|5 >*dB />u`M6 vW٢'3H +=!ol/! mH   ⪅^A}+(QW+d.ͮJDB#0Ǵ  SB'C>p4Ĵ4Hpi\J +&  n7AGA`Bwm*ȴm|m\T@d悷'ܰ HBpKn-"͡ qxMR .ER,>BWEg[J }T'γcZ]@n*n0{ĬxZ\R//ƲK˲{A:RlUR -ZpSۢ%V2*HRh-R ` [K߯=m +9aBFx-|C y *΍vC ˉIPô|ffbqX,Kgõ^?]^>T ׵+_{   7ު L {k. = fµ#q~A, Tv#|T_\[Jl }5>m:#۵M \wƵR;< άZ$N%-2赲f\ \&(|*?V+5hb\ɵڲ@L+b.ABm j( gYb*B[Lޙv`eUcNӵwR xM&l!NNc*JU|쪛^d;h. }@d޲GdͳVr qflԔr " x\74ߵĴj.?}7W h;P$cL /zEhϲJSy%iֲ7AdE@|[w"LK}P;}9 ^}.QG 5ڶ˲+M"I5:6,ʶֶKm.< 'yi\Ͷ~$[{]G \sƲahL涃 ^='ö-JKu訶BF0l-hsb ;;d '[;d15`B1+%) T9 ]|x-[ V1+Oof$)(ڴ OIwܶӯ ^wڋ |..zSGQt6a3 $*$bsdn12#6f̵we7  ?ⶸ~ܳ pK.>v²JldE>J%&>7?I H=2 ǎ Zw<Wޱ9%31ۨη-3ZE< 2۳3=W >JF\y`ү󵲳%r[ @Q8wE*)ڲ!W!l {r=D whB#bP۷$S9(cص/SHѶogQq6]"C9]1d|m; >rG*ѸڸXeiU;f"$ FиR3X$ ZvC'$ȴ'? B~] 2=5X޴# q?252 ~/IC (Z] e*t3ƵyƸAPJxʸ%-?2GH)(8Ѹ`3,QIOoFHmU޲nPi;gy ś4٬#YL+i)kO γ):׸ĴJ"Tʊf 1q7 ZxR\~ ruFΰ6 0QzƲs+0~Kb Z<$ku" 7g"bkBnzSi,~h@ؤ}&]5=˲5=yHb-^ Lq-į͹ A*Ҵ;rF ;Xt yc \'U@)tk@ó El=UKp ,ZVSBbw /2w1}nC#vkʹζ= A/T8ު67q0R?8[*[ . ʗ YԹ0ι^#c#(  @XP1[blk ?nɹh?,!3YaĴj/ιsT乄;,^6؉ kcf3i1nuSy* LC  $6x&׵?j]dC`?f!%Ju׵Ȭ* E O Ɨѯ׵I8^8`.Up F,!iT/A fQWf^ͩ "b^̒|h>| "Ҕv ,b Zgt$nK򺡗|M3~j/N=U c S zq ~dnHQ>ѓ/ sfb{/ /367x yؗg 9j j 6 oC qbAkR1c/|8c0J$3 Gp yZMn:1j}W~}3Skm=e)U % c{y軖bjBkBT a;1+duGOk]*81xݻ G]@!EQ軄e"k/V$,e[ mL RX n '?6ԼƼTvܼ.bd^ۺ:mDͷ{aO "bμ$&jmᤆ%-ݼl ̼Svmd c <8[}#Ѽ@i[v[ebȔ;%"߳8\Ñ٦Ǽɠ|١+ mYU䔖ǼƁҒ!ۑWoһH&g2+ɻ|~<YOʻ)Kret6Pŝ6T5p b.qнc 5%ŽǽN?U X%C6 D09}CTlټ6}ԽE ΌڽǞ3 TٽһĖ̽4 fn? aμlyLD  " ½h ,Хo线r8y2Tq=k,bD8轢TfWNǽ"{ ,15n# ܼؒ/E4* ;c蓛Z4 88~Kg0/3u]q$OYf#m~kJ&wmFrlֻK Mp:y 59 |ʗ>9y%_'B20нFSc(nT|DSȐy4(gW,߫?Zzz2 ]д'轧It>cq:hpy *l[u]9<]^ҿ|=տL~*yn $ci+J\i纃D UbY9#`2󿚼 W y ԎZ(W  a#>ֿ{m  qW`i5=ޮp% Z:uSU j` D:[o>g#>~o+9[E H ,Jjy 8;nq9B9>P5>[ O3ޤ7O9SGݏ yn$HirM OZRV$] q zEucWޣZ$OzaT zI]vGn>c$~Pn؁ g 4 l$~Yydl$sw3p$Knen&$ yy,}T/NJ/ nfg[U:$(Bh un$ e{FU32 ?R!оFy`+9 $;8 ic ^cryWD)ٓ^nPZ $^Y c]>c]̂_OgmXc SJf3w1ǚE ME#۽)1 ޽U( H=\|#q7%,u!W/Pῌhُ ghJrdT]d &%=9.Un0%VƣOI-sPl)z>% ~>xZI<~-sG[ZGaX i ) kD0ک[5I"[^R PQ8T.o5]TՓ@sN꽜yjs#1m>v10͵s%Es^}R^<uOgj| N޶6VWRSy J+ n 3Pn9$ TR՟}EU T%tAʗQXo&jQsI%RXdl,~eʚ \䔟65(JOSOX# /:T;NEHb / q!NY) RM<Λx< qsZ#vDQ~ NI7mQbowzb H^ n ҇E`R8?QlM⑥eQ¹W0 [aTETt!Ò 5 ZFmԧt¡$,¾%$ns.sEu} T薮 ؟3XL}XL7V¹# sqV:nPқxj[/r›CZ{Q}$(2FU˸ErZ6 F!(Qk^4F ǪPtA4peJB&7†5Ҷ  5!TZE^‹4mt$ª p-hoOn^yiܗ]p ;¡<%"R!(HD R -=?裺?'l"+‹L[pS|q[ 0d^!K^SftؒJTWDy ''^&oB)#V6duTW&ћcIon:_lA.I8ZQ7h)9R :S";%8&1y:Ge~Î b.Z ÒÀ2(?"ȾF6, p<Ӌň!TgoA]s&$î x6ܚ{†ü ( ג>D{]=‡Q .Û M~ѓ 4{X.J1^̓ +0.CÌ >,5&h÷aT/K†Eh"9ý p/uG,9-kwy[FͦgM;P绱 = ıH@ȔO'nPHhÀK6T Wο['ēGM1X)ĈF!bQęRç<<6ü ';Ĝ7gfto_IV P_nzE$ĭva<p~O e6OA=N8 w"ZĚ!ğ&71ͼb('HwLķt.zS(6s ¯ a!jFB"pRFJHa)L;s|J;tvòt6eu]ǒ_"3)W3K S¡꒞įgk^PjVz y?T,†Rd-^ýki<  r< A2!Z L`ę{ ŏ 1 fD'mr ?Į r?1'm:羙 o;h%^5 A= @CۛSY B&Uݠ V6vϯQ^ q;Kahŋry$_Ũ÷c Dߧ!(NV ~0L >^>CB)b *6o Mӧ~kŪ[K/Iv 0mb]Q-- 1>K˪7{5Z@0dLt%F$^x(創;(5'Ŵ7BFhvŔ@ ~ Nu"M{-L)]E!( 9t7 8Ōt$jYE(${g 9- V'vÚĒ%b ĶI#G:5vP¬!t t^4Z 8Cŀ jYWKŽh* Za.ïTʖlvZ6vx^4†mۧ^4uNc@y 'C^4ŒSF5Ƽj UI@aL!i7 ų[08Ə ,a;ݜ_0k}KƯ_0PvQ Ƭ ػx0DPW/΀Z@¶UC2nŲC&s 1t("y@v-oi/ 4w{Ffƙ {xc(&ZE('V.Â" s͏Xa_[%u8‰-~jHJIH[Sߏ8P  Xq OHcu!uƪ[J #_OƯg Gư]3t-DCƂ˸cz!(&ųƍ[ E ^ƌ%"V oW~X}~ﺏLC Cu,s,gUsƍƉ>re lM2)k`(&be4 ċ NPj,m_yz-hUzvIPpz.vRÐ&w)øWBOb^yL ;^y=pAI HU4vcə} Gz`R6`^$ 95Aɔ z?E*! z*FVףG|ȃ T!*RXH!JrWk;%ȝȴ XW0$V6þ#`|ēuƮ >#Ƿ<+ȁbɒa%*{|1wDt-=ȳ ay 0ɰ/lȇɤ".Ipv^n.2 uɋȳ=Υ#Ý8aXȋɏ{#<ȅ%1^/0*KwC>[K/S =*Ɍr*Й*&JĤ#R>9}2N 4UI`-AL *\(z1sȆd `=LȄQȶD+Ndef ʟǠ <{)G?^ޫD+U{G7D+O}D$ƺʊʨ &y H"6$Iٴ+ؒ.y`Q3YUlKk7IL,C=<oeD[6yN/MPCTl:y ",nTʋ Ɓʷ\ʅqʮJ⻵g1 !ɢ R°+}R+ƑcʡL[\vѓLȻq~ʉ7GʙüSȔ+sޘ+]*S,<ʙ^y!/^y*z E,nʿ+O+c{^5ɴʹ* ΋v6%豖P^gzÌP^+KɲBAyy ʪtDWǔ~+|ʶ8dE1"Í$OʕO8gQ ƚ,:h}ƭMM}Az $ /B8yI1)¥18;,3#ҭ3,cv¡yg$K!ue/JlK!̅H/tdkd Xʝ-O/\z#"=D.b .%M ˣg9ˁ#橽?|A,YCyUxC6jTkWܾ/eƗ1wxMhpk,{ڞc q 2Q }˟ʒKi+X^Kó$ɁxHS(v =?'P[NvS3+%% .2`EA˵D }f(ycʅ0b @#˭t9Ȟˮ,>BIɽaT^˿jzI^ N6Zˠ*ա3gacoDho/8|zV th ozI^α uVe^D2~ ;HrxY@lv Runk`1,>*U!7,8ʝĵ)P<̆*=LP ,C:" A,cPuKy)햿,N.lY,U2[P s?Ӓb:xu=73jB, (֯Inˮ= U nz_$]m̶%Z@WARi7D ]_˹$Y f¯-=7Mo 1P[ :Mƀѭ:m.t3ɩSe:1gʖ#uxj&ħZ7S,Z75̀̊5Fݜo"uK5P}i6wʭYVƑ}) 0n,̷Z >l̕-R̀{0 C̱f̎o\!͖yΛtA,QƔ̒]-G64 x^B Qo5Q˖ɶ [\k-y k-M gʀ&v,) Ovʬ,ےA= uK̺Yȃֹ|r;V ʹWw|f:kȨApCCf:C[_ #9 ͑mK{Q(.f:( ƚ閣-\T˳XeoșV0.͈ Ⱦ]_I=e}Mvz6(}"ϩ AέW}W4R,l)#ȓuY㒟"PPڠj}f{@$f9 #1|9f8'_FЈQ9U7TlYVV!PXʧ\UT_͑Ș|ϡ+6}N/1[DY o>І 1i 4ρƵF4[pIף ʫ"Io}@Bk3N9 (1̗|=?(72~r7*ssQЄe<ʖ]>Lg˿йre/0Q?IsBƧψ=To3LKl>&cztreПK LOm Xʫ<>˾'I'Qɥ`ԓЌFxW-Űuϯ<GA}G )R[87:r@NL<<칍]cʂy_`k̹J2|-/]Ϸv{qϙ{ʥ{0l5[9BA#|Nfø`ΆEA*) ,:S@ѢMLѭĨ |F~ ںQ}g xkY:Bː&[0|ʥ Jsw_2\2A; ;ٍ #OMCϐz@drneW}É2v3BEo|ѱ?kь&hӫ&XhZX%u^M }*ÅZ: wXӷ3#ӧVwLr6L:?,+MPʿXaz"dO_] 0Ѫ\"^""ʜc3?'ZҌ 3F)խ y&+?'BNA޶&3̵d&33WDsWZ V[Dj @7Г:3‡͈4O|nɩD§ 15`-)RznPӪ!L9kX3H . _*-2,D~=y* B'jβP "ZvA%Iԙ^A V]ﺗHEHTZl1tV! :-`D(1tZY-҉'˜!17=t3z԰NCb kS6* d)03 -4E~ӓ2R-"3 Ε>?tzF?ӃJg_6> 3g 0DBŋ2ԊE;V0.ٓ%QMO_O9 }԰+ %Q(EI/COo k ՊP^a1Z$a1>54,} 4B![ r_)IJ  dw/R<)dw&3iTAi Ǎ sԍ ;@AgI :SR Éu՟)\EÉ;`F #ʗBE*Ni #ԩz OծcVVe԰ h༌ϼFElDfԯ-ȒԙPR ȷ9:lep՚մAŲӎK :y|ӤxxՏNTg8tmvZȾ4&Ih(N~AH <k]wհIR."H 0M$xՃo#ggo:#fӜgՒvrGJ;T2+ՔU ϯ44SvqMԍ-KS t1Q ;0 {aVjB CܟM̮pԐ@-$_rw ͻ rw !}ԑb A@0 Mճ΂Plֲ A0֨bԯ8̏ź=K~0ē2ճ\~|l|pTՙh(b\E@Gw &4 Z5(  =2_l VE7eYJ8dԕ+pJs֟0jEm|QXrjvE$SsЁq׵ YWd[iԦCAְ֫uF%U(dΛy`U4:/rbΦeoΨ/J7ֲ4門1R׵4֬Н r$Ј~ k@W}I,U֊L[DRhJ֫wНd|k Ӈ ֒0 CZ+-< r 'V1Ԧ-#]On0^V ʆ빞UzS זFtԢos" gփՂ4ԕ# %I.՝X\ rdkQӕf->% '\RZ?O4׫3և3Ca՘f= 1ŇՀ- 1;כ[֧*Ge('\mց rgTZ$fEkBE=ֻMgZՊ2;h5)טҳeӯZk+1n ןAzׯ;&$܄U g@WmeԙnZԣ#+܄u;Ֆ,֙mX @0>&BՃ sXpWր  G\tׅb !R n/3;۾;Ԙ[N׈1,l 4$ԑ^ժHΓ׷A׼4קm=)NtH םMl>;1|Q^6z!׃e8m΁ y Ż;|=)"sBwh19}!ו6;-$؄O[B,y Ѵ1[/+B_@bVʯԔ Zc~1(ϡD5rZW5x Jɽ$R^5#عg9ap2wβ'G}5؉Ac"˝)T t5ȰVL2͹J˙)# ,˥ 9į 4x_tسkرS$yӸpJER$)2w%p4s!z;0qBOe4K$q=1^=65ӂʷӬ5 (׎oDl$#pC{2T?np}3&/:r58չx؇ h̹+Fد*$c؛{~wxRSEf!%צubԤfؤؐةS׉sEӎjٞ )2؃ǕH+M0gֲgxذ^`yF1ن ٛE>Փ%>&XB%”o%>'۱"=ot[[7\L}Q+ db۞?91iZcZ92qA7ɾhc_V4'ڌx̣Z⥮RV#Gm@F8 p۔~ۗ؄B؀ ۈFWsՇfo TdH*RۿԪՇZۏ`,g\p "ۀ;ۜbw~7yї{=yێeL-a2;)»8n@z ,S8qbx 3ۂ39L<"#)ܩېAܻKm)paד[b:q&Vƀ ˘=%hdſz͌܆HK﻽ lU; &y8y|P$L:K@B7ʋȭh ' QrcP :UP2P :]q&YfF?"K*-eZ1K"z,ۯ Aؽ9x(ªlm8%GԻ :؜7ۯ- Ֆ܊9a”3E_''abQ B:?u!oܲ V!=L zO= q*<Ϻ  6#5܎"부u*( m܍ :'l^?(=_-˕ܝioܴܜn%i+nNtbz g&zS&/SS&R؀ۡ`O;uBBCS& CssĻ>'=am؆qb.\9 :;a44!5) yD" S Q*2$Y34ݐB0W w4ݖ̆ ([;m5ݍ[X;ؔ0ƾ$@$\CnosoUM3k0& >:X1wQrʗUSN V^FPv(2ݯT|#U౎y[pv'by݃ [ [zpy'SA#Xa"g:&ls0y'J)(QՔ*> `IbdDzG݃N^;Ŷ<`oV K+hv'>XH4U 7X8ݙ!T|Ff|F!`_bٷTxLmfms4u˓ 9]3rZ!ǰo;˻ !P, W<Ζ#Ԣݙ* L=]0hsP]PV]4(v6:bڤ?$XK7=a (^CrL޼@Y3pFbܬXmܸV&brJ g( 8%gN/[GTvLFH<֥O) b/!z0-PL݃y r*޶h1Zo]#%~ږ8 3 9(`NbnyV&pƋ]LvAg Tr<=1# diLӓΛeHzeH#|/HۜݨL5\ ϯ!ͼޫ ̧Hqq>ޫ*9tU= Ɨ =RO%4ޟ%kabUqʕitl/9~$Y~,m(8b[^ yPz滕.)8N#D b{wX}ǰ x۞!1R>^ ܚq(Ӂݢ.sܯfW3ߋ\2 YDߴ#qp=ݻ|=p d(k='J7ۚ}1U3*ձ^I-K~T>!1Mީ>,`ƥ둿MȽR b0q3߉ͺqC#fX=.`߳;ٓhjrPdo,|#&-7.os>=Z=ޙ8b{h $[iC>-4 $ŒNZA#ٴzM_K[(_bؾDuݠܱߢA~ m61#މk˦=4,k>V:Fܕ[CW&߭8Eɗ2 U*آC |#gvM:#޶,\t,fv mfIfF4 ?޼8,=(x (x ZܑqMPMa/fV&VAޞNҾXZҀEh27JLm:NmmN|BNMq 5(}3\_q;Q &C݂hH[P:.] <}5ϘޛeB[&ʩ QU6nnb:3{9AKl6#ۙcB΋ر8Z!] 8VŝWSܰm|l(X 'Ȭ:̻ۓ21 Bj+߂UQ6 {[\E m$  ?Wv BR<7ݨ*^EPnHY r7Ԡ#jðF3ޝ>R > E~); w \WFrBӼ3(S*eRɄCf64&ެ:1CˣmʟБmє߿. 7XCf#rOCזҘ7;%  %f90 үR#0]#Qml2ŶXz8)v͍zQkӁ$QTZQnQ"}ᓘjQ$xApܺEq_puWpWSn=p,ٲpej׵όYX٤dFi{UրX5c${.ȱH!NsHX}~?9_~Tdi[O6T-_6#߾_s*1I@FE1S 3.[&+ JMb-@WC0= +D[&G= 0ڵ| uQ yᐺ3 d{!&W1+P8jxLZ RAC's׈W&~J6A݇uSб\]h(a")za⌇}y (twUsc .E[h]lg?Ĉzrj`Pj }!7tXB܁j;3C2jgG kuQ4-W|YRG RK޻']iһr*8g"I~kXߣ5ڔoH$ Bm FXg_X6$ݟk*xX1 X\׊_X-5ye?ax5Ihaʏ.5I'G&QjXݸQ_'zQ%yMZ鯯a 4VAֱ߹ YY'&&xmBHm) %_@sԈK2^нh_s.rh844$Kt(h52SVM$hj^ͫ \ ^^084 pj؈ /cԙtt&`Cw۹QC,t%8+ĉ /Dn j4ފ@zPlw3'묊2 ܎ 0yӊbaeҨ ?⁩ފ/V˩Fo9Pu@QTㄴڻy5pn%(U߫qfzh@v.f&E$tӫxùl"Ლrt@cm\FAZm\*/|߸ Y DhՎ˅]1Pթĝ߼V9G#6Yϧxn.@Up ]YP wQ/4>{ *kD_$LSӽN@+hQb#/gQHRo`jp!$YU[s$Y{m۫Ax۹Ic 6?zKGsڧl{owOq:.j1Yzm?jۑ31Y `BA-Ԙc!EW H6MWԶh'>,lMQ$Ba䳶1g:_:Yk@䃸 t1|ۦ-_rjCg˯䀐e~䑎dBD' dB"جISd5lӡ_ϕI$_Mӡ d jsX..θ^.y] k>J(.EزP8̔W?)?W8IoN`^* *:R"Uj }$̓Q i}$!lq736R#*[H6Rt4D}u_~]T$#0:S(ESM@v$Ba^3`ԋ٤ŢWt2*GUXj$_lģ ",孛-Hs-I! 65AS+oYUYLf-Yk0 9; 156 '1Tz]/sCp ~lx5ΤF6ҹ(Lm%p<~YY;Y tÑ@d#+Lmư*h3959~c]o aυ]d~Ԥ @E{W@^A`,J YN^A2оlkk?^쮰ٞFKU1pnPQmv""C Fx4h n!X8:azxۉs4^w ) ”(Ȋou { p* 揝Cp-֥ព\EQir8ٗ{q:]YNZ$qw @\]YPPemZ<8>l$(i嵖>T~k(n=\eq]&%NV\=@QGr=y V6rC9~Cԡu-Y}o," ,XB<(v*]L{*#A#E/:%chX%ct+NG,\m(PW"REJ` ' ]QjGYRwag@fk9)I$/|?]Jn#IZ1M1I#e}/ J6ati3_IP#{1 \6 j EAeh煞k4r9]iFYTBΪEGr: Pq9jyѿusorOO In0⒘Z nGͤ4 vah/P.Mm X..M+[.M^/>f+k+I4;åRUfY !GLv# boqpZ!y TȾB;MrutPpWS)wf-d (|H;.eo^ϟ r02B;J >p);6.2L X>/G?ba $fp34z_`EL r1t0o2zQ 4W[թ>lAk^g&t*[lSNs)]q7=#(;CqJ*;(䀦\q9J> if!QP"9Jj=T9G-NX? |kd'CV9nqE nay$#+o;cp ^v9}~|0G^ ~'e}jZ_!pG+Iqk2u9\4PCx@ oʁLV A` EǢ6U52tjO0$|ƆEؖG=v|բ遷xŒIj$CB+׆ . QPo!>Ԩ]lx3.]K)@ ?w+Rj)s|^+8O$+ddX" ҉mT|^OdYm5\)Z:i|^G~.M2a?yn7 V։L2։5+YHsܓ4Ia-'yq;xժtY_Èhg։E*N8UR1%<_SuW<TFQ_<+tJF|U{90y̙q,qT2S=YZ pqޑ9ժ1(gCjUu Gڤ$S)i]N]Ѷ!W0[\Z|fAl-0eS^+ \)_CMO~*!`t+p6%D|NČ|aˌ}2 }8t+חgXa3`Q/`_͟fy1VŒ[>ùU2DZ>NhNj>%*07rV=BZ:M] }˦eج]Z ɑq?믏U%+I dH%?'jөq$+T,p_Xqx?)J㑨D^,g!^\3u@r뺓2WrR@ 'g@v6#uy@=,N2@*b 0,NVPAj^P@3e8Ayq&yA>L} 2vA#8GQÛ8G$I`$A˔AzBհXcj-z(ĉ뼵ӡ_E_bB"W :hBÚMFB\5ʞ%89RV9otKWKtWm3v,,<|M=ÀT\.v7f!0D%D6" R.DS>L[.a-u RQ}jY& ˢGfV6[VY8R夨^GDFB"P +0j$^U3Kտ\s9hH}:οko|"n9x@}Ëb LKAg tstRI&7KcFX $~7[\X)keQL<@ŗ*iQ-5'KV{OI`WIn :--cRcfI=igG-+7=YZ$sljHex-tfxzxek`3h:{i\oT\Xo@I&k-=-\ecy ֭ * -.Cg ZE STS_L O8Ud& -o][ 쑫V2MCWD| s kȉ z-+wE %PJ9RQzLS u^3nߧqXH i.ҏ;[Xkq!;<Yv7 *_qrOF*5/ﭱ`k3phYL`Abf"%֭MM#s%t8G'pCwmgjJ*J5|LN N \5'vzH/RV*j- L dǹdu- XQ J]vRX/Л _N2kH/Of^%-r'&w`?Ak$ asAx%>l)!4!ΘyFS)c9.0|к~":bJh1o%F m4um@}2o%b 滽w@}1%'yb>f^mڈ| @31lw/%zAK d̞ya7d;NE0g<̡p# p`x+&[ШqT{p*p$Ǔo lKpUv{CXOmX#o  $3X( XD0:e˴fc%Gsbs%v^s9Ys ʛjI#etv&Gt)fݓnP?)Lys|)2!CX1W x$}v5pGW =$*9/:W (K $B!H 2C9;,(gvucXVHz6h ЀdPZHŅE %!j1;As/  9 >4.AZ(\, Ӎh@$zT8SZ:Mz|eHAmQSg<}\C m$vqL͐Q8S(+ǻ+8NnQ"t->8Vg< ΚeR͈?(a* YLo-Nd4hf74h Mr A7 ]QffB iS}Fry$_NbF2loҡNEU#90yJOlP6O30,z 99IPZ9Al@9@qxH%#luX  TZ;l#xv[y=j5-$.yǖkUOr8,P'p8O3zIkO,y,5Kj$=yCݝXKb' x%P!)PðsZfH0Q[b@`S:h v-;bE.;7P P\*TђJ 21rԑt+UkYt+Bonbh2lwe%WkN2GNGN0MliNXS$͈%;^=bP 9r lB*$]}Ck5iDRcZ{.Y2`tcZ yFb iK;ڟ溙_]љJp' {ZJ[SPEbGs+y6Lku,) k kkzlϱu `9L~P*_GtHs~Ww0HtM3 sm~A=RP Q'o@PJR~ nP݅t? ԓ~ݚKgZ\!gZgZxdљ ,ڠ>!v<9g͍7[| kZrFr:7\`⭛89 aP/TPr* zoZO@=#mkZ/mPI]X2C|kKpS|ﳠhԟ1cdZS*#HE5Vr  [?4,1cxob^ɂt0~%ILH4 $rZ.rZB}X9С^rZ8ؼE[ p&_H K}l1C8' ؠ2$PgؠK/kUb88w "/ 5U` s$essg;Έ)w^@ءM{]F8Ti~^w6kZ@4,qަ(9h0 Hb V0S_0'9XP@#˔NC589 o3tTv\Q x2?㲃 PȺ;'p񤡅=+DNq[{ {_:=ѳTkQyXckQmˑgojjEȒ,UyOM P `UXsI~k,桴o@[ D[F}ϚJQ wx`#7Sc oz= +/2,!svHį ycTﻙ&NU㙡F(9FGω6\ E/CK&:G&-HLUoqi<`Q}0UrXUYLj*AXQצ.d*mXX_d*߿2Z߼/^iH>R>H@[@/E,F[uBE| 7Q:MQ:A |[%V̉Hc|< o< iƒn|]ۯE=}"x^v |,WRD/Ѻކ׉ xI ȅ<6IP^?H[btoA"j%"{}dB|QXXV^N;j-jL0;(U& +Hv 4^dV/1Ryܻ/y.?:noU$%%,*}$5URQhj;o°2* (PH-k EUp}( $5l-%F~ PQHЎ芢mR I'/kq5[cE[czSV- u&%SI$|؄{ u u ?n٥bauL[&j%Z3fe}`q~^*le8r|H߲=xQ$~NRc#5ҫTԑ^Rz =5uo&8_~u}p.cÙsyˋ,[G͐)Pb73˄l&Ė:7 ܋p.D5 ,4Ì1E?!zhB/Ac~07 O ,汓罇6;ʿNZOͷ;CKXkdzKduuHԨrk|j!eLdmEV&h a:Z hp[)AV ~2 z 3;68Ji, MrhYS+Sf?x\8n:\q^ m TNִ!mM)տ6Hkڟ ?3lKu] :l#SUr MXl'$T_mPTvKi5Z1w/=.U4+Rwc]u'Wu>\eӈ C"1V sV Mܦ:$YX׭ؾX 7|^7E9le/YoQ ueWcB7*$\(80!{@-$n|]M ]}M8^ 1/b`WfF~ j?FXؖ^NTt6=4 {biXIY} h 9}3P9GXقs:P'L1w:rjK|Y B%f)͏}.:Bеl]Ƚ:MXU%[ڱP-zM 6%Lqz k P-^=v\-9ԩ.,+"s&¹\,F8pÒ ƼԩtlVUzTmT 4߫|b%((ݴ%q4 e*/4ZO5=%+iCUZ wzekUnS-ʫ1[DH2ƲjY"='kxZhZ)!Z(o#&%qZnGWv+;G6¶4+ܤ,{]ձbڴ#F ,BaLp},X6%ǼyPve䁘_4"}f\ xAf,c.\Qr4-=MO:x0< \*Q iZ6&{1}9DDZ*">VΜVZ)A^!b\}pheȥVR5VHlEA4InjUgڠA)䈶<\?^XYNޔy~4:B.ܹ },@a|69|JH*}V:/-U ~X/-?n/-RN 2?XҎ6)*|]V3|4qT`*VDK-I*?3rJm/0̹و |civi*#g Fz!'NٱxQ*myu<8H/.Z,.AA/]#HK.D 3K&WS?W0٪b֘84Z pjрjXhh98e!2rO/1qq[l@dGBL6ӭK:*st7xbmbFlS[.h ZZV͹Bx/Uo~`m}Zn Z#(h v8N#X#AA ,E4232 ݟ-4ؓ oˎe,w@P%#5tTnGaeFB`z q} G 6O:Y#.ߖ5'j4 @=/.M,Fxjaqx2j"9"nrѴ|^8rQ/щg+dYƊQ݄  Is{^%XrB:jbe.*UJ݄Jl.ߖL^ ڛj|PhE6W  zlتeV{4xk{N-cZg}xaURE@['4T[48 Crj5s d#8bpyv\V T u~;s`EZk(NlNs`ZrayBlbywv urN'[ЃC&rE1 . }z 1 kA2Nl_'[$`+OHRSP9LS[V`Y& :g숯-.T; &;H;:!{o{  U*lpܰEtŦ4OsזϋeV=#aI &5 @# "=-H: d;.vzKp+΋T-6r⊊ 0գBPr[ r*)&e8)X䃬f2 Prqtn5 @]F!$g)20:0T6t2 Xt ?.ي-.]jj ٝ ";E-#&:1=Byt@F#'EиZ!Ue:j46q> o5 4b!k ` =rLf 3!bNT5](yIr->Fp# O|cUِϭj,$njd$[yyjOՂj̅غdnT`MT$k b Y1G:TL[(UcNOW =n/qfn/(/F7ܫ-˨`x]b;K7ܖcDǽKܫlSej"0Gp '`r݋۴Wk - pH.2m`Nc?sb?{C&n.x(?m u A<n"/syO7.RyO?lA K +bϐ`&g&vDg;AEW{]L7ܖ^ ) x4 l ^ɖDܖYtLܲPg!{ssZ쌌j{2]2j.Y, x^wgRwɒ;ҾXʭξ#; ~Ngx2P?29a2wЙcҐM_&IZ4|22jo4.&.Wt5[:/.P?8/.׹ܫI ) p:;x@[7ܖm_Cxܲ@Q: [ |7 WQ:/28l xr`ְ*oSy_=_,hsԸssxhj(=*ʆ;k/ԙѫ6x7e,Aܫ_A4rO,m`p =j_[6J2=ez B L`  qL` 1@܀"`3r̈!#6@o(3d0DQrp sH"Svd91gިxJ sЀQrʧ;*1ġ5u*@iȼj̀l֛9"TjcF 4ԙvn 1`Bj*[I%@g<\&t8حޭ&1I7Z m- c;;sB4f(PRm usު;nosmaZhjސRhk;׈}U4hz0W 9xhTH3Y)߂`aFR(jnԅoAR?Ӄed|ex"n?!r` 5#q "$c6{1PIKd} IFiQTrPp[f1wb iwb.ÛLF8 U%mh>R`l Cwyeae^➉^f yʖ8M)9E|% 9@c-y+7А[ 2(TFk@biҶl>gV)E$N8%A*kӹNˮP* |ok+mc+ $e C0![ [ߺunNnHYqme ;]^'&kQ'c){*Ewρ,[뱥M|dsaVLx2u%L`,~ጴ Qyrr7EvtHtݴ9#(i+nbe{ !QWov8EޝsODZ-fb \;+YyK0;mCtk0>|a?hT+8[;7[?ѶH+(~Fim5F [uW0r ;RtO_1ןiHۖd{:1l>ACMoL)+, G&xotZi{;9k\y HNH2siJ@:a'9Š2qBK?'bc]dh>Xi u5 ,TuQA!RL88[# |$$C2xp&I> ]LɼW^M ])`Fi'YF@)^'[986WAQR9PqEBT5AM.2 0/^K3YD* q6AfDZ4MXbe:Nd(@[ivzREt2!IF T> MdpB0f{\O|10QgNeuS "z%y":2QjI$AS3(rQeu?hҞpu)'`~-V bNjNߢ;E ,;Mh]kڤrr5  '$ѽla'=z&^Q:b)% =i6KHgKח$A45T,l Jby 2+@bEO]ܺU[oX,44\^eW$VR䉡1vX V] 1g%wa܍@7B܆:Tmuۗt&WKX9%{D{pJ'2JFɄ7'2-kT wxv:ҰQ8HƤ^b2J4fO`VR}xbFǰE1h.f-bdG%k)q2QI X{G$^9A6E ׶'e-/ &a2koԒ9bͦB/:Qܥβt'L)h=<+t^51k/.; QSmj,4mB$CXFp卵43qObz>,3-l«3 :d>xTC 񧅝b7Yإ0ksm/g;VB-ݍ$E#0+17f_r/!ɴmqa?'Sb&k*g/EΈ,eaBHlb14+3ΗQzg&hUtBVh!KL7\Ԭ.Ho.@diGGVXe}'X>K|$ltדHCmw眄U/7 /cS?c{\?)[{~{?И &tl֋1~w~^W@oZHRz"؇i2nbn׈H‚Fp_(%DȈkxR;lRH$]Ev8@be^ ATrZWJtWH}(X`RHOn(hksb rkqᘄlWZ82)_s0zvE48(Y5~Վ}gRX,(IZ يl}F#/ YipiւeU,BgIY?zӑ3CUw>j"2Z [h:)MHt=Y")5.Cւ+ُ?WkRG'hh)CYx 6?VV9dY?q'eWrGYV-+9B5T@*Qw7UXnj+qzz\~vpK!2_Bc&yAYGv s6 dd3|a^іYy9rY¡{"k`|nB@$:졂$/WEb /B+8:Oj!@rFxD>ԭ].C L8=Zz;j9DuԫZijKoj2!Zig/%z2Ci24'Hq[j;8Z+Q;8M#K;Hr1 j%t$&K-* bkłVw+;Qb?k/%:D6۴t2)3"9)l{z'ضV7;.B@{'J)T. wK+U(Q%զӺR+u:串j3+ $v$Ze L%2Qc/6qr{봂-kFr|Kb":8 OV[ ܡEBɫi=k K˻ђ){%"Xm[ M8t¿b+2s;zљkBɿ7D Ad2Ab K2K}%l[ǫ1%qEȐr+&~rB!ފ̻" @Wr#q<rvu<ќ˼!ܙKrgʧ% 쬵,s&% +1ϊb3r%j1 6|ʉSb MsD%l 11:&dZͿL]O6Z $ Q1 8s_Qٜ:H\S&5ͫѿX }цW>]K<x3&96Lm9X ]0z T):\\.)Q,b<JNR t~z  yR$aҡDӺS&q4-6}USSD*zMgp?=A- 8yx>۝F4KԼ2E3Ȳhl˵CLUüs1wN 8@)s> s-:0О_:J[i?>ݝrweA=AMdr5>Qiޟ3s[eN), QFw>>nr0,_q A!;{i&ʒ! o5Mn u,.o&m;"bwϙPO҈+_}i^ν$$#⚭`fS6k?a+ZO9-H}%fK~cGg,]?N5%ʄś:4 w11OVoB +vѠ /t]=!$x?ou^b/UY/ۃa~>PaÃޙ7HRl:=l)˞^;]) r_ޔj6_k_-ٟׅQ @,+zx$:ħ:vǯ^;e`[ Ȉ50Qڋka}8φTO;Hw`FSw!d@g#mRu Pv mB1!}9 C 0@Dj2Y@An E:O)({. tr$D =nF zgPCL&zB``|=|8 *ZP% D93F, !d WG^U~ )`9S\!FBds Ix4ZaI+FB vcBh‹N`aBr E .&+\ ~Z K.,>?!)p]==p'-D1P2hX~98pnLh'aTD@8VbzPտ<VZŇȳ8l/@-Md5_g[r| VOx\es!sEGAR2ѸUX߄AB}/vʰS@umfI&nS'OJ>AA&Z(\dEoG;XXɑPHf|ɿ% C[QSt)"i0Q1SziGr8"0^tʳR-kA z䖇F(cxAV~ 3$><K9 sYZH @,Zl PoPEo$+1=+.Vf2NK|;>Fvt7+ \L¬}s (OcCqC] -Y ssE'MtДDV9}m8ɲpZ{ _7oL8̒(V& ņ&G(,WdDamHhэ=ДH*, ܓd L9N MdY(f_P``"*y44mB dq,lNsϰNc{,F=gY EIRE@9S)f;ˎβ!aC#$w} DjpM9ȜpЯsڼ3UΒ̑0njglTmCiFBU}fY SpWp" h!(ChUb]@~P,$ky4 lQw4љԅ?Iax~\0ivNl#'ֹ4cxLE42z0UX?5@ q.Jj:Js-}DG(ʙa L5)2bF(Km]Aï٣rܡŅ*huFj@_#Ov*m&\S>*VԠҸ-ጝO ^x!y ?Hw /DF)7P[%dy_QӼ SZC+PTXHSȣdzJå$U ,NsS?eB3mT`LCdPwV$Rf+]A&kBT.%Re@@J*J\ `h}lYÙʼU~{EMVi.)ݏ*"^bqNKb` Ady8{"Oe[i2/Okku~WU! vvбd+7H.3Z؈j="4C$'M'\Cr?q6!$aHk}8ಉ&$z-G^c íJIǒtMU_O^ͪT>l 7BUUЃX2F/NTi*fMg'l0$Iak)5<9G{sJWIP\^+0#!X#f "SSؑ:KM٣C~ Q B$a'n-~SU1, χG,gQNǪ7>i5 =+;*26+@:ddآxt%Z!V1U\'4i1LY2Mg`>3z%_37]բ]~X+ H\SG܆kKͰ$`>rcħnD-/D3%-n4īC^hv(SxƊk ( J<>#gaZeu1ڥSY7\x_ gq=1D?v1x9@UlP-z6Yiz̈=fx nI'r# Q,ɰNOX*d#Zv ԄB;5Ov[Ŋdcq2U`6E.n4"݄ ?ajQRVadoe.! kp`XKb1C@2F6$%Si?["eǼgL=VPv0l%r x&kI5ݣu Ɠ3v1엻df/&F~ʺ53>X`fZQc͙Te'WX.Y5 f )$nc6C䓒p삿%BPgAmUeA|rC x!Y j)3-M*'ڿ'Dspy8!c 1x7haEO朄 vf.;Y 4DcA+fTv<3_6HD< (TOA~|tT&hiP<ϧsfeU9{F5qوkMK4GՖL$HONJz2gO490,t$4+D++Xk_Gsf6؛1 oPܘ u.K0]Q#/>)T>k`Aږ ݵO6$LreN]ʈ0ՄXs&qF_B˾fݣ/.+a W ԰yP3i9iyX7(瓓Tǁk'd3rRbx1 8lVz o(dᣥUѬrSoSZ;5wuXKtնj9sL!jW>zXP;1ya9_rvC l;.a&[HA Ct&ҟ4V] (Av+d`-u:ׅLMm+M{su&r`m0!=骂Ϭ,YMm 7E$Z(8MպզD^Bی;86 LO`rgly ɺGvYCp'3j{<յ468mٝ5ShSLK͆5ֽ{Yjqй -*(U8sVvkA3gcp{[(aܩ%--^vkbc;g:M8#d,qf׾so A I~ >jN125): אXxom$_ Q}U DYǸ'AZp ){Z -qV~86̔X؏D nL̡6i0@<=8(+]u=DE4xGiP!ƽc=#L^8anUppZ.I3mIup %5w pdrKa]aZBյ /5|өa.zs_᩷Jk"DϘMK.1T Vq~{|1vr Ё9JDz9Tl,r^w12*ءks]CZآks gę>gы栙9?;x$yT1xb_GWm7!UU0tn]f٨/z1y gOGrd Y %: ҝ;:i[1:mq78UΈ&nA12ANe_!@;qhŹ8mP>ϧ,c9ͬ͒v ޫP CR^<=_p=&?yucx'A_y-("W6FvE1 Xf A@@pC7H\ KK_=:J 0 }e=;F}sfV -Ez G+ԣ4 R?5 =U(Q}&Wz6)u Sx"4H"Q~G }6k{U vrp-TڍZdMbΎ#M! |+D㋹!S;$Fuq/s.?(aR~O|e~5Ჽ#]Q} {>HE!Bm k ;̒FR(4` h7y9!ۧ*clwNnScIſï'4;uG<ݧ-p0x<.Od<Й˟`ldOc)~Rq8A>s$dR D[? 6WL  cdA?9Z[5ba+oDoYK~"tyj1(~?8+Rge%6߼6Al_"F = 34 `7- (1cu|Kȁ}},brA؆ 'Ũp AgExY&S>|AF|Rp,ܧ~bUb !F;${S`%9\ x1c$Zp5uFxi _d;L|$x KB &""6$;d# HV7na*Es+T1 9]&EP(҄IܣIyI}/M,hT|N`4!S<!AE! vţ1X:=I.p! # ^e^q4CZpeD=I(QuOj1I&ac<g__ VP`8 xi",҄AϾa f\ ˴hUy͡+3 FsLk4b !sZ`}}#pW7ݗ^*yFa`7#̇@]6b;Sȑ!@2v8~9EШH~H%[hxmC>-MTH+gŁa4Q`ǍQIBLcpaL <߅$)ga-5-4/global/X/xregion_colormap.c0000644000175000017500000000260712662210454015221 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* This module contains the functions for displaying the access color map that appears on the right side of the display window */ #include "xregion.h" void DrawColorMap() { /* Actually fill in the colors */ int i, black = 1; unsigned width = 20, height = 350 / MAX_COL; int x, y, length,index; XColor color; for (i=0,y=0,x=0;i= 10. || maxval < .001) ? 1 : 0; for (i=0;i 1 ? *from - 1 : 0; corr = corr * (time - *pltime); if(corr < 0.0) { fprintf(stderr, "error: time =%f ltime =%f height =%d \n", time,*pltime,*from); } *pintegr += corr; *pltime = time; *from = *from + increment; index = *from; index = GA_MIN(index,MAX_COL-1); if(increment) { *pflag = 1; } /* calculate max value of integrals */ if(*pintegr > maxval) { maxval = *pintegr; } } else /* done with animation display integral */ { index = (int) (((*pintegr) / maxval) * MAX_COL); index = GA_MIN(index, MAX_COL - 1); if(!index && *pflag) { index = MAX_COL; /* sets the "accessed" color */ } } value = cmap[index]; for (k = 0, tempk = to; k < scale; k++, tempk += pict_width * scale) { for (l = 0, tempkl = tempk; l < scale; l++, tempkl++) { *tempkl = value; } } } /* end for j */ } /* end for i */ } void DisplayPixRegion(int ilo, int ihi, int jlo, int jhi) { int count, x, y, height, width; y = ilo * scale; x = jlo * scale; height = (ihi - ilo + 1) * scale; width = (jhi - jlo + 1) * scale; XPutImage(display, window, gc, image, x, y, x, y, width, height); XFlush(display); /* for(count = 0; count < rows; count++) { XDrawLine(display, XtWindow(canvas_widget), gc, 0, (overlay_row[count] - 1 - top_edge) * scale, pict_width * scale - 1, (overlay_row[count] - 1 - top_edge) * scale); } for(count = 0; count < cols; count++) { XDrawLine(display, XtWindow(canvas_widget), gc, (overlay_col[count] - 1 - left_edge) * scale, 0, (overlay_col[count] - 1 - left_edge) * scale, pict_height * scale - 1); } */ for(count = 0; count < rows; count++) { XDrawLine(display, XtWindow(canvas_widget), gc, 0, (overlay_row[count] - top_edge + .5) * scale, pict_width * scale - 1, (overlay_row[count] - top_edge + .5) * scale); } for(count = 0; count < cols; count++) { XDrawLine(display, XtWindow(canvas_widget), gc, (overlay_col[count] - left_edge + .5) * scale, 0, (overlay_col[count] - left_edge + .5) * scale, pict_height * scale - 1); } } ga-5-4/global/X/xregion_dialog.c0000644000175000017500000000420512662210454014640 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* This module contains functions for creating and destroying a simple dialog box. */ #include "xregion.h" void dialog_box(char *dlg_str) { Display *disp; disp = XtDisplay(overview_shell); /* Create top level shell widget */ dlg_top = XtVaAppCreateShell("xregion","XRegion", applicationShellWidgetClass,disp, NULL); /* Create form widget to hold everything else */ dlg_form = XtVaCreateManagedWidget("dialogform", formWidgetClass, dlg_top, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, NULL); dlg_label = XtVaCreateManagedWidget("dialoglabel", labelWidgetClass, dlg_form, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNlabel, dlg_str, XtNvertDistance, 5, XtNhorizDistance, 5, XtNborderWidth, 0, NULL); dlg_btn = XtVaCreateManagedWidget("dialogbutton", commandWidgetClass, dlg_form, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNlabel, "Dismiss", XtNfromVert, dlg_label, XtNvertDistance, 5, XtNhorizDistance, 30, NULL); XtAddCallback(dlg_btn, XtNcallback, dismiss_dialog, NULL); XtRealizeWidget(dlg_top); } /* JJU: void dismiss_dialog(Widget w, caddr_t data, XEvent *event) */ void dismiss_dialog(Widget w, XtPointer data, XtPointer event) { /* remove dialog box */ XtDestroyWidget(dlg_btn); XtDestroyWidget(dlg_label); XtDestroyWidget(dlg_form); XtDestroyWidget(dlg_top); } ga-5-4/global/X/xregion_main.c0000644000175000017500000000307012662210454014324 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #define FIRST_TIME #include "xregion.h" #if HAVE_MATH_H # include #endif int main(int argc, char **argv) { int i, argn; char filename[128]; /* initialize global variables */ first_time = True; /* Used to set scroll bar on first expose */ interval_max = 2000; interval = 500; /* 0.5s between exposures by default */ slowdown_max = 100.; slowdown_min = .1; slowdown = INITSLOW; /* slowdown factor for animation */ oldslowdown = INITSLOW; cur_time = 0; /* current time */ maxval = 0.; /* max value of integral, zero is default */ working = False; animation = True; cur_event = 0; /* First read the argument list */ for(i = 1, argn = 0; i < argc; i++) { if (argv[i][0] == '-') { break; } else { argn = i; } } argn ++; if (argn < 2 ) { printf("Usage:\n"); printf("xregion \n"); exit(1); } sscanf(argv[1],"%s", filename); ReadEventFile(filename); scale = 1; overview_scale = 499.0 / GA_MAX((grid_x), (grid_y)); overview_width = ceil( (grid_x) * (500.0 / GA_MAX((grid_x), (grid_y))) ); overview_height = ceil( (grid_y) * (500.0 / GA_MAX((grid_x), (grid_y))) ); printf("overview_scale %lf\n", overview_scale); printf("overview_width %d\n", overview_width); printf("overview_height %d\n", overview_height); /* Realize everything */ xregion_app = create_overview(argc, argv); XtRealizeWidget(overview_shell); /* Enter the event loop */ XtAppMainLoop(xregion_app); } ga-5-4/global/X/xregion_display.c0000644000175000017500000001037212662210454015050 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "xregion.h" void UpdateDisplay() { int n; char string[60]; XFontStruct *labelfont; char *fontname = "8x13bold"; Window W; /* Incorporate the display changes after the animation is over */ /* change the title */ strcpy(title, "Time Lost Due To Contention"); XtVaSetValues(title_widget,XtNlabel, title, NULL); /* delete all irrelevant widgets */ XtDestroyWidget(slowdown_widget); XtDestroyWidget(scroll_widget2); XtDestroyWidget(interval_widget); XtDestroyWidget(scroll_widget); XtDestroyWidget(start_stop_button); XtDestroyWidget(interval_label); XtDestroyWidget(slowdown_label); /* load the label font */ if ((labelfont = XLoadQueryFont(display,fontname)) == NULL) { Error("failed to load label font",-1); } /* Add label widget to display the max value of integrals */ sprintf(string, "max value = %8.5f", maxval); interval_widget = XtVaCreateManagedWidget("maxval", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNx, 25, XtNwidth, 300, XtNvertDistance, 5, XtNfromVert, title_widget, XtNlabel, string, XtNborderWidth, 0, NULL); XtVaSetValues(interval_widget, XtNfont, labelfont, NULL); /* Raise Quit widget partially obscurred by centered max value string */ W = XtWindow(quit_button); XRaiseWindow(display,W); /* Now, update the ColorMap legend */ XClearWindow(display, window_map); DrawColorMap(); PrintColorMapText(); XFlush(display); } /*****************************************************************/ /* JJU: void TimeOutCallback(caddr_t data) */ void TimeOutCallback(XtPointer data, XtIntervalId *xtintervalid) { #define AMP 1 int ilo, ihi, jlo, jhi, inc; int xlo, xhi, ylo, yhi; /* display coordinates */ int base, stime; /* Do work on time out here */ /* printf("time %lu, event=%d\n",cur_time,cur_event); fflush(stdout); printf("ev_times[cur_event]= "); */ while (slowdown * (ev_times[cur_event] / 1000) < (cur_time + interval) && cur_event < num_events) { base = cur_event*RECLEN; ilo = record[base+2]; ihi = record[base+3]; jlo = record[base+4]; jhi = record[base+5]; inc = AMP*record[base+7]; if (in_display_region(ilo, ihi, jlo, jhi)) { ilo = GA_MAX(ilo - top_edge, 0); ihi = GA_MIN(ihi - top_edge, pict_height - 1); jlo = GA_MAX(jlo - left_edge, 0); jhi = GA_MIN(jhi - left_edge, pict_width - 1); UpdatePixRegion(ilo, ihi, jlo, jhi, inc, (double) 1e-6 * ev_times[cur_event]); DisplayPixRegion(ilo, ihi, jlo, jhi); } cur_event++; } if(cur_event < num_events) { cur_time += interval; } else if(animation) { animation = False; printf("\nEnd of Event Animation ...\n"); UpdatePixRegion(0, pict_height - 1, 0, pict_width - 1, 0, 0.0); DisplayPixRegion( 0, pict_height - 1, 0, pict_width - 1); UpdateDisplay(); #ifdef DEBUG for(inc = 0; inc < pict_width * pict_height; inc++) { printf("%f\n", integr[inc]); } printf("Intialized or computed max integral value = %f\n",maxval); #endif /* DEBUG */ } /* Restore the call back */ timer = XtAppAddTimeOut(xregion_app, interval, TimeOutCallback, NULL); } /**/ /* JJU: void Exposed(Widget widget, caddr_t data, XEvent *event) */ void Exposed(Widget widget, XtPointer data, XEvent *event, Boolean *bln) { /* Now we are exposed so we can draw ... */ if (event->xexpose.count == 0) { if (first_time) { /* Cannot seem to set this before now ? */ ScrollProc(scroll_widget, NULL, 0); ScrollProc2(scroll_widget2, NULL, 0); first_time = False; } DrawColorMap(); PrintColorMapText(); DisplayPixRegion(0, pict_height - 1, 0, pict_width - 1); XFlush(display); } } ga-5-4/global/X/xregion_fileio.c0000644000175000017500000000371512662210454014655 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDLIB_H # include #endif #include "xregion.h" void ReadEventFile(char *filename) { FILE *fin; long int i, k, act_events = 0; char errmsg[128]; fin = fopen(filename,"r"); if (!fin) { Error("Input File Not Found",-2); } if (!fscanf(fin, "%d%d%d", &grid_y, &grid_x, &num_events)) { sprintf(errmsg, "Unable to read data from file %s", filename); Error(errmsg, -2); } if (!fscanf(fin, "%d%d", &rows, &cols)) { sprintf(errmsg, "Unable to read data from file %s", filename); Error(errmsg, -2); } if (!(overlay_row = (int*) malloc(rows * sizeof(int)))) { Error("couldn't allocate memory",-1); } if (!(overlay_col = (int*) malloc(cols * sizeof(int)))) { Error("couldn't allocate memory",-1); } for(i = 0; i < rows; i++) { if (!fscanf(fin, "%d", (overlay_row + i))) { sprintf(errmsg, "Unable to read data from file %s", filename); Error(errmsg, -2); } } for(i = 0; i < cols; i++) { if (!fscanf(fin, "%d", (overlay_col + i))) { sprintf(errmsg, "Unable to read data from file %s", filename); Error(errmsg, -2); } } if (!(record = (int*) malloc(RECLEN * num_events * sizeof(int)))) { Error("couldn't allocate memory",-1); } if (!(ev_times = (unsigned long int *) malloc(num_events * sizeof(unsigned long)))) { Error("couldn't allocate memory",-2); } for(i = 0; i < num_events; i++) { for(k = 0; k < RECLEN; k++) { fscanf(fin, "%d", (i * RECLEN + k) + record); } if(fscanf(fin, "%lu", ev_times + i)) { act_events++; } /* Adjust from Fortran to C base addressing */ for (k = 2; k <= 5; k++) { (*((i * RECLEN + k) + record))--; } if (feof(fin)) { break; } } num_events = act_events; printf("File %s has been read. %d events are displayed\n",filename,num_events); fclose(fin); } ga-5-4/global/X/xregion.config0000644000175000017500000000115412662210454014344 0ustar mbamba# configuration file for xregion # # select colors for the following: # foreground - foreground color of windows # background - background color of windows # selection - color of area selected for viewing # rubberband - color of selection rubberband # grid - color of grid lines # canvas - background color of display area # # colors are X11 named colors (see an X reference for list) # # Only colors you wish to change need to be in the # configuration file. Others will be set to default colors. # foreground navy background light gray selection Green rubberband Green grid red canvas black ga-5-4/global/X/xregion_util.c0000644000175000017500000000603412662210454014360 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "xregion.h" void Error(char *message, int err_num) { (void) fflush(stdout); (void) fprintf(stderr,"\n\nError was called.\n"); (void) fprintf(stderr,message); (void) fprintf(stderr," %d (%#x).\n",err_num,err_num); exit(1); } int in_display_region(int ilo, int ihi, int jlo, int jhi) { return( !((ilo > bottom_edge) || (ihi < top_edge) || (jlo > right_edge) || (jhi < left_edge))); } void set_config() { int found = True; Pixel pix_val; Display *disp; XColor xcolor; XColor spare; Colormap defcmap; char *bufptr, name[40], buf[80]; char path[128]; FILE *fd; disp = XtDisplay(overview_shell); defcmap = DefaultColormapOfScreen(XtScreen(overview_shell)); if (XAllocNamedColor(disp, defcmap, "black", &xcolor, &spare) != 0) { DEFAULT_FG = xcolor.pixel; } else { fprintf(stderr, "unable to allocate color 'black'\n"); } if (XAllocNamedColor(disp, defcmap, "whitesmoke", &xcolor, &spare) != 0) { DEFAULT_BG = xcolor.pixel; } else { fprintf(stderr, "unable to allocate color 'whitesmoke'\n"); } if (XAllocNamedColor(disp, defcmap, "green", &xcolor, &spare) != 0) { SELECT_COLOR = xcolor.pixel; RBAND_COLOR = xcolor.pixel; } else { fprintf(stderr, "unable to allocate color 'green'\n"); } if (XAllocNamedColor(disp, defcmap, "black", &xcolor, &spare) != 0) { CANVAS_COLOR = xcolor.pixel; } else { fprintf(stderr, "unable to allocate color 'black'\n"); } if (XAllocNamedColor(disp, defcmap, "red", &xcolor, &spare) != 0) { GRID_COLOR = xcolor.pixel; } else { fprintf(stderr, "unable to allocate color 'red'\n"); } sprintf(path, "./xregion.config"); if ((fd = fopen(path,"r")) == NULL) { fprintf(stderr,"config file '%s' not found, using default colors\n", path); found = False; } while (found && fgets(buf, sizeof(buf), fd) != NULL) { if (buf[0] == '#') continue; /* a comment */ bufptr = strtok(buf, " "); if (bufptr) { strcpy(name, bufptr); } bufptr = strtok(NULL, "\n"); if (bufptr) { if (XAllocNamedColor(disp, defcmap, bufptr, &xcolor, &spare) == 0) { strcat(name, " Not Allocated"); } else { pix_val = xcolor.pixel; } } if (strstr(name, "Not")) { fprintf(stderr, "%s: check color name '%s'\n", name, bufptr); } else if (strstr(name, "foreground")) { DEFAULT_FG = pix_val; } else if (strstr(name, "background")) { DEFAULT_BG = pix_val; } else if (strstr(name, "selection")) { SELECT_COLOR = pix_val; } else if (strstr(name, "rubberband")) { RBAND_COLOR = pix_val; } else if (strstr(name, "grid")) { GRID_COLOR = pix_val; } else if (strstr(name, "canvas")) { CANVAS_COLOR = pix_val; } else { fprintf(stderr, "Unknown entry: '%s'\n", name); } } fclose(fd); } ga-5-4/global/X/xregion_xcmap.c0000644000175000017500000000300212662210454014503 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "xregion.h" void Setcmap() /* Make the color map ... */ { int i; XColor color, spare; double cscale = 1.0 / ((double) (MAX_COL-1)); double hue, saturation, value; double redvar,red=0xba/255.0, green, blue=0xd2/255.0; redvar = red; colormap = DefaultColormap(display, screen); /* Linear interpolation on green */ for (i=0; i=(MAX_COL-5)) { redvar = .4*red + .6*red*(MAX_COL-i)/5.; } color.red = (short) (redvar * 65535.0); color.blue = (short) (blue * 65535.0); green = cscale * (MAX_COL - i); color.green = (short) (green * 65535.0); } if (XAllocColor(display, colormap, &color) == 0) { Error("couldn't assign color",i); } cmap[i] = color.pixel; /* now set the "accessed" color for regions that were accessed */ color.red = 65535; color.green = 65535; color.blue = 65535 * (220.0/255.0); if (XAllocColor(display, colormap, &color) == 0) { Error("couldn't assign accessed color",99); } cmap[MAX_COL] = color.pixel; /* (void) printf("Colour %d red=%x, green=%x, blue=%x, pixel=%x\n", i, color.red, color.green, color.blue, color.pixel); */ } } ga-5-4/global/X/xregion_overview.c0000644000175000017500000003122412662210454015250 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #include "xregion.h" XtAppContext create_overview(int argc, char **argv) { XtAppContext app; overview_shell = XtVaAppInitialize(&app,"XRegion", NULL, 0, &argc, argv, NULL, XtNtitle, "select region to view", NULL); set_config(); overview_widget = XtVaCreateManagedWidget("selectCanvas", formWidgetClass, overview_shell, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, NULL); overview_title = XtVaCreateManagedWidget("selectTitle",labelWidgetClass, overview_widget, XtNlabel, "x, y:", XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNx, 10, XtNy, 10, XtNwidth, 350, XtNvertDistance, 10, XtNhorizDistance, 10, XtNborderWidth, 0, NULL); /* Create the Start/Stop command button */ view_button = XtVaCreateManagedWidget("viewbutton", commandWidgetClass, overview_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNhorizDistance, 10, XtNvertDistance, 10, XtNfromHoriz, overview_title, XtNlabel, "View Selection", XtNsensitive, False, XtNshapeStyle, XmuShapeOval, NULL); XtAddCallback(view_button, XtNcallback, start_view, NULL); select_widget = XtVaCreateManagedWidget("areaSelect", formWidgetClass, overview_widget, XtNvertDistance, 50, XtNhorizDistance, 5, XtNheight, overview_height, XtNwidth, overview_width, XtNborderWidth, 0, NULL); XtAddEventHandler(select_widget, PointerMotionMask, False, running_overview, NULL); XtAddEventHandler(select_widget, ButtonPressMask, False, draw_select_box, NULL); XtAddEventHandler(select_widget, ButtonReleaseMask, False, draw_select_box, NULL); XtAddEventHandler(select_widget, Button1MotionMask, False, draw_select_box, NULL); XtAddEventHandler(select_widget, ExposureMask, False, draw_select_box, NULL); return(app); } /* JJU: void start_view(Widget widget, caddr_t data, XEvent *event); */ void start_view(Widget widget, XtPointer data, XtPointer event) { create_main_window(); /* Realize everything */ XtRealizeWidget(top_level_widget); setup_drawing(); XtRemoveEventHandler(select_widget, ButtonPressMask, False, draw_select_box, NULL); XtRemoveEventHandler(select_widget, ButtonReleaseMask, False, draw_select_box, NULL); XtRemoveEventHandler(select_widget, Button1MotionMask, False, draw_select_box, NULL); } /* JJU: void running_overview(Widget widget, caddr_t data, XEvent *event) */ void running_overview(Widget widget, XtPointer data, XEvent *event, Boolean *bln) { char loc_str[40]; int x, y; int scale_x, scale_y; x = event->xmotion.x; y = event->xmotion.y; if (x < 0) x = 0; if (x > overview_width - 1) x = overview_width - 1; if (y < 0) y = 0; if (y > overview_height - 1) y = overview_height - 1; /* scale_x = (int)((x / overview_scale) + 1.5); scale_y = (int)((y / overview_scale) + 1.5); */ scale_x = (int)((x / overview_scale) + .5); scale_y = (int)((y / overview_scale) + .5); if (scale_x > grid_x) scale_x = grid_x; if (scale_y > grid_y) scale_y = grid_y; sprintf(loc_str, "x, y: %d, %d", scale_x, scale_y); XtVaSetValues(overview_title, XtNlabel, loc_str, NULL); } /* JJU: void draw_select_box(Widget widget, caddr_t data, XEvent *event) */ void draw_select_box(Widget widget, XtPointer data, XEvent *event, Boolean *bln) { static int x1, x2, y1, y2; static int first = True; static GC gc_rband, gc_select; static Display *disp; static Pixmap pixmap; /* JJU: static Window *win; */ static Window win; static int screen; static int button_state = 0; static int another_state = False; char err_str[80]; char loc_str[40]; int i, ul_x, ul_y, lr_x, lr_y; if (first) { first = False; x1 = x2 = y1 = y2 = -1; disp = XtDisplay(select_widget); win = XtWindow(select_widget); screen = DefaultScreen(disp); gc_rband = XCreateGC(disp, win, NULL, NULL); gc_select = XCreateGC(disp, win, NULL, NULL); pixmap = XCreatePixmap(disp, RootWindow(disp, screen), overview_width, overview_height, DefaultDepth(disp, screen)); XSetForeground(disp, gc_select, CANVAS_COLOR); XFillRectangle(disp, pixmap, gc_select, 0, 0, overview_width, overview_height); XSetForeground(disp, gc_rband, RBAND_COLOR); XSetForeground(disp, gc_select, SELECT_COLOR); XSetBackground(disp, gc_rband, CANVAS_COLOR); XSetFunction(disp,gc_rband, GXxor); /* XSetLineAttributes(disp, gc_rband, 3, LineSolid, CapRound, JoinRound); XSetLineAttributes(disp, gc_select, 3, LineSolid, CapRound, JoinRound); */ } switch (event->type) { case Expose: if (event->xexpose.count == 0) { XSetForeground(disp, gc_select, GRID_COLOR); for(i = 0; i < rows; i++) { int _x1=0,_x2=overview_width - 1; int _y1,_y2; _y1=_y2=overlay_row[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, _x1, _y1, _x2, _y2); } for(i = 0; i < cols; i++) { int _y1=0,_y2=overview_height - 1; int _x1,_x2; _x1 =_x2 =overlay_col[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, _x1, _y1, _x2, _y2); } XSetForeground(disp, gc_select, SELECT_COLOR); XCopyArea(disp, pixmap, win, gc_select, 0, 0, overview_width, overview_height, 0, 0); } break; case ButtonPress: if (event->xbutton.button == 1) { x1 = x2 = event->xbutton.x; y1 = y2 = event->xbutton.y; button_state = 1; another_state = True; } break; case ButtonRelease: if (event->xbutton.button == 1 && button_state == 1) { /* erase old rubberband box */ XDrawRectangle(disp, win, gc_rband, x1, y1, x2 - x1, y2 - y1); /* get latest corner */ x2 = event->xbutton.x; y2 = event->xbutton.y; if (x2 < 0) x2 = 0; if (x2 > overview_width - 1) x2 = overview_width - 1; if (y2 < 0) y2 = 0; if (y2 > overview_height - 1) y2 = overview_height - 1; if ((abs(x2 - x1) > 4) || (abs(y2 - y1) > 4)) { XtVaSetValues(overview_title, XtNlabel, loc_str, NULL); /* draw final selection box */ XDrawRectangle(disp, win, gc_select, x1, y1, x2 - x1, y2 - y1); XDrawRectangle(disp, pixmap, gc_select, x1, y1, x2 - x1, y2 - y1); XFillRectangle(disp, pixmap, gc_select, x1, y1, x2 - x1, y2 - y1); XSetForeground(disp, gc_select, GRID_COLOR); for(i = 0; i < rows; i++) { int _x1=0,_x2=overview_width - 1; int _y1,_y2; _y1=_y2=overlay_row[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, _x1, _y1, _x2, _y2); } for(i = 0; i < cols; i++) { int _y1=0,_y2=overview_height - 1; int _x1,_x2; _x1 =_x2 =overlay_col[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, _x1, _y1, _x2, _y2); } /* for(i = 0; i < rows; i++) { XDrawLine(disp, pixmap, gc_select, 0, (overlay_row[i] - 1) * overview_scale, overview_width - 1, (overlay_row[i] - 1) * overview_scale); } for(i = 0; i < cols; i++) { XDrawLine(disp, pixmap, gc_select, (overlay_col[i] - 1) * overview_scale, 0, (overlay_col[i] - 1) * overview_scale, overview_height - 1); } */ XSetForeground(disp, gc_select, SELECT_COLOR); XCopyArea(disp, pixmap, win, gc_select, 0, 0, overview_width, overview_height, 0, 0); left_edge = (int)(GA_MIN(x1, x2) / overview_scale + .5); right_edge = (int)(GA_MAX(x1, x2) / overview_scale + .5); top_edge = (int)(GA_MIN(y1, y2) / overview_scale + .5); bottom_edge = (int)(GA_MAX(y1, y2) / overview_scale + .5); if (left_edge < 0) left_edge = 0; if (right_edge > grid_x - 1) right_edge = grid_x - 1; if (top_edge < 0) top_edge = 0; if (bottom_edge > grid_y - 1) bottom_edge = grid_y - 1; pict_width = right_edge - left_edge + 1; pict_height = bottom_edge - top_edge + 1; scale = GA_MIN( ceil((500.0 / pict_width)), ceil((500.0 / pict_height))); if ((pict_width < 501) || (pict_height < 501)) { fprintf(stderr, "pict_width, pict_height, scale: %d, %d, %d\n", pict_width, pict_height, scale); fprintf(stderr, "Left, right, top, bottom: %d, %d, %d, %d\n", left_edge, right_edge, top_edge, bottom_edge); XtVaSetValues(view_button, XtNsensitive, True, NULL); } else { /* select to large a region to view - Error */ XtVaSetValues(view_button, XtNsensitive, False, NULL); sprintf(err_str, "Selection Error: select area 500x500 or smaller"); dialog_box(err_str); XSetForeground(disp, gc_select, CANVAS_COLOR); XDrawRectangle(disp, pixmap, gc_select, x1, y1, x2 - x1, y2 - y1); XSetForeground(disp, gc_select, SELECT_COLOR); button_state = 0; break; } } } break; case MotionNotify: if (button_state == 1) { if (another_state) { XSetForeground(disp, gc_select, CANVAS_COLOR); XFillRectangle(disp, pixmap, gc_select, 0, 0,overview_width, overview_height ); XSetForeground(disp, gc_select, GRID_COLOR); /* for(i = 0; i < rows; i++) { int x1=0,x2=overview_width - 1; int y1=y2=overlay_row[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, x1, y1, x2, y2); } for(i = 0; i < cols; i++) { int y1=0,y2=overview_height - 1; int x1=x2=overlay_col[i] * overview_scale; XDrawLine(disp, pixmap, gc_select, x1, y1, x2, y2); } */ for(i = 0; i < rows; i++) { XDrawLine(disp, pixmap, gc_select, 0, (overlay_row[i] - 0) * overview_scale, overview_width - 1, (overlay_row[i] - 0) * overview_scale); } for(i = 0; i < cols; i++) { XDrawLine(disp, pixmap, gc_select, (overlay_col[i] - 0) * overview_scale, 0, (overlay_col[i] - 0) * overview_scale, overview_height - 1); } XSetForeground(disp, gc_select, SELECT_COLOR); XCopyArea(disp, pixmap, win, gc_select, 0, 0, overview_width, overview_height, 0, 0); XFlush(disp); another_state = False; } /* erase old rubberband box */ XDrawRectangle(disp, win, gc_rband, x1, y1, x2 - x1, y2 - y1); /* get latest corner */ x2 = event->xbutton.x; y2 = event->xbutton.y; if (x2 < 0) x2 = 0; if (x2 > overview_width - 1) x2 = overview_width - 1; if (y2 < 0) y2 = 0; if (y2 > overview_height - 1) y2 = overview_height - 1; /* draw new rubberband box */ XDrawRectangle(disp, win, gc_rband, x1, y1, x2 - x1, y2 - y1); } break; } } ga-5-4/global/X/README0000644000175000017500000000233612662210454012365 0ustar mbambaxregion -- GA visualization tool ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ xregion displays transitional access patterns for a two-dimensional array. Both sampling time for the animation and slowdown factor can be specified to animate long- and short- lasting events. At the end of animation, a cumulative time lost due to contention in access to individual array elements is displayed. The color coding (from white to navy) reflect access contention level for the animation, and the access contention integral for the final display. Usage ===== The program was tested on the SUN and SGI platforms only ! It is a 16-bit display version. :: xregion [Xtoolkit options] where: filename - name of the input file (data processed by 'adjust' program) The file must contain: .... .... num_events - the number of events to be read and processed from filename (might be specified larger than teh actual number records) Example ======= xregion adjust.ed ga-5-4/global/X/xregion_view.c0000644000175000017500000003237012662210454014357 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDLIB_H # include #endif #include "xregion.h" void create_main_window() { Display *disp; int screen; disp = XtDisplay(overview_shell); screen = DefaultScreen(disp); /* Create top level shell widget */ top_level_widget = XtVaAppCreateShell("xregion","XRegion", applicationShellWidgetClass,disp, NULL); /* Create form widget to hold everything else */ box_widget = XtVaCreateManagedWidget("box", formWidgetClass, top_level_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, NULL); /* Create the label to hold the title */ (void) strcpy(title, "Array Access Display"); title_widget = XtVaCreateManagedWidget("title", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNx, 10, XtNy, 5, XtNwidth, 300, XtNlabel, title, XtNborderWidth, 0, NULL); coord_widget = XtVaCreateManagedWidget("coords", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNy, 5, XtNhorizDistance, 10, XtNfromHoriz, title_widget, XtNjustify, XtJustifyLeft, XtNlabel, "Coordinates x, y: ", XtNborderWidth, 0, NULL); /* Create the Quit command button */ quit_button = XtVaCreateManagedWidget("quit", commandWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNx, 10, XtNvertDistance, 15, XtNfromVert, title_widget, XtNlabel, "Quit", XtNshapeStyle, XmuShapeOval, NULL); XtAddCallback(quit_button, XtNcallback, Quit, NULL); /* Create the Start/Stop command button */ start_stop_button = XtVaCreateManagedWidget("start/stop", commandWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 15, XtNfromVert, title_widget, XtNhorizDistance, 10, XtNfromHoriz, quit_button, XtNlabel, "Start", XtNshapeStyle, XmuShapeOval, NULL); XtAddCallback(start_stop_button, XtNcallback, StartStop, NULL); /* Create the scroll bar for the interval */ interval_label = XtVaCreateManagedWidget("interval_label", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, title_widget, XtNhorizDistance, 20, XtNfromHoriz, start_stop_button, XtNlabel, "Time Interval", XtNborderWidth, 0, NULL); scroll_widget = XtVaCreateManagedWidget("scroll", scrollbarWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, interval_label, XtNhorizDistance, 20, XtNfromHoriz, start_stop_button, XtNorientation, XtorientHorizontal, XtNlength, 100, XtNthickness, 15, NULL); XtAddCallback(scroll_widget, XtNscrollProc, ScrollProc, NULL); XtAddCallback(scroll_widget, XtNjumpProc, JumpProc, NULL); /* Create the label widget which displays the interval value associated with the scrollbar. */ (void) sprintf(interval_string, "%4d ms", interval); interval_widget = XtVaCreateManagedWidget("interval", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, interval_label, XtNhorizDistance, 5, XtNfromHoriz, scroll_widget, XtNjustify, XtJustifyRight, XtNlabel, interval_string, XtNborderWidth, 0, NULL); /* Create the scroll bar for the slowdown */ slowdown_label = XtVaCreateManagedWidget("slowdown_label", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, title_widget, XtNhorizDistance, 25, XtNfromHoriz, interval_widget, XtNlabel, "Slowdown Factor", XtNborderWidth, 0, NULL); scroll_widget2 = XtVaCreateManagedWidget("scroll2", scrollbarWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, slowdown_label, XtNhorizDistance, 25, XtNfromHoriz, interval_widget, XtNorientation, XtorientHorizontal, XtNlength, 100, XtNthickness, 15, NULL); XtAddCallback(scroll_widget2, XtNscrollProc, ScrollProc2, NULL); XtAddCallback(scroll_widget2, XtNjumpProc, JumpProc2, NULL); /* Create the label widget which displays the slowdown value associated with the scrollbar 2. */ (void) sprintf(slowdown_string, "%5d times", (long)slowdown); slowdown_widget = XtVaCreateManagedWidget("slowdown", labelWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNvertDistance, 5, XtNfromVert, slowdown_label, XtNhorizDistance, 5, XtNfromHoriz, scroll_widget2, XtNjustify, XtJustifyRight, XtNlabel, slowdown_string, XtNborderWidth, 0, NULL); /* Now add the actual canvas ... */ canvas_widget = XtVaCreateManagedWidget("canvas", formWidgetClass, box_widget, XtNheight, pict_height * scale, XtNwidth, pict_width * scale, XtNvertDistance, 20, XtNfromVert, quit_button, XtNbackground, CANVAS_COLOR, XtNborderWidth, 0, NULL); /* Add callback for exposure */ XtAddEventHandler(canvas_widget,ExposureMask,False,Exposed,NULL); XtAddEventHandler(canvas_widget,PointerMotionMask,False,running_coords,NULL); /* Now add the color scale ... */ map_widget = XtVaCreateManagedWidget("colorMap", compositeWidgetClass, box_widget, XtNbackground, DEFAULT_BG, XtNforeground, DEFAULT_FG, XtNheight, 350, XtNwidth, 80, XtNvertDistance, 20, XtNfromVert, quit_button, XtNhorizDistance, 20, XtNfromHoriz, canvas_widget, XtNborderWidth, 0, NULL); } /* JJU: void running_coords(Widget widget, caddr_t data, XEvent *event) */ void running_coords(Widget widget, XtPointer data, XEvent *event, Boolean *bln) { char loc_str[40]; int x, y; x = event->xmotion.x; y = event->xmotion.y; /* sprintf(loc_str, "Coordinates x, y: %d, %d", (int) (x / scale) + left_edge + 1, (int) (y / scale) + top_edge + 1); */ sprintf(loc_str, "Coordinates x, y: %d, %d", (int) (x / scale) + left_edge, (int) (y / scale) + top_edge); XtVaSetValues(coord_widget, XtNlabel, loc_str, NULL); } void setup_drawing() { int i, x, y; XGCValues gcv; /* Set up the drawing environment */ display = XtDisplay(canvas_widget); window = XtWindow(canvas_widget); window_map = XtWindow(map_widget); screen = DefaultScreen(display); visual = DefaultVisual(display, screen); depth = DisplayPlanes(display, screen); (void) printf("depth = %d\n",depth); gc = XCreateGC(display, window, 0, (XGCValues *) NULL); XSetForeground(display, gc, GRID_COLOR); gcv.font = XLoadFont(display, "8x13"); if(!gcv.font) { printf("error font not loaded\n"); } gc_map = XCreateGC(display, window_map, GCFont, &gcv); Setcmap(); /* Make image to match the size of our canvas */ x = pict_width * scale; y = pict_height * scale; pict = (u_char *) malloc((x + pict_width) * y); image = XCreateImage(display, visual, depth, ZPixmap, 0, pict, x, y, 8, x); /* Make the byte array which will hold the access data */ if (!(grid = (u_char *) malloc((unsigned) (pict_width * pict_height)))) { Error("failed to allocate grid", -1); } bzero((char *) grid, pict_width * pict_height); /* Make the byte array which will hold the access flag */ if (!(flag = (u_char *) malloc((unsigned) (pict_width * pict_height)))) { Error("failed to allocate flag", -1); } bzero((char *) flag, pict_width * pict_height); /* Make the array which will hold the integral */ if (!(integr = (double *) malloc(sizeof(double) * (pict_width * pict_height)))) { Error("failed to allocate integr", -1); } /* Make the array which will hold the last access time */ if (!(ltime = (double *) malloc(sizeof(double) * (pict_width * pict_height)))) { Error("failed to allocate ltime", -1); } for(i = 0; i < pict_width * pict_height; i++, *ltime = 0.0, *integr = 0.0); /* clear the array display */ UpdatePixRegion(0, pict_height - 1, 0, pict_width - 1, 0, 0.0); DisplayPixRegion(0, pict_height - 1, 0, pict_width - 1); } /**/ /* JJU: void Quit(Widget widget, caddr_t data, XEvent *event) */ void Quit(Widget widget, XtPointer data, XtPointer event) { exit(0); } /**/ /* JJU: void StartStop(Widget widget, caddr_t data, XEvent *event) */ void StartStop(Widget widget, XtPointer data, XtPointer event) { /* Toggle propagation of display */ if (working) { XtRemoveTimeOut(timer); working = False; XtSetArg(arg[0], XtNlabel, "Start"); /* Reset button label */ XtSetValues(start_stop_button,arg,1); XFlush(display); } else { XtSetArg(arg[0], XtNlabel, "Stop"); /* Reset button label */ XtSetValues(start_stop_button,arg,1); timer = XtAppAddTimeOut(xregion_app, interval, TimeOutCallback, NULL); working = True; XFlush(display); } } ga-5-4/global/testing/0000755000175000017500000000000012662210461012745 5ustar mbambaga-5-4/global/testing/ga-mpi.c0000644000175000017500000001220012662210460014255 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /**************************************************************************** * program: ga-mpi.c * date: Tue Oct 3 12:31:59 PDT 1995 * author: Jarek Nieplocha * purpose: This program demonstrates interface between GA and MPI. * For a given square matrix, it creates a vector that contains maximum * elements for each matrix row. MPI group communication is used. * * notes: The program can run in two modes: * 1. Using TCGMSG calls available through the TCGMSG-MPI library * and MPI. In this mode initialization must be done with * the TCGMSG PBEGIN call. * 2. Using MPI calls only -- preprocessor symbol MPI must be defined. * ****************************************************************************/ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include #include "ga.h" #include "globalp.h" #include "macdecls.h" #include "mp3.h" #define N 100 /* dimension of matrices */ void do_work() { int ZERO=0; /* useful constants */ int g_a, g_b; int n=N, ndim=2,type=MT_F_DBL,dims[2]={N,N},coord[2]; int me=GA_Nodeid(), nproc=GA_Nnodes(); int row, i, j; int lo[2], hi[2]; /* Note: on all current platforms DoublePrecision = double */ DoublePrecision buf[N], *max_row=NULL; MPI_Comm WORLD_COMM; MPI_Comm ROW_COMM; int ilo,ihi, jlo,jhi, ld, prow, pcol; int root=0, grp_me=-1; WORLD_COMM = GA_MPI_Comm_pgroup_default(); if(me==0)printf("Creating matrix A\n"); dims[0]=n; dims[1]=n; g_a = NGA_Create(type, ndim, dims, "A", NULL); if(!g_a) GA_Error("create failed: A",n); if(me==0)printf("OK\n"); if(me==0)printf("Creating matrix B\n"); dims[0]=n; g_b = NGA_Create(type, 1, dims, "B", NULL); if(!g_b) GA_Error("create failed: B",n); if(me==0)printf("OK\n"); GA_Zero(g_a); /* zero the matrix */ if(me==0)printf("Initializing matrix A\n"); /* fill in matrix A with values: A(i,j) = (i+j) */ for(row=me; row0){ max_row=(DoublePrecision*)malloc(sizeof(DoublePrecision)*(ihi-ilo+1)); if (!max_row) GA_Error("malloc 3 failed",(ihi-ilo+1)); for (i=0; i<(ihi-ilo+1); i++) { max_row[i] = 0.0; } } NGA_Proc_topology(g_a, me, coord); /* block coordinates */ prow = coord[0]; pcol = coord[1]; if(me==0)printf("Splitting comm according to distribution of A\n"); /* GA on SP1 requires synchronization before & after message-passing !!*/ GA_Sync(); if(me==0)printf("Computing max row elements\n"); /* create communicator for processes that 'own' A[:,jlo:jhi] */ MPI_Barrier(WORLD_COMM); if(pcol < 0 || prow <0) MPI_Comm_split(WORLD_COMM,MPI_UNDEFINED,MPI_UNDEFINED, &ROW_COMM); else MPI_Comm_split(WORLD_COMM, (int)pcol, (int)prow, &ROW_COMM); if(ROW_COMM != MPI_COMM_NULL){ double *ptr; MPI_Comm_rank(ROW_COMM, &grp_me); /* each process computes max elements in the block it 'owns' */ lo[0]=ilo; hi[0]=ihi; lo[1]=jlo; hi[1]=jhi; NGA_Access(g_a, lo, hi, &ptr, &ld); for(i=0; i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #include "../src/globalp.h" #include "ga-papi.h" #define BLOCK_CYCLIC 0 #if BLOCK_CYCLIC #define USE_SCALAPACK 1 #endif #ifndef GA_HALF_MAX_INT #define GA_HALF_MAX_INT ((((int)1) << ((int)(8*sizeof(int))-2)) - 1) #endif #ifndef GA_INFINITY_I #define GA_INFINITY_I (GA_HALF_MAX_INT + GA_HALF_MAX_INT + 1) /* Original value below. Seemed too small arbitrarily. #define GA_INFINITY_I 100000 */ #endif #ifndef GA_NEGATIVE_INFINITY_I #define GA_NEGATIVE_INFINITY_I (- GA_INFINITY_I) /* Original value below. Seemed too small arbitrarily. #define GA_NEGATIVE_INFINITY_I -100000 */ #endif #ifndef GA_HALF_MAX_LONG #define GA_HALF_MAX_LONG ((((long)1) << ((int)(8*sizeof(long))-2)) - 1) #endif #ifndef GA_INFINITY_L #define GA_INFINITY_L (GA_HALF_MAX_LONG + GA_HALF_MAX_LONG + 1) /* Original value was #define GA_INFINITY_L 100000 */ #endif #ifndef GA_NEGATIVE_INFINITY_L #define GA_NEGATIVE_INFINITY_L (- GA_INFINITY_L) #endif /* Original value was: #define GA_NEGATIVE_INFINITY_L -100000 */ /* Modified by Doug Baxter 01/24/04 to distinguish between Double inifinity and float infinity. #ifndef GA_INFINITY #define GA_INFINITY 1.0e20 #endif #ifndef GA_NEGATIVE_INFINITY #define GA_NEGATIVE_INFINITY -1.0e20 #endif */ #ifndef GA_INFINITY_F #define GA_INFINITY_F 1.0e37 #endif /* Original value below. #define GA_INFINITY_F 1.0e20 */ #ifndef GA_NEGATIVE_INFINITY_F #define GA_NEGATIVE_INFINITY_F -1.0e37 #endif /* Original value below. #define GA_NEGATIVE_INFINITY_F -1.0e20 */ #ifndef GA_INFINITY_D #define GA_INFINITY_D 1.0e307 #endif /* Original value below. #define GA_INFINITY_D 1.0e20 */ #ifndef GA_NEGATIVE_INFINITY_D #define GA_NEGATIVE_INFINITY_D -1.0e307 #endif #define THRESH 1e-5 #define MISMATCHED(x,y) GA_ABS((x)-(y))>=THRESH #define N 100 #define BLOCK_SIZE 20 #define OP_ELEM_MULT 0 #define OP_ELEM_DIV 1 #define OP_ELEM_MAX 2 #define OP_ELEM_MIN 3 #define OP_ABS 4 #define OP_ADD_CONST 5 #define OP_RECIP 6 #define OP_STEP_MAX 7 #define OP_STEP_BOUND_INFO 8 #define MY_TYPE 2002 Integer _ga_lo[MAXDIM], _ga_hi[MAXDIM], _ga_work[MAXDIM]; # define COPYINDEX_C2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i]+1;} void nga_vfill_patch(Integer *g_a, Integer *lo, Integer *hi); void nga_pnfill_patch(Integer *g_a, Integer *lo, Integer *hi); void NGA_Vfill_patch(int g_a, int lo[], int hi[]) { Integer a=(Integer)g_a; Integer ndim = pnga_ndim(a); COPYINDEX_C2F(lo,_ga_lo, ndim); COPYINDEX_C2F(hi,_ga_hi, ndim); nga_vfill_patch(&a, _ga_lo, _ga_hi); } void NGA_Pnfill_patch(int g_a, int lo[], int hi[]) { Integer a=(Integer)g_a; Integer ndim = pnga_ndim(a); COPYINDEX_C2F(lo,_ga_lo, ndim); COPYINDEX_C2F(hi,_ga_hi, ndim); nga_pnfill_patch(&a, _ga_lo, _ga_hi); } int ifun (int k) { int result; result = -k - 1; result = -2; return result; } int ifun2 (int k) { int result; result = k + 1; result = -3; return result; } void fill_func (int nelem, int type, void *buf) { int i; switch (type) { case C_FLOAT: for (i = 0; i < nelem; i++) ((float *) buf)[i] = (float) ifun (i); break; case C_LONG: for (i = 0; i < nelem; i++) ((long *) buf)[i] = (long) ifun (i); break; case C_DBL: for (i = 0; i < nelem; i++) ((double *) buf)[i] = (double) ifun (i); break; case C_DCPL: for (i = 0; i < 2 * nelem; i++) ((double *) buf)[i] = (double) ifun (i); break; case C_SCPL: for (i = 0; i < 2 * nelem; i++) ((float *) buf)[i] = (float) ifun (i); break; case C_INT: for (i = 0; i < nelem; i++) ((int *) buf)[i] = ifun (i); break; default: GA_Error (" wrong data type ", type); } } void fill_func2 (int nelem, int type, void *buf) { /* int i,size=MA_sizeof(MT_CHAR,type,1);*/ int i; switch (type) { case C_FLOAT: for (i = 0; i < nelem; i++) ((float *) buf)[i] = (float) ifun2 (i); break; case C_LONG: for (i = 0; i < nelem; i++) ((long *) buf)[i] = (long) ifun2 (i); break; case C_DBL: for (i = 0; i < nelem; i++) ((double *) buf)[i] = (double) ifun2 (i); break; case C_DCPL: for (i = 0; i < 2 * nelem; i++) ((double *) buf)[i] = (double) ifun2 (i); break; case C_SCPL: for (i = 0; i < 2 * nelem; i++) ((float *) buf)[i] = (float) ifun2 (i); break; case C_INT: for (i = 0; i < nelem; i++) ((int *) buf)[i] = ifun2 (i); break; default: GA_Error (" wrong data type ", type); } } void fill_func3 (int nelem, int type, void *buf) /*taking the absolute of the ifun() */ { /*int i,size=MA_sizeof(MT_CHAR,type,1);*/ int i; switch (type) { case C_FLOAT: for (i = 0; i < nelem; i++) ((float *) buf)[i] = (float) GA_ABS (ifun (i)); break; case C_LONG: for (i = 0; i < nelem; i++) ((long *) buf)[i] = (long) GA_ABS (ifun (i)); break; case C_DBL: for (i = 0; i < nelem; i++) ((double *) buf)[i] = (double) GA_ABS (ifun (i)); break; case C_DCPL: for (i = 0; i < 2 * nelem - 1; i = i + 2) { ((double *) buf)[i] = sqrt ((double) (ifun (i) * ifun (i) + ifun (i + 1) * ifun (i + 1))); ((double *) buf)[i + 1] = 0.0; } break; case C_SCPL: for (i = 0; i < 2 * nelem - 1; i = i + 2) { ((float *) buf)[i] = sqrt ((float) (ifun (i) * ifun (i) + ifun (i + 1) * ifun (i + 1))); ((float *) buf)[i + 1] = 0.0; } break; case C_INT: for (i = 0; i < nelem; i++) ((int *) buf)[i] = GA_ABS (ifun (i)); break; default: GA_Error (" wrong data type ", type); } } int test_fun (int type, int dim, int OP) { DoubleComplex *dcptr; int ld[7],locp[7],hicp[7]; void *boundminx=NULL,*boundmaxx=NULL,*wolfeminx=NULL; double boundmind=0,boundmaxd=0,wolfemind=0,aboundmind=0,aboundmaxd=0,awolfemind=0; long boundminl=0,boundmaxl=0,wolfeminl=0,aboundminl=0,aboundmaxl=0,awolfeminl=0; float boundminf=0,boundmaxf=0,wolfeminf=0,aboundminf=0,aboundmaxf=0,awolfeminf=0; int boundmini=0,boundmaxi=0,wolfemini=0,aboundmini=0,aboundmaxi=0,awolfemini=0; int g_a, g_b, g_c, g_d, g_e; int g_f, g_g, g_h, g_i, g_j; int g_k, g_l, g_m, g_n; int n = N; int me = GA_Nodeid (); int i; int dims[MAXDIM]; int lo[MAXDIM], hi[MAXDIM]; int index[MAXDIM]; int index2[MAXDIM]; int index3[MAXDIM]; int block_size[MAXDIM], proc_grid[MAXDIM], proc_cnt; int needs_scaled_result; void *val=NULL; void *val3=NULL; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; SingleComplex fcval; void *val2=NULL; void *val4=NULL; int ival2 = -3; double dval2 = -3.0; float fval2 = -3.0; long lval2 = -3; void *val5=NULL; int ival5 = 5; long lval5 = 5; double dval5 = 5.0; float fval5 = 5.0; DoubleComplex dcval2; DoubleComplex dcval3; DoubleComplex dcval4; DoubleComplex dcval5; DoubleComplex dcval6; DoubleComplex dcval7; SingleComplex fcval2; SingleComplex fcval3; SingleComplex fcval4; SingleComplex fcval5; SingleComplex fcval6; SingleComplex fcval7; void *vresult=NULL; int ivresult; double dvresult; float fvresult; long lvresult; DoubleComplex dcvresult; SingleComplex fcvresult; void *bvresult=NULL; DoubleComplex dcbvresult; SingleComplex fcbvresult; int ok = 1; int result=0,result2=0,result3=0; void *max=NULL; int imax; float fmax; long lmax; double dmax; DoubleComplex dcmax; SingleComplex fcmax; void *max2=NULL; DoubleComplex dcmax2; SingleComplex fcmax2; void *max3=NULL; DoubleComplex dcmax3; SingleComplex fcmax3; void *alpha=NULL, *beta=NULL; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc, bdc; SingleComplex afc, bfc; double x1, x2, x3, x4; float fx1, fx2, fx3, fx4; void *resultx=NULL; long resultl=0,aresultl=0; double resultd=0,aresultd=0; float resultf=0,aresultf=0; int resulti=0,aresulti=0; adc.real = 1.0; adc.imag = 0.0; bdc.real = -1.0; bdc.imag = 0.0; afc.real = 1.0; afc.imag = 0.0; bfc.real = -1.0; bfc.imag = 0.0; needs_scaled_result = 0; dcval.real = -sin (3.0); dcval.imag = -cos (3.0); dcval2.real = 2 * sin (3.0); dcval2.imag = 2 * cos (3.0); dcval3.real = dcval.real*1.0e2; dcval3.imag = dcval.imag*1.0e2; dcval4.real = dcval2.real*1.0e2; dcval4.imag = dcval2.imag*1.0e2; dcval5.real = 5.0; dcval5.imag = 0.0; dcval6.real = dcval3.imag; dcval6.imag = dcval3.real; dcval7.real = dcval4.imag; dcval7.imag = dcval4.real; fcval.real = -sin (3.0); fcval.imag = -cos (3.0); fcval2.real = 2 * sin (3.0); fcval2.imag = 2 * cos (3.0); fcval3.real = fcval.real*1.0e2; fcval3.imag = fcval.imag*1.0e2; fcval4.real = fcval2.real*1.0e2; fcval4.imag = fcval2.imag*1.0e2; fcval5.real = 5.0; fcval5.imag = 0.0; fcval6.real = fcval3.imag; fcval6.imag = fcval3.real; fcval7.real = fcval4.imag; fcval7.imag = fcval4.real; proc_cnt=1; for (i = 0; i < dim; i++) { dims[i] = N; block_size[i] = BLOCK_SIZE; if (i= GA_Nnodes()) { proc_grid[i] = 1; } else { proc_grid[i] = GA_Nnodes()/proc_cnt; } } for (i = 0; i < dim; i++) { lo[i] = 0; hi[i] = N - 1; } #if BLOCK_CYCLIC g_a = GA_Create_handle(); GA_Set_data(g_a,dim,dims,type); GA_Set_array_name(g_a,"A"); # if USE_SCALAPACK GA_Set_block_cyclic_proc_grid(g_a,block_size,proc_grid); # else GA_Set_block_cyclic(g_a,block_size); # endif GA_Allocate(g_a); #else g_a = NGA_Create (type, dim, dims, "A", NULL); if (!g_a) GA_Error ("create failed: A", n); #endif g_b = GA_Duplicate (g_a, "B"); if (!g_b) GA_Error ("duplicate failed: B", n); g_c = GA_Duplicate (g_a, "C"); if (!g_c) GA_Error ("duplicate failed: C", n); g_d = GA_Duplicate (g_a, "D"); if (!g_d) GA_Error ("duplicate failed: D", n); g_e = GA_Duplicate (g_a, "E"); if (!g_e) GA_Error ("duplicate failed: E", n); g_f = GA_Duplicate (g_a, "F"); if (!g_f) GA_Error ("duplicate failed: F", n); g_g = GA_Duplicate (g_a, "G"); if (!g_g) GA_Error ("duplicate failed: G", n); g_h = GA_Duplicate (g_a, "H"); if (!g_h) GA_Error ("duplicate failed: H", n); g_i = GA_Duplicate (g_a, "I"); if (!g_i) GA_Error ("duplicate failed: I", n); g_j = GA_Duplicate (g_a, "J"); if (!g_j) GA_Error ("duplicate failed: J", n); g_k = GA_Duplicate (g_a, "K"); if (!g_k) GA_Error ("duplicate failed: K", n); g_l = GA_Duplicate (g_a, "L"); if (!g_l) GA_Error ("duplicate failed: L", n); g_m = GA_Duplicate (g_a, "M"); if (!g_m) GA_Error ("duplicate failed: M", n); g_n = GA_Duplicate (g_a, "N"); if (!g_m) GA_Error ("duplicate failed: N", n); /*initialize with zero */ GA_Zero (g_a); GA_Zero (g_b); GA_Zero (g_c); GA_Zero (g_d); GA_Zero (g_e); GA_Zero (g_f); GA_Zero (g_g); GA_Zero (g_h); GA_Zero (g_i); GA_Zero (g_j); GA_Zero (g_k); GA_Zero (g_l); GA_Zero (g_m); GA_Zero (g_n); switch (type) { case C_INT: val = &ival; val2 = &ival2; val5 = &ival5; vresult = &ivresult; resultx = &resulti; boundminx = &boundmini; boundmaxx = &boundmaxi; wolfeminx = &wolfemini; break; case C_DCPL: val = &dcval; val2 = &dcval2; val3 = &dcval3; val4 = &dcval4; val5 = &dcval5; vresult = &dcvresult; bvresult = &dcbvresult; break; case C_SCPL: val = &fcval; val2 = &fcval2; val3 = &fcval3; val4 = &fcval4; val5 = &fcval5; vresult = &fcvresult; bvresult = &fcbvresult; break; case C_DBL: val = &dval; val2 = &dval2; val5 = &dval5; vresult = &dvresult; resultx = &resultd; boundminx = &boundmind; boundmaxx = &boundmaxd; wolfeminx = &wolfemind; break; case C_FLOAT: val = &fval; val2 = &fval2; val5 = &fval5; vresult = &fvresult; resultx = &resultf; boundminx = &boundminf; boundmaxx = &boundmaxf; wolfeminx = &wolfeminf; break; case C_LONG: val = &lval; val2 = &lval2; val5 = &lval5; vresult = &lvresult; resultx = &resultl; boundminx = &boundminl; boundmaxx = &boundmaxl; wolfeminx = &wolfeminl; break; default: GA_Error ("wrong data type.", type); } NGA_Fill_patch (g_a, lo, hi, val); NGA_Fill_patch (g_b, lo, hi, val2); NGA_Pnfill_patch (g_j, lo, hi); switch (OP) { double tmp, tmp2; float tmpf, tmp2f; case OP_ABS: if (me == 0) printf ("Testing GA_Abs_value..."); GA_Abs_value_patch (g_a, lo, hi); ivresult = GA_ABS (ival); dvresult = GA_ABS (dval); fvresult = GA_ABS (fval); lvresult = GA_ABS (lval); #if 0 if (GA_ABS(dcval.real) >= GA_ABS(dcval.imag)) { if (dcval.real == (double)0.0) { dcvresult.real = (double)0.0; } else { x1 = dcval.imag/dcval.real; dcvresult.real = GA_ABS(dcval.real)*sqrt(((double)1.0)+(x1*x1)); } } else { x1 = dcval.real/dcval.imag; dcvresult.real = GA_ABS(dcval.imag)*sqrt(((double)1.0)+(x1*x1)); } #endif dcvresult.real = sqrt(dcval.real*dcval.real+dcval.imag*dcval.imag); dcvresult.imag = 0.0; NGA_Fill_patch (g_d, lo, hi, vresult); if (type == C_DCPL) { needs_scaled_result = 1; NGA_Fill_patch(g_f,lo,hi,val3); GA_Abs_value_patch (g_f, lo, hi); #if 0 if (GA_ABS(dcval3.real) >= GA_ABS(dcval3.imag)) { if (dcval3.real == (double)0.0) { dcbvresult.real = (double)0.0; } else { x1 = dcval3.imag/dcval3.real; dcbvresult.real = GA_ABS(dcval3.real)*sqrt(((double)1.0)+(x1*x1)); } } else { x1 = dcval3.real/dcval3.imag; dcbvresult.real = GA_ABS(dcval3.imag)*sqrt(((double)1.0)+(x1*x1)); } #endif dcbvresult.real = sqrt(dcval3.real*dcval3.real+dcval3.imag*dcval3.imag); dcbvresult.imag = (double)0.0; NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch(g_k,lo,hi,&dcval6); GA_Abs_value_patch (g_k, lo, hi); #if 0 if (GA_ABS(dcval6.real) >= GA_ABS(dcval6.imag)) { if (dcval6.real == (double)0.0) { dcbvresult.real = (double)0.0; } else { x1 = dcval6.imag/dcval6.real; dcbvresult.real = GA_ABS(dcval6.real)*sqrt(((double)1.0)+(x1*x1)); } } else { x1 = dcval6.real/dcval6.imag; dcbvresult.real = GA_ABS(dcval6.imag)*sqrt(((double)1.0)+(x1*x1)); } #endif dcbvresult.real = sqrt(dcval6.real*dcval6.real+dcval6.imag*dcval6.imag); dcbvresult.imag = (double)0.0; NGA_Fill_patch (g_n, lo, hi, bvresult); } if (type == C_SCPL) { needs_scaled_result = 1; NGA_Fill_patch(g_f,lo,hi,val3); GA_Abs_value_patch (g_f, lo, hi); #if 0 if (GA_ABS(fcval3.real) >= GA_ABS(fcval3.imag)) { if (fcval3.real == (float )0.0) { fcbvresult.real = (float )0.0; } else { fx1 = fcval3.imag/fcval3.real; fcbvresult.real = GA_ABS(fcval3.real)*sqrt(((float)1.0)+(fx1*fx1)); } } else { fx1 = fcval3.real/fcval3.imag; fcbvresult.real = GA_ABS(fcval3.imag)*sqrt(((float)1.0)+(fx1*fx1)); } #endif fcbvresult.real = sqrt(fcval3.real*fcval3.real+fcval3.imag*fcval3.imag); fcbvresult.imag = (double)0.0; NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch(g_k,lo,hi,&dcval6); GA_Abs_value_patch (g_k, lo, hi); #if 0 if (GA_ABS(fcval6.real) >= GA_ABS(fcval6.imag)) { if (fcval6.real == (float)0.0) { fcbvresult.real = (float)0.0; } else { fx1 = fcval6.imag/fcval6.real; fcbvresult.real = GA_ABS(fcval6.real)*sqrt(((float)1.0)+(fx1*fx1)); } } else { fx1 = fcval6.real/fcval6.imag; fcbvresult.real = GA_ABS(fcval6.imag)*sqrt(((float)1.0)+(fx1*fx1)); } #endif fcbvresult.real = sqrt(fcval6.real*fcval6.real+fcval6.imag*fcval6.imag); fcbvresult.imag = (double)0.0; NGA_Fill_patch (g_n, lo, hi, bvresult); } break; case OP_ADD_CONST: if (me == 0) printf ("Testing GA_Add_const..."); GA_Add_constant_patch (g_a, lo, hi, val2); ivresult = ival + ival2; dvresult = dval + dval2; fvresult = fval + fval2; lvresult = lval + lval2; dcvresult.real = dcval.real + dcval2.real; dcvresult.imag = dcval.imag + dcval2.imag; fcvresult.real = fcval.real + fcval2.real; fcvresult.imag = fcval.imag + fcval2.imag; NGA_Fill_patch (g_d, lo, hi, vresult); break; case OP_RECIP: if (me == 0) printf ("Testing GA_Recip..."); GA_Recip_patch (g_a, lo, hi); ivresult = ((int)1) / ival; dvresult = ((double)1.0) / dval; fvresult = ((float)1.0) / fval; lvresult = ((long)1) / lval; if (GA_ABS(dcval.real) >= GA_ABS(dcval.imag)) { if (dcval.real != (double)0.0) { tmp = dcval.imag/dcval.real; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval.real); dcvresult.real = tmp2; dcvresult.imag = -tmp * tmp2; } else { printf("Error in testing GA_Recip dcval = 0.0\n"); } } else { tmp = dcval.real/dcval.imag; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval.imag); dcvresult.real = tmp * tmp2; dcvresult.imag = -tmp2; } NGA_Fill_patch (g_d, lo, hi, vresult); if (type == C_DCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); GA_Recip_patch (g_f, lo, hi); if (GA_ABS(dcval3.real) >= GA_ABS(dcval3.imag)) { if (dcval3.real == (double)0.0) { printf("Error testing GA_Recip, dcval3.real = 0.0\n"); } else { tmp = dcval3.imag/dcval3.real; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval3.real); dcbvresult.real = tmp2; dcbvresult.imag = -tmp * tmp2; } } else { tmp = dcval3.real/dcval3.imag; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval3.imag); dcbvresult.real = tmp * tmp2; dcbvresult.imag = -tmp2; } NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch(g_k,lo,hi,&dcval6); GA_Recip_patch (g_k, lo, hi); if (GA_ABS(dcval6.real) >= GA_ABS(dcval6.imag)) { if (dcval6.real == (double)0.0) { printf("Error testing GA_Recip, dcval6.real = 0.0\n"); } else { tmp = dcval6.imag/dcval6.real; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval6.real); dcbvresult.real = tmp2; dcbvresult.imag = -tmp * tmp2; } } else { tmp = dcval6.real/dcval6.imag; tmp2 = ((double)1.0)/((((double)1.0)+(tmp*tmp))*dcval6.imag); dcbvresult.real = tmp * tmp2; dcbvresult.imag = -tmp2; } NGA_Fill_patch (g_n, lo, hi, bvresult); } if (type == C_SCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); GA_Recip_patch (g_f, lo, hi); if (GA_ABS(fcval3.real) >= GA_ABS(fcval3.imag)) { if (fcval3.real == (float )0.0) { printf("Error testing GA_Recip, fcval3.real = 0.0\n"); } else { tmpf = fcval3.imag/fcval3.real; tmp2f = ((float)1.0)/((((float)1.0)+(tmpf*tmpf))*fcval3.real); fcbvresult.real = tmp2f; fcbvresult.imag = -tmpf * tmp2f; } } else { tmpf = fcval3.real/fcval3.imag; tmp2f = ((float)1.0)/((((float)1.0)+(tmpf*tmpf))*fcval3.imag); fcbvresult.real = tmpf * tmp2f; fcbvresult.imag = -tmp2f; } NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch(g_k,lo,hi,&dcval6); GA_Recip_patch (g_k, lo, hi); if (GA_ABS(fcval6.real) >= GA_ABS(fcval6.imag)) { if (fcval6.real == (float)0.0) { printf("Error testing GA_Recip, fcval6.real = 0.0\n"); } else { tmpf = fcval6.imag/fcval6.real; tmp2f = ((float)1.0)/((((float)1.0)+(tmpf*tmpf))*fcval6.real); fcbvresult.real = tmp2f; fcbvresult.imag = -tmpf * tmp2f; } } else { tmpf = fcval6.real/fcval6.imag; tmp2f = ((float)1.0)/((((float)1.0)+(tmpf*tmpf))*fcval6.imag); fcbvresult.real = tmpf * tmp2f; fcbvresult.imag = -tmp2f; } NGA_Fill_patch (g_n, lo, hi, bvresult); } break; case OP_ELEM_MULT: if (me == 0) printf ("Testing GA_Elem_multiply..."); NGA_Fill_patch (g_b, lo, hi, val2); /* g_c is different from g_a or g_b*/ GA_Elem_multiply_patch (g_a, lo, hi, g_b, lo, hi, g_c, lo, hi); ivresult = ival * ival2; dvresult = dval * dval2; fvresult = fval * fval2; lvresult = lval * lval2; dcvresult.real = dcval.real * dcval2.real - dcval.imag * dcval2.imag; dcvresult.imag = dcval.real * dcval2.imag + dcval2.real * dcval.imag; NGA_Fill_patch (g_d, lo, hi, vresult); break; case OP_ELEM_DIV: if (me == 0) printf ("Testing GA_Elem_divide..."); NGA_Fill_patch (g_b, lo, hi, val2); GA_Elem_divide_patch (g_a, lo, hi, g_b, lo, hi, g_c, lo, hi); ivresult = ival / ival2; dvresult = dval / dval2; fvresult = fval / fval2; lvresult = lval / lval2; dcvresult.real = 0.0; dcvresult.imag = 0.0; if (GA_ABS(dcval2.real) >= GA_ABS(dcval2.imag)) { if (dcval2.real != (double)0.0) { tmp = dcval2.imag/dcval2.real; tmp2 = ((double)1.0)/(dcval2.real*(((double)1.0)+(tmp*tmp))); dcvresult.real = (dcval.real + dcval.imag*tmp)*tmp2; dcvresult.imag = (dcval.imag - dcval.real*tmp)*tmp2; } else { printf("Error in testing GA_Elem_divide dcval = 0.0\n"); } } else { tmp = dcval2.real/dcval2.imag; tmp2 = 1.0/(dcval2.imag*(1.0+(tmp*tmp))); dcvresult.real = (dcval.real*tmp + dcval.imag)*tmp2; dcvresult.imag = (dcval.imag*tmp - dcval.real)*tmp2; } NGA_Fill_patch (g_d, lo, hi, vresult); if (type == C_DCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); NGA_Fill_patch (g_g, lo, hi, val4); GA_Elem_divide_patch (g_f, lo, hi, g_g, lo, hi, g_h, lo, hi); dcbvresult.real = (double)0.0; dcbvresult.imag = (double)0.0; if (GA_ABS(dcval4.real) >= GA_ABS(dcval4.imag)) { if (dcval4.real != (double)0.0) { tmp = dcval4.imag/dcval4.real; tmp2 = ((double)1.0)/(dcval4.real*(((double)1.0)+(tmp*tmp))); dcbvresult.real = (dcval3.real + dcval3.imag*tmp)*tmp2; dcbvresult.imag = (dcval3.imag - dcval3.real*tmp)*tmp2; } else { printf("Error in testing GA_Elem_divide dcval4 = 0.0\n"); } } else { tmp = dcval4.real/dcval4.imag; tmp2 = ((double)1.0)/(dcval4.imag*(((double)1.0)+(tmp*tmp))); dcbvresult.real = (dcval3.real*tmp + dcval3.imag)*tmp2; dcbvresult.imag = (dcval3.imag*tmp - dcval3.real)*tmp2; } NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch (g_k, lo, hi, &dcval6); NGA_Fill_patch (g_l, lo, hi, &dcval7); GA_Elem_divide_patch (g_k, lo, hi, g_l, lo, hi, g_m, lo, hi); dcbvresult.real = (double)0.0; dcbvresult.imag = (double)0.0; if (GA_ABS(dcval7.real) >= GA_ABS(dcval7.imag)) { if (dcval7.real != (double)0.0) { tmp = dcval7.imag/dcval7.real; tmp2 = ((double)1.0)/(dcval7.real*(((double)1.0)+(tmp*tmp))); dcbvresult.real = (dcval6.real + dcval6.imag*tmp)*tmp2; dcbvresult.imag = (dcval6.imag - dcval6.real*tmp)*tmp2; } else { printf("Error in testing GA_Elem_divide dcval7 = 0.0\n"); } } else { tmp = dcval7.real/dcval7.imag; tmp2 = ((double)1.0)/(dcval7.imag*(((double)1.0)+(tmp*tmp))); dcbvresult.real = (dcval6.real*tmp + dcval6.imag)*tmp2; dcbvresult.imag = (dcval6.imag*tmp - dcval6.real)*tmp2; } NGA_Fill_patch (g_n, lo, hi, bvresult); } if (type == C_SCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); NGA_Fill_patch (g_g, lo, hi, val4); GA_Elem_divide_patch (g_f, lo, hi, g_g, lo, hi, g_h, lo, hi); fcbvresult.real = (float)0.0; fcbvresult.imag = (float)0.0; if (GA_ABS(fcval4.real) >= GA_ABS(fcval4.imag)) { if (fcval4.real != (float)0.0) { tmpf = fcval4.imag/fcval4.real; tmp2f = ((float)1.0)/(fcval4.real*(((float)1.0)+(tmpf*tmpf))); fcbvresult.real = (fcval3.real + fcval3.imag*tmpf)*tmp2f; fcbvresult.imag = (fcval3.imag - fcval3.real*tmpf)*tmp2f; } else { printf("Error in testing GA_Elem_divide fcval4 = 0.0\n"); } } else { tmpf = fcval4.real/fcval4.imag; tmp2f = ((float)1.0)/(fcval4.imag*(((float)1.0)+(tmpf*tmpf))); fcbvresult.real = (fcval3.real*tmpf + fcval3.imag)*tmp2f; fcbvresult.imag = (fcval3.imag*tmpf - fcval3.real)*tmp2f; } NGA_Fill_patch (g_i, lo, hi, bvresult); NGA_Fill_patch (g_k, lo, hi, &dcval6); NGA_Fill_patch (g_l, lo, hi, &dcval7); GA_Elem_divide_patch (g_k, lo, hi, g_l, lo, hi, g_m, lo, hi); fcbvresult.real = (float)0.0; fcbvresult.imag = (float)0.0; if (GA_ABS(fcval7.real) >= GA_ABS(fcval7.imag)) { if (fcval7.real != (float)0.0) { tmpf = fcval7.imag/fcval7.real; tmp2f = ((float)1.0)/(fcval7.real*(((float)1.0)+(tmpf*tmpf))); fcbvresult.real = (fcval6.real + fcval6.imag*tmpf)*tmp2f; fcbvresult.imag = (fcval6.imag - fcval6.real*tmpf)*tmp2f; } else { printf("Error in testing GA_Elem_divide fcval7 = 0.0\n"); } } else { tmpf = fcval7.real/fcval7.imag; tmp2f = ((float)1.0)/(fcval7.imag*(((float)1.0)+(tmpf*tmpf))); fcbvresult.real = (fcval6.real*tmpf + fcval6.imag)*tmp2f; fcbvresult.imag = (fcval6.imag*tmpf - fcval6.real)*tmp2f; } NGA_Fill_patch (g_n, lo, hi, bvresult); } break; case OP_ELEM_MAX: if (me == 0) printf ("Testing GA_Elem_maximum..."); /*NGA_Fill_patch (g_b, lo, hi, val2);*/ GA_Elem_maximum_patch (g_a, lo, hi, g_b, lo, hi, g_c, lo, hi); ivresult = GA_MAX (ival, ival2); dvresult = GA_MAX (dval, dval2); fvresult = GA_MAX (fval, fval2); lvresult = GA_MAX (lval, lval2); tmp = GA_MAX(GA_ABS(dcval.real),GA_ABS(dcval.imag)); tmp2 = GA_MAX(GA_ABS(dcval2.real),GA_ABS(dcval2.imag)); tmp = GA_MAX(tmp,tmp2); dcvresult.real = dcval.real; dcvresult.imag = dcval.imag; if (tmp != 0.0) { tmp = ((double)1.0)/tmp; x1 = dcval.real*tmp; x2 = dcval.imag*tmp; x3 = dcval2.real*tmp; x4 = dcval2.imag*tmp; tmp = x1*x1 + x2*x2; tmp2 = x3*x3 + x4*x4; if (tmp2 > tmp) { dcvresult.real = dcval2.real; dcvresult.imag = dcval2.imag; } } NGA_Fill_patch (g_d, lo, hi, vresult); if (type == C_DCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); NGA_Fill_patch (g_g, lo, hi, val4); GA_Elem_maximum_patch (g_f, lo, hi, g_g, lo, hi, g_h, lo, hi); tmp = GA_MAX(GA_ABS(dcval3.real),GA_ABS(dcval3.imag)); tmp2 = GA_MAX(GA_ABS(dcval4.real),GA_ABS(dcval4.imag)); tmp = GA_MAX(tmp,tmp2); dcvresult.real = dcval3.real; dcvresult.imag = dcval3.imag; if (tmp != 0.0) { tmp = ((double)1.0)/tmp; x1 = dcval3.real*tmp; x2 = dcval3.imag*tmp; x3 = dcval4.real*tmp; x4 = dcval4.imag*tmp; tmp = x1*x1 + x2*x2; tmp2 = x3*x3 + x4*x4; if (tmp2 > tmp) { dcvresult.real = dcval4.real; dcvresult.imag = dcval4.imag; } } NGA_Fill_patch (g_i, lo, hi, vresult); NGA_Fill_patch (g_k, lo, hi, &dcval6); NGA_Fill_patch (g_l, lo, hi, &dcval7); GA_Elem_maximum_patch (g_k, lo, hi, g_l, lo, hi, g_m, lo, hi); tmp = GA_MAX(GA_ABS(dcval6.real),GA_ABS(dcval6.imag)); tmp2 = GA_MAX(GA_ABS(dcval7.real),GA_ABS(dcval7.imag)); tmp = GA_MAX(tmp,tmp2); dcvresult.real = dcval6.real; dcvresult.imag = dcval6.imag; if (tmp != 0.0) { tmp = ((double)1.0)/tmp; x1 = dcval6.real*tmp; x2 = dcval6.imag*tmp; x3 = dcval7.real*tmp; x4 = dcval7.imag*tmp; tmp = x1*x1 + x2*x2; tmp2 = x3*x3 + x4*x4; if (tmp2 > tmp) { dcvresult.real = dcval7.real; dcvresult.imag = dcval7.imag; } } NGA_Fill_patch (g_n, lo, hi, vresult); } break; case OP_ELEM_MIN: if (me == 0) printf ("Testing GA_Elem_minimum..."); NGA_Fill_patch (g_b, lo, hi, val2); GA_Elem_minimum_patch (g_a, lo, hi, g_b, lo, hi, g_c, lo, hi); ivresult = GA_MIN (ival, ival2); dvresult = GA_MIN (dval, dval2); fvresult = GA_MIN (fval, fval2); lvresult = GA_MIN (lval, lval2); tmp = GA_MAX(GA_ABS(dcval.real),GA_ABS(dcval.imag)); tmp2 = GA_MAX(GA_ABS(dcval2.real),GA_ABS(dcval2.imag)); tmp = GA_MAX(tmp,tmp2); dcvresult.real = dcval.real; dcvresult.imag = dcval.imag; if (tmp != 0.0) { tmp = 1.0/tmp; x1 = dcval.real*tmp; x2 = dcval.imag*tmp; x3 = dcval2.real*tmp; x4 = dcval2.imag*tmp; tmp = x1*x1 + x2*x2; tmp2 = x3*x3 + x4*x4; if (tmp2 < tmp) { dcvresult.real = dcval2.real; dcvresult.imag = dcval2.imag; } } NGA_Fill_patch (g_d, lo, hi, vresult); if (type == C_SCPL) { needs_scaled_result = 1; NGA_Fill_patch (g_f, lo, hi, val3); NGA_Fill_patch (g_g, lo, hi, val4); GA_Elem_minimum_patch (g_f, lo, hi, g_g, lo, hi, g_h, lo, hi); tmpf = GA_MAX(GA_ABS(fcval3.real),GA_ABS(fcval3.imag)); tmp2f = GA_MAX(GA_ABS(fcval4.real),GA_ABS(fcval4.imag)); tmpf = GA_MAX(tmpf,tmp2f); fcvresult.real = fcval3.real; fcvresult.imag = fcval3.imag; if (tmpf != 0.0) { tmpf = ((float)1.0)/tmpf; fx1 = fcval3.real*tmpf; fx2 = fcval3.imag*tmpf; fx3 = fcval4.real*tmpf; fx4 = fcval4.imag*tmpf; tmpf = fx1*fx1 + fx2*fx2; tmp2f = fx3*fx3 + fx4*fx4; if (tmp2f < tmpf) { fcvresult.real = fcval4.real; fcvresult.imag = fcval4.imag; } } NGA_Fill_patch (g_i, lo, hi, vresult); NGA_Fill_patch (g_k, lo, hi, &dcval6); NGA_Fill_patch (g_l, lo, hi, &dcval7); GA_Elem_minimum_patch (g_k, lo, hi, g_l, lo, hi, g_m, lo, hi); tmpf = GA_MAX(GA_ABS(fcval6.real),GA_ABS(fcval6.imag)); tmp2f = GA_MAX(GA_ABS(fcval7.real),GA_ABS(fcval7.imag)); tmpf = GA_MAX(tmpf,tmp2f); fcvresult.real = fcval6.real; fcvresult.imag = fcval6.imag; if (tmpf != 0.0) { tmpf = ((float)1.0)/tmpf; fx1 = fcval6.real*tmpf; fx2 = fcval6.imag*tmpf; fx3 = fcval7.real*tmpf; fx4 = fcval7.imag*tmpf; tmpf = fx1*fx1 + fx2*fx2; tmp2f = fx3*fx3 + fx4*fx4; if (tmp2f < tmpf) { fcvresult.real = fcval7.real; fcvresult.imag = fcval7.imag; } } NGA_Fill_patch (g_n, lo, hi, vresult); } break; case OP_STEP_MAX: if (me == 0) printf ("Testing GA_Step_max..."); if (type != C_DCPL || type != C_SCPL) { /*NGA_Fill_patch (g_b, lo, hi, val2);*/ GA_Abs_value_patch (g_b, lo, hi); GA_Step_max_patch (g_b, lo, hi, g_j, lo, hi, resultx); /* printf(" GA_Stepmax_patch type = %d, resultx = %le\n",type,resultx); fflush(stdout); */ /* It would be more robust to use GA_Elem_min_patch here to determine the minimum g_j value, but for now we set it to -2. */ aresulti = ((int)(GA_ABS(ival2)/GA_ABS(ival))) - resulti; aresultd = GA_ABS(dval2/dval) - resultd; aresultf = ((float)GA_ABS(fval2/fval)) - resultf; aresultl = ((long)(GA_ABS(lval2)/GA_ABS(lval))) - resultl; } break; case OP_STEP_BOUND_INFO: if (me == 0) printf ("Testing GA_Step_bound_info..."); if (type != C_DCPL || type != C_SCPL) { /*NGA_Fill_patch (g_b, lo, hi, val2);*/ GA_Abs_value_patch (g_b, lo, hi); GA_Abs_value_patch (g_a, lo, hi); /*GA_Abs_value_patch (g_j, lo, hi);*/ NGA_Fill_patch(g_c, lo, hi, val5); GA_Step_bound_info_patch (g_b,lo,hi, g_j,lo,hi, g_a,lo,hi, g_c,lo,hi, boundminx,wolfeminx,boundmaxx); /* printf(" GA_Stepmax2_patch type = %d, resultx = %le\n",type,resultx); fflush(stdout); */ /* This is currently hardwired. would need to change if val, val2 or val5 change. */ switch (type) { case C_INT: awolfemini = ((int)(((int)1)/((int)2))) - wolfemini; aboundmini = ((int)(((int)1)/((int)2))) - boundmini; aboundmaxi = (int)GA_INFINITY_I - boundmaxi; break; case C_DBL: awolfemind = (((double)1.0)/((double)2.0)) - wolfemind; aboundmind = (((double)1.0)/((double)2.0)) - boundmind; aboundmaxd = (double)GA_INFINITY_D - boundmaxd; break; case C_FLOAT: awolfeminf = (((float)1.0)/((float)2.0)) - wolfeminf; aboundminf = (((float)1.0)/((float)2.0)) - boundminf; aboundmaxf = (float)GA_INFINITY_F - boundmaxf; break; case C_LONG: awolfeminl = ((long)(((long)1)/((long)2))) - wolfeminl; aboundminl = ((long)(((long)1)/((long)2))) - boundminl; aboundmaxl = (long)GA_INFINITY_L - boundmaxl; break; default: GA_Error ("GA_step_bound_info wrong data type.", type); } } break; default: GA_Error ("test_function: wrong operation.", OP); } switch (type) { case C_INT: alpha = &ai; beta = &bi; break; case C_DCPL: alpha = &adc; beta = &bdc; break; case C_SCPL: alpha = &afc; beta = &bfc; break; case C_DBL: alpha = &ad; beta = &bd; break; case C_FLOAT: alpha = ⁡ beta = &bf; break; case C_LONG: alpha = &al; beta = &bl; break; default: GA_Error ("wrong data type.", type); } if (OP < 4) { /* Binary operation. */ NGA_Add_patch (alpha, g_c, lo, hi, beta, g_d, lo, hi, g_e, lo, hi); if (needs_scaled_result == 1) { NGA_Add_patch (alpha, g_h, lo, hi, beta, g_i, lo, hi, g_j, lo, hi); NGA_Add_patch (alpha, g_m, lo, hi, beta, g_n, lo, hi, g_n, lo, hi); } } else { /* Unary operation. */ if (OP < 7) { NGA_Add_patch (alpha, g_a, lo, hi, beta, g_d, lo, hi, g_e, lo, hi); if (needs_scaled_result == 1) { NGA_Add_patch (alpha, g_f, lo, hi, beta, g_i, lo, hi, g_j, lo, hi); NGA_Add_patch (alpha, g_k, lo, hi, beta, g_n, lo, hi, g_n, lo, hi); } } /* Else it was a reduction operation (one of the step_max functions). */ } switch (type) { case C_INT: max = &imax; break; case C_DCPL: max = &dcmax; max2 = &dcmax2; max3 = &dcmax3; break; case C_SCPL: max = &fcmax; max2 = &fcmax2; max3 = &fcmax3; break; case C_DBL: max = &dmax; break; case C_FLOAT: max = &fmax; break; case C_LONG: max = &lmax; break; default: GA_Error ("wrong data type.", type); } /* for unary and binary operators extract the maximum difference between computed and correct solutions. */ if (OP < 7) { NGA_Select_elem (g_e, "max", max, index); if (needs_scaled_result == 1) { NGA_Select_elem (g_j, "max", max2, index2); NGA_Select_elem (g_n, "max", max3, index3); } } /* NGA_Select_elem (g_e, "min", min, index);*/ if (OP < 7) { /* Binary or Unary operators. */ switch (type) { double r, im; float rf, imf; case C_INT: /* result = (int)(imax - imin);*/ result = imax; if (result != (int)0) result = 1; break; case C_DCPL: /* r = dcmax.real - dcmin.real; im = dcmax.imag - dcmin.imag; */ r = dcmax.real; im = dcmax.imag; if ((GA_ABS(r) + GA_ABS(im)) < THRESH) { result = 0; } else { result = 1; } if (needs_scaled_result == 1) { result2 = 0; r = dcmax2.real; im = dcmax2.imag; if ((GA_ABS(r) + GA_ABS(im)) < THRESH) { result2 = 0; } else { result2 = 1; } r = dcmax3.real; im = dcmax3.imag; if ((GA_ABS(r) + GA_ABS(im)) < THRESH) { result3 = 0; } else { result3 = 1; } result = result | result2 | result3; } break; case C_SCPL: /* rf = fcmax.real - fcmin.real; imf = fcmax.imag - fcmin.imag; */ rf = fcmax.real; imf = fcmax.imag; if ((GA_ABS(rf) + GA_ABS(imf)) == (float)0.0) { result = 0; } else { result = 1; } if (needs_scaled_result == 1) { result2 = 0; rf = fcmax2.real; imf = fcmax2.imag; if ((GA_ABS(rf) + GA_ABS(imf)) == (float)0.0) { result2 = 0; } else { result2 = 1; } rf = fcmax3.real; imf = fcmax3.imag; if ((GA_ABS(rf) + GA_ABS(imf)) == (float)0.0) { result3 = 0; } else { result3 = 1; } result = result | result2 | result3; } break; case C_DBL: if (dmax == (double)0.0) { result = 0; } else { result = 1; } break; case C_FLOAT: if (fmax == (float)0.0) { result = 0; } else { result = 1; } break; case C_LONG: if (lmax == (long)0) { result = 0; } else { result = 1; } break; default: GA_Error ("wrong data type.", type); } } else { /* A reduction operation, Step_max or Step_bound_info. */ if (type == C_DCPL || type == C_SCPL) { result = 0; } else { if (OP == OP_STEP_MAX) { /* Step_max */ switch (type) { case C_INT: if (aresulti == 0) { result = 0; } else { result = 1; } break; case C_DBL: if (aresultd == (double)0.0) { result = 0; } else { result = 1; } break; case C_FLOAT: if (aresultf == (float)0.0) { result = 0; } else { result = 1; } break; case C_LONG: if (aresultl == (long)0) { result = 0; } else { result = 1; } break; default: GA_Error ("Stepmax op, wrong data type.", type); } } else { /* OP = 8 so Step_bound_info */ switch (type) { case C_INT: if (awolfemini == 0) { result = 0; } else { result = 1; } if (aboundmini == 0) { result2 = 0; } else { result2 = 1; } if (aboundmaxi == 0) { result3 = 0; } else { result3 = 1; } break; case C_DBL: if (awolfemind == ((double)0.0)) { result = 0; } else { result = 1; } if (aboundmind == ((double)0.0)) { result2 = 0; } else { result2 = 1; } if (aboundmaxd == ((double)0.0)) { result3 = 0; } else { result3 = 1; } break; case C_FLOAT: if (awolfeminf == ((float)0.0)) { result = 0; } else { result = 1; } if (aboundminf == ((float)0.0)) { result2 = 0; } else { result2 = 1; } if (aboundmaxf == ((float)0.0)) { result3 = 0; } else { result3 = 1; } break; case C_LONG: if (awolfeminl == ((long)0)) { result = 0; } else { result = 1; } if (aboundminl == ((long)0)) { result2 = 0; } else { result2 = 1; } if (aboundmaxl == ((long)0)) { result3 = 0; } else { result3 = 1; } break; default: GA_Error ("Stepmax op, wrong data type.", type); } result = result | result2 | result3; } } } if (me == 0) { if (MISMATCHED (result, 0)) { printf ("is not ok\n"); GA_Error("aborting", 1); } else { printf ("is ok.\n"); } } /* NGA_Print_patch(g_a, lo, hi, 1); NGA_Print_patch(g_d, lo, hi, 1); NGA_Print_patch(g_e, lo, hi, 1); */ GA_Destroy (g_a); GA_Destroy (g_b); GA_Destroy (g_c); GA_Destroy (g_d); GA_Destroy (g_e); GA_Destroy (g_f); GA_Destroy (g_g); GA_Destroy (g_h); GA_Destroy (g_i); GA_Destroy (g_j); GA_Destroy (g_k); GA_Destroy (g_l); GA_Destroy (g_m); GA_Destroy (g_n); return ok; } int main (argc, argv) int argc; char **argv; { int heap = 20000, stack = 20000; int me, nproc; int d, op; int ok = 1; MP_INIT(argc,argv); GA_INIT(argc,argv); /* initialize GA */ me = GA_Nodeid (); nproc = GA_Nnodes (); if (me == 0) { if (GA_Uses_fapi ()) GA_Error ("Program runs with C array API only", 1); printf ("Using %ld processes\n", (long) nproc); fflush (stdout); } heap /= nproc; stack /= nproc; if (!MA_init (C_DBL, stack, heap)) GA_Error ("MA_init failed", stack + heap); /* initialize memory allocator */ /* op = 8;*/ for (op = 0; op < 9; op++) { /*for (d = 1; d < 2; d++)*/ for (d = 1; d < 4; d++) { if (me == 0) printf ("\n\ndim =%d\n\n", d); if (me == 0) printf ("\ndata type: INT\t\t"); ok = test_fun (C_INT, d, op); if (me == 0) printf ("\ndata type: double\t"); ok = test_fun (C_DBL, d, op); if (me == 0) printf ("\ndata type: float\t"); ok = test_fun (C_FLOAT, d, op); if (me == 0) printf ("\ndata type: long\t\t"); ok = test_fun (C_LONG, d, op); if (op < 7) { if (me == 0) printf ("\ndata type: double complex\t"); ok = test_fun (C_DCPL, d, op); } } } if (me==0) printf("\nAll tests successful\n"); GA_Terminate(); MP_FINALIZE(); return 0; } /*\ FILL IN ARRAY WITH Varying VALUEs. (from 0 to product of dims-1). For complex arrays make the real and imaginary parts equal. \*/ void nga_vfill_patch(Integer *g_a, Integer *lo, Integer *hi) { Integer i, j; Integer ndim, dims[MAXDIM], type; Integer loA[MAXDIM], hiA[MAXDIM], ld[MAXDIM]; void *data_ptr; Integer idx, n1dim; Integer bvalue[MAXDIM], bunit[MAXDIM], baseld[MAXDIM]; Integer me= pnga_nodeid(); int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)GA_Sync(); GA_PUSH_NAME("nga_vfill_patch"); pnga_inquire(*g_a, &type, &ndim, dims); /* get limits of VISIBLE patch */ pnga_distribution(*g_a, me, loA, hiA); /* determine subset of my local patch to access */ /* Output is in loA and hiA */ if(pnga_patch_intersect(lo, hi, loA, hiA, ndim)){ /* get data_ptr to corner of patch */ /* ld are leading dimensions INCLUDING ghost cells */ pnga_access_ptr(*g_a, loA, hiA, &data_ptr, ld); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((int *)data_ptr)[idx+j] = (int)(idx+j); } break; case C_DCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { ((DoubleComplex *)data_ptr)[idx+j].real = (double)(idx+j); ((DoubleComplex *)data_ptr)[idx+j].imag = (double)(idx+j); } } break; case C_SCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { ((SingleComplex *)data_ptr)[idx+j].real = (float)(idx+j); ((SingleComplex *)data_ptr)[idx+j].imag = (float)(idx+j); } } break; case C_DBL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((double*)data_ptr)[idx+j] = (double)(idx+j); } break; case C_FLOAT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((float *)data_ptr)[idx+j] = (float)(idx+j); } break; case C_LONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long *)data_ptr)[idx+j] = (long)(idx+j); } break; default: GA_Error(" wrong data type ",type); } /* release access to the data */ pnga_release_update(*g_a, loA, hiA); } GA_POP_NAME; if(local_sync_end)GA_Sync(); } /*\ Utility function to actually set positive/negative values \*/ void ngai_do_pnfill_patch(Integer type, Integer ndim, Integer *loA, Integer *hiA, Integer *ld, void *data_ptr) { Integer i, j; Integer idx, n1dim; Integer bvalue[MAXDIM], bunit[MAXDIM], baseld[MAXDIM]; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((int *)data_ptr)[idx+j] = (int)(((idx+j)&3)-2); } break; case C_DCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { ((DoubleComplex *)data_ptr)[idx+j].real = (double)(((idx+j)&3)-2); ((DoubleComplex *)data_ptr)[idx+j].imag = (double)(((idx+j)&3)-2); } } break; case C_SCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { ((SingleComplex *)data_ptr)[idx+j].real = (float)(((idx+j)&3)-2); ((SingleComplex *)data_ptr)[idx+j].imag = (float)(((idx+j)&3)-2); } } break; case C_DBL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((double*)data_ptr)[idx+j] = (double)(((idx+j)&3)-2); } break; case C_FLOAT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((float *)data_ptr)[idx+j] = (float)(((idx+j)&3)-2); } break; case C_LONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long *)data_ptr)[idx+j] = (long)(((idx+j)&3)-2); } break; default: GA_Error(" wrong data type ",type); } } /*\ FILL IN ARRAY WITH Varying positive and negative VALUEs. (from -2 to 1). For complex arrays make the real and imaginary parts equal. \*/ void nga_pnfill_patch(Integer *g_a, Integer *lo, Integer *hi) { Integer i; Integer ndim, dims[MAXDIM], type; Integer loA[MAXDIM], hiA[MAXDIM], ld[MAXDIM]; void *data_ptr; Integer me= pnga_nodeid(); Integer num_blocks; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)GA_Sync(); GA_PUSH_NAME("nga_pnfill_patch"); pnga_inquire(*g_a, &type, &ndim, dims); num_blocks = pnga_total_blocks(*g_a); if (num_blocks < 0) { /* get limits of VISIBLE patch */ pnga_distribution(*g_a, me, loA, hiA); /* determine subset of my local patch to access */ /* Output is in loA and hiA */ if(pnga_patch_intersect(lo, hi, loA, hiA, ndim)){ /* get data_ptr to corner of patch */ /* ld are leading dimensions INCLUDING ghost cells */ pnga_access_ptr(*g_a, loA, hiA, &data_ptr, ld); ngai_do_pnfill_patch(type, ndim, loA, hiA, ld, data_ptr); /* release access to the data */ pnga_release_update(*g_a, loA, hiA); } } else { Integer offset, j, jtmp, chk; Integer loS[MAXDIM]; Integer nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(*g_a)){ for (i=me; i dims[i]) hiA[i] = dims[i]; if (hiA[i] < loA[i]) chk = 0; } /* loA is changed by pnga_patch_intersect, so save a copy */ for (j=0; j= blocks[i] && i #endif #include #include #include int main(int argc, char **argv) { int size_dst = 15; int g_a = 0; int I_NEG_ONE = -1; long L_NEG_ONE = -1; long long LL_NEG_ONE = -1; int FIVE = 5; int TEN = 10; int lo; int hi; int *ptr; int i; MP_INIT(argc,argv); GA_INIT(argc,argv); for (i=0; i<3; ++i) { if (0 == i) { g_a = NGA_Create(C_INT, 1, &size_dst, "dst", NULL); GA_Fill(g_a, &I_NEG_ONE); } else if (1 == i) { g_a = NGA_Create(C_LONG, 1, &size_dst, "dst", NULL); GA_Fill(g_a, &L_NEG_ONE); } else if (2 == i) { g_a = NGA_Create(C_LONGLONG, 1, &size_dst, "dst", NULL); GA_Fill(g_a, &LL_NEG_ONE); } GA_Sync(); GA_Print(g_a); NGA_Print_patch(g_a, &FIVE, &TEN, 0); NGA_Print_patch(g_a, &FIVE, &TEN, 1); NGA_Distribution(g_a, GA_Nodeid(), &lo, &hi); NGA_Access(g_a, &lo, &hi, &ptr, NULL); printf("[%d] (%d)=%d\n", GA_Nodeid(), lo, *ptr); NGA_Release(g_a, &lo, &hi); } GA_Terminate(); MP_FINALIZE(); exit(EXIT_SUCCESS); } ga-5-4/global/testing/testmultrect.c0000644000175000017500000000420512662210457015656 0ustar mbamba/** * testmultrect.c * Test rectangular matrix multiplication. * * Nawab Ali */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "ga.h" #include "macdecls.h" #include "mp3.h" #define NDIMS 2 /* 2-dimensional matrices */ #define HEAP 4000000 #define STACK 4000000 int m = 2; int k = 3; int n = 4; int g_a, g_b, g_c; /* GA handles for matrices A, B, and C */ int mr_create_matrices(void); int mr_cleanup(void); int main(int argc, char **argv) { int ret, nprocs; int me, heap, stack; /* Initialize message passing and GA */ MP_INIT(argc,argv); GA_INIT(argc,argv); me = GA_Nodeid(); nprocs = GA_Nnodes(); heap = HEAP/nprocs; stack = STACK/nprocs; if (!MA_init(C_DBL, stack, heap)) { GA_Error("MA_init failed", stack+heap); } /* Create the matrices A, B, C */ ret = mr_create_matrices(); GA_Print(g_a); GA_Print(g_b); GA_Print(g_c); /* C = A x B */ GA_Dgemm('N', 'N', m, n, k, 1.0, g_a, g_b, 0.0, g_c); /* Clean up */ ret = mr_cleanup(); GA_Terminate(); MP_FINALIZE(); return 0; } int mr_create_matrices(void) { double val_a = 10.0; double val_b = 20.0; int ret, dims[NDIMS]; /* Create a 2-dimensional matrix A[m][k] */ dims[0] = m; dims[1] = k; g_a = GA_Create_handle(); GA_Set_array_name(g_a, "Matrix A"); GA_Set_data(g_a, NDIMS, dims, C_DBL); ret = GA_Allocate(g_a); GA_Fill(g_a, &val_a); /* Create a 2-dimensional matrix B[k][n] */ dims[0] = k; dims[1] = n; g_b = GA_Create_handle(); GA_Set_array_name(g_b, "Matrix B"); GA_Set_data(g_b, NDIMS, dims, C_DBL); ret = GA_Allocate(g_b); GA_Fill(g_b, &val_b); /* Create a 2-dimensional matrix C[m][n] */ dims[0] = m; dims[1] = n; g_c = GA_Create_handle(); GA_Set_array_name(g_c, "Matrix C"); GA_Set_data(g_c, NDIMS, dims, C_DBL); ret = GA_Allocate(g_c); GA_Zero(g_c); return 0; } int mr_cleanup(void) { GA_Destroy(g_a); GA_Destroy(g_b); GA_Destroy(g_c); return 0; } ga-5-4/global/testing/pgtestmatmult.F0000644000175000017500000002455112662210460015774 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program ga_test c $Id: pgtestmatmult.F,v 1.2.6.1 2007-04-25 21:49:59 manoj Exp $ c c test ga_dgemm c compile with make FLD_REN="optimized blas" testmatmult.x c Note: - change nummax for large arrays c - turn off "verify" for large arrays due to memory c limitations, as verify=TRUE for large arrays produces c segfault, dumps core,or any crap. c c implicit none integer num_m,num_n,num_k,nummax,howmany,ntrans parameter (nummax=1024,howmany=2,ntrans=4) integer num1 parameter(num1=nummax) integer i,ii real*8 h0(num1*num1) integer g_c,g_b,g_a real*8 a real*8 t1,mf,avg_t(ntrans),avg_mf(ntrans) integer itime,ntimes,me integer nums_m(howmany),nums_n(howmany),nums_k(howmany) character*1 transa(ntrans),transb(ntrans),ta,tb real *8 tmpa(nummax,nummax), tmpb(nummax,nummax) real *8 tmpc(nummax,nummax) logical verify,status integer grp_me, nproc, nprocs, proc_group(0:100), proclist(100) data transa/'n','t','n','t'/ data transb/'n','n','t','t'/ data nums_m/512,1024/ data nums_n/512,1024/ data nums_k/512,1024/ #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" #include "mp3.fh" if (.not.ma_init(MT_DBL,1,20000000)) then call ga_error('failed: ma_init(MT_DBL,1,20000000)',10) endif status = ma_set_auto_verify(.true.) ! status = ma_set_hard_fail(.true.) ! status = ma_set_error_print(.true.) call ga_initialize() me = ga_nodeid() nproc = ga_nnodes() if(nproc .ne. 8) then write(*,*) 'nproc =', nproc call ga_error('failed: need exactly 8 processors',10) endif call ga_sync() proclist(1) = 0 proclist(2) = 1 proclist(3) = 2 proclist(4) = 3 nprocs = 4 proc_group(0) = ga_pgroup_create(proclist, nprocs) proclist(1) = 4 proclist(2) = 5 proclist(3) = 6 proclist(4) = 7 nprocs = 4 proc_group(1) = ga_pgroup_create(proclist, nprocs) if (me.lt.4) then call ga_pgroup_set_default(proc_group(0)) endif if (me.ge.4) then call ga_pgroup_set_default(proc_group(1)) endif c get new proc ids for your default group me = ga_nodeid() nproc = ga_nnodes() ii = 0 do i = 1, num1*num1 ii = ii + 1 if(ii.gt.num1) then ii = 0 endif h0(i) = ii enddo c c Compute times assuming 500 mflops and 5 second target time c c ntimes = max(3.0d0,5.0d0/(4.0d-9*num**3)) ntimes = 5 verify = .TRUE. ! to verify ga_dgemm c verify = .FALSE. ! to verify ga_dgemm #if 1 do ii=1,howmany num_m = nums_m(ii) num_n = nums_n(ii) num_k = nums_k(ii) a = 0.5d0/(num_m*num_n) if(num_m.gt.nummax .OR. num_n.gt.nummax .OR. & num_k.gt.nummax) then call ga_error('Insufficient memory: check nummax', 0) endif c c if (.not.ga_create(MT_DBL,num_m,num_n,'g_c', & 0,0,g_c)) then call ga_error('failed: create g_c',20) endif if (.not.ga_create(MT_DBL,num_k,num_n,'g_b', & 0,0,g_b)) then call ga_error('failed: create g_b',30) endif if (.not.ga_create(MT_DBL,num_m,num_k,'g_a', & 0,0,g_a)) then call ga_error('failed: create g_a',40) endif c c Initialize matrices A and B c call load_ga_from_square(g_a,num_m,h0,num1) c call load_ga_from_square(g_b,num_m,h0,num1) c if(me.eq.0) then call load_ga(g_a, h0, num_m, num_k) call load_ga(g_b, h0, num_k, num_n) endif call ga_zero(g_c) call ga_sync() if (ga_nodeid().eq.0) then write(*,*) ! for new line write(*,*) 'Matrix Multiplication C = A[', num_m, ',', . num_k, '] x B[', num_k, ',', num_n, ']' write(*,*) ! for new line call ffflush(6) endif do i = 1, ntrans avg_t(i) = 0.0d0 avg_mf(i) = 0.0d0 enddo do itime = 1, ntimes do i = 1, ntrans call ga_sync() ta = transa(i) tb = transb(i) t1 = util_timer() call ga_dgemm(ta,tb,num_m,num_n,num_k, & 1.0d0, g_a, g_b, 0.0d0, g_c) t1 = util_timer() - t1 if (me.eq.0) then mf = 2d0*num_m*num_n*num_k/t1*1d-6/ga_nnodes() avg_t(i) = avg_t(i)+t1 avg_mf(i) = avg_mf(i) + mf write(6,200) ' Run#', itime, t1, mf, ta, tb call ffflush(6) if (verify .AND. itime.eq.1) then call verify_ga_dgemm(ta, tb, num_m, num_n, num_k, & 1.0d0, g_a, g_b, 0.0d0, g_c,tmpa,tmpb,tmpc) endif endif enddo enddo if (ga_nodeid().eq.0) then write(*,*) ! for new line do i = 1, ntrans write(6,200) 'Average:',0,avg_t(i)/ntimes, . avg_mf(i)/ntimes,transa(i),transb(i) enddo if(verify) write(*,*) 'All ga_dgemms are verified...O.K.' write(*,*) ! for new line call ffflush(6) endif c c call ga_print(g_a) c call ga_print(g_b) c call ga_print(g_c) c if (.not.ga_destroy(g_c)) then call ga_error('failed: destroy g_c',20) endif if (.not.ga_destroy(g_b)) then call ga_error('failed: destroy g_b',30) endif if (.not.ga_destroy(g_a)) then call ga_error('failed: destroy g_a',40) endif enddo #endif 200 format(a15, i2, ': ', e12.4, ' seconds ',f12.1, . ' mflops/proc ', 3a2) call ga_pgroup_set_default(ga_pgroup_get_world()) call ga_sync() call ga_terminate call MP_FINALIZE() c end c c----------------------------------------------------------------------- c Verify for correctness. Process 0 computes BLAS dgemm c locally. For larger arrays, disbale this test as memory c might not be sufficient c subroutine verify_ga_dgemm(xt1, xt2, num_m, num_n, num_k, $ alpha, g_a, g_b, beta, g_c, tmpa, tmpb, tmpc) implicit none character *1 xt1, xt2 integer num_m, num_n, num_k, g_a, g_b, g_c double precision alpha, beta real *8 tmpa(num_m,num_k), tmpb(num_k,num_n), tmpc(num_m,num_n) integer i,j,type,dim1, dim2 real *8 abs_value #include "mafdecls.fh" #include "testutil.fh" #include "galinalg.fh" do i = 1,num_n do j = 1, num_m tmpc(j,i) = -1.0 tmpa(j,i) = -2.0 enddo enddo call ga_inquire(g_a, type, dim1, dim2) call ga_get(g_a, 1, dim1, 1, dim2, tmpa, dim1) call ga_inquire(g_b, type, dim1, dim2) call ga_get(g_b, 1, dim1, 1, dim2, tmpb, dim1) c compute dgemm sequentially call dgemm(xt1, xt2, num_m, num_n, num_k, alpha, & tmpa, num_m, tmpb, num_k, beta, tmpc, num_m) c after computing c locally, verify it with the values in g_c call ga_inquire(g_c, type, dim1, dim2) call ga_get(g_c, 1, dim1, 1, dim2, tmpa, dim1) do i = 1,num_n do j = 1, num_m abs_value = abs(tmpc(j,i)-tmpa(j,i)) if(abs_value .gt. 1.0 .OR. abs_value .lt. -1.0) then write(*,*) 'Values are = ', tmpc(j,i), tmpa(j,i) write(*,*) 'Values are = ', abs(tmpc(j,i)-tmpa(j,i)), . abs_value call ffflush(6) call ga_error('verify ga_dgemm failed', 0) endif enddo enddo return end c c----------------------------------------------------------------------- c called by process '0' (or your master process ) c subroutine load_ga(handle,f, dim1,dim2) implicit none integer handle integer dim1,dim2,i real*8 f(dim1,dim2) #include "mafdecls.fh" if(dim1.le.0)return if(dim2.le.0)return call ga_put(handle, 1, dim1, 1, dim2, f, dim1) return end c c----------------------------------------------------------------------- c must be called by all processors, if you need to fillup the c entire array c subroutine load_ga_from_square(handle,num,f,ndim) implicit none integer handle, memhandle integer num,ndim real*8 f(ndim,ndim) integer ilo, ihi, jlo, jhi, nx, ny, ibuff integer ga_nodeid, i1, i2, i, j, ix, jx #include "mafdecls.fh" call ga_distribution(handle, ga_nodeid(), ilo, ihi, jlo, jhi) if(ihi.le.0)return if(jhi.le.0)return c nx = ihi - ilo + 1 c ny = jhi - jlo + 1 do i = ilo,ihi,ndim do j = jlo,jhi,ndim call ga_put(handle,i,min(ihi,i+ndim),j,min(jhi,j+ndim), & f,ndim) enddo enddo return end c c----------------------------------------------------------------------- c must be called by all processors, if you need to fillup the c entire array c subroutine load_ga_from_triangle(handle,f,ndim) implicit none integer handle, memhandle real*8 f(*) integer ndim integer ilo, ihi, jlo, jhi, nx, ny, ibuff integer ga_nodeid, i1, i2, i, j, ix, jx #include "mafdecls.fh" call ga_distribution(handle, ga_nodeid(), ilo, ihi, jlo, jhi) if(ihi.le.0)return if(jhi.le.0)return nx = ihi - ilo + 1 ny = jhi - jlo + 1 if (.not.ma_alloc_get(MT_DBL,nx*ny,'flap',memhandle,ibuff)) then call ga_error('failed: allocate triangle',100) endif do i = 1,nx do j = 1,ny ix = i + ilo - 1 jx = j + jlo - 1 i1 = min(ix,jx) i2 = max(ix,jx) dbl_mb(ibuff + nx*(j-1) + (i-1) ) = f(i2*(i2-1)/2 + i1) enddo enddo call ga_put(handle,ilo,ihi,jlo,jhi, & dbl_mb(ibuff),nx) if (.not.ma_free_heap(memhandle)) then call ga_error('failed: free triangle',100) endif return end ga-5-4/global/testing/nga-scatter.m40000644000175000017500000000055712662210457015433 0ustar mbambadivert(-1) # what kind of data type to test? define(m4_test_int, `yes') define(m4_test_dbl, `yes') define(m4_test_dcpl, `yes') # test dimension from which to which? define(m4_dim_from, 1) define(m4_dim_to, 7) # functions to test define(m4_test_NGA_SCATTER, `yes') define(m4_test_NGA_SCATTER_ACC, `yes') divert include(`ngatest_src/ngatest.def') ga-5-4/global/testing/mulmatpatchc.c0000644000175000017500000002201212662210460015567 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include "ga.h" #include "macdecls.h" #include "mp3.h" #include "xgemm.h" #if defined(FUJITSU) || defined(CRAY_YMP) # define THRESH 1.0e-10 #else # define THRESH 1.0e-20 #endif #define ABS(x) ((x) >= 0.0 ? (x) : -(x)) #define MAX(x,y) ((x) >= (y) ? (x) : (y)) #define MISMATCH(x,y) (ABS((x)-(y)) / MAX(1.0,ABS((x)))) > THRESH #define NMAX 100 #define POW2(x) ((x)*(x)) #define POW4(x) ((x)*(x)*(x)*(x)) #define SPECIFIC_CASE 0 #define VERBOSE 0 static void dpatch_test( int size, int dist_same, int ampos, int akpos, int bkpos, int bnpos, int cmpos, int cnpos); static void dpatch_test2(); int main(int argc, char **argv) { int bufsize, gasize; time_t t; long seed; int sizes[] = {10, 50, 100}; int s, same_dist, ampos, akpos, bkpos, bnpos, cmpos, cnpos; MP_INIT(argc,argv); GA_Initialize_args(&argc,&argv); if (0 == GA_Nodeid()) { printf(" GA initialized\n"); fflush(stdout); } /* we need srandom seed to be the same on all procs */ t = time(NULL); seed = (long)t; GA_Lgop(&seed, 1, "max"); srandom(seed); #if VERBOSE printf("seed=%ld\n", seed); fflush(stdout); #endif GA_Sync(); /* we want to force distribution of innermost loop in nga_mulmat_patch by providing less buffer memory than needed */ if(GA_Uses_ma()) { gasize = (POW4(NMAX) * 3)/GA_Nnodes(); } else { gasize = 0; } bufsize = (NMAX/2 + 1)*(NMAX/3 + 1)*2 + POW2(NMAX/2 + 1); bufsize = bufsize*6/7; if (!MA_init(MT_DBL, 10, gasize+bufsize+500000)) { GA_Error("MA_init failed", -1); } if (0 == GA_Nodeid()) { printf(" \n"); printf(" CHECKING MATRIX MULTIPLICATION FOR PATCHES \n"); #if VERBOSE printf("gasize and bufsize are %d %d\n", gasize, bufsize); #endif printf(" \n"); fflush(stdout); } #if SPECIFIC_CASE dpatch_test(10, 0, 0, 1, 1, 2, 2, 3); #else for (s=0; s<1; ++s) { for (same_dist=0; same_dist<2; ++same_dist) { for (ampos=0; ampos<4; ++ampos) { for (akpos=ampos+1; akpos<4; ++akpos) { for (bkpos=0; bkpos<4; ++bkpos) { for (bnpos=bkpos+1; bnpos<4; ++bnpos) { for (cmpos=0; cmpos<4; ++cmpos) { for (cnpos=cmpos+1; cnpos<4; ++cnpos) { dpatch_test(sizes[s], same_dist, ampos, akpos, bkpos, bnpos, cmpos, cnpos); } } } } } } } } #endif #if 0 dpatch_test2(); #endif if(0 == GA_Nodeid()) { printf(" All tests successful \n"); fflush(stdout); } GA_Terminate(); MP_FINALIZE(); return 0; } /** * We start with a 4-dimensional array and multiply various 2D patches, * comparing results against a locally computed dgemm. */ static void dpatch_test( int size, int dist_same, int ampos, int akpos, int bkpos, int bnpos, int cmpos, int cnpos) { const int ndim=4; double *a, *b, *c, *r, *v; double alpha, beta; int nproc, me; int i, j; int dims[4], chunk[4], rld[3]; int alo[4], ahi[4], ald[3]; int blo[4], bhi[4], bld[3]; int clo[4], chi[4], cld[3]; int g_a, g_b, g_c; char ta, tb; int m, n, k; me = GA_Nodeid(); nproc = GA_Nnodes(); assert(size <= NMAX); #if SPECIFIC_CASE m = 1; n = 1; k = 4; #else m = random() % (size/2); n = random() % (size/2); k = random() % (size/2); if (m<=0) m = 1; if (n<=0) n = 1; if (k<=0) k = 1; #endif if (0 == me) { printf("size=%d, dist_same=%d ampos=%d akpos=%d bkpos=%d bnpos=%d cmpos=%d cnpos=%d m=%d n=%d k=%d\n", size, dist_same, ampos, akpos, bkpos, bnpos, cmpos, cnpos, m, n, k); fflush(stdout); } a = malloc(sizeof(double)*size*size); b = malloc(sizeof(double)*size*size); c = malloc(sizeof(double)*size*size); r = malloc(sizeof(double)*size*size); memset(a, 0, sizeof(double)*size*size); memset(b, 0, sizeof(double)*size*size); memset(c, 0, sizeof(double)*size*size); memset(r, 0, sizeof(double)*size*size); /* establish the shape and default chunking of the global arrays */ for (i=0; i Checking NGA_Matmul_patch ... \n"); fflush(stdout); } #endif /* fill the g_a and g_b global arrays entirely with data */ for (i=0; i0) ald[ampos-1] = m; if (akpos>0) ald[akpos-1] = k; bhi[bkpos] += k - 1; bhi[bnpos] += n - 1; if (bkpos>0) bld[bkpos-1] = k; if (bnpos>0) bld[bnpos-1] = n; chi[cmpos] += m - 1; chi[cnpos] += n - 1; if (cmpos>0) cld[cmpos-1] = m; if (cnpos>0) cld[cnpos-1] = n; #if 0 printf("a[%d:%d,%d:%d,%d:%d,%d:%d] %dx%dx%dx%d (%dx%d)\n", alo[0], ahi[0], alo[1], ahi[1], alo[2], ahi[2], alo[3], ahi[3], m, 1, k, 1, m, k); printf("ald={%d,%d,%d}\n", ald[0], ald[1], ald[2]); printf("b[%d:%d,%d:%d,%d:%d,%d:%d] %dx%dx%dx%d (%dx%d)\n", blo[0], bhi[0], blo[1], bhi[1], blo[2], bhi[2], blo[3], bhi[3], 1, k, 1, n, k, n); printf("bld={%d,%d,%d}\n", bld[0], bld[1], bld[2]); printf("c[%d:%d,%d:%d,%d:%d,%d:%d] %dx%dx%dx%d (%dx%d)\n", clo[0], chi[0], clo[1], chi[1], clo[2], chi[2], clo[3], chi[3], m, 1, 1, n, m, n); printf("cld={%d,%d,%d}\n", cld[0], cld[1], cld[2]); #endif /* reset our buffers, just in case */ memset(a, 0, sizeof(double)*size*size); memset(b, 0, sizeof(double)*size*size); memset(c, 0, sizeof(double)*size*size); memset(r, 0, sizeof(double)*size*size); /* get patches locally and compute locally */ NGA_Get(g_a, alo, ahi, a, ald); NGA_Get(g_b, blo, bhi, b, bld); GA_Sync(); ta = 'n'; tb = 'n'; alpha = 1e0; beta = 0e0; xb_dgemm(&tb, &ta, &n, &m, &k, &alpha, b, &n, a, &k, &beta, c, &n); /* perform global computation */ NGA_Matmul_patch(ta, tb, &alpha, &beta, g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); GA_Sync(); /* get global result into local buf and compare results */ NGA_Get(g_c, clo, chi, r, cld); GA_Sync(); for (i=0; i<1; ++i) { if (MISMATCH(c[i],r[i])) { printf("at %d %f != %f\n", i, c[i], r[i]); GA_Error("mismatch", 1); } } free(a); free(b); free(c); free(r); GA_Destroy(g_a); GA_Destroy(g_b); GA_Destroy(g_c); } static void dpatch_test2() { } ga-5-4/global/testing/testc.c0000644000175000017500000000604712662210460014241 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define N 100 /* dimension of matrices */ void do_work() { int ONE=1 ; /* useful constants */ int g_a, g_b; int n=N, type=MT_F_DBL; int me=GA_Nodeid(), nproc=GA_Nnodes(); int i, row; int dims[2]={N,N}; int lo[2], hi[2]; /* Note: on all current platforms DoublePrecision == double */ double buf[N], err, alpha, beta; if(me==0)printf("Creating matrix A\n"); g_a = NGA_Create(type, 2, dims, "A", NULL); if(!g_a) GA_Error("create failed: A",n); if(me==0)printf("OK\n"); if(me==0)printf("Creating matrix B\n"); /* create matrix B so that it has dims and distribution of A*/ g_b = GA_Duplicate(g_a, "B"); if(! g_b) GA_Error("duplicate failed",n); if(me==0)printf("OK\n"); GA_Zero(g_a); /* zero the matrix */ if(me==0)printf("Initializing matrix A\n"); /* fill in matrix A with random values in range 0.. 1 */ lo[1]=0; hi[1]=n-1; for(row=me; row #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define N 100 /* dimension of matrices */ int main( int argc, char **argv ) { int g_a, g_b, i, j, size, size_me; int icnt, idx, jdx, ld; int n=N, type=MT_C_INT, one; int *values, *ptr; int **indices; int dims[2]={N,N}; int lo[2], hi[2]; int heap=3000000, stack=2000000; int me, nproc; int datatype, elements; double *prealloc_mem; MP_INIT(argc,argv); #if 1 GA_INIT(argc,argv); /* initialize GA */ me=GA_Nodeid(); nproc=GA_Nnodes(); if(me==0) { if(GA_Uses_fapi())GA_Error("Program runs with C array API only",1); printf("\nUsing %ld processes\n",(long)nproc); fflush(stdout); } heap /= nproc; stack /= nproc; if(! MA_init(MT_F_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ /* Create a regular matrix. */ if(me==0)printf("\nCreating matrix A of size %d x %d\n",N,N); g_a = NGA_Create(type, 2, dims, "A", NULL); if(!g_a) GA_Error("create failed: A",n); /* Fill matrix using scatter routines */ size = N*N; if (size%nproc == 0) { size_me = size/nproc; } else { i = size - size%nproc; size_me = i/nproc; if (me < size%nproc) size_me++; } /* Check that sizes are all okay */ i = size_me; GA_Igop(&i,1,"+"); if (i != size) { GA_Error("Sizes don't add up correctly: ",i); } else if (me==0) { printf("\nSizes add up correctly\n"); } /* Allocate index and value arrays */ indices = (int**)malloc(size_me*sizeof(int*)); values = (int*)malloc(size_me*sizeof(int)); icnt = me; for (i=0; i= N || idx < 0) { printf("p[%d] Bogus index i: %d\n",me,idx); } if (jdx >= N || jdx < 0) { printf("p[%d] Bogus index j: %d\n",me,jdx); } indices[i] = (int*)malloc(2*sizeof(int)); (indices[i])[0] = idx; (indices[i])[1] = jdx; icnt += nproc; } /* Scatter values into g_a */ NGA_Scatter(g_a, values, indices, size_me); GA_Sync(); /* Check to see if contents of g_a are correct */ NGA_Distribution( g_a, me, lo, hi ); NGA_Access(g_a, lo, hi, &ptr, &ld); for (i=lo[0]; i #include #include "mp3.h" #include "ga.h" #include "macdecls.h" #include "xgemm.h" void load_ga(int handle, double *f, int dim1, int dim2); void verify_ga_dgemm(char xt1, char xt2, int num_m, int num_n, int num_k, double alpha, int g_a, int g_b, double beta, int g_c, double *tmpa, double *tmpb, double *tmpc); #define dgemm_verify 1 #define nummax 1024 #define howmany 2 #define ntrans 4 /* * test ga_dgemm * Note: - change nummax for large arrays * - turn off "dgemm_verify" for large arrays due to memory * limitations, as dgemm_verify=1 for large arrays produces * segfault, dumps core,or any crap. */ int main(int argc, char **argv) { int num_m; int num_n; int num_k; int i; int ii; double *h0; int g_c; int g_b; int g_a; double a; double t1; double mf; double avg_t[ntrans]; double avg_mf[ntrans]; int itime; int ntimes; int me; int nums_m[/*howmany*/] = {512,1024}; int nums_n[/*howmany*/] = {512,1024}; int nums_k[/*howmany*/] = {512,1024}; char transa[/*ntrans*/] = "ntnt"; char transb[/*ntrans*/] = "nntt"; char ta; char tb; double *tmpa; double *tmpb; double *tmpc; int ndim; int dims[2]; #ifdef BLOCK_CYCLIC int block_size[2]; #endif MP_INIT(argc,argv); if (!MA_init(MT_DBL,1,20000000)) { GA_Error("failed: ma_init(MT_DBL,1,20000000)",10); } GA_INIT(argc,argv); me = GA_Nodeid(); h0 = (double*)malloc(sizeof(double) * nummax*nummax); tmpa = (double*)malloc(sizeof(double) * nummax*nummax); tmpb = (double*)malloc(sizeof(double) * nummax*nummax); tmpc = (double*)malloc(sizeof(double) * nummax*nummax); ii = 0; for (i=0; i nummax) { ii = 0; } h0[i] = ii; } /* Compute times assuming 500 mflops and 5 second target time */ /* ntimes = max(3.0d0,5.0d0/(4.0d-9*num**3)); */ ntimes = 5; for (ii=0; ii nummax || num_n > nummax || num_k > nummax) { GA_Error("Insufficient memory: check nummax", 1); } #ifndef BLOCK_CYCLIC ndim = 2; dims[0] = num_m; dims[1] = num_n; if (!((g_c = NGA_Create(MT_DBL,ndim,dims,"g_c",NULL)))) { GA_Error("failed: create g_c",20); } dims[0] = num_k; dims[1] = num_n; if (!((g_b = NGA_Create(MT_DBL,ndim,dims,"g_b",NULL)))) { GA_Error("failed: create g_b",30); } dims[0] = num_m; dims[1] = num_k; if (!((g_a = NGA_Create(MT_DBL,ndim,dims,"g_a",NULL)))) { GA_Error("failed: create g_a",40); } #else ndim = 2; block_size[0] = 128; block_size[1] = 128; dims[0] = num_m; dims[1] = num_n; g_c = GA_Create_handle(); GA_Set_data(g_c,ndim,dims,MT_DBL); GA_Set_array_name(g_c,"g_c"); GA_Set_block_cyclic(g_c,block_size); if (!GA_Allocate(g_c)) { GA_Error("failed: create g_c",40); } dims[0] = num_k; dims[1] = num_n; g_b = GA_Create_handle(); GA_Set_data(g_b,ndim,dims,MT_DBL); GA_Set_array_name(g_b,"g_b"); GA_Set_block_cyclic(g_b,block_size); if (!ga_allocate(g_b)) { GA_Error("failed: create g_b",40); } dims[0] = num_m; dims[1] = num_k; g_a = GA_Create_handle(); GA_Set_data(g_a,ndim,dims,MT_DBL); GA_Set_array_name(g_a,"g_a"); GA_Set_block_cyclic(g_a,block_size); if (!ga_allocate(g_a)) { GA_Error('failed: create g_a',40); } #endif /* Initialize matrices A and B */ if (me == 0) { load_ga(g_a, h0, num_m, num_k); load_ga(g_b, h0, num_k, num_n); } GA_Zero(g_c); GA_Sync(); if (GA_Nodeid() == 0) { printf("\nMatrix Multiplication on C = A[%ld,%ld]xB[%ld,%ld]\n", (long)num_m, (long)num_k, (long)num_k, (long)num_n); fflush(stdout); } for (i=0; i 1.0 || abs_value < -1.0) { printf("Values are = %f %f\n", tmpc[j+i*num_m], tmpa[j+i*num_m]); printf("Values are = %f %f\n", fabs(tmpc[j+i*num_m]-tmpa[j*i*num_m]), abs_value); fflush(stdout); GA_Error("verify ga_dgemm failed", 1); } } } } /** * called by process '0' (or your master process ) */ void load_ga(int handle, double *f, int dim1, int dim2) { int lo[2], hi[2]; if (dim1 < 0 || dim2 < 0) { return; } lo[0] = 0; lo[1] = 0; hi[0] = dim1-1; hi[1] = dim2-1; NGA_Put(handle, lo, hi, f, &dim1); } /* c c----------------------------------------------------------------------- c must be called by all processors, if you need to fillup the c entire array c subroutine load_ga_from_square(handle,num,f,ndim) implicit none integer handle, memhandle integer num,ndim real*8 f(ndim,ndim) integer ilo, ihi, jlo, jhi, nx, ny, ibuff integer ga_nodeid, i1, i2, i, j, ix, jx #include "mafdecls.fh" call ga_distribution(handle, ga_nodeid(), ilo, ihi, jlo, jhi) if(ihi.le.0)return if(jhi.le.0)return c nx = ihi - ilo + 1 c ny = jhi - jlo + 1 do i = ilo,ihi,ndim do j = jlo,jhi,ndim call ga_put(handle,i,min(ihi,i+ndim),j,min(jhi,j+ndim), & f,ndim) enddo enddo return end */ /* c c----------------------------------------------------------------------- c must be called by all processors, if you need to fillup the c entire array c subroutine load_ga_from_triangle(handle,f,ndim) implicit none integer handle, memhandle real*8 f(*) integer ndim integer ilo, ihi, jlo, jhi, nx, ny, ibuff integer ga_nodeid, i1, i2, i, j, ix, jx #include "mafdecls.fh" call ga_distribution(handle, ga_nodeid(), ilo, ihi, jlo, jhi) if(ihi.le.0)return if(jhi.le.0)return nx = ihi - ilo + 1 ny = jhi - jlo + 1 if (.not.ma_alloc_get(MT_DBL,nx*ny,'flap',memhandle,ibuff)) then call ga_error('failed: allocate triangle',100) endif do i = 1,nx do j = 1,ny ix = i + ilo - 1 jx = j + jlo - 1 i1 = min(ix,jx) i2 = max(ix,jx) dbl_mb(ibuff + nx*(j-1) + (i-1) ) = f(i2*(i2-1)/2 + i1) enddo enddo call ga_put(handle,ilo,ihi,jlo,jhi, & dbl_mb(ibuff),nx) if (.not.ma_free_heap(memhandle)) then call ga_error('failed: free triangle',100) endif return end */ ga-5-4/global/testing/big.c0000644000175000017500000000440412662210457013661 0ustar mbamba/* * As reported by yanait@gmail.com, large (16GB) arrays caused seeg fault on * 2 nodes 2 cores per node. * * The following program (just doing ga_acc to 16GB GA (Array * Dimensions:8192x262144) did not work, resulting in segmentation fault. * * % mpirun -npernode 2 -np 4 ./a.out * * Process=0 (node#0) owns array section: [0:4095,0:131071] * Process=1 (node#0) owns array section: [0:4095,131072:262143] * Process=2 (node#1) owns array section: [4096:8191,0:131071] * Process=3 (node#1) owns array section: [4096:8191,131072:262143] * * I found that a couple of subroutines in armci fail to handle large-size * arrays. * My debugging showed that the variables of int type overflow to calculate * address or pointer (over 2GB). * I made a patch file (see below). * This is related to my previous post regarding the kr_shmem_free error in * ga_matmul (also using ga_acc). */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "mp3.h" #include "ga.h" #include "macdecls.h" /* create N1 x N2 matrix (double precision) */ #define N1 1024*8 #define N2 1024*256 int main(int argc, char **argv) { int me, nproc, g_a, i, j; int ndim=2, type=MT_F_DBL, dims[2]={N1,N2}; double *buf; int lo[2], hi[2], ld[1]; double alpha = 1.0; MP_INIT(argc,argv); GA_Initialize_ltd(-1); me=GA_Nodeid(); nproc=GA_Nnodes(); if(me==0) printf("Using %ld processes\n",(long)nproc); if(me==0) printf("memory = %ld bytes\n",((long)N1)*((long)N2)*8); g_a = NGA_Create(type, ndim, dims, "A", NULL); GA_Zero(g_a); /* zero the matrix */ GA_Print_distribution(g_a); if(me == 0) { buf = (double*)(malloc(N1*1024*sizeof(double))); for(j = 0; j < N1*1024; ++j) buf[j] = 1.0; for(i = 0; i < N2/1024; ++i) { lo[0] = 0; hi[0] = lo[0] + N1 -1; lo[1] = i*1024; hi[1] = lo[1] + 1024 -1; ld[0] = 1024; printf("NGA_Acc.%d: %d:%d %d:%d\n",i,lo[0],hi[0],lo[1],hi[1]); NGA_Init_fence(); NGA_Acc(g_a, lo, hi, buf, ld, &alpha); NGA_Fence(); } } GA_Sync(); GA_Destroy(g_a); GA_Terminate(); MP_FINALIZE(); return 0; } ga-5-4/global/testing/blktest.F0000644000175000017500000006640412662210457014543 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF #define USE_SCALAPACK 0 #define SMALL_TEST 1 program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM #if SMALL_TEST parameter (nmax = 8, DIM = 2) #else parameter (nmax = 2375, DIM = 2) #endif integer ndim, nprocs, type, length integer g_a, g_b, g_c, g_d, g_e, g_f, g_h, g_i, g_j, inode MA_ACCESS_INDEX_TYPE index integer i, j, k, nb, dims(7) integer lo(7), hi(7), tlo(7), thi(7), t2lo(7), t2hi(7) integer block_list(10000), block_map(10000), nblock integer chunk(7), ld(7), block(7), proc_grid(7) integer a(nmax, nmax),b(nmax,nmax),e(nmax,nmax),f(nmax,nmax) integer skip(7), i_one, ialpha, ibeta, check_int double precision c(nmax,nmax),d(nmax,nmax), one, ddot double precision alpha, beta logical status parameter (heap=400*400*4, fudge=100, stack=400*400*4) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c call ga_initialize() me = ga_nodeid() c ma_heap = heap + fudge c if(me.eq.0)then write(6,100) call ffflush(6) 100 format(' GA initialized') endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DBL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then write(6,101) ga_nnodes() call ffflush(6) 101 format(' Using ',i3,' process(es)') endif c c Create GA c ndim = DIM do i = 1, ndim dims(i) = nmax ld(i) = nmax lo(i) = 1 hi(i) = nmax chunk(i) = -1 #if SMALL_TEST block(i) = 2 #else block(i) = 87 #endif end do proc_grid(1) = 2 proc_grid(2) = ga_nnodes()/2 c g_a = ga_create_handle() call ga_set_data(g_a, ndim, dims, MT_F_INT) call ga_set_chunk(g_a, chunk) #if USE_SCALAPACK call ga_set_block_cyclic_proc_grid(g_a, block, proc_grid) #else call ga_set_block_cyclic(g_a, block) #endif status = ga_allocate(g_a) call ga_zero(g_a) c g_b = ga_create_handle() call ga_set_data(g_b, ndim, dims, MT_F_DBL) call ga_set_chunk(g_b, chunk) #if USE_SCALAPACK call ga_set_block_cyclic_proc_grid(g_b, block, proc_grid) #else call ga_set_block_cyclic(g_b, block) #endif status = ga_allocate(g_b) call ga_zero(g_b) c g_c = ga_create_handle() call ga_set_data(g_c, ndim, dims, MT_F_INT) call ga_set_chunk(g_c, chunk) status = ga_allocate(g_c) call ga_zero(g_c) c g_d = ga_create_handle() call ga_set_data(g_d, ndim, dims, MT_F_INT) call ga_set_chunk(g_d, chunk) #if USE_SCALAPACK call ga_set_block_cyclic_proc_grid(g_d, block, proc_grid) #else call ga_set_block_cyclic(g_d, block) #endif status = ga_allocate(g_d) call ga_zero(g_d) c g_e = ga_create_handle() call ga_set_data(g_e, ndim, dims, MT_F_DBL) call ga_set_chunk(g_e, chunk) #if USE_SCALAPACK call ga_set_block_cyclic_proc_grid(g_e, block, proc_grid) #else call ga_set_block_cyclic(g_e, block) #endif status = ga_allocate(g_e) call ga_zero(g_e) c g_f = ga_create_handle() call ga_set_data(g_f, ndim, dims, MT_F_DBL) call ga_set_chunk(g_f, chunk) #if USE_SCALAPACK call ga_set_block_cyclic_proc_grid(g_f, block, proc_grid) #else call ga_set_block_cyclic(g_f, block) #endif status = ga_allocate(g_f) call ga_zero(g_f) c g_h = ga_create_handle() call ga_set_data(g_h, ndim, dims, MT_F_DBL) call ga_set_chunk(g_h, chunk) status = ga_allocate(g_h) call ga_zero(g_h) c g_i = ga_create_handle() call ga_set_data(g_i, ndim, dims, MT_F_DBL) call ga_set_chunk(g_i, chunk) status = ga_allocate(g_i) call ga_zero(g_i) c g_j = ga_create_handle() call ga_set_data(g_j, ndim, dims, MT_F_DBL) call ga_set_chunk(g_j, chunk) status = ga_allocate(g_j) call ga_zero(g_j) c if(me.eq.0)then write(6,102) call ffflush(6) 102 format(' Completed allocation of GAs') endif c c Initialize local arrays c #if SMALL_TEST tlo(1) = 3 thi(1) = 4 tlo(2) = 4 thi(2) = 7 t2lo(1) = 4 t2hi(1) = 5 t2lo(2) = 5 t2hi(2) = 8 #else tlo(1) = 3 thi(1) = 2277 tlo(2) = 4 thi(2) = 1832 t2lo(1) = 4 t2hi(1) = 2278 t2lo(2) = 5 t2hi(2) = 1833 #endif c one = 1.0d00 i_one = 1 k = 1 do i = 1, nmax do j = 1, nmax a(i,j) = k b(i,j) = 0 c(i,j) = dble(k) d(i,j) = 0.0d00 e(i,j) = 0 f(i,j) = 0 k = k + 1 end do end do c c Test PUT and GET c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Put and GA_Get...' write(6,*) endif c c Copy data from local array to global array c if (me.eq.0) then call nga_put(g_a,lo,hi,a,ld) endif c c Copy data from global array back to local array c call ga_sync call nga_get(g_a,lo,hi,e,ld) call ga_sync c do j = 1, nmax do i = 1, nmax if (a(i,j).ne.e(i,j)) then write(6,103) me,a(i,j),e(i,j) call ga_error('GA PUT and GET failed',me) endif e(i,j) = 0 end do end do 103 format('proc: ',i4,' a(i,j): ',i8,' e(i,j): ',i8) if (me.eq.0) then write(6,*) write(6,*) 'GA_Put and GA_Get are OK' write(6,*) endif c c Test ga_add c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Add...' write(6,*) endif if (me.eq.0) then call nga_put(g_c,lo,hi,a,ld) endif ialpha = 1 ibeta = -1 call ga_add(ialpha, g_a, ibeta, g_c, g_c) if (ga_idot(g_c,g_c).eq.0) then if(me.eq.0)then write(6,*) write(6,*) 'GA_Add operation for regular and block-cyclic', + ' arrays is OK' write(6,*) call ffflush(6) endif else if(me.eq.0)then write(6,*) write(6,*) 'GA_Add operation for regular and block-cyclic', + ' arrays is not OK' write(6,*) call ga_error('exiting', 1) call ffflush(6) endif endif c c Check add between two block-cyclic arrays c if (me.eq.0) then call nga_put(g_d,lo,hi,a,ld) endif call ga_add(ialpha, g_a, ialpha, g_d, g_d) c c Copy data to local buffer and then back to regular array c call nga_get(g_d,lo,hi,b,ld) if (me.eq.0) then call nga_get(g_c,lo,hi,b,ld) endif call ga_sync if (ga_idot(g_c,g_c).eq.0) then if(me.eq.0)then write(6,*) write(6,*) 'GA_Add operation for two block-cyclic', + ' arrays is OK' write(6,*) call ffflush(6) endif else if(me.eq.0)then write(6,*) write(6,*) 'GA_Add operation for two block-cyclic arrays', + ' is not OK' write(6,*) call ga_error('exiting', 1) call ffflush(6) endif endif c c Check to find which blocks correspond to local patch c #if SMALL_TEST if (me.eq.0) then write(6,*) write(6,*) 'Check nga_locate_region and nga_locate_num_blocks' write(6,*) 'functions' write(6,*) write(6,*) 'Printing original matrix' do i = 1, min(nmax,8) write(6,200) (a(i,j),j=1,min(nmax,8)) end do endif status=nga_locate_region(g_a,tlo,thi,block_map,block_list,nblock) nb = nga_locate_num_blocks(g_a,tlo,thi) if (me.eq.0) then write(6,*) write(6,111) nb do i = 1, nblock write(6,110) i,block_list(i),block_map(4*(i-1)+1), + block_map(4*(i-1)+3),block_map(4*(i-1)+2), + block_map(4*(i-1)+4) end do endif 110 format(i3,' block(',i3,') tlo(1): ',i3,' thi(1): ',i3, + ' tlo(2): ',i3,' thi(2): ',i3) 111 format(' Number of blocks: ',i3) if (me.eq.0) then call nga_access_block_segment(g_a,me,index,length) call print_block(int_mb(index),length) endif #endif c c Check onesided accumulate c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Acc...' write(6,*) endif if (me.eq.0) then call nga_acc(g_b,lo,hi,c,ld,one) endif call ga_sync if (me.eq.0) then call nga_acc(g_b,lo,hi,c,ld,one) endif call ga_sync if (me.eq.0) then call nga_put(g_h,lo,hi,c,ld) endif alpha = 1.0 beta = -2.0 call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Acc is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Acc is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check copy c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Copy...' write(6,*) endif call ga_copy(g_a, g_c) call ga_copy(g_c, g_d) call ga_add(ialpha,g_a,ibeta,g_d,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check zero c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Zero...' write(6,*) call nga_get(g_a,lo,hi,a,ld) endif call ga_sync call ga_zero(g_a) call ga_copy(g_a,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Zero is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Zero is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check scale c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Scale...' write(6,*) endif if (me.eq.0) then call nga_put(g_b,lo,hi,c,ld) call nga_put(g_h,lo,hi,c,ld) endif call ga_scale(g_b,2.0d00) call ga_scale(g_h,2.0d00) alpha = 1.0d00 beta = -1.0d00 call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Scale is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Scale is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check fill c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Fill...' write(6,*) endif call ga_fill(g_a,1) call ga_fill(g_c,1) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Fill is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Fill is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check zero_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Zero_patch...' write(6,*) endif call ga_copy(g_a,g_c) call nga_zero_patch(g_a,tlo,thi) call nga_zero_patch(g_c,tlo,thi) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Zero_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Zero_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check fill_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Fill_patch...' write(6,*) endif call ga_copy(g_a,g_c) call nga_fill_patch(g_a,tlo,thi,2) call nga_fill_patch(g_c,tlo,thi,2) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Fill_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Fill_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check scale_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Scale_patch...' write(6,*) endif call ga_copy(g_a,g_c) call nga_scale_patch(g_a,tlo,thi,2) call nga_scale_patch(g_c,tlo,thi,2) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Scale_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Scale_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c Check copy_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Copy_patch...' write(6,*) endif call ga_fill(g_a,1) call ga_fill(g_c,1) call nga_fill_patch(g_a,tlo,thi,2) call nga_copy_patch('n',g_a,tlo,thi,g_c,t2lo,t2hi) call ga_fill(g_a,1) call nga_fill_patch(g_a,t2lo,t2hi,2) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy_patch from block-cyclic to regular is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy_patch from block-cyclic to regular is', + ' not OK' write(6,*) call ga_error('exiting', 1) endif endif call ga_fill(g_a,1) call ga_fill(g_c,1) call nga_fill_patch(g_c,tlo,thi,2) call nga_copy_patch('n',g_c,tlo,thi,g_a,t2lo,t2hi) call ga_fill(g_c,1) call nga_fill_patch(g_c,t2lo,t2hi,2) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy_patch from regular to block-cyclic is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Copy_patch from regular to block-cyclic is', + ' not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test ga_add_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Add_patch...' write(6,*) endif call ga_zero(g_b) call ga_zero(g_e) call ga_zero(g_f) call ga_zero(g_h) call ga_zero(g_i) call ga_zero(g_j) if (me.eq.0) then call nga_put(g_e,t2lo,t2hi,c,ld) call nga_put(g_f,t2lo,t2hi,c,ld) call nga_put(g_i,t2lo,t2hi,c,ld) call nga_put(g_j,t2lo,t2hi,c,ld) endif call ga_sync call nga_add_patch(one,g_e,t2lo,t2hi,one,g_f,tlo,thi,g_b,tlo,thi) call nga_add_patch(one,g_i,t2lo,t2hi,one,g_j,tlo,thi,g_h,tlo,thi) call ga_add(alpha,g_b,beta,g_h,g_i) if (ga_ddot(g_i,g_i).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Add_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Add_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test ga_ddot c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Ddot...' write(6,*) endif call ga_fill(g_b, 2.0d00) call ga_fill(g_b, 2.0d00) ddot = ga_ddot(g_b, g_b) if (me.eq.0) then write(6,112) ddot,dble(nmax*nmax*4) endif 112 format(' Value of DDOT: ',f12.2,' Expected value: ',f12.2) if (me.eq.0) write(6,*) c c test ga_ddot_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Ddot_patch...' write(6,*) endif ddot = nga_ddot_patch(g_b, 'n', tlo, thi, g_b, 'n', tlo, thi) if (me.eq.0) then write(6,113) ddot,dble((thi(1)-tlo(1)+1)*(thi(2)-tlo(2)+1)*4) endif 113 format(' Value of DDOT_PATCH: ',f12.2,' Expected value: ',f12.2) c c test ga_abs_value_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Abs_patch...' write(6,*) endif call ga_fill(g_a,-1) call ga_abs_value_patch(g_a, tlo, thi) call ga_fill(g_c,-1) call ga_abs_value_patch(g_c, tlo, thi) call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Abs_value_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Abs_value_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test ga_elem_multiply c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Elem_multiply...' write(6,*) endif call ga_fill(g_b, 2.0d00) call ga_fill(g_e, 3.0d00) call ga_zero(g_f) call ga_elem_multiply(g_b, g_e, g_f) call ga_fill(g_h, 2.0d00) call ga_fill(g_i, 3.0d00) call ga_zero(g_j) call ga_elem_multiply(g_h, g_i, g_j) call ga_add(alpha,g_f,beta,g_j,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Elem_multiply is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Elem_multiply is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test ga_elem_divide_patch c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Elem_divide_patch...' write(6,*) endif call ga_fill(g_b, 3.0d00) call ga_elem_divide_patch(g_f,t2lo,t2hi,g_e,tlo,thi,g_b,tlo,thi) call ga_fill(g_h, 3.0d00) call ga_elem_divide_patch(g_j,t2lo,t2hi,g_i,tlo,thi,g_h,tlo,thi) call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Elem_divide_patch is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Elem_divide_patch is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test strided get c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Strided_get...' write(6,*) endif skip(1) = 2 skip(2) = 2 call ga_zero(g_a) call ga_zero(g_c) call nga_get(g_a,lo,hi,a,ld) call nga_get(g_c,lo,hi,b,ld) call ga_fill(g_a, 1) call ga_fill(g_c, 1) if (me.eq.0) then call nga_strided_get(g_a,lo,hi,skip,a,ld) call nga_strided_get(g_c,lo,hi,skip,b,ld) endif call ga_sync nb = 0 if (me.eq.0) then do i = 1, nmax do j = 1, nmax if (a(i,j).ne.b(i,j)) nb = nb + 1 end do end do if (nb.eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_get is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_get is not OK' write(6,*) call ga_error('exiting', 1) endif endif endif c c test strided put c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Strided_put...' write(6,*) endif call ga_fill(g_a, 1) if (me.eq.0) call nga_get(g_a,lo,hi,a,ld) call ga_zero(g_a) call ga_fill(g_c, 1) if (me.eq.0) call nga_get(g_c,lo,hi,b,ld) call ga_zero(g_c) if (me.eq.0) then call nga_strided_put(g_a,lo,hi,skip,a,ld) call nga_strided_put(g_c,lo,hi,skip,b,ld) endif call ga_sync call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_put is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_put is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test strided accumulate c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Strided_acc...' write(6,*) endif call ga_fill(g_b, 1.0d00) call nga_get(g_b,lo,hi,c,ld) call ga_fill(g_h, 1.0d00) call nga_get(g_h,lo,hi,d,ld) call ga_sync if (me.eq.0) then call nga_strided_acc(g_b,lo,hi,skip,c,ld,one) call nga_strided_acc(g_h,lo,hi,skip,d,ld,one) endif call ga_sync call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_acc is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Strided_acc is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test transpose c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_transpose...' write(6,*) endif k = 0 do i = 1, nmax do j = 1, nmax k = k+1 c(i,j) = dble(k) end do end do if (me.eq.0) then call nga_put(g_b,lo,hi,c,ld) call nga_put(g_h,lo,hi,c,ld) endif call ga_sync call ga_transpose(g_b,g_i) call ga_transpose(g_h,g_j) call ga_add(alpha,g_i,beta,g_j,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Transpose is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Transpose is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test symmetrize c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_symmetrize...' write(6,*) endif if (me.eq.0) then call nga_put(g_b,lo,hi,c,ld) call nga_put(g_h,lo,hi,c,ld) endif call ga_sync call ga_symmetrize(g_b) call ga_symmetrize(g_h) call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Symmetrize is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Symmetrize is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test periodic get c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Periodic_get...' write(6,*) endif tlo(1) = lo(1) + 2 thi(1) = hi(1) + 2 tlo(2) = lo(2) + 2 thi(2) = hi(2) + 2 k = 0 do i = 1, nmax do j = 1, nmax k = k + 1 a(i,j) = k end do end do if (me.eq.0) then call nga_put(g_a,lo,hi,a,ld) call nga_put(g_c,lo,hi,a,ld) endif call ga_sync if (me.eq.0) then call nga_periodic_get(g_a,tlo,thi,a,ld) call nga_periodic_get(g_c,tlo,thi,b,ld) endif call ga_sync nb = 0 if (me.eq.0) then do i = 1, nmax do j = 1, nmax if (a(i,j).ne.b(i,j)) nb = nb + 1 end do end do if (nb.eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_get is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_get is not OK' write(6,*) call ga_error('exiting', 1) endif endif endif c c test periodic put c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Periodic_put...' write(6,*) endif k = 0 do i = 1, nmax do j = 1, nmax k = k + 1 a(i,j) = k end do end do if (me.eq.0) then call nga_periodic_put(g_a,tlo,thi,a,ld) call nga_periodic_put(g_c,tlo,thi,a,ld) endif call ga_sync call ga_add(ialpha,g_a,ibeta,g_c,g_c) if (ga_idot(g_c,g_c).eq.0) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_put is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_put is not OK' write(6,*) call ga_error('exiting', 1) endif endif c c test periodic accumulate c if (me.eq.0) then write(6,*) write(6,*) 'Testing GA_Periodic_acc...' write(6,*) endif call ga_fill(g_b, 1.0d00) call ga_fill(g_h, 1.0d00) call ga_sync if (me.eq.0) then call nga_periodic_acc(g_b,tlo,thi,c,ld,one) call nga_periodic_acc(g_h,tlo,thi,c,ld,one) endif call ga_sync call ga_add(alpha,g_b,beta,g_h,g_h) if (ga_ddot(g_h,g_h).eq.0.0d00) then if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_acc is OK' write(6,*) endif else if (me.eq.0) then write(6,*) write(6,*) 'GA_Periodic_acc is not OK' write(6,*) call ga_error('exiting', 1) endif endif 200 format(8i8) c 300 format(8f8.1) if (me.eq.0) then write(6,302) endif 302 format(' Finished tests: success') status = ga_destroy(g_a) status = ga_destroy(g_b) status = ga_destroy(g_c) status = ga_destroy(g_d) status = ga_destroy(g_e) status = ga_destroy(g_f) call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c subroutine print_block(a,length) implicit none #include "mafdecls.fh" #include "global.fh" integer length, i, j integer a(length) write(6,*) write(6,200) do i=1, 4 write(6,100) (a(4*(j-1)+i), j=1,4) 100 format(8i8) end do 200 format(' Write contents of processor') return end ga-5-4/global/testing/testsolve.F0000644000175000017500000002275212662210460015113 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: testsolve.F,v 1.11 2006/03/20 20:02:29 manoj Exp $ program test implicit none #include "mafdecls.fh" #include "global.fh" integer heap, stack #define BLOCK_CYCLIC 0 c c*** Intitialize a message passing library c #include "mp3.fh" c c Intitialize the GA package c call ga_initialize() c if(ga_nodeid().eq.0)print *,ga_nnodes(),' nodes' c c Initialize the MA package c heap = 190000 stack= 190000 if (.not. ma_init(MT_DBL, heap, stack)) $ call ga_error("ma init failed",heap+stack) c c call testit() c if(ga_nodeid().eq.0) print *,'All tests successful ' c call ga_terminate() c call MP_FINALIZE() end c----------------- subroutine testit() implicit none #include "mafdecls.fh" #include "global.fh" c integer n parameter (n = 100) double precision a(n,n), b(n,n), c(n,n) integer g_a,g_b,g_c,g_d, g_e, g_f, g_g integer g_aa,g_bb,g_cc,g_dd, g_ee, g_ff, g_gg integer i, j integer ndim, dims(2), block(2), proc_grid(2), g1, g2 integer nproc, me double precision dsin, sum logical status c nproc = ga_nnodes() me = ga_nodeid() c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n a(i,j) = 1d0 * (i+j) b(i,j) = DSIN(1d0* (i+j)) if(i.eq.j) then b(i,j) = 2d0 *n a(i,j) = i endif if(i.le.j)then c(i,j) = a(i,j) else c(i,j) = 0d0 endif enddo enddo #if 0 if (me.eq.0) then open(unit=7,file='amat.dat',status='unknown') do i = 1, min(20,n) write(7,128) (a(i,j),j=1,min(20,n)) 128 format(20f6.1) end do endif #endif c c*** Create global arrays #if BLOCK_CYCLIC if (me.eq.0) then write(6,*) '*' write(6,*) '* Creating Block-Cyclic Arrays' write(6,*) '*' endif dims(1) = n dims(2) = n block(1) = 2 block(2) = 2 call factor(nproc,g1,g2) proc_grid(1) = g1 proc_grid(2) = g2 g_a = ga_create_handle() call ga_set_data(g_a,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_a,block,proc_grid) status = ga_allocate(g_a) g_b = ga_create_handle() call ga_set_data(g_b,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_b,block,proc_grid) status = ga_allocate(g_b) g_c = ga_create_handle() call ga_set_data(g_c,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_c,block,proc_grid) status = ga_allocate(g_c) g_d = ga_create_handle() call ga_set_data(g_d,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_d,block,proc_grid) status = ga_allocate(g_d) dims(2) = 1 g_e = ga_create_handle() call ga_set_data(g_e,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_e,block,proc_grid) status = ga_allocate(g_e) g_f = ga_create_handle() call ga_set_data(g_f,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_f,block,proc_grid) status = ga_allocate(g_f) g_g = ga_create_handle() call ga_set_data(g_g,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_g,block,proc_grid) status = ga_allocate(g_g) g_aa = ga_create_handle() dims(2) = n call ga_set_data(g_aa,2,dims,MT_DBL) status = ga_allocate(g_aa) g_bb = ga_create_handle() call ga_set_data(g_bb,2,dims,MT_DBL) status = ga_allocate(g_bb) g_cc = ga_create_handle() call ga_set_data(g_cc,2,dims,MT_DBL) status = ga_allocate(g_cc) g_dd = ga_create_handle() call ga_set_data(g_dd,2,dims,MT_DBL) status = ga_allocate(g_dd) dims(2) = 1 g_ee = ga_create_handle() call ga_set_data(g_ee,2,dims,MT_DBL) status = ga_allocate(g_ee) g_ff = ga_create_handle() call ga_set_data(g_ff,2,dims,MT_DBL) status = ga_allocate(g_ff) g_gg = ga_create_handle() call ga_set_data(g_gg,2,dims,MT_DBL) status = ga_allocate(g_gg) #else if (.not. ga_create(MT_DBL, n, n, 'a', 1, 1, g_a)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, n, 'b', 1, 1, g_b)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, n, 'c', 1, 1, g_c)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, n, 'd', 1, 1, g_d)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, 1, 'e', 1, 1, g_e)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, 1, 'f', 1, 1, g_f)) $ call ga_error(' ga_create failed ',2) if (.not. ga_create(MT_DBL, n, 1, 'g', 1, 1, g_g)) $ call ga_error(' ga_create failed ',2) #endif c c c*** Fill in arrays A & B if (me .eq. 0) then print *, ' filling in A and B ' call ffflush(6) call ga_put(g_e, 1,n, 1,1, b(1,1),n) call ga_put(g_f, 1,n, 1,1, b(1,1),n) endif do j = 1+me, n, nproc call ga_put(g_a, 1,n, j,j, a(1,j),n) call ga_put(g_b, 1,n, j,j, b(1,j),n) call ga_put(g_c, 1,n, j,j, b(1,j),n) enddo call ga_sync() c c call ga_copy(g_b,g_c) c if (me .eq. 0) then print *,' ' print *, '>Test of the LU-based solver with nxn rhs ' print *,' ' call ffflush(6) endif #ifndef HAVE_SCALAPACK call ga_lu_solve_seq('n', g_a, g_b) #else #if BLOCK_CYCLIC call ga_copy(g_a,g_aa) #endif call ga_lu_solve('n', g_a, g_b) #if BLOCK_CYCLIC call ga_copy(g_aa,g_a) #endif #endif #if BLOCK_CYCLIC c call print_block(g_b) call ga_copy(g_b,g_bb) call ga_copy(g_c,g_cc) call ga_copy(g_d,g_dd) call ga_dgemm('n','n',n,n,n, 1d0, g_aa, g_bb, 0d0, g_dd) ! d := a*b call ga_add(1d0, g_dd, -1d0, g_cc, g_cc) sum = ga_ddot(g_cc,g_cc) #else c call print_rblock(g_b) call ga_dgemm('n','n',n,n,n, 1d0, g_a, g_b, 0d0, g_d) ! d := a*b call ga_add(1d0, g_d, -1d0, g_c, g_c) sum = ga_ddot(g_c,g_c) #endif if (me .eq. 0) then print *,' ' print *, ' dsqrt(sum) = ', dsqrt(sum) print *, ' n = ', n print *, ' norm = ', dsqrt(sum)/n if(dsqrt(sum)/n.lt.1d-10) then print *, ' test passed ' else call ga_error(' test failed ',3) endif print *,' ' call ffflush(6) endif c if (me .eq. 0) then print *,' ' print *,'>Test of the LU-based solver with a single vector rhs' print *,' ' call ffflush(6) endif c #ifndef HAVE_SCALAPACK call ga_lu_solve_seq('n', g_a, g_e) #else #if BLOCK_CYCLIC call ga_copy(g_a,g_aa) #endif call ga_lu_solve('n', g_a, g_e) #endif c #if BLOCK_CYCLIC call ga_copy(g_e,g_ee) call ga_copy(g_f,g_ff) call ga_copy(g_g,g_gg) call ga_dgemm('n','n',n,1,n, 1d0, g_aa, g_ee, 0d0, g_gg) ! g := a*e call ga_add(1d0, g_gg, -1d0, g_ff, g_ff) sum = ga_ddot(g_ff,g_ff) #else call ga_dgemm('n','n',n,1,n, 1d0, g_a, g_e, 0d0, g_g) ! g := a*e call ga_add(1d0, g_g, -1d0, g_f, g_f) sum = ga_ddot(g_f,g_f) #endif if (me .eq. 0) then print *,' ' print *, ' norm = ', dsqrt(sum)/n if(dsqrt(sum)/n.lt.1d-10) then print *, ' test passed ' else call ga_error(' test failed ',4) endif print *,' ' call ffflush(6) endif end c subroutine factor(p,idx,idy) implicit none integer i,j,p,idx,idy,it integer ip,ifac,pmax,prime(1280) integer fac(1280) c i = 1 ip = p c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine two factors of p of approximately the c same size c idx = 1 idy = 1 do i = ifac, 1, -1 if (idx.le.idy) then idx = fac(i)*idx else idy = fac(i)*idy endif end do return end c subroutine print_block(g_a) implicit none #include "mafdecls.fh" #include "global.fh" integer g_a, i, j, istride, jstride integer idx, ld, me me = ga_nodeid() istride = 10 if (me.eq.0) then jstride = 6 else jstride = 4 endif call nga_access_block_segment(g_a,me,idx,ld) do i = 1, istride write(6,733) me,(dbl_mb(idx+(j-1)*istride+i-1),j=1,jstride) end do 733 format(i8,8f12.6) return end c subroutine print_rblock(g_a) implicit none #include "mafdecls.fh" #include "global.fh" integer g_a, i, j, istride, jstride integer idx, ld, me, lo(2), hi(2) me = ga_nodeid() istride = 10 jstride = 5 call nga_distribution(g_a,me,lo,hi) call nga_access(g_a,lo,hi,idx,ld) do i = 1, istride write(6,733) me,(dbl_mb(idx+(j-1)*istride+i-1),j=1,jstride) end do 733 format(i8,8f12.6) return end ga-5-4/global/testing/mulmatpatch.F0000644000175000017500000002673212662210457015412 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: mulmatpatch.F,v 1.6 2005-11-23 10:25:18 manoj Exp $ #if (defined(CRAY) && !defined(__crayx1)) || defined(KSR) # define xgemm SGEMM # define ygemm CGEMM #else # define xgemm TEST_DGEMM # define ygemm TEST_ZGEMM #endif #if defined(FUJITSU) || defined(CRAY_YMP) # define THRESH 1.0d-10 #else # define THRESH 1.0d-20 #endif #define MISMATCH(x,y) abs(x-y)/max(1,abs(x)).gt.THRESH #define NMAX 10 c c program test implicit none #include "mafdecls.fh" #include "global.fh" logical status integer bufsize, gasize c c*** Initialize a message passing library c #include "mp3.fh" c call ga_initialize() if(ga_nodeid().eq.0)then print *,' GA initialized' call ffflush(6) endif c c we want to force distribution of innermost loop in nga_mulmat_patch c by providing less buffer memory than needed c if(ga_uses_ma()) then gasize = (NMAX**4 * 3)/ga_nnodes() else gasize =0 endif bufsize = (NMAX/2 + 1)*(NMAX/3 + 1)*2 + ((NMAX/2 + 1)**2) bufsize = bufsize*6/7 status = ma_init(MT_DBL, 10, gasize+bufsize+500000) if (.not. status)call ga_error( 'ma_init failed', -1) if(ga_nodeid().eq.0)then print *,' ' print *,'CHECKING MATRIX MULTIPLICATION FOR PATCHES ' c print *, 'gasize and bufsize are ', gasize, bufsize print *,' ' endif call dpatch_test() call dpatch_test2() c if(ga_nodeid().eq.0) print *,'All tests successful ' c call ga_terminate() c call MP_FINALIZE() end subroutine dpatch_test() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m, dim, dim1 parameter (n = NMAX) parameter (m = n*n) parameter (dim = 4) parameter (dim1 = 3) double precision a(n,n), b(n,n), c(n,n), buf(m), val double precision alpha, beta integer nproc, me integer i, j, ailo, ajlo, bilo, bjlo, base, iran integer alo(dim), ahi(dim), ald(dim1), chunk(dim) integer blo(dim), bhi(dim) integer clo(dim), chi(dim) integer bufld(dim) integer g_a1, g_b1, g_c1 integer rows, cols, loop logical status, dist_same iran(i) = int(drand(0)*real(i)) + 1 dist_same = .false. c me = ga_nodeid() nproc = ga_nnodes() c do j = 1, n do i = 1, n a(i,j) = i-1 + (j-1)*n b(i,j) = i+j enddo enddo c ailo = iran(n/2) ajlo = iran(n/2) bilo = iran(n/2) bjlo = iran(n/2) c do i = 1, dim alo(i) = 1 ahi(i) = n chunk(i) = -1 if (i.ne.dim) ald(i) = n enddo c status = nga_create(MT_DBL, dim, ahi, 'a1', chunk, g_a1) if (.not. status) then write(6,*) ' nga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c if(dist_same) then status = ga_duplicate(g_a1, g_b1, 'a1_duplicated') if(.not.ga_compare_distr(g_a1, g_b1)) $ call ga_error("g_b1 distribution different",0) status = ga_duplicate(g_a1, g_c1, 'a1_duplicated_again') if(.not.ga_compare_distr(g_a1, g_c1)) $ call ga_error("g_c1 distribution different",0) else chunk(dim) = n status = nga_create(MT_DBL, dim, ahi, 'b1', chunk, g_b1) if (.not. status) call ga_error('nga_create failed:b1',0) chunk(dim) = 0 chunk(dim1) = n status = nga_create(MT_DBL, dim, ahi, 'c1', chunk, g_c1) if (.not. status) call ga_error('nga_create failed:c1',0) endif c if (me .eq. 0) then print *, ' ' write(6,*)'> Checking nga_matmul_patch ... ' call ffflush(6) endif c alo(1) = 1 ahi(1) = n blo(1) = 1 bhi(1) = n bufld(1) = n do j = 2, dim-1 alo(j) = j ahi(j) = j blo(j) = j bhi(j) = j clo(j) = j chi(j) = j bufld(j) = 1 enddo do j = 1+me, n, nproc alo(dim) = j ahi(dim) = j blo(dim) = j bhi(dim) = j call nga_put(g_a1,alo,ahi,a(1,j),bufld) call nga_put(g_b1,blo,bhi,b(1,j),bufld) enddo c call ga_sync() alo(1) = ailo ahi(1) = ailo+1 c ahi(1) = ailo+n/2 alo(dim) = ajlo ahi(dim) = ajlo c ahi(dim) = ajlo+n/3 blo(1) = bilo bhi(1) = bilo c bhi(1) = bilo+n/3 blo(dim) = bjlo bhi(dim) = bjlo c bhi(dim) = bjlo+n/2 clo(1) = bilo chi(1) = bilo+1 c chi(1) = bilo+n/2 clo(dim) = bjlo chi(dim) = bjlo c chi(dim) = bjlo+n/2 c call nga_matmul_patch('n','n', 1d0, 0d0, $ g_a1, alo, ahi, $ g_b1, blo, bhi, $ g_c1, clo, chi) call xgemm('n','n',2,2,1,1d0,a(ailo,ajlo), n, $ b(bilo,bjlo),n, 0d0, c, n) c call xgemm('n','n',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, c $ b(bilo,bjlo),n, 0d0, c, n) c bufld(1) = n/2 + 1 call nga_get(g_c1,clo,chi,buf,bufld) base = 0 do j = 1, 1 if(Mod(j,nproc).eq.me) then do i = 1, 2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*b: OK ' call ffflush(6) endif c call ga_sync() alo(1) = ailo ahi(1) = ailo+n/2 alo(dim) = ajlo ahi(dim) = ajlo+n/3 blo(1) = bilo bhi(1) = bilo+n/3 blo(dim) = bjlo bhi(dim) = bjlo+n/2 clo(1) = bilo chi(1) = bilo+n/2 clo(dim) = bjlo chi(dim) = bjlo+n/2 c call nga_matmul_patch('n','n', 1d0, 0d0, $ g_a1, alo, ahi, $ g_b1, blo, bhi, $ g_c1, clo, chi) call xgemm('n','n',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, $ b(bilo,bjlo),n, 0d0, c, n) c bufld(1) = n/2 + 1 call nga_get(g_c1,clo,chi,buf,bufld) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*b: OK ' call ffflush(6) endif c call ga_sync() call nga_matmul_patch('t','n', 1d0, 0d0, $ g_a1, alo, ahi, $ g_b1, blo, bhi, $ g_c1, clo, chi) call xgemm('t','n',n/2+1,n/2+1,n/3+1,1d0,a(ajlo,ailo), n, $ b(bilo,bjlo),n, 0d0, c, n) call nga_get(g_c1,clo,chi,buf,bufld) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*b: OK ' call ffflush(6) endif c call ga_sync() call nga_matmul_patch('n','t', 1d0, 0d0, $ g_a1, alo, ahi, $ g_b1, blo, bhi, $ g_c1, clo, chi) call xgemm('n','t',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, $ b(bjlo,bilo),n, 0d0, c, n) call nga_get(g_c1,clo,chi,buf,bufld) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*trans(b): OK ' call ffflush(6) endif c call nga_matmul_patch('t','t', 1d0, 0d0, $ g_a1, alo, ahi, $ g_b1, blo, bhi, $ g_c1, clo, chi) call xgemm('t','t',n/2+1,n/2+1,n/3+1,1d0,a(ajlo,ailo), n, $ b(bjlo,bilo),n, 0d0, c, n) call nga_get(g_c1,clo,chi,buf,bufld) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*trans(b): OK ' call ffflush(6) endif c status = ga_destroy(g_a1) status = status .and. ga_destroy(g_b1) status = status .and. ga_destroy(g_c1) if(.not. status) print *, 'ga_destroy failed' c end subroutine dpatch_test2() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer n,m, dim, dim1 parameter (n = 10) parameter (dim = 3) parameter (dim1 = 2) double precision alpha, beta, dot integer nproc, me integer i, j, ailo, ajlo, bilo, bjlo, base, iran integer alo(dim), ahi(dim), ald(dim1), chunk(dim) integer blo(dim), bhi(dim) integer clo(dim), chi(dim) integer g_a, g_b, g_c logical status c me = ga_nodeid() nproc = ga_nnodes() c do i = 1, dim chunk(i) = -1 chi(i) =n alo(i) =1 blo(i) =1 clo(i) =1 if (i.ne.dim) ald(i) = n enddo c ahi(1)=n ahi(2)=1 status = nga_create(MT_DBL, dim1, ahi, 'a', chunk, g_a) if(.not. status) call ga_error('create 1 failed',0) c status = nga_create(MT_DBL, dim1, ahi, 'b', chunk, g_b) if(.not. status) call ga_error('create 2 failed',0) c status = nga_create(MT_DBL, dim, chi, 'c', chunk, g_c) if(.not. status) call ga_error('create 2 failed',0) c call ga_fill(g_a,1d0) call ga_fill(g_b,1d0) call ga_zero(g_c) if(me.eq.0) print *,' [1:N,1:N,1:1]=[1,N]x[N,1]^t' chi(dim) = 1 bhi(1)=1 bhi(2)=n call nga_matmul_patch('n','t', 1d0, 0d0, $ g_a, alo, ahi, $ g_b, blo, bhi, $ g_c, clo, chi) c c call nga_print_patch(g_c,clo,chi) dot = nga_ddot_patch(g_c,'n', clo, chi, g_c,'n', clo, chi) if(abs(dot- 1d0*n*n) .gt. 0.01) then print *, 'error ', dot, n*n else if(me.eq.0)print *,' OK' endif status = ga_destroy(g_a) status = status .and. ga_destroy(g_b) status = status .and. ga_destroy(g_c) if(.not. status) print *, 'ga_destroy failed' c end ga-5-4/global/testing/perf.F0000644000175000017500000004151312662210457014021 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: perf.F,v 1.8 2005-01-12 02:07:10 manoj Exp $ c------------------------------------------------------------------------ c Program perf.x is used to test performance of GA put, get, accumulate | c It has to be executed on four processors. | c remote operations access data on processes 1,2,3 in the round-robin way| c------------------------------------------------------------------------ c #ifdef __crayx1 #define SLEEP my_sleep #else #define SLEEP sleep #endif program perf implicit none #include "mafdecls.fh" #include "global.fh" integer heap c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Intitialize the GA package call ga_initialize() if(ga_nnodes().ne.4 .and. ga_nodeid().eq.0) $ call ga_error('Program requires 4 GA processes',ga_nnodes()) c c*** enables MA to use ARMCI memory call set_ma_use_armci_mem() c c*** Initialize the MA package heap = 900000 if (.not. ma_init(MT_DBL, heap,heap)) $ call ga_error('ma init failed',2*heap) c call test2D() call test1D() c if(ga_nodeid().eq.0) print *,'All tests successful ' c call ga_terminate() c call MP_FINALIZE() end subroutine test1D() implicit none #include "mafdecls.fh" #include "global.fh" c c integer n, nn, num_chunks parameter (n = 1024*1024, nn = n/4, num_chunks=16) double precision buf(nn) c integer g_a integer ilo, ihi, jlo, jhi integer nproc, me, h_d MA_ACCESS_INDEX_TYPE loop, indexd integer chunk(num_chunks) data chunk /1,9,16,81,256,576,900,2304,4096,8281, $ 16384,29241,65536,124609,193600,262144/ c nproc = ga_nnodes() me = ga_nodeid() c c*** Create global array if (.not. ga_create(MT_DBL, n, 1, 'a', 0, 0, g_a)) $ call ga_error(' ga_create failed ',1) c c*** allocate memory for D if(.not. ma_push_get(MT_DBL,nn,'d',h_d, indexd)) & call ga_error('memory allocation failed',0) c do loop=1,nn buf(loop) = .01d0 enddo do loop=0,nn-1 DBL_MB(indexd+loop) = .01d0 enddo call ga_zero(g_a) c if (me .eq. 0) then write(*,*)' ' write(*,*)' ' write(*,*)' ' write(*,55)n 55 format(' Performance of GA get, put & acc', $ ' for 1-dimensional sections of array[',i7,']') print *,' ' endif c c do loop=1,2 c c*** local ops c call ga_distribution(g_a, me, ilo, ihi, jlo, jhi) call TestPutGetAcc1 & (g_a, n, chunk, num_chunks, DBL_MB(indexd), ilo, ihi, & jlo, jhi, .true.) c c*** remote ops c call TestPutGetAcc1 & (g_a, n, chunk, num_chunks, DBL_MB(indexd), ilo, ihi, & jlo, jhi,.false.) c enddo if(.not. ma_pop_stack(h_d)) call ga_error('invalid MA handle ?',0) end subroutine TestPutGetAcc1 & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo,jhi, local) implicit none #include "global.fh" #include "testutil.fh" c integer num_chunks, chunk(num_chunks) integer n, ilo, ihi, jlo,jhi,g_a double precision buf(*), tg, tp, ta double precision time_acc1, time_get1, time_put1 logical local c integer me integer loop, jump, count, bytes c me = ga_nodeid() if (me .eq. 0) then write(6,*)' ' if(local) then write(6,'(26X, 25HLocal 1-D Array Section )') else write(6,'(26X, 25HRemote 1-D Array Section )') endif write(6,*)' section get put', & ' accumulate' write(6,*)' bytes dim usec MB/s usec MB/s', & ' usec MB/s' call ffflush(6) endif call ga_sync() c do loop = 1, num_chunks bytes = util_mdtob(1)*chunk(loop) ! how much data is accessed jump = n/(6000*loop)!jump distance between consecutive patches if(loop.eq.num_chunks)jump=0 c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, 1 , 1d0*me*loop) if (me .eq. 0) then tg=time_get1(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, 1 , 1d0*me*loop) if (me .eq. 0) then tp=time_put1(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, 1 , 1d0*me*loop) if (me .eq. 0) then ta=time_acc1(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c if (me .eq. 0) then write(6,77)bytes, chunk(loop), & tg/1d-6, 1d-6*bytes/tg, & tp/1d-6, 1d-6*bytes/tp, & ta/1d-6, 1d-6*bytes/ta call ffflush(6) endif enddo c 77 format(i7, i7,1x, 3(1x,e8.3,1x,e8.3)) end double precision function & time_acc1(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je logical local integer rows, indx, shifti(3) c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 shifti(1) = rows shifti(2) = 2*rows shifti(3) = 3*rows jlo = js jhi = je seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 count = count + 1 if (local) then call ga_acc(g_a, ilo, ihi, jlo, jhi, buf, chunk, 1d0) else indx = Mod(count,3) + 1 call ga_acc(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo, jhi, buf, chunk, 1d0) endif enddo seconds = util_timer() - seconds c time_acc1 = seconds/count end double precision function & time_get1(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, indx, shifti(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 shifti(1) = 3*rows shifti(2) = 2*rows shifti(3) = rows jlo = js jhi = je seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 count = count + 1 if (local) then call ga_get(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_get(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo, jhi, buf, chunk) endif enddo seconds = util_timer() - seconds c time_get1 = seconds/count end double precision function & time_put1(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, indx, shifti(3), shiftj(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 shifti(1) = rows shifti(2) = 2*rows shifti(3) = 3*rows jlo = js jhi = je seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 count = count + 1 if (local) then call ga_put(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_put(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo, jhi, buf, chunk) endif enddo seconds = util_timer() - seconds c time_put1 = seconds/count end c c test for square patches c subroutine test2D() implicit none #include "mafdecls.fh" #include "global.fh" c integer n, nn, num_chunks parameter (n = 1024, nn = n*n/4, num_chunks=16) double precision buf(nn) c integer g_a integer ilo, ihi, jlo, jhi integer nproc, me, h_d MA_ACCESS_INDEX_TYPE indexd, loop integer chunk(num_chunks) data chunk /1,3,4,9,16,24,30,48,64,91,128,171,256,353,440,512/ c nproc = ga_nnodes() me = ga_nodeid() c c*** Create global array if (.not. ga_create(MT_DBL, n, n, 'a', 0, 0, g_a)) $ call ga_error(' ga_create failed ',1) c c*** allocate memory for D if(.not. ma_push_get(MT_DBL,nn,'d',h_d, indexd)) & call ga_error('memory allocation failed',0) c do loop=1,nn buf(loop) = .01d0 enddo do loop=0,nn-1 DBL_MB(indexd+loop) = .01d0 enddo call ga_zero(g_a) c if (me .eq. 0) then write(*,*)' ' write(*,55)n,n 55 format(' Performance of GA get, put & acc', $ ' for square sections of array[',i4,',',i4,']') print *,' ' endif c c do loop=1,2 c c*** local ops c call ga_distribution(g_a, me, ilo, ihi, jlo, jhi) call TestPutGetAcc & (g_a, n, chunk, num_chunks, DBL_MB(indexd), ilo, ihi, & jlo, jhi, .true.) c c*** remote ops c call TestPutGetAcc & (g_a, n, chunk, num_chunks, DBL_MB(indexd), ilo, ihi, & jlo, jhi,.false.) c enddo if(.not. ma_pop_stack(h_d)) call ga_error('invalid MA handle ?',0) end subroutine TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo,jhi, local) implicit none #include "global.fh" #include "testutil.fh" c integer num_chunks, chunk(num_chunks) integer n, ilo, ihi, jlo,jhi,g_a double precision buf(*), tg, tp, ta double precision time_acc, time_get, time_put logical local c integer me integer loop, jump, count, bytes c me = ga_nodeid() if (me .eq. 0) then write(6,*)' ' if(local) then write(6,'(26X, 25HLocal 2-D Array Section )') else write(6,'(26X, 25HRemote 2-D Array Section )') endif write(6,*)' section get put', & ' accumulate' write(6,*)' bytes dim usec MB/s usec MB/s', & ' usec MB/s' call ffflush(6) endif call ga_sync() c do loop = 1, num_chunks bytes = util_mdtob(1)*chunk(loop)*chunk(loop) !how much data jump = n/(60*loop) ! jump distance between consecutive patches if(loop.eq.num_chunks)jump=0 c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tg=time_get(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tp=time_put(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then ta=time_acc(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(1) endif c if (me .eq. 0) then write(6,77)bytes, chunk(loop), & tg/1d-6, 1d-6*bytes/tg, & tp/1d-6, 1d-6*bytes/tp, & ta/1d-6, 1d-6*bytes/ta call ffflush(6) endif enddo c 77 format(i7, i7,1x, 3(1x,e8.3,1x,e8.3)) end double precision function & time_acc(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je logical local integer rows, cols, indx, shifti(3), shiftj(3) c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_acc(g_a, ilo, ihi, jlo, jhi, buf, chunk, 1d0) else indx = Mod(count,3) + 1 call ga_acc(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk, 1d0) endif enddo enddo seconds = util_timer() - seconds c time_acc = seconds/count end double precision function & time_get(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, cols, indx, shifti(3), shiftj(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_get(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_get(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk) endif enddo enddo seconds = util_timer() - seconds c time_get = seconds/count end double precision function & time_put(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, cols, indx, shifti(3), shiftj(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_put(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_put(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk) endif enddo enddo seconds = util_timer() - seconds c time_put = seconds/count end subroutine my_sleep(seconds) implicit none #include "global.fh" #include "testutil.fh" c double precision ts, te, work integer seconds, loop common /sleep_block/ work c ts = util_timer() work = 0. 100 continue do loop= 1, 500 work = work + 1. enddo te = util_timer() if(te - ts .lt. real(seconds)) goto 100 * print *, work, ts, te end ga-5-4/global/testing/ntestfc.c0000644000175000017500000002034712662210461014565 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* ntestfc.c is a version of ntestc.c: * This program shows how to use two flavors of the C API to GA: * 1. the standard C interface with C conventions for array indexes and layout * 2. the interface that follows the Fortran w.r.t. array indexes and layout * The option 1 is the default (this is what ntest.c does). * The option 2 is enabled by compiling GA (capi.c) AND this code * with -DUSE_FAPI * * Jarek Nieplocha, Nov. 16th, 1999 */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "macdecls.h" #include "ga.h" #include "mp3.h" /* utilities for GA test programs */ #include "testutil.h" #define N 10 /* first dimension */ #define NDIM 4 /* number of dimensions */ #define PERMUTE_ #ifdef USE_FAPI #define BASE 1 #define GROWS_FIRST 0 #else #define BASE 0 #define GROWS_FIRST (NDIM-1) #endif /*\ fill n-dimensional array section with value \*/ void fill_patch(double *ptr, int dim[], int ld[], int ndim, double val) { int i, j, stride=1; switch (ndim){ case 0: GA_Error("fill_patch: error",ndim); case 1: for(i=0;i adims[d] ){ map[offset] = regions[i].lo[d]; offset++; block[d]++; adims[d]= regions[i].hi[d]; } if(me==0){ printf("Distribution map contains %d elements\n",offset); print_subscript("number of blocks for each dimension",ndim,block,"\n"); print_subscript("distribution map",offset,map,"\n\n"); fflush(stdout); } if(me==0)printf("Creating array B applying distribution of A\n"); # ifdef USE_DUPLICATE g_b = GA_Duplicate(g_a,"array B"); # else g_b = NGA_Create_irreg(MT_F_DBL, NDIM, dims, "array B", block,map); # endif if(!g_b) GA_Error("create failed: B",1); if(me==0)printf("OK\n\n"); free(proclist); free(regions); free(map); GA_Print_distribution(g_b); GA_Sync(); if(me==0){ printf("\nCompare distributions of A and B\n"); if(GA_Compare_distr(g_a,g_b)) printf("Failure: distributions NOT identical\n"); else printf("Success: distributions identical\n"); fflush(stdout); } if(me==0){ printf("\nAccessing local elements of A: set them to the owner process id\n"); fflush(stdout); } GA_Sync(); NGA_Distribution(g_a,me,lo,hi); if(hi[0]>=0){ /* -1 means no array elements stored on this processor */ double *ptr; char msg[100]; int locdim[NDIM]; NGA_Access(g_a, lo,hi, &ptr, ld); sprintf(msg,"%d: leading dimensions",me); print_subscript(msg,ndim-1,ld,"\n"); for(i=0;i #include #include "ga.h" #include "ga-mpi.h" #include "macdecls.h" #include "mp3.h" #define n 4 #define PROC_LIST_SIZE 100 int main(int argc, char **argv) { int me; int g_a; int status; int i,j; int dims[] = {n,n}; int proc_group[PROC_LIST_SIZE],proclist[PROC_LIST_SIZE],inode; int sbuf[1],rbuf[1]; MPI_Comm comm; MP_INIT(argc,argv); GA_Initialize(); me = GA_Nodeid(); status = MA_init(MT_DBL, 100000, 100000); if (!status) GA_Error("ma_init failed",-1); status = MA_set_auto_verify(1); status = MA_set_hard_fail(1); status = MA_set_error_print(1); inode = GA_Cluster_nodeid(); if (me == 0) { printf("there are %d nodes, node 0 has %d procs\n", GA_Cluster_nnodes(), GA_Cluster_nprocs(0)); fflush(stdout); } GA_Sync(); for (i=0; i Creating Block-Cyclic Arrays' write(6,*) ' ' endif dims(1) = n dims(2) = n block(1) = 16 block(2) = 16 call factor(nproc,g1,g2) proc_grid(1) = g1 proc_grid(2) = g2 if (me.eq.0) then write(6,'(a,i3,a,i3)') ' Proc grid dimensions: ',g1,' x ',g2 endif g_a = ga_create_handle() call ga_set_data(g_a,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_a,block,proc_grid) if (.not.ga_allocate(g_a)) & call ga_error(' ga_create a failed ', 2) g_b = ga_create_handle() call ga_set_data(g_b,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_b,block,proc_grid) if (.not.ga_allocate(g_b)) & call ga_error(' ga_create b failed ', 2) g_c = ga_create_handle() call ga_set_data(g_c,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_c,block,proc_grid) if (.not.ga_allocate(g_c)) & call ga_error(' ga_create c failed ', 2) g_d = ga_create_handle() call ga_set_data(g_d,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_d,block,proc_grid) if (.not.ga_allocate(g_d)) & call ga_error(' ga_create d failed ', 2) if (.not. ga_create(MT_DBL, n, n, 'AA', 1, 1, g_aa)) $ call ga_error(' ga_create aa failed ',2) if (.not. ga_create(MT_DBL, n, n, 'BB', 1, 1, g_bb)) $ call ga_error(' ga_create bb failed ',2) if (.not. ga_create(MT_DBL, n, n, 'CC', 1, 1, g_cc)) $ call ga_error(' ga_create cc failed ',2) if (.not. ga_create(MT_DBL, n, n, 'DD', 1, 1, g_dd)) $ call ga_error(' ga_create dd failed ',2) #else if (.not. ga_create(MT_DBL, n, n, 'A', 1, 1, g_a)) $ call ga_error(' ga_create a failed ',2) if (.not. ga_create(MT_DBL, n, n, 'B', 1, 1, g_b)) $ call ga_error(' ga_create b failed ',2) if (.not. ga_create(MT_DBL, n, n, 'C', 1, 1, g_c)) $ call ga_error(' ga_create c failed ',2) if (.not. ga_create(MT_DBL, n, n, 'D', 1, 1, g_d)) $ call ga_error(' ga_create d failed ',2) #endif c c*** Fill in arrays A & B c if (me .eq. 0) then c write(6,21) 21 format(/' filling in ... ') c call ffflush(6) do j = 1, n call ga_put(g_a, 1,n, j,j, a(1,j),n) call ga_put(g_b, 1,n, j,j, b(1,j),n) call ga_put(g_c, 1,n, j,j, c(1,j),n) enddo c print *,'A' do j = 1, n c call GA_GET(g_a, 1,n, j,j, eva,1) c write(6,'(10e8.2)')(eva(i),i=1,n) enddo endif c c*** check symmetrization c if (me .eq. 0) then print *,' ' print *,'>checking ga_symmetrize ' print *,' ' call ffflush(6) endif call ga_symmetrize(g_c) c call GA_GET(g_c, 1,n, 1,n,c,n) do j = ga_nodeid()+1, n, ga_nnodes() do i = j+1, n if(c(i,j).ne.c(j,i))then print *, me, ' symmetrize ',i,j,c(i,j),c(j,i) call ffflush(6) call ga_error('exiting',-1) endif enddo enddo call ga_sync() if (me .eq. 0) then print *,' ' print *,' ga_symmetrize is OK' print *,' ' call ffflush(6) endif c c*** check symmetrization c if (me .eq. 0) then print *,' ' print *,'>checking ga_transpose ' print *,' ' call ffflush(6) endif c call ga_transpose(g_c,g_d) * call ga_print(g_c) * call ga_print(g_d) call GA_GET(g_d, 1,n, 1,n,a,n) do j = ga_nodeid()+1, n, ga_nnodes() call GA_GET(g_d, 1,n, j,j, a,n) do i = 1, n if(a(i,1).ne.c(j,i))then print *, me, ' transpose ',i,j,a(i,1),c(j,i) call ffflush(6) call ga_error('exiting',-1) endif enddo enddo call ga_sync() if (me .eq. 0) then print *,' ' print *,' ga_transpose is OK' print *,' ' call ffflush(6) endif c c c*** solve the eigenproblem if (me .eq. 0)then print *,' ' write(6,*) '>checking the generalized eigensolver ... ' print *,' ' call ffflush(6) endif call ga_sync() #ifndef PAR_DIAG call ga_diag_seq(g_a,g_b,g_c,evals) #else #ifdef HAVE_SCALAPACK #if BLOCK_CYCLIC call ga_copy(g_a, g_aa) call ga_copy(g_b, g_bb) #endif call ga_pdsygv( g_a, g_b, g_c, evals) #if BLOCK_CYCLIC call ga_copy(g_aa, g_a) call ga_copy(g_bb, g_b) #endif #else call ga_diag(g_a,g_b,g_c,evals) #endif #endif if (me .eq. 0) then print *,' ' print *,' checking multiplication' print *,' ' call ffflush(6) endif c call ga_sync() #if BLOCK_CYCLIC call ga_copy(g_a, g_aa) call ga_copy(g_c, g_cc) call ga_dgemm('t','n',n,n,n, 1d0, g_cc, g_aa, 0d0, g_dd) call ga_dgemm('n','n',n,n,n, 1d0, g_dd, g_cc, 0d0, g_aa) call ga_copy(g_aa, g_a) #else call ga_dgemm('t','n',n,n,n, 1d0, g_c, g_a, 0d0, g_d) call ga_dgemm('n','n',n,n,n, 1d0, g_d, g_c, 0d0, g_a) #endif c call ga_sync() if (me .eq. 0) then do j = 1, n call GA_GET(g_a, j,j, j,j, eva(j),1) enddo endif call ga_sync() #if BLOCK_CYCLIC call ga_copy(g_b, g_bb) call ga_dgemm('t','n',n,n,n, 1d0, g_cc, g_bb, 0d0, g_dd) call ga_sync() call ga_dgemm('n','n',n,n,n, 1d0, g_dd, g_cc, 0d0, g_bb) call ga_copy(g_bb, g_b) #else call ga_dgemm('t','n',n,n,n, 1d0, g_c, g_b, 0d0, g_d) call ga_sync() call ga_dgemm('n','n',n,n,n, 1d0, g_d, g_c, 0d0, g_b) #endif c call ga_sync() if (me .eq. 0) then do j = 1, n call GA_GET(g_b, j,j, j,j, evb(j),1) enddo write(6,*)' j lambda eva evb eva/evb' write(6,*)' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^' call ffflush(6) do j = 1, n if(ABS(evals(j) - eva(j)/evb(j)).gt.1d-5) & write(6,'(i4,1h_,6(e10.3,1h,))') @ j,evals(j), eva(j), evb(j),eva(j)/evb(j) enddo write(6,*)' OK OK OK OK' call ffflush(6) endif if (me .eq. 0) then print *,' ' print *,' eigensolver & multiplication are OK' print *,' ' print *,' ' call ffflush(6) endif c c.................................................................. c c*** solve the std eigenproblem if (me .eq. 0)then print *,' ' write(6,*) '>checking the standard eigensolver ... ' print *,' ' call ffflush(6) endif do j =1,n index(j)=j ind(j)=j enddo call ga_sync() #ifdef PAR_DIAG #ifdef HAVE_SCALAPACK #if BLOCK_CYCLIC call ga_copy(g_a, g_aa) #endif call ga_pdsyev( g_a, g_c, evals, 16) #if BLOCK_CYCLIC call ga_copy(g_aa, g_a) #endif #else call ga_diag_std(g_a,g_c,evals) #endif #else call ga_diag_std_seq(g_a,g_c,evals) #endif c call ga_zero(g_b) #if BLOCK_CYCLIC call ga_copy(g_a, g_aa) call ga_copy(g_c, g_cc) call ga_dgemm('n','n',n,n,n, 1d0, g_aa, g_cc, 0d0, g_dd) ! d := a*c call ga_copy(g_dd, g_d) #else call ga_dgemm('n','n',n,n,n, 1d0, g_a, g_c, 0d0, g_d) ! d := a*c #endif c c copy eigenvalues to diagonal of g_b c if (me .eq. 0) call ga_scatter(g_b, evals, index, ind, n) call ga_sync() #if BLOCK_CYCLIC call ga_copy(g_b, g_bb) call ga_dgemm('n','n',n,n,n, 1d0, g_cc, g_bb, 0d0, g_aa) ! a := c*b call ga_copy(g_aa, g_a) #else call ga_dgemm('n','n',n,n,n, 1d0, g_c, g_b, 0d0, g_a) ! a := c*b #endif call ga_sync() call ga_add(1d0, g_d, -1d0, g_a, g_c) sum = ga_ddot(g_c,g_c) if (me .eq. 0) then if(dsqrt(sum)/n.lt.1d-11)then print *, ' std eigensolver is OK ' else print *, ' test failed: norm = ', dsqrt(sum)/n endif print *,' ' call ffflush(6) endif c status = MA_summarize_allocated_blocks() status = ga_destroy(g_d) status = ga_destroy(g_c) status = ga_destroy(g_b) status = ga_destroy(g_a) end #if BLOCK_CYCLIC subroutine factor(p,idx,idy) implicit none integer i,j,p,idx,idy,it integer ip,ifac,pmax,prime(1280) integer fac(1280) c i = 1 ip = p c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine two factors of p of approximately the c same size c idx = 1 idy = 1 do i = ifac, 1, -1 if (idx.le.idy) then idx = fac(i)*idx else idy = fac(i)*idy endif end do return end #endif ga-5-4/global/testing/packc.c0000644000175000017500000003427512662210460014204 0ustar mbamba/** * Tests the pack function in GA. * * Each test will locally perform the same functionality, then compare * local buffers against global buffers. */ #if HAVE_CONFIG_H # include "config.h" #endif #define NELEM 200000 /*#define NELEM 20*/ #define HEAP 200*200*4 #define FUDGE 100 #define STACK 200*200 #include #include #include "ga.h" #include "macdecls.h" #include "mp3.h" static int me; static int nproc; #define assign_reg(a,b) (a) = (b) #define assign_cpl(a,b) (a).real = (b).real; (a).imag = (b).imag #define assign_val_reg(a,b,c) (a) = (b) #define assign_val_cpl(a,b,c) (a).real = (b); (a).imag = (c) #define eq_zero_reg(a) (0 == (a)) #define eq_zero_cpl(a) (0 == (a).real && 0 == (a).imag) #define neq_zero_reg(a) (0 != (a)) #define neq_zero_cpl(a) (0 != (a).real || 0 != (a).imag) #define neq_reg(a,b) ((a) != (b)) #define neq_cpl(a,b) ((a).real != (b).real || (a).imag != (b).imag) #define assign_add_reg(a,b,c) (a) = (b) + (c) #define assign_add_cpl(a,b,c) (a).real = (b).real + (c).real; \ (a).imag = (b).imag + (c).imag #define cast_reg(a) ((float)(a)) #define cast_cpl(a) ((float)(a).real) #if 0 # define PRINT(AT,AT_MSK) do { \ int p; \ for (p=0; p Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0d0) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) * write(6,4) me, ilo, ihi, jlo, jhi * 4 format(' node ',i2,' checking put ',4i4) * call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call util_dfill(n*n, 0.0d0, b, 1) * call ga_print(g_a,1) call ga_get(g_a, 1, n, 1, n, b, n) * write(6,*) ' after get' * call output(b, 1, n, 1, n, n, n, 1) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_dfill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c #if 1 if (me .eq. 0) then write(6,9) 9 format('> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = drand(0) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = drand(0) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_sync() #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DBL) call ga_set_array_name(g_b,'b') #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif #endif # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_DBL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_DBL, ndim, dims, 'b', chunk, + p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',-1) endif c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, 1d0, 1, 1d0) call ga_sync() #ifndef MIRROR if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1d0*nproc) #else if (iproc.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1d0*lprocs) #endif if(x.gt. 1d-10)then #ifndef MIRROR write(6,*)'val=',b(1,1),' expected=',nproc, x #else write(6,*)'val=',b(1,1),' expected=',lprocs, x #endif call ga_error('overlapping accumulate failed',-1) endif if (me.eq.0) then write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif endif #endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format('> Checking add ...') call ffflush(6) endif c c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = drand(0) a(i,j) = 0.1d0*a(i,j) + 0.9d0*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add(0.1d0, g_a, 0.9d0, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the ddot function c if (me .eq. 0) then write(6,19) 19 format('> Checking ddot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0d0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_ddot(g_a,g_b) if(MISMATCH(sum1, sum2))then write(6,*) ' ddot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',-1) else if (me.eq.0) then write(6,*) write(6,*) ' ddot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format('> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123d0) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123d0 if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(me.eq.itmp) then #endif #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',-1) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo enddo call nga_gather(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',-1) endif enddo #endif endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(iproc.eq.iran(lprocs)-1) then #endif #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1d0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',-1) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call nga_scatter(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,927)me,ilo,jlo,w(loop),1d0 *(ilo+jlo),loop 927 format(i3,' scatter ',i5,',',i5,',',f7.1,',',f7.1,',',i5) call ffflush(6) call ga_error('... exiting ',-1) endif enddo #endif endif call ga_sync() enddo c call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_sync() c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_sync() do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) c if (found(i,j, iv, jv, loop-1) ) goto 10 #ifndef NGA_GATSCAT iv(loop) = i jv(loop) = j #else ijv(1,loop) = i ijv(2,loop) = j #endif v(loop) = 1d0 *(i+j) #ifndef MIRROR b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array #else b(i,j) = b(i,j) + lprocs*x*v(loop) ! update local ref. array #endif enddo #ifndef NGA_GATSCAT call ga_scatter_acc(g_a,v,iv,jv, ii,x) #else call nga_scatter_acc(g_a,v,ijv,ii,x) #endif c call ga_sync() c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii #ifndef NGA_GATSCAT i = iv(loop) j = jv(loop) #else i = ijv(1,loop) j = ijv(2,loop) #endif if(MISMATCH(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_sync() enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif #ifdef MIRROR c c Check the merge function c do j = 1, n do i = 1, n a(i,j) = inode + i-1 + (j-1)*n enddo enddo if (me .eq. 0) then write(6,23) 23 format('> Checking merge ...') call ffflush(6) endif if (iproc.eq.0) then call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_merge_mirrored(g_a) call ga_get(g_a, 1, n, 1, n, b, n) lsame = .true. ilo = 0 ihi = nnodes*(nnodes-1)/2 do i = 1, n do j = 1, n if ((dble(nnodes)*(a(j,i)-dble(inode)) + + dble(ihi)).ne.b(j,i)) then lsame = .false. ilo = ilo + 1 endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' merge is OK ' write(6,*) else if (.not.lsame) then write(6,*) write(6,*) ' merge is wrong ',ilo write(6,*) call ga_error('... exiting ',-1) endif c c Checking copy between different array configurations c if (me .eq. 0) then write(6,20) 20 format('> Checking mixed copy ...') call ffflush(6) endif #ifdef NEW_API g_c = ga_create_handle() call ga_set_data(g_c,ndim,dims,MT_DBL) call ga_set_array_name(g_c,'c') #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_c,block_size,proc_grid) #else call ga_set_block_cyclic(g_c,block_size) #endif #endif if (.not.ga_allocate(g_c)) then #else if (.not. nga_create(MT_DBL, ndim, dims, 'c', chunk, g_c)) then #endif call ga_error('ga_create failed for third array ',-1) endif call ga_zero(g_c) call ga_copy(g_a,g_c) call ga_get(g_a, 1, n, 1, n, a, n) call ga_get(g_c, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (a(j,i).ne.b(j,i)) then lsame = .false. endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' Mixed copy (mirrored to normal) is OK ' write(6,*) elseif (me.eq.0) then write(6,*) write(6,*) ' Mixed copy (mirrored to normal) is wrong ',ilo write(6,*) call ga_error('... exiting ',-1) endif call ga_zero(g_a) call ga_copy(g_c,g_a) call ga_get(g_a, 1, n, 1, n, a, n) do i = 1, n do j = 1, n if (a(j,i).ne.b(j,i)) then lsame = .false. endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' Mixed copy (normal to mirrored) is OK ' write(6,*) elseif (me.eq.0) then write(6,*) write(6,*) ' Mixed copy (normal to mirrored) is wrong ',ilo write(6,*) call ga_error('... exiting ',-1) endif c c Check the merge to distributed patch function c do j = 1, n do i = 1, n a(i,j) = inode + i-1 + (j-1)*n enddo enddo if (me .eq. 0) then write(6,24) 24 format('> Checking merge to distributed patch ...') call ffflush(6) endif c c get low and high indices of patch c ilo = n/4 ihi = ilo + n/2 do i = 1, 2 alo(i) = ilo blo(i) = ilo + 1 ahi(i) = ihi bhi(i) = ihi + 1 end do if (iproc.eq.0) then call ga_put(g_a, 1, n, 1, n, a, n) endif call nga_merge_distr_patch(g_a, alo, ahi, g_c, blo, bhi) call ga_get(g_c, 1, n, 1, n, b, n) lsame = .true. ilo = 0 ihi = nnodes*(nnodes-1)/2 do i = alo(1), ahi(1) ii = i-alo(1) + blo(1) do j = alo(2), ahi(2) jj = j-alo(2) + blo(2) if ((dble(nnodes)*(a(j,i)-dble(inode)) + + dble(ihi)).ne.b(jj,ii)) then c if (me.eq.0) then c write(6,*) i,j,ii,jj, nnodes*a(j,i)+ihi, b(jj,ii) c endif lsame = .false. ilo = ilo + 1 endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' merge to distributed patch is OK ' write(6,*) elseif (.not.lsame) then write(6,*) write(6,*) ' merge to distributed patch is wrong ',ilo write(6,*) call ga_error('... exiting ',-1) endif #endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c end c----------------------------------------------------------------- subroutine check_complex_float() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) complex a(n,n), b(n,n), v(m),w(m) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords complex x, sum1, sum2, factor integer lprocs, inode, iproc, lproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = cmplx(real(i-1), real((j-1)*n)) #else a(i,j) = cmplx(real(inode),0.0d00) + + cmplx(real(i-1), real((j-1)*n)) #endif b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_SCPL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(MT_SCPL, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(MT_SCPL, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',-1) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_SCPL) call ga_set_array_name(g_b,'b') # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_SCPL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_SCPL, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',-1) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/4 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',-1) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0),drand(1)) b(i,j) = cmplx(real(i),real(j)) enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = cmplx(drand(0),0.333d0) c x = cmplx(0.333d0,0) * x = cmplx(0d0,0d0) x = 0 ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, (1,-1), 1, (1,0)) call ga_sync() #ifndef MIRROR if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCHF(x, ((1d0,-1d0)*nproc)))then #else if (iproc.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCHF(x, ((1d0,-1d0)*lprocs)))then #endif c if(error.gt. (1d-8))then #ifndef MIRROR write(6,*)'val=',x,' expected=(',nproc,',',-nproc,')' #else write(6,*)'val=',x,' expected=(',lprocs,',',-lprocs,')' #endif call ga_error('overlapping accumulate failed',-1) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #else if(iproc.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #endif call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif factor = (1d0,-1d0) call ga_scale(g_a, factor) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*factor if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' fscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check scatter&gather c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',-1) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(me.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Check ga_add c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif call ga_get(g_a, 1, n, 1, n, a, n) crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) a(i,j) = (0.1d0,-.1d0)*a(i,j) + (.9d0,-.9d0)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add((0.1,-.1), g_a, (0.9,-.9), g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the cdot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking cdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = (0.0d0,0.d0) do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_cdot(g_a,g_b) if (MISMATCHF(sum1, sum2))then write(6,*) ' cdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',-1) else if (me.eq.0) then write(6,*) write(6,*) ' cdot is OK ' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c end c----------------------------------------------------------------- subroutine check_complex() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) double complex a(n,n), b(n,n), v(m),w(m) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords double complex x, sum1, sum2, factor integer lprocs, inode, iproc, lproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif #ifdef BLOCK_CYCLIC integer block_size(2), proc_grid(2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",-1) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = cmplx(dble(i-1), dble((j-1)*n)) #else a(i,j) = cmplx(dble(inode),0.0d00) + + cmplx(dble(i-1), dble((j-1)*n)) #endif b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_DCPL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(MT_DCPL, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(MT_DCPL, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',-1) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DCPL) call ga_set_array_name(g_b,'b') #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif #endif # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_DCPL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_DCPL, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',-1) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format('> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call util_qfill(n*n, (0d0,0d0), b, 1) call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_qfill(n*n, (0.0d0,0d0), b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',-1) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format('> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0),drand(1)) b(i,j) = cmplx(dble(i),dble(j)) enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = cmplx(drand(0),0.333d0) c x = cmplx(0.333d0,0) * x = cmplx(0d0,0d0) x = 0 ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, (1d0,-1d0), 1, (1d0,0d0)) call ga_sync() #ifndef MIRROR if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCH(x, ((1d0,-1d0)*nproc)))then #else if (iproc.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCH(x, ((1d0,-1d0)*lprocs)))then #endif c if(error.gt. (1d-8))then #ifndef MIRROR write(6,*)'val=',x,' expected=(',nproc,',',-nproc,')' #else write(6,*)'val=',x,' expected=(',lprocs,',',-lprocs,')' #endif call ga_error('overlapping accumulate failed',-1) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #else if(iproc.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #endif call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format('> Checking scale ...') call ffflush(6) endif factor = (1d0,-1d0) call ga_scale(g_a, factor) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*factor if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check scatter&gather c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',-1) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(me.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Check ga_add c if (me .eq. 0) then write(6,91) 91 format('> Checking add ...') call ffflush(6) endif call ga_get(g_a, 1, n, 1, n, a, n) crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) a(i,j) = (0.1d0,-.1d0)*a(i,j) + (.9d0,-.9d0)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add((0.1d0,-.1d0), g_a, (0.9d0,-.9d0), g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the zdot function c if (me .eq. 0) then write(6,19) 19 format('> Checking zdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = (0.0d0,0.d0) do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_zdot(g_a,g_b) if (MISMATCH(sum1, sum2))then write(6,*) ' zdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',-1) else if (me.eq.0) then write(6,*) write(6,*) ' zdot is OK ' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c end c----------------------------------------------------------------- subroutine check_int() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n parameter (n = 128) integer a(n,n), b(n,n) logical status integer g_a integer iran, i, j, loop, nloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, dimi, dimj, ii, jj integer ndim, dims(2), chunk(2), p_mirror, nnodes integer lprocs, inode, iproc,lproc double precision nwords parameter (nloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, sum1, real integer buf #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif #ifdef BLOCK_CYCLIC integer block_size(2), proc_grid(2) integer map(4,maxproc), block_list(maxproc), found, np,k integer blo(2),bhi(2) #else integer map(5,maxproc), found, np,k #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",-1) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = i-1 + (j-1)*1000 #else a(i,j) = inode + i-1 + (j-1)*1000 #endif enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 #ifdef NEW_API g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_INT) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif if (.not.ga_allocate(g_a)) then #else # ifndef MIRROR if (.not. ga_create(MT_INT, n, n, 'a', 0, 0, g_a)) then # else p_mirror = ga_pgroup_get_mirror() if (.not. nga_create_config(MT_INT, ndim, dims, 'a', chunk, + p_mirror, g_a)) then # endif #endif write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',-1) endif c c Zero the array c if (me .eq. 0) then write(6,21) 21 format('> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. 0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c #ifndef MIRROR if(me.eq.0)then #else if(iproc.eq.0)then #endif call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo endif call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_ifill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif c call ga_sync() if (me .eq. 0 .and. n.gt.7) then write(6,*) write(6,*) '> Checking ga_print_patch --- should see ' write(6,*)' [2002 3002 4002 5002 6002]' write(6,*)' [2003 3003 4003 5003 6003]' write(6,*)' [2004 3004 4004 5004 6004]' write(6,*) call ffflush(6) endif if(n.gt.5) call ga_print_patch(g_a,3,5,3,7,0) c call ga_sync() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*) '> Checking read_inc ... ' write(6,*) call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc inc =5 c every processor will be operating on somebody elses data c #ifndef MIRROR lproc = nproc - me - 1 #else lproc = nnodes-iproc-1 lproc = inode*lprocs + lproc lproc = lprocs - me-ga_cluster_procid(inode,0) #endif c #ifndef MIRROR call ga_distribution(g_a,lproc,ilo,ihi,jlo,jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif c dimi = ihi-ilo dimj = jhi-jlo c write(6,111) me,ilo,ihi,jlo,jhi,dimi,dimj 111 format(i2,'..',4i8,'.',2i8) call ga_sync() if(ilo .gt.0 .and. jhi .gt. 0)then do loop = 1,nloop ii= IABS(iran(dimi)) - 1 jj= IABS(iran(dimj)) - 1 i=ilo + Mod(ii,dimi) j=jlo + Mod(jj,dimj) c c write(6,*) me,'..',ilo,ihi,jlo,jhi,'.',dimi,dimj,'..',i,j c call ffflush(6) buf = ga_read_inc(g_a,i,j,inc) if(a(i,j).ne. buf)then write(6,114) me,ilo,ihi,jlo,jhi write(6,112) me,i,j,a(i,j),buf,loop c write(6,*)me,'READ_inc ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif 112 format(i3,' READ_inc ',i3,',',i3,',',i8,' ',i8,' loop ',i8) call ga_get(g_a, i,i,j,j, buf,1) a(i,j) = a(i,j)+inc if(a(i,j).ne. buf)then write(6,114) me,ilo,ihi,jlo,jhi write(6,113) me,i,j,a(i,j),buf,loop c write(6,*)me,'read_INC ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif 113 format(i3,' read_INC ',i3,',',i3,',',i8,' ',i8,' loop ',i8) 114 format(i3,' ilo ',i3,' ihi ',i3,' jlo ',i3,' jhi ',i3) enddo endif call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' read_inc is OK' write(6,*) endif c c c #ifndef MIRROR if (me.eq.0) then write(6,*) write(6,*) '> checking ga_fence and ga_lock' write(6,*) call ffflush(6) endif c call ga_zero(g_a) c c*** use ga_read_inc and elements g_a(1:2,1) to implement a lock c*** compute g_a(:,n) = sum (1(:)) for P processors c status = ga_create_mutexes(1) if (.not. status) then call ga_error('ga_create_mutexes failed ',-1) endif if(n.lt.2)call ga_error('insufficient n to test ga_fence',n) call ga_lock(0) c call my_lock(g_a) c get original values g_a(:,n) call ga_get(g_a, 1,n, n,n, b,n) c add my contribution do i =1,n b(i,1)= b(i,1)+1 enddo c c need to use fence to assure that coms complete before leaving c Critical Section c call ga_init_fence() call ga_put(g_a, 1,n, n,n, b,n) call ga_fence() call ga_unlock(0) c call my_unlock(g_a) c 333 if(.not.ga_destroy_mutexes()) $ call ga_error('mutex not destroyed',-1) call ga_sync() if (me.eq.0) then call ga_get(g_a, 1,n, n,n, b,n) do i =1,n if(b(i,1).ne. nproc)then print *, 'mismatch',b(i,1),nproc call ga_error('fence failed',i) endif enddo write(6,*) write(6,*) ' ga_fence and ga_lock are OK' write(6,*) endif #endif c c if (me.eq.0) then write(6,*) write(6,*) '> checking ga_locate_region' write(6,*) call ffflush(6) endif #ifndef BLOCK_CYCLIC status = ga_locate_region(g_a, 1, n, 1, n, map, np) #else blo(1) = 1 bhi(1) = n blo(2) = 1 bhi(2) = n status = nga_locate_region(g_a, blo, bhi, map, block_list, np) #endif found = 0 do j=1,n do i=1,n b(i,j)=-1 enddo enddo #ifndef MIRROR if(me.eq.0)call ga_put(g_a,1,n,1,n,b,n) #else if(iproc.eq.0)call ga_put(g_a,1,n,1,n,b,n) #endif call ga_sync() do k = 1, np #ifndef MIRROR #ifndef BLOCK_CYCLIC if(map(5,k).eq.me)then #else if(mod(block_list(k),nproc).eq.me)then #endif #else if(map(5,k).eq.iproc)then #endif #ifndef BLOCK_CYCLIC if(found.eq.1) then write(6,*)'double entry in map for proc ',me call ffflush(6) endif do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) #else do j= map(2,k), map(4,k) do i= map(1,k), map(3,k) #endif #ifndef MIRROR b(i,j)=1*me #else b(i,j)=1*iproc #endif enddo enddo #ifndef BLOCK_CYCLIC call ga_put(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & b(map(1,k),map(3,k)),n) #else call ga_put(g_a, map(1,k),map(3,k),map(2,k),map(4,k), & b(map(1,k),map(2,k)),n) #endif found = 1 endif enddo call ga_sync() c do k = 1, np #ifndef MIRROR #ifndef BLOCK_CYCLIC if(map(5,k).eq.me)then #else if(mod(block_list(k),nproc).eq.me)then #endif #else if(map(5,k).eq.iproc)then #endif #ifndef BLOCK_CYCLIC call ga_get(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & a(map(1,k),map(3,k)),n) do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) #else call ga_get(g_a, map(1,k),map(3,k),map(2,k),map(4,k), & a(map(1,k),map(2,k)),n) do j= map(2,k), map(4,k) do i= map(1,k), map(3,k) #endif if(b(i,j).ne.a(i,j)) then write(6,*) & 'proc ',me, 'overlap with ',a(i,j) call ffflush(6) endif enddo enddo endif enddo call ga_sync() c #ifndef MIRROR if(me.eq.0)then #else if(iproc.eq.0)then #endif call ga_get(g_a,1,n,1,n,a,n) do j=1,n do i=1,n if(a(i,j).eq.-1)then write(6,*)'i=',i,' j=',j, ' not assigned ' call ga_error('... exiting ',-1) endif enddo enddo endif if (me.eq.0) then write(6,*) write(6,*) ' ga_locate_region is OK' write(6,*) call ffflush(6) endif c c Delete the global array c status = ga_destroy(g_a) c end c--------------------------------------------------------------------- subroutine check_flt() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer n, m parameter (n =100) parameter (m=2*n) real a(n,n), b(n,n), v(m), w(m) integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i, j, loop, nloop, maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes double precision nwords parameter (maxloop = 100) integer maxproc integer ndim, dims(2), chunk(2), p_mirror parameter (maxproc = 4096) double precision crap real x, sum1, sum2 logical found integer lprocs, inode, iproc, lproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif #ifdef BLOCK_CYCLIC integer block_size(2), proc_grid(2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",-1) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = i-1 + (j-1)*n #else a(i,j) = inode + i-1 + (j-1)*n #endif b(i,j) = -1. enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 #ifdef NEW_API g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_REAL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif #endif # ifdef MIRROR write(6,*) 'Getting p_mirror' p_mirror = ga_pgroup_get_mirror() write(6,*) 'Setting proc config' call ga_set_pgroup(g_a,p_mirror) # endif if (.not.ga_allocate(g_a)) then #else # ifndef MIRROR if (.not. ga_create(MT_REAL, n, n, 'a', 0, 0, g_a)) then # else cBJP p_mirror = ga_pgroup_get_mirror() if (.not. nga_create_config(MT_REAL, ndim, dims, 'a', chunk, + p_mirror, g_a)) then cBJP write(6,*) 'Created g_a' # endif #endif write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',-1) endif c c check if handle is valid. be quiet unless error C if(.not.ga_valid_handle(g_a)) call ga_error("invalid handle",g_a) c #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format('> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c 4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_rfill(n*n, 0.0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format('> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = real(drand(0)) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = real(drand(0)) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a call ga_get(g_a, 1, n, 1, n, b, n) c do j = 1, n do i = 1, n if(MISMATCHF(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_sync() #ifndef MIRROR if (.not. ga_create(MT_REAL, n, n, 'b', 0, 0, g_b)) then #else if (.not. nga_create_config(MT_REAL, ndim, dims, 'b', chunk, + p_mirror, g_b)) then #endif call ga_error('ga_create failed for second array ',-1) endif c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, 1.0, 1, 1.0) call ga_sync() if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) #ifndef MIRROR x = abs(b(1,1) -1*nproc) #else x = abs(b(1,1) -1*lprocs) #endif if(x.gt. 1e-10)then #ifndef MIRROR write(6,*)'val=',b(1,1),' expected=',nproc, x #else write(6,*)'val=',b(1,1),' expected=',lprocs, x #endif call ga_error('overlapping accumulate failed',-1) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format('> Checking add ...') call ffflush(6) endif c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = real(drand(0)*real(i)) + 1 a(i,j) = 0.1*a(i,j) + 0.9*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add(0.1, g_a, 0.9, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the sdot function c if (me .eq. 0) then write(6,19) 19 format('> Checking sdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_sdot(g_a,g_b) if(MISMATCHF(sum1, sum2))then write(6,*) ' fdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',-1) else if (me.eq.0) then write(6,*) write(6,*) ' sdot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format('> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123 if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',-1) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',-1) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(iproc.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1.0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1.0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1.0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',-1) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_sync() c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_sync() do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) if (found(i,j, iv, jv, loop-1) ) goto 10 iv(loop) = i jv(loop) = j v(loop) = 1.0 *(i+j) #ifndef MIRROR b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array #else b(i,j) = b(i,j) + lprocs*x*v(loop) ! update local ref. array #endif enddo call ga_scatter_acc(g_a,v,iv,jv, ii,x) c call ga_sync() c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii i = iv(loop) j = jv(loop) if(MISMATCHF(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_sync() enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif c c Delete the global array c status = ga_destroy(g_a) c end c_____________________________________________________________ subroutine check_wrappers implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer n parameter (n=10000) double precision sum(n) double complex zsum(n), check(n) integer isum(n), ibuf(2) integer me, nproc, i real fsum(n) c nproc = ga_nnodes() me = ga_nodeid() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_gop (integer)' write(6,*) call ffflush(6) endif do i = 1, n isum(i) = i + me enddo call ga_gop(MT_INT, isum, n, '+') do i = 1, n if(isum(i).ne.(i*nproc + (nproc-1)*nproc/2))then call ga_error('ga_gop error -2',isum(i)) endif enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_gop (integer) is OK' write(6,*) endif call ga_sync() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_gop (double)' write(6,*) call ffflush(6) endif do i = 1, n sum(i) = i + 1d0 * me enddo call ga_gop(MT_DBL, sum, n, '+') do i = 1, n if(Int(sum(i)).ne.(i*nproc + (nproc-1)*nproc/2))then call ga_error('ga_gop error',Int(sum(i))) endif enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_gop (double) is OK' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_gop (real)' write(6,*) call ffflush(6) endif do i = 1, n fsum(i) = i + 1.0 * me enddo call ga_gop(MT_REAL, fsum, n, '+') do i = 1, n if(Int(fsum(i)).ne.(i*nproc + (nproc-1)*nproc/2))then call ga_error('ga_gop error',Int(fsum(i))) endif enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_gop (real) is OK' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_gop (double complex)' write(6,*) call ffflush(6) endif do i = 1, n zsum(i) = cmplx(i+1d0, i + 1d0 * me) check(i)= cmplx(nproc*i+nproc*1d0, nproc*i+(nproc-1)*nproc/2) enddo call ga_gop(MT_DCPL, zsum, n, '+') do i = 1, n if(zsum(i).ne.check(i)) then call ga_error('ga_gop error', -1) endif enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_gop (double complex) is OK' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_brdcst' write(6,*) call ffflush(6) endif if(me.eq.nproc-1)then ibuf(1) = me ibuf(2) = nproc endif call ga_brdcst(1000,ibuf,util_mitob(2),nproc-1) if(ibuf(1).ne.nproc-1)call ga_error('ibuf(1) error',ibuf(1)) if(ibuf(2).ne.nproc)call ga_error('ibuf(2) error',ibuf(2)) call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> ga_brdcst is OK ' write(6,*) call ffflush(6) endif call ga_sync() end subroutine check_mem(mem_size) implicit none integer mem_size #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,nmax,left,need, me,procs,g_a, g_b logical status c if(.not. ga_memory_limited())return me = ga_nodeid() procs = ga_nnodes() nmax = int(dsqrt(dble(mem_size/util_mitob(1)))) left = mem_size/procs - ga_inquire_memory() n = nmax/2 need = util_mdtob(n*n)/procs c if(me.eq.0)then write(6,*)' ' if(ga_uses_ma())then write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA used)' else write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA not used)' endif write(6,*)' ' write(6,*)' ' call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'a', 0, 0, g_a) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif call ffflush(6) endif c n = nmax left = mem_size/procs - ga_inquire_memory() need = util_mdtob(n*n)/procs if(me.eq.0)then call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'b', 0, 0, g_b) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif write(6,*)' ' write(6,*)' ' call ffflush(6) endif status = ga_destroy(g_a) end subroutine print_mem_info(n,left, need, total) implicit none integer n,left, need, total c write(6,*)' ' if(left - need .ge. 0) then write(6,1)n,n 1 format('> Creating array ',i4,' by ',i4,' -- should succeed') else write(6,2)n,n 2 format('> Creating array ',i4,' by ',i4,' -- SHOULD FAIL') endif write(6,3) need, left, total 3 format(' (need ',i7,' and ',i7,' out of ',i7,' bytes are left)') write(6,*)' ' call ffflush(6) c end subroutine my_lock(g_b) implicit none #include "global.fh" integer g_b, val, flag, i logical first_time double precision dummy common /lock/ val common /dum/ dummy data first_time /.true./ c c this awkward initialization is to avoid a weird problem C with block data on SUN if(first_time)then first_time = .false. dummy = .0 endif c val = ga_read_inc(g_b,1,1, 1) 10 call ga_get(g_b, 2,2,1,1, flag, 1) if(flag.eq.val) return c c to reduce memory stress, wait a while before retrying do i = 1, 100 dummy = dummy + .1 enddo goto 10 end subroutine my_unlock(g_b) implicit none #include "global.fh" integer g_b, val common /lock/ val c call ga_put(g_b, 2,2,1,1, val+1, 1) end logical function found(i,j, iv, jv, n) integer n integer i,j, iv(n), jv(n) integer loop found = .false. do loop = 1, n if(i .eq. iv(loop) .and. j .eq.jv(loop))then found = .true. goto 99 endif enddo 99 continue return end subroutine proc_remap() implicit none #include "global.fh" integer proc(100),nproc,i nproc = ga_nnodes() if(nproc.gt.100) $ call ga_error("remap requires<=100 processes",nproc) do i = 1, nproc proc(i) = nproc-i enddo c call ga_register_proclist(proc,nproc) end subroutine util_rfill(n,val,a,ia) implicit none real a(*), val integer n, ia, i c c initialise real array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_dfill(n,val,a,ia) implicit none double precision a(*), val integer n, ia, i c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_ifill(n,val,a,ia) implicit none integer n, ia, i, a(*),val c c initialise integer array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_qfill(n,val,a,ia) implicit none double complex a(*), val integer n, ia, i c c initialise double complex array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/testing/ngatest.m40000644000175000017500000000211512662210457014660 0ustar mbambadivert(-1) # what kind of data type to test? define(m4_test_int, `yes') define(m4_test_dbl, `yes') define(m4_test_dcpl, `yes') # test dimension from which to which? define(m4_dim_from, 1) define(m4_dim_to, 7) # functions to test define(m4_test_GA_FILL, `yes') define(m4_test_NGA_PUT, `yes') define(m4_test_NGA_GET, `yes') define(m4_test_NGA_ACC, `yes') define(m4_test_NGA_SCATTER, `yes') # define(m4_test_NGA_SCATTER_ACC, `yes') define(m4_test_NGA_GATHER, `yes') # periodic functions # define(m4_test_NGA_PERIODIC_GET, `yes') # define(m4_test_NGA_PERIODIC_PUT, `yes') # define(m4_test_NGA_PERIODIC_ACC, `yes') # patch related define(m4_test_NGA_FILL_PATCH, `yes') define(m4_test_NGA_COPY_PATCH, `yes') define(m4_test_NGA_SCALE_PATCH, `yes') define(m4_test_NGA_ADD_PATCH, `no') # depending on the data type, the functions are NGA_IDOT_PATCH, # NGA_DDOT_PATCH, and NGA_ZDOT_PATCH, corresponding to Integer, # Double, and Double Complex data types, respectively. define(m4_test_NGA_DOT_PATCH, `yes') divert include(`ngatest_src/ngatest.def') ga-5-4/global/testing/jacobi.F0000644000175000017500000001656012662210461014313 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: jacobi.F,v 1.9 2003-06-24 19:01:59 d3h325 Exp $ program jacobi * * Jacobi iterative method for solving Uxx + Uyy = 1 on [0,1]x[0,1] area * Global Arrays are used to store and access U and exact solution vectors * J.N., 06.01.94, works with GA 1.2 * implicit none #include "mafdecls.fh" #include "global.fh" integer heap, stack c c*** Intitialize a message passing library c #include "mp3.fh" c heap = 80000 stack = heap call ga_initialize() ! initialize GAs if (.not. ma_init(MT_DBL, heap, stack)) ! initialize MA $ call ga_error("ma init failed",heap+stack) #ifdef GA_TRACE call trace_init(10000) ! initialize trace #endif call iterate() ! do the work #ifdef GA_TRACE call trace_end(ga_nodeid()) ! end trace #endif c if(ga_nodeid().eq.0) print *,'All tests successful ' c call ga_terminate() ! terminate GAs c call MP_FINALIZE() end subroutine iterate() implicit none #include "mafdecls.fh" #include "global.fh" integer m ! grid size integer g_u, g_ux, g_diff ! handles to global arrays parameter (m = 10) integer ilo, ihi, jlo, jhi, ld, ni, nj integer i, k MA_ACCESS_INDEX_TYPE indexl, index, index_first, indexd ! MA addressing indices integer h_l, h_d ! handles to MA objects integer me, nproc ! my processor & number of procs double precision eps ! stopping number double precision S, W, C, N, E ! coef. of G matrix and d logical have_data ! do I "own" any data ? double precision norm, product, uxnorm data eps /1d-5/ c c*** check parallel environment me = ga_nodeid() nproc = ga_nnodes() c c*** create global arrays: g_u - approx. solution, g_ux - exact solution c g_diff will store g_u - g_ux if (.not. ga_create(MT_DBL, m, m, 'u', 1, 1, g_u)) $ call ga_error(' ga_create failed ',0) if (.not. ga_create(MT_DBL, m, m, 'ux', 1, 1, g_ux)) $ call ga_error(' ga_create failed ',0) if (.not. ga_create(MT_DBL, m, m, 'diff', 1, 1, g_diff)) $ call ga_error(' ga_create failed ',0) c c*** check which piece, if any, of g_ux (and g_u) I own call ga_distribution(g_ux, me, ilo, ihi, jlo, jhi) ni = ihi - ilo + 1 ! number of 'local' rows nj = jhi - jlo + 1 ! number of 'local' columns have_data = ni .gt. 0 .and. nj .gt. 0 c if(have_data)then c c*** allocate memory for D if(.not. ma_push_get(MT_DBL,ni*nj,'d',h_d, indexd)) & call ga_error('memory allocation failed',0) c c*** access local data call ga_access(g_ux, ilo, ihi, jlo, jhi, index, ld) c c*** create coefficients of the jacobi iteration matrix G and exact solution call jacinit(m, S, W, C, N, E, DBL_MB(indexd), ni, & DBL_MB(index), ilo, ihi, jlo, jhi, ld) c c*** release access to the local data (the data were updated !) call ga_release_update(g_ux, ilo, ihi, jlo, jhi) c c*** allocate memory for a copy of my piece of g_u and neighb. grid points if(.not. ma_push_get(MT_DBL,(ni+2)*(nj+2),'loc',h_l, indexl)) & call ga_error('memory allocation failed',0) c c*** zero the allocated memory do i = 1, (ni+2)*(nj+2) DBL_MB(indexl - 1 + i) = 0d0 ! indexl points to first element enddo endif c c*** initial guess for u -- zero call ga_zero(g_u) c c*** the stopping test is ||u-ux||/||ux||, ||.|| - second norm uxnorm = sqrt(ga_ddot(g_ux, g_ux)) ! ||g_ux|| c c*** Now, synchronize and then iterate k = 0 10 call ga_sync() k = k + 1 c if(have_data)then c c... first, get access to the local piece of g_u call ga_access(g_u, ilo, ihi, jlo, jhi, index, ld) c c... compute next approximation of u call nextu(ni, nj, dbl_mb(index), ld, dbl_mb(indexl), & ni+1, S, W, C, N, E, dbl_mb(indexd) ) c c... release access to the local data (the data were updated !) call ga_release_update(g_u, ilo, ihi, jlo, jhi) endif c c... compute the stopping number -- second norm call ga_add(1d0, g_u, -1d0, g_ux, g_diff) ! g_diff = g_u - g_ux product = ga_ddot(g_diff, g_diff) ! norm = sqrt(product)/uxnorm if(me.eq.0 .and. Mod(k,10).eq.1) print *,k,' error= ',norm c if(norm .gt. eps) then if(.not. have_data) goto 10 c c... not done yet, get a copy of my piece of g_u and neighboring grid points c ... determine where from we should copy data -- consider topology index_first = indexl if(jlo.eq.1) index_first = index_first + ni+2 if(ilo.eq.1) index_first = index_first + 1 c call ga_get(g_u, max(1,ilo-1), min(m,ihi+1), & max(1,jlo-1), min(m,jhi+1), & dbl_mb(index_first), ni+2 ) goto 10 endif c if(me.eq.0) then print *,' converged in ',k, ' iterations, error= ',norm endif c c*** deallocate MA memory and destroy global arrays if(have_data)then if(.not. ma_pop_stack(h_l))call ga_error('invalid handle ?',0) if(.not. ma_pop_stack(h_d))call ga_error('invalid handle ?',0) endif if(.not. ga_destroy(g_u)) call ga_error('invalid handle ?',0) if(.not. ga_destroy(g_ux)) call ga_error('invalid handle ?',0) if(.not. ga_destroy(g_diff)) call ga_error('invalid handle ?',0) c call ga_sync() end subroutine nextu(ni, nj, u, ld, u0, ld0, S, W, C, N, E, D ) implicit none integer ni, nj, ld, ld0 double precision u(1:ld,1:nj), u0(0:ld0,0:nj), D(1:ni,1:nj) double precision S, W, C, N, E integer i, j c do j = 1, nj do i = 1, ni u(i,j) = S*u0(i+1,j) + W*u0(i,j-1) + & N*u0(i-1,j) + E*u0(i,j+1) + D(i,j) enddo enddo end subroutine jacinit(m, S, W, C, N, E, D, ldd, ux, & ilo, ihi, jlo, jhi, ldu ) implicit none #include "mafdecls.fh" #include "global.fh" double precision S, W, C, N, E, temp integer ilo, ihi, jlo, jhi, ldu, ldd, i, j integer m, ni, nj, jj, ii double precision h, ux(ldu,m), D(ldd,m) if(m.le.1)call ga_error('jacinit: wrong value of m',0) S = .25 W = .25 N = .25 E = .25 h = 1d0/(m+1) ni = ihi - ilo + 1 ! number of 'local' rows nj = jhi - jlo + 1 ! number of 'local' columns do j = 1, nj jj = jlo + j -1 do i = 1, ni temp = 0d0 ii = ilo + i -1 if(jj .eq. 1) temp = temp + 1 if(ii .eq. 1) temp = temp + 1 if(ii .eq. m) temp = temp + jj*h + 1 if(jj .eq. m) temp = temp + ii*h + 1 D(i,j) = temp/4d0 ux(i,j)= 1d0 + h*h*ii*jj enddo enddo end ga-5-4/global/testing/simple_groups.F0000644000175000017500000000315612662210461015751 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit none #include "global.fh" #include "mafdecls.fh" integer nproc,me integer g_a,g_b,g_c logical status integer n,i,j parameter (n=4) integer lo(2),hi(2) integer dims(2) double precision buf(n,n) integer proc_group(0:100),proclist(100),inode,nprocs #include "mp3.fh" call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() status = ma_init(MT_DBL, 100000, 100000) if (.not. status) call ga_error('ma_init failed',-1) status = ma_set_auto_verify(.true.) status = ma_set_hard_fail(.true.) status = ma_set_error_print(.true.) inode = ga_cluster_nodeid() do i=0,ga_cluster_nnodes()-1 do j=0,ga_cluster_nprocs(i)-1 proclist(j+1)=ga_cluster_procid(i,j) enddo proc_group(i)=ga_pgroup_create(proclist,ga_cluster_nprocs(i)) enddo call ga_sync() do i = 0, ga_cluster_nnodes()-1 if (i.eq.inode) then write(0,'(I4,A,I4)') me,' joining group', , proc_group(inode) call ga_pgroup_set_default(proc_group(inode)) status = ga_create(MT_DBL, n, n, 'a', 1, 1, g_a) if (.not. status) call ga_error('ga_create failed',-1) write(0,'(I4,A,I4,A,I4)') me,' Created array of group ', , proc_group(inode), ' as proc no. ',ga_nodeid() call ga_print_distribution(g_a) endif enddo call ga_pgroup_set_default(ga_pgroup_get_world()) call ga_terminate() call MP_FINALIZE() end ga-5-4/global/testing/mp3.h0000644000175000017500000000514012662210457013622 0ustar mbamba#if defined(PVM) # include extern void pvm_init(int argc, char *argv[]); extern double armci_timer(); # ifdef CRAY # define MPGROUP (char *)NULL # define MP_INIT(argc,argv) # else # define MPGROUP "mp_working_group" # define MP_INIT(argc,argv) pvm_init(argc, argv) # endif # define MP_FINALIZE() pvm_exit() # define MP_BARRIER() pvm_barrier(MPGROUP,-1) # define MP_MYID(pid) *(pid) = pvm_getinst(MPGROUP,pvm_mytid()) # define MP_PROCS(pproc) *(pproc) = (int)pvm_gsize(MPGROUP) # define MP_TIMER armci_timer # define MP_ASSERT(code) code #elif defined(MSG_COMMS_TCGMSG) || defined(MSG_COMMS_TCGMSG5) || defined(MSG_COMMS_TCGMSGMPI) # include # define MP_BARRIER() tcg_synch(30000) # define MP_INIT(argc,argv) tcg_pbegin((argc),(argv)) # define MP_FINALIZE() tcg_pend() # define MP_MYID(pid) *(pid) = (int)tcg_nodeid() # define MP_PROCS(pproc) *(pproc) = (int)tcg_nnodes() # define MP_TIMER tcg_time # define MP_ASSERT(code) code #elif defined(BGML) extern double armci_timer(); # define MP_BARRIER() armci_msg_barrier() # define MP_FINALIZE() # define MP_INIT(argc,argv) # define MP_MYID(pid) *(pid)=armci_msg_me() # define MP_PROCS(pproc) *(pproc)=armci_msg_nproc() # define MP_TIMER armci_timer # define MP_ASSERT(code) code #else # include # define MP_BARRIER() MPI_Barrier(MPI_COMM_WORLD) # define MP_FINALIZE() MPI_Finalize() # if defined(DCMF) || defined(MPI_MT) || defined(MPI_PT) static inline int MPI_INIT_THREAD(int *argc, char ***argv) { int status; int provided; status = MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); return status; } # define MP_INIT(argc,argv) MPI_INIT_THREAD(&(argc),&(argv)) # else # define MP_INIT(argc,argv) MPI_Init(&(argc),&(argv)) # endif # define MP_MYID(pid) MPI_Comm_rank(MPI_COMM_WORLD, (pid)) # define MP_PROCS(pproc) MPI_Comm_size(MPI_COMM_WORLD, (pproc)) # define MP_TIMER MPI_Wtime # define MP_ASSERT(code) do { \ if (MPI_SUCCESS != (code)) { \ MPI_Abort(MPI_COMM_WORLD, (code)); \ } \ } while (0) #endif #ifdef MPI_SPAWN # define GA_INIT(argc,argv) GA_Initialize_args(&(argc),&(argv)) # define ARMCI_INIT(argc,argv) ARMCI_Init_args(&(argc),&(argv)) #else # define GA_INIT(argc,argv) GA_Initialize() # define ARMCI_INIT(argc,argv) ARMCI_Init() #endif ga-5-4/global/testing/mp3def.fh0000644000175000017500000000010112662210461014432 0ustar mbamba#define MP_DEFINES_ONLY #include "mp3.fh" #undef MP_DEFINES_ONLY ga-5-4/global/testing/ntestc.c0000644000175000017500000001717612662210457014432 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "macdecls.h" #include "ga.h" #include "mp3.h" /* utilities for GA test programs */ #include "testutil.h" #define N 10 /* first dimension */ #define NDIM 4 /* number of dimensions */ #define BASE 0 #define PERMUTE_ /*#define NEW_API*/ /*\ fill n-dimensional array section with value \*/ void fill_patch(double *ptr, int dim[], int ld[], int ndim, double val) { int i, j, stride=1; switch (ndim){ case 0: GA_Error("fill_patch: error",ndim); case 1: for(i=0;i adims[d] ){ map[offset] = regions[i].lo[d]; offset++; block[d]++; adims[d]= regions[i].hi[d]; } if(me==0){ printf("Distribution map contains %d elements\n",offset); print_subscript("number of blocks for each dimension",ndim,block,"\n"); print_subscript("distribution map",offset,map,"\n\n"); fflush(stdout); } if(me==0)printf("Creating array B applying distribution of A\n"); # ifdef USE_DUPLICATE g_b = GA_Duplicate(g_a,"array B"); # else g_b = NGA_Create_irreg(MT_F_DBL, NDIM, dims, "array B", block,map); # endif if(!g_b) GA_Error("create failed: B",1); if(me==0)printf("OK\n\n"); free(proclist); free(regions); free(map); GA_Print_distribution(g_b); GA_Sync(); if(me==0){ printf("\nCompare distributions of A and B\n"); if(GA_Compare_distr(g_a,g_b)) printf("Failure: distributions NOT identical\n"); else printf("Success: distributions identical\n"); fflush(stdout); } if(me==0){ printf("\nAccessing local elements of A: set them to the owner process id\n"); fflush(stdout); } GA_Sync(); NGA_Distribution(g_a,me,lo,hi); if(hi[0]>=0){/* -1 means no elements stored on this processor */ double *ptr; int locdim[NDIM]; NGA_Access(g_a, lo,hi, &ptr, ld); for(i=0;i=0){ char msg[100]; sprintf(msg,"%d: leading dimensions",me); print_subscript(msg,ndim-1,ld,"\n"); fflush(stdout); } GA_Sync(); } GA_Sync(); if(me==0)printf("\nRandomly checking the update using ga_get on array sections\n"); GA_Sync(); /* show ga_get working and verify array updates * every process does N random gets * for simplicity get only a single row at a time */ srand(me); /* different seed for every process */ hi[ndim-1]=adims[ndim-1] -1 + BASE; for(i=1;i #include #include "ga.h" #include "macdecls.h" #include "mp3.h" static int me; static int nproc; #if 0 # define PRINT(AT,AT_MSK) do { \ int p; \ for (p=0; p #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "armci.h" #include "message.h" #include "mp3.h" #define SIZE 640 /**< must be >= biggest chunk + 128 */ #define CHUNK_NUM 28 #define TIMER armci_timer #define MALLOC_LOC 1 /**< use ARMCI_Malloc_local instead of plain malloc */ #ifndef GA_ABS # define GA_ABS(a) ((a)>0? (a): -(a)) #endif #define OP_GET 0 #define OP_PUT 1 #define OP_ACC 2 #define ENABLE_CLEANUP 0 static int CHECK_RESULT = 0; static int chunk[CHUNK_NUM] = { 1, 3, 4, 6, 9, 12, 16, 20, 24, 30, 40, 48, 52, 64, 78, 91, 104, 128, 142, 171, 210, 256, 300, 353, 400, 440, 476, 512 }; static int nproc = -1; static int me = -1; static int warn_accuracy = 0; static void fill_array(double *arr, int count, int which); static double time_op(int g_a, double *buf_, int chunk, int loop, int proc, int ndim, int op); static void test_1D(); static void test_2D(); int main(int argc, char **argv) { /* initialize GA */ MP_INIT(argc,argv); GA_Initialize_args(&argc, &argv); me = GA_Nodeid(); nproc = GA_Nnodes(); if (nproc < 2) { if (me == 0) { fprintf(stderr, "USAGE: 2 <= processes - got %d\n", nproc); } GA_Terminate(); MP_FINALIZE(); exit(0); } if (!me) { printf("\n Performance of Basic Blocking Communication Operations\n"); } GA_Sync(); /* test 1 dimension array */ if (!me) { printf("\n\t\t\tContiguous Data Transfer\n"); } test_1D(); /* test 2 dimension array */ if (!me) { printf("\n\t\t\tStrided Data Transfer\n"); } test_2D(); #if 0 if (me == 0) { if (warn_accuracy) { printf("\nWARNING: Your timer does not have sufficient accuracy for this test (%d)\n", warn_accuracy); } printf("\n\n------------ Now we test the same data transfer for correctness ----------\n"); fflush(stdout); } #endif GA_Terminate(); MP_FINALIZE(); return(0); } double time_op(int g_a, double *buf_, int chunk, int loop, int proc, int ndim, int op) { double start_time = 0; double stop_time = 0; double total_time = 0; int lo[2] = {-1,-1}; int hi[2] = {-1,-1}; int ld = -1; int i = 0; int bal = 0; double *buf = buf_; double alpha = 1; /* get the location within the g_a for the given proc */ NGA_Distribution(g_a, proc, lo, hi); /* determine how much data to grab based on the chunk and dimensionality */ if (ndim == 1) { hi[0] = lo[0] + chunk*chunk - 1; } else if (ndim == 2) { hi[0] = lo[0] + chunk - 1; hi[1] = lo[1] + chunk - 1; ld = chunk; } else { GA_Error("invalid ndim for time_op", ndim); } start_time = TIMER(); for (i=0; i #include #include "ga.h" #include "macdecls.h" #include "mp3.h" static int me; static int nproc; #define assign_reg(a,b) (a) = (b) #define assign_cpl(a,b) (a).real = (b).real; (a).imag = (b).imag #define assign_val_reg(a,b,c) (a) = (b) #define assign_val_cpl(a,b,c) (a).real = (b); (a).imag = (c) #define eq_zero_reg(a) (0 == (a)) #define eq_zero_cpl(a) (0 == (a).real && 0 == (a).imag) #define neq_zero_reg(a) (0 != (a)) #define neq_zero_cpl(a) (0 != (a).real || 0 != (a).imag) #define neq_reg(a,b) ((a) != (b)) #define neq_cpl(a,b) ((a).real != (b).real || (a).imag != (b).imag) #define assign_add_reg(a,b,c) (a) = (b) + (c) #define assign_add_cpl(a,b,c) (a).real = (b).real + (c).real; \ (a).imag = (b).imag + (c).imag #define cast_reg(a) ((float)(a)) #define cast_cpl(a) ((float)(a).real) #if 0 # define PRINT(AT,AT_MSK) do { \ int p; \ for (p=0; p column merging [',i3,':',i3,',', $ i3,':',i3,'] ') call ffflush(6) endif else c > 2 ilo = 1 ihi = trial*eps jlo = 1 jhi = trial*eps if(cluster.eq.0)then call ga_dfill_patch(g_a, ilo,ihi,jlo,jhi,0d0) ilo = 1 ihi = n jlo = 1 jhi = n else call ga_zero(g_a) call ga_copy_patch('n', g_b,ilo,ihi,jlo,jhi, $ g_a,ilo,ihi,jlo,jhi) endif c if (me .eq. 0) then write(6,101)trial, ilo,ihi,jlo,jhi 101 format(i2,'> patch merging [',i3,':',i3,',', $ i3,':',i3,'] ') call ffflush(6) endif endif c call ga_net_merge(g_a, ilo, ihi, jlo, jhi) c call ga_print(g_a,1) c c*** check if correct do j = 1+ga_nodeid(), n, ga_nnodes() call ga_get(g_a,1,n,j,j,buf,n) do i = 1, n if(a(i,j) .ne. buf(i)) then print *, me, '(',i,j,')', a(i,j), buf(i) call ga_error("merging failed",j) endif enddo enddo if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c if(trial .eq.1) then c g_b keeps reference data for next trials call ga_copy(g_a,g_b) endif enddo c status = ga_destroy(g_a) c end ga-5-4/global/testing/testutil.h0000644000175000017500000000217512662210461015000 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #define add_range_ F77_FUNC_(add_range,ADD_RANGE) #define compare_patches_ F77_FUNC_(compare_patches,COMPARE_PATCHES) #define copy_range_ F77_FUNC_(copy_range,COPY_RANGE) #define dot_range_ F77_FUNC_(dot_range,DOT_RANGE) #define init_array_ F77_FUNC_(init_array,INIT_ARRAY) #define print_range_ F77_FUNC_(print_range,PRINT_RANGE) #define register_ext_memory_ F77_FUNC_(register_ext_memory,REGISTER_EXT_MEMORY) #define set_ma_use_armci_mem_ F77_FUNC_(set_ma_use_armci_mem,SET_MA_USE_ARMCI_MEM) #define scale_patch_ F77_FUNC_(scale_patch,SCALE_PATCH) #define util_mdtob_ F77_FUNC_(util_mdtob,UTIL_MDTOB) #define util_mitob_ F77_FUNC_(util_mitob,UTIL_MITOB) #define util_timer_ F77_FUNC_(util_timer,UTIL_TIMER) /* extern void get_range( int ndim, int dims[], int lo[], int hi[]); */ /* extern void new_range(int ndim, int dims[], int lo[], int hi[], int new_lo[], int new_hi[]); */ extern void print_subscript(char *pre,int ndim, int subscript[], char* post); /* extern void print_distribution(int g_a); */ ga-5-4/global/testing/nga-onesided.m40000644000175000017500000000076612662210460015554 0ustar mbambadivert(-1) # what kind of data type to test? define(m4_test_int, `yes') define(m4_test_dbl, `yes') define(m4_test_dcpl, `yes') # test dimension from which to which? define(m4_dim_from, 1) define(m4_dim_to, 7) # functions to test define(m4_test_NGA_PUT, `yes') define(m4_test_NGA_GET, `yes') define(m4_test_NGA_ACC, `yes') define(m4_test_NGA_SCATTER, `yes') define(m4_test_NGA_SCATTER_ACC, `yes') define(m4_test_NGA_GATHER, `yes') divert include(`ngatest_src/ngatest.def') ga-5-4/global/testing/g2test.F0000644000175000017500000005405512662210460014274 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF #define USE_CORNERS #define PRINT_VAL c#define NEW_API c c Add some control over which tests are performed c #define TEST_1 #define TEST_2 #define TEST_3 #define TEST_4 c#define TEST_5 #define TEST_6 #define TEST_7 #define TEST_8 program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM, nwidth, MAXPROC, nloop parameter (nmax = 1000, DIM = 2, nwidth = 2, MAXPROC = 2000) parameter (nloop = 50) integer ndim, nproc, pdims(7), type, dcnt, g_a, maxval, nbhandle integer i, j, dims(7), width(7), map(2*nmax) integer lo(7), hi(7), ld(7) integer lo2(7), hi2(7), ld2(7) integer dims3(7), ld3(7), chunk(7) MA_ACCESS_INDEX_TYPE index3 integer a(nmax, nmax), b(nmax+2*nwidth,nmax+2*nwidth) double precision start,t1,t2,t3,t4,t5,tmp double precision t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18 double precision t19,t20,t21,t22,t23,t24,t25,t26,t27 logical status, safe_put, safe_get, has_data(0:MAXPROC-1) parameter (heap=1000*1000*4, fudge=1000, stack=1000*1000) logical corner_flag c c*** Intitialize a message passing library c #include "mp3.fh" #ifdef USE_CORNERS corner_flag = .true. #else corner_flag = .false. #endif c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c print* call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap + fudge call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then print *, 'using ', nproc, ' process(es)' call ffflush(6) endif c c Test ghost distributions c ndim = DIM c c Create irregular distribution on all nodes c call factor(nproc,ndim,pdims) dims(1) = pdims(1) * nmax dims(2) = pdims(2) * nmax maxval = 1 do i = 1, ndim maxval = dims(i)*maxval end do maxval = maxval - 1 c dcnt = 1 do i = 1, pdims(1) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do do i = 1, pdims(2) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do c do i = 1, ndim width(i) = nwidth chunk(i) = 1 if (pdims(i).gt.dims(i)) pdims(i) = dims(i) if (me.eq.0) then write(6,*) 'Value of pdims(',i,') is ',pdims(i) endif call ffflush(6) c do j = 1, pdims(i) c if (j.eq.1) then c map(dcnt) = 1 c else c map(dcnt) = ((j-1)*dims(i))/pdims(i) + 1 c endif c dcnt = dcnt + 1 c end do ld(i) = nmax end do if (me.eq.0) then do i = 1, dcnt - 1 write(6,'("map(",i2,") = ",i5)') i,map(i) call ffflush(6) end do endif type = MT_INT #ifdef NEW_API g_a = ga_create_handle(); call ga_set_data(g_a,ndim,dims,type) call ga_set_array_name(g_a,"test_array") call ga_set_irreg_distr(g_a,map,pdims) call ga_set_ghosts(g_a,width) status = ga_allocate(g_a) #else status = nga_create_ghosts_irreg (type, ndim, dims, width, + "test_array", map, pdims, g_a) c status = nga_create_ghosts(type, ndim, dims, width, c + "test_array", chunk, g_a) #endif if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif c c Find processors that have data c call ga_sync do i = 0, nproc-1 call nga_distribution(g_a, i, lo, hi) has_data(i) = .true. do j = 1, ndim if (lo(j).eq.0.and.hi(j).eq.-1) has_data(i) = .false. end do call ffflush(6) call ga_sync end do c c initialize g_a c call ga_sync call nga_distribution(g_a, me, lo, hi) do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = (i + lo(1) - 2)*dims(1) + (j + lo(2) - 2) end do end do safe_put = .true. do i = 1, ndim if (hi(i).lt.lo(i)) safe_put = .false. end do if (has_data(me).and.safe_put) call nga_put(g_a, lo, hi, a, ld) c c get patch with ghost cells c do i = 1, ndim lo2(i) = lo(i) - width(i) hi2(i) = hi(i) + width(i) ld2(i) = ld(i) + 2*width(i) end do call ga_sync call ffflush(6) safe_get = .true. c do i = 1, ndim c if (hi2(i)-lo2(i).ge.dims(i)) safe_get = .false. c end do t19 = 0.0d00 t20 = 0.0d00 t21 = 0.0d00 do i = 1, nloop start = util_timer() call ga_ghost_barrier t19 = t19 + util_timer() - start start = util_timer() if (has_data(me).and.safe_get) + call nga_periodic_get(g_a, lo2, hi2, b, ld2) t20 = t20 + util_timer() - start start = util_timer() call ga_ghost_barrier t21 = t21 + util_timer() - start end do t19 = t19/dble(nloop) t20 = t20/dble(nloop) t21 = t21/dble(nloop) 102 format(14i5) if (me.eq.0) then write(6,*) '*' write(6,*) '* Performing nga_access_ghosts' write(6,*) '*' call ffflush(6) endif if (has_data(me)) call nga_access_ghosts(g_a, dims3, + index3, ld3) call ga_sync #ifdef TEST_1 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 1' write(6,*) endif t1 = 0.0d00 t2 = 0.0d00 t3 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t1 = t1 + util_timer() - start start = util_timer() call ga_update1_ghosts(g_a) t2 = t2 + util_timer() - start start = util_timer() call ga_ghost_barrier t3 = t3 + util_timer() - start end do t1 = t1/dble(nloop) t2 = t2/dble(nloop) t3 = t3/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,1) call ga_sync #endif #ifdef TEST_2 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 2' write(6,*) endif t4 = 0.0d00 t5 = 0.0d00 t6 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t4 = t4 + util_timer() - start start = util_timer() status = ga_update2_ghosts(g_a) t5 = t5 + util_timer() - start start = util_timer() call ga_ghost_barrier t6 = t6 + util_timer() - start end do t4 = t4/dble(nloop) t5 = t5/dble(nloop) t6 = t6/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,2) call ga_sync #endif #ifdef TEST_3 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 3' write(6,*) endif t7 = 0.0d00 t8 = 0.0d00 t9 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t7 = t7 + util_timer() - start start = util_timer() status = ga_update3_ghosts(g_a) t8 = t8 + util_timer() - start start = util_timer() call ga_ghost_barrier t9 = t9 + util_timer() - start end do t7 = t7/dble(nloop) t8 = t8/dble(nloop) t9 = t9/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,3) call ga_sync #endif #ifdef TEST_4 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 4' write(6,*) endif t10 = 0.0d00 t11 = 0.0d00 t12 = 0.0d00 call ga_sync call ga_set_ghost_corner_flag(g_a,corner_flag) c status = ga_set_update4_info(g_a) do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t10 = t10 + util_timer() - start start = util_timer() status = ga_update4_ghosts(g_a) t11 = t11 + util_timer() - start start = util_timer() call ga_ghost_barrier t12 = t12 + util_timer() - start end do t10 = t10/dble(nloop) t11 = t11/dble(nloop) t12 = t12/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,4) call ga_sync #endif #ifdef TEST_5 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 5' write(6,*) endif t13 = 0.0d00 t14 = 0.0d00 t15 = 0.0d00 call ga_sync call ga_set_ghost_corner_flag(g_a,corner_flag) c status = ga_set_update5_info(g_a) do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t13 = t13 + util_timer() - start start = util_timer() c write(6,*) 'got to ga_update5_ghosts' status = ga_update5_ghosts(g_a) c write(6,*) 'completed ga_update5_ghosts' t14 = t14 + util_timer() - start start = util_timer() call ga_ghost_barrier t15 = t15 + util_timer() - start end do t13 = t13/dble(nloop) t14 = t14/dble(nloop) t15 = t15/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,5) call ga_sync #endif #ifdef TEST_6 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 6' write(6,*) endif t16 = 0.0d00 t17 = 0.0d00 t18 = 0.0d00 call ga_sync do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t16 = t16 + util_timer() - start start = util_timer() status = ga_update6_ghosts(g_a) t17 = t17 + util_timer() - start start = util_timer() call ga_ghost_barrier t18 = t18 + util_timer() - start end do t16 = t16/dble(nloop) t17 = t17/dble(nloop) t18 = t18/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,6) call ga_sync #endif #ifdef TEST_7 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 7' write(6,*) endif t22 = 0.0d00 t23 = 0.0d00 t24 = 0.0d00 call ga_sync do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t22 = t22 + util_timer() - start start = util_timer() status = ga_update7_ghosts(g_a) t23 = t23 + util_timer() - start start = util_timer() call ga_ghost_barrier t24 = t24 + util_timer() - start end do t22 = t22/dble(nloop) t23 = t23/dble(nloop) t24 = t24/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,7) call ga_sync #endif #ifdef TEST_8 if (me.eq.0) then write(6,*) write(6,*) 'Testing non-blocking update' write(6,*) endif t25 = 0.0d00 t26 = 0.0d00 t27 = 0.0d00 call ga_sync do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t25 = t25 + util_timer() - start start = util_timer() call nga_update_ghosts_nb(g_a,nbhandle) call ga_nbwait(nbhandle) t26 = t26 + util_timer() - start start = util_timer() call ga_ghost_barrier t27 = t27 + util_timer() - start end do t25 = t25/dble(nloop) t26 = t26/dble(nloop) t27 = t27/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,8) call ga_sync #endif if (me.eq.0) then write(6,*) '*' write(6,*) '* Completed updates successfully' write(6,*) '*' call ffflush(6) endif call ga_sync c #ifdef TEST_1 tmp = t2 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 1,tmp/dble(nproc) endif tmp = t1 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t3 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_2 tmp = t5 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 2,tmp/dble(nproc) endif tmp = t4 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t6 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_3 tmp = t8 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 3,tmp/dble(nproc) endif tmp = t7 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t9 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_4 tmp = t11 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 4,tmp/dble(nproc) endif tmp = t10 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t12 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_5 tmp = t14 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 5,tmp/dble(nproc) endif tmp = t13 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t15 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_6 tmp = t17 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 6,tmp/dble(nproc) endif tmp = t16 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t18 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_7 tmp = t23 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 7,tmp/dble(nproc) endif tmp = t22 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t24 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_8 tmp = t26 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 8,tmp/dble(nproc) endif tmp = t25 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t27 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif tmp = t20 call ga_dgop(6,tmp,1,'+') if (me.eq.0) then write(6,310) tmp/dble(nproc) endif tmp = t19 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t21 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif 300 format('Average time for ga_update',i1,'_ghosts ',e12.3) 310 format('Average time for nga_periodic_get ',e12.3) 400 format(' Average time for prior sync ',e12.3) 500 format(' Average time for post sync ',e12.3) 127 continue c if(ga_nodeid().eq.0) print *,'All tests successful ' c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c subroutine zero_ghosts(a,lda,b,ldb,w,dims) integer lda,ldb,w(*),dims(*) integer a(lda,*),b(ldb,*) integer i, j do j = 1, dims(2) do i = 1, dims(1) if ((i.gt.w(1).and.i.le.dims(1)-w(1)).and. + (j.gt.w(2).and.j.le.dims(2)-w(2))) then a(i,j) = b(i-w(1),j-w(2)) else a(i,j) = 0 endif end do end do return end c subroutine aprint(a,nrow,ncol,ld,has_data) #include "global.fh" integer ld integer a(ld,*) integer i, j, k, nproc logical has_data(0:1999) nproc = ga_nnodes() do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then write(6,*) '*' write(6,*) '* Data on processor ',k-1 write(6,*) '*' do i = 1, min(nrow,12) write (6,102) (a(i,j), j = 1, min(ncol,12)) 102 format(14i5) end do endif call ffflush(6) enddo c return end c subroutine atest(a,nrow,ncol,ld,b,ld2,has_data,width, + check_corner, idx) #include "global.fh" integer ld, width(7) integer a(ld,*), b(ld2,*) integer i, j, nproc, me, idx logical has_data(0:1999), check_data logical check_corner nproc = ga_nnodes() me = ga_nodeid() check_data = .true. call ga_sync if (has_data(me)) then do i = 1, nrow do j = 1, ncol if (.not.check_corner.and.(.not. + ((i.le.width(1).and.j.le.width(2)).or. + (i.le.width(1).and.j.gt.ncol-width(2)).or. + (i.gt.nrow-width(1).and.j.le.width(2)).or. + (i.gt.nrow-width(1).and.j.gt.ncol-width(2))))) then if (a(i,j).ne.b(i,j)) check_data = .false. else if (check_corner) then if (a(i,j).ne.b(i,j)) check_data = .false. endif end do end do else check_data = .false. endif if (check_data) then i = 1 else i = 0 endif call ga_igop(1,i,1,'+') if (i.ne.nproc) then check_data = .false. else check_data = .true. endif if (check_data.and.me.eq.0) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is the same on' write(6,100) idx 100 format( ' * all processors for update ',i1) write(6,*) '*' else if (.not.check_data) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is NOT the same on' write(6,200) me,idx 200 format( ' * processor ',i2,' for update ',i1) write(6,*) '*' endif call ffflush(6) c return end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(7),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end ga-5-4/global/testing/lock.c0000644000175000017500000000667212662210460014053 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDLIB_H # include #endif #include "mpi.h" #include "macdecls.h" #include "ga.h" #include "armci.h" #include "mp3.h" #define NDIM 1 int main(int argc, char **argv) { int me; int nproc; int status; int g_a; int dims[NDIM]; int chunk[NDIM]; int pg_world; size_t num = 10; double *p1 = NULL; double *p2 = NULL; size_t i; int num_mutex; int lo[1]; int hi[1]; int ld[1]={1}; MPI_Comm comm; MP_INIT(argc,argv); GA_INIT(argc,argv); me = GA_Nodeid(); nproc = GA_Nnodes(); comm = GA_MPI_Comm_pgroup_default(); printf("%d: Hello world!\n",me); if (me==0) printf("%d: GA_Initialize\n",me); /*if (me==0) printf("%d: ARMCI_Init\n",me);*/ /*ARMCI_Init();*/ /*if (me==0) printf("%d: MA_Init\n",me);*/ /*MA_init(MT_DBL, 8*1024*1024, 2*1024*1024);*/ if (me==0) printf("%d: GA_Create_handle\n",me); g_a = GA_Create_handle(); if (me==0) printf("%d: GA_Set_array_name\n",me); GA_Set_array_name(g_a,"test array A"); dims[0] = 30; if (me==0) printf("%d: GA_Set_data\n",me); GA_Set_data(g_a,NDIM,dims,MT_DBL); chunk[0] = -1; if (me==0) printf("%d: GA_Set_chunk\n",me); GA_Set_chunk(g_a,chunk); if (me==0) printf("%d: GA_Pgroup_get_world\n",me); pg_world = GA_Pgroup_get_world(); if (me==0) printf("%d: GA_Set_pgroup\n",me); GA_Set_pgroup(g_a,pg_world); if (me==0) printf("%d: GA_Allocate\n",me); status = GA_Allocate(g_a); if(0 == status) MPI_Abort(comm,100); if (me==0) printf("%d: GA_Zero\n",me); GA_Zero(g_a); if (me==0) printf("%d: GA_Sync\n",me); GA_Sync(); num = 10; p1 = malloc(num*sizeof(double)); /*double* p1 = ARMCI_Malloc_local(num*sizeof(double));*/ if (p1==NULL) MPI_Abort(comm,1000); p2 = malloc(num*sizeof(double)); /*double* p2 = ARMCI_Malloc_local(num*sizeof(double));*/ if (p2==NULL) MPI_Abort(comm,2000); for ( i=0 ; i Performance of ga_get, ga_put & ga_acc n = ', n print *,' ' endif c c do loop=1,2 c c*** local ops c call ga_distribution(g_a, me, ilo, ihi, jlo, jhi) call TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo, jhi) c c*** remote ops c call ga_distribution(g_a, nproc-1, ilo, ihi, jlo, jhi) call TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo, jhi) c enddo end subroutine TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo,jhi) implicit none #include "global.fh" #include "testutil.fh" c integer num_chunks, chunk(num_chunks) integer n, ilo, ihi, jlo,jhi,g_a double precision buf(*), tg, tp, ta double precision time_acc, time_get, time_put c integer me integer loop, jump, count, bytes c me = ga_nodeid() if (me .eq. 0) then write(6,*)' ' write(6,'(21X,8hACCESS [,i3,1h:,i4,1h,,i3,1h:,i4,1h])') & ilo,ihi,jlo,jhi write(6,*)'bytes loop get put', & ' accumulate' call flush(6) endif call ga_sync() c do loop = 1, num_chunks bytes = util_mdtob(1)*chunk(loop)*chunk(loop) !how much data is accessed jump = n/(60*loop) ! jump distance between consecutive patches c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tg= time_get(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count) else call sleep(2) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tp= time_put(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count) else call sleep(2) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then ta= time_acc(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count) else call sleep(2) endif c if (me .eq. 0) then write(6,77)bytes, count, tg, 1d-6*bytes/tg, & tp, 1d-6*bytes/tp, ta, 1d-6*bytes/ta call flush(6) endif enddo c 77 format(i6, i5, 3(d10.3, d9.2,'MB/s')) end double precision function & time_acc(g_a, is, ie, js, je, buf, chunk, jump, count) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 call ga_acc(g_a, ilo, ihi, jlo, jhi, buf, chunk, 1d0) enddo enddo seconds = util_timer() - seconds c time_acc = seconds/count end double precision function & time_get(g_a, is, ie, js, je, buf, chunk, jump, count) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 call ga_get(g_a, ilo, ihi, jlo, jhi, buf, chunk) enddo enddo seconds = util_timer() - seconds c time_get = seconds/count end double precision function & time_put(g_a, is, ie, js, je, buf, chunk, jump, count) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 call ga_put(g_a, ilo, ihi, jlo, jhi, buf, chunk) enddo enddo seconds = util_timer() - seconds c time_put = seconds/count end ga-5-4/global/testing/random.F0000644000175000017500000001017012662210460014332 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit none #include "mafdecls.fh" #include "global.fh" integer dim, minutes integer heap, stack logical status integer proc, me c c**** You can change dimension of the array and duration of the test here parameter (dim=500, minutes =90) c #include "mp3.fh" c c*** Initialize GA call ga_initialize() c proc = ga_nnodes() heap = dim*dim/proc stack= heap c status = ma_init(MT_DBL, stack, heap) if (.not. status) call ga_error( 'ma_init failed',stack+heap) c me = ga_nodeid() if(me.eq.0)then print *, 'Testing random gets and puts' print *, ' array: ',dim,' x ',dim print *, ' using ',proc, ' process(es)' print *, ' test should run for ',minutes,' minutes' call ffflush(6) endif c call check_dbl(dim, minutes) c if(me.eq.0)then print *, 'Test completed succesfuly' endif c if(ga_nodeid().eq.0)call ga_print_stats() call ga_terminate() call MP_FINALIZE() end subroutine check_dbl(dim, minutes) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n parameter (n = 10) integer dim, minutes double precision a(n,n) double precision t0, elapsed integer g_a integer index, ld integer iran, i,j, loop, maxloop, ilo, ihi, jlo, jhi, range integer nproc, me logical status c c**** maxloop determines number of puts/gest done before checking the clock c parameter (maxloop = 100000) double precision crap iran(i) = int(drand(0)*real(i-1)) + 1 c nproc = ga_nnodes() me = ga_nodeid() crap = drand(real(me)) !different seed for each process if(n .gt. dim) call ga_error('insufficient dimension',dim) c status = ga_create(MT_DBL, dim, dim, 'a', 0, 0, g_a) if (.not. status) then write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c c initialize array in place call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) call ga_access(g_a, ilo,ihi,jlo,jhi, index, ld) * print *, 'DBL_MB=', DBL_MB(1), index call fill_local(DBL_MB(index), ihi-ilo+1, jhi-jlo+1, ilo, jlo, ld) c call ga_sync() t0 = util_timer() c if (me .eq. 0) then write(6,21) 21 format(/'> Start ... ') call ffflush(6) endif c c range = dim - n -1 100 continue do loop = 1, maxloop c c always get 100x100 patches ilo = iran(range) jlo = iran(range) ihi = ilo+n-1 jhi = jlo+n-1 c call ga_get(g_a, ilo, ihi, jlo, jhi, a, n) c c check if data OK call check_data(a,n,n, ilo, jlo, n) c c copy the data back call ga_put(g_a, ilo, ihi, jlo, jhi, a, n) #ifdef DEBUG print *, me, 'OK', ilo, ihi, jlo, jhi call ffflush(6) #endif enddo elapsed = util_timer() -t0 if (me.eq.0)then print *, int(100* elapsed/(minutes*60)),'% done' call ffflush(6) endif if(elapsed .lt. real(minutes * 60)) goto 100 c call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' everything looks OK' write(6,*) call ffflush(6) endif call ga_sync() status = ga_destroy(g_a) end subroutine fill_local(a, n,m, x, y , ld) implicit none integer ld, n,m, x,y double precision a(ld,*) integer i,j c do j=1,m do i=1,n a(i,j)= real(x+y+i+j-2) enddo enddo end subroutine check_data(a,n,m, x,y, ld) implicit none #include "global.fh" integer ld, n,m, x,y double precision a(ld,*) integer i,j c do j=1,m do i=1,n if(a(i,j) .ne. real(x+y+i+j-2))then print *, 'error:',i+x-1, j+y-1, a(i,j) call ga_error("failed",1) endif enddo enddo end ga-5-4/global/testing/scan_copyc.c0000644000175000017500000002141112662210460015230 0ustar mbamba/** * Tests the scan_add function in GA. * * Each test will locally perform the same functionality, then compare * local buffers against global buffers. */ #if HAVE_CONFIG_H # include "config.h" #endif #define NELEM 200000 #define HEAP 200*200*4 #define FUDGE 100 #define STACK 200*200 #include "ga.h" #include "macdecls.h" #include "mp3.h" #include #include static int me; static int nproc; #define test_scan_copy_reg1 local_src[i] = i+1 #define test_scan_copy_cpl1 local_src[i].real = i+1; local_src[i].imag = i+2 #define test_scan_copy_reg2 local_msk[i] = rand()%q #define test_scan_copy_cpl2 local_msk[i].real = rand()%q; \ local_msk[i].imag = 0 #define test_scan_copy_reg3 local_msk[i] != 0 #define test_scan_copy_cpl3 local_msk[i].real != 0 #define test_scan_copy_reg4 local_dst[i] != buf_dst[i] #define test_scan_copy_cpl4 local_dst[i].real != buf_dst[i].real || \ local_dst[i].imag != buf_dst[i].imag #define test_scan_copy(MT,T,INNER,MT_MSK,T_MSK,INNER_MSK) \ static void test_scan_copy_##MT##_##MT_MSK(int llo, int lhi, int q) \ { \ int g_src, g_dst, g_msk; \ int ndim = 1; \ int dims[] = {NELEM}; \ int lo[1]; \ int hi[1]; \ int alo[] = {0}; \ int ahi[] = {NELEM-1}; \ int i; \ T *local_src, *local_dst, *buf_dst, last_val; \ T_MSK *local_msk; \ \ lo[0] = llo; \ hi[0] = lhi; \ \ g_src = NGA_Create(MT, ndim, dims, "g_src", NULL); \ g_dst = NGA_Create(MT, ndim, dims, "g_dst", NULL); \ g_msk = NGA_Create(MT_MSK,ndim, dims, "g_msk", NULL); \ local_src = malloc(sizeof(T)*NELEM); \ local_dst = malloc(sizeof(T)*NELEM); \ local_msk = malloc(sizeof(T_MSK)*NELEM); \ buf_dst = malloc(sizeof(T)*NELEM); \ \ (void)memset(&last_val, 0, sizeof(T)); \ (void)memset(local_src, 0, sizeof(T)*NELEM); \ (void)memset(local_dst, 0, sizeof(T)*NELEM); \ (void)memset(local_msk, 0, sizeof(T_MSK)*NELEM); \ (void)memset(buf_dst, 0, sizeof(T)*NELEM); \ \ /* process 0 initializes all buffers */ \ if (0 == me) { \ for (i=0; i Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0d0) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) * write(6,4) me, ilo, ihi, jlo, jhi * 4 format(' node ',i2,' checking put ',4i4) * call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call util_dfill(n*n, 0.0d0, b, 1) * call ga_print(g_a,1) call ga_get(g_a, 1, n, 1, n, b, n) * write(6,*) ' after get' * call output(b, 1, n, 1, n, n, n, 1) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_dfill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = drand(0) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = drand(0) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_sync() #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DBL) call ga_set_array_name(g_b,'b') # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_DBL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_DBL, ndim, dims, 'b', chunk, + p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif c call ga_zero(g_b) call ga_sync() call ga_acc(g_b, n/2, n/2, n/2, n/2, 1d0, 1, 1d0) call ga_sync() #ifndef MIRROR if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1d0*nproc) #else if (iproc.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1d0*lprocs) #endif if(x.gt. 1d-10)then #ifndef MIRROR write(6,*)'val=',b(1,1),' expected=',nproc, x #else write(6,*)'val=',b(1,1),' expected=',lprocs, x #endif call ga_error('overlapping accumulate failed',0) endif if (me.eq.0) then write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif c c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = drand(0) a(i,j) = 0.1d0*a(i,j) + 0.9d0*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add(0.1d0, g_a, 0.9d0, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the ddot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking ddot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0d0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_ddot(g_a,g_b) if(MISMATCH(sum1, sum2))then write(6,*) ' ddot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' ddot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123d0) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123d0 if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(me.eq.itmp) then #endif #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo enddo call nga_gather(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo #endif endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(iproc.eq.iran(lprocs)-1) then #endif #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1d0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call nga_scatter(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1d0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo #endif endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_sync() c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_sync() do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) if (found(i,j, iv, jv, loop-1) ) goto 10 #ifndef NGA_GATSCAT iv(loop) = i jv(loop) = j #else ijv(1,loop) = i ijv(2,loop) = j #endif v(loop) = 1d0 *(i+j) #ifndef MIRROR b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array #else b(i,j) = b(i,j) + lprocs*x*v(loop) ! update local ref. array #endif enddo #ifndef NGA_GATSCAT call ga_scatter_acc(g_a,v,iv,jv, ii,x) #else call nga_scatter_acc(g_a,v,ijv,ii,x) #endif c call ga_sync() c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii #ifndef NGA_GATSCAT i = iv(loop) j = jv(loop) #else i = ijv(1,loop) j = ijv(2,loop) #endif if(MISMATCH(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_sync() enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif #ifdef MIRROR c c Check the merge function c do j = 1, n do i = 1, n a(i,j) = inode + i-1 + (j-1)*n enddo enddo if (me .eq. 0) then write(6,23) 23 format(/'> Checking merge ...') call ffflush(6) endif if (iproc.eq.0) then call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_merge_mirrored(g_a) call ga_get(g_a, 1, n, 1, n, b, n) lsame = .true. ilo = 0 ihi = nnodes*(nnodes-1)/2 do i = 1, n do j = 1, n if ((dble(nnodes)*(a(j,i)-dble(inode)) + + dble(ihi)).ne.b(j,i)) then lsame = .false. ilo = ilo + 1 endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' merge is OK ' write(6,*) else if (.not.lsame) then write(6,*) write(6,*) ' merge is wrong ',ilo write(6,*) call ga_error('... exiting ',0) endif c c Checking copy between different array configurations c if (me .eq. 0) then write(6,20) 20 format(/'> Checking mixed copy ...') call ffflush(6) endif #ifdef NEW_API g_c = ga_create_handle() call ga_set_data(g_c,ndim,dims,MT_DBL) call ga_set_array_name(g_c,'c') if (.not.ga_allocate(g_c)) then #else if (.not. nga_create(MT_DBL, ndim, dims, 'c', chunk, g_c)) then #endif call ga_error('ga_create failed for third array ',0) endif call ga_zero(g_c) call ga_copy(g_a,g_c) call ga_get(g_a, 1, n, 1, n, a, n) call ga_get(g_c, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (a(j,i).ne.b(j,i)) then lsame = .false. endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' Mixed copy (mirrored to normal) is OK ' write(6,*) elseif (me.eq.0) then write(6,*) write(6,*) ' Mixed copy (mirrored to normal) is wrong ',ilo write(6,*) call ga_error('... exiting ',0) endif call ga_zero(g_a) call ga_copy(g_c,g_a) call ga_get(g_a, 1, n, 1, n, a, n) do i = 1, n do j = 1, n if (a(j,i).ne.b(j,i)) then lsame = .false. endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' Mixed copy (normal to mirrored) is OK ' write(6,*) elseif (me.eq.0) then write(6,*) write(6,*) ' Mixed copy (normal to mirrored) is wrong ',ilo write(6,*) call ga_error('... exiting ',0) endif c c Check the merge to distributed patch function c do j = 1, n do i = 1, n a(i,j) = inode + i-1 + (j-1)*n enddo enddo if (me .eq. 0) then write(6,24) 24 format(/'> Checking merge to distributed patch ...') call ffflush(6) endif c c get low and high indices of patch c ilo = n/4 ihi = ilo + n/2 do i = 1, 2 alo(i) = ilo blo(i) = ilo + 1 ahi(i) = ihi bhi(i) = ihi + 1 end do if (iproc.eq.0) then call ga_put(g_a, 1, n, 1, n, a, n) endif call nga_merge_distr_patch(g_a, alo, ahi, g_c, blo, bhi) call ga_get(g_c, 1, n, 1, n, b, n) lsame = .true. ilo = 0 ihi = nnodes*(nnodes-1)/2 do i = alo(1), ahi(1) ii = i-alo(1) + blo(1) do j = alo(2), ahi(2) jj = j-alo(2) + blo(2) if ((dble(nnodes)*(a(j,i)-dble(inode)) + + dble(ihi)).ne.b(jj,ii)) then c if (me.eq.0) then c write(6,*) i,j,ii,jj, nnodes*a(j,i)+ihi, b(jj,ii) c endif lsame = .false. ilo = ilo + 1 endif end do end do if(lsame.and.me.eq.0)then write(6,*) write(6,*) ' merge to distributed patch is OK ' write(6,*) elseif (.not.lsame) then write(6,*) write(6,*) ' merge to distributed patch is wrong ',ilo write(6,*) call ga_error('... exiting ',0) endif #endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c return end c----------------------------------------------------------------- subroutine check_complex() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) double complex a(n,n), b(n,n), v(m),w(m) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 128) double precision crap, real double precision nwords double complex x, sum1, sum2, factor integer lprocs, inode, iproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = cmplx(dble(i-1), dble((j-1)*n)) #else a(i,j) = cmplx(dble(inode),0.0d00) + + cmplx(dble(i-1), dble((j-1)*n)) #endif b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_DCPL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(MT_DCPL, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(MT_DCPL, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DCPL) call ga_set_array_name(g_b,'b') # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_DCPL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_DCPL, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call util_qfill(n*n, (0d0,0d0), b, 1) call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_qfill(n*n, (0.0d0,0d0), b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0),drand(1)) b(i,j) = cmplx(dble(i),dble(j)) enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = cmplx(drand(0),0.333d0) c x = cmplx(0.333d0,0) * x = cmplx(0d0,0d0) x = 0 ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, (1d0,-1d0), 1, (1d0,0d0)) call ga_sync() #ifndef MIRROR if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCH(x, ((1d0,-1d0)*nproc)))then #else if (iproc.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCH(x, ((1d0,-1d0)*lprocs)))then #endif c if(error.gt. (1d-8))then #ifndef MIRROR write(6,*)'val=',x,' expected=(',nproc,',',-nproc,')' #else write(6,*)'val=',x,' expected=(',lprocs,',',-lprocs,')' #endif call ga_error('overlapping accumulate failed',0) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #else if(iproc.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #endif call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif factor = (1d0,-1d0) call ga_scale(g_a, factor) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*factor if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check scatter&gather c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(me.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Check ga_add c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif call ga_get(g_a, 1, n, 1, n, a, n) crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) a(i,j) = (0.1d0,-.1d0)*a(i,j) + (.9d0,-.9d0)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add((0.1d0,-.1d0), g_a, (0.9d0,-.9d0), g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the zdot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking zdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = (0.0d0,0.d0) do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_zdot(g_a,g_b) if (MISMATCH(sum1, sum2))then write(6,*) ' zdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' zdot is OK ' write(6,*) endif c c Delete the global arrays c 123 continue status = ga_destroy(g_b) status = ga_destroy(g_a) c return end c----------------------------------------------------------------- subroutine check_int() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n parameter (n = 128) integer a(n,n), b(n,n) logical status integer g_a integer iran, i, j, loop, nloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, dimi, dimj, ii, jj integer ndim, dims(2), chunk(2), p_mirror, nnodes integer lprocs, inode, iproc,lproc, nprocs double precision nwords parameter (nloop = 100) integer maxproc parameter (maxproc = 128) integer map(5,maxproc), found, np,k double precision crap, sum1, real integer buf #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = i-1 + (j-1)*1000 #else a(i,j) = inode + i-1 + (j-1)*1000 #endif enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 #ifdef NEW_API g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_INT) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif if (.not.ga_allocate(g_a)) then #else # ifndef MIRROR if (.not. ga_create(MT_INT, n, n, 'a', 0, 0, g_a)) then # else p_mirror = ga_pgroup_get_mirror() if (.not. nga_create_config(MT_INT, ndim, dims, 'a', chunk, + p_mirror, g_a)) then # endif #endif write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. 0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c #ifndef MIRROR if(me.eq.0)then #else if(iproc.eq.0)then #endif call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo endif call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_ifill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif c call ga_sync() if (me .eq. 0 .and. n.gt.7) then write(6,*) write(6,*) '> Checking ga_print_patch --- should see ' write(6,*)' [2002 3002 4002 5002 6002]' write(6,*)' [2003 3003 4003 5003 6003]' write(6,*)' [2004 3004 4004 5004 6004]' write(6,*) call ffflush(6) endif if(n.gt.5) call ga_print_patch(g_a,3,5,3,7,0) c call ga_sync() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*) '> Checking read_inc ... ' write(6,*) call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc inc =5 c every processor will be operating on somebody elses data c #ifndef MIRROR lproc = nproc - me - 1 #else lproc = nnodes-iproc-1 lproc = inode*lprocs + lproc #endif c call ga_distribution(g_a,lproc,ilo,ihi,jlo,jhi) c dimi = ihi-ilo dimj = jhi-jlo write(6,111) me,ilo,ihi,jlo,jhi,dimi,dimj 111 format(i2,'..',4i8,'.',2i8) call ga_sync() if(ilo .gt.0 .and. jhi .gt. 0)then do loop = 1,nloop ii= IABS(iran(dimi)) jj= IABS(iran(dimj)) i=ilo + Mod(ii,dimi) j=jlo + Mod(jj,dimj) c c write(6,*) me,'..',ilo,ihi,jlo,jhi,'.',dimi,dimj,'..',i,j c call ffflush(6) buf = ga_read_inc(g_a,i,j,inc) if(a(i,j).ne. buf)then write(6,*)me,'READ_inc ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif call ga_get(g_a, i,i,j,j, buf,1) a(i,j) = a(i,j)+inc if(a(i,j).ne. buf)then write(6,*)me,'read_INC ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif enddo endif call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' read_inc is OK' write(6,*) endif c c c #if 000 #ifndef MIRROR if (me.eq.0) then write(6,*) write(6,*) '> checking ga_fence and ga_lock' write(6,*) call ffflush(6) endif c call ga_zero(g_a) c c*** use ga_read_inc and elements g_a(1:2,1) to implement a lock c*** compute g_a(:,n) = sum (1(:)) for P processors c status = ga_create_mutexes(1) if (.not. status) then call ga_error('ga_create_mutexes failed ',0) endif if(n.lt.2)call ga_error('insufficient n to test ga_fence',n) call ga_lock(0) c call my_lock(g_a) c get original values g_a(:,n) call ga_get(g_a, 1,n, n,n, b,n) c add my contribution do i =1,n b(i,1)= b(i,1)+1 enddo c c need to use fence to assure that coms complete before leaving c Critical Section c call ga_init_fence() call ga_put(g_a, 1,n, n,n, b,n) call ga_fence() call ga_unlock(0) c call my_unlock(g_a) c 333 if(.not.ga_destroy_mutexes()) $ call ga_error('mutex not destroyed',0) call ga_sync() if (me.eq.0) then call ga_get(g_a, 1,n, n,n, b,n) do i =1,n if(b(i,1).ne. nproc)then print *, 'mismatch',b(i,1),nproc call ga_error('fence failed',i) endif enddo write(6,*) write(6,*) ' ga_fence and ga_lock are OK' write(6,*) endif #endif #endif c c if (me.eq.0) then write(6,*) write(6,*) '> checking ga_locate_region' write(6,*) call ffflush(6) endif status = ga_locate_region(g_a, 1, n, 1,n, map,np) found = 0 do j=1,n do i=1,n b(i,j)=-1 enddo enddo #ifndef MIRROR if(me.eq.0)call ga_put(g_a,1,n,1,n,b,n) #else if(iproc.eq.0)call ga_put(g_a,1,n,1,n,b,n) #endif call ga_sync() do k = 1, np if(map(5,k).eq.me)then if(found.eq.1) then write(6,*)'double entry in map for proc ',me call ffflush(6) endif do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) #ifndef MIRROR b(i,j)=1*me #else b(i,j)=1*iproc #endif enddo enddo call ga_put(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & b(map(1,k),map(3,k)),n) found = 1 endif enddo call ga_sync() c do k = 1, np #ifndef MIRROR if(map(5,k).eq.me)then #else if(map(5,k).eq.iproc)then #endif call ga_get(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & a(map(1,k),map(3,k)),n) do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) if(b(i,j).ne.a(i,j)) then write(6,*) & 'proc ',me, 'overlap with ',a(i,j) call ffflush(6) endif enddo enddo endif enddo call ga_sync() c #ifndef MIRROR if(me.eq.0)then #else if(iproc.eq.0)then #endif call ga_get(g_a,1,n,1,n,a,n) do j=1,n do i=1,n if(a(i,j).eq.-1)then write(6,*)'i=',i,' j=',j, ' not assigned ' call ga_error('... exiting ',0) endif enddo enddo endif if (me.eq.0) then write(6,*) write(6,*) ' ga_locate_region is OK' write(6,*) call ffflush(6) endif c c Delete the global array c status = ga_destroy(g_a) c return end c--------------------------------------------------------------------- subroutine check_flt() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer n, m parameter (n =10) parameter (m=2*n) real a(n,n), b(n,n), v(m), w(m) integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i, j, loop, nloop, maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes double precision nwords parameter (maxloop = 100) integer maxproc integer ndim, dims(2), chunk(2), p_mirror parameter (maxproc = 128) double precision crap real x, sum1, sum2 logical found integer lprocs, inode, iproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = i-1 + (j-1)*n #else a(i,j) = inode + i-1 + (j-1)*n #endif b(i,j) = -1. enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 #ifdef NEW_API g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_REAL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR write(6,*) 'Getting p_mirror' p_mirror = ga_pgroup_get_mirror() write(6,*) 'Setting proc config' call ga_set_pgroup(g_a,p_mirror) # endif if (.not.ga_allocate(g_a)) then #else # ifndef MIRROR if (.not. ga_create(MT_REAL, n, n, 'a', 0, 0, g_a)) then # else cBJP write(6,*) 'Creating g_a' p_mirror = ga_pgroup_get_mirror() if (.not. nga_create_config(MT_REAL, ndim, dims, 'a', chunk, + p_mirror, g_a)) then cBJP write(6,*) 'Created g_a' # endif #endif write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c c check if handle is valid. be quiet unless error C if(.not.ga_valid_handle(g_a)) call ga_error("invalid handle",g_a) c call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c 4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo call ga_sync() c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_rfill(n*n, 0.0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif call ga_sync() c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_sync() c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = real(drand(0)) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = real(drand(0)) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_sync() c c All nodes check all of a call ga_get(g_a, 1, n, 1, n, b, n) c do j = 1, n do i = 1, n if(MISMATCHF(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_sync() #ifndef MIRROR if (.not. ga_create(MT_REAL, n, n, 'b', 0, 0, g_b)) then #else if (.not. nga_create_config(MT_REAL, ndim, dims, 'b', chunk, + p_mirror, g_b)) then #endif call ga_error('ga_create failed for second array ',0) endif c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, 1.0, 1, 1.0) call ga_sync() if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) #ifndef MIRROR x = abs(b(1,1) -1*nproc) #else x = abs(b(1,1) -1*lprocs) #endif if(x.gt. 1e-10)then #ifndef MIRROR write(6,*)'val=',b(1,1),' expected=',nproc, x #else write(6,*)'val=',b(1,1),' expected=',lprocs, x #endif call ga_error('overlapping accumulate failed',0) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = real(drand(0)*real(i)) + 1 a(i,j) = 0.1*a(i,j) + 0.9*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #else if (iproc.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) #endif call ga_add(0.1, g_a, 0.9, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) CCC call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_sync() c c Check the sdot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking sdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo #ifndef MIRROR if (me.eq.0) then #else if (iproc.eq.0) then #endif call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() sum2 = ga_sdot(g_a,g_b) if(MISMATCHF(sum1, sum2))then write(6,*) ' fdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' sdot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123 if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) CCC call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(iproc.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1.0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1.0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1.0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_sync() c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_sync() do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) if (found(i,j, iv, jv, loop-1) ) goto 10 iv(loop) = i jv(loop) = j v(loop) = 1.0 *(i+j) #ifndef MIRROR b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array #else b(i,j) = b(i,j) + lprocs*x*v(loop) ! update local ref. array #endif enddo call ga_scatter_acc(g_a,v,iv,jv, ii,x) c call ga_sync() c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii i = iv(loop) j = jv(loop) if(MISMATCHF(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_sync() enddo call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif c c Delete the global array c status = ga_destroy(g_a) c return end c_____________________________________________________________ subroutine check_wrappers implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" double precision sum integer isum, ibuf(2) integer me, nproc real fsum c nproc = ga_nnodes() me = ga_nodeid() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_igop' write(6,*) call ffflush(6) endif ibuf(1) = 1 ibuf(2) = me call ga_igop(10000, ibuf, 2, '+') if(ibuf(1).ne.nproc)then call ga_error('ga_igop error',isum) endif if(ibuf(2).ne.((nproc-1)*nproc/2))then call ga_error('ga_igop error -2',isum) endif call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_igop is OK' write(6,*) endif call ga_sync() c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_dgop' write(6,*) call ffflush(6) endif sum = 1d0 * me call ga_dgop(10000, sum, 1, '+') if(Int(sum).ne.((nproc-1)*nproc/2))then call ga_error('ga_dgop error',Int(sum)) endif call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_dgop is OK' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_sgop' write(6,*) call ffflush(6) endif fsum = 1.0 * me call ga_sgop(10000, fsum, 1, '+') if(Int(sum).ne.((nproc-1)*nproc/2))then call ga_error('ga_fgop error',Int(sum)) endif call ga_sync() if (me.eq.0) then write(6,*) write(6,*) ' ga_sgop is OK' write(6,*) endif c call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_brdcst' write(6,*) call ffflush(6) endif if(me.eq.nproc-1)then ibuf(1) = me ibuf(2) = nproc endif call ga_brdcst(1000,ibuf,util_mitob(2),nproc-1) if(ibuf(1).ne.nproc-1)call ga_error('ibuf(1) error',ibuf(1)) if(ibuf(2).ne.nproc)call ga_error('ibuf(2) error',ibuf(2)) call ga_sync() if (me .eq. 0) then write(6,*) write(6,*)'> ga_brdcst is OK ' write(6,*) call ffflush(6) endif call ga_sync() return end subroutine check_mem(mem_size) implicit none integer mem_size #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,nmax,left,need, me,procs,g_a, g_b logical status c if(.not. ga_memory_limited())return me = ga_nodeid() procs = ga_nnodes() nmax = int(dsqrt(dble(mem_size/util_mitob(1)))) left = mem_size/procs - ga_inquire_memory() n = nmax/2 need = util_mdtob(n*n)/procs c if(me.eq.0)then write(6,*)' ' if(ga_uses_ma())then write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA used)' else write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA not used)' endif write(6,*)' ' write(6,*)' ' call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'a', 0, 0, g_a) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif call ffflush(6) endif c n = nmax left = mem_size/procs - ga_inquire_memory() need = util_mdtob(n*n)/procs if(me.eq.0)then call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'b', 0, 0, g_b) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif write(6,*)' ' write(6,*)' ' call ffflush(6) endif status = ga_destroy(g_a) end subroutine print_mem_info(n,left, need, total) implicit none integer n,left, need, total c write(6,*)' ' if(left - need .ge. 0) then write(6,1)n,n 1 format('> Creating array ',i4,' by ',i4,' -- should succeed') else write(6,2)n,n 2 format('> Creating array ',i4,' by ',i4,' -- SHOULD FAIL') endif write(6,3) need, left, total 3 format(' (need ',i7,' and ',i7,' out of ',i7,' bytes are left)') write(6,*)' ' call ffflush(6) c end subroutine my_lock(g_b) implicit none #include "global.fh" integer g_b, val, flag, i logical first_time double precision dummy common /lock/ val common /dum/ dummy data first_time /.true./ c c this awkward initialization is to avoid a weird problem C with block data on SUN if(first_time)then first_time = .false. dummy = .0 endif c val = ga_read_inc(g_b,1,1, 1) 10 call ga_get(g_b, 2,2,1,1, flag, 1) if(flag.eq.val) return c c to reduce memory stress, wait a while before retrying do i = 1, 100 dummy = dummy + .1 enddo goto 10 end subroutine my_unlock(g_b) implicit none #include "global.fh" integer g_b, val common /lock/ val c call ga_put(g_b, 2,2,1,1, val+1, 1) end logical function found(i,j, iv, jv, n) integer n integer i,j, iv(n), jv(n) integer loop found = .false. do loop = 1, n if(i .eq. iv(loop) .and. j .eq.jv(loop))then found = .true. goto 99 endif enddo 99 continue return end subroutine proc_remap() implicit none #include "global.fh" integer proc(100),nproc,i nproc = ga_nnodes() if(nproc.gt.100) $ call ga_error("remap requires<=100 processes",nproc) do i = 1, nproc proc(i) = nproc-i enddo c call ga_register_proclist(proc,nproc) end subroutine util_rfill(n,val,a,ia) implicit none real a(*), val integer n, ia, i c c initialise real array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_dfill(n,val,a,ia) implicit none double precision a(*), val integer n, ia, i c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_ifill(n,val,a,ia) implicit none integer n, ia, i, a(*),val c c initialise integer array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_qfill(n,val,a,ia) implicit none double complex a(*), val integer n, ia, i c c initialise double complex array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/testing/scan.F0000644000175000017500000005400112662210457014005 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif C C Test the minval, minloc, maxval, maxloc, and enum functions in GA. C program main implicit none #include "mafdecls.fh" #include "global.fh" integer heap, stack, fudge, ma_heap, me, nproc logical status parameter (heap=200*200*4, fudge=100, stack=200*200) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c if(ga_nodeid().eq.0)then print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c ma_heap = heap/nproc + fudge status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then print *, 'using ', nproc, ' process(es)' call ffflush(6) endif c call test_nga_pack() ! Test PACK/UNPACK call test_nga_scan() ! Test SCAN_COPY/SCAN_ADD c if(me.eq.0) call ga_print_stats() c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c end subroutine test_nga_pack() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" C integer g_ielm1, g_result1 ! handles to global arrays integer g_ielm2, g_sbit2, g_src2, g_sink2, g_result2 ! handles to global arrays integer g_irowmat, g_icolmat ! handles to global arrays integer g_velm4, g_velm5 ! handles to global arrays C integer ilo, ihi, num integer ilo4, ihi4, num4 integer i, it, count integer me, nproc ! my processor & number of procs integer ndim,dims(1),chunk(1) C integer nelements_max, nen_max parameter (nelements_max=100000, nen_max=4) integer ipack(nelements_max), * jpack(nelements_max), * kpack(nelements_max), * ielm1(nelements_max), * ielm4(nen_max*nelements_max) double precision velm4(nen_max*nelements_max), * velm5(nen_max*nelements_max) c integer ilocmax, ilocmin integer ilocmax_ga, ilocmin_ga integer imax_ga, imin_ga C integer nelements, nen integer isum, icount, itoff double precision result integer i1, i2 C c c*** check parallel environment me = ga_nodeid() nproc = ga_nnodes() if(me.eq.0)then print *, 'testing pack/unpack' call ffflush(6) endif c nelements=20000 nen=4 c c*** create a global 1-D array ndim=1 dims(1)=nen*nelements chunk(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ielm1', chunk, $ g_ielm1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result1', chunk, $ g_result1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sbit2', chunk, $ g_sbit2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'src2', chunk, $ g_src2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sink2', chunk, $ g_sink2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result2', chunk, $ g_result2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'irowmat', chunk, $ g_irowmat)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'icolmat', chunk, $ g_icolmat)) $ call ga_error(' ga_create failed ',0) C if (.not. nga_create(MT_DBL, ndim, dims, 'velm4', chunk, $ g_velm4)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_DBL, ndim, dims, 'velm5', chunk, $ g_velm5)) $ call ga_error(' ga_create failed ',0) c c Enumerate the sbit arrary to get a sequential vector. call ga_fill(g_ielm1,0) call ga_patch_enum(g_ielm1,1,nelements,1,1) c *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 c c*** compute local ilo, ihi, num for each processor call nga_distribution(g_ielm1,me,ilo,ihi,chunk) do i=0,nproc-1 if(me.eq.i) then write(6,'(a,i4,a,i8,a,i8)') 'me: ',me, + ' lo: ', ilo,' hi: ',ihi call ffflush(6) endif call ga_sync() enddo num=ihi-ilo+1 if(ihi.le.0) num=0 if(ihi.gt.nelements) then ihi=nelements num=max(0,ihi-ilo+1) endif if(num.gt.nelements_max) then print *,"Too many elements " goto 9999 endif cbjp print *, 'me=',me, num,ilo,ihi do i=0,nproc-1 if(me.eq.i) then write(6,'(a,i4,a,i8,a,i8,a,i8)') 'me: ',me, + ' num: ',num, ' lo: ', ilo,' hi: ',ihi call ffflush(6) endif call ga_sync() enddo c c*** scatter some values into the global array call ga_fill(g_sbit2,0) call ga_fill(g_src2,0) if(num.gt.0) call nga_get(g_ielm1,ilo,ihi,ielm1,1) do i=ilo,ihi ipack(i-ilo+1)=1+nen*(ielm1(i-ilo+1)-1) jpack(i-ilo+1)=1 kpack(i-ilo+1)=ielm1(i-ilo+1) enddo if(num.gt.0) call NGA_scatter(g_sbit2,jpack,ipack,num) if(num.gt.0) call NGA_scatter(g_src2 ,kpack,ipack,num) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... c c .................................................................. c TEST THE "PACK" FUNCTION. c itoff=nen*nelements call ga_fill(g_sink2,0) call ga_pack(g_src2, g_sink2,g_sbit2,1,itoff,icount) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... c *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 c [NOTE: icount should equal nelements.] if(icount.ne.nelements) then print *,"Wrong number of elements from PACK operation: ", * "count = ",icount," should be = ",nelements endif call ga_add(1,g_ielm1,-1,g_sink2,g_result1) c *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 c *** sink2: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 c *** result1: 0 0 0 0 0 0 0 ... 0 (result1=ielm1-sink2) c*** Find the maximum value and the index of the maximum value call nga_select_elem(g_result1,'max',imax_ga,ilocmax_ga) c*** Find the minimum value and the index of the minimum value call nga_select_elem(g_result1,'min',imin_ga,ilocmin_ga) if(imax_ga.eq.0.and.imin_ga.eq.0) then if (me.eq.0) then print *,"Pack successful" endif else call ga_error("Pack unsuccessful",0) endif call ga_sync() C C .................................................................. C TEST THE "UNPACK" FUNCTION. C itoff=nen*nelements call ga_fill(g_src2,0) call ga_unpack(g_sink2,g_src2,g_sbit2,1,itoff,count) C *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 C *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... C *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... call ga_fill(g_sink2,0) call ga_pack(g_src2, g_sink2,g_sbit2,1,itoff,icount) C *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... C *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... C *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 C [NOTE: icount should equal nelements.] if(icount.ne.nelements) then print *,"Wrong number of elements from PACK operation: ", * "count = ",icount," should be = ",nelements endif call ga_add(1,g_ielm1,-1,g_sink2,g_result1) C *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 C *** sink2: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 C *** result1: 0 0 0 0 0 0 0 ... 0 (result1=ielm1-sink2) c*** Find the maximum value and the index of the maximum value call nga_select_elem(g_result1,'max',imax_ga,ilocmax_ga) c*** Find the minimum value and the index of the minimum value call nga_select_elem(g_result1,'min',imin_ga,ilocmin_ga) if(imax_ga.eq.0.and.imin_ga.eq.0) then if (me.eq.0) then print *,"Unpack successful" endif else print *,"Unpack unsuccessful", imin_ga,ilocmin_ga print *,"Unpack unsuccessful", imax_ga,ilocmax_ga call ga_error("Unpack unsuccessful", -1) endif call ga_sync() C goto 9999 9999 continue C C .................................................................. C return end subroutine test_nga_scan() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" C integer g_ielm1, g_result1 ! handles to global arrays integer g_ielm2, g_sbit2, g_src2, g_sink2, g_result2 ! handles to global arrays integer g_irowmat, g_icolmat ! handles to global arrays integer g_velm4, g_velm5 ! handles to global arrays C integer ilo, ihi, num integer ilo4, ihi4, num4 integer i, j, it, count integer me, nproc ! my processor & number of procs integer ndim,dims(1),chunk(1) C integer nelements_max, nen_max parameter (nelements_max=10000, nen_max=4) integer ipack(nelements_max), * jpack(nelements_max), * kpack(nelements_max), * ielm1(nelements_max), * ielm2(nen_max*nelements_max), * ielm3(nen_max*nelements_max), * ielm4(nen_max*nelements_max), * ielm5(nen_max*nelements_max) integer itest(nen_max*nelements_max), one double precision velm4(nen_max*nelements_max), * velm5(nen_max*nelements_max) c integer ilocmax, ilocmin integer ilocmax_ga, ilocmin_ga integer imax_ga, imin_ga C integer nelements, nen integer isum, icount, itoff double precision result integer i1, i2, ichk C c c*** check parallel environment me = ga_nodeid() nproc = ga_nnodes() c nelements=20000 nelements=20 nen=4 c c*** create a global 1-D array ndim=1 dims(1)=nen*nelements chunk(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ielm1', chunk, $ g_ielm1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result1', chunk, $ g_result1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sbit2', chunk, $ g_sbit2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'src2', chunk, $ g_src2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sink2', chunk, $ g_sink2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result2', chunk, $ g_result2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'irowmat', chunk, $ g_irowmat)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'icolmat', chunk, $ g_icolmat)) $ call ga_error(' ga_create failed ',0) C if (.not. nga_create(MT_DBL, ndim, dims, 'velm4', chunk, $ g_velm4)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_DBL, ndim, dims, 'velm5', chunk, $ g_velm5)) $ call ga_error(' ga_create failed ',0) c c Enumerate the sbit arrary to get a sequential vector. call ga_fill(g_ielm1,0) call ga_patch_enum(g_ielm1,1,nelements,1,1) c *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 c c*** compute local ilo, ihi, num for each processor call nga_distribution(g_ielm1,me,ilo,ihi,chunk) do i=0,nproc-1 if(me.eq.i) then write(6,'(a,i4,a,i8,a,i8)') 'me: ',me, + ' lo: ', ilo,' hi: ',ihi call ffflush(6) endif call ga_sync() enddo num=ihi-ilo+1 if(ihi.le.0) num=0 if(ihi.gt.nelements) then ihi=nelements num=max(0,ihi-ilo+1) endif if(num.gt.nelements_max) then print *,"Too many elements " goto 9999 endif cbjp print *, 'me=',me, num,ilo,ihi do i=0,nproc-1 if(me.eq.i) then write(6,'(a,i4,a,i8,a,i8,a,i8)') 'me: ',me, + ' num: ',num, ' lo: ', ilo,' hi: ',ihi call ffflush(6) endif call ga_sync() enddo c c*** scatter some values into the global array call ga_fill(g_sbit2,0) call ga_fill(g_src2,0) if(num.gt.0) call nga_get(g_ielm1,ilo,ihi,ielm1,1) do i=ilo,ihi ipack(i-ilo+1)=1+nen*(ielm1(i-ilo+1)-1) jpack(i-ilo+1)=1 kpack(i-ilo+1)=ielm1(i-ilo+1) enddo if(num.gt.0) call NGA_scatter(g_sbit2,jpack,ipack,num) if(num.gt.0) call NGA_scatter(g_src2 ,kpack,ipack,num) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... c c .................................................................. c TEST THE "PACK" FUNCTION. c itoff=nen*nelements call ga_fill(g_sink2,0) call ga_pack(g_src2, g_sink2,g_sbit2,1,itoff,icount) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... c *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 c [NOTE: icount should equal nelements.] if(icount.ne.nelements) then print *,"Wrong number of elements from PACK operation: ", * "count = ",icount," should be = ",nelements endif call ga_add(1,g_ielm1,-1,g_sink2,g_result1) c *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 c *** sink2: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 c *** result1: 0 0 0 0 0 0 0 ... 0 (result1=ielm1-sink2) c*** Find the maximum value and the index of the maximum value call nga_select_elem(g_result1,'max',imax_ga,ilocmax_ga) c*** Find the minimum value and the index of the minimum value call nga_select_elem(g_result1,'min',imin_ga,ilocmin_ga) if(imax_ga.eq.0.and.imin_ga.eq.0) then if (me.eq.0) then print *,"Pack successful" endif else call ga_error("Pack unsuccessful",-1) endif call ga_sync() c c .................................................................. c TEST THE "UNPACK" FUNCTION. c itoff=nen*nelements call ga_fill(g_src2,0) call ga_unpack(g_sink2,g_src2,g_sbit2,1,itoff,count) * call ga_unpack(g_src2,g_sink2,g_sbit2,1,nelements,count) C *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 C *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... C *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... call ga_fill(g_sink2,0) call ga_pack(g_src2, g_sink2,g_sbit2,1,itoff,icount) * call ga_pack(g_sink2,g_src2,g_sbit2,1,itoff,icount) C *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... C *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... C *** sink2: 1 2 3 4 5 ... icount ... 0 0 0 0 0 0 0 0 0 ..... 0 C [NOTE: icount should equal nelements.] if(icount.ne.nelements) then print *,"Wrong number of elements from PACK operation: ", * "count = ",icount," should be = ",nelements endif call ga_add(1,g_ielm1,-1,g_sink2,g_result1) C *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 C *** sink2: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 0 0 0 C *** result1: 0 0 0 0 0 0 0 ... 0 (result1=ielm1-sink2) c*** Find the maximum value and the index of the maximum value call nga_select_elem(g_result1,'max',imax_ga,ilocmax_ga) c*** Find the minimum value and the index of the minimum value call nga_select_elem(g_result1,'min',imin_ga,ilocmin_ga) if(imax_ga.eq.0.and.imin_ga.eq.0) then if (me.eq.0) then print *,"Unpack successful" endif else call ga_error("Unpack unsuccessful",-1) endif call ga_sync() * call ga_print(g_src2) c c .................................................................. c TEST THE SCAN COPY FUNCTION. c c*** compute local ilo, ihi, num for each processor call nga_distribution(g_irowmat,me,ilo4,ihi4,chunk) num4=ihi4-ilo4+1 if(ihi.le.0) num4=0 if(num4.gt.nen*nelements_max) then print *,"Too many elements " goto 9999 endif cbjp print *, 'me=',me, num4,ilo4,ihi4 do i=0,nproc-1 if(me.eq.i) then write(6,'(a,i4,a,i8,a,i8,a,i8)') 'me: ',me, + ' num4: ',num4, ' lo4: ', ilo4,' h4i: ',ihi4 call ffflush(6) endif call ga_sync() enddo call ga_fill(g_irowmat,-1) call GA_scan_copy(g_src2, g_irowmat, g_sbit2,1,itoff) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 ..... c *** irowmat: 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 ..... c call nga_get(g_irowmat,ilo4,ihi4,ielm4,1) do i=ilo4,ihi4 velm4(i-ilo4+1)=1.0d+00 enddo call ga_fill(g_velm4,0.0d+00) cbjp print *, num4, (ielm4(i),i=1,min(4,num4)) do j=0,nproc-1 if(me.eq.j) then write(6,'(a,i4,a,i8,a,i8,a,i8)') 'me: ',me, ' num4: ',num4, + ' ielm4: ', (ielm4(i),i=1,min(4,num4)) call ffflush(6) endif call ga_sync() enddo call nga_scatter_acc(g_velm4,velm4,ielm4,num4,1.0d+00) C *** velm4: 4 4 4 4 4 4 4 4 4 4 ... nelements result=ga_ddot(g_velm4,g_velm4) if(result.eq.nen*nen*nelements) then if (me.eq.0) then print *,"Scan_copy successful." endif else call ga_error("Scan_copy failed.",-1) endif call ga_sync() c c .................................................................. c TEST THE SCAN ADD FUNCTION. c call ga_fill(g_src2,1) call ga_fill(g_icolmat,0) * call ga_print(g_icolmat) * call ga_print(g_src2) * call ga_print(g_sbit2) c if (me.eq.0) then c one = 1 c call nga_get(g_src2,one,dims,itest,one) c write(6,'(25i4)') (itest(i),i=1,dims(1)) c write(6,*) c call nga_get(g_sbit2,one,dims,itest,one) c write(6,'(25i4)') (itest(i),i=1,dims(1)) c endif call ga_sync call GA_scan_add(g_src2, g_icolmat,g_sbit2,1,itoff,0) c if (me.eq.0) then c one = 1 c write(6,*) c call nga_get(g_icolmat,one,dims,itest,one) c write(6,'(25i4)') (itest(i),i=1,dims(1)) c endif c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 c *** icolmat: 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 ..... call ga_fill(g_velm4,1.0d+00) call nga_get(g_icolmat,ilo4,ihi4,ielm4,1) do i=ilo4,ihi4 velm4(i-ilo4+1)=ielm4(i-ilo4+1) velm5(i-ilo4+1)=1.0d+00 enddo call nga_put(g_velm4,ilo4,ihi4,velm4,1) call nga_put(g_velm5,ilo4,ihi4,velm5,1) result=ga_ddot(g_velm4,g_velm5) c *** velm4: 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 ..... c *** velm5: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ..... c *** result = sum(velm4 * velm5) = (1+2+3+4+...+nen)*nelements isum=0 do i=1,nen isum=isum+i enddo if(result.eq.isum*nelements) then if (me.eq.0) then print *,"Scan_add successful." endif else call ga_error("Scan_add failed.",-1) endif call ga_sync() call ga_sync call GA_scan_add(g_src2, g_icolmat,g_sbit2,1,itoff,1) c *** sbit2: 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 ..... c *** src2: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 c *** icolmat: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 ..... c if (me.eq.0) then c one = 1 c write(6,*) c call nga_get(g_icolmat,one,dims,itest,one) c write(6,'(25i4)') (itest(i),i=1,dims(1)) c endif call nga_get(g_src2, 1, itoff, ielm2, one) call nga_get(g_sbit2, 1, itoff, ielm3, one) call nga_get(g_icolmat, 1, itoff, ielm4, one) call nga_get(g_icolmat, 1, itoff, ielm5, one) ichk = 1 do i = 1, itoff if (ielm3(i).eq.1.or.i.eq.1) then ielm4(i) = 0 else ielm4(i) = ielm4(i-1) + ielm2(i-1) endif if (ielm4(i).ne.ielm5(i)) then ichk = 0 endif end do cc ichk=ga_idot(g_src2,g_icolmat) isum = 0 do i=1,nen isum=isum+i-1 enddo cc if (ichk.eq.nelements*isum) then if (ichk.eq.1) then if (me.eq.0) then print *,"Exclusive scan_add successful." endif else call ga_error("Exclusive scan_add failed.",-1) endif c goto 9999 9999 continue c c .................................................................. c return end ga-5-4/global/testing/mp3.fh0000644000175000017500000000104412662210457013767 0ustar mbamba#ifdef TCGMSG # include "tcgmsg.fh" # define MP_TIMER tcgtime # define MP_FINALIZE() pend() #else # include "mpif.h" # define MP_TIMER mpi_wtime # define MP_FINALIZE() mpi_finalize(ierr) #endif #ifndef MP_DEFINES_ONLY # ifdef TCGMSG call pbeginf # else integer ierr # if defined(DCMF) || defined(MPI_MT) || defined(MPI_PT) integer required, provided required=MPI_THREAD_MULTIPLE call mpi_init_thread(required, provided, ierr) # else call mpi_init(ierr) # endif # endif #endif ga-5-4/global/testing/simple_groups_comm.F0000644000175000017500000000472712662210461016771 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit none #include "global.fh" #include "ga-mpi.fh" #include "mafdecls.fh" integer me integer g_a logical status integer n,i,j parameter (n=4) integer proc_group(0:100),proclist(100),inode,nprocs integer comm double precision sbuf(1),rbuf(1) #include "mp3.fh" call ga_initialize() me = ga_nodeid() status = ma_init(MT_DBL, 100000, 100000) if (.not. status) call ga_error('ma_init failed',-1) status = ma_set_auto_verify(.true.) status = ma_set_hard_fail(.true.) status = ma_set_error_print(.true.) inode = ga_cluster_nodeid() if (me.eq.0) then write(0,'(A,I4,A,I4,A)') 'there are ', ga_cluster_nnodes(), , ' nodes, node 0 has ', ga_cluster_nprocs(0), ' procs' call ffflush(6) endif call ga_sync() do i=0,ga_cluster_nnodes()-1 do j=0,ga_cluster_nprocs(i)-1 proclist(j+1)=ga_cluster_procid(i,j) enddo proc_group(i)=ga_pgroup_create(proclist,ga_cluster_nprocs(i)) enddo call ga_sync() do i = 0, ga_cluster_nnodes()-1 if (i.eq.inode) then write(0,'(I4,A,I4)') me,' joining group', proc_group(inode) call ga_pgroup_set_default(proc_group(inode)) status = ga_create(MT_DBL, n, n, 'a', 1, 1, g_a) if (.not. status) call ga_error('ga_create failed',-1) write(0,'(I4,A,I4,A,I4)') me,' Created array of group ', , proc_group(inode), ' as proc no. ',ga_nodeid() call ga_print_distribution(g_a) call ga_mpi_comm_pgroup_default(comm) if (comm.ne.mpi_comm_null) then sbuf(1) = ga_nodeid() c unless MPI was compiled with the same integer size, we can't c use mpi_allreduce on integer types -- that's why we use double call mpi_allreduce(sbuf, rbuf, 1, mpi_double_precision, , mpi_max, comm, ierr) write(0,'(I4,A,F8.3)') me, ' max nodeid is ', rbuf(1) if ((rbuf(1)+1).ne.ga_cluster_nprocs(i)) then call ga_error('mpi_allreduce failed',1) endif else write(0,'(A)') 'mpi_comm was null!' endif call ga_pgroup_set_default(ga_pgroup_get_world()) endif call ffflush(6) call ga_sync() enddo call ga_terminate() call MP_FINALIZE() end ga-5-4/global/testing/ga_lu.c0000644000175000017500000002441012662210461014201 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #include "galinalg.h" #define BLOCK_CYCLIC #define BLOCK_SIZE 500 /*#define USE_SCALAPACK_DISTR*/ #define DEBUG 0 static int nprocs, me; static void init_array(double *a, int n) { int i, j; double max=0.0; /* for pivoting */ for(i=0; i0: if INFO = i, U(i,i) is exactly zero. The factorization\n has been completed, but the factor U is exactly singular, and\n division by zero will occur if it is used to solve a system of\n equations.\n"); exit(0); } free(a_verify); free(a); } void dtrsm_lapack(double *a, double *b, int n, char side, char uplo, char transa, char diag) { int i, j; double *aa=NULL; double *bb=NULL; BlasInt ld = (BlasInt)n; BlasInt N = (BlasInt)n; aa = (double*)malloc(n*n*sizeof(double)); bb = (double*)malloc(n*n*sizeof(double)); /* row-major to column-major (NOTE: dgetrf_ is a fortran function) */ for(i=0; i [matrix_size]\n"); exit(0); } if(matrix_size <= 0) { printf("Error: matrix size (%d) should be > 0\n", matrix_size); GA_Error("matrix size should be >0", 1); } /* ***************************************************************** * Initialize MPI/TCGMSG-MPI, GA and MA * *****************************************************************/ MP_INIT(argc,argv); GA_INIT(argc,argv); /* initialize GA */ me = GA_Nodeid(); nprocs = GA_Nnodes(); heap /= nprocs; stack /= nprocs; if(! MA_init(MT_F_DBL, stack, heap)) /* initialize MA */ { GA_Error("MA_init failed",stack+heap); } /* create/initialize the matrix */ if((A = (double*)malloc(matrix_size*matrix_size*sizeof(double))) == NULL) { GA_Error("malloc failed", matrix_size*matrix_size*sizeof(double)); } for(i=0; i<2; i++) /* 5 runs */ { init_array(A, matrix_size); #if DEBUG if(me==0) print_array(A, matrix_size); #endif /* ***************************************************************** * Perform LU Factorization * *****************************************************************/ ga_lu(A, matrix_size); } free(A); /* ***************************************************************** * Terminate MPI/TCGMSG-MPI, GA and MA * *****************************************************************/ if(me==0)printf("Success\n"); GA_Terminate(); MP_FINALIZE(); return 0; } /** * TODO: * - LU for non-square matrix * */ ga-5-4/global/testing/getmem.c0000644000175000017500000000411112662210460014363 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define N 4 /* dimension of matrices */ int main( int argc, char **argv ) { int g_a, g_b,i; int n=N, type=MT_F_DBL; int dims[6]={N,N,N,N,N,N}; int lo[6], hi[6]; int heap=30000, stack=20000; int me, nproc; int datatype, elements; double *prealloc_mem; MP_INIT(argc,argv); GA_INIT(argc,argv); /* initialize GA */ me=GA_Nodeid(); nproc=GA_Nnodes(); if(me==0) { if(GA_Uses_fapi())GA_Error("Program runs with C array API only",1); printf("Using %ld processes\n",(long)nproc); fflush(stdout); } heap /= nproc; stack /= nproc; if(! MA_init(MT_F_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ /* This is a regular matrix. */ if(me==0)printf("Creating matrix A\n"); g_a = NGA_Create(type, 2, dims, "A", NULL); if(!g_a) GA_Error("create failed: A",n); if(me==0)printf("OK\n"); NGA_Distribution( g_a, me, lo, hi ); #if 1 /* This is just allocating and freeing memory. */ datatype = type; elements = 1; for ( i=0; i<2; i++ ) { elements *= (hi[i] - lo[i] + 1); } prealloc_mem = GA_Getmem(datatype, elements, 0); for ( i=0; i #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SEM_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDLIB_H # include #endif #if !HAVE_UNION_SEMUN union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif #define MAX_SEM 10 struct sembuf sops; int semaphoreID; int sem_init=0; #define P_ -1 #define V_ 1 #define P(s) \ {\ sops.sem_num = (s);\ sops.sem_op = P_;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } #define V(s) \ {\ sops.sem_num = (s);\ sops.sem_op = V_;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } int SemGet(num_sem) int num_sem; { if(num_sem<1)return(0); if(num_sem>MAX_SEM)return(0); semaphoreID = semget(IPC_PRIVATE,num_sem,0600); if(semaphoreID<0){ fprintf(stderr,"SemGet failed \n"); perror((char*)0); } sem_init = num_sem; return(semaphoreID); } void SemInit(id,value) int id,value; { union semun semctl_arg; fprintf(stderr,"SemInit %d %d\n",id,value); semctl_arg.val = value; if(id >= sem_init || id<0 ) fprintf(stderr,"attempt to intialize invalid semaphore %d %d\n", id,sem_init); else if( semctl(semaphoreID, id,SETVAL,semctl_arg )<0){ fprintf(stderr,"SemInit error\n"); perror((char*)0); } fprintf(stderr,"exiting SemInit \n"); } /* release semaphore(s) */ void SemDel() { semctl(semaphoreID,NULL,IPC_RMID,NULL); } /*\ * (char *) CreateSharedRegion((long *) id, (long *) size) * long DetachSharedRegion((long) id, (long) size, (char *) addr) * long DeleteSharedRegion((long) id) * long DeleteSharedAll() * (char *) AttachSharedRegion((long) id, (long) size)) \*/ void Error( str, code) char *str; int code; { fprintf(stderr,"%s %d\n",str, code); exit(0); } #ifdef ALLIANT #include extern char *valloc(); char *CreateSharedRegion(id, size) long *size, *id; { struct timeval tp; struct timezone tzp; char *temp; int status; /* Have to round up to a multiple of page size before allocating on a page boundary */ *size = ( (*size + (PAGE_SIZE -1)) / PAGE_SIZE ) * PAGE_SIZE; if ( (temp = valloc((unsigned) *size)) == (char *) NULL) Error("CreateSharedRegion: failed in valloc", (long) 0); /* Now have to get a unique id ... try using time of day in centi-sec */ if ( (status = gettimeofday(&tp, &tzp)) != 0) Error("CreateSharedRegion: error from gettimeofday", (long) status); *id = (tp.tv_sec + 10000*tp.tv_usec) & 0xffffff; /* Now make the region */ if ( (status = create_shared_region(*id, temp, *size, 0)) != 0) Error("CreateSharedRegion: error from create_shared_region", (long) status); return temp; } long DetachSharedRegion( id, size, addr) long id, size; char *addr; { return detach_shared_region( id, addr, size); } long DeleteSharedRegion(id) long id; { return delete_shared_region(id); } char *AttachSharedRegion(id, size) long id, size; { char *temp; int status; if (size != (((size + (PAGE_SIZE -1)) / PAGE_SIZE) * PAGE_SIZE)) Error("AttachSharedRegion: input size is not multiple of PAGE_SIZE", (long) size); if ( (temp = valloc((unsigned) size)) == (char *) NULL) Error("AttachSharedRegion: failed in valloc", (long) 0); /* Now try to attach */ if ( (status = attach_shared_region(id, temp, size)) != 0) Error("AttachSharedRegion: error from attach_shared_region", (long) status); return temp; } #endif #if defined(SEQUENT) || defined(ENCORE) #ifdef SEQUENT #define SHMALLOC shmalloc #define SHFREE shfree #endif #ifdef ENCORE #define SHMALLOC share_malloc #define SHFREE share_free #endif extern char *SHMALLOC(); extern int SHFREE(); #define MAX_ADDR 20 static int next_id = 0; /* Keep track of id */ static char *shaddr[MAX_ADDR]; /* Keep track of addresses */ char *CreateSharedRegion(id, size) long *size, *id; { char *temp; if (next_id >= MAX_ADDR) Error("CreateSharedRegion: too many shared regions", (long) next_id); if ( (temp = SHMALLOC((unsigned) *size)) == (char *) NULL) Error("CreateSharedRegion: failed in SHMALLOC", (long) *size); *id = next_id++; shaddr[*id] = temp; return temp; } long DetachSharedRegion( id, size, addr) long id, size; char *addr; { /* This needs improving to make more robust */ return SHFREE(addr); } long DeleteSharedRegion(id) long id; { /* This needs improving to make more robust */ return SHFREE(shaddr[id]); } char *AttachSharedRegion(id, size) long id, size; { Error("AttachSharedRegion: cannot do this on SEQUENT or BALANCE", (long) -1); } #endif /* Bizarre sequent has sysv semaphores but proprietary shmem */ /* Encore has sysv shmem but is limited to total of 16384bytes! */ #if defined(SYSV) && !defined(SEQUENT) && !defined(ENCORE) #include #include #include #include #include #ifdef SUN extern char *shmat(); #endif char *CreateSharedRegion(id, size) long *size, *id; { char *temp; /* Create the region */ if ( (*id = shmget(IPC_PRIVATE, (int) *size, (int) (IPC_CREAT | 00600))) < 0 ){ fprintf(stderr,"id=%d size=%d\n",*id, (int) *size); perror((char*)0); Error("CreateSharedRegion: failed to create shared region", (long) *id); } /* Attach to the region */ if ( (temp = shmat((int) *id, (char *) NULL, 0)) == (char *) NULL){ perror((char*)0); Error("CreateSharedRegion: failed to attach to shared region", (long) 0); } return temp; } long DetachSharedRegion( id, size, addr) long id, size; char *addr; { return shmdt(addr); } long DeleteSharedRegion(id) long id; { return shmctl((int) id, IPC_RMID, (struct shmid_ds *) NULL); } char *AttachSharedRegion(id, size) long id, size; { char *temp; if ( (temp = shmat((int) id, (char *) NULL, 0)) == (char *) NULL) Error("AttachSharedRegion: failed to attach to shared region", (long) 0); return temp; } #endif #if defined(CONVEX) || defined(APOLLO) #include #include #include #include extern char *strdup(); extern char *mktemp(); #define MAX_ID 20 static struct id_list_struct { char *addr; /* pointer to shmem region */ unsigned size; /* size of region */ char *filename; /* associated file name */ int fd; /* file descriptor */ int status; /* = 1 if in use */ } id_list[MAX_ID]; static int next_id = 0; static char template[] = "/tmp/SHMEM.XXXXXX"; char *CreateSharedRegion(id, size) long *size, *id; { char *temp; if (next_id == MAX_ID) Error("CreateSharedRegion: MAX_ID exceeded ", MAX_ID); *id = next_id; #ifdef APOLLO id_list[*id].fd = -1; #else if ( (temp = strdup(template)) == (char *) NULL) Error("CreateSharedRegion: failed to get space for filename", 0); /* Generate scratch file to identify region ... need to know this name to attach to the region so need to establish some policy before AttachtoSharedRegion can work */ id_list[*id].filename = mktemp(temp); if ( (id_list[*id].fd = open(id_list[*id].filename, O_RDWR|O_CREAT, 0666)) < 0) Error("CreateSharedRegion: failed to open temporary file",0); #endif id_list[*id].addr = mmap((caddr_t) 0, (unsigned *) size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, id_list[*id].fd, 0); #ifdef APOLLO if (id_list[*id].addr == (char *) 0) Error("CreateSharedRegion: mmap failed",-1); #else if (id_list[*id].addr == (char *) -1) Error("CreateSharedRegion: mmap failed",-1); #endif id_list[*id].size = *size; id_list[*id].status = 1; next_id++; return id_list[*id].addr; } long DetachSharedRegion( id, size, addr) long id, size; char *addr; { if ( (id < 0) || (id > next_id)) return (long) -1; if (id_list[id].status != 1) return (long) -1; id_list[id].status = 0; return (long) munmap(id_list[id].addr, 0); } long DeleteSharedRegion(id) long id; { if ( (id < 0) || (id > next_id) ) return (long) -1; if (id_list[id].status != 1) return (long) -1; (void) DetachSharedRegion(id, 0, (char *) 0); if (id_list[id].fd >= 0) { (void) close(id_list[id].fd); (void) unlink(id_list[id].filename); } return (long) 0; } char *AttachSharedRegion(id, size) long id, size; { Error("AttachSharedRegion: need mods for this to work on CONVEX", (long) -1); } long DeleteSharedAll() { long id; long status = 0; for (id=0; id] \n single argument is interpreted as with = 0 assumed\n"); return 1; } if(argc=2) sscanf(argv[1],"%d",&to); else { sscanf(argv[1],"%d",&from); sscanf(argv[2],"%d",&to); } if(from>to && to <0){ printf("wrong arguments\n"); return 1; } for(i=from;i<=to;i++){ semaphoreID =i; SemDel(); DeleteSharedRegion((long)i); } return 0; } ga-5-4/global/testing/mmatrix.F0000644000175000017500000003307512662210457014552 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF #define USE_FAST_MERGE 0 program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM, nwidth, MAXPROC, nloop parameter (nmax = 1025, DIM = 2, MAXPROC = 2000) parameter (nloop = 50) integer ndim, nprocs, tprocs, pdims(7), type, dcnt, maxval integer g_a, g_b, g_c, g_aa, g_bb, g_cc, iproc integer inode, tnodes, p_m, ix, iy, xinc, yinc integer i, j, k, l, ii, jj, dims(7), mdim, ndims(7) integer lo(7), hi(7), ld(7) integer lo2(7), hi2(7) integer lo3(7), hi3(7) integer lo4(7), hi4(7) integer lo5(7), hi5(7) integer chunk(7), imax, jmax, iloop, afail, bfail, cfail double precision a(nmax, nmax), b(nmax,nmax), c(nmax,nmax) double precision ta(nmax, nmax), tb(nmax,nmax),tc(nmax,nmax) double precision tat(nmax, nmax) double precision start,start1,t1,t2,t3,t4,t5,t6,t7 double precision alpha, beta #if USE_FAST_MERGE integer mblock,iblock #endif logical status, ltest parameter (heap=400*400*4, fudge=100, stack=400*400*4) c c*** Intitialize a message passing library c #include "mp3.fh" mdim = nmax c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap + fudge c call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DBL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then print *, 'using ', ga_nnodes(), ' process(es)' call ffflush(6) endif #if USE_FAST_MERGE if(me.eq.0)then print *,'*' print *,'* Using fast merge algorithm' print *,'*' endif #endif c c Test matrix multiply for mirrored arrays c ndim = 2 c c processor distribution on node c inode = ga_cluster_nodeid() nprocs = ga_cluster_nprocs(inode) tnodes = ga_cluster_nnodes() tprocs = ga_nnodes() iproc = mod(me,nprocs) call factor(tnodes,ndim,ndims) call factor(nprocs,ndim,pdims) c if (me.eq.0) then write(6,*) '*' write(6,*) '* Number of processors: ',tprocs write(6,*) '* Number of processors/node : ',nprocs write(6,*) '* Matrix dimension : ',mdim write(6,*) '*' endif c c create global arrays c do i = 1, ndim chunk(i) = 0 dims(i) = mdim lo(i) = 1 hi(i) = mdim ld(i) = nmax end do type = MT_DBL p_m = ga_pgroup_get_mirror() status = nga_create(type, ndim, dims,"aa", chunk, g_aa) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array AA creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif status = nga_create(type, ndim, dims,"bb", chunk, g_bb) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array BB creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif status = nga_create(type, ndim, dims,"cc", chunk, g_cc) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array CC creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif #define MIRROR 1 #if MIRROR status = nga_create_config(type, ndim, dims,"a", chunk, p_m, g_a) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array A creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif status = nga_create_config(type, ndim, dims,"b", chunk, p_m, g_b) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array B creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif status = nga_create_config(type, ndim, dims,"c", chunk, p_m, g_c) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array C creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif #endif c c initialize a and b matrices c k = 0 l = 7 do j = 1, mdim do i = 1, mdim k = k+1 k = mod(k,29) a(i,j) = dble(k) l = l + 1 l = mod(l,37) b(i,j) = dble(l) end do end do c c initialize global arrays c #if MIRROR if (iproc.eq.0) then call nga_put(g_a,lo,hi,a,ld) call nga_put(g_b,lo,hi,b,ld) endif call ga_zero(g_c) #endif if (me.eq.0) then call nga_put(g_aa,lo,hi,a,ld) call nga_put(g_bb,lo,hi,b,ld) endif call ga_zero(g_cc) if (me.eq.0) then write(6,*) '*' write(6,*) '* Initialized global arrays with data' write(6,*) '*' endif call ga_sync() c c work out which chunk of matrix c this node is responsible c for c t1 = 0.0d00 t2 = 0.0d00 t3 = 0.0d00 t4 = 0.0d00 t5 = 0.0d00 t6 = 0.0d00 t7 = 0.0d00 do iloop = 1, nloop call ga_zero(g_cc) #if MIRROR call ga_zero(g_c) start = util_timer() start1 = util_timer() #if !USE_FAST_MERGE ix = mod(inode,ndims(1)) iy = (inode - ix)/ndims(1) xinc = dims(1)/ndims(1) yinc = dims(2)/ndims(2) lo2(1) = ix*xinc+1 lo2(2) = iy*yinc+1 if (ix.ne.ndims(1)-1) then hi2(1) = (ix+1)*xinc else hi2(1) = dims(1) endif if (iy.ne.ndims(2)-1) then hi2(2) = (iy+1)*yinc else hi2(2) = dims(2) endif #else mblock = ga_num_mirrored_seg(g_c) do iblock = 1, mblock call ga_get_mirrored_block(g_c,iblock,lo2,hi2) #endif c c work out which chunk of matrix c this processor is responsible c for c ix = mod(iproc,pdims(1)) iy = (iproc - ix)/(hi2(1)-lo2(1)+1) xinc = (hi2(1)-lo2(1)+1)/pdims(1) yinc = (hi2(2)-lo2(2)+1)/pdims(2) lo3(1) = ix*xinc+lo2(1) lo3(2) = iy*yinc+lo2(2) if (ix.ne.pdims(1)-1) then hi3(1) = (ix+1)*xinc+lo2(1)-1 else hi3(1) = hi2(1) endif if (iy.ne.pdims(2)-1) then hi3(2) = (iy+1)*yinc+lo2(2)-1 else hi3(2) = hi2(2) endif t3 = t3 + util_timer() - start1 c start1 = util_timer() #define DGEMM2 1 #if (DGEMM2 && !USE_FAST_MERGE) lo4(1) = lo2(1) hi4(1) = hi2(1) lo4(2) = 1 hi4(2) = dims(2) lo5(1) = 1 hi5(1) = dims(1) lo5(2) = lo2(2) hi5(2) = hi2(2) c c perform matrix patch multiplies c alpha = 1.0 beta = 0.0 start1 = util_timer() call ga_matmul_patch('n','n',alpha,beta, + g_a,lo4(1),hi4(1),lo4(2),hi4(2), + g_b,lo5(1),hi5(1),lo5(2),hi5(2), + g_c,lo2(1),hi2(1),lo2(2),hi2(2)) t5 = t5 + util_timer() - start1 #else lo4(1) = lo3(1) hi4(1) = hi3(1) lo4(2) = 1 hi4(2) = dims(2) call nga_get(g_a,lo4,hi4,ta,ld) lo4(1) = 1 hi4(1) = dims(1) lo4(2) = lo3(2) hi4(2) = hi3(2) call nga_get(g_b,lo4,hi4,tb,ld) t4 = t4 + util_timer() - start1 start1 = util_timer() imax = hi3(1) - lo3(1) + 1 do i = 1, imax do j = 1, mdim tat(j,i) = ta(i,j) end do end do imax = hi3(1) - lo3(1) + 1 jmax = hi3(2) - lo3(2) + 1 do j = 1, jmax do i = 1, imax tc(i,j) = 0.0d00 do k = 1, mdim tc(i,j) = tc(i,j) + tat(k,i)*tb(k,j) end do end do end do t5 = t5 + util_timer() - start1 start1 = util_timer() call nga_put(g_c,lo3,hi3,tc,ld) t6 = t6 + util_timer() - start1 #endif #if USE_FAST_MERGE end do #endif call ga_mask_sync(.true.,.false.) start1 = util_timer() #if USE_FAST_MERGE call ga_fast_merge_mirrored(g_c) #else call ga_merge_mirrored(g_c) #endif t7 = t7 + util_timer() - start1 t1 = t1 + util_timer() - start #else do i = 1, mdim do j = 1, mdim tat(j,i) = a(i,j) end do end do do i = 1, mdim do j = 1, mdim c(i,j) = 0.0d00 do k = 1, mdim c(i,j) = c(i,j) + tat(k,i)*b(k,j) end do end do end do #endif c c do a conventional ga matrix multiply c alpha = 1.0 beta = 0.0 call ga_sync() start = util_timer() #define DGEMM 1 #if DGEMM call ga_dgemm('n','n',mdim,mdim,mdim,alpha,g_aa,g_bb,beta,g_cc) #else do i = 1, mdim do j = 1, mdim tat(j,i) = a(i,j) end do end do do i = 1, mdim do j = 1, mdim tc(i,j) = 0.0d00 do k = 1, mdim tc(i,j) = tc(i,j) + tat(k,i)*b(k,j) end do end do end do #endif t2 = t2 + util_timer() - start call ga_sync() c c check to see if matrix operations agree c #if MIRROR call nga_get(g_c,lo,hi,c,ld) #endif #if DGEMM call nga_get(g_cc,lo,hi,tc,ld) #endif call ga_sync() ltest = .true. afail = 0 bfail = 0 cfail = 0 do i = 1, mdim do j = 1, mdim if (c(i,j).ne.tc(i,j)) then cfail = cfail+1 ltest = .false. if (c(i,j).eq.0.0d00) then afail = afail + 1 endif if (tc(i,j).eq.0.0d00) then bfail = bfail + 1 endif end if end do end do if (ltest) then if (me.eq.0) write(6,*) 'Matrices agree for iteration ',iloop else if (me.eq.0) then write(6,*) 'Matrices disagree for iteration',iloop write(6,*) ' Total number of disagreements',cfail write(6,*) ' Total number of zeros in mirrored array',afail write(6,*) ' Total number of zeros in dgemm array',bfail endif endif end do c call ga_dgop(MT_DBL,t1,1,'+') call ga_dgop(MT_DBL,t2,1,'+') call ga_dgop(MT_DBL,t3,1,'+') call ga_dgop(MT_DBL,t4,1,'+') call ga_dgop(MT_DBL,t5,1,'+') call ga_dgop(MT_DBL,t6,1,'+') call ga_dgop(MT_DBL,t7,1,'+') t1 = t1/dble(nloop*tprocs) t2 = t2/dble(nloop*tprocs) t3 = t3/dble(nloop*tprocs) t4 = t4/dble(nloop*tprocs) t5 = t5/dble(nloop*tprocs) t6 = t6/dble(nloop*tprocs) t7 = t7/dble(nloop*tprocs) if (me.eq.0) then write(6,*) 'Elapsed time for Mirrored matrix multiply ',t1 write(6,*) ' Elapsed time for initial setup ',t3 write(6,*) ' Elapsed time for copy to buffers ',t4 write(6,*) ' Elapsed time for partial multiply ',t5 write(6,*) ' Elapsed time for copy from buffer',t6 write(6,*) ' Elapsed time for merge',t7 write(6,*) 'Elapsed time for Conventional matrix multiply ',t2 endif c c*** Tidy up the GA package c if(ga_nodeid().eq.0)print *,' All tests successful' c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(7),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end ga-5-4/global/testing/field-test.F0000644000175000017500000006070712662210457015133 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: test.F,v 1.64.2.11 2007-04-06 22:37:35 d3g293 Exp $ c vector boxes lack arithmetic precision #if defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 2e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF c#define NEW_API c#define MIRROR #define GA3 #define NGA_GATSCAT c#define BLOCK_CYCLIC c#define USE_SCALAPACK_DISTR c#define USE_RESTRICTED #ifdef USE_RESTRICTED # define NEW_API #endif #define MEM_INC 1000 #ifdef BLOCK_CYCLIC # define NEW_API # undef MIRROR #else # undef USE_SCALAPAC_DISTR #endif program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me, nproc, map(4096), block integer g_s, ndim, dim1, i logical status parameter (heap=200*200*4, fudge=100, stack=200*200) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap/nproc + fudge ma_heap = 2*ma_heap #ifdef USE_RESTRICTED ma_heap = 2*ma_heap #endif call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then #ifdef MIRROR print *,' Performing tests on Mirrored Arrays' #endif print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c c Uncomment the below line to register external memory allocator c for dynamic arrays inside GA routines. c call register_ext_memory() c if(me.eq.(nproc-1))then print *, 'using ', nproc,' process(es) ', ga_cluster_nnodes(), $ ' cluster nodes' print *,'process ', me, ' is on node ',ga_cluster_nodeid(), $ ' with ', ga_cluster_nprocs(-1), ' processes' call ffflush(6) endif c c create array to force staggering of memory and uneven distribution c of pointers c dim1 = MEM_INC map(1) = 1 do i = 2, nproc map(i) = MEM_INC*(i-1)+1 dim1 = dim1 + MEM_INC*i end do g_s = ga_create_handle() ndim = 1 call ga_set_data(g_s,ndim,dim1,MT_INT) call ga_set_array_name(g_s,'s') call ga_set_irreg_distr(g_s,map,nproc) c c*** Check support for single precision complex arrays c if (me.eq.0) then write(6,*) write(6,*) ' CHECKING SINGLE COMPLEX ' write(6,*) call ffflush(6) endif call check_complex_float() #if 1 c c*** Check support for double precision complex arrays c if (me.eq.0) then write(6,*) write(6,*) ' CHECKING DOUBLE COMPLEX ' write(6,*) call ffflush(6) endif call check_complex() #endif if(me.eq.0) call ga_print_stats() if(me.eq.0) print *,' ' if(me.eq.0) print *,'All tests successful ' status = ga_destroy(g_s) c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c end subroutine check_complex_float() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) real areal(n,n),aimg(n,n) real breal(n,n),bimg(n,n) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords complex x, sum1, sum2, factor integer lprocs, inode, iproc, lproc integer lo(2), hi(2) #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR areal(i,j) = real(i-1) aimg(i,j) = real((j-1)*n) #else areal(i,j) = real(inode) + real(i-1) aimg(i,j) = 0.0d00 + real((j-1)*n) #endif breal(i,j) = -1d0 bimg(i,j) = 1d0 enddo enddo c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_SCPL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(MT_SCPL, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(MT_SCPL, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_SCPL) call ga_set_array_name(g_b,'b') # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_SCPL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_SCPL, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c call ga_print(g_a) c c Check that it is indeed zero c lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_a, lo, hi, 0, 4, breal, n) call nga_get_field(g_a, lo, hi, 4, 4, bimg, n) call ga_sync() do i = 1, n do j = 1, n if(breal(i,j).ne.0d0) then write(6,*) me,' real zero ', i, j, breal(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif if(bimg(i,j).ne.0d0) then write(6,*) me,' img zero ', i, j, bimg(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/4 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) lo(1) = ilo lo(2) = jlo hi(1) = ihi hi(2) = jhi call nga_put_field(g_a, lo, hi, 0, 4, areal(ilo, jlo), n) call nga_put_field(g_a, lo, hi, 4, 4, aimg(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c c call ga_get(g_a, 1, n, 1, n, b, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_a, lo, hi, 0, 4, breal, n) call nga_get_field(g_a, lo, hi, 4, 4, bimg, n) c do i = 1, n do j = 1, n if (breal(i,j) .ne. areal(i,j)) then write(6,*) ' put(real) ', me, i, j, areal(i,j),breal(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*) ' put(img) ', me, i, j, aimg(i,j),bimg(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c c call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) lo(1) = ilo lo(2) = jlo hi(1) = ihi hi(2) = jhi call nga_get_field(g_a, lo, hi, 0, 4, breal(ilo, jlo), n) call nga_get_field(g_a, lo, hi, 4, 4, bimg(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (breal(i,j) .ne. areal(i,j)) then write(6,*)'error:', i, j, breal(i,j), areal(i,j) call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*)'error:', i, j, bimg(i,j), aimg(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) then c call ga_put(g_a, 1, n, 1, n, a, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_put_field(g_a, lo, hi, 0, 4, areal, n) call nga_put_field(g_a, lo, hi, 4, 4, aimg, n) endif #else if(iproc.eq.0) then c call ga_put(g_a, 1, n, 1, n, a, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_put_field(g_a, lo, hi, 0, 4, areal, n) call nga_put_field(g_a, lo, hi, 4, 4, aimg, n) endif #endif call ga_copy(g_a, g_b) c call ga_get(g_b, 1, n, 1, n, b, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_b, lo, hi, 0, 4, breal, n) call nga_get_field(g_b, lo, hi, 4, 4, bimg, n) do j = 1, n do i = 1, n if (breal(i,j) .ne. areal(i,j)) then write(6,*) ' copy ', me, i, j, areal(i,j), breal(i,j) call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*) ' copy ', me, i, j, aimg(i,j), bimg(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c end c----------------------------------------------------------------- subroutine check_complex() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) double precision areal(n,n), breal(n,n) double precision aimg(n,n), bimg(n,n) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords double complex x, sum1, sum2, factor integer lo(2), hi(2) integer lprocs, inode, iproc, lproc #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif #ifdef BLOCK_CYCLIC integer block_size(2), proc_grid(2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",0) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR areal(i,j) = dble(i-1) aimg(i,j) = dble((j-1)*n) #else areal(i,j) = dble(inode) + dble(i-1) aimg(i,j) = 0.0d00 + dble((j-1)*n) #endif breal(i,j) = -1d0 bimg(i,j) = 1d0 enddo enddo c c Create type c c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_DCPL) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(MT_DCPL, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(MT_DCPL, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DCPL) call ga_set_array_name(g_b,'b') #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif #endif # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(MT_DCPL, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(MT_DCPL, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format('> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c c call ga_get(g_a, 1, n, 1, n, b, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_a, lo, hi, 0, 8, breal, n) call nga_get_field(g_a, lo, hi, 8, 8, bimg, n) call ga_sync() do i = 1, n do j = 1, n if(breal(i,j).ne.(0d0,0d0)) then write(6,*) me,' real zero ', i, j, breal(i,j) call ffflush(6) call ga_error('... exiting ',0) endif if(bimg(i,j).ne.(0d0,0d0)) then write(6,*) me,' img zero ', i, j, bimg(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) lo(1) = ilo lo(2) = jlo hi(1) = ihi hi(2) = jhi call nga_put_field(g_a, lo, hi, 0, 8, areal(ilo,jlo),n) call nga_put_field(g_a, lo, hi, 8, 8, aimg(ilo,jlo),n) endif ij = ij + 1 enddo enddo call ga_sync() c call ga_print(g_a) c c All nodes check all of a c call util_qfill(n*n, 0.0d0, breal, 1) call util_qfill(n*n, 0d0, bimg, 1) c call ga_get(g_a, 1, n, 1, n, b, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_a, lo, hi, 0, 8, breal, n) call nga_get_field(g_a, lo, hi, 8, 8, bimg, n) c do i = 1, n do j = 1, n if (breal(i,j) .ne. areal(i,j)) then write(6,*) ' real put ', me, i, j, areal(i,j),breal(i,j) call ffflush(6) call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*) ' img put ', me, i, j, aimg(i,j),bimg(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_qfill(n*n, 0.0d0, breal, 1) call util_qfill(n*n, 0d0, bimg, 1) c call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) lo(1) = ilo lo(2) = jlo hi(1) = ihi hi(2) = jhi call nga_get_field(g_a, lo, hi, 0, 8, breal(ilo,jlo),n) call nga_get_field(g_a, lo, hi, 8, 8, bimg(ilo,jlo),n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (breal(i,j) .ne. areal(i,j)) then write(6,*)'real error:', i, j, breal(i,j), areal(i,j) call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*)'img error:', i, j, bimg(i,j), aimg(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) then c call ga_put(g_a, 1, n, 1, n, a, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_put_field(g_a, lo, hi, 0, 8, areal, n) call nga_put_field(g_a, lo, hi, 8, 8, aimg, n) endif #else if(iproc.eq.0) then c call ga_put(g_a, 1, n, 1, n, a, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_put_field(g_a, lo, hi, 0, 8, areal, n) call nga_put_field(g_a, lo, hi, 8, 8, aimg, n) endif #endif call ga_copy(g_a, g_b) c call ga_get(g_b, 1, n, 1, n, b, n) lo(1) = 1 lo(2) = 1 hi(1) = n hi(2) = n call nga_get_field(g_b, lo, hi, 0, 8, breal, n) call nga_get_field(g_b, lo, hi, 8, 8, bimg, n) do j = 1, n do i = 1, n if (breal(i,j) .ne. areal(i,j)) then write(6,*) ' copy ', me, i, j, areal(i,j), breal(i,j) call ga_error('... exiting ',0) endif if (bimg(i,j) .ne. aimg(i,j)) then write(6,*) ' copy ', me, i, j, aimg(i,j), bimg(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) end subroutine util_qfill(n,val,a,ia) implicit none double precision a(*), val integer n, ia, i c c initialise double complex array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/testing/testblas.F0000644000175000017500000010413112662210457014702 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif #include "galinalg.fh" SUBROUTINE TEST_DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B, $ LDB,BETA,C,LDC) C .. Parameters .. DOUBLE PRECISION ONE, ZERO PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) INTEGER MB, NB, KB PARAMETER (MB=64,NB=MB,KB=64) C .. Scalar Arguments .. DOUBLE PRECISION ALPHA, BETA INTEGER K, LDA, LDB, LDC, M, N CHARACTER TRANSA, TRANSB C .. Array Arguments .. C C Purpose C ======= C C DGEMM performs one of the matrix-matrix operations C C C := alpha*op( A )*op( B ) + beta*C, C C where op( X ) is one of C C op( X ) = X or op( X ) = X', C C alpha and beta are scalars, and A, B and C are matrices, with op( A ) C an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. C C Parameters C ========== C C TRANSA - CHARACTER*1. C On entry, TRANSA specifies the form of op( A ) to be used in C the matrix multiplication as follows: C C TRANSA = 'N' or 'n', op( A ) = A. C C TRANSA = 'T' or 't', op( A ) = A'. C C TRANSA = 'C' or 'c', op( A ) = A'. C C Unchanged on exit. C C TRANSB - CHARACTER*1. C On entry, TRANSB specifies the form of op( B ) to be used in C the matrix multiplication as follows: C C TRANSB = 'N' or 'n', op( B ) = B. C C TRANSB = 'T' or 't', op( B ) = B'. C C TRANSB = 'C' or 'c', op( B ) = B'. C C Unchanged on exit. C C M - INTEGER. C On entry, M specifies the number of rows of the matrix C op( A ) and of the matrix C. M must be at least zero. C Unchanged on exit. C C N - INTEGER. C On entry, N specifies the number of columns of the matrix C op( B ) and the number of columns of the matrix C. N must be C at least zero. C Unchanged on exit. C C K - INTEGER. C On entry, K specifies the number of columns of the matrix C op( A ) and the number of rows of the matrix op( B ). K must C be at least zero. C Unchanged on exit. C C ALPHA - DOUBLE PRECISION. C On entry, ALPHA specifies the scalar alpha. C Unchanged on exit. C C A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is C k when TRANSA = 'N' or 'n', and is m otherwise. C Before entry with TRANSA = 'N' or 'n', the leading m by k C part of the array A must contain the matrix A, otherwise C the leading k by m part of the array A must contain the C matrix A. C Unchanged on exit. C C LDA - INTEGER. C On entry, LDA specifies the first dimension of A as declared C in the calling (sub) program. When TRANSA = 'N' or 'n' then C LDA must be at least max( 1, m ), otherwise LDA must be at C least max( 1, k ). C Unchanged on exit. C C B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is C n when TRANSB = 'N' or 'n', and is k otherwise. C Before entry with TRANSB = 'N' or 'n', the leading k by n C part of the array B must contain the matrix B, otherwise C the leading n by k part of the array B must contain the C matrix B. C Unchanged on exit. C C LDB - INTEGER. C On entry, LDB specifies the first dimension of B as declared C in the calling (sub) program. When TRANSB = 'N' or 'n' then C LDB must be at least max( 1, k ), otherwise LDB must be at C least max( 1, n ). C Unchanged on exit. C C BETA - DOUBLE PRECISION. C On entry, BETA specifies the scalar beta. When BETA is C supplied as zero then C need not be set on input. C Unchanged on exit. C C C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). C Before entry, the leading m by n part of the array C must C contain the matrix C, except when beta is zero, in which C case C need not be set on entry. C On exit, the array C is overwritten by the m by n matrix C ( alpha*op( A )*op( B ) + beta*C ). C C LDC - INTEGER. C On entry, LDC specifies the first dimension of C as declared C in the calling (sub) program. LDC must be at least C max( 1, m ). C Unchanged on exit. C C C Level 3 Blas routine. C C -- Written on 8-February-1989. C Jack Dongarra, Argonne National Laboratory. C Iain Duff, AERE Harwell. C Jeremy Du Croz, Numerical Algorithms Group Ltd. C Sven Hammarling, Numerical Algorithms Group Ltd. * * This code comes from a report entitled: * The IBM RISC System/6000 and Linear Algebra Operations, by * Jack J. Dongarra, Peter Mayes, and Giuseppe Radicati di Brozolo, * University of Tennessee Computer Science Tech Report: CS - 90 - 122. C C DOUBLE PRECISION A(LDA,*), B(LDB,*), C(LDC,*) C .. External Functions .. LOGICAL LSAME EXTERNAL LSAME C .. External Subroutines .. EXTERNAL XERBLA C .. Intrinsic Functions .. INTRINSIC MAX, MIN C .. Local Scalars .. DOUBLE PRECISION T11, T12, T21, T22 INTEGER I, IDEPTH, II, ILEN, INFO, ISPAN, J, JDEPTH, JJ, * JLEN, JSPAN, L, LL, LSPAN, NCOLA, NROWA, NROWB LOGICAL NOTA, NOTB C .. Local Arrays .. DOUBLE PRECISION CH(KB,MB), CH1(KB), CH2(KB) C .. Executable Statements .. C C Set NOTA and NOTB as true if A and B respectively are not C transposed and set NROWA, NCOLA and NROWB as the number of rows C and columns of A and the number of rows of B respectively. C NOTA = LSAME(TRANSA,'N') NOTB = LSAME(TRANSB,'N') IF (NOTA) THEN NROWA = M NCOLA = K ELSE NROWA = K NCOLA = M END IF IF (NOTB) THEN NROWB = K ELSE NROWB = N END IF C C Test the input parameters. C INFO = 0 IF (( .NOT. NOTA) .AND. ( .NOT. LSAME(TRANSA,'C')) * .AND. ( .NOT. LSAME(TRANSA,'T'))) THEN INFO = 1 ELSE IF (( .NOT. NOTB) .AND. ( .NOT. LSAME(TRANSB,'C')) * .AND. ( .NOT. LSAME(TRANSB,'T'))) THEN INFO = 2 ELSE IF (M.LT.0) THEN INFO = 3 ELSE IF (N.LT.0) THEN INFO = 4 ELSE IF (K.LT.0) THEN INFO = 5 ELSE IF (LDA.LT.MAX(1,NROWA)) THEN INFO = 8 ELSE IF (LDB.LT.MAX(1,NROWB)) THEN INFO = 10 ELSE IF (LDC.LT.MAX(1,M)) THEN INFO = 13 END IF IF (INFO.NE.0) THEN CALL XERBLA('DGEMM ',INFO) RETURN END IF C C Quick return if possible. C IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (((ALPHA.EQ.ZERO) .OR. (K.EQ.0)) * .AND. (BETA.EQ.ONE))) RETURN IF (BETA.EQ.ZERO) THEN DO 40 J = 1, N DO 20 I = 1, M C(I,J) = ZERO 20 CONTINUE 40 CONTINUE ELSE DO 80 J = 1, N DO 60 I = 1, M C(I,J) = BETA*C(I,J) 60 CONTINUE 80 CONTINUE END IF C C And if alpha.eq.zero. C IF (ALPHA.EQ.ZERO) RETURN C C Start the operations. C IF (NOTB) THEN IF (NOTA) THEN C C Form C := C + alpha*A*B. C DO 380 L = 1, K, KB LSPAN = MIN(KB,K-L+1) DO 360 I = 1, M, MB IDEPTH = 2 ISPAN = MIN(MB,M-I+1) ILEN = IDEPTH*(ISPAN/IDEPTH) DO 120 II = I, I + ISPAN - 1 DO 100 LL = L, L + LSPAN - 1 CH(LL-L+1,II-I+1) = ALPHA*A(II,LL) 100 CONTINUE 120 CONTINUE DO 340 J = 1, N, NB JDEPTH = 2 JSPAN = MIN(NB,N-J+1) JLEN = JDEPTH*(JSPAN/JDEPTH) DO 220 JJ = J, J + JLEN - 1, JDEPTH DO 160 II = I, I + ILEN - 1, IDEPTH T11 = ZERO T21 = ZERO T12 = ZERO T22 = ZERO DO 140 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T21 = T21 + CH(LL-L+1,II-I+2)*B(LL,JJ) T12 = T12 + CH(LL-L+1,II-I+1)*B(LL,JJ+1) T22 = T22 + CH(LL-L+1,II-I+2)*B(LL,JJ+1) 140 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 C(II,JJ+1) = C(II,JJ+1) + T12 C(II+1,JJ+1) = C(II+1,JJ+1) + T22 160 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 200 II = I + ILEN, I + ISPAN - 1 T11 = ZERO T12 = ZERO DO 180 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T12 = T12 + CH(LL-L+1,II-I+1)*B(LL, * JJ+1) 180 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II,JJ+1) = C(II,JJ+1) + T12 200 CONTINUE END IF 220 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 320 JJ = J + JLEN, J + JSPAN - 1 DO 260 II = I, I + ILEN - 1, IDEPTH T11 = ZERO T21 = ZERO DO 240 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T21 = T21 + CH(LL-L+1,II-I+2)*B(LL,JJ) 240 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 260 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 300 II = I + ILEN, I + ISPAN - 1 T11 = ZERO DO 280 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL, * JJ) 280 CONTINUE C(II,JJ) = C(II,JJ) + T11 300 CONTINUE END IF 320 CONTINUE END IF 340 CONTINUE 360 CONTINUE 380 CONTINUE ELSE C C Form C := C + alpha*A'*B C DO 680 I = 1, M, MB IDEPTH = 2 ISPAN = MIN(MB,M-I+1) ILEN = IDEPTH*(ISPAN/IDEPTH) DO 660 L = 1, K, KB LSPAN = MIN(KB,K-L+1) DO 420 II = I, I + ISPAN - 1 DO 400 LL = L, L + LSPAN - 1 CH(LL-L+1,II-I+1) = ALPHA*A(LL,II) 400 CONTINUE 420 CONTINUE DO 640 J = 1, N, NB JDEPTH = 2 JSPAN = MIN(NB,N-J+1) JLEN = JDEPTH*(JSPAN/JDEPTH) DO 520 JJ = J, J + JLEN - 1, JDEPTH DO 460 II = I, I + ILEN - 1, IDEPTH T11 = ZERO T21 = ZERO T12 = ZERO T22 = ZERO DO 440 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T21 = T21 + CH(LL-L+1,II-I+2)*B(LL,JJ) T12 = T12 + CH(LL-L+1,II-I+1)*B(LL,JJ+1) T22 = T22 + CH(LL-L+1,II-I+2)*B(LL,JJ+1) 440 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 C(II,JJ+1) = C(II,JJ+1) + T12 C(II+1,JJ+1) = C(II+1,JJ+1) + T22 460 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 500 II = I + ILEN, I + ISPAN - 1 T11 = ZERO T12 = ZERO DO 480 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T12 = T12 + CH(LL-L+1,II-I+1)*B(LL, * JJ+1) 480 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II,JJ+1) = C(II,JJ+1) + T12 500 CONTINUE END IF 520 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 620 JJ = J + JLEN, J + JSPAN - 1 DO 560 II = I, I + ILEN - 1, IDEPTH T11 = ZERO T21 = ZERO DO 540 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL,JJ) T21 = T21 + CH(LL-L+1,II-I+2)*B(LL,JJ) 540 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 560 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 600 II = I + ILEN, I + ISPAN - 1 T11 = ZERO DO 580 LL = L, L + LSPAN - 1 T11 = T11 + CH(LL-L+1,II-I+1)*B(LL, * JJ) 580 CONTINUE C(II,JJ) = C(II,JJ) + T11 600 CONTINUE END IF 620 CONTINUE END IF 640 CONTINUE 660 CONTINUE 680 CONTINUE END IF ELSE IF (NOTA) THEN C C Form C := C + alpha*A*B' C DO 1000 J = 1, N, NB JDEPTH = 2 JSPAN = MIN(NB,N-J+1) JLEN = JDEPTH*(JSPAN/JDEPTH) DO 980 L = 1, K, KB LSPAN = MIN(KB,K-L+1) DO 720 JJ = J, J + JSPAN - 1 DO 700 LL = L, L + LSPAN - 1 CH(LL-L+1,JJ-J+1) = ALPHA*B(JJ,LL) 700 CONTINUE 720 CONTINUE DO 960 I = 1, M, MB IDEPTH = 2 ISPAN = MIN(MB,M-I+1) ILEN = IDEPTH*(ISPAN/IDEPTH) DO 840 II = I, I + ILEN - 1, IDEPTH DO 740 LL = L, L + LSPAN - 1 CH1(LL-L+1) = A(II,LL) CH2(LL-L+1) = A(II+1,LL) 740 CONTINUE DO 780 JJ = J, J + JLEN - 1, JDEPTH T11 = ZERO T21 = ZERO T12 = ZERO T22 = ZERO DO 760 LL = L, L + LSPAN - 1 T11 = T11 + CH1(LL-L+1)*CH(LL-L+1,JJ-J+1) T21 = T21 + CH2(LL-L+1)*CH(LL-L+1,JJ-J+1) T12 = T12 + CH1(LL-L+1)*CH(LL-L+1,JJ-J+2) T22 = T22 + CH2(LL-L+1)*CH(LL-L+1,JJ-J+2) 760 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 C(II,JJ+1) = C(II,JJ+1) + T12 C(II+1,JJ+1) = C(II+1,JJ+1) + T22 780 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 820 JJ = J + JLEN, J + JSPAN - 1 T11 = ZERO T21 = ZERO DO 800 LL = L, L + LSPAN - 1 T11 = T11 + A(II,LL)*CH(LL-L+1,JJ-J+1) T21 = T21 + A(II+1,LL)*CH(LL-L+1, * JJ-J+1) 800 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 820 CONTINUE END IF 840 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 940 II = I + ILEN, I + ISPAN - 1 DO 880 JJ = J, J + JLEN - 1, JDEPTH T11 = ZERO T12 = ZERO DO 860 LL = L, L + LSPAN - 1 T11 = T11 + A(II,LL)*CH(LL-L+1,JJ-J+1) T12 = T12 + A(II,LL)*CH(LL-L+1,JJ-J+2) 860 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II,JJ+1) = C(II,JJ+1) + T12 880 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 920 JJ = J + JLEN, J + JSPAN - 1 T11 = ZERO DO 900 LL = L, L + LSPAN - 1 T11 = T11 + A(II,LL)*CH(LL-L+1, * JJ-J+1) 900 CONTINUE C(II,JJ) = C(II,JJ) + T11 920 CONTINUE END IF 940 CONTINUE END IF 960 CONTINUE 980 CONTINUE 1000 CONTINUE ELSE C C Form C := C + alpha*A'*B' C DO 1300 J = 1, N, NB JDEPTH = 2 JSPAN = MIN(NB,N-J+1) JLEN = JDEPTH*(JSPAN/JDEPTH) DO 1280 L = 1, K, KB LSPAN = MIN(KB,K-L+1) DO 1040 JJ = J, J + JSPAN - 1 DO 1020 LL = L, L + LSPAN - 1 CH(LL-L+1,JJ-J+1) = ALPHA*B(JJ,LL) 1020 CONTINUE 1040 CONTINUE DO 1260 I = 1, M, MB IDEPTH = 2 ISPAN = MIN(MB,M-I+1) ILEN = IDEPTH*(ISPAN/IDEPTH) DO 1140 II = I, I + ILEN - 1, IDEPTH DO 1080 JJ = J, J + JLEN - 1, JDEPTH T11 = ZERO T21 = ZERO T12 = ZERO T22 = ZERO DO 1060 LL = L, L + LSPAN - 1 T11 = T11 + A(LL,II)*CH(LL-L+1,JJ-J+1) T21 = T21 + A(LL,II+1)*CH(LL-L+1,JJ-J+1) T12 = T12 + A(LL,II)*CH(LL-L+1,JJ-J+2) T22 = T22 + A(LL,II+1)*CH(LL-L+1,JJ-J+2) 1060 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 C(II,JJ+1) = C(II,JJ+1) + T12 C(II+1,JJ+1) = C(II+1,JJ+1) + T22 1080 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 1120 JJ = J + JLEN, J + JSPAN - 1 T11 = ZERO T21 = ZERO DO 1100 LL = L, L + LSPAN - 1 T11 = T11 + A(LL,II)*CH(LL-L+1,JJ-J+1) T21 = T21 + A(LL,II+1)*CH(LL-L+1, * JJ-J+1) 1100 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II+1,JJ) = C(II+1,JJ) + T21 1120 CONTINUE END IF 1140 CONTINUE IF (ILEN.LT.ISPAN) THEN DO 1240 II = I + ILEN, I + ISPAN - 1 DO 1180 JJ = J, J + JLEN - 1, JDEPTH T11 = ZERO T12 = ZERO DO 1160 LL = L, L + LSPAN - 1 T11 = T11 + A(LL,II)*CH(LL-L+1,JJ-J+1) T12 = T12 + A(LL,II)*CH(LL-L+1,JJ-J+2) 1160 CONTINUE C(II,JJ) = C(II,JJ) + T11 C(II,JJ+1) = C(II,JJ+1) + T12 1180 CONTINUE IF (JLEN.LT.JSPAN) THEN DO 1220 JJ = J + JLEN, J + JSPAN - 1 T11 = ZERO DO 1200 LL = L, L + LSPAN - 1 T11 = T11 + A(LL,II)*CH(LL-L+1, * JJ-J+1) 1200 CONTINUE C(II,JJ) = C(II,JJ) + T11 1220 CONTINUE END IF 1240 CONTINUE END IF 1260 CONTINUE 1280 CONTINUE 1300 CONTINUE END IF END IF C RETURN C C End of DGEMM . C END SUBROUTINE TEST_ZGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, $ LDA, B, LDB, BETA, C, LDC ) * .. Scalar Arguments .. CHARACTER*1 TRANSA, TRANSB INTEGER M, N, K, LDA, LDB, LDC COMPLEX*16 ALPHA, BETA * .. Array Arguments .. COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ) * .. * * Purpose * ======= * * ZGEMM performs one of the matrix-matrix operations * * C := alpha*op( A )*op( B ) + beta*C, * * where op( X ) is one of * * op( X ) = X or op( X ) = X' or op( X ) = conjg( X' ), * * alpha and beta are scalars, and A, B and C are matrices, with op( A ) * an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. * * Parameters * ========== * * TRANSA - CHARACTER*1. * On entry, TRANSA specifies the form of op( A ) to be used in * the matrix multiplication as follows: * * TRANSA = 'N' or 'n', op( A ) = A. * * TRANSA = 'T' or 't', op( A ) = A'. * * TRANSA = 'C' or 'c', op( A ) = conjg( A' ). * * Unchanged on exit. * * TRANSB - CHARACTER*1. * On entry, TRANSB specifies the form of op( B ) to be used in * the matrix multiplication as follows: * * TRANSB = 'N' or 'n', op( B ) = B. * * TRANSB = 'T' or 't', op( B ) = B'. * * TRANSB = 'C' or 'c', op( B ) = conjg( B' ). * * Unchanged on exit. * * M - INTEGER. * On entry, M specifies the number of rows of the matrix * op( A ) and of the matrix C. M must be at least zero. * Unchanged on exit. * * N - INTEGER. * On entry, N specifies the number of columns of the matrix * op( B ) and the number of columns of the matrix C. N must be * at least zero. * Unchanged on exit. * * K - INTEGER. * On entry, K specifies the number of columns of the matrix * op( A ) and the number of rows of the matrix op( B ). K must * be at least zero. * Unchanged on exit. * * ALPHA - COMPLEX*16 . * On entry, ALPHA specifies the scalar alpha. * Unchanged on exit. * * A - COMPLEX*16 array of DIMENSION ( LDA, ka ), where ka is * k when TRANSA = 'N' or 'n', and is m otherwise. * Before entry with TRANSA = 'N' or 'n', the leading m by k * part of the array A must contain the matrix A, otherwise * the leading k by m part of the array A must contain the * matrix A. * Unchanged on exit. * * LDA - INTEGER. * On entry, LDA specifies the first dimension of A as declared * in the calling (sub) program. When TRANSA = 'N' or 'n' then * LDA must be at least max( 1, m ), otherwise LDA must be at * least max( 1, k ). * Unchanged on exit. * * B - COMPLEX*16 array of DIMENSION ( LDB, kb ), where kb is * n when TRANSB = 'N' or 'n', and is k otherwise. * Before entry with TRANSB = 'N' or 'n', the leading k by n * part of the array B must contain the matrix B, otherwise * the leading n by k part of the array B must contain the * matrix B. * Unchanged on exit. * * LDB - INTEGER. * On entry, LDB specifies the first dimension of B as declared * in the calling (sub) program. When TRANSB = 'N' or 'n' then * LDB must be at least max( 1, k ), otherwise LDB must be at * least max( 1, n ). * Unchanged on exit. * * BETA - COMPLEX*16 . * On entry, BETA specifies the scalar beta. When BETA is * supplied as zero then C need not be set on input. * Unchanged on exit. * * C - COMPLEX*16 array of DIMENSION ( LDC, n ). * Before entry, the leading m by n part of the array C must * contain the matrix C, except when beta is zero, in which * case C need not be set on entry. * On exit, the array C is overwritten by the m by n matrix * ( alpha*op( A )*op( B ) + beta*C ). * * LDC - INTEGER. * On entry, LDC specifies the first dimension of C as declared * in the calling (sub) program. LDC must be at least * max( 1, m ). * Unchanged on exit. * * * Level 3 Blas routine. * * -- Written on 8-February-1989. * Jack Dongarra, Argonne National Laboratory. * Iain Duff, AERE Harwell. * Jeremy Du Croz, Numerical Algorithms Group Ltd. * Sven Hammarling, Numerical Algorithms Group Ltd. * * * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. External Subroutines .. EXTERNAL XERBLA * .. Intrinsic Functions .. INTRINSIC CONJG, MAX * .. Local Scalars .. LOGICAL CONJA, CONJB, NOTA, NOTB INTEGER I, INFO, J, L, NCOLA, NROWA, NROWB COMPLEX*16 TEMP * .. Parameters .. COMPLEX*16 ONE PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) COMPLEX*16 ZERO PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) * .. * .. Executable Statements .. * * Set NOTA and NOTB as true if A and B respectively are not * conjugated or transposed, set CONJA and CONJB as true if A and * B respectively are to be transposed but not conjugated and set * NROWA, NCOLA and NROWB as the number of rows and columns of A * and the number of rows of B respectively. * NOTA = LSAME( TRANSA, 'N' ) NOTB = LSAME( TRANSB, 'N' ) CONJA = LSAME( TRANSA, 'C' ) CONJB = LSAME( TRANSB, 'C' ) IF( NOTA )THEN NROWA = M NCOLA = K ELSE NROWA = K NCOLA = M END IF IF( NOTB )THEN NROWB = K ELSE NROWB = N END IF * * Test the input parameters. * INFO = 0 IF( ( .NOT.NOTA ).AND. $ ( .NOT.CONJA ).AND. $ ( .NOT.LSAME( TRANSA, 'T' ) ) )THEN INFO = 1 ELSE IF( ( .NOT.NOTB ).AND. $ ( .NOT.CONJB ).AND. $ ( .NOT.LSAME( TRANSB, 'T' ) ) )THEN INFO = 2 ELSE IF( M .LT.0 )THEN INFO = 3 ELSE IF( N .LT.0 )THEN INFO = 4 ELSE IF( K .LT.0 )THEN INFO = 5 ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN INFO = 8 ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN INFO = 10 ELSE IF( LDC.LT.MAX( 1, M ) )THEN INFO = 13 END IF IF( INFO.NE.0 )THEN CALL XERBLA( 'ZGEMM ', INFO ) RETURN END IF * * Quick return if possible. * IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR. $ ( ( ( ALPHA.EQ.ZERO ).OR.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) ) $ RETURN * * And when alpha.eq.zero. * IF( ALPHA.EQ.ZERO )THEN IF( BETA.EQ.ZERO )THEN DO 20, J = 1, N DO 10, I = 1, M C( I, J ) = ZERO 10 CONTINUE 20 CONTINUE ELSE DO 40, J = 1, N DO 30, I = 1, M C( I, J ) = BETA*C( I, J ) 30 CONTINUE 40 CONTINUE END IF RETURN END IF * * Start the operations. * IF( NOTB )THEN IF( NOTA )THEN * * Form C := alpha*A*B + beta*C. * DO 90, J = 1, N IF( BETA.EQ.ZERO )THEN DO 50, I = 1, M C( I, J ) = ZERO 50 CONTINUE ELSE IF( BETA.NE.ONE )THEN DO 60, I = 1, M C( I, J ) = BETA*C( I, J ) 60 CONTINUE END IF DO 80, L = 1, K IF( B( L, J ).NE.ZERO )THEN TEMP = ALPHA*B( L, J ) DO 70, I = 1, M C( I, J ) = C( I, J ) + TEMP*A( I, L ) 70 CONTINUE END IF 80 CONTINUE 90 CONTINUE ELSE IF( CONJA )THEN * * Form C := alpha*conjg( A' )*B + beta*C. * DO 120, J = 1, N DO 110, I = 1, M TEMP = ZERO DO 100, L = 1, K TEMP = TEMP + CONJG( A( L, I ) )*B( L, J ) 100 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 110 CONTINUE 120 CONTINUE ELSE * * Form C := alpha*A'*B + beta*C * DO 150, J = 1, N DO 140, I = 1, M TEMP = ZERO DO 130, L = 1, K TEMP = TEMP + A( L, I )*B( L, J ) 130 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 140 CONTINUE 150 CONTINUE END IF ELSE IF( NOTA )THEN IF( CONJB )THEN * * Form C := alpha*A*conjg( B' ) + beta*C. * DO 200, J = 1, N IF( BETA.EQ.ZERO )THEN DO 160, I = 1, M C( I, J ) = ZERO 160 CONTINUE ELSE IF( BETA.NE.ONE )THEN DO 170, I = 1, M C( I, J ) = BETA*C( I, J ) 170 CONTINUE END IF DO 190, L = 1, K IF( B( J, L ).NE.ZERO )THEN TEMP = ALPHA*CONJG( B( J, L ) ) DO 180, I = 1, M C( I, J ) = C( I, J ) + TEMP*A( I, L ) 180 CONTINUE END IF 190 CONTINUE 200 CONTINUE ELSE * * Form C := alpha*A*B' + beta*C * DO 250, J = 1, N IF( BETA.EQ.ZERO )THEN DO 210, I = 1, M C( I, J ) = ZERO 210 CONTINUE ELSE IF( BETA.NE.ONE )THEN DO 220, I = 1, M C( I, J ) = BETA*C( I, J ) 220 CONTINUE END IF DO 240, L = 1, K IF( B( J, L ).NE.ZERO )THEN TEMP = ALPHA*B( J, L ) DO 230, I = 1, M C( I, J ) = C( I, J ) + TEMP*A( I, L ) 230 CONTINUE END IF 240 CONTINUE 250 CONTINUE END IF ELSE IF( CONJA )THEN IF( CONJB )THEN * * Form C := alpha*conjg( A' )*conjg( B' ) + beta*C. * DO 280, J = 1, N DO 270, I = 1, M TEMP = ZERO DO 260, L = 1, K TEMP = TEMP + $ CONJG( A( L, I ) )*CONJG( B( J, L ) ) 260 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 270 CONTINUE 280 CONTINUE ELSE * * Form C := alpha*conjg( A' )*B' + beta*C * DO 310, J = 1, N DO 300, I = 1, M TEMP = ZERO DO 290, L = 1, K TEMP = TEMP + CONJG( A( L, I ) )*B( J, L ) 290 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 300 CONTINUE 310 CONTINUE END IF ELSE IF( CONJB )THEN * * Form C := alpha*A'*conjg( B' ) + beta*C * DO 340, J = 1, N DO 330, I = 1, M TEMP = ZERO DO 320, L = 1, K TEMP = TEMP + A( L, I )*CONJG( B( J, L ) ) 320 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 330 CONTINUE 340 CONTINUE ELSE * * Form C := alpha*A'*B' + beta*C * DO 370, J = 1, N DO 360, I = 1, M TEMP = ZERO DO 350, L = 1, K TEMP = TEMP + A( L, I )*B( J, L ) 350 CONTINUE IF( BETA.EQ.ZERO )THEN C( I, J ) = ALPHA*TEMP ELSE C( I, J ) = ALPHA*TEMP + BETA*C( I, J ) END IF 360 CONTINUE 370 CONTINUE END IF END IF * RETURN * * End of ZGEMM . * END ga-5-4/global/testing/sprsmatmult.F0000644000175000017500000005004412662210460015451 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif #define USE_PETSC 0 #define TEST_MULT 0 #if TEST_MULT c# define LMAX 972 #else c# define LMAX 94173031 c# define LMAX 9173031 # define LMAX 973031 c# define LMAX 97031 c# define LMAX 9031 #endif #define MAXVEC 50000000 #define bb_a(ib) bb_v(bb_i + (ib)) #define cc_a(ib) cc_v(cc_i + (ib)) program main implicit none #include "mafdecls.fh" #include "global.fh" #if USE_PETSC #include "finclude/petscvec.h" #include "finclude/petscmat.h" #include "finclude/petscsys.h" #endif integer heap, stack, fudge, ma_heap integer nmax, ndim, nprocs, me integer g_a_data, g_a_i, g_a_j, g_a_sbit, g_tmp, isize integer g_b, g_c, g_tmp2 integer i, j, k, one, icnt integer lo, hi, chunk, kp1, ld GA_ACCESS_INDEX_TYPE i8, idx, id_tmp integer g_chk(MAXVEC) double precision d_chk(MAXVEC) double precision t_beg, t_crt, t_mv, t_gat, t_elem, t_pack double precision t_shft, t_scnad #if TEST_MULT double precision ddata(MAXVEC),bb(LMAX),cc(LMAX),gc(LMAX) integer ii(LMAX+1),jj(MAXVEC),sbit(MAXVEC) double precision rdot #endif logical status integer idim, jdim, rmin, rmax, idum integer jmin, jmax, lsize parameter (heap=2000000, fudge=100, stack=2000000) integer i_chk(MAXVEC) double precision ran1 c c PETSc declarations c #if USE_PETSC PetscErrorCode p_ierr PetscReal bb_v(1),cc_v(1),zero,p_ij PetscOffset bb_i, cc_i Vec p_b, p_c PetscInt p_idim, p_nloc PetscReal, pointer :: val(:) PetscInt, pointer :: loc(:), iloc(:) PetscInt, pointer :: jloc(:) PetscInt p_i, p_j Mat p_m double precision t_petsc, t_assmbl, prdot double precision, pointer :: bbuf(:),cbuf(:) #endif c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() t_crt = 0.0d00 t_mv = 0.0d00 t_gat = 0.0d00 t_elem = 0.0d00 t_pack = 0.0d00 t_shft = 0.0d00 t_scnad = 0.0d00 #if USE_PETSC t_petsc = 0.0d00 t_assmbl = 0.0d00 call PetscInitialize(PETSC_NULL_CHARACTER,p_ierr) #endif me = ga_nodeid() nprocs = ga_nnodes() one = 1 c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap + fudge c call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then print * print *,'GA initialized ' print * #if TEST_MULT print * print *,'Comparing distributed multiply with serial multiply' print * #endif call flush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DBL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c c create a sparse LMAX x LMAX matrix and two vectors of length c LMAX. The matrix is stored in compressed row format. c One of the vectors is filled with random data and the other c is filled with zeros. c idim = LMAX jdim = LMAX if (me.eq.0) then print * print *, 'Nominal dimension of matrix: ',idim print * endif rmin = 5 rmax = 10 rmin = 3 rmax = 7 t_beg = ga_wtime() call create_rand_sprs_mat(idim,jdim,rmin,rmax, + g_a_data,g_a_i,g_a_j,g_a_sbit,isize) t_crt = ga_wtime() - t_beg if (me.eq.0) then print * print *, 'Number of non-zero elements in compressed matrix: ', + isize print * endif #if TEST_MULT if (me.eq.0) then call nga_get(g_a_data,one,isize,ddata,one) call nga_get(g_a_i,one,idim+1,ii,one) call nga_get(g_a_j,one,isize,jj,one) endif call ga_sync #endif g_tmp = ga_create_handle() call ga_set_data(g_tmp,one,isize,MT_DBL) status = ga_allocate(g_tmp) c g_tmp2 = ga_create_handle() call ga_set_data(g_tmp2,one,isize,MT_DBL) status = ga_allocate(g_tmp2) c g_b = ga_create_handle() call ga_set_data(g_b,one,idim,MT_DBL) status = ga_allocate(g_b) c c fill g_b with random values c call nga_distribution(g_b,me,lo,hi) call nga_access(g_b,lo,hi,idx,ld) ld = hi-lo do i8 = 0, ld dbl_mb(i8+idx) = ran1(idum) end do call nga_release(g_b,lo,hi) #if TEST_MULT call ga_sync if (me.eq.0) then call nga_get(g_b,one,idim,bb,one) endif call ga_sync #endif c g_c = ga_create_handle() call ga_set_data(g_c,one,idim,MT_DBL) status = ga_allocate(g_c) call ga_zero(g_c) c #if USE_PETSC c c Create corresponding PETSC vectors c p_idim = idim zero = 0.0d00 p_nloc = ld+1 call VecCreateMPI(PETSC_COMM_WORLD,p_nloc,PETSC_DECIDE,p_b,p_ierr) call VecDuplicate(p_b,p_c,p_ierr) c c Copy values from global array to PETSC vector c allocate(val(ld+1)) allocate(loc(ld+1)) call nga_access(g_b,lo,hi,idx,ld) ld = hi-lo do i8 = 0, ld i = i8+1 val(i) = dbl_mb(i8+idx) loc(i) = lo+i8-1 if (loc(i).lt.0.or.loc(i).ge.idim) then write(6,'(i4,a,i8,a,i12)') me,' loc(',i,'): ',loc(i) endif end do call nga_release(g_b,lo,hi) call VecSetValues(p_b,p_nloc,loc,val,INSERT_VALUES,p_ierr) t_beg = ga_wtime() call VecAssemblyBegin(p_b,p_ierr) call VecAssemblyEnd(p_b,p_ierr) t_assmbl = ga_wtime() - t_beg call VecSet(p_c,zero,p_ierr) c cdbg call VecGetArray(p_b,bb_v,bb_i,p_ierr) cdbg do i = 1, hi-lo+1 cdbg write(6,'(i4,a,i4,a,2f12.6)') me,' b(',i,'): ',val(i), cdbg + bb_a(i) cdbg end do deallocate(val) deallocate(loc) c c Create corresponding PETSC sparse matrix c call MatCreate(PETSC_COMM_WORLD,p_m,p_ierr) call MatSetSizes(p_m,PETSC_DECIDE,PETSC_DECIDE, + p_idim,p_idim,p_ierr) c call MatSetType(p_m,MATMPIAIJ,p_ierr) call MatSetType(p_m,MATAIJ,p_ierr) c call MatSetFromOptions(p_m,p_ierr) ld = hi-lo+1 allocate(iloc(ld+1)) call nga_get(g_a_i,lo,hi,iloc,ld) c write(6,'(i4,a,i12)') me,' ld: ',ld c do i = 1, ld c if (iloc(i).lt.1) then c write(6,'(i4,a,i6,a,i12)') me,' iloc(',i,'): ',iloc(i) c endif c end do jmin = iloc(1) if (hi.lt.idim) then call nga_get(g_a_i,hi+1,hi+1,jmax,one) jmax = jmax - 1 else jmax = isize endif iloc(ld+1) = jmax + 1 lsize = jmax - jmin + 1 c write(6,'(i4,a,i12)') me,' lsize: ',lsize allocate(jloc(lsize)) allocate(val(lsize)) call nga_get(g_a_j,jmin,jmax,jloc,one) c do i = 1, lsize c if (jloc(i).lt.1) then c write(6,'(i4,a,i6,a,i12)') me,' jloc(',i,'): ',jloc(i) c endif c end do call nga_get(g_a_data,jmin,jmax,val,one) #if 1 do i = 1, ld p_i = i+lo-2 if (p_i.lt.0.or.p_i.ge.idim) then write(6,'(i4,a,i8)') me,' p_i out of bounds: ',p_i endif do j = iloc(i), iloc(i+1) - 1 p_j = jloc(j-jmin+1) - 1 if (p_j.lt.0.or.p_j.ge.idim) then write(6,'(i4,a,i8)') me,' p_j out of bounds: ',p_j endif p_ij = val(j-jmin+1) cbjp write(6,'(i4,a,2i8,f12.6)') me,' m(i,j): ',p_i, p_j,p_ij call MatSetValues(p_m,one,p_i,one,p_j,p_ij,INSERT_VALUES, + p_ierr) end do end do t_beg = ga_wtime() call MatAssemblyBegin(p_m,MAT_FINAL_ASSEMBLY,p_ierr) call MatAssemblyEnd(p_m,MAT_FINAL_ASSEMBLY,p_ierr) t_assmbl = ga_wtime() - t_beg c call MatView(p_m,PETSC_VIEWER_DRAW_WORLD,p_ierr) #endif #endif c c Find out what section of j-index vector I own and use c this information to get a pointer to to the corresponding c parts of the j-index vector and g_tmp array. c t_beg = ga_wtime() call nga_distribution(g_a_j,me,lo,hi) call nga_access(g_a_j,lo,hi,idx,ld) call nga_access(g_tmp,lo,hi,id_tmp,ld) c c scatter elements of g_b into a temporary array that is the c same size as g_a_data. c ld = hi-lo+1 call nga_gather(g_b,dbl_mb(id_tmp),int_mb(idx),ld) call ga_sync call nga_release(g_a_j,lo,hi) call nga_release(g_tmp,lo,hi) t_gat = ga_wtime() - t_beg c t_beg = ga_wtime() call ga_elem_multiply(g_tmp,g_a_data,g_tmp2) t_elem = ga_wtime() - t_beg c if (me.eq.0) then c do i = 0, 1 c call nga_distribution(g_a_sbit,i,lo,hi) c call nga_get(g_a_sbit,lo,hi,i_chk,one) c write(6,'(25i5)') (i_chk(j),j=1,hi-lo+1) c end do c endif t_beg = ga_wtime() call ga_scan_add(g_tmp2,g_tmp,g_a_sbit,one,isize,0) t_scnad = ga_wtime() - t_beg c if (me.eq.0) then c do i = 0, 1 c call nga_distribution(g_tmp,i,lo,hi) c call nga_get(g_tmp,lo,hi,d_chk,one) c write(6,'(10f8.2)') (d_chk(j),j=1,hi-lo+1) c end do c endif #if TEST_MULT if (me.eq.0) then call nga_get(g_a_sbit,one,isize,sbit,one) icnt = 0 if (isize.gt.MAXVEC) call ga_error('MAXVEC exceeded in sbit', + isize) do i = 1, isize if (sbit(i).eq.1) then icnt = icnt + 1 endif end do endif #endif t_beg = ga_wtime() call shift_minus(g_a_sbit,isize) t_shft = ga_wtime() - t_beg c t_beg = ga_wtime() call ga_pack(g_tmp,g_c,g_a_sbit,one,isize,icnt) t_pack = ga_wtime() - t_beg c #if USE_PETSC t_beg = ga_wtime() call MatMult(p_m,p_b,p_c,p_ierr) t_petsc = ga_wtime() - t_beg call nga_distribution(g_c,me,lo,hi) allocate(cbuf(hi-lo+1)) call nga_get(g_c,lo,hi,cbuf,one) call VecGetArray(p_c,cc_v,cc_i,p_ierr) prdot = 0.0d00 do i = 1, hi-lo+1 cbjp write(6,'(i4,a,i4,a,2f12.6)') me,' c(',i,'): ',cbuf(i), cbjp + cc_a(i) prdot = prdot + (cc_a(i)-cbuf(i))**2 end do call ga_dgop(1,prdot,1,'+') if (me.eq.0) then write(6,'(a,e16.8)') + 'Difference between GA and PETSC results: ', + sqrt(prdot) endif #endif #if TEST_MULT if (me.eq.0) then call nga_get(g_c,one,idim,gc,one) do i = 1, idim cc(i) = 0.0d00 do j = ii(i), ii(i+1)-1 cbjp write(6,'(i4,a,2i8,f12.6)') me,' gm(i,j): ', cbjp + i-1,jj(j)-1,ddata(j) cc(i) = cc(i) + ddata(j)*bb(jj(j)) end do gc(i) = gc(i) - cc(i) end do rdot = 0.0d00 do i = 1, idim rdot = rdot + gc(i)**2 end do write(6,*) 'Difference between parallel and serial results: ', + rdot endif #endif c c Clean up arrays c status = ga_destroy(g_tmp) status = ga_destroy(g_tmp2) status = ga_destroy(g_b) status = ga_destroy(g_c) status = ga_destroy(g_a_data) status = ga_destroy(g_a_i) status = ga_destroy(g_a_j) status = ga_destroy(g_a_sbit) #if USE_PETSC call VecDestroy(p_b,p_ierr) call VecDestroy(p_c,p_ierr) call MatDestroy(p_m,p_ierr) #endif c t_mv = t_gat + t_scnad + t_elem + t_shft + t_pack call ga_dgop(1,t_crt,1,'+') call ga_dgop(2,t_gat,1,'+') call ga_dgop(3,t_scnad,1,'+') call ga_dgop(4,t_elem,1,'+') call ga_dgop(5,t_shft,1,'+') call ga_dgop(6,t_pack,1,'+') call ga_dgop(7,t_mv,1,'+') #if USE_PETSC call ga_dgop(8,t_petsc,1,'+') call ga_dgop(9,t_assmbl,1,'+') #endif c if (me.eq.0) then write(6,100) t_crt/dble(nprocs) write(6,200) t_gat/dble(nprocs) write(6,300) t_scnad/dble(nprocs) write(6,400) t_elem/dble(nprocs) write(6,500) t_shft/dble(nprocs) write(6,600) t_pack/dble(nprocs) write(6,700) t_mv/dble(nprocs) #if USE_PETSC write(6,800) t_petsc/dble(nprocs) write(6,900) t_assmbl/dble(nprocs) #endif 100 format('Time to create sparse matrix: ',f12.4) 200 format('Time to expand dense vector using gather: ',f12.4) 300 format('Time in segmented scan-add: ',f12.4) 400 format('Time for element-wise multiplication: ',f12.4) 500 format('Time to shift bit-mask vector: ',f12.4) 600 format('Time to pack result vector: ',f12.4) 700 format('Total time for sparse matrix-vector multiply: ',f12.4) #if USE_PETSC 800 format('Total time for PETSC matrix-vector multiply: ',f12.4) 900 format('Total time for PETSC assemble: ',f12.4) #endif endif c #if USE_PETSC call PetscFinalize(p_ierr) #endif call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c c create a random sparse matrix in compressed row form c subroutine create_rand_sprs_mat(idim,jdim,rmin,rmax, + g_data,g_i,g_j,g_mask,isize) c c idim: i-dimension of array c jdim: j-dimension of array c rmin, rmax: minimum and maximum number of row elements in array c g_data: global array of values c g_j: global array containing j indices c g_i: global array containing starting location of each row in g_j c g_mask: global array of 1s and 0s containing a 1 at the start of c every new row in g_data c isize: total size of compressed matrix c implicit none #include "mafdecls.fh" #include "global.fh" integer idim, jdim, rmin, rmax, g_data, g_i, g_j, g_tmp integer g_sbit, g_mask, isize integer nprocs, me, imin, imax, icnt, jcnt, jmin, jmax, ntot double precision rval(MAXVEC), x, dr integer jval(MAXVEC), inc(MAXVEC), ones(MAXVEC) integer jdx(MAXVEC), i, j, k, itmp, itot, one, lo, hi, ld integer idum logical status integer i_chk(1000000) double precision d_chk(1000000) double precision ran1 GA_ACCESS_INDEX_TYPE idx c me = ga_nodeid() nprocs = ga_nnodes() x = ran1(12345+me) dr = dble(rmax-rmin) one = 1 c c figure out min and max indices of rows that I am responsible for c imin = nint(dble(me)*(dble(idim)/dble(nprocs))) + 1 imax = nint(dble(me+1)*(dble(idim)/dble(nprocs))) if (me.eq.0) then write(6,*) write(6,*) 'Minimum number of entries per row: ', + rmin write(6,*) write(6,*) write(6,*) 'Maximum number of entries per row: ', + rmin+nint(dr) write(6,*) endif icnt = 0 do i = imin, imax jmax = rmin + nint(dr*ran1(idum)) c do j = 1, jmax c jdx(j) = int(dble(jdim)*ran1(idum))+1 c if (jdx(j).gt.jdim) jdx(j) = jdim c end do j = 0 do while (j.lt.jmax) j = j + 1 jdx(j) = int(dble(jdim)*ran1(idum))+1 if (jdx(j).gt.jdim) jdx(j) = jdim k = 0 do while(k.lt.j-1) k = k + 1 if (jdx(j).eq.jdx(k)) then k = j j = j - 1 endif end do end do c c sort j indices c do j = 1, jmax do k = j+1, jmax if (jdx(j).gt.jdx(k)) then itmp = jdx(j) jdx(j) = jdx(k) jdx(k) = itmp endif end do end do do j = 1, jmax if (jdx(j).lt.1.or.jdx(j).gt.jdim) then write(6,'(i4,a,2i8)') me,' invalid j: ',i,jdx(j) endif end do c c create array elements c inc(i-imin+1) = jmax do j = 1, jmax icnt = icnt + 1 rval(icnt) = ran1(idum) jval(icnt) = jdx(j) end do end do itot = icnt isize = 0 do i = 1, imax-imin+1 isize = isize + inc(i) end do if (isize.gt.MAXVEC) + call ga_error('ISIZE exceeds MAXVEC in local arrays ',isize) c c create global arrays to hold sparse matrix c call ga_igop(1,itot,1,'+') isize = itot c write(6,*) me,' (create_rand) isize: ',isize c g_data = ga_create_handle(); call ga_set_data(g_data,one,itot,MT_DBL) status = ga_allocate(g_data) c g_j = ga_create_handle(); call ga_set_data(g_j,one,itot,MT_INT) status = ga_allocate(g_j) c g_i = ga_create_handle(); call ga_set_data(g_i,one,idim+1,MT_INT) status = ga_allocate(g_i) status = ga_duplicate(g_i, g_tmp, 'temp array') c g_sbit = ga_create_handle(); call ga_set_data(g_sbit,one,idim+1,MT_INT) status = ga_allocate(g_sbit) c call ga_zero(g_sbit) if (me.eq.0) then call nga_put(g_sbit,one,one,one,one) endif call ga_sync c c create offset vector c lo = imin+1 hi = imax+1 call ga_zero(g_tmp) if (me.eq.0) then call nga_put(g_tmp,one,one,one,one) endif call nga_put(g_tmp,lo,hi,inc,one) call ga_sync c if (me.eq.0) then c do i = 0, nprocs-1 c call nga_distribution(g_tmp,i,lo,hi) c call nga_get(g_tmp,lo,hi,i_chk,one) c write(6,'(25i5)') (i_chk(j),j=1,hi-lo+1) c end do c endif itot = idim+1 call ga_scan_add(g_tmp,g_i,g_sbit,one,itot,0) call ga_sync c if (me.eq.0) then c do i = 0, nprocs-1 c call nga_distribution(g_i,i,lo,hi) c call nga_get(g_i,lo,hi,i_chk,one) c write(6,'(25i5)') (i_chk(j),j=1,hi-lo+1) c end do c endif status = ga_destroy(g_tmp) status = ga_destroy(g_sbit) c c create mask vector c g_mask = ga_create_handle(); call ga_set_data(g_mask,one,isize,MT_INT) status = ga_allocate(g_mask) call ga_zero(g_mask) c call nga_distribution(g_i,me,lo,hi) call nga_access(g_i,lo,hi,idx,ld) ntot = hi - lo + 1 if (ntot.gt.MAXVEC) + call ga_error('NTOT exceeds MAXVEC in bit vector ',ntot) c c decrease count by one on last processor because this c element doesn't exist c if (me.eq.nprocs-1) then ntot = ntot - 1 endif do i = 1, ntot ones(i) = 1 end do call nga_scatter(g_mask,ones,int_mb(idx),ntot) call ga_sync call nga_release(g_i,lo,hi) c if (me.eq.0) then c do i = 0, 1 c call nga_distribution(g_mask,i,lo,hi) c call nga_get(g_mask,lo,hi,i_chk,one) c write(6,'(25i5)') (i_chk(j),j=1,hi-lo+1) c end do c endif c c store values of j in g_j and data values in g_data c call nga_get(g_i,imin,imin,jmin,one) call nga_get(g_i,imax+1,imax+1,jmax,one) jmax = jmax - 1 call nga_put(g_j,jmin,jmax,jval,one) call nga_put(g_data,jmin,jmax,rval,one) call ga_sync return end c c shift all the elements in a linear global array one element to c the left. Wrap elements around end if necessary c subroutine shift_minus(g_a, isize) implicit none #include "mafdecls.fh" #include "global.fh" integer g_a, isize integer lo, hi, ld, me, itmp integer isav GA_ACCESS_INDEX_TYPE idx, ii me = ga_nodeid() call ga_sync call nga_distribution(g_a,me,lo,hi) call nga_access(g_a,lo,hi,idx,ld) ld = hi-lo isav = int_mb(idx) do ii = 1, ld int_mb(idx + ii - 1) = int_mb(idx + ii) end do if (lo.eq.1) then itmp = isize else itmp = lo-1 endif call nga_release(g_a,lo,hi) call ga_sync call nga_put(g_a,itmp,itmp,isav,ld) call ga_sync return end c c Wrapper for random number generator c double precision function ran1(idum) implicit none #include "testutil.fh" integer idum,iff data iff /1/ save iff if (iff.eq.1) then ran1 = drand(iabs(idum)) iff = 0 endif ran1 = drand(0) return end ga-5-4/global/testing/nga-periodic.m40000644000175000017500000000064412662210460015553 0ustar mbambadivert(-1) # what kind of data type to test? define(m4_test_int, `yes') define(m4_test_dbl, `yes') define(m4_test_dcpl, `yes') # test dimension from which to which? define(m4_dim_from, 1) define(m4_dim_to, 7) # periodic functions define(m4_test_NGA_PERIODIC_GET, `yes') define(m4_test_NGA_PERIODIC_PUT, `yes') define(m4_test_NGA_PERIODIC_ACC, `yes') divert include(`ngatest_src/ngatest.def') ga-5-4/global/testing/stride.F0000644000175000017500000002267012662210460014354 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c#include "tcgmsg.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM, nwidth, MAXPROC, nloop, nskip parameter (nmax = 174, DIM = 2, nwidth = 0, MAXPROC = 2000) parameter (nloop = 1, nskip = 2) integer ndim, nproc, pdims(7), type, g_a, maxval integer i, j, ichk, ii, jj, ival, dims(7), width(7) integer lo(7), hi(7), ld(7) integer chunk(7), dim_strided(7), lop(7), hip(7) integer a(nmax, nmax), skip(7) parameter (heap=500*500*4, fudge=100, stack=500*500) logical status integer one c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c print* call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap + fudge call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then write(6,'(a)') ' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then write(6,'(a,i8,a)') 'using ', nproc, ' process(es)' call ffflush(6) endif c c Test strided put, get, acc calls c ndim = DIM dims(1) = nmax dims(2) = nmax maxval = 1 do i = 1, ndim maxval = dims(i)*maxval end do maxval = maxval - 1 do j = 1, nmax do i = 1, nmax a(i,j) = 0 end do end do c do i = 1, ndim width(i) = nwidth skip(i) = nskip + (i-1) chunk(i) = 1 ld(i) = nmax end do type = MT_INT status = nga_create_ghosts(type, ndim, dims, width, + "test_array", chunk, g_a) if (status.and.me.eq.0) then write(6,'(a)') '*' write(6,'(a)') '* Global array creation was successful' write(6,'(a)') '*' elseif (.not.status) then write(6,'(a,i8)') 'Global array creation failure on ',me endif call ga_zero(g_a) c c initialize g_a c call ga_sync call nga_distribution(g_a, me, lo, hi) c write(6,'(i4,a,i8,a,i8,a,i8,a,i8)') me, ' (dist) lo(1): ',lo(1), c + ' hi(1): ',hi(1),' lo(2): ',lo(2),' hi(2): ',hi(2) c c fill local array a with unique values for each element c do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = (j + lo(2) - 2)*dims(1) + (i + lo(1) - 2) + 1 end do end do call nga_put(g_a, lo, hi, a, ld) call ga_sync c c reset all values in local array a to zero c do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = 0 end do end do do i = 1, ndim lo(i) = 1 hi(i) = dims(i) end do call random_range(lo,hi,lop,hip,ndim) c write(6,'(i4,a,i8,a,i8,a,i8,a,i8)') me, ' lop(1): ',lop(1), c + ' hip(1): ',hip(1),' lop(2): ',lop(2),' hip(2): ',hip(2) call nga_strided_get(g_a, lop, hip, skip, a, ld) c c check results c do i = 1, ndim dim_strided(i) = hip(i) - lop(i) dim_strided(i) = dim_strided(i) - mod(dim_strided(i),skip(i)) dim_strided(i) = dim_strided(i)/skip(i) + 1 end do ichk = 0 do j = 1, dim_strided(2) jj = (j-1)*skip(2) + lop(2) do i = 1, dim_strided(1) ii = (i-1)*skip(1) + lop(1) ival = (ii-1) + (jj-1)*dims(1) + 1 if (a(i,j).ne.ival.and.me.eq.0) then write(6,'(a,i4,a,i4,a,i8,a,i8,a,i8)') 'a(',ii,',',jj,'): ', + a(i,j),' ival: ',ival,' dims(1): ',dims(1) ichk = ichk + 1 endif end do end do if (ichk.eq.0.and.me.eq.0) then write(6,'(a)') '*' write(6,'(a)') '* nga_strided_get is 0K' write(6,'(a)') '*' endif c #if 1 call ga_sync call ga_zero(g_a) if (me.eq.1) then call nga_strided_put(g_a, lop, hip, skip, a, ld) one = 1 call nga_strided_acc(g_a, lop, hip, skip, a, ld, one) endif call ga_sync do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = 0 end do end do call nga_get(g_a, lop, hip, a, ld) do i = 1, ndim dim_strided(i) = hip(i) - lop(i) end do ichk = 0 do j = 1, dim_strided(2) jj = (j-1) + lop(2) do i = 1, dim_strided(1) ii = (i-1) + lop(1) ival = (ii-1) + (jj-1)*dims(1) + 1 ival = 2*ival if (mod(i-1,skip(1)).eq.0.and.mod(j-1,skip(2)).eq.0) then if (a(i,j).ne.ival.and.me.eq.0) then write(6,'(a,i4,a,i4,a,i8,a,i8,a,i8)') 'a2(',ii,',',jj, + '): ',a(i,j),' ival: ',ival,' dims(1): ',dims(1) ichk = ichk + 1 endif else if (a(i,j).ne.0.0d00) ichk = ichk + 1 endif end do end do if (ichk.eq.0.and.me.eq.0) then write(6,'(a)') '*' write(6,'(a)') '* nga_strided_put and nga_strided_acc is 0K' write(6,'(a)') '*' endif #endif c c print out values of a c c call ga_print(g_a) c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c subroutine aprint(a,nrow,ncol,ld,has_data) #include "global.fh" integer ld integer a(ld,*) integer i, j, k, nproc logical has_data(0:1999) nproc = ga_nnodes() do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then write(6,*) '*' write(6,*) '* Data on processor ',k-1 write(6,*) '*' do i = 1, min(nrow,12) write (6,102) (a(i,j), j = 1, min(ncol,12)) 102 format(14i5) end do endif call ffflush(6) enddo c return end c subroutine atest(a,nrow,ncol,ld,b,ld2,has_data) #include "global.fh" integer ld integer a(ld,*), b(ld2,*) integer i, j, k, nproc logical has_data(0:1999), check_data nproc = ga_nnodes() check_data = .true. do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then do i = 1, nrow do j = 1, ncol if (a(i,j).ne.b(i,j)) check_data = .false. end do end do if (check_data) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is the same on' write(6,*) '* processor ',k-1 write(6,*) '*' else write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is NOT the same on' write(6,*) '* processor ',k-1 write(6,*) '*' endif endif call ffflush(6) enddo c return end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(7),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end c c create a random patch c subroutine random_range(lo,hi,lop,hip,ndim) implicit none #include "testutil.fh" integer lo(1),hi(1),lop(1),hip(1),ndim integer i, range, swap, val,iran iran(range) = int(drand(0)*dble(range)) + 1 do i = 1, ndim range = hi(i)-lo(i)+1 val = iran(range) lop(i) = lo(i) + val val = iran(range) hip(i) = hi(i) - val if(hip(i) .lt. lop(i))then swap =hip(i) hip(i)=lop(i) lop(i)=swap endif hip(i)=MIN(hip(i),hi(i)) lop(i)=MAX(lop(i),lo(i)) enddo end ga-5-4/global/testing/ngatest_src/0000755000175000017500000000000012662210457015266 5ustar mbambaga-5-4/global/testing/ngatest_src/ndim_NGA_COPY_PATCH.src0000644000175000017500000001777712662210457021207 0ustar mbamba subroutine m4_func_NGA_COPY_PATCH(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer dims(ndim) integer g_a, g_b integer chunk(ndim) integer i, total integer elems, count_elems integer loop integer lop(ndim), hip(ndim), hipl(ndim) integer alo(ndim), ahi(ndim) integer blo(ndim), bhi(ndim) integer tlo(ndim), thi(ndim) c for different array dimensions ifelse(m4_ndim,1,`',` m4_data_type d(substr(m4_array, 1, eval((m4_ndim-1)*2-1))) integer dndim parameter (dndim = m4_ndim-1) integer ddims(dndim),dlo(dndim),dhi(dndim),dtotal ') c integer nproc, me logical status integer repeat c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c c test the same distribution and different distribution seperately do repeat=1,2 if(repeat.eq.1) then status = ga_duplicate(g_a, g_b, 'a_duplicated') if(.not.ga_compare_distr(g_a, g_b)) $ call ga_error("g_b distribution different",0) c else do i = 1,ndim if(mod(i,2).eq.0) chunk(i) = n enddo if (.not. nga_create(m4_MT, ndim, dims, 'b', chunk, g_b)) $ call ga_error(' ga_create failed ',1) endif c call ga_sync() c c---------------------------NGA_COPY_PATCH ------------------------- c if(repeat.eq.1) then m4_print_info(nga_copy_patch) if(me.eq.0) print *, 'Testing with the same distributions' else if(me.eq.0) print *, 'Testing with different distributions' endif c c initialize GA call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) c call ga_sync() do i = 1,ndim lop(i) = 1 hipl(i) = n-1 hip(i) = n enddo c c--- do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(i) + 1 bhi(i) = ahi(i) + 1 enddo if(me.eq.0)then call copy_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,': copy [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ '-->', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c c keep a copy of the origian array call nga_get(g_a,alo,ahi, $ a(substr(m4_alo_all, 1, eval(m4_ndim*7-1))),dims) c call nga_copy_patch('n', g_a, alo, ahi, g_b, blo, bhi) c call nga_get(g_b,blo,bhi, $ b(substr(m4_blo_all, 1, eval(m4_ndim*7-1))),dims) c call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,alo,ahi,ndim,dims,total,b,blo,bhi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, ' standard copy patch: OK' print *, ' ' call ffflush(6) endif c--- do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(ndim-i+1) + 1 bhi(i) = ahi(ndim-i+1) + 1 enddo if(me.eq.0)then call copy_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,': copy [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ '-->', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c call nga_copy_patch('n', g_a, alo, ahi, g_b, blo, bhi) c call nga_get(g_b,blo,bhi, $ b(substr(m4_blo_all, 1, eval(m4_ndim*7-1))),dims) c call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,alo,ahi,ndim,dims,total,b,blo,bhi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, ' reshaping without transpose: OK' print *, ' ' call ffflush(6) endif c--- c prepare array a, make it transposed call m4_util_transpose(m4_test_type)(a,b,total,ndim,dims) c do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(ndim-i+1) + 1 bhi(i) = ahi(ndim-i+1) + 1 enddo if(me.eq.0)then call copy_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,': copy [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ '-->', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c call nga_copy_patch('t', g_a, alo, ahi, g_b, blo, bhi) c call nga_get(g_b,blo,bhi, $ b(substr(m4_blo_all, 1, eval(m4_ndim*7-1))),dims) c c adjust index of array a do i=1,ndim tlo(i) = alo(ndim-i+1) thi(i) = ahi(ndim-i+1) enddo call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,tlo,thi,ndim,dims,total,b,blo,bhi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, ' reshaping transposed: OK' print *, ' ' call ffflush(6) endif c--------------------------- c status = ga_destroy(g_b) enddo c c----------------------------------------------------------------- changequote({,}) ifelse(m4_ndim,1,{},{ c testing copy on differet dimensions dtotal = 1 do i = 1,dndim ddims(i) = n dtotal = dtotal * ddims(i) enddo c if (.not. nga_create(m4_MT, dndim, ddims, 'd', chunk, g_b)) $ call ga_error(' ga_create failed ',1) c if(me.eq.0) $ print *, 'Testing copy patch on different dimensions' c call ga_sync() c c initialize g_b call m4_util_init_array(m4_test_type)(d,dtotal) call nga_distribution(g_b, me, dlo, dhi) elems = count_elems(dlo, dhi, dndim) if(elems.gt.0) call nga_put(g_b,dlo,dhi, $ d(substr(m4_dlo_all, 1, eval((m4_ndim-1)*7-1))),ddims) c c c calculate the maximum range of g_a that can fit into g_b do i = 1,ndim lop(i) = 1 hip(i) = n enddo hip(dndim) = 1 c call ga_sync() c do loop=1, 10 call random_range(lop,hip,alo,ahi,ndim) c do i=1, dndim dlo(i) = alo(dndim-i+1) dhi(i) = ahi(dndim-i+1) enddo dlo(1) = alo(ndim) dhi(1) = ahi(ndim) c if(me.eq.0) then call copy_range(loop,alo,ahi,ndim,dlo,dhi,dndim) c$$$ print *, loop,': copy [',(alo(i),':',ahi(i),i=1,ndim), c$$$ $ ']','-->','[',(dlo(i),':',dhi(i), i=1,dndim),']' endif c call nga_copy_patch('n', g_a, alo, ahi, g_b, dlo, dhi) c call nga_get(g_b,dlo,dhi, $ d(substr(m4_dlo_all, 1, eval((m4_ndim-1)*7-1))),ddims) call nga_get(g_a,alo,ahi, $ a(substr(m4_alo_all, 1, eval(m4_ndim*7-1))),dims) c call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,alo,ahi,ndim,dims,total,d,dlo,dhi,dndim,ddims) enddo c call ga_sync() if(me.eq.0)then print *, ' copy patches on different dimensions: OK' print *, ' ' call ffflush(6) endif c status = ga_destroy(g_b) }) changequote(`,') c--- status = ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_SCATTER.src0000644000175000017500000000510612662210457020602 0ustar mbamba subroutine m4_func_NGA_SCATTER(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i, j, total, loop m4_data_type v(m) integer d(ndim, m) double precision drand integer unique,unique_index integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------------- NGA_SCATTER ---------------------------- m4_print_info(nga_scatter) c do loop = 1, MAXLOOP call ga_sync() c initialize the index array and the array containing values do i = 1, m c generate indices unique_index = 0 do while(unique_index.eq.0) do j=1,ndim d(j,i) = int(drand(0)*real(n)) + 1 enddo c unique_index = unique(d,ndim,m,i) enddo c v(i) = m4_rand a(substr(m4_ind_all, 1, eval(m4_ndim*7-1)))=v(i) enddo c c scatter the v to the global array call nga_scatter(g_a, v, d, m) call ga_sync() c c collect each elements and compare do i = 1, m do j=1, ndim lo(j) = d(j,i) enddo call nga_get(g_a,lo,lo, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c c compare the results if(a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))) .ne. $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1)))) then call ga_error('bye', 0) endif enddo enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_SCATTER_ACC.src0000644000175000017500000000713612662210457021255 0ustar mbamba subroutine m4_func_NGA_SCATTER_ACC(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i, j, total, loop, idx m4_data_type v(m) integer d(ndim, m) double precision drand m4_data_type alpha integer unique,unique_index integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c-------------------------- NGA_SCATTER_ACC ----------------------- m4_print_info(nga_scatter_acc) c alpha=m4_rand(me*2+1) c c do loop = 1, MAXLOOP call ga_sync() c initialize the index array and the array containing values do i = 1, m c generate indices unique_index = 0 do while(unique_index.eq.0) c generate random number idx = int(drand(0)*(real(total/nproc))) $ +me*total/nproc if(idx .eq. 0) idx = idx+1 c c convert to ndim call conv_1ton(ndim,dims,idx,lo) c do j=1,ndim d(j,i) = lo(j) enddo c unique_index = unique(d,ndim,m,i) enddo c v(i) = m4_rand a(substr(m4_ind_all, 1, eval(m4_ndim*7-1)))=v(i) enddo c c the result should be do i = 1, m do j=1, ndim lo(j) = d(j,i) enddo call nga_get(g_a,lo,lo, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) a(substr(m4_ind_all, 1, eval(m4_ndim*7-1)))= $ a(substr(m4_ind_all, 1, eval(m4_ndim*7-1))) $ *alpha $ +b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))) enddo c call ga_sync() c c scatter the v to the global array call nga_scatter_acc(g_a, v, d, m, alpha) call ga_sync() c c collect each elements and compare do i = 1, m do j=1, ndim lo(j) = d(j,i) enddo call nga_get(g_a,lo,lo, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c c compare the results if(abs(a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))) - $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1)))) $ .gt. 1d-5) then print *,'a=', $ a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))), $ 'b=', $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))), $ 'i=',i,'alpha=',alpha,'v=',v(i) call ga_error('bye', 0) endif enddo enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_PERIODIC_PUT.src0000644000175000017500000000475212662210457021431 0ustar mbamba subroutine m4_func_NGA_PERIODIC_PUT(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n integer ndim parameter (n = m4_n) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),lop(ndim),hip(ndim) integer blo(ndim),bhi(ndim) integer dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i,total,loop integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------ NGA_PERIODIC_PUT ---------------------- m4_print_info(nga_periodic_put) c total = 1 do i = 1,ndim lo(i) = 1 hi(i) = n total = total*dims(i) enddo c call m4_util_init_array(m4_test_type)(a,total) c c initialize array a call ga_zero(g_a) call ga_sync() c do loop = 1, MAXLOOP if(mod(loop,nproc).eq.me) then call random_range_outbound(lo,hi,lop,hip,ndim) if(Mod(loop,10).eq.0) then call print_range(loop,lop,hip,ndim) endif call ga_init_fence() call nga_periodic_put(g_a,lop,hip, $ a(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld) call ga_fence() call ga_init_fence() call nga_periodic_get(g_a,lop,hip, $ b(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld) call ga_fence() c c check the result do i=1,ndim blo(i) = 1 bhi(i) = hip(i)-lop(i)+1 enddo call m4_util_compare_patches(m4_test_type)(0d0, $ total,a,blo,bhi,ndim,dims,total,b,blo,bhi,ndim,dims) endif call ga_sync() enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_GA_FILL.src0000644000175000017500000000361412662210457020107 0ustar mbamba subroutine m4_func_GA_FILL(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim), dims(ndim), ld(ndim) integer g_a integer chunk(ndim) integer i,total integer elems, count_elems m4_data_type val integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c-------------------------------GA_FILL ---------------------------- m4_print_info(ga_fill) c call nga_distribution(g_a, me, lo,hi) elems = count_elems(lo,hi,ndim) c val = m4_conv(456) call ga_fill(g_a,val) call ga_sync() c call m4_util_fill_array(m4_test_type)(a,total,val) c if(elems.gt.0) then call nga_get(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,lo,hi,ndim,dims,total,b,lo,hi,ndim,dims) endif call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_ACC.src0000644000175000017500000000572412662210457020071 0ustar mbamba subroutine m4_func_NGA_ACC(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type c(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),dims(ndim),ld(ndim) integer g_a integer lop(ndim),hip(ndim) integer chunk(ndim) integer i, total, loop double precision drand m4_data_type val, alpha integer nproc, me, proc logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------------- NGA_ACC ---------------------------- m4_print_info(nga_acc) c call ga_sync() val = m4_rand(me*2+1) call ga_fill(g_a,val) call ga_sync() proc = nproc-1 -me ! access other process memory call nga_distribution(g_a,proc,lop,hip) c call m4_util_init_array(m4_test_type)(b,total) c do loop = 1, MAXLOOP call random_range(lop,hip,lo,hi,ndim) if(Mod(loop,10).eq.0)then if(Mod((loop/10),ndim).eq.me) then call print_range(loop,lo,hi,ndim) endif endif call ga_sync() c keep a copy of the original patch if(hi(1).ne.-1) call nga_get(g_a,lo,hi, $ a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c generate the alpha alpha = val c call ga_sync() c keep a copy of the original patch if(hi(1).ne.-1) call nga_acc(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld,alpha) c call ga_sync() c if(hi(1).ne.-1) then c scale the local copy of array call m4_util_scale_patch(m4_test_type)(total, $ m4_conv(1),a,lo,hi,ndim,dims, $ alpha,b,lo,hi,ndim,dims) c c get the patch from the global array call nga_get(g_a,lo,hi, $ c(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c call m4_util_compare_patches(m4_test_type)(1d-2,total, $ a,lo,hi,ndim,dims,total,c,lo,hi,ndim,dims) endif enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_util.src0000644000175000017500000001066712662210457017775 0ustar mbambac fill array with random numbers subroutine m4_util_fill_array(m4_test_type)(a,n,val) implicit none integer n m4_data_type a(n),val integer i do i= 1, n a(i) = val enddo end c initialize the array with random numbers subroutine m4_util_init_array(m4_test_type)(a,n) implicit none integer n m4_data_type a(n) double precision drand integer i do i= 1, n a(i) = m4_rand(i) enddo end c if the elements do match, stop the program subroutine m4_util_compare_patches(m4_test_type)(eps, $ total1,array1,lo1,hi1,ndim1,dims1, $ total2,array2,lo2,hi2,ndim2,dims2) implicit none double precision eps integer ndim1,ndim2,total1,total2 m4_data_type array1(total1),array2(total2) integer lo1(ndim1),hi1(ndim1),lo2(ndim2),hi2(ndim2) integer dims1(ndim1),dims2(ndim2) integer next_index integer index1,index2 double precision diff,maxval c c initialize index1 and index2, searching from zeros index1 = 0 index2 = 0 c compare corresponding elements in each array index1 = next_index(index1,total1,ndim1,lo1,hi1,dims1) index2 = next_index(index2,total2,ndim2,lo2,hi2,dims2) do while((index1.ne.0).and.(index2.ne.0)) diff = abs(array1(index1) - array2(index2)) maxval = max(abs(array1(index1)), abs(array2(index2))) if((maxval.eq.0).or.(maxval.lt.eps)) maxval = 1 if(eps .lt. abs(diff)/maxval) then print *, 'Error: Comparison failed!' print *, array1(index1), array2(index2) call ga_error('bye',0) endif index1 = next_index(index1,total1,ndim1,lo1,hi1,dims1) index2 = next_index(index2,total2,ndim2,lo2,hi2,dims2) enddo c c at this point both index1 and index2 should be 0 if((index1.ne.0).or.(index2.ne.0)) then print *, 'Error: # of elems dont match' call ga_error('bye',0) endif c end c do patch = patch + buf * alpha subroutine m4_util_scale_patch(m4_test_type)(total, $ alpha,arr1,lo1,hi1,ndim1,dims1,beta,arr2,lo2,hi2,ndim2,dims2) implicit none integer ndim1,ndim2,total integer lo1(ndim1),hi1(ndim1),lo2(ndim2),hi2(ndim2) integer dims1(ndim1),dims2(ndim2) m4_data_type arr1(total),arr2(total) m4_data_type alpha, beta integer next_index integer ind1, ind2 c ind1 = 0 ind2 = 0 ind1 = next_index(ind1,total,ndim1,lo1,hi1,dims1) ind2 = next_index(ind2,total,ndim2,lo2,hi2,dims2) c do while(ind1.ne.0) arr1(ind1) = arr1(ind1)*alpha + arr2(ind2)*beta ind1 = next_index(ind1,total,ndim1,lo1,hi1,dims1) ind2 = next_index(ind2,total,ndim2,lo2,hi2,dims2) enddo c end c transpose an array subroutine m4_util_transpose(m4_test_type)(a1,a2,total,ndim,dims) implicit none integer ndim,total integer dims(ndim) m4_data_type a1(total),a2(total) integer i, j integer idx integer bv(m4_max_dim), bunit(m4_max_dim) c bv(1)=0 bunit(1)=1 do i=2, ndim bv(i) = 0 bunit(i) = bunit(i-1) * dims(i-1) enddo c do i=1, total idx = 1 do j=1, ndim idx = idx + bv(j) * bunit(ndim-j+1) if(mod(i,bunit(j)).eq.0) bv(j) = bv(j) + 1 if(bv(j).ge.dims(j)) bv(j) = 0 enddo c print *, 'i = ',i, 'idx = ',idx a2(idx) = a1(i) enddo c do i=1, total a1(i) = a2(i) enddo c end c do patch = patch + buf * alpha m4_data_type function m4_util_dot_patch(m4_test_type)( $ total,arr1,lo1,hi1,ndim1,dims1,arr2,lo2,hi2,ndim2,dims2) implicit none integer ndim1,ndim2,total integer lo1(ndim1),hi1(ndim1),lo2(ndim2),hi2(ndim2) integer dims1(ndim1),dims2(ndim2) m4_data_type arr1(total),arr2(total) integer next_index integer ind1, ind2 m4_data_type res c ind1 = 0 ind2 = 0 res = 0 ind1 = next_index(ind1,total,ndim1,lo1,hi1,dims1) ind2 = next_index(ind2,total,ndim2,lo2,hi2,dims2) c do while(ind1.ne.0) res = res + arr1(ind1)*arr2(ind2) ind1 = next_index(ind1,total,ndim1,lo1,hi1,dims1) ind2 = next_index(ind2,total,ndim2,lo2,hi2,dims2) enddo c m4_util_dot_patch(m4_test_type) = res c end ga-5-4/global/testing/ngatest_src/ndim_NGA_SCALE_PATCH.src0000644000175000017500000000532112662210457021242 0ustar mbamba subroutine m4_func_NGA_SCALE_PATCH(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer dims(ndim) integer g_a integer chunk(ndim) integer i, total integer elems, count_elems integer loop integer lop(ndim), hip(ndim) integer lo(ndim), hi(ndim) double precision drand m4_data_type val integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c--------------------------- NGA_SCALE_PATCH ------------------------- m4_print_info(nga_scale_patch) c c initialize GA call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) c call ga_sync() do i = 1,ndim lop(i) = 1 hip(i) = n enddo c do loop=1, 10 call random_range(lop,hip,lo,hi,ndim) if(me.eq.0) $ call print_range(loop,lo,hi,ndim) c$$$ $ print *, loop,': scale [',(lo(i),':',hi(i), i=1,ndim),']' c the random number to scale val = m4_rand(1) c c keep a copy of the origian array call nga_get(g_a,lo,hi, $ a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),dims) c call nga_scale_patch(g_a,lo,hi,val) c call nga_get(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),dims) c c check the result call m4_util_scale_patch(m4_test_type)(total, $ val,a,lo,hi,ndim,dims, $ m4_conv(0),b,lo,hi,ndim,dims) call m4_util_compare_patches(m4_test_type)(1d-10,total, $ a,lo,hi,ndim,dims,total,b,lo,hi,ndim,dims) c enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ngatest.def0000644000175000017500000002566512662210457017431 0ustar mbambadivert(-1) # ------------------------------------------------------------ # up to 8 dimensions # testing from "m4_from" to "m4_to" dimensions define(m4_from, m4_dim_from) define(m4_to, m4_dim_to) # data type can be integer, double precision, or double complex define(m4_data_type_int, `integer') define(m4_data_type_dbl, `double precision') define(m4_data_type_dcpl, `double complex') define(m4_test_type_int, `int') define(m4_test_type_dbl, `dbl') define(m4_test_type_dcpl, `dcpl') define(m4_max_dim, 8) #-------------------------------------------------------------- # n values for each dimension define(m4_n_1dim, 20000) define(m4_n_2dim, 140) define(m4_n_3dim, 27) define(m4_n_4dim, 11) define(m4_n_5dim, 7) define(m4_n_6dim, 5) define(m4_n_7dim, 4) define(m4_n_8dim, 3) # define(m4_n_1dim, 2000) # define(m4_n_2dim, 100) # define(m4_n_3dim, 20) # define(m4_n_4dim, 10) # define(m4_n_5dim, 5) # define(m4_n_6dim, 4) # define(m4_n_7dim, 3) # define(m4_n_8dim, 2) # to access n value define(m4_n_val, m4_n_$1dim) # common definitions define(m4_array, (n,n,n,n,n,n,n,n,n)) define(m4_lo_all, (lo(1),lo(2),lo(3),lo(4),lo(5),lo(6),lo(7),lo(8))) define(m4_lop_all, (lop(1),lop(2),lop(3),lop(4),lop(5),lop(6),lop(7),lop(8))) define(m4_ind_all, (d(1,i),d(2,i),d(3,i),d(4,i),d(5,i),d(6,i),d(7,i),d(8,i))) define(m4_alo_all, (alo(1),alo(2),alo(3),alo(4),alo(5),alo(6),alo(7),alo(8))) define(m4_ahi_all, (ahi(1),ahi(2),ahi(3),ahi(4),ahi(5),ahi(6),ahi(7),ahi(8))) define(m4_ald_all, (ald(1),ald(2),ald(3),ald(4),ald(5),ald(6),ald(7),ald(8))) define(m4_blo_all, (blo(1),blo(2),blo(3),blo(4),blo(5),blo(6),blo(7),blo(8))) define(m4_bhi_all, (bhi(1),bhi(2),bhi(3),bhi(4),bhi(5),bhi(6),bhi(7),bhi(8))) define(m4_bld_all, (bld(1),bld(2),bld(3),bld(4),bld(5),bld(6),bld(7),bld(8))) define(m4_clo_all, (clo(1),clo(2),clo(3),clo(4),clo(5),clo(6),clo(7),clo(8))) define(m4_chi_all, (chi(1),chi(2),chi(3),chi(4),chi(5),chi(6),chi(7),chi(8))) define(m4_cld_all, (cld(1),cld(2),cld(3),cld(4),cld(5),cld(6),cld(7),cld(8))) define(m4_dlo_all, (dlo(1),dlo(2),dlo(3),dlo(4),dlo(5),dlo(6),dlo(7),dlo(8))) define(m4_func_GA_FILL, testit_GA_FILL_$1$2()) define(m4_func_NGA_PUT, testit_NGA_PUT_$1$2()) define(m4_func_NGA_GET, testit_NGA_GET_$1$2()) define(m4_func_NGA_ACC, testit_NGA_ACC_$1$2()) define(m4_func_NGA_SCATTER, testit_NGA_SCATTER_$1$2()) define(m4_func_NGA_SCATTER_ACC, testit_NGA_SCATTER_ACC_$1$2()) define(m4_func_NGA_GATHER, testit_NGA_GATHER_$1$2()) define(m4_func_NGA_PERIODIC_PUT, testit_NGA_PERIODIC_PUT_$1$2()) define(m4_func_NGA_PERIODIC_GET, testit_NGA_PERIODIC_GET_$1$2()) define(m4_func_NGA_PERIODIC_ACC, testit_NGA_PERIODIC_ACC_$1$2()) define(m4_func_NGA_FILL_PATCH, testit_NGA_FILL_PATCH_$1$2()) define(m4_func_NGA_COPY_PATCH, testit_NGA_COPY_PATCH_$1$2()) define(m4_func_NGA_SCALE_PATCH, testit_NGA_SCALE_PATCH_$1$2()) define(m4_func_NGA_ADD_PATCH, testit_NGA_ADD_PATCH_$1$2()) define(m4_func_NGA_DOT_PATCH, testit_NGA_DOT_PATCH_$1$2()) define(m4_util_fill_array, fill_array_$1) define(m4_util_init_array, init_array_$1) define(m4_util_compare_patches, compare_patches_$1) define(m4_util_scale_patch, scale_patch_$1) define(m4_util_dot_patch, dot_patch_$1) define(m4_util_transpose, transpose_$1) define(m4_nga_dot_patch, `nga_$1_patch') changequote([,]) define(m4_print_info, [if(me.eq.0)then print *, ' ' print *, 'TESTING $1' print *, ' - Data Type: m4_data_type' print *, ' - Dimension: m4_ndim' print *, ' - Running on',nproc,'processes (processors)' call ffflush(6) endif]) changequote(`,') # utility # forloop(i, from, to, stmt) define(`forloop', `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')') define(`_forloop',`$4`'ifelse($1, `$3', , `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')') #--------------------------------------------------------------------- # insert the main program divert include(`ngatest_src/ndim_main.src') c----------------- divert(-1) # insert the testing subroutines divert ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_MT') undefine(`m4_conv') undefine(`m4_rand') define(m4_data_type, m4_data_type_int) define(m4_test_type, m4_test_type_int) define(m4_MT, `MT_INT') define(m4_conv, `int($1)') define(m4_rand, `int(drand(0) * $1 * 2)') define(m4_dot, `idot') divert forloop(`m4_i', m4_from, m4_to, `divert(-1) undefine(`m4_n') undefine(`m4_ndim') define(m4_n, m4_n_val(m4_i)) define(m4_ndim, m4_i) divert ifelse(m4_test_GA_FILL, `yes', ` include(`ngatest_src/ndim_GA_FILL.src')') ifelse(m4_test_NGA_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PUT.src')') ifelse(m4_test_NGA_GET, `yes', ` include(`ngatest_src/ndim_NGA_GET.src')') ifelse(m4_test_NGA_ACC, `yes', ` include(`ngatest_src/ndim_NGA_ACC.src')') ifelse(m4_test_NGA_SCATTER, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER.src')') ifelse(m4_test_NGA_SCATTER_ACC, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER_ACC.src')') ifelse(m4_test_NGA_GATHER, `yes', ` include(`ngatest_src/ndim_NGA_GATHER.src')') ifelse(m4_test_NGA_PERIODIC_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_PUT.src')') ifelse(m4_test_NGA_PERIODIC_GET, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_GET.src')') ifelse(m4_test_NGA_PERIODIC_ACC, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_ACC.src')') ifelse(m4_test_NGA_FILL_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_FILL_PATCH.src')') ifelse(m4_test_NGA_COPY_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_COPY_PATCH.src')') ifelse(m4_test_NGA_SCALE_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_SCALE_PATCH.src')') ifelse(m4_test_NGA_ADD_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_ADD_PATCH.src')') ifelse(m4_test_NGA_DOT_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_DOT_PATCH.src')')')') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_MT') undefine(`m4_conv') undefine(`m4_rand') undefine(`m4_dot') define(m4_data_type, m4_data_type_dbl) define(m4_test_type, m4_test_type_dbl) define(m4_MT, `MT_DBL') define(m4_conv, `dble($1)') define(m4_rand, `drand(0) * $1 * 2') define(m4_dot, `ddot') divert forloop(`m4_i', m4_from, m4_to, `divert(-1) undefine(`m4_n') undefine(`m4_ndim') define(m4_n, m4_n_val(m4_i)) define(m4_ndim, m4_i) divert ifelse(m4_test_GA_FILL, `yes', ` include(`ngatest_src/ndim_GA_FILL.src')') ifelse(m4_test_NGA_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PUT.src')') ifelse(m4_test_NGA_GET, `yes', ` include(`ngatest_src/ndim_NGA_GET.src')') ifelse(m4_test_NGA_ACC, `yes', ` include(`ngatest_src/ndim_NGA_ACC.src')') ifelse(m4_test_NGA_SCATTER, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER.src')') ifelse(m4_test_NGA_SCATTER_ACC, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER_ACC.src')') ifelse(m4_test_NGA_GATHER, `yes', ` include(`ngatest_src/ndim_NGA_GATHER.src')') ifelse(m4_test_NGA_PERIODIC_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_PUT.src')') ifelse(m4_test_NGA_PERIODIC_GET, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_GET.src')') ifelse(m4_test_NGA_PERIODIC_ACC, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_ACC.src')') ifelse(m4_test_NGA_FILL_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_FILL_PATCH.src')') ifelse(m4_test_NGA_COPY_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_COPY_PATCH.src')') ifelse(m4_test_NGA_SCALE_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_SCALE_PATCH.src')') ifelse(m4_test_NGA_ADD_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_ADD_PATCH.src')') ifelse(m4_test_NGA_DOT_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_DOT_PATCH.src')')')') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_MT') undefine(`m4_conv') undefine(`m4_rand') undefine(`m4_dot') define(m4_data_type, m4_data_type_dcpl) define(m4_test_type, m4_test_type_dcpl) define(m4_MT, `MT_DCPL') define(m4_conv, `dcmplx(dble($1),dble(0))') define(m4_rand, `dcmplx(drand(0) * $1 * 2, $ -drand(0) * $1 * 2)') define(m4_dot, `zdot') divert forloop(`m4_i', m4_from, m4_to, `divert(-1) undefine(`m4_n') undefine(`m4_ndim') define(m4_n, m4_n_val(m4_i)) define(m4_ndim, m4_i) divert ifelse(m4_test_GA_FILL, `yes', ` include(`ngatest_src/ndim_GA_FILL.src')') ifelse(m4_test_NGA_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PUT.src')') ifelse(m4_test_NGA_GET, `yes', ` include(`ngatest_src/ndim_NGA_GET.src')') ifelse(m4_test_NGA_ACC, `yes', ` include(`ngatest_src/ndim_NGA_ACC.src')') ifelse(m4_test_NGA_SCATTER, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER.src')') ifelse(m4_test_NGA_SCATTER_ACC, `yes', ` include(`ngatest_src/ndim_NGA_SCATTER_ACC.src')') ifelse(m4_test_NGA_GATHER, `yes', ` include(`ngatest_src/ndim_NGA_GATHER.src')') ifelse(m4_test_NGA_PERIODIC_PUT, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_PUT.src')') ifelse(m4_test_NGA_PERIODIC_GET, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_GET.src')') ifelse(m4_test_NGA_PERIODIC_ACC, `yes', ` include(`ngatest_src/ndim_NGA_PERIODIC_ACC.src')') ifelse(m4_test_NGA_FILL_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_FILL_PATCH.src')') ifelse(m4_test_NGA_COPY_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_COPY_PATCH.src')') ifelse(m4_test_NGA_SCALE_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_SCALE_PATCH.src')') ifelse(m4_test_NGA_ADD_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_ADD_PATCH.src')') ifelse(m4_test_NGA_DOT_PATCH, `yes', ` include(`ngatest_src/ndim_NGA_DOT_PATCH.src')')')') c----------------------- c Utility functions divert(-1) # insert the utility program divert include(`ngatest_src/ndim_util_comm.src') ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_rand') define(m4_data_type, m4_data_type_int) define(m4_test_type, m4_test_type_int) define(m4_rand, `int(drand(0) * i * 2)') divert include(`ngatest_src/ndim_util.src')') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_rand') define(m4_data_type, m4_data_type_dbl) define(m4_test_type, m4_test_type_dbl) define(m4_rand, `drand(0) * i * 2') divert include(`ngatest_src/ndim_util.src')') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_data_type') undefine(`m4_test_type') undefine(`m4_rand') define(m4_data_type, m4_data_type_dcpl) define(m4_test_type, m4_test_type_dcpl) define(m4_rand, `dcmplx(drand(0) * i * 2, $ -drand(0) * i * 2)') divert include(`ngatest_src/ndim_util.src')') ga-5-4/global/testing/ngatest_src/ndim_NGA_ADD_PATCH.src0000644000175000017500000001705012662210457021005 0ustar mbamba subroutine m4_func_NGA_ADD_PATCH(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer dims(ndim) integer g_a, g_b,g_c integer chunk(ndim) integer i, total integer elems, count_elems integer loop double precision drand m4_data_type alpha, beta integer lop(ndim), hip(ndim), hipl(ndim) integer alo(ndim), ahi(ndim) integer blo(ndim), bhi(ndim) integer clo(ndim), chi(ndim) c for different array dimensions ifelse(m4_ndim,1,`',` m4_data_type d(substr(m4_array, 1, eval((m4_ndim-1)*2-1))) integer dndim parameter (dndim = m4_ndim-1) integer ddims(dndim),dlo(dndim),dhi(dndim),dtotal ') c integer nproc, me logical status integer repeat c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c c test the same distribution and different distribution seperately do repeat=1,2 if(repeat.eq.1) then status = ga_duplicate(g_a, g_b, 'a_duplicated') if(.not.ga_compare_distr(g_a, g_b)) $ call ga_error("g_b distribution different",0) c status = ga_duplicate(g_a, g_c, 'a_duplicated_again') if(.not.ga_compare_distr(g_a, g_c)) $ call ga_error("g_c distribution different",0) c else do i = 1,ndim if(mod(i,2).eq.0) chunk(i) = n enddo if (.not. nga_create(m4_MT, ndim, dims, 'b', chunk, g_b)) $ call ga_error(' ga_create failed ',1) do i = 1,ndim if(mod(i,2).eq.0) chunk(i) = 0 if(mod(i,2).eq.1) chunk(i) = n enddo if (.not. nga_create(m4_MT, ndim, dims, 'c', chunk, g_c)) $ call ga_error(' ga_create failed ',1) endif c call ga_sync() c c---------------------------NGA_ADD_PATCH ------------------------- c if(repeat.eq.1) then m4_print_info(nga_add_patch) if(me.eq.0) print *, 'Testing with the same distributions' else if(me.eq.0) print *, 'Testing with different distributions' endif c c initialize GA call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) call m4_util_init_array(m4_test_type)(b,total) call nga_distribution(g_b, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_b,lop,hip, $ b(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) c call ga_sync() do i = 1,ndim lop(i) = 1 hipl(i) = n-2 hip(i) = n enddo c c--- do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(i) + 1 bhi(i) = ahi(i) + 1 clo(i) = alo(i) + 2 chi(i) = ahi(i) + 2 enddo if(me.eq.0)then call add_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,': [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ '+', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c alpha = m4_rand(1) beta = m4_rand(1) c c keep copies of the origian arrays call nga_get(g_a,alo,ahi, $ a(substr(m4_alo_all, 1, eval(m4_ndim*7-1))),dims) call nga_get(g_b,blo,bhi, $ b(substr(m4_blo_all, 1, eval(m4_ndim*7-1))),dims) c the result should be (in a) call m4_util_scale_patch(m4_test_type)(total, $ alpha,a,alo,ahi,ndim,dims, $ beta,b,blo,bhi,ndim,dims) c call nga_add_patch(alpha, g_a, alo, ahi, beta, g_b, blo, bhi, $ g_c, clo,chi) c call nga_get(g_c,clo,chi, $ b(substr(m4_clo_all, 1, eval(m4_ndim*7-1))),dims) c call m4_util_compare_patches(m4_test_type)(1d-5,total, $ a,alo,ahi,ndim,dims,total,b,clo,chi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status = ga_destroy(g_b) enddo c----------------------------------------------------------------- changequote({,}) ifelse(m4_ndim,1,{},{ c testing copy on differet dimensions dtotal = 1 do i = 1,dndim ddims(i) = n dtotal = dtotal * ddims(i) enddo c if (.not. nga_create(m4_MT, dndim, ddims, 'd', chunk, g_b)) $ call ga_error(' ga_create failed ',1) c if(me.eq.0) $ print *, 'Testing adding patch on different dimensions' c call ga_sync() c c initialize g_b call m4_util_init_array(m4_test_type)(d,dtotal) call nga_distribution(g_b, me, dlo, dhi) elems = count_elems(dlo, dhi, dndim) if(elems.gt.0) call nga_put(g_b,dlo,dhi, $ d(substr(m4_dlo_all, 1, eval((m4_ndim-1)*7-1))),ddims) c c calculate the maximum range of g_a that can fit into g_b do i = 1,ndim lop(i) = 1 hip(i) = n enddo hip(dndim) = 1 c call ga_sync() c do loop=1, 10 call random_range(lop,hip,alo,ahi,ndim) c do i=1, dndim dlo(i) = alo(dndim-i+1) dhi(i) = ahi(dndim-i+1) enddo dlo(1) = alo(ndim) dhi(1) = ahi(ndim) c if(me.eq.0) then call add_range(loop,alo,ahi,ndim,dlo,dhi,dndim) c$$$ print *, loop,': [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ '+', '[',(dlo(i),':',dhi(i), i=1,dndim),']' endif c alpha = m4_rand(1) beta = m4_rand(1) c c keep copies of the origian arrays call nga_get(g_a,alo,ahi, $ a(substr(m4_alo_all, 1, eval(m4_ndim*7-1))),dims) call nga_get(g_b,dlo,dhi, $ d(substr(m4_dlo_all, 1, eval((m4_ndim-1)*7-1))),ddims) c c the result should be (in a) call m4_util_scale_patch(m4_test_type)(total, $ alpha,a,alo,ahi,ndim,dims, $ beta,d,dlo,dhi,dndim,ddims) c call nga_add_patch(alpha,g_a,alo,ahi,beta,g_b,dlo,dhi, $ g_c,alo,ahi) c call nga_get(g_c,alo,ahi, $ b(substr(m4_alo_all, 1, eval(m4_ndim*7-1))),dims) c call m4_util_compare_patches(m4_test_type)(1d-5,total, $ a,alo,ahi,ndim,dims,total,b,alo,ahi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, ' add patches on different dimensions: OK' print *, ' ' call ffflush(6) endif c status = ga_destroy(g_b) }) changequote(`,') c--- c status = ga_destroy(g_c) status = ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_main.src0000644000175000017500000002706012662210457017737 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif #define MAXLOOP 100 program test implicit none #include "mafdecls.fh" #include "global.fh" integer stack, heap c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Intitialize the GA package call ga_initialize() c if(ga_nodeid().eq.0)print *,ga_nnodes(),' nodes' c if(ga_uses_ma()) then stack = 200000 c stack = 100000 else stack = 60000 c stack = 20000 endif heap = stack if (.not. ma_init(MT_DBL, heap, stack)) $ call ga_error("ma init failed",heap+stack) c c c test GA_FILL ifelse(m4_test_GA_FILL, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_GA_FILL(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_GA_FILL(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_GA_FILL(m4_test_type, m4_i)') ')') c c test NGA_GET ifelse(m4_test_NGA_GET, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_GET(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_GET(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_GET(m4_test_type, m4_i)') ')') c c test NGA_PUT ifelse(m4_test_NGA_PUT, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_PUT(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_PUT(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_PUT(m4_test_type, m4_i)') ')') c c test NGA_ACC ifelse(m4_test_NGA_ACC, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_ACC(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_ACC(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_ACC(m4_test_type, m4_i)') ')') c c test NGA_PERIODIC_GET ifelse(m4_test_NGA_PERIODIC_GET, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_PERIODIC_GET(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_PERIODIC_GET(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_PERIODIC_GET(m4_test_type, m4_i)') ')') c c test NGA_PERIODIC_PUT ifelse(m4_test_NGA_PERIODIC_PUT, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_PERIODIC_PUT(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_PERIODIC_PUT(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_PERIODIC_PUT(m4_test_type, m4_i)') ')') c c test NGA_PERIODIC_ACC ifelse(m4_test_NGA_PERIODIC_ACC, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_PERIODIC_ACC(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_PERIODIC_ACC(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_PERIODIC_ACC(m4_test_type, m4_i)') ')') c c test NGA_FILL_PATCH ifelse(m4_test_NGA_FILL_PATCH, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_FILL_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_FILL_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_FILL_PATCH(m4_test_type, m4_i)') ')') c c test NGA_COPY_PATCH ifelse(m4_test_NGA_COPY_PATCH, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_COPY_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_COPY_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_COPY_PATCH(m4_test_type, m4_i)') ')') c c test NGA_SCALE_PATCH ifelse(m4_test_NGA_SCALE_PATCH, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_SCALE_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_SCALE_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_SCALE_PATCH(m4_test_type, m4_i)') ')') c c test NGA_ADD_PATCH ifelse(m4_test_NGA_ADD_PATCH, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_ADD_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_ADD_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_ADD_PATCH(m4_test_type, m4_i)') ')') c c test NGA_DOT_PATCH ifelse(m4_test_NGA_DOT_PATCH, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_DOT_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_DOT_PATCH(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_DOT_PATCH(m4_test_type, m4_i)') ')') c c test NGA_SCATTER ifelse(m4_test_NGA_SCATTER, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_SCATTER(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_SCATTER(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_SCATTER(m4_test_type, m4_i)') ')') c c test NGA_SCATTER_ACC ifelse(m4_test_NGA_SCATTER_ACC, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_SCATTER_ACC(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_SCATTER_ACC(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_SCATTER_ACC(m4_test_type, m4_i)') ')') c c test NGA_GATHER ifelse(m4_test_NGA_GATHER, `yes', `forloop(`m4_i', m4_from, m4_to, `ifelse(m4_test_int, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_int) divert call m4_func_NGA_GATHER(m4_test_type, m4_i)') ifelse(m4_test_dbl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dbl) divert call m4_func_NGA_GATHER(m4_test_type, m4_i)') ifelse(m4_test_dcpl, `yes', `divert(-1) undefine(`m4_test_type') define(m4_test_type, m4_test_type_dcpl) divert call m4_func_NGA_GATHER(m4_test_type, m4_i)') ')') c if(ga_nodeid().eq.0) print *, 'All tests successful' c call ga_terminate() call MP_FINALIZE() end ga-5-4/global/testing/ngatest_src/ndim_NGA_PUT.src0000644000175000017500000000512112662210457020142 0ustar mbamba subroutine m4_func_NGA_PUT(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i, total, loop integer lop(ndim),hip(ndim) integer elems, count_elems integer nproc, me integer proc logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------------- NGA_PUT ---------------------------- m4_print_info(nga_put) c proc = nproc-1 -me ! access other process memory call nga_distribution(g_a, proc, lo,hi) elems = count_elems(lo,hi,ndim) call m4_util_init_array(m4_test_type)(a,total) c call ga_sync() if(elems.gt.0) then call nga_put(g_a,lo,hi, $ a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) do loop = 1, MAXLOOP call random_range(lo,hi,lop,hip,ndim) if(me.eq.0 .and. Mod(loop,10).eq.0)then call print_range(loop,lop,hip,ndim) endif call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),ld) enddo call nga_get(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,lo,hi,ndim,dims,total,b,lo,hi,ndim,dims) else c so that the random_range can be call the same number of times c in other words, drand can generate the same number for the c collective operations do loop=1, MAXLOOP call random_range(lo,hi,lop,hip,ndim) enddo endif c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_PERIODIC_GET.src0000644000175000017500000000436312662210457021376 0ustar mbamba subroutine m4_func_NGA_PERIODIC_GET(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n integer ndim parameter (n = m4_n) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),lop(ndim),hip(ndim) integer blo(ndim),bhi(ndim) integer dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i,total,loop m4_data_type val integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------ NGA_PERIODIC_GET ---------------------- m4_print_info(nga_periodic_get) c total = 1 do i = 1,ndim lo(i) = 1 hi(i) = n total = total*dims(i) enddo c c initialize array a val = m4_conv(234) call ga_fill(g_a,val) call ga_sync() c call m4_util_fill_array(m4_test_type)(a,total,val) c do loop = 1, MAXLOOP call random_range_outbound(lo,hi,lop,hip,ndim) if(me.eq.0 .and. Mod(loop,10).eq.0) then call print_range(loop,lop,hip,ndim) endif call nga_periodic_get(g_a,lop,hip, $ b(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld) call ga_sync() c c check the result do i=1,ndim blo(i) = 1 bhi(i) = hip(i)-lop(i)+1 enddo call m4_util_compare_patches(m4_test_type)(0d0, $ total,a,blo,bhi,ndim,dims,total,b,blo,bhi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_PERIODIC_ACC.src0000644000175000017500000000616412662210457021346 0ustar mbamba subroutine m4_func_NGA_PERIODIC_ACC(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n integer ndim parameter (n = m4_n) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type c(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),lop(ndim),hip(ndim) integer blo(ndim),bhi(ndim) integer dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i,total,loop m4_data_type alpha double precision drand integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------ NGA_PERIODIC_ACC ---------------------- m4_print_info(nga_periodic_acc) c total = 1 do i = 1,ndim lo(i) = 1 hi(i) = n total = total*dims(i) enddo c call m4_util_init_array(m4_test_type)(a,total) call m4_util_init_array(m4_test_type)(b,total) c c initialize array g_a call ga_fill(g_a,m4_conv(123)) call ga_sync() c alpha = m4_rand(me*2+1) c do loop = 1, MAXLOOP if(mod(loop,nproc).eq.me) then call random_range_outbound(lo,hi,lop,hip,ndim) if(Mod(loop,10).eq.0) then call print_range(loop,lop,hip,ndim) endif call ga_init_fence() c keep a copy of the original patch call nga_periodic_put(g_a,lop,hip, $ b(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld) call ga_fence() call ga_init_fence() call nga_periodic_acc(g_a,lop,hip, $ a(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld,alpha) call ga_fence() call ga_init_fence() call nga_periodic_get(g_a,lop,hip, $ c(substr(m4_lo_all,1,eval(m4_ndim*6-1))),ld) call ga_fence() c c check the result do i=1,ndim blo(i) = 1 bhi(i) = hip(i)-lop(i)+1 enddo c scale the local copy of array call m4_util_scale_patch(m4_test_type)(total, $ m4_conv(1),b,blo,bhi,ndim,dims, $ alpha,a,blo,bhi,ndim,dims) call m4_util_compare_patches(m4_test_type)(1d-2, $ total,b,blo,bhi,ndim,dims,total,c,blo,bhi,ndim,dims) endif call ga_sync() enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_GET.src0000644000175000017500000000405512662210457020116 0ustar mbamba subroutine m4_func_NGA_GET(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i, total, loop integer lop(ndim), hip(ndim) m4_data_type val integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------------- NGA_GET ---------------------------- m4_print_info(nga_get) c val = m4_conv(234) call ga_fill(g_a,val) call ga_sync() c call m4_util_fill_array(m4_test_type)(a,total,val) c call ga_sync() do i = 1,ndim lop(i) = 1 hip(i) = n enddo do loop = 1, MAXLOOP call random_range(lop,hip,lo,hi,ndim) if(me.eq.0 .and. Mod(loop,10).eq.0)then call print_range(loop,lo,hi,ndim) endif c call nga_get(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,lo,hi,ndim,dims,total,b,lo,hi,ndim,dims) enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_DOT_PATCH.src0000644000175000017500000001727312662210457021052 0ustar mbamba subroutine m4_func_NGA_DOT_PATCH(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type c(substr(m4_array, 1, eval(m4_ndim*2-1))) integer dims(ndim) integer g_a, g_b integer chunk(ndim) integer i, total integer elems, count_elems integer loop integer lop(ndim), hip(ndim), hipl(ndim) integer alo(ndim), ahi(ndim) integer blo(ndim), bhi(ndim) integer tlo(ndim), thi(ndim) m4_data_type alpha, beta m4_data_type m4_util_dot_patch(m4_test_type) c for different array dimensions ifelse(m4_ndim,1,`',` m4_data_type d(substr(m4_array, 1, eval((m4_ndim-1)*2-1))) integer dndim parameter (dndim = m4_ndim-1) integer ddims(dndim),dlo(dndim),dhi(dndim),dtotal ') c integer nproc, me logical status integer repeat c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c c test the same distribution and different distribution seperately do repeat=1,2 if(repeat.eq.1) then status = ga_duplicate(g_a, g_b, 'a_duplicated') if(.not.ga_compare_distr(g_a, g_b)) $ call ga_error("g_b distribution different",0) c else do i = 1,ndim if(mod(i,2).eq.0) chunk(i) = n enddo if (.not. nga_create(m4_MT, ndim, dims, 'b', chunk, g_b)) $ call ga_error(' ga_create failed ',1) endif c call ga_sync() c c---------------------------NGA_DOT_PATCH ------------------------- c if(repeat.eq.1) then m4_print_info(m4_nga_dot_patch(m4_dot)) if(me.eq.0) print *, 'Testing with the same distributions' else if(me.eq.0) print *, 'Testing with different distributions' endif c c initialize GA call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) call m4_util_init_array(m4_test_type)(b,total) call nga_distribution(g_b, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_b,lop,hip, $ b(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) c call ga_sync() do i = 1,ndim lop(i) = 1 hipl(i) = n-1 hip(i) = n enddo c c--- do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(i) + 1 bhi(i) = ahi(i) + 1 enddo if(me.eq.0)then call dot_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,'dot: [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ ',', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c alpha=m4_nga_dot_patch(m4_dot)(g_a,'n',alo,ahi,g_b,'n',blo,bhi) c c the result should be beta = m4_util_dot_patch(m4_test_type)(total, $ a,alo,ahi,ndim,dims,b,blo,bhi,ndim,dims) c if(ABS(beta-alpha).gt.1d-6*ABS(alpha)) then print *,me, ' error ', beta, alpha call ga_error('exiting ...',0) endif c enddo c call ga_sync() if(me.eq.0)then print *, ' without transpose OK' print *, ' ' call ffflush(6) endif c--- c prepare array a, make it transposed call m4_util_transpose(m4_test_type)(b,c,total,ndim,dims) c do loop=1, 10 call random_range(lop,hipl,alo,ahi,ndim) do i=1, ndim blo(i) = alo(i) + 1 bhi(i) = ahi(i) + 1 enddo if(me.eq.0)then call dot_range(loop,alo,ahi,ndim,blo,bhi,ndim) c$$$ print *, loop,'dot: [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ ',', '[',(blo(i),':',bhi(i), i=1,ndim),']' endif c alpha=m4_nga_dot_patch(m4_dot)(g_a,'n',alo,ahi,g_b,'t',blo,bhi) c c adjust index of array a do i=1,ndim tlo(i) = blo(ndim-i+1) thi(i) = bhi(ndim-i+1) enddo c c the result should be beta = m4_util_dot_patch(m4_test_type)(total, $ a,alo,ahi,ndim,dims,b,tlo,thi,ndim,dims) c if(ABS(beta-alpha).gt.1d-6*ABS(alpha)) then print *,me, ' error ', beta, alpha call ga_error('exiting ...',0) endif c enddo c call ga_sync() if(me.eq.0)then print *, ' with transpose OK' print *, ' ' call ffflush(6) endif c--------------------------- c status = ga_destroy(g_b) enddo c c----------------------------------------------------------------- changequote({,}) ifelse(m4_ndim,1,{},{ c testing copy on differet dimensions dtotal = 1 do i = 1,dndim ddims(i) = n dtotal = dtotal * ddims(i) enddo c if (.not. nga_create(m4_MT, dndim, ddims, 'd', chunk, g_b)) $ call ga_error(' ga_create failed ',1) c if(me.eq.0) $ print *, 'Testing dot patch on different dimensions' c c initialize GAs call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lop, hip) elems = count_elems(lop, hip, ndim) if(elems.gt.0) call nga_put(g_a,lop,hip, $ a(substr(m4_lop_all, 1, eval(m4_ndim*7-1))),dims) call m4_util_init_array(m4_test_type)(d,dtotal) call nga_distribution(g_b, me, dlo, dhi) elems = count_elems(dlo, dhi, dndim) if(elems.gt.0) call nga_put(g_b,dlo,dhi, $ d(substr(m4_dlo_all, 1, eval((m4_ndim-1)*7-1))),ddims) c call ga_sync() c c calculate the maximum range of g_a that can fit into g_b do i = 1,ndim lop(i) = 1 hip(i) = n enddo hip(dndim) = 1 c do loop=1, 10 call random_range(lop,hip,alo,ahi,ndim) c do i=1, dndim dlo(i) = alo(dndim-i+1) dhi(i) = ahi(dndim-i+1) enddo dlo(1) = alo(ndim) dhi(1) = ahi(ndim) c if(me.eq.0) then call dot_range(loop,alo,ahi,ndim,dlo,dhi,dndim) c$$$ print *,loop,'dot: [',(alo(i),':',ahi(i), i=1,ndim),']', c$$$ $ ',', '[',(dlo(i),':',dhi(i), i=1,dndim),']' endif c alpha=m4_nga_dot_patch(m4_dot)(g_a,'n',alo,ahi, $ g_b,'n',dlo,dhi) c c the result should be beta = m4_util_dot_patch(m4_test_type)(total, $ a,alo,ahi,ndim,dims,d,dlo,dhi,dndim,ddims) c if(ABS(beta-alpha).gt.1d-6*ABS(alpha)) then print *,me, ' error ', beta, alpha call ga_error('exiting ...',0) endif c enddo c call ga_sync() if(me.eq.0)then print *, ' dot patch on different dimensions: OK' print *, ' ' call ffflush(6) endif c status = ga_destroy(g_b) }) changequote(`,') c--- status = ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_NGA_GATHER.src0000644000175000017500000000527012662210457020451 0ustar mbamba subroutine m4_func_NGA_GATHER(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),dims(ndim),ld(ndim) integer g_a integer chunk(ndim) integer i, j, total, loop integer elems, count_elems m4_data_type v(m) integer d(ndim, m) double precision drand integer unique,unique_index integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n ld(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c------------------------------- NGA_GATHER ---------------------------- m4_print_info(nga_gather) c c initialize GA call m4_util_init_array(m4_test_type)(a,total) call nga_distribution(g_a, me, lo, hi) elems = count_elems(lo, hi, ndim) if(elems.gt.0) call nga_put(g_a,lo,hi, $ a(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),dims) c do loop = 1, MAXLOOP call ga_sync() c initialize the index array do i = 1, m c generate indices unique_index = 0 do while(unique_index.eq.0) do j=1,ndim d(j,i) = int(drand(0)*real(n)) + 1 enddo c unique_index = unique(d,ndim,m,i) enddo enddo c c gather from global array call nga_gather(g_a, v, d, m) c c collect each elements and compare do i = 1, m do j=1, ndim lo(j) = d(j,i) enddo call nga_get(g_a,lo,lo, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),ld) c c compare the results if(v(i).ne. $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1)))) then call ga_error('bye', 0) endif enddo enddo c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/ngatest_src/ndim_util_comm.src0000644000175000017500000001050312662210457020775 0ustar mbamba subroutine random_range(lo,hi,lop,hip,ndim) implicit none integer lo(1),hi(1),lop(1),hip(1),ndim integer i, range, swap, val,iran double precision drand iran(range) = int(drand(0)*dble(range)) + 1 c iran(range) = range/2 do i = 1, ndim range = hi(i)-lo(i)+1 val = iran(range) lop(i) = lo(i) + val val = iran(range) hip(i) = hi(i) - val if(hip(i) .lt. lop(i))then swap =hip(i) hip(i)=lop(i) lop(i)=swap endif hip(i)=MIN(hip(i),hi(i)) lop(i)=MAX(lop(i),lo(i)) enddo end c c subroutine random_range_outbound(lo,hi,lop,hip,ndim) implicit none integer lo(1),hi(1),lop(1),hip(1),ndim integer i, range, val,iran double precision drand iran(range) = int(drand(0)*dble(range)) + 1 c iran(range) = range/2 do i = 1, ndim range = 2*(hi(i)-lo(i)+1) val = iran(range) lop(i) = lo(i) + val range = hi(i)-lo(i)+1 val = iran(range) hip(i) = lop(i) + range - val c hip(i) = hip(i)-hi(i) lop(i) = lop(i)-hi(i) enddo end c c integer function count_elems(lo,hi,ndim) implicit none integer lo(1),hi(1),ndim,elems,i elems=1 do i=1,ndim elems = elems*(hi(i)-lo(i)+1) enddo count_elems = elems end c c get the next available nindex in the range of lo and hi integer function next_index(ind,total,ndim,lo,hi,dims) implicit none integer ind,total,ndim,lo(ndim),hi(ndim),dims(ndim) integer i integer indx(m4_max_dim),nindex c nindex = ind + 1 200 call conv_1ton(ndim,dims,nindex,indx) c c test if indx(i) is in the range of lo(i) and hi(i) do i=1,ndim if((indx(i).lt.lo(i)).or.(indx(i).gt.hi(i))) then nindex = nindex + 1 if(nindex.gt.total) then next_index = 0 goto 300 else goto 200 endif endif enddo c next_index = nindex 300 end c testing if the indices are unique integer function unique(ind,ndim,m,n) implicit none integer ndim,m,n integer ind(ndim,m) integer i,j,marker c unique = 1 do i = 1, n-1 marker = 0 do j = 1, ndim if(ind(j,n).eq.ind(j,i)) marker = marker + 1 enddo c if(marker.eq.ndim) unique = 0 enddo c end c subroutine prnt_rng(me,lo,hi,ndim) implicit none integer me,ndim integer lo(ndim),hi(ndim) integer i c print *, me,': array section [',(lo(i),':',hi(i),i=1,ndim),']' c end c divide the space into equal size patches according to nproc c and calculate my lo and hi subroutine my_space(me,nproc,ndim,total,dims,lo,hi) implicit none integer me,nproc,ndim,total integer dims(ndim),lo(ndim),hi(ndim) integer div,lop,hip,i c div = total/nproc c lop = div * me + 1 c if(me.eq.(nproc-1)) then hip = total else hip = div * (me+1) endif c call conv_1ton(ndim,dims,lop,lo) call conv_1ton(ndim,dims,hip,hi) c c swap the indices if the lo if larger thant hi do i = 1,ndim if(lo(i).gt.hi(i)) then if(i.eq.ndim) call ga_error('bye',0) lo(i) = 1 lo(i+1) = lo(i+1) + 1 endif enddo end c convert the index from one dimension to n dimension subroutine conv_1ton(ndim,dims,ind1,indn) implicit none integer ndim integer dims(ndim) integer ind1,indn(ndim) integer range(m4_max_dim),remainder,i c remainder = ind1 c get the range of each dimension do i=1,ndim if(i.eq.1) then range(i) = dims(i) else range(i) = range(i-1) * dims(i) endif enddo c c get the indices in each dimension do i = ndim,1,-1 if(i.ne.1) then indn(i) = remainder/range(i-1) remainder = remainder - indn(i)*range(i-1) if(remainder.eq.0) then remainder = range(i-1) else indn(i) = indn(i) + 1 endif else indn(i) = remainder endif enddo c end ga-5-4/global/testing/ngatest_src/ndim_NGA_FILL_PATCH.src0000644000175000017500000000350312662210457021141 0ustar mbamba subroutine m4_func_NGA_FILL_PATCH(m4_test_type, m4_ndim) implicit none #include "mafdecls.fh" #include "global.fh" c integer n,m integer ndim parameter (n = m4_n) parameter (m = (m4_n**m4_ndim)/100) parameter (ndim = m4_ndim) m4_data_type a(substr(m4_array, 1, eval(m4_ndim*2-1))) m4_data_type b(substr(m4_array, 1, eval(m4_ndim*2-1))) integer lo(ndim),hi(ndim),dims(ndim) integer g_a integer chunk(ndim) integer i, total m4_data_type val integer nproc, me logical status c nproc = ga_nnodes() me = ga_nodeid() c c---------------------- initialize the GA ----------------------- c initialize the chunk, dims, ld, and calculate the number c of elements total=1 do i = 1,ndim chunk(i) = 0 dims(i) = n total = total * dims(i) enddo c c*** Create global arrays if (.not. nga_create(m4_MT, ndim, dims, 'a', chunk, g_a)) $ call ga_error(' ga_create failed ',1) c call ga_sync() c c--------------------------- NGA_FILL_PATCH ------------------------- m4_print_info(nga_fill_patch) c val = m4_conv(1234) c initialize the lo and hi do i=1, ndim lo(i) = 2 hi(i) = n - 1 enddo c call nga_fill_patch(g_a, lo, hi, val) c c check the result call m4_util_fill_array(m4_test_type)(a,total,val) call nga_get(g_a,lo,hi, $ b(substr(m4_lo_all, 1, eval(m4_ndim*6-1))),dims) c call m4_util_compare_patches(m4_test_type)(0d0,total, $ a,lo,hi,ndim,dims,total,b,lo,hi,ndim,dims) c call ga_sync() if(me.eq.0)then print *, 'OK' print *, ' ' call ffflush(6) endif c--------------------------- c status= ga_destroy(g_a) end ga-5-4/global/testing/patch2.F0000644000175000017500000000767412662210457014260 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif # define THRESH 1.0d-10 #define MISMATCH(x,y) abs(x-y)/max(1,abs(x)).gt.THRESH c c#define BLOCK_CYCLIC c#define USE_SCALAPACK_DISTR #ifdef USE_SCALAPACK_DISTR #define BLOCK_CYCLIC #endif c program test implicit none #include "mafdecls.fh" #include "global.fh" integer TESTDIM parameter(TESTDIM = 256) logical status integer g_a, g_b, g_c double precision alpha, beta integer ndim, adims(2), bdims(2), cdims(2), tlo(2), thi(2) integer alo(2), ahi(2), blo(2), bhi(2), clo(2), chi(2) integer ald, bld, cld, i_inc, j_inc double precision val integer me, nproc, i, j, ii, jj GA_ACCESS_INDEX_TYPE idx, inc c c*** Initialize a message passing library c #include "mp3.fh" c call nga_initialize() if(ga_nodeid().eq.0)then write(6,*) write(6,'(a)') ' GA initialized' write(6,*) call ffflush(6) endif c status = ma_init(MT_DBL, 500000, 900000/ga_nnodes()) if (.not. status)call ga_error( 'ma_init failed', -1) c me = ga_nodeid() c c create test arrays c g_a = nga_create_handle() ndim = 2 adims(1) = TESTDIM adims(2) = TESTDIM call nga_set_data(g_a,ndim,adims,MT_DBL) status = ga_allocate(g_a) c g_b = nga_create_handle() ndim = 2 bdims(1) = TESTDIM + 1 bdims(2) = TESTDIM + 1 call nga_set_data(g_b,ndim,bdims,MT_DBL) status = ga_allocate(g_b) c g_c = nga_create_handle() ndim = 2 cdims(1) = TESTDIM + 2 cdims(2) = TESTDIM + 2 call nga_set_data(g_c,ndim,cdims,MT_DBL) status = ga_allocate(g_c) c c initialize a and b c i_inc = TESTDIM/2 j_inc = TESTDIM/2 c call nga_distribution(g_a,me,alo,ahi) call nga_access(g_a,alo,ahi,idx,ald) do j = alo(2), ahi(2) do i = alo(1), ahi(1) dbl_mb(idx) = dble((j-1)*adims(1) + i-1) idx = idx + 1 end do end do call nga_release(g_a, alo, ahi) c call nga_distribution(g_b,me,blo,bhi) call nga_access(g_b,blo,bhi,idx,bld) do j = blo(2), bhi(2) do i = blo(1), bhi(1) dbl_mb(idx) = dble((j-1)*bdims(1) + i-1) idx = idx + 1 end do end do call nga_release(g_b, blo, bhi) c alo(1) = TESTDIM/4 alo(2) = TESTDIM/4 ahi(1) = alo(1) + i_inc ahi(2) = alo(2) + j_inc blo(1) = TESTDIM/4 + 1 blo(2) = TESTDIM/4 + 1 bhi(1) = blo(1) + i_inc bhi(2) = blo(2) + j_inc clo(1) = TESTDIM/4 + 2 clo(2) = TESTDIM/4 + 2 chi(1) = clo(1) + i_inc chi(2) = clo(2) + j_inc alpha = 1.0d00 beta = 1.0d00 c call nga_add_patch(alpha, g_a, alo, ahi, beta, g_b, blo, bhi, + g_c, clo, chi) c call ga_print(g_a) c call ga_print(g_b) c call ga_print(g_c) c c check C for answer c call nga_distribution(g_c,me,tlo,thi) if (tlo(1).lt.clo(1)) tlo(1) = clo(1) if (tlo(2).lt.clo(2)) tlo(2) = clo(2) if (thi(1).gt.chi(1)) thi(1) = chi(1) if (thi(2).gt.chi(2)) thi(2) = chi(2) c if (tlo(1).le.thi(1).and.tlo(2).le.thi(2)) then call nga_access(g_c,tlo,thi,idx,cld) do j = tlo(2), thi(2) jj = j - tlo(2) do i = tlo(1), thi(1) ii = i - tlo(1) val = alpha*dble((j-3)*adims(1)+i-3) + + beta*dble((j-2)*bdims(1)+i-2) if (dbl_mb(idx+jj*cld+ii).ne.val) then write(6,'(i4,a,2i8,2f8.0)') me,' Mismatch for values: ', + i,j,dbl_mb(idx+jj*cld+ii),val endif end do end do call nga_release(g_c, tlo, thi) endif c if (me.eq.0) then write(6,'(a)') 'Successfully completed test of nga_add_patch' endif c status = nga_destroy(g_a) status = nga_destroy(g_b) status = nga_destroy(g_c) call nga_terminate() c call MP_FINALIZE() end ga-5-4/global/testing/nb2test.F0000644000175000017500000003002712662210460014436 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c#include "tcgmsg.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM, nwidth, MAXPROC, nloop parameter (nmax = 4, DIM = 2, nwidth = 2, MAXPROC = 2000) parameter (nloop = 1) integer ndim, nproc, pdims(7), type, dcnt, g_a, maxval integer i, j, k, dims(7), width(7), map(MAXPROC+2) integer lo(7), hi(7), ld(7) integer lo2(7), hi2(7), ld2(7) integer dims3(7), ld3(7), chunk(7) GA_ACCESS_INDEX_TYPE index3 integer a(nmax, nmax), b(nmax+2*nwidth,nmax+2*nwidth) integer handles(8),mask(7) double precision start,finish,start1,finish1,t1,t2,t3,t4,t5,tmp double precision t6,t7 logical status, safe_put, safe_get, has_data(0:MAXPROC-1) parameter (heap=60*60*4, fudge=100, stack=100*100) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c print* call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap + fudge call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then print *, 'using ', nproc, ' process(es)' call ffflush(6) endif c c Test ghost distributions c ndim = DIM c c Create irregular distribution on all nodes c call factor(nproc,ndim,pdims) dims(1) = pdims(1) * nmax dims(2) = pdims(2) * nmax maxval = 1 do i = 1, ndim maxval = dims(i)*maxval end do maxval = maxval - 1 c dcnt = 1 do i = 1, pdims(1) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do do i = 1, pdims(2) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do c do i = 1, ndim width(i) = nwidth chunk(i) = 1 if (pdims(i).gt.dims(i)) pdims(i) = dims(i) if (me.eq.0) then write(6,*) 'Value of pdims(',i,') is ',pdims(i) endif call ffflush(6) ld(i) = nmax end do if (me.eq.0) then do i = 1, dcnt - 1 write(6,'("map(",i2,") = ",i5)') i,map(i) call ffflush(6) end do endif type = MT_INT status = nga_create_ghosts_irreg (type, ndim, dims, width, + "test_array", map, pdims, g_a) if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif c c Find processors that have data c call ga_sync do i = 0, nproc-1 call nga_distribution(g_a, i, lo, hi) has_data(i) = .true. do j = 1, ndim if (lo(j).eq.0.and.hi(j).eq.-1) has_data(i) = .false. end do if (me.eq.i) then write(6,*) '*' write(6,*) '* Distribution on processor ',i write(6,*) '*' write(6,110) lo(1), hi(1) write(6,110) lo(2), hi(2) 110 format(2i10) endif call ffflush(6) call ga_sync end do c c initialize g_a c call ga_sync call nga_distribution(g_a, me, lo, hi) do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = (i + lo(1) - 2)*dims(1) + (j + lo(2) - 2) + 1 end do end do safe_put = .true. do i = 1, ndim if (hi(i).lt.lo(i)) safe_put = .false. end do if (has_data(me).and.safe_put) call nga_put(g_a, lo, hi, a, ld) c c print out values of a c do k = 0, nproc-1 call ga_sync if (k.eq.me.and.has_data(me).and.maxval.lt.10000) then write(6,*) write(6,*) 'Initial data on processor ',k write(6,*) do i = 1, min(hi(1)-lo(1)+1,10) write (6,101) (a(i,j),j=1,min(hi(2)-lo(2)+1,10)) end do call ffflush(6) endif end do 101 format(10x,10i5) call ffflush(6) c go to 122 c update array using the non-blocking directional update c t1 = util_timer() k = 0 do i = -1, 1 mask(1) = i do j = -1, 1 mask(2) = j if (i.ne.0.or.j.ne.0) then k = k + 1 call nga_nbget_ghost_dir(g_a,mask,handles(k)) endif end do end do c c Wait c do i = 1, 8 call nga_nbwait(handles(i)) end do call ga_sync t1 = util_timer() - t1 if (me.eq.0) then write(6,*) '*' write(6,*) '* Completed update successfully' write(6,*) '*' call ffflush(6) endif c c get patch with ghost cells c do i = 1, ndim lo2(i) = lo(i) - width(i) hi2(i) = hi(i) + width(i) ld2(i) = ld(i) + 2*width(i) end do call ga_sync call ffflush(6) do i = 0, nproc-1 if (i.eq.me) then write(6,*) '*' write(6,*) 'ghost patch dimensions on processor ',i write(6,*) '*' do j = 1, ndim write(6,*) 'lo(',j,') = ',lo2(j) write(6,*) 'hi(',j,') = ',hi2(j) write(6,*) 'ld(',j,') = ',ld2(j) end do write(6,*) '*' endif call ga_sync call ffflush(6) end do safe_get = .true. t2 = 0.0d00 t3 = 0.0d00 do i = 1, nloop start = util_timer() call ga_sync start1 = util_timer() if (has_data(me).and.safe_get) + call nga_periodic_get(g_a, lo2, hi2, b, ld2) finish1 = util_timer() call ga_sync finish = util_timer() t2 = t2 + finish1 - start1 t3 = t3 + finish - start end do t2 = t2/dble(nloop) t3 = t3/dble(nloop) if (me.eq.0.and.maxval.lt.10000) then write(6,*) '*' write(6,*) '* Write out contents of local patch using' write(6,*) '* nga_periodic_get' write(6,*) '*' call ffflush(6) endif do k = 0, nproc-1 call ga_sync if (me.eq.k.and.has_data(me).and.maxval.lt.10000) then write(6,*) '*' write(6,*) '* Data on processor ',k write(6,*) '*' do i = 1, min(hi2(1)-lo2(1)+1,12) write (6,102) (b(i,j),j=1,min(hi2(2)-lo2(2)+1,12)) end do call ffflush(6) endif end do 102 format(14i5) if (me.eq.0) then write(6,*) '*' write(6,*) '* Performing nga_access_ghosts' write(6,*) '*' call ffflush(6) endif if (has_data(me)) call nga_access_ghosts(g_a, dims3, + index3, ld3) call ga_sync if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*nwidth,has_data) call ga_sync tmp = t1 call ga_dgop(1,tmp,1,'max') if (me.eq.0) then write(6,*) 'Maximum time for nga_update_ghosts ',tmp endif tmp = t1 call ga_dgop(2,tmp,1,'min') if (me.eq.0) then write(6,*) 'Minimum time for nga_update_ghosts ',tmp endif tmp = t1 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,*) 'Average time for nga_update_ghosts ',tmp/dble(nproc) endif tmp = t2 call ga_dgop(4,tmp,1,'max') if (me.eq.0) then write(6,*) 'Maximum time for nga_periodic_get ',tmp endif tmp = t2 call ga_dgop(5,tmp,1,'min') if (me.eq.0) then write(6,*) 'Minimum time for nga_periodic_get ',tmp endif tmp = t2 call ga_dgop(6,tmp,1,'+') if (me.eq.0) then write(6,*) 'Average time for nga_periodic_get ',tmp/dble(nproc) endif tmp = t3 call ga_dgop(4,tmp,1,'max') if (me.eq.0) then write(6,*) 'Maximum time for (sync)nga_periodic_get ',tmp endif tmp = t3 call ga_dgop(5,tmp,1,'min') if (me.eq.0) then write(6,*) 'Minimum time for (sync)nga_periodic_get ',tmp endif tmp = t3 call ga_dgop(6,tmp,1,'+') if (me.eq.0) then write(6,*) 'Average time for (sync)nga_periodic_get ', + tmp/dble(nproc) endif 127 continue c if(ga_nodeid().eq.0) print *,'All tests successful ' c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end c subroutine aprint(a,nrow,ncol,ld,has_data) #include "global.fh" integer ld integer a(ld,*) integer i, j, k, nproc logical has_data(0:1999) nproc = ga_nnodes() do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then write(6,*) '*' write(6,*) '* Data on processor ',k-1 write(6,*) '*' do i = 1, min(nrow,12) write (6,102) (a(i,j), j = 1, min(ncol,12)) 102 format(14i5) end do endif call ffflush(6) enddo c return end c subroutine atest(a,nrow,ncol,ld,b,ld2,has_data) #include "global.fh" integer ld integer a(ld,*), b(ld2,*) integer i, j, k, nproc logical has_data(0:1999), check_data nproc = ga_nnodes() check_data = .true. do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then do i = 1, nrow do j = 1, ncol if (a(i,j).ne.b(i,j)) check_data = .false. end do end do if (check_data) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is the same on' write(6,*) '* processor ',k-1 write(6,*) '*' else write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is NOT the same on' write(6,*) '* processor ',k-1 write(6,*) '*' endif endif call ffflush(6) enddo c return end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(7),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end ga-5-4/global/testing/bin.F0000644000175000017500000004544312662210460013635 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif C C Test the minval, minloc, maxval, maxloc, and enum functions in GA. C program main implicit none #include "mafdecls.fh" #include "global.fh" integer heap, stack, fudge, ma_heap, me, nproc logical status parameter (heap=100*100*4, fudge=100, stack=100*100) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c if(ga_nodeid().eq.0)then print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, heap) if (.not. status) call ga_error('ma_init failed',-1) c if(me.eq.0)then print *, 'using ', nproc, ' process(es)' call ffflush(6) endif c call test_nga_bin() c if(me.eq.0) call ga_print_stats() c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c end logical function ga_create_bin(nelem, type, name, g_off, g_bin) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer nelem, type, g_off, g_bin character*1 name c integer lo,hi, map(100),i,me,nproc c nproc = ga_nnodes() me = ga_nodeid() c do i = 1,nproc map(i) = 0 enddo c c call ga_print_distribution(g_off) call nga_distribution(g_off,me,lo,hi) call ga_sync() c call nga_get(g_off,lo,lo,map(me+1),1) if(me.gt.0. and. map(me+1).eq.0)then print *,'my lo/hi in offset array',lo,hi,map(me+1) call ga_error('got 0',0) endif map(me+1) = map(me+1)+1 call ga_igop(1,map,nproc,'+') c ga_create_bin=nga_create_irreg(type,1,nelem,name,map,nproc,g_bin) end subroutine test_nga_bin() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" C integer g_ielm1, g_result1 ! handles to global arrays integer g_ibin, g_ibincnt, g_ibinoff ! handles to global arrays integer g_ibinga, g_idiff ! handles to global arrays integer g_ielm2, g_sbit2, g_src2, g_sink2, g_result2 ! handles to global arrays integer g_irowmat, g_icolmat ! handles to global arrays integer g_velm4, g_velm5 ! handles to global arrays C integer ilo, ihi, num integer ilo4, ihi4, num4 integer i, it, count integer imax_bin, imin_bin integer iboff1, iboff2 integer me, nproc ! my processor & number of procs integer ndim,dims(1),chunck(1) C integer nelements_max, nen_max parameter (nelements_max=1000, nen_max=4) integer ipack(nelements_max), * jpack(nelements_max), * kpack(nelements_max), * ielm1(nelements_max), * ielm2(nelements_max), * iarray(nelements_max), * ielm4(nen_max*nelements_max) double precision velm4(nen_max*nelements_max), * velm5(nen_max*nelements_max) C integer nbins_max parameter (nbins_max=1000) integer ibincnt(nbins_max), ibinoff(nbins_max) c integer ilocmax, ilocmin integer ilocmax_ga, ilocmin_ga integer imax_ga, imin_ga C integer nelements, nen integer isum, icount, jcount, itoff double precision result integer i1, i2, ibin logical ga_create_bin C C c c*** check parallel environment me = ga_nodeid() nproc = ga_nnodes() c nelements=80 nen=4 c c*** create a global 1-D array ndim=1 dims(1)=nen*nelements chunck(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ielm1', chunck, $ g_ielm1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result1', chunck, $ g_result1)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sbit2', chunck, $ g_sbit2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'src2', chunck, $ g_src2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'sink2', chunck, $ g_sink2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'result2', chunck, $ g_result2)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'irowmat', chunck, $ g_irowmat)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'icolmat', chunck, $ g_icolmat)) $ call ga_error(' ga_create failed ',0) C if (.not. nga_create(MT_DBL, ndim, dims, 'velm4', chunck, $ g_velm4)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_DBL, ndim, dims, 'velm5', chunck, $ g_velm5)) $ call ga_error(' ga_create failed ',0) C c c Enumerate the sbit arrary to get a sequential vector. call ga_fill(g_ielm1,0) call ga_patch_enum(g_ielm1,1,nen*nelements,1,1) C *** ielm1: 1 2 3 4 5 ... nelements ... 0 0 0 0 0 c c*** compute local ilo, ihi, num for each processor call nga_distribution(g_ielm1,me,ilo,ihi,chunck) num=ihi-ilo+1 if(ihi.le.0) num=0 if(ihi.gt.nen*nelements) then ihi=nelements num=max(0,ihi-ilo+1) endif C*****print *,"Random: ",ilo,ihi,ndim,dims(1) if(num.gt.nelements_max) then print *,"Too many elements " goto 9999 endif C*****print *, 'me=',me, num,ilo,ihi c itoff=nen*nelements do i=ilo,ihi c print *, 'rand=',10.0*drand(0), c * nint(10.0*drand(0)), drand(0),drand(0) ielm1(i-ilo+1)=max(1,min(nbins_max,1+nint(20.0*drand(0)))) enddo call ssortii(ielm1,ielm1,num,1) if(num.gt.0) call nga_put(g_ielm1,ilo,ihi,ielm1,1) c if(num.gt.0) call nga_get(g_ielm1,ilo,ihi,ielm1,1) C*****print *,"ielm1: ",me,(ielm1(i-ilo+1),i=ilo,ihi) call ga_sync() C*****call ga_print(g_ielm1) c call nga_select_elem(g_ielm1,'max',imax_bin,ilocmax_ga) call nga_select_elem(g_ielm1,'min',imin_bin,ilocmin_ga) C ndim=1 dims(1)=imax_bin chunck(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ibincnt', chunck, $ g_ibincnt)) $ call ga_error(' ga_create failed ',0) if (.not. nga_create(MT_INT, ndim, dims, 'ibinoff', chunck, $ g_ibinoff)) $ call ga_error(' ga_create failed ',0) ndim=1 dims(1)=nen*nelements chunck(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ibin', chunck, $ g_ibin)) $ call ga_error(' ga_create failed ',0) c ndim=1 dims(1)=nen*nelements chunck(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'idiff', chunck, $ g_idiff)) $ call ga_error(' ga_create failed ',0) c iboff1=1 iboff2=0 call ga_fill(g_src2,0) call ga_patch_enum(g_src2,1,itoff,1,1) if(num.gt.0) call nga_get(g_src2,ilo,ihi,ielm2,1) do ibin=imin_bin,imax_bin icount=0 do i=ilo,ihi if(ielm1(i-ilo+1).eq.ibin) then icount=icount+1 ipack(i-ilo+1)=1 else ipack(i-ilo+1)=0 endif enddo if(num.gt.0) then call nga_put(g_sbit2,ilo,ihi,ipack,1) endif if(icount.gt.0) then jcount=0 do i=ilo,ihi if(ipack(i-ilo+1).eq.1) then jcount=jcount+1 jpack(jcount)=i endif enddo icount=0 call ga_fill(g_sink2,0) call ga_pack(g_src2, g_sink2,g_sbit2,1,itoff,icount) iboff2=iboff1+icount-1 if(me.eq.0) print *,"Pack bin: ",ibin," count ",icount, * iboff1,iboff2 call nga_copy_patch('n',g_sink2,1,icount, * g_ibin,iboff1,iboff2) iboff1=iboff1+icount endif ibincnt(ibin)=icount call ga_sync() enddo if(me.eq.0) then call nga_put(g_ibincnt,1,imax_bin,ibincnt,1) icount=0 do i=1,imax_bin ibinoff(i)=icount icount=icount+ibincnt(i) print *, 'bin off',i, ibinoff(i) enddo call nga_put(g_ibinoff,1,imax_bin,ibinoff,1) endif C C*****call ga_print(g_ibin) C #if 1 if(.not.ga_create_bin(nen*nelements,MT_INT,'ibin',g_ibinoff, $ g_ibinga)) $ call ga_error(' ga_create failed ',0) #else ndim=1 dims(1)=nen*nelements chunck(1)=min(1,dims(1)/nproc) if (.not. nga_create(MT_INT, ndim, dims, 'ibinga', chunck, $ g_ibinga)) $ call ga_error(' ga_create failed ',0) #endif c c call ga_print_distribution(g_ibinga) c call ga_print_distribution(g_ibincnt) c call ga_print(g_ibinoff) call GA_bin_index(g_ibinga,g_ibincnt,g_ibinoff,ielm2,ielm1,num,1) * call ga_fill(g_ibinga,0) * call ga_copy(g_ibin,g_ibinga) C c call ga_print(g_ibinga) c call ga_print(g_ibincnt) if(num.gt.0) call nga_get(g_ibin ,ilo,ihi,ielm1,1) if(num.gt.0) call nga_get(g_ibinga,ilo,ihi,ielm2,1) isum=0 do i=1,num if(ielm1(i).ne.ielm2(i)) then isum=isum+1 endif enddo call ga_sync() C call ga_igop(MT_INT,isum,1,'+') if(me.eq.0) then if(isum.ne.0) then print *,"Binning: failed: ",isum else print *,"Binning: successful" endif endif C call ga_sync() C goto 9999 9999 continue C C .................................................................. C return end *dk,ssortii subroutine ssortii(x,y,n,kflag) C C ##################################################################### C C PURPOSE - C C None C C INPUT ARGUMENTS - C C None C C OUTPUT ARGUMENTS - C C None C C CHANGE HISTORY - C C $Log: not supported by cvs2svn $ CPVCS CPVCS Rev 1.2 08/03/95 13:53:18 dcg CPVCS replace print * with writloga calls CPVCS CPVCS Rev 1.1 04/20/95 11:28:46 ejl CPVCS Fixed message when number of items is not greater then zero. CPVCS CPVCS CPVCS Rev 1.0 02/14/95 14:39:22 dcg CPVCS Original version C C ###################################################################### C implicit real*8 (a-h,o-z) C***BEGIN PROLOGUE SSORT C***DATE WRITTEN 761101 (YYMMDD) C***REVISION DATE 861211 (YYMMDD) C***CATEGORY NO. N6A2B1 C***KEYWORDS LIBRARY=SLATEC, C TYPE=SINGLE PRECISION(SSORT-S DSORT-D ISORT-I),QUICKSORT, C SINGLETON QUICKSORT,SORT,SORTING C***AUTHOR JONES, R. E., (SNLA) C WISNIEWSKI, J. A., (SNLA) C***PURPOSE SSORT sorts array X and optionally makes the same C interchanges in array Y. The array X may be sorted in C increasing order or decreasing order. A slightly modified C QUICKSORT algorithm is used. C***DESCRIPTION C C Written by Rondall E. Jones C Modified by John A. Wisniewski to use the Singleton quicksort C algorithm. Date 18 November 1976. C C Abstract C SSORT sorts array X and optionally makes the same C interchanges in array Y. The array X may be sorted in C increasing order or decreasing order. A slightly modified C quicksort algorithm is used. C C Reference C Singleton, R. C., Algorithm 347, An Efficient Algorithm for C Sorting with Minimal Storage, CACM,12(3),1969,185-7. C C Description of Parameters C X - array of values to be sorted (usually abscissas) C Y - array to be (optionally) carried along C N - number of values in array X to be sorted C KFLAG - control parameter C =2 means sort X in increasing order and carry Y along. C =1 means sort X in increasing order (ignoring Y) C =-1 means sort X in decreasing order (ignoring Y) C =-2 means sort X in decreasing order and carry Y along. C***REFERENCES SINGLETON,R.C., ALGORITHM 347, AN EFFICIENT ALGORITHM C FOR SORTING WITH MINIMAL STORAGE, CACM,12(3),1969, C 185-7. C***ROUTINES CALLED XERROR C***END PROLOGUE SSORT integer X(N),Y(N),IL(21),IU(21) real*4 r character*80 logmess integer TY, TTY C***FIRST EXECUTABLE STATEMENT SSORT NN = N IF (NN.LT.0) THEN write(*,'(a)') x 'SSORT- THE NUMBER OF VALUES TO BE SORTED IS NEGATIVE' RETURN ELSEIF (NN.EQ.0) THEN write(*,'(a)') x 'SSORT- THE NUMBER OF VALUES TO BE SORTED IS ZERO' RETURN ENDIF C KK = IABS(KFLAG) IF ((KK.EQ.1).OR.(KK.EQ.2)) GO TO 15 write(*,'(a)') x 'SSORT- THE SORT CONTROL PARAMETER, K, WAS NOT 2, 1, -1, OR -2.' RETURN C C ALTER ARRAY X TO GET DECREASING ORDER IF NEEDED C 15 IF (KFLAG.GE.1) GO TO 30 DO 20 I=1,NN 20 X(I) = -X(I) 30 GO TO (100,200),KK C C SORT X ONLY C 100 CONTINUE M=1 I=1 J=NN R=.375 110 IF (I .EQ. J) GO TO 155 115 IF (R .GT. .5898437) GO TO 120 R=R+3.90625E-2 GO TO 125 120 R=R-.21875 125 K=I C SELECT A CENTRAL ELEMENT OF THE C ARRAY AND SAVE IT IN LOCATION T C*****IJ = I + IFIX (FLOAT (J-I) * sngl(R)) IJ = I + IFIX (FLOAT (J-I) * R) T=X(IJ) C IF FIRST ELEMENT OF ARRAY IS GREATER C THAN T, INTERCHANGE WITH T IF (X(I) .LE. T) GO TO 130 X(IJ)=X(I) X(I)=T T=X(IJ) 130 L=J C IF LAST ELEMENT OF ARRAY IS LESS THAN C T, INTERCHANGE WITH T IF (X(J) .GE. T) GO TO 140 X(IJ)=X(J) X(J)=T T=X(IJ) C IF FIRST ELEMENT OF ARRAY IS GREATER C THAN T, INTERCHANGE WITH T IF (X(I) .LE. T) GO TO 140 X(IJ)=X(I) X(I)=T T=X(IJ) GO TO 140 135 TT=X(L) X(L)=X(K) X(K)=TT C FIND AN ELEMENT IN THE SECOND HALF OF C THE ARRAY WHICH IS SMALLER THAN T 140 L=L-1 IF (X(L) .GT. T) GO TO 140 C FIND AN ELEMENT IN THE FIRST HALF OF C THE ARRAY WHICH IS GREATER THAN T 145 K=K+1 IF (X(K) .LT. T) GO TO 145 C INTERCHANGE THESE ELEMENTS IF (K .LE. L) GO TO 135 C SAVE UPPER AND LOWER SUBSCRIPTS OF C THE ARRAY YET TO BE SORTED IF (L-I .LE. J-K) GO TO 150 IL(M)=I IU(M)=L I=K M=M+1 GO TO 160 150 IL(M)=K IU(M)=J J=L M=M+1 GO TO 160 C BEGIN AGAIN ON ANOTHER PORTION OF C THE UNSORTED ARRAY 155 M=M-1 IF (M .EQ. 0) GO TO 300 I=IL(M) J=IU(M) 160 IF (J-I .GE. 1) GO TO 125 IF (I .EQ. 1) GO TO 110 I=I-1 165 I=I+1 IF (I .EQ. J) GO TO 155 T=X(I+1) IF (X(I) .LE. T) GO TO 165 K=I 170 X(K+1)=X(K) K=K-1 IF (T .LT. X(K)) GO TO 170 X(K+1)=T GO TO 165 C C SORT X AND CARRY Y ALONG C 200 CONTINUE M=1 I=1 J=NN R=.375 210 IF (I .EQ. J) GO TO 255 215 IF (R .GT. .5898437) GO TO 220 R=R+3.90625E-2 GO TO 225 220 R=R-.21875 225 K=I C SELECT A CENTRAL ELEMENT OF THE C ARRAY AND SAVE IT IN LOCATION T C*****IJ = I + IFIX (FLOAT (J-I) *sngl(R)) IJ = I + IFIX (FLOAT (J-I) * R) T=X(IJ) TY= Y(IJ) C IF FIRST ELEMENT OF ARRAY IS GREATER C THAN T, INTERCHANGE WITH T IF (X(I) .LE. T) GO TO 230 X(IJ)=X(I) X(I)=T T=X(IJ) Y(IJ)= Y(I) Y(I)=TY TY= Y(IJ) 230 L=J C IF LAST ELEMENT OF ARRAY IS LESS THAN C T, INTERCHANGE WITH T IF (X(J) .GE. T) GO TO 240 X(IJ)=X(J) X(J)=T T=X(IJ) Y(IJ)= Y(J) Y(J)=TY TY= Y(IJ) C IF FIRST ELEMENT OF ARRAY IS GREATER C THAN T, INTERCHANGE WITH T IF (X(I) .LE. T) GO TO 240 X(IJ)=X(I) X(I)=T T=X(IJ) Y(IJ)= Y(I) Y(I)=TY TY= Y(IJ) GO TO 240 235 TT=X(L) X(L)=X(K) X(K)=TT TTY= Y(L) Y(L)= Y(K) Y(K)=TTY C FIND AN ELEMENT IN THE SECOND HALF OF C THE ARRAY WHICH IS SMALLER THAN T 240 L=L-1 IF (X(L) .GT. T) GO TO 240 C FIND AN ELEMENT IN THE FIRST HALF OF C THE ARRAY WHICH IS GREATER THAN T 245 K=K+1 IF (X(K) .LT. T) GO TO 245 C INTERCHANGE THESE ELEMENTS IF (K .LE. L) GO TO 235 C SAVE UPPER AND LOWER SUBSCRIPTS OF C THE ARRAY YET TO BE SORTED IF (L-I .LE. J-K) GO TO 250 IL(M)=I IU(M)=L I=K M=M+1 GO TO 260 250 IL(M)=K IU(M)=J J=L M=M+1 GO TO 260 C BEGIN AGAIN ON ANOTHER PORTION OF C THE UNSORTED ARRAY 255 M=M-1 IF (M .EQ. 0) GO TO 300 I=IL(M) J=IU(M) 260 IF (J-I .GE. 1) GO TO 225 IF (I .EQ. 1) GO TO 210 I=I-1 265 I=I+1 IF (I .EQ. J) GO TO 255 T=X(I+1) TY= Y(I+1) IF (X(I) .LE. T) GO TO 265 K=I 270 X(K+1)=X(K) Y(K+1)= Y(K) K=K-1 IF (T .LT. X(K)) GO TO 270 X(K+1)=T Y(K+1)=TY GO TO 265 C C CLEAN UP C 300 IF (KFLAG.GE.1) RETURN DO 310 I=1,NN 310 X(I) = -X(I) RETURN END ga-5-4/global/testing/perfmod.F0000644000175000017500000002153212662210461014513 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: perfmod.F,v 1.4 2000-05-25 01:09:20 d3h325 Exp $ c------------------------------------------------------------------------ c Program perfmod.x is used to test performance of GA put,get,accumulate | c It has to be executed on four processors. | c remote operations access data on processes 1,2,3 in the round-robin way| c------------------------------------------------------------------------ c #define SLEEP sleep program perfmod implicit none #include "mafdecls.fh" #include "global.fh" integer heap,stack c c*** Intitialize a message passing library c #include "mp3.fh" c c Intitialize the GA package c call ga_initialize() c if(ga_nnodes().ne.4 .and. ga_nodeid().eq.0) $ call ga_error('Must be run with 4 GA processes',ga_nnodes()) c c*** Initialize the MA package heap = 450000 stack =heap if (.not. ma_init(MT_DBL, heap, stack)) $ call ga_error("ma init failed",heap+stack) c call testit() c if(ga_nodeid().eq.0) print *, 'All tests successful' c call ga_terminate() c call MP_FINALIZE() end subroutine testit() implicit none #include "mafdecls.fh" #include "global.fh" c c integer n, nn, num_chunks parameter (n = 710, nn = n*n/4, num_chunks=12) double precision buf(nn) c integer g_a integer ilo, ihi, jlo, jhi integer nproc, me, loop integer chunk(num_chunks) data chunk /1,3,4,9,16,30,64,91,128,171,256,353/ c nproc = ga_nnodes() me = ga_nodeid() c c*** Create global array if (.not. ga_create(MT_DBL, n, n, 'a', 0, 0, g_a)) $ call ga_error(' ga_create failed ',n) c do loop=1,nn buf(loop) = .01d0 enddo call ga_zero(g_a) c if (me .eq. 0) then write(*,*)' ' print *,'> Performance of ga_get, ga_put & ga_acc n = ', n print *,' ' endif c c do loop=1,2 c c*** local ops c call ga_distribution(g_a, me, ilo, ihi, jlo, jhi) call TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo, jhi, .true.) c c*** remote ops c call TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo, jhi,.false.) c enddo end subroutine TestPutGetAcc & (g_a, n, chunk, num_chunks, buf, ilo, ihi, jlo,jhi, local) implicit none #include "global.fh" #include "testutil.fh" integer num_chunks, chunk(num_chunks) integer n, ilo, ihi, jlo,jhi,g_a double precision buf(*), tg, tp, ta double precision time_acc, time_get, time_put logical local c integer me integer loop, jump, count, bytes c me = ga_nodeid() if (me .eq. 0) then write(6,*)' ' if(local) then write(6,'(21X,8hACCESS [,i3,1h:,i4,1h,,i3,1h:,i4,1h])') & ilo,ihi,jlo,jhi else write(6,'(21X,6hACCESS , 2x, 18Hremote section )') endif write(6,*)'bytes loop get put', & ' accumulate' call flush(6) endif call ga_sync() c do loop = 1, num_chunks bytes = util_mdtob(1)*chunk(loop)*chunk(loop) !how much data is accessed jump = n/(60*loop) ! jump distance between consecutive patches c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tg=time_get(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(2) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then tp=time_put(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(2) endif c c everybody touches own data call ga_fill_patch(g_a, 1, n, 1, n , 1d0*me*loop) if (me .eq. 0) then ta=time_acc(g_a,ilo,ihi,jlo,jhi,buf,chunk(loop),jump,count, $ local) else call SLEEP(2) endif c if (me .eq. 0) then write(6,77)bytes, count, tg, 1d-6*bytes/tg, & tp, 1d-6*bytes/tp, ta, 1d-6*bytes/ta call flush(6) endif enddo c 77 format(i6, i5, 3(d10.3, d9.2,'MB/s')) end double precision function & time_acc(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je logical local integer rows, cols, indx, shifti(3), shiftj(3) c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_acc(g_a, ilo, ihi, jlo, jhi, buf, chunk, 1d0) else indx = Mod(count,3) + 1 call ga_acc(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk, 1d0) endif enddo enddo seconds = util_timer() - seconds c time_acc = seconds/count end double precision function & time_get(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, cols, indx, shifti(3), shiftj(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_get(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_get(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk) endif enddo enddo seconds = util_timer() - seconds c time_get = seconds/count end double precision function & time_put(g_a, is, ie, js, je, buf, chunk, jump, count, local) c implicit none #include "global.fh" #include "testutil.fh" c integer g_a, chunk, jump, count, is, js, ie, je integer rows, cols, indx, shifti(3), shiftj(3) logical local c integer ilo, ihi, jlo, jhi double precision seconds, buf c count = 0 rows = ie - is + 1 cols = je - js + 1 shifti(1) = rows shifti(2) = 0 shifti(3) = rows shiftj(1) = 0 shiftj(2) = cols shiftj(3) = cols seconds = util_timer() c c distance between consecutive patches increased by jump c to destroy locality of reference do ilo = is, ie -chunk-jump +1, chunk+jump ihi = ilo + chunk -1 do jlo = js, je -chunk-jump +1, chunk+jump jhi = jlo + chunk -1 count = count + 1 if (local) then call ga_put(g_a, ilo, ihi, jlo, jhi, buf, chunk) else indx = Mod(count,3) + 1 call ga_put(g_a, ilo+shifti(indx), ihi+shifti(indx), $ jlo+shiftj(indx), jhi+shiftj(indx), $ buf, chunk) endif enddo enddo seconds = util_timer() - seconds c time_put = seconds/count end subroutine my_sleep(seconds) implicit none #include "global.fh" #include "testutil.fh" c double precision ts, te, work integer seconds, loop common /sleep_block/ work c ts = util_timer() work = 0. 100 continue do loop= 1, 500 work = work + 1. enddo te = util_timer() if(te - ts .lt. real(seconds)) goto 100 * print *, work, ts, te end ga-5-4/global/testing/testmult.c0000644000175000017500000001540612662210457015005 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #include "macdecls.h" #include "ga.h" #include "mp3.h" /* utilities for GA test programs */ #include "testutil.h" #define N 400 /* first dimension */ #define BASE 0 #define PERMUTE_ #define GA_DATA_TYPE MT_C_FLOAT #define GA_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define TOLERANCE 0.000001 DoublePrecision gTime=0.0, gStart; void test(int data_type, int ndim) { int me=GA_Nodeid(); int g_a, g_b, g_c, g_A, g_B, g_C; int dims[GA_MAX_DIM]={N,N,2,2,2,1,1}; int lo[GA_MAX_DIM]={1,1,1,1,1,0,0}; int hi[GA_MAX_DIM]={N-2,N-2,1,1,1,0,0}; int clo[2], chi[2], m, n, k; double value1_dbl = 2.0, value2_dbl = 2.0; double alpha_dbl = 1.0, beta_dbl = 0.0; float value1_flt = 2.0, value2_flt = 2.0; float alpha_flt = 1.0, beta_flt = 0.0; DoubleComplex value1_dcpl = {2.0, 2.0}, value2_dcpl = {2.0, 2.0}; DoubleComplex alpha_dcpl = {1.0, 0.0} , beta_dcpl = {0.0, 0.0}; SingleComplex value1_scpl = {2.0, 2.0}, value2_scpl = {2.0, 2.0}; SingleComplex alpha_scpl = {1.0, 0.0} , beta_scpl = {0.0, 0.0}; void *value1=NULL, *value2=NULL, *alpha=NULL, *beta=NULL; switch (data_type) { case C_FLOAT: alpha = (void *)&alpha_flt; beta = (void *)&beta_flt; value1 = (void *)&value1_flt; value2 = (void *)&value2_flt; if(me==0) printf("Single Precision: Testing GA_Sgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; case C_DBL: alpha = (void *)&alpha_dbl; beta = (void *)&beta_dbl; value1 = (void *)&value1_dbl; value2 = (void *)&value2_dbl; if(me==0) printf("Double Precision: Testing GA_Dgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; case C_DCPL: alpha = (void *)&alpha_dcpl; beta = (void *)&beta_dcpl; value1 = (void *)&value1_dcpl; value2 = (void *)&value2_dcpl; if(me==0) printf("Double Complex: Testing GA_Zgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; case C_SCPL: alpha = (void *)&alpha_scpl; beta = (void *)&beta_scpl; value1 = (void *)&value1_scpl; value2 = (void *)&value2_scpl; if(me==0) printf("Single Complex: Testing GA_Cgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; default: GA_Error("wrong data type", data_type); } g_a = NGA_Create(data_type, ndim, dims, "array A", NULL); g_b = GA_Duplicate(g_a, "array B"); g_c = GA_Duplicate(g_a, "array C"); if(!g_a || !g_b || !g_c) GA_Error("Create failed: a, b or c",1); GA_Fill(g_a, value1); GA_Fill(g_b, value2); GA_Zero(g_c); NGA_Matmul_patch('N', 'N', alpha, beta, g_a, lo, hi, g_b, lo, hi, g_c, lo, hi); GA_Destroy(g_a); GA_Destroy(g_b); /** * Verifying g_c: * 1. Create g_A(=g_a) and g_B(=g_b) * 2. g_C = g_A*g_B; (Using Gemm routines) * 3. g_A = g_c; (copy the 2-d patch og g_c into g_A) * 4. g_C = g_A - g_C; (Using add() routine by making beta=-1.0) * 5. If all the elements in g_C is zero, implies SUCCESS. */ dims[0] = dims[1] = m = n = k = N-2; g_A = NGA_Create(data_type, 2, dims, "array A_", NULL); g_B = GA_Duplicate(g_A, "array B_"); g_C = GA_Duplicate(g_A, "array C_"); if(!g_A || !g_B || !g_C) GA_Error("Create failed: A, B or C",n); GA_Fill(g_A, value1); GA_Fill(g_B, value2); GA_Zero(g_C); gStart = MP_TIMER(); switch (data_type) { case C_FLOAT: GA_Sgemm('N', 'N', m, n, k, alpha_flt, g_A, g_B, beta_flt, g_C); beta_flt = -1.0; break; case C_DBL: GA_Dgemm('N', 'N', m, n, k, alpha_dbl, g_A, g_B, beta_dbl, g_C); beta_dbl = -1.0; break; case C_DCPL: GA_Zgemm('N', 'N', m, n, k, alpha_dcpl, g_A, g_B, beta_dcpl, g_C); beta_dcpl.real = -1.0; break; case C_SCPL: GA_Cgemm('N', 'N', m, n, k, alpha_scpl, g_A, g_B, beta_scpl, g_C); beta_scpl.real = -1.0; break; default: GA_Error("wrong data type", data_type); } gTime += MP_TIMER()-gStart; GA_Destroy(g_B); clo[0] = clo[1] = 0; chi[0] = chi[1] = N-3; NGA_Copy_patch('N', g_c, lo, hi, g_A, clo, chi) ; GA_Add(alpha, g_A, beta, g_C, g_C); /* NGA_Add_patch (alpha, g_c, lo, hi, beta, g_C, clo, chi, g_C, clo, chi);*/ switch (data_type) { case C_FLOAT: value1_flt = GA_Fdot(g_C, g_C); if(fabsf(value1_flt) > TOLERANCE) { printf("\nabs(result) = %f > %f\n", fabsf(value1_flt), TOLERANCE); GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 1); } break; case C_DBL: value1_dbl = GA_Ddot(g_C, g_C); if(fabs(value1_dbl) > TOLERANCE) { printf("\nabs(result) = %f > %f\n", fabs(value1_dbl), TOLERANCE); GA_Error("GA_Dgemm, NGA_Matmul_patch Failed", 1); } break; case C_DCPL: value1_dcpl = GA_Zdot(g_C, g_C); if(fabs(value1_dcpl.real) > TOLERANCE || fabs(value1_dcpl.imag) > TOLERANCE) { printf("\nabs(result) = %f+%fi > %f\n", fabs(value1_dcpl.real), fabs(value1_dcpl.imag), TOLERANCE); GA_Error("GA_Zgemm, NGA_Matmul_patch Failed", 1); } break; case C_SCPL: value1_scpl = GA_Cdot(g_C, g_C); if(fabsf(value1_scpl.real) > TOLERANCE || fabsf(value1_scpl.imag) > TOLERANCE) { printf("\nabs(result) = %f+%fi > %f\n", fabsf(value1_scpl.real), fabsf(value1_scpl.imag), TOLERANCE); GA_Error("GA_Sgemm, NGA_Matmul_patch Failed", 1); } break; default: GA_Error("wrong data type", data_type); } if(me==0) printf("....OK\n"); GA_Destroy(g_A); GA_Destroy(g_c); GA_Destroy(g_C); } void do_work() { int i; int me = GA_Nodeid(); for(i=2; i<=GA_MAX_DIM; i++) { test(C_FLOAT, i); test(C_DBL, i); test(C_DCPL, i); test(C_SCPL, i); if(me == 0) printf("\n\n"); GA_Sync(); } } int main(int argc, char **argv) { Integer heap=9000000, stack=9000000; int me, nproc; DoublePrecision time; MP_INIT(argc,argv); GA_INIT(argc,argv); /* initialize GA */ nproc = GA_Nnodes(); me = GA_Nodeid(); if(me==0) printf("Using %d processes\n\n",nproc); if(!MA_init((Integer)MT_F_DBL, stack/nproc, heap/nproc)) GA_Error("MA_init failed bytes= %d",stack+heap); #ifdef PERMUTE { int i, *list = (int*)malloc(nproc*sizeof(int)); if(!list)GA_Error("malloc failed",nproc); for(i=0; i/dev/null end foreach m ( `ipcs -m | awk '{ if( int($2) != "0") { print $2 } }'` ) ipcrm shm $m >/dev/null end else ipcrm `ipcs | awk '{if (($1 == "m") || ($1 == "s")) print sprintf("-%s %s",$1,$2) }'` endif # show what is left ipcs ga-5-4/global/testing/testspd.F0000644000175000017500000006370612662210460014555 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: testspd.F,v 1.8 2004-11-12 22:19:10 edo Exp $ c*********************************************************************** c* Source : testllt c* Scope : test LLT SCALAPACK routines c* c* 04/12/96 GVT First Implementation c* Giuseppe Vitillaro peppe@unipg.it c*********************************************************************** #define SIZE 100 #define UPLO 'L' #define TRESH 3.d0 #define ga_dnormF(g_a) sqrt(ga_ddot(g_a, g_a)) #define BLOCK_CYCLIC 0 c*********************************************************************** c* Program: testllt c*********************************************************************** program testllt implicit none #include "mafdecls.fh" #include "global.fh" c**** integer nproc integer hsize, ssize c c*** Intitialize a message passing library c #include "mp3.fh" c c**** Initialize GA package call ga_initialize() c c**** get number of nodes and calculate memory allocation hsize = 6*SIZE*SIZE + 3*SIZE ssize = 3*SIZE*SIZE + 3*SIZE nproc=ga_nnodes() hsize = (hsize/nproc) + 1 ssize = (ssize/nproc) + 1 + 3*256*256 c**** Initialize MA package if (.not. ma_init(MT_DBL, ssize, hsize)) $ call ga_error("ma init failed",ssize+hsize) c**** Do Core Tests call ctests(UPLO) c**** Exit from the GA package call ga_terminate() c call MP_FINALIZE() end c*********************************************************************** c* subroutine: infos c* print informations about this run c*********************************************************************** subroutine infos(me, nproc, uplo, eps) implicit none #include "mafdecls.fh" #include "global.fh" c**** integer me integer nproc character*1 uplo double precision eps c**** if (me.eq.0) then print *, ' ' print *, 'Number of nodes : ', nproc print *, 'Problem size : ', SIZE print *, 'Uplo : ', uplo print *, 'Epsilon : ', eps call ffflush(6) endif return end c*********************************************************************** c* subroutine: thead c* emit test header output c*********************************************************************** subroutine thead(header) implicit none #include "mafdecls.fh" #include "global.fh" c**** character*(*) header c**** integer me me = ga_nodeid() if (me.eq.0) then print *, ' ' print *, '> ', header, ' ' call ffflush(6) endif return end c*********************************************************************** c* subroutine: dthtest c* test a double precision against the THRESH parameter c*********************************************************************** subroutine dthtest(msg, dval) implicit none #include "mafdecls.fh" #include "global.fh" c**** character*(*) msg double precision dval c**** integer me me = ga_nodeid() if (me.eq.0) then print *, ' ', msg, dval, ' ' if (dval.lt.TRESH) then print *, '> success ' else print *, '> failure ' endif call ffflush(6) endif return end c*********************************************************************** c* subrotine: stest c* test solver result c*********************************************************************** subroutine stest(irc, ierc) implicit none #include "mafdecls.fh" #include "global.fh" c**** integer irc integer ierc c**** integer me me = ga_nodeid() if (me.eq.0) then if (irc.eq.0) then print *, '> LLT ' elseif (irc.gt.0) then print *, '> LU ' endif if (irc.eq.ierc .or. (irc.gt.0 .and. ierc.gt.0)) then print *, '> success: expected factorization' else print *, '> failure: not expected factorization',irc,ierc endif call ffflush(6) endif return end c*********************************************************************** c* subroutine: emsg c* error message c*********************************************************************** subroutine emsg(msg, ival) implicit none #include "mafdecls.fh" #include "global.fh" c**** character*(*) msg integer ival c**** integer me me = ga_nodeid() if (me.eq.0) then print *, ' >>> ', msg, ival, ' ' print *, '> failure ' call ffflush(6) endif return end c*********************************************************************** c* subroutine: ctests c* do coretests for LLT Cholesky factorization, solver c*********************************************************************** subroutine ctests(uplo) implicit none #include "mafdecls.fh" #include "global.fh" integer ga_cholesky external ga_cholesky c**** character*1 uplo c**** integer n parameter (n=SIZE) external ga_llt_f, ga_llt_s, ga_llt_i integer ga_llt_f, ga_llt_i double precision A(n,n), X(n,n) integer g_A, g_B, g_X, g_Y integer g_A1, g_X1, g_Y1, g_Y2 #if BLOCK_CYCLIC integer g_AA, g_BB, g_CC, g_YY, g_ZZ integer dims(2), proc_grid(2), block(2) integer g1, g2 #endif integer hsA integer i, j integer nproc, me double precision buf(n) double precision dnA, dnX, dnX1, dnY1, dnS, dnF, dnI integer irc double precision eps, dlamch eps = dlamch('p') nproc = ga_nnodes() me = ga_nodeid() call infos(me, nproc, uplo, eps) c**************************************** c* Initialize tests variables c* Generate a Lower triangula matrix c* with large positive diagonal elements c* so the LU decomposition will be c* just this matrix c**************************************** c**** Initialize local arrays A, X c**** they are local copies of the corrispondent c**** global arrays do j = 1, n do i = 1, n X(i,j) = dsin(1.d0 * (i * j)) A(i,j) = 0.d0 if (i.gt.j) then A(i,j) = dsin(1.d0 * (i + j)) endif if (i.eq.j) then A(i,j) = SIZE*dabs(dsin(10.d0 * i)) endif end do ! i end do ! j c**** Create global arrays #if BLOCK_CYCLIC if (me.eq.0) then write(6,*) '*' write(6,*) '* Creating Block-Cyclic Arrays' write(6,*) '*' endif dims(1) = n dims(2) = n block(1) = 64 block(2) = 64 call factor(nproc,g1,g2) proc_grid(1) = g1 proc_grid(2) = g2 g_A = ga_create_handle() call ga_set_data(g_A,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_A,block,proc_grid) if (.not.ga_allocate(g_A)) & call ga_error(' ga_create A failed ', 2) g_B = ga_create_handle() call ga_set_data(g_B,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_B,block,proc_grid) if (.not.ga_allocate(g_B)) & call ga_error(' ga_create B failed ', 2) g_A1 = ga_create_handle() call ga_set_data(g_A1,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_A1,block,proc_grid) if (.not.ga_allocate(g_A1)) & call ga_error(' ga_create A1 failed ', 2) g_X = ga_create_handle() call ga_set_data(g_X,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_X,block,proc_grid) if (.not.ga_allocate(g_X)) & call ga_error(' ga_create X failed ', 2) g_X1 = ga_create_handle() call ga_set_data(g_X1,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_X1,block,proc_grid) if (.not.ga_allocate(g_X1)) & call ga_error(' ga_create X1 failed ', 2) g_AA = ga_create_handle() call ga_set_data(g_AA,2,dims,MT_DBL) if (.not.ga_allocate(g_AA)) & call ga_error(' ga_create AA failed ', 2) g_BB = ga_create_handle() call ga_set_data(g_BB,2,dims,MT_DBL) if (.not.ga_allocate(g_BB)) & call ga_error(' ga_create BB failed ', 2) g_CC = ga_create_handle() call ga_set_data(g_CC,2,dims,MT_DBL) if (.not.ga_allocate(g_CC)) & call ga_error(' ga_create CC failed ', 2) dims(2) = 1 g_Y = ga_create_handle() call ga_set_data(g_Y,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_Y,block,proc_grid) if (.not.ga_allocate(g_Y)) & call ga_error(' ga_create Y failed ', 2) g_Y1 = ga_create_handle() call ga_set_data(g_Y1,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_Y1,block,proc_grid) if (.not.ga_allocate(g_Y1)) & call ga_error(' ga_create Y1 failed ', 2) g_Y2 = ga_create_handle() call ga_set_data(g_Y2,2,dims,MT_DBL) call ga_set_block_cyclic_proc_grid(g_Y2,block,proc_grid) if (.not.ga_allocate(g_Y2)) & call ga_error(' ga_create Y1 failed ', 2) g_YY = ga_create_handle() call ga_set_data(g_YY,2,dims,MT_DBL) if (.not.ga_allocate(g_YY)) & call ga_error(' ga_create YY failed ', 2) g_ZZ = ga_create_handle() call ga_set_data(g_ZZ,2,dims,MT_DBL) if (.not.ga_allocate(g_ZZ)) & call ga_error(' ga_create YY failed ', 2) #else if (.not. ga_create(MT_DBL, n, n, 'A', 1, 1, g_A)) & call ga_error(' ga_create A failed ', 2) if (.not. ga_create(MT_DBL, n, n, 'B', 1, 1, g_B)) & call ga_error(' ga_create B failed ', 2) if (.not. ga_create(MT_DBL, n, n, 'A1', 1, 1, g_A1)) & call ga_error(' ga_create A1 failed ', 2) if (.not. ga_create(MT_DBL, n, n, 'X', 1, 1, g_X)) & call ga_error(' ga_create X failed ', 2) if (.not. ga_create(MT_DBL, n, n, 'X1', 1, 1, g_X1)) & call ga_error(' ga_create X1 failed ', 2) if (.not. ga_create(MT_DBL, n, 1, 'Y', 1, 1, g_Y)) & call ga_error(' ga_create Y failed ', 2) if (.not. ga_create(MT_DBL, n, 1, 'Y1', 1, 1, g_Y1)) & call ga_error(' ga_create Y1 failed ', 2) if (.not. ga_create(MT_DBL, n, 1, 'Y2', 1, 1, g_Y2)) & call ga_error(' ga_create Y2 failed ', 2) #endif c**** Fill in arrays A, X do j = me+1, n, nproc call ga_put(g_A, 1, n, j, j, A(1,j), n) call ga_put(g_X, 1, n, j, j, X(1,j), n) end do ! j c**** Create A, B, Y c**** It is granted that A, B, Y will not change c**** during the execution of the test LLT driver c**** B = A * A^ #if BLOCK_CYCLIC call ga_copy(g_A, g_AA) call ga_dgemm('N', 'T', n, n, n, 1.d0, g_AA, g_AA, 0.d0, g_BB) call ga_copy(g_BB, g_B) #else call ga_dgemm('N', 'T', n, n, n, 1.d0, g_A, g_A, 0.d0, g_B) #endif c**** A = B = A * A^ call ga_copy(g_B, g_A) c**** B = A * X #if BLOCK_CYCLIC call ga_copy(g_A, g_AA) call ga_copy(g_X, g_CC) call ga_dgemm('N', 'N', n, n, n, 1.d0, g_AA, g_CC, 0.d0, g_BB) call ga_copy(g_BB,g_B) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, g_A, g_X, 0.d0, g_B) #endif c**** Copy B(1:n,1:1) to Y(1:n) so Y will X column 1 call ga_copy_patch('N', g_B, 1, n, 1, 1, g_Y, 1, n, 1, 1) c**** dnA = ||A|| dnA = ga_dnormF(g_A) c**************************************************** c Test Cholesky factorization external interface c**************************************************** call thead("Test Cholesky factorization") c**** copy A in X call ga_copy(g_A, g_X) c**** call Cholesky factorization routine in ScaLAPACK PDPOTRF c**** to obtain an LL'/U'U factorization (external interface) irc = ga_cholesky(uplo, g_X) c**** if return code 'zero' is OK if (irc.eq.0) then c**** A1 = X * X^ or A1 = X^ * X if (uplo.eq.'L') then #if BLOCK_CYCLIC call ga_copy(g_X, g_CC) call ga_dgemm('N', 'T', n, n, n, 1.d0, g_CC, g_CC, 0.d0, g_AA) call ga_copy(g_AA, g_A1) #else call ga_dgemm('N', 'T', n, n, n, 1.d0, g_X, g_X, 0.d0, g_A1) #endif else #if BLOCK_CYCLIC call ga_copy(g_X, g_CC) call ga_dgemm('T', 'N', n, n, n, 1.d0, g_CC, g_CC, 0.d0, g_AA) call ga_copy(g_AA, g_A1) #else call ga_dgemm('T', 'N', n, n, n, 1.d0, g_X, g_X, 0.d0, g_A1) #endif endif c**** A1 = A - A1 = A - X * X^ or A1 = A - A1 = A - X^ * X call ga_add(1.0d0, g_A1, -1.0d0, g_A, g_A1) c**** dnF = ||A - A1*A1^|| / (||A|| * N * eps) : SHAPE L c**** dnF = ||A - A1^*A1|| / (||A|| * N * eps) : SHAPE U dnF = ga_dnormF(g_A1) / (dnA * n * eps) if (uplo.eq.'L') then call dthtest("||LL' - A|| / (||A|| * N * eps) =", dnF) else call dthtest("||U'U - A|| / (||A|| * N * eps) =", dnF) endif c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky factorization and solver c internal interfaces with a NxN RHS array c**************************************************** call thead("Test II Cholesky solver with a NxN RHS array") c**** call Cholesky factorization routine in ScaLAPACK PDPOTRF c**** to obtain an LL'/U'U factorization c**** (internal interface: it will not destroy A) #if BLOCK_CYCLIC call ga_copy(g_A, g_AA) #endif hsA = 0 irc = ga_llt_f(uplo, g_A, hsA) c**** if return code from ga_llt_f is zero if (irc.eq.0) then c**** copy B in X call ga_copy(g_B, g_X) c**** call Cholesky solver routine in ScaLAPACK PDPOTRS c**** internal interface with an NxN RHS GA call ga_llt_s(uplo, g_A, g_X, hsA) c**** A1 = A * X #if BLOCK_CYCLIC call ga_copy(g_X, g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC,g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_A, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - B = A * X - B call ga_add(1.d0, g_A1, -1.d0, g_B, g_A1) c**** dnX = ||X|| dnX = ga_dnormF(g_X) c**** dnS = ||AX - B|| / (||A|| * ||X|| * N * eps) dnS = ga_dnormF(G_A1) / (dnA * dnX * n * eps) call dthtest("||A*X - B||/(||A||*||X||*n*eps) =", dnS) c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky factorization and solver c internal interfaces with a single vector RHS c**************************************************** call thead("Test II Cholesky solver with a single vector RHS") c**** call Cholesky factorization routine in ScaLAPACK PDPOTRF c**** to obtain an LL'/U'U factorization c**** (internal interface: it will not destroy A) #if BLOCK_CYCLIC call ga_copy(g_AA, g_A) #endif hsA = 0 irc = ga_llt_f(uplo, g_A, hsA) c**** if return code from ga_llt_f is zero if (irc.eq.0) then c**** copy Y in Y1 call ga_copy(g_Y, g_Y1) c**** call Cholesky solver routine in ScaLAPACK PDPOTRS c**** internal interface with a single vector RHS call ga_llt_s(uplo, g_A, g_Y1, hsA) c**** dnY1 = ||Y1|| dnY1 = ga_dnormF(g_Y1) c**** Y1 = A * Y1 #if BLOCK_CYCLIC call ga_copy(g_Y1, g_YY) call ga_dgemm('N', 'N', n, 1, n, 1.d0, & g_AA, g_YY, 0.d0, g_ZZ) call ga_copy(g_ZZ,g_Y2) #else call ga_dgemm('N', 'N', n, 1, n, 1.d0, & g_A, g_Y1, 0.d0, g_Y2) #endif c**** Y1 = Y1 - Y = A * Y1 - Y call ga_add(1.d0, g_Y2, -1.d0, g_Y, g_Y1) c**** dnS = ||AY1 - Y|| / (||A|| * ||Y1|| * N * eps) dnS = ga_dnormF(G_A1) / (dnA * dnY1 * n * eps) call dthtest("||A*X - V||/(||A||*||X||*n*eps) =", dnS) c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky solver with a NxN RHS array c**************************************************** call thead("Test EI Cholesky solver with a NxN RHS array") c**** copy B in X call ga_copy(g_B, g_X) c**** call Cholesky L/U solver with a NxN RHS #if BLOCK_CYCLIC call ga_copy(g_AA,g_A) #endif irc = ga_llt_solve(g_A, g_X) c**** if return code from ga_llt_solve is zero if (irc.eq.0) then c**** A1 = A * X #if BLOCK_CYCLIC call ga_copy(g_X,g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC,g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_A, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - B = A * X - B call ga_add(1.d0, g_A1, -1.d0, g_B, g_A1) c**** dnX = ||X|| dnX = ga_dnormF(g_X) c**** dnS = ||AX - B|| / (||A|| * ||X|| * N * eps) dnS = ga_dnormF(G_A1) / (dnA * dnX * n * eps) call dthtest("||A*X - B||/(||A||*||X||*n*eps) =", dnS) c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky solver with a single vector RHS c**************************************************** call thead("Test EI Cholesky solver with a single vector RHS") c**** copy Y in Y1 call ga_copy(g_Y, g_Y1) c**** call Cholesky L/U solver with a single vector RHS #if BLOCK_CYCLIC call ga_copy(g_AA,g_A) #endif irc = ga_llt_solve(g_A, g_Y1) c**** if return code from ga_llt_solve is zero if (irc.eq.0) then c**** dnY1 = ||Y1|| dnY1 = ga_dnormF(g_Y1) c**** Y1 = A * Y1 #if BLOCK_CYCLIC call ga_copy(g_Y1,g_YY) call ga_dgemm('N', 'N', n, 1, n, 1.d0, & g_AA, g_YY, 0.d0, g_ZZ) call ga_copy(g_ZZ,g_Y2) #else call ga_dgemm('N', 'N', n, 1, n, 1.d0, & g_A, g_Y1, 0.d0, g_Y2) #endif c**** Y1 = Y1 - Y = A * Y1 - Y call ga_add(1.d0, g_Y2, -1.d0, g_Y, g_Y1) c**** dnS = ||AY1 - Y|| / (||A|| * ||Y1|| * N * eps) dnS = ga_dnormF(G_A1) / (dnA * dnY1 * n * eps) call dthtest("||A*X - V||/(||A||*||X||*n*eps) =", dnS) c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky factorization and inversion c internal interfaces c**************************************************** call thead("Test II inversion of an SPD matrix") c**** copy A in X #if BLOCK_CYCLIC call ga_copy(g_AA, g_A) #endif call ga_copy(g_A, g_X) c**** call Cholesky factorization routine in ScaLAPACK PDPOTRF c**** to obtain an LL'/U'U factorization c**** (internal interface: it will not destroy X1) hsA = 0 irc = ga_llt_f(uplo, g_X, hsA) c**** if return code from ga_llt_f is zero if (irc.eq.0) then c**** call Cholesky inversion routine in ScaLAPACK PDPOTRI c**** internal interface irc = ga_llt_i(uplo, g_X, hsA) c**** if the inversion could be done if (irc.eq.0) then c**** dnX = ||X|| = ||invA|| dnX = ga_dnormF(g_X) c**** A1 = A * X = A * invA #if BLOCK_CYCLIC call ga_copy(g_X,g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC,g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_A, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - I = A * invA - I do j = me+1, n, nproc call ga_get(g_A1, j, j, j, j, buf, 1) buf(1) = buf(1) - 1.d0 call ga_put(g_A1, j, j, j, j, buf, 1) end do ! j c**** dnI = ||A*invA - I|| / (||A| * ||invA|| * N * eps) dnI = ga_dnormF(g_A1) / (dnA * dnX * n * eps) call dthtest('||A*invA - I||/(||A||*||invA||*n*eps) =', & dnI) else c**** otherwise if the ga_llt_i return code is > 0 call emsg('there is a zero diagonal element:', irc) endif c**** if return code is > 0 else call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c Test Cholesky inversion c**************************************************** call thead("Test inversion of an SPD matrix") c**** copy A in X #if BLOCK_CYCLIC call ga_copy(g_AA, g_A) #endif call ga_copy(g_A, g_X) c**** call Cholesky L/U inversion irc = ga_spd_invert(g_X) c**** if return code from ga_spd_invert is zero if (irc.eq.0) then c**** dnX = ||X|| = ||invA|| dnX = ga_dnormF(g_X) c**** A1 = A * X = A * invA #if BLOCK_CYCLIC call ga_copy(g_X, g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC, g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_A, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - I = A * invA - I do j = me+1, n, nproc call ga_get(g_A1, j, j, j, j, buf, 1) buf(1) = buf(1) - 1.d0 call ga_put(g_A1, j, j, j, j, buf, 1) end do ! j c**** dnI = ||A*invA - I|| / (||A|| * ||invA|| * N * eps) dnI = ga_dnormF(g_A1) / (dnA * dnX * n * eps) call dthtest('||A*invA - I||/(||A||*||invA||*n*eps) =', & dnI) c**** if return code is < 0 elseif (irc.lt.0) then call emsg('there is a zero diagonal element:', irc) c**** if return code is > 0 elseif (irc.gt.0) then call emsg('It is not positive definite the minor of order:', & irc) endif c**************************************************** c* Test general solver with a NxN RSH c* simmetric positive definite array c**************************************************** call thead( & 'Test solver for a symmetric P.D. matrix and NxN RHS' & ) c**** copy B in X call ga_copy(g_B, g_X) c**** call general solver with a NxN RHS p.d. symmetric array #if BLOCK_CYCLIC call ga_copy(g_AA, g_A) #endif irc = ga_solve(g_A, g_X) c**** A1 = A * X #if BLOCK_CYCLIC call ga_copy(g_X, g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC, g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_A, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - B = A * X - B call ga_add(1.d0, g_A1, -1.d0, g_B, g_A1) c**** dnX = ||X|| dnX = ga_dnormF(g_X) c**** dnS = ||AX - B|| / (||A|| * ||X|| * N * eps) dnS = ga_dnormF(G_A1) / (dnA * dnX * n * eps) call dthtest("||A*X - B||/(||A||*||X||*n*eps) =", dnS) call stest(irc, 0) c**************************************************** c* Test general solver with a NxN RSH c* simmetric non positive definite array c**************************************************** call thead( & 'Test solver for a symmetric NON P.D. matrix and NxN RHS') c**** copy B on X1 call ga_copy(g_B, g_X1) c**** and now symmetrize X1 c**** so we obtain a symmetric matrix in X1 call ga_symmetrize(g_X1) c**** copy B in X call ga_copy(g_B, g_X) c**** call general solver with a NxN RHS symmetric array #if BLOCK_CYCLIC call ga_copy(g_X1, g_BB) irc = ga_solve(g_BB, g_X) #else irc = ga_solve(g_X1, g_X) #endif c**** dnX1 = ||X1|| dnX1 = ga_dnormF(g_X1) c**** dnX = ||X|| dnX = ga_dnormF(g_X) c**** A1 = X1 * X #if BLOCK_CYCLIC call ga_copy(g_X1,g_AA) call ga_copy(g_X,g_BB) call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_AA, g_BB, 0.d0, g_CC) call ga_copy(g_CC,g_A1) #else call ga_dgemm('N', 'N', n, n, n, 1.d0, & g_X1, g_X, 0.d0, g_A1) #endif c**** A1 = A1 - B = X1 * X - B call ga_add(1.d0, g_A1, -1.d0, g_B, g_A1) c**** dnS = ||X1*X - B|| / (||X1|| * ||X|| * N * eps) dnS = ga_dnormF(G_A1) / (dnX1 * dnX * n * eps) call dthtest("||A*X - B||/(||A||*||X||*n*eps) =", dnS) call stest(irc, 1) c**************************************************** c CTESTS exit code c**************************************************** c**** just print a newline and return if (me.eq.0) then print *, ' ' endif return end #if BLOCK_CYCLIC subroutine factor(p,idx,idy) implicit none integer i,j,p,idx,idy,it integer ip,ifac,pmax,prime(1280) integer fac(1280) c i = 1 ip = p c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine two factors of p of approximately the c same size c idx = 1 idy = 1 do i = ifac, 1, -1 if (idx.le.idy) then idx = fac(i)*idx else idy = fac(i)*idy endif end do return end #endif ga-5-4/global/testing/ghosts.F0000644000175000017500000005641212662210457014400 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: ghosts.F,v 1.1.2.1 2007-05-07 19:02:02 d3g293 Exp $ c vector boxes lack arithmetic precision #ifdef CRAY_YMP # define THRESH 1d-10 # define THRESHF 1e-5 #elif defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 1e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF #define USE_CORNERS #define PRINT_VAL c#define NEW_API c c Add some control over which tests are performed c #define TEST_1 #define TEST_2 #define TEST_3 #define TEST_4 c#define TEST_5 #define TEST_6 #define TEST_7 program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me, nproc integer inode,proclist(100),i,j,nprocs integer proc_group(0:100), my_proc_group, grp, num_grp integer midnode, splitnode, color, key logical status parameter (heap=2000*2000*4, fudge=2000, stack=2000*2000) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c c*** Initialize the MA package c MA must be initialized before any global array is allocated c ma_heap = heap + fudge status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c c we can also use GA_set_memory_limit BEFORE first ga_create call c call GA_set_memory_limit(util_mdtob(ma_heap)) c c*** Create process groups on SMP nodes c #if 1 midnode = nproc/2 do i = 1, midnode proclist(i) = i-1 end do nprocs = midnode proc_group(0) = ga_pgroup_create(proclist, nprocs) do i = midnode+1, nproc proclist(i-midnode) = i-1 end do nprocs = nproc - midnode proc_group(1) = ga_pgroup_create(proclist, nprocs) c call ga_pgroup_set_default(proc_group(inode)) if (me.lt.midnode) then call ga_pgroup_set_default(proc_group(0)) call runtest endif call ga_pgroup_set_default(ga_pgroup_get_world()) call ga_sync() if (me.ge.midnode) then call ga_pgroup_set_default(proc_group(1)) call runtest endif #else c split into 2 equal groups if(me.eq.0) then print *,' ************* Testing ga_pgroup_split ************ ' call ffflush(6) endif num_grp = 2 grp = ga_pgroup_get_default() my_proc_group = ga_pgroup_split(grp, num_grp) call ga_pgroup_set_default(my_proc_group) call runtest c reset to world group call ga_pgroup_set_default(ga_pgroup_get_world()) call ga_sync() c split into 2 irregular groups (33:67) if(me.eq.0) then print *,' ********* Testing ga_pgroup_split_irreg *********** ' call ffflush(6) endif num_grp = 2 grp = ga_pgroup_get_default() splitnode = nproc/3 if(me.lt.splitnode) then color=0 else color=1 endif my_proc_group = ga_pgroup_split_irreg(grp, color) call ga_pgroup_set_default(my_proc_group) if(me.lt.splitnode) then call runtest endif call ffflush(6) call ga_sync() if(me.ge.splitnode) then call runtest endif #endif call ga_pgroup_set_default(ga_pgroup_get_world()) c c*** Check if memory limits are enforced c c call check_mem(util_mdtob(ma_heap*ga_nnodes())) c c*** Tidy up the GA package c call ga_sync() c if(ga_nodeid().eq.0) print *,'All tests successful ' c write(6,*) 'Calling ga_terminate' call ga_terminate() c*** Tidy up after message-passing library c call MP_FINALIZE() c stop end subroutine runtest implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me integer nmax, DIM, nwidth, MAXPROC, nloop parameter (nmax = 1000, DIM = 2, nwidth = 2, MAXPROC = 2000) parameter (nloop = 50) integer ndim, nproc, pdims(7), type, dcnt, g_a, maxval integer i, j, dims(7), width(7), map(2*nmax) integer lo(7), hi(7), ld(7) integer lo2(7), hi2(7), ld2(7) integer dims3(7), ld3(7), chunk(7) integer a(nmax, nmax), b(nmax+2*nwidth,nmax+2*nwidth) double precision start,t1,t2,t3,t4,t5,tmp double precision t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18 double precision t19,t20,t21,t22,t23,t24 logical status, safe_put, safe_get, has_data(0:MAXPROC-1) logical corner_flag GA_ACCESS_INDEX_TYPE index3 #ifdef USE_CORNERS corner_flag = .true. #else corner_flag = .false. #endif c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c nproc = ga_nnodes() me = ga_nodeid() c if(me.eq.0)then print *, 'using ', nproc, ' process(es)' call ffflush(6) endif c c Test ghost distributions c ndim = DIM c c Create irregular distribution on all nodes c call factor(nproc,ndim,pdims) dims(1) = pdims(1) * nmax dims(2) = pdims(2) * nmax maxval = 1 do i = 1, ndim maxval = dims(i)*maxval end do maxval = maxval - 1 c dcnt = 1 do i = 1, pdims(1) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do do i = 1, pdims(2) map(dcnt) = (i-1)*nmax + 1 dcnt = dcnt + 1 end do c do i = 1, ndim width(i) = nwidth chunk(i) = 1 if (pdims(i).gt.dims(i)) pdims(i) = dims(i) if (me.eq.0) then write(6,*) 'Value of pdims(',i,') is ',pdims(i) endif call ffflush(6) c do j = 1, pdims(i) c if (j.eq.1) then c map(dcnt) = 1 c else c map(dcnt) = ((j-1)*dims(i))/pdims(i) + 1 c endif c dcnt = dcnt + 1 c end do ld(i) = nmax end do if (me.eq.0) then do i = 1, dcnt - 1 write(6,'("map(",i2,") = ",i5)') i,map(i) call ffflush(6) end do endif type = MT_INT #ifdef NEW_API g_a = ga_create_handle(); call ga_set_data(g_a,ndim,dims,type) call ga_set_array_name(g_a,"test_array") call ga_set_irreg_distr(g_a,map,pdims) call ga_set_ghosts(g_a,width) status = ga_allocate(g_a) #else status = nga_create_ghosts_irreg (type, ndim, dims, width, + "test_array", map, pdims, g_a) c status = nga_create_ghosts(type, ndim, dims, width, c + "test_array", chunk, g_a) #endif if (status.and.me.eq.0) then write(6,*) '*' write(6,*) '* Global array creation was successful' write(6,*) '*' elseif (.not.status) then write(6,*) 'Global array creation failure on ',me endif c c Find processors that have data c call ga_sync do i = 0, nproc-1 call nga_distribution(g_a, i, lo, hi) has_data(i) = .true. do j = 1, ndim if (lo(j).eq.0.and.hi(j).eq.-1) has_data(i) = .false. end do call ffflush(6) call ga_sync end do c c initialize g_a c call ga_sync call nga_distribution(g_a, me, lo, hi) do i = 1, hi(1) - lo(1) + 1 do j = 1, hi(2) - lo(2) + 1 a(i,j) = (i + lo(1) - 2)*dims(1) + (j + lo(2) - 2) end do end do safe_put = .true. do i = 1, ndim if (hi(i).lt.lo(i)) safe_put = .false. end do if (has_data(me).and.safe_put) call nga_put(g_a, lo, hi, a, ld) c c get patch with ghost cells c do i = 1, ndim lo2(i) = lo(i) - width(i) hi2(i) = hi(i) + width(i) ld2(i) = ld(i) + 2*width(i) end do call ga_sync call ffflush(6) safe_get = .true. c do i = 1, ndim c if (hi2(i)-lo2(i).ge.dims(i)) safe_get = .false. c end do t19 = 0.0d00 t20 = 0.0d00 t21 = 0.0d00 do i = 1, nloop start = util_timer() call ga_ghost_barrier t19 = t19 + util_timer() - start start = util_timer() if (has_data(me).and.safe_get) + call nga_periodic_get(g_a, lo2, hi2, b, ld2) t20 = t20 + util_timer() - start start = util_timer() call ga_ghost_barrier t21 = t21 + util_timer() - start end do t19 = t19/dble(nloop) t20 = t20/dble(nloop) t21 = t21/dble(nloop) 102 format(14i5) if (me.eq.0) then write(6,*) '*' write(6,*) '* Performing nga_access_ghosts' write(6,*) '*' call ffflush(6) endif if (has_data(me)) call nga_access_ghosts(g_a, dims3, + index3, ld3) call ga_sync #ifdef TEST_1 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 1' write(6,*) endif t1 = 0.0d00 t2 = 0.0d00 t3 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t1 = t1 + util_timer() - start start = util_timer() call ga_update1_ghosts(g_a) t2 = t2 + util_timer() - start start = util_timer() call ga_ghost_barrier t3 = t3 + util_timer() - start end do t1 = t1/dble(nloop) t2 = t2/dble(nloop) t3 = t3/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,1) call ga_sync #endif #ifdef TEST_2 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 2' write(6,*) endif t4 = 0.0d00 t5 = 0.0d00 t6 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t4 = t4 + util_timer() - start start = util_timer() status = ga_update2_ghosts(g_a) t5 = t5 + util_timer() - start start = util_timer() call ga_ghost_barrier t6 = t6 + util_timer() - start end do t4 = t4/dble(nloop) t5 = t5/dble(nloop) t6 = t6/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,2) call ga_sync #endif #ifdef TEST_3 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 3' write(6,*) endif t7 = 0.0d00 t8 = 0.0d00 t9 = 0.0d00 do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t7 = t7 + util_timer() - start start = util_timer() status = ga_update3_ghosts(g_a) t8 = t8 + util_timer() - start start = util_timer() call ga_ghost_barrier t9 = t9 + util_timer() - start end do t7 = t7/dble(nloop) t8 = t8/dble(nloop) t9 = t9/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,3) call ga_sync #endif #ifdef TEST_4 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 4' write(6,*) endif t10 = 0.0d00 t11 = 0.0d00 t12 = 0.0d00 call ga_sync call ga_set_ghost_corner_flag(g_a,corner_flag) c status = ga_set_update4_info(g_a) do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t10 = t10 + util_timer() - start start = util_timer() status = ga_update4_ghosts(g_a) t11 = t11 + util_timer() - start start = util_timer() call ga_ghost_barrier t12 = t12 + util_timer() - start end do t10 = t10/dble(nloop) t11 = t11/dble(nloop) t12 = t12/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,4) call ga_sync #endif #ifdef TEST_5 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 5' write(6,*) endif t13 = 0.0d00 t14 = 0.0d00 t15 = 0.0d00 call ga_sync call ga_set_ghost_corner_flag(g_a,corner_flag) c status = ga_set_update5_info(g_a) do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t13 = t13 + util_timer() - start start = util_timer() c write(6,*) 'got to ga_update5_ghosts' status = ga_update5_ghosts(g_a) c write(6,*) 'completed ga_update5_ghosts' t14 = t14 + util_timer() - start start = util_timer() call ga_ghost_barrier t15 = t15 + util_timer() - start end do t13 = t13/dble(nloop) t14 = t14/dble(nloop) t15 = t15/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,5) call ga_sync #endif #ifdef TEST_6 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 6' write(6,*) endif t16 = 0.0d00 t17 = 0.0d00 t18 = 0.0d00 call ga_sync do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t16 = t16 + util_timer() - start start = util_timer() status = ga_update6_ghosts(g_a) t17 = t17 + util_timer() - start start = util_timer() call ga_ghost_barrier t18 = t18 + util_timer() - start end do t16 = t16/dble(nloop) t17 = t17/dble(nloop) t18 = t18/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,6) call ga_sync #endif #ifdef TEST_7 if (me.eq.0) then write(6,*) write(6,*) 'Testing update 7' write(6,*) endif t22 = 0.0d00 t23 = 0.0d00 t24 = 0.0d00 call ga_sync do i = 1, nloop call zero_ghosts(int_mb(index3),ld3,a,hi(1)-lo(1)+1,width,dims3) start = util_timer() call ga_ghost_barrier t22 = t22 + util_timer() - start start = util_timer() status = ga_update7_ghosts(g_a) t23 = t23 + util_timer() - start start = util_timer() call ga_ghost_barrier t24 = t24 + util_timer() - start end do t22 = t22/dble(nloop) t23 = t23/dble(nloop) t24 = t24/dble(nloop) #ifdef PRINT_VAL if (maxval.lt.10000) + call aprint(int_mb(index3),dims3(1),dims3(2),ld3,has_data) #endif call atest(int_mb(index3),dims3(1),dims3(2),ld3,b, + nmax+2*width(1),has_data,width,corner_flag,7) call ga_sync #endif if (me.eq.0) then write(6,*) '*' write(6,*) '* Completed updates successfully' write(6,*) '*' call ffflush(6) endif call ga_sync c #ifdef TEST_1 tmp = t2 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 1,tmp/dble(nproc) endif tmp = t1 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t3 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_2 tmp = t5 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 2,tmp/dble(nproc) endif tmp = t4 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t6 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_3 tmp = t8 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 3,tmp/dble(nproc) endif tmp = t7 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t9 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_4 tmp = t11 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 4,tmp/dble(nproc) endif tmp = t10 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t12 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_5 tmp = t14 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 5,tmp/dble(nproc) endif tmp = t13 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t15 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_6 tmp = t17 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 6,tmp/dble(nproc) endif tmp = t16 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t18 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif #ifdef TEST_7 tmp = t23 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,300) 7,tmp/dble(nproc) endif tmp = t22 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t24 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif #endif tmp = t20 call ga_dgop(6,tmp,1,'+') if (me.eq.0) then write(6,310) tmp/dble(nproc) endif tmp = t19 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,400) tmp/dble(nproc) endif tmp = t21 call ga_dgop(3,tmp,1,'+') if (me.eq.0) then write(6,500) tmp/dble(nproc) endif 300 format('Average time for ga_update',i1,'_ghosts ',e12.3) 310 format('Average time for nga_periodic_get ',e12.3) 400 format(' Average time for prior sync ',e12.3) 500 format(' Average time for post sync ',e12.3) 127 continue c if(ga_nodeid().eq.0) print *,'All tests successful ' c return end c subroutine zero_ghosts(a,lda,b,ldb,w,dims) integer lda,ldb,w(*),dims(*) integer a(lda,*),b(ldb,*) integer i, j do j = 1, dims(2) do i = 1, dims(1) if ((i.gt.w(1).and.i.le.dims(1)-w(1)).and. + (j.gt.w(2).and.j.le.dims(2)-w(2))) then a(i,j) = b(i-w(1),j-w(2)) else a(i,j) = 0 endif end do end do return end c subroutine aprint(a,nrow,ncol,ld,has_data) #include "global.fh" integer ld integer a(ld,*) integer i, j, k, nproc logical has_data(0:1999) nproc = ga_nnodes() do k = 1, nproc call ga_sync if (k-1.eq.ga_nodeid().and.has_data(k-1)) then write(6,*) '*' write(6,*) '* Data on processor ',k-1 write(6,*) '*' do i = 1, min(nrow,12) write (6,102) (a(i,j), j = 1, min(ncol,12)) 102 format(14i5) end do endif call ffflush(6) enddo c return end c subroutine atest(a,nrow,ncol,ld,b,ld2,has_data,width, + check_corner, idx) #include "global.fh" integer ld, width(7) integer a(ld,*), b(ld2,*) integer i, j, nproc, me, idx logical has_data(0:1999), check_data logical check_corner nproc = ga_nnodes() me = ga_nodeid() check_data = .true. call ga_sync if (has_data(me)) then do i = 1, nrow do j = 1, ncol if (.not.check_corner.and.(.not. + ((i.le.width(1).and.j.le.width(2)).or. + (i.le.width(1).and.j.gt.ncol-width(2)).or. + (i.gt.nrow-width(1).and.j.le.width(2)).or. + (i.gt.nrow-width(1).and.j.gt.ncol-width(2))))) then if (a(i,j).ne.b(i,j)) check_data = .false. else if (check_corner) then if (a(i,j).ne.b(i,j)) check_data = .false. endif end do end do else check_data = .false. endif if (check_data) then i = 1 else i = 0 endif call ga_igop(1,i,1,'+') if (i.ne.nproc) then check_data = .false. else check_data = .true. endif if (check_data.and.me.eq.0) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is the same on' write(6,100) idx 100 format( ' * all processors for update ',i1) write(6,*) '*' else if (.not.check_data) then write(6,*) '*' write(6,*) '* Data from nga_access_ghosts and' write(6,*) '* nga_periodic_get is NOT the same on' write(6,200) me,idx 200 format( ' * processor ',i2,' for update ',i1) write(6,*) '*' endif call ffflush(6) c return end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(7),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end ga-5-4/global/testing/patch_enumc.c0000644000175000017500000000603512662210460015402 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "ga.h" #include "macdecls.h" #include "mp3.h" #define VERBOSE 0 #define NELEM 200000 #define test(MT,T,F) \ void test_##MT() \ { \ int g_a, lo[1], hi[1], ld[1], dims[1], chunk[1], i; \ T *buf, *get, start, inc; \ start = 1; \ inc = 1; \ lo[0] = 0; \ hi[0] = NELEM-1; \ dims[0] = NELEM; \ chunk[0] = 0; \ buf = (T*)malloc(sizeof(T) * NELEM); \ get = (T*)malloc(sizeof(T) * NELEM); \ g_a = NGA_Create(MT, 1, dims, "g_a", NULL); \ for (i=0; i<100; i++ ){ \ GA_Patch_enum(g_a, lo[0], hi[0], &start, &inc); \ } \ NGA_Get(g_a, lo, hi, get, ld); \ for (i=0; i #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define N 100 /* dimension of matrices */ int main( int argc, char **argv ) { int g_a, g_b, i, j, size, size_me; int icnt, idx, jdx, ld; int n=N, type=MT_C_INT; int *values, *ptr; int **indices; int dims[2]={N,N}; int lo[2], hi[2]; int heap=30000, stack=20000; int me, nproc; int datatype, elements; double *prealloc_mem; MP_INIT(argc,argv); GA_INIT(argc,argv); /* initialize GA */ me=GA_Nodeid(); nproc=GA_Nnodes(); if(me==0) { if(GA_Uses_fapi())GA_Error("Program runs with C array API only",1); printf("Using %ld processes\n",(long)nproc); fflush(stdout); } heap /= nproc; stack /= nproc; if(! MA_init(MT_C_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ /* Create a regular matrix. */ if(me==0)printf("Creating matrix A\n"); g_a = NGA_Create(type, 2, dims, "A", NULL); if(!g_a) GA_Error("create failed: A",n); if(me==0)printf("OK\n"); /* Fill matrix using scatter routines */ size = N*N; if (size%nproc == 0) { size_me = size/nproc; } else { i = size - size%nproc; size_me = i/nproc; if (me < size%nproc) size_me++; } /* Check that sizes are all okay */ i = size_me; GA_Igop(&i,1,"+"); if (i != size) GA_Error("Sizes don't add up correctly: ",i); /* Allocate index and value arrays */ indices = (int**)malloc(size_me*sizeof(int*)); values = (int*)malloc(size_me*sizeof(int)); icnt = me; for (i=0; i=N) printf("p[%d] bogus idx: %d icnt: %d\n",me,idx,icnt); if (jdx<0 || jdx>=N) printf("p[%d] bogus jdx: %d jcnt: %d\n",me,jdx,icnt); icnt += nproc; icnt = icnt%size; } /* Scatter values into g_a */ NGA_Scatter(g_a, values, indices, size_me); GA_Sync(); /* Check to see if contents of g_a are correct */ NGA_Distribution( g_a, me, lo, hi ); NGA_Access(g_a, lo, hi, &ptr, &ld); for (i=lo[0]; i Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_pgroup_sync(grp_id) do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0d0) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c inc = (n-1)/20 + 1 inc = n ij = 0 do j = 1, n, inc do i = 1, n, inc if (mod(ij,nproc) .eq. me) then ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) * write(6,4) me, ilo, ihi, jlo, jhi * 4 format(' node ',i2,' checking put ',4i4) * call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c call util_dfill(n*n, 0.0d0, b, 1) * call ga_print(g_a,1) call ga_get(g_a, 1, n, 1, n, b, n) * write(6,*) ' after get' * call output(b, 1, n, 1, n, n, n, 1) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_pgroup_sync(grp_id) c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_dfill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_pgroup_sync(grp_id) c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = drand(0) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = drand(0) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) if (mod(ij,nproc) .eq. me) then c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_pgroup_sync(grp_id) g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DBL) call ga_set_array_name(g_b,'b') call ga_set_pgroup(g_b,grp_id) if (.not.ga_allocate(g_b)) then call ga_error('ga_create failed for second array ',0) endif c call ga_zero(g_b) call ga_pgroup_sync(grp_id) call ga_acc(g_b, n/2, n/2, n/2, n/2, 1d0, 1, 1d0) call ga_pgroup_sync(grp_id) if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1d0*nproc) if(x.gt. 1d-10)then write(6,*)'val=',b(1,1),' expected=',nproc, x call ga_error('overlapping accumulate failed',0) endif if (me.eq.0) then write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif c c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = drand(0) a(i,j) = 0.1d0*a(i,j) + 0.9d0*b(i,j) enddo enddo if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) call ga_add(0.1d0, g_a, 0.9d0, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_pgroup_sync(grp_id) c c Check the ddot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking ddot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0d0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo if (me.eq.0) then call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_pgroup_sync(grp_id) sum2 = ga_ddot(g_a,g_b) if(MISMATCH(sum1, sum2))then write(6,*) ' ddot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' ddot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123d0) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123d0 if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif call ga_pgroup_sync(grp_id) c c Check the ga_copy function between two groups c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy between groups' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_w) call ga_get(g_w, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK from small group to big group' write(6,*) endif call ga_pgroup_sync(grp_id) call ga_zero(g_a) call ga_copy(g_w, g_a) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK from big group to small group' write(6,*) endif c c Test copy_patch c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy_patch between groups' write(6,*) call ffflush(6) endif c c klugy mechanism for zeroing g_w c call ga_zero(g_a) call ga_copy(g_a,g_w) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) c ilo = n/4+1 jlo = n/4+1 ihi = ilo + n/2 jhi = jlo + n/2 call ga_copy_patch('n',g_a,ilo,ihi,jlo,jhi,g_w,ilo,ihi,jlo,jhi) call ga_get(g_w, 1, n, 1, n, b, n) do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy_patch is OK from small group to big group' write(6,*) endif c call ga_zero(g_a) call ga_copy_patch('n',g_w,ilo,ihi,jlo,jhi,g_a,ilo,ihi,jlo,jhi) call ga_get(g_a, 1, n, 1, n, b, n) do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy_patch is OK from big group to small group' write(6,*) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_pgroup_sync(grp_id) itmp = iran(nproc)-1 if(me.eq.itmp) then #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo write(6,*) 'Calling ga_gather' call ga_gather(g_a, v, iv, jv, m) write(6,*) 'Completed ga_gather' do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo enddo call nga_gather(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo #endif endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_pgroup_sync(grp_id) if(me.eq.iran(ga_pgroup_nnodes(grp_id))-1) then #ifndef NGA_GATSCAT do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1d0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo #else do loop = 1,m ilo = iran(n) jlo = iran(n) ijv(1,loop) = ilo ijv(2,loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1d0 *(ilo+jlo) enddo call nga_scatter(g_a, v, ijv, m) do loop = 1,m ilo= ijv(1,loop) jlo= ijv(2,loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1d0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1d0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo #endif endif call ga_pgroup_sync(grp_id) enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_pgroup_sync(grp_id) c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_pgroup_sync(grp_id) do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) if (found(i,j, iv, jv, loop-1) ) goto 10 #ifndef NGA_GATSCAT iv(loop) = i jv(loop) = j #else ijv(1,loop) = i ijv(2,loop) = j #endif v(loop) = 1d0 *(i+j) b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array enddo #ifndef NGA_GATSCAT call ga_scatter_acc(g_a,v,iv,jv, ii,x) #else call nga_scatter_acc(g_a,v,ijv,ii,x) #endif c call ga_pgroup_sync(grp_id) c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii #ifndef NGA_GATSCAT i = iv(loop) j = jv(loop) #else i = ijv(1,loop) j = ijv(2,loop) #endif if(MISMATCH(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_pgroup_sync(grp_id) enddo call ga_pgroup_sync(grp_id) if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c return end c----------------------------------------------------------------- subroutine check_complex(grp_id) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m,grp_id parameter (n = 60) parameter (m = 2*n) double complex a(n,n), b(n,n), v(m),w(m) integer ndim, dims(2), chunk(2), p_mirror integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 128) double precision crap, real double precision nwords double complex x, sum1, sum2, factor integer lprocs, inode, iproc intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_pgroup_nnodes(grp_id) me = ga_pgroup_nodeid(grp_id) inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n a(i,j) = cmplx(dble(i-1), dble((j-1)*n)) b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_DCPL) call ga_set_array_name(g_a,'a') call ga_set_pgroup(g_a,grp_id) status = ga_allocate(g_a) if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_DCPL) call ga_set_array_name(g_b,'b') call ga_set_pgroup(g_b,grp_id) if (.not.ga_allocate(g_b)) then call ga_error('ga_create failed for second array ',0) endif call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) call ga_pgroup_sync(grp_id) c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_pgroup_sync(grp_id) do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc if (mod(ij,nproc) .eq. me) then ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c call util_qfill(n*n, (0d0,0d0), b, 1) call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_pgroup_sync(grp_id) c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_qfill(n*n, (0.0d0,0d0), b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_pgroup_sync(grp_id) c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0),drand(1)) b(i,j) = cmplx(dble(i),dble(j)) enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = cmplx(drand(0),0.333d0) c x = cmplx(0.333d0,0) * x = cmplx(0d0,0d0) x = 0 ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n if (mod(ij,nproc) .eq. me) then call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, (1d0,-1d0), 1, (1d0,0d0)) call ga_pgroup_sync(grp_id) if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, x, 1) if (MISMATCH(x, ((1d0,-1d0)*nproc)))then c if(error.gt. (1d-8))then write(6,*)'val=',x,' expected=(',nproc,',',-nproc,')' call ga_error('overlapping accumulate failed',0) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_pgroup_sync(grp_id) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif factor = (1d0,-1d0) call ga_scale(g_a, factor) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*factor if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check scatter&gather c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_pgroup_sync(grp_id) c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_pgroup_sync(grp_id) itmp = iran(nproc)-1 if(me.eq.itmp) then do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_pgroup_sync(grp_id) if(me.eq.iran(ga_nnodes())-1) then do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_pgroup_sync(grp_id) enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Check ga_add c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif call ga_get(g_a, 1, n, 1, n, a, n) crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) a(i,j) = (0.1d0,-.1d0)*a(i,j) + (.9d0,-.9d0)*b(i,j) enddo enddo if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) call ga_add((0.1d0,-.1d0), g_a, (0.9d0,-.9d0), g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (MISMATCH(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_pgroup_sync(grp_id) c c Check the zdot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking zdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = (0.0d0,0.d0) do j = 1, n do i = 1, n b(i,j) = cmplx(drand(0), drand(1)) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo if (me.eq.0) then call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_pgroup_sync(grp_id) sum2 = ga_zdot(g_a,g_b) if (MISMATCH(sum1, sum2))then write(6,*) ' zdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' zdot is OK ' write(6,*) endif c c Delete the global arrays c 123 continue status = ga_destroy(g_b) status = ga_destroy(g_a) c return end c----------------------------------------------------------------- subroutine check_int(grp_id) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,grp_id parameter (n = 128) integer a(n,n), b(n,n) logical status integer g_a integer iran, i, j, loop, nloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, dimi, dimj, ii, jj integer ndim, dims(2), chunk(2), p_mirror, nnodes integer lprocs, inode, iproc,lproc, nprocs double precision nwords parameter (nloop = 100) integer maxproc parameter (maxproc = 128) integer map(5,maxproc), found, np,k double precision crap, sum1, real integer buf, abs_me intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_pgroup_nnodes(grp_id) me = ga_pgroup_nodeid(grp_id) abs_me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n a(i,j) = i-1 + (j-1)*1000 enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_INT) call ga_set_array_name(g_a,'a') call ga_set_pgroup(g_a,grp_id) if (.not.ga_allocate(g_a)) then write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. 0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc if (mod(ij,nproc) .eq. me) then ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c if(me.eq.0)then call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo endif call ga_pgroup_sync(grp_id) c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_pgroup_sync(grp_id) c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_ifill(n*n, 0.0d0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif c call ga_pgroup_sync(grp_id) if (me .eq. 0 .and. n.gt.7) then write(6,*) write(6,*) '> Checking ga_print_patch --- should see ' write(6,*)' [2002 3002 4002 5002 6002]' write(6,*)' [2003 3003 4003 5003 6003]' write(6,*)' [2004 3004 4004 5004 6004]' write(6,*) call ffflush(6) endif if(n.gt.5) call ga_print_patch(g_a,3,5,3,7,0) c call ga_pgroup_sync(grp_id) c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*) '> Checking read_inc ... ' write(6,*) call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc inc =5 c every processor will be operating on somebody elses data c lproc = nproc - me - 1 c call ga_distribution(g_a,lproc,ilo,ihi,jlo,jhi) c dimi = ihi-ilo dimj = jhi-jlo write(6,111) me,ilo,ihi,jlo,jhi,dimi,dimj 111 format(i2,'..',4i8,'.',2i8) call ga_pgroup_sync(grp_id) if(ilo .gt.0 .and. jhi .gt. 0)then do loop = 1,nloop ii= IABS(iran(dimi)) jj= IABS(iran(dimj)) i=ilo + Mod(ii,dimi) j=jlo + Mod(jj,dimj) c c write(6,*) me,'..',ilo,ihi,jlo,jhi,'.',dimi,dimj,'..',i,j c call ffflush(6) buf = ga_read_inc(g_a,i,j,inc) if(a(i,j).ne. buf)then write(6,*)me,'READ_inc ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif call ga_get(g_a, i,i,j,j, buf,1) a(i,j) = a(i,j)+inc if(a(i,j).ne. buf)then write(6,*)me,'read_INC ', i,',',j,',', a(i,j),' ',buf,me call ffflush(6) endif enddo endif call ga_pgroup_sync(grp_id) c if (me.eq.0) then write(6,*) write(6,*) ' read_inc is OK' write(6,*) endif c c c #if 000 if (me.eq.0) then write(6,*) write(6,*) '> checking ga_fence and ga_lock' write(6,*) call ffflush(6) endif c call ga_zero(g_a) c c*** use ga_read_inc and elements g_a(1:2,1) to implement a lock c*** compute g_a(:,n) = sum (1(:)) for P processors c status = ga_create_mutexes(1) if (.not. status) then call ga_error('ga_create_mutexes failed ',0) endif if(n.lt.2)call ga_error('insufficient n to test ga_fence',n) call ga_lock(0) c call my_lock(g_a) c get original values g_a(:,n) call ga_get(g_a, 1,n, n,n, b,n) c add my contribution do i =1,n b(i,1)= b(i,1)+1 enddo c c need to use fence to assure that coms complete before leaving c Critical Section c call ga_init_fence() call ga_put(g_a, 1,n, n,n, b,n) call ga_fence() call ga_unlock(0) c call my_unlock(g_a) c 333 if(.not.ga_destroy_mutexes()) $ call ga_error('mutex not destroyed',0) call ga_pgroup_sync(grp_id) if (me.eq.0) then call ga_get(g_a, 1,n, n,n, b,n) do i =1,n if(b(i,1).ne. nproc)then print *, 'mismatch',b(i,1),nproc call ga_error('fence failed',i) endif enddo write(6,*) write(6,*) ' ga_fence and ga_lock are OK' write(6,*) endif #endif c c if (me.eq.0) then write(6,*) write(6,*) '> checking ga_locate_region' write(6,*) call ffflush(6) endif status = ga_locate_region(g_a, 1, n, 1,n, map,np) found = 0 do j=1,n do i=1,n b(i,j)=-1 enddo enddo if(me.eq.0)call ga_put(g_a,1,n,1,n,b,n) call ga_pgroup_sync(grp_id) do k = 1, np if(map(5,k).eq.me)then if(found.eq.1) then write(6,*)'double entry in map for proc ',me call ffflush(6) endif do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) b(i,j)=1*me enddo enddo call ga_put(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & b(map(1,k),map(3,k)),n) found = 1 endif enddo call ga_pgroup_sync(grp_id) c do k = 1, np if(map(5,k).eq.me)then call ga_get(g_a, map(1,k),map(2,k),map(3,k),map(4,k), & a(map(1,k),map(3,k)),n) do j= map(3,k), map(4,k) do i= map(1,k), map(2,k) if(b(i,j).ne.a(i,j)) then write(6,*) & 'proc ',me, 'overlap with ',a(i,j) call ffflush(6) endif enddo enddo endif enddo call ga_pgroup_sync(grp_id) c if(me.eq.0)then call ga_get(g_a,1,n,1,n,a,n) do j=1,n do i=1,n if(a(i,j).eq.-1)then write(6,*)'i=',i,' j=',j, ' not assigned ' call ga_error('... exiting ',0) endif enddo enddo endif if (me.eq.0) then write(6,*) write(6,*) ' ga_locate_region is OK' write(6,*) call ffflush(6) endif c c Delete the global array c status = ga_destroy(g_a) c return end c--------------------------------------------------------------------- subroutine check_flt(grp_id) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer n, m, grp_id parameter (n =10) parameter (m=2*n) real a(n,n), b(n,n), v(m), w(m) integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i, j, loop, nloop, maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes double precision nwords parameter (maxloop = 100) integer maxproc integer ndim, dims(2), chunk(2), p_mirror parameter (maxproc = 128) double precision crap real x, sum1, sum2 logical found integer lprocs, inode, iproc intrinsic int iran(i) = int(drand(0)*real(i)) + 1 nproc = ga_pgroup_nnodes(grp_id) me = ga_pgroup_nodeid(grp_id) inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n a(i,j) = i-1 + (j-1)*n b(i,j) = -1. enddo enddo c c Create a global array c ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,MT_REAL) call ga_set_array_name(g_a,'a') call ga_set_pgroup(g_a,grp_id) if (.not.ga_allocate(g_a)) then write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c c check if handle is valid. be quiet unless error c if(.not.ga_valid_handle(g_a)) call ga_error("invalid handle",g_a) c call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) call ga_pgroup_sync(grp_id) c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_pgroup_sync(grp_id) do i = 1, n do j = 1, n if (b(i,j) .ne. 0.0) then write(6,*) ' zero ', me, i, j, b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc if (mod(ij,nproc) .eq. me) then ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) c write(6,4) me, ilo, ihi, jlo, jhi c 4 format(' node ',i2,' checking put ',4i4) c call ffflush(6) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo call ga_pgroup_sync(grp_id) c if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_pgroup_sync(grp_id) c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_rfill(n*n, 0.0, b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) c if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif c sum1 = 0.0d0 do j = jlo, jhi do i = ilo, ihi sum1 = sum1 + b(i,j) if (b(i,j) .ne. a(i,j)) then write(6,*) 'error ', i, j, b(i,j), a(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c c Each node accumulates into disjoint sections of the array c if (me .eq. 0) then write(6,9) 9 format(/'> Checking accumulate ... ') call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(12345) ! Same seed for each process do j = 1, n do i = 1, n c b(i,j) = real(drand(0)) b(i,j) = i+j enddo enddo c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc c x = real(drand(0)) x = 10. ilo = i ihi = min(i+inc-1, n) if(ihi.eq.n-1)ihi=n c ihi = min(i+inc, n) jlo = j jhi = min(j+inc-1, n) if(jhi.eq.n-1)jhi=n c jhi = min(j+inc-1, n) * call ffflush(6) if (mod(ij,nproc) .eq. me) then c print *, me, 'checking accumulate ',ilo,ihi,jlo,jhi,x * 11 format(' node ',i2,' checking accumulate ',4i4) * call ffflush(6) call ga_acc(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n, x) endif ij = ij + 1 c c Each process applies all updates to its local copy c do jj = jlo, jhi do ii = ilo, ihi a(ii,jj) = a(ii,jj) + x * b(ii,jj) enddo enddo enddo enddo call ga_pgroup_sync(grp_id) c c All nodes check all of a call ga_get(g_a, 1, n, 1, n, b, n) c do j = 1, n do i = 1, n if(MISMATCHF(b(i,j),a(i,j)))then write(6,*) ' acc ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' disjoint ga_acc is OK' write(6,*) endif c c overlapping accumulate call ga_pgroup_sync(grp_id) g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,MT_REAL) call ga_set_array_name(g_b,'b') call ga_set_pgroup(g_b,grp_id) if (.not.ga_allocate(g_b)) then call ga_error('ga_create failed for second array ',0) endif c call ga_zero(g_b) call ga_acc(g_b, n/2, n/2, n/2, n/2, 1.0, 1, 1.0) call ga_pgroup_sync(grp_id) if (me.eq.0) then call ga_get(g_b, n/2, n/2, n/2, n/2, b(1,1), 1) x = abs(b(1,1) -1*nproc) if(x.gt. 1e-10)then write(6,*)'val=',b(1,1),' expected=',nproc, x call ga_error('overlapping accumulate failed',0) endif write(6,*) write(6,*) ' overlapping ga_acc is OK' write(6,*) endif c c Check the ga_add function c if (me .eq. 0) then write(6,91) 91 format(/'> Checking add ...') call ffflush(6) endif c crap = drand(12345) ! Everyone has same seed do j = 1, n do i = 1, n b(i,j) = real(drand(0)*real(i)) + 1 a(i,j) = 0.1*a(i,j) + 0.9*b(i,j) enddo enddo if (me.eq.0) call ga_put(g_b, 1, n, 1, n, b, n) call ga_add(0.1, g_a, 0.9, g_b, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if(MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' add ', me, i, j, a(i,j), b(i,j) call ffflush(6) CCC call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' add is OK ' write(6,*) endif call ga_pgroup_sync(grp_id) c c Check the sdot function c if (me .eq. 0) then write(6,19) 19 format(/'> Checking sdot ...') call ffflush(6) endif crap = drand(12345) ! Everyone has same seed sum1 = 0.0 do j = 1, n do i = 1, n b(i,j) = drand(0) sum1 = sum1 + a(i,j)*b(i,j) enddo enddo if (me.eq.0) then call ga_put(g_b, 1, n, 1, n, b, n) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_pgroup_sync(grp_id) sum2 = ga_sdot(g_a,g_b) if(MISMATCHF(sum1, sum2))then write(6,*) ' fdot wrong ', sum1, sum2 call ffflush(6) call ga_error('... exiting ',0) else if (me.eq.0) then write(6,*) write(6,*) ' sdot is OK ' write(6,*) endif c c Check the ga_scale function c if (me .eq. 0) then write(6,92) 92 format(/'> Checking scale ...') call ffflush(6) endif call ga_scale(g_a, 0.123) call ga_get(g_a, 1, n, 1, n, b, n) do j = 1, n do i = 1, n a(i,j) = a(i,j)*0.123 if (MISMATCHF(b(i,j), a(i,j)))then write(6,*) ' dscal ', me, i, j, a(i,j), b(i,j) call ffflush(6) CCC call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' scale is OK ' write(6,*) endif c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) endif call ga_pgroup_sync(grp_id) c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_pgroup_sync(grp_id) itmp = iran(nproc)-1 if(me.eq.itmp) then do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_pgroup_sync(grp_id) if(me.eq.iran(ga_nnodes())-1) then do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo c v(loop) = DSIN(a(ilo,jlo)+b(ilo,jlo)) v(loop) = 1.0 *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) c if(v(loop) .ne. w(loop))then if(w(loop) .ne. 1.0 *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', 1.0 *(ilo+jlo) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif call ga_pgroup_sync(grp_id) enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c call ga_pgroup_sync(grp_id) c c scatter-acc available in GA ver. 3.0 #ifdef GA3 if (me.eq.0) then write(6,*) write(6,*) ' checking scatter-accumulate' write(6,*) endif c crap = drand(1234) call ga_zero(g_a) c do j = 1, n do i = 1, n b(i,j) =0. enddo enddo c x = .1d0 ii =n do jj = 1,1 call ga_pgroup_sync(grp_id) do loop = 1, ii c generate unique i,j pairs 10 continue i = iran(n) j=iran(n) if (found(i,j, iv, jv, loop-1) ) goto 10 iv(loop) = i jv(loop) = j v(loop) = 1.0 *(i+j) b(i,j) = b(i,j) + nproc*x*v(loop) ! update local ref. array enddo call ga_scatter_acc(g_a,v,iv,jv, ii,x) c call ga_pgroup_sync(grp_id) c c check the result c call ga_get(g_a, 1, n, 1,n, a, n) do loop = 1,ii i = iv(loop) j = jv(loop) if(MISMATCHF(a(i,j),b(i,j)))then print *,'Error',i,j,loop,a(i,j),'expected=',b(i,j) * if(me.eq.0)then * do ii=1,loop * print *,'element',ii, iv(ii),jv(ii) * enddo * endif call ga_error('scatter-acc error in trial ',jj) endif enddo call ga_pgroup_sync(grp_id) enddo call ga_pgroup_sync(grp_id) if (me.eq.0) then write(6,*) write(6,*) ' scatter-accumulate is OK' write(6,*) endif #endif c c Delete the global array c status = ga_destroy(g_a) c return end c_____________________________________________________________ subroutine check_wrappers(grp_id) implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" double precision sum integer isum, ibuf(2) integer me, nproc, grp_id, root real fsum c nproc = ga_pgroup_nnodes(grp_id) me = ga_pgroup_nodeid(grp_id) c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_igop' write(6,*) call ffflush(6) endif ibuf(1) = 1 ibuf(2) = me call ga_pgroup_igop(grp_id,10000, ibuf, 2, '+') if(ibuf(1).ne.nproc)then call ga_error('ga_igop error',isum) endif if(ibuf(2).ne.((nproc-1)*nproc/2))then call ga_error('ga_igop error -2',isum) endif call ga_pgroup_sync(grp_id) if (me.eq.0) then write(6,*) write(6,*) ' ga_igop is OK' write(6,*) endif call ga_pgroup_sync(grp_id) c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_dgop' write(6,*) call ffflush(6) endif sum = 1d0 * me call ga_pgroup_dgop(grp_id,10000, sum, 1, '+') if(Int(sum).ne.((nproc-1)*nproc/2))then call ga_error('ga_dgop error',Int(sum)) endif call ga_pgroup_sync(grp_id) if (me.eq.0) then write(6,*) write(6,*) ' ga_dgop is OK' write(6,*) endif c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_sgop' write(6,*) call ffflush(6) endif fsum = 1.0 * me call ga_pgroup_sgop(grp_id,10000, fsum, 1, '+') if(Int(sum).ne.((nproc-1)*nproc/2))then call ga_error('ga_fgop error',Int(sum)) endif call ga_pgroup_sync(grp_id) if (me.eq.0) then write(6,*) write(6,*) ' ga_sgop is OK' write(6,*) endif c call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*)'> Checking ga_brdcst' write(6,*) call ffflush(6) endif if(me.eq.nproc-1)then ibuf(1) = me ibuf(2) = nproc endif root = 7 call ga_pgroup_brdcst(grp_id,1000,ibuf,util_mitob(2),nproc-1) if(ibuf(1).ne.nproc-1)call ga_error('ibuf(1) error',ibuf(1)) if(ibuf(2).ne.nproc)call ga_error('ibuf(2) error',ibuf(2)) call ga_pgroup_sync(grp_id) if (me .eq. 0) then write(6,*) write(6,*)'> ga_brdcst is OK ' write(6,*) call ffflush(6) endif call ga_pgroup_sync(grp_id) return end subroutine check_mem(mem_size) implicit none integer mem_size #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,nmax,left,need, me,procs,g_a, g_b logical status c if(.not. ga_memory_limited())return me = ga_nodeid() procs = ga_nnodes() nmax = int(dsqrt(dble(mem_size/util_mitob(1)))) left = mem_size/procs - ga_inquire_memory() n = nmax/2 need = util_mdtob(n*n)/procs c if(me.eq.0)then write(6,*)' ' if(ga_uses_ma())then write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA used)' else write(6,*)' CHECKING GA MEMORY RESTRICTIONS (MA not used)' endif write(6,*)' ' write(6,*)' ' call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'a', 0, 0, g_a) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif call ffflush(6) endif c n = nmax left = mem_size/procs - ga_inquire_memory() need = util_mdtob(n*n)/procs if(me.eq.0)then call print_mem_info(n,left, need, mem_size/procs) endif c status = ga_create(MT_DBL, n, n, 'b', 0, 0, g_b) c if(me.eq.0) then if(status) then write(6,*) ' success' else write(6,*) ' failure' endif write(6,*)' ' write(6,*)' ' call ffflush(6) endif status = ga_destroy(g_a) end subroutine print_mem_info(n,left, need, total) implicit none integer n,left, need, total c write(6,*)' ' if(left - need .ge. 0) then write(6,1)n,n 1 format('> Creating array ',i4,' by ',i4,' -- should succeed') else write(6,2)n,n 2 format('> Creating array ',i4,' by ',i4,' -- SHOULD FAIL') endif write(6,3) need, left, total 3 format(' (need ',i7,' and ',i7,' out of ',i7,' bytes are left)') write(6,*)' ' call ffflush(6) c end subroutine my_lock(g_b) implicit none #include "global.fh" integer g_b, val, flag, i logical first_time double precision dummy common /lock/ val common /dum/ dummy data first_time /.true./ c c this awkward initialization is to avoid a weird problem C with block data on SUN if(first_time)then first_time = .false. dummy = .0 endif c val = ga_read_inc(g_b,1,1, 1) 10 call ga_get(g_b, 2,2,1,1, flag, 1) if(flag.eq.val) return c c to reduce memory stress, wait a while before retrying do i = 1, 100 dummy = dummy + .1 enddo goto 10 end subroutine my_unlock(g_b) implicit none #include "global.fh" integer g_b, val common /lock/ val c call ga_put(g_b, 2,2,1,1, val+1, 1) end logical function found(i,j, iv, jv, n) integer n integer i,j, iv(n), jv(n) integer loop found = .false. do loop = 1, n if(i .eq. iv(loop) .and. j .eq.jv(loop))then found = .true. goto 99 endif enddo 99 continue return end subroutine proc_remap() implicit none #include "global.fh" integer proc(100),nproc,i nproc = ga_nnodes() if(nproc.gt.100) $ call ga_error("remap requires<=100 processes",nproc) do i = 1, nproc proc(i) = nproc-i enddo c call ga_register_proclist(proc,nproc) end subroutine util_rfill(n,val,a,ia) implicit none real a(*), val integer n, ia, i c c initialise real array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_dfill(n,val,a,ia) implicit none double precision a(*), val integer n, ia, i c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_ifill(n,val,a,ia) implicit none integer n, ia, i, a(*),val c c initialise integer array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end subroutine util_qfill(n,val,a,ia) implicit none double complex a(*), val integer n, ia, i c c initialise double complex array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/testing/types-test.F0000644000175000017500000006025512662210457015212 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: test.F,v 1.64.2.11 2007-04-06 22:37:35 d3g293 Exp $ c vector boxes lack arithmetic precision #if defined(FUJITSU) # define THRESH 1d-12 # define THRESHF 1e-5 #else # define THRESH 1d-13 # define THRESHF 2e-5 #endif #define MISMATCH(x,y) abs(x-y)/max(1d0,abs(x)).gt.THRESH #define MISMATCHF(x,y) abs(x-y)/max(1.0,abs(x)).gt.THRESHF c#define NEW_API c#define MIRROR #define GA3 #define NGA_GATSCAT c#define BLOCK_CYCLIC c#define USE_SCALAPACK_DISTR c#define USE_RESTRICTED #ifdef USE_RESTRICTED # define NEW_API #endif #define MEM_INC 1000 #ifdef BLOCK_CYCLIC # define NEW_API # undef MIRROR #else # undef USE_SCALAPAC_DISTR #endif program main implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" integer heap, stack, fudge, ma_heap, me, nproc, map(4096), block integer g_s, ndim, dim1, i logical status parameter (heap=200*200*4, fudge=100, stack=200*200) c c*** Intitialize a message passing library c #include "mp3.fh" c c*** Initialize GA c c There are 2 choices: ga_initialize or ga_initialize_ltd. c In the first case, there is no explicit limit on memory usage. c In the second, user can set limit (per processor) in bytes. c call ga_initialize() nproc = ga_nnodes() me = ga_nodeid() c we can also use GA_set_memory_limit BEFORE first ga_create call c ma_heap = heap/nproc + fudge ma_heap = 2*ma_heap #ifdef USE_RESTRICTED ma_heap = 2*ma_heap #endif call GA_set_memory_limit(util_mdtob(ma_heap)) c if(ga_nodeid().eq.0)then #ifdef MIRROR print *,' Performing tests on Mirrored Arrays' #endif print *,' GA initialized ' call ffflush(6) endif c c*** Initialize the MA package c MA must be initialized before any global array is allocated c status = ma_init(MT_DCPL, stack, ma_heap) if (.not. status) call ga_error('ma_init failed',-1) c c Uncomment the below line to register external memory allocator c for dynamic arrays inside GA routines. c call register_ext_memory() c if(me.eq.(nproc-1))then print *, 'using ', nproc,' process(es) ', ga_cluster_nnodes(), $ ' cluster nodes' print *,'process ', me, ' is on node ',ga_cluster_nodeid(), $ ' with ', ga_cluster_nprocs(-1), ' processes' call ffflush(6) endif c c create array to force staggering of memory and uneven distribution c of pointers c dim1 = MEM_INC map(1) = 1 do i = 2, nproc map(i) = MEM_INC*(i-1)+1 dim1 = dim1 + MEM_INC*i end do g_s = ga_create_handle() ndim = 1 call ga_set_data(g_s,ndim,dim1,MT_INT) call ga_set_array_name(g_s,'s') call ga_set_irreg_distr(g_s,map,nproc) c c*** Check support for single precision complex arrays c if (me.eq.0) then write(6,*) write(6,*) ' CHECKING SINGLE COMPLEX ' write(6,*) call ffflush(6) endif call check_complex_float() c c*** Check support for double precision complex arrays c if (me.eq.0) then write(6,*) write(6,*) ' CHECKING DOUBLE COMPLEX ' write(6,*) call ffflush(6) endif call check_complex() if(me.eq.0) call ga_print_stats() if(me.eq.0) print *,' ' if(me.eq.0) print *,'All tests successful ' status = ga_destroy(g_s) c c*** Tidy up the GA package c call ga_terminate() c c*** Tidy up after message-passing library c call MP_FINALIZE() c end subroutine check_complex_float() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) complex a(n,n), b(n,n), v(m),w(m) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords complex x, sum1, sum2, factor integer lprocs, inode, iproc, lproc integer scpl_type, istatus #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = cmplx(real(i-1), real((j-1)*n)) #else a(i,j) = cmplx(real(inode),0.0d00) + + cmplx(real(i-1), real((j-1)*n)) #endif b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create type c scpl_type = nga_register_type(8) c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,scpl_type) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(scpl_type, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(scpl_type, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,scpl_type) call ga_set_array_name(g_b,'b') # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(scpl_type, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(scpl_type, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format(/'> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format(/'> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/4 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format(/'> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #else if(iproc.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #endif call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c Check scatter&gather c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(me.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c istatus = nga_deregister_type(scpl_type) c end c----------------------------------------------------------------- subroutine check_complex() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 60) parameter (m = 2*n) double complex a(n,n), b(n,n), v(m),w(m) #ifdef MIRROR integer ndim, dims(2), chunk(2), p_mirror #else # ifdef NEW_API integer ndim, dims(2), chunk(2), p_mirror # endif #endif integer iv(m), jv(m) logical status integer g_a, g_b integer iran, i,j, loop,nloop,maxloop, ilo, ihi, jlo, jhi, itmp integer nproc, me, int, ij, inc, ii, jj, nnodes parameter (maxloop = 100) integer maxproc parameter (maxproc = 4096) double precision crap, real double precision nwords double complex x, sum1, sum2, factor integer lprocs, inode, iproc, lproc integer dcpl_type, istatus #ifdef USE_RESTRICTED integer num_rstrctd integer rstrctd_list(maxproc/2) #endif #ifdef BLOCK_CYCLIC integer block_size(2), proc_grid(2) #endif intrinsic int iran(i) = int(drand(0)*real(i)) + 1 c nproc = ga_nnodes() me = ga_nodeid() inode = ga_cluster_nodeid() lprocs = ga_cluster_nprocs(inode) nnodes = ga_cluster_nnodes() iproc = mod(me,lprocs) nloop = Min(maxloop,n) #ifdef USE_RESTRICTED num_rstrctd = nproc/2 if (num_rstrctd.eq.0) num_rstrctd = 1 do i = 1, num_rstrctd rstrctd_list(i) = (num_rstrctd/2) + i-1 end do #endif #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",0) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c c a() is a local copy of what the global array should start as c do j = 1, n do i = 1, n #ifndef MIRROR a(i,j) = cmplx(dble(i-1), dble((j-1)*n)) #else a(i,j) = cmplx(dble(inode),0.0d00) + + cmplx(dble(i-1), dble((j-1)*n)) #endif b(i,j) = cmplx(-1d0,1d0) enddo enddo c c Create type c dcpl_type = nga_register_type(16) c c Create a global array c c print *,ga_nodeid(), ' creating array' call ffflush(6) c call setdbg(1) #ifdef NEW_API ndim = 2 dims(1) = n dims(2) = n g_a = ga_create_handle() call ga_set_data(g_a,ndim,dims,dcpl_type) call ga_set_array_name(g_a,'a') #ifdef USE_RESTRICTED call ga_set_restricted(g_a, rstrctd_list, num_rstrctd) #endif #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif #endif # ifdef MIRROR p_mirror = ga_pgroup_get_mirror() call ga_set_pgroup(g_a,p_mirror) # endif status = ga_allocate(g_a) #else # ifndef MIRROR status = ga_create(dcpl_type, n, n, 'a', 0, 0, g_a) # else ndim = 2 dims(1) = n dims(2) = n chunk(1) = 0 chunk(2) = 0 p_mirror = ga_pgroup_get_mirror() status = nga_create_config(dcpl_type, ndim, dims, 'a', chunk, + p_mirror, g_a) # endif #endif if (.not. status) then write(6,*) ' ga_create failed' call ga_error('... exiting ',0) endif #ifdef NEW_API g_b = ga_create_handle() call ga_set_data(g_b,ndim,dims,dcpl_type) call ga_set_array_name(g_b,'b') #ifdef BLOCK_CYCLIC #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif #endif # ifdef MIRROR call ga_set_pgroup(g_b,p_mirror) # endif if (.not.ga_allocate(g_b)) then #else # ifndef MIRROR if (.not. ga_create(dcpl_type, n, n, 'b', 0, 0, g_b)) then # else if (.not. nga_create_config(dcpl_type, ndim, dims, 'b', chunk, _ p_mirror, g_b)) then # endif #endif call ga_error('ga_create failed for second array ',0) endif #ifndef MIRROR call ga_distribution(g_a,me,ilo, ihi, jlo, jhi) #else lproc = me - ga_cluster_procid(inode,0) call ga_distribution(g_a, lproc, ilo, ihi, jlo, jhi) #endif call ga_sync() c c Zero the array c if (me .eq. 0) then write(6,21) 21 format('> Checking zero ... ') call ffflush(6) endif call ga_zero(g_a) c c Check that it is indeed zero c call ga_get(g_a, 1, n, 1, n, b, n) call ga_sync() do i = 1, n do j = 1, n if(b(i,j).ne.(0d0,0d0)) then write(6,*) me,' zero ', i, j, b(i,j) call ffflush(6) c call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_zero is OK' write(6,*) endif call ga_sync() c c Each node fills in disjoint sections of the array c if (me .eq. 0) then write(6,2) 2 format('> Checking disjoint put ... ') call ffflush(6) endif call ga_sync() c inc = (n-1)/20 + 1 ij = 0 do j = 1, n, inc do i = 1, n, inc #ifndef MIRROR if (mod(ij,nproc) .eq. me) then #else if (mod(ij,lprocs) .eq. iproc) then #endif ilo = i ihi = min(i+inc, n) jlo = j jhi = min(j+inc, n) call ga_put(g_a, ilo, ihi, jlo, jhi, a(ilo, jlo), n) endif ij = ij + 1 enddo enddo call ga_sync() c c All nodes check all of a c call util_qfill(n*n, (0d0,0d0), b, 1) call ga_get(g_a, 1, n, 1, n, b, n) c do i = 1, n do j = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' put ', me, i, j, a(i,j),b(i,j) call ffflush(6) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_put is OK' write(6,*) endif call ga_sync() c c Now check nloop random gets from each node c if (me .eq. 0) then write(6,5) nloop 5 format('> Checking random get (',i5,' calls)...') call ffflush(6) endif call ga_sync() c nwords = 0 c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do loop = 1, nloop ilo = iran(loop) ihi = iran(loop) if (ihi.lt. ilo) then itmp = ihi ihi = ilo ilo = itmp endif jlo = iran(loop) jhi = iran(loop) if (jhi.lt. jlo) then itmp = jhi jhi = jlo jlo = itmp endif c nwords = nwords + (ihi-ilo+1)*(jhi-jlo+1) c call util_qfill(n*n, (0.0d0,0d0), b, 1) call ga_get(g_a, ilo, ihi, jlo, jhi, b(ilo, jlo), n) if (me .eq. 0 .and. mod(loop-1, max(1,nloop/20)).eq.0) then write(6,1) loop, me, ilo, ihi, jlo, jhi, nwords 1 format(' call ',i5, ' node ',i2,' checking get ',4i4, $ ' total ',d9.2) call ffflush(6) endif do j = jlo, jhi do i = ilo, ihi if (b(i,j) .ne. a(i,j)) then write(6,*)'error:', i, j, b(i,j), a(i,j) call ga_error('... exiting ',0) endif enddo enddo c enddo if (me.eq.0) then write(6,*) write(6,*) ' ga_get is OK' write(6,*) call ffflush(6) endif call ga_sync() c c Check the ga_copy function c if (me .eq. 0) then write(6,*) write(6,*)'> Checking copy' write(6,*) call ffflush(6) endif call ga_sync() #ifndef MIRROR if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #else if(iproc.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) #endif call ga_copy(g_a, g_b) call ga_get(g_b, 1, n, 1, n, b, n) do j = 1, n do i = 1, n if (b(i,j) .ne. a(i,j)) then write(6,*) ' copy ', me, i, j, a(i,j), b(i,j) call ga_error('... exiting ',0) endif enddo enddo if (me.eq.0) then write(6,*) write(6,*) ' copy is OK ' write(6,*) endif c c Check scatter&gather c call ga_sync() if (me .eq. 0) then write(6,*) '> Checking scatter/gather (might be slow)... ' call ffflush(6) if(me.eq.0) call ga_put(g_a, 1, n, 1, n, a, n) endif call ga_sync() c crap = drand(ga_nodeid()*51 +1) !Different seed for each proc do j = 1, 10 call ga_sync() #ifndef MIRROR itmp = iran(nproc)-1 if(me.eq.itmp) then #else itmp = iran(lprocs)-1 if(iproc.eq.itmp) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo enddo call ga_gather(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,v(loop),1) if(v(loop) .ne. a(ilo,jlo))then write(6,*)me,' gather ', ilo,',',jlo,',', a(ilo,jlo) & ,' ',v(loop) call ffflush(6) call ga_error('... exiting ',0) endif enddo endif enddo c if (me.eq.0) then write(6,*) write(6,*) ' gather is OK' write(6,*) call ffflush(6) endif c do j = 1,10 call ga_sync() #ifndef MIRROR if(me.eq.iran(ga_nnodes())-1) then #else if(me.eq.iran(lprocs)-1) then #endif do loop = 1,m ilo = iran(n) jlo = iran(n) iv(loop) = ilo jv(loop) = jlo v(loop) = (1d0,-1d0) *(ilo+jlo) enddo call ga_scatter(g_a, v, iv, jv, m) do loop = 1,m ilo= iv(loop) jlo= jv(loop) call ga_get(g_a,ilo,ilo,jlo,jlo,w(loop),1) if(w(loop) .ne. (1d0,-1d0) *(ilo+jlo) )then write(6,*)me,' scatter ', ilo,',',jlo,',',w(loop) & ,' ', (1d0,-1d0) *(ilo+jlo) call ffflush(6) endif enddo endif call ga_sync() enddo c if (me.eq.0) then write(6,*) write(6,*) ' scatter is OK' write(6,*) endif c c Delete the global arrays c status = ga_destroy(g_b) status = ga_destroy(g_a) c istatus = nga_deregister_type(dcpl_type) c end subroutine util_qfill(n,val,a,ia) implicit none double complex a(*), val integer n, ia, i c c initialise double complex array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/testing/normc.c0000644000175000017500000003073212662210461014234 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define NDIM 5 /* dimension of matrices */ #define LDIM NDIM*NDIM /* dimension of vectors */ /* Test the norm1 and norm_infinity functions on 1 and 2 dimensional global * arrays */ void do_work() { int ONE=1, TWO=2; /* useful constants */ int g_a; int me=GA_Nodeid(), nproc=GA_Nnodes(); int i, j, m, n, ndim, dim1, dim2, ld; int dims[2]; int lo[2], hi[2]; double rnorm_infinity, rnorm1, norm; int *iptr; long *lptr; float *fptr; double *dptr; DoubleComplex *zptr; SingleComplex *cptr; double delta; /* Test vectors */ ndim = ONE; dims[0] = LDIM; rnorm1 = (double)(LDIM*(LDIM-1)/2); rnorm_infinity = (double)(LDIM-1); /* Test integers */ if (me==0) printf("Testing integer vector\n"); g_a = NGA_Create_handle(); NGA_Set_data(g_a, ndim, dims, C_INT); NGA_Allocate(g_a); NGA_Distribution(g_a, me, lo, hi); dim1 = hi[0]-lo[0]+1; NGA_Access(g_a, lo, hi, &iptr, &ld); for (i=0; i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "ga.h" #include "global.h" #include "macdecls.h" #include "testutil.h" #include "mp3.h" #define BASE 100 /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define GA_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define GA_ABS(a) (((a) <0) ? -(a) : (a)) void *ext_malloc(size_t bytes, int align, char *name) { return malloc(bytes); } void ext_free(void *ptr) { free(ptr); } void FATR register_ext_memory_() { GA_Register_stack_memory(ext_malloc, ext_free); } /*\ generate random range for a section of multidimensional array \*/ void get_range( int ndim, int dims[], int lo[], int hi[]) { int dim; for(dim=0; dim 0)? rand()%range : lo[dim]; new_lo[dim] = toss; new_hi[dim] = toss + diff -1; assert(new_hi[dim] < dims[dim]); assert(diff == (new_hi[dim] -new_lo[dim]+1)); } } /*\ print range of n-dimensional array with two strings before and after \*/ void print_range_internal(char *pre,int ndim, int lo[], int hi[], char* post) { int i; printf("%s[",pre); for(i=0;i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs; int g_A, g_B, g_C, g_M, **local_M=NULL; int dims[DIM]={SIZE, SIZE}, val_A=5, val_B=4, val_C=3; int mlo[DIM]={0,0}, mhi[DIM]={4,4}, ld=SIZE, i, j; int local_T[SIZE][SIZE]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); g_C = NGA_Create(C_INT, DIM, dims, "array_C", NULL); g_M = NGA_Create(C_INT, DIM, dims, "array_M", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); GA_Fill(g_C, &val_C); GA_Median(g_A,g_B, g_C, g_M); GA_Print(g_M); /* GA_Print(g_A); GA_Print(g_B); GA_Print(g_C); */ if(rank==0) { local_M=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define GSIZE 5 one_dimension(int rank, int nprocs) { int g_V; int ndim=1, dims=GSIZE; int dims2, ndim2, type, value=5; g_V = NGA_Create(C_INT, ndim, &dims, "array_V", NULL); GA_Fill(g_V, &value); GA_Print(g_V); GA_Sync(); // NGA_Inquire(g_V, &type, &ndim2, dims2); //printf(" %d -- %d,,\n", type, ndim2); //for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" even_odd_pgroup(int rank, int nprocs) { int i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs; int g_A, g_V, val1=5, val2=5, local_A[SIZE][SIZE], dims_V=SIZE; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={1,1}, hi[DIM]={2,2}, ld=5, i, j; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &dims_V, "array_A", NULL); GA_Fill(g_A, &val1); GA_Print(g_A); printf("\n"); GA_Scale(g_A, &val2); GA_Print(g_A); GA_Get_diag(g_A, g_V); GA_Print(g_V); NGA_Get(g_A, lo, hi, local_A, &ld); if(rank==1) { for(i=0; i<2; i++) { for(j=0; j<2; j++) if(local_A[i][j]!=val1*val2)printf(" GA Error: \n"); } } if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_create1.c0000644000175000017500000000175312662210460017230 0ustar mbamba/* * Test Program for GA * This is to test GA_Create (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 10 #define MAX_DIM 7 void create_ga(int ndim, int datatypes) { int g_A; int dims[MAX_DIM], i, val=4; for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, **local_A=NULL, **local_B=NULL; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={SIZE-SIZE,SIZE-SIZE}, hi[DIM]={SIZE-1,SIZE-1}, ld=5, value=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); local_A=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[SIZE][SIZE], local_B[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, dims2[DIM], ndim2, type2, dims3[DIM], ndim3, type3, lo[DIM]={0,0}, hi[DIM]={4,4}; int value=5, val2=4, ld=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Sync(); GA_Copy(g_A, g_B); GA_Print(g_B); // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ if(rank==0) { NGA_Get(g_A, lo, hi, local_A, &ld); NGA_Get(g_B, lo, hi, local_B, &ld); for(i=1; i<3; i++) { for(j=1; j<3; j++) printf("%d ", local_B[i][j]); printf("\n"); } printf("\n"); for(i=1; i<3; i++) { for(j=1; j<3; j++) printf("%d ", local_A[i][j]); printf("\n"); } printf("\n"); for(i=1; i<3; i++) { for(j=1; j<3; j++) { if(local_B[i][j]!=local_A[i][j]) printf("ERROR : in passing values \n"); } } } if(rank == 0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_copy.c0000644000175000017500000000704212662210460016653 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *result_a, *mock_b, *result_b; int g_a, g_b; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; /* create the local array and result array */ mock_a = Mock_Create(type, ndim, dims, "mock", NULL); result_a = Mock_Create(type, ndim, dims, "mock", NULL); mock_b = Mock_Create(type, ndim, dims, "mock", NULL); result_b = Mock_Create(type, ndim, dims, "mock", NULL); /* create the global array */ g_a = create_function[dist_idx](type, ndim, dims); g_b = create_function[dist_idx](type, ndim, dims); /* create meaningful data for local array */ mock_data(mock_a, g_a); mock_data(mock_b, g_b); /* init global array with same data as local array */ mock_to_global(mock_a, g_a); mock_to_global(mock_b, g_b); /* call the local routine */ Mock_Copy(mock_a, mock_b); /* call the global routine */ GA_Copy(g_a, g_b); /* get the results from the global array */ global_to_mock(g_a, result_a); global_to_mock(g_b, result_b); /* compare the results */ result = neq_mock(result_a, result_b, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } /* make sure all procs get same result so they can die gracefully */ GA_Igop(&result, 1, "+"); /* if error occured, find the highest failing node ID */ GA_Igop(&error_proc, 1, "max"); /* clear the error index for all but the highest failing node ID */ if (error_proc != GA_Nodeid()) { error_index = 0; } /* make sure all procs get the error index on the highest failing node ID */ GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_a); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(result_a); GA_Destroy(g_a); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_set_data.c0000644000175000017500000000144612662210460017467 0ustar mbamba/* * Test Program for GA * GA_Create_handle -- */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 5 #define DIM 2 int main(int argc, char **argv) { int rank, nprocs; int g_A; int dims[DIM]={SIZE,SIZE}, ndim; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A=GA_Create_handle(); if(!g_A) GA_ERROR_MSG(); GA_Set_data(g_A, DIM, dims, C_INT); // printf("%d \n", GA_Ndim(g_A)); /* if(rank == 0) { ndim=GA_Ndim(g_A); if(ndim == 2) printf(" An Error \n"); } */ GA_Sync(); if(rank == 0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); return 0; } ga-5-4/global/testing/unit-tests/ga_pgroup_create3.c0000644000175000017500000000333212662210460020621 0ustar mbamba/* * Test Program for GA * This is to test GA_PGroup_create (is a collective operation) * _pgroup_create -- helps to create different sized group from the given processes and helps to alocate different job for diffferent group * groups are identified using the group handle */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define PGSIZE 4 main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, list[PGSIZE], p_size, *list_even=NULL, *list_odd=NULL, even, odd; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define GSIZE 10 irregular_array1(int rank) { int g_A, g_B; int dims[DIM]={5,10}, dims2[DIM], ndim, type, value=5, block[DIM]={2,3}, map[5]={0,2,0,4,6}, val=7; int n_block[DIM], block_dims[DIM], i; g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create_irreg(C_INT, DIM, dims, "array_B", block, map); GA_Fill(g_A, &value); GA_Print(g_A); GA_Fill(g_B, &val); GA_Print(g_B); GA_Sync(); NGA_Inquire(g_A, &type, &ndim, dims2); //printf(" %d -- %d,,\n", type, ndim); /* GA_Get_block_info(g_B, n_block, block_dims); for(i=0; i=GSIZE); block[0]=b1; block[1]=b2; map=(int*)malloc(nprocs*sizeof(int)); for(i=0; i=GSIZE); block[0]=b1; block[1]=b2; map=(int*)malloc(nprocs*sizeof(int)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 10 #define N 5 #define D 2 main(int argc, char **argv) { int rank, nprocs; int g_A, dims[D]={SIZE,SIZE}, *local_A=NULL, *local_G=NULL, **sub_array=NULL, **s_array=NULL; int i, j, value=5; MPI_Init(&argc, &argv); GA_Initialize(); MA_init(C_INT, 1000, 1000); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); s_array=(int**)malloc(N*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[SIZE][SIZE], local_B[SIZE][SIZE]; int dims[DIM]={5,5}, alo[DIM]={1,1}, ahi[DIM]={3,2}, blo[DIM]={1,1}, bhi[DIM]={2,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Print(g_B); NGA_Get(g_A, alo, ahi, local_A, &ld); NGA_Get(g_B, blo, bhi, local_B, &ld); if(rank==0) { for(i=0; i<3; i++) { for(j=0; j<2; j++) printf("%d ", local_A[i][j]); printf("\n"); } printf("\n"); for(i=0; i<2; i++) { for(j=0; j<3; j++) printf("%d ", local_B[i][j]); printf("\n"); } for(i=0; i<2; i++) { for(j=0; j<3; j++) if( local_A[i][j]!=local_B[i][j]) printf("ERROR : \n"); } } // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ GA_Sync(); if(rank == 1) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_elem_dividepatch.c0000644000175000017500000000313212662210460021163 0ustar mbamba/* * Test Program for GA * This is to test GA_Elem_divide_patch (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_Elem_multiply -- used to multiply two array and store it in one * Here _elem_multiply patch -- help to does the same function of_elem_multiply ...to an specified patch in array */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_C, local_C[DIM][DIM]; int dims[DIM]={5,5}, dims2[DIM], ndim, type; int val_A=5, val_B=3, ld=DIM; int lo[DIM]={2,2}, hi[DIM]={4,4}, blo[DIM]={0,0}, bhi[DIM]={2,2}, clo[DIM]={1,1}, chi[DIM]={3,3}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); g_C = NGA_Create(C_INT, DIM, dims, "array_C", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); GA_Zero(g_C); GA_Elem_divide_patch(g_A, lo, hi, g_B, blo, bhi, g_C, clo, chi); GA_Print(g_C); GA_Sync(); NGA_Get(g_C, clo, chi, local_C, &ld); if(rank==1) { for(i=0; i #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" addition_operator(int rank, int nprocs, int n) { int i; long x[n], temp[n]; char op='+'; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 int main(int argc, char **argv) { int rank, nprocs, i; double g_A; int dims[DIM]={5,5}, dims2[DIM], ndim, type; double value=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_DBL, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_DBL, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); GA_Print(g_A); if(!g_A) printf("ERROR : \n"); NGA_Inquire(g_A, &type, &ndim, dims2); printf(" %d -- %d,,\n", type, ndim); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define GSIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_V, local_A[5][5], local_B[5][5], vsize=GSIZE; int dims[DIM]={GSIZE,GSIZE}, alo[DIM]={1,1}, ahi[DIM]={3,2}, blo[DIM]={1,1}, bhi[DIM]={2,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &vsize, "array_V", NULL); GA_Fill(g_A, &value); GA_Zero_diagonal(g_A); GA_Print(g_A); g_B = GA_Duplicate(g_A, "array_B"); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Print(g_B); GA_Fill(g_V, &val2); GA_Print(g_V); GA_Add_diagonal(g_A, g_V); GA_Print(g_A); GA_Sync(); if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_elem_divide.c0000644000175000017500000000660212662210460020150 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *mock_b, *result_mock, *result_ga; int g_a, g_b, g_c; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; mock_a = Mock_Create(type, ndim, dims, "mock", NULL); mock_b = Mock_Create(type, ndim, dims, "mock", NULL); result_mock = Mock_Create(type, ndim, dims, "mock", NULL); result_ga = Mock_Create(type, ndim, dims, "mock", NULL); g_a = create_function[dist_idx](type, ndim, dims); g_b = create_function[dist_idx](type, ndim, dims); g_c = create_function[dist_idx](type, ndim, dims); mock_data(mock_a, g_a); mock_data(mock_b, g_b); mock_to_global(mock_a, g_a); mock_to_global(mock_b, g_b); Mock_Elem_divide(mock_a, mock_b, result_mock); GA_Elem_divide(g_a, g_b, g_c); global_to_mock(g_c, result_ga); result = neq_mock(result_mock, result_ga, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } /* make sure all procs get same result so they can die gracefully */ GA_Igop(&result, 1, "+"); /* if error occured, find the highest failing node ID */ GA_Igop(&error_proc, 1, "max"); /* clear the error index for all but the highest failing node ID */ if (error_proc != GA_Nodeid()) { error_index = 0; } /* make sure all procs get the error index on the highest failing node ID */ GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_ga); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(mock_b); Mock_Destroy(result_mock); Mock_Destroy(result_ga); GA_Destroy(g_a); GA_Destroy(g_b); GA_Destroy(g_c); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_pgroup_setdefault.c0000644000175000017500000000317012662210460021433 0ustar mbamba/* * Test Program for GA * This is to test GA_PGroup_create (is a collective operation) * _pgroup_create -- helps to create different sized group from the given processes and helps to alocate different job for diffferent group * groups are identified using the group handle */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i %d --:: -- %d\n", i, list_even[i], list_odd[i]); } printf("\n"); GA_Sync(); printf("%d: My ID is %d :: %d \n", rank, GA_Nodeid(), GA_Nnodes()); p_Geven=GA_Pgroup_create(list_even, p_size); p_Godd=GA_Pgroup_create(list_odd, p_size); GA_Sync(); if(rank==1) printf(" GA: Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_intialize.c0000644000175000017500000000164212662210460017671 0ustar mbamba/* * Test Program for GA * This is to test GA_initialize * _intitalize and _terminate ---- are function start and end the space space where other GA-Functions are called xcfor manipulation * Using GA_Ndim -- ehich returns dimension of the g_A */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 int main(int argc, char **argv) { int rank, nprocs, n=1; int g_A, dims[DIM]={5,5}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); printf("check %d \n", n); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); if(GA_Ndim(g_A)!=DIM) printf("ERROR: GA_Ndim didnt return nDimension after GA_Initialize\n"); printf("%d : %d \n", rank, GA_Ndim(g_A)); GA_Terminate(); if(rank==0) printf(" GA: Test Completed \n"); MPI_Finalize(); return 0; } ga-5-4/global/testing/unit-tests/ga_gather2.c0000644000175000017500000000455412662210460017242 0ustar mbamba/* * Test Program for GA * This is to test GA_Gather (is a one-sided operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_gather -- used to get data from different location */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define N 5 #define D 2 main(int argc, char **argv) { int rank, nprocs; int g_A, dims[D]={5,10}, local_A[N], local_G[N], **sub_array=NULL, **s_array=NULL; int i, j, value=5; MPI_Init(&argc, &argv); GA_Initialize(); MA_init(C_INT, 1000, 1000); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); s_array=(int**)malloc(N*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i %d --:: -- %d\n", i, list_even[i], list_odd[i]); } */ GA_Sync(); printf("%d: My ID is %d :: %d --- nodeid & nnodes for GA \n", rank, GA_Nodeid(), GA_Nnodes()); p_Geven=GA_Pgroup_create(list_even, p_size_mod); p_Godd=GA_Pgroup_create(list_odd, p_size); GA_Sync(); if(rank%2==0) printf("%d: My ID is %d :: %d -- even \n", rank, GA_Pgroup_nodeid(p_Geven), GA_Pgroup_nnodes(p_Geven)); else printf("%d: My ID is %d :: %d --- odd\n", rank, GA_Pgroup_nodeid(p_Godd), GA_Pgroup_nnodes(p_Godd)); GA_Sync(); if(rank==0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_elem_multiply.c~0000644000175000017500000000763212662210460020765 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *mock_b, *result_mock, *result_ga; int g_a, g_b, g_c; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; mock_a = Mock_Create(type, ndim, dims, "mock", NULL); mock_b = Mock_Create(type, ndim, dims, "mock", NULL); //mock_c = Mock_Create(type, ndim, dims, "mock", NULL); //mock_ga = Mock_Create(type, ndim, dims, "mock", NULL); //result_a = Mock_Create(type, ndim, dims, "mock", NULL); //result_b = Mock_Create(type, ndim, dims, "mock", NULL); result_mock = Mock_Create(type, ndim, dims, "mock", NULL); result_ga = Mock_Create(type, ndim, dims, "mock", NULL); g_a = create_function[dist_idx](type, ndim, dims); g_b = create_function[dist_idx](type, ndim, dims); g_c = create_function[dist_idx](type, ndim, dims); /* create meaningful data for local array */ mock_data(mock_a, g_a); mock_data(mock_b, g_b); //mock_data(mock_c, g_c); /* init global array with same data as local array */ mock_to_global(mock_a, g_a); mock_to_global(mock_b, g_b); //mock_to_global(mock_c, g_c); /* call the local routine */ Mock_Elem_multiply(mock_a, mock_b, result_mock); /* call the global routine */ GA_Elem_multiply(g_a, g_b, g_c) /* get the results from the global array */ //global_to_mock(g_a, result_a); //global_to_mock(g_b, result_b); global_to_mock(g_c, result_ga); /* compare the results */ result = neq_mock(result_mock, result_ga, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } /* make sure all procs get same result so they can die gracefully */ GA_Igop(&result, 1, "+"); /* if error occured, find the highest failing node ID */ GA_Igop(&error_proc, 1, "max"); /* clear the error index for all but the highest failing node ID */ if (error_proc != GA_Nodeid()) { error_index = 0; } /* make sure all procs get the error index on the highest failing node ID */ GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_a); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(result_a); GA_Destroy(g_a); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_ndim2.c0000644000175000017500000000160312662210460016707 0ustar mbamba/* * Test Program for GA * This is to test GA_Ndim (is a local operation) * verifing GA_Ndim -- which returns dimension of the g_A */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define SIZE 20 #define NDIM 7 verify_ga_dim(int ndim) { int g_A, dims[ndim], i; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_C, local_C[DIM][DIM], dims[DIM]={5,5}; int val_A=5, val_B=3, ld=DIM, max; int lo[DIM]={2,2}, hi[DIM]={4,4}, blo[DIM]={0,0}, bhi[DIM]={2,2}, clo[DIM]={1,1}, chi[DIM]={3,3}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); g_C = NGA_Create(C_INT, DIM, dims, "array_C", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); GA_Zero(g_C); GA_Elem_maximum_patch(g_A, lo, hi, g_B, blo, bhi, g_C, clo, chi); GA_Print(g_C); GA_Sync(); NGA_Get(g_C, clo, chi, local_C, &ld); if(rank==1) { for(i=0; ival_B) max=val_A; else max=val_B; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, alo[DIM]={0,0}, ahi[DIM]={3,3}, blo[DIM]={0,0}, bhi[DIM]={3,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); // GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Copy_patch('N', g_A, alo, ahi, g_B, blo, bhi); // GA_Print(g_B); NGA_Get(g_B, blo, bhi, local_A, &ld); if(rank==0) { /* for(i=0; i<3; i++) { for(j=0; j<3; j++)// printf("%d ", local_A[i][j]); printf("\n"); } //printf("\n"); */ for(i=0; i<3; i++) { for(j=0; j<3; j++) if( local_A[i][j]!=value) printf("ERROR : \n"); } } // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_nnodes.c0000644000175000017500000000127412662210460017170 0ustar mbamba/* * Test Program for GA * This is to test GA_Nnodes (is a local operation) * _Nnodes -- returns numbers of processes defined/assigned */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" node_check(int nprocs) { if(GA_Nnodes() != nprocs) printf("ERROR: GA_Nnodes didnt return right number of processes \n"); } int main(int argc, char **argv) { int rank, nprocs; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); node_check(nprocs); GA_Sync(); if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); return 0; } ga-5-4/global/testing/unit-tests/ga_put2.c0000644000175000017500000000264312662210460016575 0ustar mbamba/* * Test Program for GA * This is to test GA_Put (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 20 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, **local_A=NULL, **local_B=NULL; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={SIZE-SIZE,SIZE-SIZE}, hi[DIM]={SIZE-1,SIZE-1}, ld=5, value=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); local_A=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs; int g_A, g_B; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A=GA_Create_handle(); g_B=GA_Create_handle(); if(!g_A)\ GA_ERROR_MSG(); if(!g_B) GA_ERROR_MSG(); GA_Sync(); if(rank == 0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_transpose2.c0000644000175000017500000000366712662210460020012 0ustar mbamba/* * Test Program for GA * This is to test GA_Transpose (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * _Transpose -- used to transpose the whole array * * not completed --- */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 validate_transpose(int local_A[][SIZE], int local_B[][SIZE]) { int i, j; for(i=1; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 int main(int argc, char **argv) { int rank, nprocs; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); if(rank != GA_Nodeid()) GA_ERROR_MSG(); GA_Sync(); if(rank == 0) GA_COMPLETE_MSG(); GA_Terminate(); MPI_Finalize(); return 0; } ga-5-4/global/testing/unit-tests/ga_transpose.c0000644000175000017500000000314512662210460017717 0ustar mbamba/* * Test Program for GA * This is to test GA_Transpose (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * _Transpose -- used to transpose the whole array * * not completed --- */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, value=5, local_GA[SIZE][SIZE], local_A[SIZE][SIZE], local_B[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={0,0}, hi[DIM]={4,4}, ld=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" addition_operator(int rank, int nprocs, int n) { int i; double x[n], temp[n]; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i; int g_A, value=5; int dims[DIM]={5,5}, dims2[DIM], ndim, type; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); GA_Print(g_A); printf(" -----------%d\n", rank); GA_Sync(); printf(" %d-----------\n", rank); GA_Print(g_A); if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_copypatch2.c0000644000175000017500000000327112662210460017755 0ustar mbamba/* * Test Program for GA * This is to test GA_Copy_patch (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_Duplicate --used to duplicate and generate one more global array.., handle 'g_A' to 'g_B' * GA_Copy -- is used to transfer the data from one array to other.., ie) from g_A to g_B * GA_Copy_patch -- is used to copy only certain patch of one array to another */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, alo[DIM]={0,0}, ahi[DIM]={3,3}, blo[DIM]={0,0}, bhi[DIM]={3,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Copy_patch('N', g_A, alo, ahi, g_B, blo, bhi); GA_Print(g_B); NGA_Get(g_B, blo, bhi, local_A, &ld); if(rank==0) { for(i=0; i<3; i++) { for(j=0; j<3; j++) printf("%d ", local_A[i][j]); printf("\n"); } printf("\n"); for(i=0; i<3; i++) { for(j=0; j<3; j++) if( local_A[i][j]!=value) printf("ERROR : \n"); } } // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_duplicate.c0000644000175000017500000000267112662210460017656 0ustar mbamba/* * Test Program for GA * This is to test GA_Duplicate (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_Duplicate --helps to duplicate the content from handle 'g_A' * Here used GA_Inquire to verify that g_A hanle returns the right values of created_array */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i; double g_A, g_B; int dims[DIM]={5,5}, dims2[DIM], ndim2, type2, dims3[DIM], ndim3, type3; double value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_DBL, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_DBL, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Sync(); GA_Fill(g_B, &val2); GA_Print(g_B); if(rank==0) { NGA_Inquire(g_A, &type2, &ndim2, dims2); NGA_Inquire(g_A, &type3, &ndim3, dims3); printf(" %d -- %d,,\n", type2, ndim2); if(type2!=type3 || ndim2!=ndim3 ) printf("ERROE : \n"); if(type2==type3 || ndim2==ndim3 ) printf("ERROE : Equal \n"); for(i=0; i #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define NUM 10 addition_operator(int *x, int nprocs) { int i, temp[NUM]; char *op="min"; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; double g_A, g_B; int dims[DIM]={SIZE,SIZE}, dims2[DIM], ndim2, type2, dims3[DIM], ndim3, type3, lo[DIM]={0,0}, hi[DIM]={4,4}, ld=SIZE; double value=5, val2=4; double local_A[SIZE][SIZE], local_B[SIZE][SIZE]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_DBL, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_DBL, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Sync(); GA_Copy(g_A, g_B); GA_Print(g_B); // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ if(rank==0) { NGA_Get(g_A, lo, hi, local_A, &ld); NGA_Get(g_B, lo, hi, local_B, &ld); for(i=1; i<3; i++) { for(j=1; j<3; j++) printf("%f ", local_B[i][j]); printf("\n"); } printf("\n"); for(i=1; i<3; i++) { for(j=1; j<3; j++) printf("%f ", local_A[i][j]); printf("\n"); } printf("\n"); for(i=1; i<3; i++) { for(j=1; j<3; j++) { if(local_B[j][i]!=local_A[i][j]) printf("ERROR : in passing values \n"); } } } if(rank == 0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_abs_value.c0000644000175000017500000000636712662210460017653 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *result_a; int g_a; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; /* create the local array and result array */ mock_a = Mock_Create(type, ndim, dims, "mock", NULL); result_a = Mock_Create(type, ndim, dims, "mock", NULL); /* create the global array */ g_a = create_function[dist_idx](type, ndim, dims); /* create meaningful data for local array */ mock_data(mock_a, g_a); /* init global array with same data as local array */ mock_to_global(mock_a, g_a); /* call the local routine */ Mock_Abs_value(mock_a); /* call the global routine */ GA_Abs_value(g_a); /* get the results from the global array */ global_to_mock(g_a, result_a); /* compare the results */ result = neq_mock(mock_a, result_a, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } /* make sure all procs get same result so they can die gracefully */ GA_Igop(&result, 1, "+"); /* if error occured, find the highest failing node ID */ GA_Igop(&error_proc, 1, "max"); /* clear the error index for all but the highest failing node ID */ if (error_proc != GA_Nodeid()) { error_index = 0; } /* make sure all procs get the error index on the highest failing node ID */ GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_a); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(result_a); GA_Destroy(g_a); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_set_diagonal.c0000644000175000017500000000214212662210460020326 0ustar mbamba/* * Test Program for GA * This is to test GA_Set_diagonal (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * handle G_V -- represents the array of single dimension * */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define GSIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_V, g_V2; int dims[DIM]={GSIZE,GSIZE}, ld=5; int val1=5, val2=4, val3=25, dims_V=GSIZE; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &dims_V, "array_V", NULL); g_V2 = NGA_Create(C_INT, 1, &dims_V, "array_V2", NULL); GA_Fill(g_A, &val1); GA_Fill(g_V, &val2); GA_Set_diagonal(g_A, g_V); GA_Add_diagonal(g_A, g_V); GA_Get_diag(g_A, g_V2); GA_Print(g_A); GA_Print(g_V); GA_Print(g_V2); GA_Sync(); if(rank == 0) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_elem_multiplypatch.c0000644000175000017500000000313612662210460021602 0ustar mbamba/* * Test Program for GA * This is to test GA_Elem_multiply_patch (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_Elem_multiply -- used to multiply two array and store it in one * Here _elem_multiply patch -- help to does the same function of_elem_multiply ...to an specified patch in array */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_C, local_C[DIM][DIM]; int dims[DIM]={5,5}, dims2[DIM], ndim, type; int val_A=5, val_B=3, ld=DIM; int lo[DIM]={2,2}, hi[DIM]={4,4}, blo[DIM]={0,0}, bhi[DIM]={2,2}, clo[DIM]={1,1}, chi[DIM]={3,3}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); g_C = NGA_Create(C_INT, DIM, dims, "array_C", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); GA_Zero(g_C); GA_Elem_multiply_patch(g_A, lo, hi, g_B, blo, bhi, g_C, clo, chi); GA_Print(g_C); GA_Sync(); NGA_Get(g_C, clo, chi, local_C, &ld); if(rank==1) { for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define GSIZE 10 irregular_array1(int rank) { int g_A, g_B; int dims[DIM]={5,10}, dims2[DIM], ndim, type, val_A=5, block[DIM]={2,3}, map[5]={0,2,0,4,6}, val_B=7; int n_block[DIM], block_dims[DIM], i; g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create_irreg(C_INT, DIM, dims, "array_B", block, map); GA_Fill(g_A, &val_A); GA_Print(g_A); GA_Fill(g_B, &val_B); GA_Print(g_B); GA_Sync(); NGA_Inquire(g_A, &type, &ndim, dims2); //printf(" %d -- %d,,\n", type, ndim); /* GA_Get_block_info(g_B, n_block, block_dims); for(i=0; i=GSIZE); block[0]=b1; block[1]=b2; map=(int*)malloc(nprocs*sizeof(int)); for(i=0; i=GSIZE); block[0]=b1; block[1]=b2; map=(int*)malloc(nprocs*sizeof(int)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define N 5 #define D 2 main(int argc, char **argv) { int rank, nprocs; int g_A, dims[D]={5,10}, local_A[N], sub_array[N][D], **s_array=NULL; int i, j, value=0; MPI_Init(&argc, &argv); GA_Initialize(); MA_init(C_INT, 1000, 1000); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); s_array=(int**)malloc(N*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 validate_transpose(int g_A, int g_B, int* lo, int* hi, int ld) { int i, j; int local_A[SIZE][SIZE], local_B[SIZE][SIZE]; // int **local_A=NULL, **local_B=NULL; /* local_A=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs; int g_A, g_V, val2=3, local_A[SIZE][SIZE], dims_V=SIZE, local_V[dims_V], local_Ar[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={0,0}, hi[DIM]={4,4}, ld=5, i, j; int loV=0, hiV=dims_V-1, arlo[DIM]={0,0}, arhi[DIM]={4,4}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 integer_dot(int rank, int nprocs) { int g_A, g_B; int dims[DIM]={SIZE,SIZE}, val_A=5, val_B=10, op; MA_init(C_INT, 1000, 1000); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_INT, DIM, dims, "array_B", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); if(rank==0) { op=GA_Idot(g_A, g_B); printf("%d \n", op); } } /* when i use int_type is working...have find the reason behind the other datatype and how to use it.., */ /* float_dot(int rank, int nprocs) { int dims[DIM]={SIZE,SIZE}; double g_A, g_B; double val_A=5, val_B=10, op; //MA_init(C_DBL, 1000, 1000); g_A = NGA_Create(C_DBL, DIM, dims, "array_A", NULL); g_B = NGA_Create(C_DBL, DIM, dims, "array_B", NULL); GA_Fill(g_A, &val_A); GA_Fill(g_B, &val_B); if(rank==0) op=GA_Ddot(g_A, g_B); // printf("%d \n", op); } */ main(int argc, char **argv) { int rank, nprocs; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); // MA_init(C_DBL, 1000, 1000); GA_Initialize(); integer_dot(rank, nprocs); //float_dot(rank, nprocs); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_get.c0000644000175000017500000000264212662210460016461 0ustar mbamba/* * Test Program for GA * This is to test GA_Get (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, **local_A=NULL, **local_B=NULL; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={SIZE-SIZE,SIZE-SIZE}, hi[DIM]={SIZE-1,SIZE-1}, ld=5, value=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); local_A=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 5 #define MAX_DIM 2 create_irreg_ga(int ndim) { int g_A; int dims[ndim], i; int block[ndim], *map=NULL; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define SIZE 5 #define ONE_DIM 1 #define TWO_DIM 2 #define THREE_DIM 3 one_dimension() { int g_A, dims[ONE_DIM]={SIZE}; g_A = NGA_Create(C_INT, ONE_DIM, dims, "array_A", NULL); if(GA_Ndim(g_A) != ONE_DIM) printf("ERROR: GA_Ndim didnt return nDimension after GA_Initialize \n"); GA_Destroy(g_A); } two_dimension() { int g_A, dims[TWO_DIM]={SIZE,SIZE}; g_A = NGA_Create(C_INT, TWO_DIM, dims, "array_A", NULL); if(GA_Ndim(g_A) != TWO_DIM) printf("ERROR: GA_Ndim didnt return nDimension after GA_Initialize \n"); GA_Destroy(g_A); } three_dimension() { int g_A, dims[THREE_DIM]={SIZE,SIZE,SIZE}; g_A = NGA_Create(C_INT, THREE_DIM, dims, "array_A", NULL); if(GA_Ndim(g_A) != THREE_DIM) printf("ERROR: GA_Ndim didnt return nDimension after GA_Initialize \n"); GA_Destroy(g_A); } int main(int argc, char **argv) { int rank, nprocs, n=1, temp=0; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); one_dimension(); two_dimension(); three_dimension(); GA_Sync(); if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); return 0; } ga-5-4/global/testing/unit-tests/ga_create3.c0000644000175000017500000000235412662210460017230 0ustar mbamba/* * Test Program for GA * This is to test GA_Create (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * Here used GA_Inquire to verify that g_A hanle returns the right values of created_array */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 10 #define MAX_DIM 7 //#define NUM_TYPES 3 void create_ga(int ndim, int datatypes) { int g_A; int dims[MAX_DIM], i, val=4; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 10 #define MAX_DIM 7 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B; int dims[MAX_DIM], val=4, ndim, re; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); for(i=1; i<=MAX_DIM; i++) { ndim=i; dims[i]=SIZE; // for(j=0; j0) printf("Cholesky Fact couldn't be completed \n"); else printf("An Error occured\n"); if(rank == 0) GA_PRINT_MSG(); GA_Destroy(g_A); GA_Destroy(g_B); GA_Terminate(); MPI_Finalize(); } /* * TO-DO : assign SIZE to a bigger value */ ga-5-4/global/testing/unit-tests/ga_igop.c0000644000175000017500000001062412662210460016637 0ustar mbamba/* * Test Program for GA * This is to test GA_Igop (is a collective operation) * * */ #include #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define NUM 10 #if 0 addition_operator(int rank, int nprocs, int n) { int x[n], i, temp[n]; char op='+'; for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[SIZE][SIZE], local_B[SIZE][SIZE]; int dims[DIM]={SIZE,SIZE}, alo[DIM]={0,0}, ahi[DIM]={SIZE-1,SIZE-1}, blo[DIM]={0,0}, bhi[DIM]={4,4}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Print(g_B); NGA_Get(g_A, alo, ahi, local_A, &ld); NGA_Get(g_B, blo, bhi, local_B, &ld); if(rank==0) { for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 fillandscale(int rank, int nprocs) { int g_A, val1=5, val2=5, local_A[SIZE][SIZE], i, j; int dims[DIM]={SIZE,SIZE}, alo[DIM]={1,1}, ahi[DIM]={2,2}, ld=5; g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Zero(g_A); NGA_Fill_patch(g_A, alo, ahi, &val1); GA_Print(g_A); GA_Scale(g_A, &val2); GA_Print(g_A); NGA_Get(g_A, alo, ahi, local_A, &ld); if(rank == 1) { for(i=0; i 0) { printf("%d", array[0]); } for (i=1; i #include #include #include #include "mock.h" #include "abstract_ops.h" void Mock_Abs_value(mock_ga_t *g_a) { ITER_DECLARE_VARS(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_abs_##AT(*g_a_buf,*g_a_buf); \ ITER_NEXT(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Abs_value_patch(mock_ga_t *g_a, int *lo, int *hi) { ITER_DECLARE_VARS_PATCH(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT_PATCH(g_a,C_TYPE,lo,hi) \ ITER_BEGIN(g_a,C_TYPE) \ assign_abs_##AT(*g_a_buf,*g_a_buf); \ ITER_NEXT_PATCH(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Access_block_grid(mock_ga_t *g_a, int index[], void *ptr, int ld[]) { } void Mock_Access_block(mock_ga_t *g_a, int idx, void *ptr, int ld[]) { } void Mock_Access_block_segment(mock_ga_t *g_a, int proc, void *ptr, int *len) { } void Mock_Access_ghost_element(mock_ga_t *g_a, void *ptr, int subscript[], int ld[]) { } void Mock_Access_ghosts(mock_ga_t *g_a, int dims[], void *ptr, int ld[]) { } void Mock_Access(mock_ga_t *g_a, int lo[], int hi[], void *ptr, int ld[]) { } void Mock_Acc(mock_ga_t *g_a, int lo[], int hi[],void* buf, int ld[],void* alpha) { } void Mock_Add_constant(mock_ga_t *g_a, void* alpha) { ITER_DECLARE_VARS(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ C_TYPE value = *((C_TYPE*)alpha); \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ add_assign_##AT(*g_a_buf,value); \ ITER_NEXT(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Add_constant_patch(mock_ga_t *g_a, int *lo, int *hi,void *alpha) { /* ITER_DECLARE_VARS_PATCH(g_a) switch (g_a->type){ #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ C_TYPE value = *((C_TYPE*)alpha); \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ add_assign_##AT(*g_a_buf,value); \ ITIR_NEXT_PATCH(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } */ } void Mock_Add_diagonal(mock_ga_t *g_a, int g_v) { } void Mock_Add_patch(void * alpha, mock_ga_t *g_a, int alo[], int ahi[], void * beta, mock_ga_t *g_b, int blo[], int bhi[], mock_ga_t *g_c, int clo[], int chi[]) { } void Mock_Add(void *alpha, mock_ga_t *g_a, void* beta, mock_ga_t *g_b, mock_ga_t *g_c) { } int Mock_Allocate(mock_ga_t *g_a) { } int Mock_Assemble_duplicate(mock_ga_t *g_a, char *name, void *ptr) { } void Mock_Brdcst(void *buf, int lenbuf, int root) { } SingleComplex Mock_Cdot(mock_ga_t *g_a, mock_ga_t *g_b) { } SingleComplex Mock_Cdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Cgemm(char ta, char tb, int m, int n, int k, SingleComplex alpha, mock_ga_t *g_a, mock_ga_t *g_b, SingleComplex beta, mock_ga_t *g_c ) { } void Mock_Cgop(SingleComplex x[], int n, char *op) { } void Mock_Check_handle(mock_ga_t *g_a, char *string) { } int Mock_Cluster_nnodes(void) { } int Mock_Cluster_nodeid(void) { } int Mock_Cluster_nprocs(int x) { } int Mock_Cluster_procid(int x, int y) { } int Mock_Cluster_proc_nodeid(int proc) { } int Mock_Compare_distr(mock_ga_t *g_a, mock_ga_t *g_b) { } void Mock_Copy(mock_ga_t *g_a, mock_ga_t *g_b) { } void Mock_Copy_patch(char trans, mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[]) { } mock_ga_t* Mock_Create_config(int type, int ndim, int dims[], char *name, int chunk[], int p_handle) { return Mock_Create(type, ndim, dims, name, chunk); } mock_ga_t* Mock_Create_ghosts_config(int type, int ndim, int dims[], int width[], char *name, int chunk[], int p_handle) { return Mock_Create(type, ndim, dims, name, chunk); } mock_ga_t* Mock_Create_ghosts(int type, int ndim, int dims[], int width[], char *name, int chunk[]) { return Mock_Create(type, ndim, dims, name, chunk); } mock_ga_t* Mock_Create_ghosts_irreg_config(int type, int ndim, int dims[], int width[], char *name, int map[], int nblock[], int p_handle) { return Mock_Create(type, ndim, dims, name, NULL); } mock_ga_t* Mock_Create_ghosts_irreg(int type, int ndim, int dims[], int width[], char *name, int map[], int nblock[]) { return Mock_Create(type, ndim, dims, name, NULL); } mock_ga_t* Mock_Create_handle(void) { return (mock_ga_t*)malloc(sizeof(mock_ga_t)); } mock_ga_t* Mock_Create(int type, int ndim, int dims[], char *name, int chunk[]) { int i; int nd_m1 = ndim-1; mock_ga_t *g_a = (mock_ga_t*)malloc(sizeof(mock_ga_t)); g_a->type = type; g_a->ndim = ndim; g_a->nd_m1 = nd_m1; g_a->size = 1; g_a->itemsize = (int)type_to_size(type); memset(g_a->dims, 0, sizeof(int)*GA_MAX_DIM); memset(g_a->dims_m1, 0, sizeof(int)*GA_MAX_DIM); memset(g_a->strides, 0, sizeof(int)*GA_MAX_DIM); memset(g_a->backstrides, 0, sizeof(int)*GA_MAX_DIM); for (i=0; idims[i] = dims[i]; g_a->size *= dims[i]; } /* setup important iterator variables */ for (i=nd_m1; i>=0; --i) { g_a->dims_m1[i] = dims[i]-1; g_a->strides[i] = (i == nd_m1) ? 1 : g_a->strides[i+1]*g_a->dims[i+1]; g_a->backstrides[i] = g_a->dims_m1[i]*g_a->strides[i]; } #if 0 /* scale the back/strides based on itemsize */ for (i=0; istrides[i] *= g_a->itemsize; g_a->backstrides[i] *= g_a->itemsize; } #endif g_a->buf = malloc(g_a->size * g_a->itemsize); #if 0 printf("Mock_Create(%d, %d, dims, %s, chunk)\n", type, ndim, name); aprint("dims", g_a->dims, g_a->ndim); aprint("dims_m1", g_a->dims_m1, g_a->ndim); aprint("strides", g_a->strides, g_a->ndim); aprint("backstrides", g_a->backstrides, g_a->ndim); #endif return g_a; } mock_ga_t* Mock_Create_irreg_config(int type, int ndim, int dims[],char *name, int block[], int map[], int p_handle) { return Mock_Create(type, ndim, dims, name, NULL); } mock_ga_t* Mock_Create_irreg(int type, int ndim, int dims[],char *name, int block[], int map[]) { return Mock_Create(type, ndim, dims, name, NULL); } int Mock_Create_mutexes(int number) { } double Mock_Ddot(mock_ga_t *g_a, mock_ga_t *g_b) { } double Mock_Ddot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } int Mock_Deregister_type(int type) { } void Mock_Destroy(mock_ga_t *g_a) { } int Mock_Destroy_mutexes(void) { } void Mock_Dgemm(char ta, char tb, int m, int n, int k, double alpha, mock_ga_t *g_a, mock_ga_t *g_b, double beta, mock_ga_t *g_c ) { } void Mock_Dgop(double x[], int n, char *op) { } void Mock_Diag(mock_ga_t *g_a, int g_s, int g_v, void *eval) { } void Mock_Diag_reuse(int reuse, mock_ga_t *g_a, int g_s, int g_v, void *eval) { } void Mock_Diag_seq(mock_ga_t *g_a, int g_s, int g_v, void *eval) { } void Mock_Diag_std(mock_ga_t *g_a, int g_v, void *eval) { } void Mock_Diag_std_seq(mock_ga_t *g_a, int g_v, void *eval) { } void Mock_Distribution(mock_ga_t *g_a, int iproc, int lo[], int hi[]) { } mock_ga_t* Mock_Duplicate(mock_ga_t *g_a, char* array_name) { } void Mock_Elem_divide(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c) { /* TODO FIXME: wasn't compiling */ #if 0 ITER_DECLARE_VARS(g_a) ITER_DECLARE_VARS(g_b) ITER_DECLARE_VARS(g_c) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_DECLARE_BUFFER(g_b,C_TYPE) \ ITER_DECLARE_BUFFER(g_c,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_INIT(g_b,C_TYPE) \ ITER_INIT(g_c,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_div_##AT(*g_c_buf,*g_a_buf,*g_b_buf); \ ITER_NEXT(g_a) \ ITER_NEXT(g_b) \ ITER_NEXT(g_c) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } #endif } void Mock_Elem_divide_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi,mock_ga_t *g_c, int *clo, int *chi) { } void Mock_Elem_maximum(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c) { ITER_DECLARE_VARS(g_a) ITER_DECLARE_VARS(g_b) ITER_DECLARE_VARS(g_c) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_DECLARE_BUFFER(g_b,C_TYPE) \ ITER_DECLARE_BUFFER(g_c,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_INIT(g_b,C_TYPE) \ ITER_INIT(g_c,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_max_##AT(*g_c_buf,*g_a_buf,*g_b_buf); \ ITER_NEXT(g_a) \ ITER_NEXT(g_b) \ ITER_NEXT(g_c) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Elem_maximum_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi,mock_ga_t *g_c, int *clo, int *chi) { } void Mock_Elem_minimum(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c) { ITER_DECLARE_VARS(g_a) ITER_DECLARE_VARS(g_b) ITER_DECLARE_VARS(g_c) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_DECLARE_BUFFER(g_b,C_TYPE) \ ITER_DECLARE_BUFFER(g_c,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_INIT(g_b,C_TYPE) \ ITER_INIT(g_c,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_max_##AT(*g_c_buf,*g_a_buf,*g_b_buf); \ ITER_NEXT(g_a) \ ITER_NEXT(g_b) \ ITER_NEXT(g_c) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Elem_minimum_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi,mock_ga_t *g_c, int *clo, int *chi) { /* ITER_DECLARE_VARS_PATCH(g_a) ITER_DECLARE_VARS_PATCH(g_b) ITER_DECLARE_VARS_PATCH(g_c) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_DECLARE_BUFFER(g_b,C_TYPE) \ ITER_DECLARE_BUFFER(g_c,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE,lo,hi) \ assign_abs_##AT(*g_a_buf,*g_a_buf); \ ITER_NEXT_PATCH(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } */ } void Mock_Elem_multiply(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c) { ITER_DECLARE_VARS(g_a) ITER_DECLARE_VARS(g_b) ITER_DECLARE_VARS(g_c) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_DECLARE_BUFFER(g_b,C_TYPE) \ ITER_DECLARE_BUFFER(g_c,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_INIT(g_b,C_TYPE) \ ITER_INIT(g_c,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_mul_##AT(*g_c_buf,*g_a_buf,*g_b_buf); \ ITER_NEXT(g_a) \ ITER_NEXT(g_b) \ ITER_NEXT(g_c) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Elem_multiply_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi,mock_ga_t *g_c, int *clo, int *chi) { } void Mock_Error(char *str, int code) { } float Mock_Fdot(mock_ga_t *g_a, mock_ga_t *g_b) { } float Mock_Fdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Fence(void) { } void Mock_Fgop(float x[], int n, char *op) { } void Mock_Fill(mock_ga_t *g_a, void *value) { ITER_DECLARE_VARS(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_##AT(*g_a_buf,*g_a_buf); \ ITER_NEXT(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Fill_patch(mock_ga_t *g_a, int lo[], int hi[], void *val) { } void Mock_Freemem(void* ptr) { } void Mock_Gather_flat(mock_ga_t *g_a, void *v, int subsArray[], int n) { } void Mock_Gather(mock_ga_t *g_a, void *v, int* subsArray[], int n) { } void Mock_Get_block_info(mock_ga_t *g_a, int num_blocks[], int block_dims[]) { } int Mock_Get_debug(void) { } void Mock_Get_diag(mock_ga_t *g_a, int g_v) { } int Mock_Get_dimension(mock_ga_t *g_a) { } void Mock_Get_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld) { } void Mock_Get_ghost_block(mock_ga_t *g_a, int lo[], int hi[], void *buf, int ld[]) { } void Mock_Get(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]) { } void* Mock_Getmem(int type, int nelem, int grp_id) { } int Mock_Get_pgroup(mock_ga_t *g_a) { } int Mock_Get_pgroup_size(int grp_id) { } void Mock_Get_proc_grid(mock_ga_t *g_a, int dims[]) { } void Mock_Get_proc_index(mock_ga_t *g_a, int iproc, int subscript[]) { } void Mock_Gop(int type, void *x, int n, char *op) { } int Mock_Has_ghosts(mock_ga_t *g_a) { } int Mock_Idot(mock_ga_t *g_a, mock_ga_t *g_b) { } int Mock_Idot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Igop(int x[], int n, char *op) { } void Mock_Init_fence(void) { } void Mock_Initialize_args(int *argc, char ***argv) { } void Mock_Initialize_ltd(size_t limit) { } void Mock_Initialize(void) { } void Mock_Inquire(mock_ga_t *g_a, int *type, int *ndim, int dims[]) { } size_t Mock_Inquire_memory(void) { } char* Mock_Inquire_name(mock_ga_t *g_a) { } int Mock_Is_mirrored(mock_ga_t *g_a) { } long Mock_Ldot(mock_ga_t *g_a, mock_ga_t *g_b) { } long Mock_Ldot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Lgop(long x[], int n, char *op) { } void Mock_List_nodeid(int *list, int nprocs) { } long long Mock_Lldot(mock_ga_t *g_a, mock_ga_t *g_b) { } long long Mock_Lldot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Llgop(long long x[], int n, char *op) { } int Mock_Llt_solve(mock_ga_t *g_a, mock_ga_t *g_b) { } int Mock_Locate(mock_ga_t *g_a, int subscript[]) { } int Mock_Locate_nnodes(mock_ga_t *g_a, int lo[], int hi[]) { } int Mock_Locate_num_blocks(mock_ga_t *g_a, int lo[], int hi[]) { } int Mock_Locate_region(mock_ga_t *g_a, int lo[], int hi[], int map[], int procs[]) { } void Mock_Lock(int mutex) { } void Mock_Lu_solve(char tran, mock_ga_t *g_a, mock_ga_t *g_b) { } void Mock_Mask_sync(int first, int last) { } void Mock_Matmul_patch_2d(char transa, char transb, void* alpha, void *beta, mock_ga_t *g_a, int ailo, int aihi, int ajlo, int ajhi, mock_ga_t *g_b, int bilo, int bihi, int bjlo, int bjhi, mock_ga_t *g_c, int cilo, int cihi, int cjlo, int cjhi) { } void Mock_Matmul_patch(char transa, char transb, void* alpha, void *beta, mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[], mock_ga_t *g_c, int clo[], int chi[]) { } void Mock_Median(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c, int g_m) { } void Mock_Median_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi, mock_ga_t *g_c, int *clo, int *chi, int g_m, int *mlo, int *mhi) { } size_t Mock_Memory_avail(void) { } int Mock_Memory_limited(void) { } void Mock_Merge_distr_patch(mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[]) { } void Mock_Merge_mirrored(mock_ga_t *g_a) { } void Mock_NbAcc(mock_ga_t *g_a, int lo[], int hi[],void* buf, int ld[],void* alpha, ga_nbhdl_t* nbhandle) { } void Mock_Nbget_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize,void *buf, int *ld, ga_nbhdl_t *nbhandle) { } void Mock_NbGet_ghost_dir(mock_ga_t *g_a, int mask[], ga_nbhdl_t* handle) { } void Mock_NbGet(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle) { } void Mock_Nblock(mock_ga_t *g_a, int *nblock) { } void Mock_Nbput_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld, ga_nbhdl_t *nbhandle) { } void Mock_NbPut(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle) { } int Mock_NbTest(ga_nbhdl_t* nbhandle) { } void Mock_NbWait(ga_nbhdl_t* nbhandle) { } int Mock_Ndim(mock_ga_t *g_a) { } int Mock_Nnodes(void) { } int Mock_Nodeid(void) { } void Mock_Norm1(mock_ga_t *g_a, double *nm) { } void Mock_Norm_infinity(mock_ga_t *g_a, double *nm) { } void Mock_Periodic_acc(mock_ga_t *g_a, int lo[], int hi[],void* buf, int ld[],void* alpha) { } void Mock_Periodic_get(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]) { } void Mock_Periodic_put(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]) { } int Mock_Pgroup_absolute_id(int pgroup, int pid) { } void Mock_Pgroup_brdcst(int grp, void *buf, int lenbuf, int root) { } void Mock_Pgroup_cgop(int grp, SingleComplex x[], int n, char *op) { } int Mock_Pgroup_create(int *list, int count) { } int Mock_Pgroup_destroy(int grp) { } void Mock_Pgroup_dgop(int grp, double x[], int n, char *op) { } void Mock_Pgroup_fgop(int grp, float x[], int n, char *op) { } int Mock_Pgroup_get_default(void) { } int Mock_Pgroup_get_mirror(void) { } int Mock_Pgroup_get_world(void) { } void Mock_Pgroup_igop(int grp, int x[], int n, char *op) { } void Mock_Pgroup_lgop(int grp, long x[], int n, char *op) { } void Mock_Pgroup_llgop(int grp, long long x[], int n, char *op) { } int Mock_Pgroup_nnodes(int grp_id) { } int Mock_Pgroup_nodeid(int grp_id) { } void Mock_Pgroup_set_default(int p_handle) { } int Mock_Pgroup_split(int grp_id, int num_group) { } int Mock_Pgroup_split_irreg(int grp_id, int color) { } void Mock_Pgroup_sync(int grp_id) { } void Mock_Pgroup_zgop(int grp, DoubleComplex x[], int n, char *op) { } void Mock_Print_distribution(mock_ga_t *g_a) { } void Mock_Print_file(FILE *file, mock_ga_t *g_a) { } /* just for debugging purposes */ void Mock_Print(mock_ga_t *g_a) { switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ int i,j; \ int coords[GA_MAX_DIM] = {0}; \ C_TYPE *ptr = (C_TYPE*)(g_a->buf); \ for (i=0; isize; ++i) { \ printf("%d (%d", i, coords[0]); \ for (j=1; jndim; ++j) { \ printf(",%d", coords[j]); \ } \ printf(") " AT "\n", ptr[i]); \ for (j=g_a->nd_m1; j>=0; --j) { \ if (coords[j] < g_a->dims_m1[j]) { \ ++coords[j]; \ break; \ } \ else { \ coords[j] = 0; \ } \ } \ } \ break; \ } TYPE_CASE(C_INT,int,"%d") TYPE_CASE(C_LONG,long,"%ld") TYPE_CASE(C_LONGLONG,long long,"%lld") TYPE_CASE(C_FLOAT,float,"%f") TYPE_CASE(C_DBL,double,"%f") #undef TYPE_CASE #define TYPE_CASE(GA_TYPE,C_TYPE) \ case GA_TYPE: \ { \ int i,j; \ int coords[GA_MAX_DIM] = {0}; \ C_TYPE *ptr = (C_TYPE*)(g_a->buf); \ for (i=0; isize; ++i) { \ printf("%d (%d", i, coords[0]); \ for (j=1; jndim; ++j) { \ printf(",%d", coords[j]); \ } \ printf(") %f+%fi\n", ptr[i].real, ptr[i].imag); \ for (j=g_a->nd_m1; j>=0; --j) { \ if (coords[j] <= g_a->dims_m1[j]) { \ ++coords[j]; \ break; \ } \ else { \ coords[j] = 0; \ } \ } \ } \ break; \ } TYPE_CASE(C_SCPL,SingleComplex) TYPE_CASE(C_DCPL,DoubleComplex) #undef TYPE_CASE } } void Mock_Print_patch_2d(mock_ga_t *g_a, int ilo, int ihi, int jlo, int jhi, int pretty) { } void Mock_Print_patch(mock_ga_t *g_a, int lo[], int hi[], int pretty) { } void Mock_Print_stats(void) { } void Mock_Proc_topology(mock_ga_t *g_a, int proc, int coord[]) { } void Mock_Put_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld) { } void Mock_Put(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]) { } void Mock_Randomize(mock_ga_t *g_a, void *value) { switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ int i; \ C_TYPE *ptr = (C_TYPE*)(g_a->buf); \ C_TYPE val = *((C_TYPE*)value); \ for (i=0; isize; ++i) { \ assign_rand_##AT(ptr[i],val); \ } \ break; \ } #include "types.xh" #undef TYPE_CASE } } long Mock_Read_inc(mock_ga_t *g_a, int subscript[], long inc) { } void Mock_Recip(mock_ga_t *g_a) { } void Mock_Recip_patch(mock_ga_t *g_a, int *lo, int *hi) { } void Mock_Register_stack_memory(void * (*ext_alloc)(size_t, int, char *), void (*ext_free)(void *)) { } int Mock_Register_type(size_t bytes) { } void Mock_Release_block_grid(mock_ga_t *g_a, int index[]) { } void Mock_Release_block(mock_ga_t *g_a, int idx) { } void Mock_Release_block_segment(mock_ga_t *g_a, int idx) { } void Mock_Release_ghost_element(mock_ga_t *g_a, int index[]) { } void Mock_Release_ghosts(mock_ga_t *g_a) { } void Mock_Release(mock_ga_t *g_a, int lo[], int hi[]) { } void Mock_Release_update_block_grid(mock_ga_t *g_a, int index[]) { } void Mock_Release_update_block(mock_ga_t *g_a, int idx) { } void Mock_Release_update_block_segment(mock_ga_t *g_a, int idx) { } void Mock_Release_update_ghost_element(mock_ga_t *g_a, int index[]) { } void Mock_Release_update_ghosts(mock_ga_t *g_a) { } void Mock_Release_update(mock_ga_t *g_a, int lo[], int hi[]) { } void Mock_Scale_cols(mock_ga_t *g_a, int g_v) { } void Mock_Scale(mock_ga_t *g_a, void *value) { /* ITER_DECLARE_VARS(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ C_TYPE value = *((C_TYPE*)alpha); \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ add_assign_##AT(*g_a_buf,value); \ ITER_NEXT(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } */ } void Mock_Scale_patch(mock_ga_t *g_a, int lo[], int hi[], void *alpha) { } void Mock_Scale_rows(mock_ga_t *g_a, int g_v) { } void Mock_Scan_add(mock_ga_t *g_a, mock_ga_t *g_b, int g_sbit, int lo, int hi, int excl) { } void Mock_Scan_copy(mock_ga_t *g_a, mock_ga_t *g_b, int g_sbit, int lo, int hi) { } void Mock_Scatter_acc_flat(mock_ga_t *g_a, void *v, int subsArray[], int n, void *alpha) { } void Mock_Scatter_acc(mock_ga_t *g_a, void *v, int* subsArray[], int n, void *alpha) { } void Mock_Scatter_flat(mock_ga_t *g_a, void *v, int subsArray[], int n) { } void Mock_Scatter(mock_ga_t *g_a, void *v, int* subsArray[], int n) { } void Mock_Select_elem(mock_ga_t *g_a, char* op, void* val, int *index) { } void Mock_Set_array_name(mock_ga_t *g_a, char *name) { } void Mock_Set_block_cyclic(mock_ga_t *g_a, int dims[]) { } void Mock_Set_block_cyclic_proc_grid(mock_ga_t *g_a, int block[], int proc_grid[]) { } void Mock_Set_chunk(mock_ga_t *g_a, int chunk[]) { } void Mock_Set_data(mock_ga_t *g_a, int ndim, int dims[], int type) { } void Mock_Set_debug(int flag) { } void Mock_Set_diagonal(mock_ga_t *g_a, int g_v) { } void Mock_Set_ghost_corner_flag(mock_ga_t *g_a, int flag) { } void Mock_Set_ghosts(mock_ga_t *g_a, int width[]) { } void Mock_Set_irreg_distr(mock_ga_t *g_a, int map[], int block[]) { } void Mock_Set_irreg_flag(mock_ga_t *g_a, int flag) { } void Mock_Set_memory_limit(size_t limit) { } void Mock_Set_pgroup(mock_ga_t *g_a, int p_handle) { } void Mock_Set_restricted(mock_ga_t *g_a, int list[], int size) { } void Mock_Set_restricted_range(mock_ga_t *g_a, int lo_proc, int hi_proc) { } void Mock_Sgemm(char ta, char tb, int m, int n, int k, float alpha, mock_ga_t *g_a, mock_ga_t *g_b, float beta, mock_ga_t *g_c ) { } void Mock_Shift_diagonal(mock_ga_t *g_a, void *c) { } int Mock_Solve(mock_ga_t *g_a, mock_ga_t *g_b) { } int Mock_Spd_invert(mock_ga_t *g_a) { } void Mock_Step_bound_info(int g_xx, int g_vv, int g_xxll, int g_xxuu, void *boundmin, void *wolfemin, void *boundmax) { } void Mock_Step_bound_info_patch(int g_xx, int *xxlo, int *xxhi, int g_vv, int *vvlo, int *vvhi, int g_xxll, int *xxlllo, int *xxllhi, int g_xxuu, int *xxuulo, int *xxuuhi, void *boundmin, void *wolfemin, void *boundmax) { } void Mock_Step_max(mock_ga_t *g_a, mock_ga_t *g_b, void *step) { } void Mock_Step_max_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi, void *step) { } void Mock_Strided_acc(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[], void *alpha) { } void Mock_Strided_get(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[]) { } void Mock_Strided_put(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[]) { } void Mock_Summarize(int verbose) { } void Mock_Symmetrize(mock_ga_t *g_a) { } void Mock_Sync(void) { } void Mock_Terminate(void) { } int Mock_Total_blocks(mock_ga_t *g_a) { } void Mock_Transpose(mock_ga_t *g_a, mock_ga_t *g_b) { } void Mock_Unlock(int mutex) { } int Mock_Update_ghost_dir(mock_ga_t *g_a, int dimension, int idir, int flag) { } void Mock_Update_ghosts(mock_ga_t *g_a) { } int Mock_Uses_fapi(void) { } int Mock_Uses_ma(void) { } int Mock_Uses_proc_grid(mock_ga_t *g_a) { } int Mock_Valid_handle(mock_ga_t *g_a) { return g_a != NULL; } int Mock_Verify_handle(mock_ga_t *g_a) { } double Mock_Wtime(void) { } DoubleComplex Mock_Zdot(mock_ga_t *g_a, mock_ga_t *g_b) { } DoubleComplex Mock_Zdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]) { } void Mock_Zero_diagonal(mock_ga_t *g_a) { } void Mock_Zero(mock_ga_t *g_a) { ITER_DECLARE_VARS(g_a) switch (g_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(g_a,C_TYPE) \ ITER_INIT(g_a,C_TYPE) \ ITER_BEGIN(g_a,C_TYPE) \ assign_zero_##AT(*g_a_buf); \ ITER_NEXT(g_a) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } } void Mock_Zero_patch(mock_ga_t *g_a, int lo[], int hi[]) { } void Mock_Zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, mock_ga_t *g_a, mock_ga_t *g_b, DoubleComplex beta, mock_ga_t *g_c ) { } void Mock_Zgop(DoubleComplex x[], int n, char *op) { } ga-5-4/global/testing/unit-tests/ga_scale.c0000644000175000017500000000745612662210460017001 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *result_a; int g_a; void *alpha = NULL; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; int ival = 6; long lval = 7; long long llval = 8; float fval = 9; double dval = 10; SingleComplex cval = {11,12}; DoubleComplex zval = {13,14}; /* create the local array and result array */ mock_a = Mock_Create(type, ndim, dims, "mock", NULL); result_a = Mock_Create(type, ndim, dims, "mock", NULL); /* create the global array */ g_a = create_function[dist_idx](type, ndim, dims); /* create meaningful data for local array */ mock_data(mock_a, g_a); /* init global array with same data as local array */ mock_to_global(mock_a, g_a); switch (type) { case C_INT: alpha = &ival; break; case C_LONG: alpha = &lval; break; case C_LONGLONG: alpha = &llval; break; case C_FLOAT: alpha = &fval; break; case C_DBL: alpha = &dval; break; case C_SCPL: alpha = &cval; break; case C_DCPL: alpha = &zval; break; } /* call the local routine */ Mock_Scale(mock_a, alpha); /* call the global routine */ GA_Scale(g_a, alpha); /* get the results from the global array */ global_to_mock(g_a, result_a); /* compare the results */ result = neq_mock(mock_a, result_a, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } /* make sure all procs get same result so they can die gracefully */ GA_Igop(&result, 1, "+"); /* if error occured, find the highest failing node ID */ GA_Igop(&error_proc, 1, "max"); /* clear the error index for all but the highest failing node ID */ if (error_proc != GA_Nodeid()) { error_index = 0; } /* make sure all procs get the error index on the highest failing node ID */ GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_a); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(result_a); GA_Destroy(g_a); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_get_blockinfo.c0000644000175000017500000000240512662210460020504 0ustar mbamba/* * Test Program for GA * This is to test GA_Create_irreg (is a collective operation) * GA_Create -- used to create a global array of regular size * GA_Create_IRREG -- used to create G_array of irregular size -- helps user to define the distribution * * GA_Get_Block_info -- used to obtain info (like number of blocks and block dimension) about the global array */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i; int g_A, g_B; int dims[DIM]={5,10}, dims2[DIM], ndim, type, value=5, block[DIM]={2,3}, map[5]={0,2,0,4,6}, val=7; int n_block[DIM], block_dims[DIM]; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = NGA_Create_irreg(C_INT, DIM, dims, "array_B", block, map); GA_Fill(g_A, &value); GA_Print(g_A); GA_Fill(g_B, &val); GA_Print(g_B); GA_Sync(); GA_Get_block_info(g_B, n_block, block_dims); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_C, **local_C=NULL, dims[DIM]={SIZE,SIZE}, val1=5, val2=4, alpha=3, beta=2; int clo[DIM]={SIZE-SIZE,SIZE-SIZE}, chi[DIM]={SIZE-1,SIZE-1}, ld=SIZE; int **local_tm=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); local_C=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_C, local_C[DIM][DIM], dims[DIM]={5,5}, val1=5, val2=4, alpha=3, beta=2, ld=5; int alo[DIM]={2,2}, ahi[DIM]={3,3}, blo[DIM]={2,2}, bhi[DIM]={3,3}, clo[DIM]={1,1}, chi[DIM]={2,2}; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_B = GA_Duplicate(g_A, "array_B"); g_C = GA_Duplicate(g_A, "array_C"); GA_Fill(g_A, &val1); GA_Fill(g_B, &val2); GA_Zero(g_C); NGA_Add_patch(&alpha, g_A, clo, chi, &beta, g_B, blo, bhi, g_C, clo, chi); GA_Sync(); GA_Print(g_A); GA_Print(g_B); GA_Print(g_C); NGA_Get(g_C, clo, chi, local_C, &ld); //printf("check 1 \n"); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define GSIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_V, g_V2; int dims[DIM]={GSIZE,GSIZE}, alo[DIM]={1,1}, ahi[DIM]={3,2}, blo[DIM]={1,1}, bhi[DIM]={2,3}, ld=5; int value=5, val2=4, dims_V=GSIZE; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &dims_V, "array_V", NULL); g_V2 = NGA_Create(C_INT, 1, &dims_V, "array_V2", NULL); GA_Fill(g_A, &value); GA_Zero_diagonal(g_A); GA_Print(g_A); g_B = GA_Duplicate(g_A, "array_B"); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Print(g_B); GA_Fill(g_V, &val2); GA_Print(g_V); GA_Add_diagonal(g_A, g_V); GA_Add_diagonal(g_B, g_V); GA_Print(g_A); GA_Sync(); GA_Get_diag(g_B, g_V2); GA_Print(g_V2); GA_Print(g_B); if(rank == 1) GA_PRINT_MSG(); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_put.c0000644000175000017500000000373612662210460016517 0ustar mbamba/* * Test Program for GA * This is to test GA_Put (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, **local_A=NULL, **local_B=NULL; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={SIZE-SIZE,SIZE-SIZE}, hi[DIM]={SIZE-1,SIZE-1}, ld=5, value=5; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); local_A=(int**)malloc(SIZE*sizeof(int*)); for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define ONE_DIM 1 #define TWO_DIM 2 #define SIZE 5 one_dimension_array(int rank, int val_V, int val_scale) { int g_V, *local_V=NULL, dims_V=SIZE; int lo=SIZE-SIZE, hi=SIZE-1, i, ld=SIZE; local_V=(int*)malloc(SIZE*sizeof(int)); g_V = NGA_Create(C_INT, ONE_DIM, &dims_V, "array_A", NULL); GA_Fill(g_V, &val_V); GA_Scale(g_V, &val_scale); GA_Print(g_V); NGA_Get(g_V, &lo, &hi, local_V, &ld); if(rank==1) { for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define GSIZE 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, g_V, local_A[5][5], local_B[5][5], vsize=GSIZE; int dims[DIM]={GSIZE,GSIZE}, alo[DIM]={1,1}, ahi[DIM]={3,2}, blo[DIM]={1,1}, bhi[DIM]={2,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &vsize, "array_V", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Zero_diagonal(g_A); GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Fill(g_V, &val2); GA_Print(g_B); GA_Print(g_V); //------------------------------------------------ /* */ //------------------------------------------------ GA_Sync(); if(rank == 1) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_gather.c0000644000175000017500000000414412662210460017153 0ustar mbamba/* * Test Program for GA * This is to test GA_Gather (is a one-sided operation) * GA_Create -- used to create a global array using handles like 'g_A' * * GA_gather -- used to get data from different location */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define N 5 #define D 2 main(int argc, char **argv) { int rank, nprocs; int g_A, dims[D]={5,10}, local_A[N], local_G[N], sub_array[N][D], **s_array=NULL; int i, j, value=5; MPI_Init(&argc, &argv); GA_Initialize(); MA_init(C_INT, 1000, 1000); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); s_array=(int**)malloc(N*sizeof(int*)); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, g_B, local_A[5][5], local_B[5][5]; int dims[DIM]={5,5}, alo[DIM]={1,1}, ahi[DIM]={3,2}, blo[DIM]={1,1}, bhi[DIM]={2,3}, ld=5; int value=5, val2=4; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); g_B = GA_Duplicate(g_A, "array_B"); GA_Print(g_A); GA_Fill(g_B, &val2); GA_Sync(); NGA_Zero_patch(g_B, blo, bhi); GA_Print(g_B); NGA_Get(g_A, alo, ahi, local_A, &ld); NGA_Get(g_B, blo, bhi, local_B, &ld); if(rank==0) { for(i=0; i<3; i++) { for(j=0; j<2; j++) printf("%d ", local_A[i][j]); printf("\n"); } printf("\n"); for(i=0; i<2; i++) { for(j=0; j<3; j++) printf("%d ", local_B[i][j]); printf("\n"); } for(i=0; i<2; i++) { for(j=0; j<3; j++) if( local_A[i][j]==local_B[i][j]) printf("ERROR : \n"); } } // The process is confirmed and verified by printing the array in OP-scr /* if(rank==0) if(content(g_A) != content(g_B))printf("ERROE : \n"); */ GA_Sync(); if(rank == 1) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_destroy.c0000644000175000017500000000160712662210460017373 0ustar mbamba/* * Test Program for GA * This is to test GA_Destroy (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_destroy -- used to trash the created/used arrays */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 main(int argc, char **argv) { int rank, nprocs, i; int g_A, value=5; int dims[DIM]={5,5}, dims2[DIM], ndim, type; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &value); GA_Print(g_A); //GA_Sync(); printf(" -----------%d\n", rank); GA_Destroy(g_A); printf(" %d-----------\n", rank); GA_Print(g_A); if(rank == 0) printf("Test Completed \n"); GA_Terminate(); MPI_Finalize(); } ga-5-4/global/testing/unit-tests/ga_set_restricted.c0000644000175000017500000000563612662210460020733 0ustar mbamba/* * Test Program for GA * GA_Set_restricted -- */ #include #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 5 #define DIM 2 list_by_two(int nprocs) { int i, l_size, mod, l_size_mod, *list_one=NULL, *list_two=NULL; l_size = nprocs / 2; mod = nprocs % 2; l_size_mod = l_size + mod; list_one = (int*)malloc(l_size*sizeof(int)); list_two = (int*)malloc(l_size*sizeof(int)); for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" #define SIZE 10 #define MAX_DIM 7 void create_ga(int ndim) { int g_A; int dims[MAX_DIM], i, val=4; for(i=0; i #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #include"ga_unit.h" main(int argc, char **argv) { int rank, nprocs, i, j; int p_Geven, p_Godd, p_size, mod, p_size_mod, *list_even=NULL, *list_odd=NULL; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); p_size=nprocs/2; mod=nprocs%2; p_size_mod=p_size+mod; list_even = (int*)malloc(p_size*sizeof(int)); list_odd = (int*)malloc(p_size*sizeof(int)); j=0; for(i=0; i #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZE 5 main(int argc, char **argv) { int rank, nprocs; int g_A, g_V, val1=5, val2=5, local_A[SIZE][SIZE], dims_V=SIZE, local_V[dims_V]; int dims[DIM]={SIZE,SIZE}, dims2[DIM], lo[DIM]={1,1}, hi[DIM]={2,2}, ld=5, i, j; int loV=0, hiV=dims_V-1; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); g_V = NGA_Create(C_INT, 1, &dims_V, "array_A", NULL); GA_Fill(g_A, &val1); GA_Print(g_A); printf("\n"); GA_Scale(g_A, &val2); GA_Print(g_A); GA_Get_diag(g_A, g_V); GA_Print(g_V); NGA_Get(g_A, lo, hi, local_A, &ld); NGA_Get(g_V, &loV, &hiV, local_V, &ld); if(rank==1) { for(i=0; i #include #include "ga.h" #include "typesf2c.h" #include "abstract_ops.h" typedef struct Mock_GA { int type; int ndim; int dims[GA_MAX_DIM]; int dims_m1[GA_MAX_DIM]; /* for convenience */ int strides[GA_MAX_DIM]; /* for convenience */ int backstrides[GA_MAX_DIM]; /* for convenience */ int size; /* for convenience, total number of elements */ int itemsize; /* for convenience, sizeof(type) */ int nd_m1; /* for convenience, ndim-1 */ void *buf; } mock_ga_t; static size_t type_to_size(int type) { size_t size; switch (type) { case C_INT: size = sizeof(int); break; case C_LONG: size = sizeof(long); break; case C_LONGLONG: size = sizeof(long long); break; case C_FLOAT: size = sizeof(float); break; case C_DBL: size = sizeof(double); break; case C_SCPL: size = sizeof(SingleComplex); break; case C_DCPL: size = sizeof(DoubleComplex); break; default: assert(0); } return size; } /* all the variables we need for the iterator, prefixed with the given name */ #define ITER_DECLARE_VARS(the_ga) \ char *the_ga##_bytebuf = (the_ga)->buf; \ int the_ga##_size = (the_ga)->size; \ int the_ga##_i; /* all the variables we need for the iterator, prefixed with the given name * Note: use this when iterating over a lo/hi patch */ #define ITER_DECLARE_VARS_PATCH(the_ga) \ char *the_ga##_bytebuf = (the_ga)->buf; \ int the_ga##_ndim = (the_ga)->ndim; \ int the_ga##_nd_m1 = (the_ga)->nd_m1; \ int the_ga##_coords[GA_MAX_DIM]; \ int the_ga##_lo[GA_MAX_DIM]; \ int the_ga##_hi[GA_MAX_DIM]; \ int the_ga##_size = 1; \ int the_ga##_i; \ int the_ga##_j; /* to define the user-visible buffer on which to perform the user-defined op */ #define ITER_DECLARE_BUFFER(the_ga,TYPE) TYPE *the_ga##_buf = NULL; /* setup the user-visible buffer and the iterator variables * Note: use this when iterating over the entire array buffer i.e. no lo/hi */ #define ITER_CAST_BUFFER(the_ga,TYPE) the_ga##_buf = (TYPE*)the_ga##_bytebuf; /* setup the user-visible buffer and the iterator variables * Note: use this when iterating over the entire array buffer i.e. no lo/hi */ #define ITER_BEGIN(the_ga,TYPE) \ for (the_ga##_i = 0; the_ga##_istrides[the_ga##_i] * the_ga##_lo[the_ga##_i] * (the_ga)->itemsize; \ } \ ITER_CAST_BUFFER(the_ga,TYPE) /* iterate over the buffer */ #define ITER_NEXT(the_ga) ++the_ga##_buf; /* iterate over the buffer */ #define ITER_NEXT_PATCH(the_ga) \ for (the_ga##_j=the_ga##_nd_m1; the_ga##_j>=0; --the_ga##_j) { \ if (the_ga##_coords[the_ga##_j] <= the_ga##_hi[the_ga##_j]) { \ ++the_ga##_coords[the_ga##_j]; \ the_ga##_buf += (the_ga)->strides[the_ga##_j]; \ break; \ } \ else { \ the_ga##_coords[the_ga##_j] = the_ga##_lo[the_ga##_j]; \ the_ga##_buf -= (the_ga)->backstrides[the_ga##_j]; \ } \ } /* end of loop */ #define ITER_END } static void mock_data(mock_ga_t *mock_a, int g_a) { ITER_DECLARE_VARS(mock_a) switch(mock_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(mock_a,C_TYPE) \ ITER_INIT(mock_a,C_TYPE) \ ITER_BEGIN(mock_a,C_TYPE) \ if (mock_a_i%2) { \ assign_##AT(*mock_a_buf, mock_a_i); \ } \ else { \ assign_##AT(*mock_a_buf,-mock_a_i); \ } \ ITER_NEXT(mock_a) \ ITER_END \ break; \ } TYPE_CASE(C_INT,int,reg) TYPE_CASE(C_LONG,long,reg) TYPE_CASE(C_LONGLONG,long long,reg) TYPE_CASE(C_FLOAT,float,reg) TYPE_CASE(C_DBL,double,reg) #undef TYPE_CASE #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(mock_a,C_TYPE) \ ITER_INIT(mock_a,C_TYPE) \ ITER_BEGIN(mock_a,C_TYPE) \ C_TYPE value; \ if (mock_a_i%2) { \ value.real = mock_a_i; \ value.imag = -mock_a_i; \ } \ else { \ value.real = -mock_a_i; \ value.imag = mock_a_i; \ } \ assign_##AT(*mock_a_buf,value); \ ITER_NEXT(mock_a) \ ITER_END \ break; \ } TYPE_CASE(C_SCPL,SingleComplex,cpl) TYPE_CASE(C_DCPL,DoubleComplex,cpl) #undef TYPE_CASE } } static void mock_to_global(mock_ga_t *mock_a, int g_a) { if (0 == GA_Nodeid()) { int i; int lo[GA_MAX_DIM]; int hi[GA_MAX_DIM]; int ld[GA_MAX_DIM]; for (i=0; indim; ++i) { lo[i] = 0; hi[i] = mock_a->dims[i]-1; } for (i=0; indim-1; ++i) { ld[i] = hi[i+1]-lo[i+1]+1; } NGA_Put(g_a, lo, hi, mock_a->buf, ld); } GA_Sync(); } static void global_to_mock(int g_a, mock_ga_t *mock_a) { int i; int lo[GA_MAX_DIM]; int hi[GA_MAX_DIM]; int ld[GA_MAX_DIM]; for (i=0; indim; ++i) { lo[i] = 0; hi[i] = mock_a->dims[i]-1; } for (i=0; indim-1; ++i) { ld[i] = hi[i+1]-lo[i+1]+1; } GA_Sync(); NGA_Get(g_a, lo, hi, mock_a->buf, ld); GA_Sync(); } static void print_val(void *val, int type) { switch(type) { case C_INT: printf("%d", *((int*)val)); break; case C_LONG: printf("%ld", *((long*)val)); break; case C_LONGLONG: printf("%lld", *((long long*)val)); break; case C_FLOAT: printf("%f", *((float*)val)); break; case C_DBL: printf("%f", *((double*)val)); break; case C_SCPL: printf("%f+%fi", ((SingleComplex*)val)->real,((SingleComplex*)val)->imag); break; case C_DCPL: printf("%f+%fi", ((DoubleComplex*)val)->real,((DoubleComplex*)val)->imag); break; default: assert(0); } } static int neq_mock(mock_ga_t *mock_a, mock_ga_t *mock_b, int *idx) { ITER_DECLARE_VARS(mock_a) ITER_DECLARE_VARS(mock_b) *idx=-1; switch(mock_a->type) { #define TYPE_CASE(GA_TYPE,C_TYPE,AT) \ case GA_TYPE: \ { \ ITER_DECLARE_BUFFER(mock_a,C_TYPE) \ ITER_DECLARE_BUFFER(mock_b,C_TYPE) \ ITER_INIT(mock_a,C_TYPE) \ ITER_INIT(mock_b,C_TYPE) \ ITER_BEGIN(mock_a,C_TYPE) \ if (!eq_##AT(*mock_a_buf, *mock_b_buf)) { \ *idx = mock_a_i; \ return 1; \ } \ ITER_NEXT(mock_a) \ ITER_NEXT(mock_b) \ ITER_END \ break; \ } #include "types.xh" #undef TYPE_CASE } return 0; } void Mock_Abs_value(mock_ga_t *g_a); void Mock_Abs_value_patch(mock_ga_t *g_a, int *lo, int *hi); void Mock_Access_block_grid(mock_ga_t *g_a, int index[], void *ptr, int ld[]); void Mock_Access_block(mock_ga_t *g_a, int idx, void *ptr, int ld[]); void Mock_Access_block_segment(mock_ga_t *g_a, int proc, void *ptr, int *len); void Mock_Access_ghost_element(mock_ga_t *g_a, void *ptr, int subscript[], int ld[]); void Mock_Access_ghosts(mock_ga_t *g_a, int dims[], void *ptr, int ld[]); void Mock_Access(mock_ga_t *g_a, int lo[], int hi[], void *ptr, int ld[]); void Mock_Acc(mock_ga_t *g_a, int lo[], int hi[],void* buf,int ld[],void* alpha); void Mock_Add_constant(mock_ga_t *g_a, void* alpha); void Mock_Add_constant_patch(mock_ga_t *g_a,int *lo,int *hi,void *alpha); void Mock_Add_diagonal(mock_ga_t *g_a, int g_v); void Mock_Add_patch(void * alpha, mock_ga_t *g_a, int alo[], int ahi[], void * beta, mock_ga_t *g_b, int blo[], int bhi[], mock_ga_t *g_c, int clo[], int chi[]); void Mock_Add(void *alpha, mock_ga_t *g_a, void* beta, mock_ga_t *g_b, mock_ga_t *g_c); int Mock_Allocate(mock_ga_t *g_a); int Mock_Assemble_duplicate(mock_ga_t *g_a, char *name, void *ptr); void Mock_Brdcst(void *buf, int lenbuf, int root); SingleComplex Mock_Cdot(mock_ga_t *g_a, mock_ga_t *g_b); SingleComplex Mock_Cdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Cgemm(char ta, char tb, int m, int n, int k, SingleComplex alpha, mock_ga_t *g_a, mock_ga_t *g_b, SingleComplex beta, mock_ga_t *g_c ); void Mock_Cgop(SingleComplex x[], int n, char *op); void Mock_Check_handle(mock_ga_t *g_a, char *string); int Mock_Cluster_nnodes(void); int Mock_Cluster_nodeid(void); int Mock_Cluster_nprocs(int x); int Mock_Cluster_procid(int x, int y); int Mock_Cluster_proc_nodeid(int proc); int Mock_Compare_distr(mock_ga_t *g_a, mock_ga_t *g_b); void Mock_Copy(mock_ga_t *g_a, mock_ga_t *g_b); void Mock_Copy_patch(char trans, mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[]); mock_ga_t * Mock_Create_config(int type,int ndim,int dims[], char *name, int chunk[], int p_handle); mock_ga_t * Mock_Create_ghosts_config(int type,int ndim,int dims[], int width[], char *name, int chunk[], int p_handle); mock_ga_t * Mock_Create_ghosts(int type,int ndim,int dims[], int width[], char *name, int chunk[]); mock_ga_t * Mock_Create_ghosts_irreg_config(int type,int ndim,int dims[], int width[], char *name, int map[], int nblock[], int p_handle); mock_ga_t * Mock_Create_ghosts_irreg(int type,int ndim,int dims[], int width[], char *name, int map[], int nblock[]); mock_ga_t * Mock_Create_handle(void); mock_ga_t * Mock_Create(int type,int ndim,int dims[], char *name, int chunk[]); mock_ga_t * Mock_Create_irreg_config(int type,int ndim,int dims[],char *name, int block[], int map[], int p_handle); mock_ga_t * Mock_Create_irreg(int type,int ndim,int dims[],char *name, int block[], int map[]); int Mock_Create_mutexes(int number); double Mock_Ddot(mock_ga_t *g_a, mock_ga_t *g_b); double Mock_Ddot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); int Mock_Deregister_type(int type); void Mock_Destroy(mock_ga_t *g_a); int Mock_Destroy_mutexes(void); void Mock_Dgemm(char ta, char tb, int m, int n, int k, double alpha, mock_ga_t *g_a, mock_ga_t *g_b, double beta, mock_ga_t *g_c ); void Mock_Dgop(double x[], int n, char *op); void Mock_Diag(mock_ga_t *g_a, int g_s, int g_v, void *eval); void Mock_Diag_reuse(int reuse, mock_ga_t *g_a, int g_s, int g_v, void *eval); void Mock_Diag_seq(mock_ga_t *g_a, int g_s, int g_v, void *eval); void Mock_Diag_std(mock_ga_t *g_a, int g_v, void *eval); void Mock_Diag_std_seq(mock_ga_t *g_a, int g_v, void *eval); void Mock_Distribution(mock_ga_t *g_a, int iproc, int lo[], int hi[]); mock_ga_t * Mock_Duplicate(mock_ga_t *g_a, char* array_name); void Mock_Elem_divide(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c); void Mock_Elem_divide_patch(mock_ga_t *g_a,int *alo,int *ahi, mock_ga_t *g_b,int *blo,int *bhi,mock_ga_t *g_c,int *clo,int *chi); void Mock_Elem_maximum(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c); void Mock_Elem_maximum_patch(mock_ga_t *g_a,int *alo,int *ahi, mock_ga_t *g_b,int *blo,int *bhi,mock_ga_t *g_c,int *clo,int *chi); void Mock_Elem_minimum(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c); void Mock_Elem_minimum_patch(mock_ga_t *g_a,int *alo,int *ahi, mock_ga_t *g_b,int *blo,int *bhi,mock_ga_t *g_c,int *clo,int *chi); void Mock_Elem_multiply(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c); void Mock_Elem_multiply_patch(mock_ga_t *g_a,int *alo,int *ahi, mock_ga_t *g_b,int *blo,int *bhi,mock_ga_t *g_c,int *clo,int *chi); void Mock_Error(char *str, int code); float Mock_Fdot(mock_ga_t *g_a, mock_ga_t *g_b); float Mock_Fdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Fence(void); void Mock_Fgop(float x[], int n, char *op); void Mock_Fill(mock_ga_t *g_a, void *value); void Mock_Fill_patch(mock_ga_t *g_a, int lo[], int hi[], void *val); void Mock_Freemem(void* ptr); void Mock_Gather_flat(mock_ga_t *g_a, void *v, int subsArray[], int n); void Mock_Gather(mock_ga_t *g_a, void *v, int* subsArray[], int n); void Mock_Get_block_info(mock_ga_t *g_a, int num_blocks[], int block_dims[]); int Mock_Get_debug(void); void Mock_Get_diag(mock_ga_t *g_a, int g_v); int Mock_Get_dimension(mock_ga_t *g_a); void Mock_Get_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld); void Mock_Get_ghost_block(mock_ga_t *g_a, int lo[], int hi[], void *buf, int ld[]); void Mock_Get(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]); void* Mock_Getmem(int type, int nelem, int grp_id); int Mock_Get_pgroup(mock_ga_t *g_a); int Mock_Get_pgroup_size(int grp_id); void Mock_Get_proc_grid(mock_ga_t *g_a, int dims[]); void Mock_Get_proc_index(mock_ga_t *g_a, int iproc, int subscript[]); void Mock_Gop(int type, void *x, int n, char *op); int Mock_Has_ghosts(mock_ga_t *g_a); int Mock_Idot(mock_ga_t *g_a, mock_ga_t *g_b); int Mock_Idot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Igop(int x[], int n, char *op); void Mock_Init_fence(void); void Mock_Initialize_args(int *argc, char ***argv); void Mock_Initialize_ltd(size_t limit); void Mock_Initialize(void); void Mock_Inquire(mock_ga_t *g_a, int *type, int *ndim, int dims[]); size_t Mock_Inquire_memory(void); char* Mock_Inquire_name(mock_ga_t *g_a); int Mock_Is_mirrored(mock_ga_t *g_a); long Mock_Ldot(mock_ga_t *g_a, mock_ga_t *g_b); long Mock_Ldot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Lgop(long x[], int n, char *op); void Mock_List_nodeid(int *list, int nprocs); long long Mock_Lldot(mock_ga_t *g_a, mock_ga_t *g_b); long long Mock_Lldot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Llgop(long long x[], int n, char *op); int Mock_Llt_solve(mock_ga_t *g_a, mock_ga_t *g_b); int Mock_Locate(mock_ga_t *g_a, int subscript[]); int Mock_Locate_nnodes(mock_ga_t *g_a, int lo[], int hi[]); int Mock_Locate_num_blocks(mock_ga_t *g_a, int lo[], int hi[]); int Mock_Locate_region(mock_ga_t *g_a,int lo[],int hi[],int map[],int procs[]); void Mock_Lock(int mutex); void Mock_Lu_solve(char tran, mock_ga_t *g_a, mock_ga_t *g_b); void Mock_Mask_sync(int first, int last); void Mock_Matmul_patch_2d(char transa, char transb, void* alpha, void *beta, mock_ga_t *g_a, int ailo, int aihi, int ajlo, int ajhi, mock_ga_t *g_b, int bilo, int bihi, int bjlo, int bjhi, mock_ga_t *g_c, int cilo, int cihi, int cjlo, int cjhi); void Mock_Matmul_patch(char transa, char transb, void* alpha, void *beta, mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[], mock_ga_t *g_c, int clo[], int chi[]) ; void Mock_Median(mock_ga_t *g_a, mock_ga_t *g_b, mock_ga_t *g_c, int g_m); void Mock_Median_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi, mock_ga_t *g_c, int *clo, int *chi, int g_m, int *mlo, int *mhi); size_t Mock_Memory_avail(void); int Mock_Memory_limited(void); void Mock_Merge_distr_patch(mock_ga_t *g_a, int alo[], int ahi[], mock_ga_t *g_b, int blo[], int bhi[]); void Mock_Merge_mirrored(mock_ga_t *g_a); void Mock_NbAcc(mock_ga_t *g_a,int lo[], int hi[],void* buf,int ld[],void* alpha, ga_nbhdl_t* nbhandle); void Mock_Nbget_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize,void *buf, int *ld, ga_nbhdl_t *nbhandle); void Mock_NbGet_ghost_dir(mock_ga_t *g_a, int mask[], ga_nbhdl_t* handle); void Mock_NbGet(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle); void Mock_Nblock(mock_ga_t *g_a, int *nblock); void Mock_Nbput_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld, ga_nbhdl_t *nbhandle); void Mock_NbPut(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle); int Mock_NbTest(ga_nbhdl_t* nbhandle); void Mock_NbWait(ga_nbhdl_t* nbhandle); int Mock_Ndim(mock_ga_t *g_a); int Mock_Nnodes(void); int Mock_Nodeid(void); void Mock_Norm1(mock_ga_t *g_a, double *nm); void Mock_Norm_infinity(mock_ga_t *g_a, double *nm); void Mock_Periodic_acc(mock_ga_t *g_a, int lo[], int hi[],void* buf,int ld[],void* alpha); void Mock_Periodic_get(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]); void Mock_Periodic_put(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]); int Mock_Pgroup_absolute_id(int pgroup, int pid); void Mock_Pgroup_brdcst(int grp, void *buf, int lenbuf, int root); void Mock_Pgroup_cgop(int grp, SingleComplex x[], int n, char *op); int Mock_Pgroup_create(int *list, int count); int Mock_Pgroup_destroy(int grp); void Mock_Pgroup_dgop(int grp, double x[], int n, char *op); void Mock_Pgroup_fgop(int grp, float x[], int n, char *op); int Mock_Pgroup_get_default(void); int Mock_Pgroup_get_mirror(void); int Mock_Pgroup_get_world(void); void Mock_Pgroup_igop(int grp, int x[], int n, char *op); void Mock_Pgroup_lgop(int grp, long x[], int n, char *op); void Mock_Pgroup_llgop(int grp, long long x[], int n, char *op); int Mock_Pgroup_nnodes(int grp_id); int Mock_Pgroup_nodeid(int grp_id); void Mock_Pgroup_set_default(int p_handle); int Mock_Pgroup_split(int grp_id, int num_group); int Mock_Pgroup_split_irreg(int grp_id, int color); void Mock_Pgroup_sync(int grp_id); void Mock_Pgroup_zgop(int grp, DoubleComplex x[], int n, char *op); void Mock_Print_distribution(mock_ga_t *g_a); void Mock_Print_file(FILE *file, mock_ga_t *g_a); void Mock_Print(mock_ga_t *g_a); void Mock_Print_patch_2d(mock_ga_t *g_a,int ilo,int ihi,int jlo,int jhi,int pretty); void Mock_Print_patch(mock_ga_t *g_a, int lo[], int hi[], int pretty); void Mock_Print_stats(void); void Mock_Proc_topology(mock_ga_t *g_a, int proc, int coord[]); void Mock_Put_field(mock_ga_t *g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld); void Mock_Put(mock_ga_t *g_a, int lo[], int hi[], void* buf, int ld[]); void Mock_Randomize(mock_ga_t *g_a, void *value); long Mock_Read_inc(mock_ga_t *g_a, int subscript[], long inc); void Mock_Recip(mock_ga_t *g_a); void Mock_Recip_patch(mock_ga_t *g_a,int *lo, int *hi); void Mock_Register_stack_memory(void * (*ext_alloc)(size_t, int, char *), void (*ext_free)(void *)); int Mock_Register_type(size_t bytes); void Mock_Release_block_grid(mock_ga_t *g_a, int index[]); void Mock_Release_block(mock_ga_t *g_a, int idx); void Mock_Release_block_segment(mock_ga_t *g_a, int idx); void Mock_Release_ghost_element(mock_ga_t *g_a, int index[]); void Mock_Release_ghosts(mock_ga_t *g_a); void Mock_Release(mock_ga_t *g_a, int lo[], int hi[]); void Mock_Release_update_block_grid(mock_ga_t *g_a, int index[]); void Mock_Release_update_block(mock_ga_t *g_a, int idx); void Mock_Release_update_block_segment(mock_ga_t *g_a, int idx); void Mock_Release_update_ghost_element(mock_ga_t *g_a, int index[]); void Mock_Release_update_ghosts(mock_ga_t *g_a); void Mock_Release_update(mock_ga_t *g_a, int lo[], int hi[]); void Mock_Scale_cols(mock_ga_t *g_a, int g_v); void Mock_Scale(mock_ga_t *g_a, void *value); void Mock_Scale_patch(mock_ga_t *g_a, int lo[], int hi[], void *alpha); void Mock_Scale_rows(mock_ga_t *g_a, int g_v); void Mock_Scan_add(mock_ga_t *g_a, mock_ga_t *g_b, int g_sbit, int lo, int hi, int excl); void Mock_Scan_copy(mock_ga_t *g_a, mock_ga_t *g_b, int g_sbit, int lo, int hi); void Mock_Scatter_acc_flat(mock_ga_t *g_a, void *v, int subsArray[], int n, void *alpha); void Mock_Scatter_acc(mock_ga_t *g_a, void *v, int* subsArray[], int n, void *alpha); void Mock_Scatter_flat(mock_ga_t *g_a, void *v, int subsArray[], int n); void Mock_Scatter(mock_ga_t *g_a, void *v, int* subsArray[], int n); void Mock_Select_elem(mock_ga_t *g_a, char* op, void* val, int *index); void Mock_Set_array_name(mock_ga_t *g_a, char *name); void Mock_Set_block_cyclic(mock_ga_t *g_a, int dims[]); void Mock_Set_block_cyclic_proc_grid(mock_ga_t *g_a, int block[], int proc_grid[]); void Mock_Set_chunk(mock_ga_t *g_a, int chunk[]); void Mock_Set_data(mock_ga_t *g_a, int ndim, int dims[], int type); void Mock_Set_debug(int flag); void Mock_Set_diagonal(mock_ga_t *g_a, int g_v); void Mock_Set_ghost_corner_flag(mock_ga_t *g_a, int flag); void Mock_Set_ghosts(mock_ga_t *g_a, int width[]); void Mock_Set_irreg_distr(mock_ga_t *g_a, int map[], int block[]); void Mock_Set_irreg_flag(mock_ga_t *g_a, int flag); void Mock_Set_memory_limit(size_t limit); void Mock_Set_pgroup(mock_ga_t *g_a, int p_handle); void Mock_Set_restricted(mock_ga_t *g_a, int list[], int size); void Mock_Set_restricted_range(mock_ga_t *g_a, int lo_proc, int hi_proc); void Mock_Sgemm(char ta, char tb, int m, int n, int k, float alpha, mock_ga_t *g_a, mock_ga_t *g_b, float beta, mock_ga_t *g_c ); void Mock_Shift_diagonal(mock_ga_t *g_a, void *c); int Mock_Solve(mock_ga_t *g_a, mock_ga_t *g_b); int Mock_Spd_invert(mock_ga_t *g_a); void Mock_Step_bound_info(int g_xx, int g_vv, int g_xxll, int g_xxuu, void *boundmin, void *wolfemin, void *boundmax); void Mock_Step_bound_info_patch(int g_xx, int *xxlo, int *xxhi, int g_vv, int *vvlo, int *vvhi, int g_xxll, int *xxlllo, int *xxllhi, int g_xxuu, int *xxuulo, int *xxuuhi, void *boundmin, void *wolfemin, void *boundmax); void Mock_Step_max(mock_ga_t *g_a, mock_ga_t *g_b, void *step); void Mock_Step_max_patch(mock_ga_t *g_a, int *alo, int *ahi, mock_ga_t *g_b, int *blo, int *bhi, void *step); void Mock_Strided_acc(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[], void *alpha); void Mock_Strided_get(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[]); void Mock_Strided_put(mock_ga_t *g_a, int lo[], int hi[], int skip[], void* buf, int ld[]); void Mock_Summarize(int verbose); void Mock_Symmetrize(mock_ga_t *g_a); void Mock_Sync(void); void Mock_Terminate(void); int Mock_Total_blocks(mock_ga_t *g_a); void Mock_Transpose(mock_ga_t *g_a, mock_ga_t *g_b); void Mock_Unlock(int mutex); int Mock_Update_ghost_dir(mock_ga_t *g_a, int dimension, int idir, int flag); void Mock_Update_ghosts(mock_ga_t *g_a); int Mock_Uses_fapi(void); int Mock_Uses_ma(void); int Mock_Uses_proc_grid(mock_ga_t *g_a); int Mock_Valid_handle(mock_ga_t *g_a); int Mock_Verify_handle(mock_ga_t *g_a); double Mock_Wtime(void); DoubleComplex Mock_Zdot(mock_ga_t *g_a, mock_ga_t *g_b); DoubleComplex Mock_Zdot_patch(mock_ga_t *g_a, char t_a, int alo[], int ahi[], mock_ga_t *g_b, char t_b, int blo[], int bhi[]); void Mock_Zero_diagonal(mock_ga_t *g_a); void Mock_Zero(mock_ga_t *g_a); void Mock_Zero_patch(mock_ga_t *g_a, int lo[], int hi[]); void Mock_Zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, mock_ga_t *g_a, mock_ga_t *g_b, DoubleComplex beta, mock_ga_t *g_c ); void Mock_Zgop(DoubleComplex x[], int n, char *op); #endif /* GLOBAL_TESTING_UNIT_TEST_MOCK_H */ ga-5-4/global/testing/unit-tests/ga_elem_minimumpatch.c0000644000175000017500000000614512662210460021401 0ustar mbamba#include "ga.h" #include "mock.h" #include "ga_unit.h" static int test(int shape_idx, int type_idx, int dist_idx) { int type = TYPES[type_idx]; int *dims = SHAPES[shape_idx]; int ndim = SHAPES_NDIM[shape_idx]; mock_ga_t *mock_a, *mock_b, *result_mock, *result_ga; int g_a, g_b, g_c; int buffer[100]; int lo[GA_MAX_DIM], hi[GA_MAX_DIM], ld[GA_MAX_DIM], shape[GA_MAX_DIM]; int result=0, error_index=-1, error_proc=-1; mock_a = Mock_Create(type, ndim, dims, "mock", NULL); mock_b = Mock_Create(type, ndim, dims, "mock", NULL); result_mock = Mock_Create(type, ndim, dims, "mock", NULL); result_ga = Mock_Create(type, ndim, dims, "mock", NULL); g_a = create_function[dist_idx](type, ndim, dims); g_b = create_function[dist_idx](type, ndim, dims); g_c = create_function[dist_idx](type, ndim, dims); mock_data(mock_a, g_a); mock_data(mock_b, g_b); mock_to_global(mock_a, g_a); mock_to_global(mock_b, g_b); Mock_Elem_maximum(mock_a, mock_b, result_mock); GA_Elem_maximum(g_a, g_b, g_c); global_to_mock(g_c, result_ga); result = neq_mock(result_mock, result_ga, &error_index); if (0 != result) { error_proc = GA_Nodeid(); } GA_Igop(&result, 1, "+"); GA_Igop(&error_proc, 1, "max"); if (error_proc != GA_Nodeid()) { error_index = 0; } GA_Igop(&error_index, 1, "+"); if (0 != result) { if (error_proc == GA_Nodeid()) { printf("ERROR: local result failed to compare to global result\n"); printf("\terror_proc=%d\n", error_proc); printf("\terror_index=%d\n", error_index); printf("***LOCAL RESULT***\n"); Mock_Print(mock_a); printf("***GLOBAL RESULT***\n"); Mock_Print(result_ga); printf("\tprinting array distribution\n"); } GA_Sync(); GA_Print(g_a); GA_Print_distribution(g_a); return 1; } /* clean up */ Mock_Destroy(mock_a); Mock_Destroy(mock_b); Mock_Destroy(result_mock); Mock_Destroy(result_ga); GA_Destroy(g_a); GA_Destroy(g_b); GA_Destroy(g_c); return 0; } int main(int argc, char **argv) { TEST_SETUP; int shape_idx=0, type_idx=0, dist_idx=0; int return_code=0; for (shape_idx=0; shape_idx < NUM_SHAPES; ++shape_idx) { for (type_idx=0; type_idx < NUM_TYPES; ++type_idx) { for (dist_idx=0; dist_idx < NUM_DISTS; ++dist_idx) { if (0 == GA_Nodeid()) { printf("%s\t%s\t%s\n", SHAPE_NAMES[shape_idx], TYPE_NAMES[type_idx], DIST_NAMES[dist_idx] ); } GA_Sync(); return_code = test(shape_idx, type_idx, dist_idx); if (0 != return_code) { break; } } if (0 != return_code) { break; } } if (0 != return_code) { break; } } TEST_TEARDOWN; return return_code; } ga-5-4/global/testing/unit-tests/ga_add_constantpatch.c0000644000175000017500000000241612662210460021362 0ustar mbamba/* * Test Program for GA * This is to test GA_Add_constant_patch (is a collective operation) * GA_Create -- used to create a global array using handles like 'g_A' * GA_Duplicate --used to duplicate and generate one more global array.., handle 'g_A' to 'g_B' * *_add_constant_patch -- helps to */ #include #include"mpi.h" #include"ga.h" #include"macdecls.h" #define DIM 2 #define SIZ 5 main(int argc, char **argv) { int rank, nprocs, i, j; int g_A, local_A[SIZ][SIZ], dims[DIM]={SIZ,SIZ}, val1=5, alpha=3; int alo[DIM]={2,2}, ahi[DIM]={3,3}, ld=SIZ; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MA_init(C_INT, 1000, 1000); GA_Initialize(); g_A = NGA_Create(C_INT, DIM, dims, "array_A", NULL); GA_Fill(g_A, &val1); GA_Print(g_A); GA_Add_constant_patch(g_A, alo, ahi, &alpha); GA_Print(g_A); NGA_Get(g_A, alo, ahi, local_A, &ld); if(rank==1) { for(i=0; i Checking ga_fill_patch ... ' call ffflush(6) endif c val = 1d0 call ga_fill_patch(g_a, 2,n/2, 2,n, val) * call ga_print(g_a, 1) do j = 2+me, n, nproc call ga_get(g_a, 1,n/2, j,j, buf,n/2) do i = 2, n/2 if(buf(i) .ne.val ) then print *,me, ' error ',i,j, buf(i),val call ga_error('exiting ...',0) endif enddo enddo c call ga_sync() if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c do j = 1+me, n, nproc call ga_put(g_a,1,n,j,j,a(1,j),n) enddo c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_copy_patch ... ' call ffflush(6) endif c do loop =1, 10 ailo = iran(n/2) ajlo = iran(n/2) aihi = min(n, -1+ailo+n/2) ajhi = min(n, -1+ajlo+n/4) rows = aihi -ailo+1 cols = ajhi -ajlo +1 c bilo = iran(n/3) bjlo = iran(n/3) bihi = bilo + rows -1 bjhi = bjlo + cols -1 if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi call ffflush(6) endif c call ga_copy_patch('n', g_a, ailo, aihi, ajlo, ajhi, & g_b, bilo, bihi, bjlo, bjhi) c call ga_print(g_a,1) c call ga_print(g_b,1) call ga_get(g_b,bilo,bihi, bjlo, bjhi, buf, rows) base = 0 do j = ajlo, ajhi if(Mod(j,nproc).eq.me) then do i = ailo, aihi base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base + rows endif enddo enddo c ailo = iran(n/2) ajlo = iran(n/2) bilo = iran(n/2) bjlo = iran(n/2) c #ifdef BLOCK_CYCLIC if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif #else if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif c if (me .eq. 0) then write(6,'(2x,1h[,4i4,2h]~,5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('t', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do i = ailo, ailo+n/2 if(Mod(j,nproc).eq.me) then do j = ajlo, ajlo+n/3 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/3+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' transposed: OK ' call ffflush(6) endif #endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_scale_patch ... ' call ffflush(6) endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/2, bjlo, bjlo+n/3) val = 1.d0 call ga_scale_patch(g_b, bilo,bilo+n/2,bjlo, bjlo+n/3,val) call ga_get(g_b,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)*val) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_add_patch ... ' call ffflush(6) endif alpha = .1d0 beta = .2d0 call ga_zero(g_c) call ga_add_patch(alpha, g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ beta, g_b, bilo,bilo+n/2, bjlo, bjlo+n/3, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/3) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 val = val*beta + alpha do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(ABS(buf(base)- a(i,j)*val).gt.1d-5) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_ddot_patch ... ' call ffflush(6) endif alpha= ga_ddot_patch(g_a,'n', ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_c,'n', bilo,bilo+n/2, bjlo, bjlo+n/3) beta = 0d0 do j = ajlo, ajlo+n/3 do i = ailo, ailo+n/2 beta = beta + a(i,j)**2 enddo enddo if(ABS(beta*val- alpha).gt.1d-6*alpha) then print *,me, ' error ', beta*val, alpha call ga_error('exiting ...',0) endif call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c...................................................... if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_matmul_patch ... ' call ffflush(6) endif do j = 1+me, n, nproc call ga_put(g_b,1,n,j,j,b(1,j),n) enddo call ga_sync() call ga_matmul_patch('n','n', 1d0, 0d0, $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call xgemm('n','n',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, $ b(bilo,bjlo),n, 0d0, c, n) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*b: OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('t','n', 1d0, 0d0, $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call xgemm('t','n',n/2+1,n/2+1,n/3+1,1d0,a(ajlo,ailo), n, $ b(bilo,bjlo),n, 0d0, c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*b: OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('n','t', 1d0, 0d0, $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call xgemm('n','t',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, $ b(bjlo,bilo),n, 0d0, c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*trans(b): OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('t','t', 1d0, 0d0, $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call xgemm('t','t',n/2+1,n/2+1,n/3+1,1d0,a(ajlo,ailo), n, $ b(bjlo,bilo),n, 0d0, c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*trans(b): OK ' call ffflush(6) endif status = ga_destroy(g_a) status = status .and. ga_destroy(g_b) status = status .and. ga_destroy(g_c) if(.not. status) print *, 'ga_destroy failed' c end subroutine zpatch_test() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 128) parameter (m = n*n) double complex a(n,n), b(n,n), c(n,n), buf(m), val double complex alpha, beta integer nproc, me integer i, j, ailo, ajlo, bilo, bjlo, base, iran integer aihi, ajhi, bihi, bjhi integer g_a, g_b, g_c integer rows, cols, loop logical status, dist_same #ifdef BLOCK_CYCLIC integer ndim, dims(2) integer block_size(2), proc_grid(2) #endif iran(i) = int(drand(1)*real(i)) + 1 dist_same = .false. c me = ga_nodeid() nproc = ga_nnodes() #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",0) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c do j = 1, n do i = 1, n a(i,j) = cmplx(dble(i-1), dble((j-1)*n)) b(i,j) = cmplx(dble(i+j),1d0) enddo enddo c c*** Create a global array c #ifndef BLOCK_CYCLIC status = ga_create(MT_DCPL, n, n, 'a', 0, 0, g_a) #else g_a = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_a,ndim,dims,MT_DCPL) call ga_set_array_name(g_a,'a') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif status = ga_allocate(g_a) #endif if (.not. status) then write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c if(dist_same) then status = ga_duplicate(g_a, g_b, 'a_duplicated') if(.not.ga_compare_distr(g_a, g_b)) $ call ga_error("g_b distribution different",0) status = ga_duplicate(g_a, g_c, 'a_duplicated_again') if(.not.ga_compare_distr(g_a, g_c)) $ call ga_error("g_c distribution different",0) else #ifndef BLOCK_CYCLIC status = ga_create(MT_DCPL, n, n, 'b', 0, n, g_b) #else g_b = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_b,ndim,dims,MT_DCPL) call ga_set_array_name(g_b,'b') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif status = ga_allocate(g_b) #endif if (.not. status) call ga_error('ga_create failed:b',0) #ifndef BLOCK_CYCLIC status = ga_create(MT_DCPL, n, n, 'c', n, 0, g_c) #else g_c = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_c,ndim,dims,MT_DCPL) call ga_set_array_name(g_c,'c') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_c,block_size,proc_grid) #else call ga_set_block_cyclic(g_c,block_size) #endif status = ga_allocate(g_c) #endif if (.not. status) call ga_error('ga_create failed:c',0) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_fill_patch ... ' call ffflush(6) endif c val = (1d0,-1d0) call ga_fill_patch(g_a, 2,n/2, 2,n, val) * call ga_print(g_a, 1) do j = 2+me, n, nproc call ga_get(g_a, 1,n/2, j,j, buf,n/2) do i = 2, n/2 if(buf(i) .ne.val ) then print *,me, ' error ',i,j, buf(i),val call ga_error('exiting ...',0) endif enddo enddo c call ga_sync() if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c do j = 1+me, n, nproc call ga_put(g_a,1,n,j,j,a(1,j),n) enddo c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_copy_patch ... ' call ffflush(6) endif c do loop =1, 10 ailo = iran(n/2) ajlo = iran(n/2) aihi = min(n, -1+ailo+n/2) ajhi = min(n, -1+ajlo+n/4) rows = aihi -ailo+1 cols = ajhi -ajlo +1 c bilo = iran(n/3) bjlo = iran(n/3) bihi = bilo + rows -1 bjhi = bjlo + cols -1 if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi call ffflush(6) endif c call ga_copy_patch('n', g_a, ailo, aihi, ajlo, ajhi, & g_b, bilo, bihi, bjlo, bjhi) c call ga_print(g_a,1) c call ga_print(g_b,1) call ga_get(g_b,bilo,bihi, bjlo, bjhi, buf, rows) base = 0 do j = ajlo, ajhi if(Mod(j,nproc).eq.me) then do i = ailo, aihi base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base + rows endif enddo enddo c ailo = iran(n/2) ajlo = iran(n/2) bilo = iran(n/2) bjlo = iran(n/2) c #ifdef BLOCK_CYCLIC if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif #else if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif c if (me .eq. 0) then write(6,'(2x,1h[,4i4,2h]~,5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('t', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do i = ailo, ailo+n/2 if(Mod(j,nproc).eq.me) then do j = ajlo, ajlo+n/3 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/3+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' transposed: OK ' call ffflush(6) endif #endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_scale_patch ... ' call ffflush(6) endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/2, bjlo, bjlo+n/3) val = 1.d0 call ga_scale_patch(g_b, bilo,bilo+n/2,bjlo, bjlo+n/3,val) call ga_get(g_b,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)*val) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_add_patch ... ' call ffflush(6) endif alpha = .1d0 beta = .2d0 call ga_zero(g_c) call ga_add_patch(alpha, g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ beta, g_b, bilo,bilo+n/2, bjlo, bjlo+n/3, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/3) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 val = val*beta + alpha do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(ABS(buf(base)- a(i,j)*val).gt.1d-5) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_zdot_patch ... ' call ffflush(6) endif alpha= ga_zdot_patch(g_a,'n', ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_c,'n', bilo,bilo+n/2, bjlo, bjlo+n/3) beta = (0d0,0d0) do j = ajlo, ajlo+n/3 do i = ailo, ailo+n/2 beta = beta + a(i,j)*a(i,j) enddo enddo if(ABS(beta*val- alpha)/abs(alpha).gt.1d-6) then print *,me, ' error ', beta*val, alpha call ga_error('exiting ...',0) endif call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c...................................................... if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_matmul_patch ... ' call ffflush(6) endif do j = 1+me, n, nproc call ga_put(g_b,1,n,j,j,b(1,j),n) enddo call ga_sync() call ga_matmul_patch('n','n', (1d0,0d0), (0d0,0d0), $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call ygemm('n','n',n/2+1,n/2+1,n/3+1,(1d0,0d0), $ a(ailo,ajlo), n, $ b(bilo,bjlo),n, (0d0,0d0), c, n) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j))/abs(c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*b: OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('t','n', (1d0,0d0), (0d0,0d0), $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call ygemm('t','n',n/2+1,n/2+1,n/3+1,(1d0,0d0), $ a(ajlo,ailo), n, $ b(bilo,bjlo),n, (0d0,0d0), c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j))/abs(c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*b: OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('n','t', (1d0,0d0), (0d0,0d0), $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call ygemm('n','t',n/2+1,n/2+1,n/3+1,(1d0,0d0), $ a(ailo,ajlo), n, $ b(bjlo,bilo),n, (0d0,0d0), c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j))/abs(c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' a*trans(b): OK ' call ffflush(6) endif c call ga_sync() call ga_matmul_patch('t','t', (1d0,0d0), (0d0,0d0), $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) call ygemm('t','t',n/2+1,n/2+1,n/3+1,(1d0,0d0), $ a(ajlo,ailo), n, $ b(bilo,bjlo),n, (0d0,0d0), c, n) * call ga_print(g_a,1) * call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print(g_c, 1) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) base = 0 do j = 1, 1+n/2 if(Mod(j,nproc).eq.me) then do i = 1, 1+n/2 base = base+1 if(ABS(buf(base)- c(i,j))/abs(c(i,j)).gt.1d-8) then print *,me, ' error ',i,j, buf(base), c(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo c call ga_sync() if (me .eq. 0) then write(6,*)' trans(a)*trans(b): OK ' call ffflush(6) endif status = ga_destroy(g_a) status = status .and. ga_destroy(g_b) status = status .and. ga_destroy(g_c) if(.not. status) print *, 'ga_destroy failed' c end subroutine spatch_test() implicit none #include "mafdecls.fh" #include "global.fh" #include "testutil.fh" c integer n,m parameter (n = 128) parameter (m = n*n) real a(n,n), b(n,n), c(n,n), buf(m), val real alpha, beta integer nproc, me integer i, j, ailo, ajlo, bilo, bjlo, base, iran integer aihi, ajhi, bihi, bjhi integer g_a, g_b, g_c integer rows, cols, loop logical status, dist_same #ifdef BLOCK_CYCLIC integer ndim, dims(2) integer block_size(2), proc_grid(2) #endif iran(i) = int(drand(1)*real(i)) + 1 dist_same = .false. c me = ga_nodeid() nproc = ga_nnodes() #ifdef BLOCK_CYCLIC block_size(1) = 32 block_size(2) = 32 #ifdef USE_SCALAPACK_DISTR if (mod(nproc,2).ne.0) + call ga_error("Available procs must be divisible by 2",0) proc_grid(1) = 2 proc_grid(2) = nproc/2 #endif #endif c do j = 1, n do i = 1, n a(i,j) = i-1 + (j-1)*n b(i,j) = i+j enddo enddo c c*** Create a global array c #ifndef BLOCK_CYCLIC status = ga_create(MT_REAL, n, n, 'a', 0, 0, g_a) #else g_a = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_a,ndim,dims,MT_REAL) call ga_set_array_name(g_a,'a') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_a,block_size,proc_grid) #else call ga_set_block_cyclic(g_a,block_size) #endif status = ga_allocate(g_a) #endif if (.not. status) then write(6,*) ' ga_create failed' call ffflush(6) call ga_error('... exiting ',0) endif c if(dist_same) then status = ga_duplicate(g_a, g_b, 'a_duplicated') if(.not.ga_compare_distr(g_a, g_b)) $ call ga_error("g_b distribution different",0) status = ga_duplicate(g_a, g_c, 'a_duplicated_again') if(.not.ga_compare_distr(g_a, g_c)) $ call ga_error("g_c distribution different",0) else #ifndef BLOCK_CYCLIC status = ga_create(MT_REAL, n, n, 'b', 0, n, g_b) #else g_b = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_b,ndim,dims,MT_REAL) call ga_set_array_name(g_b,'b') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_b,block_size,proc_grid) #else call ga_set_block_cyclic(g_b,block_size) #endif status = ga_allocate(g_b) #endif if (.not. status) call ga_error('ga_create failed:b',0) #ifndef BLOCK_CYCLIC status = ga_create(MT_REAL, n, n, 'c', n, 0, g_c) #else g_c = ga_create_handle() ndim = 2 dims(1) = n dims(2) = n call ga_set_data(g_c,ndim,dims,MT_REAL) call ga_set_array_name(g_c,'c') #ifdef USE_SCALAPACK_DISTR call ga_set_block_cyclic_proc_grid(g_c,block_size,proc_grid) #else call ga_set_block_cyclic(g_c,block_size) #endif status = ga_allocate(g_c) #endif if (.not. status) call ga_error('ga_create failed:c',0) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_fill_patch ... ' call ffflush(6) endif c val = 1.0 call ga_fill_patch(g_a, 2,n/2, 2,n, val) * call ga_print(g_a, 1) do j = 2+me, n, nproc call ga_get(g_a, 1,n/2, j,j, buf,n/2) do i = 2, n/2 if(buf(i) .ne.val ) then print *,me, ' error ',i,j, buf(i),val call ga_error('exiting ...',0) endif enddo enddo c call ga_sync() if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c do j = 1+me, n, nproc call ga_put(g_a,1,n,j,j,a(1,j),n) enddo c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_copy_patch ... ' call ffflush(6) endif c do loop =1, 10 ailo = iran(n/2) ajlo = iran(n/2) aihi = min(n, -1+ailo+n/2) ajhi = min(n, -1+ajlo+n/4) rows = aihi -ailo+1 cols = ajhi -ajlo +1 c bilo = iran(n/3) bjlo = iran(n/3) bihi = bilo + rows -1 bjhi = bjlo + cols -1 if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi call ffflush(6) endif c call ga_copy_patch('n', g_a, ailo, aihi, ajlo, ajhi, & g_b, bilo, bihi, bjlo, bjhi) c call ga_print(g_a,1) c call ga_print(g_b,1) call ga_get(g_b,bilo,bihi, bjlo, bjhi, buf, rows) base = 0 do j = ajlo, ajhi if(Mod(j,nproc).eq.me) then do i = ailo, aihi base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base + rows endif enddo enddo c ailo = iran(n/2) ajlo = iran(n/2) bilo = iran(n/2) bjlo = iran(n/2) c #ifdef BLOCK_CYCLIC if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif #else if (me .eq. 0) then write(6,'(2x,1h[,4i4,1h],5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' without transpose: OK ' call ffflush(6) endif c if (me .eq. 0) then write(6,'(2x,1h[,4i4,2h]~,5h --> ,1h[,4i4,1h])') $ ailo,aihi,ajlo,ajhi, $ bilo,bihi, bjlo, bjhi endif call ga_copy_patch('t', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) * call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3,1) * call ga_print(g_b, 1) call ga_get(g_b,bilo,bilo+n/3,bjlo, bjlo+n/2,buf,n/3+1) base = 0 do i = ailo, ailo+n/2 if(Mod(j,nproc).eq.me) then do j = ajlo, ajlo+n/3 base = base+1 if(buf(base) .ne. a(i,j)) then print *,me, ' error ',i,j, buf(base), a(i,j) call ga_error('exiting ...',0) endif enddo else base = base +n/3+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' transposed: OK ' call ffflush(6) endif #endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_scale_patch ... ' call ffflush(6) endif call ga_copy_patch('n', g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_b, bilo,bilo+n/2, bjlo, bjlo+n/3) val = 1.0 call ga_scale_patch(g_b, bilo,bilo+n/2,bjlo, bjlo+n/3,val) call ga_get(g_b,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(buf(base) .ne. a(i,j)*val) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_add_patch ... ' call ffflush(6) endif alpha = 0.1 beta = 0.2 call ga_zero(g_c) call ga_add_patch(alpha, g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, $ beta, g_b, bilo,bilo+n/2, bjlo, bjlo+n/3, $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/3) call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/3,buf,n/2+1) base = 0 val = val*beta + alpha do j = ajlo, ajlo+n/3 if(Mod(j,nproc).eq.me) then do i = ailo, ailo+n/2 base = base+1 if(ABS(buf(base)- a(i,j)*val).gt.1e-3) then print *,me, ' error ',i,j, buf(base), a(i,j)*val call ga_error('exiting ...',0) endif enddo else base = base +n/2+1 endif enddo call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c c*** if (me .eq. 0) then print *, ' ' write(6,*)'> Checking ga_sdot_patch ... ' call ffflush(6) endif alpha= ga_sdot_patch(g_a,'n', ailo,ailo+n/2, ajlo, ajlo+n/3, $ g_c,'n', bilo,bilo+n/2, bjlo, bjlo+n/3) beta = 0.0 do j = ajlo, ajlo+n/3 do i = ailo, ailo+n/2 beta = beta + a(i,j)**2 enddo enddo if(ABS(beta*val- alpha).gt.(1.0e-2*alpha)) then print *,me, ' error ', beta*val, alpha call ga_error('exiting ...',0) endif call ga_sync() c if (me .eq. 0) then write(6,*)' OK ' call ffflush(6) endif c...................................................... ccc if (me .eq. 0) then ccc print *, ' ' ccc write(6,*)'> Checking ga_matmul_patch ... ' ccc call ffflush(6) ccc endif ccc do j = 1+me, n, nproc ccc call ga_put(g_b,1,n,j,j,b(1,j),n) ccc enddo ccc call ga_sync() ccc call ga_matmul_patch('n','n', 1.0, 0.0, ccc $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, ccc $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, ccc $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) ccc call xgemm('n','n',n/2+1,n/2+1,n/3+1,1d0,a(ailo,ajlo), n, ccc $ b(bilo,bjlo),n, 0d0, c, n) ccc* call ga_print_patch(g_a, ailo,ailo+n/2, ajlo, ajlo+n/3) ccc* call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) ccc* call ga_print(g_c, 1) ccc call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) ccc base = 0 ccc do j = 1, 1+n/2 ccc if(Mod(j,nproc).eq.me) then ccc do i = 1, 1+n/2 ccc base = base+1 ccc if(ABS(buf(base)- c(i,j)).gt.1e-8) then ccc print *,me, ' error ',i,j, buf(base), c(i,j) ccc call ga_error('exiting ...',0) ccc endif ccc enddo ccc else ccc base = base +n/2+1 ccc endif ccc enddo cccc ccc call ga_sync() ccc if (me .eq. 0) then ccc write(6,*)' a*b: OK ' ccc call ffflush(6) ccc endif cccc ccc call ga_sync() ccc call ga_matmul_patch('t','n', 1d0, 0d0, ccc $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, ccc $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, ccc $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) ccc call xgemm('t','n',n/2+1,n/2+1,n/3+1,1.0,a(ajlo,ailo), n, ccc $ b(bilo,bjlo),n, 0.0, c, n) ccc* call ga_print(g_a,1) ccc* call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) ccc* call ga_print(g_c, 1) ccc call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) ccc base = 0 ccc do j = 1, 1+n/2 ccc if(Mod(j,nproc).eq.me) then ccc do i = 1, 1+n/2 ccc base = base+1 ccc if(ABS(buf(base)- c(i,j)).gt.1e-8) then ccc print *,me, ' error ',i,j, buf(base), c(i,j) ccc call ga_error('exiting ...',0) ccc endif ccc enddo ccc else ccc base = base +n/2+1 ccc endif ccc enddo cccc ccc call ga_sync() ccc if (me .eq. 0) then ccc write(6,*)' trans(a)*b: OK ' ccc call ffflush(6) ccc endif cccc ccc call ga_sync() ccc call ga_matmul_patch('n','t', 1.0, 0.0, ccc $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, ccc $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, ccc $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) ccc call xgemm('n','t',n/2+1,n/2+1,n/3+1,1.0,a(ailo,ajlo), n, ccc $ b(bjlo,bilo),n, 0.0, c, n) ccc* call ga_print(g_a,1) ccc* call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) ccc* call ga_print(g_c, 1) ccc call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) ccc base = 0 ccc do j = 1, 1+n/2 ccc if(Mod(j,nproc).eq.me) then ccc do i = 1, 1+n/2 ccc base = base+1 ccc if(ABS(buf(base)- c(i,j)).gt.1e-8) then ccc print *,me, ' error ',i,j, buf(base), c(i,j) ccc call ga_error('exiting ...',0) ccc endif ccc enddo ccc else ccc base = base +n/2+1 ccc endif ccc enddo cccc cccc ccc call ga_sync() ccc if (me .eq. 0) then ccc write(6,*)' a*trans(b): OK ' ccc call ffflush(6) ccc endif cccc ccc call ga_sync() ccc call ga_matmul_patch('t','t', 1d0, 0d0, ccc $ g_a, ailo,ailo+n/2, ajlo, ajlo+n/3, ccc $ g_b, bilo,bilo+n/3, bjlo, bjlo+n/2, ccc $ g_c, bilo,bilo+n/2, bjlo, bjlo+n/2) ccc call xgemm('t','t',n/2+1,n/2+1,n/3+1,1.0,a(ajlo,ailo), n, ccc $ b(bjlo,bilo),n, 0.0, c, n) ccc* call ga_print(g_a,1) ccc* call ga_print_patch(g_b, bilo,bilo+n/3, bjlo, bjlo+n/2) ccc* call ga_print(g_c, 1) ccc call ga_get(g_c,bilo,bilo+n/2,bjlo, bjlo+n/2,buf,n/2+1) ccc base = 0 ccc do j = 1, 1+n/2 ccc if(Mod(j,nproc).eq.me) then ccc do i = 1, 1+n/2 ccc base = base+1 ccc if(ABS(buf(base)- c(i,j)).gt.1e-8) then ccc print *,me, ' error ',i,j, buf(base), c(i,j) ccc call ga_error('exiting ...',0) ccc endif ccc enddo ccc else ccc base = base +n/2+1 ccc endif ccc enddo cccc ccc call ga_sync() ccc if (me .eq. 0) then ccc write(6,*)' trans(a)*trans(b): OK ' ccc call ffflush(6) ccc endif ccc status = ga_destroy(g_a) ccc status = status .and. ga_destroy(g_b) ccc status = status .and. ga_destroy(g_c) ccc if(.not. status) print *, 'ga_destroy failed' cccc end ga-5-4/global/testing/ffflush.F0000644000175000017500000000051412662210457014516 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c $Id: ffflush.F,v 1.2 2002-10-07 16:50:05 d3h325 Exp $ subroutine ffflush(unit) integer unit c #ifdef CRAY * if(unit.eq.6)then * call flush(101) * else * call flush(unit) * endif #elif HAVE_F77_FLUSH call F77_FLUSH(unit) #endif c end ga-5-4/global/examples/0000755000175000017500000000000012662210461013106 5ustar mbambaga-5-4/global/examples/petsc.F0000644000175000017500000001445012662210461014337 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program petsc implicit none #include "mafdecls.fh" #include "global.fh" integer heap, stack data heap,stack /2*40000/ c c*** Intitialize a message passing library c #ifdef MSG_COMMS_MPI call mpi_init #else call pbeginf #endif c call ga_initialize() ! initialize GAs if (.not. ma_init(MT_DBL, heap, stack)) ! initialize MA $ call ga_error("ma init failed",heap+stack) #ifdef ENABLE_TRACE call trace_init(10000) ! initialize trace #endif call iterate() ! do the work #ifdef ENABLE_TRACE call trace_end(ga_nodeid()) ! end trace #endif call ga_terminate() ! terminate GAs c #ifdef MSG_COMMS_MPI call mpi_finalize() #else call pend() #endif end subroutine iterate() implicit none #include "include/finclude/petsc.h" #include "include/finclude/vec.h" #include "include/finclude/mat.h" #include "include/finclude/pc.h" #include "include/finclude/ksp.h" #include "include/finclude/sles.h" #include "include/finclude/sys.h" #include "mafdecls.fh" #include "global.fh" double precision norm integer i, j, II, JJ, ierr, m, n parameter (m = 3) parameter (n = 3) integer its, Istart, Iend, flg integer me, nproc Scalar v, one, neg_one Vec x, b, u Mat A SLES sles KSP ksp PetscRandom rctx integer g_x integer ld double precision buf_v(1) PetscOffset idx c$$$ PC pc c$$$ PCType ptype c$$$ double precision tol ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Beginning of program ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c*** check parallel environment me = ga_nodeid() nproc = ga_nnodes() one = 1.0 neg_one = -1.0 ld = m*n c*** Global Array c*** create global arrays: g_x - approx. solution if (.not. ga_create(MT_DBL, m*n, 1, 'x', 1, 1, g_x)) $ call ga_error(' ga_create failed ',0) c c*** initial guess for x -- zero call ga_zero(g_x) c c$$$ do i=1,m*n c$$$ buf(i) = i c$$$ enddo c$$$ call ga_put(g_x,1,m*n,1,1,buf,ld) c c*** PETSC call PetscInitialize(PETSC_NULL_CHARACTER,ierr) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Compute the matrix and right-hand-side vector that define ! the linear system, Ax = b. ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c*** Matrix A call MatCreate(PETSC_COMM_WORLD,m*n,m*n,A,ierr) call MatGetOwnershipRange(A,Istart,Iend,ierr) do II=Istart,Iend-1 v = -1.0 i = II/n j = II - i*n if ( i.gt.0 ) then JJ = II - n call MatSetValues(A,1,II,1,JJ,v,ADD_VALUES,ierr) endif if ( i.lt.m-1 ) then JJ = II + n call MatSetValues(A,1,II,1,JJ,v,ADD_VALUES,ierr) endif if ( j.gt.0 ) then JJ = II - 1 call MatSetValues(A,1,II,1,JJ,v,ADD_VALUES,ierr) endif if ( j.lt.n-1 ) then JJ = II + 1 call MatSetValues(A,1,II,1,JJ,v,ADD_VALUES,ierr) endif v = 4.0 call MatSetValues(A,1,II,1,II,v,ADD_VALUES,ierr) enddo call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr) call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr) c*** Vector b call VecCreateMPI(PETSC_COMM_WORLD,PETSC_DECIDE,m*n,u,ierr) call VecSetFromOptions(u,ierr) call VecDuplicate(u,b,ierr) call VecDuplicate(b,x,ierr) c*** u is the exact solution call VecSet(one,u,ierr) if (me .eq. 0) print *, 'Exact solution:' call VecView(u, VIEWER_STDOUT_WORLD, ierr) c*** b is the right hand side call MatMult(A,u,b,ierr) c*** Manage to make connection of ga to petsc: g_x -> x call VecGetOwnershipRange(x,Istart,Iend,ierr) call VecGetArray(x,buf_v,idx,ierr) call ga_get(g_x,Istart+1,Iend,1,1,buf_v(idx+1),ld) call VecRestoreArray(x,buf_v,idx,ierr) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Create the linear solver and set various options ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call SLESCreate(PETSC_COMM_WORLD,sles,ierr) call SLESSetOperators(sles,A,A,DIFFERENT_NONZERO_PATTERN, & ierr) c$$$ call SLESGetPC(sles,pc,ierr) c$$$ ptype = PCJACOBI c$$$ call PCSetType(pc,ptype,ierr) c$$$ call SLESGetKSP(sles,ksp,ierr) c$$$ tol = 1.e-7 c$$$ call KSPSetTolerances(ksp,tol,PETSC_DEFAULT_DOUBLE_PRECISION, c$$$ & PETSC_DEFAULT_DOUBLE_PRECISION,PETSC_DEFAULT_INTEGER,ierr) call SLESSetFromOptions(sles,ierr) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Solve the linear system ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - call SLESSolve(sles,b,x,its,ierr) call ga_sync() c*** write the approx solution back to ga call VecGetArray(x,buf_v,idx,ierr) call ga_put(g_x,Istart+1,Iend,1,1,buf_v(idx+1),ld) call VecRestoreArray(x,buf_v,idx,ierr) if (me .eq. 0) print *, 'Approx solution:' call ga_print(g_x) ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Check solution and clean up ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! Check the error call VecAXPY(neg_one,u,x,ierr) call VecNorm(x,NORM_2,norm,ierr) if (me .eq. 0) then if (norm .gt. 1.e-12) then write(6,100) norm, its else write(6,110) its endif endif 100 format('Norm of error ',e10.4,' iterations ',i5) 110 format('Norm of error < 1.e-12, iterations ',i5) c*** clean up call SLESDestroy(sles,ierr) call VecDestroy(u,ierr) call VecDestroy(x,ierr) call VecDestroy(b,ierr) call MatDestroy(A,ierr) call PetscFinalize(ierr) if(.not. ga_destroy(g_x)) call ga_error('invalid handle ?',0) c call ga_sync() end ga-5-4/global/examples/boltzmann/0000755000175000017500000000000012662210461015112 5ustar mbambaga-5-4/global/examples/boltzmann/get_patch.F0000644000175000017500000001162412662210461017163 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine get_patch(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1, ii, jj) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c c Subroutine to handle cells at boundary c double precision rho, ux, uy, cspd2, dux, duy, a, b integer i, j, ii, jj, k, l, kk, ll integer bval integer mask(-1:1,-1:1) c c Locate local and absolute indices of cell c i = ii - width(1) - 1 + lo(1) j = jj - width(2) - 1 + lo(2) c c Check values of neighboring cells c do l = -1, 1 do k = -1, 1 if (i+k.ge.1.and.i+k.le.size(1).and. + j+l.ge.1.and.j+l.le.size(2)) then if (bc(ii+k,jj+l).ne.0) then mask(k,l) = 2 else mask(k,l) = 0 endif else mask(k,l) = 2 endif end do end do c c Determine if cells in mask represent interior cells or are c on the boundary c do l = -1, 1 do k = -1, 1 if (mask(k,l).ne.0.and.(k.ne.0.or.l.ne.0)) then do ll = max(l-1,-1), min(l+1,1) do kk = max(k-1,-1), min(k+1,1) if (mask(kk,ll).eq.0) mask(k,l) = 1 end do end do endif end do end do c c Evaluate distribution in boundary patch c bval = bc(ii,jj) c c Apply simple bounce back condition c if (bval.eq.1) then do l = -1, 1 do k = -1, 1 if (mask(k,l).eq.2) then fgp(k,l,ihash(k,l)) = fg(ii,jj,hash(k,l)+18) else fgp(k,l,ihash(k,l)) = fg(ii+k,jj+l,ihash(k,l)+18) endif end do end do c c Apply constant velocity boundary condition to flat upper boundary c else if (bval.eq.2) then cspd2 = cspd/sqrt(2.0d00) rho = 0.0d00 ux = 0.0d00 uy = 0.0d00 do l = -1, 1 do k = -1, 1 if (mask(k,l).eq.2) then fgp(k,l,ihash(k,l)) = fg(ii,jj,hash(k,l)+18) else fgp(k,l,ihash(k,l)) = fg(ii+k,jj+l,ihash(k,l)+18) endif rho = rho + fgp(k,l,ihash(k,l)) ux = ux - cspd2*dble(k)*fgp(k,l,ihash(k,l)) uy = uy - cspd2*dble(l)*fgp(k,l,ihash(k,l)) end do end do ux = ux/rho uy = uy/rho ux = uxbc - ux c c Add corrections needed to adjust for velocity mismatch c fgp(1,1,ihash(1,1)) = fgp(1,1,ihash(1,1)) + - 0.5d00*rho*ux/cspd2 fgp(-1,1,ihash(-1,1)) = fgp(-1,1,ihash(-1,1)) + + 0.5d00*rho*ux/cspd2 cc fgp(1,1,ihash(1,1)) = fgp(1,1,ihash(1,1)) cc + - 0.5d00*rho*ux/cspd2 cc + - rho*uy/(3.0d00*cspd2) cc fgp(0,1,ihash(0,1)) = fgp(0,1,ihash(0,1)) cc + - rho*uy/(3.0d00*cspd2) cc fgp(-1,1,ihash(-1,1)) = fgp(-1,1,ihash(-1,1)) cc + + 0.5d00*rho*ux/cspd2 cc + - rho*uy/(3.0d00*cspd2) c ux = uxbc c uy = 0.0d00 c rho = (cspd2/(uy+cspd2))*(fg(ii,jj,ihash(0,0)+18) c + + fg(ii+1,jj,ihash(1,0)+18)+fg(ii-1,jj,ihash(-1,0)+18) c + + 2.0d00*(fg(ii-1,jj-1,ihash(-1,-1)+18) c + + fg(ii,jj-1,ihash(0,-1)+18)+fg(ii+1,jj-1,ihash(1,-1)+18))) c fgp(0,1,ihash(0,1)) = fg(ii,jj-1,ihash(0,-1)+18) c a = (rho*ux-cspd2*(-fg(ii-1,jj,ihash(1,0)+18) c + + fg(ii+1,jj,ihash(1,0)+18)+fg(ii+1,jj+1,ihash(1,1)+18) c + - fg(ii-1,jj+1,ihash(-1,1)+18)))/cspd2 c b = fg(ii+1,jj+1,ihash(1,1)+18)+fg(ii+1,jj-1,ihash(1,-1)+18) c fgp(1,1,ihash(1,1)) = -0.5d00*(a+b) c fgp(1,1,ihash(1,1)) = 0.5d00*(a-b) c c Apply constant velocity boundary condition c else if (bval.eq.3) then cspd2 = sqrt(2.0d00)*cspd rho = 0.0d00 ux = 0.0d00 uy = 0.0d00 do l = -1, 1 do k = -1, 1 if (mask(k,l).eq.2.and.(k.ne.0.or.l.ne.0)) then fgp(k,l,ihash(k,l)) = fg(ii,jj,hash(k,l)) rho = rho + fg(ii,jj,hash(k,l)) ux = ux + cspd2*dble(k)*fg(ii,jj,hash(k,l)) uy = uy + cspd2*dble(l)*fg(ii,jj,hash(k,l)) else fgp(k,l,ihash(k,l)) = fg(ii+k,jj+l,ihash(i,l)) rho = rho + fg(ii+k,jj+l,ihash(k,l)) ux = ux + cspd2*dble(k)*fg(ii+k,jj+l,ihash(k,l)) uy = uy + cspd2*dble(l)*fg(ii+k,jj+l,ihash(k,l)) endif end do end do c c Determine value of correction needed to get specified final c velocity c dux = bcpar(2,1) - ux duy = bcpar(2,2) - uy endif c return end ga-5-4/global/examples/boltzmann/main.F0000644000175000017500000001111512662210461016144 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main c #include "common" c integer i, j, gdim, type integer gdims(NDIM+1), gwidth(NDIM+1) integer pdims(NDIM+1), mcnt, mapc(5000) integer g_fg, g_fld, g_bc, ptr_fg, ptr_fld, ptr_bc integer ld_fg(NDIM+1), ld_fld(NDIM+1), ld_bc(NDIM) integer heap, stack, me, nproc c #include "mafdecls.fh" #include "global.fh" c c Initialize a message passing library c #include "mp3.fh" size(1) = NSIZE size(2) = NSIZE c c Initialize global arrays c call ga_initialize() c nproc = ga_nnodes() me = ga_nodeid() c if (ga_uses_ma()) then heap = (size(1)+2)*(size(2)+2)*34/nproc else heap = 100000 endif stack = 50000 c if (.not.ma_init(MT_DBL, stack, heap)) + call ga_error("ma init failed", -1) c c initialize global arrays c do i = 1, NDIM dims(i) = size(i) gdims(i) = size(i) width(i) = 1 gwidth(i) = 1 end do c c evaluate distribution of processors c gdim = NDIM call factor(nproc,gdim,pdims) mcnt = 1 do i = 1, NDIM do j = 0, pdims(i)-1 mapc(mcnt) = ((dble(j)/dble(pdims(i)))*dble(gdims(i)))+1 mcnt = mcnt + 1 end do end do do i = 0, pdims(1)-1 mapc(mcnt) = ((dble(i)/dble(pdims(1)))*dble(NDIM))+1 mcnt = mcnt + 1 end do do i = 0, pdims(2)-1 mapc(mcnt) = ((dble(i)/dble(pdims(2)))*dble(NDIM))+1 mcnt = mcnt + 1 end do c c Create global arrays. Start by creating array for LB distribution c functions. The last dimension runs over the distribution function c indices. The first 9 elements are the actual distribution elements, c the next 9 indices are the equilibrium distribution elements, c and the last 9 elements are temporary storage space used for doing c the streaming updates. c type = MT_DBL gdim = 3 gdims(3) = 27 gwidth(3) = 0 pdims(3) = 1 mapc(mcnt) = 1 if (.not.nga_create_ghosts_irreg(type, gdim, gdims, gwidth, + "lb_dist", mapc, pdims, g_fg)) + call ga_error("g_fg init failed",me) c c Create global array to hold density, momentum, pressure, c and relaxation parameters. These are stored at each point c and indexed by the last indice as density, p_x, p_y, c pressure, t_rho. c type = MT_DBL gdim = 3 gdims(3) = 6 gwidth(3) = 0 pdims(3) = 1 mapc(mcnt) = 1 if (.not.nga_create_ghosts_irreg(type, gdim, gdims, gwidth, + "fields", mapc, pdims, g_fld)) + call ga_error("g_fld init failed",me) c c Create global array to hold boundary condition data. c type = MT_INT gdim = 2 if (.not.nga_create_ghosts_irreg(type, gdim, gdims, gwidth, + "bc_mask", mapc, pdims, g_bc)) + call ga_error("g_bc init failed",me) c c Find pointers to global array data c call nga_access_ghosts(g_fg,dims_fg,ptr_fg,ld_fg) call nga_access_ghosts(g_fld,dims_fld,ptr_fld,ld_fld) call nga_access_ghosts(g_bc,dims_bc,ptr_bc,ld_bc) do i = 1, NDIM dims(i) = dims_fg(i) end do c c Call routine to run main simulation c call boltzmann(g_fg, dbl_mb(ptr_fg), ld_fg(1), ld_fg(2), + g_fld, dbl_mb(ptr_fld), ld_fld(1), ld_fld(2), + g_bc, int_mb(ptr_bc), ld_bc(1)) c c Close out calculation c call ga_terminate() call MP_FINALIZE() stop end c subroutine factor(p,ndim,dims) implicit none integer i,j,p,ndim,dims(*),imin,mdim integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p do i = 1, ndim dims(i) = 1 end do c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine dimensions of processor grid c do i = ifac, 1, -1 c c find dimension with minimum value c imin = dims(1) mdim = 1 do j = 2, ndim if (dims(j).lt.imin) then imin = dims(j) mdim = j endif end do dims(mdim) = dims(mdim)*fac(i) end do c return end ga-5-4/global/examples/boltzmann/boltzmann.F0000644000175000017500000000432512662210461017231 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine boltzmann(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" c integer i, me, nprocs me = ga_nodeid() nprocs = ga_nnodes() c c initialize problem c call setup(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) c if (me.eq.0) then write(6,*) 'Total mass is ',rtot write(6,*) 'Total x-momentum is ',uxtot write(6,*) 'Total y-momentum is ',uytot endif do i = 1, nsteps call timestep(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) if (mod(i,200).eq.0) then if (me.eq.0) then write(6,*) 'Completed step ',i write(6,*) 'Total density is ',rtot write(6,*) 'Total x-momentum is ',uxtot write(6,*) 'Total y-momentum is ',uytot endif call vorticity(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) call printdat(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) endif end do call vorticity(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) call printdat(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) c call ga_dgop(MT_DBL,tstats,50,'+') if (me.eq.0) write(6,100) tstats(1)/dble(nprocs) if (me.eq.0) write(6,200) tstats(2)/dble(nprocs) c 100 format('Average time in lattice Boltzmann updates :',f12.4) 200 format('Average time in ghost cell updates :',f12.4) return end ga-5-4/global/examples/boltzmann/printdat.F0000644000175000017500000001041212662210461017044 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine printdat(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1, ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" c double precision buffer(NSIZE,10,3) double precision dx, dy integer glo(NDIM+1), ghi(NDIM+1), bld(NDIM) integer i,j,k,imax,icnt1,icnt2,inc1,inc2,jcnt integer maxelem c c Subroutine to print current value of fields to a file c imax = size(2)/10 + 1 glo(1) = 1 ghi(1) = size(1) glo(3) = 1 ghi(3) = 3 bld(1) = NSIZE bld(2) = 10 c maxelem = 256 c c Check dimensions to see if size needs to be reduced c if (size(1).gt.maxelem) then inc1 = size(1)/maxelem icnt1 = 0 do i = 1, size(1), inc1 icnt1 = icnt1 + 1 end do else inc1 = 1 icnt1= size(1) endif if (size(2).gt.maxelem) then inc2 = size(2)/maxelem icnt2 = 0 do i = 1, size(2), inc2 icnt2 = icnt2 + 1 end do else inc2 = 1 icnt2= size(2) endif c if (ga_nodeid().eq.0) then open(unit=7,file='bltz.gmv',status='unknown') c c Write out header type information c write(7,100) write(7,200) icnt1,icnt2,1 dx = dble(inc1)*xmax/dble(size(1)-1) dy = dble(inc1)*xmax/dble(size(1)-1) write(7,300) (dble(i-1)*dx,i=1,icnt1) write(7,300) (dble(i-1)*dy,i=1,icnt2) write(7,300) 0.0 write(7,1000) write(7,400) write(7,500) jcnt = 0 do i = 1, imax glo(2) = (i-1)*10 + 1 ghi(2) = i*10 if (ghi(2).gt.size(2)) ghi(2) = size(2) if (ghi(2).ge.glo(2)) then call nga_get(g_fld, glo, ghi, buffer, bld) do k = 1, ghi(2)-glo(2)+1 jcnt = jcnt + 1 if (mod((jcnt-1),inc2).eq.0) then write(7,300) (buffer(j,k,1),j=1,size(1),inc1) endif end do endif end do write(7,600) jcnt = 0 do i = 1, imax glo(2) = (i-1)*10 + 1 ghi(2) = i*10 if (ghi(2).gt.size(2)) ghi(2) = size(2) if (ghi(2).ge.glo(2)) then call nga_get(g_fld, glo, ghi, buffer, bld) do k = 1, ghi(2)-glo(2)+1 jcnt = jcnt + 1 if (mod((jcnt-1),inc2).eq.0) then write(7,300) (buffer(j,k,2),j=1,size(1),inc1) endif end do endif end do write(7,700) do i = 1, imax glo(2) = (i-1)*10 + 1 ghi(2) = i*10 if (ghi(2).gt.size(2)) ghi(2) = size(2) if (ghi(2).ge.glo(2)) then call nga_get(g_fld, glo, ghi, buffer, bld) do k = 1, ghi(2)-glo(2)+1 jcnt = jcnt + 1 if (mod((jcnt-1),inc2).eq.0) then write(7,300) (buffer(j,k,3),j=1,size(1),inc1) endif end do endif end do write(7,1100) glo(3) = 4 ghi(3) = 6 do i = 1, imax glo(2) = (i-1)*10 + 1 ghi(2) = i*10 if (ghi(2).gt.size(2)) ghi(2) = size(2) if (ghi(2).ge.glo(2)) then call nga_get(g_fld, glo, ghi, buffer, bld) do k = 1, ghi(2)-glo(2)+1 jcnt = jcnt + 1 if (mod((jcnt-1),inc2).eq.0) then write(7,300) (buffer(j,k,3),j=1,size(1),inc1) endif end do endif end do write(7,800) write(7,900) close(7) endif c 100 format('gmvinput ascii') 200 format('nodes -1',3i10) 300 format(' ',5f12.4) 400 format('variable') 500 format('rho 1') 600 format('ux 1') 700 format('uy 1') 800 format('endvars') 900 format('endgmv') 1000 format('cells 0') 1100 format('vorticity 1') return end ga-5-4/global/examples/boltzmann/initpar.F0000644000175000017500000000307312662210461016672 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine initpar #include "common" c double precision q8_ei(18,3) data q8_ei + /1,-1, 0, 0, 1,-1, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1,-1, 1,-1,-1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0/ integer i,j double precision rdim,b,c2 c do i=1, 8 do j = 1, NDIM ei(i,j) = q8_ei(i,j) end do end do c rdim = 4.0d00 c2 = cspd**2 b = 24.0d00 c do i =1, 9 if (i.eq.1) then ffb(i) = 0.0d00 ffc(i) = 0.0d00 ffd(i) = -1.0d00/c2-4.0d00*rdim/(2.0d00*b*c2) elseif (i.le.5) then ffb(i) = 4.0d00*rdim/(b*c2) ffc(i) = 4.0d00*rdim*(rdim+2.0d00)/(2.0d00*b*c2**2) ffd(i) = -4.0d00*rdim/(2.0d00*b*c2) else ffb(i) = rdim/(b*c2) ffc(i) = rdim*(rdim+2.0d00)/(2.0d00*b*c2**2) ffd(i) = -rdim/(2.0d00*b*c2) endif end do c c c Initialize hash table c hash(0,0) = 1 hash(1,0) = 2 hash(-1,0) = 3 hash(0,1) = 4 hash(0,-1) = 5 hash(1,1) = 6 hash(-1,-1) = 7 hash(1,-1) = 8 hash(-1,1) = 9 c c Initialise inverse hash table c ihash(0,0) = 1 ihash(1,0) = 3 ihash(-1,0) = 2 ihash(0,1) = 5 ihash(0,-1) = 4 ihash(1,1) = 7 ihash(-1,-1) = 6 ihash(1,-1) = 9 ihash(-1,1) = 8 c do i = 1, 50 tstats(i) = 0.0d00 end do c return end ga-5-4/global/examples/boltzmann/vorticity.F0000644000175000017500000000501712662210461017260 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine vorticity(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1, ic, jc) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" c c Subroutine to evaluate the vorticity of velocity field c double precision drho(2), dux(2), duy(2) double precision dr,dx,dy,adxi,adyi,drxi,dryi,dri,drni,dxi,dyi double precision rhot,uxt,uyt integer ic, jc, i, j, ii, jj c call ga_update_ghosts(g_fld) do jj = width(2) + 1, dims(2) - width(2) do ii = width(1) + 1, dims(1) - width(1) drni = 0.0d00 drxi = 0.0d00 dryi = 0.0d00 do j = 1, 2 drho(j) = 0.0d00 dux(j) = 0.0d00 duy(j) = 0.0d00 end do do j = -1, 1 dy = dble(j)*delta_x if (dy.ne.0.0d00) then dyi = 1.0d00/dy else dyi = 0.0d00 endif do i = -1, 1 if (bc(ii+i,jj+j).eq.0.and.(i.ne.0.or.j.ne.0)) then dx = dble(i)*delta_x if (dx.ne.0.0d00) then dxi = 1.0d00/dx else dxi = 0.0d00 endif dr = sqrt(dx**2+dy**2) dri = 1.0d00/dr adxi = abs(dx*dri**2) adyi = abs(dy*dri**2) c rhot = fld(ii+i,jj+j,1) uxt = fld(ii+i,jj+j,2) uyt = fld(ii+i,jj+j,3) drho(1) = drho(1) + (rhot-fld(ii,jj,1))*dxi*adxi drho(2) = drho(2) + (rhot-fld(ii,jj,1))*dyi*adyi dux(1) = dux(1) + (uxt-fld(ii,jj,2))*dxi*adxi dux(2) = dux(2) + (uxt-fld(ii,jj,2))*dyi*adyi duy(1) = duy(1) + (uyt-fld(ii,jj,3))*dxi*adxi duy(2) = duy(2) + (uyt-fld(ii,jj,3))*dyi*adyi drxi = drxi+adxi dryi = dryi+adyi endif end do end do drho(1) = drho(1)/drxi drho(2) = drho(2)/dryi dux(1) = dux(1)/drxi dux(2) = dux(2)/dryi duy(1) = duy(1)/drxi duy(2) = duy(2)/dryi fld(ii,jj,6) = duy(1)-dux(2) end do end do return end ga-5-4/global/examples/boltzmann/equil.F0000644000175000017500000000341712662210461016345 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine equil(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c double precision rdim, b, c2, cspdi, cspd2, ex, ey double precision aa0, aa integer i, j, ii, jj c c This subroutine evaluates the equilibrium distribution c rdim = 4.0d00 b = 24.0d00 c2 = cspd**2 cspdi = sqrt(2.0d00)/cspd cspd2 = 1.0d00/cspdi c c Calculate equilibrium distributions c do jj = width(2) + 1, dims(2) - width(2) do i = 10, 18 j = i-9 if (j.ne.1) then ex = cspd2*ei(j-1,1) ey = cspd2*ei(j-1,2) else ex = 0.0d00 ey = 0.0d00 endif do ii = width(1) + 1, dims(1) - width(1) aa = (rdim/(b*c2))*fld(ii,jj,4) aa0 = fld(ii,jj,1) - b*aa if (j.eq.1) then ffa(j) = aa0 + 4.0d00*aa else if (j.le.5) then ffa(j) = 4.0d00*aa else ffa(j) = aa endif c c evaluate distribution c fg(ii,jj,i) = ffa(j) + fld(ii,jj,1)*(ffb(j)*(fld(ii,jj,2)*ex + + fld(ii,jj,3)*ey) + + ffc(j)*(fld(ii,jj,2)**2*ex**2 + + 2.0d00*fld(ii,jj,2)*fld(ii,jj,3)*ex*ey + + fld(ii,jj,3)**2*ey**2) + + ffd(j)*(fld(ii,jj,2)**2+fld(ii,jj,3)**2)) end do end do end do c return end ga-5-4/global/examples/boltzmann/properties.F0000644000175000017500000000476712662210461017433 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine properties(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" c c Evaluate properties on grid c double precision cspd2, ex, ey, sum(3) double precision rho integer i, j, ii, jj c c Zero accumulators and hydrodynamic fields c rtot = 0.0d00 uxtot = 0.0d00 uytot = 0.0d00 cspd2 = cspd/sqrt(2.0d00) c do jj = width(2) + 1, dims(2) - width(2) do i = 1, 4 do ii = width(1) + 1, dims(1) - width(1) fld(ii,jj,i) = 0.0d00 end do end do end do c c Evaluate density and momentum c do jj = width(2) + 1, dims(2) - width(2) do i = 1, 9 j = i - 1 if (j.ne.0) then ex = cspd2*ei(j,1) ey = cspd2*ei(j,2) else ex = 0.0d00 ey = 0.0d00 endif do ii = width(1) + 1, dims(1) - width(1) fld(ii,jj,1) = fld(ii,jj,1) + fg(ii,jj,i) fld(ii,jj,2) = fld(ii,jj,2) + ex*fg(ii,jj,i) fld(ii,jj,3) = fld(ii,jj,3) + ey*fg(ii,jj,i) end do end do end do c c Evaluate pressure and accumulate values c do jj = width(2) + 1, dims(2) - width(2) do ii = width(1) + 1, dims(1) - width(1) fld(ii,jj,2) = fld(ii,jj,2)/fld(ii,jj,1) fld(ii,jj,3) = fld(ii,jj,3)/fld(ii,jj,1) rtot = rtot + fld(ii,jj,1) c if (bc(ii,jj).eq.1) then c fld(ii,jj,2) = 0.0d00 c fld(ii,jj,3) = 0.0d00 c elseif (bc(ii,jj).eq.2) then c fld(ii,jj,1) = rhobc c fld(ii,jj,2) = uxbc c fld(ii,jj,3) = 0.0d00 c endif uxtot = uxtot + fld(ii,jj,1)*fld(ii,jj,2) uytot = uytot + fld(ii,jj,1)*fld(ii,jj,3) rho = fld(ii,jj,1) fld(ii,jj,4) = rho*rgas*tmprtr0/(1.0d00-b_vdw*rho) + - a_vdw*rho**2 end do end do c c Sum values across processors c sum(1) = rtot sum(2) = uxtot sum(3) = uytot c call ga_dgop(MT_DBL,sum,3,'+') rtot = sum(1) uxtot = sum(2) uytot = sum(3) c return end ga-5-4/global/examples/boltzmann/timestep.F0000644000175000017500000000534512662210461017062 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine timestep(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" #define MP_DEFINES_ONLY #include "mp3.fh" #undef MP_DEFINES_ONLY c c Advance simulation one timestep c integer ii, jj, i, j, k, ix, iy double precision start1, start2 c c Make backup copies of distribution and update ghost cells c start1 = MP_TIMER() do jj = width(2) + 1, dims(2) - width(2) do i = 1, 9 j = i + 18 do ii = width(1) + 1, dims(1) - width(1) fg(ii,jj,j) = fg(ii,jj,i) end do end do end do start2 = MP_TIMER() call ga_mask_sync(.false.,.false.) call ga_update_ghosts(g_fg) tstats(2) = tstats(2) + MP_TIMER() - start2 c c Perform streaming operation c do jj = width(2) + 1, dims(2) - width(2) do ii = width(1) + 1, dims(1) - width(1) if (bc(ii,jj).eq.0) then do i = 2, 9 j = i + 18 k = i - 1 ix = nint(ei(k,1)) iy = nint(ei(k,2)) fg(ii,jj,i) = fg(ii-ix,jj-iy,j) end do else call get_patch(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1, ii, jj) do i = 2, 9 k = i - 1 ix = nint(ei(k,1)) iy = nint(ei(k,2)) fg(ii,jj,i) = fgp(-ix,-iy,i) end do endif end do end do c c Update properties c call properties(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) c c Perform relaxation c call equil(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) do jj = width(2) + 1, dims(2) - width(2) do i = 1, 9 do ii = width(1) + 1, dims(1) - width(1) if (fld(ii,jj,5).gt.0.0d00) then fg(ii,jj,i) = fg(ii,jj,i+18) + - (fg(ii,jj,i+18)-fg(ii,jj,i+9)) + / fld(ii,jj,5) endif c if (bc(ii,jj).eq.2) then c fg(ii,jj,i) = fg(ii,jj,i+9) c endif end do end do end do c tstats(1) = tstats(1) + MP_TIMER() - start1 c return end ga-5-4/global/examples/boltzmann/README0000644000175000017500000000427112662210461015776 0ustar mbambaThis directory contains the source code for a simple lattice Boltzmann simulation of flow in a lid-driven square cavity. The algorithm used is described in BJ Palmer and DR Rector, Journal of Computational Physics, vol. 161, pp. 1-20 (2000). The temperature has been set to a constant for this simulation, eliminating the need for the second distribution and an ideal gas has been used for equation of state. The output from the simulation is sent to the file bltz.gmv and can be viewed using the General Mesh Viewer program developed at Los Alamos National Laboratory. More information on this program can be obtained from the web page at: http://www-xdiv.lanl.gov/XCM/gmv/GMVHome.html The global arrays used in the code are all declared in the file main.F and then passed by reference to the subroutines. The output file is created by the subroutine in printdat.F; if you are interested in writing your own output routine, you should consult this file. The size of the grid used for the simulation is set in the include file "common" using the variable NSIZE, the remaining system parameters are set in the subroutine in setup.F. The parameters are currently set to model a relatively low velocity flow and should take a couple of minutes to run on a modest number of processors. Performance will, of course, depend on the particular system. For those wishing to try some calculations at other conditions, some of the remaining parameters are: - xmax: the dimensions of the square cavity - viscosity: viscosity - delta_t: time increment - tmprtr0: temperature of fluid - rho0: initial uniform density of fluid in cavity - uxbc: velocity of lid The executable name is boltz.x The parameters are currently set to run at a Reynolds number of 128. A calculation at a much higher Reynolds number of 2560 can be run by changing the value of NSIZE to 4097 and resetting the following parameters: - viscosity: 0.05 - delta_t: 0.1 Note that the simulation will have to be run for a considerably longer time period before any significant flow patterns begin to develop, on the order of 100000-200000 steps. This calculation also involves a much larger number of grid cells and requires a significant number of processors to run. ga-5-4/global/examples/boltzmann/common0000644000175000017500000000237412662210461016333 0ustar mbamba implicit none integer NDIM, NSIZE parameter (NDIM=2, NSIZE=129) common /indices/ lo(NDIM+1), hi(NDIM+1), size(NDIM), width(NDIM), + dims(NDIM) integer lo, hi, size, width, dims common /ghstdat/ dims_fg(NDIM+1), dims_fld(NDIM+1), + dims_bc(NDIM) integer dims_fg, dims_fld, dims_bc common /lattice/ ei(8,NDIM), cspd double precision ei, cspd common /distributions/ ffa(0:8), ffb(0:8), ffc(0:8), ffd(0:8), + ffe(0:8) double precision ffa, ffb, ffc, ffd, ffe common /boundary/ bcpar(10,3) double precision bcpar common /props/ rtot, uxtot, uytot double precision rtot, uxtot, uytot common /constants/ a_vdw, b_vdw, rgas, tmprtr0 double precision a_vdw, b_vdw, rgas, tmprtr0 common /simpar/ delta_t, delta_x, xmax, viscosity, nsteps double precision delta_t, delta_x, xmax, viscosity integer nsteps common /patch/ fgp(-1:1,-1:1,9), hash(-1:1,-1:1), + ihash(-1:1,-1:1) double precision fgp integer hash, ihash common /bcparams/ uxbc, uybc, rhobc double precision uxbc, uybc, rhobc common /timing/ tstats(50) double precision tstats ga-5-4/global/examples/boltzmann/setup.F0000644000175000017500000000614512662210461016367 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine setup(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) #include "common" c integer ld_fg1, ld_fg2, ld_fld1, ld_fld2, ld_bc1 double precision fg(ld_fg1,ld_fg2, *) double precision fld(ld_fld1, ld_fld2, *) integer bc(ld_bc1, *) integer g_fg, g_fld, g_bc c #include "mafdecls.fh" #include "global.fh" c double precision rho0, ux0, uy0, t_rho, pi integer i, j, ii, jj, gtmp, me integer ld(NDIM) c c Set simulation parameters c nsteps = 5000 viscosity = 1.0d00 delta_t = 1.0d00 xmax = 256.0 c rho0 = 2.7 tmprtr0 = 1.0 ux0 = 0.0 uy0 = 0.0 t_rho = 1.0d00 uxbc = 0.5 rhobc = rho0 c rgas = 1.0 a_vdw = 0.0d00 b_vdw = 0.0d00 c delta_x = xmax/dble(size(1)-1) cspd = sqrt(2.0d00)*delta_x/delta_t if (ga_nodeid().eq.0) write(6,*) 'Value of tau_rho is ', + 6.0d00*viscosity/(cspd**2*delta_t) + 0.5d00 c c Find low and high indices of locally held data c me = ga_nodeid() call nga_distribution(g_fg, me, lo, hi) call nga_access(g_fg, lo, hi, gtmp, ld) c c Initialize boundary array c call ga_zero(g_bc) do jj = width(2) + 1, dims(2) - width(2) j = jj - width(2) - 1 + lo(2) do ii = width(1) + 1, dims(1) - width(1) i = ii - width(1) - 1 + lo(1) if (i.eq.1) then bc(ii,jj) = 1 else if (i.eq.size(1)) then bc(ii,jj) = 1 else if (j.eq.1) then bc(ii,jj) = 1 else if (j.eq.size(2)) then bc(ii,jj) = 2 else bc(ii,jj) = 0 endif c bc(ii,jj) = 0 end do end do call ga_update_ghosts(g_bc) c c Create initial distribution of density and velocities c pi = 4.0d00*atan(1.0d00) rtot = 0.0d00 do jj = width(2) + 1, dims(2) - width(2) j = jj - width(2) - 1 + lo(2) do ii = width(1) + 1, dims(1) - width(1) i = ii - width(1) - 1 + lo(1) fld(ii,jj,1) = rho0 + 0.0*cos(2.0d00*pi*dble(j-1) + / dble(size(2)-1)) fld(ii,jj,2) = ux0 fld(ii,jj,3) = uy0 fld(ii,jj,4) = rho0*rgas*tmprtr0/(1.0d00-b_vdw*rho0) + - a_vdw*rho0**2 fld(ii,jj,5) = 6.0d00*viscosity/(cspd**2*delta_t) + 0.5d00 rtot = rtot + fld(ii,jj,1) end do end do c c initialize lattice parameters c call initpar c c evaluate equilibrium distribution c call equil(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) do jj = width(2)+1, dims(2) - width(2) do j = 1, 9 do ii = width(1)+1, dims(1) - width(1) fg(ii,jj,j) = fg(ii,jj,j+9) end do end do end do call properties(g_fg, fg, ld_fg1, ld_fg2, + g_fld, fld, ld_fld1, ld_fld2, + g_bc, bc, ld_bc1) c return end ga-5-4/global/examples/scf/0000755000175000017500000000000012662210461013661 5ustar mbambaga-5-4/global/examples/scf/scf.F0000644000175000017500000011313112662210461014543 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program scf C$Id: scf.F,v 1.18 2007/03/23 19:24:36 d3g293 Exp $ implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" c integer*8 nints, maxint !cste c c CAUTION: integer precision requirements c nints, maxint, etc. are proportional to the number of basis functions c to the fourth power! 216**4 is greater than the largest number c that can be represented as a 32-bit signed interger, so 64-bit c arithmetic is needed to count integrals when calculating more than c 14 Be atoms with 15 basis functions each. Since integrals are counted c over all iterations, 18 iterations with 7 atoms can result in precision c problems. Note that the wave function could be calculated correctly c for much larger basis sets without 64-bit integers because the required c indexing is usually proportional to nbfn**2, which is good to 46,340 c basis functions, except that the task counter runs as (nbfn/ichunk)**4, c so with ichunk = 10, 32-bit integers yield correct wavefunctions out to c 2145 basis functions (maxatom=143), or 4290 (maxatom=286) with ichunk = 20, ... c c This warning applies to the Global Arrays implementation as well! c functions of special concern are ga_igop and nga_read_inc. c #define USE_TRANSFORM 1 integer heap, stack data tinit, tonel, ttwoel, tdiag, tdens, tprint /6*0.0d0/ data eone, etwo, energy, deltad /4*0.0d0/ c c initalize the parallel message passing environment c #include "mp3.fh" call ga_initialize() c c Allocate memory c heap = 32000000 stack = 32000000 if (.not.ma_init(MT_DBL, stack, heap)) + call ga_error("ma_init failed",-1) call flush(6) me = ga_nodeid() nproc = ga_nnodes() c c initialize a bunch of stuff and initial density matrix c rjunk = timer() c c get input from file be.inpt c call input c c create and allocate global arrays c call setarrays if (ga_nodeid().eq.0) write(6,*) 'bytes of memory used by node 0:' + ,ga_inquire_memory() call ininrm c c create initial guess for density matrix by using single atom c densities c call denges tinit = timer() #if USE_TRANSFORM c c make initial orthogonal orbital set for solution method using c similarity transform c call makeob #endif c c make info for sparsity test c call makesz(schwmax) c c print preliminary data before any long compute segments start if (ga_nodeid().eq.0) call flush(6) c c *** iterate *** c do 10 iter = 1, mxiter c c make the one particle contribution to the fock matrix c and get the partial contribution to the energy c call oneel(schwmax, eone) tonel = tonel + timer() c c compute the two particle contributions to the fock matrix and c get the total energy. c call twoel(schwmax, etwo) ttwoel = ttwoel + timer() c c Diagonalize the fock matrix. The diagonalizers used in this c subroutine are actually sequential, not parallel. c call diagon(tester,iter) tdiag = tdiag + timer() c c make the new density matrix in g_work from orbitals in g_orbs, c compute the norm of the change in the density matrix and c then update the density matrix in g_dens with damping. c call makden deltad = dendif() if (iter.eq.1) then scale = 0.0d0 else if (iter .le. 5) then if (nbfn .gt. 60) then scale = 0.5d0 else scale = 0.0d0 endif else scale = 0.0d0 endif call damp(scale) tdens = tdens + timer() c c add up energy and print out convergence information c if (me.eq.0) then energy = enrep + eone + etwo call prnout(iter, energy, deltad, tester) tprint = tprint + timer() endif c c if converged then exit iteration loop c if (deltad .lt. tol) goto 20 call ga_igop(9, icut4, 1, '+') !cste if(icut4 .eq. 0) then !cste c something has gone wrong--print what you know and quit. write(6,*) 'no two-electron integrals computed!' !cste goto 20 !cste endif !cste 10 continue iter = iter - 1 !cste if(me.eq.0) $ write(6,*) ' SCF failed to converge in ', iter, ' iters' c...v....1....v....2....v....3....v....4....v....5....v....6....v....7.. c c finished ... print out eigenvalues and occupied orbitals c 20 continue call ga_igop(6, icut1, 1, '+') call ga_igop(7, icut2, 1, '+') call ga_igop(8, icut3, 1, '+') if (me.eq.0) then c c print out timing information c call prnfin(energy) write(6,1) tinit, tonel, ttwoel, tdiag, tdens, tprint, $ nproc 1 format(/5x,' init ',4x,' onel ',4x,' twoel ',4x,' diag ',4x, $ ' dens print ncpu'/ $ 5x,'------',4x,'------',4x,'-------',4x,'------',4x, $ '------ ------ ------'/ $ 2f10.2,f11.2,3f10.2, i7/) totsec = tinit+tonel+ttwoel+tdiag+tdens+tprint write(6,*)'elapsed time in seconds ',totsec c c print out information on # integrals evaluated each iteration c nints = icut1+icut2+icut3 frac = dble(icut3)/dble(nints) write(6,2) icut1, icut2, icut3, nints, frac 2 format(/'No. of integrals screened or computed (all iters) ' $ /'-------------------------------------'/ $ /1x,' failed #ij test failed #kl test', $ ' #compute #total', $ ' fraction', $ /1x,' --------------- ---------------', $ ' --------------- ---------------', $ ' --------', $ /1x,4(1x,i15),f9.6) maxint = nbfn !cste maxint = maxint**4 * iter !cste if(nints .ne. maxint) then !cste write(6,*)'Inconsistent number of integrals, should be ', !cste $ maxint !cste write(6,*)'Note: largest 32-bit integer is 2,147,483,647' !cste write(6,*)'Probably due to insufficient integer precision in GA.'!cste endif !cste #ifdef MSG_COMMS_MPI call ga_print_stats() #else call stats #endif endif c call closearrays call ga_terminate #ifdef MSG_COMMS_MPI call mpi_finalize #else call pend #endif c end c subroutine makesz(schwmax) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" dimension work(ichunk,ichunk) integer lo(2),hi(2),i,j,iloc,jloc,ld logical dotask, next_chunk c c schwarz(ij) = (ij|ij) for sparsity test c icut1 = 0 icut2 = 0 icut3 = 0 c call ga_zero(g_schwarz) call ga_zero(g_counter) schwmax = 0.0d0 dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) do i = lo(1), hi(1) iloc = i - lo(1) + 1 do j = lo(2), hi(2) jloc = j - lo(2) + 1 call g(gg,i,j,i,j) work(iloc,jloc) = sqrt(gg) schwmax = max(schwmax, work(iloc,jloc)) end do end do call nga_put(g_schwarz,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do call ga_dgop(11,schwmax,1,'max') c return end c subroutine ininrm implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer*8 maxint c c write a little welcome message c maxint = nbfn maxint = maxint**4 if (ga_nodeid().eq.0) then write(6,1) natom, nocc, nbfn, maxint, tol, ichunk 1 format(/' Example Direct Self Consistent Field Program '/ $ ' -------------------------------------------- '// $ ' no. of atoms .............. ',i5/ $ ' no. of occupied orbitals .. ',i5/ $ ' no. of basis functions .... ',i5/ $ ' basis functions^4 ' ,i15/ $ ' convergence threshold ..... ',1pd9.2/ $ ' chunk size .................',i5) write(6,*) !cste call flush(6) !cste endif !cste c c generate normalisation coefficients for the basis functions c and the index array iky c do 10 i = 1, nbfn iky(i) = i*(i-1)/2 10 continue c do 20 i = 1, nbfn rnorm(i) = (expnt(i)*2.0d0/pi)**0.75d0 20 continue c c initialize common for computing f0 c call setfm c end double precision function h(i,j) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" cvd$r novector cvd$r noconcur c c generate the one particle hamiltonian matrix element c over the normalized primitive 1s functions i and j c f0val = 0.0d0 sum = 0.0d0 rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) expij = exprjh(-facij*rab2) repij = (2.0d0*pi/(expnt(i)+expnt(j))) * expij c c first do the nuclear attraction integrals c do 10 iat = 1, natom xp = (x(i)*expnt(i) + x(j)*expnt(j))/(expnt(i)+expnt(j)) yp = (y(i)*expnt(i) + y(j)*expnt(j))/(expnt(i)+expnt(j)) zp = (z(i)*expnt(i) + z(j)*expnt(j))/(expnt(i)+expnt(j)) rpc2 = (xp-ax(iat))**2 + (yp-ay(iat))**2 + (zp-az(iat))**2 c call f0(f0val, (expnt(i)+expnt(j))*rpc2) sum = sum - repij * q(iat) * f0val 10 continue c c add on the kinetic energy term c sum = sum + facij*(3.0d0-2.0d0*facij*rab2) * $ (pi/(expnt(i)+expnt(j)))**1.5d0 * expij c c finally multiply by the normalization constants c h = sum * rnorm(i) * rnorm(j) c end double precision function s(i,j) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c c generate the overlap matrix element between the normalized c primitve gaussian 1s functions i and j c rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) s = (pi/(expnt(i)+expnt(j)))**1.5d0 * exprjh(-facij*rab2) * $ rnorm(i)*rnorm(j) c end subroutine makden implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c dimension work(maxnbfn,maxnbfn), torbs(maxnbfn,maxnbfn) dimension work(ichunk,ichunk), orbsi(ichunk,maxnbfn) dimension orbsj(ichunk,maxnbfn) integer lo(2), hi(2), tlo(2), thi(2), i, j, iloc, jloc, ld logical dotask, next_chunk c c generate density matrix from orbitals in g_orbs. the first c nocc orbitals are doubly occupied. c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) tlo(1) = lo(1) thi(1) = hi(1) tlo(2) = 1 thi(2) = nocc call nga_get(g_orbs,tlo,thi,orbsi,ld) tlo(1) = lo(2) thi(1) = hi(2) call nga_get(g_orbs,tlo,thi,orbsj,ld) do i = lo(1), hi(1) iloc = i - lo(1) + 1 do j = lo(2), hi(2) jloc = j - lo(2) + 1 p = 0.0d00 do k = 1, nocc p = p + orbsi(iloc,k)*orbsj(jloc,k) end do work(iloc,jloc) = 2.0d00*p end do end do call nga_put(g_work,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do return end c subroutine oneel(schwmax, eone) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer lo(2), hi(2), i, j, iloc, jloc, ld dimension work(ichunk,ichunk),tfock(ichunk,ichunk) logical dotask, next_chunk c c fill in the one-electron part of the fock matrix and c compute the one-electron energy contribution c me = ga_nodeid() nproc = ga_nnodes() c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) call nga_get(g_schwarz,lo,hi,work,ld) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 tfock(iloc,jloc) = 0.0d00 if (work(iloc,jloc)*schwmax.gt.tol2e) + tfock(iloc,jloc) = h(i,j) end do end do call nga_put(g_fock,lo,hi,tfock,ld) dotask = next_chunk(lo,hi) end do eone = 0.5d00*contract_matrices(g_fock,g_dens) c end #if 0 integer function nxtask(nproc) parameter (ichunk = 10) save icount, nleft data nleft, icount /0, 0/ c c wrapper round nxtval() to increase granularity c and thus reduce no. of requests to shared counter c if(nproc.gt.0) then if(nleft.eq.0) then #ifdef MSG_COMMS_MPI icount = nxtval_ga(nproc) * ichunk #else icount = nxtval(nproc) * ichunk #endif nleft = ichunk endif nxtask = icount icount = icount + 1 nleft = nleft -1 else nleft = 0 nxtask = 0 #ifdef MSG_COMMS_MPI junk = nxtval_ga(nproc) #else junk = nxtval(nproc) #endif endif c c following does dumb static load balancing c c$$$ if(nproc.gt.0) then c$$$ if (nleft .eq. 0) then c$$$ icount = ga_nodeid() c$$$ nleft = 1 c$$$ endif c$$$ nxtask = icount c$$$ icount = icount + ga_nnodes() c$$$ else c$$$ nleft = 0 c$$$ nxtask = 0 c$$$ endif end #endif c logical function next_chunk(lo,hi) #include "cscf.h" integer one parameter (one = 1) integer imax, lo(2), hi(2), ilo, jlo itask = nga_read_inc(g_counter,one,one) imax = nbfn/ichunk if (nbfn - ichunk*imax.gt.0) imax = imax + 1 if (itask.lt.imax*imax) then ilo = mod(itask,imax) jlo = (itask-ilo)/imax lo(1) = ilo*ichunk + 1 lo(2) = jlo*ichunk + 1 hi(1) = min((ilo+1)*ichunk,nbfn) hi(2) = min((jlo+1)*ichunk,nbfn) next_chunk = .true. else next_chunk = .false. endif return end c logical function next_4chunk(lo,hi,ilo,jlo,klo,llo) #include "cscf.h" integer one parameter (one = 1) integer*8 imax, itask, itmp !cste integer lo(4), hi(4), ilo, jlo, klo, llo !cste c itask = nga_read_inc(g_counter,one,one) imax = nbfn/ichunk if (nbfn - ichunk*imax.gt.0) imax = imax + 1 if (itask. lt. 0) then !cste write(6,*) 'next_4chunk: itask negative:',itask, !cste * ' imax:',imax,' nbfn:',nbfn,' ichunk:',ichunk!cste write(6,*) 'probable GA integer precision problem if ' !cste * ,'imax^4 > 2^31' !cste call flush(6) !cste stop 'next_4chunk' !cste end if !cste if (itask.lt.imax**4) then ilo = mod(itask,imax) itmp = (itask - ilo)/imax jlo = mod(itmp,imax) itmp = (itmp - jlo)/imax klo = mod(itmp,imax) llo = (itmp - klo)/imax lo(1) = ilo*ichunk + 1 lo(2) = jlo*ichunk + 1 lo(3) = klo*ichunk + 1 lo(4) = llo*ichunk + 1 hi(1) = min((ilo+1)*ichunk,nbfn) hi(2) = min((jlo+1)*ichunk,nbfn) hi(3) = min((klo+1)*ichunk,nbfn) hi(4) = min((llo+1)*ichunk,nbfn) next_4chunk = .true. else next_4chunk = .false. endif return end c subroutine clean_chunk(chunk) #include "cscf.h" double precision chunk(ichunk,ichunk) integer i,j do j = 1, ichunk do i = 1, ichunk chunk(i,j) = 0.0d00 end do end do return end c subroutine twoel(schwmax, etwo) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision f_ij(ichunk,ichunk),d_kl(ichunk,ichunk) double precision f_ik(ichunk,ichunk),d_jl(ichunk,ichunk) double precision s_ij(ichunk,ichunk),s_kl(ichunk,ichunk) double precision schwmax, one cste integer nproc !cste integer*8 ijkls, ijcnt,klcnt,ijklcnt !cste integer lo(4),hi(4),lo_ik(2),hi_ik(2),lo_jl(2),hi_jl(2) !cste integer i,j,k,l,iloc,jloc,kloc,lloc,ld,ich,it,jt,kt,lt !cste logical dotask, next_4chunk c c add in the two-electron contribution to the fock matrix c cste nproc = ga_nnodes() one = 1.0d00 ijcnt = icut1 !cste klcnt = icut2 !cste ijklcnt = icut3 !cste c call ga_zero(g_counter) ld = maxnbfn ich = ichunk dotask = next_4chunk(lo,hi,it,jt,kt,lt) itask = 0 cste ijkls = 0 !cste do while (dotask) cste ijkl=(hi(1)-lo(1)+1)*(hi(2)-lo(2)+1)* !cste cste * (hi(3)-lo(3)+1)*(hi(4)-lo(4)+1) !cste cste ijkls = ijkls + ijkl !cste cste write(6,*)itask,lo,hi,ijkl,ijkls !cste lo_ik(1) = lo(1) lo_ik(2) = lo(3) hi_ik(1) = hi(1) hi_ik(2) = hi(3) lo_jl(1) = lo(2) lo_jl(2) = lo(4) hi_jl(1) = hi(2) hi_jl(2) = hi(4) call nga_get(g_schwarz,lo,hi,s_ij,ich) call nga_get(g_schwarz,lo(3),hi(3),s_kl,ich) call nga_get(g_dens,lo(3),hi(3),d_kl,ich) call nga_get(g_dens,lo_jl,hi_jl,d_jl,ich) itask = itask + 1 call clean_chunk(f_ij) call clean_chunk(f_ik) do i = lo(1), hi(1) iloc = i-lo(1) + 1 do j = lo(2), hi(2) jloc = j-lo(2) + 1 if (s_ij(iloc,jloc)*schwmax .lt. tol2e) then icut1 = icut1 + (hi(3)-lo(3)+1)*(hi(4)-lo(4)+1) !cste else do k = lo(3), hi(3) kloc = k-lo(3) + 1 do l = lo(4), hi(4) lloc = l-lo(4) + 1 if (s_ij(iloc,jloc)*s_kl(kloc,lloc).lt.tol2e) then icut2 = icut2 + 1 else call g(gg, i, j, k, l) f_ij(iloc,jloc) = f_ij(iloc,jloc) + + gg*d_kl(kloc,lloc) f_ik(iloc,kloc) = f_ik(iloc,kloc) + - 0.5d00*gg*d_jl(jloc,lloc) icut3 = icut3 + 1 endif end do end do endif end do end do call nga_acc(g_fock,lo,hi,f_ij,ich,one) call nga_acc(g_fock,lo_ik,hi_ik,f_ik,ich,one) dotask = next_4chunk(lo,hi,it,jt,kt,lt) end do etwo = 0.5d00*contract_matrices(g_fock,g_dens) ijcnt = icut1 - ijcnt klcnt = icut2 - klcnt ijklcnt = icut3 - ijklcnt cste write(6,*) 'node ', ga_nodeid(), ijcnt, klcnt, ijklcnt !cste cste * ,icut1,icut2,icut3 !cste cste call flush(6) !cste icut4 = icut3 !cste if (icut3 .gt. 0) return !cste c c no integrals may be calculated if there is no work for c this node (ichunk too big), or, something is wrong c write(6,*) 'no two-electron integrals computed by node', !cste * ga_nodeid() !cste call flush(6) !cste return cste stop 'twoel computed no integrals' !cste end c subroutine damp(fac) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c c create damped density matrix as a linear combination of c old density matrix and density matrix formed from new orbitals c ofac = 1.0d0 - fac call ga_add(fac,g_dens,ofac,g_work,g_dens) return end c subroutine prnout(iter, energy, deltad, tester) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c c printout results of each iteration c if (ga_nodeid().ne.0) return write(6,1) iter, energy, deltad, tester call flush(6) 1 format(' iter=',i3,', energy=',f15.8,', deltad=',1pd9.2, $ ', deltaf=',d9.2) return end c double precision function dendif() implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision xdiff dimension dens_c(ichunk,ichunk),work_c(ichunk,ichunk) integer lo(2), hi(2), i, j, ld logical dotask, next_chunk c c compute largest change in density matrix elements c denmax = 0.0d0 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_dens,lo,hi,dens_c,ld) call nga_get(g_work,lo,hi,work_c,ld) do j = 1, hi(2)-lo(2)+1 do i = 1, hi(1)-lo(1)+1 xdiff = abs(dens_c(i,j)-work_c(i,j)) if (xdiff.gt.denmax) denmax = xdiff end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(1,denmax,1,'max') dendif = denmax return end c double precision function testfock() implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision xmax, xtmp dimension work(ichunk,ichunk) integer lo(2), hi(2), i, j, iloc, jloc, ld logical dotask, next_chunk c c compute largest change in density matrix elements c xmax = 0.0d0 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_fock,lo,hi,work,ld) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 if (i.ne.j) then xtmp = abs(work(iloc,jloc)) if (xtmp.gt.xmax) xmax = xtmp endif end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(1,xmax,1,'max') testfock = xmax return end c subroutine shiftfock(shift) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision shift dimension work(ichunk,ichunk) integer lo(2), hi(2), i, j, iloc, jloc, ld, icnt logical dotask, next_chunk c c compute largest change in density matrix elements c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_fock,lo,hi,work,ld) icnt = 0 do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 if (i.eq.j.and.i.gt.nocc) then work(iloc,jloc) = work(iloc,jloc) + shift icnt = icnt + 1 endif end do end do if (icnt.gt.0) call nga_put(g_fock,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do return end c subroutine prnfin(energy) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" dimension orbs(maxnbfn, maxnbfn) integer lo(2),hi(2),ld c c printout final results c if (ga_nodeid().ne.0) return write(6,1) energy 1 format(//' final energy = ',f18.11//' eigenvalues') call output(eigv, 1, min(nbfn,nocc+5), 1, 1, nbfn, 1, 1) c return end subroutine g(value,i,j,k,l) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c c compute the two electon integral (ij|kl) over normalized c primitive 1s gaussians c f0val = 0.0d0 rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 rcd2 = (x(k)-x(l))**2 + (y(k)-y(l))**2 + (z(k)-z(l))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) fackl = expnt(k)*expnt(l)/(expnt(k)+expnt(l)) exijkl = exprjh(- facij*rab2 - fackl*rcd2) denom = (expnt(i)+expnt(j))*(expnt(k)+expnt(l)) * $ sqrt(expnt(i)+expnt(j)+expnt(k)+expnt(l)) fac = (expnt(i)+expnt(j))*(expnt(k)+expnt(l)) / $ (expnt(i)+expnt(j)+expnt(k)+expnt(l)) c xp = (x(i)*expnt(i) + x(j)*expnt(j))/(expnt(i)+expnt(j)) yp = (y(i)*expnt(i) + y(j)*expnt(j))/(expnt(i)+expnt(j)) zp = (z(i)*expnt(i) + z(j)*expnt(j))/(expnt(i)+expnt(j)) xq = (x(k)*expnt(k) + x(l)*expnt(l))/(expnt(k)+expnt(l)) yq = (y(k)*expnt(k) + y(l)*expnt(l))/(expnt(k)+expnt(l)) zq = (z(k)*expnt(k) + z(l)*expnt(l))/(expnt(k)+expnt(l)) rpq2 = (xp-xq)**2 + (yp-yq)**2 + (zp-zq)**2 c call f0(f0val, fac*rpq2) value = (2.0d0 * pi**2.5d0 / denom) * exijkl * f0val * $ rnorm(i)*rnorm(j)*rnorm(k)*rnorm(l) return end c subroutine diagon(tester, iter) c subroutine diagon(fock, orbs, evals, work, tester, iter) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision r_zero, r_one, shift, tester c #if USE_TRANSFORM c c use similarity transform to solve standard eigenvalue problem c (overlap matrix has been transformed out of the problem) c r_one = 1.0d00 r_zero = 0.0d00 call ga_dgemm('n','n',nbfn,nbfn,nbfn,r_one,g_fock,g_orbs, + r_zero,g_tfock) call ga_dgemm('t','n',nbfn,nbfn,nbfn,r_one,g_orbs,g_tfock, + r_zero,g_fock) tester = testfock() shift = 0.0d00 if (tester.gt.0.3d0) then shift = 0.3d0 else if (nbfn .gt. 60) then shift = 0.1d0 else shift = 0.0d0 endif endif if (iter.ge.2.and.shift.ne.0.0d00) then call shiftfock(shift) endif call ga_copy(g_orbs,g_tfock) call ga_diag_std_seq(g_fock, g_work, eigv) c c Back transform eigenvectors c call ga_dgemm('n','n',nbfn,nbfn,nbfn,r_one,g_tfock,g_work, + r_zero,g_orbs) if (iter.ge.2.and.shift.ne.0.0d00) then do 50 i = nocc+1, nbfn eigv(i) = eigv(i) - shift 50 continue endif #else c c Keep remaking overlap matrix since ga_diag_seq does not c guarantee that g_ident is preserved. c call makoverlap call ga_diag_seq(g_fock, g_ident, g_orbs, eigv) tester = 0.0d00 #endif return end c subroutine makeob implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" double precision work(ichunk,ichunk),orbs(ichunk,ichunk) double precision eval(maxnbfn) integer lo(2),hi(2),ld,me,i,j,iloc,jloc logical dotask, next_chunk c c generate set of orthonormal vectors by creating a random c symmetric matrix and solving associated generalized eigenvalue c problem using the correct overlap matrix. c me = ga_nodeid() call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 work(iloc,jloc) = s(i,j) orbs(iloc,jloc) = drand(0) end do end do call nga_put(g_ident,lo,hi,work,ld) call nga_put(g_fock,lo,hi,orbs,ld) dotask = next_chunk(lo,hi) end do call ga_symmetrize(g_fock) call ga_diag_seq(g_fock, g_ident, g_orbs, eval) c return end c subroutine denges implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c c Form guess density from superposition of atomic densities in the AO c basis set ... instead of doing the atomic SCF hardwire for this c small basis set for the Be atom. c integer one, itask, lo(2), hi(2), ld dimension atdens(15,15) data atdens/ $ 0.000002,0.000027,0.000129,0.000428,0.000950,0.001180, $ 0.000457,-0.000270,-0.000271,0.000004,0.000004,0.000004, $ 0.000004,0.000004,0.000004,0.000027,0.000102,0.000987, $ 0.003269,0.007254,0.009007,0.003492,-0.002099,-0.002108, $ 0.000035,0.000035,0.000035,0.000035,0.000035,0.000035, $ 0.000129,0.000987,0.002381,0.015766,0.034988,0.043433, $ 0.016835,-0.010038,-0.010082,0.000166,0.000166,0.000166, $ 0.000166,0.000166,0.000166,0.000428,0.003269,0.015766, $ 0.026100,0.115858,0.144064,0.055967,-0.035878,-0.035990, $ 0.000584,0.000584,0.000584,0.000584,0.000584,0.000584, $ 0.000950,0.007254,0.034988,0.115858,0.128586,0.320120, $ 0.124539,-0.083334,-0.083536,0.001346,0.001346,0.001346, $ 0.001346,0.001346,0.001346,0.001180,0.009007,0.043433, $ 0.144064,0.320120,0.201952,0.159935,-0.162762,-0.162267, $ 0.002471,0.002471,0.002471,0.002471,0.002471,0.002471, $ 0.000457,0.003492,0.016835,0.055967,0.124539,0.159935, $ 0.032378,-0.093780,-0.093202,0.001372,0.001372,0.001372, $ 0.001372,0.001372,0.001372,-0.000270,-0.002099,-0.010038, $ -0.035878,-0.083334,-0.162762,-0.093780,0.334488,0.660918, $ -0.009090,-0.009090,-0.009090,-0.009090,-0.009090,-0.009090, $ -0.000271,-0.002108,-0.010082,-0.035990,-0.083536,-0.162267, $ -0.093202,0.660918,0.326482,-0.008982,-0.008982,-0.008981, $ -0.008981,-0.008981,-0.008982,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008982, $ 0.000062,0.000124,0.000124,0.000124,0.000124,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008982,0.000124,0.000062,0.000124, $ 0.000124,0.000124,0.000124,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, $ 0.000124,0.000124,0.000062,0.000124,0.000124,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008981,0.000124,0.000124,0.000124, $ 0.000062,0.000124,0.000124,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, $ 0.000124,0.000124,0.000124,0.000124,0.000062,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008982,0.000124,0.000124,0.000124, $ 0.000124,0.000124,0.000062/ c c Create initial guess for density matrix in global array c call ga_zero(g_dens) call ga_zero(g_counter) one = 1 ld = 15 c c Correct for a factor of two along the diagonal c do i = 1, ld atdens(i,i) = 2.0d00*atdens(i,i) end do itask = nga_read_inc(g_counter,one,one) do while(itask.lt.natom) ioff = itask*15 lo(1) = ioff+1 lo(2) = ioff+1 hi(1) = ioff+15 hi(2) = ioff+15 call nga_put(g_dens,lo,hi,atdens,ld) itask = nga_read_inc(g_counter,one,one) end do call ga_sync return end c subroutine setarrays implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer one, two, dims(2) logical status one = 1 two = 2 g_counter = ga_create_handle() call ga_set_data(g_counter,one,one,MT_INT) status = ga_allocate(g_counter) call ga_zero(g_counter) dims(1) = nbfn dims(2) = nbfn g_dens = ga_create_handle() call ga_set_data(g_dens, two, dims, MT_DBL) status = ga_allocate(g_dens) call ga_zero(g_dens) g_schwarz = ga_create_handle() call ga_set_data(g_schwarz, two, dims, MT_DBL) status = ga_allocate(g_schwarz) call ga_zero(g_schwarz) g_fock = ga_create_handle() call ga_set_data(g_fock, two, dims, MT_DBL) status = ga_allocate(g_fock) call ga_zero(g_fock) g_tfock = ga_create_handle() call ga_set_data(g_tfock, two, dims, MT_DBL) status = ga_allocate(g_tfock) call ga_zero(g_tfock) g_work = ga_create_handle() call ga_set_data(g_work, two, dims, MT_DBL) status = ga_allocate(g_work) call ga_zero(g_work) g_ident = ga_create_handle() call ga_set_data(g_ident, two, dims, MT_DBL) status = ga_allocate(g_ident) call ga_zero(g_ident) g_orbs = ga_create_handle() call ga_set_data(g_orbs, two, dims, MT_DBL) status = ga_allocate(g_orbs) call ga_zero(g_orbs) return end subroutine closearrays implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" logical status c status = ga_destroy(g_counter) status = ga_destroy(g_dens) status = ga_destroy(g_schwarz) status = ga_destroy(g_fock) status = ga_destroy(g_tfock) status = ga_destroy(g_work) status = ga_destroy(g_ident) status = ga_destroy(g_orbs) c return end c subroutine makoverlap implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer me, lo(2), hi(2), ptr, ld(2) integer ld1, ld2 me = ga_nodeid() call nga_distribution(g_ident, me, lo, hi) call nga_access(g_ident, lo, hi, ptr, ld) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call setoverlap(dbl_mb(ptr),lo,hi,ld1,ld2) call nga_release(g_ident) return end c subroutine setoverlap(a,lo,hi,ld1,ld2) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer lo(2), hi(2) integer ld1, ld2, ii, jj double precision a(ld1,ld2) do i = 1, ld1 ii = i + lo(1) - 1 do j = 1, ld2 jj = j + lo(2) - 1 #if USE_TRANSFORM if (ii.eq.jj) then a(i,j) = 1.0d00 else a(i,j) = 0.0d00 endif #else a(i,j) = s(ii,jj) #endif end do end do return end c subroutine print_ga_block(g_a) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer lo(2), hi(2), ptr, ld1, ld2 c me = ga_nodeid() call nga_distribution(g_a, me, lo, hi) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call nga_access(g_a, lo, hi, ptr, ld) call dump_chunk(dbl_mb(ptr),ld1,ld2) call nga_release(g_a) c return end c subroutine print_ga_block_ij(g_a,tlo) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer lo(2), hi(2), ptr, ld1, ld2 c me = ga_nodeid() call nga_distribution(g_a, me, lo, hi) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call nga_access(g_a, tlo, hi, ptr, ld) call dump_chunk(dbl_mb(ptr),ld1,ld2) call nga_release(g_a) c return end c subroutine dump_chunk(a,ld1,ld2) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer ld1, ld2 double precision a(ld1, ld2) do i = 1, min(10,ld1) write(6,100) (a(i,j), j = 1, min(10,ld2)) end do write(6,*) trace = 0.0d0 do i=1,ld2 trace = trace +a(i,i) end do write(6,*) 'trace=',trace 100 format(10f10.4) return end c double precision function contract_matrices(g_a,g_b) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer lo(2), hi(2), ptr_a, ptr_b, ld, ld1, ld2 double precision a(ichunk,ichunk),b(ichunk,ichunk) double precision value logical dotask, next_chunk c c evalute sum_ij a_ij*b_ij c value = 0.0d00 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) call nga_get(g_a,lo,hi,a,ld) call nga_get(g_b,lo,hi,b,ld) do j = 1, hi(2)-lo(2)+1 do i = 1, hi(1)-lo(1)+1 value = value + a(i,j)*b(i,j) end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(3,value,1,'+') contract_matrices=value c return end ga-5-4/global/examples/scf/integ.F0000644000175000017500000000571612662210461015107 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif double precision function exprjh(x) C$Id: integ.F,v 1.1 2005-03-08 23:58:03 d3g293 Exp $ double precision x c c dumb solution to underflow problems on sun c if (x.lt.-37.0d0) then exprjh = 0.0d0 else exprjh = exp(x) endif end subroutine setfm implicit double precision (a-h,o-z) common/values/fm(2001,5),rdelta,delta,delo2 dimension t(2001),et(2001) c c initalize common block for computation of f0 by recursion down c from f200 c delta=28.0d0/2000.0d0 delo2=delta*0.5d0 rdelta=1.0d0/delta maxm=4 do 10 i=1,2001 tt=delta*dble(i-1) et(i)=exprjh(-tt) t(i)=2.0d0*tt fm(i,maxm+1)=0.0d0 10 continue do 20 i=200,maxm,-1 rr=1.0d0/dble(2*i+1) do 30 ii=1,2001 fm(ii,maxm+1)=(et(ii)+t(ii)*fm(ii,maxm+1))*rr 30 continue 20 continue do 40 i=maxm,1,-1 rr=1.0d0/dble(2*i-1) do 50 ii=1,2001 fm(ii,i)=(et(ii)+t(ii)*fm(ii,i+1))*rr 50 continue 40 continue c end subroutine f0(value, t) implicit real*8 (a-h,o-z) common/values/fm(2001,5),rdelta,delta,delo2 parameter(fac0=0.88622692545276d0, $ rhalf=0.5d0,rthird=0.3333333333333333d0,rquart=0.25d0) data t0/28.d0/ c c computes f0 to a relative accuracy of better than 4.e-13 for all t. c uses 4th order taylor expansion on grid out to t=28.0 c asymptotic expansion accurate for t greater than 28 c if(t.ge.t0) then value = fac0 / sqrt(t) else n = idint((t+delo2)*rdelta) x = delta*dble(n)-t n = n+1 value = fm(n,1)+x*(fm(n,2)+rhalf*x*(fm(n,3)+ $ rthird*x*(fm(n,4)+rquart*x*fm(n,5)))) endif c end subroutine addin(g, i, j, k, l, fock, dens, iky) implicit double precision (a-h, o-z) dimension fock(*), dens(*), iky(*) c c add (ij|kl) into the fock matrix c gg = g g2 = gg+gg g4 = g2+g2 ik = iky(i) + k il = iky(i) + l ij = iky(i) + j jk = iky(max(j,k)) + min(j,k) jl = iky(max(j,l)) + min(j,l) kl = iky(k) + l aij = g4*dens(kl)+fock(ij) fock(kl) = g4*dens(ij)+fock(kl) fock(ij) = aij gil=gg if(i.eq.k.or.j.eq.l) gg = g2 if(j.eq.k) gil = g2 ajk = fock(jk) - gil*dens(il) ail = fock(il) - gil*dens(jk) aik = fock(ik) - gg*dens(jl) fock(jl) = fock(jl) - gg*dens(ik) fock(jk) = ajk fock(il) = ail fock(ik) = aik c end subroutine dfill(n,val,a,ia) implicit real*8 (a-h,o-z) dimension a(*) c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/global/examples/scf/input.F0000644000175000017500000000517212662210461015134 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine input #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" c....................................................................... c Input configuration from an XYZ format file call be.inpt and set up c initial data structures. Atomic numbers from XYZ file are ignored and c an atomic number of 4 (Beryllium) is used instead. c....................................................................... c c initialize variables c natom = 0 do i = 1, maxatom ax(i) = 0.0d00 ay(i) = 0.0d00 az(i) = 0.0d00 end do c if (ga_nodeid().eq.0) then open(2,file='be.inpt',status='old') read(2,*) natom read(2,*) c c Read in coordinates c do i = 1, natom read(2,*) j,ax(i),ay(i),az(i) end do close(2) endif call ga_igop(1,natom,1,'+') call ga_dgop(2,ax,natom,'+') call ga_dgop(3,ay,natom,'+') call ga_dgop(4,az,natom,'+') c c Set up s-function centers and nuclear charges c ifcnt = 1 do i = 1, natom q(i) = 4.0d00 c expnt(ifcnt) = 1741.0d00 expnt(ifcnt+1) = 262.1d00 expnt(ifcnt+2) = 60.33d00 expnt(ifcnt+3) = 17.62d00 expnt(ifcnt+4) = 5.933d00 expnt(ifcnt+5) = 2.185d00 expnt(ifcnt+6) = 0.859d00 expnt(ifcnt+7) = 0.1806d00 expnt(ifcnt+8) = 0.05835d00 expnt(ifcnt+9) = 0.3d00 expnt(ifcnt+10) = 0.3d00 expnt(ifcnt+11) = 0.3d00 expnt(ifcnt+12) = 0.3d00 expnt(ifcnt+13) = 0.3d00 expnt(ifcnt+14) = 0.3d00 c do j = 1, 15 x(ifcnt) = ax(i) y(ifcnt) = ay(i) z(ifcnt) = az(i) if (j.eq.10) then x(ifcnt) = x(ifcnt) + 1.6d00 endif if (j.eq.11) then x(ifcnt) = x(ifcnt) - 1.6d00 endif if (j.eq.12) then y(ifcnt) = y(ifcnt) + 1.6d00 endif if (j.eq.13) then y(ifcnt) = y(ifcnt) - 1.6d00 endif if (j.eq.14) then z(ifcnt) = z(ifcnt) + 1.6d00 endif if (j.eq.15) then z(ifcnt) = z(ifcnt) - 1.6d00 endif ifcnt = ifcnt + 1 end do end do c c evaluate repulsion energy c enrep = 0.0d00 do i = 1, natom do j = i+1, natom r = sqrt((ax(i)-ax(j))**2 + (ay(i)-ay(j))**2 + + (az(i)-az(j))**2) enrep = enrep + q(i)*q(j)/r end do end do nocc = 2*natom nbfn = 15*natom nnbfn = nbfn*(nbfn+1)/2 return end ga-5-4/global/examples/scf/timer.F0000644000175000017500000000117312662210461015112 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif double precision function timer() c c return the time since the last call to timer. c c must be initialized by calling once and throwing away the c value c ... use cpu time on multi-user machines c ... use elapsed time on dedicated or single user machines. c *mdc*if unix * real*4 dtime, tt(2) * timer = dble(dtime(tt)) *mdc*elseif tcgmsg C$Id: timer.F,v 1.1 2005-03-08 23:58:03 d3g293 Exp $ #include "mp3def.fh" save mlast data mlast/0/ m = MP_TIMER() timer = dble(m - mlast) * 0.01d0 mlast = m *mdc*endif c end ga-5-4/global/examples/scf/ft-scf.F0000644000175000017500000010117712662210461015161 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program scf C$Id: ft-scf.F,v 1.1 2005-07-07 17:41:07 vinod Exp $ implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" #define USE_TRANSFORM 1 integer heap, stack data tinit, tonel, ttwoel, tdiag, tdens, tprint /6*0.0d0/ data eone, etwo, energy, deltad /4*0.0d0/ c c initalize the parallel message passing environment c #ifdef MSG_COMMS_MPI integer ierr call mpi_init(ierr) #else call pbeginf #endif call ga_set_spare_procs(2); call ga_initialize() c c Allocate memory c heap = 2000000 stack = 2000000 if (.not.ma_init(MT_DBL, stack, heap)) + call ga_error("ma_init failed",-1) me = ga_nodeid() nproc = ga_nnodes() c c initialize a bunch of stuff and initial density matrix c rjunk = timer() c c get input from file be.inpt c call input c c create and allocate global arrays c call setarrays write(6,*) 'done with setarrays' call ininrm write(6,*) '1-done with setarrays' c c create initial guess for density matrix by using single atom c densities c call denges tinit = timer() #if USE_TRANSFORM c c make initial orthogonal orbital set for solution method using c similarity transform c call makeob #endif c c make info for sparsity test c call makesz(schwmax) c c iterate call iterate(10) c call ga_igop(6, icut1, 1, '+') call ga_igop(7, icut2, 1, '+') call ga_igop(8, icut3, 1, '+') if (me.eq.0) then c c print out timing information c call prnfin(energy) write(6,1) tinit, tonel, ttwoel, tdiag, tdens, tprint, $ nproc 1 format(/' init onel twoel diag dens print ncpu'/ $ ' ------ ------ ------ ------ ------ ------ ------'/ $ 1x, 6f7.2, i7/) c c print out information on # integrals evaulated each iteration c nints = nnbfn*(nnbfn+1)/2 nints = nbfn**4 frac = dble(icut3)/dble(nints) write(6,2) icut1, icut2, icut3, nints, frac 2 format(/' No. of integrals screened or computed ' $ /' -------------------------------------'/ $ /1x,' #ij test #kl test #compute #total', $ ' fraction', $ /1x,' --------- --------- --------- ---------', $ ' --------', $ /1x,4(2x,i9),f9.3) call stats endif c call closearrays call ga_terminate #ifdef MSG_COMMS_MPI call mpi_finalize #else call pend #endif c end c subroutine iterate(niter) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" do 10 iter = 1, niter #ifdef CHECKPOINT_SCF call ga_checkpoint_arrays(arraylist,numarrays) #endif c c make the one particle contribution to the fock matrix c and get the partial contribution to the energy c call oneel(schwmax, eone) tonel = tonel + timer() c c compute the two particle contributions to the fock matrix and c get the total energy. c call twoel(schwmax, etwo) ttwoel = ttwoel + timer() c c Diagonalize the fock matrix. The diagonalizers used in this c subroutine are actually sequential, not parallel. c call diagon(tester,iter) tdiag = tdiag + timer() c c make the new density matrix in g_work from orbitals in g_orbs, c compute the norm of the change in the density matrix and c then update the density matrix in g_dens with damping. c call makden deltad = dendif() if (iter.eq.1) then scale = 0.0d0 else if (iter .le. 5) then if (nbfn .gt. 60) then scale = 0.5d0 else scale = 0.0d0 endif else scale = 0.0d0 endif call damp(scale) tdens = tdens + timer() c c add up energy and print out convergence information c if (me.eq.0) then energy = enrep + eone + etwo call prnout(iter, energy, deltad, tester) tprint = tprint + timer() endif c c if converged then exit iteration loop c if (deltad .lt. tol) goto 20 10 continue if(me.eq.0) $ write(6,*) ' SCF failed to converge in ', niter, ' iters' c c finished ... print out eigenvalues and occupied orbitals c 20 continue end subroutine makesz(schwmax) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" dimension work(ichunk,ichunk) integer lo(2),hi(2),i,j,iloc,jloc,ld logical dotask c c schwarz(ij) = (ij|ij) for sparsity test c icut1 = 0 icut2 = 0 icut3 = 0 c call ga_zero(g_schwarz) call ga_zero(g_counter) schwmax = 0.0d0 dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) do i = lo(1), hi(1) iloc = i - lo(1) + 1 do j = lo(2), hi(2) jloc = j - lo(2) + 1 call g(gg,i,j,i,j) work(iloc,jloc) = sqrt(gg) schwmax = max(schwmax, work(iloc,jloc)) end do end do call nga_put(g_schwarz,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do call ga_dgop(11,schwmax,1,'max') c return end c subroutine ininrm implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c write a little welcome message c if (ga_nodeid().eq.0) write(6,1) natom, nocc, nbfn, tol 1 format(/' Example Direct Self Consistent Field Program '/ $ ' -------------------------------------------- '// $ ' no. of atoms ............... ',i3/ $ ' no. of occupied orbitals ... ',i3/ $ ' no. of basis functions ..... ',i3/ $ ' convergence threshold ...... ',d9.2//) c c generate normalisation coefficients for the basis functions c and the index array iky c do 10 i = 1, nbfn iky(i) = i*(i-1)/2 10 continue c do 20 i = 1, nbfn rnorm(i) = (expnt(i)*2.0d0/pi)**0.75d0 20 continue c c initialize common for computing f0 c call setfm c end double precision function h(i,j) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" cvd$r novector cvd$r noconcur c c generate the one particle hamiltonian matrix element c over the normalized primitive 1s functions i and j c f0val = 0.0d0 sum = 0.0d0 rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) expij = exprjh(-facij*rab2) repij = (2.0d0*pi/(expnt(i)+expnt(j))) * expij c c first do the nuclear attraction integrals c do 10 iat = 1, natom xp = (x(i)*expnt(i) + x(j)*expnt(j))/(expnt(i)+expnt(j)) yp = (y(i)*expnt(i) + y(j)*expnt(j))/(expnt(i)+expnt(j)) zp = (z(i)*expnt(i) + z(j)*expnt(j))/(expnt(i)+expnt(j)) rpc2 = (xp-ax(iat))**2 + (yp-ay(iat))**2 + (zp-az(iat))**2 c call f0(f0val, (expnt(i)+expnt(j))*rpc2) sum = sum - repij * q(iat) * f0val 10 continue c c add on the kinetic energy term c sum = sum + facij*(3.0d0-2.0d0*facij*rab2) * $ (pi/(expnt(i)+expnt(j)))**1.5d0 * expij c c finally multiply by the normalization constants c h = sum * rnorm(i) * rnorm(j) c end double precision function s(i,j) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c generate the overlap matrix element between the normalized c primitve gaussian 1s functions i and j c rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) s = (pi/(expnt(i)+expnt(j)))**1.5d0 * exprjh(-facij*rab2) * $ rnorm(i)*rnorm(j) c end subroutine makden implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c dimension work(maxnbfn,maxnbfn), torbs(maxnbfn,maxnbfn) dimension work(ichunk,ichunk), orbsi(ichunk,maxnbfn) dimension orbsj(ichunk,maxnbfn) integer lo(2), hi(2), tlo(2), thi(2), i, j, iloc, jloc, ld logical dotask c c generate density matrix from orbitals in g_orbs. the first c nocc orbitals are doubly occupied. c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) tlo(1) = lo(1) thi(1) = hi(1) tlo(2) = 1 thi(2) = nocc call nga_get(g_orbs,tlo,thi,orbsi,ld) tlo(1) = lo(2) thi(1) = hi(2) call nga_get(g_orbs,tlo,thi,orbsj,ld) do i = lo(1), hi(1) iloc = i - lo(1) + 1 do j = lo(2), hi(2) jloc = j - lo(2) + 1 p = 0.0d00 do k = 1, nocc p = p + orbsi(iloc,k)*orbsj(jloc,k) end do work(iloc,jloc) = 2.0d00*p end do end do call nga_put(g_work,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do return end c subroutine oneel(schwmax, eone) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer lo(2), hi(2), i, j, iloc, jloc, ld dimension dens(nnbfn), fock(nnbfn), schwarz(nnbfn) dimension work(ichunk,ichunk),tfock(ichunk,ichunk) logical dotask c c fill in the one-electron part of the fock matrix and c compute the one-electron energy contribution c me = ga_nodeid() nproc = ga_nnodes() c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) call nga_get(g_schwarz,lo,hi,work,ld) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 tfock(iloc,jloc) = 0.0d00 if (work(iloc,jloc)*schwmax.gt.tol2e) + tfock(iloc,jloc) = h(i,j) end do end do call nga_put(g_fock,lo,hi,tfock,ld) dotask = next_chunk(lo,hi) end do eone = 0.5d00*contract_matrices(g_fock,g_dens) c end integer function nxtask(nproc) parameter (ichunk = 10) save icount, nleft data nleft, icount /0, 0/ c c wrapper round nxtval() to increase granularity c and thus reduce no. of requests to shared counter c if(nproc.gt.0) then if(nleft.eq.0) then icount = nxtval(nproc) * ichunk nleft = ichunk endif nxtask = icount icount = icount + 1 nleft = nleft -1 else nleft = 0 nxtask = 0 junk = nxtval(nproc) endif c c following does dumb static load balancing c c$$$ if(nproc.gt.0) then c$$$ if (nleft .eq. 0) then c$$$ icount = ga_nodeid() c$$$ nleft = 1 c$$$ endif c$$$ nxtask = icount c$$$ icount = icount + ga_nnodes() c$$$ else c$$$ nleft = 0 c$$$ nxtask = 0 c$$$ endif end c logical function next_chunk(lo,hi) #include "cscf.h" integer one parameter (one = 1) integer imax, lo(2), hi(2), ilo, jlo itask = nga_read_inc(g_counter,one,one) imax = nbfn/ichunk if (itask.lt.imax*imax) then if (nbfn - ichunk*imax.gt.0) imax = imax + 1 ilo = mod(itask,imax) jlo = (itask-ilo)/imax lo(1) = ilo*ichunk + 1 lo(2) = jlo*ichunk + 1 hi(1) = min((ilo+1)*ichunk,nbfn) hi(2) = min((jlo+1)*ichunk,nbfn) next_chunk = .true. else next_chunk = .false. endif return end c logical function next_4chunk(lo,hi,ilo,jlo,klo,llo) #include "cscf.h" integer one parameter (one = 1) integer imax, lo(4), hi(4), ilo, jlo, klo, llo, itmp itask = nga_read_inc(g_counter,one,one) imax = nbfn/ichunk if (nbfn - ichunk*imax.gt.0) imax = imax + 1 if (itask.lt.imax**4) then ilo = mod(itask,imax) itmp = (itask - ilo)/imax jlo = mod(itmp,imax) itmp = (itmp - jlo)/imax klo = mod(itmp,imax) llo = (itmp - klo)/imax lo(1) = ilo*ichunk + 1 lo(2) = jlo*ichunk + 1 lo(3) = klo*ichunk + 1 lo(4) = llo*ichunk + 1 hi(1) = min((ilo+1)*ichunk,nbfn) hi(2) = min((jlo+1)*ichunk,nbfn) hi(3) = min((klo+1)*ichunk,nbfn) hi(4) = min((llo+1)*ichunk,nbfn) next_4chunk = .true. else next_4chunk = .false. endif return end c subroutine clean_chunk(chunk) #include "cscf.h" double precision chunk(ichunk,ichunk) integer i,j do j = 1, ichunk do i = 1, ichunk chunk(i,j) = 0.0d00 end do end do return end c subroutine twoel(schwmax, etwo) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision f_ij(ichunk,ichunk),d_kl(ichunk,ichunk) double precision f_ik(ichunk,ichunk),d_jl(ichunk,ichunk) double precision s_ij(ichunk,ichunk),s_kl(ichunk,ichunk) double precision schwmax, one integer nproc,lo(4),hi(4),ld,ich integer lo_ik(2),hi_ik(2),lo_jl(2),hi_jl(2) integer i,j,k,l,iloc,jloc,kloc,lloc,it,jt,kt,lt logical dotask, next_4chunk c c add in the two-electron contribution to the fock matrix c nproc = ga_nnodes() one = 1.0d00 c call ga_zero(g_counter) ld = maxnbfn ich = ichunk dotask = next_4chunk(lo,hi,it,jt,kt,lt) itask = 0 do while (dotask) lo_ik(1) = lo(1) lo_ik(2) = lo(3) hi_ik(1) = hi(1) hi_ik(2) = hi(3) lo_jl(1) = lo(2) lo_jl(2) = lo(4) hi_jl(1) = hi(2) hi_jl(2) = hi(4) call nga_get(g_schwarz,lo,hi,s_ij,ich) call nga_get(g_schwarz,lo(3),hi(3),s_kl,ich) call nga_get(g_dens,lo(3),hi(3),d_kl,ich) call nga_get(g_dens,lo_jl,hi_jl,d_jl,ich) itask = itask + 1 call clean_chunk(f_ij) call clean_chunk(f_ik) do i = lo(1), hi(1) iloc = i-lo(1) + 1 do j = lo(2), hi(2) jloc = j-lo(2) + 1 if (s_ij(iloc,jloc)*schwmax .lt. tol2e) then icut1 = icut1 + (hi(1)-lo(1)+1)*(hi(2)-lo(2)+1) else do k = lo(3), hi(3) kloc = k-lo(3) + 1 do l = lo(4), hi(4) lloc = l-lo(4) + 1 if (s_ij(iloc,jloc)*s_kl(kloc,lloc).lt.tol2e) then icut2 = icut2 + 1 else call g(gg, i, j, k, l) f_ij(iloc,jloc) = f_ij(iloc,jloc) + + gg*d_kl(kloc,lloc) f_ik(iloc,kloc) = f_ik(iloc,kloc) + - 0.5d00*gg*d_jl(jloc,lloc) icut3 = icut3 + 1 endif end do end do endif end do end do call nga_acc(g_fock,lo,hi,f_ij,ich,one) call nga_acc(g_fock,lo_ik,hi_ik,f_ik,ich,one) dotask = next_4chunk(lo,hi,it,jt,kt,lt) end do etwo = 0.5d00*contract_matrices(g_fock,g_dens) return end c subroutine damp(fac) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c create damped density matrix as a linear combination of c old density matrix and density matrix formed from new orbitals c ofac = 1.0d0 - fac call ga_add(fac,g_dens,ofac,g_work,g_dens) return end c subroutine prnout(iter, energy, deltad, tester) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c printout results of each iteration c if (ga_nodeid().ne.0) return write(6,1) iter, energy, deltad, tester call flush(6) 1 format(' iter=',i3,', energy=',f13.8,', deltad=',d9.2, $ ', deltaf=',d9.2) return end c double precision function dendif() implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision xdiff dimension dens_c(ichunk,ichunk),work_c(ichunk,ichunk) integer lo(2), hi(2), i, j, ld logical dotask c c compute largest change in density matrix elements c denmax = 0.0d0 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_dens,lo,hi,dens_c,ld) call nga_get(g_work,lo,hi,work_c,ld) do j = 1, hi(2)-lo(2)+1 do i = 1, hi(1)-lo(1)+1 xdiff = abs(dens_c(i,j)-work_c(i,j)) if (xdiff.gt.denmax) denmax = xdiff end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(1,denmax,1,'max') dendif = denmax return end c double precision function testfock() implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision xmax, xtmp dimension work(ichunk,ichunk) integer lo(2), hi(2), i, j, iloc, jloc, ld logical dotask c c compute largest change in density matrix elements c xmax = 0.0d0 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_fock,lo,hi,work,ld) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 if (i.ne.j) then xtmp = abs(work(iloc,jloc)) if (xtmp.gt.xmax) xmax = xtmp endif end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(1,xmax,1,'max') testfock = xmax return end c subroutine shiftfock(shift) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision shift dimension work(ichunk,ichunk) integer lo(2), hi(2), i, j, iloc, jloc, ld, icnt logical dotask c c compute largest change in density matrix elements c call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while(dotask) call nga_get(g_fock,lo,hi,work,ld) icnt = 0 do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 if (i.eq.j.and.i.gt.nocc) then work(iloc,jloc) = work(iloc,jloc) + shift icnt = icnt + 1 endif end do end do if (icnt.gt.0) call nga_put(g_fock,lo,hi,work,ld) dotask = next_chunk(lo,hi) end do return end c subroutine prnfin(energy) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" dimension orbs(maxnbfn, maxnbfn) integer lo(2),hi(2),ld c c printout final results c if (ga_nodeid().ne.0) return write(6,1) energy 1 format(//' final energy = ',f16.11//' eigenvalues') call output(eigv, 1, min(nbfn,nocc+5), 1, 1, nbfn, 1, 1) write(6,2) 2 format(//' eigenvectors ') lo(1) = 1 lo(2) = 1 hi(1) = nbfn hi(2) = nbfn ld = nbfn call nga_get(g_orbs,lo,hi,orbs,ld) call output(orbs, 1, nbfn, 1, nocc, nbfn, nbfn, 1) c return end subroutine g(value,i,j,k,l) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c compute the two electon integral (ij|kl) over normalized c primitive 1s gaussians c f0val = 0.0d0 rab2 = (x(i)-x(j))**2 + (y(i)-y(j))**2 + (z(i)-z(j))**2 rcd2 = (x(k)-x(l))**2 + (y(k)-y(l))**2 + (z(k)-z(l))**2 facij = expnt(i)*expnt(j)/(expnt(i)+expnt(j)) fackl = expnt(k)*expnt(l)/(expnt(k)+expnt(l)) exijkl = exprjh(- facij*rab2 - fackl*rcd2) denom = (expnt(i)+expnt(j))*(expnt(k)+expnt(l)) * $ sqrt(expnt(i)+expnt(j)+expnt(k)+expnt(l)) fac = (expnt(i)+expnt(j))*(expnt(k)+expnt(l)) / $ (expnt(i)+expnt(j)+expnt(k)+expnt(l)) c xp = (x(i)*expnt(i) + x(j)*expnt(j))/(expnt(i)+expnt(j)) yp = (y(i)*expnt(i) + y(j)*expnt(j))/(expnt(i)+expnt(j)) zp = (z(i)*expnt(i) + z(j)*expnt(j))/(expnt(i)+expnt(j)) xq = (x(k)*expnt(k) + x(l)*expnt(l))/(expnt(k)+expnt(l)) yq = (y(k)*expnt(k) + y(l)*expnt(l))/(expnt(k)+expnt(l)) zq = (z(k)*expnt(k) + z(l)*expnt(l))/(expnt(k)+expnt(l)) rpq2 = (xp-xq)**2 + (yp-yq)**2 + (zp-zq)**2 c call f0(f0val, fac*rpq2) value = (2.0d0 * pi**2.5d0 / denom) * exijkl * f0val * $ rnorm(i)*rnorm(j)*rnorm(k)*rnorm(l) return end c subroutine diagon(tester, iter) c subroutine diagon(fock, orbs, evals, work, tester, iter) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision r_zero, r_one, shift, tester c #if USE_TRANSFORM c c use similarity transform to solve standard eigenvalue problem c (overlap matrix has been transformed out of the problem) c r_one = 1.0d00 r_zero = 0.0d00 call ga_dgemm('n','n',nbfn,nbfn,nbfn,r_one,g_fock,g_orbs, + r_zero,g_tfock) call ga_dgemm('t','n',nbfn,nbfn,nbfn,r_one,g_orbs,g_tfock, + r_zero,g_fock) tester = testfock() shift = 0.0d00 if (tester.gt.0.3d0) then shift = 0.3d0 endif if (iter.ge.2.and.shift.ne.0.0d00) then call shiftfock(shift) endif call ga_copy(g_orbs,g_tfock) call ga_diag_std_seq(g_fock, g_work, eigv) c c Back transform eigenvectors c call ga_dgemm('n','n',nbfn,nbfn,nbfn,r_one,g_tfock,g_work, + r_zero,g_orbs) if (iter.ge.2.and.shift.ne.0.0d00) then do 50 i = nocc+1, nbfn eigv(i) = eigv(i) - shift 50 continue endif #else c c Keep remaking overlap matrix since ga_diag_seq does not c guarantee that g_ident is preserved. c call makoverlap call ga_diag_seq(g_fock, g_ident, g_orbs, eigv) tester = 0.0d00 #endif return end c subroutine makeob implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" double precision work(ichunk,ichunk),orbs(ichunk,ichunk) double precision eval(maxnbfn) integer lo(2),hi(2),ld,me,i,j,iloc,jloc logical dotask c c generate set of orthonormal vectors by creating a random c symmetric matrix and solving associated generalized eigenvalue c problem using the correct overlap matrix. c me = ga_nodeid() call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) do j = lo(2), hi(2) jloc = j - lo(2) + 1 do i = lo(1), hi(1) iloc = i - lo(1) + 1 work(iloc,jloc) = s(i,j) orbs(iloc,jloc) = drand48(0) end do end do call nga_put(g_ident,lo,hi,work,ld) call nga_put(g_fock,lo,hi,orbs,ld) dotask = next_chunk(lo,hi) end do call ga_symmetrize(g_fock) call ga_diag_seq(g_fock, g_ident, g_orbs, eval) c return end c subroutine denges implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" c c Form guess density from superposition of atomic densities in the AO c basis set ... instead of doing the atomic SCF hardwire for this c small basis set for the Be atom. c integer one, itask, lo(2), hi(2), ld dimension atdens(15,15) data atdens/ $ 0.000002,0.000027,0.000129,0.000428,0.000950,0.001180, $ 0.000457,-0.000270,-0.000271,0.000004,0.000004,0.000004, $ 0.000004,0.000004,0.000004,0.000027,0.000102,0.000987, $ 0.003269,0.007254,0.009007,0.003492,-0.002099,-0.002108, $ 0.000035,0.000035,0.000035,0.000035,0.000035,0.000035, $ 0.000129,0.000987,0.002381,0.015766,0.034988,0.043433, $ 0.016835,-0.010038,-0.010082,0.000166,0.000166,0.000166, $ 0.000166,0.000166,0.000166,0.000428,0.003269,0.015766, $ 0.026100,0.115858,0.144064,0.055967,-0.035878,-0.035990, $ 0.000584,0.000584,0.000584,0.000584,0.000584,0.000584, $ 0.000950,0.007254,0.034988,0.115858,0.128586,0.320120, $ 0.124539,-0.083334,-0.083536,0.001346,0.001346,0.001346, $ 0.001346,0.001346,0.001346,0.001180,0.009007,0.043433, $ 0.144064,0.320120,0.201952,0.159935,-0.162762,-0.162267, $ 0.002471,0.002471,0.002471,0.002471,0.002471,0.002471, $ 0.000457,0.003492,0.016835,0.055967,0.124539,0.159935, $ 0.032378,-0.093780,-0.093202,0.001372,0.001372,0.001372, $ 0.001372,0.001372,0.001372,-0.000270,-0.002099,-0.010038, $ -0.035878,-0.083334,-0.162762,-0.093780,0.334488,0.660918, $ -0.009090,-0.009090,-0.009090,-0.009090,-0.009090,-0.009090, $ -0.000271,-0.002108,-0.010082,-0.035990,-0.083536,-0.162267, $ -0.093202,0.660918,0.326482,-0.008982,-0.008982,-0.008981, $ -0.008981,-0.008981,-0.008982,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008982, $ 0.000062,0.000124,0.000124,0.000124,0.000124,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008982,0.000124,0.000062,0.000124, $ 0.000124,0.000124,0.000124,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, $ 0.000124,0.000124,0.000062,0.000124,0.000124,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008981,0.000124,0.000124,0.000124, $ 0.000062,0.000124,0.000124,0.000004,0.000035,0.000166, $ 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, $ 0.000124,0.000124,0.000124,0.000124,0.000062,0.000124, $ 0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, $ 0.001372,-0.009090,-0.008982,0.000124,0.000124,0.000124, $ 0.000124,0.000124,0.000062/ c c Create initial guess for density matrix in global array c call ga_zero(g_dens) call ga_zero(g_counter) one = 1 ld = 15 c c Correct for a factor of two along the diagonal c do i = 1, ld atdens(i,i) = 2.0d00*atdens(i,i) end do itask = nga_read_inc(g_counter,one,one) do while(itask.lt.natom) ioff = itask*15 lo(1) = ioff+1 lo(2) = ioff+1 hi(1) = ioff+15 hi(2) = ioff+15 call nga_put(g_dens,lo,hi,atdens,ld) itask = nga_read_inc(g_counter,one,one) end do call ga_sync return end c subroutine setarrays implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer one, two, dims(2) logical status one = 1 two = 2 g_counter = ga_create_handle() call ga_set_data(g_counter,one,one,MT_INT) status = ga_allocate(g_counter) call ga_zero(g_counter) dims(1) = nbfn dims(2) = nbfn g_dens = ga_create_handle() call ga_set_data(g_dens, two, dims, MT_DBL) status = ga_allocate(g_dens) call ga_zero(g_dens) g_schwarz = ga_create_handle() call ga_set_data(g_schwarz, two, dims, MT_DBL) status = ga_allocate(g_schwarz) call ga_zero(g_schwarz) g_fock = ga_create_handle() call ga_set_data(g_fock, two, dims, MT_DBL) status = ga_allocate(g_fock) call ga_zero(g_fock) g_tfock = ga_create_handle() call ga_set_data(g_tfock, two, dims, MT_DBL) status = ga_allocate(g_tfock) call ga_zero(g_tfock) g_work = ga_create_handle() call ga_set_data(g_work, two, dims, MT_DBL) status = ga_allocate(g_work) call ga_zero(g_work) #ifdef CHECKPOINT_SCF arraylist(1) = g_counter arraylist(2) = g_dens arraylist(3) = g_schwarz arraylist(4) = g_fock arraylist(5) = g_work write (6,*) arraylist(1),arraylist(2),arraylist(3) call ga_checkpoint_arrays(arraylist,numarrays) #endif g_ident = ga_create_handle() call ga_set_data(g_ident, two, dims, MT_DBL) status = ga_allocate(g_ident) call ga_zero(g_ident) g_orbs = ga_create_handle() call ga_set_data(g_orbs, two, dims, MT_DBL) status = ga_allocate(g_orbs) call ga_zero(g_orbs) return end subroutine closearrays implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" logical status c status = ga_destroy(g_counter) status = ga_destroy(g_dens) status = ga_destroy(g_schwarz) status = ga_destroy(g_fock) status = ga_destroy(g_tfock) status = ga_destroy(g_work) status = ga_destroy(g_ident) status = ga_destroy(g_orbs) c return end c subroutine makoverlap implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer me, lo(2), hi(2), ptr, ld(2) integer ld1, ld2 me = ga_nodeid() call nga_distribution(g_ident, me, lo, hi) call nga_access(g_ident, lo, hi, ptr, ld) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call setoverlap(dbl_mb(ptr),lo,hi,ld1,ld2) call nga_release(g_ident) return end c subroutine setoverlap(a,lo,hi,ld1,ld2) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer lo(2), hi(2) integer ld1, ld2, ii, jj double precision a(ld1,ld2) do i = 1, ld1 ii = i + lo(1) - 1 do j = 1, ld2 jj = j + lo(2) - 1 #if USE_TRANSFORM if (ii.eq.jj) then a(i,j) = 1.0d00 else a(i,j) = 0.0d00 endif #else a(i,j) = s(ii,jj) #endif end do end do return end c subroutine print_ga_block(g_a) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer lo(2), hi(2), ptr, ld1, ld2 c me = ga_nodeid() call nga_distribution(g_a, me, lo, hi) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call nga_access(g_a, lo, hi, ptr, ld) call dump_chunk(dbl_mb(ptr),ld1,ld2) call nga_release(g_a) c return end c subroutine print_ga_block_ij(g_a,tlo) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer lo(2), hi(2), ptr, ld1, ld2 c me = ga_nodeid() call nga_distribution(g_a, me, lo, hi) ld1 = hi(1) - lo(1) + 1 ld2 = hi(2) - lo(2) + 1 call nga_access(g_a, tlo, hi, ptr, ld) call dump_chunk(dbl_mb(ptr),ld1,ld2) call nga_release(g_a) c return end c subroutine dump_chunk(a,ld1,ld2) implicit double precision (a-h, o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer ld1, ld2 double precision a(ld1, ld2) do i = 1, min(10,ld1) write(6,100) (a(i,j), j = 1, min(10,ld2)) end do write(6,*) 100 format(10f10.4) return end c double precision function contract_matrices(g_a,g_b) implicit double precision(a-h,o-z) #include "cscf.h" #include "mafdecls.fh" #include "global.fh" #include "tcgmsg.fh" integer lo(2), hi(2), ptr_a, ptr_b, ld, ld1, ld2 double precision a(ichunk,ichunk),b(ichunk,ichunk) double precision value logical dotask c c evalute sum_ij a_ij*b_ij c value = 0.0d00 call ga_zero(g_counter) dotask = next_chunk(lo,hi) ld = ichunk do while (dotask) call nga_get(g_a,lo,hi,a,ld) call nga_get(g_b,lo,hi,b,ld) do j = 1, hi(2)-lo(2)+1 do i = 1, hi(1)-lo(1)+1 value = value + a(i,j)*b(i,j) end do end do dotask = next_chunk(lo,hi) end do call ga_dgop(3,value,1,'+') contract_matrices=value c return end ga-5-4/global/examples/scf/cscf.h0000644000175000017500000000603712662210461014756 0ustar mbambac c include file defining common /cscf/ c c constant parameters are set in cscf, parameters are set c after reading input. c c maxatom = maximum no. of atoms (constant parameter) c maxnbfn = maximum no. of bas. fnct.(constant parameter) c maxnnbfn = maxnbfn*(maxnbfn+1)/2 (constant parameter) c natom = no. of atoms (parameter) c nbfn = no. of basis functions (parameter) c nnbfn = nbfn*(nbfn+1)/2 (parameter) c nocc = no. of occupied orbitals (parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (maxatom = 286) !cste original value 50 parameter (maxnbfn =15*maxatom, mxiter = 30) parameter (maxnnbfn = maxnbfn*(maxnbfn+1)/2) parameter (pi = 3.141592653589793d0) parameter (tol= 0.5d-3) parameter (tol2e=1.0d-6) c common /cscf/ $ enrep, q(maxatom), ax(maxatom), ay(maxatom), az(maxatom), $ x(maxnbfn), y(maxnbfn), z(maxnbfn), expnt(maxnbfn), $ rnorm(maxnbfn),iky(maxnbfn), icut1, icut2, icut3, icut4, $ natom, nocc, nbfn, nnbfn double precision enrep, q, ax, ay, az, x, y, z, expnt, rnorm integer*8 iky, icut1, icut2, icut3, icut4, natom, nocc, nbfn, $ nnbfn c c Global array parameters used in calculations: c c ichunk: chunk size for distributing workload c c g_counter: global array used to assign next task c g_dens: global array used to store density matrix c g_fock: global array used to store fock matrix c g_tfock: global array used to store transformed fock matrix c g_schwarz: global array used to store schwarz matrix c g_work: global array used to store work matrix c g_ident: global array used to store identity matrix c g_orbs: global array used to store orbital vectors c parameter (ichunk = 20) !cste original value 10 common /g_arrays/ eigv(maxnbfn), $ g_counter, g_dens, g_fock, g_tfock, g_schwarz, g_work, $ g_ident, g_orbs double precision eigv integer g_counter, g_dens, g_fock, g_tfock, g_schwarz, g_work, $ g_ident, g_orbs ga-5-4/global/examples/scf/output.F0000644000175000017500000000520412662210461015331 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine output (z,rowlow,rowhi,collow,colhi,rowdim,coldim, $ nctl) c....................................................................... c output prints a real*8 matrix in formatted form with numbered rows c and columns. the input is as follows; c matrix(*,*).........matrix to be output c rowlow..............row number at which output is to begin c rowhi...............row number at which output is to end c collow..............column number at which output is to begin c colhi...............column number at which output is to end c rowdim..............row dimension of matrix(*,*) c coldim..............column dimension of matrix(*,*) c nctl................carriage control flag; 1 for single space c 2 for double space c 3 for triple space c the parameters that follow matrix are all of type integer*4. the c program is set up to handle 5 columns/page with a 1p5d24.15 format for c the columns. if a different number of columns is required, change c formats 1000 and 2000, and initialize kcol with the new number of c columns. c author; nelson h.f. beebe, quantum theory project, university of c florida, gainesville c....................................................................... C$Id: output.F,v 1.1 2005/03/08 23:58:03 d3g293 Exp $ implicit double precision (a-h,o-z) #include "mafdecls.fh" #include "global.fh" #include "mp3def.fh" integer rowlow,rowhi,collow,colhi,rowdim,coldim,begin,kcol dimension z(rowdim,coldim) dimension asa(3) data column/8hcolumn /,asa/8h ,8h00000000 , 1 8h-------- /,blank/8h / data kcol/8/ data zero/0.d00/ if (ga_nodeid().ne.0) return do 11 i=rowlow,rowhi do 10 j=collow,colhi if (z(i,j).ne.zero) go to 15 10 continue 11 continue write (6,3000) 3000 format (/' zero matrix'/) go to 3 15 continue if (rowhi.lt.rowlow) go to 3 if (colhi.lt.collow) go to 3 last = min0(colhi,collow+kcol-1) do 2 begin = collow,colhi,kcol write (6,1000) (column,i,i = begin,last) do 1 k = rowlow,rowhi do 4 i=begin,last if (z(k,i).ne.zero) go to 5 4 continue go to 1 c 5 write (6,2000) k,(z(k,i), i = begin,last) 1 continue last = min0(last+kcol,colhi) 2 continue 3 return 1000 format (/11x,7(a3,i3,3x),(a3,i3)) 2000 format ('row',i4,1x,8f9.4) end ga-5-4/global/examples/scf/be16.inpt0000644000175000017500000000054412662210461015315 0ustar mbamba16 4 0.000 0.000 0.000 4 4.000 0.000 0.000 4 8.000 0.000 0.000 4 12.000 0.000 0.000 4 16.000 0.000 0.000 4 20.000 0.000 0.000 4 24.000 0.000 0.000 4 28.000 0.000 0.000 4 32.000 0.000 0.000 4 36.000 0.000 0.000 4 40.000 0.000 0.000 4 44.000 0.000 0.000 4 48.000 0.000 0.000 4 52.000 0.000 0.000 4 56.000 0.000 0.000 4 60.000 0.000 0.000 ga-5-4/global/examples/scf/README0000644000175000017500000000206412662210461014543 0ustar mbambaThis is a converted version of the scf test code in the tcgmsg directory that solves the Hartree-Fock equations for a cluster of beryllium atoms. The main modifications are that this code is uses distributed data instead of replicated data and is based on the GA function calls instead of TCGMSG. The input is a simple XYZ format file of the form:: 1 Number of beryllium atoms 2 Blank line 3 4 x y z 4 4 x y z . . . Other parameters that control convergence etc. can be found in the cscf.h file. The two-electron Fock build does not make use of the 8-fold symmetry of the two-electron integrals. The default diagonalization routine makes use of a similarity transform so that only a standard eigenvalue problem needs to be solved. A direct solution using a generalized eigenvalue solver can be had by setting the USE_TRANSFORM compiler directive to 0 in the top of the scf.F file. A larger system containing 16 atoms has also been included in this directory. To run the larger problem, just copy the file be16.inpt to be.inpt and run the code. ga-5-4/global/examples/scf/be.inpt0000644000175000017500000000013312662210461015140 0ustar mbamba4 4 0.000 0.000 0.000 4 4.000 0.000 0.000 4 8.000 0.000 0.000 4 12.000 0.000 0.000 ga-5-4/global/examples/lennard-jones/0000755000175000017500000000000012662210461015645 5ustar mbambaga-5-4/global/examples/lennard-jones/README0000644000175000017500000000323412662210461016527 0ustar mbambaMolecular Dynamics of Lennard Jones System using Global Arrays ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There are 3 classes of parallelization: Atom, Force and Spatial Decomposition. The current implementation is based on force decomposition and uses global arrays (GA). Algorithm ========= The entire force matrix (N x N) is divided into multiple blocks (m x m) for dynamic load balancing, where m is the block size and N is the total number of atoms/particles. The force between two atoms/particles can be approximated by Lennard Jones potential energy function. Block Topology (of Force Matrix) -------------------------------- Say for example if there are 4 block and 100 atoms, the size of the force matrix is 100x100 and each block size is 50x50. (Dynamic Load Balancing) Each process (say 2 process example) gets one block each, and once it is done with a block, it gets the next block in the queue (atomic task array). Using Newton's laws of equation and Velocity-Verlet algorithm, the velocities and coordinates are updated for the next time step. Refer to the following for more information on MD algorithm: http://www.physics.buffalo.edu/phy516/lectures.html An output file output.dat is created in Molden format, when the variable WRITE_TO_FILE is set. For optimum performance, BLOCK SIZE should be set appropriately depending upon the problem size (number of atoms/particles). References: - http://www.physics.buffalo.edu/phy516/lectures.html - http://www.cs.sandia.gov/~sjplimp/main.html To Compile ---------- run "make examples" or "make global/examples/lennard-jones/lennard.x". ga-5-4/global/examples/lennard-jones/lennard.c0000644000175000017500000005003412662210461017436 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" #define NATOMS 256 #define BLOCK_SIZE 64 #define DENSITY 1.05 #define TEMPERATURE 2.0 #define TIMESTEP 0.004 #define RESCALE_STEPS 10 #define EQUILIBRIUM_TIME 10.0 #define SIMULATION_TIME 20.0 #define STOP_ITERATING 0 #define DEBUG 0 #define PRINT_LEVEL_1 1 /**< dumps result: level 1 */ #define PRINT_LEVEL_2 1 /**< dumps result: level 2..more results */ #define WRITE_TO_FILE 0 /**< dumps the coordinates in molden viz format */ #define NDIM 3 /**< always 3-d */ #define MAX_PROC 256 #define MAX_BLOCKS 256 #define SAFELIMIT 3 #ifdef MSG_COMMS_MPI # define CLOCK_ MPI_Wtime #else # define CLOCK_ tcg_time #endif /* #define GA_ABS(a) ( ((a) > 0) ? (a) : -(a) ) */ typedef struct { int x; int y; } topo_t; /* box specifications */ typedef struct { double length; double width; double height; } boxSpec_t; int gMemHandle; static int gMe, gNproc; static int g_X; /* Coordinate array */ static int g_G; /* Gradient Array */ static int g_V; /* Velocity Array */ static int g_T; /* Atomic Task: 1-d array whose size = 1 */ static int gBlockSize, gNblocks; static double gDensity, gDesiredTemperature, gTimeStep, gComputeTime=0.0; static topo_t btopo[MAX_BLOCKS]; static boxSpec_t box; static int measurementStep; static double temperature, temperatureSum, temperatureSqdSum; static double pressure, pressureSum, pressureSqdSum; static double potentialEnergySum, potentialEnergySqdSum; static double kineticEnergySum, totalEnergySum, totalEnergySqdSum; /** * To get the next task id. It is an atomic operation. */ static int nxtask(void) { int subscript = 0; return NGA_Read_inc(g_T, &subscript, 1); } /** * Block Topology (of Force Matrix): * Say for example: If there are 4 block and 100 atoms, the size of * the force matrix is 100x100 and each block size is 50x50. * * ----------- * | | | * | 0,0 | 0,1 | * ----------- * | 1,0 | 1,1 | * | | | * ----------- */ void LJ_Setup(int natoms, double **x_i, double **x_j, double **grad) { int i, j, k=0, n; MA_AccessIndex maindex; n = natoms/gBlockSize; /* block topology */ for(i=0; i MAX_BLOCKS) GA_Error("Number of blocks is greater than MAX_BLOCKS(512): Solution is either increase the defined MAX_BLOCKS or increase your block size", 0L); if(gNblocks < gNproc) GA_Error("Number of blocks should be greater than number of processors",0L); } /** * The entire Force matrix is sub-divided into many blocks. * This function gets the next block to be computed by a * process. Once a process finishes a block it gets a new * block to be computed. */ void getBlock(int taskId, int size, double *x_i, double *x_j) { int lo, hi; #if DEBUG printf("%d: new task = %d: topo: %d,%d\n", gMe, taskId, btopo[taskId].x, btopo[taskId].y); #endif /** get the coordinates of the atoms in the corresponding rows in the block */ lo = btopo[taskId].x * size; hi = lo + size -1; NGA_Get(g_X, &lo, &hi, x_i, &hi); /** get the coordinates of the atoms in the corresponding columns in the block */ lo = btopo[taskId].y * size; hi = lo + size -1; NGA_Get(g_X, &lo, &hi, x_j, &hi); } /** * LJ Function Gradient Computation. */ void LJ_FG(int taskId, double *x_i, double *x_j, double *f, double *grad) { int b_x, b_y; /* block topology */ int i, j, start_x, start_y, tempA, tempB; int start_i=0, end_i=0, start_j=0, *end_j=NULL; int sign_x, sign_y, sign_z; double xx, yy, zz, rij, temp,r2,r6,r12, xtmp, ytmp, ztmp; b_x = btopo[taskId].x; b_y = btopo[taskId].y; start_x = gBlockSize * NDIM * btopo[taskId].x; start_y = gBlockSize * NDIM * btopo[taskId].y; if(b_x == b_y) { /* computer lower triagular matrix only */ start_i = 1; end_i = gBlockSize; start_j = 0; end_j = &i; } else if(b_x > b_y) { /* compute right half of the block */ start_i = 0; end_i = gBlockSize; start_j = gBlockSize/2; end_j = &gBlockSize; } else if(b_x < b_y) { /* compute upper half of the block */ start_i = 0; end_i = gBlockSize/2; start_j = 0; end_j = &gBlockSize; } /* Calculating Force exerted on 'i' by 'j' */ for(i=start_i; i< end_i; i++) { xtmp = x_i[NDIM*i]; ytmp = x_i[NDIM*i+1]; ztmp = x_i[NDIM*i+2]; for(j=start_j; j< *end_j; j++) { xx = xtmp - x_j[NDIM*j]; yy = ytmp - x_j[NDIM*j+1]; zz = ztmp - x_j[NDIM*j+2]; sign_x = xx > 0.0 ? 1 : -1; sign_y = yy > 0.0 ? 1 : -1; sign_z = zz > 0.0 ? 1 : -1; /** * Using Nearest Image Approximation in computing the distance between * any 2 atoms: If any component of (Ri-Rj) is greater than L/2, then * there is an image particle located closer which exerts a larger force * (because we use periodic boundary conditions). */ if(xx*sign_x > box.length/2) xx -= sign_x*box.length; if(yy*sign_y > box.width/2) yy -= sign_y*box.width ; if(zz*sign_z > box.height/2) zz -= sign_z*box.height; rij = xx*xx + yy*yy + zz*zz; #if DEBUG if(rij <= 0.0) GA_Error("Divide by Zero Error\n", 0L); #endif r2 = 1.0/rij; r6 = r2*r2*r2; r12 = r6*r6; *f = *f + 4.0*(r12-r6); /* function */ temp = r2 * (48.0 * r12 - 24.0 * r6); tempA = start_x + NDIM*i; tempB = start_y + NDIM*j; grad[tempA] += xx*temp; /* gradient */ grad[tempA+1] += yy*temp; grad[tempA+2] += zz*temp; grad[tempB] -= xx*temp; grad[tempB+1] -= yy*temp; grad[tempB+2] -= zz*temp; } } } /** * Compute Function and Gradient */ void computeFG(double *force, int natoms, double *x_i, double *x_j, double *grad) { int taskId, size, lo, hi, i; double tt; taskId = gMe; size = gBlockSize * NDIM; for(i=0; i 5) { printf("Argc = %d\n", argc); while((n = getopt(argc, argv, "b:")) != EOF) switch (n) { case 'b': gBlockSize = atoi(optarg); } } #endif } void rescaleVelocities (int totalAtoms) { int i, p, lo, hi, ld, natms; double vSqdSum = 0.0, scale; double *v; GA_Sync(); NGA_Distribution(g_V, gMe, &lo, &hi); NGA_Access(g_V, &lo, &hi, &v, &ld); natms = (hi-lo+1)/NDIM; for (p = 0; p < natms; p++) for (i = 0; i < NDIM; i++) vSqdSum += v[p*NDIM + i] * v[p*NDIM + i]; GA_Dgop(&vSqdSum, 1, "+"); scale = NDIM * (totalAtoms) * gDesiredTemperature / vSqdSum; scale = sqrt(scale); for (p = 0; p < natms; p++) for (i = 0; i < NDIM; i++) v[p*NDIM + i] *= scale; GA_Sync(); } double gaussianDistribution() { static int available = 0; static double savedDeviate; double r[2], rSqd, factor; int i; if (available) { available = 0; return savedDeviate; } do { rSqd = 0.0; for (i = 0; i < 2; i++) { r[i] = (2.0 * (double) rand()) / RAND_MAX - 1.0; rSqd += r[i] * r[i]; } } while (rSqd >= 1.0 || rSqd == 0.0); factor = sqrt(-2.0 * log(rSqd) / rSqd); savedDeviate = r[0] * factor; available = 1; return r[1] * factor; } void LJ_Initialize(int natoms) { double L; /* compute the length, width and height of the box */ L = pow(natoms/gDensity, 1.0/3.0); box.length = box.width = box.height = L; #if PRINT_LEVEL_1 if(gMe == 0) { printf("\n"); printf(" =========================================================\n\n"); printf(" Molecular Dynamics Simulation \n\n"); printf(" of \n\n"); printf(" Lennard Jones System \n\n"); printf(" =========================================================\n\n\n"); printf(" Number of Atoms/Particles = %d\n", natoms); printf(" Block Size = %d\n", gBlockSize); printf(" Number of Blocks = %d\n", gNblocks); printf(" Density = %f\n", gDensity); printf(" Temperature = %f\n", gDesiredTemperature); printf(" Time Step = %f\n\n", gTimeStep); printf(" Box Specifications:\n"); printf(" Size of the Cube (Box) = %f\n", box.length); printf(" System Volume = %f\n\n\n", pow(L, 3.0)); } #endif if(gMe == 0) { int c, i, j, k, m, n, p; double b, xSum[3] = {0.0, 0.0, 0.0}; double rFCC[4][3] = {{0.0, 0.0, 0.0}, {0.0, 0.5, 0.5}, {0.5, 0.0, 0.5}, {0.5, 0.5, 0.0}}; double rCell[3]; double *x; int lo, hi, handle; MA_AccessIndex maindex; n = NDIM * natoms + 1; if(MA_push_get(C_DBL, n, "GA LJ_Init bufs", (void *)&handle, &maindex)) MA_get_pointer(handle, &x); else GA_Error("ma_alloc_get failed",n); /* Use face centered cubic (FCC) lattice for initial positions. Find number of unit cells (c) needed to place all atoms */ for (c = 1; ; c++) if (4*c*c*c >= natoms) break; b = L / c; /* side of unit cell */ p = 0; /* atoms placed so far */ for (i = 0; i < c; i++) { rCell[0] = i * b; for (j = 0; j < c; j++) { rCell[1] = j * b; for (k = 0; k < c; k++) { rCell[2] = k * b; for (m = 0; m < 4; m++) /* 4 particles in cell */ if (p < natoms) { for (n = 0; n < NDIM; n++) /* 3-dimensions - x, y, z */ x[p*NDIM + n] = rCell[n] + b * rFCC[m][n]; ++p; } } } } lo = 0; hi = natoms*NDIM-1; NGA_Put (g_X, &lo, &hi, x, &hi); /* Random Gaussian distribution of initial velocities */ for(i=0; i= b[i]) x[p*NDIM+i] -= b[i]; v[p*NDIM+i] += 0.5 * a[p*NDIM+i] * gTimeStep; } GA_Sync(); } /** * Using Velocity-Verlet Algorithm. */ void LJ_Update_Velocity() { int i, p, lo, hi, ld, natms; double *a, *v; GA_Sync(); NGA_Distribution(g_V, gMe, &lo, &hi); NGA_Access(g_V, &lo, &hi, &v, &ld); NGA_Access(g_G, &lo, &hi, &a, &ld); natms = (hi-lo+1)/NDIM; for (p = 0; p < natms; p++) for (i = 0; i < NDIM; i++) v[p*NDIM+i] += 0.5 * a[p*NDIM+i] * gTimeStep; GA_Sync(); } void initializeTaskArray() { int lo, hi, n; if(gMe ==0) { /* Initialize the task array */ lo = 0; hi = 0; /* only one element */ n = gNproc; /* initial value of the task counter/id */ NGA_Put (g_T, &lo, &hi, &n, &hi); } GA_Sync(); } void solveOneTimeStep(double *potentialEnergy, int natoms, double *x_i, double *x_j, double *grad) { *potentialEnergy = 0.0; LJ_Update(); /* Update the coordinates */ initializeTaskArray(); computeFG(potentialEnergy, natoms, x_i, x_j, grad); LJ_Update_Velocity(); } void writeToFile(int natoms) { static int first_time = 1; static FILE *gOutfile; int n=0, i=0, lo, hi; double *p_data; if(gMe == 0) { if(first_time) { gOutfile = fopen("output.dat", "w"); first_time = 0; } else if(natoms == -1) { fclose(gOutfile); return; } p_data = (double *) malloc(sizeof(double) * natoms * NDIM); lo = 0; hi = natoms * NDIM -1; NGA_Get(g_X, &lo, &hi, p_data, &hi); /* in molden format */ fprintf(gOutfile, "%d\n\n", natoms) ; /* 2 new lines needed */ do { fprintf(gOutfile, "%s %f %f %f\n", "XX", p_data[i], p_data[i+1], p_data[i+2]); i+=NDIM; }while(++n < natoms); free(p_data); } } /** * Lennard Jones Molecular Dynamics: starts here... */ void LJ_Solve(int natoms) { double execTime, potentialEnergy, totalEnergy = 0.0, time=0.0; double *x_i, *x_j, *grad, ip; int s=0; /* Initial Setup */ LJ_Setup(natoms, &x_i, &x_j, &grad); initializeTaskArray(); #if WRITE_TO_FILE writeToFile(natoms); #endif execTime = CLOCK_(); potentialEnergy = 0.0; computeFG(&potentialEnergy, natoms, x_i, x_j, grad); initializeProperties(); computeProperties(natoms, potentialEnergy, &totalEnergy); #if WRITE_TO_FILE writeToFile(natoms); #endif if(gMe == 0) printf("Equilibrium Steps:\n"); if(gMe == 0) printf("Time = %.3f \tEnergy = %f\n", time, totalEnergy); /* Equilibrium Steps */ while(time < EQUILIBRIUM_TIME) { solveOneTimeStep(&potentialEnergy, natoms, x_i, x_j, grad); computeProperties(natoms, potentialEnergy, &totalEnergy); #if WRITE_TO_FILE writeToFile(natoms); #endif time += gTimeStep; if(gMe == 0 && modf(time,&ip) < gTimeStep) printf("Time = %.2f \tEnergy = %f\n", ip, totalEnergy); if(++s >= RESCALE_STEPS) { rescaleVelocities(natoms); s = 0; } } /* Actual Production Steps */ if(gMe == 0) printf("Production Steps:\n"); initializeProperties(); while(time < EQUILIBRIUM_TIME + SIMULATION_TIME) { solveOneTimeStep(&potentialEnergy, natoms, x_i, x_j, grad); computeProperties(natoms, potentialEnergy, &totalEnergy); #if WRITE_TO_FILE writeToFile(natoms); #endif time += gTimeStep; if(gMe == 0 && modf(time,&ip) < gTimeStep) printf("Time = %.2f \tEnergy = %f\n", ip, totalEnergy); } #if WRITE_TO_FILE writeToFile(-1); #endif if(gMe == 0) printProperties(natoms); #if PRINT_LEVEL_2 if(gMe == 0) { execTime = CLOCK_()-execTime; printf("%d: Total Elapsed Time = %f\n", gMe, execTime); printf("%d: Computation Time = %f\n", gMe, gComputeTime); printf("%d: Percentage Overhead = %f\n\n", gMe, 100*(execTime-gComputeTime)/execTime); } #endif if(!MA_pop_stack(gMemHandle)) GA_Error("LJ_Init:MA_pop_stack failed",0); } /** * main(int argc, char **argv) */ int main(int argc, char **argv) { int heap=4000000, stack=4000000; int natoms=NATOMS; int dims[NDIM]; MP_INIT(argc, argv); /** * Initialize Global Arrays. */ GA_Initialize_args(&argc, &argv); gMe = GA_Nodeid(); gNproc = GA_Nnodes(); heap /= gNproc; stack /= gNproc; if(! MA_init(C_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ /** * Parse the command line and check the initial conditions (and assumptions) */ commandLine(argc, argv); check(natoms); /** * Create coordinate(x), gradient(g) and velocity(v) vectors */ dims[0] = natoms*NDIM; g_X = NGA_Create(C_DBL, 1, dims, "Coordinate Array - X", NULL); g_G = GA_Duplicate (g_X, "Gradient"); g_V = GA_Duplicate (g_X, "Velocity"); /** * Molecular Dynamics of the Lennard Jones(lj) clusters. * (molecular conformation problem). */ LJ_Initialize(natoms); LJ_Solve(natoms); /** * Deaalocate the arrays and free the resources */ GA_Destroy(g_X); GA_Destroy(g_G); GA_Destroy(g_V); GA_Destroy(g_T); /** * Termination signal to release the resources, etc. */ GA_Terminate(); #ifdef MSG_COMMS_MPI MPI_Finalize(); #else tcg_pend(); #endif return 0; } ga-5-4/global/examples/md_cluster/0000755000175000017500000000000012662210461015247 5ustar mbambaga-5-4/global/examples/md_cluster/mdinit.F0000644000175000017500000000577612662210461016661 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine mdinit #include "common.fh" c double precision six,twelve,ac integer i,j c c turn of all cluster related functions c nocluster = .false. c c This subroutine sets up the potentials, assigns atomic masses c and finishes initializing the calculation c six = 6.0d00 twelve = 12.0d00 c c initialize timing and energy statistics arrays c do i = 1, MAXNRG nrg(i) = 0.0d00 anrg(i) = 0.0d00 anrg2(i) = 0.0d00 end do nrgcnt = 0 nrg2ct = 0 do i = 1, MAXTIM tmstat(i) = 0.0d00 end do failcount = 0 c c assign atom masses c do i = 1, antot mass(i) = amass(at(i)) end do c c Initialize cutoffs for potential arrays. c rcmax = 0.0d00 do i = 1, atnum do j = 1, atnum ac = acut(i,j) if (ac.gt.rcmax) rcmax = ac rcorr(i,j) = e12(i,j) / ac**12 dcorr(i,j) = -e6(i,j) / ac**6 if (icut.eq.1) then frcorr(i,j) = - twelve * e12(i,j) / ac**13 fdcorr(i,j) = six * e6(i,j) / ac**7 else frcorr(i,j) = 0.0d00 fdcorr(i,j) = 0.0d00 endif end do end do rcmax = rcmax + 1.0d00 c c calculate total number of degrees of freedom c nrg(1) = dble(3*atot-3) nrg(2) = nrg(1) / 2.0 c c Convert algorithm parameters into system units c istep = 0 tavg = 0.0d00 itavg = 0 tmstrt = 0 t_done = 0.0d00 t_rmndr = tau c c Initialize parameters for mass and temperature degrees of freedom c vol1 = xbox * ybox * zbox alen1(1) = xbox alen1(2) = ybox alen1(3) = zbox vol2 = 0.0d00 vol3 = 0.0d00 do j = 1, 3 alen2(j) = 0.0d00 alen3(j) = 0.0d00 end do scal1 = 1.0d00 scal2 = 0.0d00 scal3 = 0.0d00 c c Initialize bins accumulating r_cluster values c do j = 1, 10 do i = 1, mcbins r_distr(i,j) = 0 end do end do c c Initialize absolute coordinates c call cluster_center call update call force mbflg = .true. call cluster_com c tavg = 0.0d00 do j = 1, 3 do i = 1, antot ra(i,j,7) = ra(i,j,8) ra(i,j,3) = ra(i,j,4)/mass(i) end do end do c return end ga-5-4/global/examples/md_cluster/tstats.F0000644000175000017500000001043312662210461016701 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c function wraptime() double precision wraptime #if HAVE_ETIME real*4 etime,tarray(2) external etime c c This function returns the UNIX clock time in seconds. c It is designed to minimize the effort required to c convert the timing statistics in going from one c machine to another. c c SGI c wraptime = dble(etime(tarray)) #else c c NO TIME STATISTICS c wraptime = 0.0d00 #endif c return end c subroutine tmout #include "common.fh" double precision tmax(MAXTIM),tmin(MAXTIM) integer i,pnum c c This routine writes out the timekeeping statistics to c the output file 'md.out' c do i = 1, MAXTIM tmin(i) = tmstat(i) tmax(i) = tmstat(i) end do call ga_dgop(5,tmstat,MAXTIM,'+') call ga_dgop(5,tmax,MAXTIM,'max') call ga_dgop(5,tmin,MAXTIM,'min') pnum = ga_nnodes() do i = 1, MAXTIM tmstat(i) = tmstat(i)/dble(pnum) end do if (ga_nodeid().ne.0) return c if (l_stdio) then write(6,100) tmstat(1),tmin(1),tmax(1) write(6,200) tmstat(2),tmin(2),tmax(2) write(6,300) tmstat(3),tmin(3),tmax(3) write(6,400) tmstat(4),tmin(4),tmax(4) write(6,500) tmstat(5),tmin(5),tmax(5) write(6,2300) tmstat(23),tmin(23),tmax(23) write(6,550) tmstat(6)+tmstat(7)+tmstat(8) write(6,600) tmstat(6),tmin(6),tmax(6) write(6,700) tmstat(7),tmin(7),tmax(7) write(6,750) write(6,800) tmstat(8),tmin(8),tmax(8) write(6,2800) tmstat(28),tmin(28),tmax(28) write(6,1400) tmstat(14),tmin(14),tmax(14) write(6,850) tmstat(9)+tmstat(10) write(6,900) tmstat(9),tmin(9),tmax(9) write(6,1000) tmstat(10),tmin(10),tmax(10) write(6,1050) tmstat(11)+tmstat(12)+tmstat(13) write(6,1100) tmstat(11),tmin(11),tmax(11) write(6,1200) tmstat(12),tmin(12),tmax(12) write(6,1300) tmstat(13),tmin(13),tmax(13) write(6,1500) tmstat(15),tmin(15),tmax(15) write(6,1600) tmstat(16),tmin(16),tmax(16) endif c 100 format('Total elapsed time for calculation ',3f8.1,' (sec)') 200 format('Total time in force calculation ',3f8.1,' (sec)') 300 format(' Pairwise interactions ',3f8.1,' (sec)') 400 format(' Bending interactions ',3f8.1,' (sec)') 500 format(' Stretching interactions ',3f8.1,' (sec)') 550 format('Total time exchanging particle lists ',f8.1,' (sec)') 600 format(' Gathering list ',3f8.1,' (sec)') 700 format(' Scattering list ',3f8.1,' (sec)') 750 format(' Updating lists ',3f8.1,' (sec)') 800 format(' Coordinates ',3f8.1,' (sec)') 850 format('Total time sorting lists ',f8.1,' (sec)') 900 format(' Sorting local list ',3f8.1,' (sec)') 1000 format(' Sorting buffer list ',3f8.1,' (sec)') 1050 format('Total time sending messages ',f8.1,' (sec)') 1100 format(' Gather ',3f8.1,' (sec)') 1200 format(' Scatter ',3f8.1,' (sec)') 1300 format(' Update ',3f8.1,' (sec)') 1400 format(' Angles ',3f8.1,' (sec)') 1500 format('Total time calculating stress tensor ',3f8.1,' (sec)') 1600 format('Total time in scatter synchronization ',3f8.1,' (sec)') 2300 format('Total time constructing neighbor list ',3f8.1,' (sec)') 2800 format(' Bonds ',3f8.1,' (sec)') c return end ga-5-4/global/examples/md_cluster/estats.F0000644000175000017500000002444312662210461016670 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine estat #include "common.fh" c c This subroutine accumulates energy statistics for the simulation. c The averages are stored in the array anrg(). The contents of nrg() c and anrg() are listed below. Temporary values for the averages are c stored in tmpnrg() and the uncertainties are stored anrg2(). c Corresponding entries in anrg(), tmpnrg(), and anrg2() are all indexed c by the same variable. c c Contents of nrg() c c nrg(1): the total number of degrees of freedom in the system c c nrg(2): the total number of degrees of freedom in the system c times Rgas/2 c c nrg(3): the total energy of the system c c nrg(4): the total kinetic energy of the system c c nrg(5): temperature (in Kelvin) of the system c c nrg(6): potential energy of the system c c nrg(7): current pressure (in atmospheres) c c nrg(8): the total translational kinetic energy of the system c c nrg(9): the instantaneous value of the Hamiltonian c c nrg(10): the instantaneous value of the virial c c nrg(11): the instantaneous value of the Enthalpy c c nrg(12): the instantaneous coulomb energy of the system c c nrg(13): the instantaneous repulsion energy of the system c c nrg(14): the instantaneous dispersion energy of the system c c nrg(15): the virial contribution to the pressure (in atmospheres) c c nrg(16): the instantaneous torsional energy of the system c c nrg(17): instantaneous energy from harmonic oscillators c c nrg(18): x component of virial c c nrg(19): y component of virial c c nrg(20): z component of virial c c nrg(21): instantaneous energy from bond angle bends c c nrg(22): x component of total momentum c c nrg(23): y component of total momentum c c nrg(24): z component of total momentum c c nrg(25): total mass c c Contents of anrg(), tmpnrg(), and anrg2() c c anrg(1): the average total energy of the system c c anrg(2): the average total kinetic energy of the system c c anrg(3): the average temperature (in Kelvin) of the system c c anrg(4): the average potential energy of the system c c anrg(5): the average pressure (in atmospheres) c c anrg(6): the average total translational kinetic energy of the system c c anrg(7): the average value of the Hamiltonian c c anrg(8): the average value of the Enthalpy c c anrg(9): the average coulomb energy of the system c c anrg(10): the average repulsion energy of the system c c anrg(11): the average dispersion energy of the system c c anrg(12): the average x dimension of the system c c anrg(13): the average y dimension of the system c c anrg(14): the average z dimension of the system c c anrg(15): the average value of the time scaling parameter c c anrg(16): the average volume of the system c c anrg(17): mean square total energy c c anrg(18): mean square Hamiltonian c c anrg(19): mean square kinetic energy c c anrg(20): mean square potential energy c c anrg(21): mean square pressure (in atmospheres**2) c c anrg(22): mean square x dimension c c anrg(23): mean square y dimension c c anrg(24): mean square z dimension c c anrg(25): mean square scaling parameter c c anrg(26): mean square temperature c c anrg(27): mean square Enthalpy c c arng(28): the average torsional energy c c arng(29): the average harmonic oscillator energy c c arng(30): the average bond angle bend energy c nrgcnt = nrgcnt + 1 c anrg(1) = anrg(1) + nrg(3) anrg(2) = anrg(2) + nrg(4) anrg(3) = anrg(3) + nrg(5) anrg(4) = anrg(4) + nrg(6) anrg(5) = anrg(5) + nrg(7) anrg(6) = anrg(6) + nrg(8) anrg(7) = anrg(7) + nrg(9) anrg(8) = anrg(8) + nrg(11) anrg(9) = anrg(9) + nrg(12) anrg(10) = anrg(10) + nrg(13) anrg(11) = anrg(11) + nrg(14) anrg(12) = anrg(12) + xbox anrg(13) = anrg(13) + ybox anrg(14) = anrg(14) + zbox anrg(15) = anrg(15) + scal1 anrg(16) = anrg(16) + vol1 anrg(17) = anrg(17) + nrg(3)**2 anrg(18) = anrg(18) + nrg(9)**2 anrg(19) = anrg(19) + nrg(4)**2 anrg(20) = anrg(20) + nrg(6)**2 anrg(21) = anrg(21) + nrg(7)**2 anrg(22) = anrg(22) + xbox**2 anrg(23) = anrg(23) + ybox**2 anrg(24) = anrg(24) + zbox**2 anrg(25) = anrg(25) + scal1**2 anrg(26) = anrg(26) + nrg(5)**2 anrg(27) = anrg(27) + nrg(11)**2 anrg(28) = anrg(28) + nrg(16) anrg(29) = anrg(29) + nrg(17) anrg(30) = anrg(30) + nrg(21) c return end c subroutine prtnrg #include "common.fh" c double precision bstat,b2stat integer i,ibstat c if (nrgcnt.eq.0) return c do 25 i = 1, MAXNRG anrg(i) = anrg(i) / dble(nrgcnt) 25 continue c c call ga_dgop(3,bstat,1,'+') c call ga_dgop(3,b2stat,1,'+') c call ga_igop(3,ibstat,1,'+') c if (ga_nodeid().eq.0.and.l_stdio) then c if (ibstat.gt.0) bstat = bstat/dble(ibstat) c if (ibstat.gt.0) b2stat = b2stat/dble(ibstat) c b2stat = sqrt(abs(b2stat-bstat**2)) c write(6,50) write(6,100) anrg(1) write(6,200) anrg(2) write(6,300) anrg(3) c write(6,600) anrg(6) write(6,400) anrg(4) c write(6,900) anrg(9) write(6,1000) anrg(10) write(6,1100) anrg(11) c write(6,2800) anrg(28) write(6,2900) anrg(29) write(6,3000) anrg(30) write(6,500) anrg(5) write(6,700) anrg(7) write(6,800) anrg(8) c write(6,850) bstat write(6,1150) write(6,1200) anrg(12) write(6,1300) anrg(13) write(6,1400) anrg(14) write(6,1500) anrg(15) write(6,1600) anrg(16) write(6,1650) write(6,1700) sqrt(abs(anrg(17)-anrg(1)**2)) write(6,1800) sqrt(abs(anrg(18)-anrg(7)**2)) write(6,1900) sqrt(abs(anrg(19)-anrg(2)**2)) write(6,2000) sqrt(abs(anrg(20)-anrg(4)**2)) write(6,2600) sqrt(abs(anrg(26)-anrg(3)**2)) write(6,2700) sqrt(abs(anrg(27)-anrg(8)**2)) write(6,2100) sqrt(abs(anrg(21)-anrg(5)**2)) write(6,2200) sqrt(abs(anrg(22)-anrg(12)**2)) write(6,2300) sqrt(abs(anrg(23)-anrg(13)**2)) write(6,2400) + sqrt(abs(anrg(24)-anrg(14)**2)) write(6,2500) sqrt(abs(anrg(25)-anrg(15)**2)) write(6,2550) b2stat endif c 50 format('Average Energy statistics for simulation:') 100 format(' :',f16.4) 200 format(' :',f16.4) 300 format(' :',f16.4) 400 format(' :',f16.4) 500 format(' :',f16.4) 600 format(' :',f16.4) 700 format(' :',f16.4) 800 format(' :',f16.4) 850 format(' :',f16.4) 900 format(' :',f16.4) 1000 format(' :',f16.4) 1100 format(' :',f16.4) 1150 format('Average system parameters for simulation :') 1200 format(' :',f16.4) 1300 format(' :',f16.4) 1400 format(' :',f16.4) 1500 format(' :',f16.4) 1600 format(' :',f16.4) 1650 format('Root mean square fluctuations:') 1700 format(' Energy :',f16.4) 1800 format(' Hamiltonian :',f16.4) 1900 format(' Kinetic Energy :',f16.4) 2000 format(' Potential Energy :',f16.4) 2100 format(' Pressure :',f16.4) 2200 format(' X :',f16.4) 2300 format(' Y :',f16.4) 2400 format(' Z :',f16.4) 2500 format(' S :',f16.4) 2550 format(' Bond Length :',f16.4) 2600 format(' Temperature :',f16.4) 2700 format(' Enthalpy :',f16.4) 2800 format(' :',f16.4) 2900 format(' :',f16.4) 3000 format(' :',f16.4) return end c subroutine nrgsum #include "common.fh" c double precision rbuf(50) c c this subroutine does a global add on some of the quantities stored c in the array nrg() c rbuf(1) = nrg(3) rbuf(2) = nrg(4) rbuf(3) = nrg(6) rbuf(4) = nrg(8) rbuf(5) = nrg(9) rbuf(6) = nrg(10) rbuf(7) = nrg(11) rbuf(8) = nrg(12) rbuf(9) = nrg(13) rbuf(10) = nrg(14) rbuf(11) = nrg(17) rbuf(12) = nrg(21) rbuf(13) = nrg(22) rbuf(14) = nrg(23) rbuf(15) = nrg(24) rbuf(16) = nrg(25) rbuf(17) = nrg(15) c call ga_dgop(3,rbuf,20,'+') c nrg(3) = rbuf(1) nrg(4) = rbuf(2) nrg(6) = rbuf(3) nrg(8) = rbuf(4) nrg(9) = rbuf(5) nrg(10) = rbuf(6) nrg(11) = rbuf(7) nrg(12) = rbuf(8) nrg(13) = rbuf(9) nrg(14) = rbuf(10) nrg(17) = rbuf(11) nrg(21) = rbuf(12) nrg(22) = rbuf(13) nrg(23) = rbuf(14) nrg(24) = rbuf(15) nrg(25) = rbuf(16) nrg(15) = rbuf(17) c return end ga-5-4/global/examples/md_cluster/pairs.F0000644000175000017500000001612312662210461016477 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine pairs #include "common.fh" c integer MAXCL,MSKIN parameter (MAXCL=50,MSKIN=5) double precision savd(MAXAT),savr(MAXAT),ft(MAXAT,3) double precision rsqi,r6i,dedr,dedrd,dedrr,phid,phir double precision xu,yu,zu,xl,yl,zl,rcut2 double precision tprssr(MAXAT,3),a12(MAXAT),a6(MAXAT) double precision rct2sd,rsqcrt,rsq,b12(MAXAT),b6(MAXAT) double precision r2(MAXAT),dx(MAXAT),dy(MAXAT),dz(MAXAT) double precision br2(MAXAT),bdx(MAXAT),bdy(MAXAT),bdz(MAXAT) double precision xcl,ycl,zcl,xmax,ymax,zmax,xmin,ymin,zmin double precision rcp(MAXAT),dcp(MAXAT),brcp(MAXAT),bdcp(MAXAT) double precision one,six,twelve double precision rix,riy,riz double precision tbeg,wraptime integer acml(MAXAT),bacml(MAXAT) integer i,j,l,fat,lat,jp,jtmp,jat,ltot,bltot c if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) call cell_list tbeg = wraptime() c c this subroutine calculates the forces on individual particles c due to the Van der Waals interactions c c calculate some parameters c one = 1.0d00 six = 6.0d00 twelve = 12.0d00 c c Primary loop over all local atoms c do i = 1, antot c c evaluate forces for both local and buffer atoms c fat = nafirst(i) lat = nalast(i) c c initialize temporary storage arrays c l = 0 do j = fat, lat l = l + 1 savr(l) = 0.0d00 savd(l) = 0.0d00 ft(l,1) = 0.0d00 ft(l,2) = 0.0d00 ft(l,3) = 0.0d00 tprssr(l,1) = 0.0d00 tprssr(l,2) = 0.0d00 tprssr(l,3) = 0.0d00 end do c jp = 0 do jat = fat, lat j = nblist(jat) jp = jp + 1 c acml(jp) = j c c calculate interatomic distances c dx(jp) = ra(i,1,6) - ra(j,1,6) dx(jp) = dx(jp) - xbox * anint(dx(jp) / xbox) dy(jp) = ra(i,2,6) - ra(j,2,6) dy(jp) = dy(jp) - ybox * anint(dy(jp) / ybox) dz(jp) = ra(i,3,6) - ra(j,3,6) dz(jp) = dz(jp) - zbox * anint(dz(jp) / zbox) c r2(jp) = dx(jp)**2 + dy(jp)**2 + dz(jp)**2 end do ltot = jp c c check displacements against cutoff c jp = 0 do 1200 j = 1, ltot rcut2 = acut2(at(i),at(acml(j))) if (r2(j).ge.rcut2) go to 1200 jp = jp + 1 jtmp = acml(j) acml(jp) = jtmp c r2(jp) = r2(j) c a12(jp) = e12(at(jtmp),at(i)) a6(jp) = e6(at(jtmp),at(i)) c dcp(jp) = -dcorr(at(jtmp),at(i)) rcp(jp) = -rcorr(at(jtmp),at(i)) c dx(jp) = dx(j) dy(jp) = dy(j) dz(jp) = dz(j) 1200 continue ltot = jp c c evaluate interaction between all local pairs c c do j = 1, ltot rsq = r2(j) rsqi = one / rsq r6i = rsqi * rsqi * rsqi c phir = a12(j) * r6i * r6i phid = -a6(j) * r6i savr(j) = savr(j) + phir + rcp(j) savd(j) = savd(j) + phid + dcp(j) dedrr = twelve * phir dedrd = six * phid dedr = (dedrr + dedrd) * rsqi ft(j,1) = dedr * dx(j) ft(j,2) = dedr * dy(j) ft(j,3) = dedr * dz(j) tprssr(j,1) = dedr*dx(j)**2 tprssr(j,2) = dedr*dy(j)**2 tprssr(j,3) = dedr*dz(j)**2 end do c c sum forces on atom i and contributions to the energy and c pressure c do j = 1, ltot ra(i,1,4) = ra(i,1,4) + ft(j,1) ra(i,2,4) = ra(i,2,4) + ft(j,2) ra(i,3,4) = ra(i,3,4) + ft(j,3) esvr = esvr + savr(j) esvd = esvd + savd(j) presf = presf + tprssr(j,1) + tprssr(j,2) + tprssr(j,3) presfx = presfx + tprssr(j,1) presfy = presfy + tprssr(j,2) presfz = presfz + tprssr(j,3) end do c c scatter forces to atoms j c do jp = 1, ltot j = acml(jp) ra(j,1,4) = ra(j,1,4) - ft(jp,1) ra(j,2,4) = ra(j,2,4) - ft(jp,2) ra(j,3,4) = ra(j,3,4) - ft(jp,3) end do c c Calculate interactions between locally held atoms and remote c atoms. Start by re-initializing temporary storage arrays. c fat = nbfirst(i) lat = nblast(i) c l = 0 do j = fat, lat l = l + 1 savr(l) = 0.0d00 savd(l) = 0.0d00 ft(l,1) = 0.0d00 ft(l,2) = 0.0d00 ft(l,3) = 0.0d00 tprssr(l,1) = 0.0d00 tprssr(l,2) = 0.0d00 tprssr(l,3) = 0.0d00 end do c jp = 0 do jat = fat, lat j = nblist(jat) jp = jp + 1 c bacml(jp) = j c c calculate interatomic distances c bdx(jp) = ra(i,1,6) - xcrd(j) bdx(jp) = bdx(jp) - xbox * anint(bdx(jp) / xbox) bdy(jp) = ra(i,2,6) - ycrd(j) bdy(jp) = bdy(jp) - ybox * anint(bdy(jp) / ybox) bdz(jp) = ra(i,3,6) - zcrd(j) bdz(jp) = bdz(jp) - zbox * anint(bdz(jp) / zbox) c br2(jp) = bdx(jp)**2 + bdy(jp)**2 + bdz(jp)**2 end do bltot = jp c c check displacements against cutoff c jp = 0 do 1250 j = 1, bltot rcut2 = acut2(at(i),bat(bacml(j))) if (br2(j).ge.rcut2) go to 1250 jp = jp + 1 jtmp = bacml(j) bacml(jp) = jtmp c br2(jp) = br2(j) c b12(jp) = e12(bat(jtmp),at(i)) b6(jp) = e6(bat(jtmp),at(i)) c bdcp(jp) = -dcorr(bat(jtmp),at(i)) brcp(jp) = -rcorr(bat(jtmp),at(i)) c bdx(jp) = bdx(j) bdy(jp) = bdy(j) bdz(jp) = bdz(j) 1250 continue bltot = jp c c evaluate interaction between all local pairs c do j = 1, bltot rsq = br2(j) rsqi = one / rsq r6i = rsqi * rsqi * rsqi c phir = b12(j) * r6i * r6i phid = -b6(j) * r6i savr(j) = savr(j) + phir + brcp(j) savd(j) = savd(j) + phid + bdcp(j) dedrr = twelve * phir dedrd = six * phid dedr = (dedrr + dedrd) * rsqi ft(j,1) = dedr * bdx(j) ft(j,2) = dedr * bdy(j) ft(j,3) = dedr * bdz(j) tprssr(j,1) = dedr*bdx(j)**2 tprssr(j,2) = dedr*bdy(j)**2 tprssr(j,3) = dedr*bdz(j)**2 end do c c sum forces on atom i and contributions to the energy and c pressure c do j = 1, bltot ra(i,1,4) = ra(i,1,4) + ft(j,1) ra(i,2,4) = ra(i,2,4) + ft(j,2) ra(i,3,4) = ra(i,3,4) + ft(j,3) esvr = esvr + savr(j) esvd = esvd + savd(j) presf = presf + tprssr(j,1) + tprssr(j,2) + tprssr(j,3) presfx = presfx + tprssr(j,1) presfy = presfy + tprssr(j,2) presfz = presfz + tprssr(j,3) end do c c scatter forces to atoms j c do jp = 1, bltot j = bacml(jp) xfrc(j) = xfrc(j) - ft(jp,1) yfrc(j) = yfrc(j) - ft(jp,2) zfrc(j) = zfrc(j) - ft(jp,3) end do end do c tmstat(3) = tmstat(3) + wraptime() - tbeg c return end ga-5-4/global/examples/md_cluster/kin.F0000644000175000017500000000655612662210461016153 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine kin #include "common.fh" c integer i,j c c This subroutine calculates the kinetic energy of the current c configuration. It assumes that the center of mass motion in c the xy plane has already been subtracted out. c nrg(4) = 0.0d00 nrg(8) = 0.0d00 do 200 j = 1, 3 do 100 i = 1, antot nrg(4) = nrg(4) + 0.5d00 * ra(i,j,5)**2 / mass(i) c nrg(4) = nrg(4) + 0.5d00 * mass(i) * ra(i,j,2)**2 100 continue 200 continue c return end c subroutine com #include "common.fh" c double precision px,py,pz,vx,vy,vz,tcmass double precision comm(4) integer i c c This subroutine calculates the contributions to the center of mass c and the center of mass momentum from each processor c c Calculate center of mass motion momentum c px = 0.0d00 py = 0.0d00 pz = 0.0d00 tcmass = 0.0d00 do 100 i = 1, antot px = px + ra(i,1,5) py = py + ra(i,2,5) pz = pz + ra(i,3,5) tcmass = tcmass + mass(i) 100 continue c comm(1) = px comm(2) = py comm(3) = pz comm(4) = tcmass call ga_dgop(7,comm,4,'+') px = comm(1) py = comm(2) pz = comm(3) tcmass = comm(4) c nrg(22) = px nrg(23) = py nrg(24) = pz c nrg(25) = tcmass c return end c subroutine com_rmv #include "common.fh" c double precision px,py,pz,vx,vy,vz,tcmass integer i c c This subroutine subtracts out the center of mass motion c Calculate center of mass motion momentum c px = nrg(22) py = nrg(23) pz = nrg(24) tcmass = nrg(25) c c Calculate center of mass velocity c vx = px / tcmass vy = py / tcmass vz = pz / tcmass c c Subtract out center of mass velocity c do 200 i = 1, antot ra(i,1,2) = ra(i,1,2) - vx ra(i,2,2) = ra(i,2,2) - vy ra(i,3,2) = ra(i,3,2) - vz ra(i,1,5) = ra(i,1,5) - mass(i) * vx ra(i,2,5) = ra(i,2,5) - mass(i) * vy ra(i,3,5) = ra(i,3,5) - mass(i) * vz 200 continue c return end c subroutine fixper #include "common.fh" c integer i c c This subroutine fixes up the periodic boundary conditions c in the xy plane after the particle positions have been updated c do 100 i = 1, antot ra(i,1,1) = ra(i,1,6) - xbox * anint(ra(i,1,6)/xbox) if (ra(i,1,1).eq.xbox2) ra(i,1,1) = -xbox2 ra(i,2,1) = ra(i,2,6) - ybox * anint(ra(i,2,6)/ybox) if (ra(i,2,1).eq.ybox2) ra(i,2,1) = -ybox2 ra(i,3,1) = ra(i,3,6) - zbox * anint(ra(i,3,6)/zbox) if (ra(i,3,1).eq.zbox2) ra(i,3,1) = -zbox2 100 continue return end ga-5-4/global/examples/md_cluster/atom.inp0000644000175000017500000000011012662210461016707 0ustar mbamba1.0 1.0 1.0 1.0 3 1, 1, 0, 1.0, 1.0 2, 2, 0, 1.0, 1.0 1, 2, 1, 1.0, 1.0 ga-5-4/global/examples/md_cluster/mdout.F0000644000175000017500000001343112662210461016510 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine mdout #include "common.fh" c integer pnum,idx,idy,idz,me c c This routine finishes off the calculation by writing c out accumulated information, final configurations etc. c pnum = ga_nnodes() me = ga_nodeid() call factor(pnum,idx,idy,idz) if (ga_nodeid().eq.0.and.l_stdio) then write(6,100) pnum write(6,200) idx,idy,idz write(6,300) failcount endif c call prtnrg call tmout call cluster_print_binr if (l_rst) call mdrst c return 100 format('Total number of processors used in simulation :',i9) 200 format('Processors configured as ',i2,' X ',i2,' X ',i2,' grid') 300 format('Total number of collision failures :',i9) end c subroutine header #include "common.fh" c integer oldstp save oldstp data oldstp /0/ c c this prints out the current MD time if time has c changed since the last call to this subroutine c if (ga_nodeid().ne.0) return if (istep.ne.oldstp.and.l_stdio) then write(6,1000) float(istep) * tau oldstp = istep endif return 1000 format(1x,'Statistics for MD time ',f16.4) end c subroutine mdrst #include "common.fh" c double precision x,y,z,rx,ry,rz double precision rbuf(3,MAXAT) integer i,inode,pnum,me,one,ld2,ld3 integer rptr,rnode,rtot,ibuf(2,MAXAT) character*32 filename c c This routine finishes off the calculation by writing c out accumulated information, final configurations etc. c c c Write out final configuration to file 'md.rst' c pnum = ga_nnodes() me = ga_nodeid() call sort c c write all coordinates and velocities to buffers c do i = 1, antot xcrd(i) = ra(i,1,1) ycrd(i) = ra(i,2,1) zcrd(i) = ra(i,3,1) xfrc(i) = ra(i,1,2) yfrc(i) = ra(i,2,2) zfrc(i) = ra(i,3,2) bidx(i) = aidx(i) bat(i) = at(i) end do btot = antot c c open file from node 0 and write out box size c if (task_id.lt.10) then write(filename,100) task_id else if (task_id.ge.10.and.task_id.lt.100) then write(filename,101) task_id else if (task_id.ge.100.and.task_id.lt.1000) then write(filename,102) task_id else if (task_id.ge.1000.and.task_id.lt.10000) then write(filename,103) task_id endif 100 format('md.rst',i1) 101 format('md.rst',i2) 102 format('md.rst',i3) 103 format('md.rst',i4) if (me.eq.0) then open(unit=10,file=filename,status='unknown') write(10,5400) atot write(10,5300) xbox,ybox,zbox,r_cluster endif c c get data from other nodes and write to md.rst c one = 1 ld2 = 2 ld3 = 3 c c exchange the size of lists and put coordinate data in c global arrays c rptr = gsize_lo(me) call nga_put(g_size,rptr,rptr,btot,one) c gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + btot - 1 giat_hi(1) = 2 giat_hi(2) = giat_lo(2,me) + btot - 1 do i = 1, btot rbuf(1,i) = xcrd(i) rbuf(2,i) = ycrd(i) rbuf(3,i) = zcrd(i) ibuf(1,i) = bidx(i) ibuf(2,i) = bat(i) end do if (btot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,rbuf,ld3) if (btot.gt.0) call nga_put(g_iat,giat_lo(1,me), + giat_hi,ibuf,ld2) c gfrc_hi(1) = 3 gfrc_hi(2) = gfrc_lo(2,me) + btot - 1 do i = 1, btot rbuf(1,i) = xfrc(i) rbuf(2,i) = yfrc(i) rbuf(3,i) = zfrc(i) end do if (btot.gt.0) call nga_put(g_frc,gfrc_lo(1,me),gfrc_hi,rbuf,ld3) call ga_sync() c do inode = 0, pnum - 1 if (me.eq.0) then rptr = gsize_lo(inode) call nga_get(g_size,rptr,rptr,rtot,one) gcoords_hi(2) = gcoords_lo(2,inode) + rtot - 1 giat_hi(2) = giat_lo(2,inode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,inode), + gcoords_hi,rbuf,ld3) if (rtot.gt.0) call nga_get(g_iat,giat_lo(1,inode), + giat_hi,ibuf,ld2) do i = 1, rtot xcrd(i) = rbuf(1,i) ycrd(i) = rbuf(2,i) zcrd(i) = rbuf(3,i) bidx(i) = ibuf(1,i) bat(i) = ibuf(2,i) end do gfrc_hi(2) = gfrc_lo(2,inode) + rtot - 1 if (rtot.gt.0) call nga_get(g_frc,gfrc_lo(1,inode), + gfrc_hi,rbuf,ld3) do i = 1, rtot xfrc(i) = rbuf(1,i) yfrc(i) = rbuf(2,i) zfrc(i) = rbuf(3,i) end do c do i = 1, rtot if (istop.eq.1) then write(10,5000) bat(i),xcrd(i),ycrd(i),zcrd(i) else write(10,5100) bat(i),xcrd(i),ycrd(i),zcrd(i), + xfrc(i),yfrc(i),zfrc(i) endif end do endif end do if (me.eq.0) close(10) c 5000 format (i8,3(1pe13.5)) 5100 format (i8,6(1pe13.5)) 5300 format (4(1pe16.8)) 5400 format (i8) c return end ga-5-4/global/examples/md_cluster/gather.F0000644000175000017500000004346112662210461016640 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine gather #include "common.fh" c double precision xmax,ymax,zmax,xmin,ymin,zmin double precision tbeg,wraptime integer snode,rnode,pnum,idx,idy,idz,ipx,ipy,ipz integer i,is,ig,inx,iny,inz,stot,inode logical nolist c c This subroutine gathers the coordinates of all particles on c neighboring processors that lie within an interaction distance c of the domain boundaries corresponding to the local processor c tbeg = wraptime() c if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) then nolist = .true. else nolist = .false. endif c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c if (task_id.gt.3) then c write(6,*) ga_pgroup_nodeid(ga_pgroup_get_world()), c + 'Nolist is ',nolist c write(6,157) ga_pgroup_nodeid(ga_pgroup_get_world()), c + idx,idy,idz c 157 format(i3,' Proc dimensions are ',3i6) c endif c c determine local boundaries c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 c btot = 0 c c Send particles along x-axis. Gather all particles that are within c an interaction distance of the x-boundaries and send them to the c adjacent processors c if (idx.eq.2) then c c both boundaries are adjacent to boundaries on next processor c stot = 0 if (nolist) then ixgru = 0 do i = 1, antot if (xmax-ra(i,1,1).lt.rcmax.or. + (ra(i,1,1)-xmin).lt.rcmax) then ixgru = ixgru + 1 xgru(ixgru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, ixgru ig = xgru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c c send boundary layer particles to next buffer c inx = ipx - 1 if (inx.eq.-1) inx = idx - 1 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call gather_buf(rnode,stot) elseif (idx.gt.2) then c c each boundary is adjacent to a different processor c stot = 0 if (nolist) then ixgru = 0 do i = 1, antot if (xmax-ra(i,1,1).lt.rcmax) then ixgru = ixgru + 1 xgru(ixgru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, ixgru ig = xgru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c c send boundary layer particles to next buffer c inx = ipx - 1 if (inx.eq.-1) inx = idx - 1 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call gather_buf(rnode,stot) c stot = 0 if (nolist) then ixgrd = 0 do i = 1, antot if (ra(i,1,1)-xmin.lt.rcmax) then ixgrd = ixgrd + 1 xgrd(ixgrd) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, ixgrd ig = xgrd(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c c send boundary layer particles to next buffer c inx = ipx + 1 if (inx.eq.idx) inx = 0 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call gather_buf(rnode,stot) endif c c repeat for y axis c if (idy.eq.2) then c c both boundaries are adjacent to boundaries on next processor c stot = 0 if (nolist) then iygru = 0 do i = 1, antot if ((ymax-ra(i,2,1).lt.rcmax.or. + (ra(i,2,1)-ymin).lt.rcmax)) then iygru = iygru + 1 ygru(iygru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, iygru ig = ygru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then iygbu = 0 do i = 1, btot if ((ymax-ycrd(i).lt.rcmax.or. + (ycrd(i)-ymin).lt.rcmax)) then iygbu = iygbu + 1 ygbu(iygbu) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, iygbu ig = ygbu(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c iny = ipy - 1 if (iny.eq.-1) iny = idy - 1 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call gather_buf(rnode,stot) elseif (idy.gt.2) then c c each boundary is adjacent to a different processor c stot = 0 if (nolist) then iygru = 0 do i = 1, antot if (ymax-ra(i,2,1).lt.rcmax) then iygru = iygru + 1 ygru(iygru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, iygru ig = ygru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then iygbu = 0 do i = 1, btot if (ymax-ycrd(i).lt.rcmax) then iygbu = iygbu + 1 ygbu(iygbu) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, iygbu ig = ygbu(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c iny = ipy - 1 if (iny.eq.-1) iny = idy - 1 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call gather_buf(rnode,stot) c stot = 0 if (nolist) then iygrd = 0 do i = 1, antot if (ra(i,2,1)-ymin.lt.rcmax) then iygrd = iygrd + 1 ygrd(iygrd) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, iygrd ig = ygrd(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then iygbd = 0 do i = 1, btot if (ycrd(i)-ymin.lt.rcmax.and.ycrd(i).gt.ymin) then iygbd = iygbd + 1 ygbd(iygbd) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, iygbd ig = ygbd(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c iny = ipy + 1 if (iny.eq.idy) iny = 0 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call gather_buf(rnode,stot) endif c c repeat for z axis c if (idz.eq.2) then c c both boundaries are adjacent to boundaries on next processor c stot = 0 if (nolist) then izgru = 0 do i = 1, antot if ((zmax-ra(i,3,1).lt.rcmax.or. + ra(i,3,1)-zmin.lt.rcmax)) then izgru = izgru + 1 zgru(izgru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, izgru ig = zgru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then izgbu = 0 do i = 1, btot if ((zmax-zcrd(i).lt.rcmax.or. + zcrd(i)-zmin.lt.rcmax)) then izgbu = izgbu + 1 zgbu(izgbu) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, izgbu ig = zgbu(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c inz = ipz - 1 if (inz.eq.-1) inz = idz - 1 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call gather_buf(rnode,stot) elseif (idz.gt.2) then c c each boundary is adjacent to a different processor c stot = 0 if (nolist) then izgru = 0 do i = 1, antot if (zmax-ra(i,3,1).lt.rcmax) then izgru = izgru + 1 zgru(izgru) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, izgru ig = zgru(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then izgbu = 0 do i = 1, btot if (zmax-zcrd(i).lt.rcmax) then izgbu = izgbu + 1 zgbu(izgbu) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, izgbu ig = zgbu(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c inz = ipz - 1 if (inz.eq.-1) inz = idz - 1 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call gather_buf(rnode,stot) c stot = 0 if (nolist) then izgrd = 0 do i = 1, antot if (ra(i,3,1)-zmin.lt.rcmax) then izgrd = izgrd + 1 zgrd(izgrd) = i stot = stot + 1 is = btot+stot xcrd(is) = ra(i,1,1) ycrd(is) = ra(i,2,1) zcrd(is) = ra(i,3,1) bidx(is) = aidx(i) bat(is) = at(i) endif end do else do i = 1, izgrd ig = zgrd(i) stot = stot + 1 is = btot+stot xcrd(is) = ra(ig,1,1) ycrd(is) = ra(ig,2,1) zcrd(is) = ra(ig,3,1) bidx(is) = aidx(ig) bat(is) = at(ig) end do endif c if (nolist) then izgbd = 0 do i = 1, btot if (zcrd(i)-zmin.lt.rcmax.and.zcrd(i).gt.zmin) then izgbd = izgbd + 1 zgbd(izgbd) = i stot = stot + 1 is = btot+stot xcrd(is) = xcrd(i) ycrd(is) = ycrd(i) zcrd(is) = zcrd(i) bidx(is) = bidx(i) bat(is) = bat(i) endif end do else do i = 1, izgbd ig = zgbd(i) stot = stot + 1 is = btot+stot xcrd(is) = xcrd(ig) ycrd(is) = ycrd(ig) zcrd(is) = zcrd(ig) bidx(is) = bidx(ig) bat(is) = bat(ig) end do endif c c send boundary layer particles to next buffer c inz = ipz + 1 if (inz.eq.idz) inz = 0 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call gather_buf(rnode,stot) endif c call heapsort(1) cdbg do i = 1, antot cdbg write(6,178) inode,i,aidx(i) cdbg end do cdbg 178 format(i3,' Gather aidx(',i3,'): ',i8) cdbg do i = 1, btot cdbg write(6,179) inode,i,bidx(i) cdbg end do cdbg 179 format(i3,' Gather bidx(',i3,'): ',i8) c tmstat(6) = tmstat(6) + wraptime() - tbeg c return end c subroutine gather_buf(rnode,stot) #include "common.fh" c double precision buf(3,MAXAT) integer ibuf(2,MAXAT) double precision tbeg,wraptime integer rnode,i integer me,one,ld2,ld3,is,rtot,stot c c Get data from processor rnode. The amount of data on the c current processor that actually needs to be accessed c represents stot particles. c me = ga_nodeid() one = 1 ld2 = 2 ld3 = 3 c c exchange the size of lists c tbeg = wraptime() c do i = btot+1, btot+stot is = i - btot buf(1,is) = xcrd(i) buf(2,is) = ycrd(i) buf(3,is) = zcrd(i) ibuf(1,is) = bidx(i) ibuf(2,is) = bat(i) end do c gsize_hi = gsize_lo(me) call nga_put(g_size,gsize_lo(me),gsize_hi,stot,one) gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,buf,ld3) giat_hi(1) = 2 giat_hi(2) = giat_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_iat,giat_lo(1,me),giat_hi,ibuf,ld2) call ga_sync() gsize_hi = gsize_lo(rnode) call nga_get(g_size,gsize_lo(rnode),gsize_hi,rtot,one) gcoords_hi(2) = gcoords_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,rnode), + gcoords_hi,buf,ld3) giat_hi(2) = giat_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_iat,giat_lo(1,rnode), + giat_hi,ibuf,ld2) c do i = btot+1, btot+rtot is = i - btot xcrd(i) = buf(1,is) ycrd(i) = buf(2,is) zcrd(i) = buf(3,is) bidx(i) = ibuf(1,is) bat(i) = ibuf(2,is) end do c call ga_sync() btot = btot+rtot c tmstat(11) = tmstat(11) + wraptime() - tbeg c return end ga-5-4/global/examples/md_cluster/mdstep.F0000644000175000017500000002043312662210461016654 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine mdstep #include "common.fh" c double precision vbox, rmax integer i,j,me logical newcfg double precision cluster_check_radius logical debug if (istep.gt.3930438) then debug = .false. else debug = .false. endif c c This routine guides the MD steps. c Begin the main loop through the MD steps c me = ga_nodeid() r_confine = 0.0d00 do 5000 istep = 1, nstep c newcfg = .false. mbflg = .false. cmflg = .false. ipmode = 0 t_rmndr = tau t_done = 0.0d00 cllsn_cnt = 0 c c Check to see if there are any special instructions c do 100 i = 1, nsc c c is end >= istep >= beg c if ((istep.ge.isc(i,1)).and.(istep.le.isc(i,2))) then c c is mod(istep-beg,inc) = 0 c if (mod(istep,isc(i,3)).eq.0) then c c get next configuration using the appropriate algorithm c if (isc(i,4).eq.1) then call estep newcfg = .true. elseif (isc(i,4).eq.2) then prssr = rsc(i,2) pmass = rsc(i,4) call pstep newcfg = .true. elseif (isc(i,4).eq.3) then tmprtr = rsc(i,1) prssr = rsc(i,2) pmass = rsc(i,4) call sstep newcfg = .true. elseif (isc(i,4).eq.4) then tmprtr = rsc(i,1) tmass = rsc(i,3) call tstep newcfg = .true. elseif (isc(i,4).eq.5) then tmprtr = rsc(i,1) prssr = rsc(i,2) tmass = rsc(i,3) pmass = rsc(i,4) call ptstep newcfg = .true. elseif (isc(i,4).eq.6) then tmprtr = rsc(i,1) call mbstep newcfg = .true. elseif (isc(i,4).eq.7) then itarg = isc(i,2) tmprtr = rsc(i,1) tvol = rsc(i,2) tmass = rsc(i,3) call vlstep newcfg = .true. elseif (isc(i,4).eq.8) then tmprtr = rsc(i,1) call kstep newcfg = .true. elseif (isc(i,4).eq.9) then tmprtr = rsc(i,1) prssr = rsc(i,2) tmass = rsc(i,3) pmass = rsc(i,4) ipmode = 1 call ptstep newcfg = .true. elseif (isc(i,4).eq.10) then tmprtr = rsc(i,1) prssr = rsc(i,2) tmass = rsc(i,3) pmass = rsc(i,4) ipmode = 2 call ptstep newcfg = .true. endif endif endif 100 continue c c get next configuration if no special step is taken c if (.not.newcfg) then if (dflalg.eq.1) then call estep elseif (dflalg.eq.2) then prssr = dfprs pmass = dfpm call pstep elseif (dflalg.eq.3) then tmprtr = dftmp prssr = dfprs pmass = dfpm call sstep elseif (dflalg.eq.4) then tmprtr = dftmp tmass = dftm call tstep elseif (dflalg.eq.5) then tmprtr = dftmp prssr = dfprs tmass = dftm pmass = dfpm call ptstep elseif (dflalg.eq.6) then tmprtr = dftmp call mbstep elseif (dflalg.eq.9) then tmprtr = dftmp prssr = dfprs tmass = dftm pmass = dfpm ipmode = 1 call ptstep elseif (dflalg.eq.10) then tmprtr = dftmp prssr = dfprs tmass = dftm pmass = dfpm ipmode = 2 call ptstep endif endif if (debug) then write(6,*) ga_nodeid(),' Got to 1 at step ',istep endif c c Update remaining energy quantities c nrg(3) = nrg(4) + nrg(6) vbox = xbox*ybox*zbox nrg(7) = nrg(5) * dble(atot-1) / vbox + nrg(15) if (istep.eq.equil_1) then call fixper do i = 1, antot do j = 1, 3 ra(i,j,6) = ra(i,j,1) end do end do call cluster_com call cluster_center rmax = cluster_check_radius() if (rmax.gt.r_cluster) r_cluster = rmax + 0.01 endif if (mod(istep,mcfreq).eq.0.and.istep.gt.equil_1) then call cluster_mc if (me.eq.0.and.l_rad) write(7,7100) dble(istep)*tau,r_cluster endif if (debug) then write(6,*) ga_nodeid(),' Got to 2 at step ',istep endif if (istep.gt.equil_2.and.r_cluster.le.cl_upper) + call cluster_binr if (debug) then write(6,*) ga_nodeid(),' Got to 3 at step ',istep endif if (istep.eq.window_1) call cluster_reset_binr(1) if (istep.eq.window_2) call cluster_reset_binr(2) c c Perform all statistical operations c on the new configuration. c c print pressure c if (mod(istep,istat).eq.0.and.l_stdio) then call header(istep) if (me.eq.0) write(6,6000) nrg(7) if (me.eq.0) write(6,6300) nrg(3) if (me.eq.0) write(6,6700) nrg(6),nrg(4),nrg(5) if (me.eq.0) write(6,6800) xbox,ybox,zbox,scal1 if (me.eq.0) write(6,6100) nrg(13),nrg(14), + nrg(17),nrg(21) if (me.eq.0) write(6,6900) nrg(9) endif c c accumulate energy statistics c if (istep.gt.equil_2) call estat c if (me.eq.0.and.l_step.and.mod(istep,1000).eq.0) then open(unit=2,file='step.cnt',status='unknown') write(2,*) 'proc : ',ga_pgroup_nodeid(ga_pgroup_get_world()) write(2,*) 'istep : ',istep write(2,6900) nrg(9) write(2,6100) nrg(13),nrg(14),nrg(17),nrg(21) write(2,6000) nrg(7) write(2,6300) nrg(3) write(2,6700) nrg(6),nrg(4),nrg(5) write(2,6800) xbox,ybox,zbox,scal1 write(2,7000) r_cluster write(2,7200) cl_lower write(2,7300) cl_upper close(2) endif 5000 continue return 6000 format(1x,'The instantaneous pressure is ',f12.4) 6100 format(1x,'Current energy statistics'/ + ' repulsion: ',f16.4,/ + ' dispersion: ',f16.4,/ + ' bonds: ',f16.4,/ + ' angles: ',f16.4) 6200 format(1x,'Statistics at time ',i6,' ps') 6300 format(1x,'The total energy is ',f12.4) 6700 format(' potential kinetic'/ + ' energy energy temperature'/, + 1x,3f13.3) 6800 format(1x,'The current simulation cell dimensions:'/ + ' x: ',f16.4,/ + ' y: ',f16.4,/ + ' z: ',f16.4,/ + ' s: ',f16.4) 6820 format(1x,'The current simulation cell dimensions:'/ + ' x: ',f16.4,/ + ' y: ',f16.4,/ + ' s: ',f16.4) 6900 format(1x,'The instantaneous value of the Hamiltonian is ',f12.4) 7000 format(1x,'The current value of confining sphere is ',f12.4) 7100 format(2f16.8) 7200 format(1x,'Lower bound of confining sphere ',f12.4) 7300 format(1x,'Upper bound of confining sphere ',f12.4) end ga-5-4/global/examples/md_cluster/scatter.F0000644000175000017500000005325512662210461017035 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine scatter #include "common.fh" c double precision xmax,xmin,ymax,ymin,zmax,zmin double precision xcell,ycell,zcell double precision tbeg,wraptime integer snode,rnode,pnum,inode,idx,idy,idz,ipx,ipy,ipz integer stot,i,inx,iny,inz logical nolist c c This subroutine scatters the forces of all particles on c neighboring processors back to their home processors after the c forces have been calculated. c tbeg = wraptime() pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) then nolist = .true. else nolist = .false. endif c c determine local boundaries c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 xcell = xbox/dble(idx) ycell = ybox/dble(idy) zcell = zbox/dble(idz) c c Send particles along x-axis. c c if (idx.gt.1) then if (idx.eq.2) then stot = 0 savtot = 0 if (nolist) then do i = 1, btot if (xcrd(i).lt.xmin.or.xcrd(i).ge.xmax) then xsbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else xsbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (xsbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif else stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((xcrd(i).ge.xmax.and.xcrd(i)-xmax.lt.xcell).or. + (xcrd(i).lt.xmin.and.xmin-xcrd(i).gt.xcell)) then xsbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else xsbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (xsbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif endif c inx = ipx - 1 if (inx.eq.-1) inx = idx - 1 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(1) endif c if (idx.gt.2) then c stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((xcrd(i).lt.xmin.and.xmin-xcrd(i).lt.xcell).or. + (xcrd(i).gt.xmax.and.xcrd(i)-xmax.gt.xcell)) then xsbd(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else xsbd(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (xsbd(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif c inx = ipx + 1 if (inx.eq.idx) inx = 0 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(2) c endif c c Send particles along y-axis. c if (idy.gt.1) then c if (idy.eq.2) then stot = 0 savtot = 0 if (nolist) then do i = 1, btot if (ycrd(i).lt.ymin.or.ycrd(i).ge.ymax) then ysbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else ysbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (ysbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif else stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((ycrd(i).ge.ymax.and.ycrd(i)-ymax.lt.ycell).or. + (ycrd(i).lt.ymin.and.ymin-ycrd(i).gt.ycell)) then ysbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else ysbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (ysbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif endif c iny = ipy - 1 if (iny.eq.-1) iny = idy - 1 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(3) c endif c if (idy.gt.2) then c stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((ycrd(i).lt.ymin.and.ymin-ycrd(i).lt.ycell).or. + (ycrd(i).gt.ymax.and.ycrd(i)-ymax.gt.ycell)) then ysbd(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else ysbd(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (ysbd(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif c iny = ipy + 1 if (iny.eq.idy) iny = 0 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(4) c endif c c send particles along z-axis c if (idz.gt.1) then c if (idz.eq.2) then stot = 0 savtot = 0 if (nolist) then do i = 1, btot if (zcrd(i).lt.zmin.or.zcrd(i).ge.zmax) then zsbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else zsbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (zsbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif else stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((zcrd(i).ge.zmax.and.zcrd(i)-zmax.lt.zcell).or. + (zcrd(i).lt.zmin.and.zmin-zcrd(i).gt.zcell)) then zsbu(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else zsbu(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (zsbu(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif endif c inz = ipz - 1 if (inz.eq.-1) inz = idz - 1 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(5) c endif c if (idz.gt.2) then c stot = 0 savtot = 0 if (nolist) then do i = 1, btot if ((zcrd(i).lt.zmin.and.zmin-zcrd(i).lt.zcell).or. + (zcrd(i).gt.zmax.and.zcrd(i)-zmax.gt.zcell)) then zsbd(i) = .true. stot = stot + 1 xcrd(btot+stot) = xcrd(i) ycrd(btot+stot) = ycrd(i) zcrd(btot+stot) = zcrd(i) xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else zsbd(i) = .false. savtot = savtot + 1 xcrd(savtot) = xcrd(i) ycrd(savtot) = ycrd(i) zcrd(savtot) = zcrd(i) xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do else do i = 1, btot if (zsbd(i)) then stot = stot + 1 xfrc(btot+stot) = xfrc(i) yfrc(btot+stot) = yfrc(i) zfrc(btot+stot) = zfrc(i) bidx(btot+stot) = bidx(i) else savtot = savtot + 1 xfrc(savtot) = xfrc(i) yfrc(savtot) = yfrc(i) zfrc(savtot) = zfrc(i) bidx(savtot) = bidx(i) endif end do endif c inz = ipz + 1 if (inz.eq.idz) inz = 0 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call scatter_buf(rnode,stot) c call heapsort(1) call fcull(6) c endif c tmstat(7) = tmstat(7) + wraptime() - tbeg c return end c subroutine scatter_buf(rnode,stot) #include "common.fh" c double precision cbuf(3,MAXAT),fbuf(3,MAXAT) integer ibuf(MAXAT) double precision tbeg, tbeg1, wraptime integer i,rnode integer me,one,ld,is,rtot,stot logical crdflag c c Get the forces from processor rnode. The amount of data c on the current processor that actually needs to be c accessed represents stot particles c me = ga_nodeid() one = 1 ld = 3 c c exchange the size of lists c tbeg = wraptime() c if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) then crdflag = .true. else crdflag = .false. endif c if (crdflag) then do i = btot + 1, btot + stot is = i - btot cbuf(1,is) = xcrd(i) cbuf(2,is) = ycrd(i) cbuf(3,is) = zcrd(i) end do endif do i = btot + 1, btot + stot is = i - btot fbuf(1,is) = xfrc(i) fbuf(2,is) = yfrc(i) fbuf(3,is) = zfrc(i) ibuf(is) = bidx(i) end do c gsize_hi = gsize_lo(me) call nga_put(g_size,gsize_lo(me),gsize_hi,stot,one) if (crdflag) then gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,cbuf,ld) endif gfrc_hi(1) = 3 gfrc_hi(2) = gfrc_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_frc,gfrc_lo(1,me),gfrc_hi,fbuf,ld) gindex_hi = gindex_lo(me) + stot - 1 if (stot.gt.0) call nga_put(g_index,gindex_lo(me), + gindex_hi,ibuf,ld) tbeg1 = wraptime() call ga_sync() tmstat(16) = tmstat(16) + wraptime() - tbeg1 btot = savtot gsize_hi = gsize_lo(rnode) call nga_get(g_size,gsize_lo(rnode),gsize_hi,rtot,one) if (crdflag) then gcoords_hi(2) = gcoords_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,rnode), + gcoords_hi,cbuf,ld) endif gfrc_hi(2) = gfrc_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_frc,gfrc_lo(1,rnode), + gfrc_hi,fbuf,ld) gindex_hi = gindex_lo(rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_index,gindex_lo(rnode), + gindex_hi,ibuf,ld) c if (crdflag) then do i = btot+1, btot+rtot is = i - btot xcrd(i) = cbuf(1,is) ycrd(i) = cbuf(2,is) zcrd(i) = cbuf(3,is) end do endif do i = btot+1, btot+rtot is = i - btot xfrc(i) = fbuf(1,is) yfrc(i) = fbuf(2,is) zfrc(i) = fbuf(3,is) bidx(i) = ibuf(is) end do c call ga_sync() btot = btot+rtot if (btot.gt.MAXAT) then call ga_error("Array overflow in scatter_buf",btot) endif c tmstat(12) = tmstat(12) + wraptime() - tbeg c return end c subroutine fcull(iflg) #include "common.fh" c double precision xmax,xmin,ymax,ymin,zmax,zmin integer pnum,inode,idx,idy,idz,ipx,ipy,ipz integer i,is,icnt,iflg,get_hash_a logical nolist c c This subroutine culls the forces of particles in the buffers c back on to the particles on the home processor c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) then nolist = .true. else nolist = .false. endif c c determine local boundaries c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 c icnt = 0 is = 1 if (nolist) then do i = 1, btot if ((xcrd(i).lt.xmax.and.xcrd(i).ge.xmin).and. + (ycrd(i).lt.ymax.and.ycrd(i).ge.ymin).and. + (zcrd(i).lt.zmax.and.zcrd(i).ge.zmin)) then clist(iflg,i) = .true. is = get_hash_a(bidx(i)) if (is.gt.0) then ra(is,1,4) = ra(is,1,4) + xfrc(i) ra(is,2,4) = ra(is,2,4) + yfrc(i) ra(is,3,4) = ra(is,3,4) + zfrc(i) else call ga_error("Unknown atom index: ",i) endif else clist(iflg,i) = .false. icnt = icnt + 1 xcrd(icnt) = xcrd(i) ycrd(icnt) = ycrd(i) zcrd(icnt) = zcrd(i) xfrc(icnt) = xfrc(i) yfrc(icnt) = yfrc(i) zfrc(icnt) = zfrc(i) bidx(icnt) = bidx(i) endif end do else do i = 1, btot if (clist(iflg,i)) then is = get_hash_a(bidx(i)) if (is.gt.0) then ra(is,1,4) = ra(is,1,4) + xfrc(i) ra(is,2,4) = ra(is,2,4) + yfrc(i) ra(is,3,4) = ra(is,3,4) + zfrc(i) else call ga_error("Unknown atom index: ",i) endif else icnt = icnt + 1 xfrc(icnt) = xfrc(i) yfrc(icnt) = yfrc(i) zfrc(icnt) = zfrc(i) bidx(icnt) = bidx(i) endif end do endif btot = icnt if (btot.gt.MAXAT) then call ga_error("Array overflow in fcull",btot) endif c return end ga-5-4/global/examples/md_cluster/newcfg.F0000644000175000017500000001435212662210461016634 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine newcfg(natom1,natom2,itask,rcluster,rcut) implicit none integer natom1, natom2, itask integer n, nc, nx, ny, nz, ntot parameter ( nc = 50, n = 2*nc ** 3) double precision lj(3,2) double precision cell,cell2,mult,xadd,yadd,zadd double precision multx,multy,multz,cmx,cmy,cmz double precision x,y,z,dx,dy,dz,rcluster,r,rx,ry,rz,rmax double precision volume, radius, pi, rcut double precision coords(n, 3) integer i, j, ix, iy, iz, iref, m, mp, mp1, mp4 integer one,two,nside, irad, ixcent, iycent, izcent integer ixmin,ixmax,iymin,iymax,izmin,izmax integer fill(nc,nc,nc,2), icnt character*32 filename c c ******************************************************* c mult = 1.5d00 lj(1,1) = 0.0d00 lj(2,1) = 0.0d00 lj(3,1) = 0.0d00 lj(1,2) = mult/2.0d00 lj(2,2) = mult/2.0d00 lj(3,2) = mult/2.0d00 c one = 1 two = 2 c if (itask.lt.10) then write(filename,100) itask else if (itask.ge.10.and.itask.lt.100) then write(filename,101) itask else if (itask.ge.100.and.itask.lt.1000) then write(filename,102) itask else if (itask.ge.1000.and.itask.lt.10000) then write(filename,103) itask endif 100 format('md.cfg',i1) 101 format('md.cfg',i2) 102 format('md.cfg',i3) 103 format('md.cfg',i4) open (unit=2,file=filename,status='unknown',form='formatted') c nside = nint((0.5d00*dble(natom1+natom2))**(1.0d00/3.0d00)) if (2*nside**3.lt.natom1+natom2) nside = nside+1 pi = 4.0d00*atan(1.0d00) volume = 0.5d00*dble(natom2)*mult**3 radius = 3.0d00*volume/(4.0d00*pi) radius = radius**(1.0d00/3.0d00) irad = int(radius/mult) + 1 if (2*irad.ge.nside) nside = 2*irad+2 do ix = 1, nside do iy = 1, nside do iz = 1, nside fill(ix,iy,iz,1) = 0 fill(ix,iy,iz,2) = 0 end do end do end do multx = mult * float(nside) multy = mult * float(nside) multz = mult * float(nside) cell = mult cell2 = 0.5d00 * cell dx = multx/float(nside) dy = multy/float(nside) dz = multz/float(nside) volume = 0.5d00*dble(natom2)*mult**3 radius = 3.0d00*volume/(4.0d00*pi) radius = radius**(1.0d00/3.0d00) irad = int(radius/mult) + 1 ixcent = nside/2 iycent = nside/2 izcent = nside/2 ixmin = ixcent - irad ixmax = ixcent + irad 300 icnt = 0 do ix = ixmin, ixmax iy = int(sqrt(dble(irad)**2-dble(ix-ixcent)**2)) iymin = iycent - iy iymax = iycent + iy do iy = iymin, iymax iz = int(sqrt(dble(irad)**2-dble(ix-ixcent)**2 + -dble(iy-iycent)**2)) izmin = izcent - iz izmax = izcent + iz do iz = izmin, izmax xadd = dx*float(ix-1) - multx/2.0d00 yadd = dy*float(iy-1) - multy/2.0d00 zadd = dz*float(iz-1) - multz/2.0d00 if (fill(ix,iy,iz,1).eq.0.and.icnt.lt.natom2) then icnt = icnt + 1 coords(natom1+icnt,1) = xadd + lj(1,1) coords(natom1+icnt,2) = yadd + lj(2,1) coords(natom1+icnt,3) = zadd + lj(3,1) fill(ix,iy,iz,1) = 1 endif if (fill(ix,iy,iz,2).eq.0.and.icnt.lt.natom2) then icnt = icnt + 1 coords(natom1+icnt,1) = xadd + lj(1,2) coords(natom1+icnt,2) = yadd + lj(2,2) coords(natom1+icnt,3) = zadd + lj(3,2) fill(ix,iy,iz,2) = 1 endif end do end do end do if (icnt.lt.natom2) then irad = irad+1 go to 300 endif c c Find center of mass of cluster c rx = 0.0d00 ry = 0.0d00 rz = 0.0d00 do icnt = 1, natom2 rx = rx + coords(natom1+icnt,1) ry = ry + coords(natom1+icnt,2) rz = rz + coords(natom1+icnt,3) end do cmx = rx/dble(natom2) cmy = ry/dble(natom2) cmz = rz/dble(natom2) rmax = rmax + sqrt(dx**2+dy**2+dz**2) c c Find radius of cluster c rmax = 0.0d00 do icnt = 1, natom2 rx = coords(natom1+icnt,1) - cmx ry = coords(natom1+icnt,2) - cmy rz = coords(natom1+icnt,3) - cmz r = sqrt(rx**2 + ry**2 + rz**2) if (r.gt.rmax) rmax = r end do rmax = rmax + 0.1 c icnt = 0 do ix = 1, nside do iy = 1, nside do iz = 1, nside xadd = dx*float(ix-1) - multx/2.0d00 yadd = dy*float(iy-1) - multy/2.0d00 zadd = dz*float(iz-1) - multz/2.0d00 if (fill(ix,iy,iz,1).eq.0.and.icnt.lt.natom1) then icnt = icnt + 1 coords(icnt,1) = xadd + lj(1,1) coords(icnt,2) = yadd + lj(2,1) coords(icnt,3) = zadd + lj(3,1) fill(ix,iy,iz,1) = 1 endif if (fill(ix,iy,iz,2).eq.0.and.icnt.lt.natom1) then icnt = icnt + 1 coords(icnt,1) = xadd + lj(1,2) coords(icnt,2) = yadd + lj(2,2) coords(icnt,3) = zadd + lj(3,2) fill(ix,iy,iz,2) = 1 endif end do end do end do c rcluster = rmax c c If there are no atoms of type 1, then assume cluster is c isolated and set size to 100 LJ units c if (natom1.eq.0) then multx = 25.0 multy = 25.0 multz = 25.0 endif if (rcluster.lt.rcut) then rcluster = rcut endif write(2,2100) natom1+natom2 write(2,2000) multx,multy,multz,rcluster do i = 1, natom1 coords(i,1) = coords(i,1) - cmx coords(i,2) = coords(i,2) - cmy coords(i,3) = coords(i,3) - cmz write(2,200) one,(coords(i,j),j=1,3) end do do i = natom1+1, natom1+natom2 coords(i,1) = coords(i,1) - cmx coords(i,2) = coords(i,2) - cmy coords(i,3) = coords(i,3) - cmz write(2,200) two,(coords(i,j),j=1,3) end do c 200 format (i5,3f12.5) 2000 format (4f16.8) 2100 format (i8) close(2) return end ga-5-4/global/examples/md_cluster/ran3.F0000644000175000017500000000305212662210461016221 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c This is really ran3 c function ran1(idum) c c Random number generator from Numerical Recipes c c implicit real*4(m) c parameter (mbig=4000000.,mseed=1618033.,mz=0.,fac=2.5e-7) implicit real*8 (a-h,o-z) parameter (mbig=1000000000,mseed=161803398,mz=0,fac=1.e-9) dimension ma(55) data iff /0/ save iff, mj, ma, mk, inext, inextp if(idum.lt.0.or.iff.eq.0)then iff=1 mj=mseed-iabs(idum) mj=mod(mj,mbig) ma(55)=mj mk=1 do 11 i=1,54 ii=mod(21*i,55) ma(ii)=mk mk=mj-mk if(mk.lt.mz)mk=mk+mbig mj=ma(ii) 11 continue do 13 k=1,4 do 12 i=1,55 ma(i)=ma(i)-ma(1+mod(i+30,55)) if(ma(i).lt.mz)ma(i)=ma(i)+mbig 12 continue 13 continue inext=0 inextp=31 idum=1 endif inext=inext+1 if(inext.eq.56)inext=1 inextp=inextp+1 if(inextp.eq.56)inextp=1 mj=ma(inext)-ma(inextp) if(mj.lt.mz)mj=mj+mbig ma(inext)=mj ran1=mj*fac return end c function gasdev(idum) implicit real*8 (a-h,o-z) data iset/0/ save iset, gset if (iset.eq.0) then 1 v1=2.*ran1(idum)-1. v2=2.*ran1(idum)-1. r=v1**2+v2**2 if(r.ge.1.)go to 1 fac=sqrt(-2.*log(r)/r) gset=v1*fac gasdev=v2*fac iset=1 else gasdev=gset iset=0 endif return end ga-5-4/global/examples/md_cluster/nextc.F0000644000175000017500000004625712662210461016515 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine estep #include "common.fh" integer iter iter = 0 c prsflg = .false. tmpflg = .false. ptflg = .false. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in estep',istep) endif end do c return end c subroutine pstep #include "common.fh" integer iter iter = 0 c prsflg = .true. tmpflg = .false. ptflg = .false. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in pstep',istep) endif end do c return end c subroutine tstep #include "common.fh" integer iter iter = 0 c prsflg = .false. tmpflg = .true. ptflg = .false. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in tstep',istep) endif end do c return end c subroutine sstep #include "common.fh" c double precision scale integer i,j integer iter iter = 0 c c This subroutine scales the atomic velocities and momenta c so that the system temperature corresponds to the desired c temperature. c if (nrg(5).gt.0.0d00) then scale = sqrt(tmprtr / nrg(5)) else scale = 1.0d00 endif do 200 j = 1, 3 do 100 i = 1, antot ra(i,j,2) = scale * ra(i,j,2) ra(i,j,5) = scale * ra(i,j,5) 100 continue 200 continue prsflg = .false. tmpflg = .false. ptflg = .false. mbflg = .true. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in sstep',istep) endif end do c return end c subroutine kstep #include "common.fh" c double precision scale,ke integer i,j integer iter iter = 0 c c This subroutine adjusts the kinetic energy so that the c average temperature corresponds to the target temperature c if (itavg.gt.0) then tavg = tavg / dble(itavg) ke = nrg(2) * (tmprtr - tavg) scale = (nrg(4) + ke)/nrg(4) else scale = 0.0d00 endif if (scale.gt.0.0d00) then scale = sqrt(scale) else scale = 1.0d00 endif do 200 j = 1, 3 do 100 i = 1, antot ra(i,j,2) = scale * ra(i,j,2) ra(i,j,5) = scale * ra(i,j,5) 100 continue 200 continue tavg = 0.0d00 itavg = 0 prsflg = .false. tmpflg = .false. ptflg = .false. mbflg = .true. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in kstep',istep) endif end do c return end c subroutine ptstep #include "common.fh" integer iter iter = 0 c prsflg = .false. tmpflg = .false. ptflg = .true. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in ptstep',istep) endif end do return end c subroutine mbstep #include "common.fh" c double precision scl,gasdev integer i,j integer iter iter = 0 c c This subroutine updates configuration if only a single c configuration is available. It starts by assigning a c Boltzmann distribution of velocities and momenta to all c the atoms and then calculating the next configuration c using a regular Gear step. c c generate atomic velocities c do 200 j = 1, 3 do 100 i = 1, antot scl = sqrt(tmprtr / mass(i)) ra(i,j,2) = scl * gasdev(0) ra(i,j,5) = mass(i) * ra(i,j,2) ra(i,j,3) = ra(i,j,4)/mass(i) 100 continue 200 continue c c Re-initialize absolute coordinates c call com call com_rmv call cluster_com tmstrt = istep scal2 = 0.0d00 scal3 = 0.0d00 vol2 = 0.0d00 vol3 = 0.0d00 prsflg = .false. tmpflg = .false. ptflg = .false. mbflg = .true. cmflg = .true. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in mbstep',istep) endif end do #if 0 if (mod(istep,ilist).eq.0) then if (istep.gt.equil_1) then call cluster_com call cluster_center endif call fixper do i = 1, antot ra(i,1,6) = ra(i,1,1) ra(i,2,6) = ra(i,2,1) ra(i,3,6) = ra(i,3,1) end do endif #endif return end c subroutine vlstep #include "common.fh" c double precision scale,sclinc integer i,j integer iter iter = 0 c prsflg = .false. tmpflg = .false. ptflg = .false. if (itarg.ge.istep) then scale = xbox * ybox * zbox sclinc = (tvol - scale ) / float(itarg - istep + 1) scale = (scale + sclinc) / (xbox * ybox * zbox) scale = exp(log(scale)/3.0d00) xbox = scale * xbox ybox = scale * ybox zbox = scale * zbox xbox2 = scale * xbox2 ybox2 = scale * ybox2 zbox2 = scale * zbox2 do 300 j = 1, 3 do 100 i = 1, antot ra(i,j,1) = scale * ra(i,j,1) ra(i,j,6) = scale * ra(i,j,6) 100 continue 300 continue endif mbflg = .true. do while (t_rmndr.gt.0.0d00) iter = iter + 1 call pred call force call corr if (iter.gt.100) then write(6,*) 'istep: ',istep write(6,*) 't_rmndr: ',t_rmndr endif if (iter.gt.1000) then call ga_error('Failed in vlstep',istep) endif end do if (nrg(5).gt.0.0d00) then scale = sqrt(tmprtr / nrg(5)) else scale = 1.0d00 endif do 600 j = 1, 3 do 400 i = 1, antot ra(i,j,2) = scale * ra(i,j,2) ra(i,j,5) = scale * ra(i,j,5) 400 continue 600 continue c return end c subroutine pred #include "common.fh" c double precision scale,c1,c2 double precision rx,ry,rz,dt integer i,j double precision cluster_check_radius logical debug c c This subroutine implements the predictor for a 3 point Gear c predictor-corrector algorithm c if (istep.gt.3930438) then debug = .false. else debug = .false. endif call cluster_com call cluster_old_at call cluster_therm if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 1 at step ',istep endif c rx = cluster_check_radius() c if (rx.gt.r_cluster.and.istep.gt.equil_3) then c write(6,*) ga_nodeid(),' Step ',istep c write(6,*) ga_nodeid(),' t_done ',t_done c write(6,*) ga_nodeid(),' Radius out of bounds ',rx c write(6,*) ga_nodeid(),' r_cluster ',r_cluster c endif if (t_done.eq.tau) then t_done = 0.0d00 dt = tau t_rmndr = tau else dt = t_rmndr endif c c1 = dt c2 = dt * c1 / 2.0d00 c c predictor step for atoms c do 200 j = 1, 3 do 100 i = 1, antot ra(i,j,6) = ra(i,j,6) + c1 * ra(i,j,2) + c2 * ra(i,j,3) ra(i,j,2) = ra(i,j,2) + c1 * ra(i,j,3) 100 continue 200 continue c c predictor step for volume c if ((prsflg.or.ptflg).and.ipmode.eq.0) then vol1 = vol1 + c1 * vol2 + c2 * vol3 vol2 = vol2 + c1 * vol3 scale = vol1 / (xbox * ybox * zbox) scale = exp(log(scale)/3.0d00) xbox = scale * xbox ybox = scale * ybox zbox = scale * zbox xbox2 = scale * xbox2 ybox2 = scale * ybox2 zbox2 = scale * zbox2 endif c if ((prsflg.or.ptflg).and.ipmode.eq.1) then do 500 j = 1, 3 alen1(j) = alen1(j) + c1 * alen2(j) + c2 * alen3(j) alen2(j) = alen2(j) + c1 * alen3(j) 500 continue xbox = alen1(1) ybox = alen1(2) zbox = alen1(3) xbox2 = xbox/2.0d00 ybox2 = ybox/2.0d00 zbox2 = zbox/2.0d00 endif c if ((prsflg.or.ptflg).and.ipmode.eq.2) then do 600 j = 1, 2 alen1(j) = alen1(j) + c1 * alen2(j) + c2 * alen3(j) alen2(j) = alen2(j) + c1 * alen3(j) 600 continue xbox = alen1(1) ybox = alen1(2) xbox2 = xbox/2.0d00 ybox2 = ybox/2.0d00 endif c c predictor step for time scale c if (tmpflg.or.ptflg) then scal1 = scal1 + c1 * scal2 + c2 * scal3 scal2 = scal2 + c1 * scal3 endif c if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 2 at step ',istep endif call fixper if (istep.gt.equil_1) then call cluster_com endif if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 3 at step ',istep endif if (istep.gt.equil_1) then call cluster_check_cllsn else t_rmndr = 0.0d00 t_done = tau endif if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 4 at step ',istep endif if (.not.(ptflg.or.prsflg)) then if (t_rmndr.eq.0.0d00) call cluster_center endif if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 5 at step ',istep endif if (mod(istep,ilist).eq.0.and.t_rmndr.eq.0.0d00) then call update endif if (cllsn_cnt.gt.100) then call ga_error("Too many collisions ",istep) endif if (debug) then write(6,*) ga_nodeid(),' (pred) Got to 6 at step ',istep endif c return end c subroutine corr #include "common.fh" c double precision c1,c2,coef1,xcorr,vcorr,scorr,dt double precision v1,s1,pmassi,tmassi,dlnvdt(3),itmp double precision mv1,cmr,kvt,kvtl(3),l1(3) double precision rbuf(8),virial,virc(3) double precision alfx,alfy,alfpx,alfpy,alfpz integer i,j,iat,nreal,nbyte c c This subroutine implements the corrector for a 3 point Gear c predictor-corrector algorithm c dt = t_done c1 = dt c2 = dt * c1 / 2.0d00 coef1 = c2 / c1 c if (prsflg.or.ptflg) then pmassi = 1.0d00 / pmass else pmassi = 0.0d00 vol1 = xbox * ybox * zbox vol2 = 0.0 vol3 = 0.0 c alen1(1) = xbox alen1(2) = ybox alen1(3) = zbox do 20 j = 1, 3 alen2(j) = 0.0d00 alen3(j) = 0.0d00 20 continue endif if (tmpflg.or.ptflg) then tmassi = 1.0d00 / tmass else tmassi = 0.0d00 scal1 = 1.0d00 scal2 = 0.0d00 scal3 = 0.0d00 endif c if (ipmode.eq.0) then dlnvdt(1) = vol2 / (3.0d00 * vol1) dlnvdt(2) = vol2 / (3.0d00 * vol1) dlnvdt(3) = vol2 / (3.0d00 * vol1) elseif (ipmode.eq.1) then dlnvdt(1) = alen2(1) / alen1(1) dlnvdt(2) = alen2(2) / alen1(2) dlnvdt(3) = alen2(3) / alen1(3) elseif (ipmode.eq.2) then dlnvdt(1) = alen2(1) / alen1(1) dlnvdt(2) = alen2(2) / alen1(2) dlnvdt(3) = 0.0d00 endif kvt = 0.0d00 kvtl(1) = 0.0d00 kvtl(2) = 0.0d00 kvtl(3) = 0.0d00 do 200 j = 1, 3 do 150 iat = 1, antot mv1 = mass(iat) * (ra(iat,j,2) - ra(iat,j,6) * dlnvdt(j)) kvt = kvt + mv1**2/mass(iat) kvtl(j) = kvtl(j) + mv1**2/mass(iat) 150 continue 200 continue c c do global sum on quantities needed for corrector, if necessary c if (prsflg.or.ptflg.or.tmpflg) then rbuf(1) = kvt rbuf(2) = kvtl(1) rbuf(3) = kvtl(2) rbuf(4) = kvtl(3) rbuf(5) = nrg(10) rbuf(6) = nrg(18) rbuf(7) = nrg(19) rbuf(8) = nrg(20) c call ga_dgop(3,rbuf,8,'+') c kvt = rbuf(1) kvtl(1) = rbuf(2) kvtl(2) = rbuf(3) kvtl(3) = rbuf(4) virial = rbuf(5) virc(1) = rbuf(6) virc(2) = rbuf(7) virc(3) = rbuf(8) endif c itmp = (kvt + virial)/(3.0d00 * vol1) if (prsflg.or.ptflg) then if (ipmode.eq.0) then v1 = scal1**2 * pmassi * (itmp - prssr) + vol2 * scal2 / scal1 else l1(1) = scal1**2*pmassi*((kvtl(1)+virc(1))/alen1(1) + - prssr*alen1(2)*alen1(3)) + alen2(1)*scal2/scal1 l1(2) = scal1**2*pmassi*((kvtl(2)+virc(2))/alen1(2) + - prssr*alen1(1)*alen1(3)) + alen2(2)*scal2/scal1 if (ipmode.eq.1) then l1(3) = scal1**2*pmassi*((kvtl(3)+virc(3))/alen1(3) + - prssr*alen1(1)*alen1(2)) + alen2(3)*scal2/scal1 else l1(3) = 0.0d00 endif alfx = l1(1) alfy = l1(2) endif else v1 = 0.0d00 endif c do 400 j = 1, 3 if (ipmode.eq.0) then do 300 i = 1, antot cmr = ra(i,j,6) ra(i,j,8) = ra(i,j,4) / mass(i) + - (dlnvdt(j) + scal2 / scal1) + * (ra(i,j,2) - dlnvdt(j) * cmr) + - (vol2**2 * cmr / (3.0d00*vol1**2) + - v1 * cmr / (3.0d00 * vol1) + - dlnvdt(j) * ra(i,j,2)) 300 continue elseif (ipmode.ge.1) then do 340 i = 1, antot cmr = ra(i,j,6) ra(i,j,8) = ra(i,j,4) / mass(i) + - scal2 * ra(i,j,2) / scal1 + + cmr * scal2 * dlnvdt(j) / scal1 + + cmr * l1(j) / alen1(j) 340 continue endif 400 continue c do 425 j = 1, 3 do 450 i = 1, antot xcorr = ra(i,j,8) - ra(i,j,3) ra(i,j,2) = ra(i,j,2) + coef1 * xcorr ra(i,j,3) = ra(i,j,8) ra(i,j,7) = ra(i,j,8) 450 continue 425 continue c if (tmpflg.or.ptflg) then s1 = scal1 * tmassi * (kvt - nrg(1) * tmprtr) + + scal2**2 / scal1 endif if ((prsflg.or.ptflg).and.ipmode.eq.0) then vcorr = v1 - vol3 vol2 = vol2 + coef1 * vcorr vol3 = v1 endif if ((prsflg.or.ptflg).and.ipmode.ge.1) then l1(1) = l1(1) + alfpx l1(2) = l1(2) + alfpy l1(3) = l1(3) + alfpz if (ipmode.eq.1) then do 475 j = 1, 3 vcorr = l1(j) - alen3(j) alen2(j) = alen2(j) + coef1 * vcorr alen3(j) = l1(j) 475 continue elseif (ipmode.eq.2) then do 485 j = 1, 2 vcorr = l1(j) - alen3(j) alen2(j) = alen2(j) + coef1 * vcorr alen3(j) = l1(j) 485 continue endif alfpx = l1(1) alfpy = l1(2) alfpz = l1(3) endif if (tmpflg.or.ptflg) then scorr = s1 - scal3 scal2 = scal2 + coef1 * scorr scal3 = s1 endif c c calculate value of the Hamiltonian c kvt = 0.0d00 if (ipmode.eq.0) then dlnvdt(1) = vol2 / (3.0d00 * vol1) dlnvdt(2) = vol2 / (3.0d00 * vol1) dlnvdt(3) = vol2 / (3.0d00 * vol1) elseif (ipmode.eq.1) then dlnvdt(1) = alen2(1) / alen1(1) dlnvdt(2) = alen2(2) / alen1(2) dlnvdt(3) = alen2(3) / alen1(3) vol1 = alen1(1)*alen1(2)*alen1(3) elseif (ipmode.eq.2) then dlnvdt(1) = alen2(1) / alen1(1) dlnvdt(2) = alen2(2) / alen1(2) dlnvdt(3) = 0.0d00 vol1 = alen1(1)*alen1(2)*zbox endif do 600 j = 1, 3 do 550 iat = 1, antot ra(iat,j,5) = mass(iat) * (ra(iat,j,2)-ra(iat,j,6)*dlnvdt(j)) kvt = kvt + ra(iat,j,5)**2 / mass(iat) 550 continue 600 continue c call com call kin call nrgsum call com_rmv c kvt = 2.0 * nrg(4) nrg(9) = 0.5d00 * (kvt + tmass * scal2**2 / scal1**2) + nrg(6) if (ipmode.eq.0) nrg(9) = nrg(9)+0.5d00*pmass*vol2**2/scal1**2 if (ipmode.eq.1) nrg(9) = nrg(9)+0.5d00*pmass*alen2(1)**2/scal1**2 + +0.5d00*pmass*alen2(2)**2/scal1**2 + +0.5d00*pmass*alen2(3)**2/scal1**2 if (ipmode.eq.2) nrg(9) = nrg(9)+0.5d00*pmass*alen2(1)**2/scal1**2 + +0.5d00*pmass*alen2(2)**2/scal1**2 itmp = (kvt + nrg(10))/(3.0d00 * vol1) if (prsflg.or.ptflg) then nrg(11) = 0.5d00 * kvt + nrg(6) + vol1 * prssr else nrg(11) = 0.5d00 * kvt + nrg(6) + vol1 * itmp endif if (prsflg.or.ptflg) nrg(9) = nrg(9) + prssr * vol1 if (tmpflg.or.ptflg) then nrg(9) = nrg(9) + nrg(1) * tmprtr * log(scal1) endif c nrg(5) = nrg(4) / nrg(2) tavg = tavg + nrg(5) itavg = itavg + 1 c c make sure volume and temperature scale factor is the same on c all processors c if ((mod(istep,100).eq.0).and.(prsflg.or.ptflg.or.tmpflg)) then if (ga_nodeid().eq.0) then rbuf(1) = scal1 rbuf(2) = scal2 rbuf(3) = xbox rbuf(4) = ybox rbuf(5) = zbox rbuf(6) = vol2 else rbuf(1) = 0.0d00 rbuf(2) = 0.0d00 rbuf(3) = 0.0d00 rbuf(4) = 0.0d00 rbuf(5) = 0.0d00 rbuf(6) = 0.0d00 endif c nreal = 6 call ga_dgop(1,rbuf,6,'+') c scal1 = rbuf(1) scal2 = rbuf(2) xbox = rbuf(3) ybox = rbuf(4) zbox = rbuf(5) vol2 = rbuf(6) endif if (l_cllsn) then call cluster_do_cllsn endif call cluster_com c return end ga-5-4/global/examples/md_cluster/cell_list.F0000644000175000017500000003605112662210461017335 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine cell_list #include "common.fh" c integer MAXCL,MSKIN parameter (MAXCL=50,MSKIN=5) double precision xu,yu,zu,xl,yl,zl double precision rct2sd,rbcut,rbcut2 double precision r2(MAXAT),dx(MAXAT),dy(MAXAT),dz(MAXAT) double precision br2(MAXAT),bdx(MAXAT),bdy(MAXAT),bdz(MAXAT) double precision xcl,ycl,zcl,xmax,ymax,zmax,xmin,ymin,zmin double precision rix,riy,riz double precision tbeg,wraptime integer link(MAXAT) integer ltop(-MSKIN:MAXCL+MSKIN,-MSKIN:MAXCL+MSKIN, + -MSKIN:MAXCL+MSKIN) integer btop(-MSKIN:MAXCL+MSKIN,-MSKIN:MAXCL+MSKIN, + -MSKIN:MAXCL+MSKIN),blink(MAXAT) integer acml(MAXAT),bacml(MAXAT) integer kxmax,kymax,kzmax,kc,kx,ky,kz,jx,jy,jz,ltot,bltot integer i,j,k,ipx,ipy,ipz,nlx,nly,nlz,ix,iy,iz integer idx,idy,idz,pnum,inode,ll,kk,l,lb,jj double precision rchk c c This subroutine locates the nearest neighbors of each atom c using a link cell algorithm and constructs a neighbor list c tbeg = wraptime() c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c c determine the size of each spatial decomposition zone c and then use this to divide each zone into cells c rcell = 1.1d00 rbcut = 1.5d00 rchk = 0.0d00 c rbcut2 = rbcut**2 xcl = xbox / dble(idx) ycl = ybox / dble(idy) zcl = zbox / dble(idz) if (int(xcl/rcell).ge.MAXCL) then rcell = xcl/(dble(MAXCL)) + 0.1 endif if (int(ycl/rcell).ge.MAXCL) then rcell = ycl/(dble(MAXCL)) + 0.1 endif if (int(zcl/rcell).ge.MAXCL) then rcell = zcl/(dble(MAXCL)) + 0.1 endif nlx = int(xcl/rcell) nly = int(ycl/rcell) nlz = int(zcl/rcell) xcl = xcl / dble(nlx) ycl = ycl / dble(nly) zcl = zcl / dble(nlz) c c If system is small, just use brute force neighbor list construction c and skip the link cell algorithm c ix = int(rcmax/xcl) if (rcmax-xcl*dble(ix).gt.0.0d00) ix = ix+1 iy = int(rcmax/ycl) if (rcmax-ycl*dble(iy).gt.0.0d00) iy = iy+1 iz = int(rcmax/zcl) if (rcmax-zcl*dble(iz).gt.0.0d00) iz = iz+1 if ((idx.eq.2.and.xcl*dble(ix).ge.0.5d00*xbox/dble(idx)).or. + (idy.eq.2.and.ycl*dble(iy).ge.0.5d00*ybox/dble(idy)).or. + (idz.eq.2.and.zcl*dble(iz).ge.0.5d00*zbox/dble(idz))) then call small_list return endif c c find link cells c call getcell c c find location of cell edges c xmax = xbox * dble(ipx+1)/dble(idx) ymax = ybox * dble(ipy+1)/dble(idy) zmax = zbox * dble(ipz+1)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xbox * dble(ipx)/dble(idx) ymin = ybox * dble(ipy)/dble(idy) zmin = zbox * dble(ipz)/dble(idz) xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 c c calculate link cell indices. Start by setting all c elements of ltop() equal to 0. c if (nlx.ge.MAXCL) then write(6,105) ga_nodeid(),istep write(6,*) 'NLX = ',nlx,' ON NODE',ga_nodeid() call ga_error("Out of bound cell index",0) elseif (nly.ge.MAXCL) then write(6,105) ga_nodeid(),istep write(6,*) 'NLY = ',nly,' ON NODE',ga_nodeid() call ga_error("Out of bound cell index",0) elseif (nlz.ge.MAXCL) then write(6,105) ga_nodeid(),istep write(6,*) 'NLZ = ',nlz,' ON NODE',ga_nodeid() call ga_error("Out of bound cell index",0) endif do i = -MSKIN, nlx+MSKIN do j = -MSKIN, nly+MSKIN do k = -MSKIN, nlz+MSKIN ltop(i,j,k) = 0 btop(i,j,k) = 0 end do end do end do 105 format(i5,' Out of bound failure at step ',i8) c c find leading index for each cell and store it in c ltop(). Store link list in list(). Store atoms c in both local and buffer arrays. c do i = 1, antot ix = int((ra(i,1,1)-xmin)/xcl)+1 iy = int((ra(i,2,1)-ymin)/ycl)+1 iz = int((ra(i,3,1)-zmin)/zcl)+1 j = ltop(ix,iy,iz) ltop(ix,iy,iz) = i link(i) = j #if 0 if (ix.lt.1.or.ix.gt.nlx.or.iy.lt.1.or.iy.gt.nly.or. + iz.lt.1.or.iz.gt.nlz) then write(6,*) 'i = ',i write(6,*) 'antot = ',antot write(6,*) 'atot = ',atot write(6,*) 'ra(i,1,1) = ',ra(i,1,1) write(6,*) 'ra(i,2,1) = ',ra(i,2,1) write(6,*) 'ra(i,3,1) = ',ra(i,3,1) write(6,*) 'xmin = ',xmin write(6,*) 'ymin = ',ymin write(6,*) 'zmin = ',zmin write(6,*) 'xcl = ',xcl write(6,*) 'ycl = ',ycl write(6,*) 'zcl = ',zcl write(6,*) 'ix ',ix,nlx write(6,*) 'iy ',iy,nly write(6,*) 'iz ',iz,nlz write(6,105) ga_nodeid(),istep write(6,*) 'OUT OF BOUNDS AT 1 ON NODE ',ga_nodeid() call ga_error("Out of bounds error",0) endif #endif end do do i = 1, btot if ((xcrd(i).lt.xmin.and.xmin-xcrd(i).lt.rcmax).or. + (xcrd(i).gt.xmax.and.xcrd(i)-xmax.gt.rcmax)) then xl = xmin - xcrd(i) xl = xl - xbox * anint(xl/xbox) ix = -int(xl/xcl) elseif ((xcrd(i).ge.xmax.and.xcrd(i)-xmax.lt.rcmax).or. + (xcrd(i).lt.xmin.and.xmin-xcrd(i).gt.rcmax)) then xu = xcrd(i) - xmax xu = xu - xbox * anint(xu/xbox) ix = nlx + int(xu/xcl) + 1 else ix = int((xcrd(i)-xmin)/xcl)+1 endif if ((ycrd(i).lt.ymin.and.ymin-ycrd(i).lt.rcmax).or. + (ycrd(i).gt.ymax.and.ycrd(i)-ymax.gt.rcmax)) then yl = ymin - ycrd(i) yl = yl - ybox * anint(yl/ybox) iy = -int(yl/ycl) elseif ((ycrd(i).ge.ymax.and.ycrd(i)-ymax.lt.rcmax).or. + (ycrd(i).lt.ymin.and.ymin-ycrd(i).gt.rcmax)) then yu = ycrd(i) - ymax yu = yu - ybox * anint(yu/ybox) iy = nly + int(yu/ycl) + 1 else iy = int((ycrd(i)-ymin)/ycl)+1 endif if ((zcrd(i).lt.zmin.and.zmin-zcrd(i).lt.rcmax).or. + (zcrd(i).gt.zmax.and.zcrd(i)-zmax.gt.rcmax)) then zl = zmin - zcrd(i) zl = zl - zbox * anint(zl/zbox) iz = -int(zl/zcl) elseif ((zcrd(i).ge.zmax.and.zcrd(i)-zmax.lt.rcmax).or. + (zcrd(i).lt.zmin.and.zmin-zcrd(i).gt.rcmax)) then zu = zcrd(i) - zmax zu = zu - zbox * anint(zu/zbox) iz = nlz + int(zu/zcl) + 1 else iz = int((zcrd(i)-zmin)/zcl)+1 endif j = btop(ix,iy,iz) btop(ix,iy,iz) = i blink(i) = j #if 0 if (ix.ge.1.and.ix.le.nlx.and.iy.ge.1.and.iy.le.nly.and. + iz.ge.1.and.iz.le.nlz) then write(6,105) ga_nodeid(),istep write(6,*) 'OUT OF BOUNDS AT 2 ON NODE ',ga_nodeid() call ga_error("Out of bounds error",0) endif #endif end do c c Link cell lists are complete. Now find neighbors and construct c neighbor lists. c c Primary loop over all local atoms c ll = 1 kk = 1 do i = 1, antot c c Locate all atoms in both the local and buffer lists that c interact with atom i. Start by collecting all atoms in the c same cell c rix = ra(i,1,1) riy = ra(i,2,1) riz = ra(i,3,1) c l = 0 lb = 0 j = link(i) if (j.gt.0) then 99 l = l + 1 acml(l) = j dx(l) = ra(j,1,1) dy(l) = ra(j,2,1) dz(l) = ra(j,3,1) j = link(j) if (j.gt.0) go to 99 endif c c Collect atoms in half of the adjacent cells. c Find indices of cell containing atom i c ix = int((ra(i,1,1)-xmin)/xcl)+1 iy = int((ra(i,2,1)-ymin)/ycl)+1 iz = int((ra(i,3,1)-zmin)/zcl)+1 c c loop over neighboring cells c do kc = 1, kcmax jx = ix + nix(kc) if (jx.gt.nlx.and.idx.eq.1) jx = jx - nlx if (jx.lt.1.and.idx.eq.1) jx = nlx + jx jy = iy + niy(kc) if (jy.gt.nly.and.idy.eq.1) jy = jy - nly if (jy.lt.1.and.idy.eq.1) jy = nly + jy jz = iz + niz(kc) if (jz.gt.nlz.and.idz.eq.1) jz = jz - nlz if (jz.lt.1.and.idz.eq.1) jz = nlz + jz if ((jx.ge.1.and.jx.le.nlx).and. + (jy.ge.1.and.jy.le.nly).and. + (jz.ge.1.and.jz.le.nlz)) then c c neighboring cell is local c j = ltop(jx,jy,jz) c c gather atoms in neighboring cell c if (j.gt.0) then 199 l = l + 1 acml(l) = j dx(l) = ra(j,1,1) dy(l) = ra(j,2,1) dz(l) = ra(j,3,1) j = link(j) if (j.gt.0) go to 199 endif else c c neighboring cell is in buffer c j = btop(jx,jy,jz) c c gather atoms in neighboring cell c if (j.gt.0) then 299 lb = lb + 1 bacml(lb) = j bdx(lb) = xcrd(j) bdy(lb) = ycrd(j) bdz(lb) = zcrd(j) j = blink(j) if (j.gt.0) go to 299 endif endif end do ltot = l bltot = lb c do l = 1, ltot dx(l) = rix - dx(l) dx(l) = dx(l) - xbox * anint(dx(l)/xbox) dy(l) = riy - dy(l) dy(l) = dy(l) - ybox * anint(dy(l)/ybox) dz(l) = riz - dz(l) dz(l) = dz(l) - zbox * anint(dz(l)/zbox) r2(l) = dx(l)**2 + dy(l)**2 + dz(l)**2 end do do lb = 1, bltot bdx(lb) = rix - bdx(lb) bdx(lb) = bdx(lb) - xbox * anint(bdx(lb)/xbox) bdy(lb) = riy - bdy(lb) bdy(lb) = bdy(lb) - ybox * anint(bdy(lb)/ybox) bdz(lb) = riz - bdz(lb) bdz(lb) = bdz(lb) - zbox * anint(bdz(lb)/zbox) br2(lb) = bdx(lb)**2 + bdy(lb)**2 + bdz(lb)**2 end do if (ltot.gt.antot.or.bltot.gt.btot) then write(6,*) 'NODE ',ga_nodeid(),ltot,bltot,antot,btot stop endif c c accumulate all atoms within an interaction distance of c atom i c nafirst(i) = ll bafirst(i) = kk do 300 j = 1, ltot jj = acml(j) rct2sd = (acut(at(i),at(jj))+1.0d00)**2 if (rct2sd.gt.rchk) rchk = rct2sd c if (r2(j).gt.rct2sd) go to 300 c if (atml(i).eq.atml(jj)) then c if (r2(j).le.rbcut2) then c blist(kk) = jj c kk = kk + 1 c endif c go to 300 c endif c nblist(ll) = jj ll = ll + 1 300 continue nalast(i) = ll - 1 nbfirst(i) = ll balast(i) = kk - 1 bbfirst(i) = kk do 400 j = 1, bltot jj = bacml(j) rct2sd = (acut(at(i),bat(jj))+1.0d00)**2 if (rct2sd.gt.rchk) rchk = rct2sd if (br2(j).gt.rct2sd) go to 400 c if (atml(i).eq.batml(jj)) then c if (br2(j).le.rbcut2) then c blist(kk) = jj c kk = kk + 1 c endif c go to 400 c endif c nblist(ll) = jj ll = ll + 1 400 continue nblast(i) = ll - 1 bblast(i) = kk - 1 end do tmstat(23) = tmstat(23) + wraptime() - tbeg c return end c subroutine getcell #include "common.fh" c c This subroutine finds the total number of nearest of cells c required by the link-cell routine c double precision xcell,ycell,zcell,cx,cy,cz,rc,rcmax2 integer kxmin,kymin,kzmin,kxmax,kymax,kzmax,kc,kx,ky,kz integer pnum,idx,idy,idz,nlx,nly,nlz c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) c xcell = xbox / dble(idx) ycell = ybox / dble(idy) zcell = zbox / dble(idz) nlx = int(xcell/rcell) nly = int(ycell/rcell) nlz = int(zcell/rcell) xcell = xcell / dble(nlx) ycell = ycell / dble(nly) zcell = zcell / dble(nlz) c kxmax = int(rcmax/xcell)+1 kymax = int(rcmax/ycell)+1 kzmax = int(rcmax/zcell)+1 c rcmax2 = rcmax**2 c kc = 0 do kx = 0, kxmax kymin = -kymax if (kx.eq.0) kymin = 0 do ky = kymin, kymax kzmin = -kzmax if (kx.eq.0.and.ky.eq.0) kzmin = 1 do kz = kzmin, kzmax if (kx.eq.0) then cx = 0.0d00 else cx = xcell*dble(kx-1) endif if (ky.gt.0) then cy = ycell*dble(ky-1) elseif (ky.lt.0) then cy = ycell*dble(-ky-1) else cy = 0.0d00 endif if (kz.gt.0) then cz = zcell*dble(kz-1) elseif (kz.lt.0) then cz = zcell*dble(-kz-1) else cz = 0.0d00 endif rc = cx**2+cy**2+cz**2 if (rc.lt.rcmax2) then kc = kc + 1 nix(kc) = kx niy(kc) = ky niz(kc) = kz endif end do end do end do kcmax = kc return end c subroutine small_list #include "common.fh" c integer MAXCL,MSKIN parameter (MAXCL=50,MSKIN=5) double precision rcmax2 double precision r2,dx,dy,dz double precision rix,riy,riz,rjx,rjy,rjz double precision tbeg,wraptime integer acml(MAXAT),bacml(MAXAT) integer i,j,ll c c This subroutine locates the nearest neighbors of each atom c using a direct search over all pairs. It is used to construct c the neighbor list for small systems where the link cell c algorithm may fail. c tbeg = wraptime() c c Find neighbors and construct neighbor lists. c Loop over all local atoms c rcmax2 = rcmax**2 ll = 1 do i = 1, antot c c Locate all atoms in both the local and buffer lists that c interact with atom i. c rix = ra(i,1,1) riy = ra(i,2,1) riz = ra(i,3,1) nafirst(i) = ll do j = i+1, antot rjx = ra(j,1,1) rjy = ra(j,2,1) rjz = ra(j,3,1) dx = rix - rjx dx = dx - xbox * anint(dx/xbox) dy = riy - rjy dy = dy - ybox * anint(dy/ybox) dz = riz - rjz dz = dz - zbox * anint(dz/zbox) r2 = dx**2 + dy**2 + dz**2 if (r2.le.rcmax2) then nblist(ll) = j ll = ll + 1 endif end do nalast(i) = ll - 1 nbfirst(i) = ll do j = 1, btot if (bidx(j).gt.aidx(i)) then rjx = xcrd(j) rjy = ycrd(j) rjz = zcrd(j) dx = rix - rjx dx = dx - xbox * anint(dx/xbox) dy = riy - rjy dy = dy - ybox * anint(dy/ybox) dz = riz - rjz dz = dz - zbox * anint(dz/zbox) r2 = dx**2 + dy**2 + dz**2 if (r2.le.rcmax2) then nblist(ll) = j ll = ll + 1 endif endif end do nblast(i) = ll - 1 end do c tmstat(23) = tmstat(23) + wraptime() - tbeg c return end ga-5-4/global/examples/md_cluster/rdpar.F0000644000175000017500000003771112662210461016477 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine rdpar #include "common.fh" double precision x,ran1 integer i,j integer me c c This subroutine reads in the molecular simulation parameters c me = ga_nodeid() if (me.eq.0) open (unit=5,file='md_lj.in',status='old') c c Line 1 c c nstep: total number of steps in simulation c c tau: time step increment c c nsc: number of special control steps c c iseed: random number seed (this should be a NEGATIVE c integer) c nstep = 0 tau = 0.0d00 nsc = 0 iseed = 0 if (me.eq.0) then read(5,*) nstep,tau,nsc,iseed endif call ga_igop(2,nstep,1,'+') call ga_dgop(3,tau,1,'+') call ga_igop(4,nsc,1,'+') call ga_igop(5,iseed,1,'+') c c Line 2 c c rcut: cutoff for use in neighbor list calculation c c ilist: number of steps taken before updating c neighbor list c c icut: cutoff parameter for potential c c (0) only potential set to zero at cutoff c c (1) potential and forces set to zero at cutoff c rcut = 0.0d00 ilist = 0 icut = 0 if (me.eq.0) then read(5,*) rcut,ilist,icut endif call ga_dgop(6,rcut,1,'+') call ga_igop(7,ilist,1,'+') call ga_igop(8,icut,1,'+') c c Line 3 c c dflalg: default algorithm c c 1: constant energy 3 point Gear algorithm c 2: constant pressure algorithm c 3: constant temperature algorithm (velocity scaling) c 4: constant temperature algorithm (Nose' dynmamics) c 5: constant pressure and temperature algorithm c 6: Boltzmann velocity step c 7: adjust volume to specified target volume c (available only as a special step) c 8: adjust kinetic energy based on average temperature c since last call to this step so that temperature c matches target temperature. c (available only as a special step) c 9: constant pressure and temperature algorithm with c independent box adjustments c 10: constant pressure and temperature algorithm with c independent box adjustments in only the x and y c dimensions c c dftmp: default temperature c c dfprs: default pressure c c dftm: default mass for temperature c c dfpm: default mass for pressure c dflalg = 0 dftmp = 0.0d00 dfprs = 0.0d00 dftm = 0.0d00 dfpm = 0.0d00 if (me.eq.0) then read(5,*) dflalg,dftmp,dfprs,dftm,dfpm endif call ga_igop(9,dflalg,1,'+') call ga_dgop(1,dftmp,1,'+') call ga_dgop(2,dfprs,1,'+') call ga_dgop(3,dftm,1,'+') call ga_dgop(4,dfpm,1,'+') c c Line 4.1 - 4.nsc c c special step control instructions c c isc(i,1): begining step for special instruction c c isc(i,2): final step for special instruction c c isc(i,3): increment for special instruction c c isc(i,4): stepping algorithm for special instruction c (see documentation on dflalg) c c rsc(i,1): temperature (in K) if temperature scaling or c Boltzmann algorithm is specified c c rsc(i,2): pressure if constant pressure c algorithms are specified. If volume adjustment c algorithm is specified then this is the target c volume in A**3. c c rsc(i,3): mass (in g A**2 /mole) for Nose temperature c algorithm c c rsc(i,4): mass (in g/(mole A**4)) for constant pressure c algorithm c do 100 i=1,nsc do j=1,4 isc(i,j) = 0.0d00 rsc(i,j) = 0.0d00 end do if (me.eq.0) then read(5,*) (isc(i,j),j=1,4),(rsc(i,j),j=1,4) endif do j=1,4 call ga_igop(4,isc(i,j),1,'+') call ga_dgop(5,rsc(i,j),1,'+') end do 100 continue c c Line 5 c c istart: startup format c 1: start from single configuration c 2: start from configuration plus velocity c c istop: write-out format c 1: single configuration c 2: configuration plus velocity c istart = 0 istop = 0 if (me.eq.0) then read(5,*) istart,istop endif call ga_igop(6,istart,1,'+') call ga_igop(7,istop,1,'+') c c Line 6 c c istat: frequency to print out simulation information c istat = 0 if (me.eq.0) then read(5,*) istat endif call ga_igop(8,istat,1,'+') c c Line 7 c c equil_1: number of steps in first equilibration regime c c equil_2: number of steps in second equilibration regime c c equil_3: number of steps in third equilibration regime c equil_1 = 0 equil_2 = 0 equil_3 = 0 if (me.eq.0) then read(5,*) equil_1, equil_2, equil_3 endif call ga_igop(9,equil_1,1,'+') call ga_igop(1,equil_2,1,'+') call ga_igop(2,equil_3,1,'+') window_1 = int(0.2d00*dble(equil_3-equil_2)) window_1 = equil_2 + window_1 window_2 = int(0.4d00*dble(equil_3-equil_2)) window_2 = window_1 + window_2 c c Line 7 c c cl_prssr: pressure that is applied to cluster c c mc_tmprtr: temperature used in Monte Carlo steps c cl_prssr = 0.0d00 mc_tmprtr = 0.0d00 if (me.eq.0) then read(5,*) cl_prssr, mc_tmprtr endif call ga_dgop(3,cl_prssr,1,'+') call ga_dgop(4,mc_tmprtr,1,'+') c c Line 8 c c mcfreq: frequency to apply Monte Carlo step on radius c c mcbins: number of bins to accumulate radius in c mcfreq = 0 mcbins = 0 if (me.eq.0) then read(5,*) mcfreq, mcbins endif call ga_igop(7,mcfreq,1,'+') call ga_igop(8,mcbins,1,'+') c if (me.eq.0) close(5) c c Write out simulation information to output file c if (me.eq.0.and.l_stdio) then write(6,1300) nstep write(6,1400) 1000.0 * tau write(6,4325) rcut write(6,4350) ilist if (icut.eq.0) then write(6,4400) else write(6,4420) endif write(6,1500) dflalg write(6,1600) write(6,1700) dftmp write(6,1800) dfprs write(6,1900) dftm write(6,2000) dfpm write(6,2100) do 300 i = 1, nsc if (i.eq.1) then write(6,2200) else if (isc(i-1,4).eq.7) write(6,2200) endif if (isc(i,4).ne.7) then write(6,2300) (isc(i,j),j=1,4),(rsc(i,j),j=1,4) else write(6,2400) write(6,2500) (isc(i,j),j=1,4) write(6,2600) rsc(i,1) write(6,2700) rsc(i,2) endif 300 continue write(6,3400) istat write(6,3800) mcfreq write(6,3500) equil_1 write(6,3600) equil_2 write(6,3700) equil_3 if (istart.eq.1) then write(6,2800) else write(6,2900) endif if (istop.eq.1) then write(6,3000) else write(6,3100) endif write(6,3200) iseed write(6,4500) ga_pgroup_nodeid(ga_pgroup_get_world()) endif iseed = iseed - 10*me x = ran1(iseed) r_cluster = 0.0d00 mc_cnt = 0 c return 1300 format('Total number of steps in simulation :',i9) 1400 format('Time step interval :' + ,f16.6) 1500 format('Default algorithm :',i9) 1600 format(' Default algorithm parameters ') 1700 format(' Default temperature :' + ,f16.6) 1800 format(' Default pressure :' + ,f16.6) 1900 format(' Default temperature mass :' + ,f16.6) 2000 format(' Default pressure mass :' + ,f16.6) 2100 format('Special step instructions:') 2200 format(' begin end incrmt algrthm T P ', +'T mass P mass ') 2300 format(4i8,2f8.3,1pe9.2,1pe9.2) 2400 format(' begin end incrmt algrthm') 2500 format(4i8) 2600 format(' Temperature for volume adjustment :' + ,f16.6) 2700 format(' Target volume for volume adjustment :' + ,f16.6) 2800 format('Initial configuration is coordinates only') 2900 format('Initial configuration is coordinates and velocities') 3000 format('Final configuration is coordinates only') 3100 format('Final configuration is coordinates and velocities') 3200 format('Random number seed :',i9) 3400 format('Frequency to print out simulation information :',i9) 3500 format('Number of steps in first equilibration regime :',i9) 3600 format('Number of steps in second equilibration regime :',i9) 3700 format('Number of steps in third equilibration regime :',i9) 3800 format('Frequency to take Monte Carlo step :',i9) 4325 format('Cutoff distance :', + f16.6) 4350 format('Neighbor list update frequency :',i9) 4400 format('Potential set to zero at cutoff distance') 4420 format('Potential and forces set to zero at cutoff distance') 4500 format('Writing from node :',i9) end c subroutine rdcfg #include "common.fh" c double precision scl,gasdev integer inode,icnt,i,j,k,pnum,ilast,ifirst,me character*32 filename c c This subroutine reads in the initial coordinates of all atoms in c the system. First determine which coordinates each processor c should read. c me = ga_nodeid() pnum = ga_nnodes() c c clean up everything c atot = 0 ctot = 0 antot = 0 do k = 1, 8 do j = 1, 3 do i = 1, MAXAT ra(i,j,k) = 0.0d00 end do end do end do do i = 1, MAXAT mass(i) = 0.0d00 at(i) = 0 aidx(i) = 0 c xcrd(i) = 0.0d00 ycrd(i) = 0.0d00 zcrd(i) = 0.0d00 xfrc(i) = 0.0d00 yfrc(i) = 0.0d00 zfrc(i) = 0.0d00 xacc(i) = 0.0d00 yacc(i) = 0.0d00 zacc(i) = 0.0d00 mbuf(i) = 0.0d00 bat(i) = 0 bidx(i) = 0 end do btot = 0 c if (task_id.lt.10) then write(filename,100) task_id else if (task_id.ge.10.and.task_id.lt.100) then write(filename,101) task_id else if (task_id.ge.100.and.task_id.lt.1000) then write(filename,102) task_id else if (task_id.ge.1000.and.task_id.lt.10000) then write(filename,103) task_id endif 100 format('md.cfg',i1) 101 format('md.cfg',i2) 102 format('md.cfg',i3) 103 format('md.cfg',i4) atot = 0 if (me.eq.0) then open (unit=2,file=filename,status='old') read(2,*) atot close(2) endif call ga_igop(5,atot,1,'+') ilast = nint(dble((me+1)*atot)/dble(pnum)) ifirst = nint(dble(me*atot)/dble(pnum)) ifirst = ifirst + 1 c c read in portions of MD configuration on each node c do inode = 0, pnum - 1 call ga_sync() if (me.eq.inode) then open (unit=2,file=filename,status='old') c read(2,*) atot read(2,*) xbox,ybox,zbox xbox2 = xbox/2.0d00 ybox2 = ybox/2.0d00 zbox2 = zbox/2.0d00 c cl_lower = 0.0d00 if (xbox.lt.ybox.and.xbox.lt.zbox) then cl_upper = xbox2 else if (ybox.lt.xbox.and.ybox.lt.zbox) then cl_upper = ybox2 else cl_upper = zbox2 endif mc_step = (cl_upper-cl_lower)/dble(mcbins) c icnt = 0 if (istart.eq.1.or.(.not.l_oldcfg)) then do i = 1, ilast if (i.lt.ifirst) then read(2,*) else icnt = icnt + 1 read(2,*) at(icnt),(ra(icnt,j,1),j=1,3) if (at(icnt).eq.2) ctot = ctot + 1 c c generate atomic velocities from a Maxwell-Boltzmann distribution c do j = 1, 3 scl = sqrt(dftmp / amass(at(icnt))) ra(icnt,j,2) = scl * gasdev(0) end do aidx(icnt) = i endif end do else do i = 1, ilast if (i.lt.ifirst) then read(2,*) else icnt = icnt + 1 read(2,*) at(icnt),(ra(icnt,j,1),j=1,3), + (ra(icnt,j,2),j=1,3) if (at(icnt).eq.2) ctot = ctot + 1 aidx(icnt) = i endif end do endif close(2) endif end do antot = icnt call ga_igop(9,ctot,1,'+') c if (me.eq.0.and.l_stdio) then write(6,1100) atot write(6,1000) xbox,ybox,zbox endif c c initialize absolute coordinates c do j = 1, 3 do i = 1, antot ra(i,j,6) = ra(i,j,1) end do end do c call fixper c return 1000 format('The initial box size parameters are '/ + ' x dimension = ',f9.4,' A'/ + ' y dimension = ',f9.4,' A'/ + ' z dimension = ',f9.4,' A') 1100 format('The total number of atoms in simulation :',i9) end c subroutine atomin #include "common.fh" c double precision epsln,sigma integer i,j,ipairs,ip,ktrnc integer me logical ichk(50,50) c c This subroutine reads in atomic parameters from a parameter c file. These parameters will be used to construct the c system potential function. c me = ga_nodeid() do i = 1, 50 do j = 1, 50 ichk(i,j) = .false. end do end do c if (me.eq.0) then open(unit=2,file='atom.inp',status='old') endif c if (me.eq.0) then read (2,*) amass(1) read (2,*) amass(2) read (2,*) amass(3) read (2,*) amass(4) atnum = 4 else amass(1) = 0.0d00 amass(2) = 0.0d00 amass(3) = 0.0d00 amass(4) = 0.0d00 atnum = 0 endif call ga_dgop(1,amass(1),4,'+') call ga_igop(2,atnum,1,'+') c c read in atomic parameters c if (me.eq.0) then read(2,*) ipairs else ipairs = 0 endif call ga_igop(3,ipairs,1,'+') c do 100 ip = 1, ipairs i = 0 j = 0 ktrnc = 0 epsln = 0.0d00 sigma = 0.0d00 if (me.eq.0) then read (2,*) i,j,ktrnc,epsln,sigma endif call ga_igop(1,i,1,'+') call ga_igop(2,j,1,'+') call ga_igop(3,ktrnc,1,'+') call ga_dgop(4,epsln,1,'+') call ga_dgop(5,sigma,1,'+') ichk(i,j) = .true. if (i.ne.j) ichk(j,i) = .true. e12(i,j) = 4.0d00*epsln*sigma**12 e6(i,j) = 4.0d00*epsln*sigma**6 if (i.ne.j) e12(j,i) = e12(i,j) if (i.ne.j) e6(j,i) = e6(i,j) if (ktrnc.eq.1) then acut(i,j) = exp(log(2.0d00)/6.0d00)*sigma acut(j,i) = exp(log(2.0d00)/6.0d00)*sigma else acut(i,j) = rcut * sigma acut(j,i) = rcut * sigma endif acut2(i,j) = acut(i,j)**2 acut2(j,i) = acut(j,i)**2 100 continue c if (me.eq.0) close(2) return end ga-5-4/global/examples/md_cluster/cl_sim.F0000644000175000017500000001413412662210461016627 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine cl_sim(natom1,natom2,task) #include "common.fh" c double precision tbeg,wraptime integer i,j,nprocs,ndim,me,task integer heap, stack, natom1, natom2 integer blocks(2),map0(MD_MAXPROC) integer map1(MD_MAXPROC),map2(MD_MAXPROC+1) character*32 filename logical status c c This is the main calling program for the Molecular Dynamics c calculation. c c set io control flags c l_stdio = .true. l_rad = .false. l_rst = .false. l_step = .true. l_oldcfg = .false. c do i = 1, MAXTIM tmstat(i) = 0.0d00 end do tbeg = wraptime() c c create communication arrays c nprocs = ga_nnodes() me = ga_nodeid() c c create map and block arrays to use irregular distributions c map2(1) = 1 blocks(1) = 1 blocks(2) = nprocs do i = 1, nprocs map0(i) = i map1(i) = (i-1)*MAXAT + 1 map2(i+1) = (i-1)*MAXAT + 1 end do c ndim = 1 g_size = ga_create_handle() call ga_set_data(g_size,ndim,nprocs,MT_INT) call ga_set_irreg_distr(g_size,map0,blocks(2)) c call ga_set_chunk(g_size,ndim) status = ga_allocate(g_size) c g_coords = ga_create_handle() ndim = 2 gcoords_hi(1) = 3 gcoords_hi(2) = MAXAT*nprocs call ga_set_data(g_coords,ndim,gcoords_hi,MT_DBL) call ga_set_irreg_distr(g_coords,map2,blocks) c gcoords_hi(2) = MAXAT c call ga_set_chunk(g_coords,gcoords_hi) status = ga_allocate(g_coords) c g_frc = ga_create_handle() ndim = 2 gfrc_hi(1) = 3 gfrc_hi(2) = MAXAT*nprocs call ga_set_data(g_frc,ndim,gfrc_hi,MT_DBL) call ga_set_irreg_distr(g_frc,map2,blocks) c gfrc_hi(2) = MAXAT c call ga_set_chunk(g_frc,gfrc_hi) status = ga_allocate(g_frc) c g_acc = ga_create_handle() ndim = 2 gacc_hi(1) = 3 gacc_hi(2) = MAXAT*nprocs call ga_set_data(g_acc,ndim,gacc_hi,MT_DBL) call ga_set_irreg_distr(g_acc,map2,blocks) c gacc_hi(2) = MAXAT c call ga_set_chunk(g_acc,gacc_hi) status = ga_allocate(g_acc) c g_index = ga_create_handle() ndim = 1 gindex_hi = MAXAT*nprocs call ga_set_data(g_index,ndim,gindex_hi,MT_INT) call ga_set_irreg_distr(g_index,map1,blocks(2)) c gindex_hi = MAXAT c call ga_set_chunk(g_index,gindex_hi) status = ga_allocate(g_index) c g_rvec = ga_create_handle() ndim = 1 grvec_hi = MAXAT*nprocs call ga_set_data(g_rvec,ndim,grvec_hi,MT_DBL) call ga_set_irreg_distr(g_rvec,map1,blocks(2)) c grvec_hi = MAXAT c call ga_set_chunk(g_rvec,grvec_hi) status = ga_allocate(g_rvec) c g_iat = ga_create_handle() ndim = 2 giat_hi(1) = 2 giat_hi(2) = MAXAT*nprocs call ga_set_data(g_iat,ndim,giat_hi,MT_INT) call ga_set_irreg_distr(g_iat,map2,blocks) c giat_hi(2) = MAXAT c call ga_set_chunk(g_iat,giat_hi) status = ga_allocate(g_iat) c c set up arrays for describing data held by each processor c do i = 0, nprocs-1 gsize_lo(i) = 0 gindex_lo(i) = 0 grvec_lo(i) = 0 do j = 1, 2 gcoords_lo(j,i) = 0 gfrc_lo(j,i) = 0 gacc_lo(j,i) = 0 giat_lo(j,i) = 0 end do end do call nga_distribution(g_size,me,gsize_lo(me),gsize_hi) call ga_igop(1,gsize_lo,nprocs,'+') call nga_distribution(g_coords,me,gcoords_lo(1,me),gcoords_hi) call ga_igop(2,gcoords_lo,2*nprocs,'+') call nga_distribution(g_frc,me,gfrc_lo(1,me),gfrc_hi) call ga_igop(3,gfrc_lo,2*nprocs,'+') call nga_distribution(g_acc,me,gacc_lo(1,me),gacc_hi) call ga_igop(4,gacc_lo,2*nprocs,'+') call nga_distribution(g_index,me,gindex_lo(me),gindex_hi) call ga_igop(5,gindex_lo,nprocs,'+') call nga_distribution(g_rvec,me,grvec_lo(me),grvec_hi) call ga_igop(6,grvec_lo,nprocs,'+') call nga_distribution(g_iat,me,giat_lo(1,me),giat_hi) call ga_igop(7,giat_lo,2*nprocs,'+') c c Read in variables and initial configuration c task_id = task if (me.eq.0.and.l_stdio) then if (task.lt.10) then write(filename,100) task else if (task.ge.10.and.task.lt.100) then write(filename,101) task else if (task.ge.100.and.task.lt.1000) then write(filename,102) task else if (task.ge.1000.and.task.lt.10000) then write(filename,103) task endif 100 format('md.out',i1) 101 format('md.out',i2) 102 format('md.out',i3) 103 format('md.out',i4) open(unit=6,file=filename,status='unknown') endif if (me.eq.0.and.l_rad) + open(unit=7,file='rad.dat',status='unknown') call rdpar call atomin r_cluster = 0.0d00 if (.not.l_oldcfg) then if (me.eq.0) call newcfg(natom1,natom2,task,r_cluster,rcut) endif call ga_dgop(3,r_cluster,1,'+') call rdcfg call shuffle c c Initialize MD calculations c call mdinit c c Begin MD calculation c call mdstep tmstat(1) = tmstat(1) + wraptime() - tbeg call mdout c c Close out calculation c if (l_stdio) close(6) if (l_rad) close(7) status = ga_destroy(g_size) status = ga_destroy(g_coords) status = ga_destroy(g_frc) status = ga_destroy(g_acc) status = ga_destroy(g_index) status = ga_destroy(g_rvec) status = ga_destroy(g_iat) c return end ga-5-4/global/examples/md_cluster/heapsort.F0000644000175000017500000001125312662210461017205 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine heapsort(iflg) #include "common.fh" c c c This routine sorts either the locally owned particles (iflg=0) or c the particles stored in the buffer arrays (iflg=1) so that they are c arranged in order of increasing index c double precision rr1(3,6),rmss double precision tbeg,wraptime c integer l, ir, i,j integer iflg,jj,kk,iat,idx c if (iflg.eq.1) go to 1000 if ( antot .eq. 0 ) return if ( antot .eq. 1 ) return c tbeg = wraptime() c l = antot/2 + 1 ir = antot c 10 continue if ( l .gt. 1 ) then l = l-1 do jj = 1, 3 do kk = 1, 6 rr1(jj,kk) = ra(l,jj,kk) end do end do rmss = mass(l) iat = at(l) idx = aidx(l) else do jj = 1, 3 do kk = 1, 6 rr1(jj,kk) = ra(ir,jj,kk) end do end do rmss = mass(ir) iat = at(ir) idx = aidx(ir) c do jj = 1, 3 do kk = 1, 6 ra(ir,jj,kk) = ra(1,jj,kk) end do end do mass(ir) = mass(1) at(ir) = at(1) aidx(ir) = aidx(1) ir = ir - 1 if ( ir .eq. 1 ) then do jj = 1, 3 do kk = 1, 6 ra(1,jj,kk) = rr1(jj,kk) end do end do mass(1) = rmss at(1) = iat aidx(1) = idx tmstat(9) = tmstat(9) + wraptime() - tbeg return endif endif c if ( ir .eq. 1 ) then tmstat(9) = tmstat(9) + wraptime() - tbeg return endif c i = l j = l + l 20 continue if ( j .le. ir ) then if ( j .lt. ir ) then if ( aidx(j) .lt. aidx(j+1)) j = j+1 endif if ( idx .lt. aidx(j)) then do jj = 1, 3 do kk = 1, 6 ra(i,jj,kk) = ra(j,jj,kk) end do end do mass(i) = mass(j) at(i) = at(j) aidx(i) = aidx(j) i = j j = j + j else j = ir + 1 endif go to 20 endif do jj = 1, 3 do kk = 1, 6 ra(i,jj,kk) = rr1(jj,kk) end do end do mass(i) = rmss at(i) = iat aidx(i) = idx goto 10 c 1000 if ( btot .eq. 0 ) return if ( btot .eq. 1 ) return c tbeg = wraptime() c l = btot/2 + 1 ir = btot c 30 continue if ( l .gt. 1 ) then l = l-1 rr1(1,1) = xcrd(l) rr1(2,1) = ycrd(l) rr1(3,1) = zcrd(l) rr1(1,2) = xfrc(l) rr1(2,2) = yfrc(l) rr1(3,2) = zfrc(l) rr1(3,3) = zacc(l) rmss = mbuf(l) iat = bat(l) idx = bidx(l) else rr1(1,1) = xcrd(ir) rr1(2,1) = ycrd(ir) rr1(3,1) = zcrd(ir) rr1(1,2) = xfrc(ir) rr1(2,2) = yfrc(ir) rr1(3,2) = zfrc(ir) rr1(3,3) = zacc(ir) rmss = mbuf(ir) iat = bat(ir) idx = bidx(ir) c xcrd(ir) = xcrd(1) ycrd(ir) = ycrd(1) zcrd(ir) = zcrd(1) xfrc(ir) = xfrc(1) yfrc(ir) = yfrc(1) zfrc(ir) = zfrc(1) zacc(ir) = zacc(1) mbuf(ir) = mbuf(1) bat(ir) = bat(1) bidx(ir) = bidx(1) ir = ir - 1 if ( ir .eq. 1 ) then xcrd(1) = rr1(1,1) ycrd(1) = rr1(2,1) zcrd(1) = rr1(3,1) xfrc(1) = rr1(1,2) yfrc(1) = rr1(2,2) zfrc(1) = rr1(3,2) zacc(1) = rr1(3,3) mbuf(1) = rmss bat(1) = iat bidx(1) = idx tmstat(10) = tmstat(10) + wraptime() - tbeg return endif endif c if ( ir .eq. 1 ) then tmstat(10) = tmstat(10) + wraptime() - tbeg return endif c i = l j = l + l 40 continue if ( j .le. ir ) then if ( j .lt. ir ) then if ( bidx(j) .lt. bidx(j+1)) j = j+1 endif if ( idx .lt. bidx(j)) then xcrd(i) = xcrd(j) ycrd(i) = ycrd(j) zcrd(i) = zcrd(j) xfrc(i) = xfrc(j) yfrc(i) = yfrc(j) zfrc(i) = zfrc(j) zacc(i) = zacc(j) mbuf(i) = mbuf(j) bat(i) = bat(j) bidx(i) = bidx(j) i = j j = j + j else j = ir + 1 endif go to 40 endif xcrd(i) = rr1(1,1) ycrd(i) = rr1(2,1) zcrd(i) = rr1(3,1) xfrc(i) = rr1(1,2) yfrc(i) = rr1(2,2) zfrc(i) = rr1(3,2) zacc(i) = rr1(3,3) mbuf(i) = rmss bat(i) = iat bidx(i) = idx goto 30 c end ga-5-4/global/examples/md_cluster/sort.F0000644000175000017500000000540612662210461016352 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine sort #include "common.fh" c integer snode,rnode,pnum,idx,idy,idz,ipx,ipy,ipz,ilast,ifirst integer i,icnt,inode,mynode c c This subroutine sorts the particle data onto each of the processors c so that each processor has a list of consecutively numbered particles. c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c c Find indices of first and last particle that should be on this c processor c ilast = nint(dble((ga_nodeid()+1)*atot)/dble(pnum)) ifirst = nint(dble(ga_nodeid()*atot)/dble(pnum)) ifirst = ifirst + 1 c c copy all particles into the buffer c icnt = 0 do i = 1, antot icnt = icnt + 1 xcrd(icnt) = ra(i,1,6) ycrd(icnt) = ra(i,2,6) zcrd(icnt) = ra(i,3,6) xfrc(icnt) = ra(i,1,2) yfrc(icnt) = ra(i,2,2) zfrc(icnt) = ra(i,3,2) mbuf(icnt) = mass(i) bidx(icnt) = aidx(i) bat(icnt) = at(i) end do btot = antot antot = 0 c c send buffers to all nodes in systolic loop c and select out particles that fall within the appropriate c range of indices c mynode = ga_nodeid() call icull(ifirst,ilast) do inode = 1, pnum-1 snode = ga_nodeid() + 1 if (snode.eq.pnum) snode = 0 rnode = ga_nodeid() - 1 if (rnode.eq.-1) rnode = pnum - 1 call exchange_buf(rnode) call icull(ifirst,ilast) end do c c rearrange data stack so that they are ordered with respect to c atom index c call heapsort(0) call fixper icnt = 0 c return end c subroutine icull(ifirst,ilast) #include "common.fh" c integer ifirst,ilast,i,icnt c c This subroutine gathers all the particles in the buffer arrays that c have indices lying in the domain [ifirst,ilast] c and puts them in the regular particle arrays c icnt = 0 do i = 1, btot if (bidx(i).ge.ifirst.and.bidx(i).le.ilast) then antot = antot + 1 ra(antot,1,6) = xcrd(i) ra(antot,2,6) = ycrd(i) ra(antot,3,6) = zcrd(i) ra(antot,1,2) = xfrc(i) ra(antot,2,2) = yfrc(i) ra(antot,3,2) = zfrc(i) mass(antot) = mbuf(i) aidx(antot) = bidx(i) at(antot) = bat(i) else icnt = icnt + 1 xcrd(icnt) = xcrd(i) ycrd(icnt) = ycrd(i) zcrd(icnt) = zcrd(i) xfrc(icnt) = xfrc(i) yfrc(icnt) = yfrc(i) zfrc(icnt) = zfrc(i) mbuf(icnt) = mbuf(i) bidx(icnt) = bidx(i) bat(icnt) = bat(i) endif end do btot = icnt c return end ga-5-4/global/examples/md_cluster/md_lj.in0000644000175000017500000000034112662210461016662 0ustar mbamba1000000000, 0.01, 2, -44933 2.5,20,0 1, 0.5, 0.05, 1000.0, 0.005 1, 1000, 100, 6, 0.5, 0.05, 1000.0, 0.005 1001, 1000000000, 100, 6, 0.5, 0.05, 1000.0, 0.005 2,2 10000000 50000,1000000,2000000 0.0076, 0.5, 0.0, 2.349 20, 100 ga-5-4/global/examples/md_cluster/hash.F0000644000175000017500000000250312662210461016301 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine clear_hash #include "common.fh" integer i c c Clear all information from hash tables prior to setting new tables c do i = 1, MAXAT link_a(i) = 0 top_a(i) = 0 hash_key_a(i) = 0 hash_value_a(i) = 0 end do a_cnt = 0 return end c subroutine add_hash_a(igx, idx) #include "common.fh" integer igx, idx, ifunc, itmp c c Add an element to hash table A, which tracks local particles. c Start by computing hash function value of idx. c ifunc = mod(igx,MAXAT) + 1 c c Store value in a linked list c a_cnt = a_cnt+1 itmp = top_a(ifunc) top_a(ifunc) = a_cnt link_a(a_cnt) = itmp hash_key_a(a_cnt) = igx hash_value_a(a_cnt) = idx return end c integer function get_hash_a(igx) #include "common.fh" integer igx, ifunc, itmp, jtmp c c Return the local index of a locally held particle from the global c index. Start by computing the hash function value of idx. c ifunc = mod(igx,MAXAT) + 1 get_hash_a = 0 itmp = top_a(ifunc) do while (hash_key_a(itmp).ne.igx.and.itmp.gt.0) itmp = link_a(itmp) end do if (itmp.gt.0) then get_hash_a = hash_value_a(itmp) endif return end ga-5-4/global/examples/md_cluster/update.F0000644000175000017500000004124512662210461016646 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine update #include "common.fh" c double precision xmax,ymax,zmax,xmin,ymin,zmin double precision xcell,ycell,zcell double precision tbeg,wraptime integer snode,rnode,pnum,inode,idx,idy,idz,ipx,ipy,ipz integer icnt,i,j,k,inx,iny,inz c c This subroutine gathers coordinates of particles that have moved off c the processor and sends then to neighboring processors. It also recieves c the coordinates of particles that have moved onto the processor. c tbeg = wraptime() call clear_hash pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c c determine local boundaries c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 xcell = xbox/dble(idx) ycell = ybox/dble(idy) zcell = zbox/dble(idz) c btot = 0 c c Send particles along x-axis. Gather all particles that lie within c processor domain c if (idx.ge.2) then c c collect all particles that have moved off of processor c if (idx.eq.2) then c c both boundaries are adjacent to boundaries on next processor c icnt = 0 do i = 1, antot if (ra(i,1,1).ge.xmax.or.ra(i,1,1).lt.xmin) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt else c c processor bounded by two separate processors c icnt = 0 do i = 1, antot if ((ra(i,1,1).ge.xmax.and.ra(i,1,1)-xmax.lt.xcell).or. + (ra(i,1,1).lt.xmin.and.xmin-ra(i,1,1).gt.xcell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt endif c c send particles in positive x direction c inx = ipx - 1 if (inx.eq.-1) inx = idx - 1 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call update_buf(rnode) call ucull endif c if (idx.gt.2) then c c each boundary is adjacent to a different processor c icnt = 0 do i = 1, antot if ((ra(i,1,1).lt.xmin.and.xmin-ra(i,1,1).lt.xcell).or. + (ra(i,1,1).gt.xmax.and.ra(i,1,1)-xmax.gt.xcell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt c c send particles in negative x direction c inx = ipx + 1 if (inx.eq.idx) inx = 0 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call update_buf(rnode) call ucull endif c c repeat for y axis c if (idy.ge.2) then c c both boundaries are adjacent to boundaries on next processor c if (idy.eq.2) then icnt = 0 do i = 1, antot if (ra(i,2,1).ge.ymax.or.ra(i,2,1).lt.ymin) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt else c c processor bounded by two separate processors c icnt = 0 do i = 1, antot if ((ra(i,2,1).ge.ymax.and.ra(i,2,1)-ymax.lt.ycell).or. + (ra(i,2,1).lt.ymin.and.ymin-ra(i,2,1).gt.ycell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt endif c c send particles in positive y direction c iny = ipy - 1 if (iny.eq.-1) iny = idy - 1 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call update_buf(rnode) call ucull endif icnt = 0 if (idy.gt.2) then c c each boundary is adjacent to a different processor c icnt = 0 do i = 1, antot if ((ra(i,2,1).lt.ymin.and.ymin-ra(i,2,1).lt.ycell).or. + (ra(i,2,1).gt.ymax.and.ra(i,2,1)-ymax.gt.ycell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt c c send particles in negative y direction c iny = ipy + 1 if (iny.eq.idy) iny = 0 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call update_buf(rnode) call ucull endif c c repeat for z axis c if (idz.ge.2) then c c both boundaries are adjacent to boundaries on next processor c if (idz.eq.2) then icnt = 0 do i = 1, antot if (ra(i,3,1).ge.zmax.or.ra(i,3,1).lt.zmin) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt else c c processor bounded by two separate processors c icnt = 0 do i = 1, antot if ((ra(i,3,1).ge.zmax.and.ra(i,3,1)-zmax.lt.zcell).or. + (ra(i,3,1).lt.zmin.and.zmin-ra(i,3,1).gt.zcell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt endif c c send particles in positive z direction c inz = ipz - 1 if (inz.eq.-1) inz = idz - 1 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call update_buf(rnode) call ucull endif if (idz.gt.2) then c c each boundary is adjacent to a different processor c icnt = 0 do i = 1, antot if ((ra(i,3,1).lt.zmin.and.zmin-ra(i,3,1).lt.zcell).or. + (ra(i,3,1).gt.zmax.and.ra(i,3,1)-zmax.gt.zcell)) then btot = btot + 1 xcrd(btot) = ra(i,1,6) ycrd(btot) = ra(i,2,6) zcrd(btot) = ra(i,3,6) xfrc(btot) = ra(i,1,2) yfrc(btot) = ra(i,2,2) zfrc(btot) = ra(i,3,2) xacc(btot) = ra(i,1,3) yacc(btot) = ra(i,2,3) zacc(btot) = ra(i,3,3) bat(btot) = at(i) mbuf(btot) = mass(i) bidx(btot) = aidx(i) else icnt = icnt + 1 do j = 1, 3 do k = 1, 6 ra(icnt,j,k) = ra(i,j,k) end do end do at(icnt) = at(i) mass(icnt) = mass(i) aidx(icnt) = aidx(i) endif end do antot = icnt c c send particles in negative z direction c inz = ipz + 1 if (inz.eq.idz) inz = 0 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call update_buf(rnode) call ucull endif c c call heapsort(0) do i = 1, antot call add_hash_a(aidx(i),i) end do c tmstat(8) = tmstat(8) + wraptime() - tbeg c return end c subroutine update_buf(rnode) #include "common.fh" c integer ibuf(2,MAXAT) double precision cbuf(3,MAXAT),fbuf(3,MAXAT),abuf(3,MAXAT) double precision vbuf(MAXAT) double precision tbeg,wraptime integer i, stot, rtot integer me,rnode,one,is,ld2,ld3 c c Reassign all particles to the appropriate node. c me = ga_nodeid() one = 1 ld2 = 2 ld3 = 3 c tbeg = wraptime() c stot = btot do i = 1, stot cbuf(1,i) = xcrd(i) cbuf(2,i) = ycrd(i) cbuf(3,i) = zcrd(i) fbuf(1,i) = xfrc(i) fbuf(2,i) = yfrc(i) fbuf(3,i) = zfrc(i) abuf(1,i) = xacc(i) abuf(2,i) = yacc(i) abuf(3,i) = zacc(i) vbuf(i) = mbuf(i) ibuf(1,i) = bidx(i) ibuf(2,i) = bat(i) end do c gsize_hi = gsize_lo(me) call nga_put(g_size,gsize_lo(me),gsize_hi,stot,one) gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,cbuf,ld3) gfrc_hi(1) = 3 gfrc_hi(2) = gfrc_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_frc,gfrc_lo(1,me),gfrc_hi,fbuf,ld3) gacc_hi(1) = 3 gacc_hi(2) = gacc_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_acc,gacc_lo(1,me),gacc_hi,abuf,ld3) grvec_hi = grvec_lo(me) + stot - 1 if (stot.gt.0) call nga_put(g_rvec,grvec_lo(me),grvec_hi,vbuf,one) giat_hi(1) = 2 giat_hi(2) = giat_lo(2,me) + stot - 1 if (stot.gt.0) call nga_put(g_iat,giat_lo(1,me),giat_hi,ibuf,ld2) c call ga_sync() c gsize_hi = gsize_lo(rnode) call nga_get(g_size,gsize_lo(rnode),gsize_hi,rtot,one) gcoords_hi(2) = gcoords_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,rnode), + gcoords_hi,cbuf,ld3) gfrc_hi(2) = gfrc_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_frc,gfrc_lo(1,rnode), + gfrc_hi,fbuf,ld3) gacc_hi(2) = gacc_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_acc,gacc_lo(1,rnode), + gacc_hi,abuf,ld3) grvec_hi = grvec_lo(rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_rvec,grvec_lo(rnode), + grvec_hi,vbuf,one) giat_hi(2) = giat_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_iat,giat_lo(1,rnode), + giat_hi,ibuf,ld2) c do i = 1, rtot xcrd(i) = cbuf(1,i) ycrd(i) = cbuf(2,i) zcrd(i) = cbuf(3,i) xfrc(i) = fbuf(1,i) yfrc(i) = fbuf(2,i) zfrc(i) = fbuf(3,i) xacc(i) = abuf(1,i) yacc(i) = abuf(2,i) zacc(i) = abuf(3,i) mbuf(i) = vbuf(i) bidx(i) = ibuf(1,i) bat(i) = ibuf(2,i) end do c btot = rtot call ga_sync() c tmstat(13) = tmstat(13) + wraptime() - tbeg c return end c subroutine ucull #include "common.fh" c double precision xmax,ymax,zmax,xmin,ymin,zmin double precision xt,yt,zt integer pnum,inode,idx,idy,idz,ipx,ipy,ipz integer i,icnt c pnum = ga_nnodes() call factor(pnum,idx,idy,idz) inode = ga_nodeid() call i_proc_to_xyz(inode,ipx,ipy,ipz,idx,idy,idz) c c determine local boundaries c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 c c select out particles from buffers that belong on the home array c icnt = 0 do i = 1, btot xt = xcrd(i) - xbox*anint(xcrd(i)/xbox) yt = ycrd(i) - ybox*anint(ycrd(i)/ybox) zt = zcrd(i) - zbox*anint(zcrd(i)/zbox) antot = antot + 1 ra(antot,1,6) = xcrd(i) ra(antot,2,6) = ycrd(i) ra(antot,3,6) = zcrd(i) ra(antot,1,2) = xfrc(i) ra(antot,2,2) = yfrc(i) ra(antot,3,2) = zfrc(i) ra(antot,1,3) = xacc(i) ra(antot,2,3) = yacc(i) ra(antot,3,3) = zacc(i) ra(antot,1,1) = xt ra(antot,2,1) = yt ra(antot,3,1) = zt at(antot) = bat(i) mass(antot) = mbuf(i) aidx(antot) = bidx(i) end do btot = icnt c return end ga-5-4/global/examples/md_cluster/grp_sim.F0000644000175000017500000001350312662210461017020 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c #define USE_SUBGROUPS 1 program grp_sim #include "common.fh" c integer MAXTASKS parameter (MAXTASKS=2000) integer i,j,me,icnt,ndim,one integer heap, stack, group_size, nprocs, ngroups, my_grp integer max_task, itask, jtask, natom1, natom2 integer group_list(2000), proc_list(2000) double precision tbeg, wraptime, elapsed double precision task_time(MAXTASKS),task_beg double precision proc_time(MD_MAXPROC), delta_t double precision maxtime, mintime,mingtime,maxgtime logical status c c This is the main calling program for the Molecular Dynamics c calculation. c c c Initialize message passing c #ifdef MSG_COMMS_MPI integer ierr call mpi_init(ierr) #else call pbeginf #endif tbeg = wraptime() c call ga_initialize() c c Initialize global arrays c heap = 2000000 stack = 2000000 c heap = 2000 c stack = 2000 if (.not.ma_init(MT_DBL, stack, heap)) + call ga_error("ma_init failed",-1) c c Create process groups c #if USE_SUBGROUPS group_size = 1 #else group_size = ga_nnodes() #endif max_task = 8 one = 1 nprocs = ga_nnodes() me = ga_nodeid() my_grp = (me-mod(me,group_size))/group_size do i = 1, min(max_task, MAXTASKS) task_time(i) = 0.0d00 end do #if USE_SUBGROUPS c write(6,101) my_grp,me 101 format('My group is ',i2,' on proc ',i3) ngroups = nprocs/group_size do i = 1, min(nprocs, MD_MAXPROC) proc_time(i) = 0.0d00 end do c write(6,102) ngroups,me 102 format('Ngroups is ',i2,' on proc ',i3) icnt = 0 do i = 1, ngroups do j = 1, group_size proc_list(j) = icnt icnt = icnt + 1 end do group_list(i) = ga_pgroup_create(proc_list,group_size) end do #endif c c Create global array to use for master-worker algorithm c g_counter = ga_create_handle() ndim = 1 call ga_set_data(g_counter,ndim,ndim,MT_INT) status = ga_allocate(g_counter) call ga_zero(g_counter) c write(6,103) me 103 format('Created counter array on ',i3) #if USE_SUBGROUPS c write(6,104) me,group_list(my_grp+1) 104 format('Default group on ',i3,' is ',i2) call ga_pgroup_set_default(group_list(my_grp+1)) c write(6,105) me 105 format('Set default group on ',i3) #endif 100 if (ga_nodeid().eq.0) then itask = nga_read_inc(g_counter,one,one) else itask = 0 endif call ga_igop(1,itask,1,'+') if (itask.lt.max_task) then c write(6,106) itask,me 106 format('Executing task ',i3,' on proc ',i3) natom1 = 400 natom1 = 0 jtask = max_task - 1 - itask natom2 = jtask*5 + 25 natom2 = jtask + 2 task_beg = wraptime() call cl_sim(natom1,natom2,jtask) delta_t = wraptime() - task_beg if (itask.lt.MAXTASKS) task_time(itask+1) = delta_t #if USE_SUBGROUPS i = ga_pgroup_nodeid(ga_pgroup_get_world()) i = i/group_size+1 if (i.le.MD_MAXPROC) proc_time(i) = delta_t #endif go to 100 endif #if USE_SUBGROUPS call ga_pgroup_set_default(ga_pgroup_get_world()) #endif call ga_dgop(3,task_time,MAXTASKS,'+') task_time(1) = task_time(1)/dble(group_size) mintime = task_time(1) maxtime = task_time(1) do i = 2, min(max_task, MAXTASKS) task_time(i) = task_time(i)/dble(group_size) if (task_time(i).gt.maxtime) maxtime=task_time(i) if (task_time(i).lt.mintime) mintime=task_time(i) end do call ga_dgop(4,proc_time,MD_MAXPROC,'+') proc_time(1) = proc_time(1)/dble(group_size) mingtime = proc_time(1) maxgtime = proc_time(1) do i = 2, min(ngroups, MD_MAXPROC) proc_time(i) = proc_time(i)/dble(group_size) if (proc_time(i).gt.maxgtime) maxgtime=proc_time(i) if (proc_time(i).lt.mingtime) mingtime=proc_time(i) end do elapsed = wraptime()-tbeg call ga_dgop(2,elapsed,1,'+') elapsed = elapsed/dble(nprocs) if (me.eq.0) then do i = 1, min(max_task, MAXTASKS) write(6,300) i,task_time(i) end do do i = 1, min(ngroups, MD_MAXPROC) write(6,301) i,proc_time(i) end do write(6,201) max_task write(6,202) group_size write(6,203) mintime write(6,204) maxtime write(6,205) mingtime write(6,206) maxgtime write(6,200) elapsed endif 200 format('Elapsed time for simulation : ',f16.4) 201 format('Number of tasks : ',i12) 202 format('Number of processors in group: ',i12) 203 format('Minimum time for task : ',f16.4) 204 format('Maximum time for task : ',f16.4) 205 format('Minimum time for group : ',f16.4) 206 format('Maximum time for group : ',f16.4) 300 format('Time for task[',i3,'] : ',f16.4) 301 format('Time for group[',i3,'] : ',f16.4) call ga_terminate() #ifdef MSG_COMMS_MPI c write(6,*) 'Calling mpi_finalize' call mpi_finalize() #else call pend #endif c write(6,*) 'Called mpi_finalize' c c close(6) stop end ga-5-4/global/examples/md_cluster/shuffle.F0000644000175000017500000002170412662210461017016 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine shuffle #include "common.fh" c integer snode,rnode,i,inx,iny,inz,pnum,idx,idy,idz,ipx,ipy,ipz integer icnt,inode,me c c This subroutine shuffles the coordinates on each of the processors c around so that each processor has the coordinates for atoms residing c in the physical domain corresponding to that processor. This routine c assumes that atoms are completely randomized. c pnum = ga_nnodes() me = ga_nodeid() call factor(pnum,idx,idy,idz) call i_proc_to_xyz(me,ipx,ipy,ipz,idx,idy,idz) c c copy all particles into the buffer c icnt = 0 do i = 1, antot icnt = icnt + 1 ra(i,1,6) = ra(i,1,1) ra(i,2,6) = ra(i,2,1) ra(i,3,6) = ra(i,3,1) xcrd(icnt) = ra(i,1,6) ycrd(icnt) = ra(i,2,6) zcrd(icnt) = ra(i,3,6) xfrc(icnt) = ra(i,1,2) yfrc(icnt) = ra(i,2,2) zfrc(icnt) = ra(i,3,2) mbuf(icnt) = mass(i) bidx(icnt) = aidx(i) bat(icnt) = at(i) end do btot = antot antot = 0 c c send buffers to processes controlling neighboring domains, c and select out particles that are within that domain c c send along x-axis and gather particles whose x value lies c between xmin and xmax c call cull(1) do i = 1, idx-1 inx = ipx - 1 if (inx.eq.-1) inx = idx - 1 call i_xyz_to_proc(rnode,inx,ipy,ipz,idx,idy,idz) call exchange_buf(rnode) call cull(1) end do c c copy all particles into the buffer c icnt = 0 do i = 1, antot icnt = icnt + 1 xcrd(icnt) = ra(i,1,6) ycrd(icnt) = ra(i,2,6) zcrd(icnt) = ra(i,3,6) xfrc(icnt) = ra(i,1,2) yfrc(icnt) = ra(i,2,2) zfrc(icnt) = ra(i,3,2) mbuf(icnt) = mass(i) bidx(icnt) = aidx(i) bat(icnt) = at(i) end do btot = antot antot = 0 c c send along y-axis and gather particles whose y value lies c between ymin and ymax c call cull(2) do i = 1, idy-1 iny = ipy - 1 if (iny.eq.-1) iny = idy - 1 call i_xyz_to_proc(rnode,ipx,iny,ipz,idx,idy,idz) call exchange_buf(rnode) call cull(2) end do c c copy all particles into the buffer c icnt = 0 do i = 1, antot icnt = icnt + 1 xcrd(icnt) = ra(i,1,6) ycrd(icnt) = ra(i,2,6) zcrd(icnt) = ra(i,3,6) xfrc(icnt) = ra(i,1,2) yfrc(icnt) = ra(i,2,2) zfrc(icnt) = ra(i,3,2) mbuf(icnt) = mass(i) bidx(icnt) = aidx(i) bat(icnt) = at(i) end do btot = antot antot = 0 c c send along z-axis and gather particles whose z value lies c between zmin and zmax c call cull(3) do i = 1, idz-1 inz = ipz - 1 if (inz.eq.-1) inz = idz - 1 call i_xyz_to_proc(rnode,ipx,ipy,inz,idx,idy,idz) call exchange_buf(rnode) call cull(3) end do c c rearrange data stack so that they are ordered with respect to c atom index c call heapsort(0) call fixper c return end c subroutine exchange_buf(rnode) #include "common.fh" c double precision buf(3,MAXAT), rbuf(MAXAT) integer i, ibuf(MAXAT) integer rnode, rptr, rtot, me, one, ld c c exchange the size of lists c me = ga_nodeid() one = 1 ld = 3 c do i = 1, btot buf(1,i) = xcrd(i) buf(2,i) = ycrd(i) buf(3,i) = zcrd(i) end do c rptr = gsize_lo(me) call nga_put(g_size,rptr,rptr,btot,one) gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + btot - 1 if (btot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,buf,ld) call ga_sync() rptr = gsize_lo(rnode) call nga_get(g_size,rptr,rptr,rtot,one) gcoords_hi(2) = gcoords_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,rnode), + gcoords_hi,buf,ld) c do i = 1, rtot xcrd(i) = buf(1,i) ycrd(i) = buf(2,i) zcrd(i) = buf(3,i) end do call ga_sync() c do i = 1, btot buf(1,i) = xfrc(i) buf(2,i) = yfrc(i) buf(3,i) = zfrc(i) end do c gcoords_hi(1) = 3 gcoords_hi(2) = gcoords_lo(2,me) + btot - 1 if (btot.gt.0) call nga_put(g_coords,gcoords_lo(1,me), + gcoords_hi,buf,ld) call ga_sync() gcoords_hi(2) = gcoords_lo(2,rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_coords,gcoords_lo(1,rnode), + gcoords_hi,buf,ld) c do i = 1, rtot xfrc(i) = buf(1,i) yfrc(i) = buf(2,i) zfrc(i) = buf(3,i) end do call ga_sync() c do i = 1, btot rbuf(i) = mbuf(i) end do c grvec_hi = grvec_lo(me) + btot - 1 if (btot.gt.0) call nga_put(g_rvec,grvec_lo(me),grvec_hi,rbuf,ld) call ga_sync() grvec_hi = grvec_lo(rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_rvec,grvec_lo(rnode), + grvec_hi,rbuf,ld) c do i = 1, rtot mbuf(i) = rbuf(i) end do call ga_sync() c do i = 1, btot ibuf(i) = bidx(i) end do c gindex_hi = gindex_lo(me) + btot - 1 if (btot.gt.0) call nga_put(g_index,gindex_lo(me), + gindex_hi,ibuf,ld) call ga_sync() gindex_hi = gindex_lo(rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_index,gindex_lo(rnode), + gindex_hi,ibuf,ld) c do i = 1, rtot bidx(i) = ibuf(i) end do call ga_sync() c do i = 1, btot ibuf(i) = bat(i) end do c gindex_hi = gindex_lo(me) + btot - 1 if (btot.gt.0) call nga_put(g_index,gindex_lo(me),gindex_hi, + ibuf,ld) call ga_sync() gindex_hi = gindex_lo(rnode) + rtot - 1 if (rtot.gt.0) call nga_get(g_index,gindex_lo(rnode), + gindex_hi,ibuf,ld) c do i = 1, rtot bat(i) = ibuf(i) end do call ga_sync() c btot = rtot c return end c subroutine cull(iflg) #include "common.fh" c double precision xmax,ymax,zmax,xmin,ymin,zmin double precision xt,yt,zt integer i,pnum,me,idx,idy,idz,ipx,ipy,ipz integer icnt,iflg logical xflg,yflg,zflg c c This subroutine gathers all the particles in the buffer arrays that c have coordinates lying in the domain corresponding to the processor c and puts them in the regular particle arrays c c Determine boundaries of the physical domain assigned to the processor c pnum = ga_nnodes() me = ga_nodeid() call factor(pnum,idx,idy,idz) call i_proc_to_xyz(me,ipx,ipy,ipz,idx,idy,idz) c c set logical flags c if (iflg.eq.1) then xflg = .true. yflg = .false. zflg = .false. elseif (iflg.eq.2) then xflg = .false. yflg = .true. zflg = .false. elseif (iflg.eq.3) then xflg = .false. yflg = .false. zflg = .true. else call ga_error("Illegal direction in subroutine cull",iflg ) endif c xmax = xbox*dble(ipx+1)/dble(idx) ymax = ybox*dble(ipy+1)/dble(idy) zmax = zbox*dble(ipz+1)/dble(idz) xmin = xbox*dble(ipx)/dble(idx) ymin = ybox*dble(ipy)/dble(idy) zmin = zbox*dble(ipz)/dble(idz) xmax = xmax - xbox2 ymax = ymax - ybox2 zmax = zmax - zbox2 xmin = xmin - xbox2 ymin = ymin - ybox2 zmin = zmin - zbox2 c c Locate all particles on the processor that should reside c on the processor and move all others to the buffer c icnt = 0 do i = 1, btot xt = xcrd(i) - xbox * anint(xcrd(i)/xbox) yt = ycrd(i) - ybox * anint(ycrd(i)/ybox) zt = zcrd(i) - zbox * anint(zcrd(i)/zbox) if (xt.eq.xbox2) xt = -xbox2 if (yt.eq.ybox2) yt = -ybox2 if (zt.eq.zbox2) zt = -zbox2 if ((xflg.and.xt.lt.xmax.and.xt.ge.xmin).or. + (yflg.and.yt.lt.ymax.and.yt.ge.ymin).or. + (zflg.and.zt.lt.zmax.and.zt.ge.zmin)) then antot = antot + 1 ra(antot,1,6) = xcrd(i) ra(antot,2,6) = ycrd(i) ra(antot,3,6) = zcrd(i) ra(antot,1,2) = xfrc(i) ra(antot,2,2) = yfrc(i) ra(antot,3,2) = zfrc(i) mass(antot) = mbuf(i) aidx(antot) = bidx(i) at(antot) = bat(i) else icnt = icnt + 1 xcrd(icnt) = xcrd(i) ycrd(icnt) = ycrd(i) zcrd(icnt) = zcrd(i) xfrc(icnt) = xfrc(i) yfrc(icnt) = yfrc(i) zfrc(icnt) = zfrc(i) mbuf(icnt) = mbuf(i) bidx(icnt) = bidx(i) bat(icnt) = bat(i) endif end do btot = icnt c if (btot.gt.MAXAT) then c call ga_error("btot greater than MAXAT in cull",btot) c endif c return end ga-5-4/global/examples/md_cluster/common.fh0000644000175000017500000002212212662210461017055 0ustar mbambac c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c implicit none #include "mafdecls.fh" #include "global.fh" #ifdef MPI # include "mpif.h" #else # include "tcgmsg.fh" #endif integer MAXNRG,MAXNB,MAXAT,MAXTIM integer NSTES,NSTDF integer MD_MAXPROC,MAXBINS parameter (MAXNRG=50, MAXNB=100) parameter (MAXAT = 40000) parameter (MAXTIM=50) parameter (NSTES=1000) parameter (MAXBINS = 2000) parameter (MD_MAXPROC=1024) c c Arrays containing locally held atoms and their properties. atot is c the total number of atoms and antot is the number of locally held c atoms. aidx is an array containing the absolute atomic index of c each locally held atom. at is an array containing an index to the c atom type, and ra is an array containing the coordinates, velocities, c and forces of each locally held atom. The array ra contains c ra(i,j,1): periodic coordinates that all are within the c simulation cell c ra(i,j,2): velocities c ra(i,j,3): accelerations c ra(i,j,4): forces (not including constraint forces) c ra(i,j,5): momentum c ra(i,j,6): absolute coordinates c ra(i,j,7): complete forces from previous timestep c ra(i,j,8): temporary storage to construct accelations with c constraints c common /syspar/ ra(MAXAT,3,8),mass(MAXAT),at(MAXAT),aidx(MAXAT), + atot,antot double precision ra,mass integer at,aidx,atot,antot c c Global array handles and utility arrays for moving data around c common /ga_data/ g_size, gsize_lo(0:MD_MAXPROC), gsize_hi, + g_coords, gcoords_lo(2,0:MD_MAXPROC), + gcoords_hi(2), + g_frc, gfrc_lo(2,0:MD_MAXPROC), gfrc_hi(2), + g_acc, gacc_lo(2,0:MD_MAXPROC), gacc_hi(2), + g_index, gindex_lo(0:MD_MAXPROC), gindex_hi, + g_iat, giat_lo(2,0:MD_MAXPROC), giat_hi(2), + g_rvec, grvec_lo(0:MD_MAXPROC), grvec_hi integer g_size, gsize_lo, gsize_hi, g_coords,gcoords_lo, + gcoords_hi, g_frc, gfrc_hi, gfrc_lo, g_acc, gacc_lo, + gacc_hi, g_index, gindex_lo, gindex_hi, g_iat, giat_hi, + giat_lo, g_rvec, grvec_lo, grvec_hi common /md_par/ tau,dftmp,dfprs,dftm,dfpm,rsc(20,4), + tmprtr,prssr,tmass,pmass,tvol,tavg,tmstrt, + nsc,nstep,istep,ilist,dflalg,isc(20,4),istart, + istop,tmpflg,prsflg,ptflg,istat,itarg,itavg, + ipmode,iseed,mbflg,cmflg double precision tau,dftmp,dfprs,dftm,dfpm,rsc, + tmprtr,prssr,tmass,pmass,tvol,tavg integer tmstrt,nsc,nstep,istep,ilist,dflalg,isc integer istart,istop,istat,itarg integer itavg,ipmode,iseed logical tmpflg,prsflg,ptflg,mbflg,cmflg common /simpar/ xbox,ybox,zbox,xbox2,ybox2,zbox2, + vol1,vol2,vol3,scal1,scal2,scal3, + alen1(3),alen2(3),alen3(3) double precision xbox,ybox,zbox,xbox2,ybox2,zbox2, + vol1,vol2,vol3,scal1,scal2,scal3,alen1,alen2,alen3 common /nrgpar/ nrg(MAXNRG),anrg(MAXNRG),anrg2(MAXNRG), + presf,presfx,presfy,presfz,esvr,esvd,esvoh, + esva,asev(MAXAT),nrgcnt,nrg2ct double precision nrg,anrg,anrg2,presf,esvr,esvd,esvoh,esva,asev, + presfx,presfy,presfz integer nrgcnt,nrg2ct common /apars/ amass(50),e12(50,50),e6(50,50), + dcorr(50,50),rcorr(50,50), + frcorr(50,50),fdcorr(50,50), + rcut,acut(50,50),acut2(50,50),rcmax,icut,atnum double precision amass,e12,e6,dcorr,rcorr,frcorr,fdcorr,acut,rcut, + acut2,rcmax integer icut,atnum common /md_timer/ tmstat(MAXTIM) double precision tmstat common /espar/ pmvac(NSTES),tmvac(NSTES),ipmvac(NSTES), + itmvac(NSTES),esinc,esstps,esflg double precision pmvac,tmvac integer ipmvac,itmvac,esinc,esstps logical esflg c c coordinates of atoms that are not held locally are stored in xcrc, c ycrd, zcrd, similarly, forces for atoms not held locally are stored c in xfrc, yfrc, zfrc c common /md_buffer/xcrd(MAXAT),ycrd(MAXAT),zcrd(MAXAT),xfrc(MAXAT), + yfrc(MAXAT),zfrc(MAXAT),xacc(MAXAT),yacc(MAXAT), + zacc(MAXAT),mbuf(MAXAT),bidx(MAXAT),bat(MAXAT), + btot,savtot double precision xcrd,ycrd,zcrd,xfrc,yfrc,zfrc,xacc,yacc,zacc,mbuf integer bidx,bat,btot,savtot c common /md_cell/rcell,kcmax,nix(2000),niy(2000),niz(2000) double precision rcell integer kcmax,nix,niy,niz c c the xgru, xgrd etc. buffers keep track of which atoms are within a c cutoff distance of the upper (u) and lower (d) boundaries of the c cell. The ygbu, ygbd etc. buffers keep track of which buffer atoms c are within a cutoff distance of the boundaries (these buffers are c not needed for the x-direction updates). The ygbu, etc. buffers are c used in the gather routine. The ysbu, etc. buffers are used in a c similar way in the scatter routine. c common /svlist/ xgru(MAXAT),xgrd(MAXAT),ygru(MAXAT),ygrd(MAXAT), + zgru(MAXAT),zgrd(MAXAT), + ygbu(MAXAT),ygbd(MAXAT),zgbu(MAXAT),zgbd(MAXAT), + xsbu(MAXAT),xsbd(MAXAT),ysbu(MAXAT),ysbd(MAXAT), + zsbu(MAXAT),zsbd(MAXAT), + clist(6,MAXAT), + ixgru,ixgrd,iygru,iygrd,izgru,izgrd, + iygbu,iygbd,izgbu,izgbd integer xgru,xgrd,ygru,ygrd,zgru,zgrd, + ygbu,ygbd,zgbu,zgbd, + ixgru,ixgrd,iygru,iygrd,izgru,izgrd, + iygbu,iygbd,izgbu,izgbd,ixsbu,ixsbd,iysbu,iysbd, + izsbu,izsbd logical xsbu,xsbd,ysbu,ysbd,zsbu,zsbd logical clist c common /neighbors/ nblist(MAXAT*MAXNB),nalast(MAXAT), + nblast(MAXAT),nafirst(MAXAT),nbfirst(MAXAT), + blist(3*MAXAT),balast(MAXAT), + bblast(MAXAT),bafirst(MAXAT),bbfirst(MAXAT) integer nblist,nalast,nblast,nafirst,nbfirst integer blist,balast,bblast,bafirst,bbfirst c common /clusterpar/ cl_cmx, cl_cmy, cl_cmz, r_cluster, cl_sep, + cl_vcmx, cl_vcmy, cl_vcmz, + cl_acmx, cl_acmy, cl_acmz, + cl_prssr, cl_mass, r_cluster_old, + cl_old(MAXAT,3,3), cl_cm_old(3), + cl_vcm_old(3), cl_vol1_old, cl_vol2_old, + cl_box_old(3), cl_alen1_old(3), + cl_alen2_old(3), cl_scal1_old, cl_scal2_old, + cl_at(MAXAT), cl_tot, ctot, nocluster double precision cl_cmx, cl_cmy, cl_cmz, r_cluster, cl_sep, + cl_vcmx, cl_vcmy, cl_vcmz, + cl_acmx, cl_acmy, cl_acmz, + cl_prssr, cl_mass, cl_old, r_cluster_old, + cl_cm_old, cl_vcm_old, cl_vol1_old, cl_vol2_old, + cl_box_old, cl_alen1_old, cl_alen2_old, + cl_scal1_old, cl_scal2_old integer cl_at, ctot, cl_tot logical nocluster common /solventpar/ sl_old(MAXAT,3,3),sl_at(MAXAT),sl_tot double precision sl_old integer sl_at, sl_tot common /equil_protocol/ r_confine, equil_1, equil_2, equil_3, + window_1, window_2 double precision r_confine integer equil_1, equil_2, equil_3, window_1, window_2 common /cllsnpar/ mmass, cllsn_idx, l_cllsn, cllsn_cnt, + cllsn_isav, failcount double precision mmass integer cllsn_idx, cllsn_cnt, cllsn_isav, failcount logical l_cllsn common /mcpar/ cl_lower, cl_upper, mc_step, mc_tmprtr, mc_dr, + r_distr(0:MAXBINS,10), r_cnt(10), mcbins, mcfreq, + mc_cnt, mc_start double precision cl_lower, cl_upper, mc_step, mc_tmprtr, mc_dr integer r_distr, r_cnt, mcbins, mcfreq, mc_cnt, mc_start common /taskpar/ task_id, g_counter integer task_id, g_counter common /iopar/ l_stdio, l_rad, l_rst, l_step, l_oldcfg logical l_stdio, l_rad, l_rst, l_step, l_oldcfg common /adapt/ t_done, t_rmndr double precision t_done, t_rmndr common /hashpar/ link_a(MAXAT), top_a(MAXAT), hash_key_a(MAXAT), + hash_value_a(MAXAT), a_cnt integer link_a, top_a, hash_key_a, hash_value_a, a_cnt ga-5-4/global/examples/md_cluster/cluster.F0000644000175000017500000012473212662210461017050 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine cluster_com #include "common.fh" c integer i double precision masstot, dx, dy, dz double precision r,rdot,com(10) c c This subroutine calculates the center of mass (COM) of the cluster of c particles of type 2, excluding the lone particle. c if (nocluster) return cl_cmx = 0.0d00 cl_cmy = 0.0d00 cl_cmz = 0.0d00 cl_acmx = 0.0d00 cl_acmy = 0.0d00 cl_acmz = 0.0d00 cl_vcmx = 0.0d00 cl_vcmy = 0.0d00 cl_vcmz = 0.0d00 masstot = 0.0d00 c do i = 1, antot c if (at(i).eq.2.and.aidx(i).ne.cl_lone_particle) then if (at(i).eq.2) then cl_cmx = cl_cmx + mass(i)*ra(i,1,6) cl_cmy = cl_cmy + mass(i)*ra(i,2,6) cl_cmz = cl_cmz + mass(i)*ra(i,3,6) cl_acmx = cl_acmx + ra(i,1,4) cl_acmy = cl_acmy + ra(i,2,4) cl_acmz = cl_acmz + ra(i,3,4) cl_vcmx = cl_vcmx + mass(i)*ra(i,1,2) cl_vcmy = cl_vcmy + mass(i)*ra(i,2,2) cl_vcmz = cl_vcmz + mass(i)*ra(i,3,2) masstot = masstot + mass(i) endif end do com(1) = cl_cmx com(2) = cl_cmy com(3) = cl_cmz com(4) = cl_vcmx com(5) = cl_vcmy com(6) = cl_vcmz com(7) = cl_acmx com(8) = cl_acmy com(9) = cl_acmz com(10) = masstot call ga_dgop(3,com,10,'+') cl_cmx = com(1) cl_cmy = com(2) cl_cmz = com(3) cl_acmx = com(7) cl_acmy = com(8) cl_acmz = com(9) cl_vcmx = com(4) cl_vcmy = com(5) cl_vcmz = com(6) masstot = com(10) if (masstot.gt.0.0d00) then cl_cmx = cl_cmx / masstot cl_cmy = cl_cmy / masstot cl_cmz = cl_cmz / masstot cl_acmx = cl_acmx / masstot cl_acmy = cl_acmy / masstot cl_acmz = cl_acmz / masstot cl_vcmx = cl_vcmx / masstot cl_vcmy = cl_vcmy / masstot cl_vcmz = cl_vcmz / masstot endif cl_mass = masstot c return end c subroutine cluster_therm #include "common.fh" c integer i double precision dx, dy, dz double precision r,rdot c c remove component of velocity that lies along the vector from COM c to the particle, if particle is outside cluster radius. This gradually c forces particles to form a drop. c if (nocluster) return if (istep.ge.equil_1) return call cluster_com do i = 1, antot c if (at(i).eq.2.and.aidx(i).ne.cl_lone_particle) then if (at(i).eq.2) then dx = ra(i,1,1) - cl_cmx dy = ra(i,2,1) - cl_cmy dz = ra(i,3,1) - cl_cmz r = sqrt(dx**2 + dy**2 + dz**2) dx = dx/r dy = dy/r dz = dz/r if (r.gt.r_cluster) then rdot = ra(i,1,2)*dx+ra(i,2,2)*dy+ra(i,3,2)*dz if (rdot.gt.0.0d00) then ra(i,1,2) = ra(i,1,2) - 2.0d00*rdot*dx ra(i,2,2) = ra(i,2,2) - 2.0d00*rdot*dy ra(i,3,2) = ra(i,3,2) - 2.0d00*rdot*dz endif endif endif end do c return end c subroutine cluster_center #include "common.fh" c c move center of mass to origin (only perform this if it is immediately c followed by a call to update subroutine) c integer i,me logical debug if (nocluster) return if (istep.eq.0.or.(mod(istep,ilist).eq.0.and. + t_rmndr.eq.0.0d00)) then me = ga_nodeid() if (istep.ge.6932366) then debug = .false. else debug = .false. endif if (debug) then write(6,*) me,' mod(istep,ilist) = ',mod(istep,ilist) write(6,*) me,' ilist = ',ilist endif call cluster_com if (debug) write(6,*) me,'cl_cmx (a) = ',cl_cmx,istep if (debug) write(6,*) me,'cl_cmy (a) = ',cl_cmy,istep if (debug) write(6,*) me,'cl_cmz (a) = ',cl_cmz,istep do i = 1, antot ra(i,1,6) = ra(i,1,6) - cl_cmx ra(i,2,6) = ra(i,2,6) - cl_cmy ra(i,3,6) = ra(i,3,6) - cl_cmz end do call fixper call cluster_com if (debug) write(6,*) me,'cl_cmx (b) = ',cl_cmx,istep if (debug) write(6,*) me,'cl_cmy (b) = ',cl_cmy,istep if (debug) write(6,*) me,'cl_cmz (b) = ',cl_cmz,istep endif return end c subroutine cluster_old_at #include "common.fh" c c store original coordinates of cluster atoms c integer i, icnt, jcnt if (nocluster) return icnt = 0 jcnt = 0 do i = 1, antot if (at(i).eq.2) then icnt = icnt + 1 cl_at(icnt) = i cl_old(icnt,1,1) = ra(i,1,1) cl_old(icnt,2,1) = ra(i,2,1) cl_old(icnt,3,1) = ra(i,3,1) cl_old(icnt,1,2) = ra(i,1,6) cl_old(icnt,2,2) = ra(i,2,6) cl_old(icnt,3,2) = ra(i,3,6) cl_old(icnt,1,3) = ra(i,1,2) cl_old(icnt,2,3) = ra(i,2,2) cl_old(icnt,3,3) = ra(i,3,2) endif if (at(i).eq.1) then jcnt = jcnt + 1 sl_at(jcnt) = i sl_old(jcnt,1,1) = ra(i,1,1) sl_old(jcnt,2,1) = ra(i,2,1) sl_old(jcnt,3,1) = ra(i,3,1) sl_old(jcnt,1,2) = ra(i,1,6) sl_old(jcnt,2,2) = ra(i,2,6) sl_old(jcnt,3,2) = ra(i,3,6) sl_old(jcnt,1,3) = ra(i,1,2) sl_old(jcnt,2,3) = ra(i,2,2) sl_old(jcnt,3,3) = ra(i,3,2) endif end do c cl_cm_old(1) = cl_cmx cl_cm_old(2) = cl_cmy cl_cm_old(3) = cl_cmz cl_vcm_old(1) = cl_vcmx cl_vcm_old(2) = cl_vcmy cl_vcm_old(3) = cl_vcmz c do i = 1, 3 cl_alen1_old(i) = alen1(i) cl_alen2_old(i) = alen2(i) end do cl_vol1_old = vol1 cl_vol2_old = vol2 cl_box_old(1) = xbox cl_box_old(2) = ybox cl_box_old(3) = zbox cl_scal1_old = scal1 cl_scal2_old = scal2 c cl_tot = icnt sl_tot = jcnt return end c subroutine cluster_check_cllsn #include "common.fh" c c This subroutine checks to see if any of the cluster particles have moved c beyond the cutoff radius from the center of mass of the cluster. If they c have, then the initial guess for the particle coordinates and velocities c is modified to reflect the collision with the restraining sphere. c integer icnt, iat, i, j, ii, jj, iloc, imin, scndat, reset double precision r, r2, rx, ry, rz, dtmax, tsav double precision rrx, rry, rrz, vvx, vvy, vvz double precision vn, vx, vy, vz, fx, fy, fz, mu, v2, f2 double precision vrdot, frdot, vfdot, a, b, c double precision t1, t2, tcut, comm(4), tmax, htausq double precision rnx, rny, rnz, vpx, vpy, vpz, vllx, vlly, vllz double precision t3, t4, ax, ay, az, tchk, tmin, t_est double precision r1x, r1y, r1z, r2x, r2y, r2z, rmax, rskin, rn double precision cluster_find_tau integer failsafe, ibuf(MD_MAXPROC), me, nproc, twohit logical debug integer iter c iter = 0 l_cllsn = .false. if (nocluster) then t_rmndr = 0.0d00 t_done = tau return endif me = ga_nodeid() nproc = ga_nnodes() if (istep.ge.68365721.and.istep.le.68365723) then debug = .false. else debug = .false. endif rskin = 0.02d00 tmax = t_rmndr if (t_rmndr.eq.tau) cllsn_isav = 0 100 dtmax = 2.0d00*t_rmndr twohit = 0 failsafe = 0 iat = 0 iloc = 0 tsav = 0.0d00 rmax = r_cluster if (debug) write(6,*) me,' atot = ',atot,istep if (debug) write(6,*) me,' antot = ',antot,istep if (debug) write(6,*) me, ' r_cluster = ',r_cluster,istep if (debug) write(6,*) me,' t_rmndr = ',tmax,istep if (debug) write(6,*) me,' cl_cmx(1) = ',cl_cmx,istep if (debug) write(6,*) me,' cl_cmy(1) = ',cl_cmy,istep if (debug) write(6,*) me,' cl_cmz(1) = ',cl_cmz,istep do i = 1, cl_tot ii = cl_at(i) rx = ra(ii,1,6) - cl_cmx ry = ra(ii,2,6) - cl_cmy rz = ra(ii,3,6) - cl_cmz r2 = rx**2 + ry**2 + rz**2 r = sqrt(r2) c if (debug) write(6,*) me, 'ra(ii,1,6) ',ra(ii,1,6),istep c if (debug) write(6,*) me, 'ra(ii,2,6) ',ra(ii,2,6),istep c if (debug) write(6,*) me, 'ra(ii,3,6) ',ra(ii,3,6),istep if (r.gt.r_cluster) then if (r.gt.rmax) rmax = r if (debug) write(6,*) me,' tmax = ',tmax,istep if (debug) write(6,*) me,' dtmax = ',dtmax,istep if (debug) write(6,*) me,' ii = ',ii,istep if (debug) write(6,*) me,' antot = ',antot,istep if (debug) write(6,*) me,' r-r_cluster ',r-r_cluster,istep if (debug) write(6,*) me,' r_cluster = ',r_cluster,istep if (debug) write(6,*) me,' sqrt(r2) = ',sqrt(r2),istep if (debug) write(6,*) me,' ra(1) = ',ra(ii,1,6),istep if (debug) write(6,*) me,' ra(2) = ',ra(ii,2,6),istep if (debug) write(6,*) me,' ra(3) = ',ra(ii,3,6),istep if (debug) write(6,*) me,' cl_cmx = ',cl_cmx,istep if (debug) write(6,*) me,' cl_cmy = ',cl_cmy,istep if (debug) write(6,*) me,' cl_cmz = ',cl_cmz,istep if (debug) write(6,*) me,' r_cluster_old = ',r_cluster_old, + istep if (debug) write(6,*) me,' cl_old(1) = ',cl_old(i,1,2),istep if (debug) write(6,*) me,' cl_old(2) = ',cl_old(i,2,2),istep if (debug) write(6,*) me,' cl_old(3) = ',cl_old(i,3,2),istep if (debug) write(6,*) me,' cl_cm_old(1) = ',cl_cm_old(1),istep if (debug) write(6,*) me,' cl_cm_old(2) = ',cl_cm_old(2),istep if (debug) write(6,*) me,' cl_cm_old(3) = ',cl_cm_old(3),istep if (debug) write(6,*) me,' r_old = ', sqrt( + + (cl_old(i,1,2)-cl_cm_old(1))**2 + + (cl_old(i,2,2)-cl_cm_old(2))**2 + + (cl_old(i,3,2)-cl_cm_old(3))**2) rn = sqrt(rx**2+ry**2+rz**2) vn = ra(ii,1,2)*rx+ra(ii,2,2)*ry+ra(ii,3,2)*rz vn = vn/rn t_est = vn*(rn-r_cluster) tcut = cluster_find_tau(ii,i,cllsn_isav,tmax,.false.) if (debug) write(6,*) me,' tcut = ',tcut,istep if (debug) write(6,*) me,' t_est = ',t_est,istep if (debug) write(6,155) me,1,tcut,istep 155 format(i3,' tcut at ',i1,': ',f12.4,' step: ',i8) c c Check to see if collision is earlier than previously found collisions c and that it is also greater than zero. c if (tcut.lt.dtmax.and.tcut.gt.0.0d00) then c c Try to protect against numerical roundoff by checking that different c particle collides with sphere or that collision time is significantly c greater than zero if it is the same particle c if (.not.(ii.eq.cllsn_isav.and.tcut.lt.1.0d-03)) then dtmax = tcut tsav = tcut iat = ii iloc = i else write(6,101) ii, tcut, istep 101 format('Rejected collision of atom ',i8,' at time ', + f16.8,' at step ',i8) failsafe = 1 endif else if (tcut.lt.0.0d00) then write(6,*) ga_nodeid(),' vn ',vn,istep write(6,*) ga_nodeid(),' t_est ',t_est,istep write(6,*) ga_nodeid(),' r-r_cluster ',r-r_cluster,istep write(6,*) ga_nodeid(),' Returned negative value at 1',istep failsafe = 1 endif #if 0 c c Check for trajectories that may have gone out and then back into c confining sphere c else if (r_cluster-r.lt.rskin.and.r_cluster-r.gt.0.0d00) then vn = rx*ra(ii,1,2)+ry*ra(ii,2,2)+rz*ra(ii,3,2) if (vn.le.0.0d00) then tcut = cluster_find_tau(ii,i,cllsn_isav,tmax,.true.) if (tcut.lt.dtmax.and.tcut.gt.0.0d00) then write(6,*) 'Found looping trajectory',istep write(6,*) 'dtmax = ',dtmax,istep write(6,*) 'tcut = ',tcut,istep write(6,*) 'ii = ',ii,istep write(6,*) 'cllsn_isav = ',cllsn_isav,istep write(6,*) 'r = ',r,istep write(6,*) 'r_cluster = ',r_cluster,istep if (.not.(ii.eq.cllsn_isav.and.tcut.lt.1.0d-10)) then write(6,*) 'Resetting trajectory',istep dtmax = tcut tsav = tcut iat = ii iloc = i else write(6,*)'Not resetting trajectory (loop is too short)' endif endif endif #endif endif end do c c Check to see if a collision occured on another processor c ibuf(1) = iat ibuf(2) = failsafe if (debug) write(6,*) me,' iat = ',iat,istep if (debug) write(6,*) me,' failsafe = ',failsafe,istep if (debug) write(6,*) me,' ibuf(1) = ',ibuf(1),istep if (debug) write(6,*) me,' ibuf(2) = ',ibuf(2),istep call ga_igop(5,ibuf,2,'+') if (debug) write(6,*) me,' ibuf(1) = ',ibuf(1),istep if (debug) write(6,*) me,' ibuf(2) = ',ibuf(2),istep c c No collisions detected. Step is complete so just return. c if (ibuf(1).eq.0.and.ibuf(2).eq.0) then t_rmndr = 0.0d00 t_done = tau if (debug) write(6,*) me,' Returning with no hits ',istep return endif c c If no solution found for atom outside confining sphere, then bail c completely and increase diameter of confining sphere so that all c atoms are enclosed. c if (ibuf(2).gt.0) then call ga_dgop(4,rmax,1,'max') if (debug) write(6,*) me,' r_cluster (a) = ',r_cluster r_cluster = r_cluster + (rmax - r_cluster)*1.1d00 if (debug) write(6,*) me,' r_cluster (b) = ',r_cluster if (ga_nodeid().eq.0) then write(6,*) ga_nodeid(),' Returned negative value at 2',istep endif failcount = failcount + 1 t_rmndr = 0.0d00 t_done = tau return endif c c At this point, a collision has been detected on at least on c processor. Check to find minimum time if collisions occur on more c than one processor. c if (iat.eq.0) then tsav = tau endif a = tsav call ga_dgop(6,a,1,'min') c c Find mass of particle that has first collision with confining sphere c if (a.eq.tsav) then b = mass(iat) else b = 0.0d00 endif call ga_dgop(7,b,1,'max') 1000 mmass = cl_mass - b tcut = a if (debug) write(6,155) me,2,tcut,istep if (tsav.ne.a) then iat = 0 iloc = 0 cllsn_isav = 0 if (debug) write(6,*) me,' cllsn_isav(1): ',cllsn_isav else cllsn_isav = iat if (debug) write(6,*) me,' cllsn_isav(2): ',cllsn_isav endif c c Handle degenerate case of only two atoms in cluster, which will c generally have two simultaneous collisions c if (ctot.eq.2) then do i = 1, nproc if (i-1.eq.me) then ibuf(i) = iat else ibuf(i) = 0 endif end do call ga_igop(3,ibuf,nproc,'+') j = 0 iat = 0 cllsn_isav = 0 do i = 1, nproc if (ibuf(i).gt.0.and.i-1.eq.me.and.j.eq.0) then iat = ibuf(i) cllsn_isav = ibuf(i) j = 1 else if (ibuf(i).gt.0) then j = 1 endif end do c c Make sure that correct mass is being used for collision c if (iat.ne.0) then b = mass(iat) else b = 0.0d00 endif call ga_dgop(6,b,1,'max') mmass = cl_mass - b endif c c Now recalculate coordinates of all particles in the cluster c call cluster_reset(tcut) call cluster_com !CHECK c c Check to see if there were any trajectories that pass through confining c sphere twice (i.e. goes out and then comes back in). Don't bother with c check if there are only 2 particles in system. c if (ctot.eq.2) then go to 2000 endif reset = 0 tchk = 0.0d00 scndat = 0 tmin = tcut tsav = tcut failsafe = 0 do i = 1, cl_tot ii = cl_at(i) rx = ra(ii,1,6) - cl_cmx ry = ra(ii,2,6) - cl_cmy rz = ra(ii,3,6) - cl_cmz r = sqrt(rx**2+ry**2+rz**2) if (r.ge.r_cluster.and.ii.ne.cllsn_isav) then tchk = cluster_find_tau(ii,i,cllsn_isav,tcut,.false.) if (debug) write(6,155) me,7,tchk,istep if (debug) write(6,*) me, 'ii: ',ii if (debug) write(6,*) me, 'cllsn_isav: ',cllsn_isav reset = 1 if (tchk.lt.tmin.and.tchk.gt.0.0d00) then if (debug) write(6,*) me,' Shorter collision found' tmin = tchk imin = ii if (debug) write(6,155) me,4,tchk,istep if (debug) write(6,155) me,5,tmin,istep else if (tchk.lt.0.0d00) then write(6,*) ga_nodeid(),' Returned negative value at 3',istep failsafe = 1 else c c This case should theoretically be impossible, but it may occur because of c roundoff c write(6,*) me,' tchk greater than or equal to tmin',istep write(6,*) me,' tchk = ',tchk,istep write(6,*) me,' tmin = ',tmin,istep failsafe = 1 endif endif end do ibuf(1) = reset ibuf(2) = failsafe call ga_igop(2,ibuf,2,'+') c c No solution for tau found, so increase confining sphere and then bail c if (ibuf(2).gt.0) then if (debug) write(6,*) me,' rmax (c) = ',rmax call ga_dgop(4,rmax,1,'max') if (debug) write(6,*) me,' rmax (d) = ',rmax if (debug) write(6,*) me,' r_cluster (c) = ',r_cluster r_cluster = r_cluster + (rmax - r_cluster)*1.1d00 if (debug) write(6,*) me,' r_cluster (d) = ',r_cluster if (ga_nodeid().eq.0) then write(6,*) 'Bogus value of collision time at 2' endif call cluster_reset(t_rmndr) t_rmndr = 0.0d00 t_done = tau return endif reset = ibuf(1) c c Shorter collision found so recalculate positions c if (reset.gt.0) then if (tmin.le.tsav) then if (debug) write(6,*) 'tmin = ',tmin,istep if (debug) write(6,*) 'tsav = ',tsav,istep a = tmin else a = tau endif call ga_dgop(2,a,1,'min') c if (a.le.tsav) then if (a.ne.tmin) then iat = 0 iloc = 0 cllsn_isav = 0 if (debug) write(6,*) me,'cllsn_isav(3): ',cllsn_isav else cllsn_isav = imin if (debug) write(6,*) me,'cllsn_isav(4): ',cllsn_isav endif tcut = a tsav = a !BJP is this correct? if (debug) write(6,155) me,3,tcut,istep if (iat.gt.0) then b = mass(iat) else b = 0.0d00 endif call ga_dgop(7,b,1,'+') call cluster_reset(0.0d00) iter = iter + 1 if (iter.gt.100) debug = .true. if (iter.gt.1000) call ga_error('Too many iterations',0) go to 1000 endif endif c 2000 l_cllsn = .true. cllsn_idx = cllsn_isav c t_rmndr = tmax - tcut t_done = tau - t_rmndr if (debug) write(6,*) me, 't_rmndr = ',t_rmndr if (debug) write(6,*) me, 't_done = ',t_done c return end c double precision function cluster_find_tau(iat,iloc,isav,tmax, + forward) #include "common.fh" c c This function calculates the time at which a particle outside the confining c sphere would have collided with the sphere. c integer iat, iloc, isav double precision r, r2, rx, ry, rz, dr double precision rrx, rry, rrz, vvx, vvy, vvz double precision vx, vy, vz, fx, fy, fz, v2, f2 double precision clcut, frdot, vrdot, vfdot, a, b, c double precision t, t1, t2, tcut, tmax, thi, tlo, tmid double precision ttmin,ttmax integer i,j,me,iter logical forward, debug c c A particle lies outside the cutoff. Find particle that crosses c cutoff first. c if (istep.ge.68365721.and.istep.le.68365723) then debug = .false. else debug = .false. endif me = ga_nodeid() mmass = cl_mass - mass(iat) c c Calculate center of mass and velocity of center of mass of remaining c particles in cluster (these are the rr and vv vectors) c rrx = (cl_mass*cl_cm_old(1) - mass(iat)*cl_old(iloc,1,2))/mmass rry = (cl_mass*cl_cm_old(2) - mass(iat)*cl_old(iloc,2,2))/mmass rrz = (cl_mass*cl_cm_old(3) - mass(iat)*cl_old(iloc,3,2))/mmass vvx = (cl_mass*cl_vcm_old(1) - mass(iat)*cl_old(iloc,1,3))/mmass vvy = (cl_mass*cl_vcm_old(2) - mass(iat)*cl_old(iloc,2,3))/mmass vvz = (cl_mass*cl_vcm_old(3) - mass(iat)*cl_old(iloc,3,3))/mmass c c The r and v vectors are the relative coordinates and velocities of c particle iat and the center of mass vectors. The vector f is the c force along this relative coordinate. c rx = cl_old(iloc,1,2) - cl_cm_old(1) ry = cl_old(iloc,2,2) - cl_cm_old(2) rz = cl_old(iloc,3,2) - cl_cm_old(3) vx = cl_old(iloc,1,3) - cl_vcm_old(1) vy = cl_old(iloc,2,3) - cl_vcm_old(2) vz = cl_old(iloc,3,3) - cl_vcm_old(3) fx = ra(iat,1,3) - cl_acmx fy = ra(iat,2,3) - cl_acmy fz = ra(iat,3,3) - cl_acmz c r = sqrt(rx**2 + ry**2 + rz**2) c c Note that we are using acceleration instead of force, c so factors of reduced mass disappear c vrdot = vx*rx + vy*ry + vz*rz frdot = fx*rx + fy*ry + fz*rz vfdot = vx*fx + vy*fy + vz*fz clcut = r_cluster v2 = vx**2 + vy**2 + vz**2 a = v2+frdot b = 2.0d00*vrdot c c c = rx**2 + ry**2 + rz**2 - clcut**2 c c Calculate c to minimize roundoff error from subtracting large numbers c dr = r - clcut c = 2.0d00*r*dr+dr**2 f2 = fx**2 + fy**2 + fz**2 c c Scan forwards from 0 to find a final value of t2. If no final c value found, then return with value of -1. c if (debug) write(6,*) me, 'iat: ',iat if (debug) write(6,*) me, 'a: ',a if (debug) write(6,*) me, 'b: ',b if (debug) write(6,*) me, 'c: ',c if (debug) write(6,*) me, 'f2: ',f2 if (debug) write(6,*) me, 'vfdot: ',vfdot if (forward) then t = tmax t1 = 0.0d00 ttmin = t1 ttmax = t c tlo = c + t1*(b + t1*(a+t1*(vfdot+t1*0.25d00*f2))) tlo = (-c-t1**2*(a+t1*(vfdot+t1*0.25d00*f2)))/b - t1 do i = 1, 1000 if (t.eq.tmax) then t2= tmax*dble(i)/1000.0d00 c thi = c + t2*(b + t2*(a+t2*(vfdot+t2*0.25d00*f2))) thi = (-c-t2**2*(a+t2*(vfdot+t2*0.25d00*f2)))/b - t2 if ((thi.ge.0.0d00.and.tlo.le.0.0d00).or. + (thi.le.0.0d00.and.tlo.ge.0.0d00)) then t = t2 write(6,*) ga_nodeid(),' tmin = ',ttmin,istep write(6,*) ga_nodeid(),' tmax = ',ttmax,istep write(6,*) ga_nodeid(),' tlo = ',tlo,istep write(6,*) ga_nodeid(),' thi = ',thi,istep write(6,*) ga_nodeid(),' t = ',t,istep go to 500 endif endif end do cluster_find_tau = -1.0d00 return c c scan backwards from tmax to find an initial value of t1 c else t = 0.0d00 t2 = tmax c thi = c + t2*(b + t2*(a+t2*(vfdot+t2*0.25d00*f2))) thi = (-c-t2**2*(a+t2*(vfdot+t2*0.25d00*f2)))/b - t2 do i = 1, 1000 if (t.eq.0.0d00) then t1= tmax - tmax*dble(i)/1000.0d00 c tlo = c + t1*(b + t1*(a+t1*(vfdot+t1*0.25d00*f2))) tlo = (-c-t1**2*(a+t1*(vfdot+t1*0.25d00*f2)))/b - t1 if ((thi.ge.0.0d00.and.tlo.le.0.0d00).or. + (thi.le.0.0d00.and.tlo.ge.0.0d00)) then t = t1 if (debug) write(6,*) me, 'tlo: ',tlo if (debug) write(6,*) me, 'thi: ',thi if (debug) write(6,*) me, 't: ',t go to 500 endif endif end do endif c c Use bisections to find accurate solution c 500 if (forward) then t1 = 0.0d00 t2 = t else t1 = t t2 = tmax if (debug) write(6,*) me, 't1: ',t1 if (debug) write(6,*) me, 't2: ',t2 endif iter = 0 c 600 tlo = c + t1*(b + t1*(a+t1*(vfdot+t1*0.25d00*f2))) c thi = c + t2*(b + t2*(a+t2*(vfdot+t2*0.25d00*f2))) 600 tlo = (-c-t1**2*(a+t1*(vfdot+t1*0.25d00*f2)))/b - t1 thi = (-c-t2**2*(a+t2*(vfdot+t2*0.25d00*f2)))/b - t2 if ((thi.ge.0.0d00.and.tlo.le.0.0d00).or. + (thi.le.0.0d00.and.tlo.ge.0.0d00)) then t = 0.5d00*(t1+t2) c tmid = c + t*(b + t*(a+t*(vfdot+t*0.25d00*f2))) tmid = (-c-t**2*(a+t*(vfdot+t*0.25d00*f2)))/b - t if ((tmid.ge.0.0d00.and.thi.le.0.0d00).or. + (tmid.le.0.0d00.and.thi.ge.0.0d00)) then t1 = t else if ((tmid.ge.0.0d00.and.tlo.le.0.0d00).or. + (tmid.le.0.0d00.and.tlo.ge.0.0d00)) then t2 = t endif tcut = 0.5d00*(t1+t2) iter = iter + 1 if (abs(t1-t2)/tau.gt.1.0d-14.and.iter.lt.1000) go to 600 c c Protect against numerical roundoff errors c if (iter.ge.1000) then write(6,*) ga_nodeid(),' Maxed out on iterations' endif if (forward.and.(tcut.lt.1.0d-10.or. + abs(tcut-tmax).lt.1.0d-10)) then cluster_find_tau = -1.0d00 return endif else open(unit=2,file='tau.dat',status='unknown') do j = 0, 1000 t = tmax*dble(j)/1000.0d00 t1 = (-c-t**2*(a+t*(vfdot+t*0.25d00*f2)))/b - t tmid = c + t*(b + t*(a+t*(vfdot+t*0.25d00*f2))) write(2,300) t,t1, tmid 300 format(3(' ',f16.8)) end do close(2) if (iat.ne.isav) then if (abs(thi).lt.0.000001d00) then tcut = tmax else if (abs(tlo).lt.0.000001d00) then if (vrdot.gt.0.0d00) then tcut = 0.0d00 else tcut = tmax endif else if (forward) write(6,*) 'Searching forward' write(6,*) 'Collision time does not converge at step ',istep tcut = -1.0d00 endif else tcut = 4.0d00*tau endif endif c if (forward) write(6,*) ga_nodeid(),' tcut = ',tcut cluster_find_tau = tcut return end c double precision function cluster_check_radius() #include "common.fh" double precision rx, ry, rz, r2, cl2 integer i c c check to make sure that all cluster particles are within cluster c radius c cl2 = 0.0d00 do i = 1, antot if (at(i).eq.2) then rx = ra(i,1,6) - cl_cmx ry = ra(i,2,6) - cl_cmy rz = ra(i,3,6) - cl_cmz r2 = rx**2 + ry**2 + rz**2 if (r2.gt.cl2) cl2 = r2 endif end do call ga_dgop(4,cl2,1,'max') c cluster_check_radius = sqrt(cl2) return end c subroutine cluster_mc #include "common.fh" c c Perform Monte Carlo adjustment of volume on confining volume c double precision r_old, delta_r, r2, cl2, rx, ry, rz, pi double precision vol_new, vol_old, x, ran1, ratio integer i, icnt, iat, me logical force_move,debug c if (nocluster) return if (istep.ge.6932366) then debug = .false. else debug = .false. endif call cluster_com me = ga_nodeid() r_cluster_old = r_cluster r_old = r_cluster force_move = .false. delta_r = 0.2 if (debug) write(6,*)me,' (1) r_cluster ',r_cluster,istep if (me.eq.0) then r_cluster = r_cluster + delta_r*(ran1(0)-0.5d00) else r_cluster = 0.0d00 endif if (debug) write(6,*)me,' (2) r_cluster ',r_cluster,istep call ga_dgop(1,r_cluster,1,'+') if (debug) write(6,*)me,' (3) r_cluster ',r_cluster,istep c c If new value of r_cluster falls outside of allowed interval then c it is rejected, unless old value was aready outside interval. c if (r_cluster.ge.cl_upper.or.r_cluster.le.cl_lower) then c c If new values move cluster radius closer to cutoffs from the outside, c then accept them, reject them otherwise. Before accepting move, make c sure that there are no illegal overlaps. c force_move = .true. if (r_cluster.gt.r_old.and.r_cluster.gt.cl_upper) then r_cluster = r_old else if (r_cluster.lt.r_old.and.r_cluster.lt.cl_lower) then r_cluster = r_old endif if (r_cluster.eq.r_old) return endif if (debug) write(6,*)me,' (4) r_cluster ',r_cluster,istep c c Check to see if any particles are outside new value of r_cluster. c If so, then new value is rejected. c if (r_cluster.lt.r_old) then icnt = 0 cl2 = r_cluster**2 do i = 1, antot if (at(i).eq.2) then rx = ra(i,1,6) - cl_cmx ry = ra(i,2,6) - cl_cmy rz = ra(i,3,6) - cl_cmz r2 = rx**2 + ry**2 + rz**2 if (r2.gt.cl2) then icnt = icnt + 1 endif endif end do call ga_igop(9,icnt,1,'+') if (icnt.gt.0) then r_cluster = r_old return endif endif if (debug) write(6,*)me,' (5) r_cluster ',r_cluster,istep if (force_move) return c c Accept with Monte Carlo probability. c pi = 4.0d00*atan(1.0d00) vol_new = 4.0d00*pi*r_cluster**3/3.0d00 vol_old = 4.0d00*pi*r_old**3/3.0d00 ratio = (r_cluster/r_old)**2 c x = ratio*exp(-cl_prssr*(vol_new-vol_old)/mc_tmprtr) if (me.eq.0) then if (x.ge.1.0d00) then icnt = 1 else if (ran1(0).lt.x) then icnt = 1 else icnt = 0 endif endif else icnt = 0 endif call ga_igop(1,icnt,1,'+') if (icnt.eq.0) then r_cluster = r_old endif if (debug) write(6,*)me,' (6) r_cluster ',r_cluster,istep return end c subroutine cluster_binr #include "common.fh" c c Bin the current value of r_cluster c double precision dr integer ir, isample if (nocluster) return c c Find bin c dr = r_cluster - cl_lower ir = int(dr/mc_step) + 1 if (ir.le.0) ir = 1 if (ir.gt.mcbins) ir = mcbins mc_cnt = mc_cnt + 1 c c Find slice for statistics c if (istep.gt.mc_start) then isample = int(10.0d00*(dble(istep-mc_start)-0.5d00) + / dble(nstep-mc_start)) + 1 if (isample.gt.10) isample = 10 else isample = 1 endif r_cnt(isample) = r_cnt(isample) + 1 r_distr(ir,isample) = r_distr(ir,isample) + 1 return end c subroutine cluster_print_binr #include "common.fh" c c Print out the distribution of r_cluster c double precision rdist(MAXBINS), norm, r, normi double precision rdist2(MAXBINS), sum double precision sigr(MAXBINS),sigr2(MAXBINS) double precision sig2(MAXBINS),sig2_2(MAXBINS) double precision rdisti(MAXBINS,10),rdisti2(MAXBINS,10) integer itot, i, j, isample character*32 filename c if (nocluster) return if (task_id.lt.10) then write(filename,100) task_id else if (task_id.ge.10.and.task_id.lt.100) then write(filename,101) task_id else if (task_id.ge.100.and.task_id.lt.1000) then write(filename,102) task_id else if (task_id.ge.1000.and.task_id.lt.10000) then write(filename,103) task_id endif 100 format('cl.distr.',i1) 101 format('cl.distr.',i2) 102 format('cl.distr.',i3) 103 format('cl.distr.',i4) c c Evaluate normalized distribution and uncertainty for P(r) c if (mc_cnt.lt.0) return norm = dble(mc_cnt) do i = 1, mcbins rdist(i) = 0.0d00 rdist2(i) = 0.0d00 sig2(i) = 0.0d00 sig2_2(i) = 0.0d00 sigr(i) = 0.0d00 sigr2(i) = 0.0d00 do j = 1, 10 rdisti(i,j) = 0.0d00 rdisti2(i,j) = 0.0d00 end do end do do j = 1, 10 normi = dble(r_cnt(j)) do i = 1, mcbins rdist(i) = rdist(i) + dble(r_distr(i,j))/norm rdisti(i,j) = dble(r_distr(i,j))/normi end do end do do j = 1, 10 do i = 1, mcbins sig2(i) = sig2(i) + rdisti(i,j)**2 end do end do do i = 1, mcbins sigr(i) = (sig2(i)-10.0d00*rdist(i)**2)/9.0d00 end do c c Uncertainty at the 95% confidence level c do i = 1, mcbins sigr(i) = 2.23d00*sqrt(sigr(i)/10.d00) end do sum = 0.0d00 do i = 1, mcbins sum = sum + rdist(i) end do do i = 1, mcbins rdist(i) = rdist(i)/(sum*mc_step) sigr(i) = sigr(i)/(sum*mc_step) end do c c Evaluate normalized distribution and uncertainty for P(V) c do j = 1, 10 normi = dble(r_cnt(j)) do i = 1, mcbins r = cl_lower + (dble(i)-0.5d00)*mc_step rdist2(i) = rdist2(i) + dble(r_distr(i,j))/(r**2*norm) rdisti2(i,j) = dble(r_distr(i,j))/(r**2*normi) end do end do do j = 1, 10 do i = 1, mcbins sig2_2(i) = sig2_2(i) + rdisti2(i,j)**2 end do end do do i = 1, mcbins sigr2(i) = (sig2_2(i)-10.0d00*rdist2(i)**2)/9.0d00 end do c c Uncertainty at the 95% confidence level c do i = 1, mcbins sigr2(i) = 2.23d00*sqrt(sigr2(i)/10.d00) end do sum = 0.0d00 do i = 1, mcbins sum = sum + rdist2(i) end do do i = 1, mcbins rdist2(i) = rdist2(i)/(sum*mc_step) sigr2(i) = sigr2(i)/(sum*mc_step) end do c if (ga_nodeid().eq.0) then open(unit=2,file=filename,status='unknown') do i = 1, mcbins r = cl_lower + (dble(i)-0.5d00)*mc_step write(2,200) r, rdist(i), rdist2(i),sigr(i),sigr2(i) 200 format(f12.4,' ',f16.8,' ',f16.8,' ', + f16.8,' 'f16.8) end do close(2) endif c return end c subroutine cluster_clear_binr #include "common.fh" c c clear the distribution of r_cluster c integer itot, i, j c if (nocluster) return do j = 1, 10 do i = 1, MAXBINS r_distr(i,j) = 0 end do r_cnt(j) = 0 end do mc_cnt = 0 mc_start = istep c return end c subroutine cluster_reset_binr(iflg) #include "common.fh" c c recalculate bounds for confining sphere c integer iflg,ilow,ihi,imax,i if (nocluster) return if (iflg.eq.1) then c c find minimum and maximum values of distribution and reset c windows to just bound these values c if (ga_nodeid().eq.0.and.l_rad) then open(unit=3,file="win1.dat",status='unknown') do i = 1, mcbins write(3,*) i, r_distr(i,1) end do endif ilow = 0 ihi = 0 do i = 1, mcbins if (r_distr(i,1).gt.0.and.ilow.eq.0) then ilow = i-1 if (ilow.lt.1) ilow = 1 endif if (ilow.gt.0.and.ihi.eq.0.and.r_distr(i,1).eq.0) then ihi = i endif end do if (ihi.eq.0) ihi = mcbins if (ihi.lt.mcbins) then cl_upper = cl_lower + mc_step*dble(ihi) endif if (ihi.gt.1) then cl_lower = cl_lower + mc_step*dble(ilow-1) endif else if (iflg.eq.2) then c c reset bounds so that maximum is set at radius value that c is the maximum value of distribution c ilow = 1 ihi = 0 imax = 0 do i = 1, mcbins c if (r_distr(i,1).gt.0.and.ilow.eq.0) then c ilow = i-1 c if (ilow.lt.1) ilow = 1 c endif if (r_distr(i,1).gt.imax) then ihi = i imax = r_distr(i,1) endif end do if (ihi.eq.0) ihi = mcbins if (ihi.lt.mcbins) then cl_upper = cl_lower + mc_step*dble(ihi) endif if (ilow.gt.1) then cl_lower = cl_lower + mc_step*dble(ilow-1) endif endif cl_upper = 3.5d00 cl_lower = 0.5d00 cl_upper = 4.5d00 cl_lower = 0.5d00 mc_step = (cl_upper-cl_lower)/dble(mcbins) call cluster_clear_binr return end c subroutine cluster_do_cllsn #include "common.fh" integer iat, i, j, ii, jj, iloc, isav, scndat double precision r, r2, rc2, rx, ry, rz double precision rrx, rry, rrz, vvx, vvy, vvz double precision vx, vy, vz, fx, fy, fz, mu, v2, f2 double precision comm(4), tmax, tcut, vrdot double precision rnx, rny, rnz, vpx, vpy, vpz, vllx, vlly, vllz c c Re-evaluate all particle velocities. First, recalculate center of c mass and center of mass velocity of cluster at new coordinates c and velocities. c if (nocluster) return cllsn_cnt = cllsn_cnt + 1 iat = cllsn_idx call cluster_com if (iat.gt.0) then rrx = (cl_mass*cl_cmx - mass(iat)*ra(iat,1,6))/mmass rry = (cl_mass*cl_cmy - mass(iat)*ra(iat,2,6))/mmass rrz = (cl_mass*cl_cmz - mass(iat)*ra(iat,3,6))/mmass vvx = (cl_mass*cl_vcmx - mass(iat)*ra(iat,1,2))/mmass vvy = (cl_mass*cl_vcmy - mass(iat)*ra(iat,2,2))/mmass vvz = (cl_mass*cl_vcmz - mass(iat)*ra(iat,3,2))/mmass c c The r and v vectors are the relative coordinates and velocities of c particle iat and the center of mass vectors. The vector f is the c force along this relative coordinate. c rx = ra(iat,1,6) - rrx ry = ra(iat,2,6) - rry rz = ra(iat,3,6) - rrz vx = ra(iat,1,2) - vvx vy = ra(iat,2,2) - vvy vz = ra(iat,3,2) - vvz c c Decompose velocity v into components that are parallel and perpendicular c to r. Save this information for computing post-collision velocities. c r = sqrt(rx**2 + ry**2 + rz**2) rnx = rx/r rny = ry/r rnz = rz/r vrdot = vx*rnx + vy*rny + vz*rnz vllx = vrdot * rnx vlly = vrdot * rny vllz = vrdot * rnz vpx = vx - vllx vpy = vy - vlly vpz = vz - vllz comm(1) = (vpx-vllx-vx)/cl_mass comm(2) = (vpy-vlly-vy)/cl_mass comm(3) = (vpz-vllz-vz)/cl_mass comm(4) = mmass else comm(1) = 0.0d00 comm(2) = 0.0d00 comm(3) = 0.0d00 comm(4) = 0.0d00 endif call ga_dgop(8,comm,4,'+') vvx = comm(1) vvy = comm(2) vvz = comm(3) mmass = comm(4) c do i = 1, cl_tot ii = cl_at(i) if (ii.eq.iat) then ra(ii,1,2) = ra(ii,1,2) + mmass*vvx ra(ii,2,2) = ra(ii,2,2) + mmass*vvy ra(ii,3,2) = ra(ii,3,2) + mmass*vvz else ra(ii,1,2) = ra(ii,1,2) - mass(ii)*vvx ra(ii,2,2) = ra(ii,2,2) - mass(ii)*vvy ra(ii,3,2) = ra(ii,3,2) - mass(ii)*vvz endif end do call cluster_old_at c return end c subroutine cluster_reset(dt) #include "common.fh" double precision dt, htausq, scale integer i, ii c c Reset coordinates and velocities using old values from beginning of c step. c htausq = 0.5d00*dt**2 do i = 1, cl_tot ii = cl_at(i) ra(ii,1,1) = cl_old(i,1,1)+dt*cl_old(i,1,3)+htausq*ra(ii,1,3) ra(ii,2,1) = cl_old(i,2,1)+dt*cl_old(i,2,3)+htausq*ra(ii,2,3) ra(ii,3,1) = cl_old(i,3,1)+dt*cl_old(i,3,3)+htausq*ra(ii,3,3) ra(ii,1,6) = cl_old(i,1,2)+dt*cl_old(i,1,3)+htausq*ra(ii,1,3) ra(ii,2,6) = cl_old(i,2,2)+dt*cl_old(i,2,3)+htausq*ra(ii,2,3) ra(ii,3,6) = cl_old(i,3,2)+dt*cl_old(i,3,3)+htausq*ra(ii,3,3) ra(ii,1,2) = cl_old(i,1,3)+dt*ra(ii,1,3) ra(ii,2,2) = cl_old(i,2,3)+dt*ra(ii,2,3) ra(ii,3,2) = cl_old(i,3,3)+dt*ra(ii,3,3) end do #if 1 do i = 1, sl_tot ii = sl_at(i) ra(ii,1,1) = sl_old(i,1,1)+dt*sl_old(i,1,3)+htausq*ra(ii,1,3) ra(ii,2,1) = sl_old(i,2,1)+dt*sl_old(i,2,3)+htausq*ra(ii,2,3) ra(ii,3,1) = sl_old(i,3,1)+dt*sl_old(i,3,3)+htausq*ra(ii,3,3) ra(ii,1,6) = sl_old(i,1,2)+dt*sl_old(i,1,3)+htausq*ra(ii,1,3) ra(ii,2,6) = sl_old(i,2,2)+dt*sl_old(i,2,3)+htausq*ra(ii,2,3) ra(ii,3,6) = sl_old(i,3,2)+dt*sl_old(i,3,3)+htausq*ra(ii,3,3) ra(ii,1,2) = sl_old(i,1,3)+dt*ra(ii,1,3) ra(ii,2,2) = sl_old(i,2,3)+dt*ra(ii,2,3) ra(ii,3,2) = sl_old(i,3,3)+dt*ra(ii,3,3) end do #endif #if 1 c c resete extended Hamiltonian parameters c if ((prsflg.or.ptflg).and.ipmode.eq.0) then vol1 = cl_vol1_old + dt * cl_vol2_old + htausq * vol3 vol2 = cl_vol2_old + dt * vol3 scale = vol1 / (cl_box_old(1) * cl_box_old(2) * cl_box_old(3)) scale = exp(log(scale)/3.0d00) xbox = scale * cl_box_old(1) ybox = scale * cl_box_old(2) zbox = scale * cl_box_old(3) xbox2 = 0.5d00 * xbox ybox2 = 0.5d00 * ybox zbox2 = 0.5d00 * zbox endif c if ((prsflg.or.ptflg).and.ipmode.eq.1) then do 500 i = 1, 3 alen1(i) = cl_alen1_old(i) + dt * cl_alen2_old(i) + + htausq * alen3(i) alen2(i) = cl_alen2_old(i) + dt * alen3(i) 500 continue xbox = alen1(1) ybox = alen1(2) zbox = alen1(3) xbox2 = 0.5d00 * xbox ybox2 = 0.5d00 * ybox zbox2 = 0.5d00 * zbox endif c if ((prsflg.or.ptflg).and.ipmode.eq.2) then do 600 i = 1, 2 alen1(i) = cl_alen1_old(i) + dt * cl_alen2_old(i) + + htausq * alen3(i) alen2(i) = cl_alen2_old(i) + dt * alen3(i) 600 continue xbox = alen1(1) ybox = alen1(2) xbox2 = 0.5d00 * xbox ybox2 = 0.5d00 * ybox endif c c predictor step for time scale c if (tmpflg.or.ptflg) then scal1 = cl_scal1_old + dt * cl_scal2_old + htausq * scal3 scal2 = cl_scal2_old + dt * scal3 endif c c center of mass parameters c cl_cmx = cl_cm_old(1) cl_cmy = cl_cm_old(2) cl_cmz = cl_cm_old(3) cl_vcmx = cl_vcm_old(1) cl_vcmy = cl_vcm_old(2) cl_vcmz = cl_vcm_old(3) #endif return end ga-5-4/global/examples/md_cluster/factor.F0000644000175000017500000000345412662210461016642 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine factor(p,idx,idy,idz) implicit none integer i,j,p,idx,idy,idz,it integer ip,ifac,pmax,prime(1000) integer fac(1000) c i = 1 ip = p c c factor p completely c first, find all prime numbers less than or equal to p c pmax = 0 do i = 2, p do j = 1, pmax if (mod(i,prime(j)).eq.0) go to 100 end do pmax = pmax + 1 prime(pmax) = i 100 continue end do c c find all prime factors of p c ifac = 0 do i = 1, pmax 200 if (mod(ip,prime(i)).eq.0) then ifac = ifac + 1 fac(ifac) = prime(i) ip = ip/prime(i) go to 200 endif end do c c determine three factors of p of approximately the c same size c idx = 1 idy = 1 idz = 1 do i = ifac, 1, -1 if (idx.le.idy.and.idx.le.idz) then idx = fac(i)*idx elseif (idy.le.idx.and.idy.le.idz) then idy = fac(i)*idy elseif (idz.le.idx.and.idz.le.idy) then idz = fac(i)*idz endif end do c it = idy c idy = idx c idx = it c c it = idx c idx = idz c idz = it c c it = idy c idy = idz c idz = it return end c subroutine i_proc_to_xyz(p,ix,iy,iz,idx,idy,idz) implicit none integer p,ix,iy,iz,ip,it integer idx,idy,idz c ip = p c it = mod(ip,idx) ix = it ip = (ip - it)/idx it = mod(ip,idy) iy = it ip = (ip - it)/idy it = mod(ip,idz) iz = it c return end c subroutine i_xyz_to_proc(p,ix,iy,iz,idx,idy,idz) implicit none integer p,ix,iy,iz,idx,idy,idz c p = ix + idx*iy + idx*idy*iz c return end ga-5-4/global/examples/md_cluster/force.F0000644000175000017500000000341212662210461016454 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c NOTICE c c This software is being made available for internal testing and c evaluation purposes only. This software is a pre-release test version c which has not yet been authenticated and cleared for publication. Adherence c to this notice may be necessary for the author, Battelle Memorial c Institute, to successfully assert copyright in and commercialize this c software. This software is not intended for duplication or distribution c to third parties without the permission of the Manager of Software c Products at Pacific Northwest Laboratory, Richland, Washington, 99352. c subroutine force #include "common.fh" c double precision tbeg,wraptime integer i,j integer inode c tbeg = wraptime() c c clear forces c do 100 j = 1, 3 do 200 i = 1, antot ra(i,j,4) = 0.0d00 200 continue 100 continue c do 300 i = 1, antot asev(i) = 0.0d00 300 continue c esvr = 0.0d00 esvd = 0.0d00 esvoh = 0.0d00 esva = 0.0d00 presf = 0.0d00 presfx = 0.0d00 presfy = 0.0d00 presfz = 0.0d00 c call gather c c clear buffers c do i = 1, btot xfrc(i) = 0.0d00 yfrc(i) = 0.0d00 zfrc(i) = 0.0d00 end do c c assign atoms to individual molecules c call pairs call scatter c nrg(6) =esvr + esvd + esvoh + esva nrg(13) = esvr nrg(14) = esvd nrg(17) = esvoh nrg(21) = esva nrg(10) = presf nrg(18) = presfx nrg(19) = presfy nrg(20) = presfz presf = presf / (xbox * ybox * zbox) nrg(15) = presf/ 3.0d00 c tmstat(2) = tmstat(2) + wraptime() - tbeg c return end ga-5-4/global/examples/conjugate_gradient/0000755000175000017500000000000012662210461016742 5ustar mbambaga-5-4/global/examples/conjugate_gradient/read_input.c0000644000175000017500000001653412662210461021251 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_STRING_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" extern int na; extern int nz; extern int dmvec,svec,bvec,dvec,m_dvec,amat,xvec,axvec,rvec,qvec,ridx,cidx; extern int me, nproc; extern int myfirstrow,mylastrow; static int *columnmap,*allfirstrow,*alllastrow; extern double *ga_vecptr; extern int isvectormirrored; static FILE *fd; void generate_random_file(int naa,int nnz){ fd = fopen("randominput.dat", "w"); } void read_and_create(int argc, char **argv) { int ri,i; int ph; double d_one=1.0; double *a,*x; int *icol, *irow; #if 0 int dims[2]; #endif int tmp1,idealelementsperproc; int lo,hi; na = atoi(argv[1]); nz = atoi(argv[2]); if(strncmp("random",argv[3],6)){ if(me==0){ fd = fopen(argv[3], "r"); if(fd==NULL)GA_Error("unable to open given file",0); } } else{ if(na==0 || nz==0){ printf("\nERROR:exiting-no input file given and na or nz is 0"); fflush(stdout); GA_Terminate(); MP_FINALIZE(); return; } if(me==0){ generate_random_file(na,nz); fd = fopen("randominput.dat", "r"); } } if(me==0){ if(na==0) fread(&na, sizeof(na), 1, fd); if(nz==0) fread(&nz, sizeof(nz), 1, fd); printf("\nReading CG input\n"); printf("Number of rows: %d\n", na); printf("Number of non-zeros: %d\n", nz); a = (double *)malloc(sizeof(double)*nz); icol = (int *)malloc(sizeof(int)*(nz+1)); x = (double *)malloc(sizeof(double)*(na+1)); irow = (int *)malloc(sizeof(int)*(na+1)); for (i = 0; i < na + 1; i++) x[i] = 1.0; fread(a, sizeof(double), nz, fd); fread(irow, sizeof(int), na + 1, fd); fread(icol, sizeof(int), nz + 1, fd); fread(x, sizeof(double), na + 1, fd); /* the c adjustment */ for (i = 0; i < na + 1; i++) irow[i] -= 1; for (i = 0; i < nz + 1; i++) icol[i] -= 1; /* MPI_Bcast(&nz,1,MPI_INT,0,MPI_COMM_WORLD); */ GA_Brdcst(&nz, sizeof(int), 0); /* MPI_Bcast(&na,1,MPI_INT,0,MPI_COMM_WORLD); */ GA_Brdcst(&na, sizeof(int), 0); } else { /* MPI_Bcast(&nz,1,MPI_INT,0,MPI_COMM_WORLD); */ GA_Brdcst(&nz, sizeof(int), 0); /* MPI_Bcast(&na,1,MPI_INT,0,MPI_COMM_WORLD); */ GA_Brdcst(&na, sizeof(int), 0); /*for now, others dont need to malloc really*/ a = (double *)malloc(sizeof(double)*nz); icol = (int *)malloc(sizeof(int)*(nz+1)); x = (double *)malloc(sizeof(double)*(na+1)); irow = (int *)malloc(sizeof(int)*(na+1)); if(!a || !icol || !x || !irow)GA_Error("malloc failed in ga_cg",0); } allfirstrow = (int *)malloc(sizeof(int)*nproc); alllastrow = (int *)malloc(sizeof(int)*nproc); columnmap = (int *)malloc(sizeof(int)*nproc); if(!allfirstrow || !alllastrow || !columnmap)GA_Error("malloc failed in ga_cg",0); /* * next decide who works on which rows, this will decide the * distribution of a,d,r,q,x,and ax */ /*create the mapping for all vectors, row matrix and column matrix*/ if(me==0){ idealelementsperproc = nz/nproc; tmp1=0; for(i=0;i=idealelementsperproc){ if((elementsperproc-idealelementsperproc) > idealelementsperproc-(elementsperproc-(irow[ri+1]-irow[ri]))){ alllastrow[i] = ri-1; if((ri-1)<0)GA_Error("run on a smaller processor count",0); tmp1--; } else{ alllastrow[i] = ri; if(ri<0)GA_Error("run on a smaller processor count",0); } elementsperproc=0; break; } } } alllastrow[nproc-1]=na-1; for(i=0;i #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H #include #endif #if HAVE_SYS_TYPES_H #include #endif #if HAVE_SYS_STAT_H #include #endif #if HAVE_FCNTL_H #include #endif #include "armci.h" #include "ga.h" #include "macdecls.h" #include "finclude.h" #include "mp3.h" #define VERIFY_RESULT 1 int na,nz; int bvec,dvec,svec,dmvec,m_dvec,amat,xvec,axvec,rvec,qvec,ridx,cidx; int me, nproc; int myfirstrow=0,mylastrow=0; double epsilon=1e-4; double time_get=0; double *entirexvecptr,*xvecptr,*entiredvecptr,*dvecptr; int isvectormirrored=0; static int niter; void read_and_create(int,char **); void computeminverser(double *,double *, double *); void computeminverse(double *,double *, int *,int *); void finalize_arrays(int); extern void matvecmul(double *,int,double *,int,int *,int *); extern double *ga_vecptr; void conjugate_gradient(int nit,int dopreconditioning) { int i,zero=0; int lo,hi; double d_one=1.0,d_negone=-1.0; double delta0=0.0,deltaold=0.0,deltanew=0.0,alpha=0.0,negalpha,beta,dtransposeq; double *axvecptr,*qvecptr,*aptr,*dmvecptr,*rvecptr,*svecptr,*bvecptr; double time0; int *mycp,*myrp; int j; double sum; NGA_Distribution(cidx,me,&lo,&hi); NGA_Access(cidx,&lo,&hi,&mycp,&zero); NGA_Access(amat,&lo,&hi,&aptr,&zero); NGA_Distribution(ridx,me,&lo,&hi); NGA_Access(ridx,&lo,&hi,&myrp,&zero); NGA_Access(axvec,&lo,&hi,&axvecptr,&zero); NGA_Access(qvec,&lo,&hi,&qvecptr,&zero); NGA_Access(rvec,&lo,&hi,&rvecptr,&zero); NGA_Access(bvec,&lo,&hi,&bvecptr,&zero); if(dopreconditioning){ NGA_Access(dmvec,&lo,&hi,&dmvecptr,&zero); NGA_Access(svec,&lo,&hi,&svecptr,&zero); /* NGA_Distribution(dvec, 0, &lo, &hi); NGA_Access(dvec, &lo, &hi, &entiredvecptr, &zero); */ } printf("\n%d:before matvecmul\n",me);fflush(stdout); /* compute Ax */ f_matvecmul(aptr,entirexvecptr,axvecptr,&zero,&myfirstrow,&mylastrow,myrp,mycp); /* r=b-Ax */ f_addvec(&d_one,bvecptr,&d_negone,axvecptr,rvecptr,&myfirstrow,&mylastrow); if(dopreconditioning){ f_computeminverse(dmvecptr,aptr,myrp,mycp,&myfirstrow,&mylastrow); f_computeminverser(dmvecptr,rvecptr,dvecptr,&myfirstrow,&mylastrow); NGA_Put(dvec,&lo,&hi,dvecptr,&hi); if (me == 0) printf("Doing preconditioning!\n"); } else{ if(me==0){ na--; NGA_Get(rvec,&zero,&na,entiredvecptr,&na); NGA_Put(dvec,&zero,&na,entiredvecptr,&na); na++; } } deltanew = GA_Ddot(dvec,rvec); /* deltanew = r.r_tranpose */ delta0 = deltanew; /* delta0 = deltanew */ if(me==0)printf("\n\tdelta0 is %f\n",delta0); /*if(me==0)printf("\n\titer\tbeta\tdelta");*/ for(i=0;i(1e-8*delta0);i++){ na--; NGA_Get(dvec, &zero, &na, entiredvecptr, &na); na++; if(isvectormirrored) matvecmul(aptr,m_dvec,qvecptr,1,myrp,mycp);/* q = Ad */ else{ f_matvecmul(aptr,entiredvecptr,qvecptr,&zero,&myfirstrow,&mylastrow,myrp,mycp); sum = 0.0; for (j = 0; j < na; j++) if (entiredvecptr[j] != 0.0) sum += entiredvecptr[j]; /* if (me == 0) printf("me: %d, sum: %g\n", me, sum); */ } NGA_Put(dvec,&lo,&hi,dvecptr,&hi); dtransposeq=GA_Ddot(dvec,qvec); /* compute d_transpose.q */ alpha = deltanew/dtransposeq; /* deltanew/(d_transpose.q) */ if(i>10000 && i%25==0){ /* compute Ax*/ f_matvecmul(aptr,entirexvecptr,axvecptr,&zero,&myfirstrow,&mylastrow,myrp,mycp); /* x = x+ alpha.d*/ /* r=b-Ax*/ f_2addvec(&d_one,xvecptr,&alpha,dvecptr,xvecptr,&d_one,bvecptr, &d_negone,axvecptr,rvecptr,&myfirstrow,&mylastrow); } else{ negalpha = 0.0-alpha; /* x = x+ alpha.d*/ /* r=r-alpha.q*/ f_2addvec(&d_one,xvecptr,&alpha,dvecptr,xvecptr,&d_one,rvecptr, &negalpha,qvecptr,rvecptr,&myfirstrow,&mylastrow); } if(dopreconditioning) computeminverser(dmvecptr,rvecptr,svecptr); deltaold = deltanew; /* deltaold = deltanew*/ if(dopreconditioning) deltanew = GA_Ddot(svec,rvec); /* deltanew = r_transpose.r*/ else deltanew = GA_Ddot(rvec,rvec); /* deltanew = r_transpose.r*/ beta = deltanew/deltaold; /* beta = deltanew/deltaold*/ if(dopreconditioning) f_addvec(&d_one,svecptr,&beta,dvecptr,dvecptr,&myfirstrow,&mylastrow); /* d = s + beta.d */ else f_addvec(&d_one,rvecptr,&beta,dvecptr,dvecptr,&myfirstrow,&mylastrow); /* d = r + beta.d */ if(isvectormirrored) GA_Copy(dvec,m_dvec); /*copy from distributed */ /* if(me==0)printf("\n\t%d\t%0.4f\t%f",(i+1),beta,deltanew); */ } if(i < nit && me == 0) printf("\n Done with CG before reaching max iter %f",sqrt(deltanew/delta0)); niter = i; #if VERIFY_RESULT GA_Zero(qvec); GA_Zero(rvec); matvecmul(aptr,xvec,qvecptr,0,myrp,mycp); GA_Add(&d_one,qvec,&d_negone,bvec,rvec); time0=GA_Ddot(rvec,rvec); if(me==0)printf("\n%d:error is %f",me,time0); #endif } void initialize_arrays(int dpc) { double d_one=1.0; int i; GA_Zero(dvec); GA_Fill(xvec,&d_one); GA_Zero(axvec); GA_Zero(rvec); GA_Zero(qvec); if(dpc){ GA_Zero(dmvec); GA_Zero(svec); } for(i=0;i ga_cg.x na nz file"); printf("\n\n where:"); printf("\n\tna is array dimention (only square arrays supported)"); printf("\n\tnz is number of non-zeros"); printf("\n\tfile is either the input file or the word random"); printf("\n\t use the word random if you to use random input"); printf("\n\t input should be in row compressed format"); printf("\n\t file should have matrix a followed by row, col & b (Ax=b)"); printf("\n\t if file also has na and nz, pass them as 0's and the"); printf("\n\t program will read them from the file"); printf("\n\nexample usages are:"); printf("\n\tmpirun -np 4 ./ga_cg.x 5000 80000 /home/me/myinput.dat"); printf("\n\tor"); printf("\n\tmpirun -np 4 ./ga_cg.x 5000 80000 random\n\n"); fflush(stdout); } GA_Terminate(); MP_FINALIZE(); return 0; } heap /= nproc; stack /= nproc; if(! MA_init(MT_F_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ read_and_create(argc,argv); create_entire_vecs(); if(me==0)printf("\nWarmup and initialization run"); initialize_arrays(dopreconditioning); conjugate_gradient(1,dopreconditioning); time_get =0.0; if(me==0)printf("\n\nStarting Conjugate Gradient ...."); initialize_arrays(dopreconditioning); time0=MP_TIMER(); conjugate_gradient(30000/*2*/,dopreconditioning); time1=MP_TIMER(); /* GA_Print(xvec); */ /* GA_Print(dvec); */ if(me==0)printf("\n%d:in %d iterations time to solution=%f-%f\n",me,niter,(time1-time0),time_get); finalize_arrays(dopreconditioning); MP_BARRIER(); if(me==0)printf("Terminating ..\n"); GA_Terminate(); MP_FINALIZE(); return 0; } void finalize_arrays(int dpc) { GA_Destroy(bvec); GA_Destroy(dvec); if(isvectormirrored) GA_Destroy(m_dvec); GA_Destroy(amat); GA_Destroy(xvec); GA_Destroy(axvec); GA_Destroy(rvec); GA_Destroy(qvec); GA_Destroy(ridx); GA_Destroy(cidx); if(dpc){ GA_Destroy(svec); GA_Destroy(dmvec); } ARMCI_Free(myptrarrx[me]); ARMCI_Free(myptrarrd[me]); } ga-5-4/global/examples/conjugate_gradient/computeloops.F0000644000175000017500000000650012662210461021603 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif subroutine f_matvecmul(a_mat, > mult_vec, > resultvec, > isresultmirrored, > firstrow, > lastrow, > myrowlist, > mycollist) implicit none integer*4 isresultmirrored double precision mult_vec(*) double precision resultvec(*) double precision a_mat(*) integer*4 myrowlist(*),mycollist(*) integer*4 firstrow,lastrow integer*4 i,j,k,l double precision tmprowsum k=0 l=1 do i=firstrow, lastrow-1 k=k+1 write(6,*) k,myrowlist(k),myrowlist(k+1) do j=myrowlist(k), myrowlist(k+1)-1 write(6,*) i,j,k,myrowlist(k+1),l tmprowsum=tmprowsum+a_mat(l)*mult_vec(mycollist(l)+1) l=l+1 enddo resultvec(k)=tmprowsum tmprowsum=0 enddo end subroutine f_computeminverse(minv, > a_mat, > myrowlist, > mycollist, > firstrow, > lastrow) double precision a_mat(*) double precision minv(*) integer*4 myrowlist(*),mycollist(*) integer*4 firstrow,lastrow integer*4 i,j,k,l k=0 l=1 do i=firstrow, lastrow-1 k=k+1 do j=myrowlist(k), myrowlist(k+1)-1 if(mycollist(l) .ge. i) then if(mycollist(l) .eq. i) then minv(k)=10.0/a_mat(l) if(minv(k) .le. 0) minv(k)=1.0/10.0 endif if(mycollist(l)>i) minv(k)=1.0/10.0 l= l+(myrowlist(k+1)-j) go to 100 endif l=l+1 enddo 100 continue enddo end subroutine f_computeminverser(minv, > r, > minvr, > firstrow, > lastrow) double precision minv(*) double precision r(*), minvr(*) integer*4 firstrow,lastrow integer*4 i,k k=1 do i=firstrow, lastrow-1 minvr(k)=minv(k)*r(k) k=k+1 enddo end subroutine f_addvec(scale1, > srcvec1, > scale2, > srcvec2, > dstvec, > firstrow, > lastrow) integer*4 firstrow,lastrow double precision scale1,scale2 double precision srcvec1(*),srcvec2(*) double precision dstvec(*) integer*4 i,k k=1 do i=firstrow, lastrow-1 dstvec(k)=srcvec1(k)*scale1+ srcvec2(k)*scale2 k=k+1 enddo end subroutine f_2addvec(scale1a, > srcvec1a, > scale2a, > srcvec2a, > dstveca, > scale1b, > srcvec1b, > scale2b, > srcvec2b, > dstvecb, > firstrow, > lastrow) integer*4 firstrow,lastrow double precision scale1a,scale2a double precision srcvec1a(*),srcvec2a(*) double precision dstveca(*) double precision scale1b,scale2b double precision srcvec1b(*),srcvec2b(*) double precision dstvecb(*) integer*4 i,k k=1 do i=firstrow, lastrow-1 dstveca(k)=srcvec1a(k)*scale1a+ srcvec2a(k)*scale2a dstvecb(k)=srcvec1b(k)*scale1b+ srcvec2b(k)*scale2b k=k+1 enddo end ga-5-4/global/examples/conjugate_gradient/finclude.h0000644000175000017500000000132612662210461020706 0ustar mbamba#define f_matvecmul F77_FUNC_(f_matvecmul,F_MATVECMUL) #define f_computeminverse F77_FUNC_(f_computeminverse,F_COMPUTEMINVERSE) #define f_computeminverser F77_FUNC_(f_computeminverser,F_COMPUTEMINVERSER) #define f_addvec F77_FUNC_(f_addvec,F_ADDVEC) #define f_2addvec F77_FUNC_(f_2addvec,F_2ADDVEC) extern void f_matvecmul(double*,double*,double*,int*,int*,int*,int*,int*); extern void f_computeminverse(double*,double*,int*,int*,int*,int*); extern void f_computeminverser(double*,double*,double*,int*,int*); extern void f_addvec(double*,double*,double*,double*,double*,int*,int*); extern void f_2addvec(double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,int*,int*); ga-5-4/global/examples/conjugate_gradient/matvecmul.c0000644000175000017500000000406612662210461021111 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #include "ga.h" #include "macdecls.h" #include "mp3.h" extern int na,nz; extern int me, nproc; extern int myfirstrow,mylastrow; double *ga_vecptr; extern double time_get; void computeminverse(double *minvptr,double *aptr,int *myrowptr,int *mycolptr) { int i,j,k,l=0; for(k=0,i=myfirstrow;i=i){ if(mycolptr[l]==i){ /*printf("\n%d:i=%d j=%d aptr=%d",me,i,j,aptr[l]);*/ minvptr[k]=10.0/aptr[l]; if(minvptr[k]<0)minvptr[k]=1.0; } if(mycolptr[l]>i) minvptr[k]=1.0; /*printf("\n%d:l=%d i=%d mycolptr[l]=%d",me,l,i,mycolptr[l]);*/ l+=(myrowptr[k+1]-j); break; } } } } void computeminverser(double *minvptr,double *rvecptr,double *minvrptr) { int i,k; for(k=0,i=myfirstrow;i> stream HWMsHGjKb%:_3I{jZd[dsؤm߇nR"3[;đE6B_^ io./BRtyvMigµnx}# R?E ZodCE /\xwnllu ߄3Gȏ&ֽ/Pj>ͱUCG^pMݻw>]%Gldۀ\^^? w+[kQRo$GP%:*|ύl+u0C|b{b5uޚV+Je?z-;eT_yp.uxiu;eCjF|.6%hP P`G0%mw|) `pv\{]U [;w9f4? tT![ۼ8i,HygV#ILY)J׃EҢ-ˢiJ[>F뉽`I h0s3b.L䏫-gF{g(;2a aHlՔ)9Arf4rDi4uq%\THmnqeE RڞpXZ\׺[#  EcugJ=]TC"G(s*D7TB/rm:37Â&Ŵ`zZ% bhuFW%`/lw|6Nbcb0x>b Sy%R"SoyZndIvxlPt}GE~#g5Mǰ:Q2l,Vq}ub+ծbpswtd1dU}1RM=z;rݧa/6_ [|˞n!_<Si@8K &}]El Z6뫓AHHbGq-;CkTi'VsS?wSqU&~1޸f)SejUEnF`(q/ ϽGU˂J]V=NZ ""qy8zbDgh9HyS9`$E㮎YVF-9-IZ]9NES0O[Ua5L 8gQ#-}o=gI[c=53^0YOXB4W>%M8p.L*u * s@ݯ\!]l_񅰍K z/YL{N DHB+M;='(Enj)aw77X^[{[cyd`fi'fI9tݾRKr[Ph@j6?XQXWd~_=\K& s}yrodV6=*Ќݘ-ܚ:kZEDL>ӷ?*lov 4~ y~+(mlDc4 SծV~V}d v,WwΧq,}<ݽka `ћ3U60p *n&%7Aڤ_?3K7 q:~7}u#-R(*˫ddx*p곴h5& *aߛ.2,dDk?,/Avis34e(U *p/ȵo7= O^z"v(^ѹ*"?լ1<7`lMw8+P4IVqo٦ vmd#k< $o4[9% !GqV`IaQ;OlޑG$#.(A?+ ;nI[H<]}<^3#ZDUj4bDhAb|5b/ڕa6Gڪphp gR]LW9!V>n ҢBk16lF,Vs,|R80|\ŐzL$b\c㏼t;6SEp/slSsj~t`:ozƚ.\>&lL\BkZ;tկv9JR>*Jhޕ|6dnz)2hH -cp%o F=Z {A6wMqw݂0AQYAEteRCUύo.)8_]Ӏ@JpxxYS1aT.R'S.wP8!n^h`]fD)ekUIV^J4Vz؃lt^BC)U˺)f0/c{P ILH)J?;L[BE ӱ$ 4ɟ>'/Y}eQvN_g\ZOK:@-MXq\6yth. h8cyUz򕜔9 (W#UW8L3lLq` UoŇJɶtBZDYB'F1*3d-ɽ|> /ExtGState << /GS1 8 0 R >> >> endobj 11 0 obj << /Length 3496 /Filter /FlateDecode >> stream HWr8}wԔ&z͙LfRkm택$$$!Hۚxdjk+Uv,>}:d7BW!*K,aOXGl.pq}n#gY.% ?Hٺ pֹt}E뫏kz-?^4Z(|zgd'1_ȏu? "c;4*Z3Y3ξ|xR _^u[gigdqނ?˙3UqeK`b; W0\ƋRdK)UC3o!a 9쏚^!uM׊U$=>ުC)sٚLZkAbSJD[j92E\Z皵{a}y{d𧖕,y3.V`zQ+QgU~UOQ4E L bVԏZ= +cj+xˍc%6U`Ckʥj)ADȦzֈFG`1$UB{IDVE&賦F+Eg5/#?Zfla ==O`:J)7 o$rDNJ᠚ylO$ Upȼx${Ȋڲ\U`a[QQtu^vf}cW>|}Zk-N~ErC26U60c0臙 J@?BK]-`4V3M]3}Ư'˧Qd9b#E)E}\ƫc9s!+yх0rNu|Xײk S/HF=$\H-$^n]l0RsI2I0u6/ӟ9Ϗn.tY1dA-6je"j}oڶL JDЏ0} aV)OŎ9㤪m&/wm:3)ިNYo>fi}_7Mt$;rKQlԈ.U&D8:RI[kQZF&Q,ir{(-X.TKnSАǯjzO(w2̏X\ _*(9"8F9A3 l/_5Mm?QjrXT6&IYl)u`"p-e}q;̿Tu\S)4S;_p]Fhhڥ &ZRZT{fN-j11$U{n5HQB7j EO[-/ lx=هmSwF5 .s3ډzObHy2(:6*L:Gd h{4SA++^x@ +r|miFL aW_{^~봢5ochtM#զ| */|Y}pG6xzm4AF $D9b:Y[/ڞ1cyC槺;EYI;8`8eJhqgzNt uH&[΄uNZ5?wɍ2 !؄ ZJ4ΖM.~m;OȫHMZz*^GK4kOɴ1sA؇"d68݂/޿+^= endstream endobj 12 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F6 6 0 R /F8 7 0 R /F9 13 0 R >> /ExtGState << /GS1 8 0 R >> >> endobj 15 0 obj << /Length 3133 /Filter /FlateDecode >> stream HWKs6kFK)#1|A5yf*&! Ii[=)Rv%>=܈"v0I$Nm: VllhǴNo§E~gYRZݗIHCvٟ,5|'7n ;'i@~6t% qꞍ$9[_A%CZϗQf_a~\4%Z=\5:0ʶhg/pVH; 4v)ILV(#uVj=y!I6`0uY0^67}-bb\ $\2 RQLeVNuaXV{VQhxbA1^I|G gd GJhR%ǟf ܣ˫zVՓ*^A,kn=pni}<d\Qʾ?K#LH*+IVn^ap#QX&o=?] Pm|>@`)\?arSTk&\0Չ5jRT5 Ac %YXTn&|dJBsʙ:Mu㵃9>,NrAE!9\N4߮WWlA~F.GJ\!B1s,Duᛊ2v3'clVv([v7Œga)B(sʼn GDa'p^5vŢǴt3qQGZ/<e^Br# 4N/CNa *F4lU鹋-jda{U*- X1hkoO4AY |n/;M3(!hE '|# /@Ӗh_G;&-ņHpIԢ -aR}Bb*c$uZPrci3YFRhnA KXFAukHr/0d l08L_ģ৾-wN }[5I7Z-E`sj$/^xJ~"ȨJwҝMm=f݇H1٩"Qر#;~.$iϬnFd$=WbSGku0.c]k'`~Wq9tix1֯9VnN~ndؒvshqY%Szt> YThwyӕmHlCZ5?7)䂚h0'4C0\ dՋ܅abb!t/C{CϬ; z. b\OM瘦|'SHpr-'(巯@':wUv>`^j\Bݽ2/DUn5ٴ=K#.ZNgoTI4ai%~JFu hϜ6Heka-2>7NR35jCVFmp H8pO6@C[+b {w`T"i?f}Efw݌fS$ݞ*=Pv*Ikb3i+EVnf'7ABj\vhMWI`=8i+S a#l~JCgh> /ExtGState << /GS1 8 0 R >> >> endobj 18 0 obj << /Length 3217 /Filter /FlateDecode >> stream HWmona J >8%u3b@VJbu}fw)QC€eٙgymg;?R?N?Q8Г@4j2'BH$Rbv"y;(\z2U)S(5 N3@0H%P `v;xpO=,t,hJ>b?|i"A.`^)2fl@15ʮ!(%B$ԎcZ}ow/=l:xߢͬWRwk*TMCUnIPr]PJQ#ꭻIS&40J4Q{eɉ\A$禅'B?XshQ7{qP7Fq&7ę?O'g;Gs 7nOJ/*mJ` bZ]ʹ5S%d<3q5H}Lp:9+m n!U'ˡZӚ\Ǐ2|@ 1- Fں&DN o_h;:LZ{4.i{ E("?0xY4AAvfhd`^zdwAy9 R:Ƿ@ڲ>MݭMZvZgK4 Aծ@ԃMkuFb'9Os?L#Yo$aNY;ePqU׶W.fPfσ4%]-=NL_"ʌ8J$94KlDo^Fa|_)2e@4GĖ5b!(n=EhyV{HuQ!F)xn*$[g묮o&ӄ')\ݭ:d4tȖg&~ sd8U?w!70}p :;Ήm";ҕ92SJ }~oO("Zbs4|jM;\ BzRNڢkӚYi0ץU0%#ri-''Kw QfGʞDYy1U hdacVC49-^QuѨz誇-y Kg~D̮h5#TM@v$<y<]NKhY[2۪+ úva691z7]N>Au/_Z$ 9.unBGw!}h^Зg0 L,ݪhn/}($D~Śy&xw(1yR_5ۇKRKOpn?\zǫ҃7b|(*gX||4Inm*&N%7W %aAiOkTTr1>refA~j:4H(BIS iRf[Ōg'[fj.myN6mVR5}ȜG1Z,N@[*'{YXZkyhTao<2GTzIJrjhy &iɊa(k Kf3;EuݮvTt8 9 M;G za(WTRppɤJ" ENaX0ίϾْ {v  s]Ռ9#Ei(إy'(>C~)`s1]3TތâX~< grN} (A4mN尐܀z_ߥ+C%ePZ9OI }jg3?WԻWtig YKpO84=?{PCTW#?'1$Do :/; vvC5 ZA*yHXX6?5'@ĸfQ\ڄ7k@{kuܝpΊ`Vg1m· = +lH՜W R A<wG#GӸKݮ)IR9+Ñk(Vn[Vx( [rLdm Q.i)ȼ d .hOo4䴺̌KqT<y4 5zX] z Y=?>vVW2HXoVtK׳ ?ä-3Y+B)čAkQkޕ80;P:bThzAi5, }{m\K:MTKy PQX6x endstream endobj 19 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F6 6 0 R /F8 7 0 R /F9 13 0 R /F11 20 0 R /F13 21 0 R >> /ExtGState << /GS1 8 0 R >> >> endobj 23 0 obj << /Length 9732 /Filter /FlateDecode >> stream HWے6}}:ۛbooobr-S1DHdz(^J~[›DbY1Nb΢Bۛ uno?7?6K\,Hˈޙ+p6ӎh&ζf+Q(k^Eb}h?4 mveUZFYO%XfUz,+8QV[QUH[YKaj$ve'؜;cdڪ|W) ]{pgV'ҙD87{,qgMUѭcUeV悎]=Ux踨mPEYE!6 (eɇt(=vzߔ ܱ?z7{[T2M%WDww~M] ?!?,l!\< žQ5ivdCeHï.KڌjVxUM O"nSXښҞMvJS63ʠUfKdۍwוw.7Fէ&y԰]ģ.2a:_S3GOÌ^7q9}n͍Bm]Zq(Fu  09K^V~h7 (;5a!VHd^{ +N+56 RR"KQ/lwFꫧ +YSl.dRjmM@%p@pG+u1nlB>tvhs/T(c@[t`L|;cO/o: )~=S?Y 8c|3fA%Bvɦo-Ys-tnDqdA 㺚JX4 J\<,:5sUMB MF78q!S$Ý>U̜N╆'mKA/l{Hb>/72G*y:\`ch]~{G P|Lr;6Y~ͦh/7Bc6\z+P_L|_Vh00 Ls=tnq G$֒4a-:{OCrWP;%^:Ҍ.|̼@Pv2ӹ:s$+S, уZD̑k6=-%aT#2/_嘏e Ny_PH ͸Kq G-˥.\t' v܊<},ӠQqs_4-t"0+tM('ӡLSs:q5s:"usz&>vMSW]vx>_pC>V qy4 3wƴ %D<<<* }X!⩯хЋgznG ʪr_`$#~†U4L3&K]7]G=p9d[*Rg[0\{IZ48loON~2ߙZ]a[C J ~[krĵ`~gߞ \M(XpG$ou_6.)NI' 1eKܖӶui,<pCT Py,GЎSafX 93CAgyʼnC~qPp]Їv2~E3I2V)5_v`&&HuMZƚK R;bEGR_VdGA/SXѠQk Ԛ$*TEW]\eBU1%$pI_i5|!ƕb[+7-G]c= O,GG$E+[і)?=3\ђX b(y<7 &m9\Qݍ'CIk11Ͽ1qADgڿz֒@mT{6pT$Ua*@ d;ytܨ{>UNgxCy(V(EZ%}QW!1hCGYiXjmI+p$-3,UA*A+sISUa`:zIO/.To2עBj#urģjc6 (v-qtHFSFa^rE*N7B,Nd" fGNjlxz?Lxz?,xz?Yxf[~y~C-] ?:VzkXC!QϟL${7u*MER #BYSD" F9Uļ>ġg7(b&PF+xXj7("3ݚ" 2fqB/[?QEDsBAlqTVѯsvY!qv2E@|nUݪ" cEZY/B 4ilg1b8p;6S6ы k/N_8{p:5s8u  [puXk'm4Ee5eO_C|*˗-/o_ffvwHQi`M{|huBE0H20MIS4_,E#yӿǿ_nɶosqэHK4HB'ʅJ)\D:9?q(lriy\ISґ>̳dgN|ɋ;7m,Eax]K BP*Ms5Džּ$pmc] V1x7V7kcXcE>e b,W "V@ACܘDod1{G MwWn-XC2\~.?a҆?ۈe*f.Ƕ|`]$SR`n~WXFR aCJP4,TUbEYjN\`{\SwEX[a#X)h<Ŋ/ͪw ( 7β|7{&nB.%i%'&Bjځ!V۲pvź;+{l5k Vvc Æfވ._j@cNIݙ8ÂqPyVߩIcܵXV aؒMTuHQ+_[5i Lv#oI4TzX>q#eF7Tx+Dn]jk )BeH hzE877k"ػCN)ST"m"HA$EaesL}*fm"%ڲ^ hr%aQ|Q7S(ׇm֔t\AwyȄ&nⰶB䌞]F!TlrTx9!QrϱM)=`+ l , c*FpaxF2>UبPSwYٛB_ZHN9ߩcoȺ4L-8u|hRs,43`Ȏ5IMnDrlc 4\$[mMt.0b OT-L@U4,f6guKWrđmUŝõQorޖ&cm]bԌɊyij&%QAu"[ C11SVIق"Uco}i3BԄaIΠ,QpݨǻQ -4W& .+ZpbmH[v5ᶭ^W:diK$=#!Bϒ3==MM=z3Sn`t`?_N^]sggJtz {[ ?jP !B&@%g~u3CT˹ XA *MK|GX펇_! JXeƾj!xPv?a^q`*Af<6}7XN4_ 6 ЍLVEI䚹YƎ\ fBދHs/ +^Oj'ī{"Nn`ti%وx// Ll.gX= yEG7V\ӟIW' Ș;7FJ 哠;!a;gLF7s3rA:v |i^E ZFGZ$:PkH**)4I%jNP 6ޖsҠ3,:%2 P\JxomQ#*8]A Urd6:ƪQ`ap*ʜ0^qd'_?~vrƶ8R|SnBBHlE6ɡO e[-u~y~1H \7?)E~ α#4G&USlwF&_́gx=ZnC,g)Y^\H$໖{h⓰oo+@@{ ~&phW}ޅ|hETtG |CDcUJ lIZ=w׾@k傫ej ~StŋE}AnA u'sG 歏 8DW-c,|;%|A{R=ȈGջ҅KYe}tY!»K~|Z땳زޢBb[peCvBCqa$e/ xCZM%nRarot-Lw2-]lCd+mEZm-"dbΎ|Ek׏m<<[Ak.IǍ:9rv1yE+[ؽVry6A' RQJ4[*FaՃ:4_+ qĕ+]֗]xxA9듀%nRaro ^E"{~:o5G4nE4o)˚Qڽ:"[Kޥeߚ N";-_tK:qmսv -$IK˫qdz8;ַ:pp~)eޤ-:I8E+<`[Izs٦.nKeRo o6erqi:w_B:$wk۴3s1#_ˈ2ٺ=熩J1s,@o#&}Ѯ9(%E~u2:oe-q{"NkŖcvm^׸C@gqhX {MX3)+dѓkb}0m-q{"NuĖcXRO#&w~51 H8)D'6Kqն>^O&*gO%nKᧇb˱s{6{Lޭk(6_g[bS,Eƹ ^vOpλz5C\Cӗb˱s;ГyfN י!^aY%^֛wWeر￁#ǯ/}e>O6M G eKa `-:&NǐeAZQe}қM^GqSʫ`)†)R}+Ĺ >8؁k64G(v`=km`ST}tāo6Xn|@W)w ƐnW?O9oTFEOUYz~hN~A/*ђjJ&S1xg> .``"bG燄D{'](S7|{@Wt&}\~x'of1I+;ITzRnJdžu9ٴc> %}RҞ6g؁vj@O~?(6RyzAg諪Tf9bf6𑕆S^O߃Q\бCf5YN;*>on?|Uo0O8xfoRznA~}?fVvQ;hm190YԮZzMǧk榩ܠGt'^g݊cCSI--3wR S: B'AM~qܮ7o59O wCƚ1)6t5ӯݑIU7}dj~Ȓ"|b464uBz2x3S24kF1= ?H[ck"}"2{|ӆM//TBģfeߴJjыm򩩌U[ iZwմ{ akz?PvH) ?%'iɖl=r m]^3t 5*ToBjƳ^~mD߅$H,$ʙZHHY(0Bfef@BቻN$X ce PE@8!`( GB-e0,"+ܴ*ZBfFtDHҋL^Q~6|˽`bmڎK{|;f*$|t [uQ%2sF=8˨!lM+IjܭЁ"k=@H$&1XyuB )V#5:={hC@A؇{dރ!.EE;s;눲_FBnGdn=:L(=t:;s@qEwN%d}XBPQ3j}芨g!UЇ蒚Uyҹb!S ]zXYk?s6ӃCvl,lI QC+3é9SmвY:Leoaq>Ώǟ/<%)zޞ^Wߟni E4oY<) -?ebqJpz2͍qMF 5 { {F0a`ɐԜ˹ChݬFS327@Os7XкAkA/ `xw7Sv.ƸP7&BGȪ6xD`eK03wƱ/0dMXMe &'s}Xs̛JbGp=^C4^.XnA"t endstream endobj 24 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F4 5 0 R /F8 7 0 R >> /ExtGState << /GS1 8 0 R /GS2 25 0 R >> >> endobj 27 0 obj << /Length 42042 /Filter /FlateDecode >> stream HWKo Q^plvcx9d% LJ%bڙ_*փlI*㣝y[gOWlU656zru9NW?]_>z`M%6BghvW n:|}uw غ`D?&!-VqM}o۶n(qsf>thv#Dގ?}3x toqa7-{OX9Fz2Χv 0@3a:{t8e*Gb0j!3恪0(L?魎? wx`13Y~O/\#vsURG 08i9"o86{d[8\d#o El{@_d4Sq6Ogz}Vl h}ٝ1j{Lp;?`#4XÃ6ݧ0H;8A.Um_;Ź#.,&%ݐ0VTٜ\96ʩQ7fyFQ(6u zA 3t92|riҳ1 >A;~7ͳim?̗ B;}'*kc@yȭF|iwM$76-̢PD FBH,W#DnQ(~]"-~(1B[; ExV*vevuPDmX"b7xr5GpJhĕYWQ(F\!Dq"hBWQ(F\!D!qAB4 ! EWN#PBB4 !>uz/Tī*Nl*EeezɖPī="Wĥ-˻e7p xݲo[v tn-]rIЊ>͇K7i@x~t7D|aSvaUS"A]'xNreŒbR$ozY.vHb U|MY.5V$WvzY.vx,{㻡I.v'S>㋝bZIV;P&WmE+`P۳\ȖVE!)>Pv&@bW0B P @9D P @YeF)@xH P" @eJ P* @L(d簲I&th{4"&[9M~ Ӏw;/f_ޭ~y7zU?!.olw@NLJt|q1d潁T**l]+C*}.O,ˊɬHxވxp;~|9}.`|򡵍7_f웋>7 =30?u |_ mbܗ(]Ȃو}יYeM"q;'bM6ɒeWOʨOA>'\ JGUF=QflŚ/;dI̫'eT#r}? qCϚ>]ZGvnmFRPyXVoέΝutT$GVlt J,0 }4nIQR\VȴveQ#L /eU,sRT4h;ױ NE1,f\*p7h,e`]S˻U謐śR*k<}a:>CRRHnB4ŵT&B*_crRU<#7V.f$ \ ܱ%r]1{ %v 8 +oKtVMU@էj8ȧjyŻ \g ][67u5Mxsnu<,*qI_ wqnF-]K) kFgiM˥P~>(M-r灡']AF)&K\[pI=ĘOfjѳ$U[D^yuԁi`HtDbK b_S*{`F=K7vmb Y]9:wXDAk|df(^,EDaFS{K+%-UVdHF%QGJ*q=$D1V E1RΔvgƻ{"jȫ7V.$ң-k0ߎ"Ʈ-b7$ P.%m^,襞zsnu<;0CdWA,4ptADNvv[ Dz㌖`ñӕ7.(g\~ץe6kw'eggz~QU3j4wC;]GnJ: AcqDK1ś_ #eb+$'od/ ycpUADg{Љc>l:NJ.#H L=q׻^ş_znºI< R?ˆs;- kKH{h1IH$,]'i %uyV#?^spw[Sl<`]!_^UE"˶8e!`x!;+N6|˾#`#B<=`yV iF c]'koM2%K׶ܚT8Gێ$mZMS\no+=rxe=V 1,CWgJ!z =Q7EW^/ UpX7ԥs]i]Жuܝl}G-̣EEl]S|=܎V&MroXh '׬ghNߤa?Fؑtw;Ú%Uк'4Icðս^o9xŎdQC7idvFY[Z{F5WCQj6h 7imDh發aT}_R\i4MCٙxk#k*휷ehRC{5ΚjNuc,k1=/# -~:j;Pr9xeGSҎ T^ʹ1b|,nCv^M hv*Z'9۬:=4ICzvtA +~ B4 m?W{P4{_;ړzTAox?Ҧܫڬ}~ZtzC0hOe<>4\Zr,?*F/T_T_ r"y/WJvȹtl a*ZJr.{լh fC˂E"ʚUif\s*І@r22ڶ$kw@NM”*hr@P.Mxaԧ/ WR;-=KsfmuHIMx{"_݀V~Jh3 H4 6c[qB)lBƆ$/rML[n^rM}Wwm.ivMx:uC!^Q,}wWrOӃ<}c>`pS{7եs^%H9p-yA8O5{vvHuF`پ#}%:#*.)arl3}E~ڇɾ+-Mp)┡@6z{&Mvam3=;wV75k֭iPy ;CXO\}5Fl;lzvg4Joٱ~+7Ku%NnP`Vr\$-lQ;b{7&lVߌNWtn(fC\-fG ͅ兿b-'19So"jqDƝ)MśK((}y7m8~͖S DzOo^L:Aړ]#_/f;ۖ` q_o֢UR >䀜dŗzm4} ] lv*8?"Ыnf9A [ꑂz҇;,E_A#;u ":o\vCzM_Qrd 2\Y^#/L183ШʎD82j-+&ˢ;{UU9b2m;*U0lg4uS;Lm4UQ~ / wuvg_7ר.ρ*M@*,W!K[]xܵC9B/N_N6WֵmO3!MF |vbQa1lS]>(n||9;B/Nl.,/}د</@lKcv{ѧ >k;B/Nl[WZ5EOăt1H09?S_s9+=yl6è\P^0/5G2A4kO6KaB|_uJ#s9d-gڝ*f(Ь3=7֕-_^GF>.?ԛܗSt qWx| z=(+ܯoZCYhQ9Cz>Y @A|4[VtC8s|d@Õ5H8dwx*8 v)2"{ZQf!{J@kPhk+~[_>/M׬i8]gL?Gk,)/do+zB5Ck,{]Ua+߸3@)#`'闿6Ԯ8ݜq. lj&2G p!7ކEN3| 9\wq8?2|[kX̧gΟg qxrAۗ+hUj4YGƁ{Q_3N5f%ќ|g9kX4\\7?FImk5Ck,nuɣW[׿e\<|-C-]S1ڥ2u}˰ˬO)r-gHGXɉ4/*_Ǥ(^t |_29k&<}=3e1y[\M\q9SH0nY{7)Y7'C˥veF?9(Զ0 ZJuEYKF dJIټRn SI){ c2eh?:@d ;ѩ">J^2%K'E:hn?@$1,hrzLISd~]e\m ST:BTdg!BCs6)I/QCsv%;%Ƀ|9CQ6)Y ֬(h5 H2%7FĜr 2%7&fy@~J<\8|PGsӤWg?'e r6eU/Kˏ!) (rQnW$0|quvP2X q3lvFJsH1.  1Dʋ^H&pE@ۥG>[+ջS {g` eLy"¡GZ V.|+6Ҧ.Z9BmX腖) (`;Vc.IJyA/7 /@IB7`m@4~PvF.Lzՠ<@kT X_SX fQ9k*44,'S@PD&6U::{NF<'! ^.xpk4LyAiM[2B[R<\3MB#^=Lx!w]GAE\!<N1^X XN<p|-zD,^1>HN{*E˭@\LXVvS]hB|2`bn?ћy>uoьˋ Nmr#&;u1C1{ԨX[g=vAʊo:G`3(ozi`ywbNsi9c9g^A92ӥFO=4MSK7 V(' RQ!ԭʗme+q_͌eawS 3g 2` Ќ=)^y1 ڕ0x1,JBΏreOxXrн]J ֽ;=p ߇CQы(Cm [ >hڠ=$^mQ0lãYx0lģYE@qdQT`Z*pZ)PC%DTU7GS`xd0\i$dc$` ⠔U wr !3-GPC%&.iT_T@eLy.Njb?Q9+x!zQUELmVtIj,ɝ<0UMr"CأĴ<=iDڲ0ȐfjVC..9gVov<^(3١!P+ϲ%Mi3ìiu~]rzj[2% "5H%Fxy-/fd0%J]@~p_&y6nU>}*6=%`q!)XA AWRL [ 9\Y@ l؏6y+ cKrJF`Jg)y!ǚP)G U)5lPI%jNX%m&?(rd(I0Iu20q&,X`ٌ4,,* ,'.`N\4.h/{\ڊK IDa@0NxDcT~Aq bŒ'hxn߿#9xj3_(ʋ=KJCEVuRwFV,\FYۥZCYjgIk.A,:JCheBpKZp5T(M*;4c/SӾ@}l|vd(8$H2J &M(mlJ}@"% Mc) dt;$[Z Aol;PCйFkHP}!2AOȼwLPGa/wYa4 8Ӣ 'B̼ؖjAywy*y!YĒ[5\#..!uI }I =*E\2\) ] (GĄĬR\>.&9z`')-!i@Aa^138J) /iA02Yp{[PYGj@djăzocpXHڰ$C$;0BB-doX;$eBWn$+oX0p`TOj H.ISGE [Ռa P(-_Nb(T7$Q8@a@(}OMыmR=P&Y,ߩ#ZBG82n|kYy!¹چ<Z>lpr@ pFnϢELImY)5vK2iO|\mCl j[?EF]@*o_O7}vy-GrJVfTt5Hpb;|G]>NyKYݔ9#6闏bJOᢇoJByܢ^# 9]Ɣu$[R6&)!6v;G-<Ї#<^~Ho7_lDb(Lg*@쉄U" G5:x [_bj I/~oxiVtYxn??5W j+q yi?|<Þ1o@;1$,ܗі S]C/]c(o*ΜLoE2t .cs Q6Q{0?XrQ UڦQ<}O#Uslf*L Xc/łvp;/&A,n;vPL~x#. x *9~pV 6 .[AHͬNErm|Scǐ8Vnz'9xy7a]`CPY`CI҂ p0Xa[`ij<+U=8p3wpn%%b%ݰGpKn2ރ-+=Ͳ2փ++#=2:-'2R~o$p ?%UO٬TX{Tuƿ#S D^[V XOz/z6| t%;?v90߸ 2-F:6['Fek\0Oy|ʰǷ'a4ORyyj8/9xΗUױwp$[ܿvsp6u̴0}ՠW}ܚ}o>ΐx3jV%&2UTgBDlGOUʩ|(o?ntt[q~bNO |l|?Ha&%B°@E8X(#?FꎺJXR΢P:-AG9Κa2\W5Ri`.Eb+s2ܸPvژkj+2J`h[ˆǮAS&ރɓc~1Ʒ6On .Gkr ƹ4ח ű]e]w=e3縶v$3 YvâEN7i][]_6kӛ:v5T\xpB]i0/p~hMP6ϢnhӶ>] p gC)Ns;donPlV6HN}lZe2_L%)q1g+^ U ʛ4`U2_mmrFS)3'$E[qpr nj3QnkmMev+[g%>Lɠ WAEl'&/a XPIz"̟/KwLg Gg8LN ek2Ex3|8TG>7NKf(D!{Xnu\r 4gv"xwOD7 *F>m02HʥֵuyOLltOo ףLe-vx7;*/do̊g;Gf-wh(޺[ j+ `N]:[cisoIz4eXYeWh`cpUm3/zX O~֊8ڼ؀]`[!C6`i/:K!.m`ha1ժqy*e5xzCK*O4톿TnX`D'Z+7鎽1`5nFTI{d$Du}Q#&<,2ײ}C剜SF_U9m~0Jy*J5F](4b$An7n@: 5$̩R5GFiriO@V%0Fly<Ĥm`}Q#-X:c>Q%KBNsy0WA}4! Eðv0ƃ46l(U(`D7PzkL 4޲jQ0~/i#18x%®N=MkӺ=w#nq6EfZv8"vQRZΚXKsZ-%0,Z7`&cU<b[{%oƌ /BVPdЊ{Wղkmgxqzt56`4l3流/']KHQ*+P SLPgߋ+O%$qya, ˝p> ._mWԈrYRQ١TCXspu!a,bv \=eDkqzK}ה"wqC 3#S#L=7sY&.ϡЍآQ_F@? n_C5A`bLM9@X̷tX:c%-KPfq/#֠N1́D+.W ia]ŽGWt$6аv1/#K9 }$i(:`Veɂa Lj" 4G/)֎xYZX9!*@OuJ(`TϹD=6I:ǐp;2-c·ɾZ`9=Gbf;td%nZ˚έ+!;V7u1\/nXJ3,I3J~Wku*fmRnD ݬ-8ÌYާHMBE NͶ2$XƬW> G}/nbx_ =%8ْ9A$&TTFga8f+ RwXK\9j. ǀ 4(Y EoU&e]]$Yބa.w&.b˱s90  e*kEkWukNH/w.,-zhnbrm ڌ=MJ̎K&*$WmsAn۲]ظVo]VNQGS@~PABک2z>Fa]g; _ "8X2 ) rKxM Ń{Y`xp8!($ Qܸl[SED:jNqPL`!^_56v?Q֡xEzo\Rc[~ zNTz]W1`rsN?F~=XRީԺ::p{8)3vxY$[o * {)w{YpXànb>p\wjNDzO$t;R̚qHp7iNp3، DM΂D2غmҫg`v?>nWFˀi mQPsD^t{-.j10`f=wZJ65:m~A6:rJTLg?+{۲T:觍i5 ,̑X 0پ1[!)D+lޢ{;c<$yWpQi:LAy"_-iO V~vr2)!Yt+L#;*!"<#Vb.(;IJ-P1 ]7g\S6pRPd\e?s/a"ʝ$}brvXa;dΑVH>'$768&NgiDߒԴ݊ĜnnɃBe\rZ^/7~"j}"w֓Nrax'%&]c{;!ؖP$ [߆g mT*lew u@>o& .nDB1KC,Tnӛri،\!)[$~ӢM}Hk(9 HGKW᩼˜Mxs.mA.1M *f/;(@3HW w&n.[0nluR[U#ˑ_<~| 3` |~}O4*=}vO߭ť_ii@Bwt#|IM)ol{-؍)kBp:pV,Z'{+;^+z ^C==W2X\u/.c_3!l1sk8CMtYďao_Vo)>;fE6VjtZ.$,Ny;tm!hoIb ^+]q!)%THۃc }daywa-rlmWZOpp@C^ZL+2ֽdվs}kwUfدΰ*/߾&d {1^ V:`&55rm1g}5Ȇmu~ rmPȜ8fas {99o~uwK5cC7%1LzPs:tNK;Rrq+#yBހc2i>ﮇw|ܣ\aϰKw8 Hvyy==_:H#/V`)ږ0`T`CT87_.H"TTa0Xb,{S.Bn2b^]Ÿl9@WU(BB LaqP!8BWUC\!T 0!K:ϕXH,UPx0"~ΟО~,~h݆,\hϲ dZ)51 7[W n܀ncpaE6E1Lq`2(z(%yi]Z:5^6U;q^%"J?A Q]k+*!5 C5"U#HQ!jy|U+*tu(jĄsD EG 㣫O+ @iYQ#JӲBmE`EӲB谚ӲF4eE"tA5 "ǭFLj)*7@DRL62YdEaLV1Y 0dC(aLV1YdE L62YdEaLV1YdE L62YdEaLV1YdE L62YdE0Y1dC(aLs[9oBF'ěo.'7NF躁ژ=0@%q4c.ruaz_;n{cd3i}~t.U P1`!<CǑI8"j6 ~4׏x/Y[8a౒\b Y .>hK. x8v*HM"<h–op1q=@fG{jA<$nS% #'pGEJFхb2V)6gK Ԟvɥ/:OW| QDi${yZu|DbɗD`>{7DuDrg(FHˋ@Ꝥ=|_5֋(U!o{{C{N5(rTJ)+rPCscWssPx|/ N5>2HUriBZdIFX,ZE Yݬ}ݛeK; 5ڎ 3q{Q8h#[w{?{n{nWWx]۔(tƌkPIצR׶g04SǦ{.o94a94i=G I!Q36! kS!M6wGD䑽( (WkߋHI"8^rjCΔ%CW& HEA+{=٧̩U#@O%xH* v84+t zz\r}]תmoyA^[=/-@=4)Gjf1$i _C{O--qG,mi]*m9&ы&66dfDyV?qe';; ,?h}zMƔ6{]U::2{aǮyY)W7M^Z8heNr (؉9!XLC/ ;v3CFNQR Z7ޒYf/˝+հX+z_[V*Y;j gGfEظ\u _VbveMYQF^]goq Ѯ! o.m}H1 R[Q'<&/ҰrAʕL[ϻ? :, ƃPCL,#T:+ڲgx[F^,_[ԁS+3K0u9*3ϋ.f:tG{;{WwtwϞeiԓN)P,Jnq4|^tg6=_h7Ovw=dށ=%!E?d;PctsFob|mŒ%~_7z}g_^W % FEO7ͬp/ǜ6ǐEE[aM/M:߫;z_67V B&fYw}Pͳղ5]h7OvwŽ+_DYJZZEws@wo)\/r 5PjǺu2mUlu[ +( *RkU#*7_؃YId&19T9xYy3̷uY;$:Mém(s|M=a7v6qRU+~uŔiRL&IvQ! T(m@,FFKz?(< a& kD`?'砨r $n{碕'#|OYA 爭Uk}Szn\J zqU\G൜]+(p^tu@#Xy.'ϒfuu%_P MXoT6NyuʭKtX^Wi?$>j-axD C6𾼌@y_b5UgTvw< [6*+j"=Xߥ*Shry#Kuz1Vny;yM J"J 'Mܭ.`;%mJ&xr'@{j%秭Ɛ@ҵռbjyw!A<_=(Vf$vYkYOasa򼚚E?B 5jYzdz0]ct ؅=b+޼ͱO-4pW{dz|_*u7Wϑ S;uDv$ip+cxUW|Rz#Lh2D ,r,@Ԑe,Ӻk'b Oay%Pi'ʊ)fͨBdA2Dx^AD-:ޝ(:Ƨx x׻mTLN_V:^[Q۫Y>*hdVune2 2 :@9RVTH~ܡGдZKkWåI W,h(\-sAh)8_}йUqfU":G$.2(e%DDoGގȬBĔUexijw #`gWvDHG5)I/;Ǻ³V1*\ǀZ^vXʏҡخo-o jҭͯAoGH"}=">/;DX Qi^ߎ ]0")7# I65kD;jvDH$'*B*h`:3]vl'ţ49əL#B6jdE~5Cu}xrryTg}닪8Lrr.ȷ#Bb()-v2H#BbƔkHu:vtDHllnʒ#h)3O1I% /WvDHlQrh_툐ӗͩԒKI_eSz^3Z 2%N#BiLE"L툐(j QTe.ǀqF;GTj(BYebʚźK bTnp\)>R1mp.ux訇Ɏ3vK@(2fy;'R*h-bә M"{npS)lFͻHkEjiNdKKVgEj޴j0uV-ZNKPYOW!I"lvBgk[22bD&k'۪8#K1]LK)pSA` Q(g &`B}4\+zљ}QM ^؄͓u{zRr~aU)͔ch9lѝoѓ!y?O=ӓwm-v{TT [(xf>*Eyr+ط2 S`=o>%7v,cr)b)~o|Meor}m?9KٮgG%7Vh$ jӽɛ^ H F1 ]ȤZnmD ]5`n[ΗOkM(=xu7JCq?Lj ѐWIOX#M6/Z~9nؿQL> wMG(ꭈ?i(X'9[s fUkirF] mHk˻qzX+94v]2paLWiF$fi͓8e7J킝^rَXw::Xڏxy4c7Gɮ%ך.=xY`[w)Vl5F|y?/d4wU&#~2ô ? \ib,E,㈪FH<O<)D)wcL:V[Ah2دebYG+q}ToC34(C( F(:%w3;bwW鲎j)# FᚁLUH!HPi93$߈u]1viv9SVݗ56HC~v |:aΏ##ib89cEV#0RP$KOM8͛tZo|x2KB+s7)>w_؈?6i#[H(E{r)aqp :QSt!4^a%$ ֦]30ls᭄B [mMe}5%.R鲎jo`^.nVk(gGΟz\! cl:ٌҥ8d?7,UvF9)_)ue'-:mU*qgc-_x/co::LW THk5n&.).)## k4_ܙ`OgM|Z'Jcy*Vh%r ;sݺbbx)!6vYKqٕ1 ]a);XwWVh%pl|_q\w 3Ůސ eleMrٺ2KGf:4]=0Kk\rYw#(O0[\'TPBx)!vRƯ6/5Bp$۾[%.RamAr⥦0$'KFVx2hϵ(.TX5l/o_:~ywp꟟9LLatSHҭ Դۺm2A%c`ӛFpa2HNT f#+_r9L1 WqfOx?5n~ `@I>p/Gw HY7qc #u\vJdgh8H̻CA,LB'T1md;hq`f WˏؐF4i&{S<432w =ɿAp)yJ|gwqY?8O?ݕ9WSf~e|<h~pi_+)bHXNʥ$ˊfv \.Jҧdׁ^i;tnO)Pc]UK}h )u6#o_;?=!Y&K9gỳ8,\/n9ℯW`  .OAocR'v^0;t=3l b5+cħP,7jjY~')puU2`hO 犯+kPw$4&{5ҀDn[4X<\@hzS4~ liOq#~mdXvƁYTeRctfzfZCk_֗7tAl1I^;N CpM,#vsA,l^I?GH>&(1kvfК=J*iO?9J"OtM+Jz { +zGk4M;ibwO{c:]ځz[To+l~{eK77*;~1%p.|jgjyo2dٶ+}NBOg﵎&;*K6^~ "=ppvQD=xjC/F^v[6Z{Lz ])Y߭$H8^qe~[ɪQ9js.@z_me[si[)śwT;:}MKvH&;Ȃj Ƌ@͉[%yEQMdԁNb/(,'`츂rD3vIXLNIanXEQ,jAqJ|d$YKQMjy8fb˜K.lO鼃^( @>W9FGSv%W .qzNA䤭*^&nM4$LE50x7(ߴ(I֓81F2`l"K X#4Of9yK *Od.H1KQ j?5f\6lUQ,J꬝G9E{d1E(==Tr_hSYF2FE}y[N 5t]-f)n bT$3>c&Zzހ,e pHeѺk P&B\YFs#K|:E}ƙ.`fJ @abɌd>RD"qxZ)sd+b$-Eh P#6K.Da*܋݄_F*QVlB1=% aL"jnJ)Jg>@8 m 'n{i֮ ,>վ}?9^v}\9P7hiTe01ڷuvߢ_}M *HH/d.wq{\Nn]^A JϏ_ o9Ans障ξE 5搫CSf 5<{todZQRBp+ZhgB}CѼFWݷtg`ΙE[Ȣ<\fB!MBg/0g\, DP@-3( Jΐ+ltSwy-ItJ0LTTe\;3 ieߗ <F7w7/g<tBx@4^Cėp%;䉹z4z}JQ|S1/c: !)3SB(o < ByP@ {R)}6p;ep1,Cf9%pG} 7]FɌ&JJ=LWücL?uD|5*~}}(p/U"Ht_a~xkrxq#0߯ooA^ _y2VO?v÷}F|Gp Ǚ3 kr`01' F0?. 'Ciƀ`N` I[8vɴ'>0<8-0ĄF^v0vy`eacЗu /; ;`0 3Ơ/ ^R PEŨ3< ZAc.&-œiY9ӈ0oL@5|g>h=_V79 VD r]}uȉ{w\/hWaIR% v2ͽ sǛ^+=(yc2QkS !pZkBhlq<~:']!!+GM!҄8N8p!p䍺vB(CnrCcm4X!L! i^ij"{dGqxdGqXdEkdF{dGqxdGqxdGrȰ,0 0 0 0 0 0 0X34_˼j|j 9S_9>Tȡ 7^ Jm f_. @nydrV&\}d/_]oJ4dD<߱HD95V7ĉS:ڟ# Y`o3νlF@6҅ ϭa! I:DI;I;},ѹuڦv=%\cHeI`_k|!WiR yNT +\-+^hAlYR`5nYzǽpQVL#24d>ֹ pVVas,:~襁+q|o(s7YE)!υ1酴ny9;K* MX n1C&+ZI!Em>%PD\r^Fjh/8GHaAC`3m=46ɇ9T.-^\ ֈmn.U+g֖9qH9>GMaC"WAmi4t֥ *+NNA̻y9!5 v*lE-%Wz1 ArTzmlhZ!p8Ţ.8FT p(W7iu-x~hLаB+ɩUJ7E,™laB5jf$խ?s':jh0HŮ_…%M9#fySWEXhMR݊n*26ePh@C:٘b$W\fL9#Jj\Z)7]X<;y~h˦´P᫠S `f(q?9sɯ$b}2 OwZY fXͫHфHMYA£+wDMC2Qt͌+z"u+6&nE2xHIfx ,!oLC h+AR+Vv]R^:9`u$K+a@Fu3b6GaAC`3mWx.qe2)o%puW, F ʔ7Vw _~+ʕ`MZ] aWd A0 !<$Aa.Ku|~.w伤!J̨ K#,0^b|nEmet ;p]sF v'u6ߢg6lgi'mNn=y\]Z_P6j^Tͱq-kUT_RC,-Ȩm튽iYܫ,+Q۶~ұ8?-d(Y o97_vN$ B$-MbɮLې+ pq)$f\RזQf=LJ}^7IdMע*1WpM-Q113a})r#.Y" q6m ?ݵ[]GM8Vv%ӮK@<"5Eg]rJ]&nz(]$q~+ӳ蹊x)P'KUr dm,L o\vʻn_(|w!gN.KEU)T74dPeP\MtWavi1i 6[%C"|Y˿\F&i .UDe*(ȧ}ue*-PEۀn|NL![rS2uvԱIA&ްbMCWJtzhCn`mBCYeM9v_^k1&LBUϛ$#xlcjTVJd&!Q>1a5\n%4Oj#\!6H3ړ>ܾS4R{|0 BR&G ӡ^^G~DA-+#SKtJ:iE ʨgN?eR6oj#dvf6;*t%' vwU8J%."Je\fT8ƁχFEΛو3&Q1t('rHmLof# m$Rf;H mC=6_%G^kv65oOXDcԦ=|Mw@ X iw$FXn5*4A ldhK]Wڈ X qKRG|jbrъDZu6 cn:pK4$ڐ(6"ؓlf8OUszWE7}0)?C GĘk &>ofc]Dp,(Xd㛝+ =~>BUqJ~WEF@Q7kuE+4B%;A}u>+GO:Q+,YI֑:٭Y\=*V+X#G\(p$$HZ焹IPY.C)&b,1mD5d^1iCnCb=iOPa~T0X$ OUɊYq~ p)9A`ʜT߆=!?3}mmoHM~ m ?URtY-ׅPD{5ƦTrMf@sVepLrJy4.1emhW5׿_'0:W!]Op*uUshY`hK.J4Zߧ!Mr_ ;۵Xt^1<܍ͅfNgT +?G`9g` g` ~|1IH(h=N.PNo۹ȸuZ`iM7HN-|B|%M S1T3zRD.p6Tӻ]^0_\Y$u2tמ_m'0@O MM2Ȑsm HF=ʵIn뛡6};|>[lg&݉ zqH^cE5̯ƨnFe'fLr =ܵͳř Z,Hܤ##][WJo^}l[ڋtdMߢoo8ӓ^>}FRN8e`dh@KF[W6&A)mt,:|$FW-ewی8IՇ+@3K_[/J}emhWcݺE3#<ϐ#!3 Q*Nj'0L{l9/=/𮾎5[Wg3ھGj;;Owm}{i01h~,0{'JdaUrz@ߓlBed s̺nseԥ.:E^TdFq06.l~n&rhS5Pq%vK_B5o{_fΆ]Tඖ_Yڸ7,lv?{~&wo)6ou"7ML2[*_x'Pv`t φ#~͓[0{v?{׌uz{:m\5]UoWt߮U\{nc;"3UDzi"}QB=PZͣBuCO2_u݂Ы#ࣃ^qr<αQQ&"Bܘ `Pd뇒i( ;qtU/?͛i3nm^VDi@^ɮTn.5e~ɟd;vmMNNs:yQJOaalQ0cԮȕZ<> em`T ?:`RMj"".E7W9W)]]>"egc;`]=IZh]=rp䢫k,>(KnFmd>כ̚$ɎLt "{k:o/R2 ]Kv[WEI[쀨k۵ݓdGX{k6Vilͷyocmo-|dۺw? z""PN%g %Tmύ-;yǻ)$e0:خmBNjde"lspG4[xF&k?Ql)?Ov[#pSFƐ<*_ 0!φA|mlYl׶k?'iI3ne>.s6]т ae~ ìIۄ'"9x cd@$'O:Ac4 =LsR ;WFۤI񜛔6SmjxzSRg3u<݇HIGMH 4,;n,;9'":W} j 'E,;,>fu`t]ۮwfᖍFEDO+)!k cӤ_Q%|3q eI<׳=',~mm'4.E#xuuP"$UBq654_F`M2yҶJFMVxR ÔZvEiE0)]j`]OHg@-Hq'O5ӄQpt]B`zEqc^hmT(d iQ"Is 7e&.p݆ ilژ_vM(j;j6g^M7A*k0@e'B/*#EU:bSg2wgcDu vio+2]#,mmkV?5[6zRm}]LO?b.T%` oWTW?H?6ìl׶k?[(Iٮ)A:]T"K/EVLsնfq`pMY靾/vv;:7dwNCgOv`\q0Gۥm"I;XS+"WnẄ́&{W[2ϲv ]ѼQ˷{V";^WFS'>ê+)z%O烉v#`vG5,)TQVӆj [ϕTV}En璪a{2rl`]ծl^-b۵9$ ^ǛX{RǯXJ[qT_~G%D= уm^I!5ց4uzB᪝Uꧫv߮ݿ|ڔjװ|Ҿ [D zi)a.qYJW/~_8rGW^Ưcl]ٮyl,un,귊rHjŗyV7v@ۅ5~V0]-TDFk)h*_dȇl"y)~n쀨k۵cpFEDO+)!TDnl+ p[Pdޘa UͻK0Ց%߅"2ڃZU'W+{;_HWʜ mvg$בY7[)v$qxoʶ'98{M2! fű(Ʊcusj:E?%+w&?D<3'gR7R'*+K5ZZzVHOPͺV*5P }Rv&XAnZO ," ?Ն3%rtIf@) +Ҵ|TO~=#cُT:6&v ;w$W,O-VVb_GnjAfמ(꾠f}g^Do(*pW=e`Eb50Oj9rv;tm[Ojd]\mxJl\1NČ~h\lr䊌UoO4^=6by;1]U yhxbhw Dā)1W,[*Ի~ћTJrh J+c 株k+w˔<,Y‹غ:0WYfcxXR/ԡz2cR`BGs95 w}lo?waMc٦GՕyS4۵~e_dtd'tvަYkqRLvX;;>"}1 }AUśdFz=$F#N}V'1{>׬4reC,pʉ*r*6,bNrፇ5^#uJia +)A6/3ZHxYQ:m"OGJux֟7=&79#84lJ-Ip8(4ZP6`hDUI۸Gr4"))28_N쩃2` $WWAxxl9`:IL[# T1SHӧItӥ$ο蒟l9~i tVJmþȐla\r& K}y:as IReȸ +ѣAl RH=P$|*ٺ(%jdYZq؞rRs(]u8j% +ϊq(PEl$g 03î02Sm@NxNrV- +w7\rtWǞ$Ϯ+32_Dnb3ؼ 5N/+4q`yIzb޶S[_ZADE=kR;[3m2 E쥇ww=+ƫx[A{7I Iհ_%MLީit.iKM54z-CpbE?Rq m]%wnn=Tnr7S8^Yvask@Ap;.N_0+Y5c{Ş W$zEmU!P/ݜ[S TnrsKQ{2vmSFn'wnnxs>=[Sc˱߄_#~L>5}XvT\ ǭO }7<.nݚo6|&굺b CԱBM4ZK`0&6I6,MLΩioMP=DF)qoeTHslb-U;JE3t[S [a5c˱d6 HQzu WB$)6ܹI }GG#xg.8!*AR{*ίYz-)w*|wfl9um%rU@<&<':mKTm-AMr;6;[3W/V:u,;mJ<z,Z~rUV k g{WI ;[3Mv>5?/ 1@]52iDlQɼS!mMºUB5K ީݚoU7;@ &MVYp=ј1c2田\>/H.uorwHYT ,CD.=BZ~|wtyWpذީݚ3 `zDv;[S@saO0> W(%E_w[S)nro8:۴Κ]wjpմ&xXB;WAW/my(lsfh)L YkHBFiL8סm:]q.mZڼ˛ߴlki%\V@dٱ셚*Է.uL6B;O!]%,*:  kۻ+^nIN *C;nq6nEWZ s{o$U ;[3{N561ź700.6?<augvq{ww֌-ǞJ+2eԸ*SZHjzm݀CI.I%K{o=8g'6vmᷞjs!H"^"HZBH {j;I6rX7⌦7w  0Poz/vAM-B6>l0n ?ܵ5\iLX2@C 3Cx7Fbh/_uD& 'X9uїdA`mDOr%JNYAT&A^AZky t6^u@ú1t6wxB|p]iQSN+ q0=maݱw%nNavzho"NY.خd Iޫʵ rFS6Xٌ %ʘ62gyeGy2irX/Teud:惝+xº!*.m|F]|CY[ѹCI[b5` !mCO'P TX#p?Fay` pE05` "XLB:0Pt 2U Ft<cR U`|q({0P{#j d@@%y, 9q"kd vz򄬳#҃*j3ҔI*н&`䠇4΂+cC@0Ŋ< cp0&ZB`rƘ@1 i/; _5tE@<G>N]R&8 `5086Hw::Vja* ?#T'؞t0POt>4 Ez)8*-8/UV[_}ƓFNY10YǛ}ɎMuڷ8'vL' LHtaL1dPJ=)ȴwPjvR6Mw ~8Vwwcz+f|A_!8ԃMBb& kV{Ӈ헏_{ׯBIo.j[ҕjs/%eep=)1p5!1.ЍK w +Ư _V x~hlQ@>}|8ޢY@2ƭ U?4HJv'ER\mh7An]({թĵt]|CI֤I~)419}1C\9:!fq;#.rA0Ěd2khk$n="#Hµt]|C2"xZks`Xs`X]W:TuDj p}O_>Z=-1],Vm$n]B![tLIf̳a ,̸`*?E4XK N!O N@< H#tPjO/KN+ӂ<$9 cgz& P),mhֆunm|'F]|CߟF0#ƀes2s[`2j(mn ?ݵ76BuT,䟾 I5(e@-I=# `%+;>C\Acjr)SLe^Z!Se54|Uo7GhDEBm`*KZ<ҹ!&^uQ4S9!Zܢ6wg^)|d<"%gak ï_~>)/_٩fM>Zw~rpOsthtv`.C⊛}~6EK|Em! -v\χPUp۝c̷{ꑪ?FuwEh endstream endobj 28 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F4 5 0 R /F6 6 0 R /F8 7 0 R /F9 13 0 R >> /ExtGState << /GS1 8 0 R /GS2 25 0 R >> >> endobj 30 0 obj << /Length 15111 /Filter /FlateDecode >> stream H|WKO%K>n9vd+NVf8ڒ(Nߧhv[Qw_7FѨtgTRW*xX+O .Bm&yVBu*<ӝ龉/p9m3Ics ?;}7Π[o x}Η㢚/X8T3v꩙M460󠺦}Q6H4•Rm.J?݅5M AOծ^Czypf9ݬԂǧnooDAưHuE;ر'G07 .Hrx8f,wվ*tNYK2Ź(*D\Rs𶶵V 5]3L OP*>p!cC$8Jn4!c|/n )7J?u~osυ_kI_q*f,uIʫZV}7%Dv`+:5[t c]m\sd 4e T7)GKM/A*Sb)]fYc=S桡TDUpyvEz+iT@HJE-kބ`C\OũNT >u;w/ᆗKN(L*{f$9<]_0O91eXԾ%Lelw;{7n,eKv=6/B`Y"3m- }L ]\͉gVESڈ b2פ%m_mӐSjHO?#֓K/y&BN;z_^S(i^N2V)r%rm`ɭ!G<]]Ӳ68s@Mݜr*q@@na(lF;]~C36ؼP4 g%)Q`(~~WUl9Q;mJ_%])d c9)^Q³mSTk9,E;^ ~#uWxD3h#D|D! (+1BQ8FQMWxDV4 rCW)ITm\+eo/+:vrdfv}U<\}wW g|π~wx8'<3@) 'x< iB @ D:L0  T1%׵^ w߮]*<`ķpգm)4D%DYCROuJ&F^+`, w@)Q& j?%-I(77%e.+R0F 9b21iԹ!Bd9oar|WP3 P$\ -ᇶʸL|0!C j Fex*#C/h΢KTuɈuJ RBQ#*]Ba3ȐnϨ3 L+ᔑ4]xuΓ|JT۰I݉]mn"낦*oZf \'I|YTenK -3qAmE3J&dq^eNy΂Y# @da\uoZxJo8:N:*+ɟjˬÒC/Zt&yρ"AJs^2TȰiߚ$BS!j'͝BΖα6*ҽ&)Ic9UYFR|.}&ɝUj'ͽϖα 9#hIcYZ w IdH'&+yDn)sݍdT1y RކhTL.YOŹշL7k8{>;oȾt;bR(2i&5aefߤ4ك(J淑Zl{dw/ASܾ){X1ᆢH,Q(5&6|DS1lD7~64b_oDB:]ƺDzT19o6ތ%cPe5oE%8aWHkU?+[{- 6y/M( QH92FEPg%ȚzjMfB)Ga ;Q]Q8aMI*=o<C` TJ1]C0kkiF SN؟0ye%2L[ B_cD'$F0gʾ*P aUº14ir8k7="+; zǽCRsЍ}%avq{? [[̛N(EFaYeS6{M-&'c?h[\gpg*|e3Xg%ղ*+k/GvȲEӾ :!Őz~a{~a{{Xֵ={kB.fR1Jvh:h`~Ho)TFh!p5o_(Mepk4(qtҷd%6b~Ͽ}Szu䑅ηY\eXe޶fNy"a2Id~l)[Bj-.q29d+%] +VdKΚu{f{VdUAS<ީbf.d%yr$GO@]gMΎkB"(lf`1p1[M&6##Ī5*f`yX~`"rK&$Pxw*|uG3 794Yƌw: lo qz?ye謨]Cɰbf=AkTkKz,.V/GX7&p2Y S@HbfބDb`3B+7#!ؠR՝VqtM2swY4 _ь-Ʈ3fO{Q7YPj^c):ղ]W2s*|mG38~G6G&7< 1[/S3DR @6XZ3v } pMBbeD%dcnx<:`b, !UˇUU@JN_M!OkayHP;:њ`Y9<Y49L5,U!9/3#J<@7^{Pۉ{`}u~ۅi_[ Ez!qgPb&d3m{C>6MlC1w@9c%Q=iޕZ k1i DM@#x$Ϫ] ^<7ꑄ HBhkgoxC =~)%)>~ZXVQ0PA/.1OETmL *ӤU>cVs2RYЌwœA%:{V9SJuGk+Qym%{I~Om&U&XdI:/>Rfz:[Cru46k (gԚRbmJK@gzCztXJv?xoh7ghˎ=qxPvRn[}YMIٺEQn~dvM{{zU!C-5M# a T@A9܀^Q7p Rg-~:0Uywlb:Р2fXz'*|:I[4#έ@ K(mFM[Rc6ِ'RaF8>HiI`dMJS"MtFh\]:,:)n'tCt(9IFNqm~qߧ_kΖxE7x&yϺ(wX_uޜUJW}.:l$Կk]bތIw_WHAb~1VXќc-ߌ}Qrsn .V&i/b=eI("hdQ۰sR#ߜE:m{^/E@IJ4f1pG!7DAWb@м7 %BI[1YE.!7`|!ۜ~r)"$K{E+quEF+RM NSHyuE9.'~\2*ۜRDM)7'cF9bH 4;%=s`;ì-*.H,rYǗte"B.Y[&iuwfYꥈX^#|qg:E__K!oTRZBPFڥ،փE%#Kmv즖d_+lʧF%c؇ti\("$6i_^'㪗"BDw FU1?* e#]D$+R^/EDv3|Tha)b3dL`ec:eRlU,sWo,R"EW9 V^WhA@h8Tȝ.`WوwBQ~vl!Y_?>BzOPd wǩlw-7:ѵ%\'FW]tDiloogϭ(+MfrG+_ &1xUh;8:W-;m2X#ˡVݺ#l?")ߨգ/.8vj6bz펔FVBBE8p`0n^&g1S zXk, M:y>޹uud5K`q`ttj(2 ^Ui q4, yVI9#6ַB蔙(l}Uzkr0f: M+SC}'d$JDAHBɏ鳔1O68psWPѡ~m^?:[&`M$@]66ZDd<^$MBa4;z9Z<2p.A.mQF,[י& :"tf0q4\#.CSڼ~DJH[Z3SDh.\P-7;uvdr\='[vIçû gWK060{wݘ?ckyڀӸqxhk綻YiK?(%$fܡ Q͛F˥nȶJ֍b/me=~zh˷wlh>+GQû,$miw)0zh' -vm;?̍%G7T`M$@g,m'/mƱ?Z4-ÎДW nG\ (dw !;S=({B.-\ELXnR9a myݠ-Lƻ:y$mJs KXRpLeð+ޢcZR[0@;n1wq pۗ=l!agҾlG\+ٹQƦ-K|}nfp)g x/i'>bhX@g &H,یjTҙƳf]9;{Lqv(˳snGWٙ.P,!!<?5/Q򇚪_qXQkj,Aj7/ϟ_?Xϧ4%s5AԨJ.`miVO[sxw=Po5bl[SзG3r& =Nv5ob%c.9r| CO)_͏w lgc~NA8_TcF6<k|/s~^Ұ^'M*{+6<;9LiP ڟ$w~ˌ8[δG7ѱ& +@F]$PƆ} xn͕n vAPA x5^Ou ƫE[|6-+b,;7#D|D]]왪 ^9mS+ Tvh3 |5zE)Uz=&/ݞ%Җ{q iVUfkՀ( 9 Gw%g(V\)YEIz5tey-g>;=jݻ?' FxUqŹU}ڣ 2}:[>5Vu-AR/ڠ1hGyɻ59Zǹo8т>v*9FFn[!ʹ\ idH v czI23xD[}>[wけӭ;ίz~{~W6iM˸еR p+-^8pn4AV8jS4<\7Zލ Fg5͜k|T_ tQe|tם0Ŏv0<݈W4UN+b`U ;`G7*K浘ݴ9t8 iaW!!+e㉱ne|]:>r?U7rD`hd6  /b`5fZ#YyU,@nvUב$]i>`beia|V:Rht P` 5J(+bâ#3 +V) [V+`bՈ.PQXq5*I~6$~ A2|lMaxR2fyyv[Q"]SXх X8; d3cڇI\jLFT l$*c6b~>Lg\꘷Y*WK}zE8M2P垢TJBdɩ}86NXA} Y%/n 5`:e,4򶥨 +]X'4MȲEVR4`\r,X6U[(7'U,ULj0l"Ic2VNa{Jؠ6|PBh hMb7-fTxI(6MHA _bec%pC;v:d8d:d(Ն` %:ЃU|ՅZ+Ѽ<$nFb 8EZKEpR>]"j2Y ؤA 66&؂%Gh~ -F(ZZ`L')m/J@["6_f\6!k-CL)&𲩧TjChBRg\ynf$$Ǻ9g l8IGohRPIj,^m ,ޖj'w|1!ZD3AfLGvDm"Gpw@.ns_|!w}]` $ą~EoGyIЙ ԫkE$$HWN/(hkwOe= 2t7ر^wY HX^_3Lٽt|2~r"uc㰫f׿}kyLZ2./pQwgbTC4+t%BJM8^xzt* jk\ouݲ HoRBJVǏ!Ev z;uc=7Kuf*)* S^6ObȾM˲VH Jb<u F*kJ:k(ai  6HrU5{ZAҭڰ;$[,/&tEZFl1cfn(+T\2h_6 -)_mSTtܬݥd<AI+ݿTCI||ŬaWEIkRNh=/WA_E@P)y wVp<~)Mۇ$GӊQ;gYWdHLn㉖6r(js}G'AvĤ jCkAc hQu,ȵXRj>ӊJϱ7*@SиugKp>„vgH]"SPm)"~z ûLylRz)yp 뜏ճD-n3l<.9UY`1ǀ^ݹV#.rƫϯoU7 Yem6=6ҘR3.$h$Ρ=D<)vH?%/P+[X:pߌd1U #$up=K(+kuC ?Ȗl`Z3?7*: 4Gf8!NM_]=Od="<:?JVsBX##ͥOLQlv'v DӠ:g*nIDͦR+mbc)ˬW0" c=Qۉ{ y#-iv1,b}ܷr=©>KDUy3fg2wnӫr҃j,qMnumTr: 09_ 08O*h H-%?>&Q׫Vz &^̬LrNV3u,4M0zh[D;94{:4~. p*esٵTs=yhnOG2y C-:Oj$FZS󁱤Deޢzp|:uΐ j7{WɃy25Yߋ'j`9"B{4\HiY~Nhc`,`r 3k瀓s{F;ra6*Nc(="xq:ZH#F=rm7gd:]*s ʼ\~,gJ5uKm$'e^&$qtɩ+*,~v(䌀'iF13S]JNj0Bohd)fYͲᩣG9 bDŽlGhS'Hd,<{u D&7I01yq^ΩڀP6qU@k-42&2(hwI8Oϼ'-=+ ER}u 78q+a'Q4 _{øb֯`ځ`*3 k`򵃻,| Ff0|@0kL$oN'o+q51nU2p]Y}m'u:Pq7uׁׁF%ׁ^~or~o]I>R_ioitw9w܈N-g ^f^Z:caW36.iK>%o,k*x:Ƌ{Itڅ2Pg{bxݻp}=Bj?W%Ld=Ap$gF@X # 7c@P "Rq $g80Ha\p$`r$0EHJqa;,a\p 1B`O#aB`5&!8֑:ٮ" Eq$tzM'*1Hp!0ta3TBa؏cp%e )gXM9Ê^TrU3JJwa VY6e/-gXi9j^[rlܫ^^2ח3af /0cx9*Vb3ט3ƜaEf /2cxë^fΰ2sՙ2v VhΰJ3U|\Koqńn!|rn SSXL?/V)>+&|/p^[0p4QF- w(]mk`n܋S`٘ZYEз %Ur_߿!v#e˒ADkgn'ii/Knh }n?~Tm{Gx)t[wzZ#wb˩]`x/۶ ,q]*mmDWC;@{ി̝@:J wh5\5e 3̟$_){* θ 0O6T@E%a ƽ:ͭΦ,*"[bd[%b_NS$&3RtA*0͵SТfWoj].g0`ŊDQ (a]?I0ve'y]zamo;lvVmQ.l*^֋ \ ׆]O7aIΐthhkcpWMn*-(բ%i О&M܎ho(r 㺡ΉZ$ΈԔ=oܱmΪ,*ץ"44k2%yMf\y%_s\K.KRl>ajYj-\4'eqM6$H)cXlF2w.vh`H uȔ٤g p'VRrG6Hb{;vh`s u31+g+m#6ʓ R]j)Lh{Ĝ7f[mٺJnUۙRJ~I%Tb&I$ gϐG~Ƀgy [{*n`w"g7}bf(toZ.tB0߅ΆVzlX3`Kv9+`J u`jVvӒYX6Lv8f4}}t=؂mjsUaQTâmk 2JĶPK\33Ж [ݩ!]&2Lc:pGWnު-jbEsG kC{Lr$#Ν 2a5yJvV&7oQeJ%$8n@@>u&,o 01V8ƶ7WΈxնZVAf7oJ?SΕz%\W]+5jr㓞[ۼUXUI]aj:7ox+7r{፱hYLzdeIw|QX(lq ۈ0EkNUҭQ/aUs70FY']Z7kL2HQP 5X3f]«d+Ei2ˁeR ;-ēz#p'?V:}TBXAo|jP'ѲҐڭ C%!3‰HTE,N2cVhd8c4qC4ʐMMsU$_8v"2qȖֳui`h,*S U;IC): iJ!(43Y*BFJvUeMc-f-5L1k3NI7apٚ/*:g`LS8$ e CS`X墫~1R@7x:UovZ.^F~@k#*K QR tNi.~iSӣ7 ? Ӝn<7?gk[ՈY [eSEkx|˃\n )8&P𱐬1ۥ$,9k ˧k6{Ok)3 endstream endobj 31 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F4 5 0 R /F6 6 0 R /F8 7 0 R /F9 13 0 R >> /ExtGState << /GS1 8 0 R /GS2 25 0 R >> >> endobj 32 0 obj << /Type /XObject /Subtype /Image /Name /Im1 /Width 180 /Height 173 /BitsPerComponent 8 /ColorSpace 33 0 R /Length 76 /Filter /FlateDecode >> stream HA ӱjٶm۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m ( endstream endobj 34 0 obj << /Type /XObject /Subtype /Image /Name /Im2 /Width 180 /Height 173 /BitsPerComponent 8 /ColorSpace 33 0 R /Length 76 /Filter /FlateDecode >> stream HA ӱjٶm۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m ( endstream endobj 36 0 obj << /Length 2534 /Filter /FlateDecode >> stream HW]F|0RԽY $#r$M<0je_k-`kkfwuuuuNŻ"v2E$[.,S݄)K6S"|ijl?9K6})݆=Wņosa.|r3ۦacYgq]mlpp"0I&M?`冷C tKY4bD:Jy\(ZQww)*YyQr \xQc蛺fGE񖕼t c'pzgC#rC /A*ugB ˚qֵ/IS*)t(щq'0N\@6}K񍂔4!8EZоt ֵpAR-3agrgnAEU6CdgbifDNji3c@Yh[ K,-3$OpD+y?1yIҍ}p}f1݆YcS`OŦJne)A>] 0Lw{MՁMF Znz 8!$L]9عޯ~xdPVK|$G˺kuy)z(xqT^VsPw^]. 1_L"j]RmDgjgvIsP_/Q3\VPT&x=9_M#Wc{e:a'K)5{xvVJU ͟e^B ~Z,:ޮ=w Itu eRPF#Kgy@S{QV+;e .k,kFs p' -~߂U9W^$6, oAn#W%N!'t:08 i+uۛՐIH]XM#BB$meEt&JNҏڛm^,'lvIX\MKZO3tH3 枺e}&y5~yFҊWv&lc+Dƀe亶16 Xmsz.FK=>By!Lܠhtq@{3ҸԴ\vC8Ifbݰ%u~o}]}ls¹K&⠄rs8bzwbQ\E6Nٰ)yH3V௜LdUЏ&A(-_Db#)=j3旦l\$  6##{rO,#rtF1+@w=גhC7H$I~lWo͋'REM4*kRE`6&Z]1&> H(hRKKMzkH6 \ew݂DasF>0v djW.kb rmѤ7S3 ٣2qŷg- sR":uvgqp?pwZox5JyNJ~xs<\PR|ag&;K \[FV;hgg=^XK9ƊyKGjRtgI &8&QaiC^P9x9-X3žy d^I%RIIoɠ=E[UN`N\+:tK*nHcG,v#s%:J:WfOV[phmq V#Â]@ftnU*Ο._K>h3Ͽ[.n,vń&P!tͻJ VAlEf[ٝ+e.]rkГ.hPi\X3 oNb ro7sWm㐅7P)$ _ js`EIG†$ 3crBήn:G) yX4ů08/#Dêo9$qc?f8#?OB{qQ9⒢ͅ ah b.J>,1Zې\Y;eJ4!QjX\|r~ok ީd\D"C2VH,e4 \)q|OHŻ~'Z(#޵B=N"Xdm߄Adp-3o?JGw]/^Y̏4scl @0* w=_JpGmGOmX޸pдk7 V:KWȵLfd7.3]~ l endstream endobj 37 0 obj << /ProcSet [/PDF /Text /ImageC /ImageI] /Font << /F2 4 0 R /F4 5 0 R /F8 7 0 R >> /XObject << /Im1 32 0 R /Im2 34 0 R >> /ExtGState << /GS1 8 0 R >> /ColorSpace << /CS1 33 0 R >> >> endobj 33 0 obj [/Indexed /DeviceRGB 1 38 0 R] endobj 38 0 obj << /Filter /ASCII85Decode /Length 12 >> stream s8W,urr)~> endstream endobj 40 0 obj << /Length 3517 /Filter /FlateDecode >> stream H|W[6}_`bn.M| }h]JtHɮ3$eK4z̙3̤p]$+q`$^Ey 3n[<.c)]_$8YmsPmK|mfۿn5r+6,ˋ޳Z fqiR_">FegI`Yho9܊{+I__)~T'd~nMR7.NRb#|3rwI셏 .u5k5z2&9*YRkϑ.Lw0<*6jcfBxU㠫%@cŇ;6!C{e@=wlu577 l1-K/,0eEBqkGƕՀg (1z.TC)vAqa3M4Gj=%zyP/{<%K#uD,"/#uAFs ^6 >z6Цhd9KcЃː y:1';q#}WgR.d#7.A^D-ody+ko;ַGL,¾YZ_+\\{ twZL&Pgß)8yF)NW$ ԅ|ߨ[^79o+תx 1v<'!Z" Qa"AĈP<uC[dϺWCB՘sFi_g7 IґH90;_⾥x9!3αGZ4Nf =R9PL[e?A!/]/txÊU`T!xZ4Dʏ3q0Z*Yo UO6~0ӊկJn*L#084梸-50mJW%?g $vRA){cvOrBhKH]M?v/UC7M֋ uC鷽gLiɘTXlH{DSIhΚVy> u(Qk H/[EbRЦ+0>W,&!ٹKk;!o]rh:0$81Ko4wSF!-90X kH,MMI1\`āJ{(m;V/1-u "BtK&KT 1}o8D.O^gEglaoy;>X_b[bHwBh9ICv&ҖJY:,*猋D E#{EFxePdiZYv&1o+@w0$aPǚN7<xcYϵd% wpKqF ʺ_{ĬMC|W ۏd6dxN+ 1B[#-Ne-[L*.xA,#Ӻk#4ei2vDh\'.BHX '":^#M0e3ol*C?+5޼Ef8grY-0tҘd@Yo|`u>e(+_E88b '8OtÅIpX7vGtP2lgtF6qc}@(^@* .ANCX7߀Xek].^3TA5:F$~o !fXuR_~a>uG9fo/t!޶,AXPLO{vd9m S#TISn2lƆKS 98uȎsߑ#ܐC,E&?MqG^j}1b&:$Ό?5͒{ab4`-/D `G*YI-2C >5 I~Hnyfq_ a:o /x^2r]M"t6lKiWOᝤVdл?gP||U=Mu]EHrbSt\)j91E9D,榩&H y+U<=K]b#OB,+J 6ͲtU2xYi"OWH&'#kEV}INDz>ԆlSqhe[*`7_dx<ЅA߂-{Xl*04Tng(?kK|41 X_|xº JF"}\{*7nLR"qׯ`&b2Ku-jNT׫VLh'5 ]htQ҈al8~,]' }օpP,U{*dXQ <#ޝc5sJxi7 4OD?̴UIyiRQ 3&pqAn#*Kj_F@݉-R=v ceb[]%pv'6(IAfa'M5@[v*0`BSSsΚDIKj(36\}{ݓV_D:5n߿:> endstream endobj 41 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F6 6 0 R /F8 7 0 R >> /ExtGState << /GS1 8 0 R >> >> endobj 43 0 obj << /Length 2121 /Filter /FlateDecode >> stream HWr|wTJ$xۧu|Yd+D)Rv_x&5U#>}ϾYWgd, iĉPND.x%,VXK!S'$7v"9?3Zq~v'>^@B7&Q}DcG֥w1ug[ّǭ %?KID$OtNɯU7r<⻾t]y{,R(fCdm.l3Fy6usky*MRgeALoH\2ΨgEy3 -I-PU9y0uޝN jrYe\crĻ}KnQEU=:-c,;P{x4nj{"J-58 P" `s頔 Zܢp:ܞ)JeUY0z=8 ,:r,rȪg !b)t S@⸬;$-%( HJ~E [Z1N@_ J{j"]?du˟:w{Ln2INYF`7 K璢#K\Mg}y*B- 4ܢ.$ȁ!m]!Wzxeq]V~5{hWg |EժtT*{ij4L~$ZCTYn*bD7Pd.TTK5JgN*Y 1 BRmg9o[,nڷ*T ͵gkYGal.x#ѧ#ړST{![,c܍mƽ6µ^υ]I)$mru ?e-0sGVpblZmK:Ig K8!۞lV6)W?|ꈽ1'&a+$F$IB˺Q&YE;I\+)̂R ʜԢ= !uCbwAtT<DgTfs,aȬt0pldMD%$@a+"_%y*0is:2i4+o"kSU6CH; QEw}u&`'z GL.0^:%3`Xuj% ,vw7L9_GWu_!DMZIEUH*Hѣ}lbW $P3lm2LovfFp:^9M}:kB޾,$X [78?q"Q ĝ@ʘA |PA:QM.֛&ƘTh1Z\#}ј^ WQ `WAFwjntDJ uuTQl~.BkĎM)p81~@,dQwzW~.x= VPZ|Sڤ,QnzE`w3":~fl1eǪ}2;A źp"ՠy2/z7 a:27t=e428nٓ/5t0/eVS_:|*;[unI%ձIҪAaQb9Dz|Z|- 3f!cA)!-e7Q;-햇e}l/VcB@E#v=WޞctV6zNl{pgzɑ_7p` RWY Wػdmk^֫ T$8ֽJhuU2yN{;23;w ٻ{bڜew8uh]Γx/%n2L&Gb^<DoSۧ1I endstream endobj 44 0 obj << /ProcSet [/PDF /Text ] /Font << /F2 4 0 R /F6 6 0 R /F11 20 0 R >> /ExtGState << /GS1 8 0 R >> >> endobj 45 0 obj << /Type /Halftone /HalftoneType 1 /HalftoneName (Default) /Frequency 60 /Angle 45 /SpotFunction /Round >> endobj 46 0 obj << /Type /Halftone /HalftoneType 1 /Frequency 18.75 /Angle 0 /SpotFunction 47 0 R >> endobj 47 0 obj << /FunctionType 0 /Domain [-1 1 -1 1] /Range [-1 1] /BitsPerSample 8 /Size [33 33] /Length 31 /Filter /FlateDecode >> stream H TQ 6 endstream endobj 8 0 obj << /Type /ExtGState /SA false /OP false /HT /Default >> endobj 25 0 obj << /Type /ExtGState /SA false /OP false /HT 46 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /Encoding 48 0 R /BaseFont /Times-Roman >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /Encoding 48 0 R /BaseFont /Helvetica >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /Encoding 48 0 R /BaseFont /Times-Italic >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /Name /F8 /Encoding 48 0 R /BaseFont /Helvetica-Bold >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /Encoding 49 0 R /BaseFont /Symbol >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /Name /F11 /Encoding 48 0 R /BaseFont /Courier >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /Name /F13 /Encoding 48 0 R /BaseFont /Courier-Bold >> endobj 48 0 obj << /Type /Encoding /Differences [ 39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla /eacute/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis /ntilde/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave /ucircumflex/udieresis/dagger/.notdef 164/section/bullet/paragraph/germandbls /registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash 177/.notdef/.notdef/.notdef/yen 182/.notdef/.notdef/.notdef/.notdef /.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash/questiondown/exclamdown /logicalnot/.notdef/florin/.notdef/.notdef/guillemotleft/guillemotright/ellipsis /.notdef/Agrave/Atilde/Otilde/OE/oe/endash/emdash /quotedblleft/quotedblright/quoteleft/quoteright 216/ydieresis/Ydieresis/fraction/currency /guilsinglleft/guilsinglright/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase /perthousand/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex /Idieresis/Igrave/Oacute/Ocircumflex 241/Ograve/Uacute/Ucircumflex/Ugrave 246/circumflex/tilde/macron/breve/dotaccent/ring/cedilla/hungarumlaut /ogonek/caron ] >> endobj 49 0 obj << /Type /Encoding /Differences [] >> endobj 1 0 obj << /Type /Page /Parent 9 0 R /Resources 3 0 R /Contents 2 0 R >> endobj 10 0 obj << /Type /Page /Parent 9 0 R /Resources 12 0 R /Contents 11 0 R >> endobj 14 0 obj << /Type /Page /Parent 9 0 R /Resources 16 0 R /Contents 15 0 R >> endobj 17 0 obj << /Type /Page /Parent 9 0 R /Resources 19 0 R /Contents 18 0 R >> endobj 22 0 obj << /Type /Page /Parent 9 0 R /Resources 24 0 R /Contents 23 0 R >> endobj 26 0 obj << /Type /Page /Parent 9 0 R /Resources 28 0 R /Contents 27 0 R >> endobj 29 0 obj << /Type /Page /Parent 9 0 R /Resources 31 0 R /Contents 30 0 R >> endobj 35 0 obj << /Type /Page /Parent 9 0 R /Resources 37 0 R /Contents 36 0 R >> endobj 39 0 obj << /Type /Page /Parent 9 0 R /Resources 41 0 R /Contents 40 0 R >> endobj 42 0 obj << /Type /Page /Parent 9 0 R /Resources 44 0 R /Contents 43 0 R >> endobj 9 0 obj << /Type /Pages /Kids [1 0 R 10 0 R 14 0 R 17 0 R 22 0 R 26 0 R 29 0 R 35 0 R 39 0 R 42 0 R] /Count 10 /MediaBox [0 0 612 792] >> endobj 50 0 obj << /Type /Catalog /Pages 9 0 R >> endobj 51 0 obj << /CreationDate (D:19980522165535) /Producer (\376\377\000A\000c\000r\000o\000b\000a\000t\000 \000D\000i\000s\000t\000i\000l\000l\000e\000r\000 \0003\000.\0000\0002) >> endobj xref 0 52 0000000000 65535 f 0000094166 00000 n 0000000017 00000 n 0000003729 00000 n 0000092152 00000 n 0000092260 00000 n 0000092366 00000 n 0000092475 00000 n 0000091995 00000 n 0000095073 00000 n 0000094254 00000 n 0000003867 00000 n 0000007444 00000 n 0000092586 00000 n 0000094345 00000 n 0000007584 00000 n 0000010798 00000 n 0000094436 00000 n 0000010926 00000 n 0000014224 00000 n 0000092690 00000 n 0000092796 00000 n 0000094527 00000 n 0000014390 00000 n 0000024203 00000 n 0000092074 00000 n 0000094618 00000 n 0000024344 00000 n 0000066468 00000 n 0000094709 00000 n 0000066632 00000 n 0000081825 00000 n 0000081989 00000 n 0000085355 00000 n 0000082255 00000 n 0000094800 00000 n 0000082521 00000 n 0000085136 00000 n 0000085405 00000 n 0000094891 00000 n 0000085498 00000 n 0000089096 00000 n 0000094982 00000 n 0000089224 00000 n 0000091426 00000 n 0000091556 00000 n 0000091689 00000 n 0000091799 00000 n 0000092907 00000 n 0000094106 00000 n 0000095226 00000 n 0000095282 00000 n trailer << /Size 52 /Root 50 0 R /Info 51 0 R /ID [] >> startxref 95474 %%EOF ga-5-4/global/doc/user.pdf0000644000175000017500000361301412662210452013516 0ustar mbamba%PDF-1.3 % 1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>stream xctem6۶mWRmgǶmWlvŶmGݧ{}O\sJƶ1['zfD¶ ; 9F H `L$0"ba!b!sw075s"RQT/?"Dt47!>l6NcE% @dbn א'U! ͍̍6j"[o?"#[cBsdvBБȀ`dp3â#8X;:~L lsdKdncdlt}9~KXm휈ʋNfNv4fٚ|K9o,`N6DNo-!7pv41/VGoo_qYK_R郹#ʄۦӷmSsDĖvs8+AT ƶ6VDFY[QϪ@Vk_#K9C9[YX7/"#H:|w`bnQ `,oddFdb`=m'gfw)Y|O69 _snɿS^~GIH֍ȓ{YXq|[df )c`F#"'M3JN6߫? s{gw,L\le5q_KpDC/`ki_X' [+u&>-mݘHg:5:lX?܂ q5] `nkQn$wAM0ϓz1^^ʲ;_E! Fq5 ם:ˆF^Cg :|eY+sW#HKP<:ς`%QJN8by6me_+]_;*O}/]Au6M_mƦlwT1<3 l.!y")(\1+7=\'nVNYڭD1$UEIXC VCmPYBu]_ ^6xj`:B<6=p5Xy s6n!t>TL~e ZzseB\o|Ugۀ/\ t "wҊ?8'N4Bf)#nYW dk8c*(R je{ Fzow$`EQ#"RXנmEvK@ c,϶1{X6TC\Fon-5ZE2EÉ', 테T@Q|]DiU  XLX;ADjN<(U='@Ogj| ܂2q|1)CEi"tS%I?bT-q e@h1di!V`sk"5$@ 61$@`θHh} 4n,,#&¨6PW٨xAoDgD$!.VkdxWziu_d׌9OMBޫ8d8Sq7`$ DG㵒IR XoDꩋh Χ6Hn(:mYZJk:Ȃ"D;߷ˑqS_5$LEgsʂ 7'o?Zl锒ۚ-Dè[G/ >Oj⪣bj\4z {RP=O%Qo_x061gwH{k1=pfsU[ݠ97k8 bt jC'.0%3/B޲;a[cr ) T9pd&Ra (= 'i= ,\)s{RI$FiB93y-%ckALґ$ZJ{3ex2V'(}g#63LdEךMmAufV>(2yu^Rn[89Y P >*?TWVwP pWC{Ym`q̵ kޔ;;44"`HKW x7*#/g7zC`|izB`"n(5`hyNMq\pIV\Y_ѥtjbg˔c*KXЈ93(f[+B{RF38wF=@KKBmà3Z(hKwQ* s<&kGb0ѹGB ]qoyŖPcju2ي-W0HSdVc׮B]7H&31d/EU. k0j_@sېWSbeJ3Ww# {I<_-(uő6F<;r- _?40vu+ dyn+M49DJ"Q%BVP5u6`k$'0nF4 fAf>f(` )h7eX2RU{NN8?կHwc :|/ ʷ9&57ĊU>".H"J}0xpN=[7p>1{h{4_C XiIEyпYd+ o=` =KQӨ:8wo`=r`'JTF|PSCXeoΎS{'͛$g@W&9JYSgdLɒf:s%_DII 5-z3;ќB]Qח1,r~ q}=n#/P$zv+| Hѯ,x}h,Ork"-dJz0ْL┹ %jg!2608>v`N9uӹR[ID|k.k~6tX;Ej&jʡ q!U^7^*P%nPJM1)…PcC+DaioE@ϵԏsd~y:ކ+TszQSKC&Uf:rȾOښB!f*x]毞FwJwƭe[3Е:Yg ! r抏YٿSeș܍}Eyi/8P3M@Wemp-.1q1r-,"xcow5%ǭ T?$а6\O*?w؃.FYL RoD GgdmuD-!F{(\k?qIx "d72Ed+ :{|GzYV޲ЗvOpl©>DwjxPUKر]ȣPPڿ܀mx6EkF*)g'9B@7Aq]bp!@LG(oK~wƸ)u/%>t!ijp9v+ [Aa+dą I$QtK '98we8J"~ꆸhqϦu!!L@Mߧ tUpQsG=_]h1|{0 qZWO9~ 0N|<z=) V}&qřwtPdh䴖xM22 `2,NeguXp#6PI[U )l[ouos1:* qTe S)Mth)wL+dyJUoSwP|zcvkW&Va4*Fʶиm$YɌۻT'=MlOmxuy[6Zi߉`$m&{i F* zn`Q%eS5RoGzTb1p 5juG vq6ѐ A HNщO^(#-IF?;ٸj#&Ccl.oŞ(:ɷ5@ru56 e7&Jдϭٵz4=<ֿT~>/UACGpp OθTK<7qz8gܼ4nK#s pRS{Oxq1ʘQ+n+ܥ0+zcT=_C;]#ch"5mʱS$%}O2 >3[B7Fއbcirs0#B^CI'x/ R33RG;vWԃtmg 遥MGɰ<'&QG>nlDT}A,!\p9eeW׾B$ ܌kjHz-3[CI.caw vnJS+iw"VݲXkL+|6\HZh%PtLvjy5Y1rV-qM!l+u2t8If;Mp3J3@;Om7]쎱Q2&wsj+_&8 H+к,hx|1NB D)x'{OSdn]h1;F6PP3u Y3 rn>:ŷS?k)+BeJ$z"Ѫ6thp:*Tg^qx5УS bMOԡr8؅ewN&'F)`džXo6!L҉quh;+ͧcĈ(*(1LKܺV(Τup \6Q׉4itН?=)nc`}a ΅ !o %_h/ra=h)zk_Lb= Z@#a_18^XNEI@*oOjO^IƪXv~E`Ts$[+(PMmAϱSHJ"+(o~#I/|JIE qr~pJڡfEՂl2#vg*S? f! xT և `i1UuPZb% 8B})߭ݻ;4p='ٵmW0? w泺P3]hC4hNksIP4 ڔ^~VOmrj_l`yn  f甇o֖IkzK>-b".'u`ң.3<#A\Ӑ{3\+Q*UCm<&%$Ɂk8+>"C-j푍I uҪq!o;f\q: .SI$#sq@HԇHRЇ_F%EVsڔl-'z)G JeSIirVRXU3TmL@ymSg %E7_?0f򧥴@.{~a]!ą;Ot+2;CS-b )'l 6Yv` HtX=~^A9H,ǩM|MӤ|hkV>~ESuJLZh=~nk[f=4!oVdh2z V7=zšv05"I+sm;EGro` 8E'' HuPXzS%opk}/R@(1=ĪT꧒Wo&7Dquz|OpStG"e;A"ԃrR)uuz,Y{elw+י0$JZ=V&Ͷ4U't a#g+/5h,_ULW˜]Cӓ?Z!k-fiu>lqx' SX>PkZE#<_~EWr {@ $9h\|<锩j"‚}BUXwEN=^0#!%=Z(sVJLc̹ړ~L6Ъ{} na#fKkۨE :+%[ q-;]33Iu ^~cdZ(<ʼC>cL@C8tŽ^JH1δE#5&E[7\Y}g'yh Iި{Hhb3u,4 Tg!-Uխ%HaBliSm3kvOꨏೳuM#ئ#dl^Ngl+LUEKg\o} fM9KF"[(ȿ/ oEDj-o.:c=@Ky@~֠~\XU%aJ[{u4BbNܣR^!0\}yYi| [V'S+svջ<')[p|g[\Hot9!; F{$, .8uw vBυ;vuK6}⍐*Dv57{9/hSc% @H6.jky@պ 'di.*1nHL.2f_>I r'U2CӇ;;g1 Sy4$x*q$2zJd_= ZHw~e¥X[m\eՋt3K%5*BS>{AܵupٝȪL_=潳.[i!iURѶ%ȧNd.i‘U\~qKc0I5YRA2:`+O/lAaQehܦsڸ,|T_B~9΋F(BD?fP/F/ M< c0RiPu { ǀ0BςoU*)?ˈO/gT#"[Q ^_c|af[7W1*=!RHz`j]ҌyY?FADg6Ձ4YQ]xo,6䀘1/[slRڕ}͎9,&^H-JdW ~cs ev'i& R'~ hr ya/( 顷awSj_ A#zL%78 o% ujX2aG <᯻jQAĹ2>Jk ~&?0ڼ/p򛔗M s$OZOk8f`nT6 OE}Vb'h֗DFA޵ӑ] W&Gb)  /TT,JvF-4?f ̋c*ggH\n1BD"AG=nB7a8K[ 5Q3Rv[<ϟX|ҳ.{@bR M̲/˓,^ fX&aN̮=\+V`qrڟH*idHm5 `0c.~yM*a[s;HK/}HcؚLς泬Ӵ{Oy~CcA:DF5iٝ`k/p=l׺U|4~iddt㊫*XhCפz"ІRIa EJTKm: 64PV4 Y1gp+6v_M }ޝv1$ ]_e= D=hK^k*q4Ĺ}JǞ}ׄD""v1s`pY(@bC)\P4XPt3χvj_#yf>;I)#xP(& ՑSQ!wWUIYw]n"UX.]i "s}K$3 KYv{;G+t7=ht8eJRXRw?2fdpKx%^e/l:e- ].b~0ɯEpNM~2n9x 3ԄguM/PE@Y|CU~uJl. DjH? gphQ^k>~5!Ln,kOlQA^@|1a؜4=gjFd: }Ǫf6: {]lڂ2l KTt և+c=M*+"tn&Ae&/v\ y5QE:Q˯x5 ڣL&NM5^Zג{}ȥZ"^c6g⢒:abH2><](9RM5}2{y0Bu#u}V'* QYidBUhC$XL0"X{L6^-U5QG|~r\c* d LRJvtA- q/1L?끡:(~Ws!ڂ\9& cXiۮ8+ɷ<@hlW9™Q!IeU0fXgџ_koˀ`okCPEi6H# &-b-x%2&z[؍  n"\HsqOka Ip#BNjo[ S4\86ׯ0m@5y~ ɮq'I1旻LO`wcoKʆf`0d *y8ٵ/Y1$t^!jLM(+bVYȅ|Ђ4 h|R\T[Ԡ$Nz>{d &]1|^"W%e2O&Ҩ澦f}XSMI_ S2U S@ Rxa#' Q?j¦PAQ\Kw/8U- zy'QDhj7rr^; 뉤$hk}<#X~c0B(0"RU& E| |R8Q-Qoc^LT[vG̗5*^b&=8a4fTT#yPO4Fy#WR> 2Pg7?nVp_f;T݌0a{If#BG -+b5^,ylT̋YtxY(#'|l!Kk ?QIJ]Kx]5j F' Ҁ+Ag't,;0=S&1N?E{8"3wnY`gkuvm1 Gz{D;A (V;aJ-c-3yɫ Nx" o&B43B Y*Y,G} &TH&#`>!aC?{I?áE< ۲ 7M 2znOעÖa+mת(De? G,a9x 3SV:.?K*4J@l1oClݭ,+pGhy#!Ugp|pAOANj0p6!lR8ӓlv}ˈnԘieT_$4bC3#:H4  VRLID 5D&͘900[`Ya*fzn*]<(v_iv9xJ읜UoJ~ʋ#W}1d<&iԀ/<(g c5;OuQ&wSc>"?uAOݽ]"YSq1]^LqJh#Q^!I~I.1kmP@Nu jG'V,6T-9E>?P@(n,\ Or HވIS:G`l ;):c".fʳI9F(hCT6}ٮ~(H˂ލiyݴn&4P;̏ lq:ਡ]LR1sS[l^?i֔ %toB{|* giu s2aI3;-Ԝ/9oV؄HH (<7I+DO3E:Էv] ?/@ @rKV|ՎHq#Y 60G5Po/9mʵV~*Ϡʠ =F?%Yed.|&"+]@hTzc3w4Z&g{Qu0bwlPZ}M}Q2i5?A\O=mVŝ\8W+29 =/V-'EDE@.]><˄_TBE❏[=ਯVBqYm-jvfА\2)B²gB̑Cޗ5 ٰP=X͛oL.&4~8#4سUU|hTy۩XЃӨ@FFra rd;sU5@ʿ[0$y(Pд`pKGLEg |8d>vo2Ors2D:)K&wZG>v@9Qj=PejŮo Qyw]}p,cܥ[|O\Afk/HO,8{d6n4 /z57:&"Nv< H$aȀ37]Eb[ێ-J wâie8Þ+Z]EJl2"`B:C-be.)7@h ]K{2kBϤ7sE|.B6lHOYc٧S/jFoKpCmvVsEi  ndy z#x 1vyNWD#;JڀbXayEC/T%=C9C)Z<'I +5S͉V1L!|U^ 㚇1H Py6ӿj$%܏ei,# Ɣ J~%$ .u,946=C2Uk^'S=.XB!2<ܰ{EMb)]ف=(O0eCzr.'79%j%PRAsIL#T1cБ/d 6ggT|N֋me2ۛTXG5XT** )¡$&ҬԨثe*fR[:*{W NpuhvS;&>5)zg>iZz%D"ZjPK['dq?zSB9=F;;1H E/1ppbN:^!kd s%)q?Jgy&L5h/'`XE;TNJEy<⺛lw 䍦{vo:7ix+_a1tm[2&צ8H ?lޤ&55LjM&Q Ń,{44D ijz$-{c%tK,nI0rgZ9!dAD8! fz˖1=DHNy*|-Х8/4cvS&[w @b?'CC= *A|P"GZM7A.*E{t~0oyO.B]ZͥG LpiֿY\P[z6mz70J[OZtg^ʌ4Pʻ>o5@Ni 2yW$$\5c1^p+@t2GPṮQU<'Mv>CtRɰA$Lt[/t- `i_> ֥~@z;G/syeRn_yG9wq-(T8Rp9t^Am" ]J*G[T-9O=;-K7#" Akd7,TL.!lR#-϶_f+^.HRQ ^&N9gvK*h @EQ3&aF6G~0>Hμ#Gl? &ƜzJZG-?UTa# ꮟ&nk}(Ջb-`Ui׆KV.K+DJ2 t6QFĎ@-w4w'Ԡ.NE٨}E`GWS|Xf#ק~'wt>s&m% )":;D;5qDj=`>\**ag,/ B&rƵn(:,TiL%)&}f0u懡D"WI{D#BkP9(5E^-~?/_ZEk˱텚Ep6?\HX<۲8qh;Ќ@׿SYnWL xa3lOum2z+Zc VA`[ 52]sW#GC(Ԁ{(1Lc[ɉ!H }m"WXYXMB!70w༈О'#y^<54wn8"|i6-練GXOעJzP!yz=7f︶G*Ĩx$YT*^ZÑKfޯoV /po.HYjeω/2/Vy#F,T{њtjOU`ă۫/(ʹ;=ƨ<̳SJlh8G >ZMK7y'J ^m_ОyQMdz<5\4pM8vZ-ADRDe"apK;_{DMgďƨ6ZisiUWQN+I38iF ĸRpm62=8M,!-,`[„z_8$?OesAeUU(˰ tr{HKYK8o4r{\|@ܶ(Nx/꽷'y+P鷧"_$:]+~3gq0#=O9HE(FKFOIϓ28 vА0Rþ L3ev)J6S!Nw#*vRBUbg65$a' AW* lj0lZP{˿)"܀d sirͲM~tP.i'єdjxrጱ5ܼ\N93?Vڭ.A[ oM\) {[-#LE=NfڸˈYF- |yMih2}V_iofVab!u~@?_,%)T*=|Pӎꭽ]D*aPzF9ݟㅲ 4͐>rC 3C]&r ƵLOnEgE%/ ݄-p[h-AQ  2Arv:ݼXh6/NC=ҟC UE%&`u){ӷ?xѾS;qQ@n3VD4SpN }ɾVF2&AAqѯ!W u {GD n*}p ξئXu<^Hk`B7]$ʫQMfƖ)JeyTCf P +"gob%7g$T{_] 9 ы[!i!"PD6i0)"[9XK rCR` "bVˏQOO:eJEG^km\)w}E%P^yBz~WSR_#Y@7glBStE]U X2{NƓXtF1dT#-ܻ+6>4;q36FL۩3^Bԩ}2g} (G1Tep"݋}a35줩w_`ذmxcGX| .1D0XN Oq*lTD8`J4{u2NpUfcu"ݙ^&]p4jE'G[#I=Fg뗨שs 7QdϽ.\Lq6NLCai#ݹ*ޞ99 n]<$ʻ2RW{ ,0.WOۜVlN_`+Gj1 x.A{63dt&3|_xF j+@'8o0&HY!/jX,'xwѸtjܔ_%f@,_%_?["V1$+uu3E)b[H9?y$[G1nWHN˕g#O. =)(-@ U#M=|ǧfr )ЗVqw*ܴsѺ5W"]P!4IG؆PvۮD?3o-a]~(O3[Ȣkbޖ/RV]eNmP WIfR'vۃp#!\r{.@z&(_k/dINX'W7X˜o2kȵVJi RXiRphe$ңt!Y'(Dצ >1rQrM&-̌e-`b0=XQBn;d2lM܃'qw 6US"/H{}$f3z;Hb20꿩j&P95g3 0E$5D&46iZ;6DUtsR+%,ӑ'33g[j\SYgkq2ZMZuN4?EkdT5"u*fdIJ~Ԛe.Xsvk}`IZaa4⦞YuLc"'rp?osJ^@R}eduK!?v=R^ɲQN2=ɰS4<η1OR ov.zF@/n}X-9 'ay7ܵyQ!hm&‹䤚l5n]tбסdt혔=A.aMNC{o<-9 F=-pVvwc&F䋸27쎁'>O#n'A;2IG`OV ?8WvICd§-MHb6 H]4PᑐhW(2yorqG<؎Sݽ:=X7񚋃:_eZ8hN#,u4J΍jU/c?v9 s3[A!fb?[9)0+&/Ï#YaqqEIv6ST ]Mra7f94R ٜ\۪f7޺J9 QjCPҖTrz1vb71P=12Up2 [ۦs69L~vbK@/XGTkv0ATNZt!/fO\28p4u؁˒O]u.\/xm\˽X'?ds-_DlQA_I1tvFv3x,_ױ>|þ*^z &Y!ENxd.}߳@"4z5gvƒzNMh0O9\42EF)xߕZENc]q1צR f;@ &Fˀ^9KŅ?H̷IC.vÜ6P 4$~]GgQOv<&mI$jW^,&;[O` +gS 0q,>‡ GXM ͮ K;񪸐ζ4g*ؼSXD<rT8g ӏY8sz{^(R XCvVҧZ_,#!<g0y|anh6$6NZprfY{,XNR錐0ZM>C :I.ļ&:roq>M-ͧSYR>vluSXbbdbkp؀m2$+tzg+EgX@O*/1$/l{hQr%,5nẉj|2BviSvVaPQEK/l`U56#Q{d(tCq^N87Of"̎nA_4IY3z݇.wl̸a0S"s!$ 38Sxb`Y,\у@pi.Q CP)łǍݒ寴BNbrOH$UuUj+%G1Ӯ\"˜nY-=}s광 [ X|no]cf"MF %) ybTH30@w>S39Mٛ5mG0"Ʀ`VHݭ{}j!ӖϦ܁RIYJ /fɛHlU,? 3cgjѷf- cwkX vluHr,?ԜTkmt;Cص9BHII]sNZ}0bD{N 9!G|?sxgn%cއݚqW4-MHziO4 < .>&1%h2d~-8% Pء'˨2`c8u{e~j }ӿ>HGQW61 ICc_B\W)ٛrl1#\I1&4VF  3%Ɠ2ڕVPTgEfaŎJO_32*qk,0Hڳ?- #hI\:.!\r6F*)th'):AOXܑpG?5ļ_0 b۬_XXWQ߱iܶV!ʲ{/AU8C^4.5.4H.kL*(NbK`k_u11 -ӲsOË"р>פDԖ ļ(F?Ε =CUC7_|AǨtԟX_f*e &e& Zd[F)?d}* zpq/,o=f,0zH!+']a]( Zc7BNVݦ{ElŽ3vL\beeP`ry7+ $+ PKuIQr!x4|moP%$M}tZl>/d݊gז]`r2Ih>>,3I8P1<..9E Ջ}zC9^` ]KKVvn.pp{p! $8?(ǩ?]Lk|7&U#O =5g䑐vh79:m.]T^5o%mgܜ>t?)JE#;e,gA`?% }6mVt[+Vc r9F$VVeސ%DGAH22cpW;TW}1 DXypax ZNo9$DDf>zY!fR4͐4yޏ4H YB?fl=6(D~OkR,t+:k ,Q=CAAkD-# PL iݪ4LcV28JCI=emV5rY3k[5'.ԐJҳ&AT.DwЇ)g݇Xux' /zܱ/l{ pа,h0 $A:M}P)0vd6%sZ])Q'ks4؎8J ItÓ6jTہSW^6;I&L*qXHE?׷M2Qx]X)[bHkbQ9pvJC&bdi <<x(ձC1fH|`LCF?S;6(noZn/4EIZ6_]hTeJG8JTw.@'QX*f%Hh5՘dB$̐?D\'als3NJŻ/+0'^`dq:3G/fR[HBsnGie['P^̧>`g*d/vΎ*PẀqn} pή(֭"x[_@ɃM8u=OўLiY%b_䨵KE}B:-QAr͒*EF5}1rm =pB/]ՂT{_z[pNk y 2*OqC䲇,Z|xGch-K0bY<0~_TK,<%T @n;U %Hよq8Y+M+W20L>n_ ڇ$x\\2jHk%Vc<5C&mq/߽s(T2lPM.t FT|_v#f8M%:)O(}ĎTSK%Er9Ծم"@ 'QB=n!!o`D:L>2z}9ʋqsI28ʩCl}lal$Y8pفO]mQRi3YFAq;kGh3t]^Nl %;Ǖe{j=ǓPBO_7T2F T5ঘ6Iga$Ѡv ؖg7_g-˫$P-ЋMνH@\7tRo&AAJ G'[ѽ huXsD(rt\l^Ei0J5 KvE8Yo$;rGDn BdDG)F 髽*8R:%x"Q;;,a7 En;_@9U|ERO[?_Qu+IXz% Gete>$g1g=w}:,LV4nXaQ]4ơu'1'9%L# H-;uz] ]{z?Ixe 0 Ù~ݺ'=Რ;3.mJagFJ$%nլNOipPDxOF Y\`}%Nx^öI@Z\#[k,i`C3څ|():wV5*D١9f#EcJwIl?WY})G.5xAk@@uyeC DCoo"KnE[OStM`(0^5)ѸG (KxGwmE`COzѓw`UϩVN #t(Q Ğ>9tna% G̢{-+rɠ|<nn(n4D$_=KLS?V!wlcGFp?U.Sz_}.,;{LVLkFm˞p#׿\]efzay2x `4Rկyx.$:_=9Tg؝hoΡGJI]: >6 p i;9ώCU29 s|S@.EJS?Q0}]wW.OwӐMUfXpµO l]1w| +JC.:M ,˾RfSsAUPk;R|cȍ0"`g/F#Z=Oqԕ ŷ猌 ɔ@&=4<\dwa P$9A dK,ZÏFGg(^y 9=E\KT7ݦ"| K>n9%7՗C9B=G#_#!t8qs-HhY"cq?'ԛ\]Nk dPӮ_({OC 'ʠ>C&UD&}c ՠS^f#=#k5EC9r F, ^˛GœmcS:ގC-MI` '~u?\f1Sx%wCϧ%-yL/^% G:!;Aê?bEFh9Fe-þLuCD3{5AjE?5@PCB9j(q,Z' 5/P&!u)O/xlY'_%=sG35aoQ=,Jp3_@HHs2Gb;%OvEJݞ$ȥx>IQ,=m;9gIh>\r{viBAXu2H^'f" [3)nF<ܭϝ l~?7?WPrrwj,Bi3Zim%ԡỏ;.3}<9`<~Z:W Јt2aSfhybnЉ{ %Z3~%g9ԑ#`c(a켿@D'a퀟"QL[!1ۧ넫-bOXb*xLY,{e ݥ_f>d(ڨ^w6:iy ]!0B/yIbnF{v\hCbQ9_-qRď)NL F^'Q~uZb}XtRz(n}Y湷Ye#i3LDlx ׁz8p6SMhJbzJy q˦Gg*!dl$ow'wPKc%J],^+xx(>l8N'>>H*bB5,,7{ Ni/мPB kM )mm .pzN>6fe?Kd@^&ܞ kv71t SwfI G# SpCj":zKNo:rNcfb!ثJ֓R+?q@+X ZĻ: Q\>>›Z(Qӷ zc/?qRON4gGQG3TX(tK!{jQKˏNBը~9]," qSB rXF:͌ݶkƃk@&Rjul1yO&P罨&δdJ߰Y[qL2]N:s獭,0$bK Dx2ۧ{߭#u7dp$*zVS3F~^Xqg"\A>g(1r#ܼo%/#6.8VGl9iW$% 3n]*fEE#ۋ&n%gF xY6OmA2Ǽ+瑷qܛ7&`}X7S· Rﹲ'|x&$5yDʼnfas쟀,Lc:B3M*HxS ${NR/9" }AMoRՋ4Yy++ &^t.|IÍ<ٹb tZp\ Q"?xP*._vXBhhmY$ dcl{ e y{>g\~6}g^Ԁ $(@ϥsQ^o2lIZ3 mzVEkY51_eέoA0g /5f+E7dO@K*p05$~ǁQ$We$ #̈́y,D0ت =ح  ލ@Z~lݳvܲ7k@:u:8,H`r uZ~f8m4VMSw&@c{b۞_l۶m۶db۶mۘ`?^lW}4f1[~+<|:YV3bNjxv`fR|i.CZ %I&5cޡ]W4Ī'B&fF '&-]\ ޣk7*RUp_)EQVW ͅN2#pӊ%find\ym&%Қx-x6J~+$:Q!Hd^?rk# fdJ:}! Н1-`$޶dHZNm F0h$)ekO|z5KfeUgONU^g RaVl,\CjN4=NPpx(U9V&Wt:S*0ȵB˘A{ήIGȁ&+uZNp'Lx8 ?=6Qbdד;W 5XiF淊M' 97nMpifB z}g4y?wG*-S'dlkA#8U@#a$$*:}D/{|Y㶶LNoPz҂4fSCos6a1.L4phGi~"0'^ =pcq 9QMӶ},g+O6Ơ4} N>6oչ?=ޒWV$׻&Cc`Hilr\ɋL>l}9? CeyY08Q2..IA)h<-?k0P6_edlX orFz"J0~8o1p=a |* /'MxN,>:e>( u!1wV)鳫6JΗKe#k:H:֘ ڴ.ze.wW͈87 ӴPxnyZg-K\YcLVda~@ Ȓ&GBɾɩDF1USyowqR+PS|r3Ea׆7^Sm5-hGI|}[N#sⳔ H pY9z?s8^ 9_׵O#O vXHD8!X]0Y'b!W~(κgb|)Ua?C0F!uo̮maA8}&ʵ7\[OG= "!&`nJ$~j8>)[v葢L}XqzԖ`Zd$eLjR(W>WE.*w7w?O@ yc=mz"DIZ&He#z aX E#*gtBnR!yQ\_ez[WB%x?8GQQO5LZ^?~tPȻ9*;wrm?k֐k:/ ʕiWkӮ{a~j\&)OJT3kHp]We k PRj /S듼lQ*'6p\ <1z FA*FY/tia &;*TU]#Xی>7%&$/!ksz~\^3-X^F;L":hA#4[R⃔He!x- ~TReӉF6* {[Qf{N75V+I6kBSqw' L:&dUCh%l q/-HۅؾvW^ Emg`kR[+*=gMe O3+_9/HQP7ZۣF$0*U]dA9&+OEEZ(]qґņ Hb ^,8ATe0"v>{Z?ny'|:y=D`sU W'dP߸k y9B+9tz@=9_ˑCSwwq-1KI9Zo=KR̢ ?>nŋ*gFTí׈P2• Vgjk+?qo >Ji k \=eJ'@% k/`pF=0xk3=cerN;ȦAXًKH/LaU#$NH׾k؟fG5Tn>$Fz1A{C_ѾY'x)N~J*0ueB?=|2n!zv^{Iwfjq$c/>f)`*P.ZldkYB{׼03n&Ný(6M B=`0,9b5؃86yNzζjCa$`3^| QrϞ9<( Fa%m:y7lnzĎD r+WֆHm]*,EaFۂXƶgX xΏ)rE)Q=`Iĥ&vQu&?RI<Ŗ%.,ڠG2m%Mzlo!8yx|63o*JfϨ7 Dy*֏J m3YW T!&ʷb0J±S?*hj|E6_!WS1ǃrc}d7<l׊?'x" i+J7EDэ,㞎MY[,I:En{ m=cq'`Gf۪>5YR;l<^s5Ri԰S9OcNvӮXyt8fjS؋3(fs͆BA Zd;_0.ˌW:@$m\L=D|@sV x!yIc NP pni9ˈ+oQURBW0s`f9[jNbW*FjzL6333ϳ^8Õ.0”">Xؓ1L~AGk޻>O~gtZ t}+4u@><yEYYZOF&tB$]vWޣ ڟهΝAoE': ɍ5RK gƣ[DO1`s3>h^.x]gzkyprR|hKz_R bx9n!jM~6V#F~6i"}HGױ[>Ʀ55hk0C64XgA}*\<[W-#BHd 5h}mi AqH;_]`tV(g|p[ >hتAsJ'haR1a:6nG8#\~)Xh-'cBhM ?!C ,)8" -$!лNpq6 Ea'PǾYLW!zD_/amU1+yfe}P9S;=M DX>yg:MmYk9\'eA>YDԊOc7hed Ջb}90 i5y|rQ`yq2(ŕHQXGn}z Iǹ#tKɾa쫽'|y T|1]s$I&C]ӿq,ap>2 0WqvT(vh"𪁲6gXjo+CH_:gOp"ERX[.`,^>k6K?]C(]4-ƥ|̘y(9?%hמ4qw0'vTj=ƒ}%]9_=J m2[80x(T n N[}`Ye*ӕYdR4sJ?(+?E 0*uK9̨AMwxබ:-VxT^=x=u',,t@bD`Xk,GLm al sRb0{ 8mH$K l']Yj''ZwǔT l&5{ۀt=2X24cĪBl+wFIL,I: 3W/iZY"TʸgN:K(wB!,wF\o Rd%y!5gwNԨ^sd6nOѝtY9(EgG$B(l 9Ƙ!g)3#SXV^Lq_0VzEsxpNP>[ 9 G.k2#e,ptrv? iafG=b]猐A4ƀS,f!5n|S.UܰmFQinC mȵ͎0s%b%vO*\P < |+%dAG:0s}LVY9TI WG^j7x5=K8\LBmQͲ n` aͥUGEx`6= .J ]p5C`C+1[L72*DrI3=Yzu|R)7Q3!@rTwvFȂΨqu[,J\>'fTm qNx/I JrD2mr(z GC1Ȗw2cz\[r?ς5mM0YJ3Y-<+=P$B PUczM*AMQz(U ]bJH5,+W}V~!7ê $N؀ϪÏ6M:g֞k` )ܚ[z+ڪK'(qA=^7 `] 3:!Y۸v,PbRJ*`sdx>[6LT-Avu~)aCޝjԌc  T 7<ԛ: A .ӑB' t kn-DlsqL B1rgDcJ׍G6ߤwKmFk,`4Okh֭ZeMb1u5U|EStwYϬ(M tJ0wkN5dK?%Xn@:dZj)wٸAd;кCI9>!COA}4]:[/xbf[L=Ec1ⳅ9.-j R[Ҁs8߸! v0<@z"Sk8ȷLe^4{{#;EAҝ uˌ2g-Z|"6iɠђ"ҝHq̘?>e/ W;)rn|hwsٜ) kVw87SƆ!^?m_Q{55KvYOl ?fb3Φ, !N®pQ9Ŧb%z )A ^o48>̈́7+b8Fu&sdXȏ"DYIp‡,$&z00ĤZqwő] vͼ,6bL^]QzyArQ n5 rv))e:Qe1H!®caonIZl"̰ VsֿJ=H#Z2Iuu| SKBd/MMKt됔&}Ԏ9BFl_6lB'e1դKqW/@ tEs}) %h%+v9 N/*ۼa->&M3 > {BPȊA0+^kITbX&{ԭ,ov#J Vꬿ޴J:aP-[h϶du]H|!rtQjC}=KFK~h"DxqÝJU y//{>F rfht2XM]ހ<-vE$r2:"뫠*LJfWpzU蠤çKX'܇pj0&0 /<";g,h8U+L*v2lk+;Ci˄9udNH96=oQ>?}w1ZCj$`i Ms>H?Q$62+sk˗ŖrrA7uǍ\U_‰Yk/ӎ*xO%G9v/D!̂xNzz7#)tVq7=?%~2!DoZp^~S6&20ST]ٞz%QDPHcM/xlִW7&@YkΉ(pYk]L.+\&][W~TRK~2ump@qDxi RbUQWGAA(堸.?OegmnZhu͆9};@OS{bo_͹?m9Ƙri97ˊ'#lOǫsn*ߕieJU4G? .D@:v_a0*2B-%V9dA. tv>a}ffSg4g~XOkuNE_ک,U>-O-Nu.\D]cb}(Ϥ},Nð+|`1Va|jciH(M&MSk1Stn==(ՠ,Nv18"05$$~^'(w`;^<ُ}45ЅV cͼ!N^IÑd5 eNOPwaq\BcpL U0,uC\}`DESR: jvx.5j0NשJcVgYM^;YۓoE_RhCD ?QyYqb_ uILݮ?d'Xx3}%Ysw_FҌ0AJ4`+v8=d i&en0W9ٹۑVi+ݲv,!Wג;-m¹ S ᖯ7.~׿& ?O?~xt0#JkYF2qWV O^oEm@ә-vGQPubZȚ3Q&cVp+kb'\Otc'Ӭ žZaM9LC%F8RUآ`il-#clCʗ/f_%$uCR-Kx2|fN)ks/207 %o˧ʖ $M?,!Iw*@@Uj&aQ=S]o)ނ ¶OzCj^Xݎ~9zzf#`>*#Ѓ_ν(G;^ 1P ATDHʡ' ;FP$(W|$=1Pʯ$Pfbɹ"\wyԖ/MLkM:n4ez9ق{-TaëXwVJM̈dL}>G̔[{~2jM ݢS tcTD!d4+ժs<Wdw0Lٗ^ i@Iq?*C w`"Uef$ RX6$P3J&6sՃ$Vժ'jlNTsq|pr-#rƮun_n<[Hpzr|qhAa}29|U>Cв(0o_90[ȔG1p*Pꯟv$xh|(ctɨ*x>D]ɓ\ƣXjL[UJ(#3zhn '3k%VzZ4`ɺVl"Jr 4Y^qqqu_Zj|0T`M:K3!,P2hp##jВNe鮳輋J7rsUH?eg)#GT kCf=lbէw~V\e4N Sv$L֢^-ZN lSF\4>ǍcԙJÞpР I=L;'KZv=t=l“, pw-6im T@;l498 ( p?VQh+'v~ds\8:U8rQSb3fE*+ cA:D u+NCVW>#ӱsDYeK_g%'hv62'aŘ.OΈSuMH 06R ={,m:?kB;c?!E)|!Ǯ]9d+V-ܵhS̏˹ӳf1(i夃>d*ȏ2 Z B>"l7ï[ovjRy?~U]*M'V/MX3b.۸9љ" B3u5AsvX!R7U4yR j*ڭ L ` !*@ 9FGHU~f1jy#Ab.k Jqȴ l8,tFD2cLTE=y6p`~#mR?0Z;Bz-QHETJ*ɉ͒iƲ4d~k"p|@{s1 xR ʚ%Ys`e(!;D8AC= \d%o< 671u_4ubJƑ*W4 u?^A~}@n 48"B*D&oXD k7JY5Ja#f".HFޠ& YB ޼6C%Ifi?md%SFTc*B@AAA_XI Qp]nwJZOg1+&1.AemT2w4N]52ۈ Z/c]!IfɅ-@ liNUҥ#G=6u֦ <Qㆼ8qɩx<BN}\i c@WǘB$PAӗsH!bbm@'֙bl#Npu1ܘ=Dt&<퇶4wY>/4Mž)߂祘$Q\Vz4^^Af-J@Enw/]V5okTv+rqfJr]4.(qZu:wk -o݀Z0􏎫8A\HrG)<3<̍J[0]*R"(|;~7ρ@e`͗YG$[%{i؅Lmht"ܬզ49 M,ɸ3dF#J!j[=<"DW~=rhΑ3l$'DOc;иJQ& >ym#OYwt$KȯGC;io}-Ry`uzf'ϚnJ AHHa{^y1|xx ^R'dj!ZTt}li:P(OϰWL/5w?xcUϣ$̞*"ٖok}_eC|8D̼JY\|ˤݩѸșQi^$l+Vڜ@apo=%$8Ӓ{M+ڡȥnսB`&7?GƊwءdAm}Zt/sDɥxLaTS]xbб =QH!%`xo#kGg;G+zIendstream endobj 4 0 obj<>endobj 5 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 6 0 obj<>stream xc@/회m{2&^٭lM5a&]mdO}c(ITEL FV&>ЙQ IDsōA@>& 4Xyyy(?u=,,AuMZzz#0Χ=upڃ>!U@0e4R )=jbke 2ڻi΀O??0}:!08M>Հ@X G`p6}7u5ǁOg?A>%>y`J. Sg+GӪ 4c p04s0u'X|rAV.0̬\m=?m9:[ W+{ 0v6||b_O@.@[s&VOOVtfs:+A4 f393*3NJ?P_q{kdiwſ_ux3rٸy\<nV? g+g, 7u0gUAf? +'Wgl,\e>Gv-4E8_4a{ZJ'ˊ(k-aaSbSĵ ' zf#kaGL.->|dyhGYahA&U]O`` ]-S;Gu&yNrvҴ5A43;~aFN>ln~q" - |or*\+d<ɦ)f F?iTUp?:C# #%A! bd#E/ d.t9}he)eLP}[-kV{eKARhq%Rˊ~d!20VyײU*KG(K_gLW~{vfxw ыv+\52 VO{'3O3$z8g89VW]s񠟖aSh20?|]Gkn)%G0QpN-Q|:Ӝ-?,+hi!!;sX>rIy % eo#.>=BFl&f73T-~ SZT [cQ;uF⒑z:EB.1#>+hep֪/20q!eXI@DWftZDx:@)n:ݽDP/cϺM]+8AT48%㑠\ļ hlBz 3YACʃ K$y2_qD߯' CYGۍ H\ntwqNK+qM(# 00LKtpǕ_+)脆Fh%y2u#/*f.oK8P>AZ[~|y|.m q3`at Ӟ~HlbGȜnC ݥMG%cHS[OApH&h([dg>%̓ԇ*p1G3u7|foi"eS};T:GzQJ̓MYaךh&Ed8 M)#ȋbՇ-fYhQh8/ڭt=cIsygdxGj}Ep݀R~h'_iC#7+ȪT*fueE!ʣ&cAh^5(.P)1}<ܯmɋg]]  C*ɽL'ԥi~nq:?4 ԘmIb"R- 2=QܨnNT -p;KF(D&a>8~~Yl3Xʧ=ϜtOG@iZ;g~C= s5ؕ͌ Fp):.ju 8p,c[%iOy Z,hf^ai|ܤh`%{%ZAf#d+Qjk!d3sAڐmk_z a[йթ( Y;V 㽼]!S$P]_/6p8{/߇\ E P= T#`=BCK"}{ԫIv[vxPOkD>L$zLi{Tt6,!*R$H&o;j07#{| 9Xskp.} Ǹr2Y lHRoϵX`uA7Ea-^Z(ݐ[v5 & ݕ%$, ) 6lۗj(t׋Y='Pz^ybFWD $'`hJz]d>ʱ\# P8Q7t% /R*Ħ7\G=B$))*큭d~_݇H+kACgG"$:􍳸r{2P@mHrۗYYmKk,N/z|nb,kA3k@1htSWc1B֛n+VlK<`CGVמ1«1*-PDcT8x 㖱$ܘPJ:nc{.ӐK}̹>ԏs@Kz FìvAu.2y"oOp٭1qi7lo2hD望a6tSa0H̜r)%7w®}椮L=]ѥ&8vp(v9$Rz.i&N6 06WצTq խCxu@6aŌk$nT,A~B d:1X7/UA0 _F7#^Ap`f^W/y+S PQ >#cc$O Qj4¡'4/Q9fY= /KSO귄Q&Dd`QިաnrwD:%V Xk,˴R (E^V;#{=9\"FB谠kdb!|KY^R$˗H XTj\y'/  %]pqntdyOU`y{KP)n4EOS[VOmoFk(Na86|-LR %H)zOP Rj3[YJ,^e50;:{yU)0h,cYVҼxuZ@Zī~ %"ݰҾj$uZm]Dì"}`MN?YJ0#<փ2^&AV,0j6'iw, =m;~8οm|@> ѵz2JiA;J>Äz2?z;Cmj<#uVi!AM C!'^Kۍ+y`o0p76V {p@N|DNZte|0 ؓ'ȱ#kj 9[gW|oWMMlKfÂB&}]ϱ ̀ Lz2ogB )k8ʮ:U3 ӯrt&mh>q>ڤjqJ5/X.NZDv2Lթ] 2r`^ר,yxȟ f(jRDbZl w9#4M@'3At\_CV'R`\c{ Zka$RpL\xyʢبLF aUvmhSFk@O ptq4Uxs=DcHm$ȜQ)fx Ae)^:mZE45'S;H3)T^gV5xt]m!"B5hII#kBVY:,6&_fcWšx8r+,5\D3W7\fQJ?s%C8jv~'DnK n6L[%H 2*&Bif%+BWt2Sc AU ,j[0j?šj0K(+;( >ԈFK4Mvtm2%mfF9lpH Q>N)q >ip _g2a_:Zlj| 58MaϊÒ/E )x2N8Ma,}F2܁JxRm>yāo}f;:nP/U|}dٯ .+ߴSHY =L;Z%>/eJG(@'!V] )/00Un3"Pxl.3$yމg ]d&U 4]J+/oAMq9E-o|\Ocr/4 ?@X` ڃ7IT)}/L!WF1|rLMf:LZJOֹ4TУr9!1yme|&Mmĵsbg=jTLeu+]f@b,xmQ_W;^=I8Yg+e6a\eC;%4V@݌4/G>U{m+'tCS]`&ڤ&Ym5zlړL(U)!`N)Bo/1ū{EUݓS8轢] >=yIgvdck$ EH ,^ՆJ4QpK/Wt|э&jOi(I[%yhBVV{Q[>8-EBxLR 87f#$d xqmRj~7l~I߅tceoT8hC[ڌu8d%0_tXU~c 0P8Ǒ^Ͼf#nA88JM: y6P-3N 6#Sk7=eRSPQ| %݊l;Ru3>ژBp/|jY;OT]៮ T!S`5#ʺUH -h)#ۓ.3l?s/!M.*2,RO,n_zQ ',pIA&yA5o&%M`4\׈Z27썹sF(Ԩz֮->M֥C9Z""@qD}k##{=8 Y]qAnQc3D3?Zjhdfv|Q)'lH<'!hVVJIv}%iޏwd\IFJ3ש%)L-W<%|cfDQQɐAaw28~;DOC"lpz ϷV[^C :mLmҩlgL+,G s3P_ [8ԛ c&%\"wnWw}y<-%[.G|-.3T)VyӉdF #Kgw6z1*0>ҵ85QB4 "G5[[?mԀ:tԝ/u"sULm/G/7 Q{yBMJKY^8ybX6Bv,켽`Ki` wAmhSDaqCy&OO| '3j ˺& y9ۜrbyYavlg*Љ  r$,/qXc+' n?:TDEar@0=7_αwDWANgn-6 o#"oG坅glqhz%Ӻ'76fgx8籧/G%JcZX('pAWb)d8~O4kO=Ф;7,]ebv@o Q3_{h)K(fTD{SC6D 4-Ob:6|sQ<):4 [ #mү#67 :PqA \rPV[tD`CϼҦ0.vMS)]m gwjqnIF &&Ľ= E֐fX0kK儓9fT⫇>Yj xkl]Y2 olv+f tAhԉfF4>U3Ge\?7l{]Ǜg4*6Ml [@_ˍ6 0[*&쟗+;ETZ/>:u:AϺW Z;--V̈7jݰ[`Cy\qu9&x~{@:(łZvs'vnaur#~vESqu߇[R!|>7pn3vza< dg(I841:GY~#ˑ>rJUުZ>5n%vѹr+D:jZz*PY14H7xi}U֙4¼mQyn nllC:IsC/@3[}{]9b&}@LJ26/2||XY k-OLlJbM玆Q=Ӂ<.,=pƩ1f¾tNArؔT67g 4uFF_Z9#]IݬoAC5)ȗ 8s[?~:W범 M$0;Ny}UkZNg NЍ߮zImuRZ6bh3j{_D+ 19vhŀnѽ(@&bs.g7Y0$`uikbO>P{*QfϾf tڄ+clD1ܗT?C|{x%aZ9eTqWK@w ,}+*3.;ݚd.g}diX%GoσIN hY5@iuh,)C0YVv\ /^IӪ0 DŽے֪.CwU&{Oݪ Ͱ|,@ɊP4uy做N<"W_?`dۤg8Hс16#f%_@|R@)@3~$&:7(C凄WQ4s#썏 $1^`@c/)z@Xg\Im!9LEڂ^ 1DCZ|<7#32H%wW~G__J~7$[lr?lEeؿhA3{cz\>~Q*p,L6 F=p(ìʁ Z ~8xIte~8 ~KSre҉[5u;'rVz0Ps˯eF)WrkvzX(+]H ^!ewScjF&4X4ρ_t Hf pFlCL'?Y_Q7Ϟ45jf3cZ/7G.XGX:3g%?Ko]H{>`|_xĠHFdBk@sgXܚ$̈uoAIz>#g@o8*,- >35SK01> 7ύ qHmBe7ep;.nxa Ƌe&Hsd8< [A(h(dNwc>b䎛&Je܄C@KoQDa&.B=AH_ uWzfx,}UWUyZ#=l:B붢5/WuaX$vIh]!6]~D\^]*nszFlQVZ"ٌ§s?Rƅu.x8;H)T-YvCm)%d Š5,yףMJv5+I 7->M܅?)cԣNVC?_5E^ 6v|M.c'@ >`h kTd`M޹UCjDytjX%]LnGvʒkΡH*BfOlzUa _"HRWpmuvtG# Il,n["5Q<aQ#RT61o+ xާY`5>iPB*o1lnp:}3C(#?uMMhQ/;G -u^}׽h~1[unb fKmMt͉w B''.ԓ[$#i]]2E\ -ߢ<\umşYG<#jJ g/-!_d Ҙϸ@eY` _97ΚY@Vz<~:ljA;#νbIC | .hӖ?a6@9Y>ӏ4K{D{eގmOsr@U~D-;ajoUߋ s/^4Ѕ^/?M qF!iNgd,A ¯s :xAPv7Ka$iJg?R9 `M_} a)֢.t"o_M0لJd 6ZoܳDAryr"+s$f"#eKKs r^џkau}Ÿ |n-BN%-͡[ͯRoOo~Fpw TU˸a`*l5)P.)H+c?wHOǯ2|Ut;^}P#lUy`Ea_vأ{WsF$H0;q!yN 6? kG9w-x{sѯha'PWI9[. qĈڇ'}rq+W4{\{znsfE]LycYt3#+ i9MM}w[3xɤ8ck+ui$K{t`r}0/mi8!٢,اOFXg'TpǪwMmnP̘?@xkKqj@ekLލhocPIl `&K\a\XF L-˅w=ƴV&{rʭ؆8ϙs$՚Y1Tk5&;y@D>5n|%[E‹7aZ܎ؕQFJNyKIWypX-EAűҡj**h%BΥ5L"0:tlh$\A%IYٛ?+AyN$~$EUOnbx1-:_y"FWٸCY}K) 'J= u#WKd֗Tzt1{15j2IiaFH'+E\~dSI!;667oX?h-vQ1~mNy1H`KT8.~˯5 u=.DԩW#ʽlB$"b!΃B sLB, 0 oVkdYsy^L/!:1䯌A,,bp:(Fȃ.IX39fhTyi4A:d_V'kEy\8>[/>ȁoEn*=~~,j,7 IѢtZ5I ogçEY /) 7!8I1CY2!ßn3"Y@+9Hh Т˂o_NW׋*`Ч-͙W?i;$i;I Bb͍7[m؍rt %"~s'wp͔v|9ÀLvNUbhNw%+Gl)38r*m@evJ;׺si[ޚ $XW{fu;ߋO0 [-s?dԪՕɡ&U8>TRLh9Q|-*i'_~ntA/{`Q_#S.B.:ܖ83?JaÞ~ȴgBҵ+JJ"G-_9rʛJw6G ={ NCD<ӇQD$묕p4$yq#g?- ۀ8\wZ܆ HIR9Ts| P.ޮRR nvُ[/饨SGJ5J*d: dUYg]wu}ՈKw]K⽑^itzj--+eoj^<{Bhk~u>녻zhvMm@vV89jDŽa]]s0O&H٫b$&ɗ'v+/hr$pWOrko\ejb'ɜ no}`*)KÄ6zj԰?95FsB#~Ptvm4.[ņ؉9-tK8D,˶ 7`.=G2rma!S`c)JC1Kd>dKOp}R%@XTa8O, Ɖbe\9+BL_y,p<^Wp֬޼2P{xtI3/#T?J34necS-65t`lGÈ4ld,P5Jmώ!T3ע: G&&ru-9b?װʻS[6|QrPd+-,vTsQ?DiH<\c,nj wofWL9E/Fҥ(oza(m'G4`^Ѐ'NƱ?Ƿ2L{:I[aph9PO7NѨ4l'AdKd*|H}T?Q^Rv][oY|um^@?_Vzb%-B w;G"TЧ~ݨ҆sbF.G~aςSU8GPYp![& f219w~*AZ߬c Ĝ"}Ω 0˱k.E܀A۶A:ӿP]z)r&xm;1a p8k1E,K9soR! urTԼlY+Gpu_3}Jΐ0 [8v0uw^yot4f{~N񃩑\*A؞Koe<;17UNΞgalaӆ,Pw')⟻8`s-N .Oy&l W6AzDf0k3Tc@|3͡ǿ*4;R*tPnG-Yb:}s(W܊ʥǦeQlQ3|t?3"T"$yL0B7I"q۱S1`cB!*]y DZvr Q VDogH^PA.5D$"5{*𐬧9UQSUEm4_4s-XLW3'P3 }!؏x-[%PYjqf^!"P+m֎̭XjFM )ы @j6ōxOTQc Đg"p1X~>$ő{ߠrp*ْ__xƨvb+N:gaogNjϨ,Gɸ2jMhI#UhTEsmNaشzC˖4zG`l6 `]R!}%RT|=svy-ƠdžX46Iw%n$STMΓDD}ֻ_Ľ cB :hjMc=;[.? 䲔x|VOD<ߣ@(;|I0°mSR, $Y< WO}AnlPn C!d'z %Is%ICQM~ H4(q)Oy;˼"=,Q7:4F,fDz%clEC`$ͭje| Q"۾xFD嶾ez%xow)Aw/[MYB? gTww P=|.,ӹWy'#vqנyZڰŷEWy{׀.tu]5UqM?k'(.I^ew^d}QoSL$ $?NVFds-R"Zb:vEvsE᫆8$/K7o. c2M efՙ?j N];jfPGZzVξbexhS,Un6;=;Jj׊x7R&aLurW | hY2& 0>hE41/<@ÿ6gS\F˚5Rc0v(~ѽ@Xo,'|;!$."YrGA#x rs7*}m}S= 9ɢ|kK A`n )a*0&mU1WS |);yׁ"~b3GrQc.눣r']6͕قhkttz 9|z4:A%PRM$ǜFJ%?2o,zb5ps|{tP(Z[ 4 aRp'P S6i3nE]U,f BON=nk<yzv"E -'W;zل٬#s$S4ua0ۗWr"g.u>c֍uy |FB r3^5Jv܉bC5K} [1q-B\1RO%FưkwwRRSAOۑ.Wm}ȡe(9ݏTVS>A+S2Nm]>ˍL_-t>(">1 /%Nd{xu~m]LG;Wr%?gT5{a54wa@wYzU`N@ /3~;?o!˔ XC'Zκ9Qc8 +^SjF(uQIqs&L~ D:Ty )$!fG.uRJa]! 3[Lg `(U `| fT].(5>ĄH9oLҔ=zQ}ɾO+ -VK&ښbkl؁Ʒ}nyפ~5?-YEg11ϛB#8w?\7#;ӘˈۀQhGɘzMe4E} ~(\[(;>'Acy& irR"0U6ܱ ƒTu+^dƶM#ZX|-OJФSe Fidl.Iv#EnJAfS_u,úݫD”JDioi0'WÜe}ΊGm]f )`2;kp[U~L}I1m.J'И3Lxt a@}tTMڞӥ\MY4rw!|{mѪO ,%`{UDEZr27%Qoq\r(⁘"ͻL':PBึ(O(=WIF۳;uWThM sڏC:اHm%rF| =,B"[M>0t#,A*}Zڋ ~eՋFoFf?4(NcB%VLBg]Zu/$y>פDӟb.:T -N`'S8pvBn\kcs{m8DJw \;SREayXAfPi1`o>s (,_q[%i*y? /^q atwf ] @&NU5{^MT; _FSA8rKG,Vխk]@Oet0N[(Z~4.6F\=V9OP`NFq %z vD 9̩c,…իM -΍{IѢ(uz;TN+aFA{h:܏Ay0՗eJGKj3;+v~D~RAZd+1Ɛ'E lM,B7G4DN9G( hL'IaŞ>w 5vm:YlT]NX^&;~_^H<~8Epxł7\kC€W4!x!xyZ!0gYشuPt"-x.{e׼xҧEQżvvsȳSB^&وrnoQV92&{4P7tPJOzyF~QRXb wMR_=?JQpg#+t\_0^kg_j"n>ҵ9_b.RH7LeH `y񹘿1w-˸"SsؑO,0a'J2;ť-,8ӶK AyoPlw8l0aBMjF2 f\H@i/ke%&; #uֈ!}]PBsDef0AS<9[Z2!~ "'Iu1v(ms]=8mQ3n\`_-|ȑ8wJE±t$Y97*) p<ʿf8G>>55a7lRZb HFP䡥ʷT Y0ig)MG  }(zLNλEh{ fo5Z]wGysN9"Vuo}y(خN(K(Qԫ +GGK:”bm<,%RAh8iC_3In/ k}±٣yjfN aU jJ|nFoN̟FFKQHU1tya/AWU3dbm)Ie$7Y_ҧRB9V +2y(U(|`2>p$?V9%擒l;Qn_TE)ŹpA[iXlU_tj&vOcZud\w=%:ҥ D.涂~oqDzh2H5eӣav/p d~{&eua\|(>#SX:9)M{GR1Mњ=a>r.EQQ}_< Ŗ˝@.h̽9kkk9oإq%>#"=Ԯb2&4yCRץs:XO :^-4@wZݐAY&թm 7g*B Oq Ca;'Xo@Qa6:%C>0#{$`wdӆ%D?>x_ V* P.`ٮ"{|IZy}Ee3X۵O&<Ɨ8tSfotI.ROCaLğYB4>ShKwry/ PQ8FӨGA5cu m-c:\kUUpymoOuDՉLWCwN4(t͌-5YYqIě`Z\Q켳 ?M+@vwuõ{5C{ikl; #ќ4,'naLJ)|zQ]ɇ@Zpҩ= bnna_c 7Ro{բOYlł;Rj߸jf,T ϫ#8v\u~C $QF)NS^jubGZ/A.D9)k-JB0w>MХ;dWbX]:1UUd. b J8*m%J]Tg,Vt5m!MDK*mm^b[,̣fxÝ}Jlؕ77Iå1 ƢzAМqYC{jl3ÍCsZ&L:,تE9$=6<8d).~wv+?v kbuNѲq5 bKzϲ+RM>X[J=^P,?Od\vKr6) 1HT7_hm.a+0. HO&W٨D)gQk}kX>tɢF#ΤMw.*ʻ\łC sXkxF*. D5 %tH2ErvQ+H_Q^[vvXPhleb@5;pYGj;j;`jmx&j-swm^ϛCVjSa;RO*j._Ѣ%"Wh@Mչ=DA8_ JY)jBf[n`(JDǛGe'KT}QwL6Dwu5]^T1Ky%+x"W7!ȫ&+M66eOYӎLNdWc ,,!vnSGwpx=ř"aK؉|j84cѭa~NV <&5N!BjGgEs >;d89kz̭hjAb\gJZ҈A;o;Y{Kn1~P ό[5/N4V?$iqRUOD`U=YxfǬf羕ҹi1i|@iާKaWu26?14>8?k&R"V I?];pf3E&?gx9Mqac3r/i=B8c D:m|da5 ҂'sd8K߾XYpRH:8_=l#1vp+#5{rqEMA) =XPɒ+Y WDG`n'tcR$-K߰}n]bINWú)U:/[n3\2ZN3gmuv7VPq|ϓߖ-rZcns\)~1& /8ib!MQ /0 *=FG(F#kzI<=פ;b*֌6ԔzǭĔD:J ™du1KԪWVA{~xz!)j!5 ȟ*lm?Z[3[h{@0@?mTE Mf=xcLȀM@,]z0񅇡~@p5KlfبhD %zJP63xɋLB.tvSfgڧvTq㍜֛ݴp7L(=KB)u*:Fui?o@d$ͣ4Gf\UBN:m0I+;Q6wlDٔ{Ũbǚ&iEÄ-}yAbST}00{Œ `kW`/ɜ8Rxs$nN ^ї&ᴭ{>R1xM=C@SRHrSp)j_fxF̿!mBCVto -fI4/d:ha@'eRQF՝ݑsjZC/%D쁣t vwBkMG{Ff )oo'S[4j-e-$xjɘrnfbD4pnVrKꁿvBcZV`RmW0'kkow4gNX՘\ښ 6]^^^eVj9)iת{x)!׈[*[Q$̘NN%7Vp exё=O/PJNa_fV3׀Ov@5.o?V ;ARBikE8~u ji7lCR9Y-r>h2q^r.\a!*ql鉔ᴵhYzQ23m6Mxf' 0LeP5Ο 3}.PqZ! jAi2Ɨ.pf%`~&qni+foRqx@w -H6\WSCR ^l,xh}cןw!M<Yg3ubnlL#z.#2>e أdS<쨶{Far K?Z>wqK{C_wy-moB$E°Q 5#Y1b2 4p{h.Zvҽ}X@>u_薪u";LFkЉAnk"1E0$[QdힴCB c?k҅))EgX<'!AJ\1O׫osRyS6 4Nh$ Cfjato1TJ!/b0d]b5oid:蒌-pu\kE5 z1mL6kN D\v*Mg b ރAhTHhA)):?'u)J'rAW,"S+ }KM&h_K&_)C3.U``tܢ\6=>a9%Yض +JvbILm)_ܜzqa?9(Xb:XjC(JQR{!ܥB.:wۨnd ~]ȐaY|pcenZhod!be'X\r.G=B qRCiQwLqCTJ+t!ryP.*9Lq;\x[fMe 1?5($`LυV8QOڝ豱wW{dHFX ۔N')5~*UBhK5-~7Ў_PHAeQvAS&O* "%93QvzٮU[`vEdE]7HZ_U醃戢@SiaڃZ*٨'P9hPXtbnI{-b5IM?j7V>#CMGO51F_xI~[f{)1͖VC#Zs3u&_K22"z OgQqNhQ# 'ziiLDZ䵒:ji=ٱ\؈d^~&oNRQdB/Wb y]D "b:Z#56Npml5}P?HJSXX}~nc2k..$1:#6c}wU%N?pqSl% 1 AIPnֵpeW1h{xMʰĦ,%)VG1w0de}"^o,bGqȴdw"ɴ -`^h_nJdBNy-Bғ 22)  z+K.a}K(r4rc[ J'/:o5;l\p}at@HbbZ{y!A.N1{ O1R2]Mңlg3'̷_Q2$&ZLsV!}ށbSO!x!xyu3X#zNioPIOA_2ˬo56j\~h(Ǡ^G*C?MiV8Cm]GeX_upq̖idrP*v?SHP{jM1K# bܠ 6oujjQsJ!e2# fǻnN #ѷ×X9Uw4΀uA4eئ\xs`wQRjsSKje}α_y3yzJ+eQ%}4VE0y dz !6Hg9Yqf0;VVx,%X^*3kKUocrŏIf,h`o`~q=.7T;mڵ]gF'2J2\R fpYɢu{j%Iu8 Tfd#& ‰βr bwrg=ઝJ2WDvaxRatO|Uf]O YBIY5 wbdJChT(D nB*9'ĽcgEМKO6/,iE½~ZxL^qPP[A+2 qSDr>P޿OLdJsb&*fro2Hh`d1nu_ڇ9knXxL mǙ*FƜjhs &|I9iqN7bQ2h;O^M+x _w2֪pȓK wz|LUi7VXa;+".hG%p \.̗\U^Rp0^Sy0|dOH]oM$!RsFٖ\[%b7æI, j02\3#etF_$SnD@Mv'  f*[^?bO|j7yK2/dZD]2zi&:÷i^JXFYVشoyvd6q:aՎ5]/a]5'}' 4D™5׏qG22zcv5 a#[*V2|.dymAidF p9_j0y~_d 7fr_,Vq-Ԁ8,1~&fH7HhI e m6(;4~zH2@N0דN.o׮h_nzDd<>f\A2ȑjcha6&Q]HM! >`PI5ΘxeFn 0(R ]O@pV.Pav@_ǿ ;_'u $6;rUj]}bO,Z-|eSq8L6TE ȺKqnvz/BBa*!2a]GlDk`crTwl].5ˑCkn!|`<:S>c&џ eGZ q] 6:HLqfRYs[R)%"%ZӭBGe,/CDzO5-[0]_r)Oe` 1Qܨn5k@~(v!j Ȋu,QPXݤďײwO_7OcZZf[>5MTNS<5Dʣ:YހF$ a5^I[VP2z,bD}DbuVe 0sh*uB8`t B7Q\"l?{_+32'9v+%Gns^v),AYw=̗&r>+̸̿ӉO! r(l>N`OWl&Դo8*bkY:ZET,#r \8jִе6R^0Vs$!XUhNS&h,i1]Ւ69F)Ҟ 2=ӃN!d,ȗғa%<&}e/`ZI-ܬ+N^sdu a6&J3E9;{ΎeķL90jՍ66)GG q`o$y)6rUg}VI_"u:8|iI{!\lyW&L} LYs"[&Jgj=p ΁eF%| 呔pų0$9P7k/P'Ea]{jDԹ*i 3v*n̝X+XiJ]z4? 0<LEǶSfrG]geV`i![Шl5wn:`5:z_ dǷՁ[[%HI/E;wL:EC/Rv5GNN0pCS)Lnx&{V!dX˨!ٸr]˳2-<)JaD`u4z{7}Xj#Ɇ \ݢ[t%Syk#nM_>KxՀ+ a4ߖ.Ż.K% *@oEK',r;-UsO>S4 OYʷ'Okۻv.Vy ZT$3rweD`Qw;a!_ %øhΞ31H"Lfj[!kۣkkX8g.zk& SَedRʬәXꉜY2ܺ  pG: U1ܐr*&";~LE@  R#:PB[WO>e? ̓Hc҄^Pq㘞( V/yZkaYm }?aO5D%I{m՟>IEoᵈITL` +eLD¼1g#z&(Sl}B;`Do1 jEB tmiRзo6؊gI7K 8 iBu!A m]f4D@"u(T'z=[fv%R3p@eͷI.M#[Cª 93H/ű6Be )zkP0^hhz[KUPR5J{H#~t!l8*jx-Wdc)$h|Gq\rE;rxb+ kc'7<2)-w꠵;[fXcOLUѧ#p0M*OOc[{]ZDh2]%áyݠ؈aC enrMKTo7FgMұL " iމFK8az:$RY4V1ljȓ0[06܎+b^|[RҜ:D`D_;-I5MF,IFa,$&D@ \h A.u:Vn|0=_3qֺ|:N#ա#}Jp0TdVtiG"elCr=P 旋󋺥rf |&T)lea{8:?IV'FM& ODNtҐ;&B0}|6`f#&`_n|YE?]lE :7+@e ~ R ڱL)eD,__19Dnk%(W:f U_g~_sfQA Dā£odr\(%`8GŦK/پќ]d|."{H6zmrdYFL`/x0P(,DEPUXK'~m P`srj=fW;R)6K X{ =QrHhn3|0>Sb@&K*4dpo&lIj"? 借\k+W{ ĶG.Q@L99ا=}?vP YT6@Ѡ}Q4 h|+ͥiLÒ0(>Ipۏ.D7*g5"-,xC1-@_G+DŽڅhˡ W(`¥H -n T8\04yY՞s.yx_VB$ִTC Ҍ7uٕ^O&zCz>@q5>%FMSp`JBd24V&㈖3PF)1INj~-%[i'aؽ7L%|N.t`"I0e{ͪ^3@܆.?f3@\aVguY08^/ڙ p"DvzažeSΖm  &^ݫT @EH]OKR|iU+f4`^L׸_fdD~Yh$,N$ =No1d9Ed:PIV;$jRz*>5MF$9ꐤܬx7 0` yV,ofGH$DpkǫD(fy丘'UxI3 +lZ-NF)LJz0W2wpTL}T n=_#+`}w(zL%pnj+hWdj>u&=*,-}/Z~v l(l1ՈP"~^k_d!æ ?,W?9է*GQ sh&AqLz5_SؿJTXNw0cT`JVB{LuUo <<~qZ0ϡZ+/c3<7{qT}tz`=, eCl:9ye 4r b!hK'UQI1-&,x|Ӟ؄u)pk9FAӢ#r`!n(%5$lxj⎉h#omU.Ң3keZ54;GXF  ȊпODIaB4NQ)L)[FȲmttM;}}—.پBRrفj=Fҳluv}V %q""OPRAH`٪zC.6zRE_U~m7!I^A$->Λ:Sz=|][d]Xuv;wj&̌e[n}ȝr pINf49͈1QD|޻?L5|.@Q9I͆ %ҏE͖2rK Qyf]ʓy2ͳm3߾ޛp{^~ $#{x´ Еgƫz9T^eBʽI(n?rX^MP}[P{~ay$ds6Wc 6(2 .u w'Uڧ-]:9HiM.{Q cyy(ϓLA 6Z v4w& %@6hmMS5DUwnA;sa2}=Z ]3S5FT.9WKl1[fH3.Qh>9*.3Z]šb \`ni}ɪH?OFG6 ?DM̾tH `vPw]ra,ή ^S~0S0hlݕxDMRTۢ&(УCYc[oJcdRuлm lxBk˔D|QJH影8W|Cф{巶as@:oJc-a%pš<&WJM&V\:S >#w7 `@JYn!1N \c3oryV d"觐Tp $ذsšELvؠ%UyW[d UH2e }6N/cihNiVM^.\{j^wW2Ť˜;0Q8cTEǍo_rSBa3FnpM1b:boD^OYRi|h4;0l_.1.Y]7a_p 2]酕eJMY6!´m_) yYdD FJD\* .jg ke"~;P$XY構!yFÞwa>\gGckO J3e /2ZAK`gƗ8`=k"v@G]7CU+_'*'Bcdvw׾59ke8ݑ!2G3>[eQ3..o_*l{[`ۚa8CתZ2Xv.'BA;-)_~ҝj^36Gwz(Njɀ ?.›ڻu-~RF@87C4 iʮ$kVu/@`xWJ.7Sw"VU[ FEV\Sf}+7<̽u{Sη[rKV(F-= ݇0wFOkLn` M ŗP>?`~ΉR +ْT^Ӯ/ǯБSeea%\Tԇ.N1Ib8GbMWX{a ߆@e\]8J&)۹MVw#&g{ﺩ=6Eh](:|t`ܯ8 z[yxVaS8"φRpæJZIef١^Gj\&Ih\ӭ'pkp@{XijdDIN^\gʔ]b{&ޯd@:Mm)S+h|i ĩ;{̃xR%WHK .9jzt%(ٳ!wMGٽu,=#q]|ƁH?&0W4kyWbf=/l( K@+-8+#J 7OXILe` ?֐+B'掎@2]p.3DACAn$ځsfNLAkL T7?\WYLi!x 5R$~ZXH)3:$] :}rkJ>|N ;}p=s_-.d.Y:}mdկPt)l7,>;:0\ăj7ZR86gq>_8 | \ۑ,,ˠ !{'47'aދR# HiYz"~M^ 7ECB<nX/3;BYKFGv Mv5\bprA|ű/cmVmv I_pZ)ʱޖ"ȣw6#E5b %cND8dD+ )i֏t>h)I:[LˑhUR6H*FԚhɆP9{}JK|5-^O[~G&##(۩+5Y#P aG<R)B8un}f{eQZpގAws Sу7zO*@@z:F[ 9Z h&Yχ6(޼Salr%+>@s9GOLާiE( T,yҸOH5bsoh(p`~m$ƕ/&V>_Vu?i'3sxF$ۥ#jC3S8a-Ms5OR@A4ssSBd8Q97t a&WK62 R+Rݘ ^)~5cP+83zSFmz>٩͵u)Q@?Xԕ:bHAM?Ƽed&,WϬhLYY0kXBj Z62[yTJ/7"aƖyϺ@) jͺL*J KniRI,'5ÙhS.‡X'9T쭷:Ȥ(})WQ$mW|4 b`*\#OζyQL KosS!LF*P ~0%iiRXրb fv,8H]z 4 ?Z~0^oaަ}Sŭ6rR4h #l# .ћ=L?J<?.t0\YѝVI-aafbՒ TJnع밵4T@XZ)ORh_6 kT3nele6<`MǺ'ք V)Ji|%J.yǺt@v#$CMNEi'EP^D@9"*m^HuPϫ֑3]1x7GVɺ֙!UHz-_o̒Ukhi?ϥ ~wLޠvbՀ 7@(!dװN . hQ֫Y47:J%F8DD)f &@!q(֖a-_(hK\:5Sq, N]C{Ϟ$ #^nYl α|kW؇[{rǛ'+4ꘗ2eZ.s*eOq/TcGP+Es٧zZ"7su]ꥻw\tiWˈeA:LjK9yI37܇EZ ۘxzv 'v48^SlbL WB7NՕ*!Z%Y\0kOhJn GO<uLǛ.MJB:7R7m{R,2>& ĵC #*aKh!!U(wQ8y3tKd. +qVaKH5[)ቷ#jQ7|F‰^,0I]" W2B%,t$?V .9t܊J%T}RǸi?5Y ;v.JU #14T_樛 W F q1 / f=PR7Ֆp!ڥ9ﴪJW| MItgᘀԧpt|NX#zt ENL,k=VWqPTn͝x-_?Q6-A-/%x59Sr`E/օIҢ}[Suj@5q"'W_VfYņy FcQ7 F @te>=B\#X ,+ʂV3˾CZqI6 xo] <%]Oq`߁%iQm&I4;egwOJ-GQ&CJatۧ/ ._w/@q0}k͖xYJ^qϜOSWZ3KbKSKPga#;s0Ǭid,:TRC90 YwY`%I^űi@1͒!uBhG*D)Ԍ=Efș 9)1)CP^eo8y$h]kּm*ٱ%+ȕ% [qFy'T7\v-Wp5MdVS18ĩ ?Uq0>b-^tnp N`bPpMɚߨ bBR.`6xYTM_#[.WN 7 Ɗ0TTFu ʋU,PR^ ?ǵ #r)>y #C&[Hb~`1Su2SxՙXA6dDn( *',u|!^fT$d҄h8LW{9}S7Զw>SMU@P{-A}'fE;1Dܓ6@ih;PP(ħRjoÔ˵g÷(R"G$y8&fBɊUgi%˷5'+fd*"fsAkokbҡUL(e폼H褉_t$KᘫD.-!9-qr(^p%9xs `}L9xkuɢp{b+v]  3~ҍ іS$Gh5[7H P|(R>X*t@TG>U 5؈rv$L%*#JTy=v0A! %1Lʶ>}?#)e@11Fc];y|3mTb%ƒ[aJHk) ~Qz°k1w^dG5=al)ô%YJ .z HRb n=BԉM1Goó@S.yJcX:]0e@쮧r~{e8Ff%o9z;*'-ų3~7nA.Z j5Q\ׯD9S=5Qojŷ 1^h}$ЁV_I/K.$~r0ڬA'=5*1ōڙ5lS[[Uy'#C>H3:S幧uNG}0<-Ş\Ks&@>XԒV ]z!7~ %mFvoW?f-XY'x悤ЈQekhz.0eI%{o*~ ڃM{tTGO$(vp  İvT1GMR^(N}gy, cd__s5䷍-wc`$b|HAkUC)><.$z.I>t ˺i1=25[J>D;x10| Wmx*gRZUKp$w?m;k閦=ڳwt Χя粖I|؀QІiL0: S PZgT Tm7z|s?T29]K)!oq~Id5GLsK-?pixBwAXMɌڬvgt|T dUV7h}Mpbfa[w~5$(-usLW_"]8uQg5Zci. ,)C$qwi.`-r,@iGsߒ &`4 I2.-@N\Vlwrm@htϢ~2-M$V8>57#K!YװMIzMB j)Ӊ_|CxpڎJ$4mjث/EXAZN.NJ+cG2`Ύ$boPw߭ Va]wAp$Z%KkЩt8Q/rNFz'̨h8d[AC>T,nmck&ȿ{J7jKVɏ3*=ܤ3+3 2%N$:Ӯ{SQicH] MkU7 E9T;ߧBSzN&AOV{Ƈp~E#NX"}{r-"bj.8LӐi7u[Lnnf8X@SQQyGqHy!FEw\\0v(TQE̝K`Ȟ8jQ) ٪0 )J _USF_y זY{窚$w4jGP2!6K~FoM޲F`b/hriF;yp@x{^;շf44P[_wLDzW5D)&R .6&^/O& !agEv7`w_ Xĥ3}ǯb)ͮcjm +rP8ҌAʚcy 4259՞P._,$ c ~ "U ^pyH8!0EXc sg|(jPI9-~šQ"y%an,=ލdpR{땭dSj;gs E[૔}n3ZUҬ-}j֑ɿ SqJ̻zg`[؊@-D7:˯PB>1CAݮFZ/; nJVڊE x_NEPR߼Y+(yS0 _KJ^1 V Jjk3֋9ʹVc$i.O4el.ҳhcTq4 `n=T(wG@‰hxn_uxNR.(":J!!.yhdp6 eaKo_vk956~=HhAf*'G#R)σW )Ño_֍a#y+'ЇTݻ~-9 ,FX'C?,V2_^ސ ب[9a"܂NXɴ)<_a:lEFG+Vvqm8Uo93a ?lRY,&z+.'M!L vSkmo-u6IH*!}?@w #8!6ޑ~>ι/?[ "/e&Z{r MҜp8~l60#| /9gnA5SUHVM8|-et"\E?esQǝP8S/U5<(BNa&RC3$$x*d'6i5gX3|1) Q?fRM# 1ߢ.$z@hZH?&t)OA=r<1!n} foLzK- V%dkjTjJh[-Em5` zh+8:(GA|A/ v 9| C&q3E0V͜lT=4RLBR7@)M`*bF:6,}`/(|Bα s~Ɏ$nq?cX%Og]8g#E?~ٕ?Lf(rf C V^bC}8E_CtFςNBQzSfZ H3[Ajzu$Hf\x΄?ǵHY.i"0FĤ6&@{ yk|0m.]Eieh,6/p!FfoyY\9mKi[6:>D֪#|HkUFUfi=#v)E2Ҵn2AsU&l\ Q o?:'sr{QKi)5]RrOv3ű݉:ߴ{W 87}W_”ʧlC 9uަwRmdZ>!kÃNi . < l$4 gv_]C~ὢ/'/?Gln~ 3t 論t؛ﯢUe%P\>' UH Z wAWR^c^^Aa/|̥a(y98]n7АD}m8o?aR/BZxu]eM錝k3 sW>vclv&G<}cX)@/ YT`{;Lik:|ܔy.!i(%:ܯTU?yptKYxRRٺk8\KX[^&*Yѣ. kunf}(E86?J\I U@u9?3o`‰:/QAs *b#bmk%eP#TorH;, `aZ*p>'s+V)++//ąmCd%dtN*%X~jppi|`vۼs,NA38&3G8 cuREj\ QHk/+~EqD`n|J j)J20Fdt[J F)XZp-=)ŷ0KZUDK}}H_ cVу$ UyO}pȉWW +;W%E)7FSZ*xL|DNMgmMIvԅZdVEZ闡xJߌ6>-h-ϷN$.D2 ,kMց Wڴ~3T:WT$y UJ(B-I_EG+_uXl\_ =,r"V 5խky<G:p$9zXʶW9SE@| G7tVp5qac?ٰK ̒eTm|?âHUjzΆO~k ]: BUhG5F R.K밨QvcY$(yj)컱`Iaig YqvNҥgs}Pw-XR^ՉD!l|[3;<_cL'q'VXla2LA.U{%qSUֵ7W X\w ]Qbm *wЊ %g n' =ܽՇ^7lB#L.Acub c :;Goשz>qMUطzBYSKte[k l(7DWG\,rZ{w41T4QrMf۱23v8'?\ =dxq-$fwF&Zy8 :`H\TD>.)*:#/|J(詶U~01j,=W" 0~|' %Ee5zJ.*h5âP ƞ?'MF_}4I3@'Qд,xH0&sMt&oA{ہ,.m>U!d9f60Z*eyfzI$ @Sk}ƕ_Ls}a 勉-ԵM!ŇM3ܶ*Τi,P*ۜ*O3qHr-:PXs["֡(NsϧYrGbp_D26ГlF(zՋҒZTY|jpwqMW \T_E]]P4Ljs8HVUl+8/_1uc=\H,;F>q7]Ss2\حk3tj̖fB:?!l۴ŨEX bԔAlR.e2?eѮ/6Q-GQ%?r#ثf` kPJͼN..QL  ~@Y&΃tws Ԭ)!4ƪr< 9WeΪHGVISIt.xhxAdh!!&9|߈Q%j&Cd 4`SlɱoеLLÀΚJ#c2LJcx_ }=f숌6b ڑ O,ȴ-X " TBŒ'u׏Z:! ‘g IwyQ@rW*#rP`zHU-Hb&q8M^yv9Ʃ0uJ<{v,(:3W:o_XfzRzc^ےKIOqY;[]gcSDZm+oH[36zWZcxh0.+OpՐui(9o\Y('As,V9ϵllVҖ^J9VdZ]Ϋٲm/ ٲUBRŪ&I%݀Kx\{d-8^C߼+KŮEX4B"Z-I9J?u,Ĕwdl*M ր[BhLl|T7.Z;Avs! mQ߷=7cXm?iB|zC:i"4bǖk5 mIyp*h`MأZ@U֖gNsFZ`4'u凵H^&FY8bV9}e_=061pt1pYendstream endobj 7 0 obj<>endobj 8 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 9 0 obj<>stream xcxd}?cb۶m۶c;ضyffwv_w^T]5?T]UJv&vδt ?Bv.&r.&o"+ )O1@`!Vp03wP(QRS7r5,ld&v6&&LL&S kBLV fbkh` w madbdB 0s|9l-I͉;'[ `0s4ue6bh-a6&odha */,q:8 343r߶ 1u6u8&c '{ko-G@p413p46qr6mwgҶ`dbmJ۷- ?"akj`d\MU f;c;[k) wg]5+ _iR.u5 4O5E3kɖp6n[o4edIX`j`8Z[ؚ|/p[:S60'Llǀ Bo ߶da߇hLvv#aє1pvph1100'aFWr65"(wL ,e Oa}욘DC/`lXd hi^X&(u&Q?- 1 rnt̍y!}s vr3ٸ^vA닚zS_+fL Q׻ ݁5 q;bn!'i.@I!Vq-ǃ2JΨ*tWֆ'F %:xM2% ih_~s]3&髊< * ))=^߂);kAoEnĻ @RƪA^E\zC<ߏFnc/*[AT?Jp/{A̋Lǻ8Y8꠽4л4ˀI)/C/&ŸigdGµOj\l2$E@{G;@cv⽡R_R"*-@ H˅3 |YE0lp ąH&]Zd@VxPľ=ߔ4jfimWZ"U~{alk}JH1hԭaBGQYj121/P~,|=-o4&IR'5|ݱ$=4￞?TD od3F=hQ;p JtL5a(ZVt5CcP&jz9k0Eh[EL#;I.a؁trca> EjL[aFZ]}@ UyJR%xֆ?ӧ+a||loX6̦gֿS/ Q+1hB8 Jq{އ$1-2.{l#!fjxfGd&RᚄpZm W=F"2 !rJF]l3N֌F᯵{"<[#V/O;t/T6{J.w/PgI647@%SBN؞{RXqZ)<O=?oR"#`cb $aOhG+k&PԣT"N旣})99ƴN&/%WB ?.^$L-uk*th6"bs/rU:EZN>x~[oWtrݬ@l,r|SpTxl/6ciP?ǼC6(d?tJLjQ(]NYui/D΄i{NΈ"YE{Cϑ 5j]ہkgoVVJ(xن;!]tXw-\wZrJضݮ\ 0pe%/*·"[BihCQ Ib4!O* +iV#裡Y1[q(KޙR-.q}F7hK/䉝Usˮ,¬#›_ڸ 80m&XxER62;SdT29xab(sKryֱǘz91j8]̖‹dU7WZۭnG{K9}Rн6YvP0̙z E'f"8jD_}P`,e9;NH>'u|GmZ Rƿ:ZH>',W@#һZSk%} `Guov iV/̿,aJB7 MPCe]՗:kZ.e9 !GVMVfyx>ԏ扇 @Țޕ&iZTt_+ANE<(.hH(3Dǥt8sY`-ϡ%(Ab兜a/i}_6^ 3N5xTO u@$R> Ղ~1Rϡ7evS|zZ1~p?Zc|_+ m@vjЙvz-!ho:׎!`}|LL*ߩǠaH40rK1Twz䰔giA{9uBW0<4P0 ]\ Oͧg$g=eH7Pak)fc39T! В9-a[NQqMCۢ3,Xd=O &~ElomSUoAHg*mĪ:Ԡ 'r`C՞P{uCXkNGoI;6:y040ˇPޫѯvi—M(h^ZC^>(% '._dGsDE@>8smX>IKăAkJh0Sk$73|k7 .HOdE;Wȫ}maDϦ\ȭ:9Erco6YY쥥`!䲄: rm6kWVBkBF..k[fF?!kk)$0xs315ƞ]]n{S٘x4},'s2Y.o6Iim'(iU]9~RÙ{`dn UY{wpw 4UvRj\79 Js2Xdn̾q%{[*;-JoG c!M2ͫ`Sqgd6Y8_犱O2TSj w{ƶN!V ]1HMKEȪStxeRÈFRθUT>JuQzyNPpϨuH"N܆!l wwT,M.kO_"ϩr;%]Ժ !Lϵ->[r|P Ճˠ 4.)o C('K똪8*K"$A'pYhZFvՊ3Z;w[EBҤl˶!a^=rWO]#̬^W{9W14"M [zqO SBs#;9ؚ ٤ܻNeq}!|H:TdJrg˕Κ錦?^/ sht|nFV̪ nʿpz#jTb-p &g:_гɩ ]䫷nyf+8mb<_7o %yFyߡ@{ \1GAjvaޒH`")cf#wf%nl% ML4zl{ ^Y7Ln.3,n=_-&^D+H~ٟ-h: "[}a0yā3Sh|>nzýCLnlUwt۷w c CZ'bLT M q N>p48䗣c ?|f*$+t}@>,: W5Oi"s (S.i'o:#JqMqJRygQˌov M`7)9 3֭4L"-jG#⇾0vLAM7ͺq"Nrǝ qȂgn%ޏ?j&t\㬧XIf6h±?$kH@ϐ X2` f+U-)pg?-6iQG}4Oigɳ }$-b:aoKmr#HlY+(}DцxbT'۲*I[;/xFG9Zwp%v$4镋K=F3[*gY̖19 . ;uT+}Ef 0UX&]*J9qC$ %:o[>] ]b)YR]O[6o>ϝP^2Cb{ljhmJ&0{+ݺZ0ܲPֳF>wӽ44!Di,Bʋޚ  m.@31^ }wӥl!>MrS0UK>̃fHZ&`,ITU:*жvGJa:vf,c@h c ~ ;zR+NJ X;]-AO)O@J<"2'N0# Ƽs, `[\ƈLBWiG!S)d@[|zeoPc.Ds*ҳh1GOEvE !BM/3k$-poRX,\Ey<.}!6 ~o~nX1ŘJ%/ݾme!V >zrE#\?JtN0 U.eA{LFJq꧃wg7XT薽p<{d{m߾06$f DzpeqCH`;J n*O޺c 4CKCE$# >ƪĨC=_SL8֧9.tw$TVf4VAr6 1K5Ct,{m.?f &Kg ,s2ƉO>6z^&G,غ٤BeFG.͸tZu#KX(p$P*}0Ϩ8pVƒ.Q+Rt5Qw= Vpֺã>rARJM-BhSsF8&6#5 8bbqY^0d]ixͻ%,sDA` ~jy\1<鲪)=NuyYx$J>Mim+4G_Up+!8r%Gמuz]%7(2;f%"~&vMsW>!-_ L/*7LLB)|iR"]g&O7Q87C1jVv l#H L_FJ$)5e֨ uWF{KRVm@6#+Lo & o;?m.F:S 8&=]%$HK<+⋕Q25*tk W Ǧȍ"U.M62'c[ W1ۚ\; nJex&a[P}w2stk~#%zT!':Fs~U k|0b>FݲP٤k$ ͬPZs6kJn:E%ٸ )_ L!?^\NSDhEzd %Q3x~"vqRO ub-AxD-jJ[Q4E z/Z)::)$VL=卞KafrdT8o|\d9lNw1?*Uh8;BŇLmE\B6;:1]MXߙ6@. c$p^-dvL[\(ж1&P&.Mi#?z~Kk/p*QѾ} oeqs*`n4UMXLg·닙&!ML}W\Tur]`n,m UE q>윣УKzH{eY6* ~*1k๿fds"A  aե7Jj~J\ 䤒$N麨F5_[HTv"448L<6jNА"0~!M^"։aQ7Y,%PmA{ʝ}-ug}}'E6GUڝp#/?W͍j޶}Gr(UY5, øx,z¼e 4w!9xd ?zch7y0do Km#B#o ]_zS瘀KsJK!UNN1\DjRܥR'Qn4{ i#b42eGmr}*yJ|4o-pFj U5 ;ՓrvH˘?psD>Rxnh^i6%=(LEVUS?qD;7eXg9+m*j%n7kE˖T(v"<#p "8ڙ_鬍iXJͣT5! x~Ț8`_ǹݿmQ7mre˴(8P;ȫ Z/0h/8,W˕OjD,Kh;=/m[rHZcO}RQ@XwXԟxd] xCˆc[9]Yq3nX Ši4T&J=Tvڠq) {|A' !=cpa#jPNxKIޅ=ͶIRv3 V2xj@l̥Kk_BYvi/W5Enj&Rk~lӽl[`eG"Lj۩ /^;,}v CxwՒ"! AIslD{ےR~574:4mΉF&,FJ&ZgہκTؤRWwgܬ#-SgϢ[U&t:fG"/GKӟFR; /*Vq1 04\qܔ%+Q+* #^q~_/ e]/kmeV3XKۏ%qá&ܺ>>2#3?sYW%N*Txdߜ1﵊ul\\^Wf+>րO W ds򞌡ez']afB*az-/]0tP?J}$f!y< u_IZ5~S)31eJ VG,vԥ%rUkO;Ƅ٩݇]W⅝fx<>:PuZ}5?̾xSxv.9gnrpK'l2R6-ѝ(j4tQCOkMUP/Ǥ W31[[ I%86p=~Ű3*⌮0y>+KI/vgK V^::2A[K_=M&N xiq 8RSS(K"DL? آ(I@eZ89OHY "{1&~502XKyDZD썁(Y*2VAQř2kh 6L"<.^1cGqۦ/`SP)9:LJt I~ʄ n93e2x1 7b cC9%% Kux'¿'"mkB;7*xSiy;Ei* yх<7Yyv۠;ݍ~@٠K{9e%[Vd}j_}-8E);_7{,Y3%X|sɨ7bUj: &Y5h0g3Zb-ܝԺ97Ya7[(I؄$Bbj$7 :aj{&IـT|ECZ\Yj*4r=4qdN>9 !=O s}Lb1LyQL*h}8M{ϰތY:ɶ+reP15鰲DjYΒP\;[,urx40w%s q5A1~ay  Q(7mKQj0`*E*$ED'-_7S(A 6dV%ѺY'rë45KU]"~dqU05WaCU v[*oҬX1vDJ؊s({* E%"IuguBK(ÇB[7N@B.dMdq?[bU05;:A-sBpj0~)=Ōs/>2bi"iJ" "~j y!LI ;A 6Vx|ޢ/&jN)Ύqm_i~o|8#"^!i+X e=w!}|&kꏻ^1OzAȠO0 [^C?"ISC& H`νU#O~ěLx!נupQ:bA?IegtY9.my!^;oQ=v_R^Xb=x[t窃qNJ\ M'_!Z}q$0sdaRZҵ{ 9~f7ј&``W)M˦JbdC4aSi( kRm*ژZ_ ?[YD+2sx%"Q[,$SsVAt84jD"7Qeⶱf*ϱj.}{.mAڔJ6dFGycb-ǻ> rx\u;_iMJ/m {8}*"pe&y |XsяSK7UC(O$tA](QpQdR&K2"FӃmvY揭v |'FmXµ¸QAt3 8glvV.ǥkOy!ZEl\LYkX uJq#tPI:*% b9]38eFE+7 9tV lJ pY2aY{`lx厥P뱹GpB~cS҅@.u- qs?e:3hgW9m^3~wXcO"(y4,j ؎g̟z#fWE*lY8*Z+岐V}V\,6Zv;GB[kp<-=D]^+2lX&i ,!E%+  T9M;-;h LGN_ݿC'dCudjWz|IA0f!ɜYej-6:zDמcka ֬)%{iaONL%ǧnUh /f8S9-ID0B"::cT]sTᶙ|1J2ujh9wY.8ÓMӶ+It'X6~єXt֠ iW.D]LiV?tb@)[ tw-L^QZ>۔a/DX n ߡd1ɩ bkN&mhU՚ cR|딘a26-3H#laxeBdrq1 ,<̽Y%ymvi#<b֕7-m0妒Z bkT~Knp;*TAʕؐ!ӽS*&V &6bugPamo:v;O'~}0-̟EM[ŲroOur(,_*G2 D$Z%`2X!W2 9R2UxzGmV^6 Gt̋tRDtOv:+뒟YZE~e rF-!hRycPf\l[`bJ+|% GY "+ڮT =Rda^SK5ؠ)&mk?M%c0`JĢA[SZ0UmSF &rcG<iTd ΒŒrWYlq z\v Hҝzq:|a#r$u[SRP4MY/Uw`5,vt0ZX;=?pSP6ty2@X\;$wd=-N Rt5U:DߦLz/m^'zBRQNgA򏴼 K2Mn &3:#3)Ç8C\Tӽȣ&nev*^0!`j`Muu9;iPV)@^SY]m5zNW٨x- f_bq[~zAdv]8+N!Jrhp4v]|`  n'u\/-HĝaZ9LPggįHm&H ;݋ޘ ((O*ydY!D{"A. 6ߠW@% =c59xJՍI?JLuALUgد;Z N\Y)m3Č&WPu>osu1aPP[Lg}NoQyQjyD۞%V'/(1 ##ZFzsу2LbأrjBvƃ)M"`B${k-٥CU?M"3[ѣpfΦ%oluyB'd\JA% ,ѵ~EԈo|n"QRS0d}pUzy֙P_!jDs :Pt{H>_URy uC[mNa1JRIIݜt /=adN:)& ]Bj? lnwWtI(L;SHN̪\Ub5@gQnF'~ac۸?zjf3OPJkN\.?/u!EpHj,C&:$eZMe)WTl C"׌>6P40OMLa `#CѨ3SW5gEck|9J4f_D˖] hKjT)9 >6bTL8i-V&pzai 8SQ'sT9ys ;knR{*\to'N \ Ǝ:Kᛎh LJ^[oPEK@O& C$K,~?\ +~Hz4>:ŗJ!K5n$ |+yKsH5n]Mc~UyTBfIJugv/98Ԍ )[CEBu4i}[K: ]0QEҎr1fW3#b<:o3:BŇqizwemYol-ƞKD41Izx>n8 ސW4=z#9gRC5ͺ{иA>ȃ#u ]Pe@TPLw(?Xk=ve\:Jj"Nqh(.G?N}w $Ę O0w3U u#̧ '*:!Kx:Eʁ"nFO8_۝/-!QЬ~9w)r4 ? 9#=ll^E$/op๶ J 6䋓㓋¶yFHӧTLl9P1ӡ/p@}ie( qOy$C?9cۚ.?{(s;J8ұyP+^`I!1{ש'!"uk!A:r'm:aoGHݝ 3uCXÚ"3ȗ S'Lʯ|ea5kݢ6-(:yERm1NyA@}%N:o!yes6JQ5UG_!TIh;M3*fm*?k}{ b+b=~ 2.mPmS/OŁhmӆgLFG 7 FffY &'7WW.!8GDqBaRit:TcS}#̨Yɛ|npXX*Nꔵ( *b6lu&mt8(l@~]J8pX,{d +b鮳ʅ2?ڝ1 &f0DNh\FU#f,.t<5=Q@;;ty.C@#k.\gp^;|z`T_OкCfn{9>ԟq#d=aR~C ch?wO5c ?\@~-%gZ_`r"³%+S}+'C)Bu{:ɴGp=8!R ;)[wkD(c %Н& M! .y(-ױw*pi yn7QΊXInYZz3K[@X`5=.cl:Rka I`&XgΔd,YOvAÇ?n7WW' o@C7,{`i:rͷ2(AҼ}9&=ԮLᦆ ,H1$5f.h9q4St^O֥us# Sgx k %{?A,}N/۳k:>D&F*4WOAgYgm*f+rm/@%3.R3 la5/lowAB_JxVI,QarYe=svZMZKaZj^DhIMW5x3! Pj tc0Ț/C{/=zػ%LSv^2&/cdA0s5fc┄Fb;Lů@$1Kܤx| iމ- =7Rhu.nV9Tf0tUSOROjrd~5;9$t㤈eVD1f)hUZHRjX@fd #xi Mp!2'IXע `(!ZNR}̺ycS[fTMD9޸t?ö*Y稒8rQQ>š'ǝ7D:PM̾.9;ܣ݂0Wf utlZwu\ލ*KTXƙ4cs&=< S.2 ̣X5[ $(x|GӀwnkQ8 680{׿\dNSydG,S>2VCn9]wǦ׈#wAi6W؀|^f}5fGnL"0'h)QP. )=PXfkZ#-hcv͆<2CHQ:|禑 f p6+ώ { ó`^I1XFDm~:?L2`gX,U:@+L;$[Ru{e^h6ȬkE0^.MSu(-oȏU)4mӽqqvWg5$uu Th;pײ;+9z.>Vat~@ 2S?[^?0'x7f|e@Mkj6cPk8G mʃ.JnteRL'<$am wJi4vV4L`e"Gk(_'ddFMPm$s*Jhvr>nG`Eel@xs31@՚Әh ª! &ц7h2x{_TE=C!'`/%"IT_`$0N4s/1H8&մ- N9Ȏ16 㴗G4sqG&s $a^+ 37wblՃd;#yܖdjF](Px- d'CHQzZ~cukz~$Fp,n-[^1 -Jve|yd$Mv ᮐ˝KG^ձ29LjηYzu#;,axT_<kACbp+ЖcGu9 \4^ ׾wxLVR+uN$ZA[ +ll v/PS\IC`]:0Zt{oZ%] ")kV^,\_z`DDsaw/e4:U+q&U4( YdDSB#r ϓwMBZ0c-J-с:I1Vu<ʽI|gp:ݶϖ0ݍm1K4;ս^Xo0iY&vKT TRRQ0 o|Zځ G2i( jޅ0 ؤ]'G >9jftj 8-)|愳p|"0Cٹ*aɂjE-0\TԼ ?RèhIuW>a"5JOV!32\ h1xuUcN r5E48ڳQ#iuMs54(YeaBip-lKy+C*$H*XӪwC$hJ*O x{s$wWeNH.Ko1 H1$hY̵F~w*xehxvl ğc'C쾝Z<}/#b ./iۙ&pf Х 3FJ1ӥcU-Uh=6%t翊{M|lqkא<BTaQS1nq CYidr^ n{Ӎ2^jlK^x3)EQę}bF=U#\[i 쫂'> qM@>;{TIFnA Es9%peDSoIh՘ܖniGd/$%kY* 1{i@G8jEPOTQߚAԺ_L‗O ,ȉXpxL7̈ (}A<,Dq] l"њRNx cBw^F=374ZBPCqƾQ3QyNgc7cʛ^s:JF缗HlO37%J>=<,GbY̋ܩ2EbBk0)b\e=傈N:4'jC8Ns=99GCDP8lEdHGS7s^BяRW+{FZX&6\mq bKЅvn{Wu~2!;0,y~o0I]|m2 XIzfrIy3 \ ZZvKA&=`NS {kIbE۾jc—W1(hf P[`"'O%B5ǔKütY.ٺ&5S1PZ8m9S]`aav>WDo)лn z<<''c6РVgMJB"9nu fdMً`hpٿ=֍Р:mRTEᐳwk,hL)VPz;pZZs5<{V4eB?fN$U9P^v؁Nc}Woy'#D%ZN5gv2?E?"(.G'9}EgqaI?YFh/ܤ-9ߕI9,Ygd.f?bZ ~ P]u6IG~@*ϟgBb]%.ۗF/+Y̜ܴشQa~VC/ rF^# OReT6] /y}#= 8Oji\7>8$|m'Iw9}4T.Fxd4dTE\ }h\B]XCtƆxʖ`.1{R)>(uda솢 B:AUCePF- [ [N }jv"j:;h%MgΎ'fBjOS >(doD~"YkGu== }Ӎ} *2߿>0>X"2_qۼ.hR$Ge{4dJ< r͂< ;;vh{BOI7o2=Xo1]}*C Ι7l)SCU/B,%8ޣ4țTwiqΉhv}c΢IgL$́mS?:&ql~jU /]v vup ;<(v(;ցVQz1@<>,̓MLV"4 VK4H-] nR*+ݍ9~2~'HHB .$ | ',k;7 0ZGiU]:)-(9X ay'C|qmeevIjŞt^eo-F`M_A+7*'^eYW\JX993Bq|Ry5HȅOltdWN^RulO-Ns$ tbWAJuƾ,CpB镩c{d-h.~h1$_a3Z Ş7N_̒ _  c^2+x!)헼Z kh;.쨵@~WF,{$ҺQRpc_GObwww>'/+,Ҁ.w2&Hڠ$T0_tnSoa Jv$&c1D?SJ_tnN}](LZ`SΪ`k%#^xe*L.>kYhlonRv)LeM,vAGFymk86?  '7I1>P-Vk) HCr*vd6wg9ZX!MOO{<tȕހy10V!3Y44ҤlDC3ԌivsD@ u5vlTKuU#tm_/H!.K.7ZthѰ'iJ?QN4n?̫Lt?٭28wqZeM566>3C&s fD.*Sq}x11Mzp|!T~ѷ텾?K jx߈19tENY4 Kdc&֣Y;}k~&5 ,SȌVWG$ahOJyzO TjG*`i:d,L ~@3X%,jؠ׭)+8Sv}:xZkw%ꅖP5_RfGb#R:e%Os qhqJ6; ݧ<; l>FHzM=y g׷ZIh>SG^[G-4"UX:)qc{ ֖CغQ嫚XU傫EE)9)[zІZcw4Vb}G]WT(|DeA&6YPvKiP<5Ek"|UĬP63?dk@=)0.2K+X j{ ] p\CEd=HrX~tO+B]%,Yb+]qP1 m)n3kubUSLJG?ܱo X4ptr n4E5ynj0AiBh;U0$-Y.m3%RN{oeB6G=3^&yoReO{;OMԐ4 p0>*dL) q;Ր8> 1M(G.E{`dpP80]a"j3g2Ͱ%Ts6Hoܜ(Mǡ7"yA:/6 ztm*ՙEeȔ,K!f(fi -wVOqآ܍FDsUz(}hR8wx&n/̆ d]{ M \ ڀ"qePk0+x89D%&2$\~܎ A2bkNkc9*cy `1ڵxћ4QQ${MſnHmEH/"û.[.|2K9-My:OicJ{n-Z4>LȜGVᘅ& (%:k{F!,z:$iqX'O*B~,FP 0H Par K⻮؈('>i AFgFZXXZݡw*0 }1[ ~NFm6KA&' /TɘF"rp HN2*WCG^u/9Ē)d4* )]l6JFh>őVfhݰwnȠfb&.lg2Y67sѡj*eQ˨vgLjg42M|ƛUSrkΰ*ږKu3 wܓF -8wXutMd{ n7:XB6wD5UHQQo klٗڑY{pyL[Gzoh<֑Nk;uY90sCIe lT/ɹ65mJnkǪeT6Q INdtM sKR:^Q NB>~6˩@BϔNKRz'iĔL筁B4#53۵jRSO{zԮܭs8@M?yeEYȋfA>#'b-̏6 譵R,K*;sj>/u \ ^L2v3P)𵨸UxKieWWq-WC@ 2T}ȹ.wbUa,aKזsO( ?^|֯CԔ ȱۮqޱVD$OD|vrTd麇|IJ"=Mӓ4T}S H C9/`Zy9אeL[yq.DxG=E}Jzi6b\Bf5?r/<NuScxk;P9 v<(o7I \ʚ @]a-1S0nM|ŚhG{?*v;芴kEr0RWĐ|ǔ'ؽk}*x#Ԣ0"(*zdָ.qû";0@b#L˫?#Ϥs^&9~&&)ڄߣ~ݧn0.RsU`ܑu퍞 vEޭ̋YnˮG2Hflrr/T1C)Iqx+`  ő W:|IHu{iKOyR̀$c NQa9ہL"_v cHnfSFl)$3|HDQcRWýjHIp3ZHD"I@Cm`I] gAgJư"fkE2I Jh7zpU߹t8g peeQsBߡI $]1mj^lk oGd4?ڭ -R,՚!Wˆ{J[ Z,g fENIn8],mu)F}isn_q9. @辙9/$yVi7TIKl?HuaTL>(A{!,^}g"[7*-k:1MQʣ Pu$Ш|]]s6 LCÓ/tq@x "më3|HMt91~Z'U2 trN؁fFLBQ$iDQ,?HQ>QY?%=8-j؈ ywSe=9q̟T "[xrb_{3>&d֡4d?1xJ1'-<-Wz&RY1v 0\ːIO12cRDV$jו \@a0@<1hdƕ}Оj&\rzs+ZAjeckq[+M1_Bt+$F !ڿ,7Tx5/6u8_NP1'N$`Byd|rD\v.HQBY^pIjCK|:喇{dT..?ɜ4تEZ UFK8k*"9&Km[tir|5-w0c9$v@![t\Ti ?q S:g+)edC|2 +F܂C!l/#.+TrR3Vij_Ur"{YѽJ Mюa< vM dELܞ^;}4eCI* %'oNpǬ]lC)y 9$ʇ';Wח/Pf|$#nטZ^ƙ׷ӎ.?4'+W'oGT 4d+p77c:!a帛OV~74͹7rFĆN%&e)@to!ߐSeHHM0ӸNGK$3FÓS@nGJOۂI++<:Tmj5E@P羃C8܊)+z?,35!/7z'#u 6.(n;iN)@6ʵ4䌍Ax1^.KDٛ3T4 5fNr#3}— [ j=d}n8ݥ0{6--)7 .Y'tX\SHqز]IpUWރ$(ml>Gp0]d8@ XMY5<pn#f"&Y؆?tO;兺 BLu~>M'?5PC5/ukDj!&Q˿=6ruL\bvHFI/ W̃tȺNJVp$sJE_|aJGŽh l[K_uǟ%WyzHQZB; TߙRi,VX1KZu$r\b~`[ i۴Dz:6?ΧJ.6mp ]|te_rh73Llz)r%{؛Jvwhx@0·Lm[z$48&QX"Ea,u%jV$X k~v)替:b{9|T`S籉k8z.-uJ7>IG,6r'3V?>`ss:CEA=T pD:#=y8iuXn\!aG'@$\y {jx{#h_anFım&JK%K7[jA/3hH‹fLrV0h5CH19` }U6U~?Q:LW$R62RV?k +{ xѠYή,O~3,v c EUƫКˆcY?[uZJIKB sG(N#L$!w۽Wd9Eq{ɉP5x4N,V,cRsX?UE-nOL"^ed7 dcޗc$ ->JEb'7 8#~dJspw"_^b\r|`/f:zl*GϗԻ2ZE:'l'99 0@KCLO-]7t؄ a m*~ڂ kқ/`%E|(<n˛WRV9Z> ӏ8$U38V)!!wElG7j=[4 gSMEe&ўTI+框 -eNg&[DÆ}mHE;[.Д܇i%}3btD7MFWg(adhzserVJ<"uEIZ1+avKsH<|0ot$@Q /9ukD2TtA[8#P{]Fat㛥#,~qkNv:"&7#{z)LҸ 2mac$7|I.@Q!@x*t~5틱9A -3:Dùa0da PX7}hox go޷(r܉&P9؂GFF³:a2jd8_$v`c-+>/Gr]oP lK]ljjǜD4^Phc:?B%4Y64? `5cV꽁%?c= <`\21%qt#KCc%Lc۶m۶;ѱqm۶ms0YLO-ju=#vS!@"6"C}B|uˇ{ǃo~h?^nqE4fn^ Rz񾵹l۳&#O `_tjXaekA>=/;KtKb`M1'# 07.H= |W^u!էd']Yr2 5t$ӟLZao7>q:2ӋEr珓?msΉYHtUۆ7$gmgfOFR<]X?tLJ5n+Y?G)_\-9TqtQ U2rކ^T2 Wyo~?josa# 5܅[9 +H0{tNhs,2_è(5YyB0|:"Q[/SZ^.A$ME*^ԅA$CL\zȶ%=nl+Ϥ`U Xds`*\j[{,ò2!Wic~!)/s=>+V(L]Nb@1]h1x *D:EpX~5 A',/?݂j0@d7]QqґTZǘrͨ +)>(#ݑ}1N<_h*ey^{NpѶU6UMW5뺐ƚ™$5wpVcKQ`ս[cyEMeZmr({l/^`/{b_J&ȶ:6Q*kݥ ߲am+wql50a>y"[o>lZN&Uc*[%"(чaΒ+~ q66pã+O*5]<J?۰a *]!Yjlk)Zb+U71uZH|tTc.e[2.tcc=h:nNH?{Ũ0Ir}Wv^j8NXt.͌ }ŻE) KڼBًHg hcG1Zem!)D(pQxŚ[ܔu*$bO}t籸c%†LLX͘Jt[Rr0rN +U(Bjfu5rP$EO{G`EDѹ_u-oó׳Yw!Y{ Py>(ST#/5W 3;@~Y\bmZ𲟿[kaQjaA*{]S&2q?u`c=MHȎE()bgᙍaN9Fbv.*ҧƽrR,Y㣂[Z[s=o\dʝQdbਝҤМD,x)10X+>q^nl.=/2*-l:5WaԂ@k҉{9b-:K+h>~0G 5MSڂgS;&Hr65A9!}pMdTqG|RBY1N:c[5Ɉҫ0LLKb-lQzF"0&@㚖XYIǁpCf xlBW ~RH Agd*R?p}&rwDҜ'-DA3b j@!~p؆ doŇH⬶7cŭ_U%&%`(G\e&϶bF3@\b ; 7bU-ۢI XN; d|7izjNjKv”rU ?QtŦV!=x@60CvKOuIf:Y/m|K7vw%ۨZәlx/KY ѐub۔l<`K\_S%s?-z^%Ww,kAvv)>!i"<s6ZT8 ^Jˣ=is/x  ppP( :S_Zz /T9\LO^<wRdqQ5=dH2*K}SrOjU/3bo=2lʮK?kaM.]BB /ᶫhn/"ClXBcBB!=6^A/ڀgHlZ]R*FL8BJb%&ǹpLwnyY.Zm}Xm6kz=IIX\f}= OZuA9F?k ΪòvTvpNV $I2P' -Jʹ"g6za:raԵQ8z?\vV Ӷ'P֊=aSǞC9`@8}o0=qa $"bp\՛ ܚH0\VŦ`pZ{>}3[1ەF~a~x@5ŧW0˧kl/:Qew^`f  3k1N-r$0H2ԾH1J96͍}EC9wz+DU8cH>k^u} zyRʦY:iEQjТAj?eYߎ`rIe >k] ]%=/':dUqLMQp#0b/f-5D!gLG*[X9vT]tQaeD l=6cUH'J- 6Zbي7)_y7AqFBȇEy;z1Ž~zBoaA;V ; q4Y/??z2[^rtE,u6&7B yE9.TX׷΄ڳ?S1ËUvݛ5`JhK\3#S/i 'RM/ ͫHJګP߯"‚ 0 wP"oMeo-m~bcҾ ;Z5حZS X)W#(GKPVU`]L5IZ],;"[|gW*Xd@neDܓf# V8 "dg9k j3 a[6Ơ8!+ T{du{_U t^薔rS"դ)X0'y Фk>϶^moPao(4 ~xc[pg_@;Z* ܥ[-1c@fS>DO;NA jR."[a f1мu T# DV ,}]U6Ɨ}9rz$3lI?U4IS/@Eͬ`@+bSGF[%vhn)>-{'7Na6/DhÍnIsGowF:Ʈxh){ iJ_HzAKl['> D9'aH=N0nqӨ6IHY`qhy?DtrXWzd{ӿd^mt3X(MMካT+c}F  jgUZp/"S. &aޭ00m=?`Ͱr_ F v\0`H׬uq`?gUDevV4UM [ݪ@QZauyV}5NvUJ*CXC9js}5`89,$pmA3.;ro $"Ko~w7Jۺ ^J{A+ޛ~69G+xQH8l k섻76VD2}˾N z[0HCj>IHF8o0!)KpST==}s1ax}gl#I2cIViƞ޽UPˁ\h0c'@iJgp~uJ(**9+h2de`dSݛG [fEK'X/#pi}Rz9lX?チeĝ=MG!abi(PnTR'Yihr+=YYNo9s+Cs.pttIdjGj"1u1R\Bgf*ָw!R kE-u,Sܤ^"Kw"')ٷ{OTR^y~*gPMda@3Pqe?=J2;ŷeT ̴̒6ԆIt{ |~, rfM^AtM%p8 c/؆,/L ԗяdpX+EFږN)$-"d5z)0\%*TLhD/̷,ԈP\ųF`Dž\yȥ AT `:T5#uŏwܾ~FTl#YB6Lu*6Oʄr9 I~_^CU1ZᩪIDI;7y;}Ml䇢=΃p"CrQP[ݒTWnTcu?&ٺFvH6„(PhJL#BOQ@VT7j&}'3L:\ގ[Pkմw 7e*׾&$S® _ .D5NIH(BFeeQɶ@&O/'FRQQv!Ȥ/l@"7ܲΌ"[)͇9:-%XT콙:9jʴ,E~}0ʄRt OM3_ڏ$+I+G8A7Mp;Rg2kO B쯝81xc;FRY^EJóh:O #HMڙRPů>:NS2q=6ɡyy!+/hLKN7M<{bc8OE8TE^kb~EAID[5 EJwԥbܝ= /86`Ϸ z q¯҅C0Eqٱ'0tuٳ e RS|#$߿u sٜoStk:]MTzRz8  Hr,(ec=9#c%TINP9=3à$wL(y'?ӖӯtphMQT*"ļPA T8k6؊U(oҬ/77JmE#5|e+">L0X'J)TUw0 ᷚ),wGէVp%/+h[}+Y3M+}66A}\ BVTϩL; R_R|0Z&6@LvWHEu= /b|Ż^ed=nF'S}x.M6;H7 :n n"%&1Hh>j 4cƢJ9J6?EIk7UV:'鳕u&o0)3Y~i:{ZtBXTBh+b꣝-o#,l68ED)>U-|>TL5}S)J?LQ>]w~ ‡QvU?) R$'UVb8@{a"\DӍ3)U :NM) Q3qC9M޿|h x 1skY3HRE˜_#}[TRDvq3YQ~"Stݮȵ#JefCNZ鱅M1K;6~8L{P~h[:9W[ۄn45Z>`ɘ^CBmǍ~&g ; ak$^9w}Y4 Տ'0O;-.ȜF r8Er(&{jw|z"xR.k33SvfM/?ˈ5am+}>!Nu=YU 4а j%$m,am#%pو6۬EF&S'NHiNI3s#,Ԥsu卾4,xh >^WNЋ hɰi?\Dɛx%欗fBOuʉyDucc6;}; =-&[͖YEC@\} Sr/Bi'<"4BPuh2M\iw>>U% L;q)/.ew I YQrP2m1zj]g*[VsBap|%1[#dkCJ'EL&wuBF ~6]IQI%8lBU(_i ʱFc)F/< | M6Cz yGށ(И>[^(4du8Kw- G_ }[0+lZ4ijF-8qR+N9KQz,{ѬJ! a,g X/oS;²endstream endobj 10 0 obj<>endobj 11 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 12 0 obj<>stream xsp_/ul;;m۶cvl;mcuNN:sTM՝Z>ދTEQR:X199:> ⮖ )Ȓmi4Xyyy)Nޮ@kFSM(̼vP}<,흜,ANJꖖ% ho WVѕUH+i--]M*f@s͒` $s;9Z ͍ Q7)fenlts<nkWSGg@N?|ҭ>S )SqrAO*Rdc Ƕ pp2w'X|rA@G70XݜM?m9冻<`ZZZ[}|b_N_>AnVLl6A4t wyX+A4 N K+xf%'g4gUf#)oyRJ r:?Ŵ-h,M];,E? g~@7) dn25-,]큎c-`deӰ9~N,KGſgߗL|0HӛVt\qGQL `daOx8_ @*\^HYX?1n F⟙W:Z|.E]-e%>ece-swWU=r--,cM 6YdɣF)KVPV~ ozs!z-=*M+QFeaW?M}]z~@@Ȋ2L*l6_%v@`,tHcp_W>r6|tcD`:_~8D 94ndpfQdZ?uLB5Dv-+%eXeT$F1q1Mlj&%$w.BƯ fmg0MUU \z֝^1'[>ܲxJ2, הG Mx2HLK{eyq/=G9@:Ӕ9gAk }vf9|O>Aj;ֺXmpf!43$Fq͗C6b(ZLtϬ&3f8limQO@!>\7`lzk;t  aG4*%HXqD~,rW|p+E4&]t~QEi/}@qN mW"c/Gz(}(&D򁟥%Ĥ4$%rOQuC60Nz̯ʙ)(/kWϔ '~p]9cB%; 3> \d=$>KZM B:ϖ|H$6yϲVi:&W:@ށwU ҩvm͆F׸x~S} O Xسm@D,l)i~Z7jg!@,c ZѷӐ>}+*%Nc5| 瘔snb-CQ,|^W&흟7jdiY_mjoNGluhޣo 6t,I0,y r~ς&cS__lh͋\G<%3ݹضZWtu'[ubUy7S(6`>EXRlf\P9?JJ  kJbVQ|/9[ި)D#_#E'Hc,BJ&`=wHdZ},۽S߆#mS&$KP VrV oDǯ- nZp#vT}dɄvPt\2s͖B,@SZ|M_z 4a+A*]c/<-JX<.Íٯyl@;H I>:UIMHcf<]K;e R&KBp Tm]q,g@h aM~ŀ{I#nY<˽265ɓ!$tD#%ٷR٩v<" evj Lah٨Bikq╳SS~A#$^r8zF\'!򄷨猼Dq5l-lw@-9QL߇ybc!O~Z(]bF0H=,Hw (\t'I2׌Yc O CJ w;nnC1~ݾm`hx ҉?韄.^X:2\.L{uiz#BK=&VgJi|*= 3oɞUã'vlx{ _INDCJ?KDO~ûc Aφp#j0osemT; K7IlvJ&tQqNnVg# X*ͭBCG߻t"s5V%/qrS֣ţ@~Yj#'M^8^jdHluw'!TtT)zLS|s!xXM~,])Kuݿ+DI`Hr? -H_$Uf97Ef:-lhBޭFە񊇛yGWlיy(0Zʪ@t%OF\.i2c\Ƚ)8G UG?T)&N*BjG-'HPnYكin;f@v57fM#.+=m 4E?<7ܧ@yGO0@͑a[ֱqͽjζ&TY_ ,@@}c;SĢVAU]iP)38Ma?<0 -8FsQN YmLiB߻'1[̒8>LdEB<%ĊD .%GPcK`@Mx;wB;N.V)G:m{Jgya762G{@]C{ij8 2F%js0V4;Ja,%(J9l=&qK7b/ I"t (>HE V2Ww4N*dO!4a*.˱kUMذV2h[_59:EK>c@F;v3(:,, vc R 3G[oɇVq-5z3k#Wiy*/dbjصsBq1rE;RE߉Ff'L%&8Hu(Qrd֥nWu_?wmcbiJN)lL*bwr&s=T}\7t.ZeA"4$u|ICum84f98 wIcJb):CM}{ &?,o o{>'^F?)a=UڨAEJ/ƅAO1ğ5֍L~g1Q<@qbYIr A4ZCI4P#;k]x=#H_%uZa6`;e R80Ud<5)f^4]щ|k0ƵoAz#G|(*bz*sZX!̇m[qG~🎼BY_A^;HW9rz,+2P=f6e w}`ķ'˯(`6?L<7Ty xd Z\Ӯ-  Cː #]jCX'Bϊtd):uHK!Dy_`\jk'*wOiw8ߏMcx-tp2޿7 HK& D=Jrx-*oZAcDŽHQ뤎R"`.jѩ4ɏ*_ *vGy5a̻B^D0(M {£1oK7'ZQT~W K=!jRuU¥GHs3kӃ¾B׎)6]nQNǙ#ʹ.+jԵ5Z_8N",;<Uxs 3-[4VRzOj9S9P@FDKzm8(ay,ACoMQ%ɂ V{Ck M"H4s=)dUzg}io7(D5*#j? 1H˰0:ȹc STZf9,Ɏp6rFqDC%ˌ{/q׵]dV](WƜ>o/kaɵYүAmHǦ}p%B{{X~ƽ/by28&_ı6 04Xx3GGPU B 3G_B?)'W0Qp^3nSy"*b?o9  HְZƒ}w,ǷfeO_4Z.kTk2U?;"H"gJ }Z{;UHNDʓ&1;{i3v.51Vy*K7;[N=&9[̇0v<>`?֟ -vX{@9b3},yd'{yKVUXż:8cQcql  2YR\'Vhi>r\Т)_8c-k^yWhՁ)ۯҁ1!F+6Wz|5O HRKwb ZȞOV_<*. W6P׬K$%MكzG^x}44"ԭ]8-9b܁gv֪ydXˢ<Y]ƖESD93 .IRIfj+Ly~n`Ƴ(w#x0UbՀf _G6 U;#qtӕ٧7_]4S&W8C{;=ph2[R>ꖰ7C_CJne5߬+Aq-T}gB&*nF tPC0?bvY9R bd>&Fv~љ)UOd53Ch0H`,}=d>g{W(iq!/Q ùZX؅qUz 賖_p$ǦQS?ޕ`'6y'^.(eQ;"jnyٞkfܛvΕ3Hޥgi,4de׍U~U#Wt<o:B턲ɚ/uw+n0$Q~) vF0|cby-YXFwz77S^kLlI\vʹ%W,E~t'dD*}tAB-oC=8%ԩ/8i ob#'Aܑh^5䄑2y~TO-C3*ᶸG`<%5Ġ2¶K.b f(~2TYkAcjV1 C8+ , Rx̣ "|zI%{ISRC;wRuBI٦*J~nՐ:~#4FMÛE}.l5@2gM6z^WOoi>`N*y%'s].g%%&(c/,F@53-I,Χ^ίRbsZ] gK ?iLq(?g*1V Y1坠cvߚ8<}n;93#DWm3/ k6OIMP!E=G=PͨL)1d5/E]cO+:TyuovĂ/)Qu'8bdʿ?B "3zU7(cPJ\}6PaI QC;&jAG3ay}P:s;bB%(z> Ϙc%޲h S09j?l6\duc [lcp%7>ghm4{C]X)-@<544O]g-:.ym!910cKܠ  ?B.'GpCi(lq{XGX{W]##[=gdw99gg"wTx_LYߕ/y!aίcX+R!6u@0h8{kqa)?yԑ砉ks S~Y~q:;vVV%j]Usbemr}x얍2}$VF%ټ ֖壞b6Bp= ^_NB2RGռyVE|6{k{c1ix65;{<Hӥ]*N1U~)YA%CN ] i1\hTqqeMvpM R=f7xet$K')iw {c5z]t41-$?afE_S|OhqBg &WY]RJcHJ:Fťq >CעwUU9%9#З*Oĺ3F|SB>i`:gRr8*/ ׿:4Â(= J{e )v(e0/䦢TEiMfij%ؗ"+ ]sd!A0 DRaX jZ|[ >1&oѰ 1eև 9)>\\^a/7~c}R[N3W#ԙ0C@prAnRyBY4[ъ~V ;T55_Otu‹$Zɸbbyd.#6R]O8o>;n^+Hջq!'ir?L>@1ͼDlC.tmcKڎH2уj ܟulwr|~?S3Ќ:[,ĿK IPCe&w2Ûv]~B-zggE2k'qK;lܽk{ kT:{rd;k?'/^4/TpziGEǞnEZ0 z >\uq=e=&%bW-fldjoI***ξ QV He+MEAC-d&=i*@7 9iTǚ"WB$2יqAT!J#wavQPfd[$'"-9O~!l[f_pME,cŏ;\|(!R(*.#/5ƐI#-ju1\ퟓw͉-Njp\Bt *ZX|GTh@AY9$w|i_gG;TY4$SWT Ĵ @v$~fWqCਏXMdوӥ!=fI/{9:'AucDij:HCLL.R*gږ7@(Ư`:W 5:RE9(x/>1q/M෩nz#%1%-qֹ:ns9hVS,~9=q}ZWE9{YݭJ|-ECPU$(P$GX{pd͕iƿ^3wPm]8nwNOA{~i EYF\mP/; dJ cl_b& ڴriu9rs0oمZe7Vh1ڙSg|l|Ş6dJC?-CS+ltf<x.m|xmh Κ2q~$0-[ccNږ!D ިp6V0 .{a( YxGn iNjAݯۻ=s$iv.82 4Ҳ ~5ȯbҪ* #񊤽"Gq3 #5gs(,^tĵqF0Iǃ R=NX2pi]('|7;P>$d\V/ǢC7C8̟! St$R3d?#' 4;؀:NQ/`Ԋ$$0`+ P}NВb]3:h/n4*CݝDmtd/yl @"*<pV?9b[-k'NvX\0w4ܪx ^>G-_ޭ@Xv\ "IbbS2Cٮ|b=OMpng6-uubHueP_>QE Sr?2ՍܫQ]8OYbdEH ߦw*!QhdOo}GN$puPx˶طwC̨]EZ?x5a\9^?paҘO':}1~O@0$^kngdeTxg)+2"c2_!X`E5A7Oc0)6VkΤ;SO +Kl0E<-bm\TRq;R9\iW)@W}mTcC /e-m9T4NrKM5M Bg~88_M)6{~_)t DD7#Q/Om  q%2kLZ<$u3;TsS1^x@ͺv^ ~jn?=FL*u^Ms1l; w1p].M&NZtq ЂaD.(T]+J#n>u}?EX`]hjn?%I57{jڟ\k{O;->mYZ.8&hE(*~Ytz9qD Q8UKPd$8ǎS4 8d`˜ezYL F9"Ylv< CFtJtxHt MTMaId\_ڍ\b^-Y@3Ekhb X3>X]\"9-GY0:a, Q/CI,z'>Wf٘K'*h A]7jXʍ*H&WBITV&93恻S>5&銍F;9G,t}l}+K-AB lSɨiwZaZXH7_cP*.m)$nRټ8tfMi>jj!ϛZL!4ay <ؚi9"qbd3$SQ]U>(22 Uee>Kэ%)<cAR}.nI-o *0M>s[XmaR`t^T́r]B̋L])ziAwg?nWDiԾR9^̕((4l>jA#';$Ў2ebwd25S"hrWn%"`<ْ Nnvi9ʁ]Ey룤H}QA]8@sxabnhRb(UKJ QdX֙%X-%}JugsnMOpÏ ƒ$F~~?bke8ײͶSV6hY/Ux1,;'qQ8̷W2 Ω:>[-G݈C%jR~Ga'3ΜByϴ,F51 *VW3w?(Q [Cr4GzFJEXun煡ƈ&nŘO4t?NP qK.yrfK@H*-1ϯqZmv{e8s.ߢ^cGq"3|< [odxHNyYL樿xM}et=RbId){{,[Ko)={B EVU790HhdP,@}Eez%&+v-^K.r&G@ %8ZJf\a0پpJbeB~ vsA@j1$֭T]_=ܩYUFćNMqƀd^gqc#zͮWMELU$8X KyĶMʆ*bq$n zM2pgy{*,׻A9= s@MV$]D0I UbZK޷`AWkp5w|g-FinP˂/?| P{'> X% `&x0|5䳉-K1P)+ bb$|P갻3,̋>IiqWH5m*j[ #0c1r|Ѡ߿[Sѳȯꎨ0ĕPIH޽m-e]3/nz:(]A-z ̇Z;!&5W /y;s.|ILku.2Bk<}wLB-7HN8)H m[գrQF>q^" F[ʋSHZ?4n(DY'Sljh OvO{x7 5ϋdQ"%Up4VWo~r'.+UtFn GHfHɇOW HSݵ't6Nc&m0?_sSV/ǺGAÜ![N,+g \"-DT7I;\m3RY.'[ۗC,p.r- '݆IMo 8{f5D1Bh‹(hGeޞ4OCaFQܧ%B.5;A~T"M 8wSP{u+v\CG!$5L0@'9@5 Ohnx$1N5/%2}84Pkr! $`F%W/Oˍp84YS ꩘"sզj}] JepC!g2`JNhCrp5[L~ QZb}&<{ļr7 qtd@!k!?ke\MCJ\HUmw"A)0 -č`k_c~^mIdI ;vCp `"/p3w!@_H6 ~:dҧD}3B>_V{2)3z@v 2}Xԅ=fh,91NrpfvkEq=m5*8)|kyuG{<;=3@_qphR NN3=p b^Li_ G=;#5rRdT9ѳI D&ՄkOd+G@?Wn4@}Z#3NEBg=T~/1ܢE$<}'J0e0m#n{3_:AfAlhHK!L9ĪGEBq@, .;/ oz {`V32`f+{S[1ϩ$SC+AvNߓ$Y+hHamJ3Z=9ݶOO 6k r ^xr\U`roMAH"IŏDr*?#>UЁgz{#gbᶜ+A]e8zLYtOj϶ Ѹ癣vjpu??1c)f\?bqI???pdhc1M%~#/GEfD u;5rQV]({SńC"NcmHqkt}w/>[.Km㢿lbPM(Yu4k`NB1؉RCAܲ[[}b}dѕmiɻ`u;[l~mˎ{)GJ-m.t+Ւ?1QKCџ!KȠP_*@տ9L~A0ޭ()h8YWt\ D [=`+juld毬tzuGW& .ʢ΁Z lSYgIMU (jf]Ԅ2)o1:Τ?kk"_W Th3W\˸BBş2(#kˤm>AbOk}$f8JLg庥i&-U7Y=X&shozX'2( '/璄Z~\!ׅVN۾csj|8 5"(#٩ j QB9]4O Xj6놈NC 9]x_B7)VWq3m\=?y(kzx4YGO2k29MX^N?? ) @^n)aq(3L1ሹxAJʆZJ~C&"\r"sG )IVkZ-*UHѷ{N垃yA3TߵQO3З GlC-.$rs"3>ɏ)g6ӄUAB)z?7ScGҍws ӱF!@nt[+JP\' 8/od;bG]GL 5%z!Lj@& +?gcaf n|lL* ^#({DMx';z[7ں:^Wc&gU|X4\^~qݶV#yKÏ3J|4]Igdg\!"/ۢgR!so!YGAis_8T޺U"70m@*}x\W$ 0 !+P%9Iyd+CcLBk-j^ w{$T D}M=U7X Ÿ#@UO˽N.8ǡםT}vt0.#ѮMԕIO ύt'iok%hI.3aS@WX|ƺ; Ի@ FVebAGP_3jKhCӊW%L2q!0SY(K_U/Kks`6 tשY6{CbFo2FtXN} OłБt 1I,Ǣ|bKP]gӪ^qš𭶌|i0i Kt,Vhy%+ϫe'Wc1[Ag0,֙a %H%674bхM/Y( )(p@ˑ~VnAr}4."Ttf"Ѹ̱.+@[lm)""mX/jvLϩiV\PS9b}D_[ÃMiŷ OWɮ#E޼}3Tj*>|Bt5׼ȫ=(zw(ED]j8q*[>qFӹmg,yV8uSUf)0Bԟ\*rbJ+g[.$Ɩ z3F[g4/S[Z}vi5|˳ۍו])d:wʲ(W@kE57[{|78m89֋; W3}Ejad@RfR<Þi(7A#po Tp°΍d3ulYǐo='E6eM%uz'_E;iT-KE0_gfB Ls㣚I/?J&:zW!zZm~ -*~آ\b{g_>x'fjUIF`!JČX m}qk <Ȓ*V぀ME'%YUTGq=ШeKw¦[ut\F`QIS\^L%!Dt3OsgO56>*K3$mcr9FQKu*(ᛖܙa*֚jF@3sf Ds8dqwf5Az6.*H``^9Χ؃!-jc(R | ˙qǹ3QVvHH~c[@#"\{_Qm~l~6k+yFP! +CeD/0Zr4 TmN4=djN1ĎR>\j(QiT{3-t*d UHCf˝dC4w L\n֠ *^6YAX~S0¾5VҗO N5'%[V*oO~="Fkʚ5y*!! m*Z(=`سaM@I̹vGJ0X#xb؆PӋ.77o>@`ЕrXibA5_,RPy}v K4^Qu QTlke0uХa,a^)Jo=뽋*/H~z rJw>RQ<ܕ{XPۑEq^ҫhc+RO=uƭW&KN BD )iMZӌ #E8]cWꥀd#gk'Hvst_LY#3 g067 $іev:(Gu99*)0êub]Y"MU{܈v2?v! ,~PlQ98:2);fg}_s&fnQpbCQl3/i 3CDa;=Xk"πyui#RjDhUoX~JsSX<6R ˜0.(n1p`O[TN4M/\]I*87z&3] 0`x\U`/ij0H Tw>ayME_,Bn] Y0 h+_pA=0MS5~WNɤdϴBqZ,eW8 Dl?s5ǹQ䷾_jN G̉GAK(p3 eT/0W>a=]ϏH;yu ρ搂q /5l9: YC_Q3"*= a>;NFzZ-1daPc~JD_e XԵ75:oZwzyd2+H.6P oL["'_Yig1g{~x[Xń;IX7O.:~*vP]M yj> ӑp~S)"( K8J6>e{Ml Z"l ]ná 2oV(Զk4rS=3Ԑ2WB\zn[Upi .^Bq6=I¨[i1O‘)I;5:]fY'{(RMfn>KpP=TZj L/5s?$"BO>k؃hp\a7H3EʆRWW%%ߊʦɌm#oۍ*7jPMcbɤ%ێȔ@d!sxo9j[ !+1 `` J0|Z~=5.%gig*gz3_W)8Ɨbf3 '[tZn='4Gs6C\b@ߚ?%]'n^Gx9dsT6}ORLv3}ۚ'tml nBl룔*$"y'MVq>M| w0cuX%9ph8j,R9ĆtO+x+QnIC͟J *ILQ6M-n[7[~ Ū64сC9r` 'ϸG1 _\\O?a>hwϝ#D^b=nk엍%|jSd<ߐx$5 n_{qt(jY/> NGJ6v0G 3X#d^K8dXY8ȸ$Iv΁@bb1&D6D]Y1o!ue)4 [_%RcIN % ']8KhEGJ_uڅo:߈,ÃYc0|q&p2vBe_Fԕ*O֊ /9f4=dXtUlcG[Fv]c85M-ģy`Uj HQZB9Wy2-g%SS~C߄WrYge/@EWۉP܃` K HAN@BߵT:N*@Ѵ 4h(NsQاvMD6%¹8:~"Gcffoo#|;u@b*"8W ג ‹ [BxtcSY۾s^;[seo+U5цW5p#ߟ[~4P-)=˸30StxSmB. u4I.9E ia3c¨{X/@Ո5mG }bpodnezmG^Mfz$iQ#HmV]8@Mfj .ըl0QNyVh2+8?.hG[ClGzÞ9IdR8c=T 9[xer̖t9x܃‚*p, |7XڊCxm}3|e!NA_g?C[]n=`4rzQIT#zX6LcF`qya4$^ͷjK(A܍{>R{iW-*|UMcʀIO `U8|SMXn~ɦWj,2e<vj ޯuqe Uo`)'7|Li *>1H}T&m)(a\p<=8ҠoLvJ1Y2o?45 VLn az/%xItU%`_;@6 l&ۺް@O4ޘ8נb QBLг,Ibjo}zz|=vj#@rq!_o+q4D?b/RQz">? oBDsT/&B^^'n`H?b.߾Nر{zk2P& ȫt f]zii}StaIɆVHJR-fՅ15^j &.ʔa&OQZD6<7ܘ?36P o~㛑\:+\wMJ+j:@bk%BSu]ɜ8 II9;nkW"mL L\=>{2(HjYyVBVఈ{u"/Yn|\]_j%&aolܘQH64Ӳ_F_.8l((Im22cFV0z~ݳUn?\1FJj~XF:d 7$VL\M~#0d>)r6IAKk}8湊Z,ھp^Q_H| &DyQY>JMr7>>W$D9Nٮ6V=]I$$$B}Ĥ1ܾ(E|$^:z ϖu}[׈zhk'Fx>ùdhŨʃl{&c[mW5&0WU;`{? V(#W+1`W7d4^϶:[eQBq;GFR5?Ӓ85Dȧ;C" R0x"0u)i+ix\`fvDN]EWс2[$ 48(3QOmn_Lhmd Kb^9hK([t*W$37}p˱A$7>,"WnX3^XGòMIϊISNș9R&02ݢ*(ϒwT́xԩo03Ht;P)$*tz>x 4~O[AEDz0SIz3㪅U͛\\Ԣ7[`0:(JC7v`a +ΐ*4W~ucV&;8HHJjGT*ipBWldlrEʃMO;}[A] *c`a~m?@.iY~WP07mF6V2" yd1NT7s3ssvzJ15;L52Tz!oi CzOSZgJ\GtuCĊ;${,?cAh]-r8|ae:̒j˷xvAxvx,RQH>;sK¹KQ7Y^jNQIT1& BbQ[߳`cm+W+V~$oe…lB$S_ulqɵw_~!8 "@,5I~VSvrB_xAA@B+&۫nc↠ScYU$GEy7@ ݐөA(5bJO zYh6(L VäEn~plM9OKo^{x(0=>5Sd7wR j Da1Kи^YeηOG#݈B3SH'ҭ3Rq~&tG$4nHFm`b03S 2Z%X/0"jzdɿ0~rX}=\nf@ǖ<05Ugaf|( PjF,-P[7b=݅\jEmoH)'0N:-22PصWYg_G;υ L74MQ:[c w 9A X6JdB ~1~'0KM%pN?iIER0#&-(v` $) m=wKg>ŖlSZ; 'bձ =!ɓY/((Kؑkk_l { (^3:!7swa>oK-j@\AٽkEy3SkGLI(6Msi-h9@e΂i{+{fu&Ti{ФTN{7t⋫Y],ftJ[m vx\_6fƎX5з^-=JS J~fʶʒ"81/t:/J_$?;"9<12 h+h*) ;"\$%߁BvY-~uG[mwʜgu3gu@v{4;0.E-V#dpyگ>f-[+he[<+ r~ϝ_ȇ _SՈK9,WT}<)zRIk*8h$ (H EƗwwrV)GrK$lba()ܫujW%Wy?k#V8n%5Y ,0dCt. )ǯm[;/Wb[M{-w%g(sBK N#SET^2DE0 % 5mH5|5lWq,[ YU7R0M"=/+cYMފm-ߐMj[˖cxѐ=\P uiʁ4-z(i$Hș02M X.[†WgzA؋˫ qf^r+vDE6osKZCpnuTFM☤L5%.NoO\m'l9DU}g@gtyjl Zhp=+cX o3浉 uɃ<%gAfA"#oK;2`ezX_˛&tw8#gf<,*[{vfX\ۢԦ~lHGER -Y'ݰ'xL6*- 40Q+~J^8'wռBwOʎ_KGR_S7nmJpI@qz9_@)2ϋWg!md4]q뗉 q'\Qȑ\6?uln2f( !6d3/Vv8F/ Cd!3ZCF ǫBr*!RCȻ*z{j]YL ȫ=v"!rv.6G*Kᮋ[KVr }%dqiqq+Fib+|䱏_dHIvtD=U.mm?,LˆZ6tU3 b2M=kqni޷Q{ݔӕ9.%zFWS-6x_\"|=`ř}G727HX(eI3r\90h^^O=Y?BVdtǨuKXvK3bKϟ Egܜ&<]zpGl"F)g@U}3X&d<1%Ė.9q{0 ]KтA V9 R+G[ $z)EF8ʘ(Wh.꾶R;k]tp OmG$/ R+aeeiX_!%Ee폵ݓA7L9B.* ,ι]j=z¢f1DVNy4:4Ni7uOa9̝d0J!>aMFz-ߜFZyYa7~]7Pc2ť(AojkC4G |})&|art~`Ęo)vP78VjY5 Oncss,dhP+ 9!L3;d1[c7W W-̳-?[8d [ N7; - AL[ULBMrN݉8l#0\f%Ү=Dݳe O}pj'/2 v &{'=̪kۺ!w(nSǛs&tWU"^afu*:/=YFAԘ#jwΉDUꟇzR'R5dHi`6y-StJˋ4B6J Q?uڝ40uc5'5*g'GٵD#g={dgJ7 yW6(v}"pCsoSo2o?BSaxxbaIK\G{K P]efrt!$loX8e5#^YH  &{;g&7XRl&hj@/)\D PE@axg/IXeUi+M8{D-O1|wtokQٜ-Fm'aq@? л snhTmEHmە4T"4< F8;٢~VCYT}Ap.mu[EOr< P]q\cPc:eQ[h"<Tlgd~5ò<@.ui†LC Y NXo2 b$r>oj 溢NϤHT$h̭s{V6+nM%O#V#Mƕ#M)|l[,[./ciaѠȓ*, tsҠ1,Ƌu< jx~;$|7yxd3uiDy.}R9Md2+4ngߩ(vi8mnmBOz@S@3U7~q`IWC6 ]C y d)q g'?1!DYI/Xz27x;ܗEV_E]ȍ8t$O~%56?ùťqN,|-+NU1"QMSk=(zX])FYΩP0Q ^đ;UgB)%h /kSO+ntG&mu\-i^ Z-  eI(+幁4yX%oDS w%'OP- Wр^AsVޡU eS]p-`Ҥ6wHٖe\vԈ^;qq)ݟʵ3W ,ZFBqA>xol^Dfc{v{ 6t2r0ˆpRͧV=k PEkF&O+hEiӹ"G~ h>lBpJD /gZʗ^)X#HNh}± !*J֢C"D2;nj+2-qv܀g֠$MT2΢/R#,sGw|7 ŞRǵY4ȹl;W0ɴ\spc ʋKS%)XERPꄩ+u#-4)odv#saGZ?5 ,5W3`9\i)Ebڐ(,tLqBndD`oP+Dn$tCQAb.pQʂB%H+j6 {BaOMh^̷i]~˄Dᅍ RCm]sXʈ&,,&-gsq҇>ĵ쒷8o_"!Ŕ)BD~[[U6+=J]M'_Cb=,J<<_^} BM&6wj3cF1v{A#APe"y*KV0t5X)2'ڡc;5~%?^!3Г`(}(6L`T7e S=UJ/Hy]o$`q[~dhf GUd+?_J w7Ͼ°cZ'K࡯K)$GB{WTScpҶ!y"{C9<Ȼ=8ɀّwBW} aLh{F #]~8ҡ_$ʐV\> /,iZ}*"9ƔEEt QHJ脥7&;dZsZbq9g{-R): ydia-~6:S# 3͝Ib,En`U$P@ 0 |e׫32*zbldkR+һTq?2.$Ή9 Wptg.Pq_/ =$nϢ~o- -،6߈-;-f:3{ .Ku2aU 8:hxU p dY F}(ͨE` VB֘ yŐ{&UGj9=ZxE M`D'1:9 t]9a˾W(Is :!:WUDPZmAUf=;zǨa4x25\HBO K^pрԗq}TeT\Xv$2)`X1K=GxcC¾tX0?y ē_Ar|)]Cc4$M[Z(n u*2ٺzdnȲlMnEMXq}5}C_zP~c ^| #)(]տCzYeŦP Cٿ%m1bdk X4Zs^"Av̷P& $WL}:>#zhJWd+cDvhHXVG\RסP CcD3~$«FM.\t8+y_+ZCDIaA + apM[w#-ҚdDI qL_mN]L:-|O%c>9T.:03y(-( fb 1*98cɕ14)BR]%ލ7 #_\ '?MRUr̜t{;!$%n;d79I~ȲMA-$8AWN\QFvK%Nޖ!zP "uk3kbh&.0`Wdzly*dq4128L$niaOD|Tj9EpQGk!-fJ1?ԙ/ ݴz[n@w IZnԇ `--Ynv7T_$5) ٗ&zu>)2'&ӟj0vmAluJ5 2o9il mZj#j|gW&rRuU9 x9SUW)Сh@J%rӳe «a+NjcrīX۔>HЮ [@4w6Uz+ ӫgFpWOz#o '͛mc>5:B~M15eL2~U'(%L8B"OniH^C`X_da~jvֽ S\3)Pf`\-i pBDP̬=,ͺ|Z93bƆu[v(R'lX`*nHK|MbIgЇ=_'ї^ m9 .V@0zXR|rIAb`rE%+ܸx^MFk564N,xb9̲Ahs4"ֳp/h%DQG+"_A,۠b#v6m߾/=ag6d"A.0'QwjYXMy5a(QLÝzO0O"ŏMXe"C4j?^k6^+pǶ&V Vv7Dђp ރ߃ j2d:[ifXT_.*Tmr(]x!Nvmss ˯/j6$#E',n4x5ڳ]!,%=HaLlK}\]ı sQ)7ˈ`Qe FCs|ρL+5nSY9 ^&Iwi|>RGL5>R)j66,w2>&~Є{@Ҩ?XG *M{Xhk0 7r+T|FEƺ@HvA}P$F% 0%8;2 ]-v$Šܐ3r+L}B0ՎRta4ܔ'injSԾM#6*µ?)svw{!Rlʋ7Š8!҇G I7IlصLX= 0˘讙oo1뒘#ReX  aa8l\X#zYJ<3_QYslR>qDY`MkSd*\z \f|[lVe ;^V2_@8Z8a+e^)Mg+_nI&ݯ0{'jYXt"'9Y9/Dv])l,kLЉ҈Y:Y|hC2?x)?d5UvnU+KH !=y[nBPeUa+'X&Bya";FGd.Mv /!gvY(gŠ{i9ʽ/r f|?0^u>xdfb&j (fXn6D|=Qr~+3A2ؚJ6)~vbؚkMubBZ\l6䉀Tu-o7 Jve.4e`@|EpmB^o+XYSjGY_K '.x۠ 2+ċ |QuG7oٌK?\`Q_6=(O> 2 zb#F4 aho /iL嚃SR:͢Hy4U J|u3AozWBVB)q֤)&O z2E :4cAp]b0e6̨iv|RFK?/פs57KbElEexOQ)rd)FM?hkmE}gId~ܐX.2U05 <t&&bxG ܥK+#Zӹ(̧5X+fFSW@G<5%fK?ɟ[/\}'IamE1'u˚D\%,!<`iW)8!?t9_?K#0p0d%T5e<ꢂY;t?2#t-yQ>RcN| V 08b) =ߘQǥqHZU?rz;_Op g:=DI·*%޶1E'ɻ-Uq/kF>ݝh,gE)k_q;eԽ8VR눏m07lV`JH]ꀩAR`nct W4T wO! 0/ +5"3q $@.v:2I _,5rU'P7K>Jg@A1e"e]!+[jmBPBeNޥo\?}aH_6ӭh=̳ cJ~<_z7O8)8UFV,xkZMP5 %"6YH6 >ox @>EYt$X,cTeFh5wET?UvAQ|Q 2Z>nk#9Y2/yԲ4Hk+ Fzd0-,;iv~j}ӷ`ug7(^r5"]QZ[HT&C7U䯴8j }NCKi4ݽ z"m{/Xl"X8$bN0 '1ߦ;7W@W##`q"3R0 : 7#>tKA} 7 k=r,HS]e8/vm%snr1'?y RE,n>y _gob5%i`~ ~C]Y̡{E 鼀3{Es'B$V3x[]Fe@5lyZכT{w_T=8v#Iʽ]&_uuapǏM0ͿEJ&Mé?Հ|o c-Xᴲ p[:RbPAZA~}CwMKtpQ,tPg@z%;& F1@Vwڼ @?lj5[վ jr1Ҫ_s^ǔ5<jtETuE#6Uxժ8h)eKM>endobj 14 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 600 444 444 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 500 500 500 500 200 500 333 760 276 500 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500]endobj 15 0 obj<>stream xct]&vvlv*cVmRmuCU ڎL#lEnV&\=^ BXfM\ a$,9e/ߠ08cy'T.s~cLa0f=(IvN_}tή8À{232)묑-eŭ)&58}~"Y1`vNjWxa}vϡl֯܈y2:{[R+e}S?]Hl_!M?t ЂVf E3Ģ/rŚ,,qű5:AXfoO\ <}q'1bN1M"tKv&K F'>HUg@P`9bU |Y|q >':o u*2*N8*t.ZƆ'B^{X ۳.%4s~Fں!DgEa5ug\qi^WX45$j?ƕ^ ًALbyi*qEc^AߚaqF2ǑA}U|o&P]5 Lj Nba bWĪBW(6`F13mwK$X>&)޷]t[@3/G"et:,;8Zf4tnLDz +}ލT9tyh7,m{ Ϝ:vA#;vz|bFGW;UTM.*E>Ndğ\xƥ1 YiXz6rs|jQMi]f|,JAɇ(Z^AEH"*8cacDn#'4].uvy{e=:Hxs!=qth茵bD~=}THbѰOS S`-!oZz6m0K M`6\\m{ z/~ŁwT;dr?ũ Agi0&gPe(C^ &M3`<>!_ ߖZr? ޾0k(T!6MQXVYۄ z8`>N]*%k1hQ RCnس.֝^y 4`+-Q"VEFɖca LD{?mG!ѽJTHf C5Ck ^T.kz{Z֩;Bum0Ogb6Y1Tk8|Ǝh^{TGQO M.tĶJ7y XkxX;Tˮ]H%uO3!1@/!\giROt/"G@[YK,]WROeם;2@zO! ?}&5M !G% ٠8bqB"l8 ГbT:=S2{!Ӳ?Z7lU3lR>-*^xa?!e=z;{vEN@}%).j+-)GGa߉%4 ic )_*ZoJ29t'FcKEy*WՃ$kj!L!M+$)j ]u:XqV Ex,i9oodbJ  >]4bP $ׄbZe<5A~;G/ ∳ROϳ WgȒϯ.P s1/x1)/Ųmh?St )ObCihMMo6V}4U`؇[v&$ 7KxjR4M1%[.eh36mA 0[no{ƨ!.<+ܫsx88zj{H3GaCA'fe]qOMx5RD6agyU48W˹bopBhlM3~D-LXԩ1y_p.NU vxuteyA&p2&uerkD5!CY6u? lf" QfgJ4W6'k)r<“fMVʋW/eZ(4\ml\n{/ #ѡ8z{$, Pֱy% n 9Ez `rGBiM.JIؐTEK7ߔfVl1.e촕2P6FRV=ubMIOqזq:M޿_G _ջж3΋3 TB4Jm! 4MծF=KXʟн|[SՄl~.1f^~@ vcWeK R30=4܌E˯05JH>Q)P";q*| ' IGc~+"]HҮm3D}Oݭ N&N,KK=7Ba@~*6"N tE:ʶ<\-ږLzZ!ޙRTD~VB@ Π]= M?24'9ըmq'h-fN84&vk..xE+q1 ݙł-4SAΥsޝibZř2H^ڦ?A7q08mDVnVJO'8C7ng&l13CBN%gS )~9`I1oYspί\]5+YG%EOby9e0i,}9h}4„ɀ`z90sTI2yI.xk ΩdP@K\ng=dnҴ8jTDX> P\$!>#nCc}|G=bJ6"zzgAS/'k}i'TeZ7c9bxwv,: 4 pؚ5^gxI`=bM:}܅Gylimgbh9<r=a3W~NdaCbxW \PH-}3au87Gw nG,[B3Ν 0NsJϚq><30Hĺ#0ѷMo1Cc"XmvHLFD*SnT 2g vϸSWUg0[Q{Am 3J0>Kq@Uvɜ't@M 3X^=c" R/^hݞ&̊Y )x=Xy  WTN{Uf ы1mU4Tp*T[M6˟VEГ頡QH E'oWY*-636p.!x^ѧh9K ͘x߄k/w|nHH>PFI-T IYxu wS^FrPVån0*wU@Ead& V_3 >Gzlw TGC2#5Z!\Y+e#V Ӌt]]ܰ5?U\A>,_ 7B!%Yj 5{ Dnjf{VZ]CdP)Pԥ|Ĝ._ 3O~[ KIm'-'r E}y"ﺬiWь+|[~N՝@;’n TpT:J]k˝v |gVccD2TtbaSe^@eĨn3LFs53dZ:j'{?3(ӀA:Vd/ 3:Qm*hT&8;9-{hl9YM C`>6d~dgST}D\5'qDdep)&vhQ ]r8%Vl <"ݣ <ֽ]I)o 2hHmѵ1k/~!>x6:ܷFc\>=¦,p?0m"ҌB]غoݥU@)֘F7!l_)#+Np6 ѩVWUHC2<4l;,u(>BP\$& {ys\0s H])b3ԁeĈDh5Qc!˦=|R(53. n)Hx A:GGNX7uT[^GP9 <Ddc;b3R $&reswB!m t9Ny (N3Aϥa)M睴l^x _yxYK isUMMEG#8KV9+@ݩ͛ec\H ɨ2Ss z"hH˒\#U -tCLPb_\P*qU -$7^KXVx?x\Sr jޭ!垙A4ڛvg )\wCSL$(ZW2+U\[ZC>-\rCyV!d3%ŞgJjj"2 1`^],Yuݹ"TH&۷ۛY #Yj[ =ܗz8ͻv[u(WfIqz2R0M"8jPsa[Y6'Fוּu?ckia{I9jXkyVz>㰰L&CnAey4#gA݉?ptScE'b5T$DƂPDEpFwU&/8`𾕬kzvr 'IݕB("Qҋ@T&֨ChnD*eXG9]@Kɖϱ%'gk̼gp/"\iMNh 瓡J I; &ɠѦ јFUe; fE(/+F$А[:Y$|i%w'='7cZ-߈-o5X7qkL1 ^k`ٷoF܁~sm:pU Rä[؇[>JS }J2iY N\daZV^z;٩3FT( U(btqnb0;M-;ν$R|qqN[\dGr h;eMǀzViy( h dE|Np~?6X>TɒȔTW{W'G"1¬]GqWSpsC=]3-bfԶ 2kHBmr:j4R"8ɐ8s8Nu]MJ\X쎝&<+T\JYSf h`9y5WFyBڥZz++5؇nw٬mv/S #N~I$xbm؀WH\2qN&0*;Su"\aiLl:@*+@@&z [ۚ]Z$xdưetWGԩ@\k4yNņI][p눁I63 ˁ>Z7 O dhLτ*9׵;=47n9w+9;)aO6-;~R#[$w1f2/ />L FT#oGw&ujێg_\^=Jw'oAQBRUI\eK"-NsuNj{1 !G<\%Y\|)k%PhoN^k餀,SV+>lO49glx7dѹ1>7ڡUe!'$f!/!/ۦif Wq`4,ScSPmmt㑣1 vGAnˍIh7Oy}u E2^rerC- )c2*MXM<4m'4ÆmcǔRs[&/y-^Mt ʙYgik+HFݧ1c'=y 4MDdIL8Bx;S1#iofQ 2{55TvDҐprnnSç [Ֆr|RHq{דȳU }dR.VK_ySq-4Ve.M-ϢlJZv@EQD`h&=|뇋8~vwK9$m67\aH* ' lf>] l 6£Ŏ! G+iXz>{?a5ǣ>_Bڲ3/]#1=#JD~:HMx7d F2o[O| eؼ") !98ܛ5d\ ϩn$ąT); .MyZǎ=Ra.K܉O~۱uoB%tL JȂ$U7>A00HzLB90T>+1)ǡfMYr?M*@tX)C Rc@ϳֹ ͆o+.v j ˇ4q(Lǵ@@T*o5Z4%ޭOڋG :L & Ts ,[Mض@xΫ*L}P񇮏+V5q0{Zśѝ2 Ԥ\Q{mߢiw}NeQUGnwtL 6*Ot`WSETV 7D؊Ifۼ̡0e»7&#RS Iy . ;ǿ?@(AMFˉbP.@-p \O).), k3MÃŵ?m7ve^6/1dZKpu^WhEAFq.qX#Q?*{Z;|i" U9q=xQ '[TduYTjꅮNZFҍpOSH_|g6~a2w2pN<Ћ%‰%(e|.鶭0̙HR^#r|٨S4@X,׸|8llqSprfyN& F}@ڷEQ%/a=&>~?2;b%0(D.@İ U`xy27] o||%r]6AhՏ'*rЁyf1p4!U,` "Km/fPP]2sSCٹ|IҧNe,A~J+ 䆄ZJMp/ol'ݫ48='o+@,W q@| j&EXG-0ؼu#% V%'PcuWT!H h 6B&q r'Ed~&; |&tGNSbWJ|Tp4Cn#c,aD)s@O{{ zI`Q8&}{$K-W@زjf]w84%1t}{DXC=lZ1lĿ~a.<:ќ|,_ _QR DemP+=ʑ&J`Z$r\f"qOK H[a8 ؍m<,g˝jXMjt+f/_ݏO9Ah~+sն{/Z?nJP*YxZ=c}2bbrp0r9kG7X>סamkaB:spG/L-ɺV1CGzW[R욂ԣEFt!-wjݖFwgC`G){rAFV͊mD-#ng|{KfšO]9DAC>L]M&]SD9"?gj>FhI C~0e~~G,6bI߀ gjnpơ`QH  JF0c䙜rG3t Yo#qMaEy)&OKJo#DOfgrQ5KfP %-RTx,CޒUyt:Wpl) qPz}[@ט7=ǒmWeizOIn\e L)e0&$W 熋m p.2xχAݖ(,eBYI\}!H?_fDW^QI16 ד2`T"L/Nqnv'yԉS\B .UF|le51c9V"ٔT>Jl͙$*q]GD ӻ4sM%]`~FBskDoGf#Ip/ ~n0~svXB(CLZiRazϸne9MOd\Sa/PJPѪ(MHD8r'о$%l)B3Ox?`8Qx77vNW WP^IX;{5hMGV6'x&D|$`Y3pZ^\<;/FrT 8I)r ۩f(*vc'v_ Gr1ST=Dw;sIS#p:bڨF9GBX]a?0WvAp}`ȱ:`ĺt&/jKXI< Et4R/vA}ʫIEƷo~ c DA²<.[ʇsa' 薥}}&+!9Dz% W) <0l9"ޟE%萅ᾥ7鲖 .aSrCvsϻV2$01f˻Lcg*߅IRA+o!6㷴ޘ#{M=ݱΙ5W!wzgj9Ǣ`E54W&YzqpL+E $6C+yMlJ&\$7UWϹ€?tݓeKX֝d+z yqƇix_(l|f_#lXF]r咋M D) { G;@Ŀw1[vhdrN!Te簫y]P8;=c`Ţ?&N+}yyLO9up3w3"SY}"f5W'fȞ凌yZ(EiL8V'[} Qv+~KvRlMz3]o!L9BW8~\ 塪TDxt=dȽ|4HOi9"KB,?ꬼV$Kl%+9N͒27b媐\VP:=Z*eձR>CJg[= \U7[,7a:9,Vl/.ljolH08b/:*C@QF SO}F[8?.2k\L#Ѫ2y?4_ QJUNB0d{x۴Ԓ6TOBE4l#4Tv5~pQpuX()7K.dRp{@0ڕNIt + {`oÐ389EQX$U5N:8ొK]5Mќ;IUYjəȽ EA/9ag!séHh#,)9'n">\u06(ΟQO2{ax \e1`K!s ̩`):;vq ?ApURKs lF8,ik?42Ri9?*b !ft~7L1WsoWcI0??j[(aa:r:/ս-g5XTwU讒{-~Y' *aAk31`ѝo2a_*`#0ǞKMw uᠳsA}4_7; .,W\i" ]#q~^Eu_x@ͬ3 |-t iĬSxC}ѤmEbJŵq|(iEe"G c4`B{-I;ߩ+,,uJw|+ۮtS]I Bvǿˎ{#X/#Ԥ_TGJ߄W˥l1mqʳO:5t>&z׷U,49gARˢfJ;"id8nZʒe\ƧQX ]@&^." F,J.$!9H#7Ɔgݥu^n_&;@{{#^-v Pg9RiMkDRn$`dK<`О_w] r61c8Lln6ĨlX/bGb$Zofql":b(]?Q>WtwNT@MQDҼq` zz_銜?c /mt2OсoCV}ҒH% HMڰ*uv4;$-83o[_q]\|XFQRf-L*i/~}#ՊM\K^M'0[?x9nsȯ 4,Ai@R<2f/hN8Vb x az"OuCP^E X<PE˙ޛ4 d*bT2vYsX0(^hIavu]10_\ $3~[f*l'ËCTNtj S)l"o5Hc[$=K{ɾ.zc>HꦁxϠ:55 c}E!^^OQe!׼bҾJdqeF2Q#$x- l1StVr"h5[J<ئgzܣIali0V񛬤ciάNJwfNS*ݬHrVf-`)-\ 0>[{$D8:4 ~R!dL$ w,OrsOz92\C/ n:>y0/5WPb{:n-ۼ1zṪQ Vp ݞ6 ^6 ۔sp]!YDzw}\ ȏw},W=MLx ɑڧ+6h 49/QDIJr9굱Lj2Ff vNGA)x=nNØA&Ԃ4{9`܈jƩIf]&UpshUXwDwqˍrk2[r'=Od]\ie*`> "d¶hn-Z[F}KCs6LN,1JskgU[SxzK E~Xl-3$UwDQϛ_nSS=Pԃ{'K1}ƪđe\pl.[|@5pAmФ-| 6s4+h_} ]%f+'+޼2aM0կDl5"p;q/ur~[k$rֶ֣ZJX3*f5 Ӣ]؊Rgpj!pD&8~2&x߱l,8G$_މ tGk^WJ_ u,҉ko<|^=N_~6q;r>ū{9qYˆ뮼iPMPqv9NZTo}k5"sp{<;e.7k;C ~ъZ>H)a(i~S9ǁG+i#'|Bj[^M3*kհ" cm3P&Yƾi[>NҺ|sY@(\21tErY+M$ ˽oh”˭_,@8dLMKq\a]QsNK`f))EKS:E {id$AI2Mv 3YרZ=ǘ'k&.V?hV".L VAA&<7K$5 2% VBKˊpyPCXӴ( "8,Lem.0N?IP88ӹ1az֦H#KJma~wvP {ZZWx쬚SS,޳D6MawC) <&r}ATy\qe1k:(VsEjm}9PmɧÚeu"$r⋲()FvI`JN7߳Ym0X˜K̀K>f[ .,cpxO-3KeB<,Qze]}jGeSY)8S5QygN}~ 8XoY8WpϹ{NlU>Xrg X 8XZ>相0"o) ?s&ڐgN{ӝ&Q>ϓDHiQfd6>Ry/m`;yf!~ }`]i88ϒ?8Iᕞܧ L:5#ȔUǩOƪEpZ[XS{+QquV@&d]]dN[l cȃD/Ï3ڐӃV``֩e-\ i=s:i()+@kxx#N\l8cLM#sX 𬲟H$|T'WQn,6[7k /IVWw=Ht'&GaNJK⅂%&mrkeP,>'} 5.sda;>^d"OM4·%3nUޯ6uY7\T݈!'=Ið2&" ) 5838G3Y6$y^ëI lh nNo Sz?7C4V5HãySx<0}LgIxgk T*vN7 /˯jw?4$/!]:=y{L2}PMG/FLƷp 0W>C:LGuA<֌= w.К*O,Lt] h)u"3`MjY0H Ռ<6faOLM(([=gПP^- {>^7Wǚҥ+E\HؿXx)/RR 1;*!%)bnB7Q0)Ie&GI~ͺ>L= _8@oa ywzdbh.I_ߛ?}"83ƭ /ƳstBsBK}`}db®A;6ƅSe_9J=j%mދ >4| ',6A :av;!}2 aIg7WWO_|+Ι^\\_7E(2pn֍!{3r#d PNgA`xi $e߸S'pɻҽ:}<d:,ȳVgë֌9qT}kuk"RyOsZ^]U/*BoΟfI | @LrF[ίVݙ3QR8VUDrda?k^y$d0Ҳ@2kԠNę6™ŏ lN 8ׄgϗ&%͑SKFOؐ\,O#:.ʍg 8c>з!|5ēc؀x%43X\Z%ct% olW6H}t6';uSWŵ 7'rAֲ,d [ۙ7l^mBj_7as|De eS1.rؤ v5#q&Xh1's=ry7 Ǐ"vSY&{=QjEpcl'X]}њ(÷hNw ]m-f)n[Tk YSoVD'q]9NV{_Nش6h jzXWU ?|Ќ V"JluU\{`3;lR/ӊW ت^\í峡#CB ÕK𳷪eds1w.xa=]C2S# i0-LICʼtY+;2Y1^Wtō{ >{P KIwJӀ?p?]&8Z"0g6Gn*fbϓ--%>e]돻`r(p\Qk&6jdwDӎK dחSb7ӼZ ARd'1>bMODPѩ؆q@Rf6"k_*\b^)o 곓 |FF@\:1#.>RAJ \YkG.u^-R@*0 wތAdcVT%W5"eI)N7# 9;\~4z1.̬ y'ڢ &˱l>WuЄq%#"~-Q4*F:Me-fn<, un<޴!Q-ps$ 8ZA7bX;{@Sa)hFa^ ňxʳTtB.0<)0w H\gAq9!H)*T+Chi,e] XY"Rÿ  }Ar5vnBTQGLRfٳU&YMV$\~]Ј^4MXxV[\), ~ͣ:f?0;=-nFU;i!Ǟ|3!B[N G/Pt^FĖ 8/M+qq&8p{UoolkD&D-wH'z5cBHt&r5=&]o[RpZt6PO2qg+M.VHn-ؼr+B ;dtJ48tć f%ӆ,|qW&ux1^$%v!`6 Ӊ+QNKrv\zN'f(Oͧay58F d]qJ(U(ϊDH̘NJބ~ca(x)x8J4lt94g6v ?eloU5;JIR \l;%H~oղҋ)5%}!D#tD/%&':MJT|,~A,İ0L.`7Q͉)Y >CʗT?E b17Ȧ<wwZ<2aXC]1̇wt23&ٝ^ǐ) " t&k7ޢ<ԇ;1Ѷ@bqU*G@Ch,pZF3_O-M]esrV굛vEbU<%NNa+ )CHXK=Yε.&|><Z#axO3)ygG4p٧|/X¥%@]nv i]` Ә"g-L0.W6S۪„>9>%)F+"F}ʄ[Iu1wM_Ys z&T<&AXc+&Z 8yRQxA<b։r(uO_:bf)al̪QW?')^I ƥׯi `<{aͮ;Џ1otϹq l+{WyDHN>N4Rhqepm.V i=r!Re}lA>@🹹Tq*C wQPh\|̕c%ߌx1Cw`>kD{7nJYu9DU@RFx_)KYǏo#"%}*_}aSBM=(sRy)9;^ FQGMΝSjj yRd,wsKHJb}JEHG}=c {;9 Պ8y=ƅJP'y=&~v*Qn< `y%{Rp}LƄƜw+lQ#b0F&(?&=E LM Q~Xb u2p$s3* P Z ȿy *O6tmل(Y{Ӷ鷔Xj vv$)?36vDk: PsVHiԳC̱!DYg+kkCeu/ x*{PI^m*a$I3XS^p=ALl0Whd(q#%˓CrK "TRyNP8G.`E{BCp|'6gʘA}ΦCGLzϏbҙ;4J~抚ŵ r6l B5bCBo::`= _"}7UPCA;3V:5 oe" MȝLEr,9NW;,($)pxQ.ĺ4hM;03UVNά#uϨN[|.J#Խt^$mWj2&x@O7Tu%Ѻo["ہC?M(Od}B iꨝ>#(=H^B1g3^Jri].}iۍ#f5R[=:nN8n \S% Qa}q-<gBO4a2P=RXE8P{z+WS`CIZrS_>"6U`6٠ b)89۵* ގ(FB۝Q~EK|JRN[9(] )长:" ZahcX%l7Y. OsƊdQ>VI߀˵:α*!kԶh &T B/O)8H^;پn|ܯ#FIkoX;h!y$qN^'Xhnf`W!uiyZuC[Nz::9҇΂ÓQE= &'Y¤@'Zes0XmI|`Ub0 WM)TYS &qƯ#:]^ZZwk9*wqsΫ"bD'gZE.fzFbi_=;AEQ&oH 7V|J2~ЀM#$:ٝECj"th8wTA-r8.ʏ/ {0GqɊ;ĤO^]CXm,k&L+uƄܳg-5PV>i\lA?N&,U4w-v$3&hZ2-{Ll9k?w@+E!Mf. 1)2x.jyhgr Emchp~NTTЬ^%zH7x;f`CuClt'qg(/CPq= 4#1S1<`5Wna!(zIg]?lJB>J`1T6^o!{Nx;i׳G yuu'A$Zlsr@$ ^“7XD,n6ΤʹTwRCtvMm@Rsu8 <:٢, oVk{ƔU01U4ъ}&;>.i%mk eyjM goqpvҾMo$ =k<>p + 1%">JV.,R,WAR/^6q/@ aVަqqOs /z-s:z1>I,O:OW1g?xr HN(ОR++4]^mUj3JԂ +]M'XX+oRD6.@zuC>J3oԱάf;5Xʭ)~)ǩ&9uK DŽz km#/79!uAʢ9˛` uj#w.vƷL`|r *@ ڎ=y&V C]']?A|vW~F~# uyu2](q"]O. [φɻe9q~Z|i'vG3C;̠wR&TeZ<(l8!ˠLؠ~%} 2A$q QLh"50W.L*3Kʕ;6w>PV=㎵4ȚC gyg}Adhll7^O]`~|ǎ-}6ᵫdV5ZE%QYpGڃɀK1q˓gB=i7'dH=KY"Mjqhr̿3.I?gU8ު$\e3IbrHxH҄4T)JY'LS܍jSmvs~cmYwosm+ (7V?- SN[gC>S%9ɚcRP"?Bw51~'k sOD86%iC:3s$¾`@kܙ ?d3B [}JrSs Kc$~4jݝZr1@'nşu9[s*jic.ʢ'3s8zns?Iy 99;j~B0|N֛ 4bE26 lvV ADI.PȮm۠X! l4ͬO|}<Sw[rՖ4{,_$S~:6*Fߚioͣc& RK`zG.Y9̈ϔ:dbR/`וPvb! ]=Eq`o:} |QMד &&fBI$ TnHѱNyJC|%B57/ F3\S9x0\7I SK/F[=1%ZX?N{g<NuHzK ~OdY e<%Mۙ(׵% H@ CڷtN<-j@S?ɮ~-C~VKޞ}\t\@V8ʼnWE*խBh01&,5#L͹ Z'OQGj 2  B9X< SRU%BẄ́]'Z! p4+C,D&ǶxvWf?> "梹=Йz"!䂚d`Y6;ҙ7|6[Rsz3Ƅ3#T? L+w<ܱr(ͦurXz֗h"p9}sŐt9a_T!m_7J%aqbj9 gKt^2rJfyfa.:bU' 2lLm"SqEXr@胷Wo{P`=6;MӍ-y*T?Bg"hZO$dcޜK>mYU8[#c˙O}@1\*#2U(YvrUww9d&c1Gɂ0%$ KP($=.=KĖ\T>Ptp/yJy2Ѽ2@^' -Ugsl:<'O᧝L0rmJepuA͉øw/nP ~ob1T :9ֆ4W'3Y#.F?^w WU*=Fxy#_rHJ>/fx9/bv)MeSlxՇеs<i}9!E4&K+!4ę[%[\np 30]+uMpG$"Cɞ5)@1f4^- 9;AhO9 Cte%ȥPWMxMA`c#50{e-;+luC(yE'YG[,_a[J\K!cV}@tù9b3Ӝ1ii8U5>z,ָ 7H\ISf 76X["$,_Z5J;o29|ׅ4OڠhEB7ܳӳ 9C=N4 {oz z-iz)Ҕ1 `ҔGҧox?[+׏YR=9TFUHϴ 5ԑow?-XjTov9~D9gf,Ǭ1=;}U'N` Ѳ̿޹!޴= w3ܝ$ &ogV$DIXc9`ȇmzu?N9pMc2 JA?y^﬒dQx%aVD9$'gB6aiϺoMdՖW pG˿s)Jy a`Kϻ-JXRK}9JǞKlG]$9&w"`#ek9bQTocɤ fVe~b!x =A tW?iO\셰-6DKIG-|Jq`̹ GâW)3к_M* zdEqFX;i /Eg:B4/HşQW&g<<)_)ezb~]: 2,(&J*B+T`~]v53:6~X:M0RK4;O꛽%6wWkul=EV U)YP9&]% d#Pe&lXH,'1J :e[%huJx* akCn4be6񏅽0u4M`'l0E9y$ 0l|jI;VT[LMpcƧ/aWͿ2-ց$^g ηzmJ9ƹeQ2SHe&0SDj,Z /dž52VsѵV7WmpƖaK kί?V K Ίp:"+4 zQ;~ 1+r<}%eSUU&CwΝ|›^N^,/!loHTd;]y݅R]H~Ũt*<7k&cKT-錜"=UMTf~NY~dVybDW|ڱ>Odhl xοAK۠Z? ᄚ=b/SQ|)B c _`]\hBI6}`n-T8^R;x WBd#$xJՆAPfwUvglHw7%C!~wџQj|>śhJ HihQy P,1dmukSG7bh'{YTWLe3ǒ9Cw҉A4mjNwPlxjR ;?`}jb LPR{ϐ;d"e%նӄ M?ͪg5 Իu^U[ħq(ÿl[%cӘQ?.aqf%D **3cN֏@F1FmjEvHP>d7%㫏)r ^9*Tt"WHʾ~N&;C0Q1x<2nd=<~5\C@Q%j>up9jiǘ vccf_/H-+__ +Os2ͨXE@nV }A~7/{c.XIh;ɼ`y,/:Y(,[8-p]>[ŁSh^/ߏgDNGI |!G~w/,7|Y@g=g׾(uT `ddt>'a-4mjYK9;:qBf{ jgyakLnu0"\-L!"|t[ӡ,vXt< Hg-͔D;߳,[7Rwɬ925gWu3 " ;=:^;$X &D1ͮ#%GS ,+DF$ҭ!"x$YP,4k0( {D+KJe17R~y!C=c *MV2`-N-2)Us*{X_` xn r1dZ-0l%)?Md"6زx0e-="zK:)u'9_[s̯x=<:,- *WBXnkPbn&XfӽhP}ڍ%mKm=ųC(?ԗX`p+)@Ml+e(Il9e&6ii`(9#U}4ݨ?Ƚ|]ܞ93ZhDz'Hٻ- uA ȜװdJ[e☩9!nX#l,VFXYFAY 4Hb0^M8e''R葇Vxk,յbkýhz~`B k|ʋxe׷Ω&%EUZi!D0mN5;z*(%.?UήFt3us/eoٟ' 8LѿzI;!L#WHC-ba* ꘥#mpD9FI*MY]\S~v BxH0 Tʎ ^b]9T 15L,F  Lqeh4Rr|W>P4E2`i6RoB0IJ?ϣ=cN0[_4C?7ɗP1Z LF-j&3Ai >KȂcc1ULfQ1 [ܿ:aV3(s zhMXi= ʥ!à˞lͽFH*-Ԗ}nжkH;OND!ML ͪN`U{4mG2Zc94j=g|.qso\R UJY462мJsn*#M$9A [2F]n^p u5x˜Ya>7z{1u2tg(^>cdD!n.b×M.,t"huks0THcfōcY4,z Y*MA?8+ 9fl$c90f2҇]~r%uBTMZ]DQU\s?'5E 6ArO9}g1Vr;9X%B7zm+NvPifۍmVCJX|K et:;gvmϒޘ)Xk2JVI:Uj8fQkj,GRw.kc ]L{8UξDS()ѵӲB7k)˦_?ܛp 7mRv'hU2B`:kU12{n|'٬ {#gLO%.C["(GB z,bJSW%5`vbjhLc^.Ďh-]?SZƳ!fVQD "1O􀯃7QަewŸa=Y9`"_J{:R6ml~I~d <stj ;8NM݇Uf{7ёZ`7 -yҠO: $]sY7e3e h{Ѣxt܋-I͍s2hەwU)?ՋNAPE1GpU#YخܨIttxz|-|ݕlp$$z$}М6m&%\_u y^=PֶzmdR[*K %'r#JW C2 ;dRCl `m`وwWj*ӎ2:WT б߹T J'weN@HTa3rq|!h^(CFȲృS~3黼㷖hx{z#3~ͻ^WA\mjeFf!VCwz|eqs8KC? ?+Ū*:;z:#=g!oJ}ɟZIPA Iޙ_BS3ą/)s |bƝ!kQM c +!/)G6w ZP%[Ti_15E/GdI9BfOWHNKj5C۾Ktrp齱O+OOS^K̬TQgW_܀I=$r56%Dqř1P,,w 6 MGН43U%b4ȥ>U] +}$|71Tnjp{ĪJ(7Qc(aoozo:9lAlk #{e2p׾J\d#o/\SۅϲOp4ԫ LMa"','9q؎B\w/6ׅ1w<ֹPV4 'eʍhG̰AD4QϾMj@vA|vC' '|R~EV_vO {ٗ䓊w][7KxvAGGᖆ uhp 0qoEJS10 Ki땴&)ʆ5$N }oQtǥ5NYӐE5DfC6L >S95f!Q2h& -SzW|g _5̒ʑ䶊TSlIQZK)(g|C '%D 8a5p~3eT5b>RAIQY2H+81/<m"N*WTOHOqm>|Ld>f{jj9p*su?mKs{ۚy;sS  A) >Jp&w~M#3ũ'zr ><~$bB0^%IL\X>Do2= }>?0m{x%h>b-=G_3(Nַ˲-l/c3aߜO@$XՌ`<XJ:u%l9\7L2_0h?|25q(9D: w/^Bּچ ݉QS յX?`NXˀl_{u2y )`|gbVIęRrY2ur#AݒHry_uK&.E^lРӢgV~X'eQ&0idZ,RzAh J}?#95@c}%(g:[4=9eYNѨCAKr9ҠJib<~3S2Q-ZH _G7 m 6eO"=cjȰo]!?3_)O>dmľ39wTTWxyT~Pm?w\3?`y3‰Gs X  2#CZSd5HQDWq<zcVkȜgkm&Cpbh x@@85 x4(@Hծ] ^#?#e}!?. ̦yp&,)rX=K,*?;(Ѣԧ$4]7,t?w^_ Iv`ݓZ7z:? ~LoȜˍUSs|@hnyEOR_ EĜȶM^)`Wؘ{?6&&a8r(.^q MX)4qW)ebq}TW]q9BHnG UW4?v+̂Y \CMTj!yBK7>V0Tלto_lسL q^!01d-iFj TeMc#&x{EN Yn5)1|oRK+=X hEZ# M]+(̞2.(wt;eqYfɩ2" TJ u㳅 PBV_M@cWrf:+wI,ԒQ]: %U b4蒯-`G!mTӳ6+rc3|MD UԊ' \wƉ+vVbx`LIendstream endobj 16 0 obj<>endobj 17 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 555 500 500 1000 833 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 500 500 500 500 220 500 333 747 300 500 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 500 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500]endobj 18 0 obj<>stream xcte].b{Ŷm[;+mJ*m۪>yo:wXGGksINJ/ljo sgf`Y]l,M_v8rrQ' 4M,,fnnn8r J]E(=linZmlv._׊@ 0D$T IjO,r&@;g 5 Eg03'4g/'FgttvZ,NFv._gb3q5ǁ/~88I~]M,\_V$?-{/IS{ /3E6F_,冫y@p9`9_>X8mYl|6cJL:' f02]@eXR?K,cZF5]*FvϘCbg(33-%,=J.&3# T3:X_KS4j+Y@;V4ȿ\g(}u_?6h{9,L_]g,lVoѕ7rq01011_;#ngboOٙ~M-]b_Ѳ0qr˖אP ?@8v0y2_G7{ҰX~2FȵleK8g!҈sOZMC= 3azE!A7u-Z^@<_BNdY[ ˮ Co%ll@;m Lv4:Zz~谑ST>ֽb,.@t5!lPl ʛl!'/L\4O.ٴY,36/kal!3[{+ʗf d5_д%u;orwosǩM'),сef&)WD5+O*oTxV63b*њ.ND}^xn3|唼BoUm ߴ{_^C?rjN('y5gTFUS~R7*jzmF` q=V8EēnsEbǽ'Ru¾ͷχ˵QĕDJԅ&A75O0a# {gG=F>Y8 u1T${әՐT)qCL<Ɣ[11u9yGårՙt>x7Un/ߛfZBi;R>~%LڮcmKA(?*B>FLheIIg,jWT}ΞDkw3Ěͣ O!q~3Wƅ nA׃CG3/Qd pCcqv&9IM+9&z4&T6,,`⮘ eoӨ2=T/^Op?ii@ULVjz0!&JI4&Wn@U*؛]jK_Ciu8S~cKyW@Ҫ(I#"މطbw D"]UMe^eCl]]}jz"hK&#NW\&{uuF[ EPJ*ebxW] GHREH7I}_iϡv҆ʋ͑@E C;3צvm^'&UOaa¨o;t7`]ЕYIWUv:@]vϥ\XeB" BF݆5%_QT?M3`R'~O,RS{}hmI:M5<#0V: +/ow%%`b2/}OvM ooT~,ҩlbɄ(m/(S#gOy%uUeRjS$9hWTj{}A;^e|tE1)Y{+bF**B9$\~TyS ia5Z9!A,Ł_xF0nkPܻٵֆ02 e^ /ة1ūV&A ~5l@ɷ,}\pM54v(!9`)g:n)W߄`)nD ڥ!ׂTTެYg@g;CZ׊rWΑq^kzVZvdSn`I4X[i)C6d~ϼUѺ ^[TOuۺ N,"o%l9QQ eo )tUS2 b3!~b`5IN-^\d('Kt7ނ;|!npmY]lmL@NBa%NԿ`rh^QmwfDs[b$u17y*|qSo}Ma~nhp!0qC?^HY%{0St1oar nK'OX`:oQ2BoaZk nqoS߸>;v]WcsaEF+ܘ-Ms߮53\v*8Ý q2a7/⋔6cρ6EK&][(KW<_9GA~m |7SJ87Wڛ4HFgWƷW@z*1|6Klĭ\6m6 `A(0vhCB. 5 p#?L}DFf-@[`R zG[ˍO|MċVY/VmP^vry ܿgg *:vZ1w,ͼGBx@sxeA/eF 65Wp|wpNsڼ\b*b[e1~kD2*J#F2 8ܞ)jr^C1XDBxC8QI`M v[ZCS?N??]LAxzT[| [w7="$ Ie08"dI2RM ڶ(/ eqPe@W$, 'l@{K? 찥}z$.'CK &خ`<}+=Ǹ99f*T;'deVKDo?fS93c( /Ӗ/7EbSGrAُ:'!GaǟC8f|ˑmilr.Z (B5K΅9#S'үv ʾgo6h<ʞm)  {@VM'W _cI$p + NRwWfrԨK$$1\ IV~ }rTqo[>gP>Fp׸M@~m_sSH8 ~K@`_oRIRzgh<2/p((n=\i|RLozOq3w\fGvěԠЗWTb ,"eW`C#,, 0ʡ*M0KV'QR?PwHuCĘ#%X 2qfrޗylE2GC=z>~,vܿ)XyH݊˔E&c1c,H(!YZŐ}֝^n9(߂;x`?IR !QxS@FS{WI\C_^#U=|w,esR3fMK=Flp).ą0p& ", Uؐd YPE«ySM=]h֖DeĂf*pp>[w&QJcMhxq]I붶"2S9!HȉTv=l3F_(h-%@59HOWbƜߌ(HH&a-iI`2.I\?M6+ٝiO(͗I]&А/3=z Z>BpRH 3XI[' K$V-; ^PK\[_j<|2@h(Ѷ<M="""k?8(96`5 f?_7(;cmWl)Vy\/(h[kYH#viN y|_jBw^$ ]kʌ)a`V q`Kɀ}tp:/53`jxD\x*v--xbAv9C;ժjC f1U|Pcg/=c=E l#W[ٿׅ̙M2K7gI!;آK.& u&4TK֛Ci+Ec0Ӹ<j\x Ey>;Cl͑KEdvQoimh*bB]VD5ƎI{]eMy4($4Os:{{I8I[rBd3>HPDٌմ u:<Ȉb(6=f%QRK4dKgQ4] W!3c$lw YV}+M<SZbp ut~Ĺ46 &_,E҃jR gbrF[ٵЬ},c;NJʯ"#dB%7?8(;5e&njʥGR r)&fHހ?o>]rK6f7UMg)F:-1ǎT2`X"5o"~Qhxoj#Y'ZRk3ΟU;Q WӐF|FwZOnry lɝB?(Jo_!v8"ϐ[Yymv-j wx{݁)Tv GlR9.,cy؜eō^$BEk'PYa`7`<0?8=Rsw,Ycѿ84ow4YXy0V'߼T͒]{"fnUwTW-X~[SMTTD4MBfB]&Id) Gd_=4DѪ3->zrc6IR|g״,YR+E} =.f[*ţG~! 1sE\CDNyޥaatl0%w`=\hC4aЍCM&:P(]%HM4sb115hU zdoCVY!%님CCwQT T ScN$݄=3=1 @rmoq;. fRaå֘g+*[_[8Uq\r25mYډ;szA5B*>r*qϥ-̶/ T}~H=_/oDR$CGls|/ "Pj pfpCWS]Tt>*ސnKki='ME9@ K(۞:5HlPi-XJ["MI;w9䅳{W&j&VԼ!&W[X`No188ݡ3QGm2ߋݧ1U)ʋ| !y}Y< l`_ {U^ A~O/JQω9DJf KLhaɪy=QvF[Hq4fs֓*F`X-WK ͽ㛴;TI^۰jh!.:vT<_ Mj݃%ʍ{qG57z  L tj.7^WQ&ʹ<J_{36}S.ۻ=rI*j*&J|N㝨qPl#$'\xTHҴGXmQa3#t/;[c䞂#Z)n!4׾08Ce&Ͳ +:aڅk[B[I_>d'NgYNf؋M&đpDI*SZ>?ZlOUc+lRahMMUoT/q2E⃖;VNrQh6)-gŤ7is=l!>k#"w=^thi5 ~2?XѨHGſZm9ނHA€`ZruFUc Sv-f U2|Tzj@S`̦n/]'yP똍?\k~pяɣl7 q"@ {sA pֆa:֯jԼV*f잢47L3AH ¢Ī$~0\ܮUPj'(hhwq_o =I-%)%"}i=U)=1,AɇazI/#S[X5 (D>9(ʛz%0] ,|.H*lM7譚x]Z]jL9=5Ν"M7~N B,Z)ģ)?"Wp< KfY'<;o,jf 9ID͏8Epjvi;!L+`, dw9g^N3 {Rg3xGz2SmglnIG&g q̢O;ObH+d!0ŏ|:H˲ŞLws߈DQC]xE }A,wUM-L.$@_m-F |:RÊP=.)C"MP_ZZ=(q% OKy rf>@uw2ۣ*}HB0QC1SsLZF0/WJ$C/fcʙ|JW |?]\V]\TNHJFZNҊAwh($)U|%O'ٙ,ܕdM!bcp7daEuHBu)Z i]ڧRW4PoH_̆Axnb{w9a>LFvn%xTJ#5wd򹘓7}oKT,?ڛڰea%49-3|m._N#{Y6YdVD_`>$Yhbxqvp/IPMkۜ{,t>wbY /`al8 7?#;^beύ$JV{)qA"C:gi+A,mEW]hĺ;b%=hXpѱ RĀ%X7MqA6{3_xs"4Fn4:pĆm&J*K:CKCel@sZjHeU yi ]O Xtd@fOw>˜=\Juʚ~V $ҿeRw|R_;5BpUrri~=[g$*n L1/ >yÂ>/;4G{mA[V4C(LK*68|LnHfCS҃W; 2mPFM=Q‚rmzWۂHGffy&ࠣJMw$vJ-$~p$ JCݙ(A",=DO)j:HA?7)ɍWeONݶ;Nf]tEܘ8q UU4 JX5+$] 70cmgM? E^._kn5̣Cݱy)@4M%_785̣\14|V >tOM 7x[Ë }z -ZE)CtYX(cPB6tXU:R j?A3ߕ*5L;%ѧ7"E;p/'dRȒ;FqwG͡F,zRJhg={Vn(ӮWH˦U-YU 0g5vc?fP;\_o1Ia0P_oV3X Q8smR ev^\O'f]b j9uu !lwEbS/45J8^yCl7΁XY٥ϒ !R6(7.ü{n=WI U)O 8g,r"AW仞oVdDrL&#u<Ґ-Xǂfn4JGO-G>s,Du?ɶxfx,^$^SmLfo ͤ ٕb}B,.EC]k!q SER. -|2;$BuRIa( (d}&?rK5iR yq,@0aO`'RN_=]3ѝ^Eկ}]qW3O io[F+Υwkb\KI8Aޭ?[h.~ >9@=C6/𶐁s{`87y=bogq f#K~^*.D/bC-'C.)j\ae{5|]B)B/ ㈋d34x72 jۓ)h>e61#sESmrvCi5 >G d~)v "J ƞQ%%0@9V JPnziDY `PN;9Юr:|-s4aF%8^dO#rVV1dKzoOy6"I8B1$ qBUF.B ɩoq_+D~tvpGNFVH]w)pfO$G|; 8\eC^Vxm+B`Z(ʐH܂.7Wfg,-P' ʼ7QG5ڸwsP`Ztei{+kVds7aܖGr)/#;;B 鬠*Uٽ};?Z8B-V5£e]j7MB|c#ZWVф?сW4MgrGx{{N;1:A4bDfv>x-DAsT*cLym?*or_y%(ARy,3'‰3!\O7'M^&e}y65MNzFg;X&Ծ:ΡDo)Cw҉ݘLÞC*LIb+r(]Mꘈ%_Mg 5o" ^,BKM 3^h]x~+gLظ׭.?zH!OSr⍯ρ,F2[ R&κ\EX#P^֬Xe6qƍ#t/:_l,r*G@Cqβ(BU{qG]\k.[n'HO$ɲt}E}'bXPp i4 &JCji:Q rاk,v:l%C>!RZU=!]6v_ѧF!mD7Z~>zlX~$.okPfaNb2-t8̆g~/ 5QKu'Zr5(NhZyWW y!fd32f}{ VX=_e2%)鲭t>L>]ZžZD8C#,O_)ki3owc<(au꤫<"0 AI;M>zsA$ʕoRAeCʄ߹q RE>I44&@*zkBhWQB=GΠ"f_dJCy)iz{^4m?D"/oC[鶇Hn[T_Z(4mn6L)BwQ 4@Z5[\8߉= ъfmO;i8\.Z_@sqnz$UC=Fiz(4ĥ`D6qSHv-%J$ $ܧZ/tHu {gUܹ%L`m%@I:bϼS݊zy!k?i5PZQޅIw/~;T(zp&vO K1;I:.4,ˏEo5QKCV埛GC X7pG{B_s] e><<_q?BcMrT{i}鄪6Qwľi~Z\qi`.GY0(R!oySHR9Y.njwȴ|c+Ʊ&1*!]vƜPݾ^¹(RpEL2/,Cp`a[6E2B[,gN沱_&'){͐)ɾ IU'KIpvtARP)%We8C]#D9jIp MRN)©oVf <0施b\y5ZiBpeEYnA9l\k!$ؕH#4ãP\:l̮`&ײ Ib " r@K6ۦi Xn%Yk+u]z'%{ziiSH툈'/1MN`.-smVlB4ɾ). /s^eى_\L?Xf 8gzM0^)AKkQ!E\SW*ѦSY)VmKv4Z *S(d*\b"!(PI+*^(;T5`Dsa!^J7UbZiBJe7afqiKVY(l`#8O;k-omÏ۽re  RQgǐV4Zrq66(P"<(n$P7ڠsmoB-h9k$pR*fR|_ƜkdVz;[ `BMga"ۂ4ۢNJ$ijD; =kWXho?&;6weiIЍ%ZsSMڄ0Ykmq-|2j%v=PM-%Q.ϡ};ꎧş;H }N+ N:L$_s<m yDEM=ʻnb-l4im`T}ϥofބΐE/5>!B E!  UKizNTl5wzޓhLjqw>\G]7x0#JUD;_!(9Qwu՞~r4YmŸ676./zߧlj*r˒&7~w?5'3}$aWpcD QVhbQU֫Otv 1[`3"k2$P@wkTkMG)rh !c[!/:fK.B;'NT"ɤkBxpHĉ(BHcOh}5W70mDea+] ?ׇi Z^%荟)dr:Z /p[QMDP x77hucߝ63ٿO'jJX5FHWQ. p'CAJBrIV Zόjc8c aYU&{V1p8KZe( ~\}(-2O^M;vx˶XQ&0+rUw<|ci NqG_i Hd c9*٣j, `~OaTO"phfg(&b[`F)̚ML?P$zzH.=E[ Zols59:Ӈu@pGdIC}xMv&D~T,nPI{6^ JO{VW"w|m{8S)LhYXv78i᲻ʰ#i?8TCaJ3 ䷓X_g 2t?z5LK<7`c"Jr 딡/R $ˀ\(1M&NGfkNEM?#3G2>5RTР KwDJ}qSe)p$aB-x2cix!H˨HJ.cL%{bw8 IW [*r7U`^R)!T[㇥ %ݓnUE | {#SL;4}u-$Xm*'L\i^4/n6%kAf7[ዷ'nr3qf0͕n5y.p!Fbw.݃"l%&CC٨̀/V'}3a xAS/יh Yj \}c[<댒s7쌆>OFU~T;L,K.+2BQOCL#!Ң5J}[1]O Gl#zZ9`%WIȓQrj4qauu 怴6]JBF* #v/!j-+b$E6FUcUS}ΨaMQ-ؐ7AGjX:Cuqql 7Gp!ꋍ!ǡep,dOtSI19*!v$`߯LtdZ jiC8C~.>,e8d5Q?::οOAn)rєs8-(W/GHBgqexr`\ )Il~KP- Ilѱ٧ŎsK=k =CZ?JZҞwt;hC7W<{JvW-YWSL[6?p6vJގWe@t| nB=uNT0-,p3|'R\ c]})iVC5W*]z$ڱoДT60)ҫN4[_X&?p[8IO>O|=%U,e{\̂\$q[CEKN'f :%?nm0=]i:jTqk#\CnXhVx'pwF[">:atDV^ {Œi)lapTlɾ JEW,FC]ԌZ߰X%YJ[,U 4ppnZ)UT85eܲ`"m7LRLI#j]ADž|hr-bQ3L%Iu51}Z3іl+WMW, +Rj.$f@I 'Eٵ>G%{`Cj05Ӻ`I(Z,D66'/sKD>Yi R0^[FEޯr)NHkYЩn֜;w.15Y5nkkL`XAp^+"r\7I:f N1YZQi׷ UƆ,%*0 F2WE&ͳf)Z mt{;RcyY J * 0euPDX͚8ϪLCۏigW^M-pOU tanJ.uYjH_ݵaDA]wKxbo6ʲ`ˮ8N8ezYcF6h{@r&z c06A:{` ;fq$٥~-j{q-h 4Ȍf1-6h…lm5ȟx0Trpxk ?x(wcnE$_YO92ډӰ1ZT(m\,- $:jUg^Br~џ+RvIBѶPm7,Kʆ'OOg[׷ȍF Y~ F)T<رF,hhVi$ӪJ֒ .4/<4 Wk!B0ۮ&GmHʳ{dcx {>;az6^ȹ}9jB4x Qn%Th={谔⮚xQ*-UI#!`K[5?a5hc@@`0 mr'^hK@LL&GyYb21* kZnD]x>1eƵg( HS/Po,G 2Stnd]"kxF?s%dѹK~d:csO9M~1dsnkղF_KyLb-H7!Q&X#WI3&;$S!]Q6 @*gi7V!{Y l K> ?O@ibk8>'pDYm'Y]pu:3hH|zlsb5hϣEa(UQ58V;lӤ=AK[y&(Z M3yv¯jˁL3vO#]I(`)"aZ(czjM*l"ȪF3?]lC[Z;{ OOc(t! J粐65ubsPw&B~Ÿ#m5҈U$rICLtJB&gR+`r9]|Ji*ո fH yb1vAtԪ=G#Lf0qM_^X" B<>n` ONMt fztVOꧨrwD,}-Mx5s|St0>!xr4Kٵ rbwTur9V쎮YEcCG ObZo:7{ô q;\8_1v ~҃:pp͎ ^Mv$\?t(,Azca_Sv@A[Y = uxȫ"e:dͅE) \69LY"FDV5[)ӑ-yt ~*q&L&~Z8z \C=y ddȟEq*ckN?Ն8-00s8m().yf#x|,Ф`˫H MDcFk؝Pwv$1+3n~T־A]q!`*hkS%A&nٵ${;)+G@e`N9 Oa&뗑fK$ _8o5NIB 51EF J*\ rT:HJ'6i-<Ǟc 좛W7L v3m| K$,`fD0(IN @uu<"&86VyO 8;LRIgk5x$PnlP#QWQp=1v2Y:%I s640 .ERUDDDښB?D't||X\;Ȼˬ3P%KfBv+7ʔ93Zf ^\{+F:&;}yO*}FJqګIi縀G0zYƕܯ_\j{+0k)2$zSq1c@JwG{4P77>k4X 1ϙG4>]yVm9F8j6a; VCOAXuOᄹbXuҒy կxywQk N? 7SaQHhrG Tt[Ch[%[Λ)um#|Mi)d8 8t&Vv.Z©m.I@tGsʯ (1tOWu Y [6\5I Q[A_6B7VԵR^L|fbU?7=pm#N c׊}h޹uF);Kf\dHi$Eٱ^ƿ'՛}  @|:\tTWA{iUkpRJ+ȡaq>5YMk 6E9o-st$[M2fHRos&,)7 40t_JgNHd͊@ r CB/f㥑*tGwB1TNsTѐŁbt%s#IΉ?$d `)[aHgx-`D{~U meME ؅4=mSW񯅅m# XTa ya.:6ڌ^Cؕ@q #,YȆrA$TVDg(!Ԩ8߅ ȈzTa~/f1*X(U<1W$oc2?;u2Y en bPa(#_-cc*݀&ۡQx(AӔ( !,Uk ]j>,b4@&aVؼx Kv/v>eةt`R4$WE Ջ<92Y֎Vd[^̺5 Agttl Na`T=syѪѫZc dL''uHbO,>au͆qF BOpQn~w:OH}i`؏zƢ !)}ΑI) c${Ļ.0scv1o/#s, y-b`LK4X e!cmbss' f6KK?á{\.ڻ ݹ=A,+嚻gQM- 0G}(=g}Ɠ<<*zҐ. Y*3gl.GLȿ<6S}k̀Ālgib5~>I@Tt& mW@%)dpoZQk.'#~+ảogBVMie{W{z[Uf)N#`BWK88 qzaVy(6*Gq,ݰT >P3F\ybcu)T;u[J=ݹ1݈ȷK!c<aB1V;ґ4S<++˕:'qchCNßZM'Pb 1ܻ%jP$#\HCBa 7҅Ցc^?j) /-*u+x(Fb%z^!]5fl,77gvcyMUξlɳsH*$-OBmfAcɞWeG% ū"C6tj-IȎ 1'o_I%[G|[Lq.$ZI EOTgk2P1[OrVf'˖Y%+]a S>Ш=t#%5GC­]ǡ;q[v /܎n\D^RLhO:IO̱-9i_e5*E[h))*dV]|B&&XסٗVxU"]>wZ꒿7_eA_^xS @EI^ ZLMD9te@drbJX:B9'X(_V:Jamw_K'wK(@ރ93 4#`Ƃn*M,l8l}m_D wrvގ^ &`70AC/Qes8&/EdU&8uu]ܹNgu3g=Ozb!ؑϓ_1QIL!d^5'~1t>RUN-I kS[wDw/ƒ"YƕWhdxXCDкb8#PF"۫gGe'`[,w.^vtq2;yYۦ"z;r.0'icBKPóʶ4UG%NF.n$`J]%^hx겝ae+!OwQu7#s.AY/Uoe`K[ Hz kkF~qHu ZG| k ifjE[(m>8P>|m#֣f6_o]4 s!Z/BRӷeqOk'VaE"I i}q2Qݮƌ68.rlqCA&۞Eevswmyff|8gWdU즊1Zpq'Qbv.7k jť~ ],-28Yw$:亊cG{6B"$yi=dAFΒSO}H`5CFTZ3|ڍ*,2 ᠈5+c*/:?ݖgs.x˔368bYyQ3>PQɲex0 BB_r+߸ҴYTLUtc`~\{yDC6_wBM(ߨ/:AX[DQNn%#$Mp; CLUSvQd_-QZϝg6ͅ*ݖRYJo[2 aq E`vW=[F )l/S)rҒ-G}# FTL9"#_?VcRw?0Ĝ d\tCޞnC詏0_uCxs+R '^"4D0GdLSlfNh w^s ڻ+վ]k(6pDJ{ !/> raj@-/#q~/dQ4orkɏPA}b&zN2S#͝! )jSAe*܍P ;2Peo|HRdnk 'xVǫBZ+nBVYQo0ܥ 1g􉺽Ex0'"ZM(u>~h^c;=pkG&%*;%ԕfwNhdž7mRW92shUxvU{ saB۷!)SO}&4͙~;Y X}eLS4zfF`nN8g//8>@^Wl)ž6qi E#MruUռ!K&X,jНS=C3ŻUG~ͲOgF?RAʍ ז%CA7!‹l#ubksZ^9QPO!fwg[PB8=)}a~F6ޯ,dOR(,ZJ?!΋P`ۜ(*z)<,kmd`Ef9[7eA ?yB3 SH)~۴,\g&)Y8O$z+[ig/f7{0~kAz?y@AaGEu%^KH|:KQ݈t}QvFjd t3&@ ٤:IVZ_"sV(aOP"VgڞD˾1{N1[쇕p!- {Yh,պf'yU=^X.#r{mj5L]ӷ5|m𡵞aMfL)ݷŐ\6do-3]%"tqsh՚hWw 4u@sĽ0jlthA8s묋@bo>wK}߭)~债)^};!ӎ EWq͂=eE>]MC2oq |Tsb!`-|K־}T ;>%6qA@3c=|6mrh7>go3aL7 Lːpz`Pw(b[4]* _q:T©|;z= 7E4G@x@rć3p ˡ!.qÞqyd ԻtSX 7ƮPvٱ-S$rymu[Gj+m{ұ$0KBobad|"'?|aa@[S7!3( Ƕm۶m۶m۶mޱm۶=?lv^T}|/u rE:~A΢TMP[! j%/B!XW[W7l5/qˮ?y#Blv@qWFOû Ȓ$i+ (/͎ ٤%~seui5h]2SlB34Ɓb`BkME o02B^GN~qls02 ]߻V%2`+0w+,=e/CqR;abɫC\ |R@Gds Eggw3t0/#vbG> ƱΧhtrRe9wz'e]pUnWm1a_c+E#'ydؽ62 ){b4FC&_xhh]C,D9K!|l@nU6jV=Sl [KAJJn&>|2M FT_`EtE6=ja֧/B#9=%nI=?V],A>b/x/V#p#WJ$GtzSFJ9|RJd<-yAW >!FzJiz_EοlȇZ~Ɣ' L$3|4h&iW}4*ta=ș1jg)&_ӑr׶ZhI@[qQ<2zUJc@xp _ѫ2yKmino%+͉׿E@'9cǀdYѨ/1NW*N1׬ª7Iyy ܱ >z@0~[B,6x Gux2uBreypU]`##lόcHt)% /#~=YʎHaXPAqgnx`rh{w[@{Q=&`6^0DzbE%MVPENo)Ћ 359R&h$oo\S#aǬ%Ʊ;\)]f-K'3D t\£xncSЌhf7Ug/⼣-_bś#tzFE.TȨ ۇMQgirX`ZcL@7Ɖ.wOYBGNeeF"GG]8u[Ṳϩ[k9|̋D k^Sإr?G`"r: +m=T6"J!Q烗G5@1qVm_5nP9d{ߥh=I3p#UFtPi|/l=#R]ߙBAPhaGI~57y ?J}Ge[-iGjWcb(M@>bV;Kjt~O;uV`!_3}ұ]}3#J$Y"&\ +𘁶҄a_l!B*5]eX #^Uh[=!9 ͯ",Hʻͽ9е,D_=A`/t>(aׁ݉k1*yN tR dG z|2-aK')\lj(5 Gog)ZgJNdP p._G20''=,SқRp"q=evA53/{1ѨK,W\^YViD]MJ۬D7{T/XcGWl1ܷ;+E>K(ǯ+/wg[qA{W\hY |sLU`]y9}ֹB)(V`i st  8 #0k:*Eէ?wU\C4"19Rp]Zt$Ha NG65+6r! ȫxۥzGǒ^x"[y_66b=uriF"V=]x.:` +-2DVR8ɳ+ c%VS+|d8E'wZE;1%8YQ~Ɠ}'OmtR%cQ cyB=bֹ@]bd|iG#8TVV-lߛ<8:Ƴ>EVk{|MGѯd bŇW*x\ٍj{ 9`IczQ>5gO] aK;7ŎV#LQd2PV -(vڧb@GSp&eC ~gh06ܶ&A‰yL$BsѬ b>kK,&YZMH9t2XK!QBƫSGGpmGQjWcM"c3ֽyO[ޖ!Fp&zWmN+gf2i-{$,GW5߮;0fG'9@lh*{͉i[wZ/ie2j>KH.)}1?~54 N/l6Ts/f@;̓߰'/0N.=Nf }G~A<.ɠ6x" #rrOz _9Kre4nzOnxg>+;Kr]uGlIQ'{-wstI"#t$td6) fH֨h/lɺqF]bĺ|ߌ! (jWdT.A"a$LJ=t$d߼OzaZ.cwM4*}f2:PӾ'*(rOX,Nɓ|:X_YnVnk.a$Wt=%+sAGD࿀-d#.m Hx,­<8s3sXoCTC+/c\5$cټVolH%c鐁%[1Sn.Orn0P耘UcشlG,jAI. H2_se+݀n~,%&ߵz*OICmc`oZd'hs`l>ɕ#os.K 9NCG MH O&f=_` mX8JFwA[:M6hPĈ/GPn[%Jgpf*/:]x>8xn4PNpU40rd;T#!>!fM_KbRI SNQ2LP+ȣxÍC58d r)Y;b?:] ,K!QS͛#.|ck1 =S|1՛31Qɨ5$0Cj=;+RM1N\zO#Gi>6Aڎ!Z2ae6v3}@gLFn1s-M|;pR~*ºf3CeE<(9H F侲a8ݻ0rM;VM )2 yy '|exTav5 ~Q"֗_\QE9Y2QC5CMT7YїH"ќe'l}~.aWǥ *;lj٘)#dpfYhCC1}ܧj#wh9l3z<Koq3qk Xm;~aȲ5(^7 v иhŧ qSrm4~n= RܼhJ@Yø!mv%nA&e"^l9k'E-ͷWM1C5q/鬢 oެNKiR4 o+C+QM  {fӑԷ.E ۜ/ykWck1kv;@HlɋtT+OfSW\&F|ؒM΁0`8Gd50ٮꀎČ7L=㙘6^KA4Y{STF)S*L_X}qB~a>_JӽQ{ITO@[D+ W -fJTY>o \ŃvkokƺťRbr҉Im4?j\(U/*T-BE}Pu*麜0Ҩwpz{z".A>_褑+}pJ}RtMLFSVQVFת;C.3 /E)|' x?DAeJp̏&TC"NUYX{ !1V.lƖq[Z$RbcC1 Burr~ٽ΁G#)n%A?\]L2 iTHQLi)AvVh_x; Մ.f5j#dTV"z9lL'Ō̗`CAYIfSEO6(6D9ܢs!EqR1ϸP\qSl5Ժ|P'K~]eoX{nTd?*WI4E(KYUEoObhýrW⅀ Jl]G]!MGQz36_X춓?&7Vg1b%ϫ"ov<Өq^\52SM؎M] eBZ~vٽ6YeԽ ]>{T7S)5vOt-KJ"ͳǔ$e{-ʌqm̡a.ubCg +rDޘT3;eOyڞ j OiN,aAVJF^忇rHP|3Vcs9j ڶ 6y!-mURK͋INhëNAloލ֫NF'9କ(G2MWN3h?E@2pБ9]򺷦3}2ʂVNW 'F}\ )A V=^v`Y),&$/l*O s0#7{*dʅw)'Vg~_L-faNM]c0ss*s& 4I)P-?L!zﱔT^T#sݽ9ݐ9tڻQT@R2_d6Ċ-\}F9$yi"lDY\3K*[R$=tQ>z̘E7d 4i<:J`O[Y쪑l;,ˁVPM$^9ìpwTTg;Y,Xǝ:N( G5(R ;&qAv"fRui*!gM`]ߵOJ.k$kJ܎ *\uF'ŹMa{[pݰYT7P~z8cѥv`' (#iO g} d<i/ogEϚ &jߎ; } pFK`s;@9!$j'jLxGƚBik=/ƒ;\# J|dMۗOQҌHXE3 _?t+\mYtv]7"+KEaI(˴u/n."?$gl 6ޗ?Io4"qC}v]{ _}C;ɠiGXv+JgX7vA-TV$lo ˕G(YjzvPa3 !5$S822!S@ʈ~ +?`.Ʊό^/ԯFUnD zhPv|o!_Ih_ ҦeDcxnJU+eLϸlP6-Io bkS`U(5qI?>x"kBL7 VwBomP'p>W\[%7²:.} N{,Æ/hā! Nto=혙ȕqna'@gEOT+jIRUB&V:3 yp|~gIЛ98"LKRWao5q9ɝWZ{V>*HLRKz~@TR񺶕KVGJ ~PP={o:Ҋ|sh.|U%鉢͝ix7sfCtCtH *֢s;s?X؜1_w9 n4` 9؂V40R4iX !/' RIN6yF+XʹR[F|%dZ"\#|j!.%Gew,?#qe7`_.^WzӲÇa /!K{zL5Yehkhg4t@nN>\ ZF}%F:5XXdhJ )h1-(0fG?jҔ 2IQ^ЀCn -}0߬d>H Q'ᔂiHC`VDŽV_wXYI'Vn#I~W#ax@|aKþc-. [倆19tj{hHa0Z1"<HZZWUaZ63ъ{HJKrm!#69}m&$.?Ye W%W ۿ}F%c5߉4lIG~?]B*/_Op73B~홀V/vnPsByp e8[P@LsDZz ĞgSxvPF[#nbA{ % 26"qd:LMmJr^#J,m\z-d &9΍ PBȐ%p `AΕC9p_h:)xFpw5(s פAvsm潵\zGNH|DJS}eJZeqqD<ꑰ# eUML#eGA_esX+ ^ TV㽯O ˁ_mL \m q8endstream endobj 19 0 obj<>endobj 20 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 420 500 500 833 778 214 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 600 556 556 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 389 500 500 500 500 275 500 333 760 276 500 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 500 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444]endobj 21 0 obj<>stream xeTdͲ-Sk^Hи;4 o#o~w~T3"C*)HTDL ,̼5+; )KGA! 4vr7v4fq)GsprtPh-|YXY(܁v@{/kCU j [bJ2 Rj)ull Pr3,rV@{ %g0u7h._A.@S/3)=lg rX8ۻ~`eojfO_r<~8:;|})9:[9*K;NWKc|X}_;L?0_ZWc+{+K0̬\m|9:[+ 7+{ 0v6||a>?yzcGG[Y;k`5gcaiN7w0[n:wDO|al`o01)8~%@WeFZJR+,j'Wa*vxo? lMo ,boE ,lD+I+O%աf@g[+{/`8ڛNgD7ARiW5/G ?5?X:x|X3xx8<~ 17vu2323+#ao`ۛ} VNn@2˗S210 4;]1*짿}ݴ 帴.HS0H{^ 5n伝cJ4xqz;ӴQvnH7Ra\AdXvWuPr~1'u_1@U92^i#D&۞VQ[6|:puE3k_; DWD 2.MЮCgneeXDR!%Smӎd6DA5n`t9%T?k7df."ŘG|>D~ &um`7q m󞏗R#M9O,@X 7o W`w(%ۺ3l"(4Grd\AeuVd%ĘoMC/])q]OKrP6}# {SwF0砘ߺ.ݚMҤƈnrѱ@oIfȕykZT;^%( 6SN Fs}>Z Qm[49~pQNzC0IL&Ó̈́#[UMdks6~jVivS̺vcNѻx?BǦnY⯪Zg2-,%E7Oh@)=;FWei  )f5Cĕ{N< $bQo 픂{+"J|vOi%G*{aIմ8pDl?ڔ|b(8oO֤kcA ՄRpts=M#5WrmEO,`7Cp{9wӽ CvIYPek.pҬ.{&3 'AAxvS"Q4K٤n0oG( ̳{j1odXlOb9\>)=BsanDAd'Px#E N)KCe PJ<N=Ry)< ަ}9vMXp.x 2FF]*jR@\UgYA X]@{cיWu99ָq.Z̮ED'HysdVV]ڪRo~ά+6[*_,9깹Lސމyr83PIS8cy5O33\1DUi3g?Mek+gd*m|3bb-㗧]+J'=\UGN 0&BS9TϥQ9_U',Hr)}L+TFb;- DG;Ҿqe꼴fT;G^7τQ~z@.c N[GD5۾J36+׉bh߫nj׊h:ez,UHBQĉa5Tf݂;λo kk_ȁK#e.FI Lnn#9T]аؔh(QyO4Pr*+'X`COQ-|تh; Xr$ΝCn/ kenZV|'F#T8$=#E)5# 6zT`3 [RR$-6FH4i{'a) Iq8l;_9ږ]#(&YΆJȆYaf6,T;e.nj> '}KǕ*"کytlC_p,FUiB7xi|ӴLr NӡCz MKY.ニ>ïa nn GCNS $Mrzpmȇ7<ĩ68x }}W@pq#F wIhVKOTFSkpTڞ 4|ѦdM!La/NS}9=S&ԄJ] NyH1C!!'Yږ#]׃$/H &I8njn6isvrHeAZU}jcﮗT @ '[bh&j녈]ŇW;IĻ[6g޻p{ B>~FA9hޚr~nȍOTwp >ֹת [틊 }gWrG@uQvhư:Q2īAi{fJ._ӣ8k<>7ֲH08&QaR d݉SmY&/Jd ]s;LkkXI"qJ2d7ua'S[X1흼~_,ޅ04*w4}[/`4*tGG ~p"{1ɏ"'B4Kea] {wO?;x$.P)[L|O2϶-{B|Ģ:Be;1 TV7 v?r֓-L#s=fk':| <1N~om|Uchԟ^{njKUeJph 4(KcWĨ+9D6-ho4\wRRmyҷڰ͚YڳBt,*ؚ! mEHx1Cqd:S??tX䴩z/tVrR|mw R=)f[w]]#"g)'.ZYg׹7:O<<̵)#M 9]AyFY?.LIǻyb|Y$AÚs vs`]GheK7=5jx7_&;FR6e[vA.S/ai%=hӂ i tLrA^cG;FMLPBk:?o-ȷ9aOPwUL s"P&du'PkU+ ,.vODt}JʲP|.b`mI^Hz$3e[?ňXȽBF$!ل2y{TC $+fV>!0M::kc5گg9<͝:?qSS WI9 >?09*e;I L^9ݥ :yδ6𗌝:%E}|mo:,?j?YNҼp*#<waP=n6PZw}t$J7Jھ5o .Wֶk73 evoYpBp(f]Ǥ,GJ >zuG;5OEAhy8х)"6`:yB!\t(7E;>b͘DT}cDА\T$~Cn]UtU_^1x|Tr̘D\>)X:ƍ5>cZXK#yR|6븿Ą]=B]! nb9 sT}ׯx4T޾{[s `Ux@p ZETy[gN-2 /.5𴇾NuZVYx9n$E<}LRu$F[Y +t@b,|qټb04#uO~?)Gn?]Oն oWDNƈuL>9*0gCu!ʭb1KAPuv\ FKun}/f-^¸'N c:.'r701Sv'+R]iE#P3tZΚB6E'Qs w;g,?|Rd?3t WjT,LD8WޟVy}V^;8wH TX#OcDӲ(&q҅4VF4y E}}f#NnE83,zjzɊ7#4VU9yb[l-D KYE4Wt_s|%eiPUd-gn>lӓ5YPf&a%[\m^iM w\Ƙc ![l${)| ~' tkmO; ^GZrHmu`z3|9 -'WG@@o'P*ȣ4 {@-|+>K܌2dM N!\?z"=޴tD=mb 鎗{@m50!aXP˦Jg ƙ(MaUĊs:C61 Kzۧz@!۔6ll&5uXoV)<`U5 (ƒ,z)դg:M(* 5fGRORCdZV;ƩVO OF󗷩sg rKY+=K? Nٮl*x[g~ֹ\̼d 㺟ݏ_i-|^3C%:Hzǽ@ⳊvIPDfOt޲*lr|lDɆI$1Kԝ\3x)X^Wz9 Q[]uv Ӎ8p '{(_|\ߗ3ewXlҙJbw}U|=0G;!%ߧI'{eM #e cT{j4Q4 dj`ҫCAYwü j{m>PmAN`ٻaMo8h Dš^֒ĚG^ v.с+W R= ǖBE_vlShmInC\ٗrq3ZOWʜ`ϐ;t"=OCPh=NNx%=R$ZL{-LbBgw[P&;N$m1@ʓVX*}ƹ/ %07'_/^eJrFF#]4K4#+V'T/Zav-Pw{BnjF* bΉaޘt٬C4PH͜;#xw`(q)mHJsC2̆4vhHbn"PdL'8&9q˘(s^W;綟_|0$cnRbH djkG:xc6C v zɿb ^XN+zn[-cƒf~c8d\?6' _F ^avN^b!l`+ktJ9BoXf w eg!d^EqZ}X땜=Q@rVަŲ9fɯj3upfP/~6#\!?YQ|Uդ8[UWod5tmFw i͙j%ݕL?ˇLJQtMwlSڦh%"f bv@NGݷDbeVC!j(Sifol^(Ϝz D_qc6~dO!B `҇޹pxTI-KXתBA6@NA2 t7F)ai;BDihN&Mwy*jcgkhA'Y:Y$#Պjp 1/Ns .FLjpkA6GAWʶK9/,rLOȹŰ(06iA66%/Q7*N6)-NiZct6meWIl(A5菍g|ބV@jML>> SF?rGǾ<^.@AkhU2|N~k@k0ܭfs[DyjTt$9z>tc %b-E 0 :0Ty}Hvibeoj:%VLa&\n#ֹZ-gq<=Upes9FJ;g) XaCO4Fm^1y ^orH%=`'Gacy,'y_l(zp("R*ra(Ba# ۝ltssx%*d(0~G;*8#q`EcdV\)/"]S|T HԻ6kdWl4b:|γVFjLK#4'>bGdHGc; LUC`p Zpf4 E4P2LԸF0:m,wޥ[[g{ڼ ;4'Vaݨfxt\h@P#s ˏԾ +BZ2 swaWhXq]ôkͱ6~M=N 92(=ntۼ?{lhG?.>2 Ҧ:,Z)YpӀ_\SնN. 1N+b#;x>fPf<%hMیag1wT_NUv ;%N[ Ov4|Co : -\U7`Ur }d[vKW^g H?ˣxIP&!-n%0!;S~t8wɳ=1=R~[ 1ZJyQǣK? RWi Kk∣}^n*K4.Fӌ{B^ w D9k${uSlz:kYjl~B4K0ZjGAӓ% KJ~2C ٌ:Qb&橕'ɡvsq}-nKn F]BjNe]g?>;Xc&4 չM.t0* ~SdQ,15F蓐řY<*(mrgRg*¾I3$#@BBA~?/&;YNкY)TKezՔ4o `FWí]Sf^mVL(y&R:Dڥòf~ G,%Ya֢30 5xA5CEg[TŔ-Kj=GDRp.mޢW.[N61?'S%*Y#P(q*Æ6!YPY*:gJOWd[PVFg<ڸa؃S?L)Ka?EklN1;"Vn>&a]T,&5wmTxK/P!.D;D,;A+zf+;6ea*ܚ+K#Swm~sd3nV]ݔΊfF[Mȍ8vhSXD)Ћ|e2g L5 *q⫙~VLRW4 xaðeXQW6M󴎋i冑 GQô׭Rjd뉇^K/H:g|K4"D?SUsJrtՋ oggMj.8bT{%nWZ]QnL!<63]ܾ)Rwd ,{͟㽾Y3].dc!r|;|-HĜ$B:jXSg8\H׷lBX}GpX50rL VV5efb0Z C'YPw%iㅕ~>y(YYG-qJ3- C-z ѤֈO0<$cEbs͉w_H6uLt+٪mI1`Z*+1XȅBo?$󣏔g'[ %8@V5Avy#lVrզF@4et# $OsљfNj_]T^TG3[zfW'b I ktBQ+.@#$.aKܹ@oCV4҅] ++b-N(]'l}:q"aavz@uʵ+{XɄ̃p+ !݊𘚬LU~+Ge<}f]k|^x0m"\O4Eg TqxZ]k_!}|'^Wל0L.Hśl^_pV4a'umL`@zoV> 5ZFZ’]rR^oq@nIW{oERKt;T׉D`~FZZ\mp8[$*oF_TQUCL=Np C}2H~Y-9]'PMMـcc ٠^y{$?p"6`U]5HɈ']i&2Yg%'~NyJ.piMB"89 Ѿbf(o}=uO,ѐd&ޟd|]Tnԝ3.|U"nѷQbyZUMY--{C5U ()Xyc'm\3@@ >ШÉ_b:V큻?b k#uixF0bTݍaHq B0'ZSDx]!&"RZVˡwN)/F Ǘ%9nY*(c[)g|q9rU_.  Rsq=IfPd"f^^2ro@O P䭇1ֆ{VAR~(2C'>}a"YTZk l\*vk&0 "A19)7 i.JY4^M3J 1VM< `s39nbɊXABАlBMhuϏ,GX=XR].7pE :oU4 8d ۂq݅rjJm Tx-- Qsp4:^ khqwPy?+̝z f\KG1~GTԪXp^deSW.9ۦDytėKјLcfJ{ZAf_2E+3 kkRKklxr-|7Þ sAP%jTA`:d&+gUFO8Np.TA"ļaEH`ZԦH_$ϑ9].!6Pcp5jgm]hh(jAU_o[$_E% r&.r}œ! m yQXzRL3`0Wˌ,{zNB^pʕJUSh_ENX0k?ZAЃ5K)K}!2ʛ+tu,9xsTn?P(DDˋs)skN@3t_ o1j>aBkEMF!`'-3; 6AokTk[%);vP6g6,ǣ-?MXA& }hCβUM?_*юCYnĄxGɔyk-e;2ҏPx) %0k~!ű Lg\?@,Sᮩ34A|M?;YՓ"t܉ ɵd#hkb"A}(uߒn$K59%u[hH ?_wa 7$5B3x yL&QP?aABڧ<7`na3ZԥCxq [B_ʃk&F$Oջya"Vwͣ~`8֛\ ԶXgʆ_& aqh'rhpAIXn'X&β>*M;gF5lA|I%pW%oODteDYXI7?ˢث UGul~WCwX2˲jx Ak]2z7XWNJ…QfP7*3ȽuвW )wpSm]7 hAF D:ıM!A}y.sR}vKl U1Yzf_X{)B*]'=:Mg)Y|X 7 ^!0Ϊq'W.c0Wx+^#SIa2sq"˨][[qeVprKj[&Ӓޏ_Y N@Jtүp!=lX~.iZ`gtmtvaN[&. ? \&XƆ՝viJ_|doY,kob ̂M PtRSvF68ȹu?Xi\WxW(9\{b,9,ݡyHM9'QV~R Z#뵊! |4#W.׫s(]#ynmlZAR#M~sDL0QtV.(`{%KWpᙗVN;iڲcgPOrѡcw:dV,LLf6/;\?Ksc.7<*CM܅zJoiпABAk͌ f02=R@+/sF >).Yj~@"!*cxXsQL(׿P *Z+a1*IHL62c=m5Qp{LP**ʘ@zƵtXH)YsԈpGe`zRŒ-&Rû ȇae6Kwvj2JCf jT#(?՟IhΉY7#X=\0q約YSg  Sg[H'('ڧ G{2RYXsbA1lKxYr!gT?(V92Z1u[CM +ʗH$dR]OS4B4>QkR;87_՘+Tݡ! ^HUG] =hx.8pPEOYg;! "%DHҢjX6wÏCO$zb,fTJ'bj|5Kv1+0 6pz⣁, hpmɞ_RߠEvXw/TeJ:t\'u+ Ub!a)bVrȽ +hpBr#Hh hUvn_/郰3ߧ~:v WCF0AlN+rQhx0uLŸK@u2>CWQ*юxQhc,h6*NQ, &HlcmFBKӯFRR.ˉf.f9KamK-wh*"jqHy6 ̀-JyT\$HjUq$Q&"bshrA{0EwßR' / ɱ< {S4W;ǿ2 hzft3%|/̐[ v򏟏^0!QN@xSBXcp+^1X2b< bl 4{Kf,k;Id,8L`WuEϙܢ]g%#Pyٲ[1fhMg'A^ϙw\kxߤQcMIjKL.~k˂|'ҹiMRNe٬Id5ftR8I/u&G{G1i.%ʷ/ftf-M;nldk tvr&)6"(Tk8j*Pw&C),f`æ-,aoԫ/nX։~`|".+H!f2E..X`c1-(.6[l5NEǸrglXK)~̛FDG@sᤘ<(dT(J/ E=eE+2P7 {^8/l!bT B{ğhEPSLV&|rs/:OgLʆA*ʍtң&iZnXVh@`BQ kK\ ;_)nA-qtVjat :>j``ȠL`#%@W\ID"8k@fUw3BWb"j03&Gx,aZa׵#NT@,P吝yKQM>-ìS1BeeyX"]1{h= )wS<45mf]߫_ϼe;+EhM*hCQ=r7Rn ~τyT[8-ubfü͵^ ~D{8>s_$y`\I- 7F&wI K?rkrBl8xż fru%A-Ir'b<%XzbMjZC~O*.@LtkI8'&RFF{i?32-c6o8"'Co;kay,7u%,{M!DFR\ ]F nU)3 .so}g%~,MKrȭ2'm N{ B=XB}zh#hvt̙%YYLiAZW $-LtUE.ѯXFqBޗ UM*)Hiy|)0W;RzXmӻ\GJ+ݨX<%A lV$#`~10υo&НɳGRX~4 BE(b+P4 T\LX^@˓ JSj`2 kZ+]ldAŷ;] =T@!+,@ӿi+(D^KA0J*Dtgxv{ 2͞׏9옟W7㻂I>@cǟ^=d֭21aZOMqJ~,WLlQ>>P~1*Eռ!HA戔/BNx^@o- E):|c{]D}'*E<<z6 1*@/įېo\]av2AbixeR0uİЂ1Rmlaγ2Nu6 jlV]VH  q^o1U+PM;j\Ҡ̝Z28iB *fG;%#Zk7ڟ▆El|зB1/=F->٢" Mt隨,u$%k4 ?:kRzX$<#B<3u&t)-ZJ( hGʖ$sP0`XYQTks&qđHѻsfr4C .^: *|?irN[wǾ 9uIҷhmNse*J+`'܉Et+ɹ %tի$>;(>[:dqs7+\s*Jω-NGOw!=d_/i 6*Jp[ϟG}6GU:z6kՠcIT`By~ @Y !~Ljt=is 0qpz7ρ)6Cn x %7!^!sHr-ݪtmB7=ރb3>4l7KBL2 K 7Wy&HB陣;=˿(Rg.nP^sfk0n|7i0IA{m4tK\\(9`1׈5t[.$'낖Qwj)gfF&[F_>P`o)6-ї&BGRPBYsCS X5ϐS/RzK8+l!!r۔(re-UM>MHȞVOAqY1iκ)o:E(n 4_we5M*Nb. ] AYƏaC#1L@<_+,M+[q/)+&`LgB*}tMK qa6C0]U8]<d;Xg^O3Uk/nb_?#j]}AmQH i$$PD>bǯ9fBR)˿i}8Ʋ}#!;$cP(Pf^iMEW m,]0EmD*oΣ9MW:pYNjrf\0[QO]е &G5T&+pV2U/ 8ŢtX&hXӋŋ8Ht2@YQO@>L" #hBKRde!Cn|VB{D&rLUaT50ՒUUٱp6 9ސұ΃F q!aa,2 fcZ{#ʄʵT MW; "%ʝÿC 6@aua!Jtg=ƻ)iC5ۥ{[3[\&EսeMo oA{.{Hx^:4&-mjĽ.U`_8J{,}~@gd?𨸺OpL\#sys Fsl:;#c0T_hnĢ:z LA 1N6ZE|)iϾ55p]T1d1w1ћ=P(\1:^}jMsȰ #;PZ%$buL> 5V+?rzf%|(P[!X9(qO?A݄#6vAu}\(C_Fbا5 ]!]KcĞx5GXyڣn{+P3i%hPQ,-Y;a#aV .$Ut`>s8Zo0< m(_dHhlVѱLKоDJ 3Ŕե"8X9ST/LJKN$|~o9ǒ~G/R\OWfe`Be,}C? Sr#93k{π o++ΰ﬍{Nߴ5υHl{&py='ױkӂCr>r eȬ3PhCxM=|K5j[g!hʤ"I~l:pwn!HeL/2vv" 3sOj~ѯx%)'%*hS}tƽD6j\-3Ncr891Pl(?E9q#؍h2q\ԯ DE<@Js,HUC8Nb&Y}=4qk[oGl$aЭɢ_o_7X! {{cER_ Eg'm\0#B Cb~BA Z〰xU^:!KVe2dl[xMM2ăf؊Nr0.xR\a@AmpzB0($xZC^?}}\mSXX09Aٝ^?YQ:H|3Y BD!ưͯjn\g[SO:-ohBG91B\0=3;\XbA4#Cv3T4=m !h'|l 0ؤB=zs'U_"':Pydp2[)3?{$C=h䖾MfYJ`뗺D5 տ!P\X/F=T7Z{+AC@&fli!&s3@ei}uqc$eUWw^=eWOWfrg;`bZ I1"gy)t{mBq;zbѦnj4XR H\pW}Z$H/q/q!{0N:ŝS, R5孧:J{%P*j8P1B_y&&1+ ]9N!cpEХmJ[,v~BѰ옠VS~eMW!Nɒq5"'8g;Vj[H-t7ף ` {F!,(Oժ&$c_P Q?}$AJ {(b\.MBmʹ>i'Y{'|,ՔfҒkPF-e"6\Oc]@(0OwǞ!_Hc6]`GBzğsgS7?.9RMe@H9Y߂)ë:,!b FAxC"7(jI g0髚D^Lt*Trg9s*F}(խ\1u!J7A ~T},@DOG#of 犜]1,{4AVk_S \e?]L=bdUaș<* Mqvi_NДERnpkGEȑEY(rI'DH]*[ڥDF해ł&~kQ JDq\S Gd]rܽ-6$eDYPDa)76)JFr]^*+ʐ4/3x_df7-\H̃czJKAjɥJ& y\y2m!dVi1k25OghN˴ֹlHz &DMUt /= 2a?olCx!=D,&ே˲"]/{d _="5)$@oM=n'Nؤ[-cExJeʗ4 ??paT21JsOYAA V,*|F0-g&c}G.MPH>Ԁ4>KgA`SܣEAIGiu2#;wM&N',өH؄H;daTsK8|VS$ Gwpb=f R o)# OjI:$aR3?ӓYmY $4f}S{]9|@phJoпXXOֵ+]Щ\pHbOTfƨ_VqaR6 -wo_fvA.d3 1̳IS{hYC,uG0GGU7зDٳpcfH"t\ 'M/GOGܳKV[Mp,3 %LRCGSV lj<-i"ni`CcՎ5췳ٕ!Vy\vt *jl])7GaOKD34\Ϝ*wY+.I_:WLQHZ;呹wyaocw ҥhCa;w}><6F6 lga(< p P%K?r_+9XbO"zʫCJ'%{+xXx _Ve3Ʈ9%I<(: 39Im+:I 2cVB_qɆZ$궱&ܝ^Ԇw>A2ZƒS3uHB9ÚV#W.FB-#P'&ʺ66=etnӹ0_™q%s`g̈́j ̤\?S7\ɡK,rӷ)IΡ_˱gTYTHl'Э[<]q=nTw* Д >WUu8 "Z@_^!XD/_v&6YG]Rh*BHas'lO0 |8M S ;3|l ̗a=y]L%MhڅWcjGuϒQslJqKt[[xD>؊3aKyD#!0=c%h D| F #}T(mzrdIxU0jLEfV%,-e~g>.{T*=[cHxěaI! Ú2Y+F q?"X K r釋AF?Ǚ} O;\(!cVo2 0,dϭ$+MShʌWq?x3*f:Jjl>E0]FG ,DFg 3*C%Ilj V7/vz[ qr-|Yy~OZ-"$/B]D@\d.>ثRRGW]3h~Oh_}5tuJ Qd ɱia (,lz#&GZ>O$^ZuXQ,Le[iv<{AZl Y "\2w[puR(f/e/H\Ҕ6 v`t,M%9co  ,TGWb]H[9 􈬖mHtye3h+VER!X%"g[B @NGsf$e%Ud7(!ã~JoO+ PUc}shLw } [B;!P#;Abϥ%Y s߁ս<<1&m+,gv91zGryn:h<<؊aIaj3J4~s?K'2PҐ+`֩&=vά]lj#X}2Vz\}|Zjo !A–:- eY}kg~{9EȁWK+8T\÷t2;FBKH?#BFb'~K:Yh 37eu3e14S8_~Y'e hw" ,$ z[Fe x\/mfC u ҡz :uzV42+W5GCiX8(MeHϕ'u]&t&]TeHMkhAeI1a*~M,b4Sm3␹+.lQ0< `IfTcMA*բkH^)q+l*jM pH$SbMnKa #=~th绖md K8¥_fa@(z'nKl *Sfˠ.]db= 'lt'5^N L6SТb(%t~$^;Ćnxjdmd89+KVY )zR_Sح WhϬ,@mdQ KzSM6ojJhak繅z ,jwQ3c+ru7Vو_HEUws,;LN[}#gv"PY,[ە/ n|B%xd nE3ɫGX?8 y@5vT!fKԣjO$^ѕmC?#k,)vf]hAN*"1U~ɕ:5x;<$piguHtMdx.M;a@v#aYpQT}B&QB185p҆%1=~쟧@ -(*kXX%eE#u9Q 9*)Oy=qMZiwf `>A 0^y9 pɔ+-H8B9Qiؼ9C~OMbPvGi!vXg9usBb1%z< ,/yd+ $S q-ExЗFXUbvS"SZ) fn&,آƊMR>ڬ(1)һW4\k, CTjw.ʁX%Mw.RT@C|AX˽J4]`dt馊PLg.η|_o{k&5@ET]وGT'cfK?l2 ed]l^ E4|+KV7`Uk0S<6W,`-6FnITiywJ!}(4Jj?#a0ר mwo,mm2F,p9GeŤ͡3j0x*V=^˄9+-9Ӧ @rb0@7q1@;)PIw[` w2艮*4!x"rMh8B7WV>divI&m3!PyDMä\%\z!s1>N9^SyO|H#Vr(jVNpG&ܨ# $6 oE׿Ɗ`i ple*Ӧ!vC=9Ȧ f*Z^ Xddt~騑ؾ3I~8Rqerѭ8kfx^l?$@XR6 ݕǢΝhL ;G;@HTOrLGpgt>'޾9z9MJ_~ȟҎ@)HYeՓ!m/E=⦩]vmLKՄi\~.1Wx e\D9_ziCr>ƣN"YC s.ny,+sc{>&@-bKߎ#Yng'ίA'75oZ0~>3S||MC?ff?/H[L$L!{+fKxmeD }@Ё"p{3a,׾"V 8U~K+/h{J-AG鱺^@QVaW 2 ޹TF9 s{"R#Cwqu$rW+DV!Rmw O1{4VFaT9rIV47-JQe矍xs+w$D/]gz!9 Ѭ11닣cR/=7h$$oB$bpR|k 3uRj? ykWΔL$^0[w#[+6B! aeFWaFa-S'#bc1 Gx۴,H F<!A1]U+9tI\q,ϟ>gbߜz*l4uP$ 2bkPHH#l깻MJݞ{#`3Vu[X$PNCc$I,ikg~v\7.ɧ.7e9e6@;Qµ}⯤j>nc?c 8 EpeO X _»wϹɥO,6/!lF H<,I;UO>zʒ#W>8ݳM.S*1ʑqÄ]8D [?nL w(Y#j,8&[/hd-码vQd 'SL2׀Qܿh4NA<'=e{@'גw.#a#u`%뺶 ͍yaIJ~;0?5xNVbV+P*?z+0`3ԎC { &n Lީ㹴Uυ8 -ÇXpoČ \GV2Z/WјIzӤJz${A pj]}>6!qB3;4Aݺ%bGyR@HQdwڟD_2)~0M)+l(JeH[SZ՟o7:=[{W¸_>m~ 56G+8Y^EwSZNP}N 說] DSa8zD!'d|ص{ 3 *j<7@ tŰ,;\=Ώ5ţ  r'" 𬘿rȶe@`%T#}B}mƙTzC+yq]6[PIO:%x?@>ȸ:[aMKTDj4 0_!';g YNuMD >aLGmp]|]^$n=&u_p"Ho}%=PŶa/;J|!W j[F*Т{(in2c5[vRR3mD1GfRF:#k(`2 :خYlOi F_01amQ'P?hL[v]siٿ!>YEIZ1QF?cHp44'Z"+PzL7S@g"F&%m4I3aV/@ U07=TIיaO(w^ FF<\p$HSfoZջmN wߑQa:c9zoӵ GJL3|tA/ʄSo\UÌ^OSs o#tRrF0QsU)BGiAe9x !~{YxuJx6$'!s"=~232WT aq'`MZ!27">lJ_u.|" lZ7k ](oTiEZbU9!w_Jx%C<_ja}b;%_rhpI- b=׿YUK(40r'D=-VDP|ͫg_%C L#:_nL~hdI ]NGƻ޷97v^[J] hdzٰ 3R7iOФBGM!™يy.TǟKO3t( oN ܲΊe ,S~?<w>O'w"{nswRS_moPoԔ7M-\AisGP pO%/jм=T~_l PBiWx&QoM9{||RB_2LBq?ېmC]T(f`/h$3ErJroB=7lu8x@E6|}RhwyY3a-bP(/TrZwhF«+2dw":mT"%֌*9c{&|lܸDrELq \[p٨r_Lیwo.lJbr_=֑A29Tt7)m?Sژ) lLrnKsJ N5?~kr)iro&h0&¦4ѾqVff8ZV{'ć#d\Go;$Κ 5)rM,]Z.N3t?IG8B\F~ dEsDs8wJI`pN#"\J2$ 6v4|= g i.;gyhV9c5NRt(U)d R7( 9,>@?YR΁vX:Fze!uʈ~g2O=>XmlXKY6ǶA:N[Ace1k{V ۺL-l'EGs*}S>lҧLc/=u*ٻI "/޸ S?^R'VTM[S0=*2-Ts#)yDV!h1RdE3q nu>CB'Ux&eVTdD"ߏFr*Tn4hz0+7Hv+ET>sadX>Y=@>3!6_CcbBeA]F*c={ ZKo-[:H[IAuTvR$Iwv*1.ȡzip{H)+'Nxr ͮ~qbӟ|X.}ǥtChVU+)#i)52Cɗ$^7~N dJ%xYȹ)C s^+׳9|!:ˢ ]T9x'=J; ;(7u7g>6;vGX݆/:$A֬>oG'=ʥ|Dn=,-n!?5d '˃HVmtH\la{QS˙;BF>kPR" |9HR4$[fOꁘCw%@mcD۶mNvǶm$_Onw jV>٣HQIe(Z=D/RtBdzO)Yb[S>|QUpuqpgPE]nF$&Sr$5\W%$xJj2NX#h02C;BV߸Lbu񝈻rR fgNDӓ>kP)}ʜ:|;-IPU9%ewގa o8Ӣ:ɘqV/re:*G>Aƻƫ^agt{`&(pAOw}啼`0Glۓ}eoH/PLp'P1'lfspvc4trN*Cɺf;LYcɲj~s6 ^)I2f(|@RHְT<ϥ/KB> z2 pMqXVSL7kg̕e e5U@v_:?lsXXYQStt%Pӹ&u<3B߳qVd&]]&y231v QHBpC(s&H@}{U{1gGхpB]\$T۷X>p>Uh+@kf %[CJ>+FA ex~~+U>Y~ ,1B5 J.&V45.^ޟ6Av ο؍KͳiߞVVe:5(ᑦ ߿}R<{MJ v|T/C5oIWSqu$xy`*M ^˄M 1<vTMv%g,c5P<4-̎ `gdyY |˽?e ";4e>Au( V>.Ϳ\ewK(׿㮕_ @=oODXSn^mueS'z=׃q( %9o%_kR|O V;,?o~Ay~fykZ'[|+ Ǹ~AH _';M2:cІ s;`(տh#UpoFZ^u4@0iݙK_`ɖ2ERSjKb^K0Eɸ'+NChth|n"¦B6 03u8ټ!nŢxД*l WA*J m)2]I i>T]~4oZO/>s<)ͱհcrEeViof8y`>8E ǀEn~=xf0e#qQXSĔtErD}Kn9\猑ϵPÔoAAWg恬d3.޿օXa L1&ŘJ̃+l@ʓ^>I+߰D tqIaݐd 5Tr.y;xͪ-W-8LL>e|nia S[cLSY0')YH٪ /d-TVl2u(R@ٳ. 5}+vgOmW3_hLo0krx5)rH!3W u.Xaa@GVþKg~'Y9&D4zAQ)lzm=Unj@R^$R3SeTIA7dm&pEB(1ҌKét">杯ݥ_s2P* u%tbc\Qnq+xXح—8_z}6\v(#NW{!@Vj^ h9; jkN^!|N Νϟ0 D~&ʥM:bjz?+W ^]bh}0=fT&Hp^ҿ?)G;cK:$,;dׅSo?pO2ߣhG窸o9p )v=2' QXG[=R͘l '_8t>H :v.fܢzjȸFO8՟SGx?ؒ h P+6fŬT7׎أ_[/uyf(!^k*~jj& #%#0a3ITqn+lJZfƞ$AM~gG,qQEVvI],k @2JDiaSl7V:+t7Wa-W mӐ * g0^*N lĽ4iMSY=CBR|9AV@V9WN({aJ7ĀZ05̗1fӵ~{(ԯ>iCB"&n lS\Y݅^C!;Ť+fxK}u4UO=wKYw}$xS?@J5^ΉI[()EEcPuE~7 pKX?\(v=nC'жe%ˁ-eI %\1իDžTk2%i^w`x $ґO*b(JVP0a1[?QK"L>1Z%}a%O|pʐ$$9Nb#{4#nڣuu;w+oF77`HcJ/,%+v3cy< Q}ί_7]H&~BǑJm@aqQޗ#R_[ǝ$Cg֨qY | Ew<5:Aٍ6NO5tVRtODžκKiQv@w-wi˙?@"I1orY/N !# j[3z$x,}Zo\(47*IHExƗ-A/ZU:}oLzo/d-X-al|hYZqUBo (9A#|=x_AUsC;7J-ģrO|eclp?2Yl[v+CGDds5T=?z'?ңHDIHiC{pcj/x3UWGP*Ba<9ѷ ~{>P-o|lxzi z;@ChVXBh\R-XP<֪V6<ǡg-{)Q ea۪GOBV61\tC0|i` BHjebRyi+^ԠhJì~ǜψI;n Yò7՛4"x8X|Vժqz]8c:d CӋh>g%x .' n..Œ%jg$O2#̸/ jĭ ேOQi K2ZoJ, e| gNdc D+gYSg/eI6OKi^cHa!79˩k v/J'p.}a"w=mFrˏb;6pz$r0sF43j}`H8QU|[҉\k<]߃^bҔ[DBd=\}o!(s7:>C7SB>8Jw!#Cl;J<˙S.0_~Y3F*z"\;V`t#=6tc"GT#WY@Zg! L 66isԔ5|L$Wڳ: g2&YQ&GkBŒR=EiK~(?T+r=gfk9 Bg2=e7Pt?kw;]tN/-8.=ͯr 1rdbFTt!w AWv:c9 Մf(:wyO)C E$=ŗS9g.QڰvHl<%N:Xn*.L)v4=u NJIɮ"0r?4W!*^cXt,{6J83i{aŚ]^t@C^ '1{VF+@_ꨈ$ ,tUCZcs' 䶭ݾU!s{.a%.hU%B@X3`o柫yY?wgc+OژH짥&\8 ~]'[+si,*(vA5ASTb^@dp AbyQ K_~ lp;k|ցțY ;eW}`G/\[aʑeEsCjpndAS@4ԋuRk5-EP@ 9tF4R;\Se})8f2fd[XxVӕ*n9|'ϢtA\>770i(Vx=j_Yyv:mҦ6^TK>7laC'w-1VdH(Z(';2͢CkLHqy&s)E3\ x:L2U=ʎa2yu1gx385Prh0D=/6wWիxf+Ӊ!la hU7siWsofoce7䢤YQU"$2i%۟ة]戾1Ѐn$ߥ B˅ܮ3ZV5;5djϭaQ®uJUfkzL:`Ar &n~7.Xv3c3 x\60 :9pyC $ ^(Yfk[z."%t.I;}@DB LgL13Q?$0ab0v &T68' Ԏ}9}vz?AmU ͦi_9އhE$Z8?2|p()mtCU|r'qSU,dɑQ.d>)^Yݣ {a7OQBn\)MAIiݙQS. TT`;ո-K]*ȶ._kSqr t= (!4c[C//C:1M])F FA[loo iSoyQIgAF2?4GkI|i|oRjo!\MW_O)26,Wm$hүYܛsYx!׫lE f b _'i:*|-vKW2=xmv5 ieE8<}[7>c/n$y EܐjD kߓ##{~>cFg ;ς{{fZŊg'ŖU#F{3E13~̍;"bD#n6Ў,k+v+/)GIsjF`8}}tI"5Q5Hƽ2y%;~55;(QJ >fսuiaoIdIaŰrPԬ %ص69jܕʵ e͎m dd+Y]'eɶI/\ٷV¶Xv]^GC[!n|[j)@+_rC0`q]KaOucce\ YkfGVjx4"#:n/;y؂:1X.: 6t;._#Ѻ`)Jv МLl;Vx[?MYg볹+F, Obа_ cX̋umC[i(űͷ_YR BU-R`kKecۂ4C.LGcqK7'a~ sB?0 G]< \!MѴS'R7I)Nr}\,op>.jdbVah}ɚu%Mu7fL4ʠliڌZxQITK>1}RFwZ#uK, CGVFqv~iؑ,zQWHWOzC$/-lFMC00ĽP? )BV޳Ƅn&ok(ckΥ0] iMEG_k!X 5UXI;}VK([rF6G5IF>rT"cw[^ƛZ \@+IE:GFڑ"kvQߊ?yZ8zKEy>bĮ:!7\T|@ CX `!c2~B.+j)";V?Û^!Sy^*nVG;5)[*Ay'dwK{Le)C_<ݿ<'Go2[T/UA5o ]hBp]=9o5X%ˉ|pP:%\5.# :MT qoG:j}@'O˗`/  :ܬgk{hXǕUs ]μ) Pg+~#$܂cv1DEYWJ3e@<]}r~g5W hGKX`OAI*b-ysA[gɦi9\i@m2zpW,R;r%=opʚ>7/7y|Z~@G`=VՁ/eUtL #Rbt!$y G֞mxH#;C5sI2to*P!U*×osZSe:65%ڳ&%M<-tG]pzxpJJ_oeg*IژXc~KS(|zHpMF`2nE}lkl ;b6t̡ĻVit02,[ZEDFc eeqɝO0b ~$|3*5)7tW{)n~nv>۳i'KV*3~{F3JgiA2WB&9grfv"9.|XU7 EMKW!'~ݟXDwU4 u|_}OikGيybTr@_2ͼ|5P^gwQ$C_kL_n,ƼdռXQu-cY D4+lp<6X*Oj},bgZEVWr8_0 Xz!Iu[v>ߍB=\- (4Gwo1A͚|l/iuiu*;5`!sXhsS2^#э>\臘_lE ]0$H.B|. I5R/kK! Z{}WJR&JұrE C>endobj 23 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 389 555 500 500 833 778 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389 348 220 348 570 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 389 500 500 500 500 220 500 333 747 266 500 606 606 747 333 400 570 300 300 333 576 500 250 333 300 300 500 750 750 750 500 667 667 667 667 667 667 944 667 667 667 667 667 389 389 389 389 722 722 722 722 722 722 722 570 722 722 722 722 722 611 611 500 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 444 500 444]endobj 24 0 obj<>stream xcpm7vvlv:mtl۶tl;ۙs0ufaW]oymɈLL\6n.Ɔ+ )7@ jj `f0qqqD<,-\JT44MG`oMgKs;XQba 01+hJI(%TvN6W#Kc) M03'4go'gSco5ScSXS'[Kg3`dh{?|; d-aSwvq6vtp|[U..vf;%M]7?0\CK;g7`d 0tv1 d/7\-Z77?8Q l[∭x^3LFX[ӛa A/-}rM3!:ya!wUCM@OF,;jOxM1?4g /\\hKTK m! ~ic猝B-ݍy2)]~yapv7hp28ýGY%|9})bjWXS)%Otz1^m%]c }N^k=d/n)'@H@&1H&$h dV}1hܭVOk@}r!r˳xɽgU6)̍Ac%=Vu S˂9}Aa /~+Z雀\!mcz)kFˮ[Ogܪ79P8ׂr+"I10+IHZ? MPv嬤w;!ϥt^"uJ@WimU>RR`\e]0Kˀ?J|*f z)҂љq@y]-LJlSB'ĆŽj9aϸPD0w3ƦK)=i]^TNʥ)7B%QbpuY#)'#MeNI!Z eBCH1݂O8D%[\hVș=)"bB{rTPOS۪썋C5AUé`#9cI2 &ߗl>5JM*x\U ZM.4,;zlS"s1O2)چ'&<]B(yh멂ogXyK'F @!tpkJ JS' n#x…K@gxSn$f(^&d(dz3 4-f( <{_o2G<:WmJy?ȍ(p!7˻ˡx xŊmLpS|N0C+#Ґ`3c&k:l*'.tl<:;|VwNUCP!ĩ |.#G!7GKF6#w񽲁tclWZz1ZJp]$ ʭ/Rss +o}|fzʨ s #+O׆RS}# ҡ1Gy\oT0di9a/uŚϗ-A$< {Uv5hqp.€ I.+e@Y#M|BJړ\Hr/"Or:ͳ`ج,^fn3K_1^*˻6(t/#9`7?t*׭(QmF_EYnùq6=_Sw<V8ߙ9;Avѡ8$x(xBct}*|Ẅ́HbR,E"&U[~þKS:dޚ K#ɍ뒽mKޤgM5ٿ+=è}x: 8TJGdIErf"p"8o[%bNU'к&?3k,_5*W%Z U2y/N5Ks5KE|1 ofőtgDa`~wP"HۏSLچO'L?l`m+h\Ao#<*Csx{^M;@vI~ci+Uo'&Lh`*ߍ-ɜ$Yhߟ ^J5:Bxڨr3'^@ ^sa556W&鞎[:kTD?֖L3' .aaG9^1{x7%\ NnV$g~/oA 6T쵋H qSr"O_A !2UNbn j(ӓ608փX"seJr s;Nf -u=G[̒@5U{2 Dal ߒ$)gp[2ܵ:Jݺ&4G GnUV LfMxWB~݂97?E|M T3 E׹/maٌ zK=aPcB1,BЛ΁g?H~˚ؒji2Xqjنړ,"WFO:D8;Cktzڄ~eM倔{!h5i] Jl^{lـ.~/3ιwڛDU$c1Oɼ8j#` ޓc@˹MN\f1(3Oj7{6(lOL )-T>sp /<׷9z }B? 'վ΀Q)@Ֆdu@[6#pHPgbN^prWLXF[ XEv-^O8=fjj>S :w?(vx Y\\^ d`޶/s%x8?I4Hv8\Prhx-2'f[FʓIl[K)ܶpK|$Bi,n)Z)3׿Ti!FzM4՘yO v& zz /1>)AX'Dh Ųڛ xv+|\ ͅMt3E^ѣQFS}| u|\H& Y_[wECw]\IJ4&v8E KgWEtiHt 9j{! 5O*jb]Ef).~e`nH^X V &sʼ3ALý"|Eid L.R y_$K%N C4sl Ƚr_EDU2·=W61K[K9S T"FO`ǣq6+`UH1}..=!^ǺqMK ocEecI ӗ|LXB P\~9~wKAM780xrb;`LtfOJϮF Nu4N8 `a숸y FVT_ ,~4PIrAoIrzH+LV%K3vu\E8n۰:Yr8-M,g9{Ͱb~t1;hi݆.,COL խ5XIZsq %)ow@PS5~a{L@jo܉@s7g__7^/_l@0bTAA[\q>q51Qb-\_Fn\G̮ 68:XP̍؟18מC*S[qQ>=4TuF&Ӄ#ü5f_V m@nbzȦ$'~qеJ\S[fׅ+uH?Y @H_f :(lN9h ; ;hޞ㓋y?qo?{xah9CZʕ=H)$<0*kK'*k WY)IZ84i N.1!Q_Bf{b5/I(ӕ&aU :cէ5mYa cq}#*m}߆2C\ |?ތi{1sȟǵRqC3L⋻SʆCG5U(>Ɠ\iZ1 UGȼp$ൈ YfY]7zxXu gäI/_Bi.ܫ)A7ޮ~ᯨEm#yZ͓ 3:\Z^=khڃz'#ةsIȥzFNm׾QJb-k`B7vBH=sc9` gt;oK0FAY~(p2wVpנ8rS/|AYGyO=|qU$͌7M*'?iÂ./#21yu.('"i-6[ *,WHi ?iIgљJ!T \fjܭY,Agĩ^WhCuՋatd/A:nXmvM:~f6G1:u_$ ,˞*1yhƣ;<7&.4Вn`X0tί?r;޳m67>$x1Rg3\u̧߅;c3`ҁKHH8^v`xUY|K,Vڱ] 2&%HLD:b爈mmfr{=zw8M~)+HiqnރͺYǐ9])L'\<5XUo5/E̬Kwx6Z86h֓dW{[MwaA5Y5s?~~Otea@S.Biv k%HޭNGUb[sX]akVE^+蠺85`^ۊŵK7BْO#>I)q_;^=򰣉vD/BhFB輶2e –%TVфg޼L!wB҉j.+m諣`zsr U-sr jNp7 ͓u7 J*]HQ:ӯ?}bNCgϪSÕGUͽ[03ldc2scZ2W7oAn *~51i}( BWC-_&OPXL)`6QJt9v"U%L$R~^{8J%ʧ5aqeP/Q 8koGYv Z]IA1dmcTgͰ@O OP1vc`BLPȉ/L hlR1(yɳy4x^!kdG6OL`#]^e8 ނ5m1=!jFA7) ;}" XY9-xhڨopzH/tF38NI _ -ye^:*_.ܒ$?Д\XZyYX1~ =у"4n1ļ/՚Y:=zZ1aY*D(=bVp+t;\ohnE`}A$eB&j4!U/(S& @${M7WΤnړԁEU+?R #KwUor^ye$Prl%Խ)t:0*7s++Im-7kL|(E/ElV_g/0O-N AK[d(#X gELRߐ޶|cy bJ=*VUo!g2[qꖔ+NZ!{@@ǻbQߪloޛP_/oiK.M.4R:D1L9Rh^/=w?qޛ !klvڶ4@ ,[ih>BOxôֶ@R_E5=<^L2BC>ur5pMs<%<}*}oR%/RRv`Z_N#(7p(F;D9_ڊZp;+Lzd!1?J,XsHՃqHFT,;~4ܘ/n0%Y# =ȳ .Sj & p'B5̈́=33jrU/R9j~U"e~{@-_ND--a+:,OjXcx"D+K/;x/ՖKݡf(KZAu> AvfbU6A}GqJj. j\X^ƼG?㢙MqoWoj]G@>)0Bs*JmHbٻF> `A%mqŒ` 6jTSk^" I-!U}3) 09^k8)f3ms79žKz$ܐS|r"4_Tu$vQ',D}Ca Ή<ʷB&Ǿw&t>­"t yvyb"3{_>Ly^9;6]/Gvʕբ|o(*Kz^R1DB, vn`(~`Q'([}Ǥ?a ď܈!~ (^tdV%tSbx{r8T7ۉmߩK=4F x*Z,1ɖ˝/׏E;4\Xs>~yɾƄh ԖDP-OȀݤ-4U6:x 鸏x9^K䩪9 2*:aORxB$:miN'"Ӳ@f2wV!pIc6v4 S=>D/޵׮+ Zr~-?o@5bT|hgj/NHd-&o#P +aSip1۾|m9B v/q5}ܼ&$C4GCCYM&uقÊNs g E&}v䭾*_$r%Q&Ě$ ]!#t9Rgzϐ&8Ձ`n`J*uT9ߘ8-W$mK8h_#)yl"4YTIiwn3ى@)k7ktHE\_֘UQfD0 9uvd$+E<% 1e8 eQx6iݽd%(YHr4a'l"WMF2q*E< Gv;.ɛjTp5ʐ<}vr/ M PY-ЎZ-N`k̖wu@sf6Cq)UߧH;ܵ<;KsD**~BP-x?l'UQ8p4="wyGz^SPrBBR F_jx6>mTzfˆ%ԩrEs U$o9p,!gdcjLMw!-{wTEڰn#-q_JMHlÎRfv~.&Ǭ~j$͠Bo ĉtV3Qk@6KkU.1\ ˘k!TȍCD7܈vm#;c/7i?TΊ>8:rJXpL]LySR\a( tKLl7ϝp[|e fЏ]#^!32Br3{e!(QȘX燌*$ ZqKQ#}z1 \m*9CS>D%QIX? R@^+2 FL'w0Ѓ\A\|e1Ѹ_Fq޳h%`[uq'G k:m+Zj,-H ϭA63Ԫ\ʯ ^-Y~9b@!Z:(ToAͿinrP18-`0( D G<张v9?%e\8..|?ݯAˋ"w4FmyMO+BIe~lAڒ%W?~>vjɴ{b`9Q!#"&n<}DEr0Vp|cBy0ߴ̮{k<">烶EV7Z;,-\<}8[ph2kEmnz4-q Ĕaa-*jmuEI#9߷LwG2/D.Vs}+53qY1&UAD1 n`z yꛨ%lEEЪ=SZaB4͎"ShkL=]Xukiqd Q?(R9FtyӭH]Tg 絟*w{64A \Me`AdD\mylc#UAa|*n(,HG/KGP ]bZ25K/8Ht2 >?3jR%o4lJ},\{MBb9>pth]7,'fZʅvI-+}2 פaj[lk{ '(~}Iv͗g дd&rE7Q7.Y5◑=Ifnol)zB?-0T^N@罶ܐnN[3:\ȓ5zi vr-ޖ OdIFRi[pTɵ5U$ÏqF4Ph|(nڃ^(3YפfeSI'++ɾήS h. j'0Hs>گY߻Pa[#\־"ݽp ¿ d &Y_#C{qD"@}ѿE 4,:׏ƬM%`KC/]7R uVau O&Fc,bU `()]'k (-}? rm? mN>>@0 tP[A"V;zuM9" [PgsN+9k%F\mP|A!"\fWv5$-go2b0 Q~Ipᐰ5\RdqZ|ᖀ0 q`X;C(KPr 7"zcHK_pշt\'[?Ɠ@ō!$d}l-2c,qF8ٝ~M@͝' vC>gAh+LV ̩?sZ3rGNv΅C=Qvc!$" I?o]n{g%*Tݵa"Ihɳ *{nA6߿ 5Gc%?l`dt=L&gdaJˬO? 8* h-gh&fF)FZWm*jXÑ)cq͚Zj9LɪV(ļ ӤpFo@Vjz=d|6g Z4:q7RZ#& . T}ֻ_lP_<*4IC5*mw(r,QThk2"T?Vk3o0il5 *h:*+R`BdT١ٽO h!O\x:۴+CO/ݵN6AoHS+_/I׶aT49tw${MjKB\W//K8R [qOk#>>'o&,6h~JݩnD[/ O_pBV XDx殭"XɛC/сla^V_#|AV.af|LmXOk.n*JƑk jL !1VLMNXኅ 57.Njy6;#ANqm/9T.]i/ϴ8T?"%sO/fӣWBvq81ܣ]6CIr M9 Q,&J1~J^9_UFx :=]Bx5 r쾕 ({X$IֳpɃ:կڝqSQ9sue*^ J3T_`W_;(@UV zե%iYR#;s܏`[{f,'sU1/% gP2tTDhܟ M@m*8æ3 5,|L67sn+yg 3*~~d5QlRzI+~?D8Qa#-^dwG3h> /9زm!C+#<Bnȧì^c; f\`L"DG3+'j \Χi(bYlv,Ƌ@n4IHM=1Z-HNayq^>饪"B`?_arH1ؐ"b] D qp-1j#-a&1uU8v= /uٹh䚹 +eփ|zW˄y@/֭E Z ,7:޵r0f~*:3<}.h/٦@qőP{2|TV$,;j/,l+l3Gt]/sm kC" pt?GFf0$ muJмzҭJj0bƊ\Y q2wg9@ƿxBeCw=T;I+p I  YX5p`v/L@0Wm"zB.;Wxu)TT{G}c~ 8%)ɓ,KY]k̴q86}i ǁSS)%\?wIFnuzcX.S׮#9>I1p$wWe6[_e̼.$23M}L$SӮ"6b >ɦYw7H᥎|QdNS.r`Jw\Eix !۲ZfA).L3DaPc:)Q km+.ʮ阉&gZb.~3=^Di Zʄ"0tro++S}wc cWlvܻϤV/e‰ A=Kn7+@!!RB'Fm:!CB=lZZƒt0:f @c,90-];~<*& H? UI'OSv Aff`2U*jߨ]Fx(F#'F8 A; 0S3ȱ@'7?s|&TN\RfU mȯ+,,UT []a,Dv棺<ƈ3M(UfC߸Jl IkѨX]Rap|Պ-۠3y;rC\:@W͔lpWNM#M#[_K#+F%i{/&كEUAB>T^yv4eyBO~&Mr:EI[Q-3Y,ؾo /pN nh ?늺T?oj9}!j,Q29k^'vsQ^[Ӌ.dJzoUı>Z l:΀eT=~ny.xL\6 (.y??='A욾. â43S]Cxۙ.{{)ow*}eSG=vkd/Ʈ{ӔD}zԿ(šW{[\q*?Ň4a6+B>SLJizpQ< T9)vr-# $MZH%;zaa%yj?+]4(.&<岯 (~Dq>Hduij|%T+QGvLew[mQ:uy][]@aŰ n i(% .3( -1ZGm.+XP3mKg?zR-z"V|_f\v*Bf69 ;{k覊1v+p',m4ߺ`M f)o0^0A' zU-岙{IӮb(ԅ\mR9Tz({\eޯ>W3XsV~g*[EʈzP}ũNH>*x4̚\2tuRX:\-b5 %׼"Оze}q6g3nEDqIM {yPB=lF2Ƒ_~GICVn8Y[;"zDdoaAq˭$g~`=fZ"HH;4k4cL t8LfYc@G/t;w&ib).gUXJ1!~2Q`^y EZd=뭵cQmj(,W 3w}QpTmLY۟2e-05t,bm+{S(RA9t^1&Ng.`Gcη7Mӽ,j"g46}?ɸx~_CPtNK݌H뱄K]mXn7{2NniУHUc%ry0(?=XR5nN9 _$LxqS횒A-I84K6N[r^X!9Q|赚ʃR3@ ȇT2Va'(+?Lu.r7/(CPԏ=o_[]dOS3>o mA KR#9TPf7]-^TMߙ_*v;u.Z03E MƧ4}ڧ)~>v<ؗF3]AZ*m\6L1]]⮾tT7a"x4劌73b.d7ΏU/͵tؘl 8W'OVDgdнV9@B^C!yt):Vc-®&~d˺IzP\v14(D8`=u2Yi0ѫ2jX#=̄q Aq%yE9@\6餋犅̠Tȫ{_dЌPm bft2-Ma!SKH76 Ĭ-4,TK& 2Z_΋ CDL??M!7;o\o0Ldd Ny f )M8_2[Ȼ짐 34L1o! Pg{GD4L2>Ol1Oр?dTiGk2%SLX7P-hchB=F:bƓCeh8|cPwQD7 WC^޻x@`TQt}ЄKY!;jrKod0R.`4|JK5Oeikm{,;BU, Yl j|i h:xln8O3_Q Uʋv "^>O :7]=]S\5繍נp`,;vy[TZbU'Ӑ,+#1&6;- VTv^4HaQB1jzF˩rD { bM+TO|?AݗpZLJE* G&6t4UnbfjtYOuQ6ٹp';\2ikm(C?7d`T&  Nf9e{>X4xpxt-VHH`Il8  QJf'vc9YdpUE@YGa/,m:W% (5O|rkxb6E1OdЬa(Lǣ4Rʛ<͞s1c;Z$3i[Aޢ 7*΁Mς?k'0:_m"0@ڧM]N(̣Jџ[\7T|:C|n+uFgC"6swW0.ϹrR  q wBd;b­*~+D7*Z/C,'^' +[xaQn;|*S(3 dWVZB+ T2M=g"uت1NXVkƩN/ź\1HYҦB0mAcTzM D|n KH!E_<_"!RTe3xbtݸ V=x.)A6Ow(Û?/<&$ d/Ȯ[Y;oqy`K 1&=`NS {MC~1KF*^!\P^AkA ၴ,7{vRN*WݾVVUœ+ }npj1ts>3|v_6Ft-9V\{R#z7Rs5?@sTUI;7&WPs*E$7syvs0o}<gHmI3G%ʼB t5|;#)*!{ﮛSnSXz < K\~_h*2xdd`2.ل*WGw :" :ϏJBb`?{šuvZqS&\`ӻkfXbK,Xrׁ-RY~Z}-hGd*S4^;7ap|Cۓf.d;dkjkE}`a:ၮ I3PCmeU*Ovj_ ~;u0)cnKr9wxWOx(<~}a րRE贆.{T b1s%OR#J7~0{5m?">O# U|0R#8krw+z qfPR!i6-B!n|)׻zyG)km3 {뼞qra^8h⹿@nKWopUEU'Pj2:vB {U{XfYqs&Uĩf{v(/cMݒt w*MQۻbܶYC4ϔ6@L윰)DئPÔUYcͅmg~ȧxsygBȔ. Q̵<n0j{Y0a?:ƕ'J9 .KTxuOq[tؐYգ'G2aHKl"${yzF_۸]~DdsWOJn+g EA7{yU#, >+'&Յp¹}oUlMhwU}C*svR8>MY6ζpo8g6qx 6feһLmz'\_z1$XB,<`N?⸣1:VO:M;ʼnǼ~=ɗ[<6əoF%Sc>€V砄g/0"lwx> {BwCkԣ>S$Vh0)[r 6)Io;'wz6%` P}V`mֹZuMj򚺺/U%ôFWF=>?e}P3In9ZG s.]1)M\я%>+TEw/gF%cDTL Dj>_SqW!%-thsN`|FĿr{ Tg|U!`5=mQΚko;^D3V'^70<W^GfFVGڑp5Gs$R:1*t%ʐVu.qC|%+E|qLU :d,O[Kof̣=CP,!#FXqxz\<3B/͉3vqRٶ-D@w0TR miBRW0x6/#YX! %yrR/-ִh`T-DB",G6V~{­0ݺŵ^%(,}W;~W*GjY [4Q&MSHB d)m4_>Vgs` ):q|x詮D[L~ ê}A==|kelХߎ/fؼ;hm'D?R.hP/ZJ-+ C1.jad/S͡V)pQ\V&@@c2$ᚠVc\7^غMjd]ڱV(,Ukug# X1f?w}F3N)7J2Q0$ VV7͝C1V'P@KzEE˅8rUBʁ %w _QHw/Y!<_ܡڑ//.)ZxX]}ئ7c 9?'hD/] lV[R\EQ3 ǁ>υ<¾ݤ.a%,nf K1䮏Bu=u*:>$w8.,gؓ2.D^a?ˎx^8&GÝ[~871hHv@"\6A=r|UIp/^k)y8S- Ȝo{$C>]l }i3NYJށ|01b:Ɲ=?{捴8_W>$.leGqlE-]_(+#ĐFC mpa[Y~I2F;8)tKތ9c 4:_ ZfY9:?g\" ^8<7YJf*l|ZyGaS/dZU_4^G3? GҦI-֐:E~<,]ZUnM}I*e2E0fg[MuosS40b (Ѝ,iÈ0-C&ԝ(@ q` FU\jtNMĦrcQ]2 z0S:/߆0UXiB<7(Z=vĎYmP R( V=` GQDv.Kfq=A0?ׅVVO1Τ5E9u5.2tu\3LpM1c+˩:'o4l=.@d5`]ZZc7dmԷ7nbJi,+{ٵLq+~ϫkZYߴ6KN-ʞW~ɆC~ j2Ɉi)E! wԍ CiVȺ?sr_uw$n3L;@VE `r~jIn|w: ` iK{%Jø0E}1:5^{bTUv:C}VRYJlÿ́sJQ OEjz{Zx"lj58PE93vZhi:l=B2ceO2P0%M^nRc!&np]h\Evg uw/F##C[eE$dPVRJ4UD &KTt3˲IRj!u踯 = d?i@bDB'8?*UͰNPvYX8jMb.P܆&wJL), LKϙ݅Py5yQEr׆ijر) CT)nױzY۵754f?lDB7z4)龻BpF<쵻[r Fr j# C75&U |=z4 )NKCM/c<~Q8eZS`[8 BWj`hfK^ďz¡a DLou JPA-UJ`+aEȵKln@3ָ,kH` [Ԡf"AoeytExxFz_G{xQr?/b1lloJwf ihkYiCOG̾˭pn#6Q! Z/~j,ĶB`WwzM>k̰@EdpV崙Xk*Zw6DH0Cw A^ zd$/_9SL]9!ifP(/Ɖ\(ƺbf@qO6TzVXX:ÊPNPm }(ʢQ,aIX^P9 ٢63n$Pwz>#B$nd3*]|rB64ъ(A=i>`DzvWc<,A̩cɰײwOigKp70P}6% ,k_c`ڽwֈxc4mmiH(VPL ^8gmy]J5tr qi$}2ućzZ csϭZ^XԦ;Tat|Ddx/5cA#zw5 #ɮstytsvmLf5}|xűfǹ.\$ 7א: )"uugxpfb(:kN/IXhL5Gf1-z9Y Vs mpCUOlzg{Q9SN8;u|Y/*@όgJ!3v-#c Eʖi:e%X9dm?%#(18xtWm&)ڿSq{Ue{ZF冰Lz`߉mw½"[T>{! /MZ[.$roS5I\dH>'î/c{NUt?%8&!ݼޓrMcܼY(h@:|ߐ's韉ZT-xCޟ)eqozBi.cynu:c1Wn_  ; hûmD,T[:S$;VK2J01Aewt6|MASHHn[eLh~;6LpDO60%'@ <`G/eIg^%NdmF=.Hw,yQ8+q/;4P)ABt„]ڪhhADh][`b-Vϳ^ݏLdԹHP )P k^r{_FQ"nyStĞ_` FhnWAD31S XGQwn#]R5hqTmB(ڑv|Q@9͋D9\:yV[-,K .2ӁaȱUPOU$8|aæ񮔉*/P:!nI0CxY3J!^m(7Q׀ N&= #LX"%qUi MctiR{'NuQ&ŽyV)§xge/nnwMI``r+"l 7nKiJS#Q:Ej,.}ѧ*5HL 2{jMgsirHvaq[y!nnkslLtV6494ZZىFKR+rĥf.e:R|>K^h^>ѫ=9pv#5ԟq=Kg}%HWbb)'*!r W1+Ja]Sa"ȼ!C ~ 7+a p;xݴ#/#]^Ax݇We*J!OG;B @scħs6><| uig%/d܊{1kݡ ( a#K^ҜF%jx(lG+CH#ɑ%7.νw&~w+ )w"Ww:'5cc c'_G&5$E # $q;5=ψ?g;r{eLɹv_r vD,g Kxyq[+T`~EF?8=jq.ofh@wKx 7UI-12-} !CiSъW3Q"_"Z:D#~zܔ:FfO(ՏHI>ǽ0ĭmd42T)` Uv,hSZF``]8MQҟ V,reopl`}ėYs,5L*c6! huW\ ?'N'?LVXRW tQ4n8enϡaf8AcP AY5<0ON6c >]Y8 4Ԡ8B Um,0fP1 aYi;:A_2 ٮFӕXmZ6iR؅p?AO_2ŜLflڀëbI>AE,S̏0)юs'ZDaz肹ygͽ!dr*Z<ݥ !Ջ`qWnZ B5\|l5$9)2\ 6d9J?$i^(:UnPđ;l-L92  =&=aOeDa\6R} N"but4VPI\w'"DV6ԽOaWY*sb"jVP}$dQ3$Qa-EÆf#J9<}T4|e ?gxkN. rqʩKa2K?JЯv*1hS.:^wAܑ"[T¦Xː#dUyȏn9^sA#lk,Q\iRb7^/h36ƴX}6Cci{(0"^ɄfɊ`f"4/!F԰D1#fO;-^yF5k)ūfW;s a%+P#@$yݤ=Qs:jU `B8vݭ U;(U0%1ɀA2D74Rx ZA"#'HA kByeYV 41-TIG -s<q'狼ygWjA9+xZ fW2kHJ砙{\Bb\qHOδS%aݗ[!fD-"93=s(Zy % "Nn$DI}FOi'opGf;~MUDte5&(p_+aY]%v$Z0yވ%>BR2TpeS0j'g2 o\4-sX^MR[D̬yÓs\8gFҔo_u=S}c FfI6wZiXLMz)>Y9K&{NO"sݹۮ уJ0+`p/P<"@u֝7Ǜb[ dۦ-F1חMh/85HWbPc#c&MuM)6 LũC\iH)Hq+֧YcUT1M5>; vh/5i1 b{KE<\c{>zWcQ<}  dp&9Pig=ܭ-EN=ìJS:|!X:pǨ^suڏ^bu}Ѹ1̫6Bv-!2I:Fz?){@)ƋDZ[C7Ues`̣b[z `s6nfr/y9R,&%3=phdyA%uufOG<"[\?5/U ?$ =]?zĉQHh:#+Un!+VcMO| L)[*&i){C CCy$oYqGQ0L2\j$#"m1ј9A bw"`pe!h=par;95O3E<ʟOrQSo  sH}f6Og'JDL>%}DkG}fM?SfD. /"K=bP,%.V;+.8Zoz!']=KDԣR(' }\|^~Z9ut*p\'=<,*{x{ I(#!QfZ -=qxs͡ѡG,? gkĆŷKRGAXok.5|QlV.1ݿAd lΩ#;Ja E&:@شu G0䧖ek]챲;f&t#6B TIAiu)`Ŗ\]*hVYOB\W8<· EĄ8&:^b0u8ָJƀO80MtyuMg}& 8#Ǿ+X+ XIѽHBȀkx x!YJu Ѝލ˚!sFmp>L88%nW Dғ,@XULQbͪ4->)OY1gm?4Ԏd]\[A{ +bd0(m_~EgibK%9Ag@i[RS1hTJYHnx4O]ߚ,mpI_Dc=M˟8Q/&#N5H߿QsT6UWYV<;Sb]UEOL,g(ȋ8 ~)(Hmնp&)e5 jH޹dV%$sciDm@R2Vl˾>ܠ˙"GaƞeZBmIiPc7aΥ7b?Vi ARb$cQr6њi䥑q Θ;0u%x&`[01> p r[YyK?Xj178ߑ泦BߖzLwAL5jf5"mC:!)> 6!FJ'q@M¦Ϙo$Y$) v4#%eq"u08[H\OgeɐRe_}Oxf5M~Llu./)]Ek\h)Vo uOLOɔBTVvJ$'HOÕ:3Qm "m=7+.Q=S08ȓ{w˒幨q}.؞,o;F̾4eN&TՖ!ifv; _pN6@"dre 7->_+hnZz22WJB0_=l5)6j&3]+ m soEHb-R9}2lLt~ssR~RYy"h^io^QXLkȂv|nuNv|s%t"ijU=`3:< Jhn<1Z=8Adt!gbA#_Jpݰ8Eb[ADW ؀Y7MϪY:.1dRnm|YF ILK|׎V_JenJحIԏ/YPg &+&G܏ ><W0>śl?2Dkl1: }bbS\5BH5kH[VC}7`A@o%ї,0 ?P? ŘFPd؎K$em - mdX̬E5KqHmmq E?7ϋ}{} J{{NR?DWXDcSGZhV Z:18o/%#8{R1cR#n*:! ]q=ܣVRX kYpvkuwZF.-;cHx?v;ߥNAf^RjKC2Q7@d3e 3)?Dm"~+dqE8J8~*X/7KF ZqN7kUz8js@I_.gBQٟv&keo s BB9yGV\ŵ!$ִpyY_^CDh%oQ_'Wtr?Z*ttm;+՗rB"H/TB׏?ZGq0z&r5Ǧƽu'v,u i CXB>$unrXMu2J R:QH]ɖu+egNaF! `) (8erǫ)1 wY+ֶ(M}j+S9K6Wp&K-F>=eGfYZ=I9QllUC/u{h{f}O9/YAsb>LK63M-)7AQ5`>֙N]}(:"rW0O J\:n9o kud OhbpI8B_jo"~P@'t[D*܉}U" l5Ԍ68¿4j :p{{ Sƌ3@+ Iո~]L,~ v\ GU[%o>Ow Q/_orDDO_/ GFGS@n:endstream endobj 25 0 obj<>endobj 26 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 600 333 333 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 556 556 556 556 260 556 333 737 370 556 584 584 737 333 606 584 351 351 333 556 537 278 333 351 365 556 869 869 869 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 666 666 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 584 611 556 556 556 556 500 555 500]endobj 27 0 obj<>stream xc|e]/[b۶ݱb۶mttlv:V8y}|:wFHQN(ngLD Z- M_46822G34&...823R: Sy'뤓-k :> ́S k @DAQSJ^@)!  .FY c `j"ٚXBNC=h`tprZ,f_9pX[+_J$lx_휜-_VEOgsCl;Y|v_&v.K?jΆNg`X8[z|Rfh/7\,lZ#K?89[{ݿ g')=Mc/fp 􉔭?&.s:+A ՗&v)WOwU#){{d)yw.6_ __?r6&B@)gï5F&,-܁&SC믱]hma ax*V_` hkoTg?_VYˡP.g{Yaa;w kY\\>;R9+gh _!kojlLzegC[//Ί PJ/[._/,J s@w1ܟe> L~mm adǥSlFǭXg[?7C\844[ڱBt DC҃ĝoު`w4FS+O?>7<4-.A4 m"Qm-y6(lβ|$6nwE^a.%9mWeX|Uj~bhvPBL/gu%>Meà exMy^f 0!>ZW*`سq3%a xJ?H]0(3.Q$6͋ZKc:c9'ITՉ~ DoyhaW1W u\JG]{P,H~13:gz\OJh6R|W0i,kyE,(7np0="Nxsz?=GޞZܳ~u=2j~$q$XiQKn-_W٭' OxE+-(+¡T8 [=$vvwXK4/x1ڋCo-gp`}_F0h{|K(&E ~d)RHN##i;#ȫ)^0-BlۧgIA"ag{םTـ0m+[FAm)y"Yj9`?:^w;C+MA_WBsRxn oI0V ͹PFy ]FS*^%Z1L:1L~DĞ|%9IJq Or)ioOv|&j-f.@!nhf虿̣ۀeYB8Jxwx|Tb«ӕ:v?]3w_cܹl&dA\RXiF(VH0`?T3q)ڏ;gY|Iyv/:ǹw,6rWx>%BNjOǠ7Oa7U̲la e/\GLuw /$g[`C;YAϪ2v4ex bMSKDoT+8.`9'l@%ZH-ܯ2L7j7lZr(kʦx{b^` 0,:MPi/T9K%Yg;E8(SiQ2Z@Vfv5FQǪR'R[Ƿaeq,_fRC}hYgKѷs{⥛,`lqR)aB^VƝ=ZQO3hI#kH`kD3;?Syvy L'8 ENhK"z'Ēf{O!Dw01 Uk̺1ۛnJT',w s CH;4fptX6aIH;.7% Ӈ4߀W{k/ONn\?r'M>N01=~DŧUm $t]ūe'.hfqxCuylt$T";$h|sZC"wSS"R<pߴ(^گq72!d{n936tqK:M&7la8hkǁX*1r-{j(Sa:8#\;By\$EyXEsT[úHQD<XLq !:&D/F*@)|!˾Πltz Otq\po p6o'B}_KPc"8(Z)'&?O eO֛s~JPKgmIp/f2G]fTU2mUrۅ$տ P>7lٱkTVM';S5 2c@/#q0.O=1X6Dfۘz\aS_E _|>a{-" * eUgB:H4y8r.vgҼq7o.k 8/C)NGS1|rX#|̦]&. $gnߩsxc qyeL*#j{Wp|DFw M1}\.å%U]?4sIЖ4 m>TգY7è$3/ֹ:;_|U՜$}-6!NnodU4JE+,5U\Jtjz+囯'O.^< _G0RAg(q[EG\ˬ"1[^jc)TF̭,NN}X(7vt,dE`a,}n_iiICfuln1ұ(h(Ρ5șv, aMr[QmePѳL)M⊿$` UuaA.jb9-ѭ4LS0 ܢfBnk|c&RAr9om*SL4(%+aory,>[[ln)Ӥ/`kRh7M@jnMUzskn]75 z/` Sh"A@4B7tAV4Y-ԡTp*-T㖪Ls#ʡ }z]7zʷ"N ҕXH%81M[VÛ~W0AlpGJ5,GNo`{XCLa,TRƴPݱd=|-`xo o ]j[ӵ(%+ IT/,)'[F{){.qѾjD؄ԌcMl{<BU i1֍u) 4h sA/8tL 9:۸yE1Y;K;POvF % 1I9 ?;^ Hx2 F]xRZd+'&c8Kފ)"cT@JADm/IirY P:*əF9-9z )8uL>gP?gj^3dke[6vjIݰҴV& CMNwl߽aDkT,&>uawf}ҔQdU%*HH C ؞N-zb/pe蹱S] ʣ%!d{U8j&jD笤#t'G| \?6-pTL8˟usL%%I& ,]O^ͱ%:ռu7An˫ݩusLBPhXUY9vqtڪ33JI-A!u'0!@5Ja UaR *N#-rCZ;l;o ,Wjzٗ)KiL\ cz";5ฺU;֎# BZd(9dAtK'h8cTG^F?XC RsO |b{dXۈJsM/7TA6 O]g픕 #ѵ32v(Ec)OEYŸ"Gm}3eϑt)i/Sq y<F+ܔvw7)L%miƇɻRB3LG (O:HX[mBޝ(vu 1_R]ZcˡM])AA%T {6.ONԽxO'r@W p:?IFRg9Gֱ vDr >nPcHv#|JaPk EaAA6oyV=lnUN3'-.mL 얽Vj":M&g.u*F6wIK[)h1" CVHG &pԟȺDB$\3A}ZbYg|Fm%ۀ͋8YU|F#}$Q9t0 Yhqu.-m/$1DwN_ŲԦG+YH;JL0)ВNX?H/OHQU|w,|Ñ=Sf`x}͏&n oܮ|TI|*isv+7UB-eK܉7 )G &^T- a-2aDhl(C@iZƜnƇ:NY/R뗑y6Ԣ*û?4&la= s(,﬍R3Ƒ|2H=˴l3+{ $/.h- X;.*uchĈTQg6ѬGo`ȇFO@V9Йw8(zy1eZN:|ZObSpJrȴ6IVQ 룤E|j!A#N4HQ5ןbA2J~KblqPMUo8_uTOc !ugnPDRЎزvZm׺X_aѱOd*MR=Sh*ܑd눳D-5bH_aDbo3jFYTa/L= ^Z݁-t'Xsr R뮅D~)(u8ů!wzT Ez**R ,*&v7kz D$"T9t c ٤eNۚiȞHg ZiᢼT6؈_LYߛڡ]%H_ rN]&qϛF=23k+›JZ+V-Iwh(ҁرya)2ZEEfV[ЇPkk\5S4j.P'Sn9Ck 3}%BE]gs|X>JQӀr=76ӌ(.HTÌy-{+m)^9utӪ= 4N |/4(5/lZ2l(L^ZغDFtcN>o`Zh[`kg-j9QZY֏a1n(Ǫ]&=#ykϯ'E#|΁}~)nwj'#Kԥ|~fYIq *y,H]k4An$i4os̡γպ P ѷ2 Ⱦ/^30z?4?i-X}/t R~AC'㣫$*ō v_ohwDgPQd.!X0f7w=9H3 ĹKNU}=7)U m#)=[=jq_$c]T QgqfN@-& Tt@EvS . %UCg uww۞x h.SoC3=9N3gCQ{'qt`H]KX'M pmb},Ě6ӨPڊ99IL?(bRL%')m(4[$cmWbEơ2@ޫ`+=πI>$F꼨Y̻3  O^t.BE2o=n.F6*CsV1#(HDLIԁ{{&JE@`*fkTjoUqsv&Y&tb{u*bܙL^slC-u^zЩqW1ib+g= JRr%/'#Z$gEKjAaGR2 ٚj܆DR5=Ihؔ9ߡh1ǃ8BEdP3={}g)$I/ M$Md!p#G*(gj(X,?F8&ql}E$rfņup2:.䮭W-ɿLJgVuEr*65_AqƩc!*?JCh5Mm @'}$],$v weSzWlbrsZg*jzYڽ ԄoQDqzYlJEýI#wNdN ˯[P"@1,?6b8FgOȣ!DVO4Ρ*t$ &^ :mĎ*1n?ZBGnM0IXNѯ—J*! {@F? &• _xV{^":j$1-,B3Aj_O Nńmyhag'Qz5\Bo8֤&,[6OVN1uAwl?X:9t#{> `O-zsnu9Af@یLDD^I\ Y=3̪ wr5e1Aw\\/a#1Nf܂{.f5kTہ n s)RGX*ioG YW9l=Eݧ؎02¼[Xǯf'"8vgpEYkҶf$ ʃt@vKI8);7#oh0 GM=QScp2r"g\*l-Lw'TĐmYؤowmE0qV#/)cC\CHmmf-?G'֓L@x)i~L('yXc 9!zo)o K141VXp^"? ˯do(iW!_FF+ Wtts~3 n6n -%/hbDD]J-쇅kiWR^Ҍ&.[r˜&:\/Fّ-p}{LցTDS[;xm ^Ӈnh zABh (CVvrc& n#O}&wXfg]xGNYy*V4p$D|POq)hg2!#b7Ȉ{I_2_b$ڲ3 hHP9X@ۢ a7Co+Q3=bff1%E=D?JܦK[UՔLw&"h +P1Kښuc %mV:@]8'4_@)yo,Slx1t\A% y$Fښ 6|~)mp䓒 Z- SK\}kɦ{{gsIq߼(%z=T|qҳ쉌[.P|?m:HIsh>w7,W ٩e4F"^0!!m-X܍.^y/thJwNvkR>b]6*(XwvOb6x$ sۊg[`!t3lH`1Ѝ@ʗ<"vci ky6m '4mɾ6/1{ڶ*"̊e&B/ eu;D=yQrkƁ=!rѸh ޒf3N@H8DfSQlR"r, yPeC]ڭ\ݔ]4\hh3;M?cIZik8Q̏5.!%)R# 6$M8>)`yn1xuŇ`B|G]Q aCvu(XD原dw"jǡ_h34(LGзb]j_C֩\X#\,I<'zeFppJ"+b;xG& MPՒ~M$:.O_߂h(]Qg`AU076fWQJnYj~|Aiy}n*a2d>R硖|=v)Y\ٽҋY&HWA7 r K7T1Y0yP2 c.;^휏ޗ,Ӕ(&ĕҙ EdgvLxiB9j]APTRO.9)pٴQZ+  =w}c w0gĸ/xbkԛL`W+bU. ksk{B^2is *(Hp#G`k,S]L̘ml,Af"-C|42EbPuBM\ґ}T8q}1Bi"&_PG/-v5+ɚZ6:^e6E϶klt32Q3qS^ 1ZA!k"ژu$Ys}.OaAXD)R $@ۿX1WmPsw㘤Wa Vu Ϊ2Nz5Yɗ{Mp.ɴoѾOXٶ@\/[z_-NhpoIs[LQY"Fӊs[ _CܒHZ2gR af3vDOnEv -iEQr3sZu2A,mr43e#Uz39h}# u2 Lpڄs@`^apl)!I* ?g1HL I{@C5@c%k"{FHQJĦ&. !L{X\a>1eE[z:\kCjT.l6SVI M m05YRqp8p#8ߦs}=q.M6cATa+E*bu2ˋcҁ.>|GdCÑK4:" E1:d:'چ!i>Xp zղv+2lzSMFoɋF@AZ"eذrI$|K4-Ћ%&T ¥U鄑W=$0m~ \m$;)akܠ<\' _9f jŎDQ>9>`5JD# |Q=xb$Aqmf qCG}F&[IcڜCAGNW Io7KP=գn|,v}{?YyjIQ\(2%'Z,,\6:݇xOeۦ!aVYƔ'˗øf!uJzİfBtn2tvx^n#kx.4(1#0&B( bBvFT(]"sDҺA$QNC}g]eCL܏tk>lGŎ} j,7_\|{q4LW_A!IKMIXk@-,u^ diBԊ3h0 #*\o7CL4yT';YhEYvJנ}.H])p#HG#A1PkIG9E9m6oʮy͊\?n8=_O̎7~œ Ju!N!֨ e7Jxʹ9V)eڬVIXMqjAna3,FS-CyQ c*YGR@7LE}wARNHb+mS^q{Ej6{,/ؾbźnxm]ZQn%?f=vtİB*zF4luN''}v4hf9Fۯ:ouFN84Ζ `91TM듼 }qvlTm1Qs֮$Q`6.SfBUꎟenC%6v{Ϫu}[(Dՠo4#5bnO-Z'V[2{Nڟ>Lw6Ը)_|")KSZ.|ɿ-!00TB*n8~[ $;,8 "'kN.Nsyd[b]9Ew0o,i^3 #P&:ˆ7CLcQ. %t٭Km'u"IHztq#|.[n5HûHaABp&>Bei/* BCd|>ӘLg'!A/*{ *7.ܚ6絀 X zatc{*A:ο RlꋫZc3]WQ$f˹#fL 5|Oݹbb6 d߉BjM M1o|+TӞ{M JĂN#xIcy|tz'+[~7;.X"(ASU`% hNLXɨf \*!gM QԀT{:!gKЙ'/osNS e>&7c)]^_!t~thjZnBsT?}K}qgŊSx7׃6( HR0E9:tEGST OE Y>.:T<ĒȧnqF>.M<3t6X#̞U?< cN$vd-j@%(Gw׋B" 7[g{|sM_vF` \7H.-_7J+rwn#<#';WMMAMgc=;ڣ8wUlnFhɥUÉ467~|Zd>\6 N$UGuSg+ރ#*sm+Zk}8ⱽMڕ =KiBF/RM˩ߙ;x>7D=,qt1(ѧݝush}57X LDUv`,x:UJIyf-&J}#NP?wU{ra@ZJ.!gJ184I:Y>tb(` TjuA95zyW> tC W$٘RgblY{-CO뤟UƑ7Nz%:Zަ@߂X2{w l3F7蠋wi!oxt^3kVцK1Jm6F)[ ~OagԼ鶚YVr1} ,'>՟`mBajǁeS!ΫBw+3*$7kd*5^aXs"vBDs,[M󶳘4e~@_B:q}Tp|GhМ$mH7oG꜎(OaGX-=}M^\ +hbu{N垃V1(љqzWB&xrneb4QNU6 {ϻ&BspJj\ 7Š^͚)tzVsC?^ q9cV ɞxQ@rV׌ʴ}x##?9 ǁ@9^hJX9@6$Pf)>]M! iYU 8>M 6?+e?%+`:fKF\_pyK{9/h=iyBT\;6^F`BC"ϒWoOGxj,{CXf8ğVAB2B}[B=˗vDF>\-4ϯ n[|Q.-VM3# O9 g- Ѽm^u_%~ 8eR3;ġ2a_<,ߟȿK/e 3{ỡk3jaJoSJ y4/tHӿK?W ]=7\%ꐬ8>D[}pgCc"_4b+TA662<v]t)ޡP rW<eUX,ߋ.t{8CI,wKyO7h1Kk@oAm%;Cٰ/쎠 )^_!O`]wP(U@ ڳN]%Ãk.A)cٍ,@՜޿V`(bﲎVjTK|41kHFcs?m>ǼNN)r08HPcNWQ(YLG` bqM$AͿ7,@ϩ-~|1dv;ٝp3?'OCQS`Sbq=OPlCF9\nNi5W%Q#Պ +M]<&([g݈LPzZ7ouzxI pOV`ճVb 0i &=d&Ƀ7 G9 =M oګ5dvݒL-c-%S&dk\D\ӆWa|*p-Bíϛ¯K 4T{UM`e.)2n1ydV_n/&7d34|:瑮5͉$Y65⍪ZzĄkXxN쉥IMLTd`"d%s!**_g%.巁1mWP\@ŘRR8!2`٦O/5řV{ Lgl>ka1gbej^ExW|ьqq9aɶdf$ wkzss,>ole2](@n:!BG(JTZӏb3R48dB֛)k2XCqLf}1G0hI MǺl-q#W:i30r')h|\D׭LA8gSA)sےIG9_6B'tz4=,| ~."HY| sH-dH]E"DkJ?|QA0&ýToVpJgVh! X\W{':kC K9;m4aQHWo?ⲯs al:)vUILx74mtVGf1PeIAeW[ g +,KϤ+ JߙV#֗% f?!Ph8<ٴl<-Wlݑ<6ap= daVQ_[l?Amv~KƢXs[e#p a11N]RJTedgzkPwևwmA@㌚iY}/qbkd6ݹOn4,Hs$QDc _g]_hiP_К&%@BehE|`_D)gdoY(Ѣw&{c7#K+ kWAuӐ02g?C !.=yJ[Wb48ߓQHizS,ImϪ\i92x"Jo> Pz Cd, ,f8>õ|1m8)zp5{ :K0Tց=D3%i5c) zKKT'V*y37a&'F&W] #}VK2N] e#B?#2]BEd-ƈyHŷdX:֡}i#a-4w-W'kmY"j8ʭTnLꖉ+%#vnu 'K`1;O2Ϥ.R4 |jГ s<s%x^ՖꑀL 9c^؝ACn>x㬣ӹsub$5l鱤Ojuu S*kfE ^DY`+.26@}n:1Hf2d6ANn7\nc,(ZPaCod Pʯ|9L>U0ٶ"Η]{ǒ Gt?JL^oye^C{}Ae]n.SDGy ȭ1Tk Sta[|,g lɻbb9)H}/",߅O&?O"eR3.KS`{ T ̭17*nl',__W.xMCpCḆEjݳ@;>PWNUL<'&>lƣHOJXY@m'LUdxsdu Ft FQI;OoPSHaB{T0To ˵,]}xd{.f]Ď+Z 3c-DM;TdgF߱a|?yaW?Vz1x_*kEL"^H).jJnLos?L%-rɣ'?jWVI/tߚ؅[ Lc-H+#)#fcljۜ &aR=ԠWwH9u|S҇ڵ$نHzbPLg)޲=?{ok0m9vxqߤ/x>(u$u.Vnnecm82:TY]*mXnۋ ~&*i@AN^8+EM hhтg 1%!VD+u&Sײ%NN2շW͊2B>ʢyҩ<{h"dNJ9}՛ɩmK*[m{ő!Ki80Oxd;;UM/Ck<7&gqz[o220R=hv@|e+&xOkU:_h&[>`N_q׉#UԸ%t o$3y,>\q5 ,U:ڌs_~!u5!KPZW k3G`E ƥ8J@`7 Ԡ1 3@)/@xÀ 2pF6aunClT_4пMlT4o+4n@.0黁iݳ!h|bS瑑 B_z]ES ,ފsTM ėFpu&J`hf+ ٿ0`Tb5CuƌY"Gc؊grMݰ[=]χ'C,Et ~Ъ99/'D6wjB3]fHN\Ú&- ܠm^+%T)hI8?wɩiDEBC*h󸏵𛞢>:%&_Z#TyL@!U錷 @Mޠe҄)°&٘ysS(NоQ_>&NVd04󔇺*"-OPbsM!ȰDޮ<=7P!w{m&G^.u͙j, nQ]1&g mpn_1h%jK_Zv+ (E5+ŔlyKʐgܮZ%v9afoΜ+h7|gnrH4:vX)5s͗O$5UJZ]Pmws->()8 fV\Xls'%8z-<2ѧMԖ⫿nlbE:1~qR\lii-.{tƳMk[TA.+цzI5ޞ-_=Hq/ @ =zkf0XuLT"AەXO| fg"O^U?\jvȖ׹ I8)[%=]tǎ)H})I$㬸'?b'XE M'+9LauGX~4lMK;YZGjpѹ2f8Pl7/ufK `]̬vU#OZY=tIV'HK.hfzk.k=D ɼǖln |n +D՚:&]㕰dCg h13vZ{+ٷB@D6.NSPunCQHb58L5DT.YjNK,N$C!,i}c ,)PyC)^+Qm ۜ{eQm#$?9wTo7duT=e meBiLvm9Ni+ڱW |X]>`Oj0Z& /?L>;i3[lまYjVE~_DSj_ϗ~I!m~ψ)Zqxf $RK2M9Hmus`QSw,ɲ<4Lxd,/GfYI17C)a &lk /ފpLB֎?) j73poCɻ) ag䘾m.UYܮ]U~#sSF~t22ET!(F wTZ -,T w~vKtvJ=9S2u;y=lWy*L}CO)Ӛ" h6k@p@!+_?ih+3J$$9aLJ:zt0=7?UlMmP(J9"uT'Cj PLG:aBD} *5 :t.m3vَ]*Em FP]%|):?ħiC Ow-!#f5CYk3Ջ`yOv>WBQ*{|RC Z'I隥+ك6b2i+}*? hF^FCRcݒd3ܬu\77qP%ːņaK8ғXm m ~ Z_5vl\ 65B`xb3{u3 E_Hr/nRjнG! žLCQi3 @rXQ_`F7Rzҋ `:ō,'{b3GUa "Pk:zv%v(*X"iXK%C;lƷ(:܂,qӈGWk0;WsžOC*dzڔ!֔рg);ʼ6Ϛw=ci 4#"9+41P",o^ɱ.w:HlQIdGn<[7ͪkyܒ0?<Y&5[.ẹ*~]C~p&Nrs5eo{mN\<ll⼣w?rwSdm!! K;Y,B<e okK3;_+ioχ1OrTWuLÍ9a@X%H31+V @PDW;wP0&53%Ot-275EL4C~;s.,5b7@f  $Y)k֚RpGji|Z(n}Ă.Tb|Qzeo(G|fs6=S布XJG08%:iwL:čR]}~AiH^SG>UT;^GQ #kq!!b'‘hB3䃏ui%[2Q=waab?7M^ W,Bsxi}+ 7#ȑK">MIRY#tu&'fXAۓj-L+{b+;:9:~֕6G袺v~ӼTB/;ɮVIքycto#n _!LED%UC0MO/00٫VǸar.{co W3(8&]ثstq,܈c5 }g(`|bLHq;ĊY Dn(|œgF!ـz뮁ΩX K;mD?-Wc4ղ@%`D6݌ߣDKvFv^6v&xS]/-#l#N\WN *@Yg|Hȴ eO%,… ^>K81?pN-Wò {le#2Vk (1gxj {s (\C1aem~=җ;>}DO"2T[JO ޑ " >y .=h0ҹ*"5؀Ar_ḀD=eϪ-NADe;q4~!6QcyfeO{;OMw-=r؋+J嵄KE3}R0Р9K6k[y7E2NQN/iy7tًa<).^3X2zX0iΥhukWlNb~*LpRImGs- |ۘ>@jtf]&TۥNЊ-#u`s i(6zBhT B؁ P^YY|һNa*DlY)N9kX74!f V@`8$#"ťGFիv괜jcJ(b㠾)#b+;B-]ϖDƏ#L.zk߮RCR_Yȝ޵*4ǿ钛VXoz=gZZn$#B'ǀ۲\/'ff?7#̣BNB5PB"zM C\ ?yw Lilͧ[CLȮד7=~X$G|fw씏\Y3cV GPA'R= =1}DL8x?b2^$G (ZҤrH*mہ#)4F,+_*VD?ANCuVBES$ n$XAԫ;1J@ia΂|:b_R'V 1*s9[ʥ eZ([vr7?LTF׶v!7Ԍc^432Ȝu?5yD -f`ҤrT?Y1\n^QFXg )pՄER Bο( "8CGӚ:픑4-Zrs9xG |E?LsB3,HH.aп>roXl>b΢nڤ~8X尲+tM%|MPĆ< {e&˚Q(P8O+G(+IγlKwKy ".|. &_zj2дuЬ; fw1 ʢnY7ĂI;ӿ#ԇq>Rjh<-&VQ£$.vc=|X4t>iG܇ ߪ֘b2O5>>ZNE圷bMl<n7Q41ֶ3*'͇u-l_Q|d[!W}7vZ6|$$djQSVj8Kx O2U,|Uҍ f%0Cn 89^.eߦeU m<_ t-s5{XXlہoSMY)y%?edVwJf4)fo̙qWaB}BўcHND PI3Vi?>U6%'7îf}#|&4Lb Jhxԡ]3c>a٣C X'!wE"żonctOK,K>lc]?X+)L Q0P\"!Le+ɑ{ [uEqTk1ѱ?e?އ~^s!Fk N8&~V9n7P:|t;Q 44=aOnCޖe?ۏ1;2 oMf3ceqEf ABFi!Y꣐\XlѨ]~H|]x [۴6c ӝc[Oba1\=MH: ׃XxnQsE^&3*4+Տ-w&XsA~%)U(#,LG2@%o[3v AFnWV*AgXώ&9]ޢȈ'CQ5xhdz80t )f8>x+k|jrh"4bA H/l5nSX'] |캪N!Yl7**(hŅC`cm5$ڒ/X,@pk19iy~L$qP˟3~B}UtAQzCh>sq8Dq 8m.iҖ3.^y <$>]DI +*La-՗wXiȆ;{գ_txrϹ+YΈ/1svYv Rߩ(OAg$nTOj5̦wi^,A.5 G;KN?/D#_[y2B sϭ"6NWPm|J^ΒR$gS+4=2 [)Iv /*nEB&L$v5Z&>^Svu1-4&3NֹUcE@W/<.zdQi2\12mϒt 5eթU,(ՆzofYևI#iDImoSVӒj@MSdbbV} fPIs\'/>V0|q`(j»F'DW6`13-#MBȅ9jv_}W ^Oֈ?hnu+֡】βrRUKvT~.b~g_鱪;6ȍ^ pwstf76ukd ]6lTM +R5ϛSo @D_j{լMgz2.u#}WNXVM8=D#Kq}sjk_(S'\yGߴ 9y $ȗ, cO w8ኔܜLŔBBݯ:3[՚ƙ6]_;압b p- ^'V _bHӁ|A]J<`S.xG VRs8ygpV.Ơ_C< 'b}Y]endstream endobj 28 0 obj<>endobj 29 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 556 556 556 556 280 556 333 737 370 556 584 584 737 333 606 584 351 351 333 611 556 278 333 351 365 556 869 869 869 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 584 611 611 611 611 611 556 611 556]endobj 30 0 obj<>stream xw4]6GQ]F/!`h5%D]D QD[{{{gks/jhsI[- p {hwOLL29 ɚ#!@:He<P[$HWK F# @a6J!m! k$PPI]Ī R s \ l k8@p 70 A<,!NW.Nuq~A]@6sbBAPn ℀#LtD@ `V Yp"m͑Ws@7n [:B`H U4\@H`, +'07  ؘ# ..@ Uv~zNNކ/(`͍ b\-eruAJ0>tl0`~ 0UH䯐jp`p΃pXX)0e_EzYz_\?a`p-'(2G =A JlA<08`rrEzAܫqq2&`p4_2k\-v Y}@5 x%&1w.;RjiK&1  @`9uw4GZ P;:cFF(7D˵'w;o i?pW@^ A5 P"@ _1T#~ ;!W 8B ȿÄgkk* ߠή_i \/_w k-w , :!aƵ WY@.w-0Z ~ Z'\iF' U5wf~~H4ZnPs51DZ+G V"XӈHu+Q>t \p ϣDsK{}) @ߕ?ܯ~`9B j^2s` p1p|1D>Y^ 0/@ꏂd 0rE5h\ ^*0/h? zY+ `K @SY`{`󯢾q`:6V^`0Wt@;&64]7?j @V+`>U5Z}u,|J8\|fkDO4 1J㮤O5 >AaPӕY;S5VFaq jSB^ Ɓȿ48- J~2g!>[ݯRC+(]5?;*X\ w3O^ +_ %pr#}+8+\?ֿ<6+kN+z8.0Aс];1thB@}n`*zѕrupAmQE"JkDN"+U*y-0?_;,]mpׇRb3a¹CyDjd$i)Sgp|:`Z%@̤G93btVLlQ^rp̘E-2O[Ks=ۡNpTuoِC 7"|9<},L >T [?l=E“-FntA`ۇ'#˔O #$4[(Fa$˱n}8+xɕLrYi ~Fߓ"ASPSB!O߰S=sK\NM+3Ւq6ӯC`hdmDd*C.r"3%TpT'eA\1:R{TK~VF!# jUho?JJW?>}}*z@4K)v:,~͊ +b!ew F}ِ%NEbG@W]R52͑.xvx2^lf Xำom> y6'1߃$f.RnqYy\4GߔAĪ-yX0ZZ?irRNs e9 :nl~qc3bs^md(=@pCiꡀʅO,JݤA~3iYbL8~gCX*pѨQa8tʽmm\A$-Z,*fոQEn[{%XfЂon K;ʁV̳<*8M1.ub/ 0O|^˧pyW&XQ֔%3$~fؚ\-}pk,O[ˍ`1-<:RϪ*RXapL UQ Jחiռ J_Oң6F9c0zC~鎜EˆCR8fcq.QZF|zo,j{{.TYoQh}]{&&mK 2oM(||Zo:LZm\A=6/,@u#ޘ?wg,@~C8HxmUi|xP6#:yz<\޶ pLð!,+tw.bGN bAIP4 |irJtn {35VQ._"n&/5b[JV-u&5h 0"Syؘt="h#ȥΦ7pm@Yv{:GLprJ1\:t`fOP 70GuxB 'o6FNH)ʹ1}Ls_\#f0}=be*hkg~]_~ԙ~D\5w|‘AbN|#62ES~uN3+DYnS],,Qg?~axצ{*62}Cl.чc? c.ubi uޣz3PYݍ%l˥em 7D;o)9~ޞqsMO):z@1:ٴUF.S=jCY2QX/tJQi"MR1.jRդ_:5Tmt d>ݣ۩DB1vdX~g WxOD͸(^&1&;O1h{ZpM:ۆLW ^FH݄!]~]6ЌשZxo+]}6.BOnMIBzO|XOMr"[{Zk|icGkҝɉ{/@ Ui ͚;ѕHOaTÖ?Q7ك빤(٤ {dkIOub']vjifoⲎ!VY.7QCW1G4<`;bFnD"SIQ{SyaRJ_3F?mzmeĘ'HleN2EnsQӝE,E#YS1j(g٧M?erdDxxBmmtB~ ^qr1$A|BY#1%vBu;a߽ϥ6ֺHaTp3A)Z}4Ru4r`ltf1Eak<^~5hQB^Xrmjmp)N5XyGAJQ5vipTz/~t{o%bՎLme_S(bم߱xoA1$+9n۽Bö^[J7#)89ܳ=y-2BIBGԫ]& Kޛ{~v_h䋃 : w^eyxM1is6^ k!ik|AlQ|DmxOg+޲P\zLr4|D'Ė@CAm7]TSYѐ$]P>VbaweRF8Vܢ+KIȌ֙KeIcyumS_i݌%:c?]AbW{X/ΘF £n »'虺UhBR`y|ɐ /Ʒz5DŽj'ϰۼֽ]x{*=*Ƕ´ZP=%<LwNLVF{ȵ }Qs M9t~T`ٰbd;P _G.tL^bnbϲdQyV ߃Zn8Sq( &ILt}.?E ~?7^n=Mhg قwѠ7O;d k-#QKK:δ00QիP)|[|cqzz=ڴv1Xő͐Uh\6LrcDkg}{ol) É'đcWT:Q/SN|"9?y_B-UewHuYy'1w_vBB#.FΗ^'ZDq3t,]XU>yCP*4:ˢnq˵}Z 0B=pqVhxA1dѴ>F͓|kyG YÍ`̳ŕxYAێj?ֵ=Hl6:lI4볺|G#f įhs kϯY[Q>H*˱G^4ym=^iy=-jV\T})ز `X۹lDe-dGY0QQQp]RL$t9g'ݓ,GڌI8ߏK-7seTMze@i^-6h#qSV2^G1~Jjz BM(, +\N°I1lM~ scѻ1ɜ4?|Ydז0n:0)7yM,ضfCm CDɣ?LIOߘL:EPKizela}/]ɦ.IHAb?fJ ~`kJ5&2Ĭ Q1-shMh:Vv=4|XSm+}M?σqÍfwN6h* sE_l &15֬2|_hZA ,>yN8>?+C=BGyYչf GJBUdO"Y\nm(z4f绞i}!b(fɑHZ zTQ;ۉe˃*6;xcTzt_rmGzĖSp.!,o(&;./.zLla>\ˤs#V/m9()cD+}BfM]^{>k 0cF^}Cg5q6s,Zۉ鋜@hd4+ŧ1瘋<Ӛ^x9BZ**-HCAC|)ĝ}yR-687Dc>?(%mq_>Վ)~ Y9Fe$m]-.tC<i>6.h6P~,"f񥝏] A3#V(YP)~׌,F8&F2STx0&q GR3|hVݯf>i+ =/E%vu|5U^~$R=j"BT-jUxKHǏPܗfFfiL0Xz.qXj[e8 SO;|ٖ~lon @u)*l-9e=[E$KѤU "cE13c( `aJ)JBn.Bk4/q3t]9+8~{w4Fm:M%GK;tp|^`ɰ+F2ih|ԚY֊LȍWO6Cx}e ܙ 8adg[ʰ=vԱYe' `޶_f-/)&&w0e2VvP_ U7u#Z|A:||v߲x0WSy]RCr;c!4)4iR![dIxQo0HdyU6-ޮF.oLkVĄ*h]1ޢ] wcsbI5I,'7٦?GfE>\[úoJu_kT2ɷLHkM6K DE6px%YPPjbSyz QbnB[IFOs(ǝ|(Zf"}TLB1΅*Ot΀"Jq^co鹊נ70>zƎyGv3H땚'dqo>čN 3$yOm8S'0#K ҌgqD W$` \s[G8m0ӢjÉwV_gkNi&Z'm (M]b,}4vv6dMmG"V-}Gge>k@Ra᩵j_y`]S4]Ym߫sQ>ʔIӫbڲJ9PAK4c HibZb%(VJ3[|BL5}ˮHXh__}3mWh"-,4P۾x&.Q8@pFkۢ!sb=U2OGZC#zL=6|,ogV{0kmGGz5B0Ji<7|7fG+(=z>1av:QHC7*rX+;"D6HC𐓊8!$  WC(c6NOWhXu"P؅8>$-/yz?Vʠs'IVX{1)~OTʕ9yt# sڲK?ښl&.`4mO0+"Lu_7UmleR&f v^|&e5Eix@&u% UDW0d0gB|4&si|rV;y=pb)a|/_}E8FGgynx+G(f[фxK6{\aU Tm'Нd 7+[.x$g&頯`Dmgę|װ 3rxjٹp pWs 4NO\ v!97) V+ڡ{R0wkoo+-׻w<2rlU5{EnC5e)ҪP6? #gλqdcd2xIS 5>d0=pZ_wڅ&5DYLfF$kr\ U4WlJΩ[Mc%9_} 4 Rl;,zq*9r(Ӯ[ _HғA4F|׮c(vGo4޷Ч޻ܾdܮfmz!lg*1BSI,ٜ&akvڇZaw//OM-6oKeہYG%J`A~8ӗonyb0ˮvn1GyWvz"jCU9KtYs"s,h*%m+&Uo6Y[:\,o Zoa>-y@7P HA.'[%فLc۴n;|ͬwl;UMV>=M{$b&t]G1`&xv*\l"[wǃ=nG0E*壬k$_lpVɻzw^{r'g8sO˪ j+ <=HVz!`Zoq[AY?6@d4>خ6_]$Z?nMWi#z$ZfC_A34|Edi Kx%F,PWf|a i^8gMVۧ1Gc/3;o_*iFpw YP[^?!Wy5Qj͍Ozoݭkr-=%Y~ +m;h֖3v~ʯ QoeCD\%ޞCxխ\B# .W&bJŃHU$I(⌢ ߝjB HSLML}ov͔xD7: 8zbNb, `0׆ǯaPF?+iuw::S } 9RDvw+x.~;\g<cᬬ'Z"MҦuL49QC6璩Gur1нR!\p(>w r |u}/= }pq~Aʷ: W71Ӑ;wٸ gNo4nO~4Ki̺z\ըXUuyma(-0O7yKExG!cmx֚LED[_u EKHSO':Ձ_*k}撝d`SZzݓ Eq[65W%|A+.;Cuw0Rݺ,<`Wkp)J$y_>RT@=bUѢi)E1\|" >S=9swe1˓:!u LXt$Lo-;^̾T<I |*G)*^Ӎ|X5$jv{|>1exVSNjʈ\EoQ%-l 3 l"͂.51IAsT4_,G/h3! VI2 L#t3yO;}. 7Cd$_g\_d) QW˓nwǣ?Ӽ^Vy-]O> Vӷ&ydꓙ uO- ;ޞ$~޵[}CP4:T᱇Sֳ/.C/Nkĥ1G0>RN}{k l>' Yq |a..}ilއ%_X7L eC՞c5͔.`(, gҗE]y7nz̥ bU2Y&L/XFf>Cz;Eòw9,0m'M20e U2JV-|cij02^zɍT34nJ FCI(Oh(~% t1Ýo։XhL+Gu-V?U}|Ι '[r6jKRSP|ICgS_1-HDn&VD(V;iB}bT{wt2_̠n &47EީNϾ+bf[Sc":xج|[$l-'4zZ[m y.⅄o{e[y*Sj槮IC_*6;uo9>|QKozPx;us!i(o:ueL.VKx*|ڦ%d-W'6.ôQf:r hd#Zu:h?6*>Y9^-6:_6{MM=+ - Lێ&aЧy0+6mJ`oxla^81N:6__K \?yZq=,A]'n㦌\쮸<8Nd.^,S6w&i¶SM2= m` Ӆ٩46DĄ$ӄgu_:($)X[…ua~>xҘP,|tT؄Ri(aޮli<̍qu5Ӳ|Ϝ;Ga!C15`rT.7kJ_хƄxU`XOj']zRvSpPrYpGϑn3jZB2_Ǟӹ3L-Q%Ƃ@\[{#{P$<nM"!݉X4iECU ~? W:17yYKcQqO̚!Dr/Oh[NLnVIooJٸx2;D9uvB+Ġ@ hrťK XVPNvF>85,˻QRжG7 sa1qHf~YͲ߇($Fe6IGTf8eBtQ =B)s'NUgʋ=?f{^TpaXVƖ}{]1?C/_-rӎ*OԬ&09oZqyZmrCTJ N'iʼƣbk %U&V o?7A= -ßΠΜcg.֌ fiat %ay|WgMa0WT:?feM-_eƄ:zTe ֈ;< D"I$()љҿN1TV)Bog2GߞH ^ ȡxc_fKg _se#{bK7I7uBk*;1cO`죲Tzc8 IG F3A#ŹM%UƢfw6_Z,-r3ɩXl3#G_5Q1Ln´zbIйtj.H a"vG8mB,-4MD;sOrZ|/g; {p7oJs>diSM6`y0}kӻ8º3,/b.աb,DG,۬OٸqzΧ;7gp_VBKw=ޮ @W:xjGJyj+ӹDdBEFZ)5eBIe}A,ς%MK3 ,s~$ߛs;a>67' ~;.%ȟ71Lx-?\/6q?.߄`h~N߶Qf "w,iu-.I*iFD.# h5hX@Hz!O "~;7ȶby+WI>2C$t}e<1] cz7qzZZ? _)8 G=$iRâЗrmUf"aMaRºW&o0US-=!9T2~ӥ B,4l׍3WbR\ۆ?NqĨ߲  e!S>mVyG/1iv мK[Ѱ} cKIƢ ϫJL/ƈg9sר_*>PJvpNjrQ̮()[(*x MZ촘i2h< FǾ%ѯtf{?n{X\F9c'lߧ=΂wfmV%guMAwꭁEnWފ.Ydm%Hel<3O aV; E8E.8Rщ 3̮h>Kص*zSTXޥqJ("-bbib a`ְ {)٨s\u][Kܪ;엢AΌ-)&޲sT3/fb` )tkc`@ Nsb " $ OT5 ( h3~[K~e--Y[-~;[κihT᜹cmRj| :gg%^O"7N>'IS gR[s3mCtt[K]m}z ~#c1?'4fm|?HӪEe& l:bY/2+J#XC*z#sVM E"<~e—?t,1g+e57Egh"׿_a ~`晇C(3}FfI9sC\f5?boW֨Ub$!k=TFsrY8)U€y8ִxdΏst3j IS ΞiX;_(~`'lcMѮ.*g$&Q8]{4\>Cd`WOnG쪀aXmǫȰriڲvYGIvqpjtЖw+52#o|H3-Y,qMXuc5nhYmmԣ"wDZ0Z(RWbLE#f]ṳtxT3;L(8"''bJ#\rk3S>Vlúrݜ>n*F.,weaLvjY )~u0yz##(Bq|, aK Ld`Tۼ|xMq]FJz#ʈڔԁ{Hic\PHz&U`8[J-r^ǴX=b粸K}#xzt$8%jfžupKpCbhAⲨۮ0K)1oۏ1di7$?+޿ N\~v+ȯDR~}AbFBꙟB E||m[1)&GSQKgϥ}ʷB{.i  mGj+(rYL/mm873 83OL-r;2<.fhJ+T-\G6IC$g; {Svi݇}8.}&~ZD-(3|7[ؘ(Iyy3C#g<_k%Ƨ(Xu^ZH́/!-!F|t\Kg߯yv^2ځУ75"tձ2+ 5o *.IHҊM,Jj#3g'̾Uڬp~Bv!K7j1qg7>E= ?C. ˶m۶m۶m۶vٶm6WUpOI:dQZA ?Z'Mmʌ[#6NF cX栔+".ufR͊}q>i_z,aICM~QpP\CY8ʲdL LDPS Ftn2F@k#iƟ^-h@_?MMT^_v2 yk(mBYeJb6b$f7TcQꞱl0f c! J}YB&ں0s+%CܽbհBی3fDl u E"vuǒdwmzޡ')YPyd7y<6IbrLkF BM4E+a)5WgGO7¿2k'ݴ.iSQ*X7 ր4Tø?mCtBz}4-Ff?O-'Tݏ&r]{k ysZD J5<0d{sCKd1BIx%?YȨ -V&X[z{ܯ6"@r7%9`՟$5="hq9mNft`0B^-w׬1 芍#%Dq1=RN&yk@:71\E^g66Sh D~`D_)V5[(S8ǣisf$'Zԍ;hv&qfZL' :M3D)%·7&$vpͺ/7]1nLܻ2B vyC ͉m&Νm] 失 sAy*bĸr>].P }xU{1ȟRTXgazUYO #ʾ+M@e8!IOa=pg:9[zO=[U%K9x~]6^ԏqH^]&s10Z##ʬ"Dg΄F,]`P'N.4|Cs6kͺ#j-k}M;/j@S_:j/.~D,47s#g١Lbe}6$rGR%Hy]lvM]:q#m fû W.cRk ۃ"cN;cp7y{}G,&:Ɉ¸g|ݪ {`~&:/P1BEWRZJIt^Cƅ Lsa<i'ʣ:Zm],ͧFJ"Y*Xc΂v~Qf9η,P *Xªz;EV8.𥖟]*Is3p cF_ԛGϥVI.: ZPCIC_ Z?ؖQr $탞r譡sfJ}h]*gnD Z"NrGw\J~`@PkfCpD&+RW1?NyyO_W Z4XN7!j#RR7&Zpʸ}̔^jpęLF(*Ծ/UMO,^@esChuG(Yl 2)YsBŭDHJQZf1lO}y1* ;?lh昕ݮ"#UM>+@=<ۖdh%:ն˃Κ腗A EU#-cwkz ko{ͱf()FpDt_$k]E9:<mjQaד)4v3c|U ڽ^LZU_n[_=ΆJ:Z7칚>1L2}Qq.Oոs' 3ɭc!fQW-vB3f ?d:YFnagzkר*xd9aDB{t{J4z 2& { YSZ4psN$>o_]I/{6xm\78Wi3l9HH6 y>d?F!+7˹=u&T!ǰbƩ2@\a A L*H[2\uE5+:rqƠXy 2r+3ۮ"ܙ 3­_*QeߌUk10V-]}:XX+k{}vvMMnuM!ɚyUW3$[ǚx,A8h<[-ERɮ!·kF5@y_`v<+ਗj!ұ8T q|RμipߚxY׏S]B_2ЃA&?kۥ8 ;@JȺ%_.5^.vʰ fR3^@īZ;:~Q5Vw\^UV.F%.܇@3j;X Ʌ0uSrL)2G#XU=QUT.DԷ7,`r`h19ms*h\u"C#j۱hsZƐ9=<6 _gM|bcQ Sihf/8njm"e\M.vAsnMjv_-h) $m,\^q`<4d>>COLC+{pY# R9 RcGG藝"b 3A/pGE yQ%/ F5_"P/tW " , j;$%QQ0l*N lκ{Ij]Tu3@,wkH b82t$~eKV.ZBqY@)Ge~Ep8C###mQ {Bw~B&y^nowч]sy"n_Ubn&q ?(jƪol>QYr.C/U4\}k ŔvE0 d(pQZO{9w.IiwQ>2'Obf|_O>t ȗ1@}Ta7+,6L6Vs{R$XYONWJAὬ0F4t4?0gZsm\'v .[V1~M prXDn)]DV}MI - MyO@~O3~ :dPףnGL_^.+ U*9֨,_SF"G"ѩȸpC7:XqTDjK"%^X8:xSka5fĈO?_ ViA=hL:(q V,ο0:]\ N7~ dQ,qOcΕ޳hhs\ы6{MvyA%`f>h1k 'YgAρʀY79Sk `8I Bp @Tv'1Aѣ{ I,a)M퀓ݑƑꁷfAUe+lڄ!;ƨl}7rƼ)`\ܖ0)/SdӠx׶:v~״-g{1mP0+8Ouٴl '(< ZUrRT]ht}VaGq<@ H'3X]U D]cuw\j~HEh$ PQpZ4gq?5{ހVJi{:{pYAi%Ú)))Ce(Ml %`>CEf(}˗utmg_DQmmkkSKÕ"i KZ-?)U5 :16 |p)챻vN9:®v?Tj:jO_NÖʟMrwADDQ^!*Nb{U0q>'_-^]4ZҊ0s(҃޸lKXKe?# wD\D.4%HP@a-eWFv|'5:JWeׯxd͇q~ea~K9{xGp#>^Ɔ0V|̄ W U⺘ƨ6/Ӫq9)|9YGt+v(Zh!`:+DYƿc0M a0Frv:n:97wE1^||%,C6_)v/O^i MFА:pW DW}ޭ;#fy:s+m_* ڝ޺ 02O!r!r|1sJXi2R)wI'SlyfyowLCb1tW q#K8r T6=Ie 2Q%3yF[gjܭED [ޯ: vtmd#_H,{dfrer sG5dD`Sdp zgld  F M5j&jyZUd4ݻ`cK̸(8?,VFU ;0s-V l)8:$;e 8~A}DNᨮ&+?+.f>[`BGU5KX|c4“e:z9i=U(+ֻJ*ˉr`nWaϯ{Z!~1:Yv-8'6[% qXv})X_lH%YE".aSTHTZn{< ?aq ?)bQ]*lߕg/X~m!`=}bkuE^J2AIpe=Pѿb^F T 6hLU[2q7 @PJյC{yt&AOMfOMZ10LA6g/FB;yx#wYܘޝ1Onwz\g60KJZ`u>*]ӷ>! `S=Wџ?EwgEYXJq9h2!3sXBO#-=p@NMt.@KK4 Ӥ^GM~9jE"?Bs$0#A1_Ox8nqWb_J#Ž{o'4'YpdY f-hmiW4E+noJ8v Н!^8Oê4t z/Ar6ȨWбt)+4nd\r!^,Dnak𒽜f@1}]=amجPÖ7J8މp'QX =̺eys`c(8@p,L\zЊODCcr(lvѵɼm+5SU5iCCgڧz-ϕ(&'BR@(s&PNR`߄STW!lz7=MOAg~%5<k)?3v4wӇoe߃\sAl[)bA酄ǓܠTiG~&+N:mUz"rԄe=H{5Xm3%uȐnlkxo=^cJW\E6cJHc2+'y=Nyr]\9RZ, ccwpA㮌 d CM7N2ဲIbATAo0YJ=%p2ή\P /n)ysOjhn{#!W5iږ2"?Fc!$Ŭ=v8: ޡ P< Vbwbm(H {i[%'xtī&"VzChAS{(=*+8eIl Gk#%k~@M"xsP.5w #7l(ruiI#R|.p# :9>ZrݝN~N5 3jq6A`CoQ[1_Eռ1{ ^-K;dXa H^A6Eԛ8llH6Pg4uЇr@yf.kϋ 36"B6fKC4WߩK&Jg#>t=ffF*L h߈vDCϖu:yWc%vLsL9B}ࡠ9;٭sP|K@75*@(cReN a(?^ g@SN![G1I*GpR/D4CyZ=p7 ܎B.eR*8[e;6g \bUİAf~@7$EH| rؤLL!Qc>mq>x,^rkZ < =xX+I9P"pMEԳaqc蔂ɣ&SL# ڻ@MF\{)Y\ϊbujx{x#Sّ;5tʞYeM#9EI9CU*xH;A(/l %~OKsfcz Fʾgc٥dgɊ"u#LBq blnj{&/ % Imxax5TӴ4,OwchsԂ Nڐ5NEIύ)2/_{i4b(6 ,1D(ר!p+0}й~wzD=bLOXO'7JN|CV"9(/K~$SP  OOWN"KSf<jfy*)dϒ>Otf[><yhVX)9 J` cy!`Yc C0DŽEKv`~ƣ>WΙ/\y(gg5mL/ Srm3S39\ApǨγbmOxn0k<:߲d`j=o,vfĕhpt|1܅>8\Ëtmi͈!~ʜWm:qӛHg0rA+HCO{sTj U7lZ^Wnr=af\V1*@v50۹[uL3> d>mC$Hg,WAtzk.<](nqDOb}au):zCRu}ү"-Fdmʔw̹Cl'f4Gu[weH&oEP17?3iobMGvk.90_!6XQےR_hd/n,x\O0g,y!3S5XvSL8劖(Ql]c"ɍ9ѽ +v.KL)Ya'9퍼/]q=dd e5/On+ uW:6i {V:]U Ը(5FAdk8zU;LwH^pʳ@|tT?t'bk=I3@ٍZA|mMw)s B<^9)a}>pon9(@)uv5WeWhQDrpwO2Ʉ$vGĽ-)SwW[Fa]$CtT>;Gq-,P>:U"e=*7ðJ'}7r7{O NTg]_(uEu\tPLX#ѓc[g'#&l{Wb?+`AoI:Z١-]5jÈ?O$"|% gh]'׵S6'L덢4nYu5T%>t)Zet2Km}GZvTh0މebbg⊮`@IVpߌV077U+UWDp{ D2N`ì Sõ F1U9755+o=kGl+Q&&~N)٬t0lWVFvJ&)y&1Ox;`b&;7gtg#0Iq}a|>4uڝdiUr\hj%ޚ2cزOgx^~ }|B55sH^ wwABQS8=!m*" /I%cQYԩHNRNz9n)9Js>it!w>\XQalcK>\OxVٓń߁ ,m2fʭtmqQo!*IdRʧ=tg0akwa=PF (r <R[PLnc 3'!\}>{;!CO"`1h9>:2U[|exжo֐g Ge_1J =$7&.u;4Bxߞvw,;W${Iq "ހUG;h9 -,#vY}~@ڄt]s~  $:tc&8V_;"Qg8Ͷll$ "^'%F|Kwiqi $XQBUmf:kQe; +D6Rݏq*u]yd " Z'Yτq(rЈ$DOj{횿 /os( F'!x7]/84UՒAFRl]V;{=V¯&%{m29`rYFg Z30` =}Em!,2 p4 `Z|T)T%.큔M Y`C6#tL^VXEOiq^a;*y r%$H$&l-eBJk;>8>K;Vf2\[K߼5<`4P<Ũ£LZ _3WBz%bvȒܯ11H5<&I2ڣë?5Y!AK^ťdKׯ4*i_71 C$-ep^L/*'Wֈt1 ;*On- E?))/ qM%u`gp %/lWiXt a>U;N Bwuq5TޝA⻯.FL%D8Ja(@#rzZ~K̠ny%QE >EY+8ÓG &n`qT`N]a6k7YO}{S-A6/^JF¤{x`OIoҙg+]M j`R~$,R=iLb={zi0Vzev/рG|・~;[ *[Rkx}pi5Hecw|X{e("1NIYDfFpHxJ+)N̨/1J@ZJE0T5Z {l!$\N0"zz {͒DŽvLCs(K`PVjCwyNfvsh7#=,1t b;μ_n[{fj SX6˔UB$znqO\ZPtz8`u2)yWk!g6:J3s>ϞF}I2ys[#\+ctV錗0 Jօ ze'ʸ^ȟlƱ{~(s*JQ/*oqz[C L9S'S ϕNl?Nt@YAB'P`8` 6ӑ|L ˘dު3Kr(Ô5 0~[<e0vvL̦d$.{lu 6WI<=Kmca_2`ymg[aoaendstream endobj 31 0 obj<>endobj 32 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 713 500 549 833 778 439 333 333 500 549 250 549 250 278 500 500 500 500 500 500 500 500 500 500 278 278 549 549 549 444 549 722 667 722 612 611 763 603 722 333 631 722 686 889 722 722 768 741 556 592 611 690 439 768 645 795 611 333 863 333 658 500 500 631 549 549 494 439 521 411 603 329 603 549 549 576 521 549 549 521 549 603 439 576 713 686 493 686 494 480 200 480 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 762 620 247 549 167 713 500 753 753 753 753 1042 987 603 987 603 400 549 411 549 549 713 494 460 549 549 549 549 1000 603 1000 658 823 686 795 987 768 768 823 768 768 713 713 713 713 713 713 713 768 713 790 790 890 823 549 250 713 603 603 1042 987 603 987 603 494 329 790 790 786 713 384 384 384 384 384 384 494 494 494 494 600 329 274 686 686 686 384 384 384 384 384 384 494 494 494 600]endobj 33 0 obj<>endobj 34 0 obj<>endobj 35 0 obj<>endobj 36 0 obj<>endobj 37 0 obj<>endobj 38 0 obj<>endobj 39 0 obj<>endobj 40 0 obj<>endobj 41 0 obj<>endobj 42 0 obj<>endobj 43 0 obj<>stream xetUYe{]I!B}g  W"↻kyuU\+ ḇKzf>io4E (07+07M(0KhTh\h9q-4ɛlqiƎ13e_鑲k.}~hO},@CՇbRĤJH;X2ON<1533)8Rxn[Kn/]lewヤbފ +V.8V'n9YLݎ]皾,nWrBۡm/tDōӕ7V:Vq uw.6ܫhWauۃkoW/>_jt. "!%!,C榱 ctJS8Kns+Ktq~FdF-׋C[n&/#Ns_q|cb6Ѥ+wly\RʢV>d Afw4y4=u܄p4fxy4j)}nʌnMu@C VҘ/s 4|dLIg:Ď>p:Oה);*d:#Ѱb8 ܴZHx&uRF-']VVK0+\SWpSB1Kܔo-_?䦸`MI4-N+C&I[6Ҍ6$ JĢoJSϓӡJoqdDN1ySdbNnvQC|+~坾a-Ho+珟n츣M'QJs;)6bj" Ctҫ?HbS7[nr|'7Ed5On#?>0e1[V~wL[i+ 2?k;e岊#FE^Msv$M uR?+|.Y5/OE4E_Ѥ\. B AUк+ lRD:{AOήt{I=(LSto;{10I*'6XTKIC uvZ֡lvK=nJ3nv`KCaAn!lea7u#;iKt "7ʹ $p[qk<jEGÔoM}& s.MZ1()zJ$ލ.XŤ&.EPorz+]Yx4T c5ۉwڨ:B|+EHrW)CId$(2d Xdg)ȂlmxwWb“ K,02M?ӪN>vR+R |PPҸN914.$>&1y9zyFl4ӨTSUzAz6k'lch{q[I4𻑼|5oET}?1ߞ|07)ҟch%>ƊTU+p 2Nu㚢"(f GvceƉn8w7%n[nNI&)Tpq.E~:߈MEnv7nxY)24zIZ4DXfI֎pKQ6N5^KD{&m7|„@ J_nvjdw&Y\BR.~ɯN0HE;N! + Ѣ]4]g#O2ي{ʼn[XDZFc_}24pJ9j`SSb',-:2zڟ|g]~O7Y]z>#dn!K[$VXH@Mə%TyT 1tۘ4նUxW=a P-R=-9QcA I9 \FjN2C>27Ɵ2r#y9nJ|OnsLba :)W7kO3U R|+4M70~I\El:2NW2hv*yMu(3L;dí8tu(ȓ)YK7?ߴ[+eT$H@fw(SvhF 8M4X2agidOԾb[uQۓ/J}{ʧ3NEGe$&G5S3?kح_m'eG7KHNi -:O'Ax#Ứrn aQ6[ S7mhUXŮ3L'T 1"TR\V3o2Kj ;:Dc+/|7n-l$LD^h<p2ٚ&ZƮW;ӡ]u&Өզjl)28 '3̵n˟ )nIljYڣuo.L-kXKvT[R Wd6$mҎ6@MsiB*KP<hw3~g[ b !O-|d+|q,y|MIƗͯ>-m~uߞyx?f TUBX=&q_{4È45 MRf[E *Tk Z1<g˄KodOk]{0hIF,2MhH⌈59C40<4-hԍb4Fb I;*A䒸jZgNXˏ?O+2 ]Gg1 ޸0$Ip\M:Fig憓 /O]}H^y<+n!xeRƪTzL~,'0*:d$[G [5@i,4q?=sպ|A覧bR _ @ ,bM 8DfJvDZMa[r@[ ݆j*id\zo˭Ɖ[n~P (nIܬg2azIig?pZT]Iuw.><_sUII˒7|=:>}Ciz}繧. ^R7|NxOԕJܑhfy0:0q^V V3[rl-7K1]ngB''ejEn@?ˌ\,nefK$x<-0PHő"ϓЙT+7;jts ,[N X˰ c7 b63C~f Y6%+(.qyǗ^n|Z`#! BDE "w6ĭ6;P願NNDo4JWFѴ²u"rGo`ECu!q8^Jf&ZpM4b cpGOWoUkED|`?z%(E99y 8Mjދ0,^ Av1ѨbpS" hIL7NB~iۜf3cؙ]fp)w~.@+D)SN=33윂)o.^te;V~^zgyK{*ذ2`ec5_|ꖓ(ju}-.vRKNT8]ylWo޾Pwbý{-ZV=ƛo?m^xqSCc6y9k.yne{.+ms:kǩG/~ _uePBc/OZ7eibЅSҾ,m}u'ZkwN:a %Ҏ̐) 0xҌSOdUg %nKlzͺ皾>|7Q)n4O@7x~dWP̏lf=-B-"J':He-+ENL&LqkDbI{ш1J܈lZٖE_!]):sx4L (hWiZ?;ՇjGRtiYҖM&L\_|,&lAMJF1S j ӑt 8s([>[$l[HUat x|-@M1 }\PR>nFJȊًT!DEdh2A8=Vh\Jƶa-;2ى8Qشʼn^v4f:IvmBӹフM L` ҭb.ʹk?5*m~Y}mA)z>VL;vz+7_DŽ5z3 }g,)aKw]GōBSOv^3tRLVx\W Ȩ+ʡlZ5#'0SlrB1j".蒴lO[_8eHyWF^9tNnU&+ Vi{+Jޔ5=9Ws3taoCgr>E;hMV?2>o ]DZ^VeB4<W&i,~ˤB xҹ\su&B H_HF͗Tȃwrccg˒v:R99T@Xx &!BOHhtR\,,M]4ه:ui[_pдnХkuƍ6s˲*ZPo8dt܁\='ZNYýK`:i,퀅z!+ Sz*\ ^&ċ ZK2>d8Ǯ:x_y-aVnt}f/4 _NnQtInSBeD:%a\A@`LOzP䡞+ / /@w>u!CGp;}Ha>%sSs O2YUeeBl:V|˛gן/=҆{h_MKo8xLpϙzaxl3_@>y3UĚ|hPaЖ:Vp0 ]2DBR U)ݐ4# R ;yReLpk\F'|Ć =H,7 &$c8j-b22;"F}V-8@"V 77S'pٲ7ǯ܍nP3ϡVCOM>1cms\i֕<4"ZrxM>\뒺;N-CXG wN`Muubzd3Z҈MX{>)Q#*E xҽy_]hx\Rsg_Q@#ކ^?,tu* (1BIeu JGB̷aɰ_oGZf"n=5H2~ _{X|Q E u2{N(Rl #{ ïj]b֊5[+iGgjp.jyxiyҚsL߭]dM ڡkPp2j&n2 ^4yn ݐUva(бN`&>Ʒ6äBn&Kx (nܴTo`2u_7j7>/o{3wGO׿iM!cb=1eƸA^FcBRfY$o`# [^]hsw@3~M؄iN4 Z0.y}BƱ׶^zI~і|_V;}-w0o3q6bsQ 6_ņ:3u\]/;5~ymB1UgZQ/<:>;|۪ pߏ֟5|ףV7m\IN0|ًϋ攼8k?3~6Gx脥WDDnfZBp*"s#yVvӵl;.m69Y,~X UiK7TE󿬸ՙ'0oO^-,-/02}yTBzDxOFpQ`cO_y\q׃W_nx{?rK[_w(bq4j|^R|7% ܣSx2e>dQ>UIiD<ȵs OCv,5;kε|sT מzѷe)bqS ޘjG/ Y L=Ce,i~SzWikt.WN5zu|ȥ^3b:{_i~)*jxvB&DM-6 ^le{}sޜY|CWnD6kv^}k?hH/ 4YiJ^yrmѵoh^n~Y~CKP|uGyd_a "ǰcyrՅMD*x`o 771'&glxCnfYcڲ}} \1iP/6jkʘer:PLJ/^lyr5kx\~㻽WD,²m167x/ŵ_HM\\+_z6|aRUfVl91vQiZ!ub"6Y4=c?s0:mVUfM~Y7>r[*KUT-<نA HžMzNHgS.Y*nDx'gY مOKGL^6M1-z5i8gUb~F@GM*!1p3ma2PJ޽:tpCȁĎ2V}­9C&D2yIvs57_ n>t壼腦-XK-//)Bϑ9_JIZ9sm#z }J_ME;NԿ=E Αu]\b=-p`4٪  X,Fu̠RtvmUx6V,kL틢E}}M3t7?#o47~{so_5-Mm0ptBf3}SSQ*xkQSȹg6O۫ tjٶ-df|i& O5<0>l}Pf>=\.x[b݃,f r0uoϫo}O_7?u\z oV]l~1k=#9Znґ޳ё '%y:9G>:D9t7T=x_Dt@}`3H9 7Hnv7n&f-;PltѲeZ4!bsLƁ-ߞiۉ yDX }g鏟 MO1?ܷޘp<+{\5b!z4gBۊƇŕ7o}TBiѨ .rBW9?UB,qa2td@LJ59 _#ōIdCD˜#o?렉W\awcϾ6} @ VjzVlC9Cg(~ǧo sԈwtS5^1)B:Lfekȍ}l:$[;n,) sT₺D|7M朒ցE&Kܜ*:=M<Ɏ^GU8#(Ljv]8h1E-!.%lX<4EwC<\vC6GOC>!=)_g1ITWv骻8u$nKDy' w 0ņGޟUA]皱gQ5Ξu<:,\b:|Aɭ{y3v/^n~P=AZvoCoB#{$~-C忈`Z҉)(G i)j|lJgj+g[Eu]y1c31`GI݅)w3->V\Ei'D-{|X1C# p7W&hD ,F96v(o9/#uY/trǹk?`/j-f^s6LYp5^3R{4](ыyZ5Z*'B\4м(m6PSCKBLⲨ~7<)"c(]0.ac9OB ^i))-By?nA)ϵ}K#tXAFN ][ 3^@ :~<]:b ƄcphCzۇKMJ.ՇLϵ` F5 ~ԁFU;)6pfgK֬ς d8QMٺyTvJnc?ui>F}2*]M{yiKpM\}s dFgۿ,6@Rݍ (ko^M'ĂcO wS*Y衶}^Cl~|Nb0L{c:v?Q,uz%,'Jk3vPsOz}dOCfDH9G1k=C=!,Qu@]\ue|\D C& ;/7<5>>›9Xզ5[a-GJ\eh;*;v+6 ,҅`tL~NwMX柎G 77RY4Ei ԶU@ #|Ij}fMKkn6"UZc*SZ ,MяXƱe+҃oU0y.S{I2ze]SM{pM9l 5q??F:|7 ~Kr7lWGˎcPuAG>/ xh򪭳6nfg,*nU5p7yd6>M%wwo4sv d<+5(FjY,1 TQЊTBD͵SeU[)߸*wOU+G+U*M?miGNQ"urp8K$k@ˠNq2Ý'qHl56|^nI;O b4eh4e@%M/{j&E$jNIrE/;b*RGkZ^VOkB}mAzѹj>rIߥv>f-L#}ԳWUT0WgQևxN/6܇>X§76<(0_ b6E{W\FM8""[ !ō;'r2jlk"^?!r]qSc\ic41Uc%]4 tRb7rbgt0e/5TC! d8=9PUe3fzn;7>?Yi-B-ý4?S$k>tl2TÓXe<:>zS-tRƆۏ4ިiV[H뒦ט"qkzT3!„|N 3商K`cD3:`w[*MK~ gLtr0MɄu1cb4be{ X3{nQ hŻ_^i~^TqU=*i{{ĭ]((i1)'BcgiS2]C֐"4I=l\2zM J>( (n4 ^2+zFST5 -)sFڑGIذIxE< -1n;Jjna=̆N.ꅳeW;Ɩ ta)":`nG킸%[0Q;_&`HwsͯQȚ1>lHL\Qc.ڶ<θ>TUwL9_{+>8پ֑8ݨsJAc bL"RS6RÇ8e+>jڢuf&/̞`3RwPҶZI7+7#-˲2#W2njҧ&(H?tAx!pV-t[pl]xš9y"BWɢ2 W,YdxH(Z<: 9gzN&!̋6`moM>w8cIśDGӗm eeEӳ59h4Mԣ5ȫh%S6~cd1h4k7Ta²"6\cT Er&ud;-qA 7?(j(pq&.j_QCٙ˭WZ sϋe9ڸl;/3 b=ψwbً_C"2g6扯1DÓ6>8\4q 3ADŽz%-n7JNqWs7&Dm?XJ!#ܦԮY Xl}c^lSZ19i(+'2̭(. 7Rr*nQN᮴#]^:H! n-mͭCM h[ 欒 XxhBr9G*Z\jId{96հHˡs3!>$-"`u@i$TX̾p;!tv18],9Zt֊5:Y9rEJ ,obmJHm27C#_J,)Kj&̵߉ZMe:s"}I-۠aH[jFN'\ƞ vɴAɩbyT OS-5\f=ijv4kcF@ n 2P6ePU ĕL(߅Q@ᦂV 77O55 /n*%ԟ'8(4G=QgU[o1<1h_Yl2.8ٓsÍyW@aU2j}˒֧_ݳB~˺qz5q~"̕4)DI"z甤E>2:x:9,2܏$ ,~Wn$*m^UWYwk*S̖kg. w H$'γYEåm)+B\U#7E2~\^+JG[[oBd2c}\ ~3oc?6tispKV~ˍw7-Ʒ/_Q'f \UY2rMܲ~GD1ua%v(ܦ`Ed)mX2QEv؁)vi[0}ͶP\E{2tBzEPLo舅ō~< }f:>5v[ԓJOYͷG.S=g)Y{n?Sq3_Zo)Vq;H 7?X^(.K@fwX2zC;Jdz팓W(g'bk0*Ү?_]{q-ocx4ϴldЖκ6DLpsz)kGt -:[w8`l㗯[OO|{yc5uW4?NF,.i=*6aa.aJR~!aD'$cLHJncUk#).!t#\lh@v#0H6 ^׾4EįR\|IaWlg 6ncv416x{Ǜi_jZ>$3#M|{X6hLԐ1N19Yr3fL \YvQ<Pv;ytB_\jO-U)^ =M}b7"oY.o+}goBWB{).!^_O@c8`t<3Ar$&,gg(pT[" gF,oo0YSu=']V\5 Yb,øxVӋeI Q2}]ToO rg})PC).y:~6R ܚ6YPއ$jBP6-Bx.׍X'ŪYƑơKu}fH& g4` gE:"|a1 V}tLjc#XL ¤ecTDbOʣECaeƑk VR3~۱z7bN>a.j:{cg*Brȏ0rLo,iT&g '=mT}ㇹO9} *rk:(0;ul 鰣mĀё1x0Zo(ZZ, AY*爵ІLdF~x SUjUp_Sަ=BD.Ah~ S~A죾z:˚E`@ 0YǦAS^3DҽL5j*s@/l cYy3PZR'6Vj簾d,-&jO#Z;*h% oU('^}GN1L /1o?vKag)JDqMTBNqG_-8d͈ksI`h}?3٨CI7E1Z`f4N5 _eJ՗ϳH`Ch#Gcw% V1 .% ,NT6.hf˛R c&?[#p5p&y083`*OH (v܌Sgk_@ q h =;0T3b6VhU& q;W/:)Jq)}-6 ^?@|@a@"4T$516sXQ'pUB;Mea Z]?( [6Y,PBh sT**to/4^=8cB?Aj0'э 9;˂tC7p0lcr "\C9&[/H:b,'m4ՊW&i)i߀ھF-W[W>Ea?j2b@&0d03E.6֡o6n2(펆E+0Zhn zOp+%J($eQIh4l0b 0|/cJЕ<2w0=;1$9FS<  I S VHH@\.9&P@X XM:K$;q<]eM(T`1a+ 5A,uy:ބi,1g4z,4_I*<NقQЉNMI1gN)?94Y"j"i1\7A~pK&oP;hk qKr( p,r<7htX^b$C$4]yR\!+&gMX{ d(DMk/2n(8aӖDכeƁ<@;uS(#yvD[a y.@ M%Q#m7%JF͒Lx_ZxMa]넥b4F.S;%#I&NH 1S0ALfbC|hӷ|e (s \iXmdm͚*ts~`ςKC4;dMټ)]%Da™:Mzp'ȇ 7!7 d8jBMY%}g<~2x;XT0Os\"#:  ƐUBa@Z(*S'#@5,&;E{?%H?,(2HI/#'WHVr.+Ԑeԗ)%zh,ryc6DL cq5Ҩ`i| _+A! ]Rۑp)M(vuᵺ<5Lz+:,UŇt|24;-&1MXnֈE*=N,HHWT)k : tJ_%O&'Pҹ2DF2zKx\1u_tT 2AȾ ]aUoOt-u0U[(8u0{)xwDnD"y:i `ƇloNR`ҍ(aj ͮ|p$pq n ŠJòjQ֤s$gTO-dM**.DƜ~: *HHPЏX3{h pGT OIĔ,G_8= T匱 @%4I+wHpU"VˈT@t4}2W>M[xMc0翰{h:<#uh7CfUeIg(A@ӏ-{h) }յG8%YHR6*8´'n#: yw^ `IH؍4]Xs,hPX*1HAJCa=H$o*baE\:DGRTϗzKwf7TG?CQၕ@Y3S a1/~<i5mg%BèLluZ2gCpLI (nԋad/N,gVdf+sN=UGΒ Úh<vfSQ=|+HEt@F+Vb0չMԉ32q[0:JG4451>Ge֍g08a@v` ?J(X!VLIX#4/1XE:bd"^X8i⚝7 \XP-g ghM!R p7GEY]{D$0 &/U@pSn<7El7FxYll'.@y.Lx7HjY$X'G+I),~0tVe jUX QW~PM۬:&f"WԘWI&D뜐Hswe | Pݸ)雛dT2uR {V2Iʋ|\J8ф^C~iwù_ 4:d9[#L|o 9%(^mՄx#I/N4K#tV^N7}Cu,:^8:$#w/OA[^:":ZF S9' *T*@,2tLQRĈA2:EHÔeNJlC3O*H.vS8L4cǘ2s/H5oݾ ['pɾeB]q r!C1GbR%IZ{,yI'durFygM)<7s­K.Q;w_Snoņ+sWxW)Lݎ]皾,nWrBۡm/S1Dōӕ7VbJʊ^s^EӽʖU^\{aͷ}~/o<|͹@+Fwcipj]'A\I]:w>H[ w.ru}5?k2J]7Tdoehu P.G4K׋w_M$x?~y3**u&** "!a a1YDYEVٗ,[Uݝ!7ʹNuuuխO'ɭ{Lc ~&Nl`aS< +(҄Kb5Z+kȐ!I =κ}tW)+Ay{{Qc#&G&G'g@&fU333*JVk؏v>sd2S713!BDWeI$ ubbe~Ds2U|6lx\ 8څ8kLs]_{pSWw+kxyz/B46"7U Mг]?K8,>< ^"чIy!O"Gb7''´ yl'ggAm< ;J 9:%霽yd \!˙ @ٗKH1uWq`B#M:JqgrO, C?: A 89O , hvg!?ʛDd[z֡x`fQ.X}\ }?:z&1dЪ ;$s83ZaS_Űqv:1%|ۊײވxC?b9ZE!Nߐa(F*s N4,{גyM9=?6a51e8`4΍hlyEM- DCG Da/X5`C20~?{ m+0_ B>79 \F30fg"133gٱ\BZðQϓ\"DB }Z{H=Yk[%vctPPAtG,%_Z}aD(x*i"OS@ aBD_ou2cC_&5z(-R&P\lIf*Ha/!̊)<²/Βi9N>^xfTS )/6<9Tez=FBs:J5ۂa7NG#"@R›ķ`] d"Yv1#s 0+ gqzbVo%me?-`{"Q.R ѓ,NK|T#Er^ {t's|'C֡u ?[ raPL#AV;8r~(c~(?rC9Pr64P.Ed=rcry~(<~(EYP~(  4#?VҮңCC2vtVӪ?~Zn"O S@:vy2=-wü/7v˛u1YyÚ),@p1A![ ϙg+3-͡ ^,F΢\#vFP\\ES2w~_f-\fabN>!jc:gߔl=Es;|AB/e{'H<|%WoމǯM][o+U}x!zBa@,,*G*%/r_$=}\PK7Ӌ:|Sٔ_\X\Y]kY]Uoblhx~oខÓ#S2465<13:~(ojVA@aR("ALNlU2kr7mD+Ħ@VGqY)7!&=`ySvCy;M Pp[iț^7o>2͆e={Ӏ70oT6`Ǽ9x`Kͮ!9 ff›KͅT(E`"Lk~9IeK^u[~M{˷u$^'$^^yEvev𦧤`6o&aެ@Ǜof37[نowc{Ǜ̾ ̛O ixsVwiJP( PlJFUwKm? ۉLNV:D~ZSΒgZv؛Nˉ=]#{xjaߴӏR-<ߴ ̰{i9{iM›>벢>Rx ^Uxj7 o4+j(j&Z&F›= 톼tq>NNO7IdN'/+=M)E` ^03c/7oDYG|o#6bmiJQMb:ǮwAiҟ\cw^}A_=}&K3I'y:m`ÝgB.a?vgo"q›AIEf =bM {M|#&GN w/j[ovm9?47fBE"@3@2`"r@*ZljcjV.f}zFǸmND8\󱿸J\{Q]vr!CL`7ǯ&YVI7v7So;ݹKJwQGdgc館i΍@[򢐔2(*iVUjYvUJދ{O_/}PT,,}kCyZRPV\VԾhx7[zz7ufKgoN98:84:alx񉩉I,SS&1S`SiJP( Uhf6=ljе-nYoyg G-[E;E;v:9|Kľs_ϋFvv丧WOŵK___x盉.Aw]CR.^wExG μ!Q>-I KF+J/_,yP*Ug>O̮HzR)ϩHͩH˭ȫV( _eg=yV[^U󺎊vj:jt4t7w}& z08;4at`pᑱѱ N`i.8on>M)E`Q!ۖ㗷wt m'=~}N+?[x쳾^[Anr}Lѳ! 9vqN^ 7$4w DNQ~ .nH\b/ݒz$xM _D)ũⴠ[1EH",!S%J%? "}Pȗ)'ef?xZ/WVdVfW?)ySZSPQWXY_R𬦩-uͯZk_77t6kijj{mwﻞ޾1GKsbX$V/??Ex=R\BQY"qTw+(R(@9)H G0i`:vd4j)I^Z qС⧤>E"+ wDvr pش"@P$T*ě$ID&9D吃%[̈́N0q8ьj ]V_pB 4 <̰\R-F'3`j(GW"fˡz R$=oL|A8ԁ%t _7i;E"h F?WUe3 jLyS6st)&E"@P(E"@"oxbendstream endobj 44 0 obj<>stream xph>ٛn@HBܥ5.DB ! IH 3n`ؽ_nk:!t|=|d'2N&% 1ㄍY$!x1F#8$BO` DB8a3M"HOa 2RYTXhqZ=gEM5;c+n"BO1J 5jII014F&/5M,%Pa`22DRU\+3E)ĶQ ()&=w9lli 1LQj쳘IaI*-S.*Zp)'fBp00iBd ~?GW(Y[-FUO3aD^󫔳Su& SS:IS0ܔj2q&/3 II-}? *n #,dCSw?00U6ה4)m(w9F1&٤ H0b22q\3Uݳ1|؁U!ƒ8 !wH@+G5"r i5즁C:<5=q+W9Qѝ]7l^,b$ah?K`S9Ω;WXҳB頏H%Z4$+9g[Xu7~.N^r㐆YK~gu.?#nqD5le3C\W#g9?w =7G"@2AAȿ)cĩ 2!N;H /n;8.80z9t4SGsQ ǍzE@ǫ]# vz),rbh▪m~Ie}GhZBD0qsxAjoCzSbx8Sa >J,/%Y4K3uF鶑; *niWu_)0*Q o~gdA4+:B?qmO^轡ȥC2:+bcoo'fxᕰN^eG]ҪF<DUsm)/nʾp ^.L(^i0\xIѻdt I;E)JWq U-;U\24]ӫ#x+?KۗEm3(])ڳFĚŠ[#NO 95UK#pӶ;mg]0 !&=m_QX.%q5I^iHxi)l#/mN-}퓷!F8j!\Qj\tie5 QS56!4L= XSt+,}G>Z*VfN`}bwAUCDApZmpw:34 ;){bcz䭚i<Ќ =m3g\]c"s\bGk;GKPbEh 1,|ak /-I8 exuSۆxxiy7>Mt*~16WJmq#0~#.2vwtO,W꺦빧Xd1|ݓ.fTw&Սέ,='.?l똸ycZ&B\ê$)hBU*O TF'Y]vn)/s)˨orɣ+O.=iw||/|0sdW꾵skxǕsG.-N~6<756:zuo>+UBɂWi钾SLDfI<ψgwisix*{vL6N-MxА[SP/c{uSz#c6; u@L>Xz: 4IʾS&V>>9}g|r?9+J0+,(C"GoV?Ǐ?է?wʩn>_1쇻^“ .n1EE.}^|{Goܺ,expjgwx䧉S\z6 =mlRS=7uBmҶ c+#4횜w@s)HЄ3za#68 GLOlȣնܒ5|8hHs0!B@10%nU^ݽxg=~W?zuܚ>2ۈbׄjrZru]zUܟQ~ocjmtaIxbiҨ}^'6rQto䲞k+0pW3X_:UݷP~{.<-i?s)~::XQbg3ȹH#Fi" u׈j+­ˎXs5'hJ0lcə],=zq٫g?>|rw^|ӫ_^u]񈯱S!;ҀkbK%qe]]2Bʂ.\[~Fޱ7:[?v|H72죋CH4 ΕwOtMwH鵎*UK8I9^/CXs'ta( W.J,qn9[%8Y=rC .F06BI[yt;眘wi< A (ZgQ 2Z, 8p@T\L.} 'q(g?⿼C)Un)\R}I5bШY22_}rɳ;GN/=߷W3>2<0s 00ZFo]c#(u,(a"}|zޫwa4K̽,7u&*RjPN6 -A9-2q%' Q|mlsxg⎚U #/5V[8Xz~c/@q8q6⏞|IÏ/ZlbkS`:&5:&794[Fxy%U$]E'nv/E]TWqTIT4.h3=>~mmm75Ofξ0P)(l웶v(Ɣb򍼒U wq<~ڝTUЂ<Jhm/=6vp/?W硤6 P}jXz5vIbjG4 \ \lNsKJ(ɛ$UߩsfL Q̊Ŷ}72kz۳d$€^ Ȩ ̬KDOR_J[X>zwj.Ɉml-|U)Q&s}GRA07(O@5ֵ7o#lgPs q ح'n AgSkwY{&VUuS4,TDyE(;'G6$㐖i yX%n =*4[c119T}3:ިМPp TX_Wu_ZTKTӣ~)^wr Zu(fMZYeDͅG ٘1cR`_]xB+V.GJ|pnzyWo{vТٮ-#M|0Gq 9I؄=< } 4ܲUTOZ%JG9'ekltK.n|=˫)bfDmLi/º.m;-h#T}tFp!fPIX%#TS]>v5lETYxc橂*G,B%䖟j.kR3=;qgtUF?1%oj@H !vih H5x%QTR5t`]m*N;r!\71 x iĖ-FEbGfV&@ix;>a1o/ðC?{ sL"1MN'D"kM#azha`A`oWYU׬3rI'-d-b^_s{6ʦpʍṆUdkPĜ ɬarbs,mR2l}^R_=%]1=Onۧƈ2#?yh|ERcҏhѹ}ӫ Vg/=x4mjϯFԈӰrKm#fPiEz`UR+ tr=s4\2UO٦g`j}TҏKC7 zeu4*-L/:mpXF t=&'NY;KaT98xce潁+cwA_l46>|N?PG * ,73"!%jfx=RF 4/G&oz&UAZiz-ې꺧˚GzbBRKCAZGIWSxAi';+;JAus{^a :gTAO#0O6[}XKŝsWWٱŇwVfzOy-s! :hJP -?wgWG[>}u1F/uH'6Qܹ6m-9%shK/5%Bw f89Xl=ծH_v)9;n l}6a/=F3i0 t-ׁFN}{O޺tpëSᕣZngD敧M9C59tT=jq<#Lxw\Z1Q|i SK/n(xPz_b[x3GO*X`ΈbFC]Mۿ-ad {-1^Q/+|z"گ-CnX휼H#s=Wo@nf杀tfo?yƭcS]rੱI=3q LG%B ˻{瞠yydFڍެv ?9hy-qIrn}Cѵ02\v~-r37{—0 ">s{  SsϵE]*Kyށ%jk;0K>6Oze,y̪Ȣv-v9á'u*I!fAN FV``~Et>4NchwC^0Rܹls J)K(" 埐?БkRam| 6>o 7CmSW=s/]%׻D a5;>iUA L.$َ"&ч"˽ C,βȱm䑡C7P԰>ay#Pc GAk8XFwd[:eMq偫+[prwrE]^R.>8Wةctր omeo`Z.eu#quZGJߛlAwyT)"mNm"PvN>+Я̬qy;/ò0J([&J%L2@(=$yw^/0u?-kαɢ yucwpZxE%# c#RZˇdT(nZ p똹qS6 1 DLQ 0S,X&n]+hh4X|i 35BtnmxVePjo9n.[:[<5G=4v2qVcث9 ,\s+.N.#gI> W,°9b: VNe~s: "npk8"xdS x< 86.v !YC0uL0,pKҷ'Ciaf(NPۧgQ=2#ӷ{WJ/ĄM{{&+.gT$T%T&qg$ƛ{D|̜vr{Iʨ*Zn(5,k1Vj C s[C7s*Ee܌FC7ؽ 2SȾ$`I8<3O OD.VaٟKCym0P(;0}Άгosݷ ]_50_~gׇN"V/ m22+R.fV6O5JsLӱ(p94r Hj9'>#W%ԩqq8`)VgF}諾{aEy}k~ \HGD&("BFY1SP-2m'~qAETc҇=@w@ϊ,߼0<|&WuOO7.V dbF{IRGL?e[[p!)$$((8;.?)mU+z\A2!B،i燐K;N*W1o*Ja8\RPu鴪Sz6{kcT@d _KN7ڜsɧ3SۧtqDa9`&Tac7J;˺nwzy`KUtmumc(x]GRႦyuM[kZVyDdq{E1zKl`e_Ղ'=Q8mL:&T[K`ē:xŎ*hKk95@q4o!NccF:/,2O7 S 1JyPaF4_quVw._OM6`K+E#9 =5gې+kȭmV "cn?/<Tubaa[s0t3.knK4鏼Ws.bs2H΅QHơ+g2k{3kУVٞV֊@';:,di`Rl*x4I(=RHi= 9mSy= wDk٪e`cfP|"t{cgbJqч(q1t-qi^9kNX".FF0LѲ+lv, #!?E\$ 3RNEhnEbj932`'^ݝVՕRс!ҖĒ.5B:4< 8^PgKhshfSgtGnMEdqTm;aE*&L_sd/\IE=cxv%\22@nSXY2hj[P-mcCJ]G m 4w<Σq.DR 3O7 e6!6 ~I/[smh2?U\{]҇ 4Aw `cwkZ& JSTZR%cO H AmTCNJQr;hɥK6QU]ԣ Fi\`beo|ikF3 5y,Q"rsֆfU1C!} h7Qu"{f 7s  Vlcn|蟷|Qwa[>c㯷/ Ӭ֞TO*niu]4Ѵ,Vߎv2MFI+?CDvI+YwZ[JZ[A`Pc%g/CcJڢ[.G^ƌv-@fׅdeT) 77;Ur ж~q`JSTA3N*FMVC_l}iy}[ 9/6񣃅O9>]O:?mFރg(ƎW}YLE Y@Fga푟`&M1f= mjCY˂f\j^,J g ˿ ڡ9d'$>S!UXX]9h]G&R:1ffϨD=T EQ? f/Tȭ_|Cn[xn )rℶcks7ίn|1ܷ'ꨆf3Oj|Do~Kc856 )2#uISаԞiSM?nٮf0)_VCDм&HPy t2GN*8'fܢs]"b18S!B/1j59h @km&!L9A6,{~8/6jFC7(>0dkL {Ez0653OV Nj.a;?Nn')wZim~6u\q.k?8IXvn=3 !_c{3YlCXz:FJf ׿Y~`A⻥y#7@+~Ӈg F7H _xb{jYK% j pwTv"Q7 iXEVc*}Dc 5òC2mS0 yFBƁ5 XC7;#}#4m$:?lG voȪ$&1)MD~PFwB1`*z~!4 ,0nG8 mg3WPl Ն%VUN !"[/q|ǟ6]1 #lE? 87STHj:mae =tܪFkk ;<`jN G 2EO5?}mk;uk6(G-D6slزc5ۥ8fkyr.5OA9 YíO` !5B 7BT,qz6(Vg֢i;GײO<@?˭OEō§dfMn!L."4tkjkZ6ѬGvG0(P(j%.! 6p?:ü|g8ے =GP1\,xBw9NN()=KePhq:`ݬKE%D%6Pxlظc8Ƿ" sX'̱^%,YQcM!k7K}d#'8v-DZ^N%"\jlС@5_ ,6BuQ4v(9IMv' g*gۉh)-LXg"FUrҷ Dwv +d647 pIXΒ_CQWbhzc2]¿ᗛ?[ѷX<跮mq>Ydz0zY4t1Oӷl;f QD>,@E,3X1f4ڭ^s>?zj qlXϷvuoewo^C8cfn8f|cײd.y {IߧB ðC9)Dhtdf!j*V.~N0X؜4)eyƞSIQ",8E&xw!Hn 62nߺo[aթa)tM0-m _Q?]/IwVFM\V ^)rA]cΫ׉a%IOq}m6_Hp$Alz`*-? No!~#57rl!Wk6*%oOLۤ8vy'`שw+|G}S]2lN7& ؑ>{qLROemW٣@$.e%,EM Rw4p43q 8hꚻZFSY0ԘֈelUiMC+9ǔ |]@7Ӎ\|r#4F] pw֒gHXex°ˆ\{Mzp+:. &wR)~ R-a)haa±]ai1l-AF$a96|-[v|'uc7t\caq^ ?NY .@gAI+# W$`n$0Kd >egAj4fXRMH.cMRA-#ȃ mѝ0*1:&`lٚ t֑E,K=W-~\SE"y6%pwl! nl`iPlt:C'IRw/j#$R%^p47ڗdNY 3"9u;dRBEYV!ֻXzoP,fwXwu` MT{A GM ְ^6lCqriXjDx'ư,`.i6xahݏOǗeUq@@FHDNUWSrTwC9\i G-UpԨ^54̚59Ję~AZo~$Og?𥈴:Qcfb'w$UڊG+n a'=~Fi))"ƈc_Il$l5.$;MDى< ԙ&,h:RQ\%Fz)QhO!m|PV[+ϱ׋q|'wX/Ȃ bDBBm9 > 7?[m_fXuΈ āwZevTu^Se=ǩ;r2P(Hݫ nKKC'l7B1K ~;d̹diGu@bk8F t&X}#G KG{:&1xLQGȩ2gNk5@sEdI`F87 T "Ҫ-P2n)gQpH1"W(YS~EP^D  p|u58ֱd(I(5l |߅/K >Z_h1"p!~6&ۏ\c;O߽4T]z8+PqH(X#qzsonK?Z +}=0#Fi XܑjW4=•!X ǹ}ێSOQN[BtN@̦L@MJ+\=^b5*!a4aN5:qE RHCP < gfhIqͭϬ;HxdN8=bp^z6^[IoD?Vb(Ț86 !ԇI&6hDYW{cAv+o}M_fi$TS|Te%,Y˞^Xp"U%y08tf*,6P6NZhpjcg]foy}&pf QBx_$IŽ`Q^0]uxOE [_ʴtsE]skpl֭#v!uQy%5I\O(}]$d5M4/un|pI}jBHq8q|_ 8?u&(7"lF`YdL@Y@ ؇قo2 &&˖G9 J}(y쵐 A8 pq7{a_]ĉ%'z2vNF3*R}zQQdI C{&ڹaFJUH!XYdWvGz/"@,m&/ίd!-4HZ<~m`==A9]3TKgXr(;M]?W;ةPU wE-*~VQ-[wÅG=nKp<|?O m^o.]/vubpODn DolyGwx}gk[6|K?81͌/Æjvt`u@4=  ۾;CWQ ^bcPe%״'Uteo۟h7]*#y)(~`/lR iik1rQ;b㥙}GYؤdtݶʶXGJqnӎ#Z'aQyl^B<&n]v\؅ǚ?w_};_^1 6^ɪޑӁg?{'udmZpOevk>44[Zuj72ѻ\Z#yEe<yw)gWNMcj#U^YѰqaI4Rݗ\ݿdGE=!F/(Ce PI|(_ؚ@] 2DjKVlbYG۠,஄CNY&8p= 0quQn#v_aͦV4 i;;\߂%Ǯ[+6 :8?wΦoG<6}έyAt Or8yMKRykƦA܏&'+'bOJESZeuxܕTڐR֜Vgu~!imwچGbhς-ԇPOEF-5m#"]K2گ슮i:'Š, X >b`KX-s" #L[c`mL{A5PC،={U\o>pγZuΧ:}ʭVmy~i00=ΧFr[7v0uNfv0/y1幬8wq*'2̨;Eqb,r4>8vJ,;x*wϩԚkؿ9/ȑ ]r#@|=Fn.h wPWEa~؈l}5X윳Q80^+t7 g".+Y/pgݶue$qT^@9Dj`k}+04znqi뺊;_;|>1p6ɚ='r\d棧+3ֵ:S>>`kPf/ 7r~rrp%HAK-.ơmKw>S`;/z7P|Y"JxL4/) ,y7P$k+ȼ9y˙ Tg$i셅EPI.*Ch jd&4mp_ȷM<+iج%58qyXGU̸V, FasEgkb* %1CXJ4 1ᶈn\BDymdUS2X#:LØyG´b!Ṿ<&(#E6UXC^#*i[C~`0/DOh4KqSi_-A{T I\&Sz M<-uPmQ',B.ieDe#c$[`!; eFg!-#-פjGԽRA 5{#0y9knLLEΔ;ܖrb(kZJAŠl&jxǂ򫨋(~ :[]Wv^[gIq䵭YMg0=7 _-ͥg ha7⟊/>XC|ZM"Ef:L:KYnlj9׭lvPU.3)#$&VM-llQu1|/eYQG>FqŞ =?6&,؆uyӡu_\|(gr/c 1Q{_2w]Į!tp|J˅ES % :&-icki,Z:V΢$cT蠘P tWkAYnEСXn87@ÜXygE%E;Wوi=jہ[(l""OLj2u7PK%EOA>48C "6¨dQO"m,_z_P ˫M-ThM8W(윶Zq' Jb= zuKAh\v %X ! L۱/@G$I_!V쌍dGΥHkmX4e,hbm~5 |,HɼL10mPvٗeIB;Sόu,dc=_1ta˨XFa(0¡^C9n>¨aБb'emG)ҞhRi Er{~1+hMSÐcl>ܖn#B mms1&Ċ;x @|:e#>l,/X箟lWw{1xP ̩LҁHaT@PR9m\*j_)lcVPq1b!>XIk^ "Oj At*|,9#љNA2!ҞP5 `51r{3^D{13qQV*opgϥU O}5^P(W6I̤aDV[t*W m2:sY]7IKZ/|8C\ϢXA},A œR,>"Pib7I+kז+CnVYbԎ3@J/\mef(OɸfH'մ;H4J׶E.t!*٩V"*U u̕ت >4@ӴrjO`O.G*<}qsc@8 Rka(W SU#9 6n`DYrdw'6/B=ƎwfH2f`r6 BO"霴@0,pw@ыJ*N ծsu2Ĝ!hz+#P&BS ~ҠM x9\Fgũlj$f43eҤڹuG^?EG  ! (0>@AZȢ.E Mn*F#-7pk;*:l bRy8^=$}YeX*J1IzQؾ6X4*QՂ]tjӉ<7Lg<:L<1$47MT^l yO'|՟# Pﵬsl~0C DGg.b-`r3p[4A,"L-Y0k8:p'43fiYB 3OU9 xLź-bό'Wphnh 7W>'۹Mg8TƷ_鿖 u翖@-Ӝ5d nS1d)6źq [=߭q@kƢ @i%U#jZљKZ.Mm]}cnS:}Oܰ,@a wݳn`-]Rk#~ct/ĩ &'1C͞J0Va]ODʂpS6STy ds!sFsbMmӥ>qdův9s,^S|r#*r;)kĭ{ vmſ]^+Wbj׼q.'@'VYj*Aӽ7>Yח~±kDOu+r,-wp76"$wzOg߭x7N Pi734K}:E/[iߞ-#,}mJ6IXw,rU~D_RHqvc$NEGVgn#n]dgz:k !4z( @Gք[dY9GГcpb}3ʎ+ӶI+~>쏐't8rN.ZzZ:+/ػ9vTD"y{aֺݴ"n{z}3բЍBINo"wu:[@X3voV~nwwmff]ltၵf[hm,v/tÐ ul@횖 }oŊ[bt{37.vܔGhsW5 _wx+DojT;e>stream xsv1Xb`8L G10  endstream endobj 46 0 obj<]/Filter/FlateDecode/Width 28/Height 11/BitsPerComponent 2/Length 76 >>stream x[ Z5uՒLPaK$Eݖ @I"$S0ԑ-liVch۪USCW  xendstream endobj 47 0 obj<]/Filter/FlateDecode/Width 715/Height 279/BitsPerComponent 4/Length 5191 >>stream x흽nJGr` ,m|- Nҗ 's|_tWW7 t10LP /4h~k .pNy{^v{أSރuý Ge=p/;=Q{)A`:Ny{^v{أSރuý Ge=p/;=Q{)A`:Zߏgf>.wq+&?~/Rr7Rn[l՟r5DVl96ʭ֌sMjjH٪OsΨr5ehU(7[3P3lnMl՟nU vk2e^o9ke`V5P6X([0ObMl՟kުy >ߞs)h>#e\V96% |N9M)o5_SylSrp׺ ޳TOnRo9K&uiRf_Y@䚷DB5E ~ˤ Q&=Fu}=,Y(%"DsiQ՟k*#e(eLl5}=,Y(snEe)`2ꃗ9dԢ?'׼UN9MN989&8%8rNoӮc)?Sރue ^0)lca'c2_ԓ;Ħ` 6X@M,Fw2n2I΋%DireI(YSQE9+ty?M7D7)dSћr~d ('7e β3t3Ppu:<ߴyY|Y8-aPĦr2OaG6 +_D9F#e˙.D/ ..X2B~3PWRe'ߧwz"ELfD y6@.68*`WIZe9PҲ=m^1 E 63sPFH?"HQU?DqrG#BW/ H~B!e-@UǮ*I)P(35m8N9& (RFa\4N#2v4Ҏ)#  jmk#"ј!Aw0UcvVDtx/k+ey:UenM1Ҁ5k QVz)eZEFʌ9N7#~|}]7gW1-8eYqL?)'9Pg%_X)cb 0Ve{z~aOP9VʈN0LYrF- %hW7x /p{|q9CB^I=NRF3)r$ysʀ𢣑6}_`p5DbMb f@B"/O Tt5VD |>|Kre9AL{I?8K8fSK|L<k e1 ,Gó $ NG-x(/)'cUm>B[͔9PC+kQJУV&/e< 9 ;GqaxVF,t%!;S˴8VB 4fp(RCH<2 p#ʉmGy9|JBOPv+K;!N9j㛲ڔ)>.72ƧU?B7M-k. "YbHpRpJ$9wc>*e9b&S5q@ ,T]m[rm2ckG1krq)~f'^/(KK0)k22tRTPP聽L1kz0V],Gy֩.rLp֝fQ B٪*uQ~bIu2j};\(Jyn1'fM2oCeaD͞fpBM2$} MjG uYfU1+j%) ^jA3y9.LRe`\2Sw\՟2k5E ˜*1eN Pjng(-2kuƽ>!A$[A?hƠA2\R^xS?]IXrWR(52}ʣǺrro 9i(=irߥX_ǀ.B&RU{PΨi#q9Q{q#`ro2.ҥ%tRT6a)69_Z47Oz78ED_lsQܜHY<'jdͤOW*V8_*vIUTW8$p/ZPKl_wA`kZEo̷".NV28Z,RmꋖD8:N˒Z׆ؿ~eŦFlܩu*p@cR"R9cp%ߐ4RFZgN9Tw+Đ*/~SV2 E_4F^2(HRƇhm2xŇ:Bl),;J?@YE;o ,;MB~t|dʍO}#5S_22*8l:`~x]f^7{ ݈ ƼwF&v`IxX 7Seb?6vkU/1XrWPBǦnMl<2>\f Z)I ^_FҾ8D٪[} %w|QPŚH٪!e4,O<%xW˿!qlկJye> ^F4`>xGwU_4/ORR NY.Ura[Mr2ɽ\VzӪ/ƽ,ƭ.bś/D}e'qq/Xx~=i\Rޤ'0 |5iamq/3V?K 45N씛hey hf<iznsqXJOгlzB-핀vN-a2H/N`,/=A1Q^02H~R3!?ɁC "$\R5ZaeSXaǫE885$;NcZ&)賔H (5Kʸ_Hb[z)Kj#dgFm3R@51Qb 5)׬^D%J32[rN96Y0rf3媕r2s͓[T G{^V|iwVv/ ѓ527j,\?)ƧU {{Uu8ec)oV)+POaSbOC.cs/IZ,^ѭmMʧw\թ|<8Fס=USQNkOW<wMgZigS8$PA}֫TP%uSYNy'SOf:12<4deGGiG绗G |3d deϊf@;Y+ gWg p+@]SE)qvNy U8YD+ gWg p+@]SE)qvNy\lLJr|b~o r\R8S5MNyHlܩ]̪S:4S^pe](s_Fc /׾wY)W(x)gCqo=u eNy-'e|H^^3R^:2cջ ^_FveDd_]]/Filter/FlateDecode/Width 498/Height 239/BitsPerComponent 1/Length 1610 >>stream x훿E-8GԒiH2 !DpV -d֧ .BwvWTa<%kg~_UuǁC^0[o(P-*i)qwkw޴*N9 F;>8|R_ϫ׽}?ubmU4%~b|}cx;.Z8}aU>\4o _YvK;PR/NqCU4CR+n ~tA/x Cu/k&e:x+>^O'm]_0.'_{-.xG m7g]=*(棴ץkݤga.^W-iz&eb7b/>iyqO.T-QLsҭ'^{5 !7>xz<\A <^֗(Gn'=sgEu])ž~{ymӏ3d:QoG%]s8t8Cl{lۏ}=q6^}=f1>+ltyF"8C6NO1_>\4o 8E8j .ք=6lnL,onW$9qGeAk|:۸zqUwq5=rݐg=\wnYau+gj}(G&NhK+=b` K݃, ޭ|.FeW:si6.pk[y%yX ^2ʑ5dvpI,6O<}Lg#O_2[<.≧/)^dwC >Gy#?Ex/ܲJ#~γi6o\%UǨbܞRҽ\!Hs+.y!HW-gv ώ;8!_)}D0/ Y!8a nDhXg+!H76jd4u-.wߺxCHendstream endobj 49 0 obj<]/Filter/FlateDecode/Width 498/Height 239/BitsPerComponent 1/Length 1498 >>stream x훿nG P02 )\461 "J)]Rpa@J> cD(|svn$AB&g~..pu "iξ#/2m.m rp9TÅ#jG1(k_ EྋCYl+WL6X)߇8\< 3:>L~ȻoQmfc~Cv͗C^ϧtGm e9T{4gq]CϮ[DZ#& ' 3S硱J%>7-'-';酓@-cm\r;eu2&/MKg?u'.)QU[id^|q}vR \m&rj/qV_s 2u\Mi&vCZ8orJ$樜=LdW;mTJ+Ti_JPx/F%Nέ؟^,bu&q^rG4~E.x);e9ov)˼@aryYeh9D} eJz36FN8Y< Ջ9BivxVR_.m8Gu7¥xK.e9pR''W'.ށU0>stream x0 EC%҉[ȍ#eA9xۓ rZN[I<4jVǚTbKLx_B>k!Ǝ|D^_jւD&ieK#y,ݵey`.?a%s_XgfeH>w4{X{|u//OZ'U|˄(5{޽_55;ߧAs}|jy);+hM+p6{6W!CKں`͚G1em /OMx"^1? /O$+gcx|쩼^BJwendstream endobj 51 0 obj<]/Filter/FlateDecode/Width 604/Height 183/BitsPerComponent 1/Length 322 >>stream x0 EC%҉[ȍ#eA9xۓ rZN[I<4jVǚTbKLx_B>k!Ǝ|D^_jւD&ieK#y,ݵey`.?a%s_XgfeH>w4{X{|u//OZ'U|˄(5{޽_55;ߧAs}|jy);+hM+p6{6W!CKں`͚G1em /OMx"^1? /O$+gcx|쩼^BJwendstream endobj 52 0 obj<>stream x 0 E#1, `H6]/Filter/FlateDecode/Width 628/Height 183/BitsPerComponent 1/Length 322 >>stream x 0 E#1, `H6>stream x풱 0E 5kCقJfPP2)03P8nY~,ۘ[ ݝOZA+Kg=-g"fveWWG9U5#'ʇ1MpgndFXP^4,tHv@Ҁd@H'````````endstream endobj 55 0 obj<]/Filter/FlateDecode/Width 270/Height 166/BitsPerComponent 1/Length 263 >>stream xPWo@3֣B5 KG(BS;z#ݽ?l!@s_w©Ay7V4Qendstream endobj 56 0 obj<>stream xAkAŞA9ЛKm)5W=sPד$͓vEi"cOdwM#%F)sfݝ@7{oy _x\&E3x 5=^#?pp4pJb91x78j+25#[kwe{Hu=2wއN޵j_{vBll~M6UִoijGvSm׳Qw Pf?[Ϻ՗Wϗ=FU9i Z =g4eYh&͈4`Á@h 4@h 4@h 4>_!K>V̏2P-/gC>gtU?Ά0HeUgT S](hݳ9@tӥY֜EA PLs5:׍z;9>C_E }'`e;<ڄ 'G̃FXħdLšhQoOK_"R۽G Zi{ɮ>Ȩ%"2NBZB"--멜կBgM;&kendstream endobj 57 0 obj<]/Filter/FlateDecode/Width 338/Height 228/BitsPerComponent 1/Length 774 >>stream xkA  zC^jKz衞B(:{D"9zݢ4"cOvM#P#u9Lf0A!dޛ헗ow`YQ 49 c4  { !L#>Qpn4^;p52A9k9odhowj٦6]BV|(k~`vMo+F9 j/B]+87/;w_>=MVe> XFaYbB|C|aCaꈏ(uYL}Nz|0#CdC M*r@9P(:b7DfDU:Rφr@9P(Lrc(Yk4@^n--pYpv^؅4zzݴ/TqyAZ_yT3l\pZ휽i/U-~)OБ؀z9endstream endobj 58 0 obj<>stream x=K@/ -&.E"CۡbHqc>nBTƀ/"tOr{̋rs=ks)Gv[JMxcA rULŽe#D'iЖ.Q4@h 4@h 4@c Aendstream endobj 59 0 obj<]/Filter/FlateDecode/Width 337/Height 168/BitsPerComponent 1/Length 787 >>stream x혿kA/`'&K; F--DR(26B8wXR b!(c=f7^r"9؛Oo|vrD[yHzRHŸ>QoŃDbU: g2$Gu 3hBԮuDa'LtO9s~xᇏ3OBky*@*[|#=z3ܗ%F&rFϯn%mk4 aGgh3>l Tsqm[-λI4/?}VYJFTuHwvJ;fG"h(>U`|F2 |E,ct|A  Dłgvf0 :?N@b \f rh)f!kʼnjWA)*ւf,5@2ÂđAy*fڢ1)9iGAUxQhZ@*:Pbo+*1Vq(1R1GjFU/FUT+9}r-+r2[H@@G H =fo_TU$jQ;}I*cOвk[  yWKl?`kw&aqmBW7ӯlme,xA6ڼY:@ͨSH Y퓫B:W6 cUn&~ s1jT 'uMؓGrն<<`WmQ0LmvdٿX S.VnwQ?."endstream endobj 60 0 obj<>stream x1KPǭЭPC~?NbDC "]R:T_7)󒜗'\tݏ# IEДa܍ *:v'!8T"| }0USV\U1TՏocT *8-C_oV~5:wG pqA.E]n(n%] ]uF3zZ?3Ϧ.e·#!unVݳA/.kfo<ےZrN~JGbP.\魪@IX aƼ&wB毨NILؚoB'S%_?5ȶ2@ d 2@ d 2@_ũendstream endobj 61 0 obj<]/Filter/FlateDecode/Width 337/Height 168/BitsPerComponent 1/Length 1020 >>stream x혱kq[HBtȟPp))Rl(&H.J) Jpn(W)r/qZz˻O^w&Dŷ #~OQ^/rִ܁ ,m.@]0Z*!6ҁuP%;@N` tNz@(?aBY+Z{6'dU15cVi 4 pRE8D}a;?w Lä8gࣵf6Eھo _ k5^[gUڶ,kKCSV uQUQІ-X(+ڂ_43GǎVdUZnmQdfEHЗHkkuk#h6^\u )RQqendstream endobj 62 0 obj<>stream x10Q ]/Filter/FlateDecode/Width 289/Height 125/BitsPerComponent 4/Length 529 >>stream x]r i B/b1$MJxGI lގs;anG@K>stream x}Ti5Nָ q$x! ,HB\'=@;XU{{{?:T]]z= !0A7G  lM>4LNC<r!^<^0>c b.9 b.1y!x< 9@ l5q 9<ǢX,7 V-X!oΗ-jc3L\8y0'.. wpOuHd`<]w<DǰKPo7?׍O"4FB7BZ r NH!ۃ& QL1a pAfL9OⲆ?4 hi DyA =4BehPÁăȣ1$ %WZUנfd?#hCHDOb!#t0p`ߧ!# !#A!4xTaiH'&,O3' dcp]̞&?=0x, 7 " ^@S%682 (5pya_@ rcI3Aaa?㥿?oO;p;4O(+7jŏc7P]Af < IX^:Ca}vW7>dCgà s C̡A@`TfzAnP3o1CrXs|v\7DB #83jc  B(h@7pt?sߋb 65H}TK!&$BGM?{9 # I@C<07uCX<6a{9ޞֶ^}yֺ mVbpL.1@g]]S- ] m-M--M]m^>"j@zFm1: 4oę* 0&$9diD~:H޿s߉5}Cl mHC 6chC jG\ILz.m0 a0}xv]^g8<&snonwnv0uJ[Mv~|PLgt0X=L0=&vz]]S5>yӆ/[kZۙݝ}ށ~@Ib;ÅP%&~W+4x4r XNzFA;^ȽGbbx'G'GMrwqV Z$ހ cnbĒ ̈4>/A-br{X]uu/veY7Jng9Pp`ٽǟ]iKCǚo>r^ͭooy~ËT{㛛u:>7C#TǴ ,߾*g~5? P@3$Ȑ<_ ?ηh3n'푿s߅䑏Y;ׁ@ ŷc3R#LAxMg {Ggwvvw6~}|Ņ×fIZ蘼!ygU#iqsy[='>{Ӈo{֛+_=U:lnʄʞ=8ŗfzGXRX!QZ9|RԌD}lW| g8 |tr `TH4PN?\!؀$&iMw  ^Y A|Q!$Hxˈ`º83&w4y .慔O^b9O/iRhx~<\'+M\wD3n\}ߒpP3a@$@C H {5@œIz/%؊?ATH@v1zYΎ/ou귲ؓ1KUϙ.gp/JHBMi]jJJZsœ$o|icw[@0b@B xuۘvMoev447t6}kzc}{]cw3' z;&,B).xwȖtr]oyɼS ++.̝"|Q*N˙$''?:Ԭx]RFY ]?C=oJSO,'m&GgFzɃkj477tuL&͢dL J@0r>J߆PVd}CcRg`mm <~6Cg;휮VfS}ǧo~yGf[  K,Vj7Ʒ1j oٜnfOGgsc/O?xP^S̓n~pacO- msz Pwyq67ȣu39-||VIĕe|N5;L"óEf U?՚g\w|5Y`w56n?Zk-onz U͔/(&oͿĄUyq뗷/6t~iiuuӛY+־SD[UX_<3+ 8\ea[>lAj d& r=ÌVFǖgz^`xΚ&V7q@]A/89=7<yJߵ\}??qxXޞֺw o>wW^_,K3(spd Rޒ1n.⩾ʻ]BhV(SJq5C6S\K+MO0ϛA]YFu^?MͧMk߽kzzVS+ gơ|pހ1jL`p𣀷`6712kkhQN"Cx`厄A~V7ӷSZAڽ/Op\=i𡽱`hؑ3C͟ BH7_=7W Z+.gnFyEO~>~QW7u w.]:Q3S&]$S`wB!V("i( #SFA[4F5V(JIN*$S>E1ob8M'=X:i#)gJ=q߼o|q6?SYwցf?Tbxd˔[2 \FPW>yzvg{:II.+ r!__:K^־3}ҖϪصRnUnMG}SoGa Nkʿ80 kX\ȅ T/~{}vQմ_oDs~l|j-Ϩ]z*e祢+ ~=}Sn_?Լz/>{/;uws"zԭkT9Ǥt龙F L.0>6 ÓL2*YkXRTU +ffdJfzgx揗/_:2o6mnuKNfRQxp/wTvO}yu~knh8@ d sY=Hlh\ͧ_?ՋǏ)/p؛'m[X d"J  ymo}s~Uv5'e1a*_'Ok|Igr8 .R!0ϒ=cWuSuCI雧@hNf]muobzQ2F{ďyۉ񦤍v q vWbgҚiU^;Yq;Nݾ~ޕO}Iz%Y'cN)&fηSmQF԰޲]mB4VUv) C F;V>Ϗ`Y,Q@Dx*9vG nC* bG=JҢylYVrWX4YU}>w{<'^m]ua5C $-?חN>|aFQTP{c#=~^~jljieO 3WӈI}ˏ|x=O=w*W6f,QA0^ 6?gLmFh$1[x́jq.bF(~:p) !lu86:c۫5^?8z{bt֪qpreeIuMRJ񷗏jvzUĺGS%\*ɸZ#-bO';zYq vbR6(P-Y4L'xC5Ѫq"h(ݚ(^_0P T$&j'h+o-g)k!nȿ~G?ɢTB.];(C7^qLJV jvKUX[4676upޡFp7KWE1;vWԂ)OΝ|v/>7}iCIofֵգW=T}@$ ҧ[ƸR,vP#ljz 3=*v9vU^ܺ͛ϵ _dpY 6p)8be#XC7H~W9„C|`lB?ldIy*vJ@t&hqdet*tO2>2Ÿr~&>_2_ݲ e }tܩYNJI62&bFDrryv:Efپ&U_^-?.=^֞'O?3^V>Lxs׼_y_{v!v/4%go|݇ׯ?y-г=ǗܬH?r'd*ۨ$Y+(GS}LtRЉ_Jso=_ഷta3!D -A ;%L` (t bSv t5BlD6ޯ3}@g dHA@!pE=~^/D@z>FU#@i14@4rTN~;DNDc쿆QnU Iob!B|~#WFo>8mbtHJEI(6F4n[mmP5 ErNFvfdi6QzTQp4<1Bq|i4T{4$x{X{GqX#H](=h]0 `%,ڡ"tbEh Zڋ<ڪ eYKTP|(F:HXA|BQ4G-TP!juK\8WCݻֺ5_>jʸSQ f[cul4j'eU+Rn9t{[OxxsNM 9觉sr'x)GͨM[,4c/ݾ:#ʡ窞8E svv7Pl\_R@~AM س|*O|2KJ.9'o*_BWrj, 1KFN^nn&rqJYJ ? 2nl}!3#MpN2]=]ݭ Mk?߮=uZI-;gXZBB_UHn~ʭߎݺvS9vrGj?W-ʙ*AGSK8`9WJow@ʸu ٻo\S4sdK\XeX:丩%9*Ƹ(Ǐ tS Ջc䢠թ;oTfto7U)cMIVM)Tƕ~{ћ/Z:ZZm 9lY4 sHϠQF32m€N֒s\f-޲!QSxt~#4"1$XVozrcH3[ذS#id:aИ@F t!O_1NUCClV+Kǧo_{zĽ/=KvԨs"֟ ϶iV1øbadÒ +`ˁ&个Z讼ׅg/k/ABRFFƱ&d T {t{j:h;@iZI.* N1vrѶraҁ[4z5E   HȄKIJҗ 5Jut0vMuTUUz亩帩M2əd1(yYdP^!Sݶ*f7T:h3No=ܦlŦGV.4.o= UqLv y&.RӜ5VȻ|k }- ܵ]%*E4"k;ͽ69VV*6*Yv**N*T\C`s6-( YW?qב󕹿|p__ mu qgAZ/cR/wP_H@5$搽SH -#8*~xݦΰ0!-7W]3B+y<@H$_fb7;'Ap15̿C f;p!7,&ZɁƮ:_ęC;+"W+_fb%\IBm:Uؤ6sV@jJ:9IG =!Z Ekh*TEBRGѺ L)121Rqr,UMUIQ3 2 ciWuRSF!:l+^]tUhN# SP+4p0CPJBrzM \O\O= Ҝ4mbUA3nKST-F<)@*0GMBdR#..۝LWR)(Ȣ2h h=!Ṯeh2byERh(AW Зܥ/KO(\?L f1"Mb(VE)i+Rc bC$v[)٩3oiid{K,]scVN,aÅ w?}~Q3Hg ؃ҞT5YdS3Ru!WcF@f$%H0IԯFH!%`"cAr$ *@܀Hs5e@#kcްApĎv7%l7}@@'9؄kHjgWϟK_;#zmZ =|ʗM=f5ӎ,E+`R2 ofZFqDIvElKl ,܌z?׬da~NFjt@ QB;)(@o@`pDdtlTvuMJB`,F @NAt@3ɇ"4@0h!"~BMh+(PCPu`T[L;7l!c P+j^qava-wWiGή^ Ul&Ov5f4pNJ~^I%~Gf;^zbIx()sdI$ FZmD 1ʒ *E˅R$imӒڪ)|q4OI#wa&|N1Ro_]z/:Zw$+kAv$B`7Ph/Hp_ `,Y pfLc| 8 5`"zo~xsH zŃSdtӈD2WxGgj"^$@?yEb&  l\4 č8p\(` $օlHшCܪÄ԰iDZ~jWZ7v6v{1= &؀0POeM^fu1ؽL.y MF<@2'@>8퀟-{'\ .h 'EZcB/b/R?CSiSmNL;0ɶϪۢdxՓj-M,S(e͗f-P@`Xt*L4wj*h닄GJW$V)D3p@`ǃy")rsd݅DSٹflvs/7y/֦6 Jm@'ӈ4tqg - pP>gA,зDL9= tH#d Џ" ,! A5Ѕ4ET4һ[z{DꛚkZ[ &G^چo--<~wnCGw||K͇\)P3շM$hc݌pKcʃ, B(x#[夈X?3pʑa,U䤒b'"9롐.&"*S, f+b+bb0l!f!’b&b)n#`&Ǘd#f$f,goۚi& YKff$YK[$$d3ܔhVr-⬨)4DcC-l7PiUNMqEj*EU0^"-HZ+-&kD3Q Vت)jj%b%h.y8:p ijVG87wQµĶ!%%k o"jISvP̴v@h{\s).4[ttn#~DK$D+3d+t[dsh"(J &XHCX?B,&HIt^d\;9O%<3 3uvj+joIUi>EfEn>Ucuo7_|]S1zY=D$%B 6 /E"9 8~b r ɣCOT@W7d9P18>mǷCtJlgBz&>blzoPe6{ZA˻5/?Uym)Sg?!qI^YK~+-i^ڳٱ2Om_Q/~YN 5A jBǛ,=ӯAwcU4^?ys=^s=N 2pd A*#˷x@]x}t^wg+I9ilm閇}9˃dc!M/V9P2H ,K\;jR 87M0IKWLqP(3K[x\0xf\dDnc)p$@Bo~dIF~9^&9fyV{hŞN|&[N+O?K7Im|lFJ|D!~0e.ff%$%Q(N/^o<X&JEi(\N̍rj ^j4*}5׆щFfa|d:@GW'U%J*X4PԠpceB,㌅<4+,{% vC`%boedcڟmav-5%B$q"0|'`O2h*4&̰XC`T)&j_N^{w^?`ك˩Ǣ&ޗ`{Gwxb7ttvu{M;*a tt4wt}zCFY1oV[EI.Gvk`IEEYQNzJ5L*@ B4Q.SdUmAdQh7Cj/j/ÞJ^G}OMR?;U렷 ĝ+)fxf1̫42!0QjM M( 8]"Z+6m(DY$ZG:X1\)B4A?ޔ.QFϏ|8RvA b^+g ?&@>" g@[atw7gCz,YLxe%=ޡC(Be7.$'3Ä`Ӌ78QaN/`ǝNOo>rׯk=hyUsm-u7~hy[%ٻKN$%L2[E.VBdB!~r~4_ap@mWNVYpv.CիԎ)=6^ S L?<AOFi؁Jʎ*Kl5P 4fib ?z]zޖڮVhFomf˽M/Ѓ: 2Zm-Vh<bwmN!Eoif44~z˛ۗfg,dD}4ڠ%`L߂FqbұV* =0SH X[$7 WȉV+ٽQUA]/w~n{o_<{G*?DՃSOϟtJ׫nj/{?~ W@]_ __BO)Jk'i~XC+0]"l"U6c Ŝ鶧6ͬXW̷to VO^@ =Rfڥ̰Nn>:sMTDoj\\o $G+Ř&[kfeiyd}hM^7,GdkJ|h 48sCA(ȍ0 ˤ7A\`q!7 宴괸/ou5|w ^4F(,[,%(P]y&~xDE·Fm 2Q 8{84Z|j:'jV*z)y)Q mGScaT>g4cL3JbZf~h$Q^QU }^e>Z~:fYg{dɦ% } /BMsVKtPb%(YJULb6>Tn͵AN_A$DM,JS,F_:[2yD R;lw$x AبvF*D*G(l* ʣMڂAq`x94JE{ ɷIҗK3)u0`[+chTjcxQ+5ʽ`6phJೊ6? CvDD)ezseG˶}$nIڭސw6i;iyһ#yos)xseU=s˼pּUφ~~fn'=-hJﵑ뤘 l5h.T Sy\>^T;놉~9"CgO̟dn=_ / 4wGK][5p,@zrlUV/H\.8GyL*@_QHSJSS"1O[Wt&;7M .n? xKB>vN?A1i a(A [ ,H4"#J!O}}]6g/޼gָqiz:)F2ɺRiJ*/s`^lL..|OԪ,9D[@'Ҝael![C:R5iZ:n=*xVzֺo[Oα:|i&'ӯj^q~6+ FKpO`G|ĜPƖDt׬Fghv(mo`2¡&B(X 2gB4%#c d$DIA:(MaqU^GN9:UzڧhI==zaf]CpF#5Ri eef9qP}-DŃEH(Tt$i2 ",bDuQt9udf0k%*zIg;p]"%|~Z'$CBh'E(X?"K?m5d^GB'B'+p7ۃ)2r~OU0TifkC=9SLUϕ#)X^0N #Tv+l6PlZL QV? Ij0BCAR1_Pw?PR?|r~U"+l*0 lJoWި%U0Yg|l 5ZRK~Y,sT2U*A gj2gaFCyH^G"p5qh _.J(Hrhe ͂4QHldnn)z|ڸhPRr#aslp- B@~P⪿St"={vrE4G}nNJZXmۗ=A+G_rw:S{ S^{mmXPẀN OjH$ԀM8W@dsxC"Wa# o\ \jÔ}s4k%N%2.՞ VKW{H;'wdQ?NM;=IT˳U8=IU:^:&ojQDAb\qэbT#4C2%F).? P M Eb/f x| tɓ 1Ew#Q*@E6HMeU5PEi+Ev &)kE7KHo!!/)"FR@I{@Y]g˔;$d:C(*#45FǸ .m8;.q^$T;/|cu 4g91D0N._:@~bǮ>Z/\)ʯ`xo|kGU)c"ܮ[tNi/.≒)Qݫn4񲜩teb*4]Y!7.1QL:BwZ60]af[hD'j4c*m zT;hw8L NK5:vko0HHP3ߛ7Q{KtsŚ݅]e# xZ5S9h\L .](=Xvj+5~vM>תdy&SAyR e&K3%Jh`{y>Y쬬}TIOi>A>I>͞'ip[fwpEUCnH@37O%cQt0W` '-(=Z%}|+_R /"mگj-G-R \zV# yn``q0p/|wi]hEpfIBzq%1> <  t=y6y#rde{v,c,Vؗ ߶_#V#y8" }U+'Vm4sUV]ccOw>KܫB[W#^WM|D'ri}F8Yby;/ُŇtlm>q5gJ]]>RiЉEҙ\a:WxhK-W=zs4FkU_A_}HIWK+r 4bnR>)HqVooux_Ax,1^TB>VGmcple!ݹj♁7! 4_z;OsiWO04t="3h{"־;dZ–=l43.up/1)frIa_gd2PCs%ȰϽ*:x>EREl*T8V~*pU/Ņ,5Jnp].יO^:rv@wv[ 4,ҧm F61joqvz{<=e.xpȆܣe$[g*; 5c9=@QjsIUoDryS(J'd@8rj\B eSM'0>r,~<|辫SWf>T;~W?+/ je9yo߸J54D=;>3^w1:xd}+sJÅቢ\Yd,  M'VN,t<}hbE:r <c9BS˔[>=SbcvJEɍǥ0O%ʍvyS7G3D>y^8y]ѫR0,8NHv$W =߱\coTQ6e|Y6sVF]w枰ïz\(F{CeWh |0&\tZ:f]; tGN,$El>WpưϡE#KG)NT<:LqrUGV\&YXTM<\_ZH鋨ƭc$*]==k&>Тz-d@7 :a"(ٗ:Q"C kL'YeBJ*5!҈N, E (l|R.|2An<, (@SPJ7!-r y*.nrpu5yWvV 19I0OHA|V-@Vlo`0_s6xA}0Ovh(NrTf˴hLaņ ǪjNZ8peljeO\smO>OOΝ;EXug+ ãȊ6vy5_;_?ܯzGn_L.0ÅCž?(gpROT '!Ątz,_6/+?CM{.0.5@eL' |S%ѱXGWc7|/ɵQ=~ ud8=RưưRPoE#,1%]aIOT1' ap" (7YBOD4u6gWVPj3Y6k9=kCM%P. T*:>z"nΡ`8wvU,!M qaP5ULB'+R]m}>s E̖sUa)XgBza=?؇ }VzNôKmgrry-7ݟ([ [Ñzd̒Ӥﳘ1knd2W1Nd"aO|oϯ_jG|WN_Z?Z/ Q씯L6)YIOH e8i LĔx!R7%I_CӶ5m.~ZT^?(o)J7HMRPj$5 q}WTfJfXۧ'i |"R+?2Č  ࢊr2& L޽ˊqP|<ۉ҃dOG;b"ڧ;ivv;d kuk݆fBU#HdOcs8 D Uo5!4 Fc¾|BTB:׎T;u7&O(yv/];:owahWAd 4CN.pM|Z!BJ6xC\{gTWσ C'{ ȡuz%}Ȁ cqhԖ ɧ~ɬ}cZV<ïU 덴3$;2jL8AE'|:0I %л%Kw죯`^NR ?oGwu9F_u.p蘽;o}^?ϟZwؚ aj6%M$4X%@^+@>Z<9H @#"}MЙpgs]eޙBTE=d@I`Խ>غg։ksB\ܳ4N!j$%i jiw1&/1 ',*^YoT7@,@6L: Ö kl̪lq9jjFqJBmjM:|,MwxJrF5DW_VGWYX]J Vd?dh]%cHE 2}a6D `QldFpxC P54zkksFfhh i<"'HP^@$-̤\+]Km y|l r۾ྊW 0;$'#HOӪF˝a+GPGE+D*|HGԼHUp†?BnH"v( {B,wEUo W"d &jA TZ  eR{w:3??O{m re)PۢٗxO}KOu zu]y!ktQiԡ꾠0~@$8 gһʋXRup.((L G޴3Sȱ>VDxe&fQտ5'stGVzÇVO^|ڼ9*˷,=zETiHdB"W{\*~^889XdlCe>uK]"4v\ٔhG=!}m7!lC&ͥc*Ƿ ֟$uKv-طrᾕ fWd+ 'uwB=9\uG.W}9ѕ9}n]D/ms+qDS;ᐳ.8q~gǫ>یR@_/DLDo ?#Hvt r&/.*4Ǜrqd5;duzaNءjBC p )LeD㇗$-NrCFᕙoY;`8o6r~x9|OFkKf,=ʣ OFNwvFf*ӕيh&ٝuD]Pn|pªK..LfR4;žs 4Q,#@юw̷;F39q瑌l0WJiqWkwk+E);uEѥP}Q3jIq 6N]sY(ϐ.u>S3o">\gA}]OuУ錙P0b6rxYТ\izwIfpbϢœՋ;3%t?4*NO *BuG#b|l-#Wyn4o]:N٫*E:‰('A<ͬѡjzpǷ/?#鈋a 79SZt`KwW̔drܗΈ#w2Ca:){/@vYyQ(٭ȓ'8 ŨK?6>ՠjyQ/~Ύ4y}NT}ۊCå]XڃƭNƥ4njPK@KWWIy@;I";}ax&]ir]>:N~&SN+"ߐ]LE#+³>P{xE᱅|]]AZcUgKx=ɂ e2ab, VYPf2gWUz̑Ǯ(=`ECsN\Yx|uhϽ }hB}uQxf,ìٌkRFP5ۭvcӴͪ_Z`_+%3w2lc,"ZOzs^ٞо({'VZ21[UL02y:Ox?& S%|Ap(eޞ¹=UFfnj oZt77k0KW+jT}$0mr5IJ$Ƞ;|ҡneC9"f>tW]^ppqz"Ī|t`n;uZt(%5:%A*9nG: hQ!Xḇ5uZJjyϝ?*|\ lĨD:%ӷΝ&/<]#vty9ψ5䌽n X+FvYVNYcq4zd< .k\o0)qd~f7JjSWvUE{Aq.6͠USQlm "UKnLU(zm($z"y|QˋO4^wpQY^vc-/[\ f} //<ySW, Pj܄uOJۢ k&a&n!իkS]%1ályeWT\ZwQ>ಢC+*"y([vTf*-e|G:5TH36M {w0*uL-=>OC4a]}VU MK1'FKY=_ԭY;o?;ꋨBdk6b%@…~kwn%٘H#*S4NQq+ sڝ. $]&+mqHa5_mjџQJjM2B$f<-GYrluIaj8اjX3&qGapbS`N%N4LSHa›XpO H|'<.|W|r))!jiXb- ŏ C2IrS{ċܖGkz^|lmS虩q\1cKL0͡!lҭ$2%pִ݄~=s9 CaXaS=.gżt%n2GGE2~Y\ޯUʊBJ9Ub(֍dbF a8 ?~c3nIֈg08 ]Fl 1 fbMJƶ ְg煃 ܷtWٵ|ɿ{gοqk6WC[bY("w9o^z_/>ֱw,d I\P~b(G %G?UU3j*y"FV5 .#2Y F2@w 48&Ȯ%Ik⦎$ޑbgR疷q< ldcMm )gFJwi7(^j\ﴁ'o;Dv0lػ@v,#0Z,p#08y= v灚e ?Йp6MMq)PRP졗d̘[%n+ܲG{_Q2_!?Q冿̻Hz̫}M뗏..ֆpD/Pt# 0 C\dl'A#wA; '@KwoYãBZQmW߂RmyG>p5q sg5#qϟ@J4Z!OٵcdEz6Q:D e“ed`A(nT]d[f#{EMa}ҨׯvPb5D?SΙRqzE!ʜEc d F(=8C_IT۞r *.tUZ] 9榔=mgX0vЈ;GlAA!#Vy@%ߠW>W> !!<[zՃJ n /-'^uF3~|\lp7!\ AIGTW"G6ZPPB oC_tYijA5GU-qeG=dQUnvts4MIMGԕ"@:J$ž6ǀu\~di9b$7a(fE ArjWjyYt4OJn n 1IWBI3[/Am~]/ޱBhm;ez{Ռlcf(A1Th80i^݆;>Y9wP^8/pGNm#cjU%eb;tZUP-r拪]1@-30Hz+B൐Yܳ0g߲ƒW2Lm:8R ڕ%>$i2|:s8rEv$\M1OcȻfOA~~L^aؤ1Pk@a]5AT{GSAq!wVgm3f@.kGnl{ʷ$"vO~gH>UC4ϯ؞gݜwVw(N86,Z$ISOXi蔂}IW\x>5.ǥ"} ,2W* ِik|tUd ʗVl?a!~YxHh@% A Оb!0o .܅(qEE9 Txے#M{R#k-::ZY+ 2UbVO/ۭ ZFɤ0h<`To)I]lF/KWC8A.J'y#z(r1lcE^1'Pp6s$cg})SGDP}A1m~?;e:8f>Q ;8;u+Տ~tWa|a.q/~!܄yRAy?bޮ#/uԄ q6"HSA؀vv4ppMyeaꝅސj8mRc#,9yU6]aWiXG '=gMhHXZzbM*goBMd |^~\|ŐI'S+5&t%y 9 9BB@nt;0u~_]}má,\㖭JuBzqvU2ʂ{Su~J@u(u̔brI>E!O]#DY؇F*!} |kkzS"F$89Αq#SeQ7ˇVU\V~xOaj8N&>A0r1h&nYO\.H3M6@3f6|mܵDb68eR M&FzYBM[[m~VrWv$̃y.~#ۮw >@GZfd( KU/Mv)EZx]K3<cH nRit)b,n7Kn܂K1,qo/} ; QAOdžbf~MsQq׉1FJ\%25nuOS;[C|273MC.˥=ˢ{c1>x_%lxG3]wC e |WIdc^h]=Ow[/00r`yqEvꎘʽ^x'w\wun e6qoF >+l@ xE$b 1(նND Βy#~)hBcSD2xyfM)K[Qkn18:)lfLL-4hyVzĮE`yz⁁td0EMn&m"46dw*wUmwۭ7ؤ !!"R!M>qM(:lnL OBw~:R~͢^ov) gt\Β$ С(ΥqLxi| ӛpF&=@ ~R7d"+v\UJA2Ģ%1s8+SpZW~6p8uNYSZM_@/$2k-cMM$uHP"y;^*f*1f|Vާ%"li rBCI/ᔏEMPFGFrU*x)MD4= \ #UOv엍?8?}1Jpz }Ln"hw9` րP< O7$0YO'*א:)Ro [?/kTQ^_RUQUJ-MUGƪRcP!:]JlիkzuZ]+m4)X;y+QK*<٠bҔ x,ZwIsper_2 y3/2 : rhtT229-N5vmO^*"@d$bo&[s7 -9D.;m zL1koWʄł3* faeFy{+ ܒ4'Nl^޶0޹83h|A޼}A ܭtjylI) `;lBtD_>bz(V-[6L]pYzhMJ v-Ź(ˈuu:btZ(o#Azx ,(p<<$wN]E $L(ʕqrrʹb~fpmv29֒ypu#exO~4)dFۊ6c+2@S3X;4e9J? D,^VY|+vĭ"y r."n0?J<"FFMMIΞxN[< nv+ళMv+-,L玖 =&vj^{΃C3ԇ}zBfhRG҈>F1Lx_ϳ?1:6癒j lUXt2a(PC~SQ}yB)N^umTɯE{EɢuX[:|pp0 xΡk('K/ $^чj(vq G)$ "/ѐh*JB QQ!JPϝ&&a,ȶJ5 &t3iHVݗ  V 9>j{҉!v5FaVXBnXlX[rhf>s_7geB h+uW"[!j m$TY7Ƙ[,ufK3d#/dMnY j8w"'Te|ҽeũdh6G②Tb / )f^ w!­)k;,@.m ܦ:*ć4I,5pO+L)5bBe[/+[d'%b#>RgdvN>~ӴcߩޡyQުb'dIvן/P@I0M'QhhxJFsT8Tb,'5;"~DwpDd Ь3K!0pڃ)T]Ay484A˰Цw mCθY[+S|F"D)=%p]!n} e++]RoK; th:_Y4])&o:X &IE<ٮgZgWP[#!B 25ۤ;SݣS1-^߃ιh)ظfGnq`lb |04;H7J5k) q+"eΪjnԨd6I!).#CVM5')y'r#ӬL4~E|xqEiIx@jr(/אmk;UN&~`{rq\v8e8oU<JvrJ"ťQĽ3b `ocƤE2K/eb?_&J7o]djE%3otף^SgpE8Г uړtF2-GV˾ck6+Eo4f!򶐦=@Nj8>qZQ8eG':-A Zghtzd@"وyX!ݭRj1c@{ۓ8jλ 6n#ն%l!ozore@:.k{u}8ܚ 4Eq?LptnO75@ 0m03슁/':o" ~> 莋^mKEZDgLAM5j{֚t&^}''Z[e]՟rJo m:eY kklzzOXoj9d%iIC9"`IxPo `HoX Y}@a'xfDo)8R44#N`|:+\&0[4R:9nY ܫ?UJUv8l#HGb= :WbW=v{vd_&>_:RN4QDp˥[|yÑ1r@0՝c,ueԦj,2aeQ JDX~_zI^oѧe] j3gտj{[ϒE#+5ecH[0,1! dnd 2bU-ȭ7XPZxtŴ4fdF,Ĕ`J0G(< E @PQxn=n@j @QAOyA{A%/PpnXzK#rd8;m1g+Q۸z;pwN/u~k^8}WO\| ޚU¡_?޿F/nHAbv}(_SUJ)iq!1IYlbS>RPbt1]emu(Z~FNܠ3l7*hJ.,ӱKȹH&,Ww-w޳=:L^|[vsSXU%OZI}N&X.Q,X(H#:(ξʜ%=%y7(LDYqs“ၘAJbR*` .Hf_9dSdl.@ϖͳ$ j z"t5Ԉ&TDN&^jp8̟$[n7[jFN-ݍOނG沫G_:M(:Pb` ({?hcEf )ڲ 5̬վ?!h"FBx)Qcu<쑶d,~]!EC4rL{vv)D`*zC^.=Z}yw, BAS QTn[ܲb/'~Ͼ?}Gn{pk§M膈FtO]|/Ob߻oL /==q浝o~קO\|W_;]8x9ʉ~^b]BwLG]!ٮ^|jo?~̫#^7_:38sׯx+Xn)|y=WC>TD5"l%8&)xHd퓯?uu9% gclk>>?cy)92~iZdFXJ$B\(7 K %\c[W?r_8=x _O&GXwFXUHstj$*[2f"ztY; -r별X4uN5DMN]̣ϢyMZlanA/CAI|˂)@=ȥh@H];Fb.KUoFɳ^KX ږst5&VPJֹ!w19#ZTiYXwpA8-TolHU *iZC&`:t6+օ,Wb.|͟z~O7D{fG]8t_ᕑ3gΝyՉxqgv bd7OyUڌ= NΜ| Իg^u_p_m>"y'y_U[}>v8ռ띺"tB",%Cۖob}?~>~:{>sӇ{c7 i0vٯ=TB$ D"JrE'tX n6K:eh+o(HSKzV>\[1_pkx,]S̬OQG&Hi BC&z)fBhPsm>@T:uY "Ŧ@|Д̅HF f$[ eMj6(I o#n ٜ_.7S99cXN[~fCY eEC+<Ν? 76lRݫzQNW׼?$|ª1]~/<ӧO\0u5> Q?{g޽+y};uw$N\gW#`r=e%Ih"J՛m PDN"Yp |R@x@RLUj#~3 G>ەn)m>,7 k|[+SWd͋G^՞*]|ԅ{Ν}ՙ3L}m97}//|nr ݫC_{N>W^+o}_u]:w^_._Xg]xV̞.ٶLsJT.D0*o"$S.jFaG>7&e 8vu[Ȳɩ"b>kc[֮5Ɵs/{o&V_>̹9v;=˓g_tE%r˓SŨvW擏0V$}p>kv9ud`<9=3ma皉gID`5֘[ N) vɃ6p4jjά cdTjjfeƖZ N=_rETv@V֥T,2hsFH^gְ_xg^pD/yJs e"6^if20(:W_>p@Rh<%V t:̈́=a9f,]t~'-ߖ^{;K/I(Ճ)Ѽq.~ܫ/ֵ1޽66(ZcDNbY[Y&+ "gL(v) }H+]cnռG%HcXH}آ4k&t~fyl5O,'῔#o~Ttg=‰ط壷,)sâm=,54"dM,~rmd. 'ƻZșDcA/:@+K˔1 ;/B&&,g>H8ځǑ#`A*֨2[T^dGCxȑq <`b/4΋xFGbQWSZ Gʠ\\?fceJ=<N4*prJ V..۞÷C N\ػ|}'c2-r8I /Pƿ -_V&'M䬉]q*?E]/,JQ9נeƲzrPW+ "y9+Apxi4Qgh0-ő&m~ܼ9X mz/y緭'v{D?A&\}" GqܬZRya<2]Qʁ-Ӂy0@#gQPsw A(Q6%aUE@"Y-W8:U{:V[C!iG@G2~, P r"-(B`R @0:Q; A-- ,5eC!  +6#fq?Bds2I{|f!1a9"D膘9WV&0cA, e.*"dQ'ڃY3 WrVnS$, WoLFm1Pz9`0q I*t7S'3y-OxAs"iPhj33$B6g''Mz>}} @sD,L:NrfW@ @t¸Yy";w%64k ؂8U{ gϊi :eWP ㌿ 2{"K9ïGߖ<2j{pa ̔f) XuICu8Z9m64O5;M}C?|^^p?+0Ytm ]Ӵ | mŴ }X}:B"Zu55)',7"3,]ܗG#|jT ]$uCΓ%$re6b HPDK[Bx~JS`'"#*B]"q_w7EGUb:aNUa4%G tE<4BrP;xS hN_1vp]LHdJ=λ-ڻ#79;>]\ 1h/9')#ַ-jLDWhH C$V@fM&B?3 Q|gZoC,¶:E9h$vw 1y||DoM<kY#@2Fc;p=|1/KiPOE W<@I?*߲r_u=N?@"fq3ÿ5ԐPXW81鷷z漯8& W$D)tS86[BҪVmt/)fr-x*ty0QyyL7I;W6DEkƏ[$ip^q=u<3G,!uR% ByZ@ܣ[mA_Y>чM&c0?TSYJi}*zZ 5&ӏJѰj!;/+'@:9ڵk2bP"jBhThk_s_K_[T@ob赴H  R9!ņO ~8%*΍ȉRQD2%*S9f2fиXsmK-=W+7xuF$L6 "1XwDhb*8ݔԵFՐ XtB!cر,1Ƨ> <@@Bݛ#Z^unMaxxդ.uh:'B}-.frT_\y=9վC@ ~UJTNvハϪDQcIE9FeСh BG A#7rNʷqv7_s+ڣ/ާ3 hsK$u *.E\IQ_vd[Ž?O[ H9$ pTƪ9h(:əYw֗h cwFr[[YM̺z/s=J_ nZte͑ɱ/VՑm18u~Ty_ag.xG$ˣ+cbCBf}M*:Mz*'g +ۚ5ΜmфTKk)d;Xf}?VXcҗu&}%&_j7#6gV2RٙI#õ@אHXIk>y&r9s0(EGMmE5f$F#9h7-<_)/Ļk%ɯ:EW$}$^[,Q =Jr_\9u-@ 3#ÝO ³2#ձU1-)ፉuqAQ~vB [Jix#o+z}Ѕ{|Ԃ휶2ZO&cԢj7Yָ`ԘT4Tő 'f*A7Oꨅ ]tӌi_&h535]-_%\)M4G1zCMb?CF칁R_*!gS;׻;9;1 ;V3=)#2i-wPgg)1 gAzf-&P GU-x)_bxy/M}K,~QT qd JZ4"4 ( 41^*y>D͔*Em .7+]xɲ XIo-+y...39-SF5T (p½WY[2U%LXRC gR[=   J̜bZ-U~b:^`) ,xdۿ"vӨB z@, L {n>˲'dm`16Z/?~P:2?ַ-mdf4ס XoM\{hnE# O  5m 5T2htJpHKۼFTZqj0V1HN\yH 1L?BcO؟ex~c !u؛~ɝ8&!X("0^U}v `&,kɮ-3X#R;TO5Xkkik\~۬ko&k\ͱ?o4 >yPPt]\@\ݘhM`  >#C[(\_PbE>^-=k|u:w)zT&5[eE\70qg? &q^Pw>͡=#` 3ᢂjM` D! |^rnҩRJz.Ha 1ܲrtHe")GUb"Q L %vTcI$U+뗻ni_֣0ɹ<յ"ŭ$D>%^ۈ5ܽ7Ƭ DQSZBS㿂7(0K8Sjs!EݐN1rXV ˾̟nMh41;ӥ5Pi}i=m2l:T  FHb{ĭw`X4Zo%isRo^jSؤ7S r-Nw̘;H-Ch_˙L(t adlt(WZ?+Ǐs֍~JI;n7G 9YyZ7;'HXMUQKug RDe0˨W+l+r&>2S(.5gyʼnâ.Ml.EkD $AijSbgة0#h.ݔy;0P"a<}IH̩T{p9nl$Zï k0PQc^xy <:k|YWg`wLH)lÆN`iK"'…d;܈Ղ.^!w0*k'>L^"sa5uaM1i΍|y (sb$et@WpA<j j@!ق/#L<ȑS#.嘿r CF"ɉE*l?g'5I,3޵KӞRq @J~\|EH?)gV3yWyl9%QΩ0[Y؝k领xn^D5 O"n*|^BoG┇ (t:ӏn띘lj[4KfnbV[I3Iv}y~E69Kr6Zv3wH r“ f_?kh6i@41 Ad!L7!^Q鍡iN "1L-Lp 5 /8QH$(@bS ]w}}dUMyߕ`1*%j$xu(%ƹ؂Я z$S <38р\r!Vٗpazݐ%RDetWA`sgO|O"*6{e{-g? ς.k ]_r{Zuotݻٞlל`ۚhMd[̜xag;σ%Fؑܓҕ"/*0<^\@ e tirDάR%Si.@)vqA6ݞ v{FWFĬ bEff jf9qjJhOilxfs4͊xUQkn5Br(wqM-fE")ijn]$QT=a0dFH/sa2$6#Chh##Ԡ{CgLYɛ?ϟG+]|NjA\c]uYu1F XHiC%QrU UU,ٹ0VZB_",/?;?7W1wZ^ЉtXNP5F#זhJIpzd7D9u'ygIaŕxi,=o85/{H R=0Άя0GP@ c_|)xBP*#xFY+a`$FaX+gS53jՂ`Ũ 4$HjWȫVʪ\ʓQeUo}rxuJdNl蹘J^Xs?[Rrε~:Mr#rpHe xǁtJzrb`-V}+R)dVk<9Ց(Jw$9Q?=;)NpW$5~"rW~53oRʘUBm>;qӰn0|5 XG/ۯ<7a֏<}lܾuSJ0Tӕ1UeЃu9,<'noD CH s-[\vwV9+RIv=1]Qu6@Pvu"?ZM J; f\ '0nNTLU(s̆z̉vk7f?u^'?x;t1LFg@zރwޝsRnwJiwI->t*MޟRw{aZ+Ӧ ,).Pcu-jۧijɩ~r3k/%J]3l+6yHh[  Afiv@ڪwVI0.W7_tgzF5 51@۫Q@oXuIn=7miMoD0 {Vw$QnԆVOKJgCAޣoku1cy{YHWgD g.t_: ڀŐ%fbZUA;BvX0xpl 0<"d(q!TD `@ј+SШAqLW=ɣj'UD+ V5$E͐6]t{4qԵ_jH'<>ewɗYnwHݠyA~&ziw693{mp ]<.ka5Eppx 8ǒ.=MЖ# w J(P"ej6jrwm.zb jjgB%T$02\2=9mthGlOqG&A8mfásg/c-"塜<Y9|D q*h+LqYh!SyLh8_ -4(3XyU82LwSe)ʈ kq];0K<%onB(=p L1G,H5fG]{g`()11|^hK\zq(dpt"c#FBHy mM\" m_U `PwgmaаvЩjL'CB>`Ie&VV ]۳ƫ{7@;9kwj҃nT8e!qђ}Av{?~3Sk~BpS94Qnn;/Q n\چ=N{0ȠocSc,W0V}; _t8cH"?M\$|@`GTY pGj K)0/[RM~ tanvYyf~)xz&~9e#P sPY>20ay@F>wl^ӽ<#&H~eC? DR- cWDRd-媮5gwxn+U-iDQy G- & 5T:qVpMzZ):|0%щ{ֹ~G_5jg:u7B8hB-Up>`{W<kP ֨тa *WX0fϯ8mWXw[ fjƲfCj_=sZK~!cij*G͚7& -vpUXg7졑 D7tog]qkMvnJty6&qk U:CryDސo>*3':ͳ3OkmNFK#bpu`r^k+"D%aI某ģPmf#m;LY\bpoCV Yօ @D0Q!8؜lZn{z7Mf&4Vs*70|9ę9 գ~QpcdD4O3CL޾nхg6V$PaD:H$)Ir̝V̮ JBej+~OH" @\,)_+?OpT~@b+hܑy@.ڢp +"Xe[Fu^;;25#TM%݌懑o$۟N?\"aD <ةޫY{̣ӏu[_7h}1 8YnSGޫ}Hq:,_˄dQr0FeW}Ek ' x9q!qbZPtS}ڃjc<L\Togsy ]\l[ɈPvzAN 4KN׎55 vu=f~jϒ̯Xɬ%5Pw*ژ4W %6*!i^?@3a-s&'{Bz+R p&%qΝm[}*&V7L|CrU%!ף|Jl䌜z#4I @,\?,n#j6\J7bDs6!dѠn~2C>u&>+|-ͷ1 Xx8LBp Td9_gsCEá'k5qMPkK7& +Y9^S`CA!q?֏[_6/%RH>f֕NZz)^ƪ]%+Ie02p#BI @d;:~pg //Tvu3PC%hS %1J@jQ"*bu&(I*ŠtJSKE1ơ7=?a7˒Q-PIZ 5 5'D)12?8g3= =W NU^v~3/^o2KU6cv05!#,$*Fp|P C,~`Ȕjt]{,5('D#ԼbbN' 6yp2:'zh#4LlW8n2[49.PFm~lXtIhsFGjОn[D;>pHխAhN蒯(K|KrSR_ŶVa'v>,qhl^ؼħӠ16SN0h0TE7}_ds|?"_bw L!e#W""IO]o~ ڽg|!!i[M.l/0ccU~87b]&J֖ٱ̫5ɵ)^\+qƪ7ūoQ xu%y)5 Hk Aea.|%'<1%$RUryX=)$gmX*Jƚ Q~0_y2eY0'Gw_+:+yB<@V?eբJ" wq>uc=@4A1ahiG Κ@dx8B,zi~)>9*hQخw$2w lO[WDGk7s񻑾I˫S_6D;K'ЀB4zNx<dnuH&<$>U12M ScG!På!5 )h3TfKڦF-5@c4 ߚSc++Ec_6Xƺt@;SPCI?Pc(jK@\a8rlF7"Ԏ(HbP&&o:b9W! ?jsqqLN^hT.46t\Łmׅwϳ62/6p4ŻOQ EںFz {`yv&L4,ax%,@'uօ71t+w8(FNDP+㗆 :Aq|Y4` F98) 4G{vem٢PCMc|i C_^pޗ@U8yӈ]ڂ?vƝ+WIe ˪P;a<8FKomzm[M7_]՛,|5N) vī%yt],Lh`QRZH6ш4Xш5߼6}vlna~ӂXkm@׬IkiJ`4KNIv⇯F?%*'tCAP@kԎ T0*՜jZ{l =m˼JBE6fSʾԗ_,="mwgj^Wxsu-k"^cm)0 w]&=f-]_D2@OrPu>Eݺzwvפ'ip[l]7H|/?{@fY(&UIB laNQNI⎕u5ʫo )ꪘkۖ%L'U@i]TD\c̙HK8`8v47*Ae5 lhOeQ`os$K_VY=1(Gb3׻G:vuz`uXTLØ{0Va0}p^U4]ƭTB9mk8žvD7":;C ׷F\_3U%ƪ wjH߸`D"-G#;Iū s",%G s)` 0G dd9IRr"̤-R>zGM&S3B ?RPgX <'!;Yj`:1i?y_t5\8v_QHYa(?ׇoP~ DUAN?x-yH%KъE 5ۍ+";/\4GHkH~L2ZIĕASy1" u Ґo5j~R( &t84z7ᡋO,3W 57}a2հ2ǫGX['>.4nv݇:$1Nv YYZY8__r.o򯦾Wo ߆h&]5VҾ.o@]jY,X̩5کySe8&yUf0*#o6ج:eM bv+ЉR [}mx|MV[Jm"SֹB 8KR.5c$,؋}5ꢝW87,sϾ0O2ؤkt Q(de(5rf[ _]Z숒/"W7 U(ˍ8HDRw!5XL &r>KHJ h>| MA03~3J|TnFD[]O\cPNJEdPqҽ)^Y7"AMkצ8U9_j*TZHYZb`#q9i V%9m˕ͪ}7!]u1V6D)Zjd~2v+pj"PxkfnKJjC|\C߈G9zBh A|'WmSAݦ(8z1 $I7Da*n#,_hѦGlW=+Ơ?C^jȪBԼhlplB;CC17ٰ1qgE$x"\oFE0+y,+l tD/:ZTOǂgJ^5̽Sgh%tG \=Rcnf9״{~xl7kP[Ոp"U:8VY'.? pO|j`Ꝇ?|s`@C"iobh< -3xi>aikx[0i|^:F _6DJj+kܽ9Ӂ;][gGo'ssLY$M /Ϯ2U, c]_W-gF+V*Z׹0iy6žB̆H/B]R v*Q'0 VŊ~蝶z~6ħoRݛYK۳'cߴt&Gx7)4|s 8VWE{C3 4goUl_!( cMkJjIr}@(PT5|PV2_\?# iSe2XTPPX \# F3$ shT.|J ToYBr3͟MCOGs%DuK$ep @Z$50I"h7JY~4}XE"_F7@Oo wl58_XҀ㕞wHa;GbF?Vu!L P0*?*_y lceLX!<ʦ6Smr9Axfd@#qQ R `09zaj̣|y^y I}7+ۋMTgX$rBk` ʅ(e_CV'nʯ- ,| 4S9]pL!u-CKBĕm|gzR=9Dl HIK i{5'%֧Wf`iy cv:bX$v/^_._h.+/Xz/}lF@,P 0Y\څh9jxBqEĈd"J:.u5Η_bI8nw k廇]i25îgh)@J@-~x39m ٠̡{m@iw~zL[PjӴBhʮUOO8etOU $N)@I[@ NF3× `;\cRr %h1Jp$g~Qq+amB?6JBys m6$S8-ƗD v}YшJX} MS_S=9" ;E%s|>!h*K9PīeD+- O9$j=ydD0 Bv 8j9̫^t58C|au) Y`g+t4Scֱ{7r6J1 2Uv0D\`Q?9F!jpG^Ӏ+[x5-7/7n]wa_ǺK/o/^\Զʿiw=dbŮ=KB%RWel`A(Z;25 >hL|;64b;O.$x;TbzbуgO;9X.cg7c>m\>t%s_1NܫՃ k"۫_ӛuZ0Dk77{ [fugzZɈL󛏻ηn.ZՅ;_\o_պDwyu@j ˽l6}}{,֮*,]Q@ZGa,yc^ZBqp'Hf>2pn]S#5HڇCH C4߷]G[uWv@',LA}"Ǧj-cca1{co;ho& lR^eo@ PMn:*%PsS%kX3iZ.0RLRN~E# "|/ԍJ.$=$L|l̹W|3H HK\b=2F|Yœ'CP^@2Ƴd;:e3>P ,I)鈘{X+d22SmR(XbgK'sŪ Zb~=C#uTȾƓi`iYs.K=HQvN(l*(%DW(?~'mtiwjjz]~O"ы|DJB%EnC75p[e.~ Ck? F5;æ:1YN94DO*}4 MNivY&G^v G3͎={,:,/>ҠX5wau賑=ya`ZC +9.pqťEm a/m־=R74nX5Qh]J0}ay!LElk%*Ŭm7? ф&dx޲lz ~Wt.w~nZfrpuZ[’= 2tkϯM+djS>whT {'Ì@=rf8@5iy7)\Z |;`.hY*PK[P[ħ<ڷt!?B!94=PU0߫tZ1ζqR? 򳥑ׁ3 N-%p^ 'ܼs>|k^cal 5PA7c=wJMtOaVF-z* YcAf 7;dN! ԥ`LK*"koO- TʁyA4cCYYs K+7֧;儩"ܳB]҃iT?DCvk <ӽ]r=U kd/ūi t!dGdTK 8$md[ޖX$Ҍ{w2 $w&45hg/@4q5  Jyfulٽ_ҁq]#5INIugixG̀{ t4`<KL쑒U>_Fx.HUNxiw +xx Lo_{qmKU~+j< Bl. Q(5!y:u톔͡bVm[_}9kw^Rͧ/_$_2_)K'_*X f^K\1Y%؀-W~sϽy#53Hbh4[7lO5/b'bܙG Ϡ鿿⃆rl3VB"Xxڅgu(6VxZJ0.K,+#&^Bjͳ]ƀ3{>N\'/֞tZNqjBR8Y&!.}տ=\N4nxmh_;g7KV-d Đ2<˕А`iJL}vɮl-0{9E$jpVOHЉ46K@Vo|;.ȸI\ne S%P+-[홮".Y6\ *>er ,_ 4_m^wJv7s4EA^/\'EHka4LX/$S&& 8#uxR6X()z!&)1ۼpdDe I')5apR퟊~J9b5>FPi0(CB2;xs!0S9 Щ2ңy- 3.f:IH;ƫގ:IsZIje}~oGƦG'@}QjP3;E֙Tf*6FM?|åpDx)+$pTFR8=J#=7-V.t,^Zձܳu̍5  ˈ68{n}&jlt0ZPūbCQ%k287iXWȽzG*UV *_۶^e;z-V[ vpywj}KMk}k5U 룵j7_|4eqb揚;j0Orݳ&HVuSi\}ukoINHVd$3IE0GƫpͽV`Ycu(_G, PB_ׅ]YlK Y-Z,z r=ޥysb K]ʣceۅu>-/7_eY[ǿo Z[ch{aK Vz7\ؕ""BJ6ix+L5 2N u5f8dzvgqkX'/o^ 9P, q]T\]^Aq[|φEbi^?8̅zIZ7Ku2T!]^BȩJzw#JG>wpPSԊ ؝2J7n[%aovmc@CvƩ[ոίaoRq{2m\(e:|HH)JB$ݩ4@^C@QbO+]'Um 2C%c",ٵ,'@aejIéƃ>7j铀k1YϿR33?a] 6_uԤG=%t=Ξd帳R- AS;KG^l_&"5Ň$yb=*}ދx V&ǫg bg3遒X?>=^Ϊ#COnZ:GL df@Pٴو`8NL4en'nM_ZL]Io?ʶ>㇈3tY'at+>~*JԲT^̀*eAA1"0Gd*'C ")TR!QUFC\xHl{vFʦx9?zr(/3\|ԍ8܋vNc9irmKt nn?Ǐ w0Tsĉ6jrROMv´jncu]Bm}?W$p}ɅH_&`*5P,N`5S_YbҋH;_G>5]꩷\V # +\ɣTF>qB$R!L)󆿴 0}VζЇ7.0p9TwYeS|4=m\=2s]+!Ao p: TnR[vG{Søȥtk󎀁:j>VY]XдZѺ^ {EE= pa2_VnSS8~RŮ9DRa־ڴpqwBE-B[ _o\ձx5M+%MEU 9NNrOb+w[ :DޞZ2cfrU=!k>?C>?s 7eDvΞ-S](x$ ^)XmvU"fLZ!*|0 ف!]Tj?mm+Z6DyUW;Ww]Vx8@OR2|h  ׈ T=j=|ґ&Du|3gcFPl 5/ЀR /J)ҵnke"كC /Nan#6?L]sK2uSkBH> jCM0E}tVwfVZmp*q@GQVsWSֶ {-@PSK@'@g˖96/UC}co[sj߶>5k.HH:\Tl!f!vF$X:XM! 3Hnnx/]A3}HxzؗRqAd~]?=55SEVK9gTEBj kS6RlcO[ [M.j\İTIgQ)9s 4{&BP۷x'y%;]?#Z+'㜎yއ".J ~ nr,TbX S?ٟ'-}/V?J /fD7hA#Nm0B8=M1!R܈sHcI(,/zkq3k:;b1!ǨGug N_Ĺ?mOWs^&Bc X\=`LF@%18kE.<>{+m 8r@5#YHMCXᘋhoG9)XyZqu4p:U;Cd˕<*=q^ɥ&]ƪǟ}l~p?>:6=j3Ws^|+j,R4TqcA 1`4O~u]h//::45( A.8ڐ!pd CX) *rVb !|DRUYY>XwqOQ_=טcJTg7 >4M6O7 h،pWf?ؠ `rl9[.v?}ؿB$jh;. >e?*!(jQ68@'Gnvٞsd!3I+ vvNQD Ujn" ?_']){郮C>Ιٽ;cˉkSMbň."m0+}Z>%e O;؀ z9i d,%XW[?Ww fMMG+F1ğxf΀ω7^@l@A˙j *NgׂlPW'ɛĕWMWi™jFPߖy!%F/WWgpB[n@yxp3@ 9D%Bx;x, mIx?y'1q(̌99@o5xι,r"6ʦ'/OՍO\P"RJ17~k4j,uVe}YFϔ 3\8+y6#@,6b0~?G0ɶeRFݕ?zwDT׆=s"Q˙9ZiFbCvoTd zfQDNd.e ʨdmҠsf;1GBLg ' MJS+'_+,J >k绔y(6*:ۿdpL92z hӾFQM0ffy烢[Q*x߃Wǩkk+r|]{$~ž}\9b9fO81RQAg=s=mS)g39Q$q.Ԏt]*%6q/,4xf4>]sdwaO1a}_֎}\2Bn| E _$n 7 soǤos}DbQoek tuOwZ,]V;/!^#:v{R7?\:4)#:vZ 00ecuO q FaB^U:fYHb` 'h%YM`7I8ܻ3V9P p|q:uJ.|Ȳ<äwek^.YzU=Oapq殏.M:꼅X-zѧ{rrوyv|tvz zgAAL=_ 69G?|#&a%YIppʒ]TɕrpXggSEI]D}_V>5]$OOs=tȚ}Xac?\:2.kmXG2p~at Ͳ:&Ȩ|0n:b3W3mHkhBC4iHDe\"MDvI^9f\r.=>9|e15z̅DdY` D+~l{ǸEI8Hqbf"n|AmZ,ipl( D^`: [z硓\̑'׆z[:C̃xfj巺։MNC+ͧ|a<:mݣ#3/̷zQj`MFG סAbxQ-]U.^a1~6(_-]83?֗3N&8kj4G16R]$'KMtr8<)> [mn"zsč$R.сƁ:>Vn7b7b0JYsm`Gq;8³t12KE9ͱ,lpp!$/3]u*e.i*A7RʉU|9zA1=cJ` I)WBCo7WG8ՁN4zL˃=5ՠ%hir4d99>,a`玂bbQ bft뀶a79 8L`M5ϛs\ى"j nMrL. xq. ;ls$ퟋ[|q ,Nu*ˡ<+#H柔3?6uj՘MPjzK:)ʟ@`Y,]*cAn`6'p bj,SP P 6'83bN\?ҝx ~0OIx5ϕ*rg(aŲh,z~:˦b^S1mmsCsx C+ؒ` Lܱ>z=7J xVVsJ+u:Z;{(`at=D Vڊ%y@n7Q$Vz{kAEi| ҈}$GTODꈼ/(0tA懥[as,Oݵm(5cCXÇE6@&Nַ{(?*.9uSEmScɐҒ6| nO;i%B0[e:{C(wFoi#`7T|2z䀻57ao$|Cg(RP @wK ar=BAscz}s嬿(rbq$JD) iB N9'XR).i"T?Lv'Y4w*OڼW?s-32mK Dc?O]0RSfvzRӗ?:YXu7˷Z,BRvSa06'xOQ5P`UalBGf. 11 ?# P"bM0f[`Y1G^7wt ^2܉JFCӍ3Xnn$5?.C4ĿR5S$,f] 8g*hi &H}Hհݘ@⤴8\>;ܮ};F͗怚&dvǟnYDT^ 9A_s711CAo3Hͳ =`mj z7|9.T(4%0>fJT$^?'c`^$ IqyN R.@"̉Pд/KpĹ^̣3i1ɛKW4H8}/C]fštZڭw>oؓ;EpD`$JIRlEixx\.ǰ֌[,܆8%MOe)BY23oΜ "z!S*J泰pJw'¤B)ݭݷGebaq͑BB"StD"_\GZkδ -LQy12%!‘0uE 4ۙ_#KQ㥬:VzU4< :|y(N KM!EpgX)`(0;37"L2c\b)s~fC7Aa A03O~ؘR \z,Kʰg Y6(P<٢qA|yM-e`1Fx6FzՅiPdPaq:Ʋҩ5^;=ÒshOg7GM-q*&+&KcuMM7BaKk5͇L(,]P)6e+t$yNT\wB<LI՗*vwysSOH|62 7F0bn>]$R;Zb|d)yh*)lN\n/ч $M3v>$Z9TѴ@W: yBȩP+s`r^+_ODVjH}$d| /bwWMwq^$Np(5d‹R3@%J1L f${%~yjsF{AC&/&ov#͑.^LbԜx C;æ[ qLH73qz^#`?my!Pus&AnlgD9r`cHv,/Y!8RIhFϲk4dFC҇`@EZ^YY^PPNnўX%δSZ! qtUuqe# %9>r([$?N1}e;q ]B%3_NʑPIn&x[~eщB6":_/ >!H "֞͝1vX0IpE"@/et#{؝6pc\{ŀH  B:#| ]zyM,B9_NtҖ8iC{z#S@ ngv nx Wh-+άy9B:UZѨ#Ku;ATE <)VWN8vyJqWƳymnE,=}Cj#$w\g;2]̮TI)""SIM_6Hz$}5ATb>R؆/ `MN7nw?3]j!#Jͤu޿;|Qyկo4V_U^Qs,8 L9T-x.&$2DHu!!~b#6Hu(sY$8)'O)8!߯Ee\<`r{f12L d,8CMs޵p.z 6} !!@pwBu]uu/! B}˙ٙKm]KO}>Wj!y}$ H 54\g`ţʱZl!oQ+;)GH6nbelR^i)u_Р \?$h BW~h(Tg妻ߕ&.(-A3D!UÕ? C! rۡFdv%ag 㾣TR3:T3 v:槼!gJֻ{Fbo"Iz/w]`׳jh@`FdCQnNrA?: )W~=BKGh5*|,!9=BoݶfkMiЗ5l{bpW&)`. ~Վԥ-ؤ "?t;L׺rrJS]/%v/ jݶ0ۮxPߩ)ȵ#̫3bvDvLJu'vƅ4G54Ex`YlU³*b1mt6ףjN-qFңtɇ DןN/&g}QWVzkL]sZ~K*3㬯}9;f:~°5% va"×z!``![}ƌ `! .욑{ sM>~RwWJERgOwW"8t\(:7۵_ܾxhR) 3jC$JbN51|wAG락O<@`.=qc^0NJA?A c5uvC^@@㪛!u yqs4^1ir/v4 Z$Rx"q,PqR(5J 'tF8{`i)GquT.{ ]F~\ڵҥ+ɩ5ѱc ҚkBaTfgUtaw9ٯiHn%0PADH`(Zƴ0kS1=р SVP4FfzE'GfmN,nf7;S`;SF\F!@.:):4 &(l^e橧6iAr9*v߻up=mzh֣C .f1.B]{  4)o?K (klOvBW^]>n$jzY79vD:#=]\[];~c=Z!)  TBUh*PP^@ ^B!˴k3a h**]➷9kv_Y0r{r"؆$LxPVq`ׅxGHzw"8Č aQ+i/\:Zr)5ʚx!>M^ EAi p4B<ý##}p5xՆEp}9Su:a-]CCMY!|\ZiUA(/P-iT |hcjHnŁ\9>gc )0os]3a/XgPٶ&o#!+JWz]GDKqoǮd׮$^[[sAZvkyx`Ɂ1lrkO¢(m]jWE%xBAdC47e31'cGJCK|Gf++p0z[zjTwnKcK (FZ_0]0تè/"AlT Bj,p6 .RJ?{8sgZd~@6p(BR%fLʗIJ'(5BO:2ƽSyKܩ3ObVK !9H1g"c,:ɌZlAP#Ч4J0YR`S k*ͩTv ĸOG6A{%{ԤxDnyӶn}%J`{Yx3F>́@[9x=!TNw7@DyOcLX 0[Ge CQyJͤApQ=~S6~(םgew<ҧD֧/ׯ*YˍԆ(^JBR3JPԐa!Wr0NU {lcO/o<@JҰӀ" _3X:iv45Q=I]Hl8 fS5dē;ѿ,إ(Խ$.pF鑕n?}XVV1؎g ]͕~+mOG뭳Rm3j!Z#1y=gv^ CECB]n?sDV99> Z/Eaw@X"S#J )^e}hU-'o.;gr*/}x)J-(|֫}qy[; _{bԏx0 VU]]הx1>b\H~3ϖpRn vn u kvipDXb αh6X[yvzIp-3 4C*T+kagNJ& Ǝ  fIZ5:#WJdw|ۚ*<io82N XHDk " VvEA@l,%ZZa5 rN2e1]#"9͗ގw8oOԽU*ĝ#QAW 9'j;ꑷzğU~wr ATɮǟɟ4xʢ EW2۠"^Eh!< YmDkF:Dkh{|@CELUm`ì0 !v6WscD=Ǯ+yCE[m VYSi}]<>ԩnF)oX pqL时cBV?~{Vv]M,,+Ȩa㤕nKeAxf\zis1#uLQ yF#M @0R Q]9p?珋Te %y/K_10T1uHSV;^(|rQu[=_OK4ac*Aƒ~< m(U]O#f`7muOXtZᬷ1|]ZbP{[ L@.v;Bw7ˬ/)œ?#ߧw%|B<],/pw>⌅6zZWWx\pY>8"y8!v@3< T ?`-"M6YgXZ@mu{ӳt{\9?rqsXBM tƨc EJiٸ\>*(.ru{X5bCz DRZx X8^Oo ;x].ulkx9y:y6:9 oP1XQ~"JzIXFv"@ -`^"1#omr"8TTɏ SOzG>t4T.S7(#9@_,> `;ɑg@sE)m,!Hk2/; fj&S,(:SRU?ox6]UPO4JS=8k lw̽/(HmWW*5Ҳ=M_'4v:H[ ް[H;QbAtHUF8_?'j@tnD΀(G[/{m>k~^琫nf;6YLG @r?~d]Ԍ`o owD-3kA]F2$4f~hyسc %o6(RO. )'&T.nL=g]3u,hGYL,L sm3 7QT\λc)T6{d3~HU?^<4Q&'@}ITd7M{bubJޒҸ:/sBL i:T6pp<${J=>dut5@dp m>d̉:ge?jU̎bbz7T0魍tW8\AUl禍TAB!E&(5UM"X#8fͦzTo Q$!\ЄU^<ś>?dž1P7cRt+T؏\ܣF dk}Y,< /KZ;AblMrŤ5D[;s'*|vJs*Ɛrϛ͇"i ŵQ=d|N$vujWƢγKw P.;{|hzZ&܇Jp7⻙U:dyhbzNg9"H0o1 wҴ"i55 W9jLK3Br jN-f)Ȼ@1;.!~BK q1^F]scO~}S(HAW R'f oZҶt?6-uo`zgmh{jtak!)2xaՎ[4"#Q8&4A ? ,M4˦\Nk3ӛts.I!fq pv* `qcrc½6'琝>=xp==NҲitV!619Mɉ6lg k8Crnɥg?4 y3;&k%X%e-RE tP\S4+@+׉g!r1+-u0*s1g%\jwsK ˹fNFjv-Z׸[pڕ9e|n~ӥv-ő!D@8иa ;6ʭ u ] P] E!|8^0"Zo/Vhft0@Ă U^[eۘD!=hd }X%xZY&K=\>鹨x8SSp\7ϳ@ *t?߽Zp679.%ֆ ]%$ZׄӫȎ&: Bٹt/sP\q2u͇:-tRZ(ݵ:ifx݋//F0J2oE Mڗ*G~f|;ƥ_#$^V -~%ߟugŲ6Ö3g%0RqU4Ba^iWmgTdwvf@ tb96PB?`xdϮ\Wuk*6>"7 CU:49&f~FBI*0mcݖއCm8ҋ)W]vӑwܻk^NӉZ14jtcZP旗9\ZnO2Zdqi g kQBd ? [{mS!hev>ݸqί`fO 9NcdR'ښ┶7wOsL,Qa4w0>@Xo `a fPj?/ͭ#;1ꪔm3'?B3sbx\Asuh yt'ɉs<0n@뗪Rtio嘕/\{.LV3 ~6oFus00W=[93\TI;pQAI_Cemϥ=ʷq*] sRsjqn6=(fK!iw3(9 Rky])H$yG$r^nKy'0MaH ay\|IsSh( )d:ODpVվ}Mc`nw.CX7}K\[bصfpFSQ'G[wx la`8'/&YÍ-wCgŲA 2[}ՎΆ.&X]65V5K~g{uR8Y\˞'gZށuDlk"QE#ԅ$rw$\]:凕ԀHǍNB9T4J5:Kɉ>_?OTOH |µ DTD "ړ.]Iat-2Ҳ3Ťf Jq#̛ڳ? I{_1Rj&gM/SY)q>&dTD,jK0Xw檍o<r[00B0]I@ŢRHx7o ;5{~hZҜնz< L/$DQMe$ηစm>e|Rcw fz ÕfuLPqvXjQqT~\-b̨b;j9f?bKބYqqaIi3x YTU몁{(5u"S"3l#;K ,&CSeiz47;/7v$ط;4 YtlcEA'Ԡ5ݍ>~J;H¤{j%pT`ofriuÔe,l Q3a̴ f(t7] Z`8,GTj=$]m~OC݀ 8 oʎfS (RqzZVl{v%z L.hPRD!TUkoieGa6kBo߃.|9 VB G2[JR' [@,5<sa6z3LಓƆZeCXq d{jgU`ѹk?=ev57ы\<֑"A9'Γ^^ȑ>&LAm=̯/6i|9޼3LWLB`__]]i^{Cs}C0oV![@S/@!Rhk>#x)tAth֎Zg/pfk8Z[?H7;>N$ 5xA/ׄJ1~%o[ .F;:'Mj!B6Y28Pm$!h{A;ݽڈVpҜtιd |ʃ&X/[is}5jf7V.7b[FߣFjʏ?V0&D&k"(!'c EJM9p8rX@ 歈mFPKwp]ルgM\!AFs" `]>UApfZ!BUEI K~ލHp=`kّ;_q}VcS=;I̎_b$T) S{̭%tqӟFK##VI< _Vl Ҏ"NH h͇xS@$ςrFE(5m?8~ģUnJNVגmZcu1&I̦dfUiS=2ړ!Z,opV ,2ރeiczzi{th0>̷AK7G>p-:ڑ4?2'/2. /53_j R{vR\&~_3 %jo^۸+^u^,vCk~}icZ80/gHȸbɜk+mo~}KW9UnRe< @ȭD"u5fHU+a`.~.u@&Tϙe_όuBj wGZNPҴhNlhZ(RPLYZoW"blpl{E1Z:oB_ tGBlj/O-|uΡmґw"jBzU1-(wuiQ]a[e_F)Һ/suu^ulZt}]iSҋ?x?Z~;'uF2kYpY0Y@ 4"R;)jXmKO$Dj3JLs7ߔm{ɛW@Yrրԃ-xև}%Ɔ- ]ڗڗEBDhX^šq~$Zw1 SQԚƾ%Um{FUS>M*,#M0<F9 >dƕm2ЬiRqc6ڄ)57#Ă01oAes8dM&B[QyI6T#r"怬}1߻tuCZ$Z5Id=3SyceXR?,/A=+;|RR?L* &,dzDWv /ePSSipHt}VjQfp5]00Yˀ/6P` :nƙ BNRbNAEyY&&--V^ZT0!EKqSbb_CP>6ӓʑxO|¢KΦvnXuT$@\pP;A]m=;k7 ?N6dL~nؙnևM{1  N +_}+"g 翕Rm4ftyrZW+}Cr?@&TҀj'Z&FK׵%)N%QM cz~-Ma7z]^ܱЦ1'QǼ69Rԙ?~X&yܥRu`LsC%J MHy> /vtN:@bCUE@ȷiKCe2FHߤY.>l=3<*{pύK37rD4:7%QgkaSS2m&reoʤfM{Vί=)w|W.8XfDHr<M]byZՀ cGͫbr%9-@GP}ةagX sέv}R`RhzcYk5K 70 7|=dL`D'bN;g3NeRYKe6 E,z8LZyE L{+C-%&PaPx!ɵg粂Uq|oka{=Åp4DH=;4|%kGQ~iPA3S)j397ȬZXv }dW3'彃ӡNT:"1罠02Y*]'*HXT0AD< pIUF}hJ q T@DL،emG0N?nYZ`{!С$б,ع&Ƴ:;=w]~z*%Hc'ava8`#U az4xV'0hf`苫(p-۶Pf{r׀ p#BT\,`՞1@xeqOS˨r'ڃrj/ ^HI!$_I v../ 9tdw.35>]%~y֯HJ3;39RF& f('ƧDG_k;Oٚ=٦G &uC~PABQLʹ 52u{]WRjVvٵ^P^(˫!7SO]?V]9FCM$RYή{k{c'79ማ.&Z3UZ;r,Vh1I4̱W?k]/hB!7jATbahpu``Rog@n9dGFsдݹ~0Ю.ߕse &\1(v* |MN&L]7^ 6m.$N!0\^Aj^\PodS!o5JRL!p44{Ph58JE^B/QK+^M-6ݢcT2cކaN'f˨-pł9NC 0c8e=dgoh:D,"S$b& xD#r+MvdàrPR^@-'~>v4pPRhJ <D5\kQR*p9Ϟ HF5]DvRwґhlT>X7PAIzd+`w!f%_q0\MـҌ>'1GOp^rO|d5OeӭpwU <) x+l|QoWu.J(.]@' FFjm&w~Њ4J"(#¹YxHj"|:8IB)ov-WJˤA>dh)Ub2`\ٍxmƀ(ڮPF'9'yuMq/7W]_qmwK8({\ws?tBoy)~~v5x8*Tsfc1DgO~z*ZB73YI噝Π`P1jR:ԟ_5e f%8ƈ -Ӱ_\e\g#ݻnroj::78@Q'4HJ_Pp38*u2=aK8?cu2h/Vx&:e~S<=МgX=`}ԇ]jA geK&EGoJbÚRqn2~4knr?4K bhm_WGr]s̳hYEYbÌ0xyI22ڪ*ԪUn$m >Q} " ds1aLKL<mV&'3*KZQQ[ _5K 5q7c3],Vbxץ-!ف9IjGOeАNb?KKXޖH?2 1U[i\kVoSo:Se^iY,*-qʎeFkB܅u Vv8[vbYٲN1Nؚs r9s>t7vT?.S$Gi+"$p)$e6SR /P)8h2QWE3H,j;~MCܵˬD[|׸.mڑzeOmuI) go$Y B 9wXIG2,W-poq`֖|d 8; zao}O7anhn^+![F)Z ,YMg}{_KT*%ANY [`L ՓoMm~2&P-ޏ0\t>C}M(p8/5x&uk釨"}Ӽ 2ܵLs]2h c'9˃5Iǃ/- w ?0gcŘE 7n04:!8!hC]漢z>>+w qwwO@)$.@p)m:Ԩ BHB܅:ssg%99g_o8 # TBxY~l$6 mÝ0xHq SZ&^-^.+rzSCFש r*7jZ#t*:cXwXtvo;ܾױ{c2UÍkt QL&-VASu,.)ח!J"i2rI7̳]SSQgTyR!\eEq`&b"~"v|R./GNýloy5  @0sczzs}Rk:#K#4r4 Ma:LT9![~*F# ֭g%-N@aQQ%刺V, sp3WHRƥ5r{] ȻAJmF7SKlStM$>$Ȟ$Ɲ$U/Rݟn t!0 7y6v/dRv] Ԭ](Htnfߊ㏛".NJ;x`m{A'Eآs,_ ~, !c`翗>Ξ^ȟ\NY, mWj7u.̟-UnKPo#tK岿 G&=1[Up~lb5-0~0=۬!?XZkFԚ>櫊d3SbMG'`G ۧeRC ] |x yvxF5m@ً+uȄj) _WǙvAP5I@8{a/ sRu^$^9!.0N6tp|9I69=*0ޣ,_Uy$>Awٳ"lz , +ZI9_f%C !P9tم:0#6$*$N0XY.B{4h`NlT%F1aZCA0@}麈kvn0ir (|8 > Em cl  򧕤vvq!ś( Ӄ;JRʅ?PS}@m勧''_.//-5hiռb0Cqp 8<w̻vYR*l0%u`975kxx5yԹ8Ժ7ϷTpųUQ Q&Hujt v2N* 2V`3^},4.-lԣ#vhxћ ď^~ IK4|܉*@g],.Wy ͹#F\APEwD ~S!ꬖSQ 3$EGG.\oX#+V}{o=Mw˃ǃ8]նkHb۽C-:~z݁Junڕ:tK,k /r'{Z t 6+>g.ED[zFSg f _=O.؀BMK"t[BYߓF\G.J)ϙ . yq%$TsC?ȵ(-\C>'rNɑ2ǁxjugOJ^w0?Te! 9'IZC14b4 "& ޴hECCYbct {Tn @N|AcYX7nq^l.sN+퉡_!}OވWnKpvSUs`k8d-f{!Acn-IZ;27аDcᔋe 6 [x>3_w/k#(>+jU0x~NM$]O&g 6=ޣ9cdcZbtDϘ3k,lr-modߪVFkaMM7}~/}ļ4d%#o-Nv&G8EBq mdA 6;.(I&!"_ -LWc]7t›WU{`;h@/#1R9Jc5 TCz]2I'(y 'Ar&HɒP-MT4) {YWyՂX!W(a.fnphzz}=Fm5QYflTIIgx2[rJG3V^ 5an.^gzmH2׸$~ؔ瘥HNU4΢ĊX KhmK&UK87WͿgeY|ѹ Rs1 ?y1 >fWDzc܋ʹeK㥯W[ /iob&XמTDW\Z!N=/ञqQtNl.IC>EZV z鮦Gy-hR3f ʼnd3`rE8]|틗yp@} mݏT; j}4F[u[4tD[{`{[eTk^c\kSn/ /JGB+Z"VoXwఓt:n/6@X(mio4\,` pYXKU**U5@/h[d%.s<Ͼ@،yW{#*^AkzCn$)L90glkp(wtUp+w U R,u)t.sn t*+t+;`'A߿zvewE3鯡-Qԋfan?ny>P$ڤ, AXU.wqvc.I\ؼލ39Q[|Y6G3}릓;ٗ${4 mԋb@s~`x]YqHo펷+53CUb5+bu^EvJgM`.@,X"\:Ry"E%V*Xh(^ryg I?b7TtYEa^dFA`:z'ķ[^~UL7~y{//ۋ˥ UL*/ Xj2C"#J ::',qCpo!j #RSYi:5^fg.wٟ>Ț~R염󩐖eDl~mhqǂDóA \[<& F"ج.T:uﮈ\%Z,c[$U\-W^\&P%\-V!Z[]E"Ne@aJ7I%-~|;v*FiB4@7*4W lC)4x.ffo0/o!i E\|I$وt[4;K[E rٌ*͏canjN}Pi|Iۭ RI"=W9R  /?Hl-(1sw-dHkG gZ3J'O>-vOl+tnmBrwYM}U6L .C R%U!X ~gMrJ\:-K?(FJ`0Vfr 4-V6[IAGa)F|'O(qr.T{ qaS|:OgE:$˄O]a=ӓԼ#ٙzpH$yvi7,譂:}^NiaLrI++߉:q9qA3#u%]rA L8OY=By8^BmAa1FmI9!K;Rx "X ٷϋIeIV=)pX8.<%mGHV76f_|>p6&fk9 ! R&Nvm~mJ ́rx#ȷɷ+tF)ĩ $nӼM?Q?^/AcU{cկlڡ?U{0Q{h8(D/_~ʟYE͟{UjqSz~UA'PEr]ƞauL;cih]j`> E5}-ĴIF:\~{.{iRpߋO_O56nc7h'cs7z\wM2Trׂe^[\gTSt\GjOfWr{\WLo@*@ʕxa,7E(UEj+k+j=I4zY߬| '0_;r>@u!q#Pc,ۃO;>f{Dq{/+tQN$sMDaO]e)Yo's;ʢ?D[%1[N_`om0Oﻟ4p\aMo1ݾ36[3ZlKOirahd3"56uNJMZ0)nrRh0qO[[WG]V]f8A}z]Ru΢9&UWG1C_:HOn]wЬ$N=Y IG墕x);Yy/R.K- ;g"|xP/b(TxaD}%ڃt tؐaDLHɵ"6$ߎ9SH?:c)p E$ϖ۳;sR[*"&A-L!|[jo@WyuwNzɢ9-G)/WW9]8ʼ lJr%kȋ9* 8`*A0$1aDӥV4^/aG˖b@ %$ S^)]]O˪_ۧ̿}hBF˙1h ?I QJ$C~k(5-~I67PoOoݛ<{'#d#N8[[bFkWvb5ϫs%{IdrisjpY]4ge{"\,m(ϡBJ{) `wkt?,y.MPqQQ&I5I!op%O)[.d"7aٰ]EcsRv5gcEt}RdőaqR ݸErPmW_V8+|̉=7L&;P*G:M9r^ ;C;9O3< hnW-_lOu)w(c+%*w WF+R'ȎZ-Ďo!E$ςْFO?FOs|# 4 yR 4' 4v_|3[2f{;)^߼w~ *=v̲d/—oauɐ ND2pvҌ=9oA;w;b#X/hF_C[LEL7'r'xe!'ueDCeDa.KdMjI%+zXRsRe r* Vk 4W?1LT q di4|n䐫LﺓGՉNt_@lM`2tb>:mq#(5t7% _7>bAw]_o~?GA ,E\m$%ixs6&)$Ŏ=ŕ3͋$R(UKI+I%3a5 Hib y!ƙU.쎗ZixLIX'ܐX .1f/0,ShɞkžK.ӗ=j w:hZXe(gIR$ \ %9fDkj>L.c6ěQ#D1Ӎ%)0z/A][VDl [RŠ"sRaC=;-׃;*ӔZ(B ǐ@69؏a D$=;9F*tK{RiJ$&JRKlL=c6Ȳʲɰ,//\V H|ʼn1Ym OLORR 2LݔG` 4Zz,f6Vf&_޺]^6n^2U" aрgtXh5e=e;zÕokڮu{jwoI\-~#Fzĕp&WVG'op_xP{]c6p%ކ_&d< j}5J ,5 `;AHYw,/+ x5LO]ʦm*tZCz"µZԫ䊝% $K\uLTӬr|9rjxTqBS< 6hu( I |` TY{E!EM@iĵq*X%~anlrx>j+Xr5R]\ eqwNXS'@YM77n68AGWC˰+w˺O7N}eV7lg&8ߊ/Ő+OD(d9U Ҥ„TXctdչqu՟?]{>ⷽe]31?_o;rrȘ]q=XXZ ;4Kɷ*4HT8~H1CSB 39m2/np؞x ؒNUM^"ׂ7ךЖ#6D$πJu88r4H PY%ν2,( @c늍)8 ྂ 3Wm"7"xY}~+|~|}|>}Hf][i/\ U(M6L-N:"sSS4yD5e HkʗuzUHC] R(WlĂոIS'P/XG̉)9guZ=|ѭQ d(LM; Fiebjqzzeym'HG;jf 3իũ߿-.Ѧvӂh,I#T%5d>Kd-\%Vlօуœœ݇tx._V?G``N}hA@@JMr" 0"~Af%^%K)z/t0}5,wE.^i5Rٱz@^ĄԠC R)d7!`nBrǫZ:`ûQA;/sgϑFL M8mIitaoŤa(p/HA Lm۪LU<-'Fus;Tb7Lw~4 uxJ*]V,e+v)rɵdH㐙T}=V w_ _-OJ WWH_-O5hdh-=og [%)5%&5F<ՆFFn8}@(V>QR,*&He~M@|`@>Zm||D l>/"Ra*ajaAݾ H!it×dȕ͞ *Eب Ӱ[ XȺ!:g5i: TE$%5t3NZJ(X9nvpGcip:%G$HEm~7|4ld|(fsbzl,a0@1ʫOg菾[o&Y\ Tl ShS V RT PT RB EH1rd$M/u=Zf,E&JM<2eCD"$oߊQIϽx&wkB9L?f%Qϑ}Uft/Rd[NɁD٫ ԯūE˶Hw)GhD &li:䦄 gk'bSԉq3P`)ZMgF fo_szns; 2SWj~X^;qW#Ćb+߉S u{qBw$^ rs3^?A.V夛R?(6D fr0(EJ,:#=h޶1ܼNlUnir اmpR!5|/ :Wy5W499;U!.+R/ ^.7g%.ݼ,fڄLoVO;:G U*s3\q%>L)|;Zn8qcG݋Vw-֠:H 6!Zdn-^9\>5^zG;%5);Zvh$-lz4A7R#H_S`f_P$[MۮݻS3x_jj;)%;!%Ti_qGy[z( pKt޿`4E)bǕG?-~/Q^xbD\ Cz(J77qwhߊU+#ZFH٫aR!@&{{`~?aZ(GrHqdv &Ck-[ZܽD{b;NSU l3(Sc^FMML.ҦĒ~DPYiج<ŧ7>߽mKoZX;H+X `I:Rhkg%mjߵhTB"CEFH%‰Tz7^ 5B:P3៳`@ Rnՠ̎`ֱ- %D6Ɂ#壯r`xRyɝ3'V"5ΉUQUS**\i/Xh/$q^,H؁ to*ZA" dtRc7t5(5+z-3UYvPf2/kwkp%><>hih1|7ℯŊ F t^ES.Qmpz UB1m$۔b8D(]ϯkXڱ ]frFOO}^Z%]+\) f'r\;.ȯ7;pF!fMl:"NB2^k' XSYЊ駥ϊV~ȯLROs>ƞёӋË͋N&:W߈s3^J@__O gpxgz'aw 2N \Z6T?#ŧ:Ub[[lxm81e;r^;bgάj7хɕ.)pocSYq"8y.O__[]EMK[›ڗ!@```pNDeJgEhu;PjfƠb>vwH$q.l9$ۜ›.PƦ)n5@"L8nxI8K,R3WɌ5zWVHVo( brvrzqzy y 5yջ׸V;85p68knqǞك.Af/Iv,7Q6,)N7PAqcpzԃ>[3ꢔ9&_^Gôu煋ܱGqZh'*f]q%{|/3Q6wkGoYdַF_9?:eoNvzI^jPzji?n%?*iAA+''&̋ʶdi$-O^[X|UEֳg9S{ Cfy58(?cj!i:Crd:4ox.=ܤ!aPhmБhkDJ:}{hr+l>}Y#kVNkoĊߊ.x#L`(BBqb$0ࣃ#ذhdplsnWbQcQo%#!\kUe^]Y f-)w&5՞(82$P̏笝B>{?eE2@3TJ_RP^L5gr[.4mFGwW?Tt3#D#vAh;$Rvԃ{-R2q)"B E_ B#~=Jp t`~;Aj⻽9|خx49.ln1lR]k{9>0E["|a;̬.t`{G>ƌ33(5}WD<Ʃ܍չck棚EtWˆߖ.veumK KBl>@3Qp6KM%fٶ 絟p.eI{\fc8ip-T/XlH L *` W%| g<\0[r#|:@13ϑrŒ5l.orSyLtG'm;dٻp'u?|QG[e==o!Gw'wG)n_ AVk:}1}qZ=Q]J}7v^Iܦ4+ĒZk"# | UA'$珲!AZoA֛ƕ\͛owwTz";8wbs(N䇻ہ\K܍e(\~{q*bo )]Wv3Dj`kr}8|ѣ Uvx+2=8Rqbwv)ۦsUi~kGggۧLdNN1MLG6$`r%L?b)U6ڱ}^?neۜqڝ:݄U] *3&ۏ9WÛ;>zGmRlz q/FF0k#nNjߊ+s+Fׇ^to4^{ce+8E:x"^mZwg5ofD ?J RiE6vٚ3՞'_H ܸJ\xs,r,2` C u@8,0#FlGkފ3 սa<fx+-z}yW!┉K|U3qjrWQghWGh ĆZEfxR#E?]ܧruLW3-"m5k9E $.9kxw?cR|2^>EH(bk/efdz+o+ӥS|‰l/¶g̭NY_s'IURE\f]FA5I!ɰ +R,>p+^?l`TRa|K5ƀ=Q8j-6M@ 6 ȘBB_+3% )ީ){ t t.EaU$$DKC܁5t6;$MΝ޽&*I:-?iue[kd !QycV:Z?+ix=?3?<{K-HZr/3F3 ƪ릗':u<U1 qݑJԬxX܊k׳-?T[6,cR(c-Aզ$YI\Le֨w n e8(ʇGߔ >FHMh@{{o>__+w{xߌU.B x8 `f@cB23 zL!\H)BkR,Է5DM%!H  $ۅ|(mƯ}I%Gl4\kNVNO2Ӎ̯%YnĕH*Qy_tya|6|%i0u Q}w!)cɖɔ;b5iFj^TFoSZj'hc40HZ՛jc\_gi&~3T,@挫|ĸn{|`fvizjC,`+ LX^| DKZ쯖q$ ,HGl$ }4İ4Qf4')ؾJ3Q\lXUrǐXJU:)%'9h3Q!-}0;>*lBJTFN`΋gO:ZyUnl:bvIOYAb:ֲڢBXdW=S 9gF5ψ;fW̗Z~̓S:241ic-b!هF+gq]PB7~~/I̗:[>$qL3s0H(5\@ w\'E0ۏ䷘HɁhwG`|8M/&Mϡ  ^G-I+6> W|W7boPVS4kp]f-"[=U}dfxstβ١ d6x@pl˦9 K[+̣|&O5/})p$}5::%-[+9"/L5~O3y$nj׮RoTSiWuݒodxCI?d; Ȯabp-15?vا۽M(f[W#doDc5 =:"^A@dqfA) M`q)).;GؖUh [)0ʀ1be&S.U-WT^R$cU{*{h3(>/G\=3WP $/R2%[V+wRl SWC7B;9_E2 '*g2A([(تV8jm5^ʥhIhKJ Ђ{ ]m:^ע0*zeV_ cS+wP$NrlwG H)T-TX=ƗZ @Vlu D4jCmG\ e ;9Sִ) - -5J 'q/û2]ɛolл{ ^:`Fvp[|Np?׹ aԄaI1!ШPC4-~ll3"ӓ[Yfeu^= 坶?|7? y8j`fYX2e> @VSj*( z=&_L{#,}dS $ ع|?_誝א=4u: X6nI#VݫCо1-o7}@Qm\*oD+ <omS3y3rܠA; OΔԠ!%Cg 4 r&S J/M@|L8dX|j5U(:E>/g 9fPfIdx.YB%ȥN?3 R*5+b_bD15H*e{r!+rҞdU&"OvvZfEv I!'75sH`rWX~whg^(5BJ)Z.J1A\EWs='vZUKWǸ $~Kc,u!\2@|AY%@p}<#7RX!ėKJ+o^4:Z4>Z)kԈҧXKp2TIQzckHfW)]+1 ѪV0MB-HK醁i0lLl\LFo`,Lݎ,]e-3]2(k4/بJfR_gi фC!%)^ˑ}0'T 69Mhb|K }K%ql:݈I3lTHQO.jС?i H 5+RdG6$ۑTpwR5$nO W&{`-M_"AZ(Oң;–&)9)$uC F:Mo 8칩q>3UJkqK(r̶X,$͞e!v f2 eairH %> MaK$!B4[%+ Thabe1#[+]%ᨹ2D+ߎT{SC%f090z6t ɉiV\ɡdBGxt_LZ(LsS϶ʃ]&k8>[hUc) O|ot#T9 \} b[r{jW'BW9D=rԱ6Hn۫篓6.ʧ./LbLAN =HPUX9GBCCT3UC{OB$RhM緙޽|:G'F"0]RIS^˅O>.E 6\͉"L9\|儇6驊c,P@pC…IO2X\JA]z9`g:L!*.tbH*ݪ;}tnԽщ*t0se |kz5dU!9`v8^wRv'qw^.*VUʝ"}r@S&7t$glprtjjfnaqy9KZ&+L"oA#?UOy&#$(#4Ut+n*盭jZ:BVrtȪ bUɗIzjbGmOD;*g[*f[%CK2v:vrmtdB.ZHg >:mE;jqGJN(D"G^>6,V,of% j նL$O+iZ^j]yH ra볯|3\4=ַu Es_+awڃlF:JxvI51olsm 2n\  26xiܿG'\JqOEseuEW!=^7ZSHxaolmH[eo}^p>>ww޻~i ?}p=p}",k>N}kICᕝ.1h9?%.GeZx@,v$_˞}UJ7 7YTD E~O'X1Sml"#l^2Ηuyvg?-Q=hIU}{[rE۸1'U~bC<@}]2As2۸;/aj=cí3sg'ufw\$Fq&ol6xJ(AӺCgkm~c0G]UYyyVVy"b;Z/@~}NSᨄs7ΨkAZ(H(ns Aݰ) 'NP~11.>ԗ8Y4o'="6@ hӶ0z>\u`W-S r,UJ8F@=J͵۫{-VDXAg^K)Rc-fMMXW6\,F[q7I!.έ7\*øs,:3 ֌\/[x>944r~tǣ_j-@ɉ޾Uxd{C6Rgid)}L*N1J(::&2(8a]@p"6{q˾vf #y4BA_ߺ4{v^n;rȂ7ysW59Q.CӾs nOj6'诚{]#EkYfyJyB|V?νU^=o?WP#\X,aRrX-j jfk)t#R'j-f=Ӷ1u`v) GI3a7J$fGMB Oj0XGµiy56'bLr4eO{c@hF,\]Wz1X)]1وȗڲEI 2.n v)-%3 9962eD'XĚ eg[ai1`ݘ<43hioөfM#ք)z`H__{LX%JԜ]UC.VȌ],b׹pͭrQCKnSnc^C.@:@.~bóB3s&봥}HC?C6?Q57QU2iL_r Ƥivl,4rz& lBG27^;$V#\6aٶtKl[98)`\\\T*U`WFjDEi7Fj5h SoVkԪW-PAz&&={x)~Do 7=Wj&s㾥ed ,2K/K2{°{{/?kANlW&ȅDq9G1VHvni/F+ˁ묛fyR+T Yoi6 &9<@,`=f$WvBNI:mb$;rPj@$K C2" \ƺj}SG5׿?rWp:TǓJ)(j|?WR^9GТ/-2K-8Lb#gΙYg@dk7&#gˢ3)pdXZj;;kf;);)'S,ՑsZ:.T8fvDǒ'@vz}zfI`4H#s_iLG-dMV,h~Ѫ275Eos#_cPÖ- HCzRW1#1ȇv|]c%t,>(/YR<9GTPk 7JY`Bv埉w)\?-ii7^{^1?59*ojBz Aqy?!bhd^l)Ӯ6v!p3řt;<. .(E=;c6R=fyT!:`Vֆ7ph:H-38U9747l\+@1@*ӕUR-.M90Hϡz,ga);à Y5 <9 o *4< |2"ʒ.w5[S6@O ٹgI~*g,d̕D۞I^ WXj6D nH$I$K!= .Z'5~$[CPd2:,$pUMuD녺 1#LzяS1!(0C;sNr'dSzqwZmr' ~G>+bF,ʅݨ5y/?ⴜcvsvzfv.FE&yF6:g5OUsdqOyKvHx4L㴡Iy /duV<g84^t)t6 'ݟ/gmrC[?}4ǟֺ䬓d{L!笱 {kq(.&i oƏ t3>ҡh zOL:lp8oz<ޙ:(sQ϶3<ǃtLt\v9yGjH5ŌSX#d#}d X6y)<-ġMF7K?V?o5-DА8S tT z-0Y(΢4 nNP9PmfH; ?ь(Կh&˶.`g@’$cK=CO_?D_=ˆlBy>L~|@F*5ާA($.jڷ#O$ d2B*݄jKY| 9BvSh5jH)Rh­\%%NY6k vL`:[3T!{Cf4/i+CJuO{wnA?L@'Alass]/ƨ8]Z+Ȯ5d+NkIEp,(M/N6I$Y- tԢ .mC6hՈ3V'!KZC0?釅t2uZ&wЅ)oDW\>=7GvZ}GMca,G$kdhp$b%# Ċ"A@Bc"R"1'>eW(6?X0(CgL_(J"&3rZ{7hI2cTQpAad++x31B\ߴA84n# cu+riz5;nqorv7{P ZN&d2 ĺ1 W]Mm#jh$p ̢Y3+.ΐ Dχ8h,+( **G1 v$TDum-s6LtW#[|:f隙Ɓ1BĤFzZ# ? ;ϕn(UvmjgǬ YX!o{ zs~:7ƞFqY_ h`[5-M4WT`a P5\_gQ$J$NlGĬ1ܺ4eQfCMN;A_KOmՑ 1]%O~itxjfrvfT f}p %nqGNK_ȒԜ{H1aACjJ-*ID*ʭUWޢgĽ 2;kbt(}6+t7@欁JM::qz$٦D֪79b!Or6Ȁ3 T6N7aj46xxrYjsjQ9$-R̈)7Z>9X0,kk1|#u0@ $ Px/ue2X,Y7QPkCa:HW?(Pڦ,_S}EؓW)EUvmCz 猍p$$Z" |*%%KϿB G𲃑)vU^\ɪMɑ]d$M6ȓ |-|MqMSi #tp&@:S e,-6Gi} Բ顗ܔjKDKosٯ@娵n=\5Erf+Inp/g^{gF<_=wP7D?\9;Z+Q;\ᬱ8fR鶊vJxqK6J lG#EuxA^l%2nH>a(C߼M<ٱ⠶$ZMj1JO^8Iw(K->>}󷯿..aͿX@ ֙_j :=/@;Cf |__q*BDKӏV~ϫ*[UVˆI~柍 kdQ7੄·M(mF>87y9Zk//;r[|&苻ȁ©aœV RgoTCPҡX3P7b|zRLhp*-]|Y)fW靷V>iKwx1?^eyv%NJyʮLzʃX(kBD$?y]KC6B;"2YE$t#;L铲xas$擛 =mad35C DOR3a4rhPTa޼ - ȽK)l.l8t5xJQZ! +yVxTzk} j.K;˂L+Ln%碩% L^ŬӪۺ"4LK/r_Q[u{M[Msm*H`ö&aP.ttD[z껭-qS|":fQah ̕`h).ԙC2էfz8dZ$ppuqhPC:z9ZTwHRKZYi%sՓtXyB|Sv ;X#@)UG9D(iCx#SZ$ʚ$3PBA3#tP?!J+X0 EJŕx`X 1:>X & Mس! < W8*ǔ\;z^锹DY aea ?͛n\elbrSfHeq$ĐCBo<'~|堏!+#FuԎ및iSW٣MM>R8*5.\g:ȴP75Y3: eL`j1dOg/!yT?΅wCqDJfn%uaÇOT讬H@3\CJA܄uE[? Oޫ{2?ص8E쳲݉`,4?X DsSYg9R;ɓפVT]BvvYÙT4ѽlTDAxX1ed]4j]*:;7:79  jKc|\t<pr:I(+`M6Ct< C WRB+CB#4 V6\(5P?e^t0LW__hbw?4vHT:|{^_If/ni{aBV.ElxM!#Um[ݗ[ݍFd3 \VvB3w+m,"Nx}v/@n혁18$+&FKRo CSgJay &T#혱6yP承Fn5 Q TOR7!QdO571 pe Y*ӌNRW[xV_=xQ-&0{1b^x3Huj^bb 4,j0Ia9pdn3cW[@ڿL#@ ([9xQ%vpYycES5D}tCE8WX!eW*M6Tӣ!1%-ce@/:aY._b#OlK4sT+9@U/I@mM=J\Ա2E`iN K6V)yb6¡]Գh.7RE Br'ts`"I^!(`EbDN_~^ p/{~eFo\s;id 5X*9R+Zz'F'fFG^T͓),֬qk6jp2k1hp׫r, dq냴4j}ky044 a777̫_GCKC_^@t ~!w|~hG Ŏz6m):幰s99^z5٩v)֪jNWm:24.w2UN5ēLF86G]5 Ld Me M$J-dk̕ ץd À8X׻ 30ݠNp.+q69^PG?|쏒[9(\[b^؂oW`+3ʶ៴28ۏ X?Àl/jQs0yCu = DE^R梊UZQꭾTKU<se3$O![G[ s8ٶ&)3z-ju3=MeW2ۆɺ]'~kH/6YB LǠ ;"]gHfE `auy:7A5啻j勤rE (x {}^'~ Z  (0yk.03>>7j ro DJN^?җ[⥗뮓ŽhhvR霩|9+ٌl"pJtcbb'yIU9+vje}͋mF`fҩ7+{T0 }e>Z/X?+afeMѢcvzl ge1]+ HٰwKGo 4<Ȇ؈},$NR;#-^Ӱ;ߵ4y  iwնy"\st#vW%@-QyH},f +zpa,QiǕ p"c܎ﲿoUɠcMVk,^N^ea֧8:ә{}|*x壶x+mX_b9ē:sr]ZA}9)kh̦pÑVp!urO N:eMBDB#+d֬nҽϮ}mE5j~n>XU%NEV:"bSBt3 tF7ϔʓ= zy$IsdwXL@G]_C~ĉ]!TRovz}֪xBx]`gjƫS\`f!jhYK5>T!L.D-JiҼʤ1TXdZd^dQ$*(I3cՊ_a|&fZP/$xpsd̫"`@ "tLB7w#ʴ'L_U(WV݊mj#sSMUQmL2t` &XjЗ_Sm:~?;7yx_6?Z nZs?{|&{+ݒdyM-]@J,k$ xoE',Ip^!AvIR}>)WoŶMKSQM^ZW=κ]ކ#Dcl:7Vǘq,w sF+FƦ*1_`pn*Z:[A^cBAH ݌ ]3h<;efpy2ư4cWek/)|g}}uuӣ0Ժ刋( !.N]:9v~UY-/0C[tG ;~efKyUXZPg^$b!1 }ގc~nЁaaܡCOsL|̦߫AA -2,8xGwӲ>t23= ˃w3& TGz&@19l@90&* 9;'OOiv5YTlUļ{Ka qHOclBSRs +&W !ZBDk"鏯]XrlYggk=j@oHO›NY6 VƬbh`9$H"OKWa'P8xkHaلmIr;?U- +pi"dUDk71!k'd?̾,y{Kl =Mͱ_tո :{l;C,;L9;M^2/85TRůpαP*f(+AO51jm|,d' 29<³/TS󎆑_1#ZԓBGW̢,>}8ǝg{V(4G|'0utSRM5 5ҭFΦ ...!.m6uB7TbZlRf^^botIʰTn*9Ćs 9mM^7X끹HBhSZjgʰPjGXf> 6D7cބf-rґFYPtA'xρPc\n~꥾ק v': N4L͵-̵Qdiž{uϦ7NymO;A;ρeyMX.$:@&dX)~nf633u[Gon䘿n_vӋ^ܳzM{$q%n C,ΰ$%z:c<ԎCmsӝ3p5 HLb+^Fv]|jƠ&6XC("/3W߫:5$O6$fPP 乩U馚I'{g1=>s $S}-0 +Lfsl 5NqYV9|'R GAYyiO`vav: W yl^ ;O>.ǜ=ozьFW؀ܻ${Ų!l6! pe{~ !l߇|d!޹o9|"+(M^214Y "+NT y:Py:F64a0Y8lYCyp:rԪcPɂP Hw. %;b sYegY//?ӚU+-ttJHK3/arAE "]& a(9KKǴ B?b'WC4*^;Uy!Zˡຑ73GUrޯ9ޘ:wc64HbC?ۄ u&ir:wys޵SOؐմ8 Ju050yOel0P`]}2ikt Z'u%/=‘a+c7[\U;x2|3g@L@pf >`-L }T8}'| \ٲ(tG.VHa=[3Wo|ձ-jjidh >;y?T+!r>"rUί.׽4hPU kUlT$znUL[[O\bR iTSoϏ|t@S$Šm0}@NgRh (yT-_1\jzf.Ϊ}]'NuEPojY'}Z^}0|K'л7]~*ih_vW :5t {jב5!/?v1bM\<2[gu(Z}`p+ #LGQb٥ .E z8 ? FQ7{nQS9ڐSCLJ}?>yytK5= _V_Ya;p+B |;=ОmO4 n7c45 q֎H]{u?р1bM 7-T`C_۳3Nq b&'o[ꁰM/¿[zEm2ycbK&(kޅ+ p^݈b j3ڂ$l*0Tarh02kp NRڥZu!<d{>ս427t;]>{0}Y0&*P1n MO}ލOR=aĔcf(YԳl>ŤV0@-"EC!K.όʄ|V:ʢ6Ј+ VlVeֹnA.`nE>VTA+FyCS˛ϗ\;ؕ(C:h2{c*\<ՋݦϾ;~wPSse *\{0Z\]~q+ǿDd8r"˷ocRQ~7kߝc =xvϩ7T/&CV6dKQ$I-\+ U6Pc_=䬢X+ԻuE7:p@KzPGQ8C CMklrbfO<{ɚO|?;w3ӽ'gt|1 #Ӊ6y/ݽ?wƾ8ttihU|=GVh[9K]G!sz}:p?FJz6\ث[:D~~eأo>2/ $O.qM,p%qëM85[qppىuxP@<dt {hT'CCk3<ݿQ~,vM76 ۏJGO2]'JTEB!`lJ9c;]c<{/t2߾.q-"_d}iUkDD{7}Դ%5>LK>)g[$KJe}LLSpAmgf Ky'KXp՛ByQҎ(`M!bj.(C@ d˞evxןO=hxﲈuv /S78yn& 85mu}s~B ͫwn^9s㟾JciGs  y`r)Ouhh .+l*K@ϗ (%0/Plav8ـt<}ŶyDA?^U^'Jvb땼o?$2ڗ^~g>&/GN:y*$P2.#GQ)dR^{p_K_Cm壺5j'pWB-&A[Q$<: ;U>'gE$E[MџXShGL0Z[Xܜs.sAc&jlABX*+Gvo}֓^`_wڋ;9ujSg/5ܘq!ܧ]h_s-ռ,fhqdܠEu(?$* 㿜ؚw @x6jJRNM>Z O} f[=+9D:rk%` .ْ +m1E|=O >{ p|d.!HLKhdo>ey1֩~EA44~}Uw3a+/o\hJ5k#ۂ[*Np IH(~#6dxpȝB #= (qoA}Г1"jgSc3Y{8@n R[h@-B 7 R'c*Y ZtIq(SP2gسذwqratv(Yћ(틗D|h~0E'T.uZa/R'?aF־e!;B룼o]wg0CQ |f45027!y ko\Avˏ#Uyi $аI@c1w(dܝ2~Z\kY^Z g`W(5J#@l­!ŔBrxbn]o7` 1X½8EC>].x:(z@o# (!q IzjӮG#XV"ZĦX/|c'C>1x] @\U΃qs!y~\W=npd&S9IT~"*ª`~e#5Ҳ vDXOJ"T)xeM VhQâaUgYU µty4@2j?;7c}G}X~VvꯝLHݹ\~ql(pїIp/?+up߸ϱ?ڸ;]1>`? {(΂znoHzI=bsb%)jJD(HA^IUi"动J9UTDT y:6Q u=k w:v`I(nUxԈ3]YIoVgDb^#e9nUj=1XKicK/Σ^^F:v!ƫ+Xod杕Wba]yīgug*à}}om„̒<=o02T(f .%m(h[v"W1!)(ul#G < %|+P2wȘ;DL!@+ʥJN-.p^Z 'L,h;#qPF(wWYG+zw #³?=űn:?3IZ[ڹPNH?n@@#a =~ 9̥f I%A@>zVȁCsiW ߻(yk'~f@ V7m/022UnrDۣVPZc@:] dbu5xx`[rBDDv03flI[%iҍ^`(q Eɤy[r;Б:E=8H7^\{E:K}s iTAs7IUW8z#qPkQlRZ:yB\*Vu-FN]SU4zENݮy@F- y"Z a|RCo4l=3'F@yTB۽;f; H7O b|/Ac>hw< :X3`ui[1/8z@/H[ōQ`7[Mf.C<f{Pm"Vy0U}lB+$? :}>ɿLRkL4}a2 {u݁zT<4UnCc% e{;ٝJ}s,suX~[#"$C`M 5BîrrkH A KTFZ#TI  oK6"IP J}N/9&ݡ0Ng3 cD0G)&*y18Th{΁ECK`ne#.c+G G)h?.%`כg.M_} XJYE0„zm]"7W ΍+S~zw34P0#5@C @MYMLSg59e6!SW,RZFժMN]eV(`b4ZٰmA.x0LjԘWbxhn<|0@ǡ\e&u$m.r>4}tc1ߞG}1%1JB9(x[ o[_t<}~sAKSƷ.ڽԍ"&-66q?UZzhį f^'n˛J)* \%y7Fզ٩VwK9T8Y@5[&M>SO^ţ?it6{4\p*= SCwO /G?G uo0pLJA ! WW+Tn.Y~ TUo.K2rRPvy:Q֘J5$k"%>NQϰJ'SdUa[@-ݧh9h78wp|S&4QTiU%^999в~e>zPy2VCT fw",51J| d$Zeh= 5ޞ~|й/.{}f/.M9{CSϞi;s ݀ޔ=pWn]3M/#N |;s=ь5jgXj(+GLpZ{"ȡ꧓Z+}EJ#IyE Ih@,T PoeU9^CPcU9&vQj`jLhU DJ52^S'6hzA[b"Y )< }F3[2(ƓELjG=`+-þ*R٥!S)\TTamH 0PF@_e v @2*ņ}YoGҞ !r] Lji Zdb@ŨF^]nf[2̢9LU\*I6BZ ՠ5(EuR~\Ш# ϋ^"c)ؕj^V0Y1"Z?lspTD+MLQJOOON&I/mT9y䅙'fMA[ myk$fBv`Z@%ow']w''Rj$iq\Vު5 <)\+ZJ-QKEb63F,:$LfR*O堈ɦv2t2rԶ}BIP73jĒʅݰdWL$S8niMj)(> fE͙OOte8wgv߸1t>B_XtEHq԰l![DJz |{j̭^MYTfNK\Sև)BU!2?'7_0Cyo:hu 1ѵ>75_mӨzBgؔvnwt(J5EL$=zCECpx|o"&.qs|2_gfnJށR8@ō+GFϑaU[~HaZFJ.z?˜`WR,&v+"RE#ya"b$vd!z0s%t>}3x^4R=0  vT ,OHw9yH$`%XeZ|w_ $Mӄa3 6B*]g/7=?<APLMJ$DE I6d$1 >UԹ"LÇTg5.uG+̈wB[a7yQA1{N>8gqlujPV>;45/a/^*^[`/oɜ?}ǝgN//u_ eb]_ B8\EΠvp\9PQ1WNǦ؃ 3eJ &s 7B:[|H(Qr O:?[SS٥S7گ>pʙB:}Bop1-^9e/|~ wtMHڨ >`4"T܀-)S2 X=|8)dxlc'O}#wN{ݟozic YCg"ͽWnBЍkhdg zמ=V!tK<`ݧ4ƀ_kz$}Qj !وPb<I!myCc<8l7ʄ3$ddqp"WzFs ΅QةvuDGm v>6sb)ҧԗ]Wǁ0 (ҧ/ ?w4^ɸ^^P(qCdwQp*HI8paCzPMvzDfg_=1' p<C.cȍ^!Ey IJ,pf;OލP{r*v.\'7K:tɋoW?$EQ&+Lt" yv (­*7x @عJNKyB5 7i;c)AS1@t3 y?T`Zj$@;FMk}աPQveb5H#(H6"S8ӷ  fɔ7lҟR+Ԇd_NTbg Ot=m(#{L`k_~/?-KTuwI,Vsr")$ϕ27BDLmDtR1?()diÿn #4ǀ f(m".0FXvh N=c FH :w(4QF5vOpۿ|X  BX(CCT\ZX Nkt"RKB$tbfqNġ?oQUT;#h:b4R5Vu[gB!TaHr :aQaoQlWUrP UKUVoi[@ij'`Rr/*;Y9PUPEuP,0DEAs\\beUmp6@%ۭ?0' 9DGBR5@VLE#\d`TnAsG5)P+2Hu5ZK]"I\WyTAn|'vG; f5n[c~s6|[E OY: o]lCLwtG&!nJh`t(׊kW-،a눰B"䂐*2H`vOm@(pP{O}fvPjz5 5h]w4tlnO_us(; " |lM1ULIIi F-t{AU(DR'>X +TjVy]ʮ* F%B/ {w'Ʌp2# ֛FӶhf=cr父%Q+?Yy{gG?/|?dm4Z8N$qrB<݊  (qQTBDρyc&*/H*fOIyr~ۅ._ܞ;/R|3yel\(^lUB3 Z ?XnO_*kٳU ]J-ɡ v[Clca#!3ehSfQeC@JN#%Dq CpcmI2~K'Pԛ]Y2MX\-XSng JДA nqqp nyțECs)j|aX0Z1X_Tk w5_0]F|o߃_FA]Z+t^:Y`eOh#1a.HwO$A:7A6C[m!]VDka懌]wMӟT =S5:] DbC 04gHJ+tJIJ'FZQgVh:&P6:uz]YSIҷӀdUM=Juhaߝzpi Jɼ$Hj[2URЪ?k~b𩨒Du~$Bݐh79WP6:̍vG]grE): ޗ~aU}G.\РAۄD\?W,(IK4̦v$V%r U"Pk1'{\-^]K)HQa}IO.V>^i02Y.66!!M6YMIHfiJ[}`%N]׈z苋, J"!TWGg`T rB*S(4 *5<RRTp`~.#DO&߯RGSPB>an4E["Q q[±,P3J ' `x֞$݋"/%p@kq0P~z$?m>ta3tFBP"ѯLCQ% V(#k2PcwڿW/߽s4㛦 o'IܹPqg/??wYZx^$&elAA *FkvaCPC&)lG=T Z./4a폴Wh:2P)6\1D_|)З dUDeuK]8FWoxQԁiZ<oD:gY6'GoYzoha},]HU  G#.0X"!}]4Ͳ<@"m|Č?!ʶ=t/qj:Ízt!JbAJ x9:&r1_H=nNt݇yQ7T~5_ mF.K`vQcy EX1ۇ[,1{oy$1E8BiF( ,dIAʵssBU|PxxɯO9? $д@_`d&!CG1&N!Z;`B@$ K'|> C #="`U"5(mpj; g`$ G:TKѴ@`̻`#Zסkl z8h:HF#yUTڕUMA^SڭQ1OZe3W:Lv=T*{FF Ӈ;9"6 I^AJmbP8!{I{t6@:A:XT$x&&B3EqP<Gz,kt)CZ P'&i;" ħ&GF::&&!C>\$pI냬m! {Zzh64 x`lfQR`3`}k8'hdYgwk)>ڕX%j,oŷanP_q^|"H=/Fy^2`*vAPC5G9%X;CS! M:+O7&f#7UP޻z5Hqr: g;S;+cx5F^Tļ=uy>_|0 sFSŚX̅6SCYiuE5%8)lr_5U a߂BY d@_D$SE|# N :PP z)50ՀO4Q|}'e3(}[]Խ]jR{-:Ⱥb?Ou"cΥeW#&Ĝ Xz&%w)D1v*JIVyf}Vⴖ->gC-!#)=.=np[<&@.H)zQ&ba)$_9g&Lde6.J6Id;zifX8=ZVe4;$Nag`UN h\Z@2\6i{J#0 ;ߺ>u}2J)vdBUg9&cÞ8meЖ֔Dos)ƆB@s pBP/5 C2<>998- //lStuTH1f盩j_Ϸ窍mNj-I!-r^" :jqX`?A ;vt% 8p~3 F&l}P16;d\/SOO_+.L͝"3ݙt>gAL>t\:}ħkwή\ެ^0<_BYgo07ku1s >4E&blа  ZrjJ j <(C`VyFj+Hu.KӌZݎBS""W{qf50V(Wct-`)(ր@jUV*op pl%krBqD,ռ*妫Z26 `wH8n ˆB7:yZ% '4J\؍@}L RIRp 3&-#4 n 4,H+v]JX/ d "Mp,pPBT d2˒+@@>X XN,g0_s*Ǻqۡk:zcADC?RN)3]DG")da$fn1UtUn3&0|WllcvpfM#ڡKpX֊%-2V)Btb 9/o-<ghU>b# ! Y]l N \VNKTL-r=yW!]~ 9th"͍"nQ+;#- 6tτ3LJǎLlߺ-ȳN,mY<& Rf)y1>!TŃt 3vK,ɡmv 1ow>|>$pf33Yٜu Z&s,n>!qV`ef^âۂâP3?/UlsdfQF:TXnK XBKY\+_ϗFR=n172x6滖Ĭ9B:bˣ+-&. bm1ˌ: 4xѦj$@.= UBtS/%Pw_~ޙsg/BR=ܺy19ߡ!?sֶ*O05լ[w4|_^y{%i -BB*"U)65BH[jAYbA#p xPa;@;V4L@z\*P%oȗ*%:x e iaS{Y둴EjLxJfPt(=m}v|? MAF ^е"tBU*v2YFab!H`~l T6 2ɵNa\bЊ'[. 0JZ;Ч&&& #nuj+"HU#mlD Ǚw`q0}E/H̓ y Y.8K"S(rY*IbYj<`mC>2*,"Q涒q*mtMMdfeV >^:5*0QTIȠm`!oL7G,|+[օq^*8/%KRa LM pM|nWZm"rpzbXT] DGP!/D<|*4TZ.ٛ>;'s7( z6Fc&ܸqԵS'O?mo?wD](.(y:ȃ mڎ }M ,ۡl`Uo:}Z H}$LW3 P(EV0A| "@ M=,;dJezͤ$N*4vlH/!H PBXPQwuuuu]]ײ6DEj4k}AB}s~e[`; meN[Ϸtŕ;sKYkawIл<"Ub (mZn7VѪ9 9p\/zP %[ý ,JN=3f(1)2rBM#Srb "E||Lz5U46"JT@MB|Y6ߩD=G˹J(Ơ$r|<ϣM5ʽ&8e6F" ( ^s˲c_ϵY9&INM[B2\?[הgLr-r@82BpE[2γhi`5# xS">/j``[Trz>mEq-1 WRm |LJ;Y"9@qr |Vie%#.Q*QLUENqeNiö$!*[.c4̳ki@ph]6霪wCMX;G ZHj T(Uq1,ZB%}z#fu˒\ׯw;tf5G#\h(d,@c"u7 gr~p(ۣ"Q40(}3"πL##s$V.eH8PuТ9}ԅg._AfN5!ԵC@A4$B _8ŕc_L~ah]sfDsq^mfJ]VjuZ"$yMkJRA]8yMnYҧ Xh6ꂱ+::O<HQmQEVAS1E"A x*9ve&ZhnJ#+?}wAƶM9"& աAU@Eך1|KXs p GN|jk )yA…lrமLAdp2UY4M$] (*\W(vF}2(8feOR,< -)6A䦸YInhC1 tǩ:(Ľc3wdm ';@BObjLJA? hqa7?s]dQ+eG+x| Zh&m7D@_-@,*Ґa[7&j (caga׻G@cvJ}ZAt0@z#8 98Qg"@y8TboC :QA_"|*twvp`mwfJbtVfeLgsO3纺!=} "Z'?ٯo©&ԮkKB앓_w7֯^{ unBS4x:3kI">% tćXrYy싓'w5r2T23>M2>aPcH$:`E%p31Dmn2bN azβd/>|@95>驼.LH)zd]L~ܨ$buc(!,HR 6q|⃨dauÄ8` Q1P,Y\ O@%`^쇥k!=*+PG0sYV`͏bIF#vGuz:NSE (Jnc- zLuO4e?̳hl0'&?C. )7Yk el r .|gI> 9ŐSj>k<6&*3pd-~0Jǧ.ݴ4\9">T x WI|ŇG9p|x g*"|"C'2"D@r]`?qP˅@haK]|PxQ0!>is]VݔF$Qp s[K2a\֤ @,HY* 2429׋+C:5p{X p:Y$Qza~Xzǹ{sb?fp?qZbU r׉h ٲu9Ӡ>߾7^laսLoth5ӢYRPLC84LW4V0M_<+DљħPsYu N8~1t %R \Kޢuĕ?8G֔uRDZO쮨~ EţV#L*4C)l|U{9.@kaŵElu8 y!T.s+ "x,9h+`oa\UY|c+,v[ΰ/$gaj``ǚ BAX +lLz=IM:i(s-\/ADZhGKR6\1OhT1:$h9q&ƨq"F?zg6! yE],w-><݈mp 0T"2@)x ?Ϫd"ߏϢdCY@-IB)@)CFZ0-`]4""βcD9MEkRj?Ռ8޲cGe f J7m+{퍏~ uPZn`"hyx=SV" 6# EGtQ0ssoƒH:5"dFB4ϲ*+W2n7V^ O1uUFluv,ʠ ݆Yd< 96XtB0d)w[%Xƙ!n˄  u#n2d@roFjr2 }*"&јUM+8LfX˒1=@ːT9WLJU ګL5o?Ӎ)tYgM.NmSDXÑ hjD5+;Z rsX gf4Um?>Z|gZBKnA9QN@8#A=G(LQ 㨍m+Rˑ=ge(Ԭ6@?YXZ E j2l,T*>vhV>Tg[~Һg_`7@cA㎣PN,`9+~~\sM3) AmhrKe vQP_aȰ. R6~ 6'" 5yH'i{ ,=-Va7iF$;m-v/~/Ր]+B~&\ň$d$Bs!@ UM%:'}gշ^^kW_'퓷oj!wy`&HU ZʫQ+P0;@@Hp|FCu7Ip_J&8L|@L#t@/jC"(G <BGN=ˤ]q`?1]4gq")#ꉘUI8W9pL.L1c%Cُ)8HT2ǦdDZE5I3}9e5{gO).]$b۟-|5Մy()흗cknJ|ąiԖ{biTfPTuU z⃨7)cwHUaQ"O!> op3kI&E v+)HK~XVU;Pq#Udeur.IW_jٜ0 )/(X`ɩE\6 P#\|8xrNŌi^ڴ._t9TIU |`삽.z"G؟}U3둰06/*Y3:_Ad1.4R&j53 wɟh;uWH8"gR g& ;BljXBo,ww\j@9\G;c^Ú%kz'liP u#^!҇A!3X#&܄DG G!0y_Z~.: E+ FnweEVt/% }DiEbM>2 nTQ#d~b+e-ų 6B Qms x^>o*xtE29H+/lD9hrD7eoB%w xCCG1 o0NJSC/i7bL,Ƨc Sp[+‰  Cs=>I z->tͅIMkT*"Z<=aoD{3ICz:|C@4**,zez5Fܙ+r6҈Lqs^aZfn s5*^\;M 7 jTO#:l-8{b<|^{Üث{}?߸ShᑊmûζLBmmc*ROhG,J4ӳBeQUBhX}ߜ(9`?(Ar@@8I@ZQ~l:Ξ:G :ՄI৮j©Fk&LPjpm.R/wùqʹݟ南ެ[]f$ XX]`ˉE/:rl+bhϱGI:(aj qSn_0MsD?CUhYbfQYm+9zw:0Qy%r?;!Vo0&-JwU  W1 3;%. 闺 > NĨ 7$mO}g gxI`ԡCXZz|vK? k>~X^L|v nOZ+dg~dNR}oKڜ!J|,Š DjYbj6;lº (Eշc@VcAG8rfxq@&HR[X8r^ g]x dYmz AkJ+qoO k@ 6<0> DɾY;m d=$vtKv:4R5z%홲8( kM4PI8_R+l 캆RM:&f&dZBmϬ兙sID$O$bk{OC:. kU@RE-s5!8!cNU!ېmِm\|.ssߞ=z{g~oO,_eBQKZ+H<$F\܋6x1 K5ٹ^Llc4+ȉlt$V"7\óy.J3l͏[iiʱlI' osX'/pmw<04gg֞ 8s6y9,Žy ; -Y%'4'nNB]](us =6mɍӿK%PNT*7K˰vIyN% /0g|P| qD-Ipve Oggϖ^] AZ|O{CI5[vH%E1Zjښ3 Fv".l.$8ũEprN&-#9 B6*z)xAl7P?ք 7\:4u9Ԍc7d?ޭz;o* &~ԃ#s^o`sgckO ]'muQʚikKz&Wze:Wf{`zJ8( ͙-Yx3v,($ıH68  ڹd$& t>,G4fzdh1jTAvF>"J&F")#K$)SF%'>6򆽫jm(::2 W5" J8hP?E? P]fT|Ivw8W]+ɡb?ןł C05e^јk0:"eJDƫY&kgCfEΰGR(V k ۤ6m,7wS SogW p[}r\r[{%n,0Ժ0>>'+KR0J4⌀t91ufe,޶?=,拏z7W-yM ]rLC!8&FoDs W+L|օ< ?L|&ԇC-⳩4 >8p ac` "\,0b$Y_#& )ΤuR9ej|-vik47fb0.쐒Քkm.d8nofsy9M-%L V'c;Vs)A%d;e4I?JQЗ5Ѐ91-[uBM-ݤnHw GiF5BՄ>&?SԤ~T⢾5Ǿ\1 (& 15j'C/H[g};k蘙< !溜gܟ1Oծ|Ξ&Ϝ>sLT "\DW,BEOlHajjDMM·Fd. 6hT(2^;})wo]wL~[p>*pCrd)TYto`POPuEA}H6GgU.Sﹽ4gۀ}hvqD]:^ΰrJs+EhSoL"監&1!(qD Q<?-S X % QI(ft[ M:Q d(Rgm%:)*߂yG)rNoΒM=ݜnwビ pMw݊ϪP|BFu I|KD|Pe!> |+0rG4=$&t Qnyx-*Zϧ]dU,4*!,挮PEɢXL|d'm3" gg] {ǮeCc#-56?,GBs.s떄C}.E0aJBc?|fqa  z\~tC 7F $cЪbS [p`BRb"x:C1I|p?U yPBxk E (~Gp- ֣k!Q;dҬkAUKD v$Nfl=Ċ7LmrV 7>@{V=h6#_^!,6L8/a EA{82B'/J}mbGt J&tz>\ 4}rF!%0쇩eu?q`x};[xEYLj~qI{qmnxţqmcm1JGT}codzb/(qƪ%o>~rh ַ Cw3ǔhTCiS r$MtjBI}?Dy[gK$Ϝ9?nNAvrmuy>hl‡̢ l4&Vs-MƍMXq t`srL `(\&uG+! tP׌E8VףrYS  +`t 5ɇvS1ݱGRbb]U.XcB{?jW`hh?hvK[hOw֚ؓݰ V v.Ǿ6 #R$L| !j|$>D||{ 忌-l.-U R M# u@kWpsFaYc3Q|Y  ^F4V{4>B[栴<1!M>MmSacMIaZ0HR Dw~EL+9%\L=`?q&V4aT!_ aibU򣜓{omVPܜl];+c|1ǥxoiVNpg=9Ԙ>ŌxMQBy64P_DdXdk(.v3t}ǽnDlzjLEsдYSI4J I{7~akOn+Ͻoேdk Csݝ])Bhb%8 BST5jB@dW u˵T#ɵ&\0!]#1VT;"Fm3]_~]w"DŽ@".Ͱ1$.a.OTqjT&,ž:SWX{O}]^t=fIb&aCY,ŐQRJQݣv  ʨ 8t1pH>05MŖm}yH;Ȼ{cOu d-s08{Rz&`"h͊tɢfeBŅih®Ǎ@sfZT3ML78[ҦPabuZs~d X>>G>8G:~gOtG:w<zT  g=BIsT($I&MGC|]T{;`!Ok8w?jHvR\l$ -O. 0Vd9w7ĿԹoAb >=dyOB=Mƿ0mkv|۞|,]Cj䚴H^W#R):|EJQ45ڍ&ƭDջ}5n]'vu!ɵg[E٠,&UaTVɈM*ʱ4 1UٲҪ oL}fd>bھ>pE4}Y3 f9tRgXTT$'EETúmx`m;?Lon -5 ʭO I~z7 ̛z6ЬJF4Q֤i8a"-7Gn͆@C}z7*=CZ1ddu]e-<QesJ, ȷ<5X mq GgTMX>$jHҤI$QӣPnPIl(MHuH42Zn՜/qg!TR_}hp+"W%*5K+JGK%Pjrzfě&ic˂ 5V SҽTM Rz߲r:mj˳Ͼiܟ~wl)óꆤVxƭm)2,,IROqFbi~;PAT4\/IC=,|ߠU3{y7l]8q'GfX5 ??[o-_~Si:p9l:yᢀ1b}zs뵯Léj(gD$ jt"g+Z>/WM?>'cbFc[ʛb Ch&H;(P=\U[71pӁ ?0DrOI}TO=Sjؐ!.P-nVsR3},[[R_&YY'kHlH5nI7oN3mN3nN34%jR[]d\b 1 t1%ƨ }d^Z+.KPG<5jEP Tm rM1W:K]D7[? k,uyڼBb9Υٮ%& [M:h}T(A!Su= j PyjrPHã/rGI~}[ uۋs՛{dus9OyM6E§XSnHݑjޜjh pc.KDxi@S1'`\ېd\qiPUZ)z j24Ѿ^i*t!bdUueoQcqg[vU-ٚ- x /*Mkׯ땏q-cb",鶥c:w\Gc#&[fE&h>3׀7WI+˅Yh!"^B'heдIҐd(='R6T>  C)My]#\d6o4>6geGD0"QGh{z@̞=UK -Mi҆m sdu늍[6s5qM5U UM2 \ q\IN=)Th@}DbuBRbVpc=;3!>DkXYB-3NR<џ7-ņ/6Vl.{#|!>T%=5ƾzfwr˦W7ls%& ǏHIK5DOpjE1ʎin`RӀUUyΥee==!nc=ܪEOV]?u‚QіEoNqQ1*Ζ#ǯwNцŮN@_h|sG?|+'yW^^x%c3c|jj4H'GQVsGkgnW~R?M1 ICRSYgSoo|K>k?oS?9w$ \>͖ő $ ?L5kDFh\:r++;:5ܬǥ!7N3?˷-w4xFs7ꟽQ̘#en^־=G9 3odOvM>OSy{릾M}=;'o$ k-FRq}̸7jQ{Tݪ۔*"nGS:f$QfP`%|lԂH~&0#CXb/-`0Ks} s7ISIz95b*0vC[NwaMwDmִ"U:+fcnOl>[ e88Ǹzf}@Rޱ[z7䩛r Tz1Wo,uliuIC^FpTKxtGtJkըߨVܪE96:.1fQ-nQW X.{C~/}g>__|o/> Sw>w|C@}ǧ>=otsO̞[7[4牱#eޞGTk}0];98?ߵ_j`FyqTHsT?ƈ! .+7|_|Co^lr+Ǯ\jpbW;%0'Wgߣ0ѨK54a$H3,΀"\tɓO򎲹UH1T-ͱ,I0n3n*6oyzQXdyVnJ62y@<ͲexUE- F.I*"VdW)jhC,TuY< a|ljԍGB։)6SrPsp vqX$ v%` &T|n\d\`±:(q) ?3*͹ώ5(}@`۠i;fI:(y`ꖁi26O_STg{ @*bʃ=:j2uYN;۞:8Nj7Zv緸;hM# SHr@wA$F+ԃearٍj%iM1 tJ߬GOeԝg>ޝx_~/>?v7_[38G?'9|ѣ'Ouji?y';st˱SL:vvv}_}|ǿW~/8W3[_M˷,8^7ه'knMU)nʆZdC#IGݴl_=g?WG>:tcߴMW_ï#gOm yRfw;6lp((9Lm8\6q3*>}H۩ێq⣮w+{mϷ_r͹7?PaCyRw[]l|`1#mބH|},oC9Qו+]tD~HkSNJ&&;@k©vpajSWN?o^Z{YiM3o`/80$i@>uZ ˳l婖^D0bTG]]|xX(cm DT@ 'tu#paA A4DoS7Ǎn^=.3|gmWlce aΝ#{ow඄Hzꖸ,[vf=jqwE ;z&b$7 vze{VKA}R66n_7eжm,5jzhr,Y^D C3 cn.,4'"$^d)8R<fzS8tMv sDSzg[}c]>>c>xǴ$T䥅=foHm,[o~_9|\ۑ֖.TΟji=׊2.ӺyŖSgϞ>wL;b/ w :N;z엧}Wg>voזCo=^? [gskVBo{8A7׻g_~w<_}ّ/Ovv4B(m'>š}^{׿G[{b.> 4x-Deˤ+߶}{D']8x/N8{㧾WOW?߿zcO(bSj8J4~}g΂>[XB>݁y…nrЖ}. La^|9zU9C1tIO:mN;|?;o>~VlLgmAL7ۋL,d|8 uI/8QkxQ{ :-Q2,b\Ԯ*eP855Z,BthۊӞ.x' 4LOSl'%'ҵ-=iaʋ]׮*66`ik/*zij%H-B%ST3#+0ptm3צ].'$oIQ1. 53m_^-ٱm3nvoVƃS'HrLvK2+reE⊔}_ۿ|^]_+_{B79'mBwf5qJk'Uj=o]|<@n/Bsg[ZZOu;}ㇾǾxO;xvcBW_r:;g~Z[Nhηwsg fgδm=uS-GQ/䩣"#q  TE2L!` BH\jj#Ν9x7_;GZ?} oٲenן{Cq*;*M#D iXo?.Q\3W?_O,4Wj/> ừ"KJO?`7 ۮezܤDhQ1O p}iKCU_fErB)݄2>[$˷aY_hk3qjĴ6'!-EexCs n+#T楸y:?쉽ǬY/IuEu#^w]b#2E?|];VSD=Z1F$K5cq\^Pz50аJސ`9yH Oޅv-ȌLYW̤ <<M<`Zf^XmεyJM]U`Ggm)?ڐk4Y|rx z^RW^Oo~7>|/]5iHHi^v^>66}Qa2)vY42޻{YŇ{Wϟ;}ʷ|{qpg8+ Q p5/Co/a{]Gw "<9`W=w_9%鯿f:s mh,uyȤ2?꬐Q2_Ay3m]g;ϷuoG@IQd]wW?1 k l ;η^h;qxm_ro>x7~CVl9i#]gZUgD;HgS *.}'~b1~CyX01=90(!LfKϲ*Te@ʎ}"Y !υjs#zGɞ){ȔO I߻Ĺؾ~`psC3DSu5(S М KߐLqh{T"Fj[t2xl*sހ:' L̸  eݜS)e&JѬiJޔDKb-+16 KӯSA=Ml[=îlM4F=f~ܦ卝`6m.M#O7& T('L?2oҷOynd#3ܐ0XWq:Y6[KFe^us&|C S's|OG>ɏwU-}H% V*D3LulVu?|73pڸ3T5rKbޅnL0fy#J8"rNjh"йGt΃ts<1yoi9z!WG I P@ģEb ~߿~wA%+@(Ѳjl9vO~'?18%ǨLpu-,E4Q^'W-4v);rД] l.rC߿4-ldGFiS*ްoI-R&}qб0վ,dzlúb:X=b@XTeԦk߰4A T oʚ4z3VU <&]FTS} <^SzCvsq@K7?пO!B7P/_Hͽ ٪5A*);Ri4&Jږ?qLJ֣mG/>q\Mq7>waQ][PaP& 5K4+Q$&Q13DcK@)0P}fF7yr6gNg^﬽ʻ˥9];aEl8~.i߮W?jiDԶ`Z/J&M E;&5~u'4Koa@cY@ I@Cܣx,mhꄸ|X}ᷱI|r1 6Xc=0u/P Xȇr4BD#4J> @ֈ &zTO6^&_xu!AϏ0}9vO;bPCEO"Z_)Sw:uĂd=xElqRn?0vJ.>>FrtQ/N`e !gb-Z"1lzAv8'˛B "A#Y눵)źeL±}_p !HѮYwvvv_ 6fqX- Vʍr:ZuqysdΞ[coGʭ͑ɏvR3wF;-vFY틳{?QbyF#MڏQ $vh ·z,nLȷ1kog*@* pcUv Kn%r@oBs~,8t%%w>׮T FuC>z%Ц%յ N纥{M8%Pe#NO\GS +$-w@ s2k1<܉ېb;a-9SjT4;]GjqyZ"44EM zm%\ Gp(Z.d %l^pA mI~_lX3xY1{긭 owޔd{~:fʹ~_nu(%zw;ΈAܾd)Q 򗈟_"dmǪ[q .;YU {.ENToi6C6if64㳉xs,esor 8 nifLNN Mɞ[S<6;ggY ^ima&zernk8&n6̏5og+jG;f̶YmlNcOp['p.I@QF$D|xLޗ+!hS7X",`f>w'8Mp߆(eEv]KܿtrXEC#y{.|Ӽ - 7XAΟUh.hV16 UJaØxi0LLt3M'@t 6=ah \{F *6 y@t`I[QPk"tfv"A f&G`@&_8 P0.}3II!=~7շRTǢW>`\,6jMCyU맏~vzȌd-%y[``!*'vm}V'g$duΎ̎^c:\$p'zr$_fNnF C.h5DMf "5[aӖ2D1O(jcD Wm_$`W֖8qw4iMK\:. uX&_.Yf0xe8qk"W-8TfQ:/54q ɌgaM^-UV2\[a)NՖ.;YPIژ`oq},*uf*BH셛MC37->ܬ&r(h\,3X)3B ʆ ۩bV\_ޭk 4mNN}C5F`w-/Qt_?EGGzt^ -RZal}T5R ^xȮ=£ yG ~ѵl:j#yl>ǿxe2Z"2(c"b729󿟺S g(KC 0}Kf2MvKv3@2g [SnxcݰjNĀMɲwzM>8ち{v˩E-5jkM=[ǭ&_VXOd֬콢כQAMNj_2#cXl7^,e 1ûy*ʉrE2'Tduso\)*)$d '0A3GFAbb]rOp3U657Tk4^IK*a2M` >jr-4 $y 5_C QI$U@[pCl 1OSkžXc5`GNWRXћgǙK/Jx0'C 83B'ӫb1Ц={.O}pS_yK 5`c ԰98QյZdk>ҩ3}GqCn)7ԘdH.!$ kS` 0Ҋ<{@PhnV撚b?,0t2HL؃q!^x ٚh=f`K uՐ-9 ^r,N8OۏqOp*8J8cAB$'h5_0Sj:]bD8t;m4`'7Ul8œ{Յ!chʆu`āۑӄ?(\˄,h$\pu0:s\?7TN],- p fT⑎{:w3&1Cf8 !/3V43ԭ3N|zv5Y žōhF "j%fpeLH}u#doAX.ݹk7\=x}Jp^>l>1"[9#K9X"ܽ~ttmbp:ή9\8(9k2\*6BRb12+#P&0M a.4oF\(dDsI\/ BA#Ă6'R<-mFp 2ðH7SyXrQ>c}&ϋv[#x[Z>AkDyPlr:zgFvo֮>ng&297ƘKNr-  -cio2!i…}ŅM.w87 ?ٞ8W7d⣽uM$o1tNccF!~'~pkȝ}vO79xJjʿ\z,YJc _)kY;Q7@o /1䭏[k/|v0wʈeCR%xzt\z A.м oDzE{?$ g8+18gDwEr}<M{yڏ*$5_7Nq'~:;]O`ECRFD&B3%Xg,۵ƚS?:..le/حwʐX.2]"2}VhUd d0L3tO7߽خ?|Ǐ9 (VNoo:okVl9&_Ñ|s >Uwr0cƒ<_h0yIB?k0bY5[.`77Bf9$X|bGޕᄐw֐_~ÐmąZֿo#+PK%G׿Ճg/o55e4U+_~ᆬ(7~Wj߻YTpr{߮rOe.}%΁CBSM8v"uY"*0#E[¥~APP-ў\DH]L:7~ŋߊ*/[ŝۊjH7R GyXp͊;V\W^XUpnДV\]VڤB͊[+{˯l>|ںA }9"}s&ykX.j['ivtEA^6B_݂E ː#SQuU%Jme㺚RTxwF}vV&] &X-K1U0n.,OGo_*W!^ IVR[ՂrVDX ;f$T4AU[(xmj45 Xe፪xiIüƄ-amѾX~ut^iowPѱ}[ n*+FZ8 hmPd k3 '@)Y `449ԴU]P?]n=I ZI`!U⣐aBY|R M!REAM(( QIs͘TUW>((,zXPp3|r|玱]EE  *|=6S/g1!RoIˤ}ak-.[Q3&R5E+K**5^߉: ,cQ6JKn9lޑ\<ȍdHȚ=G0Il24&7j< f@]we)X(sq=Êh.ڠ]{^k td!/BjxaBl"iP갉) &2D&Mt!.'FSuA7o=:zNՁ={r?^hF=~"q'7QD:k舏vY\ӈ,[B?+;/ qj}ikb3:ޱ#5kMŠ?ܻe ~O63ofHb2t)A=#! a&uu`2B ϡF! jkPcH,t$>12־K.#Il0 &TD!Q|S05B+88 Q4zknPTw L ui (wGQHMp|w?~ro/ܱnXPz:PfМPE(:)hPjjqU6wĝ4iZՏ5Eׯ|W2%*bК=7&x|7֣r?~JX&gX#YnjtWߗtPC)|ȣe=ԴPfyb9BgR7ZE iy |VJڌޒ+~+[Z]-.V*  raX UAy Q5L fU?P3 ? EV*ʯzk1, WS^gajSYA= uz|aw;Լd\}7F3Z%tĊ*,/{n)wE"܀6a:Nz-D @`QKSCSjim4* UXu 1 (O5:4+#/ZuxDo/!I]}ŽBZ~ϱڞoN5*1C8t@HI=yU}Lgs<[{=S/ `a U ~CQ{3هr0D҇95PPFZA L:æJvapǐ"b0Aw!{;4[D,WI:x LJwS]W(oTVݽvǯ곋ULK xPOPE ;B]׌r]Gߑ/hkowh"1:Cv)Sf"aJ#* @#4%^!UBL@ZP a Jd",Ew>b{G'D:K,͘0oPcӋP蹼2μ':bXPA {H {╊2Rְ΃?ˉ9O t3#_ n~TCi<3/phLta,dh :jxD"Cn4"O"͉<Y44(Rv`Hn F1`s103 m^m$ 5 Zӡ7@ߊ#5IV?`L+ڀsQy=4as#CN ?x_O[kmx{24^7T>stream xA0 ;r0gf ( Kx(c˒J@gP-ٟR: 8D_7]/1du8\wF*Ū0ųaO5`Le%XFü5i܍*owza *;>yiխ&ǎ@Ձ9IFA csyuJlFnM+:VY `:X]ؚW.ہu> b*iPtL%P\u>V u]m+(r|PFt4 V`8:;a 5r?`us^;v3UbFa \[/hϋ<=7[Fг es`:ʰ|||?3 yj?u$;g&?[;6} x[C…J %b?]/Filter/FlateDecode/Width 528/Height 327/BitsPerComponent 4/Length 3528 >>stream x훽$ ۹BGԋ r/&sd]j} 6Љ~#(DXUCnEQRWV .N D;/Qi祵7G!Ԯ(4qjWk[ vRN8O8Ü/t;d7qb'`CJ0{)?/x?KS3mC;/<r~ݾ 3ry) \ O8ÌSM*+d``Osƅhwڢ# i4 |JP qdqqH X>4~OKfZa^{?PңlPH8*Y 0hr\2rlqBs^yiJIDҳb&%QL,84#,,,R) ;,,R) ;,,R) ;,,R) ;,,R)P8r艝jEҳc1zM(TC %^ڏndSu-aHiIϑJsK6=CIAD{'Wr0T%C)Ī1('cCG,,,R) ;鍻KoJO8tX>4'翄Ђ,B>;BҼzJPK6URUA.Ġ$4gLK6P%X+ڻsHRB%RC:TSY~?9i.=z&=HXn컥RȒA^)58Dǒ3>:<㴡y|,\=zɦRJ٪1(ލLݱI=z&s*RC!Hδ0 v=;R_Hӡ$ HδzCUK^:B8x28{Awpi'0!3]b&%QH!ZyLgLK6PB 8x"8{#|fj4꿇b&%Q4%piܱI=z&s*R9c[}Tw#W%u9T}H%}wlyiOrQWj"I٥c1zM(TC{yE{W*C]rPR>٣ I! 9mYrճwb&%QH!TL䡤R}*GAB-0ēsH饔O/j@iIHz/ ճGA%شzұIZ}ֹVB٢i/5j 8qw ;׳R(X ^q8}8aN`F +LI ~{yr?Ǧ6 R/aI`"-t/>fJL vs6X/f*zrs|q B7"9XaU# h@S酖 D a;MaP$0F9(\bB .ZH3܇.\ӝbIqPCsr'PI4 Ut2F#`0[x*: _r~z ;`%bD? 0 Σb@Օ #D7qQ~/(FPF8V,\9!ba8,ZЅa|x㡈p8||H 8d2v¤;C-JaqS1 _C!ޱm8/ުMlTXȏLeH9Ӏ2pxFHCJòIGL܍14tF!E06&@p}<,X>;c{409'+?_$)U@>oc?򯁃8Ȫ;Ì-WkR6 ?xGQ‰?/PpaАEX[)\JusmonYwpF4X9.2rsx#|WF_*o|y" - ;bH8>sR=%]x1 '-RRWHEȇg+TxZY uj@VCC{ȇ4ruCr<;J2Žwa sX'y+!~Æ'pȁoݟCJ59 l>;<?߿A4k;_RgJMs@i>,]{qe‰ے.?F9!(R~_V-fcOC,GQ&|L=R%3;ѳn[0l  ZDh 5;Pk<HhAvb'&+%r`"(-ʒbJ=2cLiV{*fE:!endstream endobj 67 0 obj<]/Filter/FlateDecode/Width 633/Height 333/BitsPerComponent 2/Length 5914 >>stream xniO F9 x`ne.ɈL`WpAs6^E]ɢHy{dwf)S;zb!ϱlѪ o?vހyXR?iɝ3Ysֱ*3=!_S/!3veW[>s:0z^w5k%O^fmƓm` ͤm/ETxud2 Q˺7OEUQ(2I#ޖ4t_{xҏ36$m~o2Ѓh4"~Ժ8lj07p.9/T_oZS2/0>^x-CHtS6%oK.{m!d\g.lWN!>WxǸL<䀧TZfǮ.95Zn]-}W֕4?LᕉB8qr#Kfװ`R!=ܶi{tWb~hZYxE.^Zeչ: ?}o$jUKsnLm]CvV%=Yj^C|pfI h҅k_u+t]Gxe}clas@.1xK+ xj^{4;/kKe3A=Z*MoZO/fuE=w&.,fË mx.hY=1gsYO`Tٹaw Hr3IxYַb6Y3ùcqhǃ[-xJӵ89b/rpKk[^iwĜœ3bo&#Ux]C7N9ZO{W"k=n׵8Y鴴VֻCk9s7hy Z蛚+ڌBeqpqރԃ֌W3]SНpG|Tb<`b p&~r-7s}8/d|WBsi*{%93 :W/o?- ֚ O So#F*gxAs ջ\OWS& 1xҷ .-T\4mLzsҷ컆z5AaqijM5u}nh@ oN `q@<9F4IGAI<oI(6̕hdЉÓ{/ۓ/pY9o{z؉gҴhvkQ޺ ؉;X3 vbw5O. oWyx8t3)yx cM{ YQZj|w.seqxjq0x#9sMd2ɓ|"]鏃G[sy眧w; 3Mo c]VX<:<>|Ydj/[3zq0Qg{0q"$|@rGuoj}<ۚ9A\h|ϸ֭{w{șH?wO㹮ReX1EY7%nM=H򱻟sxwJBoΙ <:F` O`MYGQ÷05е̑_FϨ-b~ȘO&t\g0FœI<"EQg8oh#6<$QC{2 >Kl=w ^)<;@px'w6zfqI|oxO̓8h zryj~?׊}m3ʹ~:װh!W(,Aڌ n^ )<=5N&[0o:£y6l:3Ѩŝx|JxCAD ;w`<9n]B9U]q m#,í6E8w?25~g55xᆀ^/pn΄J57K7[V}/v'7h7 l^<}u.'t; B%ot[ovC:znϻ\aed]xr3 -gOm`ӦM tO᷊E$2L2sG^`j!߯N` "4zilӒ\(N^N4Fe{kv\kpivWP^} {A@.Rowm|pFNIh3$)+nI`xݽ-A7G%8uxFv&,} ^} ?̅ԹܩkxNF^,OOMDy7fVfx;I K~|钲86P|E#?D19'ޞqO짨G>j#A"^$tƹ[$X\BUaf#pל^ʌ:{8uAdX >m7r+ @LS/c쨁诚x[BD7VG_Z]֡ ߶Ƚk|5 bW(y:ҁ*Yx%H R `B\m BQu,B| 0N|6FOyzF d I^G~iBn݊gՄRu^ȁUh//sBhȇӶuj~A/z:*;DOEz$t)VzbOx2mY?Nv޾ςJM.m|5rc&б z-vaaY?p+㥐sؑ.E=>٭r9'8? ^J.$ ^ƹмDc.Ou\G>g559hTӱ >L A+P /vp}L 0592O䭦U8s/m?*t k9:pTscQț01 ^fk g[('O~R>Zv: F ,'@wݙ!έEGYv_կ/][$YoY"8? 2_%'J_E󦦈DXi1-/!NZYq)F-/_c7C{83kvH5s5ݗ:4-6 ɛDC&@"ӾMN0 ϛ37 ޝh2FЂ3*߿lJĻ5BQ"kJx8ҍj^nRC4JklxQYx 㹩a=/nժǿA*822V(GksQc<)eKy +d3d9}]F]w랮jJRxes}v#gûDѐ;fֽT6Z!d]!~M\RRZ VcA㽱dWf[*ou*uEj6ގeB7kr۹td][ݡ0$H-̎LT92qrjhqVw? [-^|֩4u^2{Tn\h! +g~xZŞH<0g=+k2Ne.3:B<\ӈ=icEᡲR x}viK!ćyw W52 e sH#8RbL.Swwiѵ KΨKu4hx&1ODt1z1;JeCg:uev,:sq6[^UǗZDX(::UXHoo_?.^?m:Nd=j~\BO5;u[Hۥ[nƹ> f¹Ų=~H`=(o@ u*%qyS}?$}S+"ŕ4 ^[Plo!ga:??ꫯ^^ibAEcJc r *M0LaS k^\P10zQ7A8u*{J97 >ȾIvI+c? QBqZϽ،ǘ멳[Ʋax{xaxrԁ,XSg^~b5#u69iՃйi(-S@vsas?|,PƎk9./,[O>b]/Filter/FlateDecode/Width 192/Height 194/BitsPerComponent 1/Length 890 >>stream x1O@2dAݍP['#:0v`Hi!K]БH V%ZFrTHxʪ>[%f@ R)ytz{9m@\̹bm21s2`[&I ?pw.П?qA|qE_q]4"7O8\CRۗ4vGZ(#.K*O1I-}7MkЖ.V=dZ;.S>kn@!c'ʏ:^`\P^NugיLr Ӌic9h_9wnM{{m(KBpmN(|x r;s̨>~}$ҿޏy e$ E߉Vݸ~]R YkYcB6y&x8u}~?0ỎUW5w W/~[xJzQ"$U9/$Wq^dgԉψ~˯Qp_8Uy?r:άsGwזO$'9o_~Lr| 9}-༤Dǿ8|2nÎZ5/&z-rCoBc~d\v~^gemNoWendstream endobj 69 0 obj<]/Filter/FlateDecode/Width 519/Height 226/BitsPerComponent 1/Length 2778 >>stream x1qTLm #\qiÅp po@ȫՉ.FRoHJEbD߼y3y#5+Yuk8^ٹn.p\bѤgpX`CPXo\K|ϑ›p?É4\b--w[_@n-ܢ 0kM.0vkG;D!\)R8]\z} }/~Kt&8Ì ۷kokxVkm/V!\gY/! dl?W,K'5WK;7riR|~jNm Ӛ W#w71`9 ;[4{/3\NUmWuX>[9wwq?c>b@Lua0$'#a@={xq-K}d u={xzD)辣3Yza@GzfWKF^ƂIz5 R-<Д;Yxn[mM7(sk;# 8ҺL*t rM4a+ 8s 4u)Jb<<7Jk,ӛ({j0>hX 0Xh @յ`5qP >@}.q^Āy?ӄy"[Y]pBAXt1`&*i vY_uΫ^XP>X?〖|M{4n=Jy@޺^Ɣ ̉c j)ΉkĵΐQuE?-`t5=t w"$X,@*ّFa93B i',țYV"Pu#LVX5IQH'3S504u5]`UWPgy$#@Zĵ\NO2@M[d!`3FtCn)nbN\&K@zYT|W74= xz~OOZZ FLʢGM 7/SU*.5 xz V @)Q?@l [9Q bR?r4&&ThZ[*Ǽ^Y]#^r+1>Y P3X kyr0gCW*Uz)&Go5 D\1[PW󁨳|[7a cJԙ3V;3D?N 9Nyߪ3D\qG2u7Ro!T'ъfuMiN~Hg:%rg>ж }s eڥtL973!wOyF\063v* ;с*m9/E9we$N?[q_Kŵ҄r]q-DŝY=+&:Ǐ TXu^|W q]ā M⹨sΉ3:y-U,@O`o8!Z4f `Ǽ&wfr 隩3|HykμJ+ÊquubQEXZHVXF:;rRE yJ1w"Qdu^sG' bL]c7Wtv 0t2͹&OAX@:c_yv' Itge )dez'B^ee#P||`c,K/l`3i738zAq(gmVgA@q maJ#uAMkA^W|BqJӗ o}5Ĝp4aWeH<&_⏲Q& >v)dL-UzLTw!Sb^p$()֞ш!mM&@zɝ[pVպQrgܭP.| {$˭gvżVvZZT=4[WN c(.f= - (sڔ7,&=ޔ=/9(s xnjU([Jֆ&d9+!7 bW+y#EuN(%޺wEX̝ECl%wz/ΰ?,.D`,rlT砇8pkp"@0.y+V&UF{ȝ`B$ĚO9KD7,t4&T 'Zt"P;?^ {~h~Tiddu-DO`M)y QgקsĂ'Μ;7 x߈Ï' ƪJ|&$%8A6wٱ0`"ڸ= q+ܵ0tv.XJoE:\܄a]@u:$smM\`sTE$(5Uv,qpk'r F`endstream endobj 70 0 obj<]/Filter/FlateDecode/Width 497/Height 226/BitsPerComponent 1/Length 1228 >>stream x홱n0SdG3t,P@! t@ AZ :ttPA <Ȇd^J#<E ϿHSD#>F @XDuBרg5M3{)j .s_)'ZWE]k@?5+E(:l? W@?w@w{B^랷<Yw=vNuj k y+k 5@G¥B5?ƓຜDH l6 ye JHiB0PiBiB(f(%5^55f. 5Mf.j|SkRmkjqj uW0"cƱR1;l|̰1W 0ǙNN HtUim/pAi)`a-p a|p a'?1i*\7G/u3OIM$n+.k}5p;يL[ڌ5ѻ]74,f7M`z[opWƫsB\GV:$cmOLy|uƌM4fX6lyfrĸh&ܮSB,qiX7!։VuZI20 OZ!aKf9Dflsx ["eHNeb8༆m 8g5lױQ8k<őedN끣k_wΏu =6nXKyG_"=v;*}YEν1}հܛF5iX7iX7NhѰg%}@ʹ,37զaEI8<1զaeIo' .3#ZmV.KzE)B낛_l^s̭a%u ^sh J|p{R>cnpġ5(Ϩ<.~vձһx¦z{ʰsXdX<"sXH@3f ayںװ&8\}x k{8a~52|:O}6$ ?FsXy4=T9ss:Vb. k#a7#a!W{5l6^sXa?7Fk̰&vo{2a~]gqJأgv_̺endstream endobj 71 0 obj<]/Filter/FlateDecode/Width 483/Height 196/BitsPerComponent 1/Length 1615 >>stream xoDۮD@B_,N=*u8J=Јh_P{ ME@(mȥ7MO,uNv:E'Ό3}ox~2.Q9\{su]||aL}w J9Da)p]ySP~6 >dN}bL1[4zGS 8@oJLIaK3keYl}YIyRXv ]n~g'^aD~:њ=|P=\=ܤna. oyQK' itbЌM9R^x$s;aXni`=|g7)ˡQAb$YM^+i0VmFimz! `jw!((^UOj"fzʥZsJΟV.cl_|:_9-.V9q#y]?7x[TAb~hDITtӘ0|Pq|Fl͉MOuk<~w)l21N ʬf_x>W>J@ZG{O vk'o\9x_=,mS4gb_x8nvwo}~}i_~jn;,LXaAz۝p~ۓ&Kd<)9\%J~;:=­fK S kxÍ+{$J]/Filter/FlateDecode/Width 187/Height 187/BitsPerComponent 2/Length 716 >>stream xXAn@ 7>= zg}p`WffErEJ[!n#Nj5&w З~ : ^BB254OFoqu8'r щGH'BӛHoHg T^s^3cP sԲBT$AH('ڱp,j\"CT2՞wݸg e}H5A3 =ObR{_{hԔٷ;OowGoEH_J-IA:y̦bVB_(SWp\ Joqp|u51hnb|RNNq2D#}Q5z\O'>tKE俧v?:N yePQ SHw$K=endstream endobj 73 0 obj<>endobj 74 0 obj<>endobj 75 0 obj<>endobj 76 0 obj<>endobj 77 0 obj<>endobj 78 0 obj<>endobj 79 0 obj<>endobj 80 0 obj<>endobj 81 0 obj<>endobj 82 0 obj<>endobj 83 0 obj<>endobj 84 0 obj<>endobj 85 0 obj<>endobj 86 0 obj<>endobj 87 0 obj<>endobj 88 0 obj<>endobj 89 0 obj<>endobj 90 0 obj<>endobj 91 0 obj<>endobj 92 0 obj<>endobj 93 0 obj<>endobj 94 0 obj<>endobj 95 0 obj<>endobj 96 0 obj<>endobj 97 0 obj<>endobj 98 0 obj<>endobj 99 0 obj<>endobj 100 0 obj<>endobj 101 0 obj<>endobj 102 0 obj[74 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R]endobj 103 0 obj<>endobj 104 0 obj<>endobj 105 0 obj<>endobj 106 0 obj<>endobj 107 0 obj<>endobj 108 0 obj<>endobj 109 0 obj<>endobj 110 0 obj<>endobj 111 0 obj<>endobj 112 0 obj<>endobj 113 0 obj<>endobj 114 0 obj<>endobj 115 0 obj<>endobj 116 0 obj<>endobj 117 0 obj<>endobj 118 0 obj<>endobj 119 0 obj<>endobj 120 0 obj<>endobj 121 0 obj<>endobj 122 0 obj<>endobj 123 0 obj<>endobj 124 0 obj<>endobj 125 0 obj<>endobj 126 0 obj<>endobj 127 0 obj<>endobj 128 0 obj<>endobj 129 0 obj[103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R]endobj 130 0 obj<>endobj 131 0 obj<>endobj 132 0 obj<>endobj 133 0 obj<>endobj 134 0 obj<>endobj 135 0 obj<>endobj 136 0 obj[130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R]endobj 137 0 obj<>endobj 138 0 obj<>endobj 139 0 obj<>endobj 140 0 obj<>endobj 141 0 obj[138 0 R 140 0 R]endobj 142 0 obj<>endobj 143 0 obj<>endobj 144 0 obj<>endobj 145 0 obj[143 0 R 144 0 R]endobj 146 0 obj<>endobj 147 0 obj<>endobj 148 0 obj<>endobj 149 0 obj<>endobj 150 0 obj[147 0 R 149 0 R]endobj 151 0 obj<>endobj 152 0 obj<>endobj 153 0 obj[152 0 R]endobj 154 0 obj<>endobj 155 0 obj[154 0 R]endobj 156 0 obj<>endobj 157 0 obj<>endobj 158 0 obj<>endobj 159 0 obj<>endobj 160 0 obj<>endobj 161 0 obj<>endobj 162 0 obj<>endobj 163 0 obj<>endobj 164 0 obj<>endobj 165 0 obj<>endobj 166 0 obj<>endobj 167 0 obj<>endobj 168 0 obj<>endobj 169 0 obj<>endobj 170 0 obj[157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R]endobj 171 0 obj<>endobj 172 0 obj<>endobj 173 0 obj<>endobj 174 0 obj<>endobj 175 0 obj<>endobj 176 0 obj<>endobj 177 0 obj<>endobj 178 0 obj<>endobj 179 0 obj<>endobj 180 0 obj<>endobj 181 0 obj<>endobj 182 0 obj<>endobj 183 0 obj[172 0 R 174 0 R 176 0 R 178 0 R 180 0 R 182 0 R]endobj 184 0 obj<>endobj 185 0 obj<>endobj 186 0 obj<>endobj 187 0 obj<>endobj 188 0 obj<>endobj 189 0 obj<>endobj 190 0 obj<>endobj 191 0 obj<>endobj 192 0 obj<>endobj 193 0 obj<>endobj 194 0 obj<>endobj 195 0 obj<>endobj 196 0 obj<>endobj 197 0 obj<>endobj 198 0 obj<>endobj 199 0 obj<>endobj 200 0 obj<>endobj 201 0 obj<>endobj 202 0 obj<>endobj 203 0 obj<>endobj 204 0 obj<>endobj 205 0 obj<>endobj 206 0 obj[185 0 R 187 0 R 189 0 R 191 0 R 193 0 R 195 0 R 197 0 R 199 0 R 201 0 R 203 0 R 205 0 R]endobj 207 0 obj<>endobj 208 0 obj<>endobj 209 0 obj<>endobj 210 0 obj<>endobj 211 0 obj<>endobj 212 0 obj<>endobj 213 0 obj<>endobj 214 0 obj<>endobj 215 0 obj[208 0 R 210 0 R 212 0 R 214 0 R]endobj 216 0 obj<>endobj 217 0 obj<>endobj 218 0 obj<>endobj 219 0 obj<>endobj 220 0 obj[217 0 R 219 0 R]endobj 221 0 obj<>endobj 222 0 obj<>endobj 223 0 obj<>endobj 224 0 obj<>endobj 225 0 obj<>endobj 226 0 obj<>endobj 227 0 obj<>endobj 228 0 obj<>endobj 229 0 obj[222 0 R 224 0 R 226 0 R 228 0 R]endobj 230 0 obj<>endobj 231 0 obj<>endobj 232 0 obj<>endobj 233 0 obj<>endobj 234 0 obj<>endobj 235 0 obj<>endobj 236 0 obj<>endobj 237 0 obj<>endobj 238 0 obj<>endobj 239 0 obj<>endobj 240 0 obj<>endobj 241 0 obj<>endobj 242 0 obj<>endobj 243 0 obj<>endobj 244 0 obj<>endobj 245 0 obj<>endobj 246 0 obj<>endobj 247 0 obj<>endobj 248 0 obj<>endobj 249 0 obj<>endobj 250 0 obj[231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 243 0 R 245 0 R 247 0 R 249 0 R]endobj 251 0 obj<>endobj 252 0 obj<>endobj 253 0 obj<>endobj 254 0 obj<>endobj 255 0 obj<>endobj 256 0 obj<>endobj 257 0 obj<>endobj 258 0 obj<>endobj 259 0 obj<>endobj 260 0 obj<>endobj 261 0 obj<>endobj 262 0 obj<>endobj 263 0 obj[252 0 R 254 0 R 256 0 R 258 0 R 260 0 R 262 0 R]endobj 264 0 obj<>endobj 265 0 obj<>endobj 266 0 obj<>endobj 267 0 obj<>endobj 268 0 obj<>endobj 269 0 obj<>endobj 270 0 obj[265 0 R 267 0 R 269 0 R]endobj 271 0 obj<>endobj 272 0 obj<>endobj 273 0 obj<>endobj 274 0 obj<>endobj 275 0 obj<>endobj 276 0 obj<>endobj 277 0 obj<>endobj 278 0 obj<>endobj 279 0 obj[272 0 R 274 0 R 276 0 R 278 0 R]endobj 280 0 obj<>endobj 281 0 obj<>endobj 282 0 obj<>endobj 283 0 obj<>endobj 284 0 obj<>endobj 285 0 obj<>endobj 286 0 obj<>endobj 287 0 obj<>endobj 288 0 obj[281 0 R 283 0 R 285 0 R 287 0 R]endobj 289 0 obj<>endobj 290 0 obj<>endobj 291 0 obj<>endobj 292 0 obj<>endobj 293 0 obj<>endobj 294 0 obj<>endobj 295 0 obj<>endobj 296 0 obj<>endobj 297 0 obj<>endobj 298 0 obj<>endobj 299 0 obj<>endobj 300 0 obj<>endobj 301 0 obj<>endobj 302 0 obj<>endobj 303 0 obj<>endobj 304 0 obj<>endobj 305 0 obj[290 0 R 292 0 R 294 0 R 296 0 R 298 0 R 300 0 R 302 0 R 304 0 R]endobj 306 0 obj<>endobj 307 0 obj<>endobj 308 0 obj<>endobj 309 0 obj<>endobj 310 0 obj<>endobj 311 0 obj<>endobj 312 0 obj<>endobj 313 0 obj<>endobj 314 0 obj[307 0 R 309 0 R 311 0 R 313 0 R]endobj 315 0 obj<>endobj 316 0 obj<>endobj 317 0 obj<>endobj 318 0 obj<>endobj 319 0 obj<>endobj 320 0 obj<>endobj 321 0 obj<>endobj 322 0 obj<>endobj 323 0 obj[316 0 R 318 0 R 320 0 R 322 0 R]endobj 324 0 obj<>endobj 325 0 obj<>endobj 326 0 obj<>endobj 327 0 obj<>endobj 328 0 obj<>endobj 329 0 obj<>endobj 330 0 obj[325 0 R 327 0 R 329 0 R]endobj 331 0 obj<>endobj 332 0 obj<>endobj 333 0 obj<>endobj 334 0 obj<>endobj 335 0 obj<>endobj 336 0 obj<>endobj 337 0 obj[332 0 R 334 0 R 336 0 R]endobj 338 0 obj<>endobj 339 0 obj<>endobj 340 0 obj<>endobj 341 0 obj<>endobj 342 0 obj<>endobj 343 0 obj<>endobj 344 0 obj[339 0 R 341 0 R 343 0 R]endobj 345 0 obj<>endobj 346 0 obj<>endobj 347 0 obj<>endobj 348 0 obj<>endobj 349 0 obj<>endobj 350 0 obj<>endobj 351 0 obj<>endobj 352 0 obj<>endobj 353 0 obj<>endobj 354 0 obj<>endobj 355 0 obj<>endobj 356 0 obj<>endobj 357 0 obj<>endobj 358 0 obj<>endobj 359 0 obj<>endobj 360 0 obj<>endobj 361 0 obj<>endobj 362 0 obj<>endobj 363 0 obj[346 0 R 348 0 R 350 0 R 352 0 R 354 0 R 356 0 R 358 0 R 360 0 R 362 0 R]endobj 364 0 obj<>endobj 365 0 obj<>endobj 366 0 obj<>endobj 367 0 obj<>endobj 368 0 obj<>endobj 369 0 obj<>endobj 370 0 obj<>endobj 371 0 obj<>endobj 372 0 obj<>endobj 373 0 obj<>endobj 374 0 obj<>endobj 375 0 obj<>endobj 376 0 obj<>endobj 377 0 obj<>endobj 378 0 obj[365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R]endobj 379 0 obj<>endobj 380 0 obj<>endobj 381 0 obj<>endobj 382 0 obj<>endobj 383 0 obj<>endobj 384 0 obj<>endobj 385 0 obj[380 0 R 382 0 R 384 0 R]endobj 386 0 obj<>endobj 387 0 obj<>endobj 388 0 obj<>endobj 389 0 obj<>endobj 390 0 obj<>endobj 391 0 obj<>endobj 392 0 obj<>endobj 393 0 obj<>endobj 394 0 obj<>endobj 395 0 obj<>endobj 396 0 obj<>endobj 397 0 obj<>endobj 398 0 obj<>endobj 399 0 obj<>endobj 400 0 obj<>endobj 401 0 obj<>endobj 402 0 obj<>endobj 403 0 obj<>endobj 404 0 obj[387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R]endobj 405 0 obj<>endobj 406 0 obj<>endobj 407 0 obj<>endobj 408 0 obj<>endobj 409 0 obj<>endobj 410 0 obj<>endobj 411 0 obj<>endobj 412 0 obj<>endobj 413 0 obj<>endobj 414 0 obj<>endobj 415 0 obj<>endobj 416 0 obj<>endobj 417 0 obj[406 0 R 408 0 R 410 0 R 412 0 R 414 0 R 416 0 R]endobj 418 0 obj<>endobj 419 0 obj<>endobj 420 0 obj[419 0 R]endobj 421 0 obj<>endobj 422 0 obj<>endobj 423 0 obj<>endobj 424 0 obj<>endobj 425 0 obj[422 0 R 424 0 R]endobj 426 0 obj<>endobj 427 0 obj<>endobj 428 0 obj<>endobj 429 0 obj<>endobj 430 0 obj<>endobj 431 0 obj<>endobj 432 0 obj<>endobj 433 0 obj<>endobj 434 0 obj<>endobj 435 0 obj<>endobj 436 0 obj[427 0 R 429 0 R 431 0 R 433 0 R 435 0 R]endobj 437 0 obj<>endobj 438 0 obj<>endobj 439 0 obj<>endobj 440 0 obj<>endobj 441 0 obj<>endobj 442 0 obj<>endobj 443 0 obj<>endobj 444 0 obj<>endobj 445 0 obj<>endobj 446 0 obj<>endobj 447 0 obj<>endobj 448 0 obj<>endobj 449 0 obj<>endobj 450 0 obj<>endobj 451 0 obj<>endobj 452 0 obj<>endobj 453 0 obj<>endobj 454 0 obj<>endobj 455 0 obj<>endobj 456 0 obj<>endobj 457 0 obj<>endobj 458 0 obj<>endobj 459 0 obj<>endobj 460 0 obj<>endobj 461 0 obj[438 0 R 440 0 R 442 0 R 444 0 R 446 0 R 448 0 R 450 0 R 452 0 R 454 0 R 456 0 R 458 0 R 460 0 R]endobj 462 0 obj<>endobj 463 0 obj<>endobj 464 0 obj<>endobj 465 0 obj<>endobj 466 0 obj<>endobj 467 0 obj<>endobj 468 0 obj<>endobj 469 0 obj<>endobj 470 0 obj[463 0 R 465 0 R 467 0 R 469 0 R]endobj 471 0 obj<>endobj 472 0 obj<>endobj 473 0 obj<>endobj 474 0 obj<>endobj 475 0 obj<>endobj 476 0 obj<>endobj 477 0 obj[472 0 R 474 0 R 476 0 R]endobj 478 0 obj<>endobj 479 0 obj<>endobj 480 0 obj<>endobj 481 0 obj<>endobj 482 0 obj<>endobj 483 0 obj<>endobj 484 0 obj<>endobj 485 0 obj<>endobj 486 0 obj<>endobj 487 0 obj<>endobj 488 0 obj<>endobj 489 0 obj<>endobj 490 0 obj<>endobj 491 0 obj<>endobj 492 0 obj<>endobj 493 0 obj<>endobj 494 0 obj<>endobj 495 0 obj<>endobj 496 0 obj<>endobj 497 0 obj<>endobj 498 0 obj<>endobj 499 0 obj<>endobj 500 0 obj<>endobj 501 0 obj<>endobj 502 0 obj[479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R]endobj 503 0 obj<>endobj 504 0 obj<>endobj 505 0 obj<>endobj 506 0 obj<>endobj 507 0 obj<>endobj 508 0 obj<>endobj 509 0 obj[504 0 R 506 0 R 508 0 R]endobj 510 0 obj<>endobj 511 0 obj<>endobj 512 0 obj<>endobj 513 0 obj<>endobj 514 0 obj<>endobj 515 0 obj<>endobj 516 0 obj[511 0 R 513 0 R 515 0 R]endobj 517 0 obj<>endobj 518 0 obj<>endobj 519 0 obj<>endobj 520 0 obj<>endobj 521 0 obj<>endobj 522 0 obj<>endobj 523 0 obj<>endobj 524 0 obj<>endobj 525 0 obj<>endobj 526 0 obj<>endobj 527 0 obj<>endobj 528 0 obj<>endobj 529 0 obj<>endobj 530 0 obj<>endobj 531 0 obj<>endobj 532 0 obj<>endobj 533 0 obj<>endobj 534 0 obj<>endobj 535 0 obj<>endobj 536 0 obj<>endobj 537 0 obj<>endobj 538 0 obj<>endobj 539 0 obj<>endobj 540 0 obj<>endobj 541 0 obj<>endobj 542 0 obj<>endobj 543 0 obj<>endobj 544 0 obj<>endobj 545 0 obj[518 0 R 520 0 R 522 0 R 524 0 R 526 0 R 528 0 R 530 0 R 532 0 R 534 0 R 536 0 R 538 0 R 540 0 R 542 0 R 544 0 R]endobj 546 0 obj<>endobj 547 0 obj<>endobj 548 0 obj<>endobj 549 0 obj<>endobj 550 0 obj<>endobj 551 0 obj<>endobj 552 0 obj<>endobj 553 0 obj<>endobj 554 0 obj[547 0 R 549 0 R 551 0 R 553 0 R]endobj 555 0 obj<>endobj 556 0 obj<>endobj 557 0 obj<>endobj 558 0 obj<>endobj 559 0 obj<>endobj 560 0 obj<>endobj 561 0 obj[556 0 R 558 0 R 560 0 R]endobj 562 0 obj<>endobj 563 0 obj<>endobj 564 0 obj<>endobj 565 0 obj<>endobj 566 0 obj<>endobj 567 0 obj<>endobj 568 0 obj<>endobj 569 0 obj<>endobj 570 0 obj<>endobj 571 0 obj<>endobj 572 0 obj<>endobj 573 0 obj<>endobj 574 0 obj<>endobj 575 0 obj<>endobj 576 0 obj<>endobj 577 0 obj<>endobj 578 0 obj<>endobj 579 0 obj<>endobj 580 0 obj<>endobj 581 0 obj<>endobj 582 0 obj[563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R]endobj 583 0 obj<>endobj 584 0 obj<>endobj 585 0 obj<>endobj 586 0 obj<>endobj 587 0 obj<>endobj 588 0 obj<>endobj 589 0 obj<>endobj 590 0 obj<>endobj 591 0 obj<>endobj 592 0 obj<>endobj 593 0 obj<>endobj 594 0 obj<>endobj 595 0 obj<>endobj 596 0 obj<>endobj 597 0 obj<>endobj 598 0 obj<>endobj 599 0 obj<>endobj 600 0 obj<>endobj 601 0 obj<>endobj 602 0 obj<>endobj 603 0 obj<>endobj 604 0 obj<>endobj 605 0 obj[584 0 R 586 0 R 588 0 R 590 0 R 592 0 R 594 0 R 596 0 R 598 0 R 600 0 R 602 0 R 604 0 R]endobj 606 0 obj<>endobj 607 0 obj<>endobj 608 0 obj<>endobj 609 0 obj<>endobj 610 0 obj<>endobj 611 0 obj<>endobj 612 0 obj<>endobj 613 0 obj<>endobj 614 0 obj<>endobj 615 0 obj<>endobj 616 0 obj<>endobj 617 0 obj<>endobj 618 0 obj<>endobj 619 0 obj<>endobj 620 0 obj<>endobj 621 0 obj<>endobj 622 0 obj<>endobj 623 0 obj<>endobj 624 0 obj<>endobj 625 0 obj<>endobj 626 0 obj<>endobj 627 0 obj<>endobj 628 0 obj<>endobj 629 0 obj<>endobj 630 0 obj<>endobj 631 0 obj<>endobj 632 0 obj[607 0 R 609 0 R 611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R]endobj 633 0 obj<>endobj 634 0 obj<>endobj 635 0 obj<>endobj 636 0 obj<>endobj 637 0 obj<>endobj 638 0 obj<>endobj 639 0 obj<>endobj 640 0 obj<>endobj 641 0 obj<>endobj 642 0 obj<>endobj 643 0 obj<>endobj 644 0 obj<>endobj 645 0 obj[634 0 R 636 0 R 638 0 R 640 0 R 642 0 R 644 0 R]endobj 646 0 obj<>endobj 647 0 obj<>endobj 648 0 obj<>endobj 649 0 obj<>endobj 650 0 obj<>endobj 651 0 obj<>endobj 652 0 obj<>endobj 653 0 obj<>endobj 654 0 obj<>endobj 655 0 obj<>endobj 656 0 obj<>endobj 657 0 obj<>endobj 658 0 obj[647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R]endobj 659 0 obj<>endobj 660 0 obj<>endobj 661 0 obj<>endobj 662 0 obj<>endobj 663 0 obj<>endobj 664 0 obj<>endobj 665 0 obj<>endobj 666 0 obj<>endobj 667 0 obj<>endobj 668 0 obj<>endobj 669 0 obj<>endobj 670 0 obj<>endobj 671 0 obj[660 0 R 662 0 R 664 0 R 666 0 R 668 0 R 670 0 R]endobj 672 0 obj<>endobj 673 0 obj<>endobj 674 0 obj<>endobj 675 0 obj<>endobj 676 0 obj<>endobj 677 0 obj<>endobj 678 0 obj<>endobj 679 0 obj<>endobj 680 0 obj<>endobj 681 0 obj<>endobj 682 0 obj<>endobj 683 0 obj<>endobj 684 0 obj<>endobj 685 0 obj<>endobj 686 0 obj<>endobj 687 0 obj<>endobj 688 0 obj<>endobj 689 0 obj<>endobj 690 0 obj<>endobj 691 0 obj<>endobj 692 0 obj<>endobj 693 0 obj<>endobj 694 0 obj<>endobj 695 0 obj<>endobj 696 0 obj<>endobj 697 0 obj<>endobj 698 0 obj<>endobj 699 0 obj<>endobj 700 0 obj<>endobj 701 0 obj<>endobj 702 0 obj[673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R]endobj 703 0 obj<>endobj 704 0 obj<>endobj 705 0 obj<>endobj 706 0 obj<>endobj 707 0 obj<>endobj 708 0 obj<>endobj 709 0 obj<>endobj 710 0 obj<>endobj 711 0 obj<>endobj 712 0 obj<>endobj 713 0 obj<>endobj 714 0 obj<>endobj 715 0 obj<>endobj 716 0 obj<>endobj 717 0 obj<>endobj 718 0 obj<>endobj 719 0 obj<>endobj 720 0 obj<>endobj 721 0 obj<>endobj 722 0 obj<>endobj 723 0 obj<>endobj 724 0 obj<>endobj 725 0 obj<>endobj 726 0 obj<>endobj 727 0 obj<>endobj 728 0 obj<>endobj 729 0 obj<>endobj 730 0 obj<>endobj 731 0 obj<>endobj 732 0 obj<>endobj 733 0 obj[704 0 R 706 0 R 708 0 R 710 0 R 712 0 R 714 0 R 716 0 R 718 0 R 720 0 R 722 0 R 724 0 R 726 0 R 728 0 R 730 0 R 732 0 R]endobj 734 0 obj<>endobj 735 0 obj<>endobj 736 0 obj<>endobj 737 0 obj<>endobj 738 0 obj<>endobj 739 0 obj<>endobj 740 0 obj<>endobj 741 0 obj<>endobj 742 0 obj<>endobj 743 0 obj<>endobj 744 0 obj<>endobj 745 0 obj<>endobj 746 0 obj<>endobj 747 0 obj<>endobj 748 0 obj<>endobj 749 0 obj<>endobj 750 0 obj<>endobj 751 0 obj<>endobj 752 0 obj<>endobj 753 0 obj<>endobj 754 0 obj<>endobj 755 0 obj<>endobj 756 0 obj<>endobj 757 0 obj<>endobj 758 0 obj[735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R]endobj 759 0 obj<>endobj 760 0 obj<>endobj 761 0 obj<>endobj 762 0 obj<>endobj 763 0 obj<>endobj 764 0 obj<>endobj 765 0 obj<>endobj 766 0 obj<>endobj 767 0 obj<>endobj 768 0 obj<>endobj 769 0 obj[760 0 R 762 0 R 764 0 R 766 0 R 768 0 R]endobj 770 0 obj<>endobj 771 0 obj<>endobj 772 0 obj<>endobj 773 0 obj<>endobj 774 0 obj<>endobj 775 0 obj<>endobj 776 0 obj<>endobj 777 0 obj<>endobj 778 0 obj<>endobj 779 0 obj<>endobj 780 0 obj<>endobj 781 0 obj<>endobj 782 0 obj<>endobj 783 0 obj<>endobj 784 0 obj<>endobj 785 0 obj<>endobj 786 0 obj<>endobj 787 0 obj<>endobj 788 0 obj<>endobj 789 0 obj<>endobj 790 0 obj<>endobj 791 0 obj<>endobj 792 0 obj<>endobj 793 0 obj<>endobj 794 0 obj[771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R]endobj 795 0 obj<>endobj 796 0 obj<>endobj 797 0 obj<>endobj 798 0 obj<>endobj 799 0 obj<>endobj 800 0 obj<>endobj 801 0 obj<>endobj 802 0 obj<>endobj 803 0 obj<>endobj 804 0 obj<>endobj 805 0 obj<>endobj 806 0 obj<>endobj 807 0 obj<>endobj 808 0 obj<>endobj 809 0 obj[796 0 R 798 0 R 800 0 R 802 0 R 804 0 R 806 0 R 808 0 R]endobj 810 0 obj<>endobj 811 0 obj<>endobj 812 0 obj<>endobj 813 0 obj<>endobj 814 0 obj<>endobj 815 0 obj<>endobj 816 0 obj<>endobj 817 0 obj<>endobj 818 0 obj<>endobj 819 0 obj<>endobj 820 0 obj<>endobj 821 0 obj<>endobj 822 0 obj<>endobj 823 0 obj<>endobj 824 0 obj<>endobj 825 0 obj<>endobj 826 0 obj<>endobj 827 0 obj<>endobj 828 0 obj<>endobj 829 0 obj<>endobj 830 0 obj<>endobj 831 0 obj<>endobj 832 0 obj[811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R]endobj 833 0 obj<>endobj 834 0 obj<>endobj 835 0 obj<>endobj 836 0 obj<>endobj 837 0 obj<>endobj 838 0 obj<>endobj 839 0 obj[834 0 R 836 0 R 838 0 R]endobj 840 0 obj<>endobj 841 0 obj<>endobj 842 0 obj<>endobj 843 0 obj<>endobj 844 0 obj<>endobj 845 0 obj<>endobj 846 0 obj<>endobj 847 0 obj<>endobj 848 0 obj<>endobj 849 0 obj<>endobj 850 0 obj<>endobj 851 0 obj<>endobj 852 0 obj<>endobj 853 0 obj<>endobj 854 0 obj<>endobj 855 0 obj<>endobj 856 0 obj[841 0 R 843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R]endobj 857 0 obj<>endobj 858 0 obj<>endobj 859 0 obj<>endobj 860 0 obj<>endobj 861 0 obj<>endobj 862 0 obj<>endobj 863 0 obj<>endobj 864 0 obj<>endobj 865 0 obj<>endobj 866 0 obj<>endobj 867 0 obj<>endobj 868 0 obj<>endobj 869 0 obj<>endobj 870 0 obj<>endobj 871 0 obj<>endobj 872 0 obj<>endobj 873 0 obj<>endobj 874 0 obj<>endobj 875 0 obj<>endobj 876 0 obj<>endobj 877 0 obj<>endobj 878 0 obj<>endobj 879 0 obj<>endobj 880 0 obj<>endobj 881 0 obj[858 0 R 860 0 R 862 0 R 864 0 R 866 0 R 868 0 R 870 0 R 872 0 R 874 0 R 876 0 R 878 0 R 880 0 R]endobj 882 0 obj<>endobj 883 0 obj<>endobj 884 0 obj<>endobj 885 0 obj<>endobj 886 0 obj<>endobj 887 0 obj<>endobj 888 0 obj<>endobj 889 0 obj<>endobj 890 0 obj<>endobj 891 0 obj<>endobj 892 0 obj<>endobj 893 0 obj<>endobj 894 0 obj<>endobj 895 0 obj<>endobj 896 0 obj<>endobj 897 0 obj<>endobj 898 0 obj<>endobj 899 0 obj<>endobj 900 0 obj<>endobj 901 0 obj<>endobj 902 0 obj[883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R]endobj 903 0 obj<>endobj 904 0 obj<>endobj 905 0 obj<>endobj 906 0 obj<>endobj 907 0 obj<>endobj 908 0 obj<>endobj 909 0 obj<>endobj 910 0 obj<>endobj 911 0 obj<>endobj 912 0 obj<>endobj 913 0 obj<>endobj 914 0 obj<>endobj 915 0 obj<>endobj 916 0 obj<>endobj 917 0 obj<>endobj 918 0 obj<>endobj 919 0 obj<>endobj 920 0 obj<>endobj 921 0 obj[904 0 R 906 0 R 908 0 R 910 0 R 912 0 R 914 0 R 916 0 R 918 0 R 920 0 R]endobj 922 0 obj<>endobj 923 0 obj<>endobj 924 0 obj<>endobj 925 0 obj<>endobj 926 0 obj<>endobj 927 0 obj<>endobj 928 0 obj<>endobj 929 0 obj<>endobj 930 0 obj<>endobj 931 0 obj<>endobj 932 0 obj<>endobj 933 0 obj<>endobj 934 0 obj[923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R]endobj 935 0 obj<>endobj 936 0 obj<>endobj 937 0 obj<>endobj 938 0 obj<>endobj 939 0 obj<>endobj 940 0 obj<>endobj 941 0 obj<>endobj 942 0 obj<>endobj 943 0 obj<>endobj 944 0 obj<>endobj 945 0 obj<>endobj 946 0 obj<>endobj 947 0 obj[936 0 R 938 0 R 940 0 R 942 0 R 944 0 R 946 0 R]endobj 948 0 obj<>endobj 949 0 obj<>endobj 950 0 obj<>endobj 951 0 obj<>endobj 952 0 obj<>endobj 953 0 obj<>endobj 954 0 obj<>endobj 955 0 obj<>endobj 956 0 obj[949 0 R 951 0 R 953 0 R 955 0 R]endobj 957 0 obj<>endobj 958 0 obj<>endobj 959 0 obj<>endobj 960 0 obj<>endobj 961 0 obj<>endobj 962 0 obj<>endobj 963 0 obj<>endobj 964 0 obj<>endobj 965 0 obj<>endobj 966 0 obj<>endobj 967 0 obj<>endobj 968 0 obj<>endobj 969 0 obj<>endobj 970 0 obj<>endobj 971 0 obj<>endobj 972 0 obj<>endobj 973 0 obj<>endobj 974 0 obj<>endobj 975 0 obj<>endobj 976 0 obj<>endobj 977 0 obj[958 0 R 960 0 R 962 0 R 964 0 R 966 0 R 968 0 R 970 0 R 972 0 R 974 0 R 976 0 R]endobj 978 0 obj<>endobj 979 0 obj<>endobj 980 0 obj<>endobj 981 0 obj<>endobj 982 0 obj<>endobj 983 0 obj<>endobj 984 0 obj<>endobj 985 0 obj<>endobj 986 0 obj<>endobj 987 0 obj<>endobj 988 0 obj<>endobj 989 0 obj<>endobj 990 0 obj<>endobj 991 0 obj<>endobj 992 0 obj<>endobj 993 0 obj<>endobj 994 0 obj<>endobj 995 0 obj<>endobj 996 0 obj[979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 991 0 R 993 0 R 995 0 R]endobj 997 0 obj<>endobj 998 0 obj<>endobj 999 0 obj<>endobj 1000 0 obj<>endobj 1001 0 obj<>endobj 1002 0 obj<>endobj 1003 0 obj<>endobj 1004 0 obj<>endobj 1005 0 obj<>endobj 1006 0 obj<>endobj 1007 0 obj<>endobj 1008 0 obj<>endobj 1009 0 obj<>endobj 1010 0 obj<>endobj 1011 0 obj<>endobj 1012 0 obj<>endobj 1013 0 obj<>endobj 1014 0 obj<>endobj 1015 0 obj<>endobj 1016 0 obj<>endobj 1017 0 obj[998 0 R 1000 0 R 1002 0 R 1004 0 R 1006 0 R 1008 0 R 1010 0 R 1012 0 R 1014 0 R 1016 0 R]endobj 1018 0 obj<>endobj 1019 0 obj<>endobj 1020 0 obj<>endobj 1021 0 obj<>endobj 1022 0 obj<>endobj 1023 0 obj<>endobj 1024 0 obj<>endobj 1025 0 obj<>endobj 1026 0 obj<>endobj 1027 0 obj<>endobj 1028 0 obj<>endobj 1029 0 obj<>endobj 1030 0 obj<>endobj 1031 0 obj<>endobj 1032 0 obj<>endobj 1033 0 obj<>endobj 1034 0 obj<>endobj 1035 0 obj<>endobj 1036 0 obj[1019 0 R 1021 0 R 1023 0 R 1025 0 R 1027 0 R 1029 0 R 1031 0 R 1033 0 R 1035 0 R]endobj 1037 0 obj<>endobj 1038 0 obj<>endobj 1039 0 obj<>endobj 1040 0 obj<>endobj 1041 0 obj<>endobj 1042 0 obj<>endobj 1043 0 obj<>endobj 1044 0 obj<>endobj 1045 0 obj<>endobj 1046 0 obj<>endobj 1047 0 obj<>endobj 1048 0 obj<>endobj 1049 0 obj[1038 0 R 1040 0 R 1042 0 R 1044 0 R 1046 0 R 1048 0 R]endobj 1050 0 obj<>endobj 1051 0 obj<>endobj 1052 0 obj[1051 0 R]endobj 1053 0 obj<>endobj 1054 0 obj<>endobj 1055 0 obj<>endobj 1056 0 obj<>endobj 1057 0 obj<>endobj 1058 0 obj<>endobj 1059 0 obj<>endobj 1060 0 obj<>endobj 1061 0 obj[1054 0 R 1056 0 R 1058 0 R 1060 0 R]endobj 1062 0 obj<>endobj 1063 0 obj<>endobj 1064 0 obj<>endobj 1065 0 obj<>endobj 1066 0 obj<>endobj 1067 0 obj<>endobj 1068 0 obj<>endobj 1069 0 obj<>endobj 1070 0 obj<>endobj 1071 0 obj<>endobj 1072 0 obj<>endobj 1073 0 obj<>endobj 1074 0 obj<>endobj 1075 0 obj<>endobj 1076 0 obj<>endobj 1077 0 obj<>endobj 1078 0 obj[1063 0 R 1065 0 R 1067 0 R 1069 0 R 1071 0 R 1073 0 R 1075 0 R 1077 0 R]endobj 1079 0 obj<>endobj 1080 0 obj<>endobj 1081 0 obj<>endobj 1082 0 obj<>endobj 1083 0 obj<>endobj 1084 0 obj<>endobj 1085 0 obj<>endobj 1086 0 obj<>endobj 1087 0 obj<>endobj 1088 0 obj<>endobj 1089 0 obj<>endobj 1090 0 obj<>endobj 1091 0 obj[1080 0 R 1082 0 R 1084 0 R 1086 0 R 1088 0 R 1090 0 R]endobj 1092 0 obj<>endobj 1093 0 obj<>endobj 1094 0 obj<>endobj 1095 0 obj<>endobj 1096 0 obj<>endobj 1097 0 obj<>endobj 1098 0 obj<>endobj 1099 0 obj<>endobj 1100 0 obj<>endobj 1101 0 obj<>endobj 1102 0 obj<>endobj 1103 0 obj<>endobj 1104 0 obj<>endobj 1105 0 obj<>endobj 1106 0 obj<>endobj 1107 0 obj<>endobj 1108 0 obj<>endobj 1109 0 obj<>endobj 1110 0 obj<>endobj 1111 0 obj<>endobj 1112 0 obj[1093 0 R 1095 0 R 1097 0 R 1099 0 R 1101 0 R 1103 0 R 1105 0 R 1107 0 R 1109 0 R 1111 0 R]endobj 1113 0 obj<>endobj 1114 0 obj<>endobj 1115 0 obj<>endobj 1116 0 obj<>endobj 1117 0 obj<>endobj 1118 0 obj<>endobj 1119 0 obj<>endobj 1120 0 obj<>endobj 1121 0 obj<>endobj 1122 0 obj<>endobj 1123 0 obj<>endobj 1124 0 obj<>endobj 1125 0 obj<>endobj 1126 0 obj<>endobj 1127 0 obj<>endobj 1128 0 obj<>endobj 1129 0 obj<>endobj 1130 0 obj<>endobj 1131 0 obj[1114 0 R 1116 0 R 1118 0 R 1120 0 R 1122 0 R 1124 0 R 1126 0 R 1128 0 R 1130 0 R]endobj 1132 0 obj<>endobj 1133 0 obj<>endobj 1134 0 obj<>endobj 1135 0 obj<>endobj 1136 0 obj<>endobj 1137 0 obj<>endobj 1138 0 obj<>endobj 1139 0 obj<>endobj 1140 0 obj<>endobj 1141 0 obj<>endobj 1142 0 obj<>endobj 1143 0 obj<>endobj 1144 0 obj<>endobj 1145 0 obj<>endobj 1146 0 obj<>endobj 1147 0 obj<>endobj 1148 0 obj<>endobj 1149 0 obj<>endobj 1150 0 obj<>endobj 1151 0 obj<>endobj 1152 0 obj<>endobj 1153 0 obj<>endobj 1154 0 obj<>endobj 1155 0 obj<>endobj 1156 0 obj<>endobj 1157 0 obj<>endobj 1158 0 obj<>endobj 1159 0 obj<>endobj 1160 0 obj<>endobj 1161 0 obj<>endobj 1162 0 obj<>endobj 1163 0 obj<>endobj 1164 0 obj<>endobj 1165 0 obj<>endobj 1166 0 obj<>endobj 1167 0 obj<>endobj 1168 0 obj<>endobj 1169 0 obj<>endobj 1170 0 obj<>endobj 1171 0 obj<>endobj 1172 0 obj<>endobj 1173 0 obj<>endobj 1174 0 obj<>endobj 1175 0 obj<>endobj 1176 0 obj<>endobj 1177 0 obj<>endobj 1178 0 obj<>endobj 1179 0 obj<>endobj 1180 0 obj<>endobj 1181 0 obj<>endobj 1182 0 obj<>endobj 1183 0 obj<>endobj 1184 0 obj<>endobj 1185 0 obj<>endobj 1186 0 obj<>endobj 1187 0 obj<>endobj 1188 0 obj<>endobj 1189 0 obj<>endobj 1190 0 obj<>endobj 1191 0 obj<>endobj 1192 0 obj<>endobj 1193 0 obj<>endobj 1194 0 obj<>endobj 1195 0 obj<>endobj 1196 0 obj<>endobj 1197 0 obj<>endobj 1198 0 obj<>endobj 1199 0 obj<>endobj 1200 0 obj<>endobj 1201 0 obj<>endobj 1202 0 obj<>endobj 1203 0 obj<>endobj 1204 0 obj<>endobj 1205 0 obj<>endobj 1206 0 obj<>endobj 1207 0 obj<>endobj 1208 0 obj<>endobj 1209 0 obj<>endobj 1210 0 obj<>endobj 1211 0 obj<>endobj 1212 0 obj<>endobj 1213 0 obj<>endobj 1214 0 obj<>endobj 1215 0 obj<>endobj 1216 0 obj<>endobj 1217 0 obj<>endobj 1218 0 obj<>endobj 1219 0 obj<>endobj 1220 0 obj<>endobj 1221 0 obj<>endobj 1222 0 obj<>endobj 1223 0 obj<>endobj 1224 0 obj<>endobj 1225 0 obj<>endobj 1226 0 obj<>endobj 1227 0 obj<>endobj 1228 0 obj<>endobj 1229 0 obj<>endobj 1230 0 obj<>endobj 1231 0 obj<>endobj 1232 0 obj<>endobj 1233 0 obj<>endobj 1234 0 obj<>endobj 1235 0 obj<>endobj 1236 0 obj<>endobj 1237 0 obj<>endobj 1238 0 obj<>endobj 1239 0 obj<>endobj 1240 0 obj<>endobj 1241 0 obj<>endobj 1242 0 obj<>endobj 1243 0 obj<>/XObject<>>>>>endobj 1244 0 obj<>stream x=N0~9R؎c+($&u~Q=Nh97Wh -N\a.0FiY.vd 8JD ?:h 8BM)׷C_E{f1+3ŵoE~zIwҩMozL.xkLB etC ߌ#1sU;.I@Aendstream endobj 1245 0 obj<>/XObject<<>>>>/Annots 102 0 R>>endobj 1246 0 obj<>stream xZےE }߯7 N_ VYS<;$BznP<%sܠymKBho-Q- E3]fLF>bCL|3M,>c뮟R _.Cd Ǟmr_p..ar.k/]v$.뵭0Kk%i6Y^Os>>^`%f/M{#wb^XBNad-6bqeV:Gu1GҠi~Z z|OS(/r96m\qDLN|&JSn6"dk{NrDakDNШs1+N ~{8{g֛UpÓMŸ,\8汍'PPLiqt]?z=7 i8U:w۱/o.ۋ'׆tjWgGŋS$˛ֶWc?=#v0FqE¯n7W[JtMwf9ȂVҝߓWl}y[·3x\4\ؕ jbS?&뎴Ig j゚ +"؀uO?]HtN@ĝλj!g8{ϐ[{i[r}_JBV!զ_#Gk%_զK)~_r'<+endstream endobj 1247 0 obj<>/XObject<<>>>>/Annots 129 0 R>>endobj 1248 0 obj<>stream xZn6}W1(7ۈ1Y^˶U*o_339Roq\I%De"Zm89Dyn,Di\ Md(7"81/OT 9&>4QMy ˸V.&bʿ^g-s xa=D&2!S2FDY*0$J<(7QUa v%`@2XLPDOAJABAЄTOM 9P;B[F& OYζ(JXن#PIjӸZ:XI!xVĚ,c8c,m'5X8)X"UlXR\j ADLF;yRcZb['daXf5[bB:-͓ߴ܀ >P r8lQp m&S"6sEܲ b!KRcHX m(Z@LDA'5&zVĦ%e:dm'5ؚb!X9YKFҬ,F^ f8ds<)ja14MA 8ikB5TbfKCiIY`\*#E7p +8⨔u \YG\-0w,E `HVl44*)bgR*сb3*)U?RI e^8OT,Y0qdٖM6!#,yA@u4QA$ y8vSI}Fm8 (\Lvc CLRhd+ڕ0Uc5,px0ZrJ-2Me 7I\Z66o~k_XM]")d ݼcz}m8z_<^%#mWCjv]TJxJ:%QCʒĨ(_}1t6 ?O{ˮF-LA܇YMY0+ AF tP+ٹm 錴߅뷋*jEJG8I1~nW͂V )y04HS`+QaҊI4 ;CvjzV'n3ƿ$,Lȟ(Z256ea8K]By?yOѵAIxmfr~JI! LJzü^6 ~^pE{YNoJB+ɷ J2"Ʈ!\hy \pz!w ;1yu9fv$%OGlV;>MY#+_5C3ۜ;̲0n^LOȺ)js<0W+y֝nZ|ޜ-Mh'3_%p18%jVЎ5^_\% f{ka<{┹IԬ*\|\%ذSsSIM0.OE$ cӭk﫰1*ٕK8N $^dܶl9#n s3ϏCAr-nEq3}{e }sjv$S4bmيO:i@=IvNt{OPa1FLJr.ǧ|L4R IRhg4YSUw)wK"{s>S|ґCwص_ij zEj3fI5ldl/E3\{TS,#OKӒxr.}xh~qe5`LUב dbendstream endobj 1249 0 obj<>/XObject<<>>>>/Annots 136 0 R>>endobj 1250 0 obj<>stream x͕n0EY OekFEQ>@eC,%"a"3 A? N`{\42V#~5<,yo錥(Zԣ`/Gs3(KGp`/(5L53\BSMn%JIxӢQ\=)L55m&96.jlZt'#VL!b`i/S_T$nU&q}%U/mcu_=FhE5؂]^<%{XM_6SgqT~]NKgnөx&dk1ug0~ f4:KtD !JA'&eZ#`? :vS uKʢCLI.KyR u)F[4=[jbە\>/XObject<<>>>>>>endobj 1252 0 obj<>stream xmVr8+t+-)'viwS:/LL̯ٚVZ5SQ;nglGZ?vwqsG[άh[,ew)vbs>r]Zެ8:oi]g[>- COދsiwA9#TRx%Rg l>xQUH٣VFҖ".=s +ZSr!u^Mą!#nQcz~hKœvxWMPjC@Q]"y*\I " W!(3z2B)ft: 9me FDVuh`SvO \b]S`BtxTA-~ AGJ=BլJ:TP n{\^KúDW]fp:Y,nfiTX@k-$x& mJemR:z֝{#5jBdK2|Ch6zYi@;pUmTr|/R!wOW a'IeZ";t0yt0ì>= rzqI x.uD5̫=H[E&h:wU4t3mCGgŮb*\^æ@Xu H"Z#>/XObject<<>>>>>>endobj 1254 0 obj<>stream xWn8+l'nMvZln(R%}3l.آ8޼y3q3~洼{*Y1×_aGqjQ,h]ɩ?hJz\wʚtf<:/V 9Z5m典WAWƇ#VG]̸vηhӘbRm)W{G!#!*}Zh&y5p>P7&=AA*ˮJ=mF@ eg*q.[tJ%RفI sHoi7<~0Ή+Qo_u#/9Hr=VSQ䯒tvoBPk:|5)(t,1*&tyUDLﻪڣB nwF36.2X)tؓh*]M;g+YGIS;*:NE;PikR *./ƠvAKLcg OKẋUӠBP;SrjЊZ4K[ФLLl;&iTn< ؄=QdB0/;*tRk J},r hN`sTJ/D-I[[DpUΚ4,cMd`f%_HPb5=L$Rp3'˅NۓU@fWIt8A# ]:7BR0܁S| Hi2!(Ey!W9^> dJX0 lovlK[P?U7l0W ƈ5hȂS.jzc"7):4@No_FcBP^xOT/qGXGV׀|L?޲.L~iO148xr}>1,#+/d pFh3teHeU18eB&{škPt^ұ`؏PO;h@;wLj[Joh) t$whݘj>7s5r iW"ﰷ0Y EtTϴ Nt$ppWz!Y&l xf=ԯJT=c"O9W/t} m[AhtET-rOV/S\&;ӯJ7dv 8P$PFGSK%$ AAOnnf6Ʋ5NSqr,NS #݋zLk,vhc3yzW7A d@9ZN.r G2p%p\}\,b&5oy γw:%kdxa=ioY4- ϛhj'endstream endobj 1255 0 obj<>/XObject<>>>>>endobj 1256 0 obj<>stream xuUMo8W zrX,%YpoP"Jo(U-'1?f޼f>/XObject<<>>>>>>endobj 1258 0 obj<>stream xVKsF+e #`yF6O9$+.#hgFvz[[nU2i{R/+h6qIiJ}ڬy<4SVA7"DNQNmXx \AU $Ka0_Fd=pM||ǛI{R!e DP7Ek'i (30=jiM~':֑$UZpL?TM2L-%tcƢi*-I C0зe$*(Hߡkeh0ц,0ىZͱhugLS&ʝ=@RogtAp*t%200_*9Nq(TJDUj i *y4 4S15 e +З8*husMQ" }BqV*fz,PS_ZT~?lCư-[;!9]%>k@xpyj$Șguamg50$]c@mkɷuM7, Gendstream endobj 1259 0 obj<>/XObject<<>>>>>>endobj 1260 0 obj<>stream xn0 ~ SVرcW=0̽ȴUh"1[x88CK Qו ZTIs6:Q:O)gТ98ӕLڐg3d0J|ջk0h9ir>Vl\<9:f}Empoq)k5ȶanyOن{9hg4Ia.FTm ySlS5H~x4F[ZܮBmuM:{endstream endobj 1261 0 obj<>/XObject<<>>>>/Annots 141 0 R>>endobj 1262 0 obj<>stream xWr6}W2#AUT:#;։UIqP$d3% *`zI3Ş={Dž`jC]LWNo)xAc3G:^<.؁,=6)lVKueBQy^$sxKH+3~01:SNMH;5cnkH=!] N,- hLyrŀh1H4.V?`]ǘp*/Ck+56f7_`K.ٔ ]vd\۬Bi)0!5$1k2.` e&3N;45Y3uβG\Gp;rA*P\6 TLyiB2H1uh!N`H1ECSxjʝ h@fC.h1H4.V?`]ǘ& p*/b|3Ñ-^8ifd7u4|.*ɟpY'i cXyNo(sfWs x =.|6r`3)){XD90n'TYڅD"$/acH(JDN'0hp# Ry,r<` )KCEP ^R ۂQ2QV-"zIY="뎱& d]FO>yIF|l8;y(e?W# 8B%#<ޤX-pkzl2^=ZCXC<'nIUe*^&+P,+dShrS>Һc(~/+-DI9ݗ!~ З Kb]Ծ !'y>U Ssd:Ѯ/K|]$yɋW^(ZS$žTd?1Oa`dnX;8q/0A. 6Hyş޴]J jCX̗ۇCʋֆs_T8@W\T$EG?9B'W7< k=XH՗([صg6 77jޑ2lv 8Ƕ-eRn9v>E6Xh} _$ 7) =$lkߥ?Pxl5LA/oאnM"R#0Jbȝ2ߑ8'?Gk$*(9@x69a4=U[̱g'{K؞#DZl"6}::"TmqO/c6rmا;ѕfo\Qg>GfI|qGUZUx%IyQ]q5dH҇F4*L6cIg)U8ϰԩU &,[_/yendstream endobj 1263 0 obj<>/XObject<<>>>>>>endobj 1264 0 obj<>stream xYOH_1ˉ8SGr`**!U&1*]ۡ忿M=^Ȏ{3v0 N`=c\}T`:Og2 qmJ&)~TKHxU$MtP26|$,$84#lC:Q8&nNE!q|v42I\rm/u.E0wOfLd8F̅qә\!q|vz8ƛC/aPR.Ԕ6Y`2NɌ) Lj4~: 1N>AL$s<\rl/dI"U;'ӦH2#B8Ft.8t>;i=|D~LrM^j&cPa蘭̘"p1Ogr8ơ٩y?U.E* )jL-RAl.~2m$1b.4cN" qC糓gsE( !ݔ6Y`2NɌ) Hi#t&Ac:Ğ\rl/E0wOfLd8F̅qә\!q|vzS% @ʅ& L 6I?1E11Ogr8ơI>" 5e{M-BAl.~2c 1b.4c"qCSGD>& 5e{I&KL 6I?6E11Os8ơI"'+>0\tSd"T;'32#墧qә\!q|vz83s, @ʅ& L 6I?1E11Ogr8ơIмht'GBaHPSd"T;'32#B8FL.8teoO'=@Lb|[5ac|&h P1oME80\!M~)T=jH(H*_Bڲ[1Z heIDn>}.ӟ!DD?;5vNosH5j6<u}s$SKe7"V1#%Y7fWVнt}4»>[jIږMǬJx8:E~ĕq~0S0L*Q9_fsW qZ>]R3LM"uzn]ߌ M*{H+.N揁h˂z۽x=QIhlh7Xu_J ,--.((4l>/XObject<<>>>>/Annots 145 0 R>>endobj 1266 0 obj<>stream xXrH}WS!q:.j $Āf[$~ w6ݧ{ri#&WCg˷+w2t\gCǧ)U|ga:w>N)yxXǁiSA,~JpY8m+K"s\F]g \vQ^k W6BøL@@+?E 8X9sYxa=^, r'Q. VW_W/1_b|-@ЅIH*e|a߾-oV\n?->{|Rf( Ee6-]np/fRWF2&C6shԺDV%j# u?o?Aߗ?yæ}ZU w HTxj/X..Vk6C~tqI]6^3Q\j>Dڢ ;3Mz<7LH?,9?7w;kSv.PH]7]ߺyr稴.z TtvkGE+p Jw ݰ's\#E 27]w({hf Jw%ӡUE -tL? h%'l* {2Gj,2 HC6(O2Q}QGR! s" apApȫ$U<=&Ȉ|ϠOwzιOwiI/(aV#[l0=D<3`@p&Ԡሪij}augG?hg#=K6 Lދ wx8p}/KFA4 ߮^ |endstream endobj 1267 0 obj<>/XObject<<>>>>/Annots 150 0 R>>endobj 1268 0 obj<>stream xW]OF}W\$l$c>,K!j'{ƝG\W+UDQ]@k0K |ޤuЉ`J4?DZr~ܭ>{<\=!a%tqr|bYOM\"4*c+e"kUSm K]&Yf6g!-zjfm>e[EqK!yNIM9skliGjFp_c qs"PB}8ZŽB犞 QJHU)QHz`@pl-[@7#Rb,r:9Ẕ&G~~xH_q`?16^K3ˁGDlG|+, H3s_Ռ>ԝS>[ݛ>ˍUu -u$قs2M:'T JiBaTyY.&!ą2A秞p+CMpQh:vr }[5$޹Zm&e cT0anK9c{1=Y O7V[_0_4Y#܎/^Sj^Օq')DY8) +…s0',,x7gendstream endobj 1269 0 obj<>/XObject<<>>>>/Annots 153 0 R>>endobj 1270 0 obj<>stream xV]o6|{:y?^[q# ^\܋-Q2JQRwI(i,;;;;ܟ| `69}}[FS825n3Hxָ GdxxiGR)|C&X&#Ȼw'(ŐH) )ǐ8eYbOuf$ԩobo;>vA0"CbX~ywحGv+5BGᑗ{X-ph*.pM^J}p SɡHk0 I0dHBj}* 1;0K GL#U~T?'U\?W5 (feZKu8M4g≒YZ0Z0d^Ҩ;7H^1R4ST |NV%SKFoPnX[.Zҡ DڛGTFm:F{)Xdh4F(߽Oqye;U.pn]mak.u%}Sf3 M֎\\3ގ}\Н`F/ܑ:9j":38JĈA)DckE#0Qwd-!Bhs gr`f݌kqэ7s|[,)PAS(0QX^hZ*L$uHx81D_0U~$`dhf8SACK8kԖ+!wHB)T$j9WGj^!})?2,ֹ9e·8sQuFhbc$:7BdUa4zP 1D@}@U 2i!e22X ]R>wjZ= B6mc'C=q*S9h]`'|Vhv97=(X4^n=BcɴdToiy`>ɯx/lWj( /䌽tY} 3)~Ã\Zp/mt9p$]XR9%X3dupmp\fip)pN*߬M-,oJ?Auզ--atUMC_Gvj7NH`2yϬ[WlF`1ox6&i]5v4]zendstream endobj 1271 0 obj<>/XObject<<>>>>/Annots 155 0 R>>endobj 1272 0 obj<>stream xV]o8}ﯸ}YQQilA}۝$d'xHlva^ $s=:o$Yށp>?<4'A*)^gF2G.m⤣^?nOn`dhiS]Nwk&`6U /ܬ!:?@;QbHFV_!xhhP^9(*jMazC @{2 - خXE,.^aCps;_.:,.jJ~PejQ>F \nЊt7_vU4º8TXD֠ PNv؃C:d-$+Y)82Fg@*ETm!/~vMmMm S%Ԝ,M/L|ct>W.f"=ah` 4~hL:?V&atzu%^3r:G1݌8 )7 ap4On˾؞N6K֌nݥȚcu;cƩX#x&RdRp c~>yg CEp5H?nC{m@*SQFv7>Om)lm|Bׂendstream endobj 1273 0 obj<>/XObject<<>>>>>>endobj 1274 0 obj<>stream xV]oF}ϯD況D!mHq 3M;@dj%;sϝg-jE6u.(nf?ƨKE ҿ//;%ަIQ\O2"*d,MJRlLR%XxX4&u*ΣΚ:aktq2zC6O Ѭ]֩?t2;;5ٛTvίEL~J_6FʃP+y" qba)b66>G4% Jl$b2`T%RgC{oߠZ͚R)%j^ mIqn{4A  r[8̜Iʑ69%hIH(WW/i]#q'3"jk+7 hI8_K=a=GzjdkpңsYse"_yF%E33糭絖Z(F/ԲQ>\1"M(^ DG1}T N_EThΧY«݉wsNS+b,Ob~g-vek>9 qnhhRiLlxf!rF_ ' 9$T!Ctd&2\8wTN}c3}V5}ۍn5^fFGW ݳa׫Y'fqxTCq[ D΋%t`?@"X)TДygA.jԙ=fH)ף5ZA5%\]b4þ O3߁OélTn  KRdAQBrZArs2j;1W̱~JޏK;-zꍲFgR%xߏsC,K¦ rҋ#O0򕕐.NB u u~J'xe iOU D<2avp j ,>]YE .?MnނR㖽g9?=z{jRkڀejؖjn6,@HN\hKeSo7 G _"|G{`{8hVt:USڇ>G1N^U`Pm*Aozaų;i}Hi`:zb ]Ay֘9uE\6~;XXendstream endobj 1275 0 obj<>/XObject<<>>>>>>endobj 1276 0 obj<>stream xVmoFίH`H@jKQ E~w];361NڻD읗g晗@ a40^oNw7h !;M[^'ߢ61l"k3M}a:c;柎;y^=,FC%LFI.?/iK,LU& ()BVdJ34G󱉺 Eq2Bƕwp{?& & mS{İ4G h @ JE¾pYKDП/uHL-dSep{LusR16 0}6iWڨKQyp7CVYܭwa`Wf28ı)ѳ,kKS@Lri%s.1Pm 4:y^|Yֿ;-S|V[Kh[Aξr0F( Jt1HvX_ {{ae0okoLu9 ?L-CjP8KJm sTg0UGqu SduAi8W&odfu:јJrcR0(8Ҷ*,o3{!vpԆ$Ԏ Ա1u=x1t5 K)1a>5Uʨ.%rY:S2 lY5v b4B,Ьz_=뀆 H[Q!VP ۹vLH~-ԐU}C[G>1:!T8K M& <;^]l56e*]hbPF89s˰у (wé͒`CEZpRCO#NR&7pR LpVW%O0W]_nxcZf??R;ҪľX N2@P3{a;BEA4[QЊ,y0XܩtUn<[+ۆ?M=taY/f.V]c#~1*zfkoJ8X"0 &7 4윀hɒ &x:uI%ɥ7Ot endstream endobj 1277 0 obj<>/XObject<<>>>>>>endobj 1278 0 obj<>stream xmVr8}W000!<$RNfEF< lCC-tnAzixD'dӃ^˽Pw >Mrz4 2=&- ^Ҽ!=#*Թf%>Z"y^O.ΟzvJ[%QaXċ-vB\<[;{ ϻWKKa(gJ-+XRLby}nї'_23r-3 *c 'L"%hmF.j$U1Awo+e.\'RLQRx%}+)g!UnCBUya~.@º t%JKiU킘N84OsrSxKn念s`˵sv>y[L su?+S+=SگŬ%,梗XR|x#H:*IB__YCPǾgf2Q 6١N _ixBqvͩ& =t@v-]M:0wbGڨ"#}uKv(6+84r!?Vc*/чqQEoC{6t BJ9Zy5vMk>QbȗYG^hD T6~D`JjQqBJ-㓊-B-꣺E LQj5%1j[\vw"vm.x'F^ʿҷp.Oamo ϓۈ뚞fO٤L pwup)UpW9R1})_Y.O<àX-M;W,3)xi4=Cz3#endstream endobj 1279 0 obj<>/XObject<<>>>>>>endobj 1280 0 obj<>stream xV]o8|ϯXlv~$-pJBK͋Dd[f)ɖE,^h-.jNq~>S<>&4Q"f9oo(J|̔8x/\e%[Q!)UL/xJ:gLh]BRU&,d.u)Je4~! KJKF]Li< /C š*QJLܬMv GWw&YƸ^i]-H_FRjMN}DRi@eJҦ"ԕMk,)*4Ē;efSTұ-P:1{G7eH^QRAq^oT ѱ}dq{RhPƾ.Y Io[ִpjHx BxY͵ґSApt2sawR+4d'JMe;@bhahX4ʟN_yi8 ,s'zxz4²TV܄}#;f !ZU*$&< q^iP/Nsh>EN5,ŋo+v^ϹITZ: D;j`bHAɎH^E ڗ7;c ##!B~KZ"cP!գˎ8kmpV#Ar8OcY/kZ ̹q6oe@ 3`2V>r oؕjGΓ><)S9fT X6̅~ [P^eR 0yH_.{d5 A`!;ю.pq~Pxg͏BkQr͠?,rG}Lژvt$gb+u `:U2*'}kD0[*/区rhߏދ{&f7xG;uP*xzK|k;!6--=$+߀9g LX?%k圃?(ƅp>/XObject<<>>>>>>endobj 1282 0 obj<>stream xMoH#A2-3JPVnvB.݆ݞn; ~j vH㮯ުދi1M攖_W\h2[ⳤd!p2<ؾwhx;8ufX.'B(Ea_)e Ykk(/Sn{EkrvdIZDd6}TgB XgnZݰ;+.HB*2HV*=iOEh2E?qIliX,s16yB /i0yѫd">Y@)2 ٜ/tzetI2է@_ ϽmY]Z{YSn!uYF{$ JJuSTui~a-TmVKjCr Ǡ1QPE'>?ЗkR? 0d dvR.jʒk m7P'7h6ӒE:`lzB"*yJ趥whQ7V9V,u_XN9O: v9?ʶRyP#c'<Ƙ(~/8w6% ) Xt$@!JUZw8MdTj3j\q66Q;, OFtPt3Kw/K$#GDy ٽB 4oo & IX2 r:@76IaOFbC܋EaSўc7砢Ot؎t%@.:ݕ~7U2͕ jX 8oKJ9DFnxbBd"p ];,'OO(idI h?[vLE2_Wٜoֽz>endstream endobj 1283 0 obj<>/XObject<<>>>>>>endobj 1284 0 obj<>stream xmTr0{Ċ:viN/#Yr%yO-S`<}$ #P5Tym_68֒l.FHhcIZabU^}aޖ;gNy,o!& GG%`5~P)hCK=bюgv|z%yr74>w(oRyNFl*vj$sXX̗,W!w squR~>:>٩ ;<\t,VWB$bm?Eendstream endobj 1285 0 obj<>/XObject<<>>>>>>endobj 1286 0 obj<>stream xV]S6}ϯ0 I }K f:$[Jr\Ɇm2pq9hL|B"k_jWE~g.hULsbtТD֐0VOWOKSl@ XG[u9%5OV$V#$&($^Uv$jaZ#zڊpoo3.傲4QF |8pN>X|xPB'\ e,ye/qklPz<0U"S*Ak hUբ#U頪*ng]6R1ڝBg.Vt~3rQ(~X'c69Uj8cE)mn+[`˄ٽ>EmF? (GV`M_*a60q 㱈5I'#Zm62M 8zW wi ϻo&} Fce;=c)eUR@ n+]kB랇`@Gpz I3}ÌBBeBŤE&c?.Tį %HCҘ 'Q'!0[MK p BW+c ͮ@6cHEɳx<| 8>Y\h5W%.S< AKH٢fBS*bFճ7e033!tؕԦv(aEфu쵿B0gDÌAímj=:n?r Rɜ(£ᮅT ԛ@|`"hSV +N=vhcB$BW:kz6^r53k@aɠk,\!Bc}nx'mjszk*ãi *~'^;kB?H8`i<ȉЦuCInHCoq̮Q\?2\ ;H,^LDS0&z`m=W]d k :pDG'KzE׈[O֧E;O; Ȕ pm`)=p  =n x-l/z9O[Sn1~P=b$<ũ8Ca{d}3]Gr YBl l5'+חם(_mBDL&#R="RGsEfKWf`?ᾝ&r6b_/l85^pW_GSfendstream endobj 1287 0 obj<>/XObject<<>>>>>>endobj 1288 0 obj<>stream xuWMo7WQd+ܛZ$nFA{0PfInI + |I̛]i_sZ=լnO74foWmxfFr9H{Fx̞ju <K[IʨD Y')02"?lt~Wr边/ "7ξJҮ5ePx7Qx,j_8>0IUeGAr2DĦ[;P7Cťk# Α)s{'tAp{{Td^]1/$zuЉT.˝A_! Ijz C{n=O}AGLE0 G) d'yK'<%hb N<L*D>ejIM牱 z[ j=hS0Vu_ZNu^U0%^+hh+>O"?Qc/*Dh_e+W 1*nPX#c x,!֨27I+E`hg@`:CErHW2(drDJKc|ᚲ.dD#"n?Pg`gy¾umSoub @fwjU/2bQ,C(I &Pb(+~lns{_endstream endobj 1289 0 obj<>/XObject<<>>>>>>endobj 1290 0 obj<>stream xWMo8Wb5NY4 t[([TI*mh66?f޼fbF3 S\bn+E;^V(VZzR!"DV@ŨVZ#/0&q1jy2V scQ:֊}(L30,pL),,;TV4# ![=/-7׽YUm=U{<|y6-b eI6ɪ7iwVy/5|1F('H,bEt-fԓ~NqEO5  Eߚy{!(l@ $"=`PK:"dtj؂S:.Py ʑ6L\:GK""G c'WjbL sal$x Z TdTց8G ljUf8v>-NAV~|ӆh\+sU{ +Bwx\/Yd"Z Dl១hf`ZNxCɁQʰ~i P>EeYb-5RcgPKy51IõtU)O7l4?kK|0S[9O# a 1 )#'9~(M`I^&`Z/q4`Kk+|t~<9fWQ&뇗61&Ym'ϓ`5\ReLzE#l>xM᡹cʖþИA8ia:~\rx./RŪk⯋c-endstream endobj 1291 0 obj<>/XObject<<>>>>/Annots 170 0 R>>endobj 1292 0 obj<>stream xVmo6_q&V-[K}H~ZhDj${m{I{=wR738u,(eɌjLW}$P3v"wt3;fYX`yw'@S\Nlw'NUoz;Ӱ:NKx~؍+}:Ӗ]FiJ ^̒rJ"P1U>l[ ˇ ZƚXW{r[Vii-Α MV[I΋3F䒔#quVj 2b`LtW^钄.߬0 F3MTKpX42V^J}0̒E gpu |"ARz8.%3}cph]Id (gG㈯#̱ VFY'tZill<-eb{ch-k82XP['8`kŞ ExZKwD$ 6$mZ3Ho\2:P|\l!.SN[?XoE̊c] ` dȵkk8O$[^ƽ 9' xẇ`./_A ̯(sҫWX<`O^pͳd>[`Iʗ_ ~-^endstream endobj 1293 0 obj<>/XObject<<>>>>/Annots 183 0 R>>endobj 1294 0 obj<>stream xVn6}WLV,I6m\ LlEKQ~}ϐ,;4PBqgs+~ci0DzQoxGS ѐ4'_2zjqσLqujaDzox2tcHQ7[M,pj'oO|{8Onj1-RNu4GـkmI[8RrJdp䔖Dd7tu5'oZA27˯u; 1#W"uҞmt[Ii'ω~H`CUyU|t\9xFy:+|t* VZjcLiy}/A\n+&W>+7OҾD):# 1 ybJ+6rMn qMeOҟSe Gfu|`֔mCZ JgPX vI~W Q&Ḛ*@@B2k"_ico% AŨ|]p31l/|Q)-S҂%MhtpA6`,gXz7?JdYd>߷juiI? 2LZ ۿw'i2_ vܸEQD?}Ajրu|J{V.#{ sH!Z{Gy:/"+%YJީ5)٨:褂)"C&ݙ*1vg0)mOhSVLb_`D3,vD9bn z9C͎#џmCeBA;%OSC@(9=4H$A#KL.R8-Ghgz6n n:>y-*]#dgVsIu NI/d*x 1ռP3j(,˷۟[pPZrO5YnM\ 0\ qYW5+|]p4{tQ\T|@M~UӏoWj#|bN4KzG:݄~Kqq1XPNz`Ox}V[~k bendstream endobj 1295 0 obj<>/XObject<<>>>>/Annots 206 0 R>>endobj 1296 0 obj<>stream xVK8+H&'TTeÞB&t0x!$[Im[R{\ $x!$Eu\\9>D ?t|(@Y=H]I7pK+E/>Q:zq`Fz[$[(utňu($]Nw9fOzxJ]< 1*ɯ)rًN£.l~0_c8tF#)yҟo5L1(DL ̾,rӞue@R.נj)sa(F'NAL&JX=4z_&$%%iacJZbF@עPW7Ya̢_V=Rx-N^U,d '[e9+w?~x6y͇,x|j$19< 'kQ~Ԥ3oFkHM P3c^TԉQM0saՍVӪh:E s<0 hct|jC?JMpow2D~1z`]a|(OCcsl?,UWtI?5/<g+khFCϛv?}Jmڷ*՛5+[/$ћ Q߽iXۙ݋]d3}mYj6ABȫ'4wvY.d%1 絃nO p'L'o`~B|Vyiy:ʃAnb(;c-r[$~/Ab?/`ީ/TW9wYGa䎾q#߉hUzr{ c*endstream endobj 1297 0 obj<>/XObject<>>>/Annots 215 0 R>>endobj 1298 0 obj<>stream xUM8+rb66_s#Ⰷ$l!F-9< I PTQe~֏NLc )SVv"aiىg1KiٔJN"6>}G#|%4 4|h9,B4Igl&C&1T싧36@QL4}_ߢ69 zf wYWdٻ[Dԏ6DK/_{~|T=ђWBg߿|`cCF;Ҋ89QVw6]HISȷk9UHɆ^{ )Q=Zh ?:0R\f8硜?n{?n{ DSc A4xJ@p+Ɵ!\"xgad&/>i!Z_[Ps,soѷ`wf\7+ؿxa0$Л٬VoȊS ~vJR٘ uF:K(B2IaفE;Zg=Уw+A\| enioto8%on[h=fD^\(7,Qv64;YSRZ PgPV7tP 5qGޜEVcAST]nVI]7( ",\U%jSi+9xjL ^JDC5vDm0lw>/XObject<>>>/Annots 220 0 R>>endobj 1300 0 obj<>stream xVMs6WQH(ʒݛ֮M'z3H$$dIYd:=#zo߾]$c,)YSVOjuvIaAzMB80>z, 6w ,)IxcVѧI,&7ֆ0{^rglp1mZ-Mm(-hM$4 keBk)Y)g7䫨JRJjYF4֋B:!5f23][7^}:Y鄸~ϝx{6$Zo?|ݑ5F}ќyj68?~N>Nlendstream endobj 1301 0 obj<>/XObject<>>>/Annots 229 0 R>>endobj 1302 0 obj<>stream xVr8+hO$$7|Jœ ! h jadWr,6zyE_f!>9\-GQ!L^HY0ۭjx?y4Fd+i)Zi{AR9X^]^. ju6VT!1&QB[C8Xپ{Cp^11cJOqS_>~;IbJmC-R=>;z2N>/XObject<>>>>>endobj 1304 0 obj<>stream xVn6+.f6VeIE YhXȢ_sIʲ5Al&sշrJ7ΧYz44􋡯ϛ~ˋӜ&amd83M~d, ڗf+J֊3/h_)We ERxAR;oT5(IΔ9>mi4Yϲ)ネښ\9)xz[*|,Cʍզړ7]*%! fvbyaϩY6!ɐkG+X6tʹ4\\,Bg+Pa2EM ) rH_*^Fo!IrL'J"("昈ʽ>*2gWtAU>w~Dg|+QKF2t,%Oypi텶k<EB٣pS ~4( =})xSU:2=JFx<0C"g*pR䷰% ąO23z CDMMF&gZ$=` o?[!rhG#z~W:7Mj7_$][uԦzᝨ^?{gtth?;qR# #U.D(]q3%Sj5\^T;osJ 8N`2`$ocR0ЧL^.kjVwD'5FPb !U~( ^^^"Q ߹rS }Oœ!iώt밟KoE} p47܅O@>fw A͞۝kqbgRd42x'0\'N8 qO5Y.jGiݯ1:h樽0Z<[.V0{._viYendstream endobj 1305 0 obj<>/XObject<<>>>>/Annots 250 0 R>>endobj 1306 0 obj<>stream xVMo6Wѻd. ~ %ZV#YRj}C*ID93o"1%" Bvau)jb $m"+ތp8t![ SM=v$X6I7>l_MIqy_MqC6^g~52 qÖd%bD>w]T&(^o`MhW+$axB(Rz+KɿD5/gX*NV;Q]h{`n"ULe!#!}Dؕ %j~WDM#M?ztƔ~1I|^&p݌P̃/w@?NZt΅V }m@'3BN;kRts! r1O+lMF]$91eWʺ"WԽj< uy9o5Yݢ z5XOpMmVtwLJ< l/D7NL{endstream endobj 1307 0 obj<>/XObject<<>>>>/Annots 263 0 R>>endobj 1308 0 obj<>stream xVMs6 WZÖ|LML7-3ZdtH}J=L&<|x߳BA-%~|}QĐ l,YLhwWMavoe~w!I"ۍ`j}8Xw+](J"_ϻiO !J,x&]j].*7ּX tdE!g 8 /*0-EyVN5J(ejTjsc6A?gKX16uW̙ j,q7(Pv3:0 ޙ5Y}1X ENESLL8ˏ>G`w:Z~/L8! $}[xmz2n_'zaL}C.F'Q ɴ<߁+[їn^jUcHL~1݋u="CkgbAw78xfQVƅ4©ՀrlX<^Ea|# ?pfO8=h,8p `89Ͱn 9Z7d>/XObject<<>>>>/Annots 270 0 R>>endobj 1310 0 obj<>stream x͎0>/XObject<<>>>>/Annots 279 0 R>>endobj 1312 0 obj<>stream xVMs6WJ#"E}''}jҦDBP@-KϤ36I.vQH3h$͂\-xD+2#XpBY1+#=cʼn`n.Ln{guveYy9uhhsd!˭2Z{[Yt :xrC+3=sm٧OpFEr-(_-(a5\ȾYќu̫] Q0糫7^}o(vBYfmxP)dR2:B%R'iSfb Cghq>Cw";cKI'atcrB.e2Գ A_:D3UDȲTTTA ,f4 ,YUG]W|F %󱆴ie頎:K#" (IlO5|z =3gDZyL sA̵y!IUOcxܽBs]u]0K*i$]kZ6C\X3x˘YT|%,Q`:PiIH ۔A#h# Nme%yC5g(]*<F".F"6J Xti͠O.;vVQ1R|f|G: 1σx:Մ m^1mvN(X.Ds%!,sy½s%CtrcWsϨ:e+͙4[rN|_{m"sltLjә7*DUi:QTQ!]-:tDz||/l}h\)sQT*)=:h5)^+_l jL˓Lcg+5d`rV6W*cҫ_IO6 TE;K:4!nJyP%fNٺW䶢SNOoæ7hj"yt=7©enc *$N#LJ'Hm'tT{oTI:~FO,H*fW~:@6=;6x?Zty*wOȂ1*l!ӟ֟mQ =|Mf/M|_{}۷pw{{noO .^]d]YPrߢP4mjkQ74p;014cdu'_;y5oI8\l ϋ`Iv3Y;Sd~6?FX;1ꪅ9wG폯ۖs-b~x$WqZ`2߶?G mendstream endobj 1313 0 obj<>/XObject<<>>>>/Annots 288 0 R>>endobj 1314 0 obj<>stream xWKo6W̭JVDYEvEuOE@[@'(;CJx 77!LؔKnҙB,! #?jV|hq$e?Ȯt:fI'emӀt튤ZF!w 'Jd;`  il-`;bsQLZ'Jc |ʉV:)zbJFS+a9S"?>%a? [`Ɖg?Oaٞ `2YHU\Pk^ך?:G k3|ZdP+kaDU[jCRAmP^\-FL.3ϰ>ly gdDRr\ P/aF/KĬB smA)`(1J+dJr((҈աFMIEb31Ϧ-W(ʆJ*!xS-2װ/+  JC+ډR7Am1ŒAL{nBpo+ff5nZaԫ6˪/+W׷M N]]LO֩n<֮`j/ZϺ&(+mtk.# KWȮ ! ˡ B"wL&+nvm { ߉zQ!c:&VW=gA:|) 'g %.^_t?Jf=vʓHDjRެ귶L܆Td?2sobqgYHvuZq KYpǘO _ً>ӞGCF8l67K4YdK]:)Zfę[K7ȍa>,  7PTr-4Qg7f݅8͟J8_?O,8qSkPwObq^w,( o;.e8qcl1[īȱX O,8} OB@N8 {X`4m79z8^ʯ06f/cizw| ^Z/xs C L\fI>=MqKb?@! gAc]EvS/hvg̶ 0q =GR`Ynxup KS?MasҎˡnF{F~\iH-G sendstream endobj 1315 0 obj<>/XObject<<>>>>/Annots 305 0 R>>endobj 1316 0 obj<>stream xWMo6W̭ʮXt{hhH*J 8&AӢ&!3ÙǙ7?G>*l4~Ӏ¹(ix^ әW5]h-in]ljj-:X\fl9X 쯭N[uvWh>!呮6O6s ՌgFQթ$T2CIPQW YJ*M*T%bQ }S(+*JIcYUI+Y%SFXOf4q16x8&P)R5%K9u,xzE EA{߄u(UHv ##P8c"%Qⴻ`[oEN2{I8ISXO2=1>/XObject<<>>>>/Annots 314 0 R>>endobj 1318 0 obj<>stream xUM6+6l0 TIU䄩)-LdT*=ݒmlMUURu9`ρ/8+oߣ#zvO MVߧz wĠhճՋu3#+7 D420[82 C6{δ֩-dp|hj2u$hǥ3e\wCb,2}ʇ6o^(SsM6>q<d5b}@mX̓tTO`wt,VyYTL\z? 1c7^[9j-n 킻2.׿~ʏXEc8jZFzi@W6ew<=CpoDwecчspګ/=qٸ2+ܭp98zp=7}qx=+j-6"|?ִ,r?sy >/XObject<<>>>>/Annots 323 0 R>>endobj 1320 0 obj<>stream xVKsF+h<,TIf (l$5H$pRӣ7R**,c{ 8x \_m3 ;EO81H.Cx]`jc.aQ^E |aQT.F2* !៞4}zjZ7-f*cO]_) nvn6vrLOi. ʡ)C\nf X0rk19܀c~[M`phR[thp|وAwe۬LC_&'PHAN:6^F^)CoBA\[JoeAO|D)ⰎQ ~¿}KȲm[`q0{JtQRnIW@tiwKUWdaƱ(kkX( cDi崇::1)R<җ{n)}?&K1u R8BX]O7PՏp"Bj~J HPu4@B\[rB9E)f$2&2dq_%F*ޘ lLt,Tz/-G\WFpx YԪ/r-_@53^8')s,FY5 ilB%V`s093Й\Nk54BЯTR^H%OL_ 8QeiVdabƕUr^cArDvzxgpRPM3Hwq /+*{Z%U>/XObject<>>>>>endobj 1322 0 obj<>stream x}Tn@|+Jp`lc'oDyԴT÷gswg x{,^X9}-śo8]j8rsendstream endobj 1323 0 obj<>/XObject<>>>>>endobj 1324 0 obj<>stream xUK0W1$ěU*u 86Ĭ4˿߱E٪]5(#y2@Bl.nto @u\8AuM5UW.k5\|/ GHB#Z ?7Ana9 AF@s#n›/W (]YP6\>O%sxގC(u*%ܙ,v/_ /ڥm7#ږxٌ-Dx]z:@NI9IL~:=nR!D~Ts'ӊL{:RuUD8Ir}@7F3T`Є:}*RդJn zh<:2㬀aJt|}&x A{eRIĆHq ƃkKS%;_A8{`kLDH&Bh7~ 3[;OB=9g1_&#ằBFiɪ+zz?0 szendstream endobj 1327 0 obj<>/XObject<>>>/Annots 337 0 R>>endobj 1328 0 obj<>stream xUKo0 W讎bg!떠 횝"pl9X-GJvҸ-ZPh>?nxE`3Cuo;qXH<$]v#WmW>&JQ%EU eY;4g!~\6}.jH&ɏ*~FM!X7 n6ON3̟</sY5U\jSF=ud䥀rzҬmsgnV$*[|I>2zAO@<<ߋ٪Ϯ ($`w[@ J kF:=Az{1SOV/fBrFN"PWš+_Cqo]^*iQ$oX>/XObject<<>>>>>>endobj 1330 0 obj<>stream xUMo@+H$06P)R+{"9ldR7҂lAv{>tSn)zf*㋌&7 RW |FQ8},ITLwU9Y4܄M̐B[C*uH*7FCj[iQ6o7*^iMeZ pNY2.πxQ&e|3茒K,&Z3V_(ILUvLGЈBH$O-YYW*L (gBFe У˔y:L!3Tk|c iRJ'vM{f9\v0^rBЖ<lcBYw/,=* 4?ZZ-3NN2ȴ'ahz˜OKC-48șڝUЩi 37$mTպ zOv~6$=! ݓ45u-[Yh?(endstream endobj 1331 0 obj<>/XObject<>>>/Annots 344 0 R>>endobj 1332 0 obj<>stream xUoF~\؎tm}:hحv$BPT7}ÏA! d8g8c NR*|~@A a8)Kѓaʾtf #JCY쉭,1_lzDo1^C GO&X@zm$R"ZUs-Y #;ѩjmH2QcYDmZ)st  2e}-:WFn*UMU ~ZnGxys";7,u*{906%, 3BkCՕs׼m6qx(+nӐvR8TӢuAc;50F"nNdމ!j5DY y tȇ4])W?hD9b{J`_wWIvZ}kHM.fcp}fZqLmrr%<ҽt7|ﯯ_ &]v &|~1t?pZ)F{V$aGG@7Nw*'fC%mU#[CTfo+sHmA=(b)Ajt{$Q7f/OԮl6t*K'B+R-^//֪4BƊiLI$AAX{L:5 ˋk=ãhv?/LYdP6N@@n:^zG<ҧ{POás^,]w8K}X̃cVR{FHS^t|7M-0J{ǴҏێZ/2i[LχB| mp endstream endobj 1333 0 obj<>/XObject<>>>>>endobj 1334 0 obj<>stream xRn0{ á6U UhTQxvO??loӶ\bY<61RO8+CZ"_E41.讁OY3>`¼t~=܂r"{y:TRIɟx I7ӪdJv(ˢs&sM) (3)tFKP)7>< R(]D->V }=Z\¹&muI A~,VVusw٢۪m7|)\KDPx<"u֡u&=BZ`k(TY1vMH$8N+FRcc$endstream endobj 1335 0 obj<>/XObject<<>>>>>>endobj 1336 0 obj<>stream x엿OGlj(.ٓ\XV*HE)("Ǣ &e'LyH.=exc!Utgo;o0?NIA{w}~{qc q}ѺXv^#nL &q{'_5؈d|,c旍x-! 1~q߁s+7Kg̹b.{[e TC)H_HU0gTql" SO{ o04)@8yt #<*k'38;BG902AG]Rypf`q*V5"dv`ND`#22so+RZ8/LpVTIP|ç럀}PMxJIc6yO"81Z# !őRAQ::ÈeN"d;,Q5ތ>o-RGOۮjDQ U5>KC0۳QG2[ቂQ<].wzTͧo$P Q^s|S@ Nv\18T4n٫{4g~ gpq{7"*z^zTn-*.ꠒּK\GD]2@_s+xAj⏥x@HȼRCL5:v:x{,p4y%o\f#Iun{3J5Wƹ}\]7Z\X:ʨxB֛9t(Wx{|w-# 1 2hu&N._osҦ =:j !ۂC&hDr}Y65^Qy!Cl Of>no{'3n<2woN%{5xobk`{JHP@0NfQx-}DL--ڵ$Z 9"ШHաv (y-*r1R1sm |Z'7TWg9?|'sx-%/r Uێ6}߯G|ټ%E(-/ DJ˺!%FY/5sR,ǝV8Pۉ5wz|݉m>/v[\npO kZ~%vkis&)'ƿ;~EV|}މC۳Ey=*,,c;Q)UE-jeɪF$]m,iaT3αU& +ԵV!m|YlףSߢA0ܱ Z\AYmhtXR6 jU\`!:C5نMue5}CP-˧TQ_!f3d4V:gK噉(IͶkT0m1ݭLs5\gA,1'>TA%!QNMZ+3b{LzmߜQ%ik#oY^$*>:J2Ԍ WFX3=^㤨Sڅ h!Ut cTUu0=d#IQLh (F?)֦ꥍN'ᾩMvX :\Ь砘 N&9FumrI*u-:s CO6,\ʜʦ(#Bٛ^@E4F'$h])A:B=|^KTMˎaO=0Rz nX\ |BTwĺprX9p~c!ڵZD]#å }Wجi-?+y[|`>lFBIJ'ꦉ!/yK%O9y \gBH;GcfX M!@/i↑cț0cb&bfN,+2??涿jM(8/vq|Bw|9v)>?\endstream endobj 1337 0 obj<>/XObject<<>>>>/Annots 363 0 R>>endobj 1338 0 obj<>stream xVnH+("ŝѳ!F2@h-pqnRi0c4t-%?b|A/cvLK*9'AeVDiM[oOxlr؎Z*;g\'Kg 7M/^KpL^跖]i׋p j?׍+6 -'wR?֓ l{r(\ S]TjP&SxR*NIWTKVCjs3%}I*x)VLQo֏,GEle(R!v4 YT,ot=6S<][VysT,xҮґ;oBZRV3K&=/.HYdØԕ>/XObject<<>>>>/Annots 378 0 R>>endobj 1340 0 obj<>stream xUY0~W^qll-]5<5AՇ*2GZ/lIR~vRj `3>c@fCm KEgX  Ȑ15gU]|:O?yFciqVjQgB/ ]ޞ5oZ p[ oN&n2mM&uzOfq`z<4<Ctkqk3^Zp?ؓGİ;̳Qv>/XObject<<>>>>/Annots 385 0 R>>endobj 1342 0 obj<>stream xVn6}Ẉ3,ɗ4[Zmܷ#lv%%4w˦];93 $0+l'&2i",bxjq9? 14t\Myu9?tv %mMMB,9l*)M~ڽ5%:])?mܮ3Hb.LJ!ƼtUU"A)AgTѢCNŀj7Ka%"OB)ߪi d&Bw:ǟE$2wX Ƃ+h5FBD|foe;d'9 ҪNepXr5/L<Ӥq}֨K5Ev7F٣sNmMqrZKLoC֌qd},!A$HkZiԮ#["_l/?94 w5a҂tTEX.2c}xEn.%p4pL__d|ewz{Dh\VñK "C?y&ł~gЁ`D?n&MDmendstream endobj 1343 0 obj<>/XObject<<>>>>/Annots 404 0 R>>endobj 1344 0 obj<>stream xVMs0+Vg0CҖLgCzc&#lJmJrZ}W 6m@Xݕm@ ?Y 1 #ev@&$L a5HƭTDi84qX['m7Y['9mJ+ILr丹6|dB7qӒq"4G\/fSZ%Ni#sNI(٠60:r(VXCY7ghu7s- mUk +  h)LF0/]"L*?vc,Tr ZR>L%wucG:0!!!2xXp/. ^?{>/p=SO`z:mk;.j x}Zs f@3r-MP(F +;7)]D#^ݑJ`s#>PQ>{`A!a-S>MiwS]}5/G,l b%qǰH7m~w#B ?I^I~7 w~ꋗ<ނ8ș"KtꝀ\> /0|q;k~ltES/֏s 9T7xY>_F5['f}Ë l(p,Φڰ 'ipʭlܞI=b@dLhj'Gܞ]*m8SBq.mY/64ح=>iC{7Z!RzŅ' ^Upm\~6 2:DWP:( J ZlX2xWѶ1`@/O=Pw>l#|Dǚ(m%8JѝwT4C: hbӐn#Uh͒, qzhdO]endstream endobj 1345 0 obj<>/XObject<<>>>>/Annots 417 0 R>>endobj 1346 0 obj<>stream xUM0+涠mLѪzh7!!6vvK}Naa rxoy~@BBy7(HCH ݪQmf9e7Em O+Ei>Byf]ݷc j%" !$OlAQ9>OItӈZc=F>xj6|! Fx=YO|e)k bJI8c@йc͛.rmۺ`2 dd6tAzaJq۰pȅbG%K54,n[QC(*) T51ҝYrKkX(EO LQåЏr U=爥<kf#ӑ#K&65alFOi1! X$@@ X_z^Rںz/gn]M8I8ipĹx_>~$0endstream endobj 1347 0 obj<>/XObject<<>>>>/Annots 420 0 R>>endobj 1348 0 obj<>stream xVr0{$3 0΄L=dƖ$үlcC&0`kW}^z@< Ҽ7fc|s~Oo oӄECcј5rnɭ^nZ,`:)2@MXn0(| ˵Ob ˴ORq-ʶya< Q!J%] naō :QG[[a!>Njzd>a0EԖ3\ٍ0ZDJ1bL' gIJҟiѕ \;@3'1y;B݈Bn'\*LAXX&XL-*Ԩ,'%kVb6;Qs8a`Y~s*>JKm  w,۝#\a">knF*4g^ջ~E@7:B9D@#XWԡC}?PRs7G'>{<G+%[9hl4-0HMC~AHh?)_MD>`2>$#RB9:$؟:;k*m$ZUUZD}Z)9ǩF*OCk8Ipڡ2Dl Fk *N_! /: 4;h%"P*TLMr<ǍJ u~lNFwԝ:G@oڜ*m50UnS(g~w6;GxÏ`ׁ..X:]T}[ G<40/u!b6KS UWPa,Da<5 !g W99-{z՚endstream endobj 1349 0 obj<>/XObject<<>>>>/Annots 425 0 R>>endobj 1350 0 obj<>stream xR]O0}WGI\O>0,1a0[6ÿEfmҤ=|ܛ; l#PJy>31X8-cN+}C[;,zA ŪW,6 !òI /G_p׳wiTFi]Dzmsw/ߖ LƼt?m&4V[.u!uM8ƞWTvסrN8()ۋ+Ġd2^gX&ib$lp<$<'1Ȓڧyp>1uendstream endobj 1351 0 obj<>/XObject<<>>>>/Annots 436 0 R>>endobj 1352 0 obj<>stream xVn6}ẈuKoy.E(PhidKZJM8ŹsGL7eTLIϣb&pl[i:ʦs|6;Ī[ vn^1x#giu>X*~\vpsaSSOJWsT6x!ˠGҠAY6n Ȳ:_9Ev+u:qIUuk(:(ϑ%G} vֆ=2*(4jKO5@ *Mn5jE;YBbL+Ud<"TucG:3e} M f4&^^wQWg"#RFc7@cgHLK .fi{#2;R*#+O>O[?GWa'G{┯74Be'9YG;%jO{s_,u1KW[ߔe!UYD{endstream endobj 1353 0 obj<>/XObject<<>>>>/Annots 461 0 R>>endobj 1354 0 obj<>stream xVKs6 W}X+e;lf顇vKf X&U3qL@J<* zI癈O~D{Yb-FW+ʋI'ڕh#bQˆlv-I]10-t[YA2=d.ʁH\TĨNbmzαҨk,eDѳxT_'dP-KTMnA_ԃ:Mao޽=;@g`NT릑OWWR9>H}}z^TM>Z Rkh VqYZsYH}afmPu|PJA.[ A*[01k1 :kKSz4m#{3~Lj Kӵe[IVcqk3c1 5?.R]nŤm EsU'/*}Z8ф5u+\LׅZՐJ=([k8a 6jAL*˺Dz݃!0PxO@:e4e] B5C cy0]94'09R>*|4.;(?_ωbs2/ G;2syTLJq2c݉3SpSSh["PغaCu6 }t\(T54M ? 3d[NG+)-",3Y.lqleΏ5b)kMcTsװo_'F\ՋYSͤz>p8W~ 2,Ϙ/uy~ ^ /8|Fq!"~u. KMI< koMa2 %hf_Iq'endstream endobj 1355 0 obj<>/XObject<>>>/Annots 470 0 R>>endobj 1356 0 obj<>stream xT_o0S#UIHo];6i[TBNlO&NoC E[Gf%PF327/oB2"0"q˜_& %Cu妟i0N1&t )%!lN2gdq\9<& LbDVgC(! Prr:y1&9oQe[05>U#_ "'-9o˵S7ưrٷub]kهÕ+3]#r&(+㼖t+ n`ȳ* P ~' 0Aj. h{ڀ7|antE-XiV4XA7-zaFPb'N&:xW|Hm+mPJ3侺鯻doZ`g a\mDjr!SbUC˿}^:Do6>/XObject<<>>>>/Annots 477 0 R>>endobj 1358 0 obj<>stream xWMoFW z%Y]CUPQ`ȕ R_7-1)~{3fv)4Q덒޴z|NF$OEoRZzLh -bkkUYʔ:*GuJSմٺPQ"*ݐٛVk1߽ 3__+\v7Λj 0`n}0)sKh{Zx;mf87 p=lMύeZ]N˾N6ɉїEP:+8< ƒr!Bwˋu€8_1{U:ЋaJ stj{1L9Wa` Dv邩^/YAPqd pٺP1J V@<[e*hZAUmlV9$+b^׮(܁ecO (!wȇǷG)*IfQW#ͲyT`ŏo;S}( Ow=]O@AWdMQ k;G{8jmelH#Ԟu F벐pfxc+S¬V*pP>S ke SAٵѫCs5sOD`Kqŀ`af?t2ԼjXz6 ? :кJvI*ta?GE3lLϺ=`2x ,jTAz\?Of⦳Z6Cw57eQ<,/F܏bZ._g!_'(y lͻȋG*H6v2i]qry}<]O9FJRsPgq /Χ|v$Xr5W,zoz &iendstream endobj 1359 0 obj<>/XObject<<>>>>/Annots 502 0 R>>endobj 1360 0 obj<>stream xWMs6WI$%ݜmڨӃр$ I%Q}w~U;N2Sk$.i䃇?f1w#ȏ#׃(N JܰmIYMgZ37&A2:gZYueX]PTkfUyl0kP`yBʵBwl ^)WG ~,Ǡ &-Z0L]'wѝRl~X/,)z V]`p<6Rw ͛ ]^,̘ z,TŮ3ȱp7 YF~<RcSi9Zy@ӐĖwL)g q6 e& ǣΙS6=r:Dv'%8L֏'nZ=+OpJ940ͣ\^z>>Zql#Eté+FH噸\06& l+McBqv'RSE6՛%tQh3I)>) C%: C:CFxZ/񢭧?8Ej_橫endstream endobj 1361 0 obj<>/XObject<>>>>>endobj 1362 0 obj<>stream xTMo0W1]V{06mUMdf7~@*ǝ݁:B-=jdHDQ f_)ayA@V!:ft}Ȋy!{4Hhd|9ms@YTçQ\89m*Eϰ-d4LXOb/.l`fPs(aP J1aw}:K= \_ TqW2m] &AJ%*ʜRԎ\ mѮP0<]a,h:3A> ` dOP]^ɂiVhn{n(*t/5rT.o%U7zQEM{2aL"Wj;t9I+T&/F^Yۢcq(΍==ɽIk8JƚF1<j3Ny :) hoyV*+89/<>tT Ou 8oІUafG:WoKa8+"Dũ؃33MOaϲ}F,F޶at!)kJ|Fx=(FFt IH`$Smm␰HI@Ȗh*%Ioi Yv&=u#endstream endobj 1363 0 obj<>/XObject<>>>/Annots 509 0 R>>endobj 1364 0 obj<>stream xUmo0ί.!!}`/*m1K$;2l^ڨ:N|>{9I9#Ü\$ltT>YW$#]Gg8S33Td,t8;. pq&f~fpqAlP)̪{8/jX4֯\A#Wk@-5x˵`̽4J ˥;\\" m{@]pCa/ ipݬJ(c@1 0Hs^"+@:p+^NcYc*%0]Wj/Jm7%B{wboHiX~cUQ0m^(+G8X=؄$/\|]-tXڊ#u%K lO6ak6vKYH+* vR0RLDz5wB)Ԃ[Ds_K9e{̜+L͓(+j"G $e$\WPOGUM57mP;GB`66a:3 {ܗ+l !,iH5.+= Uev2l,{MnC4.nzqWM̭i< (F$U=X0>i^ޝ^woOFVW)w8݁V@56D_`ETITdd(zDxp< I6be :>/XObject<<>>>>/Annots 516 0 R>>endobj 1366 0 obj<>stream xVnF}W73D2y(tU>0HbE{ )JCqڀs h#Po?p( r 3X?eGo>q_|~j?!1Of:S )hl״J !bO$$8>[ݻCF< 1(TH_%o%)Y;>tWQ, $Xd2@TH V [*f+r'Ҳ/8 -OZ䒊}IEd&sY:͡ 1'~Nh_1KmL'z-, HR(IuRh[NwaDK#It};ϫ"ma3`' e&N̘gGP JVlB+~3 E a~C|A|Q#y9GkCg&|{ڎej޿gk}VF"[_,Zy!_91&_E30d[r  FO7~ =syĽlz^=nRhDG3tKV.݃GK47sykʦ28٪ a쯺ZEG|qjUAxX2o7/F]Baa';F}Ύ mGv۱V[WhG6%Htp}>9Y65%Mpq igWFRT3vr}C/Bo6/N:ԫB8]{ 5Im*g I̲ɶIfxC/~o[fKE =l^\:-"{u&젪.-R S8qu7R0ӡ?xYOfkStI{1A0,=Y#اl##e>/XObject<<>>>>/Annots 545 0 R>>endobj 1368 0 obj<>stream xVߏ8~篘R趬*{9Lb UibJ_3v!\VJ |3yf#61pHw#۲q<?tvĶ5R_GoVe7iYpA[#[-ue!!iu0VK\F߾.Z/Xw2==h~VidѺ&_o#uc GK2j:%C~)_30RG|E$%~H:8ONt1Hx~XqBõ!Ix6?xmXQMYT岄 _T/͒?fzy`($#G'U!`_40٫aR'a(_pb$  Yny#UHra~4|L\N%xǾDy}j@a ' Ol\/UO)TBG7Zʮg3SI!erqzHi`,ugL:tEϭӘ=צE oYO#E.>C+#"}wϨ?xy1;9LB;>` F*]^YaS1Y~JFh endstream endobj 1369 0 obj<>/XObject<<>>>>/Annots 554 0 R>>endobj 1370 0 obj<>stream xVn6}Ẉk+ڢi(HU{|E6FJ33s ~1-4[,h/xG ͢)4YF-?Z|=['ъ`M 9/ގ즉^·ycw~2ՎǴ""ZgIC""دL0a<] M:d^[ڂm(nk$}j?pI4e9c0axo+_ XH :lQdvIS?E^fbD'cCycb6κF䝝?1`mԒ`1ԑUS cRνcXX,UgDwim,q0ϧP{3Jv*Np4dDimWvX MNjym*Ғ°z)qYdPRL*TtL#iK }eF JO*l quQr̈6 @+J)y%A[!=kv5iG'ehH<“v, S/_&@wxمEDcc)BrqǶKW}oϤ](^;U7P: X QSϽ.sDQ59vZ L*$(ңgj,WRj Q1СuC{[y}8}R['yPq]y]v2W/ )^Ŋh4RV[~G=請-q_]pY㢶lvQG:2q;a7J W5Q]SI%`G PvOogendstream endobj 1371 0 obj<>/XObject<<>>>>/Annots 561 0 R>>endobj 1372 0 obj<>stream xVmo0ίo$HӨ&^RHqΆPRڕr9nuöl|R /׳\ kp=Z=nUݮ)lIt.yq%OpF]b AJ4K7(C)Jdlfj]h5kBڠ64_2䊵52tz &ʷ-hϒTиJp; 5bCbԆH#F1҈"NM@_Y]T>[{p9_?Z1 jUZEkw5`8L&F$3#Lg5Q&UQ̶4F4ijhPJ9lKcd}N.H7 Y:=)^QyQ=Y;z1 jSelt\.\ԅչ7DB-f[0PR}*[hi :PQ| -NLanWzXqncϚi&j}&,[!\KIطp]"Y1r^cU I`K X%/2}3&gw 'INРh4Y;OX(KA$yRO9tdsq&S$a.F 0eȹMdX#9>/XObject<<>>>>/Annots 582 0 R>>endobj 1374 0 obj<>stream xWn@}+plo4zq_Dhm0265FJ57 6EM{ pL`68}|5Lk:XVWa̲5^H1|i`1$s.*i7lVi @k溸Lч[$sA-#JڮLwj]Fkb&6jՋVJ;fM2%)]T1 rmeMduf\ysk4.89L<FzFK %y8 3xZ'A $S1&i>^<=4cц?"N1#7A?M>:ŏONYp%c*t!,0V&^ wr2\ɸ7 ], ПTʣ²1U׀S%" SA]S܀/ LL ⢱ᅑG? )qdV f062 )%gG i nxQ !I  !e q?֤.Jcpn{) $F|ISߌ._~7S_,?z=:.?2HU%DKv t(R'K E5Qjxɾ%id~K P Mq42L\wW@|]UH"V-&tK6^EI(2qkO21iendstream endobj 1375 0 obj<>/XObject<<>>>>/Annots 605 0 R>>endobj 1376 0 obj<>stream xVrF }WQq$\OvMվ͒\ݥc}]${ 8gׅ.zP4 q/"BsRh c'^.:,ubr90  (-򦙃^fI"gP+Eb,7p\3z6j9645Dz%k=U QEG 0,)0ȉ0xAhyH"9*y!RelJC b G~3 D!OǯݻpX1Ҵ)CtQqꆺC% c/Kz׼V.7XY -vE5F }B#F7b_I_ݎKPZ|\U XA'Ah $%kU)2u=O͕:绝(b ,9Sh¶~ o:lXj3T"!@8Sϡ$ɳ7і^r;p:芵օb)hW`-gV;ޗ5Xj-Z'ҝ% @(P%=l$C1N0"|xD/3L{l01MR Xؖj{.̎_1,/vs'bNpsΓt"FrV_҄^\`5pf2t9ަa?E 刄@Y^F@p嘐Kx!?m~t?OVzi ѧH;]-o,_5k+cU!ϒg~UʲyxY^˲4Y#Ҡv9^D8+iuXOX6ibpխ̼Vbrts2rVV&xxIiQ8ah{S,U(`-Tz X'nv?a:Iڋ#(ɇ4.endstream endobj 1377 0 obj<>/XObject<<>>>>/Annots 632 0 R>>endobj 1378 0 obj<>stream xVKo8WImEhI4Hr*՞ J* w$Nnȏ}qay3=g݄"<'ɒ5pnjD4s'"!*eE-rkEq-FΔfyK#=8] U3N^<њѦH i($S'"IWyl~}~\VBjy* =sd$'I5Jl8 3-8q=f/XZ6v,EĆ5;t,#Aa/Ml1ɬD2qסavde; &~EPIiմ HyfƙUL}с4b]-r  &U-8ǝKw1DQ-uZ["G NvFb|9 j먪=u 8᳋Z*p]G  w),ƣ3, aYV7xGc~)~Jީ9zG>p5ML;I$P;BP- x?v+jҜ[y/iwظ9O3^xu{q`J9I'M .endstream endobj 1379 0 obj<>/XObject<<>>>>/Annots 645 0 R>>endobj 1380 0 obj<>stream xVYo@~W#$1RzRYYj_ߙBTkAÿQKcԟ/aƆn9*,MfZ[,%Z>MUdRUua8QXH8PR߫;h&kCht"]]wZs>K߆$$L/Gi,xxޢ A,a&?u;MK˓mTtJg1yoPQUms)2"eodi} J][..6(GڞH<^2b/`2t~OCvhDPZ;XqP *o AP@!*6B&]F꘮=4F j`!1S&$ȤqzU1Vh!: |F}]7Ay^yUTTSFCFHhnUkjv5tb(04w=5W>Q[5RpS|7ip1Qm3s ف6$$m-oJendstream endobj 1381 0 obj<>/XObject<<>>>>/Annots 658 0 R>>endobj 1382 0 obj<>stream xVYo0 ~cڮo;m;0dǍ]H}-}1a D~H7N:E8\AbIw驌JdٖE[u߲4êk|UP|U5%J9M( a{5DbI,<+ *ALN˂eĪrp`4҃_2]/Ga?ahmbLXg,bc@Z1rdw Y#E88Y1)MŊNl\˄6ʶIz gwi*`2 å>/XObject<<>>>>/Annots 671 0 R>>endobj 1384 0 obj<>stream xVKO@W1IE8T=%YdS{]@E, CA}|c m8˴p|?Lӂ`O&渖1-k8vMh\<ΦXjV^!h; u6&R JJa N2_,YB5FkJ}M!ڧ.)|ogNE=!%dendstream endobj 1385 0 obj<>/XObject<<>>>>/Annots 702 0 R>>endobj 1386 0 obj<>stream xŖMS0{ Ke;7BZK'3cS[?b& L0ɰ^i>J?G \cr,#qIu6@ LJ509ncp=.9=Aac NXbN@acuq73;Xj`zI^ۙ ֲq| o@^cuq9 ZE"\l3Luk>ۖJƍENS_ 21,f5T_ES ί|` [ 8 I p8SPzkX>Ke[8&+7dU57$aɠ I㫲ҕ,7Hr *7:C\w٭^\BLseFF}v?Y ݬ`̀38;Ҕe#?FTcWa 0SqiZ#eYZbʺ4Zn_plE^Q=|8ȁps[1*C4Mӭ`MG$nA+ 3~PK]VpTUn[>mh76+-h%EA^+tvޢ]ikmii=Ch{ճog؜{ȫ6GwNv,fƋOEC0.=*jF,ċjAp#:ԯJgYldNE&hҞǬƻڽ>zCŏFG2}xendstream endobj 1387 0 obj<>/XObject<<>>>>/Annots 733 0 R>>endobj 1388 0 obj<>stream xWn@ +xtQni=@fˊBK%iP)PԐ|C9`㿀Cl'@-rw28"t,H)\EZ/ħ DZc %+=ےҮl˥B`JCiC`>KƮD7R)Fx%kh4i ^i+V>gإ<87Kl:hBJ(KƮO[JZA'ڒAVvEtQi?EHCdEW=N,hn!WeT8~> f37PlH`udZOd>>N[ Fb 2noZ4{z?9:+g:;*|vfRpk2E oZJ`{>(q֐JQ@i0o<&qSVd!]Ӹ̐)݃QxI) J „ DS[PXx ^lQV-:l,l-,:/yIlgY;,P^ V%zQmpm2M*Ś\$ӴOysٰJ!Iԭ9>u ;473O.>SlnP9쿉۫ql7%@@ ;쳲SslWxnf&^c)h:;O$iiBbgT50Yahadc{{@ }K 쇽PgcFD$NVy T÷:F0 g,1#!txE;\!=_!Cendstream endobj 1389 0 obj<>/XObject<<>>>>/Annots 758 0 R>>endobj 1390 0 obj<>stream xWYsH~W#& F[ R M$%:X߯gmW蟑E&-#03u3 B& |z*#4<Gt]f*&E\M17t,Q6{j=#Li:n`,xj_ЯA&IMim*br:yh8PԠײިmM)ށfDs~X 6'?gN#ˢ7T$-bUZSn/<[UfD g\mDqSy4RZOiZT駙]c+bZ0UBPnޯn-Dؼ@_4/UT`RQdo/URFeheHKwx"}nj-u-~]]iUeӢwЄ ~ת&oG:B^晊X DUʲ5tcQ ZJRC'U{&e !aq@Vu.oqbAў */llrI'ڸ,X2Z^胳uG3Py6ܬ )xyͦ==0'4Wrjʃֹ=yr۟k|6y 9m{;ȣ.{N$GdD |7H$X4A? ~HʄR,m)Q>mYLDmk\r@w)V=v<]!g;W~]ۯٻr?'PF{pʇ^Ycloi\m75ٿRWV]suQ]ম A>kf#Edzi7{t7ΉmD]5{Lи5n E/YnY ȚnEى%g{ oNGL1p#c `s?gNM9͐uendstream endobj 1391 0 obj<>/XObject<<>>>>/Annots 769 0 R>>endobj 1392 0 obj<>stream xVMs6Wq,F/N!3i2Hb  R}ԇƮ=n A,v߾^L4Ih8 ~0hDS(aRtכ΢$oшtОt+ ~AMb +D)ܦi4-MJqLMl6yf2yvA+庼K%y+P$~b&E1:Cd6/~}#jStVPkIl? \2WZf钊L0c1Dd Z /$%l!/7լHP#3o,㆑ MKI"e~70)񈠇u GRnJ]ٚ~b}Je!|(SҺziMK- sQmEv{E-ݲŢi_4MxmbT}fu5gjyV%Օ.@N[nq}Pu&KZU |u{:,-{of%AÂ1^G/mB:87 uχ ?s}-_<[6kȕ*&P;Cat5_(\ZfuRlnf/Od1ߵv%2BYX;J,{Nɦm+%ضzGr[:\MrB ]մI,-?# EZn#R(0pAp(.Jᖮ;aZ@i}YRCR\H[Q> 88ڙq%q'|:H OPO:I{&t3a.*2- BGJѽ6H*V]KvPKLHզ!=ĝ"dep*He @áXZ``(mah1 4aJOJZ:c-n'1J'锇Dz夥OBB@2+>tFObvۼGANendstream endobj 1393 0 obj<>/XObject<<>>>>/Annots 794 0 R>>endobj 1394 0 obj<>stream xWmo8ίoGoK@>յRVH$lvh_c; $m괻tgf ;?8M|Ku'^aaya)p 7Az#9k#`gS+YE毨}<(`)'iwdQab$ BG֯줃6*NZ9%-9jm6aavgt,8 GXSfVɔ`<,atJH- ?Yh㚮fÊ,wt]-934`>=K;eo8ǚG`r ŭH BrVz8=qM&׹X|*%O&eA¯UT&1api$X t"qJ$1Q&MWúxS4 ~NQzp!cܳ<^S\=d$B] O1ơHTVΜEjP^7#qdL2E 9790K [٧C yOdz$ɝTTiL>0݂xp MpMwy5زɇ&'1ÒUĴg{A𕿭~&И&`;agx ACuG`U6+Hs(&Ú fAxu/(~3V҄)~ZB1vR14 ACG0ﮱ z`lY~X?j^T2Y7,]'k(h%6ӊhG,;5wW TKq*t~D%Q416WqOAHR"mM4G4% pjĖkQc;X+ʩ$9Hћ~;ݯq G%ms76 /<Gڦ7e <*W`F}?YR vVU!C>^<^^z?6^n0!Ufnqp+2KE1#+jmG^<oqh>Xpendstream endobj 1395 0 obj<>/XObject<<>>>>/Annots 809 0 R>>endobj 1396 0 obj<>stream xVMs6WQI,Z>(Tձ=94um DB4PHeMܙ{F$`v]݊҄zCʪV7ᎿPF U[ FԏQxK ~k<aUf{#SQ2R,'[Nzi40:M`ٟFGay3#uz)OqL1 GǡKӬjrҒ{4V^\楤JT g+ Y~BdN]8^ǻ?Lj]Gi>w4oMUIR[ZR.VNn19=G[z.Jƈ   ;Av1:G5UIkrxQeɋt6Q3穓 A`q0嗻ǰfwkț_Aa6=S5һІ.ל;D TZQ!Ranh? TK悥L4G@w%U-KY J ]QRXOJ4|/q)2% -K(ҏL+BbJ6\rң-D]m2*vDw]fF$8;ї!F4HKek')]䧢+WUe { v5ߵg7\iA$P>}x@>/XObject<<>>>>/Annots 832 0 R>>endobj 1398 0 obj<>stream xW[s~Z(Q79Of'Vϊ\[ʲeŶ9m2c qȩ9M4S\>9z{lJ8SCA{<dMx|Z"%,#X0T쯡bM NY8HDvR i*slř6MQy_ýjr592m`AᘿlhgtMd%TI<٦2 hl3T8Mehӳ1ij?> )`Y%u3Eg"aʭ8%"|#@}=^ [L]j{3Ĥ6 -F71?Nc} xU_~)iN5 i^:Ӽ$G,u%»M4VJ=VFC.WV/W_T伽zr|LE79F66"0r߹s̋o }6+dw22Ѫ9GN_3}54F!vt2nKus.*0ِfӀـ5W{c/% V  @(c#ƳvS/tPn#mr }w;gkd+mA_x,pn0 p{rP|sHf;Cy%5KK# )v`)VcAn`kwnm;0ޑ3%]`X&g4b1J~I;7R%:11vcb$;,& [MWt.j g@B|0}V` "L``FN+Jc{(*[a-5^'˹}2XTQ¡MDָ o1q{# "t&oмpM*v̩-(7<vUeF2q3O{N`<|{gȴ!P1ON8TE ,R z3%C -| CU>̊BzF.Ue9ٲw0M]\?vPΐwOS,In/w'endstream endobj 1399 0 obj<>/XObject<<>>>>/Annots 839 0 R>>endobj 1400 0 obj<>stream xUn0+ "ٲ,MNAF(PKR6ܯ.-?M6`]l"b v!܏xLa&A -Lq+ tr$x% W4tկC6|p}CAV!y  !+B9n`whVsB+Xk+%s B++ʁu2"7@W7#%T.E+]Ndig3K4^7HEeUR,Ac` a:UPQ0n(jo@7"qX}+ L6]ntrٗgjxm6o{֝O:k-},-Jy~8@0f"!VTG_ܫŷ*wc2 57{`b [ԨԎS0Á)ҖAאhԄ*94̢yW(7䖣ܷ6uE8舖]^Nk=A`m9}oWLZ,4NR#9RP c򔒣I6xtVB24Rf=8vz_7ɳ0c\=a? 840K Ng04 SE{4꘤,%ݦE69Z9%MS>n)QELly,Dendstream endobj 1401 0 obj<>/XObject<<>>>>/Annots 856 0 R>>endobj 1402 0 obj<>stream xVn6}W:]Y͒[ -u6h^ITI:v@vD9sxfM|χ$0xo/`Ρ Qt i6\";Yߛj/p} b.i>/XObject<<>>>>/Annots 881 0 R>>endobj 1404 0 obj<>stream xWmoHί o؆o\rD']~*UkȱI3^l驧DBe3=b҇vŞA8 8vV*/M\'dK,6HH}Ð|YiCIPx,,u01# &roR9}|!ivF؍EQFi6cMlx3RO>Y owIcLEo?%1p' kTK Dy'Dq:v19}nendstream endobj 1405 0 obj<>/XObject<<>>>>/Annots 902 0 R>>endobj 1406 0 obj<>stream xWS6~p/x\L{3枎bXԱR!oWv()SjY@4 )S>xuvLFK]Sx9QFֳ1bv4FS~ȳ ʨ1fhke${ É+~$A= 5fHf'S!##aX;`5f#GE=2o'X퐂h:_^F4O$'p\_ 0^I'vq`йEY]]M+Gmݖ&הԢЙVN/DZ.eK;ol"/אfRӥ~z8laM#DGk2^|m%%I!RG| ,K]z k\swX;G%E+@]ijZtIvΩhZ%d@mTYIp9*y:p"kTejEL98%\ce̹&BgGM- CeiD^cV2tQ<;͹U*zj.u%3֛҃5% !LIwEuqw^Y\z^3 JuFq3THFk"med8&=3HR #ӊFz}Ӌ3M uP /!wi7hyVIE9;u9<X KҖ)! !{lludreUɜvVg06kT{ Kթ<9.එ-M[Kw]Hæ,줥?r&{dd/kG?p; f} 9?hޥh7ǷsYEYS.N/*ySnd9$mV56_H2>\>d|`S\e B0T4) ䷇V[QB'#|μ]ň9\~W90v z% lMjċa2ˇNկ?7endstream endobj 1407 0 obj<>/XObject<<>>>>/Annots 921 0 R>>endobj 1408 0 obj<>stream xVK6 W&e;[ Ŷ뢗Vul)+ٓο/)IAF("ԧ#!3XF/ FaJn,H *ajX8%S[̃vCDܮ;9NV֟6֟쥫(BUV$;geDKnEEkQD{j-\TqV$Eh!-mޢg ` #<_-:4wf㋬O0pcZjew韣nNK |6:½:jSqiD' Og p60V@ [54V@vH[̂>-q,E B=IU%T:Ga'}BaAWϝ6B r*ˉ׀4pMzϺ3EӺJ"T߸^Q<SLAuY Eѣ Wp@,:R2i Hm@SJ25֨iS2 cjQ`(ҹ~?{3| Ď{f7^޿e~Ibl6/3d>#(lL,k5`v;i\D(+f7kľYZj2)չiePe?.Ef^#ep>x@eZ\*r8>rk l(rWbfCYB}W\%ͯ=LȻp$S7( bix{ a!!]w #qyrkE847.W:vǿxu. ZBZ}cJ}=o"dl'FW>V-XRPܤ殶dc WxQ"b+rh!Gz>+L d~oُ >t.,='$=ۭ:]o+ANv$Zo_ž"SLGULbך~ qendstream endobj 1409 0 obj<>/XObject<>>>/Annots 934 0 R>>endobj 1410 0 obj<>stream xŕO0W|n#{CBn~g'Cik(|pH#cul=w<c$q`tAk4|;qjaƽU&ᱳ)iLވl[;($NS"QtOnv!t}[){h>Ȗԇ$x 僔qjm# .RZ4Vُ`4O6hLɊAXOZa٪-ȅB@(mFTO RK(]Hf-H2FiaZ(+!ĐT! kucpq\Z{ hzb[EiֺJ6oŻXH(o${شcMcoז (ԊFa%jo-NGN{T6Osܮ;:Fǒh6weo[]5i Aэ> bpsyauȜIY^OeU9T+B|hI0~"Qe![2nO*ѻ:F{ȁxBYֆ#>(?S=.|FT=σ烆[-~CكdEMQo3OMd8XQx^ybeRAB!i8uxڗ3>IG`: endstream endobj 1411 0 obj<>/XObject<<>>>>/Annots 947 0 R>>endobj 1412 0 obj<>stream xUQo0~W#ŵ@XU= 2o!$PjfEcke'Sev5eQG{1t3>#5rXYy^\اom%hS[1=ř%BUY@ހQȴ^t;NQe8 r0串vv}sK*,@_K{7n vQno~S@x+zѡ` Jf;+(̞E0XX?FG]@]FXihhU uPuLWj }]'[Y2"#O+Vsn!ZmQx)R'_ׇ;ad!)QY=ViT LZQSն{1Bz[OoamE?˲E{`EL0~?؋EGqiDУte>endstream endobj 1413 0 obj<>/XObject<>>>/Annots 956 0 R>>endobj 1414 0 obj<>stream xTr0+h&EXr! ^a-:d~}WM줓0Yv}:9FecJͱvjBc>,>m5+q`2 mif7J\kY+urm'13kFo7F!hn9mPȥTZia.&h~uv8UU}Y/ S|aحbK Wgr>o֛}޲pePSK#%k JX.+pmغvP m{zYE@pJ1*Fm#R*J%^vpx({?VT,3ț\ah2>MytVendstream endobj 1415 0 obj<>/XObject<<>>>>/Annots 977 0 R>>endobj 1416 0 obj<>stream xVn8}ẈVn&(F}1`p!)%u3[6&$̙9(?!3(QׇQ~iϠ(V Ga4%;7F:Yc?8F0RyoR|4vZ6$h"j0H,Cx6 j; 7s7YdzQ\:du#kⲴz  r0f~PT常d %CD$1d=0hx(ҭf3F!t`aB|lF=2Q/˫a{x!q7n`W-W;{pw\?kRe+ˤy@^*YC QmAm`d jc!aoY^A7-lVתd䂶JZYm3;ipxJ-D~}WU;J/Nj9  jL NSR5;- d((1^3ApO#>ʫvlˁvpy ە'yr\^`W 㖪ţN3Xn a4B,0R%dISz/BjI)] Iml6:|Ȩ??†3c1'jEűX:JP-SpH fհa*^_R痆O>۳6tϑ\mg'Ύ)` oU. _ dVhD˫hWm|L>OYʊ BXNQ堉!a^m{ߋ2|dř1!{f|ҨHQW]'obUL p^}7h'(Kj:8OC12]נo6]c\" @3Qt'%hlxӤbΰtʆ+?Aj0e"g1W1g%uendstream endobj 1417 0 obj<>/XObject<<>>>>/Annots 996 0 R>>endobj 1418 0 obj<>stream xVQs6~Wۑd ޸dL[I6~lcI6"߷߮h_F3SI& iN3*cY|ɉ͘7Wd8;yMZ )CDpu:jW'$YInձ#U\VA]u,YjW~ |CQ OjG+F:|L29u_IU*^ܬ؞/{OUvVő.7 eJrs湂+e^6 :sx\`Pn,`iϋ8=c z/h'S>H$ī+%9^7rKbȎsKWKNeћ)Y7#(Df|6ܵ>j1^/^F?g%5! gj f7ez`endstream endobj 1419 0 obj<>/XObject<<>>>>/Annots 1017 0 R>>endobj 1420 0 obj<>stream xVn0+,E-M렇&]S]$;*,ʡڜN4 `h8ޣt;b?/9+׋bۅ m pǎk Zoj%^lSE/c:Y*zV"o0zmfcFM樳^>z|lԙ2.â0]xCQwaF[ ) L `N=ԃEJsv`h c]cAƺ!-x^J%00B%U}-Z"\ֹ̖͊e Ҽ8GO6mQ(aM2jm[}8~Z=aAwW)\^>˅~86G3>|,Bꏟ{ݏ:?9fՋb[^화~6~m9rX%-3UK&+NrM \>.R۪4"U^joM.0ߺjFE4|z/Z1PfMX8V/'Vr1jkYY2,bE%ߔoXyaGW4I0,hxHEV\l~4ywg 1߲qyԕ]<">MDŽoϲgn`'˻>/XObject<<>>>>/Annots 1036 0 R>>endobj 1422 0 obj<>stream xVM6+Ԃ37CCN!E [6E$Y$3S&3UVw?u߽|4 i<$/ן^0 &7‰e iMJHc|tYҍ"vn[#vtǞo]k9 kokuànT:R<O7t;+au:/4"BH M'%")( 0#3q@Gqn C rq0G:/2ғ:%phD) t[6L(@ȍl^2iƏ7 w"V{acY Q9L*;-b{69 a&]jf@OBR t* m>Fk"+Ǧ+Y+k"%%ť^"2/41fl3H -maÕOFyX9$0h{-lL~mϐ="H #WjHoN}seW\roHнd[u7)pd.G"X#vv.b$O\DSNP5ȰmmH2'XL+2߁?(*U=( ) VJ6J^t ďpOp98KXlY%X` ⺵g^\7M8ՔmWFen 7@4saęwBE:iE Ɇ2..I. DlG>)Iu()YP]7̖oÛ8ȡ|a{M;^YY4n nnnYљ_?=}+ڈ+ţ_ #jtݢ>dUuׯ͊Ѳ!r0yQ<xM2z{h] eE2a0s{6Ǒhyi"Dj} c.endstream endobj 1423 0 obj<>/XObject<<>>>>/Annots 1049 0 R>>endobj 1424 0 obj<>stream xTM0W̑6!UUՒVB&1I$ Uwl6BB hy"@䁿\ŕ׵EB Dž<࿉XxaaN $!N0F0q6TDAV5d׋L$ xHQ|E8(I| ׅ,Bzgr >uǠ[9- {qɞLC.GRY1{zu z#冉C3o&Q*[km{ }+4<=+ AKPI둚Y=AN;1`u_1ρ xa;&3@G k<:*v~CyۊvE6*=*΀Yj:?;,T iW[{@K@[SQYHg س`)R8/&LeZjIIK=W6վgʝ(bNҺӨヅ/g{iMZ~Z3 $^G Q6 MT6guS(pE/?nőY_?+endstream endobj 1425 0 obj<>/XObject<>>>/Annots 1052 0 R>>endobj 1426 0 obj<>stream xTMs0+ޑ ApsRBs(M{cȖ#}dCZv[}[/?LC&7><Sd Q3>Ix! QׯoK?%F3woֽv:4`&1 1cHsWه4/`<*A^*X Yߥ?zXDB[nO&Q_L9;E0 '$YeZ#ϙxyeӌphy n܁;Eggp `U5% 5\V z":p~aL=DX+AfށIaJ),'rw1"?AL@ˌ8YՖK~PTDGm}Se=>/XObject<<>>>>>>endobj 1428 0 obj<>stream xUn@}+F ki%>TqՇBzۮwzMB{g$mU3;93QhBM赠נ3&3=w ~4%8x)c`a<ЀZ(#x\$4K1ywyROVO%luCsʂcŬ "K 0DR2AB,Sr,1R6wT({GT* 7䖒ݠTqw :VH SV*2S f4N-ٌ*6LeGX t^uZ&v⣉QY{F3-u8|G=[|R83dHFGݝc]Mr JA֩x38RHnYF\LmjC<#A 0Dީ#4 iB۾?Jd˪sBDV%{G,ivR.__N`E9{kqK# sr **sE)5y5BU]?RͿZPS1Wsx!ip!4YYEoDR&bo~3NUdpWo<n]\@=gmd>oN gLw@kۄZ1X/=*tO6L\Pz>REҕ_XN-endstream endobj 1429 0 obj<>/XObject<<>>>>>>endobj 1430 0 obj<>stream xTr0;`b D3I&N䋐(%*R:J!3fى`ΐ rkiB]9:.(l tJf1d;?ϯ3+!i^Ϟ;C1)t4YpNI {hJ@XI 5Pj5vBIP(n%~qXjIKP[{RɐjM-sއR| S3 WJW΅U+}nf ࡚dP*\]jE FM`aG5 ir*Ѵvg귄bI+nq%m68]PoW[s6% ܫnٿֿx')8V\ɼEm\sAy+DJb(aIE <ۻr'0MhǫJXS#Ѣж#q9'퉸(`UT^7MH# G휵Ҍ=ZE^] Xf vJ|p TRmm 5а32B񍣄LԲ.'--a$$N&ÙW1*-ɡFQ.]$&4 -m ޜԅendstream endobj 1431 0 obj<>/XObject<>>>>>endobj 1432 0 obj<>stream x]TMs0W`-&39dL8"$jA$9ݕ% 3}oGQ?,k-@fYj7j5eSz?yZ,3L&kְAX| s,^a#s6bCAIwnȉ3[63LL Zx$UQzV E y. mTm8@h.icR*w)m{ >/XObject<<>>>>/Annots 1061 0 R>>endobj 1434 0 obj<>stream xWnF}WKi]-oN}pcEM]ew)EY^,3ESܝ9g_Φ4)f4:$u6ϒ ͖dA.SIg2b|?|pTNS-O _'v= tq9^^]&sZg1 z=m3R*^ :K#՞:‰MɕÖrXW;2%o=fT`go֟&t>#u6jP̑؏p<)#/.G66FQr QN=Ug |FwD)JTbLlGIR*ड TiSQZr)*VqP-um6^8 AlL:v]Қ}uS8 ůF%8uP<Uޫ1 sq & ,j% F: VLjAYۛa#^ץǎTqF@8D=9%ǔ _B$U+%h QуGj1~4P,ހ6Ϡ>IZ˳Kh h@SVfg!#m(SA[`逻hv>6[Є!qET44Pڹ-l݁]k$(۳BJ?w AEc}@Щۦ ESei( կo1LIC leR#h#U!J!}%P"!>n3GmӛxCTd"``2uFBE7'E2,v$Ik|+cz8F 0:pO_! ,{6Tµ0Šh^܋gTLWcF AH-'n42 !*##ZBkP~(JgK艠=VhEy ѴA~][v&="sR\b[fL)Z#-~Gc}q8s+FgTDB~.z@dh rn9$5bx&kQJʭ^t]o)[}qwIYJo:,Řlz j(k9 _E<=e5`!d#J@jw4iGOwW?oO^Cnn|94U}XƢFλ82m{tz]#e,8N\dɵԱVֶ1e(C3Ų5Q>}!2lXOaj-\8{ϪU%ĸr?HMB߃2*%j,p|5n1PӽX ٟgV7Bendstream endobj 1435 0 obj<>/XObject<<>>>>/Annots 1078 0 R>>endobj 1436 0 obj<>stream xVMs6WQH4$RiI벧(HHDB A%[e{2V5owm9xr̛,{>) /vџ&!)#;{Њnx;q );; r0ˑZa{1n E nwvATitHޮAaq&ik7_2HW 4H_. ʶ bQVXX}ۋ~.b5}TV6;ޫэ,Vc~[Յ3|>Mf7t^]Tz#WW{s}6i8pʐ9n}lU-j3 F mIwԖr]n -INDhcօ4el9V-E[f5ɖYlOc8|ɂcΘD^TՅN-vlB>/XObject<<>>>>>>endobj 1438 0 obj<>stream x}VMs6WљIevԇ6@ Do$z-]-h/vMmw5/8~>?ni݁yqw!|tsN;yT!8O_k߫dy[,7Yogb^,oZ >جڮVŸ08ΙWFsRlJ\Gȶ:h qȹJ9"/R9iK_ش tpƸE#>. RXJm@NB\;)3Bҩ@šʃhMDFy3|%nS]`FXQ5N5Åkiku O}|m+RM{g4I IxE)|-'KH.q؍RsU 5-F,5GqE\,lrrޔ^>9D{` `-"q#8$ RrVM VI3dW"ğ; :D-_U@Q(IIb(C/(CTMAJFƭGv6`ʔLaJꃖ2&I\8_Ջ,;q^KyըV3t60+It])iڬS_*罰 ğ`Ew; >"LH6k~:Vgm'__k6={E>V1ymӌiQkt(#webwsmrFg 1QߏFKR'clRAW`f}3FGZu!I9ȼQVf9ɡ.K 3KJ\@59!:3a$F 8Pi( F178BxA =)x:bCbI~ܬ}o! Xz.(>r.o9G!w 1QXtzQxڈ=zYA=~"uZX&i2c;iAGL+3춪 OۺSr֝=@qݽ M?MtMsx3J6u*sOeH eb] 1M,c,m 6id;:B -cC]$_?G=wy ]O}ʛe}zbwsXXLyItbh-.{ M68ቖ7ङ`GlX=?n$^\'byWlW,=)G_oƅ]s?g4tendstream endobj 1439 0 obj<>/XObject<>>>>>endobj 1440 0 obj<>stream xuUMo6W؊o6Ebf`AIV"~Σd9V #gmQߌ Znh&oH /OɚVbuO~?L$EV, ׻M/PƚԴ v3r8p䮺8[Nn( <.񬰒tު˒!P)O"Ԟ*kB<4ϖ`~(-({SňաDڔEܸOu8wQl[YC9cG%:DJ`HU袰t2nv҂eLf/(VQ/(p֕ R%ɷ FS\h"Ys.m-ږ7 *T\rrL#5Ou.ٮ8"YtzQU7u放YU)l+ )S3J#[K>>o_lU~3n'zzi֋$2(a-g6!AaWmk,or/R..]_?+FȘ´W*t!ew w.z~?ZGskDcojC|a 1}'3v]L[Bn6BS1>Nq:BC1)^pW4t1.5L~.Kƒ`maq6~pv!O#ʯ@Xx0Ά68؅ (AO;onҠU1ggǗT2lz˄x6Tǧ>n.3[k ψ Πo!ڴf?[$-/XE8o|QZVໃycV(em.#(nn/,٭6<(οdRہ6su&}{W*nvݯy endstream endobj 1441 0 obj<>/XObject<<>>>>/Annots 1091 0 R>>endobj 1442 0 obj<>stream xUn0+1}- m90hUȢKRIۯ )۲tACrޛqug>fy|HRE Y2ZϦ6F9&QRH% [(AK3W ڛH,istLs h"ؓ=" ,4,rڔ2@b71 6fdMy^lm [ƾ$XmK|(+/o4J;}Q~]&a yF, tn2H?ވF(X}eZC×;D,tC,.^` YfrCxYzV_9tz2`1$dAAi5TJE F8씬R\[TdoxSFj,]J@1 .JÇGY Qo c(%̠z םXϢv3endstream endobj 1443 0 obj<>/XObject<<>>>>/Annots 1112 0 R>>endobj 1444 0 obj<>stream xUK8 Wjvgbuo$*l)dο_RJlNФ>JWq)d[hU2]9K r Ksx|a*m/MƣhZ*!h㤄}Qm~Q@ǽ5H<w:8$´1+]uopΟj'b%i^ьr ~AGwnFz eoA>p>/XObject<<>>>>/Annots 1131 0 R>>endobj 1446 0 obj<>stream xVn6}ẈP.-ڮ %VKZ!ݽ$9@̜RsaAd1$M2qsȂ Ht$GFo_y=4"A@N8r Ar:{" x=4&A@N^$|dzhcSVeHxg.vEü<.Ͱ 7 bc>KRw,>3Cx!8-|7n1g$+7P'x@Сl9V@YBYm3 ATBCE `$sfpLC#h1Wk@/[a+yR <Z}W a%xxe2m5p&lh+ZqZULk2]*>fqK5k52gV%PCnMvʵB:_`wRX ;\@ыJы~ iĶ,>vVf@XX+0Jv=g%HC$[B|I-Ϗ dqyx c$ YaREB-[O G8zQ=mg߹OĎlKǗF%${_J\z;͎3aJJo2%Ԥj\d$Uul,/ŗ{%S<˯or8rkjnu |/O޸J7\s._+3A٪4 i _Y?Q?_'1~ O (f#U pC[3D$@qysSZ u4L1Q1Իy_PpaR@NXaq; uvR?L"|'~(ȍ[YgT[/V1nNUJ "GRXoS@GqpXD 8* jцI$*O gN>/XObject<<>>>>>>endobj 1448 0 obj<>stream x=0>ō8P[A ur0} `*L|{A/%`bZ!Pٖb RjHx'PUѺx_`>endobj 1450 0 obj<>endobj 1451 0 obj<>endobj 1452 0 obj<>endobj 1453 0 obj<>endobj 1454 0 obj<>endobj 1455 0 obj<>endobj 1456 0 obj<>endobj 1457 0 obj<>endobj 1458 0 obj<>endobj 1459 0 obj<>endobj 1460 0 obj<>endobj 1461 0 obj<>endobj 1462 0 obj<>endobj 1463 0 obj<>endobj 1464 0 obj<>endobj 1465 0 obj<>endobj 1466 0 obj<>endobj 1467 0 obj<>endobj 1468 0 obj<>endobj 1469 0 obj<>endobj 1470 0 obj<>endobj 1471 0 obj<>endobj 1472 0 obj<>endobj 1473 0 obj<>endobj 1474 0 obj<>endobj 1475 0 obj<>endobj 1476 0 obj<>endobj 1477 0 obj<>endobj 1478 0 obj<>endobj 1479 0 obj<>endobj 1480 0 obj<>endobj 1481 0 obj<>endobj 1482 0 obj<>endobj 1483 0 obj<>endobj 1484 0 obj<>endobj 1485 0 obj<>endobj 1486 0 obj<>endobj 1487 0 obj<>endobj 1488 0 obj<>endobj 1489 0 obj<>endobj 1490 0 obj<>endobj 1491 0 obj<>endobj 1492 0 obj<>endobj 1493 0 obj<>endobj 1494 0 obj<>endobj 1495 0 obj<>endobj 1496 0 obj<>endobj 1497 0 obj<>endobj 1498 0 obj<>endobj 1499 0 obj<>endobj 1500 0 obj<>endobj 1501 0 obj<>endobj 1502 0 obj<>endobj 1503 0 obj<>endobj 1504 0 obj<>endobj 1505 0 obj<>endobj 1506 0 obj<>endobj 1507 0 obj<>endobj 1508 0 obj<>1<>4<>9<>21<>34<>49<>54<>79<>91<>94<>97<>]>>>>endobj xref 0 1509 0000000000 65535 f 0000000015 00000 n 0000000371 00000 n 0000001723 00000 n 0000046348 00000 n 0000046528 00000 n 0000047567 00000 n 0000096922 00000 n 0000097107 00000 n 0000098146 00000 n 0000141413 00000 n 0000141604 00000 n 0000142644 00000 n 0000187522 00000 n 0000187710 00000 n 0000188750 00000 n 0000232333 00000 n 0000232520 00000 n 0000233563 00000 n 0000277870 00000 n 0000278061 00000 n 0000279101 00000 n 0000322611 00000 n 0000322805 00000 n 0000323845 00000 n 0000358739 00000 n 0000358925 00000 n 0000359967 00000 n 0000394790 00000 n 0000394981 00000 n 0000396022 00000 n 0000426411 00000 n 0000426594 00000 n 0000427638 00000 n 0000427772 00000 n 0000427911 00000 n 0000428055 00000 n 0000428195 00000 n 0000428334 00000 n 0000428475 00000 n 0000428620 00000 n 0000428758 00000 n 0000428901 00000 n 0000429021 00000 n 0000456863 00000 n 0000483912 00000 n 0000484136 00000 n 0000484415 00000 n 0000489835 00000 n 0000491632 00000 n 0000493317 00000 n 0000493816 00000 n 0000494337 00000 n 0000494836 00000 n 0000495357 00000 n 0000495729 00000 n 0000496191 00000 n 0000496987 00000 n 0000497960 00000 n 0000498507 00000 n 0000499493 00000 n 0000500045 00000 n 0000501264 00000 n 0000501644 00000 n 0000502390 00000 n 0000694918 00000 n 0000696323 00000 n 0000700117 00000 n 0000706230 00000 n 0000707307 00000 n 0000710272 00000 n 0000711687 00000 n 0000713489 00000 n 0000714404 00000 n 0000714440 00000 n 0000714525 00000 n 0000714565 00000 n 0000714650 00000 n 0000714752 00000 n 0000714855 00000 n 0000714958 00000 n 0000715061 00000 n 0000715164 00000 n 0000715266 00000 n 0000715369 00000 n 0000715472 00000 n 0000715575 00000 n 0000715678 00000 n 0000715781 00000 n 0000715883 00000 n 0000715986 00000 n 0000716089 00000 n 0000716192 00000 n 0000716295 00000 n 0000716398 00000 n 0000716501 00000 n 0000716604 00000 n 0000716706 00000 n 0000716809 00000 n 0000716912 00000 n 0000717015 00000 n 0000717119 00000 n 0000717223 00000 n 0000717431 00000 n 0000717534 00000 n 0000717638 00000 n 0000717742 00000 n 0000717846 00000 n 0000717949 00000 n 0000718053 00000 n 0000718157 00000 n 0000718261 00000 n 0000718365 00000 n 0000718469 00000 n 0000718573 00000 n 0000718676 00000 n 0000718780 00000 n 0000718884 00000 n 0000718988 00000 n 0000719092 00000 n 0000719196 00000 n 0000719299 00000 n 0000719403 00000 n 0000719507 00000 n 0000719611 00000 n 0000719715 00000 n 0000719819 00000 n 0000719922 00000 n 0000720026 00000 n 0000720130 00000 n 0000720355 00000 n 0000720458 00000 n 0000720562 00000 n 0000720666 00000 n 0000720770 00000 n 0000720874 00000 n 0000720978 00000 n 0000721043 00000 n 0000721123 00000 n 0000721210 00000 n 0000721255 00000 n 0000721342 00000 n 0000721375 00000 n 0000721449 00000 n 0000721536 00000 n 0000721640 00000 n 0000721673 00000 n 0000721755 00000 n 0000721842 00000 n 0000721917 00000 n 0000722004 00000 n 0000722037 00000 n 0000722094 00000 n 0000722181 00000 n 0000722206 00000 n 0000722308 00000 n 0000722333 00000 n 0000722426 00000 n 0000722513 00000 n 0000722609 00000 n 0000722696 00000 n 0000722784 00000 n 0000722871 00000 n 0000722968 00000 n 0000723055 00000 n 0000723155 00000 n 0000723242 00000 n 0000723330 00000 n 0000723417 00000 n 0000723505 00000 n 0000723592 00000 n 0000723665 00000 n 0000723764 00000 n 0000723851 00000 n 0000723953 00000 n 0000724040 00000 n 0000724137 00000 n 0000724224 00000 n 0000724316 00000 n 0000724403 00000 n 0000724499 00000 n 0000724586 00000 n 0000724674 00000 n 0000724761 00000 n 0000724826 00000 n 0000724914 00000 n 0000725001 00000 n 0000725092 00000 n 0000725179 00000 n 0000725276 00000 n 0000725363 00000 n 0000725452 00000 n 0000725539 00000 n 0000725628 00000 n 0000725715 00000 n 0000725807 00000 n 0000725894 00000 n 0000725990 00000 n 0000726077 00000 n 0000726172 00000 n 0000726259 00000 n 0000726354 00000 n 0000726441 00000 n 0000726539 00000 n 0000726626 00000 n 0000726722 00000 n 0000726809 00000 n 0000726914 00000 n 0000727006 00000 n 0000727093 00000 n 0000727188 00000 n 0000727275 00000 n 0000727372 00000 n 0000727459 00000 n 0000727555 00000 n 0000727642 00000 n 0000727691 00000 n 0000727787 00000 n 0000727874 00000 n 0000727974 00000 n 0000728061 00000 n 0000728094 00000 n 0000728190 00000 n 0000728277 00000 n 0000728379 00000 n 0000728466 00000 n 0000728572 00000 n 0000728659 00000 n 0000728755 00000 n 0000728842 00000 n 0000728891 00000 n 0000728942 00000 n 0000729029 00000 n 0000729079 00000 n 0000729166 00000 n 0000729212 00000 n 0000729299 00000 n 0000729344 00000 n 0000729431 00000 n 0000729483 00000 n 0000729570 00000 n 0000729621 00000 n 0000729708 00000 n 0000729755 00000 n 0000729842 00000 n 0000729888 00000 n 0000729975 00000 n 0000730028 00000 n 0000730115 00000 n 0000730167 00000 n 0000730254 00000 n 0000730351 00000 n 0000730399 00000 n 0000730486 00000 n 0000730533 00000 n 0000730620 00000 n 0000730667 00000 n 0000730754 00000 n 0000730801 00000 n 0000730888 00000 n 0000730933 00000 n 0000731020 00000 n 0000731065 00000 n 0000731152 00000 n 0000731217 00000 n 0000731307 00000 n 0000731394 00000 n 0000731487 00000 n 0000731574 00000 n 0000731672 00000 n 0000731759 00000 n 0000731800 00000 n 0000731886 00000 n 0000731973 00000 n 0000732059 00000 n 0000732146 00000 n 0000732235 00000 n 0000732322 00000 n 0000732420 00000 n 0000732507 00000 n 0000732556 00000 n 0000732642 00000 n 0000732729 00000 n 0000732815 00000 n 0000732902 00000 n 0000732991 00000 n 0000733078 00000 n 0000733176 00000 n 0000733263 00000 n 0000733312 00000 n 0000733398 00000 n 0000733485 00000 n 0000733571 00000 n 0000733658 00000 n 0000733747 00000 n 0000733834 00000 n 0000733931 00000 n 0000734018 00000 n 0000734109 00000 n 0000734196 00000 n 0000734287 00000 n 0000734374 00000 n 0000734468 00000 n 0000734555 00000 n 0000734653 00000 n 0000734740 00000 n 0000734821 00000 n 0000734911 00000 n 0000734998 00000 n 0000735088 00000 n 0000735175 00000 n 0000735268 00000 n 0000735355 00000 n 0000735453 00000 n 0000735540 00000 n 0000735589 00000 n 0000735678 00000 n 0000735765 00000 n 0000735854 00000 n 0000735941 00000 n 0000736033 00000 n 0000736120 00000 n 0000736218 00000 n 0000736305 00000 n 0000736354 00000 n 0000736449 00000 n 0000736536 00000 n 0000736634 00000 n 0000736721 00000 n 0000736819 00000 n 0000736906 00000 n 0000736947 00000 n 0000737042 00000 n 0000737129 00000 n 0000737227 00000 n 0000737314 00000 n 0000737412 00000 n 0000737499 00000 n 0000737540 00000 n 0000737635 00000 n 0000737722 00000 n 0000737820 00000 n 0000737907 00000 n 0000738005 00000 n 0000738092 00000 n 0000738133 00000 n 0000738222 00000 n 0000738309 00000 n 0000738398 00000 n 0000738485 00000 n 0000738574 00000 n 0000738661 00000 n 0000738751 00000 n 0000738838 00000 n 0000738926 00000 n 0000739013 00000 n 0000739101 00000 n 0000739188 00000 n 0000739276 00000 n 0000739363 00000 n 0000739452 00000 n 0000739539 00000 n 0000739630 00000 n 0000739717 00000 n 0000739806 00000 n 0000739897 00000 n 0000739984 00000 n 0000740075 00000 n 0000740162 00000 n 0000740254 00000 n 0000740341 00000 n 0000740439 00000 n 0000740526 00000 n 0000740624 00000 n 0000740711 00000 n 0000740809 00000 n 0000740896 00000 n 0000740988 00000 n 0000741075 00000 n 0000741148 00000 n 0000741243 00000 n 0000741330 00000 n 0000741430 00000 n 0000741517 00000 n 0000741614 00000 n 0000741701 00000 n 0000741742 00000 n 0000741838 00000 n 0000741925 00000 n 0000742026 00000 n 0000742113 00000 n 0000742210 00000 n 0000742297 00000 n 0000742384 00000 n 0000742471 00000 n 0000742560 00000 n 0000742647 00000 n 0000742737 00000 n 0000742824 00000 n 0000742916 00000 n 0000743003 00000 n 0000743100 00000 n 0000743187 00000 n 0000743284 00000 n 0000743371 00000 n 0000743460 00000 n 0000743553 00000 n 0000743640 00000 n 0000743736 00000 n 0000743823 00000 n 0000743920 00000 n 0000744007 00000 n 0000744095 00000 n 0000744182 00000 n 0000744273 00000 n 0000744360 00000 n 0000744457 00000 n 0000744544 00000 n 0000744609 00000 n 0000744696 00000 n 0000744783 00000 n 0000744808 00000 n 0000744898 00000 n 0000744985 00000 n 0000745082 00000 n 0000745169 00000 n 0000745202 00000 n 0000745289 00000 n 0000745376 00000 n 0000745466 00000 n 0000745553 00000 n 0000745651 00000 n 0000745738 00000 n 0000745825 00000 n 0000745912 00000 n 0000746002 00000 n 0000746089 00000 n 0000746146 00000 n 0000746244 00000 n 0000746331 00000 n 0000746419 00000 n 0000746506 00000 n 0000746597 00000 n 0000746684 00000 n 0000746782 00000 n 0000746869 00000 n 0000746956 00000 n 0000747043 00000 n 0000747133 00000 n 0000747220 00000 n 0000747318 00000 n 0000747405 00000 n 0000747492 00000 n 0000747579 00000 n 0000747669 00000 n 0000747756 00000 n 0000747854 00000 n 0000747941 00000 n 0000748037 00000 n 0000748124 00000 n 0000748223 00000 n 0000748310 00000 n 0000748423 00000 n 0000748521 00000 n 0000748608 00000 n 0000748707 00000 n 0000748794 00000 n 0000748897 00000 n 0000748984 00000 n 0000749082 00000 n 0000749169 00000 n 0000749218 00000 n 0000749311 00000 n 0000749398 00000 n 0000749494 00000 n 0000749581 00000 n 0000749679 00000 n 0000749766 00000 n 0000749807 00000 n 0000749900 00000 n 0000749987 00000 n 0000750080 00000 n 0000750167 00000 n 0000750263 00000 n 0000750350 00000 n 0000750448 00000 n 0000750535 00000 n 0000750629 00000 n 0000750716 00000 n 0000750810 00000 n 0000750897 00000 n 0000750994 00000 n 0000751081 00000 n 0000751179 00000 n 0000751266 00000 n 0000751359 00000 n 0000751446 00000 n 0000751539 00000 n 0000751626 00000 n 0000751722 00000 n 0000751809 00000 n 0000751907 00000 n 0000751994 00000 n 0000752107 00000 n 0000752193 00000 n 0000752280 00000 n 0000752369 00000 n 0000752456 00000 n 0000752554 00000 n 0000752641 00000 n 0000752682 00000 n 0000752770 00000 n 0000752857 00000 n 0000752948 00000 n 0000753035 00000 n 0000753133 00000 n 0000753220 00000 n 0000753261 00000 n 0000753348 00000 n 0000753435 00000 n 0000753522 00000 n 0000753609 00000 n 0000753698 00000 n 0000753785 00000 n 0000753874 00000 n 0000753961 00000 n 0000754050 00000 n 0000754137 00000 n 0000754235 00000 n 0000754322 00000 n 0000754420 00000 n 0000754507 00000 n 0000754605 00000 n 0000754692 00000 n 0000754785 00000 n 0000754872 00000 n 0000754968 00000 n 0000755055 00000 n 0000755153 00000 n 0000755240 00000 n 0000755332 00000 n 0000755419 00000 n 0000755514 00000 n 0000755601 00000 n 0000755699 00000 n 0000755786 00000 n 0000755915 00000 n 0000756007 00000 n 0000756094 00000 n 0000756186 00000 n 0000756273 00000 n 0000756368 00000 n 0000756455 00000 n 0000756553 00000 n 0000756640 00000 n 0000756689 00000 n 0000756784 00000 n 0000756871 00000 n 0000756969 00000 n 0000757056 00000 n 0000757154 00000 n 0000757241 00000 n 0000757282 00000 n 0000757375 00000 n 0000757462 00000 n 0000757555 00000 n 0000757642 00000 n 0000757735 00000 n 0000757822 00000 n 0000757915 00000 n 0000758002 00000 n 0000758097 00000 n 0000758184 00000 n 0000758279 00000 n 0000758366 00000 n 0000758461 00000 n 0000758548 00000 n 0000758646 00000 n 0000758733 00000 n 0000758831 00000 n 0000758918 00000 n 0000759016 00000 n 0000759103 00000 n 0000759200 00000 n 0000759292 00000 n 0000759379 00000 n 0000759474 00000 n 0000759561 00000 n 0000759659 00000 n 0000759746 00000 n 0000759844 00000 n 0000759931 00000 n 0000760032 00000 n 0000760119 00000 n 0000760217 00000 n 0000760304 00000 n 0000760399 00000 n 0000760486 00000 n 0000760584 00000 n 0000760671 00000 n 0000760769 00000 n 0000760856 00000 n 0000760957 00000 n 0000761044 00000 n 0000761148 00000 n 0000761235 00000 n 0000761340 00000 n 0000761438 00000 n 0000761525 00000 n 0000761613 00000 n 0000761700 00000 n 0000761791 00000 n 0000761878 00000 n 0000761976 00000 n 0000762063 00000 n 0000762157 00000 n 0000762244 00000 n 0000762341 00000 n 0000762428 00000 n 0000762526 00000 n 0000762613 00000 n 0000762709 00000 n 0000762796 00000 n 0000762895 00000 n 0000762982 00000 n 0000763080 00000 n 0000763167 00000 n 0000763269 00000 n 0000763356 00000 n 0000763461 00000 n 0000763548 00000 n 0000763646 00000 n 0000763733 00000 n 0000763854 00000 n 0000763948 00000 n 0000764035 00000 n 0000764132 00000 n 0000764219 00000 n 0000764317 00000 n 0000764404 00000 n 0000764504 00000 n 0000764591 00000 n 0000764694 00000 n 0000764781 00000 n 0000764879 00000 n 0000764966 00000 n 0000765031 00000 n 0000765126 00000 n 0000765213 00000 n 0000765311 00000 n 0000765398 00000 n 0000765496 00000 n 0000765583 00000 n 0000765684 00000 n 0000765771 00000 n 0000765875 00000 n 0000765962 00000 n 0000766060 00000 n 0000766147 00000 n 0000766212 00000 n 0000766307 00000 n 0000766394 00000 n 0000766492 00000 n 0000766579 00000 n 0000766677 00000 n 0000766764 00000 n 0000766865 00000 n 0000766952 00000 n 0000767056 00000 n 0000767143 00000 n 0000767241 00000 n 0000767328 00000 n 0000767393 00000 n 0000767490 00000 n 0000767577 00000 n 0000767677 00000 n 0000767764 00000 n 0000767862 00000 n 0000767949 00000 n 0000768044 00000 n 0000768131 00000 n 0000768229 00000 n 0000768316 00000 n 0000768414 00000 n 0000768501 00000 n 0000768597 00000 n 0000768684 00000 n 0000768783 00000 n 0000768870 00000 n 0000768968 00000 n 0000769055 00000 n 0000769150 00000 n 0000769237 00000 n 0000769335 00000 n 0000769422 00000 n 0000769520 00000 n 0000769607 00000 n 0000769698 00000 n 0000769785 00000 n 0000769879 00000 n 0000769966 00000 n 0000770064 00000 n 0000770151 00000 n 0000770288 00000 n 0000770381 00000 n 0000770468 00000 n 0000770564 00000 n 0000770651 00000 n 0000770750 00000 n 0000770837 00000 n 0000770930 00000 n 0000771017 00000 n 0000771113 00000 n 0000771200 00000 n 0000771299 00000 n 0000771386 00000 n 0000771474 00000 n 0000771561 00000 n 0000771652 00000 n 0000771739 00000 n 0000771838 00000 n 0000771925 00000 n 0000772021 00000 n 0000772108 00000 n 0000772207 00000 n 0000772294 00000 n 0000772393 00000 n 0000772480 00000 n 0000772569 00000 n 0000772656 00000 n 0000772748 00000 n 0000772835 00000 n 0000772934 00000 n 0000773021 00000 n 0000773158 00000 n 0000773253 00000 n 0000773340 00000 n 0000773438 00000 n 0000773525 00000 n 0000773624 00000 n 0000773711 00000 n 0000773802 00000 n 0000773889 00000 n 0000773983 00000 n 0000774070 00000 n 0000774168 00000 n 0000774255 00000 n 0000774347 00000 n 0000774434 00000 n 0000774529 00000 n 0000774616 00000 n 0000774714 00000 n 0000774801 00000 n 0000774898 00000 n 0000774985 00000 n 0000775085 00000 n 0000775172 00000 n 0000775266 00000 n 0000775353 00000 n 0000775466 00000 n 0000775564 00000 n 0000775651 00000 n 0000775749 00000 n 0000775836 00000 n 0000775937 00000 n 0000776024 00000 n 0000776122 00000 n 0000776209 00000 n 0000776283 00000 n 0000776369 00000 n 0000776426 00000 n 0000776514 00000 n 0000776601 00000 n 0000776692 00000 n 0000776779 00000 n 0000776877 00000 n 0000776964 00000 n 0000777056 00000 n 0000777143 00000 n 0000777238 00000 n 0000777325 00000 n 0000777423 00000 n 0000777510 00000 n 0000777601 00000 n 0000777688 00000 n 0000777782 00000 n 0000777869 00000 n 0000777967 00000 n 0000778054 00000 n 0000778147 00000 n 0000778234 00000 n 0000778330 00000 n 0000778417 00000 n 0000778515 00000 n 0000778602 00000 n 0000778715 00000 n 0000778770 00000 n 0000778856 00000 n 0000778943 00000 n 0000779030 00000 n 0000779120 00000 n 0000779207 00000 n 0000779305 00000 n 0000779392 00000 n 0000779485 00000 n 0000779572 00000 n 0000779668 00000 n 0000779755 00000 n 0000779853 00000 n 0000779940 00000 n 0000780013 00000 n 0000780104 00000 n 0000780191 00000 n 0000780285 00000 n 0000780372 00000 n 0000780470 00000 n 0000780557 00000 n 0000780621 00000 n 0000780707 00000 n 0000780758 00000 n 0000780845 00000 n 0000780896 00000 n 0000780982 00000 n 0000781060 00000 n 0000781146 00000 n 0000781217 00000 n 0000781303 00000 n 0000781355 00000 n 0000781442 00000 n 0000781494 00000 n 0000781580 00000 n 0000781660 00000 n 0000781747 00000 n 0000781852 00000 n 0000781944 00000 n 0000782031 00000 n 0000782126 00000 n 0000782213 00000 n 0000782310 00000 n 0000782397 00000 n 0000782438 00000 n 0000782527 00000 n 0000782614 00000 n 0000782703 00000 n 0000782790 00000 n 0000782882 00000 n 0000782969 00000 n 0000783067 00000 n 0000783154 00000 n 0000783250 00000 n 0000783337 00000 n 0000783433 00000 n 0000783520 00000 n 0000783619 00000 n 0000783706 00000 n 0000783804 00000 n 0000783891 00000 n 0000783972 00000 n 0000784065 00000 n 0000784152 00000 n 0000784245 00000 n 0000784332 00000 n 0000784428 00000 n 0000784515 00000 n 0000784613 00000 n 0000784700 00000 n 0000784789 00000 n 0000784876 00000 n 0000784965 00000 n 0000785052 00000 n 0000785144 00000 n 0000785231 00000 n 0000785329 00000 n 0000785416 00000 n 0000785506 00000 n 0000785593 00000 n 0000785683 00000 n 0000785770 00000 n 0000785863 00000 n 0000785950 00000 n 0000786048 00000 n 0000786135 00000 n 0000786248 00000 n 0000786345 00000 n 0000786432 00000 n 0000786529 00000 n 0000786616 00000 n 0000786716 00000 n 0000786803 00000 n 0000786901 00000 n 0000786988 00000 n 0000787084 00000 n 0000787171 00000 n 0000787270 00000 n 0000787357 00000 n 0000787455 00000 n 0000787542 00000 n 0000787638 00000 n 0000787725 00000 n 0000787825 00000 n 0000787912 00000 n 0000788010 00000 n 0000788097 00000 n 0000788194 00000 n 0000788283 00000 n 0000788370 00000 n 0000788462 00000 n 0000788549 00000 n 0000788646 00000 n 0000788733 00000 n 0000788822 00000 n 0000788909 00000 n 0000789001 00000 n 0000789088 00000 n 0000789185 00000 n 0000789272 00000 n 0000789368 00000 n 0000789455 00000 n 0000789554 00000 n 0000789641 00000 n 0000789739 00000 n 0000789826 00000 n 0000789915 00000 n 0000790012 00000 n 0000790099 00000 n 0000790199 00000 n 0000790286 00000 n 0000790383 00000 n 0000790470 00000 n 0000790567 00000 n 0000790654 00000 n 0000790754 00000 n 0000790841 00000 n 0000790938 00000 n 0000791025 00000 n 0000791090 00000 n 0000791187 00000 n 0000791274 00000 n 0000791374 00000 n 0000791461 00000 n 0000791558 00000 n 0000791645 00000 n 0000791742 00000 n 0000791829 00000 n 0000791929 00000 n 0000792016 00000 n 0000792113 00000 n 0000792200 00000 n 0000792265 00000 n 0000792347 00000 n 0000792434 00000 n 0000792531 00000 n 0000792618 00000 n 0000792718 00000 n 0000792805 00000 n 0000792902 00000 n 0000792989 00000 n 0000793038 00000 n 0000793133 00000 n 0000793220 00000 n 0000793318 00000 n 0000793405 00000 n 0000793502 00000 n 0000793589 00000 n 0000793671 00000 n 0000793757 00000 n 0000793847 00000 n 0000793934 00000 n 0000794027 00000 n 0000794114 00000 n 0000794211 00000 n 0000794298 00000 n 0000794395 00000 n 0000794482 00000 n 0000794582 00000 n 0000794669 00000 n 0000794766 00000 n 0000794853 00000 n 0000794950 00000 n 0000795039 00000 n 0000795126 00000 n 0000795218 00000 n 0000795305 00000 n 0000795401 00000 n 0000795488 00000 n 0000795575 00000 n 0000795662 00000 n 0000795749 00000 n 0000795836 00000 n 0000795926 00000 n 0000796013 00000 n 0000796103 00000 n 0000796190 00000 n 0000796287 00000 n 0000796374 00000 n 0000796471 00000 n 0000796558 00000 n 0000796647 00000 n 0000796737 00000 n 0000796824 00000 n 0000796914 00000 n 0000797002 00000 n 0000797096 00000 n 0000797185 00000 n 0000797284 00000 n 0000797373 00000 n 0000797469 00000 n 0000797558 00000 n 0000797657 00000 n 0000797746 00000 n 0000797845 00000 n 0000797934 00000 n 0000798023 00000 n 0000798112 00000 n 0000798204 00000 n 0000798293 00000 n 0000798392 00000 n 0000798481 00000 n 0000798588 00000 n 0000798683 00000 n 0000798772 00000 n 0000798870 00000 n 0000798959 00000 n 0000799058 00000 n 0000799147 00000 n 0000799242 00000 n 0000799331 00000 n 0000799429 00000 n 0000799518 00000 n 0000799616 00000 n 0000799705 00000 n 0000799807 00000 n 0000799896 00000 n 0000800001 00000 n 0000800090 00000 n 0000800189 00000 n 0000800278 00000 n 0000800377 00000 n 0000800470 00000 n 0000800559 00000 n 0000800655 00000 n 0000800744 00000 n 0000800842 00000 n 0000800931 00000 n 0000801027 00000 n 0000801116 00000 n 0000801215 00000 n 0000801304 00000 n 0000801403 00000 n 0000801492 00000 n 0000801564 00000 n 0000801648 00000 n 0000801736 00000 n 0000801763 00000 n 0000801864 00000 n 0000801953 00000 n 0000802057 00000 n 0000802146 00000 n 0000802245 00000 n 0000802334 00000 n 0000802432 00000 n 0000802521 00000 n 0000802575 00000 n 0000802676 00000 n 0000802765 00000 n 0000802864 00000 n 0000802953 00000 n 0000803054 00000 n 0000803143 00000 n 0000803247 00000 n 0000803336 00000 n 0000803435 00000 n 0000803524 00000 n 0000803619 00000 n 0000803708 00000 n 0000803806 00000 n 0000803895 00000 n 0000803994 00000 n 0000804083 00000 n 0000804173 00000 n 0000804270 00000 n 0000804359 00000 n 0000804459 00000 n 0000804548 00000 n 0000804642 00000 n 0000804731 00000 n 0000804828 00000 n 0000804917 00000 n 0000805019 00000 n 0000805108 00000 n 0000805213 00000 n 0000805302 00000 n 0000805374 00000 n 0000805471 00000 n 0000805560 00000 n 0000805660 00000 n 0000805749 00000 n 0000805846 00000 n 0000805935 00000 n 0000806035 00000 n 0000806124 00000 n 0000806226 00000 n 0000806315 00000 n 0000806420 00000 n 0000806509 00000 n 0000806610 00000 n 0000806699 00000 n 0000806803 00000 n 0000806892 00000 n 0000806992 00000 n 0000807081 00000 n 0000807184 00000 n 0000807273 00000 n 0000807381 00000 n 0000807476 00000 n 0000807565 00000 n 0000807662 00000 n 0000807751 00000 n 0000807846 00000 n 0000807935 00000 n 0000808030 00000 n 0000808119 00000 n 0000808214 00000 n 0000808303 00000 n 0000808401 00000 n 0000808490 00000 n 0000808588 00000 n 0000808677 00000 n 0000808775 00000 n 0000808864 00000 n 0000808962 00000 n 0000809051 00000 n 0000809150 00000 n 0000809186 00000 n 0000809222 00000 n 0000811137 00000 n 0000811182 00000 n 0000811227 00000 n 0000811272 00000 n 0000811317 00000 n 0000811362 00000 n 0000811407 00000 n 0000811452 00000 n 0000811497 00000 n 0000811542 00000 n 0000811587 00000 n 0000811632 00000 n 0000811677 00000 n 0000811722 00000 n 0000811767 00000 n 0000811812 00000 n 0000811857 00000 n 0000811902 00000 n 0000811947 00000 n 0000811992 00000 n 0000812037 00000 n 0000812082 00000 n 0000812127 00000 n 0000812172 00000 n 0000812217 00000 n 0000812262 00000 n 0000812307 00000 n 0000812352 00000 n 0000812397 00000 n 0000812442 00000 n 0000812487 00000 n 0000812532 00000 n 0000812577 00000 n 0000812622 00000 n 0000812667 00000 n 0000812712 00000 n 0000812757 00000 n 0000812802 00000 n 0000812847 00000 n 0000812892 00000 n 0000812937 00000 n 0000812982 00000 n 0000813027 00000 n 0000813072 00000 n 0000813117 00000 n 0000813162 00000 n 0000813207 00000 n 0000813252 00000 n 0000813297 00000 n 0000813342 00000 n 0000813387 00000 n 0000813432 00000 n 0000813477 00000 n 0000813522 00000 n 0000813567 00000 n 0000813612 00000 n 0000813657 00000 n 0000813702 00000 n 0000813747 00000 n 0000813792 00000 n 0000813837 00000 n 0000813882 00000 n 0000813927 00000 n 0000813972 00000 n 0000814017 00000 n 0000814062 00000 n 0000814107 00000 n 0000814152 00000 n 0000814197 00000 n 0000814242 00000 n 0000814287 00000 n 0000814332 00000 n 0000814377 00000 n 0000814422 00000 n 0000814467 00000 n 0000814512 00000 n 0000814557 00000 n 0000814602 00000 n 0000814647 00000 n 0000814692 00000 n 0000814737 00000 n 0000814782 00000 n 0000814827 00000 n 0000814872 00000 n 0000814917 00000 n 0000814962 00000 n 0000815007 00000 n 0000815052 00000 n 0000815097 00000 n 0000815142 00000 n 0000815187 00000 n 0000815232 00000 n 0000815277 00000 n 0000815322 00000 n 0000815367 00000 n 0000815412 00000 n 0000815457 00000 n 0000815502 00000 n 0000815547 00000 n 0000815592 00000 n 0000815637 00000 n 0000815682 00000 n 0000815727 00000 n 0000815772 00000 n 0000815817 00000 n 0000815862 00000 n 0000815907 00000 n 0000815952 00000 n 0000816928 00000 n 0000817131 00000 n 0000817413 00000 n 0000817609 00000 n 0000819771 00000 n 0000819967 00000 n 0000822130 00000 n 0000822326 00000 n 0000823017 00000 n 0000823188 00000 n 0000824556 00000 n 0000824758 00000 n 0000826381 00000 n 0000826604 00000 n 0000827544 00000 n 0000827736 00000 n 0000828808 00000 n 0000828980 00000 n 0000829519 00000 n 0000829736 00000 n 0000831368 00000 n 0000831539 00000 n 0000833397 00000 n 0000833603 00000 n 0000835614 00000 n 0000835831 00000 n 0000837413 00000 n 0000837640 00000 n 0000838943 00000 n 0000839170 00000 n 0000840307 00000 n 0000840509 00000 n 0000841830 00000 n 0000842011 00000 n 0000843199 00000 n 0000843390 00000 n 0000844736 00000 n 0000844938 00000 n 0000846295 00000 n 0000846497 00000 n 0000847591 00000 n 0000847772 00000 n 0000848471 00000 n 0000848663 00000 n 0000850078 00000 n 0000850259 00000 n 0000851773 00000 n 0000851975 00000 n 0000853621 00000 n 0000853837 00000 n 0000855180 00000 n 0000855406 00000 n 0000856614 00000 n 0000856820 00000 n 0000857824 00000 n 0000858062 00000 n 0000859088 00000 n 0000859326 00000 n 0000860579 00000 n 0000860807 00000 n 0000861788 00000 n 0000861991 00000 n 0000863223 00000 n 0000863409 00000 n 0000864502 00000 n 0000864708 00000 n 0000865820 00000 n 0000866016 00000 n 0000866557 00000 n 0000866773 00000 n 0000868290 00000 n 0000868496 00000 n 0000869825 00000 n 0000870051 00000 n 0000871373 00000 n 0000871589 00000 n 0000872591 00000 n 0000872797 00000 n 0000873980 00000 n 0000874203 00000 n 0000874920 00000 n 0000875123 00000 n 0000875885 00000 n 0000876134 00000 n 0000877069 00000 n 0000877307 00000 n 0000878153 00000 n 0000878334 00000 n 0000879186 00000 n 0000879424 00000 n 0000880357 00000 n 0000880570 00000 n 0000881037 00000 n 0000881259 00000 n 0000883459 00000 n 0000883665 00000 n 0000884661 00000 n 0000884857 00000 n 0000885435 00000 n 0000885651 00000 n 0000886707 00000 n 0000886913 00000 n 0000887893 00000 n 0000888109 00000 n 0000888946 00000 n 0000889162 00000 n 0000890106 00000 n 0000890302 00000 n 0000890715 00000 n 0000890942 00000 n 0000892088 00000 n 0000892294 00000 n 0000893328 00000 n 0000893567 00000 n 0000894377 00000 n 0000894583 00000 n 0000896071 00000 n 0000896277 00000 n 0000897402 00000 n 0000897615 00000 n 0000898400 00000 n 0000898648 00000 n 0000899560 00000 n 0000899766 00000 n 0000901011 00000 n 0000901217 00000 n 0000902286 00000 n 0000902502 00000 n 0000903658 00000 n 0000903874 00000 n 0000904843 00000 n 0000905039 00000 n 0000905835 00000 n 0000906041 00000 n 0000907117 00000 n 0000907303 00000 n 0000908324 00000 n 0000908510 00000 n 0000909431 00000 n 0000909617 00000 n 0000910464 00000 n 0000910650 00000 n 0000911545 00000 n 0000911731 00000 n 0000912581 00000 n 0000912767 00000 n 0000913711 00000 n 0000913897 00000 n 0000914972 00000 n 0000915168 00000 n 0000916274 00000 n 0000916480 00000 n 0000917711 00000 n 0000917927 00000 n 0000919121 00000 n 0000919327 00000 n 0000921190 00000 n 0000921386 00000 n 0000922232 00000 n 0000922438 00000 n 0000923549 00000 n 0000923745 00000 n 0000924837 00000 n 0000925033 00000 n 0000926429 00000 n 0000926645 00000 n 0000927751 00000 n 0000927989 00000 n 0000928753 00000 n 0000928959 00000 n 0000929816 00000 n 0000930054 00000 n 0000930886 00000 n 0000931092 00000 n 0000932182 00000 n 0000932408 00000 n 0000933584 00000 n 0000933791 00000 n 0000934734 00000 n 0000934942 00000 n 0000936057 00000 n 0000936264 00000 n 0000936937 00000 n 0000937166 00000 n 0000937949 00000 n 0000938140 00000 n 0000939009 00000 n 0000939201 00000 n 0000939993 00000 n 0000940206 00000 n 0000940958 00000 n 0000941175 00000 n 0000942752 00000 n 0000942949 00000 n 0000943906 00000 n 0000944087 00000 n 0000945480 00000 n 0000945683 00000 n 0000946689 00000 n 0000946886 00000 n 0000947751 00000 n 0000947948 00000 n 0000948848 00000 n 0000949045 00000 n 0000950115 00000 n 0000950276 00000 n 0000950505 00000 n 0000950564 00000 n 0000950667 00000 n 0000950821 00000 n 0000950944 00000 n 0000951054 00000 n 0000951176 00000 n 0000951289 00000 n 0000951472 00000 n 0000951619 00000 n 0000951731 00000 n 0000951855 00000 n 0000951970 00000 n 0000952079 00000 n 0000952250 00000 n 0000952379 00000 n 0000952486 00000 n 0000952607 00000 n 0000952722 00000 n 0000952845 00000 n 0000952969 00000 n 0000953076 00000 n 0000953252 00000 n 0000953374 00000 n 0000953498 00000 n 0000953616 00000 n 0000953739 00000 n 0000953852 00000 n 0000954022 00000 n 0000954151 00000 n 0000954247 00000 n 0000954342 00000 n 0000954510 00000 n 0000954646 00000 n 0000954750 00000 n 0000954868 00000 n 0000954997 00000 n 0000955144 00000 n 0000955282 00000 n 0000955441 00000 n 0000955575 00000 n 0000955686 00000 n 0000955809 00000 n 0000955968 00000 n 0000956064 00000 n 0000956239 00000 n 0000956362 00000 n 0000956465 00000 n 0000956601 00000 n 0000956717 00000 n 0000956821 00000 n 0000956975 00000 n 0000957098 00000 n 0000957200 00000 n 0000957340 00000 n 0000957463 00000 n 0000957573 00000 n 0000957699 00000 n 0000957821 00000 n 0000957944 00000 n trailer <]>> startxref 958347 %%EOF ga-5-4/global/doc/README0000644000175000017500000000073112662210452012716 0ustar mbambaDocumentation for Global Arrays ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - user.pdf -- User's Manual for GA 3.0 in Adobe PDF format. - Supercomputing94.pdf -- The original SC'94 paper describing GA. You need to use Acrobat Reader version at least 3.0 to view and print these documents. This program is available for free from: http://www.adobe.com/prodindex/acrobat/readstep.html More documentation is available at the GA homepage: http://www.emsl.pnl.gov/docs/global ga-5-4/global/src/0000755000175000017500000000000012662210457012064 5ustar mbambaga-5-4/global/src/global.npatch.c0000644000175000017500000030162412662210457014752 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * module: global.npatch.c * author: Jialin Ju * description: Implements the n-dimensional patch operations: * - fill patch * - copy patch * - scale patch * - dot patch * - add patch * * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #if HAVE_MATH_H # include #endif #include "message.h" #include "globalp.h" #include "armci.h" #include "ga-papi.h" #include "ga-wapi.h" #ifdef MSG_COMMS_MPI extern ARMCI_Group* ga_get_armci_group_(int); #endif /********************************************************** * n-dimensional utilities * **********************************************************/ /*\ compute Index from subscript and convert it back to subscript * in another array \*/ static void snga_dest_indices(Integer ndims, Integer *los, Integer *blos, Integer *dimss, Integer ndimd, Integer *lod, Integer *blod, Integer *dimsd) { Integer idx = 0, i, factor=1; for(i=0;i bndim) { ndim = bndim; for(i=ndim; i adims[i]) pnga_error("g_a indices out of range ", 0L); for(i=0; i bdims[i]) pnga_error("g_b indices out of range ", 0L); /* check if numbers of elements in two patches match each other */ atotal = 1; btotal = 1; for(i=0; i= 0 || num_blocks_b >= 0) { if (!(*trans == 'n' || *trans == 'N')) { pnga_error("Transpose option not supported for block-cyclic data", 0L); } if (!snga_test_shape(alo, ahi, blo, bhi, andim, bndim)) { pnga_error("Change in shape not supported for block-cyclic data", 0L); } } if (num_blocks_a < 0 && num_blocks_b <0) { /* now find out cordinates of a patch of g_a that I own */ if (use_put) { pnga_distribution(g_a, me_a, los, his); } else { pnga_distribution(g_b, me_b, los, his); } /* copy my share of data */ if (use_put) { has_intersection = pnga_patch_intersect(alo, ahi, los, his, andim); } else { has_intersection = pnga_patch_intersect(blo, bhi, los, his, bndim); } if(has_intersection){ if (use_put) { pnga_access_ptr(g_a, los, his, &src_data_ptr, ld); } else { pnga_access_ptr(g_b, los, his, &src_data_ptr, ld); } /* calculate the number of elements in the patch that I own */ nelem = 1; for(i=0; i destination[lo:hi] */ if (use_put) { snga_dest_indices(andim, los, alo, ald, bndim, lod, blo, bld); snga_dest_indices(andim, his, alo, ald, bndim, hid, blo, bld); pnga_put(g_b, lod, hid, src_data_ptr, ld); pnga_release(g_a, los, his); } else { snga_dest_indices(bndim, los, blo, bld, andim, lod, alo, ald); snga_dest_indices(bndim, his, blo, bld, andim, hid, alo, ald); pnga_get(g_a, lod, hid, src_data_ptr, ld); pnga_release(g_b, los, his); } /*** due to generality of this transformation scatter is required ***/ } else{ if (use_put) { tmp_ptr = ga_malloc(nelem, atype, "v"); src_idx_ptr = (Integer*) ga_malloc((andim*nelem), MT_F_INT, "si"); dst_idx_ptr = (Integer*) ga_malloc((bndim*nelem), MT_F_INT, "di"); /* calculate the destination indices */ /* given los and his, find indices for each elements * bvalue: starting index in each dimension * bunit: stride in each dimension */ for (i=0; i his[j]) bvalue[j] = los[j]; } } /* index factor: reshaping without transpose */ factor_idx1[0] = 1; for (j=1; j=0; j--) factor_idx2[j] = factor_idx2[j+1] * ald[j+1]; /* data factor */ factor_data[0] = 1; for (j=1; j (..., j, i) */ for (j=(andim-1); j>=0; j--) idx += (src_idx_ptr[i*andim+j] - alo[j]) * factor_idx2[j]; /* convert the one dimensional index to n-dimensional * indices of destination */ for (j=0; j his[j]) bvalue[j] = los[j]; } } /* index factor: reshaping without transpose */ factor_idx1[0] = 1; for (j=1; j=0; j--) factor_idx2[j] = factor_idx2[j+1] * bld[j+1]; /* data factor */ factor_data[0] = 1; for (j=1; j (..., j, i) */ for (j=(andim-1); j>=0; j--) idx += (src_idx_ptr[i*bndim+j] - blo[j]) * factor_idx2[j]; /* convert the one dimensional index to n-dimensional * indices of destination */ for (j=0; j= 0) { /* Uses simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (i = me_a; i < num_blocks_a; i += anproc) { pnga_distribution(g_a, i, los, his); /* make temporory copies of los, his since ngai_patch_intersection destroys original versions */ for (j=0; j < andim; j++) { lod[j] = los[j]; hid[j] = his[j]; } if (pnga_patch_intersect(alo,ahi,los,his,andim)) { pnga_access_block_ptr(g_a, i, &src_data_ptr, ld); offset = 0; last = andim - 1; jtot = 1; for (j=0; j adims[i]) his[i] = adims[i]; /*if (his[i] < los[i]) chk = 0;*/ } /* make temporory copies of los, his since ngai_patch_intersection destroys original versions */ for (j=0; j < andim; j++) { lod[j] = los[j]; hid[j] = his[j]; } if (pnga_patch_intersect(alo,ahi,los,his,andim)) { pnga_access_block_grid_ptr(g_a, index, &src_data_ptr, ld); offset = 0; last = andim - 1; jtot = 1; for (j=0; j= blocks[i] && i= 0) { /* Uses simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_b)) { for (i = me_b; i < num_blocks_b; i += bnproc) { pnga_distribution(g_b, i, los, his); /* make temporory copies of los, his since ngai_patch_intersection destroys original versions */ for (j=0; j < andim; j++) { lod[j] = los[j]; hid[j] = his[j]; } if (pnga_patch_intersect(blo,bhi,los,his,andim)) { pnga_access_block_ptr(g_b, i, &src_data_ptr, ld); offset = 0; last = bndim - 1; jtot = 1; for (j=0; j bdims[i]) his[i] = bdims[i]; /*if (his[i] < los[i]) chk = 0;*/ } /* make temporory copies of los, his since ngai_patch_intersection destroys original versions */ for (j=0; j < andim; j++) { lod[j] = los[j]; hid[j] = his[j]; } if (pnga_patch_intersect(blo,bhi,los,his,andim)) { pnga_access_block_grid_ptr(g_b, index, &src_data_ptr, ld); offset = 0; last = bndim - 1; jtot = 1; for (j=0; j= blocks[i] && i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) isum += ((int *)A_ptr)[idx+j] * ((int *)B_ptr)[idx+j]; } *(int*)retval += isum; break; case C_DCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { DoubleComplex a = ((DoubleComplex *)A_ptr)[idx+j]; DoubleComplex b = ((DoubleComplex *)B_ptr)[idx+j]; zsum.real += a.real*b.real - b.imag * a.imag; zsum.imag += a.imag*b.real + b.imag * a.real; } } ((double*)retval)[0] += zsum.real; ((double*)retval)[1] += zsum.imag; break; case C_SCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { SingleComplex a = ((SingleComplex *)A_ptr)[idx+j]; SingleComplex b = ((SingleComplex *)B_ptr)[idx+j]; csum.real += a.real*b.real - b.imag * a.imag; csum.imag += a.imag*b.real + b.imag * a.real; } } ((float*)retval)[0] += csum.real; ((float*)retval)[1] += csum.imag; break; case C_DBL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) dsum += ((double*)A_ptr)[idx+j] * ((double*)B_ptr)[idx+j]; } *(double*)retval += dsum; break; case C_FLOAT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) fsum += ((float *)A_ptr)[idx+j] * ((float *)B_ptr)[idx+j]; } *(float*)retval += fsum; break; case C_LONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) lsum += ((long *)A_ptr)[idx+j] * ((long *)B_ptr)[idx+j]; } *(long*)retval += lsum; break; case C_LONGLONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) llsum += ((long long *)A_ptr)[idx+j] * ((long long *)B_ptr)[idx+j]; } *(long long*)retval += llsum; break; default: pnga_error("snga_dot_local_patch: type not supported",atype); } } /*\ generic dot product routine \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_dot_patch = pnga_dot_patch #endif void pnga_dot_patch(Integer g_a, char *t_a, Integer *alo, Integer *ahi, Integer g_b, char *t_b, Integer *blo, Integer *bhi, void *retval) { Integer i=0, j=0; Integer compatible=0; Integer atype=0, btype=0, andim=0, adims[MAXDIM], bndim=0, bdims[MAXDIM]; Integer loA[MAXDIM], hiA[MAXDIM], ldA[MAXDIM]; Integer loB[MAXDIM], hiB[MAXDIM], ldB[MAXDIM]; Integer g_A = g_a, g_B = g_b; void *A_ptr=NULL, *B_ptr=NULL; Integer ctype=0; Integer atotal=0, btotal=0; int isum=0, alen=0; long lsum=0; long long llsum=0; double dsum=0; DoubleComplex zsum={0,0}; DoubleComplex csum={0,0}; float fsum=0; Integer me= pnga_nodeid(), temp_created=0; Integer nproc = pnga_nnodes(); Integer num_blocks_a=0, num_blocks_b=0; char *tempname = "temp", transp, transp_a, transp_b; int local_sync_begin=0; Integer a_grp=0, b_grp=0; local_sync_begin = _ga_sync_begin; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("pnga_dot_patch"); a_grp = pnga_get_pgroup(g_a); b_grp = pnga_get_pgroup(g_b); if (a_grp != b_grp) pnga_error("Both arrays must be defined on same group",0L); me = pnga_pgroup_nodeid(a_grp); pnga_inquire(g_a, &atype, &andim, adims); pnga_inquire(g_b, &btype, &bndim, bdims); if(atype != btype ) pnga_error(" type mismatch ", 0L); /* check if patch indices and g_a dims match */ for(i=0; i adims[i]) pnga_error("g_a indices out of range ", g_a); for(i=0; i bdims[i]) pnga_error("g_b indices out of range ", g_b); /* check if numbers of elements in two patches match each other */ atotal = 1; for(i=0; i= 0 || num_blocks_b >= 0) { if (transp_a == 't' || transp_b == 't') pnga_error("transpose not supported for block-cyclic data ", 0); } isum = 0; dsum = 0.; zsum.real = 0.; zsum.imag = 0.; fsum = 0;lsum=0;llsum=0; csum.real = 0.; csum.imag = 0.; switch (atype){ case C_INT: *(int*)retval = isum; alen = 1; break; case C_DCPL: ((double*)retval)[0] = zsum.real; ((double*)retval)[1] = zsum.imag; alen = 2; break; case C_SCPL: ((float*)retval)[0] = csum.real; ((float*)retval)[1] = csum.imag; alen = 2; break; case C_DBL: *(double*)retval = dsum; alen = 1; break; case C_FLOAT: *(float*)retval = fsum; alen = 1; break; case C_LONG: *(long*)retval = lsum; alen = 1; break; case C_LONGLONG: *(long long*)retval = llsum; alen = 1; break; default: pnga_error("snga_dot_local_patch: type not supported",atype); } if (num_blocks_a < 0 && num_blocks_b < 0) { /* find out coordinates of patches of g_A and g_B that I own */ pnga_distribution(g_A, me, loA, hiA); pnga_distribution(g_B, me, loB, hiB); if(pnga_comp_patch(andim, loA, hiA, bndim, loB, hiB) && pnga_comp_patch(andim, alo, ahi, bndim, blo, bhi)) compatible = 1; else compatible = 0; pnga_gop(pnga_type_f2c(MT_F_INT), &compatible, 1, "*"); if(!(compatible && (transp=='n'))) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_a * - copy & reshape patch of g_b into g_B */ if (!pnga_duplicate(g_a, &g_B, tempname)) pnga_error("duplicate failed",0L); pnga_copy_patch(&transp, g_b, blo, bhi, g_B, alo, ahi); bndim = andim; temp_created = 1; pnga_distribution(g_B, me, loB, hiB); } if(!pnga_comp_patch(andim, loA, hiA, bndim, loB, hiB)) pnga_error(" patches mismatch ",0); /* A[83:125,1:1] <==> B[83:125] */ if(andim > bndim) andim = bndim; /* need more work */ /* determine subsets of my patches to access */ if(pnga_patch_intersect(alo, ahi, loA, hiA, andim)){ pnga_access_ptr(g_A, loA, hiA, &A_ptr, ldA); pnga_access_ptr(g_B, loA, hiA, &B_ptr, ldB); snga_dot_local_patch(atype, andim, loA, hiA, ldA, A_ptr, B_ptr, &alen, retval); /* release access to the data */ pnga_release(g_A, loA, hiA); pnga_release(g_B, loA, hiA); } } else { /* Create copy of g_b identical with identical distribution as g_a */ if (!pnga_duplicate(g_a, &g_B, tempname)) pnga_error("duplicate failed",0L); pnga_copy_patch(&transp, g_b, blo, bhi, g_B, alo, ahi); temp_created = 1; /* If g_a regular distribution, then just use normal dot product on patch */ if (num_blocks_a < 0) { /* find out coordinates of patches of g_A and g_B that I own */ pnga_distribution(g_A, me, loA, hiA); pnga_distribution(g_B, me, loB, hiB); if(!pnga_comp_patch(andim, loA, hiA, bndim, loB, hiB)) pnga_error(" patches mismatch ",0); /* A[83:125,1:1] <==> B[83:125] */ if(andim > bndim) andim = bndim; /* need more work */ if(pnga_patch_intersect(alo, ahi, loA, hiA, andim)){ pnga_access_ptr(g_A, loA, hiA, &A_ptr, ldA); pnga_access_ptr(g_B, loA, hiA, &B_ptr, ldB); snga_dot_local_patch(atype, andim, loA, hiA, ldA, A_ptr, B_ptr, &alen, retval); /* release access to the data */ pnga_release(g_A, loA, hiA); pnga_release(g_B, loA, hiA); } } else { Integer lo[MAXDIM]/*, hi[MAXDIM]*/; Integer offset, jtot, last; /* simple block cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (i=me; i adims[i]) hiA[i] = adims[i]; /*if (hiA[i] < loA[i]) chk = 0;*/ } /* make copies of loA and hiA since pnga_patch_intersect destroys original versions */ for (j=0; j= blocks[i] && i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((int *)data_ptr)[idx+j] = *(int*)val; } break; case C_DCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { DoubleComplex tmp = *(DoubleComplex *)val; ((DoubleComplex *)data_ptr)[idx+j].real = tmp.real; ((DoubleComplex *)data_ptr)[idx+j].imag = tmp.imag; } } break; case C_SCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { SingleComplex tmp = *(SingleComplex *)val; ((SingleComplex *)data_ptr)[idx+j].real = tmp.real; ((SingleComplex *)data_ptr)[idx+j].imag = tmp.imag; } } break; case C_DBL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((double*)data_ptr)[idx+j] = *(double*)val; } break; case C_FLOAT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((float *)data_ptr)[idx+j] = *(float*)val; } break; case C_LONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long *)data_ptr)[idx+j] = *(long*)val; } break; case C_LONGLONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long long*)data_ptr)[idx+j] = *(long long*)val; } break; default: pnga_error(" wrong data type ",type); } } /*\ FILL IN ARRAY WITH VALUE \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_fill_patch = pnga_fill_patch #endif void pnga_fill_patch(Integer g_a, Integer *lo, Integer *hi, void* val) { Integer i; Integer ndim, dims[MAXDIM], type; Integer loA[MAXDIM], hiA[MAXDIM], ld[MAXDIM]; void *data_ptr; Integer num_blocks, nproc; Integer me= pnga_nodeid(); int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("nga_fill_patch"); pnga_inquire(g_a, &type, &ndim, dims); num_blocks = pnga_total_blocks(g_a); if (num_blocks < 0) { /* get limits of VISIBLE patch */ pnga_distribution(g_a, me, loA, hiA); /* determine subset of my local patch to access */ /* Output is in loA and hiA */ if(pnga_patch_intersect(lo, hi, loA, hiA, ndim)){ /* get data_ptr to corner of patch */ /* ld are leading dimensions INCLUDING ghost cells */ pnga_access_ptr(g_a, loA, hiA, &data_ptr, ld); /* set all values in patch to *val */ snga_set_patch_value(type, ndim, loA, hiA, ld, data_ptr, val); /* release access to the data */ pnga_release_update(g_a, loA, hiA); } } else { Integer offset, j, jtmp, chk; Integer loS[MAXDIM]; nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)){ for (i=me; i dims[i]) hiA[i] = dims[i]; if (hiA[i] < loA[i]) chk = 0; } /* loA is changed by pnga_patch_intersect, so save a copy */ for (j=0; j= blocks[i] && i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((double*)src_data_ptr)[idx+j] *= *(double*)alpha; } break; case C_DCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { tmp1_real =((DoubleComplex *)src_data_ptr)[idx+j].real; tmp1_imag =((DoubleComplex *)src_data_ptr)[idx+j].imag; tmp2_real = (*(DoubleComplex*)alpha).real; tmp2_imag = (*(DoubleComplex*)alpha).imag; ((DoubleComplex *)src_data_ptr)[idx+j].real = tmp1_real*tmp2_real - tmp1_imag * tmp2_imag; ((DoubleComplex *)src_data_ptr)[idx+j].imag = tmp2_imag*tmp1_real + tmp1_imag * tmp2_real; } } break; case C_SCPL: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) { ftmp1_real =((SingleComplex *)src_data_ptr)[idx+j].real; ftmp1_imag =((SingleComplex *)src_data_ptr)[idx+j].imag; ftmp2_real = (*(SingleComplex*)alpha).real; ftmp2_imag = (*(SingleComplex*)alpha).imag; ((SingleComplex *)src_data_ptr)[idx+j].real = ftmp1_real*ftmp2_real - ftmp1_imag * ftmp2_imag; ((SingleComplex *)src_data_ptr)[idx+j].imag = ftmp2_imag*ftmp1_real + ftmp1_imag * ftmp2_real; } } break; case C_INT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((int*)src_data_ptr)[idx+j] *= *(int*)alpha; } break; case C_LONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long *)src_data_ptr)[idx+j] *= *(long*)alpha; } break; case C_LONGLONG: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((long long*)src_data_ptr)[idx+j] *= *(long long*)alpha; } break; case C_FLOAT: for(i=0; i (hiA[j]-loA[j])) bvalue[j] = 0; } for(j=0; j<(hiA[0]-loA[0]+1); j++) ((float *)src_data_ptr)[idx+j] *= *(float*)alpha; } break; default: pnga_error(" wrong data type ",type); } } /*\ SCALE ARRAY \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scale_patch = pnga_scale_patch #endif void pnga_scale_patch(Integer g_a, Integer *lo, Integer *hi, void *alpha) { Integer ndim, dims[MAXDIM], type; Integer loA[MAXDIM], hiA[MAXDIM]; Integer ld[MAXDIM]; void *src_data_ptr; Integer num_blocks, nproc; Integer me= pnga_nodeid(); int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("pnga_scale_patch"); pnga_inquire(g_a, &type, &ndim, dims); num_blocks = pnga_total_blocks(g_a); if (num_blocks < 0) { pnga_distribution(g_a, me, loA, hiA); /* determine subset of my patch to access */ if (pnga_patch_intersect(lo, hi, loA, hiA, ndim)){ pnga_access_ptr(g_a, loA, hiA, &src_data_ptr, ld); snga_scale_patch_value(type, ndim, loA, hiA, ld, src_data_ptr, alpha); /* release access to the data */ pnga_release_update(g_a, loA, hiA); } } else { Integer offset, i, j, jtmp, chk; Integer loS[MAXDIM]; nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)){ for (i=me; i dims[i]) hiA[i] = dims[i]; if (hiA[i] < loA[i]) chk = 0; } /* loA is changed by pnga_patch_intersect, so save a copy */ for (j=0; j= blocks[i] && i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((double*)C_ptr)[idx+j] = ((double*)C_ptr)[idx+j] + *(double*)alpha * ((double*)A_ptr)[idx+j]; } break; case C_DCPL: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) { DoubleComplex a = ((DoubleComplex *)A_ptr)[idx+j]; DoubleComplex x= *(DoubleComplex*)alpha; ((DoubleComplex *)C_ptr)[idx+j].real = ((DoubleComplex *)C_ptr)[idx+j].real + x.real*a.real - x.imag*a.imag; ((DoubleComplex *)C_ptr)[idx+j].imag = ((DoubleComplex *)C_ptr)[idx+j].imag + x.real*a.imag + x.imag*a.real; } } break; case C_SCPL: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) { SingleComplex a = ((SingleComplex *)A_ptr)[idx+j]; SingleComplex x= *(SingleComplex*)alpha; ((SingleComplex *)C_ptr)[idx+j].real = ((SingleComplex *)C_ptr)[idx+j].real + x.real*a.real - x.imag*a.imag; ((SingleComplex *)C_ptr)[idx+j].imag = ((SingleComplex *)C_ptr)[idx+j].imag + x.real*a.imag + x.imag*a.real; } } break; case C_INT: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((int*)C_ptr)[idx+j] = ((int*)C_ptr)[idx+j] + *(int *)alpha * ((int*)A_ptr)[idx+j]; } break; case C_FLOAT: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((float *)C_ptr)[idx+j] = ((float *)C_ptr)[idx+j] + *(float *)alpha * ((float *)A_ptr)[idx+j]; } break; case C_LONG: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((long *)C_ptr)[idx+j] = ((long *)C_ptr)[idx+j] + *(long *)alpha * ((long *)A_ptr)[idx+j]; } break; case C_LONGLONG: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((long long*)C_ptr)[idx+j] = ((long long*)C_ptr)[idx+j] + *(long long*)alpha * ((long long*)A_ptr)[idx+j]; } break; default: pnga_error(" wrong data type ",type); } } /*\ Utility function to add patch values together \*/ static void snga_add_patch_values(Integer type, void* alpha, void *beta, Integer ndim, Integer *loC, Integer *hiC, Integer *ldC, void *A_ptr, void *B_ptr, void *C_ptr) { Integer bvalue[MAXDIM], bunit[MAXDIM], baseldC[MAXDIM]; Integer idx, n1dim; Integer i, j; /* compute "local" add */ /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((double*)C_ptr)[idx+j] = *(double*)alpha * ((double*)A_ptr)[idx+j] + *(double*)beta * ((double*)B_ptr)[idx+j]; } break; case C_DCPL: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) { DoubleComplex a = ((DoubleComplex *)A_ptr)[idx+j]; DoubleComplex b = ((DoubleComplex *)B_ptr)[idx+j]; DoubleComplex x= *(DoubleComplex*)alpha; DoubleComplex y= *(DoubleComplex*)beta; ((DoubleComplex *)C_ptr)[idx+j].real = x.real*a.real - x.imag*a.imag + y.real*b.real - y.imag*b.imag; ((DoubleComplex *)C_ptr)[idx+j].imag = x.real*a.imag + x.imag*a.real + y.real*b.imag + y.imag*b.real; } } break; case C_SCPL: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) { SingleComplex a = ((SingleComplex *)A_ptr)[idx+j]; SingleComplex b = ((SingleComplex *)B_ptr)[idx+j]; SingleComplex x= *(SingleComplex*)alpha; SingleComplex y= *(SingleComplex*)beta; ((SingleComplex *)C_ptr)[idx+j].real = x.real*a.real - x.imag*a.imag + y.real*b.real - y.imag*b.imag; ((SingleComplex *)C_ptr)[idx+j].imag = x.real*a.imag + x.imag*a.real + y.real*b.imag + y.imag*b.real; } } break; case C_INT: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((int*)C_ptr)[idx+j] = *(int *)alpha * ((int*)A_ptr)[idx+j] + *(int*)beta * ((int*)B_ptr)[idx+j]; } break; case C_FLOAT: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((float *)C_ptr)[idx+j] = *(float *)alpha * ((float *)A_ptr)[idx+j] + *(float *)beta * ((float *)B_ptr)[idx+j]; } break; case C_LONG: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((long *)C_ptr)[idx+j] = *(long *)alpha * ((long *)A_ptr)[idx+j] + *(long *)beta * ((long *)B_ptr)[idx+j]; } break; case C_LONGLONG: for(i=0; i (hiC[j]-loC[j])) bvalue[j] = 0; } for(j=0; j<(hiC[0]-loC[0]+1); j++) ((long long*)C_ptr)[idx+j] = *(long long*)alpha * ((long long*)A_ptr)[idx+j] + *(long long*)beta * ((long long*)B_ptr)[idx+j]; } break; default: pnga_error(" wrong data type ",type); } } /*\ SCALED ADDITION of two patches \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_add_patch = pnga_add_patch #endif void pnga_add_patch(alpha, g_a, alo, ahi, beta, g_b, blo, bhi, g_c, clo, chi) Integer g_a, *alo, *ahi; /* patch of g_a */ Integer g_b, *blo, *bhi; /* patch of g_b */ Integer g_c, *clo, *chi; /* patch of g_c */ void *alpha, *beta; { Integer i, j; Integer compatible_a, compatible_b; Integer atype, btype, ctype; Integer andim, adims[MAXDIM], bndim, bdims[MAXDIM], cndim, cdims[MAXDIM]; Integer loA[MAXDIM], hiA[MAXDIM], ldA[MAXDIM]; Integer loB[MAXDIM], hiB[MAXDIM], ldB[MAXDIM]; Integer loC[MAXDIM], hiC[MAXDIM], ldC[MAXDIM]; void *A_ptr, *B_ptr, *C_ptr; Integer n1dim; Integer atotal, btotal; Integer g_A = g_a, g_B = g_b; Integer me= pnga_nodeid(), A_created=0, B_created=0; Integer nproc = pnga_nnodes(); Integer num_blocks_a, num_blocks_b, num_blocks_c; char *tempname = "temp", notrans='n'; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("nga_add_patch"); pnga_inquire(g_a, &atype, &andim, adims); pnga_inquire(g_b, &btype, &bndim, bdims); pnga_inquire(g_c, &ctype, &cndim, cdims); if(atype != btype || atype != ctype ) pnga_error(" types mismatch ", 0L); /* check if patch indices and dims match */ for(i=0; i adims[i]) pnga_error("g_a indices out of range ", g_a); for(i=0; i bdims[i]) pnga_error("g_b indices out of range ", g_b); for(i=0; i cdims[i]) pnga_error("g_c indices out of range ", g_c); /* check if numbers of elements in patches match each other */ n1dim = 1; for(i=0; i bndim) cndim = bndim; if(andim < bndim) cndim = andim; if(!pnga_comp_patch(andim, loA, hiA, cndim, loC, hiC)) pnga_error(" A patch mismatch ", g_A); if(!pnga_comp_patch(bndim, loB, hiB, cndim, loC, hiC)) pnga_error(" B patch mismatch ", g_B); /* determine subsets of my patches to access */ if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); snga_add_patch_values(atype, alpha, beta, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else if (!compatible_a && compatible_b) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_c * - do C<= A */ if(g_b != g_c) { pnga_copy_patch(¬rans, g_a, alo, ahi, g_c, clo, chi); andim = cndim; g_A = g_c; pnga_distribution(g_A, me, loA, hiA); } else { if (!pnga_duplicate(g_c, &g_A, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_a, alo, ahi, g_A, clo, chi); andim = cndim; A_created = 1; pnga_distribution(g_A, me, loA, hiA); } if(andim > bndim) cndim = bndim; if(andim < bndim) cndim = andim; if(!pnga_comp_patch(andim, loA, hiA, cndim, loC, hiC)) pnga_error(" A patch mismatch ", g_A); if(!pnga_comp_patch(bndim, loB, hiB, cndim, loC, hiC)) pnga_error(" B patch mismatch ", g_B); /* determine subsets of my patches to access */ if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); snga_add_patch_values(atype, alpha, beta, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else if (compatible_a && !compatible_b) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_c * - copy & reshape patch of g_b into g_B */ if (!pnga_duplicate(g_c, &g_B, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_b, blo, bhi, g_B, clo, chi); bndim = cndim; B_created = 1; pnga_distribution(g_B, me, loB, hiB); if(andim > bndim) cndim = bndim; if(andim < bndim) cndim = andim; if(!pnga_comp_patch(andim, loA, hiA, cndim, loC, hiC)) pnga_error(" A patch mismatch ", g_A); if(!pnga_comp_patch(bndim, loB, hiB, cndim, loC, hiC)) pnga_error(" B patch mismatch ", g_B); /* determine subsets of my patches to access */ if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); snga_add_patch_values(atype, alpha, beta, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else if (!compatible_a && !compatible_b) { /* there is no match between any of the global arrays */ if (!pnga_duplicate(g_c, &g_B, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_b, blo, bhi, g_B, clo, chi); bndim = cndim; B_created = 1; if(andim > bndim) cndim = bndim; if(andim < bndim) cndim = andim; cndim = bndim; pnga_copy_patch(¬rans, g_a, alo, ahi, g_c, clo, chi); pnga_scale_patch(g_c, clo, chi, alpha); /* determine subsets of my patches to access */ if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); snga_acc_patch_values(atype, beta, cndim, loC, hiC, ldC, B_ptr, C_ptr); /* release access to the data */ pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } } else { /* create copies of arrays A and B that are identically distributed as C*/ if (!pnga_duplicate(g_c, &g_A, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_a, alo, ahi, g_A, clo, chi); andim = cndim; A_created = 1; if (!pnga_duplicate(g_c, &g_B, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_b, blo, bhi, g_B, clo, chi); bndim = cndim; B_created = 1; /* C is normally distributed so just add copies together for regular arrays */ if (num_blocks_c < 0) { pnga_distribution(g_c, me, loC, hiC); if(andim > bndim) cndim = bndim; if(andim < bndim) cndim = andim; if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); snga_add_patch_values(atype, alpha, beta, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else { Integer idx, lod[MAXDIM]/*, hid[MAXDIM]*/; Integer offset, jtot, last; /* Simple block-cyclic data disribution */ if (!pnga_uses_proc_grid(g_c)) { for (idx = me; idx < num_blocks_c; idx += nproc) { pnga_distribution(g_c, idx, loC, hiC); /* make temporary copies of loC and hiC since pnga_patch_intersect destroys original versions */ for (j=0; j cdims[i]) hiC[i] = cdims[i]; /*if (hiC[i] < loC[i]) chk = 0;*/ } /* make temporary copies of loC and hiC since pnga_patch_intersect destroys original versions */ for (j=0; j= blocks[i] && i #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #include "global.h" #include "globalp.h" #include "base.h" #include "armci.h" #include "message.h" #include "macdecls.h" #include "ga-papi.h" #include "ga-wapi.h" /* from armcip.h, but armcip.h is private so we should not include it */ extern void armci_write_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern void armci_read_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern armci_hdl_t* get_armci_nbhandle(Integer *); #define USE_MALLOC 1 #define INVALID_MA_HANDLE -1 #define NEAR_INT(x) (x)< 0.0 ? ceil( (x) - 0.5) : floor((x) + 0.5) #if !defined(CRAY_YMP) #define BYTE_ADDRESSABLE_MEMORY #endif /*uncomment line below to verify consistency of MA in every sync */ /*#define CHECK_MA yes */ /***************************************************************************/ /*\ Return a pointer to the location indicated by subscript and and an array * of leading dimensions (ld). Assume that subscript refers to a set of local * coordinates relative to the origin of the array and account for the * presence of ghost cells. \*/ #define gam_LocationWithGhosts(proc, handle, subscript, ptr_loc, ld) \ { \ Integer _d, _factor = 1, _last=GA[handle].ndim - 1, _offset=0; \ Integer _lo[MAXDIM], _hi[MAXDIM]; \ ga_ownsM(handle, proc, _lo, _hi); \ if (_last == 0) ld[0] = _hi[0] - _lo[0] + 1 + 2*(Integer)GA[handle].width[0];\ for (_d = 0; _d < _last; _d++) { \ _offset += subscript[_d] * _factor; \ ld[_d] = _hi[_d] - _lo[_d] + 1 + 2*(Integer)GA[handle].width[_d]; \ _factor *= ld[_d]; \ } \ _offset += subscript[_last] * _factor; \ *(ptr_loc) = GA[handle].ptr[proc] + _offset*GA[handle].elemsize; \ } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_ghost_ptr = pnga_access_ghost_ptr #endif void pnga_access_ghost_ptr(Integer g_a, Integer dims[], void* ptr, Integer ld[]) { char *lptr; Integer handle = GA_OFFSET + g_a; Integer i, lo[MAXDIM], hi[MAXDIM]; Integer ndim = GA[handle].ndim; Integer me = pnga_nodeid(); GA_PUSH_NAME("pnga_access_ghost_ptr"); pnga_distribution(g_a, me, lo, hi); for (i=0; i < ndim; i++) { dims[i] = 0; } gam_LocationWithGhosts(me, handle, dims, &lptr, ld); *(char**)ptr = lptr; for (i=0; i < ndim; i++) dims[i] = hi[i] - lo[i] + 1 + 2*(Integer)GA[handle].width[i]; GA_POP_NAME; } /*\ PROVIDE INDEX TO LOCALLY HELD DATA, ACCOUNTING FOR * PRESENCE OF GHOST CELLS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_ghost_element = pnga_access_ghost_element #endif void pnga_access_ghost_element(Integer g_a, AccessIndex* index, Integer subscript[], Integer ld[]) { char *ptr=NULL; Integer handle = GA_OFFSET + g_a; Integer i=0; Integer tmp_sub[MAXDIM]; unsigned long elemsize=0; unsigned long lref=0, lptr=0; Integer me = pnga_nodeid(); GA_PUSH_NAME("nga_access_ghost_element"); /* Indices conform to Fortran convention. Shift them down 1 so that gam_LocationWithGhosts works. */ for (i=0; i0) me = PGRP_LIST[grp_id].map_proc_list[me]; ndim = GA[handle].ndim; /* Figure out whether or not lo and hi can be accessed completely from local data */ pnga_distribution(g_a, me, glo, ghi); ichk = 1; for (i=0; i ghi[i]+(Integer)GA[handle].width[i]) ichk = 0; llo[i] = glo[i] - (Integer)GA[handle].width[i]; if (i 0) { imax = 2; } else { imax = 1; } } else { imax = 1; } } else { lo_rem[i] = lo_loc[i]; hi_rem[i] = hi_loc[i]; } } for (inx = 0; inx < imax; inx++) { /* Check to see if boundary is being updated in one patch or two, adjust lower boundary accordingly. */ for (i=0; i= slo_rem[i]) { offset = tlo_rem[i] - lo_rem[i]; slice = thi_rem[i] - tlo_rem[i]; } else { offset = 0; slice = thi_rem[i] - slo_rem[i]; } if (offset < 0) offset = offset + dims[i]; if (offset >= dims[i]) offset = offset - dims[i]; plo_rem[i] = thi_rem[i] - tlo_rem[i] + width[i] - slice; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = offset; /*phi_loc[i] = offset + slice;*/ } } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* get remote data */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_GetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem); } } /* Perform update in positive direction. Start by getting rough estimate of block of needed data*/ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rem[i] = hi_loc[i] + 1; hi_rem[i] = hi_loc[i] + nwidth; /* Check to see if we will need to update ghost cells using one or two major patches of the global array. */ if (hi_rem[i] > dims[i]) { if (lo_rem[i] <= dims[i]) { imax = 2; } else { imax = 1; } } else { imax = 1; } } else { lo_rem[i] = lo_loc[i]; hi_rem[i] = hi_loc[i]; } } for (inx = 0; inx < imax; inx++) { /* Check to see if boundary is being updated in one patch or two, adjust lower boundary accordingly. */ for (i=0; i dims[i]) { slo_rem[i] = 1; shi_rem[i] = nwidth; } else { slo_rem[i] = lo_rem[i]; shi_rem[i] = hi_rem[i]; } } else { slo_rem[i] = lo_rem[i]; shi_rem[i] = hi_rem[i]; } } /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); for (ipx = 0; ipx < np; ipx++) { /* Get actual coordinates of desired chunk of remote data as well as the actual coordinates of the local chunk of data that will receive the remote data (these coordinates take into account the presence of ghost cells). Start by finding out what data is actually held by remote processor. */ proc_rem = GA_proclist[ipx]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { if (np == 1 && imax == 1) { plo_rem[i] = width[i]; phi_rem[i] = 2*width[i] - 1; plo_loc[i] = hi_loc[i] - lo_loc[i] + 1 + width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + 2*width[i];*/ } else { offset = tlo_rem[i] - hi_loc[i] - 1; if (thi_rem[i] <= shi_rem[i]) { slice = thi_rem[i] - tlo_rem[i]; } else { slice = shi_rem[i] - tlo_rem[i]; } if (offset < 0) offset = offset + dims[i]; if (offset >= dims[i]) offset = offset - dims[i]; plo_rem[i] = width[i]; phi_rem[i] = width[i] + slice; plo_loc[i] = hi_loc[i] - lo_loc[i] + width[i] + 1 + offset; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i] + 1 + offset + slice;*/ } } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* get remote data */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_GetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem); } } } /* synchronize all processors and update increment array */ if (idx < ndim-1) pnga_pgroup_sync(p_handle); if (corner_flag) increment[idx] = 2*nwidth; } GA_POP_NAME; } /*\ UTILITY FUNCTION TO MAKE SURE GHOST CELLS WIDTHS ARE * LESS THAN VISIBLE DATA WIDTHS \*/ static logical gai_check_ghost_distr(Integer g_a) { Integer handle=GA_OFFSET + g_a; Integer idx, ndim, np, ipx; ndim = GA[handle].ndim; ipx = 0; for (idx = 0; idx < ndim; idx++) { for (np = 0; np < GA[handle].nblock[idx]; np++) { if (np < GA[handle].nblock[idx] - 1) { if (GA[handle].mapc[ipx+1]-GA[handle].mapc[ipx]+1 1) mask0 = TRUE; */ if (mask0) continue; /* Now that mask has been determined, find data that is to be moved * and identify processor to which it is going. Wrap boundaries * around, if necessary */ for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { /*tlo_loc[idx] = lo_loc[idx];*/ /*thi_loc[idx] = hi_loc[idx];*/ tlo_rem[idx] = lo_loc[idx]; thi_rem[idx] = hi_loc[idx]; } else if (mask[idx] == -1) { /*tlo_loc[idx] = lo_loc[idx];*/ /*thi_loc[idx] = lo_loc[idx]+width[idx]-1;*/ if (lo_loc[idx] > 1) { tlo_rem[idx] = lo_loc[idx]-width[idx]; thi_rem[idx] = lo_loc[idx]-1; } else { tlo_rem[idx] = dims[idx]-width[idx]+1; thi_rem[idx] = dims[idx]; } } else if (mask[idx] == 1) { /*tlo_loc[idx] = hi_loc[idx]-width[idx]+1;*/ /*thi_loc[idx] = hi_loc[idx];*/ if (hi_loc[idx] < dims[idx]) { tlo_rem[idx] = hi_loc[idx] + 1; thi_rem[idx] = hi_loc[idx] + width[idx]; } else { tlo_rem[idx] = 1; thi_rem[idx] = width[idx]; } } else { fprintf(stderr,"Illegal mask value found\n"); } } /* Locate remote processor to which data must be sent */ if (!pnga_locate_region(g_a, tlo_rem, thi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), tlo_rem, thi_rem, g_a); if (np > 1) { fprintf(stderr,"More than one remote processor found\n"); } /* Remote processor has been identified, now get ready to send data to it. Start by getting distribution on remote processor.*/ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { plo_loc[idx] = width[idx]; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]; plo_rem[idx] = plo_loc[idx]; } else if (mask[idx] == -1) { plo_loc[idx] = width[idx]; phi_loc[idx] = 2*width[idx]-1; plo_rem[idx] = thi_rem[idx]-tlo_rem[idx]+width[idx]+1; } else if (mask[idx] == 1) { plo_loc[idx] = hi_loc[idx]-lo_loc[idx]+1; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]; plo_rem[idx] = 0; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_loc, phi_loc, count); count[0] *= size; /* put data on remote processor */ /*ARMCI_PutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), (int)proc_rem);*/ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_NbPutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), (int)proc_rem, NULL); } ARMCI_WaitAll(); GA_POP_NAME; return TRUE; } /*\ GET INDICES ON REMOTE BLOCK IN NEGATIVE DIRECTION FOR UPDATE \*/ static void get_remote_block_neg(Integer idx, Integer ndim, Integer *lo_loc, Integer *hi_loc, Integer *slo_rem, Integer *shi_rem, Integer *dims, Integer *width) { Integer i, lo_rem[MAXDIM], hi_rem[MAXDIM]; /*Start by getting rough idea of where data needs to go. */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rem[i] = lo_loc[i] - width[i]; hi_rem[i] = lo_loc[i] - 1; } else { lo_rem[i] = lo_loc[i]; hi_rem[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i dims[i]) { slo_rem[i] = 1; shi_rem[i] = width[i]; } else { slo_rem[i] = lo_rem[i]; shi_rem[i] = hi_rem[i]; } } else { slo_rem[i] = lo_rem[i]; shi_rem[i] = hi_rem[i]; } } } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM AND PUT CALLS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update3_ghosts = pnga_update3_ghosts #endif logical pnga_update3_ghosts(Integer g_a) { Integer idx, i, np, handle=GA_OFFSET + g_a, proc_rem; Integer size, ndim, nwidth, increment[MAXDIM]; Integer width[MAXDIM]; Integer dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_loc[MAXDIM]/*, phi_loc[MAXDIM]*/; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer slo_rem[MAXDIM], shi_rem[MAXDIM]; Integer plo_rem[MAXDIM], phi_rem[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; int stride_loc[MAXDIM], stride_rem[MAXDIM],count[MAXDIM]; char *ptr_loc, *ptr_rem; Integer me = pnga_nodeid(); Integer p_handle; /* This routine makes use of the shift algorithm to update data in the * ghost cells bounding the local block of visible data. The shift * algorithm starts by updating the blocks of data along the first * dimension by grabbing a block of data that is width[0] deep but * otherwise matches the dimensions of the data residing on the * calling processor. The update of the second dimension, however, * grabs a block that is width[1] deep in the second dimension but is * ldim0 + 2*width[0] in the first dimensions where ldim0 is the * size of the visible data along the first dimension. The remaining * dimensions are left the same. For the next update, the width of the * second dimension is also increased by 2*width[1] and so on. This * algorith makes use of the fact that data for the dimensions that * have already been updated is available on each processor and can be * used in the updates of subsequent dimensions. The total number of * separate updates is 2*ndim, an update in the negative and positive * directions for each dimension. This implementation uses simple put * operations to perform the updates along each dimension with an * intervening synchronization call being used to make sure that the * necessary data is available on each processor before starting the * update along the next dimension. * * To perform the update, this routine makes use of several copies of * indices marking the upper and lower limits of data. Indices * beginning with the character "p" are relative indices marking the * location of the data set relative to the origin the local patch of * the global array, all other indices are in absolute coordinates and * mark locations in the total global array. The indices used by this * routine are described below. * * lo_loc[], hi_loc[]: The lower and upper indices of the visible * block of data held by the calling processor. * * lo_rem[], hi_rem[]: The lower and upper indices of the block * of data on a remote processor or processors that is needed to * fill in the calling processors ghost cells. These indices are * NOT corrected for wrap-around (periodic) boundary conditions * so they can be negative or greater than the array dimension * values held in dims[]. * * slo_rem[], shi_rem[]: Similar to lo_rem[] and hi_rem[], except * that these indices have been corrected for wrap-around * boundary conditions. * * thi_rem[], thi_rem[]: The lower and upper indices of the visible * data on a remote processor. * * plo_loc[], phi_loc[]: The indices of the local data patch that * is going to be updated. * * plo_rem[], phi_rem[]: The indices of the data patch on the * remote processor that will be used to update the data on the * calling processor. Note that the dimensions of the patches * represented by plo_loc[], plo_rem[] and plo_loc[], phi_loc[] * must be the same. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; /* obtain range of data that is held by local processor */ pnga_distribution(g_a,me,lo_loc,hi_loc); /* initialize range increments and get array dimensions */ for (idx=0; idx < ndim; idx++) { increment[idx] = 0; width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; if (lo_loc[idx] == 0 && hi_loc[idx] == -1) return FALSE; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]. */ if (!gai_check_ghost_distr(g_a)) return FALSE; GA_PUSH_NAME("ga_update3_ghosts"); /* Get pointer to local memory */ ptr_loc = GA[handle].ptr[me]; /* loop over dimensions for sequential update using shift algorithm */ for (idx=0; idx < ndim; idx++) { nwidth = width[idx]; /* Do not bother with update if nwidth is zero */ if (nwidth != 0) { /* Perform update in negative direction. */ get_remote_block_neg(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); /* Get actual coordinates of desired location of remote data as well as the actual coordinates of the local chunk of data that will be sent to remote processor (these coordinates take into account the presence of ghost cells). Start by finding out what data is actually held by remote processor. */ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = thi_rem[i] - tlo_rem[i] + width[i] + 1; phi_rem[i] = thi_rem[i] - tlo_rem[i] + 2*width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* Put local data on remote processor */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_PutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), (int)proc_rem); /* Perform update in positive direction */ get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); /* Get actual coordinates of desired chunk of remote data as well as the actual coordinates of the local chunk of data that will receive the remote data (these coordinates take into account the presence of ghost cells). Start by finding out what data is actually held by remote processor. */ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = 0; phi_rem[i] = width[i] - 1; plo_loc[i] = hi_loc[i] - lo_loc[i] + width[i] - 1; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* get remote data */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_PutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), (int)proc_rem); } /* synchronize all processors and update increment array */ if (idx < ndim-1) pnga_pgroup_sync(p_handle); increment[idx] = 2*nwidth; } GA_POP_NAME; return TRUE; } #define GHOST_PRINT 0 /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM AND * MESSAGE PASSING \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_update4_info = pnga_set_update4_info #endif logical pnga_set_update4_info(Integer g_a) { Integer idx, idir, i, np, handle=GA_OFFSET + g_a; Integer size, buflen, buftot, *bufsize, ndim, increment[MAXDIM]; Integer *proc_rem_snd, *proc_rem_rcv; Integer *length; Integer width[MAXDIM], dims[MAXDIM], index[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_snd[MAXDIM], phi_snd[MAXDIM]; Integer lo_rcv[MAXDIM], hi_rcv[MAXDIM]; Integer slo_rcv[MAXDIM], shi_rcv[MAXDIM]; Integer plo_rcv[MAXDIM], phi_rcv[MAXDIM]; Integer ld_loc[MAXDIM]; int *stride_snd, *stride_rcv, *count, cache_size; /*int corner_flag;*/ char **ptr_snd, **ptr_rcv, *cache; char *current; Integer me = pnga_nodeid(); Integer p_handle; /* This routine sets the arrays that are used to transfer data using * the update4. To perform the update, this routine makes use of several * copies of indices marking the upper and lower limits of data. Indices * beginning with the character "p" are relative indices marking the * location of the data set relative to the origin the local patch of * the global array, all other indices are in absolute coordinates and * mark locations in the total global array. The indices used by this * routine are described below. * * lo_loc[], hi_loc[]: The lower and upper indices of the visible * block of data held by the calling processor. * * lo_rcv[], hi_rcv[]: The lower and upper indices of the blocks * of data that will be either sent to or received from a remote * processor. These indices are NOT corrected for wrap-around * (periodic) boundary conditions so they can be negative or greater * than the array dimension values held in dims[]. * * slo_rcv[], shi_rcv[]: Similar to lo_rcv[] and hi_rcv[], except * that these indices have been corrected for wrap-around * boundary conditions. * * plo_rcv[], phi_rcv[]: The local indices of the local data patch * that receive that message from the remote processor. * * plo_snd[], phi_snd[]: The local indices of the data patch * that will be sent to the remote processor. Note that the * dimensions of the patches represented by plo_rec[], plo_rec[] and * plo_snd[], phi_snd[] must be the same. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]. */ if (!gai_check_ghost_distr(g_a)) return FALSE; size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; cache_size = 2*sizeof(char *)+3*ndim*sizeof(int)+3*sizeof(Integer); cache_size = 2* ndim *((cache_size/8) + 1) + 1; GA[handle].cache = (double *)malloc(sizeof(double)*cache_size); cache = (char *)GA[handle].cache; /*corner_flag = GA[handle].corner_flag;*/ #if GHOST_PRINT printf("p[%d]a cache_size: %d\n",GAme,cache_size); #endif /* initialize range increments and get array dimensions */ pnga_distribution(g_a,me,lo_loc,hi_loc); for (idx=0; idx < ndim; idx++) { increment[idx] = 0; width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; if (lo_loc[idx] == 0 && hi_loc[idx] == -1) { *(char**)cache = NULL; return FALSE; } } /* Get indices of processor in virtual grid */ pnga_proc_topology(g_a, me, index); /* Try to find maximum size of message that will be sent during * update operations and use this to allocate memory for message * passing buffers. */ buftot = 1; for (i=0; i= 0) { *proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem_snd]; } /* Find processor from which data will be recieved */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = hi_loc[i] + 1; hi_rcv[i] = hi_loc[i] + width[i]; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i dims[i]) { slo_rcv[i] = 1; shi_rcv[i] = width[i]; } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); *proc_rem_rcv = GA_proclist[0]; if (p_handle >= 0) { *proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem_rcv]; } /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = width[i]; phi_snd[i] = 2*width[i] - 1; plo_rcv[i] = hi_loc[i] - lo_loc[i] + width[i] + 1; phi_rcv[i] = hi_loc[i] - lo_loc[i] + 2*width[i]; } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; } } else { plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, ptr_snd, ld_loc); #if GHOST_PRINT printf("p[%d]a 1: plo_snd[0]: %d plo_snd[1]: %d ptr_snd: %d\n", GAme, plo_snd[0], plo_snd[1], (Integer)*ptr_snd); fflush(stdout); #endif gam_LocationWithGhosts(me, handle, plo_rcv, ptr_rcv, ld_loc); #if GHOST_PRINT printf("p[%d]a 1: plo_rcv[0]: %d plo_rcv[1]: %d ptr_rcv: %d\n", GAme, plo_rcv[0], plo_rcv[1], (Integer)*ptr_rcv); fflush(stdout); #endif /* Evaluate strides for send and recieve */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, length); *length *= size; count[0] *= size; #if GHOST_PRINT printf("p[%d]a 1: length: %d bufsize: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, *length, *bufsize, (int)*proc_rem_snd, (int)*proc_rem_rcv); printf("p[%d]a 1: count[0]: %d stride_rcv[0]: %d stride_rcv[1]: %d\n", GAme, count[0], stride_rcv[0],stride_rcv[1]); printf("p[%d]a 1: count[1]: %d stride_rcv[2]: %d stride_rcv[3]: %d\n", GAme, count[1], stride_rcv[2],stride_rcv[3]); printf("p[%d]a 1: count[2]: %d stride_snd[0]: %d stride_snd[1]: %d\n", GAme, count[2], stride_snd[0],stride_snd[1]); printf("p[%d]a 1: count[3]: %d stride_snd[2]: %d stride_snd[3]: %d\n", GAme, count[3], stride_snd[2],stride_snd[3]); fflush(stdout); #endif ptr_snd = (char**)current; ptr_rcv = (char**)(ptr_snd+1); proc_rem_snd = (Integer*)(ptr_rcv+1); proc_rem_rcv = (Integer*)(proc_rem_snd+1); stride_snd = (int*)(proc_rem_rcv+1); stride_rcv = (int*)(stride_snd+ndim); length = (Integer*)(stride_rcv+ndim); count = (int*)(length+1); current = (char*)(count+ndim); /* Find parameters for message in positive direction. */ get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rcv, shi_rcv, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); *proc_rem_snd = GA_proclist[0]; if (p_handle >= 0) { *proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem_snd]; } /* Find processor from which data will be recieved */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = lo_loc[i] - width[i]; hi_rcv[i] = lo_loc[i] - 1; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i= 0) { *proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem_rcv]; } /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = hi_loc[i] - lo_loc[i] + 1; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = 0; phi_rcv[i] = width[i] - 1; } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; } } else { plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, ptr_snd, ld_loc); #if GHOST_PRINT printf("p[%d]a 2: plo_snd[0]: %d plo_snd[1]: %d ptr_snd: %d\n", GAme, plo_snd[0], plo_snd[1], (Integer)*ptr_snd); fflush(stdout); #endif gam_LocationWithGhosts(me, handle, plo_rcv, ptr_rcv, ld_loc); #if GHOST_PRINT printf("p[%d]a 2: plo_rcv[0]: %d plo_rcv[1]: %d ptr_rcv: %d\n", GAme, plo_rcv[0], plo_rcv[1], (Integer)*ptr_rcv); fflush(stdout); #endif /* Evaluate strides for send and recieve */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, length); *length *= size; count[0] *= size; #if GHOST_PRINT printf("p[%d]a 2: length: %d bufsize: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, *length, *bufsize, (int)*proc_rem_snd, (int)*proc_rem_rcv); printf("p[%d]a 2: count[0]: %d stride_rcv[0]: %d stride_rcv[1]: %d\n", GAme, count[0], stride_rcv[0],stride_rcv[1]); printf("p[%d]a 2: count[1]: %d stride_rcv[2]: %d stride_rcv[3]: %d\n", GAme, count[1], stride_rcv[2],stride_rcv[3]); printf("p[%d]a 2: count[2]: %d stride_snd[0]: %d stride_snd[1]: %d\n", GAme, count[2], stride_snd[0],stride_snd[1]); printf("p[%d]a 2: count[3]: %d stride_snd[2]: %d stride_snd[3]: %d\n", GAme, count[3], stride_snd[2],stride_snd[3]); fflush(stdout); #endif } if (GA[handle].corner_flag) increment[idx] = 2*width[idx]; } #if GHOST_PRINT printf("p[%d]a final pointer: %d\n",GAme,(Integer)(Integer*)current); fflush(stdout); #endif return TRUE; } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM AND * MESSAGE PASSING \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update4_ghosts = pnga_update4_ghosts #endif logical pnga_update4_ghosts(Integer g_a) { Integer idx, i, handle=GA_OFFSET + g_a; Integer *size, bufsize, buflen, ndim, elemsize; Integer *proc_rem_snd, *proc_rem_rcv, pmax; Integer msgcnt, *length; Integer index[MAXDIM], width[MAXDIM]; int *stride_snd, *stride_rcv, *count, msglen; char **ptr_snd, **ptr_rcv, *cache, *current; char send_name[32], rcv_name[32]; void *snd_ptr, *rcv_ptr, *snd_ptr_orig, *rcv_ptr_orig; Integer me = pnga_nodeid(); /*Integer p_handle;*/ /* This routine makes use of the shift algorithm to update data in the * ghost cells bounding the local block of visible data. The shift * algorithm starts by updating the blocks of data along the first * dimension by grabbing a block of data that is width[0] deep but * otherwise matches the dimensions of the data residing on the * calling processor. The update of the second dimension, however, * grabs a block that is width[1] deep in the second dimension but is * ldim0 + 2*width[0] in the first dimensions where ldim0 is the * size of the visible data along the first dimension. The remaining * dimensions are left the same. For the next update, the width of the * second dimension is also increased by 2*width[1] and so on. This * algorith makes use of the fact that data for the dimensions that * have already been updated is available on each processor and can be * used in the updates of subsequent dimensions. The total number of * separate updates is 2*ndim, an update in the negative and positive * directions for each dimension. * * This implementation make use of explicit message passing to perform * the update. Separate message types for the updates in each coordinate * direction are used to maintain synchronization locally and to * guarantee that the data is present before the updates in a new * coordinate direction take place. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; ndim = GA[handle].ndim; /*p_handle = GA[handle].p_handle;*/ cache = (char *)GA[handle].cache; elemsize = GA[handle].elemsize; for (i=0; i= 0) { proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_snd]; } /* Find processor from which data will be recieved */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = hi_loc[i] + 1; hi_rcv[i] = hi_loc[i] + width[i]; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i dims[i]) { slo_rcv[i] = 1; shi_rcv[i] = width[i]; } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); proc_rem_rcv = GA_proclist[0]; if (p_handle >= 0) { proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_rcv]; } /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = width[i]; phi_snd[i] = 2*width[i] - 1; plo_rcv[i] = hi_loc[i] - lo_loc[i] + width[i] + 1; phi_rcv[i] = hi_loc[i] - lo_loc[i] + 2*width[i]; } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; } } else { plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, &ptr_snd, ld_loc); #if GHOST_PRINT printf("p[%d] 1: plo_snd[0]: %d plo_snd[1]: %d ptr_snd: %d\n", GAme, plo_snd[0], plo_snd[1], (Integer)ptr_snd); fflush(stdout); #endif gam_LocationWithGhosts(me, handle, plo_rcv, &ptr_rcv, ld_loc); #if GHOST_PRINT printf("p[%d] 1: plo_rcv[0]: %d plo_rcv[1]: %d ptr_rcv: %d\n", GAme, plo_rcv[0], plo_rcv[1], (Integer)ptr_rcv); fflush(stdout); #endif /* Evaluate strides for send and recieve */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, &length); length *= size; count[0] *= size; /* Fill send buffer with data. */ #if GHOST_PRINT printf("p[%d]b 1: ptr_snd: %d ptr_rcv: %d\n", GAme, (Integer)ptr_snd, (Integer)ptr_rcv); printf("p[%d]b 1: length: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, (int)length, (int)proc_rem_snd, (int)proc_rem_rcv); printf("p[%d]b 1: count[0]: %d stride_rcv[0]: %d stride_rcv[1]: %d\n", GAme, count[0], stride_rcv[0],stride_rcv[1]); printf("p[%d]b 1: count[1]: %d stride_rcv[2]: %d stride_rcv[3]: %d\n", GAme, count[1], stride_rcv[2],stride_rcv[3]); printf("p[%d]b 1: count[2]: %d stride_snd[0]: %d stride_snd[1]: %d\n", GAme, count[2], stride_snd[0],stride_snd[1]); printf("p[%d]b 1: count[3]: %d stride_snd[2]: %d stride_snd[3]: %d\n", GAme, count[3], stride_snd[2],stride_snd[3]); printf("p[%d]b 1: snd_ptr: %d rcv_ptr: %d\n", GAme, (Integer)snd_ptr, (Integer)rcv_ptr); fflush(stdout); #endif armci_write_strided(ptr_snd, (int)ndim-1, stride_snd, count, snd_ptr); /* Send Messages. If processor has odd index in direction idx, it * sends message first, if processor has even index it receives * message first. Then process is reversed. Also need to account * for whether or not there are an odd number of processors along * update direction. */ #if GHOST_PRINT printf("p[%d] 1: msgcnt: %d length: %d bufsize: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, msgcnt, length, bufsize, (int)proc_rem_snd, (int)proc_rem_rcv); fflush(stdout); #endif snd_ptr = snd_ptr_orig; rcv_ptr = rcv_ptr_orig; if (GAme != proc_rem_snd) { if (GA[handle].nblock[idx]%2 == 0) { if (index[idx]%2 != 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (index[idx]%2 != 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } } else { pmax = GA[handle].nblock[idx] - 1; if (index[idx]%2 != 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx] != pmax) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (index[idx]%2 != 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx] != 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } /* make up for odd processor at end of string */ if (index[idx] == 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } if (index[idx] == pmax) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } } } else { rcv_ptr = snd_ptr; } msgcnt++; /* copy data back into global array */ armci_read_strided(ptr_rcv, (int)ndim-1, stride_rcv, count, rcv_ptr); /* Find parameters for message in positive direction. */ get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rcv, shi_rcv, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); proc_rem_snd = GA_proclist[0]; if (p_handle >= 0) { proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_snd]; } /* Find processor from which data will be recieved */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = lo_loc[i] - width[i]; hi_rcv[i] = lo_loc[i] - 1; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i= 0) { proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_rcv]; } /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = hi_loc[i] - lo_loc[i] + 1; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = 0; phi_rcv[i] = width[i] - 1; } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; } } else { plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, &ptr_snd, ld_loc); #if GHOST_PRINT printf("p[%d] 2: plo_snd[0]: %d plo_snd[1]: %d ptr_snd: %d\n", GAme, plo_snd[0], plo_snd[1], (Integer)ptr_snd); fflush(stdout); #endif gam_LocationWithGhosts(me, handle, plo_rcv, &ptr_rcv, ld_loc); #if GHOST_PRINT printf("p[%d] 2: plo_rcv[0]: %d plo_rcv[1]: %d ptr_rcv: %d\n", GAme, plo_rcv[0], plo_rcv[1], (Integer)ptr_rcv); fflush(stdout); #endif /* Evaluate strides for send and recieve */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, &length); length *= size; count[0] *= size; /* Need to reallocate memory if length > buflen */ /* TO DO */ /* Fill send buffer with data. */ #if GHOST_PRINT printf("p[%d]b 2: ptr_snd: %d ptr_rcv: %d\n", GAme, (Integer)ptr_snd, (Integer)ptr_rcv); printf("p[%d]b 2: length: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, (int)length, (int)proc_rem_snd, (int)proc_rem_rcv); printf("p[%d]b 2: count[0]: %d stride_rcv[0]: %d stride_rcv[1]: %d\n", GAme, count[0], stride_rcv[0],stride_rcv[1]); printf("p[%d]b 2: count[1]: %d stride_rcv[2]: %d stride_rcv[3]: %d\n", GAme, count[1], stride_rcv[2],stride_rcv[3]); printf("p[%d]b 2: count[2]: %d stride_snd[0]: %d stride_snd[1]: %d\n", GAme, count[2], stride_snd[0],stride_snd[1]); printf("p[%d]b 2: count[3]: %d stride_snd[2]: %d stride_snd[3]: %d\n", GAme, count[3], stride_snd[2],stride_snd[3]); printf("p[%d]b 2: snd_ptr: %d rcv_ptr: %d\n", GAme, (Integer)snd_ptr, (Integer)rcv_ptr); fflush(stdout); #endif armci_write_strided(ptr_snd, (int)ndim-1, stride_snd, count, snd_ptr); /* Send Messages. If processor has odd index in direction idx, it * sends message first, if processor has even index it receives * message first. Then process is reversed. Also need to account * for whether or not there are an odd number of processors along * update direction. */ #if GHOST_PRINT printf("p[%d] 2: msgcnt: %d length: %d bufsize: %d proc_rem_snd: %d proc_rem_rcv: %d\n", GAme, msgcnt, length, bufsize, (int)proc_rem_snd, (int)proc_rem_rcv); fflush(stdout); #endif snd_ptr = snd_ptr_orig; rcv_ptr = rcv_ptr_orig; if (GAme != proc_rem_rcv) { if (GA[handle].nblock[idx]%2 == 0) { if (index[idx]%2 != 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (index[idx]%2 != 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } } else { pmax = GA[handle].nblock[idx] - 1; if (index[idx]%2 != 0) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx] != 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (index[idx]%2 != 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx] != pmax) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } /* make up for odd processor at end of string */ if (index[idx] == pmax) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } if (index[idx] == 0) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } } } else { rcv_ptr = snd_ptr; } /* copy data back into global array */ armci_read_strided(ptr_rcv, (int)ndim-1, stride_rcv, count, rcv_ptr); msgcnt++; } if (GA[handle].corner_flag) increment[idx] = 2*width[idx]; } ga_free(rcv_ptr_orig); ga_free(snd_ptr_orig); GA_POP_NAME; return TRUE; } /* Utility function for ga_update5_ghosts routine */ static inline double waitforflags (int *ptr1, int *ptr2) { int i = 1; double val = 0; while (*ptr1 == 0 || *ptr2 == 0) { val = exp(-(double)i++); } #if 0 printf("%d: flags set at %p and %p\n",GAme,ptr1,ptr2); fflush(stdout); #endif return(val); } #if 0 /* Stub in new ARMCI_PutS_flag call until actual implementation is available */ int ARMCI_PutS_flag__( void* src_ptr, /* pointer to 1st segment at source */ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination */ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level, count[0] = #bytes */ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int *val, /* pointer to value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ) { int bytes; /* Put local data on remote processor */ ARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); /* Send signal to remote processor that data transfer has * been completed. */ bytes = sizeof(int); ARMCI_Put(val, flag, bytes, proc); return 1; } #endif /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM AND PUT CALLS * WITHOUT ANY BARRIERS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update55_ghosts = pnga_update55_ghosts #endif logical pnga_update55_ghosts(Integer g_a) { Integer idx, i, np, handle=GA_OFFSET + g_a, proc_rem; Integer size, ndim, nwidth, increment[MAXDIM]; Integer width[MAXDIM]; Integer dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_loc[MAXDIM]/*, phi_loc[MAXDIM]*/; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer slo_rem[MAXDIM], shi_rem[MAXDIM]; Integer plo_rem[MAXDIM], phi_rem[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; int stride_loc[MAXDIM], stride_rem[MAXDIM],count[MAXDIM]; int msgcnt; char *ptr_loc, *ptr_rem; Integer me = pnga_nodeid(); Integer p_handle; /* This routine makes use of the shift algorithm to update data in the * ghost cells bounding the local block of visible data. The shift * algorithm starts by updating the blocks of data along the first * dimension by grabbing a block of data that is width[0] deep but * otherwise matches the dimensions of the data residing on the * calling processor. The update of the second dimension, however, * grabs a block that is width[1] deep in the second dimension but is * ldim0 + 2*width[0] in the first dimensions where ldim0 is the * size of the visible data along the first dimension. The remaining * dimensions are left the same. For the next update, the width of the * second dimension is also increased by 2*width[1] and so on. This * algorith makes use of the fact that data for the dimensions that * have already been updated is available on each processor and can be * used in the updates of subsequent dimensions. The total number of * separate updates is 2*ndim, an update in the negative and positive * directions for each dimension. * * This operation is implemented using put calls to place the * appropriate data on remote processors. To signal the remote * processor that it has received the data, a second put call * consisting of a single integer is sent after the first put call and * used to update a signal buffer on the remote processor. Each * processor can determine how much data it has received by checking * its signal buffer. * * To perform the update, this routine makes use of several copies of * indices marking the upper and lower limits of data. Indices * beginning with the character "p" are relative indices marking the * location of the data set relative to the origin the local patch of * the global array, all other indices are in absolute coordinates and * mark locations in the total global array. The indices used by this * routine are described below. * * lo_loc[], hi_loc[]: The lower and upper indices of the visible * block of data held by the calling processor. * * lo_rem[], hi_rem[]: The lower and upper indices of the block * of data on a remote processor or processors that is needed to * fill in the calling processors ghost cells. These indices are * NOT corrected for wrap-around (periodic) boundary conditions * so they can be negative or greater than the array dimension * values held in dims[]. * * slo_rem[], shi_rem[]: Similar to lo_rem[] and hi_rem[], except * that these indices have been corrected for wrap-around * boundary conditions. * * thi_rem[], thi_rem[]: The lower and upper indices of the visible * data on a remote processor. * * plo_loc[], phi_loc[]: The indices of the local data patch that * is going to be updated. * * plo_rem[], phi_rem[]: The indices of the data patch on the * remote processor that will be used to update the data on the * calling processor. Note that the dimensions of the patches * represented by plo_loc[], plo_rem[] and plo_loc[], phi_loc[] * must be the same. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; /* initialize range increments and get array dimensions */ for (idx=0; idx < ndim; idx++) { increment[idx] = 0; width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; if (lo_loc[idx] == 0 && hi_loc[idx] == -1) return FALSE; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]. */ if (!gai_check_ghost_distr(g_a)) return FALSE; GA_PUSH_NAME("ga_update55_ghosts"); /* Get pointer to local memory */ ptr_loc = GA[handle].ptr[GAme]; /* obtain range of data that is held by local processor */ pnga_distribution(g_a,me,lo_loc,hi_loc); /* loop over dimensions for sequential update using shift algorithm */ msgcnt = 0; (*GA_Update_Signal) = 1; for (idx=0; idx < ndim; idx++) { nwidth = width[idx]; /* Do not bother with update if nwidth is zero */ if (nwidth != 0) { /* Perform update in negative direction. */ get_remote_block_neg(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); /* Get actual coordinates of desired location of remote data as well as the actual coordinates of the local chunk of data that will be sent to remote processor (these coordinates take into account the presence of ghost cells). Start by finding out what data is actually held by remote processor. */ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = thi_rem[i] - tlo_rem[i] + width[i] + 1; phi_rem[i] = thi_rem[i] - tlo_rem[i] + 2*width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* Put local data on remote processor */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } #if 0 ARMCI_PutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, ndim- 1, proc_rem); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem]+msgcnt, bytes, proc_rem); #else ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, (int)proc_rem); #endif msgcnt++; /* Perform update in positive direction. */ get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); /* Get actual coordinates of desired chunk of remote data as well as the actual coordinates of the local chunk of data that will receive the remote data (these coordinates take into account the presence of ghost cells). Start by finding out what data is actually held by remote processor. */ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = 0; phi_rem[i] = width[i] - 1; plo_loc[i] = hi_loc[i] - lo_loc[i] + width[i] - 1; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(GAme, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; /* Put local data on remote processor */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } #if 0 ARMCI_PutS(ptr_loc, stride_loc, ptr_rem, stride_rem, count, ndim- 1, proc_rem); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem]+msgcnt, bytes, proc_rem); #else ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, (int)proc_rem); #endif msgcnt++; } /* check to make sure that all messages have been recieved before starting update along new dimension */ waitforflags((GA_Update_Flags[GAme]+msgcnt-2), (GA_Update_Flags[GAme]+msgcnt-1)); /* update increment array */ increment[idx] = 2*nwidth; } /* set GA_Update_Flags array to zero for next update operation. */ for (idx=0; idx < 2*ndim; idx++) { GA_Update_Flags[GAme][idx] = 0; } GA_POP_NAME; return TRUE; } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING NON-BLOCKING GET CALLS AND RETURN * A NON-BLOCKING HANDLE \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update_ghosts_nb = pnga_update_ghosts_nb #endif void pnga_update_ghosts_nb(Integer g_a, Integer *nbhandle) { Integer idx, ipx, np, handle=GA_OFFSET + g_a, proc_rem; Integer ntot, mask[MAXDIM]; Integer size, ndim, i, itmp; Integer width[MAXDIM], dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; /*Integer tlo_loc[MAXDIM], thi_loc[MAXDIM];*/ Integer plo_loc[MAXDIM], phi_loc[MAXDIM]; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer plo_rem[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; logical mask0; int stride_loc[MAXDIM], stride_rem[MAXDIM],count[MAXDIM]; char *ptr_loc, *ptr_rem; Integer me = pnga_nodeid(); Integer p_handle; /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) { return; } size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; /* initialize ghost cell widths and get array dimensions */ for (idx=0; idx < ndim; idx++) { width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]). */ if (!gai_check_ghost_distr(g_a)) return; /* Create non-blocking handle */ ga_init_nbhandle(nbhandle); GA_PUSH_NAME("ga_update_ghosts_nb"); /* Get pointer to local memory */ ptr_loc = GA[handle].ptr[me]; /* obtain range of data that is held by local processor */ pnga_distribution(g_a,me,lo_loc,hi_loc); /* evaluate total number of PUT operations that will be required */ ntot = 1; for (idx=0; idx < ndim; idx++) ntot *= 3; /* Loop over all GET operations. The operation corresponding to the mask of all zeros is left out. */ for (ipx=0; ipx < ntot; ipx++) { /* Convert ipx to corresponding mask values */ itmp = ipx; mask0 = TRUE; for (idx = 0; idx < ndim; idx++) { i = itmp%3; mask[idx] = i-1; if (mask[idx] != 0) mask0 = FALSE; itmp = (itmp-i)/3; } if (mask0) continue; /* check to see if ghost cell block has zero elements*/ mask0 = FALSE; itmp = 0; for (idx = 0; idx < ndim; idx++) { if (mask[idx] != 0 && width[idx] == 0) mask0 = TRUE; if (mask[idx] != 0) itmp++; } if (mask0) continue; /* Now that mask has been determined, find data that is to be moved * and identify processor to which it is going. Wrap boundaries * around, if necessary */ for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { tlo_rem[idx] = lo_loc[idx]; thi_rem[idx] = hi_loc[idx]; } else if (mask[idx] == -1) { if (lo_loc[idx] > 1) { tlo_rem[idx] = lo_loc[idx]-width[idx]; thi_rem[idx] = lo_loc[idx]-1; } else { tlo_rem[idx] = dims[idx]-width[idx]+1; thi_rem[idx] = dims[idx]; } } else if (mask[idx] == 1) { if (hi_loc[idx] < dims[idx]) { tlo_rem[idx] = hi_loc[idx] + 1; thi_rem[idx] = hi_loc[idx] + width[idx]; } else { tlo_rem[idx] = 1; thi_rem[idx] = width[idx]; } } else { fprintf(stderr,"Illegal mask value found\n"); } } /* Locate remote processor from which data must be retrieved */ if (!pnga_locate_region(g_a, tlo_rem, thi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), tlo_rem, thi_rem, g_a); if (np > 1) { fprintf(stderr,"More than one remote processor found\n"); } /* Remote processor has been identified, now get ready to get data from it. Start by getting distribution on remote processor.*/ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { plo_loc[idx] = width[idx]; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]; plo_rem[idx] = plo_loc[idx]; } else if (mask[idx] == -1) { plo_loc[idx] = 0; phi_loc[idx] = width[idx]-1; plo_rem[idx] = thi_rem[idx]-tlo_rem[idx]+1; } else if (mask[idx] == 1) { plo_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]+1; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+2*width[idx]; plo_rem[idx] = width[idx]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_loc, phi_loc, count); count[0] *= size; /* get data from remote processor */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_NbGetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } GA_POP_NAME; return; } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY ALONG ONE SIDE OF ARRAY \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update_ghost_dir = pnga_update_ghost_dir #endif logical pnga_update_ghost_dir(Integer g_a, /* GA handle */ Integer pdim, /* Dimension of update */ Integer pdir, /* Direction of update (+/-1) */ logical pflag) /* include corner cells */ { Integer idx, ipx, inx, np, handle=GA_OFFSET + g_a, proc_rem; Integer ntot, mask[MAXDIM],lmask[MAXDIM]; Integer size, ndim, i, itmp, idim, idir; Integer width[MAXDIM], dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_loc[MAXDIM], phi_loc[MAXDIM]; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer plo_rem[MAXDIM]/*, phi_rem[MAXDIM]*/; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; logical flag; int stride_loc[MAXDIM], stride_rem[MAXDIM],count[MAXDIM]; char *ptr_loc, *ptr_rem; Integer me = pnga_nodeid(); Integer p_handle; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; p_handle = GA[handle].p_handle; if(local_sync_begin)pnga_pgroup_sync(p_handle); idim = pdim; idir = pdir; flag = pflag; size = GA[handle].elemsize; ndim = GA[handle].ndim; /* initialize ghost cell widths and get array dimensions */ for (idx=0; idx < ndim; idx++) { width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]). */ ipx = 0; for (idx = 0; idx < ndim; idx++) { for (np = 0; np < GA[handle].nblock[idx]; np++) { if (np < GA[handle].nblock[idx] - 1) { if (GA[handle].mapc[ipx+1]-GA[handle].mapc[ipx]+1 1) { tlo_rem[idx] = lo_loc[idx]-width[idx]; thi_rem[idx] = lo_loc[idx]-1; } else { tlo_rem[idx] = dims[idx]-width[idx]+1; thi_rem[idx] = dims[idx]; } } else if (mask[idx] == 1) { if (hi_loc[idx] < dims[idx]) { tlo_rem[idx] = hi_loc[idx] + 1; thi_rem[idx] = hi_loc[idx] + width[idx]; } else { tlo_rem[idx] = 1; thi_rem[idx] = width[idx]; } } else { fprintf(stderr,"Illegal mask value found\n"); } } /* Locate remote processor to which data must be sent */ if (!pnga_locate_region(g_a, tlo_rem, thi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), tlo_rem, thi_rem, g_a); if (np > 1) { fprintf(stderr,"More than one remote processor found\n"); } /* Remote processor has been identified, now get ready to get data from it. Start by getting distribution on remote processor.*/ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { plo_loc[idx] = width[idx]; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]; plo_rem[idx] = plo_loc[idx]; /*phi_rem[idx] = phi_loc[idx];*/ } else if (mask[idx] == -1) { plo_loc[idx] = 0; phi_loc[idx] = width[idx]-1; plo_rem[idx] = thi_rem[idx]-tlo_rem[idx]+1; /*phi_rem[idx] = thi_rem[idx]-tlo_rem[idx]+width[idx];*/ } else if (mask[idx] == 1) { plo_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]+1; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+2*width[idx]; plo_rem[idx] = width[idx]; /*phi_rem[idx] = 2*width[idx]-1;*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_loc, phi_loc, count); count[0] *= size; /* get data from remote processor */ if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } ARMCI_GetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem); } GA_POP_NAME; if(local_sync_end)pnga_pgroup_sync(p_handle); return TRUE; } /*uncomment for using message passing sendrecv in north south direction */ /*#define USE_MP_NORTHSOUTH */ /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING PUT CALLS WITHOUT CORNERS AND * WITHOUT ANY BARRIERS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update5_ghosts = pnga_update5_ghosts #endif logical pnga_update5_ghosts(Integer g_a) { Integer idx, i, handle=GA_OFFSET + g_a; Integer /*size,*/ ndim, nwidth; Integer width[MAXDIM]; Integer* proc_rem_ptr; int *stride_loc, *stride_rem,*count; int msgcnt, corner_flag, proc_rem; /* int bytes; */ char *ptr_loc, *ptr_rem,*cache; int local_sync_begin,local_sync_end; Integer p_handle; #ifdef USE_MP_NORTHSOUTH char send_name[32], rcv_name[32]; void *snd_ptr, *rcv_ptr; #endif /* This routine makes use of the shift algorithm to update data in the * ghost cells bounding the local block of visible data. The shift * algorithm starts by updating the blocks of data along the first * dimension by grabbing a block of data that is width[0] deep but * otherwise matches the dimensions of the data residing on the * calling processor. The update of the second dimension, however, * grabs a block that is width[1] deep in the second dimension but is * ldim0 + 2*width[0] in the first dimensions where ldim0 is the * size of the visible data along the first dimension. The remaining * dimensions are left the same. For the next update, the width of the * second dimension is also increased by 2*width[1] and so on. This * algorith makes use of the fact that data for the dimensions that * have already been updated is available on each processor and can be * used in the updates of subsequent dimensions. The total number of * separate updates is 2*ndim, an update in the negative and positive * directions for each dimension. * * This operation is implemented using put calls to place the * appropriate data on remote processors. To signal the remote * processor that it has received the data, a second put call * consisting of a single integer is sent after the first put call and * used to update a signal buffer on the remote processor. Each * processor can determine how much data it has received by checking * its signal buffer. */ local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ p_handle = GA[handle].p_handle; if(local_sync_begin)pnga_pgroup_sync(p_handle); #ifdef USE_MP_NORTHSOUTH strcpy(send_name,"send_buffer"); strcpy(rcv_name,"receive_buffer"); snd_ptr = ga_malloc(buflen, GA[handle].type, send_name); rcv_ptr = ga_malloc(buflen, GA[handle].type, rcv_name); #endif cache = (char *)GA[handle].cache; /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; /*size = GA[handle].elemsize;*/ ndim = GA[handle].ndim; for (i=0; i= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } if(count[0]>1000000){ /*tries to use armci direct put when possible */ ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, proc_rem); } else{ #ifndef USE_MP_NORTHSOUTH ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, proc_rem); #else #endif } msgcnt++; /* Perform update in positive direction. */ ptr_rem = *(char **)(cache); ptr_loc = *(char **)(cache+sizeof(char *)); stride_loc = (int *)(cache+2*sizeof(char *)); stride_rem = (int *)(stride_loc+ndim); count = (int *)(stride_rem+ndim); proc_rem_ptr = (Integer *)(count+ndim); proc_rem = (int)(*proc_rem_ptr); cache = (char *)(proc_rem_ptr+1); if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } if(count[0]>1000000){ /*tries to use armci direct put when possible */ ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, proc_rem); } else{ #ifndef USE_MP_NORTHSOUTH ARMCI_PutS_flag(ptr_loc, stride_loc, ptr_rem, stride_rem, count, (int)(ndim - 1), GA_Update_Flags[proc_rem]+msgcnt, *GA_Update_Signal, proc_rem); #else #endif } msgcnt++; if (corner_flag){ /* check to make sure that last two messages have been recieved before starting update along a new dimension */ waitforflags((GA_Update_Flags[GAme]+msgcnt-2), (GA_Update_Flags[GAme]+msgcnt-1)); GA_Update_Flags[GAme][msgcnt-1]=0; GA_Update_Flags[GAme][msgcnt-2]=0; } } } #if 1 if (!corner_flag) { /* check to make sure that all messages have been recieved */ while(msgcnt){ waitforflags((GA_Update_Flags[GAme]+msgcnt-1), (GA_Update_Flags[GAme]+msgcnt-2)); GA_Update_Flags[GAme][msgcnt-1]=0; GA_Update_Flags[GAme][msgcnt-2]=0; msgcnt-=2; } } #endif GA_POP_NAME; if(local_sync_end)pnga_pgroup_sync(p_handle); return TRUE; } /*#define UPDATE_SAMENODE_GHOSTS_FIRST*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_update5_info = pnga_set_update5_info #endif logical pnga_set_update5_info(Integer g_a) { int i; Integer *proc_rem; Integer size, ndim, nwidth, increment[MAXDIM],np; Integer width[MAXDIM]; Integer dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_loc[MAXDIM]/*, phi_loc[MAXDIM]*/; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer slo_rem[MAXDIM], shi_rem[MAXDIM]; Integer plo_rem[MAXDIM], phi_rem[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; int *stride_loc, *stride_rem,*count; int idx, corner_flag; char **ptr_loc, **ptr_rem,*cache; Integer handle = GA_OFFSET + g_a; int cache_size; #ifdef UPDATE_SAMENODE_GHOSTS_FIRST int scope; #endif Integer me = pnga_nodeid(); Integer p_handle; /* This routine sets up the arrays that are used to transfer data * using the update5 algorithm. The arrays begining with the character * "p" represent relative indices marking the location of the data set * relative to the origin the local patch of the global array, all * other indices are in absolute coordinates and mark locations in the * total global array. The indices used by this routine are described * below. * * lo_loc[], hi_loc[]: The lower and upper indices of the visible * block of data held by the calling processor. * * lo_rem[], hi_rem[]: The lower and upper indices of the block * of data on a remote processor or processors that is needed to * fill in the calling processors ghost cells. These indices are * NOT corrected for wrap-around (periodic) boundary conditions * so they can be negative or greater than the array dimension * values held in dims[]. * * slo_rem[], shi_rem[]: Similar to lo_rem[] and hi_rem[], except * that these indices have been corrected for wrap-around * boundary conditions. * * thi_rem[], thi_rem[]: The lower and upper indices of the visible * data on a remote processor. * * plo_loc[], phi_loc[]: The indices of the local data patch that * is going to be updated. * * plo_rem[], phi_rem[]: The indices of the data patch on the * remote processor that will be used to update the data on the * calling processor. Note that the dimensions of the patches * represented by plo_loc[], plo_rem[] and plo_loc[], phi_loc[] * must be the same. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]. */ if (!gai_check_ghost_distr(g_a)) return FALSE; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; size = GA[handle].elemsize; cache_size = 2*sizeof(char *)+3*sizeof(int)+sizeof(Integer); cache_size = 2*ndim*((cache_size/sizeof(double)) + 1); GA[handle].cache = (double *)malloc(sizeof(double)*cache_size); cache = (char *)GA[handle].cache; corner_flag = GA[handle].corner_flag; pnga_distribution(g_a,me,lo_loc,hi_loc); for (idx=0; idx < ndim; idx++) { increment[idx] = 0; width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; if (lo_loc[idx] == 0 && hi_loc[idx] == -1){ *(char **)cache = NULL; return FALSE; } } #ifdef UPDATE_SAMENODE_GHOSTS_FIRST for(scope=0;scope < 2; scope ++) #endif for (idx=0; idx < ndim; idx++) { nwidth = width[idx]; if (nwidth != 0) { ptr_rem = (char **)cache; ptr_loc = (char **)(cache+sizeof(char *)); stride_loc = (int *)(cache+2*sizeof(char *)); stride_rem = (int *)(stride_loc+ndim); count = (int *)(stride_rem+ndim); proc_rem = (Integer *)(count+ndim); get_remote_block_neg(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); *proc_rem = (Integer)GA_proclist[0]; if (p_handle >= 0) { *proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem]; } #ifdef UPDATE_SAMENODE_GHOSTS_FIRST if(scope == 0 && ARMCI_Same_node(*proc_rem)) goto do_negative; #endif cache = (char *)(proc_rem+1); pnga_distribution(g_a, *proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = thi_rem[i] - tlo_rem[i] + width[i] + 1; phi_rem[i] = thi_rem[i] - tlo_rem[i] + 2*width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } gam_LocationWithGhosts(me, handle, plo_loc, ptr_loc, ld_loc); gam_LocationWithGhosts(*proc_rem, handle, plo_rem, ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; if (p_handle >= 0) { *proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem]; } #ifdef UPDATE_SAMENODE_GHOSTS_FIRST do_negative: #endif /*BJP proc_rem++; */ ptr_rem = (char **)cache; ptr_loc = (char **)(cache+sizeof(char *)); stride_loc = (int *)(cache+2*sizeof(char *)); stride_rem = (int *)(stride_loc+ndim); count = (int *)(stride_rem+ndim); proc_rem = (Integer *)(count+ndim); get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rem, shi_rem, dims, width); if (!pnga_locate_region(g_a, slo_rem, shi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rem, shi_rem, g_a); *proc_rem = (Integer)GA_proclist[0]; if (p_handle >= 0) { *proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem]; } #ifdef UPDATE_SAMENODE_GHOSTS_FIRST if(scope == 0 && ARMCI_Same_node(*proc_rem)) continue; #endif cache = (char *)(proc_rem+1); pnga_distribution(g_a, *proc_rem, tlo_rem, thi_rem); for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_rem[i] = 0; phi_rem[i] = width[i] - 1; plo_loc[i] = hi_loc[i] - lo_loc[i] + width[i] - 1; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + 2*width[i] - 1;*/ } else { plo_rem[i] = width[i]; phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i]; plo_loc[i] = width[i]; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + width[i];*/ } } else { plo_rem[i] = 0; phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i]; plo_loc[i] = 0; /*phi_loc[i] = hi_loc[i] - lo_loc[i] + increment[i];*/ } } gam_LocationWithGhosts(GAme, handle, plo_loc, ptr_loc, ld_loc); gam_LocationWithGhosts(*proc_rem, handle, plo_rem, ptr_rem, ld_rem); gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); gam_ComputeCount(ndim, plo_rem, phi_rem, count); count[0] *= size; if (p_handle >= 0) { *proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[*proc_rem]; } if (corner_flag) increment[idx] = 2*nwidth; } } return TRUE; } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update_ghosts = pnga_update_ghosts #endif void pnga_update_ghosts(Integer g_a) { /* Wrapper program for ghost cell update operations. If optimized update operation fails then use slow but robust version of update operation */ int local_sync_begin,local_sync_end; Integer handle = GA_OFFSET + g_a; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_pgroup_sync(GA[handle].p_handle); #ifdef CRAY_T3D if (!pnga_update5_ghosts(g_a)) #else if (!pnga_update4_ghosts(g_a)) #endif { pnga_update1_ghosts(g_a); } if(local_sync_end)pnga_pgroup_sync(GA[handle].p_handle); } /* Utility function for ga_update6_ghosts routine */ static double waitformixedflags (int flag1, int flag2, int *ptr1, int *ptr2) { int i = 1; double val = 0; while ((flag1 && *ptr1 == 0) || (flag2 && *ptr2 == 0)) { val = exp(-(double)i++); } return(val); } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING SHIFT ALGORITHM AND * MESSAGE PASSING \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update6_ghosts = pnga_update6_ghosts #endif logical pnga_update6_ghosts(Integer g_a) { Integer idx, idir, i, np, handle=GA_OFFSET + g_a; Integer size, buflen, buftot, bufsize, ndim, increment[MAXDIM]; Integer proc_rem_snd, proc_rem_rcv, pmax; Integer msgcnt, length; Integer width[MAXDIM], dims[MAXDIM], index[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_rem[MAXDIM]/*, phi_rem[MAXDIM]*/; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer plo_snd[MAXDIM], phi_snd[MAXDIM]; Integer lo_rcv[MAXDIM], hi_rcv[MAXDIM]; Integer slo_rcv[MAXDIM], shi_rcv[MAXDIM]; Integer plo_rcv[MAXDIM], phi_rcv[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; int msglen; int stride_snd[MAXDIM], stride_rcv[MAXDIM],count[MAXDIM]; int stride_rem[MAXDIM]; int flag1=0, flag2=0, sprocflag, rprocflag; char *ptr_snd, *ptr_rcv; char /* *ptr_loc,*/ *ptr_rem; char send_name[32], rcv_name[32]; void *snd_ptr, *rcv_ptr, *snd_ptr_orig, *rcv_ptr_orig; Integer me = pnga_nodeid(); Integer p_handle, wproc; /* This routine makes use of the shift algorithm to update data in the * ghost cells bounding the local block of visible data. The shift * algorithm starts by updating the blocks of data along the first * dimension by grabbing a block of data that is width[0] deep but * otherwise matches the dimensions of the data residing on the * calling processor. The update of the second dimension, however, * grabs a block that is width[1] deep in the second dimension but is * ldim0 + 2*width[0] in the first dimensions where ldim0 is the * size of the visible data along the first dimension. The remaining * dimensions are left the same. For the next update, the width of the * second dimension is also increased by 2*width[1] and so on. This * algorith makes use of the fact that data for the dimensions that * have already been updated is available on each processor and can be * used in the updates of subsequent dimensions. The total number of * separate updates is 2*ndim, an update in the negative and positive * directions for each dimension. * * This implementation make use of a combination of explicit message * passing between processors on different nodes and shared memory * copies with an additional flag between processors on the same node * to perform the update. Separate message types for the messages and * the use of the additional flag are for the updates in each * coordinate direction are used to maintain synchronization locally * and to guarantee that the data is present before the updates in a * new coordinate direction take place. * * To perform the update, this routine makes use of several copies of * indices marking the upper and lower limits of data. Indices * beginning with the character "p" are relative indices marking the * location of the data set relative to the origin the local patch of * the global array, all other indices are in absolute coordinates and * mark locations in the total global array. The indices used by this * routine are described below. * * lo_loc[], hi_loc[]: The lower and upper indices of the visible * block of data held by the calling processor. * * lo_rcv[], hi_rcv[]: The lower and upper indices of the blocks * of data that will be either sent to or received from a remote * processor. These indices are NOT corrected for wrap-around * (periodic) boundary conditions so they can be negative or greater * than the array dimension values held in dims[]. * * slo_rcv[], shi_rcv[]: Similar to lo_rcv[] and hi_rcv[], except * that these indices have been corrected for wrap-around * boundary conditions. * * plo_rcv[], phi_rcv[]: The local indices of the local data patch * that receive that message from the remote processor. * * plo_snd[], phi_snd[]: The local indices of the data patch * that will be sent to the remote processor. Note that the * dimensions of the patches represented by plo_rec[], plo_rec[] and * plo_snd[], phi_snd[] must be the same. * * tlo_rem[], thi_rem[]: The indices of the locally held visible * portion of the global array on the remote processor that will be * receiving the data using a shared memory copy. * * plo_rem[], phi_rem[]: The local indices of the coordinate patch * that will be put on the remote processor using a shared memory * copy. */ /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) return TRUE; size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; /* initialize range increments and get array dimensions */ for (idx=0; idx < ndim; idx++) { increment[idx] = 0; width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]. */ if (!gai_check_ghost_distr(g_a)) return FALSE; GA_PUSH_NAME("ga_update6_ghosts"); msgcnt = 0; /* Get pointer to local memory */ /*ptr_loc = GA[handle].ptr[me];*/ /* obtain range of data that is held by local processor */ pnga_distribution(g_a,me,lo_loc,hi_loc); /* Get indices of processor in virtual grid */ pnga_proc_topology(g_a, me, index); /* Try to find maximum size of message that will be sent during * update operations and use this to allocate memory for message * passing buffers. */ buftot = 1; for (i=0; i= 0) { wproc = PGRP_LIST[p_handle].inv_map_proc_list[wproc]; } rprocflag = ARMCI_Same_node(wproc); proc_rem_snd = GA_proclist[0]; /* Find processor from which data will be received */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = hi_loc[i] + 1; hi_rcv[i] = hi_loc[i] + width[i]; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i dims[i]) { slo_rcv[i] = 1; shi_rcv[i] = width[i]; } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } else { slo_rcv[i] = lo_rcv[i]; shi_rcv[i] = hi_rcv[i]; } } /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); wproc = GA_proclist[0]; if (p_handle >= 0) { wproc = PGRP_LIST[p_handle].inv_map_proc_list[wproc]; } sprocflag = ARMCI_Same_node(wproc); proc_rem_rcv = GA_proclist[0]; pnga_distribution(g_a, proc_rem_rcv, tlo_rem, thi_rem); /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = width[i]; phi_snd[i] = 2*width[i] - 1; plo_rcv[i] = hi_loc[i] - lo_loc[i] + width[i] + 1; phi_rcv[i] = hi_loc[i] - lo_loc[i] + 2*width[i]; plo_rem[i] = thi_rem[i] - tlo_rem[i] + width[i] + 1; /*phi_rem[i] = thi_rem[i] - tlo_rem[i] + 2*width[i];*/ } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rem[i] = width[i]; /*phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i];*/ } } else { plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_rem[i] = 0; /*phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, &ptr_snd, ld_loc); gam_LocationWithGhosts(me, handle, plo_rcv, &ptr_rcv, ld_loc); gam_LocationWithGhosts(proc_rem_snd, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides for send and receive */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, &length); length *= size; count[0] *= size; /* If we are sending data to another node, then use message passing */ if (!rprocflag) { /* Fill send buffer with data. */ armci_write_strided(ptr_snd, (int)ndim-1, stride_snd, count, snd_ptr); } /* Send Messages. If processor has odd index in direction idx, it * sends message first, if processor has even index it receives * message first. Then process is reversed. Also need to account * for whether or not there are an odd number of processors along * update direction. */ if (p_handle >= 0) { proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_snd]; proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_rcv]; } if (GA[handle].nblock[idx]%2 == 0) { if (index[idx]%2 != 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx]%2 == 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (rprocflag) { #if 0 ARMCI_PutS(ptr_snd, stride_snd, ptr_rem, stride_rem, count, ndim- 1, proc_rem_snd); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem_snd]+msgcnt, bytes, proc_rem_snd); #else ARMCI_PutS_flag(ptr_snd, stride_snd, ptr_rem, stride_rem, count, (int)(ndim-1), GA_Update_Flags[proc_rem_snd]+msgcnt, *GA_Update_Signal, (int)proc_rem_snd); #endif } if (index[idx]%2 != 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx]%2 == 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } } else { /* account for wrap-around boundary condition, if necessary */ pmax = GA[handle].nblock[idx] - 1; if (index[idx]%2 != 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx]%2 == 0 && index[idx] != pmax && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (rprocflag) { #if 0 ARMCI_PutS(ptr_snd, stride_snd, ptr_rem, stride_rem, count, ndim- 1, proc_rem_snd); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem_snd]+msgcnt, bytes, proc_rem_snd); #else ARMCI_PutS_flag(ptr_snd, stride_snd, ptr_rem, stride_rem, count, (int)(ndim-1), GA_Update_Flags[proc_rem_snd]+msgcnt, *GA_Update_Signal, (int)proc_rem_snd); #endif } if (index[idx]%2 != 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx]%2 == 0 && index[idx] != 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } /* make up for odd processor at end of string */ if (index[idx] == 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } if (index[idx] == pmax && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } } if (sprocflag) { flag1 = 1; } else { flag1 = 0; } msgcnt++; /* copy data back into global array */ if (!sprocflag) { armci_read_strided(ptr_rcv, (int)ndim-1, stride_rcv, count, rcv_ptr); } /* Find parameters for message in positive direction. */ get_remote_block_pos(idx, ndim, lo_loc, hi_loc, slo_rcv, shi_rcv, dims, width); /* locate processor with this data */ if (!pnga_locate_region(g_a, slo_rcv, shi_rcv, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), slo_rcv, shi_rcv, g_a); wproc = GA_proclist[0]; if (p_handle >= 0) { wproc = PGRP_LIST[p_handle].inv_map_proc_list[wproc]; } rprocflag = ARMCI_Same_node(wproc); proc_rem_snd = GA_proclist[0]; /* Find processor from which data will be recieved */ for (i = 0; i < ndim; i++) { if (i == idx) { lo_rcv[i] = lo_loc[i] - width[i]; hi_rcv[i] = lo_loc[i] - 1; } else { lo_rcv[i] = lo_loc[i]; hi_rcv[i] = hi_loc[i]; } } /* Account for boundaries, if necessary. */ for (i=0; i= 0) { wproc = PGRP_LIST[p_handle].inv_map_proc_list[wproc]; } sprocflag = ARMCI_Same_node(wproc); proc_rem_rcv = GA_proclist[0]; pnga_distribution(g_a, proc_rem_rcv, tlo_rem, thi_rem); /* Get actual coordinates of chunk of data that will be sent to * remote processor as well as coordinates of the array space that * will receive data from remote processor. */ for (i = 0; i < ndim; i++) { if (increment[i] == 0) { if (i == idx) { plo_snd[i] = hi_loc[i] - lo_loc[i] + 1; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = 0; phi_rcv[i] = width[i] - 1; plo_rem[i] = 0; /*phi_rem[i] = width[i] - 1;*/ } else { plo_snd[i] = width[i]; phi_snd[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rcv[i] = width[i]; phi_rcv[i] = hi_loc[i] - lo_loc[i] + width[i]; plo_rem[i] = width[i]; /*phi_rem[i] = thi_rem[i] - tlo_rem[i] + width[i];*/ } } else { plo_snd[i] = 0; phi_snd[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_rcv[i] = 0; phi_rcv[i] = hi_loc[i] - lo_loc[i] + increment[i]; plo_rem[i] = 0; /*phi_rem[i] = thi_rem[i] - tlo_rem[i] + increment[i];*/ } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_snd, &ptr_snd, ld_loc); gam_LocationWithGhosts(me, handle, plo_rcv, &ptr_rcv, ld_loc); gam_LocationWithGhosts(proc_rem_snd, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides for send and recieve */ gam_setstride(ndim, size, ld_loc, ld_loc, stride_rcv, stride_snd); gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_snd); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_rcv, phi_rcv, count); gam_CountElems(ndim, plo_snd, phi_snd, &length); length *= size; count[0] *= size; /* if we are sending data to another node, use message passing */ if (!rprocflag) { /* Fill send buffer with data. */ armci_write_strided(ptr_snd, (int)ndim-1, stride_snd, count, snd_ptr); } /* Send Messages. If processor has odd index in direction idx, it * sends message first, if processor has even index it receives * message first. Then process is reversed. Also need to account * for whether or not there are an odd number of processors along * update direction. */ if (p_handle >= 0) { proc_rem_snd = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_snd]; proc_rem_rcv = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem_rcv]; } if (GA[handle].nblock[idx]%2 == 0) { if (index[idx]%2 != 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx]%2 == 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (rprocflag) { #if 0 ARMCI_PutS(ptr_snd, stride_snd, ptr_rem, stride_rem, count, ndim- 1, proc_rem_snd); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem_snd]+msgcnt, bytes, proc_rem_snd); #else ARMCI_PutS_flag(ptr_snd, stride_snd, ptr_rem, stride_rem, count, (int)(ndim-1), GA_Update_Flags[proc_rem_snd]+msgcnt, *GA_Update_Signal, (int)proc_rem_snd); #endif } if (index[idx]%2 != 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx]%2 == 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } } else { /* account for wrap-around boundary condition, if necessary */ pmax = GA[handle].nblock[idx] - 1; if (index[idx]%2 != 0 && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } else if (index[idx]%2 == 0 && index[idx] != 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } if (rprocflag) { #if 0 ARMCI_PutS(ptr_snd, stride_snd, ptr_rem, stride_rem, count, ndim- 1, proc_rem_snd); /* Send signal to remote processor that data transfer has been completed. */ bytes = sizeof(int); ARMCI_Put(GA_Update_Signal, GA_Update_Flags[proc_rem_snd]+msgcnt, bytes, proc_rem_snd); #else ARMCI_PutS_flag(ptr_snd, stride_snd, ptr_rem, stride_rem, count, (int)(ndim-1), GA_Update_Flags[proc_rem_snd]+msgcnt, *GA_Update_Signal, (int)proc_rem_snd); #endif } if (index[idx]%2 != 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } else if (index[idx]%2 == 0 && index[idx] != pmax && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } /* make up for odd processor at end of string */ if (index[idx] == pmax && !rprocflag) { armci_msg_snd(msgcnt, snd_ptr, length, proc_rem_snd); } if (index[idx] == 0 && !sprocflag) { armci_msg_rcv(msgcnt, rcv_ptr, bufsize, &msglen, proc_rem_rcv); } } /* copy data back into global array */ if (!sprocflag) { armci_read_strided(ptr_rcv, (int)ndim-1, stride_rcv, count, rcv_ptr); } if (sprocflag) { flag2 = 1; } else { flag2 = 0; } msgcnt++; } /* check to make sure any outstanding puts have showed up */ waitformixedflags(flag1, flag2, GA_Update_Flags[GAme]+msgcnt-2, GA_Update_Flags[GAme]+msgcnt-1); /* update increment array */ increment[idx] = 2*width[idx]; } ga_free(rcv_ptr_orig); ga_free(snd_ptr_orig); /* set update flags to zero for next operation */ for (idx=0; idx < 2*ndim; idx++) { GA_Update_Flags[GAme][idx] = 0; } GA_POP_NAME; return TRUE; } /*\ UPDATE GHOST CELLS OF GLOBAL ARRAY USING GET CALLS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_update7_ghosts = pnga_update7_ghosts #endif logical pnga_update7_ghosts(Integer g_a) { Integer idx, ipx, np, handle=GA_OFFSET + g_a, proc_rem; Integer ntot, mask[MAXDIM]; Integer size, ndim, i, itmp; Integer width[MAXDIM], dims[MAXDIM]; Integer lo_loc[MAXDIM], hi_loc[MAXDIM]; Integer plo_loc[MAXDIM], phi_loc[MAXDIM]; Integer tlo_rem[MAXDIM], thi_rem[MAXDIM]; Integer plo_rem[MAXDIM]; Integer ld_loc[MAXDIM], ld_rem[MAXDIM]; logical mask0; int stride_loc[MAXDIM], stride_rem[MAXDIM],count[MAXDIM]; char *ptr_loc, *ptr_rem; Integer me = pnga_nodeid(); Integer p_handle; /* if global array has no ghost cells, just return */ if (!pnga_has_ghosts(g_a)) { return TRUE; } size = GA[handle].elemsize; ndim = GA[handle].ndim; p_handle = GA[handle].p_handle; /* initialize ghost cell widths and get array dimensions */ for (idx=0; idx < ndim; idx++) { width[idx] = (Integer)GA[handle].width[idx]; dims[idx] = (Integer)GA[handle].dims[idx]; } /* Check to make sure that global array is well-behaved (all processors have data and the width of the data in each dimension is greater than the corresponding value in width[]). */ if (!gai_check_ghost_distr(g_a)) return FALSE; GA_PUSH_NAME("ga_update7_ghosts"); /* Get pointer to local memory */ ptr_loc = GA[handle].ptr[me]; /* obtain range of data that is held by local processor */ pnga_distribution(g_a,me,lo_loc,hi_loc); /* evaluate total number of GET operations that will be required */ ntot = 1; for (idx=0; idx < ndim; idx++) ntot *= 3; /* Loop over all GET operations. The operation corresponding to the mask of all zeros is left out. */ for (ipx=0; ipx < ntot; ipx++) { /* Convert ipx to corresponding mask values */ itmp = ipx; mask0 = TRUE; for (idx = 0; idx < ndim; idx++) { i = itmp%3; mask[idx] = i-1; if (mask[idx] != 0) mask0 = FALSE; itmp = (itmp-i)/3; } if (mask0) continue; /* check to see if ghost cell block has zero elements*/ mask0 = FALSE; itmp = 0; for (idx = 0; idx < ndim; idx++) { if (mask[idx] != 0 && width[idx] == 0) mask0 = TRUE; if (mask[idx] != 0) itmp++; } /*if (itmp>1) mask0 = TRUE; */ if (mask0) continue; /* Now that mask has been determined, find data that is to be moved * and identify processor from which it is coming. Wrap boundaries * around, if necessary */ for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { tlo_rem[idx] = lo_loc[idx]; thi_rem[idx] = hi_loc[idx]; } else if (mask[idx] == -1) { if (lo_loc[idx] > 1) { tlo_rem[idx] = lo_loc[idx]-width[idx]; thi_rem[idx] = lo_loc[idx]-1; } else { tlo_rem[idx] = dims[idx]-width[idx]+1; thi_rem[idx] = dims[idx]; } } else if (mask[idx] == 1) { if (hi_loc[idx] < dims[idx]) { tlo_rem[idx] = hi_loc[idx] + 1; thi_rem[idx] = hi_loc[idx] + width[idx]; } else { tlo_rem[idx] = 1; thi_rem[idx] = width[idx]; } } else { fprintf(stderr,"Illegal mask value found\n"); } } /* Locate remote processor to which data must be sent */ if (!pnga_locate_region(g_a, tlo_rem, thi_rem, _ga_map, GA_proclist, &np)) ga_RegionError(pnga_ndim(g_a), tlo_rem, thi_rem, g_a); if (np > 1) { fprintf(stderr,"More than one remote processor found\n"); } /* Remote processor has been identified, now get ready to send data to it. Start by getting distribution on remote processor.*/ proc_rem = GA_proclist[0]; pnga_distribution(g_a, proc_rem, tlo_rem, thi_rem); for (idx = 0; idx < ndim; idx++) { if (mask[idx] == 0) { plo_loc[idx] = width[idx]; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]; plo_rem[idx] = plo_loc[idx]; } else if (mask[idx] == -1) { plo_loc[idx] = 0; phi_loc[idx] = width[idx]-1; plo_rem[idx] = thi_rem[idx]-tlo_rem[idx]+1; } else if (mask[idx] == 1) { plo_loc[idx] = hi_loc[idx]-lo_loc[idx]+width[idx]+1; phi_loc[idx] = hi_loc[idx]-lo_loc[idx]+2*width[idx]; plo_rem[idx] = width[idx]; } } /* Get pointer to local data buffer and remote data buffer as well as lists of leading dimenstions */ gam_LocationWithGhosts(me, handle, plo_loc, &ptr_loc, ld_loc); gam_LocationWithGhosts(proc_rem, handle, plo_rem, &ptr_rem, ld_rem); /* Evaluate strides on local and remote processors */ gam_setstride(ndim, size, ld_loc, ld_rem, stride_rem, stride_loc); /* Compute the number of elements in each dimension and store result in count. Scale the first element in count by the element size. */ gam_ComputeCount(ndim, plo_loc, phi_loc, count); count[0] *= size; if (p_handle >= 0) { proc_rem = PGRP_LIST[p_handle].inv_map_proc_list[proc_rem]; } /* put data on remote processor */ /* ARMCI_GetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem); */ ARMCI_NbGetS(ptr_rem, stride_rem, ptr_loc, stride_loc, count, (int)(ndim - 1), (int)proc_rem, NULL); } ARMCI_WaitAll(); GA_POP_NAME; return TRUE; } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_ghost_barrier = pnga_ghost_barrier #endif void pnga_ghost_barrier() { #ifdef LAPI int signal = 1, n = 1; int *ptr; ptr = &signal; armci_msg_igop(ptr,n,"+"); #else armci_msg_barrier(); #endif } /*\ UPDATE THE GHOST CELLS ON A PROCESSOR IN A SPECIFIC DIRECTION * USING NON-BLOCKING GET CALLS \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbget_ghost_dir = pnga_nbget_ghost_dir #endif void pnga_nbget_ghost_dir(Integer g_a, Integer *mask, Integer *nbhandle) { Integer handle = GA_OFFSET + g_a; Integer lo_loc[MAXDIM], hi_loc[MAXDIM], lo_rem[MAXDIM], hi_rem[MAXDIM]; Integer subscript[MAXDIM], ld[MAXDIM]; Integer i, ndim, dim, width; char *ptr_loc; Integer me = pnga_nodeid(); /*Integer p_handle;*/ GA_PUSH_NAME("nga_nbget_ghost_dir"); ndim = GA[handle].ndim; /*p_handle = GA[handle].p_handle;*/ /* check mask to see that it corresponds to a valid direction */ for (i=0; i #endif #include "armci.h" #include "galinalg.h" /* min acceptable amount of memory (in elements) and default chunk size */ # define MINMEM 64 # define CHUNK_SIZE 256 # define MAX_CHUNKS 1024 # define BLOCK_SIZE 1024 /* temp buf size for pinning */ # define GA_ASPECT_RATIO 3 # define NUM_MATS 3 # define MINTASKS 10 /* increase this if there is high load imbalance */ # define EXTRA 4 #define MIN_CHUNK_SIZE 256 #define SET 1 #define UNSET 0 extern void gai_matmul_patch_flag(int flag); typedef struct { int lo[2]; /* 2 elements: ilo and klo */ int hi[2]; int dim[2]; int chunkBId; short int do_put; }task_list_t; #define VECTORCHECK(rank,dims,dim1,dim2, ilo, ihi, jlo, jhi) \ if(rank>2) pnga_error("rank is greater than 2",rank); \ else if(rank==2) {dim1=dims[0]; dim2=dims[1];} \ else if(rank==1) {if((ihi-ilo)>0) { dim1=dims[0]; dim2=1;} \ else { dim1=1; dim2=dims[0];}} \ else pnga_error("rank must be atleast 1",rank); #define WAIT_GET_BLOCK(nbhdl) pnga_nbwait(nbhdl) #endif /* _MATMUL_H_ */ ga-5-4/global/src/diag.fh0000644000175000017500000000113212662210457013304 0ustar mbambac c limit number of processors active in diagonalization according to c problem size: c - first group are MPPs c - second group are (multiprocessor) workstations c #if defined(KSR)||defined(CRAY_T3D)||defined(NX)||defined(SP1)||defined(SP)||defined(LAPI) # define SIZE1 200 # define SIZE2 400 # define SIZE3 800 # define SIZE4 2000 # define PROC1 4 # define PROC2 16 # define PROC3 64 # define PROC4 256 #else # define SIZE1 400 # define SIZE2 800 # define SIZE3 1200 # define SIZE4 2000 # define PROC1 4 # define PROC2 8 # define PROC3 12 # define PROC4 16 #endif ga-5-4/global/src/nbutil.c0000644000175000017500000002154512662210457013534 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "globalp.h" #include "base.h" #if HAVE_STDIO_H # include #endif #define DEBUG 0 /*The structure of gai_nbhdl_t is (this is our internal handle)*/ #define NUM_HDLS 20 typedef struct { unsigned int ihdl_index:8; unsigned int ga_nbtag:24; }gai_nbhdl_t; /*Each element in the armci handle linked list is of type ga_armcihdl_t*/ typedef struct struct_armcihdl_t{ armci_hdl_t* handle; struct struct_armcihdl_t *next; struct struct_armcihdl_t *previous; int index; int ga_hdlarr_index; }ga_armcihdl_t; /*We create an array of type ga_nbhdl_array_t. Each of the elements in this array is the head of the armcihandle linked list that is associated with each GA call. */ typedef struct{ ga_armcihdl_t *ahandle; int count; int ga_nbtag; } ga_nbhdl_array_t; /*fills up the armci_hdl_t entries in ga_armcihdl_t */ static armci_hdl_t hdl_array[NUM_HDLS]; /*index of the following array goes into ihdl_index. while waiting for a *non-bloking ga call, we first check if *(list_element_array[inbhandle->ihdl_index].ga_nbtag == inbhandle->ga_nbtag) *if it is, then we complete all the armci handles in the linked list this *points to. */ static ga_nbhdl_array_t ga_ihdl_array[NUM_HDLS]; /*this is the array of linked list elements. */ static ga_armcihdl_t list_element_array[NUM_HDLS] = { {&(hdl_array[0]), NULL,NULL,0, -1 },{&(hdl_array[1]), NULL,NULL, 1,-1 }, {&(hdl_array[2]), NULL,NULL,2, -1 },{&(hdl_array[3]), NULL,NULL, 3,-1 }, {&(hdl_array[4]), NULL,NULL,4, -1 },{&(hdl_array[5]), NULL,NULL, 5,-1 }, {&(hdl_array[6]), NULL,NULL,6, -1 },{&(hdl_array[7]), NULL,NULL, 7,-1 }, {&(hdl_array[8]), NULL,NULL,8, -1 },{&(hdl_array[9]), NULL,NULL, 9,-1 }, {&(hdl_array[10]),NULL,NULL,10,-1 },{&(hdl_array[11]),NULL,NULL,11,-1 }, {&(hdl_array[12]),NULL,NULL,12,-1 },{&(hdl_array[13]),NULL,NULL,13,-1 }, {&(hdl_array[14]),NULL,NULL,14,-1 },{&(hdl_array[15]),NULL,NULL,15,-1 }, {&(hdl_array[16]),NULL,NULL,16,-1 },{&(hdl_array[17]),NULL,NULL,17,-1 }, {&(hdl_array[18]),NULL,NULL,18,-1 },{&(hdl_array[19]),NULL,NULL,19,-1 }}; static int nextIHAelement=-1; /*oldest ga_ihdl_array element*/ static int nextLEAelement=-1; /*oldest list_element_array element*/ static int ihdl_array_avail[NUM_HDLS]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; static int list_ele_avail[NUM_HDLS]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; /*\ a unique tag everytime \*/ static unsigned int ga_nb_tag; unsigned int get_next_tag(){ return((++ga_nb_tag)); } /*\ the only way to complete a list element! * does the basic list operation: remove element, update previous and next * links of the previous and next elements in the linked list * prev==null => this was the element pointed by the head(ie, first element). \*/ static void clear_list_element(int index){ ga_armcihdl_t *listele,*prev,*next; if(DEBUG){ printf("\n%ld:clearing handle %d\n",(long)GAme,index);fflush(stdout); } listele = &(list_element_array[index]); /*first wait for the armci handle */ ARMCI_Wait(listele->handle); /*set prev and next links of my prev element and my next element*/ prev=listele->previous; next = listele->next; if(prev) prev->next = next; else ga_ihdl_array[listele->ga_hdlarr_index].ahandle=next; if(next) next->previous = prev; /*since one element from the linked list is completed, update the count*/ ga_ihdl_array[listele->ga_hdlarr_index].count--; /*reset the prev and next pointers and initialize the handle*/ listele->next=NULL; listele->previous=NULL; ARMCI_INIT_HANDLE(listele->handle); list_ele_avail[index]=1; } /*\ Get the next available list element from the list element array, if * nothing is available, free element with index nextLEAelement \*/ ga_armcihdl_t* get_armcihdl(){ int i; ga_armcihdl_t *ret_handle; /*first see if an element from the list_ele_arr is already available */ for(i=0;inext; clear_list_element(first->index); first=next; } /*reset the head of the list for reuse*/ ga_ihdl_array[elementtofree].count=0; ga_ihdl_array[elementtofree].ga_nbtag=0; ga_ihdl_array[elementtofree].ahandle=NULL; ihdl_array_avail[elementtofree]=1; } /*\ Add the armci handle list element to the end of the list. \*/ static void add_armcihdl_to_list(ga_armcihdl_t *listelement, int headindex){ ga_armcihdl_t *first=ga_ihdl_array[headindex].ahandle; ga_ihdl_array[headindex].count++; listelement->ga_hdlarr_index = headindex; if(ga_ihdl_array[headindex].ahandle==NULL){ ga_ihdl_array[headindex].ahandle=listelement; listelement->previous= NULL; return; } while(first->next!=NULL){ first=first->next; } first->next=listelement; listelement->previous=first; } /*\ Complete the list of armci handles associated with a particular GA request. * specific=-1 means free the next available one. other values complete the * armci handle list pointed to by head at that "specific" element. \*/ static int get_GAnbhdl_element(int specific){ int elementtofree,i; if(specific!=-1)elementtofree=specific; else { for(i=0;iihdl_index == (NUM_HDLS+1)){ inbhandle->ihdl_index = get_GAnbhdl_element(-1); inbhandle->ga_nbtag = get_next_tag(); ga_ihdl_array[(inbhandle->ihdl_index)].ga_nbtag=inbhandle->ga_nbtag; } ret_handle = get_armcihdl(); add_armcihdl_to_list(ret_handle,inbhandle->ihdl_index); return(ret_handle->handle); } /*\ the wait routine which is called inside nga_nbwait and ga_nbwait \*/ int nga_wait_internal(Integer *nbhandle){ gai_nbhdl_t *inbhandle = (gai_nbhdl_t *)nbhandle; int retval = 0; if(inbhandle->ihdl_index==(NUM_HDLS+1))retval=0; else if(inbhandle->ga_nbtag !=ga_ihdl_array[inbhandle->ihdl_index].ga_nbtag) retval=0; else free_armci_handle_list(inbhandle->ihdl_index); return(retval); } static int test_list_element(int index){ ga_armcihdl_t *listele; if(DEBUG){ printf("\n%ld:clearing handle %d\n",(long)GAme,index);fflush(stdout); } listele = &(list_element_array[index]); return (ARMCI_Test(listele->handle)); } static int test_armci_handle_list(int elementtofree){ ga_armcihdl_t *first = ga_ihdl_array[elementtofree].ahandle,*next; int done = 1; /*call clear_list_element for every element in the list*/ while(first!=NULL){ next=first->next; if (test_list_element(first->index) == 0) { done = 0; break; } first=next; } return (done); } /*\ the test routine which is called inside nga_nbtest \*/ int nga_test_internal(Integer *nbhandle){ gai_nbhdl_t *inbhandle = (gai_nbhdl_t *)nbhandle; int retval = 0; if(inbhandle->ihdl_index==(NUM_HDLS+1))retval=0; else if(inbhandle->ga_nbtag !=ga_ihdl_array[inbhandle->ihdl_index].ga_nbtag) retval=0; else return (test_armci_handle_list(inbhandle->ihdl_index)); return(retval); } /*\ unlike in ARMCI, user doesnt have to initialize handle in GA. * it is done by the get/put call instead. \*/ void ga_init_nbhandle(Integer *nbhandle) { gai_nbhdl_t *inbhandle = (gai_nbhdl_t *)nbhandle; inbhandle->ihdl_index=(NUM_HDLS+1); } ga-5-4/global/src/ga_dgemmf.F0000644000175000017500000002137412662210457014110 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif #define xx_dgemm dgemm subroutine ga_dgemm(transa, transb, m, n, k, alpha, g_a, $ g_b, beta, g_c) C$Id: ga_dgemm.F,v 1.29 2000/11/04 01:46:31 d3h325 Exp $ implicit none Character*1 transa, transb Integer m, n, k Double precision alpha, beta Integer g_a, g_b, g_c #include "mafdecls.fh" #include "global.fh" c c GA_DGEMM performs one of the matrix-matrix operations: c C := alpha*op( A )*op( B ) + beta*C, c where op( X ) is one of c op( X ) = X or op( X ) = X`, c c alpha and beta are scalars, and A, B and C are matrices, with op( A ) c an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. c c On entry, TRANSA specifies the form of op( A ) to be used in c the matrix multiplication as follows: c transa = 'N' or 'n', op( A ) = A. c transa = 'T' or 't', op( A ) = A`. c c M - On entry, M specifies the number of rows of the matrix c op( A ) and of the matrix C. M must be at least zero. c N - On entry, N specifies the number of columns of the matrix c op( B ) and the number of columns of the matrix C. N must be c at least zero. c K - On entry, K specifies the number of columns of the matrix c op( A ) and the number of rows of the matrix op( B ). K must c be at least zero. c integer ilo, ihi, jlo, jhi, klo, khi, ichunk, jchunk, kchunk integer idim, jdim, kdim, adim, bdim, cdim, ijk, me, nproc integer l_a, k_a, l_b, k_b logical status C Logical Get_New_B ! Allow reuse of B patch when possible C Double Precision Chunk_cube Integer Min_Tasks, Max_Chunk, Mem_Avail integer l_mxn,k_mxn,i0,i1,j0,j1,ldc,adrc integer an1, an2, bn1, bn2, cn1, cn2 integer ilor, ihir,jlor,jhir,klor,khir,itipo,ijmax double precision t0,t1,gflop external MPI_Wtime double precision MPI_Wtime Parameter ( Min_Tasks = 10) ! Minimum acceptable tasks per node c C Set defaults -- platform dependent #ifdef GATIME t0=MPI_Wtime() #endif ichunk = 512 jchunk = 512 kchunk = 512 C me = ga_nodeid() nproc = ga_nnodes() c if(me.eq.0) c W write(6,*) ' transa, transb ', transa, transb C C Make an estimate of how large patches can be and still insure C enough tasks per processor that loads will be reasonably balanced. C C Patches per dimension are M/chunk, N/chunk, K/chunk so total tasks C is roughly (K*M*N)/(chunk**3). Assume all chunk sizes are the C same and solve for the one that provides the minimum acceptable C number of tasks. C C Find out how much memory we can grab. It will be used in C three chunks, and the result includes only the first one. C Mem_Avail = MA_Inquire_Avail( MT_DBL ) $ - 2 * MA_SizeOf_Overhead( MT_DBL ) Mem_Avail = 0.9 * Mem_Avail ! Do not use every last drop! c Call GA_IGOp(42, Mem_Avail, 1, 'min') C c if (beta .eq. 0.0d0) then call ga_zero(g_c) else call ga_scale(g_c, beta) endif c call ga_distribution(g_c, . ga_nodeid(), i0, i1, j0, j1) call ga_inquire(g_a, . itipo, an1, an2) call ga_inquire(g_b, . itipo, bn1, bn2) call ga_inquire(g_c, . itipo, cn1, cn2) if (i0.gt.0 .and. i0.le.i1) then ilo=i0 ihi=i1 idim = ihi - ilo + 1 jlo=j0 jhi=j1 jdim = jhi - jlo + 1 #if 0 write(6,'(I4,A,4I6)') ga_nodeid(),' IJ ',i0,i1,j0,j1 if(ga_nodeid().eq.0) call ffflush(6) if(ga_nodeid().eq.0) call ffflush(0) #endif ijmax=max(idim,jdim) KChunk = Int((DBLE(Mem_Avail/(2*ijmax)))) kchunk=min(kchunk,ijmax) status = .true. status = ma_push_get(MT_DBL, idim*kchunk, 'ga_dgemm:a', l_a,k_a) $ .and. status status = ma_push_get(MT_DBL, kchunk*jdim, 'ga_dgemm:b', l_b,k_b) $ .and. status if (.not. status) call ga_error('ga_dgemm: insufficent memory?', A idim*kchunk+kchunk*jdim) call ga_access(g_c, i0, i1, j0, j1, adrc, ldc) ijk = 0 do klo = 1, k, kchunk khi = min(k, klo+kchunk-1) kdim = khi - klo + 1 C C Each pass through the outer two loops means we need a C different patch of B. C Get_New_B = .TRUE. C cdim = idim if (transa.eq.'n' .or. transa.eq.'N') then ilor=min(an1,ilo) ihir=min(an1,ihi) klor=min(an2,klo) khir=min(an2,khi) kdim=khir-klor+1 idim=ihir-ilor+1 adim = idim cdim = idim call ga_get(g_a, ilor, ihir, klor, khir, $ dbl_mb(k_a), adim) else klor=min(an1,klo) khir=min(an1,khi) ilor=min(an2,ilo) ihir=min(an2,ihi) kdim=khir-klor+1 idim=ihir-ilor+1 adim = kdim cdim=idim call ga_get(g_a, klor, khir, ilor, ihir, $ dbl_mb(k_a), adim) endif C C Avoid rereading B if it is the same patch as last time. C If ( Get_New_B ) then if (transb.eq.'n' .or. transb.eq.'N') then klor=min(bn1,klo) khir=min(bn1,khi) jlor=min(bn2,jlo) jhir=min(bn2,jhi) kdim=khir-klor+1 idim=ihir-ilor+1 bdim = kdim call ga_get(g_b, klor, khir, jlor, jhir, $ dbl_mb(k_b), bdim) else jlor=min(bn1,jlo) jhir=min(bn1,jhi) klor=min(bn2,klo) khir=min(bn2,khi) kdim=khir-klor+1 jdim=jhir-jlor+1 bdim = jdim call ga_get(g_b, jlor, jhir, klor, khir, $ dbl_mb(k_b), bdim) endif Get_New_B = .FALSE. ! Until J or K change again EndIf C call xx_dgemm(transa, transb, idim, jdim, kdim, $ alpha, dbl_mb(k_a), adim, dbl_mb(k_b), bdim, $ 1.0d0, dbl_mb(adrc), cdim) enddo status = ma_chop_stack(l_a) if (.not. status)call ga_error('ga_dgemm: pop of stack failed', 1) endif call ga_release_update(g_c, i0, i1, j0, j1) call ga_sync() #ifdef GATIME if(ga_nodeid().eq.0) then call ffflush(6) t1=MPI_Wtime()-t0 gflop=2d0*n*m*k/(t1*1d9) write(6,'(I4,A,3F14.6)') G ga_nodeid(),' dgemm done in ',t1, , gflop,gflop/ga_nnodes() endif #endif c end subroutine lga_acc(out, dim1,dim2, I ilo, ihi, jlo, jhi, buf, $ ld, alpha) implicit none integer dim1,dim2 integer ilo, ihi, jlo, jhi,ld integer i,j double precision alpha double precision out(1:dim1,1:dim2) double precision buf(1:ld, 1:*) do j=jlo,jhi do i=ilo,ihi out(i, j) = out(i, j) + + alpha*buf(i-ilo+1, j-jlo+1) enddo enddo return end subroutine lga_accbrd(g_c,m,n,out) implicit none #include "global.fh" #include "mafdecls.fh" integer m,n double precision out(1:m,1:n) integer g_c c integer ilo,ihi,jlo,jhi,numi,numj,k_in,l_in,i,j logical status c call ga_distribution(g_c, . ga_nodeid(), ilo, ihi, jlo, jhi) if (ilo.gt.0 .and. ilo.le.ihi) then numi = ihi-ilo+1 numj = jhi-jlo+1 if (numi.gt.0 .and. numj.gt.0) then if (.not.MA_Push_Get(MT_Dbl,numi*numj,'MxN',l_in,k_in)) & call ga_error('dft_scf: cannot allocate eval',0) call ga_get(g_c,ilo,ihi,jlo,jhi, . dbl_mb(k_in),numi) do j=jlo,jhi do i=ilo,ihi call daxpy(numi,1d0,dbl_mb(k_in+(j-jlo)*numi),1, 1 out,1) enddo enddo call ga_put(g_c,ilo,ihi,jlo,jhi, . out(ilo,jlo),m) status = ma_pop_stack(l_in) if (.not. status)call ga_error('gad: pop of stack failed', 3 numi*numj) endif endif return end ga-5-4/global/src/ga.h0000644000175000017500000007720212662210457012634 0ustar mbamba/* $Id: ga.h,v 1.60.2.8 2007-10-10 21:11:04 manoj Exp $ */ #ifndef _GA_H_ #define _GA_H_ #include #include #include "gacommon.h" #include "typesf2c.h" #ifdef __cplusplus extern "C" { #endif typedef Integer ga_nbhdl_t; extern void GA_Abs_value(int g_a); extern void GA_Abs_value_patch(int g_a, int *lo, int *hi); extern void GA_Add_constant(int g_a, void* alpha); extern void GA_Add_constant_patch(int g,int *lo,int *hi,void *alpha); extern void GA_Add_diagonal(int g_a, int g_v); extern void GA_Add(void *alpha, int g_a, void* beta, int g_b, int g_c); extern int GA_Allocate(int g_a); extern int GA_Assemble_duplicate(int g_a, char *name, void *ptr); extern void GA_Brdcst(void *buf, int lenbuf, int root); extern SingleComplex GA_Cdot(int g_a, int g_b); extern void GA_Cgop(SingleComplex x[], int n, char *op); extern void GA_Cgemm(char ta, char tb, int m, int n, int k, SingleComplex alpha, int g_a, int g_b, SingleComplex beta, int g_c ); extern void GA_Check_handle(int g_a, char *string); extern int GA_Cluster_nnodes(void); extern int GA_Cluster_nodeid(void); extern int GA_Cluster_nprocs(int x); extern int GA_Cluster_procid(int x, int y); extern int GA_Cluster_proc_nodeid(int proc); extern int GA_Compare_distr(int g_a, int g_b); extern void GA_Copy(int g_a, int g_b); extern int GA_Create_handle(void); extern int GA_Create_mutexes(int number); extern double GA_Ddot(int g_a, int g_b); extern void GA_Destroy(int g_a); extern int GA_Destroy_mutexes(void); extern void GA_Dgemm(char ta, char tb, int m, int n, int k, double alpha, int g_a, int g_b, double beta, int g_c ); extern void GA_Dgop(double x[], int n, char *op); extern void GA_Diag(int g_a, int g_s, int g_v, void *eval); extern void GA_Diag_reuse(int reuse, int g_a, int g_s, int g_v, void *eval); extern void GA_Diag_seq(int g_a, int g_s, int g_v, void *eval); extern void GA_Diag_std(int g_a, int g_v, void *eval); extern void GA_Diag_std_seq(int g_a, int g_v, void *eval); extern int GA_Duplicate(int g_a, char* array_name); extern void GA_Elem_divide(int g_a, int g_b, int g_c); extern void GA_Elem_divide_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi); extern void GA_Elem_maximum(int g_a, int g_b, int g_c); extern void GA_Elem_maximum_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi); extern void GA_Elem_minimum(int g_a, int g_b, int g_c); extern void GA_Elem_minimum_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi); extern void GA_Elem_multiply(int g_a, int g_b, int g_c); extern void GA_Elem_multiply_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi); extern void GA_Error(char *str, int code); extern float GA_Fdot(int g_a, int g_b); extern void GA_Fence(void); extern void GA_Fgop(float x[], int n, char *op); extern void GA_Fill(int g_a, void *value); extern void GA_Freemem(void* ptr); extern void GA_Get_block_info(int g_a, int num_blocks[], int block_dims[]); extern int GA_Get_debug(void); extern void GA_Get_diag(int g_a, int g_v); extern int GA_Get_dimension(int g_a); extern void* GA_Getmem(int type, int nelem, int grp_id); extern int GA_Get_pgroup(int g_a); extern int GA_Get_pgroup_size(int grp_id); extern void GA_Get_proc_grid(int g_a, int dims[]); extern void GA_Get_proc_index(int g_a, int iproc, int subscript[]); extern void GA_Gop(int type, void *x, int n, char *op); extern int GA_Has_ghosts(int g_a); extern int GA_Idot(int g_a, int g_b); extern void GA_Igop(int x[], int n, char *op); extern void GA_Init_fence(void); extern void GA_Initialize_args(int *argc, char ***argv); extern void GA_Initialize_ltd(size_t limit); extern void GA_Initialize(void); extern size_t GA_Inquire_memory(void); extern char* GA_Inquire_name(int g_a); extern int GA_Is_mirrored(int g_a); extern void GA_List_nodeid(int *list, int nprocs); extern long GA_Ldot(int g_a, int g_b); extern void GA_Lgop(long x[], int n, char *op); extern long long GA_Lldot(int g_a, int g_b); extern void GA_Llgop(long long x[], int n, char *op); extern int GA_Llt_solve(int g_a, int g_b); extern void GA_Lock(int mutex); extern void GA_Lu_solve(char tran, int g_a, int g_b); extern void GA_Mask_sync(int first, int last); extern void GA_Matmul_patch(char transa, char transb, void* alpha, void *beta, int g_a, int ailo, int aihi, int ajlo, int ajhi, int g_b, int bilo, int bihi, int bjlo, int bjhi, int g_c, int cilo, int cihi, int cjlo, int cjhi); extern void GA_Median(int g_a, int g_b, int g_c, int g_m); extern void GA_Median_patch(int g_a, int *alo, int *ahi, int g_b, int *blo, int *bhi, int g_c, int *clo, int *chi, int g_m, int *mlo, int *mhi); extern size_t GA_Memory_avail(void); extern int GA_Memory_limited(void); extern void GA_Merge_mirrored(int g_a); extern void GA_Nblock(int g_a, int *nblock); extern int GA_Ndim(int g_a); extern int GA_Nnodes(void); extern int GA_Nodeid(void); extern void GA_Norm1(int g_a, double *nm); extern void GA_Norm_infinity(int g_a, double *nm); extern int GA_Pgroup_absolute_id(int pgroup, int pid); extern void GA_Pgroup_brdcst(int grp, void *buf, int lenbuf, int root); extern void GA_Pgroup_cgop(int grp, SingleComplex x[], int n, char *op); extern int GA_Pgroup_create(int *list, int count); extern int GA_Pgroup_destroy(int grp); extern void GA_Pgroup_dgop(int grp, double x[], int n, char *op); extern void GA_Pgroup_fgop(int grp, float x[], int n, char *op); extern int GA_Pgroup_get_default(void); extern int GA_Pgroup_get_mirror(void); extern int GA_Pgroup_get_world(void); extern void GA_Pgroup_igop(int grp, int x[], int n, char *op); extern void GA_Pgroup_lgop(int grp, long x[], int n, char *op); extern void GA_Pgroup_llgop(int grp, long long x[], int n, char *op); extern int GA_Pgroup_nnodes(int grp_id); extern int GA_Pgroup_nodeid(int grp_id); extern void GA_Pgroup_set_default(int p_handle); extern int GA_Pgroup_split(int grp_id, int num_group); extern int GA_Pgroup_split_irreg(int grp_id, int color); extern void GA_Pgroup_sync(int grp_id); extern void GA_Pgroup_zgop(int grp, DoubleComplex x[], int n, char *op); extern void GA_Print_distribution(int g_a); extern void GA_Print_file(FILE *file, int g_a); extern void GA_Print(int g_a); extern void GA_Print_patch(int g_a,int ilo,int ihi,int jlo,int jhi,int pretty); extern void GA_Print_stats(void); extern void GA_Randomize(int g_a, void *value); extern void GA_Recip(int g_a); extern void GA_Recip_patch(int g_a,int *lo, int *hi); extern void GA_Register_stack_memory(void * (*ext_alloc)(size_t, int, char *), void (*ext_free)(void *)); extern void GA_Scale_cols(int g_a, int g_v); extern void GA_Scale(int g_a, void *value); extern void GA_Scale_rows(int g_a, int g_v); extern void GA_Scan_add(int g_a, int g_b, int g_sbit, int lo, int hi, int excl); extern void GA_Scan_copy(int g_a, int g_b, int g_sbit, int lo, int hi); extern void GA_Set_array_name(int g_a, char *name); extern void GA_Set_block_cyclic(int g_a, int dims[]); extern void GA_Set_block_cyclic_proc_grid(int g_a, int block[], int proc_grid[]); extern void GA_Set_chunk(int g_a, int chunk[]); extern void GA_Set_data(int g_a, int ndim, int dims[], int type); extern void GA_Set_debug(int flag); extern void GA_Set_diagonal(int g_a, int g_v); extern void GA_Set_ghost_corner_flag(int g_a, int flag); extern void GA_Set_ghosts(int g_a, int width[]); extern void GA_Set_irreg_distr(int g_a, int map[], int block[]); extern void GA_Set_irreg_flag(int g_a, int flag); extern void GA_Set_memory_limit(size_t limit); extern void GA_Set_pgroup(int g_a, int p_handle); extern void GA_Set_restricted(int g_a, int list[], int size); extern void GA_Set_restricted_range(int g_a, int lo_proc, int hi_proc); extern void GA_Sgemm(char ta, char tb, int m, int n, int k, float alpha, int g_a, int g_b, float beta, int g_c ); extern void GA_Shift_diagonal(int g_a, void *c); extern int GA_Solve(int g_a, int g_b); extern int GA_Spd_invert(int g_a); extern void GA_Step_bound_info(int g_xx, int g_vv, int g_xxll, int g_xxuu, void *boundmin, void *wolfemin, void *boundmax); extern void GA_Step_bound_info_patch(int g_xx, int *xxlo, int *xxhi, int g_vv, int *vvlo, int *vvhi, int g_xxll, int *xxlllo, int *xxllhi, int g_xxuu, int *xxuulo, int *xxuuhi, void *boundmin, void *wolfemin, void *boundmax); extern void GA_Step_max(int g_a, int g_b, void *step); extern void GA_Step_max_patch(int g_a, int *alo, int *ahi, int g_b, int *blo, int *bhi, void *step); extern void GA_Summarize(int verbose); extern void GA_Symmetrize(int g_a); extern void GA_Sync(void); extern void GA_Terminate(void); extern int GA_Total_blocks(int g_a); extern void GA_Transpose(int g_a, int g_b); extern void GA_Unlock(int mutex); extern void GA_Update_ghosts(int g_a); extern int GA_Uses_fapi(void); extern int GA_Uses_ma(void); extern int GA_Uses_proc_grid(int g_a); extern int GA_Valid_handle(int g_a); extern int GA_Verify_handle(int g_a); extern double GA_Wtime(void); extern DoubleComplex GA_Zdot(int g_a, int g_b); extern void GA_Zgop(DoubleComplex x[], int n, char *op); extern void GA_Zero_diagonal(int g_a); extern void GA_Zero(int g_a); extern void GA_Zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, int g_a, int g_b, DoubleComplex beta, int g_c ); extern void NGA_Access_block_grid(int g_a, int index[], void *ptr, int ld[]); extern void NGA_Access_block(int g_a, int idx, void *ptr, int ld[]); extern void NGA_Access_block_segment(int g_a, int proc, void *ptr, int *len); extern void NGA_Access_ghost_element(int g_a, void *ptr, int subscript[], int ld[]); extern void NGA_Access_ghosts(int g_a, int dims[], void *ptr, int ld[]); extern void NGA_Access(int g_a, int lo[], int hi[], void *ptr, int ld[]); extern void NGA_Acc(int g_a, int lo[], int hi[],void* buf,int ld[],void* alpha); extern void NGA_Add_patch(void * alpha, int g_a, int alo[], int ahi[], void * beta, int g_b, int blo[], int bhi[], int g_c, int clo[], int chi[]); extern int NGA_Allocate(int g_a); extern void NGA_Alloc_gatscat_buf(int nelems); extern SingleComplex NGA_Cdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern int NGA_Compare_distr(int g_a, int g_b); extern void NGA_Copy_patch(char trans, int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[]); extern int NGA_Create_config(int type,int ndim,int dims[], char *name, int chunk[], int p_handle); extern int NGA_Create_ghosts_config(int type,int ndim,int dims[], int width[], char *name, int chunk[], int p_handle); extern int NGA_Create_ghosts(int type,int ndim,int dims[], int width[], char *name, int chunk[]); extern int NGA_Create_ghosts_irreg_config(int type,int ndim,int dims[], int width[], char *name, int nblock[], int map[], int p_handle); extern int NGA_Create_ghosts_irreg(int type,int ndim,int dims[], int width[], char *name, int nblock[], int map[]); extern int NGA_Create(int type,int ndim,int dims[], char *name, int chunk[]); extern int NGA_Create(int type,int ndim,int dims[], char *name, int chunk[]); extern int NGA_Create_irreg_config(int type,int ndim,int dims[],char *name, int block[], int map[], int p_handle); extern int NGA_Create_irreg(int type,int ndim,int dims[],char *name, int block[], int map[]); extern int NGA_Create_handle(void); extern int NGA_Deregister_type(int type); extern void NGA_Destroy(int g_a); extern int NGA_Destroy_mutexes(void); extern double NGA_Ddot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern void NGA_Dgop(double x[], int n, char *op); extern void NGA_Distribution(int g_a, int iproc, int lo[], int hi[]); extern int NGA_Duplicate(int g_a, char* array_name); extern void NGA_Error(char *str, int code); extern float NGA_Fdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern void NGA_Fence(void); extern void NGA_Free_gatscat_buf(); extern void NGA_Fill(int g_a, void *value); extern void NGA_Fill_patch(int g_a, int lo[], int hi[], void *val); extern void NGA_Gather(int g_a, void *v, int* subsArray[], int n); extern void NGA_Gather_flat(int g_a, void *v, int subsArray[], int n); extern void NGA_Get(int g_a, int lo[], int hi[], void* buf, int ld[]); extern void NGA_Get_block_info(int g_a, int num_blocks[], int block_dims[]); extern int NGA_Get_debug(void); extern int NGA_Get_dimension(int g_a); extern void NGA_Get_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld); extern void NGA_Get_ghost_block(int g_a, int lo[], int hi[], void *buf, int ld[]); extern int NGA_Get_pgroup(int g_a); extern int NGA_Get_pgroup_size(int grp_id); extern void NGA_Get_proc_grid(int g_a, int dims[]); extern void NGA_Get_proc_index(int g_a, int iproc, int subscript[]); extern int NGA_Has_ghosts(int g_a); extern int NGA_Idot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern void NGA_Igop(int x[], int n, char *op); extern void NGA_Init_fence(void); extern void NGA_Initialize(void); extern void NGA_Initialize_ltd(size_t limit); extern void NGA_Inquire(int g_a, int *type, int *ndim, int dims[]); extern size_t NGA_Inquire_memory(void); extern char* NGA_Inquire_name(int g_a); extern int NGA_Is_mirrored(int g_a); extern void NGA_List_nodeid(int *list, int nprocs); extern long NGA_Ldot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern long long NGA_Lldot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern int NGA_Locate(int g_a, int subscript[]); extern int NGA_Locate_num_blocks(int g_a, int lo[], int hi[]); extern int NGA_Locate_nnodes(int g_a, int lo[], int hi[]); extern int NGA_Locate_region(int g_a,int lo[],int hi[],int map[],int procs[]); extern void NGA_Lock(int mutex); extern void NGA_Mask_sync(int first, int last); extern void NGA_Matmul_patch(char transa, char transb, void* alpha, void *beta, int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[], int g_c, int clo[], int chi[]) ; extern size_t NGA_Memory_avail(void); extern int NGA_Memory_limited(void); extern void NGA_Merge_distr_patch(int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[]); extern void NGA_Merge_mirrored(int g_a); extern void NGA_Nblock(int g_a, int *nblock); extern void NGA_NbAcc(int g_a,int lo[], int hi[],void* buf,int ld[],void* alpha, ga_nbhdl_t* nbhandle); extern void NGA_NbGet_ghost_dir(int g_a, int mask[], ga_nbhdl_t* handle); extern void NGA_NbGet(int g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle); extern void NGA_Nbget_field(int g_a, int *lo, int *hi, int foff, int fsize,void *buf, int *ld, ga_nbhdl_t *nbhandle); extern void NGA_Nbput_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld, ga_nbhdl_t *nbhandle); extern void NGA_NbPut(int g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle); extern int NGA_NbTest(ga_nbhdl_t* nbhandle); extern void NGA_NbWait(ga_nbhdl_t* nbhandle); extern int NGA_Ndim(int g_a); extern int NGA_Nnodes(void); extern int NGA_Nodeid(void); extern void NGA_Periodic_acc(int g_a, int lo[], int hi[],void* buf,int ld[],void* alpha); extern void NGA_Periodic_get(int g_a, int lo[], int hi[], void* buf, int ld[]); extern void NGA_Periodic_put(int g_a, int lo[], int hi[], void* buf, int ld[]); extern int NGA_Pgroup_absolute_id(int pgroup, int pid); extern int NGA_Pgroup_create(int *list, int count); extern int NGA_Pgroup_destroy(int grp); extern int NGA_Pgroup_get_default(void); extern int NGA_Pgroup_get_mirror(void); extern int NGA_Pgroup_get_world(void); extern int NGA_Pgroup_nnodes(int grp_id); extern int NGA_Pgroup_nodeid(int grp_id); extern void NGA_Pgroup_set_default(int p_handle); extern int NGA_Pgroup_split(int grp_id, int num_group); extern int NGA_Pgroup_split_irreg(int grp_id, int color); extern void NGA_Pgroup_sync(int grp_id); extern void NGA_Print_patch(int g_a, int lo[], int hi[], int pretty); extern void NGA_Proc_topology(int g_a, int proc, int coord[]); extern void NGA_Put(int g_a, int lo[], int hi[], void* buf, int ld[]); extern void NGA_Put_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld); extern void NGA_Randomize(int g_a, void *value); extern long NGA_Read_inc(int g_a, int subscript[], long inc); extern int NGA_Register_type(size_t bytes); extern void NGA_Release_block_grid(int g_a, int index[]); extern void NGA_Release_block(int g_a, int idx); extern void NGA_Release_block_segment(int g_a, int idx); extern void NGA_Release_ghost_element(int g_a, int index[]); extern void NGA_Release_ghosts(int g_a); extern void NGA_Release(int g_a, int lo[], int hi[]); extern void NGA_Release_update_block_grid(int g_a, int index[]); extern void NGA_Release_update_block(int g_a, int idx); extern void NGA_Release_update_block_segment(int g_a, int idx); extern void NGA_Release_update_ghost_element(int g_a, int index[]); extern void NGA_Release_update_ghosts(int g_a); extern void NGA_Release_update(int g_a, int lo[], int hi[]); extern void NGA_Scale_patch(int g_a, int lo[], int hi[], void *alpha); extern void NGA_Scatter_acc(int g_a, void *v, int* subsArray[], int n, void *alpha); extern void NGA_Scatter_acc_flat(int g_a, void *v, int subsArray[], int n, void *alpha); extern void NGA_Scatter(int g_a, void *v, int* subsArray[], int n); extern void NGA_Scatter_flat(int g_a, void *v, int subsArray[], int n); extern void NGA_Select_elem(int g_a, char* op, void* val, int *index); extern void NGA_Set_array_name(int g_a, char *name); extern void NGA_Set_block_cyclic(int g_a, int dims[]); extern void NGA_Set_block_cyclic_proc_grid(int g_a, int block[], int proc_grid[]); extern void NGA_Set_chunk(int g_a, int chunk[]); extern void NGA_Set_data(int g_a, int ndim, int dims[], int type); extern void NGA_Set_debug(int flag); extern void NGA_Set_ghosts(int g_a, int width[]); extern void NGA_Set_irreg_distr(int g_a, int map[], int block[]); extern void NGA_Set_irreg_flag(int g_a, int flag); extern void NGA_Set_memory_limit(size_t limit); extern void NGA_Set_pgroup(int g_a, int p_handle); extern void NGA_Set_restricted(int g_a, int list[], int size); extern void NGA_Set_restricted_range(int g_a, int lo_proc, int hi_proc); extern void NGA_Strided_acc(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[], void *alpha); extern void NGA_Strided_get(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[]); extern void NGA_Strided_put(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[]); extern void NGA_Sync(void); extern void NGA_Terminate(void); extern int NGA_Total_blocks(int g_a); extern void NGA_Unlock(int mutex); extern void NGA_Update_ghosts(int g_a); extern int NGA_Update_ghost_dir(int g_a, int dimension, int idir, int flag); extern void NGA_Update_ghosts_nb(int g_a, ga_nbhdl_t *nbhandle); extern int NGA_Uses_ma(void); extern int NGA_Uses_proc_grid(int g_a); extern int NGA_Valid_handle(int g_a); extern int NGA_Verify_handle(int g_a); extern double NGA_Wtime(void); extern DoubleComplex NGA_Zdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]); extern void NGA_Zero(int g_a); extern void NGA_Zero_patch(int g_a, int lo[], int hi[]); /* 64 bit APIs */ extern void GA_Abs_value_patch64(int g_a, int64_t *lo, int64_t *hi); extern void GA_Add_constant_patch64(int g,int64_t *lo,int64_t *hi,void *alpha); extern void GA_Cgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, SingleComplex alpha, int g_a, int g_b, SingleComplex beta, int g_c ); extern void GA_Dgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, double alpha, int g_a, int g_b, double beta, int g_c ); extern void GA_Elem_divide_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]); extern void GA_Elem_maximum_patch64(int g_a,int64_t *alo,int64_t *ahi, int g_b,int64_t *blo,int64_t *bhi, int g_c,int64_t *clo,int64_t *chi); extern void GA_Elem_minimum_patch64(int g_a,int64_t *alo,int64_t *ahi, int g_b,int64_t *blo,int64_t *bhi, int g_c,int64_t *clo,int64_t *chi); extern void GA_Elem_multiply_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]); extern void GA_Matmul_patch64(char transa, char transb, void* alpha, void *beta, int g_a, int64_t ailo, int64_t aihi, int64_t ajlo, int64_t ajhi, int g_b, int64_t bilo, int64_t bihi, int64_t bjlo, int64_t bjhi, int g_c, int64_t cilo, int64_t cihi, int64_t cjlo, int64_t cjhi); extern void GA_Median_patch64(int g_a, int64_t *alo, int64_t *ahi, int g_b, int64_t *blo, int64_t *bhi, int g_c, int64_t *clo, int64_t *chi, int g_m, int64_t *mlo, int64_t *mhi); extern void GA_Pack64(int g_src, int g_dest, int g_mask, int64_t lo, int64_t hi, int64_t *icount); extern void GA_Pack(int g_src, int g_dest, int g_mask, int lo, int hi, int *icount); extern void GA_Patch_enum64(int g_a, int64_t lo, int64_t hi, void *start, void *inc); extern void GA_Patch_enum(int g_a, int lo, int hi, void *start, void *inc); extern void GA_Recip_patch64(int g_a,int64_t *lo, int64_t *hi); extern void GA_Scan_add64(int g_a, int g_b, int g_sbit, int64_t lo, int64_t hi, int excl); extern void GA_Scan_copy64(int g_a, int g_b, int g_sbit, int64_t lo, int64_t hi); extern void GA_Set_chunk64(int g_a, int64_t chunk[]); extern void GA_Set_data64(int g_a, int ndim, int64_t dims[], int type); extern void GA_Set_ghosts64(int g_a, int64_t width[]); extern void GA_Set_irreg_distr64(int g_a, int64_t map[], int64_t block[]); extern void GA_Sgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, float alpha, int g_a, int g_b, float beta, int g_c ); extern void GA_Step_bound_info_patch64(int g_xx, int64_t xxlo[], int64_t xxhi[], int g_vv, int64_t vvlo[], int64_t vvhi[], int g_xxll, int64_t xxlllo[], int64_t xxllhi[], int64_t g_xxuu, int64_t xxuulo[], int64_t xxuuhi[], void *boundmin, void *wolfemin, void *boundmax); extern void GA_Step_max_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], void *step); extern void GA_Unpack64(int g_src, int g_dest, int g_mask, int64_t lo, int64_t hi, int64_t *icount); extern void GA_Unpack(int g_src, int g_dest, int g_mask, int lo, int hi, int *icount); extern void GA_Zgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, DoubleComplex alpha, int g_a, int g_b, DoubleComplex beta, int g_c ); extern void NGA_Acc64(int g_a, int64_t lo[], int64_t hi[],void* buf,int64_t ld[],void* alpha); extern void NGA_Access64(int g_a, int64_t lo[], int64_t hi[], void *ptr, int64_t ld[]); extern void NGA_Access_block64(int g_a, int64_t idx, void *ptr, int64_t ld[]); extern void NGA_Access_block_grid64(int g_a, int64_t index[], void *ptr, int64_t ld[]); extern void NGA_Access_block_segment64(int g_a, int proc, void *ptr, int64_t *len); extern void NGA_Access_ghost_element64(int g_a, void *ptr, int64_t subscript[], int64_t ld[]); extern void NGA_Access_ghosts64(int g_a, int64_t dims[], void *ptr, int64_t ld[]); extern void NGA_Add_patch64(void * alpha, int g_a, int64_t alo[], int64_t ahi[], void * beta, int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]); extern SingleComplex NGA_Cdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern void NGA_Copy_patch64(char trans, int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[]); extern int NGA_Create64(int type,int ndim,int64_t dims[], char *name, int64_t chunk[]); extern int NGA_Create_config64(int type,int ndim,int64_t dims[], char *name, int64_t chunk[], int p_handle); extern int NGA_Create_ghosts64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t chunk[]); extern int NGA_Create_ghosts_config64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t chunk[], int p_handle); extern int NGA_Create_ghosts_irreg64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t nblock[], int64_t map[]); extern int NGA_Create_ghosts_irreg_config64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t nblock[], int64_t map[], int p_handle); extern int NGA_Create_irreg64(int type,int ndim,int64_t dims[],char *name, int64_t block[], int64_t map[]); extern int NGA_Create_irreg_config64(int type,int ndim,int64_t dims[],char *name, int64_t block[], int64_t map[], int p_handle); extern double NGA_Ddot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern void NGA_Distribution64(int g_a, int iproc, int64_t lo[], int64_t hi[]); extern float NGA_Fdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern void NGA_Fill_patch64(int g_a, int64_t lo[], int64_t hi[], void *val); extern void NGA_Gather64(int g_a, void *v, int64_t* subsArray[], int64_t n); extern void NGA_Gather_flat64(int g_a, void *v, int64_t subsArray[], int64_t n); extern void NGA_Get64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]); extern void NGA_Get_ghost_block64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]); extern int NGA_Idot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern void NGA_Inquire64(int g_a, int *type, int *ndim, int64_t dims[]); extern long NGA_Ldot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern long long NGA_Lldot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern int NGA_Locate64(int g_a, int64_t subscript[]); extern int NGA_Locate_nnodes64(int g_a, int64_t lo[], int64_t hi[]); extern int NGA_Locate_region64(int g_a,int64_t lo[],int64_t hi[],int64_t map[],int procs[]); extern void NGA_Matmul_patch64(char transa, char transb, void* alpha, void *beta, int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]) ; extern void NGA_Merge_distr_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[]); extern void NGA_NbAcc64(int g_a,int64_t lo[],int64_t hi[],void* buf,int64_t ld[],void* alpha, ga_nbhdl_t* nbhandle); extern void NGA_NbGet64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[], ga_nbhdl_t* nbhandle); extern void NGA_NbGet_ghost_dir64(int g_a, int64_t mask[], ga_nbhdl_t* handle); extern void NGA_NbPut64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[], ga_nbhdl_t* nbhandle); extern void NGA_Periodic_acc64(int g_a, int64_t lo[], int64_t hi[],void* buf,int64_t ld[],void* alpha); extern void NGA_Periodic_get64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]); extern void NGA_Periodic_put64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]); extern void NGA_Print_patch64(int g_a, int64_t lo[], int64_t hi[], int pretty); extern void NGA_Put64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]); extern long NGA_Read_inc64(int g_a, int64_t subscript[], long inc); extern void NGA_Release64(int g_a, int64_t lo[], int64_t hi[]); extern void NGA_Release_ghost_element64(int g_a, int64_t index[]); extern void NGA_Release_update64(int g_a, int64_t lo[], int64_t hi[]); extern void NGA_Release_update_ghost_element64(int g_a, int64_t index[]); extern void NGA_Scale_patch64(int g_a, int64_t lo[], int64_t hi[], void *alpha); extern void NGA_Scatter64(int g_a, void *v, int64_t* subsArray[], int64_t n); extern void NGA_Scatter_flat64(int g_a, void *v, int64_t subsArray[], int64_t n); extern void NGA_Scatter_acc64(int g_a, void *v, int64_t* subsArray[], int64_t n, void *alpha); extern void NGA_Scatter_acc_flat64(int g_a, void *v, int64_t subsArray[], int64_t n, void *alpha); extern void NGA_Select_elem64(int g_a, char* op, void* val, int64_t* index); extern void NGA_Set_data64(int g_a, int ndim, int64_t dims[], int type); extern void NGA_Set_ghosts64(int g_a, int64_t width[]); extern void NGA_Set_irreg_distr64(int g_a, int64_t map[], int64_t block[]); extern void NGA_Strided_acc64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[], void *alpha); extern void NGA_Strided_get64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[]); extern void NGA_Strided_put64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[]); extern DoubleComplex NGA_Zdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]); extern void NGA_Zero_patch64(int g_a, int64_t lo[], int64_t hi[]); #ifdef __cplusplus } #endif #endif ga-5-4/global/src/decomp.c0000644000175000017500000006102612662210457013504 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: decomp.c,v 1.9.6.2 2007-07-04 00:50:06 manoj Exp $ */ /*************************************************************************** *--- *--- The software in this file implements three heuristics for distributing *--- multidimensional arrays: ddb_h1 and ddb_h2 are fastest, ddb_ex does *--- an exhaustive search, see below for details. *--- *--- To compile this file: cc ddb.c -lm *--- *--- Author: Joel Malard *--- Address: Pacific Northwest National Laboratory *--- Battelle Boulevard, PO Box 999 *--- Richland, WA 99352 *--- *--- Bug et al.: jm.malard@pnl.gov *--- ***************************************************************************/ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #include "ga-papi.h" #include "typesf2c.h" /*-- ***************************************************************************** *-- *-- void ddb_h1 and ddb_h2 implement load-balancing heuristics *-- void ddb_ex implements an exhaustive search */ void ddb(Integer ndims, Integer ardims[], Integer npes, Integer blk[], Integer pedims[]); void ddb_ex( long ndims, Integer ardims[], long npes, double threshold, Integer blk[], Integer pedims[]); void ddb_h1( long ndims, Integer ardims[], long npes, double threshold, Integer blk[], Integer pedims[]); void ddb_h2( Integer ndims, Integer ardims[], Integer npes, double threshold, Integer bias, Integer blk[], Integer pedims[]); /*--------------------------------------------------------------------------- *-- Arguments *-- *-- The above three procedures have similar sequences of arguments *-- the only difference is that ddb_h2 takes an additional input argument *-- that induces the heuristic to possibly favor distributing the *-- right or the left axes of the data array. *-- *-- ndims (input): number of dimensions in the data array and the *-- process grid. There is no provision for requesting process *-- with fewer dimensions as the data array. *-- *-- ardims (input): extents of each dimension of the data array. *-- This array is of size ndims. destroyed. *-- *-- npes (input): number of processes onto which the distribution *-- takes place. *-- *-- threshold (input): minimum acceptable value of the load balance *-- ratio returned by ddb_ap(), see below. *-- *-- bias (input to ddb_h2): when set to a positive value positive *-- the rightmost axes of the data array are preferentially *-- distributed, similarly when bias is negative. When bias is zero *-- the heuristic attempts to deal processes equally among the axes *-- of the data array. *-- *-- blk (input/output): granularity of data mapping: The number of *-- consecutive elements along each dimension of the array. Upon output: *-- extents of the local array assigned to the process *-- that is assigned the array element with lowest global indices, e.g. A[0]. *-- The meaning of this array is not the same for ddb than for the underlying *-- load balancing subroutines. For the subroutine ddb, any non-positive value *-- in array blk is taken at face value. For example with ardim=[50,40], *-- blk = [3,-1] and npes = 40 the process grid that will be computed is: *-- pedims=[20,2] with 3x2 processes storing no data. This is compatible *-- with the semantics of the load-balancing subroutine in the 2D GA. *-- *-- pedims(output): number of processes along each dimension of the *-- data array. *-- *-------------------------------------------------------------------------- *-- *-- Other prototypes *-- *-- dd_ev evaluates the load balance ratio for the data distribution *-- specified by its argument list. *-- *-- ddb_ap and dd_lk are specific to ddb_h1. */ void ddb_ap(long ndims, double qedims[], Integer ardims[], Integer pedims[], long npes, long npdivs, long pdivs[]); double dd_ev(long ndims,Integer ardims[], Integer pedims[]); long dd_lk(long * prt, long n, double key); void dd_su(long ndims, Integer ardims[], Integer pedims[], Integer blk[]); /*--------------------------------------------------------------------------- *-- *-- Dependencies: *-- *-- ddb: ddb_h2, ddb_ex *-- ddb_ex: dd_ev, dd_su *-- ddb_h1: ddb_ap, dd_ev, ddb_ex, dd_lk, dd_su & -lm *-- ddb_h2: dd_ev, ddb_ex, dd_su *-- ***************************************************************************/ #define THRESHOLD -0.1 /* The threshold for switching to an exhaustive search*/ /************************************************************************ *-- *-- void ddb is a wrapper ontop of some load balancing heuristics. ddb *-- is called from within GA to compute process grids. *-- The first argument, ndims, is the number of *-- array dimensions. The resulting process grid also has ndims *-- dimensions but some of these can be degenerate. ************************************************************************/ void ddb(Integer ndims, Integer ardims[], Integer npes, Integer blk[], Integer pedims[]) { double ddb_threshold = 0.1; long ddb_bias = 0; long i, j; Integer count = 0; Integer *tardim, *tblk, *tpedim; long tp, sp; tp = (long)npes; /* count how many axes have block values.*/ for(i=ndims-1;i>=0;i--){ if(blk[i]<=0){ pedims[i] = -1; count += 1; } else { sp = (long)(ardims[i]+blk[i]-1)/blk[i]; if(sp>tp) { sp = tp; tp = 1; pedims[i] = (Integer)sp; } else { for(j=sp;j0){ tardim = (Integer *) calloc((size_t)count,sizeof(Integer)); if(tardim==NULL) { fprintf(stderr,"ddb: Memory allocation failed\n"); for(i=0;iblb || (clb==blb && cevthreshold) break; tdims[pc] = 0; pc -= 1; } else { if( tdims[pc] == stack[pc] ) { /*- Backtrack when current array dimension has exhausted *- all remaining processes */ done = (pc==0); tdims[pc] = 0; pc -= 1; } else { /*- Increment the number of processes assigned to the current *- array axis. */ for(tdims[pc]+=1; stack[pc]%tdims[pc]!=0; tdims[pc]+=1); pc += 1; stack[pc] = npes; for(i=0;iq) { h = k; q = t; } } /*- Swap elements of apdims to improve load balance */ j = h; for(k=0;kub) { j = k; ub = cb; } i = apdims[h]; apdims[h] = apdims[k]; apdims[k] = i; } if(j!=h){ i = apdims[h]; apdims[h] = apdims[j]; apdims[j] = i; } } while (ub > blb); for(i=0;i1) { for(k=1,i=g+1;iprt[md]) { lw = md+1; } else { hgh = md; } } while (lw0) { v = key-prt[lw-1]; if(v<0.0) v = -v; if(v1) { k = 1; do { h = k+1; for(j=h;j0) { istep = -1; istart = ndims-1; } /*- Set pedims -*/ for(j=0;j=1;k--){ p0 = pdivs[k]; h = istart; q = (tard[istart]0){ blk[i] = (tard[i]+pedims[i]-1)/pedims[i]; } else { pnga_error("process dimension is zero: ddb_h2",0); } free(tard); return; } /**************************************************************************** *-- *-- double dd_ev evaluates the load balancing ratio as follows: *-- *-- Let n1, n2 ... nd be the extents of the array dimensions *-- Let p1, p2 ... pd be the numbers of processes across *-- the corresponding dimensions of the process grid *-- Let there be npes processes available *-- *-- Load balancing measure = (n1/p1)*...*(nd/pd)*npes *-- ------------------------ *-- n1*n2*...*nd *-- The communication volume measure is the sum of *-- all monomials (ni/pi) of degree d-1. *-- ****************************************************************************/ double dd_ev(long ndims,Integer ardims[], Integer pedims[]) { double q, t; long k; q = 1.0; t = 1.0; for(k=0;k #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDINT_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_STDDEF_H #include #endif #include "global.h" #include "globalp.h" #include "base.h" #include "armci.h" #include "macdecls.h" #include "ga-papi.h" #include "ga-wapi.h" #define DEBUG 0 #define USE_MALLOC 1 #define INVALID_MA_HANDLE -1 #define NEAR_INT(x) (x)< 0.0 ? ceil( (x) - 0.5) : floor((x) + 0.5) #if !defined(CRAY_YMP) #define BYTE_ADDRESSABLE_MEMORY #endif #ifdef PROFILE_OLD #include "ga_profile.h" #endif #define DISABLE_NBOPT /* disables Non-Blocking OPTimization */ /*uncomment line below to verify consistency of MA in every sync */ /*#define CHECK_MA yes */ char *fence_array; static int GA_fence_set=0; Integer *_ga_map; /* used in get/put/acc */ int *ProcListPerm; static int GA_prealloc_gatscat = 0; static Integer *GA_header; static Integer *GA_list; static Integer *GA_elems; extern void armci_read_strided(void*, int, int*, int*, char*); extern void armci_write_strided(void*, int, int*, int*, char*); extern armci_hdl_t* get_armci_nbhandle(Integer *); /***************************************************************************/ /** * Synchronize all processes on group */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_sync = pnga_pgroup_sync #endif void pnga_pgroup_sync(Integer grp_id) { #ifdef CHECK_MA Integer status; #endif /* printf("p[%d] calling ga_pgroup_sync on group: %d\n",GAme,*grp_id); */ if (grp_id > 0) { # ifdef MSG_COMMS_MPI /* fence on all processes in this group */ { int p; for(p=0;p GAnproc) pnga_error("permute_proc: error ", (nproc));\ \ /* every process generates different random sequence */\ (void)srand((unsigned)GAme); \ \ /* initialize list */\ for(_i=0; _i< (nproc); _i++) ProcListPerm[_i]=_i;\ \ /* list permutation generated by random swapping */\ for(_i=0; _i< (nproc); _i++){ \ iswap = (int)(rand() % (nproc)); \ temp = ProcListPerm[iswap]; \ ProcListPerm[iswap] = ProcListPerm[_i]; \ ProcListPerm[_i] = temp; \ } \ }\ } /*\ internal malloc that bypasses MA and uses internal buf when possible \*/ #define MBUFLEN 256 #define MBUF_LEN MBUFLEN+2 static double ga_int_malloc_buf[MBUF_LEN]; static int mbuf_used=0; #define MBUF_GUARD -1998.1998 void *gai_malloc(int bytes) { void *ptr; if(!mbuf_used && bytes <= MBUF_LEN){ if(DEBUG){ ga_int_malloc_buf[0]= MBUF_GUARD; ga_int_malloc_buf[MBUFLEN]= MBUF_GUARD; } ptr = ga_int_malloc_buf+1; mbuf_used++; }else{ Integer elems = (bytes+sizeof(double)-1)/sizeof(double)+1; ptr=ga_malloc(elems, MT_DBL, "GA malloc temp"); /* *((Integer*)ptr)= handle; ptr = ((double*)ptr)+ 1;*/ /*needs sizeof(double)>=sizeof(Integer)*/ } return ptr; } void gai_free(void *ptr) { if(ptr == (ga_int_malloc_buf+1)){ if(DEBUG){ assert(ga_int_malloc_buf[0]== MBUF_GUARD); assert(ga_int_malloc_buf[MBUFLEN]== MBUF_GUARD); assert(mbuf_used ==1); } mbuf_used =0; }else{ /* Integer handle= *( (Integer*) (-1 + (double*)ptr)); */ ga_free(ptr); } } #define gaShmemLocation(proc, g_a, _i, _j, ptr_loc, _pld) \ { \ Integer _ilo, _ihi, _jlo, _jhi, offset, proc_place, g_handle=(g_a)+GA_OFFSET;\ Integer _lo[2], _hi[2], _p_handle; \ Integer _iw = GA[g_handle].width[0]; \ Integer _jw = GA[g_handle].width[1]; \ Integer _num_rstrctd = GA[g_handle].num_rstrctd; \ \ ga_ownsM(g_handle, (proc),_lo,_hi); \ _p_handle = GA[g_handle].p_handle; \ if (_p_handle != 0) { \ proc_place = proc; \ if (_num_rstrctd != 0) { \ proc_place = GA[g_handle].rstrctd_list[proc_place]; \ } \ } else { \ proc_place = PGRP_LIST[_p_handle].inv_map_proc_list[proc]; \ } \ _ilo = _lo[0]; _ihi=_hi[0]; \ _jlo = _lo[1]; _jhi=_hi[1]; \ \ if((_i)<_ilo || (_i)>_ihi || (_j)<_jlo || (_j)>_jhi){ \ char err_string[ERR_STR_LEN]; \ sprintf(err_string,"%s:p=%ld invalid i/j (%ld,%ld)><(%ld:%ld,%ld:%ld)", \ "gaShmemLocation", (long)proc, (long)(_i),(long)(_j), \ (long)_ilo, (long)_ihi, (long)_jlo, (long)_jhi); \ pnga_error(err_string, g_a ); \ } \ offset = ((_i)-_ilo+_iw) + (_ihi-_ilo+1+2*_iw)*((_j)-_jlo+_jw); \ \ /* find location of the proc in current cluster pointer array */ \ *(ptr_loc) = GA[g_handle].ptr[proc_place] + \ offset*GAsizeofM(GA[g_handle].type); \ *(_pld) = _ihi-_ilo+1+2*_iw; \ } /*\ Return pointer (ptr_loc) to location in memory of element with subscripts * (subscript). Also return physical dimensions of array in memory in ld. \*/ #define gam_Location(proc, g_handle, subscript, ptr_loc, ld) \ { \ Integer _offset=0, _d, _w, _factor=1, _last=GA[g_handle].ndim-1; \ Integer _lo[MAXDIM], _hi[MAXDIM], _pinv, _p_handle; \ \ ga_ownsM(g_handle, proc, _lo, _hi); \ gaCheckSubscriptM(subscript, _lo, _hi, GA[g_handle].ndim); \ if(_last==0) ld[0]=_hi[0]- _lo[0]+1+2*(Integer)GA[g_handle].width[0]; \ __CRAYX1_PRAGMA("_CRI shortloop"); \ for(_d=0; _d < _last; _d++) { \ _w = (Integer)GA[g_handle].width[_d]; \ _offset += (subscript[_d]-_lo[_d]+_w) * _factor; \ ld[_d] = _hi[_d] - _lo[_d] + 1 + 2*_w; \ _factor *= ld[_d]; \ } \ _offset += (subscript[_last]-_lo[_last] \ + (Integer)GA[g_handle].width[_last]) \ * _factor; \ _p_handle = GA[g_handle].p_handle; \ if (_p_handle != 0) { \ if (GA[g_handle].num_rstrctd == 0) { \ _pinv = proc; \ } else { \ _pinv = GA[g_handle].rstrctd_list[proc]; \ } \ } else { \ _pinv = PGRP_LIST[_p_handle].inv_map_proc_list[proc]; \ } \ *(ptr_loc) = GA[g_handle].ptr[_pinv]+_offset*GA[g_handle].elemsize; \ } #define gam_GetRangeFromMap(p, ndim, plo, phi){\ Integer _mloc = p* ndim *2;\ *plo = (Integer*)_ga_map + _mloc;\ *phi = *plo + ndim;\ } /* compute index of point subscripted by plo relative to point subscripted by lo, for a block with dimensions dims */ #define gam_ComputePatchIndex(ndim, lo, plo, dims, pidx){ \ Integer _d, _factor; \ *pidx = plo[0] -lo[0]; \ __CRAYX1_PRAGMA("_CRI shortloop"); \ for(_d= 0,_factor=1; _d< ndim -1; _d++){ \ _factor *= (dims[_d]); \ *pidx += _factor * (plo[_d+1]-lo[_d+1]); \ } \ } #define gam_GetBlockPatch(plo,phi,lo,hi,blo,bhi,ndim) { \ Integer _d; \ for (_d=0; _d= plo[_d]) blo[_d] = lo[_d]; \ else blo[_d] = plo[_d]; \ if (hi[_d] <= phi[_d] && hi[_d] >= plo[_d]) bhi[_d] = hi[_d]; \ else bhi[_d] = phi[_d]; \ } \ } /** * A routine to test for a non-blocking call */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbtest = pnga_nbtest #endif Integer pnga_nbtest(Integer *nbhandle) { return nga_test_internal((Integer *)nbhandle); } /** * A routine to wait for a non-blocking call to complete */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbwait = pnga_nbwait #endif void pnga_nbwait(Integer *nbhandle) { nga_wait_internal((Integer *)nbhandle); } static void ngai_puts(char *loc_base_ptr, char *pbuf, int *stride_loc, char *prem, int *stride_rem, int *count, int nstrides, int proc, int field_off, int field_size, int type_size) { if(field_size<0 || field_size == type_size) { ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,nstrides,proc); } else { int i; count -= 1; stride_loc -= 1; stride_rem -= 1; nstrides += 1; for(i=1; i= 0) { proc = PGRP_LIST[p_handle].inv_map_proc_list[proc]; } #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif /* check if it is local to SMP */ #if !defined(__crayx1) && !defined(DISABLE_NBOPT) cond = armci_domain_same_id(ARMCI_DOMAIN_SMP,(int)proc); if(loop==0) cond = !cond; if(cond) { #endif /* Find visible portion of patch held by processor p and return the result in plo and phi. Also get actual processor index corresponding to p and store the result in proc. */ gam_GetRangeFromMap(p, ndim, &plo, &phi); proc = (int)GA_proclist[p]; if (n_rstrctd == 0) { gam_Location(proc,handle, plo, &prem, ldrem); } else { gam_Location(rank_rstrctd[proc],handle, plo, &prem, ldrem); } /* find the right spot in the user buffer */ gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); if (p_handle >= 0) { proc = (int)GA_proclist[p]; /* BJP */ proc = PGRP_LIST[p_handle].inv_map_proc_list[proc]; } if(GA_fence_set)fence_array[proc]=1; #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif /*casting what ganb_get_armci_handle function returns to armci_hdl is very crucial here as on 64 bit platforms, pointer is 64 bits where as temporary is only 32 bits*/ #if defined(__crayx1) || defined(DISABLE_NBOPT) /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf, pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbPutS(pbuf, stride_loc, prem, stride_rem, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbputs(buf,pbuf, stride_loc, prem, stride_rem, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { /* do blocking put for local processes. If all processes are remote processes then do blocking put for the last one */ if((loop==0 && counter==(int)np-1) || loop==1) { /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf, pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); } else { ++counter; /* ARMCI_NbPutS(pbuf,stride_loc,prem,stride_rem,count, ndim-1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); */ ngai_nbputs(buf,pbuf,stride_loc,prem,stride_rem,count, ndim-1, proc, field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } } } /* end if(cond) */ } #endif } #if !defined(__crayx1) && !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } else { Integer offset, l_offset, last, pinv; Integer blo[MAXDIM],bhi[MAXDIM]; Integer plo[MAXDIM],phi[MAXDIM]; Integer idx, j, jtot, chk, iproc; Integer idx_buf, ldrem[MAXDIM]; Integer blk_tot = GA[handle].block_total; int check1, check2; char *pbuf, *prem; /* GA uses simple block cyclic data distribution */ if (GA[handle].block_sl_flag == 0) { for(loop=0; loop= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif /*casting what ganb_get_armci_handle function returns to armci_hdl is very crucial here as on 64 bit platforms, pointer is 64 bits where as temporary is only 32 bits*/ #ifdef __crayx1 /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf,pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbPutS(pbuf, stride_loc, prem, stride_rem, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbputs(buf,pbuf, stride_loc, prem, stride_rem, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { /* do blocking put for local processes. If all processes are remote processes then do blocking put for the last one */ /* if(loop==1) */ /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf,pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); /* else { ARMCI_NbPutS(pbuf,stride_loc,prem,stride_rem,count, ndim-1, proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } */ } #endif } /* evaluate offset for block idx */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif /*casting what ganb_get_armci_handle function returns to armci_hdl is very crucial here as on 64 bit platforms, pointer is 64 bits where as temporary is only 32 bits*/ #ifdef __crayx1 /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf,pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbPutS(pbuf, stride_loc, prem, stride_rem, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbputs(buf,pbuf, stride_loc, prem, stride_rem, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { /* do blocking put for local processes. If all processes are remote processes then do blocking put for the last one */ /* if(loop==1) */ /* ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc); */ ngai_puts(buf,pbuf,stride_loc,prem,stride_rem,count,ndim-1,proc, field_off, field_size, size); /* else { ARMCI_NbPutS(pbuf,stride_loc,prem,stride_rem,count, ndim-1, proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } */ } #endif } /* increment offset to account for all elements on this block */ itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } #ifndef __crayx1 } #endif } } } #if !defined(__crayx1) && !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } GA_POP_NAME; #ifdef PROFILE_OLD ga_profile_stop(); #endif } /** * (Non-blocking) Put an N-dimensional patch of data into a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbput = pnga_nbput #endif void pnga_nbput(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { ngai_put_common(g_a,lo,hi,buf,ld,0,-1,nbhandle); } /** * (Non-blocking) Put an N-dimensional patch of data into a Global Array and notify the other side with information on another Global Array */ #define HANDLES_OUTSTANDING 100 /* Maximum number of outstanding put/notify handles */ typedef struct { Integer *orighdl; Integer firsthdl; Integer elementhdl; void *elem_copy; } gai_putn_hdl_t; static int putn_handles_initted = 0; static gai_putn_hdl_t putn_handles[HANDLES_OUTSTANDING]; static int putn_check_single_elem(Integer g_a, Integer *lon, Integer *hin) { int ndims, i; ndims = pnga_ndim(g_a); for (i = 0; i < ndims; i++) if (lon[i] != hin[i]) return 0; return 1; } /* putn_check_single_elem */ static int putn_find_empty_slot(void) { int i; for (i = 0; i < HANDLES_OUTSTANDING; i++) if (!putn_handles[i].orighdl) return i; return -1; } /* putn_find_empty_slot */ static int putn_intersect_coords(Integer g_a, Integer *lo, Integer *hi, Integer *ecoords) { int ndims, i; ndims = pnga_ndim(g_a); for (i = 0; i < ndims; i++) if ((ecoords[i] < lo[i]) || (ecoords[i] > hi[i])) return 0; return 1; } /* putn_intersect_coords */ static int putn_verify_element_in_buf(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *ecoords, void *bufn, Integer elemSize) { int i, ndims; #ifdef HAVE_STDDEF_H ptrdiff_t off = (char *)bufn - (char *)buf; #else Integer off = (char *)bufn - (char *)buf; #endif Integer eoff = 0; off /= elemSize; /* Offset in terms of elements */ ndims = pnga_ndim(g_a); eoff = ecoords[0] - lo[0]; /* Check in Fortran ordering */ for (i = 1; i < ndims; i++) eoff += (ecoords[i] - lo[i]) * ld[i - 1]; return (eoff == (Integer)off); /* Must be the same for a correct notify buffer */ } /* putn_verify_element_in_buf */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbput_notify = pnga_nbput_notify #endif void pnga_nbput_notify(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer g_b, Integer *ecoords, void *bufn, Integer *nbhandle) { Integer ldn[MAXDIM] = { 1 }; int pos, intersect; /* Make sure everything has been initialized */ if (!putn_handles_initted) { memset(putn_handles, 0, sizeof(putn_handles)); putn_handles_initted = 1; } pos = putn_find_empty_slot(); if (pos == -1) /* no empty handles available */ pnga_error("Too many outstanding put/notify operations!", 0); putn_handles[pos].orighdl = nbhandle; /* Store original handle for nbwait_notify */ if (g_a == g_b) intersect = putn_intersect_coords(g_a, lo, hi, ecoords); else intersect = 0; if (!intersect) { /* Simpler case */ ngai_put_common(g_a, lo, hi, buf, ld, 0, -1, &putn_handles[pos].firsthdl); ngai_put_common(g_b, ecoords, ecoords, bufn, ldn, 0, -1, &putn_handles[pos].elementhdl); putn_handles[pos].elem_copy = NULL; } else { int ret, i; Integer handle = GA_OFFSET + g_a, size; void *elem_copy; char *elem; size = GA[handle].elemsize; ret = putn_verify_element_in_buf(g_a, lo, hi, buf, ld, ecoords, bufn, size); if (!ret) pnga_error("Intersecting buffers, but notify element is not in buffer!", 0); elem_copy = malloc(size); memcpy(elem_copy, bufn, size); elem = bufn; for (i = 0; i < size; i++) elem[i] += 1; /* Increment each byte by one, safe? */ putn_handles[pos].elem_copy = elem_copy; ngai_put_common(g_a, lo, hi, buf, ld, 0, -1, &putn_handles[pos].firsthdl); ngai_put_common(g_a, ecoords, ecoords, elem_copy, ldn, 0, -1, &putn_handles[pos].elementhdl); } } /* pnga_nbput_notify */ /** * Wait for a non-blocking put/notify to complete */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbwait_notify = pnga_nbwait_notify #endif void pnga_nbwait_notify(Integer *nbhandle) { int i; for (i = 0; i < HANDLES_OUTSTANDING; i++) if (putn_handles[i].orighdl == nbhandle) break; if (i >= HANDLES_OUTSTANDING) return; /* Incorrect handle used or maybe wait was called multiple times? */ nga_wait_internal(&putn_handles[i].firsthdl); nga_wait_internal(&putn_handles[i].elementhdl); if (putn_handles[i].elem_copy) { free(putn_handles[i].elem_copy); putn_handles[i].elem_copy = NULL; } putn_handles[i].orighdl = NULL; } /* pnga_nbwait_notify */ /** * Put an N-dimensional patch of data into a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_put = pnga_put #endif void pnga_put(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { ngai_put_common(g_a,lo,hi,buf,ld,0,-1,NULL); } /** * (Non-blocking) Put a field in a an N-dimensional patch of data into a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbput_field = pnga_nbput_field #endif void pnga_nbput_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld, Integer *nbhandle) { ngai_put_common(g_a,lo,hi,buf,ld,foff, fsize, nbhandle); } /** * Put a field in a an N-dimensional patch of data into a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_put_field = pnga_put_field #endif void pnga_put_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld) { ngai_put_common(g_a,lo,hi,buf,ld,foff, fsize, NULL); } /*\ A common routine called by both non-blocking and blocking GA Get calls. \*/ void ngai_get_common(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer field_off, Integer field_size, Integer *nbhandle) { /* g_a: Global array handle lo[]: Array of lower indices of patch of global array hi[]: Array of upper indices of patch of global array buf[]: Local buffer that array patch will be copied into ld[]: Array of physical ndim-1 dimensions of local buffer */ Integer p, np, handle=GA_OFFSET + g_a; Integer idx, elems, size, p_handle; int proc, ndim, loop, cond; int num_loops=2; /* 1st loop for remote procs; 2nd loop for local procs */ Integer use_blocks; Integer n_rstrctd; Integer *rank_rstrctd; #if defined(__crayx1) || defined(DISABLE_NBOPT) #else Integer ga_nbhandle; int counter=0; #endif int _stride_rem[MAXDIM+1], _stride_loc[MAXDIM+1], _count[MAXDIM+1]; int *stride_rem=&_stride_rem[1], *stride_loc=&_stride_loc[1], *count=&_count[1]; GA_PUSH_NAME("nga_get_common"); ga_check_handleM(g_a, "nga_get_common"); size = GA[handle].elemsize; ndim = GA[handle].ndim; use_blocks = GA[handle].block_flag; p_handle = (Integer)GA[handle].p_handle; n_rstrctd = (Integer)GA[handle].num_rstrctd; rank_rstrctd = GA[handle].rank_rstrctd; /*initial stride portion for field-wise operations*/ _stride_rem[0] = size; _stride_loc[0] = field_size; _count[0] = field_size; if (!use_blocks) { /* Locate the processors containing some portion of the patch specified by lo and hi and return the results in _ga_map, GA_proclist, and np. GA_proclist contains a list of processors containing some portion of the patch, _ga_map contains the lower and upper indices of the portion of the patch held by a given processor, and np contains the total number of processors that contain some portion of the patch. */ if(!pnga_locate_region(g_a, lo, hi, _ga_map, GA_proclist, &np )) ga_RegionError(pnga_ndim(g_a), lo, hi, g_a); /* get total size of patch */ #ifndef NO_GA_STATS gam_CountElems(ndim, lo, hi, &elems); GAbytes.gettot += (double)size*elems; GAstat.numget++; GAstat.numget_procs += np; #endif if(nbhandle)ga_init_nbhandle(nbhandle); #if !defined(__crayx1) && !defined(DISABLE_NBOPT) else ga_init_nbhandle(&ga_nbhandle); #endif #ifdef PROFILE_OLD ga_profile_start((int)handle, (long)size*elems, ndim, lo, hi, ENABLE_PROFILE_GET); #endif gaPermuteProcList(np); #if !defined(__crayx1) && !defined(DISABLE_NBOPT) for(loop=0; loop= 0) { proc = PGRP_LIST[p_handle].inv_map_proc_list[proc]; } #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif /* check if it is local to SMP */ #if !defined(__crayx1) && !defined(DISABLE_NBOPT) cond = armci_domain_same_id(ARMCI_DOMAIN_SMP,(int)proc); if(loop==0) cond = !cond; if(cond) { #endif /* Find visible portion of patch held by processor p and return the result in plo and phi. Also get actual processor index corresponding to p and store the result in proc. */ gam_GetRangeFromMap(p, ndim, &plo, &phi); proc = (int)GA_proclist[p]; /* get pointer prem to location indexed by plo. Also get leading physical dimensions in memory in ldrem */ if (n_rstrctd == 0) { gam_Location(proc,handle, plo, &prem, ldrem); } else { gam_Location(rank_rstrctd[proc],handle, plo, &prem, ldrem); } /* find the right spot in the user buffer for the point subscripted by plo given that the corner of the user buffer is subscripted by lo */ gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* compute number of elements in each dimension and store the result in count */ gam_ComputeCount(ndim, plo, phi, count); /* Scale first element in count by element size. The ARMCI_GetS routine uses this convention to figure out memory sizes.*/ count[0] *= size; /* Return strides for memory containing global array on remote processor indexed by proc (stride_rem) and for local buffer buf (stride_loc) */ gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); if (p_handle >= 0) { proc = (int)GA_proclist[p]; /* BJP */ proc = (int)PGRP_LIST[p_handle].inv_map_proc_list[proc]; } #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.getloc += (double)size*elems; } #endif #if defined(__crayx1) || defined(DISABLE_NBOPT) /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbGetS(prem, stride_rem, pbuf, stride_loc, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbgets(buf,prem, stride_rem, pbuf, stride_loc, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { if((loop==0 && counter==(int)np-1) || loop==1) { /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); } else { ++counter; /* ARMCI_NbGetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); */ ngai_nbgets(buf,prem, stride_rem, pbuf, stride_loc, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } } } /* end if(cond) */ } #endif } #if !defined(__crayx1) && !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } else { Integer offset, l_offset, last, pinv; Integer blo[MAXDIM],bhi[MAXDIM]; Integer plo[MAXDIM],phi[MAXDIM]; Integer idx, j, jtot, chk, iproc; Integer idx_buf, ldrem[MAXDIM]; Integer blk_tot = GA[handle].block_total; int check1, check2; char *pbuf, *prem; /* GA uses simple block cyclic data distribution */ if (GA[handle].block_sl_flag == 0) { for(loop=0; loop= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif /*casting what ganb_get_armci_handle function returns to armci_hdl is very crucial here as on 64 bit platforms, pointer is 64 bits where as temporary is only 32 bits*/ #ifdef __crayx1 /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbGetS(prem, stride_rem, pbuf, stride_loc, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbgets(buf,prem, stride_rem, pbuf, stride_loc, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { /* do blocking put for local processes. If all processes are remote processes then do blocking put for the last one */ /* if(loop==1) */ /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); /* else { ARMCI_NbGetS(prem,stride_rem,pbuf,stride_loc,count, ndim-1, proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } */ } #endif } /* evaluate size of block idx and use it to increment offset */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif /*casting what ganb_get_armci_handle function returns to armci_hdl is very crucial here as on 64 bit platforms, pointer is 64 bits where as temporary is only 32 bits*/ #ifdef __crayx1 /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); #else if(nbhandle) { /* ARMCI_NbGetS(prem, stride_rem, pbuf, stride_loc, count, ndim -1, */ /* proc,(armci_hdl_t*)get_armci_nbhandle(nbhandle)); */ ngai_nbgets(buf,prem, stride_rem, pbuf, stride_loc, count, ndim -1, proc,field_off, field_size, size, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); } else { /* do blocking put for local processes. If all processes are remote processes then do blocking put for the last one */ /* if(loop==1) */ /* ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc); */ ngai_gets(buf,prem,stride_rem,pbuf,stride_loc,count,ndim-1,proc, field_off, field_size, size); /* else { ARMCI_NbGetS(prem,stride_rem,pbuf,stride_loc,count, ndim-1, proc,(armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } */ } #endif } #if COMPACT_SCALAPACK /* increment offset to account for all elements on this block */ itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; #endif /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } #ifndef __crayx1 } #endif } } } #if !defined(__crayx1) && !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } GA_POP_NAME; #ifdef PROFILE_OLD ga_profile_stop(); #endif } /** * Get an N-dimensional patch of data from a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get = pnga_get #endif void pnga_get(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { ngai_get_common(g_a,lo,hi,buf,ld,0,-1,(Integer *)NULL); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbget = pnga_nbget #endif void pnga_nbget(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { ngai_get_common(g_a,lo,hi,buf,ld,0,-1,nbhandle); } /** * Get a field in an N-dimensional patch of data from a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_field = pnga_get_field #endif void pnga_get_field(Integer g_a, Integer *lo, Integer *hi,Integer foff, Integer fsize, void *buf, Integer *ld) { ngai_get_common(g_a,lo,hi,buf,ld,foff,fsize,(Integer *)NULL); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbget_field = pnga_nbget_field #endif void pnga_nbget_field(Integer g_a, Integer *lo, Integer *hi,Integer foff, Integer fsize, void *buf, Integer *ld, Integer *nbhandle) { ngai_get_common(g_a,lo,hi,buf,ld,foff,fsize,nbhandle); } #ifdef __crayx1 # pragma _CRI inline ga_get_ # pragma _CRI inline ngai_get_common #endif /** * A common routine called by both non-blocking and blocking GA acc calls. */ void ngai_acc_common(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer *nbhandle) { Integer p, np, handle=GA_OFFSET + g_a; Integer idx, elems, size, type, p_handle, ga_nbhandle; int optype=-1, proc, loop, ndim, cond; int num_loops=2; /* 1st loop for remote procs; 2nd loop for local procs */ Integer use_blocks; Integer n_rstrctd; Integer *rank_rstrctd; GA_PUSH_NAME("nga_acc_common"); ga_check_handleM(g_a, "nga_acc_common"); size = GA[handle].elemsize; type = GA[handle].type; ndim = GA[handle].ndim; use_blocks = GA[handle].block_flag; p_handle = GA[handle].p_handle; n_rstrctd = (Integer)GA[handle].num_rstrctd; rank_rstrctd = GA[handle].rank_rstrctd; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_FLOAT) optype= ARMCI_ACC_FLT; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else pnga_error("type not supported",type); if (!use_blocks) { /* Locate the processors containing some portion of the patch specified by lo and hi and return the results in _ga_map, GA_proclist, and np. GA_proclist contains a list of processors containing some portion of the patch, _ga_map contains the lower and upper indices of the portion of the patch held by a given processor, and np contains the total number of processors that contain some portion of the patch. */ if(!pnga_locate_region(g_a, lo, hi, _ga_map, GA_proclist, &np )) ga_RegionError(pnga_ndim(g_a), lo, hi, g_a); #ifndef NO_GA_STATS gam_CountElems(ndim, lo, hi, &elems); GAbytes.acctot += (double)size*elems; GAstat.numacc++; GAstat.numacc_procs += np; #endif if(nbhandle)ga_init_nbhandle(nbhandle); else ga_init_nbhandle(&ga_nbhandle); #ifdef PROFILE_OLD ga_profile_start((int)handle, (long)size*elems, ndim, lo, hi, ENABLE_PROFILE_ACC); #endif gaPermuteProcList(np); for(loop=0; loop= 0) { proc = PGRP_LIST[p_handle].inv_map_proc_list[proc]; } #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif /* check if it is local to SMP */ cond = armci_domain_same_id(ARMCI_DOMAIN_SMP,(int)proc); if(loop==0) cond = !cond; if(cond) { /* Find visible portion of patch held by processor p and return the result in plo and phi. Also get actual processor index corresponding to p and store the result in proc. */ gam_GetRangeFromMap(p, ndim, &plo, &phi); proc = (int)GA_proclist[p]; /* get pointer prem to location indexed by plo. Also get leading physical dimensions in memory in ldrem */ if (n_rstrctd == 0) { gam_Location(proc,handle, plo, &prem, ldrem); } else { gam_Location(rank_rstrctd[proc],handle, plo, &prem, ldrem); } /* find the right spot in the user buffer */ gam_ComputePatchIndex(ndim,lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); if (p_handle >= 0) { proc = (int)GA_proclist[p]; /* BJP */ proc = (int)PGRP_LIST[p_handle].inv_map_proc_list[proc]; } if(GA_fence_set)fence_array[proc]=1; #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.accloc += (double)size*elems; } #endif if(nbhandle) ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); else { # if !defined(DISABLE_NBOPT) if((loop==0 && counter==(int)np-1) || loop==1) ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); else { ++counter; ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } # else ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); # endif } } /* end if(cond) */ } } #if !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } else { Integer offset, l_offset, last, pinv; Integer blo[MAXDIM],bhi[MAXDIM]; Integer plo[MAXDIM],phi[MAXDIM]; Integer idx, j, jtot, chk, iproc; Integer idx_buf, ldrem[MAXDIM]; Integer blk_tot = GA[handle].block_total; int check1, check2; int stride_rem[MAXDIM], stride_loc[MAXDIM], count[MAXDIM]; char *pbuf, *prem; /* GA uses simple block cyclic data distribution */ if (GA[handle].block_sl_flag == 0) { for(loop=0; loop= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif if(nbhandle) ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); else { # if !defined(DISABLE_NBOPT) if((loop==0 && counter==(int)np-1) || loop==1) ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); else { ++counter; ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } # else ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); # endif } } /* evaluate offset for block idx */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gam_ComputePatchIndex(ndim, lo, plo, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; gam_ComputeCount(ndim, plo, phi, count); /* scale number of rows by element size */ count[0] *= size; gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc); proc = pinv; if(GA_fence_set)fence_array[proc]=1; #ifndef NO_GA_STATS if(proc == GAme){ gam_CountElems(ndim, plo, phi, &elems); GAbytes.putloc += (double)size*elems; } #endif if(nbhandle) ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(nbhandle)); else { # if !defined(DISABLE_NBOPT) if((loop==0 && counter==(int)np-1) || loop==1) ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); else { ++counter; ARMCI_NbAccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc, (armci_hdl_t*)get_armci_nbhandle(&ga_nbhandle)); } # else ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, ndim-1, proc); # endif } } /* increment offset to account for all elements on this block */ #if COMPACT_SCALAPACK itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; #endif /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } #ifndef __crayx1 } #endif } } } #if !defined(DISABLE_NBOPT) if(!nbhandle) nga_wait_internal(&ga_nbhandle); #endif } GA_POP_NAME; #ifdef PROFILE_OLD ga_profile_stop(); #endif } /** * Accumulate operation for an N-dimensional patch of a Global Array * g_a += alpha * patch */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_acc = pnga_acc #endif void pnga_acc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha) { ngai_acc_common(g_a,lo,hi,buf,ld,alpha,NULL); } /** * (Non-blocking) Accumulate operation for an N-dimensional patch of a Global Array * g_a += alpha * patch */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nbacc = pnga_nbacc #endif void pnga_nbacc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer *nbhndl) { ngai_acc_common(g_a,lo,hi,buf,ld,alpha,nbhndl); } /** * Return a pointer to local data in a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_ptr = pnga_access_ptr #endif void pnga_access_ptr(Integer g_a, Integer lo[], Integer hi[], void* ptr, Integer ld[]) { char *lptr; Integer handle = GA_OFFSET + g_a; Integer ow,i,p_handle; GA_PUSH_NAME("nga_access_ptr"); p_handle = GA[handle].p_handle; if (!pnga_locate(g_a,lo,&ow)) pnga_error("locate top failed",0); if (p_handle != -1) ow = PGRP_LIST[p_handle].inv_map_proc_list[ow]; if ((armci_domain_id(ARMCI_DOMAIN_SMP, ow) != armci_domain_my_id(ARMCI_DOMAIN_SMP)) && (ow != GAme)) pnga_error("cannot access top of the patch",ow); if (!pnga_locate(g_a,hi, &ow)) pnga_error("locate bottom failed",0); if (p_handle != -1) ow = PGRP_LIST[p_handle].inv_map_proc_list[ow]; if ((armci_domain_id(ARMCI_DOMAIN_SMP, ow) != armci_domain_my_id(ARMCI_DOMAIN_SMP)) && (ow != GAme)) pnga_error("cannot access bottom of the patch",ow); for (i=0; ihi[i]) { ga_RegionError(GA[handle].ndim, lo, hi, g_a); } if (p_handle >= 0) { ow = PGRP_LIST[p_handle].map_proc_list[ow]; } if (GA[handle].num_rstrctd > 0) { ow = GA[handle].rank_rstrctd[ow]; } gam_Location(ow,handle, lo, &lptr, ld); *(char**)ptr = lptr; GA_POP_NAME; } /*\ RETURN A POINTER TO BEGINNING OF LOCAL DATA BLOCK \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_block_grid_ptr = pnga_access_block_grid_ptr #endif void pnga_access_block_grid_ptr(Integer g_a, Integer *index, void* ptr, Integer *ld) /* g_a: array handle [input] * index: subscript of a particular block [input] * ptr: pointer to data in block [output] * ld: array of strides for block data [output] */ { char *lptr; Integer handle = GA_OFFSET + g_a; Integer i/*, p_handle*/, offset, factor, inode; Integer ndim; C_Integer *num_blocks, *block_dims; int *proc_grid; Integer *dims; Integer last; Integer proc_index[MAXDIM]; Integer /*blk_size[MAXDIM],*/ blk_num[MAXDIM], blk_dim[MAXDIM], blk_inc[MAXDIM]; Integer blk_ld[MAXDIM],hlf_blk[MAXDIM],blk_jinc; #if COMPACT_SCALAPACK Integer j, lo, hi; Integer lld[MAXDIM], block_count[MAXDIM], loc_block_dims[MAXDIM]; Integer ldims[MAXDIM]; #endif GA_PUSH_NAME("nga_access_block_grid_ptr"); /*p_handle = GA[handle].p_handle;*/ if (!GA[handle].block_sl_flag) { pnga_error("Array is not using ScaLAPACK data distribution",0); } proc_grid = GA[handle].nblock; num_blocks = GA[handle].num_blocks; block_dims = GA[handle].block_dims; dims = GA[handle].dims; ndim = GA[handle].ndim; for (i=0; i= num_blocks[i]) pnga_error("block index outside allowed values",index[i]); } /* find out what processor block is located on */ gam_find_proc_from_sl_indices(handle, inode, index); /* get proc indices of processor that owns block */ gam_find_proc_indices(handle,inode,proc_index) last = ndim-1; /* Find strides of requested block */ #if COMPACT_SCALAPACK for (i=0; i dims[i]) hi = dims[i]; ld[i] = (hi - lo + 1); } #else for (i=0; i 0) { if (proc_index[i] dims[i]) hi = dims[i]; if (i dims[i]) hi = dims[i]; ldims[i] = hi - lo + 1; } } /* Evaluate offset for requested block. This algorithm has only been tested in 2D and is otherwise completely incomprehensible. */ offset = 0; for (i=0; i= nblocks) pnga_error("block index outside allowed values",index); if (GA[handle].block_sl_flag == 0) { offset = 0; inode = index%GAnproc; for (i=inode; i= GAnproc) pnga_error("processor index outside allowed values",index); if (index != GAme) pnga_error("Only get accurate number of elements for processor making request",0); lptr = GA[handle].ptr[index]; *len = GA[handle].size/GA[handle].elemsize; *(char**)ptr = lptr; GA_POP_NAME; } /** * Provide access to a patch of a Global Array using an index */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_idx = pnga_access_idx #endif void pnga_access_idx(Integer g_a, Integer lo[], Integer hi[], AccessIndex* index, Integer ld[]) { char *ptr; Integer handle = GA_OFFSET + g_a; Integer ow,i,p_handle; unsigned long elemsize; unsigned long lref=0, lptr; GA_PUSH_NAME("nga_access"); p_handle = GA[handle].p_handle; if(!pnga_locate(g_a,lo,&ow))pnga_error("locate top failed",0); if (p_handle != -1) ow = PGRP_LIST[p_handle].inv_map_proc_list[ow]; if ((armci_domain_id(ARMCI_DOMAIN_SMP, ow) != armci_domain_my_id(ARMCI_DOMAIN_SMP)) && (ow != GAme)) pnga_error("cannot access top of the patch",ow); if(!pnga_locate(g_a,hi, &ow))pnga_error("locate bottom failed",0); if (p_handle != -1) ow = PGRP_LIST[p_handle].inv_map_proc_list[ow]; if ((armci_domain_id(ARMCI_DOMAIN_SMP, ow) != armci_domain_my_id(ARMCI_DOMAIN_SMP)) && (ow != GAme)) pnga_error("cannot access bottom of the patch",ow); for (i=0; ihi[i]) { ga_RegionError(GA[handle].ndim, lo, hi, g_a); } if (p_handle != -1) ow = PGRP_LIST[p_handle].map_proc_list[ow]; gam_Location(ow,handle, lo, &ptr, ld); /* * return patch address as the distance elements from the reference address * * .in Fortran we need only the index to the type array: dbl_mb or int_mb * that are elements of COMMON in the the mafdecls.h include file * .in C we need both the index and the pointer */ elemsize = (unsigned long)GA[handle].elemsize; /* compute index and check if it is correct */ switch (pnga_type_c2f(GA[handle].type)){ case MT_F_DBL: *index = (AccessIndex) ((DoublePrecision*)ptr - DBL_MB); lref = (unsigned long)DBL_MB; break; case MT_F_DCPL: *index = (AccessIndex) ((DoubleComplex*)ptr - DCPL_MB); lref = (unsigned long)DCPL_MB; break; case MT_F_SCPL: *index = (AccessIndex) ((SingleComplex*)ptr - SCPL_MB); lref = (unsigned long)SCPL_MB; break; case MT_F_INT: *index = (AccessIndex) ((Integer*)ptr - INT_MB); lref = (unsigned long)INT_MB; break; case MT_F_REAL: *index = (AccessIndex) ((float*)ptr - FLT_MB); lref = (unsigned long)FLT_MB; break; } #ifdef BYTE_ADDRESSABLE_MEMORY /* check the allignment */ lptr = (unsigned long)ptr; if( lptr%elemsize != lref%elemsize ){ printf("%d: lptr=%lu(%lu) lref=%lu(%lu)\n",(int)GAme,lptr,lptr%elemsize, lref,lref%elemsize); pnga_error("nga_access: MA addressing problem: base address misallignment", handle); } #endif /* adjust index for Fortran addressing */ (*index) ++ ; FLUSH_CACHE; GA_POP_NAME; } /*\ PROVIDE ACCESS TO AN INDIVIDUAL DATA BLOCK OF A GLOBAL ARRAY \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_block_idx = pnga_access_block_idx #endif void pnga_access_block_idx(Integer g_a, Integer idx, AccessIndex* index, Integer *ld) { char *ptr; Integer handle = GA_OFFSET + g_a; Integer /*p_handle,*/ iblock; unsigned long elemsize; unsigned long lref=0, lptr; GA_PUSH_NAME("nga_access_block"); /*p_handle = GA[handle].p_handle;*/ iblock = idx; if (iblock < 0 || iblock >= GA[handle].block_total) pnga_error("block index outside allowed values",iblock); pnga_access_block_ptr(g_a,iblock,&ptr,ld); /* * return patch address as the distance elements from the reference address * * .in Fortran we need only the index to the type array: dbl_mb or int_mb * that are elements of COMMON in the the mafdecls.h include file * .in C we need both the index and the pointer */ elemsize = (unsigned long)GA[handle].elemsize; /* compute index and check if it is correct */ switch (pnga_type_c2f(GA[handle].type)){ case MT_F_DBL: *index = (AccessIndex) ((DoublePrecision*)ptr - DBL_MB); lref = (unsigned long)DBL_MB; break; case MT_F_DCPL: *index = (AccessIndex) ((DoubleComplex*)ptr - DCPL_MB); lref = (unsigned long)DCPL_MB; break; case MT_F_SCPL: *index = (AccessIndex) ((SingleComplex*)ptr - SCPL_MB); lref = (unsigned long)SCPL_MB; break; case MT_F_INT: *index = (AccessIndex) ((Integer*)ptr - INT_MB); lref = (unsigned long)INT_MB; break; case MT_F_REAL: *index = (AccessIndex) ((float*)ptr - FLT_MB); lref = (unsigned long)FLT_MB; break; } #ifdef BYTE_ADDRESSABLE_MEMORY /* check the allignment */ lptr = (unsigned long)ptr; if( lptr%elemsize != lref%elemsize ){ printf("%d: lptr=%lu(%lu) lref=%lu(%lu)\n",(int)GAme,lptr,lptr%elemsize, lref,lref%elemsize); pnga_error("nga_access: MA addressing problem: base address misallignment", handle); } #endif /* adjust index for Fortran addressing */ (*index) ++ ; FLUSH_CACHE; GA_POP_NAME; } /** * Provide access to an individual data block of a Global Array * with a SCALAPACK type block-cyclic data distribution */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_block_grid_idx = pnga_access_block_grid_idx #endif void pnga_access_block_grid_idx(Integer g_a, Integer* subscript, AccessIndex *index, Integer *ld) { char *ptr; Integer handle = GA_OFFSET + g_a; Integer i,ndim/*,p_handle*/; unsigned long elemsize; unsigned long lref=0, lptr; GA_PUSH_NAME("nga_access_block_grid"); /*p_handle = GA[handle].p_handle;*/ ndim = GA[handle].ndim; for (i=0; i= GA[handle].num_blocks[i]) pnga_error("index outside allowed values",subscript[i]); pnga_access_block_grid_ptr(g_a,subscript,&ptr,ld); /* * return patch address as the distance elements from the reference address * * .in Fortran we need only the index to the type array: dbl_mb or int_mb * that are elements of COMMON in the the mafdecls.h include file * .in C we need both the index and the pointer */ elemsize = (unsigned long)GA[handle].elemsize; /* compute index and check if it is correct */ switch (pnga_type_c2f(GA[handle].type)){ case MT_F_DBL: *index = (AccessIndex) ((DoublePrecision*)ptr - DBL_MB); lref = (unsigned long)DBL_MB; break; case MT_F_DCPL: *index = (AccessIndex) ((DoubleComplex*)ptr - DCPL_MB); lref = (unsigned long)DCPL_MB; break; case MT_F_SCPL: *index = (AccessIndex) ((SingleComplex*)ptr - SCPL_MB); lref = (unsigned long)SCPL_MB; break; case MT_F_INT: *index = (AccessIndex) ((Integer*)ptr - INT_MB); lref = (unsigned long)INT_MB; break; case MT_F_REAL: *index = (AccessIndex) ((float*)ptr - FLT_MB); lref = (unsigned long)FLT_MB; break; } #ifdef BYTE_ADDRESSABLE_MEMORY /* check the allignment */ lptr = (unsigned long)ptr; if( lptr%elemsize != lref%elemsize ){ printf("%d: lptr=%lu(%lu) lref=%lu(%lu)\n",(int)GAme,lptr,lptr%elemsize, lref,lref%elemsize); pnga_error("nga_access: MA addressing problem: base address misallignment", handle); } #endif /* adjust index for Fortran addressing */ (*index) ++ ; FLUSH_CACHE; GA_POP_NAME; } /*\ PROVIDE ACCESS TO A PATCH OF A GLOBAL ARRAY \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_access_block_segment_idx = pnga_access_block_segment_idx #endif void pnga_access_block_segment_idx(Integer g_a, Integer proc, AccessIndex* index, Integer *len) { char *ptr; Integer handle = GA_OFFSET + g_a; /*Integer p_handle;*/ unsigned long elemsize; unsigned long lref=0, lptr; GA_PUSH_NAME("nga_access_block_segment"); /*p_handle = GA[handle].p_handle;*/ /* * return patch address as the distance elements from the reference address * * .in Fortran we need only the index to the type array: dbl_mb or int_mb * that are elements of COMMON in the the mafdecls.h include file * .in C we need both the index and the pointer */ pnga_access_block_segment_ptr(g_a, proc, &ptr, len); elemsize = (unsigned long)GA[handle].elemsize; /* compute index and check if it is correct */ switch (pnga_type_c2f(GA[handle].type)){ case MT_F_DBL: *index = (AccessIndex) ((DoublePrecision*)ptr - DBL_MB); lref = (unsigned long)DBL_MB; break; case MT_F_DCPL: *index = (AccessIndex) ((DoubleComplex*)ptr - DCPL_MB); lref = (unsigned long)DCPL_MB; break; case MT_F_SCPL: *index = (AccessIndex) ((SingleComplex*)ptr - SCPL_MB); lref = (unsigned long)SCPL_MB; break; case MT_F_INT: *index = (AccessIndex) ((Integer*)ptr - INT_MB); lref = (unsigned long)INT_MB; break; case MT_F_REAL: *index = (AccessIndex) ((float*)ptr - FLT_MB); lref = (unsigned long)FLT_MB; break; } #ifdef BYTE_ADDRESSABLE_MEMORY /* check the allignment */ lptr = (unsigned long)ptr; if( lptr%elemsize != lref%elemsize ){ printf("%d: lptr=%lu(%lu) lref=%lu(%lu)\n",(int)GAme,lptr,lptr%elemsize, lref,lref%elemsize); pnga_error("nga_access_block_segment: MA addressing problem: base address misallignment", handle); } #endif /* adjust index for Fortran addressing */ (*index) ++ ; FLUSH_CACHE; GA_POP_NAME; } /** * Release access to a patch of a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_release = pnga_release #endif void pnga_release(Integer g_a, Integer *lo, Integer *hi) {} /** * Release access and update a patch of a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_release_update = pnga_release_update #endif void pnga_release_update(Integer g_a, Integer *lo, Integer *hi) {} /** * Release access to a block in a block-cyclic Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_release_block = pnga_release_block #endif void pnga_release_block(Integer g_a, Integer iblock) { /* Integer i; Integer handle = GA_OFFSET + g_a; for (i=0; i 0) iproc = GA[handle].rank_rstrctd[iproc]; gaShmemLocation(iproc, g_a, ilo, jlo, &ptr_ref, &ldp); } else { /* Integer lo[2]; lo[0] = ilo; lo[1] = jlo; */ pnga_access_block_ptr(g_a, iproc, &ptr_ref, &ldp); pnga_release_block(g_a, iproc); if (GA[handle].block_sl_flag == 0) { proc = proc%pnga_nnodes(); } else { Integer index[2]; gam_find_block_indices(handle, proc, index); index[0] = index[0]%GA[handle].nblock[0]; index[1] = index[1]%GA[handle].nblock[1]; gam_find_proc_from_sl_indices(handle,proc,index); } } type = GA[handle].type; item_size = GAsizeofM(type); ptr_src = gai_malloc((int)nv*2*sizeof(void*)); if(ptr_src==NULL)pnga_error("gai_malloc failed",nv); ptr_dst=ptr_src+ nv; for(k=0; k< nv; k++){ if(i[k] < ilo || i[k] > ihi || j[k] < jlo || j[k] > jhi){ char err_string[ERR_STR_LEN]; sprintf(err_string,"proc=%d invalid i/j=(%ld,%ld)>< [%ld:%ld,%ld:%ld]", (int)proc, (long)i[k], (long)j[k], (long)ilo, (long)ihi, (long)jlo, (long)jhi); pnga_error(err_string,g_a); } offset = (j[k] - jlo)* ldp + i[k] - ilo; ptr_dst[k] = ptr_ref + item_size * offset; ptr_src[k] = ((char*)v) + k*item_size; } desc.bytes = (int)item_size; desc.src_ptr_array = ptr_src; desc.dst_ptr_array = ptr_dst; desc.ptr_array_len = (int)nv; if(GA_fence_set)fence_array[proc]=1; #ifdef PERMUTE_PIDS if(GA_Proc_list) proc = GA_inv_Proc_list[proc]; #endif if (p_handle >= 0) { proc = PGRP_LIST[p_handle].inv_map_proc_list[proc]; } if(alpha != NULL) { int optype=-1; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else if(type==C_FLOAT)optype= ARMCI_ACC_FLT; else pnga_error("type not supported",type); rc= ARMCI_AccV(optype, alpha, &desc, 1, (int)proc); } if(rc) pnga_error("scatter/_acc failed in armci",rc); gai_free(ptr_src); GA_POP_NAME; } /** * Scatter nv elements of v into a Global Array at locations specified * by arrays i and j */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scatter2d = pnga_scatter2d #endif void pnga_scatter2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv) { register Integer k; Integer kk; Integer item_size; Integer proc, type=GA[GA_OFFSET + g_a].type; Integer nproc, p_handle, iproc; Integer subscrpt[2]; Integer *aproc, naproc; /* active processes and numbers */ Integer *map; /* map the active processes to allocated space */ char *buf1, *buf2; Integer handle = g_a + GA_OFFSET; Integer *count; /* counters for each process */ Integer *nelem; /* number of elements for each process */ /* source and destination pointers for each process */ void ***ptr_src, ***ptr_dst; void **ptr_org; /* the entire pointer array */ armci_giov_t desc; Integer *ilo, *ihi, *jlo, *jhi, *ldp, *owner; Integer lo[2], hi[2]; char **ptr_ref; int use_blocks; Integer num_blocks=0; if (nv < 1) return; ga_check_handleM(g_a, "ga_scatter"); GA_PUSH_NAME("ga_scatter"); GAstat.numsca++; /* determine how many processors are associated with array */ p_handle = GA[handle].p_handle; if (p_handle < 0) { nproc = GAnproc; if (GA[handle].num_rstrctd > 0) { nproc = GA[handle].num_rstrctd; } } else { nproc = PGRP_LIST[p_handle].map_nproc; } use_blocks = GA[handle].block_flag; /* allocate temp memory */ if (!use_blocks) { buf1 = gai_malloc((int) (nproc *4 +nv)* (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*nproc); } else { num_blocks = GA[handle].block_total; buf1 = gai_malloc((int) (num_blocks *4 +nv)* (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*num_blocks); } owner = (Integer *)buf1; count = owner+ nv; if (!use_blocks) { nelem = count + nproc; aproc = count + 2 * nproc; map = count + 3 * nproc; } else { nelem = count + num_blocks; aproc = count + 2 * num_blocks; map = count + 3 * num_blocks; } /* initialize the counters and nelem */ if (!use_blocks) { for(kk=0; kk 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } else { for(k=0; k 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } GAstat.numsca_procs += naproc; buf2 = gai_malloc((int)(2*naproc*sizeof(void **) + 2*nv*sizeof(void *) + 5*naproc*sizeof(Integer) + naproc*sizeof(char*))); if(buf2 == NULL) pnga_error("gai_malloc failed", naproc); ptr_src = (void ***)buf2; ptr_dst = (void ***)(buf2 + naproc*sizeof(void **)); ptr_org = (void **)(buf2 + 2*naproc*sizeof(void **)); ptr_ref = (char **)(buf2+2*naproc*sizeof(void **)+2*nv*sizeof(void *)); ilo = (Integer *)(((char*)ptr_ref) + naproc*sizeof(char*)); ihi = ilo + naproc; jlo = ihi + naproc; jhi = jlo + naproc; ldp = jhi + naproc; if (!use_blocks) { for(kk=0; kk 0) iproc = GA[handle].rstrctd_list[iproc]; pnga_distribution(g_a, iproc, lo, hi); ilo[kk] = lo[0]; jlo[kk] = lo[1]; ihi[kk] = hi[0]; jhi[kk] = hi[1]; /* get address of the first element owned by proc */ gaShmemLocation(aproc[kk], g_a, ilo[kk], jlo[kk], &(ptr_ref[kk]), &(ldp[kk])); } } else { for(kk=0; kk 0) proc = GA[handle].rank_rstrctd[owner[k]]; this_count = count[proc]; count[proc]++; proc = map[proc]; ptr_src[proc][this_count] = ((char*)v) + k * item_size; if(i[k] < ilo[proc] || i[k] > ihi[proc] || j[k] < jlo[proc] || j[k] > jhi[proc]){ char err_string[ERR_STR_LEN]; sprintf(err_string,"proc=%d invalid i/j=(%ld,%ld)><[%ld:%ld,%ld:%ld]", (int)proc, (long)i[k], (long)j[k], (long)ilo[proc], (long)ihi[proc], (long)jlo[proc], (long)jhi[proc]); pnga_error(err_string, g_a); } ptr_dst[proc][this_count] = ptr_ref[proc] + item_size * ((j[k] - jlo[proc])* ldp[proc] + i[k] - ilo[proc]); } /* source and destination pointers are ready for all processes */ if (!use_blocks) { for(k=0; k 0) iproc = GA[handle].rstrctd_list[iproc]; } else { iproc = PGRP_LIST[p_handle].inv_map_proc_list[aproc[k]]; } rc = ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } else { if (GA[handle].block_sl_flag == 0) { for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc = ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } else { Integer index[MAXDIM]; for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc = ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } } gai_free(buf2); gai_free(buf1); GA_POP_NAME; } /** * Add elements of v to contents at random locations in Global Array * specified by vectors i and j */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scatter_acc2d = pnga_scatter_acc2d #endif void pnga_scatter_acc2d(g_a, v, i, j, nv, alpha) Integer g_a, nv, *i, *j; void *v, *alpha; { register Integer k; Integer item_size; Integer first, nelem, proc, type=GA[GA_OFFSET + g_a].type; Integer *int_ptr; Integer subscrpt[2]; if (nv < 1) return; ga_check_handleM(g_a, "ga_scatter_acc"); GA_PUSH_NAME("ga_scatter_acc"); GAstat.numsca++; int_ptr = (Integer*) ga_malloc(nv, MT_F_INT, "ga_scatter_acc--p"); /* find proc that owns the (i,j) element; store it in temp: int_ptr */ for(k=0; k< nv; k++) { subscrpt[0] = *(i+k); subscrpt[1] = *(j+k); if(! pnga_locate(g_a, subscrpt, int_ptr+k)){ char err_string[ERR_STR_LEN]; sprintf(err_string,"invalid i/j=(%ld,%ld)", (long)i[k], (long)j[k]); pnga_error(err_string,g_a); } } /* determine limit for message size -- v,i, & j will travel together */ item_size = GAsizeofM(type); GAbytes.scatot += (double)item_size*nv ; /* Sort the entries by processor */ ga_sort_scat(&nv, v, i, j, int_ptr, type ); /* go through the list again executing scatter for each processor */ first = 0; do { proc = int_ptr[first]; nelem = 0; /* count entries for proc from "first" to last */ for(k=first; k< nv; k++){ if(proc == int_ptr[k]) nelem++; else break; } if(proc == GAme){ GAbytes.scaloc += (double)item_size* nelem ; } gai_scatter_acc_local(g_a, ((char*)v)+item_size*first, i+first, j+first, nelem, alpha, proc); first += nelem; }while (first< nv); ga_free(int_ptr); GA_POP_NAME; } #define SCATTER -99 #define GATHER -98 #define SCATTER_ACC -97 /*\ GATHER OPERATION elements from the global array into v \*/ void gai_gatscat(int op, Integer g_a, void* v, Integer subscript[], Integer nv, double *locbytes, double* totbytes, void *alpha) { Integer k, handle=g_a+GA_OFFSET; int ndim, item_size, type; Integer *proc; Integer nproc, p_handle, iproc; Integer *aproc, naproc; /* active processes and numbers */ Integer *map; /* map the active processes to allocated space */ char *buf1, *buf2; Integer *count; /* counters for each process */ Integer *nelem; /* number of elements for each process */ /* source and destination pointers for each process */ void ***ptr_src, ***ptr_dst; void **ptr_org; /* the entire pointer array */ armci_giov_t desc; int use_blocks; Integer num_blocks=0; GA_PUSH_NAME("gai_gatscat"); proc=(Integer *)ga_malloc(nv, MT_F_INT, "ga_gat-p"); ndim = GA[handle].ndim; type = GA[handle].type; item_size = GA[handle].elemsize; *totbytes += (double)item_size*nv; /* determine how many processors are associated with array */ p_handle = GA[handle].p_handle; if (p_handle < 0) { nproc = GAnproc; if (GA[handle].num_rstrctd > 0) nproc = GA[handle].num_rstrctd; } else { nproc = PGRP_LIST[p_handle].map_nproc; } use_blocks = GA[handle].block_flag; /* allocate temp memory */ if (!use_blocks) { buf1 = gai_malloc((int) nproc * 4 * (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*nproc); } else { num_blocks = GA[handle].block_total; buf1 = gai_malloc((int) num_blocks * 4 * (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*num_blocks); } count = (Integer *)buf1; if (!use_blocks) { nelem = (Integer *)(buf1 + nproc * sizeof(Integer)); aproc = (Integer *)(buf1 + 2 * nproc * sizeof(Integer)); map = (Integer *)(buf1 + 3 * nproc * sizeof(Integer)); } else { num_blocks = GA[handle].block_total; nelem = (Integer *)(buf1 + num_blocks * sizeof(Integer)); aproc = (Integer *)(buf1 + 2 * num_blocks * sizeof(Integer)); map = (Integer *)(buf1 + 3 * num_blocks * sizeof(Integer)); } /* initialize the counters and nelem */ if (!use_blocks) { for(k=0; k 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } else { for(k=0; k 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } buf2 = gai_malloc((int)(2*naproc*sizeof(void **) + 2*nv*sizeof(void *))); if(buf2 == NULL) pnga_error("gai_malloc failed", 2*naproc); ptr_src = (void ***)buf2; ptr_dst = (void ***)(buf2 + naproc * sizeof(void **)); ptr_org = (void **)(buf2 + 2 * naproc * sizeof(void **)); /* set the pointers as * P0 P1 P0 P1 * ptr_src[0] ptr_src[1] ... ptr_dst[0] ptr_dst[1] ... * \ \ \ \ * ptr_org |-------------------------------|---------------------------| * | nv | nv | * | nelem[0] | nelem[1] |... | nelem[0] | nelem[1] |... */ ptr_src[0] = ptr_org; ptr_dst[0] = ptr_org + nv; for(k=1; k 0) iproc = GA[handle].rank_rstrctd[iproc]; ptr_dst[map[iproc]][count[iproc]] = ((char*)v) + k * item_size; if (p_handle != 0) { gam_Loc_ptr(iproc, handle, (subscript+k*ndim), ptr_src[map[iproc]]+count[iproc]); } else { gam_Loc_ptr(proc[k], handle, (subscript+k*ndim), ptr_src[map[iproc]]+count[iproc]); } count[iproc]++; } } else { Integer lo[MAXDIM], hi[MAXDIM], ld[MAXDIM]; Integer j, jtot, last, offset; for(k=0; k 0) iproc = GA[handle].rstrctd_list[iproc]; } else { iproc = PGRP_LIST[p_handle].inv_map_proc_list[aproc[k]]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } else { if (GA[handle].block_sl_flag == 0) { for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } else { Integer j, index[MAXDIM]; for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } } GAstat.numgat_procs += naproc; break; case SCATTER: /* go through all the elements * for process 0: ptr_src[0][0, 1, ...] = v + offset0... * ptr_dst[0][0, 1, ...] = subscript + offset0... * for process 1: ptr_src[1][...] ... * ptr_dst[1][...] ... */ if (!use_blocks) { for(k=0; k 0) iproc = GA[handle].rank_rstrctd[iproc]; ptr_src[map[iproc]][count[iproc]] = ((char*)v) + k * item_size; if (p_handle != 0) { gam_Loc_ptr(iproc, handle, (subscript+k*ndim), ptr_dst[map[iproc]]+count[iproc]); } else { gam_Loc_ptr(proc[k], handle, (subscript+k*ndim), ptr_dst[map[iproc]]+count[iproc]); } count[iproc]++; } } else { Integer lo[MAXDIM], hi[MAXDIM], ld[MAXDIM]; Integer j, jtot, last, offset; for(k=0; k 0) iproc = GA[handle].rstrctd_list[iproc]; } else { iproc = PGRP_LIST[p_handle].inv_map_proc_list[aproc[k]]; } if(GA_fence_set) fence_array[iproc]=1; rc=ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } else { if (GA[handle].block_sl_flag == 0) { for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } if(GA_fence_set) fence_array[iproc]=1; rc=ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } else { Integer j, index[MAXDIM]; for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } if(GA_fence_set) fence_array[iproc]=1; rc=ARMCI_PutV(&desc, 1, (int)iproc); if(rc) pnga_error("scatter failed in armci",rc); } } } GAstat.numsca_procs += naproc; break; case SCATTER_ACC: /* go through all the elements * for process 0: ptr_src[0][0, 1, ...] = v + offset0... * ptr_dst[0][0, 1, ...] = subscript + offset0... * for process 1: ptr_src[1][...] ... * ptr_dst[1][...] ... */ if (!use_blocks) { for(k=0; k 0) iproc = GA[handle].rank_rstrctd[iproc]; ptr_src[map[iproc]][count[iproc]] = ((char*)v) + k * item_size; if (p_handle != 0) { gam_Loc_ptr(iproc, handle, (subscript+k*ndim), ptr_dst[map[iproc]]+count[iproc]); } else { gam_Loc_ptr(proc[k], handle, (subscript+k*ndim), ptr_dst[map[iproc]]+count[iproc]); } count[iproc]++; } } else { Integer lo[MAXDIM], hi[MAXDIM], ld[MAXDIM]; Integer j, jtot, last, offset; for(k=0; k 0) iproc = GA[handle].rstrctd_list[iproc]; } else { iproc = PGRP_LIST[p_handle].inv_map_proc_list[aproc[k]]; } if(GA_fence_set) fence_array[iproc]=1; if(alpha != NULL) { int optype=-1; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else if(type==C_FLOAT)optype= ARMCI_ACC_FLT; else pnga_error("type not supported",type); rc= ARMCI_AccV(optype, alpha, &desc, 1, (int)iproc); } if(rc) pnga_error("scatter_acc failed in armci",rc); } } else { if (GA[handle].block_sl_flag == 0) { for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } if(GA_fence_set) fence_array[iproc]=1; if(alpha != NULL) { int optype=-1; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else if(type==C_FLOAT)optype= ARMCI_ACC_FLT; else pnga_error("type not supported",type); rc= ARMCI_AccV(optype, alpha, &desc, 1, (int)iproc); } if(rc) pnga_error("scatter_acc failed in armci",rc); } } else { Integer j, index[MAXDIM]; for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } if(GA_fence_set) fence_array[iproc]=1; if(alpha != NULL) { int optype=-1; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else if(type==C_FLOAT)optype= ARMCI_ACC_FLT; else pnga_error("type not supported",type); rc= ARMCI_AccV(optype, alpha, &desc, 1, (int)iproc); } if(rc) pnga_error("scatter_acc failed in armci",rc); } } } break; default: pnga_error("operation not supported",op); } gai_free(buf2); gai_free(buf1); ga_free(proc); GA_POP_NAME; } /** * Preallocate data for internal linked-list arrays for gather/scatter calls. * @param nelems: the maximum number of elements that will be moved in * gather/scatter call using these arrays. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_alloc_gatscat_buf = pnga_alloc_gatscat_buf #endif void pnga_alloc_gatscat_buf(Integer nelems) { Integer nprocs = pnga_nnodes(); if (GA_prealloc_gatscat) pnga_error("Gather/scatter buffers already allocated",nelems); GA_prealloc_gatscat = nelems; GA_header =(Integer *)ga_malloc(nprocs, MT_F_INT, "ga_gat_header"); GA_list =(Integer *)ga_malloc(nelems, MT_F_INT, "ga_gat_list"); GA_elems =(Integer *)ga_malloc(nprocs, MT_F_INT, "ga_gat_nelems"); } /** * Free up preallocate data for internal linked-list arrays for gather/scatter calls. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_free_gatscat_buf = pnga_free_gatscat_buf #endif void pnga_free_gatscat_buf() { if (!GA_prealloc_gatscat) pnga_error("Gather/scatter buffers not allocated",0); GA_prealloc_gatscat = 0; ga_free(GA_elems); ga_free(GA_list); ga_free(GA_header); } #define gam_c2f_index(index_c, index_f, ndim) \ { \ Integer _i; \ for (_i = 0; _i < (ndim); _i++) { \ index_f[_i] = (Integer)(index_c[(ndim)-1-_i]+1); \ } \ } /*\ GATHER OPERATION elements from the global array into v \*/ void gai_gatscat_new(int op, Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv, double *locbytes, double* totbytes, void *alpha) { Integer handle=g_a+GA_OFFSET; int ndim, i, j, k, type, item_size; Integer idx, p_handle, num_rstrctd; Integer *proc; Integer nprocs, me, iproc, tproc, index[MAXDIM]; Integer lo[MAXDIM], hi[MAXDIM], ld[MAXDIM-1]; Integer jtot, last, offset; Integer *subscript_ptr; Integer *header, *list, *nelems; char *buf; void **ptr_rem, **ptr_loc; int rc, maxlen, use_blocks, use_sl_blocks; int *nblock; armci_giov_t desc; GA_PUSH_NAME("gai_gatscat_new"); me = pnga_nodeid(); num_rstrctd = GA[handle].num_rstrctd; use_blocks = GA[handle].block_flag; use_sl_blocks = GA[handle].block_sl_flag; nblock = GA[handle].nblock; /* determine how many processors are associated with array */ p_handle = GA[handle].p_handle; if (p_handle < 0) { nprocs = GAnproc; if (num_rstrctd > 0) nprocs = num_rstrctd; } else { nprocs = PGRP_LIST[p_handle].map_nproc; } if (!GA_prealloc_gatscat) { header =(Integer *)ga_malloc(nprocs, MT_F_INT, "ga_gat_header"); list =(Integer *)ga_malloc(nv, MT_F_INT, "ga_gat_list"); nelems =(Integer *)ga_malloc(nprocs, MT_F_INT, "ga_gat_nelems"); } else { if (GA_prealloc_gatscat < nv) pnga_error("Gather/scatter vector exceeds allocation length ", GA_prealloc_gatscat); header = (Integer*)GA_header; list = (Integer*)GA_list; nelems = (Integer*)GA_elems; } ndim = GA[handle].ndim; type = GA[handle].type; item_size = GA[handle].elemsize; *totbytes = item_size * nv; /* Initialize linked list data structures */ for (i=0; i 0) idx = GA[handle].rank_rstrctd[idx]; /* map from block to processor, if necessary */ if (use_blocks) { if (use_sl_blocks == 0) { idx = idx%nprocs; } else { gam_find_block_indices(handle,idx,index); for (j=0; j 0) { /* loop through linked list to find all data elements associated with * the remote processor iproc */ idx = header[iproc]; j = 0; while (idx > -1) { if (c_flag) { gam_c2f_index(((int**)subscript)[idx], index, ndim); subscript_ptr = index; } else { subscript_ptr = ((Integer*)subscript)+idx*ndim; } if (!use_blocks) { /* gam_Loc_ptr modifies the value of the processor variable for * restricted arrays or processor groups, so make a temporary copy */ tproc = iproc; gam_Loc_ptr(tproc, handle, (subscript_ptr), ptr_rem+j); } else { /* TODO: Figure out how to get correct pointers for block cyclic * distributions */ /* find block index from subscript */ if(!pnga_locate(g_a, subscript_ptr, &tproc)) { gai_print_subscript("invalid subscript for block-cyclic array", ndim, subscript_ptr,"\n"); pnga_error("failed -element:",idx); } pnga_distribution(g_a, tproc, lo, hi); pnga_access_block_ptr(g_a, tproc, ptr_rem+j, ld); pnga_release_block(g_a, tproc); offset = 0; last = ndim -1; jtot = 1; for (k=0; k 0) { tproc = GA[handle].rstrctd_list[iproc]; } else { if (p_handle < 0) { tproc = iproc; } else { tproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } } /* perform vector operation */ switch(op) { case GATHER: desc.bytes = (int)item_size; desc.src_ptr_array = ptr_rem; desc.dst_ptr_array = ptr_loc; desc.ptr_array_len = (int)nelems[iproc]; rc=ARMCI_GetV(&desc, 1, (int)tproc); if(rc) pnga_error("gather failed in armci",rc); break; case SCATTER: desc.bytes = (int)item_size; desc.src_ptr_array = ptr_loc; desc.dst_ptr_array = ptr_rem; desc.ptr_array_len = (int)nelems[iproc]; rc=ARMCI_PutV(&desc, 1, (int)tproc); if(rc) pnga_error("scatter failed in armci",rc); break; case SCATTER_ACC: desc.bytes = (int)item_size; desc.src_ptr_array = ptr_loc; desc.dst_ptr_array = ptr_rem; desc.ptr_array_len = (int)nelems[iproc]; if(alpha != NULL) { int optype=-1; if(type==C_DBL) optype= ARMCI_ACC_DBL; else if(type==C_DCPL)optype= ARMCI_ACC_DCP; else if(type==C_SCPL)optype= ARMCI_ACC_CPL; else if(type==C_INT)optype= ARMCI_ACC_INT; else if(type==C_LONG)optype= ARMCI_ACC_LNG; else if(type==C_FLOAT)optype= ARMCI_ACC_FLT; else pnga_error("type not supported",type); rc= ARMCI_AccV(optype, alpha, &desc, 1, (int)tproc); } if(rc) pnga_error("scatter_acc failed in armci",rc); break; default: pnga_error("operation not supported",op); } } } gai_free(buf); if (!GA_prealloc_gatscat) { ga_free(nelems); ga_free(list); ga_free(header); } GA_POP_NAME; } /** * Gather random elements from a global array into local buffer v \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_gather = pnga_gather #endif void pnga_gather(Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv) { if (nv < 1) return; ga_check_handleM(g_a, "nga_gather"); GA_PUSH_NAME("nga_gather"); GAstat.numgat++; #ifdef USE_GATSCAT_NEW gai_gatscat_new(GATHER,g_a,v,subscript,c_flag,nv,&GAbytes.gattot,&GAbytes.gatloc, NULL); #else gai_gatscat(GATHER,g_a,v,subscript,nv,&GAbytes.gattot,&GAbytes.gatloc, NULL); #endif GA_POP_NAME; } /** * Scatter elements from a local buffer v into random locations in a Global * Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scatter = pnga_scatter #endif void pnga_scatter(Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv) { if (nv < 1) return; ga_check_handleM(g_a, "nga_scatter"); GA_PUSH_NAME("nga_scatter"); GAstat.numsca++; #ifdef USE_GATSCAT_NEW gai_gatscat_new(SCATTER,g_a,v,subscript,c_flag,nv,&GAbytes.scatot,&GAbytes.scaloc, NULL); #else gai_gatscat(SCATTER,g_a,v,subscript,nv,&GAbytes.scatot,&GAbytes.scaloc, NULL); #endif GA_POP_NAME; } /** * Add elements of v to contents at random locations in Global Array * specified by array subscript */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scatter_acc = pnga_scatter_acc #endif void pnga_scatter_acc(Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv, void *alpha) { if (nv < 1) return; ga_check_handleM(g_a, "nga_scatter_acc"); GA_PUSH_NAME("nga_scatter_acc"); GAstat.numsca++; #ifdef USE_GATSCAT_NEW gai_gatscat_new(SCATTER_ACC, g_a, v, subscript, c_flag, nv, &GAbytes.scatot, &GAbytes.scaloc, alpha); #else gai_gatscat(SCATTER_ACC, g_a, v, subscript, nv, &GAbytes.scatot, &GAbytes.scaloc, alpha); #endif GA_POP_NAME; } #if 000 void FATR ga_gather000_(g_a, v, i, j, nv) Integer g_a, nv, *i, *j; void *v; { int k; Integer *sbar = (Integer*)malloc(2*sizeof(Integer)* (int)nv); if(!sbar) pnga_error("gather:malloc failed",nv); for(k=0;k 0) { nproc = GA[handle].num_rstrctd; } } else { nproc = PGRP_LIST[p_handle].map_nproc; } use_blocks = GA[handle].block_flag; /* allocate temp memory */ if (!use_blocks) { buf1 = gai_malloc((int)(nproc *4 + nv)* (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*nproc); } else { num_blocks = GA[handle].block_total; buf1 = gai_malloc((int)(num_blocks *4 + nv)* (sizeof(Integer))); if(buf1 == NULL) pnga_error("gai_malloc failed", 3*num_blocks); } owner = (Integer *)buf1; count = owner+ nv; if (!use_blocks) { nelem = count + nproc; aproc = count + 2 * nproc; map = count + 3 * nproc; } else { nelem = count + num_blocks; aproc = count + 2 * num_blocks; map = count + 3 * num_blocks; } if (!use_blocks) { /* initialize the counters and nelem */ for(kk=0; kk 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } else { for(k=0; k 0) { aproc[naproc] = k; map[k] = naproc; naproc ++; } } GAstat.numgat_procs += naproc; buf2 = gai_malloc((int)(2*naproc*sizeof(void **) + 2*nv*sizeof(void *) + 5*naproc*sizeof(Integer) + naproc*sizeof(char*))); if(buf2 == NULL) pnga_error("gai_malloc failed", naproc); ptr_src = (void ***)buf2; ptr_dst = (void ***)(buf2 + naproc*sizeof(void **)); ptr_org = (void **)(buf2 + 2*naproc*sizeof(void **)); ptr_ref = (char **)(buf2+2*naproc*sizeof(void **)+2*nv*sizeof(void *)); ilo = (Integer *)(((char*)ptr_ref) + naproc*sizeof(char*)); ihi = ilo + naproc; jlo = ihi + naproc; jhi = jlo + naproc; ldp = jhi + naproc; if (!use_blocks) { for(kk=0; kk 0) iproc = GA[handle].rstrctd_list[iproc]; pnga_distribution(g_a, iproc, lo, hi); ilo[kk] = lo[0]; jlo[kk] = lo[1]; ihi[kk] = hi[0]; jhi[kk] = hi[1]; /* get address of the first element owned by proc */ gaShmemLocation(aproc[kk], g_a, ilo[kk], jlo[kk], &(ptr_ref[kk]), &(ldp[kk])); } } else { for(kk=0; kk 0) proc = GA[handle].rank_rstrctd[owner[k]]; this_count = count[proc]; count[proc]++; proc = map[proc]; ptr_dst[proc][this_count] = ((char*)v) + k * item_size; if(i[k] < ilo[proc] || i[k] > ihi[proc] || j[k] < jlo[proc] || j[k] > jhi[proc]){ char err_string[ERR_STR_LEN]; sprintf(err_string,"proc=%d invalid i/j=(%ld,%ld)><[%ld:%ld,%ld:%ld]", (int)proc,(long)i[k],(long)j[k], (long)ilo[proc],(long)ihi[proc], (long)jlo[proc], (long)jhi[proc]); pnga_error(err_string, g_a); } ptr_src[proc][this_count] = ptr_ref[proc] + item_size * ((j[k] - jlo[proc])* ldp[proc] + i[k] - ilo[proc]); } /* source and destination pointers are ready for all processes */ if (!use_blocks) { for(k=0; k 0) iproc = GA[handle].rstrctd_list[iproc]; } else { iproc = PGRP_LIST[p_handle].inv_map_proc_list[aproc[k]]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } else { if (GA[handle].block_sl_flag == 0) { for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } else { Integer index[MAXDIM]; for(k=0; k= 0) { iproc = PGRP_LIST[p_handle].inv_map_proc_list[iproc]; } rc=ARMCI_GetV(&desc, 1, (int)iproc); if(rc) pnga_error("gather failed in armci",rc); } } } gai_free(buf2); gai_free(buf1); GA_POP_NAME; } /** * Read and increment an element of a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_read_inc = pnga_read_inc #endif Integer pnga_read_inc(Integer g_a, Integer* subscript, Integer inc) { char *ptr; Integer ldp[MAXDIM], proc, handle=GA_OFFSET+g_a, p_handle, ndim; int optype,ivalue; long lvalue; void *pval; ga_check_handleM(g_a, "nga_read_inc"); GA_PUSH_NAME("nga_read_inc"); /* BJP printf("p[%d] g_a: %d subscript: %d inc: %d\n",GAme, g_a, subscript[0], inc); */ if(GA[handle].type!=C_INT && GA[handle].type!=C_LONG && GA[handle].type!=C_LONGLONG) pnga_error("type must be integer",GA[handle].type); GAstat.numrdi++; GAbytes.rditot += (double)sizeof(Integer); p_handle = GA[handle].p_handle; ndim = GA[handle].ndim; /* find out who owns it */ pnga_locate(g_a, subscript, &proc); /* get an address of the g_a(subscript) element */ if (!GA[handle].block_flag) { if (GA[handle].num_rstrctd == 0) { gam_Location(proc, handle, subscript, (char**)&ptr, ldp); } else { gam_Location(GA[handle].rank_rstrctd[proc], handle, subscript, (char**)&ptr, ldp); } } else { Integer lo[MAXDIM], hi[MAXDIM]; Integer j, jtot, last, offset; pnga_distribution(g_a, proc, lo, hi); pnga_access_block_ptr(g_a, proc, (char**)&ptr, ldp); pnga_release_block(g_a, proc); offset = 0; last = ndim - 1; jtot = 1; for (j=0; j 1) { count[istride] = (int)(idx/skip[i]+1); istride++; } else { count[istride] = (int)idx+1; istride++; } } *nstride = istride; return 1; #else Integer idx; int i, istride = 0; /* if (GAme==0) { printf("p[%d] ComputeCount lo[0]: %d hi[0]: %d lo[1]: %d hi[1]: %d\n",GAme, lo[0],hi[0],lo[1],hi[1]); } */ for (i=0; i<(int)ndim; i++) { idx = hi[i] - lo[i]; if (idx < 0) return 0; if (skip[i] > 1) { count[istride] = 1; istride++; count[istride] = (int)(idx/skip[i]+1); istride++; } else { count[istride] = (int)idx+1; istride++; } } *nstride = istride; return 1; #endif } /** * Utility function to calculate stride lengths on local and * remote processors, taking into account the presence of skips */ void gai_SetStrideWithSkip(Integer ndim, Integer size, Integer *ld, Integer *ldrem, int *stride_rem, int *stride_loc, Integer *skip) { #if 1 int i; stride_rem[0] = stride_loc[0] = (int)size; for (i=0; i 1) { stride_rem[istride] *= (int)skip[i]; stride_rem[istride+1] = stride_rem[istride]/((int)skip[i]); stride_loc[istride+1] = stride_loc[istride]; istride++; if (i= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,nstride-1,proc); } /* evaluate size of block idx and use it to increment offset */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_PutS(pbuf,stride_loc,prem,stride_rem,count,nstride-1,proc); } /* increment offset to account for all elements on this block */ #if COMPACT_SCALAPACK itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; #endif /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } } } } GA_POP_NAME; } /** * Get an N-dimensional patch of strided data from a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_strided_get = pnga_strided_get #endif void pnga_strided_get(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld) { /* g_a: Global Array handle lo[]: Array of lower indices of patch of global array hi[]: Array of upper indices of patch of global array skip[]: Array of skips for each dimension buf[]: Local buffer that patch will be copied from ld[]: ndim-1 physical dimensions of local buffer */ Integer p, np, handle = GA_OFFSET + g_a; Integer idx, size, nstride, p_handle, nproc; int i, proc, ndim; int use_blocks; size = GA[handle].elemsize; ndim = GA[handle].ndim; use_blocks = GA[handle].block_flag; nproc = pnga_nnodes(); p_handle = GA[handle].p_handle; /* check values of skips to make sure they are legitimate */ for (i = 0; i= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,nstride-1,proc); } /* evaluate size of block idx and use it to increment offset */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_GetS(prem,stride_rem,pbuf,stride_loc,count,nstride-1,proc); } /* increment offset to account for all elements on this block */ #if COMPACT_SCALAPACK itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; #endif /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } } } } GA_POP_NAME; } /** * Accumulate operation for an N-dimensional patch of strided data of * a Global Array * g_a += alpha * patch \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_strided_acc = pnga_strided_acc #endif void pnga_strided_acc(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld, void *alpha) { /* g_a: Global Array handle lo[]: Array of lower indices of patch of global array hi[]: Array of upper indices of patch of global array skip[]: Array of skips for each dimension buf[]: Local buffer that patch will be copied from ld[]: ndim-1 physical dimensions of local buffer alpha: muliplicative scale factor */ Integer p, np, handle = GA_OFFSET + g_a; Integer idx, size, nstride, type, p_handle, nproc; int i, optype=-1, proc, ndim; int use_blocks; size = GA[handle].elemsize; ndim = GA[handle].ndim; type = GA[handle].type; use_blocks = GA[handle].block_flag; nproc = pnga_nnodes(); p_handle = GA[handle].p_handle; if (type == C_DBL) optype = ARMCI_ACC_DBL; else if (type == C_FLOAT) optype = ARMCI_ACC_FLT; else if (type == C_DCPL) optype = ARMCI_ACC_DCP; else if (type == C_SCPL) optype = ARMCI_ACC_CPL; else if (type == C_INT) optype = ARMCI_ACC_INT; else if (type == C_LONG) optype = ARMCI_ACC_LNG; else pnga_error("nga_strided_acc: type not supported",type); /* check values of skips to make sure they are legitimate */ for (i = 0; i= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, nstride-1, proc); } /* evaluate size of block idx and use it to increment offset */ jtot = 1; for (j=0; j GA[handle].dims[idx]) bhi[idx] = GA[handle].dims[idx]; } /* check to see if this block overlaps with requested block * defined by lo and hi */ chk = 1; for (j=0; j= lo[j] && blo[j] <= hi[j]) || (bhi[j] >= lo[j] && bhi[j] <= hi[j])); /* check to see if interval represented by lo and hi * falls entirely within interval represented by blo and bhi */ check2 = ((lo[j] >= blo[j] && lo[j] <= bhi[j]) && (hi[j] >= blo[j] && hi[j] <= bhi[j])); if (!check1 && !check2) { chk = 0; } } if (chk) { /* get the patch of block that overlaps requested region */ gam_GetBlockPatch(blo,bhi,lo,hi,plo,phi,ndim); /* Correct ranges to account for skips in original patch. If no data is left in patch jump to next processor in loop. */ if (!gai_correct_strided_patch((Integer)ndim, lo, skip, plo, phi)) continue; /* evaluate offset within block */ last = ndim - 1; #if COMPACT_SCALAPACK jtot = 1; if (last == 0) ldrem[0] = bhi[0] - blo[0] + 1; l_offset = 0; for (j=0; j 0) { if (proc_index[j] 0) { pinv = PGRP_LIST[p_handle].inv_map_proc_list[pinv]; } prem = GA[handle].ptr[pinv]+l_offset*GA[handle].elemsize; gai_ComputePatchIndexWithSkip(ndim, lo, plo, skip, ld, &idx_buf); pbuf = size*idx_buf + (char*)buf; /* Compute number of elements in each stride region and compute the number of stride regions. Store the results in count and nstride */ if (!gai_ComputeCountWithSkip(ndim, plo, phi, skip, count, &nstride)) continue; /* scale number of rows by element size */ count[0] *= size; /* Calculate strides in memory for remote processor indexed by proc and local buffer */ gai_SetStrideWithSkip(ndim, size, ld, ldrem, stride_rem, stride_loc, skip); proc = pinv; ARMCI_AccS(optype, alpha, pbuf, stride_loc, prem, stride_rem, count, nstride-1, proc); } /* increment offset to account for all elements on this block */ #if COMPACT_SCALAPACK itmp = 1; for (idx = 0; idx < ndim; idx++) { itmp *= (bhi[idx] - blo[idx] + 1); } offset += itmp; #endif /* increment block indices to get the next block on processor iproc */ index[0] += GA[handle].nblock[0]; for (idx= 0; idx < ndim; idx++) { if (index[idx] >= GA[handle].num_blocks[idx] && idx < ndim-1) { index[idx] = proc_index[idx]; index[idx+1] += GA[handle].nblock[idx+1]; } } } } } } GA_POP_NAME; } ga-5-4/global/src/scalapack.fh0000644000175000017500000000113212662210457014322 0ustar mbamba#ifdef SCALAPACK_I8 #define INTGR4 integer*8 #else #define INTGR4 integer*4 #endif INTGR4 iam, nnodes,nprow,npcol, myrow, mycol, iSLctxt, A maxproc, iSLctxt2,nprow2,npcol2, myrow2, mycol2 logical init,init2, init3, init4 common /SLface/ init, init2, init3, init4, * iam, nnodes, nprow,npcol, myrow, mycol, * iSLctxt,iSLctxt2, * maxproc,nprow2,npcol2, myrow2, mycol2 #ifdef LINUX_DBL_UNDERSCORE #define blacs_pinfo blacs_pinfo_ #define blacs_get blacs_get_ #define blacs_gridinit blacs_gridinit_ #define blacs_gridinfo blacs_gridinfo_ #endif ga-5-4/global/src/ga-mpi.h0000644000175000017500000000042112662210457013404 0ustar mbamba#ifndef GA_MPI_H_ #define GA_MPI_H_ #include #ifdef __cplusplus extern "C" { #endif extern MPI_Comm GA_MPI_Comm(); extern MPI_Comm GA_MPI_Comm_pgroup(int pgroup); extern MPI_Comm GA_MPI_Comm_pgroup_default(); #ifdef __cplusplus } #endif #endif /* GA_MPI_H_ */ ga-5-4/global/src/elem_alg.c0000644000175000017500000031463112662210457014005 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /************************************************************** File: elem.alg.c Elementwise operations on patches and whole arrays Author: Limin Zhang, Ph.D. Mathematics Department Columbia Basin College Pasco, WA 99301 Limin.Zhang@cbc2.org Mentor: Jarek Nieplocha. Environmental Molecular Science Laboratory Pacific Northwest National Laboratory Richland, WA 99352 Date: 1/18/2002 Purpose: to design and implement some interfaces between TAO and global arrays. Modified 3/2004 By Doug Baxter to increase robustness. **************************************************************/ #include "globalp.h" #if HAVE_MATH_H # include #endif #include "abstract_ops.h" #include "ga-papi.h" #include "ga-wapi.h" #ifndef GA_HALF_MAX_INT #define GA_HALF_MAX_INT ((((int)1) << ((int)(8*sizeof(int))-2)) - 1) #endif #ifndef GA_INFINITY_I #define GA_INFINITY_I (GA_HALF_MAX_INT + GA_HALF_MAX_INT + 1) /* Original value below. Seemed too small arbitrarily. #define GA_INFINITY_I 100000 */ #endif #ifndef GA_NEGATIVE_INFINITY_I #define GA_NEGATIVE_INFINITY_I (- GA_INFINITY_I) /* Original value below. Seemed too small arbitrarily. #define GA_NEGATIVE_INFINITY_I -100000 */ #endif #ifndef GA_HALF_MAX_LONG #define GA_HALF_MAX_LONG ((((long)1) << ((int)(8*sizeof(long))-2)) - 1) #endif #ifndef GA_INFINITY_L #define GA_INFINITY_L (GA_HALF_MAX_LONG + GA_HALF_MAX_LONG + 1) /* Original value was #define GA_INFINITY_L 100000 */ #endif #ifndef GA_NEGATIVE_INFINITY_L #define GA_NEGATIVE_INFINITY_L (- GA_INFINITY_L) #endif /* Original value was: #define GA_NEGATIVE_INFINITY_L -100000 */ /* Modified by Doug Baxter 01/24/04 to distinguish between Double inifinity and float infinity. #ifndef GA_INFINITY #define GA_INFINITY 1.0e20 #endif #ifndef GA_NEGATIVE_INFINITY #define GA_NEGATIVE_INFINITY -1.0e20 #endif */ #ifndef GA_INFINITY_F #define GA_INFINITY_F 1.0e37 #endif /* Original value below. #define GA_INFINITY_F 1.0e20 */ #ifndef GA_NEGATIVE_INFINITY_F #define GA_NEGATIVE_INFINITY_F -1.0e37 #endif /* Original value below. #define GA_NEGATIVE_INFINITY_F -1.0e20 */ #ifndef GA_INFINITY_D #define GA_INFINITY_D 1.0e307 #endif /* Original value below. #define GA_INFINITY_D 1.0e20 */ #ifndef GA_NEGATIVE_INFINITY_D #define GA_NEGATIVE_INFINITY_D -1.0e307 #endif /* Original value below. #define GA_NEGATIVE_INFINITY_D -1.0e20 */ /* End of 01/24/04 Modification. Perhaps it would be more appropriate to have GA_INFINITY_D BE 1.0e307 These ranges make assumptions about the data. */ #define OP_ABS 0 #define OP_ADD_CONST 1 #define OP_RECIP 2 #define OP_ELEM_MULT 3 #define OP_ELEM_DIV 4 #define OP_ELEM_MAX 5 #define OP_ELEM_MIN 6 #define OP_STEPMAX 7 #define OP_STEPBOUNDINFO 8 #define OP_ELEM_SDIV 9 #define OP_ELEM_SDIV2 10 #define OP_STEP_MASK 11 #define OP_FILL 100 /*The OP_FILL is not currently in use */ int debug_gai_oper_elem = 1; static void do_stepboundinfo(void *ptr, int nelem, int type) /*look at elements one by one and replace the positive infinity with negative infinity */ { int i; switch (type){ int *ia; double *da; float *fa; long *la; case C_DBL: /*Only double data type will be handled for TAO/GA project*/ da = (double *) ptr; for(i=0;i=GA_INFINITY_D) da[i]=-GA_INFINITY_D; break; case C_INT: /* This block added 01/24/04 */ ia = (int *) ptr; for (i=0;i= GA_INFINITY_I) ia[i] = GA_NEGATIVE_INFINITY_I; break; case C_DCPL: case C_SCPL: /* This operation is not well defined for complex numbers . This statement added when drop through behavior changed by adding code for C_FLOAT and C_LONG cases below. 01/24/04 */ pnga_error("do_stepboundinfo:wrong data type",type); case C_FLOAT: /* This case added 01/24/04 */ fa = (float *) ptr; for (i=0;i= GA_INFINITY_F) fa[i] = GA_NEGATIVE_INFINITY_F; break; case C_LONG: /* This case added 01/24/04 */ la = (long *) ptr; for (i=0;i= GA_INFINITY_L) la[i] = GA_NEGATIVE_INFINITY_L; break; default: pnga_error("do_stepboundinfo:wrong data type",type); } } static void do_stepmax(void *ptr, int nelem, int type) /* Look at elements one by one and replace the positive with negative infinity. */ { int i; switch (type){ int *ia,i_0; double *da,d_0; float *fa,f_0; long *la,l_0; case C_DBL: /*Only double data type will be handled for TAO/GA project*/ da = (double *) ptr; d_0 = (double) 0.0; /* Modified 01/24/04 to use _D ending. */ for(i=0;id_0) da[i]=-GA_INFINITY_D; break; case C_INT: /* Thix case added 01/24/04*/ ia = (int *) ptr; i_0 = (int)0; for(i=0;ii_0)ia[i]=-GA_INFINITY_I; break; case C_DCPL: case C_SCPL: /* This operation is not well defined for complex numbers . This statement added when drop through behavior changed by adding code for C_FLOAT and C_LONG cases below. 01/24/04 */ pnga_error("do_stepmax:wrong data type",type); case C_FLOAT: /* Thix case added 01/24/04*/ fa = (float *) ptr; f_0 = (float) 0.0; for(i=0;if_0) fa[i]=-GA_INFINITY_F; break; case C_LONG: /* Thix case added 01/24/04*/ la = (long *) ptr; l_0 = (long)0; for(i=0;il_0) la[i]=-GA_INFINITY_L; break; default: pnga_error("do_stepmax:wrong data type",type); } } static void do_abs(void *ptr, int nelem, int type) { int i; double x2; float sx2; switch (type){ int *ia; double *da; float *fa; DoubleComplex *ca,val; SingleComplex *cfa,cval; long *la; case C_INT: ia = (int *)ptr; for(i=0;i= GA_ABS(val.imag)) { if (val.real == (double)0.0) { ca[i].real = (double)0.0; } else { x2 = val.imag/val.real; ca[i].real = GA_ABS(val.real)*sqrt(1.0+(x2*x2)); } } else { x2 = val.real/val.imag; ca[i].real = GA_ABS(val.imag)*sqrt(1.0+(x2*x2)); } #endif ca[i].imag=(double)0.0; } break; case C_SCPL: cfa = (SingleComplex *) ptr; for(i=0;i= GA_ABS(cval.imag)) { if (cval.real == 0.0f) { cfa[i].real = 0.0f; } else { sx2 = cval.imag/cval.real; cfa[i].real = GA_ABS(cval.real)*sqrt(1.0f+(sx2*sx2)); } } else { sx2 = cval.real/cval.imag; cfa[i].real = GA_ABS(cval.imag)*sqrt(1.0f+(sx2*sx2)); } #endif cfa[i].imag=0.0f; } break; case C_DBL: da = (double *) ptr; for(i=0;i= magi) { if (magr != ((double)0.0)) { c = x2/x1; d = ((double)1.0)/((((double)1.0) + (c*c))*x1); ca[i].real = d; ca[i].imag = -c*d; } else { pnga_error("zero value at index",i); } } else { c = x1/x2; d = ((double)1.0)/((((double)1.0) + (c*c))*x2); ca[i].real = c*d; ca[i].imag = -d; } /* printf(" do_recip ca[%d].real = %le, ca[%d].imag = %le\n", i,ca[i].real,i,ca[i].imag); */ } break; case C_SCPL: cfa = (SingleComplex *) ptr; for(i=0;i= smagi) { if (smagr != ((float)0.0)) { sc = sx2/sx1; sd = ((float)1.0)/((((float)1.0) + (sc*sc))*sx1); cfa[i].real = sd; cfa[i].imag = -sc*sd; } else { pnga_error("zero value at index",i); } } else { sc = sx1/sx2; sd = ((float)1.0)/((((float)1.0) + (sc*sc))*sx2); cfa[i].real = sc*sd; cfa[i].imag = -sd; } /* printf(" do_recip ca[%d].real = %le, ca[%d].imag = %le\n", i,ca[i].real,i,ca[i].imag); */ } break; case C_DBL: da = (double *) ptr; for(i=0;i (hiA[j]-loA[j])) bvalue[j] = 0; } switch(type){ case C_INT: temp=((int*)data_ptr)+idx; break; case C_DCPL: temp=((DoubleComplex*)data_ptr)+idx; break; case C_SCPL: temp=((SingleComplex*)data_ptr)+idx; break; case C_DBL: temp=((double*)data_ptr)+idx; break; case C_FLOAT: temp=((float*)data_ptr)+idx; break; case C_LONG: temp=((long *)data_ptr)+idx; break; default: pnga_error("wrong data type.",type); } switch(op){ case OP_ABS: do_abs(temp ,hiA[0] -loA[0] +1, type); break; break; case OP_ADD_CONST: do_add_const(temp ,hiA[0] -loA[0] +1, type, scalar); break; case OP_RECIP: do_recip(temp ,hiA[0] -loA[0] +1, type); break; break; default: pnga_error("bad operation",op); } } } static void gai_oper_elem(Integer g_a, Integer *lo, Integer *hi, void *scalar, Integer op) { Integer ndim, dims[MAXDIM], type; Integer loA[MAXDIM], hiA[MAXDIM], ld[MAXDIM]; void /* *temp,*/ *data_ptr; Integer me= pnga_nodeid(); Integer num_blocks; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle(g_a, "gai_oper_elem"); GA_PUSH_NAME("gai_oper_elem"); pnga_inquire(g_a, &type, &ndim, dims); num_blocks = pnga_total_blocks(g_a); if (num_blocks < 0) { /* get limits of VISIBLE patch */ pnga_distribution(g_a, me, loA, hiA); /* determine subset of my local patch to access */ /* Output is in loA and hiA */ if(pnga_patch_intersect(lo, hi, loA, hiA, ndim)){ /* get data_ptr to corner of patch */ /* ld are leading dimensions INCLUDING ghost cells */ pnga_access_ptr(g_a, loA, hiA, &data_ptr, ld); /* perform operation on all elements in local patch */ ngai_do_oper_elem(type, ndim, loA, hiA, ld, data_ptr, scalar, op); /* release access to the data */ pnga_release_update(g_a, loA, hiA); } } else { Integer offset, i, j, jtmp, chk; Integer loS[MAXDIM]; Integer nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)){ for (i=me; i dims[i]) hiA[i] = dims[i]; if (hiA[i] < loA[i]) chk = 0; } /* loA is changed by pnga_patch_intersect, so save a copy */ for (j=0; j= blocks[i] && i= GA_ABS(bImag)) { if (bReal != (double)0.0) { x1 = bImag/bReal; /* So x1 <= 1 */ x2 = ((double)1.0)/(bReal*(((double)1.0)+(x1*x1))); ((DoubleComplex*)pC)[i].real = (aReal + aImag*x1)*x2; ((DoubleComplex*)pC)[i].imag = (aImag - aReal*x1)*x2; } else{ pnga_error("zero divisor ",bReal); } } else { x1 = bReal/bImag; /* So x1 <= 1 */ x2 = ((double)1.0)/(bImag*(((double)1.0)+(x1*x1))); ((DoubleComplex*)pC)[i].real = (aReal*x1 + aImag)*x2; ((DoubleComplex*)pC)[i].imag = (aImag*x1 - aReal)*x2; } } break; case C_SCPL: for(i = 0; i= GA_ABS(bImag)) { if (bReal != (float)0.0) { x1 = bImag/bReal; /* So x1 <= 1 */ x2 = ((float)1.0)/(bReal*(((float)1.0)+(x1*x1))); ((SingleComplex*)pC)[i].real = (aReal + aImag*x1)*x2; ((SingleComplex*)pC)[i].imag = (aImag - aReal*x1)*x2; } else{ pnga_error("zero divisor ",bReal); } } else { x1 = bReal/bImag; /* So x1 <= 1 */ x2 = ((float)1.0)/(bImag*(((float)1.0)+(x1*x1))); ((SingleComplex*)pC)[i].real = (aReal*x1 + aImag)*x2; ((SingleComplex*)pC)[i].imag = (aImag*x1 - aReal)*x2; } } break; case C_INT: for(i = 0; i=d_0) { ((double*)pC)[i]= GA_INFINITY_D; } else { ((double*)pC)[i]= d_0; } } else { if(((double*)pB)[i]!=d_0) ((double*)pC)[i]= ((double*)pA)[i]/((double*)pB)[i]; else{ /* if b is zero an infinite number could be added without changing the sign of a. */ ((double*)pC)[i]= GA_INFINITY_D; } } } break; case C_DCPL: pnga_error(" do_step_divide called with type C_DCPL",C_DCPL); break; case C_SCPL: pnga_error(" do_step_divide called with type C_SCPL",C_SCPL); break; case C_INT: i_0 = (int)0; for(i = 0; i=i_0) { ((int*)pC)[i]=GA_INFINITY_I; } else { ((int*)pC)[i]=i_0; } } else { if(((int*)pB)[i]!=i_0) ((int*)pC)[i] = ((int*)pA)[i]/((int*)pB)[i]; else{ ((int*)pC)[i]=GA_INFINITY_I; } } } break; case C_FLOAT: f_0 = (float)0.0; for(i = 0; i=f_0) { ((float*)pC)[i]= GA_INFINITY_F; } else { ((float*)pC)[i]= f_0; } } else { if(((float*)pB)[i]!=f_0) { ((float*)pC)[i]= ((float*)pA)[i]/((float*)pB)[i]; } else { /* _F added 01/24/04 */ ((float*)pC)[i]= GA_INFINITY_F; } } } break; case C_LONG: l_0 = (long)0; for(i = 0; i=l_0) { ((long *)pC)[i] = GA_INFINITY_L; } else { ((long *)pC)[i] = l_0; } } else { if(((long *)pB)[i]!=l_0) ((long *)pC)[i]= ((long *)pA)[i]/((long *)pB)[i]; else{ ((long *)pC)[i] = GA_INFINITY_L; } } } break; default: pnga_error(" wrong data type ",type); } } static void do_stepb_divide(void *pA, void *pB, void *pC, Integer nelems, Integer type){ /* Elementwise divide, not aborting on a zero denominator, but returning an infinity. If an element in the numerator vector (PA) is zero, then infinity is returned if the corresponding denominator element is non-negative, else zero is returned for that element. DJB 4/02/04 */ Integer i; double d_0; long l_0; float f_0; Integer i_0; d_0 = (double)0.0; l_0 = (long)0; f_0 = (float)0.0; i_0 = (int)0; switch(type){ case C_DBL: for(i = 0; id_0) { ((double*)pC)[i]= d_0; } else { ((double*)pC)[i]= GA_INFINITY_D; } } else { if(((double*)pB)[i]!=d_0) ((double*)pC)[i]= ((double*)pA)[i]/((double*)pB)[i]; else{ /* if b is zero an infinite number could be added without changing the sign of a. */ ((double*)pC)[i]= GA_INFINITY_D; } } } break; case C_DCPL: pnga_error(" do_stepb_divide called with type C_DCPL",C_DCPL); break; case C_SCPL: pnga_error(" do_stepb_divide called with type C_SCPL",C_SCPL); break; case C_INT: i_0 = (int)0; for(i = 0; ii_0) { ((int*)pC)[i]=i_0; } else { ((int*)pC)[i]=GA_INFINITY_I; } } else { if(((int*)pB)[i]!=i_0) ((int*)pC)[i] = ((int*)pA)[i]/((int*)pB)[i]; else{ ((int*)pC)[i]=GA_INFINITY_I; } } } break; case C_FLOAT: f_0 = (float)0.0; for(i = 0; if_0) { ((float*)pC)[i]= f_0; } else { ((float*)pC)[i]= GA_INFINITY_F; } } else { if(((float*)pB)[i]!=f_0) { ((float*)pC)[i]= ((float*)pA)[i]/((float*)pB)[i]; } else { /* _F added 01/24/04 */ ((float*)pC)[i]= GA_INFINITY_F; } } } break; case C_LONG: l_0 = (long)0; for(i = 0; il_0) { ((long *)pC)[i] = l_0; } else { ((long *)pC)[i] = GA_INFINITY_L; } } else { if(((long *)pB)[i]!=l_0) ((long *)pC)[i]= ((long *)pA)[i]/((long *)pB)[i]; else{ ((long *)pC)[i] = GA_INFINITY_L; } } } break; default: pnga_error(" do_stepb_divide: wrong data type ",type); } } static void do_step_mask(void *pA, void *pB, void *pC, Integer nelems, Integer type){ /* Set vector C to vector B wherever vector A is nonzero, and to zero wherever vector A is zero. */ Integer i; switch(type){ case C_DBL: for(i = 0; itemp2){ ((DoubleComplex*)pC)[i].real=((DoubleComplex*)pA)[i].real; ((DoubleComplex*)pC)[i].imag=((DoubleComplex*)pA)[i].imag; } else{ ((DoubleComplex*)pC)[i].real=((DoubleComplex*)pB)[i].real; ((DoubleComplex*)pC)[i].imag=((DoubleComplex*)pB)[i].imag; } } } break; case C_SCPL: for(i = 0; itemp2){ ((SingleComplex*)pC)[i].real=((SingleComplex*)pA)[i].real; ((SingleComplex*)pC)[i].imag=((SingleComplex*)pA)[i].imag; } else{ ((SingleComplex*)pC)[i].real=((SingleComplex*)pB)[i].real; ((SingleComplex*)pC)[i].imag=((SingleComplex*)pB)[i].imag; } } } break; case C_INT: for(i = 0; i (hiC[j]-loC[j])) bvalue[j] = 0; } switch(atype){ case C_DBL: tempA=((double*)A_ptr)+idx; tempB=((double*)B_ptr)+idx; tempC=((double*)C_ptr)+idx; break; case C_DCPL: tempA=((DoubleComplex*)A_ptr)+idx; tempB=((DoubleComplex*)B_ptr)+idx; tempC=((DoubleComplex*)C_ptr)+idx; break; case C_SCPL: tempA=((SingleComplex*)A_ptr)+idx; tempB=((SingleComplex*)B_ptr)+idx; tempC=((SingleComplex*)C_ptr)+idx; break; case C_INT: tempA=((int*)A_ptr)+idx; tempB=((int*)B_ptr)+idx; tempC=((int*)C_ptr)+idx; break; case C_FLOAT: tempA=((float*)A_ptr)+idx; tempB=((float*)B_ptr)+idx; tempC=((float*)C_ptr)+idx; break; case C_LONG: tempA=((long *)A_ptr)+idx; tempB=((long *)B_ptr)+idx; tempC=((long *)C_ptr)+idx; break; default: pnga_error(" wrong data type ",atype); } switch((int)op) { case OP_ELEM_MULT: do_multiply(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_ELEM_DIV: do_divide(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_ELEM_SDIV: do_step_divide(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_ELEM_SDIV2: do_stepb_divide(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_STEP_MASK: do_step_mask(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_ELEM_MAX: do_maximum(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; case OP_ELEM_MIN: do_minimum(tempA,tempB,tempC,hiC[0]-loC[0]+1,atype); break; default: printf("op : OP_ELEM_MULT = %d:%d\n", op, OP_ELEM_MULT); pnga_error(" wrong operation ",op); } } } /*\ generic operation of two patches \*/ static void ngai_elem2_patch_(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi, op) Integer g_a, *alo, *ahi; /* patch of g_a */ Integer g_b, *blo, *bhi; /* patch of g_b */ Integer g_c, *clo, *chi; /* patch of g_c */ int op; /* operation to be perform between g_a and g_b */ { Integer i, j; Integer compatible; Integer atype, btype, ctype; Integer andim, adims[MAXDIM], bndim, bdims[MAXDIM], cndim, cdims[MAXDIM]; Integer loA[MAXDIM], hiA[MAXDIM], ldA[MAXDIM]; Integer loB[MAXDIM], hiB[MAXDIM], ldB[MAXDIM]; Integer loC[MAXDIM], hiC[MAXDIM], ldC[MAXDIM]; void *A_ptr, *B_ptr, *C_ptr; Integer idx, n1dim; Integer atotal, btotal; Integer g_A = g_a, g_B = g_b; Integer num_blocks_a, num_blocks_b, num_blocks_c; Integer me= pnga_nodeid(), A_created=0, B_created=0; char *tempname = "temp", notrans='n'; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle(g_a, "gai_elem2_patch_"); GA_PUSH_NAME("ngai_elem2_patch_"); pnga_inquire(g_a, &atype, &andim, adims); pnga_inquire(g_b, &btype, &bndim, bdims); pnga_inquire(g_c, &ctype, &cndim, cdims); if(atype != btype || atype != ctype ) pnga_error(" types mismatch ", 0L); /* check if patch indices and dims match */ for(i=0; i adims[i]) pnga_error("g_a indices out of range ", g_a); for(i=0; i bdims[i]) pnga_error("g_b indices out of range ", g_b); for(i=0; i cdims[i]) pnga_error("g_c indices out of range ", g_c); /* check if numbers of elements in patches match each other */ n1dim = 1; for(i=0; i bndim) cndim = bndim; if(andim < bndim) cndim = andim; if(!pnga_comp_patch(andim, loA, hiA, cndim, loC, hiC)) pnga_error(" A patch mismatch ", g_A); if(!pnga_comp_patch(bndim, loB, hiB, cndim, loC, hiC)) pnga_error(" B patch mismatch ", g_B); /* determine subsets of my patches to access */ if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); /* compute "local" operation accoording to op */ ngai_do_elem2_oper(atype, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr, op); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else { /* create copies of arrays A and B that are identically distributed as C*/ if (!pnga_duplicate(g_c, &g_A, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_a, alo, ahi, g_A, clo, chi); andim = cndim; A_created = 1; if (!pnga_duplicate(g_c, &g_B, tempname)) pnga_error("ga_dadd_patch: dup failed", 0L); pnga_copy_patch(¬rans, g_b, blo, bhi, g_B, clo, chi); bndim = cndim; B_created = 1; /* C is normally distributed so just add copies together for regular arrays */ if (num_blocks_c < 0) { pnga_distribution(g_c, me, loC, hiC); if(andim > bndim) cndim = bndim; if(andim < bndim) cndim = andim; if (pnga_patch_intersect(clo, chi, loC, hiC, cndim)){ pnga_access_ptr(g_A, loC, hiC, &A_ptr, ldA); pnga_access_ptr(g_B, loC, hiC, &B_ptr, ldB); pnga_access_ptr(g_c, loC, hiC, &C_ptr, ldC); /* compute "local" operation accoording to op */ ngai_do_elem2_oper(atype, cndim, loC, hiC, ldC, A_ptr, B_ptr, C_ptr, op); /* release access to the data */ pnga_release (g_A, loC, hiC); pnga_release (g_B, loC, hiC); pnga_release_update(g_c, loC, hiC); } } else { Integer lod[MAXDIM]; /* Integer hid[MAXDIM]; */ /* Integer chk; */ Integer offset, last, jtot; if (!pnga_uses_proc_grid(g_c)) { Integer nproc = pnga_nnodes(); for (idx = me; idx < num_blocks_c; idx += nproc) { pnga_distribution(g_c, idx, loC, hiC); /* make temporary copies of loC and hiC since pnga_patch_intersect destroys original versions */ for (j=0; j cdims[i]) hiC[i] = cdims[i]; /* if (hiC[i] < loC[i]) chk = 0; */ } /* make temporary copies of loC and hiC since pnga_patch_intersect destroys original versions */ for (j=0; j= blocks[i] && i (hiA[j]-loA[j])) bvalue[j] = 0; } switch(atype){ case C_DBL: tempA=((double*)A_ptr)+idx; break; case C_DCPL: case C_SCPL: pnga_error(" ngai_elem3_patch_: wrong data type ",atype); break; case C_INT: tempA=((int*)A_ptr)+idx; break; case C_FLOAT: tempA=((float*)A_ptr)+idx; break; case C_LONG: tempA=((long *)A_ptr)+idx; break; default: pnga_error(" ngai_elem3_patch_: wrong data type ",atype); } switch(op){ case OP_STEPMAX: do_stepmax(tempA,hiA[0]-loA[0]+1, atype); break; case OP_STEPBOUNDINFO: do_stepboundinfo(tempA,hiA[0]-loA[0]+1, atype); break; default: pnga_error(" wrong operation ",op); } } } static void ngai_elem3_patch_(Integer g_a, Integer *alo, Integer *ahi, int op) /*do some preprocess jobs for stepMax and stepMax2*/ { Integer i; Integer atype; Integer andim, adims[MAXDIM]; Integer loA[MAXDIM], hiA[MAXDIM], ldA[MAXDIM]; void *A_ptr; Integer me= pnga_nodeid(); Integer num_blocks; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle(g_a, "gai_elem3_patch_"); GA_PUSH_NAME("ngai_elem3_patch_"); pnga_inquire(g_a, &atype, &andim, adims); num_blocks = pnga_total_blocks(g_a); /* check if patch indices and dims match */ for(i=0; i adims[i]) pnga_error("g_a indices out of range ", g_a); if (num_blocks < 0) { /* find out coordinates of patches of g_a, g_b and g_c that I own */ pnga_distribution(g_a, me, loA, hiA); /* determine subsets of my patches to access */ if (pnga_patch_intersect(alo, ahi, loA, hiA, andim)){ pnga_access_ptr(g_a, loA, hiA, &A_ptr, ldA); /* compute "local" operation accoording to op */ ngai_do_elem3_patch(atype, andim, loA, hiA, ldA, A_ptr, op); /* release access to the data */ pnga_release (g_a, loA, hiA); } } else { Integer offset, j, jtmp, chk; Integer loS[MAXDIM], nproc; nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)){ for (i=me; i adims[i]) hiA[i] = adims[i]; } /* loA is changed by pnga_patch_intersect, so * save a copy */ for (j=0; j= blocks[i] && i (hiA[j]-loA[j])) bvalue[j] = 0; } switch(atype){ case C_DBL: /*double is the only type that is handled for Tao/GA project*/ /* DJB modification to add types int, float and long. This operation does not make sense for complex. */ tempA=((double*)A_ptr)+idx; for(j=0;j adims[i]) pnga_error("g_a indices out of range ", g_a); if (num_blocks < 0) { /* find out coordinates of patches of g_a, g_b and g_c that I own */ pnga_distribution(g_a, me, loA, hiA); iretval = 0; /* determine subsets of my patches to access */ if (pnga_patch_intersect(alo, ahi, loA, hiA, andim)){ pnga_access_ptr(g_a, loA, hiA, &A_ptr, ldA); ngai_has_negative_element(atype, andim, loA, hiA, ldA, A_ptr, &iretval); /* release access to the data */ pnga_release (g_a, loA, hiA); } } else { Integer offset, j, jtmp, chk; Integer loS[MAXDIM], nproc; nproc = pnga_nnodes(); /* using simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)){ for (i=me; i adims[i]) hiA[i] = adims[i]; } /* loA is changed by pnga_patch_intersect, so * save a copy */ for (j=0; j= blocks[i] && i xxdims[i]) pnga_error("ga_elem_step_bound_info_patch: g_a indices out of range ", g_xx); for(i=0; i vvdims[i]) pnga_error("ga_elem_step_bound_info_patch: g_a indices out of range ", g_vv); for(i=0; i xldims[i]) pnga_error("ga_elem_step_bound_info_patch: g_a indices out of range ", g_xxll); for(i=0; i xudims[i]) pnga_error("ga_elem_step_bound_info_patch: g_a indices out of range ", g_xxuu); /* check if numbers of elements in patches match each other */ xxtotal = 1; for(i=0; i xx.", -1); /* Then compute t = positve elements of vv */ pnga_zero(g_T); pnga_elem_maximum(g_vv,g_T,g_T); /* Then, compute (xu-xx)/vv */ pnga_elem_stepb_divide_patch(g_S, xxlo, xxhi, g_T, vvlo, vvhi, g_T, xxlo, xxhi); /* Then, we will select the minimum of the array g_t*/ pnga_select_elem(g_T, "min", sresult, &index[0]); switch (xxtype) { case C_INT: /* This should be iresult but is lresult because of the strange implementation of nga_select_elem. */ /* result1 = (double)(iresult); */ break; case C_DCPL: case C_SCPL: pnga_error("Ga_step_bound_info_patch_: unavalable for complex datatype.", xxtype); break; case C_DBL: /* result1 = dresult; */ break; case C_FLOAT: /* result1 = (double)fresult; */ break; case C_LONG: /* result1 = (double)lresult; */ break; default: pnga_error("Ga_step_bound_info_patch_: result set: wrong data type.", xxtype); } /*Now doing the same thing to get (xx-xxll)/dv */ /*First, compute xl - xx */ pnga_add_patch(alpha, g_xx, xxlo, xxhi, beta, g_xxll, xxlllo, xxllhi, g_Q, xxlo, xxhi); /*Check for negative elements in g_s, if it has any then xxll was not a lower bound, exit with error message. */ if(has_negative_elem(g_Q, xxlo, xxhi) == 1) pnga_error("pnga_step_bound_info_patch: Lower bound is not < xx.", -1); /* Then compute r = negative elements of vv */ pnga_zero(g_R); pnga_elem_minimum(g_vv,g_R,g_R); pnga_abs_value(g_R); /* Then, compute (xx-xl)/vv */ pnga_elem_stepb_divide_patch(g_Q, xxlo, xxhi, g_R, vvlo, vvhi, g_R, xxlo, xxhi); /* Then, we will select the minimum of the array g_t*/ pnga_select_elem(g_R, "min", sresult2, &index[0]); switch (xxtype) { case C_INT: *(int*)wolfemin = GA_ABS(GA_MIN(iresult,iresult2)); break; case C_DCPL: case C_SCPL: pnga_error("Ga_step_bound_info_patch_: unavalable for complex datatype.", xxtype); break; case C_DBL: *(double*)wolfemin = GA_ABS(GA_MIN(dresult,dresult2)); break; case C_FLOAT: *(float*)wolfemin = GA_ABS(GA_MIN(fresult,fresult2)); break; case C_LONG: *(long*)wolfemin = GA_ABS(GA_MIN(lresult,lresult2)); break; default: pnga_error("Ga_step_bound_info_patch_: result2 set: wrong data type.", xxtype); } /* Now set T to be the elementwise minimum of R and T. So, T is infinity only where ever g_vv is zero. */ pnga_elem_minimum(g_R,g_T,g_T); /* Now we want to set T to be zero whenever g_vv was zero and gxx coincides with either boundary vector. Set S to be the element-wise product of S and Q. It will be zero when either of them is zero. */ pnga_elem_multiply(g_Q,g_S,g_S); /* Set Q to the |vv|. */ pnga_copy(g_vv,g_Q); pnga_abs_value(g_Q); /* Now add q and s to get a vector that is zero only where g_vv was zero and g_xx meets one of the boundary vectors. */ pnga_add_patch(alpha, g_Q, xxlo, xxhi, alpha, g_S, xxlo, xxhi, g_S, xxlo, xxhi); /* Then use that vector as a mask to set certain elements of T to be zero (so we have a collection of the a_i and c_i elements as per the TAO StepBoundInfo function). */ pnga_step_mask_patch(g_S,xxlo,xxhi,g_T,xxlo,xxhi,g_T,xxlo,xxhi); /* Then, we will select the minimum of the array g_t, that will be boundmin . */ pnga_select_elem(g_T, "min", sresult, &index[0]); switch (xxtype) { case C_INT: /* This should be iresult but is lresult because of the strange implementation of nga_select_elem. */ *(int*)boundmin = iresult; break; case C_DCPL: case C_SCPL: pnga_error("Ga_step_bound_info_patch_: unavalable for complex datatype.", xxtype); break; case C_DBL: *(double*)boundmin = dresult; break; case C_FLOAT: *(float*)boundmin = fresult; break; case C_LONG: *(long*)boundmin = lresult; break; default: pnga_error("Ga_step_bound_info_patch_: result set: wrong data type.", xxtype); } /* Then, we will select the maximum of the array g_t, that will be boundmax . */ pnga_select_elem(g_T, "max", sresult, &index[0]); switch (xxtype) { case C_INT: /* This should be iresult but is lresult because of the strange implementation of nga_select_elem. */ *(int*)boundmax = iresult; break; case C_DCPL: case C_SCPL: pnga_error("Ga_step_bound_info_patch_: unavalable for complex datatype.", xxtype); break; case C_DBL: *(double*)boundmax = dresult; break; case C_FLOAT: *(float*)boundmax = fresult; break; case C_LONG: *(long*)boundmax = lresult; break; default: pnga_error("Ga_step_bound_info_patch_: result set: wrong data type.", xxtype); } pnga_destroy(g_Q); pnga_destroy(g_R); pnga_destroy(g_S); pnga_destroy(g_T); GA_POP_NAME; if(local_sync_end)pnga_sync(); } /*\ generic routine for element wise operation between two array \*/ #if 0 /* I want to delete op parameter */ void ga_step_max_patch_(g_a, alo, ahi, g_b, blo, bhi, result, op) #else #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_step_max_patch = pnga_step_max_patch #endif void pnga_step_max_patch(g_a, alo, ahi, g_b, blo, bhi, result) Integer g_a, *alo, *ahi; /* patch of g_a */ Integer g_b, *blo, *bhi; /* patch of g_b */ void *result; #if 0 Integer op; /* operations */ #endif { double dresult; long lresult; Integer atype; Integer andim, adims[MAXDIM]; Integer btype; Integer bndim, bdims[MAXDIM]; Integer index[MAXDIM]; /* Integer num_blocks_a, num_blocks_b; */ /* double result = -1; */ Integer g_c; int iresult; Integer atotal,btotal; float fresult; int local_sync_begin,local_sync_end; int i; Integer compatible; void *sresult = NULL; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); /* Check for valid ga handles. */ pnga_check_handle(g_a, "ga_step_max_patch_"); pnga_check_handle(g_b, "ga_step_max_patch_"); GA_PUSH_NAME("ga_step_max_patch_"); /* get chacteristics of the input ga patches */ pnga_inquire(g_a, &atype, &andim, adims); pnga_inquire(g_b, &btype, &bndim, bdims); /* num_blocks_a = pnga_total_blocks(g_a); */ /* num_blocks_b = pnga_total_blocks(g_b); */ /* Check for matching types. */ if(atype != btype) pnga_error(" ga_step_max_patch_: types mismatch ", 0L); /* check if patch indices and dims match */ for(i=0; i adims[i]) pnga_error("g_a indices out of range ", g_a); for(i=0; i bdims[i]) pnga_error("g_b indices out of range ", g_b); /* check if numbers of elements in patches match each other */ atotal = 1; for(i=0; i #include "gaconfig.h" #ifdef __crayx1 #undef CRAY #endif #ifdef FALSE #undef FALSE #endif #ifdef TRUE #undef TRUE #endif #ifdef CRAY_YMP #define FALSE _btol(0) #define TRUE _btol(1) #else #define FALSE (logical) 0 #define TRUE (logical) 1 #endif #if HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "macdecls.h" #define GA_OFFSET 1000 /* offset for handle numbering */ /* types/tags of messages used internally by GA */ #define GA_TYPE_SYN GA_MSG_OFFSET + 1 #define GA_TYPE_GSM GA_MSG_OFFSET + 5 #define GA_TYPE_GOP GA_MSG_OFFSET + 15 #define GA_TYPE_BRD GA_MSG_OFFSET + 16 /* GA operation ids */ #define GA_OP_GET 1 /* Get */ #define GA_OP_END 2 /* Terminate */ #define GA_OP_CRE 3 /* Create */ #define GA_OP_PUT 4 /* Put */ #define GA_OP_ACC 5 /* Accumulate */ #define GA_OP_DES 6 /* Destroy */ #define GA_OP_DUP 7 /* Duplicate */ #define GA_OP_ZER 8 /* Zero */ #define GA_OP_DDT 9 /* dot product */ #define GA_OP_SCT 10 /* scatter */ #define GA_OP_GAT 11 /* gather */ #define GA_OP_RDI 15 /* Integer read and increment */ #define GA_OP_ACK 16 /* acknowledgment */ #define GA_OP_LCK 17 /* acquire lock */ #define GA_OP_UNL 18 /* release lock */ #ifdef ENABLE_TRACE static Integer op_code; #endif #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define GA_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define GA_ABS(a) (((a) >= 0) ? (a) : (-(a))) typedef struct ga_typeinfo_t { int active; size_t size; } ga_typeinfo_t; extern ga_typeinfo_t ga_types[]; #define GA_TYPES_MAX 256 #define GA_TYPES_RESERVED 17 /**Should match num lines initialized in ga_types struct*/ #define GAtypebuiltinM(_type) ((_type)>=MT_BASE && (_type)<(MT_BASE+GA_TYPES_RESERVED)) #define GAsizeofM(_type) ga_types[(_type)-MT_BASE].size #define GAvalidtypeM(_type) ((_type)>=MT_BASE && (_type)<(MT_BASE+GA_TYPES_MAX) && ga_types[(_type)-MT_BASE].active!=0) #define NAME_STACK_LEN 10 #define PAGE_SIZE 4096 struct ga_stat_t { long numcre; long numdes; long numget; long numput; long numacc; long numsca; long numgat; long numrdi; long numser; long curmem; long maxmem; long numget_procs; long numput_procs; long numacc_procs; long numsca_procs; long numgat_procs; }; struct ga_bytes_t{ double acctot; double accloc; double gettot; double getloc; double puttot; double putloc; double rditot; double rdiloc; double gattot; double gatloc; double scatot; double scaloc; }; #define STAT_AR_SZ sizeof(ga_stat_t)/sizeof(long) extern long *GAstat_arr; extern struct ga_stat_t GAstat; extern struct ga_bytes_t GAbytes; extern char *GA_name_stack[NAME_STACK_LEN]; /* stack for names of GA ops */ extern int GA_stack_size; extern int _ga_sync_begin; extern int _ga_sync_end; extern int *_ga_argc; extern char ***_ga_argv; #define GA_PUSH_NAME(name) (GA_name_stack[GA_stack_size++] = (name)) #define GA_POP_NAME (GA_stack_size--) /* periodic operations */ #define PERIODIC_GET 1 #define PERIODIC_PUT 2 #define PERIODIC_ACC 3 #define FLUSH_CACHE #ifdef CRAY_T3D # define ALLIGN_SIZE 32 #else # define ALLIGN_SIZE 128 #endif #define allign__(n, SIZE) (((n)%SIZE) ? (n)+SIZE - (n)%SIZE: (n)) #define allign_size(n) allign__((long)(n), ALLIGN_SIZE) #define allign_page(n) allign__((long)(n), PAGE_SIZE) extern void ga_free(void *ptr); extern void* ga_malloc(Integer nelem, int type, char *name); extern void gai_init_onesided(); extern void gai_finalize_onesided(); extern void gai_print_subscript(char *pre,int ndim, Integer subscript[], char* post); extern Integer GAsizeof(Integer type); extern void ga_sort_gath(Integer *pn, Integer *i, Integer *j, Integer *base); extern void ga_sort_permutation(Integer *pn, Integer *index, Integer *base); extern void ga_sort_scat(Integer *pn, void *v, Integer *i, Integer *j, Integer *base, Integer type); extern void gai_hsort(Integer *list, int num); extern void ga_init_nbhandle(Integer *nbhandle); extern int nga_test_internal(Integer *nbhandle); extern int nga_wait_internal(Integer *nbhandle); extern int ga_icheckpoint_init(Integer *gas, int num); extern int ga_icheckpoint(Integer *gas, int num); extern int ga_irecover(int rid); extern int ga_icheckpoint_finalize(int g_a); extern void ga_checkpoint_arrays(Integer *gas,int num); extern int ga_recover_arrays(Integer *gas, int num); extern void set_ga_group_is_for_ft(int val); extern void ga_set_spare_procs(int *spare); #endif /* _GLOBALP_H_ */ ga-5-4/global/src/gacommon.h0000644000175000017500000000126712662210457014043 0ustar mbamba#ifndef GACOMMON_H_ #define GACOMMON_H_ #include "macommon.h" #define GA_MAX_DIM 7 #define GA_VERSION_MAJOR 5 #define GA_VERSION_MINOR 4 #define GA_VERSION_REVISION 0 #define C_CHAR MT_C_CHAR #define C_DBL MT_C_DBL #define C_DCPL MT_C_DCPL #define C_FLOAT MT_C_FLOAT #define C_INT MT_C_INT #define C_LDBL MT_C_LDBL #define C_LDCPL MT_C_LDCPL #define C_LONGLONG MT_C_LONGLONG #define C_LONG MT_C_LONGINT #define C_SCPL MT_C_SCPL #define F_BYTE MT_F_BYTE #define F_DBL MT_F_DBL #define F_DCPL MT_F_DCPL #define F_INT MT_F_INT #define F_LOG MT_F_LOG #define F_REAL MT_F_REAL #define F_SCPL MT_F_SCPL #endif /* GACOMMON_H_ */ ga-5-4/global/src/complex.F0000644000175000017500000000745712662210457013657 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c All Fortran functions returning a complex or double complex type must c be defined here with a corresponding C subroutine e.g. (Fortran) complex c function ga_cdot --> (C) void gai_cdot(..., SingleComplex *ret). c c from http://www.math.utah.edu/software/c-with-fortran.html c c c Function return types c ... c Unfortunately, returning composite objects that occupy more than a c single register, or an adjacent register pair, is fraught with peril. c Older C and C++ compilers did not support this at all, and newer ones c may do it differently than Fortran compilers do: thus, you should not c expect to use Fortran functions that return types such as COMPLEX or c COMPLEX*16. Write a SUBROUTINE interface to your Fortran function c instead, and then invoke it as a void function from C or C++. c c c We attempted to use various calling conventions, argument order, c hidden first arguments as the return, etc to eliminate the need c for any Fortran source such as this, but portability was an issue. c Intel compilers did not behave similarly to GCC or Pathscale. At a c later date perhaps we will revisit this. c c For the time being, any function returning a complex type must be c defined here following the established convention herein. complex function ga_cdot(g_a,g_b) implicit none integer g_a, g_b external gai_cdot ga_cdot = (0.,0.) call gai_cdot(g_a,g_b,ga_cdot) end complex function nga_cdot(g_a,g_b) implicit none integer g_a, g_b external gai_cdot nga_cdot = (0.,0.) call ngai_cdot(g_a,g_b,nga_cdot) end double complex function ga_zdot(g_a,g_b) implicit none integer g_a, g_b external gai_zdot ga_zdot = (0.,0.) call gai_zdot(g_a,g_b,ga_zdot) end double complex function nga_zdot(g_a,g_b) implicit none integer g_a, g_b external gai_zdot nga_zdot = (0.,0.) call ngai_zdot(g_a,g_b,nga_zdot) end complex function ga_cdot_patch( $ g_a, t_a, ailo, aihi, ajlo, ajhi, $ g_b, t_b, bilo, bihi, bjlo, bjhi) implicit none integer g_a, ailo, aihi, ajlo, ajhi integer g_b, bilo, bihi, bjlo, bjhi character*1 t_a, t_b external gai_cdot_patch ga_cdot_patch = (0.,0.) call gai_cdot_patch( $ g_a, t_a, ailo, aihi, ajlo, ajhi, $ g_b, t_b, bilo, bihi, bjlo, bjhi, ga_cdot_patch) end complex function nga_cdot_patch( $ g_a, t_a, alo, ahi, $ g_b, t_b, blo, bhi) implicit none integer g_a, alo, ahi integer g_b, blo, bhi character*1 t_a, t_b external ngai_cdot_patch nga_cdot_patch = (0.,0.) call ngai_cdot_patch( $ g_a, t_a, alo, ahi, $ g_b, t_b, blo, bhi, nga_cdot_patch) end double complex function ga_zdot_patch( $ g_a, t_a, ailo, aihi, ajlo, ajhi, $ g_b, t_b, bilo, bihi, bjlo, bjhi) implicit none integer g_a, ailo, aihi, ajlo, ajhi integer g_b, bilo, bihi, bjlo, bjhi character*1 t_a, t_b external gai_zdot_patch ga_zdot_patch = (0.,0.) call gai_zdot_patch( $ g_a, t_a, ailo, aihi, ajlo, ajhi, $ g_b, t_b, bilo, bihi, bjlo, bjhi, ga_zdot_patch) end double complex function nga_zdot_patch( $ g_a, t_a, alo, ahi, $ g_b, t_b, blo, bhi) implicit none integer g_a, alo, ahi integer g_b, blo, bhi character*1 t_a, t_b external ngai_zdot_patch nga_zdot_patch = (0.,0.) call ngai_zdot_patch( $ g_a, t_a, alo, ahi, $ g_b, t_b, blo, bhi, nga_zdot_patch) end ga-5-4/global/src/gaconfig.h0000644000175000017500000000166512662210457014022 0ustar mbamba/* Configuration header file for GA * * The following INTERNAL GA parameters can be customized: * - max number of arrays * - range of message passing tag/type values * - length of message buffer(s) * - max number of processors * - disabling MA use * */ #ifndef _GACONFIG_H #define _GACONFIG_H #include "gacommon.h" /* max number of global arrays */ #define MAX_ARRAYS 32768 /* max number of mutexes */ #define MAX_MUTEXES 32768 /* there are 20 message-passing tags/types numbered from GA_MSG_OFFSET up */ #define GA_MSG_OFFSET 32000 /* max number of dimensions * Now set in global.h and global.fh so users can access the value. * We set the macro used internally from the gacommon.h value. */ #define MAXDIM GA_MAX_DIM /* uncoment the following line to never use MA (Memory Allocator) for * storing data in global arrays (not temporary buffers!) */ #define AVOID_MA_STORAGE #endif /* _GACONFIG_H */ ga-5-4/global/src/sparse.c0000644000175000017500000011575612662210457013544 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRINGS_H # include #endif #include "abstract_ops.h" #include "globalp.h" #include "macdecls.h" #include "message.h" #include "ga-papi.h" #include "ga-wapi.h" /*\ sets values for specified array elements by enumerating with stride \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_patch_enum = pnga_patch_enum #endif void pnga_patch_enum(Integer g_a, Integer lo, Integer hi, void* start, void* stride) { Integer dims[1],lop,hip; Integer ndim, type, me, off; pnga_sync(); me = pnga_nodeid(); pnga_check_handle(g_a, "ga_patch_enum"); ndim = pnga_ndim(g_a); if (ndim > 1) pnga_error("ga_patch_enum:applicable to 1-dim arrays",ndim); pnga_inquire(g_a, &type, &ndim, dims); pnga_distribution(g_a, me, &lop, &hip); if ( lop > 0 ){ /* we get 0 if no elements stored on this process */ /* take product of patch owned and specified by the user */ if(hi hi)hip = hi; nelem = hip-lop+1; off = lop - lo; pnga_access_ptr(g_a, &lop, &hip, &ptr, &ld); switch (type) { #define TYPE_CASE(MT,T,AT) \ case MT: \ { \ T *aptr = (T*)ptr; \ T astart = *((T*)start); \ T astride = *((T*)stride); \ for (i=0; i1)pnga_error("ga_scan_copy: applicable to 1-dim arrays",ndim); if(g_src == g_dst) { pnga_error("ga_scan_copy: src and dst must be different arrays", 0); } if(type_src != type_dst) { pnga_error("ga_scan_copy: src and dst arrays must be same type", 0); } pnga_sync(); pnga_distribution(g_msk, me, &lop, &hip); /* create arrays to hold last bit set on a given process */ lim = (long *) ga_malloc(nproc, MT_C_LONGINT, "ga scan buf"); bzero(lim,sizeof(long)*nproc); lim[me] = -1; /* find last bit set on given process (store as global index) */ if ( lop > 0 ){ /* we get 0 if no elements stored on this process */ elems = hip - lop + 1; pnga_access_ptr(g_msk, &lop, &hip, &ptr_msk, &ld); switch (type_msk) { #define TYPE_CASE(MT,T,AT) \ case MT: \ { \ T * restrict buf = (T*)ptr_msk; \ for(i=0; i= lo && ioff <= hi) { \ lim[me]= ioff; \ } \ } \ } \ break; \ } #include "types.xh" #undef TYPE_CASE } pnga_release(g_msk, &lop, &hip); } pnga_gop(C_LONG,lim,nproc,"+"); if(hi hi) { stop = hi-lop+1; } else { stop = hip-lop+1; } /* If start bit is not first local bit, find last remote bit. * We must scan the entire lim to find the next-highest index. * Otherwise, this algorithm won't work with restricted arrays? */ rmt_idx = -1; for (i=0; i rmt_idx && lim[i] < lop) { rmt_idx = lim[i]; } } pnga_access_ptr(g_src, &lop, &hip, &ptr_src, &ld); pnga_access_ptr(g_dst, &lop, &hip, &ptr_dst, &ld); pnga_access_ptr(g_msk, &lop, &hip, &ptr_msk, &ld); combined_type = MT_NUMTYPES*type_src + type_msk; switch (combined_type) { #define TYPE_CASE(MT,T,AT,MT_MSK,T_MSK,AT_MSK) \ case (MT_NUMTYPES*MT) + MT_MSK: \ { \ T * restrict src = (T*)ptr_src; \ T * restrict dst = (T*)ptr_dst; \ T_MSK * restrict msk = (T_MSK*)ptr_msk; \ T last_val; \ assign_zero_##AT(last_val); \ if (-1 != rmt_idx) { \ pnga_get(g_src, &rmt_idx, &rmt_idx, &last_val, &ld);\ } \ for (i=start; i1)pnga_error("ga_scan_add: applicable to 1-dim arrays",ndim); if(g_src == g_dst) { pnga_error("ga_scan_add: src and dst must be different arrays", 0); } if(type_src != type_dst) { pnga_error("ga_scan_add: src and dst arrays must be same type", 0); } pnga_sync(); pnga_distribution(g_msk, me, &lop, &hip); /* create arrays to hold last bit set on a given process */ lim = (long *) ga_malloc(nproc, MT_C_LONGINT, "ga scan buf"); bzero(lim,sizeof(long)*nproc); lim[me] = -1; /* find last bit set on given process (store as global index) */ if ( lop > 0 ){ /* we get 0 if no elements stored on this process */ elems = hip - lop + 1; pnga_access_ptr(g_msk, &lop, &hip, &ptr_msk, &ld); switch (type_msk) { #define TYPE_CASE(MT,T,AT) \ case MT: \ { \ T * restrict buf = (T*)ptr_msk; \ for(i=0; i= lo && ioff <= hi) { \ lim[me]= ioff; \ } \ } \ } \ break; \ } #include "types.xh" #undef TYPE_CASE } pnga_release(g_msk, &lop, &hip); } pnga_gop(C_LONG,lim,nproc,"+"); #if VERBOSE_DEBUG if (0==me) printf("(%d) lo=%d hi=%d\n", me, lo, hi); for (i=0; i rmt_idx && lim[i] < lop) { rmt_idx = lim[i]; } } #if VERBOSE_DEBUG for (i=0; i hi) { stop = hi-lop+1; } else { stop = hip-lop+1; } /* first, perform local scan add */ pnga_access_ptr(g_src, &lop, &hip, &ptr_src, &ld); pnga_access_ptr(g_dst, &lop, &hip, &ptr_dst, &ld); pnga_access_ptr(g_msk, &lop, &hip, &ptr_msk, &ld); combined_type = MT_NUMTYPES*type_src + type_msk; switch (combined_type) { #define TYPE_CASE(MT,T,AT,MT_MSK,T_MSK,AT_MSK) \ case (MT_NUMTYPES*MT) + MT_MSK: \ { \ T * restrict src = (T*)ptr_src; \ T * restrict dst = (T*)ptr_dst; \ T_MSK * restrict msk = (T_MSK*)ptr_msk; \ int found_bit = 0; \ /* find first set bit on first segment */ \ if (lop <= lo) { \ while (eq_zero_##AT_MSK(msk[start]) && start 0) { \ pnga_get(g_src, &loc, &loc, &dst[i], NULL);\ } \ } else { \ assign_##AT(dst[i], src[i]); \ } \ } \ } \ if (excl != 0) { \ for (i=start+1; i 0 ){ /* we get 0 if no elements stored on this process */ Integer lop_1 = lop-1; /* adjust the range of elements to be within */ if(lop < lo) lop = lo; if(hip > hi) hip = hi; if(hi NWORK)pnga_error("sgai_bin_offset: >NWORK", n); len = sizeof(int)*n; armci_msg_bintree(scope, &root, &up, &left, &right); /* up-tree phase: collect number of elements */ if (left > -1) armci_msg_rcv(tag, workL, len, &lenmes, left); if (right > -1) armci_msg_rcv(tag, workR, len, &lenmes, right); /* add number of elements in each bin */ if((right > -1) && left>-1) for(i=0;i -1) for(i=0;i -1) armci_msg_snd(tag, offset, len, right); if (left > -1) { /* we saved num elems for right subtree to adjust offset for left*/ for(i=0; i0){ /* enter this block when we have data */ Integer first_proc, last_proc, p; Integer first_off, last_off; Integer *myoff, bin; /* get offset values stored on my processor to first and last bin */ pnga_access_ptr(g_off, &lobin, &hibin, &myoff, &crap); first_off = myoff[0]; last_off = myoff[hibin-lobin]; /* pnga_get(g_off,&lobin,&lobin,&first_off,&lo); pnga_get(g_off,&hibin,&hibin,&last_off,&hi); */ /* since offset starts at 0, add 1 to get index to g_bin */ first_off++; last_off++; /* find processors on which these bins are located */ if(!pnga_locate(g_bin, &first_off, &first_proc)) pnga_error("ga_bin_sorter: failed to locate region f",first_off); if(!pnga_locate(g_bin, &last_off, &last_proc)) pnga_error("ga_bin_sorter: failed to locate region l",last_off); /* inspect range of indices to bin elements stored on these processors */ for(p=first_proc, bin=lobin; p<= last_proc; p++){ Integer lo, hi, buf[2], off, cnt; buf[0] =-1; buf[1]=-1; pnga_distribution(g_bin,p,&lo,&hi); for(/* start from current bin */; bin<= hibin; bin++, myoff++){ Integer blo,bhi,stat; blo = *myoff +1; if(bin == hibin){ pnga_get(g_cnt, &hibin, &hibin, &cnt, &hibin); /* local */ bhi = blo + cnt-1; }else bhi = myoff[1]; stat= sgai_match_bin2proc(blo, bhi, lo, hi); switch (stat) { case 0: /* bin in a middle */ break; case 1: /* first bin on that processor */ buf[0] =bin; break; case 2: /* last bin on that processor */ buf[1] =bin; break; case 3: /* first and last bin on that processor */ buf[0] =bin; buf[1] =bin; break; } if(stat>1)break; /* found last bin on that processor */ } /* set range of bins on processor p */ cnt =0; off=1; if(buf[0]!=-1){cnt=1; off=0;} if(buf[1]!=-1)cnt++; if(cnt){ Integer p1 = p+1; lo = 1+off; hi = lo+cnt-1; tlo[0] = lo; tlo[1] = p1; thi[0] = hi; thi[1] = p1; pnga_put(*g_range, tlo, thi, buf+off, &cnt); } } } return TRUE; } extern void gai_hsort(Integer *list, int n); #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_bin_sorter = pnga_bin_sorter #endif void pnga_bin_sorter(Integer g_bin, Integer g_cnt, Integer g_off) { Integer nbin,totbin,type,ndim,lo,hi,me=pnga_nodeid(),crap; Integer g_range; if(FALSE==pnga_create_bin_range(g_bin, g_cnt, g_off, &g_range)) pnga_error("ga_bin_sorter: failed to create temp bin range array",0); pnga_inquire(g_bin, &type, &ndim, &totbin); if(ndim !=1) pnga_error("ga_bin_sorter: 1-dim array required",ndim); pnga_distribution(g_bin, me, &lo, &hi); if (lo > 0 ){ /* we get 0 if no elements stored on this process */ Integer bin_range[2], rlo[2],rhi[2]; Integer *bin_cnt, *ptr, i; /* get and inspect range of bins stored on current processor */ rlo[0] = 1; rlo[1]= me+1; rhi[0]=2; rhi[1]=rlo[1]; pnga_get(g_range, rlo, rhi, bin_range, rhi); /* local */ nbin = bin_range[1]-bin_range[0]+1; if(nbin<1 || nbin> totbin || nbin>(hi-lo+1)) pnga_error("ga_bin_sorter:bad nbin",nbin); /* get count of elements in each bin stored on this task */ if(!(bin_cnt = (Integer*)malloc(nbin*sizeof(Integer)))) pnga_error("ga_bin_sorter:memory allocation failed",nbin); pnga_get(g_cnt,bin_range,bin_range+1,bin_cnt,&nbin); /* get access to local bin elements */ pnga_access_ptr(g_bin, &lo, &hi, &ptr, &crap); for(i=0;i nbin) pnga_error("wrong bin",selected); if(all_bin_contrib[selected-1] ==0) my_nbin++; /* new bin found */ all_bin_contrib[selected-1]++; } /* process bins in chunks to match available buffer space */ for(i=0; i nbin) { printf("Writing off end of bins array: index=%d elems=%d lo=%ld hi=%ld values=%ld nbin=%ld\n", i,elems,(long)lo,(long)hi,(long)values+i,(long)nbin); break; }else{ pnga_put(g_bin, &lo, &hi, values+i, &selected); } i+=elems; } free(offset); free(all_bin_contrib); if(sortit)pnga_bin_sorter(g_bin, g_cnt, g_off); else pnga_sync(); } ga-5-4/global/src/ga_profile.h0000644000175000017500000000053412662210457014346 0ustar mbamba/* $Id: ga_profile.h,v 1.3 2005-07-21 08:14:30 manoj Exp $ */ #define GA_PROFILE_PUT 1 #define GA_PROFILE_GET 2 #define GA_PROFILE_ACC 3 extern void ga_profile_init(); extern void ga_profile_terminate(); extern void ga_profile_start(int g_a, long bytes, int ndim, Integer *lo, Integer *hi, int comm_type); extern void ga_profile_stop(); ga-5-4/global/src/global.periodic.c0000644000175000017500000002125112662210457015266 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * module: global.periodic.c * author: Author: Jialin Ju, PNNL * description: periodic put/get/acc * * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "globalp.h" #include "ga-papi.h" #include "ga-wapi.h" #define RANGE_NUM 3 #define RANGE_BOUND 6 #define IS_REGULAR_PATCH 100 typedef struct { Integer lo; Integer hi; int isvalid; } Range_bound; typedef struct { Range_bound low; Range_bound mid; Range_bound hig; } Range; static int ngai_peri_get_range_(Integer ndim, Integer *dims, Integer *lo_orig, Integer *hi_orig, Integer range[][RANGE_BOUND], Integer range_num[], Integer offset[][RANGE_BOUND/2], Integer op_code) /* ndim - dimension of array [input] dims[] - dimensions of each array component [input] lo_orig[] - lower bounds of request hi_orig[] - upper bounds of request range[][] - adjusted ranges for requests [output] range_num[] - number of ranges per axis offset[] - offset between original request and shifted request [output] op_code - not used */ { Integer lo[MAXDIM], hi[MAXDIM]; Integer i, rmndr, id; Range range_raw[MAXDIM]; Integer is_regular_patch, no_shift; /* check the patch is valid or not */ for (i=0; i 2*dims[i]) return 0; } /* move request so that it at least partially overlaps the array * (if necessary) */ no_shift = 1; for(i=0; i dims[i]) { rmndr = lo[i]%dims[i]; id = (lo[i]-rmndr)/dims[i]; lo[i] = lo[i] - id*dims[i]; hi[i] = hi[i] - id*dims[i]; if (id != 0) { no_shift = 0; } } if (hi[i] < 1) { rmndr = -hi[i]%dims[i]; id = (hi[i]+rmndr)/dims[i]+1; lo[i] = lo[i] + id*dims[i]; hi[i] = hi[i] + id*dims[i]; if (id != 0) { no_shift = 0; } } } /* break the lo and hi into the corresponding ranges * * lo (if < 1) 1 dims[i] hi (if > dims[i]) * |-------------------|------------------|------------------| * Example: * lo[0] = -3 hi[0] = 5 dims[0] = 10 then * range_raw[0].low.lo = -3 range_raw[0].low.hi = 0 * range_raw[0].low.isvalid = 1 * range_raw[0].mid.lo = 1 range_raw[0].mid.hi = 5 * range_raw[0].mid.isvalid = 1 * range_raw[0].hig.isvalid = 0 */ for(i=0; i= 1) { range_raw[i].mid.lo = lo[i]; range_raw[i].mid.isvalid = 1; } if (lo[i] < 1 && hi[i] > dims[i]) { range_raw[i].mid.isvalid = 1; } if(hi[i] > dims[i]) { range_raw[i].hig.hi = hi[i]; range_raw[i].hig.isvalid = 1; } else if (hi[i] <= dims[i]) { range_raw[i].mid.hi = hi[i]; range_raw[i].mid.isvalid = 1; } } /* check if this is a regular patch, not periodic operation needed */ is_regular_patch = 1; for(i=0; i extern MPI_Comm ARMCI_COMM_WORLD; # include "ga-mpi.h" # if HAVE_ARMCI_GROUP_COMM extern MPI_Comm armci_group_comm(ARMCI_Group *group); # endif #else # include #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_msg_brdcst = pnga_msg_brdcst #endif void pnga_msg_brdcst(Integer type, void *buffer, Integer len, Integer root) { #ifdef ARMCI_COLLECTIVES int p_grp = (int)pnga_pgroup_get_default(); if (p_grp > 0) { # ifdef MSG_COMMS_MPI int aroot = PGRP_LIST[p_grp].inv_map_proc_list[root]; armci_msg_group_bcast_scope(SCOPE_ALL,buffer, (int)len, aroot,(&(PGRP_LIST[p_grp].group))); # endif } else { armci_msg_bcast(buffer, (int)len, (int)root); } #else # ifdef MSG_COMMS_MPI MPI_Bcast(buffer, (int)len, MPI_CHAR, (int)root, ARMCI_COMM_WORLD); # else tcg_brdcst(type, buffer, len, root); # endif #endif } /*\ BROADCAST \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_brdcst = pnga_brdcst #endif void pnga_brdcst(Integer type, void *buf, Integer len, Integer originator) { _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ pnga_msg_brdcst(type,buf,len,originator); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_brdcst = pnga_pgroup_brdcst #endif void pnga_pgroup_brdcst(Integer grp_id, Integer type, void *buf, Integer len, Integer originator) { int p_grp = (int)grp_id; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if (p_grp > 0) { #ifdef MSG_COMMS_MPI int aroot = PGRP_LIST[p_grp].inv_map_proc_list[originator]; armci_msg_group_bcast_scope(SCOPE_ALL,buf,(int)len,aroot,(&(PGRP_LIST[p_grp].group))); #endif } else { int aroot = (int)originator; armci_msg_bcast(buf, (int)len, (int)aroot); } } #ifdef MSG_COMMS_MPI MPI_Comm GA_MPI_Comm() { return GA_MPI_Comm_pgroup(-1); } MPI_Comm GA_MPI_Comm_pgroup_default() { return GA_MPI_Comm_pgroup(pnga_pgroup_get_default()); } MPI_Comm GA_MPI_Comm_pgroup(int p_grp) { ARMCI_Group group; if (p_grp > 0) { group = PGRP_LIST[p_grp].group; } else { ARMCI_Group_get_world(&group); } # if HAVE_ARMCI_GROUP_COMM_MEMBER return group.comm; # else return armci_group_comm(&group); # endif } #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_msg_sync = pnga_msg_sync #endif void pnga_msg_sync() { #ifdef MSG_COMMS_MPI int p_grp = (int)pnga_pgroup_get_default(); if(p_grp>0) armci_msg_group_barrier(&(PGRP_LIST[p_grp].group)); else armci_msg_barrier(); #else # ifdef LAPI armci_msg_barrier(); # else tcg_synch(GA_TYPE_SYN); # endif #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_msg_pgroup_sync = pnga_msg_pgroup_sync #endif void pnga_msg_pgroup_sync(Integer grp_id) { int p_grp = (int)(grp_id); if(p_grp>0) { # ifdef MSG_COMMS_MPI armci_msg_group_barrier(&(PGRP_LIST[p_grp].group)); # else pnga_error("ga_msg_pgroup_sync not implemented",0); # endif } else { # if defined(MSG_COMMS_MPI) || defined(LAPI) armci_msg_barrier(); # else tcg_synch(GA_TYPE_SYN); # endif } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_gop = pnga_pgroup_gop #endif void pnga_pgroup_gop(Integer p_grp, Integer type, void *x, Integer n, char *op) { _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if (p_grp > 0) { #if defined(ARMCI_COLLECTIVES) && defined(MSG_COMMS_MPI) int group = (int)p_grp; switch (type){ case C_INT: armci_msg_group_igop((int*)x, n, op, (&(PGRP_LIST[group].group))); break; case C_LONG: armci_msg_group_lgop((long*)x, n, op, (&(PGRP_LIST[group].group))); break; case C_LONGLONG: armci_msg_group_llgop((long long*)x, n, op, (&(PGRP_LIST[group].group))); break; case C_FLOAT: armci_msg_group_fgop((float*)x, n, op, (&(PGRP_LIST[group].group))); break; case C_DBL: armci_msg_group_dgop((double*)x, n, op, (&(PGRP_LIST[group].group))); break; case C_SCPL: armci_msg_group_fgop((float*)x, 2*n, op, (&(PGRP_LIST[group].group))); break; case C_DCPL: armci_msg_group_dgop((double*)x, 2*n, op, (&(PGRP_LIST[group].group))); break; default: pnga_error(" wrong data type ",type); } #else pnga_error("Groups not implemented for system",0); #endif } else { pnga_gop(type, x, n, op); } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_gop = pnga_gop #endif void pnga_gop(Integer type, void *x, Integer n, char *op) { Integer p_grp = pnga_pgroup_get_default(); _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if (p_grp > 0) { pnga_pgroup_gop(p_grp, type, x, n, op); } else { #if defined(ARMCI_COLLECTIVES) || defined(MSG_COMMS_MPI) switch (type){ case C_INT: armci_msg_igop((int*)x, n, op); break; case C_LONG: armci_msg_lgop((long*)x, n, op); break; case C_LONGLONG: armci_msg_llgop((long long*)x, n, op); break; case C_FLOAT: armci_msg_fgop((float*)x, n, op); break; case C_DBL: armci_msg_dgop((double*)x, n, op); break; case C_SCPL: armci_msg_fgop((float*)x, 2*n, op); break; case C_DCPL: armci_msg_dgop((double*)x, 2*n, op); break; default: pnga_error(" wrong data type ",type); } #else switch (type){ case C_INT: pnga_error("Operation not defined for system",0); break; case C_LONG: tcg_igop(GA_TYPE_GOP, x, n, op); break; case C_LONGLONG: pnga_error("Operation not defined for system",0); break; case C_FLOAT: pnga_error("Operation not defined for system",0); break; case C_DBL: tcg_dgop(GA_TYPE_GOP, x, n, op); break; case C_SCPL: pnga_error("Operation not defined for system",0); break; case C_DCPL: pnga_error("Operation not defined for system",0); break; default: pnga_error(" wrong data type ",type); } #endif } } ga-5-4/global/src/ga_diag_seqc.c0000644000175000017500000000203712662210457014620 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "globalp.h" #include "ga-papi.h" #include "ga-wapi.h" #if ENABLE_F77 extern void gai_diag_seq_(Integer*, Integer*, Integer*, DoublePrecision*); extern void gai_diag_std_seq_(Integer*, Integer*, DoublePrecision*); # define gai_diag_seq_ F77_FUNC_(gai_diag_seq,GAI_DIAG_SEQ) # define gai_diag_std_seq_ F77_FUNC_(gai_diag_std_seq,GAI_DIAG_STD_SEQ) #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_diag_seq = pnga_diag_seq #endif void pnga_diag_seq(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { #if ENABLE_F77 gai_diag_seq_(&g_a, &g_s, &g_v, eval); #else pnga_error("ga_diag_seq: you must configure --enable-f77", 0L); #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_diag_std_seq = pnga_diag_std_seq #endif void pnga_diag_std_seq(Integer g_a, Integer g_v, DoublePrecision *eval) { #if ENABLE_F77 gai_diag_std_seq_(&g_a, &g_v, eval); #else pnga_error("ga_diag_std_seq: you must configure --enable-f77", 0L); #endif } ga-5-4/global/src/rsg.F0000644000175000017500000013220512662210457012771 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c This code is no longer used in ga_diag_seq.F except c if EISPACK is explicitly requested. It is better to c rely upon external LAPACK for such functionality. c #ifdef ENABLE_EISPACK c $Id: rsg.f,v 1.7 2004-07-29 08:37:12 manoj Exp $ subroutine rsg(nm,n,a,b,w,matz,z,fv1,fv2,ierr) c integer n,nm,ierr,matz double precision a(nm,n),b(nm,n),w(n),z(nm,n),fv1(n),fv2(n) c c this subroutine calls the recommended sequence of c subroutines from the eigensystem subroutine package (eispack) c to find the eigenvalues and eigenvectors (if desired) c for the real symmetric generalized eigenproblem ax = (lambda)bx. c c on input c c nm must be set to the row dimension of the two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrices a and b. c c a contains a real symmetric matrix. c c b contains a positive definite real symmetric matrix. c c matz is an integer variable set equal to zero if c only eigenvalues are desired. otherwise it is set to c any non-zero integer for both eigenvalues and eigenvectors. c c on output c c w contains the eigenvalues in ascending order. c c z contains the eigenvectors if matz is not zero. c c ierr is an integer output variable set equal to an error c completion code described in the documentation for tqlrat c and tql2. the normal completion code is zero. c c fv1 and fv2 are temporary storage arrays. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c if (n .le. nm) go to 10 ierr = 10 * n go to 50 c 10 call ga_rrreduc(nm,n,a,b,fv2,ierr) if (ierr .ne. 0) go to 50 if (matz .ne. 0) go to 20 c .......... find eigenvalues only .......... call ga_tttred1(nm,n,a,w,fv1,fv2) call ga_tttqlrat(n,w,fv2,ierr) go to 50 c .......... find both eigenvalues and eigenvectors .......... 20 call ga_tttred2(nm,n,a,w,fv1,z) call ga_tttql2(nm,n,w,fv1,z,ierr) if (ierr .ne. 0) go to 50 call ga_rrrebak(nm,n,b,fv2,n,z) 50 return end subroutine ga_tttql2(nm,n,d,e,z,ierr) c integer i,j,k,l,m,n,ii,l1,l2,nm,mml,ierr double precision d(n),e(n),z(nm,n) double precision c,c2,c3,dl1,el1,f,g,h,p,r,s,s2,tst1,tst2,pythag c c this subroutine is a translation of the algol procedure tttql2, c num. math. 11, 293-306(1968) by bowdler, martin, reinsch, and c wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 227-240(1971). c c this subroutine finds the eigenvalues and eigenvectors c of a symmetric tridiagonal matrix by the ql method. c the eigenvectors of a full symmetric matrix can also c be found if tttred2 has been used to rrreduce this c full matrix to tridiagonal form. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c d contains the diagonal elements of the input matrix. c c e contains the subdiagonal elements of the input matrix c in its last n-1 positions. e(1) is arbitrary. c c z contains the transformation matrix produced in the c rrreduction by tttred2, if performed. if the eigenvectors c of the tridiagonal matrix are desired, z must contain c the identity matrix. c c on output c c d contains the eigenvalues in ascending order. if an c error exit is made, the eigenvalues are correct but c unordered for indices 1,2,...,ierr-1. c c e has been destroyed. c c z contains orthonormal eigenvectors of the symmetric c tridiagonal (or full) matrix. if an error exit is made, c z contains the eigenvectors associated with the stored c eigenvalues. c c ierr is set to c zero for normal return, c j if the j-th eigenvalue has not been c determined after 30 iterations. c c calls pythag for dsqrt(a*a + b*b) . c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c ierr = 0 if (n .eq. 1) go to 1001 c do 100 i = 2, n 100 e(i-1) = e(i) c f = 0.0d0 tst1 = 0.0d0 e(n) = 0.0d0 c do 240 l = 1, n j = 0 h = dabs(d(l)) + dabs(e(l)) if (tst1 .lt. h) tst1 = h c .......... look for small sub-diagonal element .......... do 110 m = l, n tst2 = tst1 + dabs(e(m)) if (tst2 .eq. tst1) go to 120 c .......... e(n) is always zero, so there is no exit c through the bottom of the loop .......... 110 continue c 120 if (m .eq. l) go to 220 130 if (j .eq. 30) go to 1000 j = j + 1 c .......... form shift .......... l1 = l + 1 l2 = l1 + 1 g = d(l) p = (d(l1) - g) / (2.0d0 * e(l)) r = pythag(p,1.0d0) d(l) = e(l) / (p + dsign(r,p)) d(l1) = e(l) * (p + dsign(r,p)) dl1 = d(l1) h = g - d(l) if (l2 .gt. n) go to 145 c do 140 i = l2, n 140 d(i) = d(i) - h c 145 f = f + h c .......... ql transformation .......... p = d(m) c = 1.0d0 c2 = c el1 = e(l1) s = 0.0d0 mml = m - l c .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml c3 = c2 c2 = c s2 = s i = m - ii g = c * e(i) h = c * p r = pythag(p,e(i)) e(i+1) = s * r s = e(i) / r c = p / r p = c * d(i) - s * g d(i+1) = h + s * (c * g + s * d(i)) c .......... form vector .......... do 180 k = 1, n h = z(k,i+1) z(k,i+1) = s * z(k,i) + c * h z(k,i) = c * z(k,i) - s * h 180 continue c 200 continue c p = -s * s2 * c3 * el1 * e(l) / dl1 e(l) = s * p d(l) = c * p tst2 = tst1 + dabs(e(l)) if (tst2 .gt. tst1) go to 130 220 d(l) = d(l) + f 240 continue c .......... order eigenvalues and eigenvectors .......... do 300 ii = 2, n i = ii - 1 k = i p = d(i) c do 260 j = ii, n if (d(j) .ge. p) go to 260 k = j p = d(j) 260 continue c if (k .eq. i) go to 300 d(k) = d(i) d(i) = p c do 280 j = 1, n p = z(j,i) z(j,i) = z(j,k) z(j,k) = p 280 continue c 300 continue c go to 1001 c .......... set error -- no convergence to an c eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end subroutine ga_tttqlrat(n,d,e2,ierr) c integer i,j,l,m,n,ii,l1,mml,ierr double precision d(n),e2(n) double precision b,c,f,g,h,p,r,s,t,epslon,pythag c c this subroutine is a translation of the algol procedure tttqlrat, c algorithm 464, comm. acm 16, 689(1973) by reinsch. c c this subroutine finds the eigenvalues of a symmetric c tridiagonal matrix by the rational ql method. c c on input c c n is the order of the matrix. c c d contains the diagonal elements of the input matrix. c c e2 contains the squares of the subdiagonal elements of the c input matrix in its last n-1 positions. e2(1) is arbitrary. c c on output c c d contains the eigenvalues in ascending order. if an c error exit is made, the eigenvalues are correct and c ordered for indices 1,2,...ierr-1, but may not be c the smallest eigenvalues. c c e2 has been destroyed. c c ierr is set to c zero for normal return, c j if the j-th eigenvalue has not been c determined after 30 iterations. c c calls pythag for dsqrt(a*a + b*b) . c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1987. c modified by c. moler to fix underflow/overflow difficulties, c especially on the vax and other machines where epslon(1.0d0)**2 c nearly underflows. see the loop involving statement 102 and c the two statements just before statement 200. c c ------------------------------------------------------------------ c ierr = 0 if (n .eq. 1) go to 1001 c do 100 i = 2, n 100 e2(i-1) = e2(i) c f = 0.0d0 t = 0.0d0 e2(n) = 0.0d0 c do 290 l = 1, n j = 0 h = dabs(d(l)) + dsqrt(e2(l)) if (t .gt. h) go to 105 t = h b = epslon(t) c = b * b if (c .ne. 0.0d0) go to 105 c spliting tolerance underflowed. look for larger value. do 102 i = l, n h = dabs(d(i)) + dsqrt(e2(i)) if (h .gt. t) t = h 102 continue b = epslon(t) c = b * b c .......... look for small squared sub-diagonal element .......... 105 do 110 m = l, n if (e2(m) .le. c) go to 120 c .......... e2(n) is always zero, so there is no exit c through the bottom of the loop .......... 110 continue c 120 if (m .eq. l) go to 210 130 if (j .eq. 30) go to 1000 j = j + 1 c .......... form shift .......... l1 = l + 1 s = dsqrt(e2(l)) g = d(l) p = (d(l1) - g) / (2.0d0 * s) r = pythag(p,1.0d0) d(l) = s / (p + dsign(r,p)) h = g - d(l) c do 140 i = l1, n 140 d(i) = d(i) - h c f = f + h c .......... rational ql transformation .......... g = d(m) if (g .eq. 0.0d0) g = b h = g s = 0.0d0 mml = m - l c .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml i = m - ii p = g * h r = p + e2(i) e2(i+1) = s * r s = e2(i) / r d(i+1) = h + s * (h + d(i)) g = d(i) - e2(i) / g c avoid division by zero on next pass if (g .eq. 0.0d0) g = epslon(d(i)) h = g * (p / r) 200 continue c e2(l) = s * g d(l) = h c .......... guard against underflow in convergence test .......... if (h .eq. 0.0d0) go to 210 if (dabs(e2(l)) .le. dabs(c/h)) go to 210 e2(l) = h * e2(l) if (e2(l) .ne. 0.0d0) go to 130 210 p = d(l) + f c .......... order eigenvalues .......... if (l .eq. 1) go to 250 c .......... for i=l step -1 until 2 do -- .......... do 230 ii = 2, l i = l + 2 - ii if (p .ge. d(i-1)) go to 270 d(i) = d(i-1) 230 continue c 250 i = 1 270 d(i) = p 290 continue c go to 1001 c .......... set error -- no convergence to an c eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end subroutine ga_tttred1(nm,n,a,d,e,e2) c integer i,j,k,l,n,ii,nm,jp1 double precision a(nm,n),d(n),e(n),e2(n) double precision f,g,h,scale c c this subroutine is a translation of the algol procedure tttred1, c num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). c c this subroutine rrreduces a real symmetric matrix c to a symmetric tridiagonal matrix using c orthogonal similarity transformations. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c a contains the real symmetric input matrix. only the c lower triangle of the matrix need be supplied. c c on output c c a contains information about the orthogonal trans- c formations used in the rrreduction in its strict lower c triangle. the full upper triangle of a is unaltered. c c d contains the diagonal elements of the tridiagonal matrix. c c e contains the subdiagonal elements of the tridiagonal c matrix in its last n-1 positions. e(1) is set to zero. c c e2 contains the squares of the corresponding elements of e. c e2 may coincide with e if the squares are not needed. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c do 100 i = 1, n d(i) = a(n,i) a(n,i) = a(i,i) 100 continue c .......... for i=n step -1 until 1 do -- .......... do 300 ii = 1, n i = n + 1 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 1) go to 130 c .......... scale row (algol tol then not needed) .......... do 120 k = 1, l 120 scale = scale + dabs(d(k)) c if (scale .ne. 0.0d0) go to 140 c do 125 j = 1, l d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = 0.0d0 125 continue c 130 e(i) = 0.0d0 e2(i) = 0.0d0 go to 300 c 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue c e2(i) = scale * scale * h f = d(l) g = -dsign(dsqrt(h),f) e(i) = scale * g h = h - f * g d(l) = f - g if (l .eq. 1) go to 285 c .......... form a*u .......... do 170 j = 1, l 170 e(j) = 0.0d0 c do 240 j = 1, l f = d(j) g = e(j) + a(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 c do 200 k = jp1, l g = g + a(k,j) * d(k) e(k) = e(k) + a(k,j) * f 200 continue c 220 e(j) = g 240 continue c .......... form p .......... f = 0.0d0 c do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue c h = f / (h + h) c .......... form q .......... do 250 j = 1, l 250 e(j) = e(j) - h * d(j) c .......... form rrreduced a .......... do 280 j = 1, l f = d(j) g = e(j) c do 260 k = j, l 260 a(k,j) = a(k,j) - f * e(k) - g * d(k) c 280 continue c 285 do 290 j = 1, l f = d(j) d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = f * scale 290 continue c 300 continue c return end subroutine ga_tttred2(nm,n,a,d,e,z) c integer i,j,k,l,n,ii,nm,jp1 double precision a(nm,n),d(n),e(n),z(nm,n) double precision f,g,h,hh,scale c c this subroutine is a translation of the algol procedure tttred2, c num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). c c this subroutine rrreduces a real symmetric matrix to a c symmetric tridiagonal matrix using and accumulating c orthogonal similarity transformations. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c a contains the real symmetric input matrix. only the c lower triangle of the matrix need be supplied. c c on output c c d contains the diagonal elements of the tridiagonal matrix. c c e contains the subdiagonal elements of the tridiagonal c matrix in its last n-1 positions. e(1) is set to zero. c c z contains the orthogonal transformation matrix c produced in the rrreduction. c c a and z may coincide. if distinct, a is unaltered. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c do 100 i = 1, n c do 80 j = i, n 80 z(j,i) = a(j,i) c d(i) = a(n,i) 100 continue c if (n .eq. 1) go to 510 c .......... for i=n step -1 until 2 do -- .......... do 300 ii = 2, n i = n + 2 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 2) go to 130 c .......... scale row (algol tol then not needed) .......... do 120 k = 1, l 120 scale = scale + dabs(d(k)) c if (scale .ne. 0.0d0) go to 140 130 e(i) = d(l) c do 135 j = 1, l d(j) = z(l,j) z(i,j) = 0.0d0 z(j,i) = 0.0d0 135 continue c go to 290 c 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue c f = d(l) g = -dsign(dsqrt(h),f) e(i) = scale * g h = h - f * g d(l) = f - g c .......... form a*u .......... do 170 j = 1, l 170 e(j) = 0.0d0 c do 240 j = 1, l f = d(j) z(j,i) = f g = e(j) + z(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 c do 200 k = jp1, l g = g + z(k,j) * d(k) e(k) = e(k) + z(k,j) * f 200 continue c 220 e(j) = g 240 continue c .......... form p .......... f = 0.0d0 c do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue c hh = f / (h + h) c .......... form q .......... do 250 j = 1, l 250 e(j) = e(j) - hh * d(j) c .......... form rrreduced a .......... do 280 j = 1, l f = d(j) g = e(j) c do 260 k = j, l 260 z(k,j) = z(k,j) - f * e(k) - g * d(k) c d(j) = z(l,j) z(i,j) = 0.0d0 280 continue c 290 d(i) = h 300 continue c .......... accumulation of transformation matrices .......... do 500 i = 2, n l = i - 1 z(n,l) = z(l,l) z(l,l) = 1.0d0 h = d(i) if (h .eq. 0.0d0) go to 380 c do 330 k = 1, l 330 d(k) = z(k,i) / h c do 360 j = 1, l g = 0.0d0 c do 340 k = 1, l 340 g = g + z(k,i) * z(k,j) c do 360 k = 1, l z(k,j) = z(k,j) - g * d(k) 360 continue c 380 do 400 k = 1, l 400 z(k,i) = 0.0d0 c 500 continue c 510 do 520 i = 1, n d(i) = z(n,i) z(n,i) = 0.0d0 520 continue c z(n,n) = 1.0d0 e(1) = 0.0d0 return end double precision function epslon (x) double precision x c c estimate unit roundoff in quantities of size x. c double precision a,b,c,eps c c this program should function properly on all systems c satisfying the following two assumptions, c 1. the base used in representing floating point c numbers is not a power of three. c 2. the quantity a in statement 10 is represented to c the accuracy used in floating point variables c that are stored in memory. c the statement number 10 and the go to 10 are intended to c force optimizing compilers to generate code satisfying c assumption 2. c under these assumptions, it should be true that, c a is not exactly equal to four-thirds, c b has a zero for its last bit or digit, c c is not exactly equal to one, c eps measures the separation of 1.0 from c the next larger floating point number. c the developers of eispack would appreciate being informed c about any systems where these assumptions do not hold. c c this version dated 4/6/83. c a = 4.0d0/3.0d0 10 b = a - 1.0d0 c = b + b + b eps = dabs(c-1.0d0) if (eps .eq. 0.0d0) go to 10 epslon = eps*dabs(x) return end double precision function pythag(a,b) double precision a,b c c finds dsqrt(a**2+b**2) without overflow or destructive underflow c double precision p,r,s,t,u p = dmax1(dabs(a),dabs(b)) if (p .eq. 0.0d0) go to 20 r = (dmin1(dabs(a),dabs(b))/p)**2 10 continue t = 4.0d0 + r if (t .eq. 4.0d0) go to 20 s = r/t u = 1.0d0 + 2.0d0*s p = u*p r = (s/u)**2 * r go to 10 20 pythag = p return end subroutine ga_rrrebak(nm,n,b,dl,m,z) c integer i,j,k,m,n,i1,ii,nm double precision b(nm,n),dl(n),z(nm,m) double precision x c c this subroutine is a translation of the algol procedure rrrebaka, c num. math. 11, 99-110(1968) by martin and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 303-314(1971). c c this subroutine forms the eigenvectors of a generalized c symmetric eigensystem by back transforming those of the c derived symmetric matrix determined by rrreduc. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix system. c c b contains information about the similarity transformation c (cholesky decomposition) used in the rrreduction by rrreduc c in its strict lower triangle. c c dl contains further information about the transformation. c c m is the number of eigenvectors to be back transformed. c c z contains the eigenvectors to be back transformed c in its first m columns. c c on output c c z contains the transformed eigenvectors c in its first m columns. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c if (m .eq. 0) go to 200 c do 100 j = 1, m c .......... for i=n step -1 until 1 do -- .......... do 100 ii = 1, n i = n + 1 - ii i1 = i + 1 x = z(i,j) if (i .eq. n) go to 80 c do 60 k = i1, n 60 x = x - b(k,i) * z(k,j) c 80 z(i,j) = x / dl(i) 100 continue c 200 return end subroutine ga_rrreduc(nm,n,a,b,dl,ierr) c integer i,j,k,n,i1,j1,nm,nn,ierr double precision a(nm,n),b(nm,n),dl(n) double precision x,y c c this subroutine is a translation of the algol procedure rrreduc1, c num. math. 11, 99-110(1968) by martin and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 303-314(1971). c c this subroutine rrreduces the generalized symmetric eigenproblem c ax=(lambda)bx, where b is positive definite, to the standard c symmetric eigenproblem using the cholesky factorization of b. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrices a and b. if the cholesky c factor l of b is already available, n should be prefixed c with a minus sign. c c a and b contain the real symmetric input matrices. only the c full upper triangles of the matrices need be supplied. if c n is negative, the strict lower triangle of b contains, c instead, the strict lower triangle of its cholesky factor l. c c dl contains, if n is negative, the diagonal elements of l. c c on output c c a contains in its full lower triangle the full lower triangle c of the symmetric matrix derived from the rrreduction to the c standard form. the strict upper triangle of a is unaltered. c c b contains in its strict lower triangle the strict lower c triangle of its cholesky factor l. the full upper c triangle of b is unaltered. c c dl contains the diagonal elements of l. c c ierr is set to c zero for normal return, c 7*n+1 if b is not positive definite. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c ierr = 0 nn = iabs(n) if (n .lt. 0) go to 100 c .......... form l in the arrays b and dl .......... do 80 i = 1, n i1 = i - 1 c do 80 j = i, n x = b(i,j) if (i .eq. 1) go to 40 c do 20 k = 1, i1 20 x = x - b(i,k) * b(j,k) c 40 if (j .ne. i) go to 60 if (x .le. 0.0d0) go to 1000 y = dsqrt(x) dl(i) = y go to 80 60 b(j,i) = x / y 80 continue c .......... form the transpose of the upper triangle of inv(l)*a c in the lower triangle of the array a .......... 100 do 200 i = 1, nn i1 = i - 1 y = dl(i) c do 200 j = i, nn x = a(i,j) if (i .eq. 1) go to 180 c do 160 k = 1, i1 160 x = x - b(i,k) * a(j,k) c 180 a(j,i) = x / y 200 continue c .......... pre-multiply by inv(l) and overwrite .......... do 300 j = 1, nn j1 = j - 1 c do 300 i = j, nn x = a(i,j) if (i .eq. j) go to 240 i1 = i - 1 c do 220 k = j, i1 220 x = x - a(k,j) * b(i,k) c 240 if (j .eq. 1) go to 280 c do 260 k = 1, j1 260 x = x - a(j,k) * b(i,k) c 280 a(i,j) = x / dl(i) 300 continue c go to 1001 c .......... set error -- b is not positive definite .......... 1000 ierr = 7 * n + 1 1001 return end c $Id: rsg.f,v 1.7 2004-07-29 08:37:12 manoj Exp $ c c JN: the original file has been slightly modified c JN: renamed pythag to pythag000 to avoid multiply defined symbol also in rsg.f c subroutine rs(nm,n,a,w,matz,z,fv1,fv2,ierr) c integer n,nm,ierr,matz double precision a(nm,n),w(n),z(nm,n),fv1(n),fv2(n) c c this subroutine calls the recommended sequence of c subroutines from the eigensystem subroutine package (eispack) c to find the eigenvalues and eigenvectors (if desired) c of a real symmetric matrix. c c on input c c nm must be set to the row dimension of the two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix a. c c a contains the real symmetric matrix. c c matz is an integer variable set equal to zero if c only eigenvalues are desired. otherwise it is set to c any non-zero integer for both eigenvalues and eigenvectors. c c on output c c w contains the eigenvalues in ascending order. c c z contains the eigenvectors if matz is not zero. c c ierr is an integer output variable set equal to an error c completion code described in the documentation for tqlrat c and tql2. the normal completion code is zero. c c fv1 and fv2 are temporary storage arrays. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c if (n .le. nm) go to 10 ierr = 10 * n go to 50 c 10 if (matz .ne. 0) go to 20 c .......... find eigenvalues only .......... call ga_tred1(nm,n,a,w,fv1,fv2) * tqlrat encounters catastrophic underflow on the Vax * call tqlrat(n,w,fv2,ierr) call ga_tql1(n,w,fv1,ierr) go to 50 c .......... find both eigenvalues and eigenvectors .......... 20 call ga_tred2(nm,n,a,w,fv1,z) call ga_tql2(nm,n,w,fv1,z,ierr) 50 return end subroutine ga_tql2(nm,n,d,e,z,ierr) c integer i,j,k,l,m,n,ii,l1,l2,nm,mml,ierr double precision d(n),e(n),z(nm,n) double precision c,c2,c3,dl1,el1,f,g,h,p,r,s,s2,tst1,tst2,pythag c c this subroutine is a translation of the algol procedure tql2, c num. math. 11, 293-306(1968) by bowdler, martin, reinsch, and c wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 227-240(1971). c c this subroutine finds the eigenvalues and eigenvectors c of a symmetric tridiagonal matrix by the ql method. c the eigenvectors of a full symmetric matrix can also c be found if tred2 has been used to reduce this c full matrix to tridiagonal form. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c d contains the diagonal elements of the input matrix. c c e contains the subdiagonal elements of the input matrix c in its last n-1 positions. e(1) is arbitrary. c c z contains the transformation matrix produced in the c reduction by tred2, if performed. if the eigenvectors c of the tridiagonal matrix are desired, z must contain c the identity matrix. c c on output c c d contains the eigenvalues in ascending order. if an c error exit is made, the eigenvalues are correct but c unordered for indices 1,2,...,ierr-1. c c e has been destroyed. c c z contains orthonormal eigenvectors of the symmetric c tridiagonal (or full) matrix. if an error exit is made, c z contains the eigenvectors associated with the stored c eigenvalues. c c ierr is set to c zero for normal return, c j if the j-th eigenvalue has not been c determined after 30 iterations. c c calls pythag for dsqrt(a*a + b*b) . c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c ierr = 0 if (n .eq. 1) go to 1001 c do 100 i = 2, n 100 e(i-1) = e(i) c f = 0.0d0 tst1 = 0.0d0 e(n) = 0.0d0 c do 240 l = 1, n j = 0 h = dabs(d(l)) + dabs(e(l)) if (tst1 .lt. h) tst1 = h c .......... look for small sub-diagonal element .......... do 110 m = l, n tst2 = tst1 + dabs(e(m)) if (tst2 .eq. tst1) go to 120 c .......... e(n) is always zero, so there is no exit c through the bottom of the loop .......... 110 continue c 120 if (m .eq. l) go to 220 130 if (j .eq. 30) go to 1000 j = j + 1 c .......... form shift .......... l1 = l + 1 l2 = l1 + 1 g = d(l) p = (d(l1) - g) / (2.0d0 * e(l)) r = pythag(p,1.0d0) d(l) = e(l) / (p + dsign(r,p)) d(l1) = e(l) * (p + dsign(r,p)) dl1 = d(l1) h = g - d(l) if (l2 .gt. n) go to 145 c do 140 i = l2, n 140 d(i) = d(i) - h c 145 f = f + h c .......... ql transformation .......... p = d(m) c = 1.0d0 c2 = c el1 = e(l1) s = 0.0d0 mml = m - l c .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml c3 = c2 c2 = c s2 = s i = m - ii g = c * e(i) h = c * p r = pythag(p,e(i)) e(i+1) = s * r s = e(i) / r c = p / r p = c * d(i) - s * g d(i+1) = h + s * (c * g + s * d(i)) c .......... form vector .......... do 180 k = 1, n h = z(k,i+1) z(k,i+1) = s * z(k,i) + c * h z(k,i) = c * z(k,i) - s * h 180 continue c 200 continue c p = -s * s2 * c3 * el1 * e(l) / dl1 e(l) = s * p d(l) = c * p tst2 = tst1 + dabs(e(l)) if (tst2 .gt. tst1) go to 130 220 d(l) = d(l) + f 240 continue c .......... order eigenvalues and eigenvectors .......... do 300 ii = 2, n i = ii - 1 k = i p = d(i) c do 260 j = ii, n if (d(j) .ge. p) go to 260 k = j p = d(j) 260 continue c if (k .eq. i) go to 300 d(k) = d(i) d(i) = p c do 280 j = 1, n p = z(j,i) z(j,i) = z(j,k) z(j,k) = p 280 continue c 300 continue c go to 1001 c .......... set error -- no convergence to an c eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end subroutine ga_tred2(nm,n,a,d,e,z) c integer i,j,k,l,n,ii,nm,jp1 double precision a(nm,n),d(n),e(n),z(nm,n) double precision f,g,h,hh,scale c c this subroutine is a translation of the algol procedure tred2, c num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). c c this subroutine reduces a real symmetric matrix to a c symmetric tridiagonal matrix using and accumulating c orthogonal similarity transformations. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c a contains the real symmetric input matrix. only the c lower triangle of the matrix need be supplied. c c on output c c d contains the diagonal elements of the tridiagonal matrix. c c e contains the subdiagonal elements of the tridiagonal c matrix in its last n-1 positions. e(1) is set to zero. c c z contains the orthogonal transformation matrix c produced in the reduction. c c a and z may coincide. if distinct, a is unaltered. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c do 100 i = 1, n c do 80 j = i, n 80 z(j,i) = a(j,i) c d(i) = a(n,i) 100 continue c if (n .eq. 1) go to 510 c .......... for i=n step -1 until 2 do -- .......... do 300 ii = 2, n i = n + 2 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 2) go to 130 c .......... scale row (algol tol then not needed) .......... do 120 k = 1, l 120 scale = scale + dabs(d(k)) c if (scale .ne. 0.0d0) go to 140 130 e(i) = d(l) c do 135 j = 1, l d(j) = z(l,j) z(i,j) = 0.0d0 z(j,i) = 0.0d0 135 continue c go to 290 c 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue c f = d(l) g = -dsign(dsqrt(h),f) e(i) = scale * g h = h - f * g d(l) = f - g c .......... form a*u .......... do 170 j = 1, l 170 e(j) = 0.0d0 c do 240 j = 1, l f = d(j) z(j,i) = f g = e(j) + z(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 c do 200 k = jp1, l g = g + z(k,j) * d(k) e(k) = e(k) + z(k,j) * f 200 continue c 220 e(j) = g 240 continue c .......... form p .......... f = 0.0d0 c do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue c hh = f / (h + h) c .......... form q .......... do 250 j = 1, l 250 e(j) = e(j) - hh * d(j) c .......... form reduced a .......... do 280 j = 1, l f = d(j) g = e(j) c do 260 k = j, l 260 z(k,j) = z(k,j) - f * e(k) - g * d(k) c d(j) = z(l,j) z(i,j) = 0.0d0 280 continue c 290 d(i) = h 300 continue c .......... accumulation of transformation matrices .......... do 500 i = 2, n l = i - 1 z(n,l) = z(l,l) z(l,l) = 1.0d0 h = d(i) if (h .eq. 0.0d0) go to 380 c do 330 k = 1, l 330 d(k) = z(k,i) / h c do 360 j = 1, l g = 0.0d0 c do 340 k = 1, l 340 g = g + z(k,i) * z(k,j) c do 360 k = 1, l z(k,j) = z(k,j) - g * d(k) 360 continue c 380 do 400 k = 1, l 400 z(k,i) = 0.0d0 c 500 continue c 510 do 520 i = 1, n d(i) = z(n,i) z(n,i) = 0.0d0 520 continue c z(n,n) = 1.0d0 e(1) = 0.0d0 return end subroutine ga_tql1(n,d,e,ierr) c integer i,j,l,m,n,ii,l1,l2,mml,ierr double precision d(n),e(n) double precision c,c2,c3,dl1,el1,f,g,h,p,r,s,s2,tst1,tst2,pythag c c this subroutine is a translation of the algol procedure tql1, c num. math. 11, 293-306(1968) by bowdler, martin, reinsch, and c wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 227-240(1971). c c this subroutine finds the eigenvalues of a symmetric c tridiagonal matrix by the ql method. c c on input c c n is the order of the matrix. c c d contains the diagonal elements of the input matrix. c c e contains the subdiagonal elements of the input matrix c in its last n-1 positions. e(1) is arbitrary. c c on output c c d contains the eigenvalues in ascending order. if an c error exit is made, the eigenvalues are correct and c ordered for indices 1,2,...ierr-1, but may not be c the smallest eigenvalues. c c e has been destroyed. c c ierr is set to c zero for normal return, c j if the j-th eigenvalue has not been c determined after 30 iterations. c c calls pythag for dsqrt(a*a + b*b) . c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c ierr = 0 if (n .eq. 1) go to 1001 c do 100 i = 2, n 100 e(i-1) = e(i) c f = 0.0d0 tst1 = 0.0d0 e(n) = 0.0d0 c do 290 l = 1, n j = 0 h = dabs(d(l)) + dabs(e(l)) if (tst1 .lt. h) tst1 = h c .......... look for small sub-diagonal element .......... do 110 m = l, n tst2 = tst1 + dabs(e(m)) if (tst2 .eq. tst1) go to 120 c .......... e(n) is always zero, so there is no exit c through the bottom of the loop .......... 110 continue c 120 if (m .eq. l) go to 210 130 if (j .eq. 30) go to 1000 j = j + 1 c .......... form shift .......... l1 = l + 1 l2 = l1 + 1 g = d(l) p = (d(l1) - g) / (2.0d0 * e(l)) r = pythag(p,1.0d0) d(l) = e(l) / (p + dsign(r,p)) d(l1) = e(l) * (p + dsign(r,p)) dl1 = d(l1) h = g - d(l) if (l2 .gt. n) go to 145 c do 140 i = l2, n 140 d(i) = d(i) - h c 145 f = f + h c .......... ql transformation .......... p = d(m) c = 1.0d0 c2 = c el1 = e(l1) s = 0.0d0 mml = m - l c .......... for i=m-1 step -1 until l do -- .......... do 200 ii = 1, mml c3 = c2 c2 = c s2 = s i = m - ii g = c * e(i) h = c * p r = pythag(p,e(i)) e(i+1) = s * r s = e(i) / r c = p / r p = c * d(i) - s * g d(i+1) = h + s * (c * g + s * d(i)) 200 continue c p = -s * s2 * c3 * el1 * e(l) / dl1 e(l) = s * p d(l) = c * p tst2 = tst1 + dabs(e(l)) if (tst2 .gt. tst1) go to 130 210 p = d(l) + f c .......... order eigenvalues .......... if (l .eq. 1) go to 250 c .......... for i=l step -1 until 2 do -- .......... do 230 ii = 2, l i = l + 2 - ii if (p .ge. d(i-1)) go to 270 d(i) = d(i-1) 230 continue c 250 i = 1 270 d(i) = p 290 continue c go to 1001 c .......... set error -- no convergence to an c eigenvalue after 30 iterations .......... 1000 ierr = l 1001 return end c JN: multiply defined in rsg.f double precision function pythag000(a,b) double precision a,b c c finds dsqrt(a**2+b**2) without overflow or destructive underflow c double precision p,r,s,t,u p = dmax1(dabs(a),dabs(b)) if (p .eq. 0.0d0) go to 20 r = (dmin1(dabs(a),dabs(b))/p)**2 10 continue t = 4.0d0 + r if (t .eq. 4.0d0) go to 20 s = r/t u = 1.0d0 + 2.0d0*s p = u*p r = (s/u)**2 * r go to 10 20 pythag000 = p return end subroutine ga_tred1(nm,n,a,d,e,e2) c integer i,j,k,l,n,ii,nm,jp1 double precision a(nm,n),d(n),e(n),e2(n) double precision f,g,h,scale c c this subroutine is a translation of the algol procedure tred1, c num. math. 11, 181-195(1968) by martin, reinsch, and wilkinson. c handbook for auto. comp., vol.ii-linear algebra, 212-226(1971). c c this subroutine reduces a real symmetric matrix c to a symmetric tridiagonal matrix using c orthogonal similarity transformations. c c on input c c nm must be set to the row dimension of two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c a contains the real symmetric input matrix. only the c lower triangle of the matrix need be supplied. c c on output c c a contains information about the orthogonal trans- c formations used in the reduction in its strict lower c triangle. the full upper triangle of a is unaltered. c c d contains the diagonal elements of the tridiagonal matrix. c c e contains the subdiagonal elements of the tridiagonal c matrix in its last n-1 positions. e(1) is set to zero. c c e2 contains the squares of the corresponding elements of e. c e2 may coincide with e if the squares are not needed. c c questions and comments should be directed to burton s. garbow, c mathematics and computer science div, argonne national laboratory c c this version dated august 1983. c c ------------------------------------------------------------------ c do 100 i = 1, n d(i) = a(n,i) a(n,i) = a(i,i) 100 continue c .......... for i=n step -1 until 1 do -- .......... do 300 ii = 1, n i = n + 1 - ii l = i - 1 h = 0.0d0 scale = 0.0d0 if (l .lt. 1) go to 130 c .......... scale row (algol tol then not needed) .......... do 120 k = 1, l 120 scale = scale + dabs(d(k)) c if (scale .ne. 0.0d0) go to 140 c do 125 j = 1, l d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = 0.0d0 125 continue c 130 e(i) = 0.0d0 e2(i) = 0.0d0 go to 300 c 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue c e2(i) = scale * scale * h f = d(l) g = -dsign(dsqrt(h),f) e(i) = scale * g h = h - f * g d(l) = f - g if (l .eq. 1) go to 285 c .......... form a*u .......... do 170 j = 1, l 170 e(j) = 0.0d0 c do 240 j = 1, l f = d(j) g = e(j) + a(j,j) * f jp1 = j + 1 if (l .lt. jp1) go to 220 c do 200 k = jp1, l g = g + a(k,j) * d(k) e(k) = e(k) + a(k,j) * f 200 continue c 220 e(j) = g 240 continue c .......... form p .......... f = 0.0d0 c do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue c h = f / (h + h) c .......... form q .......... do 250 j = 1, l 250 e(j) = e(j) - h * d(j) c .......... form reduced a .......... do 280 j = 1, l f = d(j) g = e(j) c do 260 k = j, l 260 a(k,j) = a(k,j) - f * e(k) - g * d(k) c 280 continue c 285 do 290 j = 1, l f = d(j) d(j) = a(l,j) a(l,j) = a(i,j) a(i,j) = f * scale 290 continue c 300 continue c return end #endif ga-5-4/global/src/matrix.c0000644000175000017500000024102012662210457013533 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: matrix.c,v 1.7.8.11 2007/12/18 18:49:36 d3g293 Exp $****************************************************** File: matrix.c Author: Limin Zhang, Ph.D. Mathematics Department Columbia Basin College Pasco, WA 99301 Limin.Zhang@cbc2.org Mentor: Jarek Naplocha, Ph.D. Environmental Molecular Science Laboratory Richland, WA 99352 Date: 2/28/2002 Purpose: matrix interfaces between TAO and global arrays. **************************************************************/ #include "globalp.h" #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #include "message.h" #include "ga-papi.h" #include "ga-wapi.h" #define auxi_median(a,b,c,m) \ { \ if ((c < a) && (a < b)) m = a; \ else if ((a <= c) && (c <= b)) m = c; \ else m = b; \ } #define median(a,b,c,m) \ { \ if(a == b) m = a; \ else if(a < b) auxi_median(a, b, c, m) \ else auxi_median(b, a, c, m) \ } #define auxi_median_dcpl(na, nb, nc, za, zb, zc, zm) \ { \ if ((nc < na) && (na < nb)) zm = za; \ else if ((na <= nc) && (nc <= nb)) zm = zc; \ else zm = zb; \ } #define median_dcpl(na, nb, nc, za, zb, zc, zm) \ { \ if (na == nb) zm = za; \ else if (na < nb) auxi_median_dcpl (na, nb, nc, za, zb, zc, zm) \ else auxi_median_dcpl (nb, na, nc, zb, za, zc, zm) \ } #define auxi_median_scpl(na, nb, nc, ca, cb, cc, cm) \ { \ if ((nc < na) && (na < nb)) cm = ca; \ else if ((na <= nc) && (nc <= nb)) cm = cc; \ else cm = cb; \ } #define median_scpl(na, nb, nc, ca, cb, cc, cm) \ { \ if (na == nb) cm = ca; \ else if (na < nb) auxi_median_scpl (na, nb, nc, ca, cb, cc, cm) \ else auxi_median_scpl (nb, na, nc, cb, ca, cc, cm) \ } /*\ Utility function to find median values of patch \*/ static void sgai_median_patch_values(Integer type, Integer ndim, Integer *loA, Integer *hiA, Integer *ldA, void *A_ptr, void *B_ptr, void *C_ptr, void *M_ptr, Integer offset) { Integer bvalue[MAXDIM], bunit[MAXDIM], baseldA[MAXDIM]; Integer idx, n1dim; Integer i, j; double na, nb, nc; /*norm of a, norm of b, norm of c */ int ia, ib, ic, im; float fa, fb, fc, fm; double da, db, dc, dm; long la, lb, lc, lm; DoubleComplex za, zb, zc, zm; SingleComplex ca, cb, cc, cm; /* number of n-element of the first dimension */ n1dim = 1; for (i = 1; i < ndim; i++) n1dim *= (hiA[i] - loA[i] + 1); /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; /* baseldA[0] = ldA[0] * baseldA[1] = ldA[0] * ldA[1] * baseldA[2] = ldA[0] * ldA[1] * ldA[2] ..... */ baseldA[0] = ldA[0]; baseldA[1] = baseldA[0] * ldA[1]; for (i = 2; i < ndim; i++) { bvalue[i] = 0; bunit[i] = bunit[i - 1] * (hiA[i - 1] - loA[i - 1] + 1); baseldA[i] = baseldA[i - 1] * ldA[i]; } switch(type) { case C_DBL: A_ptr = (void*)((double*)(A_ptr) + offset); B_ptr = (void*)((double*)(B_ptr) + offset); C_ptr = (void*)((double*)(C_ptr) + offset); M_ptr = (void*)((double*)(M_ptr) + offset); break; case C_INT: A_ptr = (void*)((int*)(A_ptr) + offset); B_ptr = (void*)((int*)(B_ptr) + offset); C_ptr = (void*)((int*)(C_ptr) + offset); M_ptr = (void*)((int*)(M_ptr) + offset); break; case C_DCPL: A_ptr = (void*)((DoubleComplex*)(A_ptr) + offset); B_ptr = (void*)((DoubleComplex*)(B_ptr) + offset); C_ptr = (void*)((DoubleComplex*)(C_ptr) + offset); M_ptr = (void*)((DoubleComplex*)(M_ptr) + offset); break; case C_SCPL: A_ptr = (void*)((SingleComplex*)(A_ptr) + offset); B_ptr = (void*)((SingleComplex*)(B_ptr) + offset); C_ptr = (void*)((SingleComplex*)(C_ptr) + offset); M_ptr = (void*)((SingleComplex*)(M_ptr) + offset); break; case C_FLOAT: A_ptr = (void*)((float*)(A_ptr) + offset); B_ptr = (void*)((float*)(B_ptr) + offset); C_ptr = (void*)((float*)(C_ptr) + offset); M_ptr = (void*)((float*)(M_ptr) + offset); break; case C_LONG: A_ptr = (void*)((long*)(A_ptr) + offset); B_ptr = (void*)((long*)(B_ptr) + offset); C_ptr = (void*)((long*)(C_ptr) + offset); M_ptr = (void*)((long*)(M_ptr) + offset); break; case C_LONGLONG: A_ptr = (void*)((long long*)(A_ptr) + offset); B_ptr = (void*)((long long*)(B_ptr) + offset); C_ptr = (void*)((long long*)(C_ptr) + offset); M_ptr = (void*)((long long*)(M_ptr) + offset); break; default: break; } /*compute elementwise median */ switch (type) { case C_INT: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { ia = ((int *) A_ptr)[idx + j]; ib = ((int *) B_ptr)[idx + j]; ic = ((int *) C_ptr)[idx + j]; median(ia, ib, ic, im); ((int *) M_ptr)[idx + j] = im; } } break; case C_LONG: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { la = ((long *) A_ptr)[idx + j]; lb = ((long *) B_ptr)[idx + j]; lc = ((long *) C_ptr)[idx + j]; median(la, lb, lc, lm); ((long *) M_ptr)[idx + j] = lm; } } break; case C_FLOAT: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { fa = ((float *) A_ptr)[idx + j]; fb = ((float *) B_ptr)[idx + j]; fc = ((float *) C_ptr)[idx + j]; median(fa, fb, fc, fm); ((float *) M_ptr)[idx + j] = fm; } } break; case C_DBL: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { da = ((double *) A_ptr)[idx + j]; db = ((double *) B_ptr)[idx + j]; dc = ((double *) C_ptr)[idx + j]; median(da, db, dc, dm); ((double *) M_ptr)[idx + j] = dm; } } break; case C_DCPL: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { za = ((DoubleComplex *) A_ptr)[idx + j]; zb = ((DoubleComplex *) B_ptr)[idx + j]; zc = ((DoubleComplex *) C_ptr)[idx + j]; na = sqrt ((za.real) * (za.real) + (za.imag) * (za.imag)); nb = sqrt ((zb.real) * (zb.real) + (zb.imag) * (zb.imag)); nc = sqrt ((zc.real) * (zc.real) + (zc.imag) * (zc.imag)); median_dcpl(na, nb, nc, za, zb, zc, zm); ((DoubleComplex *) M_ptr)[idx + j] = zm; } } break; case C_SCPL: for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j < ndim; j++) { idx += bvalue[j] * baseldA[j - 1]; if (((i + 1) % bunit[j]) == 0) bvalue[j]++; if (bvalue[j] > (hiA[j] - loA[j])) bvalue[j] = 0; } for (j = 0; j < (hiA[0] - loA[0] + 1); j++) { ca = ((SingleComplex *) A_ptr)[idx + j]; cb = ((SingleComplex *) B_ptr)[idx + j]; cc = ((SingleComplex *) C_ptr)[idx + j]; na = sqrt ((ca.real) * (ca.real) + (ca.imag) * (ca.imag)); nb = sqrt ((cb.real) * (cb.real) + (cb.imag) * (cb.imag)); nc = sqrt ((cc.real) * (cc.real) + (cc.imag) * (cc.imag)); median_scpl(na, nb, nc, ca, cb, cc, cm); ((SingleComplex *) M_ptr)[idx + j] = cm; } } break; default: pnga_error("median: wrong data type", type); } } /*\ median routine \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_median_patch = pnga_median_patch #endif void pnga_median_patch( g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi, g_m, mlo, mhi) Integer g_a, *alo, *ahi; /* patch of g_a */ Integer g_b, *blo, *bhi; /* patch of g_b */ Integer g_c, *clo, *chi; /* patch of g_c */ Integer g_m, *mlo, *mhi; /* patch of g_m */ { Integer i, j; Integer atype, btype, andim, adims[MAXDIM], bndim, bdims[MAXDIM]; Integer ctype, mtype, cndim, cdims[MAXDIM], mndim, mdims[MAXDIM]; Integer loA[MAXDIM], hiA[MAXDIM], ldA[MAXDIM]; Integer loB[MAXDIM], hiB[MAXDIM], ldB[MAXDIM]; Integer loC[MAXDIM], hiC[MAXDIM], ldC[MAXDIM]; Integer loM[MAXDIM], hiM[MAXDIM], ldM[MAXDIM]; Integer g_A = g_a, g_B = g_b; Integer g_C = g_c, g_M = g_m; void *A_ptr, *B_ptr; void *C_ptr, *M_ptr; Integer offset; Integer atotal, btotal; Integer ctotal, mtotal; Integer me = pnga_nodeid (), a_temp_created = 0, b_temp_created = 0, c_temp_created = 0; Integer type = GA_TYPE_GSM, compatible; char *tempname = "temp", transp = 'n'; /*no transpose */ Integer num_blocks_a, num_blocks_b, num_blocks_c, num_blocks_m; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME ("pnga_median_patch"); pnga_inquire (g_a, &atype, &andim, adims); pnga_inquire (g_b, &btype, &bndim, bdims); pnga_inquire (g_c, &ctype, &cndim, cdims); pnga_inquire (g_m, &mtype, &mndim, mdims); /* I have to inquire the data type again since nga_inquire and * nga_inquire_internal_ treat data type differently */ pnga_inquire(g_m, &type, &mndim, mdims); if (mtype != atype) pnga_error(" pnga_median_patch:type mismatch ", 0L); if (mtype != btype) pnga_error(" pnga_median_patch:type mismatch ", 0L); if (mtype != ctype) pnga_error(" pnga_median_patch:type mismatch ", 0L); /* check if patch indices and g_a dims match */ for (i = 0; i < andim; i++) if (alo[i] <= 0 || ahi[i] > adims[i]) { pnga_error("pnga_median_patch: g_a indices out of range ", g_a); } for (i = 0; i < bndim; i++) if (blo[i] <= 0 || bhi[i] > bdims[i]) { pnga_error("pnga_median_patch:g_b indices out of range ", g_b); } for (i = 0; i < cndim; i++) if (clo[i] <= 0 || chi[i] > cdims[i]) { pnga_error("pnga_median_patch:g_c indices out of range ", g_c); } for (i = 0; i < mndim; i++) if (mlo[i] <= 0 || mhi[i] > mdims[i]) { pnga_error("pnga_median_patch:g_m indices out of range ", g_m); } /* check if numbers of elements in two patches match each other */ atotal = 1; for (i = 0; i < andim; i++) atotal *= (ahi[i] - alo[i] + 1); btotal = 1; for (i = 0; i < bndim; i++) btotal *= (bhi[i] - blo[i] + 1); ctotal = 1; for (i = 0; i < cndim; i++) ctotal *= (chi[i] - clo[i] + 1); mtotal = 1; for (i = 0; i < mndim; i++) mtotal *= (mhi[i] - mlo[i] + 1); if (mtotal != atotal) pnga_error("pnga_median_patch: capacities of patches do not match ", 0L); if (mtotal != btotal) pnga_error("pnga_median_patch: capacities of patches do not match ", 0L); if (mtotal != ctotal) pnga_error("pnga_median_patch: capacities of patches do not match ", 0L); num_blocks_a = pnga_total_blocks(g_a); num_blocks_b = pnga_total_blocks(g_b); num_blocks_c = pnga_total_blocks(g_c); num_blocks_m = pnga_total_blocks(g_m); if (num_blocks_a < 0 && num_blocks_b < 0 && num_blocks_c < 0 && num_blocks_m < 0) { /* find out coordinates of patches of g_A, g_B, g_C, and g_M that I own */ pnga_distribution (g_A, me, loA, hiA); pnga_distribution (g_B, me, loB, hiB); pnga_distribution (g_C, me, loC, hiC); pnga_distribution (g_M, me, loM, hiM); if (!pnga_comp_patch (andim, loA, hiA, mndim, loM, hiM)) compatible = 1; else compatible = 0; pnga_gop(pnga_type_f2c(MT_F_INT), &compatible, 1, "*"); if (!compatible) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_a * - copy & reshape patch of g_b into g_B */ if (!pnga_duplicate(g_m, &g_A, tempname)) pnga_error("pnga_median_patch:duplicate failed", 0L); pnga_copy_patch(&transp, g_a, alo, ahi, g_A, mlo, mhi); andim = mndim; a_temp_created = 1; pnga_distribution (g_A, me, loA, hiA); } if (!pnga_comp_patch (bndim, loB, hiB, mndim, loM, hiM)) compatible = 1; else compatible = 0; pnga_gop(pnga_type_f2c(MT_F_INT), &compatible, 1, "*"); if (!compatible) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_a * - copy & reshape patch of g_c into g_C */ if (!pnga_duplicate(g_m, &g_B, tempname)) pnga_error("pnga_median_patch:duplicate failed", 0L); pnga_copy_patch(&transp, g_b, blo, bhi, g_B, mlo, mhi); bndim = mndim; b_temp_created = 1; pnga_distribution (g_B, me, loB, hiB); } if (!pnga_comp_patch (cndim, loC, hiC, mndim, loM, hiM)) compatible = 1; else compatible = 0; pnga_gop(pnga_type_f2c(MT_F_INT), &compatible, 1, "*"); if (!compatible) { /* either patches or distributions do not match: * - create a temp array that matches distribution of g_a * - copy & reshape patch of g_m into g_M */ if (!pnga_duplicate(g_m, &g_C, tempname)) pnga_error("pnga_median_patch:duplicate failed", 0L); /*no need to copy g_m since it is the output matrix. */ cndim = mndim; c_temp_created = 1; pnga_copy_patch(&transp, g_c, clo, chi, g_C, mlo, mhi); pnga_distribution (g_C, me, loC, hiC); } if (!pnga_comp_patch (mndim, loM, hiM, andim, loA, hiA)) pnga_error(" patches mismatch ", 0); if (!pnga_comp_patch (mndim, loM, hiM, bndim, loB, hiB)) pnga_error(" patches mismatch ", 0); if (!pnga_comp_patch (mndim, loM, hiM, cndim, loC, hiC)) pnga_error(" patches mismatch ", 0); /* A[83:125,1:1] <==> B[83:125] */ if (mndim > andim) mndim = andim; /* need more work */ if (mndim > bndim) mndim = bndim; /* need more work */ if (mndim > cndim) mndim = cndim; /* need more work */ /* determine subsets of my patches to access */ if (pnga_patch_intersect (mlo, mhi, loM, hiM, mndim)) { offset = 0; pnga_access_ptr (g_A, loM, hiM, &A_ptr, ldA); pnga_access_ptr (g_B, loM, hiM, &B_ptr, ldB); pnga_access_ptr (g_C, loM, hiM, &C_ptr, ldC); pnga_access_ptr (g_M, loM, hiM, &M_ptr, ldM); sgai_median_patch_values(type, mndim, loM, hiM, ldM, A_ptr, B_ptr, C_ptr, M_ptr, offset); /* release access to the data */ pnga_release (g_A, loM, hiM); pnga_release (g_B, loM, hiM); pnga_release (g_C, loM, hiM); pnga_release_update (g_M, loM, hiM); } } else { /* create copies of A, B, and C that are identically distributed as M */ if (!pnga_duplicate(g_m, &g_A, tempname)) pnga_error("ga_add_patch: dup failed", 0L); pnga_copy_patch(&transp, g_a, alo, ahi, g_A, mlo, mhi); andim = mndim; a_temp_created = 1; if (!pnga_duplicate(g_m, &g_B, tempname)) pnga_error("ga_add_patch: dup failed", 0L); pnga_copy_patch(&transp, g_b, blo, bhi, g_B, mlo, mhi); bndim = mndim; b_temp_created = 1; if (!pnga_duplicate(g_m, &g_C, tempname)) pnga_error("ga_add_patch: dup failed", 0L); pnga_copy_patch(&transp, g_c, clo, chi, g_C, mlo, mhi); cndim = mndim; c_temp_created = 1; /* M is normally distributed so just get the mean using standard approach */ if (num_blocks_m < 0) { offset = 0; pnga_distribution(g_m, me, loM, hiM); if (pnga_patch_intersect (mlo, mhi, loM, hiM, mndim)) { pnga_access_ptr (g_A, loM, hiM, &A_ptr, ldA); pnga_access_ptr (g_B, loM, hiM, &B_ptr, ldB); pnga_access_ptr (g_C, loM, hiM, &C_ptr, ldC); pnga_access_ptr (g_M, loM, hiM, &M_ptr, ldM); sgai_median_patch_values(type, mndim, loM, hiM, ldM, A_ptr, B_ptr, C_ptr, M_ptr, offset); /* release access to the data */ pnga_release (g_A, loM, hiM); pnga_release (g_B, loM, hiM); pnga_release (g_C, loM, hiM); pnga_release_update (g_M, loM, hiM); } } else { Integer idx, lod[MAXDIM]/*, hid[MAXDIM]*/; Integer jtot, last, nproc; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_m)) { nproc = pnga_nnodes(); for (idx = me; idx < num_blocks_m; idx += nproc) { pnga_distribution(g_m, idx, loM, hiM); /* make temporary copies of loM and hiM since pnga_patch_intersect destroys original versions */ for (j=0; j mdims[i]) hiM[i] = mdims[i]; /*if (hiM[i] < loM[i]) chk = 0;*/ } /* make temporary copies of loC and hiC since pnga_patch_intersect destroys original versions */ for (j=0; j= blocks[i] && i 0 && jhiA > 0) { switch (type) { int *pi; double *pd; long *pl; float *pf; DoubleComplex *pz; SingleComplex *pc; DoubleComplex zval; SingleComplex cval; double dtemp; float ftemp; case C_INT: pi = (int *) ptr; *isum = GA_ABS(pi[0]); for (j = 0; j < jhiA - jloA + 1; j++) { for (i = 0; i < ihiA - iloA + 1; i++) if (GA_ABS(pi[j*ld + i]) > *isum) *isum = GA_ABS(pi[j*ld+i]); } break; case C_LONG: pl = (long *) ptr; *lsum = GA_ABS(pl[0]); for (j = 0; j < jhiA - jloA + 1; j++) for (i = 0; i < ihiA - iloA + 1; i++) if (GA_ABS(pl[j*ld + i]) > *lsum) *lsum = GA_ABS(pl[j*ld+i]); break; case C_DCPL: pz = (DoubleComplex *) ptr; zval = pz[0]; dtemp = sqrt (zval.real * zval.real + zval.imag * zval.imag); (*zsum).real = dtemp; for (j = 0; j < jhiA - jloA + 1; j++) for (i = 0; i < ihiA - iloA + 1; i++) { zval = pz[j * ld + i]; dtemp = sqrt (zval.real * zval.real + zval.imag * zval.imag); if (dtemp > (*zsum).real) (*zsum).real = dtemp; } break; case C_SCPL: pc = (SingleComplex *) ptr; cval = pc[0]; ftemp = sqrt (cval.real * cval.real + cval.imag * cval.imag); (*csum).real = ftemp; for (j = 0; j < jhiA - jloA + 1; j++) for (i = 0; i < ihiA - iloA + 1; i++) { cval = pc[j * ld + i]; ftemp = sqrt (cval.real * cval.real + cval.imag * cval.imag); if (ftemp > (*csum).real) (*csum).real = ftemp; } break; case C_FLOAT: pf = (float *) ptr; *fsum = pf[0]; for (j = 0; j < jhiA - jloA + 1; j++) for (i = 0; i < ihiA - iloA + 1; i++) if (GA_ABS(pf[j*ld+i]) > *fsum) *fsum = GA_ABS(pf[j*ld+i]); break; case C_DBL: pd = (double *) ptr; *dsum = pd[0]; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) if (GA_ABS(pd[j*ld+i]) > *dsum) *dsum = GA_ABS(pd[j*ld+i]); break; default: pnga_error("sgai_norm_infinity_block: wrong data type ", type); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_norm_infinity = pnga_norm_infinity #endif void pnga_norm_infinity(Integer g_a, double *nm) { Integer type; Integer me = pnga_nodeid (), i, j, nproc = pnga_nnodes(); Integer ndim, dims[MAXDIM], lo[2], hi[2], ld; Integer num_blocks_a; int local_sync_begin,local_sync_end; int isum = 0; long lsum = 0; double dsum = 0.0; float fsum = 0.0; float fval; double dval; DoubleComplex zsum; SingleComplex csum; void *buf = NULL; void *ptr = NULL; zsum.real = 0.0; zsum.imag = 0.0; csum.real = 0.0; csum.imag = 0.0; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_norm_infinity_"); GA_PUSH_NAME ("ga_norm_infinity_"); pnga_inquire (g_a, &type, &ndim, dims); if(ndim<=0) pnga_error("ga_norm_infinity: wrong dimension", ndim); else if (ndim >= 3) pnga_error("ga_norm_infinity: wrong dimension", ndim); switch (type) { case C_INT: buf = (void*)(&isum); break; case C_LONG: buf = (void*)(&lsum); break; case C_FLOAT: buf = (void*)(&fsum); break; case C_DBL: buf = (void*)(&dsum); break; case C_DCPL: buf = (void*)(&zsum); break; case C_SCPL: buf = (void*)(&csum); break; default: pnga_error("ga_norm_infinity_: wrong data type:", type); } num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, lo, hi); pnga_access_ptr(g_a, lo, hi, &ptr, &ld); sgai_norm_infinity_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update(g_a, lo, hi); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, lo, hi); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_norm_infinity_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[ndim-1] < blocks[ndim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < ndim; i++) { lo[i] = index[i]*block_dims[i]+1; hi[i] = (index[i] + 1)*block_dims[i]; if (hi[i] > dims[i]) hi[i] = dims[i]; if (hi[i] < lo[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_norm_infinity_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < ndim; i++) { if (index[i] >= blocks[i] && i 0 && jhiA > 0) { switch (type) { int *pi; double *pd; long *pl; float *pf; DoubleComplex *pz; SingleComplex *pc; case C_INT: pi = (int *) ptr; *isum = 0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) *isum += GA_ABS (pi[j * ld + i]); break; case C_LONG: pl = (long *) ptr; *lsum = 0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) *lsum += GA_ABS (pl[j * ld + i]); break; case C_DCPL: pz = (DoubleComplex *) ptr; (*zsum).real = 0.0; (*zsum).imag = 0.0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) { DoubleComplex zval = pz[j * ld + i]; double temp = sqrt (zval.real * zval.real + zval.imag * zval.imag); (*zsum).real += temp; } break; case C_SCPL: pc = (SingleComplex *) ptr; (*csum).real = 0.0; (*csum).imag = 0.0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) { SingleComplex cval = pc[j * ld + i]; float temp = sqrt (cval.real * cval.real + cval.imag * cval.imag); (*csum).real += temp; } break; case C_FLOAT: pf = (float *) ptr; *fsum = 0.0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) *fsum += GA_ABS (pf[j * ld + i]); break; case C_DBL: pd = (double *) ptr; *dsum = 0.0; for (i = 0; i < ihiA - iloA + 1; i++) for (j = 0; j < jhiA - jloA + 1; j++) *dsum += GA_ABS (pd[j * ld + i]); break; default: pnga_error("sgai_norm1_block: wrong data type ", type); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_norm1 = pnga_norm1 #endif void pnga_norm1(Integer g_a, double *nm) { Integer type=0; Integer me = pnga_nodeid (), i, j, nproc = pnga_nnodes(); Integer ndim, dims[MAXDIM], lo[2], hi[2], ld; Integer num_blocks_a; int local_sync_begin,local_sync_end; int isum = 0; long lsum = 0; double dsum = 0.0; float fsum = 0.0; double dval; float fval; DoubleComplex zsum; SingleComplex csum; void *buf = NULL; /*temporary buffer */ void *ptr = NULL; zsum.real = 0.0; zsum.imag = 0.0; csum.real = 0.0; csum.imag = 0.0; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_norm1_"); GA_PUSH_NAME ("ga_norm1_"); pnga_inquire (g_a, &type, &ndim, dims); if(ndim<=0 || ndim > 2) pnga_error("ga_norm1: wrong dimension", ndim); switch (type) { case C_INT: buf = (void*)(&isum); break; case C_LONG: buf = (void*)(&lsum); break; case C_FLOAT: buf = (void*)(&fsum); break; case C_DBL: buf = (void*)(&dsum); break; case C_DCPL: buf = (void*)(&zsum); break; case C_SCPL: buf = (void*)(&csum); break; default: pnga_error("ga_norm1_: wrong data type:", type); } num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, lo, hi); pnga_access_ptr(g_a, lo, hi, &ptr, &ld); sgai_norm1_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update(g_a, lo, hi); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, lo, hi); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_norm1_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[ndim-1] < blocks[ndim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < ndim; i++) { lo[i] = index[i]*block_dims[i]+1; hi[i] = (index[i] + 1)*block_dims[i]; if (hi[i] > dims[i]) hi[i] = dims[i]; if (hi[i] < lo[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_norm1_block(g_a, ptr, lo, hi, ld, type, ndim, dims, buf); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < ndim; i++) { if (index[i] >= blocks[i] && i 0) { lo[0] = GA_MAX (iloA, jloA); lo[1] = GA_MAX (iloA, jloA); hi[0] = GA_MIN (ihiA, jhiA); hi[1] = GA_MIN (ihiA, jhiA); if (hi[0] >= lo[0]) /*make sure the equality symbol is there!!! */ { /* we got a block containing diagonal elements */ /*allocate a buffer for the given vector g_v */ size = GAsizeof (type); vlo = GA_MAX (iloA, jloA); vhi = GA_MIN (ihiA, jhiA); nelem = vhi - vlo + 1; buf = malloc (nelem * size); if (buf == NULL) pnga_error ("ga_get_diag_:failed to allocate memory for the local buffer.", 9999); /* get the vector from the global array g_a, put that in the the local memory buffer buf */ switch (type) { case C_INT: ia = (int *) ptr; ia += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { ((int *) buf)[i] = *ia; ia += ld + 1; } break; case C_LONG: la = (long *) ptr; la += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { ((long *) buf)[i] = *la; la += ld + 1; } break; case C_FLOAT: fa = (float *) ptr; fa += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { ((float *) buf)[i] = *fa; fa += ld + 1; } break; case C_DBL: da = (double *) ptr; da += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { ((double *) buf)[i] = *da; da += ld + 1; } break; case C_DCPL: dca = (DoubleComplex *) ptr; dca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (((DoubleComplex *) buf)[i]).real = (*dca).real; (((DoubleComplex *) buf)[i]).imag = (*dca).imag; dca += ld + 1; } break; case C_SCPL: fca = (SingleComplex *) ptr; fca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (((SingleComplex *) buf)[i]).real = (*fca).real; (((SingleComplex *) buf)[i]).imag = (*fca).imag; fca += ld + 1; } break; default: pnga_error("get_diagonal_zero: wrong data type:", type); } /* copy the local memory buffer buf to g_v */ pnga_put(g_v, &vlo, &vhi, buf, &vhi); /*free the memory */ free (buf); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_diag = pnga_get_diag #endif void pnga_get_diag(Integer g_a, Integer g_v) { Integer vndim, vdims, dim1, dim2, vtype, atype, type; Integer me = pnga_nodeid (), i, nproc = pnga_nnodes(); Integer andim, adims[2]; Integer loA[2], hiA[2], ld; Integer num_blocks_a; int local_sync_begin,local_sync_end; void *ptr; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_get_diag_"); pnga_check_handle (g_v, "ga_get_diag_"); GA_PUSH_NAME ("ga_get_diag_"); pnga_inquire (g_a, &atype, &andim, adims); dim1 = adims[0]; dim2 = adims[1]; type = atype; pnga_inquire (g_v, &vtype, &vndim, &vdims); /* Perform some error checking */ if (andim != 2) pnga_error("ga_get_diag: wrong dimension for g_a.", andim); if (vndim != 1) pnga_error("ga_get_diag: wrong dimension for g_v.", vndim); if (vdims != GA_MIN (dim1, dim2)) pnga_error ("ga_get_diag: The size of the first array's diagonal is greater than the size of the second array.", type); if (vtype != atype) { pnga_error ("ga_get_diag: input global arrays do not have the same data type. Global array type =", atype); } num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, loA, hiA); pnga_access_ptr(g_a, loA, hiA, &ptr, &ld); sgai_get_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update(g_a, loA, hiA); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, loA, hiA); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_get_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[andim-1] < blocks[andim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < andim; i++) { loA[i] = index[i]*block_dims[i]+1; hiA[i] = (index[i] + 1)*block_dims[i]; if (hiA[i] > adims[i]) hiA[i] = adims[i]; if (hiA[i] < loA[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_get_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < andim; i++) { if (index[i] >= blocks[i] && i 0) { lo[0] = GA_MAX (iloA, jloA); lo[1] = GA_MAX (iloA, jloA); hi[0] = GA_MIN (ihiA, jhiA); hi[1] = GA_MIN (ihiA, jhiA); if (hi[0] >= lo[0]) /*make sure the equality symbol is there!!! */ { /* we got a block containing diagonal elements */ /*allocate a buffer for the given vector g_v */ size = GAsizeof (type); vlo = GA_MAX (iloA, jloA); vhi = GA_MIN (ihiA, jhiA); nelem = vhi - vlo + 1; buf = malloc (nelem * size); if (buf == NULL) pnga_error ("ga_add_diagonal_:failed to allocate memory for the local buffer.", 0); /* get the vector from the global array to the local memory buffer */ pnga_get (g_v, &vlo, &vhi, buf, &vhi); switch (type) { case C_INT: ia = (int *) ptr; ia += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *ia += ((int *) buf)[i]; ia += ld + 1; } break; case C_LONG: la = (long *) ptr; la += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *la += ((long *) buf)[i]; la += ld + 1; } break; case C_FLOAT: fa = (float *) ptr; fa += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *fa += ((float *) buf)[i]; fa += ld + 1; } break; case C_DBL: da = (double *) ptr; da += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *da += ((double *) buf)[i]; da += ld + 1; } break; case C_DCPL: dca = (DoubleComplex *) ptr; dca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*dca).real += (((DoubleComplex *) buf)[i]).real; (*dca).imag += (((DoubleComplex *) buf)[i]).imag; dca += ld + 1; } break; case C_SCPL: fca = (SingleComplex *) ptr; fca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*fca).real += (((SingleComplex *) buf)[i]).real; (*fca).imag += (((SingleComplex *) buf)[i]).imag; fca += ld + 1; } break; default: pnga_error("ga_add_diagonal_: wrong data type:", type); } /*free the memory */ free (buf); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_add_diagonal = pnga_add_diagonal #endif void pnga_add_diagonal(Integer g_a, Integer g_v) { Integer vndim, vdims, dim1, dim2, vtype, atype, type; Integer me = pnga_nodeid (), i, nproc = pnga_nnodes(); Integer andim, adims[2]; Integer loA[2], hiA[2], ld; Integer num_blocks_a; int local_sync_begin,local_sync_end; void *ptr; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_add_diagonal_"); pnga_check_handle (g_v, "ga_add_diagonal_"); GA_PUSH_NAME ("ga_add_diagonal_"); pnga_inquire(g_a, &atype, &andim, adims); dim1 = adims[0]; dim2 = adims[1]; type = atype; pnga_inquire(g_v, &vtype, &vndim, &vdims); /* Perform some error checking */ if (andim != 2) pnga_error("ga_add_diagonal: wrong dimension for g_a.", andim); if (vndim != 1) pnga_error("ga_add_diagonal: wrong dimension for g_v.", vndim); if (vdims != GA_MIN (dim1, dim2)) pnga_error ("ga_add_diagonal: The size of the first array's diagonal is greater than the size of the second array.", type); if (vtype != atype) { pnga_error ("ga_add_diagonal: input global arrays do not have the same data type. Global array type =", atype); } num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, loA, hiA); pnga_access_ptr(g_a, loA, hiA, &ptr, &ld); sgai_add_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, loA, hiA); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_add_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[andim-1] < blocks[andim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < andim; i++) { loA[i] = index[i]*block_dims[i]+1; hiA[i] = (index[i] + 1)*block_dims[i]; if (hiA[i] > adims[i]) hiA[i] = adims[i]; if (hiA[i] < loA[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_add_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < andim; i++) { if (index[i] >= blocks[i] && i 0) { lo[0] = GA_MAX (iloA, jloA); lo[1] = GA_MAX (iloA, jloA); hi[0] = GA_MIN (ihiA, jhiA); hi[1] = GA_MIN (ihiA, jhiA); if (hi[0] >= lo[0]) /*make sure the equality symbol is there!!! */ { /* we got a block containing diagonal elements*/ /*allocate a buffer for the given vector g_v */ size = GAsizeof (type); vlo = GA_MAX (iloA, jloA); vhi = GA_MIN (ihiA, jhiA); nelem = vhi - vlo + 1; buf = malloc (nelem * size); if (buf == NULL) pnga_error ("ga_set_diagonal_:failed to allocate memory for local buffer",0); /* get the vector from the global array to the local memory buffer */ pnga_get (g_v, &vlo, &vhi, buf, &vhi); switch (type) { case C_INT: ia = (int *) ptr; ia += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *ia = ((int *) buf)[i]; ia += ld + 1; } break; case C_LONG: la = (long *) ptr; la += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *la = ((long *) buf)[i]; la += ld + 1; } break; case C_FLOAT: fa = (float *) ptr; fa += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *fa = ((float *) buf)[i]; fa += ld + 1; } break; case C_DBL: da = (double *) ptr; da += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *da = ((double *) buf)[i]; da += ld + 1; } break; case C_DCPL: dca = (DoubleComplex *) ptr; dca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*dca).real = (((DoubleComplex *) buf)[i]).real; (*dca).imag = (((DoubleComplex *) buf)[i]).imag; dca += ld + 1; } break; case C_SCPL: fca = (SingleComplex *) ptr; fca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*fca).real = (((SingleComplex *) buf)[i]).real; (*fca).imag = (((SingleComplex *) buf)[i]).imag; fca += ld + 1; } break; default: pnga_error("ga_set_diagonal_: wrong data type:", type); } /*free the memory */ free (buf); /* release access to the data */ lo[0] = iloA; lo[1] = jloA; hi[0] = ihiA; hi[1] = jhiA; pnga_release_update (g_a, lo, hi); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_diagonal = pnga_set_diagonal #endif void pnga_set_diagonal(Integer g_a, Integer g_v) { Integer vndim, vdims, dim1, dim2, vtype, atype, type; Integer me = pnga_nodeid (), i, nproc = pnga_nnodes(); Integer andim, adims[2]; Integer loA[2], hiA[2], ld; Integer num_blocks_a; int local_sync_begin,local_sync_end; void *ptr; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_set_diagonal_"); pnga_check_handle (g_v, "ga_set_diagonal_"); GA_PUSH_NAME ("ga_set_diagonal_"); pnga_inquire (g_a, &atype, &andim, adims); dim1 = adims[0]; dim2 = adims[1]; type = atype; pnga_inquire (g_v, &vtype, &vndim, &vdims); /* Perform some error checking */ if (andim != 2) pnga_error("ga_set_diagonal: wrong dimension for g_a.", andim); if (vndim != 1) pnga_error("ga_set_diagonal: wrong dimension for g_v.", vndim); if (vdims != GA_MIN (dim1, dim2)) pnga_error ("ga_set_diagonal: The size of the first array's diagonal is greater than the size of the second array.", type); if (vtype != atype) { pnga_error ("ga_set_diagonal: input global arrays do not have the same data type. Global array type =", atype); } num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, loA, hiA); pnga_access_ptr(g_a, loA, hiA, &ptr, &ld); sgai_set_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update(g_a, loA, hiA); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, loA, hiA); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_set_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[andim-1] < blocks[andim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < andim; i++) { loA[i] = index[i]*block_dims[i]+1; hiA[i] = (index[i] + 1)*block_dims[i]; if (hiA[i] > adims[i]) hiA[i] = adims[i]; if (hiA[i] < loA[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_set_diagonal_block(g_a, ptr, g_v, loA, hiA, ld, type); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < andim; i++) { if (index[i] >= blocks[i] && i 0) { lo[0] = GA_MAX (iloA, jloA); lo[1] = GA_MAX (iloA, jloA); hi[0] = GA_MIN (ihiA, jhiA); hi[1] = GA_MIN (ihiA, jhiA); if (hi[0] >= lo[0]) /*make sure the equality sign is there since it is the singleton case */ { /* we got a block containing diagonal elements */ switch (type) { case C_INT: ia = (int *) ptr; ia += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *ia += *((int *) c); ia += ld + 1; } break; case C_LONG: la = (long *) ptr; la += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *la += *((long *) c); la += ld + 1; } break; case C_FLOAT: fa = (float *) ptr; fa += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *fa += *((float *) c); fa += ld + 1; } break; case C_DBL: da = (double *) ptr; da += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { *da += *((double *) c); da += ld + 1; } break; case C_DCPL: dca = (DoubleComplex *) ptr; dca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*dca).real += (*((DoubleComplex *) c)).real; (*dca).imag += (*((DoubleComplex *) c)).imag; dca += ld + 1; } break; case C_SCPL: fca = (SingleComplex *) ptr; fca += ld*(lo[1]-jloA) + lo[0]-iloA; for (i = 0; i < hi[0] - lo[0] + 1; i++) { (*fca).real += (*((SingleComplex *) c)).real; (*fca).imag += (*((SingleComplex *) c)).imag; fca += ld + 1; } break; default: pnga_error("ga_shift_diagonal_: wrong data type:", type); } } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_shift_diagonal = pnga_shift_diagonal #endif void pnga_shift_diagonal(Integer g_a, void *c) { Integer loA[2], hiA[2]/*, dim1, dim2*/, ld; Integer andim, adims[2], type, atype; Integer me = pnga_nodeid (), i, nproc = pnga_nnodes(); void *ptr; Integer num_blocks_a; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); pnga_check_handle (g_a, "ga_shift_diagonal_"); GA_PUSH_NAME ("ga_shift_diagonal_"); pnga_inquire (g_a, &atype, &andim, adims); /*dim1 = adims[0];*/ /*dim2 = adims[1];*/ type = atype; if (andim != 2) pnga_error("Dimension must be 2 for shift diagonal operation",andim); num_blocks_a = pnga_total_blocks(g_a); if (num_blocks_a < 0) { pnga_distribution(g_a, me, loA, hiA); pnga_access_ptr(g_a, loA, hiA, &ptr, &ld); sgai_shift_diagonal_block(g_a, ptr, loA, hiA, ld, c, type); pnga_release_update(g_a, loA, hiA); } else { Integer idx; /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, loA, hiA); pnga_access_block_ptr(g_a, idx, &ptr, &ld); sgai_shift_diagonal_block(g_a, ptr, loA, hiA, ld, c, type); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[andim-1] < blocks[andim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < andim; i++) { loA[i] = index[i]*block_dims[i]+1; hiA[i] = (index[i] + 1)*block_dims[i]; if (hiA[i] > adims[i]) hiA[i] = adims[i]; if (hiA[i] < loA[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr, &ld); sgai_shift_diagonal_block(g_a, ptr, loA, hiA, ld, c, type); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < andim; i++) { if (index[i] >= blocks[i] && i 0) { lo[0] = GA_MAX (loA[0], loA[1]); lo[1] = GA_MAX (loA[0], loA[1]); hi[0] = GA_MIN (hiA[0], hiA[1]); hi[1] = GA_MIN (hiA[0], hiA[1]); if (hi[0] >= lo[0]) { /* we got a block containing diagonal elements */ pnga_access_ptr (g_a, lo, hi, &ptr, &ld); sgai_zero_diagonal_block(g_a, ptr, lo, hi, ld, offset, type); /* release access to the data */ pnga_release_update (g_a, lo, hi); } } } else { Integer idx, lld[MAXDIM], offset; Integer jtot, last, j; Integer nproc = pnga_nnodes(); /* Simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, loA, hiA); lo[0] = GA_MAX (loA[0], loA[1]); lo[1] = GA_MAX (loA[0], loA[1]); hi[0] = GA_MIN (hiA[0], hiA[1]); hi[1] = GA_MIN (hiA[0], hiA[1]); if (hi[0] >= lo[0]) { pnga_access_block_ptr(g_a, idx, &ptr, lld); /* evaluate offsets for system */ offset = 0; last = andim - 1; jtot = 1; for (j=0; j adims[i]) hiA[i] = adims[i]; /*if (hiA[i] < loA[i]) chk = 0;*/ } lo[0] = GA_MAX (loA[0], loA[1]); lo[1] = GA_MAX (loA[0], loA[1]); hi[0] = GA_MIN (hiA[0], hiA[1]); hi[1] = GA_MIN (hiA[0], hiA[1]); if (hi[0] >= lo[0]) { pnga_access_block_grid_ptr(g_a, index, &ptr, lld); /* evaluate offsets for system */ offset = 0; last = andim - 1; jtot = 1; for (j=0; j= blocks[i] && i 0) { if (hi[0] >= lo[0]) { /*make sure the equality symbol is there!!! */ /* we got a block containing diagonal elements */ Integer myrows = hi[0] - lo[0] + 1; Integer i, j; /*number of rows on the patch is jhiA - jloA + 1 */ vlo =lo[0] ; vhi = hi[0]; /*allocate a buffer for the given vector g_v */ size = GAsizeof (type); buf = malloc (myrows * size); if (buf == NULL) pnga_error ("ga_scale_rows_:failed to allocate memory for the local buffer.", 0); /* get the vector from the global array to the local memory buffer */ pnga_get (g_v, &vlo, &vhi, buf, &vhi); switch (type) { case C_INT: ia = (int *) ptr; for (i = 0; i < hi[0]-lo[0]+1; i++) /*for each row */ for(j=0;j 0 : the leading minor of this order c* is not positive definite and the c* factorization could not be completed c* c*********************************************************************** integer function ga_cholesky(uplo, g_a) implicit none character*1 uplo ! (input) 'U' or 'L' integer g_A ! (input/output) integer ga_llt_f ga_cholesky = ga_llt_f(uplo, g_A, -1) end c*********************************************************************** c* function : ga_llt_f c* c* Internal function to compute the Cholesky factorization of c* an NxN double precision symmetric positive definite GA. c* c* Note: applications should use ga_cholesky c* c* On succesful exit A will contain the L/U factor c* on the lower/upper triangular part of the matrix c* c* This if (hsA.eq.-1), otherwise internal state c* is saved for future references. This is c* reserved for internal use. Users should c* not try to set hsA to something c* different from -1 if they do not c* know what they are doing! On exit hsA will c* contain the local A output array in SLS format. c* c* It calls the PDPOTRF ScaLAPACK routine. c* c* It returns c* = 0 : successful exit c* > 0 : the leading minor of this order c* is not positive definite and the c* factorization could not be completed c*********************************************************************** integer function ga_llt_f(uplo, g_A, hsA) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c**** character*1 uplo ! (input) 'U' or 'L' integer g_A ! (input/output) integer hsA ! (input/output) c**** logical status integer hA, adrA integer dimA18, dimA28, typeA INTGR4 dimA1, dimA2 INTGR4 mpA, nqA INTGR4 info integer me INTGR4 n, ldA integer elemA INTGR4 numroc INTGR4 nb INTGR4 descA(DSCLEN) integer intsize,info8 INTGR4 one4,zero4 parameter(zero4=0,one4=1) logical oactive integer alen,block_dims(2),blocks(2) logical use_direct data nb /NB_/ c**** Check Environment me = ga_nodeid() c**** Check GA info for input array A call ga_check_handle(g_A, 'ga_llt_f: A') call ga_inquire(g_A, typeA, dimA18, dimA28) dima1=dima18 dima2=dima28 c**** if (dimA1.ne.dimA2) then call ga_error('ga_llt_f: g_A must be a square matrix ', 1) endif c c Determine whether or not to use GA data directly c use_direct = ga_uses_proc_grid(g_A) if (use_direct) then call ga_get_block_info(g_A,blocks,block_dims) if (block_dims(1).ne.block_dims(2)) then use_direct = .false. endif endif if (use_direct) then nb = block_dims(1) endif c**** n = dimA1 c**** Initialize SL Interface if (use_direct) then call SLinit3(g_A) else call SLinit() endif c oactive=iam.lt.maxproc oactive=.true. call ga_sync c**** Find SBS format parameters if(oactive) then mpA = numroc(n, nb, myrow, zero4, nprow) nqA = numroc(n, nb, mycol, zero4, npcol) ldA = max(one4,mpA) c**** Allocate A elemA = mpA * nqA status = .true. if (use_direct) then call nga_access_block_segment(g_A,me,adrA,alen) else if (elemA.ne.0) & status = ma_push_get(MT_DBL, elemA, 'A', hA, adrA) if (.not.status) & call ga_error('ga_llt_f: mem alloc failed A ', -1) endif c**** Copy ga to A using SBS ScaLAPACK format if (.not.use_direct) then call ga_to_SL(g_a, n, n, nb, nb, dbl_mb(adrA), ldA, mpA, nqA) endif endif call ga_sync() if(oactive) then c**** Fill ScaLAPACK matrix descriptor call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, & iSLctxt, ldA, info) if(info.ne.0) call ga_error('ga_llt_f: descinit A failed', I -info) c**** CALL ScaLAPACK PDPOTRF LLT factorization routine ******* call PDPOTRF(uplo, n, dbl_mb(adrA), one4, one4, descA, info) c************************************************************* if (info.eq.0) then c**** Copy solution matrix back to A if hsA==-1 c**** and zero the L/U triangle part according to uplo if (hsA.eq.-1) then if (.not.use_direct) then call ga_from_SL(g_A, dimA1, dimA2, nb, nb, dbl_mb(adrA), & mpA, ldA, nqA) endif endif c c**** If the SL A array was allocated if (elemA.ne.0) then c**** and hsA==-1 or info>0 (i.e. fact. cannot be completed) c**** then deallocate the SL A MA array if ((hsA.eq.-1).or.(info.gt.0)) then if (.not.use_direct) then status = ma_pop_stack(hA) endif c**** otherwise just save the hA MA handle else hsA = hA endif endif endif endif c call ga_sync() #if 0 info8=info if(maxproc.lt.nnodes) then intsize=ma_sizeof(MT_INT,1,MT_BYTE) call ga_brdcst(1688,info8,intsize,0) endif info=info8 #endif if (info.eq.0) then if (hsA.eq.-1) then call ga_zeroUL(uplo, g_A) endif elseif (info.lt.0) then call ga_error('ga_llt_f: PDPOTRF failed ', -info) endif ga_llt_f = info c if (use_direct) then call slexit3 else call slexit endif end c*********************************************************************** c* subroutine: ga_llt_s c* c* Solves a system of linear equations c* c* A * X = B c* c* where A is the lower triangle L or the upper c* triangular Cholesky factor U of a NxN double precision c* symmetric positive definite global array (LL' or U'U) c* obtained from ga_llt_f routine. c* c* If (hsA.eq.-1) then you "must" give in input c* the lower or upper triangular Cholesky factor. c* For internal use, if (hsA.ne.-1) then hsA is c* the MA handle of the Cholesky L/U factor already c* in SBS SL format. c* c* On successful exit B will contain the solution X. c* c* It calls the PDPOTRS ScaLAPACK routine. c*********************************************************************** subroutine ga_llt_s(uplo, g_A, g_B, hsA) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c**** character*1 uplo ! (input) 'U' or 'L' integer g_A ! (input) integer g_B ! (input/ouput) integer hsA ! (input) c**** logical status integer hA, adrA integer hB, adrB integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2 INTGR4 dimB1, dimB2 INTGR4 mpA, nqA INTGR4 mpB, nqB INTGR4 info integer me INTGR4 n, ldA, ldB integer elemA, elemB INTGR4 numroc INTGR4 nb INTGR4 descA(DSCLEN), descB(DSCLEN) INTGR4 one4,zero4 parameter(zero4=0,one4=1) c integer block_dims_A(2),block_dims_B(2),blocks(2) integer gridA(2), gridB(2) logical uses_sl_A, uses_sl_B integer alen, blen logical use_direct c data nb /NB_/ c c**** Check the Environment me = ga_nodeid() c**** Check GA info for input array F, B call ga_check_handle(g_A, 'ga_llt_s: A') call ga_check_handle(g_B, 'ga_llt_s: B') call ga_inquire(g_A, typeA, dimA18, dimA28) call ga_inquire(g_B, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 c**** if (dimA1.ne.dimA2) then call ga_error('ga_llt_s: g_A must be a square matrix ', 1) else if (dimA1.ne.dimB1) then call ga_error('ga_llt_s: dims of A and B do not match ', 1) endif c c Determine whether or not to use GA data directly c use_direct = .true. uses_sl_A = ga_uses_proc_grid(g_a) uses_sl_B = .false. if (uses_sl_A) then uses_sl_B = ga_uses_proc_grid(g_b) endif if ((.not.uses_sl_A).or.(.not.uses_sl_B)) then use_direct = .false. endif if (uses_sl_A) then call ga_get_block_info(g_a,blocks,block_dims_A) if (block_dims_A(1).ne.block_dims_A(2)) then use_direct = .false. endif endif if (uses_sl_B) then call ga_get_block_info(g_b,blocks,block_dims_B) if (block_dims_B(1).ne.block_dims_B(2)) then use_direct = .false. endif endif if (use_direct.and.(block_dims_A(1).ne.block_dims_B(1))) then use_direct = .false. endif if (use_direct) then call ga_get_proc_grid(g_a,gridA) call ga_get_proc_grid(g_b,gridB) if (gridA(1).ne.gridB(1).or.gridA(2).ne.gridB(2)) then use_direct = .false. endif endif if (use_direct) then nb = block_dims_A(2) endif c n = dimA1 c**** Initialize SL Interface if (use_direct) then call SLinit3(g_A) else call SLinit() endif #if 1 c**** Find SBS format parameters mpA = numroc(n, nb, myrow, zero4, nprow) nqA = numroc(n, nb, mycol, zero4, npcol) mpB = numroc(n, nb, myrow, zero4, nprow) nqB = numroc(n, nb, mycol, zero4, npcol) ldA = max(one4,mpA) ldB = max(one4,mpB) call ga_sync() c**** Allocate A or retrieve it from the ga_llt_f calls elemA = mpA * nqA status = .true. if (elemA.ne.0) then if (use_direct) then call nga_access_block_segment(g_A,me,adrA,alen) else if (hsA.eq.-1) then status = ma_push_get(MT_DBL, elemA, 'A', hA, adrA) if (.not.status) & call ga_error('ga_llt_s: mem alloc failed A ', -1) c**** copy g_A to A using SBS SL format call ga_to_SL(g_A, n, n, nb, nb, dbl_mb(adrA), & ldA, mpA, nqA) else hA = hsA status = ma_get_index(hA, adrA) if (.not.status) & call ga_error('ga_llt_s: get index failed A ', -1) c**** if hsA was given the SBS SL conversion is avoided endif endif endif c**** Allocate B and copy g_B to B in SBS SL format elemB = mpB * nqB if (use_direct) then call nga_access_block_segment(g_B,me,adrB,blen) else if (elemB.ne.0) status = ma_push_get(MT_DBL,elemB,'B',hB,adrB) if (.not.status) & call ga_error('ga_llt_s: mem alloc failed B ', -1) call ga_to_SL(g_B, n, dimB2, nb, nb, dbl_mb(adrB), ldB, mpB,nqB) endif c c**** Fill ScaLAPACK matrix descriptors for A and B call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, & iSLctxt, ldA, info) if(info.ne.0) call ga_error(' ga_llt_s: descinit A failed ', & -info) call descinit(descB, dimB1, dimB2, nb, nb, zero4,zero4, D iSLctxt, ldB, info) if(info.ne.0) call ga_error('ga_llt_s: descinit B failed', -info) c**** CALL ScaLAPACK PDPOTRS solver routine *********************** call ga_sync() call PDPOTRS(uplo, n, dimB2, & dbl_mb(adrA), one4, one4, descA, & dbl_mb(adrB), one4, one4, descB, & info) c****************************************************************** if (info.eq.0) then c**** copy solution matrix back to g_B if (.not.use_direct) then call ga_from_SL(g_B, dimB1, dimB2, nb, nb, dbl_mb(adrB), & mpB, ldB, nqB) endif else call ga_error(' ga_llt_s: PDPOTRS failed: ', -info) endif c**** deallocate work/SL arrays c**** note that should not be others MA allocations c**** between ga_llt_f and ga_llt_s beside A and B if (.not.use_direct) then if (elemB.ne.0) status = ma_pop_stack(hB) if (elemA.ne.0) status = ma_pop_stack(hA) endif c #endif if (use_direct) then call slexit3 else call slexit endif c call ga_sync() end c*********************************************************************** c* function : ga_llt_i c* c* It computes the inverse of a global array c* that is the lower triangle L or the upper c* triangular Cholesky factor U of a NxN double precision c* symmetric positive definite global array (LL' or U'U) c* obtained from the ga_llt_f routine. c* c* If (hsA.eq.-1) then you "must" give in input c* the lower or upper triangular Cholesky factor. c* For internal use, if (hsA.ne.-1) then hsA is c* the MA handle of the Cholesky L/U factor already c* in SBS SL format. c* c* On successful exit A will contain the inverse. c* c* It calls the PDPOTRI ScaLAPACK routine. c* c* It returns c* = 0 : successful exit c* > 0 : it returns the index i of the (i,i) c* element of the factor L/U that is zero and, c* so, the inverse could not be computed c*********************************************************************** integer function ga_llt_i(uplo, g_A, hsA) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c**** character*1 uplo ! (input) 'U' or 'L' integer g_A ! (input/output) integer hsA ! (input/output) c**** logical status integer hA, adrA integer dimA18, dimA28, typeA INTGR4 dimA1, dimA2 INTGR4 mpA, nqA INTGR4 info integer info8 integer nproc, me INTGR4 n, ldA integer elemA INTGR4 numroc INTGR4 nb INTGR4 descA(DSCLEN) integer intsize logical oactive INTGR4 one4,zero4 parameter(zero4=0,one4=1) integer alen, block_dims(2),blocks(2) logical use_direct c**** data nb /NB_/ c c**** Check Environment nproc = ga_nnodes() me = ga_nodeid() c**** Check GA info for input array A call ga_check_handle(g_A, 'ga_llt_i: A') call ga_inquire(g_A, typeA, dimA18, dimA28) dima1=dima18 dima2=dima28 c**** Check that is actually a square matrix if (dimA1.ne.dimA2) then call ga_error('ga_llt_i: g_A must be a square matrix ', 1) endif c c Determine whether or not to use GA data directly c use_direct = ga_uses_proc_grid(g_A) if (use_direct) then call ga_get_block_info(g_A,blocks,block_dims) if (block_dims(1).ne.block_dims(2)) then use_direct = .false. endif endif if (use_direct) then nb = block_dims(1) endif c n = dimA1 c**** Initialize SL Interface if (use_direct) then call SLinit3(g_A) else call SLinit() endif c oactive=iam.lt.maxproc oactive=.true. call ga_sync() if(oactive) then c**** Find SBS format parameters mpA = numroc(n, nb, myrow, zero4, nprow) nqA = numroc(n, nb, mycol, zero4, npcol) ldA = max(one4, mpA) c**** Allocate A or retrieve it from ga_llt_f call elemA = mpA * nqA if (use_direct) then call nga_access_block_segment(g_A,me,adrA,alen) else if (elemA.ne.0) then status = .true. if (hsA.eq.-1) then status = ma_push_get(MT_DBL, elemA, 'A', hA, adrA) if (.not.status) & call ga_error(' ga_llt_i: mem alloc failed A ', -1) c**** copy g_A to A using SBS SL format call ga_to_SL(g_A, n, n, nb, nb, dbl_mb(adrA), & ldA, mpA, nqA) else hA = hsA status = ma_get_index(hA, adrA) if (.not.status) & call ga_error(' ga_llt_i: get index failed A ', -1) c**** if hsA was given the SBS SL conversion is avoided endif endif endif endif call ga_sync() if(oactive) then c**** Fill ScaLAPACK matrix descriptor for A call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, & iSLctxt, ldA, info) if (info.ne.0) call ga_error(' ga_llt_i: descinit A failed ', & -info) c**** CALL ScaLAPACK PDPOTRI matrix inverter ********************** call PDPOTRI(uplo, n, dbl_mb(adrA), one4, one4, descA, info) c****************************************************************** if (.not.use_direct) then if (info.eq.0) then c**** Copy the inverse matrix back to A c**** and symmetrize it call ga_from_SL(g_A, dimA1, dimA2, nb, nb, dbl_mb(adrA), & mpA, ldA, nqA) endif if(elemA.ne.0) status = ma_pop_stack(hA) endif endif call ga_sync() #if 0 info8=info if(maxproc.lt.nnodes) then intsize=ma_sizeof(MT_INT,1,MT_BYTE) call ga_brdcst(1688,info8,intsize,0) endif info=info8 #endif if (info.eq.0) then call ga_symUL(uplo, g_A) elseif (info.lt.0) then call ga_error(' ga_llt_i: PDPOTRI failed ', -info) endif ga_llt_i = info c**** deallocate work/SL arrays c**** note that should not be others MA allocations c**** between ga_llt_f and ga_llt_i c end c*********************************************************************** c* function : gai_llt_solve c* c* Solves a system of linear equations c* c* A * X = B c* c* using the Cholesky factorization of an NxN c* double precision symmetric positive definite c* global array A. c* c* On successful exit B will contain the solution X. c* c* It calls the ga_llt_f and ga_llt_s and so it c* actually refer to PDPORTF/PDPOTRS ScaLAPACK c* routines. c* c* It returns c* = 0 : successful exit c* > 0 : the leading minor of this order c* is not positive definite and the c* factorization could not be completed c*********************************************************************** integer function gai_llt_solve(g_A, g_B) implicit none character*1 uplo ! (internal parameter) 'U' or 'L' integer g_A ! (input) integer g_B ! (input/output) integer hsA integer irc integer ga_llt_f c c**** call the Cholesky factorization routine hsA = 0 uplo = 'L' irc = ga_llt_f(uplo, g_A, hsA) c**** check if the factorization is OK if (irc.eq.0) then c**** if the factorization is OK then solve the system c**** call the ga_llt_s internal interface call ga_llt_s(uplo, g_A, g_B, hsA) gai_llt_solve = 0 else c**** if the factorization is not OK just return the error gai_llt_solve = irc endif end c*********************************************************************** c* function : gai_spd_invert c* c* It computes the inverse of a double precision c* using the Cholesky factorization of a NxN double c* precision symmetric positive definite global array A. c* c* On successful exit A will contain the inverse. c* c* It calls the ga_llt_f and ga_llt_i and so it c* actually refer to PDPORTF/PDPOTRI ScaLAPACK c* routines. c* c* It returns c* = 0 : successful exit c* > 0 : the leading minor of this order c* is not positive definite and the c* factorization could not be completed c* < 0 : it returns the index i of the (i,i) c* element of the factor L/U that is zero and, c* so, the inverse could not be computed c*********************************************************************** integer function gai_spd_invert(g_A) implicit none character*1 uplo ! (internal parameter) 'U' or 'L' integer g_A ! (input) integer hsA integer ircF, ircI integer ga_llt_f integer ga_llt_i c c**** call the Cholesky factorization routine hsA = 0 uplo = 'L' ircF = ga_llt_f(uplo, g_A, hsA) c c**** check if the factorization is OK if (ircF.eq.0) then c**** if the factorization is OK then invert the matrix c**** call the ga_llt_i internal interface ircI = ga_llt_i(uplo, g_A, hsA) if (ircI.eq.0) then gai_spd_invert = 0 else gai_spd_invert = -ircI endif else c**** if the factorization is not OK just return the error gai_spd_invert = ircF endif end c*********************************************************************** c* function: gai_solve c* c* Solves a system of linear equations c* c* A * X = B c* c* It first will call the Cholesky factorization c* routine and, if sucessfully, will solve the system c* with the Cholesky solver. If Cholesky will be not c* be able to factorize A, then it will call the LU c* factorization routine and will solve the system c* with forward/backward substitution. c* c* On B will contain the solution X. c* c* It calls the ga_llt_f and ga_llt_s and gai_lu_solve c* and so it actually refer to PDGETRF/PDGETRS and c* PDPORTF/PDPOTRS ScaLAPACK routines. c* c* It returns c* = 0 : Cholesky factoriztion was succesful c* > 0 : the leading minor of this order c* is not positive definite and Cholesky c* factorization could not be completed c* c* Note: High overhead due to multiple conversions to/from scalapack c* format can be avoided if gai_llt_solve and gai_lu_solve c* were not used as building blocks - possible optimization c* for the future (JN) c*********************************************************************** integer function gai_solve(g_A, g_B) implicit none integer g_A ! (input) integer g_B ! (input/output) integer irc integer gai_llt_solve c c**** Call Cholesky solver as the first try gai_solve = gai_llt_solve(g_A, g_B) if (gai_solve.eq.0) then c**** if Cholesky was succcesully just return else c**** else if Cholesky failed call gai_lu_solve('N', g_A, g_B) endif end c****************************************************************** c c ga_pdsyev c c interface into scalapack's Hermitian eigensolver c c ga interface to scalapack c c g_a .g_b(*,i) = eval(i).g_b(*,i) c c assume equal size blocks ... c c****************************************************************** c subroutine ga_pdsyev(g_a, g_b, eval, nb8) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B integer nb8 ! block size c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer lcwork,hcwork, adrcwork INTGR4 lcwork4 c INTGR4 nn,mq0, np0 INTGR4 n INTGR4 info integer info8 integer dblsize,ldc INTGR4 zero4,one4,two4 parameter(zero4=0,one4=1,two4=2) double precision pdlamch,dumm INTGR4 iceil logical uses_sl_A, uses_sl_B integer alen, blen integer block_dims_A(2),block_dims_B(2),blocks(2) integer gridA(2), gridB(2) logical use_direct external pdlamch integer i,j c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_pdsyev: a') call ga_check_handle(g_b, 'ga_pdsyev: b') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 n=dima1 if(nb.lt.1) nb=1 if(dimA1.ne.dima2) call ga_error( % 'ga_pdsyev: matrix A not square ',0) if(dimb1.ne.dimb2) call ga_error( % 'ga_pdsyev: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pdsyev: size matrix A and B differ ',0) use_direct = .true. uses_sl_A = ga_uses_proc_grid(g_a) uses_sl_B = .false. if (uses_sl_A) then uses_sl_B = ga_uses_proc_grid(g_b) endif if ((.not.uses_sl_A).or.(.not.uses_sl_B)) then use_direct = .false. endif if (uses_sl_A) then call ga_get_block_info(g_a,blocks,block_dims_A) if (block_dims_A(1).ne.block_dims_A(2)) then use_direct = .false. endif endif if (uses_sl_B) then call ga_get_block_info(g_b,blocks,block_dims_B) if (block_dims_B(1).ne.block_dims_B(2)) then use_direct = .false. endif endif if (use_direct.and.(block_dims_A(1).ne.block_dims_B(1))) then use_direct = .false. endif if (use_direct) then call ga_get_proc_grid(g_a,gridA) call ga_get_proc_grid(g_b,gridB) if (gridA(1).ne.gridB(1).or.gridA(2).ne.gridB(2)) then use_direct = .false. endif endif if (use_direct) then nb = block_dims_A(2) endif c c c*** initialize SL interface c if (use_direct) then call SLinit4(g_a) else call SLinit2(n) endif oactive=iam.lt.maxproc if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c if (use_direct) then call nga_access_block_segment(g_a,me,adra,alen) call nga_access_block_segment(g_b,me,adrb,blen) else elemA= mpA*nqA status = .true. if (elemA.ne.0)status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if (.not.status) & call ga_error('ga_pdsyev: mem alloc failed A ', -1) c elemB= mpB*nqB c if (elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if (.not.status) & call ga_error('ga_pdsyev: mem alloc failed B ', -1) c c c*** copy g_a to A using the block cyclic scalapack format c call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) endif endif call ga_sync() if(oactive) then c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if (info8.ne.0) $ call ga_error(' ga_pdsyev: descinit A failed ',-info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if (info8.ne.0) $ call ga_error(' ga_pdsyev: descinit B failed ',-info8) c jobz = 'V' uplo = 'L' c nn = max(n, nb, two4) np0 = numroc(nn, nb, zero4, zero4, nprow2) mq0 = numroc(nn, nb, zero4, zero4, npcol2) c c get lcwork c #if 1 lcwork4=-1 call pdsyev(jobz, uplo, 1 n, dbl_mb(adrA), one4, one4, descA, 2 eval,dbl_mb(adrB), one4, one4, D descB, dumm, lcwork4, 3 info) lcwork=dumm #else lcwork = 5*n +MAX(3*NB,NB*(NP0+1)) c lwmin ldc=numroc(n,nb,myrow2,zero4,nnodes) ldc=max(1,ldc) lcwork=max(lcwork,5*n+n*ldc+1+max(2*n-2,8192)) #endif c if (lcwork.ne.0) $ status = ma_push_get(MT_DBL, lcwork , $ 'cwork',hcwork,adrcwork) if (.not.status) & call ga_error('ga_pdsyev: mem alloc failed cwork ', -1) c c lcwork4=lcwork call pdsyev(jobz, uplo, 1 n, dbl_mb(adrA), one4, one4, descA, 2 eval,dbl_mb(adrB), one4, one4, D descB, dbl_mb(adrcwork), lcwork4, 3 info) c if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pdsyev: argument is illegal ', info) else call ga_error(' ga_pdsyev: eigenvecs not converged ', $ info) endif endif c c*** copy solution matrix back to g_c c if (.not.use_direct) then call ga_from_SL2(g_b, dimA1, dimB2, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) endif c c*** deallocate work/SL arrays c if ( lcwork .ne. 0 ) status = ma_pop_stack(hcwork) if (.not.use_direct) then if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) endif endif c call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif if (use_direct) then call SLexit4 else call SLexit2 endif return end c****************************************************************** c c ga_pdsyevx c c****************************************************************** c subroutine ga_pdsyevx(g_a, g_b, eval, nb8) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B integer nb8 ! block size c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, range, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer ngaps, hgap, adrgaps integer iclu, hclustr, adrclustr integer if, hfail, adrfail integer liwork,hiwork, adriwork integer lcwork,hcwork, adrcwork INTGR4 lcwork4 INTGR4 liwork4 c INTGR4 nn,mq0, np0 double precision vl, vu, abstol, orfac INTGR4 il, iu INTGR4 m, nz INTGR4 n INTGR4 info integer info8 integer dblsize INTGR4 zero4,one4,two4,four4 integer two4n parameter(zero4=0,one4=1,two4=2,four4=4) double precision pdlamch,dumm external pdlamch INTGR4 iceil c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_pdsyevx: a') call ga_check_handle(g_b, 'ga_pdsyevx: b') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 n=dima1 if(nb.lt.1) nb=1 if(dimA1.ne.dima2) call ga_error( % 'ga_pdsyevx: matrix A not square ',0) if(dimb1.ne.dimb2) call ga_error( % 'ga_pdsyevx: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pdsyevx: size matrix A and B differ ',0) c c c*** initialize SL interface c call SLinit2(n) oactive=iam.lt.maxproc call ga_sync if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed A ', -1) c c*** copy g_a to A using the block cyclic scalapack format c call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) c elemB= mpB*nqB c if(elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed B ', -1) c ngaps = nprow2*npcol2 if(ngaps.ne.0)status = $ ma_push_get(MT_DBL, ngaps ,'gap',hgap,adrgaps) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed gaps ', -1) c iclu = 2*nprow2*npcol2 two4n=two4*n iclu = max(two4n,iclu) if(iclu.ne.0)status = $ ma_push_get(MT_INT, iclu ,'iclustr',hclustr,adrclustr) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed iclustr',-1) c if = n if(if.ne.0) then status = $ ma_push_get(MT_INT, if ,'ifail',hfail,adrfail) endif if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed ifail ', -1) endif call ga_sync() if(oactive) then c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsyevx: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsyevx: descinit B failed ', . -info8) c jobz = 'V' range = 'A' range = 'I' uplo = 'L' vl = 0.d0 vu = 0.d0 il = 0 iu = 0 il = 1 ! iu = neigen iu = n nz = 0 c c ability to deal with orthonormality ; let's just c have the regular scalapack stuff for the moment c liwork = 6*max(n, nprow2*npcol2+one4, four4) liwork=liwork if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed iwork ', -1) c nn = max(n, nb, two4) np0 = numroc(nn, nb, zero4, zero4, nprow2) mq0 = numroc(nn, nb, zero4, zero4, npcol2) c c orfac = 1.d-3 c c #if 0 lcwork4=-1 call pdsyevx(jobz, range, uplo, 1 n, dbl_mb(adrA), one4, one4, descA,vl, 2 vu, il, iu, abstol, m, nz, eval, orfac, dbl_mb(adrB), 4 one4, one4, descB, dumm, lcwork4, 3 int_mb(adriwork), liwork4, int_mb(adrfail), 4 int_mb(adrclustr), dbl_mb(adrgaps), info) lcwork=dumm #else lcwork = 5*n +MAX(5*NN,(NP0*MQ0 + 2*nb*nb))+ + ICEIL( N, NPROW2*NPCOL2)*NN+1 #endif c if(lcwork.ne.0) $ status = ma_push_get(MT_DBL, lcwork , $ 'cwork',hcwork,adrcwork) if(.not.status) & call ga_error('ga_pdsyevx: mem alloc failed cwork ', -1) c c abstol=pdlamch(islctxt2, 'U') c c liwork4=liwork lcwork4=lcwork call pdsyevx(jobz, range, uplo, 1 n, dbl_mb(adrA), one4, one4, descA,vl, 2 vu, il, iu, abstol, m, nz, eval, orfac, dbl_mb(adrB), 4 one4, one4, descB, dbl_mb(adrcwork), lcwork4, 3 int_mb(adriwork), liwork4, int_mb(adrfail), 4 int_mb(adrclustr), dbl_mb(adrgaps), info) c if (nz .ne. n ) then if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pdsyevx: argument is illegal ', info) else call ga_error(' ga_pdsyevx: eigenvectors failed to converge ', $ info) endif endif endif c c c c*** copy solution matrix back to g_c c call ga_from_SL2(g_b, dimA1, dimB2, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) c c c c*** deallocate work/SL arrays c if ( lcwork .ne. 0 ) status = ma_pop_stack(hcwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if ( if .ne. 0 ) status = ma_pop_stack(hfail) if ( iclu .ne. 0 ) status = ma_pop_stack(hclustr) if ( ngaps.ne.0 ) status = ma_pop_stack(hgap) if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) endif c call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end c****************************************************************** c c ga_pdsygv c c interface into scalapack's Hermitian eigensolver c c ga interface to scalapack c c g_a .g_c(*,i) = eval(i).g_s(*,i) g_b(*,i) c c assume equal size blocks ... c c****************************************************************** subroutine ga_pdsygv(g_a, g_s, g_b, eval) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B (eigenvectors) integer g_s ! metric c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, range, uplo c integer ha, adra !A (input) integer hb, adrb !B (output) integer hs, adrs !S (input) c c logical oactive ! true if this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB integer dims18, dims28, types INTGR4 dimA1, dimA2 INTGR4 dimB1, dimB2 INTGR4 dims1, dims2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor INTGR4 mps, nqs ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb, lds integer elemA, elemB, elems INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack INTGR4 descs(9) c integer ngaps, hgap, adrgaps integer iclu, hclustr, adrclustr integer if, hfail, adrfail integer liwork, hiwork, adriwork integer lcwork, hcwork, adrcwork INTGR4 lcwork4 INTGR4 liwork4 c INTGR4 nn, mq0, np0 double precision vl, vu, abstol, orfac INTGR4 il, iu INTGR4 m, nz INTGR4 n INTGR4 info integer info8,dblsize INTGR4 zero4,one4,two4,four4 parameter(zero4=0,one4=1,two4=2,four4=4) INTGR4 iceil double precision pdlamch integer i logical use_direct logical uses_sl_A, uses_sl_B, uses_sl_S integer alen, blen, slen integer block_dims_A(2),block_dims_B(2),block_dims_S(2),blocks(2) integer gridA(2), gridB(2), gridS(2) external pdlamch external iceil integer j ! intrinsic max c c processor dependent; machine dependent c data nb/16/ c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_pdsygv: a') call ga_check_handle(g_b, 'ga_pdsygv: b') call ga_check_handle(g_s, 'ga_pdsygv: s') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) call ga_inquire(g_s, types, dims18, dims28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 dims1=dims18 dims2=dims28 if(dimA1.ne.dima2) call ga_error( % 'ga_pdsygv: matrix A not square ',0) n=dima1 if(nb.lt.1) nb=1 if(dimb1.ne.dimb2) call ga_error( % 'ga_pdsygv: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pdsygv: size matrix B and A differ ',0) if(dims1.ne.dims2) call ga_error( % 'ga_pdsygv: matrix S not square ',0) if(dims1.ne.n) call ga_error( % 'ga_pdsygv: size matrix A and S differ ',0) c use_direct = .true. uses_sl_A = ga_uses_proc_grid(g_a) uses_sl_B = .false. uses_sl_S = .false. if (uses_sl_A) then uses_sl_B = ga_uses_proc_grid(g_b) uses_sl_S = ga_uses_proc_grid(g_s) endif if ((.not.uses_sl_A).or.(.not.uses_sl_B)) then use_direct = .false. endif if (uses_sl_A) then call ga_get_block_info(g_a,blocks,block_dims_A) if (block_dims_A(1).ne.block_dims_A(2)) then use_direct = .false. endif endif if (uses_sl_B) then call ga_get_block_info(g_b,blocks,block_dims_B) if (block_dims_B(1).ne.block_dims_B(2)) then use_direct = .false. endif endif if (uses_sl_S) then call ga_get_block_info(g_s,blocks,block_dims_S) if (block_dims_S(1).ne.block_dims_S(2)) then use_direct = .false. endif endif if (use_direct.and.((block_dims_A(1).ne.block_dims_B(1)).or. % (block_dims_B(1).ne.block_dims_S(1)))) then use_direct = .false. endif if (use_direct) then call ga_get_proc_grid(g_a,gridA) call ga_get_proc_grid(g_b,gridB) call ga_get_proc_grid(g_s,gridS) if ((gridA(1).ne.gridB(1).or.gridA(2).ne.gridB(2)).or. % (gridA(1).ne.gridS(1).or.gridA(2).ne.gridS(2))) then use_direct = .false. endif endif if (use_direct) then nb = block_dims_A(2) endif c c*** initialize SL interface c ! call SLinit() if (use_direct) then call SLinit4(g_a) else call SLinit2(n) endif oactive=iam.lt.maxproc call ga_sync if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c mps = numroc(dims1, nb, myrow2, zero4, nprow2) nqs = numroc(dims2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) lds = max(one4,mps) c c c let scalapack check for errors c if (use_direct) then call nga_access_block_segment(g_a, me, adra, alen) call nga_access_block_segment(g_b, me, adrb, blen) call nga_access_block_segment(g_s, me, adrs, slen) else elemA= mpA*nqA status = .true. if(elemA.ne.0) status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed A ', elema) c elemB= mpB*nqB if(elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed B ', -1) elems= mps*nqs if(elems.ne.0)status = $ ma_push_get(MT_DBL,elems,'s',hs,adrs) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed S ', -1) endif c ngaps = nprow2*npcol2 if(ngaps.ne.0)status = $ ma_push_get(MT_DBL, ngaps ,'gap',hgap,adrgaps) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed gaps ', -1) c iclu = 2*nprow2*npcol2 iclu = 2*n if(iclu.ne.0)status = $ ma_push_get(MT_INT, iclu ,'iclustr',hclustr,adrclustr) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed iclustr ', -1) c if = n if(if.ne.0) then status = $ ma_push_get(MT_INT, if ,'ifail',hfail,adrfail) endif if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed ifail ', -1) c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c if (.not.use_direct) then call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) c call ga_to_SL2(g_b, dimB1, dimB2, nb,nb, $ dbl_mb(adrB), ldb, mpB, nqB) call ga_to_SL2(g_s, dims1, dims2, nb,nb, $ dbl_mb(adrs), ldb, mps, nqs) endif c c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsygv: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsygv: descinit B failed ', . -info8) call descinit(descs, dims1, dims2, nb, nb, zero4, zero4, . islctxt2, lds, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsygv: descinit S failed ', . -info8) c c call scalapack c c jobz = 'V' range = 'A' uplo = 'L' vl = 0.d0 vu = 0.d0 il = 0 iu = 0 nz = 0 c c ability to deal with orthonormality ; let's just c have the regular scalapack stuff for the moment c liwork = 6*max(n, nprow2*npcol2+one4, four4) if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed iwork ', -1) c nn = max(n, nb, two4) np0 = numroc(nn, nb, zero4, zero4, nprow2) mq0 = numroc(nn, nb, zero4, zero4, npcol2) c c orfac = 1.d-3 c c lcwork = 5*n +MAX(5*NN,(NP0*MQ0 + 2*nb*nb))+ + ICEIL( N, NPROW2*NPCOL2)*NN+1 c if(lcwork.ne.0) $ status = ma_push_get(MT_DBL, lcwork , $ 'cwork',hcwork,adrcwork) if(.not.status) & call ga_error('ga_pdsygv: mem alloc failed cwork ', -1) c abstol=pdlamch(islctxt2, 'U') c c c liwork4=liwork lcwork4=lcwork call pdsygvx(one4,jobz, range, uplo, 1 n, dbl_mb(adrA), one4, one4, 2 descA, dbl_mb(adrS), one4, one4,descs, vl,vu, il, iu, 3 abstol, m, nz, eval, orfac, dbl_mb(adrB), 4 one4, one4, descB, 4 dbl_mb(adrcwork), lcwork4,int_mb(adriwork), liwork4, 4 int_mb(adrfail), int_mb(adrclustr), 5 dbl_mb(adrgaps), info) c c c c if (nz .ne. n ) then if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pdsygv: argument is illegal ', info) else call ga_error(' ga_pdsygv: eigenvectors failed to converge ', $ info) endif endif endif c c c c*** copy solution matrix back to g_c c c if (.not.use_direct) then call ga_from_SL2(g_b, dimA1, dimB2, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) endif c c c*** deallocate work/SL arrays c if ( lcwork .ne. 0 ) status = ma_pop_stack(hcwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if ( if .ne. 0 ) status = ma_pop_stack(hfail) if ( iclu .ne. 0 ) status = ma_pop_stack(hclustr) if ( ngaps.ne.0 ) status = ma_pop_stack(hgap) if (.not.use_direct) then if ( elemS .ne. 0 ) status = ma_pop_stack(hs) if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) endif endif c call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif if (use_direct) then call SLexit4 else call SLexit2 endif return end c c interface to pdsyevd (divide&conquer) c subroutine ga_pdsyevd(g_a, g_b, eval, nb8) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B integer nb8 c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer liwork,hiwork, adriwork integer lcwork,hcwork, adrcwork INTGR4 liwork4,lcwork4 c INTGR4 nn,nq, np,trilwmin,iarow,iacol INTGR4 n INTGR4 info,one4,zero4,two4 parameter(zero4=0,one4=1,two4=2) integer info8,dblsize double precision pdlamch,dum INTGR4 iceil,indxg2p logical uses_sl_A, uses_sl_B integer alen, blen integer block_dims_A(2),block_dims_B(2),blocks(2) integer gridA(2), gridB(2) logical use_direct external pdlamch,iceil,indxg2p c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_pdsyevd: a') call ga_check_handle(g_b, 'ga_pdsyevd: b') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 n=dima1 if(nb.lt.1) nb=1 if(dimA1.ne.dima2) call ga_error( % 'ga_pdsyevd: matrix A not square ',0) if(dimb1.ne.dimb2) call ga_error( % 'ga_pdsyevd: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pdsyevd: size matrix B and B differ ',0) use_direct = .true. uses_sl_A = ga_uses_proc_grid(g_a) uses_sl_B = .false. if (uses_sl_A) then uses_sl_B = ga_uses_proc_grid(g_b) endif if ((.not.uses_sl_A).or.(.not.uses_sl_B)) then use_direct = .false. endif if (uses_sl_A) then call ga_get_block_info(g_a,blocks,block_dims_A) if (block_dims_A(1).ne.block_dims_A(2)) then use_direct = .false. endif endif if (uses_sl_B) then call ga_get_block_info(g_b,blocks,block_dims_B) if (block_dims_B(1).ne.block_dims_B(2)) then use_direct = .false. endif endif if (use_direct.and.(block_dims_A(1).ne.block_dims_B(1))) then use_direct = .false. endif if (use_direct) then call ga_get_proc_grid(g_a,gridA) call ga_get_proc_grid(g_b,gridB) if (gridA(1).ne.gridB(1).or.gridA(2).ne.gridB(2)) then use_direct = .false. endif endif if (use_direct) then nb = block_dims_A(2) endif c c c*** initialize SL interface c ! call SLinit() if (use_direct) then call SLinit4(g_a) else call SLinit2(n) endif oactive=iam.lt.maxproc call ga_sync if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c c if (use_direct) then call nga_access_block_segment(g_a,me,adra,alen) call nga_access_block_segment(g_b,me,adrb,blen) else elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pdsyevd: mem alloc failed A ', -1) c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) c elemB= mpB*nqB c if(elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pdsyevd: mem alloc failed B ', -1) endif endif call ga_sync() if(oactive) then c c c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsyevd: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info8.ne.0) call ga_error(' ga_pdsyevd: descinit B failed ', . -info8) c jobz = 'V' uplo = 'L' c c ability to deal with orthonormality ; let's just c have the regular scalapack stuff for the moment c liwork = 7*n + 8*npcol2 +2 if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pdsyevd: mem alloc failed iwork ', -1) c nn = max(n, nb, two4) IAROW = INDXG2P(one4, nb, MYROW2, DESCA( 7 ), NPROW2 ) IACOL = INDXG2P(one4, nb, MYCOL2, DESCA( 8 ), NPCOL2 ) np = numroc(n, nb, myrow2, iarow, nprow2) nq = numroc(n, nb, mycol2, iacol, npcol2) c c c liwork4=liwork #if 0 lcwork4=-1 call pdsyevd(jobz, uplo, 1 n, dbl_mb(adrA), one4, one4, descA, 1 eval, dbl_mb(adrB), one4, one4, 2 descB, dbl_mb(adrcwork), lcwork4, 2 dum, liwork4, info) lcwork=dum #else lcwork = MAX( 1+6*N+2*NP*NQ, = 3*N + MAX( NB*( NP+1 ), 3*NB ))+ 2*N lcwork=max(lcwork,16384) #endif c if(lcwork.ne.0) $ status = ma_push_get(MT_DBL, lcwork , $ 'cwork',hcwork,adrcwork) if(.not.status) & call ga_error('ga_pdsyevd: mem alloc failed cwork ', -1) c c c lcwork4=lcwork call pdsyevd(jobz, uplo, 1 n, dbl_mb(adrA), one4, one4, descA, 1 eval, dbl_mb(adrB), one4, one4, 2 descB, dbl_mb(adrcwork), lcwork4, 2 int_mb(adriwork), liwork4, info) c if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pdsyevd: argument is illegal ', info) else call ga_error( $ ' ga_pdsyevd: eigenvectors failed to converge ', $ info) endif endif c c c c*** copy solution matrix back to g_b c if (.not.use_direct) then call ga_from_SL2(g_b, dimA1, dimB2, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) endif c c c c*** deallocate work/SL arrays c if ( lcwork .ne. 0 ) status = ma_pop_stack(hcwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if (.not.use_direct) then if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) endif c endif call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end #if HAVE_PDSYEVR subroutine ga_pdsyevr(g_a, g_b, eval, nb8, mout) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B integer nb8 integer mout ! no. of evals/evecs to compute c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, range, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true if this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2,mout4 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer n8, hfail, adrfail integer liwork,hiwork, adriwork integer lcwork,hcwork, adrcwork INTGR4 liwork4 INTGR4 lcwork4 c INTGR4 nn,mq0, np0 double precision vl, vu INTGR4 il, iu INTGR4 m, nz INTGR4 n INTGR4 info,one4,zero4,two4,four4 parameter(one4=1,zero4=0,two4=4,four4=4) integer info8,dblsize double precision pdlamch,dumm INTGR4 dumm2 external pdlamch INTGR4 iceil c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_pdsyevr: a') call ga_check_handle(g_b, 'ga_pdsyevr: b') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 if(dimA1.ne.dima2) call ga_error( % 'ga_pdsyevr: matrix A not square ',0) n=dima1 if(dimb1.ne.dimb2) call ga_error( % 'ga_pdsyevr: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pdsyevr: size matrix B and B differ ',0) if(mout.le.0.or.mout.gt.n) mout=n c c c*** initialize SL interface c call SLinit2(n) oactive=iam.lt.maxproc call ga_zero(g_b) if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pdsyevr: mem alloc failed A ', -1) c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) endif call ga_sync() if(oactive) then c elemB= mpB*nqB c if(elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pdsyevr: mem alloc failed B ', -1) c n8 = n if(n8.ne.0) then status = $ ma_push_get(MT_INT, n8 ,'ifail',hfail,adrfail) endif if(.not.status) & call ga_error('ga_pdsyevr: mem alloc failed ifail ', n) c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info.ne.0) call ga_error(' ga_pdsyevr: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info.ne.0) call ga_error(' ga_pdsyevr: descinit B failed ', . -info8) c jobz = 'V' uplo = 'L' vl = 0.d0 vu = 0.d0 c nn = max(n, nb, two4) np0 = numroc(nn, nb, zero4, zero4, nprow2) mq0 = numroc(nn, nb, zero4, zero4, npcol2) c il=1 iu=mout range='i' lcwork4=-1 liwork4=-1 call pdsyevr(jobz, range, uplo, 1 n, dbl_mb(adrA), one4, one4, descA,vl, 2 vu, il, iu, m, nz, eval, dbl_mb(adrB), one4, 3 one4, descB, dumm, lcwork4, 3 dumm2, liwork4, info) lcwork=dumm liwork=dumm2 c lcwork = 5*n +MAX(18*NN,(NP0*MQ0 + 2*nb*nb))+ c + (2 + ICEIL( N, NPROW2*NPCOL2))*NN+1 c liwork = 12*max(n, nprow2*npcol2+one4, four4) +2 *n c if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pdsyevr: mem alloc failed iwork ', -1) c if(lcwork.ne.0) $ status = ma_push_get(MT_DBL, lcwork , $ 'cwork',hcwork,adrcwork) if(.not.status) & call ga_error('ga_pdsyevr: mem alloc failed cwork ', -1) c liwork4=liwork lcwork4=lcwork call pdsyevr(jobz, range, uplo, 1 n, dbl_mb(adrA), one4, one4, descA,vl, 2 vu, il, iu, m, nz, eval, dbl_mb(adrB), one4, 3 one4, descB, dbl_mb(adrcwork), lcwork4, 3 int_mb(adriwork), liwork4, info) c mout=m if(iam.eq.0.and.mout.ne.n) W write(0,*) ' computed eval ',mout,' out of ', A dima1 if (nz .ne. n ) then if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pdsyevr: argument is illegal ', info) else call ga_error(' ga_pdsyevr: eigenvectors failed to converge ', $ info) endif endif endif c c c c*** copy solution matrix back to g_b c mout4=mout call ga_from_SL2(g_b, dimA1, mout4, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) c c c c*** deallocate work/SL arrays c if ( lcwork .ne. 0 ) status = ma_pop_stack(hcwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if ( n8 .ne. 0 ) status = ma_pop_stack(hfail) if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) c endif call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end #endif #if HAVE_ELPA subroutine ga_evp_real(g_a, g_b, eval, nb8, mout) use ELPA1 implicit none #include "mpif.h" #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a ! matrix A integer g_b ! matrix B integer nb8 integer mout ! no. of evals/evecs to compute c c all eigenvalues are real c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, range, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2,mout4 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack INTGR4 elpa_comm_rows, elpa_comm_cols c integer n8 c INTGR4 m INTGR4 n INTGR4 info,one4,zero4,two4,four4 integer ga_comm integer mxproc,i parameter(mxproc=100000) c mpi args should integer*4 integer*4 group_world,group_members(mxproc), C ga_comm4,mpierr,elpa_group INTGR4 elpa_comm parameter(one4=1,zero4=0,two4=4,four4=4) integer info8,dblsize c c processor dependent; machine dependent c if(maxproc.gt.mxproc) call ga_error( A 'ga-evp_real: increase mxproc to ',maxproc) if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a, 'ga_evp_real: a') call ga_check_handle(g_b, 'ga_evp_real: b') c call ga_inquire(g_a, typeA, dimA18, dimA28) call ga_inquire(g_b, typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 if(dimA1.ne.dima2) call ga_error( % 'ga_evp_real: matrix A not square ',0) n=dima1 if(dimb1.ne.dimb2) call ga_error( % 'ga_evp_real: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_evp_real: size matrix B and B differ ',0) if(mout.le.0.or.mout.gt.n) mout=n mout4=mout c c c*** initialize SL interface c call SLinit2(n) oactive=iam.lt.maxproc call ga_zero(g_b) celpa call ga_mpi_comm_pgroup_default(ga_comm) ga_comm4=ga_comm call MPI_Comm_group(ga_comm4, group_world, mpierr) do i=1,maxproc group_members(i)=i-1 enddo call MPI_Group_incl(group_world, maxproc, group_members, C elpa_group, mpierr) if(mpierr.ne.0) call ga_error( A 'ga-evp_real: mpigroupincl failed ',mpierr) call mpi_comm_create(ga_comm4, elpa_group, elpa_comm, W mpierr) call ga_sync() if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_DBL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_evp_real: mem alloc failed A ', -1) c elemB= mpB*nqB c elemb=max(mpb,nqb)**2 c if(elemB.ne.0)status = $ ma_push_get(MT_DBL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_evp_real: mem alloc failed B ', -1) c c n8 = n c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c call ga_to_SL2(g_a, dimA1, dimA2, nb, nb, $ dbl_mb(adrA), lda, mpA, nqA) call ga_sync() c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info.ne.0) call ga_error(' ga_evp_real: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info.ne.0) call ga_error(' ga_evp_real: descinit B failed ', . -info8) c c mpierr=get_elpa_row_col_comms(elpa_comm, V myrow2, mycol2, V elpa_comm_rows, elpa_comm_cols) if(mpierr.ne.0) call ga_error( A 'ga-evp_real: get_elpa_row_col failed ',mpierr) if(.not.solve_evp_real(n, mout4, A dbl_mb(adra), lda, E eval, dbl_mb(adrb), ldb, nb, A elpa_comm_rows, elpa_comm_cols)) E call ga_error(' solve_evp_real failed',0) if(iam.eq.0.and.mout4.ne.n) W write(6,*) ' computed eval ',mout,' out of ', A dima1 c c c c*** copy solution matrix back to g_b c call ga_from_SL2(g_b, dimA1, mout4, $ nb, nb, dbl_mb(adrB), & ldb, mpb, nqB) c c c c*** deallocate work/SL arrays c if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) call MPI_Group_free( elpa_group, mpierr) if(mpierr.ne.0) call ga_error( A 'ga-evp_real: mpigroupfree failed ',mpierr) call MPI_comm_free( elpa_comm, mpierr) if(mpierr.ne.0) call ga_error( A 'ga-evp_real: mpicommfree failed ',mpierr) c endif call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end #endif subroutine ga_pzheevd(g_a, g_b, eval, nb8) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a(2) ! matrix A integer g_b(2) ! matrix B integer nb8 c c real eigenvalues c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2,mout4 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer n8, hfail, adrfail integer liwork,hiwork, adriwork integer lwork,hwork, adrwork integer lrwork,hrwork, adrrwork INTGR4 liwork4 INTGR4 lwork4 INTGR4 lrwork4 c INTGR4 m, nz INTGR4 n INTGR4 info,one4,zero4,two4,four4 parameter(one4=1,zero4=0,two4=4,four4=4) integer info8,dblsize double precision pdlamch complex*16 dumm double precision dumm1 INTGR4 dumm2 external pdlamch INTGR4 iceil c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a(1), 'ga_pzheevd: a') call ga_check_handle(g_b(1), 'ga_pzheevd: b') c call ga_inquire(g_a(1), typeA, dimA18, dimA28) call ga_inquire(g_b(1), typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 if(dimA1.ne.dima2) call ga_error( % 'ga_pzheevd: matrix A not square ',0) n=dima1 c nb=min(nb,n/2) if(dimb1.ne.dimb2) call ga_error( % 'ga_pzheevd: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pzheevd: size matrix B and B differ ',0) c c*** initialize SL interface c call SLinit2(n) oactive=iam.lt.maxproc call ga_sync if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_dcpL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed A ', -1) c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c call ga_to_SL2cpl(g_a, dimA1, dimA2, nb, nb, $ dcpl_mb(adrA), lda, mpA, nqA) endif call ga_sync() if(oactive) then c elemB= mpB*nqB c if(elemB.ne.0)status = $ ma_push_get(MT_dcpL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed B ', -1) c n8 = n if(n8.ne.0) then status = $ ma_push_get(MT_INT, n8 ,'ifail',hfail,adrfail) endif if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed ifail ', n) c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info.ne.0) call ga_error(' ga_pzheevd: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info.ne.0) call ga_error(' ga_pzheevd: descinit B failed ', . -info8) c jobz = 'V' uplo = 'L' c c lwork4=-1 lrwork4=-1 liwork4=-1 call pzheevd(jobz, uplo, n, dcpl_mb(adrA), one4, one4, descA, 2 eval, dcpl_mb(adrB), one4, one4, 3 descB, dumm, lwork4, dumm1,lrwork4, dumm2, 4 liwork4, info) lwork=dumm c lwork=max(lwork,n) c lwork=2*max(lwork,mpa*(nb+nqa)) c write(0,*) ga_nodeid(), ' lw orig new ',dumm,lwork lrwork=dumm1 liwork=dumm2 c if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed iwork ', -1) c if(lwork.ne.0) $ status = ma_push_get(MT_DCPL, lwork , $ 'work',hwork,adrwork) if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed work ', -1) if(lrwork.ne.0) $ status = ma_push_get(MT_DBL, lrwork , $ 'rwork',hrwork,adrrwork) if(.not.status) & call ga_error('ga_pzheevd: mem alloc failed rwork ', -1) c liwork4=liwork lwork4=lwork lrwork4=lrwork call pzheevd(jobz, uplo, n, dcpl_mb(adrA),one4,one4, descA, 2 eval, dcpl_mb(adrB), one4, one4, 3 descB, dcpl_mb(adrwork), lwork4, dbl_mb(adrrwork), 4 lrwork4, int_mb(adriwork), liwork4, info) if (nz .ne. n ) then if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pzheevd: argument is illegal ', info) else call ga_error(' ga_pzheevd: eigenvectors failed to converge ', $ info) endif endif endif c c c c*** copy solution matrix back to g_b c call ga_from_SL2cpl(g_b, dimA1, dima1, $ nb, nb, dcpl_mb(adrB), & ldb, mpb, nqB) c c c c*** deallocate work/SL arrays c if ( lrwork .ne. 0 ) status = ma_pop_stack(hrwork) if ( lwork .ne. 0 ) status = ma_pop_stack(hwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if ( n8 .ne. 0 ) status = ma_pop_stack(hfail) if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) c endif call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end #if HAVE_PDSYEVR subroutine ga_pzheevr(g_a, g_b, eval, nb8, mout) implicit none #include "mafdecls.fh" #include "global.fh" #include "scalapack.fh" c integer g_a(2) ! matrix A integer g_b(2) ! matrix B integer nb8 integer mout ! no. of evals/evecs to compute c c real eigenvalues c double precision eval(*) c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c logical status c character*1 jobz, range, uplo c integer ha, adra !A integer hb, adrb !B c c logical oactive ! true iff this process participates integer dimA18, dimA28, typeA integer dimB18, dimB28, typeB INTGR4 dimA1, dimA2,mout4 INTGR4 dimB1, dimB2 c INTGR4 mpA, nqA ! rows/cols of A held by the processor INTGR4 mpB, nqB ! rows/cols of B held by the processor c integer me INTGR4 lda, ldb integer elemA,elemB INTGR4 numroc INTGR4 nb ! block size INTGR4 descA(9), descB(9) !descriptor for scalapack c integer n8, hfail, adrfail integer liwork,hiwork, adriwork integer lwork,hwork, adrwork integer lrwork,hrwork, adrrwork INTGR4 liwork4 INTGR4 lwork4 INTGR4 lrwork4 c double precision vl, vu INTGR4 il, iu INTGR4 m, nz INTGR4 n INTGR4 info,one4,zero4,two4,four4 parameter(one4=1,zero4=0,two4=4,four4=4) integer info8,dblsize double precision pdlamch complex*16 dumm double precision dumm1 INTGR4 dumm2 external pdlamch INTGR4 iceil c c processor dependent; machine dependent c if(nb8.eq.0) then nb=16 else nb=nb8 endif c c*** check environment c me = ga_nodeid() c c*** check GA info for input arrays c call ga_check_handle(g_a(1), 'ga_pzheevr: a') call ga_check_handle(g_b(1), 'ga_pzheevr: b') c call ga_inquire(g_a(1), typeA, dimA18, dimA28) call ga_inquire(g_b(1), typeB, dimB18, dimB28) dima1=dima18 dima2=dima28 dimb1=dimb18 dimb2=dimb28 if(dimA1.ne.dima2) call ga_error( % 'ga_pzheevr: matrix A not square ',0) n=dima1 c nb=min(nb,n/2) if(dimb1.ne.dimb2) call ga_error( % 'ga_pzheevr: matrix B not square ',0) if(dimb1.ne.n) call ga_error( % 'ga_pzheevr: size matrix B and B differ ',0) if(mout.le.0.or.mout.gt.n) mout=n c c c*** initialize SL interface c call SLinit2(n) oactive=iam.lt.maxproc call ga_zero(g_b(1)) call ga_zero(g_b(2)) if (oactive) then c c*** find SBS format parameters c c mpA = numroc(dimA1, nb, myrow2, zero4, nprow2) nqA = numroc(dimA2, nb, mycol2, zero4, npcol2) c mpB = numroc(dimB1, nb, myrow2, zero4, nprow2) nqB = numroc(dimB2, nb, mycol2, zero4, npcol2) c c lda = max(one4,mpA) ldb = max(one4,mpB) c c c let scalapack check for errors c c should check to see if this is a compute node c check to see how this works in the new data server model c c elemA= mpA*nqA status = .true. if(elemA.ne.0)status = $ ma_push_get(MT_dcpL,elemA,'a',ha,adra) if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed A ', -1) c c*** copy g_a to A and g_b to B using the block cyclic scalapack format c call ga_to_SL2cpl(g_a, dimA1, dimA2, nb, nb, $ dcpl_mb(adrA), lda, mpA, nqA) endif call ga_sync() if(oactive) then c elemB= mpB*nqB c if(elemB.ne.0)status = $ ma_push_get(MT_dcpL,elemB,'b',hb,adrb) if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed B ', -1) c n8 = n if(n8.ne.0) then status = $ ma_push_get(MT_INT, n8 ,'ifail',hfail,adrfail) endif if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed ifail ', n) c c*** fill SCALAPACK matrix descriptors c call descinit(descA, dimA1, dimA2, nb, nb, zero4, zero4, $ islctxt2, lda, info) info8=info if(info.ne.0) call ga_error(' ga_pzheevr: descinit A failed ', . -info8) c call descinit(descB, dimB1, dimB2, nb, nb, zero4, zero4, . islctxt2, ldb, info) info8=info if(info.ne.0) call ga_error(' ga_pzheevr: descinit B failed ', . -info8) c jobz = 'V' uplo = 'L' vl = 0.d0 vu = 0.d0 c il=1 iu=mout range='i' lwork4=-1 lrwork4=-1 liwork4=-1 call pzheevr(jobz, range, uplo, 1 n, dcpl_mb(adrA), one4, one4, D descA,vl,vu, il, iu, m, nz, eval, dcpl_mb(adrB), one4, 3 one4, descB, 4 dumm, lwork4, dumm1,lrwork4, 3 dumm2, liwork4, info) lwork=dumm lrwork=dumm1 liwork=dumm2 c if(liwork.ne.0)status = $ ma_push_get(MT_INT, liwork ,'iwork',hiwork,adriwork) if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed iwork ', -1) c if(lwork.ne.0) $ status = ma_push_get(MT_DCPL, lwork , $ 'work',hwork,adrwork) if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed work ', -1) if(lrwork.ne.0) $ status = ma_push_get(MT_DBL, lrwork , $ 'rwork',hrwork,adrrwork) if(.not.status) & call ga_error('ga_pzheevr: mem alloc failed rwork ', -1) c liwork4=liwork lwork4=lwork lrwork4=lrwork call pzheevr(jobz, range, uplo, 1 n, dcpl_mb(adrA), one4, one4, D descA,vl,vu, il, iu, m, nz, eval, dcpl_mb(adrB), one4, 3 one4, descB, 4 dcpl_mb(adrwork), lwork4, dbl_mb(adrrwork),lrwork4, 3 int_mb(adriwork), liwork4, info) mout=m if(iam.eq.0.and.mout.ne.n) W write(6,*) ' computed eval ',mout,' out of ', A dima1 if (nz .ne. n ) then if ( info .ne. 0 ) then if ( info .gt. 0 ) then call ga_error(' ga_pzheevr: argument is illegal ', info) else call ga_error(' ga_pzheevr: eigenvectors failed to converge ', $ info) endif endif endif c c c c*** copy solution matrix back to g_b c mout4=mout call ga_from_SL2cpl(g_b, dimA1, mout4, $ nb, nb, dcpl_mb(adrB), & ldb, mpb, nqB) c c c c*** deallocate work/SL arrays c if ( lrwork .ne. 0 ) status = ma_pop_stack(hrwork) if ( lwork .ne. 0 ) status = ma_pop_stack(hwork) if ( liwork .ne. 0 ) status = ma_pop_stack(hiwork) if ( n8 .ne. 0 ) status = ma_pop_stack(hfail) if ( elemB .ne. 0 ) status = ma_pop_stack(hb) if ( elemA .ne. 0 ) status = ma_pop_stack(ha) c endif call ga_sync() if(maxproc.lt.nnodes.or.dima1.le.nb) then c broadcast evals dblsize=ma_sizeof(MT_DBL,1,MT_BYTE)*dima1 call ga_brdcst(1688,eval,dblsize,0) endif return end #endif SUBROUTINE PXERBLA( ICTXT, SRNAME, INFO ) * * -- ScaLAPACK auxiliary routine (version 2.0) -- * University of Tennessee, Knoxville, Oak Ridge National Laboratory, * and University of California, Berkeley. * April 1, 1998 * * .. Scalar Arguments .. INTEGER*4 ICTXT, INFO * .. * .. Array Arguments .. CHARACTER*(*) SRNAME * .. * * Purpose * ======= * * PXERBLA is an error handler for the ScaLAPACK routines. It is called * by a ScaLAPACK routine if an input parameter has an invalid value. A * message is printed. Installers may consider modifying this routine in * order to call system-specific exception-handling facilities. * * Arguments * ========= * * ICTXT (local input) INTEGER*4 * On entry, ICTXT specifies the BLACS context handle, indica- * ting the global context of the operation. The context itself * is global, but the value of ICTXT is local. * * SRNAME (global input) CHARACTER*(*) * On entry, SRNAME specifies the name of the routine which cal- * ling PXERBLA. * * INFO (global input) INTEGER*4 * On entry, INFO specifies the position of the invalid parame- * ter in the parameter list of the calling routine. * * -- Written on April 1, 1998 by * Antoine Petitet, University of Tennessee, Knoxville 37996, USA. * * ===================================================================== * * .. Local Scalars .. INTEGER*4 MYCOL, MYROW, NPCOL, NPROW * .. * .. External Subroutines .. EXTERNAL BLACS_GRIDINFO * .. * .. Executable Statements .. * CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL ) * WRITE( *, FMT = 9999 ) MYROW, MYCOL, SRNAME, INFO * 9999 FORMAT( '{', I5, ',', I5, '}: On entry to ', A, $ ' parameter number ', I4, ' had an illegal value' ) * call ga_error(' pxerbla error: info equal ', I info) RETURN * * End of PXERBLA * END ga-5-4/global/src/global.util.c0000644000175000017500000011215312662210457014447 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: global.util.c,v 1.48.6.6 2007-05-18 08:19:23 manoj Exp $*/ /* * module: global.util.c * author: Jarek Nieplocha * last modification: Tue Dec 20 09:41:55 PDT 1994 * * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_UNISTD_H # include #endif #include "farg.h" #include "globalp.h" #include #include "ga-papi.h" #include "ga-wapi.h" #define ARMCI 1 #if defined(SUN) void fflush(); #endif /*\ PRINT g_a[ilo:ihi, jlo:jhi] \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_print_patch_file2d = pnga_print_patch_file2d #endif void pnga_print_patch_file2d(file, g_a, ilo, ihi, jlo, jhi, pretty) FILE *file; Integer g_a, ilo, ihi, jlo, jhi, pretty; /* Pretty = 0 ... spew output out with no formatting Pretty = 1 ... format output so that it is readable */ { #define BUFSIZE 6 #define FLEN 80 Integer i, j,jj, dim1, dim2, type, jmax, ld=1, bufsize ; Integer a_grp; int ibuf[BUFSIZE]; DoublePrecision dbuf[BUFSIZE]; float fbuf[BUFSIZE]; long lbuf[BUFSIZE]; long long llbuf[BUFSIZE]; char *name; Integer ndim, dims[2]; Integer lo[2], hi[2]; a_grp = pnga_get_pgroup(g_a); pnga_pgroup_sync(a_grp); pnga_check_handle(g_a, "ga_print"); if(pnga_pgroup_nodeid(a_grp) == 0){ pnga_inquire(g_a, &type, &ndim, dims); dim1 = dims[0]; dim2 = dims[1]; /* name[FLEN-1]='\0';*/ pnga_inquire_name(g_a, &name); if (ilo <= 0 || ihi > dim1 || jlo <= 0 || jhi > dim2){ fprintf(stderr,"%ld %ld %ld %ld dims: [%ld,%ld]\n", (long)ilo,(long)ihi, (long)jlo,(long)jhi, (long)dim1, (long)dim2); pnga_error(" ga_print: indices out of range ", g_a); } fprintf(file,"\n global array: %s[%ld:%ld,%ld:%ld], handle: %d \n", name, (long)ilo, (long)ihi, (long)jlo, (long)jhi, (int)g_a); bufsize = (type==C_DCPL)? BUFSIZE/2 : BUFSIZE; bufsize = (type==C_SCPL)? BUFSIZE/2 : BUFSIZE; if (!pretty) { for (i=ilo; i 1) Error(error_buffer, icode); else{ fprintf(FOUT,"%s %ld\n",error_buffer,icode); perror("system message:"); fflush(FOUT); exit(1); } #endif } void ga_debug_suspend() { #ifdef HAVE_PAUSE fprintf(stdout,"ga_debug: process %ld ready for debugging\n", (long)getpid()); fflush(stdout); pause(); #endif } #ifdef ARMCI /********************************************************************* * N-dimensional operations * *********************************************************************/ /*\ print range of n-dimensional array with two strings before and after \*/ static void gai_print_range(char *pre,int ndim, Integer lo[], Integer hi[], char* post) { int i; printf("%s[",pre); for(i=0;i0; i--)printf("%ldx",(long)dims[i]); printf("%ld\n",(long)dims[0]); } /* print array range for every processor */ for(proc = 0; proc < nproc; proc++){ pnga_distribution(g_a,proc,lo,hi); sprintf(msg,"Process=%d\t owns array section: ",(int)proc); /* for C style need to swap and decremenent by 1 both arrays */ if(!fstyle){ for(i=0; i dims[i]) pnga_error("g_a indices out of range ", g_a); /* print the general information */ fprintf(file,"\n global array: %s[", name); for(i=0; i hi[i]) { if(i == (ndim-1)) { done = 0; } else { lop[i] = lo[i]; if(i == 0) hip[i] = GA_MIN(lop[i]+bufsize-1, hi[i]); else hip[i] = lo[i]; lop[i+1]++; hip[i+1]++; } } } } } else { /* pretty print */ done = 1; for(i=0; i 2)) { /* print the patch info */ fprintf(file,"\n -- patch: %s[", name); for(i=0; i 1)) { fprintf(file, "\n"); switch(type) { case C_INT: fprintf(file, " "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%7ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," --------"); break; case C_LONG: fprintf(file, " "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%7ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," --------"); break; case C_LONGLONG: fprintf(file, " "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%7ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," --------"); break; case C_DBL: fprintf(file, " "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%10ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," -----------"); break; case C_DCPL: for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%22ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," -----------------------"); break; case C_SCPL: for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%22ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," -----------------------"); break; case C_FLOAT: fprintf(file, " "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file, "%7ld ", (long)i); fprintf(file,"\n "); for (i=lop[1]; i<=hip[1]; i++) fprintf(file," --------"); break; default: pnga_error("ga_print: wrong type", 0); } fprintf(file,"\n"); status_2d = 0; } switch(type) { case C_INT: pnga_get(g_a, lop, hip, ibuf_2d, ld); break; case C_LONG: pnga_get(g_a, lop, hip,lbuf_2d, ld); break; case C_LONGLONG: pnga_get(g_a, lop, hip,llbuf_2d,ld);break; case C_DBL: pnga_get(g_a, lop, hip, dbuf_2d, ld); break; case C_DCPL: pnga_get(g_a, lop, hip, dcbuf_2d, ld);break; case C_FLOAT: pnga_get(g_a, lop, hip, fbuf_2d, ld);break; case C_SCPL: pnga_get(g_a, lop, hip, fcbuf_2d, ld);break; default: pnga_error("ga_print: wrong type",0); } for(i=0; i<(hip[0]-lop[0]+1); i++) { fprintf(file,"%4ld ", (long)(lop[0]+i)); switch(type) { case C_INT: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) fprintf(file," %8d", ibuf_2d[j*bufsize+i]); else fprintf(file," %8d", ibuf_2d[i]); break; case C_LONG: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) fprintf(file," %8ld",lbuf_2d[j*bufsize+i]); else fprintf(file," %8ld",lbuf_2d[i]); break; case C_LONGLONG: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) fprintf(file," %8lld",llbuf_2d[j*bufsize+i]); else fprintf(file," %8lld",llbuf_2d[i]); break; case C_DBL: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) if((double)dbuf_2d[j*bufsize+i]<100000.0) fprintf(file," %11.5f", dbuf_2d[j*bufsize+i]); else fprintf(file," %.5e", dbuf_2d[j*bufsize+i]); else if((double)dbuf_2d[i]<100000.0) fprintf(file," %11.5f",dbuf_2d[i]); else fprintf(file," %.5e",dbuf_2d[i]); break; case C_FLOAT: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) fprintf(file," %11.5f", fbuf_2d[j*bufsize+i]); else fprintf(file," %11.5f", fbuf_2d[i]); break; case C_DCPL: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) if(((double)dcbuf_2d[(j*bufsize+i)*2]<100000.0)&&((double)dcbuf_2d[(j*bufsize+i)*2+1]<100000.0)) fprintf(file," %11.5f,%11.5f", dcbuf_2d[(j*bufsize+i)*2], dcbuf_2d[(j*bufsize+i)*2+1]); else fprintf(file," %.5e,%.5e", dcbuf_2d[(j*bufsize+i)*2], dcbuf_2d[(j*bufsize+i)*2+1]); else if(((double)dcbuf_2d[i*2]<100000.0) && ((double)dcbuf_2d[i*2+1]<100000.0)) fprintf(file," %11.5f,%11.5f", dcbuf_2d[i*2], dcbuf_2d[i*2+1]); else fprintf(file," %.5e,%.5e", dcbuf_2d[i*2], dcbuf_2d[i*2+1]); break; case C_SCPL: if(ndim > 1) for(j=0; j<(hip[1]-lop[1]+1); j++) if(((float)fcbuf_2d[(j*bufsize+i)*2]<100000.0)&&((float)fcbuf_2d[(j*bufsize+i)*2+1]<100000.0)) fprintf(file," %11.5f,%11.5f", fcbuf_2d[(j*bufsize+i)*2], fcbuf_2d[(j*bufsize+i)*2+1]); else fprintf(file," %.5e,%.5e", fcbuf_2d[(j*bufsize+i)*2], fcbuf_2d[(j*bufsize+i)*2+1]); else if(((float)fcbuf_2d[i*2]<100000.0) && ((float)fcbuf_2d[i*2+1]<100000.0)) fprintf(file," %11.5f,%11.5f", fcbuf_2d[i*2], fcbuf_2d[i*2+1]); else fprintf(file," %.5e,%.5e", fcbuf_2d[i*2], fcbuf_2d[i*2+1]); break; default: pnga_error("ga_print: wrong data type", 0); } fprintf(file,"\n"); } lop[0] = hip[0]+1; hip[0] = GA_MIN(lop[0]+bufsize-1, hi[0]); for(i=0; i hi[i]) { if(i == (ndim-1)) { done = 0; } else { lop[i] = lo[i]; if((i == 0) || (i == 1)) { hip[i] = GA_MIN(lop[i]+bufsize-1, hi[i]); } else { hip[i] = lo[i]; } if(i == 0) { lop[i+1] = hip[i+1]+1; hip[i+1] = GA_MIN(lop[i+1]+bufsize-1, hi[i+1]); } else { lop[i+1]++; hip[i+1]++; } if(i == 0) status_2d = 1; if(i == 1) status_3d = 1; } } } } } fflush(file); } pnga_sync(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_print_patch = pnga_print_patch #endif void pnga_print_patch(Integer g_a, Integer *lo, Integer *hi, Integer pretty) { pnga_print_patch_file(stdout, g_a, lo, hi, pretty); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_summarize = pnga_summarize #endif void pnga_summarize(Integer verbose) { #define DEV stdout Integer i, j, g_a; Integer printed, arr_no; Integer type, active; char *name; Integer ndim, dims[MAXDIM]; Integer lop[MAXDIM], hip[MAXDIM]; Integer nproc = pnga_nnodes(); fprintf(DEV, " Summary of allocated global arrays\n"); fprintf(DEV, "-----------------------------------\n"); printed = 0; arr_no = 0; for(g_a=-1000; g_a<-900; g_a++) { active = pnga_verify_handle(g_a); if(active == 1) { printed = 1; pnga_inquire(g_a, &type, &ndim, dims); pnga_inquire_name(g_a, &name); switch(type) { case C_INT: fprintf(DEV, " array %d => integer ", (int)arr_no); break; case C_DBL: fprintf(DEV, " array %d => double precision ",(int)arr_no); break; case C_DCPL: fprintf(DEV, " array %d => double complex ", (int)arr_no); break; case C_SCPL: fprintf(DEV, " array %d => float (single) complex ", (int)arr_no); break; case C_FLOAT: fprintf(DEV, " array %d => float ",(int)arr_no); break; case C_LONG: fprintf(DEV, " array %d => long ",(int)arr_no); break; case C_LONGLONG: fprintf(DEV, " array %d => long long",(int)arr_no); break; default: pnga_error("ga_print: wrong type",0); } arr_no++; fprintf(DEV,"%s(", name); for(i=0; i %d \n",(int) i); } } } } if(!printed) fprintf(DEV, " No active global arrays\n"); fprintf(DEV, "\n\n"); fflush(DEV); } #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_print_file = pnga_print_file #endif void pnga_print_file(FILE *file, Integer g_a) { Integer i; Integer type, ndim, dims[MAXDIM]; Integer lo[MAXDIM]; Integer pretty = 1; pnga_inquire(g_a, &type, &ndim, dims); for(i=0; i #else # include "tcgmsg.h" #endif /*\ wrapper for wallclock timer. Returns an alapsed time on calling process \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_wtime = pnga_wtime #endif DoublePrecision pnga_wtime() { double wtime=0.0; #ifdef MSG_COMMS_MPI wtime = MPI_Wtime(); #else wtime = tcg_time(); #endif return (DoublePrecision)wtime; } ga-5-4/global/src/ga_symmetr.c0000644000175000017500000000644612662210457014411 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** * Symmetrizes matrix A: A := .5 * (A+A`) * diag(A) remains unchanged * */ #include "globalp.h" #include "macdecls.h" #include "ga-papi.h" #include "ga-wapi.h" static void gai_add( Integer *lo, Integer *hi, void *a, void *b, DoublePrecision alpha, Integer type, Integer nelem, Integer ndim) { Integer i, j, m=0; Integer nrow, ncol, indexA=0, indexB=0; DoublePrecision *A = (DoublePrecision *)a, *B = (DoublePrecision*)b; Integer offset1=1, offset2=1; nrow = hi[ndim-2] - lo[ndim-2] + 1; ncol = hi[ndim-1] - lo[ndim-1] + 1; for(i=0; i= nelem) indexA = j + ++m*offset2; A[indexA] = alpha *(A[indexA] + B[indexB]); } } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_symmetrize = pnga_symmetrize #endif void pnga_symmetrize(Integer g_a) { DoublePrecision alpha = 0.5; Integer i, me = pnga_nodeid(); Integer alo[GA_MAX_DIM], ahi[GA_MAX_DIM], lda[GA_MAX_DIM], nelem=1; Integer blo[GA_MAX_DIM], bhi[GA_MAX_DIM], ldb[GA_MAX_DIM]; Integer ndim, dims[GA_MAX_DIM], type; Logical have_data; Integer g_b; /* temporary global array (b = A') */ Integer num_blocks_a; void *a_ptr=NULL, *b_ptr=NULL; int local_sync_begin,local_sync_end; char *tempB = "A_transpose"; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("ga_symmetrize"); num_blocks_a = pnga_total_blocks(g_a); pnga_inquire(g_a, &type, &ndim, dims); if (type != C_DBL) pnga_error("ga_symmetrize: only implemented for double precision",0); if (num_blocks_a < 0) { if (dims[ndim-1] != dims[ndim-2]) pnga_error("ga_sym: can only sym square matrix", 0L); /* Find the local distribution */ pnga_distribution(g_a, me, alo, ahi); have_data = ahi[0]>0; for(i=1; i0; if(have_data) { pnga_access_ptr(g_a, alo, ahi, &a_ptr, lda); for(i=0; i #endif #if HAVE_STDLIB_H # include #endif static double __elem_op_var; static double __elem_op_var2; /* assignment e.g. a = b */ #define assign_reg(a,b) (a) = (b) #define assign_cpl(a,b) (a).real = (b).real; \ (a).imag = (b).imag /* assignment of zero e.g. a = 0 */ #define assign_zero_reg(a) (a) = 0 #define assign_zero_cpl(a) (a).real = 0; \ (a).imag = 0 /* assignment of a sum of two values e.g. a = b + c */ #define assign_add_reg(a,b,c) (a) = ((b) + (c)) #define assign_add_cpl(a,b,c) (a).real = ((b).real + (c).real); \ (a).imag = ((b).imag + (c).imag) /* assignment of a product of two values e.g. a = b * c */ #define assign_mul_reg(a,b,c) (a) = ((b) * (c)) #define assign_mul_cpl(a,b,c) (a).real = ((b).real*(c).real-(b).imag*(c).imag);\ (a).imag = ((b).real*(c).imag+(b).imag*(c).real) /* assignment of a product of two valus e.g. a = b * c */ #define assign_mul_constant_reg(a,b,c) (a) = ((b) * (c)) #define assign_mul_constant_cpl(a,b,c) (a).real = ((b) * (c).real); \ (a).imag = ((b) * (c).imag) /* assignment of a product of two valus e.g. a = b * c */ #define assign_mul_reg(a,b,c) (a) = ((b) * (c)) #define assign_mul_cpl(a,b,c) (a).real = ((b).real*(c).real-(b).imag*(c).imag); \ (a).imag = ((b).real*(c).imag+(b).imag*(c).real) /* assignment of a quotient of two valus e.g. a = b / c */ #if 0 #define assign_div_reg(a,b,c) (a) = ((b) / (c)) #define assign_div_cpl(a,b,c) (a).real = (((b).real*(c).real+(b).imag*(c).imag) \ /((c).real*(c).real+(c).imag*(c).imag)); \ (a).imag = (((b).imag*(c).real-(b).real*(c).imag) \ /((c).real*(c).real+(c).imag*(c).imag)) #else #define assign_div_reg(a,b,c) (a) = ((b) / (c)) #define assign_div_cpl(a,b,c) __elem_op_var = ((c).real*(c).real+(c).imag*(c).imag); \ (a).real = (((b).real*(c).real+(b).imag*(c).imag) \ /__elem_op_var; \ (a).imag = (((b).imag*(c).real-(b).real*(c).imag) \ /__elem_op_var #endif /* in-place assignment of a sum e.g. a = a + b written a += b */ #define add_assign_reg(a,b) (a) += (b) #define add_assign_cpl(a,b) (a).real += (b).real; \ (a).imag += (b).imag /* not equal to zero e.g. a != 0 */ #define neq_zero_reg(a) (0 != (a)) #define neq_zero_cpl(a) (0 != (a).real || 0 != (a).imag) /* equal to zero e.g. a == 0 */ #define eq_zero_reg(a) (0 == (a)) #define eq_zero_cpl(a) (0 == (a).real && 0 == (a).imag) /* equality e.g. a == b */ #define eq_reg(a,b) ((a) == (b)) #define eq_cpl(a,b) ((a).real == (b).real && (a).imag == (b).imag) /* absolute value */ #define abs_reg(a) ((a) < 0 ? -(a) : (a)) #define abs_cpl(a) (a) = sqrt((a).real*(a).real+(a).imag*(a).imag) /* assignment of a maximum of two values e.g. if(b > c) a = b else a = c */ #define assign_max_reg(a,b,c) (a) = (b) > (c) ? (b) : (c) #define assign_max_cpl(a,b,c) __elem_op_var = ((b).real*(b).real+(b).imag*(b).imag); \ __elem_op_var2 = ((c).real*(c).real+(c).imag*(c).imag); \ (a).real = __elem_op_var > __elem_op_var2 \ ? (b).real : (c).real; \ (a).imag = __elem_op_var > __elem_op_var2 \ ? (b).imag : (c).imag /* assignment of a miniimum of two values e.g. if(b > c) a = b else a = c */ #define assign_min_reg(a,b,c) (a) = (b) < (c) ? (b) : (c) #define assign_min_cpl(a,b,c) __elem_op_var = ((b).real*(b).real+(b).imag*(b).imag); \ __elem_op_var2 = ((c).real*(c).real+(c).imag*(c).imag); \ (a).real = __elem_op_var < __elem_op_var2 \ ? (b).real : (c).real; \ (a).imag = __elem_op_var < __elem_op_var2 \ ? (b).imag : (c).imag /* assignment of an absolute value e.g. a = |b| */ #define assign_abs_reg(a,b) (a) = abs_reg(b) /* Note: absolute value of a complex number is usually sqrt(x*x + y*y) but this * can lead to overflows and/or underflows. Instead, we use the well-known * hypot solution: * double hypot(double x,double y) * { * double t; * x = abs(x); * y = abs(y); * t = min(x,y); * x = max(x,y); * y = t; * return x*sqrt(1+(y/x)*(y/x)); * } */ #if HAVE_HYPOT #define assign_abs_cpl(a,b) (a).real = hypot((b).real, (b).imag); \ (a).imag = 0.0 #else #define assign_abs_cpl(a,b) \ if (abs_reg((b).real) >= abs_reg((b).imag)) { \ (a).real = abs_reg((b).real) * \ sqrt(1.0 + ((b).imag/(b).real)*((b).imag/(b).real)); \ } else { \ (a).real = abs_reg((b).imag) * \ sqrt(1.0 + ((b).real/(b).imag)*((b).real/(b).imag)); \ } \ (a).imag = 0.0 #endif /* assignment of a random value */ #define sign() (1.0 * rand() / RAND_MAX > 1.0 ? 1.0 : -1.0) #define assign_rand_reg(a,val) (a) = 1.0 * (val) * rand() / RAND_MAX * sign() #define assign_rand_cpl(a,val) assign_rand_reg((a).real, (val).real); \ assign_rand_reg((a).imag, (val).imag) #endif /* _ABSTRACT_OPS_H_ */ ga-5-4/global/src/base.c0000644000175000017500000040010112662210457013136 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: base.c,v 1.149.2.19 2007/12/18 18:42:20 d3g293 Exp $ */ /* * module: base.c * author: Jarek Nieplocha * description: implements GA primitive operations -- * create (regular& irregular) and duplicate, destroy * * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ /*#define PERMUTE_PIDS */ #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #include "farg.h" #include "globalp.h" #include "message.h" #include "base.h" #include "macdecls.h" #include "armci.h" #include "ga-papi.h" #include "ga-wapi.h" static int calc_maplen(int handle); #ifdef PROFILE_OLD #include "ga_profile.h" #endif /*#define AVOID_MA_STORAGE 1*/ #define DEBUG 0 #define USE_MALLOC 1 #define INVALID_MA_HANDLE -1 #define NEAR_INT(x) (x)< 0.0 ? ceil( (x) - 0.5) : floor((x) + 0.5) #define FLEN 80 /* length of Fortran strings */ /*uncomment line below to verify consistency of MA in every sync */ /*#define CHECK_MA yes */ /*uncomment line below to verify if MA base address is alligned wrt datatype*/ #if !(defined(LINUX) || defined(CRAY) || defined(CYGWIN)) #define CHECK_MA_ALGN 1 #endif /*uncomment line below to initialize arrays in ga_create/duplicate */ /*#define GA_CREATE_INDEF yes */ /*uncomment line below to introduce padding between shared memory regions of a GA when the region spans in more than 1 process within SMP */ #define GA_ELEM_PADDING yes #define OLD_DISTRIBUTION 1 #if OLD_DISTRIBUTION extern void ddb_h2(Integer ndims, Integer dims[], Integer npes, double threshold, Integer bias, Integer blk[], Integer pedims[]); #else extern void ddb(Integer ndims, Integer dims[], Integer npes, Integer blk[], Integer pedims[]); #endif global_array_t *_ga_main_data_structure; global_array_t *GA; proc_list_t *_proc_list_main_data_structure; proc_list_t *PGRP_LIST; static int GAinitialized = 0; static int ARMCIinitialized = 0; int _ga_sync_begin = 1; int _ga_sync_end = 1; int _max_global_array = MAX_ARRAYS; Integer *GA_proclist; int* GA_Proc_list = NULL; int* GA_inv_Proc_list=NULL; int GA_World_Proc_Group = -1; int GA_Default_Proc_Group = -1; int ga_armci_world_group=0; int GA_Init_Proc_Group = -2; Integer GA_Debug_flag = 0; int *ProcPermList = NULL; /* MA addressing */ DoubleComplex *DCPL_MB; /* double precision complex base address */ SingleComplex *SCPL_MB; /* single precision complex base address */ DoublePrecision *DBL_MB; /* double precision base address */ Integer *INT_MB; /* integer base address */ float *FLT_MB; /* float base address */ int** GA_Update_Flags; int* GA_Update_Signal; typedef struct { long id; long type; long size; long dummy; } getmem_t; /* set total limit (bytes) for memory usage per processor to "unlimited" */ static Integer GA_total_memory = -1; static Integer GA_memory_limited = 0; struct ga_stat_t GAstat; struct ga_bytes_t GAbytes ={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}; long *GAstat_arr; static Integer GA_memory_limit=0; Integer GAme, GAnproc; static Integer MPme; Integer *mapALL; #ifdef PERMUTE_PIDS char** ptr_array; #endif char *GA_name_stack[NAME_STACK_LEN]; /* stack for storing names of GA ops */ int GA_stack_size=0; /* Function prototypes */ int gai_getmem(char* name, char **ptr_arr, C_Long bytes, int type, long *id, int grp_id); #ifdef ENABLE_CHECKPOINT static int ga_group_is_for_ft=0; int ga_spare_procs; #endif /*************************************************************************/ /*\ This macro computes index (place in ordered set) for the element * identified by _subscript in ndim- dimensional array of dimensions _dim[] * assume that first subscript component changes first \*/ #define ga_ComputeIndexM(_index, _ndim, _subscript, _dims) \ { \ Integer _i, _factor=1; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_i=0,*(_index)=0; _i<_ndim; _i++){ \ *(_index) += _subscript[_i]*_factor; \ if(_i<_ndim-1)_factor *= _dims[_i]; \ } \ } /*\ updates subscript corresponding to next element in a patch \*/ #define ga_UpdateSubscriptM(_ndim, _subscript, _lo, _hi, _dims)\ { \ Integer _i; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_i=0; _i<_ndim; _i++){ \ if(_subscript[_i] < _hi[_i]) { _subscript[_i]++; break;} \ _subscript[_i] = _lo[_i]; \ } \ } /*\ Initialize n-dimensional loop by counting elements and setting subscript=lo \*/ #define ga_InitLoopM(_elems, _ndim, _subscript, _lo, _hi, _dims)\ { \ Integer _i; \ *_elems = 1; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_i=0; _i<_ndim; _i++){ \ *_elems *= _hi[_i]-_lo[_i] +1; \ _subscript[_i] = _lo[_i]; \ } \ } Integer GAsizeof(Integer type) { switch (type) { case C_DBL : return (sizeof(double)); case C_INT : return (sizeof(int)); case C_SCPL : return (sizeof(SingleComplex)); case C_DCPL : return (sizeof(DoubleComplex)); case C_FLOAT : return (sizeof(float)); case C_LONG : return (sizeof(long)); case C_LONGLONG : return (sizeof(long long)); default : return 0; } } /*\ Register process list * process list can be used to: * 1. permute process ids w.r.t. message-passing ids (set PERMUTE_PIDS), or * 2. change logical mapping of array blocks to processes \*/ void ga_register_proclist_(Integer *list, Integer* np) { int i; GA_PUSH_NAME("ga_register_proclist"); if( *np <0 || *np >GAnproc) pnga_error("invalid number of processors",*np); if( *np = GAnproc) pnga_error("invalid list entry",p); GA_Proc_list[i] = p; GA_inv_Proc_list[p]=i; } GA_POP_NAME; } void GA_Register_proclist(int *list, int np) { int i; GA_PUSH_NAME("ga_register_proclist"); if( np <0 || np >GAnproc) pnga_error("invalid number of processors",np); if( np = GAnproc) pnga_error("invalid list entry",p); GA_Proc_list[i] = p; GA_inv_Proc_list[p]=i; } GA_POP_NAME; } /*\ FINAL CLEANUP of shmem when terminating \*/ void ga_clean_resources() { ARMCI_Cleanup(); } /*\ CHECK GA HANDLE and if it's wrong TERMINATE * C version \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_check_handle = pnga_check_handle #endif void pnga_check_handle(Integer g_a, char * string) { ga_check_handleM(g_a, string); } /*\ Initialize MA-like addressing: * get addressees for the base arrays for double, complex and int types \*/ static int ma_address_init=0; void gai_ma_address_init() { #ifdef CHECK_MA_ALGN Integer off_dbl, off_int, off_dcpl, off_flt,off_scpl; #endif ma_address_init=1; INT_MB = (Integer*)MA_get_mbase(MT_F_INT); DBL_MB = (DoublePrecision*)MA_get_mbase(MT_F_DBL); DCPL_MB= (DoubleComplex*)MA_get_mbase(MT_F_DCPL); SCPL_MB= (SingleComplex*)MA_get_mbase(MT_F_SCPL); FLT_MB = (float*)MA_get_mbase(MT_F_REAL); # ifdef CHECK_MA_ALGN off_dbl = 0 != ((long)DBL_MB)%sizeof(DoublePrecision); off_int = 0 != ((long)INT_MB)%sizeof(Integer); off_dcpl= 0 != ((long)DCPL_MB)%sizeof(DoublePrecision); off_scpl= 0 != ((long)SCPL_MB)%sizeof(float); off_flt = 0 != ((long)FLT_MB)%sizeof(float); if(off_dbl) pnga_error("GA initialize: MA DBL_MB not alligned", (Integer)DBL_MB); if(off_int) pnga_error("GA initialize: INT_MB not alligned", (Integer)INT_MB); if(off_dcpl) pnga_error("GA initialize: DCPL_MB not alligned", (Integer)DCPL_MB); if(off_scpl) pnga_error("GA initialize: SCPL_MB not alligned", (Integer)SCPL_MB); if(off_flt) pnga_error("GA initialize: FLT_MB not alligned", (Integer)FLT_MB); # endif if(DEBUG) printf("%d INT_MB=%p DBL_MB=%p DCPL_MB=%p FLT_MB=%p SCPL_MB=%p\n", (int)GAme, (void*)INT_MB, (void*)DBL_MB, (void*)DCPL_MB, (void*)FLT_MB, (void*)SCPL_MB); } extern int *_ga_argc; extern char ***_ga_argv; extern int _ga_initialize_args; extern int _ga_initialize_c; extern int _ga_initialize_f; /** * Initialize library structures in Global Arrays. * either ga_initialize_ltd or ga_initialize must be the first * GA routine called (except ga_uses_ma) */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_initialize = pnga_initialize #endif void pnga_initialize() { Integer i, j,nproc, nnode, zero; int bytes; if(GAinitialized) return; #if HAVE_ARMCI_INITIALIZED_FUNCTION if (!ARMCI_Initialized()) #else if (!ARMCIinitialized) #endif { /* assure that GA will not alocate more shared memory than specified */ if(GA_memory_limited) ARMCI_Set_shm_limit(GA_total_memory); if (_ga_initialize_c) { if (_ga_initialize_args) { ARMCI_Init_args(_ga_argc, _ga_argv); } else { ARMCI_Init(); } } else if (_ga_initialize_f) { _ga_argc = malloc(sizeof(int)); _ga_argv = malloc(sizeof(char**)); if (!_ga_argc) pnga_error("malloc argc failed",1); ga_f2c_get_cmd_args(_ga_argc, _ga_argv); ARMCI_Init_args(_ga_argc, _ga_argv); } else { pnga_error("pnga_initialize called outside of C or F APIs",1); } ARMCIinitialized = 1; } GA_Default_Proc_Group = -1; /* zero in pointers in GA array */ _ga_main_data_structure = (global_array_t *)malloc(sizeof(global_array_t)*MAX_ARRAYS); _proc_list_main_data_structure = (proc_list_t *)malloc(sizeof(proc_list_t)*MAX_ARRAYS); if(!_ga_main_data_structure) pnga_error("ga_init:malloc ga failed",0); if(!_proc_list_main_data_structure) pnga_error("ga_init:malloc proc_list failed",0); GA = _ga_main_data_structure; PGRP_LIST = _proc_list_main_data_structure; for(i=0;iGAnproc) pnga_error("ga_init:message-passing initialization problem: my ID=",GAme); MPme= (Integer)armci_msg_me(); if(GA_Proc_list) fprintf(stderr,"permutation applied %d now becomes %d\n",(int)MPme,(int)GAme); GA_proclist = (Integer*)malloc((size_t)GAnproc*sizeof(Integer)); if(!GA_proclist) pnga_error("ga_init:malloc failed (proclist)",0); gai_init_onesided(); /* set activity status for all arrays to inactive */ for(i=0;i<_max_global_array;i++)GA[i].actv=0; for(i=0;i<_max_global_array;i++)GA[i].actv_handle=0; /* Create proc list for mirrored arrays */ PGRP_LIST[0].map_proc_list = (int*)malloc(GAnproc*sizeof(int)*2); PGRP_LIST[0].inv_map_proc_list = PGRP_LIST[0].map_proc_list + GAnproc; for (i=0; i=tmpcount) ga_irecover(0); printf("\n%d:here done with initialize\n",GAme); } #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_initialized = pnga_initialized #endif int pnga_initialized() { return GAinitialized; } #if ENABLE_CHECKPOINT void set_ga_group_is_for_ft(int val) { ga_group_is_for_ft = val; } #endif /** * Is MA used for allocation of GA memory? */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_uses_ma = pnga_uses_ma #endif logical pnga_uses_ma() { #ifdef AVOID_MA_STORAGE return FALSE; #else if(!GAinitialized) return FALSE; if(ARMCI_Uses_shm()) return FALSE; else return TRUE; #endif } /** * Is memory limit set */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_memory_limited = pnga_memory_limited #endif logical pnga_memory_limited() { if(GA_memory_limited) return TRUE; else return FALSE; } /** * Returns the amount of memory on each processor used in active Global Arrays */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_inquire_memory = pnga_inquire_memory #endif Integer pnga_inquire_memory() { Integer i, sum=0; for(i=0; i<_max_global_array; i++) if(GA[i].actv) sum += (Integer)GA[i].size; return(sum); } /** * Returns the amount of memory available on the calling processor */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_memory_avail = pnga_memory_avail #endif Integer pnga_memory_avail() { if(!pnga_uses_ma()) return(GA_total_memory); else{ Integer ma_limit = MA_inquire_avail(MT_F_BYTE); if ( GA_memory_limited ) return( GA_MIN(GA_total_memory, ma_limit) ); else return( ma_limit ); } } /** * (re)set limit on GA memory usage */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_memory_limit = pnga_set_memory_limit #endif void pnga_set_memory_limit(Integer mem_limit) { if(GA_memory_limited){ /* if we had the limit set we need to adjust the amount available */ if (mem_limit>=0) /* adjust the current value by diff between old and new limit */ GA_total_memory += (mem_limit - GA_memory_limit); else{ /* negative values reset limit to "unlimited" */ GA_memory_limited = 0; GA_total_memory= -1; } }else{ GA_total_memory = GA_memory_limit = mem_limit; if(mem_limit >= 0) GA_memory_limited = 1; } } /** * Initialize Global Array library structures and set a limit on memory * usage by GA. * the byte limit is per processor (even for shared memory) * either ga_initialize_ltd or ga_initialize must be the first * GA routine called (except ga_uses_ma) * ga_initialize is another version of ga_initialize_ltd, except * without memory control * mem_limit < 0 means "memory unlimited" */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_initialize_ltd = pnga_initialize_ltd #endif void pnga_initialize_ltd(Integer mem_limit) { GA_total_memory =GA_memory_limit = mem_limit; if(mem_limit >= 0) GA_memory_limited = 1; pnga_initialize(); } /* #define gam_checktype(_type)\ */ /* if(_type != C_DBL && _type != C_INT && \ */ /* _type != C_DCPL && _type != C_SCPL && _type != C_FLOAT && \ */ /* _type != C_LONG &&_type != C_LONGLONG)\ */ /* pnga_error("ttype not yet supported ", _type) */ #define gam_checktype(_type) if(!GAvalidtypeM(_type))pnga_error("type not yet supported", (_type)) #define gam_checkdim(ndim, dims)\ {\ int _d;\ if(ndim<1||ndim>MAXDIM) pnga_error("unsupported number of dimensions",ndim);\ __CRAYX1_PRAGMA("_CRI novector"); \ for(_d=0; _d= 0) { if (PGRP_LIST[p_handle].mirrored) ret = TRUE; } return ret; } #define findblock(map_ij,n,scale,elem, block)\ {\ int candidate, found, b; \ C_Integer *map= (map_ij);\ \ candidate = (int)(scale*(elem));\ found = 0;\ if(map[candidate] <= (elem)){ /* search downward */\ b= candidate;\ while(b<(n)-1){ \ found = (map[b+1]>(elem));\ if(found)break;\ b++;\ } \ }else{ /* search upward */\ b= candidate-1;\ while(b>=0){\ found = (map[b]<=(elem));\ if(found)break;\ b--;\ }\ }\ if(!found)b=(n)-1;\ *(block) = b;\ } /** * Locate the owner of an element of a Global Array specified by the array * subscript */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_locate = pnga_locate #endif logical pnga_locate(Integer g_a, Integer* subscript, Integer* owner) { Integer d, proc, dpos, ndim, ga_handle = GA_OFFSET + g_a, proc_s[MAXDIM]; int use_blocks; ga_check_handleM(g_a, "nga_locate"); ndim = GA[ga_handle].ndim; use_blocks = GA[ga_handle].block_flag; if (!use_blocks) { for(d=0, *owner=-1; d< ndim; d++) if(subscript[d]< 1 || subscript[d]>GA[ga_handle].dims[d]) return FALSE; for(d = 0, dpos = 0; d< ndim; d++){ findblock(GA[ga_handle].mapc + dpos, GA[ga_handle].nblock[d], GA[ga_handle].scale[d], subscript[d], &proc_s[d]); dpos += GA[ga_handle].nblock[d]; } ga_ComputeIndexM(&proc, ndim, proc_s, GA[ga_handle].nblock); *owner = GA_Proc_list ? GA_Proc_list[proc]: proc; if (GA[ga_handle].num_rstrctd > 0) { *owner = GA[ga_handle].rstrctd_list[*owner]; } } else { if (GA[ga_handle].block_sl_flag == 0) { Integer i, j, chk, lo[MAXDIM], hi[MAXDIM]; Integer num_blocks = GA[ga_handle].block_total; for (i=0; i< num_blocks; i++) { pnga_distribution(g_a, i, lo, hi); chk = 1; for (j=0; j hi[j]) chk = 0; } if (chk) { *owner = i; break; } } } else { Integer index[MAXDIM]; Integer i; for (i=0; i= ifirst && nfirst < 0) { nfirst = i; } if (ilast <= icnt-1 && nfirst >= 0 && nlast < 0) { nlast = i; } } /* Adjust indices corresponding to start and end of block of shared memory so that it can be decomposed into large rectangular blocks of the global array. Start by adusting the lower index */ icnt = 0; for (i = 0; i= lo[j]) { nelems *= (hi[j] - lo[j] + 1); } else { nelems = 0; } } icnt += nelems; } /* calculate offset in local block of memory */ ifirst = ifirst - icnt; /* find dimensions of data on block nfirst */ np = nfirst; pnga_distribution(g_a, np, lo, hi); nelems = 1; for (i=0; i GA[handle].dims[ndim-1]-1) ifirst=GA[handle].dims[ndim-1]-1; /* adjust value of ifirst */ pnga_proc_topology(g_a, nfirst, index); subscript[ndim-1] = ifirst; for (i=0; i nfirst) { icnt = 0; for (i = 0; i= lo[j]) { nelems *= (hi[j] - lo[j] + 1); } else { nelems = 0; } } icnt += nelems; } } ilast = ilast - icnt; /* find dimensions of data on block nlast */ np = nlast; pnga_distribution(g_a, np, lo, hi); nelems = 1; for (i=0; i GA[handle].dims[i]) { GA[handle].last[i] = GA[handle].dims[i]; } } /* find length of shared memory segment owned by this node. Adjust * length, if necessary, to account for gaps in memory between * processors */ type = GA[handle].type; switch(type) { case C_FLOAT: size = sizeof(float); break; case C_DBL: size = sizeof(double); break; case C_LONG: size = sizeof(long); break; case C_LONGLONG: size = sizeof(long long); break; case C_INT: size = sizeof(int); break; case C_SCPL: size = 2*sizeof(float); break; case C_DCPL: size = 2*sizeof(double); break; default: pnga_error("type not supported",type); } for (i=0; i 0) parent_grp = PGRP_LIST[GA_Default_Proc_Group].group; else ARMCI_Group_get_world(&parent_grp); ARMCI_Group_set_default(&parent_grp); } #endif } /** * Create a new processor group containing count processors with * process IDs (in the default group) in list. Return process group * handle. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_create = pnga_pgroup_create #endif Integer pnga_pgroup_create(Integer *list, Integer count) { Integer pgrp_handle, i, j, nprocs, itmp; Integer parent; int tmp_count; Integer *tmp_list; int *tmp2_list; #ifdef MSG_COMMS_MPI ARMCI_Group *tmpgrp; #endif GA_PUSH_NAME("ga_pgroup_create"); /* Allocate temporary arrays */ tmp_list = (Integer*)malloc(GAnproc*sizeof(Integer)); tmp2_list = (int*)malloc(GAnproc*sizeof(int)); /*** Get next free process group handle ***/ pgrp_handle =-1; i=0; do{ if(!PGRP_LIST[i].actv) pgrp_handle=i; i++; }while(i<_max_global_array && pgrp_handle==-1); if( pgrp_handle == -1) pnga_error(" Too many process groups ", (Integer)_max_global_array); /* Check list for validity (no duplicates and no out of range entries) */ nprocs = GAnproc; for (i=0; i= nprocs) pnga_error(" invalid element in list ", list[i]); for (j=i+1; j=0 && tmp2_list[i] > itmp) { tmp2_list[i+1] = tmp2_list[i]; i--; } tmp2_list[i+1] = itmp; } /* Remap elements in list to absolute processor indices (if necessary)*/ if (GA_Default_Proc_Group != -1) { parent = GA_Default_Proc_Group; for (i=0; i grp_size*grp_num) grp_size++; /* Figure out what procs are in my group */ ratio = me/grp_size; start = ratio*grp_size; end = (ratio+1)*grp_size-1; end = GA_MIN(end,nprocs-1); if (end0) { grp_id = pnga_pgroup_create(nodes, grp_size); if (i == end + 1) { ret = grp_id; } icnt = 0; } nodes[icnt] = i; icnt++; } grp_id = pnga_pgroup_create(nodes, icnt); if (end == nprocs-1) { ret = grp_id; } pnga_pgroup_set_default(default_grp); if(ret==-1) pnga_error("ga_pgroup_split failed",ret); /* Free temporary array */ GA_POP_NAME; free(nodes); return ret; } /** * Split grp into multiple groups based on the color in mycolor. All processes * in grp with the same color are assigned to the same group. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_split_irreg = pnga_pgroup_split_irreg #endif Integer pnga_pgroup_split_irreg(Integer grp, Integer mycolor) { Integer nprocs, me, default_grp, grp_id; Integer i, icnt=0; Integer *nodes, *color_arr; GA_PUSH_NAME("ga_pgroup_split_irreg_"); /* Allocate temporary arrays */ nodes = (Integer*)malloc(GAnproc*sizeof(Integer)); color_arr = (Integer*)malloc(GAnproc*sizeof(Integer)); if(mycolor<0) pnga_error("Invalid argument (color < 0)",mycolor); default_grp = pnga_pgroup_get_default(); pnga_pgroup_set_default(grp); nprocs = pnga_nnodes(); me = pnga_nodeid(); /* Figure out what procs are in my group */ for(i=0; i FNAM) pnga_error("Array name exceeds maximum array name length",FNAM); strcpy(GA[ga_handle].name, array_name); GA_POP_NAME; } /** * Set the processor group on a new global array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_pgroup = pnga_set_pgroup #endif void pnga_set_pgroup(Integer g_a, Integer p_handle) { Integer ga_handle = g_a + GA_OFFSET; GA_PUSH_NAME("ga_set_pgroup"); if (GA[ga_handle].actv == 1) pnga_error("Cannot set processor configuration on array that has been allocated",0); if (p_handle == GA_World_Proc_Group || PGRP_LIST[p_handle].actv == 1) { GA[ga_handle].p_handle = (int) (p_handle); } else { pnga_error("Processor group does not exist",0); } GA_POP_NAME; } /** * Get the processor group handle associated with g_a */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_pgroup = pnga_get_pgroup #endif Integer pnga_get_pgroup(Integer g_a) { Integer ga_handle = g_a + GA_OFFSET; return (Integer)GA[ga_handle].p_handle; } /** * Return the number of processors associated with a processor group */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_pgroup_size = pnga_get_pgroup_size #endif Integer pnga_get_pgroup_size(Integer grp_id) { int p_handle = (int)(grp_id); if (p_handle > 0) { return (Integer)PGRP_LIST[p_handle].map_nproc; } else { return GAnproc; } } /** * Add ghost cells to a new global array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_ghosts = pnga_set_ghosts #endif void pnga_set_ghosts(Integer g_a, Integer *width) { Integer i; Integer ga_handle = g_a + GA_OFFSET; GA_PUSH_NAME("ga_set_ghosts"); if (GA[ga_handle].actv == 1) pnga_error("Cannot set ghost widths on array that has been allocated",0); if (GA[ga_handle].ndim < 1) pnga_error("Dimensions must be set before array widths are specified",0); for (i=0; i GA[ga_handle].dims[i]) pnga_error("Boundary width must be <= corresponding dimension",i); if ((C_Integer)width[i] < 0) pnga_error("Boundary width must be >= 0",i); } for (i=0; i 0) GA[ga_handle].ghosts = 1; } GA_POP_NAME; } /** * Set irregular distribution in a new global array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_irreg_distr = pnga_set_irreg_distr #endif void pnga_set_irreg_distr(Integer g_a, Integer *mapc, Integer *nblock) { Integer i, j, ichk, maplen; Integer ga_handle = g_a + GA_OFFSET; GA_PUSH_NAME("ga_set_irreg_distr"); if (GA[ga_handle].actv == 1) pnga_error("Cannot set irregular data distribution on array that has been allocated",0); if (GA[ga_handle].ndim < 1) pnga_error("Dimensions must be set before irregular distribution is specified",0); for (i=0; i GA[ga_handle].dims[i]) pnga_error("number of blocks must be <= corresponding dimension",i); /* Check to see that mapc array is sensible */ maplen = 0; for (i=0; i GA[ga_handle].dims[i]) pnga_error("Mapc entry outside array dimension limits",ichk); maplen++; for (j=1; j GA[ga_handle].dims[i]) pnga_error("Mapc entry outside array dimension limits",ichk); maplen++; } } maplen = 0; for (i=0; i 0)) pnga_error("Cannot set block-cyclic data distribution if array size not set",0); if (GA[ga_handle].block_flag == 1) pnga_error("Cannot reset block-cyclic data distribution on array that has been set",0); GA[ga_handle].block_flag = 1; GA[ga_handle].block_sl_flag = 0; /* evaluate number of blocks in each dimension */ for (i=0; i 0)) pnga_error("Cannot set block-cyclic data distribution if array size not set",0); if (GA[ga_handle].block_flag == 1) pnga_error("Cannot reset block-cyclic data distribution on array that has been set",0); GA[ga_handle].block_flag = 1; GA[ga_handle].block_sl_flag = 1; /* Check to make sure processor grid is compatible with total number of processors */ tot = 1; for (i=0; i 0) { me = PGRP_LIST[p_handle].map_proc_list[GAme]; nproc = PGRP_LIST[p_handle].map_nproc; } else { me = GAme; nproc = GAnproc; } has_data = 0; for (i=0; i= nproc) pnga_error("Invalid processor in list",list[i]); ig = list[i]; GA[ga_handle].rank_rstrctd[ig] = i; } GA[ga_handle].has_data = has_data; GA[ga_handle].rstrctd_id = id; GA_POP_NAME; } /** * Restrict processors that actually contain data in the global array * by specifying a range of processors */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_restricted_range = pnga_set_restricted_range #endif void pnga_set_restricted_range(Integer g_a, Integer lo_proc, Integer hi_proc) { Integer i, ig, id=0, me, p_handle, has_data, icnt, nproc, size; Integer ga_handle = g_a + GA_OFFSET; size = hi_proc - lo_proc + 1; GA_PUSH_NAME("ga_set_restricted_range"); GA[ga_handle].num_rstrctd = size; GA[ga_handle].rstrctd_list = (Integer*)malloc((size)*sizeof(Integer)); GA[ga_handle].rank_rstrctd = (Integer*)malloc((GAnproc)*sizeof(Integer)); p_handle = GA[ga_handle].p_handle; if (p_handle == -2) p_handle = pnga_pgroup_get_default(); if (p_handle > 0) { me = PGRP_LIST[p_handle].map_proc_list[GAme]; nproc = PGRP_LIST[p_handle].map_nproc; } else { me = GAme; nproc = GAnproc; } has_data = 0; for (i=0; i= nproc) pnga_error("Invalid processor in list",i); ig = i; GA[ga_handle].rank_rstrctd[ig] = icnt; icnt++; } GA[ga_handle].has_data = has_data; GA[ga_handle].rstrctd_id = id; GA_POP_NAME; } /** * Allocate memory and complete setup of global array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_allocate = pnga_allocate #endif logical pnga_allocate(Integer g_a) { Integer hi[MAXDIM]; Integer ga_handle = g_a + GA_OFFSET; Integer d, width[MAXDIM], ndim; Integer mem_size, nelem; Integer i, status, maplen=0, p_handle; Integer dims[MAXDIM], chunk[MAXDIM]; Integer pe[MAXDIM], *pmap[MAXDIM], *map; Integer blk[MAXDIM]; Integer grp_me=GAme, grp_nproc=GAnproc; Integer block_size = 0; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous sync masking*/ if (GA[ga_handle].ndim == -1) pnga_error("Insufficient data to create global array",0); p_handle = (Integer)GA[ga_handle].p_handle; if (p_handle == (Integer)GA_Init_Proc_Group) { GA[ga_handle].p_handle = GA_Default_Proc_Group; p_handle = GA_Default_Proc_Group; } pnga_pgroup_sync(p_handle); GA_PUSH_NAME("ga_allocate"); if (p_handle > 0) { grp_nproc = PGRP_LIST[p_handle].map_nproc; grp_me = PGRP_LIST[p_handle].map_proc_list[GAme]; } if(!GAinitialized) pnga_error("GA not initialized ", 0); if(!ma_address_init) gai_ma_address_init(); ndim = GA[ga_handle].ndim; for (i=0; i 1) { Integer ddim = ((dims[d]-1)/GA_MIN(chunk[d],dims[d]) + 1); pcut = (ddim -(blk[d]-1)*pe[d]) ; } else { pcut = (dims[d]-(blk[d]-1)*pe[d]) ; } for (nblock=i=p=0; (p= pcut) b = b-1; map[nblock] = i+1; if (chunk[d]>1) b *= GA_MIN(chunk[d],dims[d]); i += b; } pe[d] = GA_MIN(pe[d],nblock); map += pe[d]; } if(GAme==0&& DEBUG){ gai_print_subscript("pe ",(int)ndim, pe,"\n"); gai_print_subscript("blocks ",(int)ndim, blk,"\n"); printf("decomposition map\n"); for(d=0; d< ndim; d++){ printf("dim=%ld: ",(long)d); for (i=0;i GA[ga_handle].dims[i]) imax = GA[ga_handle].dims[i]; jtot += (imax-imin+1); } block_size *= jtot; } } } GAstat.numcre ++; GA[ga_handle].actv = 1; /* If only one node is being used and array is mirrored, * set proc list to world group */ if (pnga_cluster_nnodes() == 1 && GA[ga_handle].p_handle == 0) { GA[ga_handle].p_handle = pnga_pgroup_get_world(); } /* Set remaining paramters and determine memory size if regular data * distribution is being used */ if (GA[ga_handle].block_flag == 0) { /* set corner flag, if it has not already been set and set up message passing data */ if (GA[ga_handle].corner_flag == -1) { i = 1; } else { i = GA[ga_handle].corner_flag; } for( i = 0; i< ndim; i++){ GA[ga_handle].scale[i] = (double)GA[ga_handle].nblock[i] / (double)GA[ga_handle].dims[i]; } pnga_set_ghost_corner_flag(g_a, i); /*** determine which portion of the array I am supposed to hold ***/ if (p_handle == 0) { /* for mirrored arrays */ Integer me_local = (Integer)PGRP_LIST[p_handle].map_proc_list[GAme]; pnga_distribution(g_a, me_local, GA[ga_handle].lo, hi); } else { pnga_distribution(g_a, grp_me, GA[ga_handle].lo, hi); } if (GA[ga_handle].num_rstrctd == 0 || GA[ga_handle].has_data == 1) { for( i = 0, nelem=1; i< ndim; i++){ GA[ga_handle].chunk[i] = ((C_Integer)hi[i]-GA[ga_handle].lo[i]+1); nelem *= (hi[i]-(Integer)GA[ga_handle].lo[i]+1+2*width[i]); } } else { nelem = 0; } mem_size = nelem * GA[ga_handle].elemsize; } else { mem_size = block_size * GA[ga_handle].elemsize; } GA[ga_handle].id = INVALID_MA_HANDLE; GA[ga_handle].size = (C_Long)mem_size; /* if requested, enforce limits on memory consumption */ if(GA_memory_limited) GA_total_memory -= mem_size; /* check if everybody has enough memory left */ if(GA_memory_limited){ status = (GA_total_memory >= 0) ? 1 : 0; if (p_handle > 0) { pnga_pgroup_gop(p_handle,pnga_type_f2c(MT_F_INT), &status, 1, "*"); } else { pnga_gop(pnga_type_f2c(MT_F_INT), &status, 1, "*"); } }else status = 1; if (status) { status = !gai_getmem(GA[ga_handle].name, GA[ga_handle].ptr,mem_size, GA[ga_handle].type, &GA[ga_handle].id, p_handle); } else { GA[ga_handle].ptr[grp_me]=NULL; } if (GA[ga_handle].block_flag == 0) { /* Finish setting up information for ghost cell updates */ if (GA[ga_handle].ghosts == 1) { if (!pnga_set_ghost_info(g_a)) pnga_error("Could not allocate update information for ghost cells",0); } /* If array is mirrored, evaluate first and last indices */ /* ngai_get_first_last_indices(&g_a); */ } pnga_pgroup_sync(p_handle); if (status) { GAstat.curmem += (long)GA[ga_handle].size; GAstat.maxmem = (long)GA_MAX(GAstat.maxmem, GAstat.curmem); status = TRUE; } else { if(GA_memory_limited) GA_total_memory += mem_size; pnga_destroy(g_a); status = FALSE; } GA_POP_NAME; return status; } /** * Create an N-dimensional Global Array with ghost cells using an * irregular distribution on a user-specified process group. * This is the master routine. All other creation routines are derived * from this one. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_ghosts_irreg_config = pnga_create_ghosts_irreg_config #endif logical pnga_create_ghosts_irreg_config( Integer type, /* MA type */ Integer ndim, /* number of dimensions */ Integer *dims, /* array of dimensions */ Integer *width, /* width of boundary cells for each dimension */ char *array_name, /* array name */ Integer *map, /* decomposition map array */ Integer *nblock, /* number of blocks for each dimension in map */ Integer p_handle, /* processor list handle */ Integer *g_a) /* array handle (output) */ { logical status; Integer g_A; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous sync masking*/ pnga_pgroup_sync(p_handle); GA_PUSH_NAME("pnga_create_ghosts_irreg_config"); g_A = pnga_create_handle(); *g_a = g_A; pnga_set_data(g_A,ndim,dims,type); pnga_set_ghosts(g_A,width); pnga_set_array_name(g_A,array_name); pnga_set_irreg_distr(g_A,map,nblock); pnga_set_pgroup(g_A,p_handle); status = pnga_allocate(g_A); GA_POP_NAME; return status; } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_ghosts_irreg = pnga_create_ghosts_irreg #endif logical pnga_create_ghosts_irreg( Integer type, /* MA type */ Integer ndim, /* number of dimensions */ Integer dims[], /* array of dimensions */ Integer width[], /* width of boundary cells for each dimension */ char *array_name, /* array name */ Integer map[], /* decomposition map array */ Integer nblock[], /* number of blocks for each dimension in map */ Integer *g_a) /* array handle (output) */ { Integer p_handle = pnga_pgroup_get_default(); return pnga_create_ghosts_irreg_config(type, ndim, dims, width, array_name, map, nblock, p_handle, g_a); } /** Create an N-dimensional Global Array on user-specified process group. * Allow machine to choose location of array boundaries on individual * processors */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_config = pnga_create_config #endif logical pnga_create_config(Integer type, Integer ndim, Integer dims[], char* array_name, Integer *chunk, Integer p_handle, Integer *g_a) { logical status; Integer g_A; GA_PUSH_NAME("pnga_create_config"); g_A = pnga_create_handle(); *g_a = g_A; pnga_set_data(g_A,ndim,dims,type); pnga_set_array_name(g_A,array_name); pnga_set_chunk(g_A,chunk); pnga_set_pgroup(g_A,p_handle); status = pnga_allocate(g_A); GA_POP_NAME; return status; } /** Create an N-dimensional Global Array on default processor group. * Allow machine to choose location of array boundaries on individual * processors */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create = pnga_create #endif logical pnga_create(Integer type, Integer ndim, Integer dims[], char* array_name, Integer *chunk, Integer *g_a) { Integer p_handle = pnga_pgroup_get_default(); return pnga_create_config(type, ndim, dims, array_name, chunk, p_handle, g_a); } /*\ CREATE AN N-DIMENSIONAL GLOBAL ARRAY WITH GHOST CELLS * Allow machine to choose location of array boundaries on individual * processors. \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_ghosts_config = pnga_create_ghosts_config #endif logical pnga_create_ghosts_config(Integer type, Integer ndim, Integer dims[], Integer width[], char* array_name, Integer chunk[], Integer p_handle, Integer *g_a) { logical status; Integer g_A; GA_PUSH_NAME("nga_create_ghosts_config"); g_A = pnga_create_handle(); *g_a = g_A; pnga_set_data(g_A,ndim,dims,type); pnga_set_ghosts(g_A,width); pnga_set_array_name(g_A,array_name); pnga_set_chunk(g_A,chunk); pnga_set_pgroup(g_A,p_handle); status = pnga_allocate(g_A); GA_POP_NAME; return status; } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_ghosts = pnga_create_ghosts #endif logical pnga_create_ghosts(Integer type, Integer ndim, Integer dims[], Integer width[], char* array_name, Integer chunk[], Integer *g_a) { Integer p_handle = pnga_pgroup_get_default(); return pnga_create_ghosts_config(type, ndim, dims, width, array_name, chunk, p_handle, g_a); } /** * Create a Global Array with an irregular distribution and a user-specified * process group. The user can specify location of array boundaries on * individual processors. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_create_irreg_config = pnga_create_irreg_config #endif logical pnga_create_irreg_config( Integer type, /* MA type */ Integer ndim, /* number of dimensions */ Integer dims[], /* array of dimensions */ char *array_name, /* array name */ Integer map[], /* decomposition map array */ Integer nblock[], /* number of blocks for each dimension in map */ Integer p_handle, /* processor list hande */ Integer *g_a) /* array handle (output) */ { Integer d,width[MAXDIM]; logical status; for (d=0; d 0) { nproc = PGRP_LIST[grp_id].map_nproc; grp_me = PGRP_LIST[grp_id].map_proc_list[GAme]; } else nproc = GAnproc; /* need to enforce proper, natural allignment (on size boundary) */ switch (pnga_type_c2f(type)){ case MT_F_DBL: base = (char *) DBL_MB; break; case MT_F_INT: base = (char *) INT_MB; break; case MT_F_DCPL: base = (char *) DCPL_MB; break; case MT_F_SCPL: base = (char *) SCPL_MB; break; case MT_F_REAL: base = (char *) FLT_MB; break; default: base = (char*)0; } item_size = GAsizeofM(type); # ifdef GA_ELEM_PADDING bytes += (C_Long)item_size; # endif #endif *adj = 0; #ifdef PERMUTE_PIDS if(GA_Proc_list){ bzero(ptr_array,nproc*sizeof(char*)); /* use ARMCI_Malloc_group for groups if proc group is not world group or mirror group */ # ifdef MSG_COMMS_MPI if (grp_id > 0) status = ARMCI_Malloc_group((void**)ptr_array, bytes, &PGRP_LIST[grp_id].group); else # endif status = ARMCI_Malloc((void**)ptr_array, bytes); if(bytes!=0 && ptr_array[grp_me]==NULL) pnga_error("gai_get_shmem: ARMCI Malloc failed", GAme); for(i=0;i 0) { status = ARMCI_Malloc_group((void**)ptr_arr, (armci_size_t)bytes, &PGRP_LIST[grp_id].group); } else #endif status = ARMCI_Malloc((void**)ptr_arr, (armci_size_t)bytes); if(bytes!=0 && ptr_arr[grp_me]==NULL) pnga_error("gai_get_shmem: ARMCI Malloc failed", GAme); if(status) return status; #ifndef _CHECK_MA_ALGN /* adjust all addresses if they are not alligned on corresponding nodes*/ /* we need storage for GAnproc*sizeof(Integer) */ /* JAD -- fixed bug where _ga_map was reused before gai_getmem was done * with it. Now malloc/free needed memory. */ adjust = (Integer*)malloc(GAnproc*sizeof(Integer)); diff = (GA_ABS( base - (char *) ptr_arr[grp_me])) % item_size; for(i=0;i 0) ? item_size - diff : 0; *adj = adjust[grp_me]; if (grp_id > 0) pnga_pgroup_gop(grp_id, pnga_type_f2c(MT_F_INT), adjust, nproc, "+"); else pnga_gop(pnga_type_f2c(MT_F_INT), adjust, nproc, "+"); for(i=0;i 0) return ARMCI_Uses_shm_grp(&PGRP_LIST[grp_id].group); else #endif return ARMCI_Uses_shm(); } int gai_getmem(char* name, char **ptr_arr, C_Long bytes, int type, long *id, int grp_id) { #ifdef AVOID_MA_STORAGE return gai_get_shmem(ptr_arr, bytes, type, id, grp_id); #else Integer handle = INVALID_MA_HANDLE, index; Integer nproc=GAnproc, grp_me=GAme, item_size = GAsizeofM(type); C_Long nelem; char *ptr = (char*)0; if (grp_id > 0) { nproc = PGRP_LIST[grp_id].map_nproc; grp_me = PGRP_LIST[grp_id].map_proc_list[GAme]; } if(gai_uses_shm(grp_id)) return gai_get_shmem(ptr_arr, bytes, type, id, grp_id); else{ nelem = bytes/((C_Long)item_size) + 1; if(bytes) if(MA_alloc_get(type, nelem, name, &handle, &index)){ MA_get_pointer(handle, &ptr);} *id = (long)handle; /* printf("bytes=%d ptr=%ld index=%d\n",bytes, ptr,index); fflush(stdout); */ bzero((char*)ptr_arr,(int)nproc*sizeof(char*)); ptr_arr[grp_me] = ptr; # ifndef _CHECK_MA_ALGN /* align */ { long diff, adjust; diff = ((unsigned long)ptr_arr[grp_me]) % item_size; adjust = (diff > 0) ? item_size - diff : 0; ptr_arr[grp_me] = adjust + (char*)ptr_arr[grp_me]; } # endif # ifdef MSG_COMMS_MPI if (grp_id > 0) { armci_exchange_address_grp((void**)ptr_arr,(int)nproc, &PGRP_LIST[grp_id].group); } else # endif armci_exchange_address((void**)ptr_arr,(int)nproc); if(bytes && !ptr) return 1; else return 0; } #endif /* AVOID_MA_STORAGE */ } /*\ externalized version of gai_getmem to facilitate two-step array creation \*/ void *GA_Getmem(int type, int nelem, int grp_id) { char **ptr_arr=(char**)0; int rc,i; long id; int bytes; int extra=sizeof(getmem_t)+GAnproc*sizeof(char*); char *myptr; Integer status; type = pnga_type_f2c(type); bytes = nelem * GAsizeofM(type); if(GA_memory_limited){ GA_total_memory -= bytes+extra; status = (GA_total_memory >= 0) ? 1 : 0; pnga_gop(pnga_type_f2c(MT_F_INT), &status, 1, "*"); if(!status)GA_total_memory +=bytes+extra; }else status = 1; ptr_arr=(char**)_ga_map; /* need memory GAnproc*sizeof(char**) */ rc= gai_getmem("ga_getmem", ptr_arr,(Integer)bytes+extra, type, &id, grp_id); if(rc)pnga_error("ga_getmem: failed to allocate memory",bytes+extra); myptr = ptr_arr[GAme]; /* make sure that remote memory addresses point to user memory */ for(i=0; iid = id; ((getmem_t*)myptr)->type = type; ((getmem_t*)myptr)->size = bytes+extra; /* add ptr info */ memcpy(myptr+sizeof(getmem_t),ptr_arr,(size_t)GAnproc*sizeof(char**)); return (void*)(myptr+extra); } void GA_Freemem(void *ptr) { int extra = sizeof(getmem_t)+GAnproc*sizeof(char*); getmem_t *info = (getmem_t *)((char*)ptr - extra); char **ptr_arr = (char**)(info+1); #ifndef AVOID_MA_STORAGE if(ARMCI_Uses_shm()){ #endif /* make sure that we free original (before address alignment) pointer */ ARMCI_Free(ptr_arr[GAme] - info->id); #ifndef AVOID_MA_STORAGE }else{ if(info->id != INVALID_MA_HANDLE) MA_free_heap(info->id); } #endif if(GA_memory_limited) GA_total_memory += info->size; } /** * Return coordinates of a GA patch associated with processor proc */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_distribution = pnga_distribution #endif void pnga_distribution(Integer g_a, Integer proc, Integer *lo, Integer * hi) { Integer ga_handle, lproc; ga_check_handleM(g_a, "nga_distribution"); ga_handle = (GA_OFFSET + g_a); lproc = proc; if (GA[ga_handle].num_rstrctd > 0) { lproc = GA[ga_handle].rank_rstrctd[lproc]; } if (GA[ga_handle].block_flag == 0) { ga_ownsM(ga_handle, lproc, lo, hi); } else { C_Integer index[MAXDIM]; int ndim = GA[ga_handle].ndim; int i; gam_find_block_indices(ga_handle,lproc,index); for (i=0; i GA[ga_handle].dims[i]) hi[i] = GA[ga_handle].dims[i]; } } } /** * Check to see if array has ghost cells. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_has_ghosts = pnga_has_ghosts #endif logical pnga_has_ghosts(Integer g_a) { int h_a = (int)g_a + GA_OFFSET; return GA[h_a].ghosts; } /** * Return the dimension of a Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_ndim = pnga_ndim #endif Integer pnga_ndim(Integer g_a) { ga_check_handleM(g_a,"ga_ndim"); return GA[g_a +GA_OFFSET].ndim; } /** * Duplicate an existing global array * -- new array g_b will have properties of g_a * array_name - a character string [input] * g_a - Integer handle for reference array [input] * g_b - Integer handle for new array [output] \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_duplicate = pnga_duplicate #endif logical pnga_duplicate(Integer g_a, Integer *g_b, char* array_name) { char **save_ptr; C_Long mem_size, mem_size_proc; Integer i, ga_handle, status; int local_sync_begin,local_sync_end; Integer grp_id, grp_me=GAme; /* Integer grp_nproc=GAnproc; */ int maplen = calc_maplen(GA_OFFSET + g_a); local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ grp_id = pnga_get_pgroup(g_a); if(local_sync_begin)pnga_pgroup_sync(grp_id); if (grp_id > 0) { /* grp_nproc = PGRP_LIST[grp_id].map_nproc; */ grp_me = PGRP_LIST[grp_id].map_proc_list[GAme]; } GAstat.numcre ++; ga_check_handleM(g_a,"ga_duplicate"); /* find a free global_array handle for g_b */ ga_handle =-1; i=0; do{ if(!GA[i].actv_handle) ga_handle=i; i++; }while(i<_max_global_array && ga_handle==-1); if( ga_handle == -1) pnga_error("ga_duplicate: too many arrays", (Integer)_max_global_array); *g_b = (Integer)ga_handle - GA_OFFSET; GA[ga_handle].actv_handle = 1; gai_init_struct(ga_handle); /*** copy content of the data structure ***/ save_ptr = GA[ga_handle].ptr; GA[ga_handle] = GA[GA_OFFSET + g_a]; /* <--- shallow copy */ strcpy(GA[ga_handle].name, array_name); GA[ga_handle].ptr = save_ptr; if (maplen > 0) { GA[ga_handle].mapc = (C_Integer*)malloc((maplen+1)*sizeof(C_Integer*)); for(i=0;i 0) { GA[ga_handle].num_rstrctd = GA[GA_OFFSET + g_a].num_rstrctd; pnga_set_restricted(*g_b, GA[GA_OFFSET + g_a].rstrctd_list, GA[GA_OFFSET + g_a].num_rstrctd); } /*** Memory Allocation & Initialization of GA Addressing Space ***/ mem_size = mem_size_proc = GA[ga_handle].size; GA[ga_handle].id = INVALID_MA_HANDLE; /* if requested, enforce limits on memory consumption */ if(GA_memory_limited) GA_total_memory -= mem_size_proc; /* check if everybody has enough memory left */ if(GA_memory_limited){ status = (GA_total_memory >= 0) ? 1 : 0; if (grp_id > 0) { pnga_pgroup_gop(grp_id, pnga_type_f2c(MT_F_INT), &status, 1, "*"); status = (Integer)status; } else { pnga_gop(pnga_type_f2c(MT_F_INT), &status, 1, "*"); } }else status = 1; if(status) { status = !gai_getmem(array_name, GA[ga_handle].ptr,mem_size, (int)GA[ga_handle].type, &GA[ga_handle].id, (int)grp_id); } else{ GA[ga_handle].ptr[grp_me]=NULL; } if(local_sync_end)pnga_pgroup_sync(grp_id); # ifdef GA_CREATE_INDEF /* This code is incorrect. It needs to fixed if INDEF is ever used */ if(status){ Integer one = 1; Integer dim1 =(Integer)GA[ga_handle].dims[1], dim2=(Integer)GA[ga_handle].dims[2]; if(GAme==0)fprintf(stderr,"duplicate:initializing GA array%ld\n",g_b); if(GA[ga_handle].type == C_DBL) { double bad = (double) DBL_MAX; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_INT) { int bad = (int) INT_MAX; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_LONG) { long bad = LONG_MAX; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_LONGLONG) { long long bad = LONG_MAX; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_DCPL) { DoubleComplex bad = {DBL_MAX, DBL_MAX}; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_SCPL) { SingleComplex bad = {FLT_MAX, FLT_MAX}; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else if (GA[ga_handle].type == C_FLOAT) { float bad = FLT_MAX; ga_fill_patch_(g_b, &one, &dim1, &one, &dim2, &bad); } else { pnga_error("ga_duplicate: type not supported ",GA[ga_handle].type); } } # endif if(status){ GAstat.curmem += (long)GA[ga_handle].size; GAstat.maxmem = (long)GA_MAX(GAstat.maxmem, GAstat.curmem); return(TRUE); }else{ if (GA_memory_limited) GA_total_memory += mem_size_proc; pnga_destroy(*g_b); return(FALSE); } } /*\ DUPLICATE A GLOBAL ARRAY -- memory comes from user * -- new array g_b will have properties of g_a \*/ int GA_Assemble_duplicate(int g_a, char* array_name, void* ptr) { char **save_ptr; int i, ga_handle; int extra = sizeof(getmem_t)+GAnproc*sizeof(char*); getmem_t *info = (getmem_t *)((char*)ptr - extra); char **ptr_arr = (char**)(info+1); int g_b; int maplen = calc_maplen(GA_OFFSET + g_a); pnga_sync(); GAstat.numcre ++; ga_check_handleM(g_a,"ga_assemble_duplicate"); /* find a free global_array handle for g_b */ ga_handle =-1; i=0; do{ if(!GA[i].actv_handle) ga_handle=i; i++; }while(i<_max_global_array && ga_handle==-1); if( ga_handle == -1) pnga_error("ga_assemble_duplicate: too many arrays ", (Integer)_max_global_array); g_b = ga_handle - GA_OFFSET; gai_init_struct(ga_handle); GA[ga_handle].actv_handle = 1; /*** copy content of the data structure ***/ save_ptr = GA[ga_handle].ptr; GA[ga_handle] = GA[GA_OFFSET + g_a]; strcpy(GA[ga_handle].name, array_name); GA[ga_handle].ptr = save_ptr; if (maplen > 0) { GA[ga_handle].mapc = (C_Integer*)malloc((maplen+1)*sizeof(C_Integer*)); for(i=0;itype)); GA[ga_handle].type = pnga_type_f2c(info->type); GA[ga_handle].size = (C_Long)info->size; GA[ga_handle].id = info->id; memcpy(GA[ga_handle].ptr,ptr_arr,(size_t)GAnproc*sizeof(char**)); GAstat.curmem += (long)GA[ga_handle].size; GAstat.maxmem = (long)GA_MAX(GAstat.maxmem, GAstat.curmem); pnga_sync(); return(g_b); } /** * Destroy a Global Array and clean up memory */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_destroy = pnga_destroy #endif logical pnga_destroy(Integer g_a) { Integer ga_handle = GA_OFFSET + g_a, grp_id, grp_me=GAme; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ grp_id = (Integer)GA[ga_handle].p_handle; if(local_sync_begin)pnga_pgroup_sync(grp_id); if (grp_id > 0) grp_me = PGRP_LIST[grp_id].map_proc_list[GAme]; else grp_me=GAme; GAstat.numdes ++; /*regardless of array status we count this call */ /* fails if handle is out of range or array not active */ if(ga_handle < 0 || ga_handle >= _max_global_array){ return FALSE; } if(GA[ga_handle].actv==0){ return FALSE; } if (GA[ga_handle].cache) free(GA[ga_handle].cache); GA[ga_handle].cache = NULL; GA[ga_handle].actv = 0; GA[ga_handle].actv_handle = 0; if (GA[ga_handle].num_rstrctd > 0) { GA[ga_handle].num_rstrctd = 0; if (GA[ga_handle].rstrctd_list) free(GA[ga_handle].rstrctd_list); GA[ga_handle].rstrctd_list = NULL; if (GA[ga_handle].rank_rstrctd) free(GA[ga_handle].rank_rstrctd); GA[ga_handle].rank_rstrctd = NULL; } if(GA[ga_handle].mapc != NULL){ free(GA[ga_handle].mapc); GA[ga_handle].mapc = NULL; } if(GA[ga_handle].ptr[grp_me]==NULL){ return TRUE; } #ifndef AVOID_MA_STORAGE if(gai_uses_shm((int)grp_id)){ #endif /* make sure that we free original (before address allignment) pointer */ #ifdef MSG_COMMS_MPI if (grp_id > 0){ ARMCI_Free_group(GA[ga_handle].ptr[grp_me] - GA[ga_handle].id, &PGRP_LIST[grp_id].group); } else #endif ARMCI_Free(GA[ga_handle].ptr[GAme] - GA[ga_handle].id); #ifndef AVOID_MA_STORAGE }else{ if(GA[ga_handle].id != INVALID_MA_HANDLE) MA_free_heap(GA[ga_handle].id); } #endif if(GA_memory_limited) GA_total_memory += GA[ga_handle].size; GAstat.curmem -= GA[ga_handle].size; if(local_sync_end)pnga_pgroup_sync(grp_id); return(TRUE); } /** * Terminate Global Array structures * * All GA arrays are destroyed & shared memory is dealocated * GA routines (except for ga_initialize) should not be called thereafter */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_terminate = pnga_terminate #endif void pnga_terminate() { Integer i, handle; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(!GAinitialized) return; #ifdef PROFILE_OLD ga_profile_terminate(); #endif for (i=0;i<_max_global_array;i++){ handle = i - GA_OFFSET ; if(GA[i].actv) pnga_destroy(handle); if(GA[i].ptr) free(GA[i].ptr); if(GA[i].mapc) free(GA[i].mapc); } /* don't free groups list until all arrays destroyed */ for (i=0;i<_max_global_array;i++){ if(PGRP_LIST[i].actv) free(PGRP_LIST[i].map_proc_list); } pnga_sync(); GA_total_memory = -1; /* restore "unlimited" memory usage status */ GA_memory_limited = 0; gai_finalize_onesided(); free(GA_proclist); free(ProcListPerm); #ifdef PERMUTE_PIDS free(ptr_array); #endif free(mapALL); free(_ga_main_data_structure); free(_proc_list_main_data_structure); ARMCI_Free_local(GA_Update_Signal); pnga_sync(); ARMCI_Finalize(); ARMCIinitialized = 0; GAinitialized = 0; } /** * Is array active or inactive */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_verify_handle = pnga_verify_handle #endif Integer pnga_verify_handle(Integer g_a) { return (Integer) ((g_a + GA_OFFSET>= 0) && (g_a + GA_OFFSET< _max_global_array) && GA[GA_OFFSET + (g_a)].actv); } /** * Fill array with random values in [0,val) */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_randomize = pnga_randomize #endif void pnga_randomize(Integer g_a, void* val) { int i,handle=GA_OFFSET + (int)g_a; char *ptr; int local_sync_begin,local_sync_end; C_Long elems; Integer grp_id; Integer num_blocks; GA_PUSH_NAME("ga_randomize"); local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous sync masking*/ grp_id = pnga_get_pgroup(g_a); if(local_sync_begin)pnga_pgroup_sync(grp_id); ga_check_handleM(g_a, "ga_randomize"); gam_checktype(GA[handle].type); elems = GA[handle].size/((C_Long)GA[handle].elemsize); num_blocks = GA[handle].block_total; if (num_blocks < 0) { /* Bruce..Please CHECK if this is correct */ if (grp_id >= 0){ Integer grp_me = PGRP_LIST[GA[handle].p_handle].map_proc_list[GAme]; ptr = GA[handle].ptr[grp_me]; } else ptr = GA[handle].ptr[GAme]; switch (GA[handle].type){ /* case C_DCPL: for(i=0; i= 0){ Integer grp_me = PGRP_LIST[GA[handle].p_handle].map_proc_list[GAme]; ptr = GA[handle].ptr[grp_me]; } else ptr = GA[handle].ptr[GAme]; switch (GA[handle].type){ case C_DCPL: for(i=0; i= 0; i--) { ld *= block_grid[i]; *proc *= ld; *proc += index[i]; } *proc = *proc%pnga_nnodes(); } } #endif /*\ * RETURN HOW MANY PROCESSORS/OWNERS THERE ARE FOR THE SPECIFIED PATCH OF A * GLOBAL ARRAY \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_locate_nnodes = pnga_locate_nnodes #endif logical pnga_locate_nnodes( Integer g_a, Integer *lo, Integer *hi, Integer *np) /* g_a [input] global array handle lo [input] lower indices of patch in global array hi [input] upper indices of patch in global array np [output] total number of processors containing a portion of the patch For a block cyclic data distribution, this function returns a list of blocks that cover the region along with the lower and upper indices of each block. */ { int procT[MAXDIM], procB[MAXDIM], proc_subscript[MAXDIM]; Integer proc, i, ga_handle; Integer d, dpos, ndim, elems, use_blocks; /* Integer p_handle; */ ga_check_handleM(g_a, "nga_locate_nnodes"); ga_handle = GA_OFFSET + g_a; #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0; d< GA[ga_handle].ndim; d++) if((lo[d]<1 || hi[d]>GA[ga_handle].dims[d]) ||(lo[d]>hi[d]))return FALSE; ndim = GA[ga_handle].ndim; use_blocks = GA[ga_handle].block_flag; if (!use_blocks) { /* find "processor coordinates" for the top left corner and store them * in ProcT */ #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0, dpos = 0; d< GA[ga_handle].ndim; d++){ findblock(GA[ga_handle].mapc + dpos, GA[ga_handle].nblock[d], GA[ga_handle].scale[d], lo[d], &procT[d]); dpos += GA[ga_handle].nblock[d]; } /* find "processor coordinates" for the right bottom corner and store * them in procB */ #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0, dpos = 0; d< GA[ga_handle].ndim; d++){ findblock(GA[ga_handle].mapc + dpos, GA[ga_handle].nblock[d], GA[ga_handle].scale[d], hi[d], &procB[d]); dpos += GA[ga_handle].nblock[d]; } *np = 0; /* Find total number of processors containing data and return the * result in elems. Also find the lowest "processor coordinates" of the * processor block containing data and return these in proc_subscript. */ ga_InitLoopM(&elems, ndim, proc_subscript, procT,procB,GA[ga_handle].nblock); /* p_handle = (Integer)GA[ga_handle].p_handle; */ for(i= 0; i< elems; i++){ Integer _lo[MAXDIM], _hi[MAXDIM]; /* convert i to owner processor id using the current values in proc_subscript */ ga_ComputeIndexM(&proc, ndim, proc_subscript, GA[ga_handle].nblock); /* get range of global array indices that are owned by owner */ ga_ownsM(ga_handle, proc, _lo, _hi); /* Update to proc_subscript so that it corresponds to the next * processor in the block of processors containing the patch */ ga_UpdateSubscriptM(ndim,proc_subscript,procT,procB,GA[ga_handle].nblock); (*np)++; } } else { Integer nblocks = GA[ga_handle].block_total; Integer chk, j, tlo[MAXDIM], thi[MAXDIM], cnt; cnt = 0; for (i=0; i= lo[j] && tlo[j] <= hi[j]) || (thi[j] >= lo[j] && thi[j] <= hi[j]))) { chk = 0; } } /* store blocks that overlap request region in proclist */ if (chk) { cnt++; } } *np = cnt; } return(TRUE); } #ifdef __crayx1 #pragma _CRI inline nga_locate_nnodes_ #endif /** * Locate individual patches and their owner of specified patch of a * Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_locate_region = pnga_locate_region #endif logical pnga_locate_region( Integer g_a, Integer *lo, Integer *hi, Integer *map, Integer *proclist, Integer *np) /* g_a [input] global array handle lo [input] lower indices of patch in global array hi [input] upper indices of patch in global array map [output] list of lower and upper indices for portion of patch that exists on each processor containing a portion of the patch. The map is constructed so that for a D dimensional global array, the first D elements are the lower indices on the first processor in proclist, the next D elements are the upper indices of the first processor in proclist, the next D elements are the lower indices for the second processor in proclist, and so on. proclist [output] list of processors containing some portion of the patch np [output] total number of processors containing a portion of the patch For a block cyclic data distribution, this function returns a list of blocks that cover the region along with the lower and upper indices of each block. */ { int procT[MAXDIM], procB[MAXDIM], proc_subscript[MAXDIM]; Integer proc, owner, i, ga_handle; Integer d, dpos, ndim, elems, use_blocks; /* Integer p_handle; */ ga_check_handleM(g_a, "nga_locate_region"); ga_handle = GA_OFFSET + g_a; #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0; d< GA[ga_handle].ndim; d++) if((lo[d]<1 || hi[d]>GA[ga_handle].dims[d]) ||(lo[d]>hi[d]))return FALSE; ndim = GA[ga_handle].ndim; use_blocks = GA[ga_handle].block_flag; if (!use_blocks) { /* find "processor coordinates" for the top left corner and store them * in ProcT */ #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0, dpos = 0; d< GA[ga_handle].ndim; d++){ findblock(GA[ga_handle].mapc + dpos, GA[ga_handle].nblock[d], GA[ga_handle].scale[d], lo[d], &procT[d]); dpos += GA[ga_handle].nblock[d]; } /* find "processor coordinates" for the right bottom corner and store * them in procB */ #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0, dpos = 0; d< GA[ga_handle].ndim; d++){ findblock(GA[ga_handle].mapc + dpos, GA[ga_handle].nblock[d], GA[ga_handle].scale[d], hi[d], &procB[d]); dpos += GA[ga_handle].nblock[d]; } *np = 0; /* Find total number of processors containing data and return the * result in elems. Also find the lowest "processor coordinates" of the * processor block containing data and return these in proc_subscript. */ ga_InitLoopM(&elems, ndim, proc_subscript, procT,procB,GA[ga_handle].nblock); /* p_handle = (Integer)GA[ga_handle].p_handle; */ for(i= 0; i< elems; i++){ Integer _lo[MAXDIM], _hi[MAXDIM]; Integer offset; /* convert i to owner processor id using the current values in proc_subscript */ ga_ComputeIndexM(&proc, ndim, proc_subscript, GA[ga_handle].nblock); /* get range of global array indices that are owned by owner */ ga_ownsM(ga_handle, proc, _lo, _hi); offset = *np *(ndim*2); /* location in map to put patch range */ #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0; d< ndim; d++) map[d + offset ] = lo[d] < _lo[d] ? _lo[d] : lo[d]; #ifdef __crayx1 #pragma _CRI novector #endif for(d = 0; d< ndim; d++) map[ndim + d + offset ] = hi[d] > _hi[d] ? _hi[d] : hi[d]; owner = proc; if (GA[ga_handle].num_rstrctd == 0) { proclist[i] = owner; } else { proclist[i] = GA[ga_handle].rstrctd_list[owner]; } /* Update to proc_subscript so that it corresponds to the next * processor in the block of processors containing the patch */ ga_UpdateSubscriptM(ndim,proc_subscript,procT,procB,GA[ga_handle].nblock); (*np)++; } } else { Integer nblocks = GA[ga_handle].block_total; Integer chk, j, tlo[MAXDIM], thi[MAXDIM], cnt; Integer offset; cnt = 0; for (i=0; i= lo[j] && tlo[j] <= hi[j]) || (thi[j] >= lo[j] && thi[j] <= hi[j]))) { chk = 0; } } /* store blocks that overlap request region in proclist */ if (chk) { proclist[cnt] = i; cnt++; } } *np = cnt; /* fill map array with block coordinates */ for (i=0; i thi[j] ? thi[j] : hi[j]; } } } return(TRUE); } #ifdef __crayx1 #pragma _CRI inline pnga_locate_region #endif /** * Returns the processor grid for the global array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nblock = pnga_nblock #endif void pnga_nblock(Integer g_a, Integer *nblock) { Integer ga_handle = GA_OFFSET + g_a; int i, n; ga_check_handleM(g_a, "ga_nblock"); n = GA[ga_handle].ndim; for(i=0; i 0) { return (Integer)PGRP_LIST[GA_Default_Proc_Group].map_proc_list[GAme]; } else { return ((Integer)GAme); } } /** * Return ID of calling process in group grp */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_nodeid = pnga_pgroup_nodeid #endif Integer pnga_pgroup_nodeid(Integer grp) { if (grp >= 0) { return (Integer)PGRP_LIST[(int)grp].map_proc_list[GAme]; } else { return GAme; } } /** * Return number of nodes in default group */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_nnodes = pnga_nnodes #endif Integer pnga_nnodes() { if (GA_Default_Proc_Group > 0) { return (Integer)PGRP_LIST[GA_Default_Proc_Group].map_nproc; } else { return ((Integer)GAnproc); } } /** * Return number of nodes in group grp */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_pgroup_nnodes = pnga_pgroup_nnodes #endif Integer pnga_pgroup_nnodes(Integer grp) { if(grp >=0 ) return (Integer)PGRP_LIST[(int)grp].map_nproc; else return ((Integer)GAnproc); } /** * Compare distributions of two global arrays */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_compare_distr = pnga_compare_distr #endif logical pnga_compare_distr(Integer g_a, Integer g_b) { int h_a =(int)g_a + GA_OFFSET; int h_b =(int)g_b + GA_OFFSET; int h_a_maplen = calc_maplen(h_a); int h_b_maplen = calc_maplen(h_b); int i; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ GA_PUSH_NAME("ga_compare_distr"); ga_check_handleM(g_a, "distribution a"); ga_check_handleM(g_b, "distribution b"); GA_POP_NAME; if(GA[h_a].ndim != GA[h_b].ndim) return FALSE; for(i=0; i 0) { for (i=0; i MAX_MUTEXES) return(FALSE); if(num_mutexes) pnga_error("mutexes already created",num_mutexes); num_mutexes= (int)num; if(GAnproc == 1){ return(TRUE); } chunk_mutex = (int)((num + GAnproc-1)/GAnproc); if(GAme * chunk_mutex >= num)myshare =0; else myshare=chunk_mutex; /* need work here to use permutation */ if(ARMCI_Create_mutexes(myshare)){ return FALSE; } return TRUE; } /** * Lock an object defined by the mutex number */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_lock = pnga_lock #endif void pnga_lock(Integer mutex) { int m,p; if(GAnproc == 1) return; if(num_mutexes< mutex)pnga_error("invalid mutex",mutex); p = num_mutexes/chunk_mutex -1; m = num_mutexes%chunk_mutex; #ifdef PERMUTE_PIDS if(GA_Proc_list) p = GA_inv_Proc_list[p]; #endif ARMCI_Lock(m,p); } /** * Unlock a mutex */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_unlock = pnga_unlock #endif void pnga_unlock(Integer mutex) { int m,p; if(GAnproc == 1) return; if(num_mutexes< mutex)pnga_error("invalid mutex",mutex); p = num_mutexes/chunk_mutex -1; m = num_mutexes%chunk_mutex; #ifdef PERMUTE_PIDS if(GA_Proc_list) p = GA_inv_Proc_list[p]; #endif ARMCI_Unlock(m,p); } /** * Destroy mutexes */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_destroy_mutexes = pnga_destroy_mutexes #endif logical pnga_destroy_mutexes() { _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(num_mutexes<1) pnga_error("mutexes destroyed",0); num_mutexes= 0; if(GAnproc == 1){ return TRUE; } if(ARMCI_Destroy_mutexes()){ return FALSE; } return TRUE; } /** * Return a list that maps GA process IDs to message-passing process IDs */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_list_nodeid = pnga_list_nodeid #endif void pnga_list_nodeid(Integer *list, Integer num_procs) { Integer proc; for( proc = 0; proc < num_procs; proc++) #ifdef PERMUTE_PIDS if(GA_Proc_list) list[proc] = GA_inv_Proc_list[proc]; else #endif list[proc]=proc; } /** * Returns true/false depending on validity of the handle */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_valid_handle = pnga_valid_handle #endif logical pnga_valid_handle(Integer g_a) { if(GA_OFFSET+ (g_a) < 0 || GA_OFFSET+(g_a) >= _max_global_array || ! (GA[GA_OFFSET+(g_a)].actv) ) return FALSE; else return TRUE; } /** * A function that helps users avoid syncs inside a collective call * that they think are unnecessary * * Mask flags have to be reset in every collective call. Even if that * collective call doesnt do any sync at all. * If masking only the beginning sync is possible, make sure to * clear even the _sync_end mask to avoid a mask intended for this * collective_function_call to be carried to next collective_function_call * or to a collective function called by this function. * Similarly, make sure to use two copy mask values to local variables * and reset the global mask variables to avoid carring the mask to a * collective call inside the current collective call. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_mask_sync = pnga_mask_sync #endif void pnga_mask_sync(Integer begin, Integer end) { if (begin) _ga_sync_begin = 1; else _ga_sync_begin = 0; if (end) _ga_sync_end = 1; else _ga_sync_end = 0; } /** * Merge all copies of a mirrored array by adding them together */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_merge_mirrored = pnga_merge_mirrored #endif void pnga_merge_mirrored(Integer g_a) { Integer handle = GA_OFFSET + g_a; Integer inode, nprocs, nnodes, zero, zproc, nblocks; int *blocks; C_Integer *map, *dims, *width; Integer i, j, index[MAXDIM], itmp, ndim; Integer nelem, count, type, atype=ARMCI_INT; char *zptr=NULL, *bptr=NULL, *nptr=NULL; Integer bytes, total; int local_sync_begin, local_sync_end; long bigint; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end = 1; /*remove any previous masking */ if (local_sync_begin) pnga_sync(); /* don't perform update if node is not mirrored */ if (!pnga_is_mirrored(g_a)) return; GA_PUSH_NAME("ga_merge_mirrored"); inode = pnga_cluster_nodeid(); nnodes = pnga_cluster_nnodes(); nprocs = pnga_cluster_nprocs(inode); zero = 0; zproc = pnga_cluster_procid(inode, zero); zptr = GA[handle].ptr[zproc]; map = GA[handle].mapc; blocks = GA[handle].nblock; dims = GA[handle].dims; width = GA[handle].width; type = GA[handle].type; ndim = GA[handle].ndim; bigint = 2147483647L/GAsizeof(type); /* Check whether or not all nodes contain the same number of processors. */ if (nnodes*nprocs == pnga_nnodes()) { /* check to see if there is any buffer space between the data associated with each processor that needs to be zeroed out before performing the merge */ if (zproc == GAme) { /* the use of nblocks instead of nprocs is designed to support a peculiar coding style in which the dimensions of the block array are all set to 1 and all the data is restricted to the master processor on the node */ nblocks = 1; for (i=0; i total) len=((long)(total - istart)) + 1; /* printf("%ld step %d of %d len= %d total=%ld istart= %ld\n",GAme,(i+1),nsteps,len,total,istart); */ armci_msg_gop_scope(SCOPE_MASTERS, zptr+istart*GAsizeof(type), len, "+", atype); istart+=len; } } } } else { Integer _ga_tmp; Integer lo[MAXDIM], hi[MAXDIM], ld[MAXDIM]; Integer idims[MAXDIM], iwidth[MAXDIM], ichunk[MAXDIM]; int chk = 1; void *ptr_a; void *one = NULL; double d_one = 1.0; int i_one = 1; float f_one = 1.0; long l_one = 1; double c_one[2]; float cf_one[2]; c_one[0] = 1.0; c_one[1] = 0.0; cf_one[0] = 1.0; cf_one[1] = 0.0; /* choose one as scaling factor in accumulate */ switch (type) { case C_FLOAT: one = &f_one; break; case C_DBL: one = &d_one; break; case C_LONG: one = &l_one; break; case C_INT: one = &i_one; break; case C_DCPL: one = &c_one; break; case C_SCPL: one = &cf_one; break; default: pnga_error("type not supported",type); } /* Nodes contain a mixed number of processors. Create a temporary GA to complete merge operation. */ count = 0; for (i=0; i 1) { pnga_error("Handle to a non-mirrored array passed",0); } else { trans[0] = 'N'; trans[1] = '\0'; pnga_copy_patch(trans, g_a, alo, ahi, g_b, blo, bhi); return; } } if (pnga_is_mirrored(g_b) && pnga_cluster_nnodes()) pnga_error("Distributed array is mirrored",0); adim = GA[a_handle].ndim; bdim = GA[b_handle].ndim; p_handle = GA[a_handle].p_handle; if (adim != bdim) pnga_error("Global arrays must have same dimension",0); type = GA[a_handle].type; if (type != GA[b_handle].type) pnga_error("Global arrays must be of same type",0); for (i=0; i= idim || ahi[i] < 0 || ahi[i] >= idim || alo[i] > ahi[i]) pnga_error("Invalid patch index on mirrored GA",0); } for (i=0; i= idim || bhi[i] < 0 || bhi[i] >= idim || blo[i] > bhi[i]) pnga_error("Invalid patch index on distributed GA",0); } for (i=0; i ahi[i]) intersect = 0; } if (intersect) { /* get portion of mirrored array patch that actually resides on this processor */ for (i=0; iGA[ga_handle].dims[d]) ||(lo[d]>hi[d])) pnga_error("Requested region out of bounds",0); if (GA[ga_handle].block_flag) { Integer nblocks = GA[ga_handle].block_total; Integer chk, i, j, tlo[MAXDIM], thi[MAXDIM]; cnt = 0; for (i=0; i= lo[j] && tlo[j] <= hi[j]) || (thi[j] >= lo[j] && thi[j] <= hi[j]))) { chk = 0; } } if (chk) { cnt++; } } ret = cnt; } GA_POP_NAME; return ret; } /** * Return the total number of blocks in a Global Array (if any). Only returns * non-zero values for block-cyclic data distributions. */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_total_blocks = pnga_total_blocks #endif Integer pnga_total_blocks(Integer g_a) { Integer ga_handle = GA_OFFSET + g_a; return GA[ga_handle].block_total; } /** * Return true if GA uses SCALPACK data distribution */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_uses_proc_grid = pnga_uses_proc_grid #endif logical pnga_uses_proc_grid(Integer g_a) { Integer ga_handle = GA_OFFSET + g_a; return (logical)GA[ga_handle].block_sl_flag; } /** * Return the index of a processor based on the block partition associated * with a particular Global Array (assuming GA uses a ScalLAPACK data * distribution) */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_proc_index = pnga_get_proc_index #endif void pnga_get_proc_index(Integer g_a, Integer iproc, Integer *index) { Integer ga_handle = GA_OFFSET + g_a; if (!GA[ga_handle].block_sl_flag) pnga_error("Global array does not use ScaLAPACK data distribution",0); gam_find_proc_indices(ga_handle, iproc, index); return; } /** * Return proc grid dimension and block dimension for a particular * Global Array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_block_info = pnga_get_block_info #endif void pnga_get_block_info(Integer g_a, Integer *num_blocks, Integer *block_dims) { Integer ga_handle = GA_OFFSET + g_a; Integer i, ndim; ndim = GA[ga_handle].ndim; if (GA[ga_handle].block_sl_flag) { for (i=0; i 0) { if (dim%bsize == 0) { num_blocks[i] = dim/bsize; } else { num_blocks[i] = dim/bsize+1; } } else { num_blocks[i] = 0; } block_dims[i] = GA[ga_handle].block_dims[i]; } } return; } /** * Set the value of internal debug flag */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_set_debug = pnga_set_debug #endif void pnga_set_debug(logical flag) { GA_Debug_flag = (Integer)(flag); } /** * Get current value of internal debug flag */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_get_debug = pnga_get_debug #endif logical pnga_get_debug() { return (logical)GA_Debug_flag; } #ifdef ENABLE_CHECKPOINT void ga_checkpoint_arrays(Integer *gas,int num) { int ga = *(gas+0); int hdl = GA_OFFSET + ga; printf("\n%d:in checkpoint %d %d %d\n",GAme,ga,*(gas+1),*num);fflush(stdout); if(GA[hdl].record_id==0) ga_icheckpoint_init(gas,num); ga_icheckpoint(gas,num); } int ga_recover_arrays(Integer *gas, int num) { int i; for(i=0;i0 following calls ! <0 only deletes factorized g_s integer g_a ! matrix to diagonalize integer g_s ! metric integer g_v ! global matrix to return evecs double precision eval(*) ! local array to return evals c c c solve the generalized eigen-value problem returning c all eigen-vectors and values in ascending order c c the input matrices are not destroyed c c proc - # of processors c pans - panel size in columns c n - problem size c c j. nieplocha 02.08.94 c c c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c integer iproc, pan, istart, iend, k, n, npan, proc, myproc integer mypanel, myelem, mycol, elemz, ipan, ik, info logical status, first_time integer g_ps, eig_flag, thr_seq save g_ps, first_time c integer hma, adrma !mapa integer hmb, adrmb !mapb integer hmz, adrmz !mapz integer ga_diag_type c integer ha, adra !a integer hb, adrb !b integer hz, adrz !z c integer isize, rsize, ptr_size integer his, adris integer hsc, adrsc integer hip, adrip c double precision drand external pdspgv, drand intrinsic mod c logical oactive ! true iff this process participates integer dimA1, dimA2, typeA integer dimS1, dimS2, typeS integer dimV1, dimV2, typeV c integer hls, adrls ! list of TCG nodes c c integer Elem Elem(istart,iend,n)=((iend-istart+1)*(2*n-istart-iend+2))/2 data first_time /.true./ data thr_seq /64/ !min problem size to be run in parallel c~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c*** check the environment c myproc = ga_nodeid() proc = ga_nnodes() c c*** check GA handles, types and dimensions c call ga_check_handle(g_a, 'gai_diag: a') call ga_check_handle(g_s, 'gai_diag: s') call ga_check_handle(g_v, 'gai_diag: v') c c... unless it is the first call, check if g_s has not changed c if(first_time)then g_ps = g_s else if(g_ps .ne. g_s) $ call ga_error('gai_diag:attempt to reuse invalid data ',g_ps) endif c call ga_inquire(g_a, typeA, dimA1, dimA2) call ga_inquire(g_s, typeS, dimS1, dimS2) call ga_inquire(g_v, typeV, dimV1, dimV2) c c... verify if the dimensions match c if (dimA1 .ne. dimA2) then call ga_error(' gai_diag: can only diag square matrix ', 1) else if (dimS1 .ne. dimS2) then call ga_error(' gai_diag: can only diag square matrix ', 2) else if (dimV1 .ne. dimV2) then call ga_error(' gai_diag: can only diag square matrix ', 3) else if(dimA1.ne.dimS1 .or. dimS1 .ne. dimV1)then call ga_error(' gai_diag: A, S, V dimension mismatch ', 4) endif c c*** for smallest problems use sequential eigensolver c n = dimA1 if (n .lt. thr_seq) then call ga_diag_seq(g_a, g_s, g_v, eval) return endif c call ga_sync() c c*** test the reuse value and take the proper action c if((reuse .ne. 0) .and. first_time) $ call ga_error(' gai_diag: cannot reuse uninitialized data',reuse) c c... detect repeated "first-time" calls -- they are allowed if c... storage allocated for B is deallocated first c if((reuse .eq. 0) .and. .not. first_time) $ call ga_error(' gai_diag_reuse: repeated call, memory problem',0) c c... case for < 0 is just a cleanup of storage for B c if(reuse .lt. 0) then if(.not. first_time) then if (.not. ma_free_heap(hb)) $ call ga_error('ga_reuse: ma_free hb', 0) if (.not. ma_free_heap(hmb)) $ call ga_error('ga_reuse: ma_free hmb', 0) first_time = .true. endif return endif c c... set the flag for George eigensolver (orthogonal to reuse) c if(reuse.eq.0) then eig_flag = 1 else eig_flag = 0 endif c c*** for smaller problems use fewer processors (performance reasons) c pan = 1 !panel size npan = n/pan c proc = min( ga_nnodes(), n/30) c oactive = myproc .lt. proc if (oactive) then c c*** allocate storage for map arrays: A & Z from stack and B from heap c status = ma_push_get(mt_int,n,'mapa',hma,adrma) if(.not.status)call ga_error('gai_diag: mapa not allocated ',0) if(first_time)status = ma_alloc_get(mt_int,n,'mapb',hmb,adrmb) if(.not.status)call ga_error('gai_diag: mapb not allocated ',0) status = ma_push_get(mt_int,n,'mapz',hmz,adrmz) if(.not.status)call ga_error('gai_diag: mapc not allocated ',0) c c allocate and setup list of TCG nodes if( .not. ma_push_get(mt_int, proc,'list',hls,adrls)) $ call ga_error('gai_diag_std: insufficient memory 1b', n) call ga_list_nodeid(int_mb(adrls), proc) c c c*** determine distribution of a,b, and z c mypanel = 0 ! number of panels at given processor mycol = 0 ! number of columns at given processor myelem = 0 ! number of elements at given processor c c... allocate first half of the panels - forwards c do ipan = 1, npan/2 iproc = mod(ipan -1, proc) istart = (ipan - 1)*pan + 1 iend = istart + pan - 1 do k = istart, iend int_mb(-1+adrma+k) = int_mb(adrls+iproc) if(first_time)int_mb(-1+adrmb+k) = int_mb(adrls+iproc) int_mb(-1+adrmz+k) = int_mb(adrls+iproc) enddo if(iproc .eq. myproc)then myelem = myelem + elem(istart,iend,n) mypanel = mypanel+1 endif enddo c c... allocate second half of the panels - backwards c ik = 1 !ik is used to forward number processors do ipan = npan-1, npan/2 +1 , -1 ik = ik+1 iproc = mod(ik -1, proc) istart = (ipan - 1)*pan + 1 iend = istart + pan - 1 do k = istart, iend int_mb(-1+adrma+k) = int_mb(adrls+iproc) if(first_time)int_mb(-1+adrmb+k) = int_mb(adrls+iproc) int_mb(-1+adrmz+k) = int_mb(adrls+iproc) enddo if(iproc .eq. myproc)then myelem = myelem + elem(istart,iend,n) mypanel = mypanel+1 endif enddo c c... actually, there is one more panel left for the mismatch c iproc = 0 !processor 0 gets the mismatch panel istart = (npan - 1)*pan + 1 iend = n do k = istart, iend int_mb(-1+adrma+k) = int_mb(adrls+iproc) if(first_time)int_mb(-1+adrmb+k) = int_mb(adrls+iproc) int_mb(-1+adrmz+k) = int_mb(adrls+iproc) enddo mycol = mypanel * pan if(iproc .eq. myproc)then myelem = myelem + elem(istart,iend,n) mycol = mycol + iend - istart + 1 endif elemz = mycol * n c c*** allocate arrays: A & Z from stack and B from heap c status = ma_push_get(mt_dbl,myelem,'a',ha,adra) if(.not. status)call ga_error('gai_diag: a not allocated ',0) if(first_time)status = ma_alloc_get(mt_dbl,myelem,'b',hb,adrb) if(.not. status)call ga_error('gai_diag: b not allocated ',0) status = ma_push_get(mt_dbl,elemz,'z',hz,adrz) if(.not. status)call ga_error('gai_diag: c not allocated ',0) c c*** load A and S matrices c istart = 0 do k = 1, n if( int_mb(-1+adrma+k) .eq. int_mb(adrls + myproc))then myelem = n-k+1 call ga_get(g_a,k,n,k,k,dbl_mb(adra+istart),1) if(first_time) % call ga_get(g_s,k,n,k,k,dbl_mb(adrb+istart),1) istart = istart + myelem endif enddo c c*** allocate some scratch memory for eigensolver c * * temporary patch following george reccomendation to use 6n * status = ma_push_get(mt_int,6*n,'iscratch',his,adris) if (.not. status) call ga_error('ga_reuse: 6*n', 6*n) call fmemreq(0,n,int_mb(adrma),int_mb(adrmb),int_mb(adrmz), & isize, rsize, ptr_size,int_mb(adris)) status = ma_pop_stack(his) if (.not. status) call ga_error('ga_reuse: ma pop his', 0) if(.not. ma_push_get(mt_int,isize,'iscratch',his,adris)) & call ga_error('eig allocator',1) if(.not. ma_push_get(mt_dbl,rsize,'scratch',hsc,adrsc)) & call ga_error('eig allocator',2) if(.not. ma_push_get(mt_dbl,ptr_size,'iptr',hip,adrip)) & call ga_error('eig allocator',3) c endif c c call ga_sync() ! To reduce message buffering problems c c*** calling PEIGS parallel eigensolver c if (oactive) then call pdspgv( eig_flag, n, dbl_mb(adra), int_mb(adrma), & dbl_mb(adrb), int_mb(adrmb), & dbl_mb(adrz), int_mb(adrmz), & eval, & int_mb(adris), isize, & dbl_mb(adrip), ptr_size, & dbl_mb(adrsc), rsize, info) if (info .ne. 0) $ call ga_error('gai_diag: info non-zero ', info) endif c call ga_sync() ! To reduce message buffering problems c c*** store the eigenvector matrix in global array g_v c if (oactive) then istart = 0 do k = 1, n if( int_mb(-1+adrmz+k) .eq. int_mb(adrls + myproc))then call ga_put(g_v,1,n,k,k,dbl_mb(adrz+istart),1) istart = istart + n endif enddo c c*** deallocate storage for temporary arrays c status = .true. status = status .and. ma_pop_stack(hip) status = status .and. ma_pop_stack(hsc) status = status .and. ma_pop_stack(his) status = status .and. ma_pop_stack(hz) status = status .and. ma_pop_stack(ha) status = status .and. ma_pop_stack(hls) status = status .and. ma_pop_stack(hmz) status = status .and. ma_pop_stack(hma) if (.not. status) call ga_error('ga_reuse: ma_pop?', 0) endif c c c*** Make sure that even processes that did not participate in the c*** diagonalization have the eigen vectors c ga_diag_type = 32760 - 30 call ga_brdcst(ga_diag_type, eval, $ ma_sizeof(MT_DBL,n,MT_BYTE), 0) c if(reuse.eq.0) first_time = .false. c call ga_sync() end ga-5-4/global/src/base.h0000644000175000017500000005312512662210457013155 0ustar mbamba/*$Id: base.h,v 1.40.2.4 2007/12/18 18:41:27 d3g293 Exp $ */ #include "armci.h" #include "gaconfig.h" #include "typesf2c.h" extern int _max_global_array; extern Integer *_ga_map; extern Integer GAme, GAnproc; extern Integer *GA_proclist; extern int GA_Default_Proc_Group; extern int* GA_Proc_list; extern int* GA_inv_Proc_list; extern int** GA_Update_Flags; extern int* GA_Update_Signal; extern short int _ga_irreg_flag; extern Integer GA_Debug_flag; extern int *ProcListPerm; /*permuted list of processes */ #define FNAM 31 /* length of array names */ #define CACHE_SIZE 512 /* size of the cache inside GA DS*/ #ifdef __crayx1 #define __CRAYX1_PRAGMA _Pragma #else #define __CRAYX1_PRAGMA(_pragf) #endif typedef int ARMCI_Datatype; typedef struct { int mirrored; int map_nproc; int actv; int parent; int *map_proc_list; int *inv_map_proc_list; #ifdef MSG_COMMS_MPI ARMCI_Group group; #endif } proc_list_t; typedef Integer C_Integer; typedef armci_size_t C_Long; typedef struct { short int ndim; /* number of dimensions */ short int irreg; /* 0-regular; 1-irregular distribution */ int type; /* data type in array */ int actv; /* activity status, GA is allocated */ int actv_handle; /* handle is created */ C_Long size; /* size of local data in bytes */ int elemsize; /* sizeof(datatype) */ int ghosts; /* flag indicating presence of ghosts */ long lock; /* lock */ long id; /* ID of shmem region / MA handle */ C_Integer dims[MAXDIM]; /* global array dimensions */ C_Integer chunk[MAXDIM]; /* chunking */ int nblock[MAXDIM]; /* number of blocks per dimension */ C_Integer width[MAXDIM]; /* boundary cells per dimension */ C_Integer first[MAXDIM]; /* (Mirrored only) first local element */ C_Integer last[MAXDIM]; /* (Mirrored only) last local element */ C_Long shm_length; /* (Mirrored only) local shmem length */ C_Integer lo[MAXDIM]; /* top/left corner in local patch */ double scale[MAXDIM]; /* nblock/dim (precomputed) */ char **ptr; /* arrays of pointers to remote data */ C_Integer *mapc; /* block distribution map */ char name[FNAM+1]; /* array name */ int p_handle; /* pointer to processor list for array */ double *cache; /* store for frequently accessed ptrs */ int corner_flag; /* flag for updating corner ghost cells */ int block_flag; /* flag to indicate block-cyclic data */ int block_sl_flag; /* flag to indicate block-cyclic data */ /* using ScaLAPACK format */ C_Integer block_dims[MAXDIM];/* array of block dimensions */ C_Integer num_blocks[MAXDIM];/* number of blocks in each dimension */ C_Integer block_total; /* total number of blocks in array */ /* using restricted arrays */ C_Integer *rstrctd_list; /* list of processors with data */ C_Integer num_rstrctd; /* number of processors with data */ C_Integer has_data; /* flag that processor has data */ C_Integer rstrctd_id; /* rank of processor in restricted list */ C_Integer *rank_rstrctd; /* ranks of processors with data */ #ifdef ENABLE_CHECKPOINT int record_id; /* record id for writing ga to disk */ #endif } global_array_t; extern global_array_t *_ga_main_data_structure; extern proc_list_t *_proc_list_main_data_structure; /*\ *The following statement had to be moved here because of a problem in the c *compiler on SV1. The problem is that when a c file is compiled with a *-htaskprivate option on SV1, all global objects are given task-private status *even static variables are supposed to be initialized and given a task-private *memory/status. Somehow SV1 fails to do this for global variables that are *initialized during declaration. *So to handle that,we cannot initialize global variables to be able to run *on SV1. \*/ extern global_array_t *GA; extern proc_list_t *PGRP_LIST; #define ERR_STR_LEN 256 /* length of string for error reporting */ /**************************** MACROS ************************************/ #define ga_check_handleM(g_a, string) \ {\ if(GA_OFFSET+ (g_a) < 0 || GA_OFFSET+(g_a) >=_max_global_array){ \ char err_string[ERR_STR_LEN]; \ sprintf(err_string, "%s: INVALID ARRAY HANDLE", string); \ pnga_error(err_string, (g_a)); \ } \ if( ! (GA[GA_OFFSET+(g_a)].actv) ){ \ char err_string[ERR_STR_LEN]; \ sprintf(err_string, "%s: ARRAY NOT ACTIVE", string); \ pnga_error(err_string, (g_a)); \ } \ } /* this macro finds coordinates of the chunk of array owned by processor proc */ #define ga_ownsM_no_handle(ndim, dims, nblock, mapc, proc, lo, hi) \ { \ Integer _loc, _nb, _d, _index, _dim=ndim,_dimstart=0, _dimpos; \ for(_nb=1, _d=0; _d<_dim; _d++)_nb *= (Integer)nblock[_d]; \ if((Integer)proc > _nb - 1 || proc<0){ \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_d=0; _d<_dim; _d++){ \ lo[_d] = (Integer)0; \ hi[_d] = (Integer)-1;} \ } \ else{ \ _index = proc; \ if(GA_inv_Proc_list) _index = GA_inv_Proc_list[proc]; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_d=0; _d<_dim; _d++){ \ _loc = _index% (Integer)nblock[_d]; \ _index /= (Integer)nblock[_d]; \ _dimpos = _loc + _dimstart; /* correction to find place in mapc */\ _dimstart += (Integer)nblock[_d]; \ lo[_d] = (Integer)mapc[_dimpos]; \ if (_loc==nblock[_d]-1) hi[_d]=dims[_d]; \ else hi[_d] = mapc[_dimpos+1]-1; \ } \ } \ } /* this macro finds the block indices for a given block */ #define gam_find_block_indices(ga_handle,nblock,index) { \ int _itmp, _i; \ int _ndim = GA[ga_handle].ndim; \ _itmp = nblock; \ index[0] = _itmp%GA[ga_handle].num_blocks[0]; \ for (_i=1; _i<_ndim; _i++) { \ _itmp = (_itmp-index[_i-1])/GA[ga_handle].num_blocks[_i-1]; \ index[_i] = _itmp%GA[ga_handle].num_blocks[_i]; \ } \ } /* this macro finds the ScaLAPACK indices for a given processor */ #ifdef COMPACT_SCALAPACK #define gam_find_proc_indices(ga_handle,proc,index) { \ Integer _itmp, _i; \ Integer _ndim = GA[ga_handle].ndim; \ _itmp = proc; \ index[0] = _itmp%GA[ga_handle].nblock[0]; \ for (_i=1; _i<_ndim; _i++) { \ _itmp = (_itmp-index[_i-1])/GA[ga_handle].nblock[_i-1]; \ index[_i] = _itmp%GA[ga_handle].nblock[_i]; \ } \ } #else #define gam_find_proc_indices(ga_handle,proc,index) { \ Integer _itmp, _i; \ Integer _ndim = GA[ga_handle].ndim; \ _itmp = proc; \ index[_ndim-1] = _itmp%GA[ga_handle].nblock[_ndim-1]; \ for (_i=_ndim-2; _i>=0; _i--) { \ _itmp = (_itmp-index[_i+1])/GA[ga_handle].nblock[_i+1]; \ index[_i] = _itmp%GA[ga_handle].nblock[_i]; \ } \ } #endif /* this macro finds cordinates of the chunk of array owned by processor proc */ #define ga_ownsM(ga_handle, proc, lo, hi) \ { \ if (GA[ga_handle].block_flag == 0) { \ if (GA[ga_handle].num_rstrctd == 0) { \ ga_ownsM_no_handle(GA[ga_handle].ndim, GA[ga_handle].dims, \ GA[ga_handle].nblock, GA[ga_handle].mapc, \ proc,lo, hi ) \ } else { \ if (proc < GA[ga_handle].num_rstrctd) { \ ga_ownsM_no_handle(GA[ga_handle].ndim, GA[ga_handle].dims, \ GA[ga_handle].nblock, GA[ga_handle].mapc, \ proc,lo, hi ) \ } else { \ int _i; \ int _ndim = GA[ga_handle].ndim; \ for (_i=0; _i<_ndim; _i++) { \ lo[_i] = 0; \ hi[_i] = -1; \ } \ } \ } \ } else { \ int _index[MAXDIM]; \ int _i; \ int _ndim = GA[ga_handle].ndim; \ gam_find_block_indices(ga_handle,proc,_index); \ for (_i=0; _i<_ndim; _i++) { \ lo[_i] = _index[_i]*GA[ga_handle].block_dims[_i]+1; \ hi[_i] = (_index[_i]+1)*GA[ga_handle].block_dims[_i]; \ if (hi[_i] > GA[ga_handle].dims[_i]) hi[_i]=GA[ga_handle].dims[_i]; \ } \ } \ } /* this macro finds the block index corresponding to a given set of indices */ #define gam_find_block_from_indices(ga_handle,nblock,index) { \ int _ndim = GA[ga_handle].ndim; \ int _i; \ nblock = index[_ndim-1]; \ for (_i=_ndim-2; _i >= 0; _i--) { \ nblock = nblock*GA[ga_handle].num_blocks[_i]+index[_i]; \ } \ } /* this macro finds the proc that owns a given set block indices using the ScaLAPACK data distribution */ #ifdef COMPACT_SCALAPACK #define gam_find_proc_from_sl_indices(ga_handle,proc,index) { \ int _ndim = GA[ga_handle].ndim; \ int _i; \ Integer _index2[MAXDIM]; \ for (_i=0; _i<_ndim; _i++) { \ _index2[_i] = index[_i]%GA[ga_handle].nblock[_i]; \ } \ proc = _index2[_ndim-1]; \ for (_i=_ndim-2; _i >= 0; _i--) { \ proc = proc*GA[ga_handle].nblock[_i]+_index2[_i]; \ } \ } #else #define gam_find_proc_from_sl_indices(ga_handle,proc,index) { \ int _ndim = GA[ga_handle].ndim; \ int _i; \ Integer _index2[MAXDIM]; \ for (_i=0; _i<_ndim; _i++) { \ _index2[_i] = index[_i]%GA[ga_handle].nblock[_i]; \ } \ proc = _index2[0]; \ for (_i=1; _i < _ndim; _i++) { \ proc = proc*GA[ga_handle].nblock[_i]+_index2[_i]; \ } \ } #endif /* this macro computes the strides on both the remote and local processors that map out the data. ld and ldrem are the physical dimensions of the memory on both the local and remote processors. */ /* NEEDS C_INT64 CONVERSION */ #define gam_setstride(ndim, size, ld, ldrem, stride_rem, stride_loc){\ int _i; \ stride_rem[0]= stride_loc[0] = (int)size; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_i=0;_i 0) \ _iproc = GA[g_handle].rstrctd_list[_iproc]; \ *(ptr_loc) = GA[g_handle].ptr[_iproc]+_offset*GA[g_handle].elemsize; \ } #define ga_check_regionM(g_a, ilo, ihi, jlo, jhi, string){ \ if (*(ilo) <= 0 || *(ihi) > GA[GA_OFFSET + *(g_a)].dims[0] || \ *(jlo) <= 0 || *(jhi) > GA[GA_OFFSET + *(g_a)].dims[1] || \ *(ihi) < *(ilo) || *(jhi) < *(jlo)){ \ char err_string[ERR_STR_LEN]; \ sprintf(err_string,"%s:req(%ld:%ld,%ld:%ld) out of range (1:%ld,1:%ld)",\ string, (long)*(ilo), (long)*(ihi), (long)*(jlo), (long)*(jhi), \ (long)GA[GA_OFFSET + *(g_a)].dims[0], \ (long)GA[GA_OFFSET + *(g_a)].dims[1]); \ pnga_error(err_string, *(g_a)); \ } \ } #define gaCheckSubscriptM(subscr, lo, hi, ndim) \ { \ Integer _d; \ __CRAYX1_PRAGMA("_CRI novector"); \ for(_d=0; _d< ndim; _d++) \ if( subscr[_d]< lo[_d] || subscr[_d]> hi[_d]){ \ char err_string[ERR_STR_LEN]; \ sprintf(err_string,"check subscript failed:%ld not in (%ld:%ld) dim=%d", \ (long)subscr[_d], (long)lo[_d], (long)hi[_d], (int)_d); \ pnga_error(err_string, _d); \ }\ } ga-5-4/global/src/fapi.c0000644000175000017500000027337712662210457013172 0ustar mbamba/** * @file fapi.c * * Implements the Fortran interface. * These calls forward to the (possibly) weak symbols of the internal * implementations. */ #if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDLIB_H # include #endif #include "cnames.h" #include "farg.h" #include "globalp.h" #include "macommon.h" #include "matmul.h" int _ga_initialize_f=0; #include "ga-papi.h" #if ENABLE_PROFILING # include "ga-wapi.h" #else # include "ga-wapidefs.h" #endif #define FNAM 31 #define FMSG 256 /* Routines from base.c */ logical FATR ga_allocate_(Integer *g_a) { return wnga_allocate(*g_a); } logical FATR nga_allocate_(Integer *g_a) { return wnga_allocate(*g_a); } logical FATR ga_compare_distr_(Integer *g_a, Integer *g_b) { return wnga_compare_distr(*g_a, *g_b); } logical FATR nga_compare_distr_(Integer *g_a, Integer *g_b) { return wnga_compare_distr(*g_a, *g_b); } logical FATR ga_create_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS type, dim1, dim2, array_name, chunk1, chunk2, g_a, slen #else type, dim1, dim2, array_name, slen, chunk1, chunk2, g_a #endif ) Integer *type, *dim1, *dim2, *chunk1, *chunk2, *g_a; int slen; char* array_name; { char buf[FNAM]; Integer ndim, dims[2], chunk[2]; ga_f2cstring(array_name ,slen, buf, FNAM); dims[0] = *dim1; dims[1] = *dim2; ndim = 2; chunk[0] = (*chunk1==0)? -1 : *chunk1; chunk[1] = (*chunk2==0)? -1 : *chunk2; return(wnga_create(*type, ndim, dims, buf, chunk, g_a)); } logical FATR nga_create_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, char* array_name, Integer *chunk, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, char* array_name, int slen, Integer *p_handle, Integer *g_a #endif ) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return (wnga_create(*type, *ndim, dims, buf, chunk, g_a)); } logical FATR nga_create_config_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, char* array_name, Integer *chunk, Integer *p_handle, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, char* array_name, int slen, Integer *chunk, Integer *p_handle, Integer *g_a #endif ) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return (wnga_create_config(*type, *ndim, dims, buf, chunk, *p_handle, g_a)); } logical FATR nga_create_ghosts_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, Integer *width, char* array_name, Integer *chunk, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, Integer *width, char* array_name, int slen, Integer *chunk, Integer *g_a #endif ) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return (wnga_create_ghosts(*type, *ndim, dims, width, buf, chunk, g_a)); } logical FATR nga_create_ghosts_config_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, Integer *width, char* array_name, Integer *chunk, Integer *p_handle, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, Integer *width, char* array_name, int slen, Integer *chunk, Integer *p_handle, Integer *g_a #endif ) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return (wnga_create_ghosts_config(*type, *ndim, dims, width, buf, chunk, *p_handle, g_a)); } logical FATR nga_create_ghosts_irreg_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, Integer width[], char* array_name, Integer map[], Integer block[], Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, Integer width[], char* array_name, int slen, Integer map[], Integer block[], Integer *g_a #endif ) { char buf[FNAM]; Integer st; ga_f2cstring(array_name ,slen, buf, FNAM); st = wnga_create_ghosts_irreg(*type, *ndim, dims, width, buf, map, block, g_a); return st; } logical FATR nga_create_ghosts_irreg_config_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, Integer width[], char* array_name, Integer map[], Integer block[], Integer *p_handle, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, Integer width[], char* array_name, int slen, Integer map[], Integer block[], Integer *p_handle, Integer *g_a #endif ) { char buf[FNAM]; Integer st; ga_f2cstring(array_name ,slen, buf, FNAM); st = wnga_create_ghosts_irreg_config(*type, *ndim, dims, width, buf, map, block, *p_handle, g_a); return st; } logical FATR ga_create_irreg_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *dim1, Integer *dim2, char *array_name, Integer *map1, Integer *nblock1, Integer *map2, Integer *nblock2, Integer *g_a, int slen #else Integer *type, Integer *dim1, Integer *dim2, char *array_name, int slen, Integer *map1, Integer *nblock1, Integer *map2, Integer *nblock2, Integer *g_a #endif ) { char buf[FNAM]; Integer i, ndim, dims[2], block[2], *map; Integer status; ga_f2cstring(array_name ,slen, buf, FNAM); dims[0] = *dim1; dims[1] = *dim2; block[0] = *nblock1; block[1] = *nblock2; ndim = 2; map = (Integer*)malloc((wnga_nnodes()+1)*sizeof(Integer)); for(i=0; i<*nblock1; i++) map[i] = map1[i]; for(i=0; i<*nblock2; i++) map[i+ *nblock1] = map2[i]; status = wnga_create_irreg(*type, ndim, dims, buf, map, block, g_a); free(map); return status; } logical FATR nga_create_irreg_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, char* array_name, Integer map[], Integer block[], Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, char* array_name, int slen, Integer map[], Integer block[], Integer *g_a #endif ) { char buf[FNAM]; Integer st; ga_f2cstring(array_name ,slen, buf, FNAM); st = wnga_create_irreg(*type, *ndim, dims, buf, map, block, g_a); return st; } logical FATR nga_create_irreg_config_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer *dims, char* array_name, Integer map[], Integer block[], Integer *p_handle, Integer *g_a, int slen #else Integer *type, Integer *ndim, Integer *dims, char* array_name, int slen, Integer map[], Integer block[], Integer *p_handle, Integer *g_a #endif ) { char buf[FNAM]; Integer st; ga_f2cstring(array_name ,slen, buf, FNAM); st = wnga_create_irreg_config(*type, *ndim, dims, buf, map, block, *p_handle, g_a); return st; } Integer FATR ga_create_handle_() { return wnga_create_handle(); } Integer FATR nga_create_handle_() { return wnga_create_handle(); } logical FATR ga_create_mutexes_(Integer *num) { return wnga_create_mutexes(*num); } logical FATR nga_create_mutexes_(Integer *num) { return wnga_create_mutexes(*num); } logical FATR ga_destroy_(Integer *g_a) { return wnga_destroy(*g_a); } logical FATR nga_destroy_(Integer *g_a) { return wnga_destroy(*g_a); } logical FATR ga_destroy_mutexes_() { return wnga_destroy_mutexes(); } logical FATR nga_destroy_mutexes_() { return wnga_destroy_mutexes(); } void FATR ga_distribution_(Integer *g_a, Integer *proc, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi) { Integer lo[2], hi[2]; wnga_distribution(*g_a, *proc, lo, hi); *ilo = lo[0]; *jlo = lo[1]; *ihi = hi[0]; *jhi = hi[1]; } void FATR nga_distribution_(Integer *g_a, Integer *proc, Integer *lo, Integer *hi) { wnga_distribution(*g_a, *proc, lo, hi); } logical FATR ga_duplicate_( Integer *g_a, Integer *g_b, char *array_name, int slen) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return(wnga_duplicate(*g_a, g_b, buf)); } logical FATR nga_duplicate_( Integer *g_a, Integer *g_b, char *array_name, int slen) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); return(wnga_duplicate(*g_a, g_b, buf)); } void FATR ga_fill_(Integer *g_a, void* val) { wnga_fill(*g_a, val); } void FATR nga_fill_(Integer *g_a, void* val) { wnga_fill(*g_a, val); } void FATR ga_get_block_info_(Integer *g_a, Integer *num_blocks, Integer *block_dims) { wnga_get_block_info(*g_a, num_blocks, block_dims); } void FATR nga_get_block_info_(Integer *g_a, Integer *num_blocks, Integer *block_dims) { wnga_get_block_info(*g_a, num_blocks, block_dims); } logical FATR ga_get_debug_() { return wnga_get_debug(); } logical FATR nga_get_debug_() { return wnga_get_debug(); } Integer FATR ga_get_dimension_(Integer *g_a) { return wnga_get_dimension(*g_a); } Integer FATR nga_get_dimension_(Integer *g_a) { return wnga_get_dimension(*g_a); } Integer FATR ga_get_pgroup_(Integer *g_a) { return wnga_get_pgroup(*g_a); } Integer FATR nga_get_pgroup_(Integer *g_a) { return wnga_get_pgroup(*g_a); } Integer FATR ga_get_pgroup_size_(Integer *grp_id) { return wnga_get_pgroup_size(*grp_id); } Integer FATR nga_get_pgroup_size_(Integer *grp_id) { return wnga_get_pgroup_size(*grp_id); } void FATR ga_get_proc_grid_(Integer *g_a, Integer *dims) { wnga_get_proc_grid(*g_a, dims); } void FATR ga_get_proc_index_(Integer *g_a, Integer *iproc, Integer *index) { wnga_get_proc_index(*g_a, *iproc, index); } void FATR nga_get_proc_index_(Integer *g_a, Integer *iproc, Integer *index) { wnga_get_proc_index(*g_a, *iproc, index); } void FATR nga_get_proc_grid_(Integer *g_a, Integer *dims) { wnga_get_proc_grid(*g_a, dims); } logical FATR ga_has_ghosts_(Integer *g_a) { return wnga_has_ghosts(*g_a); } logical FATR nga_has_ghosts_(Integer *g_a) { return wnga_has_ghosts(*g_a); } void FATR ga_initialize_() { _ga_initialize_f=1; wnga_initialize(); } void FATR nga_initialize_() { _ga_initialize_f=1; wnga_initialize(); } void FATR ga_initialize_ltd_(Integer *limit) { _ga_initialize_f=1; wnga_initialize_ltd(*limit); } void FATR nga_initialize_ltd_(Integer *limit) { _ga_initialize_f=1; wnga_initialize_ltd(*limit); } logical FATR ga_initialized_() { return wnga_initialized(); } logical FATR nga_initialized_() { return wnga_initialized(); } void FATR ga_inquire_(Integer *g_a, Integer *type, Integer *dim1, Integer *dim2) { Integer dims[2], ndim; wnga_inquire(*g_a, type, &ndim, dims); if (ndim != 2) wnga_error("Wrong array dimension in ga_inquire",ndim); *type = pnga_type_c2f(*type); *dim1 = dims[0]; *dim2 = dims[1]; } void FATR nga_inquire_(Integer *g_a, Integer *type, Integer *ndim, Integer *dims) { wnga_inquire(*g_a, type, ndim, dims); *type = pnga_type_c2f(*type); } Integer FATR ga_inquire_memory_() { return wnga_inquire_memory(); } Integer FATR nga_inquire_memory_() { return wnga_inquire_memory(); } void FATR ga_inquire_name_(Integer *g_a, char *array_name, int len) { char *c_name; wnga_inquire_name(*g_a, &c_name); ga_c2fstring(c_name, array_name, len); } void FATR nga_inquire_name_(Integer *g_a, char *array_name, int len) { char *c_name; wnga_inquire_name(*g_a, &c_name); ga_c2fstring(c_name, array_name, len); } logical FATR ga_is_mirrored_(Integer *g_a) { return wnga_is_mirrored(*g_a); } logical FATR nga_is_mirrored_(Integer *g_a) { return wnga_is_mirrored(*g_a); } void FATR ga_list_nodeid_(Integer *list, Integer *nprocs) { wnga_list_nodeid(list, *nprocs); } void FATR nga_list_nodeid_(Integer *list, Integer *nprocs) { wnga_list_nodeid(list, *nprocs); } Integer FATR nga_locate_num_blocks_(Integer *g_a, Integer *lo, Integer *hi) { return wnga_locate_num_blocks(*g_a,lo,hi); } logical FATR ga_locate_nnodes_( Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer *np) { Integer lo[2], hi[2]; lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; hi[1] = *jhi; return wnga_locate_nnodes(*g_a, lo, hi, np); } logical FATR nga_locate_nnodes_(Integer *g_a, Integer *lo, Integer *hi, Integer *np) { return wnga_locate_nnodes(*g_a, lo, hi, np); } logical FATR ga_locate_region_( Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer map[][5], Integer *np) { logical status = FALSE; Integer lo[2], hi[2], p; Integer *mapl, *proclist; proclist = (Integer*)malloc(wnga_nnodes()*sizeof(Integer)); mapl = (Integer*)malloc(5*wnga_nnodes()*sizeof(Integer)); lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; hi[1] = *jhi; if (wnga_locate_num_blocks(*g_a, lo, hi) == -1) { status = wnga_locate_region(*g_a, lo, hi, mapl, proclist, np); /* need to swap elements (ilo,jlo,ihi,jhi) -> (ilo,ihi,jlo,jhi) */ for(p = 0; p< *np; p++){ map[p][0] = mapl[4*p]; map[p][1] = mapl[4*p + 2]; map[p][2] = mapl[4*p + 1]; map[p][3] = mapl[4*p + 3]; map[p][4] = proclist[p]; } } else { wnga_error("Must call nga_locate_region on block-cyclic data distribution",0); } free(proclist); free(mapl); return status; } logical FATR nga_locate_region_( Integer *g_a, Integer *lo, Integer *hi, Integer *map, Integer *proclist, Integer *np) { return wnga_locate_region(*g_a, lo, hi, map, proclist, np); } void FATR ga_lock_(Integer *mutex) { wnga_lock(*mutex); } void FATR nga_lock_(Integer *mutex) { wnga_lock(*mutex); } logical FATR ga_locate_(Integer *g_a, Integer *i, Integer *j, Integer *owner) { Integer subscript[2]; subscript[0] = *i; subscript[1] = *j; return wnga_locate(*g_a, subscript, owner); } logical FATR nga_locate_(Integer *g_a, Integer *subscript, Integer *owner) { return wnga_locate(*g_a, subscript, owner); } void FATR ga_mask_sync_(Integer *begin, Integer *end) { wnga_mask_sync(*begin, *end); } void FATR nga_mask_sync_(Integer *begin, Integer *end) { wnga_mask_sync(*begin, *end); } Integer FATR ga_memory_avail_() { return wnga_memory_avail(); } Integer FATR nga_memory_avail_() { return wnga_memory_avail(); } logical FATR ga_memory_limited_() { return wnga_memory_limited(); } logical FATR nga_memory_limited_() { return wnga_memory_limited(); } void FATR nga_merge_distr_patch_(Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi) { wnga_merge_distr_patch(*g_a, alo, ahi, *g_b, blo, bhi); } void FATR ga_merge_mirrored_(Integer *g_a) { wnga_merge_mirrored(*g_a); } void FATR nga_merge_mirrored_(Integer *g_a) { wnga_merge_mirrored(*g_a); } void FATR ga_nblock_(Integer *g_a, Integer *nblock) { wnga_nblock(*g_a, nblock); } void FATR nga_nblock_(Integer *g_a, Integer *nblock) { wnga_nblock(*g_a, nblock); } Integer FATR ga_ndim_(Integer *g_a) { return wnga_ndim(*g_a); } Integer FATR nga_ndim_(Integer *g_a) { return wnga_ndim(*g_a); } Integer FATR ga_nnodes_() { return wnga_nnodes(); } Integer FATR nga_nnodes_() { return wnga_nnodes(); } Integer FATR ga_nodeid_() { return wnga_nodeid(); } Integer FATR nga_nodeid_() { return wnga_nodeid(); } Integer FATR ga_pgroup_absolute_id_(Integer *grp, Integer *pid) { return wnga_pgroup_absolute_id(*grp, *pid); } Integer FATR nga_pgroup_absolute_id_(Integer *grp, Integer *pid) { return wnga_pgroup_absolute_id(*grp, *pid); } Integer FATR ga_pgroup_create_(Integer *list, Integer *count) { return wnga_pgroup_create(list, *count); } Integer FATR nga_pgroup_create_(Integer *list, Integer *count) { return wnga_pgroup_create(list, *count); } logical FATR ga_pgroup_destroy_(Integer *grp) { return wnga_pgroup_destroy(*grp); } logical FATR nga_pgroup_destroy_(Integer *grp) { return wnga_pgroup_destroy(*grp); } Integer FATR ga_pgroup_get_default_() { return wnga_pgroup_get_default(); } Integer FATR nga_pgroup_get_default_() { return wnga_pgroup_get_default(); } Integer FATR ga_pgroup_get_mirror_() { return wnga_pgroup_get_mirror(); } Integer FATR nga_pgroup_get_mirror_() { return wnga_pgroup_get_mirror(); } Integer FATR ga_pgroup_get_world_() { return wnga_pgroup_get_world(); } Integer FATR nga_pgroup_get_world_() { return wnga_pgroup_get_world(); } void FATR ga_pgroup_set_default_(Integer *grp) { wnga_pgroup_set_default(*grp); } void FATR nga_pgroup_set_default_(Integer *grp) { wnga_pgroup_set_default(*grp); } Integer FATR ga_pgroup_split_(Integer *grp, Integer *grp_num) { return wnga_pgroup_split(*grp, *grp_num); } Integer FATR nga_pgroup_split_(Integer *grp, Integer *grp_num) { return wnga_pgroup_split(*grp, *grp_num); } Integer FATR ga_pgroup_split_irreg_(Integer *grp, Integer *mycolor) { return wnga_pgroup_split_irreg(*grp, *mycolor); } Integer FATR nga_pgroup_split_irreg_(Integer *grp, Integer *mycolor) { return wnga_pgroup_split_irreg(*grp, *mycolor); } Integer FATR ga_pgroup_nnodes_(Integer *grp) { return wnga_pgroup_nnodes(*grp); } Integer FATR nga_pgroup_nnodes_(Integer *grp) { return wnga_pgroup_nnodes(*grp); } Integer FATR ga_pgroup_nodeid_(Integer *grp) { return wnga_pgroup_nodeid(*grp); } Integer FATR nga_pgroup_nodeid_(Integer *grp) { return wnga_pgroup_nodeid(*grp); } void FATR ga_proc_topology_(Integer* g_a, Integer* proc, Integer* pr, Integer *pc) { Integer subscript[2]; wnga_proc_topology(*g_a, *proc, subscript); *pr = subscript[0]; *pc = subscript[1]; } void FATR nga_proc_topology_(Integer* g_a, Integer* proc, Integer* subscript) { wnga_proc_topology(*g_a, *proc, subscript); } void FATR ga_randomize_(Integer *g_a, void* val) { wnga_randomize(*g_a, val); } void FATR nga_randomize_(Integer *g_a, void* val) { wnga_randomize(*g_a, val); } void FATR ga_set_array_name_(Integer *g_a, char *array_name, int slen) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); wnga_set_array_name(*g_a, buf); } void FATR nga_set_array_name_(Integer *g_a, char *array_name, int slen) { char buf[FNAM]; ga_f2cstring(array_name ,slen, buf, FNAM); wnga_set_array_name(*g_a, buf); } void FATR ga_set_block_cyclic_(Integer *g_a, Integer *dims) { wnga_set_block_cyclic(*g_a, dims); } void FATR nga_set_block_cyclic_(Integer *g_a, Integer *dims) { wnga_set_block_cyclic(*g_a, dims); } void FATR ga_set_block_cyclic_proc_grid_(Integer *g_a, Integer *dims, Integer *proc_grid) { wnga_set_block_cyclic_proc_grid(*g_a, dims, proc_grid); } void FATR nga_set_block_cyclic_proc_grid_(Integer *g_a, Integer *dims, Integer *proc_grid) { wnga_set_block_cyclic_proc_grid(*g_a, dims, proc_grid); } void FATR ga_set_chunk_(Integer *g_a, Integer *chunk) { wnga_set_chunk(*g_a, chunk); } void FATR nga_set_chunk_(Integer *g_a, Integer *chunk) { wnga_set_chunk(*g_a, chunk); } void FATR ga_set_data_(Integer *g_a, Integer *ndim, Integer *dims, Integer *type) { wnga_set_data(*g_a, *ndim, dims, *type); } void FATR nga_set_data_(Integer *g_a, Integer *ndim, Integer *dims, Integer *type) { wnga_set_data(*g_a, *ndim, dims, *type); } void FATR ga_set_debug_(logical *flag) { wnga_set_debug(*flag); } void FATR nga_set_debug_(logical *flag) { wnga_set_debug(*flag); } void FATR ga_set_ghosts_(Integer *g_a, Integer *width) { wnga_set_ghosts(*g_a,width); } void FATR nga_set_ghosts_(Integer *g_a, Integer *width) { wnga_set_ghosts(*g_a,width); } void FATR ga_set_irreg_distr_(Integer *g_a, Integer *mapc, Integer *nblock) { wnga_set_irreg_distr(*g_a, mapc, nblock); } void FATR nga_set_irreg_distr_(Integer *g_a, Integer *mapc, Integer *nblock) { wnga_set_irreg_distr(*g_a, mapc, nblock); } void FATR ga_set_irreg_flag_(Integer *g_a, logical *flag) { wnga_set_irreg_flag(*g_a, *flag); } void FATR nga_set_irreg_flag_(Integer *g_a, logical *flag) { wnga_set_irreg_flag(*g_a, *flag); } void FATR ga_set_memory_limit_(Integer *mem_limit) { wnga_set_memory_limit(*mem_limit); } void FATR nga_set_memory_limit_(Integer *mem_limit) { wnga_set_memory_limit(*mem_limit); } void FATR ga_set_pgroup_(Integer *g_a, Integer *p_handle) { wnga_set_pgroup(*g_a, *p_handle); } void FATR nga_set_pgroup_(Integer *g_a, Integer *p_handle) { wnga_set_pgroup(*g_a, *p_handle); } void FATR ga_set_restricted_(Integer *g_a, Integer *list, Integer *size) { wnga_set_restricted(*g_a, list, *size); } void FATR nga_set_restricted_(Integer *g_a, Integer *list, Integer *size) { wnga_set_restricted(*g_a, list, *size); } void FATR ga_set_restricted_range_(Integer *g_a, Integer *lo_proc, Integer *hi_proc) { wnga_set_restricted_range(*g_a, *lo_proc, *hi_proc); } void FATR nga_set_restricted_range_(Integer *g_a, Integer *lo_proc, Integer *hi_proc) { wnga_set_restricted_range(*g_a, *lo_proc, *hi_proc); } void FATR ga_terminate_() { wnga_terminate(); _ga_initialize_f=0; } void FATR nga_terminate_() { wnga_terminate(); _ga_initialize_f=0; } Integer FATR ga_total_blocks_(Integer *g_a) { return wnga_total_blocks(*g_a); } Integer FATR nga_total_blocks_(Integer *g_a) { return wnga_total_blocks(*g_a); } void FATR ga_unlock_(Integer *mutex) { wnga_unlock(*mutex); } void FATR nga_unlock_(Integer *mutex) { wnga_unlock(*mutex); } logical FATR ga_uses_ma_() { return wnga_uses_ma(); } logical FATR nga_uses_ma_() { return wnga_uses_ma(); } logical FATR ga_uses_proc_grid_(Integer *g_a) { return wnga_uses_proc_grid(*g_a); } logical FATR nga_uses_proc_grid_(Integer *g_a) { return wnga_uses_proc_grid(*g_a); } logical FATR ga_valid_handle_(Integer *g_a) { return wnga_valid_handle(*g_a); } logical FATR nga_valid_handle_(Integer *g_a) { return wnga_valid_handle(*g_a); } Integer FATR ga_verify_handle_(Integer *g_a) { return wnga_verify_handle(*g_a); } Integer FATR nga_verify_handle_(Integer *g_a) { return wnga_verify_handle(*g_a); } void FATR ga_check_handle_(Integer *g_a, char *fstring, int slen) { char buf[FMSG]; ga_f2cstring(fstring , slen, buf, FMSG); wnga_check_handle(*g_a, buf); } void FATR nga_check_handle_(Integer *g_a, char *fstring, int slen) { char buf[FMSG]; ga_f2cstring(fstring , slen, buf, FMSG); wnga_check_handle(*g_a, buf); } /* Routines from onesided.c */ void FATR ga_acc_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld, void *alpha) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_acc(*g_a, lo, hi, buf, ld, alpha); } void FATR nga_acc_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha) { wnga_acc(*g_a, lo, hi, buf, ld, alpha); } void FATR ga_access_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, AccessIndex* index, Integer *ld) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_access_idx(*g_a, lo, hi, index, ld); } void FATR nga_access_(Integer* g_a, Integer lo[], Integer hi[], AccessIndex* index, Integer ld[]) { wnga_access_idx(*g_a, lo, hi, index, ld); } void FATR nga_access_block_(Integer* g_a, Integer* idx, AccessIndex* index, Integer *ld) { wnga_access_block_idx(*g_a, *idx, index, ld); } void FATR nga_access_block_grid_(Integer* g_a, Integer* subscript, AccessIndex *index, Integer *ld) { wnga_access_block_grid_idx(*g_a, subscript, index, ld); } void FATR nga_access_block_segment_(Integer* g_a, Integer *proc, AccessIndex* index, Integer *len) { wnga_access_block_segment_idx(*g_a, *proc, index, len); } void FATR nga_alloc_gatscat_buf_(Integer *nelems) { wnga_alloc_gatscat_buf(*nelems); } void FATR ga_fence_() { wnga_fence(); } void FATR nga_fence_() { wnga_fence(); } void FATR nga_free_gatscat_buf_() { wnga_free_gatscat_buf(); } void FATR ga_gather_(Integer *g_a, void *v, Integer *i, Integer *j, Integer *nv) { wnga_gather2d(*g_a, v, i, j, *nv); } void FATR nga_gather_(Integer *g_a, void* v, Integer subscript[], Integer *nv) { wnga_gather(*g_a, v, subscript, 0, *nv); } void FATR ga_get_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld) { Integer lo[2], hi[2]; lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; hi[1] = *jhi; wnga_get(*g_a, lo, hi, buf, ld); } void FATR nga_get_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { wnga_get(*g_a, lo, hi, buf, ld); } void FATR ga_init_fence_() { wnga_init_fence(); } void FATR nga_init_fence_() { wnga_init_fence(); } void FATR ga_nbacc_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld, void *alpha, Integer *nbhandle) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_nbacc(*g_a, lo, hi, buf, ld, alpha, nbhandle); } void FATR nga_nbacc_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer *nbhandle) { wnga_nbacc(*g_a, lo, hi, buf, ld, alpha, nbhandle); } void FATR ga_nbget_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld, Integer *nbhandle) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_nbget(*g_a, lo, hi, buf, ld, nbhandle); } void FATR nga_nbget_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { wnga_nbget(*g_a, lo, hi, buf, ld, nbhandle); } void FATR ga_nbput_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld, Integer *nbhandle) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_nbput(*g_a, lo, hi, buf, ld, nbhandle); } void FATR nga_nbput_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { wnga_nbput(*g_a, lo, hi, buf, ld, nbhandle); } void FATR nga_nbput_notify_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *g_b, Integer *ecoords, void *bufn, Integer *nbhandle) { wnga_nbput_notify(*g_a, lo, hi, buf, ld, *g_b, ecoords, bufn, nbhandle); } /* nga_nbput_notify_ */ void FATR nga_nbwait_notify_(Integer *nbhandle) { wnga_nbwait_notify(nbhandle); } /* nga_nbwait_notify_ */ Integer FATR ga_nbtest_(Integer *nbhandle) { return wnga_nbtest(nbhandle); } Integer FATR nga_nbtest_(Integer *nbhandle) { return wnga_nbtest(nbhandle); } void FATR ga_nbwait_(Integer *nbhandle) { wnga_nbwait(nbhandle); } void FATR nga_nbwait_(Integer *nbhandle) { wnga_nbwait(nbhandle); } void FATR ga_pgroup_sync_(Integer *grp_id) { wnga_pgroup_sync(*grp_id); } void FATR nga_pgroup_sync_(Integer *grp_id) { wnga_pgroup_sync(*grp_id); } void FATR ga_put_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *buf, Integer *ld) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_put(*g_a, lo, hi, buf, ld); } void FATR nga_put_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { wnga_put(*g_a, lo, hi, buf, ld); } Integer FATR ga_read_inc_(Integer *g_a, Integer *i, Integer *j, Integer *inc) { Integer subscript[2]; subscript[0] = *i; subscript[1] = *j; return wnga_read_inc(*g_a, subscript, *inc); } Integer FATR nga_read_inc_(Integer *g_a, Integer *subscript, Integer *inc) { return wnga_read_inc(*g_a, subscript, *inc); } void FATR ga_release_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_release(*g_a, lo, hi); } void FATR nga_release_(Integer *g_a, Integer *lo, Integer *hi) { wnga_release(*g_a, lo, hi); } void FATR nga_release_block_(Integer *g_a, Integer *iblock) { wnga_release_block(*g_a, *iblock); } void FATR nga_release_block_grid_(Integer *g_a, Integer *index) { wnga_release_block_grid(*g_a, index); } void FATR nga_release_block_segment_(Integer *g_a, Integer *iproc) { wnga_release_block_segment(*g_a, *iproc); } void FATR ga_release_update_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi) { Integer lo[2], hi[2]; lo[0]=*ilo; lo[1]=*jlo; hi[0]=*ihi; hi[1]=*jhi; wnga_release_update(*g_a, lo, hi); } void FATR nga_release_update_(Integer *g_a, Integer *lo, Integer *hi) { wnga_release_update(*g_a, lo, hi); } void FATR nga_release_update_block_(Integer *g_a, Integer *iblock) { wnga_release_update_block(*g_a, *iblock); } void FATR nga_release_update_block_grid_(Integer *g_a, Integer *index) { wnga_release_update_block_grid(*g_a, index); } void FATR nga_release_update_block_segment_(Integer *g_a, Integer *iproc) { wnga_release_update_block_segment(*g_a, *iproc); } void FATR ga_scatter_(Integer *g_a, void *v, Integer *i, Integer *j, Integer *nv) { wnga_scatter2d(*g_a, v, i, j, *nv); } void FATR nga_scatter_(Integer *g_a, void* v, Integer subscript[], Integer *nv) { wnga_scatter(*g_a, v, subscript, 0, *nv); } void FATR ga_scatter_acc_(Integer *g_a, void *v, Integer *i, Integer *j, Integer *nv, void *alpha) { wnga_scatter_acc2d(*g_a, v, i, j, *nv, alpha); } void FATR nga_scatter_acc_(Integer *g_a, void* v, Integer subscript[], Integer *nv, void *alpha) { wnga_scatter_acc(*g_a, v, subscript, 0, *nv, alpha); } void FATR nga_strided_acc_(Integer *g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld, void *alpha) { wnga_strided_acc(*g_a, lo, hi, skip, buf, ld, alpha); } void FATR nga_strided_get_(Integer *g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld) { wnga_strided_get(*g_a, lo, hi, skip, buf, ld); } void FATR nga_strided_put_(Integer *g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld) { wnga_strided_put(*g_a, lo, hi, skip, buf, ld); } void FATR ga_sync_() { wnga_sync(); } void FATR nga_sync_() { wnga_sync(); } /* Routines from global.util.c */ void FATR ga_print_stats_() { wnga_print_stats(); } void FATR nga_print_stats_() { wnga_print_stats(); } void FATR ga_error_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *string, Integer *icode, int slen #else char *string, int slen, Integer *icode #endif ) { char buf[FMSG]; ga_f2cstring(string,slen, buf, FMSG); wnga_error(buf,*icode); } void FATR nga_error_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *string, Integer *icode, int slen #else char *string, int slen, Integer *icode #endif ) { char buf[FMSG]; ga_f2cstring(string,slen, buf, FMSG); wnga_error(buf,*icode); } Integer FATR ga_cluster_nodeid_() { return wnga_cluster_nodeid(); } Integer FATR nga_cluster_nodeid_() { return wnga_cluster_nodeid(); } Integer FATR ga_cluster_nprocs_(Integer *node) { return wnga_cluster_nprocs(*node); } Integer FATR nga_cluster_nprocs_(Integer *node) { return wnga_cluster_nprocs(*node); } Integer FATR ga_cluster_procid_(Integer *node, Integer *loc_proc_id) { return wnga_cluster_procid(*node, *loc_proc_id); } Integer FATR nga_cluster_procid_(Integer *node, Integer *loc_proc_id) { return wnga_cluster_procid(*node, *loc_proc_id); } Integer FATR ga_cluster_nnodes_() { return wnga_cluster_nnodes(); } Integer FATR nga_cluster_nnodes_() { return wnga_cluster_nnodes(); } Integer FATR ga_cluster_proc_nodeid_(Integer *proc) { return wnga_cluster_proc_nodeid(*proc); } Integer FATR nga_cluster_proc_nodeid_(Integer *proc) { return wnga_cluster_proc_nodeid(*proc); } void FATR ga_print_distribution_(Integer* g_a) { wnga_print_distribution(1, *g_a); } void FATR nga_print_distribution_(Integer* g_a) { wnga_print_distribution(1, *g_a); } DoublePrecision FATR ga_wtime_() { return wnga_wtime(); } DoublePrecision FATR nga_wtime_() { return wnga_wtime(); } /* Routines from collect.c */ void FATR ga_brdcst_( Integer *type, void *buf, Integer *len, Integer *originator) { wnga_brdcst(*type, buf, *len, *originator); } void FATR nga_brdcst_( Integer *type, void *buf, Integer *len, Integer *originator) { wnga_brdcst(*type, buf, *len, *originator); } void FATR ga_pgroup_brdcst_(Integer *grp_id, Integer *type, void *buf, Integer *len, Integer *originator) { wnga_pgroup_brdcst(*grp_id, *type, buf, *len, *originator); } void FATR ga_pgroup_gop_(Integer *grp, Integer *type, void *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(*type), x, *n, op); } void FATR nga_pgroup_gop_(Integer *grp, Integer *type, void *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(*type), x, *n, op); } void FATR ga_pgroup_igop_(Integer *grp, Integer *type, Integer *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_INT), x, *n, op); } void FATR nga_pgroup_igop_(Integer *grp, Integer *type, Integer *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_INT), x, *n, op); } void FATR ga_pgroup_sgop_(Integer *grp, Integer *type, Real *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_REAL), x, *n, op); } void FATR nga_pgroup_sgop_(Integer *grp, Integer *type, Real *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_REAL), x, *n, op); } void FATR ga_pgroup_dgop_(Integer *grp, Integer *type, DoublePrecision *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_DBL), x, *n, op); } void FATR nga_pgroup_dgop_(Integer *grp, Integer *type, DoublePrecision *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_DBL), x, *n, op); } void FATR ga_pgroup_cgop_(Integer *grp, Integer *type, SingleComplex *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_SCPL), x, *n, op); } void FATR nga_pgroup_cgop_(Integer *grp, Integer *type, SingleComplex *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_SCPL), x, *n, op); } void FATR ga_pgroup_zgop_(Integer *grp, Integer *type, DoubleComplex *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_DCPL), x, *n, op); } void FATR nga_pgroup_zgop_(Integer *grp, Integer *type, DoubleComplex *x, Integer *n, char *op, int len) { wnga_pgroup_gop(*grp, pnga_type_f2c(MT_F_DCPL), x, *n, op); } void FATR ga_gop_(Integer *type, void *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(*type), x, *n, op); } void FATR nga_gop_(Integer *type, void *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(*type), x, *n, op); } void FATR ga_igop_(Integer *type, Integer *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_INT), x, *n, op); } void FATR nga_igop_(Integer *type, Integer *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_INT), x, *n, op); } void FATR ga_sgop_(Integer *type, Real *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_REAL), x, *n, op); } void FATR nga_sgop_(Integer *type, Real *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_REAL), x, *n, op); } void FATR ga_dgop_(Integer *type, DoublePrecision *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_DBL), x, *n, op); } void FATR nga_dgop_(Integer *type, DoublePrecision *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_DBL), x, *n, op); } void FATR ga_cgop_(Integer *type, SingleComplex *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_SCPL), x, *n, op); } void FATR nga_cgop_(Integer *type, SingleComplex *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_SCPL), x, *n, op); } void FATR ga_zgop_(Integer *type, DoubleComplex *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_DCPL), x, *n, op); } void FATR nga_zgop_(Integer *type, DoubleComplex *x, Integer *n, char *op, int len) { wnga_gop(pnga_type_f2c(MT_F_DCPL), x, *n, op); } #ifdef MSG_COMMS_MPI # include "ga-mpi.h" # define ga_mpi_comm_ F77_FUNC_(ga_mpi_comm,GA_MPI_COMM) void FATR ga_mpi_comm_(Integer *fcomm) { MPI_Comm ccomm; ccomm = GA_MPI_Comm(); *fcomm = (Integer)(MPI_Comm_c2f(ccomm)); } #define ga_mpi_comm_pgroup_ F77_FUNC_(ga_mpi_comm_pgroup,GA_MPI_COMM_PGROUP) void FATR ga_mpi_comm_pgroup_(Integer *fcomm, Integer *pgroup) { MPI_Comm ccomm; ccomm = GA_MPI_Comm_pgroup((int)(*pgroup)); *fcomm = (Integer)(MPI_Comm_c2f(ccomm)); } #define ga_mpi_comm_pgroup_default_ F77_FUNC_(ga_mpi_comm_pgroup_default,GA_MPI_COMM_PGROUP_DEFAULT) void FATR ga_mpi_comm_pgroup_default_(Integer *fcomm) { MPI_Comm ccomm; ccomm = GA_MPI_Comm_pgroup_default(); *fcomm = (Integer)(MPI_Comm_c2f(ccomm)); } #endif /* Routines from elem_alg.c */ void FATR ga_abs_value_patch_(Integer *g_a, Integer *lo, Integer *hi) { wnga_abs_value_patch(*g_a, lo, hi); } void FATR nga_abs_value_patch_(Integer *g_a, Integer *lo, Integer *hi) { wnga_abs_value_patch(*g_a, lo, hi); } void FATR ga_recip_patch_(Integer *g_a, Integer *lo, Integer *hi) { wnga_recip_patch(*g_a, lo, hi); } void FATR nga_recip_patch_(Integer *g_a, Integer *lo, Integer *hi) { wnga_recip_patch(*g_a, lo, hi); } void FATR ga_add_constant_patch_(Integer *g_a, Integer *lo, Integer *hi, void *alpha) { wnga_add_constant_patch(*g_a, lo, hi, alpha); } void FATR nga_add_constant_patch_(Integer *g_a, Integer *lo, Integer *hi, void *alpha) { wnga_add_constant_patch(*g_a, lo, hi, alpha); } void FATR ga_abs_value_(Integer *g_a) { wnga_abs_value(*g_a); } void FATR nga_abs_value_(Integer *g_a) { wnga_abs_value(*g_a); } void FATR ga_add_constant_(Integer *g_a, void *alpha) { wnga_add_constant(*g_a, alpha); } void FATR nga_add_constant_(Integer *g_a, void *alpha) { wnga_add_constant(*g_a, alpha); } void FATR ga_recip_(Integer *g_a) { wnga_recip(*g_a); } void FATR ga_elem_multiply_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_multiply(*g_a, *g_b, *g_c); } void FATR nga_elem_multiply_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_multiply(*g_a, *g_b, *g_c); } void FATR ga_elem_divide_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_divide(*g_a, *g_b, *g_c); } void FATR nga_elem_divide_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_divide(*g_a, *g_b, *g_c); } void FATR ga_elem_maximum_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_maximum(*g_a, *g_b, *g_c); } void FATR nga_elem_maximum_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_maximum(*g_a, *g_b, *g_c); } void FATR ga_elem_minimum_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_minimum(*g_a, *g_b, *g_c); } void FATR nga_elem_minimum_(Integer *g_a, Integer *g_b, Integer *g_c) { wnga_elem_minimum(*g_a, *g_b, *g_c); } void FATR ga_elem_multiply_patch_(Integer *g_a,Integer *alo,Integer *ahi,Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_multiply_patch(*g_a,alo,ahi,*g_b,blo,bhi,*g_c,clo,chi); } void FATR nga_elem_multiply_patch_(Integer *g_a,Integer *alo,Integer *ahi,Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_multiply_patch(*g_a,alo,ahi,*g_b,blo,bhi,*g_c,clo,chi); } void FATR ga_elem_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR nga_elem_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR ga_elem_step_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_step_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR nga_elem_step_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_step_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR ga_elem_stepb_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_stepb_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR nga_elem_stepb_divide_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c, Integer *clo,Integer *chi) { wnga_elem_stepb_divide_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c, clo,chi); } void FATR ga_elem_maximum_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_maximum_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c,clo,chi); } void FATR nga_elem_maximum_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_maximum_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c,clo,chi); } void FATR ga_elem_minimum_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_minimum_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c,clo,chi); } void FATR nga_elem_minimum_patch_(Integer *g_a,Integer *alo,Integer *ahi, Integer *g_b,Integer *blo,Integer *bhi,Integer *g_c,Integer *clo,Integer *chi) { wnga_elem_minimum_patch(*g_a,alo,ahi, *g_b,blo,bhi,*g_c,clo,chi); } void FATR ga_step_bound_info_patch_(Integer *g_xx, Integer *xxlo, Integer *xxhi, Integer *g_vv, Integer *vvlo, Integer *vvhi, Integer *g_xxll, Integer *xxlllo, Integer *xxllhi, Integer *g_xxuu, Integer *xxuulo, Integer *xxuuhi, void *boundmin, void* wolfemin, void *boundmax) { wnga_step_bound_info_patch(*g_xx, xxlo, xxhi, *g_vv, vvlo, vvhi, *g_xxll, xxlllo, xxllhi, *g_xxuu, xxuulo, xxuuhi, boundmin, wolfemin, boundmax); } void FATR nga_step_bound_info_patch_(Integer *g_xx, Integer *xxlo, Integer *xxhi, Integer *g_vv, Integer *vvlo, Integer *vvhi, Integer *g_xxll, Integer *xxlllo, Integer *xxllhi, Integer *g_xxuu, Integer *xxuulo, Integer *xxuuhi, void *boundmin, void* wolfemin, void *boundmax) { wnga_step_bound_info_patch(*g_xx, xxlo, xxhi, *g_vv, vvlo, vvhi, *g_xxll, xxlllo, xxllhi, *g_xxuu, xxuulo, xxuuhi, boundmin, wolfemin, boundmax); } void FATR ga_step_max_patch_(Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi, void *result) { wnga_step_max_patch(*g_a, alo, ahi, *g_b, blo, bhi, result); } void FATR nga_step_max_patch_(Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi, void *result) { wnga_step_max_patch(*g_a, alo, ahi, *g_b, blo, bhi, result); } void FATR ga_step_max_(Integer *g_a, Integer *g_b, void *retval) { wnga_step_max(*g_a, *g_b, retval); } void FATR nga_step_max_(Integer *g_a, Integer *g_b, void *retval) { wnga_step_max(*g_a, *g_b, retval); } void FATR ga_step_bound_info_(Integer *g_xx, Integer *g_vv, Integer *g_xxll, Integer *g_xxuu, void *boundmin, void *wolfemin, void *boundmax) { wnga_step_bound_info(*g_xx, *g_vv, *g_xxll, *g_xxuu, boundmin, wolfemin, boundmax); } void FATR nga_step_bound_info_(Integer *g_xx, Integer *g_vv, Integer *g_xxll, Integer *g_xxuu, void *boundmin, void *wolfemin, void *boundmax) { wnga_step_bound_info(*g_xx, *g_vv, *g_xxll, *g_xxuu, boundmin, wolfemin, boundmax); } /* Routines from ga_solve_seq.c */ void FATR ga_lu_solve_seq_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *trans, Integer *g_a, Integer *g_b, int len #else char *trans, int len, Integer *g_a, Integer *g_b #endif ) { char buf[FNAM]; ga_f2cstring(trans, len, buf, FNAM); wnga_lu_solve_seq(buf, *g_a, *g_b); } /* Routines from global.util.c */ void FATR ga_print_(Integer *g_a) { wnga_print(*g_a); } void FATR nga_print_(Integer *g_a) { wnga_print(*g_a); } void FATR ga_print_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer *pretty) { wnga_print_patch2d(*g_a, *ilo, *ihi, *jlo, *jhi, *pretty); } void FATR nga_print_patch_(Integer *g_a, Integer *lo, Integer *hi, Integer *pretty) { wnga_print_patch(*g_a, lo, hi, *pretty); } void FATR ga_summarize_(Integer *verbose) { wnga_summarize(*verbose); } void FATR nga_summarize_(Integer *verbose) { wnga_summarize(*verbose); } /* Routines from ghosts.c */ void FATR nga_access_ghost_element_(Integer* g_a, AccessIndex* index, Integer subscript[], Integer ld[]) { wnga_access_ghost_element(*g_a, index, subscript, ld); } void FATR nga_access_ghosts_(Integer* g_a, Integer dims[], AccessIndex* index, Integer ld[]) { wnga_access_ghosts(*g_a, dims, index, ld); } void FATR nga_release_ghost_element_(Integer* g_a, Integer subscript[]) { wnga_release_ghost_element(*g_a, subscript); } void FATR nga_release_update_ghost_element_(Integer* g_a, Integer subscript[]) { wnga_release_update_ghost_element(*g_a, subscript); } void FATR nga_release_ghosts_(Integer* g_a) { wnga_release_ghosts(*g_a); } void FATR nga_release_update_ghosts_(Integer* g_a) { wnga_release_update_ghosts(*g_a); } void FATR nga_get_ghost_block_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { wnga_get_ghost_block(*g_a, lo, hi, buf, ld); } void FATR ga_update1_ghosts_(Integer *g_a) { wnga_update1_ghosts(*g_a); } void FATR nga_update1_ghosts_(Integer *g_a) { wnga_update1_ghosts(*g_a); } logical FATR ga_update2_ghosts_(Integer *g_a) { return wnga_update2_ghosts(*g_a); } logical FATR nga_update2_ghosts_(Integer *g_a) { return wnga_update2_ghosts(*g_a); } logical FATR ga_update3_ghosts_(Integer *g_a) { return wnga_update3_ghosts(*g_a); } logical FATR nga_update3_ghosts_(Integer *g_a) { return wnga_update3_ghosts(*g_a); } logical FATR ga_set_update4_info_(Integer *g_a) { return wnga_set_update4_info(*g_a); } logical FATR nga_set_update4_info_(Integer *g_a) { return wnga_set_update4_info(*g_a); } logical FATR ga_update4_ghosts_(Integer *g_a) { return wnga_update4_ghosts(*g_a); } logical FATR nga_update4_ghosts_(Integer *g_a) { return wnga_update4_ghosts(*g_a); } logical FATR ga_update44_ghosts_(Integer *g_a) { return wnga_update44_ghosts(*g_a); } logical FATR nga_update44_ghosts_(Integer *g_a) { return wnga_update44_ghosts(*g_a); } logical FATR ga_update55_ghosts_(Integer *g_a) { return wnga_update55_ghosts(*g_a); } logical FATR nga_update55_ghosts_(Integer *g_a) { return wnga_update55_ghosts(*g_a); } logical FATR nga_update_ghost_dir_(Integer *g_a, Integer *pdim, Integer *pdir, logical *pflag) { return wnga_update_ghost_dir(*g_a, *pdim, *pdir, *pflag); } logical FATR ga_update5_ghosts_(Integer *g_a) { return wnga_update5_ghosts(*g_a); } logical FATR nga_update5_ghosts_(Integer *g_a) { return wnga_update5_ghosts(*g_a); } logical FATR ga_set_update5_info_(Integer *g_a) { return wnga_set_update5_info(*g_a); } logical FATR nga_set_update5_info_(Integer *g_a) { return wnga_set_update5_info(*g_a); } void FATR ga_update_ghosts_(Integer *g_a) { wnga_update_ghosts(*g_a); } void FATR nga_update_ghosts_(Integer *g_a) { wnga_update_ghosts(*g_a); } void FATR nga_update_ghosts_nb_(Integer *g_a, Integer *nb) { wnga_update_ghosts_nb(*g_a, nb); } logical FATR ga_update6_ghosts_(Integer *g_a) { return wnga_update6_ghosts(*g_a); } logical FATR nga_update6_ghosts_(Integer *g_a) { return wnga_update6_ghosts(*g_a); } logical FATR ga_update7_ghosts_(Integer *g_a) { return wnga_update7_ghosts(*g_a); } logical FATR nga_update7_ghosts_(Integer *g_a) { return wnga_update7_ghosts(*g_a); } void FATR ga_ghost_barrier_() { wnga_ghost_barrier(); } void FATR nga_ghost_barrier_() { wnga_ghost_barrier(); } void FATR nga_nbget_ghost_dir_(Integer *g_a, Integer *mask, Integer *nbhandle) { wnga_nbget_ghost_dir(*g_a, mask, nbhandle); } void FATR ga_set_ghost_corner_flag_(Integer *g_a, logical *flag) { wnga_set_ghost_corner_flag(*g_a, *flag); } void FATR nga_set_ghost_corner_flag_(Integer *g_a, logical *flag) { wnga_set_ghost_corner_flag(*g_a, *flag); } logical FATR ga_set_ghost_info_(Integer *g_a) { return wnga_set_ghost_info(*g_a); } logical FATR nga_set_ghost_info_(Integer *g_a) { return wnga_set_ghost_info(*g_a); } /* Routines from global.nalg.c */ void FATR ga_zero_(Integer *g_a) { wnga_zero(*g_a); } void FATR nga_zero_(Integer *g_a) { wnga_zero(*g_a); } void FATR ga_copy_(Integer *g_a, Integer *g_b) { wnga_copy(*g_a, *g_b); } void FATR nga_copy_(Integer *g_a, Integer *g_b) { wnga_copy(*g_a, *g_b); } Integer FATR ga_idot_(Integer *g_a, Integer *g_b) { Integer sum; wnga_dot(pnga_type_f2c(MT_F_INT), *g_a, *g_b, &sum); return sum; } Integer FATR nga_idot_(Integer *g_a, Integer *g_b) { Integer sum; wnga_dot(pnga_type_f2c(MT_F_INT), *g_a, *g_b, &sum); return sum; } DoublePrecision FATR ga_ddot_(Integer *g_a, Integer *g_b) { DoublePrecision sum; wnga_dot(pnga_type_f2c(MT_F_DBL), *g_a, *g_b, &sum); return sum; } DoublePrecision FATR nga_ddot_(Integer *g_a, Integer *g_b) { DoublePrecision sum; wnga_dot(pnga_type_f2c(MT_F_DBL), *g_a, *g_b, &sum); return sum; } Real FATR ga_sdot_(Integer *g_a, Integer *g_b) { Real sum; wnga_dot(pnga_type_f2c(MT_F_REAL), *g_a, *g_b, &sum); return sum; } Real FATR nga_sdot_(Integer *g_a, Integer *g_b) { Real sum; wnga_dot(pnga_type_f2c(MT_F_REAL), *g_a, *g_b, &sum); return sum; } void FATR gai_zdot_(Integer *g_a, Integer *g_b, DoubleComplex *sum) { wnga_dot(pnga_type_f2c(MT_F_DCPL), *g_a, *g_b, sum); } void FATR ngai_zdot_(Integer *g_a, Integer *g_b, DoubleComplex *sum) { wnga_dot(pnga_type_f2c(MT_F_DCPL), *g_a, *g_b, sum); } void gai_cdot_(Integer *g_a, Integer *g_b, SingleComplex *sum) { wnga_dot(pnga_type_f2c(MT_F_SCPL), *g_a, *g_b, sum); } void ngai_cdot_(Integer *g_a, Integer *g_b, SingleComplex *sum) { wnga_dot(pnga_type_f2c(MT_F_SCPL), *g_a, *g_b, sum); } void FATR ga_scale_(Integer *g_a, void* alpha) { wnga_scale(*g_a, alpha); } void FATR ga_cscale_(Integer *g_a, SingleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_SCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_cscal_(Integer *g_a, SingleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_SCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_dscale_(Integer *g_a, DoublePrecision* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DBL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_dscal_(Integer *g_a, DoublePrecision* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DBL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_iscale_(Integer *g_a, Integer* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_INT || atype != C_LONG || atype != C_LONGLONG) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_iscal_(Integer *g_a, Integer* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_INT || atype != C_LONG || atype != C_LONGLONG) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_sscale_(Integer *g_a, Real* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_FLOAT) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_sscal_(Integer *g_a, Real* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_FLOAT) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_zscale_(Integer *g_a, DoubleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_zscal_(Integer *g_a, DoubleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR nga_scale_(Integer *g_a, void* alpha) { wnga_scale(*g_a, alpha); } void FATR nga_cscale_(Integer *g_a, SingleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_SCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR nga_dscale_(Integer *g_a, DoublePrecision* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DBL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR nga_iscale_(Integer *g_a, Integer* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_INT || atype != C_LONG || atype != C_LONGLONG) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR nga_sscale_(Integer *g_a, Real* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_FLOAT) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR nga_zscale_(Integer *g_a, DoubleComplex* alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DCPL) pnga_error(" wrong type ", 0L); wnga_scale(*g_a, alpha); } void FATR ga_add_(void *alpha, Integer* g_a, void* beta, Integer* g_b, Integer* g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_cadd_(SingleComplex *alpha, Integer *g_a, SingleComplex *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_dadd_(DoublePrecision *alpha, Integer *g_a, DoublePrecision *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_iadd_(Integer *alpha, Integer *g_a, Integer *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_sadd_(Real *alpha, Integer *g_a, Real *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_zadd_(DoubleComplex *alpha, Integer *g_a, DoubleComplex *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_add_(void *alpha, Integer* g_a, void* beta, Integer* g_b, Integer* g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_cadd_(SingleComplex *alpha, Integer *g_a, SingleComplex *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_dadd_(DoublePrecision *alpha, Integer *g_a, DoublePrecision *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_iadd_(Integer *alpha, Integer *g_a, Integer *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_sadd_(Real *alpha, Integer *g_a, Real *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR nga_zadd_(DoubleComplex *alpha, Integer *g_a, DoubleComplex *beta, Integer *g_b, Integer *g_c) { wnga_add(alpha, *g_a, beta, *g_b, *g_c); } void FATR ga_transpose_(Integer *g_a, Integer *g_b) { wnga_transpose(*g_a, *g_b); } void FATR nga_transpose_(Integer *g_a, Integer *g_b) { wnga_transpose(*g_a, *g_b); } /* Routines from global.npatch.c */ void FATR ga_copy_patch_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *trans, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, int len #else char *trans, int len, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi #endif ) { Integer alo[2], ahi[2], blo[2], bhi[2]; alo[0] = *ailo; alo[1] = *ajlo; ahi[0] = *aihi; ahi[1] = *ajhi; blo[0] = *bilo; blo[1] = *bjlo; bhi[0] = *bihi; bhi[1] = *bjhi; wnga_copy_patch(trans, *g_a, alo, ahi, *g_b, blo, bhi); } void FATR nga_copy_patch_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *trans, Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi, int len #else char *trans, int len, Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi #endif ) { wnga_copy_patch(trans,*g_a,alo,ahi,*g_b,blo,bhi); } void FATR ga_zero_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi) { Integer lo[2], hi[2]; lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; lo[1] = *jhi; wnga_zero_patch(*g_a, lo, hi); } void FATR nga_zero_patch_(Integer *g_a, Integer *lo, Integer *hi) { wnga_zero_patch(*g_a, lo, hi); } static void sga_dot_patch(Integer g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, void *retval) { Integer alo[2], ahi[2], blo[2], bhi[2]; alo[0] = *ailo; alo[1] = *ajlo; ahi[0] = *aihi; ahi[1] = *ajhi; blo[0] = *bilo; blo[1] = *bjlo; bhi[0] = *bihi; bhi[1] = *bjhi; wnga_dot_patch(g_a, t_a, alo, ahi, g_b, t_b, blo, bhi, retval); } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS DoublePrecision ga_ddot_patch_(Integer *g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, int alen, int blen) #else DoublePrecision ga_ddot_patch_(Integer *g_a, char *t_a, int alen, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, int blen, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi) #endif { DoublePrecision retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_DBL) pnga_error(" wrong types ", 0L); sga_dot_patch(*g_a, t_a, ailo, aihi, ajlo, ajhi, *g_b, t_b, bilo, bihi, bjlo, bjhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer ga_idot_patch_(Integer *g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, int alen, int blen) #else Integer ga_idot_patch_(Integer *g_a, char *t_a, int alen, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, int blen, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi) #endif { Integer retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || (atype != C_INT && atype != C_LONG && atype != C_LONGLONG)) pnga_error(" wrong types ", 0L); sga_dot_patch(*g_a, t_a, ailo, aihi, ajlo, ajhi, *g_b, t_b, bilo, bihi, bjlo, bjhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Real ga_sdot_patch_(Integer *g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, int alen, int blen) #else Real ga_sdot_patch_(Integer *g_a, char *t_a, int alen, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, int blen, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi) #endif { Real retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_FLOAT) pnga_error(" wrong types ", 0L); sga_dot_patch(*g_a, t_a, ailo, aihi, ajlo, ajhi, *g_b, t_b, bilo, bihi, bjlo, bjhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS void gai_zdot_patch_(Integer *g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, DoubleComplex *retval, int alen, int blen) #else void gai_zdot_patch_(Integer *g_a, char *t_a, int alen, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, int blen, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, DoubleComplex *retval) #endif { Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_DCPL) pnga_error(" wrong types ", 0L); sga_dot_patch(*g_a, t_a, ailo, aihi, ajlo, ajhi, *g_b, t_b, bilo, bihi, bjlo, bjhi, retval); } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS void gai_cdot_patch_(Integer *g_a, char *t_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, SingleComplex *retval, int alen, int blen) #else void gai_cdot_patch_(Integer *g_a, char *t_a, int alen, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, char *t_b, int blen, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, SingleComplex *retval) #endif { Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_SCPL) pnga_error(" wrong types ", 0L); sga_dot_patch(*g_a, t_a, ailo, aihi, ajlo, ajhi, *g_b, t_b, bilo, bihi, bjlo, bjhi, retval); } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS DoublePrecision nga_ddot_patch_(Integer *g_a, char *t_a, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, Integer *blo, Integer *bhi, int alen, int blen) #else DoublePrecision nga_ddot_patch_(Integer *g_a, char *t_a, int alen, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, int blen, Integer *blo, Integer *bhi) #endif { DoublePrecision retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_DBL) pnga_error(" wrong types ", 0L); wnga_dot_patch(*g_a, t_a, alo, ahi, *g_b, t_b, blo, bhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer nga_idot_patch_(Integer *g_a, char *t_a, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, Integer *blo, Integer *bhi, int alen, int blen) #else Integer nga_idot_patch_(Integer *g_a, char *t_a, int alen, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, int blen, Integer *blo, Integer *bhi) #endif { Integer retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || (atype != C_INT && atype != C_LONG && atype != C_LONGLONG)) pnga_error(" wrong types ", 0L); wnga_dot_patch(*g_a, t_a, alo, ahi, *g_b, t_b, blo, bhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Real nga_sdot_patch_(Integer *g_a, char *t_a, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, Integer *blo, Integer *bhi, int alen, int blen) #else Real nga_sdot_patch_(Integer *g_a, char *t_a, int alen, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, int blen, Integer *blo, Integer *bhi) #endif { Real retval; Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_FLOAT) pnga_error(" wrong types ", 0L); wnga_dot_patch(*g_a, t_a, alo, ahi, *g_b, t_b, blo, bhi, &retval); return retval; } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS void ngai_cdot_patch_(Integer *g_a, char *t_a, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, Integer *blo, Integer *bhi, SingleComplex *retval, int alen, int blen) #else void ngai_cdot_patch_(Integer *g_a, char *t_a, int alen, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, int blen, Integer *blo, Integer *bhi, SingleComplex *retval) #endif { Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_SCPL) pnga_error(" wrong types ", 0L); wnga_dot_patch(*g_a, t_a, alo, ahi, *g_b, t_b, blo, bhi, retval); } #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS void ngai_zdot_patch_(Integer *g_a, char *t_a, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, Integer *blo, Integer *bhi, DoubleComplex *retval, int alen, int blen) #else void ngai_zdot_patch_(Integer *g_a, char *t_a, int alen, Integer *alo, Integer *ahi, Integer *g_b, char *t_b, int blen, Integer *blo, Integer *bhi, DoubleComplex *retval) #endif { Integer atype, btype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); if (atype != btype || atype != C_DCPL) pnga_error(" wrong types ", 0L); wnga_dot_patch(*g_a, t_a, alo, ahi, *g_b, t_b, blo, bhi, retval); } static void sga_fill_patch(Integer g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void* val) { Integer lo[2], hi[2]; lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; hi[1] = *jhi; wnga_fill_patch(g_a, lo, hi, val); } void FATR ga_fill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void* val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR ga_cfill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, SingleComplex *val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR ga_dfill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, DoublePrecision *val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR ga_ifill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer *val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR ga_sfill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Real *val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR ga_zfill_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, DoubleComplex *val) { sga_fill_patch(*g_a, ilo, ihi, jlo, jhi, val); } void FATR nga_fill_patch_(Integer *g_a, Integer *lo, Integer *hi, void* val) { wnga_fill_patch(*g_a, lo, hi, val); } void FATR nga_cfill_patch_(Integer *g_a, Integer *lo, Integer *hi, SingleComplex* val) { wnga_fill_patch(*g_a, lo, hi, val); } void FATR nga_dfill_patch_(Integer *g_a, Integer *lo, Integer *hi, DoublePrecision* val) { wnga_fill_patch(*g_a, lo, hi, val); } void FATR nga_ifill_patch_(Integer *g_a, Integer *lo, Integer *hi, Integer* val) { wnga_fill_patch(*g_a, lo, hi, val); } void FATR nga_sfill_patch_(Integer *g_a, Integer *lo, Integer *hi, SingleComplex* val) { wnga_fill_patch(*g_a, lo, hi, val); } void FATR nga_zfill_patch_(Integer *g_a, Integer *lo, Integer *hi, DoubleComplex* val) { wnga_fill_patch(*g_a, lo, hi, val); } static void sga_scale_patch(Integer g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *alpha) { Integer lo[2], hi[2]; lo[0] = *ilo; lo[1] = *jlo; hi[0] = *ihi; hi[1] = *jhi; wnga_scale_patch(g_a, lo, hi, alpha); } void FATR ga_scale_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, void *alpha) { sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR ga_cscal_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, SingleComplex *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_SCPL) pnga_error(" wrong types ", 0L); sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR ga_dscal_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, DoublePrecision *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DBL) pnga_error(" wrong types ", 0L); sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR ga_iscal_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_INT || atype != C_LONG || atype != C_LONGLONG) pnga_error(" wrong types ", 0L); sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR ga_sscal_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Real *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_FLOAT) pnga_error(" wrong types ", 0L); sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR ga_zscal_patch_(Integer *g_a, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, DoubleComplex *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DCPL) pnga_error(" wrong types ", 0L); sga_scale_patch(*g_a, ilo, ihi, jlo, jhi, alpha); } void FATR nga_scale_patch_(Integer *g_a, Integer *lo, Integer *hi, void *alpha) { wnga_scale_patch(*g_a, lo, hi, alpha); } void FATR nga_cscale_patch_(Integer *g_a, Integer *lo, Integer *hi, SingleComplex *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_SCPL) pnga_error(" wrong types ", 0L); wnga_scale_patch(*g_a, lo, hi, alpha); } void FATR nga_dscale_patch_(Integer *g_a, Integer *lo, Integer *hi, DoublePrecision *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DBL) pnga_error(" wrong types ", 0L); wnga_scale_patch(*g_a, lo, hi, alpha); } void FATR nga_iscale_patch_(Integer *g_a, Integer *lo, Integer *hi, Integer *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_INT || atype != C_LONG || atype != C_LONGLONG) pnga_error(" wrong types ", 0L); wnga_scale_patch(*g_a, lo, hi, alpha); } void FATR nga_sscale_patch_(Integer *g_a, Integer *lo, Integer *hi, Real *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_FLOAT) pnga_error(" wrong types ", 0L); wnga_scale_patch(*g_a, lo, hi, alpha); } void FATR nga_zscale_patch_(Integer *g_a, Integer *lo, Integer *hi, DoubleComplex *alpha) { Integer atype; pnga_inquire_type(*g_a, &atype); if (atype != C_DCPL) pnga_error(" wrong types ", 0L); wnga_scale_patch(*g_a, lo, hi, alpha); } static void sga_add_patch(void *alpha, Integer g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, void *beta, Integer g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer alo[2], ahi[2], blo[2], bhi[2], clo[2], chi[2]; alo[0] = *ailo; alo[1] = *ajlo; ahi[0] = *aihi; ahi[1] = *ajhi; blo[0] = *bilo; blo[1] = *bjlo; bhi[0] = *bihi; bhi[1] = *bjhi; clo[0] = *cilo; clo[1] = *cjlo; chi[0] = *cihi; chi[1] = *cjhi; wnga_add_patch(alpha, g_a, alo, ahi, beta, g_b, blo, bhi, g_c, clo, chi); } void FATR ga_add_patch_(void *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, void *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_cadd_patch_(SingleComplex *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, SingleComplex *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_SCPL) pnga_error(" wrong types ", 0L); sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_dadd_patch_(DoublePrecision *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, DoublePrecision *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_DBL) pnga_error(" wrong types ", 0L); sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_iadd_patch_(Integer *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || (atype != C_INT && atype != C_LONG && atype != C_LONGLONG)) pnga_error(" wrong types ", 0L); sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_sadd_patch_(Real *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Real *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_FLOAT) pnga_error(" wrong types ", 0L); sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_zadd_patch_(DoubleComplex *alpha, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, DoubleComplex *beta, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_DCPL) pnga_error(" wrong types ", 0L); sga_add_patch(alpha, *g_a, ailo, aihi, ajlo, ajhi, beta, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR nga_add_patch_(void *alpha, Integer *g_a, Integer *alo, Integer *ahi, void *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } void FATR nga_cadd_patch_(SingleComplex *alpha, Integer *g_a, Integer *alo, Integer *ahi, SingleComplex *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_SCPL) pnga_error(" wrong types ", 0L); wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } void FATR nga_dadd_patch_(DoublePrecision *alpha, Integer *g_a, Integer *alo, Integer *ahi, DoublePrecision *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_DBL) pnga_error(" wrong types ", 0L); wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } void FATR nga_iadd_patch_(Integer *alpha, Integer *g_a, Integer *alo, Integer *ahi, Integer *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || (atype != C_INT && atype != C_LONG && atype != C_LONGLONG)) pnga_error(" wrong types ", 0L); wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } void FATR nga_sadd_patch_(Real *alpha, Integer *g_a, Integer *alo, Integer *ahi, Real *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_FLOAT) pnga_error(" wrong types ", 0L); wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } void FATR nga_zadd_patch_(DoubleComplex *alpha, Integer *g_a, Integer *alo, Integer *ahi, DoubleComplex *beta, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi) { Integer atype, btype, ctype; pnga_inquire_type(*g_a, &atype); pnga_inquire_type(*g_b, &btype); pnga_inquire_type(*g_c, &ctype); if (atype != btype || atype != ctype || atype != C_DCPL) pnga_error(" wrong types ", 0L); wnga_add_patch(alpha, *g_a, alo, ahi, beta, *g_b, blo, bhi, *g_c, clo, chi); } /* Routines from select.c */ void FATR nga_select_elem_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *g_a, char* op, void* val, Integer *subscript, int oplen #else Integer *g_a, char* op, int oplen, void* val, Integer *subscript #endif ) { wnga_select_elem(*g_a, op, val, subscript); } /* Routines from sparse.c */ void FATR ga_patch_enum_(Integer* g_a, Integer* lo, Integer* hi, void* start, void* stride) { wnga_patch_enum(*g_a, *lo, *hi, start, stride); } void FATR nga_patch_enum_(Integer* g_a, Integer* lo, Integer* hi, void* start, void* stride) { wnga_patch_enum(*g_a, *lo, *hi, start, stride); } void FATR ga_scan_copy_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi) { wnga_scan_copy(*g_a, *g_b, *g_sbit, *lo, *hi); } void FATR nga_scan_copy_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi) { wnga_scan_copy(*g_a, *g_b, *g_sbit, *lo, *hi); } void FATR ga_scan_add_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* excl) { wnga_scan_add(*g_a, *g_b, *g_sbit, *lo, *hi, *excl); } void FATR nga_scan_add_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* excl) { wnga_scan_add(*g_a, *g_b, *g_sbit, *lo, *hi, *excl); } void FATR ga_pack_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* icount) { wnga_pack(*g_a, *g_b, *g_sbit, *lo, *hi, icount); } void FATR nga_pack_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* icount) { wnga_pack(*g_a, *g_b, *g_sbit, *lo, *hi, icount); } void FATR ga_unpack_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* icount) { wnga_unpack(*g_a, *g_b, *g_sbit, *lo, *hi, icount); } void FATR nga_unpack_(Integer* g_a, Integer* g_b, Integer* g_sbit, Integer* lo, Integer* hi, Integer* icount) { wnga_unpack(*g_a, *g_b, *g_sbit, *lo, *hi, icount); } logical FATR ga_create_bin_range_(Integer *g_bin, Integer *g_cnt, Integer *g_off, Integer *g_range) { return wnga_create_bin_range(*g_bin, *g_cnt, *g_off, g_range); } logical FATR nga_create_bin_range_(Integer *g_bin, Integer *g_cnt, Integer *g_off, Integer *g_range) { return wnga_create_bin_range(*g_bin, *g_cnt, *g_off, g_range); } void FATR ga_bin_sorter_(Integer *g_bin, Integer *g_cnt, Integer *g_off) { wnga_bin_sorter(*g_bin, *g_cnt, *g_off); } void FATR nga_bin_sorter_(Integer *g_bin, Integer *g_cnt, Integer *g_off) { wnga_bin_sorter(*g_bin, *g_cnt, *g_off); } void FATR ga_bin_index_(Integer *g_bin, Integer *g_cnt, Integer *g_off, Integer *values, Integer *subs, Integer *n, Integer *sortit) { wnga_bin_index(*g_bin, *g_cnt, *g_off, values, subs, *n, *sortit); } void FATR nga_bin_index_(Integer *g_bin, Integer *g_cnt, Integer *g_off, Integer *values, Integer *subs, Integer *n, Integer *sortit) { wnga_bin_index(*g_bin, *g_cnt, *g_off, values, subs, *n, *sortit); } /* Routines from matrix.c */ void FATR ga_median_patch_(Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi, Integer *g_m, Integer *mlo, Integer *mhi) { wnga_median_patch(*g_a, alo, ahi, *g_b, blo, bhi, *g_c, clo, chi, *g_m, mlo, mhi); } void FATR nga_median_patch_(Integer *g_a, Integer *alo, Integer *ahi, Integer *g_b, Integer *blo, Integer *bhi, Integer *g_c, Integer *clo, Integer *chi, Integer *g_m, Integer *mlo, Integer *mhi) { wnga_median_patch(*g_a, alo, ahi, *g_b, blo, bhi, *g_c, clo, chi, *g_m, mlo, mhi); } void FATR ga_median_(Integer * g_a, Integer * g_b, Integer * g_c, Integer * g_m){ wnga_median(*g_a, *g_b, *g_c, *g_m); } void FATR nga_median_(Integer * g_a, Integer * g_b, Integer * g_c, Integer * g_m){ wnga_median(*g_a, *g_b, *g_c, *g_m); } void FATR ga_norm_infinity_(Integer * g_a, double *nm) { wnga_norm_infinity(*g_a, nm); } void FATR nga_norm_infinity_(Integer * g_a, double *nm) { wnga_norm_infinity(*g_a, nm); } void FATR ga_norm1_(Integer * g_a, double *nm) { wnga_norm1(*g_a, nm); } void FATR nga_norm1_(Integer * g_a, double *nm) { wnga_norm1(*g_a, nm); } void FATR ga_get_diag_(Integer * g_a, Integer * g_v) { wnga_get_diag(*g_a, *g_v); } void FATR nga_get_diag_(Integer * g_a, Integer * g_v) { wnga_get_diag(*g_a, *g_v); } void FATR ga_add_diagonal_(Integer * g_a, Integer * g_v) { wnga_add_diagonal(*g_a, *g_v); } void FATR nga_add_diagonal_(Integer * g_a, Integer * g_v) { wnga_add_diagonal(*g_a, *g_v); } void FATR ga_set_diagonal_(Integer * g_a, Integer * g_v) { wnga_set_diagonal(*g_a, *g_v); } void FATR nga_set_diagonal_(Integer * g_a, Integer * g_v) { wnga_set_diagonal(*g_a, *g_v); } void FATR ga_shift_diagonal_(Integer * g_a, void *c) { wnga_shift_diagonal(*g_a, c); } void FATR nga_shift_diagonal_(Integer * g_a, void *c) { wnga_shift_diagonal(*g_a, c); } void FATR ga_zero_diagonal_(Integer * g_a) { wnga_zero_diagonal(*g_a); } void FATR nga_zero_diagonal_(Integer * g_a) { wnga_zero_diagonal(*g_a); } void FATR ga_scale_rows_(Integer *g_a, Integer *g_v) { wnga_scale_rows(*g_a, *g_v); } void FATR nga_scale_rows_(Integer *g_a, Integer *g_v) { wnga_scale_rows(*g_a, *g_v); } void FATR ga_scale_cols_(Integer *g_a, Integer *g_v) { wnga_scale_cols(*g_a, *g_v); } void FATR nga_scale_cols_(Integer *g_a, Integer *g_v) { wnga_scale_cols(*g_a, *g_v); } /* Routines from ga_symmetr.c */ void FATR ga_symmetrize_(Integer *g_a) { wnga_symmetrize(*g_a); } void FATR nga_symmetrize_(Integer *g_a) { wnga_symmetrize(*g_a); } /* Routines from global.periodic.c */ void FATR nga_periodic_get_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { wnga_periodic(*g_a, lo, hi, buf, ld, NULL, PERIODIC_GET); } void FATR nga_periodic_put_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { wnga_periodic(*g_a, lo, hi, buf, ld, NULL, PERIODIC_PUT); } void FATR nga_periodic_acc_(Integer *g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha) { wnga_periodic(*g_a, lo, hi, buf, ld, alpha, PERIODIC_ACC); } /* Routines from matmul.c */ void FATR ga_matmul_mirrored_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, alen, blen #else transa, alen, transb, blen, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi #endif ) Integer *g_a, *ailo, *aihi, *ajlo, *ajhi; /* patch of g_a */ Integer *g_b, *bilo, *bihi, *bjlo, *bjhi; /* patch of g_b */ Integer *g_c, *cilo, *cihi, *cjlo, *cjhi; /* patch of g_c */ void *alpha, *beta; char *transa, *transb; int alen, blen; { wnga_matmul_mirrored(transa, transb, alpha, beta, *g_a, *ailo, *aihi, *ajlo, *ajhi, *g_b, *bilo, *bihi, *bjlo, *bjhi, *g_c, *cilo, *cihi, *cjlo, *cjhi); } void FATR nga_matmul_patch_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, void *alpha, void *beta, Integer *g_a, Integer alo[], Integer ahi[], Integer *g_b, Integer blo[], Integer bhi[], Integer *g_c, Integer clo[], Integer chi[], int alen, int blen #else char *transa, int alen, char *transb, int blen, void *alpha, void *beta, Integer *g_a, Integer alo[], Integer ahi[], Integer *g_b, Integer blo[], Integer bhi[], Integer *g_c, Integer clo[], Integer chi[] #endif ) { wnga_matmul_patch(transa, transb, alpha, beta, *g_a, alo, ahi, *g_b, blo, bhi, *g_c, clo, chi); } void FATR ga_matmul_patch_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, DoublePrecision *alpha, DoublePrecision *beta, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi, int alen, int blen #else char *transa, int alen, char *transb, int blen, DoublePrecision *alpha, DoublePrecision *beta, Integer *g_a, Integer *ailo, Integer *aihi, Integer *ajlo, Integer *ajhi, Integer *g_b, Integer *bilo, Integer *bihi, Integer *bjlo, Integer *bjhi, Integer *g_c, Integer *cilo, Integer *cihi, Integer *cjlo, Integer *cjhi #endif ) { #if 0 Integer alo[2], ahi[2]; Integer blo[2], bhi[2]; Integer clo[2], chi[2]; alo[0]=*ailo; ahi[0]=*aihi; alo[1]=*ajlo; ahi[1]=*ajhi; blo[0]=*bilo; bhi[0]=*bihi; blo[1]=*bjlo; bhi[1]=*bjhi; clo[0]=*cilo; chi[0]=*cihi; clo[1]=*cjlo; chi[1]=*cjhi; pnga_matmul_patch(transa, transb, alpha, beta, g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); #else if(pnga_is_mirrored(*g_a)) wnga_matmul_mirrored(transa, transb, (void*)alpha, (void*)beta, *g_a, *ailo, *aihi, *ajlo, *ajhi, *g_b, *bilo, *bihi, *bjlo, *bjhi, *g_c, *cilo, *cihi, *cjlo, *cjhi); else { gai_matmul_patch_flag(SET); wnga_matmul(transa, transb, (void*)alpha, (void*)beta, *g_a, *ailo, *aihi, *ajlo, *ajhi, *g_b, *bilo, *bihi, *bjlo, *bjhi, *g_c, *cilo, *cihi, *cjlo, *cjhi); gai_matmul_patch_flag(UNSET); } #endif } void FATR ga_matmul_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, alen, blen #else transa, alen, transb, blen, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi #endif ) Integer *g_a, *ailo, *aihi, *ajlo, *ajhi; /* patch of g_a */ Integer *g_b, *bilo, *bihi, *bjlo, *bjhi; /* patch of g_b */ Integer *g_c, *cilo, *cihi, *cjlo, *cjhi; /* patch of g_c */ void *alpha, *beta; char *transa, *transb; int alen, blen; { wnga_matmul(transa, transb, alpha, beta, *g_a, *ailo, *aihi, *ajlo, *ajhi, *g_b, *bilo, *bihi, *bjlo, *bjhi, *g_c, *cilo, *cihi, *cjlo, *cjhi); } /* use ga_dgemm in ga_dgemmf.F as accumulate is sloooow in CRAY_XT */ #ifdef CRAY_XT # define GA_DGEMM ga_dgemm_DISABLE #else # define GA_DGEMM ga_dgemm_ #endif #define SET_GEMM_INDICES\ Integer ailo = 1;\ Integer aihi = *m;\ Integer ajlo = 1;\ Integer ajhi = *k;\ \ Integer bilo = 1;\ Integer bihi = *k;\ Integer bjlo = 1;\ Integer bjhi = *n;\ \ Integer cilo = 1;\ Integer cihi = *m;\ Integer cjlo = 1;\ Integer cjhi = *n void FATR GA_DGEMM( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c, int talen, int tblen #else char *transa, int talen, char *transb, int tblen, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c #endif ) { SET_GEMM_INDICES; wnga_matmul(transa, transb, alpha, beta, *g_a, ailo, aihi, ajlo, ajhi, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_cgemm_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c, int talen, int tblen #else char *transa, int talen, char *transb, int tblen, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c #endif ) { SET_GEMM_INDICES; wnga_matmul (transa, transb, alpha, beta, *g_a, ailo, aihi, ajlo, ajhi, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_sgemm_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c, int talen, int tblen #else char *transa, int talen, char *transb, int tblen, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c #endif ) { SET_GEMM_INDICES; wnga_matmul (transa, transb, alpha, beta, *g_a, ailo, aihi, ajlo, ajhi, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } void FATR ga_zgemm_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *transa, char *transb, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c, int talen, int tblen #else char *transa, int talen, char *transb, int tblen, Integer *m, Integer *n, Integer *k, void *alpha, Integer *g_a, Integer *g_b, void *beta, Integer *g_c #endif ) { SET_GEMM_INDICES; wnga_matmul (transa, transb, alpha, beta, *g_a, ailo, aihi, ajlo, ajhi, *g_b, bilo, bihi, bjlo, bjhi, *g_c, cilo, cihi, cjlo, cjhi); } /* Routines from ga_diag_seqc.c */ void FATR ga_diag_seq_(Integer *g_a, Integer *g_s, Integer *g_v, DoublePrecision *eval) { wnga_diag_seq(*g_a, *g_s, *g_v, eval); } void FATR ga_diag_std_seq_(Integer * g_a, Integer * g_v, DoublePrecision *eval) { wnga_diag_std_seq(*g_a, *g_v, eval); } /* Routines from peigstubs.c */ void FATR ga_diag_(Integer * g_a, Integer * g_s, Integer * g_v, DoublePrecision *eval) { wnga_diag(*g_a, *g_s, *g_v, eval); } void FATR ga_diag_std_(Integer * g_a, Integer * g_v, DoublePrecision *eval) { wnga_diag_std(*g_a, *g_v, eval); } void FATR ga_diag_reuse_(Integer * reuse, Integer * g_a, Integer * g_s, Integer * g_v, DoublePrecision *eval) { wnga_diag_reuse(*reuse, *g_a, *g_s, *g_v, eval); } /* Routines from sclstubs.c */ void FATR ga_lu_solve_alt_(Integer *tran, Integer * g_a, Integer * g_b) { wnga_lu_solve_alt(*tran, *g_a, *g_b); } void FATR ga_lu_solve_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *tran, Integer * g_a, Integer * g_b, int len #else char *tran, int len, Integer * g_a, Integer * g_b #endif ) { wnga_lu_solve(tran, *g_a, *g_b); } Integer FATR ga_llt_solve_(Integer * g_a, Integer * g_b) { return wnga_llt_solve(*g_a, *g_b); } Integer FATR nga_llt_solve_(Integer * g_a, Integer * g_b) { return wnga_llt_solve(*g_a, *g_b); } Integer FATR ga_solve_(Integer * g_a, Integer * g_b) { return wnga_solve(*g_a, *g_b); } Integer FATR nga_solve_(Integer * g_a, Integer * g_b) { return wnga_solve(*g_a, *g_b); } Integer FATR ga_spd_invert_(Integer * g_a) { return wnga_spd_invert(*g_a); } Integer FATR nga_spd_invert_(Integer * g_a) { return wnga_spd_invert(*g_a); } /* Routines from DP.c */ void FATR ga_copy_patch_dp_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS trans, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, translen #else trans, translen, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi #endif ) Integer *g_a, *ailo, *aihi, *ajlo, *ajhi; Integer *g_b, *bilo, *bihi, *bjlo, *bjhi; char *trans; int translen; { wnga_copy_patch_dp(trans,*g_a,*ailo,*aihi,*ajlo,*ajhi,*g_b,*bilo,*bihi,*bjlo,*bjhi); } DoublePrecision FATR ga_ddot_patch_dp_( #if F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS g_a, t_a, ailo, aihi, ajlo, ajhi, g_b, t_b, bilo, bihi, bjlo, bjhi, alen, blen #else g_a, t_a, alen, ailo, aihi, ajlo, ajhi, g_b, t_b, blen, bilo, bihi, bjlo, bjhi #endif ) Integer *g_a, *ailo, *aihi, *ajlo, *ajhi; /* patch of g_a */ Integer *g_b, *bilo, *bihi, *bjlo, *bjhi; /* patch of g_b */ char *t_a, *t_b; /* transpose operators */ int alen, blen; { return wnga_ddot_patch_dp(*g_a, t_a, *ailo, *aihi, *ajlo, *ajhi, *g_b, t_b, *bilo, *bihi, *bjlo, *bjhi); } /* Routines from ga_trace.c */ double FATR ga_timer_() { return wnga_timer(); } double FATR nga_timer_() { return wnga_timer(); } Integer nga_register_type_(Integer *size) { return wnga_register_type((size_t)*size); } Integer nga_deregister_type_(Integer *type) { return wnga_deregister_type((int)*type); } void nga_get_field_(Integer *g_a, Integer *lo, Integer *hi, Integer *foff, Integer *fsize, void *buf, Integer *ld) { wnga_get_field(*g_a, lo, hi, *foff, *fsize, buf, ld); } void nga_nbget_field_(Integer *g_a, Integer *lo, Integer *hi, Integer *foff, Integer *fsize, void *buf, Integer *ld, Integer *nbhandle) { wnga_nbget_field(*g_a, lo, hi, *foff, *fsize, buf, ld, nbhandle); } void nga_nbput_field_(Integer *g_a, Integer *lo, Integer *hi, Integer *foff, Integer *fsize, void *buf, Integer *ld, Integer *nbhandle) { wnga_nbput_field(*g_a, lo, hi, *foff, *fsize, buf, ld, nbhandle); } void nga_put_field_(Integer *g_a, Integer *lo, Integer *hi, Integer *foff, Integer *fsize, void *buf, Integer *ld) { wnga_put_field(*g_a, lo, hi, *foff, *fsize, buf, ld); } ga-5-4/global/src/global.fh.in0000644000175000017500000002414112662210457014252 0ustar mbamba#include "gacommon.h" integer ga_max_dim parameter (ga_max_dim = GA_MAX_DIM) ! logical ga_allocate complex ga_cdot complex ga_cdot_patch integer ga_cluster_nnodes integer ga_cluster_nodeid integer ga_cluster_nprocs integer ga_cluster_procid integer ga_cluster_proc_nodeid logical ga_compare_distr logical ga_create integer ga_create_handle logical ga_create_irreg logical ga_create_mutexes double precision ga_ddot double precision ga_ddot_patch logical ga_destroy logical ga_destroy_mutexes logical ga_duplicate logical ga_get_debug integer ga_get_dimension integer ga_get_pgroup integer ga_get_pgroup_size logical ga_has_ghosts integer ga_idot integer ga_inquire_memory integer ga_is_mirrored integer ga_llt_solve logical ga_locate logical ga_locate_region integer ga_memory_avail logical ga_memory_limited integer ga_nbtest integer ga_ndim integer ga_nnodes integer ga_nodeid integer ga_pgroup_absolute_id integer ga_pgroup_create logical ga_pgroup_destroy integer ga_pgroup_get_default integer ga_pgroup_get_mirror integer ga_pgroup_get_world integer ga_pgroup_nnodes integer ga_pgroup_nodeid integer ga_pgroup_split integer ga_pgroup_split_irreg integer ga_read_inc real ga_sdot real ga_sdot_patch logical ga_set_update4_info logical ga_set_update5_info integer ga_solve integer ga_spd_invert integer ga_total_blocks logical ga_update2_ghosts logical ga_update3_ghosts logical ga_update4_ghosts logical ga_update5_ghosts logical ga_update6_ghosts logical ga_update7_ghosts logical ga_uses_ma logical ga_uses_proc_grid logical ga_valid_handle logical ga_verify_handle double precision ga_wtime double complex ga_zdot double complex ga_zdot_patch logical nga_allocate complex nga_cdot complex nga_cdot_patch integer nga_cluster_nnodes integer nga_cluster_nodeid integer nga_cluster_nprocs integer nga_cluster_procid integer nga_cluster_proc_nodeid logical nga_compare_distr logical nga_create logical nga_create_config logical nga_create_ghosts logical nga_create_ghosts_config logical nga_create_ghosts_irreg logical nga_create_ghosts_irreg_config integer nga_create_handle logical nga_create_irreg logical nga_create_irreg_config logical nga_create_mutexes double precision nga_ddot double precision nga_ddot_patch integer nga_deregister_type logical nga_destroy logical nga_destroy_mutexes logical nga_duplicate logical nga_get_debug integer nga_get_dimension integer nga_get_pgroup integer nga_get_pgroup_size logical nga_has_ghosts integer nga_idot integer nga_idot_patch integer nga_inquire_memory integer nga_is_mirrored integer nga_llt_solve logical nga_locate integer nga_locate_num_blocks logical nga_locate_region integer nga_memory_avail logical nga_memory_limited integer nga_nbtest integer nga_ndim integer nga_nnodes integer nga_nodeid integer nga_pgroup_absolute_id integer nga_pgroup_create logical nga_pgroup_destroy integer nga_pgroup_get_default integer nga_pgroup_get_mirror integer nga_pgroup_get_world integer nga_pgroup_nnodes integer nga_pgroup_nodeid integer nga_pgroup_split integer nga_pgroup_split_irreg integer nga_read_inc integer nga_register_type real nga_sdot real nga_sdot_patch logical nga_set_update4_info logical nga_set_update5_info integer nga_solve integer nga_spd_invert integer nga_total_blocks logical nga_update2_ghosts logical nga_update3_ghosts logical nga_update4_ghosts logical nga_update5_ghosts logical nga_update6_ghosts logical nga_update7_ghosts logical nga_update_ghost_dir logical nga_uses_ma logical nga_uses_proc_grid logical nga_valid_handle logical nga_verify_handle double precision nga_wtime double complex nga_zdot double complex nga_zdot_patch ! external ga_allocate external ga_cdot external ga_cdot_patch external ga_cluster_nnodes external ga_cluster_nodeid external ga_cluster_nprocs external ga_cluster_procid external ga_cluster_proc_nodeid external ga_compare_distr external ga_create external ga_create_handle external ga_create_irreg external ga_create_mutexes external ga_ddot external ga_ddot_patch external ga_destroy external ga_destroy_mutexes external ga_duplicate external ga_get_debug external ga_get_dimension external ga_get_pgroup external ga_get_pgroup_size external ga_has_ghosts external ga_idot external ga_inquire_memory external ga_is_mirrored external ga_llt_solve external ga_locate external ga_locate_region external ga_memory_avail external ga_memory_limited external ga_nbtest external ga_ndim external ga_nnodes external ga_nodeid external ga_pgroup_absolute_id external ga_pgroup_create external ga_pgroup_destroy external ga_pgroup_get_default external ga_pgroup_get_mirror external ga_pgroup_get_world external ga_pgroup_nnodes external ga_pgroup_nodeid external ga_pgroup_split external ga_pgroup_split_irreg external ga_read_inc external ga_sdot external ga_sdot_patch external ga_set_update4_info external ga_set_update5_info external ga_solve external ga_spd_invert external ga_total_blocks external ga_update2_ghosts external ga_update3_ghosts external ga_update4_ghosts external ga_update5_ghosts external ga_update6_ghosts external ga_update7_ghosts external ga_uses_ma external ga_uses_proc_grid external ga_valid_handle external ga_verify_handle external ga_wtime external ga_zdot external ga_zdot_patch external nga_allocate external nga_cdot external nga_cdot_patch external nga_cluster_nnodes external nga_cluster_nodeid external nga_cluster_nprocs external nga_cluster_procid external nga_cluster_proc_nodeid external nga_compare_distr external nga_create external nga_create_config external nga_create_ghosts external nga_create_ghosts_config external nga_create_ghosts_irreg external nga_create_ghosts_irreg_config external nga_create_handle external nga_create_irreg external nga_create_irreg_config external nga_create_mutexes external nga_ddot external nga_ddot_patch external nga_deregister_type external nga_destroy external nga_destroy_mutexes external nga_duplicate external nga_get_debug external nga_get_dimension external nga_get_field external nga_get_pgroup external nga_get_pgroup_size external nga_has_ghosts external nga_idot external nga_idot_patch external nga_inquire_memory external nga_is_mirrored external nga_llt_solve external nga_locate external nga_locate_num_blocks external nga_locate_region external nga_memory_avail external nga_memory_limited external nga_nbget_field external nga_nbput_field external nga_nbtest external nga_ndim external nga_nnodes external nga_nodeid external nga_pgroup_absolute_id external nga_pgroup_create external nga_pgroup_destroy external nga_pgroup_get_default external nga_pgroup_get_mirror external nga_pgroup_get_world external nga_pgroup_nnodes external nga_pgroup_nodeid external nga_pgroup_split external nga_pgroup_split_irreg external nga_put_field external nga_read_inc external nga_register_type external nga_sdot external nga_sdot_patch external nga_set_update4_info external nga_set_update5_info external nga_solve external nga_spd_invert external nga_total_blocks external nga_update2_ghosts external nga_update3_ghosts external nga_update4_ghosts external nga_update5_ghosts external nga_update6_ghosts external nga_update7_ghosts external nga_update_ghost_dir external nga_uses_ma external nga_uses_proc_grid external nga_valid_handle external nga_verify_handle external nga_wtime external nga_zdot external nga_zdot_patch ! #define GA_ACCESS_INDEX_TYPE @GA_ACCESS_INDEX_TYPE@ ga-5-4/global/src/datatypes.c0000644000175000017500000000621012662210457014225 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: datatypes.c,v 1.9.10.1 2006-12-14 13:24:47 manoj Exp $ * conversion of MA identifiers between C to Fortran data types * Note that ga_type_c2f(MT_F_INT) == MT_F_INT */ #include "gacommon.h" #include "macommon.h" #include "ga-papi.h" Integer pnga_type_f2c(Integer type) { Integer ctype; switch(type){ case MT_F_INT: # if SIZEOF_F77_INTEGER == SIZEOF_INT ctype = C_INT; # elif SIZEOF_F77_INTEGER == SIZEOF_LONG ctype = C_LONG; # elif SIZEOF_F77_INTEGER == SIZEOF_LONG_LONG ctype = C_LONGLONG; # else # error SIZEOF_F77_INTEGER == SIZEOF_??? # endif break; case MT_F_REAL: # if SIZEOF_F77_REAL == SIZEOF_FLOAT ctype = C_FLOAT; # elif SIZEOF_F77_REAL == SIZEOF_DOUBLE ctype = C_DBL; # elif SIZEOF_F77_REAL == SIZEOF_LONG_DOUBLE # error SIZEOF_F77_REAL == SIZEOF_LONG_DOUBLE not supported? # else # error SIZEOF_F77_REAL == SIZEOF_??? # endif break; case MT_F_DBL: # if SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_DOUBLE ctype = C_DBL; # elif SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_LONG_DOUBLE # error SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_LONG_DOUBLE not supported? # else # error SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_??? # endif break; case MT_F_DCPL: ctype = C_DCPL; break; case MT_F_SCPL: # if SIZEOF_F77_REAL == SIZEOF_FLOAT ctype = C_SCPL; # elif SIZEOF_F77_REAL == SIZEOF_DOUBLE ctype = C_DCPL; # elif SIZEOF_F77_REAL == SIZEOF_LONG_DOUBLE # error SIZEOF_F77_REAL == SIZEOF_LONG_DOUBLE not supported? # else # error SIZEOF_F77_REAL == SIZEOF_??? # endif break; default: ctype = type; break; } return(ctype); } Integer pnga_type_c2f(Integer type) { Integer ftype; switch(type){ case C_INT: ftype = (sizeof(int) != sizeof(Integer))? -1: MT_F_INT; break; case C_LONG: ftype = (sizeof(long) != sizeof(Integer))? -1: MT_F_INT; break; case C_LONGLONG: ftype = (sizeof(long long) != sizeof(Integer))? -1: MT_F_INT; break; case C_FLOAT: # if SIZEOF_FLOAT == SIZEOF_F77_REAL ftype = MT_F_REAL; # elif SIZEOF_FLOAT == SIZEOF_F77_DOUBLE_PRECISION ftype = MT_F_DBL; # else ftype = -1; # endif break; case C_DBL: ftype = MT_F_DBL; break; case C_DCPL: ftype = MT_F_DCPL; break; case C_SCPL: # if SIZEOF_FLOAT == SIZEOF_F77_REAL ftype = MT_F_SCPL; # elif SIZEOF_FLOAT == SIZEOF_F77_DOUBLE_PRECISION ftype = MT_F_DCPL; # else ftype = -1; # endif break; default: ftype = type; break; } return(ftype); } ga-5-4/global/src/capi.c0000644000175000017500000037610112662210457013154 0ustar mbamba/** * @file capi.c * * Implements the C interface. * These calls forward to the (possibly) weak symbols of the internal * implementations. */ #if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include #include "armci.h" #include "ga.h" #include "globalp.h" #include "ga-papi.h" #include "matmul.h" #if ENABLE_PROFILING # include "ga-wapi.h" #else # include "ga-wapidefs.h" #endif #define USE_GATSCAT_NEW int *_ga_argc=NULL; char ***_ga_argv=NULL; int _ga_initialize_args=0; int _ga_initialize_c=0; short int _ga_irreg_flag = 0; static Integer* copy_map(int block[], int block_ndim, int map[]); static Integer* copy_map64(int64_t block[], int block_ndim, int64_t map[]); #ifdef USE_FAPI # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[i]=(Integer)(carr)[i];} # define COPYF2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[i]=(int)(farr)[i];} # define COPYF2C_64(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[i]=(int64_t)(farr)[i];} # define COPYINDEX_F2C COPYF2C # define COPYINDEX_F2C_64 COPYF2C_64 #else # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i];} # define COPYF2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int)(farr)[i];} # define COPYF2C_64(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int64_t)(farr)[i];} # define COPYINDEX_C2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i]+1;} # define COPYINDEX_F2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int)(farr)[i] -1;} # define COPYINDEX_F2C_64(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int64_t)(farr)[i] -1;} #define BASE_0 #endif #define COPY(CAST,src,dst,n) {\ int i; for(i=0; i< (n); i++)(dst)[i]=(CAST)(src)[i];} #define COPY_INC(CAST,src,dst,n) {\ int i; for(i=0; i< (n); i++)(dst)[i]=(CAST)(src)[i]+1;} #define COPY_DEC(CAST,src,dst,n) {\ int i; for(i=0; i< (n); i++)(dst)[i]=(CAST)(src)[i]-1;} int GA_Uses_fapi(void) { #ifdef USE_FAPI return 1; #else return 0; #endif } void GA_Initialize_ltd(size_t limit) { Integer lim = (Integer)limit; _ga_initialize_c = 1; wnga_initialize_ltd(lim); } void NGA_Initialize_ltd(size_t limit) { Integer lim = (Integer)limit; _ga_initialize_c = 1; wnga_initialize_ltd(lim); } void GA_Initialize_args(int *argc, char ***argv) { _ga_argc = argc; _ga_argv = argv; _ga_initialize_c = 1; _ga_initialize_args = 1; wnga_initialize(); } void GA_Initialize() { _ga_initialize_c = 1; wnga_initialize(); } void NGA_Initialize() { _ga_initialize_c = 1; wnga_initialize(); } int GA_Initialized() { return wnga_initialized(); } int NGA_Initialized() { return wnga_initialized(); } void GA_Terminate() { wnga_terminate(); _ga_argc = NULL; _ga_argv = NULL; _ga_initialize_args = 0; _ga_initialize_c = 0; } void NGA_Terminate() { wnga_terminate(); _ga_argc = NULL; _ga_argv = NULL; _ga_initialize_args = 0; _ga_initialize_c = 0; } int NGA_Create(int type, int ndim, int dims[], char *name, int *chunk) { Integer *ptr, g_a; logical st; Integer _ga_work[MAXDIM]; Integer _ga_dims[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create((Integer)type, (Integer)ndim, _ga_dims, name, ptr, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create64(int type, int ndim, int64_t dims[], char *name, int64_t *chunk) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create((Integer)type, (Integer)ndim, _ga_dims, name, ptr, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_config(int type, int ndim, int dims[], char *name, int chunk[], int p_handle) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_config((Integer)type, (Integer)ndim, _ga_dims, name, ptr, (Integer)p_handle, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_config64(int type, int ndim, int64_t dims[], char *name, int64_t chunk[], int p_handle) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_config((Integer)type, (Integer)ndim, _ga_dims, name, ptr, (Integer)p_handle, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_irreg(int type,int ndim,int dims[],char *name,int block[],int map[]) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); _ga_map_capi = copy_map(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_irreg(type, (Integer)ndim, _ga_dims, name, _ga_map_capi, _ga_work, &g_a); _ga_irreg_flag = 0; /* unset it after creating the array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_irreg64(int type,int ndim,int64_t dims[],char *name,int64_t block[],int64_t map[]) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); _ga_map_capi = copy_map64(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_irreg(type, (Integer)ndim, _ga_dims, name, _ga_map_capi, _ga_work, &g_a); _ga_irreg_flag = 0; /* unset it after creating the array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_irreg_config(int type,int ndim,int dims[],char *name,int block[], int map[], int p_handle) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); _ga_map_capi = copy_map(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_irreg_config(type, (Integer)ndim, _ga_dims, name, _ga_map_capi, _ga_work, (Integer)p_handle, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_irreg_config64(int type,int ndim,int64_t dims[],char *name,int64_t block[], int64_t map[], int p_handle) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); _ga_map_capi = copy_map64(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_irreg_config(type, (Integer)ndim, _ga_dims, name, _ga_map_capi, _ga_work, (Integer)p_handle, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_irreg(int type,int ndim,int dims[],int width[],char *name, int block[],int map[]) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); COPYC2F(width,_ga_width, ndim); _ga_map_capi = copy_map(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_ghosts_irreg(type, (Integer)ndim, _ga_dims, _ga_width, name, _ga_map_capi, _ga_work, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_irreg64(int type,int ndim,int64_t dims[],int64_t width[],char *name, int64_t block[],int64_t map[]) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); COPYC2F(width,_ga_width, ndim); _ga_map_capi = copy_map64(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_ghosts_irreg(type, (Integer)ndim, _ga_dims, _ga_width, name, _ga_map_capi, _ga_work, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_irreg_config(int type, int ndim, int dims[], int width[], char *name, int block[], int map[], int p_handle) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); COPYC2F(width,_ga_width, ndim); _ga_map_capi = copy_map(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_ghosts_irreg_config(type, (Integer)ndim, _ga_dims, _ga_width, name, _ga_map_capi, _ga_work, (Integer)p_handle, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_irreg_config64(int type, int ndim, int64_t dims[], int64_t width[], char *name, int64_t block[], int64_t map[], int p_handle) { Integer g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; Integer *_ga_map_capi; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(block,_ga_work, ndim); COPYC2F(width,_ga_width, ndim); _ga_map_capi = copy_map64(block, ndim, map); _ga_irreg_flag = 1; /* set this flag=1, to indicate array is irregular */ st = wnga_create_ghosts_irreg_config(type, (Integer)ndim, _ga_dims, _ga_width, name, _ga_map_capi, _ga_work, (Integer)p_handle, &g_a); _ga_irreg_flag = 0; /* unset it, after creating array */ free(_ga_map_capi); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts(int type, int ndim,int dims[], int width[], char *name, int chunk[]) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(width,_ga_width, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_ghosts((Integer)type, (Integer)ndim, _ga_dims, _ga_width, name, ptr, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts64(int type, int ndim, int64_t dims[], int64_t width[], char *name, int64_t chunk[]) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(width,_ga_width, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_ghosts((Integer)type, (Integer)ndim, _ga_dims, _ga_width, name, ptr, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_config(int type, int ndim,int dims[], int width[], char *name, int chunk[], int p_handle) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(width,_ga_width, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_ghosts_config((Integer)type, (Integer)ndim, _ga_dims, _ga_width, name, ptr, (Integer)p_handle, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int NGA_Create_ghosts_config64(int type, int ndim,int64_t dims[], int64_t width[], char *name, int64_t chunk[], int p_handle) { Integer *ptr, g_a; logical st; Integer _ga_dims[MAXDIM]; Integer _ga_work[MAXDIM]; Integer _ga_width[MAXDIM]; if(ndim>MAXDIM)return 0; COPYC2F(dims,_ga_dims, ndim); COPYC2F(width,_ga_width, ndim); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } st = wnga_create_ghosts_config((Integer)type, (Integer)ndim, _ga_dims, _ga_width, name, ptr, (Integer)p_handle, &g_a); if(st==TRUE) return (int) g_a; else return 0; } int GA_Create_handle() { Integer g_a; g_a = wnga_create_handle(); return (int)g_a; } int NGA_Create_handle() { Integer g_a; g_a = wnga_create_handle(); return (int)g_a; } void GA_Set_data(int g_a, int ndim, int dims[], int type) { Integer aa, nndim, ttype; Integer _ga_dims[MAXDIM]; COPYC2F(dims,_ga_dims, ndim); aa = (Integer)g_a; nndim = (Integer)ndim; ttype = (Integer)type; wnga_set_data(aa, nndim, _ga_dims, ttype); } void GA_Set_data64(int g_a, int ndim, int64_t dims[], int type) { Integer aa, nndim, ttype; Integer _ga_dims[MAXDIM]; COPYC2F(dims,_ga_dims, ndim); aa = (Integer)g_a; nndim = (Integer)ndim; ttype = (Integer)type; wnga_set_data(aa, nndim, _ga_dims, ttype); } void NGA_Set_data(int g_a, int ndim, int dims[], int type) { Integer aa, nndim, ttype; Integer _ga_dims[MAXDIM]; COPYC2F(dims,_ga_dims, ndim); aa = (Integer)g_a; nndim = (Integer)ndim; ttype = (Integer)type; wnga_set_data(aa, nndim, _ga_dims, ttype); } void NGA_Set_data64(int g_a, int ndim, int64_t dims[], int type) { Integer aa, nndim, ttype; Integer _ga_dims[MAXDIM]; COPYC2F(dims,_ga_dims, ndim); aa = (Integer)g_a; nndim = (Integer)ndim; ttype = (Integer)type; wnga_set_data(aa, nndim, _ga_dims, ttype); } void GA_Set_chunk(int g_a, int chunk[]) { Integer aa, *ptr, ndim; Integer _ga_work[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } wnga_set_chunk(aa, ptr); } void GA_Set_chunk64(int g_a, int64_t chunk[]) { Integer aa, *ptr, ndim; Integer _ga_work[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } wnga_set_chunk(aa, ptr); } void NGA_Set_chunk(int g_a, int chunk[]) { Integer aa, *ptr, ndim; Integer _ga_work[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } wnga_set_chunk(aa, ptr); } void NGA_Set_chunk64(int g_a, int64_t chunk[]) { Integer aa, *ptr, ndim; Integer _ga_work[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); if(!chunk)ptr=(Integer*)0; else { COPYC2F(chunk,_ga_work, ndim); ptr = _ga_work; } wnga_set_chunk(aa, ptr); } void GA_Set_array_name(int g_a, char *name) { Integer aa; aa = (Integer)g_a; wnga_set_array_name(aa, name); } void NGA_Set_array_name(int g_a, char *name) { Integer aa; aa = (Integer)g_a; wnga_set_array_name(aa, name); } void GA_Set_pgroup(int g_a, int p_handle) { Integer aa, pp; aa = (Integer)g_a; pp = (Integer)p_handle; wnga_set_pgroup(aa, pp); } void NGA_Set_pgroup(int g_a, int p_handle) { Integer aa, pp; aa = (Integer)g_a; pp = (Integer)p_handle; wnga_set_pgroup(aa, pp); } void GA_Set_block_cyclic(int g_a, int dims[]) { Integer aa, ndim; Integer _ga_dims[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); COPYC2F(dims,_ga_dims, ndim); wnga_set_block_cyclic(aa, _ga_dims); } void NGA_Set_block_cyclic(int g_a, int dims[]) { Integer aa, ndim; Integer _ga_dims[MAXDIM]; aa = (Integer)g_a; ndim = wnga_get_dimension(aa); COPYC2F(dims,_ga_dims, ndim); wnga_set_block_cyclic(aa, _ga_dims); } void GA_Set_restricted(int g_a, int list[], int size) { Integer aa; Integer asize = (Integer)size; int i; Integer *_ga_map_capi; aa = (Integer)g_a; _ga_map_capi = (Integer*)malloc(size * sizeof(Integer)); for (i=0; i #include "gacommon.h" #include "typesf2c.h" typedef intp AccessIndex; /* Routines from base.c */ extern logical pnga_allocate(Integer g_a); extern logical pnga_compare_distr(Integer g_a, Integer g_b); extern logical pnga_create(Integer type, Integer ndim, Integer *dims, char* name, Integer *chunk, Integer *g_a); extern logical pnga_create_config(Integer type, Integer ndim, Integer *dims, char* name, Integer *chunk, Integer p_handle, Integer *g_a); extern logical pnga_create_ghosts(Integer type, Integer ndim, Integer *dims, Integer *width, char* name, Integer *chunk, Integer *g_a); extern logical pnga_create_ghosts_irreg(Integer type, Integer ndim, Integer *dims, Integer *width, char* name, Integer *map, Integer *block, Integer *g_a); extern logical pnga_create_ghosts_irreg_config(Integer type, Integer ndim, Integer *dims, Integer *width, char* name, Integer *map, Integer *block, Integer p_handle, Integer *g_a); extern logical pnga_create_ghosts_config(Integer type, Integer ndim, Integer *dims, Integer *width, char* name, Integer *chunk, Integer p_handle, Integer *g_a); extern logical pnga_create_irreg(Integer type, Integer ndim, Integer *dims, char* name, Integer *map, Integer *block, Integer *g_a); extern logical pnga_create_irreg_config(Integer type, Integer ndim, Integer *dims, char* name, Integer *map, Integer *block, Integer p_handle, Integer *g_a); extern Integer pnga_create_handle(); extern logical pnga_create_mutexes(Integer num); extern logical pnga_destroy(Integer g_a); extern logical pnga_destroy_mutexes(); extern void pnga_distribution(Integer g_a, Integer proc, Integer *lo, Integer *hi); extern logical pnga_duplicate(Integer g_a, Integer *g_b, char *array_name); extern void pnga_fill(Integer g_a, void* val); extern void pnga_get_block_info(Integer g_a, Integer *num_blocks, Integer *block_dims); extern logical pnga_get_debug(); extern Integer pnga_get_dimension(Integer g_a); extern void pnga_get_proc_grid(Integer g_a, Integer *dims); extern void pnga_get_proc_index(Integer g_a, Integer iproc, Integer *index); extern logical pnga_has_ghosts(Integer g_a); extern void pnga_initialize(); extern int pnga_initialized(); extern void pnga_initialize_ltd(Integer limit); extern void pnga_inquire(Integer g_a, Integer *type, Integer *ndim, Integer *dims); extern void pnga_inquire_type(Integer g_a, Integer *type); extern Integer pnga_inquire_memory(); extern void pnga_inquire_name(Integer g_a, char **array_name); extern logical pnga_is_mirrored(Integer g_a); extern void pnga_list_nodeid(Integer *list, Integer nprocs); extern logical pnga_locate(Integer g_a, Integer *subscript, Integer *owner); extern Integer pnga_locate_num_blocks(Integer g_a, Integer *lo, Integer *hi); extern logical pnga_locate_nnodes(Integer g_a, Integer *lo, Integer *hi, Integer *np); extern logical pnga_locate_region(Integer g_a, Integer *lo, Integer *hi, Integer *map, Integer *proclist, Integer *np); extern void pnga_lock(Integer mutex); extern Integer pnga_ndim(Integer g_a); extern void pnga_mask_sync(Integer begin, Integer end); extern Integer pnga_memory_avail(); extern logical pnga_memory_limited(); extern void pnga_merge_distr_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi); extern void pnga_merge_mirrored(Integer g_a); extern void pnga_nblock(Integer g_a, Integer *nblock); extern Integer pnga_nnodes(); extern Integer pnga_nodeid(); extern Integer pnga_pgroup_absolute_id(Integer grp, Integer pid); extern Integer pnga_pgroup_create(Integer *list, Integer count); extern logical pnga_pgroup_destroy(Integer grp); extern Integer pnga_pgroup_get_default(); extern Integer pnga_pgroup_get_mirror(); extern Integer pnga_pgroup_get_world(); extern void pnga_pgroup_set_default(Integer grp); extern Integer pnga_pgroup_split(Integer grp, Integer grp_num); extern Integer pnga_pgroup_split_irreg(Integer grp, Integer mycolor); extern Integer pnga_pgroup_nnodes(Integer grp); extern Integer pnga_pgroup_nodeid(Integer grp); extern void pnga_proc_topology(Integer g_a, Integer proc, Integer* subscript); extern void pnga_randomize(Integer g_a, void* val); extern Integer pnga_get_pgroup(Integer g_a); extern Integer pnga_get_pgroup_size(Integer grp_id); extern void pnga_set_array_name(Integer g_a, char *array_name); extern void pnga_set_block_cyclic(Integer g_a, Integer *dims); extern void pnga_set_block_cyclic_proc_grid(Integer g_a, Integer *dims, Integer *proc_grid); extern void pnga_set_chunk(Integer g_a, Integer *chunk); extern void pnga_set_data(Integer g_a, Integer ndim, Integer *dims, Integer type); extern void pnga_set_debug(logical flag); extern void pnga_set_ghosts(Integer g_a, Integer *width); extern void pnga_set_irreg_distr(Integer g_a, Integer *map, Integer *block); extern void pnga_set_irreg_flag(Integer g_a, logical flag); extern void pnga_set_memory_limit(Integer mem_limit); extern void pnga_set_pgroup(Integer g_a, Integer p_handle); extern void pnga_set_restricted(Integer g_a, Integer *list, Integer size); extern void pnga_set_restricted_range(Integer g_a, Integer lo_proc, Integer hi_proc); extern void pnga_terminate(); extern Integer pnga_total_blocks(Integer g_a); extern void pnga_unlock(Integer mutex); extern logical pnga_uses_ma(); extern logical pnga_uses_proc_grid(Integer g_a); extern logical pnga_valid_handle(Integer g_a); extern Integer pnga_verify_handle(Integer g_a); extern void pnga_check_handle(Integer g_a, char *string); /* Routines from onesided.c */ extern void pnga_acc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha); extern void pnga_access_idx(Integer g_a, Integer *lo, Integer *hi, AccessIndex *index, Integer *ld); extern void pnga_access_ptr(Integer g_a, Integer *lo, Integer *hi, void *ptr, Integer *ld); extern void pnga_access_block_idx(Integer g_a, Integer idx, AccessIndex* index, Integer *ld); extern void pnga_access_block_ptr(Integer g_a, Integer idx, void* ptr, Integer *ld); extern void pnga_access_block_grid_idx(Integer g_a, Integer* subscript, AccessIndex *index, Integer *ld); extern void pnga_access_block_grid_ptr(Integer g_a, Integer *index, void* ptr, Integer *ld); extern void pnga_access_block_segment_idx(Integer g_a, Integer proc, AccessIndex* index, Integer *len); extern void pnga_access_block_segment_ptr(Integer g_a, Integer proc, void* ptr, Integer *len); extern void pnga_alloc_gatscat_buf(Integer nelems); extern void pnga_fence(); extern void pnga_free_gatscat_buf(); extern void pnga_gather2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv); extern void pnga_gather(Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv); extern void pnga_get(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld); extern void pnga_init_fence(); extern void pnga_nbacc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer *nbhndl); extern void pnga_nbget(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle); extern void pnga_nbput(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle); extern void pnga_nbput_notify(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer g_b, Integer *ecoords, void *bufn, Integer *nbhandle); extern void pnga_nbwait_notify(Integer *nbhandle); extern Integer pnga_nbtest(Integer *nbhandle); extern void pnga_nbwait(Integer *nbhandle); extern void pnga_put(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld); extern void pnga_pgroup_sync(Integer grp_id); extern Integer pnga_read_inc(Integer g_a, Integer *subscript, Integer inc); extern void pnga_release(Integer g_a, Integer *lo, Integer *hi); extern void pnga_release_block(Integer g_a, Integer iblock); extern void pnga_release_block_grid(Integer g_a, Integer *index); extern void pnga_release_block_segment(Integer g_a, Integer iproc); extern void pnga_release_update(Integer g_a, Integer *lo, Integer *hi); extern void pnga_release_update_block(Integer g_a, Integer iblock); extern void pnga_release_update_block_grid(Integer g_a, Integer *index); extern void pnga_release_update_block_segment(Integer g_a, Integer iproc); extern void pnga_scatter2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv); extern void pnga_scatter(Integer g_a, void *v, void *subscript, Integer c_flag, Integer nv); extern void pnga_scatter_acc2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv, void *alpha); extern void pnga_scatter_acc(Integer g_a, void* v, void *subscript, Integer c_flag, Integer nv, void *alpha); extern void pnga_strided_acc(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld, void *alpha); extern void pnga_strided_get(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld); extern void pnga_strided_put(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld); extern void pnga_sync(); extern DoublePrecision pnga_wtime(); /* Routines from datatypes.c */ extern Integer pnga_type_f2c(Integer type); extern Integer pnga_type_c2f(Integer type); /* Routines from collect.c */ extern void pnga_msg_brdcst(Integer type, void *buffer, Integer len, Integer root); extern void pnga_brdcst(Integer type, void *buf, Integer len, Integer originator); extern void pnga_pgroup_brdcst(Integer grp_id, Integer type, void *buf, Integer len, Integer originator); extern void pnga_msg_sync(); extern void pnga_msg_pgroup_sync(Integer grp_id); extern void pnga_pgroup_gop(Integer p_grp, Integer type, void *x, Integer n, char *op); extern void pnga_gop(Integer type, void *x, Integer n, char *op); /* Routines from elem_alg.c */ extern void pnga_abs_value_patch(Integer g_a, Integer *lo, Integer *hi); extern void pnga_recip_patch(Integer g_a, Integer *lo, Integer *hi); extern void pnga_add_constant_patch(Integer g_a, Integer *lo, Integer *hi, void *alpha); extern void pnga_abs_value(Integer g_a); extern void pnga_add_constant(Integer g_a, void *alpha); extern void pnga_recip(Integer g_a); extern void pnga_elem_multiply(Integer g_a, Integer g_b, Integer g_c); extern void pnga_elem_divide(Integer g_a, Integer g_b, Integer g_c); extern void pnga_elem_maximum(Integer g_a, Integer g_b, Integer g_c); extern void pnga_elem_minimum(Integer g_a, Integer g_b, Integer g_c); extern void pnga_elem_multiply_patch(Integer g_a,Integer *alo,Integer *ahi,Integer g_b,Integer *blo,Integer *bhi,Integer g_c,Integer *clo,Integer *chi); extern void pnga_elem_divide_patch(Integer g_a,Integer *alo,Integer *ahi,Integer g_b,Integer *blo,Integer *bhi,Integer g_c,Integer *clo,Integer *chi); extern void pnga_elem_maximum_patch(Integer g_a,Integer *alo,Integer *ahi,Integer g_b,Integer *blo,Integer *bhi,Integer g_c,Integer *clo,Integer *chi); extern void pnga_elem_minimum_patch(Integer g_a,Integer *alo,Integer *ahi,Integer g_b,Integer *blo,Integer *bhi,Integer g_c,Integer *clo,Integer *chi); extern void pnga_elem_step_divide_patch(Integer g_a,Integer *alo,Integer *ahi, Integer g_b,Integer *blo,Integer *bhi,Integer g_c, Integer *clo,Integer *chi); extern void pnga_elem_stepb_divide_patch(Integer g_a,Integer *alo,Integer *ahi, Integer g_b,Integer *blo,Integer *bhi,Integer g_c, Integer *clo,Integer *chi); extern void pnga_step_mask_patch(Integer g_a,Integer *alo,Integer *ahi, Integer g_b,Integer *blo,Integer *bhi,Integer g_c, Integer *clo,Integer *chi); extern void pnga_step_bound_info_patch(Integer g_xx, Integer *xxlo, Integer *xxhi, Integer g_vv, Integer *vvlo, Integer *vvhi, Integer g_xxll, Integer *xxlllo, Integer *xxllhi, Integer g_xxuu, Integer *xxuulo, Integer *xxuuhi, void *boundmin, void* wolfemin, void *boundmax); extern void pnga_step_max_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, void *result); extern void pnga_step_max(Integer g_a, Integer g_b, void *retval); extern void pnga_step_bound_info(Integer g_xx, Integer g_vv, Integer g_xxll, Integer g_xxuu, void *boundmin, void *wolfemin, void *boundmax); /* Routines from ga_solve_seq.c */ extern void pnga_lu_solve_seq(char *trans, Integer g_a, Integer g_b); /* Routines from global.util.c */ extern void pnga_print_stats(); extern void pnga_error(char *string, Integer icode); extern Integer pnga_cluster_nodeid(); extern Integer pnga_cluster_nprocs(Integer node); extern Integer pnga_cluster_procid(Integer node, Integer loc_proc_id); extern Integer pnga_cluster_nnodes(); extern Integer pnga_cluster_proc_nodeid(Integer proc); extern void pnga_print_file(FILE *file, Integer g_a); extern void pnga_print(Integer g_a); extern void pnga_print_patch_file2d(FILE *file, Integer g_a, Integer ilo, Integer ihi, Integer jlo, Integer jhi, Integer pretty); extern void pnga_print_patch2d(Integer g_a, Integer ilo, Integer ihi, Integer jlo, Integer jhi, Integer pretty); extern void pnga_print_patch_file(FILE *file, Integer g_a, Integer *lo, Integer *hi, Integer pretty); extern void pnga_print_patch(Integer g_a, Integer *lo, Integer *hi, Integer pretty); extern void pnga_print_distribution(int fstyle, Integer g_a); extern void pnga_summarize(Integer verbose); /* Routines from ghosts.c */ extern void pnga_access_ghost_ptr(Integer g_a, Integer dims[], void* ptr, Integer ld[]); extern void pnga_access_ghost_element(Integer g_a, AccessIndex* index, Integer subscript[], Integer ld[]); extern void pnga_access_ghost_element_ptr(Integer g_a, void *ptr, Integer subscript[], Integer ld[]); extern void pnga_access_ghosts(Integer g_a, Integer dims[], AccessIndex* index, Integer ld[]); extern void pnga_release_ghost_element(Integer g_a, Integer subscript[]); extern void pnga_release_update_ghost_element(Integer g_a, Integer subscript[]); extern void pnga_release_ghosts(Integer g_a); extern void pnga_release_update_ghosts(Integer g_a); extern void pnga_get_ghost_block(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld); extern void pnga_update1_ghosts(Integer g_a); extern logical pnga_update2_ghosts(Integer g_a); extern logical pnga_update3_ghosts(Integer g_a); extern logical pnga_set_update4_info(Integer g_a); extern logical pnga_update4_ghosts(Integer g_a); extern logical pnga_update44_ghosts(Integer g_a); extern logical pnga_update55_ghosts(Integer g_a); extern logical pnga_update_ghost_dir(Integer g_a, Integer pdim, Integer pdir, logical pflag); extern logical pnga_update5_ghosts(Integer g_a); extern logical pnga_set_update5_info(Integer g_a); extern void pnga_update_ghosts(Integer g_a); extern void pnga_update_ghosts_nb(Integer g_a, Integer *nbhandle); extern logical pnga_update6_ghosts(Integer g_a); extern logical pnga_update7_ghosts(Integer g_a); extern void pnga_ghost_barrier(); extern void pnga_nbget_ghost_dir(Integer g_a, Integer *mask, Integer *nbhandle); extern logical pnga_set_ghost_info(Integer g_a); extern void pnga_set_ghost_corner_flag(Integer g_a, logical flag); /* Routines from global.nalg.c */ extern void pnga_zero(Integer g_a); extern void pnga_copy(Integer g_a, Integer g_b); extern void pnga_dot(int type, Integer g_a, Integer g_b, void *value); extern void pnga_scale(Integer g_a, void* alpha); extern void pnga_add(void *alpha, Integer g_a, void* beta, Integer g_b, Integer g_c); extern void pnga_transpose(Integer g_a, Integer g_b); /* Routines from global.npatch.c */ extern void pnga_copy_patch(char *trans, Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi); extern void pnga_zero_patch(Integer g_a, Integer *lo, Integer *hi); extern logical pnga_patch_intersect(Integer *lo, Integer *hi, Integer *lop, Integer *hip, Integer ndim); extern logical pnga_comp_patch(Integer andim, Integer *alo, Integer *ahi, Integer bndim, Integer *blo, Integer *bhi); extern void pnga_dot_patch(Integer g_a, char *t_a, Integer *alo, Integer *ahi, Integer g_b, char *t_b, Integer *blo, Integer *bhi, void *retval); extern void pnga_fill_patch(Integer g_a, Integer *lo, Integer *hi, void* val); extern void pnga_scale_patch(Integer g_a, Integer *lo, Integer *hi, void *alpha); extern void pnga_add_patch(void *alpha, Integer g_a, Integer *alo, Integer *ahi, void *beta, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi); /* Routines from select.c */ extern void pnga_select_elem(Integer g_a, char* op, void* val, Integer *subscript); /* Routines from ga_malloc.c */ extern Integer pnga_memory_avail_type(Integer datatype); /* Routines from sparse.c */ extern void pnga_patch_enum(Integer g_a, Integer lo, Integer hi, void* start, void* stride); extern void pnga_scan_copy(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi); extern void pnga_scan_add(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer excl); extern void pnga_pack(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer* icount); extern void pnga_unpack(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer* icount); extern logical pnga_create_bin_range(Integer g_bin, Integer g_cnt, Integer g_off, Integer *g_range); extern void pnga_bin_sorter(Integer g_bin, Integer g_cnt, Integer g_off); extern void pnga_bin_index(Integer g_bin, Integer g_cnt, Integer g_off, Integer *values, Integer *subs, Integer n, Integer sortit); /* Routines from matrix.c */ extern void pnga_median_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi, Integer g_m, Integer *mlo, Integer *mhi); extern void pnga_median(Integer g_a, Integer g_b, Integer g_c, Integer g_m); extern void pnga_norm_infinity(Integer g_a, double *nm); extern void pnga_norm1(Integer g_a, double *nm); extern void pnga_get_diag(Integer g_a, Integer g_v); extern void pnga_add_diagonal(Integer g_a, Integer g_v); extern void pnga_set_diagonal(Integer g_a, Integer g_v); extern void pnga_shift_diagonal(Integer g_a, void *c); extern void pnga_zero_diagonal(Integer g_a); extern void pnga_scale_rows(Integer g_a, Integer g_v); extern void pnga_scale_cols(Integer g_a, Integer g_v); /* Routines from ga_symmetr.c */ extern void pnga_symmetrize(Integer g_a); /* Routines from global.periodic.c */ extern void pnga_periodic(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer op_code); /* Routines from matmul.c */ extern void pnga_matmul(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi, Integer g_c, Integer cilo, Integer cihi, Integer cjlo, Integer cjhi); extern void pnga_matmul_mirrored(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi, Integer g_c, Integer cilo, Integer cihi, Integer cjlo, Integer cjhi); extern void pnga_matmul_patch(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer alo[], Integer ahi[], Integer g_b, Integer blo[], Integer bhi[], Integer g_c, Integer clo[], Integer chi[]); /* Routines from ga_diag_seqc.c */ extern void pnga_diag_seq(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval); extern void pnga_diag_std_seq(Integer g_a, Integer g_v, DoublePrecision *eval); /* Routines from peigstubs.c */ extern void pnga_diag(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval); extern void pnga_diag_std(Integer g_a, Integer g_v, DoublePrecision *eval); extern void pnga_diag_reuse(Integer reuse, Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval); /* Routines from sclstubs.c */ extern void pnga_lu_solve_alt(Integer tran, Integer g_a, Integer g_b); extern void pnga_lu_solve(char *tran, Integer g_a, Integer g_b); extern Integer pnga_llt_solve(Integer g_a, Integer g_b); extern Integer pnga_solve(Integer g_a, Integer g_b); extern Integer pnga_spd_invert(Integer g_a); /* Routines from DP.c */ extern void pnga_copy_patch_dp(char *t_a, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi); extern DoublePrecision pnga_ddot_patch_dp(Integer g_a, char *t_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, char *t_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi); /* Routines from ga_trace.c */ extern double pnga_timer(); /*Routines for types from base.c*/ extern int pnga_register_type(size_t size); extern int pnga_deregister_type(int type); /*Routines for field-wise GA operations*/ extern void pnga_get_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld); extern void pnga_nbget_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize,void *buf, Integer *ld, Integer *nbhandle); extern void pnga_nbput_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize,void *buf, Integer *ld, Integer *nbhandle); extern void pnga_put_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize,void *buf, Integer *ld); #endif /* PAPI_H_ */ ga-5-4/global/src/cnames.h0000644000175000017500000066643512662210457013527 0ustar mbamba#define ga_allocate_ F77_FUNC_(ga_allocate, GA_ALLOCATE) #define ga_callocate_ F77_FUNC_(ga_callocate,GA_CALLOCATE) #define ga_dallocate_ F77_FUNC_(ga_dallocate,GA_DALLOCATE) #define ga_iallocate_ F77_FUNC_(ga_iallocate,GA_IALLOCATE) #define ga_sallocate_ F77_FUNC_(ga_sallocate,GA_SALLOCATE) #define ga_zallocate_ F77_FUNC_(ga_zallocate,GA_ZALLOCATE) #define nga_allocate_ F77_FUNC_(nga_allocate, NGA_ALLOCATE) #define nga_callocate_ F77_FUNC_(nga_callocate,NGA_CALLOCATE) #define nga_dallocate_ F77_FUNC_(nga_dallocate,NGA_DALLOCATE) #define nga_iallocate_ F77_FUNC_(nga_iallocate,NGA_IALLOCATE) #define nga_sallocate_ F77_FUNC_(nga_sallocate,NGA_SALLOCATE) #define nga_zallocate_ F77_FUNC_(nga_zallocate,NGA_ZALLOCATE) #define ga_compare_distr_ F77_FUNC_(ga_compare_distr, GA_COMPARE_DISTR) #define ga_ccompare_distr_ F77_FUNC_(ga_ccompare_distr,GA_CCOMPARE_DISTR) #define ga_dcompare_distr_ F77_FUNC_(ga_dcompare_distr,GA_DCOMPARE_DISTR) #define ga_icompare_distr_ F77_FUNC_(ga_icompare_distr,GA_ICOMPARE_DISTR) #define ga_scompare_distr_ F77_FUNC_(ga_scompare_distr,GA_SCOMPARE_DISTR) #define ga_zcompare_distr_ F77_FUNC_(ga_zcompare_distr,GA_ZCOMPARE_DISTR) #define nga_compare_distr_ F77_FUNC_(nga_compare_distr, NGA_COMPARE_DISTR) #define nga_ccompare_distr_ F77_FUNC_(nga_ccompare_distr,NGA_CCOMPARE_DISTR) #define nga_dcompare_distr_ F77_FUNC_(nga_dcompare_distr,NGA_DCOMPARE_DISTR) #define nga_icompare_distr_ F77_FUNC_(nga_icompare_distr,NGA_ICOMPARE_DISTR) #define nga_scompare_distr_ F77_FUNC_(nga_scompare_distr,NGA_SCOMPARE_DISTR) #define nga_zcompare_distr_ F77_FUNC_(nga_zcompare_distr,NGA_ZCOMPARE_DISTR) #define ga_create_ F77_FUNC_(ga_create, GA_CREATE) #define ga_ccreate_ F77_FUNC_(ga_ccreate,GA_CCREATE) #define ga_dcreate_ F77_FUNC_(ga_dcreate,GA_DCREATE) #define ga_icreate_ F77_FUNC_(ga_icreate,GA_ICREATE) #define ga_screate_ F77_FUNC_(ga_screate,GA_SCREATE) #define ga_zcreate_ F77_FUNC_(ga_zcreate,GA_ZCREATE) #define nga_create_ F77_FUNC_(nga_create, NGA_CREATE) #define nga_ccreate_ F77_FUNC_(nga_ccreate,NGA_CCREATE) #define nga_dcreate_ F77_FUNC_(nga_dcreate,NGA_DCREATE) #define nga_icreate_ F77_FUNC_(nga_icreate,NGA_ICREATE) #define nga_screate_ F77_FUNC_(nga_screate,NGA_SCREATE) #define nga_zcreate_ F77_FUNC_(nga_zcreate,NGA_ZCREATE) #define ga_create_config_ F77_FUNC_(ga_create_config, GA_CREATE_CONFIG) #define ga_ccreate_config_ F77_FUNC_(ga_ccreate_config,GA_CCREATE_CONFIG) #define ga_dcreate_config_ F77_FUNC_(ga_dcreate_config,GA_DCREATE_CONFIG) #define ga_icreate_config_ F77_FUNC_(ga_icreate_config,GA_ICREATE_CONFIG) #define ga_screate_config_ F77_FUNC_(ga_screate_config,GA_SCREATE_CONFIG) #define ga_zcreate_config_ F77_FUNC_(ga_zcreate_config,GA_ZCREATE_CONFIG) #define nga_create_config_ F77_FUNC_(nga_create_config, NGA_CREATE_CONFIG) #define nga_ccreate_config_ F77_FUNC_(nga_ccreate_config,NGA_CCREATE_CONFIG) #define nga_dcreate_config_ F77_FUNC_(nga_dcreate_config,NGA_DCREATE_CONFIG) #define nga_icreate_config_ F77_FUNC_(nga_icreate_config,NGA_ICREATE_CONFIG) #define nga_screate_config_ F77_FUNC_(nga_screate_config,NGA_SCREATE_CONFIG) #define nga_zcreate_config_ F77_FUNC_(nga_zcreate_config,NGA_ZCREATE_CONFIG) #define ga_create_ghosts_ F77_FUNC_(ga_create_ghosts, GA_CREATE_GHOSTS) #define ga_ccreate_ghosts_ F77_FUNC_(ga_ccreate_ghosts,GA_CCREATE_GHOSTS) #define ga_dcreate_ghosts_ F77_FUNC_(ga_dcreate_ghosts,GA_DCREATE_GHOSTS) #define ga_icreate_ghosts_ F77_FUNC_(ga_icreate_ghosts,GA_ICREATE_GHOSTS) #define ga_screate_ghosts_ F77_FUNC_(ga_screate_ghosts,GA_SCREATE_GHOSTS) #define ga_zcreate_ghosts_ F77_FUNC_(ga_zcreate_ghosts,GA_ZCREATE_GHOSTS) #define nga_create_ghosts_ F77_FUNC_(nga_create_ghosts, NGA_CREATE_GHOSTS) #define nga_ccreate_ghosts_ F77_FUNC_(nga_ccreate_ghosts,NGA_CCREATE_GHOSTS) #define nga_dcreate_ghosts_ F77_FUNC_(nga_dcreate_ghosts,NGA_DCREATE_GHOSTS) #define nga_icreate_ghosts_ F77_FUNC_(nga_icreate_ghosts,NGA_ICREATE_GHOSTS) #define nga_screate_ghosts_ F77_FUNC_(nga_screate_ghosts,NGA_SCREATE_GHOSTS) #define nga_zcreate_ghosts_ F77_FUNC_(nga_zcreate_ghosts,NGA_ZCREATE_GHOSTS) #define ga_create_ghosts_irreg_ F77_FUNC_(ga_create_ghosts_irreg, GA_CREATE_GHOSTS_IRREG) #define ga_ccreate_ghosts_irreg_ F77_FUNC_(ga_ccreate_ghosts_irreg,GA_CCREATE_GHOSTS_IRREG) #define ga_dcreate_ghosts_irreg_ F77_FUNC_(ga_dcreate_ghosts_irreg,GA_DCREATE_GHOSTS_IRREG) #define ga_icreate_ghosts_irreg_ F77_FUNC_(ga_icreate_ghosts_irreg,GA_ICREATE_GHOSTS_IRREG) #define ga_screate_ghosts_irreg_ F77_FUNC_(ga_screate_ghosts_irreg,GA_SCREATE_GHOSTS_IRREG) #define ga_zcreate_ghosts_irreg_ F77_FUNC_(ga_zcreate_ghosts_irreg,GA_ZCREATE_GHOSTS_IRREG) #define nga_create_ghosts_irreg_ F77_FUNC_(nga_create_ghosts_irreg, NGA_CREATE_GHOSTS_IRREG) #define nga_ccreate_ghosts_irreg_ F77_FUNC_(nga_ccreate_ghosts_irreg,NGA_CCREATE_GHOSTS_IRREG) #define nga_dcreate_ghosts_irreg_ F77_FUNC_(nga_dcreate_ghosts_irreg,NGA_DCREATE_GHOSTS_IRREG) #define nga_icreate_ghosts_irreg_ F77_FUNC_(nga_icreate_ghosts_irreg,NGA_ICREATE_GHOSTS_IRREG) #define nga_screate_ghosts_irreg_ F77_FUNC_(nga_screate_ghosts_irreg,NGA_SCREATE_GHOSTS_IRREG) #define nga_zcreate_ghosts_irreg_ F77_FUNC_(nga_zcreate_ghosts_irreg,NGA_ZCREATE_GHOSTS_IRREG) #define ga_create_ghosts_irreg_config_ F77_FUNC_(ga_create_ghosts_irreg_config, GA_CREATE_GHOSTS_IRREG_CONFIG) #define ga_ccreate_ghosts_irreg_config_ F77_FUNC_(ga_ccreate_ghosts_irreg_config,GA_CCREATE_GHOSTS_IRREG_CONFIG) #define ga_dcreate_ghosts_irreg_config_ F77_FUNC_(ga_dcreate_ghosts_irreg_config,GA_DCREATE_GHOSTS_IRREG_CONFIG) #define ga_icreate_ghosts_irreg_config_ F77_FUNC_(ga_icreate_ghosts_irreg_config,GA_ICREATE_GHOSTS_IRREG_CONFIG) #define ga_screate_ghosts_irreg_config_ F77_FUNC_(ga_screate_ghosts_irreg_config,GA_SCREATE_GHOSTS_IRREG_CONFIG) #define ga_zcreate_ghosts_irreg_config_ F77_FUNC_(ga_zcreate_ghosts_irreg_config,GA_ZCREATE_GHOSTS_IRREG_CONFIG) #define nga_create_ghosts_irreg_config_ F77_FUNC_(nga_create_ghosts_irreg_config, NGA_CREATE_GHOSTS_IRREG_CONFIG) #define nga_ccreate_ghosts_irreg_config_ F77_FUNC_(nga_ccreate_ghosts_irreg_config,NGA_CCREATE_GHOSTS_IRREG_CONFIG) #define nga_dcreate_ghosts_irreg_config_ F77_FUNC_(nga_dcreate_ghosts_irreg_config,NGA_DCREATE_GHOSTS_IRREG_CONFIG) #define nga_icreate_ghosts_irreg_config_ F77_FUNC_(nga_icreate_ghosts_irreg_config,NGA_ICREATE_GHOSTS_IRREG_CONFIG) #define nga_screate_ghosts_irreg_config_ F77_FUNC_(nga_screate_ghosts_irreg_config,NGA_SCREATE_GHOSTS_IRREG_CONFIG) #define nga_zcreate_ghosts_irreg_config_ F77_FUNC_(nga_zcreate_ghosts_irreg_config,NGA_ZCREATE_GHOSTS_IRREG_CONFIG) #define ga_create_ghosts_config_ F77_FUNC_(ga_create_ghosts_config, GA_CREATE_GHOSTS_CONFIG) #define ga_ccreate_ghosts_config_ F77_FUNC_(ga_ccreate_ghosts_config,GA_CCREATE_GHOSTS_CONFIG) #define ga_dcreate_ghosts_config_ F77_FUNC_(ga_dcreate_ghosts_config,GA_DCREATE_GHOSTS_CONFIG) #define ga_icreate_ghosts_config_ F77_FUNC_(ga_icreate_ghosts_config,GA_ICREATE_GHOSTS_CONFIG) #define ga_screate_ghosts_config_ F77_FUNC_(ga_screate_ghosts_config,GA_SCREATE_GHOSTS_CONFIG) #define ga_zcreate_ghosts_config_ F77_FUNC_(ga_zcreate_ghosts_config,GA_ZCREATE_GHOSTS_CONFIG) #define nga_create_ghosts_config_ F77_FUNC_(nga_create_ghosts_config, NGA_CREATE_GHOSTS_CONFIG) #define nga_ccreate_ghosts_config_ F77_FUNC_(nga_ccreate_ghosts_config,NGA_CCREATE_GHOSTS_CONFIG) #define nga_dcreate_ghosts_config_ F77_FUNC_(nga_dcreate_ghosts_config,NGA_DCREATE_GHOSTS_CONFIG) #define nga_icreate_ghosts_config_ F77_FUNC_(nga_icreate_ghosts_config,NGA_ICREATE_GHOSTS_CONFIG) #define nga_screate_ghosts_config_ F77_FUNC_(nga_screate_ghosts_config,NGA_SCREATE_GHOSTS_CONFIG) #define nga_zcreate_ghosts_config_ F77_FUNC_(nga_zcreate_ghosts_config,NGA_ZCREATE_GHOSTS_CONFIG) #define ga_create_irreg_ F77_FUNC_(ga_create_irreg, GA_CREATE_IRREG) #define ga_ccreate_irreg_ F77_FUNC_(ga_ccreate_irreg,GA_CCREATE_IRREG) #define ga_dcreate_irreg_ F77_FUNC_(ga_dcreate_irreg,GA_DCREATE_IRREG) #define ga_icreate_irreg_ F77_FUNC_(ga_icreate_irreg,GA_ICREATE_IRREG) #define ga_screate_irreg_ F77_FUNC_(ga_screate_irreg,GA_SCREATE_IRREG) #define ga_zcreate_irreg_ F77_FUNC_(ga_zcreate_irreg,GA_ZCREATE_IRREG) #define nga_create_irreg_ F77_FUNC_(nga_create_irreg, NGA_CREATE_IRREG) #define nga_ccreate_irreg_ F77_FUNC_(nga_ccreate_irreg,NGA_CCREATE_IRREG) #define nga_dcreate_irreg_ F77_FUNC_(nga_dcreate_irreg,NGA_DCREATE_IRREG) #define nga_icreate_irreg_ F77_FUNC_(nga_icreate_irreg,NGA_ICREATE_IRREG) #define nga_screate_irreg_ F77_FUNC_(nga_screate_irreg,NGA_SCREATE_IRREG) #define nga_zcreate_irreg_ F77_FUNC_(nga_zcreate_irreg,NGA_ZCREATE_IRREG) #define ga_create_irreg_config_ F77_FUNC_(ga_create_irreg_config, GA_CREATE_IRREG_CONFIG) #define ga_ccreate_irreg_config_ F77_FUNC_(ga_ccreate_irreg_config,GA_CCREATE_IRREG_CONFIG) #define ga_dcreate_irreg_config_ F77_FUNC_(ga_dcreate_irreg_config,GA_DCREATE_IRREG_CONFIG) #define ga_icreate_irreg_config_ F77_FUNC_(ga_icreate_irreg_config,GA_ICREATE_IRREG_CONFIG) #define ga_screate_irreg_config_ F77_FUNC_(ga_screate_irreg_config,GA_SCREATE_IRREG_CONFIG) #define ga_zcreate_irreg_config_ F77_FUNC_(ga_zcreate_irreg_config,GA_ZCREATE_IRREG_CONFIG) #define nga_create_irreg_config_ F77_FUNC_(nga_create_irreg_config, NGA_CREATE_IRREG_CONFIG) #define nga_ccreate_irreg_config_ F77_FUNC_(nga_ccreate_irreg_config,NGA_CCREATE_IRREG_CONFIG) #define nga_dcreate_irreg_config_ F77_FUNC_(nga_dcreate_irreg_config,NGA_DCREATE_IRREG_CONFIG) #define nga_icreate_irreg_config_ F77_FUNC_(nga_icreate_irreg_config,NGA_ICREATE_IRREG_CONFIG) #define nga_screate_irreg_config_ F77_FUNC_(nga_screate_irreg_config,NGA_SCREATE_IRREG_CONFIG) #define nga_zcreate_irreg_config_ F77_FUNC_(nga_zcreate_irreg_config,NGA_ZCREATE_IRREG_CONFIG) #define ga_create_handle_ F77_FUNC_(ga_create_handle, GA_CREATE_HANDLE) #define ga_ccreate_handle_ F77_FUNC_(ga_ccreate_handle,GA_CCREATE_HANDLE) #define ga_dcreate_handle_ F77_FUNC_(ga_dcreate_handle,GA_DCREATE_HANDLE) #define ga_icreate_handle_ F77_FUNC_(ga_icreate_handle,GA_ICREATE_HANDLE) #define ga_screate_handle_ F77_FUNC_(ga_screate_handle,GA_SCREATE_HANDLE) #define ga_zcreate_handle_ F77_FUNC_(ga_zcreate_handle,GA_ZCREATE_HANDLE) #define nga_create_handle_ F77_FUNC_(nga_create_handle, NGA_CREATE_HANDLE) #define nga_ccreate_handle_ F77_FUNC_(nga_ccreate_handle,NGA_CCREATE_HANDLE) #define nga_dcreate_handle_ F77_FUNC_(nga_dcreate_handle,NGA_DCREATE_HANDLE) #define nga_icreate_handle_ F77_FUNC_(nga_icreate_handle,NGA_ICREATE_HANDLE) #define nga_screate_handle_ F77_FUNC_(nga_screate_handle,NGA_SCREATE_HANDLE) #define nga_zcreate_handle_ F77_FUNC_(nga_zcreate_handle,NGA_ZCREATE_HANDLE) #define ga_create_mutexes_ F77_FUNC_(ga_create_mutexes, GA_CREATE_MUTEXES) #define ga_ccreate_mutexes_ F77_FUNC_(ga_ccreate_mutexes,GA_CCREATE_MUTEXES) #define ga_dcreate_mutexes_ F77_FUNC_(ga_dcreate_mutexes,GA_DCREATE_MUTEXES) #define ga_icreate_mutexes_ F77_FUNC_(ga_icreate_mutexes,GA_ICREATE_MUTEXES) #define ga_screate_mutexes_ F77_FUNC_(ga_screate_mutexes,GA_SCREATE_MUTEXES) #define ga_zcreate_mutexes_ F77_FUNC_(ga_zcreate_mutexes,GA_ZCREATE_MUTEXES) #define nga_create_mutexes_ F77_FUNC_(nga_create_mutexes, NGA_CREATE_MUTEXES) #define nga_ccreate_mutexes_ F77_FUNC_(nga_ccreate_mutexes,NGA_CCREATE_MUTEXES) #define nga_dcreate_mutexes_ F77_FUNC_(nga_dcreate_mutexes,NGA_DCREATE_MUTEXES) #define nga_icreate_mutexes_ F77_FUNC_(nga_icreate_mutexes,NGA_ICREATE_MUTEXES) #define nga_screate_mutexes_ F77_FUNC_(nga_screate_mutexes,NGA_SCREATE_MUTEXES) #define nga_zcreate_mutexes_ F77_FUNC_(nga_zcreate_mutexes,NGA_ZCREATE_MUTEXES) #define ga_destroy_ F77_FUNC_(ga_destroy, GA_DESTROY) #define ga_cdestroy_ F77_FUNC_(ga_cdestroy,GA_CDESTROY) #define ga_ddestroy_ F77_FUNC_(ga_ddestroy,GA_DDESTROY) #define ga_idestroy_ F77_FUNC_(ga_idestroy,GA_IDESTROY) #define ga_sdestroy_ F77_FUNC_(ga_sdestroy,GA_SDESTROY) #define ga_zdestroy_ F77_FUNC_(ga_zdestroy,GA_ZDESTROY) #define nga_destroy_ F77_FUNC_(nga_destroy, NGA_DESTROY) #define nga_cdestroy_ F77_FUNC_(nga_cdestroy,NGA_CDESTROY) #define nga_ddestroy_ F77_FUNC_(nga_ddestroy,NGA_DDESTROY) #define nga_idestroy_ F77_FUNC_(nga_idestroy,NGA_IDESTROY) #define nga_sdestroy_ F77_FUNC_(nga_sdestroy,NGA_SDESTROY) #define nga_zdestroy_ F77_FUNC_(nga_zdestroy,NGA_ZDESTROY) #define ga_destroy_mutexes_ F77_FUNC_(ga_destroy_mutexes, GA_DESTROY_MUTEXES) #define ga_cdestroy_mutexes_ F77_FUNC_(ga_cdestroy_mutexes,GA_CDESTROY_MUTEXES) #define ga_ddestroy_mutexes_ F77_FUNC_(ga_ddestroy_mutexes,GA_DDESTROY_MUTEXES) #define ga_idestroy_mutexes_ F77_FUNC_(ga_idestroy_mutexes,GA_IDESTROY_MUTEXES) #define ga_sdestroy_mutexes_ F77_FUNC_(ga_sdestroy_mutexes,GA_SDESTROY_MUTEXES) #define ga_zdestroy_mutexes_ F77_FUNC_(ga_zdestroy_mutexes,GA_ZDESTROY_MUTEXES) #define nga_destroy_mutexes_ F77_FUNC_(nga_destroy_mutexes, NGA_DESTROY_MUTEXES) #define nga_cdestroy_mutexes_ F77_FUNC_(nga_cdestroy_mutexes,NGA_CDESTROY_MUTEXES) #define nga_ddestroy_mutexes_ F77_FUNC_(nga_ddestroy_mutexes,NGA_DDESTROY_MUTEXES) #define nga_idestroy_mutexes_ F77_FUNC_(nga_idestroy_mutexes,NGA_IDESTROY_MUTEXES) #define nga_sdestroy_mutexes_ F77_FUNC_(nga_sdestroy_mutexes,NGA_SDESTROY_MUTEXES) #define nga_zdestroy_mutexes_ F77_FUNC_(nga_zdestroy_mutexes,NGA_ZDESTROY_MUTEXES) #define ga_distribution_ F77_FUNC_(ga_distribution, GA_DISTRIBUTION) #define ga_cdistribution_ F77_FUNC_(ga_cdistribution,GA_CDISTRIBUTION) #define ga_ddistribution_ F77_FUNC_(ga_ddistribution,GA_DDISTRIBUTION) #define ga_idistribution_ F77_FUNC_(ga_idistribution,GA_IDISTRIBUTION) #define ga_sdistribution_ F77_FUNC_(ga_sdistribution,GA_SDISTRIBUTION) #define ga_zdistribution_ F77_FUNC_(ga_zdistribution,GA_ZDISTRIBUTION) #define nga_distribution_ F77_FUNC_(nga_distribution, NGA_DISTRIBUTION) #define nga_cdistribution_ F77_FUNC_(nga_cdistribution,NGA_CDISTRIBUTION) #define nga_ddistribution_ F77_FUNC_(nga_ddistribution,NGA_DDISTRIBUTION) #define nga_idistribution_ F77_FUNC_(nga_idistribution,NGA_IDISTRIBUTION) #define nga_sdistribution_ F77_FUNC_(nga_sdistribution,NGA_SDISTRIBUTION) #define nga_zdistribution_ F77_FUNC_(nga_zdistribution,NGA_ZDISTRIBUTION) #define ga_duplicate_ F77_FUNC_(ga_duplicate, GA_DUPLICATE) #define ga_cduplicate_ F77_FUNC_(ga_cduplicate,GA_CDUPLICATE) #define ga_dduplicate_ F77_FUNC_(ga_dduplicate,GA_DDUPLICATE) #define ga_iduplicate_ F77_FUNC_(ga_iduplicate,GA_IDUPLICATE) #define ga_sduplicate_ F77_FUNC_(ga_sduplicate,GA_SDUPLICATE) #define ga_zduplicate_ F77_FUNC_(ga_zduplicate,GA_ZDUPLICATE) #define nga_duplicate_ F77_FUNC_(nga_duplicate, NGA_DUPLICATE) #define nga_cduplicate_ F77_FUNC_(nga_cduplicate,NGA_CDUPLICATE) #define nga_dduplicate_ F77_FUNC_(nga_dduplicate,NGA_DDUPLICATE) #define nga_iduplicate_ F77_FUNC_(nga_iduplicate,NGA_IDUPLICATE) #define nga_sduplicate_ F77_FUNC_(nga_sduplicate,NGA_SDUPLICATE) #define nga_zduplicate_ F77_FUNC_(nga_zduplicate,NGA_ZDUPLICATE) #define ga_fill_ F77_FUNC_(ga_fill, GA_FILL) #define ga_cfill_ F77_FUNC_(ga_cfill,GA_CFILL) #define ga_dfill_ F77_FUNC_(ga_dfill,GA_DFILL) #define ga_ifill_ F77_FUNC_(ga_ifill,GA_IFILL) #define ga_sfill_ F77_FUNC_(ga_sfill,GA_SFILL) #define ga_zfill_ F77_FUNC_(ga_zfill,GA_ZFILL) #define nga_fill_ F77_FUNC_(nga_fill, NGA_FILL) #define nga_cfill_ F77_FUNC_(nga_cfill,NGA_CFILL) #define nga_dfill_ F77_FUNC_(nga_dfill,NGA_DFILL) #define nga_ifill_ F77_FUNC_(nga_ifill,NGA_IFILL) #define nga_sfill_ F77_FUNC_(nga_sfill,NGA_SFILL) #define nga_zfill_ F77_FUNC_(nga_zfill,NGA_ZFILL) #define ga_get_block_info_ F77_FUNC_(ga_get_block_info, GA_GET_BLOCK_INFO) #define ga_cget_block_info_ F77_FUNC_(ga_cget_block_info,GA_CGET_BLOCK_INFO) #define ga_dget_block_info_ F77_FUNC_(ga_dget_block_info,GA_DGET_BLOCK_INFO) #define ga_iget_block_info_ F77_FUNC_(ga_iget_block_info,GA_IGET_BLOCK_INFO) #define ga_sget_block_info_ F77_FUNC_(ga_sget_block_info,GA_SGET_BLOCK_INFO) #define ga_zget_block_info_ F77_FUNC_(ga_zget_block_info,GA_ZGET_BLOCK_INFO) #define nga_get_block_info_ F77_FUNC_(nga_get_block_info, NGA_GET_BLOCK_INFO) #define nga_cget_block_info_ F77_FUNC_(nga_cget_block_info,NGA_CGET_BLOCK_INFO) #define nga_dget_block_info_ F77_FUNC_(nga_dget_block_info,NGA_DGET_BLOCK_INFO) #define nga_iget_block_info_ F77_FUNC_(nga_iget_block_info,NGA_IGET_BLOCK_INFO) #define nga_sget_block_info_ F77_FUNC_(nga_sget_block_info,NGA_SGET_BLOCK_INFO) #define nga_zget_block_info_ F77_FUNC_(nga_zget_block_info,NGA_ZGET_BLOCK_INFO) #define ga_get_debug_ F77_FUNC_(ga_get_debug, GA_GET_DEBUG) #define ga_cget_debug_ F77_FUNC_(ga_cget_debug,GA_CGET_DEBUG) #define ga_dget_debug_ F77_FUNC_(ga_dget_debug,GA_DGET_DEBUG) #define ga_iget_debug_ F77_FUNC_(ga_iget_debug,GA_IGET_DEBUG) #define ga_sget_debug_ F77_FUNC_(ga_sget_debug,GA_SGET_DEBUG) #define ga_zget_debug_ F77_FUNC_(ga_zget_debug,GA_ZGET_DEBUG) #define nga_get_debug_ F77_FUNC_(nga_get_debug, NGA_GET_DEBUG) #define nga_cget_debug_ F77_FUNC_(nga_cget_debug,NGA_CGET_DEBUG) #define nga_dget_debug_ F77_FUNC_(nga_dget_debug,NGA_DGET_DEBUG) #define nga_iget_debug_ F77_FUNC_(nga_iget_debug,NGA_IGET_DEBUG) #define nga_sget_debug_ F77_FUNC_(nga_sget_debug,NGA_SGET_DEBUG) #define nga_zget_debug_ F77_FUNC_(nga_zget_debug,NGA_ZGET_DEBUG) #define ga_get_dimension_ F77_FUNC_(ga_get_dimension, GA_GET_DIMENSION) #define ga_cget_dimension_ F77_FUNC_(ga_cget_dimension,GA_CGET_DIMENSION) #define ga_dget_dimension_ F77_FUNC_(ga_dget_dimension,GA_DGET_DIMENSION) #define ga_iget_dimension_ F77_FUNC_(ga_iget_dimension,GA_IGET_DIMENSION) #define ga_sget_dimension_ F77_FUNC_(ga_sget_dimension,GA_SGET_DIMENSION) #define ga_zget_dimension_ F77_FUNC_(ga_zget_dimension,GA_ZGET_DIMENSION) #define nga_get_dimension_ F77_FUNC_(nga_get_dimension, NGA_GET_DIMENSION) #define nga_cget_dimension_ F77_FUNC_(nga_cget_dimension,NGA_CGET_DIMENSION) #define nga_dget_dimension_ F77_FUNC_(nga_dget_dimension,NGA_DGET_DIMENSION) #define nga_iget_dimension_ F77_FUNC_(nga_iget_dimension,NGA_IGET_DIMENSION) #define nga_sget_dimension_ F77_FUNC_(nga_sget_dimension,NGA_SGET_DIMENSION) #define nga_zget_dimension_ F77_FUNC_(nga_zget_dimension,NGA_ZGET_DIMENSION) #define ga_get_proc_grid_ F77_FUNC_(ga_get_proc_grid, GA_GET_PROC_GRID) #define ga_cget_proc_grid_ F77_FUNC_(ga_cget_proc_grid,GA_CGET_PROC_GRID) #define ga_dget_proc_grid_ F77_FUNC_(ga_dget_proc_grid,GA_DGET_PROC_GRID) #define ga_iget_proc_grid_ F77_FUNC_(ga_iget_proc_grid,GA_IGET_PROC_GRID) #define ga_sget_proc_grid_ F77_FUNC_(ga_sget_proc_grid,GA_SGET_PROC_GRID) #define ga_zget_proc_grid_ F77_FUNC_(ga_zget_proc_grid,GA_ZGET_PROC_GRID) #define nga_get_proc_grid_ F77_FUNC_(nga_get_proc_grid, NGA_GET_PROC_GRID) #define nga_cget_proc_grid_ F77_FUNC_(nga_cget_proc_grid,NGA_CGET_PROC_GRID) #define nga_dget_proc_grid_ F77_FUNC_(nga_dget_proc_grid,NGA_DGET_PROC_GRID) #define nga_iget_proc_grid_ F77_FUNC_(nga_iget_proc_grid,NGA_IGET_PROC_GRID) #define nga_sget_proc_grid_ F77_FUNC_(nga_sget_proc_grid,NGA_SGET_PROC_GRID) #define nga_zget_proc_grid_ F77_FUNC_(nga_zget_proc_grid,NGA_ZGET_PROC_GRID) #define ga_get_proc_index_ F77_FUNC_(ga_get_proc_index, GA_GET_PROC_INDEX) #define ga_cget_proc_index_ F77_FUNC_(ga_cget_proc_index,GA_CGET_PROC_INDEX) #define ga_dget_proc_index_ F77_FUNC_(ga_dget_proc_index,GA_DGET_PROC_INDEX) #define ga_iget_proc_index_ F77_FUNC_(ga_iget_proc_index,GA_IGET_PROC_INDEX) #define ga_sget_proc_index_ F77_FUNC_(ga_sget_proc_index,GA_SGET_PROC_INDEX) #define ga_zget_proc_index_ F77_FUNC_(ga_zget_proc_index,GA_ZGET_PROC_INDEX) #define nga_get_proc_index_ F77_FUNC_(nga_get_proc_index, NGA_GET_PROC_INDEX) #define nga_cget_proc_index_ F77_FUNC_(nga_cget_proc_index,NGA_CGET_PROC_INDEX) #define nga_dget_proc_index_ F77_FUNC_(nga_dget_proc_index,NGA_DGET_PROC_INDEX) #define nga_iget_proc_index_ F77_FUNC_(nga_iget_proc_index,NGA_IGET_PROC_INDEX) #define nga_sget_proc_index_ F77_FUNC_(nga_sget_proc_index,NGA_SGET_PROC_INDEX) #define nga_zget_proc_index_ F77_FUNC_(nga_zget_proc_index,NGA_ZGET_PROC_INDEX) #define ga_has_ghosts_ F77_FUNC_(ga_has_ghosts, GA_HAS_GHOSTS) #define ga_chas_ghosts_ F77_FUNC_(ga_chas_ghosts,GA_CHAS_GHOSTS) #define ga_dhas_ghosts_ F77_FUNC_(ga_dhas_ghosts,GA_DHAS_GHOSTS) #define ga_ihas_ghosts_ F77_FUNC_(ga_ihas_ghosts,GA_IHAS_GHOSTS) #define ga_shas_ghosts_ F77_FUNC_(ga_shas_ghosts,GA_SHAS_GHOSTS) #define ga_zhas_ghosts_ F77_FUNC_(ga_zhas_ghosts,GA_ZHAS_GHOSTS) #define nga_has_ghosts_ F77_FUNC_(nga_has_ghosts, NGA_HAS_GHOSTS) #define nga_chas_ghosts_ F77_FUNC_(nga_chas_ghosts,NGA_CHAS_GHOSTS) #define nga_dhas_ghosts_ F77_FUNC_(nga_dhas_ghosts,NGA_DHAS_GHOSTS) #define nga_ihas_ghosts_ F77_FUNC_(nga_ihas_ghosts,NGA_IHAS_GHOSTS) #define nga_shas_ghosts_ F77_FUNC_(nga_shas_ghosts,NGA_SHAS_GHOSTS) #define nga_zhas_ghosts_ F77_FUNC_(nga_zhas_ghosts,NGA_ZHAS_GHOSTS) #define ga_initialize_ F77_FUNC_(ga_initialize, GA_INITIALIZE) #define ga_cinitialize_ F77_FUNC_(ga_cinitialize,GA_CINITIALIZE) #define ga_dinitialize_ F77_FUNC_(ga_dinitialize,GA_DINITIALIZE) #define ga_iinitialize_ F77_FUNC_(ga_iinitialize,GA_IINITIALIZE) #define ga_sinitialize_ F77_FUNC_(ga_sinitialize,GA_SINITIALIZE) #define ga_zinitialize_ F77_FUNC_(ga_zinitialize,GA_ZINITIALIZE) #define nga_initialize_ F77_FUNC_(nga_initialize, NGA_INITIALIZE) #define nga_cinitialize_ F77_FUNC_(nga_cinitialize,NGA_CINITIALIZE) #define nga_dinitialize_ F77_FUNC_(nga_dinitialize,NGA_DINITIALIZE) #define nga_iinitialize_ F77_FUNC_(nga_iinitialize,NGA_IINITIALIZE) #define nga_sinitialize_ F77_FUNC_(nga_sinitialize,NGA_SINITIALIZE) #define nga_zinitialize_ F77_FUNC_(nga_zinitialize,NGA_ZINITIALIZE) #define ga_initialized_ F77_FUNC_(ga_initialized, GA_INITIALIZED) #define ga_cinitialized_ F77_FUNC_(ga_cinitialized,GA_CINITIALIZED) #define ga_dinitialized_ F77_FUNC_(ga_dinitialized,GA_DINITIALIZED) #define ga_iinitialized_ F77_FUNC_(ga_iinitialized,GA_IINITIALIZED) #define ga_sinitialized_ F77_FUNC_(ga_sinitialized,GA_SINITIALIZED) #define ga_zinitialized_ F77_FUNC_(ga_zinitialized,GA_ZINITIALIZED) #define nga_initialized_ F77_FUNC_(nga_initialized, NGA_INITIALIZED) #define nga_cinitialized_ F77_FUNC_(nga_cinitialized,NGA_CINITIALIZED) #define nga_dinitialized_ F77_FUNC_(nga_dinitialized,NGA_DINITIALIZED) #define nga_iinitialized_ F77_FUNC_(nga_iinitialized,NGA_IINITIALIZED) #define nga_sinitialized_ F77_FUNC_(nga_sinitialized,NGA_SINITIALIZED) #define nga_zinitialized_ F77_FUNC_(nga_zinitialized,NGA_ZINITIALIZED) #define ga_initialize_ltd_ F77_FUNC_(ga_initialize_ltd, GA_INITIALIZE_LTD) #define ga_cinitialize_ltd_ F77_FUNC_(ga_cinitialize_ltd,GA_CINITIALIZE_LTD) #define ga_dinitialize_ltd_ F77_FUNC_(ga_dinitialize_ltd,GA_DINITIALIZE_LTD) #define ga_iinitialize_ltd_ F77_FUNC_(ga_iinitialize_ltd,GA_IINITIALIZE_LTD) #define ga_sinitialize_ltd_ F77_FUNC_(ga_sinitialize_ltd,GA_SINITIALIZE_LTD) #define ga_zinitialize_ltd_ F77_FUNC_(ga_zinitialize_ltd,GA_ZINITIALIZE_LTD) #define nga_initialize_ltd_ F77_FUNC_(nga_initialize_ltd, NGA_INITIALIZE_LTD) #define nga_cinitialize_ltd_ F77_FUNC_(nga_cinitialize_ltd,NGA_CINITIALIZE_LTD) #define nga_dinitialize_ltd_ F77_FUNC_(nga_dinitialize_ltd,NGA_DINITIALIZE_LTD) #define nga_iinitialize_ltd_ F77_FUNC_(nga_iinitialize_ltd,NGA_IINITIALIZE_LTD) #define nga_sinitialize_ltd_ F77_FUNC_(nga_sinitialize_ltd,NGA_SINITIALIZE_LTD) #define nga_zinitialize_ltd_ F77_FUNC_(nga_zinitialize_ltd,NGA_ZINITIALIZE_LTD) #define ga_inquire_ F77_FUNC_(ga_inquire, GA_INQUIRE) #define ga_cinquire_ F77_FUNC_(ga_cinquire,GA_CINQUIRE) #define ga_dinquire_ F77_FUNC_(ga_dinquire,GA_DINQUIRE) #define ga_iinquire_ F77_FUNC_(ga_iinquire,GA_IINQUIRE) #define ga_sinquire_ F77_FUNC_(ga_sinquire,GA_SINQUIRE) #define ga_zinquire_ F77_FUNC_(ga_zinquire,GA_ZINQUIRE) #define nga_inquire_ F77_FUNC_(nga_inquire, NGA_INQUIRE) #define nga_cinquire_ F77_FUNC_(nga_cinquire,NGA_CINQUIRE) #define nga_dinquire_ F77_FUNC_(nga_dinquire,NGA_DINQUIRE) #define nga_iinquire_ F77_FUNC_(nga_iinquire,NGA_IINQUIRE) #define nga_sinquire_ F77_FUNC_(nga_sinquire,NGA_SINQUIRE) #define nga_zinquire_ F77_FUNC_(nga_zinquire,NGA_ZINQUIRE) #define ga_inquire_type_ F77_FUNC_(ga_inquire_type, GA_INQUIRE_TYPE) #define ga_cinquire_type_ F77_FUNC_(ga_cinquire_type,GA_CINQUIRE_TYPE) #define ga_dinquire_type_ F77_FUNC_(ga_dinquire_type,GA_DINQUIRE_TYPE) #define ga_iinquire_type_ F77_FUNC_(ga_iinquire_type,GA_IINQUIRE_TYPE) #define ga_sinquire_type_ F77_FUNC_(ga_sinquire_type,GA_SINQUIRE_TYPE) #define ga_zinquire_type_ F77_FUNC_(ga_zinquire_type,GA_ZINQUIRE_TYPE) #define nga_inquire_type_ F77_FUNC_(nga_inquire_type, NGA_INQUIRE_TYPE) #define nga_cinquire_type_ F77_FUNC_(nga_cinquire_type,NGA_CINQUIRE_TYPE) #define nga_dinquire_type_ F77_FUNC_(nga_dinquire_type,NGA_DINQUIRE_TYPE) #define nga_iinquire_type_ F77_FUNC_(nga_iinquire_type,NGA_IINQUIRE_TYPE) #define nga_sinquire_type_ F77_FUNC_(nga_sinquire_type,NGA_SINQUIRE_TYPE) #define nga_zinquire_type_ F77_FUNC_(nga_zinquire_type,NGA_ZINQUIRE_TYPE) #define ga_inquire_memory_ F77_FUNC_(ga_inquire_memory, GA_INQUIRE_MEMORY) #define ga_cinquire_memory_ F77_FUNC_(ga_cinquire_memory,GA_CINQUIRE_MEMORY) #define ga_dinquire_memory_ F77_FUNC_(ga_dinquire_memory,GA_DINQUIRE_MEMORY) #define ga_iinquire_memory_ F77_FUNC_(ga_iinquire_memory,GA_IINQUIRE_MEMORY) #define ga_sinquire_memory_ F77_FUNC_(ga_sinquire_memory,GA_SINQUIRE_MEMORY) #define ga_zinquire_memory_ F77_FUNC_(ga_zinquire_memory,GA_ZINQUIRE_MEMORY) #define nga_inquire_memory_ F77_FUNC_(nga_inquire_memory, NGA_INQUIRE_MEMORY) #define nga_cinquire_memory_ F77_FUNC_(nga_cinquire_memory,NGA_CINQUIRE_MEMORY) #define nga_dinquire_memory_ F77_FUNC_(nga_dinquire_memory,NGA_DINQUIRE_MEMORY) #define nga_iinquire_memory_ F77_FUNC_(nga_iinquire_memory,NGA_IINQUIRE_MEMORY) #define nga_sinquire_memory_ F77_FUNC_(nga_sinquire_memory,NGA_SINQUIRE_MEMORY) #define nga_zinquire_memory_ F77_FUNC_(nga_zinquire_memory,NGA_ZINQUIRE_MEMORY) #define ga_inquire_name_ F77_FUNC_(ga_inquire_name, GA_INQUIRE_NAME) #define ga_cinquire_name_ F77_FUNC_(ga_cinquire_name,GA_CINQUIRE_NAME) #define ga_dinquire_name_ F77_FUNC_(ga_dinquire_name,GA_DINQUIRE_NAME) #define ga_iinquire_name_ F77_FUNC_(ga_iinquire_name,GA_IINQUIRE_NAME) #define ga_sinquire_name_ F77_FUNC_(ga_sinquire_name,GA_SINQUIRE_NAME) #define ga_zinquire_name_ F77_FUNC_(ga_zinquire_name,GA_ZINQUIRE_NAME) #define nga_inquire_name_ F77_FUNC_(nga_inquire_name, NGA_INQUIRE_NAME) #define nga_cinquire_name_ F77_FUNC_(nga_cinquire_name,NGA_CINQUIRE_NAME) #define nga_dinquire_name_ F77_FUNC_(nga_dinquire_name,NGA_DINQUIRE_NAME) #define nga_iinquire_name_ F77_FUNC_(nga_iinquire_name,NGA_IINQUIRE_NAME) #define nga_sinquire_name_ F77_FUNC_(nga_sinquire_name,NGA_SINQUIRE_NAME) #define nga_zinquire_name_ F77_FUNC_(nga_zinquire_name,NGA_ZINQUIRE_NAME) #define ga_is_mirrored_ F77_FUNC_(ga_is_mirrored, GA_IS_MIRRORED) #define ga_cis_mirrored_ F77_FUNC_(ga_cis_mirrored,GA_CIS_MIRRORED) #define ga_dis_mirrored_ F77_FUNC_(ga_dis_mirrored,GA_DIS_MIRRORED) #define ga_iis_mirrored_ F77_FUNC_(ga_iis_mirrored,GA_IIS_MIRRORED) #define ga_sis_mirrored_ F77_FUNC_(ga_sis_mirrored,GA_SIS_MIRRORED) #define ga_zis_mirrored_ F77_FUNC_(ga_zis_mirrored,GA_ZIS_MIRRORED) #define nga_is_mirrored_ F77_FUNC_(nga_is_mirrored, NGA_IS_MIRRORED) #define nga_cis_mirrored_ F77_FUNC_(nga_cis_mirrored,NGA_CIS_MIRRORED) #define nga_dis_mirrored_ F77_FUNC_(nga_dis_mirrored,NGA_DIS_MIRRORED) #define nga_iis_mirrored_ F77_FUNC_(nga_iis_mirrored,NGA_IIS_MIRRORED) #define nga_sis_mirrored_ F77_FUNC_(nga_sis_mirrored,NGA_SIS_MIRRORED) #define nga_zis_mirrored_ F77_FUNC_(nga_zis_mirrored,NGA_ZIS_MIRRORED) #define ga_list_nodeid_ F77_FUNC_(ga_list_nodeid, GA_LIST_NODEID) #define ga_clist_nodeid_ F77_FUNC_(ga_clist_nodeid,GA_CLIST_NODEID) #define ga_dlist_nodeid_ F77_FUNC_(ga_dlist_nodeid,GA_DLIST_NODEID) #define ga_ilist_nodeid_ F77_FUNC_(ga_ilist_nodeid,GA_ILIST_NODEID) #define ga_slist_nodeid_ F77_FUNC_(ga_slist_nodeid,GA_SLIST_NODEID) #define ga_zlist_nodeid_ F77_FUNC_(ga_zlist_nodeid,GA_ZLIST_NODEID) #define nga_list_nodeid_ F77_FUNC_(nga_list_nodeid, NGA_LIST_NODEID) #define nga_clist_nodeid_ F77_FUNC_(nga_clist_nodeid,NGA_CLIST_NODEID) #define nga_dlist_nodeid_ F77_FUNC_(nga_dlist_nodeid,NGA_DLIST_NODEID) #define nga_ilist_nodeid_ F77_FUNC_(nga_ilist_nodeid,NGA_ILIST_NODEID) #define nga_slist_nodeid_ F77_FUNC_(nga_slist_nodeid,NGA_SLIST_NODEID) #define nga_zlist_nodeid_ F77_FUNC_(nga_zlist_nodeid,NGA_ZLIST_NODEID) #define ga_locate_ F77_FUNC_(ga_locate, GA_LOCATE) #define ga_clocate_ F77_FUNC_(ga_clocate,GA_CLOCATE) #define ga_dlocate_ F77_FUNC_(ga_dlocate,GA_DLOCATE) #define ga_ilocate_ F77_FUNC_(ga_ilocate,GA_ILOCATE) #define ga_slocate_ F77_FUNC_(ga_slocate,GA_SLOCATE) #define ga_zlocate_ F77_FUNC_(ga_zlocate,GA_ZLOCATE) #define nga_locate_ F77_FUNC_(nga_locate, NGA_LOCATE) #define nga_clocate_ F77_FUNC_(nga_clocate,NGA_CLOCATE) #define nga_dlocate_ F77_FUNC_(nga_dlocate,NGA_DLOCATE) #define nga_ilocate_ F77_FUNC_(nga_ilocate,NGA_ILOCATE) #define nga_slocate_ F77_FUNC_(nga_slocate,NGA_SLOCATE) #define nga_zlocate_ F77_FUNC_(nga_zlocate,NGA_ZLOCATE) #define ga_locate_num_blocks_ F77_FUNC_(ga_locate_num_blocks, GA_LOCATE_NUM_BLOCKS) #define ga_clocate_num_blocks_ F77_FUNC_(ga_clocate_num_blocks,GA_CLOCATE_NUM_BLOCKS) #define ga_dlocate_num_blocks_ F77_FUNC_(ga_dlocate_num_blocks,GA_DLOCATE_NUM_BLOCKS) #define ga_ilocate_num_blocks_ F77_FUNC_(ga_ilocate_num_blocks,GA_ILOCATE_NUM_BLOCKS) #define ga_slocate_num_blocks_ F77_FUNC_(ga_slocate_num_blocks,GA_SLOCATE_NUM_BLOCKS) #define ga_zlocate_num_blocks_ F77_FUNC_(ga_zlocate_num_blocks,GA_ZLOCATE_NUM_BLOCKS) #define nga_locate_num_blocks_ F77_FUNC_(nga_locate_num_blocks, NGA_LOCATE_NUM_BLOCKS) #define nga_clocate_num_blocks_ F77_FUNC_(nga_clocate_num_blocks,NGA_CLOCATE_NUM_BLOCKS) #define nga_dlocate_num_blocks_ F77_FUNC_(nga_dlocate_num_blocks,NGA_DLOCATE_NUM_BLOCKS) #define nga_ilocate_num_blocks_ F77_FUNC_(nga_ilocate_num_blocks,NGA_ILOCATE_NUM_BLOCKS) #define nga_slocate_num_blocks_ F77_FUNC_(nga_slocate_num_blocks,NGA_SLOCATE_NUM_BLOCKS) #define nga_zlocate_num_blocks_ F77_FUNC_(nga_zlocate_num_blocks,NGA_ZLOCATE_NUM_BLOCKS) #define ga_locate_nnodes_ F77_FUNC_(ga_locate_nnodes, GA_LOCATE_NNODES) #define ga_clocate_nnodes_ F77_FUNC_(ga_clocate_nnodes,GA_CLOCATE_NNODES) #define ga_dlocate_nnodes_ F77_FUNC_(ga_dlocate_nnodes,GA_DLOCATE_NNODES) #define ga_ilocate_nnodes_ F77_FUNC_(ga_ilocate_nnodes,GA_ILOCATE_NNODES) #define ga_slocate_nnodes_ F77_FUNC_(ga_slocate_nnodes,GA_SLOCATE_NNODES) #define ga_zlocate_nnodes_ F77_FUNC_(ga_zlocate_nnodes,GA_ZLOCATE_NNODES) #define nga_locate_nnodes_ F77_FUNC_(nga_locate_nnodes, NGA_LOCATE_NNODES) #define nga_clocate_nnodes_ F77_FUNC_(nga_clocate_nnodes,NGA_CLOCATE_NNODES) #define nga_dlocate_nnodes_ F77_FUNC_(nga_dlocate_nnodes,NGA_DLOCATE_NNODES) #define nga_ilocate_nnodes_ F77_FUNC_(nga_ilocate_nnodes,NGA_ILOCATE_NNODES) #define nga_slocate_nnodes_ F77_FUNC_(nga_slocate_nnodes,NGA_SLOCATE_NNODES) #define nga_zlocate_nnodes_ F77_FUNC_(nga_zlocate_nnodes,NGA_ZLOCATE_NNODES) #define ga_locate_region_ F77_FUNC_(ga_locate_region, GA_LOCATE_REGION) #define ga_clocate_region_ F77_FUNC_(ga_clocate_region,GA_CLOCATE_REGION) #define ga_dlocate_region_ F77_FUNC_(ga_dlocate_region,GA_DLOCATE_REGION) #define ga_ilocate_region_ F77_FUNC_(ga_ilocate_region,GA_ILOCATE_REGION) #define ga_slocate_region_ F77_FUNC_(ga_slocate_region,GA_SLOCATE_REGION) #define ga_zlocate_region_ F77_FUNC_(ga_zlocate_region,GA_ZLOCATE_REGION) #define nga_locate_region_ F77_FUNC_(nga_locate_region, NGA_LOCATE_REGION) #define nga_clocate_region_ F77_FUNC_(nga_clocate_region,NGA_CLOCATE_REGION) #define nga_dlocate_region_ F77_FUNC_(nga_dlocate_region,NGA_DLOCATE_REGION) #define nga_ilocate_region_ F77_FUNC_(nga_ilocate_region,NGA_ILOCATE_REGION) #define nga_slocate_region_ F77_FUNC_(nga_slocate_region,NGA_SLOCATE_REGION) #define nga_zlocate_region_ F77_FUNC_(nga_zlocate_region,NGA_ZLOCATE_REGION) #define ga_lock_ F77_FUNC_(ga_lock, GA_LOCK) #define ga_clock_ F77_FUNC_(ga_clock,GA_CLOCK) #define ga_dlock_ F77_FUNC_(ga_dlock,GA_DLOCK) #define ga_ilock_ F77_FUNC_(ga_ilock,GA_ILOCK) #define ga_slock_ F77_FUNC_(ga_slock,GA_SLOCK) #define ga_zlock_ F77_FUNC_(ga_zlock,GA_ZLOCK) #define nga_lock_ F77_FUNC_(nga_lock, NGA_LOCK) #define nga_clock_ F77_FUNC_(nga_clock,NGA_CLOCK) #define nga_dlock_ F77_FUNC_(nga_dlock,NGA_DLOCK) #define nga_ilock_ F77_FUNC_(nga_ilock,NGA_ILOCK) #define nga_slock_ F77_FUNC_(nga_slock,NGA_SLOCK) #define nga_zlock_ F77_FUNC_(nga_zlock,NGA_ZLOCK) #define ga_ndim_ F77_FUNC_(ga_ndim, GA_NDIM) #define ga_cndim_ F77_FUNC_(ga_cndim,GA_CNDIM) #define ga_dndim_ F77_FUNC_(ga_dndim,GA_DNDIM) #define ga_indim_ F77_FUNC_(ga_indim,GA_INDIM) #define ga_sndim_ F77_FUNC_(ga_sndim,GA_SNDIM) #define ga_zndim_ F77_FUNC_(ga_zndim,GA_ZNDIM) #define nga_ndim_ F77_FUNC_(nga_ndim, NGA_NDIM) #define nga_cndim_ F77_FUNC_(nga_cndim,NGA_CNDIM) #define nga_dndim_ F77_FUNC_(nga_dndim,NGA_DNDIM) #define nga_indim_ F77_FUNC_(nga_indim,NGA_INDIM) #define nga_sndim_ F77_FUNC_(nga_sndim,NGA_SNDIM) #define nga_zndim_ F77_FUNC_(nga_zndim,NGA_ZNDIM) #define ga_mask_sync_ F77_FUNC_(ga_mask_sync, GA_MASK_SYNC) #define ga_cmask_sync_ F77_FUNC_(ga_cmask_sync,GA_CMASK_SYNC) #define ga_dmask_sync_ F77_FUNC_(ga_dmask_sync,GA_DMASK_SYNC) #define ga_imask_sync_ F77_FUNC_(ga_imask_sync,GA_IMASK_SYNC) #define ga_smask_sync_ F77_FUNC_(ga_smask_sync,GA_SMASK_SYNC) #define ga_zmask_sync_ F77_FUNC_(ga_zmask_sync,GA_ZMASK_SYNC) #define nga_mask_sync_ F77_FUNC_(nga_mask_sync, NGA_MASK_SYNC) #define nga_cmask_sync_ F77_FUNC_(nga_cmask_sync,NGA_CMASK_SYNC) #define nga_dmask_sync_ F77_FUNC_(nga_dmask_sync,NGA_DMASK_SYNC) #define nga_imask_sync_ F77_FUNC_(nga_imask_sync,NGA_IMASK_SYNC) #define nga_smask_sync_ F77_FUNC_(nga_smask_sync,NGA_SMASK_SYNC) #define nga_zmask_sync_ F77_FUNC_(nga_zmask_sync,NGA_ZMASK_SYNC) #define ga_memory_avail_ F77_FUNC_(ga_memory_avail, GA_MEMORY_AVAIL) #define ga_cmemory_avail_ F77_FUNC_(ga_cmemory_avail,GA_CMEMORY_AVAIL) #define ga_dmemory_avail_ F77_FUNC_(ga_dmemory_avail,GA_DMEMORY_AVAIL) #define ga_imemory_avail_ F77_FUNC_(ga_imemory_avail,GA_IMEMORY_AVAIL) #define ga_smemory_avail_ F77_FUNC_(ga_smemory_avail,GA_SMEMORY_AVAIL) #define ga_zmemory_avail_ F77_FUNC_(ga_zmemory_avail,GA_ZMEMORY_AVAIL) #define nga_memory_avail_ F77_FUNC_(nga_memory_avail, NGA_MEMORY_AVAIL) #define nga_cmemory_avail_ F77_FUNC_(nga_cmemory_avail,NGA_CMEMORY_AVAIL) #define nga_dmemory_avail_ F77_FUNC_(nga_dmemory_avail,NGA_DMEMORY_AVAIL) #define nga_imemory_avail_ F77_FUNC_(nga_imemory_avail,NGA_IMEMORY_AVAIL) #define nga_smemory_avail_ F77_FUNC_(nga_smemory_avail,NGA_SMEMORY_AVAIL) #define nga_zmemory_avail_ F77_FUNC_(nga_zmemory_avail,NGA_ZMEMORY_AVAIL) #define ga_memory_limited_ F77_FUNC_(ga_memory_limited, GA_MEMORY_LIMITED) #define ga_cmemory_limited_ F77_FUNC_(ga_cmemory_limited,GA_CMEMORY_LIMITED) #define ga_dmemory_limited_ F77_FUNC_(ga_dmemory_limited,GA_DMEMORY_LIMITED) #define ga_imemory_limited_ F77_FUNC_(ga_imemory_limited,GA_IMEMORY_LIMITED) #define ga_smemory_limited_ F77_FUNC_(ga_smemory_limited,GA_SMEMORY_LIMITED) #define ga_zmemory_limited_ F77_FUNC_(ga_zmemory_limited,GA_ZMEMORY_LIMITED) #define nga_memory_limited_ F77_FUNC_(nga_memory_limited, NGA_MEMORY_LIMITED) #define nga_cmemory_limited_ F77_FUNC_(nga_cmemory_limited,NGA_CMEMORY_LIMITED) #define nga_dmemory_limited_ F77_FUNC_(nga_dmemory_limited,NGA_DMEMORY_LIMITED) #define nga_imemory_limited_ F77_FUNC_(nga_imemory_limited,NGA_IMEMORY_LIMITED) #define nga_smemory_limited_ F77_FUNC_(nga_smemory_limited,NGA_SMEMORY_LIMITED) #define nga_zmemory_limited_ F77_FUNC_(nga_zmemory_limited,NGA_ZMEMORY_LIMITED) #define ga_merge_distr_patch_ F77_FUNC_(ga_merge_distr_patch, GA_MERGE_DISTR_PATCH) #define ga_cmerge_distr_patch_ F77_FUNC_(ga_cmerge_distr_patch,GA_CMERGE_DISTR_PATCH) #define ga_dmerge_distr_patch_ F77_FUNC_(ga_dmerge_distr_patch,GA_DMERGE_DISTR_PATCH) #define ga_imerge_distr_patch_ F77_FUNC_(ga_imerge_distr_patch,GA_IMERGE_DISTR_PATCH) #define ga_smerge_distr_patch_ F77_FUNC_(ga_smerge_distr_patch,GA_SMERGE_DISTR_PATCH) #define ga_zmerge_distr_patch_ F77_FUNC_(ga_zmerge_distr_patch,GA_ZMERGE_DISTR_PATCH) #define nga_merge_distr_patch_ F77_FUNC_(nga_merge_distr_patch, NGA_MERGE_DISTR_PATCH) #define nga_cmerge_distr_patch_ F77_FUNC_(nga_cmerge_distr_patch,NGA_CMERGE_DISTR_PATCH) #define nga_dmerge_distr_patch_ F77_FUNC_(nga_dmerge_distr_patch,NGA_DMERGE_DISTR_PATCH) #define nga_imerge_distr_patch_ F77_FUNC_(nga_imerge_distr_patch,NGA_IMERGE_DISTR_PATCH) #define nga_smerge_distr_patch_ F77_FUNC_(nga_smerge_distr_patch,NGA_SMERGE_DISTR_PATCH) #define nga_zmerge_distr_patch_ F77_FUNC_(nga_zmerge_distr_patch,NGA_ZMERGE_DISTR_PATCH) #define ga_merge_mirrored_ F77_FUNC_(ga_merge_mirrored, GA_MERGE_MIRRORED) #define ga_cmerge_mirrored_ F77_FUNC_(ga_cmerge_mirrored,GA_CMERGE_MIRRORED) #define ga_dmerge_mirrored_ F77_FUNC_(ga_dmerge_mirrored,GA_DMERGE_MIRRORED) #define ga_imerge_mirrored_ F77_FUNC_(ga_imerge_mirrored,GA_IMERGE_MIRRORED) #define ga_smerge_mirrored_ F77_FUNC_(ga_smerge_mirrored,GA_SMERGE_MIRRORED) #define ga_zmerge_mirrored_ F77_FUNC_(ga_zmerge_mirrored,GA_ZMERGE_MIRRORED) #define nga_merge_mirrored_ F77_FUNC_(nga_merge_mirrored, NGA_MERGE_MIRRORED) #define nga_cmerge_mirrored_ F77_FUNC_(nga_cmerge_mirrored,NGA_CMERGE_MIRRORED) #define nga_dmerge_mirrored_ F77_FUNC_(nga_dmerge_mirrored,NGA_DMERGE_MIRRORED) #define nga_imerge_mirrored_ F77_FUNC_(nga_imerge_mirrored,NGA_IMERGE_MIRRORED) #define nga_smerge_mirrored_ F77_FUNC_(nga_smerge_mirrored,NGA_SMERGE_MIRRORED) #define nga_zmerge_mirrored_ F77_FUNC_(nga_zmerge_mirrored,NGA_ZMERGE_MIRRORED) #define ga_nblock_ F77_FUNC_(ga_nblock, GA_NBLOCK) #define ga_cnblock_ F77_FUNC_(ga_cnblock,GA_CNBLOCK) #define ga_dnblock_ F77_FUNC_(ga_dnblock,GA_DNBLOCK) #define ga_inblock_ F77_FUNC_(ga_inblock,GA_INBLOCK) #define ga_snblock_ F77_FUNC_(ga_snblock,GA_SNBLOCK) #define ga_znblock_ F77_FUNC_(ga_znblock,GA_ZNBLOCK) #define nga_nblock_ F77_FUNC_(nga_nblock, NGA_NBLOCK) #define nga_cnblock_ F77_FUNC_(nga_cnblock,NGA_CNBLOCK) #define nga_dnblock_ F77_FUNC_(nga_dnblock,NGA_DNBLOCK) #define nga_inblock_ F77_FUNC_(nga_inblock,NGA_INBLOCK) #define nga_snblock_ F77_FUNC_(nga_snblock,NGA_SNBLOCK) #define nga_znblock_ F77_FUNC_(nga_znblock,NGA_ZNBLOCK) #define ga_nnodes_ F77_FUNC_(ga_nnodes, GA_NNODES) #define ga_cnnodes_ F77_FUNC_(ga_cnnodes,GA_CNNODES) #define ga_dnnodes_ F77_FUNC_(ga_dnnodes,GA_DNNODES) #define ga_innodes_ F77_FUNC_(ga_innodes,GA_INNODES) #define ga_snnodes_ F77_FUNC_(ga_snnodes,GA_SNNODES) #define ga_znnodes_ F77_FUNC_(ga_znnodes,GA_ZNNODES) #define nga_nnodes_ F77_FUNC_(nga_nnodes, NGA_NNODES) #define nga_cnnodes_ F77_FUNC_(nga_cnnodes,NGA_CNNODES) #define nga_dnnodes_ F77_FUNC_(nga_dnnodes,NGA_DNNODES) #define nga_innodes_ F77_FUNC_(nga_innodes,NGA_INNODES) #define nga_snnodes_ F77_FUNC_(nga_snnodes,NGA_SNNODES) #define nga_znnodes_ F77_FUNC_(nga_znnodes,NGA_ZNNODES) #define ga_nodeid_ F77_FUNC_(ga_nodeid, GA_NODEID) #define ga_cnodeid_ F77_FUNC_(ga_cnodeid,GA_CNODEID) #define ga_dnodeid_ F77_FUNC_(ga_dnodeid,GA_DNODEID) #define ga_inodeid_ F77_FUNC_(ga_inodeid,GA_INODEID) #define ga_snodeid_ F77_FUNC_(ga_snodeid,GA_SNODEID) #define ga_znodeid_ F77_FUNC_(ga_znodeid,GA_ZNODEID) #define nga_nodeid_ F77_FUNC_(nga_nodeid, NGA_NODEID) #define nga_cnodeid_ F77_FUNC_(nga_cnodeid,NGA_CNODEID) #define nga_dnodeid_ F77_FUNC_(nga_dnodeid,NGA_DNODEID) #define nga_inodeid_ F77_FUNC_(nga_inodeid,NGA_INODEID) #define nga_snodeid_ F77_FUNC_(nga_snodeid,NGA_SNODEID) #define nga_znodeid_ F77_FUNC_(nga_znodeid,NGA_ZNODEID) #define ga_pgroup_absolute_id_ F77_FUNC_(ga_pgroup_absolute_id, GA_PGROUP_ABSOLUTE_ID) #define ga_cpgroup_absolute_id_ F77_FUNC_(ga_cpgroup_absolute_id,GA_CPGROUP_ABSOLUTE_ID) #define ga_dpgroup_absolute_id_ F77_FUNC_(ga_dpgroup_absolute_id,GA_DPGROUP_ABSOLUTE_ID) #define ga_ipgroup_absolute_id_ F77_FUNC_(ga_ipgroup_absolute_id,GA_IPGROUP_ABSOLUTE_ID) #define ga_spgroup_absolute_id_ F77_FUNC_(ga_spgroup_absolute_id,GA_SPGROUP_ABSOLUTE_ID) #define ga_zpgroup_absolute_id_ F77_FUNC_(ga_zpgroup_absolute_id,GA_ZPGROUP_ABSOLUTE_ID) #define nga_pgroup_absolute_id_ F77_FUNC_(nga_pgroup_absolute_id, NGA_PGROUP_ABSOLUTE_ID) #define nga_cpgroup_absolute_id_ F77_FUNC_(nga_cpgroup_absolute_id,NGA_CPGROUP_ABSOLUTE_ID) #define nga_dpgroup_absolute_id_ F77_FUNC_(nga_dpgroup_absolute_id,NGA_DPGROUP_ABSOLUTE_ID) #define nga_ipgroup_absolute_id_ F77_FUNC_(nga_ipgroup_absolute_id,NGA_IPGROUP_ABSOLUTE_ID) #define nga_spgroup_absolute_id_ F77_FUNC_(nga_spgroup_absolute_id,NGA_SPGROUP_ABSOLUTE_ID) #define nga_zpgroup_absolute_id_ F77_FUNC_(nga_zpgroup_absolute_id,NGA_ZPGROUP_ABSOLUTE_ID) #define ga_pgroup_create_ F77_FUNC_(ga_pgroup_create, GA_PGROUP_CREATE) #define ga_cpgroup_create_ F77_FUNC_(ga_cpgroup_create,GA_CPGROUP_CREATE) #define ga_dpgroup_create_ F77_FUNC_(ga_dpgroup_create,GA_DPGROUP_CREATE) #define ga_ipgroup_create_ F77_FUNC_(ga_ipgroup_create,GA_IPGROUP_CREATE) #define ga_spgroup_create_ F77_FUNC_(ga_spgroup_create,GA_SPGROUP_CREATE) #define ga_zpgroup_create_ F77_FUNC_(ga_zpgroup_create,GA_ZPGROUP_CREATE) #define nga_pgroup_create_ F77_FUNC_(nga_pgroup_create, NGA_PGROUP_CREATE) #define nga_cpgroup_create_ F77_FUNC_(nga_cpgroup_create,NGA_CPGROUP_CREATE) #define nga_dpgroup_create_ F77_FUNC_(nga_dpgroup_create,NGA_DPGROUP_CREATE) #define nga_ipgroup_create_ F77_FUNC_(nga_ipgroup_create,NGA_IPGROUP_CREATE) #define nga_spgroup_create_ F77_FUNC_(nga_spgroup_create,NGA_SPGROUP_CREATE) #define nga_zpgroup_create_ F77_FUNC_(nga_zpgroup_create,NGA_ZPGROUP_CREATE) #define ga_pgroup_destroy_ F77_FUNC_(ga_pgroup_destroy, GA_PGROUP_DESTROY) #define ga_cpgroup_destroy_ F77_FUNC_(ga_cpgroup_destroy,GA_CPGROUP_DESTROY) #define ga_dpgroup_destroy_ F77_FUNC_(ga_dpgroup_destroy,GA_DPGROUP_DESTROY) #define ga_ipgroup_destroy_ F77_FUNC_(ga_ipgroup_destroy,GA_IPGROUP_DESTROY) #define ga_spgroup_destroy_ F77_FUNC_(ga_spgroup_destroy,GA_SPGROUP_DESTROY) #define ga_zpgroup_destroy_ F77_FUNC_(ga_zpgroup_destroy,GA_ZPGROUP_DESTROY) #define nga_pgroup_destroy_ F77_FUNC_(nga_pgroup_destroy, NGA_PGROUP_DESTROY) #define nga_cpgroup_destroy_ F77_FUNC_(nga_cpgroup_destroy,NGA_CPGROUP_DESTROY) #define nga_dpgroup_destroy_ F77_FUNC_(nga_dpgroup_destroy,NGA_DPGROUP_DESTROY) #define nga_ipgroup_destroy_ F77_FUNC_(nga_ipgroup_destroy,NGA_IPGROUP_DESTROY) #define nga_spgroup_destroy_ F77_FUNC_(nga_spgroup_destroy,NGA_SPGROUP_DESTROY) #define nga_zpgroup_destroy_ F77_FUNC_(nga_zpgroup_destroy,NGA_ZPGROUP_DESTROY) #define ga_pgroup_get_default_ F77_FUNC_(ga_pgroup_get_default, GA_PGROUP_GET_DEFAULT) #define ga_cpgroup_get_default_ F77_FUNC_(ga_cpgroup_get_default,GA_CPGROUP_GET_DEFAULT) #define ga_dpgroup_get_default_ F77_FUNC_(ga_dpgroup_get_default,GA_DPGROUP_GET_DEFAULT) #define ga_ipgroup_get_default_ F77_FUNC_(ga_ipgroup_get_default,GA_IPGROUP_GET_DEFAULT) #define ga_spgroup_get_default_ F77_FUNC_(ga_spgroup_get_default,GA_SPGROUP_GET_DEFAULT) #define ga_zpgroup_get_default_ F77_FUNC_(ga_zpgroup_get_default,GA_ZPGROUP_GET_DEFAULT) #define nga_pgroup_get_default_ F77_FUNC_(nga_pgroup_get_default, NGA_PGROUP_GET_DEFAULT) #define nga_cpgroup_get_default_ F77_FUNC_(nga_cpgroup_get_default,NGA_CPGROUP_GET_DEFAULT) #define nga_dpgroup_get_default_ F77_FUNC_(nga_dpgroup_get_default,NGA_DPGROUP_GET_DEFAULT) #define nga_ipgroup_get_default_ F77_FUNC_(nga_ipgroup_get_default,NGA_IPGROUP_GET_DEFAULT) #define nga_spgroup_get_default_ F77_FUNC_(nga_spgroup_get_default,NGA_SPGROUP_GET_DEFAULT) #define nga_zpgroup_get_default_ F77_FUNC_(nga_zpgroup_get_default,NGA_ZPGROUP_GET_DEFAULT) #define ga_pgroup_get_mirror_ F77_FUNC_(ga_pgroup_get_mirror, GA_PGROUP_GET_MIRROR) #define ga_cpgroup_get_mirror_ F77_FUNC_(ga_cpgroup_get_mirror,GA_CPGROUP_GET_MIRROR) #define ga_dpgroup_get_mirror_ F77_FUNC_(ga_dpgroup_get_mirror,GA_DPGROUP_GET_MIRROR) #define ga_ipgroup_get_mirror_ F77_FUNC_(ga_ipgroup_get_mirror,GA_IPGROUP_GET_MIRROR) #define ga_spgroup_get_mirror_ F77_FUNC_(ga_spgroup_get_mirror,GA_SPGROUP_GET_MIRROR) #define ga_zpgroup_get_mirror_ F77_FUNC_(ga_zpgroup_get_mirror,GA_ZPGROUP_GET_MIRROR) #define nga_pgroup_get_mirror_ F77_FUNC_(nga_pgroup_get_mirror, NGA_PGROUP_GET_MIRROR) #define nga_cpgroup_get_mirror_ F77_FUNC_(nga_cpgroup_get_mirror,NGA_CPGROUP_GET_MIRROR) #define nga_dpgroup_get_mirror_ F77_FUNC_(nga_dpgroup_get_mirror,NGA_DPGROUP_GET_MIRROR) #define nga_ipgroup_get_mirror_ F77_FUNC_(nga_ipgroup_get_mirror,NGA_IPGROUP_GET_MIRROR) #define nga_spgroup_get_mirror_ F77_FUNC_(nga_spgroup_get_mirror,NGA_SPGROUP_GET_MIRROR) #define nga_zpgroup_get_mirror_ F77_FUNC_(nga_zpgroup_get_mirror,NGA_ZPGROUP_GET_MIRROR) #define ga_pgroup_get_world_ F77_FUNC_(ga_pgroup_get_world, GA_PGROUP_GET_WORLD) #define ga_cpgroup_get_world_ F77_FUNC_(ga_cpgroup_get_world,GA_CPGROUP_GET_WORLD) #define ga_dpgroup_get_world_ F77_FUNC_(ga_dpgroup_get_world,GA_DPGROUP_GET_WORLD) #define ga_ipgroup_get_world_ F77_FUNC_(ga_ipgroup_get_world,GA_IPGROUP_GET_WORLD) #define ga_spgroup_get_world_ F77_FUNC_(ga_spgroup_get_world,GA_SPGROUP_GET_WORLD) #define ga_zpgroup_get_world_ F77_FUNC_(ga_zpgroup_get_world,GA_ZPGROUP_GET_WORLD) #define nga_pgroup_get_world_ F77_FUNC_(nga_pgroup_get_world, NGA_PGROUP_GET_WORLD) #define nga_cpgroup_get_world_ F77_FUNC_(nga_cpgroup_get_world,NGA_CPGROUP_GET_WORLD) #define nga_dpgroup_get_world_ F77_FUNC_(nga_dpgroup_get_world,NGA_DPGROUP_GET_WORLD) #define nga_ipgroup_get_world_ F77_FUNC_(nga_ipgroup_get_world,NGA_IPGROUP_GET_WORLD) #define nga_spgroup_get_world_ F77_FUNC_(nga_spgroup_get_world,NGA_SPGROUP_GET_WORLD) #define nga_zpgroup_get_world_ F77_FUNC_(nga_zpgroup_get_world,NGA_ZPGROUP_GET_WORLD) #define ga_pgroup_set_default_ F77_FUNC_(ga_pgroup_set_default, GA_PGROUP_SET_DEFAULT) #define ga_cpgroup_set_default_ F77_FUNC_(ga_cpgroup_set_default,GA_CPGROUP_SET_DEFAULT) #define ga_dpgroup_set_default_ F77_FUNC_(ga_dpgroup_set_default,GA_DPGROUP_SET_DEFAULT) #define ga_ipgroup_set_default_ F77_FUNC_(ga_ipgroup_set_default,GA_IPGROUP_SET_DEFAULT) #define ga_spgroup_set_default_ F77_FUNC_(ga_spgroup_set_default,GA_SPGROUP_SET_DEFAULT) #define ga_zpgroup_set_default_ F77_FUNC_(ga_zpgroup_set_default,GA_ZPGROUP_SET_DEFAULT) #define nga_pgroup_set_default_ F77_FUNC_(nga_pgroup_set_default, NGA_PGROUP_SET_DEFAULT) #define nga_cpgroup_set_default_ F77_FUNC_(nga_cpgroup_set_default,NGA_CPGROUP_SET_DEFAULT) #define nga_dpgroup_set_default_ F77_FUNC_(nga_dpgroup_set_default,NGA_DPGROUP_SET_DEFAULT) #define nga_ipgroup_set_default_ F77_FUNC_(nga_ipgroup_set_default,NGA_IPGROUP_SET_DEFAULT) #define nga_spgroup_set_default_ F77_FUNC_(nga_spgroup_set_default,NGA_SPGROUP_SET_DEFAULT) #define nga_zpgroup_set_default_ F77_FUNC_(nga_zpgroup_set_default,NGA_ZPGROUP_SET_DEFAULT) #define ga_pgroup_split_ F77_FUNC_(ga_pgroup_split, GA_PGROUP_SPLIT) #define ga_cpgroup_split_ F77_FUNC_(ga_cpgroup_split,GA_CPGROUP_SPLIT) #define ga_dpgroup_split_ F77_FUNC_(ga_dpgroup_split,GA_DPGROUP_SPLIT) #define ga_ipgroup_split_ F77_FUNC_(ga_ipgroup_split,GA_IPGROUP_SPLIT) #define ga_spgroup_split_ F77_FUNC_(ga_spgroup_split,GA_SPGROUP_SPLIT) #define ga_zpgroup_split_ F77_FUNC_(ga_zpgroup_split,GA_ZPGROUP_SPLIT) #define nga_pgroup_split_ F77_FUNC_(nga_pgroup_split, NGA_PGROUP_SPLIT) #define nga_cpgroup_split_ F77_FUNC_(nga_cpgroup_split,NGA_CPGROUP_SPLIT) #define nga_dpgroup_split_ F77_FUNC_(nga_dpgroup_split,NGA_DPGROUP_SPLIT) #define nga_ipgroup_split_ F77_FUNC_(nga_ipgroup_split,NGA_IPGROUP_SPLIT) #define nga_spgroup_split_ F77_FUNC_(nga_spgroup_split,NGA_SPGROUP_SPLIT) #define nga_zpgroup_split_ F77_FUNC_(nga_zpgroup_split,NGA_ZPGROUP_SPLIT) #define ga_pgroup_split_irreg_ F77_FUNC_(ga_pgroup_split_irreg, GA_PGROUP_SPLIT_IRREG) #define ga_cpgroup_split_irreg_ F77_FUNC_(ga_cpgroup_split_irreg,GA_CPGROUP_SPLIT_IRREG) #define ga_dpgroup_split_irreg_ F77_FUNC_(ga_dpgroup_split_irreg,GA_DPGROUP_SPLIT_IRREG) #define ga_ipgroup_split_irreg_ F77_FUNC_(ga_ipgroup_split_irreg,GA_IPGROUP_SPLIT_IRREG) #define ga_spgroup_split_irreg_ F77_FUNC_(ga_spgroup_split_irreg,GA_SPGROUP_SPLIT_IRREG) #define ga_zpgroup_split_irreg_ F77_FUNC_(ga_zpgroup_split_irreg,GA_ZPGROUP_SPLIT_IRREG) #define nga_pgroup_split_irreg_ F77_FUNC_(nga_pgroup_split_irreg, NGA_PGROUP_SPLIT_IRREG) #define nga_cpgroup_split_irreg_ F77_FUNC_(nga_cpgroup_split_irreg,NGA_CPGROUP_SPLIT_IRREG) #define nga_dpgroup_split_irreg_ F77_FUNC_(nga_dpgroup_split_irreg,NGA_DPGROUP_SPLIT_IRREG) #define nga_ipgroup_split_irreg_ F77_FUNC_(nga_ipgroup_split_irreg,NGA_IPGROUP_SPLIT_IRREG) #define nga_spgroup_split_irreg_ F77_FUNC_(nga_spgroup_split_irreg,NGA_SPGROUP_SPLIT_IRREG) #define nga_zpgroup_split_irreg_ F77_FUNC_(nga_zpgroup_split_irreg,NGA_ZPGROUP_SPLIT_IRREG) #define ga_pgroup_nnodes_ F77_FUNC_(ga_pgroup_nnodes, GA_PGROUP_NNODES) #define ga_cpgroup_nnodes_ F77_FUNC_(ga_cpgroup_nnodes,GA_CPGROUP_NNODES) #define ga_dpgroup_nnodes_ F77_FUNC_(ga_dpgroup_nnodes,GA_DPGROUP_NNODES) #define ga_ipgroup_nnodes_ F77_FUNC_(ga_ipgroup_nnodes,GA_IPGROUP_NNODES) #define ga_spgroup_nnodes_ F77_FUNC_(ga_spgroup_nnodes,GA_SPGROUP_NNODES) #define ga_zpgroup_nnodes_ F77_FUNC_(ga_zpgroup_nnodes,GA_ZPGROUP_NNODES) #define nga_pgroup_nnodes_ F77_FUNC_(nga_pgroup_nnodes, NGA_PGROUP_NNODES) #define nga_cpgroup_nnodes_ F77_FUNC_(nga_cpgroup_nnodes,NGA_CPGROUP_NNODES) #define nga_dpgroup_nnodes_ F77_FUNC_(nga_dpgroup_nnodes,NGA_DPGROUP_NNODES) #define nga_ipgroup_nnodes_ F77_FUNC_(nga_ipgroup_nnodes,NGA_IPGROUP_NNODES) #define nga_spgroup_nnodes_ F77_FUNC_(nga_spgroup_nnodes,NGA_SPGROUP_NNODES) #define nga_zpgroup_nnodes_ F77_FUNC_(nga_zpgroup_nnodes,NGA_ZPGROUP_NNODES) #define ga_pgroup_nodeid_ F77_FUNC_(ga_pgroup_nodeid, GA_PGROUP_NODEID) #define ga_cpgroup_nodeid_ F77_FUNC_(ga_cpgroup_nodeid,GA_CPGROUP_NODEID) #define ga_dpgroup_nodeid_ F77_FUNC_(ga_dpgroup_nodeid,GA_DPGROUP_NODEID) #define ga_ipgroup_nodeid_ F77_FUNC_(ga_ipgroup_nodeid,GA_IPGROUP_NODEID) #define ga_spgroup_nodeid_ F77_FUNC_(ga_spgroup_nodeid,GA_SPGROUP_NODEID) #define ga_zpgroup_nodeid_ F77_FUNC_(ga_zpgroup_nodeid,GA_ZPGROUP_NODEID) #define nga_pgroup_nodeid_ F77_FUNC_(nga_pgroup_nodeid, NGA_PGROUP_NODEID) #define nga_cpgroup_nodeid_ F77_FUNC_(nga_cpgroup_nodeid,NGA_CPGROUP_NODEID) #define nga_dpgroup_nodeid_ F77_FUNC_(nga_dpgroup_nodeid,NGA_DPGROUP_NODEID) #define nga_ipgroup_nodeid_ F77_FUNC_(nga_ipgroup_nodeid,NGA_IPGROUP_NODEID) #define nga_spgroup_nodeid_ F77_FUNC_(nga_spgroup_nodeid,NGA_SPGROUP_NODEID) #define nga_zpgroup_nodeid_ F77_FUNC_(nga_zpgroup_nodeid,NGA_ZPGROUP_NODEID) #define ga_proc_topology_ F77_FUNC_(ga_proc_topology, GA_PROC_TOPOLOGY) #define ga_cproc_topology_ F77_FUNC_(ga_cproc_topology,GA_CPROC_TOPOLOGY) #define ga_dproc_topology_ F77_FUNC_(ga_dproc_topology,GA_DPROC_TOPOLOGY) #define ga_iproc_topology_ F77_FUNC_(ga_iproc_topology,GA_IPROC_TOPOLOGY) #define ga_sproc_topology_ F77_FUNC_(ga_sproc_topology,GA_SPROC_TOPOLOGY) #define ga_zproc_topology_ F77_FUNC_(ga_zproc_topology,GA_ZPROC_TOPOLOGY) #define nga_proc_topology_ F77_FUNC_(nga_proc_topology, NGA_PROC_TOPOLOGY) #define nga_cproc_topology_ F77_FUNC_(nga_cproc_topology,NGA_CPROC_TOPOLOGY) #define nga_dproc_topology_ F77_FUNC_(nga_dproc_topology,NGA_DPROC_TOPOLOGY) #define nga_iproc_topology_ F77_FUNC_(nga_iproc_topology,NGA_IPROC_TOPOLOGY) #define nga_sproc_topology_ F77_FUNC_(nga_sproc_topology,NGA_SPROC_TOPOLOGY) #define nga_zproc_topology_ F77_FUNC_(nga_zproc_topology,NGA_ZPROC_TOPOLOGY) #define ga_randomize_ F77_FUNC_(ga_randomize, GA_RANDOMIZE) #define ga_crandomize_ F77_FUNC_(ga_crandomize,GA_CRANDOMIZE) #define ga_drandomize_ F77_FUNC_(ga_drandomize,GA_DRANDOMIZE) #define ga_irandomize_ F77_FUNC_(ga_irandomize,GA_IRANDOMIZE) #define ga_srandomize_ F77_FUNC_(ga_srandomize,GA_SRANDOMIZE) #define ga_zrandomize_ F77_FUNC_(ga_zrandomize,GA_ZRANDOMIZE) #define nga_randomize_ F77_FUNC_(nga_randomize, NGA_RANDOMIZE) #define nga_crandomize_ F77_FUNC_(nga_crandomize,NGA_CRANDOMIZE) #define nga_drandomize_ F77_FUNC_(nga_drandomize,NGA_DRANDOMIZE) #define nga_irandomize_ F77_FUNC_(nga_irandomize,NGA_IRANDOMIZE) #define nga_srandomize_ F77_FUNC_(nga_srandomize,NGA_SRANDOMIZE) #define nga_zrandomize_ F77_FUNC_(nga_zrandomize,NGA_ZRANDOMIZE) #define ga_get_pgroup_ F77_FUNC_(ga_get_pgroup, GA_GET_PGROUP) #define ga_cget_pgroup_ F77_FUNC_(ga_cget_pgroup,GA_CGET_PGROUP) #define ga_dget_pgroup_ F77_FUNC_(ga_dget_pgroup,GA_DGET_PGROUP) #define ga_iget_pgroup_ F77_FUNC_(ga_iget_pgroup,GA_IGET_PGROUP) #define ga_sget_pgroup_ F77_FUNC_(ga_sget_pgroup,GA_SGET_PGROUP) #define ga_zget_pgroup_ F77_FUNC_(ga_zget_pgroup,GA_ZGET_PGROUP) #define nga_get_pgroup_ F77_FUNC_(nga_get_pgroup, NGA_GET_PGROUP) #define nga_cget_pgroup_ F77_FUNC_(nga_cget_pgroup,NGA_CGET_PGROUP) #define nga_dget_pgroup_ F77_FUNC_(nga_dget_pgroup,NGA_DGET_PGROUP) #define nga_iget_pgroup_ F77_FUNC_(nga_iget_pgroup,NGA_IGET_PGROUP) #define nga_sget_pgroup_ F77_FUNC_(nga_sget_pgroup,NGA_SGET_PGROUP) #define nga_zget_pgroup_ F77_FUNC_(nga_zget_pgroup,NGA_ZGET_PGROUP) #define ga_get_pgroup_size_ F77_FUNC_(ga_get_pgroup_size, GA_GET_PGROUP_SIZE) #define ga_cget_pgroup_size_ F77_FUNC_(ga_cget_pgroup_size,GA_CGET_PGROUP_SIZE) #define ga_dget_pgroup_size_ F77_FUNC_(ga_dget_pgroup_size,GA_DGET_PGROUP_SIZE) #define ga_iget_pgroup_size_ F77_FUNC_(ga_iget_pgroup_size,GA_IGET_PGROUP_SIZE) #define ga_sget_pgroup_size_ F77_FUNC_(ga_sget_pgroup_size,GA_SGET_PGROUP_SIZE) #define ga_zget_pgroup_size_ F77_FUNC_(ga_zget_pgroup_size,GA_ZGET_PGROUP_SIZE) #define nga_get_pgroup_size_ F77_FUNC_(nga_get_pgroup_size, NGA_GET_PGROUP_SIZE) #define nga_cget_pgroup_size_ F77_FUNC_(nga_cget_pgroup_size,NGA_CGET_PGROUP_SIZE) #define nga_dget_pgroup_size_ F77_FUNC_(nga_dget_pgroup_size,NGA_DGET_PGROUP_SIZE) #define nga_iget_pgroup_size_ F77_FUNC_(nga_iget_pgroup_size,NGA_IGET_PGROUP_SIZE) #define nga_sget_pgroup_size_ F77_FUNC_(nga_sget_pgroup_size,NGA_SGET_PGROUP_SIZE) #define nga_zget_pgroup_size_ F77_FUNC_(nga_zget_pgroup_size,NGA_ZGET_PGROUP_SIZE) #define ga_set_array_name_ F77_FUNC_(ga_set_array_name, GA_SET_ARRAY_NAME) #define ga_cset_array_name_ F77_FUNC_(ga_cset_array_name,GA_CSET_ARRAY_NAME) #define ga_dset_array_name_ F77_FUNC_(ga_dset_array_name,GA_DSET_ARRAY_NAME) #define ga_iset_array_name_ F77_FUNC_(ga_iset_array_name,GA_ISET_ARRAY_NAME) #define ga_sset_array_name_ F77_FUNC_(ga_sset_array_name,GA_SSET_ARRAY_NAME) #define ga_zset_array_name_ F77_FUNC_(ga_zset_array_name,GA_ZSET_ARRAY_NAME) #define nga_set_array_name_ F77_FUNC_(nga_set_array_name, NGA_SET_ARRAY_NAME) #define nga_cset_array_name_ F77_FUNC_(nga_cset_array_name,NGA_CSET_ARRAY_NAME) #define nga_dset_array_name_ F77_FUNC_(nga_dset_array_name,NGA_DSET_ARRAY_NAME) #define nga_iset_array_name_ F77_FUNC_(nga_iset_array_name,NGA_ISET_ARRAY_NAME) #define nga_sset_array_name_ F77_FUNC_(nga_sset_array_name,NGA_SSET_ARRAY_NAME) #define nga_zset_array_name_ F77_FUNC_(nga_zset_array_name,NGA_ZSET_ARRAY_NAME) #define ga_set_block_cyclic_ F77_FUNC_(ga_set_block_cyclic, GA_SET_BLOCK_CYCLIC) #define ga_cset_block_cyclic_ F77_FUNC_(ga_cset_block_cyclic,GA_CSET_BLOCK_CYCLIC) #define ga_dset_block_cyclic_ F77_FUNC_(ga_dset_block_cyclic,GA_DSET_BLOCK_CYCLIC) #define ga_iset_block_cyclic_ F77_FUNC_(ga_iset_block_cyclic,GA_ISET_BLOCK_CYCLIC) #define ga_sset_block_cyclic_ F77_FUNC_(ga_sset_block_cyclic,GA_SSET_BLOCK_CYCLIC) #define ga_zset_block_cyclic_ F77_FUNC_(ga_zset_block_cyclic,GA_ZSET_BLOCK_CYCLIC) #define nga_set_block_cyclic_ F77_FUNC_(nga_set_block_cyclic, NGA_SET_BLOCK_CYCLIC) #define nga_cset_block_cyclic_ F77_FUNC_(nga_cset_block_cyclic,NGA_CSET_BLOCK_CYCLIC) #define nga_dset_block_cyclic_ F77_FUNC_(nga_dset_block_cyclic,NGA_DSET_BLOCK_CYCLIC) #define nga_iset_block_cyclic_ F77_FUNC_(nga_iset_block_cyclic,NGA_ISET_BLOCK_CYCLIC) #define nga_sset_block_cyclic_ F77_FUNC_(nga_sset_block_cyclic,NGA_SSET_BLOCK_CYCLIC) #define nga_zset_block_cyclic_ F77_FUNC_(nga_zset_block_cyclic,NGA_ZSET_BLOCK_CYCLIC) #define ga_set_block_cyclic_proc_grid_ F77_FUNC_(ga_set_block_cyclic_proc_grid, GA_SET_BLOCK_CYCLIC_PROC_GRID) #define ga_cset_block_cyclic_proc_grid_ F77_FUNC_(ga_cset_block_cyclic_proc_grid,GA_CSET_BLOCK_CYCLIC_PROC_GRID) #define ga_dset_block_cyclic_proc_grid_ F77_FUNC_(ga_dset_block_cyclic_proc_grid,GA_DSET_BLOCK_CYCLIC_PROC_GRID) #define ga_iset_block_cyclic_proc_grid_ F77_FUNC_(ga_iset_block_cyclic_proc_grid,GA_ISET_BLOCK_CYCLIC_PROC_GRID) #define ga_sset_block_cyclic_proc_grid_ F77_FUNC_(ga_sset_block_cyclic_proc_grid,GA_SSET_BLOCK_CYCLIC_PROC_GRID) #define ga_zset_block_cyclic_proc_grid_ F77_FUNC_(ga_zset_block_cyclic_proc_grid,GA_ZSET_BLOCK_CYCLIC_PROC_GRID) #define nga_set_block_cyclic_proc_grid_ F77_FUNC_(nga_set_block_cyclic_proc_grid, NGA_SET_BLOCK_CYCLIC_PROC_GRID) #define nga_cset_block_cyclic_proc_grid_ F77_FUNC_(nga_cset_block_cyclic_proc_grid,NGA_CSET_BLOCK_CYCLIC_PROC_GRID) #define nga_dset_block_cyclic_proc_grid_ F77_FUNC_(nga_dset_block_cyclic_proc_grid,NGA_DSET_BLOCK_CYCLIC_PROC_GRID) #define nga_iset_block_cyclic_proc_grid_ F77_FUNC_(nga_iset_block_cyclic_proc_grid,NGA_ISET_BLOCK_CYCLIC_PROC_GRID) #define nga_sset_block_cyclic_proc_grid_ F77_FUNC_(nga_sset_block_cyclic_proc_grid,NGA_SSET_BLOCK_CYCLIC_PROC_GRID) #define nga_zset_block_cyclic_proc_grid_ F77_FUNC_(nga_zset_block_cyclic_proc_grid,NGA_ZSET_BLOCK_CYCLIC_PROC_GRID) #define ga_set_chunk_ F77_FUNC_(ga_set_chunk, GA_SET_CHUNK) #define ga_cset_chunk_ F77_FUNC_(ga_cset_chunk,GA_CSET_CHUNK) #define ga_dset_chunk_ F77_FUNC_(ga_dset_chunk,GA_DSET_CHUNK) #define ga_iset_chunk_ F77_FUNC_(ga_iset_chunk,GA_ISET_CHUNK) #define ga_sset_chunk_ F77_FUNC_(ga_sset_chunk,GA_SSET_CHUNK) #define ga_zset_chunk_ F77_FUNC_(ga_zset_chunk,GA_ZSET_CHUNK) #define nga_set_chunk_ F77_FUNC_(nga_set_chunk, NGA_SET_CHUNK) #define nga_cset_chunk_ F77_FUNC_(nga_cset_chunk,NGA_CSET_CHUNK) #define nga_dset_chunk_ F77_FUNC_(nga_dset_chunk,NGA_DSET_CHUNK) #define nga_iset_chunk_ F77_FUNC_(nga_iset_chunk,NGA_ISET_CHUNK) #define nga_sset_chunk_ F77_FUNC_(nga_sset_chunk,NGA_SSET_CHUNK) #define nga_zset_chunk_ F77_FUNC_(nga_zset_chunk,NGA_ZSET_CHUNK) #define ga_set_data_ F77_FUNC_(ga_set_data, GA_SET_DATA) #define ga_cset_data_ F77_FUNC_(ga_cset_data,GA_CSET_DATA) #define ga_dset_data_ F77_FUNC_(ga_dset_data,GA_DSET_DATA) #define ga_iset_data_ F77_FUNC_(ga_iset_data,GA_ISET_DATA) #define ga_sset_data_ F77_FUNC_(ga_sset_data,GA_SSET_DATA) #define ga_zset_data_ F77_FUNC_(ga_zset_data,GA_ZSET_DATA) #define nga_set_data_ F77_FUNC_(nga_set_data, NGA_SET_DATA) #define nga_cset_data_ F77_FUNC_(nga_cset_data,NGA_CSET_DATA) #define nga_dset_data_ F77_FUNC_(nga_dset_data,NGA_DSET_DATA) #define nga_iset_data_ F77_FUNC_(nga_iset_data,NGA_ISET_DATA) #define nga_sset_data_ F77_FUNC_(nga_sset_data,NGA_SSET_DATA) #define nga_zset_data_ F77_FUNC_(nga_zset_data,NGA_ZSET_DATA) #define ga_set_debug_ F77_FUNC_(ga_set_debug, GA_SET_DEBUG) #define ga_cset_debug_ F77_FUNC_(ga_cset_debug,GA_CSET_DEBUG) #define ga_dset_debug_ F77_FUNC_(ga_dset_debug,GA_DSET_DEBUG) #define ga_iset_debug_ F77_FUNC_(ga_iset_debug,GA_ISET_DEBUG) #define ga_sset_debug_ F77_FUNC_(ga_sset_debug,GA_SSET_DEBUG) #define ga_zset_debug_ F77_FUNC_(ga_zset_debug,GA_ZSET_DEBUG) #define nga_set_debug_ F77_FUNC_(nga_set_debug, NGA_SET_DEBUG) #define nga_cset_debug_ F77_FUNC_(nga_cset_debug,NGA_CSET_DEBUG) #define nga_dset_debug_ F77_FUNC_(nga_dset_debug,NGA_DSET_DEBUG) #define nga_iset_debug_ F77_FUNC_(nga_iset_debug,NGA_ISET_DEBUG) #define nga_sset_debug_ F77_FUNC_(nga_sset_debug,NGA_SSET_DEBUG) #define nga_zset_debug_ F77_FUNC_(nga_zset_debug,NGA_ZSET_DEBUG) #define ga_set_ghosts_ F77_FUNC_(ga_set_ghosts, GA_SET_GHOSTS) #define ga_cset_ghosts_ F77_FUNC_(ga_cset_ghosts,GA_CSET_GHOSTS) #define ga_dset_ghosts_ F77_FUNC_(ga_dset_ghosts,GA_DSET_GHOSTS) #define ga_iset_ghosts_ F77_FUNC_(ga_iset_ghosts,GA_ISET_GHOSTS) #define ga_sset_ghosts_ F77_FUNC_(ga_sset_ghosts,GA_SSET_GHOSTS) #define ga_zset_ghosts_ F77_FUNC_(ga_zset_ghosts,GA_ZSET_GHOSTS) #define nga_set_ghosts_ F77_FUNC_(nga_set_ghosts, NGA_SET_GHOSTS) #define nga_cset_ghosts_ F77_FUNC_(nga_cset_ghosts,NGA_CSET_GHOSTS) #define nga_dset_ghosts_ F77_FUNC_(nga_dset_ghosts,NGA_DSET_GHOSTS) #define nga_iset_ghosts_ F77_FUNC_(nga_iset_ghosts,NGA_ISET_GHOSTS) #define nga_sset_ghosts_ F77_FUNC_(nga_sset_ghosts,NGA_SSET_GHOSTS) #define nga_zset_ghosts_ F77_FUNC_(nga_zset_ghosts,NGA_ZSET_GHOSTS) #define ga_set_irreg_distr_ F77_FUNC_(ga_set_irreg_distr, GA_SET_IRREG_DISTR) #define ga_cset_irreg_distr_ F77_FUNC_(ga_cset_irreg_distr,GA_CSET_IRREG_DISTR) #define ga_dset_irreg_distr_ F77_FUNC_(ga_dset_irreg_distr,GA_DSET_IRREG_DISTR) #define ga_iset_irreg_distr_ F77_FUNC_(ga_iset_irreg_distr,GA_ISET_IRREG_DISTR) #define ga_sset_irreg_distr_ F77_FUNC_(ga_sset_irreg_distr,GA_SSET_IRREG_DISTR) #define ga_zset_irreg_distr_ F77_FUNC_(ga_zset_irreg_distr,GA_ZSET_IRREG_DISTR) #define nga_set_irreg_distr_ F77_FUNC_(nga_set_irreg_distr, NGA_SET_IRREG_DISTR) #define nga_cset_irreg_distr_ F77_FUNC_(nga_cset_irreg_distr,NGA_CSET_IRREG_DISTR) #define nga_dset_irreg_distr_ F77_FUNC_(nga_dset_irreg_distr,NGA_DSET_IRREG_DISTR) #define nga_iset_irreg_distr_ F77_FUNC_(nga_iset_irreg_distr,NGA_ISET_IRREG_DISTR) #define nga_sset_irreg_distr_ F77_FUNC_(nga_sset_irreg_distr,NGA_SSET_IRREG_DISTR) #define nga_zset_irreg_distr_ F77_FUNC_(nga_zset_irreg_distr,NGA_ZSET_IRREG_DISTR) #define ga_set_irreg_flag_ F77_FUNC_(ga_set_irreg_flag, GA_SET_IRREG_FLAG) #define ga_cset_irreg_flag_ F77_FUNC_(ga_cset_irreg_flag,GA_CSET_IRREG_FLAG) #define ga_dset_irreg_flag_ F77_FUNC_(ga_dset_irreg_flag,GA_DSET_IRREG_FLAG) #define ga_iset_irreg_flag_ F77_FUNC_(ga_iset_irreg_flag,GA_ISET_IRREG_FLAG) #define ga_sset_irreg_flag_ F77_FUNC_(ga_sset_irreg_flag,GA_SSET_IRREG_FLAG) #define ga_zset_irreg_flag_ F77_FUNC_(ga_zset_irreg_flag,GA_ZSET_IRREG_FLAG) #define nga_set_irreg_flag_ F77_FUNC_(nga_set_irreg_flag, NGA_SET_IRREG_FLAG) #define nga_cset_irreg_flag_ F77_FUNC_(nga_cset_irreg_flag,NGA_CSET_IRREG_FLAG) #define nga_dset_irreg_flag_ F77_FUNC_(nga_dset_irreg_flag,NGA_DSET_IRREG_FLAG) #define nga_iset_irreg_flag_ F77_FUNC_(nga_iset_irreg_flag,NGA_ISET_IRREG_FLAG) #define nga_sset_irreg_flag_ F77_FUNC_(nga_sset_irreg_flag,NGA_SSET_IRREG_FLAG) #define nga_zset_irreg_flag_ F77_FUNC_(nga_zset_irreg_flag,NGA_ZSET_IRREG_FLAG) #define ga_set_memory_limit_ F77_FUNC_(ga_set_memory_limit, GA_SET_MEMORY_LIMIT) #define ga_cset_memory_limit_ F77_FUNC_(ga_cset_memory_limit,GA_CSET_MEMORY_LIMIT) #define ga_dset_memory_limit_ F77_FUNC_(ga_dset_memory_limit,GA_DSET_MEMORY_LIMIT) #define ga_iset_memory_limit_ F77_FUNC_(ga_iset_memory_limit,GA_ISET_MEMORY_LIMIT) #define ga_sset_memory_limit_ F77_FUNC_(ga_sset_memory_limit,GA_SSET_MEMORY_LIMIT) #define ga_zset_memory_limit_ F77_FUNC_(ga_zset_memory_limit,GA_ZSET_MEMORY_LIMIT) #define nga_set_memory_limit_ F77_FUNC_(nga_set_memory_limit, NGA_SET_MEMORY_LIMIT) #define nga_cset_memory_limit_ F77_FUNC_(nga_cset_memory_limit,NGA_CSET_MEMORY_LIMIT) #define nga_dset_memory_limit_ F77_FUNC_(nga_dset_memory_limit,NGA_DSET_MEMORY_LIMIT) #define nga_iset_memory_limit_ F77_FUNC_(nga_iset_memory_limit,NGA_ISET_MEMORY_LIMIT) #define nga_sset_memory_limit_ F77_FUNC_(nga_sset_memory_limit,NGA_SSET_MEMORY_LIMIT) #define nga_zset_memory_limit_ F77_FUNC_(nga_zset_memory_limit,NGA_ZSET_MEMORY_LIMIT) #define ga_set_pgroup_ F77_FUNC_(ga_set_pgroup, GA_SET_PGROUP) #define ga_cset_pgroup_ F77_FUNC_(ga_cset_pgroup,GA_CSET_PGROUP) #define ga_dset_pgroup_ F77_FUNC_(ga_dset_pgroup,GA_DSET_PGROUP) #define ga_iset_pgroup_ F77_FUNC_(ga_iset_pgroup,GA_ISET_PGROUP) #define ga_sset_pgroup_ F77_FUNC_(ga_sset_pgroup,GA_SSET_PGROUP) #define ga_zset_pgroup_ F77_FUNC_(ga_zset_pgroup,GA_ZSET_PGROUP) #define nga_set_pgroup_ F77_FUNC_(nga_set_pgroup, NGA_SET_PGROUP) #define nga_cset_pgroup_ F77_FUNC_(nga_cset_pgroup,NGA_CSET_PGROUP) #define nga_dset_pgroup_ F77_FUNC_(nga_dset_pgroup,NGA_DSET_PGROUP) #define nga_iset_pgroup_ F77_FUNC_(nga_iset_pgroup,NGA_ISET_PGROUP) #define nga_sset_pgroup_ F77_FUNC_(nga_sset_pgroup,NGA_SSET_PGROUP) #define nga_zset_pgroup_ F77_FUNC_(nga_zset_pgroup,NGA_ZSET_PGROUP) #define ga_set_restricted_ F77_FUNC_(ga_set_restricted, GA_SET_RESTRICTED) #define ga_cset_restricted_ F77_FUNC_(ga_cset_restricted,GA_CSET_RESTRICTED) #define ga_dset_restricted_ F77_FUNC_(ga_dset_restricted,GA_DSET_RESTRICTED) #define ga_iset_restricted_ F77_FUNC_(ga_iset_restricted,GA_ISET_RESTRICTED) #define ga_sset_restricted_ F77_FUNC_(ga_sset_restricted,GA_SSET_RESTRICTED) #define ga_zset_restricted_ F77_FUNC_(ga_zset_restricted,GA_ZSET_RESTRICTED) #define nga_set_restricted_ F77_FUNC_(nga_set_restricted, NGA_SET_RESTRICTED) #define nga_cset_restricted_ F77_FUNC_(nga_cset_restricted,NGA_CSET_RESTRICTED) #define nga_dset_restricted_ F77_FUNC_(nga_dset_restricted,NGA_DSET_RESTRICTED) #define nga_iset_restricted_ F77_FUNC_(nga_iset_restricted,NGA_ISET_RESTRICTED) #define nga_sset_restricted_ F77_FUNC_(nga_sset_restricted,NGA_SSET_RESTRICTED) #define nga_zset_restricted_ F77_FUNC_(nga_zset_restricted,NGA_ZSET_RESTRICTED) #define ga_set_restricted_range_ F77_FUNC_(ga_set_restricted_range, GA_SET_RESTRICTED_RANGE) #define ga_cset_restricted_range_ F77_FUNC_(ga_cset_restricted_range,GA_CSET_RESTRICTED_RANGE) #define ga_dset_restricted_range_ F77_FUNC_(ga_dset_restricted_range,GA_DSET_RESTRICTED_RANGE) #define ga_iset_restricted_range_ F77_FUNC_(ga_iset_restricted_range,GA_ISET_RESTRICTED_RANGE) #define ga_sset_restricted_range_ F77_FUNC_(ga_sset_restricted_range,GA_SSET_RESTRICTED_RANGE) #define ga_zset_restricted_range_ F77_FUNC_(ga_zset_restricted_range,GA_ZSET_RESTRICTED_RANGE) #define nga_set_restricted_range_ F77_FUNC_(nga_set_restricted_range, NGA_SET_RESTRICTED_RANGE) #define nga_cset_restricted_range_ F77_FUNC_(nga_cset_restricted_range,NGA_CSET_RESTRICTED_RANGE) #define nga_dset_restricted_range_ F77_FUNC_(nga_dset_restricted_range,NGA_DSET_RESTRICTED_RANGE) #define nga_iset_restricted_range_ F77_FUNC_(nga_iset_restricted_range,NGA_ISET_RESTRICTED_RANGE) #define nga_sset_restricted_range_ F77_FUNC_(nga_sset_restricted_range,NGA_SSET_RESTRICTED_RANGE) #define nga_zset_restricted_range_ F77_FUNC_(nga_zset_restricted_range,NGA_ZSET_RESTRICTED_RANGE) #define ga_terminate_ F77_FUNC_(ga_terminate, GA_TERMINATE) #define ga_cterminate_ F77_FUNC_(ga_cterminate,GA_CTERMINATE) #define ga_dterminate_ F77_FUNC_(ga_dterminate,GA_DTERMINATE) #define ga_iterminate_ F77_FUNC_(ga_iterminate,GA_ITERMINATE) #define ga_sterminate_ F77_FUNC_(ga_sterminate,GA_STERMINATE) #define ga_zterminate_ F77_FUNC_(ga_zterminate,GA_ZTERMINATE) #define nga_terminate_ F77_FUNC_(nga_terminate, NGA_TERMINATE) #define nga_cterminate_ F77_FUNC_(nga_cterminate,NGA_CTERMINATE) #define nga_dterminate_ F77_FUNC_(nga_dterminate,NGA_DTERMINATE) #define nga_iterminate_ F77_FUNC_(nga_iterminate,NGA_ITERMINATE) #define nga_sterminate_ F77_FUNC_(nga_sterminate,NGA_STERMINATE) #define nga_zterminate_ F77_FUNC_(nga_zterminate,NGA_ZTERMINATE) #define ga_total_blocks_ F77_FUNC_(ga_total_blocks, GA_TOTAL_BLOCKS) #define ga_ctotal_blocks_ F77_FUNC_(ga_ctotal_blocks,GA_CTOTAL_BLOCKS) #define ga_dtotal_blocks_ F77_FUNC_(ga_dtotal_blocks,GA_DTOTAL_BLOCKS) #define ga_itotal_blocks_ F77_FUNC_(ga_itotal_blocks,GA_ITOTAL_BLOCKS) #define ga_stotal_blocks_ F77_FUNC_(ga_stotal_blocks,GA_STOTAL_BLOCKS) #define ga_ztotal_blocks_ F77_FUNC_(ga_ztotal_blocks,GA_ZTOTAL_BLOCKS) #define nga_total_blocks_ F77_FUNC_(nga_total_blocks, NGA_TOTAL_BLOCKS) #define nga_ctotal_blocks_ F77_FUNC_(nga_ctotal_blocks,NGA_CTOTAL_BLOCKS) #define nga_dtotal_blocks_ F77_FUNC_(nga_dtotal_blocks,NGA_DTOTAL_BLOCKS) #define nga_itotal_blocks_ F77_FUNC_(nga_itotal_blocks,NGA_ITOTAL_BLOCKS) #define nga_stotal_blocks_ F77_FUNC_(nga_stotal_blocks,NGA_STOTAL_BLOCKS) #define nga_ztotal_blocks_ F77_FUNC_(nga_ztotal_blocks,NGA_ZTOTAL_BLOCKS) #define ga_unlock_ F77_FUNC_(ga_unlock, GA_UNLOCK) #define ga_cunlock_ F77_FUNC_(ga_cunlock,GA_CUNLOCK) #define ga_dunlock_ F77_FUNC_(ga_dunlock,GA_DUNLOCK) #define ga_iunlock_ F77_FUNC_(ga_iunlock,GA_IUNLOCK) #define ga_sunlock_ F77_FUNC_(ga_sunlock,GA_SUNLOCK) #define ga_zunlock_ F77_FUNC_(ga_zunlock,GA_ZUNLOCK) #define nga_unlock_ F77_FUNC_(nga_unlock, NGA_UNLOCK) #define nga_cunlock_ F77_FUNC_(nga_cunlock,NGA_CUNLOCK) #define nga_dunlock_ F77_FUNC_(nga_dunlock,NGA_DUNLOCK) #define nga_iunlock_ F77_FUNC_(nga_iunlock,NGA_IUNLOCK) #define nga_sunlock_ F77_FUNC_(nga_sunlock,NGA_SUNLOCK) #define nga_zunlock_ F77_FUNC_(nga_zunlock,NGA_ZUNLOCK) #define ga_uses_ma_ F77_FUNC_(ga_uses_ma, GA_USES_MA) #define ga_cuses_ma_ F77_FUNC_(ga_cuses_ma,GA_CUSES_MA) #define ga_duses_ma_ F77_FUNC_(ga_duses_ma,GA_DUSES_MA) #define ga_iuses_ma_ F77_FUNC_(ga_iuses_ma,GA_IUSES_MA) #define ga_suses_ma_ F77_FUNC_(ga_suses_ma,GA_SUSES_MA) #define ga_zuses_ma_ F77_FUNC_(ga_zuses_ma,GA_ZUSES_MA) #define nga_uses_ma_ F77_FUNC_(nga_uses_ma, NGA_USES_MA) #define nga_cuses_ma_ F77_FUNC_(nga_cuses_ma,NGA_CUSES_MA) #define nga_duses_ma_ F77_FUNC_(nga_duses_ma,NGA_DUSES_MA) #define nga_iuses_ma_ F77_FUNC_(nga_iuses_ma,NGA_IUSES_MA) #define nga_suses_ma_ F77_FUNC_(nga_suses_ma,NGA_SUSES_MA) #define nga_zuses_ma_ F77_FUNC_(nga_zuses_ma,NGA_ZUSES_MA) #define ga_uses_proc_grid_ F77_FUNC_(ga_uses_proc_grid, GA_USES_PROC_GRID) #define ga_cuses_proc_grid_ F77_FUNC_(ga_cuses_proc_grid,GA_CUSES_PROC_GRID) #define ga_duses_proc_grid_ F77_FUNC_(ga_duses_proc_grid,GA_DUSES_PROC_GRID) #define ga_iuses_proc_grid_ F77_FUNC_(ga_iuses_proc_grid,GA_IUSES_PROC_GRID) #define ga_suses_proc_grid_ F77_FUNC_(ga_suses_proc_grid,GA_SUSES_PROC_GRID) #define ga_zuses_proc_grid_ F77_FUNC_(ga_zuses_proc_grid,GA_ZUSES_PROC_GRID) #define nga_uses_proc_grid_ F77_FUNC_(nga_uses_proc_grid, NGA_USES_PROC_GRID) #define nga_cuses_proc_grid_ F77_FUNC_(nga_cuses_proc_grid,NGA_CUSES_PROC_GRID) #define nga_duses_proc_grid_ F77_FUNC_(nga_duses_proc_grid,NGA_DUSES_PROC_GRID) #define nga_iuses_proc_grid_ F77_FUNC_(nga_iuses_proc_grid,NGA_IUSES_PROC_GRID) #define nga_suses_proc_grid_ F77_FUNC_(nga_suses_proc_grid,NGA_SUSES_PROC_GRID) #define nga_zuses_proc_grid_ F77_FUNC_(nga_zuses_proc_grid,NGA_ZUSES_PROC_GRID) #define ga_valid_handle_ F77_FUNC_(ga_valid_handle, GA_VALID_HANDLE) #define ga_cvalid_handle_ F77_FUNC_(ga_cvalid_handle,GA_CVALID_HANDLE) #define ga_dvalid_handle_ F77_FUNC_(ga_dvalid_handle,GA_DVALID_HANDLE) #define ga_ivalid_handle_ F77_FUNC_(ga_ivalid_handle,GA_IVALID_HANDLE) #define ga_svalid_handle_ F77_FUNC_(ga_svalid_handle,GA_SVALID_HANDLE) #define ga_zvalid_handle_ F77_FUNC_(ga_zvalid_handle,GA_ZVALID_HANDLE) #define nga_valid_handle_ F77_FUNC_(nga_valid_handle, NGA_VALID_HANDLE) #define nga_cvalid_handle_ F77_FUNC_(nga_cvalid_handle,NGA_CVALID_HANDLE) #define nga_dvalid_handle_ F77_FUNC_(nga_dvalid_handle,NGA_DVALID_HANDLE) #define nga_ivalid_handle_ F77_FUNC_(nga_ivalid_handle,NGA_IVALID_HANDLE) #define nga_svalid_handle_ F77_FUNC_(nga_svalid_handle,NGA_SVALID_HANDLE) #define nga_zvalid_handle_ F77_FUNC_(nga_zvalid_handle,NGA_ZVALID_HANDLE) #define ga_verify_handle_ F77_FUNC_(ga_verify_handle, GA_VERIFY_HANDLE) #define ga_cverify_handle_ F77_FUNC_(ga_cverify_handle,GA_CVERIFY_HANDLE) #define ga_dverify_handle_ F77_FUNC_(ga_dverify_handle,GA_DVERIFY_HANDLE) #define ga_iverify_handle_ F77_FUNC_(ga_iverify_handle,GA_IVERIFY_HANDLE) #define ga_sverify_handle_ F77_FUNC_(ga_sverify_handle,GA_SVERIFY_HANDLE) #define ga_zverify_handle_ F77_FUNC_(ga_zverify_handle,GA_ZVERIFY_HANDLE) #define nga_verify_handle_ F77_FUNC_(nga_verify_handle, NGA_VERIFY_HANDLE) #define nga_cverify_handle_ F77_FUNC_(nga_cverify_handle,NGA_CVERIFY_HANDLE) #define nga_dverify_handle_ F77_FUNC_(nga_dverify_handle,NGA_DVERIFY_HANDLE) #define nga_iverify_handle_ F77_FUNC_(nga_iverify_handle,NGA_IVERIFY_HANDLE) #define nga_sverify_handle_ F77_FUNC_(nga_sverify_handle,NGA_SVERIFY_HANDLE) #define nga_zverify_handle_ F77_FUNC_(nga_zverify_handle,NGA_ZVERIFY_HANDLE) #define ga_check_handle_ F77_FUNC_(ga_check_handle, GA_CHECK_HANDLE) #define ga_ccheck_handle_ F77_FUNC_(ga_ccheck_handle,GA_CCHECK_HANDLE) #define ga_dcheck_handle_ F77_FUNC_(ga_dcheck_handle,GA_DCHECK_HANDLE) #define ga_icheck_handle_ F77_FUNC_(ga_icheck_handle,GA_ICHECK_HANDLE) #define ga_scheck_handle_ F77_FUNC_(ga_scheck_handle,GA_SCHECK_HANDLE) #define ga_zcheck_handle_ F77_FUNC_(ga_zcheck_handle,GA_ZCHECK_HANDLE) #define nga_check_handle_ F77_FUNC_(nga_check_handle, NGA_CHECK_HANDLE) #define nga_ccheck_handle_ F77_FUNC_(nga_ccheck_handle,NGA_CCHECK_HANDLE) #define nga_dcheck_handle_ F77_FUNC_(nga_dcheck_handle,NGA_DCHECK_HANDLE) #define nga_icheck_handle_ F77_FUNC_(nga_icheck_handle,NGA_ICHECK_HANDLE) #define nga_scheck_handle_ F77_FUNC_(nga_scheck_handle,NGA_SCHECK_HANDLE) #define nga_zcheck_handle_ F77_FUNC_(nga_zcheck_handle,NGA_ZCHECK_HANDLE) #define ga_acc_ F77_FUNC_(ga_acc, GA_ACC) #define ga_cacc_ F77_FUNC_(ga_cacc,GA_CACC) #define ga_dacc_ F77_FUNC_(ga_dacc,GA_DACC) #define ga_iacc_ F77_FUNC_(ga_iacc,GA_IACC) #define ga_sacc_ F77_FUNC_(ga_sacc,GA_SACC) #define ga_zacc_ F77_FUNC_(ga_zacc,GA_ZACC) #define nga_acc_ F77_FUNC_(nga_acc, NGA_ACC) #define nga_cacc_ F77_FUNC_(nga_cacc,NGA_CACC) #define nga_dacc_ F77_FUNC_(nga_dacc,NGA_DACC) #define nga_iacc_ F77_FUNC_(nga_iacc,NGA_IACC) #define nga_sacc_ F77_FUNC_(nga_sacc,NGA_SACC) #define nga_zacc_ F77_FUNC_(nga_zacc,NGA_ZACC) #define ga_access_idx_ F77_FUNC_(ga_access_idx, GA_ACCESS_IDX) #define ga_caccess_idx_ F77_FUNC_(ga_caccess_idx,GA_CACCESS_IDX) #define ga_daccess_idx_ F77_FUNC_(ga_daccess_idx,GA_DACCESS_IDX) #define ga_iaccess_idx_ F77_FUNC_(ga_iaccess_idx,GA_IACCESS_IDX) #define ga_saccess_idx_ F77_FUNC_(ga_saccess_idx,GA_SACCESS_IDX) #define ga_zaccess_idx_ F77_FUNC_(ga_zaccess_idx,GA_ZACCESS_IDX) #define nga_access_idx_ F77_FUNC_(nga_access_idx, NGA_ACCESS_IDX) #define nga_caccess_idx_ F77_FUNC_(nga_caccess_idx,NGA_CACCESS_IDX) #define nga_daccess_idx_ F77_FUNC_(nga_daccess_idx,NGA_DACCESS_IDX) #define nga_iaccess_idx_ F77_FUNC_(nga_iaccess_idx,NGA_IACCESS_IDX) #define nga_saccess_idx_ F77_FUNC_(nga_saccess_idx,NGA_SACCESS_IDX) #define nga_zaccess_idx_ F77_FUNC_(nga_zaccess_idx,NGA_ZACCESS_IDX) #define ga_access_ptr_ F77_FUNC_(ga_access_ptr, GA_ACCESS_PTR) #define ga_caccess_ptr_ F77_FUNC_(ga_caccess_ptr,GA_CACCESS_PTR) #define ga_daccess_ptr_ F77_FUNC_(ga_daccess_ptr,GA_DACCESS_PTR) #define ga_iaccess_ptr_ F77_FUNC_(ga_iaccess_ptr,GA_IACCESS_PTR) #define ga_saccess_ptr_ F77_FUNC_(ga_saccess_ptr,GA_SACCESS_PTR) #define ga_zaccess_ptr_ F77_FUNC_(ga_zaccess_ptr,GA_ZACCESS_PTR) #define nga_access_ptr_ F77_FUNC_(nga_access_ptr, NGA_ACCESS_PTR) #define nga_caccess_ptr_ F77_FUNC_(nga_caccess_ptr,NGA_CACCESS_PTR) #define nga_daccess_ptr_ F77_FUNC_(nga_daccess_ptr,NGA_DACCESS_PTR) #define nga_iaccess_ptr_ F77_FUNC_(nga_iaccess_ptr,NGA_IACCESS_PTR) #define nga_saccess_ptr_ F77_FUNC_(nga_saccess_ptr,NGA_SACCESS_PTR) #define nga_zaccess_ptr_ F77_FUNC_(nga_zaccess_ptr,NGA_ZACCESS_PTR) #define ga_access_block_idx_ F77_FUNC_(ga_access_block_idx, GA_ACCESS_BLOCK_IDX) #define ga_caccess_block_idx_ F77_FUNC_(ga_caccess_block_idx,GA_CACCESS_BLOCK_IDX) #define ga_daccess_block_idx_ F77_FUNC_(ga_daccess_block_idx,GA_DACCESS_BLOCK_IDX) #define ga_iaccess_block_idx_ F77_FUNC_(ga_iaccess_block_idx,GA_IACCESS_BLOCK_IDX) #define ga_saccess_block_idx_ F77_FUNC_(ga_saccess_block_idx,GA_SACCESS_BLOCK_IDX) #define ga_zaccess_block_idx_ F77_FUNC_(ga_zaccess_block_idx,GA_ZACCESS_BLOCK_IDX) #define nga_access_block_idx_ F77_FUNC_(nga_access_block_idx, NGA_ACCESS_BLOCK_IDX) #define nga_caccess_block_idx_ F77_FUNC_(nga_caccess_block_idx,NGA_CACCESS_BLOCK_IDX) #define nga_daccess_block_idx_ F77_FUNC_(nga_daccess_block_idx,NGA_DACCESS_BLOCK_IDX) #define nga_iaccess_block_idx_ F77_FUNC_(nga_iaccess_block_idx,NGA_IACCESS_BLOCK_IDX) #define nga_saccess_block_idx_ F77_FUNC_(nga_saccess_block_idx,NGA_SACCESS_BLOCK_IDX) #define nga_zaccess_block_idx_ F77_FUNC_(nga_zaccess_block_idx,NGA_ZACCESS_BLOCK_IDX) #define ga_access_block_ptr_ F77_FUNC_(ga_access_block_ptr, GA_ACCESS_BLOCK_PTR) #define ga_caccess_block_ptr_ F77_FUNC_(ga_caccess_block_ptr,GA_CACCESS_BLOCK_PTR) #define ga_daccess_block_ptr_ F77_FUNC_(ga_daccess_block_ptr,GA_DACCESS_BLOCK_PTR) #define ga_iaccess_block_ptr_ F77_FUNC_(ga_iaccess_block_ptr,GA_IACCESS_BLOCK_PTR) #define ga_saccess_block_ptr_ F77_FUNC_(ga_saccess_block_ptr,GA_SACCESS_BLOCK_PTR) #define ga_zaccess_block_ptr_ F77_FUNC_(ga_zaccess_block_ptr,GA_ZACCESS_BLOCK_PTR) #define nga_access_block_ptr_ F77_FUNC_(nga_access_block_ptr, NGA_ACCESS_BLOCK_PTR) #define nga_caccess_block_ptr_ F77_FUNC_(nga_caccess_block_ptr,NGA_CACCESS_BLOCK_PTR) #define nga_daccess_block_ptr_ F77_FUNC_(nga_daccess_block_ptr,NGA_DACCESS_BLOCK_PTR) #define nga_iaccess_block_ptr_ F77_FUNC_(nga_iaccess_block_ptr,NGA_IACCESS_BLOCK_PTR) #define nga_saccess_block_ptr_ F77_FUNC_(nga_saccess_block_ptr,NGA_SACCESS_BLOCK_PTR) #define nga_zaccess_block_ptr_ F77_FUNC_(nga_zaccess_block_ptr,NGA_ZACCESS_BLOCK_PTR) #define ga_access_block_grid_idx_ F77_FUNC_(ga_access_block_grid_idx, GA_ACCESS_BLOCK_GRID_IDX) #define ga_caccess_block_grid_idx_ F77_FUNC_(ga_caccess_block_grid_idx,GA_CACCESS_BLOCK_GRID_IDX) #define ga_daccess_block_grid_idx_ F77_FUNC_(ga_daccess_block_grid_idx,GA_DACCESS_BLOCK_GRID_IDX) #define ga_iaccess_block_grid_idx_ F77_FUNC_(ga_iaccess_block_grid_idx,GA_IACCESS_BLOCK_GRID_IDX) #define ga_saccess_block_grid_idx_ F77_FUNC_(ga_saccess_block_grid_idx,GA_SACCESS_BLOCK_GRID_IDX) #define ga_zaccess_block_grid_idx_ F77_FUNC_(ga_zaccess_block_grid_idx,GA_ZACCESS_BLOCK_GRID_IDX) #define nga_access_block_grid_idx_ F77_FUNC_(nga_access_block_grid_idx, NGA_ACCESS_BLOCK_GRID_IDX) #define nga_caccess_block_grid_idx_ F77_FUNC_(nga_caccess_block_grid_idx,NGA_CACCESS_BLOCK_GRID_IDX) #define nga_daccess_block_grid_idx_ F77_FUNC_(nga_daccess_block_grid_idx,NGA_DACCESS_BLOCK_GRID_IDX) #define nga_iaccess_block_grid_idx_ F77_FUNC_(nga_iaccess_block_grid_idx,NGA_IACCESS_BLOCK_GRID_IDX) #define nga_saccess_block_grid_idx_ F77_FUNC_(nga_saccess_block_grid_idx,NGA_SACCESS_BLOCK_GRID_IDX) #define nga_zaccess_block_grid_idx_ F77_FUNC_(nga_zaccess_block_grid_idx,NGA_ZACCESS_BLOCK_GRID_IDX) #define ga_access_block_grid_ptr_ F77_FUNC_(ga_access_block_grid_ptr, GA_ACCESS_BLOCK_GRID_PTR) #define ga_caccess_block_grid_ptr_ F77_FUNC_(ga_caccess_block_grid_ptr,GA_CACCESS_BLOCK_GRID_PTR) #define ga_daccess_block_grid_ptr_ F77_FUNC_(ga_daccess_block_grid_ptr,GA_DACCESS_BLOCK_GRID_PTR) #define ga_iaccess_block_grid_ptr_ F77_FUNC_(ga_iaccess_block_grid_ptr,GA_IACCESS_BLOCK_GRID_PTR) #define ga_saccess_block_grid_ptr_ F77_FUNC_(ga_saccess_block_grid_ptr,GA_SACCESS_BLOCK_GRID_PTR) #define ga_zaccess_block_grid_ptr_ F77_FUNC_(ga_zaccess_block_grid_ptr,GA_ZACCESS_BLOCK_GRID_PTR) #define nga_access_block_grid_ptr_ F77_FUNC_(nga_access_block_grid_ptr, NGA_ACCESS_BLOCK_GRID_PTR) #define nga_caccess_block_grid_ptr_ F77_FUNC_(nga_caccess_block_grid_ptr,NGA_CACCESS_BLOCK_GRID_PTR) #define nga_daccess_block_grid_ptr_ F77_FUNC_(nga_daccess_block_grid_ptr,NGA_DACCESS_BLOCK_GRID_PTR) #define nga_iaccess_block_grid_ptr_ F77_FUNC_(nga_iaccess_block_grid_ptr,NGA_IACCESS_BLOCK_GRID_PTR) #define nga_saccess_block_grid_ptr_ F77_FUNC_(nga_saccess_block_grid_ptr,NGA_SACCESS_BLOCK_GRID_PTR) #define nga_zaccess_block_grid_ptr_ F77_FUNC_(nga_zaccess_block_grid_ptr,NGA_ZACCESS_BLOCK_GRID_PTR) #define ga_access_block_segment_idx_ F77_FUNC_(ga_access_block_segment_idx, GA_ACCESS_BLOCK_SEGMENT_IDX) #define ga_caccess_block_segment_idx_ F77_FUNC_(ga_caccess_block_segment_idx,GA_CACCESS_BLOCK_SEGMENT_IDX) #define ga_daccess_block_segment_idx_ F77_FUNC_(ga_daccess_block_segment_idx,GA_DACCESS_BLOCK_SEGMENT_IDX) #define ga_iaccess_block_segment_idx_ F77_FUNC_(ga_iaccess_block_segment_idx,GA_IACCESS_BLOCK_SEGMENT_IDX) #define ga_saccess_block_segment_idx_ F77_FUNC_(ga_saccess_block_segment_idx,GA_SACCESS_BLOCK_SEGMENT_IDX) #define ga_zaccess_block_segment_idx_ F77_FUNC_(ga_zaccess_block_segment_idx,GA_ZACCESS_BLOCK_SEGMENT_IDX) #define nga_access_block_segment_idx_ F77_FUNC_(nga_access_block_segment_idx, NGA_ACCESS_BLOCK_SEGMENT_IDX) #define nga_caccess_block_segment_idx_ F77_FUNC_(nga_caccess_block_segment_idx,NGA_CACCESS_BLOCK_SEGMENT_IDX) #define nga_daccess_block_segment_idx_ F77_FUNC_(nga_daccess_block_segment_idx,NGA_DACCESS_BLOCK_SEGMENT_IDX) #define nga_iaccess_block_segment_idx_ F77_FUNC_(nga_iaccess_block_segment_idx,NGA_IACCESS_BLOCK_SEGMENT_IDX) #define nga_saccess_block_segment_idx_ F77_FUNC_(nga_saccess_block_segment_idx,NGA_SACCESS_BLOCK_SEGMENT_IDX) #define nga_zaccess_block_segment_idx_ F77_FUNC_(nga_zaccess_block_segment_idx,NGA_ZACCESS_BLOCK_SEGMENT_IDX) #define ga_access_block_segment_ptr_ F77_FUNC_(ga_access_block_segment_ptr, GA_ACCESS_BLOCK_SEGMENT_PTR) #define ga_caccess_block_segment_ptr_ F77_FUNC_(ga_caccess_block_segment_ptr,GA_CACCESS_BLOCK_SEGMENT_PTR) #define ga_daccess_block_segment_ptr_ F77_FUNC_(ga_daccess_block_segment_ptr,GA_DACCESS_BLOCK_SEGMENT_PTR) #define ga_iaccess_block_segment_ptr_ F77_FUNC_(ga_iaccess_block_segment_ptr,GA_IACCESS_BLOCK_SEGMENT_PTR) #define ga_saccess_block_segment_ptr_ F77_FUNC_(ga_saccess_block_segment_ptr,GA_SACCESS_BLOCK_SEGMENT_PTR) #define ga_zaccess_block_segment_ptr_ F77_FUNC_(ga_zaccess_block_segment_ptr,GA_ZACCESS_BLOCK_SEGMENT_PTR) #define nga_access_block_segment_ptr_ F77_FUNC_(nga_access_block_segment_ptr, NGA_ACCESS_BLOCK_SEGMENT_PTR) #define nga_caccess_block_segment_ptr_ F77_FUNC_(nga_caccess_block_segment_ptr,NGA_CACCESS_BLOCK_SEGMENT_PTR) #define nga_daccess_block_segment_ptr_ F77_FUNC_(nga_daccess_block_segment_ptr,NGA_DACCESS_BLOCK_SEGMENT_PTR) #define nga_iaccess_block_segment_ptr_ F77_FUNC_(nga_iaccess_block_segment_ptr,NGA_IACCESS_BLOCK_SEGMENT_PTR) #define nga_saccess_block_segment_ptr_ F77_FUNC_(nga_saccess_block_segment_ptr,NGA_SACCESS_BLOCK_SEGMENT_PTR) #define nga_zaccess_block_segment_ptr_ F77_FUNC_(nga_zaccess_block_segment_ptr,NGA_ZACCESS_BLOCK_SEGMENT_PTR) #define ga_alloc_gatscat_buf_ F77_FUNC_(ga_alloc_gatscat_buf, GA_ALLOC_GATSCAT_BUF) #define ga_fence_ F77_FUNC_(ga_fence, GA_FENCE) #define ga_cfence_ F77_FUNC_(ga_cfence,GA_CFENCE) #define ga_dfence_ F77_FUNC_(ga_dfence,GA_DFENCE) #define ga_ifence_ F77_FUNC_(ga_ifence,GA_IFENCE) #define ga_sfence_ F77_FUNC_(ga_sfence,GA_SFENCE) #define ga_zfence_ F77_FUNC_(ga_zfence,GA_ZFENCE) #define nga_fence_ F77_FUNC_(nga_fence, NGA_FENCE) #define nga_cfence_ F77_FUNC_(nga_cfence,NGA_CFENCE) #define nga_dfence_ F77_FUNC_(nga_dfence,NGA_DFENCE) #define nga_ifence_ F77_FUNC_(nga_ifence,NGA_IFENCE) #define nga_sfence_ F77_FUNC_(nga_sfence,NGA_SFENCE) #define nga_zfence_ F77_FUNC_(nga_zfence,NGA_ZFENCE) #define ga_free_gatscat_buf_ F77_FUNC_(ga_free_gatscat_buf, GA_FREE_GATSCAT_BUF) #define ga_gather2d_ F77_FUNC_(ga_gather2d, GA_GATHER2D) #define ga_cgather2d_ F77_FUNC_(ga_cgather2d,GA_CGATHER2D) #define ga_dgather2d_ F77_FUNC_(ga_dgather2d,GA_DGATHER2D) #define ga_igather2d_ F77_FUNC_(ga_igather2d,GA_IGATHER2D) #define ga_sgather2d_ F77_FUNC_(ga_sgather2d,GA_SGATHER2D) #define ga_zgather2d_ F77_FUNC_(ga_zgather2d,GA_ZGATHER2D) #define nga_gather2d_ F77_FUNC_(nga_gather2d, NGA_GATHER2D) #define nga_cgather2d_ F77_FUNC_(nga_cgather2d,NGA_CGATHER2D) #define nga_dgather2d_ F77_FUNC_(nga_dgather2d,NGA_DGATHER2D) #define nga_igather2d_ F77_FUNC_(nga_igather2d,NGA_IGATHER2D) #define nga_sgather2d_ F77_FUNC_(nga_sgather2d,NGA_SGATHER2D) #define nga_zgather2d_ F77_FUNC_(nga_zgather2d,NGA_ZGATHER2D) #define ga_gather_ F77_FUNC_(ga_gather, GA_GATHER) #define ga_cgather_ F77_FUNC_(ga_cgather,GA_CGATHER) #define ga_dgather_ F77_FUNC_(ga_dgather,GA_DGATHER) #define ga_igather_ F77_FUNC_(ga_igather,GA_IGATHER) #define ga_sgather_ F77_FUNC_(ga_sgather,GA_SGATHER) #define ga_zgather_ F77_FUNC_(ga_zgather,GA_ZGATHER) #define nga_gather_ F77_FUNC_(nga_gather, NGA_GATHER) #define nga_cgather_ F77_FUNC_(nga_cgather,NGA_CGATHER) #define nga_dgather_ F77_FUNC_(nga_dgather,NGA_DGATHER) #define nga_igather_ F77_FUNC_(nga_igather,NGA_IGATHER) #define nga_sgather_ F77_FUNC_(nga_sgather,NGA_SGATHER) #define nga_zgather_ F77_FUNC_(nga_zgather,NGA_ZGATHER) #define ga_get_ F77_FUNC_(ga_get, GA_GET) #define ga_cget_ F77_FUNC_(ga_cget,GA_CGET) #define ga_dget_ F77_FUNC_(ga_dget,GA_DGET) #define ga_iget_ F77_FUNC_(ga_iget,GA_IGET) #define ga_sget_ F77_FUNC_(ga_sget,GA_SGET) #define ga_zget_ F77_FUNC_(ga_zget,GA_ZGET) #define nga_get_ F77_FUNC_(nga_get, NGA_GET) #define nga_cget_ F77_FUNC_(nga_cget,NGA_CGET) #define nga_dget_ F77_FUNC_(nga_dget,NGA_DGET) #define nga_iget_ F77_FUNC_(nga_iget,NGA_IGET) #define nga_sget_ F77_FUNC_(nga_sget,NGA_SGET) #define nga_zget_ F77_FUNC_(nga_zget,NGA_ZGET) #define ga_init_fence_ F77_FUNC_(ga_init_fence, GA_INIT_FENCE) #define ga_cinit_fence_ F77_FUNC_(ga_cinit_fence,GA_CINIT_FENCE) #define ga_dinit_fence_ F77_FUNC_(ga_dinit_fence,GA_DINIT_FENCE) #define ga_iinit_fence_ F77_FUNC_(ga_iinit_fence,GA_IINIT_FENCE) #define ga_sinit_fence_ F77_FUNC_(ga_sinit_fence,GA_SINIT_FENCE) #define ga_zinit_fence_ F77_FUNC_(ga_zinit_fence,GA_ZINIT_FENCE) #define nga_init_fence_ F77_FUNC_(nga_init_fence, NGA_INIT_FENCE) #define nga_cinit_fence_ F77_FUNC_(nga_cinit_fence,NGA_CINIT_FENCE) #define nga_dinit_fence_ F77_FUNC_(nga_dinit_fence,NGA_DINIT_FENCE) #define nga_iinit_fence_ F77_FUNC_(nga_iinit_fence,NGA_IINIT_FENCE) #define nga_sinit_fence_ F77_FUNC_(nga_sinit_fence,NGA_SINIT_FENCE) #define nga_zinit_fence_ F77_FUNC_(nga_zinit_fence,NGA_ZINIT_FENCE) #define ga_nbacc_ F77_FUNC_(ga_nbacc, GA_NBACC) #define ga_cnbacc_ F77_FUNC_(ga_cnbacc,GA_CNBACC) #define ga_dnbacc_ F77_FUNC_(ga_dnbacc,GA_DNBACC) #define ga_inbacc_ F77_FUNC_(ga_inbacc,GA_INBACC) #define ga_snbacc_ F77_FUNC_(ga_snbacc,GA_SNBACC) #define ga_znbacc_ F77_FUNC_(ga_znbacc,GA_ZNBACC) #define nga_nbacc_ F77_FUNC_(nga_nbacc, NGA_NBACC) #define nga_cnbacc_ F77_FUNC_(nga_cnbacc,NGA_CNBACC) #define nga_dnbacc_ F77_FUNC_(nga_dnbacc,NGA_DNBACC) #define nga_inbacc_ F77_FUNC_(nga_inbacc,NGA_INBACC) #define nga_snbacc_ F77_FUNC_(nga_snbacc,NGA_SNBACC) #define nga_znbacc_ F77_FUNC_(nga_znbacc,NGA_ZNBACC) #define ga_nbget_ F77_FUNC_(ga_nbget, GA_NBGET) #define ga_cnbget_ F77_FUNC_(ga_cnbget,GA_CNBGET) #define ga_dnbget_ F77_FUNC_(ga_dnbget,GA_DNBGET) #define ga_inbget_ F77_FUNC_(ga_inbget,GA_INBGET) #define ga_snbget_ F77_FUNC_(ga_snbget,GA_SNBGET) #define ga_znbget_ F77_FUNC_(ga_znbget,GA_ZNBGET) #define nga_nbget_ F77_FUNC_(nga_nbget, NGA_NBGET) #define nga_cnbget_ F77_FUNC_(nga_cnbget,NGA_CNBGET) #define nga_dnbget_ F77_FUNC_(nga_dnbget,NGA_DNBGET) #define nga_inbget_ F77_FUNC_(nga_inbget,NGA_INBGET) #define nga_snbget_ F77_FUNC_(nga_snbget,NGA_SNBGET) #define nga_znbget_ F77_FUNC_(nga_znbget,NGA_ZNBGET) #define ga_nbput_ F77_FUNC_(ga_nbput, GA_NBPUT) #define ga_cnbput_ F77_FUNC_(ga_cnbput,GA_CNBPUT) #define ga_dnbput_ F77_FUNC_(ga_dnbput,GA_DNBPUT) #define ga_inbput_ F77_FUNC_(ga_inbput,GA_INBPUT) #define ga_snbput_ F77_FUNC_(ga_snbput,GA_SNBPUT) #define ga_znbput_ F77_FUNC_(ga_znbput,GA_ZNBPUT) #define nga_nbput_ F77_FUNC_(nga_nbput, NGA_NBPUT) #define nga_cnbput_ F77_FUNC_(nga_cnbput,NGA_CNBPUT) #define nga_dnbput_ F77_FUNC_(nga_dnbput,NGA_DNBPUT) #define nga_inbput_ F77_FUNC_(nga_inbput,NGA_INBPUT) #define nga_snbput_ F77_FUNC_(nga_snbput,NGA_SNBPUT) #define nga_znbput_ F77_FUNC_(nga_znbput,NGA_ZNBPUT) #define ga_nbput_notify_ F77_FUNC_(ga_nbput_notify, GA_NBPUT_NOTIFY) #define ga_cnbput_notify_ F77_FUNC_(ga_cnbput_notify,GA_CNBPUT_NOTIFY) #define ga_dnbput_notify_ F77_FUNC_(ga_dnbput_notify,GA_DNBPUT_NOTIFY) #define ga_inbput_notify_ F77_FUNC_(ga_inbput_notify,GA_INBPUT_NOTIFY) #define ga_snbput_notify_ F77_FUNC_(ga_snbput_notify,GA_SNBPUT_NOTIFY) #define ga_znbput_notify_ F77_FUNC_(ga_znbput_notify,GA_ZNBPUT_NOTIFY) #define nga_nbput_notify_ F77_FUNC_(nga_nbput_notify, NGA_NBPUT_NOTIFY) #define nga_cnbput_notify_ F77_FUNC_(nga_cnbput_notify,NGA_CNBPUT_NOTIFY) #define nga_dnbput_notify_ F77_FUNC_(nga_dnbput_notify,NGA_DNBPUT_NOTIFY) #define nga_inbput_notify_ F77_FUNC_(nga_inbput_notify,NGA_INBPUT_NOTIFY) #define nga_snbput_notify_ F77_FUNC_(nga_snbput_notify,NGA_SNBPUT_NOTIFY) #define nga_znbput_notify_ F77_FUNC_(nga_znbput_notify,NGA_ZNBPUT_NOTIFY) #define ga_nbwait_notify_ F77_FUNC_(ga_nbwait_notify, GA_NBWAIT_NOTIFY) #define ga_cnbwait_notify_ F77_FUNC_(ga_cnbwait_notify,GA_CNBWAIT_NOTIFY) #define ga_dnbwait_notify_ F77_FUNC_(ga_dnbwait_notify,GA_DNBWAIT_NOTIFY) #define ga_inbwait_notify_ F77_FUNC_(ga_inbwait_notify,GA_INBWAIT_NOTIFY) #define ga_snbwait_notify_ F77_FUNC_(ga_snbwait_notify,GA_SNBWAIT_NOTIFY) #define ga_znbwait_notify_ F77_FUNC_(ga_znbwait_notify,GA_ZNBWAIT_NOTIFY) #define nga_nbwait_notify_ F77_FUNC_(nga_nbwait_notify, NGA_NBWAIT_NOTIFY) #define nga_cnbwait_notify_ F77_FUNC_(nga_cnbwait_notify,NGA_CNBWAIT_NOTIFY) #define nga_dnbwait_notify_ F77_FUNC_(nga_dnbwait_notify,NGA_DNBWAIT_NOTIFY) #define nga_inbwait_notify_ F77_FUNC_(nga_inbwait_notify,NGA_INBWAIT_NOTIFY) #define nga_snbwait_notify_ F77_FUNC_(nga_snbwait_notify,NGA_SNBWAIT_NOTIFY) #define nga_znbwait_notify_ F77_FUNC_(nga_znbwait_notify,NGA_ZNBWAIT_NOTIFY) #define ga_nbtest_ F77_FUNC_(ga_nbtest, GA_NBTEST) #define ga_cnbtest_ F77_FUNC_(ga_cnbtest,GA_CNBTEST) #define ga_dnbtest_ F77_FUNC_(ga_dnbtest,GA_DNBTEST) #define ga_inbtest_ F77_FUNC_(ga_inbtest,GA_INBTEST) #define ga_snbtest_ F77_FUNC_(ga_snbtest,GA_SNBTEST) #define ga_znbtest_ F77_FUNC_(ga_znbtest,GA_ZNBTEST) #define nga_nbtest_ F77_FUNC_(nga_nbtest, NGA_NBTEST) #define nga_cnbtest_ F77_FUNC_(nga_cnbtest,NGA_CNBTEST) #define nga_dnbtest_ F77_FUNC_(nga_dnbtest,NGA_DNBTEST) #define nga_inbtest_ F77_FUNC_(nga_inbtest,NGA_INBTEST) #define nga_snbtest_ F77_FUNC_(nga_snbtest,NGA_SNBTEST) #define nga_znbtest_ F77_FUNC_(nga_znbtest,NGA_ZNBTEST) #define ga_nbwait_ F77_FUNC_(ga_nbwait, GA_NBWAIT) #define ga_cnbwait_ F77_FUNC_(ga_cnbwait,GA_CNBWAIT) #define ga_dnbwait_ F77_FUNC_(ga_dnbwait,GA_DNBWAIT) #define ga_inbwait_ F77_FUNC_(ga_inbwait,GA_INBWAIT) #define ga_snbwait_ F77_FUNC_(ga_snbwait,GA_SNBWAIT) #define ga_znbwait_ F77_FUNC_(ga_znbwait,GA_ZNBWAIT) #define nga_nbwait_ F77_FUNC_(nga_nbwait, NGA_NBWAIT) #define nga_cnbwait_ F77_FUNC_(nga_cnbwait,NGA_CNBWAIT) #define nga_dnbwait_ F77_FUNC_(nga_dnbwait,NGA_DNBWAIT) #define nga_inbwait_ F77_FUNC_(nga_inbwait,NGA_INBWAIT) #define nga_snbwait_ F77_FUNC_(nga_snbwait,NGA_SNBWAIT) #define nga_znbwait_ F77_FUNC_(nga_znbwait,NGA_ZNBWAIT) #define ga_put_ F77_FUNC_(ga_put, GA_PUT) #define ga_cput_ F77_FUNC_(ga_cput,GA_CPUT) #define ga_dput_ F77_FUNC_(ga_dput,GA_DPUT) #define ga_iput_ F77_FUNC_(ga_iput,GA_IPUT) #define ga_sput_ F77_FUNC_(ga_sput,GA_SPUT) #define ga_zput_ F77_FUNC_(ga_zput,GA_ZPUT) #define nga_put_ F77_FUNC_(nga_put, NGA_PUT) #define nga_cput_ F77_FUNC_(nga_cput,NGA_CPUT) #define nga_dput_ F77_FUNC_(nga_dput,NGA_DPUT) #define nga_iput_ F77_FUNC_(nga_iput,NGA_IPUT) #define nga_sput_ F77_FUNC_(nga_sput,NGA_SPUT) #define nga_zput_ F77_FUNC_(nga_zput,NGA_ZPUT) #define ga_pgroup_sync_ F77_FUNC_(ga_pgroup_sync, GA_PGROUP_SYNC) #define ga_cpgroup_sync_ F77_FUNC_(ga_cpgroup_sync,GA_CPGROUP_SYNC) #define ga_dpgroup_sync_ F77_FUNC_(ga_dpgroup_sync,GA_DPGROUP_SYNC) #define ga_ipgroup_sync_ F77_FUNC_(ga_ipgroup_sync,GA_IPGROUP_SYNC) #define ga_spgroup_sync_ F77_FUNC_(ga_spgroup_sync,GA_SPGROUP_SYNC) #define ga_zpgroup_sync_ F77_FUNC_(ga_zpgroup_sync,GA_ZPGROUP_SYNC) #define nga_pgroup_sync_ F77_FUNC_(nga_pgroup_sync, NGA_PGROUP_SYNC) #define nga_cpgroup_sync_ F77_FUNC_(nga_cpgroup_sync,NGA_CPGROUP_SYNC) #define nga_dpgroup_sync_ F77_FUNC_(nga_dpgroup_sync,NGA_DPGROUP_SYNC) #define nga_ipgroup_sync_ F77_FUNC_(nga_ipgroup_sync,NGA_IPGROUP_SYNC) #define nga_spgroup_sync_ F77_FUNC_(nga_spgroup_sync,NGA_SPGROUP_SYNC) #define nga_zpgroup_sync_ F77_FUNC_(nga_zpgroup_sync,NGA_ZPGROUP_SYNC) #define ga_read_inc_ F77_FUNC_(ga_read_inc, GA_READ_INC) #define ga_cread_inc_ F77_FUNC_(ga_cread_inc,GA_CREAD_INC) #define ga_dread_inc_ F77_FUNC_(ga_dread_inc,GA_DREAD_INC) #define ga_iread_inc_ F77_FUNC_(ga_iread_inc,GA_IREAD_INC) #define ga_sread_inc_ F77_FUNC_(ga_sread_inc,GA_SREAD_INC) #define ga_zread_inc_ F77_FUNC_(ga_zread_inc,GA_ZREAD_INC) #define nga_read_inc_ F77_FUNC_(nga_read_inc, NGA_READ_INC) #define nga_cread_inc_ F77_FUNC_(nga_cread_inc,NGA_CREAD_INC) #define nga_dread_inc_ F77_FUNC_(nga_dread_inc,NGA_DREAD_INC) #define nga_iread_inc_ F77_FUNC_(nga_iread_inc,NGA_IREAD_INC) #define nga_sread_inc_ F77_FUNC_(nga_sread_inc,NGA_SREAD_INC) #define nga_zread_inc_ F77_FUNC_(nga_zread_inc,NGA_ZREAD_INC) #define ga_release_ F77_FUNC_(ga_release, GA_RELEASE) #define ga_crelease_ F77_FUNC_(ga_crelease,GA_CRELEASE) #define ga_drelease_ F77_FUNC_(ga_drelease,GA_DRELEASE) #define ga_irelease_ F77_FUNC_(ga_irelease,GA_IRELEASE) #define ga_srelease_ F77_FUNC_(ga_srelease,GA_SRELEASE) #define ga_zrelease_ F77_FUNC_(ga_zrelease,GA_ZRELEASE) #define nga_release_ F77_FUNC_(nga_release, NGA_RELEASE) #define nga_crelease_ F77_FUNC_(nga_crelease,NGA_CRELEASE) #define nga_drelease_ F77_FUNC_(nga_drelease,NGA_DRELEASE) #define nga_irelease_ F77_FUNC_(nga_irelease,NGA_IRELEASE) #define nga_srelease_ F77_FUNC_(nga_srelease,NGA_SRELEASE) #define nga_zrelease_ F77_FUNC_(nga_zrelease,NGA_ZRELEASE) #define ga_release_block_ F77_FUNC_(ga_release_block, GA_RELEASE_BLOCK) #define ga_crelease_block_ F77_FUNC_(ga_crelease_block,GA_CRELEASE_BLOCK) #define ga_drelease_block_ F77_FUNC_(ga_drelease_block,GA_DRELEASE_BLOCK) #define ga_irelease_block_ F77_FUNC_(ga_irelease_block,GA_IRELEASE_BLOCK) #define ga_srelease_block_ F77_FUNC_(ga_srelease_block,GA_SRELEASE_BLOCK) #define ga_zrelease_block_ F77_FUNC_(ga_zrelease_block,GA_ZRELEASE_BLOCK) #define nga_release_block_ F77_FUNC_(nga_release_block, NGA_RELEASE_BLOCK) #define nga_crelease_block_ F77_FUNC_(nga_crelease_block,NGA_CRELEASE_BLOCK) #define nga_drelease_block_ F77_FUNC_(nga_drelease_block,NGA_DRELEASE_BLOCK) #define nga_irelease_block_ F77_FUNC_(nga_irelease_block,NGA_IRELEASE_BLOCK) #define nga_srelease_block_ F77_FUNC_(nga_srelease_block,NGA_SRELEASE_BLOCK) #define nga_zrelease_block_ F77_FUNC_(nga_zrelease_block,NGA_ZRELEASE_BLOCK) #define ga_release_block_grid_ F77_FUNC_(ga_release_block_grid, GA_RELEASE_BLOCK_GRID) #define ga_crelease_block_grid_ F77_FUNC_(ga_crelease_block_grid,GA_CRELEASE_BLOCK_GRID) #define ga_drelease_block_grid_ F77_FUNC_(ga_drelease_block_grid,GA_DRELEASE_BLOCK_GRID) #define ga_irelease_block_grid_ F77_FUNC_(ga_irelease_block_grid,GA_IRELEASE_BLOCK_GRID) #define ga_srelease_block_grid_ F77_FUNC_(ga_srelease_block_grid,GA_SRELEASE_BLOCK_GRID) #define ga_zrelease_block_grid_ F77_FUNC_(ga_zrelease_block_grid,GA_ZRELEASE_BLOCK_GRID) #define nga_release_block_grid_ F77_FUNC_(nga_release_block_grid, NGA_RELEASE_BLOCK_GRID) #define nga_crelease_block_grid_ F77_FUNC_(nga_crelease_block_grid,NGA_CRELEASE_BLOCK_GRID) #define nga_drelease_block_grid_ F77_FUNC_(nga_drelease_block_grid,NGA_DRELEASE_BLOCK_GRID) #define nga_irelease_block_grid_ F77_FUNC_(nga_irelease_block_grid,NGA_IRELEASE_BLOCK_GRID) #define nga_srelease_block_grid_ F77_FUNC_(nga_srelease_block_grid,NGA_SRELEASE_BLOCK_GRID) #define nga_zrelease_block_grid_ F77_FUNC_(nga_zrelease_block_grid,NGA_ZRELEASE_BLOCK_GRID) #define ga_release_block_segment_ F77_FUNC_(ga_release_block_segment, GA_RELEASE_BLOCK_SEGMENT) #define ga_crelease_block_segment_ F77_FUNC_(ga_crelease_block_segment,GA_CRELEASE_BLOCK_SEGMENT) #define ga_drelease_block_segment_ F77_FUNC_(ga_drelease_block_segment,GA_DRELEASE_BLOCK_SEGMENT) #define ga_irelease_block_segment_ F77_FUNC_(ga_irelease_block_segment,GA_IRELEASE_BLOCK_SEGMENT) #define ga_srelease_block_segment_ F77_FUNC_(ga_srelease_block_segment,GA_SRELEASE_BLOCK_SEGMENT) #define ga_zrelease_block_segment_ F77_FUNC_(ga_zrelease_block_segment,GA_ZRELEASE_BLOCK_SEGMENT) #define nga_release_block_segment_ F77_FUNC_(nga_release_block_segment, NGA_RELEASE_BLOCK_SEGMENT) #define nga_crelease_block_segment_ F77_FUNC_(nga_crelease_block_segment,NGA_CRELEASE_BLOCK_SEGMENT) #define nga_drelease_block_segment_ F77_FUNC_(nga_drelease_block_segment,NGA_DRELEASE_BLOCK_SEGMENT) #define nga_irelease_block_segment_ F77_FUNC_(nga_irelease_block_segment,NGA_IRELEASE_BLOCK_SEGMENT) #define nga_srelease_block_segment_ F77_FUNC_(nga_srelease_block_segment,NGA_SRELEASE_BLOCK_SEGMENT) #define nga_zrelease_block_segment_ F77_FUNC_(nga_zrelease_block_segment,NGA_ZRELEASE_BLOCK_SEGMENT) #define ga_release_update_ F77_FUNC_(ga_release_update, GA_RELEASE_UPDATE) #define ga_crelease_update_ F77_FUNC_(ga_crelease_update,GA_CRELEASE_UPDATE) #define ga_drelease_update_ F77_FUNC_(ga_drelease_update,GA_DRELEASE_UPDATE) #define ga_irelease_update_ F77_FUNC_(ga_irelease_update,GA_IRELEASE_UPDATE) #define ga_srelease_update_ F77_FUNC_(ga_srelease_update,GA_SRELEASE_UPDATE) #define ga_zrelease_update_ F77_FUNC_(ga_zrelease_update,GA_ZRELEASE_UPDATE) #define nga_release_update_ F77_FUNC_(nga_release_update, NGA_RELEASE_UPDATE) #define nga_crelease_update_ F77_FUNC_(nga_crelease_update,NGA_CRELEASE_UPDATE) #define nga_drelease_update_ F77_FUNC_(nga_drelease_update,NGA_DRELEASE_UPDATE) #define nga_irelease_update_ F77_FUNC_(nga_irelease_update,NGA_IRELEASE_UPDATE) #define nga_srelease_update_ F77_FUNC_(nga_srelease_update,NGA_SRELEASE_UPDATE) #define nga_zrelease_update_ F77_FUNC_(nga_zrelease_update,NGA_ZRELEASE_UPDATE) #define ga_release_update_block_ F77_FUNC_(ga_release_update_block, GA_RELEASE_UPDATE_BLOCK) #define ga_crelease_update_block_ F77_FUNC_(ga_crelease_update_block,GA_CRELEASE_UPDATE_BLOCK) #define ga_drelease_update_block_ F77_FUNC_(ga_drelease_update_block,GA_DRELEASE_UPDATE_BLOCK) #define ga_irelease_update_block_ F77_FUNC_(ga_irelease_update_block,GA_IRELEASE_UPDATE_BLOCK) #define ga_srelease_update_block_ F77_FUNC_(ga_srelease_update_block,GA_SRELEASE_UPDATE_BLOCK) #define ga_zrelease_update_block_ F77_FUNC_(ga_zrelease_update_block,GA_ZRELEASE_UPDATE_BLOCK) #define nga_release_update_block_ F77_FUNC_(nga_release_update_block, NGA_RELEASE_UPDATE_BLOCK) #define nga_crelease_update_block_ F77_FUNC_(nga_crelease_update_block,NGA_CRELEASE_UPDATE_BLOCK) #define nga_drelease_update_block_ F77_FUNC_(nga_drelease_update_block,NGA_DRELEASE_UPDATE_BLOCK) #define nga_irelease_update_block_ F77_FUNC_(nga_irelease_update_block,NGA_IRELEASE_UPDATE_BLOCK) #define nga_srelease_update_block_ F77_FUNC_(nga_srelease_update_block,NGA_SRELEASE_UPDATE_BLOCK) #define nga_zrelease_update_block_ F77_FUNC_(nga_zrelease_update_block,NGA_ZRELEASE_UPDATE_BLOCK) #define ga_release_update_block_grid_ F77_FUNC_(ga_release_update_block_grid, GA_RELEASE_UPDATE_BLOCK_GRID) #define ga_crelease_update_block_grid_ F77_FUNC_(ga_crelease_update_block_grid,GA_CRELEASE_UPDATE_BLOCK_GRID) #define ga_drelease_update_block_grid_ F77_FUNC_(ga_drelease_update_block_grid,GA_DRELEASE_UPDATE_BLOCK_GRID) #define ga_irelease_update_block_grid_ F77_FUNC_(ga_irelease_update_block_grid,GA_IRELEASE_UPDATE_BLOCK_GRID) #define ga_srelease_update_block_grid_ F77_FUNC_(ga_srelease_update_block_grid,GA_SRELEASE_UPDATE_BLOCK_GRID) #define ga_zrelease_update_block_grid_ F77_FUNC_(ga_zrelease_update_block_grid,GA_ZRELEASE_UPDATE_BLOCK_GRID) #define nga_release_update_block_grid_ F77_FUNC_(nga_release_update_block_grid, NGA_RELEASE_UPDATE_BLOCK_GRID) #define nga_crelease_update_block_grid_ F77_FUNC_(nga_crelease_update_block_grid,NGA_CRELEASE_UPDATE_BLOCK_GRID) #define nga_drelease_update_block_grid_ F77_FUNC_(nga_drelease_update_block_grid,NGA_DRELEASE_UPDATE_BLOCK_GRID) #define nga_irelease_update_block_grid_ F77_FUNC_(nga_irelease_update_block_grid,NGA_IRELEASE_UPDATE_BLOCK_GRID) #define nga_srelease_update_block_grid_ F77_FUNC_(nga_srelease_update_block_grid,NGA_SRELEASE_UPDATE_BLOCK_GRID) #define nga_zrelease_update_block_grid_ F77_FUNC_(nga_zrelease_update_block_grid,NGA_ZRELEASE_UPDATE_BLOCK_GRID) #define ga_release_update_block_segment_ F77_FUNC_(ga_release_update_block_segment, GA_RELEASE_UPDATE_BLOCK_SEGMENT) #define ga_crelease_update_block_segment_ F77_FUNC_(ga_crelease_update_block_segment,GA_CRELEASE_UPDATE_BLOCK_SEGMENT) #define ga_drelease_update_block_segment_ F77_FUNC_(ga_drelease_update_block_segment,GA_DRELEASE_UPDATE_BLOCK_SEGMENT) #define ga_irelease_update_block_segment_ F77_FUNC_(ga_irelease_update_block_segment,GA_IRELEASE_UPDATE_BLOCK_SEGMENT) #define ga_srelease_update_block_segment_ F77_FUNC_(ga_srelease_update_block_segment,GA_SRELEASE_UPDATE_BLOCK_SEGMENT) #define ga_zrelease_update_block_segment_ F77_FUNC_(ga_zrelease_update_block_segment,GA_ZRELEASE_UPDATE_BLOCK_SEGMENT) #define nga_release_update_block_segment_ F77_FUNC_(nga_release_update_block_segment, NGA_RELEASE_UPDATE_BLOCK_SEGMENT) #define nga_crelease_update_block_segment_ F77_FUNC_(nga_crelease_update_block_segment,NGA_CRELEASE_UPDATE_BLOCK_SEGMENT) #define nga_drelease_update_block_segment_ F77_FUNC_(nga_drelease_update_block_segment,NGA_DRELEASE_UPDATE_BLOCK_SEGMENT) #define nga_irelease_update_block_segment_ F77_FUNC_(nga_irelease_update_block_segment,NGA_IRELEASE_UPDATE_BLOCK_SEGMENT) #define nga_srelease_update_block_segment_ F77_FUNC_(nga_srelease_update_block_segment,NGA_SRELEASE_UPDATE_BLOCK_SEGMENT) #define nga_zrelease_update_block_segment_ F77_FUNC_(nga_zrelease_update_block_segment,NGA_ZRELEASE_UPDATE_BLOCK_SEGMENT) #define ga_scatter2d_ F77_FUNC_(ga_scatter2d, GA_SCATTER2D) #define ga_cscatter2d_ F77_FUNC_(ga_cscatter2d,GA_CSCATTER2D) #define ga_dscatter2d_ F77_FUNC_(ga_dscatter2d,GA_DSCATTER2D) #define ga_iscatter2d_ F77_FUNC_(ga_iscatter2d,GA_ISCATTER2D) #define ga_sscatter2d_ F77_FUNC_(ga_sscatter2d,GA_SSCATTER2D) #define ga_zscatter2d_ F77_FUNC_(ga_zscatter2d,GA_ZSCATTER2D) #define nga_scatter2d_ F77_FUNC_(nga_scatter2d, NGA_SCATTER2D) #define nga_cscatter2d_ F77_FUNC_(nga_cscatter2d,NGA_CSCATTER2D) #define nga_dscatter2d_ F77_FUNC_(nga_dscatter2d,NGA_DSCATTER2D) #define nga_iscatter2d_ F77_FUNC_(nga_iscatter2d,NGA_ISCATTER2D) #define nga_sscatter2d_ F77_FUNC_(nga_sscatter2d,NGA_SSCATTER2D) #define nga_zscatter2d_ F77_FUNC_(nga_zscatter2d,NGA_ZSCATTER2D) #define ga_scatter_ F77_FUNC_(ga_scatter, GA_SCATTER) #define ga_cscatter_ F77_FUNC_(ga_cscatter,GA_CSCATTER) #define ga_dscatter_ F77_FUNC_(ga_dscatter,GA_DSCATTER) #define ga_iscatter_ F77_FUNC_(ga_iscatter,GA_ISCATTER) #define ga_sscatter_ F77_FUNC_(ga_sscatter,GA_SSCATTER) #define ga_zscatter_ F77_FUNC_(ga_zscatter,GA_ZSCATTER) #define nga_scatter_ F77_FUNC_(nga_scatter, NGA_SCATTER) #define nga_cscatter_ F77_FUNC_(nga_cscatter,NGA_CSCATTER) #define nga_dscatter_ F77_FUNC_(nga_dscatter,NGA_DSCATTER) #define nga_iscatter_ F77_FUNC_(nga_iscatter,NGA_ISCATTER) #define nga_sscatter_ F77_FUNC_(nga_sscatter,NGA_SSCATTER) #define nga_zscatter_ F77_FUNC_(nga_zscatter,NGA_ZSCATTER) #define ga_scatter_acc2d_ F77_FUNC_(ga_scatter_acc2d, GA_SCATTER_ACC2D) #define ga_cscatter_acc2d_ F77_FUNC_(ga_cscatter_acc2d,GA_CSCATTER_ACC2D) #define ga_dscatter_acc2d_ F77_FUNC_(ga_dscatter_acc2d,GA_DSCATTER_ACC2D) #define ga_iscatter_acc2d_ F77_FUNC_(ga_iscatter_acc2d,GA_ISCATTER_ACC2D) #define ga_sscatter_acc2d_ F77_FUNC_(ga_sscatter_acc2d,GA_SSCATTER_ACC2D) #define ga_zscatter_acc2d_ F77_FUNC_(ga_zscatter_acc2d,GA_ZSCATTER_ACC2D) #define nga_scatter_acc2d_ F77_FUNC_(nga_scatter_acc2d, NGA_SCATTER_ACC2D) #define nga_cscatter_acc2d_ F77_FUNC_(nga_cscatter_acc2d,NGA_CSCATTER_ACC2D) #define nga_dscatter_acc2d_ F77_FUNC_(nga_dscatter_acc2d,NGA_DSCATTER_ACC2D) #define nga_iscatter_acc2d_ F77_FUNC_(nga_iscatter_acc2d,NGA_ISCATTER_ACC2D) #define nga_sscatter_acc2d_ F77_FUNC_(nga_sscatter_acc2d,NGA_SSCATTER_ACC2D) #define nga_zscatter_acc2d_ F77_FUNC_(nga_zscatter_acc2d,NGA_ZSCATTER_ACC2D) #define ga_scatter_acc_ F77_FUNC_(ga_scatter_acc, GA_SCATTER_ACC) #define ga_cscatter_acc_ F77_FUNC_(ga_cscatter_acc,GA_CSCATTER_ACC) #define ga_dscatter_acc_ F77_FUNC_(ga_dscatter_acc,GA_DSCATTER_ACC) #define ga_iscatter_acc_ F77_FUNC_(ga_iscatter_acc,GA_ISCATTER_ACC) #define ga_sscatter_acc_ F77_FUNC_(ga_sscatter_acc,GA_SSCATTER_ACC) #define ga_zscatter_acc_ F77_FUNC_(ga_zscatter_acc,GA_ZSCATTER_ACC) #define nga_scatter_acc_ F77_FUNC_(nga_scatter_acc, NGA_SCATTER_ACC) #define nga_cscatter_acc_ F77_FUNC_(nga_cscatter_acc,NGA_CSCATTER_ACC) #define nga_dscatter_acc_ F77_FUNC_(nga_dscatter_acc,NGA_DSCATTER_ACC) #define nga_iscatter_acc_ F77_FUNC_(nga_iscatter_acc,NGA_ISCATTER_ACC) #define nga_sscatter_acc_ F77_FUNC_(nga_sscatter_acc,NGA_SSCATTER_ACC) #define nga_zscatter_acc_ F77_FUNC_(nga_zscatter_acc,NGA_ZSCATTER_ACC) #define ga_strided_acc_ F77_FUNC_(ga_strided_acc, GA_STRIDED_ACC) #define ga_cstrided_acc_ F77_FUNC_(ga_cstrided_acc,GA_CSTRIDED_ACC) #define ga_dstrided_acc_ F77_FUNC_(ga_dstrided_acc,GA_DSTRIDED_ACC) #define ga_istrided_acc_ F77_FUNC_(ga_istrided_acc,GA_ISTRIDED_ACC) #define ga_sstrided_acc_ F77_FUNC_(ga_sstrided_acc,GA_SSTRIDED_ACC) #define ga_zstrided_acc_ F77_FUNC_(ga_zstrided_acc,GA_ZSTRIDED_ACC) #define nga_strided_acc_ F77_FUNC_(nga_strided_acc, NGA_STRIDED_ACC) #define nga_cstrided_acc_ F77_FUNC_(nga_cstrided_acc,NGA_CSTRIDED_ACC) #define nga_dstrided_acc_ F77_FUNC_(nga_dstrided_acc,NGA_DSTRIDED_ACC) #define nga_istrided_acc_ F77_FUNC_(nga_istrided_acc,NGA_ISTRIDED_ACC) #define nga_sstrided_acc_ F77_FUNC_(nga_sstrided_acc,NGA_SSTRIDED_ACC) #define nga_zstrided_acc_ F77_FUNC_(nga_zstrided_acc,NGA_ZSTRIDED_ACC) #define ga_strided_get_ F77_FUNC_(ga_strided_get, GA_STRIDED_GET) #define ga_cstrided_get_ F77_FUNC_(ga_cstrided_get,GA_CSTRIDED_GET) #define ga_dstrided_get_ F77_FUNC_(ga_dstrided_get,GA_DSTRIDED_GET) #define ga_istrided_get_ F77_FUNC_(ga_istrided_get,GA_ISTRIDED_GET) #define ga_sstrided_get_ F77_FUNC_(ga_sstrided_get,GA_SSTRIDED_GET) #define ga_zstrided_get_ F77_FUNC_(ga_zstrided_get,GA_ZSTRIDED_GET) #define nga_strided_get_ F77_FUNC_(nga_strided_get, NGA_STRIDED_GET) #define nga_cstrided_get_ F77_FUNC_(nga_cstrided_get,NGA_CSTRIDED_GET) #define nga_dstrided_get_ F77_FUNC_(nga_dstrided_get,NGA_DSTRIDED_GET) #define nga_istrided_get_ F77_FUNC_(nga_istrided_get,NGA_ISTRIDED_GET) #define nga_sstrided_get_ F77_FUNC_(nga_sstrided_get,NGA_SSTRIDED_GET) #define nga_zstrided_get_ F77_FUNC_(nga_zstrided_get,NGA_ZSTRIDED_GET) #define ga_strided_put_ F77_FUNC_(ga_strided_put, GA_STRIDED_PUT) #define ga_cstrided_put_ F77_FUNC_(ga_cstrided_put,GA_CSTRIDED_PUT) #define ga_dstrided_put_ F77_FUNC_(ga_dstrided_put,GA_DSTRIDED_PUT) #define ga_istrided_put_ F77_FUNC_(ga_istrided_put,GA_ISTRIDED_PUT) #define ga_sstrided_put_ F77_FUNC_(ga_sstrided_put,GA_SSTRIDED_PUT) #define ga_zstrided_put_ F77_FUNC_(ga_zstrided_put,GA_ZSTRIDED_PUT) #define nga_strided_put_ F77_FUNC_(nga_strided_put, NGA_STRIDED_PUT) #define nga_cstrided_put_ F77_FUNC_(nga_cstrided_put,NGA_CSTRIDED_PUT) #define nga_dstrided_put_ F77_FUNC_(nga_dstrided_put,NGA_DSTRIDED_PUT) #define nga_istrided_put_ F77_FUNC_(nga_istrided_put,NGA_ISTRIDED_PUT) #define nga_sstrided_put_ F77_FUNC_(nga_sstrided_put,NGA_SSTRIDED_PUT) #define nga_zstrided_put_ F77_FUNC_(nga_zstrided_put,NGA_ZSTRIDED_PUT) #define ga_sync_ F77_FUNC_(ga_sync, GA_SYNC) #define ga_csync_ F77_FUNC_(ga_csync,GA_CSYNC) #define ga_dsync_ F77_FUNC_(ga_dsync,GA_DSYNC) #define ga_isync_ F77_FUNC_(ga_isync,GA_ISYNC) #define ga_ssync_ F77_FUNC_(ga_ssync,GA_SSYNC) #define ga_zsync_ F77_FUNC_(ga_zsync,GA_ZSYNC) #define nga_sync_ F77_FUNC_(nga_sync, NGA_SYNC) #define nga_csync_ F77_FUNC_(nga_csync,NGA_CSYNC) #define nga_dsync_ F77_FUNC_(nga_dsync,NGA_DSYNC) #define nga_isync_ F77_FUNC_(nga_isync,NGA_ISYNC) #define nga_ssync_ F77_FUNC_(nga_ssync,NGA_SSYNC) #define nga_zsync_ F77_FUNC_(nga_zsync,NGA_ZSYNC) #define ga_wtime_ F77_FUNC_(ga_wtime, GA_WTIME) #define ga_cwtime_ F77_FUNC_(ga_cwtime,GA_CWTIME) #define ga_dwtime_ F77_FUNC_(ga_dwtime,GA_DWTIME) #define ga_iwtime_ F77_FUNC_(ga_iwtime,GA_IWTIME) #define ga_swtime_ F77_FUNC_(ga_swtime,GA_SWTIME) #define ga_zwtime_ F77_FUNC_(ga_zwtime,GA_ZWTIME) #define nga_wtime_ F77_FUNC_(nga_wtime, NGA_WTIME) #define nga_cwtime_ F77_FUNC_(nga_cwtime,NGA_CWTIME) #define nga_dwtime_ F77_FUNC_(nga_dwtime,NGA_DWTIME) #define nga_iwtime_ F77_FUNC_(nga_iwtime,NGA_IWTIME) #define nga_swtime_ F77_FUNC_(nga_swtime,NGA_SWTIME) #define nga_zwtime_ F77_FUNC_(nga_zwtime,NGA_ZWTIME) #define ga_type_f2c_ F77_FUNC_(ga_type_f2c, GA_TYPE_F2C) #define ga_ctype_f2c_ F77_FUNC_(ga_ctype_f2c,GA_CTYPE_F2C) #define ga_dtype_f2c_ F77_FUNC_(ga_dtype_f2c,GA_DTYPE_F2C) #define ga_itype_f2c_ F77_FUNC_(ga_itype_f2c,GA_ITYPE_F2C) #define ga_stype_f2c_ F77_FUNC_(ga_stype_f2c,GA_STYPE_F2C) #define ga_ztype_f2c_ F77_FUNC_(ga_ztype_f2c,GA_ZTYPE_F2C) #define nga_type_f2c_ F77_FUNC_(nga_type_f2c, NGA_TYPE_F2C) #define nga_ctype_f2c_ F77_FUNC_(nga_ctype_f2c,NGA_CTYPE_F2C) #define nga_dtype_f2c_ F77_FUNC_(nga_dtype_f2c,NGA_DTYPE_F2C) #define nga_itype_f2c_ F77_FUNC_(nga_itype_f2c,NGA_ITYPE_F2C) #define nga_stype_f2c_ F77_FUNC_(nga_stype_f2c,NGA_STYPE_F2C) #define nga_ztype_f2c_ F77_FUNC_(nga_ztype_f2c,NGA_ZTYPE_F2C) #define ga_type_c2f_ F77_FUNC_(ga_type_c2f, GA_TYPE_C2F) #define ga_ctype_c2f_ F77_FUNC_(ga_ctype_c2f,GA_CTYPE_C2F) #define ga_dtype_c2f_ F77_FUNC_(ga_dtype_c2f,GA_DTYPE_C2F) #define ga_itype_c2f_ F77_FUNC_(ga_itype_c2f,GA_ITYPE_C2F) #define ga_stype_c2f_ F77_FUNC_(ga_stype_c2f,GA_STYPE_C2F) #define ga_ztype_c2f_ F77_FUNC_(ga_ztype_c2f,GA_ZTYPE_C2F) #define nga_type_c2f_ F77_FUNC_(nga_type_c2f, NGA_TYPE_C2F) #define nga_ctype_c2f_ F77_FUNC_(nga_ctype_c2f,NGA_CTYPE_C2F) #define nga_dtype_c2f_ F77_FUNC_(nga_dtype_c2f,NGA_DTYPE_C2F) #define nga_itype_c2f_ F77_FUNC_(nga_itype_c2f,NGA_ITYPE_C2F) #define nga_stype_c2f_ F77_FUNC_(nga_stype_c2f,NGA_STYPE_C2F) #define nga_ztype_c2f_ F77_FUNC_(nga_ztype_c2f,NGA_ZTYPE_C2F) #define ga_msg_brdcst_ F77_FUNC_(ga_msg_brdcst, GA_MSG_BRDCST) #define ga_cmsg_brdcst_ F77_FUNC_(ga_cmsg_brdcst,GA_CMSG_BRDCST) #define ga_dmsg_brdcst_ F77_FUNC_(ga_dmsg_brdcst,GA_DMSG_BRDCST) #define ga_imsg_brdcst_ F77_FUNC_(ga_imsg_brdcst,GA_IMSG_BRDCST) #define ga_smsg_brdcst_ F77_FUNC_(ga_smsg_brdcst,GA_SMSG_BRDCST) #define ga_zmsg_brdcst_ F77_FUNC_(ga_zmsg_brdcst,GA_ZMSG_BRDCST) #define nga_msg_brdcst_ F77_FUNC_(nga_msg_brdcst, NGA_MSG_BRDCST) #define nga_cmsg_brdcst_ F77_FUNC_(nga_cmsg_brdcst,NGA_CMSG_BRDCST) #define nga_dmsg_brdcst_ F77_FUNC_(nga_dmsg_brdcst,NGA_DMSG_BRDCST) #define nga_imsg_brdcst_ F77_FUNC_(nga_imsg_brdcst,NGA_IMSG_BRDCST) #define nga_smsg_brdcst_ F77_FUNC_(nga_smsg_brdcst,NGA_SMSG_BRDCST) #define nga_zmsg_brdcst_ F77_FUNC_(nga_zmsg_brdcst,NGA_ZMSG_BRDCST) #define ga_brdcst_ F77_FUNC_(ga_brdcst, GA_BRDCST) #define ga_cbrdcst_ F77_FUNC_(ga_cbrdcst,GA_CBRDCST) #define ga_dbrdcst_ F77_FUNC_(ga_dbrdcst,GA_DBRDCST) #define ga_ibrdcst_ F77_FUNC_(ga_ibrdcst,GA_IBRDCST) #define ga_sbrdcst_ F77_FUNC_(ga_sbrdcst,GA_SBRDCST) #define ga_zbrdcst_ F77_FUNC_(ga_zbrdcst,GA_ZBRDCST) #define nga_brdcst_ F77_FUNC_(nga_brdcst, NGA_BRDCST) #define nga_cbrdcst_ F77_FUNC_(nga_cbrdcst,NGA_CBRDCST) #define nga_dbrdcst_ F77_FUNC_(nga_dbrdcst,NGA_DBRDCST) #define nga_ibrdcst_ F77_FUNC_(nga_ibrdcst,NGA_IBRDCST) #define nga_sbrdcst_ F77_FUNC_(nga_sbrdcst,NGA_SBRDCST) #define nga_zbrdcst_ F77_FUNC_(nga_zbrdcst,NGA_ZBRDCST) #define ga_pgroup_brdcst_ F77_FUNC_(ga_pgroup_brdcst, GA_PGROUP_BRDCST) #define ga_cpgroup_brdcst_ F77_FUNC_(ga_cpgroup_brdcst,GA_CPGROUP_BRDCST) #define ga_dpgroup_brdcst_ F77_FUNC_(ga_dpgroup_brdcst,GA_DPGROUP_BRDCST) #define ga_ipgroup_brdcst_ F77_FUNC_(ga_ipgroup_brdcst,GA_IPGROUP_BRDCST) #define ga_spgroup_brdcst_ F77_FUNC_(ga_spgroup_brdcst,GA_SPGROUP_BRDCST) #define ga_zpgroup_brdcst_ F77_FUNC_(ga_zpgroup_brdcst,GA_ZPGROUP_BRDCST) #define nga_pgroup_brdcst_ F77_FUNC_(nga_pgroup_brdcst, NGA_PGROUP_BRDCST) #define nga_cpgroup_brdcst_ F77_FUNC_(nga_cpgroup_brdcst,NGA_CPGROUP_BRDCST) #define nga_dpgroup_brdcst_ F77_FUNC_(nga_dpgroup_brdcst,NGA_DPGROUP_BRDCST) #define nga_ipgroup_brdcst_ F77_FUNC_(nga_ipgroup_brdcst,NGA_IPGROUP_BRDCST) #define nga_spgroup_brdcst_ F77_FUNC_(nga_spgroup_brdcst,NGA_SPGROUP_BRDCST) #define nga_zpgroup_brdcst_ F77_FUNC_(nga_zpgroup_brdcst,NGA_ZPGROUP_BRDCST) #define ga_msg_sync_ F77_FUNC_(ga_msg_sync, GA_MSG_SYNC) #define ga_cmsg_sync_ F77_FUNC_(ga_cmsg_sync,GA_CMSG_SYNC) #define ga_dmsg_sync_ F77_FUNC_(ga_dmsg_sync,GA_DMSG_SYNC) #define ga_imsg_sync_ F77_FUNC_(ga_imsg_sync,GA_IMSG_SYNC) #define ga_smsg_sync_ F77_FUNC_(ga_smsg_sync,GA_SMSG_SYNC) #define ga_zmsg_sync_ F77_FUNC_(ga_zmsg_sync,GA_ZMSG_SYNC) #define nga_msg_sync_ F77_FUNC_(nga_msg_sync, NGA_MSG_SYNC) #define nga_cmsg_sync_ F77_FUNC_(nga_cmsg_sync,NGA_CMSG_SYNC) #define nga_dmsg_sync_ F77_FUNC_(nga_dmsg_sync,NGA_DMSG_SYNC) #define nga_imsg_sync_ F77_FUNC_(nga_imsg_sync,NGA_IMSG_SYNC) #define nga_smsg_sync_ F77_FUNC_(nga_smsg_sync,NGA_SMSG_SYNC) #define nga_zmsg_sync_ F77_FUNC_(nga_zmsg_sync,NGA_ZMSG_SYNC) #define ga_msg_pgroup_sync_ F77_FUNC_(ga_msg_pgroup_sync, GA_MSG_PGROUP_SYNC) #define ga_cmsg_pgroup_sync_ F77_FUNC_(ga_cmsg_pgroup_sync,GA_CMSG_PGROUP_SYNC) #define ga_dmsg_pgroup_sync_ F77_FUNC_(ga_dmsg_pgroup_sync,GA_DMSG_PGROUP_SYNC) #define ga_imsg_pgroup_sync_ F77_FUNC_(ga_imsg_pgroup_sync,GA_IMSG_PGROUP_SYNC) #define ga_smsg_pgroup_sync_ F77_FUNC_(ga_smsg_pgroup_sync,GA_SMSG_PGROUP_SYNC) #define ga_zmsg_pgroup_sync_ F77_FUNC_(ga_zmsg_pgroup_sync,GA_ZMSG_PGROUP_SYNC) #define nga_msg_pgroup_sync_ F77_FUNC_(nga_msg_pgroup_sync, NGA_MSG_PGROUP_SYNC) #define nga_cmsg_pgroup_sync_ F77_FUNC_(nga_cmsg_pgroup_sync,NGA_CMSG_PGROUP_SYNC) #define nga_dmsg_pgroup_sync_ F77_FUNC_(nga_dmsg_pgroup_sync,NGA_DMSG_PGROUP_SYNC) #define nga_imsg_pgroup_sync_ F77_FUNC_(nga_imsg_pgroup_sync,NGA_IMSG_PGROUP_SYNC) #define nga_smsg_pgroup_sync_ F77_FUNC_(nga_smsg_pgroup_sync,NGA_SMSG_PGROUP_SYNC) #define nga_zmsg_pgroup_sync_ F77_FUNC_(nga_zmsg_pgroup_sync,NGA_ZMSG_PGROUP_SYNC) #define ga_pgroup_gop_ F77_FUNC_(ga_pgroup_gop, GA_PGROUP_GOP) #define ga_cpgroup_gop_ F77_FUNC_(ga_cpgroup_gop,GA_CPGROUP_GOP) #define ga_dpgroup_gop_ F77_FUNC_(ga_dpgroup_gop,GA_DPGROUP_GOP) #define ga_ipgroup_gop_ F77_FUNC_(ga_ipgroup_gop,GA_IPGROUP_GOP) #define ga_spgroup_gop_ F77_FUNC_(ga_spgroup_gop,GA_SPGROUP_GOP) #define ga_zpgroup_gop_ F77_FUNC_(ga_zpgroup_gop,GA_ZPGROUP_GOP) #define nga_pgroup_gop_ F77_FUNC_(nga_pgroup_gop, NGA_PGROUP_GOP) #define nga_cpgroup_gop_ F77_FUNC_(nga_cpgroup_gop,NGA_CPGROUP_GOP) #define nga_dpgroup_gop_ F77_FUNC_(nga_dpgroup_gop,NGA_DPGROUP_GOP) #define nga_ipgroup_gop_ F77_FUNC_(nga_ipgroup_gop,NGA_IPGROUP_GOP) #define nga_spgroup_gop_ F77_FUNC_(nga_spgroup_gop,NGA_SPGROUP_GOP) #define nga_zpgroup_gop_ F77_FUNC_(nga_zpgroup_gop,NGA_ZPGROUP_GOP) #define ga_gop_ F77_FUNC_(ga_gop, GA_GOP) #define ga_cgop_ F77_FUNC_(ga_cgop,GA_CGOP) #define ga_dgop_ F77_FUNC_(ga_dgop,GA_DGOP) #define ga_igop_ F77_FUNC_(ga_igop,GA_IGOP) #define ga_sgop_ F77_FUNC_(ga_sgop,GA_SGOP) #define ga_zgop_ F77_FUNC_(ga_zgop,GA_ZGOP) #define nga_gop_ F77_FUNC_(nga_gop, NGA_GOP) #define nga_cgop_ F77_FUNC_(nga_cgop,NGA_CGOP) #define nga_dgop_ F77_FUNC_(nga_dgop,NGA_DGOP) #define nga_igop_ F77_FUNC_(nga_igop,NGA_IGOP) #define nga_sgop_ F77_FUNC_(nga_sgop,NGA_SGOP) #define nga_zgop_ F77_FUNC_(nga_zgop,NGA_ZGOP) #define ga_abs_value_patch_ F77_FUNC_(ga_abs_value_patch, GA_ABS_VALUE_PATCH) #define ga_cabs_value_patch_ F77_FUNC_(ga_cabs_value_patch,GA_CABS_VALUE_PATCH) #define ga_dabs_value_patch_ F77_FUNC_(ga_dabs_value_patch,GA_DABS_VALUE_PATCH) #define ga_iabs_value_patch_ F77_FUNC_(ga_iabs_value_patch,GA_IABS_VALUE_PATCH) #define ga_sabs_value_patch_ F77_FUNC_(ga_sabs_value_patch,GA_SABS_VALUE_PATCH) #define ga_zabs_value_patch_ F77_FUNC_(ga_zabs_value_patch,GA_ZABS_VALUE_PATCH) #define nga_abs_value_patch_ F77_FUNC_(nga_abs_value_patch, NGA_ABS_VALUE_PATCH) #define nga_cabs_value_patch_ F77_FUNC_(nga_cabs_value_patch,NGA_CABS_VALUE_PATCH) #define nga_dabs_value_patch_ F77_FUNC_(nga_dabs_value_patch,NGA_DABS_VALUE_PATCH) #define nga_iabs_value_patch_ F77_FUNC_(nga_iabs_value_patch,NGA_IABS_VALUE_PATCH) #define nga_sabs_value_patch_ F77_FUNC_(nga_sabs_value_patch,NGA_SABS_VALUE_PATCH) #define nga_zabs_value_patch_ F77_FUNC_(nga_zabs_value_patch,NGA_ZABS_VALUE_PATCH) #define ga_recip_patch_ F77_FUNC_(ga_recip_patch, GA_RECIP_PATCH) #define ga_crecip_patch_ F77_FUNC_(ga_crecip_patch,GA_CRECIP_PATCH) #define ga_drecip_patch_ F77_FUNC_(ga_drecip_patch,GA_DRECIP_PATCH) #define ga_irecip_patch_ F77_FUNC_(ga_irecip_patch,GA_IRECIP_PATCH) #define ga_srecip_patch_ F77_FUNC_(ga_srecip_patch,GA_SRECIP_PATCH) #define ga_zrecip_patch_ F77_FUNC_(ga_zrecip_patch,GA_ZRECIP_PATCH) #define nga_recip_patch_ F77_FUNC_(nga_recip_patch, NGA_RECIP_PATCH) #define nga_crecip_patch_ F77_FUNC_(nga_crecip_patch,NGA_CRECIP_PATCH) #define nga_drecip_patch_ F77_FUNC_(nga_drecip_patch,NGA_DRECIP_PATCH) #define nga_irecip_patch_ F77_FUNC_(nga_irecip_patch,NGA_IRECIP_PATCH) #define nga_srecip_patch_ F77_FUNC_(nga_srecip_patch,NGA_SRECIP_PATCH) #define nga_zrecip_patch_ F77_FUNC_(nga_zrecip_patch,NGA_ZRECIP_PATCH) #define ga_add_constant_patch_ F77_FUNC_(ga_add_constant_patch, GA_ADD_CONSTANT_PATCH) #define ga_cadd_constant_patch_ F77_FUNC_(ga_cadd_constant_patch,GA_CADD_CONSTANT_PATCH) #define ga_dadd_constant_patch_ F77_FUNC_(ga_dadd_constant_patch,GA_DADD_CONSTANT_PATCH) #define ga_iadd_constant_patch_ F77_FUNC_(ga_iadd_constant_patch,GA_IADD_CONSTANT_PATCH) #define ga_sadd_constant_patch_ F77_FUNC_(ga_sadd_constant_patch,GA_SADD_CONSTANT_PATCH) #define ga_zadd_constant_patch_ F77_FUNC_(ga_zadd_constant_patch,GA_ZADD_CONSTANT_PATCH) #define nga_add_constant_patch_ F77_FUNC_(nga_add_constant_patch, NGA_ADD_CONSTANT_PATCH) #define nga_cadd_constant_patch_ F77_FUNC_(nga_cadd_constant_patch,NGA_CADD_CONSTANT_PATCH) #define nga_dadd_constant_patch_ F77_FUNC_(nga_dadd_constant_patch,NGA_DADD_CONSTANT_PATCH) #define nga_iadd_constant_patch_ F77_FUNC_(nga_iadd_constant_patch,NGA_IADD_CONSTANT_PATCH) #define nga_sadd_constant_patch_ F77_FUNC_(nga_sadd_constant_patch,NGA_SADD_CONSTANT_PATCH) #define nga_zadd_constant_patch_ F77_FUNC_(nga_zadd_constant_patch,NGA_ZADD_CONSTANT_PATCH) #define ga_abs_value_ F77_FUNC_(ga_abs_value, GA_ABS_VALUE) #define ga_cabs_value_ F77_FUNC_(ga_cabs_value,GA_CABS_VALUE) #define ga_dabs_value_ F77_FUNC_(ga_dabs_value,GA_DABS_VALUE) #define ga_iabs_value_ F77_FUNC_(ga_iabs_value,GA_IABS_VALUE) #define ga_sabs_value_ F77_FUNC_(ga_sabs_value,GA_SABS_VALUE) #define ga_zabs_value_ F77_FUNC_(ga_zabs_value,GA_ZABS_VALUE) #define nga_abs_value_ F77_FUNC_(nga_abs_value, NGA_ABS_VALUE) #define nga_cabs_value_ F77_FUNC_(nga_cabs_value,NGA_CABS_VALUE) #define nga_dabs_value_ F77_FUNC_(nga_dabs_value,NGA_DABS_VALUE) #define nga_iabs_value_ F77_FUNC_(nga_iabs_value,NGA_IABS_VALUE) #define nga_sabs_value_ F77_FUNC_(nga_sabs_value,NGA_SABS_VALUE) #define nga_zabs_value_ F77_FUNC_(nga_zabs_value,NGA_ZABS_VALUE) #define ga_add_constant_ F77_FUNC_(ga_add_constant, GA_ADD_CONSTANT) #define ga_cadd_constant_ F77_FUNC_(ga_cadd_constant,GA_CADD_CONSTANT) #define ga_dadd_constant_ F77_FUNC_(ga_dadd_constant,GA_DADD_CONSTANT) #define ga_iadd_constant_ F77_FUNC_(ga_iadd_constant,GA_IADD_CONSTANT) #define ga_sadd_constant_ F77_FUNC_(ga_sadd_constant,GA_SADD_CONSTANT) #define ga_zadd_constant_ F77_FUNC_(ga_zadd_constant,GA_ZADD_CONSTANT) #define nga_add_constant_ F77_FUNC_(nga_add_constant, NGA_ADD_CONSTANT) #define nga_cadd_constant_ F77_FUNC_(nga_cadd_constant,NGA_CADD_CONSTANT) #define nga_dadd_constant_ F77_FUNC_(nga_dadd_constant,NGA_DADD_CONSTANT) #define nga_iadd_constant_ F77_FUNC_(nga_iadd_constant,NGA_IADD_CONSTANT) #define nga_sadd_constant_ F77_FUNC_(nga_sadd_constant,NGA_SADD_CONSTANT) #define nga_zadd_constant_ F77_FUNC_(nga_zadd_constant,NGA_ZADD_CONSTANT) #define ga_recip_ F77_FUNC_(ga_recip, GA_RECIP) #define ga_crecip_ F77_FUNC_(ga_crecip,GA_CRECIP) #define ga_drecip_ F77_FUNC_(ga_drecip,GA_DRECIP) #define ga_irecip_ F77_FUNC_(ga_irecip,GA_IRECIP) #define ga_srecip_ F77_FUNC_(ga_srecip,GA_SRECIP) #define ga_zrecip_ F77_FUNC_(ga_zrecip,GA_ZRECIP) #define nga_recip_ F77_FUNC_(nga_recip, NGA_RECIP) #define nga_crecip_ F77_FUNC_(nga_crecip,NGA_CRECIP) #define nga_drecip_ F77_FUNC_(nga_drecip,NGA_DRECIP) #define nga_irecip_ F77_FUNC_(nga_irecip,NGA_IRECIP) #define nga_srecip_ F77_FUNC_(nga_srecip,NGA_SRECIP) #define nga_zrecip_ F77_FUNC_(nga_zrecip,NGA_ZRECIP) #define ga_elem_multiply_ F77_FUNC_(ga_elem_multiply, GA_ELEM_MULTIPLY) #define ga_celem_multiply_ F77_FUNC_(ga_celem_multiply,GA_CELEM_MULTIPLY) #define ga_delem_multiply_ F77_FUNC_(ga_delem_multiply,GA_DELEM_MULTIPLY) #define ga_ielem_multiply_ F77_FUNC_(ga_ielem_multiply,GA_IELEM_MULTIPLY) #define ga_selem_multiply_ F77_FUNC_(ga_selem_multiply,GA_SELEM_MULTIPLY) #define ga_zelem_multiply_ F77_FUNC_(ga_zelem_multiply,GA_ZELEM_MULTIPLY) #define nga_elem_multiply_ F77_FUNC_(nga_elem_multiply, NGA_ELEM_MULTIPLY) #define nga_celem_multiply_ F77_FUNC_(nga_celem_multiply,NGA_CELEM_MULTIPLY) #define nga_delem_multiply_ F77_FUNC_(nga_delem_multiply,NGA_DELEM_MULTIPLY) #define nga_ielem_multiply_ F77_FUNC_(nga_ielem_multiply,NGA_IELEM_MULTIPLY) #define nga_selem_multiply_ F77_FUNC_(nga_selem_multiply,NGA_SELEM_MULTIPLY) #define nga_zelem_multiply_ F77_FUNC_(nga_zelem_multiply,NGA_ZELEM_MULTIPLY) #define ga_elem_divide_ F77_FUNC_(ga_elem_divide, GA_ELEM_DIVIDE) #define ga_celem_divide_ F77_FUNC_(ga_celem_divide,GA_CELEM_DIVIDE) #define ga_delem_divide_ F77_FUNC_(ga_delem_divide,GA_DELEM_DIVIDE) #define ga_ielem_divide_ F77_FUNC_(ga_ielem_divide,GA_IELEM_DIVIDE) #define ga_selem_divide_ F77_FUNC_(ga_selem_divide,GA_SELEM_DIVIDE) #define ga_zelem_divide_ F77_FUNC_(ga_zelem_divide,GA_ZELEM_DIVIDE) #define nga_elem_divide_ F77_FUNC_(nga_elem_divide, NGA_ELEM_DIVIDE) #define nga_celem_divide_ F77_FUNC_(nga_celem_divide,NGA_CELEM_DIVIDE) #define nga_delem_divide_ F77_FUNC_(nga_delem_divide,NGA_DELEM_DIVIDE) #define nga_ielem_divide_ F77_FUNC_(nga_ielem_divide,NGA_IELEM_DIVIDE) #define nga_selem_divide_ F77_FUNC_(nga_selem_divide,NGA_SELEM_DIVIDE) #define nga_zelem_divide_ F77_FUNC_(nga_zelem_divide,NGA_ZELEM_DIVIDE) #define ga_elem_maximum_ F77_FUNC_(ga_elem_maximum, GA_ELEM_MAXIMUM) #define ga_celem_maximum_ F77_FUNC_(ga_celem_maximum,GA_CELEM_MAXIMUM) #define ga_delem_maximum_ F77_FUNC_(ga_delem_maximum,GA_DELEM_MAXIMUM) #define ga_ielem_maximum_ F77_FUNC_(ga_ielem_maximum,GA_IELEM_MAXIMUM) #define ga_selem_maximum_ F77_FUNC_(ga_selem_maximum,GA_SELEM_MAXIMUM) #define ga_zelem_maximum_ F77_FUNC_(ga_zelem_maximum,GA_ZELEM_MAXIMUM) #define nga_elem_maximum_ F77_FUNC_(nga_elem_maximum, NGA_ELEM_MAXIMUM) #define nga_celem_maximum_ F77_FUNC_(nga_celem_maximum,NGA_CELEM_MAXIMUM) #define nga_delem_maximum_ F77_FUNC_(nga_delem_maximum,NGA_DELEM_MAXIMUM) #define nga_ielem_maximum_ F77_FUNC_(nga_ielem_maximum,NGA_IELEM_MAXIMUM) #define nga_selem_maximum_ F77_FUNC_(nga_selem_maximum,NGA_SELEM_MAXIMUM) #define nga_zelem_maximum_ F77_FUNC_(nga_zelem_maximum,NGA_ZELEM_MAXIMUM) #define ga_elem_minimum_ F77_FUNC_(ga_elem_minimum, GA_ELEM_MINIMUM) #define ga_celem_minimum_ F77_FUNC_(ga_celem_minimum,GA_CELEM_MINIMUM) #define ga_delem_minimum_ F77_FUNC_(ga_delem_minimum,GA_DELEM_MINIMUM) #define ga_ielem_minimum_ F77_FUNC_(ga_ielem_minimum,GA_IELEM_MINIMUM) #define ga_selem_minimum_ F77_FUNC_(ga_selem_minimum,GA_SELEM_MINIMUM) #define ga_zelem_minimum_ F77_FUNC_(ga_zelem_minimum,GA_ZELEM_MINIMUM) #define nga_elem_minimum_ F77_FUNC_(nga_elem_minimum, NGA_ELEM_MINIMUM) #define nga_celem_minimum_ F77_FUNC_(nga_celem_minimum,NGA_CELEM_MINIMUM) #define nga_delem_minimum_ F77_FUNC_(nga_delem_minimum,NGA_DELEM_MINIMUM) #define nga_ielem_minimum_ F77_FUNC_(nga_ielem_minimum,NGA_IELEM_MINIMUM) #define nga_selem_minimum_ F77_FUNC_(nga_selem_minimum,NGA_SELEM_MINIMUM) #define nga_zelem_minimum_ F77_FUNC_(nga_zelem_minimum,NGA_ZELEM_MINIMUM) #define ga_elem_multiply_patch_ F77_FUNC_(ga_elem_multiply_patch, GA_ELEM_MULTIPLY_PATCH) #define ga_celem_multiply_patch_ F77_FUNC_(ga_celem_multiply_patch,GA_CELEM_MULTIPLY_PATCH) #define ga_delem_multiply_patch_ F77_FUNC_(ga_delem_multiply_patch,GA_DELEM_MULTIPLY_PATCH) #define ga_ielem_multiply_patch_ F77_FUNC_(ga_ielem_multiply_patch,GA_IELEM_MULTIPLY_PATCH) #define ga_selem_multiply_patch_ F77_FUNC_(ga_selem_multiply_patch,GA_SELEM_MULTIPLY_PATCH) #define ga_zelem_multiply_patch_ F77_FUNC_(ga_zelem_multiply_patch,GA_ZELEM_MULTIPLY_PATCH) #define nga_elem_multiply_patch_ F77_FUNC_(nga_elem_multiply_patch, NGA_ELEM_MULTIPLY_PATCH) #define nga_celem_multiply_patch_ F77_FUNC_(nga_celem_multiply_patch,NGA_CELEM_MULTIPLY_PATCH) #define nga_delem_multiply_patch_ F77_FUNC_(nga_delem_multiply_patch,NGA_DELEM_MULTIPLY_PATCH) #define nga_ielem_multiply_patch_ F77_FUNC_(nga_ielem_multiply_patch,NGA_IELEM_MULTIPLY_PATCH) #define nga_selem_multiply_patch_ F77_FUNC_(nga_selem_multiply_patch,NGA_SELEM_MULTIPLY_PATCH) #define nga_zelem_multiply_patch_ F77_FUNC_(nga_zelem_multiply_patch,NGA_ZELEM_MULTIPLY_PATCH) #define ga_elem_divide_patch_ F77_FUNC_(ga_elem_divide_patch, GA_ELEM_DIVIDE_PATCH) #define ga_celem_divide_patch_ F77_FUNC_(ga_celem_divide_patch,GA_CELEM_DIVIDE_PATCH) #define ga_delem_divide_patch_ F77_FUNC_(ga_delem_divide_patch,GA_DELEM_DIVIDE_PATCH) #define ga_ielem_divide_patch_ F77_FUNC_(ga_ielem_divide_patch,GA_IELEM_DIVIDE_PATCH) #define ga_selem_divide_patch_ F77_FUNC_(ga_selem_divide_patch,GA_SELEM_DIVIDE_PATCH) #define ga_zelem_divide_patch_ F77_FUNC_(ga_zelem_divide_patch,GA_ZELEM_DIVIDE_PATCH) #define nga_elem_divide_patch_ F77_FUNC_(nga_elem_divide_patch, NGA_ELEM_DIVIDE_PATCH) #define nga_celem_divide_patch_ F77_FUNC_(nga_celem_divide_patch,NGA_CELEM_DIVIDE_PATCH) #define nga_delem_divide_patch_ F77_FUNC_(nga_delem_divide_patch,NGA_DELEM_DIVIDE_PATCH) #define nga_ielem_divide_patch_ F77_FUNC_(nga_ielem_divide_patch,NGA_IELEM_DIVIDE_PATCH) #define nga_selem_divide_patch_ F77_FUNC_(nga_selem_divide_patch,NGA_SELEM_DIVIDE_PATCH) #define nga_zelem_divide_patch_ F77_FUNC_(nga_zelem_divide_patch,NGA_ZELEM_DIVIDE_PATCH) #define ga_elem_maximum_patch_ F77_FUNC_(ga_elem_maximum_patch, GA_ELEM_MAXIMUM_PATCH) #define ga_celem_maximum_patch_ F77_FUNC_(ga_celem_maximum_patch,GA_CELEM_MAXIMUM_PATCH) #define ga_delem_maximum_patch_ F77_FUNC_(ga_delem_maximum_patch,GA_DELEM_MAXIMUM_PATCH) #define ga_ielem_maximum_patch_ F77_FUNC_(ga_ielem_maximum_patch,GA_IELEM_MAXIMUM_PATCH) #define ga_selem_maximum_patch_ F77_FUNC_(ga_selem_maximum_patch,GA_SELEM_MAXIMUM_PATCH) #define ga_zelem_maximum_patch_ F77_FUNC_(ga_zelem_maximum_patch,GA_ZELEM_MAXIMUM_PATCH) #define nga_elem_maximum_patch_ F77_FUNC_(nga_elem_maximum_patch, NGA_ELEM_MAXIMUM_PATCH) #define nga_celem_maximum_patch_ F77_FUNC_(nga_celem_maximum_patch,NGA_CELEM_MAXIMUM_PATCH) #define nga_delem_maximum_patch_ F77_FUNC_(nga_delem_maximum_patch,NGA_DELEM_MAXIMUM_PATCH) #define nga_ielem_maximum_patch_ F77_FUNC_(nga_ielem_maximum_patch,NGA_IELEM_MAXIMUM_PATCH) #define nga_selem_maximum_patch_ F77_FUNC_(nga_selem_maximum_patch,NGA_SELEM_MAXIMUM_PATCH) #define nga_zelem_maximum_patch_ F77_FUNC_(nga_zelem_maximum_patch,NGA_ZELEM_MAXIMUM_PATCH) #define ga_elem_minimum_patch_ F77_FUNC_(ga_elem_minimum_patch, GA_ELEM_MINIMUM_PATCH) #define ga_celem_minimum_patch_ F77_FUNC_(ga_celem_minimum_patch,GA_CELEM_MINIMUM_PATCH) #define ga_delem_minimum_patch_ F77_FUNC_(ga_delem_minimum_patch,GA_DELEM_MINIMUM_PATCH) #define ga_ielem_minimum_patch_ F77_FUNC_(ga_ielem_minimum_patch,GA_IELEM_MINIMUM_PATCH) #define ga_selem_minimum_patch_ F77_FUNC_(ga_selem_minimum_patch,GA_SELEM_MINIMUM_PATCH) #define ga_zelem_minimum_patch_ F77_FUNC_(ga_zelem_minimum_patch,GA_ZELEM_MINIMUM_PATCH) #define nga_elem_minimum_patch_ F77_FUNC_(nga_elem_minimum_patch, NGA_ELEM_MINIMUM_PATCH) #define nga_celem_minimum_patch_ F77_FUNC_(nga_celem_minimum_patch,NGA_CELEM_MINIMUM_PATCH) #define nga_delem_minimum_patch_ F77_FUNC_(nga_delem_minimum_patch,NGA_DELEM_MINIMUM_PATCH) #define nga_ielem_minimum_patch_ F77_FUNC_(nga_ielem_minimum_patch,NGA_IELEM_MINIMUM_PATCH) #define nga_selem_minimum_patch_ F77_FUNC_(nga_selem_minimum_patch,NGA_SELEM_MINIMUM_PATCH) #define nga_zelem_minimum_patch_ F77_FUNC_(nga_zelem_minimum_patch,NGA_ZELEM_MINIMUM_PATCH) #define ga_elem_step_divide_patch_ F77_FUNC_(ga_elem_step_divide_patch, GA_ELEM_STEP_DIVIDE_PATCH) #define ga_celem_step_divide_patch_ F77_FUNC_(ga_celem_step_divide_patch,GA_CELEM_STEP_DIVIDE_PATCH) #define ga_delem_step_divide_patch_ F77_FUNC_(ga_delem_step_divide_patch,GA_DELEM_STEP_DIVIDE_PATCH) #define ga_ielem_step_divide_patch_ F77_FUNC_(ga_ielem_step_divide_patch,GA_IELEM_STEP_DIVIDE_PATCH) #define ga_selem_step_divide_patch_ F77_FUNC_(ga_selem_step_divide_patch,GA_SELEM_STEP_DIVIDE_PATCH) #define ga_zelem_step_divide_patch_ F77_FUNC_(ga_zelem_step_divide_patch,GA_ZELEM_STEP_DIVIDE_PATCH) #define nga_elem_step_divide_patch_ F77_FUNC_(nga_elem_step_divide_patch, NGA_ELEM_STEP_DIVIDE_PATCH) #define nga_celem_step_divide_patch_ F77_FUNC_(nga_celem_step_divide_patch,NGA_CELEM_STEP_DIVIDE_PATCH) #define nga_delem_step_divide_patch_ F77_FUNC_(nga_delem_step_divide_patch,NGA_DELEM_STEP_DIVIDE_PATCH) #define nga_ielem_step_divide_patch_ F77_FUNC_(nga_ielem_step_divide_patch,NGA_IELEM_STEP_DIVIDE_PATCH) #define nga_selem_step_divide_patch_ F77_FUNC_(nga_selem_step_divide_patch,NGA_SELEM_STEP_DIVIDE_PATCH) #define nga_zelem_step_divide_patch_ F77_FUNC_(nga_zelem_step_divide_patch,NGA_ZELEM_STEP_DIVIDE_PATCH) #define ga_elem_stepb_divide_patch_ F77_FUNC_(ga_elem_stepb_divide_patch, GA_ELEM_STEPB_DIVIDE_PATCH) #define ga_celem_stepb_divide_patch_ F77_FUNC_(ga_celem_stepb_divide_patch,GA_CELEM_STEPB_DIVIDE_PATCH) #define ga_delem_stepb_divide_patch_ F77_FUNC_(ga_delem_stepb_divide_patch,GA_DELEM_STEPB_DIVIDE_PATCH) #define ga_ielem_stepb_divide_patch_ F77_FUNC_(ga_ielem_stepb_divide_patch,GA_IELEM_STEPB_DIVIDE_PATCH) #define ga_selem_stepb_divide_patch_ F77_FUNC_(ga_selem_stepb_divide_patch,GA_SELEM_STEPB_DIVIDE_PATCH) #define ga_zelem_stepb_divide_patch_ F77_FUNC_(ga_zelem_stepb_divide_patch,GA_ZELEM_STEPB_DIVIDE_PATCH) #define nga_elem_stepb_divide_patch_ F77_FUNC_(nga_elem_stepb_divide_patch, NGA_ELEM_STEPB_DIVIDE_PATCH) #define nga_celem_stepb_divide_patch_ F77_FUNC_(nga_celem_stepb_divide_patch,NGA_CELEM_STEPB_DIVIDE_PATCH) #define nga_delem_stepb_divide_patch_ F77_FUNC_(nga_delem_stepb_divide_patch,NGA_DELEM_STEPB_DIVIDE_PATCH) #define nga_ielem_stepb_divide_patch_ F77_FUNC_(nga_ielem_stepb_divide_patch,NGA_IELEM_STEPB_DIVIDE_PATCH) #define nga_selem_stepb_divide_patch_ F77_FUNC_(nga_selem_stepb_divide_patch,NGA_SELEM_STEPB_DIVIDE_PATCH) #define nga_zelem_stepb_divide_patch_ F77_FUNC_(nga_zelem_stepb_divide_patch,NGA_ZELEM_STEPB_DIVIDE_PATCH) #define ga_step_mask_patch_ F77_FUNC_(ga_step_mask_patch, GA_STEP_MASK_PATCH) #define ga_cstep_mask_patch_ F77_FUNC_(ga_cstep_mask_patch,GA_CSTEP_MASK_PATCH) #define ga_dstep_mask_patch_ F77_FUNC_(ga_dstep_mask_patch,GA_DSTEP_MASK_PATCH) #define ga_istep_mask_patch_ F77_FUNC_(ga_istep_mask_patch,GA_ISTEP_MASK_PATCH) #define ga_sstep_mask_patch_ F77_FUNC_(ga_sstep_mask_patch,GA_SSTEP_MASK_PATCH) #define ga_zstep_mask_patch_ F77_FUNC_(ga_zstep_mask_patch,GA_ZSTEP_MASK_PATCH) #define nga_step_mask_patch_ F77_FUNC_(nga_step_mask_patch, NGA_STEP_MASK_PATCH) #define nga_cstep_mask_patch_ F77_FUNC_(nga_cstep_mask_patch,NGA_CSTEP_MASK_PATCH) #define nga_dstep_mask_patch_ F77_FUNC_(nga_dstep_mask_patch,NGA_DSTEP_MASK_PATCH) #define nga_istep_mask_patch_ F77_FUNC_(nga_istep_mask_patch,NGA_ISTEP_MASK_PATCH) #define nga_sstep_mask_patch_ F77_FUNC_(nga_sstep_mask_patch,NGA_SSTEP_MASK_PATCH) #define nga_zstep_mask_patch_ F77_FUNC_(nga_zstep_mask_patch,NGA_ZSTEP_MASK_PATCH) #define ga_step_bound_info_patch_ F77_FUNC_(ga_step_bound_info_patch, GA_STEP_BOUND_INFO_PATCH) #define ga_cstep_bound_info_patch_ F77_FUNC_(ga_cstep_bound_info_patch,GA_CSTEP_BOUND_INFO_PATCH) #define ga_dstep_bound_info_patch_ F77_FUNC_(ga_dstep_bound_info_patch,GA_DSTEP_BOUND_INFO_PATCH) #define ga_istep_bound_info_patch_ F77_FUNC_(ga_istep_bound_info_patch,GA_ISTEP_BOUND_INFO_PATCH) #define ga_sstep_bound_info_patch_ F77_FUNC_(ga_sstep_bound_info_patch,GA_SSTEP_BOUND_INFO_PATCH) #define ga_zstep_bound_info_patch_ F77_FUNC_(ga_zstep_bound_info_patch,GA_ZSTEP_BOUND_INFO_PATCH) #define nga_step_bound_info_patch_ F77_FUNC_(nga_step_bound_info_patch, NGA_STEP_BOUND_INFO_PATCH) #define nga_cstep_bound_info_patch_ F77_FUNC_(nga_cstep_bound_info_patch,NGA_CSTEP_BOUND_INFO_PATCH) #define nga_dstep_bound_info_patch_ F77_FUNC_(nga_dstep_bound_info_patch,NGA_DSTEP_BOUND_INFO_PATCH) #define nga_istep_bound_info_patch_ F77_FUNC_(nga_istep_bound_info_patch,NGA_ISTEP_BOUND_INFO_PATCH) #define nga_sstep_bound_info_patch_ F77_FUNC_(nga_sstep_bound_info_patch,NGA_SSTEP_BOUND_INFO_PATCH) #define nga_zstep_bound_info_patch_ F77_FUNC_(nga_zstep_bound_info_patch,NGA_ZSTEP_BOUND_INFO_PATCH) #define ga_step_max_patch_ F77_FUNC_(ga_step_max_patch, GA_STEP_MAX_PATCH) #define ga_cstep_max_patch_ F77_FUNC_(ga_cstep_max_patch,GA_CSTEP_MAX_PATCH) #define ga_dstep_max_patch_ F77_FUNC_(ga_dstep_max_patch,GA_DSTEP_MAX_PATCH) #define ga_istep_max_patch_ F77_FUNC_(ga_istep_max_patch,GA_ISTEP_MAX_PATCH) #define ga_sstep_max_patch_ F77_FUNC_(ga_sstep_max_patch,GA_SSTEP_MAX_PATCH) #define ga_zstep_max_patch_ F77_FUNC_(ga_zstep_max_patch,GA_ZSTEP_MAX_PATCH) #define nga_step_max_patch_ F77_FUNC_(nga_step_max_patch, NGA_STEP_MAX_PATCH) #define nga_cstep_max_patch_ F77_FUNC_(nga_cstep_max_patch,NGA_CSTEP_MAX_PATCH) #define nga_dstep_max_patch_ F77_FUNC_(nga_dstep_max_patch,NGA_DSTEP_MAX_PATCH) #define nga_istep_max_patch_ F77_FUNC_(nga_istep_max_patch,NGA_ISTEP_MAX_PATCH) #define nga_sstep_max_patch_ F77_FUNC_(nga_sstep_max_patch,NGA_SSTEP_MAX_PATCH) #define nga_zstep_max_patch_ F77_FUNC_(nga_zstep_max_patch,NGA_ZSTEP_MAX_PATCH) #define ga_step_max_ F77_FUNC_(ga_step_max, GA_STEP_MAX) #define ga_cstep_max_ F77_FUNC_(ga_cstep_max,GA_CSTEP_MAX) #define ga_dstep_max_ F77_FUNC_(ga_dstep_max,GA_DSTEP_MAX) #define ga_istep_max_ F77_FUNC_(ga_istep_max,GA_ISTEP_MAX) #define ga_sstep_max_ F77_FUNC_(ga_sstep_max,GA_SSTEP_MAX) #define ga_zstep_max_ F77_FUNC_(ga_zstep_max,GA_ZSTEP_MAX) #define nga_step_max_ F77_FUNC_(nga_step_max, NGA_STEP_MAX) #define nga_cstep_max_ F77_FUNC_(nga_cstep_max,NGA_CSTEP_MAX) #define nga_dstep_max_ F77_FUNC_(nga_dstep_max,NGA_DSTEP_MAX) #define nga_istep_max_ F77_FUNC_(nga_istep_max,NGA_ISTEP_MAX) #define nga_sstep_max_ F77_FUNC_(nga_sstep_max,NGA_SSTEP_MAX) #define nga_zstep_max_ F77_FUNC_(nga_zstep_max,NGA_ZSTEP_MAX) #define ga_step_bound_info_ F77_FUNC_(ga_step_bound_info, GA_STEP_BOUND_INFO) #define ga_cstep_bound_info_ F77_FUNC_(ga_cstep_bound_info,GA_CSTEP_BOUND_INFO) #define ga_dstep_bound_info_ F77_FUNC_(ga_dstep_bound_info,GA_DSTEP_BOUND_INFO) #define ga_istep_bound_info_ F77_FUNC_(ga_istep_bound_info,GA_ISTEP_BOUND_INFO) #define ga_sstep_bound_info_ F77_FUNC_(ga_sstep_bound_info,GA_SSTEP_BOUND_INFO) #define ga_zstep_bound_info_ F77_FUNC_(ga_zstep_bound_info,GA_ZSTEP_BOUND_INFO) #define nga_step_bound_info_ F77_FUNC_(nga_step_bound_info, NGA_STEP_BOUND_INFO) #define nga_cstep_bound_info_ F77_FUNC_(nga_cstep_bound_info,NGA_CSTEP_BOUND_INFO) #define nga_dstep_bound_info_ F77_FUNC_(nga_dstep_bound_info,NGA_DSTEP_BOUND_INFO) #define nga_istep_bound_info_ F77_FUNC_(nga_istep_bound_info,NGA_ISTEP_BOUND_INFO) #define nga_sstep_bound_info_ F77_FUNC_(nga_sstep_bound_info,NGA_SSTEP_BOUND_INFO) #define nga_zstep_bound_info_ F77_FUNC_(nga_zstep_bound_info,NGA_ZSTEP_BOUND_INFO) #define ga_lu_solve_seq_ F77_FUNC_(ga_lu_solve_seq, GA_LU_SOLVE_SEQ) #define ga_clu_solve_seq_ F77_FUNC_(ga_clu_solve_seq,GA_CLU_SOLVE_SEQ) #define ga_dlu_solve_seq_ F77_FUNC_(ga_dlu_solve_seq,GA_DLU_SOLVE_SEQ) #define ga_ilu_solve_seq_ F77_FUNC_(ga_ilu_solve_seq,GA_ILU_SOLVE_SEQ) #define ga_slu_solve_seq_ F77_FUNC_(ga_slu_solve_seq,GA_SLU_SOLVE_SEQ) #define ga_zlu_solve_seq_ F77_FUNC_(ga_zlu_solve_seq,GA_ZLU_SOLVE_SEQ) #define nga_lu_solve_seq_ F77_FUNC_(nga_lu_solve_seq, NGA_LU_SOLVE_SEQ) #define nga_clu_solve_seq_ F77_FUNC_(nga_clu_solve_seq,NGA_CLU_SOLVE_SEQ) #define nga_dlu_solve_seq_ F77_FUNC_(nga_dlu_solve_seq,NGA_DLU_SOLVE_SEQ) #define nga_ilu_solve_seq_ F77_FUNC_(nga_ilu_solve_seq,NGA_ILU_SOLVE_SEQ) #define nga_slu_solve_seq_ F77_FUNC_(nga_slu_solve_seq,NGA_SLU_SOLVE_SEQ) #define nga_zlu_solve_seq_ F77_FUNC_(nga_zlu_solve_seq,NGA_ZLU_SOLVE_SEQ) #define ga_print_stats_ F77_FUNC_(ga_print_stats, GA_PRINT_STATS) #define ga_cprint_stats_ F77_FUNC_(ga_cprint_stats,GA_CPRINT_STATS) #define ga_dprint_stats_ F77_FUNC_(ga_dprint_stats,GA_DPRINT_STATS) #define ga_iprint_stats_ F77_FUNC_(ga_iprint_stats,GA_IPRINT_STATS) #define ga_sprint_stats_ F77_FUNC_(ga_sprint_stats,GA_SPRINT_STATS) #define ga_zprint_stats_ F77_FUNC_(ga_zprint_stats,GA_ZPRINT_STATS) #define nga_print_stats_ F77_FUNC_(nga_print_stats, NGA_PRINT_STATS) #define nga_cprint_stats_ F77_FUNC_(nga_cprint_stats,NGA_CPRINT_STATS) #define nga_dprint_stats_ F77_FUNC_(nga_dprint_stats,NGA_DPRINT_STATS) #define nga_iprint_stats_ F77_FUNC_(nga_iprint_stats,NGA_IPRINT_STATS) #define nga_sprint_stats_ F77_FUNC_(nga_sprint_stats,NGA_SPRINT_STATS) #define nga_zprint_stats_ F77_FUNC_(nga_zprint_stats,NGA_ZPRINT_STATS) #define ga_error_ F77_FUNC_(ga_error, GA_ERROR) #define ga_cerror_ F77_FUNC_(ga_cerror,GA_CERROR) #define ga_derror_ F77_FUNC_(ga_derror,GA_DERROR) #define ga_ierror_ F77_FUNC_(ga_ierror,GA_IERROR) #define ga_serror_ F77_FUNC_(ga_serror,GA_SERROR) #define ga_zerror_ F77_FUNC_(ga_zerror,GA_ZERROR) #define nga_error_ F77_FUNC_(nga_error, NGA_ERROR) #define nga_cerror_ F77_FUNC_(nga_cerror,NGA_CERROR) #define nga_derror_ F77_FUNC_(nga_derror,NGA_DERROR) #define nga_ierror_ F77_FUNC_(nga_ierror,NGA_IERROR) #define nga_serror_ F77_FUNC_(nga_serror,NGA_SERROR) #define nga_zerror_ F77_FUNC_(nga_zerror,NGA_ZERROR) #define ga_cluster_nodeid_ F77_FUNC_(ga_cluster_nodeid, GA_CLUSTER_NODEID) #define ga_ccluster_nodeid_ F77_FUNC_(ga_ccluster_nodeid,GA_CCLUSTER_NODEID) #define ga_dcluster_nodeid_ F77_FUNC_(ga_dcluster_nodeid,GA_DCLUSTER_NODEID) #define ga_icluster_nodeid_ F77_FUNC_(ga_icluster_nodeid,GA_ICLUSTER_NODEID) #define ga_scluster_nodeid_ F77_FUNC_(ga_scluster_nodeid,GA_SCLUSTER_NODEID) #define ga_zcluster_nodeid_ F77_FUNC_(ga_zcluster_nodeid,GA_ZCLUSTER_NODEID) #define nga_cluster_nodeid_ F77_FUNC_(nga_cluster_nodeid, NGA_CLUSTER_NODEID) #define nga_ccluster_nodeid_ F77_FUNC_(nga_ccluster_nodeid,NGA_CCLUSTER_NODEID) #define nga_dcluster_nodeid_ F77_FUNC_(nga_dcluster_nodeid,NGA_DCLUSTER_NODEID) #define nga_icluster_nodeid_ F77_FUNC_(nga_icluster_nodeid,NGA_ICLUSTER_NODEID) #define nga_scluster_nodeid_ F77_FUNC_(nga_scluster_nodeid,NGA_SCLUSTER_NODEID) #define nga_zcluster_nodeid_ F77_FUNC_(nga_zcluster_nodeid,NGA_ZCLUSTER_NODEID) #define ga_cluster_nprocs_ F77_FUNC_(ga_cluster_nprocs, GA_CLUSTER_NPROCS) #define ga_ccluster_nprocs_ F77_FUNC_(ga_ccluster_nprocs,GA_CCLUSTER_NPROCS) #define ga_dcluster_nprocs_ F77_FUNC_(ga_dcluster_nprocs,GA_DCLUSTER_NPROCS) #define ga_icluster_nprocs_ F77_FUNC_(ga_icluster_nprocs,GA_ICLUSTER_NPROCS) #define ga_scluster_nprocs_ F77_FUNC_(ga_scluster_nprocs,GA_SCLUSTER_NPROCS) #define ga_zcluster_nprocs_ F77_FUNC_(ga_zcluster_nprocs,GA_ZCLUSTER_NPROCS) #define nga_cluster_nprocs_ F77_FUNC_(nga_cluster_nprocs, NGA_CLUSTER_NPROCS) #define nga_ccluster_nprocs_ F77_FUNC_(nga_ccluster_nprocs,NGA_CCLUSTER_NPROCS) #define nga_dcluster_nprocs_ F77_FUNC_(nga_dcluster_nprocs,NGA_DCLUSTER_NPROCS) #define nga_icluster_nprocs_ F77_FUNC_(nga_icluster_nprocs,NGA_ICLUSTER_NPROCS) #define nga_scluster_nprocs_ F77_FUNC_(nga_scluster_nprocs,NGA_SCLUSTER_NPROCS) #define nga_zcluster_nprocs_ F77_FUNC_(nga_zcluster_nprocs,NGA_ZCLUSTER_NPROCS) #define ga_cluster_procid_ F77_FUNC_(ga_cluster_procid, GA_CLUSTER_PROCID) #define ga_ccluster_procid_ F77_FUNC_(ga_ccluster_procid,GA_CCLUSTER_PROCID) #define ga_dcluster_procid_ F77_FUNC_(ga_dcluster_procid,GA_DCLUSTER_PROCID) #define ga_icluster_procid_ F77_FUNC_(ga_icluster_procid,GA_ICLUSTER_PROCID) #define ga_scluster_procid_ F77_FUNC_(ga_scluster_procid,GA_SCLUSTER_PROCID) #define ga_zcluster_procid_ F77_FUNC_(ga_zcluster_procid,GA_ZCLUSTER_PROCID) #define nga_cluster_procid_ F77_FUNC_(nga_cluster_procid, NGA_CLUSTER_PROCID) #define nga_ccluster_procid_ F77_FUNC_(nga_ccluster_procid,NGA_CCLUSTER_PROCID) #define nga_dcluster_procid_ F77_FUNC_(nga_dcluster_procid,NGA_DCLUSTER_PROCID) #define nga_icluster_procid_ F77_FUNC_(nga_icluster_procid,NGA_ICLUSTER_PROCID) #define nga_scluster_procid_ F77_FUNC_(nga_scluster_procid,NGA_SCLUSTER_PROCID) #define nga_zcluster_procid_ F77_FUNC_(nga_zcluster_procid,NGA_ZCLUSTER_PROCID) #define ga_cluster_nnodes_ F77_FUNC_(ga_cluster_nnodes, GA_CLUSTER_NNODES) #define ga_ccluster_nnodes_ F77_FUNC_(ga_ccluster_nnodes,GA_CCLUSTER_NNODES) #define ga_dcluster_nnodes_ F77_FUNC_(ga_dcluster_nnodes,GA_DCLUSTER_NNODES) #define ga_icluster_nnodes_ F77_FUNC_(ga_icluster_nnodes,GA_ICLUSTER_NNODES) #define ga_scluster_nnodes_ F77_FUNC_(ga_scluster_nnodes,GA_SCLUSTER_NNODES) #define ga_zcluster_nnodes_ F77_FUNC_(ga_zcluster_nnodes,GA_ZCLUSTER_NNODES) #define nga_cluster_nnodes_ F77_FUNC_(nga_cluster_nnodes, NGA_CLUSTER_NNODES) #define nga_ccluster_nnodes_ F77_FUNC_(nga_ccluster_nnodes,NGA_CCLUSTER_NNODES) #define nga_dcluster_nnodes_ F77_FUNC_(nga_dcluster_nnodes,NGA_DCLUSTER_NNODES) #define nga_icluster_nnodes_ F77_FUNC_(nga_icluster_nnodes,NGA_ICLUSTER_NNODES) #define nga_scluster_nnodes_ F77_FUNC_(nga_scluster_nnodes,NGA_SCLUSTER_NNODES) #define nga_zcluster_nnodes_ F77_FUNC_(nga_zcluster_nnodes,NGA_ZCLUSTER_NNODES) #define ga_cluster_proc_nodeid_ F77_FUNC_(ga_cluster_proc_nodeid, GA_CLUSTER_PROC_NODEID) #define ga_ccluster_proc_nodeid_ F77_FUNC_(ga_ccluster_proc_nodeid,GA_CCLUSTER_PROC_NODEID) #define ga_dcluster_proc_nodeid_ F77_FUNC_(ga_dcluster_proc_nodeid,GA_DCLUSTER_PROC_NODEID) #define ga_icluster_proc_nodeid_ F77_FUNC_(ga_icluster_proc_nodeid,GA_ICLUSTER_PROC_NODEID) #define ga_scluster_proc_nodeid_ F77_FUNC_(ga_scluster_proc_nodeid,GA_SCLUSTER_PROC_NODEID) #define ga_zcluster_proc_nodeid_ F77_FUNC_(ga_zcluster_proc_nodeid,GA_ZCLUSTER_PROC_NODEID) #define nga_cluster_proc_nodeid_ F77_FUNC_(nga_cluster_proc_nodeid, NGA_CLUSTER_PROC_NODEID) #define nga_ccluster_proc_nodeid_ F77_FUNC_(nga_ccluster_proc_nodeid,NGA_CCLUSTER_PROC_NODEID) #define nga_dcluster_proc_nodeid_ F77_FUNC_(nga_dcluster_proc_nodeid,NGA_DCLUSTER_PROC_NODEID) #define nga_icluster_proc_nodeid_ F77_FUNC_(nga_icluster_proc_nodeid,NGA_ICLUSTER_PROC_NODEID) #define nga_scluster_proc_nodeid_ F77_FUNC_(nga_scluster_proc_nodeid,NGA_SCLUSTER_PROC_NODEID) #define nga_zcluster_proc_nodeid_ F77_FUNC_(nga_zcluster_proc_nodeid,NGA_ZCLUSTER_PROC_NODEID) #define ga_print_file_ F77_FUNC_(ga_print_file, GA_PRINT_FILE) #define ga_cprint_file_ F77_FUNC_(ga_cprint_file,GA_CPRINT_FILE) #define ga_dprint_file_ F77_FUNC_(ga_dprint_file,GA_DPRINT_FILE) #define ga_iprint_file_ F77_FUNC_(ga_iprint_file,GA_IPRINT_FILE) #define ga_sprint_file_ F77_FUNC_(ga_sprint_file,GA_SPRINT_FILE) #define ga_zprint_file_ F77_FUNC_(ga_zprint_file,GA_ZPRINT_FILE) #define nga_print_file_ F77_FUNC_(nga_print_file, NGA_PRINT_FILE) #define nga_cprint_file_ F77_FUNC_(nga_cprint_file,NGA_CPRINT_FILE) #define nga_dprint_file_ F77_FUNC_(nga_dprint_file,NGA_DPRINT_FILE) #define nga_iprint_file_ F77_FUNC_(nga_iprint_file,NGA_IPRINT_FILE) #define nga_sprint_file_ F77_FUNC_(nga_sprint_file,NGA_SPRINT_FILE) #define nga_zprint_file_ F77_FUNC_(nga_zprint_file,NGA_ZPRINT_FILE) #define ga_print_ F77_FUNC_(ga_print, GA_PRINT) #define ga_cprint_ F77_FUNC_(ga_cprint,GA_CPRINT) #define ga_dprint_ F77_FUNC_(ga_dprint,GA_DPRINT) #define ga_iprint_ F77_FUNC_(ga_iprint,GA_IPRINT) #define ga_sprint_ F77_FUNC_(ga_sprint,GA_SPRINT) #define ga_zprint_ F77_FUNC_(ga_zprint,GA_ZPRINT) #define nga_print_ F77_FUNC_(nga_print, NGA_PRINT) #define nga_cprint_ F77_FUNC_(nga_cprint,NGA_CPRINT) #define nga_dprint_ F77_FUNC_(nga_dprint,NGA_DPRINT) #define nga_iprint_ F77_FUNC_(nga_iprint,NGA_IPRINT) #define nga_sprint_ F77_FUNC_(nga_sprint,NGA_SPRINT) #define nga_zprint_ F77_FUNC_(nga_zprint,NGA_ZPRINT) #define ga_print_patch_file2d_ F77_FUNC_(ga_print_patch_file2d, GA_PRINT_PATCH_FILE2D) #define ga_cprint_patch_file2d_ F77_FUNC_(ga_cprint_patch_file2d,GA_CPRINT_PATCH_FILE2D) #define ga_dprint_patch_file2d_ F77_FUNC_(ga_dprint_patch_file2d,GA_DPRINT_PATCH_FILE2D) #define ga_iprint_patch_file2d_ F77_FUNC_(ga_iprint_patch_file2d,GA_IPRINT_PATCH_FILE2D) #define ga_sprint_patch_file2d_ F77_FUNC_(ga_sprint_patch_file2d,GA_SPRINT_PATCH_FILE2D) #define ga_zprint_patch_file2d_ F77_FUNC_(ga_zprint_patch_file2d,GA_ZPRINT_PATCH_FILE2D) #define nga_print_patch_file2d_ F77_FUNC_(nga_print_patch_file2d, NGA_PRINT_PATCH_FILE2D) #define nga_cprint_patch_file2d_ F77_FUNC_(nga_cprint_patch_file2d,NGA_CPRINT_PATCH_FILE2D) #define nga_dprint_patch_file2d_ F77_FUNC_(nga_dprint_patch_file2d,NGA_DPRINT_PATCH_FILE2D) #define nga_iprint_patch_file2d_ F77_FUNC_(nga_iprint_patch_file2d,NGA_IPRINT_PATCH_FILE2D) #define nga_sprint_patch_file2d_ F77_FUNC_(nga_sprint_patch_file2d,NGA_SPRINT_PATCH_FILE2D) #define nga_zprint_patch_file2d_ F77_FUNC_(nga_zprint_patch_file2d,NGA_ZPRINT_PATCH_FILE2D) #define ga_print_patch2d_ F77_FUNC_(ga_print_patch2d, GA_PRINT_PATCH2D) #define ga_cprint_patch2d_ F77_FUNC_(ga_cprint_patch2d,GA_CPRINT_PATCH2D) #define ga_dprint_patch2d_ F77_FUNC_(ga_dprint_patch2d,GA_DPRINT_PATCH2D) #define ga_iprint_patch2d_ F77_FUNC_(ga_iprint_patch2d,GA_IPRINT_PATCH2D) #define ga_sprint_patch2d_ F77_FUNC_(ga_sprint_patch2d,GA_SPRINT_PATCH2D) #define ga_zprint_patch2d_ F77_FUNC_(ga_zprint_patch2d,GA_ZPRINT_PATCH2D) #define nga_print_patch2d_ F77_FUNC_(nga_print_patch2d, NGA_PRINT_PATCH2D) #define nga_cprint_patch2d_ F77_FUNC_(nga_cprint_patch2d,NGA_CPRINT_PATCH2D) #define nga_dprint_patch2d_ F77_FUNC_(nga_dprint_patch2d,NGA_DPRINT_PATCH2D) #define nga_iprint_patch2d_ F77_FUNC_(nga_iprint_patch2d,NGA_IPRINT_PATCH2D) #define nga_sprint_patch2d_ F77_FUNC_(nga_sprint_patch2d,NGA_SPRINT_PATCH2D) #define nga_zprint_patch2d_ F77_FUNC_(nga_zprint_patch2d,NGA_ZPRINT_PATCH2D) #define ga_print_patch_file_ F77_FUNC_(ga_print_patch_file, GA_PRINT_PATCH_FILE) #define ga_cprint_patch_file_ F77_FUNC_(ga_cprint_patch_file,GA_CPRINT_PATCH_FILE) #define ga_dprint_patch_file_ F77_FUNC_(ga_dprint_patch_file,GA_DPRINT_PATCH_FILE) #define ga_iprint_patch_file_ F77_FUNC_(ga_iprint_patch_file,GA_IPRINT_PATCH_FILE) #define ga_sprint_patch_file_ F77_FUNC_(ga_sprint_patch_file,GA_SPRINT_PATCH_FILE) #define ga_zprint_patch_file_ F77_FUNC_(ga_zprint_patch_file,GA_ZPRINT_PATCH_FILE) #define nga_print_patch_file_ F77_FUNC_(nga_print_patch_file, NGA_PRINT_PATCH_FILE) #define nga_cprint_patch_file_ F77_FUNC_(nga_cprint_patch_file,NGA_CPRINT_PATCH_FILE) #define nga_dprint_patch_file_ F77_FUNC_(nga_dprint_patch_file,NGA_DPRINT_PATCH_FILE) #define nga_iprint_patch_file_ F77_FUNC_(nga_iprint_patch_file,NGA_IPRINT_PATCH_FILE) #define nga_sprint_patch_file_ F77_FUNC_(nga_sprint_patch_file,NGA_SPRINT_PATCH_FILE) #define nga_zprint_patch_file_ F77_FUNC_(nga_zprint_patch_file,NGA_ZPRINT_PATCH_FILE) #define ga_print_patch_ F77_FUNC_(ga_print_patch, GA_PRINT_PATCH) #define ga_cprint_patch_ F77_FUNC_(ga_cprint_patch,GA_CPRINT_PATCH) #define ga_dprint_patch_ F77_FUNC_(ga_dprint_patch,GA_DPRINT_PATCH) #define ga_iprint_patch_ F77_FUNC_(ga_iprint_patch,GA_IPRINT_PATCH) #define ga_sprint_patch_ F77_FUNC_(ga_sprint_patch,GA_SPRINT_PATCH) #define ga_zprint_patch_ F77_FUNC_(ga_zprint_patch,GA_ZPRINT_PATCH) #define nga_print_patch_ F77_FUNC_(nga_print_patch, NGA_PRINT_PATCH) #define nga_cprint_patch_ F77_FUNC_(nga_cprint_patch,NGA_CPRINT_PATCH) #define nga_dprint_patch_ F77_FUNC_(nga_dprint_patch,NGA_DPRINT_PATCH) #define nga_iprint_patch_ F77_FUNC_(nga_iprint_patch,NGA_IPRINT_PATCH) #define nga_sprint_patch_ F77_FUNC_(nga_sprint_patch,NGA_SPRINT_PATCH) #define nga_zprint_patch_ F77_FUNC_(nga_zprint_patch,NGA_ZPRINT_PATCH) #define ga_print_distribution_ F77_FUNC_(ga_print_distribution, GA_PRINT_DISTRIBUTION) #define ga_cprint_distribution_ F77_FUNC_(ga_cprint_distribution,GA_CPRINT_DISTRIBUTION) #define ga_dprint_distribution_ F77_FUNC_(ga_dprint_distribution,GA_DPRINT_DISTRIBUTION) #define ga_iprint_distribution_ F77_FUNC_(ga_iprint_distribution,GA_IPRINT_DISTRIBUTION) #define ga_sprint_distribution_ F77_FUNC_(ga_sprint_distribution,GA_SPRINT_DISTRIBUTION) #define ga_zprint_distribution_ F77_FUNC_(ga_zprint_distribution,GA_ZPRINT_DISTRIBUTION) #define nga_print_distribution_ F77_FUNC_(nga_print_distribution, NGA_PRINT_DISTRIBUTION) #define nga_cprint_distribution_ F77_FUNC_(nga_cprint_distribution,NGA_CPRINT_DISTRIBUTION) #define nga_dprint_distribution_ F77_FUNC_(nga_dprint_distribution,NGA_DPRINT_DISTRIBUTION) #define nga_iprint_distribution_ F77_FUNC_(nga_iprint_distribution,NGA_IPRINT_DISTRIBUTION) #define nga_sprint_distribution_ F77_FUNC_(nga_sprint_distribution,NGA_SPRINT_DISTRIBUTION) #define nga_zprint_distribution_ F77_FUNC_(nga_zprint_distribution,NGA_ZPRINT_DISTRIBUTION) #define ga_summarize_ F77_FUNC_(ga_summarize, GA_SUMMARIZE) #define ga_csummarize_ F77_FUNC_(ga_csummarize,GA_CSUMMARIZE) #define ga_dsummarize_ F77_FUNC_(ga_dsummarize,GA_DSUMMARIZE) #define ga_isummarize_ F77_FUNC_(ga_isummarize,GA_ISUMMARIZE) #define ga_ssummarize_ F77_FUNC_(ga_ssummarize,GA_SSUMMARIZE) #define ga_zsummarize_ F77_FUNC_(ga_zsummarize,GA_ZSUMMARIZE) #define nga_summarize_ F77_FUNC_(nga_summarize, NGA_SUMMARIZE) #define nga_csummarize_ F77_FUNC_(nga_csummarize,NGA_CSUMMARIZE) #define nga_dsummarize_ F77_FUNC_(nga_dsummarize,NGA_DSUMMARIZE) #define nga_isummarize_ F77_FUNC_(nga_isummarize,NGA_ISUMMARIZE) #define nga_ssummarize_ F77_FUNC_(nga_ssummarize,NGA_SSUMMARIZE) #define nga_zsummarize_ F77_FUNC_(nga_zsummarize,NGA_ZSUMMARIZE) #define ga_access_ghost_ptr_ F77_FUNC_(ga_access_ghost_ptr, GA_ACCESS_GHOST_PTR) #define ga_caccess_ghost_ptr_ F77_FUNC_(ga_caccess_ghost_ptr,GA_CACCESS_GHOST_PTR) #define ga_daccess_ghost_ptr_ F77_FUNC_(ga_daccess_ghost_ptr,GA_DACCESS_GHOST_PTR) #define ga_iaccess_ghost_ptr_ F77_FUNC_(ga_iaccess_ghost_ptr,GA_IACCESS_GHOST_PTR) #define ga_saccess_ghost_ptr_ F77_FUNC_(ga_saccess_ghost_ptr,GA_SACCESS_GHOST_PTR) #define ga_zaccess_ghost_ptr_ F77_FUNC_(ga_zaccess_ghost_ptr,GA_ZACCESS_GHOST_PTR) #define nga_access_ghost_ptr_ F77_FUNC_(nga_access_ghost_ptr, NGA_ACCESS_GHOST_PTR) #define nga_caccess_ghost_ptr_ F77_FUNC_(nga_caccess_ghost_ptr,NGA_CACCESS_GHOST_PTR) #define nga_daccess_ghost_ptr_ F77_FUNC_(nga_daccess_ghost_ptr,NGA_DACCESS_GHOST_PTR) #define nga_iaccess_ghost_ptr_ F77_FUNC_(nga_iaccess_ghost_ptr,NGA_IACCESS_GHOST_PTR) #define nga_saccess_ghost_ptr_ F77_FUNC_(nga_saccess_ghost_ptr,NGA_SACCESS_GHOST_PTR) #define nga_zaccess_ghost_ptr_ F77_FUNC_(nga_zaccess_ghost_ptr,NGA_ZACCESS_GHOST_PTR) #define ga_access_ghost_element_ F77_FUNC_(ga_access_ghost_element, GA_ACCESS_GHOST_ELEMENT) #define ga_caccess_ghost_element_ F77_FUNC_(ga_caccess_ghost_element,GA_CACCESS_GHOST_ELEMENT) #define ga_daccess_ghost_element_ F77_FUNC_(ga_daccess_ghost_element,GA_DACCESS_GHOST_ELEMENT) #define ga_iaccess_ghost_element_ F77_FUNC_(ga_iaccess_ghost_element,GA_IACCESS_GHOST_ELEMENT) #define ga_saccess_ghost_element_ F77_FUNC_(ga_saccess_ghost_element,GA_SACCESS_GHOST_ELEMENT) #define ga_zaccess_ghost_element_ F77_FUNC_(ga_zaccess_ghost_element,GA_ZACCESS_GHOST_ELEMENT) #define nga_access_ghost_element_ F77_FUNC_(nga_access_ghost_element, NGA_ACCESS_GHOST_ELEMENT) #define nga_caccess_ghost_element_ F77_FUNC_(nga_caccess_ghost_element,NGA_CACCESS_GHOST_ELEMENT) #define nga_daccess_ghost_element_ F77_FUNC_(nga_daccess_ghost_element,NGA_DACCESS_GHOST_ELEMENT) #define nga_iaccess_ghost_element_ F77_FUNC_(nga_iaccess_ghost_element,NGA_IACCESS_GHOST_ELEMENT) #define nga_saccess_ghost_element_ F77_FUNC_(nga_saccess_ghost_element,NGA_SACCESS_GHOST_ELEMENT) #define nga_zaccess_ghost_element_ F77_FUNC_(nga_zaccess_ghost_element,NGA_ZACCESS_GHOST_ELEMENT) #define ga_access_ghost_element_ptr_ F77_FUNC_(ga_access_ghost_element_ptr, GA_ACCESS_GHOST_ELEMENT_PTR) #define ga_caccess_ghost_element_ptr_ F77_FUNC_(ga_caccess_ghost_element_ptr,GA_CACCESS_GHOST_ELEMENT_PTR) #define ga_daccess_ghost_element_ptr_ F77_FUNC_(ga_daccess_ghost_element_ptr,GA_DACCESS_GHOST_ELEMENT_PTR) #define ga_iaccess_ghost_element_ptr_ F77_FUNC_(ga_iaccess_ghost_element_ptr,GA_IACCESS_GHOST_ELEMENT_PTR) #define ga_saccess_ghost_element_ptr_ F77_FUNC_(ga_saccess_ghost_element_ptr,GA_SACCESS_GHOST_ELEMENT_PTR) #define ga_zaccess_ghost_element_ptr_ F77_FUNC_(ga_zaccess_ghost_element_ptr,GA_ZACCESS_GHOST_ELEMENT_PTR) #define nga_access_ghost_element_ptr_ F77_FUNC_(nga_access_ghost_element_ptr, NGA_ACCESS_GHOST_ELEMENT_PTR) #define nga_caccess_ghost_element_ptr_ F77_FUNC_(nga_caccess_ghost_element_ptr,NGA_CACCESS_GHOST_ELEMENT_PTR) #define nga_daccess_ghost_element_ptr_ F77_FUNC_(nga_daccess_ghost_element_ptr,NGA_DACCESS_GHOST_ELEMENT_PTR) #define nga_iaccess_ghost_element_ptr_ F77_FUNC_(nga_iaccess_ghost_element_ptr,NGA_IACCESS_GHOST_ELEMENT_PTR) #define nga_saccess_ghost_element_ptr_ F77_FUNC_(nga_saccess_ghost_element_ptr,NGA_SACCESS_GHOST_ELEMENT_PTR) #define nga_zaccess_ghost_element_ptr_ F77_FUNC_(nga_zaccess_ghost_element_ptr,NGA_ZACCESS_GHOST_ELEMENT_PTR) #define ga_access_ghosts_ F77_FUNC_(ga_access_ghosts, GA_ACCESS_GHOSTS) #define ga_caccess_ghosts_ F77_FUNC_(ga_caccess_ghosts,GA_CACCESS_GHOSTS) #define ga_daccess_ghosts_ F77_FUNC_(ga_daccess_ghosts,GA_DACCESS_GHOSTS) #define ga_iaccess_ghosts_ F77_FUNC_(ga_iaccess_ghosts,GA_IACCESS_GHOSTS) #define ga_saccess_ghosts_ F77_FUNC_(ga_saccess_ghosts,GA_SACCESS_GHOSTS) #define ga_zaccess_ghosts_ F77_FUNC_(ga_zaccess_ghosts,GA_ZACCESS_GHOSTS) #define nga_access_ghosts_ F77_FUNC_(nga_access_ghosts, NGA_ACCESS_GHOSTS) #define nga_caccess_ghosts_ F77_FUNC_(nga_caccess_ghosts,NGA_CACCESS_GHOSTS) #define nga_daccess_ghosts_ F77_FUNC_(nga_daccess_ghosts,NGA_DACCESS_GHOSTS) #define nga_iaccess_ghosts_ F77_FUNC_(nga_iaccess_ghosts,NGA_IACCESS_GHOSTS) #define nga_saccess_ghosts_ F77_FUNC_(nga_saccess_ghosts,NGA_SACCESS_GHOSTS) #define nga_zaccess_ghosts_ F77_FUNC_(nga_zaccess_ghosts,NGA_ZACCESS_GHOSTS) #define ga_release_ghost_element_ F77_FUNC_(ga_release_ghost_element, GA_RELEASE_GHOST_ELEMENT) #define ga_crelease_ghost_element_ F77_FUNC_(ga_crelease_ghost_element,GA_CRELEASE_GHOST_ELEMENT) #define ga_drelease_ghost_element_ F77_FUNC_(ga_drelease_ghost_element,GA_DRELEASE_GHOST_ELEMENT) #define ga_irelease_ghost_element_ F77_FUNC_(ga_irelease_ghost_element,GA_IRELEASE_GHOST_ELEMENT) #define ga_srelease_ghost_element_ F77_FUNC_(ga_srelease_ghost_element,GA_SRELEASE_GHOST_ELEMENT) #define ga_zrelease_ghost_element_ F77_FUNC_(ga_zrelease_ghost_element,GA_ZRELEASE_GHOST_ELEMENT) #define nga_release_ghost_element_ F77_FUNC_(nga_release_ghost_element, NGA_RELEASE_GHOST_ELEMENT) #define nga_crelease_ghost_element_ F77_FUNC_(nga_crelease_ghost_element,NGA_CRELEASE_GHOST_ELEMENT) #define nga_drelease_ghost_element_ F77_FUNC_(nga_drelease_ghost_element,NGA_DRELEASE_GHOST_ELEMENT) #define nga_irelease_ghost_element_ F77_FUNC_(nga_irelease_ghost_element,NGA_IRELEASE_GHOST_ELEMENT) #define nga_srelease_ghost_element_ F77_FUNC_(nga_srelease_ghost_element,NGA_SRELEASE_GHOST_ELEMENT) #define nga_zrelease_ghost_element_ F77_FUNC_(nga_zrelease_ghost_element,NGA_ZRELEASE_GHOST_ELEMENT) #define ga_release_update_ghost_element_ F77_FUNC_(ga_release_update_ghost_element, GA_RELEASE_UPDATE_GHOST_ELEMENT) #define ga_crelease_update_ghost_element_ F77_FUNC_(ga_crelease_update_ghost_element,GA_CRELEASE_UPDATE_GHOST_ELEMENT) #define ga_drelease_update_ghost_element_ F77_FUNC_(ga_drelease_update_ghost_element,GA_DRELEASE_UPDATE_GHOST_ELEMENT) #define ga_irelease_update_ghost_element_ F77_FUNC_(ga_irelease_update_ghost_element,GA_IRELEASE_UPDATE_GHOST_ELEMENT) #define ga_srelease_update_ghost_element_ F77_FUNC_(ga_srelease_update_ghost_element,GA_SRELEASE_UPDATE_GHOST_ELEMENT) #define ga_zrelease_update_ghost_element_ F77_FUNC_(ga_zrelease_update_ghost_element,GA_ZRELEASE_UPDATE_GHOST_ELEMENT) #define nga_release_update_ghost_element_ F77_FUNC_(nga_release_update_ghost_element, NGA_RELEASE_UPDATE_GHOST_ELEMENT) #define nga_crelease_update_ghost_element_ F77_FUNC_(nga_crelease_update_ghost_element,NGA_CRELEASE_UPDATE_GHOST_ELEMENT) #define nga_drelease_update_ghost_element_ F77_FUNC_(nga_drelease_update_ghost_element,NGA_DRELEASE_UPDATE_GHOST_ELEMENT) #define nga_irelease_update_ghost_element_ F77_FUNC_(nga_irelease_update_ghost_element,NGA_IRELEASE_UPDATE_GHOST_ELEMENT) #define nga_srelease_update_ghost_element_ F77_FUNC_(nga_srelease_update_ghost_element,NGA_SRELEASE_UPDATE_GHOST_ELEMENT) #define nga_zrelease_update_ghost_element_ F77_FUNC_(nga_zrelease_update_ghost_element,NGA_ZRELEASE_UPDATE_GHOST_ELEMENT) #define ga_release_ghosts_ F77_FUNC_(ga_release_ghosts, GA_RELEASE_GHOSTS) #define ga_crelease_ghosts_ F77_FUNC_(ga_crelease_ghosts,GA_CRELEASE_GHOSTS) #define ga_drelease_ghosts_ F77_FUNC_(ga_drelease_ghosts,GA_DRELEASE_GHOSTS) #define ga_irelease_ghosts_ F77_FUNC_(ga_irelease_ghosts,GA_IRELEASE_GHOSTS) #define ga_srelease_ghosts_ F77_FUNC_(ga_srelease_ghosts,GA_SRELEASE_GHOSTS) #define ga_zrelease_ghosts_ F77_FUNC_(ga_zrelease_ghosts,GA_ZRELEASE_GHOSTS) #define nga_release_ghosts_ F77_FUNC_(nga_release_ghosts, NGA_RELEASE_GHOSTS) #define nga_crelease_ghosts_ F77_FUNC_(nga_crelease_ghosts,NGA_CRELEASE_GHOSTS) #define nga_drelease_ghosts_ F77_FUNC_(nga_drelease_ghosts,NGA_DRELEASE_GHOSTS) #define nga_irelease_ghosts_ F77_FUNC_(nga_irelease_ghosts,NGA_IRELEASE_GHOSTS) #define nga_srelease_ghosts_ F77_FUNC_(nga_srelease_ghosts,NGA_SRELEASE_GHOSTS) #define nga_zrelease_ghosts_ F77_FUNC_(nga_zrelease_ghosts,NGA_ZRELEASE_GHOSTS) #define ga_release_update_ghosts_ F77_FUNC_(ga_release_update_ghosts, GA_RELEASE_UPDATE_GHOSTS) #define ga_crelease_update_ghosts_ F77_FUNC_(ga_crelease_update_ghosts,GA_CRELEASE_UPDATE_GHOSTS) #define ga_drelease_update_ghosts_ F77_FUNC_(ga_drelease_update_ghosts,GA_DRELEASE_UPDATE_GHOSTS) #define ga_irelease_update_ghosts_ F77_FUNC_(ga_irelease_update_ghosts,GA_IRELEASE_UPDATE_GHOSTS) #define ga_srelease_update_ghosts_ F77_FUNC_(ga_srelease_update_ghosts,GA_SRELEASE_UPDATE_GHOSTS) #define ga_zrelease_update_ghosts_ F77_FUNC_(ga_zrelease_update_ghosts,GA_ZRELEASE_UPDATE_GHOSTS) #define nga_release_update_ghosts_ F77_FUNC_(nga_release_update_ghosts, NGA_RELEASE_UPDATE_GHOSTS) #define nga_crelease_update_ghosts_ F77_FUNC_(nga_crelease_update_ghosts,NGA_CRELEASE_UPDATE_GHOSTS) #define nga_drelease_update_ghosts_ F77_FUNC_(nga_drelease_update_ghosts,NGA_DRELEASE_UPDATE_GHOSTS) #define nga_irelease_update_ghosts_ F77_FUNC_(nga_irelease_update_ghosts,NGA_IRELEASE_UPDATE_GHOSTS) #define nga_srelease_update_ghosts_ F77_FUNC_(nga_srelease_update_ghosts,NGA_SRELEASE_UPDATE_GHOSTS) #define nga_zrelease_update_ghosts_ F77_FUNC_(nga_zrelease_update_ghosts,NGA_ZRELEASE_UPDATE_GHOSTS) #define ga_get_ghost_block_ F77_FUNC_(ga_get_ghost_block, GA_GET_GHOST_BLOCK) #define ga_cget_ghost_block_ F77_FUNC_(ga_cget_ghost_block,GA_CGET_GHOST_BLOCK) #define ga_dget_ghost_block_ F77_FUNC_(ga_dget_ghost_block,GA_DGET_GHOST_BLOCK) #define ga_iget_ghost_block_ F77_FUNC_(ga_iget_ghost_block,GA_IGET_GHOST_BLOCK) #define ga_sget_ghost_block_ F77_FUNC_(ga_sget_ghost_block,GA_SGET_GHOST_BLOCK) #define ga_zget_ghost_block_ F77_FUNC_(ga_zget_ghost_block,GA_ZGET_GHOST_BLOCK) #define nga_get_ghost_block_ F77_FUNC_(nga_get_ghost_block, NGA_GET_GHOST_BLOCK) #define nga_cget_ghost_block_ F77_FUNC_(nga_cget_ghost_block,NGA_CGET_GHOST_BLOCK) #define nga_dget_ghost_block_ F77_FUNC_(nga_dget_ghost_block,NGA_DGET_GHOST_BLOCK) #define nga_iget_ghost_block_ F77_FUNC_(nga_iget_ghost_block,NGA_IGET_GHOST_BLOCK) #define nga_sget_ghost_block_ F77_FUNC_(nga_sget_ghost_block,NGA_SGET_GHOST_BLOCK) #define nga_zget_ghost_block_ F77_FUNC_(nga_zget_ghost_block,NGA_ZGET_GHOST_BLOCK) #define ga_update1_ghosts_ F77_FUNC_(ga_update1_ghosts, GA_UPDATE1_GHOSTS) #define ga_cupdate1_ghosts_ F77_FUNC_(ga_cupdate1_ghosts,GA_CUPDATE1_GHOSTS) #define ga_dupdate1_ghosts_ F77_FUNC_(ga_dupdate1_ghosts,GA_DUPDATE1_GHOSTS) #define ga_iupdate1_ghosts_ F77_FUNC_(ga_iupdate1_ghosts,GA_IUPDATE1_GHOSTS) #define ga_supdate1_ghosts_ F77_FUNC_(ga_supdate1_ghosts,GA_SUPDATE1_GHOSTS) #define ga_zupdate1_ghosts_ F77_FUNC_(ga_zupdate1_ghosts,GA_ZUPDATE1_GHOSTS) #define nga_update1_ghosts_ F77_FUNC_(nga_update1_ghosts, NGA_UPDATE1_GHOSTS) #define nga_cupdate1_ghosts_ F77_FUNC_(nga_cupdate1_ghosts,NGA_CUPDATE1_GHOSTS) #define nga_dupdate1_ghosts_ F77_FUNC_(nga_dupdate1_ghosts,NGA_DUPDATE1_GHOSTS) #define nga_iupdate1_ghosts_ F77_FUNC_(nga_iupdate1_ghosts,NGA_IUPDATE1_GHOSTS) #define nga_supdate1_ghosts_ F77_FUNC_(nga_supdate1_ghosts,NGA_SUPDATE1_GHOSTS) #define nga_zupdate1_ghosts_ F77_FUNC_(nga_zupdate1_ghosts,NGA_ZUPDATE1_GHOSTS) #define ga_update2_ghosts_ F77_FUNC_(ga_update2_ghosts, GA_UPDATE2_GHOSTS) #define ga_cupdate2_ghosts_ F77_FUNC_(ga_cupdate2_ghosts,GA_CUPDATE2_GHOSTS) #define ga_dupdate2_ghosts_ F77_FUNC_(ga_dupdate2_ghosts,GA_DUPDATE2_GHOSTS) #define ga_iupdate2_ghosts_ F77_FUNC_(ga_iupdate2_ghosts,GA_IUPDATE2_GHOSTS) #define ga_supdate2_ghosts_ F77_FUNC_(ga_supdate2_ghosts,GA_SUPDATE2_GHOSTS) #define ga_zupdate2_ghosts_ F77_FUNC_(ga_zupdate2_ghosts,GA_ZUPDATE2_GHOSTS) #define nga_update2_ghosts_ F77_FUNC_(nga_update2_ghosts, NGA_UPDATE2_GHOSTS) #define nga_cupdate2_ghosts_ F77_FUNC_(nga_cupdate2_ghosts,NGA_CUPDATE2_GHOSTS) #define nga_dupdate2_ghosts_ F77_FUNC_(nga_dupdate2_ghosts,NGA_DUPDATE2_GHOSTS) #define nga_iupdate2_ghosts_ F77_FUNC_(nga_iupdate2_ghosts,NGA_IUPDATE2_GHOSTS) #define nga_supdate2_ghosts_ F77_FUNC_(nga_supdate2_ghosts,NGA_SUPDATE2_GHOSTS) #define nga_zupdate2_ghosts_ F77_FUNC_(nga_zupdate2_ghosts,NGA_ZUPDATE2_GHOSTS) #define ga_update3_ghosts_ F77_FUNC_(ga_update3_ghosts, GA_UPDATE3_GHOSTS) #define ga_cupdate3_ghosts_ F77_FUNC_(ga_cupdate3_ghosts,GA_CUPDATE3_GHOSTS) #define ga_dupdate3_ghosts_ F77_FUNC_(ga_dupdate3_ghosts,GA_DUPDATE3_GHOSTS) #define ga_iupdate3_ghosts_ F77_FUNC_(ga_iupdate3_ghosts,GA_IUPDATE3_GHOSTS) #define ga_supdate3_ghosts_ F77_FUNC_(ga_supdate3_ghosts,GA_SUPDATE3_GHOSTS) #define ga_zupdate3_ghosts_ F77_FUNC_(ga_zupdate3_ghosts,GA_ZUPDATE3_GHOSTS) #define nga_update3_ghosts_ F77_FUNC_(nga_update3_ghosts, NGA_UPDATE3_GHOSTS) #define nga_cupdate3_ghosts_ F77_FUNC_(nga_cupdate3_ghosts,NGA_CUPDATE3_GHOSTS) #define nga_dupdate3_ghosts_ F77_FUNC_(nga_dupdate3_ghosts,NGA_DUPDATE3_GHOSTS) #define nga_iupdate3_ghosts_ F77_FUNC_(nga_iupdate3_ghosts,NGA_IUPDATE3_GHOSTS) #define nga_supdate3_ghosts_ F77_FUNC_(nga_supdate3_ghosts,NGA_SUPDATE3_GHOSTS) #define nga_zupdate3_ghosts_ F77_FUNC_(nga_zupdate3_ghosts,NGA_ZUPDATE3_GHOSTS) #define ga_set_update4_info_ F77_FUNC_(ga_set_update4_info, GA_SET_UPDATE4_INFO) #define ga_cset_update4_info_ F77_FUNC_(ga_cset_update4_info,GA_CSET_UPDATE4_INFO) #define ga_dset_update4_info_ F77_FUNC_(ga_dset_update4_info,GA_DSET_UPDATE4_INFO) #define ga_iset_update4_info_ F77_FUNC_(ga_iset_update4_info,GA_ISET_UPDATE4_INFO) #define ga_sset_update4_info_ F77_FUNC_(ga_sset_update4_info,GA_SSET_UPDATE4_INFO) #define ga_zset_update4_info_ F77_FUNC_(ga_zset_update4_info,GA_ZSET_UPDATE4_INFO) #define nga_set_update4_info_ F77_FUNC_(nga_set_update4_info, NGA_SET_UPDATE4_INFO) #define nga_cset_update4_info_ F77_FUNC_(nga_cset_update4_info,NGA_CSET_UPDATE4_INFO) #define nga_dset_update4_info_ F77_FUNC_(nga_dset_update4_info,NGA_DSET_UPDATE4_INFO) #define nga_iset_update4_info_ F77_FUNC_(nga_iset_update4_info,NGA_ISET_UPDATE4_INFO) #define nga_sset_update4_info_ F77_FUNC_(nga_sset_update4_info,NGA_SSET_UPDATE4_INFO) #define nga_zset_update4_info_ F77_FUNC_(nga_zset_update4_info,NGA_ZSET_UPDATE4_INFO) #define ga_update4_ghosts_ F77_FUNC_(ga_update4_ghosts, GA_UPDATE4_GHOSTS) #define ga_cupdate4_ghosts_ F77_FUNC_(ga_cupdate4_ghosts,GA_CUPDATE4_GHOSTS) #define ga_dupdate4_ghosts_ F77_FUNC_(ga_dupdate4_ghosts,GA_DUPDATE4_GHOSTS) #define ga_iupdate4_ghosts_ F77_FUNC_(ga_iupdate4_ghosts,GA_IUPDATE4_GHOSTS) #define ga_supdate4_ghosts_ F77_FUNC_(ga_supdate4_ghosts,GA_SUPDATE4_GHOSTS) #define ga_zupdate4_ghosts_ F77_FUNC_(ga_zupdate4_ghosts,GA_ZUPDATE4_GHOSTS) #define nga_update4_ghosts_ F77_FUNC_(nga_update4_ghosts, NGA_UPDATE4_GHOSTS) #define nga_cupdate4_ghosts_ F77_FUNC_(nga_cupdate4_ghosts,NGA_CUPDATE4_GHOSTS) #define nga_dupdate4_ghosts_ F77_FUNC_(nga_dupdate4_ghosts,NGA_DUPDATE4_GHOSTS) #define nga_iupdate4_ghosts_ F77_FUNC_(nga_iupdate4_ghosts,NGA_IUPDATE4_GHOSTS) #define nga_supdate4_ghosts_ F77_FUNC_(nga_supdate4_ghosts,NGA_SUPDATE4_GHOSTS) #define nga_zupdate4_ghosts_ F77_FUNC_(nga_zupdate4_ghosts,NGA_ZUPDATE4_GHOSTS) #define ga_update44_ghosts_ F77_FUNC_(ga_update44_ghosts, GA_UPDATE44_GHOSTS) #define ga_cupdate44_ghosts_ F77_FUNC_(ga_cupdate44_ghosts,GA_CUPDATE44_GHOSTS) #define ga_dupdate44_ghosts_ F77_FUNC_(ga_dupdate44_ghosts,GA_DUPDATE44_GHOSTS) #define ga_iupdate44_ghosts_ F77_FUNC_(ga_iupdate44_ghosts,GA_IUPDATE44_GHOSTS) #define ga_supdate44_ghosts_ F77_FUNC_(ga_supdate44_ghosts,GA_SUPDATE44_GHOSTS) #define ga_zupdate44_ghosts_ F77_FUNC_(ga_zupdate44_ghosts,GA_ZUPDATE44_GHOSTS) #define nga_update44_ghosts_ F77_FUNC_(nga_update44_ghosts, NGA_UPDATE44_GHOSTS) #define nga_cupdate44_ghosts_ F77_FUNC_(nga_cupdate44_ghosts,NGA_CUPDATE44_GHOSTS) #define nga_dupdate44_ghosts_ F77_FUNC_(nga_dupdate44_ghosts,NGA_DUPDATE44_GHOSTS) #define nga_iupdate44_ghosts_ F77_FUNC_(nga_iupdate44_ghosts,NGA_IUPDATE44_GHOSTS) #define nga_supdate44_ghosts_ F77_FUNC_(nga_supdate44_ghosts,NGA_SUPDATE44_GHOSTS) #define nga_zupdate44_ghosts_ F77_FUNC_(nga_zupdate44_ghosts,NGA_ZUPDATE44_GHOSTS) #define ga_update55_ghosts_ F77_FUNC_(ga_update55_ghosts, GA_UPDATE55_GHOSTS) #define ga_cupdate55_ghosts_ F77_FUNC_(ga_cupdate55_ghosts,GA_CUPDATE55_GHOSTS) #define ga_dupdate55_ghosts_ F77_FUNC_(ga_dupdate55_ghosts,GA_DUPDATE55_GHOSTS) #define ga_iupdate55_ghosts_ F77_FUNC_(ga_iupdate55_ghosts,GA_IUPDATE55_GHOSTS) #define ga_supdate55_ghosts_ F77_FUNC_(ga_supdate55_ghosts,GA_SUPDATE55_GHOSTS) #define ga_zupdate55_ghosts_ F77_FUNC_(ga_zupdate55_ghosts,GA_ZUPDATE55_GHOSTS) #define nga_update55_ghosts_ F77_FUNC_(nga_update55_ghosts, NGA_UPDATE55_GHOSTS) #define nga_cupdate55_ghosts_ F77_FUNC_(nga_cupdate55_ghosts,NGA_CUPDATE55_GHOSTS) #define nga_dupdate55_ghosts_ F77_FUNC_(nga_dupdate55_ghosts,NGA_DUPDATE55_GHOSTS) #define nga_iupdate55_ghosts_ F77_FUNC_(nga_iupdate55_ghosts,NGA_IUPDATE55_GHOSTS) #define nga_supdate55_ghosts_ F77_FUNC_(nga_supdate55_ghosts,NGA_SUPDATE55_GHOSTS) #define nga_zupdate55_ghosts_ F77_FUNC_(nga_zupdate55_ghosts,NGA_ZUPDATE55_GHOSTS) #define ga_update_ghost_dir_ F77_FUNC_(ga_update_ghost_dir, GA_UPDATE_GHOST_DIR) #define ga_cupdate_ghost_dir_ F77_FUNC_(ga_cupdate_ghost_dir,GA_CUPDATE_GHOST_DIR) #define ga_dupdate_ghost_dir_ F77_FUNC_(ga_dupdate_ghost_dir,GA_DUPDATE_GHOST_DIR) #define ga_iupdate_ghost_dir_ F77_FUNC_(ga_iupdate_ghost_dir,GA_IUPDATE_GHOST_DIR) #define ga_supdate_ghost_dir_ F77_FUNC_(ga_supdate_ghost_dir,GA_SUPDATE_GHOST_DIR) #define ga_zupdate_ghost_dir_ F77_FUNC_(ga_zupdate_ghost_dir,GA_ZUPDATE_GHOST_DIR) #define nga_update_ghost_dir_ F77_FUNC_(nga_update_ghost_dir, NGA_UPDATE_GHOST_DIR) #define nga_cupdate_ghost_dir_ F77_FUNC_(nga_cupdate_ghost_dir,NGA_CUPDATE_GHOST_DIR) #define nga_dupdate_ghost_dir_ F77_FUNC_(nga_dupdate_ghost_dir,NGA_DUPDATE_GHOST_DIR) #define nga_iupdate_ghost_dir_ F77_FUNC_(nga_iupdate_ghost_dir,NGA_IUPDATE_GHOST_DIR) #define nga_supdate_ghost_dir_ F77_FUNC_(nga_supdate_ghost_dir,NGA_SUPDATE_GHOST_DIR) #define nga_zupdate_ghost_dir_ F77_FUNC_(nga_zupdate_ghost_dir,NGA_ZUPDATE_GHOST_DIR) #define ga_update5_ghosts_ F77_FUNC_(ga_update5_ghosts, GA_UPDATE5_GHOSTS) #define ga_cupdate5_ghosts_ F77_FUNC_(ga_cupdate5_ghosts,GA_CUPDATE5_GHOSTS) #define ga_dupdate5_ghosts_ F77_FUNC_(ga_dupdate5_ghosts,GA_DUPDATE5_GHOSTS) #define ga_iupdate5_ghosts_ F77_FUNC_(ga_iupdate5_ghosts,GA_IUPDATE5_GHOSTS) #define ga_supdate5_ghosts_ F77_FUNC_(ga_supdate5_ghosts,GA_SUPDATE5_GHOSTS) #define ga_zupdate5_ghosts_ F77_FUNC_(ga_zupdate5_ghosts,GA_ZUPDATE5_GHOSTS) #define nga_update5_ghosts_ F77_FUNC_(nga_update5_ghosts, NGA_UPDATE5_GHOSTS) #define nga_cupdate5_ghosts_ F77_FUNC_(nga_cupdate5_ghosts,NGA_CUPDATE5_GHOSTS) #define nga_dupdate5_ghosts_ F77_FUNC_(nga_dupdate5_ghosts,NGA_DUPDATE5_GHOSTS) #define nga_iupdate5_ghosts_ F77_FUNC_(nga_iupdate5_ghosts,NGA_IUPDATE5_GHOSTS) #define nga_supdate5_ghosts_ F77_FUNC_(nga_supdate5_ghosts,NGA_SUPDATE5_GHOSTS) #define nga_zupdate5_ghosts_ F77_FUNC_(nga_zupdate5_ghosts,NGA_ZUPDATE5_GHOSTS) #define ga_set_update5_info_ F77_FUNC_(ga_set_update5_info, GA_SET_UPDATE5_INFO) #define ga_cset_update5_info_ F77_FUNC_(ga_cset_update5_info,GA_CSET_UPDATE5_INFO) #define ga_dset_update5_info_ F77_FUNC_(ga_dset_update5_info,GA_DSET_UPDATE5_INFO) #define ga_iset_update5_info_ F77_FUNC_(ga_iset_update5_info,GA_ISET_UPDATE5_INFO) #define ga_sset_update5_info_ F77_FUNC_(ga_sset_update5_info,GA_SSET_UPDATE5_INFO) #define ga_zset_update5_info_ F77_FUNC_(ga_zset_update5_info,GA_ZSET_UPDATE5_INFO) #define nga_set_update5_info_ F77_FUNC_(nga_set_update5_info, NGA_SET_UPDATE5_INFO) #define nga_cset_update5_info_ F77_FUNC_(nga_cset_update5_info,NGA_CSET_UPDATE5_INFO) #define nga_dset_update5_info_ F77_FUNC_(nga_dset_update5_info,NGA_DSET_UPDATE5_INFO) #define nga_iset_update5_info_ F77_FUNC_(nga_iset_update5_info,NGA_ISET_UPDATE5_INFO) #define nga_sset_update5_info_ F77_FUNC_(nga_sset_update5_info,NGA_SSET_UPDATE5_INFO) #define nga_zset_update5_info_ F77_FUNC_(nga_zset_update5_info,NGA_ZSET_UPDATE5_INFO) #define ga_update_ghosts_ F77_FUNC_(ga_update_ghosts, GA_UPDATE_GHOSTS) #define ga_cupdate_ghosts_ F77_FUNC_(ga_cupdate_ghosts,GA_CUPDATE_GHOSTS) #define ga_dupdate_ghosts_ F77_FUNC_(ga_dupdate_ghosts,GA_DUPDATE_GHOSTS) #define ga_iupdate_ghosts_ F77_FUNC_(ga_iupdate_ghosts,GA_IUPDATE_GHOSTS) #define ga_supdate_ghosts_ F77_FUNC_(ga_supdate_ghosts,GA_SUPDATE_GHOSTS) #define ga_zupdate_ghosts_ F77_FUNC_(ga_zupdate_ghosts,GA_ZUPDATE_GHOSTS) #define nga_update_ghosts_ F77_FUNC_(nga_update_ghosts, NGA_UPDATE_GHOSTS) #define nga_cupdate_ghosts_ F77_FUNC_(nga_cupdate_ghosts,NGA_CUPDATE_GHOSTS) #define nga_dupdate_ghosts_ F77_FUNC_(nga_dupdate_ghosts,NGA_DUPDATE_GHOSTS) #define nga_iupdate_ghosts_ F77_FUNC_(nga_iupdate_ghosts,NGA_IUPDATE_GHOSTS) #define nga_supdate_ghosts_ F77_FUNC_(nga_supdate_ghosts,NGA_SUPDATE_GHOSTS) #define nga_zupdate_ghosts_ F77_FUNC_(nga_zupdate_ghosts,NGA_ZUPDATE_GHOSTS) #define ga_update6_ghosts_ F77_FUNC_(ga_update6_ghosts, GA_UPDATE6_GHOSTS) #define ga_cupdate6_ghosts_ F77_FUNC_(ga_cupdate6_ghosts,GA_CUPDATE6_GHOSTS) #define ga_dupdate6_ghosts_ F77_FUNC_(ga_dupdate6_ghosts,GA_DUPDATE6_GHOSTS) #define ga_iupdate6_ghosts_ F77_FUNC_(ga_iupdate6_ghosts,GA_IUPDATE6_GHOSTS) #define ga_supdate6_ghosts_ F77_FUNC_(ga_supdate6_ghosts,GA_SUPDATE6_GHOSTS) #define ga_zupdate6_ghosts_ F77_FUNC_(ga_zupdate6_ghosts,GA_ZUPDATE6_GHOSTS) #define nga_update6_ghosts_ F77_FUNC_(nga_update6_ghosts, NGA_UPDATE6_GHOSTS) #define nga_cupdate6_ghosts_ F77_FUNC_(nga_cupdate6_ghosts,NGA_CUPDATE6_GHOSTS) #define nga_dupdate6_ghosts_ F77_FUNC_(nga_dupdate6_ghosts,NGA_DUPDATE6_GHOSTS) #define nga_iupdate6_ghosts_ F77_FUNC_(nga_iupdate6_ghosts,NGA_IUPDATE6_GHOSTS) #define nga_supdate6_ghosts_ F77_FUNC_(nga_supdate6_ghosts,NGA_SUPDATE6_GHOSTS) #define nga_zupdate6_ghosts_ F77_FUNC_(nga_zupdate6_ghosts,NGA_ZUPDATE6_GHOSTS) #define ga_update7_ghosts_ F77_FUNC_(ga_update7_ghosts, GA_UPDATE7_GHOSTS) #define ga_cupdate7_ghosts_ F77_FUNC_(ga_cupdate7_ghosts,GA_CUPDATE7_GHOSTS) #define ga_dupdate7_ghosts_ F77_FUNC_(ga_dupdate7_ghosts,GA_DUPDATE7_GHOSTS) #define ga_iupdate7_ghosts_ F77_FUNC_(ga_iupdate7_ghosts,GA_IUPDATE7_GHOSTS) #define ga_supdate7_ghosts_ F77_FUNC_(ga_supdate7_ghosts,GA_SUPDATE7_GHOSTS) #define ga_zupdate7_ghosts_ F77_FUNC_(ga_zupdate7_ghosts,GA_ZUPDATE7_GHOSTS) #define nga_update7_ghosts_ F77_FUNC_(nga_update7_ghosts, NGA_UPDATE7_GHOSTS) #define nga_cupdate7_ghosts_ F77_FUNC_(nga_cupdate7_ghosts,NGA_CUPDATE7_GHOSTS) #define nga_dupdate7_ghosts_ F77_FUNC_(nga_dupdate7_ghosts,NGA_DUPDATE7_GHOSTS) #define nga_iupdate7_ghosts_ F77_FUNC_(nga_iupdate7_ghosts,NGA_IUPDATE7_GHOSTS) #define nga_supdate7_ghosts_ F77_FUNC_(nga_supdate7_ghosts,NGA_SUPDATE7_GHOSTS) #define nga_zupdate7_ghosts_ F77_FUNC_(nga_zupdate7_ghosts,NGA_ZUPDATE7_GHOSTS) #define ga_ghost_barrier_ F77_FUNC_(ga_ghost_barrier, GA_GHOST_BARRIER) #define ga_cghost_barrier_ F77_FUNC_(ga_cghost_barrier,GA_CGHOST_BARRIER) #define ga_dghost_barrier_ F77_FUNC_(ga_dghost_barrier,GA_DGHOST_BARRIER) #define ga_ighost_barrier_ F77_FUNC_(ga_ighost_barrier,GA_IGHOST_BARRIER) #define ga_sghost_barrier_ F77_FUNC_(ga_sghost_barrier,GA_SGHOST_BARRIER) #define ga_zghost_barrier_ F77_FUNC_(ga_zghost_barrier,GA_ZGHOST_BARRIER) #define nga_ghost_barrier_ F77_FUNC_(nga_ghost_barrier, NGA_GHOST_BARRIER) #define nga_cghost_barrier_ F77_FUNC_(nga_cghost_barrier,NGA_CGHOST_BARRIER) #define nga_dghost_barrier_ F77_FUNC_(nga_dghost_barrier,NGA_DGHOST_BARRIER) #define nga_ighost_barrier_ F77_FUNC_(nga_ighost_barrier,NGA_IGHOST_BARRIER) #define nga_sghost_barrier_ F77_FUNC_(nga_sghost_barrier,NGA_SGHOST_BARRIER) #define nga_zghost_barrier_ F77_FUNC_(nga_zghost_barrier,NGA_ZGHOST_BARRIER) #define ga_nbget_ghost_dir_ F77_FUNC_(ga_nbget_ghost_dir, GA_NBGET_GHOST_DIR) #define ga_cnbget_ghost_dir_ F77_FUNC_(ga_cnbget_ghost_dir,GA_CNBGET_GHOST_DIR) #define ga_dnbget_ghost_dir_ F77_FUNC_(ga_dnbget_ghost_dir,GA_DNBGET_GHOST_DIR) #define ga_inbget_ghost_dir_ F77_FUNC_(ga_inbget_ghost_dir,GA_INBGET_GHOST_DIR) #define ga_snbget_ghost_dir_ F77_FUNC_(ga_snbget_ghost_dir,GA_SNBGET_GHOST_DIR) #define ga_znbget_ghost_dir_ F77_FUNC_(ga_znbget_ghost_dir,GA_ZNBGET_GHOST_DIR) #define nga_nbget_ghost_dir_ F77_FUNC_(nga_nbget_ghost_dir, NGA_NBGET_GHOST_DIR) #define nga_cnbget_ghost_dir_ F77_FUNC_(nga_cnbget_ghost_dir,NGA_CNBGET_GHOST_DIR) #define nga_dnbget_ghost_dir_ F77_FUNC_(nga_dnbget_ghost_dir,NGA_DNBGET_GHOST_DIR) #define nga_inbget_ghost_dir_ F77_FUNC_(nga_inbget_ghost_dir,NGA_INBGET_GHOST_DIR) #define nga_snbget_ghost_dir_ F77_FUNC_(nga_snbget_ghost_dir,NGA_SNBGET_GHOST_DIR) #define nga_znbget_ghost_dir_ F77_FUNC_(nga_znbget_ghost_dir,NGA_ZNBGET_GHOST_DIR) #define ga_set_ghost_info_ F77_FUNC_(ga_set_ghost_info, GA_SET_GHOST_INFO) #define ga_cset_ghost_info_ F77_FUNC_(ga_cset_ghost_info,GA_CSET_GHOST_INFO) #define ga_dset_ghost_info_ F77_FUNC_(ga_dset_ghost_info,GA_DSET_GHOST_INFO) #define ga_iset_ghost_info_ F77_FUNC_(ga_iset_ghost_info,GA_ISET_GHOST_INFO) #define ga_sset_ghost_info_ F77_FUNC_(ga_sset_ghost_info,GA_SSET_GHOST_INFO) #define ga_zset_ghost_info_ F77_FUNC_(ga_zset_ghost_info,GA_ZSET_GHOST_INFO) #define nga_set_ghost_info_ F77_FUNC_(nga_set_ghost_info, NGA_SET_GHOST_INFO) #define nga_cset_ghost_info_ F77_FUNC_(nga_cset_ghost_info,NGA_CSET_GHOST_INFO) #define nga_dset_ghost_info_ F77_FUNC_(nga_dset_ghost_info,NGA_DSET_GHOST_INFO) #define nga_iset_ghost_info_ F77_FUNC_(nga_iset_ghost_info,NGA_ISET_GHOST_INFO) #define nga_sset_ghost_info_ F77_FUNC_(nga_sset_ghost_info,NGA_SSET_GHOST_INFO) #define nga_zset_ghost_info_ F77_FUNC_(nga_zset_ghost_info,NGA_ZSET_GHOST_INFO) #define ga_set_ghost_corner_flag_ F77_FUNC_(ga_set_ghost_corner_flag, GA_SET_GHOST_CORNER_FLAG) #define ga_cset_ghost_corner_flag_ F77_FUNC_(ga_cset_ghost_corner_flag,GA_CSET_GHOST_CORNER_FLAG) #define ga_dset_ghost_corner_flag_ F77_FUNC_(ga_dset_ghost_corner_flag,GA_DSET_GHOST_CORNER_FLAG) #define ga_iset_ghost_corner_flag_ F77_FUNC_(ga_iset_ghost_corner_flag,GA_ISET_GHOST_CORNER_FLAG) #define ga_sset_ghost_corner_flag_ F77_FUNC_(ga_sset_ghost_corner_flag,GA_SSET_GHOST_CORNER_FLAG) #define ga_zset_ghost_corner_flag_ F77_FUNC_(ga_zset_ghost_corner_flag,GA_ZSET_GHOST_CORNER_FLAG) #define nga_set_ghost_corner_flag_ F77_FUNC_(nga_set_ghost_corner_flag, NGA_SET_GHOST_CORNER_FLAG) #define nga_cset_ghost_corner_flag_ F77_FUNC_(nga_cset_ghost_corner_flag,NGA_CSET_GHOST_CORNER_FLAG) #define nga_dset_ghost_corner_flag_ F77_FUNC_(nga_dset_ghost_corner_flag,NGA_DSET_GHOST_CORNER_FLAG) #define nga_iset_ghost_corner_flag_ F77_FUNC_(nga_iset_ghost_corner_flag,NGA_ISET_GHOST_CORNER_FLAG) #define nga_sset_ghost_corner_flag_ F77_FUNC_(nga_sset_ghost_corner_flag,NGA_SSET_GHOST_CORNER_FLAG) #define nga_zset_ghost_corner_flag_ F77_FUNC_(nga_zset_ghost_corner_flag,NGA_ZSET_GHOST_CORNER_FLAG) #define ga_zero_ F77_FUNC_(ga_zero, GA_ZERO) #define ga_czero_ F77_FUNC_(ga_czero,GA_CZERO) #define ga_dzero_ F77_FUNC_(ga_dzero,GA_DZERO) #define ga_izero_ F77_FUNC_(ga_izero,GA_IZERO) #define ga_szero_ F77_FUNC_(ga_szero,GA_SZERO) #define ga_zzero_ F77_FUNC_(ga_zzero,GA_ZZERO) #define nga_zero_ F77_FUNC_(nga_zero, NGA_ZERO) #define nga_czero_ F77_FUNC_(nga_czero,NGA_CZERO) #define nga_dzero_ F77_FUNC_(nga_dzero,NGA_DZERO) #define nga_izero_ F77_FUNC_(nga_izero,NGA_IZERO) #define nga_szero_ F77_FUNC_(nga_szero,NGA_SZERO) #define nga_zzero_ F77_FUNC_(nga_zzero,NGA_ZZERO) #define ga_copy_ F77_FUNC_(ga_copy, GA_COPY) #define ga_ccopy_ F77_FUNC_(ga_ccopy,GA_CCOPY) #define ga_dcopy_ F77_FUNC_(ga_dcopy,GA_DCOPY) #define ga_icopy_ F77_FUNC_(ga_icopy,GA_ICOPY) #define ga_scopy_ F77_FUNC_(ga_scopy,GA_SCOPY) #define ga_zcopy_ F77_FUNC_(ga_zcopy,GA_ZCOPY) #define nga_copy_ F77_FUNC_(nga_copy, NGA_COPY) #define nga_ccopy_ F77_FUNC_(nga_ccopy,NGA_CCOPY) #define nga_dcopy_ F77_FUNC_(nga_dcopy,NGA_DCOPY) #define nga_icopy_ F77_FUNC_(nga_icopy,NGA_ICOPY) #define nga_scopy_ F77_FUNC_(nga_scopy,NGA_SCOPY) #define nga_zcopy_ F77_FUNC_(nga_zcopy,NGA_ZCOPY) #define ga_dot_ F77_FUNC_(ga_dot, GA_DOT) #define ga_cdot_ F77_FUNC_(ga_cdot,GA_CDOT) #define ga_ddot_ F77_FUNC_(ga_ddot,GA_DDOT) #define ga_idot_ F77_FUNC_(ga_idot,GA_IDOT) #define ga_sdot_ F77_FUNC_(ga_sdot,GA_SDOT) #define ga_zdot_ F77_FUNC_(ga_zdot,GA_ZDOT) #define nga_dot_ F77_FUNC_(nga_dot, NGA_DOT) #define nga_cdot_ F77_FUNC_(nga_cdot,NGA_CDOT) #define nga_ddot_ F77_FUNC_(nga_ddot,NGA_DDOT) #define nga_idot_ F77_FUNC_(nga_idot,NGA_IDOT) #define nga_sdot_ F77_FUNC_(nga_sdot,NGA_SDOT) #define nga_zdot_ F77_FUNC_(nga_zdot,NGA_ZDOT) #define ga_scale_ F77_FUNC_(ga_scale, GA_SCALE) #define ga_cscale_ F77_FUNC_(ga_cscale,GA_CSCALE) #define ga_dscale_ F77_FUNC_(ga_dscale,GA_DSCALE) #define ga_iscale_ F77_FUNC_(ga_iscale,GA_ISCALE) #define ga_sscale_ F77_FUNC_(ga_sscale,GA_SSCALE) #define ga_zscale_ F77_FUNC_(ga_zscale,GA_ZSCALE) #define nga_scale_ F77_FUNC_(nga_scale, NGA_SCALE) #define nga_cscale_ F77_FUNC_(nga_cscale,NGA_CSCALE) #define nga_dscale_ F77_FUNC_(nga_dscale,NGA_DSCALE) #define nga_iscale_ F77_FUNC_(nga_iscale,NGA_ISCALE) #define nga_sscale_ F77_FUNC_(nga_sscale,NGA_SSCALE) #define nga_zscale_ F77_FUNC_(nga_zscale,NGA_ZSCALE) #define ga_add_ F77_FUNC_(ga_add, GA_ADD) #define ga_cadd_ F77_FUNC_(ga_cadd,GA_CADD) #define ga_dadd_ F77_FUNC_(ga_dadd,GA_DADD) #define ga_iadd_ F77_FUNC_(ga_iadd,GA_IADD) #define ga_sadd_ F77_FUNC_(ga_sadd,GA_SADD) #define ga_zadd_ F77_FUNC_(ga_zadd,GA_ZADD) #define nga_add_ F77_FUNC_(nga_add, NGA_ADD) #define nga_cadd_ F77_FUNC_(nga_cadd,NGA_CADD) #define nga_dadd_ F77_FUNC_(nga_dadd,NGA_DADD) #define nga_iadd_ F77_FUNC_(nga_iadd,NGA_IADD) #define nga_sadd_ F77_FUNC_(nga_sadd,NGA_SADD) #define nga_zadd_ F77_FUNC_(nga_zadd,NGA_ZADD) #define ga_transpose_ F77_FUNC_(ga_transpose, GA_TRANSPOSE) #define ga_ctranspose_ F77_FUNC_(ga_ctranspose,GA_CTRANSPOSE) #define ga_dtranspose_ F77_FUNC_(ga_dtranspose,GA_DTRANSPOSE) #define ga_itranspose_ F77_FUNC_(ga_itranspose,GA_ITRANSPOSE) #define ga_stranspose_ F77_FUNC_(ga_stranspose,GA_STRANSPOSE) #define ga_ztranspose_ F77_FUNC_(ga_ztranspose,GA_ZTRANSPOSE) #define nga_transpose_ F77_FUNC_(nga_transpose, NGA_TRANSPOSE) #define nga_ctranspose_ F77_FUNC_(nga_ctranspose,NGA_CTRANSPOSE) #define nga_dtranspose_ F77_FUNC_(nga_dtranspose,NGA_DTRANSPOSE) #define nga_itranspose_ F77_FUNC_(nga_itranspose,NGA_ITRANSPOSE) #define nga_stranspose_ F77_FUNC_(nga_stranspose,NGA_STRANSPOSE) #define nga_ztranspose_ F77_FUNC_(nga_ztranspose,NGA_ZTRANSPOSE) #define ga_copy_patch_ F77_FUNC_(ga_copy_patch, GA_COPY_PATCH) #define ga_ccopy_patch_ F77_FUNC_(ga_ccopy_patch,GA_CCOPY_PATCH) #define ga_dcopy_patch_ F77_FUNC_(ga_dcopy_patch,GA_DCOPY_PATCH) #define ga_icopy_patch_ F77_FUNC_(ga_icopy_patch,GA_ICOPY_PATCH) #define ga_scopy_patch_ F77_FUNC_(ga_scopy_patch,GA_SCOPY_PATCH) #define ga_zcopy_patch_ F77_FUNC_(ga_zcopy_patch,GA_ZCOPY_PATCH) #define nga_copy_patch_ F77_FUNC_(nga_copy_patch, NGA_COPY_PATCH) #define nga_ccopy_patch_ F77_FUNC_(nga_ccopy_patch,NGA_CCOPY_PATCH) #define nga_dcopy_patch_ F77_FUNC_(nga_dcopy_patch,NGA_DCOPY_PATCH) #define nga_icopy_patch_ F77_FUNC_(nga_icopy_patch,NGA_ICOPY_PATCH) #define nga_scopy_patch_ F77_FUNC_(nga_scopy_patch,NGA_SCOPY_PATCH) #define nga_zcopy_patch_ F77_FUNC_(nga_zcopy_patch,NGA_ZCOPY_PATCH) #define ga_zero_patch_ F77_FUNC_(ga_zero_patch, GA_ZERO_PATCH) #define ga_czero_patch_ F77_FUNC_(ga_czero_patch,GA_CZERO_PATCH) #define ga_dzero_patch_ F77_FUNC_(ga_dzero_patch,GA_DZERO_PATCH) #define ga_izero_patch_ F77_FUNC_(ga_izero_patch,GA_IZERO_PATCH) #define ga_szero_patch_ F77_FUNC_(ga_szero_patch,GA_SZERO_PATCH) #define ga_zzero_patch_ F77_FUNC_(ga_zzero_patch,GA_ZZERO_PATCH) #define nga_zero_patch_ F77_FUNC_(nga_zero_patch, NGA_ZERO_PATCH) #define nga_czero_patch_ F77_FUNC_(nga_czero_patch,NGA_CZERO_PATCH) #define nga_dzero_patch_ F77_FUNC_(nga_dzero_patch,NGA_DZERO_PATCH) #define nga_izero_patch_ F77_FUNC_(nga_izero_patch,NGA_IZERO_PATCH) #define nga_szero_patch_ F77_FUNC_(nga_szero_patch,NGA_SZERO_PATCH) #define nga_zzero_patch_ F77_FUNC_(nga_zzero_patch,NGA_ZZERO_PATCH) #define ga_patch_intersect_ F77_FUNC_(ga_patch_intersect, GA_PATCH_INTERSECT) #define ga_cpatch_intersect_ F77_FUNC_(ga_cpatch_intersect,GA_CPATCH_INTERSECT) #define ga_dpatch_intersect_ F77_FUNC_(ga_dpatch_intersect,GA_DPATCH_INTERSECT) #define ga_ipatch_intersect_ F77_FUNC_(ga_ipatch_intersect,GA_IPATCH_INTERSECT) #define ga_spatch_intersect_ F77_FUNC_(ga_spatch_intersect,GA_SPATCH_INTERSECT) #define ga_zpatch_intersect_ F77_FUNC_(ga_zpatch_intersect,GA_ZPATCH_INTERSECT) #define nga_patch_intersect_ F77_FUNC_(nga_patch_intersect, NGA_PATCH_INTERSECT) #define nga_cpatch_intersect_ F77_FUNC_(nga_cpatch_intersect,NGA_CPATCH_INTERSECT) #define nga_dpatch_intersect_ F77_FUNC_(nga_dpatch_intersect,NGA_DPATCH_INTERSECT) #define nga_ipatch_intersect_ F77_FUNC_(nga_ipatch_intersect,NGA_IPATCH_INTERSECT) #define nga_spatch_intersect_ F77_FUNC_(nga_spatch_intersect,NGA_SPATCH_INTERSECT) #define nga_zpatch_intersect_ F77_FUNC_(nga_zpatch_intersect,NGA_ZPATCH_INTERSECT) #define ga_comp_patch_ F77_FUNC_(ga_comp_patch, GA_COMP_PATCH) #define ga_ccomp_patch_ F77_FUNC_(ga_ccomp_patch,GA_CCOMP_PATCH) #define ga_dcomp_patch_ F77_FUNC_(ga_dcomp_patch,GA_DCOMP_PATCH) #define ga_icomp_patch_ F77_FUNC_(ga_icomp_patch,GA_ICOMP_PATCH) #define ga_scomp_patch_ F77_FUNC_(ga_scomp_patch,GA_SCOMP_PATCH) #define ga_zcomp_patch_ F77_FUNC_(ga_zcomp_patch,GA_ZCOMP_PATCH) #define nga_comp_patch_ F77_FUNC_(nga_comp_patch, NGA_COMP_PATCH) #define nga_ccomp_patch_ F77_FUNC_(nga_ccomp_patch,NGA_CCOMP_PATCH) #define nga_dcomp_patch_ F77_FUNC_(nga_dcomp_patch,NGA_DCOMP_PATCH) #define nga_icomp_patch_ F77_FUNC_(nga_icomp_patch,NGA_ICOMP_PATCH) #define nga_scomp_patch_ F77_FUNC_(nga_scomp_patch,NGA_SCOMP_PATCH) #define nga_zcomp_patch_ F77_FUNC_(nga_zcomp_patch,NGA_ZCOMP_PATCH) #define ga_dot_patch_ F77_FUNC_(ga_dot_patch, GA_DOT_PATCH) #define ga_cdot_patch_ F77_FUNC_(ga_cdot_patch,GA_CDOT_PATCH) #define ga_ddot_patch_ F77_FUNC_(ga_ddot_patch,GA_DDOT_PATCH) #define ga_idot_patch_ F77_FUNC_(ga_idot_patch,GA_IDOT_PATCH) #define ga_sdot_patch_ F77_FUNC_(ga_sdot_patch,GA_SDOT_PATCH) #define ga_zdot_patch_ F77_FUNC_(ga_zdot_patch,GA_ZDOT_PATCH) #define nga_dot_patch_ F77_FUNC_(nga_dot_patch, NGA_DOT_PATCH) #define nga_cdot_patch_ F77_FUNC_(nga_cdot_patch,NGA_CDOT_PATCH) #define nga_ddot_patch_ F77_FUNC_(nga_ddot_patch,NGA_DDOT_PATCH) #define nga_idot_patch_ F77_FUNC_(nga_idot_patch,NGA_IDOT_PATCH) #define nga_sdot_patch_ F77_FUNC_(nga_sdot_patch,NGA_SDOT_PATCH) #define nga_zdot_patch_ F77_FUNC_(nga_zdot_patch,NGA_ZDOT_PATCH) #define ga_fill_patch_ F77_FUNC_(ga_fill_patch, GA_FILL_PATCH) #define ga_cfill_patch_ F77_FUNC_(ga_cfill_patch,GA_CFILL_PATCH) #define ga_dfill_patch_ F77_FUNC_(ga_dfill_patch,GA_DFILL_PATCH) #define ga_ifill_patch_ F77_FUNC_(ga_ifill_patch,GA_IFILL_PATCH) #define ga_sfill_patch_ F77_FUNC_(ga_sfill_patch,GA_SFILL_PATCH) #define ga_zfill_patch_ F77_FUNC_(ga_zfill_patch,GA_ZFILL_PATCH) #define nga_fill_patch_ F77_FUNC_(nga_fill_patch, NGA_FILL_PATCH) #define nga_cfill_patch_ F77_FUNC_(nga_cfill_patch,NGA_CFILL_PATCH) #define nga_dfill_patch_ F77_FUNC_(nga_dfill_patch,NGA_DFILL_PATCH) #define nga_ifill_patch_ F77_FUNC_(nga_ifill_patch,NGA_IFILL_PATCH) #define nga_sfill_patch_ F77_FUNC_(nga_sfill_patch,NGA_SFILL_PATCH) #define nga_zfill_patch_ F77_FUNC_(nga_zfill_patch,NGA_ZFILL_PATCH) #define ga_scale_patch_ F77_FUNC_(ga_scale_patch, GA_SCALE_PATCH) #define ga_cscale_patch_ F77_FUNC_(ga_cscale_patch,GA_CSCALE_PATCH) #define ga_dscale_patch_ F77_FUNC_(ga_dscale_patch,GA_DSCALE_PATCH) #define ga_iscale_patch_ F77_FUNC_(ga_iscale_patch,GA_ISCALE_PATCH) #define ga_sscale_patch_ F77_FUNC_(ga_sscale_patch,GA_SSCALE_PATCH) #define ga_zscale_patch_ F77_FUNC_(ga_zscale_patch,GA_ZSCALE_PATCH) #define nga_scale_patch_ F77_FUNC_(nga_scale_patch, NGA_SCALE_PATCH) #define nga_cscale_patch_ F77_FUNC_(nga_cscale_patch,NGA_CSCALE_PATCH) #define nga_dscale_patch_ F77_FUNC_(nga_dscale_patch,NGA_DSCALE_PATCH) #define nga_iscale_patch_ F77_FUNC_(nga_iscale_patch,NGA_ISCALE_PATCH) #define nga_sscale_patch_ F77_FUNC_(nga_sscale_patch,NGA_SSCALE_PATCH) #define nga_zscale_patch_ F77_FUNC_(nga_zscale_patch,NGA_ZSCALE_PATCH) #define ga_add_patch_ F77_FUNC_(ga_add_patch, GA_ADD_PATCH) #define ga_cadd_patch_ F77_FUNC_(ga_cadd_patch,GA_CADD_PATCH) #define ga_dadd_patch_ F77_FUNC_(ga_dadd_patch,GA_DADD_PATCH) #define ga_iadd_patch_ F77_FUNC_(ga_iadd_patch,GA_IADD_PATCH) #define ga_sadd_patch_ F77_FUNC_(ga_sadd_patch,GA_SADD_PATCH) #define ga_zadd_patch_ F77_FUNC_(ga_zadd_patch,GA_ZADD_PATCH) #define nga_add_patch_ F77_FUNC_(nga_add_patch, NGA_ADD_PATCH) #define nga_cadd_patch_ F77_FUNC_(nga_cadd_patch,NGA_CADD_PATCH) #define nga_dadd_patch_ F77_FUNC_(nga_dadd_patch,NGA_DADD_PATCH) #define nga_iadd_patch_ F77_FUNC_(nga_iadd_patch,NGA_IADD_PATCH) #define nga_sadd_patch_ F77_FUNC_(nga_sadd_patch,NGA_SADD_PATCH) #define nga_zadd_patch_ F77_FUNC_(nga_zadd_patch,NGA_ZADD_PATCH) #define ga_select_elem_ F77_FUNC_(ga_select_elem, GA_SELECT_ELEM) #define ga_cselect_elem_ F77_FUNC_(ga_cselect_elem,GA_CSELECT_ELEM) #define ga_dselect_elem_ F77_FUNC_(ga_dselect_elem,GA_DSELECT_ELEM) #define ga_iselect_elem_ F77_FUNC_(ga_iselect_elem,GA_ISELECT_ELEM) #define ga_sselect_elem_ F77_FUNC_(ga_sselect_elem,GA_SSELECT_ELEM) #define ga_zselect_elem_ F77_FUNC_(ga_zselect_elem,GA_ZSELECT_ELEM) #define nga_select_elem_ F77_FUNC_(nga_select_elem, NGA_SELECT_ELEM) #define nga_cselect_elem_ F77_FUNC_(nga_cselect_elem,NGA_CSELECT_ELEM) #define nga_dselect_elem_ F77_FUNC_(nga_dselect_elem,NGA_DSELECT_ELEM) #define nga_iselect_elem_ F77_FUNC_(nga_iselect_elem,NGA_ISELECT_ELEM) #define nga_sselect_elem_ F77_FUNC_(nga_sselect_elem,NGA_SSELECT_ELEM) #define nga_zselect_elem_ F77_FUNC_(nga_zselect_elem,NGA_ZSELECT_ELEM) #define ga_memory_avail_type_ F77_FUNC_(ga_memory_avail_type, GA_MEMORY_AVAIL_TYPE) #define ga_cmemory_avail_type_ F77_FUNC_(ga_cmemory_avail_type,GA_CMEMORY_AVAIL_TYPE) #define ga_dmemory_avail_type_ F77_FUNC_(ga_dmemory_avail_type,GA_DMEMORY_AVAIL_TYPE) #define ga_imemory_avail_type_ F77_FUNC_(ga_imemory_avail_type,GA_IMEMORY_AVAIL_TYPE) #define ga_smemory_avail_type_ F77_FUNC_(ga_smemory_avail_type,GA_SMEMORY_AVAIL_TYPE) #define ga_zmemory_avail_type_ F77_FUNC_(ga_zmemory_avail_type,GA_ZMEMORY_AVAIL_TYPE) #define nga_memory_avail_type_ F77_FUNC_(nga_memory_avail_type, NGA_MEMORY_AVAIL_TYPE) #define nga_cmemory_avail_type_ F77_FUNC_(nga_cmemory_avail_type,NGA_CMEMORY_AVAIL_TYPE) #define nga_dmemory_avail_type_ F77_FUNC_(nga_dmemory_avail_type,NGA_DMEMORY_AVAIL_TYPE) #define nga_imemory_avail_type_ F77_FUNC_(nga_imemory_avail_type,NGA_IMEMORY_AVAIL_TYPE) #define nga_smemory_avail_type_ F77_FUNC_(nga_smemory_avail_type,NGA_SMEMORY_AVAIL_TYPE) #define nga_zmemory_avail_type_ F77_FUNC_(nga_zmemory_avail_type,NGA_ZMEMORY_AVAIL_TYPE) #define ga_patch_enum_ F77_FUNC_(ga_patch_enum, GA_PATCH_ENUM) #define ga_cpatch_enum_ F77_FUNC_(ga_cpatch_enum,GA_CPATCH_ENUM) #define ga_dpatch_enum_ F77_FUNC_(ga_dpatch_enum,GA_DPATCH_ENUM) #define ga_ipatch_enum_ F77_FUNC_(ga_ipatch_enum,GA_IPATCH_ENUM) #define ga_spatch_enum_ F77_FUNC_(ga_spatch_enum,GA_SPATCH_ENUM) #define ga_zpatch_enum_ F77_FUNC_(ga_zpatch_enum,GA_ZPATCH_ENUM) #define nga_patch_enum_ F77_FUNC_(nga_patch_enum, NGA_PATCH_ENUM) #define nga_cpatch_enum_ F77_FUNC_(nga_cpatch_enum,NGA_CPATCH_ENUM) #define nga_dpatch_enum_ F77_FUNC_(nga_dpatch_enum,NGA_DPATCH_ENUM) #define nga_ipatch_enum_ F77_FUNC_(nga_ipatch_enum,NGA_IPATCH_ENUM) #define nga_spatch_enum_ F77_FUNC_(nga_spatch_enum,NGA_SPATCH_ENUM) #define nga_zpatch_enum_ F77_FUNC_(nga_zpatch_enum,NGA_ZPATCH_ENUM) #define ga_scan_copy_ F77_FUNC_(ga_scan_copy, GA_SCAN_COPY) #define ga_cscan_copy_ F77_FUNC_(ga_cscan_copy,GA_CSCAN_COPY) #define ga_dscan_copy_ F77_FUNC_(ga_dscan_copy,GA_DSCAN_COPY) #define ga_iscan_copy_ F77_FUNC_(ga_iscan_copy,GA_ISCAN_COPY) #define ga_sscan_copy_ F77_FUNC_(ga_sscan_copy,GA_SSCAN_COPY) #define ga_zscan_copy_ F77_FUNC_(ga_zscan_copy,GA_ZSCAN_COPY) #define nga_scan_copy_ F77_FUNC_(nga_scan_copy, NGA_SCAN_COPY) #define nga_cscan_copy_ F77_FUNC_(nga_cscan_copy,NGA_CSCAN_COPY) #define nga_dscan_copy_ F77_FUNC_(nga_dscan_copy,NGA_DSCAN_COPY) #define nga_iscan_copy_ F77_FUNC_(nga_iscan_copy,NGA_ISCAN_COPY) #define nga_sscan_copy_ F77_FUNC_(nga_sscan_copy,NGA_SSCAN_COPY) #define nga_zscan_copy_ F77_FUNC_(nga_zscan_copy,NGA_ZSCAN_COPY) #define ga_scan_add_ F77_FUNC_(ga_scan_add, GA_SCAN_ADD) #define ga_cscan_add_ F77_FUNC_(ga_cscan_add,GA_CSCAN_ADD) #define ga_dscan_add_ F77_FUNC_(ga_dscan_add,GA_DSCAN_ADD) #define ga_iscan_add_ F77_FUNC_(ga_iscan_add,GA_ISCAN_ADD) #define ga_sscan_add_ F77_FUNC_(ga_sscan_add,GA_SSCAN_ADD) #define ga_zscan_add_ F77_FUNC_(ga_zscan_add,GA_ZSCAN_ADD) #define nga_scan_add_ F77_FUNC_(nga_scan_add, NGA_SCAN_ADD) #define nga_cscan_add_ F77_FUNC_(nga_cscan_add,NGA_CSCAN_ADD) #define nga_dscan_add_ F77_FUNC_(nga_dscan_add,NGA_DSCAN_ADD) #define nga_iscan_add_ F77_FUNC_(nga_iscan_add,NGA_ISCAN_ADD) #define nga_sscan_add_ F77_FUNC_(nga_sscan_add,NGA_SSCAN_ADD) #define nga_zscan_add_ F77_FUNC_(nga_zscan_add,NGA_ZSCAN_ADD) #define ga_pack_ F77_FUNC_(ga_pack, GA_PACK) #define ga_cpack_ F77_FUNC_(ga_cpack,GA_CPACK) #define ga_dpack_ F77_FUNC_(ga_dpack,GA_DPACK) #define ga_ipack_ F77_FUNC_(ga_ipack,GA_IPACK) #define ga_spack_ F77_FUNC_(ga_spack,GA_SPACK) #define ga_zpack_ F77_FUNC_(ga_zpack,GA_ZPACK) #define nga_pack_ F77_FUNC_(nga_pack, NGA_PACK) #define nga_cpack_ F77_FUNC_(nga_cpack,NGA_CPACK) #define nga_dpack_ F77_FUNC_(nga_dpack,NGA_DPACK) #define nga_ipack_ F77_FUNC_(nga_ipack,NGA_IPACK) #define nga_spack_ F77_FUNC_(nga_spack,NGA_SPACK) #define nga_zpack_ F77_FUNC_(nga_zpack,NGA_ZPACK) #define ga_unpack_ F77_FUNC_(ga_unpack, GA_UNPACK) #define ga_cunpack_ F77_FUNC_(ga_cunpack,GA_CUNPACK) #define ga_dunpack_ F77_FUNC_(ga_dunpack,GA_DUNPACK) #define ga_iunpack_ F77_FUNC_(ga_iunpack,GA_IUNPACK) #define ga_sunpack_ F77_FUNC_(ga_sunpack,GA_SUNPACK) #define ga_zunpack_ F77_FUNC_(ga_zunpack,GA_ZUNPACK) #define nga_unpack_ F77_FUNC_(nga_unpack, NGA_UNPACK) #define nga_cunpack_ F77_FUNC_(nga_cunpack,NGA_CUNPACK) #define nga_dunpack_ F77_FUNC_(nga_dunpack,NGA_DUNPACK) #define nga_iunpack_ F77_FUNC_(nga_iunpack,NGA_IUNPACK) #define nga_sunpack_ F77_FUNC_(nga_sunpack,NGA_SUNPACK) #define nga_zunpack_ F77_FUNC_(nga_zunpack,NGA_ZUNPACK) #define ga_create_bin_range_ F77_FUNC_(ga_create_bin_range, GA_CREATE_BIN_RANGE) #define ga_ccreate_bin_range_ F77_FUNC_(ga_ccreate_bin_range,GA_CCREATE_BIN_RANGE) #define ga_dcreate_bin_range_ F77_FUNC_(ga_dcreate_bin_range,GA_DCREATE_BIN_RANGE) #define ga_icreate_bin_range_ F77_FUNC_(ga_icreate_bin_range,GA_ICREATE_BIN_RANGE) #define ga_screate_bin_range_ F77_FUNC_(ga_screate_bin_range,GA_SCREATE_BIN_RANGE) #define ga_zcreate_bin_range_ F77_FUNC_(ga_zcreate_bin_range,GA_ZCREATE_BIN_RANGE) #define nga_create_bin_range_ F77_FUNC_(nga_create_bin_range, NGA_CREATE_BIN_RANGE) #define nga_ccreate_bin_range_ F77_FUNC_(nga_ccreate_bin_range,NGA_CCREATE_BIN_RANGE) #define nga_dcreate_bin_range_ F77_FUNC_(nga_dcreate_bin_range,NGA_DCREATE_BIN_RANGE) #define nga_icreate_bin_range_ F77_FUNC_(nga_icreate_bin_range,NGA_ICREATE_BIN_RANGE) #define nga_screate_bin_range_ F77_FUNC_(nga_screate_bin_range,NGA_SCREATE_BIN_RANGE) #define nga_zcreate_bin_range_ F77_FUNC_(nga_zcreate_bin_range,NGA_ZCREATE_BIN_RANGE) #define ga_bin_sorter_ F77_FUNC_(ga_bin_sorter, GA_BIN_SORTER) #define ga_cbin_sorter_ F77_FUNC_(ga_cbin_sorter,GA_CBIN_SORTER) #define ga_dbin_sorter_ F77_FUNC_(ga_dbin_sorter,GA_DBIN_SORTER) #define ga_ibin_sorter_ F77_FUNC_(ga_ibin_sorter,GA_IBIN_SORTER) #define ga_sbin_sorter_ F77_FUNC_(ga_sbin_sorter,GA_SBIN_SORTER) #define ga_zbin_sorter_ F77_FUNC_(ga_zbin_sorter,GA_ZBIN_SORTER) #define nga_bin_sorter_ F77_FUNC_(nga_bin_sorter, NGA_BIN_SORTER) #define nga_cbin_sorter_ F77_FUNC_(nga_cbin_sorter,NGA_CBIN_SORTER) #define nga_dbin_sorter_ F77_FUNC_(nga_dbin_sorter,NGA_DBIN_SORTER) #define nga_ibin_sorter_ F77_FUNC_(nga_ibin_sorter,NGA_IBIN_SORTER) #define nga_sbin_sorter_ F77_FUNC_(nga_sbin_sorter,NGA_SBIN_SORTER) #define nga_zbin_sorter_ F77_FUNC_(nga_zbin_sorter,NGA_ZBIN_SORTER) #define ga_bin_index_ F77_FUNC_(ga_bin_index, GA_BIN_INDEX) #define ga_cbin_index_ F77_FUNC_(ga_cbin_index,GA_CBIN_INDEX) #define ga_dbin_index_ F77_FUNC_(ga_dbin_index,GA_DBIN_INDEX) #define ga_ibin_index_ F77_FUNC_(ga_ibin_index,GA_IBIN_INDEX) #define ga_sbin_index_ F77_FUNC_(ga_sbin_index,GA_SBIN_INDEX) #define ga_zbin_index_ F77_FUNC_(ga_zbin_index,GA_ZBIN_INDEX) #define nga_bin_index_ F77_FUNC_(nga_bin_index, NGA_BIN_INDEX) #define nga_cbin_index_ F77_FUNC_(nga_cbin_index,NGA_CBIN_INDEX) #define nga_dbin_index_ F77_FUNC_(nga_dbin_index,NGA_DBIN_INDEX) #define nga_ibin_index_ F77_FUNC_(nga_ibin_index,NGA_IBIN_INDEX) #define nga_sbin_index_ F77_FUNC_(nga_sbin_index,NGA_SBIN_INDEX) #define nga_zbin_index_ F77_FUNC_(nga_zbin_index,NGA_ZBIN_INDEX) #define ga_median_patch_ F77_FUNC_(ga_median_patch, GA_MEDIAN_PATCH) #define ga_cmedian_patch_ F77_FUNC_(ga_cmedian_patch,GA_CMEDIAN_PATCH) #define ga_dmedian_patch_ F77_FUNC_(ga_dmedian_patch,GA_DMEDIAN_PATCH) #define ga_imedian_patch_ F77_FUNC_(ga_imedian_patch,GA_IMEDIAN_PATCH) #define ga_smedian_patch_ F77_FUNC_(ga_smedian_patch,GA_SMEDIAN_PATCH) #define ga_zmedian_patch_ F77_FUNC_(ga_zmedian_patch,GA_ZMEDIAN_PATCH) #define nga_median_patch_ F77_FUNC_(nga_median_patch, NGA_MEDIAN_PATCH) #define nga_cmedian_patch_ F77_FUNC_(nga_cmedian_patch,NGA_CMEDIAN_PATCH) #define nga_dmedian_patch_ F77_FUNC_(nga_dmedian_patch,NGA_DMEDIAN_PATCH) #define nga_imedian_patch_ F77_FUNC_(nga_imedian_patch,NGA_IMEDIAN_PATCH) #define nga_smedian_patch_ F77_FUNC_(nga_smedian_patch,NGA_SMEDIAN_PATCH) #define nga_zmedian_patch_ F77_FUNC_(nga_zmedian_patch,NGA_ZMEDIAN_PATCH) #define ga_median_ F77_FUNC_(ga_median, GA_MEDIAN) #define ga_cmedian_ F77_FUNC_(ga_cmedian,GA_CMEDIAN) #define ga_dmedian_ F77_FUNC_(ga_dmedian,GA_DMEDIAN) #define ga_imedian_ F77_FUNC_(ga_imedian,GA_IMEDIAN) #define ga_smedian_ F77_FUNC_(ga_smedian,GA_SMEDIAN) #define ga_zmedian_ F77_FUNC_(ga_zmedian,GA_ZMEDIAN) #define nga_median_ F77_FUNC_(nga_median, NGA_MEDIAN) #define nga_cmedian_ F77_FUNC_(nga_cmedian,NGA_CMEDIAN) #define nga_dmedian_ F77_FUNC_(nga_dmedian,NGA_DMEDIAN) #define nga_imedian_ F77_FUNC_(nga_imedian,NGA_IMEDIAN) #define nga_smedian_ F77_FUNC_(nga_smedian,NGA_SMEDIAN) #define nga_zmedian_ F77_FUNC_(nga_zmedian,NGA_ZMEDIAN) #define ga_norm_infinity_ F77_FUNC_(ga_norm_infinity, GA_NORM_INFINITY) #define ga_cnorm_infinity_ F77_FUNC_(ga_cnorm_infinity,GA_CNORM_INFINITY) #define ga_dnorm_infinity_ F77_FUNC_(ga_dnorm_infinity,GA_DNORM_INFINITY) #define ga_inorm_infinity_ F77_FUNC_(ga_inorm_infinity,GA_INORM_INFINITY) #define ga_snorm_infinity_ F77_FUNC_(ga_snorm_infinity,GA_SNORM_INFINITY) #define ga_znorm_infinity_ F77_FUNC_(ga_znorm_infinity,GA_ZNORM_INFINITY) #define nga_norm_infinity_ F77_FUNC_(nga_norm_infinity, NGA_NORM_INFINITY) #define nga_cnorm_infinity_ F77_FUNC_(nga_cnorm_infinity,NGA_CNORM_INFINITY) #define nga_dnorm_infinity_ F77_FUNC_(nga_dnorm_infinity,NGA_DNORM_INFINITY) #define nga_inorm_infinity_ F77_FUNC_(nga_inorm_infinity,NGA_INORM_INFINITY) #define nga_snorm_infinity_ F77_FUNC_(nga_snorm_infinity,NGA_SNORM_INFINITY) #define nga_znorm_infinity_ F77_FUNC_(nga_znorm_infinity,NGA_ZNORM_INFINITY) #define ga_norm1_ F77_FUNC_(ga_norm1, GA_NORM1) #define ga_cnorm1_ F77_FUNC_(ga_cnorm1,GA_CNORM1) #define ga_dnorm1_ F77_FUNC_(ga_dnorm1,GA_DNORM1) #define ga_inorm1_ F77_FUNC_(ga_inorm1,GA_INORM1) #define ga_snorm1_ F77_FUNC_(ga_snorm1,GA_SNORM1) #define ga_znorm1_ F77_FUNC_(ga_znorm1,GA_ZNORM1) #define nga_norm1_ F77_FUNC_(nga_norm1, NGA_NORM1) #define nga_cnorm1_ F77_FUNC_(nga_cnorm1,NGA_CNORM1) #define nga_dnorm1_ F77_FUNC_(nga_dnorm1,NGA_DNORM1) #define nga_inorm1_ F77_FUNC_(nga_inorm1,NGA_INORM1) #define nga_snorm1_ F77_FUNC_(nga_snorm1,NGA_SNORM1) #define nga_znorm1_ F77_FUNC_(nga_znorm1,NGA_ZNORM1) #define ga_get_diag_ F77_FUNC_(ga_get_diag, GA_GET_DIAG) #define ga_cget_diag_ F77_FUNC_(ga_cget_diag,GA_CGET_DIAG) #define ga_dget_diag_ F77_FUNC_(ga_dget_diag,GA_DGET_DIAG) #define ga_iget_diag_ F77_FUNC_(ga_iget_diag,GA_IGET_DIAG) #define ga_sget_diag_ F77_FUNC_(ga_sget_diag,GA_SGET_DIAG) #define ga_zget_diag_ F77_FUNC_(ga_zget_diag,GA_ZGET_DIAG) #define nga_get_diag_ F77_FUNC_(nga_get_diag, NGA_GET_DIAG) #define nga_cget_diag_ F77_FUNC_(nga_cget_diag,NGA_CGET_DIAG) #define nga_dget_diag_ F77_FUNC_(nga_dget_diag,NGA_DGET_DIAG) #define nga_iget_diag_ F77_FUNC_(nga_iget_diag,NGA_IGET_DIAG) #define nga_sget_diag_ F77_FUNC_(nga_sget_diag,NGA_SGET_DIAG) #define nga_zget_diag_ F77_FUNC_(nga_zget_diag,NGA_ZGET_DIAG) #define ga_add_diagonal_ F77_FUNC_(ga_add_diagonal, GA_ADD_DIAGONAL) #define ga_cadd_diagonal_ F77_FUNC_(ga_cadd_diagonal,GA_CADD_DIAGONAL) #define ga_dadd_diagonal_ F77_FUNC_(ga_dadd_diagonal,GA_DADD_DIAGONAL) #define ga_iadd_diagonal_ F77_FUNC_(ga_iadd_diagonal,GA_IADD_DIAGONAL) #define ga_sadd_diagonal_ F77_FUNC_(ga_sadd_diagonal,GA_SADD_DIAGONAL) #define ga_zadd_diagonal_ F77_FUNC_(ga_zadd_diagonal,GA_ZADD_DIAGONAL) #define nga_add_diagonal_ F77_FUNC_(nga_add_diagonal, NGA_ADD_DIAGONAL) #define nga_cadd_diagonal_ F77_FUNC_(nga_cadd_diagonal,NGA_CADD_DIAGONAL) #define nga_dadd_diagonal_ F77_FUNC_(nga_dadd_diagonal,NGA_DADD_DIAGONAL) #define nga_iadd_diagonal_ F77_FUNC_(nga_iadd_diagonal,NGA_IADD_DIAGONAL) #define nga_sadd_diagonal_ F77_FUNC_(nga_sadd_diagonal,NGA_SADD_DIAGONAL) #define nga_zadd_diagonal_ F77_FUNC_(nga_zadd_diagonal,NGA_ZADD_DIAGONAL) #define ga_set_diagonal_ F77_FUNC_(ga_set_diagonal, GA_SET_DIAGONAL) #define ga_cset_diagonal_ F77_FUNC_(ga_cset_diagonal,GA_CSET_DIAGONAL) #define ga_dset_diagonal_ F77_FUNC_(ga_dset_diagonal,GA_DSET_DIAGONAL) #define ga_iset_diagonal_ F77_FUNC_(ga_iset_diagonal,GA_ISET_DIAGONAL) #define ga_sset_diagonal_ F77_FUNC_(ga_sset_diagonal,GA_SSET_DIAGONAL) #define ga_zset_diagonal_ F77_FUNC_(ga_zset_diagonal,GA_ZSET_DIAGONAL) #define nga_set_diagonal_ F77_FUNC_(nga_set_diagonal, NGA_SET_DIAGONAL) #define nga_cset_diagonal_ F77_FUNC_(nga_cset_diagonal,NGA_CSET_DIAGONAL) #define nga_dset_diagonal_ F77_FUNC_(nga_dset_diagonal,NGA_DSET_DIAGONAL) #define nga_iset_diagonal_ F77_FUNC_(nga_iset_diagonal,NGA_ISET_DIAGONAL) #define nga_sset_diagonal_ F77_FUNC_(nga_sset_diagonal,NGA_SSET_DIAGONAL) #define nga_zset_diagonal_ F77_FUNC_(nga_zset_diagonal,NGA_ZSET_DIAGONAL) #define ga_shift_diagonal_ F77_FUNC_(ga_shift_diagonal, GA_SHIFT_DIAGONAL) #define ga_cshift_diagonal_ F77_FUNC_(ga_cshift_diagonal,GA_CSHIFT_DIAGONAL) #define ga_dshift_diagonal_ F77_FUNC_(ga_dshift_diagonal,GA_DSHIFT_DIAGONAL) #define ga_ishift_diagonal_ F77_FUNC_(ga_ishift_diagonal,GA_ISHIFT_DIAGONAL) #define ga_sshift_diagonal_ F77_FUNC_(ga_sshift_diagonal,GA_SSHIFT_DIAGONAL) #define ga_zshift_diagonal_ F77_FUNC_(ga_zshift_diagonal,GA_ZSHIFT_DIAGONAL) #define nga_shift_diagonal_ F77_FUNC_(nga_shift_diagonal, NGA_SHIFT_DIAGONAL) #define nga_cshift_diagonal_ F77_FUNC_(nga_cshift_diagonal,NGA_CSHIFT_DIAGONAL) #define nga_dshift_diagonal_ F77_FUNC_(nga_dshift_diagonal,NGA_DSHIFT_DIAGONAL) #define nga_ishift_diagonal_ F77_FUNC_(nga_ishift_diagonal,NGA_ISHIFT_DIAGONAL) #define nga_sshift_diagonal_ F77_FUNC_(nga_sshift_diagonal,NGA_SSHIFT_DIAGONAL) #define nga_zshift_diagonal_ F77_FUNC_(nga_zshift_diagonal,NGA_ZSHIFT_DIAGONAL) #define ga_zero_diagonal_ F77_FUNC_(ga_zero_diagonal, GA_ZERO_DIAGONAL) #define ga_czero_diagonal_ F77_FUNC_(ga_czero_diagonal,GA_CZERO_DIAGONAL) #define ga_dzero_diagonal_ F77_FUNC_(ga_dzero_diagonal,GA_DZERO_DIAGONAL) #define ga_izero_diagonal_ F77_FUNC_(ga_izero_diagonal,GA_IZERO_DIAGONAL) #define ga_szero_diagonal_ F77_FUNC_(ga_szero_diagonal,GA_SZERO_DIAGONAL) #define ga_zzero_diagonal_ F77_FUNC_(ga_zzero_diagonal,GA_ZZERO_DIAGONAL) #define nga_zero_diagonal_ F77_FUNC_(nga_zero_diagonal, NGA_ZERO_DIAGONAL) #define nga_czero_diagonal_ F77_FUNC_(nga_czero_diagonal,NGA_CZERO_DIAGONAL) #define nga_dzero_diagonal_ F77_FUNC_(nga_dzero_diagonal,NGA_DZERO_DIAGONAL) #define nga_izero_diagonal_ F77_FUNC_(nga_izero_diagonal,NGA_IZERO_DIAGONAL) #define nga_szero_diagonal_ F77_FUNC_(nga_szero_diagonal,NGA_SZERO_DIAGONAL) #define nga_zzero_diagonal_ F77_FUNC_(nga_zzero_diagonal,NGA_ZZERO_DIAGONAL) #define ga_scale_rows_ F77_FUNC_(ga_scale_rows, GA_SCALE_ROWS) #define ga_cscale_rows_ F77_FUNC_(ga_cscale_rows,GA_CSCALE_ROWS) #define ga_dscale_rows_ F77_FUNC_(ga_dscale_rows,GA_DSCALE_ROWS) #define ga_iscale_rows_ F77_FUNC_(ga_iscale_rows,GA_ISCALE_ROWS) #define ga_sscale_rows_ F77_FUNC_(ga_sscale_rows,GA_SSCALE_ROWS) #define ga_zscale_rows_ F77_FUNC_(ga_zscale_rows,GA_ZSCALE_ROWS) #define nga_scale_rows_ F77_FUNC_(nga_scale_rows, NGA_SCALE_ROWS) #define nga_cscale_rows_ F77_FUNC_(nga_cscale_rows,NGA_CSCALE_ROWS) #define nga_dscale_rows_ F77_FUNC_(nga_dscale_rows,NGA_DSCALE_ROWS) #define nga_iscale_rows_ F77_FUNC_(nga_iscale_rows,NGA_ISCALE_ROWS) #define nga_sscale_rows_ F77_FUNC_(nga_sscale_rows,NGA_SSCALE_ROWS) #define nga_zscale_rows_ F77_FUNC_(nga_zscale_rows,NGA_ZSCALE_ROWS) #define ga_scale_cols_ F77_FUNC_(ga_scale_cols, GA_SCALE_COLS) #define ga_cscale_cols_ F77_FUNC_(ga_cscale_cols,GA_CSCALE_COLS) #define ga_dscale_cols_ F77_FUNC_(ga_dscale_cols,GA_DSCALE_COLS) #define ga_iscale_cols_ F77_FUNC_(ga_iscale_cols,GA_ISCALE_COLS) #define ga_sscale_cols_ F77_FUNC_(ga_sscale_cols,GA_SSCALE_COLS) #define ga_zscale_cols_ F77_FUNC_(ga_zscale_cols,GA_ZSCALE_COLS) #define nga_scale_cols_ F77_FUNC_(nga_scale_cols, NGA_SCALE_COLS) #define nga_cscale_cols_ F77_FUNC_(nga_cscale_cols,NGA_CSCALE_COLS) #define nga_dscale_cols_ F77_FUNC_(nga_dscale_cols,NGA_DSCALE_COLS) #define nga_iscale_cols_ F77_FUNC_(nga_iscale_cols,NGA_ISCALE_COLS) #define nga_sscale_cols_ F77_FUNC_(nga_sscale_cols,NGA_SSCALE_COLS) #define nga_zscale_cols_ F77_FUNC_(nga_zscale_cols,NGA_ZSCALE_COLS) #define ga_symmetrize_ F77_FUNC_(ga_symmetrize, GA_SYMMETRIZE) #define ga_csymmetrize_ F77_FUNC_(ga_csymmetrize,GA_CSYMMETRIZE) #define ga_dsymmetrize_ F77_FUNC_(ga_dsymmetrize,GA_DSYMMETRIZE) #define ga_isymmetrize_ F77_FUNC_(ga_isymmetrize,GA_ISYMMETRIZE) #define ga_ssymmetrize_ F77_FUNC_(ga_ssymmetrize,GA_SSYMMETRIZE) #define ga_zsymmetrize_ F77_FUNC_(ga_zsymmetrize,GA_ZSYMMETRIZE) #define nga_symmetrize_ F77_FUNC_(nga_symmetrize, NGA_SYMMETRIZE) #define nga_csymmetrize_ F77_FUNC_(nga_csymmetrize,NGA_CSYMMETRIZE) #define nga_dsymmetrize_ F77_FUNC_(nga_dsymmetrize,NGA_DSYMMETRIZE) #define nga_isymmetrize_ F77_FUNC_(nga_isymmetrize,NGA_ISYMMETRIZE) #define nga_ssymmetrize_ F77_FUNC_(nga_ssymmetrize,NGA_SSYMMETRIZE) #define nga_zsymmetrize_ F77_FUNC_(nga_zsymmetrize,NGA_ZSYMMETRIZE) #define ga_periodic_ F77_FUNC_(ga_periodic, GA_PERIODIC) #define ga_cperiodic_ F77_FUNC_(ga_cperiodic,GA_CPERIODIC) #define ga_dperiodic_ F77_FUNC_(ga_dperiodic,GA_DPERIODIC) #define ga_iperiodic_ F77_FUNC_(ga_iperiodic,GA_IPERIODIC) #define ga_speriodic_ F77_FUNC_(ga_speriodic,GA_SPERIODIC) #define ga_zperiodic_ F77_FUNC_(ga_zperiodic,GA_ZPERIODIC) #define nga_periodic_ F77_FUNC_(nga_periodic, NGA_PERIODIC) #define nga_cperiodic_ F77_FUNC_(nga_cperiodic,NGA_CPERIODIC) #define nga_dperiodic_ F77_FUNC_(nga_dperiodic,NGA_DPERIODIC) #define nga_iperiodic_ F77_FUNC_(nga_iperiodic,NGA_IPERIODIC) #define nga_speriodic_ F77_FUNC_(nga_speriodic,NGA_SPERIODIC) #define nga_zperiodic_ F77_FUNC_(nga_zperiodic,NGA_ZPERIODIC) #define ga_matmul_ F77_FUNC_(ga_matmul, GA_MATMUL) #define ga_cmatmul_ F77_FUNC_(ga_cmatmul,GA_CMATMUL) #define ga_dmatmul_ F77_FUNC_(ga_dmatmul,GA_DMATMUL) #define ga_imatmul_ F77_FUNC_(ga_imatmul,GA_IMATMUL) #define ga_smatmul_ F77_FUNC_(ga_smatmul,GA_SMATMUL) #define ga_zmatmul_ F77_FUNC_(ga_zmatmul,GA_ZMATMUL) #define nga_matmul_ F77_FUNC_(nga_matmul, NGA_MATMUL) #define nga_cmatmul_ F77_FUNC_(nga_cmatmul,NGA_CMATMUL) #define nga_dmatmul_ F77_FUNC_(nga_dmatmul,NGA_DMATMUL) #define nga_imatmul_ F77_FUNC_(nga_imatmul,NGA_IMATMUL) #define nga_smatmul_ F77_FUNC_(nga_smatmul,NGA_SMATMUL) #define nga_zmatmul_ F77_FUNC_(nga_zmatmul,NGA_ZMATMUL) #define ga_matmul_mirrored_ F77_FUNC_(ga_matmul_mirrored, GA_MATMUL_MIRRORED) #define ga_cmatmul_mirrored_ F77_FUNC_(ga_cmatmul_mirrored,GA_CMATMUL_MIRRORED) #define ga_dmatmul_mirrored_ F77_FUNC_(ga_dmatmul_mirrored,GA_DMATMUL_MIRRORED) #define ga_imatmul_mirrored_ F77_FUNC_(ga_imatmul_mirrored,GA_IMATMUL_MIRRORED) #define ga_smatmul_mirrored_ F77_FUNC_(ga_smatmul_mirrored,GA_SMATMUL_MIRRORED) #define ga_zmatmul_mirrored_ F77_FUNC_(ga_zmatmul_mirrored,GA_ZMATMUL_MIRRORED) #define nga_matmul_mirrored_ F77_FUNC_(nga_matmul_mirrored, NGA_MATMUL_MIRRORED) #define nga_cmatmul_mirrored_ F77_FUNC_(nga_cmatmul_mirrored,NGA_CMATMUL_MIRRORED) #define nga_dmatmul_mirrored_ F77_FUNC_(nga_dmatmul_mirrored,NGA_DMATMUL_MIRRORED) #define nga_imatmul_mirrored_ F77_FUNC_(nga_imatmul_mirrored,NGA_IMATMUL_MIRRORED) #define nga_smatmul_mirrored_ F77_FUNC_(nga_smatmul_mirrored,NGA_SMATMUL_MIRRORED) #define nga_zmatmul_mirrored_ F77_FUNC_(nga_zmatmul_mirrored,NGA_ZMATMUL_MIRRORED) #define ga_matmul_patch_ F77_FUNC_(ga_matmul_patch, GA_MATMUL_PATCH) #define ga_cmatmul_patch_ F77_FUNC_(ga_cmatmul_patch,GA_CMATMUL_PATCH) #define ga_dmatmul_patch_ F77_FUNC_(ga_dmatmul_patch,GA_DMATMUL_PATCH) #define ga_imatmul_patch_ F77_FUNC_(ga_imatmul_patch,GA_IMATMUL_PATCH) #define ga_smatmul_patch_ F77_FUNC_(ga_smatmul_patch,GA_SMATMUL_PATCH) #define ga_zmatmul_patch_ F77_FUNC_(ga_zmatmul_patch,GA_ZMATMUL_PATCH) #define nga_matmul_patch_ F77_FUNC_(nga_matmul_patch, NGA_MATMUL_PATCH) #define nga_cmatmul_patch_ F77_FUNC_(nga_cmatmul_patch,NGA_CMATMUL_PATCH) #define nga_dmatmul_patch_ F77_FUNC_(nga_dmatmul_patch,NGA_DMATMUL_PATCH) #define nga_imatmul_patch_ F77_FUNC_(nga_imatmul_patch,NGA_IMATMUL_PATCH) #define nga_smatmul_patch_ F77_FUNC_(nga_smatmul_patch,NGA_SMATMUL_PATCH) #define nga_zmatmul_patch_ F77_FUNC_(nga_zmatmul_patch,NGA_ZMATMUL_PATCH) #define ga_diag_seq_ F77_FUNC_(ga_diag_seq, GA_DIAG_SEQ) #define ga_cdiag_seq_ F77_FUNC_(ga_cdiag_seq,GA_CDIAG_SEQ) #define ga_ddiag_seq_ F77_FUNC_(ga_ddiag_seq,GA_DDIAG_SEQ) #define ga_idiag_seq_ F77_FUNC_(ga_idiag_seq,GA_IDIAG_SEQ) #define ga_sdiag_seq_ F77_FUNC_(ga_sdiag_seq,GA_SDIAG_SEQ) #define ga_zdiag_seq_ F77_FUNC_(ga_zdiag_seq,GA_ZDIAG_SEQ) #define nga_diag_seq_ F77_FUNC_(nga_diag_seq, NGA_DIAG_SEQ) #define nga_cdiag_seq_ F77_FUNC_(nga_cdiag_seq,NGA_CDIAG_SEQ) #define nga_ddiag_seq_ F77_FUNC_(nga_ddiag_seq,NGA_DDIAG_SEQ) #define nga_idiag_seq_ F77_FUNC_(nga_idiag_seq,NGA_IDIAG_SEQ) #define nga_sdiag_seq_ F77_FUNC_(nga_sdiag_seq,NGA_SDIAG_SEQ) #define nga_zdiag_seq_ F77_FUNC_(nga_zdiag_seq,NGA_ZDIAG_SEQ) #define ga_diag_std_seq_ F77_FUNC_(ga_diag_std_seq, GA_DIAG_STD_SEQ) #define ga_cdiag_std_seq_ F77_FUNC_(ga_cdiag_std_seq,GA_CDIAG_STD_SEQ) #define ga_ddiag_std_seq_ F77_FUNC_(ga_ddiag_std_seq,GA_DDIAG_STD_SEQ) #define ga_idiag_std_seq_ F77_FUNC_(ga_idiag_std_seq,GA_IDIAG_STD_SEQ) #define ga_sdiag_std_seq_ F77_FUNC_(ga_sdiag_std_seq,GA_SDIAG_STD_SEQ) #define ga_zdiag_std_seq_ F77_FUNC_(ga_zdiag_std_seq,GA_ZDIAG_STD_SEQ) #define nga_diag_std_seq_ F77_FUNC_(nga_diag_std_seq, NGA_DIAG_STD_SEQ) #define nga_cdiag_std_seq_ F77_FUNC_(nga_cdiag_std_seq,NGA_CDIAG_STD_SEQ) #define nga_ddiag_std_seq_ F77_FUNC_(nga_ddiag_std_seq,NGA_DDIAG_STD_SEQ) #define nga_idiag_std_seq_ F77_FUNC_(nga_idiag_std_seq,NGA_IDIAG_STD_SEQ) #define nga_sdiag_std_seq_ F77_FUNC_(nga_sdiag_std_seq,NGA_SDIAG_STD_SEQ) #define nga_zdiag_std_seq_ F77_FUNC_(nga_zdiag_std_seq,NGA_ZDIAG_STD_SEQ) #define ga_diag_ F77_FUNC_(ga_diag, GA_DIAG) #define ga_cdiag_ F77_FUNC_(ga_cdiag,GA_CDIAG) #define ga_ddiag_ F77_FUNC_(ga_ddiag,GA_DDIAG) #define ga_idiag_ F77_FUNC_(ga_idiag,GA_IDIAG) #define ga_sdiag_ F77_FUNC_(ga_sdiag,GA_SDIAG) #define ga_zdiag_ F77_FUNC_(ga_zdiag,GA_ZDIAG) #define nga_diag_ F77_FUNC_(nga_diag, NGA_DIAG) #define nga_cdiag_ F77_FUNC_(nga_cdiag,NGA_CDIAG) #define nga_ddiag_ F77_FUNC_(nga_ddiag,NGA_DDIAG) #define nga_idiag_ F77_FUNC_(nga_idiag,NGA_IDIAG) #define nga_sdiag_ F77_FUNC_(nga_sdiag,NGA_SDIAG) #define nga_zdiag_ F77_FUNC_(nga_zdiag,NGA_ZDIAG) #define ga_diag_std_ F77_FUNC_(ga_diag_std, GA_DIAG_STD) #define ga_cdiag_std_ F77_FUNC_(ga_cdiag_std,GA_CDIAG_STD) #define ga_ddiag_std_ F77_FUNC_(ga_ddiag_std,GA_DDIAG_STD) #define ga_idiag_std_ F77_FUNC_(ga_idiag_std,GA_IDIAG_STD) #define ga_sdiag_std_ F77_FUNC_(ga_sdiag_std,GA_SDIAG_STD) #define ga_zdiag_std_ F77_FUNC_(ga_zdiag_std,GA_ZDIAG_STD) #define nga_diag_std_ F77_FUNC_(nga_diag_std, NGA_DIAG_STD) #define nga_cdiag_std_ F77_FUNC_(nga_cdiag_std,NGA_CDIAG_STD) #define nga_ddiag_std_ F77_FUNC_(nga_ddiag_std,NGA_DDIAG_STD) #define nga_idiag_std_ F77_FUNC_(nga_idiag_std,NGA_IDIAG_STD) #define nga_sdiag_std_ F77_FUNC_(nga_sdiag_std,NGA_SDIAG_STD) #define nga_zdiag_std_ F77_FUNC_(nga_zdiag_std,NGA_ZDIAG_STD) #define ga_diag_reuse_ F77_FUNC_(ga_diag_reuse, GA_DIAG_REUSE) #define ga_cdiag_reuse_ F77_FUNC_(ga_cdiag_reuse,GA_CDIAG_REUSE) #define ga_ddiag_reuse_ F77_FUNC_(ga_ddiag_reuse,GA_DDIAG_REUSE) #define ga_idiag_reuse_ F77_FUNC_(ga_idiag_reuse,GA_IDIAG_REUSE) #define ga_sdiag_reuse_ F77_FUNC_(ga_sdiag_reuse,GA_SDIAG_REUSE) #define ga_zdiag_reuse_ F77_FUNC_(ga_zdiag_reuse,GA_ZDIAG_REUSE) #define nga_diag_reuse_ F77_FUNC_(nga_diag_reuse, NGA_DIAG_REUSE) #define nga_cdiag_reuse_ F77_FUNC_(nga_cdiag_reuse,NGA_CDIAG_REUSE) #define nga_ddiag_reuse_ F77_FUNC_(nga_ddiag_reuse,NGA_DDIAG_REUSE) #define nga_idiag_reuse_ F77_FUNC_(nga_idiag_reuse,NGA_IDIAG_REUSE) #define nga_sdiag_reuse_ F77_FUNC_(nga_sdiag_reuse,NGA_SDIAG_REUSE) #define nga_zdiag_reuse_ F77_FUNC_(nga_zdiag_reuse,NGA_ZDIAG_REUSE) #define ga_lu_solve_alt_ F77_FUNC_(ga_lu_solve_alt, GA_LU_SOLVE_ALT) #define ga_clu_solve_alt_ F77_FUNC_(ga_clu_solve_alt,GA_CLU_SOLVE_ALT) #define ga_dlu_solve_alt_ F77_FUNC_(ga_dlu_solve_alt,GA_DLU_SOLVE_ALT) #define ga_ilu_solve_alt_ F77_FUNC_(ga_ilu_solve_alt,GA_ILU_SOLVE_ALT) #define ga_slu_solve_alt_ F77_FUNC_(ga_slu_solve_alt,GA_SLU_SOLVE_ALT) #define ga_zlu_solve_alt_ F77_FUNC_(ga_zlu_solve_alt,GA_ZLU_SOLVE_ALT) #define nga_lu_solve_alt_ F77_FUNC_(nga_lu_solve_alt, NGA_LU_SOLVE_ALT) #define nga_clu_solve_alt_ F77_FUNC_(nga_clu_solve_alt,NGA_CLU_SOLVE_ALT) #define nga_dlu_solve_alt_ F77_FUNC_(nga_dlu_solve_alt,NGA_DLU_SOLVE_ALT) #define nga_ilu_solve_alt_ F77_FUNC_(nga_ilu_solve_alt,NGA_ILU_SOLVE_ALT) #define nga_slu_solve_alt_ F77_FUNC_(nga_slu_solve_alt,NGA_SLU_SOLVE_ALT) #define nga_zlu_solve_alt_ F77_FUNC_(nga_zlu_solve_alt,NGA_ZLU_SOLVE_ALT) #define ga_lu_solve_ F77_FUNC_(ga_lu_solve, GA_LU_SOLVE) #define ga_clu_solve_ F77_FUNC_(ga_clu_solve,GA_CLU_SOLVE) #define ga_dlu_solve_ F77_FUNC_(ga_dlu_solve,GA_DLU_SOLVE) #define ga_ilu_solve_ F77_FUNC_(ga_ilu_solve,GA_ILU_SOLVE) #define ga_slu_solve_ F77_FUNC_(ga_slu_solve,GA_SLU_SOLVE) #define ga_zlu_solve_ F77_FUNC_(ga_zlu_solve,GA_ZLU_SOLVE) #define nga_lu_solve_ F77_FUNC_(nga_lu_solve, NGA_LU_SOLVE) #define nga_clu_solve_ F77_FUNC_(nga_clu_solve,NGA_CLU_SOLVE) #define nga_dlu_solve_ F77_FUNC_(nga_dlu_solve,NGA_DLU_SOLVE) #define nga_ilu_solve_ F77_FUNC_(nga_ilu_solve,NGA_ILU_SOLVE) #define nga_slu_solve_ F77_FUNC_(nga_slu_solve,NGA_SLU_SOLVE) #define nga_zlu_solve_ F77_FUNC_(nga_zlu_solve,NGA_ZLU_SOLVE) #define ga_llt_solve_ F77_FUNC_(ga_llt_solve, GA_LLT_SOLVE) #define ga_cllt_solve_ F77_FUNC_(ga_cllt_solve,GA_CLLT_SOLVE) #define ga_dllt_solve_ F77_FUNC_(ga_dllt_solve,GA_DLLT_SOLVE) #define ga_illt_solve_ F77_FUNC_(ga_illt_solve,GA_ILLT_SOLVE) #define ga_sllt_solve_ F77_FUNC_(ga_sllt_solve,GA_SLLT_SOLVE) #define ga_zllt_solve_ F77_FUNC_(ga_zllt_solve,GA_ZLLT_SOLVE) #define nga_llt_solve_ F77_FUNC_(nga_llt_solve, NGA_LLT_SOLVE) #define nga_cllt_solve_ F77_FUNC_(nga_cllt_solve,NGA_CLLT_SOLVE) #define nga_dllt_solve_ F77_FUNC_(nga_dllt_solve,NGA_DLLT_SOLVE) #define nga_illt_solve_ F77_FUNC_(nga_illt_solve,NGA_ILLT_SOLVE) #define nga_sllt_solve_ F77_FUNC_(nga_sllt_solve,NGA_SLLT_SOLVE) #define nga_zllt_solve_ F77_FUNC_(nga_zllt_solve,NGA_ZLLT_SOLVE) #define ga_solve_ F77_FUNC_(ga_solve, GA_SOLVE) #define ga_csolve_ F77_FUNC_(ga_csolve,GA_CSOLVE) #define ga_dsolve_ F77_FUNC_(ga_dsolve,GA_DSOLVE) #define ga_isolve_ F77_FUNC_(ga_isolve,GA_ISOLVE) #define ga_ssolve_ F77_FUNC_(ga_ssolve,GA_SSOLVE) #define ga_zsolve_ F77_FUNC_(ga_zsolve,GA_ZSOLVE) #define nga_solve_ F77_FUNC_(nga_solve, NGA_SOLVE) #define nga_csolve_ F77_FUNC_(nga_csolve,NGA_CSOLVE) #define nga_dsolve_ F77_FUNC_(nga_dsolve,NGA_DSOLVE) #define nga_isolve_ F77_FUNC_(nga_isolve,NGA_ISOLVE) #define nga_ssolve_ F77_FUNC_(nga_ssolve,NGA_SSOLVE) #define nga_zsolve_ F77_FUNC_(nga_zsolve,NGA_ZSOLVE) #define ga_spd_invert_ F77_FUNC_(ga_spd_invert, GA_SPD_INVERT) #define ga_cspd_invert_ F77_FUNC_(ga_cspd_invert,GA_CSPD_INVERT) #define ga_dspd_invert_ F77_FUNC_(ga_dspd_invert,GA_DSPD_INVERT) #define ga_ispd_invert_ F77_FUNC_(ga_ispd_invert,GA_ISPD_INVERT) #define ga_sspd_invert_ F77_FUNC_(ga_sspd_invert,GA_SSPD_INVERT) #define ga_zspd_invert_ F77_FUNC_(ga_zspd_invert,GA_ZSPD_INVERT) #define nga_spd_invert_ F77_FUNC_(nga_spd_invert, NGA_SPD_INVERT) #define nga_cspd_invert_ F77_FUNC_(nga_cspd_invert,NGA_CSPD_INVERT) #define nga_dspd_invert_ F77_FUNC_(nga_dspd_invert,NGA_DSPD_INVERT) #define nga_ispd_invert_ F77_FUNC_(nga_ispd_invert,NGA_ISPD_INVERT) #define nga_sspd_invert_ F77_FUNC_(nga_sspd_invert,NGA_SSPD_INVERT) #define nga_zspd_invert_ F77_FUNC_(nga_zspd_invert,NGA_ZSPD_INVERT) #define ga_copy_patch_dp_ F77_FUNC_(ga_copy_patch_dp, GA_COPY_PATCH_DP) #define ga_ccopy_patch_dp_ F77_FUNC_(ga_ccopy_patch_dp,GA_CCOPY_PATCH_DP) #define ga_dcopy_patch_dp_ F77_FUNC_(ga_dcopy_patch_dp,GA_DCOPY_PATCH_DP) #define ga_icopy_patch_dp_ F77_FUNC_(ga_icopy_patch_dp,GA_ICOPY_PATCH_DP) #define ga_scopy_patch_dp_ F77_FUNC_(ga_scopy_patch_dp,GA_SCOPY_PATCH_DP) #define ga_zcopy_patch_dp_ F77_FUNC_(ga_zcopy_patch_dp,GA_ZCOPY_PATCH_DP) #define nga_copy_patch_dp_ F77_FUNC_(nga_copy_patch_dp, NGA_COPY_PATCH_DP) #define nga_ccopy_patch_dp_ F77_FUNC_(nga_ccopy_patch_dp,NGA_CCOPY_PATCH_DP) #define nga_dcopy_patch_dp_ F77_FUNC_(nga_dcopy_patch_dp,NGA_DCOPY_PATCH_DP) #define nga_icopy_patch_dp_ F77_FUNC_(nga_icopy_patch_dp,NGA_ICOPY_PATCH_DP) #define nga_scopy_patch_dp_ F77_FUNC_(nga_scopy_patch_dp,NGA_SCOPY_PATCH_DP) #define nga_zcopy_patch_dp_ F77_FUNC_(nga_zcopy_patch_dp,NGA_ZCOPY_PATCH_DP) #define ga_ddot_patch_dp_ F77_FUNC_(ga_ddot_patch_dp, GA_DDOT_PATCH_DP) #define ga_cddot_patch_dp_ F77_FUNC_(ga_cddot_patch_dp,GA_CDDOT_PATCH_DP) #define ga_dddot_patch_dp_ F77_FUNC_(ga_dddot_patch_dp,GA_DDDOT_PATCH_DP) #define ga_iddot_patch_dp_ F77_FUNC_(ga_iddot_patch_dp,GA_IDDOT_PATCH_DP) #define ga_sddot_patch_dp_ F77_FUNC_(ga_sddot_patch_dp,GA_SDDOT_PATCH_DP) #define ga_zddot_patch_dp_ F77_FUNC_(ga_zddot_patch_dp,GA_ZDDOT_PATCH_DP) #define nga_ddot_patch_dp_ F77_FUNC_(nga_ddot_patch_dp, NGA_DDOT_PATCH_DP) #define nga_cddot_patch_dp_ F77_FUNC_(nga_cddot_patch_dp,NGA_CDDOT_PATCH_DP) #define nga_dddot_patch_dp_ F77_FUNC_(nga_dddot_patch_dp,NGA_DDDOT_PATCH_DP) #define nga_iddot_patch_dp_ F77_FUNC_(nga_iddot_patch_dp,NGA_IDDOT_PATCH_DP) #define nga_sddot_patch_dp_ F77_FUNC_(nga_sddot_patch_dp,NGA_SDDOT_PATCH_DP) #define nga_zddot_patch_dp_ F77_FUNC_(nga_zddot_patch_dp,NGA_ZDDOT_PATCH_DP) #define ga_timer_ F77_FUNC_(ga_timer, GA_TIMER) #define ga_ctimer_ F77_FUNC_(ga_ctimer,GA_CTIMER) #define ga_dtimer_ F77_FUNC_(ga_dtimer,GA_DTIMER) #define ga_itimer_ F77_FUNC_(ga_itimer,GA_ITIMER) #define ga_stimer_ F77_FUNC_(ga_stimer,GA_STIMER) #define ga_ztimer_ F77_FUNC_(ga_ztimer,GA_ZTIMER) #define nga_timer_ F77_FUNC_(nga_timer, NGA_TIMER) #define nga_ctimer_ F77_FUNC_(nga_ctimer,NGA_CTIMER) #define nga_dtimer_ F77_FUNC_(nga_dtimer,NGA_DTIMER) #define nga_itimer_ F77_FUNC_(nga_itimer,NGA_ITIMER) #define nga_stimer_ F77_FUNC_(nga_stimer,NGA_STIMER) #define nga_ztimer_ F77_FUNC_(nga_ztimer,NGA_ZTIMER) #define ga_register_type_ F77_FUNC_(ga_register_type, GA_REGISTER_TYPE) #define ga_cregister_type_ F77_FUNC_(ga_cregister_type,GA_CREGISTER_TYPE) #define ga_dregister_type_ F77_FUNC_(ga_dregister_type,GA_DREGISTER_TYPE) #define ga_iregister_type_ F77_FUNC_(ga_iregister_type,GA_IREGISTER_TYPE) #define ga_sregister_type_ F77_FUNC_(ga_sregister_type,GA_SREGISTER_TYPE) #define ga_zregister_type_ F77_FUNC_(ga_zregister_type,GA_ZREGISTER_TYPE) #define nga_register_type_ F77_FUNC_(nga_register_type, NGA_REGISTER_TYPE) #define nga_cregister_type_ F77_FUNC_(nga_cregister_type,NGA_CREGISTER_TYPE) #define nga_dregister_type_ F77_FUNC_(nga_dregister_type,NGA_DREGISTER_TYPE) #define nga_iregister_type_ F77_FUNC_(nga_iregister_type,NGA_IREGISTER_TYPE) #define nga_sregister_type_ F77_FUNC_(nga_sregister_type,NGA_SREGISTER_TYPE) #define nga_zregister_type_ F77_FUNC_(nga_zregister_type,NGA_ZREGISTER_TYPE) #define ga_deregister_type_ F77_FUNC_(ga_deregister_type, GA_DEREGISTER_TYPE) #define ga_cderegister_type_ F77_FUNC_(ga_cderegister_type,GA_CDEREGISTER_TYPE) #define ga_dderegister_type_ F77_FUNC_(ga_dderegister_type,GA_DDEREGISTER_TYPE) #define ga_ideregister_type_ F77_FUNC_(ga_ideregister_type,GA_IDEREGISTER_TYPE) #define ga_sderegister_type_ F77_FUNC_(ga_sderegister_type,GA_SDEREGISTER_TYPE) #define ga_zderegister_type_ F77_FUNC_(ga_zderegister_type,GA_ZDEREGISTER_TYPE) #define nga_deregister_type_ F77_FUNC_(nga_deregister_type, NGA_DEREGISTER_TYPE) #define nga_cderegister_type_ F77_FUNC_(nga_cderegister_type,NGA_CDEREGISTER_TYPE) #define nga_dderegister_type_ F77_FUNC_(nga_dderegister_type,NGA_DDEREGISTER_TYPE) #define nga_ideregister_type_ F77_FUNC_(nga_ideregister_type,NGA_IDEREGISTER_TYPE) #define nga_sderegister_type_ F77_FUNC_(nga_sderegister_type,NGA_SDEREGISTER_TYPE) #define nga_zderegister_type_ F77_FUNC_(nga_zderegister_type,NGA_ZDEREGISTER_TYPE) #define ga_get_field_ F77_FUNC_(ga_get_field, GA_GET_FIELD) #define ga_cget_field_ F77_FUNC_(ga_cget_field,GA_CGET_FIELD) #define ga_dget_field_ F77_FUNC_(ga_dget_field,GA_DGET_FIELD) #define ga_iget_field_ F77_FUNC_(ga_iget_field,GA_IGET_FIELD) #define ga_sget_field_ F77_FUNC_(ga_sget_field,GA_SGET_FIELD) #define ga_zget_field_ F77_FUNC_(ga_zget_field,GA_ZGET_FIELD) #define nga_get_field_ F77_FUNC_(nga_get_field, NGA_GET_FIELD) #define nga_cget_field_ F77_FUNC_(nga_cget_field,NGA_CGET_FIELD) #define nga_dget_field_ F77_FUNC_(nga_dget_field,NGA_DGET_FIELD) #define nga_iget_field_ F77_FUNC_(nga_iget_field,NGA_IGET_FIELD) #define nga_sget_field_ F77_FUNC_(nga_sget_field,NGA_SGET_FIELD) #define nga_zget_field_ F77_FUNC_(nga_zget_field,NGA_ZGET_FIELD) #define ga_nbget_field_ F77_FUNC_(ga_nbget_field, GA_NBGET_FIELD) #define ga_cnbget_field_ F77_FUNC_(ga_cnbget_field,GA_CNBGET_FIELD) #define ga_dnbget_field_ F77_FUNC_(ga_dnbget_field,GA_DNBGET_FIELD) #define ga_inbget_field_ F77_FUNC_(ga_inbget_field,GA_INBGET_FIELD) #define ga_snbget_field_ F77_FUNC_(ga_snbget_field,GA_SNBGET_FIELD) #define ga_znbget_field_ F77_FUNC_(ga_znbget_field,GA_ZNBGET_FIELD) #define nga_nbget_field_ F77_FUNC_(nga_nbget_field, NGA_NBGET_FIELD) #define nga_cnbget_field_ F77_FUNC_(nga_cnbget_field,NGA_CNBGET_FIELD) #define nga_dnbget_field_ F77_FUNC_(nga_dnbget_field,NGA_DNBGET_FIELD) #define nga_inbget_field_ F77_FUNC_(nga_inbget_field,NGA_INBGET_FIELD) #define nga_snbget_field_ F77_FUNC_(nga_snbget_field,NGA_SNBGET_FIELD) #define nga_znbget_field_ F77_FUNC_(nga_znbget_field,NGA_ZNBGET_FIELD) #define ga_nbput_field_ F77_FUNC_(ga_nbput_field, GA_NBPUT_FIELD) #define ga_cnbput_field_ F77_FUNC_(ga_cnbput_field,GA_CNBPUT_FIELD) #define ga_dnbput_field_ F77_FUNC_(ga_dnbput_field,GA_DNBPUT_FIELD) #define ga_inbput_field_ F77_FUNC_(ga_inbput_field,GA_INBPUT_FIELD) #define ga_snbput_field_ F77_FUNC_(ga_snbput_field,GA_SNBPUT_FIELD) #define ga_znbput_field_ F77_FUNC_(ga_znbput_field,GA_ZNBPUT_FIELD) #define nga_nbput_field_ F77_FUNC_(nga_nbput_field, NGA_NBPUT_FIELD) #define nga_cnbput_field_ F77_FUNC_(nga_cnbput_field,NGA_CNBPUT_FIELD) #define nga_dnbput_field_ F77_FUNC_(nga_dnbput_field,NGA_DNBPUT_FIELD) #define nga_inbput_field_ F77_FUNC_(nga_inbput_field,NGA_INBPUT_FIELD) #define nga_snbput_field_ F77_FUNC_(nga_snbput_field,NGA_SNBPUT_FIELD) #define nga_znbput_field_ F77_FUNC_(nga_znbput_field,NGA_ZNBPUT_FIELD) #define ga_put_field_ F77_FUNC_(ga_put_field, GA_PUT_FIELD) #define ga_cput_field_ F77_FUNC_(ga_cput_field,GA_CPUT_FIELD) #define ga_dput_field_ F77_FUNC_(ga_dput_field,GA_DPUT_FIELD) #define ga_iput_field_ F77_FUNC_(ga_iput_field,GA_IPUT_FIELD) #define ga_sput_field_ F77_FUNC_(ga_sput_field,GA_SPUT_FIELD) #define ga_zput_field_ F77_FUNC_(ga_zput_field,GA_ZPUT_FIELD) #define nga_put_field_ F77_FUNC_(nga_put_field, NGA_PUT_FIELD) #define nga_cput_field_ F77_FUNC_(nga_cput_field,NGA_CPUT_FIELD) #define nga_dput_field_ F77_FUNC_(nga_dput_field,NGA_DPUT_FIELD) #define nga_iput_field_ F77_FUNC_(nga_iput_field,NGA_IPUT_FIELD) #define nga_sput_field_ F77_FUNC_(nga_sput_field,NGA_SPUT_FIELD) #define nga_zput_field_ F77_FUNC_(nga_zput_field,NGA_ZPUT_FIELD) /* the missing functions are either complex type or strangely named */ #define gai_cdot_patch_ F77_FUNC_(gai_cdot_patch,GAI_CDOT_PATCH) #define gai_zdot_patch_ F77_FUNC_(gai_zdot_patch,GAI_ZDOT_PATCH) #define ngai_cdot_patch_ F77_FUNC_(ngai_cdot_patch,NGAI_CDOT_PATCH) #define ngai_zdot_patch_ F77_FUNC_(ngai_zdot_patch,NGAI_ZDOT_PATCH) #define ga_cscal_patch_ F77_FUNC_(ga_cscal_patch,GA_CSCAL_PATCH) #define ga_dscal_patch_ F77_FUNC_(ga_dscal_patch,GA_DSCAL_PATCH) #define ga_iscal_patch_ F77_FUNC_(ga_iscal_patch,GA_ISCAL_PATCH) #define ga_sscal_patch_ F77_FUNC_(ga_sscal_patch,GA_SSCAL_PATCH) #define ga_zscal_patch_ F77_FUNC_(ga_zscal_patch,GA_ZSCAL_PATCH) #define ga_cscal_ F77_FUNC_(ga_cscal,GA_CSCAL) #define ga_dscal_ F77_FUNC_(ga_dscal,GA_DSCAL) #define ga_iscal_ F77_FUNC_(ga_iscal,GA_ISCAL) #define ga_sscal_ F77_FUNC_(ga_sscal,GA_SSCAL) #define ga_zscal_ F77_FUNC_(ga_zscal,GA_ZSCAL) #define gai_cdot_ F77_FUNC_(gai_cdot,GAI_CDOT) #define gai_zdot_ F77_FUNC_(gai_zdot,GAI_ZDOT) #define ngai_cdot_ F77_FUNC_(ngai_cdot,NGAI_CDOT) #define ngai_zdot_ F77_FUNC_(ngai_zdot,NGAI_ZDOT) #define ga_cgemm_ F77_FUNC_(ga_cgemm,GA_CGEMM) #define ga_dgemm_ F77_FUNC_(ga_dgemm,GA_DGEMM) #define ga_sgemm_ F77_FUNC_(ga_sgemm,GA_SGEMM) #define ga_zgemm_ F77_FUNC_(ga_zgemm,GA_ZGEMM) #define nga_periodic_get_ F77_FUNC_(nga_periodic_get,NGA_PERIODIC_GET) #define nga_periodic_put_ F77_FUNC_(nga_periodic_put,NGA_PERIODIC_PUT) #define nga_periodic_acc_ F77_FUNC_(nga_periodic_acc,NGA_PERIODIC_ACC) #define ga_access_ F77_FUNC_(ga_access,GA_ACCESS) #define nga_access_ F77_FUNC_(nga_access,NGA_ACCESS) #define nga_access_block_ F77_FUNC_(nga_access_block,NGA_ACCESS_BLOCK) #define nga_access_block_grid_ F77_FUNC_(nga_access_block_grid,NGA_ACCESS_BLOCK_GRID) #define nga_access_block_segment_ F77_FUNC_(nga_access_block_segment,NGA_ACCESS_BLOCK_SEGMENT) #define ga_pgroup_cgop_ F77_FUNC_(ga_pgroup_cgop,GA_PGROUP_CGOP) #define ga_pgroup_dgop_ F77_FUNC_(ga_pgroup_dgop,GA_PGROUP_DGOP) #define ga_pgroup_igop_ F77_FUNC_(ga_pgroup_igop,GA_PGROUP_IGOP) #define ga_pgroup_sgop_ F77_FUNC_(ga_pgroup_sgop,GA_PGROUP_SGOP) #define ga_pgroup_zgop_ F77_FUNC_(ga_pgroup_zgop,GA_PGROUP_ZGOP) #define nga_pgroup_cgop_ F77_FUNC_(nga_pgroup_cgop,NGA_PGROUP_CGOP) #define nga_pgroup_dgop_ F77_FUNC_(nga_pgroup_dgop,NGA_PGROUP_DGOP) #define nga_pgroup_igop_ F77_FUNC_(nga_pgroup_igop,NGA_PGROUP_IGOP) #define nga_pgroup_sgop_ F77_FUNC_(nga_pgroup_sgop,NGA_PGROUP_SGOP) #define nga_pgroup_zgop_ F77_FUNC_(nga_pgroup_zgop,NGA_PGROUP_ZGOP) ga-5-4/global/src/matmul.c0000644000175000017500000023306612662210457013541 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: matmul.c,v 1.60.4.1 2006-12-22 13:05:22 manoj Exp $ */ /*=========================================================== * * GA_Dgemm(): Parallel Matrix Multiplication * (i.e. C = alpha*A*B + beta*C) * *===========================================================*/ #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #include "matmul.h" #include "ga-papi.h" #include "ga-wapi.h" #define DEBUG_ 0 /*set 1, to verify the correctness of parallel matrix mult.*/ /* some optimization macros */ #define KCHUNK_OPTIMIZATION 0 /* This Opt performing well only for m=1000;n=1000'k=2000 kinda cases and not for the opposite*/ /* Optimization flags: Initialized everytime in pnga_matmul() */ static short int CYCLIC_DISTR_OPT_FLAG = SET; static short int CONTIG_CHUNKS_OPT_FLAG = SET; static short int DIRECT_ACCESS_OPT_FLAG = SET; Integer gNbhdlA[2], gNbhdlB[2], gNbhdlC[2];/* for A and B matrix */ static int _gai_matmul_patch_flag = 0; void gai_matmul_patch_flag(int flag) { _gai_matmul_patch_flag = flag; } static inline int max3(int ichunk, int jchunk, int kchunk) { if(ichunk>jchunk) return GA_MAX(ichunk,kchunk); else return GA_MAX(jchunk, kchunk); } static inline void init_task_list(task_list_t *thing) { thing->lo[0] = 0; thing->lo[1] = 0; thing->hi[0] = 0; thing->hi[1] = 0; thing->dim[0] = 0; thing->dim[1] = 0; thing->chunkBId = 0; thing->do_put = 0; } static void GET_BLOCK(Integer g_x, task_list_t *chunk, void *buf, char *trans, Integer xilo, Integer xjlo, Integer *dim_next, Integer *nbhdl) { Integer i0, i1, j0, j1; Integer lo[2], hi[2]; if(*trans == 'n' || *trans == 'N') { *dim_next = chunk->dim[0]; i0= xilo+chunk->lo[0]; i1= xilo+chunk->hi[0]; j0= xjlo+chunk->lo[1]; j1= xjlo+chunk->hi[1]; } else { *dim_next = chunk->dim[1]; i0= xjlo+chunk->lo[1]; i1= xjlo+chunk->hi[1]; j0= xilo+chunk->lo[0]; j1= xilo+chunk->hi[0]; } lo[0] = i0; lo[1] = j0; hi[0] = i1; hi[1] = j1; pnga_nbget(g_x, lo, hi, buf, dim_next, nbhdl); } static short int gai_get_task_list(task_list_t *taskListA, task_list_t *taskListB, task_list_t *state, Integer istart, Integer jstart, Integer kstart, Integer iend, Integer jend, Integer kend, Integer Ichunk, Integer Jchunk, Integer Kchunk, int *max_tasks, Integer g_a) { int ii, jj, nloops=0; short int do_put, more_chunks_left=0, recovery=0; Integer ilo, ihi, jlo, jhi, klo, khi, get_new_B; Integer jstart_=jstart, kstart_=kstart; if(state->lo[0] != -1) recovery = 1; nloops = (iend-istart+1)/Ichunk + ( ((iend-istart+1)%Ichunk)?1:0 ); if(nloops>MAX_CHUNKS) pnga_error("Increase MAX_CHUNKS value in matmul.h",0L); if(recovery) jstart_ = state->lo[0]; /* recovering the previous state */ for(ii=jj=0, jlo = jstart_; jlo <= jend; jlo += Jchunk) { jhi = GA_MIN(jend, jlo+Jchunk-1); if(recovery) { do_put = state->do_put; kstart_ = state->lo[1]; } else do_put = SET; /* for 1st shot we can put, instead of accumulate */ for(klo = kstart_; klo <= kend; klo += Kchunk) { khi = GA_MIN(kend, klo+Kchunk-1); get_new_B = TRUE; /* set it back after the first loop */ recovery = 0; jstart_ = jstart; kstart_ = kstart; /* save CURRENT STATE. Saving state before "i" loop helps to avoid tracking get_new_B, which is hassle in ga_matmul_regular() */ if(ii+nloops >= MAX_CHUNKS) { more_chunks_left = 1; state->lo[0] = jlo; state->lo[1] = klo; state->do_put = do_put; break; } for(ilo = istart; ilo <= iend; ilo += Ichunk){ ihi = GA_MIN(iend, ilo+Ichunk-1); taskListA[ii].dim[0] = ihi - ilo + 1; taskListA[ii].dim[1] = khi - klo + 1; taskListA[ii].lo[0] = ilo; taskListA[ii].hi[0] = ihi; taskListA[ii].lo[1] = klo; taskListA[ii].hi[1] = khi; taskListA[ii].do_put = do_put; if(get_new_B) { /* B matrix */ ihi = GA_MIN(iend, ilo+Ichunk-1); taskListB[jj].dim[0] = khi - klo + 1; taskListB[jj].dim[1] = jhi - jlo + 1; taskListB[jj].lo[0] = klo; taskListB[jj].hi[0] = khi; taskListB[jj].lo[1] = jlo; taskListB[jj].hi[1] = jhi; get_new_B = FALSE; /* Until J or K change again */ taskListA[ii].chunkBId = jj; ++jj; } else taskListA[ii].chunkBId = taskListA[ii-1].chunkBId; ++ii; } if (more_chunks_left) break; do_put = UNSET; } if (more_chunks_left) break; } *max_tasks = ii; /* Optimization disabled if chunks exceeds buffer space */ if(more_chunks_left) CYCLIC_DISTR_OPT_FLAG = UNSET; if(CYCLIC_DISTR_OPT_FLAG) { /* should not be called for irregular matmul */ int prow, pcol, offset, grp_me; Integer a_grp = pnga_get_pgroup(g_a); grp_me = (int)pnga_pgroup_nodeid(a_grp); prow = GA[GA_OFFSET + g_a].nblock[0]; pcol = GA[GA_OFFSET + g_a].nblock[1]; offset = (grp_me/prow + grp_me%prow) % pcol; for(jj=0, ilo = istart; ilo <= iend; jj++, ilo += Ichunk) taskListA[jj].do_put = UNSET; for(jj=0, ilo = istart; ilo <= iend; jj++, ilo += Ichunk) taskListA[jj+offset].do_put = SET; } return more_chunks_left; } static void gai_get_chunk_size(int irregular,Integer *Ichunk,Integer *Jchunk, Integer *Kchunk,Integer *elems,Integer atype, Integer m,Integer n,Integer k, short int nbuf, short int use_armci_memory, Integer a_grp) { double temp; Integer min_tasks = MINTASKS; /* Increase tasks if there is load imbalance. This controls the granularity of chunks */ Integer max_chunk, nproc=pnga_nnodes(), tmpa, tmpb; Integer avail = pnga_memory_avail_type(atype); tmpa = *Ichunk; tmpb = *Jchunk; if(irregular) { temp = (k*(double)(m*(double)n)) / (min_tasks * nproc); max_chunk = (Integer)pow(temp, (1.0/3.0) ); if (max_chunk < MIN_CHUNK_SIZE) max_chunk = MIN_CHUNK_SIZE; } else max_chunk = (Integer) max3(*Ichunk, *Jchunk, *Kchunk); pnga_pgroup_gop(a_grp, pnga_type_f2c(MT_F_INT), &avail, (Integer)1, "min"); if ( max_chunk > CHUNK_SIZE/nbuf) { /*if memory if very limited, performance degrades for large matrices as chunk size is very small, which leads to communication overhead)*/ if(avail max_chunk) { *Kchunk = GA_MIN(*Kchunk,(Integer)(temp/(*Ichunk))); *Jchunk = GA_MIN(*Jchunk,(Integer)(temp/(*Kchunk))); } else if(*Kchunk < max_chunk && *Ichunk > max_chunk) { temp *= 1.0/(*Kchunk); *Ichunk = GA_MIN(*Ichunk,(Integer)temp); *Jchunk = GA_MIN(*Jchunk,(Integer)temp); } else *Ichunk = *Jchunk = *Kchunk = max_chunk; } } else *Ichunk = *Jchunk = *Kchunk = CHUNK_SIZE/nbuf; /* Try to use 1-d data transfer & take advantage of zero-copy protocol */ if(CONTIG_CHUNKS_OPT_FLAG) { /* select a contiguous piece */ if(!irregular) { if(*Ichunk > tmpa && *Jchunk > tmpb) { *Ichunk = tmpa; *Jchunk = tmpb; *Kchunk = GA_MIN(*Ichunk,*Jchunk); } else { int i=1;/* i should be >=1 , to avoid divide by zero error */ temp = max_chunk*max_chunk; if(temp > tmpa) { *Ichunk = tmpa; *Jchunk = (Integer)(temp/(*Ichunk)); if(*Jchunk < tmpb) { while(tmpb/i > *Jchunk) ++i; *Jchunk = tmpb/i; } else *Jchunk = tmpb; *Kchunk = GA_MIN(*Ichunk, *Jchunk); } } } } if(*Ichunk<=0) *Ichunk = 1; /* should be atleast 1 */ if(*Jchunk<=0) *Jchunk = 1; if(*Kchunk<=0) *Kchunk = 1; /* Total elements "NUM_MAT" extra elems for safety - just in case */ *elems = ( nbuf*(*Ichunk)*(*Kchunk) + nbuf*(*Kchunk)*(*Jchunk) + (*Ichunk)*(*Jchunk) ); *elems += nbuf*NUM_MATS*sizeof(DoubleComplex)/GAsizeofM(atype); } static DoubleComplex* gai_get_armci_memory(Integer Ichunk, Integer Jchunk, Integer Kchunk, short int nbuf, Integer atype) { DoubleComplex *tmp = NULL; Integer elems; elems = (Integer) pow((double)BLOCK_SIZE,(double)2); elems = nbuf*elems + nbuf*elems + elems; /* A,B,C temporary buffers */ /* add extra elements for safety */ elems += nbuf*NUM_MATS*sizeof(DoubleComplex)/GAsizeofM(atype); /* allocate temporary storage using ARMCI_Malloc */ if( (Integer) (((double)nbuf)*(Ichunk* Kchunk) + ((double)nbuf)*(Kchunk* Jchunk) + Ichunk* Jchunk ) < elems) { tmp=(DoubleComplex*)ARMCI_Malloc_local(elems*GAsizeofM(atype)); } return tmp; } /************************************ * Sequential DGEMM * i.e. BLAS dgemm Routines ************************************/ static void GAI_DGEMM(Integer atype, char *transa, char *transb, Integer idim, Integer jdim, Integer kdim, void *alpha, DoubleComplex *a, Integer adim, DoubleComplex *b, Integer bdim, DoubleComplex *c, Integer cdim) { BlasInt idim_t, jdim_t, kdim_t, adim_t, bdim_t, cdim_t; DoubleComplex ZERO; SingleComplex ZERO_CF; idim_t=idim; jdim_t=jdim; kdim_t=kdim; adim_t=adim; bdim_t=bdim; cdim_t=cdim; ZERO.real = 0.; ZERO.imag = 0.; ZERO_CF.real = 0.; ZERO_CF.imag = 0.; switch(atype) { case C_FLOAT: BLAS_SGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (Real *)alpha, (Real *)a, &adim_t, (Real *)b, &bdim_t, (Real *)&ZERO_CF, (Real *)c, &cdim_t); break; case C_DBL: BLAS_DGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoublePrecision *)alpha, (DoublePrecision *)a, &adim_t, (DoublePrecision *)b, &bdim_t, (DoublePrecision *)&ZERO, (DoublePrecision *)c, &cdim_t); break; case C_DCPL: BLAS_ZGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoubleComplex *)alpha, (DoubleComplex *)a, &adim_t, (DoubleComplex *)b, &bdim_t, (DoubleComplex *)&ZERO, (DoubleComplex *)c, &cdim_t); break; case C_SCPL: BLAS_CGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (SingleComplex *)alpha, (SingleComplex *)a, &adim_t, (SingleComplex *)b, &bdim_t, (SingleComplex *)&ZERO_CF, (SingleComplex *)c, &cdim_t); break; default: pnga_error("ga_matmul_patch: wrong data type", atype); } } static void gai_matmul_shmem(transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, Ichunk, Kchunk, Jchunk, a,b,c, need_scaling) Integer g_a, ailo, aihi, ajlo, ajhi; /* patch of g_a */ Integer g_b, bilo, bihi, bjlo, bjhi; /* patch of g_b */ Integer g_c, cilo, cihi, cjlo, cjhi; /* patch of g_c */ Integer Ichunk, Kchunk, Jchunk, atype; void *alpha, *beta; char *transa, *transb; DoubleComplex *a, *b, *c; short int need_scaling; { Integer me = pnga_nodeid(); Integer get_new_B, loC[2]={0,0}, hiC[2]={0,0}, ld[2]; Integer i0, i1, j0, j1; Integer ilo, ihi, idim, jlo, jhi, jdim, klo, khi, kdim, adim, bdim=0, cdim; int istart, jstart, kstart, iend, jend, kend; short int do_put=UNSET, single_task_flag=UNSET; DoubleComplex ONE = {1.,0.}; SingleComplex ONE_CF = {1.,0.}; Integer clo[2], chi[2]; GA_PUSH_NAME("ga_matmul_shmem"); /* to skip accumulate and exploit data locality: get chunks according to "C" matrix distribution*/ pnga_distribution(g_c, me, loC, hiC); istart = loC[0]-1; iend = hiC[0]-1; jstart = loC[1]-1; jend = hiC[1]-1; kstart = 0 ; kend = ajhi-ajlo; if(DIRECT_ACCESS_OPT_FLAG) { /* check if there is only one task. If so, then it is contiguous */ if( (iend-istart+1 <= Ichunk) && (jend-jstart+1 <= Jchunk) && (kend-kstart+1 <= Kchunk) ) { single_task_flag = SET; pnga_access_ptr(g_c, loC, hiC, &c, ld); } } /* loop through columns of g_c patch */ for(jlo = jstart; jlo <= jend; jlo += Jchunk) { jhi = GA_MIN(jend, jlo+Jchunk-1); jdim = jhi - jlo +1; /* if beta=0,then for first shot we can do put,instead of accumulate */ if(need_scaling == UNSET) do_put = SET; /* loop cols of g_a patch : loop rows of g_b patch*/ for(klo = kstart; klo <= kend; klo += Kchunk) { khi = GA_MIN(kend, klo+Kchunk-1); kdim= khi - klo +1; get_new_B = TRUE; /* Each pass thru' outer 2 loops means we need a different patch of B.*/ /*loop through rows of g_c patch */ for(ilo = istart; ilo <= iend; ilo += Ichunk){ ihi = GA_MIN(iend, ilo+Ichunk-1); idim= cdim = ihi - ilo +1; /* STEP1(a): get matrix "A" chunk */ i0= ailo+ilo; i1= ailo+ihi; j0= ajlo+klo; j1= ajlo+khi; if (*transa == 'n' || *transa == 'N'){ clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; adim=idim; pnga_get(g_a, clo, chi, a, &idim); }else{ clo[0] = j0; clo[1] = i0; chi[0] = j1; chi[1] = i1; adim=kdim; pnga_get(g_a, clo, chi, a, &kdim); } /* STEP1(b): get matrix "B" chunk*/ if(get_new_B) {/*Avoid rereading B if same patch as last time*/ i0= bilo+klo; i1= bilo+khi; j0= bjlo+jlo; j1= bjlo+jhi; if (*transb == 'n' || *transb == 'N'){ clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; bdim=kdim; pnga_get(g_b, clo, chi, b, &kdim); }else { clo[0] = j0; clo[1] = i0; chi[0] = j1; chi[1] = i1; bdim=jdim; pnga_get(g_b, clo, chi, b, &jdim); } get_new_B = FALSE; /* Until J or K change again */ } /* STEP2: Do the sequential matrix multiply - i.e.BLAS dgemm */ GAI_DGEMM(atype, transa, transb, idim, jdim, kdim, alpha, a, adim, b, bdim, c, cdim); /* STEP3: put/accumulate into "C" matrix */ i0= cilo+ilo; i1= cilo+ihi; j0= cjlo+jlo; j1= cjlo+jhi; /* if single_task_flag is SET (i.e =1), then there is no need to update "C" matrix, as we use pointer directly in GAI_DGEMM */ if(single_task_flag != SET) { switch(atype) { case C_FLOAT: case C_SCPL: clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; if(do_put==SET) /* i.e.beta == 0.0 */ pnga_put(g_c, clo, chi, (float *)c, &cdim); else { pnga_acc(g_c, clo, chi, (float*)c, &cdim, &ONE_CF); } break; default: clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; if(do_put==SET) /* i.e.beta == 0.0 */ pnga_put(g_c, clo, chi, (DoublePrecision*)c, &cdim); else { pnga_acc(g_c, clo, chi, (DoublePrecision*)c, &cdim, (DoublePrecision*)&ONE); } break; } } } do_put = UNSET; /* In the second loop, accumulate should be done */ } } GA_POP_NAME; } static void init_block_info(Integer g_c, Integer *proc_index, Integer *index, Integer *blocks, Integer *block_dims, Integer *topology, Integer *iblock) { Integer me= pnga_nodeid(); /* Uses simple block-cyclic data distribution */ if(!pnga_uses_proc_grid(g_c)) { *iblock = me; } else /* Uses scalapack block-cyclic data distribution */ { *iblock = 0; pnga_get_proc_index(g_c, me, proc_index); pnga_get_proc_index(g_c, me, index); pnga_get_block_info(g_c, blocks, block_dims); pnga_get_proc_grid(g_c, topology); } } /** * get the lo/hi distribution info of the next block * return 0 indicates no more blocks available * return 1 indicates there is a block available */ static int get_next_block_info(Integer g_c, Integer *proc_index, Integer *index, Integer *blocks, Integer *block_dims, Integer*topology, Integer *iblock, Integer *blo, Integer *bhi) { Integer dims[MAXDIM], ndim, type; int i; /* works only upto 2 dims - i.e vectors/matrices*/ pnga_inquire(g_c, &type, &ndim, dims); if(ndim>2) pnga_error("get_next_block_info() supports upto 2-d only ", 0L); /* Uses simple block-cyclic data distribution */ if (!pnga_uses_proc_grid(g_c)) { if(*iblock < pnga_total_blocks(g_c)) { pnga_distribution(g_c, *iblock, blo, bhi); *iblock += pnga_nnodes(); return 1; } } else /* Uses scalapack block-cyclic data distribution */ { if (index[ndim-1] < blocks[ndim-1]) { /* find bounding coordinates of block */ for (i = 0; i < ndim; i++) { blo[i] = index[i]*block_dims[i]+1; bhi[i] = (index[i] + 1)*block_dims[i]; if (bhi[i] > dims[i]) bhi[i] = dims[i]; } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < ndim; i++) { if (index[i] >= blocks[i] && i=0) init_block_info(g_c, proc_index, index, blocks, block_dims, topology, &iblock); has_more_blocks = 1; while(has_more_blocks) { /* if block cyclic distribution and loop accordigly. In case of simple block distribution we process this loop only once */ if(numblocks<0) { /* simple block distribution */ has_more_blocks = 0; pnga_distribution(g_c, me, loC, hiC); } else { /* block cyclic */ if(!get_next_block_info(g_c, proc_index, index, blocks, block_dims, topology, &iblock, loC, hiC)) break; } /* If loC and hiC intersects with current patch region, then they will * be updated accordingly. Else it returns FALSE */ pnga_inquire(g_c, &ctype, &cndim, cdims); if(!pnga_patch_intersect(clo,chi,loC,hiC,cndim)) continue; #if DEBUG_ printf("%d: Processing block #%d [%d,%d] - [%d,%d]\n", GAme, iblock, loC[0], loC[1], hiC[0], hiC[1]); #endif state.lo[0] = -1; /* just for first do-while loop */ do { /* Inital Settings */ a = a_ar[0]; b = b_ar[0]; c = c_ar[0]; do_put = single_task_flag = UNSET; offset = 0; /***************************************************************** * Task list: Collect information of all chunks. Matmul using * Non-blocking call needs this list *****************************************************************/ gTaskId=0; /* to skip accumulate and exploit data locality: get chunks according to "C" matrix distribution*/ /* pnga_distribution(g_c, me, loC, hiC); */ chunks_left=gai_get_task_list(taskListA, taskListB, &state,loC[0]-1, loC[1]-1, 0, hiC[0]-1, hiC[1]-1, k-1, Ichunk,Jchunk,Kchunk, &max_tasks,g_a); currA = nextA = 0; if(chunks_left) { /* then turn OFF this optimization */ if(DIRECT_ACCESS_OPT_FLAG) { /* check if there is only one task.If so,then it is contiguous */ if(max_tasks == 1) { if( !((hiC[0]-loC[0]+1 <= Ichunk) &&(hiC[1]-loC[1]+1 <=Jchunk) && (k <= Kchunk))) pnga_error("Invalid task list", 0L); single_task_flag = SET; pnga_access_ptr(g_c, loC, hiC, &c, ld); } } } if(CYCLIC_DISTR_OPT_FLAG) { int prow,pcol,grp_me; Integer a_grp=pnga_get_pgroup(g_a); grp_me = (int)pnga_pgroup_nodeid(a_grp); prow = GA[GA_OFFSET + g_a].nblock[0]; pcol = GA[GA_OFFSET + g_a].nblock[1]; offset = (grp_me/prow + grp_me%prow) % pcol; currA = nextA = nextA + offset; } /************************************************* * Do the setup & issue non-blocking calls to get * the first block/chunk I'm gonna work *************************************************/ shiftA=0; shiftB=0; if(nextA < max_tasks) { currB = nextB = taskListA[currA].chunkBId; GET_BLOCK(g_a, &taskListA[nextA], a_ar[shiftA], transa, ailo, ajlo, &adim_next, &gNbhdlA[shiftA]); GET_BLOCK(g_b, &taskListB[nextB], b_ar[shiftB], transb, bilo, bjlo, &bdim_next, &gNbhdlB[shiftB]); adim=adim_next; bdim=bdim_next; get_new_B = TRUE; } /************************************************************* * Main Parallel DGEMM Loop. *************************************************************/ while(nextA < max_tasks) { currA = nextA; currB = taskListA[currA].chunkBId; idim = cdim = taskListA[currA].dim[0]; jdim = taskListB[currB].dim[1]; kdim = taskListA[currA].dim[1]; bdim=bdim_next; /* if beta=0.0 (i.e.if need_scaling=UNSET), then for first shot, we can do put, instead of accumulate */ if(need_scaling == UNSET) do_put = taskListA[currA].do_put; nextA = ++gTaskId; /* get the next task id */ if(CYCLIC_DISTR_OPT_FLAG && nextA < max_tasks) nextA = (offset+nextA) % max_tasks; /* ---- WAIT till we get the current A & B block ---- */ a = a_ar[shiftA]; WAIT_GET_BLOCK(&gNbhdlA[shiftA]); if(get_new_B){/*Avoid rereading B if it is same patch as last time*/ get_new_B = FALSE; b = b_ar[shiftB]; WAIT_GET_BLOCK(&gNbhdlB[shiftB]); } /* ---- GET the next A & B block ---- */ if(nextA < max_tasks) { GET_BLOCK(g_a, &taskListA[nextA], a_ar[(shiftA+1)%2], transa, ailo, ajlo, &adim_next, &gNbhdlA[(shiftA+1)%2]); nextB = taskListA[nextA].chunkBId; if(currB != nextB) { shiftB=((shiftB+1)%2); GET_BLOCK(g_b, &taskListB[nextB], b_ar[shiftB], transb, bilo, bjlo, &bdim_next, &gNbhdlB[shiftB]); } } if(currB != nextB) get_new_B = TRUE; /* Do the sequential matrix multiply - i.e.BLAS dgemm */ GAI_DGEMM(atype, transa, transb, idim, jdim, kdim, alpha, a, adim, b, bdim, c, cdim); /* Non-blocking Accumulate Operation. Note: skip wait in 1st loop*/ i0 = cilo + taskListA[currA].lo[0]; i1 = cilo + taskListA[currA].hi[0]; j0 = cjlo + taskListB[currB].lo[1]; j1 = cjlo + taskListB[currB].hi[1]; if(currA < max_tasks) { if (single_task_flag != SET) { switch(atype) { case C_FLOAT: case C_SCPL: clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; if(do_put==SET) /* Note:do_put is UNSET, if beta!=0.0*/ pnga_put(g_c, clo, chi, (float *)c, &cdim); else { pnga_acc(g_c, clo, chi, (float *)c, &cdim, &ONE_CF); } break; default: clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; if(do_put==SET) /* i.e.beta ==0.0 */ pnga_put(g_c, clo, chi, (DoublePrecision*)c, &cdim); else { pnga_acc(g_c, clo, chi, (DoublePrecision*)c, &cdim,(DoublePrecision*)&ONE); } break; } } } /* shift next buffer..toggles between 0 and 1: as we use 2 buffers, one for computation and the other for communication (overlap) */ shiftA = ((shiftA+1)%2); adim = adim_next; } } while(chunks_left); } /* while(has_more_blocks) */ GA_POP_NAME; } static void gai_matmul_irreg(transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, Ichunk, Kchunk, Jchunk, a_ar,b_ar,c_ar, need_scaling, irregular) Integer g_a, ailo, aihi, ajlo, ajhi; /* patch of g_a */ Integer g_b, bilo, bihi, bjlo, bjhi; /* patch of g_b */ Integer g_c, cilo, cihi, cjlo, cjhi; /* patch of g_c */ Integer Ichunk, Kchunk, Jchunk, atype; void *alpha, *beta; char *transa, *transb; DoubleComplex **a_ar, **b_ar, **c_ar; short int need_scaling, irregular; { #if DEBUG_ Integer me= pnga_nodeid(); #endif Integer nproc=pnga_nnodes(); Integer get_new_B, i, i0, i1, j0, j1; Integer ilo, ihi, idim, jlo, jhi, jdim, klo, khi, kdim, ijk=0; Integer n, m, k, adim, bdim=0, cdim; Integer idim_prev=0, jdim_prev=0, kdim_prev=0; Integer adim_prev=0, bdim_prev=0, cdim_prev=0; task_list_t taskListC; short int compute_flag=0, shiftA=0, shiftB=0; DoubleComplex ONE, *a, *b, *c; SingleComplex ONE_CF; Integer grp_me, a_grp = pnga_get_pgroup(g_a); Integer clo[2], chi[2]; GA_PUSH_NAME("ga_matmul_irreg"); init_task_list(&taskListC); ONE.real =1.; ONE.imag =0.; ONE_CF.real =1.; ONE_CF.imag =0.; #if DEBUG_ if(me==0) { printf("@@ga_matmul_irreg:m,n,k=%ld %ld %ld\n", aihi-ailo+1, bjhi-bjlo+1,ajhi-ajlo+1); fflush(stdout); } #endif m = aihi - ailo +1; n = bjhi - bjlo +1; k = ajhi - ajlo +1; a = a_ar[0]; b = b_ar[0]; c = c_ar[0]; grp_me = pnga_pgroup_nodeid(a_grp); clo[0] = cilo; clo[1] = cjlo; chi[0] = cihi; chi[1] = cjhi; if(!need_scaling) pnga_fill_patch(g_c, clo, chi, beta); compute_flag=0; /* take care of the last chunk */ for(jlo = 0; jlo < n; jlo += Jchunk){ /* loop thru columns of g_c patch */ jhi = GA_MIN(n-1, jlo+Jchunk-1); jdim= jhi - jlo +1; for(klo = 0; klo < k; klo += Kchunk){ /* loop cols of g_a patch */ khi = GA_MIN(k-1, klo+Kchunk-1); /* loop rows of g_b patch */ kdim= khi - klo +1; /** Each pass through the outer two loops means we need a different patch of B.*/ get_new_B = TRUE; for(ilo = 0; ilo < m; ilo+=Ichunk){ /* loop thru rows of g_c patch */ if(ijk%nproc == grp_me){ ihi = GA_MIN(m-1, ilo+Ichunk-1); idim= cdim = ihi - ilo +1; if (*transa == 'n' || *transa == 'N'){ adim = idim; i0= ailo+ilo; i1= ailo+ihi; j0= ajlo+klo; j1= ajlo+khi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_nbget(g_a, clo, chi, a_ar[shiftA], &idim, &gNbhdlA[shiftA]); }else{ adim = kdim; i0= ajlo+klo; i1= ajlo+khi; j0= ailo+ilo; j1= ailo+ihi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_nbget(g_a, clo, chi, a_ar[shiftA], &kdim, &gNbhdlA[shiftA]); } /* Avoid rereading B if it is same patch as last time. */ if(get_new_B) { if (*transb == 'n' || *transb == 'N'){ bdim = kdim; i0= bilo+klo; i1= bilo+khi; j0= bjlo+jlo; j1= bjlo+jhi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_nbget(g_b, clo, chi, b_ar[shiftB], &kdim, &gNbhdlB[shiftB]); }else{ bdim = jdim; i0= bjlo+jlo; i1= bjlo+jhi; j0= bilo+klo; j1= bilo+khi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_nbget(g_b, clo, chi, b_ar[shiftB], &jdim, &gNbhdlB[shiftB]); } } if(compute_flag) { /* compute loop */ if(atype == C_FLOAT) for(i=0;i _GA_TOL_ || abs_value < -(_GA_TOL_)) { printf("Values are = %f : %f\n Alpha=%f Beta=%f\n", ((float*)tmpc_orig)[i], ((float*)tmpc2)[i], *((float*)alpha), *((float*)beta)); pnga_error("Matmul (type:float) check failed", 0); } } } break; case C_DBL: { double abs_value=0.0; for(i=0; i _GA_TOL_ || abs_value < -(_GA_TOL_)) { printf("Values are = %lf : %lf\n Alpha=%lf Beta=%lf\n", ((double*)tmpc_orig)[i+j], ((double*)tmpc2)[i+j], *((double*)alpha),*((double*)beta)); pnga_error("Matmul (type:double) check failed", 0); } } } break; case C_DCPL: { DoubleComplex abs_value; for(i=0; i_GA_TOL_ || abs_value.real<-(_GA_TOL_) || abs_value.imag>_GA_TOL_ || abs_value.imag<-(_GA_TOL_)) { printf("Values= %lf, %lf : %lf, %lf\n", tmpc_orig[i].real, tmpc_orig[i].imag,tmpc2[i].real,tmpc2[i].imag); pnga_error("Matmul (DoubleComplex) check failed", 0); } } } break; case C_SCPL: { SingleComplex abs_value; for(i=0; i_GA_TOL_ || abs_value.real<-(_GA_TOL_) || abs_value.imag>_GA_TOL_ || abs_value.imag<-(_GA_TOL_)) { printf("Values= %lf, %lf : %lf, %lf\n", ((SingleComplex*)tmpc_orig)[i].real, ((SingleComplex*)tmpc_orig)[i].imag,((SingleComplex*)tmpc2)[i].real,((SingleComplex*)tmpc2)[i].imag); pnga_error("Matmul (SingleComplex) check failed", 0); } } } break; default: pnga_error("ga_matmul_patch: wrong data type", atype); } printf("Matrix Multiplication check (m,n,k=%ld %ld %ld)...O.K\n",m,n,k); fflush(stdout); free(tmpc_orig); free(tmpc2); tmpc_orig = NULL; } } #endif /****************************************** * PARALLEL DGEMM * i.e. C = alpha*A*B + beta*C ******************************************/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_matmul = pnga_matmul #endif void pnga_matmul(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi) Integer g_a, ailo, aihi, ajlo, ajhi; /* patch of g_a */ Integer g_b, bilo, bihi, bjlo, bjhi; /* patch of g_b */ Integer g_c, cilo, cihi, cjlo, cjhi; /* patch of g_c */ void *alpha, *beta; char *transa, *transb; { DoubleComplex *a=NULL, *b, *c, *a_ar[2], *b_ar[2], *c_ar[2]; Integer adim1=0, adim2=0, bdim1=0, bdim2=0, cdim1=0, cdim2=0, dims[2]; Integer atype, btype, ctype, rank, me= pnga_nodeid(); Integer n, m, k, Ichunk, Kchunk, Jchunk; Integer loA[2]={0,0}, hiA[2]={0,0}; Integer loB[2]={0,0}, hiB[2]={0,0}; Integer loC[2]={0,0}, hiC[2]={0,0}; int local_sync_begin,local_sync_end; short int need_scaling=SET,use_NB_matmul=SET; short int irregular=UNSET, use_armci_memory=UNSET; Integer a_grp=pnga_get_pgroup(g_a), b_grp=pnga_get_pgroup(g_b); Integer c_grp=pnga_get_pgroup(g_c); Integer numblocks; Integer clo[2], chi[2]; /* OPTIMIZATIONS FLAGS. To unset an optimization, replace SET by UNSET) */ CYCLIC_DISTR_OPT_FLAG = UNSET; CONTIG_CHUNKS_OPT_FLAG = SET; DIRECT_ACCESS_OPT_FLAG = SET; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_pgroup_sync(a_grp); GA_PUSH_NAME("pnga_matmul"); if (a_grp != b_grp || a_grp != c_grp) pnga_error("Arrays must be defined on same group",0L); # if 0 /* disabled. should not fail if there are non-overlapping patches*/ /* check if C is different from A and B */ if (g_c == g_a || g_c == g_b) pnga_error("Global Array C should be different from A and B", 0); #endif /************************************************** * Do All Sanity Checks **************************************************/ /* Check to make sure all global arrays are of the same type */ if (!(pnga_is_mirrored(g_a) == pnga_is_mirrored(g_b) && pnga_is_mirrored(g_a) == pnga_is_mirrored(g_c))) { pnga_error("Processors do not match for all arrays",pnga_nnodes()); } /* check if ranks are O.K. */ pnga_inquire(g_a, &atype, &rank, dims); VECTORCHECK(rank, dims, adim1, adim2, ailo, aihi, ajlo, ajhi); pnga_inquire(g_b, &btype, &rank, dims); VECTORCHECK(rank, dims, bdim1, bdim2, bilo, bihi, bjlo, bjhi); pnga_inquire(g_c, &ctype, &rank, dims); VECTORCHECK(rank, dims, cdim1, cdim2, cilo, cihi, cjlo, cjhi); /* check for data-types mismatch */ if(atype != btype || atype != ctype ) pnga_error(" types mismatch ", 0L); if(atype != C_DCPL && atype != C_DBL && atype != C_FLOAT && atype!=C_SCPL) pnga_error(" type error",atype); /* check if patch indices and dims match */ if (*transa == 'n' || *transa == 'N'){ if (ailo <= 0 || aihi > adim1 || ajlo <= 0 || ajhi > adim2) pnga_error(" g_a indices out of range ", g_a); }else if (ailo <= 0 || aihi > adim2 || ajlo <= 0 || ajhi > adim1) pnga_error(" g_a indices out of range ", g_a); if (*transb == 'n' || *transb == 'N'){ if (bilo <= 0 || bihi > bdim1 || bjlo <= 0 || bjhi > bdim2) pnga_error(" g_b indices out of range ", g_b); }else if (bilo <= 0 || bihi > bdim2 || bjlo <= 0 || bjhi > bdim1) pnga_error(" g_b indices out of range ", g_b); if (cilo <= 0 || cihi > cdim1 || cjlo <= 0 || cjhi > cdim2) pnga_error(" g_c indices out of range ", g_c); /* verify if patch dimensions are consistent */ m = aihi - ailo +1; n = bjhi - bjlo +1; k = ajhi - ajlo +1; if( (cihi - cilo +1) != m) pnga_error(" a & c dims error",m); if( (cjhi - cjlo +1) != n) pnga_error(" b & c dims error",n); if( (bihi - bilo +1) != k) pnga_error(" a & b dims error",k); #if DEBUG_ if(me==0) check_result(0, transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); pnga_sync(); #endif /* switch to various matmul algorithms here. more to come */ if( GA[GA_OFFSET + g_c].irreg == 1 || GA[GA_OFFSET + g_b].irreg == 1 || GA[GA_OFFSET + g_a].irreg == 1 || _gai_matmul_patch_flag == SET) irregular = SET; /* even ga_dgemm is called, m,n & k might not match GA dimensions */ pnga_inquire(g_c, &ctype, &rank, dims); if(dims[0] != m || dims[1] != n) irregular = SET; /* C matrix dims */ if(!irregular) { if((adim1=GA_Cluster_nnodes()) > 1) use_NB_matmul = SET; else { use_NB_matmul = UNSET; CONTIG_CHUNKS_OPT_FLAG = UNSET; DIRECT_ACCESS_OPT_FLAG = UNSET; } # if defined(__crayx1) || defined(NEC) use_NB_matmul = UNSET; # endif } /* if block cyclic, then use regular algorithm. This is turned on for now * to test block cyclic */ numblocks = pnga_total_blocks(g_c); if(numblocks>=0) { irregular = UNSET; use_NB_matmul = SET; } /**************************************************************** * Get the memory (i.e.static or dynamic) for temporary buffers ****************************************************************/ /* to skip accumulate and exploit data locality: get chunks according to "C" matrix distribution*/ pnga_distribution(g_a, me, loA, hiA); pnga_distribution(g_b, me, loB, hiB); pnga_distribution(g_c, me, loC, hiC); { Integer elems, factor=sizeof(DoubleComplex)/GAsizeofM(atype); short int nbuf=1; DoubleComplex *tmp = NULL; Ichunk = GA_MIN( (hiC[0]-loC[0]+1), (hiA[0]-loA[0]+1) ); Jchunk = GA_MIN( (hiC[1]-loC[1]+1), (hiB[1]-loB[1]+1) ); Kchunk = GA_MIN( (hiA[1]-loA[1]+1), (hiB[0]-loB[0]+1) ); #if KCHUNK_OPTIMIZATION /*works great for m=1000,n=1000,k=4000 kinda cases*/ pnga_distribution(g_a, me, loC, hiC); Kchunk = hiC[1]-loC[1]+1; pnga_distribution(g_b, me, loC, hiC); Kchunk = GA_MIN(Kchunk, (hiC[0]-loC[0]+1)); #endif /* Just to avoid divide by zero error */ if(Ichunk<=0) Ichunk = 1; if(Jchunk<=0) Jchunk = 1; if(Kchunk<=0) Kchunk = 1; { Integer irreg=0; if(Ichunk/Kchunk > GA_ASPECT_RATIO || Kchunk/Ichunk > GA_ASPECT_RATIO || Jchunk/Kchunk > GA_ASPECT_RATIO || Kchunk/Jchunk > GA_ASPECT_RATIO) { irreg = SET; } pnga_pgroup_gop(a_grp, pnga_type_f2c(MT_F_INT), &irreg, (Integer)1, "max"); if(irreg==SET) irregular = SET; } /* If non-blocking, we need 2 temporary buffers for A and B matrix */ if(use_NB_matmul) nbuf = 2; if(!irregular) { tmp = a_ar[0] =a=gai_get_armci_memory(Ichunk,Jchunk,Kchunk, nbuf, atype); if(tmp != NULL) use_armci_memory = SET; } /* get ChunkSize (i.e.BlockSize), that fits in temporary buffer */ gai_get_chunk_size(irregular, &Ichunk, &Jchunk, &Kchunk, &elems, atype, m, n, k, nbuf, use_armci_memory, a_grp); if(tmp == NULL) { /* try once again from armci for new chunk sizes */ tmp = a_ar[0] =a=gai_get_armci_memory(Ichunk,Jchunk,Kchunk, nbuf, atype); if(tmp != NULL) use_armci_memory = SET; } if(tmp == NULL) { /*if armci malloc fails again, then get from MA */ tmp = a_ar[0] = a =(DoubleComplex*) ga_malloc(elems,atype, "GA mulmat bufs"); } if(use_NB_matmul) tmp = a_ar[1] = a_ar[0] + (Ichunk*Kchunk)/factor+1; tmp = b_ar[0] = b = tmp + (Ichunk*Kchunk)/factor + 1; if(use_NB_matmul) tmp = b_ar[1] = b_ar[0] + (Kchunk*Jchunk)/factor+1; c_ar[0] = c = tmp + (Kchunk*Jchunk)/factor + 1; } /** check if there is a need for scaling the data. Note: if beta=0, then need_scaling=0 */ if(atype==C_DCPL){ if((((DoubleComplex*)beta)->real == 0) && (((DoubleComplex*)beta)->imag ==0)) need_scaling =0;} else if(atype==C_SCPL){ if((((SingleComplex*)beta)->real == 0) && (((SingleComplex*)beta)->imag ==0)) need_scaling =0;} else if((atype==C_DBL)){ if(*(DoublePrecision *)beta == 0) need_scaling =0;} else if( *(float*)beta ==0) need_scaling =0; clo[0] = cilo; clo[1] = cjlo; chi[0] = cihi; chi[1] = cjhi; if(need_scaling) pnga_scale_patch(g_c, clo, chi, beta); /******************************************************************** * Parallel Matrix Multiplication Starts Here. * 3 Steps: * 1. Get a chunk of A and B matrix, and store it in local buffer. * 2. Do sequential dgemm. * 3. Put/accumulate the result into C matrix. *********************************************************************/ /* if only one node, then enable the optimized shmem code */ if(use_NB_matmul==UNSET) { gai_matmul_shmem(transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, Ichunk, Kchunk, Jchunk, a,b,c, need_scaling); } else { if(irregular) gai_matmul_irreg(transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, Ichunk, Kchunk, Jchunk, a_ar, b_ar, c_ar, need_scaling, irregular); else gai_matmul_regular(transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi, Ichunk, Kchunk, Jchunk, a_ar, b_ar, c_ar, need_scaling, irregular); } a = a_ar[0]; if(use_armci_memory == SET) ARMCI_Free_local(a); else ga_free(a); #if DEBUG_ Integer grp_me; grp_me = pnga_pgroup_nodeid(a_grp); pnga_pgroup_sync(a_grp); if(me==0) check_result(1, transa, transb, alpha, beta, atype, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); pnga_pgroup_sync(a_grp); #endif GA_POP_NAME; if(local_sync_end)pnga_pgroup_sync(a_grp); } /* This is the old matmul code. It is enabled now for mirrored matrix multiply. It also work for normal matrix/vector multiply with no changes */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_matmul_mirrored = pnga_matmul_mirrored #endif void pnga_matmul_mirrored(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi) Integer g_a, ailo, aihi, ajlo, ajhi; /* patch of g_a */ Integer g_b, bilo, bihi, bjlo, bjhi; /* patch of g_b */ Integer g_c, cilo, cihi, cjlo, cjhi; /* patch of g_c */ void *alpha, *beta; char *transa, *transb; { #ifdef STATBUF /* approx. sqrt(2) ratio in chunk size to use the same buffer space */ DoubleComplex a[ICHUNK*KCHUNK], b[KCHUNK*JCHUNK], c[ICHUNK*JCHUNK]; #else DoubleComplex *a, *b, *c; #endif Integer atype, btype, ctype, adim1=0, adim2=0, bdim1=0, bdim2=0, cdim1=0, cdim2=0, dims[2], rank; Integer me= pnga_nodeid(), nproc; Integer i, ijk = 0, i0, i1, j0, j1; Integer ilo, ihi, idim, jlo, jhi, jdim, klo, khi, kdim; Integer n, m, k, adim, bdim=0, cdim; Integer Ichunk, Kchunk, Jchunk; DoubleComplex ONE; SingleComplex ONE_CF; DoublePrecision chunk_cube; Integer min_tasks = 10, max_chunk; int need_scaling=1; Integer ZERO_I = 0, inode, iproc; Integer get_new_B; int local_sync_begin,local_sync_end; BlasInt idim_t, jdim_t, kdim_t, adim_t, bdim_t, cdim_t; Integer clo[2], chi[2]; ONE.real =1.; ONE.imag =0.; ONE_CF.real =1.; ONE_CF.imag =0.; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); GA_PUSH_NAME("ga_matmul_patch"); /* Check to make sure all global arrays are of the same type */ if (!(pnga_is_mirrored(g_a) == pnga_is_mirrored(g_b) && pnga_is_mirrored(g_a) == pnga_is_mirrored(g_c))) { pnga_error("Processors do not match for all arrays",pnga_nnodes()); } if (pnga_is_mirrored(g_a)) { inode = pnga_cluster_nodeid(); nproc = pnga_cluster_nprocs(inode); iproc = me - pnga_cluster_procid(inode, ZERO_I); } else { nproc = pnga_nnodes(); iproc = me; } pnga_inquire(g_a, &atype, &rank, dims); VECTORCHECK(rank, dims, adim1, adim2, ailo, aihi, ajlo, ajhi); pnga_inquire(g_b, &btype, &rank, dims); VECTORCHECK(rank, dims, bdim1, bdim2, bilo, bihi, bjlo, bjhi); pnga_inquire(g_c, &ctype, &rank, dims); VECTORCHECK(rank, dims, cdim1, cdim2, cilo, cihi, cjlo, cjhi); if(atype != btype || atype != ctype ) pnga_error(" types mismatch ", 0L); if(atype != C_DCPL && atype != C_DBL && atype != C_FLOAT && atype != C_SCPL) pnga_error(" type error",atype); /* check if patch indices and dims match */ if (*transa == 'n' || *transa == 'N'){ if (ailo <= 0 || aihi > adim1 || ajlo <= 0 || ajhi > adim2) pnga_error(" g_a indices out of range ", g_a); }else if (ailo <= 0 || aihi > adim2 || ajlo <= 0 || ajhi > adim1) pnga_error(" g_a indices out of range ", g_a); if (*transb == 'n' || *transb == 'N'){ if (bilo <= 0 || bihi > bdim1 || bjlo <= 0 || bjhi > bdim2) pnga_error(" g_b indices out of range ", g_b); }else if (bilo <= 0 || bihi > bdim2 || bjlo <= 0 || bjhi > bdim1) pnga_error(" g_b indices out of range ", g_b); if (cilo <= 0 || cihi > cdim1 || cjlo <= 0 || cjhi > cdim2) pnga_error(" g_c indices out of range ", g_c); /* verify if patch dimensions are consistent */ m = aihi - ailo +1; n = bjhi - bjlo +1; k = ajhi - ajlo +1; if( (cihi - cilo +1) != m) pnga_error(" a & c dims error",m); if( (cjhi - cjlo +1) != n) pnga_error(" b & c dims error",n); if( (bihi - bilo +1) != k) pnga_error(" a & b dims error",k); /* In 32-bit platforms, k*m*n might exceed the "long" range(2^31), eg:k=m=n=1600. So casting the temporary value to "double" helps */ chunk_cube = (k*(double)(m*n)) / (min_tasks * nproc); max_chunk = (Integer)pow(chunk_cube, (DoublePrecision)(1.0/3.0) ); if (max_chunk < 32) max_chunk = 32; #ifdef STATBUF if(atype == C_DBL || atype == C_FLOAT){ Ichunk=D_CHUNK, Kchunk=D_CHUNK, Jchunk=D_CHUNK; }else{ Ichunk=ICHUNK; Kchunk=KCHUNK; Jchunk=JCHUNK; } #else { /** * Find out how much memory we can grab. It will be used in * three chunks, and the result includes only the first one. */ Integer elems, factor = sizeof(DoubleComplex)/GAsizeofM(atype); Ichunk = Jchunk = Kchunk = CHUNK_SIZE; if ( max_chunk > Ichunk) { /*if memory if very limited, performance degrades for large matrices as chunk size is very small, which leads to communication overhead)*/ Integer avail = pnga_memory_avail_type(atype); if (pnga_is_mirrored(g_a)) { fflush(stdout); if (sizeof(Integer)/sizeof(int) > 1) armci_msg_gop_scope(SCOPE_NODE, &avail, 1, "min", ARMCI_LONG); else armci_msg_gop_scope(SCOPE_NODE, &avail, 1, "min", ARMCI_INT); fflush(stdout); } else { fflush(stdout); pnga_gop(pnga_type_f2c(MT_F_INT), &avail, (Integer)1, "min"); } if(availreal == 0) && (((DoubleComplex*)beta)->imag ==0)) need_scaling =0;} else if(atype==C_SCPL){if((((SingleComplex*)beta)->real == 0) && (((SingleComplex*)beta)->imag ==0)) need_scaling =0;} else if((atype==C_DBL)){if(*(DoublePrecision *)beta == 0) need_scaling =0;} else if( *(float*)beta ==0) need_scaling =0; pnga_mask_sync(ZERO_I, ZERO_I); clo[0] = cilo; clo[1] = cjlo; chi[0] = cihi; chi[1] = cjhi; if(need_scaling) pnga_scale_patch(g_c, clo, chi, beta); else pnga_fill_patch(g_c, clo, chi, beta); for(jlo = 0; jlo < n; jlo += Jchunk){ /* loop through columns of g_c patch */ jhi = GA_MIN(n-1, jlo+Jchunk-1); jdim= jhi - jlo +1; for(klo = 0; klo < k; klo += Kchunk){ /* loop cols of g_a patch */ khi = GA_MIN(k-1, klo+Kchunk-1); /* loop rows of g_b patch */ kdim= khi - klo +1; /** Each pass through the outer two loops means we need a different patch of B.*/ get_new_B = TRUE; for(ilo = 0; ilo < m; ilo += Ichunk){ /*loop through rows of g_c patch */ if(ijk%nproc == iproc){ ihi = GA_MIN(m-1, ilo+Ichunk-1); idim= cdim = ihi - ilo +1; if(atype == C_FLOAT) for (i = 0; i < idim*jdim; i++) *(((float*)c)+i)=0; else if(atype == C_DBL) for (i = 0; i < idim*jdim; i++) *(((double*)c)+i)=0; else if(atype == C_SCPL) for (i = 0; i < idim*jdim; i++){ ((SingleComplex*)c)[i].real=0; ((SingleComplex*)c)[i].imag=0; } else for (i = 0; i < idim*jdim; i++){ c[i].real=0;c[i].imag=0;} if (*transa == 'n' || *transa == 'N'){ adim = idim; i0= ailo+ilo; i1= ailo+ihi; j0= ajlo+klo; j1= ajlo+khi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_get(g_a, clo, chi, a, &idim); }else{ adim = kdim; i0= ajlo+klo; i1= ajlo+khi; j0= ailo+ilo; j1= ailo+ihi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_get(g_a, clo, chi, a, &kdim); } /* Avoid rereading B if it is the same patch as last time. */ if(get_new_B) { if (*transb == 'n' || *transb == 'N'){ bdim = kdim; i0= bilo+klo; i1= bilo+khi; j0= bjlo+jlo; j1= bjlo+jhi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_get(g_b, clo, chi, b, &kdim); }else{ bdim = jdim; i0= bjlo+jlo; i1= bjlo+jhi; j0= bilo+klo; j1= bilo+khi; clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_get(g_b, clo, chi, b, &jdim); } get_new_B = FALSE; /* Until J or K change again */ } idim_t=idim; jdim_t=jdim; kdim_t=kdim; adim_t=adim; bdim_t=bdim; cdim_t=cdim; switch(atype) { case C_FLOAT: BLAS_SGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (Real *)alpha, (Real *)a, &adim_t, (Real *)b, &bdim_t, (Real *)&ONE_CF, (Real *)c, &cdim_t); break; case C_DBL: BLAS_DGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoublePrecision *)alpha, (DoublePrecision *)a, &adim_t, (DoublePrecision *)b, &bdim_t, (DoublePrecision *)&ONE, (DoublePrecision *)c, &cdim_t); break; case C_DCPL: BLAS_ZGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoubleComplex *)alpha, (DoubleComplex *)a, &adim_t, (DoubleComplex *)b, &bdim_t, (DoubleComplex *)&ONE, (DoubleComplex *)c, &cdim_t); break; case C_SCPL: BLAS_CGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (SingleComplex *)alpha, (SingleComplex *)a, &adim_t, (SingleComplex *)b, &bdim_t, (SingleComplex *)&ONE_CF, (SingleComplex *)c, &cdim_t); break; default: pnga_error("ga_matmul_patch: wrong data type", atype); } i0= cilo+ilo; i1= cilo+ihi; j0= cjlo+jlo; j1= cjlo+jhi; if(atype == C_FLOAT || atype == C_SCPL) { clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_acc(g_c, clo, chi, (float *)c, &cdim, &ONE_CF); } else { clo[0] = i0; clo[1] = j0; chi[0] = i1; chi[1] = j1; pnga_acc(g_c, clo, chi, (DoublePrecision*)c, &cdim, (DoublePrecision*)&ONE); } } ++ijk; } } } #ifndef STATBUF ga_free(a); #endif GA_POP_NAME; if(local_sync_end)pnga_sync(); } #if 0 void gai_matmul_patch(char *transa, char *transb, void *alpha, void *beta, Integer g_a,Integer ailo,Integer aihi,Integer ajlo,Integer ajhi, Integer g_b,Integer bilo,Integer bihi,Integer bjlo,Integer bjhi, Integer g_c,Integer cilo,Integer cihi,Integer cjlo,Integer cjhi) { if(pnga_is_mirrored(g_a)) pnga_matmul_mirrored(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); else { _gai_matmul_patch_flag = SET; pnga_matmul(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); _gai_matmul_patch_flag = UNSET; } } #endif /*\ select the 2d plane to be used in matrix multiplication \*/ static void gai_setup_2d_patch(Integer rank, char *trans, Integer dims[], Integer lo[], Integer hi[], Integer* ilo, Integer* ihi, Integer* jlo, Integer* jhi, Integer* dim1, Integer* dim2, int* ipos, int* jpos, int *vpos) { int d,e=0; char t='n'; for(d=0; d0 && ++e>2 ) pnga_error("3-D Patch Detected", 0L); *ipos = *jpos = *vpos = -1; for(d=0; dlo[d]) ) { *ipos =d; continue; } if( (*ipos >=0) && (hi[d]>lo[d])) { *jpos =d; break; } } /* we have an ambiguous vector; mark its location */ if (1 == e && *ipos != 0 && *ipos != rank-1) { *vpos = *ipos; } /* if(*ipos >*jpos){Integer t=*ipos; *ipos=*jpos; *jpos=t;} */ /* single element case (trivial) */ if((*ipos <0) && (*jpos <0)){ *ipos =0; *jpos=1; } else{ /* handle almost trivial case of only one dimension with >1 elements */ if(trans == NULL) trans = &t; if(*trans == 'n' || *trans == 'N') { if(*ipos == rank-1) (*ipos)--; /* i cannot be the last dimension */ if(*ipos <0) *ipos = *jpos-1; /* select i dimension based on j */ if(*jpos <0) *jpos = *ipos+1; /* select j dimenison based on i */ } else { if(*ipos <0) *ipos = *jpos-1; if(*jpos <0) { if(*ipos==0) *jpos = *ipos + 1; else *jpos = (*ipos)--; } } } *ilo = lo[*ipos]; *ihi = hi[*ipos]; *jlo = lo[*jpos]; *jhi = hi[*jpos]; *dim1 = dims[*ipos]; *dim2 = dims[*jpos]; #if 0 printf("lo/hi=[%ld:%ld", lo[0], hi[0]); for (d=1; d adim1 || ajlo <= 0 || ajhi > adim2) pnga_error(" g_a indices out of range ", g_a); }else if (ailo <= 0 || aihi > adim2 || ajlo <= 0 || ajhi > adim1) pnga_error(" g_a indices out of range ", g_a); if (*transb == 'n' || *transb == 'N'){ if (bilo <= 0 || bihi > bdim1 || bjlo <= 0 || bjhi > bdim2) pnga_error(" g_b indices out of range ", g_b); }else if (bilo <= 0 || bihi > bdim2 || bjlo <= 0 || bjhi > bdim1) pnga_error(" g_b indices out of range ", g_b); if (cilo <= 0 || cihi > cdim1 || cjlo <= 0 || cjhi > cdim2) pnga_error(" g_c indices out of range ", g_c); /* verify if patch dimensions are consistent */ #define RESET() do { \ m = aihi - ailo +1; \ k = ajhi - ajlo +1; \ k2= bihi - bilo +1; \ n = bjhi - bjlo +1; \ cm= cihi - cilo +1; \ cn= cjhi - cjlo +1; \ } while (0) RESET(); #define SHIFT(L,INC) do { \ L##ipos+=INC; \ L##jpos+=INC; \ L##ilo = L##lo[L##ipos]; \ L##ihi = L##hi[L##ipos]; \ L##jlo = L##lo[L##jpos]; \ L##jhi = L##hi[L##jpos]; \ L##dim1 = L##dims[L##ipos]; \ L##dim2 = L##dims[L##jpos]; \ RESET(); \ } while (0) /* gai_setup_2d_patch may produce ambiguous vectors */ if (!(m==cm && k==k2 && n==cn)) { /* patches don't agree */ if (avpos>=0 && bvpos<0 && cvpos<0) { /* only A is an ambiguous vector */ SHIFT(a,-1); } else if (avpos<0 && bvpos>=0 && cvpos<0) { /* only B is an ambiguous vector */ SHIFT(b,-1); } else if (avpos<0 && bvpos<0 && cvpos>=0) { /* only C is an ambiguous vector */ SHIFT(c,-1); } else if (avpos>=0 && bvpos>=0 && cvpos<0) { /* A and B are ambiguous vectors */ if (m != cm) { SHIFT(a,-1); } if (n != cn) { SHIFT(b,-1); } } else if (avpos>=0 && bvpos<0 && cvpos>=0) { /* A and C are ambiguous vectors */ if (k != k2) { SHIFT(a,-1); } if (n != cn) { SHIFT(c,-1); } } else if (avpos<0 && bvpos>=0 && cvpos>=0) { /* B and C are ambiguous vectors */ if (k != k2) { SHIFT(b,-1); } if (m != cm) { SHIFT(c,-1); } } else if (avpos>=0 && bvpos>=0 && cvpos>=0) { /* A and B and C are ambiguous vectors */ pnga_error("a and b and c ambiguous", 1); } } if( (cihi - cilo +1) != m) pnga_error(" a & c dims error",m); if( (cjhi - cjlo +1) != n) pnga_error(" b & c dims error",n); if( (bihi - bilo +1) != k) pnga_error(" a & b dims error",k); chunk_cube = (k*(double)(m*n)) / (min_tasks * nproc); max_chunk = (Integer)pow(chunk_cube, (DoublePrecision)(1.0/3.0) ); if (max_chunk < 32) max_chunk = 32; #ifdef STATBUF if(atype == C_DBL || atype == C_FLOAT){ Ichunk=D_CHUNK, Kchunk=D_CHUNK, Jchunk=D_CHUNK; }else{ Ichunk=ICHUNK; Kchunk=KCHUNK; Jchunk=JCHUNK; } #else { Integer elems, factor = sizeof(DoubleComplex)/GAsizeofM(atype); Ichunk = Jchunk = Kchunk = CHUNK_SIZE; if ( max_chunk > Ichunk) { /*if memory if very limited, performance degrades for large matrices as chunk size is very small, which leads to communication overhead)*/ Integer avail = pnga_memory_avail_type(atype); pnga_gop(pnga_type_f2c(MT_F_INT), &avail, (Integer)1, "min"); if(availreal == 0) && (((DoubleComplex*)beta)->imag ==0)) need_scaling =0;} else if(atype==C_SCPL){if((((SingleComplex*)beta)->real == 0) && (((SingleComplex*)beta)->imag ==0)) need_scaling =0;} else if((atype==C_DBL)){if(*(DoublePrecision *)beta == 0)need_scaling =0;} else if( *(float*)beta ==0) need_scaling =0; if(need_scaling) pnga_scale_patch(g_c, clo, chi, beta); else pnga_fill_patch(g_c, clo, chi, beta); for(jlo = 0; jlo < n; jlo += Jchunk){ /* loop through columns of g_c patch */ jhi = GA_MIN(n-1, jlo+Jchunk-1); jdim= jhi - jlo +1; for(klo = 0; klo < k; klo += Kchunk){ /* loop cols of g_a patch */ khi = GA_MIN(k-1, klo+Kchunk-1); /* loop rows of g_b patch */ kdim= khi - klo +1; get_new_B = TRUE; for(ilo = 0; ilo < m; ilo += Ichunk){ /*loop through rows of g_c patch */ if(ijk%nproc == iproc){ ihi = GA_MIN(m-1, ilo+Ichunk-1); idim= cdim = ihi - ilo +1; if(atype == C_FLOAT) for (i = 0; i < idim*jdim; i++) *(((float*)c)+i)=0; else if(atype == C_DBL) for (i = 0; i < idim*jdim; i++) *(((double*)c)+i)=0; else if(atype == C_SCPL) for (i = 0; i < idim*jdim; i++){ ((SingleComplex*)c)[i].real=0; ((SingleComplex*)c)[i].imag=0; } else for (i = 0; i < idim*jdim; i++){ c[i].real=0;c[i].imag=0;} if (*transa == 'n' || *transa == 'N'){ adim = idim; i0= ailo+ilo; i1= ailo+ihi; j0= ajlo+klo; j1= ajlo+khi; }else{ adim = kdim; i0= ajlo+klo; i1= ajlo+khi; j0= ailo+ilo; j1= ailo+ihi; } /* ga_get_(g_a, &i0, &i1, &j0, &j1, a, &adim); */ memcpy(tmplo,alo,arank*sizeof(Integer)); memcpy(tmphi,ahi,arank*sizeof(Integer)); SETINT(tmpld,1,arank-1); tmplo[aipos]=i0; tmphi[aipos]=i1; tmplo[ajpos]=j0; tmphi[ajpos]=j1; tmpld[aipos]=i1-i0+1; pnga_get(g_a,tmplo,tmphi,a,tmpld); if(get_new_B) { if (*transb == 'n' || *transb == 'N'){ bdim = kdim; i0= bilo+klo; i1= bilo+khi; j0= bjlo+jlo; j1= bjlo+jhi; }else{ bdim = jdim; i0= bjlo+jlo; i1= bjlo+jhi; j0= bilo+klo; j1= bilo+khi; } /* ga_get_(g_b, &i0, &i1, &j0, &j1, b, &bdim); */ memcpy(tmplo,blo,brank*sizeof(Integer)); memcpy(tmphi,bhi,brank*sizeof(Integer)); SETINT(tmpld,1,brank-1); tmplo[bipos]=i0; tmphi[bipos]=i1; tmplo[bjpos]=j0; tmphi[bjpos]=j1; tmpld[bipos]=i1-i0+1; pnga_get(g_b,tmplo,tmphi,b,tmpld); get_new_B = FALSE; } idim_t=idim; jdim_t=jdim; kdim_t=kdim; adim_t=adim; bdim_t=bdim; cdim_t=cdim; switch(atype) { case C_FLOAT: BLAS_SGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (Real *)alpha, (Real *)a, &adim_t, (Real *)b, &bdim_t, (Real *)&ONE_CF, (Real *)c, &cdim_t); break; case C_DBL: BLAS_DGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoublePrecision *)alpha, (DoublePrecision *)a, &adim_t, (DoublePrecision *)b, &bdim_t, (DoublePrecision *)&ONE, (DoublePrecision *)c, &cdim_t); break; case C_DCPL: BLAS_ZGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (DoubleComplex *)alpha, (DoubleComplex *)a, &adim_t, (DoubleComplex *)b, &bdim_t, (DoubleComplex *)&ONE, (DoubleComplex *)c, &cdim_t); break; case C_SCPL: BLAS_CGEMM(transa, transb, &idim_t, &jdim_t, &kdim_t, (SingleComplex *)alpha, (SingleComplex *)a, &adim_t, (SingleComplex *)b, &bdim_t, (SingleComplex *)&ONE_CF, (SingleComplex *)c, &cdim_t); break; default: pnga_error("ga_matmul_patch: wrong data type", atype); } i0= cilo+ilo; i1= cilo+ihi; j0= cjlo+jlo; j1= cjlo+jhi; /* ga_acc_(g_c, &i0, &i1, &j0, &j1, (DoublePrecision*)c, &cdim, (DoublePrecision*)&ONE); */ memcpy(tmplo,clo,crank*sizeof(Integer)); memcpy(tmphi,chi,crank*sizeof(Integer)); SETINT(tmpld,1,crank-1); tmplo[cipos]=i0; tmphi[cipos]=i1; tmplo[cjpos]=j0; tmphi[cjpos]=j1; tmpld[cipos]=i1-i0+1; if(atype == C_FLOAT || atype == C_SCPL) pnga_acc(g_c,tmplo,tmphi,(float *)c,tmpld, &ONE_CF); else pnga_acc(g_c,tmplo,tmphi,c,tmpld,(DoublePrecision*)&ONE); } ++ijk; } } } #ifndef STATBUF ga_free(a); #endif GA_POP_NAME; if(local_sync_end)pnga_sync(); } /** * 1. remove STATBUF * 2. */ ga-5-4/global/src/peigstubs.c0000644000175000017500000000342312662210457014237 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "globalp.h" #include "ga-papi.h" #include "ga-wapi.h" #if ENABLE_PEIGS # if ENABLE_F77 # define gai_diag_ F77_FUNC_(gai_diag,GAI_DIAG) # define gai_diag_std_ F77_FUNC_(gai_diag_std,GAI_DIAG_STD) # define gai_diag_reuse_ F77_FUNC_(gai_diag_reuse,GAI_DIAG_REUSE) extern gai_diag_(Integer*,Integer*,Integer*,DoublePrecision*); extern gai_diag_std_(Integer*,Integer*,DoublePrecision*); extern gai_diag_reuse_(Integer*,Integer*,Integer*,Integer*,DoublePrecision*); # else # endif #else #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_diag = pnga_diag #endif void pnga_diag(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { #if ENABLE_PEIGS # if ENABLE_F77 gai_diag_(&g_a, &g_s, &g_v, eval); # else pnga_error("ga_diag:peigs interfaced, need to configure --enable-f77",0L); # endif #else pnga_error("ga_diag:peigs not interfaced",0L); #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_diag_std = pnga_diag_std #endif void pnga_diag_std(Integer g_a, Integer g_v, DoublePrecision *eval) { #if ENABLE_PEIGS # if ENABLE_F77 gai_diag_std_(&g_a, &g_v, eval); # else pnga_error("ga_diag:peigs interfaced, need to configure --enable-f77",0L); # endif #else pnga_error("ga_diag:peigs not interfaced",0L); #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_diag_reuse = pnga_diag_reuse #endif void pnga_diag_reuse(Integer reuse, Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { #if ENABLE_PEIGS # if ENABLE_F77 gai_diag_reuse_(&reuse, &g_a, &g_s, &g_v, eval); # else pnga_error("ga_diag:peigs interfaced, need to configure --enable-f77",0L); # endif #else pnga_error("ga_diag:peigs not interfaced",0L); #endif } ga-5-4/global/src/ga_trace.c0000644000175000017500000001507412662210457014004 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /***********************************************************************\ * Tracing and Timing functions for the GA routines: * * trace_init - initialization * * trace_stime - starts timing * * trace_etime - ends timing * * trace_genrec - generates a trace record for the calling routine * * trace_end - ends tracing & writes report to a file 'proc' * * Note: the usc timer from the ALOG package is used * * Jarek Nieplocha, 10.14.93 * \***********************************************************************/ #include #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "ga.h" #ifndef MSG_COMMS_MPI # include "tcgmsg.h" #else # include "mpi.h" #endif #include "ga-papi.h" #include "ga-wapi.h" static double tt0, tt1; static Integer *tlog, thandle; static Integer *indlog, ihandle, gahandle; static int *galog; static unsigned long current, MAX_EVENTS=0; static int ganum = 0; #define MAX_GAS 100 #define min(a,b) ((a)<(b) ? (a) : (b)) #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_timer = pnga_timer #endif double pnga_timer() { #ifdef MSG_COMMS_MPI return MPI_Wtime(); #else return tcg_time(); #endif } /* n is the max number of events to be traced */ void trace_init_(long *n) { MA_AccessIndex index; long err; if(*n<=0){ printf("trace_init>> invalid max number of events: %ld\n",*n); return; } current = 0; err = 0; /* MA_initialize(MT_INT,10000,10000); */ MAX_EVENTS = *n; if(!MA_push_get(MT_LONGINT, *n*2, "timeLog", &thandle, &index)){ printf("trace_init>> failed to allocate memory 1\n"); err ++; } MA_get_pointer(thandle, &tlog); if(!tlog){ printf("trace_init>> null pointer: 1\n"); err ++; } if(!MA_push_get(MT_LONGINT, *n*6, "indexLog", &ihandle, &index)){ printf("trace_init>> failed to allocate memory 2\n"); err ++; } MA_get_pointer(ihandle, &indlog); if(!indlog) { printf("trace_init>> null pointer: 2\n"); err ++; } if(!MA_push_get(MT_INT, MAX_GAS, "gaLog", &gahandle, &index)){ printf("trace_init>> failed to allocate memory 2\n"); err ++; } MA_get_pointer(gahandle, &galog); if(!galog) { printf("trace_init>> null pointer: 2\n"); err ++; } ganum = 0; if(err) MAX_EVENTS = 0; } void trace_stime_() { tt0 = pnga_timer(); } void trace_etime_() { tt1 = pnga_timer(); } void trace_genrec_(Integer *ga, Integer *ilo, Integer *ihi, Integer *jlo, Integer *jhi, Integer *op) { int i, d, has_record, counter; FILE *fout; char fname[15]; typedef struct { int lo[2]; int hi[2]; } patch_t; patch_t *regions; int *proclist; int ndim, dims[2], tmp_dims[2], lo[2], hi[2], type, block[2]; int me=GA_Nodeid(), nproc=GA_Nnodes(), proc; if(current >= MAX_EVENTS) return; /* only node 0 does the bookkeeping */ if(me == 0) { /* test if this ga has been recorded */ has_record = 0; for(i=0; i tmp_dims[d]) { block[d]++; tmp_dims[d] = regions[i].hi[d]; } } /* print the number of processed */ fprintf(fout, "%d\n", nproc); /* print dimensions */ for(d=0; d tmp_dims[d]) { counter++; if(counter == block[d]) break; fprintf(fout, "%d\n", regions[i].hi[d]+1); tmp_dims[d] = regions[i].hi[d]; } } } fclose(fout); free(regions); free(proclist); } } tlog[current*2] = (unsigned long)(tt0 * 1000000); tlog[current*2+1] = (unsigned long)(tt1 * 1000000); indlog[current*6] = *ga; indlog[current*6+1] = *ilo; indlog[current*6+2] = *ihi; indlog[current*6+3] = *jlo; indlog[current*6+4] = *jhi; indlog[current*6+5] = *op; current++; } void trace_end_(long *proc) { FILE *fout; char fname[10]; unsigned long i,k; sprintf(fname,"%03d",(int)*proc); fout=fopen(fname,"w"); for(i=0;i adim1 || ajlo <= 0 || ajhi > adim2) pnga_error(" pnga_copy_patch_dp: g_a indices out of range ", 0L); if (bilo <= 0 || bihi > bdim1 || bjlo <= 0 || bjhi > bdim2) pnga_error(" pnga_copy_patch_dp: g_b indices out of range ", 0L); /* check if numbers of elements in two patches match each other */ if (((bihi - bilo + 1) != (aihi - ailo + 1)) || ( (bjhi - bjlo + 1) != (ajhi - ajlo + 1)) ) pnga_error(" pnga_copy_patch_dp: shapes two of patches do not match ", 0L); /* is transpose operation required ? */ transp = (*t_a == 'n' || *t_a =='N')? 'n' : 't'; /* now find out cordinates of a patch of g_a that I own */ pnga_distribution(g_a, me, lo, hi); ilos = lo[0]; jlos = lo[1]; ihis = hi[0]; jhis = hi[1]; if(patch_intersect(ailo, aihi, ajlo, ajhi, &ilos, &ihis, &jlos, &jhis)){ pnga_access_ptr(g_a, lo, hi, &dbl_ptrA, &ld); nelem = (ihis-ilos+1)*(jhis-jlos+1); if ( transp == 'n' ) { corr = bilo - ailo; ilod = ilos + corr; ihid = ihis + corr; corr = bjlo - ajlo; jlod = jlos + corr; jhid = jhis + corr; } else { /* If this is a transpose copy, we need local scratch space */ dbl_ptrB = (DoublePrecision*) ga_malloc(nelem,MT_F_DBL,"copypatch_dp"); /* Copy from the source into this local array, transposed */ ldT = jhis-jlos+1; for(j=0; j< jhis-jlos+1; j++) for(i=0; i< ihis-ilos+1; i++) *(dbl_ptrB + i*ldT + j) = *(dbl_ptrA + j*ld + i); /* Now we can reset index to point to the transposed stuff */ pnga_release(g_a, lo, hi); dbl_ptrA = dbl_ptrB; ld = ldT; /* And finally, figure out what the destination indices are */ corr = bilo - ajlo; ilod = jlos + corr; ihid = jhis + corr; corr = bjlo - ailo; jlod = ilos + corr; jhid = ihis + corr; } /* Put it where it belongs */ lo[0] = ilod; lo[1] = jlod; hi[0] = ihid; hi[1] = jhid; pnga_put(g_b, lo, hi, dbl_ptrA, &ld); /* Get rid of local memory if we used it */ if( transp == 't') ga_free(dbl_ptrB); } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_ddot_patch_dp = pnga_ddot_patch_dp #endif DoublePrecision pnga_ddot_patch_dp(g_a, t_a, ailo, aihi, ajlo, ajhi, g_b, t_b, bilo, bihi, bjlo, bjhi) Integer g_a, ailo, aihi, ajlo, ajhi; /* patch of g_a */ Integer g_b, bilo, bihi, bjlo, bjhi; /* patch of g_b */ char *t_a, *t_b; /* transpose operators */ { Integer atype, btype, adim1, adim2, bdim1, bdim2; Integer iloA, ihiA, jloA, jhiA, ldA; Integer iloB, ihiB, jloB, jhiB, ldB; Integer alo[2], ahi[2]; Integer blo[2], bhi[2]; Integer g_A = g_a; Integer me= pnga_nodeid(), i, j, temp_created=0; Integer corr, nelem; char transp, transp_a, transp_b; DoublePrecision sum = 0.; DoublePrecision *dbl_ptrA; DoublePrecision *dbl_ptrB; Integer ndim, dims[2]; pnga_check_handle(g_a, "pnga_ddot_patch_dp"); pnga_check_handle(g_b, "pnga_ddot_patch_dp"); pnga_inquire(g_a, &atype, &ndim, dims); adim1 = dims[0]; adim2 = dims[1]; pnga_inquire(g_b, &btype, &ndim, dims); bdim1 = dims[0]; bdim2 = dims[1]; if(atype != btype || (atype != C_DBL )) pnga_error("pnga_ddot_patch_dp: wrong types ", 0L); /* check if patch indices and g_a dims match */ if (ailo <= 0 || aihi > adim1 || ajlo <= 0 || ajhi > adim2) pnga_error(" pnga_ddot_patch_dp: g_a indices out of range ", 0L); /* check if patch indices and g_b dims match */ if (bilo <= 0 || bihi > bdim1 || bjlo <= 0 || bjhi > bdim2) pnga_error(" pnga_ddot_patch_dp: g_b indices out of range ", 0L); /* is transpose operation required ? */ /* -- only if for one array transpose operation requested*/ transp_a = (*t_a == 'n' || *t_a =='N')? 'n' : 't'; transp_b = (*t_b == 'n' || *t_b =='N')? 'n' : 't'; transp = (transp_a == transp_b)? 'n' : 't'; if(transp == 't') pnga_error(" pnga_ddot_patch_dp: transpose operators don't match: ", me); /* find out coordinates of patches of g_A and g_B that I own */ pnga_distribution(g_A, me, alo, ahi); iloA = alo[0]; jloA = alo[1]; ihiA = ahi[0]; jhiA = ahi[1]; if (patch_intersect(ailo, aihi, ajlo, ajhi, &iloA, &ihiA, &jloA, &jhiA)){ pnga_access_ptr(g_A, alo, ahi, &dbl_ptrA, &ldA); nelem = (ihiA-iloA+1)*(jhiA-jloA+1); corr = bilo - ailo; iloB = iloA + corr; ihiB = ihiA + corr; corr = bjlo - ajlo; jloB = jloA + corr; jhiB = jhiA + corr; blo[0] = iloB; blo[1] = jloB; bhi[0] = ihiB; bhi[1] = jhiB; if(own_patch(g_b, iloB, ihiB, jloB, jhiB)){ /* all the data is local */ pnga_access_ptr(g_b, blo, bhi, &dbl_ptrB, &ldB); }else{ /* data is remote -- get it to temp storage*/ temp_created =1; dbl_ptrB = (DoublePrecision*)ga_malloc(nelem, MT_F_DBL, "ddot_dp_b"); ldB = ihiB-iloB+1; pnga_get(g_b, blo, bhi, dbl_ptrB, &ldB); } sum = 0.; for(j=0; j< jhiA-jloA+1; j++) for(i=0; i< ihiA-iloA+1; i++) sum += *(dbl_ptrA + j*ldA + i) * *(dbl_ptrB + j*ldB + i); pnga_release(g_A, alo, ahi); if(temp_created) ga_free(dbl_ptrB); else pnga_release(g_b, blo, bhi); } return sum; } ga-5-4/global/src/ga_profile.c0000644000175000017500000002342412662210457014344 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: ga_profile.c,v 1.5 2005-07-21 08:13:26 manoj Exp $ */ /** * Note #1: Right now, only process 0's profile is printed. * Each and every process saves its profile in the correspoding data struture. * However profiler prints process 0's profile when ga_profile_terminate() * is called. Do the corresponding changes in ga_profile_terminate() to * print the profile of other processes. * * Note #2: By default profiles prints message ranges #s 21. Example: range 10 * corresponds to message ranges from 1024 bytes to 2047 bytes. * Message ranges are in the power of 2. for ex: * ------------------------------------ * MSG_RANGE (r) BYTES (2^r to 2^(r+1)-1) * ------------------------------------ * 0 0-1 * 1 2-3 * 2 4-7 * ... ... * 10 1024-2047 bytes * ... ... * 20 1MB - (2MB-1) * 21 >= 2MB * ------------------------------------- * * Note#3: If Stride information needs to be printed, set GA_PRINT_STRIDE. * Stride information is printed in ga_profile_terminate() for a various * selective message ranges and event types. Modify according to your needs. */ #ifdef ENABLE_PROFILE #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MATH_H # include #endif #include "globalp.h" #include "base.h" #include "ga_profile.h" #include "ga-papi.h" #include "ga-wapi.h" #ifndef MSG_COMMS_MPI # include "tcgmsg.h" # define MP_TIMER tcg_time #else # include "mpi.h" # define MP_TIMER MPI_Wtime #endif #define GA_PRINT_STRIDE 1 #define GA_MAX_MSG_RANGE 21 #if GA_PRINT_STRIDE #define STRIDE_COUNT 1000 typedef struct ga_stride { int ndim; int lo[GA_MAX_DIM]; int hi[GA_MAX_DIM]; char name[FNAM+1]; double time; }ga_stride_t; #endif #define GA_EVENTS 6 /* get, put, acc, Non-Contiguous get, put, acc*/ enum events {GET, /* Contiguous get */ PUT, ACC, NC_GET, /* Non contiguous Get */ NC_PUT, NC_ACC }; char *event_name[GA_EVENTS] = {"GET", "PUT", "ACC", "NON CONTIGUOUS GET", "NON CONTIGUOUS PUT", "NON CONTIGUOUS ACC"}; typedef struct ga_profile { int count; /* number of times called */ double exectime; /* total execution time for "count" calls */ #if GA_PRINT_STRIDE ga_stride_t stride[STRIDE_COUNT]; #endif }ga_profile_t; /* profile get/put/acc for various message ranges (i.e GA_MAX_MSG_RANGE) */ static ga_profile_t GA_PROF[GA_EVENTS][GA_MAX_MSG_RANGE]; /* Current event */ struct event_info { int event_type; int range; int is_set; double start_time; } gCURRENT_EVNT; void ga_profile_init() { int i,j; if(pnga_nodeid()==0) {printf("\nProfiling GA - ON\n");fflush(stdout);} for(i=0; i=GA_MAX_MSG_RANGE) range = GA_MAX_MSG_RANGE; /* check contiguous or non-contiguous */ for(i=0; i1) non_contig=1; /* i.e. non-contiguous */ switch(comm_type) { case ENABLE_PROFILE_PUT: if(non_contig) event_type = NC_PUT; else event_type = PUT; break; case ENABLE_PROFILE_GET: if(non_contig) event_type = NC_GET; else event_type = GET; break; case ENABLE_PROFILE_ACC: if(non_contig) event_type = NC_ACC; else event_type = ACC; break; default: pnga_error("ENABLE_PROFILE: Invalid communication type", 0L); } /* set the curent event for timer */ ga_profile_set_event(event_type, range); /* profile update: i.e. update event count */ GA_PROF[event_type][range].count++; #if GA_PRINT_STRIDE { int idx = GA_PROF[event_type][range].count-1; if(idx%d)\n", pnga_nodeid(), GA_PROF[GET][i].count, GA_PROF[PUT][i].count, GA_PROF[ACC][i].count, 1<%d)\n",pnga_nodeid(), GA_PROF[NC_GET][i].count, GA_PROF[NC_PUT][i].count, GA_PROF[NC_ACC][i].count, 1<%d)\n", pnga_nodeid(), GA_PROF[GET][i].exectime, GA_PROF[PUT][i].exectime, GA_PROF[ACC][i].exectime, 1<%d)\n", pnga_nodeid(), GA_PROF[NC_GET][i].exectime, GA_PROF[NC_PUT][i].exectime, GA_PROF[NC_ACC][i].exectime, 1<=STRIDE_COUNT) break; time += GA_PROF[event][range].stride[i].time; ndim = GA_PROF[event][range].stride[i].ndim; printf("%d\t%d %.2e (",i, ndim, GA_PROF[event][range].stride[i].time); for(j=0;j "); for(j=0;j *(b)) #define GE(a,b) (*(a) >= *(b)) #define INDEX_SORT(base,pn,SWAP){\ unsigned long gap, g;\ Integer *p, *q, *hi, n=*pn;\ Integer *base0=base - 1;\ \ gap = n >>1;\ hi = base0 + gap + gap;\ if (n & 1) hi ++;\ \ for ( ; gap != 1; gap--) {\ for (p = base0 + (g = gap) ; (q = p + g) <= hi ; p = q) {\ g += g;\ if (q != hi && GT(q+1, q)) {\ q++;\ g++;\ }\ if (GE(p,q)) break;\ SWAP(p , q);\ }\ }\ \ for ( ; hi != base ; hi--) {\ p = base;\ for (g = 1 ; (q = p + g) <= hi ; p = q) {\ g += g;\ if (q != hi && GT(q+1,q)) {\ q++;\ g++;\ }\ if (GE(p,q)) break;\ SWAP(p, q);\ }\ SWAP(base, hi);\ }\ } static void ga_sort_scat_dcpl_(pn, v, i, j, base) Integer *pn; DoubleComplex *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ DoubleComplex dtmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } static void ga_sort_scat_scpl_(pn, v, i, j, base) Integer *pn; SingleComplex *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ SingleComplex dtmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } void ga_sort_permutation(pn, index, base) Integer *pn; Integer *index; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ Integer itmp;\ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ itmp=index[ia]; index[ia]=index[ib]; index[ib] = itmp;\ } INDEX_SORT(base,pn,SWAP); } static void ga_sort_scat_dbl_(pn, v, i, j, base) Integer *pn; DoublePrecision *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ DoublePrecision dtmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } static void ga_sort_scat_int_(pn, v, i, j, base) Integer *pn; int *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ int ltmp; \ int dtmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } static void ga_sort_scat_long_(pn, v, i, j, base) Integer *pn; long *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ long ltmp; \ long dtmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } static void ga_sort_scat_flt_(pn, v, i, j, base) Integer *pn; float *v; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ float dtmp; \ int ia = a - base; \ int ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ dtmp=v[ia]; v[ia]=v[ib]; v[ib]=dtmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } void ga_sort_scat(pn, v, i, j, base, type) Integer *pn; void *v; Integer *i; Integer *j; Integer *base; Integer type; { switch (type){ case C_DBL: ga_sort_scat_dbl_(pn, (double*)v, i,j,base);break; case C_DCPL: ga_sort_scat_dcpl_(pn, (DoubleComplex*)v, i,j,base); break; case C_SCPL: ga_sort_scat_scpl_(pn, (SingleComplex*)v, i,j,base); break; case C_INT: ga_sort_scat_int_(pn, (int*)v, i, j, base); break; case C_FLOAT: ga_sort_scat_flt_(pn, (float*)v, i, j, base); break; case C_LONG: ga_sort_scat_long_(pn, (long*)v, i, j, base); break; default: pnga_error("ERROR:ga_sort_scat: wrong type",type); } } void ga_sort_gath(pn, i, j, base) Integer *pn; Integer *i; Integer *j; Integer *base; { if (*pn < 2) return; # undef SWAP # define SWAP(a,b) { \ Integer ltmp; \ long ia = a - base; \ long ib = b - base; \ ltmp=*a; *a=*b; *b=ltmp; \ ltmp=i[ia]; i[ia]=i[ib]; i[ib]=ltmp; \ ltmp=j[ia]; j[ia]=j[ib]; j[ib]=ltmp; \ } INDEX_SORT(base,pn,SWAP); } void gai_hsort(Integer *list, int num) { if(num<2) return; # undef SWAP # define SWAP(a,b) { Integer ltmp; ltmp=*a; *a=*b; *b=ltmp;} INDEX_SORT(list,&num,SWAP); } ga-5-4/global/src/ga_solve_seq.c0000644000175000017500000003060112662210457014677 0ustar mbamba/** * GA_Lu_solve_seq.c: Implemented with CLINPACK routines. Uses LINPACK * routines if ENABLE_F77 is not defined, * else uses internal or external lapack. */ #if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_MATH_H # include #endif #include "globalp.h" #include "macdecls.h" #include "ga-papi.h" #include "ga-wapi.h" #include "galinalg.h" #define REAL double #define ZERO 0.0e0 #define ONE 1.0e0 /*----------------------*/ void LP_daxpy(n,da,dx,incx,dy,incy) /* constant times a vector plus a vector. jack dongarra, linpack, 3/11/78. */ REAL dx[],dy[],da; int incx,incy,n; { int i,ix,iy; if(n <= 0) return; if (da == ZERO) return; if(incx != 1 || incy != 1) { /* code for unequal increments or equal increments not equal to 1 */ ix = 0; iy = 0; if(incx < 0) ix = (-n+1)*incx; if(incy < 0)iy = (-n+1)*incy; for (i = 0;i < n; i++) { dy[iy] = dy[iy] + da*dx[ix]; ix = ix + incx; iy = iy + incy; } return; } /* code for both increments equal to 1 */ #ifdef ROLL for (i = 0;i < n; i++) { dy[i] = dy[i] + da*dx[i]; } #endif #ifdef UNROLL m = n % 4; if ( m != 0) { for (i = 0; i < m; i++) dy[i] = dy[i] + da*dx[i]; if (n < 4) return; } for (i = m; i < n; i = i + 4) { dy[i] = dy[i] + da*dx[i]; dy[i+1] = dy[i+1] + da*dx[i+1]; dy[i+2] = dy[i+2] + da*dx[i+2]; dy[i+3] = dy[i+3] + da*dx[i+3]; } #endif } /*----------------------*/ REAL LP_ddot(n,dx,incx,dy,incy) /* forms the dot product of two vectors. jack dongarra, linpack, 3/11/78. */ REAL dx[],dy[]; int incx,incy,n; { REAL dtemp; int i,ix,iy; dtemp = ZERO; if(n <= 0) return(ZERO); if(incx != 1 || incy != 1) { /* code for unequal increments or equal increments not equal to 1 */ ix = 0; iy = 0; if (incx < 0) ix = (-n+1)*incx; if (incy < 0) iy = (-n+1)*incy; for (i = 0;i < n; i++) { dtemp = dtemp + dx[ix]*dy[iy]; ix = ix + incx; iy = iy + incy; } return(dtemp); } /* code for both increments equal to 1 */ #ifdef ROLL for (i=0;i < n; i++) dtemp = dtemp + dx[i]*dy[i]; #endif #ifdef UNROLL m = n % 5; if (m != 0) { for (i = 0; i < m; i++) dtemp = dtemp + dx[i]*dy[i]; if (n < 5) return(dtemp); } for (i = m; i < n; i = i + 5) { dtemp = dtemp + dx[i]*dy[i] + dx[i+1]*dy[i+1] + dx[i+2]*dy[i+2] + dx[i+3]*dy[i+3] + dx[i+4]*dy[i+4]; } #endif return(dtemp); } /*----------------------*/ void LP_dscal(n,da,dx,incx) /* scales a vector by a constant. jack dongarra, linpack, 3/11/78. */ REAL da,dx[]; int n, incx; { int i,nincx; if(n <= 0)return; if(incx != 1) { /* code for increment not equal to 1 */ nincx = n*incx; for (i = 0; i < nincx; i = i + incx) dx[i] = da*dx[i]; return; } /* code for increment equal to 1 */ #ifdef ROLL for (i = 0; i < n; i++) dx[i] = da*dx[i]; #endif #ifdef UNROLL m = n % 5; if (m != 0) { for (i = 0; i < m; i++) dx[i] = da*dx[i]; if (n < 5) return; } for (i = m; i < n; i = i + 5){ dx[i] = da*dx[i]; dx[i+1] = da*dx[i+1]; dx[i+2] = da*dx[i+2]; dx[i+3] = da*dx[i+3]; dx[i+4] = da*dx[i+4]; } #endif } /*----------------------*/ int LP_idamax(n,dx,incx) /* finds the index of element having max. absolute value. jack dongarra, linpack, 3/11/78. */ REAL dx[]; int incx,n; { REAL dmax; int i, ix, itemp = 0; if( n < 1 ) return(-1); if(n ==1 ) return(0); if(incx != 1) { /* code for increment not equal to 1 */ ix = 1; dmax = fabs((double)dx[0]); ix = ix + incx; for (i = 1; i < n; i++) { if(fabs((double)dx[ix]) > dmax) { itemp = i; dmax = fabs((double)dx[ix]); } ix = ix + incx; } } else { /* code for increment equal to 1 */ itemp = 0; dmax = fabs((double)dx[0]); for (i = 1; i < n; i++) { if(fabs((double)dx[i]) > dmax) { itemp = i; dmax = fabs((double)dx[i]); } } } return (itemp); } /*----------------------*/ void LP_dgefa(a,lda,n,ipvt,info) REAL a[]; int lda,n,ipvt[],*info; /* We would like to declare a[][lda], but c does not allow it. In this function, references to a[i][j] are written a[lda*i+j]. */ /* LP_dgefa factors a double precision matrix by gaussian elimination. LP_dgefa is usually called by dgeco, but it can be called directly with a saving in time if rcond is not needed. (time for dgeco) = (1 + 9/n)*(time for LP_dgefa) . on entry a REAL precision[n][lda] the matrix to be factored. lda integer the leading dimension of the array a . n integer the order of the matrix a . on return a an upper triangular matrix and the multipliers which were used to obtain it. the factorization can be written a = l*u where l is a product of permutation and unit lower triangular matrices and u is upper triangular. ipvt integer[n] an integer vector of pivot indices. info integer = 0 normal value. = k if u[k][k] .eq. 0.0 . this is not an error condition for this subroutine, but it does indicate that LP_dgesl or dgedi will divide by zero if called. use rcond in dgeco for a reliable indication of singularity. linpack. this version dated 08/14/78 . cleve moler, university of new mexico, argonne national lab. functions blas LP_daxpy,LP_dscal,LP_idamax */ { /* internal variables */ REAL t; int j,k,kp1,l,nm1; /* gaussian elimination with partial pivoting */ *info = 0; nm1 = n - 1; if (nm1 >= 0) { for (k = 0; k < nm1; k++) { kp1 = k + 1; /* find l = pivot index */ l = LP_idamax(n-k,&a[lda*k+k],1) + k; ipvt[k] = l; /* zero pivot implies this column already triangularized */ if (a[lda*k+l] != ZERO) { /* interchange if necessary */ if (l != k) { t = a[lda*k+l]; a[lda*k+l] = a[lda*k+k]; a[lda*k+k] = t; } /* compute multipliers */ t = -ONE/a[lda*k+k]; LP_dscal(n-(k+1),t,&a[lda*k+k+1],1); /* row elimination with column indexing */ for (j = kp1; j < n; j++) { t = a[lda*j+l]; if (l != k) { a[lda*j+l] = a[lda*j+k]; a[lda*j+k] = t; } LP_daxpy(n-(k+1),t,&a[lda*k+k+1],1, &a[lda*j+k+1],1); } } else { *info = k; } } } ipvt[n-1] = n-1; if (a[lda*(n-1)+(n-1)] == ZERO) *info = n-1; } /*----------------------*/ void LP_dgesl(a,lda,n,ipvt,b,job) int lda,n,ipvt[],job; REAL a[],b[]; /* We would like to declare a[][lda], but c does not allow it. In this function, references to a[i][j] are written a[lda*i+j]. */ /* LP_dgesl solves the double precision system a * x = b or trans(a) * x = b using the factors computed by dgeco or LP_dgefa. on entry a double precision[n][lda] the output from dgeco or LP_dgefa. lda integer the leading dimension of the array a . n integer the order of the matrix a . ipvt integer[n] the pivot vector from dgeco or LP_dgefa. b double precision[n] the right hand side vector. job integer = 0 to solve a*x = b , = nonzero to solve trans(a)*x = b where trans(a) is the transpose. on return b the solution vector x . error condition a division by zero will occur if the input factor contains a zero on the diagonal. technically this indicates singularity but it is often caused by improper arguments or improper setting of lda . it will not occur if the subroutines are called correctly and if dgeco has set rcond .gt. 0.0 or LP_dgefa has set info .eq. 0 . to compute inverse(a) * c where c is a matrix with p columns dgeco(a,lda,n,ipvt,rcond,z) if (!rcond is too small){ for (j=0,j= 1) { for (k = 0; k < nm1; k++) { l = ipvt[k]; t = b[l]; if (l != k){ b[l] = b[k]; b[k] = t; } LP_daxpy(n-(k+1),t,&a[lda*k+k+1],1,&b[k+1],1); } } /* now solve u*x = y */ for (kb = 0; kb < n; kb++) { k = n - (kb + 1); b[k] = b[k]/a[lda*k+k]; t = -b[k]; LP_daxpy(k,t,&a[lda*k+0],1,&b[0],1); } } else { /* job = nonzero, solve trans(a) * x = b first solve trans(u)*y = b */ for (k = 0; k < n; k++) { t = LP_ddot(k,&a[lda*k+0],1,&b[0],1); b[k] = (b[k] - t)/a[lda*k+k]; } /* now solve trans(l)*x = y */ if (nm1 >= 1) { for (kb = 1; kb < nm1; kb++) { k = n - (kb+1); b[k] = b[k] + LP_ddot(n-(k+1),&a[lda*k+k+1],1,&b[k+1],1); l = ipvt[k]; if (l != k) { t = b[l]; b[l] = b[k]; b[k] = t; } } } } } /** * solve the set of linear equations * * AX = B * * with possibly multiple rhs stored as columns of matrix B * the matrix A is not destroyed */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_lu_solve_seq = pnga_lu_solve_seq #endif void pnga_lu_solve_seq(char *trans, Integer g_a, Integer g_b) { logical oactive; /* true iff this process participates */ Integer dimA1, dimA2, typeA; Integer dimB1, dimB2, typeB; Integer me; #if HAVE_LAPACK || ENABLE_F77 BlasInt blas_dimA1, blas_dimA2, blas_dimB1, blas_dimB2, info=0; #else Integer info=0; #endif Integer dims[2], ndim; Integer lo[2], hi[2]; /** check environment */ me = pnga_nodeid(); /** check GA info for input arrays */ pnga_check_handle(g_a, "ga_lu_solve: a"); pnga_check_handle(g_b, "ga_lu_solve: b"); pnga_inquire(g_a, &typeA, &ndim, dims); dimA1 = dims[0]; dimA2 = dims[1]; pnga_inquire(g_b, &typeB, &ndim, dims); dimB1 = dims[0]; dimB2 = dims[1]; GA_PUSH_NAME("ga_lu_solve_seq"); if (dimA1 != dimA2) pnga_error("ga_lu_solve: g_a must be square matrix ", 1); else if(dimA1 != dimB1) pnga_error("ga_lu_solve: dims of A and B do not match ", 1); else if(typeA != C_DBL || typeB != C_DBL) pnga_error("ga_lu_solve: wrong type(s) of A and/or B ", 1); pnga_sync(); oactive = (me == 0); if (oactive) { DoublePrecision *adra, *adrb; Integer *adri; Integer one=1; /** allocate a,b, and work and ipiv arrays */ adra = (DoublePrecision*) ga_malloc(dimA1*dimA2, F_DBL, "a"); adrb = (DoublePrecision*) ga_malloc(dimB1*dimB2, F_DBL, "b"); adri = (Integer*) ga_malloc(GA_MIN(dimA1,dimA2), F_INT, "ipiv"); /** Fill local arrays from global arrays */ lo[0] = one; hi[0] = dimA1; lo[1] = one; hi[1] = dimA2; pnga_get(g_a, lo, hi, adra, &dimA1); lo[0] = one; hi[0] = dimB1; lo[1] = one; hi[1] = dimB2; pnga_get(g_b, lo, hi, adrb, &dimB1); /** LU factorization */ #if HAVE_LAPACK || ENABLE_F77 blas_dimA1 = dimA1; blas_dimA2 = dimA2; blas_dimB1 = dimB1; blas_dimB2 = dimB2; LAPACK_DGETRF(&blas_dimA1, &blas_dimA2, adra, &blas_dimA1, adri, &info); #else { int info_t; LP_dgefa(adra, (int)dimA1, (int)dimA2, (int*)adri, &info_t); info = info_t; } #endif /** SOLVE */ if(info == 0) { #if HAVE_LAPACK || ENABLE_F77 LAPACK_DGETRS(trans, &blas_dimA1, &blas_dimB2, adra, &blas_dimA1, adri, adrb, &blas_dimB1, &info); #else DoublePrecision *p_b; Integer i; int job=0; if(*trans == 't' || *trans == 'T') job = 1; for(i=0; i #endif #if HAVE_STRING_H # include #endif #include "message.h" #include "globalp.h" #include "armci.h" #include "ga-papi.h" #include "ga-wapi.h" #ifdef MSG_COMMS_MPI extern ARMCI_Group* ga_get_armci_group_(int); #endif /* work arrays used in all routines */ static Integer dims[MAXDIM], ld[MAXDIM-1]; static Integer lo[MAXDIM],hi[MAXDIM]; static Integer one_arr[MAXDIM]={1,1,1,1,1,1,1}; #define GET_ELEMS(ndim,lo,hi,ld,pelems){\ int _i;\ for(_i=0, *pelems = hi[ndim-1]-lo[ndim-1]+1; _i< ndim-1;_i++) {\ if(ld[_i] != (hi[_i]-lo[_i]+1)) pnga_error("layout problem",_i);\ *pelems *= hi[_i]-lo[_i]+1;\ }\ } #define GET_ELEMS_W_GHOSTS(ndim,lo,hi,ld,pelems){\ int _i;\ for(_i=0, *pelems = hi[ndim-1]-lo[ndim-1]+1; _i< ndim-1;_i++) {\ if(ld[_i] < (hi[_i]-lo[_i]+1))\ pnga_error("layout problem with ghosts",_i);\ *pelems *= hi[_i]-lo[_i]+1;\ }\ } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_zero = pnga_zero #endif void pnga_zero(Integer g_a) { Integer ndim, type, me, elems, p_handle; Integer num_blocks; void *ptr; /*register Integer i;*/ int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ p_handle = pnga_get_pgroup(g_a); if(local_sync_begin) pnga_pgroup_sync(p_handle); me = pnga_pgroup_nodeid(p_handle); pnga_check_handle(g_a, "ga_zero"); GA_PUSH_NAME("ga_zero"); num_blocks = pnga_total_blocks(g_a); pnga_inquire(g_a, &type, &ndim, dims); if (num_blocks < 0) { pnga_distribution(g_a, me, lo, hi); if ( lo[0]> 0 ){ /* base index is 1: we get 0 if no elements stored on p */ if (pnga_has_ghosts(g_a)) { pnga_zero_patch(g_a,lo,hi); return; } pnga_access_ptr(g_a, lo, hi, &ptr, ld); GET_ELEMS(ndim,lo,hi,ld,&elems); /* switch (type){ */ /* int *ia; */ /* double *da; */ /* float *fa; */ /* long *la; */ /* long long *lla; */ /* case C_INT: */ /* ia = (int*)ptr; */ /* for(i=0;i0){ pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); if (pnga_has_ghosts(g_a)) { GET_ELEMS_W_GHOSTS(ndim,lo,hi,ld,&elems); } else { GET_ELEMS(ndim,lo,hi,ld,&elems); } } pnga_distribution(g_b, me, lo, hi); if(lo[0]>0){ pnga_access_ptr(g_b, lo, hi, &ptr_b, ld); if (pnga_has_ghosts(g_b)) { GET_ELEMS_W_GHOSTS(ndim,lo,hi,ld,&elems); } else { GET_ELEMS(ndim,lo,hi,ld,&elems); } } if(elems!= elemsb)pnga_error("inconsistent number of elements",elems-elemsb); if(elems>0){ ARMCI_Copy(ptr_a, ptr_b, (int)elems*GAsizeofM(type)); pnga_release(g_a,lo,hi); pnga_release(g_b,lo,hi); } pnga_sync(); } GA_POP_NAME; } #endif /*\ COPY ONE GLOBAL ARRAY INTO ANOTHER \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_copy = pnga_copy #endif void pnga_copy(Integer g_a, Integer g_b) { Integer ndim, ndimb, type, typeb, me_a, me_b; Integer dimsb[MAXDIM],i; Integer a_grp, b_grp, anproc, bnproc; Integer num_blocks_a, num_blocks_b; Integer blocks[MAXDIM], block_dims[MAXDIM]; void *ptr_a, *ptr_b; int local_sync_begin,local_sync_end,use_put; GA_PUSH_NAME("ga_copy"); local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ a_grp = pnga_get_pgroup(g_a); b_grp = pnga_get_pgroup(g_b); me_a = pnga_pgroup_nodeid(a_grp); me_b = pnga_pgroup_nodeid(b_grp); anproc = pnga_get_pgroup_size(a_grp); bnproc = pnga_get_pgroup_size(b_grp); num_blocks_a = pnga_total_blocks(g_a); num_blocks_b = pnga_total_blocks(g_b); if (anproc <= bnproc) { use_put = 1; } else { use_put = 0; } /*if (a_grp != b_grp) pnga_error("Both arrays must be defined on same group",0L); */ if(local_sync_begin) { if (anproc <= bnproc) { pnga_pgroup_sync(a_grp); } else if (a_grp == pnga_pgroup_get_world() && b_grp == pnga_pgroup_get_world()) { pnga_sync(); } else { pnga_pgroup_sync(b_grp); } } if(g_a == g_b) pnga_error("arrays have to be different ", 0L); pnga_inquire(g_a, &type, &ndim, dims); pnga_inquire(g_b, &typeb, &ndimb, dimsb); if(type != typeb) pnga_error("types not the same", g_b); if(ndim != ndimb) pnga_error("dimensions not the same", ndimb); for(i=0; i< ndim; i++)if(dims[i]!=dimsb[i]) pnga_error("dimensions not the same",i); if ((pnga_is_mirrored(g_a) && pnga_is_mirrored(g_b)) || (!pnga_is_mirrored(g_a) && !pnga_is_mirrored(g_b))) { /* Both global arrays are mirrored or both global arrays are not mirrored. Copy operation is straightforward */ if (use_put) { if (num_blocks_a < 0) { pnga_distribution(g_a, me_a, lo, hi); if(lo[0]>0){ pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); pnga_put(g_b, lo, hi, ptr_a, ld); } } else { if (!pnga_uses_proc_grid(g_a)) { for (i=me_a; i0) { pnga_access_block_ptr(g_a, i, &ptr_a, ld); pnga_put(g_b, lo, hi, ptr_a, ld); } } } else { Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM], chk; pnga_get_proc_index(g_a, me_a, proc_index); pnga_get_proc_index(g_a, me_a, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); while (index[ndim-1] < blocks[ndim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < ndim; i++) { lo[i] = index[i]*block_dims[i]+1; hi[i] = (index[i] + 1)*block_dims[i]; if (hi[i] > dims[i]) hi[i] = dims[i]; if (hi[i] < lo[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr_a, ld); pnga_put(g_b, lo, hi, ptr_a, ld); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < ndim; i++) { if (index[i] >= blocks[i] && i0){ pnga_access_ptr(g_b, lo, hi, &ptr_b, ld); pnga_get(g_a, lo, hi, ptr_b, ld); } } else { if (!pnga_uses_proc_grid(g_a)) { for (i=me_b; i0) { pnga_access_block_ptr(g_b, i, &ptr_b, ld); pnga_get(g_a, lo, hi, ptr_b, ld); } } } else { Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM], chk; pnga_get_proc_index(g_b, me_b, proc_index); pnga_get_proc_index(g_b, me_b, index); pnga_get_block_info(g_b, blocks, block_dims); pnga_get_proc_grid(g_b, topology); while (index[ndim-1] < blocks[ndim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < ndim; i++) { lo[i] = index[i]*block_dims[i]+1; hi[i] = (index[i] + 1)*block_dims[i]; if (hi[i] > dims[i]) hi[i] = dims[i]; if (hi[i] < lo[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_b, index, &ptr_b, ld); pnga_get(g_a, lo, hi, ptr_b, ld); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < ndim; i++) { if (index[i] >= blocks[i] && i0) { pnga_access_ptr(g_b, lo, hi, &ptr_b, ld); pnga_get(g_a, lo, hi, ptr_b, ld); } } else { /* source array is distributed and destination array is mirrored */ pnga_zero(g_b); pnga_distribution(g_a, me_a, lo, hi); if (lo[0] > 0) { pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); pnga_put(g_b, lo, hi, ptr_a, ld); } pnga_merge_mirrored(g_b); } } if(local_sync_end) { if (anproc <= bnproc) { pnga_pgroup_sync(a_grp); } else if (a_grp == pnga_pgroup_get_world() && b_grp == pnga_pgroup_get_world()) { pnga_sync(); } else { pnga_pgroup_sync(b_grp); } } GA_POP_NAME; } /*\ internal version of dot product \*/ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_dot = pnga_dot #endif void pnga_dot(int Type, Integer g_a, Integer g_b, void *value) { Integer ndim=0, type=0, atype=0, me=0, elems=0, elemsb=0; register Integer i=0; int isum=0; long lsum=0; long long llsum=0; DoubleComplex zsum ={0.,0.}; SingleComplex csum ={0.,0.}; float fsum=0.0; void *ptr_a=NULL, *ptr_b=NULL; int alen=0; Integer a_grp=0, b_grp=0; Integer num_blocks_a=0, num_blocks_b=0; Integer andim, adims[MAXDIM]; Integer bndim, bdims[MAXDIM]; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ GA_PUSH_NAME("ga_dot"); a_grp = pnga_get_pgroup(g_a); b_grp = pnga_get_pgroup(g_b); if (a_grp != b_grp) pnga_error("Both arrays must be defined on same group",0L); me = pnga_pgroup_nodeid(a_grp); /* Check to see if either GA is block cyclic distributed */ num_blocks_a = pnga_total_blocks(g_a); num_blocks_b = pnga_total_blocks(g_b); if (num_blocks_a >= 0 || num_blocks_b >= 0) { pnga_inquire(g_a, &type, &andim, adims); pnga_inquire(g_b, &type, &bndim, bdims); pnga_dot_patch(g_a, "n", one_arr, adims, g_b, "n", one_arr, bdims, value); GA_POP_NAME; return; } if(pnga_compare_distr(g_a,g_b) == FALSE || pnga_has_ghosts(g_a) || pnga_has_ghosts(g_b)) { /* distributions not identical */ pnga_inquire(g_a, &type, &andim, adims); pnga_inquire(g_b, &type, &bndim, bdims); pnga_dot_patch(g_a, "n", one_arr, adims, g_b, "n", one_arr, bdims, value); GA_POP_NAME; return; } pnga_pgroup_sync(a_grp); pnga_inquire(g_a, &type, &ndim, dims); if(type != Type) pnga_error("type not correct", g_a); pnga_distribution(g_a, me, lo, hi); if(lo[0]>0){ pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); if (pnga_has_ghosts(g_a)) { GET_ELEMS_W_GHOSTS(ndim,lo,hi,ld,&elems); } else { GET_ELEMS(ndim,lo,hi,ld,&elems); } } if(g_a == g_b){ elemsb = elems; ptr_b = ptr_a; }else { pnga_inquire(g_b, &type, &ndim, dims); if(type != Type) pnga_error("type not correct", g_b); pnga_distribution(g_b, me, lo, hi); if(lo[0]>0){ pnga_access_ptr(g_b, lo, hi, &ptr_b, ld); if (pnga_has_ghosts(g_b)) { GET_ELEMS_W_GHOSTS(ndim,lo,hi,ld,&elemsb); } else { GET_ELEMS(ndim,lo,hi,ld,&elemsb); } } } if(elems!= elemsb)pnga_error("inconsistent number of elements",elems-elemsb); /* compute "local" contribution to the dot product */ switch (type){ int *ia, *ib; double *da,*db; float *fa, *fb; long *la,*lb; long long *lla,*llb; case C_INT: ia = (int*)ptr_a; ib = (int*)ptr_b; for(i=0;i0){ pnga_release(g_a, lo, hi); if(g_a != g_b)pnga_release(g_b, lo, hi); } /*convert from C data type to ARMCI type */ switch(type) { case C_FLOAT: atype=ARMCI_FLOAT; break; case C_DBL: atype=ARMCI_DOUBLE; break; case C_INT: atype=ARMCI_INT; break; case C_LONG: atype=ARMCI_LONG; break; case C_LONGLONG: atype=ARMCI_LONG_LONG; break; case C_DCPL: atype=ARMCI_DOUBLE; break; case C_SCPL: atype=ARMCI_FLOAT; break; default: pnga_error("pnga_dot: type not supported",type); } if (pnga_is_mirrored(g_a) && pnga_is_mirrored(g_b)) { armci_msg_gop_scope(SCOPE_NODE,value,alen,"+",atype); } else { if (a_grp == -1) { armci_msg_gop_scope(SCOPE_ALL,value,alen,"+",atype); #ifdef MSG_COMMS_MPI } else { armci_msg_group_gop_scope(SCOPE_ALL,value,alen,"+",atype, ga_get_armci_group_((int)a_grp)); #endif } } GA_POP_NAME; } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_scale = pnga_scale #endif void pnga_scale(Integer g_a, void* alpha) { Integer ndim, type, me, elems, grp_id; register Integer i; Integer num_blocks; void *ptr; int local_sync_begin,local_sync_end; local_sync_begin = _ga_sync_begin; local_sync_end = _ga_sync_end; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ grp_id = pnga_get_pgroup(g_a); if(local_sync_begin)pnga_pgroup_sync(grp_id); me = pnga_pgroup_nodeid(grp_id); pnga_check_handle(g_a, "ga_scale"); GA_PUSH_NAME("ga_scale"); num_blocks = pnga_total_blocks(g_a); pnga_inquire(g_a, &type, &ndim, dims); if (num_blocks < 0) { pnga_distribution(g_a, me, lo, hi); if (pnga_has_ghosts(g_a)) { pnga_scale_patch(g_a, lo, hi, alpha); return; } if ( lo[0]> 0 ){ /* base index is 1: we get 0 if no elements stored on p */ pnga_access_ptr(g_a, lo, hi, &ptr, ld); GET_ELEMS(ndim,lo,hi,ld,&elems); switch (type){ int *ia; double *da; DoubleComplex *ca, scale; SingleComplex *cfa, cfscale; long *la; long long *lla; float *fa; case C_INT: ia = (int*)ptr; for(i=0;i 0 || pnga_total_blocks(g_b) > 0 || pnga_total_blocks(g_c) > 0) { /* distributions not identical */ pnga_inquire(g_a, &type, &andim, adims); pnga_inquire(g_b, &type, &bndim, bdims); pnga_inquire(g_b, &type, &cndim, cdims); pnga_add_patch(alpha, g_a, one_arr, adims, beta, g_b, one_arr, bdims, g_c, one_arr, cdims); GA_POP_NAME; return; } pnga_pgroup_sync(a_grp); pnga_inquire(g_c, &typeC, &ndim, dims); pnga_distribution(g_c, me, lo, hi); if ( lo[0]>0 ){ pnga_access_ptr(g_c, lo, hi, &ptr_c, ld); GET_ELEMS(ndim,lo,hi,ld,&elems); } if(g_a == g_c){ ptr_a = ptr_c; elemsa = elems; }else { pnga_inquire(g_a, &type, &ndim, dims); if(type != typeC) pnga_error("types not consistent", g_a); pnga_distribution(g_a, me, lo, hi); if ( lo[0]>0 ){ pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); GET_ELEMS(ndim,lo,hi,ld,&elemsa); } } if(g_b == g_c){ ptr_b = ptr_c; elemsb = elems; }else { pnga_inquire(g_b, &type, &ndim, dims); if(type != typeC) pnga_error("types not consistent", g_b); pnga_distribution(g_b, me, lo, hi); if ( lo[0]>0 ){ pnga_access_ptr(g_b, lo, hi, &ptr_b, ld); GET_ELEMS(ndim,lo,hi,ld,&elemsb); } } if(elems!= elemsb)pnga_error("inconsistent number of elements a",elems-elemsb); if(elems!= elemsa)pnga_error("inconsistent number of elements b",elems-elemsa); if ( lo[0]>0 ){ /* operation on the "local" piece of data */ switch(type){ int *ia, *ib, *ic; double *da,*db,*dc; float *fa, *fb, *fc; long *la,*lb,*lc; long long *lla,*llb,*llc; case C_DBL: da = (double*)ptr_a; db = (double*)ptr_b; dc = (double*)ptr_c; for(i=0; i0){ Integer nelem, lob[2], hib[2], nrow, ncol; int i, size=GAsizeofM(atype); nrow = hi[0] -lo[0]+1; ncol = hi[1] -lo[1]+1; nelem = nrow*ncol; lob[0] = lo[1]; lob[1] = lo[0]; hib[0] = hi[1]; hib[1] = hi[0]; /* allocate memory for transposing elements locally */ ptr_tmp = (char *) ga_malloc(nelem, atype, "transpose_tmp"); /* get access to local data */ pnga_access_ptr(g_a, lo, hi, &ptr_a, ld); for(i = 0; i < ncol; i++){ char *ptr = ptr_tmp + i*size; snga_local_transpose(atype, ptr_a, nrow, ncol*size, ptr); ptr_a += ld[0]*size; } pnga_release(g_a, lo, hi); pnga_put(g_b, lob, hib, ptr_tmp ,&ncol); ga_free(ptr_tmp); } } else { Integer idx; Integer blocks[MAXDIM], block_dims[MAXDIM]; Integer nelem, lob[2], hib[2], nrow, ncol; int i, size=GAsizeofM(atype); /* allocate memory for transposing elements locally */ pnga_get_block_info(g_a, blocks, block_dims); /* Simple block-cyclic data distribution */ nelem = block_dims[0]*block_dims[1]; ptr_tmp = (char *) ga_malloc(nelem, atype, "transpose_tmp"); if (!pnga_uses_proc_grid(g_a)) { for (idx = me; idx < num_blocks_a; idx += nproc) { pnga_distribution(g_a, idx, lo, hi); pnga_access_block_ptr(g_a, idx, &ptr_a, ld); nrow = hi[0] -lo[0]+1; ncol = hi[1] -lo[1]+1; nelem = nrow*ncol; lob[0] = lo[1]; lob[1] = lo[0]; hib[0] = hi[1]; hib[1] = hi[0]; for(i = 0; i < ncol; i++){ char *ptr = ptr_tmp + i*size; snga_local_transpose(atype, ptr_a, nrow, ncol*size, ptr); ptr_a += ld[0]*size; } pnga_put(g_b, lob, hib, ptr_tmp ,&ncol); pnga_release_update_block(g_a, idx); } } else { /* Uses scalapack block-cyclic data distribution */ Integer chk; Integer proc_index[MAXDIM], index[MAXDIM]; Integer topology[MAXDIM], ichk; pnga_get_proc_index(g_a, me, proc_index); pnga_get_proc_index(g_a, me, index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); /* Verify that processor has data */ ichk = 1; for (i=0; i= blocks[i]) { ichk = 0; } } if (ichk) { pnga_access_block_grid_ptr(g_a, index, &ptr_a, ld); while (index[andim-1] < blocks[andim-1]) { /* find bounding coordinates of block */ chk = 1; for (i = 0; i < andim; i++) { lo[i] = index[i]*block_dims[i]+1; hi[i] = (index[i] + 1)*block_dims[i]; if (hi[i] > adims[i]) hi[i] = adims[i]; if (hi[i] < lo[i]) chk = 0; } if (chk) { pnga_access_block_grid_ptr(g_a, index, &ptr_a, ld); nrow = hi[0] -lo[0]+1; ncol = hi[1] -lo[1]+1; nelem = nrow*ncol; lob[0] = lo[1]; lob[1] = lo[0]; hib[0] = hi[1]; hib[1] = hi[0]; for(i = 0; i < ncol; i++){ char *ptr = ptr_tmp + i*size; snga_local_transpose(atype, ptr_a, nrow, block_dims[0]*size, ptr); ptr_a += ld[0]*size; } pnga_put(g_b, lob, hib, ptr_tmp ,&block_dims[0]); pnga_release_update_block_grid(g_a, index); } /* increment index to get next block on processor */ index[0] += topology[0]; for (i = 0; i < andim; i++) { if (index[i] >= blocks[i] && i _MAX_PROB_SIZE_) || (dimB1*dimB2 > _MAX_PROB_SIZE_) ) pnga_error("ga_lu_solve:Array size too large. Use scalapack for optimum performance. configure --with-scalapack or --with-scalapack-i8 for ga_lu_solve to use Scalapack interface",0L); pnga_lu_solve_seq(tran, g_a, g_b); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_llt_solve = pnga_llt_solve #endif Integer pnga_llt_solve(Integer g_a, Integer g_b) { #if HAVE_SCALAPACK # if ENABLE_F77 return gai_llt_solve_(&g_a, &g_b); # else pnga_error("ga_lu_solve:scalapack interfaced, need configure --enable-f77",0L); return FALSE; # endif #else pnga_error("ga_lu_solve:scalapack not interfaced",0L); return FALSE; #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_solve = pnga_solve #endif Integer pnga_solve(Integer g_a, Integer g_b) { #if HAVE_SCALAPACK # if ENABLE_F77 return gai_solve_(&g_a, &g_b); # else pnga_error("ga_lu_solve:scalapack interfaced, need configure --enable-f77",0L); return FALSE; # endif #else pnga_error("ga_lu_solve:scalapack not interfaced",0L); return FALSE; #endif } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_spd_invert = pnga_spd_invert #endif Integer pnga_spd_invert(Integer g_a) { #if HAVE_SCALAPACK # if ENABLE_F77 return gai_spd_invert_(&g_a); # else pnga_error("ga_lu_solve:scalapack interfaced, need configure --enable-f77",0L); return FALSE; # endif #else pnga_error("ga_lu_solve:scalapack not interfaced",0L); return FALSE; #endif } ga-5-4/global/src/ga_ckpt.c0000644000175000017500000000424312662210457013643 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*interfaces for saving and restoring GA's */ #include "globalp.h" #include "message.h" #include "base.h" #include "macdecls.h" #include "ga_ckpt.h" #include "ga-papi.h" #include "ga-wapi.h" #define DEBUG 0 void ga_set_spare_procs(int *spare) { extern int ga_spare_procs; ga_spare_procs=*spare; armci_set_spare_procs(*spare); } int ga_icheckpoint_init(Integer *gas, int num) { int rid,i,hdl; armci_ckpt_ds_t ckptds; extern ARMCI_Group* ga_get_armci_group_(int); /*code needs to be written to check if all the gas have same pgroup*/ (void)ARMCI_Ckpt_create_ds(&ckptds,2*num); for(i=0;i=1) rid = ARMCI_Ckpt_init(NULL,ga_get_armci_group_(GA[hdl].p_handle),0,0,&ckptds); else rid = ARMCI_Ckpt_init(NULL,ARMCI_Get_world_group(),0,0,&ckptds); for(i=0;i #endif #if HAVE_STRING_H # include #endif #include "globalp.h" #include "message.h" #include "ga-papi.h" #include "ga-wapi.h" #define GET_ELEMS(ndim,lo,hi,ld,pelems){\ int _i;\ for(_i=0, *pelems = hi[ndim-1]-lo[ndim-1]+1; _i< ndim-1;_i++) {\ if(ld[_i] != (hi[_i]-lo[_i]+1)) pnga_error("layout problem",_i);\ *pelems *= hi[_i]-lo[_i]+1;\ }\ } typedef struct { union val_t {double dval; int ival; long lval; long long llval; float fval;}v; Integer subscr[MAXDIM]; DoubleComplex extra; SingleComplex extra2; } elem_info_t; static void snga_select_elem(Integer type, char* op, void *ptr, Integer elems, elem_info_t *info, Integer *ind) { Integer i; switch (type){ int *ia,ival; double *da,dval; DoubleComplex *ca; SingleComplex *cfa; float *fa,fval; long *la,lval; long long *lla,llval; case C_INT: ia = (int*)ptr; ival = *ia; if (strncmp(op,"min",3) == 0) for(i=0;i ia[i]) {ival=ia[i];*ind=i; } } else for(i=0;iv.ival = (int) ival; break; case C_DCPL: ca = (DoubleComplex*)ptr; dval=ca->real*ca->real + ca->imag*ca->imag; if (strncmp(op,"min",3) == 0) for(i=0;ireal*ca->real + ca->imag*ca->imag; if(dval > tmp){dval = tmp; *ind = i;} } else for(i=0;ireal*ca->real + ca->imag*ca->imag; if(dval < tmp){dval = tmp; *ind = i;} } info->v.dval = dval; /* use abs value for comparison*/ info->extra = ((DoubleComplex*)ptr)[*ind]; /* append the actual val */ break; case C_SCPL: cfa = (SingleComplex*)ptr; fval=cfa->real*cfa->real + cfa->imag*cfa->imag; if (strncmp(op,"min",3) == 0) for(i=0;ireal*cfa->real + cfa->imag*cfa->imag; if(fval > tmp){fval = tmp; *ind = i;} } else for(i=0;ireal*cfa->real + cfa->imag*cfa->imag; if(fval < tmp){fval = tmp; *ind = i;} } info->v.fval = fval; /* use abs value for comparison*/ info->extra2 = ((SingleComplex*)ptr)[*ind]; /* append the actual val */ break; case C_DBL: da = (double*)ptr; dval = *da; if (strncmp(op,"min",3) == 0) for(i=0;i da[i]) {dval=da[i];*ind=i; } } else for(i=0;iv.dval = dval; break; case C_FLOAT: fa = (float*)ptr; fval = *fa; if (strncmp(op,"min",3) == 0) for(i=0;i fa[i]) {fval=fa[i];*ind=i; } } else for(i=0;iv.fval = fval; break; case C_LONG: la = (long*)ptr; lval = *la; if (strncmp(op,"min",3) == 0) for(i=0;i la[i]) {lval=la[i];*ind=i; } } else for(i=0;iv.lval = lval; break; case C_LONGLONG: lla = (long long*)ptr; llval = *lla; if (strncmp(op,"min",3) == 0) for(i=0;i lla[i]) {llval=lla[i];*ind=i; } } else for(i=0;iv.llval = llval; break; default: pnga_error(" wrong data type ",type); } } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wnga_select_elem = pnga_select_elem #endif void pnga_select_elem(Integer g_a, char* op, void* val, Integer *subscript) { Integer ndim, type, me, elems, ind=0, i; Integer lo[MAXDIM],hi[MAXDIM],dims[MAXDIM],ld[MAXDIM-1]; elem_info_t info; Integer num_blocks; int participate=0; int local_sync_begin; local_sync_begin = _ga_sync_begin; _ga_sync_begin = 1; _ga_sync_end=1; /*remove any previous masking*/ if(local_sync_begin)pnga_sync(); me = pnga_nodeid(); pnga_check_handle(g_a, "ga_select_elem"); GA_PUSH_NAME("ga_elem_op"); if (strncmp(op,"min",3) == 0); else if (strncmp(op,"max",3) == 0); else pnga_error("operator not recognized",0); pnga_inquire(g_a, &type, &ndim, dims); num_blocks = pnga_total_blocks(g_a); if (num_blocks < 0) { pnga_distribution(g_a, me, lo, hi); if ( lo[0]> 0 ){ /* base index is 1: we get 0 if no elements stored on p */ /******************* calculate local result ************************/ void *ptr; pnga_access_ptr(g_a, lo, hi, &ptr, ld); GET_ELEMS(ndim,lo,hi,ld,&elems); participate =1; /* select local element */ snga_select_elem(type, op, ptr, elems, &info, &ind); /* release access to the data */ pnga_release(g_a, lo, hi); /* determine element subscript in the ndim-array */ for(i = 0; i < ndim; i++){ int elems = (int)( hi[i]-lo[i]+1); info.subscr[i] = ind%elems + lo[i] ; ind /= elems; } } } else { void *ptr; Integer j, offset, jtot, upper; Integer nproc = pnga_nnodes(); pnga_access_block_segment_ptr(g_a, me, &ptr, &elems); if (elems > 0) { participate =1; /* select local element */ snga_select_elem(type, op, ptr, elems, &info, &ind); /* release access to the data */ pnga_release_block_segment(g_a, me); /* convert local index back into a global array index */ if (!pnga_uses_proc_grid(g_a)) { offset = 0; for (i=me; i= offset && ind < upper) { break; } else { offset += jtot; } } /* determine element subscript in the ndim-array */ ind -= offset; for(i = 0; i < ndim; i++){ int elems = (int)( hi[i]-lo[i]+1); info.subscr[i] = ind%elems + lo[i] ; ind /= elems; } } else { Integer stride[MAXDIM], index[MAXDIM]; Integer blocks[MAXDIM], block_dims[MAXDIM]; Integer proc_index[MAXDIM], topology[MAXDIM]; Integer l_index[MAXDIM]; Integer min, max; pnga_get_proc_index(g_a, me, proc_index); pnga_get_block_info(g_a, blocks, block_dims); pnga_get_proc_grid(g_a, topology); /* figure out strides for locally held block of data */ for (i=0; i dims[i]) max = dims[i]; stride[i] += (max - min + 1); } } /* use strides to figure out local index */ l_index[0] = ind%stride[0]; for (i=1; i about PEIGS) - BLAS library is required for the eigensolver and ga_dgemm; - LAPACK library is required for the eigensolver; - MPI, SCALAPACK, PBBLAS, and BLACS libraries are required for ga_lu_solve, ga_cholesky, ga_llt_solve, ga_spd_invert, ga_solve. If you do not install these libs, the named operations will not be available. BUILDING GA =========== Please refer to the README in the base distribution directory. TEST PROGRAMS ============= Please refer to the README in the base distribution directory for details on running the GA test suite. TEST PROGRAM NOTES ================== - Program testspd.x should work only with the ScaLAPACK and MPI. - Another example program that uses GA is called jacobi.x. The Jacobi iterative method is used to solve a system of linear equations generated in the solution process of a partial differential equation by the finite differences method. - To run test programs with TCGMSG that creates the GA processes on the shared memory and (network of) workstations; execute them you should use 'parallel' program -- built in tcgmsg/ipcv4.0:: parallel testing/test.x For a single processor execution 'parallel' is not required and the program can be run as:: testing/test.x or under control of your favorite debugger. On MPP like T3D, IBM SP, and Intel machines, use appropriate system command to specify the number of processors, load and run the programs. For example, to run on four processors of the Cray T3D use:: mppexec testing/test.x -npes 4 DOCUMENTATION ============= The documentation is located in doc/ and on the web at: http://www.emsl.pnl.gov/docs/global. CONTACT ======= For suggestions, comments and bug reports: hpctools@pnl.gov ga-5-4/global/trace/0000755000175000017500000000000012662210461012366 5ustar mbambaga-5-4/global/trace/test.f0000644000175000017500000000046312662210461013517 0ustar mbamba real a(10000) integer i call trace_init(1000) do k = 1,10 call trace_stime() do i = 1,10000 a(i) = sin(real(i+k)) enddo call trace_etime() call trace_genrec(k,k,i,k,i,999) enddo call trace_end(99) end ga-5-4/global/trace/adjust.c0000644000175000017500000001706012662210461014030 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: adjust.c,v 1.10 2003-06-22 07:19:31 d3h325 Exp $*/ /***********************************************************************\ * Purpose: adjusts timers in tracefiles generated by ga_trace, * * sorts events, combines tracefiles, and reformats the data * * Jarek Nieplocha, 10.15.1993 * * 11.09.99 - updated for GA_OFFSET + error diagnostics * \***********************************************************************/ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #define MAX_EVENTS 1000000 #define MAX_ARRAYS 8 #define MAX_EVENT_TYPES 32 #define MAX_PROC 512 /* this value must be exactly like in the GA package source */ #define GA_OFFSET 1000 #define GA_ABS(x) ((x)>0 ? (x) :(-x)) #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) /* if enabled, program prints GA usage statistics & requires EXTRA MEMORY * NOT recommended for large number of arrays/processes and/or event types */ #define PRINT_STATS 1 #ifdef PRINT_STATS double stat[MAX_PROC][MAX_ARRAYS][MAX_EVENT_TYPES]; unsigned int acc[MAX_PROC][MAX_ARRAYS][MAX_EVENT_TYPES]; void printstat(int proc, unsigned tlast); void update(long int proc, int *record, unsigned long t0, unsigned long t1); #endif int proc=0, arrays=0, event_types=0; static int tcomp(const void *t1, const void *t2); int main(argc,argv) int argc; char **argv; { long int p,i,j,MR,events=0; unsigned long int k, *clock_base, *times, base=0, *tbase, maxtime=0; int *record; int ga=-GA_OFFSET; int flag; FILE *fin,*fout, *fdistr; char *foutname="adjust.ed", fdstrname[15], finname[8]; int distrdata; if(argc < 2){ printf("Usage: adjust [] \n"); exit(1); } sscanf(argv[1],"%d",&ga); ga += GA_OFFSET; /* find the distribution file name and open it */ sprintf(fdstrname, "distrib.%d", ga-GA_OFFSET); if((fdistr = fopen(fdstrname,"r")) == NULL) { fprintf(stderr, "This array handle %d is invalid!\n", ga-GA_OFFSET); exit(3); } fscanf(fdistr, "%ld", &p); if(argc>2) sscanf(argv[3],"%ld",&MR); else MR = MAX_EVENTS; if(p>MAX_PROC){ fprintf(stderr,"Only %d procs allowed - you must modify this program\n",MAX_PROC); exit(1); } if(p<1){ fprintf(stderr,"number of processes must be > 0: %ld\n",p); exit(2); } printf("Processing tracefiles for %ld processes\n",p); #ifdef PRINT_STATS for(i=0;i= MAX_ARRAYS){ fprintf(stderr, "array handle beyond range we can deal with %d > %d\n", record[base+1], MAX_ARRAYS-1); exit(4); } times[0] -= clock_base[i]; times[1] = base+1; fscanf(fin,"%lu",times+2); times[2] -= clock_base[i]; #ifdef PRINT_STATS update(i,record+base,times[0],times[2]); #endif times[3] = -base-1; if(maxtime *(unsigned long int*)t2 ? 1 : -1); return (flag); } #ifdef PRINT_STATS void update(proc,record, t0, t1) long int proc; int *record; unsigned long t0,t1; { int ar=record[1], et=record[6]; if(arrays < ar){ arrays = ar; if(arrays>= MAX_ARRAYS){ fprintf(stderr,"The program can handle only %d arrays\n",MAX_ARRAYS); exit(1); } } if(event_types < et){ event_types = et; if (event_types >= MAX_EVENT_TYPES){ fprintf(stderr,"The program can handle only %d event types%d\n",MAX_EVENT_TYPES,et); exit(1); } } stat[proc][ar][et] += 1e-6 * (double)(t1-t0); acc[proc][ar][et] ++; } void printstat(proc,tlast) int proc; unsigned tlast; { int p,e,a; double t,ta,te, tl= 1e-6 * tlast; double total_cm=0., total_cp=0.; long int ia, ie; printf("\t\t\tActivity Statistics\n"); for(p=0;p #endif #if HAVE_STDLIB_H # include #endif int **Patches, *Col, *lastCol; int p; #define hash(ilo,ihi,p) (((ilo)+(ihi))%(p)) #define hash2(ilo,ihi,jlo,jhi,p) ( ((ilo)+(ihi) + (jlo)+(jhi))%(p) ) int LocFound(int *patch); int **idim2(row,col) int row,col; { register int **prow, *pdata, i; pdata = (int*) calloc(row*col, sizeof(int)); if(pdata == (int*) NULL){ printf("Memory allocation failed - data: %dx%d\n",row,col); exit(1); } prow = (int **)calloc(row,sizeof(int *)); if(prow == (int**) NULL){ printf("memory allocation failed for prow"); exit(1); } for(i=0;i \n"); printf("(from,to) specifies the range of collision numbers to be printed\n"); exit(1); } sscanf(argv[1],"%d",&p); if(p>1000||p<1){ printf("%d processors ? Please be reasonable ...\n",p); exit(1); } fin = fopen(argv[2],"r"); if(!fin){ printf("%s: File Not Found, Exiting ...\n",argv[2]); exit(1); } sscanf(argv[3],"%d",&from); sscanf(argv[4],"%d",&to); if(from<0||from>p||to>p||to and \n"); exit(1); } if(!(Col = (int*)calloc(p,sizeof(int)))){ printf("couldn't allocate memory 2\n"); exit(2); } Patches = idim2(p,5); for(i=0;isscanf(ln,"%d%d%d%d%d%d%d%d%lu", &i,&k,patch+1,patch+2,patch+3,patch+4,&i,&flag,&time))continue; loc = LocFound(patch); if(!Patches[loc][0])for(i=1;i<5;i++)Patches[loc][i]=patch[i]; last_col = Patches[loc][0]; if(flag == 1){ cur_col = ++Patches[loc][0]; if(cur_col>p){ printf("%d -- Error in collision number. Record: %d\n",cur_col,j); exit(3); } Col[cur_col-1]++; if(max_col=from && last_col<=to) || (cur_col>=from && cur_col<=to)){ printf("%f ",1e-6*time); for(i=from-1;i' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *Note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ga-5-4/armci/src-portals/0000755000175000017500000000000012662210425013374 5ustar mbambaga-5-4/armci/src-portals/copy.h0000644000175000017500000004641112662210425014525 0ustar mbamba/* $Id: copy.h,v 1.86.2.6 2007-08-29 17:32:32 manoj Exp $ */ #ifndef _COPY_H_ #define _COPY_H_ #include #include #ifdef WIN32 # include #endif #ifdef DECOSF #include #endif #ifndef EXTERN # define EXTERN extern #endif #if defined(SGI) || defined(FUJITSU) || defined(HPUX) || defined(SOLARIS) || defined (DECOSF) || defined(__ia64__) || defined(__crayx1) # define PTR_ALIGN #endif #if defined(NB_NONCONT) && !defined(CRAY_SHMEM) && !defined(QUADRICS) #error NB_NONCONT is only available on CRAY_SHMEM,QUADRICS and PORTALS #endif #if defined(SHMEM_HANDLE_SUPPORTED) && !defined(CRAY_SHMEM) #error SHMEM_HANDLE_SUPPORTED should not be defined on a non CRAY_SHMEM network #endif /* 08/30/06 moved up here from lines 252-397, MEM_FENCE before FENCE_NODE */ #if defined(NEED_MEM_SYNC) # ifdef AIX # define MEM_FENCE {int _dummy=1; _clear_lock((int *)&_dummy,0); } # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define MEM_FENCE __asm__ __volatile__ ("mf" ::: "memory"); # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define MEM_FENCE _armci_ia64_mb(); # endif # elif defined(LINUX) && defined(__GNUC__) && defined(__ppc__) # define MEM_FENCE \ __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif #ifndef armci_copy # define armci_copy(src,dst,n) bcopy(src,dst,n) #endif /****************************** 2D Copy *******************/ # define DCopy2D(rows, cols, src_ptr, src_ld, dst_ptr, dst_ld){\ int j, nbytes = sizeof(double)* rows;\ char *ps=src_ptr, *pd=dst_ptr;\ for (j = 0; j < cols; j++){\ armci_copy(ps, pd, nbytes);\ ps += sizeof(double)* src_ld;\ pd += sizeof(double)* dst_ld;\ }\ } # define ByteCopy2D(bytes, count, src_ptr, src_stride, dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_copy(ps, pd, bytes);\ ps += src_stride;\ pd += dst_stride;\ }\ } #if defined(FUJITSU) # define armci_put2D(p, bytes,count,src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchTo(src_ptr, src_stride, dst_ptr, dst_stride, count,bytes, p) # define armci_get2D(p, bytes, count, src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchFrom(src_ptr, src_stride, dst_ptr, dst_stride,count,bytes,p) #elif defined(HITACHI) || defined(_ELAN_PUTGET_H) && !defined(NB_NONCONT) #if defined(QUADRICS) #if 0 # define WAIT_FOR_PUTS elan_putWaitAll(elan_base->state,200) # define WAIT_FOR_GETS elan_getWaitAll(elan_base->state,200) #else # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_wait_put(); extern void armcill_wait_get(); #endif #endif extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D #elif defined(NB_NONCONT) extern void armcill_wait_put(); extern void armcill_wait_get(); # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D # if defined(QUADRICS) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_put(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_get(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_wait(_hdl)\ elan_wait(_hdl,100) # elif defined(CRAY_SHMEM) # define armcill_nb_wait(_hdl)\ shmem_wait_nb(_hdl) /*VT:this should be ifdef'ed based on if shmem_handle is defined or not*/ # if defined (CRAY_XT) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ shmem_putmem(_dst, _src, (size_t)_sz, _proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ shmem_getmem(_dst, _src, (size_t)_sz, _proc) # else # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_putmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_getmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # endif # endif #else # define armci_put2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_put(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } # define armci_get2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_get(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } #endif /* macros to ensure ordering of consecutive puts or gets following puts */ #if defined(LAPI) # include "lapidefs.h" #elif defined(_CRAYMPP) || defined(QUADRICS) || defined(__crayx1)\ || defined(CRAY_SHMEM) #if defined(CRAY) || defined(CRAY_XT) # include #else # include #ifndef ptrdiff_t # include #endif # include #endif # ifdef ELAN_ACC # define FENCE_NODE(p) {\ if(((p)armci_clus_last))armci_elan_fence(p);} # define UPDATE_FENCE_STATE(p, op, nissued) # else int cmpl_proc; # ifdef DECOSF # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet();\ else asm ("mb"); } # else # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet(); } # endif # define UPDATE_FENCE_STATE(p, op, nissued) if((op)==PUT) cmpl_proc=(p); # endif #else # if defined(GM) && defined(ACK_FENCE) extern void armci_gm_fence(int p); # define FENCE_NODE(p) armci_gm_fence(p) # elif defined(BGML) # include "bgmldefs.h" # define FENCE_NODE(p) BGML_WaitProc(p) # else # define FENCE_NODE(p) # endif # define UPDATE_FENCE_STATE(p, op, nissued) #endif #ifdef NEC # define THRESH 1 # define THRESH1D 1 #else # define THRESH 32 # define THRESH1D 512 #endif #define ALIGN_SIZE sizeof(double) /********* interface to C 1D and 2D memory copy functions ***********/ /* dcopy2d_u_ uses explicit unrolled loops to depth 4 */ void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur); void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur); void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur); void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur); /********* interface to fortran 1D and 2D memory copy functions ***********/ #if ENABLE_F77 # ifdef WIN32 # define ATR __stdcall # else # define ATR # endif # define dcopy2d_n_ F77_FUNC_(dcopy2d_n,DCOPY2D_N) # define dcopy2d_u_ F77_FUNC_(dcopy2d_u,DCOPY2D_U) # define dcopy1d_n_ F77_FUNC_(dcopy1d_n,DCOPY1D_N) # define dcopy1d_u_ F77_FUNC_(dcopy1d_u,DCOPY1D_U) # define dcopy21_ F77_FUNC(dcopy21,DCOPY21) # define dcopy12_ F77_FUNC(dcopy12,DCOPY12) # define dcopy31_ F77_FUNC(dcopy31,DCOPY31) # define dcopy13_ F77_FUNC(dcopy13,DCOPY13) void ATR dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void ATR dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void ATR dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n); void ATR dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n); void ATR dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur); void ATR dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur); void ATR dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur); void ATR dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur); #endif #if NOFORT # if defined(AIX) || defined(BGML) # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ # elif defined(LINUX) || defined(__crayx1) || defined(HPUX64) || defined(DECOSF) || defined(CRAY) || defined(WIN32) || defined(HITACHI) # define DCOPY2D c_dcopy2d_n_ # define DCOPY1D c_dcopy1d_n_ # else # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ # endif # define DCOPY21 c_dcopy21_ # define DCOPY12 c_dcopy12_ # define DCOPY31 c_dcopy31_ # define DCOPY13 c_dcopy13_ #else # if defined(AIX) || defined(BGML) # define DCOPY2D dcopy2d_u_ # define DCOPY1D dcopy1d_u_ # elif defined(LINUX) || defined(__crayx1) || defined(HPUX64) || defined(DECOSF) || defined(CRAY) || defined(WIN32) || defined(HITACHI) # define DCOPY2D dcopy2d_n_ # define DCOPY1D dcopy1d_n_ # else # define DCOPY2D dcopy2d_u_ # define DCOPY1D dcopy1d_u_ # endif # define DCOPY21 dcopy21_ # define DCOPY12 dcopy12_ # define DCOPY31 dcopy31_ # define DCOPY13 dcopy13_ #endif /***************************** 1-Dimensional copy ************************/ #if defined(QUADRICS) # include # if defined(_ELAN_PUTGET_H) # define qsw_put(src,dst,n,proc) \ elan_wait(elan_put(elan_base->state,src,dst,n,proc),elan_base->waitType) # define qsw_get(src,dst,n,proc) \ elan_wait(elan_get(elan_base->state,src,dst,n,proc),elan_base->waitType) /* # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ *(phandle)=elan_put(elan_base->state,src,dst,n,proc) */ #ifdef DOELAN4 extern void armci_elan_put_with_tracknotify(char *src,char *dst,int n,int proc, ELAN_EVENT **phandle); # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ armci_elan_put_with_tracknotify(src,dst,n,proc,phandle) #endif # define ARMCI_NB_GET(src,dst,n,proc,phandle)\ *(phandle)=elan_get(elan_base->state,src,dst,n,proc) # define ARMCI_NB_WAIT(handle) if(handle)elan_wait(handle,elan_base->waitType) # define ARMCI_NB_TEST(handle,_succ) (*(_succ))= (handle)? !elan_poll(handle,1L): 1 # else # define qsw_put(src,dst,n,proc) shmem_putmem((dst),(src),(int)(n),(proc)) # define qsw_get(src,dst,n,proc) shmem_getmem((dst),(src),(int)(n),(proc)) # endif # define armci_put(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_put(src,dst,n,proc);} # define armci_get(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_get((src),(dst),(int)(n),(proc));} #elif defined(CRAY_T3E) || defined(CRAY_SHMEM) # define armci_copy_disabled(src,dst,n)\ if((n)<256 || n%sizeof(long) ) memcpy((dst),(src),(n));\ else {\ shmem_put((long*)(dst),(long*)(src),(int)(n)/sizeof(long),armci_me);\ shmem_quiet(); } # define armci_put(src,dst,n,proc) \ shmem_put32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() # define armci_get(src,dst,n,proc) \ shmem_get32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() #elif defined(HITACHI) extern void armcill_put(void *src, void *dst, int bytes, int proc); extern void armcill_get(void *src, void *dst, int bytes, int proc); # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_put((src), (dst),(n),(proc));} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_get((src), (dst),(n),(proc));} #elif defined(FUJITSU) # include "fujitsu-vpp.h" # ifndef __sparc # define armci_copy(src,dst,n) _MmCopy((char*)(dst), (char*)(src), (n)) # endif # define armci_put CopyTo # define armci_get CopyFrom #elif defined(LAPI) # include extern lapi_handle_t lapi_handle; # define armci_put(src,dst,n,proc)\ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL,&(ack_cntr[ARMCI_THREAD_IDX].cntr),&cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} /**** this copy is nonblocking and requires fence to complete!!! ****/ # define armci_get(src,dst,n,proc) \ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &(get_cntr[ARMCI_THREAD_IDX].cntr)))\ ARMCI_Error("LAPI_Get failed",0);else;} # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_PUT failed",0);\ (cmplt)->val=1;\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL, &((cmplt)->cntr), &cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_GET failed",0);\ (cmplt)->val=1;\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &((cmplt)->cntr)))\ ARMCI_Error("LAPI_Get NB_GET failed",0);else;} # define ARMCI_NB_WAIT(cmplt) CLEAR_COUNTER((cmplt)) # define ARMCI_NB_TEST(cmplt,_succ) TEST_COUNTER((cmplt),(_succ)) #elif defined(PORTALS) # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armci_portals_put((proc),(src), (dst),(n),NULL,0);} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armci_portals_get((proc),(src), (dst),(n),NULL,0);} # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_put((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_get((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) #elif defined(BGML) #define armci_get(src, dst, n, p) PARMCI_Get(src, dst, n, p) #define armci_put(src, dst, n, p) PARMCI_Put(src, dst, n, p) #else # define armci_get(src,dst,n,p) armci_copy((src),(dst),(n)) # define armci_put(src,dst,n,p) armci_copy((src),(dst),(n)) #endif #ifndef MEM_FENCE # define MEM_FENCE #endif #ifndef armci_copy_fence # define armci_copy_fence armci_copy #endif #endif ga-5-4/armci/src-portals/memlock.h0000644000175000017500000000205012662210425015171 0ustar mbamba/* $Id: memlock.h,v 1.18 2004-09-21 17:26:23 manoj Exp $ */ #ifndef _MEMLOCK_H_ #define _MEMLOCK_H_ /* data structure for locking memory areas */ #define MAX_SLOTS 8 typedef struct{ void *start; void *end; } memlock_t; /* SGI Altix Stuff */ typedef struct { void *seg_addr; /* master's starting address of the segment */ size_t seg_size; size_t tile_size; size_t mem_offset; }armci_memoffset_t; extern void** memlock_table_array; extern int *armci_use_memlock_table; #if defined(LAPI) || defined(FUJITSU) || defined(PTHREADS) || defined(QUADRICS)\ || defined(PORTALS) || defined(HITACHI) || (defined(LINUX64)&&defined(__GNUC__)&&defined(__alpha__))\ || defined(CYGWIN) || defined(__crayx1) || defined(NEC) # define ARMCI_LOCKMEM armci_lockmem_ # define ARMCI_UNLOCKMEM armci_unlockmem_ #else # define ARMCI_LOCKMEM armci_lockmem # define ARMCI_UNLOCKMEM armci_unlockmem #endif extern void ARMCI_LOCKMEM(void *pstart, void *pend, int proc); extern void ARMCI_UNLOCKMEM(int proc); #define MEMLOCK_SHMEM_FLAG #endif ga-5-4/armci/src-portals/rtinfo.c0000644000175000017500000000102112662210425015033 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: rtinfo.c,v 1.1 2003-03-20 00:57:27 d3h325 Exp $ Run-time system configuration */ #include #include /*\ determine number of CPUs on the current SMP node- Linux version for now \*/ int armci_getnumcpus(void) { int numproc=0; FILE* fp; char line[80]; fp=fopen("/proc/cpuinfo","r"); if(fp==NULL) return -1; while(!feof(fp)){ fgets(line,80,fp); if(strncmp(line,"processor",9)==0) numproc++; } fclose(fp); return(numproc); } ga-5-4/armci/src-portals/ccopy.c0000644000175000017500000002213512662210425014660 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "copy.h" /* ONE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy1d_n(A, B, n) integer n,i double precision A(n), B(n) ccdir$ no_cache_alloc a,b do i = 1, n B(i) = A(i) end do end #endif void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; for ( i = 0 ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } #if 0 subroutine dcopy1d_u(A, B, n) integer n,n1,i double precision A(n), B(n) double precision d1, d2, d3, d4 n1 = iand(max0(n,0),3) do i = 1, n1 B(i) = A(i) end do do i = n1+1, n, 4 d1 = a(i) d2 = a(i+1) d3 = a(i+2) d4 = a(i+3) b(i) = d1 b(i+1) = d2 b(i+2) = d3 b(i+3) = d4 end do end #endif void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; int m = (*n) - ((*n)%4); for ( i = 0 ; i < m ; i+=4 ){ B[i ] = A[i ]; B[i+1] = A[i+1]; B[i+2] = A[i+2]; B[i+3] = A[i+3]; } for ( i = m ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } /* TWO-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy21(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c) end do end do end #endif void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur) { int r, c, i=0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ c * (*ald) + r ]; } } (*cur) = i; return; } #if 0 subroutine dcopy12(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 A(r,c) = buf(cur) end do end do end #endif void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur) { int r, c, i=0; i = 0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] = buf[i++]; } } (*cur) = i; return; } #if 0 subroutine dcopy2d_n(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) do c = 1, cols do r = 1, rows B(r,c) = A(r,c) end do end do end #endif void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } #if 0 subroutine dcopy2d_u(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) integer r1 double precision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 b(r,c) = a(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) d2 = a(r+1,c) d3 = a(r+2,c) d4 = a(r+3,c) b(r,c) = d1 b(r+1,c) = d2 b(r+2,c) = d3 b(r+3,c) = d4 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 c$$$ b(r+1,c) = a(r+1,c) + b(r+1,c) * 0 c$$$ b(r+2,c) = a(r+2,c) + b(r+2,c) * 0 c$$$ b(r+3,c) = a(r+3,c) + b(r+3,c) * 0 enddo enddo end #endif void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ int m = (*rows) - ((*rows)%4); for ( r = 0 ; r < m ; r+=4 ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; B[ c * (*bld) + r+1 ] = A[ c * (*ald) + r+1 ]; B[ c * (*bld) + r+2 ] = A[ c * (*ald) + r+2 ]; B[ c * (*bld) + r+3 ] = A[ c * (*ald) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } /* THREE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy31(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c,p) end do end do end do end #endif void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ]; } } } (*cur) = i; return; } #if 0 subroutine dcopy13(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 A(r,c,p) = buf(cur) end do end do end do end #endif void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ] = buf[i++]; } } } (*cur) = i; return; } ga-5-4/armci/src-portals/shmem.c0000644000175000017500000007623312662210425014664 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmem.c,v 1.87.2.2 2007-09-10 23:31:32 manoj Exp $ */ /* System V shared memory allocation and managment * * Interface: * ~~~~~~~~~ * char *Create_Shared_Region(long *idlist, long size, long *offset) * . to be called by just one process. * . calls kr_malloc, malloc-like memory allocator from the K&R book. * kr_malloc inturn calls armci_allocate() that does shmget() and shmat(). * . idlist might be just a pointer to integer or a true array in the * MULTIPLE_REGIONS versions (calling routine has to take care of it) * char *Attach_Shared_Region(long *idlist, long size, long offset) * . called by any other process to attach to existing shmem region or * if attached just calculate the address based on the offset * . has to be called after shmem region was created * void Free_Shmem_Ptr(long id, long size, char* addr) * . called ONLY by the process that created shmem region (id) to return * pointer to kr_malloc (shmem is not destroyed) * void Delete_All_Regions() * . destroys all shared memory regions * . can be called by any process assuming that all processes attached * to alllocated shmem regions * . needs to by called by cleanup procedure(s) * * Jarek Nieplocha, 06.13.94 * */ #ifdef SYSV #define DEBUG_ 0 #define DEBUG1 0 #define DEBUG2_ 0 /* For debugging purposes at the beginning of the shared memory region * creator process can write a stamp which then is read by attaching processes * NOTE: on clusters we cannot use it anymore since ARMCI node master * uses it since Nov 99 to write the value of address it attached at * This feature is used in the ARMCI memlock table. */ #define STAMP 0 #include #include #include #include #include #include #include #include #include "armci_shmem.h" #include "kr_malloc.h" #include "shmlimit.h" #include "message.h" #include "armcip.h" #ifdef ALLOC_MUNMAP #include #include static size_t pagesize=0; static int logpagesize=0; /* allow only that big shared memory segment (in MB)- incresed from 128 11/02 */ #define MAX_ALLOC_MUNMAP 128 #define MAX_ALLOC_MUNMAP_ 368 static long max_alloc_munmap=MAX_ALLOC_MUNMAP; #endif #if defined(SUN) extern char *shmat(); #endif #define SHM_UNIT (1024) /* Need to determine the max shmem segment size. There are 2 alternatives: * 1. use predefined SHMMAX if available or set some reasonable values, or * 2. trial-and-error search for a max value (default) * case a) fork a process to determine shmmax size (more accurate) * case b) search w/o forking until success (less accurate) */ /* under Myrinet GM, we cannot fork */ #if defined(GM) || defined(VAPI) # define SHMMAX_SEARCH_NO_FORK #endif #if defined(LAPI) || defined(AIX) || defined(SHMMAX_SEARCH_NO_FORK) || defined(CRAY_XT) # define NO_SHMMAX_SEARCH #endif /* Limits for the largest shmem segment are in Kilobytes to avoid passing * Gigavalues to kr_malloc * the limit for the KSR is lower than SHMMAX in sys/param.h because * shmat would fail -- SHMMAX cannot be trusted (a bug) */ #define _SHMMAX 4*1024 #if defined(SUN)||defined(SOLARIS) # undef _SHMMAX # define _SHMMAX (1024) /* memory in KB */ #elif defined(SGI64) || defined(AIX) || defined(CONVEX) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(SGI) && !defined(SGI64) # undef _SHMMAX # define _SHMMAX ((unsigned long)128*1024) #elif defined(KSR) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(HPUX) # undef _SHMMAX # define _SHMMAX ((unsigned long)64*1024) #elif defined(__FreeBSD__) # undef _SHMMAX # define _SHMMAX ((unsigned long)3*1024) #elif defined(LINUX) # if !defined(SHMMAX) /* Red Hat does not define SHMMAX */ # undef _SHMMAX # if defined(__sparc__) || defined(__powerpc__) # define _SHMMAX ((unsigned long)16*1024) # elif defined(__alpha__) # define _SHMMAX ((unsigned long)4072) # else /* Intel */ # define _SHMMAX ((unsigned long)32*1024) # endif # endif #elif defined(SHMMAX) # undef _SHMMAX # define _SHMMAX (((unsigned long)SHMMAX)>>10) #endif static unsigned long MinShmem_per_core = 0; static unsigned long MaxShmem_per_core = 0; static unsigned long MinShmem = _SHMMAX; static unsigned long MaxShmem = MAX_REGIONS*_SHMMAX; static context_t ctx_shmem; /* kr_malloc context */ static context_t *ctx_shmem_global; /* kr_malloc context stored in shmem */ static int create_call=0; #ifdef SHMMAX_SEARCH_NO_FORK static char *ptr_search_no_fork = (char*)0; static int id_search_no_fork=0; #endif #ifdef LINUX #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm shm %d",id); #elif defined(SOLARIS) #define CLEANUP_CMD(command) sprintf(command,"/bin/ipcrm -m %d",id); #elif defined(SGI) #define CLEANUP_CMD(command) sprintf(command,"/usr/sbin/ipcrm -m %d",id); #else #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm -m %d",id); #endif #ifdef ALLOC_MUNMAP #ifdef QUADRICS # include # include static char *armci_elan_starting_address = (char*)0; # ifdef __ia64__ # define ALLOC_MUNMAP_ALIGN 1024*1024 # else # define ALLOC_MUNMAP_ALIGN 64*1024 # endif # define ALGN_MALLOC(s,a) elan_allocMain(elan_base->state, (a), (s)) #else # define ALGN_MALLOC(s,a) malloc((s)) #endif static char* alloc_munmap(size_t size) { char *tmp; unsigned long iptr; size_t bytes = size+pagesize-1; if(armci_elan_starting_address){ tmp = armci_elan_starting_address; armci_elan_starting_address += size; # ifdef ALLOC_MUNMAP_ALIGN armci_elan_starting_address += ALLOC_MUNMAP_ALIGN; # endif if(DEBUG_) {printf("%d: address for shm attachment is %p size=%ld\n", armci_me,tmp,(long)size); fflush(stdout); } } else { tmp = ALGN_MALLOC(bytes, getpagesize()); if(tmp){ iptr = (unsigned long)tmp + pagesize-1; iptr >>= logpagesize; iptr <<= logpagesize; if(DEBUG_) printf("%d:unmap ptr=%p->%p size=%d pagesize=%d\n",armci_me, tmp,(char*)iptr,(int)size,pagesize); tmp = (char*)iptr; if(munmap(tmp, size) == -1) armci_die("munmap failed",0); if(DEBUG_){printf("%d: unmap OK\n",armci_me); fflush(stdout);} }else armci_die("alloc_munmap: malloc failed",(int)size); } return tmp; } #endif /*\ A wrapper to shmget. Just to be sure that ID is not 0. \*/ int armci_shmget(size_t size,char *from) { int id; id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); /*attaching with id 0 somehow fails (Seen on pentium4+linux24+gm163) *so if id=0, shmget again. */ while(id==0){ /* free id=0 and get a new one */ if(shmctl((int)id,IPC_RMID,(struct shmid_ds *)NULL)) { fprintf(stderr,"id=%d \n",id); armci_die("allocate: failed to _delete_ shared region ",id); } id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); } if(DEBUG_){ printf("\n%d:armci_shmget sz=%ld caller=%s id=%d\n",armci_me,(long)size, from,id); fflush(stdout); } return(id); } static int Semget(key_t key,int nsems,int semflg) { int ret; if((ret = semget(key,nsems,semflg)) == -1) { switch(errno) { case EACCES: fprintf(stdout," semget errno=EACCES.\n"); break; case EINVAL: fprintf(stdout," semget errno=EINVAL.\n"); break; case ENOENT: fprintf(stdout," semget errno=ENOENT.\n"); break; case ENOSPC: fprintf(stdout," semget errno=ENOSPC -- check system limit for sysv semaphores.\n"); break; case ENOMEM: fprintf(stdout," semget errno=ENOMEM.\n"); break; case EEXIST: fprintf(stdout," semget errno=EEXIST.\n"); break; default: fprintf(stdout," unusual semget errno=%d\n",errno); break; } armci_die("semget failed",errno); } return ret; } int armci_semget(int count) { int id; id = Semget(IPC_PRIVATE,2,0600); return id; } int armci_semrm(int id) { semctl(id,0,IPC_RMID); } int armci_shmrm(int id) { int ret; if((ret = shmctl(id,IPC_RMID,NULL)) != 0) { fprintf(stdout,"[cp]: shmctl return an error.\n"); switch(errno) { case EINVAL: fprintf(stdout," Error EINVAL: shmid is not a valid shared memory segment.\n"); break; case EFAULT: fprintf(stdout," Error EFAULT: argument 3 is not a valid struct shmid_ds.\n"); break; case EPERM: fprintf(stdout," Error EPREM: permission to access/change shared mem segment denied.\n"); break; default: fprintf(stdout," unusual shmctl errno=%d\n",errno); break; break; } armci_die("error deleting shmid",id); } return ret; } /*\ test is a shared memory region of a specified size can be allocated * return 0 (no) or 1 (yes) \*/ int armci_test_allocate(long size) { char *ptr; int id = armci_shmget((size_t)size,"armci_test_allocate"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* delete segment id */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); /* test pointer */ if (((long)ptr) == -1L) return 0; else return 1; } /*\ try to allocate a shared memory region of a specified size; return pointer \*/ static int armci_shmalloc_try(long size) { #ifdef SHMMAX_SEARCH_NO_FORK char *ptr; int id = armci_shmget((size_t) size,"armci_shmalloc_try"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* test pointer */ if (((long)ptr) == -1L) return 0; ptr_search_no_fork = ptr; id_search_no_fork = id; #endif return 1; } /* parameters that define range and granularity of search for shm segment size * UBOUND is chosen to be < 2GB to avoid overflowing on 32-bit systems * smaller PAGE gives more accurate results but with more search steps * LBOUND is set to minimum amount for our purposes * change UBOUND=512MB if you need larger arrays than 512 MB */ #define PAGE (16*65536L) #define LBOUND 1048576L #if defined(MULTI_CTX) && defined(QUADRICS) #define UBOUND 256*LBOUND #else #define UBOUND 512*LBOUND #endif static long get_user_shmmax() { char *uval; long x=0; uval = getenv("ARMCI_DEFAULT_SHMMAX"); if(uval != NULL){ sscanf(uval,"%ld",&x); if(x<1L || x> 2048L){ fprintf(stderr,"incorrect ARMCI_DEFAULT_SHMMAX should be <1,2048>mb and 2^N Found=%ld\n",x); x=0; } } return x*1048576; /* return value in bytes */ } /*\ determine the max shmem segment size using bisection \*/ int armci_shmem_test() { long x; int i,rc; long upper_bound=UBOUND; long lower_bound=0; x = get_user_shmmax(); if(!x) x = upper_bound; else upper_bound =x; if(DEBUG_){printf("%d: x = %ld upper_bound=%ld\n",armci_me, x, upper_bound); fflush(stdout);} for(i=1;;i++){ long step; rc = armci_test_allocate(x); if(DEBUG_) printf("%d:test %d size=%ld bytes status=%d\n",armci_me,i,x,rc); if(rc){ lower_bound = x; step = (upper_bound -x)>>1; if(step < PAGE) break; x += step; }else{ upper_bound = x; step = (x-lower_bound)>>1; if(step>=20; x <<=20; } if(!lower_bound){ /* try if can get LBOUND - necessary if search starts from UBOUND */ lower_bound=LBOUND; rc = armci_test_allocate(lower_bound); if(!rc) return(0); } if(DEBUG_) printf("%ld bytes segment size, %d calls \n",lower_bound,i); return (int)( lower_bound>>20); /* return shmmax in mb */ } #ifdef SHMMAX_SEARCH_NO_FORK /*\ determine the max shmem segment size by halving \*/ static int armci_shmem_test_no_fork() { long x; int i,rc; long lower_bound=_SHMMAX*SHM_UNIT; #define UBOUND_SEARCH_NO_FORK (256*SHM_UNIT*SHM_UNIT) x = get_user_shmmax(); if(!x) x = UBOUND_SEARCH_NO_FORK; for(i=1;;i++){ rc = armci_shmalloc_try(x); if(DEBUG_) printf("%d:test by halving size=%ld bytes rc=%d\n",armci_me,x,rc); if(rc){ lower_bound = x; break; }else{ x >>= 1 ; if(x>20); /* return shmmax in mb */ } #endif #ifdef MULTI_CTX void armci_nattach_preallocate_info(int* segments, int *segsize) { int x; char *uval; uval = getenv("LIBELAN_NATTACH"); if(uval != NULL){ sscanf(uval,"%d",&x); if(x<2 || x>8) armci_die("Error in LIBELAN_NATTACH <8, >1 ",(int)x); }else armci_die("Inconsistent configuration: ARMCI needs LIBELAN_NATTACH",0); *segments =x; *segsize = (int) (SHM_UNIT * MinShmem); } #endif /* Create shared region to store kr_malloc context in shared memory */ void armci_krmalloc_init_ctxshmem() { void *myptr=NULL; long idlist[SHMIDLEN]; long size; int offset = sizeof(void*)/sizeof(int); /* to store shared memory context and myptr */ size = SHMEM_CTX_MEM; if(armci_me == armci_master ){ myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_krmalloc_init_ctxshmem: could not create", (int)(size>>10)); if(size) *(volatile void**)myptr = myptr; if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem addr mptr=%p ref=%p size=%ld\n", armci_me, myptr, *(void**)myptr, size); fflush(stdout); } /* Bootstrapping: allocate storage for ctx_shmem_global. NOTE:there is offset,as master places its address at begining for others to see */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); *ctx_shmem_global = ctx_shmem; /*master copies ctx into shared region */ } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_krmalloc_init_ctxshmem: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } /* store context info */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem: shmid=%d off=%ld size=%ld\n", armci_me, ctx_shmem_global->shmid, ctx_shmem_global->shmoffset, (long)ctx_shmem_global->shmsize); fflush(stdout); } } } void armci_shmem_init() { #ifdef ALLOC_MUNMAP #if defined(QUADRICS) # if (defined(__ia64__) || defined(__alpha)) && !defined(DECOSF) /* this is to determine size of Elan Main memory allocator for munmap */ long x; char *uval; uval = getenv("LIBELAN_ALLOC_SIZE"); if(uval != NULL){ sscanf(uval,"%ld",&x); if((x>80000000) && (x< 4*1024*1024*1024L)){ max_alloc_munmap = (x>>20) - 72; if(DEBUG_){ printf("%d: max_alloc_munmap is %ld\n",armci_me,max_alloc_munmap); fflush(stdout); } } } /* an alternative approach is to use MMAP area where we get the address from the Elan environment variable in qsnetlibs 1.4+ */ uval = getenv("LIBELAN3_MMAPBASE"); if(uval != NULL){ sscanf(uval,"%p",&armci_elan_starting_address); } # endif # if defined(__ia64__) /* need aligment on 1MB boundary rather than the actual pagesize */ pagesize = 1024*1024; logpagesize = 20; # else /* determine log2(pagesize) needed for address alignment */ int tp=512; logpagesize = 9; pagesize = getpagesize(); if(tp>pagesize)armci_die("armci_shmem_init:pagesize",pagesize); while(tpmax_alloc_munmap && !armci_elan_starting_address) x=max_alloc_munmap; # else x = 10; /* mb */ # endif # endif if(DEBUG_){ printf("%d:shmem_init: %d mbytes max segment size\n",armci_me,x);fflush(stdout);} MinShmem = (long)(x<<10); /* make sure it is in kb: mb <<10 */ MaxShmem = MAX_REGIONS*MinShmem; # ifdef REPORT_SHMMAX printf("%d using x=%d SHMMAX=%ldKB\n", armci_me,x, MinShmem); fflush(stdout); # endif #else /* nothing to do here - limits were given */ #endif } armci_krmalloc_init_ctxshmem(); if(DEBUG_)printf("%d: out of shmem_init\n",armci_me); } void armci_set_shmem_limit_per_node(int nslaves) { if (MaxShmem_per_core > 0) MaxShmem = nslaves*MaxShmem_per_core; if (MinShmem_per_core > 0) MinShmem = nslaves*MinShmem_per_core; } void armci_set_shmem_limit_per_core(unsigned long shmemlimit) { MaxShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; MinShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; } /*\ application can reset the upper limit (bytes) for memory allocation \*/ void armci_set_shmem_limit(unsigned long shmemlimit) { unsigned long kbytes; kbytes = (shmemlimit + SHM_UNIT -1)/SHM_UNIT; if(MaxShmem > kbytes) MaxShmem = kbytes; if(MinShmem > kbytes) MinShmem = kbytes; } static void shmem_errmsg(size_t size) { long sz=(long)size; printf("******************* ARMCI INFO ************************\n"); printf("The application attempted to allocate a shared memory segment "); printf("of %ld bytes in size. This might be in addition to segments ",sz); printf("that were allocated succesfully previously. "); printf("The current system configuration does not allow enough "); printf("shared memory to be allocated to the application.\n"); printf("This is most often caused by:\n1) system parameter SHMMAX "); printf("(largest shared memory segment) being too small or\n"); printf("2) insufficient swap space.\n"); printf("Please ask your system administrator to verify if SHMMAX "); printf("matches the amount of memory needed by your application and "); printf("the system has sufficient amount of swap space. "); printf("Most UNIX systems can be easily reconfigured "); printf("to allow larger shared memory segments,\n"); printf("see http://www.emsl.pnl.gov/docs/global/support.shtml\n"); printf("In some cases, the problem might be caused by insufficient swap space.\n"); printf("*******************************************************\n"); } static struct shm_region_list{ char *addr; long id; long sz; long attached; }region_list[MAX_REGIONS]; static int alloc_regions=0; static long occup_blocks=0; /* Terminology * region - actual piece of shared memory allocated from OS * block - a part of allocated shmem that is given to the requesting process */ static int last_allocated=-1; unsigned long armci_max_region() { return MinShmem; } int find_regions(char *addrp, long* id, int *region) { int nreg, reg; if(last_allocated!=-1){ reg=last_allocated; last_allocated = -1; } else{ for(reg=-1,nreg=0;nreg= region_list[nreg].addr && addrp < (region_list[nreg].addr + region_list[nreg].sz)) { reg = nreg; break; } } if(reg == -1) armci_die("find_regions: failed to locate shared region", 0L); } *region = reg; *id = region_list[reg].id; return 1; } /* returns the shmem info based on the addr */ int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize) { int region; long id; find_regions(addrp, &id, ®ion); *shmid = id; *shmoffset = (long)(addrp - region_list[region].addr); *shmsize = region_list[region].sz; return 1; } long armci_shm_reg_size(int i, long id) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_size: bad i",i); return region_list[i].sz; } void* armci_shm_reg_ptr(int i) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_ptr: bad i",i); return (void *)region_list[i].addr; } Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize) { /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset)*/ long idlist[SHMIDLEN]; Header *p = NULL; idlist[1] = (long)shmid; idlist[0] = shmoffset; idlist[IDLOC+1] = shmsize; /* CHECK : idlist in CreateShmem????*/ if(!(p=(Header*)Attach_Shared_Region(idlist+1, shmsize, idlist[0]))) armci_die("kr_malloc:could not attach",(int)(p->s.shmsize>>10)); #if DEBUG_ printf("%d: armci_get_shmem_ptr: %d %ld %ld %p\n", armci_me, idlist[1], idlist[0], shmsize, p); fflush(stdout); #endif return p; } char *Attach_Shared_Region(id, size, offset) long *id, offset, size; { int reg, found, shmflag=0; static char *temp; if(alloc_regions>=MAX_REGIONS) armci_die("Attach_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:AttachSharedRegion %d:size=%ld id=%ld\n", armci_me, create_call++, size,*id); fflush(stdout); } /* under Linux we can get valid id=0 */ #ifndef LINUX if(!*id) armci_die("Attach_Shared_Region: shmem ID=0 ",(int)*id); #endif /* first time needs to initialize region_list structure */ if(!alloc_regions){ for(reg=0;reg= MAX_REGIONS) armci_die("Create_Shared_Region:allocate:too many regions allocated ",0); last_allocated = alloc_regions; #ifdef SHMMAX_SEARCH_NO_FORK if (ptr_search_no_fork){ temp = ptr_search_no_fork; id = id_search_no_fork; ptr_search_no_fork = (char*)0; /* do not look at it again */ }else #endif { if ( (id = armci_shmget(sz,"armci_allocate")) < 0 ) { fprintf(stderr,"id=%d size=%ld\n",id, size); shmem_errmsg(sz); armci_die("allocate: failed to create shared region ",id); } if ( (long)( (temp = shmat(id, pref_addr, shmflag))) == -1L){ char command[64]; CLEANUP_CMD(command); if(system(command) == -1) printf("Please clean shared memory (id=%d): see man ipcrm\n",id); armci_die("allocate: failed to attach to shared region id=",id); } if(DEBUG_){ printf("%d:allocate:attach:id=%d paddr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } #if 1 /* delete segment id so that OS cleans it when all attached processes are gone */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); #endif } POST_ALLOC_CHECK(temp,sz); region_list[alloc_regions].addr = temp; region_list[alloc_regions].id = id; region_list[alloc_regions].attached=1; region_list[alloc_regions].sz=sz; alloc_regions++; if(DEBUG2_){ printf("%d:allocate:id=%d addr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } return (void*) (temp); } /******************** common code for the two versions *********************/ /*\ Allocate a block of shared memory - called by master process \*/ char *Create_Shared_Region(long *id, long size, long *offset) { char *temp; int reg, refreg=0,nreg; if(alloc_regions>=MAX_REGIONS) armci_die("Create_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:CreateSharedRegion %d:size=%ld\n",armci_me,create_call++,size); fflush(stdout); } /*initialization: 1st allocation request */ if(!alloc_regions){ for(reg=0;reg #include "armcip.h" armci_user_threads_t armci_user_threads; void armci_init_threads() { int i, bytes; char *uval = getenv("ARMCI_MAX_THREADS"); armci_user_threads.max = 1; armci_user_threads.avail = 0; if (uval != NULL) sscanf(uval, "%d", &armci_user_threads.max); if (armci_user_threads.max < 1 || armci_user_threads.max > ARMCI_THREADS_LIMIT) { printf("Error: Only 1-%d threads are supported. ",ARMCI_THREADS_LIMIT); printf("Set ARMCI_MAX_THREADS appropriately\n"); fflush(stdout); armci_die("armci_init_threads: failed", 0); } bytes = sizeof(thread_id_t) * armci_user_threads.max; if ( !(armci_user_threads.ids = (thread_id_t*) malloc(bytes)) ) { armci_die("armci_init_threads: armci_user_threads.ids malloc failed", armci_user_threads.max); } memset(armci_user_threads.ids, 0, bytes); #if 0 /* spinlock has void return value */ if (THREAD_LOCK_INIT(armci_user_threads.lock) || THREAD_LOCK_INIT(armci_user_threads.buf_lock) || THREAD_LOCK_INIT(armci_user_threads.net_lock)) armci_die("armci_init_threads:locks initialization failed", 0); #else THREAD_LOCK_INIT(armci_user_threads.lock); THREAD_LOCK_INIT(armci_user_threads.buf_lock); THREAD_LOCK_INIT(armci_user_threads.net_lock); #endif #if 0 /* using one lock per socket for now, it might be feasible (and usefull) * to use two (one for sending and one for receiving) */ armci_user_threads.sock_locks = malloc(armci_nclus *sizeof(thread_lock_t)); for (i = 0; i < armci_nclus; i++) if (THREAD_LOCK_INIT(armci_user_threads.sock_locks[i])) armci_die("armci_init_threads:sock locks initialization failed", i); #endif } void armci_finalize_threads() { THREAD_LOCK_DESTROY(armci_user_threads.lock); THREAD_LOCK_DESTROY(armci_user_threads.net_lock); THREAD_LOCK_DESTROY(armci_user_threads.buf_lock); free(armci_user_threads.ids); } /* calling armci_thread_idx for every function that accesses thread-private data * might be expensive -- needs optiomization */ INLINE int armci_thread_idx() { int i, n = ARMCI_MIN(armci_user_threads.avail, armci_user_threads.max); thread_id_t id = THREAD_ID_SELF(); for (i = 0; i < n; i++) if (id == armci_user_threads.ids[i]) { /*PRNDBG2("thread id=%ld already registered, idx=%d\n", id, i);*/ return i; } /* see this thread for the first time */ return armci_register_thread(id); } INLINE int armci_register_thread(thread_id_t id) { int i; THREAD_LOCK(armci_user_threads.lock); i = armci_user_threads.avail; armci_user_threads.avail++; THREAD_UNLOCK(armci_user_threads.lock); if (i < armci_user_threads.max) armci_user_threads.ids[i] = id; else armci_die("armci_thread_idx: too many threads, adjust ARMCI_MAX_THREADS", armci_user_threads.avail); PRNDBG2("registered a new thread: idx=%d, id=%ld\n", i, id); return i; } ga-5-4/armci/src-portals/spinlock.h0000644000175000017500000001226112662210425015371 0ustar mbamba/** * @file spinlock.h * * This file attempts to implement spin locks for various platforms and/or CPU * instruction sets. */ #ifndef SPINLOCK_H #define SPINLOCK_H #define DEBUG_SPINLOCK 0 #define OPENPA 0 #if OPENPA # if DEBUG_SPINLOCK # warning SPINLOCK: openpa # endif # define SPINLOCK # include "opa_primitives.h" # define LOCK_T OPA_int_t # define TESTANDSET(x) OPA_swap_int((x), 1) # define MEMORY_BARRIER OPA_read_write_barrier #elif (defined(PPC) || defined(__PPC__) || defined(__PPC)) # if DEBUG_SPINLOCK # warning SPINLOCK: PPC # endif # define SPINLOCK # include "asm-ppc.h" //# define TESTANDSET testandset //# define TESTANDSET acquireLock # define armci_acquire_spinlock acquire_spinlock # define armci_release_spinlock release_spinlock # define MEMORY_BARRIER memory_barrier static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } static void memory_barrier() { __asm__ __volatile__ ("sync" : : : "memory"); } #elif defined(__i386__) || defined(__x86_64__) # if DEBUG_SPINLOCK # warning SPINLOCK: x86_64 # endif # define SPINLOCK # include "atomics-i386.h" static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } # define TESTANDSET testandset #elif defined(__ia64) # if DEBUG_SPINLOCK # warning SPINLOCK: ia64 # endif # define SPINLOCK # include "atomic_ops_ia64.h" static int testandset(void *spinlock) { int val=1; int res; atomic_swap_int(spinlock, val, &res); return res; } # define TESTANDSET testandset #elif defined(DECOSF) # if DEBUG_SPINLOCK # warning SPINLOCK: DECOSF # endif # error "no implementation" #elif defined(SGI) # if DEBUG_SPINLOCK # warning SPINLOCK: SGI # endif # include # define SPINLOCK # define TESTANDSET(x) __lock_test_and_set((x), 1) # define RELEASE_SPINLOCK __lock_release /*#elif defined(AIX)*/ #elif HAVE_SYS_ATOMIC_OP_H # if DEBUG_SPINLOCK # warning SPINLOCK: sys/atomic_op.h (AIX) # endif # include # define SPINLOCK # define TESTANDSET(x) (_check_lock((x), 0, 1)==TRUE) # define RELEASE_SPINLOCK(x) _clear_lock((x),0) #elif defined(SOLARIS) # if DEBUG_SPINLOCK # warning SPINLOCK: SOLARIS # endif # include # include # define SPINLOCK # define TESTANDSET(x) (!_lock_try((x))) # define RELEASE_SPINLOCK _lock_clear #elif defined(MACX) #elif defined(HPUX__) # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX__ # endif extern int _acquire_lock(); extern void _release_lock(); # define SPINLOCK # define TESTANDSET(x) (!_acquire_lock((x))) # define RELEASE_SPINLOCK _release_lock #elif defined(HPUX) && defined(__ia64) /* HPUX on IA64, non gcc */ # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX ia64 # endif # define SPINLOCK typedef unsigned int slock_t; # include # define TESTANDSET(lock) _Asm_xchg(_SZ_W, lock, 1, _LDHINT_NONE) # define RELEASE_SPINLOCK(lock) (*((volatile LOCK_T *) (lock)) = 0) #elif defined(NEC) # if DEBUG_SPINLOCK # warning SPINLOCK: NEC # endif extern ullong ts1am_2me(); # define LOCK_T ullong # define _LKWD (1ULL << 63) # define SPINLOCK # define TESTANDSET(x) ((_LKWD & ts1am_2me(_LKWD, 0xffULL, (ullong)(x)))) # define MEMORY_BARRIER mpisx_clear_cache extern void mpisx_clear_cache(); # define RELEASE_SPINLOCK(x) ts1am_2me(0ULL, 0xffULL, (ullong)x); #endif #ifdef SPINLOCK #if DEBUG_ # if HAVE_STDIO_H # include # endif #endif #if HAVE_UNISTD_H # include #endif #ifndef DBL_PAD # define DBL_PAD 16 #endif /* make sure that locks are not sharing the same cache line */ typedef struct{ double lock[DBL_PAD]; }pad_lock_t; #ifndef LOCK_T # define LOCK_T int #endif #define PAD_LOCK_T pad_lock_t static inline void armci_init_spinlock(LOCK_T *mutex) { #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif } #ifdef TESTANDSET static inline void armci_acquire_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else int loop=0, maxloop =10; while (TESTANDSET(mutex)){ loop++; if(loop==maxloop){ # if DEBUG_ extern int armci_me; printf("%d:spinlock sleeping\n",armci_me); fflush(stdout); # endif usleep(1); loop=0; } } #endif } #ifdef RELEASE_SPINLOCK # ifdef MEMORY_BARRIER # define armci_release_spinlock(x) MEMORY_BARRIER(); RELEASE_SPINLOCK(x) # else # define armci_release_spinlock(x) RELEASE_SPINLOCK(x) # endif #else static inline void armci_release_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif # if (defined(MACX)||defined(LINUX)) && defined(__GNUC__) && defined(__ppc__) __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif } #endif /* RELEASE_SPINLOCK */ #endif /* TESTANDSET */ #endif /* SPINLOCK */ #endif /* SPINLOCK_H */ ga-5-4/armci/src-portals/ds-shared.c0000644000175000017500000004011612662210425015414 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "request.h" #include "message.h" #include "memlock.h" #include "copy.h" #include "gpc.h" #include #include #ifdef WIN32 #include #else #include #endif #define DEBUG_ 0 #define DEBUG1 0 #ifndef SERV # define SERV 2 #endif #ifdef SOCKETS # define EQ_TAGS(a_, b_) ((a_) == (b_)) #else # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #endif int _armci_server_started=0; extern active_socks_t *_armci_active_socks; #ifdef ARMCI_CHECK_STATE typedef struct sarns{ int data; long data1; struct sarns *next; } sarnode; sarnode **sarn_np=NULL; sarnode * sarlist_add(int pr, int i,long j) { sarnode **p = &sarn_np[pr]; sarnode *n = (sarnode *)malloc(sizeof(sarnode)); assert(n != NULL); n->next = *p; *p = n; n->data = i; n->data1 = j; return *p; } void sarlist_remove(sarnode **p) { if(*p != NULL){ sarnode *n = *p; *p = (*p)->next; free(n); } } sarnode **sarlist_search(sarnode **n, long i) { while (*n != NULL){ if ((*n)->data == i){ return n; } n = &(*n)->next; } return NULL; } void sarlist_print(int proc) { sarnode *n =sarn_np[proc]; if (n == NULL){ /*printf("sarlist is empty\n");*/ } while (n != NULL){ printf("(%d):%d %d next=%d\n", armci_me,n->data,n->data1,(n->next==NULL)?0:1); n = n->next; } } #endif /*\ client sends request to server \*/ void armci_send_req(int proc, request_header_t* msginfo, int len,int tag) { int hdrlen = sizeof(request_header_t); int bytes; ARMCI_PR_DBG("enter",0); if(msginfo->operation == GET) { if(msginfo->format==VECTOR && msginfo->ehlen > 0) { printf("%s [cp] unhandled condition in send_req for VECTOR and ehlen\n",Portals_ID()); abort(); bytes = msginfo->dscrlen + hdrlen + msginfo->datalen; } else { bytes = msginfo->dscrlen + hdrlen; } } else bytes = msginfo->bytes + hdrlen; if(DEBUG_){printf("%d: sending req %d (len=%d dscr=%d data=%d) to %d \n", armci_me, msginfo->operation, bytes,msginfo->dscrlen, msginfo->datalen,proc); fflush(stdout); } if(bytes > len) armci_die2("armci_send_req:buffer overflow",bytes,len); msginfo->tag.data_ptr = (msginfo+1); // not really data, but dscr ptr armci_send_req_msg(proc,msginfo, bytes,tag); ARMCI_PR_DBG("exit",0); } /*\ client sends strided data + request to server \*/ void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[],int tag) { int hdrlen = sizeof(request_header_t); int dscrlen = msginfo->dscrlen; int datalen = msginfo->datalen; int cluster = armci_clus_id(proc); int bytes; int i,na; char *a; double *tmp; ARMCI_PR_DBG("enter",0); bytes = msginfo->bytes + hdrlen; if(0){ printf("%d:sending strided %d to(%d,%d,%d) bytes=%d dslen=%d dlen=%d,\n", armci_me, msginfo->operation, msginfo->to, cluster, proc, bytes, dscrlen, datalen); fflush(stdout); } armci_write_strided(ptr, strides, stride_arr, count, bdata); msginfo->tag.data_ptr = (msginfo+1); #ifdef RMO_DEBUG_ a = (char *) (msginfo + 1); a += msginfo->dscrlen; tmp = (double *) a; na = msginfo->datalen/sizeof(double); for(i=0; idatalen; char *buf; ARMCI_PR_DBG("enter",0); if(rcvlen)datalen=rcvlen; if(DEBUG_) { printf("%d:armci_rcv_data: bytes= %d \n", armci_me, datalen); fflush(stdout); } if(datalen == 0) armci_die("armci_rcv_data: no data to receive",datalen); buf = armci_ReadFromDirect(proc, msginfo, datalen); if(DEBUG_){ printf("%d:armci_rcv_data: got %d bytes \n",armci_me,datalen); fflush(stdout); } ARMCI_PR_DBG("exit",0); return(buf); } /*\ client receives vector data from server and unpacks to the right loc \*/ void armci_rcv_vector_data(int proc, request_header_t* msginfo, armci_giov_t darr[], int len) { ARMCI_PR_DBG("enter",0); char *buf = armci_rcv_data(proc, msginfo, 0); armci_vector_from_buf(darr, len, buf); ARMCI_PR_DBG("exit",0); } /*\ client receives strided data from server \*/ void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]) { char *databuf; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d: armci_rcv_strided_data: expecting datalen %d from %d\n", armci_me, datalen, proc); fflush(stdout); } databuf = armci_ReadFromDirect(proc,msginfo,0); armci_read_strided(ptr, strides, stride_arr, count, databuf); ARMCI_PR_DBG("exit",0); } void armci_rem_state(int clus) { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc = 0; request_header_t *msginfo; destproc = SERVER_NODE(clus); msginfo = (request_header_t *)GET_SEND_BUFFER(bufsize,STATE,destproc); int tag=0; ARMCI_PR_DBG("enter",0); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(clus); msginfo->operation = STATE; msginfo->bytes =0; msginfo->datalen =sizeof(int); msginfo->tag.data_ptr = (msginfo+1); if(DEBUG_){ printf("%d(c):sending ACKreq to %d clus=%d\n",armci_me,msginfo->to,clus); fflush(stdout); } armci_send_req(armci_clus_info[clus].master, msginfo, bufsize,tag); armci_rcv_data(armci_clus_info[clus].master, msginfo,0); /* receive */ FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ get ACK from server \*/ void armci_rem_ack(int clus) { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc = 0; request_header_t *msginfo; destproc = SERVER_NODE(clus); msginfo = (request_header_t *) GET_SEND_BUFFER(bufsize,ACK,destproc); int tag=0; ARMCI_PR_DBG("enter",0); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(clus); msginfo->operation = ACK; msginfo->bytes =0; msginfo->datalen =sizeof(int); msginfo->tag.data_ptr = (msginfo+1); if(DEBUG_){ printf("%d(c):sending ACKreq to %d clus=%d\n",armci_me,msginfo->to,clus); fflush(stdout); } armci_send_req(armci_clus_info[clus].master, msginfo, bufsize,tag); armci_rcv_data(armci_clus_info[clus].master, msginfo,0); /* receive ACK */ FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ request to QUIT sent by client \*/ void armci_serv_quit() { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc; request_header_t *msginfo; destproc = SERVER_NODE(armci_clus_me); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,QUIT,destproc); int tag=0; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d master: sending quit request to server\n",armci_me); fflush(stdout); } msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->operation = QUIT; if(ACK_QUIT) msginfo->bytes = msginfo->datalen = sizeof(int); /* ACK */ else msginfo->bytes = msginfo->datalen = 0; /* no ACK */ armci_send_req(armci_master, msginfo, bufsize,tag); if(ACK_QUIT){ int stat; stat = *(int*)armci_rcv_data(armci_master,msginfo,0); /* receive ACK */ if(stat != QUIT) armci_die("armci_serv_quit: wrong response from server", stat); FREE_SEND_BUFFER(msginfo); } ARMCI_PR_SDBG("exit",0); } /***************************** server side *********************************/ static void armci_check_req(request_header_t *msginfo, int buflen) { ARMCI_PR_SDBG("enter",msginfo->operation); if((msginfo->to != armci_me && msginfo->to < armci_master) || msginfo->to >= armci_master + armci_clus_info[armci_clus_me].nslave) /*armci_die("armci_check_req: invalid to", msginfo->to);*/ printf("\n%d:got following to %d",armci_me,msginfo->to); if(msginfo->dscrlen < 0) armci_die("armci_check_req: dscrlen < 0", msginfo->dscrlen); if(msginfo->datalen < 0) armci_die("armci_check_req: datalen < 0", msginfo->datalen); if(msginfo->dscrlen > (int)msginfo->bytes) armci_die2("armci_check_req: dsclen > bytes", msginfo->dscrlen, msginfo->bytes); ARMCI_PR_SDBG("exit",0); } /*\ server response - send data to client \*/ void armci_send_data(request_header_t* msginfo, void *data) { int to = msginfo->from; ARMCI_PR_SDBG("enter",0); armci_WriteToDirect(to, msginfo, data); ARMCI_PR_SDBG("exit",0); } /*\ server sends strided data back to client \*/ void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { int i,na; double *a = NULL; int to = msginfo->from; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d(server): sending datalen = %d to %d %p\n", armci_me, msginfo->datalen, to,ptr); fflush(stdout); } /* for small contiguous blocks copy into a buffer before sending */ armci_write_strided(ptr, strides, stride_arr, count, bdata); #ifdef RMO_PORTALS_DEBUG_GET a = (double *) bdata; na = msginfo->datalen/sizeof(double); for(i=0; idatalen,to); fflush(stdout); } ARMCI_PR_SDBG("exit",0); } /*\ server sends ACK to client ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: terminating request by %d\n",armci_me,msginfo->from); fflush(stdout); } portals_ds_send_ack(ev->initiator,ev->hdr_data); \*/ void armci_server_ack(request_header_t* msginfo) { int *ack=(int*)(msginfo+1); ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: sending ACK to %d\n",armci_me,msginfo->from); fflush(stdout); } #ifndef OLD_PORTALS_CODE portals_ds_send_ack(ev->initiator,ev->hdr_data); #else *ack = ACK; if(msginfo->datalen != sizeof(int)) armci_die("armci_server_ack: bad datalen=",msginfo->datalen); armci_send_data(msginfo,ack); #endif ARMCI_PR_SDBG("exit",0); } /*\ server action triggered by request to quit \*/ void armci_server_goodbye(request_header_t* msginfo) { ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: terminating request by %d\n",armci_me,msginfo->from); fflush(stdout); } portals_ds_send_ack(ev->initiator,ev->hdr_data); #ifdef ARMCI_CHECK_STATE_ for(int i=0;itag.user_ptr; /* check what we got */ // armci_check_req(msginfo,buflen); from = msginfo->from; if(DEBUG_){ printf("%d(serv):got %d request from %d\n",armci_me,msginfo->operation, from); fflush(stdout); } /*if(msginfo->operation==GET)fprintf(stderr,"GET request received with tag: %d\n",msginfo->tag);*/ switch(msginfo->operation){ # ifdef ARMCI_CHECK_STATE case STATE: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); if(DEBUG_){printf("\n%d:state request\n",armci_me);fflush(stdout);} sarlist_print(msginfo->from); armci_WriteToDirect(msginfo->from, msginfo, (msginfo+1)); break; # endif case QUIT: if(DEBUG_){ printf("%d(serv):got QUIT request from %d\n",armci_me, from); fflush(stdout); } armci_server_goodbye(msginfo); break; /*pessimism?*/ case ACK: // printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); // abort(); if(DEBUG_) { fprintf(stdout, "%d(server): got ACK request from %d\n", armci_me, msginfo->from); fflush(stdout); } armci_server_ack(msginfo); break; case ATTACH: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); if(DEBUG_){ printf("%d(serv):got ATTACH request from%d\n",armci_me, from); fflush(stdout); } armci_server_ipc(msginfo, descr, buffer, buflen); break; case ARMCI_SWAP: case ARMCI_SWAP_LONG: case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: // printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); // abort(); armci_server_rmw(msginfo,descr,buffer); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_ds_send_ack(ev->initiator,ev->hdr_data); # endif break; case LOCK: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); armci_server_lock(msginfo); break; case UNLOCK: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); armci_server_unlock(msginfo, descr); msginfo->tag.ack=ARMCI_STAMP; x_net_send_ack(msginfo,msginfo->from,msginfo->tag.ack_ptr,&msginfo->tag.ack); break; default: if(msginfo->format ==VECTOR){ // if(msginfo->operation != PUT && msginfo->operation !=GET && !ACC(msginfo->operation)) { // printf("[ds %d]: operation=%d (format==VECTOR) not supported yet\n",armci_me,msginfo->operation); // abort(); // } armci_server_vector(msginfo, descr, buffer, buflen); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_ds_send_ack(ev->initiator,ev->hdr_data); # else if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)){ portals_ds_send_ack(ev->initiator,ev->hdr_data); } # endif } else if(msginfo->format ==STRIDED){ // if(msginfo->operation != PUT && msginfo->operation != GET && !ACC(msginfo->operation)) { // printf("[ds %d]: operation=%d (format==STRIDED) not supported yet\n",armci_me,msginfo->operation); // abort(); // } armci_server(msginfo, descr, buffer, buflen); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_ds_send_ack(ev->initiator,ev->hdr_data); # else if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)){ portals_ds_send_ack(ev->initiator,ev->hdr_data); } # endif } else armci_die2("armci_data_serv: unknown format code", msginfo->format, msginfo->from); } ARMCI_PR_SDBG("exit",0); } ga-5-4/armci/src-portals/groups.c0000644000175000017500000004152112662210425015062 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: groups.c,v 1.4.6.2 2007-08-15 08:37:16 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI #endif #include "armcip.h" #include "message.h" #define DEBUG_ 0 MPI_Comm ARMCI_COMM_WORLD; /*dup of MPI_COMM_WORLD. Initialized first thing in ARMCI_Init*/ ARMCI_Group ARMCI_Default_Proc_Group = 0; ARMCI_Group ARMCI_World_Proc_Group = 0; typedef struct group_list_struct { ARMCI_Group group; ARMCI_iGroup igroup; struct group_list_struct *next; } group_list_t; group_list_t *group_list = NULL; ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; assert(group_list != NULL); while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { return ¤t_group_list_item->igroup; } current_group_list_item = current_group_list_item->next; } armci_die("ARMCI_Group lookup failed", -1); return NULL; } static void armci_create_group_and_igroup(ARMCI_Group *group, ARMCI_iGroup **igroup) { group_list_t *new_group_list_item = NULL; group_list_t *last_group_list_item = NULL; /* create the new group in the linked list */ last_group_list_item = group_list; while (last_group_list_item->next != NULL) { last_group_list_item = last_group_list_item->next; } new_group_list_item = malloc(sizeof(group_list_t)); new_group_list_item->group = last_group_list_item->group + 1; new_group_list_item->next = NULL; *igroup = &new_group_list_item->igroup; *group = new_group_list_item->group; last_group_list_item->next = new_group_list_item; } #ifdef ARMCI_GROUP void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group) { armci_msg_group_bcast_scope(SCOPE_ALL, buffer, len, ARMCI_Absolute_id(group, root), group); } #else void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm) { int result; MPI_Comm_compare(comm, ARMCI_COMM_WORLD, &result); if(result == MPI_IDENT) armci_msg_brdcst(buffer, len, root); else MPI_Bcast(buffer, len, MPI_BYTE, root, (MPI_Comm)comm); } #endif int ARMCI_Group_rank(ARMCI_Group *group, int *rank) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP if(!igroup) return MPI_ERR_GROUP; *rank = igroup->grp_attr.grp_me; return MPI_SUCCESS; #else return MPI_Group_rank((MPI_Group)(igroup->igroup), rank); #endif } void ARMCI_Group_size(ARMCI_Group *group, int *size) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP *size = igroup->grp_attr.nproc; #else MPI_Group_size((MPI_Group)(igroup->igroup), size); #endif } int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank) { int abs_rank,status; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP assert(group_rank < igroup->grp_attr.nproc); return igroup->grp_attr.proc_list[group_rank]; #else MPI_Group grp; status = MPI_Comm_group(ARMCI_COMM_WORLD,&grp); MPI_Group_translate_ranks(igroup->igroup,1,&group_rank,grp,&abs_rank); return(abs_rank); #endif } void ARMCI_Group_set_default(ARMCI_Group *group) { ARMCI_Default_Proc_Group = *group; } void ARMCI_Group_get_default(ARMCI_Group *group_out) { *group_out = ARMCI_Default_Proc_Group; } void ARMCI_Group_get_world(ARMCI_Group *group_out) { *group_out = ARMCI_World_Proc_Group; } static void get_group_clus_id(ARMCI_iGroup *igroup, int grp_nproc, int *grp_clus_id) { #ifdef ARMCI_GROUP int i; assert(grp_nproc<=igroup->grp_attr.nproc); for(i=0; igrp_attr.proc_list[i]); } #else int i, *ranks1, *ranks2; MPI_Group group2; /* Takes the list of processes from one group and attempts to determine * the corresponding ranks in a second group (here, ARMCI_COMM_WORLD) */ ranks1 = (int *)malloc(2*grp_nproc*sizeof(int)); ranks2 = ranks1 + grp_nproc; for(i=0; iigroup, grp_nproc, ranks1, group2, ranks2); /* get the clus_id of processes */ for(i=0; iicomm; #endif int grp_me, grp_nproc, grp_nclus, grp_clus_me; armci_clus_t *grp_clus_info=NULL; #ifdef CLUSTER int i, len, root=0; #endif #ifndef ARMCI_GROUP if(comm==MPI_COMM_NULL || igroup->igroup==MPI_GROUP_NULL) armci_die("group_process_list: NULL COMMUNICATOR",0); #endif ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_nproc); #ifdef CLUSTER # ifdef ARMCI_GROUP /*all processes construct the clus_info structure in parallel*/ grp_clus_info = group_construct_clusinfo(&grp_nclus, group); # else /* process 0 gets group cluster information: grp_nclus, grp_clus_info */ if(grp_me == 0) { grp_clus_info = group_construct_clusinfo(&grp_nclus, group); } /* process 0 broadcasts group cluster information */ len = sizeof(int); ARMCI_Bcast_(&grp_nclus, len, root, comm); if(grp_me){ /* allocate memory */ grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*grp_nclus; ARMCI_Bcast_(grp_clus_info, len, root, comm); # endif /* determine current group cluster node id by comparing me to master */ grp_clus_me = grp_nclus-1; for(i =0; i< grp_nclus-1; i++) { if(grp_me < grp_clus_info[i+1].master){ grp_clus_me=i; break; } } #else /* !CLUSTER */ grp_clus_me = 0; grp_nclus = 1; grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!grp_clus_info)armci_die("malloc failed for clusinfo",grp_nclus); strcpy(grp_clus_info[0].hostname, armci_clus_info[0].hostname); grp_clus_info[0].master=0; grp_clus_info[0].nslave=grp_nproc; #endif /* CLUSTER */ #ifdef ARMCI_GROUP /*Set in ARMCI_Group_create. ARMCI_Group_rank is used before setting this field. So moving it there in the generic implementation.*/ #else grp_attr->grp_me = grp_me; #endif grp_attr->grp_clus_info = grp_clus_info; grp_attr->grp_nclus = grp_nclus; grp_attr->grp_clus_me = grp_clus_me; } /* attribute caching: group_cluster_information and memory_offset should be cached in group data structure */ static void armci_cache_attr(ARMCI_Group *group) { armci_grp_attr_t *grp_attr; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); /* allocate storage for the attribute content. Note: Attribute contents should be stored in persistent memory */ grp_attr = &(igroup->grp_attr); /* get group cluster information and grp_attr */ group_process_list(group, grp_attr); } armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return(&(igroup->grp_attr)); } static void armci_igroup_finalize(ARMCI_iGroup *igroup) { #ifdef ARMCI_GROUP int world_me, i; world_me = armci_msg_me(); for(i=0; igrp_attr.nproc; i++) { if(igroup->grp_attr.proc_list[i] == world_me) { break; } } if(i==igroup->grp_attr.nproc) { return; /*not in group to be freed*/ } assert(igroup); free(igroup->grp_attr.grp_clus_info); free(igroup->grp_attr.proc_list); igroup->grp_attr.nproc = 0; #else int rv; assert(igroup); /*the following was causing seg fault*/ /*free(igroup->grp_attr.grp_clus_info);*/ rv=MPI_Group_free(&(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_free: Failed ",armci_me); if(igroup->icomm != MPI_COMM_NULL) { rv = MPI_Comm_free( (MPI_Comm*)&(igroup->icomm) ); if(rv != MPI_SUCCESS) armci_die("MPI_Comm_free: Failed ",armci_me); } #endif } void ARMCI_Group_free(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* find the group to free */ while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { break; } previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; } /* make sure we found a group */ assert(current_group_list_item != NULL); /* remove the group from the linked list */ if (previous_group_list_item != NULL) { previous_group_list_item->next = current_group_list_item->next; } /* free the group */ armci_igroup_finalize(¤t_group_list_item->igroup); free(current_group_list_item); } /* Create a child group for to the given group. @param n IN #procs in this group (<= that in group_parent) @param pid_list IN The list of proc ids (w.r.t. group_parent) @param group_out OUT Handle to store the created group @param group_parent IN Parent group */ void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *grp_parent) { int i,grp_me; ARMCI_iGroup *igroup = NULL; #ifdef ARMCI_GROUP int world_me, parent_grp_me; armci_grp_attr_t *grp_attr = NULL; #else int rv; ARMCI_iGroup *igroup_parent = NULL; MPI_Group *group_parent = NULL; MPI_Comm *comm_parent = NULL; #endif armci_create_group_and_igroup(group_out, &igroup); #ifdef ARMCI_GROUP grp_attr = &igroup->grp_attr; ARMCI_Group_rank(grp_parent, &parent_grp_me); for(i=0; inproc=0; grp_attr->proc_list = NULL; return; /*not in group to be created*/ } for(i=0; i pid_list[i+1]){ armci_die("ARMCI_Group_create: Process ids are not sorted ",armci_me); break; } } grp_attr->grp_clus_info = NULL; grp_attr->nproc = n; grp_attr->proc_list = (int *)malloc(n*sizeof(int)); assert(grp_attr->proc_list!=NULL); for(i=0; iproc_list[i] = ARMCI_Absolute_id(grp_parent,pid_list[i]); } world_me = armci_msg_me(); grp_attr->grp_me = grp_me = MPI_UNDEFINED; for(i=0; igrp_attr.proc_list[i] == world_me) { grp_attr->grp_me = grp_me = i; break; } } if(grp_me != MPI_UNDEFINED) armci_cache_attr(group_out); armci_msg_group_barrier(group_out); #else igroup_parent = armci_get_igroup_from_group(grp_parent); /* NOTE: default group is the parent group */ group_parent = &(igroup_parent->igroup); comm_parent = &(igroup_parent->icomm); rv=MPI_Group_incl(*group_parent, n, pid_list, &(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_incl: Failed ",armci_me); { MPI_Comm comm, comm1, comm2; int lvl=1, local_ldr_pos; MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me == MPI_UNDEFINED) { igroup->icomm = MPI_COMM_NULL; /*FIXME: keeping the group around for now*/ return; } assert(grp_me>=0); /*SK: sanity check for the following bitwise operations*/ MPI_Comm_dup(MPI_COMM_SELF, &comm); /*FIXME: can be optimized away*/ local_ldr_pos = grp_me; while(n> lvl) { int tag=0; int remote_ldr_pos = local_ldr_pos^lvl; if(remote_ldr_pos < n) { int remote_leader = pid_list[remote_ldr_pos]; MPI_Comm peer_comm = *comm_parent; int high = (local_ldr_posicomm = comm; MPI_Group_free(&igroup->igroup); /*cleanup temporary group*/ MPI_Comm_group(igroup->icomm, &igroup->igroup); /*the group associated with comm*/ igroup->grp_attr.grp_clus_info=NULL; /* processes belong to this group should cache attributes */ armci_cache_attr(group_out); } #endif } void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out) { ARMCI_Group_create_child(n, pid_list, group_out, (ARMCI_Group *)&ARMCI_Default_Proc_Group); } void armci_group_init() { #ifdef ARMCI_GROUP int i; #else int grp_me; #endif ARMCI_iGroup *igroup; /* Initially, World group is the default group */ ARMCI_World_Proc_Group = 0; ARMCI_Default_Proc_Group = 0; /* create the head of the group linked list */ assert(group_list == NULL); group_list = malloc(sizeof(group_list_t)); group_list->group = ARMCI_World_Proc_Group; group_list->next = NULL; igroup = &group_list->igroup; #ifdef ARMCI_GROUP /*setup the world proc group*/ igroup->grp_attr.nproc = armci_msg_nproc(); igroup->grp_attr.grp_me = armci_msg_me(); igroup->grp_attr.proc_list = (int *)malloc(igroup->grp_attr.nproc*sizeof(int)); assert(igroup->grp_attr.proc_list != NULL); for(i=0; igrp_attr.nproc; i++) { igroup->grp_attr.proc_list[i] = i; } igroup->grp_attr.grp_clus_info = NULL; armci_cache_attr(&ARMCI_World_Proc_Group); #else /* save MPI world group and communicatior in ARMCI_World_Proc_Group */ igroup->icomm = ARMCI_COMM_WORLD; MPI_Comm_group(ARMCI_COMM_WORLD, &(igroup->igroup)); /* processes belong to this group should cache attributes */ MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me != MPI_UNDEFINED) { armci_cache_attr(&ARMCI_World_Proc_Group); } #endif } void armci_group_finalize() { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* don't free the world group (the list head) */ current_group_list_item = current_group_list_item->next; while (current_group_list_item != NULL) { previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; armci_igroup_finalize(&previous_group_list_item->igroup); free(previous_group_list_item); } } /* ISSUES: 1. Make sure ARMCI_Group_free frees the attribute data structures 2. replace malloc with, kr_malloc using local_context. */ ga-5-4/armci/src-portals/aggregate.c0000644000175000017500000003011212662210425015463 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** $Id: aggregate.c,v 1.6 2003-10-22 22:12:14 d3h325 Exp $ * Aggregate Put/Get requests */ #include "armcip.h" #include /* memcpy */ #include #define _MAX_AGG_BUFFERS 32 /* Maximum # of aggregation buffers available*/ #define _MAX_AGG_BUFSIZE 2048 /* size of each buffer. should be < 2^15 */ #define _MAX_PTRS 256 /* < 2^15, as it is "short int" in agg_req_t */ #define _MAX_AGG_HANDLE _MAX_AGG_BUFFERS /* Max # of aggregation handles */ /* aggregate request handle */ typedef struct { unsigned int tag; /* non-blocking request tag */ short int proc; /* remote process id */ short int request_len ; /* number of requests */ short int ptr_array_len; /* pointer length for this request */ short int buf_pos_end; /* position of buffer (from right end) */ armci_giov_t *darr; /* giov vectors */ }agg_req_t; static agg_req_t *aggr[_MAX_AGG_HANDLE]; /* aggregate request handle */ /* data structure for dynamic buffer management */ typedef struct { int size; /* represents the size of the list (not linked list) */ int index[_MAX_AGG_HANDLE]; } agg_list_t; static agg_list_t ulist, alist;/*in-use & available aggr buffer index list*/ /* aggregation buffer */ static char agg_buf[_MAX_AGG_BUFFERS][_MAX_AGG_BUFSIZE]; /* aggregation buffer to store the pointers */ static void* agg_src_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; static void* agg_dst_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; /** * --------------------------------------------------------------------- * fill descriptor from this side (left to right) * ---> * _______________________________________________ * | | | |. . . . . . . . . . | | | | * |__|__|__|_____________________________|__|__|__| * * <--- * fill src and dst pointer (arrays) in this direction * (right to left) * * Once they are about to cross each other (implies buffer is full), * complete the data transfer. * --------------------------------------------------------------------- */ #define AGG_INIT_NB_HANDLE(op_type, p, nb_handle) \ if(nb_handle->proc < 0) { \ nb_handle->tag = GET_NEXT_NBTAG(); \ nb_handle->op = op_type; \ nb_handle->proc = p; \ nb_handle->bufid= NB_NONE; \ } \ else if(nb_handle->op != op_type) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", nb_handle->op); \ else if(nb_handle->proc != p) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", p) /* initialize/set the fields in the buffer*/ #define _armci_agg_set_buffer(index, tag, proc, len) { \ aggr[(index)]->tag = (tag); \ aggr[(index)]->proc = (proc); \ aggr[(index)]->request_len = (len); \ ulist.index[ulist.size++] = (index);/* add the new index to the in-use list and increment it's size*/ \ } /* get the index of the aggregation buffer to be used */ static int _armci_agg_get_bufferid(armci_ihdl_t nb_handle) { int i, index, tag = nb_handle->tag, proc = nb_handle->proc; /* check if there is an entry for this handle in the existing list*/ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == tag && aggr[index]->proc == proc) return index; } /* else it is a new handle, so get a aggr buffer from either of the lists. ???? don't throw exception here */ if(ulist.size >= _MAX_AGG_BUFFERS && alist.size == 0) armci_die("_armci_agg_get_index: Too many outstanding aggregation requests\n", ulist.size); /*If there is a buffer in readily available list,use it*/ if(alist.size > 0) index = alist.index[--alist.size]; else { /* else use/get a buffer from the main list */ index = ulist.size; /* allocate memory for aggregate request handle */ aggr[index] = (agg_req_t *)agg_buf[index]; aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* allocate memory for giov vector field in aggregate request handler */ aggr[index]->darr = (armci_giov_t *)(agg_buf[index]+sizeof(agg_req_t)); } _armci_agg_set_buffer(index, tag, proc, 0); return index; } static void _armci_agg_update_lists(int index) { int i; /* remove that index from the in-use list and bring the last element in the in-use list to the position of the removed one. */ for(i=0; irequest_len; /* index of giov descriptor */ bytes_remaining = aggr[index]->buf_pos_end - (sizeof(agg_req_t) + aggr[index]->request_len*sizeof(armci_giov_t)); /* extra bytes required to store registered put data */ if(is_registered_put) bytes_needed = bytes; /* if (byte-)sizes are equal, use previously created descriptor else get a new descriptor */ if( rid && bytes==aggr[index]->darr[rid-1].bytes) --rid; else { get_new_descr=1; bytes_needed += sizeof(armci_giov_t); } /* If buffer is full, then complete data transfer. After completion, if still ptr array_len is greater than maximum limit(_MAX_PTRS), then do it by parts. Determine new ptr_array_len that fits buffer */ if( (bytes_needed > bytes_remaining) || (_MAX_PTRS - aggr[index]->ptr_array_len < *ptr_array_len)) { armci_agg_complete(nb_handle, SET); rid = 0; get_new_descr=1; if(*ptr_array_len > _MAX_PTRS) *ptr_array_len = _MAX_PTRS; } /* if new descriptor, allocate memory for src_ptr & dst_ptr arrays */ if(get_new_descr) { int i = aggr[index]->ptr_array_len; aggr[index]->darr[rid].src_ptr_array = (void **)&agg_src_ptr[index][i]; aggr[index]->darr[rid].dst_ptr_array = (void **)&agg_dst_ptr[index][i]; aggr[index]->darr[rid].ptr_array_len = 0; aggr[index]->request_len++; } /* store registered put data */ if(is_registered_put) { aggr[index]->buf_pos_end -= bytes; memcpy(&((char *)aggr[index])[aggr[index]->buf_pos_end], *((char **)registered_put_data), bytes); *(char **)registered_put_data = (char *)&((char *)aggr[index])[aggr[index]->buf_pos_end]; } aggr[index]->ptr_array_len += *ptr_array_len; return (&aggr[index]->darr[rid]); } int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle) { int one=1, idx; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); darr = _armci_agg_get_descriptor(&one, bytes, nb_handle, is_registered_put, &src); idx = darr->ptr_array_len; darr->src_ptr_array[idx] = src; darr->dst_ptr_array[idx] = dst; darr->bytes = bytes; darr->ptr_array_len += 1; fflush(stdout); return 0; } int armci_agg_save_giov_descriptor(armci_giov_t dscr[], int len, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, bytes, ptr_array_len; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=0; iptr_array_len; for(j=idx; jsrc_ptr_array[j] = dscr[i].src_ptr_array[k]; darr->dst_ptr_array[j] = dscr[i].dst_ptr_array[k]; } darr->bytes = dscr[i].bytes; darr->ptr_array_len += ptr_array_len; ptr_array_len = dscr[i].ptr_array_len - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_giov_descr failed", 0L); } while(k < darr[i].ptr_array_len); } return 0; } int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, ptr_array_len=1, total1D=1, num1D=0; int offset1, offset2, factor[MAX_STRIDE_LEVEL]; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=1; i<=stride_levels; i++) { total1D *= count[i]; factor[i-1]=0; } ptr_array_len = total1D; do { darr=_armci_agg_get_descriptor(&ptr_array_len,count[0],nb_handle,0,0); idx = darr->ptr_array_len; /* converting stride into giov vector */ for(i=idx; isrc_ptr_array[i] = (char *)src_ptr + offset1; darr->dst_ptr_array[i] = (char *)dst_ptr + offset2; ++factor[0]; ++num1D; for(j=1; jbytes = count[0]; darr->ptr_array_len += ptr_array_len; ptr_array_len = total1D - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_strided_descr failed", 0L); } while(num1D < total1D); return 0; } void armci_agg_complete(armci_ihdl_t nb_handle, int condition) { int i, index=0, rc; /* get the buffer index for this handle */ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == nb_handle->tag && aggr[index]->proc == nb_handle->proc) break; } if(i<0) return; /* implies this handle has no requests at all */ #if 0 printf("%d: Aggregation Complete to remote process %d (%d:%d requests)\n", armci_me, nb_handle->proc, index, aggr[index]->request_len); #endif /* complete the data transfer. NOTE: in LAPI, Non-blocking calls (followed by wait) performs better than blocking put/get */ if(aggr[index]->request_len) { switch(nb_handle->op) { #ifdef LAPI armci_hdl_t usr_hdl; case PUT: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbPutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbputv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; case GET: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbGetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbgetv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; #else case PUT: if((rc=PARMCI_PutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: putv failed",rc); break; case GET: if((rc=PARMCI_GetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: getv failed",rc); break; #endif } } /* setting request length to zero, as the requests are completed */ aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* If armci_agg_complete() is called PARMCI_Wait(), then unset nb_handle*/ if(condition==UNSET) { nb_handle->proc = -1; _armci_agg_update_lists(index); } } ga-5-4/armci/src-portals/portals.c0000644000175000017500000003436712662210425015241 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* ---------------------------------------------------------------------------------------------- *\ portals.c -- wrapper for commonly used portals calls author: ryan olson email: ryan@cray.com \* ---------------------------------------------------------------------------------------------- */ #include #include "armcip.h" /* ---------------------------------------------------------------------------------------------- *\ global variables \* ---------------------------------------------------------------------------------------------- */ ptl_process_id_t *portals_id_map = NULL; ptl_process_id_t *portals_cloned_id_map = NULL; size_t portalsMaxEagerMessageSize; MPI_Comm portals_smp_comm; /* ---------------------------------------------------------------------------------------------- *\ static variables for this object \* ---------------------------------------------------------------------------------------------- */ static int portals_verbose = 0; /* ---------------------------------------------------------------------------------------------- *\ portals wrappers \* ---------------------------------------------------------------------------------------------- */ int portals_init(ptl_handle_ni_t *nih) { int num_interfaces = 0; int rc; rc = PtlInit(&num_interfaces); if (rc != PTL_OK) { printf("PtlInit err %d\n", rc); return rc; } rc = PtlNIInit(CRAY_UK_SSNAL, PTL_PID_ANY, NULL, NULL, nih); if (rc != PTL_OK && rc != PTL_IFACE_DUP) { printf("PtlNIInit err %d\n", rc); return rc; } portalsMaxEagerMessageSize = PORTALS_MAX_EAGER_MESSAGE_SIZE; return PTL_OK; } int portals_finalize(ptl_handle_ni_t nih) { PtlNIFini(nih); PtlFini(); return PTL_OK; } int portals_getid(ptl_handle_ni_t nih, ptl_process_id_t *id) { int rc; rc = PtlGetId(nih, id); if(rc != PTL_OK) { printf("PtlGetId err %d\n",rc); return rc; } return PTL_OK; } int portals_create_eq(ptl_handle_ni_t nih, ptl_size_t count, ptl_handle_eq_t *eq_handle) { int rc; rc = PtlEQAlloc(nih, count, PTL_EQ_HANDLER_NONE, eq_handle); if (rc != PTL_OK) { printf("PtlEQAlloc err %d\n", rc); return rc; } return PTL_OK; } int portals_free_eq(ptl_handle_eq_t eq) { int rc; rc = PtlEQFree(eq); if (rc != PTL_OK) { printf("PtlEQFree err %d\n",rc); return rc; } return PTL_OK; } /* permanent buffers - such as unexpected receive buffers or data requests buffers should not be unlinked. client side buffers, such as large puts/accs would create a ME in front of the MATCH ALL unexpected buffer/data req ME. on the client side, the MATCH ALL ME should catch the ACKs */ int portals_me_attach(ptl_handle_ni_t nih, ptl_process_id_t match_id, ptl_match_bits_t match_bits, ptl_match_bits_t ignore_bits, ptl_handle_me_t *me_handle) { int rc = PtlMEAttach(nih,PORTALS_INDEX,match_id,match_bits,ignore_bits, PTL_UNLINK,PTL_INS_BEFORE,me_handle); if (rc != PTL_OK) { printf("PtlAttach err %d in me_attach\n",rc); return rc; } return PTL_OK; } int portals_me_insert(ptl_handle_me_t base, ptl_process_id_t pe_match_id, ptl_match_bits_t match_bits, ptl_match_bits_t ignore_bits, ptl_handle_me_t *me_handle) { int rc = PtlMEInsert(base,pe_match_id,match_bits,ignore_bits, PTL_UNLINK,PTL_INS_BEFORE,me_handle); if (rc != PTL_OK) { printf("PtlME err %d in portals_push_me\n",rc); return rc; } return rc; } int portals_me_unlink(ptl_handle_me_t meh) { int rc = PtlMEUnlink(meh); if(rc != PTL_OK) { printf("PtlMEUnlink err %d in me_unlink\n",rc); } return rc; } int portals_md_attach(ptl_handle_me_t me_handle, ptl_md_t md, ptl_unlink_t unlink_op, ptl_handle_md_t *md_handle) { int rc = PtlMDAttach(me_handle, md, unlink_op, md_handle); if (rc != PTL_OK) { printf("PtlMDAttach err %d\n",rc); return rc; } return PTL_OK; } int portals_md_bind(ptl_handle_ni_t nih, ptl_md_t md, ptl_unlink_t unlink_op, ptl_handle_md_t *md_handle) { int rc = PtlMDBind(nih, md, unlink_op, md_handle); if (rc != PTL_OK) { printf("PtlMDBind err %d\n",rc); return rc; } return rc; } int portals_eqwait(ptl_handle_eq_t eqh, ptl_event_t *ev) { int rc = PtlEQWait(eqh, ev); if (rc != PTL_OK) { printf("PtlEQWait err %d\n",rc); return rc; } return PTL_OK; } static int notify(portals_desc_t *desc, int state, char *name) { if(desc->state & state) { desc->state &= ~state; if(desc->state == 0) desc->done = 1; return 1; } else { printf("event: %s with desc state %x not %x\n",name,desc->state,state); abort(); return 0; } } int portals_wait(portals_desc_t *wait_on_desc) { int rc; ptl_event_t ev; portals_desc_t *desc = NULL; while(wait_on_desc->state) { rc = portals_eqwait(wait_on_desc->eqh, &ev); if (rc != PTL_OK) { printf("eq wait error in portals_wait\n"); abort(); } desc = (portals_desc_t *) ev.md.user_ptr; switch(ev.type) { case PTL_EVENT_SEND_START: if (portals_verbose) printf("%s event: send start\n",Portals_ID()); notify(desc, STATE_SEND_START, "send start"); break; case PTL_EVENT_SEND_END: if (portals_verbose) printf("%s event: send end\n",Portals_ID()); notify(desc, STATE_SEND_END, "send end"); break; case PTL_EVENT_REPLY_START: if (portals_verbose) printf("%s event: reply start\n",Portals_ID()); notify(desc, STATE_REPLY_START, "reply start"); break; case PTL_EVENT_REPLY_END: if (portals_verbose) printf("%s event: reply end\n",Portals_ID()); notify(desc, STATE_REPLY_END, "reply end"); break; case PTL_EVENT_ACK: if (portals_verbose) printf("%s event: ack\n",Portals_ID()); printf("%s event ack: md.threshold=%d\n",Portals_ID(),ev.md.threshold); notify(desc, STATE_ACK, "ack"); break; case PTL_EVENT_PUT_START: if (portals_verbose) printf("%s event: put start\n",Portals_ID()); notify(desc, STATE_PUT_START, "put start"); break; case PTL_EVENT_PUT_END: if (portals_verbose) printf("%s event: put end\n",Portals_ID()); if (notify(desc, STATE_PUT_END, "put end")) { // desc->len = ev.mlength; // desc->off = ev.offset; } break; case PTL_EVENT_GET_START: if (portals_verbose) printf("%s event: get start\n",Portals_ID()); notify(desc, STATE_GET_START, "get start"); break; case PTL_EVENT_GET_END: if (portals_verbose) printf("%s event: get end\n",Portals_ID()); notify(desc, STATE_GET_END, "get end"); break; case PTL_EVENT_UNLINK: if (portals_verbose) printf("%s event: unlink\n",Portals_ID()); notify(desc, STATE_UNLINK, "unlink"); break; default: printf("%s event: %d\n",Portals_ID(), ev.type); break; } } return PTL_OK; } int portals_put(portals_desc_t *desc) { int rc; int threshold = 1; ptl_md_t md = { 0 }; ptl_handle_md_t md_handle; ptl_ack_req_t ack_req = PTL_NOACK_REQ; # ifdef PORTALS_PUT_USE_ACK ack_req = PTL_ACK_REQ; threshold++; # endif md.start = desc->buffer; md.length = desc->length; md.threshold = threshold; md.options = 0; # ifndef PORTALS_PUT_USE_START md.options |= PTL_MD_EVENT_START_DISABLE; # endif md.user_ptr = desc; md.eq_handle = desc->eqh; rc = portals_md_bind(desc->nih, md, PTL_UNLINK, &md_handle); if (rc != PTL_OK) { printf("failed to bind local md in put; err %d",rc); Fatal_error(rc); } rc = PtlPut(md_handle, ack_req, desc->id, PORTALS_INDEX, 0, desc->mbits, 0, desc->hdr); if (rc != PTL_OK) { printf("PtlPut err %d\n",rc); return rc; } desc->done = 0; desc->state = STATE_SEND_END; # ifdef PORTALS_PUT_USE_START desc->state |= STATE_SEND_START; # endif # ifdef PORTALS_PUT_USE_ACK desc->state |= STATE_ACK; # endif return PTL_OK; } int portals_get(portals_desc_t* desc) { int rc; ptl_md_t md = { 0 }; ptl_handle_md_t md_handle; md.start = desc->buffer; md.length = desc->length; md.threshold = 2; md.options = 0; # ifndef PORTALS_GET_USE_START md.options |= PTL_MD_EVENT_START_DISABLE; # endif md.user_ptr = desc; md.eq_handle = desc->eqh; rc = portals_md_bind(desc->nih, md, PTL_UNLINK, &md_handle); if (rc != PTL_OK) { printf("failed to bind local md in get; err %d\n",rc); Fatal_error(rc); } rc = PtlGet(md_handle, desc->id, PORTALS_INDEX, 0, desc->mbits, 0); if (rc != PTL_OK) { printf("PtlGet err %d\n",rc); Fatal_error(rc); } desc->done = 0; desc->state = STATE_REPLY_END | STATE_SEND_END; # ifdef PORTALS_GET_USE_START desc->state |= STATE_REPLY_START; # endif return PTL_OK; } /* portals_desc_t* portals_get_free_desc(void) { int i,rc; portals_desc_t *desc = NULL; while(desc == NULL) { for(i=0; i= 0;bit--) { if ((mask << bit) & (unsigned char)*(data+ptr)) { printf("1"); } else { printf("0"); } } printf(" "); } printf("\n"); } void portals_print_summary() { printf("PORTALS_MAX_DESCRIPTORS = %d\n",PORTALS_MAX_DESCRIPTORS); printf("PORTALS_MAX_BUFS = %d\n",PORTALS_MAX_BUFS); printf("PORTALS_MAX_SMALL_BUFS = %d\n",PORTALS_MAX_SMALL_BUFS); printf("PORTALS_BUF_SIZE = %d\n",PORTALS_BUF_SIZE); printf("PORTALS_SMALL_BUF_SIZE = %d\n",PORTALS_SMALL_BUF_SIZE); printf("PORTALS_NREQUEST_BUFFERS = %d\n",PORTALS_NREQUEST_BUFFERS); printf("PORTALS_MAX_EAGER_MESSAGE_SIZE = %d\n",PORTALS_MAX_EAGER_MESSAGE_SIZE); return; } ga-5-4/armci/src-portals/signaltrap.c0000644000175000017500000003163412662210425015713 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: signaltrap.c,v 1.28 2005-05-13 19:06:40 vinod Exp $ */ /******************************************************\ * Signal handler functions for the following signals: * * SIGINT, SIGCHLD, SIGBUS, SIGFPE, SIGILL, * * SIGSEGV, SIGSYS, SIGTRAP, SIGHUP, SIGTERM * * Used to call armci_error that frees up IPC resources * \******************************************************/ #include #include #ifndef WIN32 #include #include #include #include #include #endif #define PAUSE_ON_ERROR #define Error armci_die #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) # define SigType int #else # define SigType void #endif #ifndef SIG_ERR # define SIG_ERR (SigType (*)())-1 #endif #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(AIX) || defined(NEXT) #include #endif extern void Error(); extern int armci_me; int AR_caught_sigint=0; int AR_caught_sigterm=0; int AR_caught_sigchld=0; int AR_caught_sigsegv=0; int AR_caught_sig=0; SigType (*SigChldOrig)(), (*SigIntOrig)(), (*SigHupOrig)(), (*SigTermOrig)(); SigType (*SigSegvOrig)(); /*********************** SIGINT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIntHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIntHandler(sig) #endif int sig; { AR_caught_sigint = 1; AR_caught_sig= sig; Error("SigIntHandler: interrupt signal was caught",(int) sig); } void TrapSigInt() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( (SigIntOrig = signal(SIGINT, SigIntHandler)) == SIG_ERR) Error("TrapSigInt: error from signal setting SIGINT",0); } void RestoreSigInt() /* Restore the original signal handler */ { if(AR_caught_sigint) SigIntOrig(SIGINT); if ( signal(SIGINT, SigIntOrig) == SIG_ERR) Error("RestoreSigInt: error from restoring signal SIGINT",0); } /*********************** SIGABORT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigAbortHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigAbortHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("SigIntHandler: abort signal was caught: cleaning up",(int) sig); } void TrapSigAbort() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( signal(SIGINT, SigAbortHandler) == SIG_ERR) Error("TrapSigAbort: error from signal setting SIGABORT",0); } /*********************** SIGCHLD *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigChldHandler(sig) #endif int sig; { int status; #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) union wait ustatus; #endif #if defined(LINUX) pid_t ret; /* Trap signal as soon as possible to avoid race */ if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("SigChldHandler: error from signal setting SIGCHLD",0); #endif #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) # if defined(LINUX) ret = wait(&ustatus); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void) wait(&ustatus); # endif status = ustatus.w_status; #else # if defined(LINUX) ret = waitpid(0, &status, WNOHANG); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void)wait(&status); # endif #endif AR_caught_sigchld=1; AR_caught_sig= sig; Error("Child process terminated prematurely, status=",(int) status); } void TrapSigChld() /* Trap SIGCHLD so that can tell if children die unexpectedly. */ { if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("TrapSigChld: error from signal setting SIGCHLD",0); } void RestoreSigChld() /* Restore the original signal handler */ { if(AR_caught_sigchld) SigChldOrig(SIGCHLD); if ( signal(SIGCHLD, SigChldOrig) == SIG_ERR) Error("RestoreSigChld: error from restoring signal SIGChld",0); } void RestoreSigChldDfl() { (void) signal(SIGCHLD, SIG_DFL); } /*********************** SIGBUS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigBusHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigBusHandler(sig) #endif int sig; { AR_caught_sig= sig; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%d): Bus Error ... pausing\n", armci_me, getpid() );pause(); #endif Error("Bus error, status=",(int) sig); } void TrapSigBus() /* Trap SIGBUS */ { if ( signal(SIGBUS, SigBusHandler) == SIG_ERR) Error("TrapSigBus: error from signal setting SIGBUS", 0); } /*********************** SIGFPE *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigFpeHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigFpeHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Floating Point Exception error, status=",(int) sig); } void TrapSigFpe() /* Trap SIGFPE */ { if ( signal(SIGFPE, SigFpeHandler) == SIG_ERR) Error("TrapSigFpe: error from signal setting SIGFPE", 0); } /*********************** SIGILL *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIllHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIllHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Illegal Instruction error, status=",(int) sig); } void TrapSigIll() /* Trap SIGILL */ { if ( signal(SIGILL, SigIllHandler) == SIG_ERR) Error("TrapSigIll: error from signal setting SIGILL", 0); } /*********************** SIGSEGV *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSegvHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSegvHandler(sig) #endif int sig; { AR_caught_sig= sig; AR_caught_sigsegv=1; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%d): Segmentation Violation ... pausing\n", armci_me, getpid() );pause(); #endif Error("Segmentation Violation error, status=",(int) sig); } #ifdef DO_CKPT static void * signal_arr[100]; SigType SigSegvActionSa(int sig,siginfo_t *sinfo, void *ptr) { int (*func)(); AR_caught_sig= sig; AR_caught_sigsegv=1; func = signal_arr[sig]; /*printf("\n%d:in sigaction %p, %d\n",armci_me,sinfo->si_addr,sinfo->si_errno);fflush(stdout);*/ if(func(sinfo->si_addr,sinfo->si_errno,sinfo->si_fd)) Error("Segmentation Violation error, status=",(int) SIGSEGV); } void TrapSigSegvSigaction() { struct sigaction sa; sa.sa_sigaction = (void *)SigSegvActionSa; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); } #endif void TrapSigSegv() /* Trap SIGSEGV */ { if ( (SigSegvOrig=signal(SIGSEGV, SigSegvHandler)) == SIG_ERR) Error("TrapSigSegv: error from signal setting SIGSEGV", 0); } void RestoreSigSegv() /* Restore the original signal handler */ { /* if(AR_caught_sigsegv) SigSegvOrig(SIGSEGV); */ #ifdef DO_CKPT__ struct sigaction sa; sa.sa_handler = (void *)SigSegvOrig; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGSEGV,&sa,NULL); #else if ( signal(SIGSEGV,SigSegvOrig) == SIG_ERR) Error("RestoreSigSegv: error from restoring signal SIGSEGV",0); #endif } /*********************** SIGSYS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSysHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSysHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Bad Argument To System Call error, status=",(int) sig); } void TrapSigSys() /* Trap SIGSYS */ { #ifndef LINUX if ( signal(SIGSYS, SigSysHandler) == SIG_ERR) Error("TrapSigSys: error from signal setting SIGSYS", 0); #endif } /*********************** SIGTRAP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTrapHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTrapHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Trace Trap error, status=",(int) sig); } void TrapSigTrap() /* Trap SIGTRAP */ { if ( signal(SIGTRAP, SigTrapHandler) == SIG_ERR) Error("TrapSigTrap: error from signal setting SIGTRAP", 0); } /*********************** SIGHUP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigHupHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigHupHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Hangup error, status=",(int) sig); } void TrapSigHup() /* Trap SIGHUP */ { if ( (SigHupOrig = signal(SIGHUP, SigHupHandler)) == SIG_ERR) Error("TrapSigHup: error from signal setting SIGHUP", 0); } void RestoreSigHup() /* Restore the original signal handler */ { if(AR_caught_sig== SIGHUP) SigHupOrig(SIGHUP); if ( signal(SIGHUP, SigHupOrig) == SIG_ERR) Error("RestoreSigHUP: error from restoring signal SIGHUP",0); } /*********************** SIGTERM *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTermHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTermHandler(sig) #endif int sig; { AR_caught_sigterm = 1; AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigTerm() /* Trap SIGTERM */ { if ( (SigTermOrig = signal(SIGTERM, SigTermHandler)) == SIG_ERR) Error("TrapSigTerm: error from signal setting SIGTERM", 0); } void RestoreSigTerm() /* Restore the original signal handler */ { if(AR_caught_sigterm && (SigTermOrig != SIG_DFL) ) SigTermOrig(SIGTERM); if ( signal(SIGTERM, SigTermOrig) == SIG_ERR) Error("RestoreSigTerm: error from restoring signal SIGTerm",0); } /*********************** SIGIOT *************************************/ #ifdef SIGIOT #if defined(SUN) && !defined(SOLARIS) SigType SigIotHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIotHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("IOT signal was sent, status=",(int) sig); } void TrapSigIot() /* Trap SIGIOT */ { if ( signal(SIGIOT, SigIotHandler) == SIG_ERR) Error("TrapSigIot: error from signal setting SIGIOT", 0); } #endif /*********************** SIGCONT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigContHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigContHandler(sig) #endif int sig; { /* Error("Trace Cont error, status=",(int) sig);*/ AR_caught_sig= sig; } void TrapSigCont() /* Trap SIGCONT */ { if ( signal(SIGCONT, SigContHandler) == SIG_ERR) Error("TrapSigCont: error from signal setting SIGCONT", 0); } /*********************** SIGXCPU *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigXcpuHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigXcpuHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigXcpu() /* Trap SIGXCPU */ { if ( signal(SIGXCPU, SigXcpuHandler) == SIG_ERR) Error("TrapSigXcpu: error from signal setting SIGXCPU", 0); } /******************* external API *********************************/ void ARMCI_ChildrenTrapSignals() { #ifndef LAPI TrapSigBus(); #endif TrapSigFpe(); TrapSigIll(); #ifdef DO_CKPT TrapSigSegvSigaction(); #else TrapSigSegv(); #endif TrapSigSys(); TrapSigTrap(); TrapSigAbort(); TrapSigTerm(); TrapSigInt(); #if defined(LAPI) || defined(SGI) TrapSigIot(); #endif #ifdef SGI TrapSigXcpu(); #endif } void ARMCI_ParentTrapSignals() { #ifndef LAPI TrapSigChld(); #endif TrapSigHup(); } void ARMCI_RestoreSignals() { RestoreSigTerm(); RestoreSigInt(); RestoreSigSegv(); } void ARMCI_ParentRestoreSignals() { #ifndef LAPI RestoreSigChld(); #endif ARMCI_RestoreSignals(); RestoreSigHup(); } #ifdef DO_CKPT /*user can register a function with 3 parameters, 1st offending address * 2nd err number and third file descriptor*/ void ARMCI_Register_Signal_Handler(int sig, void (*func)()) { signal_arr[sig]=func; } #endif ga-5-4/armci/src-portals/portals_cp.c0000644000175000017500000007744412662210425015726 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* ---------------------------------------------------------------------------------------------- *\ portals_cp.c -- compute process portals calls author: ryan olson email: ryan@cray.com \* ---------------------------------------------------------------------------------------------- */ # include "armcip.h" # include # include # include # include /* ---------------------------------------------------------------------------------------------- *\ \* ---------------------------------------------------------------------------------------------- */ static ptl_handle_ni_t cp_nih; static ptl_handle_eq_t cp_eqh; static ptl_handle_eq_t cp_tx_eqh; static void *portals_eager_send_buffer = NULL; static size_t portals_unique_msg_counter = 373; static int portals_smp_sem = -1; static int *active_requests_by_node = NULL; /* ---------------------------------------------------------------------------------------------- *\ \* ---------------------------------------------------------------------------------------------- */ int portals_cp_finished = 0; /* ---------------------------------------------------------------------------------------------- *\ Implementation \* ---------------------------------------------------------------------------------------------- */ int portals_cp_init(void) { int rc; int me; ptl_process_id_t id; rc = portals_init(&cp_nih); if(rc != PTL_OK) { printf("error in portals_init: err %d\n",rc); Fatal_error(rc); } rc = portals_create_eq(cp_nih,10*PORTALS_MAX_DESCRIPTORS,&cp_eqh); if(rc != PTL_OK) { printf("failed to create cp event queue; err %d\n",rc); Fatal_error(911); } rc = portals_create_eq(cp_nih,30,&cp_tx_eqh); if(rc != PTL_OK) { printf("failed to create cp_tx event queue; err %d\n",rc); Fatal_error(911); } rc = portals_cp_getid(&id); if(rc != PTL_OK) { printf("failed to get the portals id; err %d\n",rc); Fatal_error(rc); } /* creating an smp/intra-node communicator */ MPI_Comm_rank(ARMCI_COMM_WORLD,&me); MPI_Comm_split(ARMCI_COMM_WORLD,id.nid,me,&portals_smp_comm); /* set affinity */ # ifdef PORTALS_AFFINITY int smp_np, smp_me; unsigned long mask; unsigned int len = sizeof(mask); unsigned long ncpus; unsigned int nsockets, siblings; int cores_per_socket, cps_per_socket; int verbose = 0; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); if((ncpus = sysconf(_SC_NPROCESSORS_ONLN)) < 0) { printf("%d [cp] sysconf(_SC_NPROCESSORS_ONLN) failed; err=%d\n", ncpus); armci_die("sysconf in init_throttle",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error in ds_init",911); } if(armci_clus_me == 0 && /* verbose */ 0 ) { printf("%d [cp]: old affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } if(smp_me == 0) { mask = 1 << (ncpus-1); if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity to probe the socket count"); armci_die("setaffinity error in ds_init",911); } siblings = cpuid_ebx(1) >>16 & 0xff; nsockets = ncpus / siblings; } MPI_Bcast(&nsockets,1,MPI_INT,0,portals_smp_comm); cores_per_socket = ncpus/nsockets; cps_per_socket = (smp_np / nsockets); cps_per_socket += (smp_np % nsockets); if(nsockets > 2) { armci_die("nsockets > 2 not supported",911); } if(smp_me < cps_per_socket) { mask = 1 << smp_me; } else { mask = 1 << (smp_me + (cores_per_socket - cps_per_socket)); } if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity"); armci_die("setaffinity error in ds_init",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error (#2) in ds_init",911); } if(armci_clus_me == 0 && verbose) { printf("%d [cp]: new affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } # endif return PTL_OK; } int portals_cp_finalize() { int rc; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE armci_semrm(portals_smp_sem); # endif rc = portals_free_eq(cp_eqh); if (rc != PTL_OK) { printf("error freeing cp_eqh; err %d\n",rc); } MPI_Barrier(ARMCI_COMM_WORLD); MPI_Finalize(); portals_cp_finished = 1; exit(0); return PTL_OK; // return portals_finalize(cp_nih); } int portals_cp_getid(ptl_process_id_t *id) { return portals_getid(cp_nih, id); } static size_t portals_get_unique_msg_id(void) { size_t val = armci_me*1000; portals_unique_msg_counter++; if(portals_unique_msg_counter == 1000) portals_unique_msg_counter=1; val += portals_unique_msg_counter; return val; } static void portals_req_clear(portals_ds_req_t *req) { req->active = 0; req->unique_msg_id = 0; req->req_desc.done = 1; req->req_desc.state = 0; req->req_desc.eqh = cp_tx_eqh; req->ack_desc.done = 1; req->ack_desc.state = 0; req->ack_desc.eqh = cp_eqh; req->data_desc.done = 1; req->data_desc.state = 0; req->data_desc.eqh = cp_eqh; req->remote_node = -1; } static ptl_process_id_t portals_get_dsid_from_node(int remote_node) { int rank = armci_clus_info[remote_node].master; if(portals_cloned_id_map) return portals_cloned_id_map[rank]; else return portals_id_map[rank]; } static ptl_process_id_t portals_get_dsid_from_rank(int remote_id) { if(portals_cloned_id_map) return portals_cloned_id_map[remote_id]; else return portals_id_map[remote_id]; } void portals_req_nbsend(void *buffer, size_t size, portals_ds_req_t *req) { int rc; portals_desc_t *desc = &req->req_desc; assert(req->unique_msg_id); assert(size < portalsMaxEagerMessageSize); assert(req->remote_node >= 0); /* ---------------------------------------------------------------------------- *\ if we get here, we can guarantee that where are no outstanding requests from this PE to the remote node; however, we can not guarantee that other PEs on this node aren't talking to the intended data server ... so now we wait on value in the "shared" array. \* ---------------------------------------------------------------------------- */ # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE int got_lock = 0; while(!got_lock) { portalsSpinLockOnInt(&active_requests_by_node[req->remote_node],0,1000); semaphoreAcquire(portals_smp_sem,1,PORTALS_WRITE_ACCESS); if(active_requests_by_node[req->remote_node] == 0) { active_requests_by_node[req->remote_node] = 1; got_lock = 1; } semaphoreRelease(portals_smp_sem,1,PORTALS_WRITE_ACCESS); } # endif desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = MATCH_ALL_MBITS; desc->hdr = req->unique_msg_id; desc->state = 0; desc->eqh = cp_tx_eqh; desc->nih = cp_nih; rc = portals_put(desc); if(rc != PTL_OK) { printf("portals_put err %d\n",rc); Fatal_error(rc); } } void portals_req_send(void *buffer, size_t size, portals_ds_req_t *req) { int rc; portals_desc_t *desc = &req->req_desc; portals_req_nbsend(buffer,size,req); rc = portals_wait(desc); if(rc != PTL_OK) { printf("portals_wait err %d\n",rc); Fatal_error(rc); } } void portals_req_wait(portals_ds_req_t *req) { int rc; if(req->req_desc.state) { rc = portals_wait( &(req->req_desc) ); if(rc != PTL_OK) { printf("portals wait error on req_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } if(req->ack_desc.state) { rc = portals_wait( &(req->ack_desc) ); if(rc != PTL_OK) { printf("portals wait error on ack_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } if(req->data_desc.state) { rc = portals_wait( &(req->data_desc) ); if(rc != PTL_OK) { printf("portals wait error on data_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } req->active = 0; return; } void portalsWaitOnRequest(portals_ds_req_t *req) { portals_req_wait(req); } static int portals_prepost_ack_from_ds(portals_ds_req_t *req) { int rc; ptl_md_t md; portals_desc_t *desc = &req->ack_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); assert(req->remote_node >= 0); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE desc->buffer = &active_requests_by_node[req->remote_node]; desc->length = sizeof(int); # else desc->buffer = NULL; desc->length = 0; # endif desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_ACK; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost ack\n"); Fatal_error(rc); } md.start = desc->buffer; md.length = desc->length; md.threshold = 1; md.options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md.user_ptr = desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost ack\n"); Fatal_error(rc); } // desc->state = STATE_PUT_END; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_PUT_END; desc->done = 0; } static int portals_prepost_put_from_ds(void *buffer, size_t size, portals_ds_req_t *req) { int rc; int nputs; ptl_md_t md; portals_desc_t *desc = &req->data_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_PUT; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost put\n"); Fatal_error(rc); } md.start = buffer; md.length = size; md.threshold = desc->noperations; md.options = PTL_MD_OP_PUT | PTL_MD_EVENT_AUTO_UNLINK_ENABLE | PTL_MD_EVENT_START_DISABLE | PTL_MD_EVENT_END_DISABLE; md.user_ptr = (void *) desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost put\n"); Fatal_error(rc); } // desc->state = STATE_UNLINK; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_UNLINK; desc->done = 0; } static int portals_prepost_get_from_ds(void *buffer, size_t size, portals_ds_req_t *req) { int rc; ptl_md_t md; portals_desc_t *desc = &req->data_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_GET; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost get\n"); Fatal_error(rc); } md.start = buffer; md.length = size; md.threshold = desc->noperations; md.options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; // | PTL_MD_EVENT_AUTO_UNLINK_ENABLE // | PTL_MD_EVENT_START_DISABLE // | PTL_MD_EVENT_END_DISABLE; md.user_ptr = (void *) desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost get\n"); Fatal_error(rc); } // printf("%d: preposted get of lenght=%ld\n",armci_me,size); // desc->state = STATE_UNLINK; // desc->state = STATE_GET_END; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_GET_END; desc->done = 0; } void portalsBlockingRemoteOperationToNode(void *buffer, size_t length, int remote_node) { portals_ds_req_t req; portals_req_clear(&req); portalsRemoteOperationToNode(buffer,length,remote_node,&req); portalsWaitOnRequest(&req); } void portalsRemoteOperationToNode(void *buffer, size_t length, int remote_node, portals_ds_req_t *req) { ptl_process_id_t id = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; portalsRemoteOperation(buffer,length,id,req); } /* void portalsRemoteOperationToRank(void *buffer, size_t length, int remote_rank, portals_ds_req_t *req) { ptl_process_id_t id = portals_get_dsid_from_rank(remote_rank); portalsRemoteOperation(buffer,length,id,req); } */ void portalsRemoteOperation(void *buffer, size_t length, ptl_process_id_t dsid, portals_ds_req_t *req) { /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ // portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = dsid; /* --------------------------------------------------------------------- *\ the only response from the ds will be a 0-byte ack coming in as a put \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ send data request; this is a completely blocking req \* --------------------------------------------------------------------- */ portals_req_send(buffer,length,req); } void portals_send_oper(int remote_node,int val, portals_ds_req_t *req) { int rc; request_header_t msg; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ the only response from the ds will be a 0-byte ack coming in as a put \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ prepare data request and send it; this is a completely blocking req \* --------------------------------------------------------------------- */ msg.operation = val; portals_req_send(&msg,sizeof(request_header_t),req); return; } void portals_send_QUIT(int remote_node) { portals_ds_req_t req; portals_send_oper(remote_node,QUIT,&req); portals_req_wait(&req); } static int portals_determine_remote_op_count(request_header_t *msg) { #ifdef DDI int nr,nc,np; int datatype_extent = sizeof(double); /* --------------------------------------------------------------------- *\ previously we have worked with words, but to provide support for other data types, we must work with bytes. note to developers: datatype_extent = the size in bytes of the stored datatype \* --------------------------------------------------------------------- */ if(msg->size*datatype_extent <= MAX_DS_MSG_SIZE) return 1; /* --------------------------------------------------------------------- *\ the data must be moved in segments; determine patch dimensions \* --------------------------------------------------------------------- */ nr = msg->ihi - msg->ilo + 1; nc = msg->jhi - msg->jlo + 1; /* --------------------------------------------------------------------- *\ each column individually is too long to fit in the buffer \* --------------------------------------------------------------------- */ if(nr*datatype_extent < MAX_DS_MSG_SIZE) { /* ------------------------------------------------------------------ *\ np the number of "evenly" sized passed needed to send a column \* ------------------------------------------------------------------ */ np = 2; while(((nr/np)+((nr%np)?1:0)*datatype_extent)>MAX_DS_MSG_SIZE) np++; /* ------------------------------------------------------------------ *\ noperations is np times the number of columns to be sent \* ------------------------------------------------------------------ */ return np*nc; } /* --------------------------------------------------------------------- *\ determine the number of full columns that can be sent in one pass break down the subpatch on this metric \* --------------------------------------------------------------------- */ else { /* ------------------------------------------------------------------ *\ np is the number of passes needed to send the full patch which is broken down into "evenly" sized sets of columns that fit in the allocated buffer region \* ------------------------------------------------------------------ */ np = 2; while(nr*((nc/np)+((nc%np)?1:0))*datatype_extent>MAX_DS_MSG_SIZE) np++; /* ------------------------------------------------------------------ *\ noperations is np \* ------------------------------------------------------------------ */ return np; } assert(0); // should not happen return -1; #else return 1; #endif } void portals_remote_rmw(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { ptl_size_t length; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepare the buffer into which the ds will put data \* --------------------------------------------------------------------- */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_put_from_ds(buffer,msginfo->datalen,req); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_prepost_ack_from_ds(req); # endif /* --------------------------------------------------------------------- *\ send data request note: from armci_send_req - if get, the value of bytes (local: length) is msginfo->dscrlen + (hdrlen=sizeof(request_header_t) ... this is the size of the "data server request message" to be sent \* --------------------------------------------------------------------- */ length = sizeof(request_header_t) + msginfo->dscrlen + msginfo->datalen; portals_req_send(msginfo,length,req); } void portals_remote_get(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbget(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbget(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { ptl_size_t length; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepare the buffer into which the ds will put data \* --------------------------------------------------------------------- */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_put_from_ds(buffer,msginfo->datalen,req); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_prepost_ack_from_ds(req); # endif /* --------------------------------------------------------------------- *\ send data request note: from armci_send_req - if get, the value of bytes (local: length) is msginfo->dscrlen + (hdrlen=sizeof(request_header_t) ... this is the size of the "data server request message" to be sent \* --------------------------------------------------------------------- */ length = sizeof(request_header_t) + msginfo->dscrlen; # if defined(PORTALS_USE_RENDEZ_VOUS) if(length < portalsMaxEagerMessageSize) portals_req_send(msginfo,length,req); else { req->data_desc.noperations = 1; portals_prepost_get_from_ds(msginfo,length,req); /* ------------------------------------------------------------------ *\ send data request: branch here for eager vs. rendez-vous \* ------------------------------------------------------------------ */ assert(length <= PORTALS_BUF_SIZE); portals_req_send(msginfo,sizeof(request_header_t),req); } # else portals_req_send(msginfo,length,req); # endif } void portals_remote_put(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbput(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbput(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { char *eagerBuffer = NULL; size_t eagerSendSize = 0; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepost ack response from the data server \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ eager vs. rendez-vous messaging eager: pack and send the message immediate (only for small messages) developers note: since portals_eager_send_buffer only exists once, this has to be a blocking send (ie the data is on the wire when req_send has finished and the buffer can be reused. for greater overlap, create a set of eager send buffers ... however they have to be managed ... probably best to do it in a ring. note: armci put/acc buffer is prepacked. \* --------------------------------------------------------------------- */ eagerSendSize = sizeof(request_header_t) + msginfo->dscrlen + msginfo->datalen; if(eagerSendSize < portalsMaxEagerMessageSize) { // printf("sending eager message\n"); # if 0 /* armci prepacked */ eagerBuffer = (char *) portals_eager_send_buffer; memcpy(eagerBuffer,msginfo,sizeof(request_header_t)); eagerBuffer += sizeof(request_header_t); memcpy(eagerBuffer,buffer,msginfo->bytes); # endif eagerBuffer = (char *) msginfo; /* buffer == msginfo for armci */ portals_req_send(eagerBuffer,eagerSendSize,req); } /* --------------------------------------------------------------------- *\ rendez-vous: send the ds a request; ds will "get/pull" data \* --------------------------------------------------------------------- */ else { # ifdef PORTALS_USE_RENDEZ_VOUS /* ------------------------------------------------------------------ *\ prepare the buffer into which the ds will put data \* ------------------------------------------------------------------ */ // req->data_desc.noperations=portals_determine_remote_op_count(msginfo); req->data_desc.noperations = 1; portals_prepost_get_from_ds(msginfo,eagerSendSize,req); /* ------------------------------------------------------------------ *\ send data request: branch here for eager vs. rendez-vous \* ------------------------------------------------------------------ */ assert(eagerSendSize <= PORTALS_BUF_SIZE); portals_req_send(msginfo,sizeof(request_header_t),req); # else printf("%d [cp]: rendez-vous messaging not supported\n",armci_me); abort(); # endif } } #if 0 void portals_remote_acc(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbacc(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbacc(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { char *eagerBuffer = NULL; size_t eagerSendSize = 0; assert(msginfo->bytes); /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); /* --------------------------------------------------------------------- *\ eager vs. rendez-vous messaging eager: pack and send the message immediate (only for small messages) \* --------------------------------------------------------------------- */ eagerSendSize = msginfo->bytes + sizeof(request_header_t); if(eagerSendSize < portalsMaxEagerMessageSize) { /* ------------------------------------------------------------------ *\ prepost ack response from the data server developers note: if you globally fence an array with a collective operation prior to a section of code and defence it after, then you don't need to micro manage the fence on a per request basis in that section; this eliminates the need for a DS ack \* ------------------------------------------------------------------ */ portals_prepost_ack_from_ds(req); /* ------------------------------------------------------------------ *\ pack and send eager data request blocking for now, since portals_eager_send_buffer only exists once create multiple eager buffers for greater overlap \* ------------------------------------------------------------------ */ eagerBuffer = (char *) portals_eager_send_buffer; memcpy(eagerBuffer,msginfo,sizeof(request_header_t)); eagerBuffer += sizeof(request_header_t); memcpy(eagerBuffer,buffer,msginfo->bytes); eagerBuffer = (char *) portals_eager_send_buffer; portals_req_send(eagerBuffer,eagerSendSize,req); } /* --------------------------------------------------------------------- *\ rendez-vous: send the ds a request; ds will "get/pull" data developers note: a ds ack is not required for a rendez-vous pull, this is because the ds will not start the pull until a local fence has been raised (if needed - see note above) \* --------------------------------------------------------------------- */ else { /* ------------------------------------------------------------------ *\ prepare the buffer from which the ds will pull data \* ------------------------------------------------------------------ */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_get_from_ds(buffer,msginfo->bytes,req); /* ------------------------------------------------------------------ *\ send data request \* ------------------------------------------------------------------ */ portals_req_send(msginfo,sizeof(request_header_t),req); portalsWaitOnRequest(req); } } #endif extern int armci_shmget(size_t,char*); extern int armci_semget(int); extern void *shmat(int,int,int); void portals_cp_init_throttle(int nnodes) { int i, shmid, smp_np, smp_me; size_t size = nnodes*sizeof(int); char *buf = NULL; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE if(armci_me == armci_master) { if(smp_me != 0) armci_die("smp_me and armci_master are different",911); } if(smp_me == 0) { shmid = armci_shmget(size,"portals_cp_init_throttle"); active_requests_by_node = (int *) shmat(shmid,0,0); if(active_requests_by_node == (void *) -1) { printf("%d [cp] shmat failed for shmid %d\n",armci_me,shmid); armci_die("badness",911); } armci_shmrm(shmid); for(i=0; i #include #include #include #include #include #include "shmlimit.h" #define DEBUG_ 0 #if defined(DECOSF) || defined(SOLARIS64) || defined(HPUX) #define PIPE_AFTER_FORK_BUG #endif void (*armci_sig_chld_orig)(); static int status=0; int armci_shmlimit_caught_sigchld=0; #if defined(SUN) && !defined(SOLARIS) static void SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else static void SigChldHandler(sig) #endif int sig; { #ifdef DISABLED int pid; pid = wait(&status); #endif armci_shmlimit_caught_sigchld=1; } static void TrapSigChld() { if ( (armci_sig_chld_orig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) armci_die("TrapSigChld: error from signal setting SIGCHLD",0); } static void RestoreSigChld() { if ( signal(SIGCHLD, armci_sig_chld_orig) == SIG_ERR) armci_die("Restore_SigChld: error from restoring signal SIGChld",0); } static int child_finished() { return armci_shmlimit_caught_sigchld; } int armci_child_shmem_init() { pid_t pid; int x; #ifdef PIPE_AFTER_FORK_BUG int i; #endif int y; int fd[2]; if(pipe(fd)==-1) armci_die("armci shmem_test pipe failed",0); TrapSigChld(); if ( (pid = fork() ) < 0) armci_die("armci shmem_test fork failed", (int)pid); else if(pid == 0){ x= armci_shmem_test(); #ifdef PIPE_AFTER_FORK_BUG /* due to a bug in OSF1 V4.0/1229/alpha first item written gets hosed*/ for(i=0;i<2;i++) #endif if(write(fd[1],&x,sizeof(int)) real * bb[i].real - alpha->imag * bb[i].imag; aa[i].imag += alpha->imag * bb[i].real + alpha->real * bb[i].imag; } } } void Z_ACCUMULATE_2D(dcmpl_t* alpha, int* rows, int* cols, dcmpl_t* a, int* lda, dcmpl_t* b, int* ldb) { int i,j; for(j=0;j< *cols; j++){ dcmpl_t *aa = a + j* *lda; dcmpl_t *bb = b + j* *ldb; for(i=0;i< *rows; i++){ aa[i].real += alpha->real * bb[i].real - alpha->imag * bb[i].imag; aa[i].imag += alpha->imag * bb[i].real + alpha->real * bb[i].imag; } } } void FORT_DADD(int *n, double *x, double *work){ int i; for(i=0;i<*n;i++) x[i] = x[i] + work[i]; } void FORT_DADD2(int *n, double *x, double *work, double *work2){ int i; for(i=0;i<*n;i++) x[i] = work[i] + work2[i]; } void FORT_DMULT(int *n, double *x, double *work){ int i; for(i=0;i<*n;i++) x[i] = x[i]*work[i]; } void FORT_DMULT2(int *n, double *x, double *work, double *work2){ int i; for(i=0;i<*n;i++) x[i] = work[i]*work2[i]; } #endif ga-5-4/armci/src-portals/utils.c0000644000175000017500000001456712662210425014715 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. * * The barrier_init() and barrier_destroy() functions, * respectively, allow you to initialize and destroy the * barrier. * * The barrier_wait() function allows a thread to wait for a * barrier to be completed. One thread (the one that happens to * arrive last) will return from barrier_wait() with the status * -1 on success -- others will return with 0. The special * status makes it easy for the calling code to cause one thread * to do something in a serial region before entering another * parallel section of code. */ #include #include #include #include #include #include #include #include #include "utils.h" #define DEBUG_ int mt_size; /* number of processes: needed for collective mt ops */ int mt_tpp; /* number of threads used for collective ops */ thread_barrier_t mt_barrier; /* static barrier used for multi-threaded MT_BARRIER */ int armci_malloc_mt(void *ptr[], int bytes) { int rc, th_size, i, j; th_size = mt_size * mt_tpp; if (thread_barrier_wait(&mt_barrier)==-1) { rc = PARMCI_Malloc(ptr, bytes * mt_tpp); #ifdef DEBUG printf("bytes=%d\n", bytes); for (i = 0; i < mt_size; i++) printf("ptr[%d]=%p\n",i,ptr[i]); #endif /* at this point proc ptrs are at beggining of the list */ for (i = mt_size - 1; i >= 0; i--) for (j = mt_tpp - 1; j >= 0; j--) { #ifdef DEBUG printf("mt_size=%d,mt_tpp=%d,i=%d,j=%d,ptr[%d]=%p+%d\n", mt_size,mt_tpp,i,j,i*mt_tpp+j,ptr[i],j*bytes); fflush(stdout); #endif ptr[i * mt_tpp + j] = ((char*)ptr[i]) + j * bytes; } } thread_barrier_wait(&mt_barrier); return rc; } int armci_free_mt(void *ptr, int th_idx) { } #ifdef POSIX_THREADS /* * Initialize a barrier for use. */ int thread_barrier_init (thread_barrier_t *barrier, int count) { int status; barrier->threshold = barrier->counter = count; barrier->cycle = 0; status = pthread_mutex_init (&barrier->mutex, NULL); if (status != 0) return status; status = pthread_cond_init (&barrier->cv, NULL); if (status != 0) { pthread_mutex_destroy (&barrier->mutex); return status; } barrier->valid = BARRIER_VALID; return 0; } /* * Destroy a barrier when done using it. */ int thread_barrier_destroy (thread_barrier_t *barrier) { int status, status2; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; /* * Check whether any threads are known to be waiting; report * "BUSY" if so. */ if (barrier->counter != barrier->threshold) { pthread_mutex_unlock (&barrier->mutex); return EBUSY; } barrier->valid = 0; status = pthread_mutex_unlock (&barrier->mutex); if (status != 0) return status; /* * If unable to destroy either 1003.1c synchronization * object, return the error status. */ status = pthread_mutex_destroy (&barrier->mutex); status2 = pthread_cond_destroy (&barrier->cv); return (status == 0 ? status : status2); } /* * Wait for all members of a barrier to reach the barrier. When * the count (of remaining members) reaches 0, broadcast to wake * all threads waiting. */ int thread_barrier_wait (thread_barrier_t *barrier) { int status, cancel, tmp, cycle; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; cycle = barrier->cycle; /* Remember which cycle we're on */ if (--barrier->counter == 0) { barrier->cycle = !barrier->cycle; barrier->counter = barrier->threshold; status = pthread_cond_broadcast (&barrier->cv); /* * The last thread into the barrier will return status * -1 rather than 0, so that it can be used to perform * some special serial code following the barrier. */ if (status == 0) status = -1; } else { /* * Wait with cancellation disabled, because barrier_wait * should not be a cancellation point. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &cancel); /* * Wait until the barrier's cycle changes, which means * that it has been broadcast, and we don't want to wait * anymore. */ while (cycle == barrier->cycle) { status = pthread_cond_wait ( &barrier->cv, &barrier->mutex); if (status != 0) break; } pthread_setcancelstate (cancel, &tmp); } /* * Ignore an error in unlocking. It shouldn't happen, and * reporting it here would be misleading -- the barrier wait * completed, after all, whereas returning, for example, * EINVAL would imply the wait had failed. The next attempt * to use the barrier *will* return an error, or hang, due * to whatever happened to the mutex. */ pthread_mutex_unlock (&barrier->mutex); return status; /* error, -1 for waker, or 0 */ } #endif #if 0 /*** NAME timing.c PURPOSE Timing routines for calculating the execution time: void start_timer(void); Set the timer. double elapsed_time(void); Return the timing elapsed since the timer has been set. NOTES Jialin Ju - Oct 16, 1995 Created. ***/ /* Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /* Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /* Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /* Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } #endif ga-5-4/armci/src-portals/pendbufs.c0000644000175000017500000006123312662210425015353 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if defined(PEND_BUFS) #include "pendbufs.h" #include "armcip.h" #include #include #include #include #define DEBUG_SERVER 0 /*-------------------Attributes-------------------------*/ /**Attributes to control buffer count and sizes. Implement this way to hide the global variables, and provide get/set methods.*/ #define NUM_ATTRIBUTES 4 #define ATTRIB_IMMBUF_LEN 0 #define ATTRIB_IMMBUF_NUM 1 #define ATTRIB_PNDBUF_LEN 2 #define ATTRIB_PNDBUF_NUM 3 /** List of hidden attributes and their operations. * @param attid IN Attribute id. Choose from the list above * @param gs IN Get(=0)/Set(=1) * @param v IN Value (used only when gs==1) * @return Value of the attribute on return */ static int att_ops(int attid, int gs, int v) { static not_first[NUM_ATTRIBUTES]; /*auto-init to zero*/ static val[NUM_ATTRIBUTES]; assert(attid>=0 && attidIMM_BUF_LEN*/ INIT=7, /**buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; assert(msginfo->tag.imm_msg == 0); pbuf = _armci_serv_pendbuf_getbuf(); if(pbuf) { pbuf->status = INIT; pbuf->avail = 0; pbuf->vbuf = vbuf; memcpy(pbuf->buf, vbuf->buf, sizeof(request_header_t)+msginfo->dscrlen); /* pbuf_proc_list_info[msginfo->from].waiting_on=pbuf; */ pbuf->order_prev = info->order_tail; if(info->order_tail) info->order_tail->order_next = pbuf; info->order_tail = pbuf; if(!info->order_head) info->order_head = pbuf; } return pbuf; } /**Free a pending buffer * @param pbuf IN Pointer to Pending buffer to be freed * @return none */ static void _armci_serv_pendbuf_freebuf(pendbuf_t *pbuf){ const request_header_t *msginfo = (request_header_t *)pbuf->buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); assert(pbuf != NULL); pbuf->avail=1; pbuf->status = -1; pbuf->vbuf = NULL; /* assert(info->waiting_on == pbuf); */ /* info->waiting_on = NULL; */ if(pbuf->order_prev) pbuf->order_prev->order_next = pbuf->order_next; if(pbuf->order_next) pbuf->order_next->order_prev = pbuf->order_prev; if(info->order_head == pbuf) { assert(pbuf->order_prev == NULL); info->order_head = pbuf->order_next; } if(info->order_tail == pbuf) { assert(pbuf->order_next == NULL); info->order_tail = pbuf->order_prev; } pbuf->order_prev = pbuf->order_next = NULL; /*not necessary here*/ _nPendBufsUsed -= 1; assert(_nPendBufsUsed>=0); ARMCI_PR_DBG("exit",0); } /** Implement ordering between messages. This function needs to be * implemented in conjunction with @_armci_serv_pendbuf_promote to * ensure ordered processing of messages. * @param vbuf IN Message in immediate buffer being checked * @return 1 if the message can be progressed (either in-place or * after copying to a pending buffer). 0 therwise. */ static int _armci_serv_pendbuf_can_progress(immbuf_t *vbuf) { const request_header_t *msginfo=(request_header_t*)vbuf->buf; const int proc = msginfo->from; const proc_waitlist_t *info = &pbuf_proc_list_info[proc]; if(_pbufOrder == ONE_PBUF_MESG) { /*Only one pending buffer used at any time*/ if(_nPendBufsUsed>0) return 0; return 1; } if(_pbufOrder == ONE_PBUF_MESG_PER_PROC) { /*Only one non-immediate mesg can be assigned to the pending buffers at any time*/ if(info->order_head || (info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf)) { return 0;/*other requests from this process remain*/ } if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } assert(info->n_pending == 0 || info->immbuf_wlist_head==vbuf); return 1; } if(_pbufOrder == ACC_NO_ORDER) { /*Messages are processed in-place in immediate buffers or issued into pending buffers for progress in order (like ONE_PBUF_PER_MESG). This rule relaxes ONE_PBUF_PER_MESG by allowing a sequence of ACCs to be processed in-place/issued without waiting for the prior ones to complete*/ int i, nwaiting_on, nacc; pendbuf_t *ptr; if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { /* printf("%d(s): op=%d from=%d datalen=%d waiting for pending buffers\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*This buffer needs a free pending buffer*/ } #if 1 /*commented for now: it does work*/ if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } #endif if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { /* printf("%d(s): op=%d from=%d datalen=%d not queue head\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*in order issue*/ } if(!ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } assert(ARMCI_ACC(msginfo->operation)); for(ptr=info->order_head; ptr!=NULL; ptr=ptr->order_next) { request_header_t *m = (request_header_t *)ptr->buf; assert(m->from == msginfo->from); if(!ARMCI_ACC(m->operation)) break; } if(ptr != NULL) return 0; return 1; } if(_pbufOrder == PUTACC_SPLIT_ORDER) { if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { return 0; } if(msginfo->operation!=PUT && !ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } #if 1 if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } #endif if(IS_IMM_MSG(*msginfo) && info->order_head) return 0; return 1; } armci_die("Unknown pbuf ordering rule",_pbufOrder); return 0; } /** Goes through the set of immediate buffers waiting to be processed * and completed, and identifies a buffer that can be processed * now. Removes it from the list and returns it. Promote also * considers availability of pending buffers if need be. * @return Pointer to buffer that can be processed now. NULL if none exists. */ static immbuf_t* _armci_serv_pendbuf_promote() { immbuf_t *immbuf = NULL; proc_waitlist_t *info; ARMCI_PR_DBG("enter",0); assert(_nPendBufsUsed>=0); if(!pbuf_ordering_plist_head) { return NULL; /*nothing to promote*/ } info = pbuf_ordering_plist_head; do { if(info->immbuf_wlist_head==NULL) { printf("%d(s): Why is info->immbuf_wlist_head NULL\n", armci_me); fflush(stdout); pause(); } assert(info->immbuf_wlist_head!=NULL); assert(info->n_pending>0); if(_armci_serv_pendbuf_can_progress(info->immbuf_wlist_head)) { immbuf = info->immbuf_wlist_head; info->immbuf_wlist_head = immbuf->immbuf_list_next; info->n_pending -= 1; immbuf->immbuf_list_next = NULL; if(!info->immbuf_wlist_head) { info->immbuf_wlist_tail = NULL; /*remove this proc from proc list*/ info->prev->next = info->next; info->next->prev = info->prev; if(pbuf_ordering_plist_head == info) { pbuf_ordering_plist_head = (info->next==info)?NULL:info->next; } info->prev = info->next = NULL; } break; } info = info->next; } while(info != pbuf_ordering_plist_head); if(DEBUG_SERVER) if(immbuf) { request_header_t *msginfo=(request_header_t*)immbuf->buf; printf("%d:: promoting a buffer immbuf=%p op=%d from=%d n_pending=%d\n", armci_me,immbuf,msginfo->operation,msginfo->from,info->n_pending); fflush(stdout); } ARMCI_PR_DBG("exit",0); return immbuf; } /** Enqueue a message. It could be an immediate message that cannot * make progress or a non-immediate message that cannot make progress * either due to ordering constraints or lack of pending buffers. * @param vbuf IN Immediate buffer to be enqueud * @return Pending buffer into which the message was enqueued. NULL * if no pending buffer was allocated (which is always the case for * immediate messages) */ static pendbuf_t* _armci_serv_pendbuf_enqueue(immbuf_t *vbuf) { request_header_t *msginfo=(request_header_t *)vbuf->buf; int from = msginfo->from; pendbuf_t *pbuf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); /* printf("%d: Entered serv_pbuf_enqueue\n", armci_me); */ pbuf=NULL; if(msginfo->tag.imm_msg) { assert(!_armci_serv_pendbuf_can_progress(vbuf)); } else if(_armci_serv_pendbuf_can_progress(vbuf)) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); /*can_progress() should ensure this*/ } if(pbuf == NULL) { /* printf("%d(s):: Enqueing op=%d imm=%d from %d. n_pending=%d\n", armci_me, msginfo->operation, msginfo->tag.imm_msg, msginfo->from,info->n_pending); */ /* fflush(stdout); */ vbuf->immbuf_list_next = NULL; assert(info->n_pending < IMM_BUF_NUM); /*How another message now?*/ info->n_pending += 1; if(!info->immbuf_wlist_head) { assert(!info->immbuf_wlist_tail); assert(!info->prev && !info->next); /*insert proc into proc list*/ if(!pbuf_ordering_plist_head) { pbuf_ordering_plist_head=info->next=info->prev=info; } else { info->next = pbuf_ordering_plist_head; info->prev = pbuf_ordering_plist_head->prev; pbuf_ordering_plist_head->prev->next = info; pbuf_ordering_plist_head->prev = info; } } /*insert vbuf into immbuf list for this proc*/ if(info->immbuf_wlist_tail) info->immbuf_wlist_tail->immbuf_list_next=vbuf; info->immbuf_wlist_tail = vbuf; if(!info->immbuf_wlist_head) info->immbuf_wlist_head = vbuf; } /* printf("%d: Leaving serv_pbuf_enqueue\n", armci_me); */ ARMCI_PR_DBG("exit",0); return pbuf; } /** Progress GET requests. * @param pbuf IN Pending buffer containing the GET request * @return none */ static void _armci_serv_pendbuf_progress_get(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1)+msginfo->dscrlen); int *status = &pbuf->status; assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalendscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ armci_complete_pendbuf(pbuf); *status = SEND_DATA_PENDING; } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: GET getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case SEND_DATA_PENDING: armci_die("call_data_server should set status to SEND_DATA_DONE before calling progress",*status); break; case RECV_DSCR_DONE: /* printf("%d(s):: GET. Done recving descriptor index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ armci_complete_pendbuf(pbuf); *status = SEND_DATA_PENDING; break; case SEND_DATA_DONE: _armci_serv_pendbuf_freebuf(pbuf); break; case RECV_DATA_PENDING: case RECV_DATA_DONE: default: armci_die("pendbuf_progress_get: invalid status", *status); } } /** Progress PUT/ACC requests. * @param pbuf IN Pending buffer containing the PUT/ACC request * @return none */ static void _armci_serv_pendbuf_progress_putacc(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1))+msginfo->dscrlen; int *status = &pbuf->status; assert(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)); assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalenoperation,msginfo->from); */ /* fflush(stdout); */ if(sizeof(request_header_t)+msginfo->dscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: PUT getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case RECV_DATA_PENDING: armci_die("call_data_server should set status to RECV_DONE before calling progress",*status); break; case RECV_DSCR_DONE: assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; break; case RECV_DATA_DONE: /* printf("%d(s):: Done PUT/ACC with buf index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ if(msginfo->operation == PUT && pbuf->order_prev!=NULL) { assert(pbuf->commit_me == 0); /*Why called so many times in thie state?*/ pbuf->commit_me = 1; break; } pbuf->commit_me = 0; armci_complete_pendbuf(pbuf); _armci_serv_pendbuf_freebuf(pbuf); break; case SEND_DATA_PENDING: case SEND_DATA_DONE: default: armci_die("pendbuf_progress_putacc: invalid status", *status); } } /** Make progress on processing a pending buffer. This function, also * ensures any other waiting messages get processed if they can * be. Thus, progress and eventual termination is guaranteed by this * function. * @param _pbuf IN Pending buffer to make progress on * @return none */ static void _armci_serv_pendbuf_progress(pendbuf_t *_pbuf){ request_header_t *msginfo = (request_header_t *)_pbuf->buf; immbuf_t *vbuf = _pbuf->vbuf; pendbuf_t *pbuf = _pbuf; assert(pbuf->vbuf!=NULL); do { if(vbuf && !IS_IMM_MSG(*msginfo)) { assert(pbuf->vbuf == vbuf); } /* printf("%d(s):: progressing op=%d imm=%d from=%d datalen=%d pbuf=%p vbuf=%p n_pending=%d\n", armci_me, */ /* msginfo->operation,msginfo->tag.imm_msg,msginfo->from,msginfo->datalen, pbuf,vbuf,pbuf_proc_list_info[msginfo->from].n_pending); */ /* fflush(stdout); */ if(IS_IMM_MSG(*msginfo)) { armci_complete_immbuf(vbuf); } else { /*non-immediate message*/ proc_waitlist_t* info = &pbuf_proc_list_info[msginfo->from]; do { assert(pbuf->vbuf == vbuf); if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { _armci_serv_pendbuf_progress_putacc(pbuf); } else if (msginfo->operation == GET) { _armci_serv_pendbuf_progress_get(pbuf); } else { armci_die("pending buffer processing for this op not yet implemented", msginfo->operation); } pbuf = info->order_head; vbuf = pbuf ? pbuf->vbuf : NULL; } while(info->order_head && info->order_head->commit_me); } /* sleep(2); */ vbuf = _armci_serv_pendbuf_promote(); if(vbuf) { msginfo = (request_header_t *)vbuf->buf; if(!msginfo->tag.imm_msg) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); } } } while(vbuf != NULL); } /*----------------External functions--------------------*/ /** Initialize array of pending buffers * @return none */ void armci_pendbuf_init() { int i; ARMCI_PR_DBG("enter",0); /* bzero(serv_pendbuf_arr, sizeof(pendbuf_t)*PENDING_BUF_NUM); */ for(i=0; ibuf; bzero(pbuf, sizeof(pendbuf_t)); pbuf->buf = buf; pbuf->avail=1; } pbuf_ordering_plist_head=NULL; pbuf_proc_list_info = (proc_waitlist_t *)malloc(sizeof(proc_waitlist_t)*armci_nproc); assert(pbuf_proc_list_info != NULL); bzero(pbuf_proc_list_info, sizeof(proc_waitlist_t)*armci_nproc); ARMCI_PR_DBG("exit",0); } void armci_pendbuf_service_req(immbuf_t *immbuf) { pendbuf_t *pbuf; request_header_t *msginfo=(request_header_t*)immbuf->buf; if(IS_IMM_MSG(*msginfo) && _armci_serv_pendbuf_can_progress(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p can progress. Completing it now!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ armci_complete_immbuf(immbuf); } else if(pbuf = _armci_serv_pendbuf_enqueue(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p got pending buf. Progressing it!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ _armci_serv_pendbuf_progress(pbuf); } else { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p in waitlist!\n", armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ } } /**Network layer reporting to split buffers code that a put completed * on a pending buffer. * @param pbufid IN Pending buffer id (specified when starting a * put). * @return void */ void armci_pendbuf_done_put(int pbufid) { assert(pbufid>=0 && pbufid=0 && pbufidstatus) { case RECV_DSCR_PENDING: pbuf->status = RECV_DSCR_DONE; break; case RECV_DATA_PENDING: pbuf->status = RECV_DATA_DONE; break; default: armci_die("Reporting get done on buf with inappropriate status",pbufid); } _armci_serv_pendbuf_progress(pbuf); } #endif /*PEND_BUFS*/ ga-5-4/armci/src-portals/bufalloc.c0000644000175000017500000002610412662210425015332 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: bufalloc.c,v 1.2 2001-06-07 23:23:23 d3h325 Exp $ * storage manager for a chunk of memory passed by user in armci_init_buf_alloc * derived from K&R that manages a chunk of memory */ #include #define USAGE_ extern char *buf_allocate(); /* Used to get memory from the system */ extern void armci_die(); #define VALID1 0xaaaaaaaa /* For validity check on headers */ #define VALID2 0x55555555 #define LOG_ALIGN 6 #define ALIGNMENT (1 << LOG_ALIGN) #define DEFAULT_NALLOC (1024 - ALIGNMENT) #ifdef USAGE static struct shmalloc_struct { size_t total; /* Amount request from system in units */ long nchunk; /* No. of chunks of system memory */ long inuse; /* Amount in use in units */ long maxuse; /* Maximum value of inuse */ long nfrags; /* No. of fragments divided into */ long nmcalls; /* No. of calls to shmalloc */ long nfcalls; /* No. of calls to buf_free */ } usage; #endif union header{ struct { unsigned valid1; /* Token to check if is not overwritten */ union header *ptr; /* next block if on free list */ size_t size; /* size of this block*/ unsigned valid2; /* Another token acting as a guard */ } s; char align[ALIGNMENT]; /* Align to ALIGNMENT byte boundary */ }; typedef union header Header; static Header base; /* empty list to get started */ static Header *freep = NULL; /* start of free list */ static Header *usedp = NULL; /* start of used list */ static size_t nalloc = DEFAULT_NALLOC; static size_t max_nalloc = DEFAULT_NALLOC; static int do_verify = 0; /* Flag for automatic heap verification */ static int initialized=0; static void buf_error(char* s, unsigned long i) { void buf_alloc_print_stats(); fflush(stdout); fprintf(stderr,"buf_alloc error: %s %ld(0x%lx)\n", s, i, i); fflush(stderr); #ifdef USAGE buf_alloc_print_stats(); #endif armci_die("buf_alloc: fatal error", i); } void armci_buf_alloc_request(size_t size, size_t maxsize) { nalloc = (size+ALIGNMENT-1) >> LOG_ALIGN; max_nalloc = (maxsize+ALIGNMENT-1) >> LOG_ALIGN; } void armci_buf_alloc_debug(int code) { do_verify = code; } void armci_buf_alloc_verify() { Header *p; if ( freep ) { /* Check the used list */ for (p=usedp; p; p=p->s.ptr) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) buf_error("invalid header on usedlist", (unsigned long) p->s.valid1); #ifdef USAGE if (p->s.size > usage.total) buf_error("invalid size in header usedlist",(unsigned long)p->s.size); #endif } /* Check the free list */ p = base.s.ptr; while (p != &base) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) buf_error("invalid header on freelist", (unsigned long) p->s.valid1); #ifdef USAGE if (p->s.size > usage.total) buf_error("invalid size in header freelist",(unsigned long)p->s.size); #endif p = p->s.ptr; } } /* end if */ } static void addtofree(char* ap) { Header *bp, *p, **up; #ifdef USAGE usage.nfcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) buf_error("buf_free: pointer not from buf_alloc", (unsigned long) ap); #ifdef USAGE usage.inuse -= bp->s.size; /* Decrement memory usage */ #endif /* Extract the block from the used linked list ... for debug only */ for (up=&usedp; ; up = &((*up)->s.ptr)) { if (!*up) buf_error("buf_free:block not found in used list\n",(unsigned long)ap); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else p->s.ptr = bp; freep = p; } /* end if on ap */ } void armci_init_buf_alloc(size_t len, void* buffer) { char *cp; Header *up, *prevp; size_t nu; /* need to initialize the free list */ if (sizeof(Header) != ALIGNMENT) buf_error("Alignment is not valid", (unsigned long) ALIGNMENT); if(initialized)armci_die("armci_init_buf_alloc: already initialized",0); #ifdef USAGE usage.total = 0; /* Initialize statistics */ usage.nchunk = 0; usage.inuse = 0; usage.nfrags = 0; usage.maxuse = 0; usage.nmcalls= 0; usage.nfcalls= 0; #endif base.s.ptr = freep = prevp = &base; /* Initialize linked list */ base.s.size = 0; base.s.valid1 = VALID1; base.s.valid2 = VALID2; nu = len/sizeof(Header); /* nu must by a multiplicity of nalloc */ max_nalloc = nu*nalloc; if(nu<1) armci_die("buffer less than nalloc",(int)len); cp = (char*)buffer; #ifdef USAGE usage.total += nu; /* Have just got nu more units */ usage.nchunk++; /* One more chunk */ usage.nfrags++; /* Currently one more frag */ usage.inuse += nu; /* Inuse will be decremented by buf_free */ #endif up = (Header *) cp; up->s.size = nu; up->s.valid1 = VALID1; up->s.valid2 = VALID2; /* Insert into linked list of blocks in use so that buf_free works ... for debug only */ up->s.ptr = usedp; usedp = up; addtofree((char *)(up+1)); /* Try to join into the free list */ } /*\ return a chunk memory of given size \*/ char *armci_buf_alloc(size_t nbytes) { Header *p, *prevp; size_t nunits; char *return_ptr; /* need to initialize the free list */ if ((prevp = freep) == NULL) armci_die("not initialized", 0); #ifdef USAGE usage.nmcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; for (p=prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) /* exact fit */ prevp->s.ptr = p->s.ptr; else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; #ifdef USAGE usage.nfrags++; /* Have just increased the fragmentation */ #endif } /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = usedp; usedp = p; #ifdef USAGE usage.inuse += nunits; /* Record usage */ if (usage.inuse > usage.maxuse) usage.maxuse = usage.inuse; #endif freep = prevp; return_ptr = (char *) (p+1); break; } if (p == freep){ /* wrapped around the free list */ return_ptr = (char *) NULL; break; } } return return_ptr; } void armci_buf_free(char *ap) { Header *bp, *p, **up; #ifdef USAGE usage.nfcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) buf_error("buf_free: pointer not from buf_alloc", (unsigned long) ap); #ifdef USAGE usage.inuse -= bp->s.size; /* Decrement memory usage */ #endif /* Extract the block from the used linked list for debug only */ for (up=&usedp; ; up = &((*up)->s.ptr)) { if (!*up) buf_error("buf_free:block not found in used list\n",(unsigned long)ap); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else p->s.ptr = bp; freep = p; } /* end if on ap */ } #ifdef USAGE /* Return stats on buf_alloc performance. Use arg list instead of returning structure so that FORTRAN can eventually use it */ void buf_alloc_stats(size_t *total, long* nchunk, size_t * inuse, size_t * maxuse, long* nfrags, long* nmcalls,long* nfcalls) { *total = usage.total * sizeof(Header); *nchunk = usage.nchunk; *inuse = (size_t)usage.inuse * sizeof(Header); *maxuse = (size_t)usage.maxuse* sizeof(Header); *nfrags = usage.nfrags; *nmcalls= usage.nmcalls; *nfcalls= usage.nfcalls; } /* Print to standard output the usage statistics. */ void buf_alloc_print_stats() { size_t total, inuse, maxuse; long nchunk, nfrags, nmcalls, nfcalls; buf_alloc_stats(&total, &nchunk, &inuse, &maxuse, &nfrags, &nmcalls, &nfcalls); fflush(stderr); printf("\nbuf_alloc statistics\n-------------------\n\n"); printf("Total memory from system ... %ld bytes\n", (long)total); printf("Current memory usage ....... %ld bytes\n", (long)inuse); printf("Maximum memory usage ....... %ld bytes\n", (long)maxuse); printf("No. chunks from system ..... %ld\n", nchunk); printf("No. of fragments ........... %ld\n", nfrags); printf("No. of calls to buf_alloc ... %ld\n", nmcalls); printf("No. of calls to buf_free ..... %ld\n", nfcalls); printf("\n"); fflush(stdout); } #endif #if 0 void armci_die(char *str, int c) { fprintf(stderr,"%s %d\n",str,c); _exit(1); } #define LEN (16*1024) char buf[LEN]; main (int argc, char **argv) { int i,k,total=0,size=1024; char *ar[100]; armci_init_buf_alloc(LEN, buf); for(i=0; i<100; i++)ar[i]=(char*)0; for(i=0; i<100; i++){ ar[i] =armci_buf_alloc(size); if(!ar[i]){ printf("i =%d total=%d\n", i, total); buf_alloc_print_stats(); k=i; break; } total+=size; } for(i=0; i #include #define DEBUG_ 0 #define DEBUG_MEM 0 #if 0 # define MARK_ENTER(func_) { fprintf(stdout, "ENTERING %s\n", func_); fflush(stdout); } # define MARK_EXIT(func_) { fprintf(stdout, "EXITING %s\n", func_); fflush(stdout); } #else # define MARK_ENTER(func_) # define MARK_EXIT(func_) #endif #if 0 # define PRNDBG3(m,a1,a2,a3) \ fprintf(stderr,"DBG %d: " m,armci_me,a1,a2,a3);fflush(stderr) # define PRNDBG(m) PRNDBG3(m,0,0,0) # define PRNDBG1(m,a1) PRNDBG3(m,a1,0,0) # define PRNDBG2(m,a1,a2) PRNDBG3(m,a1,a2,0) #else # define PRNDBG(m) # define PRNDBG1(m,a1) # define PRNDBG2(m,a1,a2) # define PRNDBG3(m,a1,a2,a3) #endif #if !defined(GM) && !defined(VIA) && !defined(LAPI) &&!defined(VAPI) double _armci_rcv_buf[MSG_BUFLEN_DBL]; double _armci_snd_buf[MSG_BUFLEN_DBL]; char* MessageSndBuffer = (char*)_armci_snd_buf; char* MessageRcvBuffer = (char*)_armci_rcv_buf; #endif #define MAX_EHLEN 248 #define ADDBUF(buf,type,val) *(type*)(buf) = (val); (buf) += sizeof(type) #define GETBUF(buf,type,var) (var) = *(type*)(buf); (buf) += sizeof(type) #define ALLIGN8(buf){size_t _adr=(size_t)(buf); \ _adr>>=3; _adr<<=3; _adr+=8; (buf) = (char*)_adr; } #ifndef CLN # define CLN 1 #endif #ifndef SERV # define SERV 2 #endif /*******************Routines to handle completion descriptor******************/ /*\ *Following the the routines to fill a completion descriptor, if necessary *copy the data to destination based on completion descriptor *NOTE, THE FOLLOWING ROUTINES ARE FOR CLIENTS ONLY \*/ /*\Routine to complete a vector request, data is in buf and descriptor in dscr \*/ extern int armci_direct_vector_get(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); static void armci_complete_vector_get(armci_giov_t darr[],int len,void *buf) { int proc; request_header_t *msginfo = (request_header_t*) buf; proc = msginfo->to; #if defined(USE_SOCKET_VECTOR_API) armci_direct_vector_get(msginfo, darr, len, proc); #else armci_rcv_vector_data(proc, msginfo, darr, len); #endif FREE_SEND_BUFFER(buf); } /*\ Routine called from buffers.c to complete a request for which the buffer was * used for, so that the buffer can be reused. \*/ void armci_complete_req_buf(BUF_INFO_T *info, void *buffer) { request_header_t *msginfo = (request_header_t*) buffer; ARMCI_PR_DBG("enter",0); if(info->protocol==0)return; else if(info->protocol==SDSCR_IN_PLACE){ char *dscr = info->dscr; void *loc_ptr; int stride_levels; int *loc_stride_arr,*count; loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; if(0 || DEBUG_){ if(armci_me==0){ printf("\n%d:extracted loc_ptr=%p, stridelevels=%d\n",armci_me, loc_ptr,stride_levels); fflush(stdout); } } armci_rcv_strided_data(msginfo->to, msginfo, msginfo->datalen, loc_ptr, stride_levels,loc_stride_arr,count); FREE_SEND_BUFFER(msginfo); } else if(info->protocol==VDSCR_IN_PLACE || info->protocol==VDSCR_IN_PTR){ char *dscr; int len,i; if(info->protocol==VDSCR_IN_PLACE){ dscr = info->dscr; //printf("\n%d:vdscr in place\n",armci_me); } else { dscr = info->ptr.dscrbuf; //printf("\n%d:vdscr in buf\n",armci_me); } GETBUF(dscr, long ,len); { armci_giov_t *darr; darr = (armci_giov_t *)malloc(sizeof(armci_giov_t)*len); if(!darr)armci_die("malloc in complete_req_buf failed",len); for(i = 0; i< len; i++){ int parlen, bytes; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); darr[i].ptr_array_len = parlen; darr[i].bytes = bytes; if(msginfo->operation==GET)darr[i].dst_ptr_array=(void **)dscr; else darr[i].src_ptr_array=(void **)dscr; dscr+=sizeof(void *)*parlen; } if (msginfo->operation==GET) armci_complete_vector_get(darr,len,buffer); } } else armci_die("armci_complete_req_buf,protocol val invalid",info->protocol); ARMCI_PR_DBG("exit",0); } extern long x_net_offset(void *,int); /*\ save a part of strided descriptor needed to complete request rmo: it seems as if save_ \*/ void armci_save_strided_dscr(char **bptr, void *rem_ptr,int rem_stride_arr[], int count[], int stride_levels,int is_nb,int proc) { int i; char *bufptr=*bptr; BUF_INFO_T *info=NULL; long network_offset,tmpoffset; ARMCI_PR_DBG("enter",0); # ifdef PORTALS_UNRESOLVED if(!is_nb){ network_offset=x_net_offset(rem_ptr,proc); if(DEBUG_){printf("\n%d:rem_ptr=%p offset=%d newrem=%p",armci_me,rem_ptr,network_offset,(char *)rem_ptr+network_offset);fflush(stdout);} rem_ptr = (char *)rem_ptr+network_offset; } # endif if(is_nb){ info=BUF_TO_BUFINFO(*bptr); bufptr = (info->dscr); } *(void**)bufptr = rem_ptr; bufptr += sizeof(void*); *(int*)bufptr = stride_levels; bufptr += sizeof(int); for(i=0;idscr); if(armci_me==0) printf("\n%d:rem_ptr %p=%p stride_levels %d=%d\n",armci_me, *(void**)bufptr,rem_ptr, *(int*)(bufptr + sizeof(void*)),stride_levels); } /*remote_strided expects the pointer to point to the end of descr hence..*/ if(is_nb) info->protocol=SDSCR_IN_PLACE; else *bptr=bufptr; ARMCI_PR_DBG("exit",0); } /*\ save a part of vector descriptor needed to complete request \*/ void armci_save_vector_dscr(char **bptr,armci_giov_t darr[],int len, int op,int is_nb, int proc) { int i,size=sizeof(int); BUF_INFO_T *info; char *buf,*bufptr=*bptr; void *rem_ptr; long offst; ARMCI_PR_DBG("enter",0); if(is_nb){ for(i=0;idscr; info->protocol=VDSCR_IN_PLACE; } else { info->ptr.dscrbuf = (void *)malloc(size); buf = (char *)info->ptr.dscrbuf; info->protocol=VDSCR_IN_PTR; } } else buf=bufptr; ADDBUF(buf,long,len); /* number of sets */ for(i=0;ibufid to val, else set it to the id of the buf \*/ void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle,char *buf,int val) { BUF_INFO_T *info; if(buf){ info = BUF_TO_BUFINFO(buf); val = info->bufid; } nb_handle->bufid = val; } /**************End--Routines to handle completion descriptor******************/ /*\ send request to server to LOCK MUTEX \*/ void armci_rem_lock(int mutex, int proc, int *ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(int); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,LOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->datalen = sizeof(int); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = LOCK; msginfo->format = mutex; msginfo->bytes = msginfo->datalen + msginfo->dscrlen; ibuf = (int*)(msginfo+1); *ibuf = mutex; armci_send_req(proc, msginfo, bufsize, 0); /* receive ticket from server */ *ticket = *(int*)armci_rcv_data(proc,msginfo,0); FREE_SEND_BUFFER(msginfo); if(DEBUG_)fprintf(stderr,"%d receiving ticket %d\n",armci_me, *ticket); } void armci_server_lock(request_header_t *msginfo) { int *ibuf = (int*)(msginfo+1); int proc = msginfo->from; int mutex; int ticket; ARMCI_PR_DBG("enter",0); mutex = *(int*)ibuf; /* acquire lock on behalf of requesting process */ ticket = armci_server_lock_mutex(mutex, proc, msginfo->tag); if(ticket >-1){ /* got lock */ msginfo->datalen = sizeof(int); armci_send_data(msginfo, &ticket); } ARMCI_PR_DBG("exit",0); } /*\ send request to server to UNLOCK MUTEX \*/ void armci_rem_unlock(int mutex, int proc, int ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(ticket); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,UNLOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = msginfo->bytes = sizeof(ticket); msginfo->datalen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = UNLOCK; msginfo->format = mutex; ibuf = (int*)(msginfo+1); *ibuf = ticket; if(DEBUG_)fprintf(stderr,"%d sending unlock\n",armci_me); armci_send_req(proc, msginfo, bufsize,0); } /*\ server unlocks mutex and passes lock to the next waiting process \*/ void armci_server_unlock(request_header_t *msginfo, char* dscr) { int ticket = *(int*)dscr; int mutex = msginfo->format; int proc = msginfo->to; int waiting; waiting = armci_server_unlock_mutex(mutex,proc,ticket,&msginfo->tag); if(waiting >-1){ /* -1 means that nobody is waiting */ ticket++; /* pass ticket to the waiting process */ msginfo->from = waiting; msginfo->datalen = sizeof(ticket); armci_send_data(msginfo, &ticket); } } void armci_unlock_waiting_process(msg_tag_t tag, int proc, int ticket) { request_header_t header; request_header_t *msginfo = &header; msginfo->datalen = sizeof(int); msginfo->tag = tag; msginfo->from = proc; msginfo->to = armci_me; armci_send_data(msginfo, &ticket); } void * armci_server_ptr(int id){ char *buf; int bufsize = sizeof(int); request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = 0; msginfo->datalen = sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(&id, msginfo +1, sizeof(int)); if(DEBUG_MEM){ printf("\n%d:attach req:sending id %d \n",armci_me,id);fflush(stdout); } armci_send_req(armci_master, msginfo, bufsize,0); buf= armci_rcv_data(armci_master,msginfo,sizeof(void *));/* receive response */ if(DEBUG_MEM){ printf("\n%d:attach req:got %p \n",armci_me,buf);fflush(stdout); } FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); return (void *)buf; } /*\ control message to the server, e.g.: ATTACH to shmem, return ptr etc. \*/ void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen) { char *buf; ARMCI_PR_DBG("enter",0); int bufsize = 2*sizeof(request_header_t)+ilen + sizeof(long)+sizeof(rlen); long *idlist=(long *)info; request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = ilen; msginfo->datalen = sizeof(long)+sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(info, msginfo +1, ilen); if(DEBUG_MEM){printf("\n%d:sending idlist+1 %d, size %d, idlist[0] %d, idlist[1] %d\n",armci_me,idlist+1,size,idlist[0],idlist[1]);} buf = ((char*)msginfo) + ilen + sizeof(request_header_t); *((long*)buf) =size; *(int*)(buf+ sizeof(long)) = rlen; armci_send_req(armci_master, msginfo, bufsize,0); if(rlen){ buf= armci_rcv_data(armci_master, msginfo,rlen); /* receive response */ bcopy(buf, resp, rlen); FREE_SEND_BUFFER(msginfo); if(DEBUG_MEM){printf("%d:client attaching got ptr=%p %d bytes\n",armci_me,buf,rlen); fflush(stdout); } } ARMCI_PR_DBG("exit",0); } /*\ server initializes its copy of the memory lock data structures \*/ static void server_alloc_memlock(void *ptr_myclus) { int i; /* for protection, set pointers for processes outside local node NULL */ memlock_table_array = calloc(armci_nproc,sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); /* set pointers for processes on local cluster node * ptr_myclus - corresponds to the master process */ for(i=0; i< armci_clus_info[armci_clus_me].nslave; i++){ memlock_table_array[armci_master +i] = ((char*)ptr_myclus) + MAX_SLOTS*sizeof(memlock_t)*i; } /* set pointer to the use flag */ #ifdef MEMLOCK_SHMEM_FLAG armci_use_memlock_table = (int*) (MAX_SLOTS*sizeof(memlock_t) + (char*) memlock_table_array[armci_clus_last]); if(DEBUG_) fprintf(stderr,"server initialized memlock %p\n",armci_use_memlock_table); #endif } static int allocate_memlock=1; /*\ server actions triggered by client request to ATTACH \*/ void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen) { double *ptr; long *idlist = (long*)descr; long size = *(long*)buffer; int rlen = *(int*)(sizeof(long)+(char*)buffer); extern int **_armci_int_mutexes; ARMCI_PR_DBG("enter",0); if(size<0) armci_die("armci_server_ipc: size<0",(int)size); if(DEBUG_MEM)printf("\n%d:got idlist+1 %p, size %d, idlist[0] %d, idlist[1] %d",armci_me,idlist+1,size,idlist[0],idlist[1]); ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("armci_server_ipc: failed to attach",0); /* provide data server with access to the memory lock data structures */ if(allocate_memlock){ allocate_memlock = 0; server_alloc_memlock(ptr); } if(_armci_int_mutexes==NULL){ printf("unresolved portals external\n"); abort(); # ifdef PORTALS_UNRESOLVED extern int _armci_server_mutex_ready; extern void *_armci_server_mutex_ptr; if(_armci_server_mutex_ready){ _armci_int_mutexes=(int **)_armci_server_mutex_ptr; } # endif } if(size>0)armci_set_mem_offset(ptr); if(msginfo->datalen != sizeof(long)+sizeof(int)) armci_die("armci_server_ipc: bad msginfo->datalen ",msginfo->datalen); if(rlen==sizeof(ptr)){ msginfo->datalen = rlen; armci_send_data(msginfo, &ptr); } else armci_die("armci_server_ipc: bad rlen",rlen); ARMCI_PR_DBG("exit",0); } /*\ send RMW request to server \*/ void armci_rem_rmw(int op, void *ploc, void *prem, int extra, int proc) { request_header_t *msginfo; char *buf; void *buffer; int bufsize = sizeof(request_header_t)+sizeof(long)+sizeof(void*); long offst; ARMCI_PR_DBG("enter",0); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,op,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = sizeof(void*); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->datalen = sizeof(long); # ifdef PORTALS_UNRESOLVED offst=x_net_offset(prem,proc); prem = ((char *)prem+offst); # endif buf = (char*)(msginfo+1); ADDBUF(buf, void*, prem); /* pointer is shipped as descriptor */ /* data field: extra argument in fetch&add and local value in swap */ if(op==ARMCI_SWAP){ ADDBUF(buf, int, *((int*)ploc)); }else if(op==ARMCI_SWAP_LONG) { ADDBUF(buf, long, *((long*)ploc) ); msginfo->datalen = sizeof(long); }else { ADDBUF(buf, int, extra); } msginfo->bytes = msginfo->datalen+msginfo->dscrlen ; if(DEBUG_){ printf("%d sending RMW request %d to %d\n",armci_me,op,proc); fflush(stdout); } armci_send_req(proc, msginfo, bufsize,0); buffer = armci_rcv_data(proc,msginfo,0); /* receive response */ if(op==ARMCI_FETCH_AND_ADD || op== ARMCI_SWAP) *(int*)ploc = *(int*)buffer; else *(long*)ploc = *(long*)buffer; FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ server response to RMW \*/ void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra) { long lold; int iold; void *pold=0; int op = msginfo->operation; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d server: executing RMW from %d. op=%d pextra=%p\n",armci_me,msginfo->from, op, pextra); fflush(stdout); } if(msginfo->datalen != sizeof(long)) armci_die2("armci_server_rmw: bad datalen=",msginfo->datalen,op); /* for swap operations *pextra has the value to swap * for fetc&add it carries the increment argument */ switch(op){ case ARMCI_SWAP: iold = *(int*) pextra; case ARMCI_FETCH_AND_ADD: pold = &iold; break; case ARMCI_SWAP_LONG: lold = *(long*) pextra; case ARMCI_FETCH_AND_ADD_LONG: pold = &lold; break; default: armci_die("armci_server_rmw: bad operation code=",op); } armci_generic_rmw(op, pold, *(int**)ptr, *(int*) pextra, msginfo->to); armci_send_data(msginfo, pold); ARMCI_PR_DBG("exit",0); } extern int armci_direct_vector_snd(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); extern int armci_direct_vector(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,int flag, armci_ihdl_t nb_handle) { char *buf,*buf0; request_header_t *msginfo; int bytes =0, s, slen=0; size_t adr; int bufsize = sizeof(request_header_t); int tag=0; if(nb_handle)tag=nb_handle->tag; /* compute size of the buffer needed */ for(s=0; stag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } buf += sizeof(request_header_t); /* fill vector descriptor */ armci_save_vector_dscr(&buf,darr,len,op,0,proc); /* align buf for doubles (8-bytes) before copying data */ adr = (size_t)buf; adr >>=3; adr <<=3; adr +=8; buf = (char*)adr; msginfo->ehlen = 0; /* fill message header */ msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->format = VECTOR; msginfo->datalen = bytes; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; default: slen=0; } buf += slen; msginfo->datalen += slen; msginfo->bytes = msginfo->datalen+msginfo->dscrlen; /* for put and accumulate copy data into buffer */ if(op != GET){ /* fprintf(stderr,"sending %lf\n",*(double*)darr[0].src_ptr_array[0]);*/ armci_vector_to_buf(darr, len, buf); } armci_send_req(proc, msginfo, bufsize,tag); /*x_buf_send_complete(buf0);*/ if(nb_handle && op==GET) armci_save_vector_dscr(&buf0,darr,len,op,1,proc); if(op == GET&& !nb_handle){ armci_complete_vector_get(darr,len,msginfo); } return 0; } #define CHUN_ (8*8096) #define CHUN 200000 /*\ client version of remote strided operation \*/ int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int flag,armci_ihdl_t nb_handle) { char *buf, *buf0; request_header_t *msginfo; int i, slen=0, bytes; void *rem_ptr; int *rem_stride_arr; int bufsize = sizeof(request_header_t); int ehlen =0; msg_tag_t msg_tag; int tag=0; /* we send ext header only for last chunk */ #if 0 if(h) ehlen = h->len; #else if(h) if(h->last) ehlen = h->len; #endif if(ehlen>MAX_EHLEN || ehlen <0) armci_die2("armci_rem_strided ehlen out of range",MAX_EHLEN,ehlen); /* calculate size of the buffer needed */ for(i=0, bytes=1;i<=stride_levels;i++)bytes*=count[i]; bufsize += bytes+sizeof(void*)+2*sizeof(int)*(stride_levels+1) +ehlen +2*sizeof(double) + 16; /* +scale+alignment */ if (flag){ if(op==GET)bufsize -=bytes; } buf = buf0= GET_SEND_BUFFER((bufsize),op,proc); msginfo = (request_header_t*)buf; bzero(msginfo,sizeof(request_header_t)); if(nb_handle) #ifdef ACC_SMP if(!ARMCI_ACC(op)) #endif { // printf("%s: non-blocking ops not yet supported\n",Portals_ID()); // abort(); /* INIT_SENDBUF_INFO(nb_handle,buf,op,proc); same as _armci_buf_set_tag, why here? */ _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); tag = nb_handle->tag; } if(op == GET){ rem_ptr = src_ptr; rem_stride_arr = src_stride_arr; }else{ rem_ptr = dst_ptr; rem_stride_arr = dst_stride_arr; } msginfo->datalen=bytes; /* fill strided descriptor */ buf += sizeof(request_header_t); /*this function fills the dscr into buf and also moves the buf ptr to the end of the dscr*/ armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0,proc); /* align buf for doubles (8-bytes) before copying data */ ALLIGN8(buf); /* fill message header */ msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = op; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; case ARMCI_ACC_LNG: *(long*)buf = *(long*)scale; slen = sizeof(long); break; default: slen=0; } /* if(ARMCI_ACC(op))printf("%d client len=%d alpha=%lf data=%lf,%lf\n", armci_me, buf-(char*)msginfo,((double*)buf)[0],*((double*)src_ptr), ((double*)buf)[1]); */ buf += slen; /**** add extended header *******/ if(ehlen){ bcopy(h->exthdr,buf,ehlen); i = ehlen%8; ehlen += (8-i); /* make sure buffer is still alligned */ buf += ehlen; } msginfo->ehlen = ehlen; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->datalen+msginfo->dscrlen; if(op == GET){ /* if(nb_handle) { printf("%s rem_strided: nb gets not yet available\n",Portals_ID()); abort(); } */ armci_send_req(proc, msginfo, bufsize,tag); armci_save_strided_dscr(&buf0,dst_ptr,dst_stride_arr,count, stride_levels,1,proc); # ifdef PORTALS_ALLOW_NBGETS if(!nb_handle){ # endif armci_rcv_strided_data(proc, msginfo, msginfo->datalen, dst_ptr, stride_levels, dst_stride_arr, count); FREE_SEND_BUFFER(msginfo); # ifdef PORTALS_ALLOW_NBGETS } # endif } else { /* for put and accumulate send data */ armci_send_strided(proc,msginfo, buf, src_ptr, stride_levels, src_stride_arr, count,tag); } return 0; } void armci_process_extheader(request_header_t *msginfo, char *dscr, char* buf, int buflen) { armci_flag_t *h; int *flag; h = (armci_flag_t*)(dscr + msginfo->dscrlen - msginfo->ehlen); #if 0 if(msginfo->ehlen)printf("%d:server from=%d len=%d: ptr=%p val=%d\n",armci_me,msginfo->from, msginfo->ehlen,h->ptr,h->val); fflush(stdout); #endif flag = (int*)(h->ptr); *flag = h->val; } void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen) { int buf_stride_arr[MAX_STRIDE_LEVEL+1]; int *loc_stride_arr,slen; int *count, stride_levels; void *buf_ptr, *loc_ptr; void *scale; char *dscr_save = dscr; int rc, i,proc; int stat; ARMCI_PR_DBG("enter",msginfo->datalen);fflush(stdout); /*return if using readv/socket for put*/ if(msginfo->operation==PUT && msginfo->datalen==0){ if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr, buf, buflen); return; } /* unpack descriptor record */ loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; /* compute stride array for buffer */ buf_stride_arr[0]=count[0]; for(i=0; i< stride_levels; i++) buf_stride_arr[i+1]= buf_stride_arr[i]*count[i+1]; /* get scale for accumulate, adjust buf to point to data */ switch(msginfo->operation){ case ARMCI_ACC_INT: slen = sizeof(int); break; case ARMCI_ACC_DCP: slen = 2*sizeof(double); break; case ARMCI_ACC_DBL: slen = sizeof(double); break; case ARMCI_ACC_CPL: slen = 2*sizeof(float); break; case ARMCI_ACC_FLT: slen = sizeof(float); break; case ARMCI_ACC_LNG: slen = sizeof(long); break; default: slen=0; } scale = dscr_save+ (msginfo->dscrlen - slen -msginfo->ehlen); /* if(ARMCI_ACC(msginfo->operation)) fprintf(stderr,"%d in server len=%d slen=%d alpha=%lf data=%lf\n", armci_me, msginfo->dscrlen, slen, *(double*)scale,*(double*)buf); */ buf_ptr = buf; /* data in buffer */ proc = msginfo->to; if(msginfo->operation == GET){ armci_send_strided_data(proc, msginfo, buf, loc_ptr, stride_levels, loc_stride_arr, count); /* fprintf(stderr, "GET response sent with tag: %d\n, msginfo->tag", msginfo->tag); */ } else{ if((rc = armci_op_strided(msginfo->operation, scale, proc, buf_ptr, buf_stride_arr, loc_ptr, loc_stride_arr, count, stride_levels, 1,NULL))) armci_die("server_strided: op from buf failed",rc); } if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr_save, buf, buflen); ARMCI_PR_DBG("exit",0); } void armci_server_vector( request_header_t *msginfo, char *dscr, char* buf, int buflen) { int proc; long len; void *scale; int i,s; char *sbuf = buf; if(msginfo->operation==PUT && msginfo->datalen==0)return;/*return if using readv/socket for put*/ /* unpack descriptor record */ GETBUF(dscr, long ,len); /* get scale for accumulate, adjust buf to point to data */ scale = buf; switch(msginfo->operation){ case ARMCI_ACC_INT: buf += sizeof(int); break; case ARMCI_ACC_DCP: buf += 2*sizeof(double); break; case ARMCI_ACC_DBL: buf += sizeof(double); break; case ARMCI_ACC_CPL: buf += 2*sizeof(float); break; case ARMCI_ACC_FLT: buf += sizeof(float); break; } proc = msginfo->to; /*fprintf(stderr,"scale=%lf\n",*(double*)scale);*/ /* execute the operation */ switch(msginfo->operation) { case GET: /* fprintf(stderr, "%d:: Got a vector message!!\n", armci_me); */ if(msginfo->ehlen) { armci_die("Unexpected vector message with non-zero ehlen. GPC call?", msginfo->ehlen); } else { for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); /* fprintf(stderr,"len=%d bytes=%d parlen=%d\n",len,bytes,parlen);*/ ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ armci_copy(ptr[s], buf, bytes); buf += bytes; } } /* fprintf(stderr,"%d:: VECTOR GET. server sending buffer %p datalen=%d\n",armci_me, sbuf, msginfo->datalen); */ armci_send_data(msginfo, sbuf); } break; case PUT: /* fprintf(stderr,"received in buffer %lf\n",*(double*)buf);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ /* armci_copy(buf, ptr[s], bytes); */ bcopy(buf, ptr[s], (size_t)bytes); buf += bytes; } } break; default: /* this should be accumulate */ if(!ARMCI_ACC(msginfo->operation)) armci_die("v server: wrong op code",msginfo->operation); /* fprintf(stderr,"received first=%lf last =%lf in buffer\n",*/ /* *((double*)buf),((double*)buf)[99]);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); armci_lockmem_scatter(ptr, parlen, bytes, proc); for(s=0; s< parlen; s++){ armci_acc_2D(msginfo->operation, scale, proc, buf, ptr[s], bytes, 1, bytes, bytes, 0); buf += bytes; } ARMCI_UNLOCKMEM(proc); } } } ga-5-4/armci/src-portals/kr_malloc.h0000644000175000017500000000651112662210425015513 0ustar mbamba#ifndef KR_MALLOC_H /* K&R malloc */ #define KR_MALLOC_H #ifdef CRAY #define LOG_ALIGN 6 #elif defined(KSR) #define LOG_ALIGN 7 #else #define LOG_ALIGN 6 #endif #define ALIGNMENT (1 << LOG_ALIGN) #define KR_CTX_SHMEM 101 #define KR_CTX_LOCALMEM 102 union header{ struct { unsigned valid1; /* Token to check if is not overwritten */ union header *ptr; /* next block if on free list */ int shmid; /* next block's shared memory id */ long shmoffset; /* next block's shmem offset */ size_t shmsize; /* next block's shared memory segment size */ size_t size; /* size of this block*/ unsigned valid2; /* Another token acting as a guard */ } s; char align[ALIGNMENT]; /* Align to ALIGNMENT byte boundary */ }; typedef union header Header; typedef struct malloc_context { size_t usize; /* unit size in bytes */ size_t nalloc; /* No. of units of length ALIGNMENT */ size_t max_nalloc; /* Maximum no. of units that can get */ void * (*alloc_fptr)(); /* function pointer to memory alloc routine */ size_t total; /* Amount request from system in units */ long nchunk; /* No. of chunks of system memory */ long inuse; /* Amount in use in units */ long maxuse; /* Maximum value of inuse */ long nfrags; /* No. of fragments divided into */ long nmcalls; /* No. of calls to _armci_alloc() */ long nfcalls; /* No. of calls to memfree */ int ctx_type; /* context id. -1 represents ctx_local context. otherwise, it is ctx_shmem context. */ int shmid; /* first free block's (i.e.freep) shmem id */ long shmoffset; /* first free block's shmem offset */ size_t shmsize; /* first free block's shmem total size */ Header base; /* empty list to get started */ Header *freep; /* start of free list */ Header *usedp; /* start of used list */ } context_t; /* Memory required to store the shmem context in shared memory. This shmem context shuld be stored in shared memory and is stored in the first shared memory segment created (i.e.armci_krmalloc_init_ctxshmem) */ #define SHMEM_CTX_MEM (sizeof(context_t)+sizeof(void*)) #define SHMEM_CTX_BYTES ((SHMEM_CTX_MEM + sizeof(Header) - 1)>>LOG_ALIGN) + 1; extern void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx); /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *kr_malloc(size_t size, context_t *ctx, int new_allocation, char **new_base, size_t *new_size); /* Frees memory allocated by kr_malloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-memalloc'ed pointers */ extern void kr_free(char *ptr, context_t *ctx); /* Print to standard output the usage statistics ... a wrapper for kr_malloc_stats(); */ extern void kr_malloc_print_stats(context_t *ctx); extern void kr_malloc_verify(context_t *ctx); #endif ga-5-4/armci/src-portals/armcip.h0000644000175000017500000003676712662210425015043 0ustar mbamba/* $Id: armcip.h,v 1.82.2.9 2007-08-29 17:32:31 manoj Exp $ */ /* armci private header file */ #ifndef _ARMCI_P_H #define _ARMCI_P_H #include #include "armci.h" #include "message.h" #include "code_options.h" #if 0 #define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) \ printf("\n%d:%s:%d:%s:%s:%d",armci_me,__FILE__,__LINE__,FUNCTION_NAME,__ARMCI_ST,__ARMCI_NU);fflush(stdout) #define ARMCI_PR_SDBG(__ARMCI_ST,__ARMCI_NU) \ printf("\n(%d):%s:%d:%s:%s:%d",armci_me,__FILE__,__LINE__,FUNCTION_NAME,__ARMCI_ST,__ARMCI_NU);fflush(stdout) #else #define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) #define ARMCI_PR_SDBG(__ARMCI_ST,__ARMCI_NU) #endif /*#define ARMCI_CHECK_STATE*/ #define ARMCI_STAMP 11214 #define ARMCI_TAIL 31121 #ifdef QUADRICS #include #ifdef QSNETLIBS_VERSION_CODE #ifndef DECOSF # define ELAN_ACC # define PENDING_OPER(x) ARMCI_ACC_INT #endif # if QSNETLIBS_VERSION_CODE > QSNETLIBS_VERSION(1,5,0) # define LIBELAN_ATOMICS # endif #endif extern void armci_elan_fence(int p); #endif /* we got problems on IA64/Linux64 with Elan if inlining is used */ #if defined(__GNUC__) && !defined(QUADRICS) # define INLINE inline #else # define INLINE #endif #ifdef WIN32 #include #define sleep(x) Sleep(100*(x)) #else #include #endif #if (defined(SYSV) || defined(WIN32)|| defined(MMAP)) && !defined(NO_SHM) && !defined(HITACHI) && !defined(CATAMOUNT) #define CLUSTER #ifdef SERVER_THREAD # define SERVER_NODE(c) (armci_clus_info[(c)].master); # define NODE_SERVER(c) (c); #else # define SOFFSET -1000000 # define SERVER_NODE(c) ((int)(SOFFSET -armci_clus_info[(c)].master)); # define NODE_SERVER(c) ((int)(SOFFSET - c)) #endif #endif /*\GPC call stuff \*/ typedef struct { int hndl, hlen, dlen; void *hdr, *data; }gpc_send_t; /*\ Stuff for non-blocking API \*/ #define NB_MULTI -1 /*more than one armci buffer(buffers.c) used for nbcall*/ #define NB_NONE -2 /*no armci buffer(buffers.c) used for nbcall*/ extern unsigned int _armci_get_next_tag(); #define GET_NEXT_NBTAG _armci_get_next_tag #define ARMCI_MAX_IMPLICIT 15 typedef struct{ int len; int last; void *exthdr; } ext_header_t; typedef struct{ int val; void *ptr; } armci_flag_t; #if defined(LAPI) || defined(PTHREADS) || defined(POSIX_THREADS) # include typedef pthread_t thread_id_t; # define THREAD_ID_SELF pthread_self #elif defined(WIN32) # include typedef DWORD thread_id_t; # define THREAD_ID_SELF GetCurrentThreadId #else typedef int thread_id_t; # define THREAD_ID_SELF() 1 #endif extern thread_id_t armci_usr_tid; #ifdef SERVER_THREAD # define SERVER_CONTEXT (armci_usr_tid != THREAD_ID_SELF()) #else # define SERVER_CONTEXT (armci_me<0) #endif #if defined(LAPI) || defined(CLUSTER) || defined(CRAY) \ || defined(CRAY_SHMEM) || defined(BGML) || defined(DCMF) # include "request.h" #endif /* ------------------------ ARMCI threads support ------------------------- */ #define ARMCI_THREADS_LIMIT 32 #include "utils.h" #if defined(THREAD_SAFE) typedef struct { int max; /* max # of threads per proc */ int avail; /* next available position */ thread_id_t *ids; /* list of threads' ids */ thread_lock_t lock; /* general case lock */ thread_lock_t buf_lock; /* lock for buffer access */ thread_lock_t net_lock; /* lock for network accees */ } armci_user_threads_t; extern armci_user_threads_t armci_user_threads; extern void armci_init_threads(); extern void armci_finalize_threads(); extern int armci_thread_idx(); extern INLINE int armci_register_thread(thread_id_t id); #define ARMCI_THREAD_IDX armci_thread_idx() /* needs to be optimized */ #else # define ARMCI_THREAD_IDX 0 #endif /* ------------------------------------------------------------------------ */ /* min amount of data in strided request to be sent in single TCP/IP message*/ #if defined(SOCKETS) || defined(MPI_SPAWN_ZEROCOPY) # define TCP_PAYLOAD 128 # define LONG_GET_THRESHOLD TCP_PAYLOAD # define LONG_GET_THRESHOLD_STRIDED LONG_GET_THRESHOLD # define LONG_PUT_THRESHOLD 128 #endif #ifdef WIN32 # define bzero(a,len){\ int _i;\ char *_c = (char*)(a);\ for(_i=0; _i< (int)(len); _i++)_c[_i]=(char)0;\ } # define bcopy(a,b,len) memcpy(b,a,len) #else # include #endif /*#define ACC_COPY*/ #if defined(CRAY_T3E) || defined(FUJITSU)\ || defined(HITACHI) || (defined(QUADRICS) && !defined(ELAN_ACC)) #define ACC_COPY #endif #ifndef FATR # ifdef WIN32 # define FATR __stdcall # else # define FATR # endif #endif #define MAX_PROC 8096 #define MAX_STRIDE_LEVEL ARMCI_MAX_STRIDE_LEVEL /* msg tag ARMCI uses in collective ops */ #define ARMCI_TAG 30000 #ifndef EXTRA_MSG_BUFLEN_DBL # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL) #else # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL +\ EXTRA_MSG_BUFLEN_DBL) #endif #if defined(HITACHI) # define BUFSIZE ((0x50000) * sizeof(double)) #else /* packing algorithm for double complex numbers requires even number */ # ifdef MSG_BUFLEN_DBL # define BUFSIZE_DBL (MSG_BUFLEN_DBL - RESERVED_BUFLEN) # else # define BUFSIZE_DBL 32768 # endif # define BUFSIZE (BUFSIZE_DBL * sizeof(double)) #endif /* note opcodes must be lower than ARMCI_ACC_OFF !!! */ #define PUT 1 #define GET 2 #define RMW 3 #define LOCK 4 #define UNLOCK 5 #define ACK 6 #define STATE 11214 /* must fit in two bits, see msginfo->format in request.h */ #define STRIDED 1 #define VECTOR 2 extern int armci_me, armci_nproc; extern int _armci_initialized; #ifdef HITACHI extern int sr8k_server_ready; extern double *armci_internal_buffer; #else extern double armci_internal_buffer[BUFSIZE_DBL]; #endif extern int armci_getbufsize(); extern void armci_shmem_init(); extern void armci_krmalloc_init_localmem(); extern void armci_die(char *msg, int code); extern void armci_die2(char *msg, int code1, int code2); extern void armci_write_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern void armci_read_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern int armci_op_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int lockit,armci_ihdl_t nb_handle); extern int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_acc_vector(int op, /* operation code */ void *scale, /* scale factor */ armci_giov_t darr[],/* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *hdr, int fit_level, int nb, int last,armci_ihdl_t nb_handle); extern int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,armci_ihdl_t nb_handle); extern void armci_lockmem(void *pstart, void* pend, int proc); extern void armci_unlockmem(int proc); extern int armci_acc_copy_strided(int optype, void* scale, int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels); extern void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf); extern void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf); extern void armci_init_fence(); #ifdef SOCKETS #ifdef SERVER_THREAD extern void armci_create_server_thread ( void* (* func)(void*) ); extern void armci_terminate_server_thread(); #else extern void armci_create_server_process ( void* (* func)(void*) ); extern void armci_wait_server_process(); extern void RestoreSigChldDfl(); #endif #endif #ifdef MPI_SPAWN extern void armci_create_server_MPIprocess (); #endif #define ARMCI_MAX(a,b) (((a)>(b))?(a):(b)) #define ARMCI_MIN(a,b) (((a)<(b))?(a):(b)) #define ARMCI_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define ARMCI_ACC(op) ((((int)(op))-ARMCI_ACC_INT)>=0) #ifdef CLUSTER extern char *_armci_fence_arr; # define FENCE_ARR(p_) (_armci_fence_arr[p_]) # define SAMECLUSNODE(p)\ ( ((p) <= armci_clus_last) && ((p) >= armci_clus_first) ) #elif defined(__crayx1) # define SAMECLUSNODE(p) 1 #elif defined(ARMCIX) # define SAMECLUSNODE(p) 0 #else # define SAMECLUSNODE(p) ((p)==armci_me) #endif #if defined(LAPI) || defined(ELAN_ACC) # define ORDER(op,proc)\ if( proc == armci_me || ( ARMCI_ACC(op) && ARMCI_ACC(PENDING_OPER(proc))) );\ else FENCE_NODE(proc) # define UPDATE_FENCE_INFO(proc_) #elif defined(CLUSTER) && !defined(QUADRICS) && !defined(HITACHI)\ && !defined(CRAY_SHMEM) # define ORDER(op_,proc_)\ if(!SAMECLUSNODE(proc_) && op_ != GET )FENCE_ARR(proc_)=1 # define UPDATE_FENCE_INFO(proc_) if(!SAMECLUSNODE(proc_))FENCE_ARR(proc_)=1 #else # if defined(GM) && defined(ACK_FENCE) # define ORDER(op,proc) # else # define ORDER(op,proc) if(proc != armci_me) FENCE_NODE(proc) # endif # define UPDATE_FENCE_INFO(proc_) #endif typedef struct { int ptr_array_len; int bytes; void **ptr_array; } armci_riov_t; /*\ consider up to HOSTNAME_LEN characters in host name * we can truncate names of the SP nodes since it is not used * to establish socket communication like on the networks of workstations * SP node names must be distinct within first HOSTNAME_LEN characters \*/ #if defined(LAPI) && defined(AIX) # define HOSTNAME_TRUNCATE # define HOSTNAME_LEN 12 #else # define HOSTNAME_LEN 64 #endif typedef struct { int master; int nslave; char hostname[HOSTNAME_LEN]; } armci_clus_t; extern armci_clus_t *armci_clus_info; extern int armci_nclus, armci_clus_me, armci_master; extern int armci_clus_first, armci_clus_last; extern int armci_clus_id(int p); extern void armci_init_clusinfo(); extern void armci_set_mem_offset(void *ptr); extern int _armci_terminating; extern void armci_acc_2D(int op, void* scale, int proc, void *src_ptr, void *dst_ptr, int bytes, int cols, int src_stride, int dst_stride, int lockit); extern void armci_lockmem_scatter(void *ptr_array[], int len, int bytes, int p); extern void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int p); extern unsigned long armci_max_region(); extern void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg); extern void armci_msg_gop_init(); extern void armci_util_spin(int n, void *notused); #if defined(SYSV) || defined(WIN32) extern void armci_shmem_init(); extern void armci_set_shmem_limit_per_core(unsigned long shmemlimit); extern void armci_set_shmem_limit_per_node(int nslaves); extern void armci_set_shmem_limit(unsigned long shmemlimit); #endif #define ALIGN_PTR_LONG(type, x) if( ((long)(x)) % sizeof(long)) { long _y = (long)(x);\ if(sizeof(long)==8){_y>>=3; _y<<=3; }\ else { _y>>=2; _y<<=2; }\ _y += sizeof(long); (x) = (type*)_y; } #define SIXTYFOUR 64 #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) #define ALIGNLONGADD(buf) ((((ssize_t)(buf))%sizeof(long))?(sizeof(long)-(((ssize_t)(buf))%sizeof(long))):0) #define SET 1 #define UNSET 0 extern int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_giov_descriptor(armci_giov_t darr[], int len, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle); extern void armci_agg_complete(armci_ihdl_t nb_handle, int condition); extern armci_ihdl_t armci_set_implicit_handle (int op, int proc); extern int armci_getnumcpus(void); extern long armci_util_long_getval(long* p); extern int armci_util_int_getval(int* p); extern void armci_region_register_shm(void *start, long size); extern void armci_region_register_loc(void *start, long size); extern void armci_region_clus_record(int node, void *start, long size); extern void armci_region_init(); extern int armci_region_clus_found(int node, void *start, int size); extern int armci_region_loc_found(void *start, int size); extern int armci_region_both_found(void *loc, void *rem, int size, int node); #ifdef REGIONS_REQUIRE_MEMHDL extern int get_armci_region_local_hndl(void *loc, int node, ARMCI_MEMHDL_T **loc_memhdl); #endif extern void armci_region_exchange(void *start, long size); extern void cpu_yield(); #ifdef ALLOW_PIN extern void armci_global_region_exchange(void *, long); #endif /* -------------------- ARMCI Groups ---------------------- */ /* data structure that caches a group's attribute */ #ifdef BGML #define PCLASS 3 #endif #ifdef MSG_COMMS_MPI typedef int ARMCI_Datatype; extern int ATTR_KEY; /* attribute key */ /* #define ARMCI_GROUP /\*Generic ARMCI implementation*\/ */ typedef struct { armci_clus_t *grp_clus_info; int grp_me; /* my group id */ int grp_nclus; /* number of cluster nodes */ int grp_clus_me; /* my cluster node id */ int mem_offset; /* memory offset */ #ifdef ARMCI_GROUP int nproc; /* #procs in this group*/ int *proc_list; /* Ids of procs in this group (w.r.t. MPI_COMM_WORLD)*/ #endif }armci_grp_attr_t; #include "mpi.h" /**dup of MPI_COMM_WORLD for internal MPI communication*/ extern MPI_Comm ARMCI_COMM_WORLD; #ifdef PORTALS #include "portals.h" #endif typedef MPI_Comm ARMCI_Comm; typedef struct { #ifndef ARMCI_GROUP MPI_Comm icomm; MPI_Group igroup; #endif armci_grp_attr_t grp_attr; }ARMCI_iGroup; armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *grp); extern void armci_group_init(); extern void armci_group_finalize(); extern ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group); #endif /* ifdef MSG_COMMS_MPI */ /* -------------------------------------------------------- */ /* ------------ ARMCI Chekcpointing/Recovery -------------- */ #ifdef DO_CKPT extern int armci_init_checkpoint(); extern void armci_create_ckptds(armci_ckpt_ds_t *ckptds, int count); extern int armci_icheckpoint_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds); extern int armci_icheckpoint(int rid); extern int armci_irecover(int rid,int iamreplacement); extern void armci_icheckpoint_finalize(int rid); #endif /* ifdef DO_CKPT */ /* -------------------------------------------------------- */ /* portals only */ void armci_register_shmem(void *my_ptr, long size, long *idlist, long off, void *sptr); void armci_register_shmem_grp(void *my_ptr, long size, long *idlist, long off, void *sptr,ARMCI_Group *group); #endif ga-5-4/armci/src-portals/portals_ds.c0000644000175000017500000004514112662210425015717 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif # include "armcip.h" # include # include # include # include static ptl_handle_ni_t ds_nih; static ptl_handle_eq_t ds_eqh; static ptl_handle_eq_t request_eqh; static ptl_handle_me_t matchall_meh; static int request_buffer_cur_block; static ptl_md_t request_buffer_md[PORTALS_NREQUEST_BUFFERS]; static ptl_handle_me_t request_buffer_meh[PORTALS_NREQUEST_BUFFERS]; int portals_ds_ready = 0; // void *portals_ds_working_buffer = NULL; void* portals_ds_thread(void* args) { portals_ds_init(); portals_ds(); portals_ds_finalize(); portalsSpinLockOnInt(&portals_cp_finished,1,1000); exit(0); return NULL; } int portals_ds_init() { int i,rc; size_t bufferSize; float warningSize; portals_ds_ready = 0; /* --------------------------------------------------------------------- *\ unhook set affinity ... data servers can roam \* --------------------------------------------------------------------- */ # ifdef PORTALS_AFFINITY int smp_np, smp_me; unsigned long mask; unsigned int len = sizeof(mask); unsigned long ncpus; int verbose = 0; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); if((ncpus = sysconf(_SC_NPROCESSORS_ONLN)) < 0) { printf("%d [ds] sysconf(_SC_NPROCESSORS_ONLN) failed; err=%d\n", armci_me, ncpus); armci_die("sysconf in init_throttle",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error in ds_init",911); } if(armci_clus_me == 0 && /* verbose */ 0 ) { printf("%d [ds]: old affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } if(smp_np == ncpus) { mask = (1 << ncpus) - 1; /* let the data server roam over all cores */ } else { mask = 1 << (ncpus - 1); /* pin the ds to the last core on the node */ } if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity"); armci_die("setaffinity error in ds_init",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error (#2) in ds_init",911); } if(armci_clus_me == 0 && verbose) { printf("%d [ds]: new affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } # endif /* --------------------------------------------------------------------- *\ initialize the network interface \* --------------------------------------------------------------------- */ rc = portals_init(&ds_nih); if (rc != PTL_OK) { printf("failed to initialize portals on ds; err %d\n",rc); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ used for responding to data requests; this keeps the response events in a separate queue from the multitude of incoming data requests \* --------------------------------------------------------------------- */ rc = portals_create_eq(ds_nih, 200, &ds_eqh); /* --------------------------------------------------------------------- *\ used to process incoming data requests. at very large scale we will have to do some sort of messaging by node group to reduce the worst case scenario off all to one type operations. use the data server to message forward from node groups. \* --------------------------------------------------------------------- */ i = ARMCI_MAX(6*PORTALS_MAX_DESCRIPTORS*armci_nproc,200); i = ARMCI_MAX(6*armci_nproc,200); rc = portals_create_eq(ds_nih, i, &request_eqh); if (rc != PTL_OK) { printf("failed to create request event queue"); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ create ME list that matches all incoming data requests this will be a dead ME with no MD ... it will only be used as a place holder in which the "active" me/md will be placed in front of. \* --------------------------------------------------------------------- */ rc = portals_create_matchall_me(&matchall_meh); if (rc != PTL_OK) { printf("failed to create matchall ME\n"); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ create buffer space for the ds buffer \* --------------------------------------------------------------------- */ assert(portalsMaxEagerMessageSize > sizeof(request_header_t)); bufferSize = portalsMaxEagerMessageSize; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE bufferSize *= armci_nclus; # else bufferSize *= armci_nproc; # endif bufferSize = bufferSize/(PORTALS_NREQUEST_BUFFERS-2); bufferSize = ARMCI_MAX(bufferSize,portalsMaxEagerMessageSize); // if(armci_me == 0) printf("%s: bufferSize=%ld\n",Portals_ID(),bufferSize); /* if(bufferSize*PORTALS_NREQUEST_BUFFERS > PORTALS_REQUEST_BUFFER_SIZE_WARNING) { warningSize = (float) bufferSize * PORTALS_NREQUEST_BUFFERS; warningSize /= ONE_MB; printf("[data server]: internal request buffer is %.2f MB\n",warningSize); } */ for(i=0; itag.user_ptr = (void *) &ev; if(request->operation == PUT || ARMCI_ACC(request->operation)) { buffersize = sizeof(request_header_t) + request->dscrlen + request->datalen; if(buffersize >= portalsMaxEagerMessageSize) { buffer = (char *) MessageRcvBuffer; portals_ds_get_from_cp(buffer,buffersize,ev.initiator,ev.hdr_data); request = (request_header_t *) buffer; request->tag.user_ptr = (void *) &ev; armci_data_server(buffer); // printf("%d: FINISHED RENDEZ-VOUS!\n",armci_me); break; } } if(request->operation == GET) { buffersize = sizeof(request_header_t) + request->dscrlen; if(buffersize >= portalsMaxEagerMessageSize) { buffer = (char *) MessageRcvBuffer; portals_ds_get_from_cp(buffer,buffersize,ev.initiator,ev.hdr_data); request = (request_header_t *) buffer; request->tag.user_ptr = (void *) &ev; armci_data_server(buffer); // printf("%d: FINISHED RENDEZ-VOUS!\n",armci_me); break; } } /* ------------------------------------------------------------- *\ process request \* ------------------------------------------------------------- */ armci_data_server(buffer); if(request->operation == QUIT) active = 0; break; case PTL_EVENT_UNLINK: // printf("captured an unlink event!!\n"); // portals_print_event_details(&ev); /* if((long) ev.md.user_ptr != request_buffer_cur_block) { printf("sanity check failed: user_ptr=%ld; cur_block=%ld\n",(long) ev.md.user_ptr, request_buffer_cur_block); armci_die("hummm ... unlink issue?",911); } */ portals_ds_requeue_md((long) ev.md.user_ptr); break; default: printf("unexpected event type %d in recvany\n"); Fatal_error(911); break; } } while(active); // flush out event q; the only thing that should remain is possibly 1 unlink event; while( (rc=PtlEQGet(request_eqh, &ev)) != PTL_EQ_EMPTY) { if(rc == PTL_OK) { if(ev.type != PTL_EVENT_UNLINK) { printf("%s: flushing request_eqh: event type=%d\n",Portals_ID(),ev.type); } else { portals_ds_requeue_md((long) ev.md.user_ptr); } } else if(rc == PTL_EQ_DROPPED) { printf("%s: eq dropped\n",Portals_ID()); } else { printf("%s: some error in PtlEQGet; err=%d\n",Portals_ID(),rc); Fatal_error(rc); } } return PTL_OK; } int portals_ds_finalize() { int i,rc; // unlink and request buffers for(i=0; itype, ev->offset, ev->mlength, ev->hdr_data, (long) ev->md.user_ptr); fflush(stdout); } int portals_ds_requeue_md(int i) { int rc; ptl_handle_me_t meh; ptl_handle_md_t mdh; ptl_process_id_t match_id; ptl_match_bits_t match_bits = MATCH_ALL_MBITS; ptl_match_bits_t ignore_bits = MATCH_ALL_IBITS; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = portals_me_insert(matchall_meh,match_id,match_bits,ignore_bits,&meh); if(rc != PTL_OK) { printf("me insert failed in ds requeue md; err %d\n",rc); Fatal_error(rc); } rc = portals_md_attach(meh,request_buffer_md[i],PTL_UNLINK,&mdh); if(rc != PTL_OK) { printf("md attach failed in ds requeue md; err %d\n",rc); Fatal_error(rc); } request_buffer_meh[i] = meh; request_buffer_cur_block++; if(request_buffer_cur_block == PORTALS_NREQUEST_BUFFERS) request_buffer_cur_block=0; return PTL_OK; } int portals_create_matchall_me(ptl_handle_me_t* me_handle) { int rc; ptl_process_id_t match_id; ptl_match_bits_t match_bits = MATCH_ALL_MBITS; ptl_match_bits_t ignore_bits = MATCH_ALL_IBITS; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = portals_me_attach(ds_nih,match_id,match_bits,ignore_bits,&matchall_meh); if (rc != PTL_OK) { printf("PtlMEAttachAny err %d in portals_create_melist\n",rc); return rc; } return rc; } void portals_ds_send_ack(ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE static int ack = 0; desc.buffer = &ack; desc.length = sizeof(int); # else desc.buffer = NULL; desc.length = 0; # endif desc.id = id; desc.mbits = mbits | DS_RESPONSE_ACK; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); } void portals_ds_send_put(void *buffer, ptl_size_t length, ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; desc.buffer = buffer; desc.length = length; desc.id = id; desc.mbits = mbits | DS_RESPONSE_PUT; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); } void portals_ds_get_from_cp(void *buffer, ptl_size_t length, ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; desc.buffer = buffer; desc.length = length; desc.id = id; desc.mbits = mbits | DS_RESPONSE_GET; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_get(&desc); portals_wait(&desc); } #ifdef DDI static void ds_handler(DDI_Patch *request, ptl_process_id_t from) { int i,j,nr,nc; long array[10],*a; size_t size; char *data_ptr; portals_desc_t desc; ptl_event_t *ev = (ptl_event_t *) request->user_ptr; switch(request->oper) { case DDI_GET: // printf("%s received DDI_GET request of size %d\n",Portals_ID(),request->size); nr = request->ihi - request->ilo + 1; nc = request->jhi - request->jlo + 1; if(nr < 0 || nc < 0 || nr > 10 || nc > 1) { printf("test get dimension problem\n"); abort(); } if(nr*sizeof(long) != request->size) { printf("test get request size does not match\n"); abort(); } for(i=0,j=317; iinitiator; desc.mbits = ev->hdr_data | DS_RESPONSE_PUT; desc.hdr = ev->hdr_data; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); break; case DDI_PUT: nr = request->ihi - request->ilo + 1; nc = request->jhi - request->jlo + 1; data_ptr = NULL; if(ev->mlength > sizeof(DDI_Patch)) { printf("recv'ed eager put - size %d\n",ev->mlength-sizeof(DDI_Patch)); data_ptr = (char *) request; data_ptr += sizeof(DDI_Patch); } if(request->size != ev->mlength-sizeof(DDI_Patch)) { printf("eager msg buffer length does not match request size %d\n",request->size); abort(); } a = (long *) data_ptr; for(i=0; iinitiator,ev->hdr_data); break; case DDI_QUIT: // printf("%s received DDI_QUIT request\n",Portals_ID()); portals_ds_send_ack(ev->initiator,ev->hdr_data); /* desc.buffer = NULL; desc.length = 0; desc.id = ev->initiator; desc.mbits = ev->hdr_data | DS_RESPONSE_ACK; desc.hdr = ev->hdr_data; desc.state = 0; portals_put(&desc); portals_wait(&desc); */ break; case DDI_MEMORY: DDI_Memory_server(request->size); portals_ds_send_ack(ev->initiator,ev->hdr_data); break; default: printf("%s unknown operation in request=%d\n",Portals_ID(),request->oper); abort(); break; } return; } #endif ga-5-4/armci/src-portals/clusterinfo.c0000644000175000017500000003424212662210425016102 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: clusterinfo.c,v 1.36.2.3 2007-06-13 00:46:13 vinod Exp $ */ /****************************************************************************** * file: cluster.c * purpose: Determine cluster info i.e., number of machines and processes * running on each of them. * *******************************************************************************/ #include #include #include #ifdef unix #include #endif #include "message.h" #include "armcip.h" #ifdef WIN32 /* this is where gethostbyname is declared */ # include #endif /* NO_SHMEM enables to simulate cluster environment on a single workstation. * Must define NO_SHMMAX_SEARCH in shmem.c to prevent depleting shared memory * due to a gready shmem request by the master process on cluster node 0. */ #if defined(DECOSF) && defined(QUADRICS) # if !defined(REGION_ALLOC) # define NO_SHMEM extern int armci_enable_alpha_hack(); # endif #else # define armci_enable_alpha_hack() 1 #endif #define DEBUG 0 #define MAX_HOSTNAME 80 #define CHECK_NODE_NAMES /* print info on how many cluster nodes detected */ #ifdef CLUSTER # define PRINT_CLUSTER_INFO 1 #else # define PRINT_CLUSTER_INFO 0 #endif #if defined(GM) static char *network_protocol="Myrinet GM"; #elif defined(VIA) static char *network_protocol="VIA"; #elif defined(MELLANOX) static char *network_protocol="Mellanox Verbs API"; #elif defined(OPENIB) static char *network_protocol="OpenIB Verbs API"; #elif defined(DOELAN4) static char *network_protocol="Quadrics ELAN-4"; #elif defined(QUADRICS) static char *network_protocol="Quadrics ELAN-3"; #elif defined(PM) static char *network_protocol="Score PM"; #elif defined(PORTALS) static char *network_protocol="PORTALS"; #elif defined(MPI_SPAWN) static char *network_protocol="MPI-SPAWN"; #else static char *network_protocol="TCP/IP Sockets"; #endif /*** stores cluster configuration ***/ armci_clus_t *armci_clus_info; #ifdef HITACHI #include # define GETHOSTNAME sr_gethostname ndes_t _armci_group; static int sr_gethostname(char *name, int len) { int no; pid_t ppid; if(hmpp_nself (&_armci_group,&no,&ppid,0,NULL) <0) return -1; if(len<6)armci_die("len too small",len); if(no>1024)armci_die("expected node id <1024",no); sprintf(name,"n%d",no); return 0; } #elif defined(SGIALTIX) # define GETHOSTNAME altix_gethostname static int altix_gethostname(char *name, int len) { sprintf(name,"altix"); return 0; } #elif defined(CRAY_XT) && !defined(PORTALS) #define GETHOSTNAME cnos_gethostname static int cnos_gethostname(char *name, int len) { sprintf(name,"%d",cnos_get_rank()); } #else # define GETHOSTNAME gethostname #endif static char* merge_names(char *name) { int jump = 1, rem, to, from; int lenmes, lenbuf, curlen, totbuflen= armci_nproc*HOSTNAME_LEN; int len = strlen(name); char *work = malloc(totbuflen); if(!work)armci_die("armci: merge_names: malloc failed: ",totbuflen); strcpy(work, name); curlen = len+1; /* prefix tree merges names in the order of process numbering in log(P)time * result = name_1//name_2//...//name_P-1 */ do { jump *= 2; rem = armci_me%jump; if(rem){ to = armci_me - rem; armci_msg_snd(ARMCI_TAG, work, curlen, to); break; }else{ from = armci_me + jump/2; if(from < armci_nproc){ lenbuf = totbuflen - curlen; armci_msg_rcv(ARMCI_TAG, work+curlen, lenbuf, &lenmes, from); curlen += lenmes; } } }while (jump < armci_nproc); return(work); } static void process_hostlist(char *names) { #ifdef CLUSTER int i, cluster=0; char *s,*master; int len, root=0; /******** inspect list of machine names to determine locality ********/ if (armci_me==0){ /* first find out how many cluster nodes we got */ armci_nclus =1; s=master=names; for(i=1; i < armci_nproc; i++){ s += strlen(s)+1; if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_nclus++; /*fprintf(stderr,"new name %s len =%d\n",master, strlen(master));*/ } } /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); /* fill the data structure -- go through the list again */ s=names; master="*-"; /* impossible hostname */ cluster =0; for(i=0; i < armci_nproc; i++){ if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_clus_info[cluster].nslave=1; armci_clus_info[cluster].master=i; strcpy(armci_clus_info[cluster].hostname, master); #ifdef CHECK_NODE_NAMES /* need consecutive task id allocated on the same node * the current test only compares hostnames against first cluster */ if(cluster) if(!strcmp(master,armci_clus_info[0].hostname)){ /* we have seen that hostname before */ fprintf(stderr, "\nIt appears that tasks allocated on the same"); fprintf(stderr, " host machine do not have\n"); fprintf(stderr, "consecutive message-passing IDs/numbers. "); fprintf(stderr,"This is not acceptable \nto the ARMCI library "); fprintf(stderr,"as it prevents SMP optimizations and would\n"); fprintf(stderr,"lead to poor resource utilization.\n\n"); fprintf(stderr,"Please contact your System Administrator "); fprintf(stderr,"or, if you can, modify the "); # if defined(MSG_COMMS_MPI) fprintf(stderr,"MPI"); # elif defined(TCGMSG) fprintf(stderr,"TCGMSG"); # elif defined(PVM) fprintf(stderr,"PVM"); # endif fprintf(stderr,"\nmessage-passing job startup configuration.\n\n"); #ifdef HITACHI fprintf(stderr,"On Hitachi it can be done by setting environment variable MPIR_RANK_NO_ROUND, for example\n setenv MPIR_RANK_NO_ROUND yes\n\n"); #endif sleep(1); armci_die("Cannot run: improper task to host mapping!",0); } #endif cluster++; }else{ /* the process is still on the same host */ armci_clus_info[cluster-1].nslave++; } s += strlen(s)+1; } if(armci_nclus != cluster) armci_die("inconsistency processing clusterinfo",armci_nclus); } /******** process 0 got all data ********/ /* now broadcast locality info struct to all processes * two steps are needed because of the unknown length of hostname list */ len = sizeof(int); armci_msg_brdcst(&armci_nclus, len, root); if(armci_me){ /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*armci_nclus; armci_msg_brdcst(armci_clus_info, len, root); /******** all processes 0 got all data ********/ /* now determine current cluster node id by comparing me to master */ armci_clus_me = armci_nclus-1; for(i =0; i< armci_nclus-1; i++) if(armci_me < armci_clus_info[i+1].master){ armci_clus_me=i; break; } #else armci_clus_me=0; armci_nclus=1; armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); strcpy(armci_clus_info[0].hostname, names); armci_clus_info[0].master=0; armci_clus_info[0].nslave=armci_nproc; #endif armci_clus_first = armci_clus_info[armci_clus_me].master; armci_clus_last = armci_clus_first +armci_clus_info[armci_clus_me].nslave-1; } /*\ Substring Replacement: replace needle with nail in a haystack \*/ static char *substr_replace(char *haystack, char *needle, char *nail) { char *tmp, *pos, *first; size_t len=strlen(needle), nlen=strlen(nail),bytes; size_t left; pos = strstr(haystack,needle); if (pos ==NULL) return NULL; first= tmp = calloc(strlen(haystack)+nlen-len+1+1,1); if(first==NULL) return(NULL); bytes = pos - haystack; while(bytes){ *tmp = *haystack; tmp++; haystack++; bytes--;} while(nlen) { *tmp = *nail; tmp++; nail++; nlen--;} haystack += len; left = strlen(haystack); while(left>0){*tmp = *haystack; tmp++; haystack++; left --;} *tmp='\0'; return(first); } /*\ ARMCI_HOSTNAME_REPLACE contains "needle/nail" string to derive new hostname \*/ static char *new_hostname(char *host) { char *tmp, *needle, *nail; if((tmp =getenv("ARMCI_HOSTNAME_REPLACE"))){ needle = strdup(tmp); if(needle== NULL) return NULL; nail = strchr(needle,'/'); if(nail == NULL) return NULL; *nail = '\0'; nail++; if(nail == (needle+1)){ char* tmp1 = calloc(strlen(host)+strlen(nail)+1,1); if(tmp1 == NULL) return NULL; strcpy(tmp1,host); strcat(tmp1,nail); return tmp1; } return substr_replace(host,needle,nail); } else return NULL; } static void print_clus_info() { int i; if(PRINT_CLUSTER_INFO && armci_nclus >1 && armci_me ==0){ #if defined(DATA_SERVER) || defined(SERVER_THREAD) printf("ARMCI configured for %d cluster nodes. Network protocol is '%s'.\n", armci_nclus, network_protocol); #else printf("ARMCI configured for %d cluster nodes\n", armci_nclus); #endif fflush(stdout); } if(armci_me==0 && DEBUG) for(i=0;i= MAX_HOSTNAME) armci_die("armci: hostname too long",strlen(tmp)); strcpy(name,tmp); printf("%d using %s hostname\n",armci_me, name); fflush(stdout); } len = strlen(name); /*a simple way to run as many servers as compute processes*/ enval = getenv("ARMCI_NSERV_EQ_NPROC"); if(enval != NULL){ sprintf(name+len,"n%d",getpid()); len = strlen(name); printf("\n%s\n",name); } #ifdef HOSTNAME_TRUNCATE { /* in some cases (e.g.,SP) when name is used to determine * cluster structure but not to establish communication * we can truncate hostnames to save memory */ int i; limit = HOSTNAME_LEN-1; for(i=0; i",i+1); } if(len>limit)name[limit]='\0'; len =limit; } #else if(len >= HOSTNAME_LEN-1) armci_die("armci: gethostname overrun name string length",len); #endif #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { name[len]='0'+armci_me; name[len+1]='\0'; len++; } #endif if(DEBUG) fprintf(stderr,"%d: %s len=%d\n",armci_me, name,(int)strlen(name)); #ifdef CLUSTER merged = merge_names(name); /* create hostname list */ process_hostlist(merged); /* compute cluster info */ free(merged); #else process_hostlist(name); /* compute cluster info */ #endif #ifndef NO_SHMEM armci_set_shmem_limit_per_node(armci_clus_info[0].nslave); #endif armci_master = armci_clus_info[armci_clus_me].master; #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { int i; for(i=0;i= armci_nproc)armci_die("armci_clus_id: out of range",p); if(p < armci_clus_first){ from = 0; to = armci_clus_me;} else {from = armci_clus_me; to = armci_nclus;} found = to-1; for(c = from; c< to-1; c++) if(p < armci_clus_info[c+1].master){ found=c; break; } return (found); } int armci_smp_master(int i) { return(armci_clus_info[i].master); } /*\ return number of processes in the domain represented by id; id<0 means my node \*/ int armci_domain_nprocs(armci_domain_t domain, int id) { if(id>= armci_nclus) armci_die2("armci domain error",id,armci_nclus); if(id<0) id = armci_clus_me; return armci_clus_info[id].nslave; } /*\ return number of nodes in diven domain \*/ int armci_domain_count(armci_domain_t domain) { return armci_nclus; } /*\ return domain ID of the specified process \*/ int armci_domain_id(armci_domain_t domain, int glob_proc_id) { int id = glob_proc_id; if(id<0 || id>= armci_nproc) armci_die2("armci domain error",id,armci_nproc); return armci_clus_id(glob_proc_id); } /*\ return global ID of a process loc_proc_id in domain identified by id * armci_domain_nproc(id)< loc_proc_id >=0 \*/ int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id) { if(id<0 || id>= armci_nclus) armci_die2("armci domain error",id,armci_nclus); if(loc_proc_id<0 || loc_proc_id>= armci_clus_info[id].nslave) armci_die2("armci domain proc error",loc_proc_id,armci_clus_info[id].nslave); return (armci_clus_info[id].master + loc_proc_id); } /*\ return ID of domain that the calling process belongs to \*/ int armci_domain_my_id(armci_domain_t domain) { return(armci_clus_me); } int armci_domain_same_id (armci_domain_t domain, int proc) { int rc = SAMECLUSNODE(proc); return(rc); } ga-5-4/armci/src-portals/armci.c0000644000175000017500000005701512662210425014643 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: armci.c,v 1.114.2.17 2007-08-30 22:58:18 manoj Exp $ */ /* DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #define EXTERN /*#define PRINT_BT*/ #include #include #include #if defined(CRAY) && !defined(__crayx1) # include # include # include #endif #ifdef LAPI # include "lapidefs.h" #endif #include #include "armcip.h" #include "copy.h" #include "memlock.h" #include "parmci.h" #include "armci_shmem.h" #include "signaltrap.h" #ifdef ARMCIX #include "x/armcix.h" #endif #ifdef BGML #include "bgml.h" #include #include "bgmldefs.h" extern void armci_msg_barrier(void); #endif #ifdef CRAY_SHMEM # ifdef CRAY_XT # include # else # include # endif #endif #include /* global variables */ int armci_me, armci_Sme, armci_nproc; int armci_clus_me, armci_nclus, armci_master; int armci_clus_first, armci_clus_last; int *_armci_argc=NULL; char ***_armci_argv=NULL; int _armci_initialized_args=0; int _armci_initialized=0; int _armci_terminating =0; thread_id_t armci_usr_tid; armci_ireq_t armci_inb_handle[ARMCI_MAX_IMPLICIT];/*implicit non-blocking handle*/ #ifndef HITACHI double armci_internal_buffer[BUFSIZE_DBL]; #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) || defined(CATAMOUNT) || defined(BGML) # include "locks.h" lockset_t lockid; #endif int* armci_prot_switch_fence=NULL; int armci_prot_switch_preproc = -1; int armci_prot_switch_preop = -1; #ifdef BGML /* void armci_allocate_locks(); */ void armci_init_memlock(); #endif #ifdef LIBELAN_ATOMICS ELAN_ATOMIC *a; #warning "Enabling new atomics" #endif typedef struct{ int sent; int received; int waited; }armci_notify_t; armci_notify_t **_armci_notify_arr; void ARMCI_Cleanup() { #if defined(DATA_SERVER) if(armci_nclus >1){ armci_wait_for_server(); } #endif #if (defined(SYSV) || defined(WIN32) || defined(MMAP))&& !defined(HITACHI) Delete_All_Regions(); if(armci_nproc>1) #if !defined(LAPI) DeleteLocks(lockid); #endif #ifndef WIN32 ARMCI_RestoreSignals(); #endif #endif armci_transport_cleanup(); } int armci_getbufsize() { return(BUFSIZE); } void armci_notify_init() { int rc,bytes=sizeof(armci_notify_t)*armci_nproc; #ifdef DOELAN4 armci_elan_notify_init(); return; #endif _armci_notify_arr= (armci_notify_t**)malloc(armci_nproc*sizeof(armci_notify_t*)); if(!_armci_notify_arr)armci_die("armci_notify_ini:malloc failed",armci_nproc); if((rc=PARMCI_Malloc((void **)_armci_notify_arr, bytes))) armci_die(" armci_notify_init: armci_malloc failed",bytes); bzero(_armci_notify_arr[armci_me], bytes); } static void armci_perror_msg() { char perr_str[80]; if(!errno)return; sprintf(perr_str,"Last System Error Message from Task %d:",armci_me); perror(perr_str); } static void armci_abort(int code) { abort(); #if !defined(BGML) armci_perror_msg(); #endif ARMCI_Cleanup(); /* data server process cannot use message-passing library to abort * it simply exits, parent will get SIGCHLD and abort the program */ #if defined(DATA_SERVER) if(armci_me<0)_exit(1); else #endif armci_msg_abort(code); } void armci_die(char *msg, int code) { void *bt[100]; if(_armci_terminating)return; else _armci_terminating=1; if(SERVER_CONTEXT){ fprintf(stdout,"%d(s):%s: %d\n",armci_me, msg, code); fflush(stdout); fprintf(stderr,"%d(s):%s: %d\n",armci_me, msg, code); }else{ fprintf(stdout,"%d:%s: %d\n",armci_me, msg, code); fflush(stdout); fprintf(stderr,"%d:%s: %d\n",armci_me, msg, code); } #ifdef PRINT_BT backtrace_symbols_fd(bt, backtrace(bt, 100), 2); #endif armci_abort(code); } void armci_die2(char *msg, int code1, int code2) { void *bt[100]; if(_armci_terminating)return; else _armci_terminating=1; if(SERVER_CONTEXT){ fprintf(stdout,"%d(s):%s: (%d,%d)\n",armci_me,msg,code1,code2); fflush(stdout); fprintf(stderr,"%d(s):%s: (%d,%d)\n",armci_me,msg,code1,code2); }else{ fprintf(stdout,"%d:%s: (%d,%d)\n",armci_me,msg,code1,code2); fflush(stdout); fprintf(stderr,"%d:%s: (%d,%d)\n",armci_me,msg,code1,code2); } #ifdef PRINT_BT backtrace_symbols_fd(bt, backtrace(bt, 100), 2); #endif armci_abort(code1); } void ARMCI_Error(char *msg, int code) { armci_die(msg,code); } void armci_allocate_locks() { /* note that if ELAN_ACC is defined the scope of locks is limited to SMP */ #if !defined(CRAY_SHMEM) && (defined(HITACHI) || defined(CATAMOUNT) || \ (defined(QUADRICS) && defined(_ELAN_LOCK_H) && !defined(ELAN_ACC))) armcill_allocate_locks(NUM_LOCKS); #elif (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) if(armci_nproc == 1)return; # if defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) CreateInitLocks(NUM_LOCKS, &lockid); # else if(armci_master==armci_me)CreateInitLocks(NUM_LOCKS, &lockid); armci_msg_clus_brdcst(&lockid, sizeof(lockid)); if(armci_master != armci_me)InitLocks(NUM_LOCKS, lockid); # endif #endif } void ARMCI_Set_shm_limit(unsigned long shmemlimit) { #if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) #define EXTRASHM 1024 /* extra shmem used internally in ARMCI */ unsigned long limit; limit = shmemlimit + EXTRASHM; armci_set_shmem_limit_per_core(limit); #endif } /*\ allocate and initialize memory locking data structure \*/ void armci_init_memlock() { int bytes = MAX_SLOTS*sizeof(memlock_t); int rc, msize_per_proc=bytes; #ifdef MEMLOCK_SHMEM_FLAG /* last proc on node allocates memlock flag in shmem */ if(armci_clus_last == armci_me) bytes += sizeof(int); #endif memlock_table_array = malloc(armci_nproc*sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); rc = PARMCI_Malloc(memlock_table_array, bytes); if(rc) armci_die("failed to allocate ARMCI memlock array",rc); armci_msg_barrier(); bzero(memlock_table_array[armci_me],bytes); #ifdef BGML bgml_init_locks ((void *) memlock_table_array[armci_me]); #elif ARMCIX ARMCIX_init_memlock ((memlock_t *) memlock_table_array[armci_me]); #endif #ifdef MEMLOCK_SHMEM_FLAG /* armci_use_memlock_table is a pointer to local memory variable=1 * we overwrite the pointer with address of shared memory variable * armci_use_memlock_table and initialize it >0 */ armci_use_memlock_table = (int*) (msize_per_proc + (char*) memlock_table_array[armci_clus_last]); /* printf("%d: last=%d bytes=%d ptr =(%d, %d)\n", armci_me,armci_clus_last,bytes,armci_use_memlock_table, memlock_table_array[armci_clus_last]); fflush(stdout); */ if(armci_clus_last == armci_me) *armci_use_memlock_table =1+armci_me; #endif *armci_use_memlock_table = 0; armci_msg_barrier(); } #if defined(SYSV) || defined(WIN32) static void armci_check_shmmax() { long mylimit, limit; mylimit = limit = (long) armci_max_region(); armci_msg_bcast_scope(SCOPE_MASTERS, &limit, sizeof(long), 0); if(mylimit != limit){ printf("%d:Shared mem limit in ARMCI is %ld bytes on node %s vs %ld on %s\n", armci_me,mylimit<<10,armci_clus_info[armci_clus_me].hostname, limit<<10, armci_clus_info[0].hostname); fflush(stdout); sleep(1); armci_die("All nodes must have the same SHMMAX limit if NO_SHM is not defined",0); } } #endif extern void armci_region_shm_malloc(void *ptr_arr[], size_t bytes); void ARMCI_NetInit() { /*armci_portals_net_init();*/ } int PARMCI_Init_args(int *argc, char ***argv) { armci_msg_init(argc,argv); _armci_argc = argc; _armci_argv = argv; _armci_initialized_args=1; return PARMCI_Init(); } extern void *sbrk(intptr_t); int PARMCI_Init() { caddr_t atbeginbrval = (caddr_t)sbrk(0); if(_armci_initialized>0) return 0; #ifdef NEW_MALLOC mallopt(M_MMAP_MAX, 0); mallopt(M_TRIM_THRESHOLD, -1); #endif armci_msg_init(NULL, NULL); armci_nproc = armci_msg_nproc(); armci_me = armci_msg_me(); armci_usr_tid = THREAD_ID_SELF(); /*remember the main user thread id */ armci_init_clusinfo(); armci_prot_switch_fence = malloc(sizeof(int*)*armci_nproc); assert(armci_prot_switch_fence !=NULL); armci_init_portals(atbeginbrval); #ifdef MSG_COMMS_MPI armci_group_init(); #endif #ifndef NEW_MALLOC armci_krmalloc_init_localmem(); #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) if(ARMCI_Uses_shm() ) { armci_shmem_init(); } #endif armci_allocate_locks(); armci_init_fence(); #if ARMCI_ENABLE_GPC_CALLS gpc_init_signals(); #endif armci_msg_barrier(); armci_init_memlock(); /* allocate data struct for locking memory areas */ armci_msg_barrier(); //if(armci_me == 0) code_summary(); armci_msg_barrier(); armci_msg_gop_init(); _armci_initialized++; return 0; } void PARMCI_Finalize() { if(!_armci_initialized)return; _armci_initialized--; if(_armci_initialized)return; _armci_terminating =1; armci_msg_barrier(); if(armci_me==armci_master) ARMCI_ParentRestoreSignals(); #ifdef PORTALS request_header_t msg; portals_ds_req_t req; ptl_process_id_t dsid = portals_id_map[armci_me]; msg.operation = QUIT; if(armci_me == armci_master) { portalsBlockingRemoteOperationToNode(&msg,sizeof(request_header_t),armci_clus_me); } armci_msg_barrier(); portals_cp_finalize(); #else ARMCI_Cleanup(); armci_msg_barrier(); armci_group_finalize(); free(armci_prot_switch_fence); #endif #ifdef MSG_COMMS_MPI MPI_Comm_free(&ARMCI_COMM_WORLD); #endif } /* Indicates whether ARMCI_Init or ARMCI_Init_args has been called. */ int PARMCI_Initialized() { return (_armci_initialized > 0) ? 1 : 0; } #if !(defined(SYSV) || defined(WIN32)) void ARMCI_Set_shmem_limit(unsigned long shmemlimit) { /* not applicable here * aborting would make user's life harder */ } #endif void ARMCI_Copy(void *src, void *dst, int n) { armci_copy(src,dst,n); } extern void cpu_yield(); void armci_util_wait_int(volatile int *p, int val, int maxspin) { int count=0; extern void cpu_yield(); while(*p != val) if((++count)proc); if(direct) { return(success); } if(nb_handle) { if(nb_handle->agg_flag) { armci_agg_complete(nb_handle, UNSET); return (success); } if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE){ ARMCI_NB_WAIT(nb_handle->cmpl_info); __asm__ __volatile__ ("mfence" ::: "memory"); __asm__ __volatile__ ("sfence" ::: "memory"); return(success); } # ifdef COMPLETE_HANDLE COMPLETE_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); # endif } __asm__ __volatile__ ("mfence" ::: "memory"); __asm__ __volatile__ ("sfence" ::: "memory"); return(success); } /** * implicit handle */ static char hdl_flag[ARMCI_MAX_IMPLICIT]; static int impcount=0; armci_ihdl_t armci_set_implicit_handle (int op, int proc) { int i=impcount%ARMCI_MAX_IMPLICIT; if(hdl_flag[i]=='1') PARMCI_Wait((armci_hdl_t*)&armci_inb_handle[i]); #ifdef BGML armci_inb_handle[i].count=0; #endif armci_inb_handle[i].tag = GET_NEXT_NBTAG(); armci_inb_handle[i].op = op; armci_inb_handle[i].proc = proc; armci_inb_handle[i].bufid = NB_NONE; armci_inb_handle[i].agg_flag = 0; hdl_flag[i]='1'; ++impcount; return &armci_inb_handle[i]; } /* wait for all non-blocking operations to finish */ int PARMCI_WaitAll () { #ifdef BGML BGML_WaitAll(); #elif ARMCIX ARMCIX_WaitAll (); #else int i; if(impcount) { for(i=0; iagg_flag = 1; ((armci_ihdl_t)(nb_handle))->proc = -1; } void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle) { ((armci_ihdl_t)(nb_handle))->agg_flag = 0; ((armci_ihdl_t)(nb_handle))->proc = -1; } int parmci_notify(int proc) { #ifdef DOELAN4 if(proc==armci_me){ return 0; } #endif #if defined(GM) || (defined(DOELAN4) && defined(ELAN_ACC)) { extern int armci_inotify_proc(int); return(armci_inotify_proc(proc)); } #else armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->sent++; # ifdef MEM_FENCE if(SAMECLUSNODE(proc)) MEM_FENCE; # endif PARMCI_Put(&pnotify->sent,&(_armci_notify_arr[proc]+armci_me)->received, sizeof(pnotify->sent),proc); return(pnotify->sent); #endif } /*\ blocks until received count becomes >= waited count * return received count and store waited count in *pval \*/ int parmci_notify_wait(int proc,int *pval) { int retval; #ifdef DOELAN4 if(proc==armci_me){ #ifdef MEM_FENCE MEM_FENCE; #endif return 0; } #endif #if defined(GM) || (defined(DOELAN4) && defined(ELAN_ACC)) { extern int armci_inotify_wait(int,int*); retval=armci_inotify_wait(proc,pval); } #else { long loop=0; armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->waited++; while( pnotify->waited > pnotify->received) { if(++loop == 1000) { loop=0;cpu_yield(); } armci_util_spin(loop, pnotify); } *pval = pnotify->waited; retval=pnotify->received; } #endif return retval; } long armci_util_long_getval(long* p) { return *p; } int armci_util_int_getval(int* p) { return *p; } int PARMCI_Test(armci_hdl_t *usr_hdl) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int success=0; #ifdef BGML success=(int)nb_handle->count; #else int direct=SAMECLUSNODE(nb_handle->proc); if(direct)return(success); if(nb_handle) { if(nb_handle->agg_flag) { armci_die("test for aggregate handle not yet implemented\n",0); } } if(nb_handle){ # ifdef ARMCI_NB_TEST if(nb_handle->tag==0){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } # ifdef LAPI if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } # endif # endif # ifdef TEST_HANDLE TEST_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); # endif } #endif return(success); } #ifdef DO_CKPT void ARMCI_Ckpt_create_ds(armci_ckpt_ds_t *ckptds, int count) { armci_create_ckptds(ckptds,count); } int ARMCI_Ckpt_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds) { int rid; rid = armci_icheckpoint_init(filename,grp,savestack,saveheap,ckptds); return(rid); } int ARMCI_Ckpt(int rid) { return(armci_icheckpoint(rid)); } void ARMCI_Ckpt_Recover(int rid, int iamreplacement) { armci_irecover(rid, iamreplacement); } void ARMCI_Ckpt_finalize(int rid) { armci_icheckpoint_finalize(rid); } #endif #if ARMCI_ENABLE_GPC_CALLS int armci_gpc(int hndl, int proc, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, armci_hdl_t* nbh) { armci_ihdl_t nb_handle = (armci_ihdl_t)nbh; armci_giov_t darr[2]; /* = {{&rhdr, &rhdr, 1, rhlen}, {&rdata, &rdata, 1, rdlen}};*/ gpc_send_t send; char *ptr; /* initialize giov */ darr[0].src_ptr_array = &rhdr; darr[0].dst_ptr_array = &rhdr; darr[0].ptr_array_len = 1; darr[0].bytes = rhlen; darr[1].src_ptr_array = &rdata; darr[1].dst_ptr_array = &rdata; darr[1].ptr_array_len = 1; darr[1].bytes = rdlen; /* if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ /* if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ if(hlen>0 && hdr==NULL) return FAIL3; if(rhlen>0 && rhdr==NULL) return FAIL3; if(dlen>0 && data==NULL) return FAIL3; if(rdlen>0 && rdata==NULL) return FAIL3; if(proc<0 || proc >= armci_nproc) return FAIL4; send.hndl = hndl; send.hlen = hlen; send.dlen = dlen; send.hdr = hdr; send.data = data; if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else { ORDER(GET,proc); /*ensure ordering */ nb_handle = NULL; } #if defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS) if(armci_rem_gpc(GET, darr, 2, &send, proc, 1, nb_handle)) #endif return FAIL2; return 0; } int armci_sameclusnode(int proc) { return SAMECLUSNODE(proc); } #endif void _armci_init_handle(armci_hdl_t *hdl) { ((double *)((hdl)->data))[0]=0; ((double *)((hdl)->data))[1]=0; } static inline int val_to_char(int v) { if (v >= 0 && v < 10) return '0' + v; else if (v >= 10 && v < 16) return ('a' - 10) + v; else return -1; } static const char *nexttoken(const char *q, int sep) { if (q) q = strchr(q, sep); if (q) q++; return q; } int cstr_to_cpuset(cpu_set_t * mask, const char *str) { const char *p, *q; q = str; CPU_ZERO(mask); while (p = q, q = nexttoken(q, ','), p) { unsigned int a; /* beginning of range */ unsigned int b; /* end of range */ unsigned int s; /* stride */ const char *c1, *c2; if (sscanf(p, "%u", &a) < 1) return 1; b = a; s = 1; c1 = nexttoken(p, '-'); c2 = nexttoken(p, ','); if (c1 != NULL && (c2 == NULL || c1 < c2)) { if (sscanf(c1, "%u", &b) < 1) return 1; c1 = nexttoken(c1, ':'); if (c1 != NULL && (c2 == NULL || c1 < c2)) if (sscanf(c1, "%u", &s) < 1) { return 1; } } if (!(a <= b)) return 1; while (a <= b) { CPU_SET(a, mask); a += s; } } return 0; } char *cpuset_to_cstr(cpu_set_t * mask, char *str) { int i; char *ptr = str; int entry_made = 0; for (i = 0; i < CPU_SETSIZE; i++) { if (CPU_ISSET(i, mask)) { int j; int run = 0; entry_made = 1; for (j = i + 1; j < CPU_SETSIZE; j++) { if (CPU_ISSET(j, mask)) run++; else break; } if (!run) sprintf(ptr, "%d,", i); else if (run == 1) { sprintf(ptr, "%d,%d,", i, i + 1); i++; } else { sprintf(ptr, "%d-%d,", i, i + run); i += run; } while (*ptr != 0) ptr++; } } ptr -= entry_made; *ptr = 0; return str; } char *cpuset_to_str(cpu_set_t * mask, char *str) { int base; char *ptr = str; char *ret = 0; for (base = CPU_SETSIZE - 4; base >= 0; base -= 4) { char val = 0; if (CPU_ISSET(base, mask)) val |= 1; if (CPU_ISSET(base + 1, mask)) val |= 2; if (CPU_ISSET(base + 2, mask)) val |= 4; if (CPU_ISSET(base + 3, mask)) val |= 8; if (!ret && val) ret = ptr; *ptr++ = val_to_char(val); } *ptr = 0; return ret ? ret : ptr - 1; } long armci_cksm_copy(char *src, char *dst, size_t bytes) { long sum = 0; size_t count=bytes; while( count > 1 ) { sum += * (unsigned int *) src++; count -= 4; } if( count > 0 ){ printf("\nblistering barnicles"); sum += * (unsigned char *) src; } while (sum>>32) sum = (sum & 0xffffffff) + (sum >> 32); return(~sum); } void code_summary() { printf("\nActive #defines that could affect ARMCI"); printf("\n----------------------------------------"); # ifdef ORNL_USE_DS_FOR_REMOTE_GETS printf("\n#define ORNL_USE_DS_FOR_REMOTE_GETS"); # endif # ifdef PORTALS_USE_RENDEZ_VOUS printf("\n#define PORTALS_USE_RENDEZ_VOUS"); # endif # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE printf("\n#define PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE"); # endif # ifdef PORTALS_AFFINITY printf("\n#define PORTALS_AFFINITY"); # endif /* # ifdef CRAY_USE_MDMD_COPY printf("\n#define CRAY_USE_MDMD_COPY"); # endif */ printf("\n----------------------------------------"); printf("\nInfo @ armci/src/code_options.h"); printf("\n----------------------------------------\n"); # ifdef PORTALS portals_print_summary(); # endif } ga-5-4/armci/src-portals/portals.h0000644000175000017500000001740512662210425015240 0ustar mbamba/* ---------------------------------------------------------------------------------------------- *\ portals.h header \* ---------------------------------------------------------------------------------------------- */ # ifndef _PORTALS_H_ # define _PORTALS_H_ # define PORTALS_INDEX 1 # define ONE_KB 1024 # define ONE_MB 1048576 # define MAX_DS_MSG_SIZE ONE_MB # define PORTALS_MAX_DESCRIPTORS (MAX_BUFS+MAX_SMALL_BUFS) # define PORTALS_MAX_BUFS MAX_BUFS # define PORTALS_MAX_SMALL_BUFS MAX_SMALL_BUFS # define PORTALS_BUF_SIZE MSG_BUFLEN /* defined in requesh.h */ /* define small buf length here - formerly request.h */ # ifdef PORTALS_USE_RENDEZ_VOUS # define PORTALS_SMALL_BUF_SIZE 1024 /* for use with nwchem only -- will not pass armci test.x */ # define PORTALS_MAX_EAGER_MESSAGE_SIZE PORTALS_SMALL_BUF_SIZE # else # define PORTALS_SMALL_BUF_SIZE 1024 # define PORTALS_MAX_EAGER_MESSAGE_SIZE PORTALS_BUF_SIZE # endif # define PORTALS_NREQUEST_BUFFERS 40 # define PORTALS_REQUEST_BUFFER_SIZE_WARNING (128*ONE_MB) # define PORTALS_READ_ACCESS 1 # define PORTALS_WRITE_ACCESS 1000 # define MATCH_ALL_MBITS 0x8000000000000000 /* should be set for all data requests */ # define MATCH_ALL_IBITS ~MATCH_ALL_MBITS /* used to mask out all other bits, but MATCH_ALL */ # define STATE_SEND_START 0x1 # define STATE_SEND_END 0x2 # define STATE_REPLY_START 0x4 # define STATE_REPLY_END 0x8 # define STATE_ACK 0x10 # define STATE_PUT_START 0x20 # define STATE_PUT_END 0x40 # define STATE_GET_START 0x80 # define STATE_GET_END 0x100 # define STATE_UNLINK 0x200 # define DS_RESPONSE_ACK 0x100000000000000 # define DS_RESPONSE_PUT 0x200000000000000 # define DS_RESPONSE_GET 0x400000000000000 # define PORTALS_ALLOW_NBGETS # define PORTALS_USE_ARMCI_CLIENT_BUFFERS # define PORTALS_PUT_USE_ACK_TURNED_OFF # define PORTALS_PUT_USE_START_TURNED_OFF # define PORTALS_GET_USE_START_TURNED_OFF /* ---------------------------------------------------------------------------------------------- *\ portals types \* ---------------------------------------------------------------------------------------------- */ typedef struct portals_desc_s { void* buffer; // used for the md ptl_size_t length; // used for the md ptl_process_id_t id; // on whom the operation is acting on ptl_match_bits_t mbits; // operations destination mbits ptl_hdr_data_t hdr; // used for puts/unique counter value ptl_handle_ni_t nih; // network interface handle ptl_handle_eq_t eqh; // event handler ptl_handle_me_t meh; // me handle (if necessary) ptl_handle_md_t mdh; // md handle (if necessary) int state; // track outstanding events remaining on the descriptor int done; // flag to test whether all work on the descriptor is finished int noperations; // the number of remote operations allowed on buffer // this is only used when preposting/pinning CP memory // for remote operations initiated by the data server } portals_desc_t; typedef struct portals_ds_req_s { portals_desc_t req_desc; portals_desc_t ack_desc; portals_desc_t data_desc; ptl_process_id_t dsid; size_t unique_msg_id; int active; int remote_node; } portals_ds_req_t; /* ---------------------------------------------------------------------------------------------- *\ portals global variables \* ---------------------------------------------------------------------------------------------- */ /*ptl_handle_ni_t cp_nih;*/ /*ptl_handle_ni_t ds_nih;*/ /*ptl_handle_eq_t cp_eqh;*/ /*ptl_handle_eq_t ds_eqh;*/ ptl_process_id_t *portals_id_map; ptl_process_id_t *portals_cloned_id_map; int portals_ds_ready; int portals_cp_finished; size_t portalsMaxEagerMessageSize; /* ---------------------------------------------------------------------------------------------- *\ portals prototypes \* ---------------------------------------------------------------------------------------------- */ int portals_init(ptl_handle_ni_t*); int portals_finalize(ptl_handle_ni_t); int portals_getid(ptl_handle_ni_t,ptl_process_id_t *); int portals_free_eq(ptl_handle_eq_t); int portals_create_eq(ptl_handle_ni_t, ptl_size_t, ptl_handle_eq_t*); int portals_create_matchall_me(ptl_handle_me_t*); int portals_me_attach(ptl_handle_ni_t,ptl_process_id_t,ptl_match_bits_t,ptl_match_bits_t,ptl_handle_me_t*); int portals_me_insert(ptl_handle_me_t,ptl_process_id_t,ptl_match_bits_t,ptl_match_bits_t,ptl_handle_me_t*); int portals_me_unlink(ptl_handle_me_t); int portals_md_attach(ptl_handle_me_t,ptl_md_t,ptl_unlink_t,ptl_handle_md_t*); int portals_md_bind(ptl_handle_ni_t,ptl_md_t,ptl_unlink_t,ptl_handle_md_t*); int portals_eqwait(ptl_handle_eq_t,ptl_event_t*); int portals_put(portals_desc_t*); int portals_get(portals_desc_t*); int portals_wait(portals_desc_t*); void* portalsCloneDataServer(void *(*func)(void*)); void portalsSpinLockOnInt(volatile int*, int, int); void portals_print_event_details(ptl_event_t *ev); void Fatal_error(int); const char *Portals_ID(); void bit_print(const char *,int); void hex_print(const char *,int); void portals_print_summary(); /* ---------------------------------------------------------------------------------------------- *\ portals data server prototypes \* ---------------------------------------------------------------------------------------------- */ void* portals_ds_thread(void* args); int portals_ds_init(void); int portals_ds(void); int portal_send_test_ack(int to,int val); int portals_ds_requeue_md(int); void portals_ds_get_from_cp(void*,ptl_size_t,ptl_process_id_t,ptl_match_bits_t); //void ds_handler(DDI_Patch*,ptl_process_id_t); /* ---------------------------------------------------------------------------------------------- *\ portals compute process prototypes \* ---------------------------------------------------------------------------------------------- */ int portals_cp_init(void); int portals_cp_getid(ptl_process_id_t *id); void portals_req_send(void *buffer, size_t size, portals_ds_req_t *req); void portals_req_nbsend(void *buffer, size_t size, portals_ds_req_t *req); void portals_req_wait(portals_ds_req_t *req); void portals_remote_get(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_put(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_acc(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_rmw(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbget(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbput(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbacc(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portalsRemoteOperation(void*,size_t,ptl_process_id_t,portals_ds_req_t*); void portalsRemoteOperationToRank(void*,size_t,int,portals_ds_req_t*); void portalsRemoteOperationToNode(void*,size_t,int,portals_ds_req_t*); void portalsBlockingRemoteOperationToNode(void*,size_t,int); static inline unsigned int cpuid_ebx(unsigned int op) { unsigned int eax, ebx; __asm__("cpuid" : "=a" (eax), "=b" (ebx) : "0" (op) : "cx", "dx" ); return ebx; } # endif ga-5-4/armci/src-portals/sockets.h0000644000175000017500000000321212662210425015216 0ustar mbamba#ifndef SOCKETS_H_ #define SOCKETS_H_ #include "armci.h" #ifndef WIN32 #define USE_SOCKET_VECTOR_API #endif #if defined(USE_SOCKET_VECTOR_API) # include #endif extern int tcp_sendrcv_bufsize; extern int armci_PollSocket(int sock); extern int armci_WaitSock(int *socklist, int num, int *ready); extern int armci_ReadFromSocket(int sock, void* buffer, int lenbuf); extern int armci_WriteToSocket (int sock, void* buffer, int lenbuf); #if defined(USE_SOCKET_VECTOR_API) extern int armci_RecvStridedFromSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_SendStridedToSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_RecvVectorFromSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_SendVectorToSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_ReadVFromSocket(int sock,struct iovec *iov, int iovlength, int totalsize); extern int armci_WriteVToSocket (int sock,struct iovec *iov, int iovlength, int totalsize); #endif extern void armci_ListenSockAll(int* socklist, int num); extern void armci_AcceptSockAll(int* socklist, int num); extern int armci_CreateSocketAndConnect(char *hostname, int port); extern void armci_ShutdownAll(int socklist[], int num); extern void armci_CreateSocketAndBind(int *sock, int *port); #define PACKET_SIZE tcp_sendrcv_bufsize #define TIMEOUT_ACCEPT 60 #define GET_SEND_BUFFER _armci_buf_get_clear_busy #define FREE_SEND_BUFFER _armci_buf_release #ifndef UIO_MAXIOV #define MAX_IOVEC 8 #else #define MAX_IOVEC (UIO_MAXIOV>100?100:UIO_MAXIOV) #endif #endif ga-5-4/armci/src-portals/armci_shmem.h0000644000175000017500000000115012662210425016026 0ustar mbamba#ifndef _SHMEM_H_ #define _SHMEM_H_ extern void Set_Shmem_Limit(unsigned long shmemlimit); extern void Delete_All_Regions(); extern char* Create_Shared_Region(long idlist[], long size, long *offset); extern char* Attach_Shared_Region(long idlist[], long size, long offset); extern void Free_Shmem_Ptr(long id, long size, char* addr); extern long armci_shmem_reg_size(int i, long id); extern char* armci_shmem_reg_ptr(int i); #define POST_ALLOC_CHECK(temp,size) ; #define MAX_REGIONS 64 #if defined(WIN32) #define SHMIDLEN 3 #else #define SHMIDLEN (MAX_REGIONS + 2) #endif #define IDLOC (SHMIDLEN - 3) #endif ga-5-4/armci/src-portals/shmalloc.h0000644000175000017500000000325712662210425015356 0ustar mbamba#ifndef SHMALLOC_H #define SHMALLOC_H /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *armci_shmalloc(size_t size); /* void shfree(char *pointer) Frees memory allocated by armci_shmalloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-shmalloc'ed pointers */ extern void shfree(); /* void shmalloc_print_stats(); Print to standard output the usage statistics ... a wrapper for shmalloc_stats(); */ extern void shmalloc_print_stats(); /* void shmalloc_stats(size_t *total, long *nchunk, size_t *inuse, size_t *maxuse, long *nfrags, long *nmcalls, long *nfcalls) Returns the statistics about memory usage. total = total amount of memory got from system in bytes nchunk = total no. of chunks of memory got from the system inuse = amount of memory application is using in bytes maxuse = maximum value of inuse to dat nfrags = no. of fragments that memory is split into nmcalls= no. of calls to shmalloc nfcalls= no. of calls to shfree */ extern void shmalloc_stats(); /* void shmalloc_debug(int code) Enable debuging code = 0 ... no debugging code != 0 ... entire heap is verified on every call */ extern void shmalloc_debug(); /* Verify the heap. */ extern void shmalloc_verify(); /* size ... minimum size in bytes that chunks of data should be obtained from the system in. The default is 131072. maxsize ... maximum amount of memory that should be obtained from the system. The default is 12,582,912. */ extern void shmalloc_request(size_t size, size_t maxsize); #endif ga-5-4/armci/src-portals/message.h0000644000175000017500000000645012662210425015176 0ustar mbamba#ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define ARMCI_INT -99 #define ARMCI_LONG -101 #define ARMCI_LONG_LONG -102 #define ARMCI_FLOAT -306 #define ARMCI_DOUBLE -307 #define SCOPE_ALL 333 #define SCOPE_NODE 337 #define SCOPE_MASTERS 339 #define armci_msg_sel(x,n,op,type,contribute)\ armci_msg_sel_scope(SCOPE_ALL,(x),(n),(op),(type),(contribute)) #if 0 #define armci_msg_bcast(buffer, len, root)\ armci_msg_bcast_scope(SCOPE_ALL, (buffer), (len), (root)) #else extern void armci_msg_bcast(void *buffer, int len, int root); #endif extern void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute); extern void armci_msg_bcast_scope(int scope, void* buffer, int len, int root); extern void armci_msg_brdcst(void* buffer, int len, int root); extern void armci_msg_snd(int tag, void* buffer, int len, int to); extern void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from); extern int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen); extern void armci_msg_reduce(void *x, int n, char *op, int type); extern void armci_msg_reduce_scope(int scope, void *x, int n, char *op, int type); extern void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type); extern void armci_msg_igop(int *x, int n, char* op); extern void armci_msg_lgop(long *x, int n, char* op); extern void armci_msg_llgop(long long *x, int n, char* op); extern void armci_msg_fgop(float *x, int n, char* op); extern void armci_msg_dgop(double *x, int n, char* op); extern void armci_exchange_address(void *ptr_ar[], int n); extern void armci_msg_barrier(); extern void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right); extern int armci_msg_me(); extern int armci_msg_nproc(); extern void armci_msg_abort(int code); extern void armci_msg_init(int *argc, char ***argv); extern void armci_msg_finalize(); extern double armci_timer(); extern void armci_msg_clus_brdcst(void *buf, int len); extern void armci_msg_clus_igop(int *x, int n, char* op); extern void armci_msg_clus_fgop(float *x, int n, char* op); extern void armci_msg_clus_lgop(long *x, int n, char* op); extern void armci_msg_clus_llgop(long long *x, int n, char* op); extern void armci_msg_clus_dgop(double *x, int n, char* op); extern void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group); extern void armci_msg_group_igop(int *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_dgop(double *x, int n,char* op,ARMCI_Group *group); extern void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group); extern void armci_msg_group_barrier(ARMCI_Group *group); extern void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group); extern void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc,ARMCI_Group *mastergroup); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif ga-5-4/armci/src-portals/parmci.h0000644000175000017500000000667412662210425015035 0ustar mbamba#include "armci.h" int PARMCI_AccV (int op, void *scale, armci_giov_t * darr, int len, int proc); void PARMCI_Barrier (); int PARMCI_AccS (int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); void PARMCI_Finalize (); int PARMCI_NbPut (void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle); int PARMCI_GetValueInt (void *src, int proc); int PARMCI_Put_flag (void *src, void *dst, int bytes, int *f, int v, int proc); int PARMCI_NbGetS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); void *PARMCI_Malloc_local (armci_size_t bytes); int PARMCI_Free_local (void *ptr); int PARMCI_Get (void *src, void *dst, int bytes, int proc); int PARMCI_Put (void *src, void *dst, int bytes, int proc); int PARMCI_Destroy_mutexes (); int PARMCI_GetS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); int PARMCI_NbAccV (int op, void *scale, armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); float PARMCI_GetValueFloat (void *src, int proc); int PARMCI_Malloc (void **ptr_arr, armci_size_t bytes); int PARMCI_NbAccS (int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); int PARMCI_PutS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); void *PARMCI_Memat (armci_meminfo_t * meminfo, long offset); int PARMCI_PutV (armci_giov_t * darr, int len, int proc); int PARMCI_Free (void *ptr); int PARMCI_Init_args (int *argc, char ***argv); int PARMCI_PutValueInt (int src, void *dst, int proc); void PARMCI_Memget (size_t bytes, armci_meminfo_t * meminfo, int memflg); void PARMCI_AllFence (); int PARMCI_NbPutV (armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); int PARMCI_PutValueDouble (double src, void *dst, int proc); int PARMCI_GetV (armci_giov_t * darr, int len, int proc); int PARMCI_Test (armci_hdl_t * nb_handle); void PARMCI_Unlock (int mutex, int proc); void PARMCI_Fence (int proc); int PARMCI_Create_mutexes (int num); int PARMCI_PutS_flag (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc); int PARMCI_WaitProc (int proc); void PARMCI_Lock (int mutex, int proc); double PARMCI_GetValueDouble (void *src, int proc); int PARMCI_NbGetV (armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); int PARMCI_Rmw (int op, int *ploc, int *prem, int extra, int proc); int PARMCI_Init (); int PARMCI_WaitAll (); int PARMCI_NbGet (void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle); int PARMCI_PutValueFloat (float src, void *dst, int proc); int PARMCI_NbPutS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); int PARMCI_PutS_flag_dir (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc); int PARMCI_PutValueLong (long src, void *dst, int proc); int PARMCI_Wait (armci_hdl_t * nb_handle); long PARMCI_GetValueLong (void *src, int proc); ga-5-4/armci/src-portals/shmalloc.c0000644000175000017500000000470212662210425015345 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmalloc.c,v 1.10 2002-06-20 23:34:17 vinod Exp $ */ #include #include #include "armcip.h" #include "message.h" #include "kr_malloc.h" static long *offset_arr; void armci_shmalloc_exchange_offsets(context_t *ctx_local) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); offset_arr = (long*) malloc(armci_nproc*sizeof(long)); if(!ptr_arr || !offset_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); /* get memory with same size on all procs */ ptr = kr_malloc(bytes, ctx_local); if(!ptr) armci_die("armci_shmalloc_get_offsets: kr_malloc failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); /* identify offets */ for (i=0; i #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SEM_H # include #endif #if !HAVE_UNION_SEMUN union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif /* how many semaphores are available ? */ #ifndef SEMMSL # ifdef AIX # define SEMMSL 8094 # else # define SEMMSL 16 # endif #endif /* on HPUX 10.2 SEMMSL is much bigger than realistically we can allocate */ #ifdef HPUX #undef SEMMSL #define SEMMSL 64 #endif extern struct sembuf sops; extern int semaphoreID; int semop(); #define ALL_SEMS -1 #define _P_code -1 #define _V_code 1 #define P_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _P_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } #define V_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _V_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } typedef int lockset_t; #endif ga-5-4/armci/src-portals/pack.c0000644000175000017500000002711412662210425014463 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: pack.c,v 1.36.10.1 2006-12-14 13:24:37 manoj Exp $ */ #include "armcip.h" #include #if !defined(ACC_COPY) &&!defined(CRAY_YMP) &&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML) # define REMOTE_OP #endif #if defined(REMOTE_OP) # define OP_STRIDED armci_rem_strided #else # define OP_STRIDED(_a,_b,_c,_d,_e,_f,_g,_h,_i,_delete1,_j,_hdl)\ armci_op_strided(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_hdl) #endif /*\ determine if patch fits in the ARMCI buffer, and if not * at which stride level (patch dim) need to decompose it * *fit_level is the value of stride level to perform packing at * *nb means number of elements of count[*fit_level] that fit in buf \*/ static void armci_fit_buffer(int count[], int stride_levels, int* fit_level, int *nb, int bufsize) { int bytes=1, sbytes=1; int level; /* find out at which stride level BUFFER becomes too small */ for(level=0; level<= stride_levels; level++){ sbytes = bytes; /* store #bytes at current level to save div cost later */ bytes *= count[level]; if(bufsize < bytes) break; } /* buffer big enough for entire patch */ if(bufsize >= bytes){ *fit_level = stride_levels; *nb = count[stride_levels]; return; } /* buffer too small */ switch (level){ case 0: /* smaller than a single column */ *fit_level = 0; *nb = bufsize; break; case -1: /* one column fits */ *fit_level = 0; *nb = sbytes; break; default: /* it could keep nb instances of (level-1)-dimensional patch */ *fit_level = level; *nb = bufsize/sbytes; } } /*\ The function decomposes a multi-dimensional patch so that it fits in the * internal ARMCI buffer. * It works by recursively reducing patch dimension until some portion of the * subpatch fits in the buffer. * The recursive process is controlled by "fit_level" and "nb" arguments, * which have to be set to -1 at the top-level of the recursion tree. * * Argument last and variable looplast are used to indicate to sending/packing * routine that we are dealing with the last portion of the request. * Due to the recursive nature of packing code, the algorithm is following: * if last=1 then internal for loop passes 1 for the last chunk * else it passes 0 * \*/ int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int fit_level, int nb, int last,armci_ihdl_t nb_handle) { int rc=0, sn, bufsize=BUFSIZE,noswap=0; void *src, *dst; #ifdef REMOTE_OP int flag=0; #else int flag=1; #endif int b; static int call_count; #ifdef STRIDED_GET_BUFLEN if(op==GET) bufsize=STRIDED_GET_BUFLEN; # ifdef HITACHI else if(stride_levels || ARMCI_ACC(op)) bufsize=MSG_BUFLEN_SMALL-PAGE_SIZE; # endif #endif #if (defined(GM_) || defined(VIA_) || defined(VAPI_)) /*we cant assume that the entire available buffer will be used for data, fact that the header and descriptor also go in the same buffer should be considered while packing. */ bufsize-=(sizeof(request_header_t)+(MAX_STRIDE_LEVEL+4)*sizeof(int)+2*sizeof(void *)); # if defined(PIPE_BUFSIZE) && defined(MAX_PIPELINE_CHUNKS) bufsize-=8*MAX_PIPELINE_CHUNKS; # endif #endif #ifdef BALANCE_FACTOR /* Added the following for balancing buffers */ if(op==PUT){ int bytes=1, i; for(i=0; i<= stride_levels; i++) bytes *= count[i]; if(bytes > bufsize && bytes/bufsize < 3 && bytes%bufsize < BALANCE_BUFSIZE){ /* bytes div bufsize - 1 is to increase the balence factor for 3 buffer case */ bufsize = bytes/ (bytes/bufsize - 1 + BALANCE_FACTOR); noswap = 1; /*** yuck: if set to 1, error in buffers.c ***/ } bytes = bufsize%8; bufsize -= bytes; } #endif /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ armci_fit_buffer(count, stride_levels, &fit_level, &nb, bufsize); last = 1; } // printf("%s [cp]: pack_strided: flag=%d, bufsize=%ld; fit_level=%d; stride_level=%d; nb=%d\n",Portals_ID(),flag,(long) bufsize,fit_level,stride_levels,nb); if(fit_level == stride_levels){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int dst_stride, src_stride; if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ if(h) h->last = last?1:0; if(nb_handle && call_count ){ nb_handle->bufid=NB_MULTI; call_count++; } return(OP_STRIDED(op, scale, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels,h,flag,nb_handle)); } if(fit_level){ dst_stride = dst_stride_arr[fit_level -1]; src_stride = src_stride_arr[fit_level -1]; }else{ dst_stride = src_stride = 1; } if(op == GET || noswap == 1) b =nb; else{ b = chunk%nb; if(b==0)b=nb; } /* put smallest piece first */ for(sn = 0; sn < chunk; ){ src = (char*)src_ptr + src_stride* sn; dst = (char*)dst_ptr + dst_stride* sn; count[fit_level] = ARMCI_MIN(b, chunk-sn); /*modify count for this level*/ if(h) h->last = (last && ((sn+b)>=chunk))? 1: 0 ; if(nb_handle)call_count++; rc = OP_STRIDED( op, scale, proc, src, src_stride_arr, dst,dst_stride_arr,count,fit_level,h,flag,nb_handle); if(rc) break; sn += b; b = nb; } count[fit_level] = chunk; /* restore original count */ } else { for(sn = 0; sn < count[stride_levels]; sn++){ int looplast =0; src = (char*)src_ptr + src_stride_arr[stride_levels -1]* sn; dst = (char*)dst_ptr + dst_stride_arr[stride_levels -1]* sn; if(last && (sn == count[stride_levels]-1)) looplast =1; rc = armci_pack_strided(op, scale, proc, src, src_stride_arr, dst, dst_stride_arr, count, stride_levels -1, h,fit_level, nb, looplast,nb_handle); if(rc) return rc; } } if(nb_handle && call_count ) nb_handle->bufid=NB_MULTI; return rc; } /*\ decompose strided data into chunks and call func on each chunk \*/ void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg) { int sn,first_call=0; void *ptr_upd; /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ first_call=1; armci_fit_buffer(count, strides, &fit_level, &nb, bufsize); } if(fit_level == strides){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int stride_upd; # ifdef PIPE_MEDIUM_BUFSIZE_ /* for first call we adjust nb for performance in medium request */ if(first_call && strides==0) if(chunk<2*bufsize && chunk>PIPE_MEDIUM_BUFSIZE) nb = PIPE_MEDIUM_BUFSIZE; # endif if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ fun(ptr, stride_arr, count, strides, arg); } if(fit_level) stride_upd = stride_arr[fit_level -1]; else stride_upd = 1; for(sn = 0; sn < chunk; sn += nb){ ptr_upd = (char*)ptr + stride_upd* sn; count[fit_level] = ARMCI_MIN(nb, chunk-sn); /*modify count for this level*/ fun(ptr_upd, stride_arr, count, fit_level, arg); } count[fit_level] = chunk; /* restore original count */ }else for(sn = 0; sn < count[strides]; sn++){ ptr_upd = (char*)ptr + stride_arr[strides -1]* sn; armci_dispatch_strided(ptr_upd, stride_arr, count, strides -1, fit_level, nb, bufsize, fun, arg); } } /* how much space is needed to move data + reduced descriptor ? */ int armci_vector_bytes( armci_giov_t darr[], int len) { int i, bytes=0; for(i=0; isrc_ptr_array=NULL; /* go through the sets looking for set to be split */ for(s=0;sBUFSIZE1){ split =(BUFSIZE1 -bytes-2*sizeof(int))/(darr[s].bytes +sizeof(void*)); if(split == 0) s--; /* no room available - do not split */ break; }else bytes+=csize; if(BUFSIZE1 -bytes < 64) break; /* stop here if almost full */ } if(s==len)s--; /* adjust loop counter should be < number of sets */ *nlen = s+1; if(split){ /* save the value to be overwritten only if "save" is not filled */ if(!save->src_ptr_array)*save= darr[s]; /* split the set: reduce # of elems, "extra" keeps info for rest of set*/ *extra = darr[s]; darr[s].ptr_array_len = split; extra->ptr_array_len -= split; extra->src_ptr_array = &extra->src_ptr_array[split]; extra->dst_ptr_array = &extra->dst_ptr_array[split]; } } int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,armci_ihdl_t nb_handle) { armci_giov_t extra; /* keeps data remainder of set to be processed in chunks */ armci_giov_t save; /* keeps original value of set to be processed in chunks */ armci_giov_t *ndarr; /* points to first array element to be processed now */ int rc=0, nlen, count=0; ndarr = darr; save.src_ptr_array=NULL; /* indicates that save slot is empty */ while(len){ armci_split_dscr_array(ndarr, len, &extra, &nlen, &save); # if defined(REMOTE_OP) rc = armci_rem_vector(op, scale, ndarr,nlen,proc,0,nb_handle); # else if(ARMCI_ACC(op))rc=armci_acc_vector(op,scale,ndarr,nlen,proc); else rc = armci_copy_vector(op,ndarr,nlen,proc); # endif if(rc) break; /* non-NULL pointer indicates that set was split */ if(extra.src_ptr_array){ if(nb_handle) { nb_handle->bufid = NB_MULTI; /*can be set multiple times here; but not reset here*/ } ndarr[nlen-1]=extra; /* set the pointer to remainder of last set */ nlen--; /* since last set not done in full need to process it again */ }else{ if(save.src_ptr_array){ ndarr[0]=save; save.src_ptr_array=NULL; /* indicates that save slot is empty */ } if(nlen==0) armci_die("vector packetization problem:buffer too small",BUFSIZE1); } len -=nlen; ndarr +=nlen; count ++; } return rc; } ga-5-4/armci/src-portals/timer.c0000644000175000017500000000176712662210425014673 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: timer.c,v 1.3 2004-04-09 22:03:51 manoj Exp $ */ #ifdef WIN32 static double msec; /* reference for timer */ # include #else # include # include static unsigned firstsec=0; /* Reference for timer */ static unsigned firstusec=0; /* Reference for timer */ #endif static int first_call=1; double armci_timer() { #ifdef WIN32 double t0 = (double)GetCurrentTime(); if(first_call){ first_call=0; msec=t0; return 0.0; } t0 -=msec; if(t0<0.0)t0 += (double)0xffffffff; return 0.01*t0; #else double low, high; struct timeval tp; struct timezone tzp; (void) gettimeofday(&tp,&tzp); if (first_call) { firstsec = tp.tv_sec; firstusec = tp.tv_usec; first_call = 0; } low = (double)(tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); #endif } ga-5-4/armci/src-portals/armci_portals.h0000644000175000017500000001051512662210425016406 0ustar mbamba#ifndef ARMCI_PORTALS_H #define ARMCI_PORTALS_H /* portals header file */ #include #include #include #define NUM_COMP_DSCR 4 #define ARMCI_PORTALS_PTL_NUMBER 37 #define HAS_RDMA_GET #define NUM_SERV_BUFS 1 /*corresponds to num of different armci mem regions*/ #define MAX_MEM_REGIONS 10 #define VBUF_DLEN_ORG 4*64*1024 #define VBUF_DLEN 16*1024 #define MSG_BUFLEN_DBL_VT ((VBUF_DLEN)>>3) /* VBUF_DLEN are only used in Vinod's code */ #ifdef PORTALS_USE_RENDEZ_VOUS # define MSG_BUFLEN_DBL 262144 /* for rendez-vous, this can go bigger i think */ #else # define MSG_BUFLEN_DBL 1280 /* this is smaller when rendez-vous is off */ #endif #define ARMCI_NET_ERRTOSTR(__ARMCI_ERC_) ptl_err_str[__ARMCI_ERC_] typedef enum op { ARMCI_PORTALS_PUT, ARMCI_PORTALS_NBPUT, ARMCI_PORTALS_GET, ARMCI_PORTALS_NBGET, ARMCI_PORTALS_ACC, ARMCI_PORTALS_NBACC, ARMCI_PORTALS_GETPUT, ARMCI_PORTALS_NBGETPUT } armci_portals_optype; typedef struct { void *data_ptr; /* pointer where the data should go */ long ack; /* header ack */ void *ack_ptr; /* pointer where the data should go */ void *user_ptr; #if defined(SERV_QUEUE) int imm_msg; size_t data_len; #endif } msg_tag_t; typedef struct armci_portals_desc{ int active; int tag; int dest_id; armci_portals_optype type; ptl_md_t mem_dsc; ptl_handle_md_t mem_dsc_hndl; char *bufptr; }comp_desc; /*for buffers*/ extern char *armci_portals_client_buf_allocate(int); #define BUF_ALLOCATE armci_portals_client_buf_allocate #define BUF_EXTRA_FIELD_T comp_desc* #define INIT_SEND_BUF(_field,_snd,_rcv) _snd=1;_rcv=1;_field=NULL #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release #define CLEAR_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op) if((_op==UNLOCK || _op==PUT || ARMCI_ACC(_op)) && _field!=NULL)x_buf_wait_ack((request_header_t *)((void **)&(_field)+1),((char *)&(_field)-sizeof(BUF_INFO_T)));_field=NULL; #define TEST_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op,_ret) #define COMPLETE_HANDLE _armci_buf_complete_nb_request #define NB_CMPL_T comp_desc* #define ARMCI_NB_WAIT(_cntr) if(_cntr){\ int rc;\ if(nb_handle->tag)\ if(nb_handle->tag==_cntr->tag)\ rc = armci_client_complete(0,nb_handle->proc,nb_handle->tag,_cntr);\ } else{\ printf("\n%d:wait null ctr\n",armci_me);} #ifndef MAX_DS #define MAX_DS 16 #endif /* structure of computing process */ typedef struct { ptl_pt_index_t ptl; ptl_process_id_t rank; ptl_handle_ni_t ni_h; ptl_handle_eq_t eq_h; ptl_process_id_t Srank; ptl_handle_ni_t Sni_h; ptl_handle_eq_t Seq_h; int outstanding_puts; int outstanding_gets; ptl_process_id_t *procid_map; ptl_process_id_t *servid_map; int free_comp_desc_index; caddr_t dsbase[MAX_DS]; size_t dssizes[MAX_DS]; ptl_match_bits_t heap_mb[MAX_DS]; ptl_md_t heap_md[MAX_DS]; ptl_handle_me_t heap_me_h[MAX_DS]; ptl_handle_md_t heap_md_h[MAX_DS]; void *brval[MAX_DS]; long serv_offs[MAX_DS]; int cur_ds; }armci_portals_proc_t; typedef struct { ptl_match_bits_t mb; ptl_md_t md; ptl_handle_me_t me_h; ptl_handle_md_t md_h; }armci_portals_serv_mem_t; typedef struct { int reg_count; int outstanding_puts; int outstanding_gets; armci_portals_serv_mem_t meminfo[MAX_MEM_REGIONS]; }armci_portals_serv_t; extern void print_mem_desc_table(void); extern int armci_init_portals(caddr_t); extern void armci_fini_portals(void); extern int armci_post_descriptor(ptl_md_t *md); extern int armci_prepost_descriptor(void* start, long bytes); extern ptl_size_t armci_get_offset(ptl_md_t md, void *ptr,int proc); extern int armci_get_md(void * start, int bytes , ptl_md_t * md, ptl_match_bits_t * mb); extern void armci_portals_put(int,void *,void *,int,void **,int ); extern void armci_portals_get(int,void *,void *,int,void **,int ); extern void comp_desc_init(); extern int armci_client_complete(ptl_event_kind_t evt,int proc_id, int nb_tag ,comp_desc * cdesc); extern void armci_portals_memsetup(long); extern MPI_Comm portals_smp_comm; #endif /* ARMCI_PORTALS_H */ ga-5-4/armci/src-portals/locks.c0000644000175000017500000000432512662210425014657 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: locks.c,v 1.15.6.1 2006-12-14 13:24:36 manoj Exp $ */ #define _LOCKS_C_ #include "armcip.h" #include "locks.h" #ifndef WIN32 # include #endif #include extern void armci_die(char*,int); #if defined(SPINLOCK) || defined(PMUTEXES) void **ptr_arr; void CreateInitLocks(int num_locks, lockset_t *plockid) { int locks_per_proc, size; extern void armci_set_serv_mutex_arr(void *); ARMCI_PR_DBG("enter",0); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); locks_per_proc = (num_locks*armci_nclus)/armci_nproc + 1; size=locks_per_proc*sizeof(PAD_LOCK_T); PARMCI_Malloc(ptr_arr, size); _armci_int_mutexes = (PAD_LOCK_T*) ptr_arr[armci_master]; # ifdef PORTALS_SPECIFIC_QUESTION if(armci_me==armci_master)armci_set_serv_mutex_arr(_armci_int_mutexes); # endif if(!_armci_int_mutexes) armci_die("Failed to create spinlocks",size); #ifdef PMUTEXES if(armci_me == armci_master) { int i; pthread_mutexattr_t pshared; if(pthread_mutexattr_init(&pshared)) armci_die("armci_allocate_locks: could not init mutex attr",0); # ifndef LINUX if(pthread_mutexattr_setpshared(&pshared,PTHREAD_PROCESS_SHARED)) armci_die("armci_allocate_locks: could not set PROCESS_SHARED",0); # endif for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){ if(pthread_mutex_init(_armci_int_mutexes+i,&pshared)) armci_die("armci_allocate_locks: could not init mutex",i); } } #else bzero((char*)ptr_arr[armci_me],size); ARMCI_PR_DBG("exit",0); #endif } void InitLocks(int num_locks, lockset_t lockid) { /* what are you doing here ? All processes should've called CreateInitLocks(). Check preprocessor directtives and see lock allocation in armci_init */ armci_die("InitLocks(): what are you doing here ?",armci_me); } void DeleteLocks(lockset_t lockid) { _armci_int_mutexes = (PAD_LOCK_T*)0; } #else /*********************** every thing else *************************/ void CreateInitLocks(int num_locks, lockset_t *lockid) {} void InitLocks(int num_locks, lockset_t lockid) { } void DeleteLocks(lockset_t lockid) { } #endif ga-5-4/armci/src-portals/locks.h0000644000175000017500000001302212662210425014656 0ustar mbamba#ifndef _ARMCI_LOCKS_H_ #define _ARMCI_LOCKS_H_ #if HAVE_SYS_TYPES_H # include #endif #define MAX_LOCKS 1024 #define NUM_LOCKS MAX_LOCKS #if !(defined(PMUTEX) || defined(PSPIN) || defined(CYGNUS) || defined(CRAY_XT)) # include "spinlock.h" #endif #if !(defined(PMUTEX) || defined(PSPIN) || defined(SPINLOCK)) # error cannot run #endif #if (defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) || defined(HITACHI)) && !(defined(BGML) || defined(DCMF)) # include "armci_shmem.h" typedef struct { long off; long idlist[SHMIDLEN]; } lockset_t; extern lockset_t lockid; #elif defined(BGML) || defined(DCMF) typedef int lockset_t; #endif #if defined(PMUTEX) # warning SPINLOCK: pthread_mutex_lock # include # include # define NAT_LOCK(x,p) pthread_mutex_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_mutex_t # define PAD_LOCK_T LOCK_T PAD_LOCK_T *_armci_int_mutexes; #elif defined(PSPIN) # warning SPINLOCK: pthread_spin_lock # include # include # define NAT_LOCK(x,p) pthread_spin_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_spin_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_spinlock_t # define PAD_LOCK_T LOCK_T PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) && defined(SGIALTIX) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) PAD_LOCK_T *_armci_int_mutexes; #elif defined(HITACHI) extern void armcill_lock(int mutex, int proc); extern void armcill_unlock(int mutex, int proc); # define LOCK_T int # define PAD_LOCK_T LOCK_T # define NAT_LOCK(x,p) armcill_lock((x),(p)) # define NAT_UNLOCK(x,p) armcill_unlock((x),(p)) PAD_LOCK_T *_armci_int_mutexes; #elif defined(SGI) # define SGI_SPINS 100 # include typedef struct { int id; ulock_t * lock_array[NUM_LOCKS]; }lockset_t; extern lockset_t lockset; # define NAT_LOCK(x,p) (void) uswsetlock(lockset.lock_array[(x)],SGI_SPINS) # define NAT_UNLOCK(x,p) (void) usunsetlock(lockset.lock_array[(x)]) #elif defined(CONVEX) # include typedef struct{ unsigned state; unsigned pad[15]; } lock_t; typedef int lockset_t; extern lock_t *lock_array; extern void setlock(unsigned * volatile lp); extern void unsetlock(unsigned * volatile lp); # define NAT_LOCK(x,p) (void) setlock(&lock_array[x].state) # define NAT_UNLOCK(x,p) (void) unsetlock(&lock_array[(x)].state) #elif defined(WIN32) typedef int lockset_t; extern void setlock(int); extern void unsetlock(int); # define NAT_LOCK(x,p) setlock(x) # define NAT_UNLOCK(x,p) unsetlock(x) #elif defined(CRAY_YMP) && !defined(__crayx1) # include typedef int lockset_t; extern lock_t cri_l[NUM_LOCKS]; # pragma _CRI common cri_l # define NAT_LOCK(x,p) t_lock(cri_l+(x)) # define NAT_UNLOCK(x,p) t_unlock(cri_l+(x)) #elif defined(CRAY_T3E) || defined(__crayx1) || defined(CATAMOUNT) || defined(CRAY_SHMEM) || defined(PORTALS) # include # if defined(CRAY) || defined(CRAY_XT) # include # endif # if defined(DECOSF) || defined(LINUX64) || defined(__crayx1) || defined(CATAMOUNT) # define _INT_MIN_64 (LONG_MAX-1) # endif # undef NUM_LOCKS # define NUM_LOCKS 4 static long armci_lock_var[4]={0,0,0,0}; typedef int lockset_t; # define INVALID (long)(_INT_MIN_64 +1) # define NAT_LOCK(x,p) while( shmem_swap(armci_lock_var+(x),INVALID,(p)) ) # define NAT_UNLOCK(x,p) shmem_swap(armci_lock_var+(x), 0, (p)) #elif defined(SYSV) && defined(LAPI) && defined(AIX) int **_armci_int_mutexes; # define NAT_LOCK(x,p) armci_lapi_lock(_armci_int_mutexes[armci_master]+(x)) # define NAT_UNLOCK(x,p) armci_lapi_unlock(_armci_int_mutexes[armci_master]+(x)) typedef int lockset_t; #elif defined(CYGNUS) typedef int lockset_t; # define NAT_LOCK(x,p) armci_die("does not run in parallel",0) # define NAT_UNLOCK(x,p) armci_die("does not run in parallel",0) #elif defined(LAPI) && !defined (LINUX) # include typedef int lockset_t; extern pthread_mutex_t _armci_mutex_thread; # define NAT_LOCK(x,p) pthread_mutex_lock(&_armci_mutex_thread) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(&_armci_mutex_thread) #elif defined(FUJITSU) typedef int lockset_t; # include "fujitsu-vpp.h" #elif defined(SYSV) || defined(MACX) # include "semaphores.h" # undef NUM_LOCKS # define NUM_LOCKS ((MAX_LOCKS< SEMMSL) ? MAX_LOCKS:SEMMSL) # define NAT_LOCK(x,p) P_semaphore(x) # define NAT_UNLOCK(x,p) V_semaphore(x) # ifndef _LOCKS_C_ # define CreateInitLocks Sem_CreateInitLocks # define InitLocks Sem_InitLocks # define DeleteLocks Sem_DeleteLocks # endif #else # error #endif extern void CreateInitLocks(int num, lockset_t *id); extern void InitLocks(int num , lockset_t id); extern void DeleteLocks(lockset_t id); #ifdef FUJITSU # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(p); } #else # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(x,p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(x,p); } #endif #endif /* _ARMCI_LOCKS_H_ */ ga-5-4/armci/src-portals/capi.c0000644000175000017500000001641312662210425014461 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "armci.h" #include "parmci.h" int ARMCI_AccV (int op, void *scale, armci_giov_t * darr, int len, int proc) { int rval; rval = PARMCI_AccV (op, scale, darr, len, proc); return rval; } void ARMCI_Barrier () { PARMCI_Barrier (); } int ARMCI_AccS (int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; rval = PARMCI_AccS (optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); return rval; } void ARMCI_Finalize () { PARMCI_Finalize (); } int ARMCI_NbPut (void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbPut (src, dst, bytes, proc, nb_handle); return rval; } int ARMCI_GetValueInt (void *src, int proc) { int rval; rval = PARMCI_GetValueInt (src, proc); return rval; } int ARMCI_Put_flag (void *src, void *dst, int bytes, int *f, int v, int proc) { int rval; rval = PARMCI_Put_flag (src, dst, bytes, f, v, proc); return rval; } int ARMCI_NbGetS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbGetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); return rval; } void * ARMCI_Malloc_local (armci_size_t bytes) { void *rval; rval = PARMCI_Malloc_local (bytes); return rval; } int ARMCI_Free_local (void *ptr) { int rval; rval = PARMCI_Free_local (ptr); return rval; } int ARMCI_Get (void *src, void *dst, int bytes, int proc) { int rval; rval = PARMCI_Get (src, dst, bytes, proc); return rval; } int ARMCI_Put (void *src, void *dst, int bytes, int proc) { int rval; rval = PARMCI_Put (src, dst, bytes, proc); return rval; } int ARMCI_Destroy_mutexes () { int rval; rval = PARMCI_Destroy_mutexes (); return rval; } int ARMCI_GetS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; rval = PARMCI_GetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); return rval; } int ARMCI_NbAccV (int op, void *scale, armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbAccV (op, scale, darr, len, proc, nb_handle); return rval; } float ARMCI_GetValueFloat (void *src, int proc) { float rval; rval = PARMCI_GetValueFloat (src, proc); return rval; } int ARMCI_Malloc (void **ptr_arr, armci_size_t bytes) { int rval; rval = PARMCI_Malloc (ptr_arr, bytes); return rval; } int ARMCI_NbAccS (int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbAccS (optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); return rval; } int ARMCI_PutS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; rval = PARMCI_PutS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); return rval; } void * ARMCI_Memat (armci_meminfo_t * meminfo, long offset) { void *rval; rval = PARMCI_Memat (meminfo, offset); return rval; } int ARMCI_PutV (armci_giov_t * darr, int len, int proc) { int rval; rval = PARMCI_PutV (darr, len, proc); return rval; } int ARMCI_Free (void *ptr) { int rval; rval = PARMCI_Free (ptr); return rval; } int ARMCI_Init_args (int *argc, char ***argv) { int rval; rval = PARMCI_Init_args (argc, argv); return rval; } int ARMCI_PutValueInt (int src, void *dst, int proc) { int rval; rval = PARMCI_PutValueInt (src, dst, proc); return rval; } void ARMCI_Memget (size_t bytes, armci_meminfo_t * meminfo, int memflg) { PARMCI_Memget (bytes, meminfo, memflg); } void ARMCI_AllFence () { PARMCI_AllFence (); } int ARMCI_NbPutV (armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbPutV (darr, len, proc, nb_handle); return rval; } int ARMCI_PutValueDouble (double src, void *dst, int proc) { int rval; rval = PARMCI_PutValueDouble (src, dst, proc); return rval; } int ARMCI_GetV (armci_giov_t * darr, int len, int proc) { int rval; rval = PARMCI_GetV (darr, len, proc); return rval; } int ARMCI_Test (armci_hdl_t * nb_handle) { int rval; rval = PARMCI_Test (nb_handle); return rval; } void ARMCI_Unlock (int mutex, int proc) { PARMCI_Unlock (mutex, proc); } void ARMCI_Fence (int proc) { PARMCI_Fence (proc); } int ARMCI_Create_mutexes (int num) { int rval; rval = PARMCI_Create_mutexes (num); return rval; } int ARMCI_PutS_flag (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int rval; rval = PARMCI_PutS_flag (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); return rval; } int ARMCI_WaitProc (int proc) { int rval; rval = PARMCI_WaitProc (proc); return rval; } void ARMCI_Lock (int mutex, int proc) { PARMCI_Lock (mutex, proc); } double ARMCI_GetValueDouble (void *src, int proc) { double rval; rval = PARMCI_GetValueDouble (src, proc); return rval; } int ARMCI_NbGetV (armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbGetV (darr, len, proc, nb_handle); return rval; } int ARMCI_Rmw (int op, int *ploc, int *prem, int extra, int proc) { int rval; rval = PARMCI_Rmw (op, ploc, prem, extra, proc); return rval; } int ARMCI_Init () { int rval; rval = PARMCI_Init (); return rval; } int ARMCI_WaitAll () { int rval; rval = PARMCI_WaitAll (); return rval; } int ARMCI_NbGet (void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbGet (src, dst, bytes, proc, nb_handle); return rval; } int ARMCI_PutValueFloat (float src, void *dst, int proc) { int rval; rval = PARMCI_PutValueFloat (src, dst, proc); return rval; } int ARMCI_NbPutS (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; rval = PARMCI_NbPutS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); return rval; } int ARMCI_PutS_flag_dir (void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int rval; rval = PARMCI_PutS_flag_dir (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); return rval; } int ARMCI_PutValueLong (long src, void *dst, int proc) { int rval; rval = PARMCI_PutValueLong (src, dst, proc); return rval; } int ARMCI_Wait (armci_hdl_t * nb_handle) { int rval; rval = PARMCI_Wait (nb_handle); return rval; } long ARMCI_GetValueLong (void *src, int proc) { long rval; rval = PARMCI_GetValueLong (src, proc); return rval; } ga-5-4/armci/src-portals/message.c0000644000175000017500000017776412662210425015212 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: message.c,v 1.58.6.4 2007-04-24 10:08:26 vinod Exp $ */ #if defined(BGML) # include "bgml.h" #elif defined(PVM) # include #elif defined(TCGMSG) # include #else # ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI # endif # include #endif #include "message.h" #include "armcip.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #ifdef _POSIX_PRIORITY_SCHEDULING #ifndef HITACHI # include #endif #endif #include "armci.h" #include "acc.h" #define DEBUG_ 0 #if defined(SYSV) || defined(MMAP) ||defined (WIN32) # include "armci_shmem.h" #endif /* global operations are use buffer size of BUF_SIZE doubles */ #define BUF_SIZE (4*2048) #define INFO_BUF_SIZE (BUF_SIZE*sizeof(BUF_SIZE) - sizeof(double)) #undef EMPTY #define EMPTY 0 #define FULL 1 static double *work=NULL; static long *lwork = NULL; static long long *llwork = NULL; static int *iwork = NULL; static float *fwork = NULL; static int _armci_gop_init=0; /* tells us if we have a buffers allocated */ static int _armci_gop_shmem =0; /* tells us to use shared memory for gops */ extern void armci_util_wait_int(volatile int *, int , int ); static int empty=EMPTY,full=FULL; #if !defined(SGIALTIX) && defined(SYSV) || defined(MMAP) || defined(WIN32) static void **ptr_arr=NULL; #endif typedef struct { union { volatile int flag; double dummy[16]; }a; union { volatile int flag; double dummy[16]; }b; double array[BUF_SIZE]; } bufstruct; static bufstruct *_gop_buffer; #define GOP_BUF(p) (_gop_buffer+((p)-armci_master)) /*\ macro to set a flag includes mem barrier to assure that flag is not set * before any outstanding writes complete \*/ #ifdef NEED_MEM_SYNC # ifdef AIX # define SET_SHM_FLAG(_flg,_val) _clear_lock((int *)(_flg),_val); # elif defined(NEC) # define SET_SHM_FLAG(_flg,_val) MEM_FENCE; *(_flg)=(_val) # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define SET_SHM_FLAG(_flg,_val)\ __asm__ __volatile__ ("mf" ::: "memory"); *(_flg)=(_val) # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define SET_SHM_FLAG(_flg,_val)\ _armci_ia64_mb(); *(_flg)=(_val); # endif # elif defined(MACX) # if defined(__GNUC__) # define SET_SHM_FLAG(_flg,_val)\ *(_flg)=(_val);__asm__ __volatile__ ("isync" ::: "memory") # endif # endif #endif #ifndef SET_SHM_FLAG # define SET_SHM_FLAG(_flg,_val) *(_flg)=_val; #endif /*\ * Variables/structures for use in Barrier and for Binomial tree \*/ #if HAVE_MATH_H # include #endif int barr_switch; static int LnB=0,powof2nodes,Lp2; typedef struct { volatile int flag1; double dum[16]; volatile int flag2; } barrier_struct; barrier_struct *_bar_buff; #define BAR_BUF(p) (_bar_buff+((p))) void **barr_snd_ptr,**barr_rcv_ptr; int _armci_barrier_init=0; int _armci_barrier_shmem=0; /*\ * Tree generation code \*/ static void _dfs_bintree_parse(int *idlist, int index, int max, int *result) { int left = (int)2*index+1; int right = (int) 2*index+2; static int pos=0; int r_end,l_end; l_end=pos++; result[pos++]=idlist[index]; if(leftarray; /* each process finds its place */ GOP_BUF(armci_me)->a.flag=EMPTY; /* initially buffer is empty */ GOP_BUF(armci_me)->b.flag=EMPTY; /* initially buffer is empty */ if(armci_me == armci_master ){ GOP_BUF(armci_clus_last+1)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+1)->b.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->b.flag=EMPTY;/*initially buffer is empty*/ } _armci_gop_shmem = 1; } #endif /*stuff needed for barrier and binomial bcast/reduce*/ #ifdef LAPI if(!_armci_barrier_shmem){ int size = 2*sizeof(int); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barrinit failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barrinit failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); powof2nodes=1; LnB = floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)-1) _armci_dummy_work *=DUMMY_INIT; if(_armci_dummy_work>(double)armci_msg_nproc())_armci_dummy_work=DUMMY_INIT; } /***************************Barrier Code*************************************/ void armci_msg_barr_init(){ #if defined(SYSV) || defined(MMAP) || defined(WIN32) int size=sizeof(barrier_struct)*armci_clus_info[armci_clus_me].nslave; char *tmp; void **ptr_arr; barr_switch=0; /*First allocate space for flags*/ ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(armci_me==armci_master) size = size+128; else size=0; PARMCI_Malloc(ptr_arr, size); tmp = (char*)ptr_arr[armci_master]; size=2*sizeof(int); if(!tmp)armci_die("allocate barr shm failed",0); _bar_buff=(barrier_struct *)tmp; SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag1),empty); SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag2),empty); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barr_init failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barr_init failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); /*we have to figure if we have power of ,two nodes*/ powof2nodes=1; LnB = (int)floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)flag1,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag1),empty); } if(armci_nclus>1){ last = ((int)pow(2,(LnB-1)))^armci_clus_me; if(last>=0 && lastarmci_clus_me){ /*the pow2 set of procs*/ if(last=0 && next armci_me){ armci_msg_snd(ARMCI_TAG, srcp,4,next_node); armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); } else{ /*would we gain anything by doing a snd,rcv instead of rcv,snd*/ armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); armci_msg_snd(ARMCI_TAG, srcp,4,next_node); } armci_util_wait_int((volatile int *)dstn,barr_count,100000); } } if(last1*/ for(i=1;iflag2),full); } else { /*if not master, partake in the smp barrier,only*/ i=armci_me-armci_master; SET_SHM_FLAG(&(BAR_BUF(i)->flag1),full); armci_util_wait_int(&BAR_BUF(i)->flag2,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag2),empty); } } #endif /*barrier enabled only for lapi*/ void parmci_msg_barrier() { #ifdef BGML bgml_barrier (3); /* this is always faster than MPI_Barrier() */ #elif defined(MSG_COMMS_MPI) MPI_Barrier(ARMCI_COMM_WORLD); # elif defined(PVM) pvm_barrier(mp_group_name, armci_nproc); # elif defined(LAPI) #if !defined(NEED_MEM_SYNC) if(_armci_barrier_init) _armci_msg_barrier(); else #endif { tcg_synch(ARMCI_TAG); } # else { tcg_synch(ARMCI_TAG); } # endif } /***********************End Barrier Code*************************************/ void armci_msg_init(int *argc, char ***argv) { #if defined(TCGMSG) if (!tcg_ready()) { tcg_pbegin(argc,argv); } #elif defined(BGML) /* empty */ #elif defined(MSG_COMMS_MPI) int flag=0; MPI_Initialized(&flag); if (!flag) { # if defined(DCMF) || defined(MPI_MT) int provided; MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); # else MPI_Init(argc, argv); # endif } if (!PARMCI_Initialized()) { MPI_Comm_dup(MPI_COMM_WORLD, &ARMCI_COMM_WORLD); } #endif } int armci_msg_me() { #ifdef BGML return BGML_Messager_rank(); #elif defined(DCMF) return DCMF_Messager_rank(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int me; MPI_Comm_rank(ARMCI_COMM_WORLD, &me); armci_me = me; counter = 1; } return armci_me; #elif defined(PVM) return(pvm_getinst(mp_group_name,pvm_mytid())); #else return (int)tcg_nodeid(); #endif } int armci_msg_nproc() { #ifdef BGML return BGML_Messager_size(); #elif defined(DCMF) return DCMF_Messager_size(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int nproc; MPI_Comm_size(ARMCI_COMM_WORLD, &nproc); armci_nproc = nproc; counter = 1; } return armci_nproc; #elif defined(PVM) return(pvm_gsize(mp_group_name)); #else return (int)tcg_nnodes(); #endif } #ifdef CRAY_YMP #define BROKEN_MPI_ABORT #endif #ifndef PVM double armci_timer() { #ifdef BGML return BGML_Timer(); #elif defined(DCMF) return DCMF_Timer(); #elif defined(MSG_COMMS_MPI) return MPI_Wtime(); #else return tcg_time(); #endif } #endif void armci_msg_abort(int code) { #ifdef BGML fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(DCMF) fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(MSG_COMMS_MPI) # ifndef BROKEN_MPI_ABORT MPI_Abort(ARMCI_COMM_WORLD,code); # endif #elif defined(PVM) char error_msg[25]; sprintf(error_msg, "ARMCI aborting [%d]", code); pvm_halt(); #else tcg_error("ARMCI aborting",(long)code); #endif fprintf(stderr,"%d:aborting\n",armci_me); /* trap for broken abort in message passing libs */ _exit(1); } void armci_msg_finalize() { #if defined(TCGMSG) tcg_pend(); #elif defined(MSG_COMMS_MPI) MPI_Finalize(); #endif } void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right) { int root, up, left, right, index, nproc; if(scope == SCOPE_NODE){ root = armci_clus_info[armci_clus_me].master; nproc = armci_clus_info[armci_clus_me].nslave; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = armci_clus_info[0].master; nproc = armci_nclus; if(armci_me != armci_master){up = -1; left = -1; right = -1; } else{ index = armci_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: armci_clus_info[up].master; left = 2*index + 1 + root; left = ( left >= root+nproc)? -1: armci_clus_info[left].master; right = 2*index + 2 + root; right =( right >= root+nproc)? -1: armci_clus_info[right].master; } }else{ root = 0; nproc = armci_nproc; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = up; *Left = left; *Right = right; *Root = root; } /*\ root broadcasts to everyone else \*/ void armci_msg_bcast_scope(int scope, void *buf, int len, int root) { int up, left, right, Root; if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buf, len, 3); #else armci_msg_bintree(scope, &Root, &up, &left, &right); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); #endif } /*\ shared memory based broadcast for a single SMP node \*/ void armci_smp_bcast(void *x, int n , int root) { int ndo, len,i, bufsize = BUF_SIZE*sizeof(double); static int bufid=1; if(armci_clus_info[armci_clus_me].nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_bcast: NULL pointer", n); /* enable or balance pipeline for messages comparable to bufsize */ if((n>bufsize/2) && (n <(2*bufsize-64))){ bufsize = n/2; bufsize>>=3; bufsize<<=3; } while ((ndo = (n<=bufsize) ? n : bufsize)) { len = ndo; if(armci_me==root){ /* wait for the flag protecting the buffer to clear */ armci_util_wait_int(&(GOP_BUF(armci_clus_last+bufid)->a.flag),EMPTY,100); SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),full); #if 0 for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); armci_copy(x,GOP_BUF(armci_clus_last+bufid+1)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root) GOP_BUF(i)->b.flag=FULL; #else armci_copy(x,GOP_BUF(armci_clus_last+bufid)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); SET_SHM_FLAG(&(GOP_BUF(i)->b.flag),full); } #endif }else{ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag, FULL, 100); armci_copy(GOP_BUF(armci_clus_last+bufid)->array,x,len); SET_SHM_FLAG(&(GOP_BUF(armci_me)->b.flag),empty); } n -=ndo; x = len + (char*)x; bufid = (bufid)%2 +1; /* since root waited for everybody to check in the previous buffer is free*/ if(armci_me==root){ SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),empty); } } } /*\ shared memory based broadcast for a single SMP node out of shmem buffer \*/ void armci_smp_buf_bcast(void *x, int n, int root, void *shmbuf ) { int i, nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2){ armci_copy(shmbuf,x,n); return; /* nothing to do */ } if(!x)armci_die("armci_msg_bcast: NULL pointer", n); if(!shmbuf)armci_die("armci_msg_bcast: NULL pointer", n); if(armci_me==root){ /* notify others that the data in buffer is ready */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); GOP_BUF(i)->b.flag=FULL; } /* root also needs to copy */ armci_copy(shmbuf,x,n); /* wait until everybody is finished -- can reclaim buffer */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY,100000); }else{ /* spin until data in buffer is ready */ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag , FULL, 100000); armci_copy(shmbuf,x,n); /* copy data */ GOP_BUF(armci_me)->b.flag = EMPTY; /* indicate we are done */ } } void _armci_msg_binomial_bcast(void *buf, int len, int root){ int Root = armci_master; int nslave = armci_clus_info[armci_clus_me].nslave; int i,next_node,next; /* int my_rank,root_rank,next_rank; */ /* inter-node operation between masters */ if(root !=armci_clus_info[0].master){ Root = armci_clus_info[0].master; if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); root = Root; Root = armci_master; } if(armci_nclus>1 &&armci_me==armci_master){/*the internode bcast, first*/ /*first do the recv*/ int rcv_proc=armci_clus_me,flag=1,diff=1; if(armci_me!=root){ while(!(rcv_proc & flag)){ diff=diff<<1; flag=flag<<1; } rcv_proc = armci_clus_info[armci_clus_me-diff].master; armci_msg_rcv(ARMCI_TAG, buf,len,NULL,rcv_proc); /*printf("\n%d: recv from %d \n",armci_me,rcv_proc);fflush(stdout);*/ } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1)armci_msg_bcast_scope(SCOPE_MASTERS, buf, len, root); else Root = root; /* intra-node operation */ #if 1 if(_armci_gop_shmem && nslave<33) armci_smp_bcast(buf, len, Root); else #endif armci_msg_bcast_scope(SCOPE_NODE, buf, len, Root); } #endif void armci_msg_brdcst(void* buffer, int len, int root) { if(!buffer)armci_die("armci_msg_brdcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buffer, len, PCLASS); # elif defined(MSG_COMMS_MPI) MPI_Bcast(buffer, len, MPI_CHAR, root, ARMCI_COMM_WORLD); # elif defined(PVM) armci_msg_bcast(buffer, len, root); # else { long ttag=ARMCI_TAG, llen=len, rroot=root; tcg_brdcst(ttag, buffer, llen, rroot); } # endif } void armci_msg_snd(int tag, void* buffer, int len, int to) { # ifdef MSG_COMMS_MPI MPI_Send(buffer, len, MPI_CHAR, to, tag, ARMCI_COMM_WORLD); # elif defined(PVM) pvm_psend(pvm_gettid(mp_group_name, to), tag, buffer, len, PVM_BYTE); # elif defined(BGML) /* We don't actually used armci_msg_snd in ARMCI. we use optimized * collectives where * armci_msg_snd is used. If you build Global Arrays, the MSG_COMMS_MPI flag is * set, so that * will work fine */ armci_die("bgl shouldn't use armci_msg_snd", armci_me); # else long ttag=tag, llen=len, tto=to, block=1; tcg_snd(ttag, buffer, llen, tto, block); # endif } /*\ receive message of specified tag from proc and get its len if msglen!=NULL \*/ void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from) { # ifdef MSG_COMMS_MPI MPI_Status status; MPI_Recv(buffer, buflen, MPI_CHAR, from, tag, ARMCI_COMM_WORLD, &status); if(msglen) MPI_Get_count(&status, MPI_CHAR, msglen); # elif defined(PVM) int src, rtag,mlen; pvm_precv(pvm_gettid(mp_group_name, from), tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; #elif defined(BGML) armci_die("bgl shouldn't use armci_msg_rcv", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=from, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; # endif } int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen) { #if defined(MSG_COMMS_MPI) int ierr; MPI_Status status; ierr = MPI_Recv(buffer, buflen, MPI_CHAR, MPI_ANY_SOURCE, tag, ARMCI_COMM_WORLD, &status); if(ierr != MPI_SUCCESS) armci_die("armci_msg_rcvany: Recv failed ", tag); if(msglen)if(MPI_SUCCESS!=MPI_Get_count(&status, MPI_CHAR, msglen)) armci_die("armci_msg_rcvany: count failed ", tag); return (int)status.MPI_SOURCE; # elif defined(PVM) int src, rtag,mlen; pvm_precv(-1, tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; return(pvm_getinst(mp_group_name,src)); # elif defined (BGML) armci_die("bgl shouldn't use armci_msg_rcvany", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=-1, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; return (int)sender; # endif } /*\ cluster master broadcasts to everyone else in the same cluster \*/ void armci_msg_clus_brdcst(void *buf, int len) { int root, up, left, right; int tag=ARMCI_TAG, lenmes; armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(armci_me != root) armci_msg_rcv(tag, buf, len, &lenmes, up); if (left > -1) armci_msg_snd(tag, buf, len, left); if (right > -1) armci_msg_snd(tag, buf, len, right); } /*\ reduce operation for long \*/ static void ldoop(int n, char *op, long *x, long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("ldoop: unknown operation requested", n); } /*\ reduce operation for long x= op(work,work2) \*/ static void ldoop2(int n, char *op, long *x, long* work, long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for long long \*/ static void lldoop(int n, char *op, long long *x, long long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("lldoop: unknown operation requested", n); } /*\ reduce operation for long long x= op(work,work2) \*/ static void lldoop2(int n, char *op, long long *x, long long* work, long long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for int \*/ static void idoop(int n, char *op, int *x, int* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("idoop: unknown operation requested", n); } /*\ reduce operation for int x= op(work,work2) \*/ static void idoop2(int n, char *op, int *x, int* work, int* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("idoop2: unknown operation requested", n); } /*\ reduce operation for double \*/ static void ddoop(int n, char* op, double* x, double* work) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD(&n,x,work); else while(n--) *x++ += *work++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT(&n,x,work); else while(n--) *x++ *= *work++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("ddoop: unknown operation requested", n); } /*\ reduce operation for double x= op(work,work2) \*/ static void ddoop2(int n, char *op, double *x, double* work, double* work2) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD2(&n,x,work,work2); else while(n--) *x++ = *work++ + *work2++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT2(&n,x,work,work2); while(n--) *x++ = *work++ * *work2++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("ddoop2: unknown operation requested", n); } /*\ reduce operation for float \*/ static void fdoop(int n, char* op, float* x, float* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("fdoop: unknown operation requested", n); } /*\ reduce operation for float x= op(work,work2) \*/ static void fdoop2(int n, char *op, float *x, float* work, float* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("fdoop2: unknown operation requested", n); } /*\ combine array of longs/ints accross all processes \*/ void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, orign =n, ratio; void *origx =x; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); #ifdef BGML BGML_Dt dt; BGML_Op theop; if(n > 0 && (strncmp(op, "+", 1) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_SUM; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "max", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MAX; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "min", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MIN; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else #endif { armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_bcast_scope(scope, origx, len, root); } } void armci_msg_reduce_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, ratio; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } } static void gop(int type, int ndo, char* op, void *x, void *work) { if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); } static void gop2(int type, int ndo, char* op, void *x, void *work, void *work2) { #if 0 int size; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); armci_copy(work2,x,ndo*size); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); #else if(type==ARMCI_INT) idoop2(ndo, op, (int*)x, (int*)work, (int*)work2); else if(type==ARMCI_LONG)ldoop2(ndo,op,(long*)x,(long*)work,(long*)work2); else if(type==ARMCI_LONG_LONG) lldoop2(ndo,op,(long long*)x,(long long*)work,(long long*)work2); else if(type==ARMCI_FLOAT)fdoop2(ndo,op,(float*)x,(float*)work,(float*)work2); else ddoop2(ndo, op, (double*)x, (double*)work,(double*)work2); #endif } /*\ shared memory based reduction for a single SMP node \*/ static void armci_smp_reduce(void *x, int n, char* op, int type) { int root, up, left, right, size; int ndo, len, lenmes, ratio; int nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_gop: NULL pointer", n); armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; armci_util_wait_int(&GOP_BUF(armci_me)->a.flag, EMPTY, 100); #if 1 if(left<0 && right<0) armci_copy(x,GOP_BUF(armci_me)->array,len); /* version oblivious to the order of data arrival */ { int need_left = left >-1; int need_right = right >-1; int from, first =1, maxspin=100, count=0; bufstruct *b; while(need_left || need_right){ from =-1; if(need_left && GOP_BUF(left)->a.flag == FULL){ from =left; need_left =0; }else if(need_right && GOP_BUF(right)->a.flag == FULL) { from =right; need_right =0; } if(from != -1){ b = GOP_BUF(from); #if 1 if(armci_me == root) gop(type, ndo, op, x, b->array); else { if(first) gop2(type, ndo, op, GOP_BUF(armci_me)->array, b->array,x); else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); } first =0; #else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); #endif SET_SHM_FLAG(&( b->a.flag),empty); }else if((++count)array,len); /* this version requires a specific order of data arrival */ if (left >-1) { while(GOP_BUF(left)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(left)->array); SET_SHM_FLAG(&( GOP_BUF(left)->a.flag),empty); } if (right >-1 ) { while(GOP_BUF(right)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(right)->array); GOP_BUF(right)->a.flag = EMPTY; } #endif if (armci_me != root ) { SET_SHM_FLAG(&(GOP_BUF(armci_me)->a.flag),full); } #if 0 else /* NOTE: this copy can be eliminated in a cluster configuration */ armci_copy(GOP_BUF(armci_me)->array,x,len); #endif n -=ndo; x = len + (char*)x; } } void _armci_msg_binomial_reduce(void *x, int n, char* op, int type){ int root = armci_clus_info[0].master; int i,next_node,next; int size, ratio, ndo, lenmes,len; /* int my_rank,root_rank,next_rank; */ if(work==NULL)_allocate_mem_for_work(); if(armci_me!=armci_master)return; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { int snd_proc=armci_clus_me,flag=1,diff=1; len = lenmes = ndo*size; if(armci_me!=root){ while(!(snd_proc & flag)){ diff=diff<<1; flag=flag<<1; } snd_proc = armci_clus_info[armci_clus_me-diff].master; } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1){ #ifdef LAPI if(_armci_gop_init) _armci_msg_binomial_reduce(x,n,op,type); else #endif armci_msg_reduce_scope(SCOPE_MASTERS, x, n, op, type); } } static void armci_msg_gop2(void *x, int n, char* op, int type) { int size, root=0; if(work==NULL)_allocate_mem_for_work(); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); #ifdef BGML /*optimize what we can at the message layer */ void *origx=x; BGML_Dt dt; BGML_Op rop; if(n>0 && (strncmp(op, "+", 1) == 0)) { rop=BGML_SUM; if(type == ARMCI_INT) { dt=BGML_SIGNED_INT; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_LONG || type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); /* dt=BGML_UNSIGNED_LONG; */ /* BGTr_Allreduce(origx, x, n, dt, rop, -1, 3);*/ } else if(type == ARMCI_DOUBLE) { dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_FLOAT) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } } else if(n>0 && ((strncmp(op, "max", 3) == 0) || (strncmp(op, "min", 3) ==0 ))) { if(strncmp(op, "max", 3) == 0) rop=BGML_MAX; else rop=BGML_MIN; if(type == ARMCI_INT) dt=BGML_SIGNED_INT; else if(type == ARMCI_DOUBLE) dt=BGML_DOUBLE; else if(type == ARMCI_FLOAT) dt=BGML_FLOAT; else if(type == ARMCI_LONG) dt=BGML_SIGNED_LONG; else if(type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } if(type != ARMCI_LONG_LONG) BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else #endif { /* brackets needed for final gelse clause of bgml */ armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } } static void armci_sel(int type, char *op, void *x, void* work, int n) { int selected=0; switch (type) { case ARMCI_INT: if(strncmp(op,"min",3) == 0){ if(*(int*)x > *(int*)work) selected=1; }else if(*(int*)x < *(int*)work) selected=1; break; case ARMCI_LONG: if(strncmp(op,"min",3) == 0){ if(*(long*)x > *(long*)work) selected=1; }else if(*(long*)x < *(long*)work) selected=1; break; case ARMCI_LONG_LONG: if(strncmp(op,"min",3) == 0){ if(*(long long*)x > *(long long*)work) selected=1; }else if(*(long long*)x < *(long long*)work) selected=1; break; case ARMCI_FLOAT: if(strncmp(op,"min",3) == 0){ if(*(float*)x > *(float*)work) selected=1; }else if(*(float*)x < *(float*)work) selected=1; break; default: if(strncmp(op,"min",3) == 0){ if(*(double*)x > *(double*)work) selected=1; }else if(*(double*)x < *(double*)work) selected=1; } if(selected)armci_copy(work,x, n); } /*\ global for op with extra info \*/ void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute) { int root, up, left, right; int tag=ARMCI_TAG; int len, lenmes, min; min = (strncmp(op,"min",3) == 0); if(!min && (strncmp(op,"max",3) != 0)) armci_die("armci_msg_gop_info: operation not supported ", 0); if(!x)armci_die("armci_msg_gop_info: NULL pointer", n); if(n>((int)INFO_BUF_SIZE))armci_die("armci_msg_gop_info: info too large",n); len = lenmes = n; armci_msg_bintree(scope, &root, &up, &left, &right); if (left > -1) { /* receive into work if contributing otherwise into x */ if(contribute)armci_msg_rcv(tag, work, len, &lenmes, left); else armci_msg_rcv(tag, x, len, &lenmes, left); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (right > -1) { /* receive into work if contributing otherwise into x */ if(contribute) armci_msg_rcv(tag, work, len, &lenmes, right); else armci_msg_rcv(tag, x, len, &lenmes, right); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (armci_me != root){ if(contribute) armci_msg_snd(tag, x, len, up); else armci_msg_snd(tag, x, 0, up); /* send 0 bytes */ } /* Now, root broadcasts the result down the binary tree */ armci_msg_bcast_scope(scope, x, n, root); } /*\ combine array of longs/ints/doubles accross all processes \*/ #if defined(NEC) void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE); } void armci_msg_fgop (float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT);} #else void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG_LONG); } void armci_msg_fgop(float *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_FLOAT); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_DOUBLE); } #endif /*\ add array of longs/ints within the same cluster node \*/ void armci_msg_clus_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_INT); } void armci_msg_clus_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG); } void armci_msg_clus_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG_LONG); } void armci_msg_clus_fgop(float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_FLOAT); } void armci_msg_clus_dgop_scope(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_DOUBLE); } void armci_exchange_address(void *ptr_ar[], int n) { int ratio = sizeof(void*)/sizeof(int); /* armci_msg_lgop((long*)ptr_ar, n, "+"); */ if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me,(long)ptr_ar[armci_me],ratio); armci_msg_gop2(ptr_ar, n*ratio, "+",ARMCI_INT); } /** * ********************* Begin ARMCI Groups Code **************************** * NOTE: This part is MPI dependent (i.e. ifdef MSG_COMMS_MPI) */ #ifdef MSG_COMMS_MPI MPI_Comm armci_group_comm(ARMCI_Group *group) { #ifdef ARMCI_GROUP return MPI_COMM_NULL; #else ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return (MPI_Comm)(igroup->icomm); #endif } void parmci_msg_group_barrier(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP { int val=0; armci_msg_group_igop(&val, 1, "+", group); } #else MPI_Barrier((MPI_Comm)(igroup->icomm)); #endif } #ifdef ARMCI_GROUP extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group); #else extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm); #endif void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc, ARMCI_Group *mastergroup) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(mastergroup); int i, *pid_list, root=0; #ifdef ARMCI_GROUP ARMCI_Group group; #else MPI_Group group_world; MPI_Group group; MPI_Comm comm; #endif /* create a communicator for the processes with in a node */ pid_list = (int *)malloc(grp_clus_nproc*sizeof(int)); for(i=0; iicomm), &group_world); MPI_Group_incl(group_world, grp_clus_nproc, pid_list, &group); MPI_Comm_create((MPI_Comm)(igroup->icomm), (MPI_Group)group, (MPI_Comm*)&comm); /* Broadcast within the node (for this sub group of processes) */ ARMCI_Bcast_(buf, len, root, comm); free(pid_list); MPI_Comm_free(&comm); /* free the temporary communicator */ MPI_Group_free(&group); #endif } /* to avoid warning */ extern int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank); void armci_msg_group_bintree(int scope, int* Root, int *Up, int *Left, int *Right, ARMCI_Group *group) { int root, up, left, right, index, nproc,grp_clus_me,grp_me,grp_master,grp_nproc; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); grp_me = grp_attr->grp_me; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; ARMCI_Group_size(group, &grp_nproc); if(scope == SCOPE_NODE){ root = grp_attr->grp_clus_info[grp_clus_me].master; nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = grp_attr->grp_clus_info[0].master; nproc = grp_attr->grp_nclus; if(grp_me != grp_master){up = -1; left = -1; right = -1; } else{ index = grp_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: grp_attr->grp_clus_info[up].master; left = 2*index + 1 + root; left =( left >= root+nproc)?-1:grp_attr->grp_clus_info[left].master; right= 2*index + 2 + root; right=( right>=root+nproc)?-1:grp_attr->grp_clus_info[right].master; } }else{ root = 0; nproc = grp_nproc; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = (up==-1)?up:ARMCI_Absolute_id(group,up); *Left = (left==-1)?left:ARMCI_Absolute_id(group,left); *Right = (right==-1)?right:ARMCI_Absolute_id(group,right); *Root = (root==-1)?root:ARMCI_Absolute_id(group,root); } void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group) { int up, left, right, Root; int grp_me; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); if(!group)armci_msg_bcast_scope(scope,buf,len,root); else grp_me = igroup->grp_attr.grp_me; armci_msg_group_bintree(scope, &Root, &up, &left, &right,group); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); } void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group) { int root, up, left, right, size; int tag=ARMCI_TAG,grp_me; int ndo, len, lenmes, orign =n, ratio; void *origx =x; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!group)armci_msg_gop_scope(scope,x,n,op,type); else grp_me = igroup->grp_attr.grp_me; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_group_bintree(scope, &root, &up, &left, &right,group); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x, llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_group_bcast_scope(scope, origx, len, root,group); } void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group) { int ratio = sizeof(void*)/sizeof(int); ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); int grp_me = igroup->grp_attr.grp_me; if(DEBUG_){ printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); } armci_msg_group_gop_scope(SCOPE_ALL, ptr_arr, n*ratio, "+", ARMCI_INT, group); } /*\ combine array of longs/ints/doubles accross all processes \*/ void armci_msg_group_igop(int *x, int n, char* op, ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT,group); } void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG,group); } void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG,group); } void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT,group); } void armci_msg_group_dgop(double *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE,group); } # endif /* ifdef MSG_COMMS_MPI */ /*********************** End ARMCI Groups Code ****************************/ #ifdef PVM /* set the group name if using PVM */ void ARMCI_PVM_Init(char *mpgroup) { #ifdef CRAY mp_group_name = (char *)NULL; #else if(mpgroup != NULL) { /* free(mp_group_name); */ mp_group_name = (char *)malloc(25 * sizeof(char)); strcpy(mp_group_name, mpgroup); } #endif } #endif ga-5-4/armci/src-portals/atomics-i386.h0000644000175000017500000000071612662210425015677 0ustar mbamba/** Atomic instructions for i386. To be populated as need arises. * @author Sriram Krishnamoorthy */ #ifndef __ATOMICS_I386__ #define __ATOMICS_I386__ #include #define v4b (volatile unsigned int *) static inline void atomic_exchange(void *val, void *ptr, int size) { assert(size == 4); __asm__ __volatile__ ("xchgl %0, %1" : "=r"(*v4b(val)), "+m"(*v4b(ptr)) : "0"(*v4b(val)) : "memory"); } #undef v4b #endif /*__ATOMICS_I386__*/ ga-5-4/armci/src-portals/armci.h0000644000175000017500000004055612662210425014652 0ustar mbamba/*$id$*/ /* ARMCI header file */ #ifndef _ARMCI_H #define _ARMCI_H /* for size_t */ #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef unsigned long long u64Int; typedef long long s64Int; extern int armci_sameclusnode(int proc); typedef struct { void **src_ptr_array; void **dst_ptr_array; int ptr_array_len; int bytes; } armci_giov_t; typedef long armci_size_t; extern int armci_notify(int proc); extern int armci_notify_wait(int proc,int *pval); extern int ARMCI_Init(void); /* initialize ARMCI */ extern int ARMCI_Init_args(int *argc, char ***argv); extern void ARMCI_Barrier(void); /* ARMCI Barrier*/ extern int ARMCI_Put(void *src, void* dst, int bytes, int proc); extern int ARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc); #define ARMCI_Put1(_s,_d,_b,_p) memcpy(_d,_s,_b), 0 extern int ARMCI_PutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag_dir( /* put with flag that uses direct put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_Acc(int optype, void *scale, void *src, void *dst, int bytes, int proc); extern int ARMCI_AccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_Get(void *src, void* dst, int bytes, int proc); extern int ARMCI_GetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_AccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueFloat(float src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueDouble(double src,/* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_GetValueInt(void *src, int proc); extern long ARMCI_GetValueLong(void *src, int proc); extern float ARMCI_GetValueFloat(void *src, int proc); extern double ARMCI_GetValueDouble(void *src, int proc); extern int ARMCI_Malloc(void* ptr_arr[], armci_size_t bytes); extern int ARMCI_Free(void *ptr); extern void* ARMCI_Malloc_local(armci_size_t bytes); extern int ARMCI_Free_local(void *ptr); extern int ARMCI_Same_node(int proc); extern void ARMCI_Finalize(); /* terminate ARMCI */ extern void ARMCI_Error(char *msg, int code); extern void ARMCI_Fence(int proc); extern void ARMCI_DoFence(int proc); extern void ARMCI_AllFence(void); extern int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc); extern void ARMCI_Cleanup(void); extern int ARMCI_Create_mutexes(int num); extern int ARMCI_Destroy_mutexes(void); extern void ARMCI_Lock(int mutex, int proc); extern void ARMCI_Unlock(int mutex, int proc); extern void ARMCI_Set_shm_limit(unsigned long shmemlimit); extern int ARMCI_Uses_shm(); extern void ARMCI_Copy(void *src, void *dst, int n); #define FAIL -1 #define FAIL2 -2 #define FAIL3 -3 #define FAIL4 -4 #define FAIL5 -5 #define FAIL6 -6 #define FAIL7 -7 #define FAIL8 -8 #define ARMCI_SWAP 10 #define ARMCI_SWAP_LONG 11 #define ARMCI_FETCH_AND_ADD 12 #define ARMCI_FETCH_AND_ADD_LONG 13 #define ARMCI_ACC_OFF 36 #define ARMCI_ACC_INT (ARMCI_ACC_OFF + 1) #define ARMCI_ACC_DBL (ARMCI_ACC_OFF + 2) #define ARMCI_ACC_FLT (ARMCI_ACC_OFF + 3) #define ARMCI_ACC_CPL (ARMCI_ACC_OFF + 4) #define ARMCI_ACC_DCP (ARMCI_ACC_OFF + 5) #define ARMCI_ACC_LNG (ARMCI_ACC_OFF + 6) #define ARMCI_ACC_RA (ARMCI_ACC_OFF + 7) #define ARMCI_MAX_STRIDE_LEVEL 8 #ifdef BGML #define ARMCI_CRITICAL_SECTION_ENTER() BGML_CriticalSection_enter(); #define ARMCI_CRITICAL_SECTION_EXIT() BGML_CriticalSection_exit(); #else #define ARMCI_CRITICAL_SECTION_ENTER() #define ARMCI_CRITICAL_SECTION_EXIT() #endif /************ locality information **********************************************/ typedef int armci_domain_t; #define ARMCI_DOMAIN_SMP 0 /* SMP node domain for armci_domain_XXX calls */ extern int armci_domain_nprocs(armci_domain_t domain, int id); extern int armci_domain_id(armci_domain_t domain, int glob_proc_id); extern int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id); extern int armci_domain_my_id(armci_domain_t domain); extern int armci_domain_count(armci_domain_t domain); extern int armci_domain_same_id(armci_domain_t domain, int proc); extern int armci_smp_master(int); /* PVM group * On CrayT3E: the default group is the global group which is (char *)NULL * It is the only working group. * On Workstations: the default group is "mp_working_group". User can set * the group name by calling the ARMCI_PVM_init (defined * in message.c) and passing the group name to the library. */ extern char *mp_group_name; /*********************stuff for non-blocking API******************************/ /*\ the request structure for non-blocking api. \*/ typedef struct{ #ifdef BGML int data[4]; /* tag, bufid, agg_flag, op, proc */ double dummy[72]; /* bg1s_t, count, extra */ #else int data[4]; #if defined(_AIX) # if defined(__64BIT__) double dummy[27]; /*lapi_cntr_t is 200 bytes, using 216 just to be safe*/ # else double dummy[24]; /*lapi_cntr_t is 148 bytes, using 166 just to be safe*/ # endif #elif defined(ALLOW_PIN) void *dummy[2];/*2 cause itshould be aligned after we cast hdl_t to ihdl_t*/ #else double dummy; #endif #endif } armci_hdl_t; #define armci_req_t armci_hdl_t typedef int ARMCI_Group; extern void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out); extern void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *group_parent); extern void ARMCI_Group_free(ARMCI_Group *group); extern int ARMCI_Group_rank(ARMCI_Group *group, int *rank); extern void ARMCI_Group_size(ARMCI_Group *group, int *size); extern void ARMCI_Group_set_default(ARMCI_Group *group); extern void ARMCI_Group_get_default(ARMCI_Group *group_out); extern void ARMCI_Group_get_world(ARMCI_Group *group_out); extern int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes,ARMCI_Group *group); extern int ARMCI_Free_group(void *ptr, ARMCI_Group *group); extern int ARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbPutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbGetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handler/*armci_non-blocking request handle*/ ); extern int ARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueFloat(float src,/* value in a register to put */ void *dst,/* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueDouble(double src,/* value in a register to put */ void *dst,/* dest starting addr to put data*/ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_Wait(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_Test(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_WaitAll (void); extern int ARMCI_WaitProc (int proc); extern void ARMCI_SET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); extern void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); #define ARMCI_INIT_HANDLE(hdl) do {((double *)((hdl)->data))[0]=0; \ ((double *)((hdl)->data))[1]=0; }while(0) /* -------------- ARMCI Non-collective memory allocator ------------- */ typedef struct armci_meminfo_ds { char * armci_addr; /* remote address of the creator which can be used in ARMCI communication */ char *addr; /* local address of creator which can be used in to set SMP memoffset, armci_set_mem_offset() */ size_t size; /* size of remote pid's segment (bytes) */ int cpid; /* armci pid of creator */ long idlist[64]; } armci_meminfo_t; extern void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg); extern void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset); extern void ARMCI_Memdt(armci_meminfo_t *meminfo, long offset); extern void ARMCI_Memctl(armci_meminfo_t *meminfo); /* ------------------- ARMCI Checkpointing/Recovery ----------------- */ #ifdef DO_CKPT #define ARMCI_CKPT 0 #define ARMCI_RESTART 1 typedef struct { void **ptr_arr; size_t *sz; int *saveonce; int count; }armci_ckpt_ds_t; void ARMCI_Ckpt_create_ds(armci_ckpt_ds_t *ckptds, int count); int ARMCI_Ckpt_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds); int ARMCI_Ckpt(int rid); void ARMCI_Ckpt_finalize(int rid); #define ARMCI_Restart_simulate armci_irecover # ifdef MSG_COMMS_MPI ARMCI_Group * ARMCI_Get_ft_group(); # endif #endif /* ------------------------------------------------------------------ */ #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* _ARMCI_H */ ga-5-4/armci/src-portals/rmw.c0000644000175000017500000000676712662210425014365 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: rmw.c,v 1.24.2.5 2007-08-29 17:32:47 manoj Exp $ */ #include "armcip.h" #include "locks.h" #include "copy.h" #include #if defined(__i386__) || defined(__x86_64__) # include "atomics-i386.h" #endif #ifdef LIBELAN_ATOMICS ELAN_ATOMIC *a; int elan_int_fadd(int *target, int inc, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); return(result); } int elan_long_fadd(long *target, long inc, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #endif return(result); } int elan_int_swap(int *target, int value, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); return(result); } int elan_long_swap(long *target, long value, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #endif return(result); } #endif /* LIBELAN_ATOMICS */ /* enable use of newer interfaces in SHMEM */ #ifndef CRAY #ifndef LIBELAN_ATOMICS /* manpages for shmem_fadd exist on the T3E but library code does not */ #define SHMEM_FADD #endif #endif /* global scope to prevent compiler optimization of volatile code */ int _a_temp; long _a_ltemp; void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif ARMCI_PR_DBG("enter",0); NATIVE_LOCK(lock,proc); switch (op) { case ARMCI_FETCH_AND_ADD: armci_get(prem,ploc,sizeof(int),proc); _a_temp = *(int*)ploc + extra; armci_put(&_a_temp,prem,sizeof(int),proc); break; case ARMCI_FETCH_AND_ADD_LONG: armci_get(prem,ploc,sizeof(long),proc); _a_ltemp = *(long*)ploc + extra; armci_put(&_a_ltemp,prem,sizeof(long),proc); break; case ARMCI_SWAP: #if (defined(__i386__) || defined(__x86_64__)) if(SERVER_CONTEXT || armci_nclus==1){ atomic_exchange(ploc, prem, sizeof(int)); } else #endif { armci_get(prem,&_a_temp,sizeof(int),proc); armci_put(ploc,prem,sizeof(int),proc); *(int*)ploc = _a_temp; } break; case ARMCI_SWAP_LONG: armci_get(prem,&_a_ltemp,sizeof(long),proc); armci_put(ploc,prem,sizeof(long),proc); *(long*)ploc = _a_ltemp; break; default: armci_die("rmw: operation not supported",op); } /*TODO memfence here*/ NATIVE_UNLOCK(lock,proc); ARMCI_PR_DBG("exit",0); } int PARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { if(!SAMECLUSNODE(proc)){ armci_rem_rmw(op, ploc, prem, extra, proc); return 0; } switch (op) { case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: case ARMCI_SWAP: case ARMCI_SWAP_LONG: armci_generic_rmw(op, ploc, prem, extra, proc); break; default: armci_die("rmw: operation not supported",op); } return 0; } ga-5-4/armci/src-portals/buffers.c0000644000175000017500000007241012662210425015200 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: buffers.c,v 1.29.6.9 2007-07-02 05:16:50 d3p687 Exp $ **/ #define SIXTYFOUR 64 #define DEBUG_ 0 #define DEBUG2_ 0 #define EXTRA_ERR_CHECK /**********************************************************************/ #include #include #include #include "armcip.h" #include "request.h" #ifdef WIN32 # include typedef unsigned long ssize_t; #else # include #endif # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) /* the following symbols should be defined if needed in protocol specific header file: BUF_EXTRA_FIELD, BUF_ALLOCATE */ #ifndef BUF_ALLOCATE # define BUF_ALLOCATE malloc #endif #if defined PORTALS # define SMALL_BUF_LEN PORTALS_SMALL_BUF_SIZE #else # if defined(SERV_QUEUE) # define SMALL_BUF_LEN 4096 # else # define SMALL_BUF_LEN 2048 # endif #endif #ifndef MSG_BUFLEN_SMALL # define MSG_BUFLEN_SMALL (MSG_BUFLEN >>0) #endif #define LEFT_GUARD 11.11e11 #define RIGHT_GUARD 22.22e22 #define CLEAR_TABLE_SLOT(idx) *((int*)(_armci_buf_state->table+(idx))) =0 #ifndef BUF_NET_INIT #define BUF_NET_INIT(x,xX,Xx) #endif _buf_ackresp_t *_buf_ackresp_first,*_buf_ackresp_cur; /* we allow multiple buffers (up to 15) per single request * adjacent buffers can be coalesced into a large one */ typedef struct { int op; /* pending operation code */ int snd; /* if 1 then buffer is used for sending request */ int rcv; /* if 1 then buffer is used for receiving data */ int async; /* if 1 then request is nonblocking */ int first; /* id of the 1st buffer in the set in same request */ int count; /* count is not used and is always 1 (or 0???) */ /*unsigned int count:4; \* how many buffers used for this request 8 possible */ int busy; /* if 1 buffer is used and cannot be completed */ int cmpl; /* set to 1 if buffer was completed and can be released */ int to; /* serv/proc to which request was sent, 8172 possible */ }buf_state_t; #ifndef BUFID_PAD_T #define BUFID_PAD_T BUF_INFO_T #endif /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[MSG_BUFLEN_SMALL]; } buf_ext_t; /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[SMALL_BUF_LEN]; } buf_smext_t; /* we keep table and buffer pointer together for better locality */ typedef struct { double left_guard; /* stamp to verify if array was corrupted */ buf_state_t table[MAX_BUFS+MAX_SMALL_BUFS]; /*array with state of buffer */ buf_ext_t *buf; /* address of buffer pool */ buf_smext_t *smallbuf; /* address of the large buffer pool */ int avail; int smavail; int pad; double right_guard; /* stamp to verify if array was corrupted */ unsigned buf_bitmap; /* bitmaps to track available buffers: */ unsigned smbuf_bitmap;/* 1 - available, 0 - not available */ } reqbuf_pool_t; #ifndef BUF_EXTRA_FIELD_T # define SIZE_BUF_EXTRA_FIELD 0 # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) #else # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) #endif #define BUF_TO_BUFINDEX(buf) (BUF_TO_EBUF((buf)))->id.bufid #define BUF_TO_SMBUFINDEX(buf) (BUF_TO_SMEBUF((buf)))->id.bufid buf_ext_t *_armci_buffers; /* these are the actual buffers */ buf_smext_t *_armci_smbuffers; /* no, these are the actual buffers */ reqbuf_pool_t* _armci_buf_state; /* array that describes state of each buf */ extern active_socks_t *_armci_active_socks; /* returns bufinfo, given bufid */ INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid) { if (bufid < 0 || bufid >= (MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("_armci_id_to_bufinfo: bad id",bufid,MAX_BUFS); return bufid < MAX_BUFS ? &(_armci_buf_state->buf[bufid].id) : &(_armci_buf_state->smallbuf[bufid-MAX_BUFS].id); } /*\ we allocate alligned buffer space * this operation can be implemented in platform specific files \*/ void _armci_buf_init() { char *tmp; int extra=0; int smallbuf_size = sizeof(buf_smext_t)*(MAX_SMALL_BUFS); // tmp = (char *) BUF_ALLOCATE((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64)); tmp = (char *) malloc((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64)); bzero(tmp,MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64); extra= ALIGN64ADD(tmp); _armci_buffers = (buf_ext_t *) (tmp + extra); tmp = (char *)(_armci_buffers + MAX_BUFS); extra = ALIGN64ADD(tmp); _armci_smbuffers = (buf_smext_t *) (tmp + extra); if(DEBUG2_){ printf("%d:armci_init_bufs: pointer %p, before align ptr=%p bufptr=%p end of region is %p size=%d extra=%d\n", armci_me,_armci_buffers,tmp,_armci_buffers->buffer,(_armci_buffers+MAX_BUFS), MAX_BUFS*sizeof(buf_ext_t),extra); fflush(stdout); } /* now allocate state array */ tmp = malloc(sizeof(reqbuf_pool_t) + 64); bzero(tmp,sizeof(reqbuf_pool_t) + 64); if(!tmp)armci_die("_armci_buf_init calloc failed",0); extra= ALIGN64ADD(tmp); _armci_buf_state = (reqbuf_pool_t*)(tmp + extra); /* initialize it */ _armci_buf_state->left_guard = LEFT_GUARD; _armci_buf_state->right_guard = RIGHT_GUARD; _armci_buf_state->avail =0; _armci_buf_state->smavail =MAX_BUFS; _armci_buf_state->buf = _armci_buffers; _armci_buf_state->smallbuf = _armci_smbuffers; _buf_ackresp_first=_buf_ackresp_cur=NULL; if(BUF_TO_EBUF(_armci_buf_state->buf[0].buffer)!=_armci_buf_state->buf) armci_die("buffers.c, internal structure alignment problem",0); } /*\ convert buffer pointer to index (in state array) \*/ int _armci_buf_to_index(void *buf) { int index; char *ptr = (char*)buf; if(DEBUG2_){ printf("%d: in _armci_buf_to_index %p\n",armci_me, buf); fflush(stdout); } if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ index = BUF_TO_BUFINDEX(ptr); if((index >= MAX_BUFS)|| (index<0)) armci_die2("armci_buf_to_index: bad index:",index,MAX_BUFS); return(index); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ index = BUF_TO_SMBUFINDEX(ptr); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (indextable + index; ARMCI_PR_DBG("enter",0); if(index>=MAX_BUFS){ int relidx; relidx = index-MAX_BUFS; CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); } else CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[index].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); ARMCI_PR_DBG("exit",0); } /*\ complete outstanding operation that uses the specified buffer \*/ void _armci_buf_complete_index(int idx, int called) { int count; buf_state_t *buf_state = _armci_buf_state->table +idx; portals_ds_req_t *req = NULL; count = buf_state->count; if(DEBUG_ || 0) { printf("%d:buf_complete_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("complete_buf_index:inconsistent Index:",idx,buf_state->first); } /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx,rr; relidx = idx-MAX_BUFS; //printf("\n%d:in clear idx=%d %d",armci_me,idx,_armci_buf_state->smallbuf[relidx].id.tag);fflush(stdout); /* ------------------------------------------------------------------------------------------- *\ active buffers need to be completed \* ------------------------------------------------------------------------------------------- */ # ifdef PORTALS req = &_armci_buf_state->smallbuf[relidx].id.ar.req; if(req->active) { // printf("%s [cp buf_complete_index] waiting on request %p\n",Portals_ID(),req); portalsWaitOnRequest(req); // printf("%s [cp buf_complete_index] request %p completed\n",Portals_ID(),req); } else { // printf("%s [cp buf_complete_index] request %p already completed\n",Portals_ID(),req); } # else if(_armci_buf_state->smallbuf[relidx].id.tag && (_armci_buf_state->smallbuf[relidx].field)->tag>0) { printf("%s [cp] calling armci_client_complete\n",Portals_ID()); rr=armci_client_complete(0,buf_state->to,_armci_buf_state->smallbuf[relidx].id.tag,_armci_buf_state->smallbuf[relidx].field); } CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); # endif /*later, we might just need to do this for all operations, not just get*/ # ifdef PORTALS_ALLOW_NBGETS if(_armci_buf_state->smallbuf[relidx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->smallbuf[relidx].id), _armci_buf_state->smallbuf[relidx].buffer); } # endif _armci_buf_state->smallbuf[relidx].id.tag=0; } else { int rr; /* ------------------------------------------------------------------------------------------- *\ active buffers need to be completed \* ------------------------------------------------------------------------------------------- */ # ifdef PORTALS req = &_armci_buf_state->buf[idx].id.ar.req; if(req->active) portalsWaitOnRequest(req); # else if(_armci_buf_state->buf[idx].id.tag && (_armci_buf_state->buf[idx].field)->tag>0 ) rr=armci_client_complete(0,buf_state->to,_armci_buf_state->buf[idx].id.tag,_armci_buf_state->buf[idx].field); CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); //printf("\n%d:in clear large idx=%d %d",armci_me,idx,_armci_buf_state->buf[idx].id.tag);fflush(stdout); # endif /*later, we might just need to do this for all operations, not just get*/ # ifdef PORTALS_ALLOW_NBGETS if(_armci_buf_state->buf[idx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->buf[idx].id), _armci_buf_state->buf[idx].buffer); } # endif _armci_buf_state->buf[idx].id.tag=0; } /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) *(int*)buf_state = 0; } /*\ test outstanding operation that uses the specified buffer for complete * It is important not to change the state of the buffer, the buffer has * to remain as it was, only completion has to be indicated \*/ int _armci_buf_test_index(int idx, int called) { int count,retval=0; buf_state_t *buf_state = _armci_buf_state->table +idx; count = buf_state->count; if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("_buf_test_index:inconsistent index:",idx,buf_state->first); } # ifdef BUF_EXTRA_FIELD_T /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; /*printf("\n%d:relidx=%d \n",armci_me,relidx);fflush(stdout);*/ TEST_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } else { TEST_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } # endif if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d ret=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called,retval); fflush(stdout); } return(retval); } /** an addition to the below operation to allow for multiple outstanding operations per server node */ void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); int buf_pend_count=0; int changeid=0; nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if(_armci_buf_state->table[index].to<0){ _armci_buf_state->table[index].to = 0-1e6-_armci_buf_state->table[index].to; changeid=1; } if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_pend_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); buf_pend_count=0; for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) if( (buf_state->first != (unsigned int) this) && (buf_state->first==(unsigned int) i) && buf_state->op){ buf_pend_count++; if(buf_pend_count == NUM_SERV_BUFS){ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); break; } } } if(changeid)_armci_buf_state->table[index].to = 0-1e6-_armci_buf_state->table[index].to; } /*\ make sure that there are no other pending operations to that smp node * this operation is called from platforms specific routine that sends * request * we could have accomplished the same in armci_buf_get but as Vinod * is pointing out, it is better to delay completing outstanding * calls to overlap memcpy for the current buffer with communication \*/ void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_one_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } /*\ same as above but for process \*/ void _armci_buf_ensure_one_outstanding_op_per_proc(void *buf, int proc) { int i; int index = _armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; void _armci_buf_release_index(int i); if(_armci_buf_state->table[index].to !=(unsigned int) proc ) armci_die2("_armci_buf_ensure_one_outstanding_op_per_proc: bad to", proc, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if(buf_state->to == (unsigned int) proc) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } #define HISTORY__ #ifdef HISTORY typedef struct{ int size; int op; int count; int id; } history_t; history_t history[100]; int h=0; void print_history() { int i; fflush(stdout); printf("%d records\n",h); for(i=0; ibuf[history[i].id].buffer, history[i].count, history[i].op); fflush(stdout); } #endif /*\ call corresponding to GET_SEND_BUF \*/ char *_armci_buf_get_small(int size, int operation, int to) { int avail=_armci_buf_state->smavail,i; _buf_ackresp_t *ar; if(_armci_buf_state->table[avail].op || _armci_buf_state->table[avail].first || _armci_buf_state->smallbuf[avail-MAX_BUFS].id.ar.req.active) { for(i=MAX_BUFS;itable[i].op && !_armci_buf_state->table[i].first && !_armci_buf_state->smallbuf[i-MAX_BUFS].id.ar.req.active) break; } if(i<(MAX_SMALL_BUFS+MAX_BUFS))avail = i; else { _armci_buf_complete_index(avail,1); } } _armci_buf_state->table[avail].op = operation; _armci_buf_state->table[avail].to = to; _armci_buf_state->table[avail].count= 1; _armci_buf_state->table[avail].first = avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.tag=0; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.bufid= avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.protocol=0; ar=&_armci_buf_state->smallbuf[avail-MAX_BUFS].id.ar; assert(ar->val==0);assert(ar->next==NULL);assert(ar->previous==NULL); # ifdef PORTALS assert(ar->req.active == 0); # endif ar->req.active = 1; if(_buf_ackresp_cur!=NULL) _buf_ackresp_cur->next=ar; if(_buf_ackresp_first==NULL) _buf_ackresp_first=ar; ar->previous=_buf_ackresp_cur; ar->next=NULL; _buf_ackresp_cur=ar; if(DEBUG_ || 0) { printf("%d:buf_get_sm1:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, (int)_armci_buf_state->table[avail].count,(int)_armci_buf_state->table[avail].first); fflush(stdout); } # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->smallbuf[avail-MAX_BUFS].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif _armci_buf_state->smavail = (avail+1-MAX_BUFS)%MAX_SMALL_BUFS + MAX_BUFS; if(DEBUG_ || 0) { printf("%d:buf_get_sm:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, _armci_buf_state->table[avail].count,_armci_buf_state->table[avail].first); fflush(stdout); } return(_armci_buf_state->smallbuf[avail-MAX_BUFS].buffer); } /*\ call corresponding to GET_SEND_BUF \*/ static char *rmo_buffer = NULL; char *_armci_buf_get(int size, int operation, int to) { #ifndef PORTALS_USE_ARMCI_CLIENT_BUFFERS if(rmo_buffer) return rmo_buffer; rmo_buffer = (char *) valloc(MSG_BUFLEN); return rmo_buffer; #else int avail=_armci_buf_state->avail; int count=1, i; _buf_ackresp_t *ar; /*if small buffer, we go to another routine that gets smallbuf*/ if(size MSG_BUFLEN_SMALL) ){ double val = (double)size; /* use double due to a bug in gcc */ val /= MSG_BUFLEN_SMALL; count=(int)val; if(size%MSG_BUFLEN_SMALL) count++; assert(0); } /* start from 0 if there is not enough bufs available from here */ if((avail+count) > MAX_BUFS)avail = 0; /* avail should never point to buffer in a middle of a set of used bufs */ if(_armci_buf_state->table[avail].op && (_armci_buf_state->table[avail].first != (unsigned int) avail)){ sleep(1); printf("%d: inconsistent first. avail=%d count=%d first=%d size=%d\n", armci_me, avail, count, _armci_buf_state->table[avail].first, size); armci_die2("armci_buf_get: inconsistent first", avail, _armci_buf_state->table[avail].first); } /* we need complete "count" number of buffers */ for(i=0;itable[cur].op && _armci_buf_state->table[cur].first==(unsigned int) cur) || _armci_buf_state->buf[cur].id.ar.req.active) { _armci_buf_complete_index(cur,1); } } for(i=0; itable[avail+i].op = operation; _armci_buf_state->table[avail+i].to = to; _armci_buf_state->table[avail+i].count= count; _armci_buf_state->table[avail+i].first = avail; } _armci_buf_state->buf[avail].id.tag=0; _armci_buf_state->buf[avail].id.bufid=avail; _armci_buf_state->buf[avail].id.protocol=0; ar=&_armci_buf_state->buf[avail].id.ar; assert(ar->val==0);assert(ar->next==NULL);assert(ar->previous==NULL); assert(ar->req.active == 0); ar->req.active = 1; if(_buf_ackresp_cur!=NULL) _buf_ackresp_cur->next=ar; if(_buf_ackresp_first==NULL) _buf_ackresp_first=ar; ar->previous=_buf_ackresp_cur; ar->next=NULL; _buf_ackresp_cur = ar; # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->buf[avail].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif #ifdef HISTORY history[h].size=size; history[h].op=operation; history[h].count=count; history[h].id = avail; h++; #endif if(DEBUG_ || 0) { printf("%d:buf_get:size=%d max=%d got %d ptr=%p count=%d op=%d to=%d\n", armci_me,size,MSG_BUFLEN_SMALL,avail, _armci_buf_state->buf[avail].buffer, count,operation,to); fflush(stdout); } /* select candidate buffer for next allocation request */ _armci_buf_state->avail = avail+count; _armci_buf_state->avail %= MAX_BUFS; return(_armci_buf_state->buf[avail].buffer); #endif } void _armci_buf_release_index(int index) { int count; buf_state_t *buf_state = _armci_buf_state->table +index; char *_armci_buf_ptr_from_id(int id); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (index<0)) armci_die2("armci_buf_release: bad index:",index,MAX_BUFS); count = _armci_buf_state->table[index].count; if(DEBUG_ || 0) { printf("%d:_armci_buf_release_index %d ptr=%p count=%d op=%d smavail=%d\n", armci_me,index,_armci_buf_ptr_from_id(index),count, _armci_buf_state->table[index].op,_armci_buf_state->smavail); fflush(stdout); } /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) *(int*)buf_state = 0; if(index >= MAX_BUFS){ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=0; //_armci_buf_state->smavail = index; } else{ _armci_buf_state->buf[index].id.tag=0; // _armci_buf_state->avail = index; } /* the current buffer is prime candidate to satisfy next buffer request */ } /*\ release buffer when it becomes free \*/ void _armci_buf_release(void *buf) { #ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS _armci_buf_release_index(_armci_buf_to_index(buf)); #endif } /*\ return pointer to buffer number id \*/ char *_armci_buf_ptr_from_id(int id) { if(id <0 || id >=(MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("armci_buf_ptr_from_id: bad id",id,MAX_BUFS); if(id >=MAX_BUFS)return(_armci_buf_state->smallbuf[id-MAX_BUFS].buffer); return(_armci_buf_state->buf[id].buffer); } /*\function called from PARMCI_Wait to wait for non-blocking ops \*/ void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode) { int i=0; #if 0 printf("\n%d:wait called with bufid=%d tag=%d \n",armci_me,bufid,tag); fflush(stdout); #endif if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag) _armci_buf_complete_index(i,1); } for(i=0;ismallbuf[i].id.tag) _armci_buf_complete_index(i+MAX_BUFS,1); } *retcode=0; } else { if(bufidbuf[bufid].id.tag) _armci_buf_complete_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) _armci_buf_complete_index(bufid,1); } *retcode=0; } } /*\function called from PARMCI_Test to test completion of non-blocking ops \*/ void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode) { int i; if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag){ if(_armci_buf_test_index(i,1)){ *retcode=1; break; } } } for(i=0;ismallbuf[i].id.tag) if(_armci_buf_test_index(i+MAX_BUFS,1)){ *retcode=1; break; } } } else { if(bufidbuf[bufid].id.tag) *retcode = _armci_buf_test_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) *retcode = _armci_buf_test_index(bufid,1); } } } /*\function to set the buffer tag and the protocol \*/ void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol) { int index = _armci_buf_to_index(bufptr); /*_armci_buf_state->table[index].async=1;*/ if(indexbuf[index].id.tag=tag; _armci_buf_state->buf[index].id.protocol=protocol; } else{ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=tag; _armci_buf_state->smallbuf[index-MAX_BUFS].id.protocol=protocol; } } int _armci_buf_get_tag(void *bufptr) { int index = _armci_buf_to_index(bufptr); if(indexbuf[index].id.tag); else return(_armci_buf_state->smallbuf[index-MAX_BUFS].id.tag); } /*\function to return bufinfo, given buf ptr \*/ BUF_INFO_T *_armci_buf_to_bufinfo(void *buf){ if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ return(&((BUF_TO_EBUF(buf))->id)); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ return(&((BUF_TO_SMEBUF(buf))->id)); } else { armci_die("armci_buf_to_index: bad pointer",0); return(0); } } /*\function to clear all buffers \*/ void _armci_buf_clear_all() { int i; for(i=0;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[i].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } for(i=MAX_BUFS;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[i-MAX_BUFS].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } } /* function to return bufinfo, given buf tag */ BUF_INFO_T *_armci_tag_to_bufinfo(msg_tag_t tag) { int idx; for (idx=0; idx < MAX_BUFS; idx++) if (EQ_TAGS(_armci_buffers[idx].id.tag, tag)) break; if (idx == MAX_BUFS) {/* not found is regular buffers */ for (idx = 0; idx < MAX_SMALL_BUFS; idx++) if (EQ_TAGS(_armci_smbuffers[idx].id.tag, tag)) break; if (idx == MAX_SMALL_BUFS) /* not found at all */ armci_die("_armci_tag_to_bufinfo: bad tag",0); return &(_armci_smbuffers[idx].id); } else return &(_armci_buffers[idx].id); } /* inline primitives for buffer state management */ INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to) { char *buf = _armci_buf_get(size, operation, to); _armci_buf_set_busy(buf, 0); return buf; } INLINE void _armci_buf_set_busy(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].busy = state; } INLINE void _armci_buf_set_busy_idx(int idx, int state) { _armci_buf_state->table[idx].busy = state; } #if 0 INLINE int _armci_buf_cmpld(void *buf) { return _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl; } #else INLINE int _armci_buf_cmpld(int bufid) { return _armci_buf_state->table[bufid].cmpl; } #endif INLINE void _armci_buf_set_cmpld(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl = state; } INLINE void _armci_buf_set_cmpld_idx(int idx, int state) { _armci_buf_state->table[idx].cmpl = state; } ga-5-4/armci/src-portals/vector.c0000644000175000017500000004313512662210425015050 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: vector.c,v 1.32.6.4 2007-08-29 17:32:32 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #include #include #define SERVER_GET 1 #define SERVER_NBGET 2 #define DIRECT_GET 3 #define DIRECT_NBGET 4 #define SERVER_PUT 5 #define SERVER_NBPUT 6 #define DIRECT_PUT 7 #define DIRECT_NBPUT 8 # define DO_FENCE(__proc,__prot) if(__prot==SERVER_GET);\ else if(__prot==SERVER_PUT);\ else if(__prot==DIRECT_GET || __prot==DIRECT_NBGET){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else if(__prot==DIRECT_PUT || __prot==DIRECT_NBPUT){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else;\ armci_prot_switch_fence[__proc]=__prot /* typedef struct { float real; float imag; } complex_t; typedef struct { double real; double imag; } dcomplex_t; */ /* void I_ACCUMULATE(void* scale, int elems, void*src, void* dst) { int j; int *a=(int*)dst, *b=(int*)src; int alpha = *(int*)scale; for(j=0;j BUFSIZE/2){ /* for large segments use strided implementation */ for(j=0; j< dr.ptr_array_len; j++){ rc = armci_acc_copy_strided(op, scale,proc, dr.src_ptr_array[j], NULL, dr.dst_ptr_array[j],NULL, &dr.bytes, 0); if(rc)return(rc); } }else{ armci_giov_t dl; /*lock memory:should optimize it to lock only a chunk at a time*/ armci_lockmem_scatter(dr.dst_ptr_array, dr.ptr_array_len, dr.bytes, proc); /* copy as many blocks as possible into the local buffer */ dl.bytes = dr.bytes; nb = ARMCI_MIN(PWORKLEN,BUFSIZE/dr.bytes); for(j=0; j< dr.ptr_array_len; j+= nb){ int nblocks = ARMCI_MIN(nb, dr.ptr_array_len -j); int k; /* setup vector descriptor for remote memory copy to bring data into buffer*/ dl.ptr_array_len = nblocks; dl.src_ptr_array = dr.dst_ptr_array + j; /* GET destination becomes source for copy */ for(k=0; k< nblocks; k++) pwork[k] = k*dl.bytes + (char*)armci_internal_buffer; dl.dst_ptr_array = pwork; /* get data to the local buffer */ rc = armci_copy_vector(GET, &dl, 1, proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} /* update source array for accumulate */ dl.src_ptr_array = dr.src_ptr_array +j; /* do scatter accumulate updating copy of data in buffer */ armci_scatter_acc(op, scale, dl, armci_me, 0); /* modify descriptor-now source becomes destination for PUT*/ dl.dst_ptr_array = dr.dst_ptr_array + j; dl.src_ptr_array = pwork; /* put data back */ rc = armci_copy_vector(PUT, &dl, 1, proc); FENCE_NODE(proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} } ARMCI_UNLOCKMEM(proc); } }/*endfor*/ } #endif return 0; } int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int i,s,shmem= SAMECLUSNODE(proc); int armci_th_idx = ARMCI_THREAD_IDX; if(shmem){ /* local/shared memory copy */ for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s],darr[i].bytes); } } }else { switch(op){ case PUT: for(i = 0; i< len; i++){ UPDATE_FENCE_STATE(proc, PUT, darr[i].ptr_array_len); for( s=0; s< darr[i].ptr_array_len; s++){ armci_put(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes, proc); } } break; case GET: for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_get(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes,proc); } } break; default: armci_die("armci_copy_vector: wrong optype",op); } } return 0; } void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],ptr,darr[i].bytes); ptr += darr[i].bytes; } } } void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(ptr, darr[i].dst_ptr_array[s],darr[i].bytes); ptr += darr[i].bytes; } } } int PARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(PUT,proc); /* ensure ordering */ direct=SAMECLUSNODE(proc); if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); rc = armci_copy_vector(PUT, darr, len, proc); } else{ DO_FENCE(proc,SERVER_PUT); rc = armci_pack_vector(PUT, NULL, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } int PARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(GET,proc); /* ensure ordering */ #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_copy_vector(GET, darr, len, proc); } else{ DO_FENCE(proc,SERVER_GET); rc = armci_pack_vector(GET, NULL, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } int PARMCI_AccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=0; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(op,proc); /* ensure ordering */ direct=SAMECLUSNODE(proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # error "grrr" # endif if(direct) { rc = armci_acc_vector( op, scale, darr, len, proc); } else { DO_FENCE(proc,SERVER_PUT); rc = armci_pack_vector(op, scale, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } /*****************************************************************************/ /*\ Non-blocking vector API \*/ int PARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; direct=SAMECLUSNODE(proc); /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, PUT, nb_handle); return rc; } } else { /*ORDER(PUT,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = PUT; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(PUT, proc); } if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); rc = armci_copy_vector(PUT, darr, len, proc); } else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_vector(PUT, NULL, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } int PARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; direct=SAMECLUSNODE(proc); /* aggregate get */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, GET, nb_handle); return rc; } } else { /* ORDER(GET,proc); ensure ordering */ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(GET, proc); } if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_copy_vector(GET, darr, len, proc); } else{ DO_FENCE(proc,SERVER_NBGET); rc = armci_pack_vector(GET, NULL, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } int PARMCI_NbAccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; UPDATE_FENCE_INFO(proc); direct=SAMECLUSNODE(proc); if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(op, proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct) rc = armci_acc_vector( op, scale, darr, len, proc); else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_vector(op, scale, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } /*****************************************************************************/ ga-5-4/armci/src-portals/fence.c0000644000175000017500000000362112662210425014622 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: fence.c,v 1.25.4.6 2007-08-30 19:17:02 manoj Exp $ */ #include "armcip.h" #include "armci.h" #include "copy.h" #include #if defined(PVM) # include #elif defined(TCGMSG) # include #elif defined(BGML) # include "bgml.h" #else # include #endif char *_armci_fence_arr; void armci_init_fence() { #if defined (DATA_SERVER) _armci_fence_arr=calloc(armci_nproc,1); if(!_armci_fence_arr)armci_die("armci_init_fence: calloc failed",0); #endif } void ARMCI_DoFence(int proc) { int i; if(!SAMECLUSNODE(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); armci_rem_ack(cluster); } } void PARMCI_Fence(int proc) { int i; #if defined(DATA_SERVER) && !(defined(GM) && defined(ACK_FENCE)) // printf("%d [cp] fence_arr(%d)=%d\n",armci_me,proc,FENCE_ARR(proc)); if(FENCE_ARR(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); int master=armci_clus_info[cluster].master; armci_rem_ack(cluster); /* one ack per cluster node suffices */ /* note, in multi-threaded case it will only clear for current thread */ bzero(&FENCE_ARR(master),armci_clus_info[cluster].nslave); } #elif defined(BGML) BGML_WaitProc(proc); MEM_FENCE; #else FENCE_NODE(proc); MEM_FENCE; #endif } /* portals developers' note: armci fence is not guaranteed to be correct unless PUT_START events are captured PUT_ENDs do NOT guarantee order; only PUT_STARTs */ void PARMCI_AllFence() { #if defined(CLUSTER) { int p; for(p=0;p #include #include "armcip.h" #include "message.h" #include #include #include #include #include #define DEBUG_COMM 0 #define DEBUG_INIT 0 #define DEBUG_SERV 0 #define PUT_LOCAL_ONLY_COMPLETION__ typedef struct arminfo{ caddr_t ptr[MAX_DS]; size_t size[MAX_DS]; long serv_offs[MAX_DS]; int cur_ds; }rm_info_t; static rm_info_t *all_meminfo; static int client_md_count=0,serv_md_count=0; typedef struct arns{ long data; long data1; struct arns *next; } arnode; #ifdef ARMCI_CHECK_STATE arnode * arlist_add(arnode **p, long i,long j) { arnode *n = (arnode *)malloc(sizeof(arnode)); if(n == NULL) return NULL; n->next = *p; *p = n; n->data = i; n->data1 = j; return *p; } void arlist_remove(arnode **p) { if(*p != NULL){ arnode *n = *p; *p = (*p)->next; free(n); } } arnode **arlist_search(arnode **n, long i) { while (*n != NULL){ if ((*n)->data == i){ return n; } n = &(*n)->next; } return NULL; } void arlist_print(arnode *n) { if (n == NULL){ /*printf("arlist is empty\n");*/ } while (n != NULL){ printf("%d:%d %d next=%d\n", armci_me,n->data,n->data1,(n->next==NULL)?0:1); n = n->next; } } #endif extern void armci_util_wait_int(volatile int *, int , int ); extern void armci_util_wait_long(volatile long *, long, int ); int _armci_portals_server_ready=0; int _armci_portals_client_ready=0; int _armci_server_mutex_ready=0; void *_armci_server_mutex_ptr = NULL; #ifdef ARMCI_REGISTER_SHMEM typedef struct { void *base_ptr; void *serv_ptr; size_t size; int islocal; int valid; }aptl_reginfo_t; typedef struct { aptl_reginfo_t reginfo[MAX_MEM_REGIONS]; int reg_count; } rem_meminfo_t; #endif typedef struct serv_buf_t{ ptl_handle_md_t md_h; ptl_handle_me_t me_h; ptl_md_t md; char *buf; char *bufend; } serv_buf_t; char **client_buf_ptrs; static int armci_server_terminating=0; serv_buf_t *serv_bufs; long servackval=ARMCI_STAMP,*serv_ack_ptr=&servackval; ptl_handle_md_t serv_ack_md_h,serv_response_md_h; static armci_portals_proc_t _armci_portals_proc_struct; static armci_portals_serv_t _armci_portals_serv_struct; static armci_portals_proc_t *portals = &_armci_portals_proc_struct; static armci_portals_serv_t *serv_portals = &_armci_portals_serv_struct; /*static */comp_desc _compdesc_array[NUM_COMP_DSCR]; static arnode *arn = NULL; #ifdef ARMCI_REGISTER_SHMEM static rem_meminfo_t *_rem_meminfo; static aptl_reginfo_t *_tmp_rem_reginfo; #define IN_REGION(_ptr__,_reg__) ((_reg__.valid) && (_ptr__)>=(_reg__.serv_ptr) \ && (_ptr__) <= ( (char *)(_reg__.serv_ptr)+_reg__.size)) #endif static int ptl_initialized = 0; extern pid_t server_pid; ptl_ni_limits_t armci_ptl_nilimits; ptl_ni_limits_t armci_ptl_Snilimits; void armci_portals_init_ptl() { int rc; int npes,i; ARMCI_PR_DBG("enter",0); /*initialize data structures*/ portals->ptl = ARMCI_PORTALS_PTL_NUMBER; /* our own ptl number */ rc=PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK,PTL_IFACE_SS), PTL_PID_ANY, NULL, &armci_ptl_nilimits, &(portals->ni_h)); switch(rc) { case PTL_OK: /*printf("\n%d:ok for nii\n",armci_me);*/ break; case PTL_IFACE_DUP: /*printf("\n%d:dup for nii\n",armci_me);*/ break; default: printf( "PtlNIInit() failed %d error=%s\n",rc,ARMCI_NET_ERRTOSTR(rc) ); exit(1); } if((rc=PtlGetId(portals->ni_h,&portals->rank)) !=PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n",FUNCTION_NAME, rc, server_pid); exit(1); } ARMCI_PR_DBG("exit",0); } static inline void init_serv_buf(serv_buf_t *tmp) { int rc; ptl_match_bits_t ignbits = 0xFFFFFFFFF00000FF; ptl_match_bits_t mbits; ptl_process_id_t match_id; ptl_md_t *md_ptr,md; ARMCI_PR_DBG("enter",0); tmp->md.user_ptr=tmp; tmp->md.start=tmp->buf; tmp->md.length=armci_nproc*NUM_SERV_BUFS*VBUF_DLEN; tmp->md.eq_handle=portals->Seq_h; tmp->md.max_size=0; tmp->md.threshold=PTL_MD_THRESH_INF; tmp->md.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; { match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; mbits = 16<<8; rc = PtlMEAttach(portals->Sni_h,portals->ptl,match_id,mbits,ignbits, PTL_RETAIN,PTL_INS_AFTER,&(tmp->me_h)); if (rc != PTL_OK) { printf("(%d):PtlMEAttach: %s\n", portals->Srank,ARMCI_NET_ERRTOSTR(rc)); armci_die("portals attach error isb",rc); } tmp->md.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE | PTL_MD_MANAGE_REMOTE; rc = PtlMDAttach((tmp->me_h),tmp->md,PTL_RETAIN,&(tmp->md_h)); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count) ); exit(1); } serv_md_count++; } /*set up for sending acks */ md_ptr = &(md); md_ptr->start = serv_ack_ptr; md_ptr->length = sizeof(long); md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = sizeof(long); md_ptr->eq_handle = portals->Seq_h; rc = PtlMDBind(portals->Sni_h,md,PTL_RETAIN,&serv_ack_md_h); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBindxn: %s %d\n", portals->Srank.nid, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count)); armci_die("ptlmdbind failed",0); } serv_md_count++; /*set up for sending response */ md_ptr = &(md); md_ptr->start = tmp->buf; md_ptr->length = tmp->md.length; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = tmp->md.length; md_ptr->eq_handle = portals->Seq_h; rc = PtlMDBind(portals->Sni_h, md, PTL_RETAIN, &serv_response_md_h); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBindxn: %s %d\n", portals->Srank.nid, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count)); armci_die("ptlmdbind failed",0); } serv_md_count++; ARMCI_PR_DBG("exit",0); } void armci_portals_wait_for_client() { int rc; int *procidinfo; extern armci_clus_t *armci_clus_info; ptl_process_id_t *tmp; ARMCI_PR_SDBG("enter",0); //printf(" "); armci_util_wait_int(&_armci_portals_client_ready,1,1000); if((armci_me)!=armci_master){ exit(0); } else{ if(DEBUG_SERV){ printf("\n%d:chosen one nid,pid=%d,%d\n",armci_me,portals->Srank.nid,portals->Srank.pid); } } ARMCI_PR_SDBG("exit",0); } void armci_portals_prepare_server() { int rc,i,j; ARMCI_PR_SDBG("enter",0); serv_bufs=(serv_buf_t *)malloc(sizeof(serv_buf_t)); bzero(serv_bufs,sizeof(serv_buf_t)); assert(serv_bufs); serv_bufs->buf=(char *)malloc((NUM_SERV_BUFS*armci_nproc*VBUF_DLEN)); bzero(serv_bufs->buf,(NUM_SERV_BUFS*armci_nproc*VBUF_DLEN)); assert(serv_bufs->buf); serv_bufs->bufend=(char *)serv_bufs->buf+(NUM_SERV_BUFS*armci_nproc*VBUF_DLEN); rc = PtlEQAlloc(portals->Sni_h,4*(NUM_SERV_BUFS*armci_nproc),NULL, &(portals->Seq_h)); if (rc != PTL_OK) { printf("(%d):Ptleaalloc() failed: %s %d (%d)\n",portals->Srank, ARMCI_NET_ERRTOSTR(rc),(NUM_SERV_BUFS*armci_nproc),rc); armci_die("EQ Alloc failed",rc); } init_serv_buf(serv_bufs); _armci_portals_server_ready=1; ARMCI_PR_SDBG("exit",0); } void *armci_server_code(void *data) { int rc,num_interface; ARMCI_PR_SDBG("enter",0); if(DEBUG_INIT) printf("%d: in server after creating thread.\n",armci_me); rc = PtlInit(&num_interface); if (rc != PTL_OK) { printf("PtlInit() failed %d %s\n",rc, ARMCI_NET_ERRTOSTR(rc) ); exit(1); } rc=PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK,PTL_IFACE_SS), PTL_PID_ANY, NULL, &armci_ptl_Snilimits, &(portals->Sni_h)); switch(rc) { case PTL_OK: //printf("\n(%d):ok for serv nii\n",armci_me); break; case PTL_IFACE_DUP: //printf("\n(%d):dup for serv nii\n",armci_me); break; default: printf( "PtlNIInit() serv failed %d error=%s\n",rc,ARMCI_NET_ERRTOSTR(rc) ); exit(1); } if((rc=PtlGetId(portals->Sni_h,&portals->Srank)) !=PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n",FUNCTION_NAME, rc, server_pid); exit(1); } /*printf("\n(%d):server nid=%d pid=%d\n",armci_me,portals->Srank.nid,portals->Srank.pid);*/ armci_portals_wait_for_client(); armci_portals_prepare_server(); if(DEBUG_INIT) { printf("(%d): connected to all computing processes\n",armci_me); fflush(stdout); } armci_call_data_server(); armci_transport_cleanup(); ARMCI_PR_SDBG("exit",0); return(NULL); } void armci_client_connect_to_servers() { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t md_local; ptl_handle_md_t md_hdl_local; ptl_process_id_t *tmp; int *procidinfo; int c_info; int *flag,shmid; void *addr; char *buf; extern int _armci_server_started; ARMCI_PR_DBG("enter",0); _armci_portals_client_ready=1; if(armci_me==armci_master){ armci_util_wait_int(&_armci_portals_server_ready,1,1000); } armci_msg_barrier(); _armci_server_started=1; if(armci_me==armci_master){ portals->servid_map[armci_clus_me].pid=portals->Srank.pid; portals->servid_map[armci_clus_me].nid=portals->Srank.nid; } armci_msg_gop_scope(SCOPE_ALL,portals->servid_map,(sizeof(ptl_process_id_t)*armci_nclus)/sizeof(int),"+",ARMCI_INT); ARMCI_PR_DBG("exit",0); } static int check_meminfo(void *ptr, long size, int proc) { int i; for(i=0;i=0) && (right>=size)) return(i+1); } return 0; } static void add_meminfo(void *ptr, size_t size, int proc) { if(check_meminfo(ptr,(long)size,proc)!=0)armci_die("repeat add request for dss",proc); all_meminfo[proc].cur_ds++; all_meminfo[proc].ptr[all_meminfo[proc].cur_ds]=ptr; all_meminfo[proc].size[all_meminfo[proc].cur_ds]=size; #ifdef DEBUG_MEM printf("\n%d:%s:adding %p %ld %d at %d",armci_me,FUNCTION_NAME,ptr,size,proc,all_meminfo[proc].cur_ds); #endif } typedef struct{ void *ptr; size_t size; size_t serv_offs; } meminfo_t; void armci_exchange_meminfo(void *ptr, size_t size,size_t off) { int i; meminfo_t *exng; exng = (meminfo_t*)malloc(armci_nproc*sizeof(meminfo_t)); assert(exng != NULL); bzero(exng,sizeof(meminfo_t)*armci_nproc); exng[armci_me].ptr=ptr; exng[armci_me].size=size; exng[armci_me].serv_offs = off; armci_msg_gop_scope(SCOPE_ALL,exng,(sizeof(meminfo_t)*armci_nproc)/sizeof(int),"+",ARMCI_INT); for(i=0;ibrval[portals->cur_ds]){ ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; int rc,cds=++portals->cur_ds; if(cds>=MAX_DS)armci_die("increase MAX_CDS",cds); portals->dsbase[cds]=portals->brval[cds-1]; //portals->dsbase[cds]=sbrk(0); ptr = portals->brval[cds] = br_val; size = portals->dssizes[cds]=((caddr_t)portals->brval[cds] - portals->dsbase[cds]); portals->serv_offs[cds] = serv_offset; printf("\n%d:%s:base=%p brval=%p dslen=%ld %p end=%p",armci_me,FUNCTION_NAME,portals->dsbase[cds],br_val, portals->dssizes[cds],portals->brval[cds],get_heap_bottom_addr()); md_ptr = &(portals->heap_md[cds]); md_ptr->start = portals->dsbase[cds]; md_ptr->length = portals->dssizes[cds]; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; portals->heap_mb[cds]=cds+1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, portals->heap_mb[cds], ignbits, PTL_RETAIN,PTL_INS_AFTER, &(portals->heap_me_h[cds])); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((portals->heap_me_h[cds]), *md_ptr,PTL_RETAIN, &(portals->heap_md_h[cds])); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } } else{ #ifdef DEBUG_MEM_ extern caddr_t _end; printf("\n%d:%s:curds=%d brvalin=%p curbrval=%p _end=%p &_end=%p",armci_me,FUNCTION_NAME,portals->cur_ds,portals->brval[portals->cur_ds],br_val,_end,&_end); #endif } armci_exchange_meminfo(ptr,size,serv_offset); } #ifndef PMI_SUCCESS #define PMI_SUCCESS 0 #endif static int *_client_servbuf_count; int armci_init_portals(caddr_t atbeginbrval) { #ifndef OLD_PORTALS_CODE int i,rc,np,me; ptl_process_id_t id; ptl_process_id_t clone_id; MPI_Comm_size(ARMCI_COMM_WORLD,&np); MPI_Comm_rank(ARMCI_COMM_WORLD,&me); if(armci_me != me) { printf("[mpi %d]: armci_me=%d ... this is a problem\n",me,armci_me); armci_die("mpi rank mismatch",911); } portals_cp_init(); MPI_Barrier(ARMCI_COMM_WORLD); portals_ds_ready = 0; if(armci_me == armci_master) { portalsCloneDataServer( portals_ds_thread ); portalsSpinLockOnInt( &portals_ds_ready,1,10000 ); } MPI_Barrier(ARMCI_COMM_WORLD); i=0; if((rc=PMI_Initialized(&i))!=PMI_SUCCESS){ printf("PMI_Initialized failed\n"); } if(i==0){ if((rc==PMI_Init(&i))!=PMI_SUCCESS){ printf("MPI_Init failed (npes=%d)\n", armci_nproc); } } if((rc=PMI_CNOS_Get_nidpid_map(&portals_id_map))!=PMI_SUCCESS){ printf("Getting proc map failed (npes=%d)\n", armci_nproc); } /* create intra-node communicator */ MPI_Barrier(ARMCI_COMM_WORLD); portals_cp_init_throttle(armci_nclus); MPI_Barrier(ARMCI_COMM_WORLD); /* stuff from old code ... */ bzero(portals,sizeof(armci_portals_proc_t)); // note: i got rid of this rem_meminfo stuff with the gemini version // see that code to see how to remove it here # ifdef ARMCI_REGISTER_SHMEM _rem_meminfo = (rem_meminfo_t *)calloc(armci_nproc,sizeof(rem_meminfo_t)); _tmp_rem_reginfo = (aptl_reginfo_t *)malloc(sizeof(aptl_reginfo_t)*armci_nproc); if( _rem_meminfo==NULL || _tmp_rem_reginfo ==NULL) armci_die("malloc failed in init_portals",0); //if(armci_me == 0) { // printf("sizeof(rem_meminfo_t)=%ld\n",sizeof(rem_meminfo_t)); //} # endif # ifdef CRAY_USE_ARMCI_CLIENT_BUFFERS client_buf_ptrs = (char **) calloc(armci_nproc,sizeof(char *)); assert(client_buf_ptrs); armci_msg_barrier(); _armci_buf_init(); # endif /* end old stuff */ return 0; #else int num_interface; int rc; int npes,i; ARMCI_PR_DBG("enter",0); bzero(portals,sizeof(armci_portals_proc_t)); _rem_meminfo = (rem_meminfo_t *)calloc(armci_nproc,sizeof(rem_meminfo_t)); _tmp_rem_reginfo = (aptl_reginfo_t *)malloc(sizeof(aptl_reginfo_t)*armci_nproc); if( _rem_meminfo==NULL || _tmp_rem_reginfo ==NULL) armci_die("malloc failed in init_portals",0); portals->servid_map=(ptl_process_id_t *)calloc(armci_nclus,sizeof(ptl_process_id_t)); if(portals->servid_map==NULL)armci_die("calloc of servidmap failed",0); rc = PtlInit(&num_interface); if (rc != PTL_OK) { printf("PtlInit() failed %d %s\n",rc, ARMCI_NET_ERRTOSTR(rc) ); exit(1); } armci_portals_init_ptl(); #if 1 i=0; if((rc=PMI_Initialized(&i))!=PMI_SUCCESS){ printf("PMI_Initialized failed\n"); } if(i==0){ if((rc==PMI_Init(&i))!=PMI_SUCCESS){ printf("MPI_Init failed (npes=%d)\n", armci_nproc); } } if((rc=PMI_CNOS_Get_nidpid_map(&portals->procid_map))!=PMI_SUCCESS){ printf("Getting proc map failed (npes=%d)\n", armci_nproc); } //printf(" "); # else portals->procid_map = (ptl_process_id_t *) calloc(armci_nproc,sizeof(ptl_process_id_t)); portals->procid_map[armci_me]=portals->rank; armci_msg_gop_scope(SCOPE_ALL,portals->procid_map,(sizeof(ptl_process_id_t)*armci_nproc)/sizeof(int),"+",ARMCI_INT); //printf(" "); #endif client_buf_ptrs = (char **) calloc(armci_nproc,sizeof(char *)); assert(client_buf_ptrs); armci_msg_barrier(); if(armci_me==armci_master)armci_create_server_process( armci_server_code ); rc = PtlEQAlloc(portals->ni_h,16*NUM_COMP_DSCR,NULL, &(portals->eq_h)); if (rc != PTL_OK) { printf("%d:Ptleqalloc() failed: %s (%d)\n", armci_me, ARMCI_NET_ERRTOSTR(rc) , rc); armci_die("EQ Alloc failed",rc); } /*printf("\n%d:client nid=%d pid=%d\n",armci_me,portals->rank.nid,portals->rank.pid);*/ _armci_buf_init(); for(i=0;ieq_h; _compdesc_array[i].mem_dsc.max_size=0; /*_compdesc_array[i].mem_dsc.threshold=PTL_MD_THRESH_INF;*/ _compdesc_array[i].mem_dsc.threshold=2; _compdesc_array[i].mem_dsc.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; } ptl_initialized = 1; portals->free_comp_desc_index=0; /*for(i=0;iprocid_map[i].nid,portals->procid_map[i].pid);*/ _client_servbuf_count = calloc(armci_nclus,sizeof(int)); armci_msg_barrier(); armci_client_connect_to_servers(); armci_msg_barrier(); if(DEBUG_COMM){ cpu_set_t mycpuid,new_mask; char cid[8],*cidptr; int rrr; extern char * cpuset_to_cstr(cpu_set_t *mask, char *str); rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if(rrr)perror("sched_getaffinity"); cidptr = cpuset_to_cstr(&mycpuid,cid); printf("%d:my affinity is to %s\n",armci_me,cid); } #ifdef NEW_MALLOC /*post entire heap wildcard for direct communication*/ { ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; portals->cur_ds = 0; portals->dsbase[0]=get_heap_bottom_addr(); //portals->brval[0] = sbrk(0); portals->brval[0] = atbeginbrval; portals->dssizes[0]=((caddr_t)portals->brval[0] - portals->dsbase[0]); printf("\n%d:base=%p dslen=%ld %p",armci_me,portals->dsbase[0], portals->dssizes[0],portals->brval[0]); md_ptr = &(portals->heap_md[0]); md_ptr->start = portals->dsbase[0]; md_ptr->length = portals->dssizes[0]; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; portals->heap_mb[0]=1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, portals->heap_mb[0], ignbits, PTL_RETAIN,PTL_INS_AFTER, &(portals->heap_me_h[0])); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((portals->heap_me_h[0]), *md_ptr,PTL_RETAIN, &(portals->heap_md_h[0])); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } all_meminfo = (rm_info_t *)malloc(sizeof(rm_info_t)*armci_nproc); all_meminfo[armci_me].cur_ds = -1; armci_exchange_meminfo(portals->dsbase[0],portals->dssizes[0],0); } #endif ARMCI_PR_DBG("exit",0); return 0; #endif } void armci_fini_portals() { ARMCI_PR_DBG("enter",0); if(DEBUG_INIT){ printf("ENTERING ARMCI_FINI_PORTALS\n");fflush(stdout); } #ifdef ARMCI_CHECK_STATE arlist_print(arn); #endif PtlNIFini(portals->ni_h); /*PtlFini();*/ if(DEBUG_INIT){ printf("LEAVING ARMCI_FINI_PORTALS\n");fflush(stdout); } ARMCI_PR_DBG("exit",0); } void armci_pin_contig1(void *start,size_t bytes) { } #ifdef ARMCI_REGISTER_SHMEM #ifndef NEW_MALLOC void armci_register_req(void *start,int bytes, int ID) { int rc; ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; ARMCI_PR_DBG("enter",serv_portals->reg_count); #ifdef DEBUG_MEM printf("\n(%d):armci_register_req start=%p bytes=%d\n", armci_me,start,bytes);fflush(stdout); #endif md_ptr = &(serv_portals->meminfo[serv_portals->reg_count].md); md_ptr->start = start; md_ptr->length = bytes; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; serv_portals->meminfo[serv_portals->reg_count].mb=serv_portals->reg_count+1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, serv_portals->meminfo[serv_portals->reg_count].mb, ignbits, PTL_RETAIN,PTL_INS_AFTER, &(serv_portals->meminfo[serv_portals->reg_count].me_h)); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((serv_portals->meminfo[serv_portals->reg_count].me_h), *md_ptr,PTL_RETAIN, &serv_portals->meminfo[serv_portals->reg_count].md_h); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } client_md_count++; serv_portals->reg_count++; ARMCI_PR_DBG("exit",serv_portals->reg_count); } #endif #endif int armci_must_remotecomplete=1; extern _buf_ackresp_t *_buf_ackresp_first,*_buf_ackresp_cur; int x_net_wait_ackresp(_buf_ackresp_t *ar) { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; comp_desc *temp_comp = NULL; int loop=1; int temp_proc; ARMCI_PR_DBG("enter",0); while(ar->val){ ev->type=0; if((rc = PtlEQWait(portals->eq_h, ev)) != PTL_OK){ printf("%d:PtlEQWait(): %d %s\n", portals->rank,rc, ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { temp_comp = (comp_desc *)ev->md.user_ptr; printf("%d:NI sent %d in event %d,%d.\n", armci_me,portals->rank.nid, portals->rank.pid, ev->ni_fail_type); armci_die("event failure problem",temp_comp->dest_id); } if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:done waiting type=%d\n",armci_me, ev->type); fflush(stdout); } if (ev->type == PTL_EVENT_SEND_END){ if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:event send end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; if(temp_comp->type==ARMCI_PORTALS_GETPUT || temp_comp->type==ARMCI_PORTALS_NBGETPUT){ temp_comp->active=0; temp_comp->tag=-1; continue; } if(!armci_must_remotecomplete){ if(temp_comp->type==ARMCI_PORTALS_PUT || temp_comp->type==ARMCI_PORTALS_NBPUT){ temp_comp->active=0; temp_comp->tag=-1; } else continue; } else{ temp_comp->active++; continue; } } else if (ev->type == PTL_EVENT_REPLY_END){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:reply end tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active = 0; /*this was a get request, so we are done*/ temp_comp->tag=-1; continue; } else if (ev->type == PTL_EVENT_ACK){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:event ack tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active=0; temp_comp->tag=-1; portals->outstanding_puts--; } else if (ev->type==PTL_EVENT_PUT_END){ _buf_ackresp_t *sweep=_buf_ackresp_first; if(DEBUG_COMM){printf("\n%d:put end offset=%d",armci_me,ev->offset);fflush(stdout);} if(ar->val==ev->offset){ /*bingo!*/ ar->val=0; } else{ while(sweep!=NULL){ if(sweep->val==ev->offset){ sweep->val=0; break; } sweep=sweep->next; } /*if(sweep==NULL)armci_die("server wrote data at unexpected offset",ev->offset);*/ if(sweep==NULL){ int y; printf("%d:server wrote data at unexpected offset %d",armci_me,ev->offset);fflush(stdout); abort(); # ifdef ARMCI_CHECK_STATE for(y=0;yservid_map[y].pid==ev->initiator.pid && portals->servid_map[y].nid==ev->initiator.nid)break; assert(y!=armci_nclus); arlist_print(arn); armci_rem_state(y); # endif } } } else armci_die("in net_wait_ackresp unknown event",ev->type); } # ifdef ARMCI_CHECK_STATE arlist_remove(arlist_search(&arn, ar->valc)); # endif ar->valc=0; if(ar==_buf_ackresp_first)_buf_ackresp_first=ar->next; if(ar->next!=NULL){ ar->next->previous=ar->previous; } if(ar->previous!=NULL){ /*printf("\n%d:prev=%p %d %p %p\n",armci_me,ar->previous, ar->val,ar->next,ar);fflush(stdout);*/ ar->previous->next=ar->next; if(_buf_ackresp_cur==ar)_buf_ackresp_cur=ar->previous; } if(_buf_ackresp_cur==ar)_buf_ackresp_cur=NULL; ar->previous=ar->next=NULL; ARMCI_PR_DBG("exit",0); return rc; } int armci_client_complete(ptl_event_kind_t evt,int proc_id, int nb_tag, comp_desc *cdesc) { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; comp_desc *temp_comp = NULL; int loop=1; int temp_proc; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("\n%d:enter:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } if(nb_tag>0){ if(cdesc->tag!=nb_tag)return 0; } while(cdesc->active!=0){ ev->type=0; if((rc = PtlEQWait(portals->eq_h, ev)) != PTL_OK){ printf("%d:PtlEQWait(): %d %s\n", portals->rank,rc, ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { temp_comp = (comp_desc *)ev->md.user_ptr; printf("%d:NI sent %d in event %d,%d.\n", armci_me,portals->rank.nid, portals->rank.pid, ev->ni_fail_type); armci_die("event failure problem",temp_comp->dest_id); } if(DEBUG_COMM){ printf("\n%d:armci_client_complete:done waiting type=%d\n",armci_me, ev->type); fflush(stdout); } if(cdesc!=ev->md.user_ptr){ /*printf("\n%d:expecting desc %p completing %p\n",armci_me,cdesc,ev->md.user_ptr);*/ } if (ev->type == PTL_EVENT_SEND_END){ if(DEBUG_COMM){ printf("\n%d:armci_client_complete:event send end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; if(temp_comp->type==ARMCI_PORTALS_GETPUT || temp_comp->type==ARMCI_PORTALS_NBGETPUT){ temp_comp->active=0; temp_comp->tag=-1; continue; } if(!armci_must_remotecomplete){ if(temp_comp->type==ARMCI_PORTALS_PUT || temp_comp->type==ARMCI_PORTALS_NBPUT){ temp_comp->active=0; temp_comp->tag=-1; } else continue; } else{ temp_comp->active++; continue; } } else if (ev->type == PTL_EVENT_REPLY_END){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:client_send_complete:reply end tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active = 0; /*this was a get request, so we are done*/ temp_comp->tag=-1; continue; } else if (ev->type == PTL_EVENT_ACK){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:client_send_complete:event ack tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active=0; temp_comp->tag=-1; portals->outstanding_puts--; } else if (ev->type==PTL_EVENT_PUT_END){ _buf_ackresp_t *ar=_buf_ackresp_first; while(ar!=NULL){ if(ar->val==ev->offset){ ar->val=0; break; } ar=ar->next; } if(ar==NULL)armci_die("server wrote data at unexpected offset",ev->offset); if(DEBUG_COMM){printf("\n%d:put end offset=%d",armci_me,ev->offset);fflush(stdout);} } else armci_die("in client_complete unknown event",ev->type); } if(DEBUG_COMM){ printf("\n%d:exit:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } ARMCI_PR_DBG("exit",0); return rc; } comp_desc * get_free_comp_desc(int * comp_id) { comp_desc * c; int rc = PTL_OK; ARMCI_PR_DBG("enter",0); c = &(_compdesc_array[portals->free_comp_desc_index]); if(c->active!=0 && c->tag>0) armci_client_complete(0,c->dest_id,c->tag,c); else{ /* if(c->active!=0) printf("\n%d:potential problem:active completion descriptor but tag=%d",armci_me,c->tag); else printf("\n%d:potential problem:active completion descriptor with tag=%d",armci_me,c->tag); */ } if(!armci_must_remotecomplete){ do{ rc = PtlMDUnlink(c->mem_dsc_hndl); }while(rc==PTL_MD_IN_USE); } *comp_id = portals->free_comp_desc_index; if(DEBUG_COMM){ printf("\nthe value of comp_desc_id is %d\n",*comp_id); fflush(stdout); } portals->free_comp_desc_index = (portals->free_comp_desc_index+1) % NUM_COMP_DSCR; ARMCI_PR_DBG("exit",0); return c; } void print_mem_desc(ptl_md_t * md) { printf("%d:%p:start=%p length=%d threshold=%d max_size=%d options=%d eq_handle=%d\n",armci_me,md,md->start, md->length,md->threshold,md->max_size,md->options,md->eq_handle); fflush(stdout); } #ifndef NEW_MALLOC #if 0 void armci_unregister_shmem(void *my_ptr, long size) { int i=0,dst,found=0; long id ; long reg_size=0; int reg_num = _rem_meminfo[armci_me].reg_count; void *tptr; ARMCI_PR_DBG("enter",reg_num); #ifdef DEBUG_MEM printf("%d:%s:got size=%ld myptr %p\n",armci_me,FUNCTION_NAME,size,my_ptr); fflush(stdout); #endif bzero(_tmp_rem_reginfo,sizeof(aptl_reginfo_t)*armci_nproc); if(reg_num>=MAX_MEM_REGIONS) armci_die("reg_num corrupted",reg_num); for(i=0;i=MAX_MEM_REGIONS) armci_die("reg_num corrupted",reg_num); for(i=0;i=MAX_MEM_REGIONS-1){ printf("\n%d:more than expected regions -- %d, increase MAX_MEM_REGIONS",armci_me,_rem_meminfo[i].reg_count++);fflush(stdout); armci_die2("more than expected regions",_rem_meminfo[i].reg_count,MAX_MEM_REGIONS); } } #ifdef DEBUG_MEM printf("%d: regist id=%ld found=%d size=%ld reg_num=%d\n", armci_me,id,found,reg_size,reg_num); fflush(stdout); #endif ARMCI_PR_DBG("exit",0); } void armci_register_shmem_grp(void *my_ptr, long size, long *idlist, long off, void *sptr,ARMCI_Group *group) { ARMCI_Group orig_group; ARMCI_PR_DBG("enter",0); ARMCI_Group_get_default(&orig_group); ARMCI_Group_set_default(group); armci_register_shmem(my_ptr,size,idlist,off,sptr); ARMCI_Group_set_default(&orig_group); ARMCI_PR_DBG("enter",0); } #endif #endif // end #ifdef ARMCI_REGISTER_SHMEM static int _get_rem_servinfo(int serv,size_t bytes, size_t* offset) { int i; ARMCI_PR_DBG("enter",0); i = 16<<8; *offset=(armci_me*NUM_SERV_BUFS+_client_servbuf_count[serv])*VBUF_DLEN; _client_servbuf_count[serv] = (_client_servbuf_count[serv]+1)%NUM_SERV_BUFS; ARMCI_PR_DBG("exit",i); return i; } static int _get_rem_info(int proc, void *ptr,size_t bytes, size_t* offset) { #ifdef ARMCI_REGISTER_SHMEM int i; ARMCI_PR_DBG("enter",0); #ifdef NEW_MALLOC i = check_meminfo(ptr,(long)bytes,proc); if(i==0){ printf("\n%d:ptr=%p bytes=%d proc=%d",armci_me,ptr,bytes,proc); armci_die("region not found",proc); } *offset = (size_t)((caddr_t)ptr-(caddr_t)portals->dsbase[i-1]); printf("\n%d:ptr=%p dsbase[0]=%p offs=%ld",armci_me,ptr,portals->dsbase[0],*offset);fflush(stdout); if(*offset>=0){ ARMCI_PR_DBG("exit A",(i+1)); return(i); } #else rem_meminfo_t *mem_info=&(_rem_meminfo[proc]); aptl_reginfo_t *memreg = mem_info->reginfo; for(i=0;ireg_count;i++){ /*for now size is not verified*/ if(DEBUG_COMM){ printf("\n%d:proc=%d regcount=%d reg=%d base=%p size=%d end=%p checkptr=%p\n",armci_me,proc,mem_info->reg_count,i,memreg[i].base_ptr,memreg[i].size, ((char *)memreg[i].base_ptr+memreg[i].size), ptr);fflush(stdout); } if((memreg[i].valid) && ptr>= memreg[i].base_ptr && ptr< ((char *)memreg[i].base_ptr+memreg[i].size)){ *offset = ((char *)ptr-(char *)memreg[i].base_ptr); ARMCI_PR_DBG("exit A",(i+1)); return (i+1); } } #endif ARMCI_PR_DBG("exit B",i); armci_die("_get_rem_info, rem memory region not found",bytes); #else printf("_get_rem_info called ... this shouldn't happen"); abort(); #endif } void armci_client_direct_get(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local, ptl_handle_md_t *md_hdl_local) { int rc; ptl_size_t offset_local = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("\n%d:armci_client_direct_get:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); fflush(stdout); } rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ printf("%d:PtlMDBind: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("ptlmdbind get failed",0); } #ifdef CRAY_USE_MDMD_COPY if (dest_proc.nid == portals->rank.nid) { rc = PtlMDMDCopy(*md_hdl_local, dest_proc, portals->ptl, 0, mb, offset_remote); } else { #endif rc = PtlGetRegion(*md_hdl_local,offset_local,bytes,dest_proc, portals->ptl, 0, mb, offset_remote); #ifdef CRAY_USE_MDMD_COPY } #endif if (rc != PTL_OK){ printf("%d:PtlGetRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlGetRegion failed",0); } if(DEBUG_COMM){ printf("\n%d:issued get\n",armci_me);fflush(stdout); } ARMCI_PR_DBG("exit",0); } void armci_portals_get(int proc, void *src_buf, void *dst_buf, int bytes, void** cptr,int tag) { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); /*first remote process information*/ /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=dst_buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_info(proc,src_buf,bytes,&offset_remote); cdesc->dest_id = proc; if (tag){ *((comp_desc **)cptr) = cdesc; cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBGET; /*printf("\n%d:get tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ } else{ cdesc->tag = 0; cdesc->type = ARMCI_PORTALS_GET; } cdesc->active = 1; armci_client_direct_get(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); if(!tag){ armci_client_complete(0,proc,0,cdesc); /* check this later */ } ARMCI_PR_DBG("exit",0); } void armci_client_nb_get(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag) { } void armci_client_direct_send(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local, ptl_handle_md_t *md_hdl_local) { int rc; ptl_size_t offset_local = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("%d:armci_client_direct_send:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); fflush(stdout); } /*print_mem_desc(md_local);*/ rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc)); armci_die("ptlmdbind send failed",0); } if(armci_must_remotecomplete){ rc = PtlPutRegion(*md_hdl_local,offset_local,bytes, PTL_ACK_REQ, dest_proc,portals->ptl,0, mb,offset_remote, 0); } else{ rc = PtlPutRegion(*md_hdl_local,offset_local,bytes, PTL_NOACK_REQ, dest_proc,portals->ptl,0, mb,offset_remote, 0); } if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_DBG("exit",0); } void armci_portals_put(int proc, void *src_buf, void *dst_buf, int bytes, void** cptr,int tag) { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); /*first process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=src_buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_info(proc,dst_buf,bytes,&offset_remote); if(DEBUG_COMM){ printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); } cdesc->dest_id = proc; if (tag){ *((comp_desc **)cptr) = cdesc; cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBPUT; /*printf("\n%d:put tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ } else{ cdesc->tag = 0; cdesc->type = ARMCI_PORTALS_PUT; } cdesc->active = 1; armci_client_direct_send(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); if(!tag){ armci_client_complete(0,proc,0,cdesc); /* check this later */ } else portals->outstanding_puts++; ARMCI_PR_DBG("exit",0); } void armci_client_nb_send(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag) { } /*using non-blocking for multiple 1ds inside a 2d*/ void armci_network_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle) { int i, j,tag=0; long idxs,idxd; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue_s[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bvalue_d[MAX_STRIDE_LEVEL]; int bytes = count[0]; void *sptr,*dptr; NB_CMPL_T cptr; ptl_process_id_t dest_proc; ptl_size_t offset_remote; comp_desc *cdesc; int c_info; ptl_md_t *md_local; int rem_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); printf("%s calling abort ... network_strided not implemented\n",Portals_ID()); abort(); if(nb_handle)tag=nb_handle->tag; /*first remote process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ rem_info = _get_rem_info(proc,(op==GET)?src_ptr:dst_ptr,bytes,&offset_remote); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue_s[0] = 0; bvalue_s[1] = 0; bunit[0] = 1; bvalue_d[0] = 0; bvalue_d[1] = 0; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue_s[i] = bvalue_d[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } if(ARMCI_ACC(op)){ /*for now die for acc*/ /*lock here*/ # ifdef ARMCI_CHECK_STATE arlist_print(arn); armci_rem_state(armci_clus_info[proc].master%armci_clus_info[0].nslave); # endif printf("\nSHOULD NOT DO NETWORK_STRIDED FOR ACCS \n",armci_me); fflush(stdout); armci_die("network_strided called for acc",proc); } /*loop over #contig chunks*/ for(i=0; i (count[j]-1)) bvalue_s[j] = 0; if(bvalue_d[j] > (count[j]-1)) bvalue_d[j] = 0; } sptr = ((char *)src_ptr)+idxs; dptr = ((char *)dst_ptr)+idxd; cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=(op==GET)?dptr:sptr; md_local->user_ptr = (void *)cdesc; cdesc->dest_id = proc; cdesc->tag = tag; if(op==GET){ md_local->options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; cdesc->active = 1; cdesc->type = ARMCI_PORTALS_NBGET; /* printf("\n%d:reminfo=%d off=%d idxs=%d idxd=%d",armci_me, rem_info, offset_remote, idxs, idxd); */ armci_client_direct_get( dest_proc,offset_remote+idxs,rem_info, bytes,md_local,md_hdl_local); } else if(op==PUT){ cdesc->active = 1; cdesc->type = ARMCI_PORTALS_NBPUT; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; armci_client_direct_send(dest_proc,offset_remote+idxd,rem_info, bytes,md_local,md_hdl_local); if(op==PUT)portals->outstanding_puts++; } else if(ARMCI_ACC(op)){ assert(0); } else{ ARMCI_PR_DBG("exit",0); armci_die("in network_strided unknown opcode",op); } armci_client_complete(0,proc,tag,cdesc); } if(ARMCI_ACC(op)){ /*unlock here*/ } if(nb_handle){ /* completing the last call is sufficient, given ordering semantics*/ nb_handle->tag=tag; nb_handle->cmpl_info=cdesc; } else{ /*completing the last call ensures everything before it is complete this * is one of the main reasons why dataserver is necessary*/ /*armci_client_complete(0,proc,tag,cdesc);*/ } ARMCI_PR_DBG("exit",0); } void armci_client_direct_getput(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local_get,ptl_md_t *md_local_put, ptl_handle_md_t *md_hdl_local_get, ptl_handle_md_t *md_hdl_local_put) { int rc; ptl_size_t offset_get = 0; ptl_size_t offset_put = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("%d:armci_client_direct_getput:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld\n",armci_me,offset_remote);fflush(stdout); } rc = PtlGetPutRegion(*md_hdl_local_get, offset_get, *md_hdl_local_put, offset_put,bytes,dest_proc, portals->ptl,0,mb, offset_remote,0); if (rc != PTL_OK){ printf("%d:PtlGetPutRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlGetPutRegion failed",0); } ARMCI_PR_DBG("exit",0); } long a_p_putfrom; long a_p_getinto; int armci_portals_rmw_(int op, int *ploc, int *prem, int extra, int proc) { printf("error rmw"); return(0); } void armci_portals_shmalloc_allocate_mem(int num_lks) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ARMCI_PR_DBG("enter",0); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(!ptr_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ARMCI_Malloc(ptr_arr,bytes); ARMCI_PR_DBG("exit",0); return; } void armci_wait_for_server() { ARMCI_PR_DBG("enter",0); armci_server_terminating=1; armci_serv_quit(); ARMCI_PR_DBG("exit",0); } /*client buffers info*/ void armci_portals_client_buf_info(char *buf, ptl_match_bits_t *mb, ptl_size_t *offset,int proc) { ARMCI_PR_DBG("enter",0); *mb = (1<<30); *offset = buf-client_buf_ptrs[proc]; if(DEBUG_SERV){printf("\n(%d):serv writing to ofset %d on %d\n",armci_me,*offset,proc);fflush(stdout);} ARMCI_PR_DBG("exit",0); } /*memory for client buffers*/ char *armci_portals_client_buf_allocate(int bytes) { void *ptr; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_md_t *md_ptr,md; ptl_process_id_t match_id; ptl_handle_me_t me_h; ptl_handle_md_t md_h; int rc; ARMCI_PR_DBG("enter",sizeof(ptl_match_bits_t)); ptr = malloc(bytes); bzero(ptr,bytes); assert(ptr); mbits = (1<<30); md_ptr = &(md); md_ptr->start = ptr; md_ptr->length = bytes; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; /*logic that says, eq_h is now recieving data for the buffers, including acks! */ md_ptr->eq_handle = portals->eq_h; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, mbits,ignbits,PTL_RETAIN,PTL_INS_AFTER,&(me_h)); if (rc != PTL_OK){ printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error2",rc); } rc = PtlMDAttach(me_h,md,PTL_RETAIN,&md_h); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count) ); armci_die("portals attach error CBA",rc); } client_md_count++; client_buf_ptrs[armci_me]=ptr; armci_msg_barrier(); armci_exchange_address(client_buf_ptrs,armci_nproc); ARMCI_PR_DBG("exit",0); return(ptr); } void armci_transport_cleanup() { /*for i=0tomaxpendingclean*/ ARMCI_PR_DBG("enter",0); free(client_buf_ptrs); ARMCI_PR_DBG("exit",0); } void free_serv_bufs() { if(serv_bufs) free(serv_bufs); } int armci_send_req_msg(int proc, void *buf, int bytes,int tag) { #ifndef OLD_PORTALS_CODE int cluster = armci_clus_id(proc); int serv = armci_clus_info[cluster].master; char *buffer = NULL; request_header_t *msginfo = (request_header_t *) buf; // # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE _armci_buf_ensure_one_outstanding_op_per_node(buf,cluster); // # endif # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS BUF_INFO_T *bufinfo=_armci_buf_to_bufinfo(msginfo); _buf_ackresp_t *ar = &bufinfo->ar; portals_ds_req_t *req = &ar->req; # endif if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { // printf("%s cp: sending packed put\n",Portals_ID()); # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portals_remote_nbput(buf, buf, cluster, req); // portalsWaitOnRequest(req); # else portals_remote_put(buf, buf, cluster); # endif // printf("%s cp: finished packed put\n",Portals_ID()); } else if(msginfo->operation == GET) { buffer = (char *) buf; buffer += sizeof(request_header_t); buffer += msginfo->dscrlen; // printf("%s cp: sending blocking get request\n",Portals_ID()); # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portals_remote_nbget(buffer, msginfo, cluster, req); // portalsWaitOnRequest(req); # else portals_remote_get(buffer, msginfo, cluster); # endif // printf("%s cp: get request finished\n",Portals_ID()); } else if(msginfo->operation == ACK) { # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portalsRemoteOperationToNode(buf, bytes, cluster, req); // portalsWaitOnRequest(req); # else portalsBlockingRemoteOperationToNode(buf, bytes, cluster); # endif } else if(msginfo->operation == ARMCI_SWAP || msginfo->operation == ARMCI_SWAP_LONG || msginfo->operation == ARMCI_FETCH_AND_ADD || msginfo->operation == ARMCI_FETCH_AND_ADD_LONG) { buffer = (char *) buf; buffer += sizeof(request_header_t); buffer += msginfo->dscrlen; portals_remote_rmw(buffer, msginfo, cluster, req); # ifndef PORTALS_USE_ARMCI_CLIENT_BUFFERS portalsWaitOnOperation(req); # endif } else if(msginfo->operation!=ATTACH) { printf("%s cp: msginfo->operation=%d not supported yet\n",Portals_ID(),msginfo->operation); abort(); } # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS /* for now, clear the ackresp structure because the call had to have been blocking later, we will allow a modified x_net_wait_ackresp clear it */ ar->val = ar->valc = 0; if(ar==_buf_ackresp_first)_buf_ackresp_first=ar->next; if(ar->next!=NULL){ ar->next->previous=ar->previous; } if(ar->previous!=NULL){ ar->previous->next=ar->next; if(_buf_ackresp_cur==ar)_buf_ackresp_cur=ar->previous; } if(_buf_ackresp_cur==ar)_buf_ackresp_cur=NULL; ar->previous=ar->next=NULL; # endif return 0; #else int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; void *cptr; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); int serv = armci_clus_info[cluster].master; request_header_t *msginfo = (request_header_t *)buf; ARMCI_PR_DBG("enter",0); if(msginfo->operation==GET && msginfo->dscrlen<=msginfo->datalen){ *(long *)((char *)(msginfo+1)+msginfo->datalen)=0; } /*badbadbad*/ msginfo->tag.ack_ptr=&(msginfo->tag.ack); cptr = (void *)((double *)buf-1); /*first process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_servinfo(cluster,(size_t)bytes,&offset_remote); if(DEBUG_COMM){ printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); } cdesc->dest_id = serv; *((comp_desc **)cptr) = cdesc; if(tag==0)tag=GET_NEXT_NBTAG(); cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBPUT; /*printf("\n%d:put tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ cdesc->active = 1; if(msginfo->operation==PUT || msginfo->operation == UNLOCK || ARMCI_ACC(msginfo->operation)){ _buf_ackresp_cur->valc = _buf_ackresp_cur->val = (char *)msginfo->tag.ack_ptr-client_buf_ptrs[armci_me]; # ifdef ARMCI_CHECK_STATE arlist_add(&arn,_buf_ackresp_cur->val,msginfo->operation); # endif } else { _buf_ackresp_cur->valc = _buf_ackresp_cur->val = (char *)msginfo->tag.data_ptr-client_buf_ptrs[armci_me]; # ifdef ARMCI_CHECK_STATE arlist_add(&arn,_buf_ackresp_cur->val,msginfo->operation); # endif } if(DEBUG_COMM){printf("\n%d:registered %d in val to %d at %d %d\n",armci_me,_buf_ackresp_cur->val,serv,offset_remote,msginfo->operation);fflush(stdout);} _armci_buf_ensure_pend_outstanding_op_per_node(buf,cluster); armci_client_direct_send(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); /*if(msginfo->operation==GET){ BUF_INFO_T *info=((char *)msginfo-sizeof(BUF_EXTRA_FIELD_T)-sizeof(BUF_INFO_T)); armci_client_complete(0,proc,cdesc->tag,cdesc); }*/ /*armci_client_complete(0,proc,cdesc->tag,cdesc);*/ portals->outstanding_puts++; ARMCI_PR_DBG("exit",0); return 0; #endif } char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len) { #ifndef OLD_PORTALS_CODE # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS BUF_INFO_T *bufinfo = _armci_buf_to_bufinfo(msginfo); portals_ds_req_t *req = &bufinfo->ar.req; portalsWaitOnRequest(req); # endif char *ret = (char *) msginfo; ret += sizeof(request_header_t); ret += msginfo->dscrlen; return ret; #else long *flag; int loop; BUF_INFO_T *bufinfo=_armci_buf_to_bufinfo(msginfo); ARMCI_PR_DBG("enter",0); if(len) flag = (long *)((char *)(msginfo+1)+len); else flag = (long *)((char *)(msginfo+1)+msginfo->datalen); x_net_wait_ackresp(&(bufinfo->ar)); while(armci_util_long_getval(flag) != ARMCI_TAIL){ loop++; loop %=100000; if(loop==0){ if(DEBUG_COMM){ printf("%d: client flag(%p)=%ld off=%d %d\n", armci_me,flag,*flag,msginfo->datalen,*((int*)(msginfo+1))); fflush(stdout); } } } *flag=0; ARMCI_PR_DBG("exit",0); return (msginfo+1); #endif } #ifdef ARMCI_CHECK_STATE extern void sarlist_add(int,int,long); #endif void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf) { #ifndef OLD_PORTALS_CODE ptl_size_t bytes = (ptl_size_t) msginfo->datalen; ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; portals_ds_send_put(buf, msginfo->datalen, ev->initiator, ev->hdr_data); // you could do an assertion that the portals_id_map of proc == ev->initiator #else long *tail; int bytes; void *dst_addr = msginfo->tag.data_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_md_t *md_ptr,md; ptl_process_id_t match_id; ptl_handle_me_t me_h; ptl_size_t offst,localoffset; int rc; /* set tail ack, make sure it is alligned */ ARMCI_PR_SDBG("enter",0); bytes = msginfo->datalen+sizeof(long); if(!(buf>=serv_bufs->buf && bufbufend)){ bcopy(buf,(msginfo+1),bytes); buf=(msginfo+1); } tail = (long*)(buf + msginfo->datalen); *tail = ARMCI_TAIL; armci_portals_client_buf_info((char *)dst_addr,&mbits,&offst,proc); # ifdef ARMCI_CHECK_STATE sarlist_add(proc,msginfo->operation,offst); # endif match_id.nid = portals->procid_map[proc].nid; match_id.pid = portals->procid_map[proc].pid; localoffset=(char *)buf-(char *)serv_bufs->buf; if(DEBUG_COMM){ printf("\n(%d):dst=%p,mbits=%d,localoffset=%d,offst=%d,proc=%d,nid=%d,pid=%d len=%d\n",armci_me, dst_addr,mbits,localoffset,offst,proc,portals->procid_map[proc].nid, portals->procid_map[proc].pid,bytes);fflush(stdout); } rc = PtlPutRegion(serv_response_md_h,localoffset,bytes,PTL_NOACK_REQ, match_id,portals->ptl,0,mbits,offst,0); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_SDBG("exit",0); #endif } void armci_rcv_req(void *mesg,void *phdr,void *pdescr,void *pdata,int *buflen) { int i,na; char *a; double *tmp; request_header_t *msginfo = (request_header_t *)mesg; ARMCI_PR_SDBG("enter",msginfo->operation); *(void **)phdr = msginfo; if(0){ printf("%s [ds]: got %d req (hdrlen=%d dscrlen=%d datalen=%d %d) from %d\n", Portals_ID(), msginfo->operation, sizeof(request_header_t), msginfo->dscrlen, msginfo->datalen, msginfo->bytes,msginfo->from); fflush(stdout); } /* we leave room for msginfo on the client side */ *buflen = MSG_BUFLEN - sizeof(request_header_t); if(msginfo->bytes) { *(void **)pdescr = msginfo+1; *(void **)pdata = msginfo->dscrlen + (char*)(msginfo+1); if(msginfo->operation == GET) { // the descriptor will exists after the request header // but there will be no data buffer // use the MessageRcvBuffer *(void**) pdata = MessageSndBuffer; // printf("%s (server) overriding pdata in rcv_req\n",Portals_ID()); } } else { *(void**)pdescr = NULL; *(void**)pdata = MessageRcvBuffer; } ARMCI_PR_SDBG("exit",msginfo->operation); } void armci_call_data_server() { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; serv_buf_t *compbuf = NULL; int loop=1; int temp_proc; int ccc=2,rrr; cpu_set_t mycpuid,new_mask; char str[CPU_SETSIZE]; char ncid[8],*cidptr,cid[8]; extern char * cpuset_to_cstr(cpu_set_t *mask, char *str); ARMCI_PR_SDBG("enter",0); //if(armci_me==0)unsetenv("CRAY_PORTALS_USE_BLOCKING_POLL"); sprintf (cid, "%d", ccc); rrr = cstr_to_cpuset(&new_mask,cid); /* ------------------------------------------------------------ *\ Change affinity for the data server \* ------------------------------------------------------------ */ if(sched_setaffinity(0, sizeof (new_mask), &new_mask)) { perror("sched_setaffinity"); printf("failed to set pid %d's affinity.\n", getpid()); } if(DEBUG_SERV){ rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if(rrr)perror("sched_getaffinity"); cidptr = cpuset_to_cstr(&mycpuid,ncid); printf("(%d):my affinity is to %s\n",armci_me,ncid); fflush(stdout); } /* ------------------------------------- *\ Main data server loop \* ------------------------------------- */ while(armci_server_terminating==0){ /* ------------------------------------------------------------ *\ check event queue for incoming data requests from remote CPs \* ------------------------------------------------------------ */ ev->type=0; if((rc = PtlEQWait(portals->Seq_h, ev)) != PTL_OK){ printf("(%d):PtlEQWait(): %d %s\n", armci_me,rc,ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { printf("(%d)%d,%d:NI sent %d in event.\n", armci_me,portals->Srank.nid, portals->Srank.pid,ev->ni_fail_type); fflush(stdout); armci_die2("event failure problem",ev->initiator.nid,ev->initiator.pid); } if(DEBUG_SERV){ printf("\n(%d):armci_call_data_server: ptl event detected=%d\n",armci_me,ev->type); fflush(stdout); } /* ------------------------------------------------------------ *\ PTL_EVENT_SEND_END: is ignored. This event is triggered as the DS returns data to a remote CP via a PtlPut. This event signals that that PtlPut has complete. \* ------------------------------------------------------------ */ if(ev->type == PTL_EVENT_SEND_END) continue; /* ------------------------------------------------------------ *\ PTL_EVENT_PUT_END: this is the key portals event for the DS. PUT_END signifies that a remote data request has come in from a remote CP. This data request will be handled by the data server: armci_data_server \* ------------------------------------------------------------ */ else if(ev->type == PTL_EVENT_PUT_END) { if(DEBUG_SERV) { printf("\n(%d):ev->offset=%d from %d%d",armci_me,ev->offset, ev->initiator.pid,ev->initiator.nid); fflush(stdout); } armci_data_server(((char *)serv_bufs->buf+ev->offset)); } /* ------------------------------------------------------------ *\ Unexpected Portals Event -- Panic! \* ------------------------------------------------------------ */ else { armci_die("unexpected event in data server",ev->type); } } ARMCI_PR_SDBG("exit",0); } void x_buf_wait_ack(request_header_t *msginfo, BUF_INFO_T *bufinfo) { ARMCI_PR_DBG("enter",bufinfo->ar.val); if(DEBUG_COMM){printf("\n%d:waiting for ack at %p",armci_me,&(msginfo->tag.ack));fflush(stdout);} x_net_wait_ackresp(&(bufinfo->ar)); armci_util_wait_long(&(msginfo->tag.ack),ARMCI_STAMP,10000); if(DEBUG_COMM){printf("\n%d:done waiting for ack at %p",armci_me,&(msginfo->tag.ack));fflush(stdout);} msginfo->tag.ack=0; ARMCI_PR_DBG("exit",0); } void x_net_send_ack(request_header_t *msginfo, int proc,void *dst,void *src) { long *tail; int bytes=sizeof(long); ptl_size_t offst; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_process_id_t match_id; int rc; /* set tail ack, make sure it is alligned */ ARMCI_PR_SDBG("enter",0); armci_portals_client_buf_info((char *)dst,&mbits,&offst,proc); # ifdef ARMCI_CHECK_STATE sarlist_add(proc,msginfo->operation,offst); # endif match_id.nid = portals->procid_map[proc].nid; match_id.pid = portals->procid_map[proc].pid; if(DEBUG_SERV){ printf("\n(%d):dst=%p,mbits=%d,offst=%d,proc=%d,nid=%d,pid=%d len=%d\n",armci_me, dst,mbits,offst,proc,portals->procid_map[proc].nid, portals->procid_map[proc].pid,bytes);fflush(stdout); } rc = PtlPutRegion(serv_ack_md_h,0,bytes,PTL_NOACK_REQ, match_id,portals->ptl,0,mbits,offst,0); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_SDBG("exit",0); } long x_net_offset(char *buf,int proc) { #ifdef ARMCI_REGISTER_SHMEM int i; #if NEW_MALLOC if((i=check_meminfo(buf,1,proc))==0) armci_die("x_net_offset,reg not found",proc); return(all_meminfo[proc].serv_offs[i]); #else ARMCI_PR_DBG("enter",_rem_meminfo[proc].reg_count); if(DEBUG_COMM){printf("\n%d:%s:buf=%p",armci_me,FUNCTION_NAME,buf);fflush(stdout); } for(i=0;i<_rem_meminfo[proc].reg_count;i++){ if(IN_REGION(buf,_rem_meminfo[proc].reginfo[i])){ #ifdef DEBUG_MEM {printf("\n%d:found it in reg=%d (%p,%d) for proc=%d",armci_me,i,_rem_meminfo[proc].reginfo[i].base_ptr,_rem_meminfo[proc].reginfo[i].size,proc);} #endif return((long)((char *)_rem_meminfo[proc].reginfo[i].serv_ptr-(char *)_rem_meminfo[proc].reginfo[i].base_ptr)); } } #endif ARMCI_PR_DBG("exit",0); #else printf("x_net_offset called; this shouldn't happen ...\n"); abort(); #endif } void armci_set_serv_mutex_arr(void *ptr) { int i; long offset; ARMCI_PR_DBG("enter",0); offset=x_net_offset(ptr,armci_me); _armci_server_mutex_ready=1; _armci_server_mutex_ptr = (char *)ptr+offset; ARMCI_PR_DBG("exit",0); } ga-5-4/armci/src-portals/strided.c0000644000175000017500000013371112662210425015204 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #include #include #define DATA_SERVER_ 1 #ifdef ORNL_USE_DS_FOR_REMOTE_GETS #define DATA_SERVER_GET_ 1 #else #define DATA_SERVER_GET_ 0 #endif #define ARMCI_OP_2D(op, scale, proc, src, dst, bytes, count, src_stride, dst_stride,lockit)\ if(op == GET || op ==PUT)\ armci_copy_2D(op, proc, src, dst, bytes, count, src_stride,dst_stride);\ else if(count==1) armci_acc_1D(op, scale, proc, src, dst, bytes,lockit);\ else\ armci_acc_2D(op, scale, proc, src, dst, bytes, count, src_stride,dst_stride,lockit) /* macro supports run-time selection of request sending scheme */ #if defined(CLIENT_BUF_BYPASS) #define CAN_REQUEST_DIRECTLY _armci_bypass #else # if defined(HITACHI) # define CAN_REQUEST_DIRECTLY 0 # else # define CAN_REQUEST_DIRECTLY 1 # endif #endif #define PREPROCESS_STRIDED(tmp_count) {\ tmp_count=0;\ if(stride_levels) \ for(;stride_levels;stride_levels--)if(count[stride_levels]>1)break;\ if(stride_levels&&(count[0]==src_stride_arr[0]&&count[0]==dst_stride_arr[0])){\ tmp_count=seg_count[1];\ count = seg_count+1;\ seg_count[1] = seg_count[0] * seg_count[1];\ stride_levels --;\ src_stride_arr ++; dst_stride_arr++ ;\ }\ } #define POSTPROCESS_STRIDED(tmp_count) if(tmp_count)seg_count[1]=tmp_count #define SERVER_GET 1 #define SERVER_NBGET 2 #define DIRECT_GET 3 #define DIRECT_NBGET 4 #define SERVER_PUT 5 #define SERVER_NBPUT 6 #define DIRECT_PUT 7 #define DIRECT_NBPUT 8 # define DO_FENCE(__proc,__prot) if(__prot==SERVER_GET);\ else if(__prot==SERVER_PUT);\ else if(__prot==DIRECT_GET || __prot==DIRECT_NBGET){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else if(__prot==DIRECT_PUT || __prot==DIRECT_NBPUT){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else;\ armci_prot_switch_fence[__proc]=__prot #ifndef REGIONS_REQUIRE_MEMHDL # define ARMCI_MEMHDL_T void #endif ARMCI_MEMHDL_T *mhloc=NULL,*mhrem=NULL; #ifdef REGIONS_REQUIRE_MEMHDL int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl); # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found_hndl((_s),(_d),(_b),(_p),&mhloc,&mhrem) #else # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found((_s),(_d),(_b),(_p)) #endif #ifdef HAS_RDMA_GET # ifdef REGIONS_REQUIRE_MEMHDL void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** cptr,int nbtag,ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl); # else void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** contextptr,int nbtag,void *mhdl,void *mhdl1); # endif # define ARMCI_NBREM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],&((_hdl)->cmpl_info),(_hdl)->tag,(void *)mhloc,(void *)mhrem); \ # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],NULL,0,(void *)mhloc,(void *)mhrem); \ #else # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_rem_get((_p),(_s),(_sst),(_d),(_dst),(_cou),(_lev),(_hdl),(void *)mhloc,(void *)mhrem) # define ARMCI_NBREM_GET ARMCI_REM_GET #endif extern int* armci_prot_switch_fence; extern int armci_prot_switch_preproc; extern int armci_prot_switch_preop; int armci_iwork[MAX_STRIDE_LEVEL]; /*\ 2-dimensional array copy \*/ static void armci_copy_2D(int op, int proc, void *src_ptr, void *dst_ptr, int bytes, int count, int src_stride, int dst_stride) { int armci_th_idx = ARMCI_THREAD_IDX; #ifdef LAPI2__ # define COUNT 1 #else # define COUNT count #endif #ifdef __crayx1 int shmem = 1; #else int shmem = SAMECLUSNODE(proc); #endif if(shmem) { /* data is in local/shared memory -- can use memcpy */ // printf("%s: shmem==true; count==%d\n",Portals_ID(),count); if(count==1){ armci_copy(src_ptr, dst_ptr, bytes); // printf("%s: shmem==true; finished\n",Portals_ID(),count); }else { char *ps=(char*)src_ptr; char *pd=(char*)dst_ptr; int j; for (j = 0; j < count; j++){ bcopy(ps,pd,bytes); ps += src_stride; pd += dst_stride; } } } else { /* data not in local/shared memory-access through global address space*/ if(op==PUT){ printf("%s: pre UPDATE_FENCE_STATE\n",Portals_ID()); UPDATE_FENCE_STATE(proc, PUT, COUNT); printf("%s: post UPDATE_FENCE_STATE\n",Portals_ID()); #ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx],COUNT); #endif if(count==1){ armci_put(src_ptr, dst_ptr, bytes, proc); }else{ armci_put2D(proc, bytes, count, src_ptr, src_stride, dst_ptr, dst_stride); } }else{ #ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], COUNT); #endif if(count==1){ armci_get(src_ptr, dst_ptr, bytes, proc); }else{ armci_get2D(proc, bytes, count, src_ptr, src_stride, dst_ptr, dst_stride); } } } } #if (defined(CRAY) && !defined(__crayx1)) || defined(FUJITSU) #ifdef CRAY # define DAXPY SAXPY #else # define DAXPY daxpy_ #endif static int ONE=1; #define THRESH_ACC 32 static void daxpy_2d_(void* alpha, int *rows, int *cols, void *a, int *ald, void* b, int *bld) { int c,r; double *A = (double*)a; double *B = (double*)b; double Alpha = *(double*)alpha; if(*rows < THRESH_ACC) for(c=0;c<*cols;c++) for(r=0;r<*rows;r++) A[c* *ald+ r] += Alpha * B[c* *bld+r]; else for(c=0;c<*cols;c++) DAXPY(rows, alpha, B + c* *bld, &ONE, A + c* *ald, &ONE); } #endif void armci_acc_1D(int op, void *scale, int proc, void *src, void *dst, int bytes, int lockit) { int rows; void (ATR *func)(void*, void*, void*, int*); ARMCI_PR_DBG("enter",0); switch (op){ case ARMCI_ACC_INT: rows = bytes/sizeof(int); func = I_ACCUMULATE_1D; break; case ARMCI_ACC_LNG: rows = bytes/sizeof(long); func = L_ACCUMULATE_1D; break; case ARMCI_ACC_DBL: rows = bytes/sizeof(double); func = D_ACCUMULATE_1D; break; case ARMCI_ACC_DCP: rows = bytes/(2*sizeof(double)); func = Z_ACCUMULATE_1D; break; case ARMCI_ACC_CPL: rows = bytes/(2*sizeof(float)); func = C_ACCUMULATE_1D; break; case ARMCI_ACC_FLT: rows = bytes/sizeof(float); func = F_ACCUMULATE_1D; break; default: armci_die("ARMCI accumulate: operation not supported",op); func = F_ACCUMULATE_1D; /*avoid compiler whining */ } if(lockit){ ARMCI_LOCKMEM(dst, bytes + (char*)dst, proc); } func(scale, dst, src, &rows); if(lockit)ARMCI_UNLOCKMEM(proc); ARMCI_PR_DBG("exit",0); } /*\ 2-dimensional accumulate \*/ void armci_acc_2D(int op, void* scale, int proc, void *src_ptr, void *dst_ptr, int bytes, int cols, int src_stride, int dst_stride, int lockit) { int rows, lds, ldd, span; void (ATR *func)(void*, int*, int*, void*, int*, void*, int*); ARMCI_PR_DBG("enter",0); /* if((long)src_ptr%ALIGN)armci_die("src not aligned",(long)src_ptr); if((long)dst_ptr%ALIGN)armci_die("src not aligned",(long)dst_ptr); */ switch (op){ case ARMCI_ACC_INT: rows = bytes/sizeof(int); ldd = dst_stride/sizeof(int); lds = src_stride/sizeof(int); func = I_ACCUMULATE_2D; break; case ARMCI_ACC_LNG: rows = bytes/sizeof(long); ldd = dst_stride/sizeof(long); lds = src_stride/sizeof(long); func = L_ACCUMULATE_2D; break; case ARMCI_ACC_DBL: rows = bytes/sizeof(double); ldd = dst_stride/sizeof(double); lds = src_stride/sizeof(double); func = D_ACCUMULATE_2D; break; case ARMCI_ACC_DCP: rows = bytes/(2*sizeof(double)); ldd = dst_stride/(2*sizeof(double)); lds = src_stride/(2*sizeof(double)); func = Z_ACCUMULATE_2D; break; case ARMCI_ACC_CPL: rows = bytes/(2*sizeof(float)); ldd = dst_stride/(2*sizeof(float)); lds = src_stride/(2*sizeof(float)); func = C_ACCUMULATE_2D; break; case ARMCI_ACC_FLT: rows = bytes/sizeof(float); ldd = dst_stride/sizeof(float); lds = src_stride/sizeof(float); func = F_ACCUMULATE_2D; break; case ARMCI_ACC_RA: rows = bytes/sizeof(long); ldd = dst_stride/sizeof(long); lds = src_stride/sizeof(long); func = RA_ACCUMULATE_2D; break; default: armci_die("ARMCI accumulate: operation not supported",op); func = F_ACCUMULATE_2D; /*avoid compiler whining */ } if(lockit){ span = cols*dst_stride; ARMCI_LOCKMEM(dst_ptr, span + (char*)dst_ptr, proc); } func(scale, &rows, &cols, dst_ptr, &ldd, src_ptr, &lds); if(lockit)ARMCI_UNLOCKMEM(proc); ARMCI_PR_DBG("exit",0); } /*\ compute range of strided data AND lock it \*/ static void armci_lockmem_patch(void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc) { long span = count[stride_levels]; ARMCI_PR_DBG("enter",0); span *= dst_stride_arr[stride_levels-1]; /* lock region of remote memory */ ARMCI_LOCKMEM(dst_ptr, span + (char*)dst_ptr, proc); ARMCI_PR_DBG("exit",0); } /*\ strided accumulate on top of remote memory copy: * copies remote data to local buffer, accumulates, puts it back * Note: if we are here then remote patch must fit in the ARMCI buffer \*/ int armci_acc_copy_strided(int optype, void* scale, int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels) { void *buf_ptr = armci_internal_buffer; int rc, i, *buf_stride_arr = armci_iwork; ARMCI_PR_DBG("enter",0); armci_lockmem_patch(dst_ptr,dst_stride_arr, count, stride_levels, proc); /* setup stride array for internal buffer */ buf_stride_arr[0]=count[0]; for(i=0; i< stride_levels; i++) { buf_stride_arr[i+1]= buf_stride_arr[i]*count[i+1]; } /* get remote data to local buffer */ rc = armci_op_strided(GET, scale, proc, dst_ptr, dst_stride_arr, buf_ptr, buf_stride_arr, count, stride_levels, 0,NULL); if(rc) { ARMCI_UNLOCKMEM(proc); return(rc); } /* call local accumulate with lockit=0 (we locked it already) and proc=me */ rc = armci_op_strided(optype, scale, armci_me, src_ptr, src_stride_arr, buf_ptr,buf_stride_arr, count, stride_levels,0,NULL); if(rc) { ARMCI_UNLOCKMEM(proc); return(rc); } /* put data back from the buffer to remote location */ rc = armci_op_strided(PUT, scale, proc, buf_ptr, buf_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels,0,NULL); FENCE_NODE(proc); /* make sure put completes before unlocking */ ARMCI_UNLOCKMEM(proc); /* release memory lock */ ARMCI_PR_DBG("exit",0); return(rc); } /*\ Strided operation \*/ int armci_op_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int lockit, armci_ihdl_t nb_handle) { char *src = (char*)src_ptr, *dst=(char*)dst_ptr; int s2, s3, i,j, unlockit=0; int total_of_2D; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",op); # if defined(ACC_COPY) # ifdef ACC_SMP if(ARMCI_ACC(op) && !(SAMECLUSNODE(proc)) ) # else if ( ARMCI_ACC(op) && proc!=armci_me) # endif /* copy remote data, accumulate, copy back*/ return (armci_acc_copy_strided(op,scale, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels)); else; /* do it directly through shared/local memory */ # endif if(ARMCI_ACC(op) && (stride_levels>2) && lockit){ /* we need one lock operation only - must be done outside 2d acc */ armci_lockmem_patch(dst_ptr,dst_stride_arr, count, stride_levels, proc); unlockit=1; lockit =0; } /* if(proc!=armci_me) INTR_OFF;*/ if(armci_me>=0 && !SAMECLUSNODE(proc)) { printf("%s network_strided not supported (in op_strided)\n",Portals_ID()); abort(); armci_network_strided(op,scale,proc,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,nb_handle); } else { // printf("%s in large switch stmt in op_strided (stride_levels=%d)\n",Portals_ID(),stride_levels); switch (stride_levels) { case 0: /* 1D copy */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], 1, count[0], count[0], lockit); break; case 1: /* 2D op */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); break; case 2: /* 3D op */ for (s2= 0; s2 < count[2]; s2++){ /* 2D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit ); } break; case 3: /* 4D op */ for(s3=0; s3< count[3]; s3++){ src = (char*)src_ptr + src_stride_arr[2]*s3; dst = (char*)dst_ptr + dst_stride_arr[2]*s3; for (s2= 0; s2 < count[2]; s2++){ /* 3D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1],src_stride_arr[0], dst_stride_arr[0],lockit); } } break; default: /* N-dimensional */ { /* stride_levels is not the same as ndim. it is ndim-1 * For example a 10x10x10... array, suppose the datatype is byte * the stride_arr is 10, 10x10, 10x10x10 .... */ index[2] = 0; unit[2] = 1; total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } ARMCI_OP_2D(op, scale, proc, src, dst, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); } } } } // ends else block // printf("%s after switch stmt; prior to fence/lock\n",Portals_ID()); if(unlockit){ # if defined(ACC_COPY) FENCE_NODE(proc); # endif ARMCI_UNLOCKMEM(proc); /* release memory lock */ } // printf("%s after fence/lock; leaving op_strided\n",Portals_ID()); ARMCI_PR_DBG("exit",op); return 0; } int PARMCI_PutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { int rc=0, direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; ORDER(PUT,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ if(stride_levels) direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif // printf("%s direct=%d, proc=%d\n",Portals_ID(),direct,proc); if(!direct){ DO_FENCE(proc,SERVER_PUT); // printf("%s calling pack_strided in PARMCI_PutS\n",Portals_ID()); rc = armci_pack_strided(PUT, NULL, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels, NULL, -1, -1, -1,NULL); } else { if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); // printf("%s calling op_strided in PARMCI_PutS\n",Portals_ID()); rc = armci_op_strided( PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count,stride_levels, 0,NULL); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_PutS_flag( void* src_ptr, /* pointer to 1st segment at source */ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination */ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level, count[0] = #bytes */ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ) { int bytes; /* Put local data on remote processor */ PARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); /* Send signal to remote processor that data transfer has * been completed. */ bytes = sizeof(int); ARMCI_Put(&val, flag, bytes, proc); return 1; } int PARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc) { return PARMCI_PutS_flag(src, NULL, dst, NULL, &bytes, 0, f, v, proc); } int PARMCI_PutS_flag_dir(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, int *flag, int val, int proc) { return PARMCI_PutS_flag(src_ptr, src_stride_arr,dst_ptr,dst_stride_arr, seg_count, stride_levels, flag, val, proc); } int PARMCI_GetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { int rc,direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0||proc>=armci_nproc){printf("\n%d:%s:proc=%d",armci_me,FUNCTION_NAME,proc);fflush(stdout);return FAIL5;} ORDER(GET,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_GET_ if(stride_levels)direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif if(!direct){ DO_FENCE(proc,SERVER_GET); rc = armci_pack_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, NULL,-1,-1,-1,NULL); }else{ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_op_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count, stride_levels,0,NULL); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_AccS( int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { int rc, direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(src_stride_arr == NULL || dst_stride_arr ==NULL) return FAIL2; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; ORDER(optype,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ direct=SAMECLUSNODE(proc); #endif # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct) rc = armci_op_strided(optype,scale, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,1,NULL); else{ DO_FENCE(proc,SERVER_PUT); rc = armci_pack_strided(optype,scale,proc,src_ptr, src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,NULL,-1,-1,-1,NULL); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } /* whatever original put and get functions were here have been replaced with the proper ones from the main armci branch. the old functions were entirely responsible for causing the test_vector_acc test to fail in test.x */ int PARMCI_Put(void *src, void* dst, int bytes, int proc) { int rc=0; //ARMCI_PROFILE_START_STRIDED(&bytes, 0, proc, ARMCI_PROF_PUT); rc = PARMCI_PutS(src, NULL, dst, NULL, &bytes, 0, proc); //ARMCI_PROFILE_STOP_STRIDED(ARMCI_PROF_PUT); assert(rc==0); return rc; } int PARMCI_Get(void *src, void* dst, int bytes, int proc) { int rc=0; //ARMCI_PROFILE_START_STRIDED(&bytes, 0, proc, ARMCI_PROF_GET); #ifdef __crayx1 memcpy(dst,src,bytes); #else rc = PARMCI_GetS(src, NULL, dst, NULL, &bytes, 0, proc); #endif //ARMCI_PROFILE_STOP_STRIDED(ARMCI_PROF_GET); //dassert(1,rc==0); assert(rc==0); return rc; } int PARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc) { int rc=0; rc = PARMCI_AccS(optype, scale, src, NULL, dst, NULL, &bytes, 0, proc); return rc; } #define PACK1D 1 #if PACK1D # define armci_read_strided1 armci_read_strided # define armci_write_strided1 armci_write_strided #else # define armci_read_strided2 armci_read_strided # define armci_write_strided2 armci_write_strided #endif void armci_write_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bytes = count[0]; ARMCI_PR_DBG("enter",stride_levels); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } armci_copy( ((char*)ptr)+idx, buf, bytes); buf += count[0]; } ARMCI_PR_DBG("exit",stride_levels); } void armci_write_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",stride_levels); if(stride_levels == 0){ armci_copy( ptr, buf, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE ) armci_write_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY21(&rows, count+1, ptr, &ld, buf, &idx); break; case 2: ldd = stride_arr[1]/stride_arr[0]; DCOPY31(&rows, count+1, count+2, ptr, &ld, &ldd, buf,&idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY21(&rows, count+1,src, &ld, buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ ARMCI_PR_DBG("exit",stride_levels); } void armci_read_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bytes = count[0]; ARMCI_PR_DBG("enter",stride_levels); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } armci_copy(buf, ((char*)ptr)+idx,bytes); buf += count[0]; } ARMCI_PR_DBG("exit",stride_levels); } void armci_read_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",stride_levels); if(stride_levels == 0){ armci_copy( buf, ptr, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE) armci_read_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY12(&rows, count+1, ptr, &ld, buf, &idx); break; case 2: ldd = stride_arr[1]/stride_arr[0]; DCOPY13(&rows, count+1, count+2, ptr, &ld, &ldd, buf,&idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY12(&rows, count+1,src, &ld, buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ ARMCI_PR_DBG("exit",stride_levels); } /*\Non-Blocking API \*/ int PARMCI_NbPutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int *count=seg_count, tmp_count=0; int rc=0, direct=1; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ if(stride_levels)direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, PUT, nb_handle); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = PUT; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(PUT, proc); } if(!direct){ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_strided(PUT, NULL, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,NULL,-1,-1,-1,nb_handle); } else{ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_NBPUT); rc = armci_op_strided( PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, 0,nb_handle); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_NbGetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: byte_count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0,direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; #if DATA_SERVER_GET_ if(stride_levels)direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif PREPROCESS_STRIDED(tmp_count); if(nb_handle && nb_handle->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, GET, nb_handle); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { /* ORDER(GET,proc); ensure ordering */ /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(GET, proc); } if(!direct){ DO_FENCE(proc,SERVER_NBGET); rc = armci_pack_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, NULL,-1,-1,-1,nb_handle); } else{ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_op_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count, stride_levels,0,nb_handle); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_NbAccS( int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int *count=seg_count, tmp_count=0; int rc, direct=1; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(src_stride_arr == NULL || dst_stride_arr ==NULL) return FAIL2; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; UPDATE_FENCE_INFO(proc); PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ direct=SAMECLUSNODE(proc); #endif # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = optype; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(optype, proc); if(direct){ rc = armci_op_strided(optype,scale, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,1,NULL); } else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_strided(optype,scale,proc,src_ptr, src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,NULL,-1,-1,-1,nb_handle); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } #if !defined(ACC_COPY)&&!defined(CRAY_YMP)&&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML) # define REMOTE_OP #endif #define INIT_NB_HANDLE(nb,o,p) if(nb){\ (nb)->tag = 0;\ (nb)->op = (o); (nb)->proc= (p);\ (nb)->bufid=NB_NONE;}\ else { (nb)=armci_set_implicit_handle(o, p); (nb)->tag=0; } void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc) { if(nb_handle) { *nbh=(armci_ihdl_t)nb_handle; } else { *nbh=armci_set_implicit_handle(op, proc); } } int PARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc=0, direct=0; armci_ihdl_t nb_handle = (armci_ihdl_t)uhandle; ARMCI_PR_DBG("enter",proc); if(src == NULL || dst == NULL) return FAIL; direct =SAMECLUSNODE(proc); /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(direct) { armci_copy(src,dst,bytes); rc=0; } else rc=armci_agg_save_descriptor(src,dst,bytes,proc,PUT,0,nb_handle); return rc; } if(direct) { /*armci_wait needs proc to compute direct*/ INIT_NB_HANDLE(nb_handle,PUT,proc); armci_copy(src,dst,bytes); } else{ # ifdef PORTALS rc=PARMCI_NbPutS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # else # ifdef ARMCI_NB_PUT INIT_NB_HANDLE(nb_handle,PUT,proc); UPDATE_FENCE_STATE(proc, PUT, 1); ARMCI_NB_PUT(src, dst, bytes, proc, &nb_handle->cmpl_info); # else rc=PARMCI_NbPutS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # endif # endif } ARMCI_PR_DBG("exit",proc); return(rc); } int PARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc=0, direct=0; armci_ihdl_t nb_handle = (armci_ihdl_t)uhandle; ARMCI_PR_DBG("enter",proc); if(src == NULL || dst == NULL) return FAIL; direct =SAMECLUSNODE(proc); if(nb_handle && nb_handle->agg_flag == SET) { if(direct) { armci_copy(src,dst,bytes); rc=0; } else rc=armci_agg_save_descriptor(src,dst,bytes,proc,GET,0,nb_handle); return rc; } if(direct) { /*armci_wait needs proc to compute direct*/ INIT_NB_HANDLE(nb_handle,PUT,proc); armci_copy(src,dst,bytes); }else{ # ifdef PORTALS rc=PARMCI_NbGetS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # else # ifdef ARMCI_NB_GET /*set tag and op in the nb handle*/ INIT_NB_HANDLE(nb_handle,GET,proc); ARMCI_NB_GET(src, dst, bytes, proc, &nb_handle->cmpl_info); # else rc=PARMCI_NbGetS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # endif # endif } ARMCI_PR_DBG("exit",proc); return(rc); } static void _armci_rem_value(int op, void *src, void *dst, int proc, int bytes) { int rc=0; int armci_th_idx = ARMCI_THREAD_IDX; ORDER(op,proc); /* ensure ordering */ #if defined(REMOTE_OP) && !defined(QUADRICS) rc = armci_rem_strided(op, NULL, proc, src, NULL, dst, NULL, &bytes, 0, NULL, 0, NULL); if(rc) armci_die("ARMCI_Value: armci_rem_strided incomplete", FAIL6); #else if(op==PUT) { UPDATE_FENCE_STATE(proc, PUT, 1); # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx], 1); # endif #if defined(BGML) /* fprintf(stderr,"bytes: %d\n",bytes); */ /* this call is blocking, so local count is fine */ BG1S_t req; unsigned count=1; BGML_Callback_t cb_wait={wait_callback, &count}; BG1S_Memput(&req, proc, src, 0, dst, bytes, &cb_wait, 1); BGML_Wait(&count); #else armci_put(src, dst, bytes, proc); #endif } else { # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], 1); # endif #if defined(BGML) /* fprintf(stderr,"before memget\n"); */ BG1S_t req; unsigned count=1; BGML_Callback_t cb_wait={wait_callback, &count}; BG1S_Memget(&req, proc, dst, 0, src, bytes, &cb_wait, 1); BGML_Wait(&count); #else armci_get(src, dst, bytes, proc); #endif } /* deal with non-blocking loads and stores */ # if defined(LAPI) || defined(_ELAN_PUTGET_H) if(proc != armci_me){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } #endif #endif } /* non-blocking remote value put/get operation */ static void _armci_nb_rem_value(int op, void *src, void *dst, int proc, int bytes, armci_ihdl_t nb_handle) { int rc=0, pv=0; int armci_th_idx = ARMCI_THREAD_IDX; if(nb_handle && nb_handle->agg_flag == SET) { if(op==PUT) pv = 1; (void)armci_agg_save_descriptor(src,dst,bytes,proc,op,pv,nb_handle); return; } else { if(op==PUT) UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(op, proc); } #if defined(REMOTE_OP) && !defined(QUADRICS) rc = armci_rem_strided(op, NULL, proc, src, NULL, dst, NULL, &bytes, 0, NULL, 0, nb_handle); if(rc) armci_die("ARMCI_Value: armci_rem_strided incomplete", FAIL6); #else if(op==PUT) { UPDATE_FENCE_STATE(proc, PUT, 1); # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx], 1); # endif armci_put(src, dst, bytes, proc); } else { # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], 1); # endif armci_get(src, dst, bytes, proc); } /* deal with non-blocking loads and stores */ # if defined(LAPI) || defined(_ELAN_PUTGET_H) # ifdef LAPI if(!nb_handle) # endif { if(proc != armci_me){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } } # endif #endif } #define CHK_ERR(dst, proc) \ if(dst==NULL) armci_die("PARMCI_PutValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("PARMCI_PutValue: Invalid process rank", proc); #define CHK_ERR_GET(src, dst, proc, bytes) \ if(src==NULL || dst==NULL) armci_die("PARMCI_GetValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("PARMCI_GetValue: Invalid process rank", proc); \ if(bytes<0) armci_die("PARMCI_GetValue: Invalid size", bytes); /** * Register-Originated Put. */ int PARMCI_PutValueInt(int src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(int)); return 0; } int PARMCI_PutValueLong(long src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(long)); return 0; } int PARMCI_PutValueFloat(float src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(float)); return 0; } int PARMCI_PutValueDouble(double src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(double)); return 0; } /** * Non-Blocking register-originated put. */ int PARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(int),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(long),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(float),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(double),(armci_ihdl_t)usr_hdl); return 0; } #if 1 /** * Register-Originated Get. */ int PARMCI_GetValueInt(void *src, int proc) { int dst; if( SAMECLUSNODE(proc) ) return *(int *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(int)); return dst; } long PARMCI_GetValueLong(void *src, int proc) { long dst; if( SAMECLUSNODE(proc) ) return *(long *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(long)); return dst; } float PARMCI_GetValueFloat(void *src, int proc) { float dst; if( SAMECLUSNODE(proc) ) return *(float *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(float)); return dst; } double PARMCI_GetValueDouble(void *src, int proc) { double dst; if( SAMECLUSNODE(proc) ) return *(double *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(double)); return dst; } #endif #if 0 /** * Register-Originated Get. */ int PARMCI_GetValue(void *src, void *dst, int proc, int bytes) { CHK_ERR_GET(src, dst, proc, bytes); if( SAMECLUSNODE(proc) ) { armci_copy(src, dst, bytes); } else _armci_rem_value(GET, src, dst, proc, bytes); return 0; } /** * Non-Blocking register-originated get. */ int PARMCI_NbGetValue(void *src, void *dst, int proc, int bytes, armci_hdl_t* usr_hdl) { CHK_ERR_GET(src, dst, proc, bytes); if( SAMECLUSNODE(proc) ) { armci_copy(src, dst, bytes); } else _armci_nb_rem_value(GET, src, dst, proc, bytes, (armci_ihdl_t)usr_hdl); return 0; } #endif ga-5-4/armci/src-portals/request.h0000644000175000017500000003375712662210425015254 0ustar mbamba#ifndef _REQUEST_H_ #define _REQUEST_H_ /******** client buffer managment ops ****************************/ extern void _armci_buf_init(); extern char* _armci_buf_get(int size, int operation, int to); extern void _armci_buf_release(void *buf); extern int _armci_buf_to_index(void *buf); extern char* _armci_buf_ptr_from_id(int id); extern void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node); #if defined(SERV_QUEUE) extern void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node); #endif extern void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol); extern void _armci_buf_clear_all(); extern void x_buf_send_complete(void *); extern INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to); extern INLINE void _armci_buf_set_busy(void *buf, int state); extern INLINE void _armci_buf_set_busy_idx(int tbl_idx, int state); extern INLINE int _armci_buf_cmpld(int bufid); extern INLINE void _armci_buf_set_cmpld(void *buf, int state); extern INLINE void _armci_buf_set_cmpld_idx(int idx, int state); #ifdef LAPI # include "lapidefs.h" #elif PORTALS # include "armci_portals.h" #elif defined(GM) # include "myrinet.h" #elif defined(DOELAN4) # include "elandefs.h" #elif defined(QUADRICS) # include typedef void* msg_tag_t; # ifdef _ELAN_PUTGET_H # define NB_CMPL_T ELAN_EVENT* # endif #elif defined(VIA) # include "via.h" typedef void* msg_tag_t; #elif defined(VAPI) # include "armci-vapi.h" #elif defined(SOCKETS) # include "sockets.h" typedef long msg_tag_t; typedef unsigned short msg_id_t; # define DTAG_ ((1<<(sizeof(msg_id_t)*8))-1) # define NB_SOCKETS_ /* define NB_SOCKETS to allow non-blocking path */ #elif defined(HITACHI) # include "sr8k.h" #elif defined(BGML) # include "bgml.h" # include "bgmldefs.h" # define NB_CMPL_T BG1S_t typedef long msg_tag_t; #elif defined(MPI_SPAWN) # include "mpi2.h" # define MSG_BUFLEN_DBL 500000 typedef long msg_tag_t; #else typedef long msg_tag_t; #endif #ifndef CLEAR_HNDL_FIELD # define CLEAR_HNDL_FIELD(_x) #endif #define ACK_QUIT 0 #define QUIT 33 #define ATTACH 34 #define REGISTER 35 /*\ the internal request structure for non-blocking api. \*/ typedef struct{ unsigned int tag; short int bufid; short int agg_flag; int op; int proc; #ifdef NB_CMPL_T NB_CMPL_T cmpl_info; #endif } armci_ireq_t; /*\ the internal request structure for non-blocking api. \*/ typedef armci_ireq_t* armci_ihdl_t; extern void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle, char *buf, int val); extern void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc); typedef struct { int to; /* message recipient */ int from; /* message sender */ int operation; /* operation code */ int format; /* data format used */ int bytes; /* number of bytes requested */ int datalen; /* >0 in lapi means that data is included */ int ehlen; /* size of extra header and the end of descr */ int dscrlen; /* >0 in lapi means that descriptor is included */ msg_tag_t tag; /* message tag for response to this request, MUST BE LAST */ }request_header_t; #include "portals.h" typedef struct _buf_ackresp{ long val,valc; portals_ds_req_t req; struct _buf_ackresp *next, *previous; } _buf_ackresp_t; /*******gpc call strctures*************/ #include #define MAX_GPC_REQ 1 #define MAX_GPC_REPLY_LEN (64*1024) #define MAX_GPC_SEND_LEN (64*1024) #define GPC_COMPLETION_SIGNAL SIGUSR1 typedef struct { int hndl; int hlen, dlen; void *hdr, *data; int rhlen, rdlen; void *rhdr, *rdata; } gpc_call_t; typedef struct { int active; /* int zombie; */ request_header_t msginfo; gpc_call_t call; char send[MAX_GPC_SEND_LEN]; char reply[MAX_GPC_REPLY_LEN]; } gpc_buf_t; /* gpc_buf_t *gpc_req; */ extern gpc_buf_t *gpc_req; extern void block_pthread_signal(int signo); extern void unblock_pthread_signal(int signo); /*******structures copied from async.c for storing cmpl dscr for nb req*******/ #define UBUF_LEN 112 typedef struct { unsigned int tag; /* request id*/ _buf_ackresp_t ar; short int bufid; /* communication buffer id */ short int protocol; /* what does this buf hold?*/ union { void *dscrbuf; /*in case dscr below is not enough, do a*/ double pad; /*malloc, save pointer in dscrbuf and use it*/ }ptr; char dscr[UBUF_LEN]; /*place to store the dscr*/ }_buf_info_t; #define BUF_INFO_T _buf_info_t extern BUF_INFO_T *_armci_buf_to_bufinfo(void *buf); #define BUF_TO_BUFINFO _armci_buf_to_bufinfo void armci_complete_req_buf(BUF_INFO_T *info, void *buffer); extern INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid); #if 0 && defined(DATA_SERVER) && defined(SOCKETS) #define MAX_BUFS 1 #define MAX_SMALL_BUFS 1 #else #if defined(SERV_QUEUE) #define MAX_BUFS 8 #define MAX_SMALL_BUFS 16 #else # ifdef PORTALS_USE_RENDEZ_VOUS # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE # define MAX_BUFS 4 # define MAX_SMALL_BUFS 8 # else # define MAX_BUFS 4 # define MAX_SMALL_BUFS 8 # endif # else # define MAX_BUFS 4 # define MAX_SMALL_BUFS 8 # endif #endif #endif /* tracks sockets used for receiving responces from data server (GET) */ typedef struct { int socks[MAX_BUFS+MAX_SMALL_BUFS]; /* sock # or -1 if not used */ int ready[MAX_BUFS+MAX_SMALL_BUFS]; /* 1 - ready, 0 - not */ } active_socks_t; /*valid values for the element protocol in BUF_INFO_T*/ #define SDSCR_IN_PLACE 1 /*indicated that strided descriptor is in place*/ #define VDSCR_IN_PLACE 2 /*indicated that vector descriptor is in place*/ #define VDSCR_IN_PTR 3 /*indicates that the vector descriptor in allocated and pointer stored in dscrbuf */ /****************************************************************************/ /* this effects: buf_ext_t, portalsEagerMessageSendSize, portals ds buffer size */ /* note: MSG_BUFLEN_DBL is being defined earlier in armci-portals.h */ #ifndef MSG_BUFLEN_DBL # if defined(HITACHI) # define MSG_BUFLEN_DBL 0x50000 # else # ifdef PORTALS_USE_RENDEZ_VOUS # define MSG_BUFLEN_DBL 50000 /* for rendez-vous, this can go bigger i think */ # else # define MSG_BUFLEN_DBL 8192 /* this is smaller when rendez-vous is off */ # endif # endif #endif #define MSG_BUFLEN sizeof(double)*MSG_BUFLEN_DBL extern char* MessageRcvBuffer; extern char* MessageSndBuffer; #ifdef LAPI # define GET_SEND_BUFFER_(_size)(MessageSndBuffer+sizeof(lapi_cmpl_t));\ CLEAR_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer));\ SET_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer),1); # define GET_SEND_BUFFER _armci_buf_get # define GA_SEND_REPLY armci_lapi_send #else # ifdef SOCKETS # define GA_SEND_REPLY(tag, buf, len, p) armci_sock_send(p,buf,len) # else # define GA_SEND_REPLY(tag, buf, len, p) # endif #endif #ifdef QUADRICS_ # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer;\ while(((request_header_t*)MessageSndBuffer)->tag)\ armci_util_spin(100, MessageSndBuffer) # define FREE_SEND_BUFFER(_ptr) ((request_header_t*)MessageSndBuffer)->tag = (void*)0 #endif #ifndef GET_SEND_BUFFER # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer #endif #ifndef FREE_SEND_BUFFER #define FREE_SEND_BUFFER(_ptr) #endif #ifndef INIT_SENDBUF_INFO #define INIT_SENDBUF_INFO(_hdl,_buf,_op,_proc) #endif typedef struct { char *buf; char* buf_posted; int count; int proc; int op; int extra; } buf_arg_t; /*includes for SERVER_LOCK*/ #if defined(SERVER_THREAD) && !defined(VIA) extern void armci_rem_lock(int mutex, int proc, int *ticket); extern void armci_rem_unlock(int mutex, int proc, int ticket); extern void armci_unlock_waiting_process(msg_tag_t tag,int proc, int ticket); #endif #ifdef PIPE_BUFSIZE extern void armcill_pipe_post_bufs(void *ptr, int stride_arr[], int count[], int strides, void* argvoid); extern void armcill_pipe_extract_data(void *ptr,int stride_arr[],int count[], int strides, void* argvoid); extern void armcill_pipe_send_chunk(void *data, int stride_arr[],int count[], int strides, void* argvoid); #endif extern void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[],int tag); extern void armci_rcv_hdlr(request_header_t* msginfo); extern char *armci_rcv_data(int proc, request_header_t *msginfo, int rcvlen); extern void armci_rcv_strided_data_bypass(int proc, request_header_t *msginfo, void *ptr, int stride_levels); extern void armci_send_strided_data_bypass(int proc, request_header_t *msginfo, void *loc_buf, int msg_buflen, void *loc_ptr, int *loc_stride_arr, void *rem_ptr, int *rem_stride_arr, int *count, int stride_levels); extern void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]); extern void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_send_req(int proc, request_header_t* msginfo, int len,int tag); extern void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra); extern int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,int flag,armci_ihdl_t nb_handle); extern int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int lockit,armci_ihdl_t nb_handle); extern void armci_rem_rmw(int op, void *ploc, void *prem, int extra, int proc); extern void armci_rem_ack(int clus); extern void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void armci_server_vector(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void *armci_server_ptr(int); extern void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen); extern void armci_server_lock(request_header_t *msginfo); extern void armci_server_unlock(request_header_t *msginfo, char* dscr); extern void armci_create_server_thread ( void* (* func)(void*) ); extern int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag); extern void armci_send_data(request_header_t* msginfo, void *data); extern int armci_server_unlock_mutex(int mutex, int p, int tkt, msg_tag_t* tag); extern void armci_rcv_vector_data(int p, request_header_t* msginfo, armci_giov_t dr[], int len); #if !defined(LAPI) extern void armci_wait_for_server(); extern void armci_start_server(); extern void armci_transport_cleanup(); extern int armci_send_req_msg(int proc, void *buf, int bytes,int tag); extern void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf); extern char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len); extern void armci_init_connections(); extern void *armci_server_code(void *data); extern void armci_rcv_req(void *mesg, void *phdr, void *pdescr, void *pdata, int *buflen); extern void armci_client_connect_to_servers(); extern void armci_data_server(void *mesg); extern void armci_server_initial_connection(); extern void armci_call_data_server(); #endif #ifdef SOCKETS extern void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_WriteStridedToDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_serv_quit(); extern int armci_send_req_msg_strided(int proc, request_header_t *msginfo, char *ptr, int strides, int stride_arr[],int count[]); extern void armci_server_goodbye(request_header_t* msginfo); #endif #ifdef MPI_SPAWN extern void armci_serv_quit(); extern void armci_server_goodbye(request_header_t* msginfo); #endif #ifdef HITACHI extern void armci_server_goodbye(request_header_t* msginfo); extern void armci_serv_quit(); #endif extern void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen); #ifdef PIPE_BUFSIZE extern void armci_pipe_prep_receive_strided(request_header_t *msginfo,char *buf, int strides, int stride_arr[], int count[], int bufsize); extern void armci_pipe_receive_strided(request_header_t* msginfo, void *ptr, int stride_arr[], int count[], int strides); extern void armci_pipe_send_req(int proc, void *buf, int bytes); #endif extern void armci_rcv_strided_data_bypass_both(int, request_header_t*,void*, int*, int); extern int armci_rem_get(int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle,void *mhloc,void *mhrem); #if defined(ALLOW_PIN) && defined(VAPI) extern int armci_two_phase_send(int proc,void *src_ptr,int src_stride_arr[], void *dst_ptr,int dst_stride_arr[],int count[], int stride_levels,void ** context_ptr,armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); extern int armci_two_phase_get(int proc, void*src_ptr, int src_stride_arr[], void*dst_ptr,int dst_stride_arr[], int count[], int stride_levels, void**context_ptr, armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); #endif #endif ga-5-4/armci/src-portals/spawn.c0000644000175000017500000000601612662210425014673 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* OS specific server process/thread creation and destruction * JN/03.25.2000 */ #if HAVE_STDIO_H # include #endif #if HAVE_ERRNO_H # include #endif #include "armcip.h" #ifdef WIN32 /************************** Windows threads **************************/ #if HAVE_WINDOWS_H # include #endif #if HAVE_PROCESS_H # include #endif thread_id_t armci_serv_tid; unsigned long armci_serv_handle; #ifndef NO_STDLIBC #define NEWTHREAD CreateThread #else #define NEWTHREAD _beginthreadex #endif unsigned __stdcall armci_wrap_func(void *arg) { void (*func)(void*); func = arg; /* boost the server thread priority be better responsiveness */ (void)SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); func(NULL); return (unsigned)0; } void armci_create_server_thread ( void* (* func)(void*) ) { /* as we need to use std C rt library we cannot use CreateThread */ armci_serv_handle = NEWTHREAD(NULL, 0, armci_wrap_func, (void*)func, 0, &armci_serv_tid); if(!armci_serv_handle) armci_die("armci_create_server_thread: create failed",0); } void armci_terminate_server_thread() { /*int rc;*/ /* TerminateThread(armci_serv_handle,&rc);*/ } /****************************** PTHREADS *****************************/ #elif defined(PTHREADS) #include thread_id_t armci_serv_tid; void armci_create_server_thread ( void* (* func)(void*) ) { pthread_attr_t attr; int rc; if(pthread_attr_init(&attr)) armci_die("armci_create_server_thread: attr init failed",0); #if defined(AIX) || defined(SOLARIS) pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); #endif rc = pthread_create(&armci_serv_tid, &attr, func, NULL); if(rc) armci_die("armci_create_server_thread: create failed",errno); pthread_attr_destroy(&attr); } void armci_terminate_server_thread() { if(pthread_join(armci_serv_tid,NULL)) armci_die("armci_terminate_server_thread: failed",0); } #else /**************************** Unix processes ******************************/ #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_WAIT_H # include #endif pid_t server_pid= (pid_t)0; char child_stack[256*1024]; char *child_stack_top = &child_stack[256*1024-1]; void armci_create_server_process ( void* (* func)(void*) ) { pid_t pid; /* if ( (pid = fork() ) < 0) armci_die("fork failed", (int)pid); */ pid = clone(func, (void*)child_stack_top, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM, NULL); if (pid == -1) { armci_die("fork failed", (int)pid); } server_pid = pid; } void armci_wait_server_process() { int stat; pid_t rc; if(!server_pid) return; rc = wait (&stat); if (rc != server_pid){ perror("ARMCI master: wait for child process (server) failed:"); } server_pid = (pid_t)0; } #endif ga-5-4/armci/src-portals/utils.h0000644000175000017500000000724612662210425014716 0ustar mbamba/* $Id: utils.h,v 1.1.2.3 2007-07-02 05:35:31 d3p687 Exp $ * * primitives for transparent handling of multi-threading */ #ifndef UTILS_H #define UTILS_H /* * This header file describes the "barrier" synchronization * construct. The type barrier_t describes the full state of the * barrier including the POSIX 1003.1c synchronization objects * necessary. * * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. */ #ifdef THREAD_SAFE # ifdef POSIX_THREADS # include #if 1 typedef pthread_mutex_t thread_lock_t; # define THREAD_LOCK_INIT(x) pthread_mutex_init(&x,NULL) # define THREAD_LOCK_DESTROY(x) pthread_mutex_destroy(&x) # define THREAD_LOCK(x) pthread_mutex_lock(&x) # define THREAD_UNLOCK(x) pthread_mutex_unlock(&x) #else #ifndef INLINE # define INLINE # include "spinlock.h" # undef INLINE #else # include "spinlock.h" #endif typedef LOCK_T thread_lock_t; # define THREAD_LOCK_INIT(x) armci_init_spinlock(&x) # define THREAD_LOCK_DESTROY(x) 0 # define THREAD_LOCK(x) armci_acquire_spinlock(&x) # define THREAD_UNLOCK(x) armci_release_spinlock(&x) #endif typedef pthread_t thread_t; # define THREAD_CREATE(th_,func_,arg_) pthread_create(th_,NULL,func_,arg_) # define THREAD_JOIN(th_,ret_) pthread_join(th_,ret_) /* structure describing a barrier */ typedef struct thread_barrier_tag { pthread_mutex_t mutex; /* Control access to barrier */ pthread_cond_t cv; /* wait for barrier */ int valid; /* set when valid */ int threshold; /* number of threads required */ int counter; /* current number of threads */ int cycle; /* alternate wait cycles (0 or 1) */ } thread_barrier_t; # define BARRIER_VALID 0xdbcafe /* support static initialization of barriers */ # define BARRIER_INITIALIZER(cnt) {\ PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER,\ BARRIER_VALID, cnt, cnt, 0} # else # error ONLY PTHREADS SUPPORT HAS BEEN IMPLEMENTED # endif # define TH2PROC(th_) (th_/mt_tpp) /* computes processor from thread id */ /* barrier functions */ int thread_barrier_init (thread_barrier_t *barrier, int count); int thread_barrier_destroy (thread_barrier_t *barrier); int thread_barrier_wait (thread_barrier_t *barrier); /* multi-threaded memory functions */ int armci_malloc_mt(void *ptr[], int bytes); int armci_free_mt(void *ptr, int th_idx); # define ARMCI_MALLOC_MT armci_malloc_mt # define ARMCI_FREE_MT armci_free_mt # define TH_INIT(p_,t_) mt_size=p_;mt_tpp=t_;\ thread_barrier_init(&mt_barrier,mt_tpp) # define TH_FINALIZE() thread_barrier_destroy(&mt_barrier) # define MT_BARRIER() if (thread_barrier_wait(&mt_barrier)==-1) armci_msg_barrier();\ thread_barrier_wait(&mt_barrier) extern int mt_size; extern int mt_tpp; extern thread_barrier_t mt_barrier; #else # define THREAD_LOCK_INIT(x) # define THREAD_LOCK_DESTROY(x) # define THREAD_LOCK(x) # define THREAD_UNLOCK(x) # define TH_INIT(p_,t_) # define TH_FINALIZE() # define MT_BARRIER armci_msg_barrier # define ARMCI_MALLOC_MT PARMCI_Malloc # define ARMCI_FREE_MT(p_,th_) PARMCI_Free(p_) #endif #endif/*UTILS_H*/ ga-5-4/armci/src-portals/memlock.c0000644000175000017500000001622012662210425015170 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: memlock.c,v 1.24.2.3 2007-08-29 17:32:32 manoj Exp $ */ #include "armcip.h" #include "locks.h" #include "copy.h" #include "memlock.h" #include #define DEBUG_ 0 #define INVALID_VAL -9999999 #ifdef DATA_SERVER # define CORRECT_PTR #endif size_t armci_mem_offset=0; /* We start by using table: assign address of local variable set to 1 * On shmem systems, this addres is overwritten by a shared memory location * when memlock array is allocated in armci_init * Therefore, any process within shmem node can reset armci_use_memlock_table * to "not used" when offset changes. Since the variable is in shmem, everybody * on that SMP node will see the change and use the same locking functions */ int init_use_memlock_table=1; int *armci_use_memlock_table=&init_use_memlock_table; static int locked_slot=INVALID_VAL; volatile double armci_dummy_work=0.; void **memlock_table_array; /* constants for cache line alignment */ # define CALGN 64 # define LOG_CALGN 6 #define ALIGN_ADDRESS(x) (char*)((((unsigned long)x) >> LOG_CALGN) << LOG_CALGN) static memlock_t table[MAX_SLOTS]; /*\ simple locking scheme that ignores addresses \*/ void armci_lockmem_(void *pstart, void *pend, int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif if(DEBUG_){ printf("%d: armci_lockmem_ proc=%d lock=%d\n",armci_me,proc,lock); fflush(stdout); } NATIVE_LOCK(lock,proc); if(DEBUG_){ printf("%d: armci_lockmem_ done\n",armci_me); fflush(stdout); } } void armci_unlockmem_(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif if(DEBUG_){ printf("%d: armci_unlockmem_ proc=%d lock=%d\n",armci_me,proc,lock); fflush(stdout); } NATIVE_UNLOCK(lock,proc); } /*\ idle for a time proportional to factor \*/ void armci_waitsome(int factor) { int i=factor*100000; if(factor <= 1) armci_dummy_work =0.; if(factor < 1) return; while(--i){ armci_dummy_work = armci_dummy_work + 1./(double)i; } } /*\ acquire exclusive LOCK to MEMORY area owned by process "proc" * . only one area can be locked at a time by the calling process * . must unlock it with armci_unlockmem \*/ void armci_lockmem(void *start, void *end, int proc) { register void* pstart, *pend; register int slot, avail=0; int turn=0, conflict=0; memlock_t *memlock_table; #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_lockmem_(start, end, proc); return; } # ifndef SGIALTIX /* when processes are attached to a shmem region at different addresses, * addresses written to memlock table must be adjusted to the node master */ if(armci_mem_offset){ start = armci_mem_offset + (char*)start; end = armci_mem_offset + (char*)end; } # endif #endif if(DEBUG_){ printf("%d: calling armci_lockmem for %d range %p -%p\n", armci_me, proc, start,end); fflush(stdout); } memlock_table = (memlock_t*)memlock_table_array[proc]; #ifdef ALIGN_ADDRESS /* align address range on cache line boundary to avoid false sharing */ pstart = ALIGN_ADDRESS(start); pend = CALGN -1 + ALIGN_ADDRESS(end); #else pstart=start; pend =end; #endif #ifdef CRAY_SHMEM { /* adjust according the remote process raw address */ long bytes = (long) ((char*)pend-(char*)pstart); extern void* armci_shmalloc_remote_addr(void *ptr, int proc); pstart = armci_shmalloc_remote_addr(pstart, proc); pend = (char*)pstart + bytes; } #endif while(1){ NATIVE_LOCK(lock,proc); armci_get(memlock_table, table, sizeof(table), proc); /* armci_copy(memlock_table, table, sizeof(table));*/ /* inspect the table */ conflict = 0; avail =-1; for(slot = 0; slot < MAX_SLOTS; slot ++){ /* nonzero starting address means the slot is occupied */ if(table[slot].start == NULL){ /* remember a free slot to store address range */ avail = slot; }else{ /*check for conflict: overlap between stored and current range*/ if( (pstart >= table[slot].start && pstart <= table[slot].end) || (pend >= table[slot].start && pend <= table[slot].end) ){ conflict = 1; break; } /* printf("%d: locking %ld-%ld (%d) conflict\n", armci_me, */ } } if(avail != -1 && !conflict) break; NATIVE_UNLOCK(lock,proc); armci_waitsome( ++turn ); } /* we got the memory lock: enter address into the table */ table[avail].start = pstart; table[avail].end = pend; armci_put(table+avail,memlock_table+avail,sizeof(memlock_t),proc); FENCE_NODE(proc); NATIVE_UNLOCK(lock,proc); locked_slot = avail; } /*\ release lock to the memory area locked by previous call to armci_lockemem \*/ void armci_unlockmem(int proc) { void *null[2] = {NULL,NULL}; memlock_t *memlock_table; #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_unlockmem_(proc); return; } #endif #ifdef DEBUG if(locked_slot == INVALID_VAL) armci_die("armci_unlock: empty",0); if(locked_slot >= MAX_SLOTS || locked_slot <0) armci_die("armci_unlock: corrupted slot?",locked_slot); #endif memlock_table = (memlock_t*)memlock_table_array[proc]; armci_put(null,&memlock_table[locked_slot].start,2*sizeof(void*),proc); } /*\ based on address for set by master, determine correction for * memory addresses set in memlock table * if the correction/offset ever changes stop using memlock table locking \*/ void armci_set_mem_offset(void *ptr) { extern size_t armci_mem_offset; size_t off; static int first_time=1; volatile void *ref_ptr; ARMCI_PR_DBG("enter",0); /* do not care if memlock not used */ if(! *armci_use_memlock_table) return; if(!ptr) armci_die("armci_set_mem_offset : null ptr",0); ref_ptr = *(void**)ptr; off = (size_t)((char*)ref_ptr - (char*)ptr); if(first_time){ armci_mem_offset =off; first_time =0; if(DEBUG_){ printf("%d memlock offset=%ld ref=%p ptr=%p\n",armci_me, (long)armci_mem_offset, ref_ptr, ptr); fflush(stdout); } }else{ if(armci_mem_offset != off){ *armci_use_memlock_table =0; fprintf(stderr, "%d: WARNING:armci_set_mem_offset: offset changed %ld to %ld\n", armci_me, (long)armci_mem_offset, (long)off); fflush(stdout); } } } ga-5-4/armci/src-portals/mutex.c0000644000175000017500000002612612662210425014711 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif /* $Id: mutex.c,v 1.24.10.1 2006-12-21 23:50:48 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "parmci.h" #include "request.h" #define DEBUG 0 #define MAX_LOCKS 32768 #define SPINMAX 1000 #if defined(LAPI) || defined(GM) # define SERVER_LOCK #endif double _dummy_work_=0.; #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int mymutexcount; double _dummy_server_work_=0.; #endif static int num_mutexes=0, *tickets; typedef struct { int mutex; int turn; msg_tag_t tag; } waiting_list_t; /* data structure to store info about blocked (waiting) process for mutex */ static waiting_list_t* blocked=(waiting_list_t*)0; typedef struct { int* token; int* turn; int* tickets; int count; } mutex_entry_t; void** mutex_mem_ar; mutex_entry_t *glob_mutex; int PARMCI_Create_mutexes(int num) { int rc,p, totcount; int *mutex_count = (int*)armci_internal_buffer; if((sizeof(int)*armci_nproc) > armci_getbufsize()){ mutex_count = (double *)malloc(sizeof(int)*armci_nproc); } if (num < 0 || num > MAX_LOCKS) return(FAIL); if(num_mutexes) armci_die("mutexes already created",num_mutexes); if(armci_nproc == 1){ num_mutexes=1; return(0); } /* local memory allocation for mutex arrays*/ mutex_mem_ar = (void*) malloc(armci_nproc*sizeof(void*)); if(!mutex_mem_ar) armci_die("ARMCI_Create_mutexes: malloc failed",0); glob_mutex = (void*)malloc(armci_nproc*sizeof(mutex_entry_t)); if(!glob_mutex){ free(mutex_mem_ar); armci_die("ARMCI_Create_mutexes: malloc 2 failed",0); } /* bzero(mutex_count,armci_nproc*sizeof(int));*/ bzero((char*)mutex_count,sizeof(int)*armci_nproc); /* find out how many mutexes everybody allocated */ mutex_count[armci_me]=num; armci_msg_igop(mutex_count, armci_nproc, "+"); for(p=totcount=0; p< armci_nproc; p++)totcount+=mutex_count[p]; tickets = calloc(totcount,sizeof(int)); if(!tickets) { free(glob_mutex); free(mutex_mem_ar); return(FAIL2); } /* we need memory for token and turn - 2 ints */ rc = PARMCI_Malloc(mutex_mem_ar,2*num*sizeof(int)); if(rc){ free(glob_mutex); free(mutex_mem_ar); free(tickets); return(FAIL3); } if(num)bzero((char*)mutex_mem_ar[armci_me],2*num*sizeof(int)); /* setup global mutex array */ for(p=totcount=0; p< armci_nproc; p++){ glob_mutex[p].token = mutex_mem_ar[p]; glob_mutex[p].turn = glob_mutex[p].token + mutex_count[p]; glob_mutex[p].count = mutex_count[p]; glob_mutex[p].tickets = tickets + totcount; totcount += mutex_count[p]; } num_mutexes= totcount; #ifdef LAPI mymutexcount = num; #endif PARMCI_Barrier(); if(DEBUG) fprintf(stderr,"%d created (%d,%d) mutexes\n",armci_me,num,totcount); return(0); } void armci_serv_mutex_create() { int mem = armci_nproc*sizeof(waiting_list_t); blocked = (waiting_list_t*)malloc(mem); if(!blocked) armci_die("armci server:error allocating mutex memory ",0); } void armci_serv_mutex_close() { if(blocked) free(blocked ); blocked = (waiting_list_t*)0; } int PARMCI_Destroy_mutexes() { #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int proc, mutex, i,factor=0; #endif if(num_mutexes==0)armci_die("armci_destroy_mutexes: not created",0); if(armci_nproc == 1) return(0); armci_msg_barrier(); #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ for(proc=0;proc myturn) armci_die2("armci: problem with tickets",myturn,next_in_line); /* apply a linear backoff delay before retrying */ for(i=0; i< SPINMAX * factor; i++) _dummy_work_ += 1.; factor += 1; }while (myturn != next_in_line); glob_mutex[proc].tickets[mutex] = myturn; /* save ticket value */ } static void armci_generic_unlock(int mutex, int proc) { int *mutex_ticket= glob_mutex[proc].turn + mutex; int *newval = glob_mutex[proc].tickets +mutex; int len=sizeof(int); /* update ticket for next process requesting this mutex */ (*newval) ++; /* write new ticket value stored previously in tickets */ PARMCI_Put(newval, mutex_ticket, len, proc); MEM_FENCE; } /*\ Acquire mutex for "proc" * -must be executed in hrecv/AM handler thread * -application thread must use generic_lock routine \*/ int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag) { int myturn; int *mutex_ticket, next_in_line, len=sizeof(int); int owner = armci_me; if(DEBUG)fprintf(stderr,"SLOCK=%d owner=%d p=%d m=%d\n", armci_me,owner, proc,mutex); mutex_ticket= glob_mutex[owner].turn + mutex; myturn = register_in_mutex_queue(mutex, owner); armci_copy(mutex_ticket, &next_in_line, len); if(next_in_line > myturn) armci_die2("armci-s: problem with tickets",myturn,next_in_line); if(next_in_line != myturn){ if(!blocked)armci_serv_mutex_create(); blocked[proc].mutex = mutex; blocked[proc].turn = myturn; blocked[proc].tag = tag; if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d blocked (%d,%d)\n", armci_me, proc, next_in_line,myturn); return -1; } else { if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d sending ticket (%d)\n", armci_me, proc, myturn); /* send ticket to requesting node */ /* GA_SEND_REPLY(tag, &myturn, sizeof(int), proc); */ return (myturn); } } /*\ Release mutex "id" held by proc * called from hrecv/AM handler AND application thread \*/ int armci_server_unlock_mutex(int mutex, int proc, int Ticket, msg_tag_t* ptag) { #define NOBODY -1 int owner = armci_me; int i, p=NOBODY, *mutex_ticket= glob_mutex[owner].turn + mutex; int len=sizeof(int); if(DEBUG) fprintf(stderr,"SUNLOCK=%d node=%d mutex=%d ticket=%d\n", armci_me,proc,mutex,Ticket); Ticket++; armci_copy(&Ticket, mutex_ticket, len); /* if mutex is free then nobody is reqistered in queue */ if(armci_mutex_free(mutex, proc)) return -1; /* search for the next process in queue waiting for this mutex */ for(i=0; i< armci_nproc; i++){ if(!blocked)break; /* not allocated yet - nobody is waiting */ if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d list=(%d,%d)\n", armci_me, i, blocked[i].mutex, blocked[i].turn); if((blocked[i].mutex == mutex) && (blocked[i].turn == Ticket)){ p = i; break; } } /* send Ticket to a process waiting for mutex */ if(p != NOBODY){ if(p == armci_me)armci_die("server_unlock: cannot unlock self",0); else { if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d unlock ticket=%d go=%d\n", armci_me, proc, Ticket, p); /* GA_SEND_REPLY(blocked[p].tag, &Ticket, sizeof(int), p); */ *ptag = blocked[p].tag; return p; } } return -1; /* nobody is waiting */ } void PARMCI_Lock(int mutex, int proc) { #if defined(SERVER_LOCK) int direct; #endif if(DEBUG)fprintf(stderr,"%d enter lock\n",armci_me); if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); if(armci_nproc == 1) return; # if defined(SERVER_LOCK) direct=SAMECLUSNODE(proc); if(!direct) armci_rem_lock(mutex,proc, glob_mutex[proc].tickets + mutex ); else # endif armci_generic_lock(mutex,proc); if(DEBUG)fprintf(stderr,"%d leave lock\n",armci_me); } void PARMCI_Unlock(int mutex, int proc) { if(DEBUG)fprintf(stderr,"%d enter unlock\n",armci_me); if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); if(armci_nproc == 1) return; # if defined(SERVER_LOCK) if(armci_nclus >1) { if(proc != armci_me) armci_rem_unlock(mutex, proc, glob_mutex[proc].tickets[mutex]); else { int ticket = glob_mutex[proc].tickets[mutex]; msg_tag_t tag; int waiting; waiting = armci_server_unlock_mutex(mutex, proc, ticket, &tag); if(waiting >-1) armci_unlock_waiting_process(tag, waiting, ++ticket); } } else # endif armci_generic_unlock(mutex, proc); if(DEBUG)fprintf(stderr,"%d leave unlock\n",armci_me); } ga-5-4/armci/src-portals/gpc.h0000644000175000017500000000200512662210425014313 0ustar mbamba#ifndef __GPCDEF #define __GPCDEF #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define GPC_INIT 1 #define GPC_PROBE 2 #define GPC_WAIT 3 #define GPC_DONE 4 #define GPC_PENDING 5 typedef struct { int proc; armci_hdl_t ahdl; }gpc_hdl_t; /* #define ARMCI_GPC_HLEN 1024 */ /* #define ARMCI_GPC_DLEN 1024*1024 */ extern int ARMCI_Gpc_register( int (*func) ()); extern void ARMCI_Gpc_release(int handle); extern void * ARMCI_Gpc_translate(void *ptr, int proc, int from); extern void ARMCI_Gpc_lock(int proc); extern void ARMCI_Gpc_unlock(int proc); extern int ARMCI_Gpc_trylock(int proc); extern int ARMCI_Gpc_exec(int h,int p, void *hdr, int hlen, void *data,int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh); extern int PARMCI_Get_gpc_hlen(); extern int PARMCI_Get_gpc_dlen(); extern void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh); extern void ARMCI_Gpc_wait(gpc_hdl_t *nbh); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif ga-5-4/armci/src-portals/semaphores.c0000644000175000017500000000401712662210425015710 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: semaphores.c,v 1.12 2005-03-10 19:11:23 vinodtipparaju Exp $ */ #include "semaphores.h" #include #include int num_sem_alloc=0; void perror(); #ifdef SUN int fprintf(); void fflush(); int semget(),semctl(); #endif extern void armci_die(char*, int); struct sembuf sops; int semaphoreID; int SemGet(num_sem) int num_sem; { semaphoreID = semget(IPC_PRIVATE,num_sem, IPC_CREAT | 0600); if(semaphoreID<0){ fprintf(stderr," Semaphore Allocation Failed \nsuggestions to fix the problem: \n"); fprintf(stderr," 1. run ipcs and ipcrm -s commands to clean any semaphore ids\n"); fprintf(stderr," 2. verify if constant SEMMSL defined in file semaphore.h is set correctly for your system\n"); fprintf(stderr," 3. recompile semaphore.c\n"); sleep(1); perror("Error message from failed semget:"); armci_die(" exiting ...", num_sem); } num_sem_alloc = num_sem; return(semaphoreID); } void SemInit(id,value) int id,value; { int i, semid, num_sem; union semun semctl_arg; semctl_arg.val = value; if(id == ALL_SEMS){ semid = 0; num_sem = num_sem_alloc;} else { semid = id; num_sem = 1;} for(i=0; i< num_sem; i++){ if( semctl(semaphoreID, semid, SETVAL,semctl_arg )<0){ perror((char*)0); armci_die("SemInit error",id); } semid++; } } /* release semaphore(s) */ void SemDel() { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(semaphoreID,0,IPC_RMID,dummy); } void Sem_CreateInitLocks(int num, lockset_t *id) { *id = SemGet(num); SemInit(ALL_SEMS,1); } void Sem_InitLocks(int num, lockset_t id) { semaphoreID = id; num_sem_alloc = num; } void Sem_DeleteLocks(lockset_t id) { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(id,0,IPC_RMID,dummy); } ga-5-4/armci/src-portals/kr_malloc.c0000644000175000017500000004241412662210425015510 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: kr_malloc.c,v 1.24 2006-09-12 23:21:21 andriy Exp $ */ #include #include "kr_malloc.h" #include "armcip.h" /* for DEBUG purpose only. remove later */ #include "locks.h" #define DEBUG 0 /* Storage allocator basically copied from ANSI K&R and corrupted */ extern char *armci_allocate(); /* Used to get memory from the system */ extern void armci_die(); static char *kr_malloc_shmem(size_t nbytes, context_t *ctx); static void kr_free_shmem(char *ap, context_t *ctx); /** * DEFAULT_NALLOC: No. of units of length ALIGNMENT to get in every * request to the system for memory (8MB/64 => 128*1024units) * DEFAULT_MAX_NALLOC: Maximum number of units that can get i.e.1GB * (if unit size=64bytes, then max units=1024MB/64 = 16*1024*1024) */ #define DEFAULT_NALLOC (128*1024) #define DEFAULT_NALLOC_ALIGN 1024 #define DEFAULT_MAX_NALLOC (1024*1024*16) /* mutual exclusion defs go here */ #define LOCKED 100 #define UNLOCKED 101 static int lock_mode=UNLOCKED; /* enable locking only after armci is initailized as locks (and lock data structures) are initialized in PARMCI_Init */ #define LOCKIT(p) \ if(_armci_initialized && lock_mode==UNLOCKED) { \ NAT_LOCK(0,p); lock_mode=LOCKED; \ } #define UNLOCKIT(p) \ if(_armci_initialized && lock_mode==LOCKED) { \ NAT_UNLOCK(0,p); lock_mode=UNLOCKED; \ } static int do_verify = 0; /* Flag for automatic heap verification */ #define VALID1 0xaaaaaaaa /* For validity check on headers */ #define VALID2 0x55555555 #define USEDP 0 /* CHECK. By default anable this. */ static void kr_error(char *s, unsigned long i, context_t *ctx) { char string[256]; sprintf(string,"kr_malloc: %s %ld(0x%lx)\n", s, i, i); #if 0 kr_malloc_print_stats(ctx); #endif armci_die(string, i); } static Header *morecore(size_t nu, context_t *ctx, size_t *last_size, char **last_ptr) { char *cp; Header *up; #if DEBUG (void) printf("%d: morecore 1: Getting %ld more units of length %d nalloc=%d\n", armci_me, (long)nu, sizeof(Header),ctx->nalloc); (void) fflush(stdout); #endif if (ctx->total >= ctx->max_nalloc) { # if DEBUG armci_die("kr_malloc: morecore: maximum allocation reached",armci_me); # endif return (Header *) NULL; /* Enforce upper limit on core usage */ } #if 1 /* 07/03 ctx->nalloc is now the minimum # units we ask from OS */ nu = DEFAULT_NALLOC_ALIGN*((nu-1)/DEFAULT_NALLOC_ALIGN+1); if(nu < ctx->nalloc) nu = ctx->nalloc; #else nu = ctx->nalloc*((nu-1)/ctx->nalloc+1); /* nu must by a multiplicity of nalloc */ #endif #if DEBUG (void) printf("%d: morecore: Getting %ld more units of length %d\n", armci_me, (long)nu, sizeof(Header)); (void) fflush(stdout); #endif if ((cp =(char *)(*ctx->alloc_fptr)((size_t)nu * sizeof(Header))) == (char *)NULL) return (Header *) NULL; if(last_size!=NULL && last_ptr!=NULL){ *last_size = ((size_t)nu * sizeof(Header)); *last_ptr = cp; /*printf("\n%d:%s:got %p %d",armci_me,FUNCTION_NAME,*last_ptr,*last_size);*/ } /* if(armci_nclus==armci_nproc && armci_nclus!=1) armci_register_shmem(cp,((size_t)nu * sizeof(Header)),NULL,0,cp); */ ctx->total += nu; /* Have just got nu more units */ ctx->nchunk++; /* One more chunk */ ctx->nfrags++; /* Currently one more frag */ ctx->inuse += nu; /* Inuse will be decremented by kr_free */ up = (Header *) cp; up->s.size = nu; up->s.valid1 = VALID1; up->s.valid2 = VALID2; /* Insert into linked list of blocks in use so that kr_free works ... for debug only */ up->s.ptr = ctx->usedp; ctx->usedp = up; kr_free((char *)(up+1), ctx); /* Try to join into the free list */ return ctx->freep; } void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx) { int scale; if(usize <= 0) usize = sizeof(Header); scale = usize>>LOG_ALIGN; if(scale<1)fprintf(stderr,"Error: kr_malloc_init !!!\n"); if(nalloc==0) nalloc = DEFAULT_NALLOC; if(max_nalloc==0) max_nalloc = DEFAULT_MAX_NALLOC; ctx->usize = sizeof(Header); ctx->nalloc = nalloc * scale; ctx->max_nalloc = max_nalloc * scale; ctx->alloc_fptr = alloc_fptr; ctx->freep = NULL; ctx->usedp = NULL; ctx->shmid = -1; ctx->shmoffset = 0; ctx->shmsize = 0; ctx->ctx_type = -1; do_verify = debug; } char *_kr_last_ptr; size_t _kr_last_size; char *kr_malloc(size_t nbytes, context_t *ctx, int record_allocation, char **new_base, size_t *new_size) { Header *p, *prevp; size_t nunits; char *return_ptr; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) return kr_malloc_shmem(nbytes,ctx); #endif /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = 0; ctx->inuse = 0; ctx->nfrags = 0; ctx->maxuse = 0; ctx->nmcalls= 0; ctx->nfcalls= 0; /* Initialize linked list */ ctx->base.s.ptr = ctx->freep = prevp = &(ctx->base); ctx->base.s.size = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; } ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; for (p=prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) /* exact fit */ prevp->s.ptr = p->s.ptr; else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; return_ptr = (char *) (p+1); break; } if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx, &_kr_last_size,&_kr_last_ptr)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } } } if(record_allocation){ *((char **)new_base)=_kr_last_ptr; *new_size=_kr_last_size; } return return_ptr; } void kr_free(char *ap, context_t *ctx) { Header *bp, *p, **up; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) { kr_free_shmem(ap,ctx); return; } #endif ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=ctx->freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else p->s.ptr = bp; ctx->freep = p; } /* end if on ap */ } /* Print to standard output the usage statistics. */ void kr_malloc_print_stats(context_t *ctx) { fflush(stderr); printf("\nkr_malloc statistics\n-------------------\n\n"); printf("Total memory from system ... %ld bytes\n", (long)(ctx->total*ctx->usize)); printf("Current memory usage ....... %ld bytes\n", (long)(ctx->inuse*ctx->usize)); printf("Maximum memory usage ....... %ld bytes\n", (long)(ctx->maxuse*ctx->usize)); printf("No. chunks from system ..... %ld\n", ctx->nchunk); printf("No. of fragments ........... %ld\n", ctx->nfrags); printf("No. of calls to kr_malloc ... %ld\n", ctx->nmcalls); printf("No. of calls to kr_free ..... %ld\n", ctx->nfcalls); printf("\n"); fflush(stdout); } /* Currently assumes that are working in a single region. */ void kr_malloc_verify(context_t *ctx) { Header *p; if(_armci_initialized && lock_mode==UNLOCKED) { LOCKIT(armci_master); lock_mode=LOCKED; } if ( ctx->freep ) { /* Check the used list */ for (p=ctx->usedp; p; p=p->s.ptr) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on usedlist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on usedlist", (unsigned long) p->s.size, ctx); } /* Check the free list */ p = ctx->base.s.ptr; while (p != &(ctx->base)) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on freelist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on freelist", (unsigned long) p->s.size, ctx); p = p->s.ptr; } } /* end if */ if(_armci_initialized && lock_mode==LOCKED) { UNLOCKIT(armci_master); lock_mode=UNLOCKED; } } /********************** BEGIN: kr_malloc for ctx_shmem *********************/ #if defined(SYSV) || defined(MMAP) #include "armci_shmem.h" extern int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize); extern Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize); /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset) */ #define SHM_PTR(hdr) armci_get_shmem_ptr((hdr)->s.shmid, (hdr)->s.shmoffset, (hdr)->s.shmsize) /* * kr_malloc_shmem: memory allocator for shmem context (i.e ctx_shmem) */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { Header *p, *prevp; size_t nunits, prev_shmsize=0; char *return_ptr; int prev_shmid=-1; long prev_shmoffset=0; LOCKIT(armci_master); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("kr_malloc_shmem: Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = ctx->inuse = ctx->maxuse = 0; ctx->nfrags = ctx->nmcalls = ctx->nfcalls = 0; /* Initialize linked list */ ctx->base.s.size = 0; ctx->base.s.shmid = -1; ctx->base.s.shmoffset = 0; ctx->base.s.shmsize = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; if ((p = morecore(nunits, ctx,NULL,NULL)) == (Header *) NULL) return NULL; ctx->base.s.ptr = prevp = ctx->freep; /* CHECK */ } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; prevp = ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); for (p=SHM_PTR(prevp); ; prevp = p, p = SHM_PTR(p)) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) { /* exact fit */ prevp->s.ptr = p->s.ptr; prevp->s.shmid = p->s.shmid; prevp->s.shmoffset = p->s.shmoffset; prevp->s.shmsize = p->s.shmsize; } else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } #if USEDP /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; #endif ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; ctx->shmid = prev_shmid; ctx->shmoffset = prev_shmoffset; ctx->shmsize = prev_shmsize; return_ptr = (char *) (p+1); break; } prev_shmid = prevp->s.shmid; prev_shmoffset = prevp->s.shmoffset; prev_shmsize = prevp->s.shmsize; if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx,NULL,NULL)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; } } UNLOCKIT(armci_master); return return_ptr; } static void kr_free_shmem(char *ap, context_t *ctx) { Header *bp, *p, **up, *nextp; int shmid=-1; long shmoffset=0; size_t shmsize=0; LOCKIT(armci_master); ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free_shmem: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ #if USEDP /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free_shmem: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } #endif if(ctx->shmid==-1) { armci_get_shmem_info((char*)bp, &ctx->shmid, &ctx->shmoffset, &ctx->shmsize); ctx->base.s.shmid = ctx->shmid; ctx->base.s.shmsize = ctx->shmsize; ctx->base.s.shmoffset = ctx->shmoffset; p = ctx->freep = bp; p->s.ptr = bp; p->s.size-=SHMEM_CTX_BYTES; /*memory to store shmem info in context*/ p->s.shmid = ctx->shmid; p->s.shmsize = ctx->shmsize; p->s.shmoffset = ctx->shmoffset; UNLOCKIT(armci_master); return; } ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); shmid = ctx->shmid; shmoffset = ctx->shmoffset; shmsize = ctx->shmsize; /* Join the memory back into the free linked list */ p = ctx->freep; nextp = SHM_PTR(p); for ( ; !(bp > p && bp < nextp); p=nextp, nextp=SHM_PTR(p)) { if (p >= nextp && (bp > p || bp < nextp)) break; /* Freed block at start or end of arena */ nextp = SHM_PTR(p); shmid = p->s.shmid; shmoffset = p->s.shmoffset; shmsize = p->s.shmsize; } if (bp + bp->s.size == nextp) {/* join to upper neighbour */ bp->s.size += nextp->s.size; bp->s.ptr = nextp->s.ptr; ctx->nfrags--; /* Lost a fragment */ bp->s.shmid = nextp->s.shmid; bp->s.shmoffset = nextp->s.shmoffset; bp->s.shmsize = nextp->s.shmsize; } else { bp->s.ptr = nextp; bp->s.shmid = p->s.shmid; bp->s.shmoffset = p->s.shmoffset; bp->s.shmsize = p->s.shmsize; } if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ p->s.shmid = bp->s.shmid; p->s.shmoffset = bp->s.shmoffset; p->s.shmsize = bp->s.shmsize; } else { p->s.ptr = bp; armci_get_shmem_info((char*)bp, &p->s.shmid, &p->s.shmoffset, &p->s.shmsize); } ctx->freep = p; ctx->shmid = shmid; ctx->shmoffset = shmoffset; ctx->shmsize = shmsize; } /* end if on ap */ UNLOCKIT(armci_master); } #else /* #ifdef SYSV */ /* What are doing here */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { armci_die("kr_malloc_shmem(): Invalid Function Call", 0L); } static void kr_free_shmem(char *ap, context_t *ctx) { armci_die("kr_free_shmem(): Invalid Function Call", 0L); } #endif /* #ifdef SYSV */ /********************** END: kr_malloc for ctx_shmem *********************/ /** issues: 1. do usage statistics only if debug/DEBUG is enabled */ ga-5-4/armci/src-portals/acc.h0000644000175000017500000005223412662210425014301 0ustar mbamba#ifndef _ACC_H_ #define _ACC_H_ typedef struct { float real; float imag; } complex_t; typedef struct { double real; double imag; } dcomplex_t; void c_d_accumulate_1d_(const double* const restrict alpha, double* const restrict A, const double* const restrict B, const int* const restrict rows); void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows); void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows); void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows); void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows); void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows); void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows); void c_d_accumulate_2d_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void c_d_accumulate_2d_u_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_u_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_u_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_u_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_u_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_u_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_u_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); #if ENABLE_F77 # ifdef WIN32 # define ATR __stdcall # else # define ATR # endif # define i_accumulate_1d_ F77_FUNC_(i_accumulate_1d,I_ACCUMULATE_2D) # define l_accumulate_1d_ c_l_accumulate_1d_ # define ll_accumulate_1d_ c_ll_accumulate_1d_ # define f_accumulate_1d_ F77_FUNC_(f_accumulate_1d,F_ACCUMULATE_2D) # define d_accumulate_1d_ F77_FUNC_(d_accumulate_1d,D_ACCUMULATE_2D) # define c_accumulate_1d_ F77_FUNC_(c_accumulate_1d,C_ACCUMULATE_2D) # define z_accumulate_1d_ F77_FUNC_(z_accumulate_1d,Z_ACCUMULATE_2D) # define i_accumulate_2d_ F77_FUNC_(i_accumulate_2d,I_ACCUMULATE_2D) # define l_accumulate_2d_ c_l_accumulate_2d_ # define ll_accumulate_2d_ c_ll_accumulate_2d_ # define f_accumulate_2d_ F77_FUNC_(f_accumulate_2d,F_ACCUMULATE_2D) # define d_accumulate_2d_ F77_FUNC_(d_accumulate_2d,D_ACCUMULATE_2D) # define c_accumulate_2d_ F77_FUNC_(c_accumulate_2d,C_ACCUMULATE_2D) # define z_accumulate_2d_ F77_FUNC_(z_accumulate_2d,Z_ACCUMULATE_2D) # define i_accumulate_2d_u_ F77_FUNC_(i_accumulate_2d_u,I_ACCUMULATE_2D_U) # define l_accumulate_2d_u_ c_l_accumulate_2d_u_ # define ll_accumulate_2d_u_ c_ll_accumulate_2d_u_ # define f_accumulate_2d_u_ F77_FUNC_(f_accumulate_2d_u,F_ACCUMULATE_2D_U) # define d_accumulate_2d_u_ F77_FUNC_(d_accumulate_2d_u,D_ACCUMULATE_2D_U) # define c_accumulate_2d_u_ F77_FUNC_(c_accumulate_2d_u,C_ACCUMULATE_2D_U) # define z_accumulate_2d_u_ F77_FUNC_(z_accumulate_2d_u,Z_ACCUMULATE_2D_U) # define fort_dadd_ F77_FUNC_(fort_dadd,FORT_DADD) # define fort_dadd2_ F77_FUNC_(fort_dadd2,FORT_DADD2) # define fort_dmult_ F77_FUNC_(fort_dmult,FORT_DMULT) # define fort_dmult2_ F77_FUNC_(fort_dmult2,FORT_DMULT2) void ATR d_accumulate_1d_(const double* const restrict alpha, double* const restrict A, const double* const restrict B, const int* const restrict rows); void ATR f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows); void ATR c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows); void ATR z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows); void ATR i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows); void ATR l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows); void ATR ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows); void ATR d_accumulate_2d_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void ATR f_accumulate_2d_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void ATR c_accumulate_2d_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void ATR z_accumulate_2d_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void ATR i_accumulate_2d_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void ATR l_accumulate_2d_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void ATR ll_accumulate_2d_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void ATR d_accumulate_2d_u_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void ATR f_accumulate_2d_u_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void ATR c_accumulate_2d_u_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void ATR z_accumulate_2d_u_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void ATR i_accumulate_2d_u_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void ATR l_accumulate_2d_u_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void ATR ll_accumulate_2d_u_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void ATR fort_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work); void ATR fort_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); void ATR fort_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work); void ATR fort_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); #endif #if NOFORT # define I_ACCUMULATE_1D c_i_accumulate_1d_ # define L_ACCUMULATE_1D c_l_accumulate_1d_ # define LL_ACCUMULATE_1D c_ll_accumulate_1d_ # define D_ACCUMULATE_1D c_d_accumulate_1d_ # define C_ACCUMULATE_1D c_c_accumulate_1d_ # define Z_ACCUMULATE_1D c_z_accumulate_1d_ # define F_ACCUMULATE_1D c_f_accumulate_1d_ # define I_ACCUMULATE_2D c_i_accumulate_2d_ # define L_ACCUMULATE_2D c_l_accumulate_2d_ # define LL_ACCUMULATE_2D c_ll_accumulate_2d_ # define D_ACCUMULATE_2D c_d_accumulate_2d_ # define C_ACCUMULATE_2D c_c_accumulate_2d_ # define Z_ACCUMULATE_2D c_z_accumulate_2d_ # define F_ACCUMULATE_2D c_f_accumulate_2d_ # define FORT_DADD c_dadd_ # define FORT_DADD2 c_dadd2_ # define FORT_DMULT c_dmult_ # define FORT_DMULT2 c_dmult2_ #else # if defined(AIX) || defined(BGML) || defined(SGI_) # define I_ACCUMULATE_2D i_accumulate_2d_u_ # define L_ACCUMULATE_2D c_l_accumulate_2d_u_ # define LL_ACCUMULATE_2D c_ll_accumulate_2d_u_ # define D_ACCUMULATE_2D d_accumulate_2d_u_ # define C_ACCUMULATE_2D c_accumulate_2d_u_ # define Z_ACCUMULATE_2D z_accumulate_2d_u_ # define F_ACCUMULATE_2D f_accumulate_2d_u_ # else # define I_ACCUMULATE_2D i_accumulate_2d_ # define L_ACCUMULATE_2D c_l_accumulate_2d_ # define LL_ACCUMULATE_2D c_ll_accumulate_2d_ # define D_ACCUMULATE_2D d_accumulate_2d_ # define C_ACCUMULATE_2D c_accumulate_2d_ # define Z_ACCUMULATE_2D z_accumulate_2d_ # define F_ACCUMULATE_2D f_accumulate_2d_ # endif # if defined(CRAY) && !defined(__crayx1) # undef D_ACCUMULATE_2D # define D_ACCUMULATE_2D F77_FUNC_(daxpy_2d,DAXPY_2D) # endif # define I_ACCUMULATE_1D i_accumulate_1d_ # define L_ACCUMULATE_1D c_l_accumulate_1d_ # define LL_ACCUMULATE_1D c_ll_accumulate_1d_ # define D_ACCUMULATE_1D d_accumulate_1d_ # define C_ACCUMULATE_1D c_accumulate_1d_ # define Z_ACCUMULATE_1D z_accumulate_1d_ # define F_ACCUMULATE_1D f_accumulate_1d_ # define FORT_DADD fort_dadd_ # define FORT_DADD2 fort_dadd2_ # define FORT_DMULT fort_dmult_ # define FORT_DMULT2 fort_dmult2_ #endif /* !NOFORT */ // specific to src-gemini #if defined(AIX) || defined(NOUNDERSCORE) # define RA_ACCUMULATE_2D ra_accumulate_2d_u #elif defined(BGML) # define RA_ACCUMULATE_2D ra_accumulate_2d_u__ #elif defined(SGI_) # define RA_ACCUMULATE_2D RA_ACCUMULATE_2D_ #elif !defined(CRAY) && !defined(WIN32) && !defined(HITACHI) ||defined(__crayx1) # define RA_ACCUMULATE_2D RA_ACCUMULATE_2D_ #endif #ifndef CRAY_T3E void ATR RA_ACCUMULATE_2D(long*, int*, int*, long*, int*, long*, int*); #else #define RA_ACCUMULATE_2D RA_ACCUMULATE_2D_ void RA_ACCUMULATE_2D_(long*, int*, int*, long*, int*, long*, int*); #endif #endif /* _ACC_H_ */ ga-5-4/armci/src-portals/memory.c0000644000175000017500000007262212662210425015061 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: memory.c,v 1.56.2.3 2007-04-25 23:49:55 d3p687 Exp $ */ #ifndef NEW_MALLOC #include #include #include "armcip.h" #include "message.h" #include "kr_malloc.h" #define DEBUG_ 0 #define USE_MALLOC #define USE_SHMEM_ #define SHM_UNIT 1024 static context_t ctx_localmem; /* static context_t ctx_mlocalmem; */ #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) #include "armci_shmem.h" #if !defined(USE_SHMEM) && (defined(HITACHI) || defined(MULTI_CTX)) # define USE_SHMEM #endif #if !(defined(LAPI)||defined(QUADRICS)||defined(SERVER_THREAD)) ||\ defined(USE_SHMEM) #define RMA_NEEDS_SHMEM #endif void kr_check_local() { #if 0 kr_malloc_print_stats(&ctx_localmem); #endif kr_malloc_verify(&ctx_localmem); } void armci_print_ptr(void **ptr_arr, int bytes, int size, void* myptr, int off) { int i; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); for(i=0; i< armci_nproc; i++){ int j; if(armci_me ==i){ printf("%d master =%d nproc=%d off=%d\n",armci_me, armci_master,nproc, off); printf("%d:bytes=%d mptr=%p s=%d ",armci_me, bytes, myptr,size); for(j = 0; j< armci_nproc; j++)printf(" %p",ptr_arr[j]); printf("\n"); fflush(stdout); } armci_msg_barrier(); } ARMCI_PR_DBG("exit",0); } /*\ master exports its address of shmem region at the beggining of that region \*/ static void armci_master_exp_attached_ptr(void* ptr) { ARMCI_PR_DBG("enter",0); if(!ptr) armci_die("armci_master_exp_att_ptr: null ptr",0); *(volatile void**)ptr = ptr; ARMCI_PR_DBG("exit",0); } /*\ Collective Memory Allocation on shared memory systems \*/ void armci_shmem_malloc(void *ptr_arr[], armci_size_t bytes) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(armci_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc:calloc failed",armci_nproc); /* allocate arrays for cluster address translations */ ptr_ref_arr = calloc(armci_nclus,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc:calloc 2 failed",armci_nclus); /* combine all memory requests into size_arr */ size_arr[armci_me] = bytes; armci_msg_lgop(size_arr, armci_nproc, "+"); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< nproc; i++) size += size_arr[i+armci_master]; /* master process creates shmem region and then others attach to it */ if(armci_me == armci_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if(nproc == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 )armci_die("armci_malloc: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc addr mptr=%p size=%ld\n",armci_me,myptr,size); fflush(stdout); } } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # if defined(DATA_SERVER) /* get server reference address for every cluster node to perform * remote address translation for global address space */ if(armci_nclus>1){ if(armci_me == armci_master){ # ifdef SERVER_THREAD ptr_ref_arr[armci_clus_me]=myptr; # else { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[armci_clus_me]= myptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[armci_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",armci_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ armci_exchange_address(ptr_ref_arr, armci_nclus); # ifdef ARMCI_REGISTER_SHMEM armci_register_shmem(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me]); # endif }else { ptr_ref_arr[armci_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < armci_nclus; cn++){ int master = armci_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (armci_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< armci_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] = (size_arr[i+master])? ((char*)ptr)+offset : NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< nproc; i++) { ptr_ref_arr[i] = (size_arr[i+armci_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+armci_master]; } /* exchange addreses with all other processes */ ptr_arr[armci_me] = (char*)ptr_ref_arr[armci_me-armci_master]; armci_exchange_address(ptr_arr, armci_nproc); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+armci_master), nproc*sizeof(void*)); /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ # endif armci_msg_barrier(); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } /******************************************************************** * Non-collective Memory Allocation on shared memory systems \*/ void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMIptr used in ARMCI data xfer ops */ long idlist[SHMIDLEN]; /* can malloc if there is no data server process & has 1 process/node*/ #ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else #endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_shmem_memget: create failed", (int)(size>>10)); if(DEBUG_) { printf("%d: armci_shmem_memget: addr=%p size=%ld %ld %ld \n", armci_me, myptr, size, idlist[0], idlist[1]); fflush(stdout); } armci_ptr = myptr; #if defined(DATA_SERVER) /* get server reference address to perform * remote address translation for global address space */ if(armci_nclus>1) { # ifdef SERVER_THREAD /* data server thread runs on master process */ if(armci_me != armci_master) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } # else /* ask dataserver process to attach to region and get ptr*/ { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } } # endif } #endif /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; bcopy(idlist, meminfo->idlist, SHMIDLEN*sizeof(long)); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { void *ptr=NULL; long size = (long) meminfo->size; long *idlist = (long*) meminfo->idlist; if(SAMECLUSNODE(meminfo->cpid)) { /* Attach to the shared memory segment */ ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("ARMCi_Memat: could not attach", (int)(size>>10)); /* CHECK: now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(ptr); } else { ptr = meminfo->armci_addr; /* remote address */ } return ptr; } void armci_shmem_memctl(armci_meminfo_t *meminfo) { /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { void *ptr = meminfo->addr; #ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); #else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); #endif } } /****** End: Non-collective memory allocation on shared memory systems *****/ #ifdef MSG_COMMS_MPI /******************************************************************** * Group Memory Allocation on shared memory systems for ARMCI Groups \*/ void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; /* int nproc = armci_clus_info[armci_clus_me].nslave; ? change ? */ int grp_me, grp_nproc, grp_nclus, grp_master, grp_clus_nproc, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); /* Get the group info: group size & group rank */ ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } grp_nclus = grp_attr->grp_nclus; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; grp_clus_nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(grp_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc_group:calloc failed",grp_nproc); /* allocate arrays for cluster address translations */ # if defined(DATA_SERVER) len = grp_nclus; # else len = grp_clus_nproc; # endif ptr_ref_arr = calloc(len,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc_group:calloc 2 failed",len); /* combine all memory requests into size_arr */ size_arr[grp_me] = bytes; armci_msg_group_gop_scope(SCOPE_ALL, size_arr, grp_nproc, "+", ARMCI_LONG, group); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< grp_clus_nproc; i++) size += size_arr[i+grp_master]; /* master process creates shmem region and then others attach to it */ if(grp_me == grp_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_malloc_group: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc_group addr mptr=%p ref=%p size=%ld %ld %ld \n",armci_me,myptr,*(void**)myptr, size,idlist[0],idlist[1]); fflush(stdout); } } /* broadcast shmem id to other processes (in the same group) on the same cluster node */ armci_grp_clus_brdcst(idlist, SHMIDLEN*sizeof(long), grp_master, grp_clus_nproc, group); if(grp_me != grp_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc_group: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc_group attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # if defined(DATA_SERVER) /* get server reference address for every cluster node in the group * to perform remote address translation for global address space */ if(grp_nclus>1){ if(grp_me == grp_master){ # ifdef SERVER_THREAD /* data server thread runs on master process */ if(ARMCI_Absolute_id(group,grp_master)!=armci_master){ /*printf("\n%d: grp_master=%d %ld %ld \n",armci_me,ARMCI_Absolute_id(group,grp_master),idlist[0],idlist[1]);*/ armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else ptr_ref_arr[grp_clus_me]=myptr; # else /* ask data server process to attach to the region and get ptr */ { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[grp_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",grp_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ { int ratio = sizeof(void*)/sizeof(int); if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); armci_msg_group_gop_scope(SCOPE_ALL, ptr_ref_arr, grp_nclus*ratio, "+", ARMCI_INT, group); # ifdef ARMCI_REGISTER_SHMEM armci_register_shmem_grp(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me],group); # endif } }else { ptr_ref_arr[grp_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < grp_nclus; cn++){ int master = grp_attr->grp_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (grp_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< grp_attr->grp_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] =(size_arr[i+master])? ((char*)ptr)+offset: NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< grp_clus_nproc; i++) { ptr_ref_arr[i] = (size_arr[i+grp_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+grp_master]; } /* exchange addreses with all other processes */ ptr_arr[grp_me] = (char*)ptr_ref_arr[grp_me-grp_master]; armci_exchange_address_grp(ptr_arr, grp_nproc, group); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+grp_master), grp_clus_nproc*sizeof(void*)); # endif /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ armci_msg_group_barrier(group); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } #endif /* ifdef MSG_COMMS_MPI */ #else void armci_shmem_malloc(void* ptr_arr[], int bytes) { armci_die("armci_shmem_malloc should never be called on this system",0); } void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { armci_die("armci_shmem_memget should never be called on this system",0); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memat should never be called on this system",0); } void armci_shmem_memctl(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memctl should never be called on this system",0); } # ifdef MSG_COMMS_MPI void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { armci_die("armci_shmem_malloc_group should never be called on this system",0); } # endif #endif /* public constructor to initialize the kr_malloc context */ void armci_krmalloc_init_localmem() { #if defined(ALLOW_PIN) kr_malloc_init(0, 0, 0, reg_malloc, 0, &ctx_localmem); kr_malloc_init(0, 0, 0, malloc, 0, &ctx_mlocalmem); ctx_mlocalmem.ctx_type = KR_CTX_LOCALMEM; #elif defined(CRAY_SHMEM) && defined(CRAY_XT) # ifdef CATAMOUNT int units_avail = (cnos_shmem_size() - 1024 * 1024) / SHM_UNIT; # else extern size_t get_xt_heapsize(); int units_avail = (get_xt_heapsize() - 1024 * 1024) / SHM_UNIT; # endif if(DEBUG_) { fprintf(stderr,"%d:krmalloc_init_localmem: symheap=%llu,units(%d)=%d\n", armci_me, SHM_UNIT*units_avail, SHM_UNIT, units_avail); } kr_malloc_init(SHM_UNIT, units_avail, units_avail, shmalloc, 0, &ctx_localmem); armci_shmalloc_exchange_offsets(&ctx_localmem); #else kr_malloc_init(0, 0, 0, malloc, 0, &ctx_localmem); #endif ctx_localmem.ctx_type = KR_CTX_LOCALMEM; } /** * Local Memory Allocation and Free */ void *PARMCI_Malloc_local(armci_size_t bytes) { void *rptr; ARMCI_PR_DBG("enter",0); ARMCI_PR_DBG("exit",0); rptr = (void *)kr_malloc((size_t)bytes, &ctx_localmem, 0, NULL, NULL); //printf("\n%d:%s:%d:%p\n",armci_me,FUNCTION_NAME,bytes,rptr); return rptr; } int PARMCI_Free_local(void *ptr) { ARMCI_PR_DBG("enter",0); kr_free((char *)ptr, &ctx_localmem); ARMCI_PR_DBG("exit",0); return 0; } /*\ Collective Memory Allocation * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int PARMCI_Malloc(void *ptr_arr[], armci_size_t bytes) { void *ptr; char *new_base; size_t new_size=0; ARMCI_PR_DBG("enter",0); if(DEBUG_){ fprintf(stderr,"%d bytes in armci_malloc %d\n",armci_me, (int)bytes); fflush(stderr); armci_msg_barrier(); } # ifdef USE_MALLOC if(armci_nproc == 1) { ptr = kr_malloc((size_t) bytes, &ctx_localmem, 0, NULL, NULL); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 1 failed",(int)bytes); ptr_arr[armci_me] = ptr; ARMCI_PR_DBG("exit",0); return (0); } # endif // static int one_time = 0; if( ARMCI_Uses_shm() ) { // if(one_time++ == 0 && armci_me==0) printf("%d: ARMCI_Uses_shm = true\n",armci_me); armci_shmem_malloc(ptr_arr,bytes); } else { /* on distributed-memory systems just malloc & collect all addresses */ ptr = kr_malloc(bytes, &ctx_localmem, 1, &new_base, &new_size); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 2 failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); # ifdef ARMCI_REGISTER_SHMEM if(new_size) armci_register_shmem(new_base,new_size,NULL,0,new_base); else armci_register_shmem(ptr,bytes,NULL,0,ptr); # endif } ARMCI_PR_DBG("exit",0); //printf("\n%d:%s:%d:%p\n",armci_me,FUNCTION_NAME,bytes,ptr_arr[armci_me]); return(0); } /*\ shared memory is released to kr_malloc only on process 0 * with data server malloc cannot be used \*/ int PARMCI_Free(void *ptr) { ARMCI_PR_DBG("enter",0); if(!ptr)return 1; # if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(NO_SHM) # ifdef USE_MALLOC if(armci_nproc > 1) # endif if(ARMCI_Uses_shm()){ if(armci_me==armci_master){ # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); # endif } ptr = NULL; return 0; } # endif kr_free(ptr, &ctx_localmem); //armci_unregister_shmem(ptr,0); ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } int ARMCI_Uses_shm() { int uses=0; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(armci_nproc >1) uses= 1; /* always unless serial mode */ # else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d:uses shmem %d\n",armci_me, uses); return uses; } #ifdef MSG_COMMS_MPI int ARMCI_Uses_shm_grp(ARMCI_Group *group) { int uses=0, grp_me, grp_nproc, grp_nclus; ARMCI_PR_DBG("enter",0); armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); grp_nclus = grp_attr->grp_nclus; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(grp_nproc >1) uses= 1; /* always unless serial mode */ # else if(grp_nproc != grp_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d (grp_id=%d):uses shmem %d\n",armci_me, grp_me, uses); ARMCI_PR_DBG("exit",0); return uses; } /*\ ************** Begin Group Collective Memory Allocation ****************** * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *ptr; int grp_me, grp_nproc; ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(DEBUG_)fprintf(stderr,"%d (grp_id=%d) bytes in armci_malloc_group %d\n", armci_me, grp_me, (int)bytes); #ifdef USE_MALLOC if(grp_nproc == 1) { ptr = kr_malloc((size_t) bytes, &ctx_localmem, 0, NULL, NULL); if(bytes) if(!ptr) armci_die("armci_malloc_group:malloc 1 failed",(int)bytes); ptr_arr[grp_me] = ptr; ARMCI_PR_DBG("exit",0); return (0); } #endif if( ARMCI_Uses_shm_grp(group) ) { # ifdef SGIALTIX armci_altix_shm_malloc_group(ptr_arr,bytes,group); # else armci_shmem_malloc_group(ptr_arr,bytes,group); # endif } else { void *new_base=NULL; size_t new_size=NULL; ptr = kr_malloc(bytes, &ctx_localmem, 1, &new_base, &new_size); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 2 failed",bytes); bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); ptr_arr[grp_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address_grp(ptr_arr, grp_nproc, group); } ARMCI_PR_DBG("exit",0); return(0); } /*\ shared memory is released to kr_malloc only on process 0 * with data server malloc cannot be used \*/ int ARMCI_Free_group(void *ptr, ARMCI_Group *group) { int grp_me, grp_nproc, grp_master, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } /* get the group cluster info */ grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; # if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(NO_SHM) # ifdef USE_MALLOC if(grp_nproc > 1) # endif if(ARMCI_Uses_shm_grp(group)){ if(grp_me == grp_master) { # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); # endif } ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } # endif kr_free(ptr, &ctx_localmem); ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } /* ***************** End Group Collective Memory Allocation ******************/ /* ************** Begin Non-Collective Memory Allocation ****************** * Prototype similar to SysV shared memory. */ /** * CHECK: On Altix we are forced to use SysV as shmalloc is collective. We * may use a preallocated shmalloc memory, however, it may NOT still solve * our problem... * NOTE: "int memflg" option for future optimiztions. */ void PARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMI ptr used in ARMCI data xfer ops*/ size_t size = bytes; if(size<=0) armci_die("ARMCI_Memget: size must be > 0", (int)size); if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("ARMCI_Memget: Invalid memflg", memflg); if( !ARMCI_Uses_shm() ) { armci_ptr = myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); if(size) if(!myptr) armci_die("ARMCI_Memget failed", (int)size); /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; /* meminfo->attr = NULL; */ } else { armci_shmem_memget(meminfo, size); } if(DEBUG_){ printf("%d: ARMCI_Memget: addresses server=%p myptr=%p bytes=%ld\n", armci_me, meminfo->armci_addr, meminfo->addr, bytes); fflush(stdout); } } void* PARMCI_Memat(armci_meminfo_t *meminfo, long offset) { void *ptr=NULL; if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(offset!=0) armci_die("ARMCI_Memget: Invalid offset", offset); if(meminfo->cpid==armci_me) { ptr = meminfo->addr; return ptr; } if( !ARMCI_Uses_shm()) { ptr = meminfo->addr; } else { ptr = armci_shmem_memat(meminfo); } if(DEBUG_) { printf("%d:ARMCI_Memat: attached addr mptr=%p size=%ld\n", armci_me, ptr, meminfo->size); fflush(stdout); } return ptr; } void ARMCI_Memdt(armci_meminfo_t *meminfo, long offset) { /** * Do nothing. May be we need to have reference counting in future. This * is to avoid the case of dangling pointers when the creator of shm * segment calls Memctl and other processes are still attached to this * segment */ } void ARMCI_Memctl(armci_meminfo_t *meminfo) { if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { if( !ARMCI_Uses_shm() ) { void *ptr = meminfo->addr; kr_free(ptr, &ctx_localmem); } else { armci_shmem_memctl(meminfo); } } meminfo->addr = NULL; meminfo->armci_addr = NULL; /* if(meminfo->attr!=NULL) free(meminfo->attr); */ } /* ***************** End Non-Collective Memory Allocation ******************/ #endif #endif ga-5-4/armci/src-portals/new_memory.c0000644000175000017500000002555312662210425015733 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include "armcip.h" #include "message.h" #define DEBUG_ 0 #define USE_SHMEM_ #define SHM_UNIT 1024 void armci_print_ptr(void **ptr_arr, int bytes, int size, void* myptr, int off) { int i; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); for(i=0; i< armci_nproc; i++){ int j; if(armci_me ==i){ printf("%d master =%d nproc=%d off=%d\n",armci_me, armci_master,nproc, off); printf("%d:bytes=%d mptr=%p s=%d ",armci_me, bytes, myptr,size); for(j = 0; j< armci_nproc; j++)printf(" %p",ptr_arr[j]); printf("\n"); fflush(stdout); } armci_msg_barrier(); } ARMCI_PR_DBG("exit",0); } /******************************************************************** * Non-collective Memory Allocation on shared memory systems \*/ void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMIptr used in ARMCI data xfer ops */ /* can malloc if there is no data server process & has 1 process/node*/ } void* armci_shmem_memat(armci_meminfo_t *meminfo) { return NULL; } void armci_shmem_memctl(armci_meminfo_t *meminfo) { } /****** End: Non-collective memory allocation on shared memory systems *****/ /** * Local Memory Allocation and Free */ void *ARMCI_Malloc_local(armci_size_t bytes) { void *rptr; ARMCI_PR_DBG("enter",0); ARMCI_PR_DBG("exit",0); return malloc(bytes); } int ARMCI_Free_local(void *ptr) { ARMCI_PR_DBG("enter",0); free(ptr); ARMCI_PR_DBG("exit",0); return 0; } /*\ A wrapper to shmget. Just to be sure that ID is not 0. \*/ static int armci_shmget(size_t size,char *from) { int id; id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); /*attaching with id 0 somehow fails (Seen on pentium4+linux24+gm163) *so if id=0, shmget again. */ while(id==0){ /* free id=0 and get a new one */ if(shmctl((int)id,IPC_RMID,(struct shmid_ds *)NULL)) { fprintf(stderr,"id=%d \n",id); armci_die("allocate: failed to _delete_ shared region ",id); } id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); } if(DEBUG_){ printf("\n%d:armci_shmget sz=%ld caller=%s id=%d\n",armci_me,(long)size, from,id); fflush(stdout); } return(id); } /*\ Collective Memory Allocation * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm shm %d",id); int ARMCI_Malloc(void *ptr_arr[], armci_size_t bytes) { int mynslave = armci_clus_info[armci_clus_me].nslave; void *servptr,*mynodeptrs[mynslave]; int id,nodeids[mynslave],mynodeid=armci_me-armci_master; ARMCI_PR_DBG("enter",0); #ifdef DEBUG_MEM fprintf(stderr,"%d bytes in armci_malloc %d\n",armci_me, (int)bytes); fflush(stderr); armci_msg_barrier(); #endif if(bytes>0){ if(mynslave>1){ #ifdef DEBUG_MEM printf("\n%d:%s:mynslave is %d",armci_me,FUNCTION_NAME,mynslave);fflush(stdout); #endif bzero((void *)nodeids,sizeof(int)*mynslave); id =nodeids[mynodeid]= armci_shmget(bytes,"ARMCI_Malloc"); armci_msg_gop_scope(SCOPE_NODE,nodeids,mynslave,"+",ARMCI_INT); for(int i=0;i1){ servptr = armci_server_ptr(id); } else servptr = mynodeptrs[mynodeid]; } else{ #ifdef DEBUG_MEM printf("\n%d:%s:mynslave is %d, doing malloc",armci_me,FUNCTION_NAME,mynslave);fflush(stdout); #endif mynodeptrs[mynodeid] = servptr = malloc(bytes); } } else{ mynodeptrs[mynodeid] = servptr = NULL; } bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); /*ptr_arr[armci_me] = servptr;*/ ptr_arr[armci_me] = mynodeptrs[mynodeid]; armci_exchange_address(ptr_arr,armci_nproc); if(mynslave>1)for(int i=0;i1){ armci_portals_memsetup((long)servptr-(long)ptr_arr[armci_me]); } ARMCI_PR_DBG("exit",0); return(0); } int ARMCI_Free(void *ptr) { ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_PR_DBG("exit",0); return 0; } int ARMCI_Uses_shm() { int uses=0; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(armci_nproc >1) uses= 1; /* always unless serial mode */ # else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d:uses shmem %d\n",armci_me, uses); return uses; } #ifdef MSG_COMMS_MPI int ARMCI_Uses_shm_grp(ARMCI_Group *group) { int uses=0, grp_me, grp_nproc, grp_nclus; ARMCI_PR_DBG("enter",0); armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); grp_nclus = grp_attr->grp_nclus; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(grp_nproc >1) uses= 1; /* always unless serial mode */ # else if(grp_nproc != grp_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d (grp_id=%d):uses shmem %d\n",armci_me, grp_me, uses); ARMCI_PR_DBG("exit",0); return uses; } /*\ ************** Begin Group Collective Memory Allocation ****************** * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *ptr; int grp_me, grp_nproc; ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(DEBUG_)fprintf(stderr,"%d (grp_id=%d) bytes in armci_malloc_group %d\n", armci_me, grp_me, (int)bytes); ARMCI_PR_DBG("exit",0); return(0); } int ARMCI_Free_group(void *ptr, ARMCI_Group *group) { int grp_me, grp_nproc, grp_master, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } /* get the group cluster info */ grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; ARMCI_PR_DBG("exit",0); return 0; } /* ***************** End Group Collective Memory Allocation ******************/ /* ************** Begin Non-Collective Memory Allocation ****************** * Prototype similar to SysV shared memory. */ /** * CHECK: On Altix we are forced to use SysV as shmalloc is collective. We * may use a preallocated shmalloc memory, however, it may NOT still solve * our problem... * NOTE: "int memflg" option for future optimiztions. */ void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMI ptr used in ARMCI data xfer ops*/ size_t size = bytes; if(size<=0) armci_die("ARMCI_Memget: size must be > 0", (int)size); if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("ARMCI_Memget: Invalid memflg", memflg); if( !ARMCI_Uses_shm() ) { /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; /* meminfo->attr = NULL; */ } else { armci_shmem_memget(meminfo, size); } if(DEBUG_){ printf("%d: ARMCI_Memget: addresses server=%p myptr=%p bytes=%ld\n", armci_me, meminfo->armci_addr, meminfo->addr, bytes); fflush(stdout); } } void* ARMCI_Memat(armci_meminfo_t *meminfo, int memflg) { void *ptr=NULL; if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("ARMCI_Memget: Invalid memflg", memflg); if(meminfo->cpid==armci_me) { ptr = meminfo->addr; return ptr; } if( !ARMCI_Uses_shm()) { ptr = meminfo->addr; } else { ptr = armci_shmem_memat(meminfo); } if(DEBUG_) { printf("%d:ARMCI_Memat: attached addr mptr=%p size=%ld\n", armci_me, ptr, meminfo->size); fflush(stdout); } return ptr; } void ARMCI_Memdt(armci_meminfo_t *meminfo, int memflg) { /** * Do nothing. May be we need to have reference counting in future. This * is to avoid the case of dangling pointers when the creator of shm * segment calls Memctl and other processes are still attached to this * segment */ } void ARMCI_Memctl(armci_meminfo_t *meminfo) { if(meminfo==NULL) armci_die("ARMCI_Memget: Invalid arg #2 (NULL ptr)",0); /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { if( !ARMCI_Uses_shm() ) { void *ptr = meminfo->addr; } else { armci_shmem_memctl(meminfo); } } meminfo->addr = NULL; meminfo->armci_addr = NULL; /* if(meminfo->attr!=NULL) free(meminfo->attr); */ } /* ***************** End Non-Collective Memory Allocation ******************/ #endif ga-5-4/armci/src-portals/code_options.h0000644000175000017500000001234112662210425016233 0ustar mbamba/* Questions: ORNL - tipparajuv@ornl.gov CRAY - ryan@cray.com */ /* --------------------------------------------------------------------------- *\ PORTALS_USE_RENDEZ_VOUS ======================= When the number of PEs gets very large, the data server is required to have buffer space available for all possible incoming messages which is defined by PORTALS_MAX_DESCRIPTORS = (MAX_BUFS+MAX_SMALL_BUFS). For each PE, the DS must have at least: min_memory_per_pe = PORTALS_MAX_BUFS*PORTALS_BUF_SIZE + PORTALS_MAX_SMALL_BUFS*PORTALS_SMALL_BUF_SIZE This becomes a memory constraint at large core count. Rendez-vous message is one mechanism to get around requiring the DS to have buffer space for all messages. When rendez-vous (RZV) messaging is enabled, the messages what use the large buffers no longer send the entire buffer "eagerly". Instead, only the data request (request_header_t) gets sent to the data server. When the data server is ready to handle the request, it "pulls" the entire buffer over via a portals_get operation. One can immediately see that this can lead to a slow down in performance, since the data server is idle when it has to pull the data over. This is the price paid when you remove the bufferign for those messsages. Ideally, when the DS is pulling the message, it could be processing another request. This double buffering technique needs to be programmed in. Care must be taken to ensure proper ARMCI behavior. The next request handled can not be from the same PE, nor can it be a FENCE operation ... all other (?) requests/operations can be double buffered. \* --------------------------------------------------------------------------- */ # define PORTALS_USE_RENDEZ_VOUS /* --------------------------------------------------------------------------- *\ PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE ===================================== Another means to reduce the required buffer needed by the data server is to limit the number of cores that can talk to the data server at any given moment. When this options is turned on, only 1 request per node is allowed to be in the buffer of any given data server. On a 10 core node, the size of the buffer required by the data server is reduced by more than an order of magnitude. You get more than an order of magnitude, because you don't need to reserve space for any of the small buffers, since you can only have one small or one large from any given node in the ds buffer at any one time. Another major benefit is you can increase MAX_BUFS and MAX_SMALL_BUFS to increase concurrency without affecting the DS's buffer size. Can be used with PORTALS_USE_RENDEZ_VOUS. notes: every request needs to respond with an ack, even gets. acks actually send data when we limit remote request ... the ack response is needed to trigger that the outstanding request has been finished by the data server ... the ack zeros out the index in the active_requests_by_node array. \* --------------------------------------------------------------------------- */ # define PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE_TURNED_OFF /* --------------------------------------------------------------------------- *\ PORTALS_AFFINITY ================ When initializing compute processes and data servers, the affinity passed in by aprun/alps is ignored. Compute processes are bound strictly to a particular core. Cores are evenly divided between sockets keeping the last core (mask = 1 << (ncpus-1)) free for the data server. If the node is not fully subscribed, then the data server is bound to the last core on the node (mask = 1 << (ncpus-1)); otherwise, the data server is "free floating" (mask = (1 << ncpus)-1) on a fully subscribed node. \* --------------------------------------------------------------------------- */ # define PORTALS_AFFINITY # define PORTALS_AFFINITY_NSOCKETS 2 /* --------------------------------------------------------------------------- *\ CRAY_USE_MDMD_COPY ================== Used MDMD copy instead of PtlGetRegion for on-node "local" transfers \* --------------------------------------------------------------------------- */ # define CRAY_USE_MDMD_COPY /* --------------------------------------------------------------------------- *\ ORNL_USE_DS_FOR_REMOTE_GETS =========================== Vinod informed us of a modification that can be made to enable the use of the data server for remote gets. Without this option, direct gets are used. This can cause severe network congestion, because many armci_gets are not stride 1. The data server packs those gets into contiguous blocks and sends them back as a single put. However, the direct gets, require many small messages. Unfortunately, there is a small bug in the DS for remote gets. This bug may cause the program to abort or print out the following message: %d: server wrote data at unexpected offset %d This is a bug actively being worked on @ CRAY and ORNL. \* --------------------------------------------------------------------------- */ # define ORNL_USE_DS_FOR_REMOTE_GETS # define CRAY_USE_ARMCI_CLIENT_BUFFERS ga-5-4/armci/src-portals/caccumulate.c0000644000175000017500000006037012662210425016034 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ /*********************************************************************** * accumulate operation for the following datatypes: * real, double precision, complex, double complex, integer * * WARNING: This file must be compiled WITH optimization under AIX. * IBM fortran compilers generate bad code with -g option. * * Two versions of each routine are provided: * original and unrolled loops. * ***********************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "acc.h" #if 0 subroutine d_accumulate_1d(alpha, A, B, rows) integer rows, r double precision A(*), B(*), alpha ccdir$ no_cache_alloc a,b do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_d_accumulate_1d_(const double* const restrict alpha, double* restrict A, const double* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine d_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha ccdir$ no_cache_alloc a,b do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_d_accumulate_2d_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_1d(alpha, A, B, rows) integer rows, r real A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine f_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_f_accumulate_2d_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_1d(alpha, A, B, rows) integer rows, r double complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine z_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_c_accumulate_2d_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_1d(alpha, A, B, rows) integer rows, r complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine c_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_z_accumulate_2d_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine i_accumulate_1d(alpha, A, B, rows) integer rows, r integer A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_i_accumulate_2d_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine d_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha integer r1 doubleprecision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_d_accumulate_2d_u_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha integer r1 real d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_f_accumulate_2d_u_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha integer r1 double complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_c_accumulate_2d_u_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha integer r1 complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_z_accumulate_2d_u_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha integer r1, j2, j3, j4, j5 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 j2 = a(r,c) + alpha*b(r,c) j3 = a(r+1,c) + alpha*b(r+1,c) j4 = a(r+2,c) + alpha*b(r+2,c) j5 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = j2 a(r+1,c) = j3 a(r+2,c) = j4 a(r+3,c) = j5 enddo enddo end #endif void c_i_accumulate_2d_u_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_u_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_u_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 c---------- operations used in armci gops -------------- c subroutine fort_dadd(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) + work(i) enddo end #endif void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] += work[i]; } return; } #if 0 subroutine fort_dadd2(n, x, work, work2) integer n,i double precision x(n), work(n), work2(n) do i= 1,n x(i) = work(i) + work2(i) enddo end #endif void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] + work2[i]; } return; } #if 0 subroutine fort_dmult(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) * work(i) enddo end #endif void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] *= work[i]; } return; } #if 0 subroutine fort_dmult2(n, x, work,work2) integer n,i double precision x(n), work(n) do i= 1,n x(i) = work(i)*work2(i) enddo end #endif void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] * work2[i]; } return; } // specific to src-portals && to src-gemini void RA_ACCUMULATE_2D_(long* alpha, int* rows, int* cols, long* a, int* lda, long* b, int* ldb) { int i,j; for(j=0;j< *cols; j++){ long *aa = a + j* *lda; long *bb = b + j* *ldb; for(i=0;i< *rows; i++) aa[i] ^= bb[i]; } } ga-5-4/armci/src-portals/gpc.c0000644000175000017500000002610112662210425014311 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: gpc.c,v 1.7.4.4 2007-06-13 00:44:01 vinod Exp $ ***************************************************** Prototype of Global Procedure Calls. July/03 JN - shared memory version *************************************************************/ #include #include "armcip.h" #include "locks.h" #include "gpc.h" #define GPC_SLOTS 32 #define GPC_OFFSET -100 static void *_table[GPC_SLOTS]={ (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0}; #if (defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS)) && ARMCI_ENABLE_GPC_CALLS /*\ callback functions must be registered -- user gets int handle back \*/ int ARMCI_Gpc_register( int (*func) ()) { int handle =-1, candidate = 0; PARMCI_Barrier(); do{ if(!_table[candidate]){ handle = candidate; _table[candidate]=func; } candidate++; }while(candidate < GPC_SLOTS && handle == -1); return(GPC_OFFSET-handle); } /*\ release/deassociate handle with previously registered callback function \*/ void ARMCI_Gpc_release(int handle) { int h = -handle + GPC_OFFSET; PARMCI_Barrier(); if(h<0 || h >= GPC_SLOTS) armci_die("ARMCI_Gpc_release: bad handle",h); _table[h] = (void*)0; } /*\ Send Request to Execute callback function in a global address space * Arguments: * f - handle to the callback function * p - remote processor * hdr - header data - used to pack extra args for callback (local buffer) * hlen - size of header data < ARMCI_GPC_HLEN * data - bulk data passed to callback (local buffer) * dlen - length of bulk data * rhdr - ptr to reply header (return args from callback) * rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN * rdata - ptr to where reply data from callback should be stored (local buf) * rdlen - size of the buffer to store reply data * nbh - nonblocking handle * \*/ int ARMCI_Gpc_exec(int h, int p, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh) { int hnd = -h + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); } /* func - handle to the function executed at each process in the chain callba- handle to the callback to be executed when hdr - header data used to pack extra args for callback (local buffer) hlen - size of header data < ARMCI_GPC_HLEN data - bulk data passed to callback (local buffer) dlen - length of bulk data rhdr - ptr to reply header (return args from callback) rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN rdata - ptr to where reply data from callback should be stored (local buf) rdlen - size of the buffer to store reply data idlen - number of ID's idslst- list of id's in the chained GPC nbh - nonblocking handle which also acts as a context for each individual GPC Tree - the id of tree function used (default is 0=>binary, 1=>binomial, n=> user defined) */ int ARMCI_Gpc_chained_exec(int func, int callback, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int idlen, int *idlst, gpc_hdl_t* nbh, int TREE) { #if 0 int hnd = -func + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); tree_id = armci_msg_generate_tree(idlst,idlen,id_tree,TREE); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); #endif } int armci_gpc_local_exec(int h, int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int rtype) { int rhsize, rdsize; int (*func)(); int hnd = -h + GPC_OFFSET; if(hnd <0 || hnd>= GPC_SLOTS) armci_die2("armci_gpc_local_exec: bad callback handle",hnd,GPC_SLOTS); if(!_table[hnd]) armci_die("armci_gpc_local_exec: NULL function",hnd); func = _table[hnd]; if(!SAMECLUSNODE(to)) armci_die("armci_gpc_local_exec: GPC call to a different node received!", armci_me); /* func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, */ /* rdata, rdlen, &rdsize); */ /* return 0; */ return func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, rtype); } /*\ * This is a template for the callback function * The arguments are passed as specified in ARMCI_Gpc_exec * In addition, * rhsize specifies the actual size of reply header data returned * rdsize specifies the actual size of reply data returned \*/ int example_func(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); #ifdef LAPI void armci_gpc_set_serverpid(){ } #endif /*\ * Translate pointer to memory on processor "proc" * to be used in a callback function send by processor "from" \*/ void * ARMCI_Gpc_translate(void *ptr, int proc, int from) { return ptr; } /*\ acquire lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_lock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_LOCK(lock,proc); } /*\ try acquire lock in a callback function to be executed in context of * processor "proc" * return value: 1 - success * 0 - failure (already locked by another thread) \*/ int ARMCI_Gpc_trylock(int proc) { armci_die("ARMCI_Gpc_trylock: not yet implemented",0); return 0; } /*\ release lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_unlock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_UNLOCK(lock,proc); } void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh) { nbh->proc = armci_me; ARMCI_INIT_HANDLE(&nbh->ahdl); } void ARMCI_Gpc_wait(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Wait(&nbh->ahdl); } void ARMCI_Gpc_test(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Test(&nbh->ahdl); } #define ARMCI_GPC_HLEN 65536 #define ARMCI_GPC_DLEN 65536 int ARMCI_Gpc_get_hlen() { return ARMCI_GPC_HLEN; } int ARMCI_Gpc_get_dlen() { return ARMCI_GPC_DLEN; } #endif ga-5-4/armci/src-portals/Makefile.inc0000644000175000017500000000516412662210425015612 0ustar mbambalibarmci_la_SOURCES += src-portals/acc.h libarmci_la_SOURCES += src-portals/aggregate.c libarmci_la_SOURCES += src-portals/armci.c libarmci_la_SOURCES += src-portals/armcip.h libarmci_la_SOURCES += src-portals/armci_portals.c libarmci_la_SOURCES += src-portals/armci_portals.h libarmci_la_SOURCES += src-portals/atomics-i386.h libarmci_la_SOURCES += src-portals/buffers.c libarmci_la_SOURCES += src-portals/caccumulate.c libarmci_la_SOURCES += src-portals/ccopy.c libarmci_la_SOURCES += src-portals/clusterinfo.c libarmci_la_SOURCES += src-portals/copy.h libarmci_la_SOURCES += src-portals/ds-shared.c libarmci_la_SOURCES += src-portals/fence.c libarmci_la_SOURCES += src-portals/kr_malloc.c libarmci_la_SOURCES += src-portals/kr_malloc.h libarmci_la_SOURCES += src-portals/locks.c libarmci_la_SOURCES += src-portals/locks.h libarmci_la_SOURCES += src-portals/memlock.c libarmci_la_SOURCES += src-portals/memlock.h libarmci_la_SOURCES += src-portals/memory.c libarmci_la_SOURCES += src-portals/message.c libarmci_la_SOURCES += src-portals/mutex.c libarmci_la_SOURCES += src-portals/pack.c libarmci_la_SOURCES += src-portals/pendbufs.h libarmci_la_SOURCES += src-portals/portals_cp.c libarmci_la_SOURCES += src-portals/portals_ds.c libarmci_la_SOURCES += src-portals/portals.c libarmci_la_SOURCES += src-portals/request.c libarmci_la_SOURCES += src-portals/request.h libarmci_la_SOURCES += src-portals/rmw.c libarmci_la_SOURCES += src-portals/rtinfo.c libarmci_la_SOURCES += src-portals/semaphores.c libarmci_la_SOURCES += src-portals/semaphores.h libarmci_la_SOURCES += src-portals/shmalloc.h libarmci_la_SOURCES += src-portals/shmem.c libarmci_la_SOURCES += src-portals/armci_shmem.h libarmci_la_SOURCES += src-portals/shmlimit.c libarmci_la_SOURCES += src-portals/shmlimit.h libarmci_la_SOURCES += src-portals/signaltrap.c libarmci_la_SOURCES += src-portals/signaltrap.h libarmci_la_SOURCES += src-portals/sockets.h libarmci_la_SOURCES += src-portals/spawn.c libarmci_la_SOURCES += src-portals/spinlock.h libarmci_la_SOURCES += src-portals/strided.c libarmci_la_SOURCES += src-portals/utils.h libarmci_la_SOURCES += src-portals/vector.c if PORTALS_ENABLE_NEW_MALLOC libarmci_la_SOURCES += src-portals/new_memory.c endif if MSG_COMMS_MPI libarmci_la_SOURCES += src-portals/groups.c endif if ARMCI_ENABLE_GPC_CALLS libarmci_la_SOURCES += src-portals/gpc.c endif if THREAD_SAFE libarmci_la_SOURCES += src-portals/threads.c libarmci_la_SOURCES += src-portals/utils.c endif include_HEADERS += src-portals/armci.h include_HEADERS += src-portals/gpc.h include_HEADERS += src-portals/message.h AM_CPPFLAGS += -I$(top_srcdir)/src-portals AM_CPPFLAGS += -I$(top_srcdir)/src/include ga-5-4/armci/testing/0000755000175000017500000000000012662210426012601 5ustar mbambaga-5-4/armci/testing/perf.c0000644000175000017500000004151512662210426013707 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * Author: Jialin Ju, PNNL */ /* $Id: perf.c,v 1.21 2006-09-12 23:21:21 andriy Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #if HAVE_MATH_H # include #endif #include "armci.h" #include "message.h" #ifndef ARMCI_MAX_STRIDE_LEVEL #define ARMCI_MAX_STRIDE_LEVEL 7 #endif #define SIZE 550 #define MAXPROC 8 #define CHUNK_NUM 28 #define FORCE_1D_ #ifndef ABS #define ARMCI_ABS(a) ((a)>0? (a): -(a)) #endif /* tells to use ARMCI_Malloc_local instead of plain malloc */ #define MALLOC_LOC int CHECK_RESULT = 0; int chunk[CHUNK_NUM] = {1, 3, 4, 6, 9, 12, 16, 20, 24, 30, 40, 48, 52, 64, 78, 91, 104, 128, 142, 171, 210, 256, 300, 353, 400, 440, 476, 512 }; char check_type[15]; int nproc, me; int warn_accuracy = 0; void fill_array(double *arr, int count, int which); void check_result(double *src_buf, double *dst_buf, int *stride, int *count, int stride_levels); void acc_array(double scale, double *array1, double *array2, int *stride, int *count, int stride_levels); static double _tt0 = 0.0; /*\ quick fix for inacurate timer \*/ double Timer() { #define DELTA 0.000001 double t = armci_timer(); if (t <= _tt0 + DELTA) { _tt0 += DELTA; } else { _tt0 = t; } return _tt0; } #define TIMER armci_timer double time_get(double *src_buf, double *dst_buf, int chunk, int loop, int proc, int levels) { int i, bal = 0; int stride[2]; int count[2]; int stride_levels = levels; double *tmp_buf = NULL, *tmp_buf_ptr = NULL; double start_time, stop_time, total_time = 0; stride[0] = SIZE * sizeof(double); count[0] = chunk * sizeof(double); count[1] = chunk; if (CHECK_RESULT) { tmp_buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(tmp_buf != NULL); fill_array(tmp_buf, SIZE * SIZE, proc); tmp_buf_ptr = tmp_buf; } start_time = TIMER(); for (i = 0; i < loop; i++) { #ifdef FORCE_1D int j; if (levels > 0) { for (j = 0; j < count[1]; j++) { char *s = (char *) src_buf, *d = (char *)dst_buf; s += j * stride[0]; d += j * stride[0]; ARMCI_Get(src_buf, dst_buf, count[0], proc); } } else #endif if (levels) { ARMCI_GetS(src_buf, stride, dst_buf, stride, count, stride_levels, proc); } else { ARMCI_Get(src_buf, dst_buf, count[0], proc); } if (CHECK_RESULT) { sprintf(check_type, "ARMCI_GetS:"); check_result(tmp_buf_ptr, dst_buf, stride, count, stride_levels); } /* prepare next src and dst ptrs: avoid cache locality */ if (bal == 0) { src_buf += 128; dst_buf += 128; if (CHECK_RESULT) { tmp_buf_ptr += 128; } bal = 1; } else { src_buf -= 128; dst_buf -= 128; if (CHECK_RESULT) { tmp_buf_ptr -= 128; } bal = 0; } } stop_time = TIMER(); total_time = (stop_time - start_time); if (CHECK_RESULT) { free(tmp_buf); } if (total_time == 0.0) { total_time = 0.000001; /* workaround for inaccurate timers */ warn_accuracy++; } return(total_time / loop); } double time_put(double *src_buf, double *dst_buf, int chunk, int loop, int proc, int levels) { int i, bal = 0; int stride[2]; int count[2]; int stride_levels = levels; double *tmp_buf = NULL; double start_time, stop_time, total_time = 0; stride[0] = SIZE * sizeof(double); count[0] = chunk * sizeof(double); count[1] = chunk; if (CHECK_RESULT) { tmp_buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(tmp_buf != NULL); } start_time = TIMER(); for (i = 0; i < loop; i++) { #ifdef FORCE_1D int j; if (levels > 0) { for (j = 0; j < count[1]; j++) { char *s = (char *) src_buf, *d = (char *)dst_buf; s += j * stride[0]; d += j * stride[0]; ARMCI_Put(src_buf, dst_buf, count[0], proc); } } else #endif if (levels) { ARMCI_PutS(src_buf, stride, dst_buf, stride, count, stride_levels, proc); } else { ARMCI_Put(src_buf, dst_buf, count[0], proc); } if (CHECK_RESULT) { ARMCI_GetS(dst_buf, stride, tmp_buf, stride, count, stride_levels, proc); sprintf(check_type, "ARMCI_PutS:"); check_result(tmp_buf, src_buf, stride, count, stride_levels); } /* prepare next src and dst ptrs: avoid cache locality */ if (bal == 0) { src_buf += 128; dst_buf += 128; bal = 1; } else { src_buf -= 128; dst_buf -= 128; bal = 0; } } stop_time = TIMER(); total_time = (stop_time - start_time); if (CHECK_RESULT) { free(tmp_buf); } if (total_time == 0.0) { total_time = 0.000001; /* workaround for inaccurate timers */ warn_accuracy++; } return(total_time / loop); } double time_acc(double *src_buf, double *dst_buf, int chunk, int loop, int proc, int levels) { int i, bal = 0; int stride[2]; int count[2]; int stride_levels = levels; double *before_buf = NULL, *after_buf = NULL; double start_time, stop_time, total_time = 0; stride[0] = SIZE * sizeof(double); count[0] = chunk * sizeof(double); count[1] = chunk; if (CHECK_RESULT) { before_buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(before_buf != NULL); after_buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(after_buf != NULL); } start_time = TIMER(); for (i = 0; i < loop; i++) { double scale = (double)i; if (CHECK_RESULT) { ARMCI_GetS(dst_buf, stride, before_buf, stride, count, stride_levels, proc); acc_array(scale, before_buf, src_buf, stride, count, stride_levels); } ARMCI_AccS(ARMCI_ACC_DBL, &scale, src_buf, stride, dst_buf, stride, count, stride_levels, proc); if (CHECK_RESULT) { ARMCI_GetS(dst_buf, stride, after_buf, stride, count, stride_levels, proc); sprintf(check_type, "ARMCI_AccS:"); check_result(after_buf, before_buf, stride, count, stride_levels); } /* prepare next src and dst ptrs: avoid cache locality */ if (bal == 0) { src_buf += 128; dst_buf += 128; bal = 1; } else { src_buf -= 128; dst_buf -= 128; bal = 0; } } stop_time = TIMER(); total_time = (stop_time - start_time); if (CHECK_RESULT) { free(before_buf); free(after_buf); } if (total_time == 0.0) { total_time = 0.000001; /* workaround for inaccurate timers */ warn_accuracy++; } return(total_time / loop); } void test_1D() { int i; int dst; int ierr; double *buf = NULL; void *ptr[MAXPROC], *get_ptr[MAXPROC]; /* memory allocation */ #ifdef MALLOC_LOC if (me == 0) { buf = (double *)ARMCI_Malloc_local(SIZE * SIZE * sizeof(double)); assert(buf != NULL); } #else if (me == 0) { buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(buf != NULL); } #endif ierr = ARMCI_Malloc(ptr, (SIZE * SIZE * sizeof(double))); assert(ierr == 0); assert(ptr[me]); ierr = ARMCI_Malloc(get_ptr, (SIZE * SIZE * sizeof(double))); assert(ierr == 0); assert(get_ptr[me]); /* ARMCI - initialize the data window */ fill_array(ptr[me], SIZE * SIZE, me); fill_array(get_ptr[me], SIZE * SIZE, me); ARMCI_Barrier(); /* only the proc 0 does the work */ if (me == 0) { if (!CHECK_RESULT) { printf(" section get put"); printf(" acc\n"); printf("bytes loop usec MB/s usec MB/s"); printf(" usec MB/s\n"); printf("------- ------ -------- -------- -------- --------"); printf(" -------- --------\n"); fflush(stdout); } for (i = 0; i < CHUNK_NUM; i++) { int loop; int bytes = chunk[i] * chunk[i] * sizeof(double); double t_get = 0, t_put = 0, t_acc = 0; double latency_get, latency_put, latency_acc; double bandwidth_get, bandwidth_put, bandwidth_acc; loop = (SIZE * SIZE) / (chunk[i] * chunk[i]); loop = (int)sqrt((double)loop); if (loop < 2) { loop = 2; } for (dst = 1; dst < nproc; dst++) { /* strided get */ fill_array(buf, SIZE * SIZE, me * 10); t_get += time_get((double *)(get_ptr[dst]), (double *)buf, chunk[i] * chunk[i], loop, dst, 0); /* strided put */ fill_array(buf, SIZE * SIZE, me * 10); t_put += time_put((double *)buf, (double *)(ptr[dst]), chunk[i] * chunk[i], loop, dst, 0); /* strided acc */ fill_array(buf, SIZE * SIZE, me * 10); t_acc += time_acc((double *)buf, (double *)(ptr[dst]), chunk[i] * chunk[i], loop, dst, 0); } latency_get = t_get / (nproc - 1); latency_put = t_put / (nproc - 1); latency_acc = t_acc / (nproc - 1); bandwidth_get = (bytes * (nproc - 1) * 1e-6) / t_get; bandwidth_put = (bytes * (nproc - 1) * 1e-6) / t_put; bandwidth_acc = (bytes * (nproc - 1) * 1e-6) / t_acc; /* print */ if (!CHECK_RESULT) { printf("%d\t%d\t%.2e %.2e %.2e %.2e %.2e %.2e\n", bytes, loop, latency_get / 1e-6, bandwidth_get, latency_put / 1e-6, bandwidth_put, latency_acc / 1e-6, bandwidth_acc); } } } else { sleep(3); } ARMCI_AllFence(); ARMCI_Barrier(); /* cleanup */ ARMCI_Free(get_ptr[me]); ARMCI_Free(ptr[me]); #ifdef MALLOC_LOC if (me == 0) { ARMCI_Free_local(buf); } #else if (me == 0) { free(buf); } #endif } void test_2D() { int i; int dst; int ierr; double *buf = NULL; void *ptr[MAXPROC], *get_ptr[MAXPROC]; #ifdef MALLOC_LOC if (me == 0) { buf = (double *)ARMCI_Malloc_local(SIZE * SIZE * sizeof(double)); assert(buf != NULL); } #else if (me == 0) { buf = (double *)malloc(SIZE * SIZE * sizeof(double)); assert(buf != NULL); } #endif ierr = ARMCI_Malloc(ptr, (SIZE * SIZE * sizeof(double))); assert(ierr == 0); assert(ptr[me]); ierr = ARMCI_Malloc(get_ptr, (SIZE * SIZE * sizeof(double))); assert(ierr == 0); assert(get_ptr[me]); /* ARMCI - initialize the data window */ fill_array(ptr[me], SIZE * SIZE, me); fill_array(get_ptr[me], SIZE * SIZE, me); ARMCI_Barrier(); /* only the proc 0 doest the work */ /* print the title */ if (me == 0) { if (!CHECK_RESULT) { printf(" section get put"); printf(" acc\n"); printf("bytes loop usec MB/s usec MB/s"); printf(" usec MB/s\n"); printf("------- ------ -------- -------- -------- --------"); printf(" -------- --------\n"); fflush(stdout); } for (i = 0; i < CHUNK_NUM; i++) { int loop; int bytes = chunk[i] * chunk[i] * sizeof(double); double t_get = 0, t_put = 0, t_acc = 0; double latency_get, latency_put, latency_acc; double bandwidth_get, bandwidth_put, bandwidth_acc; loop = SIZE / chunk[i]; if (loop < 2) { loop = 2; } for (dst = 1; dst < nproc; dst++) { /* strided get */ fill_array(buf, SIZE * SIZE, me * 10); t_get += time_get((double *)(get_ptr[dst]), (double *)buf, chunk[i], loop, dst, 1); /* strided put */ fill_array(buf, SIZE * SIZE, me * 10); t_put += time_put((double *)buf, (double *)(ptr[dst]), chunk[i], loop, dst, 1); /* strided acc */ fill_array(buf, SIZE * SIZE, me * 10); t_acc += time_acc((double *)buf, (double *)(ptr[dst]), chunk[i], loop, dst, 1); } latency_get = t_get / (nproc - 1); latency_put = t_put / (nproc - 1); latency_acc = t_acc / (nproc - 1); bandwidth_get = (bytes * (nproc - 1) * 1e-6) / t_get; bandwidth_put = (bytes * (nproc - 1) * 1e-6) / t_put; bandwidth_acc = (bytes * (nproc - 1) * 1e-6) / t_acc; /* print */ if (!CHECK_RESULT) { printf("%d\t%d\t%.2e %.2e %.2e %.2e %.2e %.2e\n", bytes, loop, latency_get / 1e-6, bandwidth_get, latency_put / 1e-6, bandwidth_put, latency_acc / 1e-6, bandwidth_acc); } } } else { sleep(3); } ARMCI_AllFence(); ARMCI_Barrier(); /* cleanup */ ARMCI_Free(get_ptr[me]); ARMCI_Free(ptr[me]); #ifdef MALLOC_LOC if (me == 0) { ARMCI_Free_local(buf); } #else if (me == 0) { free(buf); } #endif } int main(int argc, char **argv) { armci_msg_init(&argc, &argv); /* initialize ARMCI */ ARMCI_Init_args(&argc, &argv); me = armci_msg_me(); nproc = armci_msg_nproc(); if (nproc < 2 || nproc > MAXPROC) { if (me == 0) fprintf(stderr, "USAGE: 2 <= processes < %d - got %d\n", MAXPROC, nproc); ARMCI_Barrier(); armci_msg_finalize(); //MPI_Finalize(); exit(0); } if (!me) { printf("\n Performance of Basic Blocking Communication Operations\n"); } ARMCI_Barrier(); CHECK_RESULT = 1; test_1D(); CHECK_RESULT = 0; /* warmup run */ /* test 1 dimension array */ if (!me) { printf("\n\t\t\tContiguous Data Transfer\n"); } test_1D(); /* test 2 dimension array */ if (!me) { printf("\n\t\t\tStrided Data Transfer\n"); } test_2D(); ARMCI_Barrier(); if (me == 0) { if (warn_accuracy) { printf("\nWARNING: Your timer does not have sufficient accuracy for this test (%d)\n", warn_accuracy); } printf("\n\n------------ Now we test the same data transfer for correctness ----------\n"); fflush(stdout); } ARMCI_Barrier(); CHECK_RESULT = 1; if (!me) { printf("\n\t\t\tContiguous Data Transfer\n"); } test_1D(); if (me == 0) { printf("OK\n"); } ARMCI_Barrier(); if (!me) { printf("\n\t\t\tStrided Data Transfer\n"); } test_2D(); if (me == 0) { printf("OK\n\n\nTests Completed.\n"); } ARMCI_Barrier(); /* done */ ARMCI_Finalize(); armci_msg_finalize(); //MPI_Finalize(); return(0); } void fill_array(double *arr, int count, int which) { int i; for (i = 0; i < count; i++) { arr[i] = i * 8.23 + which * 2.89; } } void check_result(double *src_buf, double *dst_buf, int *stride, int *count, int stride_levels) { int i, j, size; long idx; int n1dim; /* number of 1 dim block */ int bvalue[ARMCI_MAX_STRIDE_LEVEL], bunit[ARMCI_MAX_STRIDE_LEVEL]; /* number of n-element of the first dimension */ n1dim = 1; for (i = 1; i <= stride_levels; i++) { n1dim *= count[i]; } /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for (i = 2; i <= stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j <= stride_levels; j++) { idx += bvalue[j] * stride[j-1]; if ((i + 1) % bunit[j] == 0) { bvalue[j]++; } if (bvalue[j] > (count[j] - 1)) { bvalue[j] = 0; } } size = count[0] / sizeof(double); for (j = 0; j < size; j++) if (ARMCI_ABS(((double *)((char *)src_buf + idx))[j] - ((double *)((char *)dst_buf + idx))[j]) > 0.000001) { fprintf(stdout, "Error:%s comparison failed: (%d) (%f :%f) %d\n", check_type, j, ((double *)((char *)src_buf + idx))[j], ((double *)((char *)dst_buf + idx))[j], count[0]); ARMCI_Error("failed", 0); } } } /* array1 = array1 + array2 * scale */ void acc_array(double scale, double *array1, double *array2, int *stride, int *count, int stride_levels) { int i, j, size; long idx; int n1dim; /* number of 1 dim block */ int bvalue[ARMCI_MAX_STRIDE_LEVEL], bunit[ARMCI_MAX_STRIDE_LEVEL]; /* number of n-element of the first dimension */ n1dim = 1; for (i = 1; i <= stride_levels; i++) { n1dim *= count[i]; } /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for (i = 2; i <= stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for (i = 0; i < n1dim; i++) { idx = 0; for (j = 1; j <= stride_levels; j++) { idx += bvalue[j] * stride[j-1]; if ((i + 1) % bunit[j] == 0) { bvalue[j]++; } if (bvalue[j] > (count[j] - 1)) { bvalue[j] = 0; } } size = count[0] / sizeof(double); for (j = 0; j < size; j++) ((double *)((char *)array1 + idx))[j] += ((double *)((char *)array2 + idx))[j] * scale; } } ga-5-4/armci/testing/te.c0000644000175000017500000000145712662210426013364 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include #include int variable, fd; int do_something() { variable = 42; close(fd); _exit(0); } int main(int argc, char *argv[]) { void **child_stack; char tempch; variable = 9; fd = open("test.file", O_RDONLY); child_stack = (void **) malloc(16384); printf("The variable was %d\n", variable); clone(do_something, child_stack, CLONE_VM | CLONE_FILES, NULL); sleep(1); printf("The variable is now %d\n", variable); if (read(fd, &tempch, 1) < 1) { perror("File Read Error"); exit(1); } printf("We could read from the file\n"); return 0; } ga-5-4/armci/testing/test.c0000644000175000017500000014753312662210426013741 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: test.c,v 1.43.6.6 2007-08-30 22:59:27 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "armci.h" #include "message.h" #define MEMLOCK_TEST 0 #if MEMLOCK_TEST extern void armci_lockmem(void *, void *, int); extern void armci_unlockmem(void); #endif #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; int work[MAXPROC]; /* work array for propagating addresses */ #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) { if ((np = atoi(argv[1])) < 1) { goto usage; } } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) { if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif /*\ generate random range for a section of multidimensional array \*/ void get_range(int ndim, int dims[], int lo[], int hi[]) { int dim; for (dim = 0; dim < ndim; dim++) { int toss1, toss2; toss1 = rand() % dims[dim]; toss2 = rand() % dims[dim]; if (toss1 < toss2) { lo[dim] = toss1; hi[dim] = toss2; } else { hi[dim] = toss1; lo[dim] = toss2; } } } /*\ generates a new random range similar to the input range for an array with specified dimensions \*/ void new_range(int ndim, int dims[], int lo[], int hi[], int new_lo[], int new_hi[]) { int dim; for (dim = 0; dim < ndim; dim++) { int toss, range; int diff = hi[dim] - lo[dim] + 1; assert(diff <= dims[dim]); range = dims[dim] - diff; toss = (range > 0) ? rand() % range : lo[dim]; new_lo[dim] = toss; new_hi[dim] = toss + diff - 1; assert(new_hi[dim] < dims[dim]); assert(diff == (new_hi[dim] - new_lo[dim] + 1)); } } /*\ print range of ndim dimensional array with two strings before and after \*/ void print_range(char *pre, int ndim, int lo[], int hi[], char *post) { int i; printf("%s[", pre); for (i = 0; i < ndim; i++) { printf("%d:%d", lo[i], hi[i]); if (i == ndim - 1) { printf("] %s", post); } else { printf(","); } } } /*\ print subscript of ndim dimensional array with two strings before and after \*/ void print_subscript(char *pre, int ndim, int subscript[], char *post) { int i; printf("%s [", pre); for (i = 0; i < ndim; i++) { printf("%d", subscript[i]); if (i == ndim - 1) { printf("] %s", post); } else { printf(","); } } } /*\ print a section of a 2-D array of doubles \*/ void print_2D_double(double *a, int ld, int *lo, int *hi) { int i, j; for (i = lo[0]; i <= hi[0]; i++) { for (j = lo[1]; j <= hi[1]; j++) { printf("%13f ", a[ld*j+i]); } printf("\n"); } } /*\ initialize array: a[i,j,k,..]=i+100*j+10000*k+ ... \*/ void init(double *a, int ndim, int elems, int dims[]) { int idx[MAXDIMS]; int i, dim; for (i = 0; i < elems; i++) { int Index = i; double field, val; for (dim = 0; dim < ndim; dim++) { idx[dim] = Index % dims[dim]; Index /= dims[dim]; } field = 1.; val = 0.; for (dim = 0; dim < ndim; dim++) { val += field * idx[dim]; field *= BASE; } a[i] = val; /* printf("(%d,%d,%d)=%6.0f",idx[0],idx[1],idx[2],val); */ } } /*\ compute Index from subscript * assume that first subscript component changes first \*/ int Index(int ndim, int subscript[], int dims[]) { int idx = 0, i, factor = 1; for (i = 0; i < ndim; i++) { idx += subscript[i] * factor; factor *= dims[i]; } return idx; } void update_subscript(int ndim, int subscript[], int lo[], int hi[], int dims[]) { int i; for (i = 0; i < ndim; i++) { if (subscript[i] < hi[i]) { subscript[i]++; return; } subscript[i] = lo[i]; } } void compare_patches(double eps, int ndim, double *patch1, int lo1[], int hi1[], int dims1[], double *patch2, int lo2[], int hi2[], int dims2[]) { int i, j, elems = 1; int subscr1[MAXDIMS], subscr2[MAXDIMS]; double diff, max; int offset1, offset2; for (i = 0; i < ndim; i++) { /* count # of elements & verify consistency of both patches */ int diff = hi1[i] - lo1[i]; assert(diff == (hi2[i] - lo2[i])); assert(diff < dims1[i]); assert(diff < dims2[i]); elems *= diff + 1; subscr1[i] = lo1[i]; subscr2[i] = lo2[i]; } /* compare element values in both patches */ offset1 = Index(ndim, subscr1, dims1); offset2 = Index(ndim, subscr2, dims2); for (j = 0; j < elems; j++) { int idx1, idx2; idx1 = Index(ndim, subscr1, dims1); /* calculate element Index from a subscript */ idx2 = Index(ndim, subscr2, dims2); idx1 -= offset1; idx2 -= offset2; diff = patch1[idx1] - patch2[idx2]; max = ARMCI_MAX(ARMCI_ABS(patch1[idx1]), ARMCI_ABS(patch2[idx2])); if (max == 0. || max < eps) { max = 1.; } if (eps < ARMCI_ABS(diff) / max) { char msg[48]; sprintf(msg, "(proc=%d):%f", me, patch1[idx1]); print_subscript("ERROR: a", ndim, subscr1, msg); sprintf(msg, "%f\n", patch2[idx2]); print_subscript(" b", ndim, subscr2, msg); fflush(stdout); sleep(1); ARMCI_Error("Bailing out", 0); } { /* update subscript for the patches */ update_subscript(ndim, subscr1, lo1, hi1, dims1); update_subscript(ndim, subscr2, lo2, hi2, dims2); } } /* make sure we reached upper limit */ /*for(i=0;i= 100) { ARMCI_Error("increase MMAX", g_idx); } ARMCI_Memget(bytes, &meminfo[g_idx][me], 0); for (i = 0; i < nproc; i++) { armci_msg_brdcst(&meminfo[g_idx][i], sizeof(armci_meminfo_t), i); } for (i = 0; i < nproc; i++) { a[i] = ARMCI_Memat(&meminfo[g_idx][i], 0); } g_idx++; } #else rc = ARMCI_Malloc(a, bytes); assert(rc == 0); #endif assert(a[me]); } void destroy_array(void *ptr[]) { ARMCI_Barrier(); #if 0 assert(!ARMCI_Free(ptr[me])); #endif } int loA[MAXDIMS], hiA[MAXDIMS]; int dimsA[MAXDIMS] = {DIM1, DIM2, DIM3, DIM4, DIM5, DIM6, DIM7}; int loB[MAXDIMS], hiB[MAXDIMS]; int dimsB[MAXDIMS] = {EDIM1, EDIM2, EDIM3, EDIM4, EDIM5, EDIM6, EDIM7}; int count[MAXDIMS]; int strideA[MAXDIMS], strideB[MAXDIMS]; int loC[MAXDIMS], hiC[MAXDIMS]; int idx[MAXDIMS] = {0, 0, 0, 0, 0, 0, 0}; void test_dim(int ndim) { int dim, elems; int i, j, proc; /* double a[DIM4][DIM3][DIM2][DIM1], b[EDIM4][EDIM3][EDIM2][EDIM1];*/ void *b[MAXPROC]; void *a, *c; elems = 1; strideA[0] = sizeof(double); strideB[0] = sizeof(double); for (i = 0; i < ndim; i++) { strideA[i] *= dimsA[i]; strideB[i] *= dimsB[i]; if (i < ndim - 1) { strideA[i+1] = strideA[i]; strideB[i+1] = strideB[i]; } elems *= dimsA[i]; } /* create shared and local arrays */ create_array(b, sizeof(double), ndim, dimsB); a = malloc(sizeof(double) * elems); assert(a); c = malloc(sizeof(double) * elems); assert(c); init(a, ndim, elems, dimsA); if (me == 0) { printf("--------array[%d", dimsA[0]); for (dim = 1; dim < ndim; dim++) { printf(",%d", dimsA[dim]); } printf("]--------\n"); } sleep(1); ARMCI_AllFence(); ARMCI_Barrier(); for (i = 0; i < LOOP; i++) { int idx1, idx2, idx3; get_range(ndim, dimsA, loA, hiA); new_range(ndim, dimsB, loA, hiA, loB, hiB); new_range(ndim, dimsA, loA, hiA, loC, hiC); proc = nproc - 1 - me; if (me == 0) { print_range("local", ndim, loA, hiA, "-> "); print_range("remote", ndim, loB, hiB, "-> "); print_range("local", ndim, loC, hiC, "\n"); } idx1 = Index(ndim, loA, dimsA); idx2 = Index(ndim, loB, dimsB); idx3 = Index(ndim, loC, dimsA); for (j = 0; j < ndim; j++) { count[j] = hiA[j] - loA[j] + 1; } count[0] *= sizeof(double); /* convert range to bytes at stride level zero */ (void)ARMCI_PutS((double *)a + idx1, strideA, (double *)b[proc] + idx2, strideB, count, ndim - 1, proc); /* sleep(1);*/ /* printf("%d: a=(%x,%f) b=(%x,%f)\n",me,idx1 + (double*)a,*(idx1 + (double*)a),idx2 + (double*)b,*(idx2 + (double*)b));*/ /* fflush(stdout);*/ /* sleep(1);*/ /* note that we do not need ARMCI_Fence here since * consectutive operations targeting the same process are ordered */ (void)ARMCI_GetS((double *)b[proc] + idx2, strideB, (double *)c + idx3, strideA, count, ndim - 1, proc); compare_patches(0., ndim, (double *)a + idx1, loA, hiA, dimsA, (double *)c + idx3, loC, hiC, dimsA); } free(c); destroy_array(b); free(a); } int nloA[MAXDIMS+1][MAXDIMS], nhiA[MAXDIMS+1][MAXDIMS]; int nloB[MAXDIMS+1][MAXDIMS], nhiB[MAXDIMS+1][MAXDIMS]; int nloC[MAXDIMS+1][MAXDIMS], nhiC[MAXDIMS+1][MAXDIMS]; int get_next_RRproc(int initialize, int ndim) { static int distance; int proc; if (initialize) { distance = nproc / 2; if ((nproc % 2) != 0) { distance++; } if (nproc == 1) { distance = 0; } return(0); } /*send it to a different process everytime*/ proc = (me <= ((nproc % 2 == 0) ? ((nproc / 2) - 1) : (nproc / 2))) ? (me + distance) : (me - distance); if ((nproc % 2) != 0 && me == (nproc / 2)) { proc = me; } if (distance != 0) { if (me < (nproc / 2)) { distance++; if ((me + distance) >= nproc) { distance = nproc / 2; if ((nproc % 2) != 0) { distance++; } distance -= me; } } else { distance--; if ((me - distance) >= (nproc / 2)) { distance = nproc / 2; if ((nproc % 2) != 0) { distance++; } distance = distance + (me - distance); } } if (ndim != 1 && MAXDIMS > nproc && (ndim % (nproc / 2) == 0)) { distance = nproc / 2; if ((nproc % 2) != 0) { distance++; } } } return(proc); } void test_nbdim() { int elems = 1, elems1 = 1; int i, j, proc, ndim, rc; void *b[MAXDIMS+1][MAXPROC]; void *a[MAXDIMS+1], *c[MAXDIMS+1]; armci_hdl_t hdl_put[MAXDIMS+1], hdl_get[MAXDIMS+1]; int idx1 = 0, idx2 = 0, idx3 = 0; /* create shared and local arrays */ for (ndim = 1; ndim <= MAXDIMS; ndim++) { elems1 *= dimsB[ndim-1]; elems *= dimsA[ndim-1]; rc = ARMCI_Malloc(b[ndim], sizeof(double) * elems1); assert(rc == 0); assert(b[ndim][me]); a[ndim] = malloc(sizeof(double) * elems); assert(a[ndim]); c[ndim] = malloc(sizeof(double) * elems); assert(c[ndim]); init(a[ndim], ndim, elems, dimsA); ARMCI_INIT_HANDLE(hdl_put + ndim); ARMCI_INIT_HANDLE(hdl_get + ndim); } ARMCI_AllFence(); ARMCI_Barrier(); (void)get_next_RRproc(1, 0); for (ndim = 1; ndim <= MAXDIMS; ndim++) { strideA[0] = sizeof(double); strideB[0] = sizeof(double); for (i = 0; i < ndim; i++) { strideA[i] *= dimsA[i]; strideB[i] *= dimsB[i]; if (i < ndim - 1) { strideA[i+1] = strideA[i]; strideB[i+1] = strideB[i]; } } proc = get_next_RRproc(0, ndim); get_range(ndim, dimsA, nloA[ndim], nhiA[ndim]); new_range(ndim, dimsB, nloA[ndim], nhiA[ndim], nloB[ndim], nhiB[ndim]); new_range(ndim, dimsA, nloA[ndim], nhiA[ndim], nloC[ndim], nhiC[ndim]); if (me == 0) { print_range("local", ndim, nloA[ndim], nhiA[ndim], "-> "); print_range("remote", ndim, nloB[ndim], nhiB[ndim], "-> "); print_range("local", ndim, nloC[ndim], nhiC[ndim], "\n"); fflush(stdout); sleep(1); } idx1 = Index(ndim, nloA[ndim], dimsA); idx2 = Index(ndim, nloB[ndim], dimsB); idx3 = Index(ndim, nloC[ndim], dimsA); for (j = 0; j < ndim; j++) { count[j] = nhiA[ndim][j] - nloA[ndim][j] + 1; } count[0] *= sizeof(double); if (ndim == 1) { (void)ARMCI_NbPut((double *)a[ndim] + idx1, (double *)b[ndim][proc] + idx2, count[0], proc, (hdl_put + ndim)); } else { (void)ARMCI_NbPutS((double *)a[ndim] + idx1, strideA, (double *)b[ndim][proc] + idx2, strideB, count, ndim - 1, proc, (hdl_put + ndim)); } } sleep(5); ARMCI_Barrier(); /*before we do gets, we have to make sure puts are complete on the remote processor*/ for (ndim = 1; ndim <= MAXDIMS; ndim++) { ARMCI_Wait(hdl_put + ndim); } ARMCI_Barrier(); ARMCI_AllFence(); (void)get_next_RRproc(1, 0); for (ndim = 1; ndim <= MAXDIMS; ndim++) { strideA[0] = sizeof(double); strideB[0] = sizeof(double); for (i = 0; i < ndim; i++) { strideA[i] *= dimsA[i]; strideB[i] *= dimsB[i]; if (i < ndim - 1) { strideA[i+1] = strideA[i]; strideB[i+1] = strideB[i]; } } /*send it to a different process everytime*/ proc = get_next_RRproc(0, ndim); idx1 = Index(ndim, nloA[ndim], dimsA); idx2 = Index(ndim, nloB[ndim], dimsB); idx3 = Index(ndim, nloC[ndim], dimsA); for (j = 0; j < ndim; j++) { count[j] = nhiA[ndim][j] - nloA[ndim][j] + 1; } count[0] *= sizeof(double); if (ndim == 1) { (void)ARMCI_NbGet((double *)b[ndim][proc] + idx2, (double *)c[ndim] + idx3, count[0], proc, (hdl_get + ndim)); } else { (void)ARMCI_NbGetS((double *)b[ndim][proc] + idx2, strideB, (double *)c[ndim] + idx3, strideA, count, ndim - 1, proc, (hdl_get + ndim)); } } ARMCI_Barrier(); if (me == 0) { printf("Now waiting for all non-blocking calls and verifying data...\n"); fflush(stdout); } for (ndim = 1; ndim <= MAXDIMS; ndim++) { ARMCI_Wait(hdl_get + ndim); idx1 = Index(ndim, nloA[ndim], dimsA); idx2 = Index(ndim, nloB[ndim], dimsB); idx3 = Index(ndim, nloC[ndim], dimsA); compare_patches(0., ndim, (double *)a[ndim] + idx1, nloA[ndim], nhiA[ndim], dimsA, (double *)c[ndim] + idx3, nloC[ndim], nhiC[ndim], dimsA); } if (me == 0) { printf("OK\n"); fflush(stdout); } for (ndim = 1; ndim <= MAXDIMS; ndim++) { destroy_array(b[ndim]); free(c[ndim]); free(a[ndim]); } } #define PTR_ARR_LEN 10 #define VLOOP 50 #define VEC_ELE_LEN 20 /*number of doubles in each dimention*/ #define GIOV_ARR_LEN 9 void verify_vector_data(double *data, int procs, int isput, int datalen) { double facto = 2.89; int i, j = 0, k = 0, kc = 0, dst = 0; if (isput) { facto = 1.89; } for (i = 0; i < datalen; i++) { if (dst != me) if (ARMCI_ABS((data[i] - (me + facto + dst)*((kc + 1)*(j % PTR_ARR_LEN + 1)))) > 0.001) { printf("\n%d:while verifying data of a op from proc=%d ", me, dst); printf("giov index=%d ptr_arr_index=%d \n :element index=%d", kc, (j % PTR_ARR_LEN), k); printf(" elem was supposed to be %f but is %f", (me + facto + dst)*((kc + 1)*(j % PTR_ARR_LEN + 1)) , data[i]); fflush(stdout); sleep(1); ARMCI_Error("vector non-blocking failed", 0); } k++; if (k == VEC_ELE_LEN) { j++; k = 0; if (j % PTR_ARR_LEN == 0) { kc++; if ((kc % GIOV_ARR_LEN) == 0) { kc = 0; dst++; } } } } } void test_vec_small() { double *getdst; double **putsrc; armci_giov_t dsc[MAXPROC*GIOV_ARR_LEN]; void **psrc; /*arrays of pointers to be used by giov_t*/ void **pdst; void *getsrc[MAXPROC]; /*to allocate mem via armci_malloc*/ void *putdst[MAXPROC]; /*to allocate mem via armci_malloc*/ armci_hdl_t hdl_put[MAXPROC], hdl_get[MAXPROC]; int i = 0, j = 0, k = 0, kc = 0, kcold = 0, rc, dstproc, dst = 0; int lenpergiov; lenpergiov = PTR_ARR_LEN * VEC_ELE_LEN; rc = ARMCI_Malloc(getsrc, sizeof(double) * nproc * GIOV_ARR_LEN * lenpergiov); assert(rc == 0); assert(getsrc[me]); rc = ARMCI_Malloc(putdst, sizeof(double) * nproc * GIOV_ARR_LEN * lenpergiov); assert(rc == 0); assert(putdst[me]); /*first malloc for getdst and putsrc, both are 2d arrays*/ getdst = (double *)malloc(sizeof(double) * nproc * GIOV_ARR_LEN * lenpergiov); putsrc = (double **)malloc(sizeof(double *) * nproc * GIOV_ARR_LEN * PTR_ARR_LEN); assert(getdst); assert(putsrc); for (i = 0; i < nproc * GIOV_ARR_LEN * PTR_ARR_LEN; i++) { putsrc[i] = (double *)malloc(sizeof(double) * VEC_ELE_LEN); assert(putsrc[i]); } /*allocating memory for psrc and pdst*/ psrc = (void **)malloc(sizeof(void *) * PTR_ARR_LEN * nproc * GIOV_ARR_LEN); pdst = (void **)malloc(sizeof(void *) * PTR_ARR_LEN * nproc * GIOV_ARR_LEN); assert(pdst); assert(psrc); for (i = 0; i < nproc * lenpergiov * GIOV_ARR_LEN; i++) { putsrc[j][k] = (me + 1.89 + dst) * ((kc + 1) * ((j % PTR_ARR_LEN) + 1)); ((double *)getsrc[me])[i] = (me + 2.89 + dst) * ((kc + 1) * (j % PTR_ARR_LEN + 1)); k++; if (k == VEC_ELE_LEN) { j++; k = 0; if ((j % PTR_ARR_LEN) == 0) { kc++; if ((kc % GIOV_ARR_LEN) == 0) { kc = 0; dst++; } } } } /*********************Testing NbPutV*********************************/ i = 0; j = 0; k = 0; kc = 0; dstproc = me; for (i = 0; i < nproc - 1; i++) { dstproc++; if (dstproc == nproc) { dstproc = 0; } for (j = 0; j < GIOV_ARR_LEN; j++) { kcold = kc; for (k = 0; k < PTR_ARR_LEN; k++, kc++) { double *ptr; psrc[kc] = (void *)putsrc[PTR_ARR_LEN*(dstproc*GIOV_ARR_LEN+j)+k]; ptr = (double *)putdst[dstproc]; pdst[kc] = (void *)(ptr + lenpergiov * (GIOV_ARR_LEN * me + j) + k * VEC_ELE_LEN); } dsc[j].bytes = VEC_ELE_LEN * sizeof(double); dsc[j].src_ptr_array = &psrc[kcold]; dsc[j].dst_ptr_array = &pdst[kcold]; dsc[j].ptr_array_len = PTR_ARR_LEN; } ARMCI_INIT_HANDLE(hdl_put + dstproc); if ((rc = ARMCI_NbPutV(dsc, GIOV_ARR_LEN, dstproc, hdl_put + dstproc))) { ARMCI_Error("putv failed", rc); } } if (me == 0) { printf("\n\tNow veryfying the vector put data for correctness"); } for (i = 0; i < nproc; i++)if (i != me) { ARMCI_Wait(hdl_put + i); } sleep(1); ARMCI_Barrier(); ARMCI_AllFence();/*every one syncs after put */ verify_vector_data((double *)putdst[me], nproc, 1, nproc * GIOV_ARR_LEN * lenpergiov); if (me == 0) { printf("\n\tPuts OK\n"); } /****************Done Testing NbPutV*********************************/ /*********************Testing NbGetV*********************************/ i = 0; j = 0; k = 0; kc = 0; dstproc = me; for (i = 0; i < nproc - 1; i++) { dstproc++; if (dstproc == nproc) { dstproc = 0; } for (j = 0; j < GIOV_ARR_LEN; j++) { kcold = kc; for (k = 0; k < PTR_ARR_LEN; k++, kc++) { double *ptr; ptr = getdst; pdst[kc] = (void *)(ptr + lenpergiov * (dstproc * GIOV_ARR_LEN + j) + k * VEC_ELE_LEN); ptr = (double *)(getsrc[dstproc]); psrc[kc] = (void *)(ptr + lenpergiov * (me * GIOV_ARR_LEN + j) + k * VEC_ELE_LEN); } dsc[j].bytes = VEC_ELE_LEN * sizeof(double); dsc[j].src_ptr_array = &psrc[kcold]; dsc[j].dst_ptr_array = &pdst[kcold]; dsc[j].ptr_array_len = PTR_ARR_LEN; } ARMCI_INIT_HANDLE(hdl_get + dstproc); if ((rc = ARMCI_NbGetV(dsc, GIOV_ARR_LEN, dstproc, hdl_get + dstproc))) { ARMCI_Error("putv failed", rc); } } if (me == 0) { printf("\n\tNow veryfying the vector get data for correctness"); } for (i = 0; i < nproc; i++)if (i != me) { ARMCI_Wait(hdl_get + i); } sleep(1); ARMCI_Barrier(); verify_vector_data((double *)getdst, nproc, 0, nproc * GIOV_ARR_LEN * lenpergiov); if (me == 0) { printf("\n\tGets OK\n"); } /****************Done Testing NbGetV*********************************/ free(pdst); free(psrc); free(getdst); for (i = 0; i < nproc * GIOV_ARR_LEN * PTR_ARR_LEN; i++) { free(putsrc[i]); } free(putsrc); } void GetPermutedProcList(int *ProcList) { int i, iswap, temp; if (nproc > MAXPROC) { ARMCI_Error("permute_proc: nproc to big ", nproc); } /* initialize list */ for (i = 0; i < nproc; i++) { ProcList[i] = i; } if (nproc == 1) { return; } /* every process generates different random sequence */ (void)srand((unsigned)me); /* list permutation generated by random swapping */ for (i = 0; i < nproc; i++) { iswap = (int)(rand() % nproc); temp = ProcList[iswap]; ProcList[iswap] = ProcList[i]; ProcList[i] = temp; } } /*\ Atomic Accumulate test: remote += alpha*local * Every process/or has its patch of array b updated TIMES*NPROC times. * The sequence of updates is random: everybody uses a randomly permuted list * and accumulate is non-collective (of-course) \*/ void test_acc(int ndim) { int dim, elems; int i, proc; void *b[MAXPROC]; void *a, *c; double alpha = 0.1, scale; int idx1, idx2; int *proclist = work; elems = 1; strideA[0] = sizeof(double); strideB[0] = sizeof(double); for (i = 0; i < ndim; i++) { strideA[i] *= dimsA[i]; strideB[i] *= dimsB[i]; if (i < ndim - 1) { strideA[i+1] = strideA[i]; strideB[i+1] = strideB[i]; } elems *= dimsA[i]; /* set up patch coordinates: same on every processor */ loA[i] = 0; hiA[i] = loA[i] + 1; loB[i] = dimsB[i] - 2; hiB[i] = loB[i] + 1; count[i] = hiA[i] - loA[i] + 1; } /* create shared and local arrays */ create_array(b, sizeof(double), ndim, dimsB); a = malloc(sizeof(double) * elems); assert(a); c = malloc(sizeof(double) * elems); assert(c); init(a, ndim, elems, dimsA); if (me == 0) { printf("--------array[%d", dimsA[0]); for (dim = 1; dim < ndim; dim++) { printf(",%d", dimsA[dim]); } printf("]--------\n"); } GetPermutedProcList(proclist); idx1 = Index(ndim, loA, dimsA); idx2 = Index(ndim, loB, dimsB); count[0] *= sizeof(double); /* convert range to bytes at stride level zero */ /* initialize all elements of array b to zero */ elems = 1; for (i = 0; i < ndim; i++) { elems *= dimsB[i]; } for (i = 0; i < elems; i++) { ((double *)b[me])[i] = 0.; } sleep(1); if (me == 0) { print_range("patch", ndim, loA, hiA, " -> "); print_range("patch", ndim, loB, hiB, "\n"); fflush(stdout); } ARMCI_AllFence(); ARMCI_Barrier(); for (i = 0; i < TIMES * nproc; i++) { proc = proclist[i%nproc]; (void)ARMCI_AccS(ARMCI_ACC_DBL, &alpha, (double *)a + idx1, strideA, (double *)b[proc] + idx2, strideB, count, ndim - 1, proc); } /* sleep(9);*/ ARMCI_AllFence(); ARMCI_Barrier(); /* copy my patch into local array c */ (void)ARMCI_GetS((double *)b[me] + idx2, strideB, (double *)c + idx1, strideA, count, ndim - 1, me); scale = alpha * TIMES * nproc; scale_patch(scale, ndim, (double *)a + idx1, loA, hiA, dimsA); compare_patches(.0001, ndim, (double *)a + idx1, loA, hiA, dimsA, (double *)c + idx1, loA, hiA, dimsA); ARMCI_Barrier(); if (0 == me) { printf(" OK\n\n"); fflush(stdout); } free(c); destroy_array(b); free(a); } /*************************** vector interface *********************************\ * tests vector interface for transfers of triangular sections of a 2-D array * ******************************************************************************/ void test_vector() { int dim, elems, ndim, cols, rows, mrc; int i, proc, loop; int rc; int idx1, idx3; void *b[MAXPROC]; void *a, *c; armci_giov_t dsc[MAX_DIM_VAL]; void *psrc[MAX_DIM_VAL]; void *pdst[MAX_DIM_VAL]; elems = 1; ndim = 2; for (i = 0; i < ndim; i++) { dimsA[i] = MAX_DIM_VAL; dimsB[i] = MAX_DIM_VAL + 1; elems *= dimsA[i]; } /* create shared and local arrays */ create_array(b, sizeof(double), ndim, dimsB); a = malloc(sizeof(double) * elems); assert(a); c = malloc(sizeof(double) * elems); assert(c); init(a, ndim, elems, dimsA); if (me == 0) { printf("--------array[%d", dimsA[0]); for (dim = 1; dim < ndim; dim++) { printf(",%d", dimsA[dim]); } printf("]--------\n"); } sleep(1); for (loop = 0; loop < LOOP; loop++) { get_range(ndim, dimsA, loA, hiA); new_range(ndim, dimsB, loA, hiA, loB, hiB); new_range(ndim, dimsA, loA, hiA, loC, hiC); proc = nproc - 1 - me; if (me == 0) { print_range("local", ndim, loA, hiA, "-> "); print_range("remote", ndim, loB, hiB, "-> "); print_range("local", ndim, loC, hiC, "\n"); } /* printf("array at source\n");*/ /* print_2D_double((double *)a, dimsA[0], loA, hiA);*/ cols = hiA[1] - loA[1] + 1; rows = hiA[0] - loA[0] + 1; mrc = ARMCI_MIN(cols, rows); /* generate a data descriptor for a lower-triangular patch */ for (i = 0; i < mrc; i++) { int ij[2]; int idx; ij[0] = loA[0] + i; ij[1] = loA[1] + i; idx = Index(ndim, ij, dimsA); psrc[i] = (double *)a + idx; ij[0] = loB[0] + i; ij[1] = loB[1] + i; idx = Index(ndim, ij, dimsB); pdst[i] = (double *)b[proc] + idx; dsc[i].bytes = (rows - i) * sizeof(double); dsc[i].src_ptr_array = &psrc[i]; dsc[i].dst_ptr_array = &pdst[i]; /* assume each element different in size (not true in rectangular patches) */ dsc[i].ptr_array_len = 1; } if ((rc = ARMCI_PutV(dsc, mrc, proc))) { ARMCI_Error("putv failed ", rc); } /* printf("array at destination\n");*/ /* print_2D_double((double *)b[proc], dimsB[0], loB, hiB);*/ /* generate a data descriptor for the upper-triangular patch */ /* there is one less element since diagonal is excluded */ for (i = 1; i < cols; i++) { int ij[2]; ij[0] = loA[0]; ij[1] = loA[1] + i; psrc[i-1] = (double *)a + Index(ndim, ij, dimsA); ij[0] = loB[0]; ij[1] = loB[1] + i; pdst[i-1] = (double *)b[proc] + Index(ndim, ij, dimsB); mrc = ARMCI_MIN(i, rows); dsc[i-1].bytes = mrc * sizeof(double); dsc[i-1].src_ptr_array = &psrc[i-1]; dsc[i-1].dst_ptr_array = &pdst[i-1]; /* assume each element different in size (not true in rectangular patches) */ dsc[i-1].ptr_array_len = 1; } if ((cols - 1))if ((rc = ARMCI_PutV(dsc, cols - 1, proc))) { ARMCI_Error("putv(2) failed ", rc); } /* we get back entire rectangular patch */ for (i = 0; i < cols; i++) { int ij[2]; ij[0] = loB[0]; ij[1] = loB[1] + i; psrc[i] = (double *)b[proc] + Index(ndim, ij, dimsB); ij[0] = loC[0]; ij[1] = loC[1] + i; pdst[i] = (double *)c + Index(ndim, ij, dimsA); } dsc[0].bytes = rows * sizeof(double); dsc[0].src_ptr_array = psrc; dsc[0].dst_ptr_array = pdst; dsc[0].ptr_array_len = cols; /* note that we do not need ARMCI_Fence here since * consecutive operations targeting the same process are ordered */ if ((rc = ARMCI_GetV(dsc, 1, proc))) { ARMCI_Error("getv failed ", rc); } idx1 = Index(ndim, loA, dimsA); idx3 = Index(ndim, loC, dimsA); compare_patches(0., ndim, (double *)a + idx1, loA, hiA, dimsA, (double *)c + idx3, loC, hiC, dimsA); } free(c); destroy_array(b); free(a); } /*\ Atomic Accumulate test for vector API: remote += alpha*local * Every process/or has its patch of array b updated TIMES*NPROC times. * The sequence of updates is random: everybody uses a randomly permuted list * and accumulate is non-collective (of-course) \*/ void test_vector_acc() { int dim, elems, bytes; int i, j, proc, rc, one = 1; void *b[MAXPROC]; void *psrc[ELEMS/2], *pdst[ELEMS/2]; void *a, *c; double alpha = 0.1, scale; int *proclist = work; armci_giov_t dsc; elems = ELEMS; dim = 1; bytes = sizeof(double) * elems; /* create shared and local arrays */ create_array(b, sizeof(double), dim, &elems); a = malloc(bytes); assert(a); c = malloc(bytes); assert(c); init(a, dim, elems, &elems); if (me == 0) { printf("--------array[%d", elems); printf("]--------\n"); fflush(stdout); } GetPermutedProcList(proclist); /* initialize all elements of array b to zero */ for (i = 0; i < elems; i++) { ((double *)b[me])[i] = 0.; } sleep(1); dsc.bytes = sizeof(double); dsc.src_ptr_array = psrc; dsc.dst_ptr_array = pdst; dsc.ptr_array_len = elems / 2; ARMCI_Barrier(); for (i = 0; i < TIMES * nproc; i++) { /* proc=proclist[i%nproc];*/ proc = 0; /* accumulate even numbered elements */ for (j = 0; j < elems / 2; j++) { psrc[j] = 2 * j + (double *)a; pdst[j] = 2 * j + (double *)b[proc]; } if ((rc = ARMCI_AccV(ARMCI_ACC_DBL, &alpha, &dsc, 1, proc))) { ARMCI_Error("accumlate failed", rc); } /* for(j=0; j 0.1) { ARMCI_Error("Float register-originated put failed", 0); } if (ARMCI_ABS(fdst_get[i] - 100.01 *(i + 1)) > 0.1) { ARMCI_Error("Float register-originated get failed", 0); } } if (me == 0) { printf("OK\ndouble data type: "); } for (i = 0; i < elems; i++) { if (ARMCI_ABS(ddst[me][i] - 10.001 *(i + 1)) > 0.1) { ARMCI_Error("Double register-originated put failed", 0); } if (ARMCI_ABS(ddst_get[i] - 100.001 *(i + 1)) > 0.1) { ARMCI_Error("Double register-originated get failed", 0); } } if (me == 0) { printf("OK\n"); fflush(stdout); } ARMCI_AllFence(); ARMCI_Barrier(); destroy_array((void **)idst); destroy_array((void **)ldst); destroy_array((void **)fdst); destroy_array((void **)ddst); destroy_array((void **)isrc_get); destroy_array((void **)lsrc_get); destroy_array((void **)fsrc_get); destroy_array((void **)dsrc_get); } #define MAXELEMS 6400 #define NUMAGG 20 /* NUMAGG < MAXELEMS/10 */ #define MAX_REQUESTS 325 /* MAXELEMS/NUMAGG */ #define COUNT 50 void test_aggregate() { int i, j, k, rc, bytes, elems[2] = {MAXPROC, MAXELEMS}; double *ddst_put[MAXPROC]; double *ddst_get[MAXPROC]; double *dsrc[MAXPROC]; armci_hdl_t usr_hdl_put[MAXPROC]; armci_hdl_t usr_hdl_get[MAXPROC]; armci_giov_t darr; void *src_ptr[MAX_REQUESTS], *dst_ptr[MAX_REQUESTS]; int start = 0, end = 0; create_array((void **)ddst_put, sizeof(double), 2, elems); create_array((void **)ddst_get, sizeof(double), 2, elems); create_array((void **)dsrc, sizeof(double), 1, &elems[1]); for (i = 0; i < elems[1]; i++) { dsrc[me][i] = i * 1.001 * (me + 1); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst_put[me][i] = 0.0; ddst_get[me][i] = 0.0; } ARMCI_Barrier(); for (i = 0; i < nproc; i++) { ARMCI_INIT_HANDLE(&usr_hdl_put[i]); } for (i = 0; i < nproc; i++) { ARMCI_INIT_HANDLE(&usr_hdl_get[i]); } for (i = 0; i < nproc; i++) { ARMCI_SET_AGGREGATE_HANDLE(&usr_hdl_put[i]); } for (i = 0; i < nproc; i++) { ARMCI_SET_AGGREGATE_HANDLE(&usr_hdl_get[i]); } /* Testing aggregate put */ for (i = 0; i < nproc; i++) { start = 0; end = COUNT * NUMAGG; for (j = start; j < end; j++) { bytes = sizeof(double); ARMCI_NbPutValueDouble(dsrc[me][j], &ddst_put[i][me*elems[1] + j], i, &usr_hdl_put[i]); } start = end; end = start + COUNT * NUMAGG; for (j = start, k = 0; j < end; j += NUMAGG, k++) { src_ptr[k] = (void *)&dsrc[me][j]; dst_ptr[k] = (void *)&ddst_put[i][me*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = NUMAGG * sizeof(double); darr.ptr_array_len = k; if ((rc = ARMCI_NbPutV(&darr, 1, i, &usr_hdl_put[i]))) { ARMCI_Error("armci_nbputv failed\n", rc); } start = end; end = start + COUNT * NUMAGG; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbPutS(&dsrc[me][j], NULL, &ddst_put[i][me*elems[1] + j], NULL, &bytes, 0, i, &usr_hdl_put[i]))) { ARMCI_Error("armci_nbputs failed\n", rc); } } start = end; end = elems[1]; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1] + j], bytes, i, &usr_hdl_put[i]))) { ARMCI_Error("armci_nbput failed\n", rc); } } } for (i = 0; i < nproc; i++) { ARMCI_Wait(&usr_hdl_put[i]); } /* Testing aggregate get */ for (i = 0; i < nproc; i++) { start = 0; end = COUNT * NUMAGG; for (j = start, k = 0; j < end; j += NUMAGG, k++) { src_ptr[k] = (void *)&dsrc[i][j]; dst_ptr[k] = (void *)&ddst_get[me][i*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = NUMAGG * sizeof(double); darr.ptr_array_len = k; if ((rc = ARMCI_NbGetV(&darr, 1, i, &usr_hdl_get[i]))) { ARMCI_Error("armci_nbgetv failed\n", rc); } start = end; end = start + COUNT * NUMAGG; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbGetS(&dsrc[i][j], NULL, &ddst_get[me][i*elems[1] + j], NULL, &bytes, 0, i, &usr_hdl_get[i]))) { ARMCI_Error("armci_nbputs failed\n", rc); } } start = end; end = elems[1]; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1] + j], bytes, i, &usr_hdl_get[i]))) { ARMCI_Error("armci_nbget failed\n", rc); } } } for (i = 0; i < nproc; i++) { ARMCI_Wait(&usr_hdl_get[i]); } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); for (i = 0; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_put[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("aggregate put failed...1", 0); } } } ARMCI_Barrier(); if (me == 0) { printf(" aggregate put ..O.K.\n"); } fflush(stdout); for (i = 0; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_get[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("aggregate get failed...1", 0); } } } ARMCI_Barrier(); if (me == 0) { printf(" aggregate get ..O.K.\n"); } fflush(stdout); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("O.K.\n"); fflush(stdout); } destroy_array((void **)ddst_put); destroy_array((void **)ddst_get); destroy_array((void **)dsrc); } void test_implicit() { int i, j, k, rc, bytes, elems[2] = {MAXPROC, MAXELEMS}; double *ddst_put[MAXPROC]; double *ddst_get[MAXPROC]; double *dsrc[MAXPROC]; armci_giov_t darr; void *src_ptr[MAX_REQUESTS], *dst_ptr[MAX_REQUESTS]; int start = 0, end = 0; armci_hdl_t usr_hdl[MAXPROC]; create_array((void **)ddst_put, sizeof(double), 2, elems); create_array((void **)ddst_get, sizeof(double), 2, elems); create_array((void **)dsrc, sizeof(double), 1, &elems[1]); for (i = 0; i < elems[1]; i++) { dsrc[me][i] = i * 1.001 * (me + 1); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst_put[me][i] = 0.0; ddst_get[me][i] = 0.0; } ARMCI_Barrier(); for (i = 0; i < nproc; i++) { ARMCI_INIT_HANDLE(&usr_hdl[i]); } for (i = 0; i < nproc; i++) { start = 0; end = COUNT * NUMAGG; for (j = start; j < end; j++) { bytes = sizeof(double); ARMCI_NbPutValueDouble(dsrc[me][j], &ddst_put[i][me*elems[1] + j], i, NULL); } start = end; end = start + COUNT * NUMAGG; for (j = start, k = 0; j < end; j += NUMAGG, k++) { src_ptr[k] = (void *)&dsrc[me][j]; dst_ptr[k] = (void *)&ddst_put[i][me*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = NUMAGG * sizeof(double); darr.ptr_array_len = k; if ((rc = ARMCI_NbPutV(&darr, 1, i, NULL))) { ARMCI_Error("armci_nbputv failed\n", rc); } start = end; end = start + COUNT * NUMAGG; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbPutS(&dsrc[me][j], NULL, &ddst_put[i][me*elems[1] + j], NULL, &bytes, 0, i, NULL))) { ARMCI_Error("armci_nbputs failed\n", rc); } } start = end; end = elems[1]; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1] + j], bytes, i, NULL))) { ARMCI_Error("armci_nbput failed\n", rc); } } } for (i = 0; i < nproc; i++) { start = 0; end = COUNT * NUMAGG; for (j = start, k = 0; j < end; j += NUMAGG, k++) { src_ptr[k] = (void *)&dsrc[i][j]; dst_ptr[k] = (void *)&ddst_get[me][i*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = NUMAGG * sizeof(double); darr.ptr_array_len = k; if ((rc = ARMCI_NbGetV(&darr, 1, i, NULL))) { ARMCI_Error("armci_nbgetv failed\n", rc); } start = end; end = start + COUNT * NUMAGG; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbGetS(&dsrc[i][j], NULL, &ddst_get[me][i*elems[1] + j], NULL, &bytes, 0, i, NULL))) { ARMCI_Error("armci_nbputs failed\n", rc); } } start = end; end = elems[1]; for (j = start; j < end; j += NUMAGG) { bytes = sizeof(double) * NUMAGG; if ((rc = ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1] + j], bytes, i, NULL))) { ARMCI_Error("armci_nbget failed\n", rc); } } } ARMCI_WaitAll(); ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); for (i = 0; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_put[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("implicit handle(s) failed...(a)", 0); } } } ARMCI_Barrier(); for (i = 0; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_get[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("implicit handles(s) failed...(b)", 0); } } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("O.K.\n\n"); fflush(stdout); } destroy_array((void **)ddst_put); destroy_array((void **)ddst_get); destroy_array((void **)dsrc); } int main(int argc, char *argv[]) { int ndim; armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); /* printf("nproc = %d, me = %d\n", nproc, me);*/ if (nproc > MAXPROC && me == 0) { ARMCI_Error("Test works for up to %d processors\n", MAXPROC); } if (me == 0) { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } /* if(me==1)armci_die("process 1 committing suicide",1); */ if (me == 0) { printf("\nTesting strided gets and puts\n"); printf("(Only std output for process 0 is printed)\n\n"); fflush(stdout); sleep(1); } for (ndim = 1; ndim <= MAXDIMS; ndim++) { test_dim(ndim); } ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting non-blocking gets and puts\n"); fflush(stdout); sleep(1); } test_nbdim(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting non-blocking vector gets and puts\n"); fflush(stdout); sleep(1); } test_vec_small(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting atomic accumulate\n"); fflush(stdout); sleep(1); } for (ndim = 1; ndim <= MAXDIMS; ndim++) { test_acc(ndim); } ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting Vector Interface using triangular patches of a 2-D array\n\n"); fflush(stdout); sleep(1); } test_vector(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting Accumulate with Vector Interface\n\n"); fflush(stdout); sleep(1); } test_vector_acc(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting atomic fetch&add\n"); printf("(Std Output for all processes is printed)\n\n"); fflush(stdout); sleep(1); } ARMCI_Barrier(); test_fetch_add(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting atomic swap\n"); fflush(stdout); } test_swap(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting register-originated put and get\n"); fflush(stdout); sleep(1); } test_rput(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting aggregate put/get requests\n"); fflush(stdout); } /** * Aggregate put/get requests cannot be tested for\ number of procs * greater than 32. (Current implementation of aggregate put/get * can use at the maximum of 32 handles (defined by macro * _MAX_AGG_BUFFERS in aggregate.c). This test case is written in * such a way that each process puts/gets data to all the other * processes, thus the number of aggregate handle used is equal to * the number of processes created. */ if (nproc > 32) { if (me == 0) { printf("\n WARNING: Aggregate put/get requests cannot be tested for number of procs greater than 32.\n\n"); fflush(stdout); } } else { test_aggregate(); } ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting implicit handles\n"); fflush(stdout); } test_implicit(); ARMCI_AllFence(); ARMCI_Barrier(); ARMCI_Barrier(); #if MEMLOCK_TEST test_memlock(); #endif ARMCI_Barrier(); if (me == 0) { printf("All tests passed\n"); fflush(stdout); } sleep(2); #ifdef NEWMALLOC { int i, j; for (i = 0; i < g_idx; i++) for (j = 0; j < nproc; j++) { ARMCI_Memdt(&meminfo[i][j], 0); } for (i = 0; i < g_idx; i++) { ARMCI_Memctl(&meminfo[i][me]); } } #endif ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); //MPI_Finalize(); return(0); } ga-5-4/armci/testing/perf_nb.c0000644000175000017500000002661212662210426014367 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: perf_nb.c,v 1.3 2004-03-29 19:14:51 vinod Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 8 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif #define MAXELEMS 131072 /* 262144 */ #define MAX_REQUESTS MAXELEMS #define PUT 11 #define GET 22 #define ACC 33 int VERIFY = 1; /* verifies results */ int DEBUG = 0; /* if debug=1, dump extra messages */ /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ double *ddst[MAXPROC]; #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) if ((np = atoi(argv[1])) < 1) { goto usage; } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif /*void create_array(void *a[], int elem_size, int ndim, int dims[])*/ void create_array(double *a[], int ndim, int dims[]) { int bytes = sizeof(double), i, rc; assert(ndim <= MAXDIMS); for (i = 0; i < ndim; i++) { bytes *= dims[i]; } rc = ARMCI_Malloc((void **)a, bytes); assert(rc == 0); assert(a[me]); } /*void destroy_array(void *ptr[])*/ void destroy_array(double *ptr[]) { ARMCI_Barrier(); assert(!ARMCI_Free(ptr[me])); } void verify_results(int op, int *elems) { int i, j; switch (op) { case PUT: if (!(me == 0)) for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst[me][j] - j * 1.001) > 0.1) { ARMCI_Error("put failed...Invalid Value Obtained..1", 0); } } ARMCI_Barrier(); if (DEBUG) if (me == 0) { printf(" verifying put ..O.K.\n"); } break; case GET: if (me == 0) { for (i = 1; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("get failed...Invalid Value Obtained..1", 0); } } } } ARMCI_Barrier(); if (DEBUG) if (me == 0) { printf(" verifying get ..O.K.\n\n"); } break; case ACC: if (me == 0) for (j = 0; j < elems[1]; j++) { /*printf("ddst[%d][%d] = %lf\n", me, j, ddst[me][j]); fflush(stdout); */ if (ARMCI_ABS(ddst[me][j] - (double)nproc) > 0.1) { ARMCI_Error("accumulate failed...Invalid Value Obtained..1", 0); } } ARMCI_Barrier(); if (DEBUG)if (me == 0) { printf(" verifying accumulate ..O.K.\n"); } break; default: ARMCI_Error("Invalid Operation", 0); } fflush(stdout); } void test_perf_nb(int dry_run) { int i, j, loop, rc, bytes, elems[2] = {MAXPROC, MAXELEMS}; int stride, k = 0, ntimes; double stime, t1, t2, t3, t4, t5, t6, t7, t8, t9; double *dsrc[MAXPROC], scale = 1.0; armci_hdl_t hdl_get, hdl_put, hdl_acc; create_array(ddst, 2, elems); create_array(dsrc, 1, &elems[1]); if (!dry_run)if (me == 0) { printf("\n\t\t\tRemote 1-D Array Section\n"); printf("section get nbget wait put nbput "); printf(" wait acc nbacc wait\n"); printf("------- -------- -------- -------- -------- --------"); printf(" -------- -------- -------- --------\n"); fflush(stdout); } for (loop = 1; loop <= MAXELEMS; loop *= 2, k++) { elems[1] = loop; ntimes = (int)sqrt((double)(MAXELEMS / elems[1])); if (ntimes < 1) { ntimes = 1; } /* -------------------------- SETUP --------------------------- */ /*initializing non-blocking handles,time,src & dst buffers*/ ARMCI_INIT_HANDLE(&hdl_put); ARMCI_INIT_HANDLE(&hdl_get); ARMCI_INIT_HANDLE(&hdl_acc); t1 = t2 = t3 = t4 = t5 = t6 = t7 = t8 = t9 = 0.0; for (i = 0; i < elems[1]; i++) { dsrc[me][i] = i * 1.001 * (me + 1); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); /* bytes transfered */ bytes = sizeof(double) * elems[1]; ARMCI_Barrier(); /* -------------------------- PUT/GET -------------------------- */ if (me == 0) { for (i = 1; i < nproc; i++) { stime = armci_timer(); for (j = 0; j < ntimes; j++) if ((rc = ARMCI_Put(&dsrc[me][0], &ddst[i][me*elems[1]], bytes, i))) { ARMCI_Error("armci_nbput failed\n", rc); } t1 += armci_timer() - stime; } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(PUT, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); if (me == 0) { for (i = 1; i < nproc; i++) { stime = armci_timer(); for (j = 0; j < ntimes; j++) if ((rc = ARMCI_Get(&dsrc[i][0], &ddst[me][i*elems[1]], bytes, i))) { printf("%d: armci_get. rc=%d\n", me, rc); fflush(stdout); ARMCI_Error("armci_nbget failed\n", rc); } t4 += armci_timer() - stime; } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(GET, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); /* ------------------------ nb PUT/GET ------------------------- */ if (me == 0) { for (i = 1; i < nproc; i++) { for (j = 0; j < ntimes; j++) { stime = armci_timer(); if ((rc = ARMCI_NbPut(&dsrc[me][0], &ddst[i][me*elems[1]], bytes, i, &hdl_put))) { ARMCI_Error("armci_nbput failed\n", rc); } t2 += armci_timer() - stime; stime = armci_timer(); ARMCI_Wait(&hdl_put); t3 += armci_timer() - stime; } } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(PUT, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); if (me == 0) { for (i = 1; i < nproc; i++) { for (j = 0; j < ntimes; j++) { stime = armci_timer(); if ((rc = ARMCI_NbGet(&dsrc[i][0], &ddst[me][i*elems[1]], bytes, i, &hdl_get))) { ARMCI_Error("armci_nbget failed\n", rc); } t5 += armci_timer() - stime; stime = armci_timer(); ARMCI_Wait(&hdl_get); t6 += armci_timer() - stime; } } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(GET, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); /* ------------------------ Accumulate ------------------------- */ for (i = 0; i < elems[1]; i++) { dsrc[me][i] = 1.0; } ARMCI_Barrier(); stride = elems[1] * sizeof(double); scale = 1.0; for (j = 0; j < ntimes; j++) { stime = armci_timer(); if ((rc = ARMCI_AccS(ARMCI_ACC_DBL, &scale, &dsrc[me][0], &stride, &ddst[0][0], &stride, &bytes, 0, 0))) { ARMCI_Error("armci_acc failed\n", rc); } t7 += armci_timer() - stime; ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(ACC, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); } #if PORTALS /* See the note below why this part is disabled */ /* ---------------------- nb-Accumulate ------------------------ */ for (i = 0; i < elems[1]; i++) { dsrc[me][i] = 1.0; } ARMCI_Barrier(); stride = elems[1] * sizeof(double); scale = 1.0; for (j = 0; j < ntimes; j++) { stime = armci_timer(); if ((rc = ARMCI_NbAccS(ARMCI_ACC_DBL, &scale, &dsrc[me][0], &stride, &ddst[0][0], &stride, &bytes, 0, 0, &hdl_acc))) { ARMCI_Error("armci_nbacc failed\n", rc); } t8 += armci_timer() - stime; stime = armci_timer(); ARMCI_Wait(&hdl_acc); t9 += armci_timer() - stime; ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (VERIFY) { verify_results(ACC, elems); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst[me][i] = 0.0; } ARMCI_Barrier(); } #endif /* print timings */ if (!dry_run) if (me == 0) printf("%d\t %.2e %.2e %.2e %.2e %.2e %.2e %.2e %.2e %.2e\n", bytes, t4 / ntimes, t5 / ntimes, t6 / ntimes, t1 / ntimes, t2 / ntimes, t3 / ntimes, t7 / ntimes, t8 / ntimes, t9 / ntimes); } ARMCI_AllFence(); ARMCI_Barrier(); if (!dry_run)if (me == 0) { printf("O.K.\n"); fflush(stdout); } destroy_array(ddst); destroy_array(dsrc); } int main(int argc, char *argv[]) { armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); if (nproc < 2 || nproc > MAXPROC) { if (me == 0) fprintf(stderr, "USAGE: 2 <= processes < %d - got %d\n", MAXPROC, nproc); ARMCI_Barrier(); armci_msg_finalize(); exit(0); } if (me == 0) { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } if (me == 0) { printf("\n put/get/acc requests (Time in secs)\n\n"); fflush(stdout); } test_perf_nb(1); test_perf_nb(0); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nSuccess!!\n"); fflush(stdout); } sleep(2); ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } /* NOTE: ARMCI_NbAcc fails in opus for buffer sizes greater than 400Kb */ ga-5-4/armci/testing/origptl.c0000644000175000017500000000251312662210426014426 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #define FORK_BEFORE_NI_INIT #ifndef FORK_BEFORE_NI_INIT #define FORK_AFTER_NI_INIT #endif int main(int argc, char **argv, char **envp) { int ret; int num_interfaces; ptl_handle_ni_t nih; ptl_handle_eq_t eqh; ptl_ni_limits_t ptl_limits; pid_t child; if ((ret = PtlInit(&num_interfaces)) != PTL_OK) { printf("%s: PtlInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlInit succeeds (%d)\n", FUNCTION_NAME, ret); #ifdef FORK_BEFORE_NI_INIT child = fork(); #endif if ((ret = PtlNIInit( IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) { printf("%s: PtlNIInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlNIInit succeeds (%d)\n", FUNCTION_NAME, ret); #ifdef FORK_AFTER_NI_INIT child = fork(); #endif if ((ret = PtlEQAlloc(nih, 4096, NULL, &eqh)) != PTL_OK) { printf("%s: PtlEQAlloc failed: %d(%d)\n", FUNCTION_NAME, ret, child); exit(1); } printf("%s: PtlEQAlloc succeeds (%d:%d)\n", FUNCTION_NAME, child, ret); if (child) { MPI_Init(&argc, &argv); MPI_Finalize(); } } ga-5-4/armci/testing/msgcheck.c0000644000175000017500000001101712662210426014531 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "armci.h" #include "message.h" #define armci_msg_brdcst__ armci_msg_bcast_lapi int me, nproc; #define LOOP 20 void time_gop(double *test, int len) { int i; double t; t = armci_timer(); for (i = 0; i < LOOP; i++) { armci_msg_dgop(test, len, "+"); } t = armci_timer() - t; t /= LOOP; if (me == 0) { printf("Time per gop %f len=%d doubles\n", t, len); fflush(stdout); } } void time_reduce(double *test, int len) { int i; double t; t = armci_timer(); for (i = 0; i < LOOP; i++) { armci_msg_reduce(test, len, "+", ARMCI_DOUBLE); } t = armci_timer() - t; t /= LOOP; if (me == 0) { printf("Time per reduce %f len=%d doubles\n", t, len); fflush(stdout); } } void TestGlobals() { #define MAXLENG 256*1024 double *dtest; int *itest; long *ltest; int len; int ifrom = nproc - 1, lfrom = 1, dfrom = 1; if (me == 0) { printf("Global test ... broadcast and reduction for int, long, double\n----------\n"); fflush(stdout); } if (!(dtest = (double *) malloc((unsigned)(MAXLENG * sizeof(double))))) { ARMCI_Error("TestGlobals: failed to allocated dtest", MAXLENG); } if (!(ltest = (long *) malloc((unsigned)(MAXLENG * sizeof(long))))) { ARMCI_Error("TestGlobals: failed to allocated ltest", MAXLENG); } if (!(itest = (int *) malloc((unsigned)(MAXLENG * sizeof(int))))) { ARMCI_Error("TestGlobals: failed to allocated itest", MAXLENG); } for (len = 1; len < MAXLENG; len *= 2) { int ilen = len * sizeof(int); int dlen = len * sizeof(double); int llen = len * sizeof(long); int i; ifrom = (ifrom + 1) % nproc; lfrom = (lfrom + 1) % nproc; dfrom = (lfrom + 1) % nproc; #if 0 printf("%d:ifrom=%d lfrom=%d dfrom=%d\n", me, ifrom, lfrom, dfrom); fflush(stdout); #endif if (me == 0) { printf("Test length = %d ... ", len); fflush(stdout); } if (me == ifrom)for (i = 0; i < len; i++) { itest[i] = i; } else for (i = 0; i < len; i++) { itest[i] = 0; } if (me == lfrom)for (i = 0; i < len; i++) { ltest[i] = (long)i; } else for (i = 0; i < len; i++) { ltest[i] = 0L; } if (me == dfrom)for (i = 0; i < len; i++) { dtest[i] = (double)i; } else for (i = 0; i < len; i++) { dtest[i] = 0.0; } /* Test broadcast */ armci_msg_brdcst(itest, ilen, ifrom); armci_msg_brdcst(ltest, llen, lfrom); armci_msg_brdcst(dtest, dlen, dfrom); for (i = 0; i < len; i++) { if (itest[i] != i) { printf("int broadcast failed %d", itest[i]); ARMCI_Error("int broadcast failed %d", itest[i]); } if (ltest[i] != (long)i) { printf("long broadcast failed %ld", ltest[i]); ARMCI_Error("long broadcast failed %ld", ltest[i]); } if (dtest[i] != (double)i) { printf("double broadcast failed %f", dtest[i]); ARMCI_Error("double broadcast failed %f", dtest[i]); } } if (me == 0) { printf("broadcast OK ..."); fflush(stdout); } /* Test global sum */ for (i = 0; i < len; i++) { itest[i] = i * me; ltest[i] = (long) itest[i]; dtest[i] = (double) itest[i]; } armci_msg_igop(itest, len, "+"); armci_msg_lgop(ltest, len, "+"); armci_msg_dgop(dtest, len, "+"); for (i = 0; i < len; i++) { int iresult = i * nproc * (nproc - 1) / 2; if (itest[i] != iresult || ltest[i] != (long)iresult || dtest[i] != (double) iresult) { ARMCI_Error("TestGlobals: global sum failed", (int) i); } } if (me == 0) { printf("global sums OK\n"); fflush(stdout); } } /* now we get timing data */ time_gop(dtest, MAXLENG); time_reduce(dtest, MAXLENG); free((char *) itest); free((char *) ltest); free((char *) dtest); } int main(int argc, char **argv) { armci_msg_init(&argc, &argv); /* initialize ARMCI */ ARMCI_Init_args(&argc, &argv); me = armci_msg_me(); nproc = armci_msg_nproc(); if (nproc < 2) { if (me == 0) fprintf(stderr, "USAGE: 2 <= processes < %d\n", nproc); ARMCI_Barrier(); armci_msg_finalize(); exit(0); } if (me == 0) { printf("Test of ARMCI Wrappers to Basic Message Passing Operations\n"); fflush(stdout); } ARMCI_Barrier(); TestGlobals(); /* done */ ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/shmtest.c0000644000175000017500000000501712662210426014437 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmtest.c,v 1.6 2003-10-22 22:12:21 d3h325 Exp $ */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SHM_H # include #endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #ifdef SUN char *shmat(); #endif int armci_test_allocate(long size) { char *ptr; long id = (long)shmget(IPC_PRIVATE, (size_t) size, (int)(IPC_CREAT | 00600)); if (id < 0L) { return 0; } #if 0 /* attach to segment */ ptr = shmat((int) id, (char *) NULL, 0); #else ptr = (char *) NULL; #endif /* delete segment id */ if (shmctl((int) id, IPC_RMID, (struct shmid_ds *)NULL)) { fprintf(stderr, "failed to remove shm id=%ld\n", id); } /* test pointer */ if (((long)ptr) == -1L) { return 0; } else { return 1; } } /* parameters that define range and granularity of search for shm segment size * UBOUND is chosen to be < 2GB to avoid overflowing on 32-bit systems * smaller PAGE gives more accurate results but with more search steps * LBOUND is set to amount that is considered insufficient for our purposes */ #define PAGE 131072L #define UBOUND 2*4096*PAGE #define LBOUND 4*PAGE int verbose = 1; /*\ determine the max shmem segment size using bisection \*/ void armci_shmem_init() { long x, i, y = 0L; long upper_bound = UBOUND; long lower_bound = 0; x = upper_bound; for (i = 1;; i++) { long step; int rc = armci_test_allocate(x); if (rc) { if (verbose) { printf("test %ld size=%ld bytes: success\n", i, x); } y = lower_bound = x; step = (upper_bound - x) >> 1; if (step < 16 * PAGE) { break; } x += step; } else { if (verbose) { printf("test %ld size=%ld bytes: failed\n", i, x); } upper_bound = x; step = (x - lower_bound) >> 1; if (step < PAGE || x < LBOUND) { break; } x -= step; } } if (verbose) { if (x < LBOUND) { printf("no usable amount (%ld bytes) of shared memory available\n", LBOUND); } else { printf("%ld bytes segment size, %ld calls \n", y, i); } } else { printf("%ld\n", y); } } int main(int argc, char **argv) { if (argc > 1) { verbose = 0; } if (verbose) { printf("Searching for max shared memory segment size (SHMMAX) using bisection\n"); } armci_shmem_init(); return 0; } ga-5-4/armci/testing/test2.c0000644000175000017500000010272112662210426014011 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: test2.c,v 1.1.4.1 2007-05-29 19:36:23 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif //#define ARMCI_INT -99 //#define ARMCI_LONG -101 //#define ARMCI_FLOAT -306 //#define ARMCI_DOUBLE -307 #define FLOAT_EPS ((float) 1.0 / 4096) #define DOUBLE_EPS ((double) 1.0 / 16384) #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 1024 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif typedef struct { float real; float imag; } cmpl_t; typedef struct { double real; double imag; } dcmpl_t; /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) if ((np = atoi(argv[1])) < 1) { goto usage; } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif void create_array(void *a[], int elem_size, int ndim, int dims[]) { int bytes = elem_size, i, rc; assert(ndim <= MAXDIMS); for (i = 0; i < ndim; i++) { bytes *= dims[i]; } rc = ARMCI_Malloc(a, bytes); assert(rc == 0); assert(a[me]); } void destroy_array(void *ptr[]) { ARMCI_Barrier(); assert(!ARMCI_Free(ptr[me])); } int loA[MAXDIMS], hiA[MAXDIMS]; int dimsA[MAXDIMS] = {DIM1, DIM2, DIM3, DIM4, DIM5, DIM6, DIM7}; int loB[MAXDIMS], hiB[MAXDIMS]; int dimsB[MAXDIMS] = {EDIM1, EDIM2, EDIM3, EDIM4, EDIM5, EDIM6, EDIM7}; int count[MAXDIMS]; int strideA[MAXDIMS], strideB[MAXDIMS]; int loC[MAXDIMS], hiC[MAXDIMS]; int idx[MAXDIMS] = {0, 0, 0, 0, 0, 0, 0}; void test_brdcst(int datatype) { void *a[6]; int len[6] = {1, 10, 100, 1000, 10000, 100000}; int datatype_size = 0; int i, j; switch (datatype) { case ARMCI_INT: datatype_size = sizeof(int); for (i = 0; i < 6; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < 6; i++) if (me == 0) for (j = 0; j < len[i]; j++) { ((int *) a[i])[j] = (int) j; } else { memset(a[i], 0x0, len[i] * datatype_size); } break; case ARMCI_LONG: datatype_size = sizeof(long); for (i = 0; i < 6; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < 6; i++) if (me == 0) for (j = 0; j < len[i]; j++) { ((long *) a[i])[j] = (long) j; } else { memset(a[i], 0x0, len[i] * datatype_size); } break; case ARMCI_FLOAT: datatype_size = sizeof(float); for (i = 0; i < 6; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < 6; i++) if (me == 0) for (j = 0; j < len[i]; j++) { ((float *) a[i])[j] = (float) j; } else { memset(a[i], 0x0, len[i] * datatype_size); } break; case ARMCI_DOUBLE: datatype_size = sizeof(double); for (i = 0; i < 6; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < 6; i++) if (me == 0) for (j = 0; j < len[i]; j++) { ((double *) a[i])[j] = (double) j; } else { memset(a[i], 0x0, len[i] * datatype_size); } break; default: break; } for (i = 0; i < 6; i++) { armci_msg_brdcst(a[i], len[i] * datatype_size, 0); } switch (datatype) { case ARMCI_INT: for (i = 0; i < 6; i++) for (j = 0; j < len[i]; j++) if (((int *) a[i])[j] != (int) j) { printf("ERROR a[%d][%d] = %d != %d\n", i, j, ((int *) a[i])[j], (int) j); ARMCI_Error("armci_brdcst failed (int)\n", 0); } break; case ARMCI_LONG: for (i = 0; i < 6; i++) for (j = 0; j < len[i]; j++) if (((long *) a[i])[j] != (long) j) { printf("ERROR a[%d][%d] = %ld != %ld\n", i, j, ((long *) a[i])[j], (long) j); ARMCI_Error("armci_brdcst failed (long)\n", 0); } break; case ARMCI_FLOAT: for (i = 0; i < 6; i++) for (j = 0; j < len[i]; j++) if (((float *) a[i])[j] != (float) j) { printf("ERROR a[%d][%d] = %f != %f\n", i, j, ((float *) a[i])[j], (float) j); ARMCI_Error("armci_brdcst failed (float)\n", 0); } break; case ARMCI_DOUBLE: for (i = 0; i < 6; i++) for (j = 0; j < len[i]; j++) if (((double *) a[i])[j] != (double) j) { printf("ERROR a[%d][%d] = %f != %f\n", i, j, ((double *) a[i])[j], (double) j); ARMCI_Error("armci_brdcst failed (double)\n", 0); } break; default: break; } for (i = 0; i < 6; i++) { free(a[i]); } } void test_gop2_or_reduce(const int datatype, char *op, const int reduce_test) { void *a[6]; int len[6] = {1, 10, 100, 1000, 10000, 100000}; int len_length = 3; int datatype_size = 0; int i, j; char *test_type; int verbose = 0; if (reduce_test == 0) { test_type = "gop2"; } else { test_type = "reduce"; } switch (datatype) { case ARMCI_INT: datatype_size = sizeof(int); for (i = 0; i < len_length; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < len_length; i++) for (j = 0; j < len[i]; j++) { ((int *) a[i])[j] = (int)(me + j) * (((me + j) % 2 == 0) ? 1 : -1); } for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("testing %s %s message size = %d op = %s\n", test_type, "ARMCI_INT", len[i], op); } if (reduce_test == 0) { armci_msg_igop(a[i], len[i], op); } else { armci_msg_reduce(a[i], len[i], op, datatype); } } if (me == 0 || reduce_test == 0) for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("checking %s %s message size = %d op = %s\n", test_type, "ARMCI_INT", len[i], op); } for (j = 0; j < len[i]; j++) if (strncmp(op, "+", 1) == 0) { int compare = 0; if (nproc % 2 == 0) { if (j % 2 == 0) { compare = -nproc / 2; } else { compare = nproc / 2; } } else { if (j % 2 == 0) { compare = j + nproc / 2; } else { compare = -(j + nproc / 2); } } if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "*", 1) == 0) { int compare = 1; int k = 0; for (k = 0; k < nproc; k++) { compare *= (k + j) * (((k + j) % 2 == 0) ? 1 : -1); } if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "min", 3) == 0) { int compare = -(j + nproc - 1); if (compare % 2 == 0 && nproc > 1) { compare = -(j + nproc - 2); } if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "max", 3) == 0) { int compare = j + nproc - 1; if (compare % 2 != 0 && nproc > 1) { compare = j + nproc - 2; } if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmax", 6) == 0) { int compare = j + nproc - 1; if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmin", 6) == 0) { int compare = j; if (((int *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %d != %d\n", test_type, "ARMCI_INT", op, i, j, ((int *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "or", 2) == 0) { } } break; case ARMCI_LONG: datatype_size = sizeof(long); for (i = 0; i < len_length; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < len_length; i++) for (j = 0; j < len[i]; j++) { ((long *) a[i])[j] = (long)(me + j) * (((me + j) % 2 == 0) ? 1 : -1); } for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("testing %s %s message size = %d op = %s\n", test_type, "ARMCI_LONG", len[i], op); } if (reduce_test == 0) { armci_msg_lgop(a[i], len[i], op); } else { armci_msg_reduce(a[i], len[i], op, datatype); } } if (me == 0 || reduce_test == 0) for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("checking %s %s message size = %d op = %s\n", test_type, "ARMCI_LONG", len[i], op); } for (j = 0; j < len[i]; j++) if (strncmp(op, "+", 1) == 0) { int compare = 0; if (nproc % 2 == 0) { if (j % 2 == 0) { compare = -nproc / 2; } else { compare = nproc / 2; } } else { if (j % 2 == 0) { compare = j + nproc / 2; } else { compare = -(j + nproc / 2); } } if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "*", 1) == 0) { int compare = 1; int k = 0; for (k = 0; k < nproc; k++) { compare *= (k + j) * (((k + j) % 2 == 0) ? 1 : -1); } if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "min", 3) == 0) { int compare = -(j + nproc - 1); if (compare % 2 == 0 && nproc > 1) { compare = -(j + nproc - 2); } if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "max", 3) == 0) { int compare = j + nproc - 1; if (compare % 2 != 0 && nproc > 1) { compare = j + nproc - 2; } if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmax", 6) == 0) { int compare = j + nproc - 1; if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmin", 6) == 0) { int compare = j; if (((long *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %ld != %d\n", test_type, "ARMCI_LONG", op, i, j, ((long *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "or", 2) == 0) { } } break; case ARMCI_FLOAT: datatype_size = sizeof(float); for (i = 0; i < len_length; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < len_length; i++) for (j = 0; j < len[i]; j++) { ((float *) a[i])[j] = (float)(me + j) * (((me + j) % 2 == 0) ? 1.0 / nproc : -1.0 / nproc); } for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("testing %s ARMCI_FLOAT message size = %d op = %s\n", test_type, len[i], op); } if (reduce_test == 0) { armci_msg_fgop(a[i], len[i], op); } else { armci_msg_reduce(a[i], len[i], op, datatype); } } if (me == 0 || reduce_test == 0) for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("checking %s ARMCI_FLOAT message size = %d op = %s\n", test_type, len[i], op); } for (j = 0; j < len[i]; j++) if (strncmp(op, "+", 1) == 0) { float compare = 0.0; if (nproc % 2 == 0) { if (j % 2 == 0) { compare = -(((int)nproc / 2) / (float) nproc); } else { compare = ((int)nproc / 2) / (float) nproc; } } else { if (j % 2 == 0) { compare = ((int) j + nproc / 2) / (float) nproc; } else { compare = -(((int) j + nproc / 2) / (float) nproc); } } if (ARMCI_ABS(((float *) a[i])[j] - compare) > ARMCI_ABS(compare) * FLOAT_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "*", 1) == 0) { float compare = 1.0; int k = 0; for (k = 0; k < nproc; k++) { compare *= ((float) k + j) / (float) nproc; } if ((nproc / 2) % 2 != 0) if (nproc % 2 != 0) if (j % 2 == 0) { compare *= -1.0; } if (ARMCI_ABS(((float *) a[i])[j] - compare) > ARMCI_ABS(compare) * FLOAT_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "min", 3) == 0) { float compare = -((float) j + nproc - 1) / nproc; if ((j + nproc - 1) % 2 == 0 && nproc > 1) { compare = -((float) j + nproc - 2) / nproc; } if (((float *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "max", 3) == 0) { float compare = ((float) j + nproc - 1) / nproc; if ((j + nproc - 1) % 2 != 0 && nproc > 1) { compare = ((float) j + nproc - 2) / nproc; } if (((float *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmax", 6) == 0) { float compare = ((float) j + nproc - 1) / nproc; if (((float *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmin", 6) == 0) { float compare = (float) j / nproc; if (((float *) a[i])[j] != compare) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_FLOAT", op, i, j, ((float *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } } break; case ARMCI_DOUBLE: datatype_size = sizeof(double); for (i = 0; i < len_length; i++) { a[i] = malloc(len[i] * datatype_size); } for (i = 0; i < len_length; i++) for (j = 0; j < len[i]; j++) { ((double *) a[i])[j] = (double)(me + j) * (((me + j) % 2 == 0) ? 1.0 / nproc : -1.0 / nproc); } for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("testing %s ARMCI_DOUBLE message size = %d op = %s\n", test_type, len[i], op); } if (reduce_test == 0) { armci_msg_dgop(a[i], len[i], op); } else { armci_msg_reduce(a[i], len[i], op, datatype); } } if (me == 0 || reduce_test == 0) for (i = 0; i < len_length; i++) { if (me == 0 && verbose != 0) { printf("checking %s ARMCI_DOUBLE message size = %d op = %s\n", test_type, len[i], op); } for (j = 0; j < len[i]; j++) if (strncmp(op, "+", 1) == 0) { double compare = 0.0; if (nproc % 2 == 0) { if (j % 2 == 0) { compare = -(((int)nproc / 2) / (double) nproc); } else { compare = ((int)nproc / 2) / (double) nproc; } } else { if (j % 2 == 0) { compare = ((int) j + nproc / 2) / (double) nproc; } else { compare = -(((int) j + nproc / 2) / (double) nproc); } } if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "*", 1) == 0) { double compare = 1.0; int k = 0; for (k = 0; k < nproc; k++) { compare *= ((float) k + j) / (float) nproc; } if ((nproc / 2) % 2 != 0) if (nproc % 2 != 0) if (j % 2 == 0) { compare *= -1.0; } if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "min", 3) == 0) { double compare = -((double) j + nproc - 1) / nproc; if ((j + nproc - 1) % 2 == 0 && nproc > 1) { compare = -((double) j + nproc - 2) / nproc; } if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "max", 3) == 0) { double compare = ((double) j + nproc - 1) / nproc; if ((j + nproc - 1) % 2 != 0 && nproc > 1) { compare = ((double) j + nproc - 2) / nproc; } if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmax", 6) == 0) { double compare = ((double) j + nproc - 1) / nproc; if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } else if (strncmp(op, "absmin", 6) == 0) { double compare = (double) j / nproc; if (ARMCI_ABS(((double *) a[i])[j] - compare) > ARMCI_ABS(compare) * DOUBLE_EPS) { printf("ERROR %s %s %s a[%d][%d] = %f != %f\n", test_type, "ARMCI_DOUBLE", op, i, j, ((double *) a[i])[j], compare); ARMCI_Error("test_gop2_or_reduce failed\n", 0); } } } break; default: break; } for (i = 0; i < len_length; i++) { free(a[i]); } } void test_collective(const int datatype) { char *op[7] = {"+", "*", "min", "max", "absmax", "absmin", "or"}; int i = 0; int num_tests = 7; if (datatype == ARMCI_DOUBLE || datatype == ARMCI_FLOAT) { num_tests = 6; } /* test armci_msg_brdcst */ test_brdcst(datatype); /* test armci_msg_gop2 */ for (i = 0; i < num_tests; i++) { test_gop2_or_reduce(datatype, op[i], 0); } /* test armci_msg_reduce */ for (i = 0; i < num_tests; i++) { test_gop2_or_reduce(datatype, op[i], 1); } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("O.K.\n\n"); fflush(stdout); } } void test_acc_type(const int datatype) { int i = 0; int datatype_size = 0; void *scale; void *a; void *b[MAXPROC]; int elems = ELEMS; int dim = 1; int count = 0; int strideA = 0; int strideB = 0; switch (datatype) { case ARMCI_ACC_INT: datatype_size = sizeof(int); scale = malloc(datatype_size); *((int *) scale) = 1; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((int *) a)[i] = i + me; ((int *) b[me])[i] = 0; } break; case ARMCI_ACC_LNG: datatype_size = sizeof(long); scale = malloc(datatype_size); *((long *) scale) = 1; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((long *) a)[i] = i + me; ((long *) b[me])[i] = 0; } break; case ARMCI_ACC_FLT: datatype_size = sizeof(float); scale = malloc(datatype_size); *((float *) scale) = 1.0; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((float *) a)[i] = (float) i + me; ((float *) b[me])[i] = 0.0; } break; case ARMCI_ACC_DBL: datatype_size = sizeof(double); scale = malloc(datatype_size); *((double *) scale) = 1.0; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((double *) a)[i] = (double) i + me; ((double *) b[me])[i] = 0.0; } break; case ARMCI_ACC_CPL: datatype_size = sizeof(cmpl_t); scale = malloc(datatype_size); ((cmpl_t *) scale)->real = 2.0; ((cmpl_t *) scale)->imag = 1.0; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((cmpl_t *) a)[i].real = ((float) i + me); ((cmpl_t *) a)[i].imag = ((float) i + me); ((cmpl_t *) b[me])[i].real = 0.0; ((cmpl_t *) b[me])[i].imag = 0.0; } break; case ARMCI_ACC_DCP: datatype_size = sizeof(dcmpl_t); scale = malloc(datatype_size); ((dcmpl_t *) scale)->real = 2.0; ((dcmpl_t *) scale)->imag = 1.0; a = malloc(elems * datatype_size); create_array((void **)b, datatype_size, dim, &elems); for (i = 0; i < elems; i++) { ((dcmpl_t *) a)[i].real = ((double) i + me); ((dcmpl_t *) a)[i].imag = ((double) i + me); ((dcmpl_t *) b[me])[i].real = 0.0; ((dcmpl_t *) b[me])[i].imag = 0.0; } break; default: return; break; } count = elems * datatype_size; strideA = elems * datatype_size; strideB = elems * datatype_size; ARMCI_AllFence(); ARMCI_Barrier(); for (i = 0; i < nproc; i++) { ARMCI_AccS(datatype, scale, a, &strideA, b[(me + i) % nproc], &strideB, &count, 0, (me + i) % nproc); } ARMCI_AllFence(); ARMCI_Barrier(); switch (datatype) { case ARMCI_ACC_INT: for (i = 0; i < elems; i++) { int compare = (i * nproc) + nproc / 2 * (nproc - 1); if (((int *)b[me])[i] != compare) { printf("ERROR accumulate ARMCI_ACC_INT [%d] = %d != %d\n", i, ((int *)b[me])[i], compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; case ARMCI_ACC_LNG: for (i = 0; i < elems; i++) { long compare = (i * nproc) + nproc / 2 * (nproc - 1); if (((long *)b[me])[i] != compare) { printf("ERROR accumulate ARMCI_ACC_LNG [%d] = %d != %ld\n", i, ((int *)b[me])[i], compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; case ARMCI_ACC_FLT: for (i = 0; i < elems; i++) { float compare = (float)((i * nproc) + nproc / 2 * (nproc - 1)); if (((float *)b[me])[i] != compare) { printf("ERROR accumulate ARMCI_ACC_FLT [%d] = %f != %f\n", i, ((float *)b[me])[i], compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; case ARMCI_ACC_DBL: for (i = 0; i < elems; i++) { double compare = (double)((i * nproc) + nproc / 2 * (nproc - 1)); if (((double *)b[me])[i] != (double)((i * nproc) + nproc / 2 *(nproc - 1))) { printf("ERROR accumulate ARMCI_ACC_DBL [%d] = %f != %f \n", i, ((double *)b[me])[i], compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; case ARMCI_ACC_CPL: for (i = 0; i < elems; i++) { float compare = (float)((i * nproc) + nproc / 2 * (nproc - 1)); if (((cmpl_t *)b[me])[i].real != compare && ((cmpl_t *)b[me])[i].imag != 3 * compare) { printf("ERROR accumulate ARMCI_ACC_CPL [%d] = %f + %fj != %f + %fj\n", i, ((cmpl_t *)b[me])[i].real, ((cmpl_t *)b[me])[i].imag, compare, 3 * compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; case ARMCI_ACC_DCP: for (i = 0; i < elems; i++) { double compare = (double)((i * nproc) + nproc / 2 * (nproc - 1)); if (((dcmpl_t *)b[me])[i].real != compare && ((dcmpl_t *)b[me])[i].imag != 3 * compare) { printf("ERROR accumulate ARMCI_ACC_DCP [%d] = %f + %fj != %f + %fj\n", i, ((dcmpl_t *)b[me])[i].real, ((dcmpl_t *)b[me])[i].imag, compare, 3 * compare); ARMCI_Error("test_acc_type failed\n", 0); } } break; default: break; } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("O.K.\n\n"); fflush(stdout); } destroy_array((void **)b); free(a); free(scale); } int main(int argc, char *argv[]) { int i; struct timeval start_time[14]; struct timeval stop_time[14]; /* char * test_name[14] = { "dim", "nbdim", "vec_small", "acc", "vector", "vector_acc", "fetch_add", "swap", "rput", "aggregate", "implicit", "memlock", "acc_type", "collective" }; int test_flags[14] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 }; */ char *test_name[2] = { "acc_type", "collective" }; int test_flags[2] = { 1, 1 }; #define TEST_ACC_TYPE 0 #define TEST_COLLECTIVE 1 armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); if (nproc > MAXPROC && me == 0) { ARMCI_Error("Test works for up to %d processors\n", MAXPROC); } if (me == 0) { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } gettimeofday(&start_time[TEST_ACC_TYPE], NULL); if (test_flags[TEST_ACC_TYPE] == 1) { if (me == 0) { printf("\nTesting Accumulate Types\n"); fflush(stdout); } ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_INT\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_INT); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_LNG\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_LNG); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_FLT\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_FLT); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_DBL\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_DBL); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_CPL\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_CPL); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("Test Accumulate ARMCI_ACC_DCP\n"); fflush(stdout); } test_acc_type(ARMCI_ACC_DCP); ARMCI_AllFence(); ARMCI_Barrier(); } gettimeofday(&stop_time[TEST_ACC_TYPE], NULL); gettimeofday(&start_time[TEST_COLLECTIVE], NULL); if (test_flags[TEST_COLLECTIVE] == 1) { if (me == 0) { printf("\nTesting Collective Types\n"); fflush(stdout); } if (me == 0) { printf("Test Collective ARMCI_INT\n"); fflush(stdout); } ARMCI_Barrier(); test_collective(ARMCI_INT); ARMCI_Barrier(); if (me == 0) { printf("Test Collective ARMCI_LONG\n"); fflush(stdout); } ARMCI_Barrier(); test_collective(ARMCI_LONG); ARMCI_Barrier(); if (me == 0) { printf("Test Collective ARMCI_FLOAT\n"); fflush(stdout); } ARMCI_Barrier(); test_collective(ARMCI_FLOAT); ARMCI_Barrier(); if (me == 0) { printf("Test Collective ARMCI_DOUBLE\n"); fflush(stdout); } ARMCI_Barrier(); test_collective(ARMCI_DOUBLE); ARMCI_Barrier(); } gettimeofday(&stop_time[TEST_COLLECTIVE], NULL); if (me == 0) { printf("Accumulate and Collective tests passed\n"); fflush(stdout); } if (me == 0) { printf("Testcase runtime\n"); printf("Name,Time(seconds)\n"); for (i = 0; i < 2; i++) if (test_flags[i] == 1) { double time_spent = (stop_time[i].tv_sec - start_time[i].tv_sec) + ((double) stop_time[i].tv_usec - start_time[i].tv_usec) / 1E6; printf("%s,%.6f\n", test_name[i], time_spent); } } ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/perf_strided.c0000644000175000017500000001043112662210426015416 0ustar mbamba#include #include #include #include #include #include #include "armci.h" static int me; static int nproc; #define PUTS 0 #define GETS 1 #define ACCS 2 #define MAX_MESSAGE_SIZE 1024*1024 #define MEDIUM_MESSAGE_SIZE 8192 #define ITER_SMALL 100 #define ITER_LARGE 10 #define WARMUP 2 static void fill_array(double *arr, int count, int which); static void strided_test(size_t buffer_size, int op); double dclock() { struct timeval tv; gettimeofday(&tv, NULL); return(tv.tv_sec * 1.0e6 + (double)tv.tv_usec); } int main(int argc, char **argv) { armci_msg_init(&argc,&argv); ARMCI_Init_args(&argc, &argv); me = armci_msg_me(); nproc = armci_msg_nproc(); /* This test only works for two processes */ assert(nproc == 2); if (0 == me) { printf("\n\n"); printf("msg size (bytes) avg time (us) avg b/w (MB/sec)\n"); } if (0 == me) { printf("\n\n"); printf("#PNNL armci Put Strided Test\n"); } strided_test(MAX_MESSAGE_SIZE, PUTS); if (0 == me) { printf("\n\n"); printf("#PNNL armci Get Strided Test\n"); } strided_test(MAX_MESSAGE_SIZE, GETS); if (0 == me) { printf("\n\n"); printf("#PNNL armci Accumulate Strided Test\n"); } strided_test(MAX_MESSAGE_SIZE, ACCS); ARMCI_Finalize(); armci_msg_finalize(); return 0; } static void fill_array(double *arr, int count, int which) { int i; for (i = 0; i < count; i++) { arr[i] = i; } } static void strided_test(size_t buffer_size, int op) { void **dst_ptr; void **put_buf; void **get_buf; double *times; dst_ptr = (void*)malloc(nproc * sizeof(void*)); put_buf = (void*)malloc(nproc * sizeof(void*)); get_buf = (void*)malloc(nproc * sizeof(void*)); times = (double*)malloc(nproc * sizeof(double)); ARMCI_Malloc(dst_ptr, buffer_size); ARMCI_Malloc(put_buf, buffer_size); ARMCI_Malloc(get_buf, buffer_size); /* initialize what we're putting */ fill_array((double*)put_buf[me], buffer_size/sizeof(double), me); size_t msg_size; int dst = 1; double scale = 1; /* Information for strided data transfer */ int levels = 1; int count[2]; int stride[1]; size_t xdim, ydim; for (msg_size = 16; msg_size <= buffer_size; msg_size *= 2) { int j; int iter = msg_size > MEDIUM_MESSAGE_SIZE ? ITER_LARGE : ITER_SMALL; for (xdim = 8; xdim <= msg_size; xdim *=2 ) { ydim = msg_size / xdim; count[0] = xdim; count[1] = ydim; stride[0] = xdim; double t_start, t_end; if (0 == me) { for (j= 0; j < iter + WARMUP; ++j) { if (WARMUP == j) { t_start = dclock(); } switch (op) { case PUTS: ARMCI_PutS(put_buf[me], stride, dst_ptr[dst], stride, count, levels, dst); break; case GETS: ARMCI_GetS(dst_ptr[dst], stride, get_buf[me], stride, count, levels, dst); break; case ACCS: ARMCI_AccS(ARMCI_ACC_DBL, (void *)&scale, put_buf[me], stride, dst_ptr[dst], stride, count, levels, dst); break; default: ARMCI_Error("oops", 1); } } } ARMCI_Barrier(); /* calculate total time and average time */ t_end = dclock(); if (0 == me) { printf("%8zu\t\t%6.2f\t\t%6.2f\t\t%zu\t\t%zu\n", msg_size, ((t_end - t_start))/iter, msg_size*(nproc-1)*iter/((t_end - t_start)), xdim, ydim); } } } ARMCI_Free(dst_ptr[me]); ARMCI_Free(put_buf[me]); ARMCI_Free(get_buf[me]); free(dst_ptr); free(put_buf); free(get_buf); free(times); } ga-5-4/armci/testing/perf_aggr.c0000644000175000017500000002337512662210426014713 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: perf_aggr.c,v 1.7 2004-07-21 00:23:06 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) if ((np = atoi(argv[1])) < 1) { goto usage; } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif /*void create_array(void *a[], int elem_size, int ndim, int dims[])*/ void create_array(double *a[], int ndim, int dims[]) { int bytes = sizeof(double), i, rc; assert(ndim <= MAXDIMS); for (i = 0; i < ndim; i++) { bytes *= dims[i]; } rc = ARMCI_Malloc((void **)a, bytes); assert(rc == 0); assert(a[me]); } /*void destroy_array(void *ptr[])*/ void destroy_array(double *ptr[]) { ARMCI_Barrier(); assert(!ARMCI_Free(ptr[me])); } #define MAXELEMS 1000 #define MAX_REQUESTS MAXELEMS void test_aggregate(int dryrun) { int i, j, rc, bytes, elems[2] = {MAXPROC, MAXELEMS}; double *ddst_put[MAXPROC]; double *ddst_get[MAXPROC]; double *dsrc[MAXPROC]; armci_hdl_t aggr_hdl_put[MAXPROC]; armci_hdl_t aggr_hdl_get[MAXPROC]; armci_hdl_t hdl_put[MAXELEMS]; armci_hdl_t hdl_get[MAXELEMS]; armci_giov_t darr; void *src_ptr[MAX_REQUESTS], *dst_ptr[MAX_REQUESTS]; int start = 0, end = 0; double start_time; create_array(ddst_put, 2, elems); create_array(ddst_get, 2, elems); create_array(dsrc, 1, &elems[1]); for (i = 0; i < elems[1]; i++) { dsrc[me][i] = i * 1.001 * (me + 1); } for (i = 0; i < elems[0]*elems[1]; i++) { ddst_put[me][i] = 0.0; ddst_get[me][i] = 0.0; } ARMCI_Barrier(); /* only proc 0 does the work */ if (me == 0) { if (!dryrun) { printf("Transferring %d doubles (Not an array of %d doubles)\n", MAXELEMS, MAXELEMS); } /* initializing non-blocking handles */ for (i = 0; i < elems[1]; i++) { ARMCI_INIT_HANDLE(&hdl_put[i]); } for (i = 0; i < elems[1]; i++) { ARMCI_INIT_HANDLE(&hdl_get[i]); } /* aggregate handles */ for (i = 0; i < nproc; i++) { ARMCI_INIT_HANDLE(&aggr_hdl_put[i]); } for (i = 0; i < nproc; i++) { ARMCI_INIT_HANDLE(&aggr_hdl_get[i]); } for (i = 0; i < nproc; i++) { ARMCI_SET_AGGREGATE_HANDLE(&aggr_hdl_put[i]); } for (i = 0; i < nproc; i++) { ARMCI_SET_AGGREGATE_HANDLE(&aggr_hdl_get[i]); } bytes = sizeof(double); /* **************** PUT **************** */ /* register put */ start_time = armci_timer(); start = 0; end = elems[1]; for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { ARMCI_NbPutValueDouble(dsrc[me][j], &ddst_put[i][me*elems[1] + j], i, &hdl_put[j]); } for (j = start; j < end; j++) { ARMCI_Wait(&hdl_put[j]); } } if (!dryrun) { printf("%d: Value Put time = %.2es\n", me, armci_timer() - start_time); } /* vector put */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { src_ptr[j] = (void *)&dsrc[me][j]; dst_ptr[j] = (void *)&ddst_put[i][me*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = sizeof(double); darr.ptr_array_len = elems[1]; if ((rc = ARMCI_NbPutV(&darr, 1, i, &hdl_put[i]))) { ARMCI_Error("armci_nbputv failed\n", rc); } } for (i = 1; i < nproc; i++) { ARMCI_Wait(&hdl_put[i]); } if (!dryrun) { printf("%d: Vector Put time = %.2es\n", me, armci_timer() - start_time); } /* regular put */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { if ((rc = ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1] + j], bytes, i, &hdl_put[j]))) { ARMCI_Error("armci_nbput failed\n", rc); } } for (j = start; j < end; j++) { ARMCI_Wait(&hdl_put[j]); } } if (!dryrun) { printf("%d: Regular Put time = %.2es\n", me, armci_timer() - start_time); } /* aggregate put */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { if ((rc = ARMCI_NbPut(&dsrc[me][j], &ddst_put[i][me*elems[1] + j], bytes, i, &aggr_hdl_put[i]))) { ARMCI_Error("armci_nbput failed\n", rc); } } } for (i = 1; i < nproc; i++) { ARMCI_Wait(&aggr_hdl_put[i]); } if (!dryrun) { printf("%d: Aggregate Put time = %.2es\n\n", me, armci_timer() - start_time); } /* **************** GET **************** */ /* vector get */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { src_ptr[j] = (void *)&dsrc[i][j]; dst_ptr[j] = (void *)&ddst_get[me][i*elems[1] + j]; } darr.src_ptr_array = src_ptr; darr.dst_ptr_array = dst_ptr; darr.bytes = sizeof(double); darr.ptr_array_len = elems[1]; if ((rc = ARMCI_NbGetV(&darr, 1, i, &hdl_get[i]))) { ARMCI_Error("armci_nbgetv failed\n", rc); } ARMCI_Wait(&hdl_get[i]); } if (!dryrun) { printf("%d: Vector Get time = %.2es\n", me, armci_timer() - start_time); } /* regular get */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { if ((rc = ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1] + j], bytes, i, &hdl_get[j]))) { ARMCI_Error("armci_nbget failed\n", rc); } } for (j = start; j < end; j++) { ARMCI_Wait(&hdl_get[j]); } } if (!dryrun) { printf("%d: Regular Get time = %.2es\n", me, armci_timer() - start_time); } /* aggregate get */ start_time = armci_timer(); for (i = 1; i < nproc; i++) { for (j = start; j < end; j++) { ARMCI_NbGet(&dsrc[i][j], &ddst_get[me][i*elems[1] + j], bytes, i, &aggr_hdl_get[i]); } } for (i = 1; i < nproc; i++) { ARMCI_Wait(&aggr_hdl_get[i]); } if (!dryrun) { printf("%d: Aggregate Get time = %.2es\n", me, armci_timer() - start_time); } } ARMCI_Barrier(); ARMCI_AllFence(); ARMCI_Barrier(); /* Verify */ if (!(me == 0)) for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_put[me][j] - j * 1.001) > 0.1) { ARMCI_Error("aggregate put failed...1", 0); } } ARMCI_Barrier(); if (!dryrun)if (me == 0) { printf("\n aggregate put ..O.K.\n"); } fflush(stdout); if (me == 0) { for (i = 1; i < nproc; i++) { for (j = 0; j < elems[1]; j++) { if (ARMCI_ABS(ddst_get[me][i*elems[1] + j] - j * 1.001 *(i + 1)) > 0.1) { ARMCI_Error("aggregate get failed...1", 0); } } } } ARMCI_Barrier(); if (!dryrun)if (me == 0) { printf(" aggregate get ..O.K.\n"); } fflush(stdout); ARMCI_AllFence(); ARMCI_Barrier(); if (!dryrun)if (me == 0) { printf("O.K.\n"); fflush(stdout); } destroy_array(ddst_put); destroy_array(ddst_get); destroy_array(dsrc); } int main(int argc, char *argv[]) { armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); /* printf("nproc = %d, me = %d\n", nproc, me);*/ if (nproc > MAXPROC && me == 0) { ARMCI_Error("Test works for up to %d processors\n", MAXPROC); } if (me == 0) { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } if (me == 0) { printf("\nAggregate put/get requests\n\n"); fflush(stdout); } test_aggregate(1); /* cold start */ test_aggregate(0); /* warm start */ ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\nSuccess!!\n"); fflush(stdout); } sleep(2); ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/rpl_armci_msg_init.c0000644000175000017500000000050612662210426016607 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include void armci_msg_init(int *argc, char ***argv) { int flag=0; MPI_Initialized(&flag); if (!flag) { #if 0 int provided; MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); #else MPI_Init(argc, argv); # endif } } ga-5-4/armci/testing/gpctest.c0000644000175000017500000000722412662210426014423 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: gpctest.c,v 1.2.4.1 2007-06-13 00:44:01 vinod Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_UNISTD_H # include #endif /*#define RMW*/ #include "armci.h" #include "gpc.h" #include "message.h" #define MAXPROC 128 # define ELEMS 200 #define LOOP 100 /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ int hswap = 0; void gpc_swap(int *loc, int *rem, int p) { gpc_hdl_t nbh; char rheader[100]; int hlen, rhlen, rhsize; int rdsize; void *header = rem; extern int hswap; hlen = sizeof(header); bzero(rheader, 100); rhlen = hlen; ARMCI_Gpc_init_handle(&nbh); if (ARMCI_Gpc_exec(hswap, p, &header, hlen, loc, sizeof(int), rheader, rhlen, loc, sizeof(int), NULL/*&nbh*/)) { fprintf(stderr, "ARMCI_Gpc_exec failed\n"); } /*ARMCI_Gpc_wait(&nbh);*/ } int gpc_swap_handler(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { int *rem; int tmp_swap; #ifdef DEBUG_ printf("executing swap handler from=%d to=%d\n"); fflush(stdout); #endif rem = (int *)ARMCI_Gpc_translate(*(void **)hdr, to, from); ARMCI_Gpc_lock(to); tmp_swap = *rem; *rem = *(int *)data; ARMCI_Gpc_unlock(to); *(int *)rdata = tmp_swap; *(int *)rhdr = tmp_swap; /* 2nd copy just for debug purposes */ *rhsize = sizeof(void *); *rdsize = sizeof(int); return GPC_DONE; } #define LOCKED -1 void test_swap() { int rc, bytes, i, val, whatever = -8999; int *arr[MAXPROC]; /* shared variable is located on processor 0 */ bytes = me == 0 ? sizeof(int) : 0; rc = ARMCI_Malloc((void **)arr, bytes); if (rc != 0) { ARMCI_Error("test_swap: ARMCI_Malloc failed", 0); } ARMCI_Barrier(); hswap = ARMCI_Gpc_register(gpc_swap_handler); if (me == 0) { *arr[0] = 0; /* initialization */ } ARMCI_Barrier(); for (i = 0; i < LOOP; i++) { val = LOCKED; do { #ifdef RMW rc = ARMCI_Rmw(ARMCI_SWAP, &val, arr[0], whatever, 0); if (rc != 0) { ARMCI_Error("test_swap: ARMCI_Rmw failed", 0); } #else gpc_swap(&val, arr[0], 0); #endif } while (val == LOCKED); val++; #ifdef RMW rc = ARMCI_Rmw(ARMCI_SWAP, &val, arr[0], whatever, 0); if (rc != 0) { ARMCI_Error("test_swap: ARMCI_Malloc failed", 0); } #else gpc_swap(&val, arr[0], 0); #endif } ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("The final value is %d, should be %d.\n\n", *arr[0], LOOP * nproc); fflush(stdout); if (*arr[0] != LOOP * nproc) { ARMCI_Error("failed ...", *arr[0]); } } ARMCI_Free(arr[me]); } int main(int argc, char *argv[]) { int ndim; armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); if (nproc > MAXPROC && me == 0) { ARMCI_Error("Test works for up to %d processors\n", MAXPROC); } if (me == 0) { printf("ARMCI Global Procedure Call test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } if (me == 0) { #ifdef RMW printf("\nTesting atomic swap using ARMCI_Rmw\n"); #else printf("\nTesting atomic swap using GPC\n"); #endif fflush(stdout); } ARMCI_Barrier(); test_swap(); ARMCI_AllFence(); ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/perf2.c0000644000175000017500000000712612662210426013771 0ustar mbamba#include #include #include #include #include #include "armci.h" static int me; static int nproc; #define PUT 0 #define GET 1 #define ACC 2 #define MAX_MESSAGE_SIZE 1024*1024 #define MEDIUM_MESSAGE_SIZE 8192 #define ITER_SMALL 100 #define ITER_LARGE 100 #define WARMUP 10 static void fill_array(double *arr, int count, int which); static void contig_test(size_t buffer_size, int op); double dclock() { struct timeval tv; gettimeofday(&tv, NULL); return(tv.tv_sec * 1.0e6 + (double)tv.tv_usec); } int main(int argc, char **argv) { armci_msg_init(&argc,&argv); ARMCI_Init_args(&argc, &argv); me = armci_msg_me(); nproc = armci_msg_nproc(); /* This test only works for two processes */ assert(nproc == 2); if (0 == me) { printf("msg size (bytes) avg time (us) avg b/w (MB/sec)\n"); } if (0 == me) { printf("#PNNL comex Put Test\n"); } contig_test(MAX_MESSAGE_SIZE, PUT); if (0 == me) { printf("#PNNL comex Get Test\n"); } contig_test(MAX_MESSAGE_SIZE, GET); if (0 == me) { printf("#PNNL comex Accumulate Test\n"); } contig_test(MAX_MESSAGE_SIZE, ACC); ARMCI_Finalize(); armci_msg_finalize(); return 0; } static void fill_array(double *arr, int count, int which) { int i; for (i = 0; i < count; i++) { arr[i] = i * 8.23 + which * 2.89; } } static void contig_test(size_t buffer_size, int op) { void **dst_ptr; void **put_buf; void **get_buf; double *times; dst_ptr = (void*)malloc(nproc * sizeof(void*)); put_buf = (void*)malloc(nproc * sizeof(void*)); get_buf = (void*)malloc(nproc * sizeof(void*)); times = (double*)malloc(nproc * sizeof(double)); ARMCI_Malloc(dst_ptr, buffer_size); ARMCI_Malloc(put_buf, buffer_size); ARMCI_Malloc(get_buf, buffer_size); /* initialize what we're putting */ fill_array((double*)put_buf[me], buffer_size/sizeof(double), me); size_t msg_size; int dst = 1; double scale = 1.0; for (msg_size = 16; msg_size <= buffer_size; msg_size *= 2) { int j; int iter = msg_size > MEDIUM_MESSAGE_SIZE ? ITER_LARGE : ITER_SMALL; double t_start, t_end; if (0 == me) { for (j= 0; j < iter + WARMUP; ++j) { if (WARMUP == j) { t_start = dclock(); } switch (op) { case PUT: ARMCI_Put(put_buf[me], dst_ptr[dst], msg_size, dst); break; case GET: ARMCI_Get(dst_ptr[dst], get_buf[me], msg_size, dst); break; case ACC: ARMCI_Acc(ARMCI_ACC_DBL, &scale, put_buf[me], dst_ptr[dst], msg_size, dst); break; default: ARMCI_Error("oops", 1); } } } /* calculate total time and average time */ t_end = dclock(); ARMCI_Barrier(); if (0 == me) { printf("%8zu\t\t%6.2f\t\t%10.2f\n", msg_size, ((t_end - t_start))/iter, msg_size*iter/((t_end - t_start))); } } ARMCI_Free(dst_ptr[me]); ARMCI_Free(put_buf[me]); ARMCI_Free(get_buf[me]); free(dst_ptr); free(put_buf); free(get_buf); free(times); } ga-5-4/armci/testing/simplelock.c0000644000175000017500000000230512662210426015107 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #include "armci.h" #include "message.h" int me, nproc; extern void armcill_lock(int, int); extern void armcill_unlock(int, int); void test_lock() { int i, mut; if (me == 0) { printf("\n"); } for (mut = 0; mut < 16; mut++) for (i = 0; i < nproc; i++) { #if FIXME_THESE_ARE_NOT_DEFINED_FOR_PORTALS armcill_lock(mut, i); armcill_unlock(mut, i); #endif ARMCI_Barrier(); if (me == 0) { printf("."); fflush(stdout); } ARMCI_Barrier(); } } int main(int argc, char *argv[]) { armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); if (me == 0) { printf("ARMCI test program for lock(%d processes)\n", nproc); fflush(stdout); sleep(1); } test_lock(); ARMCI_Barrier(); if (me == 0) { printf("test passed\n"); fflush(stdout); } sleep(2); ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/timer.h0000644000175000017500000000401612662210426014073 0ustar mbamba#ifndef ARMCI_TESTING_TIMER_H_ #define ARMCI_TESTING_TIMER_H_ #if (defined(__i386__) || defined(__x86_64__) || defined(__powerpc__)) && !defined(_CRAYC) # define HAVE_RDTSC 1 # if defined(__i386__) static __inline__ unsigned long long rdtsc(void) { unsigned long long int x; __asm__ volatile(".byte 0x0f, 0x31" : "=A"(x)); return x; } # elif defined(__x86_64__) static __inline__ unsigned long long rdtsc(void) { unsigned hi, lo; __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); return ((unsigned long long)lo) | (((unsigned long long)hi) << 32); } # elif defined(__powerpc__) static __inline__ unsigned long long rdtsc(void) { unsigned long long int result = 0; unsigned long int upper, lower, tmp; __asm__ volatile( "0: \n" "\tmftbu %0 \n" "\tmftb %1 \n" "\tmftbu %2 \n" "\tcmpw %2,%0 \n" "\tbne 0b \n" : "=r"(upper), "=r"(lower), "=r"(tmp) ); result = upper; result = result << 32; result = result | lower; return(result); } # endif #elif HAVE_SYS_TIME_H # include #elif HAVE_WINDOWS_H # include static LARGE_INTEGER frequency; #endif static unsigned long long timer_start() { #if HAVE_RDTSC return rdtsc(); #elif HAVE_SYS_TIME_H struct timeval timer; (void)gettimeofday(&timer, NULL); return timer.tv_sec * 1000000 + timer.tv_usec; #elif HAVE_WINDOWS_H LARGE_INTEGER timer; QueryPerformanceCounter(&timer); return timer.QuadPart * 1000 / frequency.QuadPart; #else return 0; #endif } static unsigned long long timer_end(unsigned long long begin) { return timer_start() - begin; } static void timer_init() { #if HAVE_RDTSC #elif HAVE_SYS_TIME_H #elif HAVE_WINDOWS_H QueryPerformanceFrequency(&frequency); #else #endif } static const char *timer_name() { #if HAVE_RDTSC return "rdtsc"; #elif HAVE_SYS_TIME_H return "gettimeofday"; #elif HAVE_WINDOWS_H return "windows QueryPerformanceCounter"; #else return "no timers"; #endif } #endif /* ARMCI_TESTING_TIMER_H_ */ ga-5-4/armci/testing/fttest.c0000644000175000017500000000533212662210426014261 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ASSERT_H # include #endif #include "armci.h" #include "message.h" #define MAXPROCS 128 #define SIZE_ 1024 #define FAILURE_SIZE_ 512 int me, nproc; double *ptr_arr[MAXPROCS]; long size; void do_work(int sz) { int i; static int d = 1; for (i = 0; i < sz; i++) { *((double *)(ptr_arr[me]) + i) = i + 1.12 * d++; } } static double time_array[100], time_array1[100], t1; int main(int argc, char *argv[]) { int rc, i, j = 0, rid, ret; armci_ckpt_ds_t ckptds; ARMCI_Group grp; armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); if (me == 0) { if (nproc > MAXPROCS) { ARMCI_Error("nproc > MAXPROCS", nproc); } else { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } } armci_init_checkpoint2(); ARMCI_Group_get_world(&grp); size = SIZE_; rc = ARMCI_Malloc((void **)ptr_arr, size * 8); printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); for (size = 1; size <= SIZE_; size *= 2) { t1 = MPI_Wtime(); for (i = 0; i < 5; i++) { for (rc = 0; rc < 15; rc++) { do_work(size); } } time_array[j++] = MPI_Wtime() - t1; ARMCI_Barrier(); printf("%d:done for size %ld\n", me, size); fflush(stdout); } (void)ARMCI_Ckpt_create_ds(&ckptds, 1); ckptds.ptr_arr[0] = ptr_arr[me]; ckptds.sz[0] = SIZE_ * 8; rid = ARMCI_Ckpt_init(NULL, &grp, 1, 0, &ckptds); printf("%d: After ARMCI_Ckpt_init(): \n", me); j = 0; for (size = 128; size <= SIZE_; size *= 2) { int rc; int simulate_restart = 1; t1 = MPI_Wtime(); ret = ARMCI_Ckpt(rid); if (ret == ARMCI_CKPT) { printf("%d: Performed CHECKPOINT @ size=%ld\n", me, size); } else if (ret == ARMCI_RESTART) { simulate_restart = 0; printf("%d: Performed RESTART @ size=%ld\n", me, size); } for (i = 0; i < 5; i++) { for (rc = 0; rc < 15; rc++) if (i == 3 && rc == 10) { } do_work(size); } time_array1[j++] = MPI_Wtime() - t1; sleep(1); if (simulate_restart && size == FAILURE_SIZE_) { printf("%d: Simulating FAILURE @ size = %d\n", me, size); ARMCI_Restart_simulate(rid, 1); } printf("%d: DONE for size=%ld regular=%f withckpt=%f\n\n", me, size, time_array[j-1], time_array1[j-1]); fflush(stdout); } ARMCI_Ckpt_finalize(rid); printf("Before Finalize()\n"); ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/fork.c0000644000175000017500000000432312662210426013710 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include int main(int argc, char **argv, char **envp) { int i, ret, npes; int num_interfaces; ptl_handle_ni_t nih; ptl_handle_eq_t eqh; ptl_ni_limits_t ptl_limits; pid_t child; ptl_process_id_t rnk; child = fork(); if ((ret = PtlInit(&num_interfaces)) != PTL_OK) { printf("%s: PtlInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlInit succeeds (%d)\n", FUNCTION_NAME, ret); if ((ret = PtlNIInit( IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) { printf("%s: PtlNIInit 1 failed: %d\n", FUNCTION_NAME, ret); } if ((ret = PtlNIFini(nih)) != PTL_OK) { printf("%s: PtlNIFini failed: %d\n", FUNCTION_NAME, ret); } PtlFini(); if ((ret = PtlInit(&num_interfaces)) != PTL_OK) { printf("%s: PtlInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } if ((ret = PtlNIInit( IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) { printf("%s: PtlNIInit 2 failed: %d\n", FUNCTION_NAME, ret); exit(1); } #if 0 if ((ret = PtlNIInit( IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) { printf("%s: PtlNIInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } #endif printf("%s: PtlNIInit succeeds (%d)\n", FUNCTION_NAME, ret); if ((ret = PtlEQAlloc(nih, 4096, NULL, &eqh)) != PTL_OK) { printf("%s: PtlEQAlloc failed: %d(%d)\n", FUNCTION_NAME, ret, child); exit(1); } printf("%s: PtlEQAlloc succeeds (%d:%d)\n", FUNCTION_NAME, child, ret); if ((ret = PtlGetId(nih, &rnk)) != PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n", FUNCTION_NAME, ret, child); exit(1); } printf("%s: nid=%d pid=%d(%d)\n", FUNCTION_NAME, rnk.nid, rnk.pid, child); if (child) { MPI_Init(&argc, &argv); MPI_Finalize(); printf("%s: mpi_init and finalize succeed(%d)\n", FUNCTION_NAME, child); } } ga-5-4/armci/testing/test_mt.c0000644000175000017500000003762112662210426014435 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: test_mt.c,v 1.1.2.1 2007-07-02 05:34:13 d3p687 Exp $ * test_mt.c * * Developed by Andriy Kot * Copyright (c) 2007 Pacific Northwest National Laboratory * * Changelog: * 2007-02-17 - created * */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDARG_H # include #endif #if HAVE_ASSERT_H # include #endif #include "armci.h" #include "message.h" #include "utils.h" #define DEBUG /* note: a TBUFSIZE (per thread) buffer is used to print arrays */ #define TBUFSIZE 65535 /* prints debug information to files named test_mt.th<#th_rank>*/ /*#define LOG2FILE*/ #define NOTHREADS_ /* debug: does not spawn threads if set */ typedef double atype_t; /* type of the element of the array */ #define MAX_TPP 8 /* max treads per processor */ #define TPP 1//2 /* threads per processor */ #define ASIZE 4//5000 /* size of array */ #define ITERS 1//10 /* iterations per test */ enum {PUT = 101, GET, ACC}; int tpp = TPP; int asize = ASIZE; int iters = ITERS; int delay = 0; double scale = 2.0; #define THREAD_OFF 1000.0 #define ITER_OFF 10.0 #define ELEM_INC 0.0003 /* each ARMCI mem block that allocated consists of * th_size blocks, one per each thread (systemwide), which consist of * iters blocks, one per each iteration, which consist of * asize doubles (or atype_t) */ #define ASIZE_BYTES (asize*sizeof(atype_t)) #define ASIZExITERS (asize*iters) #define ASIZExITERS_BYTES (ASIZE_BYTES*iters) #define ASIZExITERSxTH (asize*iters*th_size) #define ASIZExITERSxTH_BYTES (ASIZE_BYTES*iters*th_size) /* p_ - pointer (points to area owned by particula thread) * th_ - thread section * it_ - iteration * i_ - element offset (0 for beginning of array) */ #define AELEM(p_,th_,it_,i_) ((atype_t *)p_)[th_*ASIZExITERS+it_*asize+i_] #define AELEM_VAL(th_,it_,i_) (THREAD_OFF*th_+ITER_OFF*it_+ELEM_INC*(i_+1)) int rank, size, th_size; int th_rank[MAX_TPP]; unsigned time_seed; int *pairs, *rnd_tgts, rnd_one; void **ptrs1, **ptrs2; FILE *dbg[MAX_TPP]; char fname[] = "test_mt.th000"; char cbuf[2048]; int cbufl; #define PRINTF0 if(!rank)printf #define PRINTF0T if(!TH_ME)printf #define RND(l_,h_) (l_+(int)(((double)h_)*rand()/(RAND_MAX+((double)l_)))) #define TH_ME (th_rank[th_idx]) void prndbg(int th_idx, char *fmt, ...) { #ifdef DEBUG va_list ap; va_start(ap, fmt); #ifdef LOG2FILE # define DSCR dbg[th_idx] #else # define DSCR stdout printf("%3d: ", TH_ME); #endif vfprintf(DSCR, fmt, ap); fflush(DSCR); va_end(ap); #endif } void usage() { if (!rank) { printf("Usage: test_mt, or \n"); printf(" test_mt -tTHREADS_PER_PROC -sARRAY_SIZE -iITERATIONS_COUNT\n"); } ARMCI_Barrier(); armci_msg_finalize(); exit(0); } void *thread_main(void *arg); void zero_array(int th_idx, void *ptr); void init_array(int th_idx, void *ptr); void print_array(int th_idx, char *msg, atype_t *array); void test_pairs(int th_idx); // deprecated? void test_PutGetAcc(int th_idx, int tgt, int *rmt, int rmt_cnt); void check_PutGetAcc(int th_idx, int rmt, int op, atype_t *array); int main(int argc, char *argv[]) { int ch; extern char *optarg; int i, j, r; thread_t threads[MAX_TPP]; /* init ARMCI */ armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); size = armci_msg_nproc(); rank = armci_msg_me(); while ((ch = getopt(argc, argv, "t:s:i:d:h")) != -1) { switch (ch) { case 't': /* # of threads */ tpp = atoi(optarg); if (tpp < 1 || tpp > MAX_TPP) { PRINTF0("\"%s\" is improper value for -t, should be a " "number between 1 and %d(MAX_TPP)\n", optarg, MAX_TPP); usage(); } break; case 'i': /* # of iterations */ iters = atoi(optarg); if (iters < 1) { PRINTF0("\"%s\" is improper value for -t, should be a " "number equal or larger than 1\n", optarg); usage(); } break; case 's': /* # of elements in the array */ asize = atoi(optarg); if (iters < 1) { PRINTF0("\"%s\" is improper value for -s, should be a " "number equal or larger than 1\n", optarg); usage(); } break; case 'd': delay = atoi(optarg); break; /* delay before start */ case 'h': usage(); break; /* print usage info */ } } #ifdef NOTHREADS tpp = 1; PRINTF0("Warning: NOTHREADS debug symbol is set -- running w/o threads\n"); #endif th_size = size * tpp; PRINTF0("\nTest of multi-threaded capabilities:\n" "%d threads per process (%d threads total),\n" "%d array elements of size %d,\n" "%d iteration(s)\n\n", tpp, th_size, asize, sizeof(atype_t), iters); if (delay) { printf("%d: %d\n", rank, getpid()); fflush(stdout); sleep(delay); ARMCI_Barrier(); } TH_INIT(size, tpp); for (i = 0; i < tpp; i++) { th_rank[i] = rank * tpp + i; } #if defined(DEBUG) && defined(LOG2FILE) for (i = 0; i < tpp; i++) { fname[10] = '0' + th_rank[i] / 100; fname[11] = '0' + th_rank[i] % 100 / 10; fname[12] = '0' + th_rank[i] % 10; dbg[i] = fopen(fname, "w"); } #endif for (i = 0; i < tpp; i++) { prndbg(i, "proc %d, thread %d(%d):\n", rank, i, th_rank[i]); } /* set global seed (to ensure same random sequence across procs) */ time_seed = (unsigned)time(NULL); armci_msg_brdcst(&time_seed, sizeof(time_seed), 0); srand(time_seed); rand(); prndbg(0, "seed = %u\n", time_seed); /* random pairs */ pairs = calloc(th_size, sizeof(int)); for (i = 0; i < th_size; i++) { pairs[i] = -1; } for (i = 0; i < th_size; i++) { if (pairs[i] != -1) { continue; } r = RND(0, th_size); while (i == r || pairs[r] != -1) { r = RND(0, th_size); } pairs[i] = r; pairs[r] = i; } for (i = 0, cbufl = 0; i < th_size; i++) cbufl += sprintf(cbuf + cbufl, " %d->%d|%d->%d", i, pairs[i], pairs[i], pairs[pairs[i]]); prndbg(0, "random pairs:%s\n", cbuf); /* random targets */ rnd_tgts = calloc(th_size, sizeof(int)); for (i = 0, cbufl = 0; i < th_size; i++) { rnd_tgts[i] = RND(0, th_size); if (rnd_tgts[i] == i) { i--; continue; } cbufl += sprintf(cbuf + cbufl, " %d", rnd_tgts[i]); } prndbg(0, "random targets:%s\n", cbuf); /* random one */ rnd_one = RND(0, th_size); prndbg(0, "random one = %d\n", rnd_one); assert(ptrs1 = calloc(th_size, sizeof(void *))); assert(ptrs2 = calloc(th_size, sizeof(void *))); #ifdef NOTHREADS thread_main((void *)(long)0); #else for (i = 0; i < tpp; i++) { THREAD_CREATE(threads + i, thread_main, (void *)(long)i); } for (i = 0; i < tpp; i++) { THREAD_JOIN(threads[i], NULL); } #endif ARMCI_Barrier(); PRINTF0("Tests Completed\n"); /* clean up */ #if defined(DEBUG) && defined(LOG2FILE) for (i = 0; i < tpp; i++) { fclose(dbg[i]); } #endif ARMCI_Finalize(); TH_FINALIZE(); armci_msg_finalize(); return 0; } void *thread_main(void *arg) { int th_idx, i; int tgt, *rmt, rmt_cnt; th_idx = (int)(long)arg; prndbg(th_idx, "thread %d(%d|%d) STARTED\n", TH_ME, rank, th_idx); assert(!ARMCI_MALLOC_MT(ptrs1, ASIZExITERSxTH_BYTES)); assert(!ARMCI_MALLOC_MT(ptrs2, ASIZExITERSxTH_BYTES)); #if 0 for (i = 0, cbufl = 0; i < th_size; i++) { cbufl += sprintf(cbuf + cbufl, " %p", ptrs1[i]); } prndbg(th_idx, "ptrs1: %s\n", cbuf); for (i = 0, cbufl = 0; i < th_size; i++) { cbufl += sprintf(cbuf + cbufl, " %p", ptrs2[i]); } prndbg(th_idx, "ptrs2: %s\n", cbuf); #endif #if 0 init_array(th_idx, ptrs1[TH_ME]); init_array(th_idx, ptrs2[TH_ME]); #endif assert(rmt = calloc(th_size, sizeof(int))); PRINTF0T(" TESTING GET/PUT/ACC\n\n"); /* test pairs */ PRINTF0T("> Testing pair-wise communication pattern ...\n"); tgt = rmt[0] = pairs[TH_ME]; rmt_cnt = 1; test_PutGetAcc(th_idx, tgt, rmt, rmt_cnt); PRINTF0T(" pair-wise is OK\n\n"); //return NULL; // REMOVE WHEN DONE /* test random target */ PRINTF0T("> Testing random target communication pattern ...\n"); tgt = rnd_tgts[TH_ME]; for (i = 0, rmt_cnt = 0; i < th_size; i++) if (rnd_tgts[i] == TH_ME) { rmt[rmt_cnt++] = i; } test_PutGetAcc(th_idx, tgt, rmt, rmt_cnt); PRINTF0T(" random target is OK\n\n"); /* test all to one */ PRINTF0T("> Testing hotspot(all to one) communication pattern ...\n"); if (TH_ME == rnd_one) { tgt = -1; for (i = 0, rmt_cnt = 0; i < th_size; i++) if (i != TH_ME) { rmt[rmt_cnt++] = i; } } else { tgt = rnd_one; rmt_cnt = 0; } test_PutGetAcc(th_idx, tgt, rmt, rmt_cnt); PRINTF0T(" hotspot is OK\n\n"); free(rmt); } void zero_array(int th_idx, void *ptr) { int i, j, k; for (i = 0; i < th_size; i++)for (j = 0; j < iters; j++)for (k = 0; k < asize; k++) { AELEM(ptr, i, j, k) = 0.0; } } void init_array(int th_idx, void *ptr) { int i, j, k; for (i = 0; i < th_size; i++)for (j = 0; j < iters; j++)for (k = 0; k < asize; k++) { AELEM(ptr, i, j, k) = AELEM_VAL(TH_ME, j, k); } /*AELEM(ptr, i, j) = THREAD_OFF*TH_ME + ITER_OFF*i + ELEM_INC*(j+1);*/ print_array(th_idx, "initialized", ptr); #if 0 # if 1 for (i = 0, cbufl = 0; i < th_size; i++) { for (j = 0; j < iters; j++) { cbufl += sprintf(cbuf + cbufl, "(%d,%d)%p:", i, j, &(((atype_t *)ptr)[i*ASIZExITERS+j*asize])); for (k = 0; k < asize; k++) { cbufl += sprintf(cbuf + cbufl, " %.4f", ((atype_t *)ptr)[i*ASIZExITERS+j*asize+k]); } cbufl += sprintf(cbuf + cbufl, "\n"); } cbufl += sprintf(cbuf + cbufl, "\n"); } # else for (i = 0, cbufl = 0; i < (th_size * iters * asize); i++) { cbufl += sprintf(cbuf + cbufl, " %.4f", ((atype_t *)ptr)[i]); } # endif prndbg(th_idx, "initialized:\n%s\n", cbuf); #endif } void print_array(int th_idx, char *msg, atype_t *array) { #ifdef DEBUG int i, j, k, tbufl; char tbuf[TBUFSIZE]; if (ASIZExITERSxTH_BYTES > TBUFSIZE / 2) { prndbg(th_idx, "%s:\n%s\n", msg, "array is too big to print"); } for (i = 0, tbufl = 0; i < th_size; i++) { for (j = 0; j < iters; j++) { tbufl += sprintf(tbuf + tbufl, "(%d,%d)%p:", i, j, &AELEM(array, i, j, 0)); for (k = 0; k < asize; k++) { tbufl += sprintf(tbuf + tbufl, " %.4f", AELEM(array, i, j, k)); } tbufl += sprintf(tbuf + tbufl, "\n"); } tbufl += sprintf(tbuf + tbufl, "\n"); } prndbg(th_idx, "%s:\n%s\n", msg, tbuf); #endif } /* void print_array(int th_idx, char *msg, atype_t *array, int count) { #ifdef DEBUG int i; for (i = 0, cbufl = 0; i < count; i++) cbufl+=sprintf(cbuf+cbufl, " %.4f", array[i]); prndbg(th_idx, "%s:%s\n", msg, cbuf); #endif } */ int check_result(atype_t *array, int th) { int i, j, k, mismatch; for (i = 0, k = 0, mismatch; i < iters; i++) for (j = 0; j < asize; j++, k++) { if (array[k] != AELEM_VAL(th, i, j)) { printf("mismatch detected: th=%d, i=%d, j=%d, k=%d, elem=%d, array=%d\n", th, i, j, k, AELEM_VAL(th, i, j), array[k]); fflush(stdout); abort(); } } } void test_pairs(int th_idx) { int rem_th, rem_proc; int i, j; void *src, *dst; rem_th = pairs[TH_ME]; rem_proc = TH2PROC(rem_th); prndbg(th_idx, "test_pair: %d<->%d(%d)\n", TH_ME, rem_th, rem_proc); MT_BARRIER(); #if 0 print_array(th_idx, "before", &AELEM(ptrs2[TH_ME], rem_th, 0, 0), ASIZExITERS); #endif for (i = 0; i < iters; i++) { /* src - addr of my thread block on remote proc/thread */ src = &AELEM(ptrs1[rem_th], TH_ME, i, 0); /* src - addr of remote thread block on my proc/thread */ dst = &AELEM(ptrs2[TH_ME], rem_th, i, 0); /* get from my pair */ assert(!ARMCI_Get(src, dst, ASIZE_BYTES, rem_proc)); } MT_BARRIER(); #if 0 print_array(th_idx, "rcvd", &AELEM(ptrs2[TH_ME], rem_th, 0, 0), ASIZExITERS); #endif /* check results */ check_result(&AELEM(ptrs2[TH_ME], rem_th, 0, 0), rem_th); } /* test Put/Get/Acc sequence regardless of communication pattern * tgt -- remote target for put/get/acc (none if -1) * rmt -- list of remote thread that put/acc to here (correctness is cheked here) * rmt_cnt -- # of threads in rmt */ void test_PutGetAcc(int th_idx, int tgt, int *rmt, int rmt_cnt) { /* a - local thread, b - remote thread */ int a, b, b_proc, stride[2], count[2]; int i, j; void *src, *dst; #ifdef DEBUG for (i = 0, cbufl = 0; i < rmt_cnt; i++) { cbufl += sprintf(cbuf + cbufl, " %d", rmt[i]); } prndbg(th_idx, "test_PutGetAcc: put/acc to %d, get from %d, check put/acc from %s\n", tgt, tgt, rmt_cnt ? cbuf : "none"); #endif a = TH_ME; stride[0] = ASIZE_BYTES; count[0] = ASIZE_BYTES; count[1] = 1; /* init arrays */ init_array(th_idx, ptrs1[TH_ME]); init_array(th_idx, ptrs2[TH_ME]); MT_BARRIER(); /* put - put a.ptrs1[b] into b.ptrs2[a] */ if (tgt != -1) { b = tgt; b_proc = TH2PROC(b); for (i = 0; i < iters; i++) { src = &AELEM(ptrs1[a], b, i, 0); /* a.ptrs1[b] */ dst = &AELEM(ptrs2[b], a, i, 0); /* b.ptrs2[a] */ // assert(!ARMCI_Put(src, dst, ASIZE_BYTES, b_proc)); assert(!ARMCI_PutS(src, stride, dst, stride, count, 1, b_proc)); } ARMCI_Fence(b_proc); } MT_BARRIER(); print_array(th_idx, "PUT:ptrs1[TH_ME]", ptrs1[TH_ME]); print_array(th_idx, "PUT:ptrs2[TH_ME]", ptrs2[TH_ME]); MT_BARRIER(); /* chk put(s) from b(s): a.ptrs2[b] */ for (j = 0; j < rmt_cnt; j++) { b = rmt[j]; b_proc = TH2PROC(b); check_PutGetAcc(th_idx, b, PUT, &AELEM(ptrs2[a], b, 0, 0)); } //return; // REMOVE WHEN DONE /* init arrays */ init_array(th_idx, ptrs1[TH_ME]); init_array(th_idx, ptrs2[TH_ME]); MT_BARRIER(); /* get - get b.ptrs1[a] into a.ptrs2[b] */ if (tgt != -1) { b = tgt; b_proc = TH2PROC(b); for (i = 0; i < iters; i++) { src = &AELEM(ptrs1[b], a, i, 0); /* b.ptrs1[a] */ dst = &AELEM(ptrs2[a], b, i, 0); /* a.ptrs2[b] */ assert(!ARMCI_GetS(src, stride, dst, stride, count, 1, b_proc)); } } print_array(th_idx, "GET:ptrs1[TH_ME]", ptrs1[TH_ME]); print_array(th_idx, "GET:ptrs2[TH_ME]", ptrs2[TH_ME]); MT_BARRIER(); /* chk get from b: a.ptrs2[b] */ if (tgt != -1) { check_PutGetAcc(th_idx, b, GET, &AELEM(ptrs2[a], b, 0, 0)); } #if 1 /* init arrays */ init_array(th_idx, ptrs1[TH_ME]); init_array(th_idx, ptrs2[TH_ME]); MT_BARRIER(); /* acc - acc a.ptrs1[b] * scale + b.ptrs2[a] into b.ptrs2[a] */ if (tgt != -1) { b = tgt; b_proc = TH2PROC(b); for (i = 0; i < iters; i++) { src = &AELEM(ptrs1[a], b, i, 0); /* a.ptrs1[b] */ dst = &AELEM(ptrs2[b], a, i, 0); /* b.ptrs2[a] */ assert(!ARMCI_AccS(ARMCI_ACC_DBL, &scale, src, stride, dst, stride, count, 1, b_proc)); } ARMCI_Fence(b_proc); } MT_BARRIER(); print_array(th_idx, "ACC:ptrs1[TH_ME]", ptrs1[TH_ME]); print_array(th_idx, "ACC:ptrs2[TH_ME]", ptrs2[TH_ME]); MT_BARRIER(); /* chk acc(s) from b(s): a.ptrs2[b] */ for (j = 0; j < rmt_cnt; j++) { b = rmt[j]; b_proc = TH2PROC(b); check_PutGetAcc(th_idx, b, ACC, &AELEM(ptrs2[a], b, 0, 0)); } #endif MT_BARRIER(); } void check_PutGetAcc(int th_idx, int rmt, int op, atype_t *array) { int i, j, k; double expected; for (i = 0, k = 0; i < iters; i++) for (j = 0; j < asize; j++, k++) { expected = op == ACC ? AELEM_VAL(TH_ME, i, j) + scale * AELEM_VAL(rmt, i, j) : AELEM_VAL(rmt, i, j); if (array[k] != expected) { printf("mismatch detected: TM_ME=%d, rmt=%d, op=%d, i=%d, j=%d, " "k=%d, expected=%f, array=%f\n", TH_ME, rmt, op, i, j, k, expected, array[k]); fflush(stdout); sleep(5); abort(); } #if 0 if (array[k] != AELEM_VAL(th, i, j)) { printf("mismatch detected: th=%d, i=%d, j=%d, k=%d, elem=%d, array=%d\n", th, i, j, k, AELEM_VAL(th, i, j), array[k]); fflush(stdout); sleep(10); abort(); } #endif } } ga-5-4/armci/testing/testitr.c0000644000175000017500000000373712662210426014455 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #include "iterator.h" int main(int argc, char **argv) { stride_info_t sinfo, dinfo; int a[10][10], b[11][11]; int asr[1] = {10 * sizeof(int)}; int bsr[1] = {11 * sizeof(int)}; int count[2] = {5 * sizeof(int), 5}; int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { a[i][j] = i * 10 + j; } } for (i = 0; i < 11; i++) { for (j = 0; j < 11; j++) { b[i][j] = 0; } } armci_stride_info_init(&sinfo, &a[2][3], 1, asr, count); armci_stride_info_init(&dinfo, &b[3][4], 1, bsr, count); assert(armci_stride_info_size(&sinfo) == 5); assert(armci_stride_info_size(&dinfo) == 5); assert(armci_stride_info_pos(&sinfo) == 0); assert(armci_stride_info_pos(&dinfo) == 0); while (armci_stride_info_has_more(&sinfo)) { int bytes; char *ap, *bp; assert(armci_stride_info_has_more(&dinfo)); bytes = armci_stride_info_seg_size(&sinfo); assert(bytes == armci_stride_info_seg_size(&dinfo)); ap = armci_stride_info_seg_ptr(&sinfo); bp = armci_stride_info_seg_ptr(&dinfo); memcpy(bp, ap, bytes); armci_stride_info_next(&sinfo); armci_stride_info_next(&dinfo); } armci_stride_info_destroy(&sinfo); armci_stride_info_destroy(&dinfo); #if 0 for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%3d ", a[i][j]); } printf("\n"); } for (i = 0; i < 11; i++) { for (j = 0; j < 11; j++) { printf("%3d ", b[i][j]); } printf("\n"); } #endif for (i = 2; i < 2 + 5; i++) { for (j = 3; j < 3 + 5; j++) { if (a[i][j] != b[i+1][j+1]) { printf("a[%d][%d]=%d b[%d][%d]=%d\n", i, j, a[i][j], i, j, b[i][j]); printf("Test Failed\n"); return 0; } } } printf("Success\n"); return 0; } ga-5-4/armci/testing/simple.c0000644000175000017500000000376112662210426014245 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$id$*/ #include #include #include #include "armci.h" #include "message.h" int me, nprocs; int LOOP = 10; int main(int argc, char **argv) { int k, i; double **myptrs[10]; double t0, t1, tget = 0, tnbget = 0, tput = 0, tnbput = 0, tnbwait = 0, t2 = 0; armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); ARMCI_Init_args(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); for (k = 0; k < 10; k++) { myptrs[k] = (double **)malloc(sizeof(double *) * nprocs); ARMCI_Malloc((void **)myptrs[k], 400000 * LOOP * sizeof(double)); for (i = 0; i < LOOP; i++) { myptrs[k][me][i] = me + 0.414; } MPI_Barrier(MPI_COMM_WORLD); for (i = 0; i < LOOP; i++) { ARMCI_Get(myptrs[k][(me+1)%nprocs] + i, myptrs[k][me] + i, sizeof(double), (me + 1) % nprocs); /*if(myptrs[k][me][i]!=0.414+(me+1)%nprocs)ARMCI_Error("errr",myptrs[k][me][i]);*/ } t0 = t1 = tget = tnbget = tput = tnbput = tnbwait = t2 = 0; t0 = MPI_Wtime(); for (i = 0; i < LOOP; i++) { ARMCI_Get(myptrs[k][(me+1)%nprocs] + i, myptrs[k][me] + i, sizeof(double), (me + 1) % nprocs); } t1 = MPI_Wtime(); printf("\nGet Latency=%f\n", 1e6 *(t1 - t0) / LOOP); fflush(stdout); t1 = t0 = 0; for (i = 0; i < LOOP; i++) { armci_hdl_t nbh; ARMCI_INIT_HANDLE(&nbh); t0 = MPI_Wtime(); ARMCI_NbGet(myptrs[k][(me+1)%nprocs] + i, myptrs[k][me] + i, sizeof(double), (me + 1) % nprocs, &nbh); t1 = MPI_Wtime(); ARMCI_Wait(&nbh); t2 = MPI_Wtime(); tnbget += (t1 - t0); tnbwait += (t2 - t1); } printf("\nNb Get Latency=%f Nb Wait=%f\n", 1e6 * tnbget / LOOP, 1e6 * tnbwait / LOOP); fflush(stdout); MPI_Barrier(MPI_COMM_WORLD); } for (k = 0; k < 10; k++) { ARMCI_Free(myptrs[k][me]); } MPI_Barrier(MPI_COMM_WORLD); ARMCI_Finalize(); ARMCI_Finalize(); armci_msg_finalize(); return 0; } ga-5-4/armci/testing/shmclean.c0000644000175000017500000000223612662210426014542 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* The program was written to address missing "ipcrm" command on Mac X * It probes a range of System V shared memory id from 0 to MAXID * and if exist, it attempts to delete them. */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SHM_H # include #endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #ifdef SUN char *shmat(); #endif #define MAXID 1000000 int main(int argc, char **argv) { int i; for (i = 0; i < MAXID; i++) { #if SIZEOF_VOIDP == SIZEOF_INT int rc = (int) shmat(i, (char *) NULL, 0); #elif SIZEOF_VOIDP == SIZEOF_LONG long rc = (long) shmat(i, (char *) NULL, 0); #elif SIZEOF_VOIDP == SIZEOF_LONGLONG long long rc = (long long) shmat(i, (char *) NULL, 0); #endif if (rc < 0) { continue; } printf("found %d\n", i); shmdt((void *)rc); /* delete segment id */ if (shmctl(i, IPC_RMID, (struct shmid_ds *)NULL)) { printf("failed to remove shm id=%d\n", i); } } return 0; } ga-5-4/armci/testing/clone.c0000644000175000017500000000373612662210426014056 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #define FORK_BEFORE_NI_INIT #ifndef FORK_BEFORE_NI_INIT #define FORK_AFTER_NI_INIT #endif char child_stack[256*1024]; char *child_stack_top = &child_stack[256*1024-1]; int iv; int server(void *arg) { int ret; int num_interfaces; ptl_handle_ni_t nih; ptl_handle_eq_t eqh; ptl_ni_limits_t ptl_limits; ptl_event_t ev_t; ptl_event_t *ev = &ev_t; printf("IN SERVER\n"); if ((ret = PtlInit(&num_interfaces)) != PTL_OK) { printf("%s: PtlInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlInit succeeds (%d:%d)\n", FUNCTION_NAME, ret, num_interfaces); if (((ret = PtlNIInit( IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) && (ret != PTL_IFACE_DUP)) { printf("%s: PtlNIInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlNIInit succeeds (%d)\n", FUNCTION_NAME, ret); if ((ret = PtlEQAlloc(nih, 4096, NULL, &eqh)) != PTL_OK) { printf("%s: PtlEQAlloc failed: %d\n", FUNCTION_NAME, ret); exit(1); } iv = 11; ret = PtlEQWait(nih, ev); printf("%s: PtlEQAlloc succeeds\n", FUNCTION_NAME); printf("%d\n", iv); iv = 13; while (1); } int main(int argc, char **argv, char **envp) { int ret; pid_t child; int status; iv = 12; child = clone(server, (void *)child_stack_top, CLONE_THREAD | CLONE_SIGHAND | CLONE_VM, NULL); if (child == -1) { perror("clone"); exit(1); } printf("clone returns...(ret=%d)\n", child); while (iv != 11); printf("\nbetween after %d\n", iv); MPI_Init(&argc, &argv); MPI_Barrier(MPI_COMM_WORLD); MPI_Finalize(); printf("waiting...\n"); waitpid(-1, &status, __WALL); printf("\nafter %d\n", iv); printf("done (%d)\n", status); } ga-5-4/armci/testing/ipctest.c0000644000175000017500000000436712662210426014432 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: ipctest.c,v 1.2 1999-07-28 00:47:55 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #include #if HAVE_ASSERT_H # include #endif #include "armcip.h" #include "armci_shmem.h" #include "locks.h" #include "message.h" int me, nproc; void test() { double *a = NULL, start = 1., end = -1.; int len = 100; long size = len * sizeof(double); long idlist[SHMIDLEN]; int numlock = 10, i; lockset_t lockid; /* shared memory test */ if (me == 0) { printf("Test shared memory\n"); a = (double *)Create_Shared_Region(idlist + 1, size, idlist); assert(a); a[0] = start; a[len-1] = end; } MPI_Bcast(idlist, SHMIDLEN, MPI_LONG, 0, MPI_COMM_WORLD); if (me) { a = (double *)Attach_Shared_Region(idlist + 1, size, idlist[0]); assert(a); } if (me == nproc - 1) { printf("%d: start=%f end=%f\n", me, a[0], a[len-1]); if (a[0] == start && a[len-1] == end) { printf("Works!\n"); } } /*printf("%d: a=%x\n",me,a); */ MPI_Barrier(MPI_COMM_WORLD); /* allocate locks */ if (me == 0) { a[0] = 0.; CreateInitLocks(numlock, &lockid); printf("\nMutual exclusion test\n"); } MPI_Bcast(&lockid, sizeof(lockid), MPI_BYTE, 0, MPI_COMM_WORLD); if (me) { InitLocks(numlock, lockid); } /* mutual exclusion test: * everybody increments shared variable 1000 times */ # define TIMES 1000 MPI_Barrier(MPI_COMM_WORLD); for (i = 0; i < TIMES; i++) { NATIVE_LOCK(0, me); a[0]++; NATIVE_UNLOCK(0, me); } MPI_Barrier(MPI_COMM_WORLD); if (me == nproc - 1) { printf("value of shared variable =%f should be %f\n", a[0], 1.0 * nproc * TIMES); if (a[0] == 1.0 * nproc * TIMES) { printf("Works!\n\n"); } } /* cleanup of IPC resources */ if (me == 0) { DeleteLocks(lockid); Delete_All_Regions(); } MPI_Barrier(MPI_COMM_WORLD); } int main(int argc, char **argv) { armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nproc); MPI_Comm_rank(MPI_COMM_WORLD, &me); if (me == 0) { printf("Testing IPCs (%d MPI processes)\n\n", nproc); } test(); ARMCI_Finalize(); armci_msg_finalize(); return 0; } ga-5-4/armci/testing/rpl_armci_msg_finalize.c0000644000175000017500000000016512662210426017446 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include void armci_msg_finalize() { MPI_Finalize(); } ga-5-4/armci/testing/testnotify.c0000644000175000017500000002616312662210426015165 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: testnotify.c,v 1.4 2003-08-21 22:51:12 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #define DEBUG__ #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) if ((np = atoi(argv[1])) < 1) { goto usage; } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif /*\ generate random range for a section of multidimensional array \*/ void get_range(int ndim, int dims[], int lo[], int hi[]) { int dim; for (dim = 0; dim < ndim; dim++) { int toss1, toss2; toss1 = rand() % dims[dim]; toss2 = rand() % dims[dim]; if (toss1 < toss2) { lo[dim] = toss1; hi[dim] = toss2; } else { hi[dim] = toss1; lo[dim] = toss2; } } } /*\ generates a new random range similar to the input range for an array with specified dimensions \*/ void new_range(int ndim, int dims[], int lo[], int hi[], int new_lo[], int new_hi[]) { int dim; for (dim = 0; dim < ndim; dim++) { int toss, range; int diff = hi[dim] - lo[dim] + 1; assert(diff <= dims[dim]); range = dims[dim] - diff; toss = (range > 0) ? rand() % range : lo[dim]; new_lo[dim] = toss; new_hi[dim] = toss + diff - 1; assert(new_hi[dim] < dims[dim]); assert(diff == (new_hi[dim] - new_lo[dim] + 1)); } } /*\ print range of ndim dimensional array with two strings before and after \*/ void print_range(char *pre, int ndim, int lo[], int hi[], char *post) { int i; printf("%s[", pre); for (i = 0; i < ndim; i++) { printf("%d:%d", lo[i], hi[i]); if (i == ndim - 1) { printf("] %s", post); } else { printf(","); } } } /*\ print subscript of ndim dimensional array with two strings before and after \*/ void print_subscript(char *pre, int ndim, int subscript[], char *post) { int i; printf("%s [", pre); for (i = 0; i < ndim; i++) { printf("%d", subscript[i]); if (i == ndim - 1) { printf("] %s", post); } else { printf(","); } } } /*\ print a section of a 2-D array of doubles \*/ void print_2D_double(double *a, int ld, int *lo, int *hi) { int i, j; for (i = lo[0]; i <= hi[0]; i++) { for (j = lo[1]; j <= hi[1]; j++) { printf("%13f ", a[ld*j+i]); } printf("\n"); } } /*\ initialize array: a[i,j,k,..]=i+100*j+10000*k+ ... \*/ void init(double *a, int ndim, int elems, int dims[]) { int idx[MAXDIMS]; int i, dim; for (i = 0; i < elems; i++) { int Index = i; double field, val; for (dim = 0; dim < ndim; dim++) { idx[dim] = Index % dims[dim]; Index /= dims[dim]; } field = 1.; val = 0.; for (dim = 0; dim < ndim; dim++) { val += field * idx[dim]; field *= BASE; } a[i] = val; /* printf("(%d,%d,%d)=%6.0f",idx[0],idx[1],idx[2],val); */ } } /*\ compute Index from subscript * assume that first subscript component changes first \*/ int Index(int ndim, int subscript[], int dims[]) { int idx = 0, i, factor = 1; for (i = 0; i < ndim; i++) { idx += subscript[i] * factor; factor *= dims[i]; } return idx; } void update_subscript(int ndim, int subscript[], int lo[], int hi[], int dims[]) { int i; for (i = 0; i < ndim; i++) { if (subscript[i] < hi[i]) { subscript[i]++; return; } subscript[i] = lo[i]; } } void compare_patches(double eps, int ndim, double *patch1, int lo1[], int hi1[], int dims1[], double *patch2, int lo2[], int hi2[], int dims2[]) { int i, j, elems = 1; int subscr1[MAXDIMS], subscr2[MAXDIMS]; double diff, max; int idx1, idx2, offset1, offset2; for (i = 0; i < ndim; i++) { /* count # of elements & verify consistency of both patches */ int diff = hi1[i] - lo1[i]; assert(diff == (hi2[i] - lo2[i])); assert(diff < dims1[i]); assert(diff < dims2[i]); elems *= diff + 1; subscr1[i] = lo1[i]; subscr2[i] = lo2[i]; } /* compare element values in both patches */ for (j = 0; j < elems; j++) { idx1 = Index(ndim, subscr1, dims1); /* calculate element Index from a subscript */ idx2 = Index(ndim, subscr2, dims2); if (j == 0) { offset1 = idx1; offset2 = idx2; } idx1 -= offset1; idx2 -= offset2; diff = patch1[idx1] - patch2[idx2]; max = ARMCI_MAX(ARMCI_ABS(patch1[idx1]), ARMCI_ABS(patch2[idx2])); if (max == 0. || max < eps) { max = 1.; } if (eps < ARMCI_ABS(diff) / max) { char msg[48]; sprintf(msg, "(proc=%d):%f", me, patch1[idx1]); print_subscript("ERROR: a", ndim, subscr1, msg); sprintf(msg, "%f\n", patch2[idx2]); print_subscript(" b", ndim, subscr2, msg); fflush(stdout); sleep(1); ARMCI_Error("Bailing out", 0); } { /* update subscript for the patches */ update_subscript(ndim, subscr1, lo1, hi1, dims1); update_subscript(ndim, subscr2, lo2, hi2, dims2); } } /* make sure we reached upper limit */ /*for(i=0;i1 takes a partial plane */ /* create shared and local arrays */ create_array(b, sizeof(double), ndim, dimsB); create_array(a, sizeof(double), ndim, dimsB); elems = get_elems(ndim, stride, dimsB, sizeof(double)); init((double *)a[me], ndim, elems, dimsB); for (i = 0; i < ndim; i++) { lo[i] = 0; hi[i] = (less > dimsB[i]) ? dimsB[i] - 1 : dimsB[i] - less; count[i] = hi[i] - lo[i] + 1; } count[0] *= sizeof(double); for (i = 0; i < ndim - 1; i++) { Idx *= dimsB[i]; } ARMCI_Barrier(); if (me == 0) { printf("--------array[%d", dimsB[0]); for (dim = 1; dim < ndim; dim++) { printf(",%d", dimsB[dim]); } printf("]--------\n"); fflush(stdout); } ARMCI_Barrier(); loopcnt = (ndim > 1) ? dimsB[ndim-1] : 1; strl = (ndim > 1) ? ndim - 2 : 0; /* strides of the subpatch to transfer */ for (i = 0; i < loopcnt; i++) { int wc; if (me == 0) { ARMCI_PutS((double *)a[me] + idx, stride, (double *)b[left] + idx, stride, count, strl, left); #if DEBUG_ printf("%d-%d: ps=%p pd=%p i=%d idx=%d count=%d\n", me, left, (double *) a[me] + idx, (double *)b[left] + idx, i, idx, count[0]); fflush(stdout); #endif (void)armci_notify(left); (void)armci_notify_wait(right, &wc); } else { (void)armci_notify_wait(right, &wc); ARMCI_PutS((double *)b[me] + idx, stride, (double *)b[left] + idx, stride, count, strl, left); #if DEBUG_ printf("%d: ps=%p pd=%p i=%d idx=%d count=%d\n", me, (double *)b[me] + idx, (double *)b[left] + idx, i, idx, count[0]); fflush(stdout); #endif (void)armci_notify(left); } idx += Idx; /* advance to the next slab */ } ARMCI_Barrier(); if (me == 0) { compare_patches(0., ndim, (double *)a[0], lo, hi, dimsB, (double *)b[0], lo, hi, dimsB); printf("OK\n"); } ARMCI_Barrier(); destroy_array(b); destroy_array(a); } int main(int argc, char *argv[]) { int ndim; armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); ARMCI_Barrier(); if (me == 0) { printf("\nTesting armci_notify\n"); fflush(stdout); sleep(1); } ARMCI_Barrier(); for (ndim = 1; ndim <= MAXDIMS; ndim++) { test_notify(ndim); } ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/test_groups.c0000644000175000017500000001715712662210426015336 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: test_groups.c,v 1.3 2004-11-22 20:29:53 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "armci.h" #include "message.h" /*#include "armcip.h"*/ #define MAXDIMS 7 #define MAXPROC 128 #define MINPROC 4 /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ABS(a) (((a) >= 0) ? (a) : (-(a))) #define MIN(a,b) (((a)<(b)) ? (a) : (b)) /***************************** global data *******************/ int me, nproc; void *work[MAXPROC]; /* work array for propagating addresses */ #ifdef PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if ((argc != 2) && (argc != 1)) { goto usage; } if (argc == 1) { np = 1; } if (argc == 2) if ((np = atoi(argv[1])) < 1) { goto usage; } if (np > MAXPROC) { goto usage; } mygid = pvm_joingroup(MPGROUP); if (np > 1) if (mygid == 0) { i = pvm_spawn(argv[0], argv + 1, 0, "", np - 1, ctid); } while (pvm_gsize(MPGROUP) < np) { sleep(1); } /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif void create_array(void *a[], int elem_size, int ndim, int dims[]) { int bytes = elem_size, i, rc; assert(ndim <= MAXDIMS); for (i = 0; i < ndim; i++) { bytes *= dims[i]; } rc = ARMCI_Malloc(a, bytes); assert(rc == 0); assert(a[me]); } void destroy_array(void *ptr[]) { ARMCI_Barrier(); assert(!ARMCI_Free(ptr[me])); } #define GNUM_A 3 #define GNUM_B 2 #define ELEMS 10 /* to check if a process belongs to this group */ int chk_grp_membership(int rank, ARMCI_Group *grp, int *memberlist) { int i, grp_size; ARMCI_Group_size(grp, &grp_size); for (i = 0; i < grp_size; i++) if (rank == memberlist[i]) { return 1; } return 0; } void test_one_group(ARMCI_Group *group, int *pid_list) { int grp_me, grp_size; int i, j, src_proc, dst_proc; double *ddst_put[MAXPROC]; double dsrc[ELEMS]; int bytes, world_me; world_me = armci_msg_me(); ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_size); if (grp_me == 0) { printf("GROUP SIZE = %d\n", grp_size); } printf("%d:group rank = %d\n", me, grp_me); src_proc = 0; dst_proc = grp_size - 1; bytes = ELEMS * sizeof(double); ARMCI_Malloc_group((void **)ddst_put, bytes, group); for (i = 0; i < ELEMS; i++) { dsrc[i] = i * 1.001 * (grp_me + 1); } for (i = 0; i < ELEMS; i++) { ddst_put[grp_me][i] = -1.0; } armci_msg_group_barrier(group); if (grp_me == src_proc) { /* NOTE: make sure to specify absolute ids in ARMCI calls */ ARMCI_Put(dsrc, &ddst_put[dst_proc][0], bytes, ARMCI_Absolute_id(group, dst_proc)); } armci_msg_group_barrier(group); /* NOTE: make sure to specify absolute ids in ARMCI calls */ ARMCI_Fence(ARMCI_Absolute_id(group, dst_proc)); sleep(1); /* Verify*/ if (grp_me == dst_proc) { for (j = 0; j < ELEMS; j++) { if (ABS(ddst_put[grp_me][j] - j * 1.001 *(src_proc + 1)) > 0.1) { printf("\t%d: ddst_put[%d][%d] = %f and expected value is %f\n", me, grp_me, j, ddst_put[grp_me][j], j * 1.001 *(src_proc + 1)); ARMCI_Error("groups: armci put failed...1", 0); } } printf("\n%d(%d): Test O.K. Verified\n", dst_proc, world_me); } armci_msg_group_barrier(group); ARMCI_Free_group(ddst_put[grp_me], group); } void test_groups() { int pid_listA[MAXPROC] = {0, 1, 2}; int pid_listB[MAXPROC] = {1, 3}; ARMCI_Group groupA, groupB; ARMCI_Barrier(); ARMCI_Group_create(GNUM_A, pid_listA, &groupA); /* create group 1 */ ARMCI_Group_create(GNUM_B, pid_listB, &groupB); /* create group 2 */ /* ------------------------ GROUP A ------------------------- */ if (chk_grp_membership(me, &groupA, pid_listA)) { /* group A */ test_one_group(&groupA, pid_listA); } ARMCI_Barrier(); /* ------------------------ GROUP B ------------------------- */ if (chk_grp_membership(me, &groupB, pid_listB)) { /* group B */ test_one_group(&groupB, pid_listB); } ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("O.K.\n"); fflush(stdout); } } /** * Random permutation of 0..n-1 into an array. */ void random_permute(int *arr, int n) { int i, j; int *vtmp = (int *)malloc(n * sizeof(int)); assert(vtmp != NULL); for (i = 0; i < n; ++i) { vtmp[i] = -1; } for (i = 0; i < n; i++) { while (vtmp[j=(rand()%n)] != -1) /*no-op*/; assert(vtmp[j] == -1); vtmp[j] = 0; arr[i] = j; } free(vtmp); } int int_compare(const void *v1, const void *v2) { int i1 = *(int *)v1, i2 = *(int *)v2; if (i1 < i2) { return -1; } if (i1 > i2) { return +1; } return 0; } /** * Test routine for non-collective process group management. This test * should not be used with MPI process group implementation. */ #define GROUP_SIZE 2 #define MAX_GROUPS (MAXPROC/GROUP_SIZE) void test_groups_noncollective() { int *pid_lists[MAX_GROUPS]; int pids[MAXPROC]; int i, nprocs, world_me; ARMCI_Group group; int *my_pid_list = NULL, my_grp_size = 0; int ngrps; ARMCI_Barrier(); nprocs = armci_msg_nproc(); world_me = armci_msg_me(); random_permute(pids, nproc); ngrps = nprocs / GROUP_SIZE; for (i = 0; i < nprocs / GROUP_SIZE; i++) { pid_lists[i] = pids + (i * GROUP_SIZE); } for (i = 0; i < nprocs; i++) { if (pids[i] == world_me) { int grp_id = MIN(i / GROUP_SIZE, ngrps - 1); my_pid_list = pid_lists[grp_id]; if (grp_id == ngrps - 1) { my_grp_size = GROUP_SIZE + (nprocs % GROUP_SIZE); } else { my_grp_size = GROUP_SIZE; } } } qsort(my_pid_list, my_grp_size, sizeof(int), int_compare); ARMCI_Barrier(); /*now create all these disjoint groups and test them in parallel*/ ARMCI_Group_create(my_grp_size, my_pid_list, &group); test_one_group(&group, my_pid_list); ARMCI_Group_free(&group); ARMCI_AllFence(); ARMCI_Barrier(); if (world_me == 0) { printf("O.K.\n"); fflush(stdout); } } int main(int argc, char *argv[]) { armci_msg_init(&argc, &argv); ARMCI_Init_args(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); /* printf("nproc = %d, me = %d\n", nproc, me);*/ if (nproc < MINPROC) { if (0 == me) { printf("Test needs at least %d processors (%d used)\n", MINPROC, nproc); } ARMCI_Barrier(); armci_msg_finalize(); exit(0); } if (nproc > MAXPROC) { if (0 == me) { printf("Test works for up to %d processors (%d used)\n", MAXPROC, nproc); } ARMCI_Barrier(); armci_msg_finalize(); exit(0); } if (me == 0) { printf("ARMCI test program (%d processes)\n", nproc); fflush(stdout); sleep(1); } if (me == 0) { printf("\n Testing ARMCI Groups!\n\n"); fflush(stdout); } test_groups(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\n Collective groups: Success!!\n"); fflush(stdout); } sleep(2); #ifdef ARMCI_GROUP test_groups_noncollective(); ARMCI_AllFence(); ARMCI_Barrier(); if (me == 0) { printf("\n Non-collective groups: Success!!\n"); fflush(stdout); } sleep(2); #endif ARMCI_Barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/testing/ptltest.c0000644000175000017500000000503612662210426014450 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #define FORK_BEFORE_NI_INIT #ifndef FORK_BEFORE_NI_INIT #define FORK_AFTER_NI_INIT #endif #ifndef PMI_SUCCESS #define PMI_SUCCESS 0 #endif extern int PMI_CNOS_Get_nidpid_map(void **); int main(int argc, char **argv, char **envp) { int i, ret, *npes; int num_interfaces; ptl_handle_ni_t nih; ptl_handle_eq_t eqh; ptl_ni_limits_t ptl_limits; pid_t child; ptl_process_id_t rnk, *procid_map; int spv, *spawned = &spv; if ((ret = PtlInit(&num_interfaces)) != PTL_OK) { printf("%s: PtlInit failed: %d\n", FUNCTION_NAME, ret); exit(1); } printf("%s: PtlInit succeeds (%d)\n", FUNCTION_NAME, ret); #ifdef FORK_BEFORE_NI_INIT child = fork(); #endif if ((ret = PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK, PTL_IFACE_SS), PTL_PID_ANY, NULL, &ptl_limits, &nih)) != PTL_OK) { printf("%s: PtlNIInit failed: %d\n", FUNCTION_NAME, ret); /*exit(1);*/ } else { printf("%s: PtlNIInit succeeds (%d)\n", FUNCTION_NAME, ret); } #ifdef FORK_AFTER_NI_INIT child = fork(); #endif if ((ret = PtlEQAlloc(nih, 4096, NULL, &eqh)) != PTL_OK) { printf("%s: PtlEQAlloc failed: %d(%d)\n", FUNCTION_NAME, ret, child); exit(1); } printf("%s: PtlEQAlloc succeeds (%d:%d)\n", FUNCTION_NAME, child, ret); #if 1 if (child) { MPI_Init(&argc, &argv); } if (child) { PMI_Init(spawned); printf("\n%d:spanwned=%d", child, *spawned); if ((ret = PMI_Get_size(npes)) != PMI_SUCCESS) { printf("%s: PMI_Get_size failed: %d\n", FUNCTION_NAME, ret); /*exit(1);*/ } else { printf("%s: PMI_Get_size succeeds (%d)\n", FUNCTION_NAME, *npes); } /*procid_map = (ptl_process_id_t *)malloc(sizeof(ptl_process_id_t)*(*npes)); if(procid_map==NULL)exit(1);*/ if ((ret = PMI_CNOS_Get_nidpid_map(&procid_map)) != PMI_SUCCESS) { printf("Getting proc map failed (npes=%d)\n", *npes); } for (i = 0; i < *npes; i++) { printf("\npid=%d nid=%d npes=%d(%d)", procid_map[i].pid, procid_map[i].nid, *npes, child); } } #endif if ((ret = PtlGetId(nih, &rnk)) != PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n", FUNCTION_NAME, ret, child); exit(1); } printf("%s: nid=%d pid=%d(%d)\n", FUNCTION_NAME, rnk.nid, rnk.pid, child); if (child) { MPI_Finalize(); printf("%s: mpi_init and finalize succeed(%d)\n", FUNCTION_NAME, child); } } ga-5-4/armci/NEWS0000644000175000017500000000000012662210426011611 0ustar mbambaga-5-4/armci/examples/0000755000175000017500000000000012662210433012740 5ustar mbambaga-5-4/armci/examples/simpleApps/0000755000175000017500000000000012662210433015055 5ustar mbambaga-5-4/armci/examples/simpleApps/transp1D-c.c0000644000175000017500000001455012662210433017142 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * transpose of 1-d array. * E,g: (1 2 3 4 5 6 7 8 9 10) => (10 9 8 7 6 5 4 3 2 1) */ #define TOTALELEMS 1007031 #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_WINDOWS_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ASSERT_H # include #endif #include #include "armci.h" #include "message.h" void VERIFY(void **b_ptr, int *dims, int *map) { int i, j, length, icnt, ichk, lmin, lmax; int *buf, *b; void *src_ptr, *dst_ptr; int me, nprocs; /* Find local processor ID and number of processors */ me = armci_msg_me(); nprocs = armci_msg_nproc(); /* Process 0 verifies that inversion is correct. Start by allocating buffer and guarantee that it is big enough */ length = (int)(((double)dims[0])/((double)nprocs)) + 1; buf = (int*)malloc(length*sizeof(int)); if (me == 0) { icnt = 0; ichk = 0; for (i=0; i= map[i]) { pmin = i; } else { break; } } pmax = nprocs-1; for (i=nprocs-2; i>=0; i--) { if (max < map[i+1]) { pmax = i; } else { break; } } /* Loop over processors that will receive data and copy inverted data to processors */ for (i=pmin; i<=pmax; i++) { /* Find min and max indices owned by processor i */ lmin = map[i]; if (i min) { cmin = lmin; } else { cmin = min; } if (lmax < max) { cmax = lmax; } else { cmax = max; } /* Find offsets on source and destination processors */ src_offset = cmin - min; src_ptr = (void*)(buf + src_offset); dst_offset = cmin - lmin; dst_ptr = ((char*)b_ptr[i]) + sizeof(int)*dst_offset; /* Find length of data (in bytes) to be sent to processor i */ length = sizeof(int)*(cmax-cmin+1); /* Send data to processor */ ARMCI_Put(src_ptr, dst_ptr, length, i); } ARMCI_AllFence(); armci_msg_barrier(); free(buf); VERIFY(b_ptr, dims, map); free(map); armci_msg_barrier(); ARMCI_Free(a_ptr[me]); ARMCI_Free(b_ptr[me]); free(a_ptr); free(b_ptr); } int main(int argc, char **argv) { /* int heap=300000, stack=300000; */ int me, nprocs; /* Step1: Initialize Message Passing library */ armci_msg_init(&argc, &argv); /* Step2: Initialize ARMCI */ ARMCI_Init(); /* Step3: Initialize Memory Allocator (MA) */ /*bjp if(! MA_init(C_DBL, stack, heap) ) ARMCI_Error("MA_init failed",stack+heap); */ me = armci_msg_me(); nprocs = armci_msg_nproc(); if(me==0) { printf("\nUsing %d processes\n\n", nprocs); fflush(stdout); } TRANSPOSE1D(); if(me==0)printf("\nTerminating ..\n"); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/examples/features/0000755000175000017500000000000012662210434014557 5ustar mbambaga-5-4/armci/examples/features/aggregation/0000755000175000017500000000000012662210434017046 5ustar mbambaga-5-4/armci/examples/features/aggregation/README0000644000175000017500000000642012662210434017730 0ustar mbambaIntroduction ============ ARMCI has support for aggregating messages via its aggregate non-blocking handles. Any ARMCI non-blocking handle can be explicitly made as an aggregate handle and all subsequent messages that use the same handle are aggregated and sent as a single message. The details of the implementation can be found in the cluster 2003 paper from the ARMCI publications website. Description ============ The implicit aggregation of data transfers is implemented using the generalized I/O vector operations available in ARMCI. This interface enables the representation of a data transfer as a combination of multiple sets of equally sized contiguous data segments. When the first call involving aggregate nonblocking handle is executed, the library starts building a vector descriptor stored in one of the preallocated internal buffers. The actual data transfer takes place when the user calls wait operation or the buffer storing the vector descriptor fills up. Function Definitions ==================== ARMCI_SET_AGGREGATE_HANDLE (armci_hdl_t* handle) ------------------------------------------------ handle - Pointer to a desciptor associated with a particular non-blocking transfer. PURPOSE: Mark a handle as aggregate. This will allow ARMCI to combine nonblocking operations that use that particular handle and process them as a single operation. In the initial implementation only contiguous puts or gets could use aggregate handle. Specifying the same handle for a mix of put anmd get calls is not allowed i.e., only multiple put or only multiple get calls can use the same handle. ARMCI_UNSET_AGGREGATE_HANDLE (armci_hdl_t* handle) -------------------------------------------------- handle - Pointer to a desciptor associated with a particular non-blocking transfer. PURPOSE: Clears a handle that has been marked as aggregate. Sample Programs =============== 1. Sparse matrix-vector multiplication Sparse matrix-vector multiplication is one of the common computational kernels, for example in solving linear systems using conjugate gradient method. It is described as Ax = b, where A is an nxn nonsingular sparse matrix, b is an n-dimensional vector, and x is an n-dimensional vector of unknowns. In this benchmark, one of the sparse matrices (Figure 8a) from the Harwell-Boeing collection is used [9] to test the matrix-vector multiplication. The sparse matrix size is 41092 and has 1683902 (~.1%) nonzero elements. The experiments were conducted on the Linux cluster (dual node, 1GHz Itanium-2, Myrinet-2000 interconnect) at PNNL. Sparse matrix-vector multiplication was done with aggregation enabled and disabled. The sparse matrix and the vector are distributed among processors. Instead of gathering the entire vector, each process caches the vector elements corresponding to the non-zero element columns of its locally owned part of the matrix. When aggregation is enabled, all the get calls corresponding to a single processor are aggregated into a single request, thus reducing the overall latency and improving the data transfer rate. This sample program is in the sparse_matvecmul directory. There is an input required for this program. The method to obtain the input is given in the sparse_matvecmul directory in a README file ga-5-4/armci/examples/features/aggregation/sparse_matvecmul/0000755000175000017500000000000012662210433022417 5ustar mbambaga-5-4/armci/examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.c0000644000175000017500000003161112662210433026137 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id$ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #if HAVE_ASSERT_H # include #endif #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) #define ROW 65536 #define COL ROW /* square matrices only for the time being */ /***************************** global data *******************/ int me, nproc; short int fortran_indexing=0; static int proc_row_list[MAXPROC];/*no of rows owned by each process - accumulated*/ static int proc_nz_list[MAXPROC]; /*no of non-zeros owned by each process */ #ifdef MSG_COMMS_PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if((argc != 2) && (argc != 1)) goto usage; if(argc == 1) np = 1; if(argc == 2) if((np = atoi(argv[1])) < 1) goto usage; if(np > MAXPROC) goto usage; mygid = pvm_joingroup(MPGROUP); if(np > 1) if (mygid == 0) i = pvm_spawn(argv[0], argv+1, 0, "", np-1, ctid); while(pvm_gsize(MPGROUP) < np) sleep(1); /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif void create_array(void *a[], int elem_size, int ndim, int dims[]) { int bytes=elem_size, i, rc; assert(ndim<=MAXDIMS); for(i=0;i= local_nz_acc) { proc_row_list[proc_id++] = i+1; local_nz_acc = local_nz*(proc_id+1); if(proc_id == nproc-1) local_nz_acc = non_zero; if(me==0 && proc_id ROW) ARMCI_Error("order is greater than defined variable ROW", ROW); } len = sizeof(int); armci_msg_brdcst(n, len, 0); /* Broad cast number of non_zeros */ if(me==0) fscanf(fp, "%d", non_zero); armci_msg_brdcst(non_zero, len, 0); /* Broadcast row indices */ len = (*n+1)*sizeof(int); row_ind_tmp = (int *)malloc(len); if(me==0)for(i=0; i<*n+1; i++) { fscanf(fp, "%d", &row_ind_tmp[i]); if(fortran_indexing) --row_ind_tmp[i]; } armci_msg_brdcst(row_ind_tmp, len, 0); load_balance(*n, *non_zero, row_ind_tmp); /* find how much temporary storage is needed at the maximum */ if(me==0) { for(max=-1,j=0;j j) return (1); if (i < j) return (-1); return (0); } static int count = -1; static armci_hdl_t gHandle[MAXPROC]; static int prev_proc = -1; static void get_data(int n, int start, int end, double *vec_local, double **vec) { int i, j, rc, bytes, offset; int proc_start, proc_end, idx_start, idx_end; proc_start = proc_end = -1; for(i=0; istart) proc_start = i; if(proc_end<0 && proc_row_list[i]>end) proc_end = i; } if(proc_start<0 || proc_end<0) ARMCI_Error("Invalid Process Ids", -1); for(i=proc_start; i<=proc_end; i++) { if(i==proc_start) idx_start = start; else { if(i==0) idx_start=0; else idx_start = proc_row_list[i-1];} if(i==proc_end) idx_end = end; else idx_end = proc_row_list[i]-1; if(i!=prev_proc) { ++count; prev_proc = i; ARMCI_INIT_HANDLE(&gHandle[count]); ARMCI_SET_AGGREGATE_HANDLE(&gHandle[count]); } if(i==0) offset=0; else offset = proc_row_list[i-1]; if(i==me) { /* local */ for(j=idx_start; j<=idx_end; j++) vec_local[j] = vec[me][j-offset]; } else { /* remote */ bytes = (idx_end-idx_start+1)*sizeof(double); vec_local[idx_start] = -1; #if 0 if((rc=ARMCI_Get(&vec[i][idx_start-offset], &vec_local[idx_start], bytes, i))) #else if((rc=ARMCI_NbGet(&vec[i][idx_start-offset], &vec_local[idx_start], bytes, i, &gHandle[count]))) #endif ARMCI_Error("armci_nbget failed\n",rc); } } } static void sparse_multiply(int n, int non_zero, int *row_ind, int **col_ind, double **values, double **vec, double **svec) { int i, j, k, num_elements, offset, *tmp_indices; double start_time, comm_time, comp_time, v, vec_local[COL]; int start, end, prev, nrows, idx; #if 0 /* ---- Sequential Case ---- */ for(i=0; iprev+1) { end = prev; get_data(n, start, end, vec_local, vec); start = prev = tmp_indices[i]; } else prev = tmp_indices[i]; } get_data(n, start, prev, vec_local, vec); #if 1 if(count>=0) for(i=0; i<=count; i++) ARMCI_Wait(&gHandle[i]); #endif comm_time = armci_timer() - start_time; start_time = armci_timer(); /* Perform Matrix-Vector multiply and store the result in solution vector - "svec[]" */ if(me==0) { nrows = proc_row_list[me]; offset = row_ind[0]; } else { nrows = proc_row_list[me]-proc_row_list[me-1]; offset = row_ind[proc_row_list[me-1]]; } /* printf("%d: My total Work = %d\n", me, nrows); */ for(i=0; iMAXPROC && me==0) ARMCI_Error("Test works for up to %d processors\n",MAXPROC); if(me==0){ printf("ARMCI test program (%d processes)\n",nproc); fflush(stdout); sleep(1); } ARMCI_Init(); if(me==0){ printf("\n Performing Sparse Matrix-Vector Multiplication ...\n\n"); fflush(stdout); } test_sparse(); ARMCI_AllFence(); armci_msg_barrier(); if(me==0){printf("\nSuccess!!\n"); fflush(stdout);} sleep(2); armci_msg_barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/examples/features/aggregation/simple/0000755000175000017500000000000012662210433020336 5ustar mbambaga-5-4/armci/examples/features/aggregation/simple/simple.c0000644000175000017500000002243212662210433021776 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: simple.c,v 1.1.2.1 2007-06-20 17:41:40 vinod Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #if HAVE_ASSERT_H # include #endif #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void* work[MAXPROC]; /* work array for propagating addresses */ #ifdef MSG_COMMS_PVM void pvm_init(int argc, char *argv[]) { int mytid, mygid, ctid[MAXPROC]; int np, i; mytid = pvm_mytid(); if((argc != 2) && (argc != 1)) goto usage; if(argc == 1) np = 1; if(argc == 2) if((np = atoi(argv[1])) < 1) goto usage; if(np > MAXPROC) goto usage; mygid = pvm_joingroup(MPGROUP); if(np > 1) if (mygid == 0) i = pvm_spawn(argv[0], argv+1, 0, "", np-1, ctid); while(pvm_gsize(MPGROUP) < np) sleep(1); /* sync */ pvm_barrier(MPGROUP, np); printf("PVM initialization done!\n"); return; usage: fprintf(stderr, "usage: %s \n", argv[0]); pvm_exit(); exit(-1); } #endif void create_array(void *a[], int elem_size, int ndim, int dims[]) { int bytes=elem_size, i, rc; assert(ndim<=MAXDIMS); for(i=0;i 0.1) { ARMCI_Error("aggregate put failed...1", 0); } } armci_msg_barrier(); if(!dryrun)if(me==0) printf("\n aggregate put ..O.K.\n"); fflush(stdout); if(me==0) { for(i=1; i 0.1) { ARMCI_Error("aggregate get failed...1", 0); } } } } armci_msg_barrier(); if(!dryrun)if(me==0) printf(" aggregate get ..O.K.\n"); fflush(stdout); ARMCI_AllFence(); armci_msg_barrier(); if(!dryrun)if(me==0){printf("O.K.\n"); fflush(stdout);} destroy_array((void **)ddst_put); destroy_array((void **)ddst_get); destroy_array((void **)dsrc); } int main(int argc, char* argv[]) { armci_msg_init(&argc, &argv); nproc = armci_msg_nproc(); me = armci_msg_me(); /* printf("nproc = %d, me = %d\n", nproc, me);*/ if(nproc>MAXPROC && me==0) ARMCI_Error("Test works for up to %d processors\n",MAXPROC); if(me==0){ printf("ARMCI test program (%d processes)\n",nproc); fflush(stdout); sleep(1); } ARMCI_Init(); if(me==0){ printf("\nAggregate put/get requests\n\n"); fflush(stdout); } test_aggregate(1); /* cold start */ test_aggregate(0); /* warm start */ ARMCI_AllFence(); armci_msg_barrier(); if(me==0){printf("\nSuccess!!\n"); fflush(stdout);} sleep(2); armci_msg_barrier(); ARMCI_Finalize(); armci_msg_finalize(); return(0); } ga-5-4/armci/examples/features/symmetric_memory/0000755000175000017500000000000012662210433020162 5ustar mbambaga-5-4/armci/examples/features/symmetric_memory/simple/0000755000175000017500000000000012662210433021453 5ustar mbambaga-5-4/armci/examples/features/symmetric_memory/simple/simple.c0000644000175000017500000000024012662210433023104 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: simple.c,v 1.1.2.1 2007-06-20 17:42:20 vinod Exp $*/ int main(int argc, char **argv) { return 0; } ga-5-4/armci/examples/features/non-blocking/0000755000175000017500000000000012662210433017136 5ustar mbambaga-5-4/armci/examples/features/non-blocking/overlap/0000755000175000017500000000000012662210433020606 5ustar mbambaga-5-4/armci/examples/features/non-blocking/overlap/overlap.c0000644000175000017500000007015612662210433022433 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * Copyright (c) 2006 * Pacific Northwest National Laboratory, * Battelle Memorial Institute. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Battelle nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 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. * * $Id$ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDARG_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #include #include "armci.h" #include "message.h" extern double exp2(double); extern double round(double); extern double log2(double); #define NDEBUG /*#define LOG2FILE*/ typedef int t_elem; /* type of an array element */ #define SIZE_ELEM sizeof(t_elem) #define STRIDE_OFF (SIZE_ELEM * 4 - 1) #define MIN_MSG_SIZE 8 #define MAX_MSG_SIZE (1024 * 1024) #define MSG_COUNT 20 int armci_error_code; #define ARMCI_ASSERT(error_code) if ((armci_error_code = error_code)) { \ fprintf(stderr, "ARMCI error %d\n", armci_error_code);pause(); \ ARMCI_Cleanup(); MPI_Abort(MPI_COMM_WORLD, armci_error_code); } #define FIX_TIME(t) if (t < 0.0) t = 0.0; int size, rank, second; #define ITERS 18 #define ITER_STEPS 20 double iterations_times[ITERS]; int iterations[ITERS]; int *p_srcs, *p_dsts; enum {CONT_PUT, CONT_GET, STRIDED_PUT, STRIDED_GET, STRIDED_ACC, VECTOR_PUT, VECTOR_GET, VECTOR_ACC}; #define OPS_COUNT (STRIDED_ACC + 1) #define NON_CONT(op) (op > CONT_GET) enum {NOWORK, TOTAL, OVERLAP}; #define STATS_COUNT (OVERLAP + 1) /* prints formatted numbered message with processor's rank */ int log_debug(const char *fmt, ...) { int r = 0; #ifndef NDEBUG static int log_counter = 1; va_list ap; va_start(ap, fmt); printf("%03d@%1d: ", log_counter++, rank); r = vprintf(fmt, ap); va_end(ap); #endif return r; } FILE *log_file = NULL; void start_logging(const char *fname) { #ifdef LOG2FILE char exe_name[255]; char log_path[255]; int i; char k; strcpy(exe_name, fname); if (exe_name[strlen(exe_name) - 2] == '.') /* remove .x */ exe_name[strlen(exe_name) - 2] = 0; if (exe_name[0] == '/') { /* full path given */ for (i = ((int)strlen(exe_name)) - 1, k = -1; i >= 0; i--) if (exe_name[i] == '/') { if (k == -1) k = i + 1; else { exe_name[i] = 0; break; } } log_debug("exe: path=%s, name=%s\n", exe_name, exe_name + k); sprintf(log_path, "%s/data/%s.dat", exe_name, exe_name + k); } else { /* only executable name */ sprintf(log_path, "../data/%s.dat", exe_name); } log_debug("log: %s\n", log_path); log_file = fopen(log_path, "w"); if (!log_file) { perror("cannot open log file"); abort(); } #else log_file = stderr; #endif } void finish_logging() { fclose(log_file); } /* prints formatted message to ../data/.dat */ int log_printf(const char *fmt, ...) { va_list ap; int r; va_start(ap, fmt); if (log_file) r = vfprintf(log_file, fmt, ap); else { fprintf(stderr, "warning: logging is not enabled for this process\n"); r = vfprintf(stderr, fmt, ap); } va_end(ap); return r; } /* computes approximate time of n iterations for variable n */ void time_iterations() { double time_start, time_after_start, time_stop; int i, j, k, l; for (i = 0, j = 1; i < ITERS; i++, j *= 2) { time_start = armci_timer(); time_after_start = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_stop = armci_timer(); iterations_times[i] = time_stop - time_after_start + time_start - time_after_start; FIX_TIME(iterations_times[i]); iterations[i] = j; log_debug("it takes %.8f sec to iterate %d times\n", iterations_times[i], iterations[i]); } } /* computes useful overlap time for contiguous/vector/strided arrays * * op - operation * * msg_size - size of a message/ 1st dimension (bytes) * * size2 - not used for contiguous arrays * * - size of 2nd dimension for strided arrays (bytes) * * - # of vector segments for vectors * * returns pointer to static array of stats (STATS_COUNT doubles) * */ double * benchmark(int op, int msg_size, int size2) { static double stats[STATS_COUNT]; /* return statistics in static array */ void **array_ptrs; int stride_dist, block_sizes[2], scale = 2; int i=0, j=0, k=0, l=0, less=0, more=0; double time_start=0, time_after_start=0, time_after_call=0, time_after_work=0, time_after_wait=0; double time2call_nw=0, time2wait_nw = 1.0, time_total_nw=0; double time2call_fw, time2work_fw, time2wait_fw, time_total_fw; armci_hdl_t handle; array_ptrs = malloc(sizeof(void*)*size); log_debug("barrier O\n"); armci_msg_barrier(); /* initialize: obtain remote address and generate random array */ switch (op) { case CONT_PUT: case CONT_GET: ARMCI_ASSERT(ARMCI_Malloc(array_ptrs, msg_size)); for (i = 0; i < msg_size; i++) ((char *)array_ptrs[rank])[i] = (char)(rand() >> 24); break; /* 2D strided array of ints */ case STRIDED_PUT: case STRIDED_GET: case STRIDED_ACC: block_sizes[0] = msg_size; block_sizes[1] = size2; stride_dist = STRIDE_OFF + msg_size; log_debug("strided: dim1 = %d (%d bytes), dim2 = %d, stride = %d\n", msg_size / SIZE_ELEM, msg_size, size2, stride_dist); ARMCI_ASSERT(ARMCI_Malloc(array_ptrs, (size2 - 1) * stride_dist + msg_size)); for (i = 0; i < size2; i++) for (j = 0; j < (msg_size / ((int)SIZE_ELEM)); j++) { l = stride_dist * i + SIZE_ELEM * i; *(int *)((char *)array_ptrs[rank] + l) = rand(); } break; } /* warm up call */ log_debug("barrier A\n"); armci_msg_barrier(); if (second != -1) { log_debug("testing message size %d bytes\n", msg_size); switch (op) { case CONT_PUT: ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPut(array_ptrs[rank], array_ptrs[second], msg_size, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case CONT_GET: ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGet(array_ptrs[second], array_ptrs[rank], msg_size, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_PUT: ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPutS(array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_GET: ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGetS(array_ptrs[second], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_ACC: ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbAccS(ARMCI_ACC_INT, &scale, array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; } time2call_nw = time_after_call - time_after_start + time_start - time_after_start; time2wait_nw = time_after_wait - time_after_call + time_start - time_after_start; time_total_nw = time_after_wait - time_after_start + time_start - time_after_start; log_debug("time (warm up): %.8f call, %.8f wait, %.8f total\n", time2call_nw, time2wait_nw, time_total_nw); } log_debug("barrier B\n"); armci_msg_barrier(); if (second != -1) { /* no work */ ARMCI_INIT_HANDLE(&handle); switch (op) { case CONT_PUT: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPut(array_ptrs[rank], array_ptrs[second], msg_size, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case CONT_GET: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGet(array_ptrs[second], array_ptrs[rank], msg_size, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_PUT: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPutS(array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_GET: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGetS(array_ptrs[second], &stride_dist, array_ptrs[rank], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_ACC: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbAccS(ARMCI_ACC_INT, &scale, array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; } time2call_nw = time_after_call - time_after_start + time_start - time_after_start; FIX_TIME(time2call_nw); time2wait_nw = time_after_wait - time_after_call + time_start - time_after_start; FIX_TIME(time2wait_nw); time_total_nw = time_after_wait - time_after_start + time_start - time_after_start; FIX_TIME(time_total_nw); log_debug("time (no work): %.8f call, %.8f wait, %.8f total\n", time2call_nw, time2wait_nw, time_total_nw); } /* only perform tests if wait time is not 0 */ if (time2wait_nw > 0.0) { /* time2wait_nw is always 1.0 on seconds (receiving nodes) */ double overlaps[ITER_STEPS], totals[ITER_STEPS]; if (second != -1) { /* compute approximate range of iterations */ less = 0, more = iterations[ITERS - 1]; assert(time2wait_nw < iterations_times[ITERS - 1]); for (i = 0; i < ITERS; i++) if (time2wait_nw > iterations_times[i]) less = iterations[i]; else break; for (i = 0; i < ITERS; i++) if (time2wait_nw < iterations_times[ITERS - i - 1]) more = iterations[ITERS - i - 1]; else break; log_debug("wait time (%.8f) is between %d and %d iterations\n", time2wait_nw, less, more); } /* benchmark ITER_STEPS steps within computed range */ for (i = 0, j = less; i < ITER_STEPS; i++, j += (more - less) / (ITER_STEPS - 1)) { /* time noneblocking call with j interations of fake work */ log_debug("barrier C\n"); armci_msg_barrier(); if (second != -1) { ARMCI_INIT_HANDLE(&handle); switch (op) { case CONT_PUT: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPut(array_ptrs[rank], array_ptrs[second], msg_size, second, &handle)); time_after_call = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_after_work = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case CONT_GET: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGet(array_ptrs[second], array_ptrs[rank], msg_size, second, &handle)); time_after_call = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_after_work = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_PUT: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPutS(array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_after_work = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_GET: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGetS(array_ptrs[second], &stride_dist, array_ptrs[rank], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_after_work = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; case STRIDED_ACC: time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbAccS(ARMCI_ACC_INT, &scale, array_ptrs[rank], &stride_dist, array_ptrs[second], &stride_dist, block_sizes, 1, second, &handle)); time_after_call = armci_timer(); for (l = 0, k = rand(); l < j; l++) k *= rand(); time_after_work = armci_timer(); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); break; } time2call_fw = time_after_call - time_after_start + time_start - time_after_start; FIX_TIME(time2call_fw); time2work_fw = time_after_work - time_after_call + time_start - time_after_start; FIX_TIME(time2work_fw); time2wait_fw = time_after_wait - time_after_work + time_start - time_after_start; FIX_TIME(time2wait_fw); time_total_fw = time_after_wait - time_after_start + time_start - time_after_start; FIX_TIME(time_total_fw); log_debug("time (%d iters): %.8f call, %.8f work, " "%.8f wait %.8f total\n", j, time2call_fw, time2work_fw, time2wait_fw, time_total_fw); overlaps[i] = time2work_fw; totals[i] = time_total_fw; } } /* pick overlap with closest total (less or equal) */ if (second != -1) { double closest_total, closest_overlap; double smallest_total = totals[ITER_STEPS - 1], smallest_overlap = overlaps[ITER_STEPS - 1]; for (i = ITER_STEPS - 1; i >= 0; i--) { closest_total = totals[i]; closest_overlap = overlaps[i]; if (closest_total < smallest_total) { smallest_total = closest_total; smallest_overlap = closest_overlap; } if (closest_total <= time_total_nw) break; } if (closest_total > time_total_nw) { closest_total = smallest_total; closest_overlap = smallest_overlap; } stats[NOWORK] = time_total_nw; stats[TOTAL] = closest_total; stats[OVERLAP] = closest_overlap; } } else { if (second != -1) { for (i = 0; i < ITER_STEPS; i++) { log_debug("barrier C0\n"); armci_msg_barrier(); } stats[NOWORK] = time_total_nw; stats[TOTAL] = 0; stats[OVERLAP] = 0; } } ARMCI_ASSERT(ARMCI_Free(array_ptrs[rank])); free(array_ptrs); log_debug("barrier D\n"); armci_msg_barrier(); return stats; } int main (int argc, char *argv[]) { int i, j, k, l; double u; char buf[255]; int dist, pos, time_seed; int msg_sizes[MSG_COUNT], dim1_sizes[MSG_COUNT], dim2[MSG_COUNT], mul_elem; double *stats=NULL, *stats_all=NULL; double from_log = log2(MIN_MSG_SIZE); double to_log = log2(MAX_MSG_SIZE); double step_log = (to_log - from_log) / (MSG_COUNT - 1); armci_msg_init(&argc, &argv); rank = armci_msg_me(); size = armci_msg_nproc(); assert((size & 1) ^ 1); /* works with even number of processors only */ log_debug("Message passing initialized\n"); ARMCI_ASSERT(ARMCI_Init()); log_debug("ARMCI initialized\n"); if (!rank) start_logging(argv[0]); /* generate MSG_COUNT message sizes MIN_MSG_SIZE thru MAX_MSG_SIZE */ for (i = 0, u = from_log; i < MSG_COUNT; i++, u += step_log) { mul_elem = round(exp2(u)); msg_sizes[i] = mul_elem % ((int)SIZE_ELEM) ? (mul_elem / ((int)SIZE_ELEM) + 1) * ((int)SIZE_ELEM) : mul_elem; /* multiple of SIZE_ELEM */ } /* generate MSG_COUNT respective dim1 sizes and dim2 for strided */ for (i = 0; i < MSG_COUNT; i++) { mul_elem = msg_sizes[i] / SIZE_ELEM; mul_elem = sqrt(2.0 * mul_elem); dim1_sizes[i] = mul_elem * SIZE_ELEM; dim2[i] = mul_elem / 2; } /* print msg_sizes and appropriate derivatives (debug mode only) */ if (!rank) { log_debug("msg_sizes:\n"); for (i = 0; i < MSG_COUNT; i++) log_debug("cont: %d bytes | strided: %d bytes X %d\n", msg_sizes[i], dim1_sizes[i], dim2[i]); } /* inialize PRNG, use seed generated on processor 0 for uniform sequence */ time_seed = time(NULL); MPI_Bcast(&time_seed, 1, MPI_INT, 0, MPI_COMM_WORLD); srand(time_seed); rand(); log_debug("seed: %d\n", time_seed); /* generate random pairs of processors */ #define HALFSIZE (size / 2) assert(p_srcs = malloc(sizeof(int) * size)); for (i = 0; i < size; i++) p_srcs[i] = -1; p_dsts = p_srcs + HALFSIZE; for (i = 0, j = size - 1, pos = 0; i < size; i++, j--) { dist = round((double)rand() * j / RAND_MAX + 1); /* random 1..j */ for (l = 0; l < dist; ) { pos = (pos + 1 == size) ? 0 : pos + 1; if ((p_srcs[pos] == -1) && (pos != i)) l++; } p_srcs[pos] = i; } for (i = 0, j = 0; i < HALFSIZE; i++) j += sprintf(buf + j, " %d->%d", p_srcs[i], p_dsts[i]); log_debug("random pairs:%s\n", buf); /* time interations: 1 thru ITERS */ time_iterations(); /* determine if processor initiates communication and where it sends to, * * -1 for second(receiver) */ second = -1; for (i = 0; i < HALFSIZE; i++) if (p_srcs[i] == rank) second = p_dsts[i]; log_debug("second: %d\n", second); /* allocate memory for statisticis */ #define MSG_OFF (STATS_COUNT * size) #define OPS_OFF (MSG_OFF * MSG_COUNT) assert(stats_all = malloc(OPS_COUNT * OPS_OFF * sizeof(double))); for (i = 0; i < OPS_COUNT; i++) for (j = 0; j < MSG_COUNT; j++) { switch (i) { case CONT_PUT: case CONT_GET: stats = benchmark(i, msg_sizes[j], 0); log_debug("stats: %8d | %.8f | %.8f | %.8f | %.2f\n", msg_sizes[j], stats[NOWORK], stats[TOTAL], stats[OVERLAP], 100.0 * stats[OVERLAP] / stats[TOTAL]); break; case STRIDED_PUT: case STRIDED_GET: case STRIDED_ACC: stats = benchmark(i, dim1_sizes[j], dim2[j]); log_debug("stats: %8d | %.8f | %.8f | %.8f | %.2f\n", dim1_sizes[j] * dim2[j], stats[NOWORK], stats[TOTAL], stats[OVERLAP], 100.0 * stats[OVERLAP] / stats[TOTAL]); break; } MPI_Gather(stats, STATS_COUNT, MPI_DOUBLE, stats_all + i * OPS_OFF + j * MSG_OFF, STATS_COUNT, MPI_DOUBLE, 0, MPI_COMM_WORLD); } if (!rank) for (l = 0; l < HALFSIZE; l++) { /* interate thru pairs */ log_printf("for pair of processors %d -> %d:\n", p_srcs[l], p_dsts[l]); for (i = 0; i < OPS_COUNT; i++) { /* iterate thru operations */ switch (i) { case CONT_PUT: log_printf("ARMCI_NbPut\n"); break; case CONT_GET: log_printf("ARMCI_NbGet\n"); break; case STRIDED_PUT: log_printf("ARMCI_NbPutS\n"); break; case STRIDED_GET: log_printf("ARMCI_NbGetS\n"); break; case STRIDED_ACC: log_printf("ARMCI_NbAccS\n"); break; } log_printf("msg size | nowork | total | overlap |" " ratio\n"); log_printf("---------+------------+------------+------------+" "------\n"); for (j = 0; j < MSG_COUNT; j++) { /* iterate thru msg sizes */ k = i * OPS_OFF + j * MSG_OFF + p_srcs[l] * STATS_COUNT; log_printf("%8d | %.8f | %.8f | %.8f | %.2f\n", NON_CONT(i) ? dim1_sizes[j] * dim2[j]: msg_sizes[j], stats_all[k + NOWORK], stats_all[k + TOTAL], stats_all[k + OVERLAP], (stats_all[k + NOWORK] < stats_all[k + TOTAL]) || (stats_all[k + TOTAL] <= 0.0) ? 0 : 100.0 * stats_all[k + OVERLAP] / stats_all[k + TOTAL]); } log_printf("\n"); } } if (!rank) finish_logging(); ARMCI_Finalize(); armci_msg_finalize(); free(p_srcs); free(stats_all); return 0; } ga-5-4/armci/examples/features/non-blocking/README0000644000175000017500000000421212662210433020015 0ustar mbambaNonblocking operations initiate a communication call and then return control to the application. The user who wishes to exploit nonblocking communication as a technique for latency hiding by overlapping communication with computation implicitly assumes that progress in communication can be made in a purely computational phase of the program execution when no communication calls are made. All the non-blocking transfer functions are prototyped to work as transfers with both "explicit" and "implicit handle". It stores important information about the initiated data transfer. The descriptor is implemented as an abstract data type. This is motivated by a simpler implementation so that a data transfer descriptor can be stored and managed in the application rather in the ARMCI library space. If a NULL value is passed to the argument representing a handle (thus representing "implicit handle"), the function does an implicit handle non-blocking transfer. A request data structure embedded in the handle should not be copied in the application. Upon completion of the data transfer, handle can be reused. A handle can be used to represent multiple operations of the same type (i.e., all puts or all gets). Such handle is an aggregate handle. Underneath, ARMCI combines multiple requests and processes them as a single message (actually by calling ARMCI_PutV/GetV/AccV). An explict handle should be initialized using the following macro, before it is used in any non-blocking operation. It is initialized as follows: - ARMCI_INIT_HANDLE(armci_hdl_t* nb_handle) Nonblocking operations in ARMCI allow user ot initiate a one-sided call and then return control to the user program. The data transfer is completed locally by calling a wait operation. Waiting on a nonblocking put operation assures was injected into the network and the user buffer can be now reused. Both in case of blocking and nonblocking store operations, to access the modified data safely from other nodes programmer has to call an ARMCI_Fence call first. ARMCI_Fence completes data transfers on the remote side. Unlike the blocking operation, the nonblocking operations are NOT ordered. ga-5-4/armci/examples/features/non-blocking/simple/0000755000175000017500000000000012662210433020427 5ustar mbambaga-5-4/armci/examples/features/non-blocking/simple/simple.c0000644000175000017500000000322512662210433022066 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id$ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #include "armci.h" #include "message.h" int me,nprocs; int LOOP=10; int main(int argc, char **argv) { int i; double **myptrs; double t0,t1,tnbget=0,tnbwait=0,t2=0; armci_msg_init(&argc,&argv); nprocs = armci_msg_nproc(); if (nprocs==1) { fprintf(stderr,"You must use more than 1 process for this test. Exiting gently."); return 0; } me = armci_msg_me(); myptrs = (double **)malloc(sizeof(double *)*nprocs); ARMCI_Init(); ARMCI_Malloc((void **)myptrs,LOOP*sizeof(double)); armci_msg_barrier(); if(me==0){ for(i=0;i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDARG_H # include #endif #ifdef WINDOWS_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_ASSERT_H # include #endif #include #include "armci.h" #include "message.h" #define NDEBUG /*#define LOG2FILE*/ typedef int t_elem; /* type of an array element */ #define SIZE_ELEM sizeof(t_elem) /* # of simultaneous message for phase A*/ #define SML_MSGS (size < 9 ? size - 1 : 8) #define MIN_MSG_SIZE 8 #define MAX_MSG_SIZE (1024 * 1024) #define MSG_COUNT 20 static inline void ARMCI_ASSERT(int error_code) { if (error_code) { fprintf(stderr, "ARMCI error %d\n", error_code); pause(); ARMCI_Cleanup(); MPI_Abort(MPI_COMM_WORLD, error_code); } } #define FIX_TIME(t) if (t < 0.0) t = 0.0; int size, rank, second; #define ITERS 18 #define ITER_STEPS 20 double iterations_times[ITERS]; int iterations[ITERS]; int *p_srcs, *p_dsts; enum {CONT_PUT, CONT_GET, STRIDED_PUT, STRIDED_GET, STRIDED_ACC, VECTOR_PUT, VECTOR_GET, VECTOR_ACC}; #define OPS_COUNT (STRIDED_ACC + 1) #define NON_CONT(op) (op > CONT_GET) enum {NOWORK, TOTAL, OVERLAP}; #define STATS_COUNT (OVERLAP + 1) /* prints formatted numbered message with processor's rank */ int log_debug(const char *fmt, ...) { int r = 0; #ifndef NDEBUG static int log_counter = 1; va_list ap; va_start(ap, fmt); printf("%03d@%1d: ", log_counter++, rank); r = vprintf(fmt, ap); va_end(ap); #endif return r; } FILE *log_file = NULL; void start_logging(const char *fname) { #ifdef LOG2FILE char exe_name[255]; char log_path[255]; int i; char k; strcpy(exe_name, fname); if (exe_name[strlen(exe_name) - 2] == '.') /* remove .x */ exe_name[strlen(exe_name) - 2] = 0; if (exe_name[0] == '/') { /* full path given */ for (i = ((int)strlen(exe_name)) - 1, k = -1; i >= 0; i--) if (exe_name[i] == '/') { if (k == -1) k = i + 1; else { exe_name[i] = 0; break; } } log_debug("exe: path=%s, name=%s\n", exe_name, exe_name + k); sprintf(log_path, "%s/data/%s.dat", exe_name, exe_name + k); } else { /* only executable name */ sprintf(log_path, "../data/%s.dat", exe_name); } log_debug("log: %s\n", log_path); log_file = fopen(log_path, "w"); if (!log_file) { perror("cannot open log file"); abort(); } #else log_file = stderr; #endif } void finish_logging() { fclose(log_file); } /* prints formatted message to ../data/.dat */ int log_printf(const char *fmt, ...) { int r; va_list ap; va_start(ap, fmt); if (log_file) r = vfprintf(log_file, fmt, ap); else { fprintf(stderr, "warning: logging is not enabled for this process\n"); r = vfprintf(stderr, fmt, ap); } va_end(ap); return r; } struct stats { int size; /* size, including trailing space for arrays */ double put; double get; double *nb_put_a; double *nb_get_a; double *nb_put_b; double *nb_get_b; }; void benchmark(int msg_size, struct stats *st) { void **out_ptrs, **in_ptrs; double time_start, time_after_start, time_after_call, time_after_wait; double time2put, time2get; int i, j; armci_hdl_t handle; out_ptrs = malloc(sizeof(void*)*size); in_ptrs = malloc(sizeof(void*)*size); log_debug("testing message size %d bytes\n", msg_size); log_debug("barrier A\n"); armci_msg_barrier(); /* allocate buffers */ ARMCI_ASSERT(ARMCI_Malloc(out_ptrs, msg_size)); ARMCI_ASSERT(ARMCI_Malloc(in_ptrs, msg_size)); for (i = 0; i < msg_size; i++) { ((char *)out_ptrs[rank])[i] = (char)(rand() >> 24); ((char *)in_ptrs[rank])[i] = (char)(rand() >> 24); } /* warmup call */ log_debug("barrier B\n"); ARMCI_Barrier(); ARMCI_ASSERT(ARMCI_Put(in_ptrs[rank], out_ptrs[second], msg_size, second)); log_debug("barrier C: warmed up\n"); ARMCI_Barrier(); /* phase A */ if (!rank) { /* measure blocking Put 0 -> 1 */ time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_Put(out_ptrs[0], in_ptrs[1], msg_size, 1)); time_after_call = armci_timer(); time2put = time_after_call - time_after_start + time_start - time_after_start; log_debug("PutA(%d bytes) 0 -> 1: %.8f\n", msg_size, time2put); st->put = time2put; } log_debug("barrier D\n"); ARMCI_Barrier(); if (!rank) { /* measure blocking Get 0 <- 1 */ time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_Get(out_ptrs[1], in_ptrs[0], msg_size, 1)); time_after_call = armci_timer(); time2get = time_after_call - time_after_start + time_start - time_after_start; log_debug("GetA(%d bytes) 0 <- 1: %.8f\n", msg_size, time2get); st->get = time2get; } for (i = 1; i <= SML_MSGS; i++) { log_debug("barrier E\n"); ARMCI_Barrier(); if (!rank) { /* put i messages to procs 0..i-1 */ time_start = armci_timer(); time_after_start = armci_timer(); for (j = 1; j <= i; j++) ARMCI_ASSERT(ARMCI_NbPut(out_ptrs[0], in_ptrs[j], msg_size, j, NULL)); ARMCI_WaitAll(); time_after_wait = armci_timer(); time2put = time_after_wait - time_after_start + time_start - time_after_start; log_debug("NbPutA(%d bytes) 0 -> 1..%d: %.8f\n", msg_size, i, time2put); st->nb_put_a[i - 1] = time2put; } } for (i = 1; i <= SML_MSGS; i++) { log_debug("barrier F\n"); ARMCI_Barrier(); if (!rank) { /* get i messages from procs 0..i-1 */ time_start = armci_timer(); time_after_start = armci_timer(); for (j = 1; j <= i; j++) ARMCI_ASSERT(ARMCI_NbGet(out_ptrs[j], in_ptrs[0], msg_size, j, NULL)); ARMCI_WaitAll(); time_after_wait = armci_timer(); time2get = time_after_wait - time_after_start + time_start - time_after_start; log_debug("NbGetA(%d bytes) 0 <- 1..%d: %.8f\n", msg_size, i, time2get); st->nb_get_a[i - 1] = time2get; } } /* phase B */ log_debug("barrier G\n"); ARMCI_Barrier(); ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbPut(out_ptrs[rank], in_ptrs[second], msg_size, second, &handle)); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); time2put = time_after_wait - time_after_start + time_start - time_after_start; log_debug("NbPutB(%d bytes) %d -> %d: %.8f\n", msg_size, rank, second, time2put); st->nb_put_b[rank] = time2put; log_debug("barrier H\n"); ARMCI_Barrier(); ARMCI_INIT_HANDLE(&handle); time_start = armci_timer(); time_after_start = armci_timer(); ARMCI_ASSERT(ARMCI_NbGet(out_ptrs[second], in_ptrs[rank], msg_size, second, &handle)); ARMCI_ASSERT(ARMCI_Wait(&handle)); time_after_wait = armci_timer(); time2get = time_after_wait - time_after_start + time_start - time_after_start; log_debug("NbGetB(%d bytes) %d <- %d: %.8f\n", msg_size, rank, second, time2get); st->nb_get_b[rank] = time2get; log_debug("barrier I\n"); ARMCI_Barrier(); log_debug("finished benchmarking\n"); /* clean up */ ARMCI_Free(out_ptrs[rank]); ARMCI_Free(in_ptrs[rank]); free(out_ptrs); free(in_ptrs); } int main (int argc, char *argv[]) { int i, j, l; char buf[255]; int dist, pos, time_seed; struct stats *st; #ifdef USE_EXP2 int msg_sizes[MSG_COUNT]; #else int msg_sizes[] = {8, 16, 28, 52, 96, 180, 332, 616, 1144, 2124, 3952, 7344, 13652, 25384, 47196, 87748, 163144, 303332, 563972, 1048576}; #endif armci_msg_init(&argc, &argv); rank = armci_msg_me(); size = armci_msg_nproc(); assert((size & 1) ^ 1); /* works with even number of processors only */ log_debug("Message passing initialized\n"); if (!rank) start_logging(argv[0]); ARMCI_ASSERT(ARMCI_Init()); log_debug("ARMCI initialized\n"); /* inialize PRNG, use seed generated on processor 0 for uniform sequence */ time_seed = time(NULL); MPI_Bcast(&time_seed, 1, MPI_INT, 0, MPI_COMM_WORLD); srand(time_seed); rand(); log_debug("seed: %d\n", time_seed); /* generate random pairs of processors */ #define HALFSIZE (size / 2) assert(p_srcs = malloc(sizeof(int) * size)); for (i = 0; i < size; i++) p_srcs[i] = -1; p_dsts = p_srcs + HALFSIZE; for (i = 0, j = size - 1, pos = 0; i < size; i++, j--) { dist = round((double)rand() * j / RAND_MAX + 1); /* random 1..j */ for (l = 0; l < dist; ) { pos = (pos + 1 == size) ? 0 : pos + 1; if ((p_srcs[pos] == -1) && (pos != i)) l++; } p_srcs[pos] = i; } for (i = 0, j = 0; i < HALFSIZE; i++) j += sprintf(buf + j, " %d->%d", p_srcs[i], p_dsts[i]); log_debug("random pairs:%s\n", buf); /* determines a pair/second for current processor */ for (i = 0; i < HALFSIZE; i++) { if (p_srcs[i] == rank) second = p_dsts[i]; if (p_dsts[i] == rank) second = p_srcs[i]; } log_debug("second: %d\n", second); /* allocate memory tatistics */ l = sizeof(struct stats) + 2 * sizeof(double) * (size + SML_MSGS); assert(st = malloc(l)); st->size = l; st->nb_put_a = (double *)(((char *)st) + sizeof(struct stats)); st->nb_get_a = st->nb_put_a + SML_MSGS; st->nb_put_b = st->nb_get_a + SML_MSGS; st->nb_get_b = st->nb_put_b + size; for (i = 0; i < MSG_COUNT; i++) { benchmark(msg_sizes[i], st); if (rank != 0) { MPI_Gather(st->nb_put_b + rank, 1, MPI_DOUBLE, st->nb_put_b, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Gather(st->nb_get_b + rank, 1, MPI_DOUBLE, st->nb_get_b, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); } if (!rank) { double min_put, max_put, mean_put; double min_get, max_get, mean_get; log_printf("msg_size = %d:\n", msg_sizes[i]); log_printf("Put = %.8f Get = %.8f\n", st->put, st->get); for (j = 0; j < SML_MSGS; j++) log_printf("NbPutA(0 -> 1..%d) = %.8f\n", j + 1, st->nb_put_a[j]); for (j = 0; j < SML_MSGS; j++) log_printf("NbGetA(0 -> 1..%d) = %.8f\n", j + 1, st->nb_get_a[j]); /* determine min, max and mean for phase B */ min_put = max_put = mean_put = st->nb_put_b[0]; min_get = max_get = mean_get = st->nb_get_b[0]; for (j = 1; j < size; j++) { if (min_put > st->nb_put_b[j]) min_put = st->nb_put_b[j]; if (max_put < st->nb_put_b[j]) max_put = st->nb_put_b[j]; mean_put += st->nb_put_b[j]; if (min_get > st->nb_get_b[j]) min_get = st->nb_get_b[j]; if (max_get < st->nb_get_b[j]) max_get = st->nb_get_b[j]; mean_get += st->nb_get_b[j]; } mean_put /= size; mean_get /= size; log_printf("NbPutB min = %.8f max = %.8f mean = %.8f\n", min_put, max_put, mean_put); log_printf("NbGetB min = %.8f max = %.8f mean = %.8f\n", min_get, max_get, mean_get); log_printf("\n"); } } /* clean up */ ARMCI_Finalize(); armci_msg_finalize(); free(st); free(p_srcs); if (!rank) finish_logging(); return 0; } ga-5-4/armci/examples/features/concurrency/README0000644000175000017500000000222712662210434017774 0ustar mbambaHigh-performance networks have developed significantly over the past several years. Many of these networks are capable of remote direct memory access (RDMA) communication that involves movement of data between processor memories without memory copies or remote host processor involvement. Current high-speed networks deploy powerful communication processor(s) in the network interface card (NIC) to handle processing of multiple incoming and outgoing messages without interrupting the host processor. For example, the Quadrics Elan4 network interconnect can do two overlapping DMAs and allows multiple outstanding read/write transactions from and to the network interconnect. Switches used in the modern interconnects also have developed significantly in the last several years, facilitating multiple communication paths between network endpoints and hence roviding increased levels of concurrency and redundancy communication between network endpoints. As a result, the modern networks are very capable of handling simultaneous and concurrent data movements. ARMCI allows for its applications to utilize concurrency by its low-overhead implementation of one-sided calls ga-5-4/armci/examples/features/concurrency/simple/0000755000175000017500000000000012662210434020402 5ustar mbambaga-5-4/armci/examples/features/concurrency/simple/comdegree.c0000644000175000017500000002605712662210434022512 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** Copyright (c) 2006 * Pacific Northwest National Laboratory, * Battelle Memorial Institute. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name of the Battelle nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 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. * * $Id: comdegree.c,v 1.1.2.1 2007-06-20 17:41:49 vinod Exp $ * * This test checks the networks ability to overlap data transfers. * It does it both for an optimitic case (with no other communication) and * a more realistic case. * --Vinod Tipparaju * --Pacific Northwest National Laboratory * --vinod@pnl.gov */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ASSERT_H # include #endif #define DEBUG__ #include "armci.h" #include "message.h" /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void create_array(void *a[], int size) { armci_size_t bytes=size; int rc; rc = ARMCI_Malloc(a, bytes); assert(rc==0); #ifdef DEBUG_ printf("%d after malloc ndim=%d b=%d ptr=%p\n",me,ndim,(int) bytes,a[me]); fflush(stdout); #endif assert(a[me]); bzero(a[me],bytes); } void destroy_array(void *ptr[]) { armci_msg_barrier(); assert(!ARMCI_Free(ptr[me])); } #define LCC 13 #define MAXPROC 128 void test_get_multidma() { int i,j; void *b[MAXPROC], *a[MAXPROC]; int left = (me+nproc-1) % nproc; int right = (me+1) % nproc; /*int sendersright=0,sendersleft=0;*/ int loopcnt=10, itercount=5; double tt/*, t0[LCC]*/,t1[LCC],t2[LCC],t3[LCC]; armci_hdl_t hdl1,hdl2; for(i=0;i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_UNISTD_H # include #endif #include #include #include "armci.h" #include "gpc.h" typedef struct {double real,imag;} DoubleComplex; #define LOOP 100 int accloop; int gpcwork_daxpy; int gpcwork_dgemm; int gpcwork_ddot; int gpcwork_memcpy; int me,nprocs; int size=2100*1024*LOOP; int count=2100*1024; int stride_arr[2]={0,0}; double alpha=0.1; double c_alpha=0.1; char **myptrs; double t0,t1,t2,t3; double tmpbuf[LOOP*100]; double tmpbuf1[LOOP*100]; double tmpbuf2[LOOP*100000]; double tmpbuf3[LOOP*100000]; #define DGS 450 double dga[DGS][DGS]; double dgb[DGS][DGS]; double dgc[DGS][DGS]; int gpc_work_handler_daxpy(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { int *rem; int tmp_loop; int i,j; int ONE=1; int N=DGS; rem = (int*)ARMCI_Gpc_translate(*(void**)hdr,to,from); tmp_loop = *rem; t2=MPI_Wtime(); for(j=0;j=2 procs\n"); MPI_Finalize(); exit(1); } right = (me+1)%nprocs; hlen=sizeof(header); bzero(rheader,100); rhlen = hlen; ARMCI_Init(); accloop=atoi(argv[1]); rem=accloop; myptrs = (char **)malloc(sizeof(char *)*nprocs); ARMCI_Malloc((void **)myptrs,size); MPI_Barrier(MPI_COMM_WORLD); gpcwork_memcpy = ARMCI_Gpc_register(gpc_work_handler_memcpy); gpcwork_ddot =ARMCI_Gpc_register(gpc_work_handler_ddot); gpcwork_daxpy = ARMCI_Gpc_register(gpc_work_handler_daxpy); gpcwork_dgemm = ARMCI_Gpc_register(gpc_work_handler_dgemm); MPI_Barrier(MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); ARMCI_Gpc_init_handle(&nbh); if(ARMCI_Gpc_exec(gpcwork_memcpy, right, &header, hlen, loc, sizeof(int), rheader, rhlen,loc, sizeof(int), &nbh)) fprintf(stderr,"ARMCI_Gpc_exec failed\n"); { int m,n,k; char notr='n'; DoubleComplex ZERO; usleep(100); ZERO.real=0.;ZERO.imag=0.; m=n=k=DGS; t0=MPI_Wtime(); #ifdef DGEMM_WORK for(j=0;j<4*15;j++){ c_alpha=c_alpha+j*rand(); dgemm_(¬r,¬r,&m,&n,&k,&c_alpha,c_dga,&m,c_dgb,&n,&ZERO,c_dgc,&k,1,1); } #elif IUNIT_WORK for(j=0;j<2*LOOP*100;j++){ for(i=0;i #ifndef STL_HASHMAP_NAMESPACE # define STL_HASHMAP_NAMESPACE __gnu_cxx #endif ga-5-4/armci/examples/features/gpc/hashtable/GPCHashmap.h0000644000175000017500000000210012662210434021340 0ustar mbamba/* $Id: */ #ifndef GPCHASHMAP_H_ #define GPCHASHMAP_H_ #include using std::string; #include "Hash_common.h" class GPCHashmap { public: /** * Constructor */ GPCHashmap(); /** * Default Destructor */ ~GPCHashmap(); /** * creates a new hashmap (local) */ void create(); /** * destroys this hashmap */ void destroy(); /** * inserts elements into hashmap */ void insert(const char *buf, size_t size); /** * get the global term IDs */ void getGlobalIds(const char *buf, size_t bufsize, int *globalTermIds); /** * prints the local hashmap */ void print(); void rehash(int *size); /** * returns true if a hashmap already exists */ static bool isCreated(); private: VocabIntMap *mVocabMap; static short int sm_initialized; }; #endif /* GPCHASHMAP_H_ */ ga-5-4/armci/examples/features/gpc/hashtable/Util.h0000644000175000017500000000077412662210434020361 0ustar mbamba#ifndef UTIL_H #define UTIL_H #include using std::string; #include "Hash_common.h" extern int armci_hashmap_pack(char *buf, string str); extern int armci_hashmap_unpack(const char *buf, string& str); extern void armci_hashmap_insert(VocabIntMap *vocabMap, const char *buf, size_t bufsize); extern void armci_hashmap_insert2(VocabIntMap *vocabMap, const char *buf, size_t bufsize, int *globalTermIds, int op); #endif /* UTIL_H */ ga-5-4/armci/examples/features/gpc/hashtable/HashUtil.cc0000644000175000017500000000643412662210434021322 0ustar mbamba #include #include "Util.h" #include "armci.h" int armci_hashmap_pack(char *buf, string str) { int len = str.length(); // first copy the length of the string *((int*)buf) = len; // then copy the actual string int index = sizeof(int); char *dst = &buf[index]; strcpy(dst, str.c_str()); index += len; // offset "index" to integer-byte boundary int adjust = sizeof(int) - (index % sizeof(int)); index += adjust; return (int)index; } int armci_hashmap_unpack(const char *buf, string& str) { // first get the string length and the corresponding string int len = *((int*)buf); // then get the actual term string int index = sizeof(int); string termStr(&buf[index], len); str = termStr; index += len; // offset "index" to integer-byte boundary int adjust = sizeof(int) - (index % sizeof(int)); index += adjust; return (int)index; } void armci_hashmap_insert(VocabIntMap *vocabMap, const char *buf, size_t bufsize) { string termStr; size_t index=0; // get the number of strings to be inserted (i.e.first field in the // buffer) and increment the index accordingly. int numstrings = *((int*)buf); index += sizeof(int); #if DEBUG int me; MP_MYID(&me); printf("%d: armci_hashmap_insert(): numstrings=%d bufsize=%ld\n", me, numstrings, bufsize); fflush(stdout); #endif // unpack the buffer for(int i=0; i bufsize) ARMCI_Error("GPCHashmap::insert() failed. Buffer overflow.", 0); // add the term to the hashmap VocabIntMap::const_iterator iter = vocabMap->find(termStr); int termID = -1; if (iter != vocabMap->end()) { // term already in map termID = (*iter).second; } else { // new term. Add to vocab hashmap termID = vocabMap->size(); // starts with zero (*vocabMap)[termStr] = termID; } } } void armci_hashmap_insert2(VocabIntMap *vocabMap, const char *buf, size_t bufsize, int *globalTermIds, int op) { string termStr; size_t index=0; // get the number of strings to be inserted (i.e.first field in the // buffer) and increment the index accordingly. int numstrings = *((int*)buf); index += sizeof(int); // unpack the buffer for(int i=0; i bufsize) ARMCI_Error("armci_hashmap_insert2() failed. Buffer overflow.", 0); if(op==HASHMAP_INSERT) { // insert the term to the hashmap (*vocabMap)[termStr] = globalTermIds[i]; } else if(op==HASHMAP_GET){ // retrieve a term's global id from hashmap globalTermIds[i] = (*vocabMap)[termStr]; } else { ARMCI_Error("armci_hashmap_insert2() Invalid operation", 0); } } } ga-5-4/armci/examples/features/gpc/hashtable/DistHashmap.cc0000644000175000017500000002471712662210434022012 0ustar mbamba/* $Id: DistHashmap.cc,v 1.1.2.1 2007-06-20 17:41:53 vinod Exp $ */ /* * AUTHOR: Manojkumar Krishnan, PNNL */ #include #include #include #include using std::cout; using std::endl; #define DEBUG 0 #ifdef WIN32 # include # define sleep(x) Sleep(1000*(x)) #else # include #endif #include "armci.h" #include "message.h" #define ARMCI_ENABLE_GPC_CALLS #include "gpc.h" #include "Hash_common.h" #include "DistHashmap.h" #include "Util.h" #define BUF_LIMIT 8192 // in bytes. Make sure this value can fit in an // integer variable extern int gpc_disthashmap_handler(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); extern void gpc_disthashmap_exec(int hash_op, char *buf, size_t bufsize, int proc, int gpc_handle); extern void gpc_disthashmap_exec_nb(int hash_op, char *buf, size_t bufsize, int proc, int gpc_handle, gpc_hdl_t *nbh); extern void gpc_disthashmap_exec_wait(gpc_hdl_t *nbh); extern int armci_master; short int DistHashmap::sm_initialized=0; DistHashmap::DistHashmap() : mGPCHandle(0), mGlobalIdMap(NULL), m_globalHashMapSize(0) { MP_MYID(&m_me); int nproc; MP_PROCS(&nproc); mIndex = new int[nproc]; for(int i=0; idestroy(); delete[] mIndex; int nproc; MP_PROCS(&nproc); for(int i=0; i BUF_LIMIT) ARMCI_Error("String length is greater than internal buffer. Increase BUF_LIMIT", 0); // if the buffer is full, trigger an insert into the GPC hashmap if(mIndex[dst_proc] + str.length() + padding > BUF_LIMIT) this->commit(dst_proc); // initalize the "number of strings" field in the buffer int *numstrings = (int*)mBuf[dst_proc]; if(mIndex[dst_proc] == 0) { *numstrings = 0; mIndex[dst_proc] += sizeof(int); } (*numstrings)++; // insert into the internal buffer int index = mIndex[dst_proc]; mIndex[dst_proc] += armci_hashmap_pack(&mBuf[dst_proc][index], str); } /** * Call commit() to complete the data insertion into the distributed hashmap * for consistency purposes. This is a collective call. */ void DistHashmap::commit() { int nproc; MP_PROCS(&nproc); for(int i=0; icommit(i); this->rehash(); } /** * Call commit() to complete the data insertion into the distributed hashmap * for consistency purposes (of a specified process). */ void DistHashmap::commit(int proc) { // complete the hashmap insertion if the buffer still has data if(mIndex[proc] > 0) { char *buf = &mBuf[proc][0]; int bufsize = mIndex[proc]; # if DEBUG printf("%d: Commit() to %d: numstrings=%d bufsize=%d\n", m_me, proc, *((int*)buf), bufsize);fflush(stdout); # endif memcpy(mTmpBuf, (const char*)buf, (size_t)bufsize); int tmpBufsize = bufsize; // insert into the distributed hashmap gpc_disthashmap_exec(HASHMAP_INSERT, buf, bufsize, proc, mGPCHandle); mIndex[proc] = 0; // verify the returned data if( *((int*)buf) != *((int*)mTmpBuf) ) ARMCI_Error("DistHashmap::commit() failed", 0); // i.e. save the global ids in the locally cached hashmap (mGlobalIdMap) int *globalTermIds = (int*) (buf + sizeof(int)); armci_hashmap_insert2(mGlobalIdMap, (const char*)mTmpBuf, tmpBufsize, globalTermIds, HASHMAP_INSERT); } } /** * This is a collective call to rehash the distributed hashmap */ void DistHashmap::rehash() { int nclus = armci_domain_count(ARMCI_DOMAIN_SMP); int clus_me = armci_domain_my_id(ARMCI_DOMAIN_SMP); // no need to rehash if #of clusters is <= 1 if(nclus <=1) { m_globalHashMapSize = mGlobalIdMap->size(); return; } // no GPC support for single node multiple processes if(nclus == 1) { int nproc; MP_PROCS(&nproc); if(nproc > 1) ARMCI_Error("DistHashmap::rehash(): no GPC support for single node multiple processes", 0); } int size=0; int *globalHashOffset = new int[nclus]; int *offsetMap = new int[nclus]; if(globalHashOffset == NULL || offsetMap == NULL) ARMCI_Error("DistHashmap::rehash() new alloc failed", 0); for(int i=0; ibegin(); iter!=mGlobalIdMap->end(); iter++) { termStr = (*iter).first; int nproc; MP_PROCS(&nproc); int dst_proc = armci_djb2_hash((unsigned char*)termStr.c_str(), nproc); int dst_clus = armci_domain_id(ARMCI_DOMAIN_SMP, dst_proc); (*iter).second += offsetMap[dst_clus]; } delete[] offsetMap; delete[] globalHashOffset; } /** * to check if a distributed hashmap exists * This is a local call */ bool DistHashmap::isCreated() { if (sm_initialized >0) return true; return false; } /** * This is a collective call */ void DistHashmap::print() { MP_BARRIER(); /* SMP master process destroys the hashmap */ if(m_me == armci_master) { gpc_disthashmap_exec(HASHMAP_PRINT, NULL, 0, m_me, mGPCHandle); } MP_BARRIER(); } /** * This is a local call */ void DistHashmap::print2() { printf("%d: Locally cached Hashmap[%d:%ld]\n", m_me, 1, mGlobalIdMap->size()); VocabIntMap::const_iterator iter; for(iter=mGlobalIdMap->begin(); iter != mGlobalIdMap->end(); iter++) { cout << iter->second << "\t: " << iter->first << endl; } cout << endl; } const VocabIntMap * DistHashmap:: getLocalMapPtr() { return mGlobalIdMap; } int DistHashmap:: getGlobalHashMapSize() { return m_globalHashMapSize; } /* TODO: 1. put the gpc exec functions in GPCHashmapHandler.cc as private methods in this class 2. for better performance, use ARMCI_Malloc instead of new for data transfer GPC buffers */ ga-5-4/armci/examples/features/gpc/hashtable/sample.txt0000644000175000017500000000021312662210434021301 0ustar mbamba The Global Arrays (GA) toolkit provides an efficient and portable "shared-memory" programming interface for distributed-memory computers. ga-5-4/armci/examples/features/gpc/hashtable/GPCHashmapHandler.cc0000644000175000017500000000770312662210434023012 0ustar mbamba/* $Id: */ #include #define DEBUG 0 #ifdef WIN32 # include # define sleep(x) Sleep(1000*(x)) #else # include #endif #include "armci.h" #define ARMCI_ENABLE_GPC_CALLS #include "gpc.h" #include "Hash_common.h" #include "GPCHashmap.h" static GPCHashmap *gGPCHashmap=NULL; #if DEBUG char* g_GPCops[6] = {"HASHMAP_CREATE", "HASHMAP_DESTROY", "HASHMAP_INSERT", "HASHMAP_PRINT", "HASHMAP_GET", "HASHMAP_REHASH"}; #endif int gpc_disthashmap_handler(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { hash_hdr_t *lhdr; int rank; MP_MYID(&rank); lhdr = (hash_hdr_t*)ARMCI_Gpc_translate(hdr,to,from); const char *buf = (const char*)data; size_t bufsize = dlen; int hash_op = lhdr->hash_op; // for correctness ? *rhsize = sizeof(int); *rdsize = sizeof(int); #if DEBUG int me; MP_MYID(&me); printf("%d: In GPC handler: %s from=%d to=%d\n", me, g_GPCops[hash_op-HASHMAP_CREATE], from, to); fflush(stdout); #endif switch(hash_op) { case HASHMAP_CREATE: gGPCHashmap = new GPCHashmap(); gGPCHashmap->create(); break; case HASHMAP_DESTROY: gGPCHashmap->destroy(); if(gGPCHashmap != NULL) delete gGPCHashmap; break; case HASHMAP_INSERT: gGPCHashmap->insert(buf, bufsize); // piggy-back the globalIds gGPCHashmap->getGlobalIds(buf, bufsize, (int*)rdata); break; case HASHMAP_PRINT: gGPCHashmap->print(); break; case HASHMAP_REHASH: *rdsize = sizeof(int); gGPCHashmap->rehash((int*)rdata); break; default: ARMCI_Error("gpc_disthashmap_handler(): Invalid hashmap operation",0); } return GPC_DONE; } void gpc_disthashmap_exec_nb(int hash_op, char *buf, size_t bufsize, int proc, int gpc_handle, gpc_hdl_t *nbh) { int hlen; hash_hdr_t header; int rheader; #if DEBUG int me; MP_MYID(&me); printf("%d: Executing GPC: (%s) buf=%p bufsize=%ld proc=%d\n", me, g_GPCops[hash_op-HASHMAP_CREATE], buf, bufsize, proc); fflush(stdout); #endif header.hash_op = hash_op; header.buf = buf; header.bufsize = bufsize; hlen=sizeof(header); if(nbh!= NULL) ARMCI_Gpc_init_handle(nbh); #if 0 if(ARMCI_Gpc_exec(gpc_handle, proc, &header, hlen, buf, bufsize, &rheader, sizeof(int), &rdata, sizeof(int), nbh)) ARMCI_Error("gpc_disthashmap_exec_nb(): ARMCI_Gpc_exec failed", 0); #endif if(ARMCI_Gpc_exec(gpc_handle, proc, &header, hlen, buf, bufsize, &rheader, sizeof(int), buf, bufsize, nbh)) ARMCI_Error("gpc_disthashmap_exec_nb(): ARMCI_Gpc_exec failed", 0); } void gpc_disthashmap_exec_wait(gpc_hdl_t *nbh) { if(nbh!= NULL) ARMCI_Gpc_wait(nbh); } void gpc_disthashmap_exec(int hash_op, char *buf, size_t bufsize, int proc, int gpc_handle) { #if NON_BLOCKING // non blocking GPC is flaky gpc_hdl_t nbh; gpc_disthashmap_exec_nb(hash_op, buf, bufsize, proc, gpc_handle, &nbh); gpc_disthashmap_exec_wait(&nbh); #else gpc_disthashmap_exec_nb(hash_op, buf, bufsize, proc, gpc_handle, NULL); gpc_disthashmap_exec_wait(NULL); #endif /* int hlen; hash_hdr_t header; int rheader, rdata; header.hash_op = hash_op; header.buf = buf; header.bufsize = bufsize; hlen=sizeof(header); ARMCI_Gpc_init_handle(&nbh); if(ARMCI_Gpc_exec(gpc_handle, proc, &header, hlen, buf, bufsize, &rheader, sizeof(int), &rdata, sizeof(int), &nbh)) ARMCI_Error("gpc_disthashmap_exec(): ARMCI_Gpc_exec failed", 0); ARMCI_Gpc_wait(&nbh); */ } ga-5-4/armci/examples/features/gpc/hashtable/GPCHashmap.cc0000644000175000017500000000527712662210434021520 0ustar mbamba/* $Id: */ #include #include #include #include using std::string; using std::cout; using std::endl; #define DEBUG 0 #ifdef WIN32 # include # define sleep(x) Sleep(1000*(x)) #else # include #endif #include "armci.h" #define ARMCI_ENABLE_GPC_CALLS #include "gpc.h" /***************************** macros ************************/ extern "C" { # if defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define MEM_FENCE __asm__ __volatile__ ("mf" ::: "memory"); # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define MEM_FENCE _armci_ia64_mb(); # endif # endif } #include "Hash_common.h" #include "GPCHashmap.h" #include "Util.h" short int GPCHashmap::sm_initialized=0; GPCHashmap::GPCHashmap() : mVocabMap(NULL) { } GPCHashmap::~GPCHashmap() { if(sm_initialized != 0) this->destroy(); } void GPCHashmap::create() { if(sm_initialized != 0) { ARMCI_Error("GPCHashmap::create(): Hashmap already exists. At a given time, only one distributed hashmap should exist. Multiple distributed hashmaps not yet supported", 0); } mVocabMap = new VocabIntMap(); sm_initialized=1; } void GPCHashmap::destroy() { if (mVocabMap != NULL) delete mVocabMap; sm_initialized=0; } /** * buf - character array * size - size of strlen array */ void GPCHashmap::insert(const char *buf, size_t bufsize) { armci_hashmap_insert(mVocabMap, buf, bufsize); #ifdef MEM_FENCE MEM_FENCE; #else ARMCI_Error("gpc_insert_handler: MEM_FENCE not defined", 0); #endif } /** * get the global term IDs */ void GPCHashmap::getGlobalIds(const char *buf, size_t bufsize, int *globalTermIds) { globalTermIds[0] = *((int*)buf); armci_hashmap_insert2(mVocabMap, buf, bufsize, &globalTermIds[1], HASHMAP_GET); #ifdef MEM_FENCE MEM_FENCE; #else ARMCI_Error("gpc_insert_handler: MEM_FENCE not defined", 0); #endif } /** * prints the hashmap in this server process */ void GPCHashmap::print() { int me; MP_MYID(&me); printf("%d: Hashmap[%d:%ld]\n", me, 1, mVocabMap->size()); VocabIntMap::const_iterator iter; for(iter=mVocabMap->begin(); iter != mVocabMap->end(); iter++) { cout << iter->second << "\t: " << iter->first << endl; } cout << endl; } // to check if a hashmap exists void GPCHashmap::rehash(int *size) { *size = (int) mVocabMap->size(); #ifdef MEM_FENCE MEM_FENCE; #else ARMCI_Error("gpc_insert_handler: MEM_FENCE not defined", 0); #endif } // to check if a hashmap exists bool GPCHashmap::isCreated() { if (sm_initialized >0) return true; return false; } ga-5-4/armci/examples/features/gpc/hashtable/test_hashtable.cc0000644000175000017500000000341112662210434022563 0ustar mbamba/* $Id: */ #include #include #include #include using namespace std; #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #include "mp3.h" #include "armci.h" #define ARMCI_ENABLE_GPC_CALLS #include "gpc.h" #include "Hash_common.h" #include "DistHashmap.h" int me, nproc; void test_distHashmap() { ifstream infile("sample.txt"); string str; // create a distributed hashmap if(me==0) { printf("Creating a distributed hashmap\n"); fflush(stdout);} DistHashmap *dist_hashmap = new DistHashmap(); dist_hashmap->create(); if(me==0) { printf("Distributed hashmap created. O.K.\n"); fflush(stdout);} // reads a word from the file and inserts it into the hashmap while(!infile.eof()) { infile >> str; dist_hashmap->insert(str); // if(me==0) { printf("%s\n", str.c_str()); fflush(stdout);} } dist_hashmap->commit(); dist_hashmap->print(); fflush(stdout); MP_BARRIER(); dist_hashmap->print2(); fflush(stdout); MP_BARRIER(); // delete the distributed hashmap dist_hashmap->destroy(); if(me==0) { printf("Distributed hashmap deleted. O.K.\n"); fflush(stdout);} infile.close(); } int main(int argc, char* argv[]) { MP_INIT(argc, argv); MP_PROCS(&nproc); MP_MYID(&me); if(me==0){ printf("ARMCI Distributed Hashmap test program (%d processes)\n",nproc); fflush(stdout); sleep(1); } ARMCI_Init(); if(me==0){ printf("\nDistributed Hashmap using ARMCI's GPC calls\n"); fflush(stdout); } MP_BARRIER(); test_distHashmap(); ARMCI_AllFence(); MP_BARRIER(); ARMCI_Finalize(); MP_FINALIZE(); return(0); } ga-5-4/armci/examples/features/gpc/hashtable/DistHashmap.h0000644000175000017500000000421512662210434021643 0ustar mbamba/* $Id: */ #ifndef DISTHASHMAP_H_ #define DISTHASHMAP_H_ #include using std::string; #define ARMCI_ENABLE_GPC_CALLS #include "gpc.h" #include "Hash_common.h" class DistHashmap { public: /** * Constructor */ DistHashmap(); /** * Default Destructor */ ~DistHashmap(); /** * creates a new distributed hashmap */ void create(); /** * destroys this distributed hashmap */ void destroy(); /** * str - string to be inserted into the distributed hashmap * size - size of strlen array * Insert() is just to ensure that there is a new entry to be inserted into * the distributed hash map, and this entry is marked in the local buffer * as "to be inserted". The reason is, it will be expensive to do the insert * for each and every new element. In order to avoid those latency costs, * insert aggregates the entries into a single buffer of size BUF_LIMIT and * only completes the insertion into the distributed hashh map, if and only * if this aggregate local buffer is full. In order to complete this * aggregation call (even though the buffer is not full), commit() can be * used to flush the local buffer into the distributed hash map. So it is a * good practice to call commit after all insert or whenever consistency is * required. */ void insert(string str); /** * Call commit() to complete the data insertion into the distributed * hashmap. */ void commit(); /** * Call commit() to complete the data insertion into the distributed * hashmap of a specified process. */ void commit(int proc); /** * prints this distributed hashmap */ void print(); void print2(); void rehash(); const VocabIntMap * getLocalMapPtr(); /** * returns the Global HashMap Size */ int getGlobalHashMapSize(); /** * returns true if a hashmap already exists */ static bool isCreated(); private: int mGPCHandle; int m_me; static short int sm_initialized; char **mBuf; char *mTmpBuf; /* temporary buffer */ int *mIndex; int m_globalHashMapSize; VocabIntMap *mGlobalIdMap; }; #endif /* DISTHASHMAP_H_ */ ga-5-4/armci/examples/features/gpc/hashtable/HashFunctions.cc0000644000175000017500000001216512662210434022353 0ustar mbamba/* $Id: */ #include #include #include /************************************************************ * Possible Hash Functions (using google search) * Hash Functions: As mentioned briefly in the previous section, there are multiple ways for constructing a hash function. Remember that hash function takes the data as input (often a string), and return s an integer in the range of possible indices into the hash table. Every hash function must do that, including the bad ones. So what makes for a good hash function? Characteristics of a Good Hash Function: There are four main characteristics of a good hash function: 1) The hash value is fully determined by the data being hashed. 2) The hash function uses all the input data. 3) The hash function "uniformly" distributes the data across the entire set of possible hash values. 4) The hash function generates very different hash values for similar strings. Let's examine why each of these is important: Rule 1: If something else besides the input data is used to determine the hash, then the hash value is not as dependent upon the input data, thus allowing for a worse distribution of the hash values. Rule 2: If the hash function doesn't use all the input data, then slight variations to the input data would cause an inappropriate number of similar hash values resulting in too many collisions. Rule 3: If the hash function does not uniformly distribute the data across the entire set of possible hash values, a large number of collisions will result, cutting down on the efficiency of the hash table. Rule 4: In real world applications, many data sets contain very similar data elements. We would like these data elements to still be distributable over a hash table. So let's take as an example the hash function used in the last section: */ int armci_hash(char *str, int table_size) { int sum; // Make sure a valid string passed in if (str==NULL) return -1; // Sum up all the characters in the string for( ; *str; str++) sum += *str; // Return the sum mod the table size return sum % table_size; } /* Which rules does it break and satisfy? Rule 1: Satisfies. The hash value is fully determined by the data being hashed. The hash value is just the sum of all the input characters. Rule 2: Satisfies. Every character is summed. Rule 3: Breaks. From looking at it, it isn't obvious that it doesn't uniformly distribute the strings, but if you were to analyze this function for a large input you would see certain statistical properties bad for a hash function. Rule 4: Breaks. Hash the string "bog". Now hash the string "gob". They're the same. Slight variations in the string should result in different hash values, but with this function they often don't. So this hash function isn't so good. It's a good introductory example but not so good in the long run. There are many possible ways to construct a better hash function (doing a web search will turn up hundreds) so we won't cover too many here except to present a few decent examples of hash functions: */ /* Peter Weinberger's */ int armci_hashpjw(char *s) { char *p; unsigned int h, g; h = 0; for(p=s; *p!='\0'; p++){ h = (h<<4) + *p; if (g = h&0xF0000000) { h ^= g>>24; h ^= g; } } return h % 211; } /* UNIX ELF hash * Published hash algorithm used in the UNIX ELF format for object files */ unsigned long armci_elf_hash(char *name) { unsigned long h = 0, g; while ( *name ) { h = ( h << 4 ) + *name++; if ( g = h & 0xF0000000 ) h ^= g >> 24; h &= ~g; } return h; } /* This algorithm was created for the sdbm (a reimplementation of ndbm) * database library and seems to work relatively well in scrambling bits */ unsigned long armci_sdbm_hash(unsigned char *str) { unsigned long hash = 0; int c; while (c = *str++) hash = c + (hash << 6) + (hash << 16) - hash; return hash; } /* djb2: * This algorithm was first reported by Dan Bernstein * many years ago in comp.lang.c */ unsigned long armci_djb2_hash(unsigned char *str, int total_procs) { unsigned long hash = 5381; int c; /** * Modified by Manoj: * while (c = *str++) hash = ((hash << 5) + hash) + c; */ while (c = *str++) hash = (((hash << 5) + hash) + c) % total_procs; return hash; } char armci_XORhash( char *key, int len) { char hash; int i; for (hash=0, i=0; i using std::string; /* #include "UnicodeString.h" */ #define USE_MAP #ifdef USE_MAP # include typedef std::map VocabIntMap; #else /* USE_MAP */ # include "hash_map.h" using STL_HASHMAP_NAMESPACE::hash_map; using STL_HASHMAP_NAMESPACE::hash; struct hashStr { size_t operator()(const string& str) const { hash H; return H(str.c_str()); } }; typedef hash_map VocabIntMap; #endif /* USE_MAP */ extern unsigned long armci_djb2_hash(unsigned char *str, int total_procs); #endif /* HASH_COMMON_H */ ga-5-4/armci/examples/features/gpc/hashtable/README0000644000175000017500000000004212662210434020137 0ustar mbamba:Author: Manojkumar Krishnan PNNL ga-5-4/armci/examples/features/notification/0000755000175000017500000000000012662210433017244 5ustar mbambaga-5-4/armci/examples/features/notification/README0000644000175000017500000000407112662210433020126 0ustar mbambaIntroduction ============ A new notification functionality has been introduced in ARMCI primarify for the Co-Array fortran compiler. Description =========== Notification is a mechanism for synchronization. 1. process s is the process doing a notify call 2. process d is the destiniation of this notification call Process s makes a armci_notify(d) call. This call is guarenteed to reach the process d (the destination here) only after all prior calls made by process s to process d complete and are commited into process d's memory. armci_notify is a mechanism by which if s notifies d and d does a corresponding notify_wait, after d returns from notify_wait it knows that all communication calls initiated to d by s, before s issued the notification message, are completed and d's memory will reflect that they are completed. Function Definitions ==================== int armci_notify(int proc) -------------------------- :: parameter proc the process/task to which the notification message is sent to return the current value of the pending operations count for process proc blocking: this is a non-blocking call on most networks int armci_notify_wait(int proc,int * pval) ------------------------------------------ :: parameter proc the process/task to which the notification message is sent to pval pointer to the current received count from the initiator of the notify call at the moment. return returns the number of calls that were sent from s (initiator of notify) since the invocation of the last notify_wait blocking: this is a blocking call Sample Program ============== An example program is at armci/src/testnotify.c Here is a sample where process waits for message from left and sends to right:: left=me-1;right=(me==nproc-1)?-1:me+1; if(left!=-1){ rc = armci_notify_wait(left,&wc); } if(right!=-1){ ARMCI_PutS((double*)b[me]+idx, stride, (double*)b[right]+idx, stride, count, strl,right); lc=armci_notify(right); } ga-5-4/armci/examples/features/notification/simple/0000755000175000017500000000000012662210433020535 5ustar mbambaga-5-4/armci/examples/features/notification/simple/testnotify.c0000644000175000017500000002223512662210433023115 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: testnotify.c,v 1.1.2.1 2007-06-20 17:42:09 vinod Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #define DEBUG__ #include "armci.h" #include "message.h" #define DIM1 5 #define DIM2 3 #ifdef __sun /* Solaris has shared memory shortages in the default system configuration */ # define DIM3 6 # define DIM4 5 # define DIM5 4 #elif defined(__alpha__) # define DIM3 8 # define DIM4 5 # define DIM5 6 #else # define DIM3 8 # define DIM4 9 # define DIM5 7 #endif #define DIM6 3 #define DIM7 2 #define OFF 1 #define EDIM1 (DIM1+OFF) #define EDIM2 (DIM2+OFF) #define EDIM3 (DIM3+OFF) #define EDIM4 (DIM4+OFF) #define EDIM5 (DIM5+OFF) #define EDIM6 (DIM6+OFF) #define EDIM7 (DIM7+OFF) #define DIMS 4 #define MAXDIMS 7 #define MAX_DIM_VAL 50 #define LOOP 200 #define BASE 100. #define MAXPROC 128 #define TIMES 100 #ifdef CRAY # define ELEMS 800 #else # define ELEMS 200 #endif /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define ARMCI_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define ARMCI_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define ARMCI_ABS(a) (((a) <0) ? -(a) : (a)) /***************************** global data *******************/ int me, nproc; void* work[MAXPROC]; /* work array for propagating addresses */ /*\ generate random range for a section of multidimensional array \*/ void get_range(int ndim, int dims[], int lo[], int hi[]) { int dim; for(dim=0; dim 0)? rand()%range : lo[dim]; new_lo[dim] = toss; new_hi[dim] = toss + diff -1; assert(new_hi[dim] < dims[dim]); assert(diff == (new_hi[dim] -new_lo[dim]+1)); } } /*\ print range of ndim dimensional array with two strings before and after \*/ void print_range(char *pre,int ndim, int lo[], int hi[], char* post) { int i; printf("%s[",pre); for(i=0;i1 takes a partial plane */ /* create shared and local arrays */ create_array(b, sizeof(double),ndim,dimsB); create_array(a, sizeof(double),ndim,dimsB); elems = get_elems(ndim, stride, dimsB, sizeof(double)); init((double*)a[me], ndim, elems, dimsB); for(i=0; i dimsB[i]) ? dimsB[i]-1: dimsB[i]-less; count[i]=hi[i]-lo[i]+1; } count[0]*=sizeof(double); for(i=0; i1)? dimsB[ndim-1] : 1; strl = (ndim>1)? ndim-2: 0; /* strides of the subpatch to transfer */ for(i=0;i #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_STDIO_H # include #endif void printsparse_(int *irow, int *icol, double *a, double *b, int n,int nz) { int fd; int i,max,j; fd = open("matrix.bin",O_CREAT|O_WRONLY,0777); if(fd<=0) { printf("open failed"); return;} write (fd, &n, sizeof(int)); write (fd, &nz, sizeof(int)); write (fd, a, sizeof(double)*(nz)); write (fd, irow, sizeof(int)*(n)); write (fd, icol, sizeof(int)*(nz)); write (fd, b, sizeof(double)*(n)); close(fd); printf("dumped sparse matrix: dim = %d %d nonzeros\n", n, nz); } int main(int argc, char **argv) { int NZROW=8,NZSQ=64; int i,k,irow[NZROW+1],icol[NZSQ+4],n=NZROW,nz=NZSQ; double a[NZSQ], b[NZROW], xvec[NZROW]; for(i=0;i #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #include "armci.h" #include "message.h" extern int na,nz; extern int me, nproc; extern int myfirstrow,mylastrow; void computeminverse(double *minvptr,double *aptr,int *rowptr,int *colptr) { int i,j; for(i=myfirstrow;i<=mylastrow;i++){ for(j=rowptr[i];j=i){ if(colptr[j]==i){ /*printf("\n%d:i=%d j=%d aptr=%f",me,i,j,aptr[j]);*/ minvptr[i]=10.0/aptr[j]; } if(colptr[j]>i){ minvptr[i]=0.0; /*printf("\n%d:l=%d i=%d mycolptr[j]=%d",me,j,i,colptr[j]);*/ } break; } } } /*armci_msg_barrier();*/ } void computeminverser(double *minvptr,double *rvecptr,double *minvrptr) { int i; for(i=myfirstrow;i<=mylastrow;i++) minvrptr[i]=minvptr[i]*rvecptr[i]; /*armci_msg_barrier();*/ } void acg_printvec2(char *v, double *vec, char *v1, double *vec1) { int i; for(i=myfirstrow;i<=mylastrow;i++) printf("\n%d:%s[%d]=%f %s[%d]=%f",me,v,i,vec[i],v1,i,vec1[i]); fflush(stdout); armci_msg_barrier(); } void acg_printvec(char *v, double *vec) { int i; for(i=myfirstrow;i<=mylastrow;i++) printf("\n%d:%s[%d]=%f",me,v,i,vec[i]); fflush(stdout); armci_msg_barrier(); } double acg_ddot(double *vec1,double *vec2) { int i; double dt=0.0; for(i=myfirstrow;i<=mylastrow;i++) dt+=(vec1[i]*vec2[i]); armci_msg_dgop(&dt,1,"+"); /*armci_msg_barrier();*/ return(dt); } void acg_zero(double *vec1) { int i; for(i=myfirstrow;i<=mylastrow;i++) vec1[i]=0.0; armci_msg_barrier(); } void acg_addvec(double *pscale1,double *vec1,double *pscale2,double *vec2, double *result) { int i; double scale1=*pscale1,scale2=*pscale2; for(i=myfirstrow;i<=mylastrow;i++) result[i]=(scale1*vec1[i]+scale2*vec2[i]); /*armci_msg_barrier();*/ } void acg_2addvec(double *pscale1a,double *vec1a, double *pscale2a,double *vec2a, double *resulta, double *pscale1b, double *vec1b,double *pscale2b, double *vec2b, double *resultb, int *rowptr, int *colptr) { int i; double scale1a=*pscale1a,scale2a=*pscale2a, scale1b=*pscale1b,scale2b=*pscale2b; for(i=myfirstrow;i<=mylastrow;i++){ resulta[i]=vec1a[i]*scale1a+vec2a[i]*scale2a; resultb[i]=vec1b[i]*scale1b+vec2b[i]*scale2b; } /*armci_msg_barrier();*/ } void acg_matvecmul(double *aptr,double *vec, double *result,int *rowptr, int *colptr) { int i,j; double tmprowsum=0.0; ARMCI_Barrier(); for(i=myfirstrow;i<=mylastrow;i++){ for(j=rowptr[i];j #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_STRING_H # include #endif #include "armci.h" #include "message.h" extern int na; extern int nz; extern double *dmvec,*svec,*bvec,*dvec,*amat,*xvec,*axvec,*rvec,*qvec; extern int *ridx,*cidx; extern int me, nproc; extern int myfirstrow,mylastrow; static int *columnmap,*allfirstrow,*alllastrow; static FILE *fd; void generate_random_file(int naa,int nnz){ fd = fopen("randominput.dat", "w"); } void read_and_create(int argc, char **argv) { int ri,i; int tmp1,idealelementsperproc; void **amatptrs,**xvecptrs; na = atoi(argv[1]); nz = atoi(argv[2]); if(strncmp("random",argv[3],6)){ if(me==0){ fd = fopen(argv[3], "r"); if(fd==NULL)ARMCI_Error("unable to open given file",0); } } else{ if(na==0 || nz==0){ printf("\nERROR:exiting-no input file given and na or nz is 0"); fflush(stdout); ARMCI_Finalize(); armci_msg_finalize(); return; } if(me==0){ generate_random_file(na,nz); fd = fopen("randominput.dat", "r"); } } if(me==0){ if(na==0) fread(&na, sizeof(na), 1, fd); if(nz==0) fread(&nz, sizeof(nz), 1, fd); printf("\nReading CG input\n"); printf("Number of rows: %d\n", na); printf("Number of non-zeros: %d\n", nz); } armci_msg_bcast(&nz,sizeof(int),0); armci_msg_bcast(&na,sizeof(int),0); armci_msg_barrier(); amatptrs = (void **)malloc(sizeof(void *)*nproc); xvecptrs = (void **)malloc(sizeof(void *)*nproc); if(xvecptrs==NULL || amatptrs==NULL) ARMCI_Error("xvecptrs amatptrs malloc failed",sizeof(void *)*nproc); if(ARMCI_Malloc(amatptrs,((me==0)?(sizeof(double)*nz):0))) ARMCI_Error("amat malloc failed",sizeof(double)*nz); amat = (double *)amatptrs[0]; if(ARMCI_Malloc(amatptrs,((me==0)?(sizeof(int)*(nz+1)):0))) ARMCI_Error("icol malloc failed",sizeof(int)*(nz+1)); cidx = (int *)amatptrs[0]; ARMCI_Malloc(xvecptrs,((me==0)?(sizeof(int)*(na+1)):0)); /*+1 for end of last row*/ ridx = (int *)xvecptrs[0]; ARMCI_Malloc(xvecptrs,((me==0)?(sizeof(double)*(na+1)):0)); xvec = (double *)xvecptrs[0]; ARMCI_Malloc(xvecptrs,((me==0)?(sizeof(double)*(na+1)):0)); bvec = (double *)xvecptrs[0]; if(me==0){ for (i = 0; i < na + 1; i++) xvec[i] = 0.0; fread(amat, sizeof(double), nz, fd); fread(ridx, sizeof(int), (na+1), fd); ridx[na]=nz; fread(cidx, sizeof(int), (nz+1), fd); fread(bvec, sizeof(double), (na+1), fd); /* the c adjustment */ for (i = 0; i < na; i++) ridx[i] -= 1; for (i = 0; i < nz; i++) cidx[i] -= 1; } armci_msg_barrier(); /*acg_matvecmul(amat,xvec,bvec,ridx,cidx);*/ if(0){ for(i=0;i=idealelementsperproc){ if((elementsperproc-idealelementsperproc) > idealelementsperproc-(elementsperproc-(ridx[ri+1]-ridx[ri]))){ alllastrow[i] = ri-1; if((ri-1)<0)ARMCI_Error("run on a smaller processor count",0); /*tmp1--;*/ } else{ alllastrow[i] = ri; if(ri<0)ARMCI_Error("run on a smaller processor count",0); tmp1++; } elementsperproc=0; break; } } } alllastrow[nproc-1]=na-1; for(i=0;i #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_STRING_H # include #endif #include "armci.h" #include "message.h" #define PRINT_VEC_ int na,nz; double *bvec,*dvec,*svec,*dmvec,*m_dvec,*amat,*xvec,*axvec,*rvec,*qvec; int *ridx,*cidx; int me, nproc; int myfirstrow=0,mylastrow=0; double epsilon=1e-4; double time_get=0; static int niter; void read_and_create(int,char **); void computeminverser(double *,double *, double *); void computeminverse(double *,double *, int *,int *); void finalize_arrays(int); extern void acg_matvecmul(double *,double *,double *,int *,int *); extern void acg_addvec(double *,double *,double *,double *, double *); extern void acg_2addvec(double *,double *, double *,double *, double *, double *, double *,double *, double *, double *, int *, int *); extern double acg_ddot(double *,double *); void conjugate_gradient(int nit,int dopreconditioning) { int i; double d_one=1.0,d_negone=-1.0; double delta0=0.0,deltaold=0.0,deltanew=0.0; double alpha=0.0,negalpha,beta,dtransposeq; acg_matvecmul(amat,xvec,axvec,ridx,cidx); /* compute Ax */ #ifdef PRINT_VEC acg_printvec("axvec",axvec); acg_printvec("bvec",bvec); #endif /* TODO original call had too many arguments */ /* acg_addvec(&d_one,bvec,&d_negone,axvec,rvec,ridx,cidx); */ /* r=b-Ax */ acg_addvec(&d_one,bvec,&d_negone,axvec,rvec); /* r=b-Ax */ #ifdef PRINT_VEC acg_printvec("rvec",rvec); if(me==0)for(i=0;i(epsilon*epsilon*delta0);i++){ acg_matvecmul(amat,dvec,qvec,ridx,cidx); /* q = ad */ dtransposeq=acg_ddot(dvec,qvec); /* compute d_transpose.q */ alpha = deltanew/dtransposeq; /* deltanew/(d_transpose.q) */ #if 0 if(i>0 && i%50==0){ /* compute Ax*/ acg_matvecmul(amat,xvec,axvec,ridx,cidx); /* x = x+ alpha.d*/ /* r=b-Ax*/ acg_2addvec(&d_one,xvec,&alpha,dvec,xvec,&d_one,bvec, &d_negone,axvec,rvec,ridx,cidx); } else #endif { negalpha = 0.0-alpha; /* x = x+ alpha.d*/ /* r=r-alpha.q*/ acg_2addvec(&d_one,xvec,&alpha,dvec,xvec,&d_one,rvec, &negalpha,qvec,rvec,ridx,cidx); } if(dopreconditioning) computeminverser(dmvec,rvec,svec); deltaold = deltanew; /* deltaold = deltanew*/ if(dopreconditioning) deltanew = acg_ddot(svec,rvec); /* deltanew = r_transpose.r*/ else deltanew = acg_ddot(rvec,rvec); /* deltanew = r_transpose.r*/ beta = deltanew/deltaold; /* beta = deltanew/deltaold*/ if(dopreconditioning) { /* too many aguments in function call */ /* acg_addvec(&d_one,svec,&beta,dvec,dvec,ridx,cidx); */ /* d = s + beta.d */ acg_addvec(&d_one,svec,&beta,dvec,dvec); } else { /* too many aguments in function call */ /* acg_addvec(&d_one,rvec,&beta,dvec,dvec,ridx,cidx); */ /* d = r + beta.d */ acg_addvec(&d_one,rvec,&beta,dvec,dvec); } #ifdef PRINT_VEC acg_printvec("xvec",xvec); #endif /* acg_printvec("xvec",xvec); */ } if(me==0)printf("\n\tIteration:%d\tBeta:%0.4f\tDelta:%f\n", i,beta,deltanew); niter = i; } void initialize_arrays(int dpc) { int i; for(i=0;i cg.x na nz file"); printf("\n\n where:"); printf("\n\tna is array dimention (only square arrays supported)"); printf("\n\tnz is number of non-zeros"); printf("\n\tfile is either the input file or the word random"); printf("\n\t use the word random if you to use random input"); printf("\n\t input should be in row compressed format"); printf("\n\t file should have matrix a followed by row, col & b (Ax=b)"); printf("\n\t if file also has na and nz, pass them as 0's and the"); printf("\n\t program will read them from the file"); printf("\n\nexample usages are:"); printf("\n\tmpirun -np 4 ./ga_cg.x 5000 80000 /home/me/myinput.dat"); printf("\n\tor"); printf("\n\tmpirun -np 4 ./ga_cg.x 5000 80000 random\n\n"); fflush(stdout); } ARMCI_Finalize(); armci_msg_finalize(); return 0; } read_and_create(argc,argv); if(me==0)printf("\nWarmup and initialization run"); #if 0 initialize_arrays(dopreconditioning); conjugate_gradient(1,dopreconditioning); time_get =0.0; #endif if(me==0)printf("\n\nStarting Conjugate Gradient ...."); initialize_arrays(dopreconditioning); time0=armci_timer(); conjugate_gradient(30000/*2*/,dopreconditioning); time1=armci_timer(); acg_matvecmul(amat,xvec,axvec,ridx,cidx); if(me==0)printf("\n%d:in %d iterations time to solution=%f-%f ax and b in cg_output.out\n",me,niter,(time1-time0),time_get); acg_matvecmul(amat,xvec,axvec,ridx,cidx); if(me==0){ int i; fd = fopen("cg_output.out", "w"); for(i=0;i<=na;i++) fprintf(fd,"\n%d:%s[%d]=%f %s[%d]=%f",me,"bvec",i,bvec[i],"axvec",i,axvec[i]); fflush(stdout); fclose(fd); } finalize_arrays(dopreconditioning); armci_msg_barrier(); if(me==0)printf("Terminating ..\n"); ARMCI_Finalize(); armci_msg_finalize(); return 0; } ga-5-4/armci/examples/benchmarks/cg/armci_sharedmemory/timing.c0000644000175000017500000000234412662210433022756 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * Copyright (c) 1995 by PDCL Corporation. All Rights Reserved * NAME * timing.c * PURPOSE * Timing routines for calculating the execution time: * void start_timer(void); Set the timer. * double elapsed_time(void); Return the timing elapsed since * the timer has been set. * NOTES * Jialin Ju - Oct 16, 1995 Created. */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /* Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /* Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /* Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /* Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/cg/armci_sharedmemory/generateinput.f0000644000175000017500000000245012662210433024342 0ustar mbamba program matrix_gen integer*4 i, k double precision amat(8,8), xvec(8), bvec(8) integer *4 irow(8), icol(8*8) integer*4 timeArray(3), ei,sf; open (unit = 8, file = "matrix.bin") ei = 8 sf = 64 do i = 1, 8 do k = 1, 8 do n=1,100000 call itime(timeArray) amat(i,k) = amat(i,k) + 1212.12* & rand(timeArray(1)/(timeArray(2)+timeArray(3))) end do call itime(timeArray) amat(i,k) = amat(i,k)+rand ( timeArray(1)+timeArray(2)+ & timeArray(3)) end do call itime(timeArray) xvec(i) = rand ( timeArray(1)+timeArray(2)+timeArray(3) ) end do do i = 1,8 bvec(i)=0D0 irow(i)=(i-1)*8+1 do k =1, 8 bvec(i) = bvec(i)+xvec(k)*amat(i,k) icol((i-1)*8+k)=i end do end do write(8,*) ei write(8,*) sf write(8,*) amat write(8,*) irow write(8,*) icol write(8,*) xvec close(8) write(6,*) 'amat =', amat write(6,*) 'xvec =', xvec write(6,*) 'bvec=', bvec write(6,*) 'irow=', irow write(6,*) 'icol=', icol stop end ga-5-4/armci/examples/benchmarks/cg/armci_sharedmemory/matrix_med.bin0000644000175000017500000172535012662210433024160 0ustar mbamba1 aďAF1=HׂۛNhze-t'n%cj }R-wi4Hπv@Acv@yy@,B=ٜ@H @@zH@X媾@7Y;* uא9@)g?hbmٹ@^#X@=$@"iZ@ge@3K6@WD>@Ȑp@3@ODInP&q@Q@@܂x˒CN wp@I(!@Mڥzp|Lq`@~U)eb_M@"S+CLy@N0`<@b#i1+@q*,މ@ f֢4*H@BE$o<+@{?lCƪ6( O-WF AZX;-#AbAWhO\c=rTi@.2P@@ݍ9M;x@Be"犚@ *@ 9@mS\eb{1h@{n\@l!m?@XrY7AD=\@(HQ]@6h+wt<%nk@rԷ@g@ɀFPk#dP^@74p\J~,fQ7`@3G)U@*cS~+he@w(L5ɔ@@uAZFn"@h'AAuơ@${8)I8m2@$@}@[d@ӳ$AX@Vx@kIAIeRHC,@-L@u+@0 9@!@B4D@!@B4D@eT_@Gbڡ@X8@Xm W@ŌsC@ e r@)EDZ@q 7u@垴g#AXB AAuơ@E`A2uR&팕K~WEvp@@fI@c~#RڰV@iV?@\VM٢@-Lr@|-G@C> @#'{?@'1|@B3^@+n@2;LC@XYd@USקA@p7R"@@"U'%^wuz| hōe@H'p5@-]:=n@"@@I^@!@Ro1@SPA0@fͥry@\9@|'RUX@0lRo1!@PTO@b@M@HЈ|'RUX\9@GX #y@āydhY:sLQ@=헬@H!>@s[>PJׂ@ZleTY@44QyNjn_@ Coml[^@X_l@&NMe.z@yo_@]A{8@S%TU]3]gs[>q@K+xY@be311@3 g@L__Xl",ܗl@<9 Q@e7@o5Bp]@yo_@S%T@A{8@LIog"?`;#A.2AI@-@z'сCPW0锢)^R +@i"EJ?y b'Kw2$;TҴ_1Қ@?T- 0@ϔ UEL\ 4\P@YVnMk.2A8HApAj:K@t@mԞ@RD!Fk@K-4WAf]H?@\z ~>T/kf3w,Ea@-\Cu@NcvaTϺ햄oEY"Ɍ"oL;`SL^/.z@&.Z T<@;vg@95=Z rg@(Q)r6Aߞ!hW@f͙P}@㶰X?3FةޘAQrNDXAF@t/h]@&+ffB@=P~v@pAk@pr ;@ê)?y?@÷2;!!YC@諽# A_4e)@ߞ!iǑA(a}@5Wb@VR@͸lS7@; qpzB@NJ^ '@vP@^Z 3 Sn@ou2s\@iǛ@<' Dh[a@|M?_c}FAm|/@6DwBb@ǼAr\709Zz@?E. !J@ļp4@שutTO&nƒ&eB@ ;^@٬-G@ړr@Pl. @S,@נ1@h Y/8@"Jss#Br\tA A?*J@Zk@䰅%а=w@iV2lANK@ #0}GI=@ǁj?O @;@ny%&Рu@EFۉ}?Mkce'BݣFشfX1N@fv%@^аW @2=>8@eoQ1D@ū5̣YJZGC4@W8ύev%@@X1N@TE@y^B(~@"c+@ѕk*'@kRBF=@TZ@QHsΪ@ŖC%/foJJ.@U}VR,(@Pa +5hI)I@A3'{[\ο##A^Ό ^UFyp)@(vPx2G]R@0K@U\gݧz,@V&GpAy^B(~@s ~@ѕ@"c+@>aFMgq@MZBF=@ĖC%/fo@PHsΪ@Lu9 hMqu@!k0LGMl +@alE9S\g@0K@ =KQg@oT’@bF3@Tt^%@X>d3kt(@٩?񊝝uiR]`@oT’@2V~؆@t^%bF3@`2`<Щӡ? *U@ oys_`@>Ww4t7@J(qjjF @g▜$_Za104Pgc@`f =@< h^@ĿtپB@J(qjjDp'@^c$$ئ@@V~8c@_R4]FR=@S r3_dC@lR'@i*!ϥAxn @$xH XJ ݬm@lt#}@x @x7Y~@V(q @+!]@Bk@Tįv@;@o97!&gzbެCr/U}@F$@h==M4r:vaf@-vL?xn @Q\}JAtN|~l@ ݬm@h t#}@V(q x7Y~@Bk*!]@;Tįv@Ք1~2KܹAeGIs*a8pu A CyɔE"A)55$AFFOu%YOAM[ <2z@nκ4@lg5 1Q AFM4!AējG!AsG+?_mo93H@ԝ\y?c 9pEqP R8-vL΅af@Y-@R\@Clt@|? e'@@}zï@Hv?DVg@C|K5Ze@ !+L_٦ɿfÓgR@Tr"xiLI{=U@z0 kqkyv=cw_S53ijnR\@R@(&4A@:JD @Gv}zï@HxL\d@?i=1@h@;^Tr"xi@fÓgR@W;R@ Ѧqkyv=cj떔70JmF)W{7R"@B O/hR@GAn8 ~@)7V@XV )7V!ݑc?e@R!f?1kv5ggBs#m?%j@$B:@'2]$B:Bx%Q@@"U'%^w@SAe`v@B F>Y󅂩qU5{@Jv##@k|}@+4L~FQ4n@4n@+~é\=@s!6cod 1G2۸"U'%^w@e`v@9bA$xaif SfJv@qU5{@k|}##@Tgn3p$@3/4n4n@tR׋3(@s!6c@\=@[{o}%B F$xgؗA2+E@חq@ Δ@MS:Ɇ@6@pY󅂩aif Sf2+E@orקAcv@C|ZǗ@m۶m[AՋOSr @ @E_@) @@,zVص@!@td@KF@]tE@ Dp8@ͱF" n@?.@td@΋@ļ!@X'=@}A&J@'ޑ{[u@*Uv@,,4@Fѐz@͓1H@~pQ^@|ɝ+@~}!"@W&3F@foF1.z@QA:@%sv6V0LSS@%L@*}%8@B (8P@7<@Xb_R"\9&3 'hLNH僐$h@!e8@^1iyIN΅?R]2^@k۔CC@Inw|PKaI" :,i uO'@?[Ε@;m@vao0@5zN$xH tN|Clt@(&4A@oF^[A @ƇKP@$oc6(@C26a@38 ٪eAaY֥@<;_tmOM@}K=jVj?C5I] 6qn`5=V@ɨ{n$1%!'@tJ\|BvNYLBJ݉@bV@-ŽK@_yd@0@^Wb@x .@8\ M&XJ~|? e'@@:JD @ @UmAj3`"@hL_@;R+@Nm@&<;_tm@aY֥@_ @՘o*#@\Av@m@ _`-̈́h$d@j8IPDö@Iiux)Vv@? @Ixo2ab%/@ͨ{n$@n`5=V@_R [c@s@J0WP br'T@&!@AJc@५[/@K?A/,@ A5h?URP|@P:@" i_a󶬵7@?קAɏ]ק5GQ+@gf@|t3gJ"@=2@L^q?ɏ]!_mAUoj|t@gf@]&(r@- F&!L^q=2@ }-޷A)iQ@6K@$#۷ X;i@;tBW @Q@O@)~@)Gkk@J`Dm!ĭ=NY@춦G@Č!.N<)iQ@A X;iZ)ާtP`@$8BN@lA7@8WB"N<@ *ɑ~)@M|@ ?AЫyd/@lJ@7C}[H@`E@,@#=n z%'nz팝v@o3ÿ9~s@1&TC@ 6;=.P,g @Z?mn@"%'XM_oE, W5Y@˶v0 +qR@.V_ W@{0Ƅ@򼡻]@_wgzk@X9)7LHm[ ee@fىW@-\}(@cY_@?MYGEWalJ@e?b@IF@]N]t@1r. b@0j ߘn3?oz팝v@!}jR@ᴗ@]Y3;~Ӡ1Zg @"%'X@mn@Y M/2ɿrG I$bR@X5~#@*鯅Q@&{iys8TrX9)7@gzk@QHd_NMгa7YV@쪏j#@ݿX@诂*@f/ZIg7 wӷpȓחAt.ޓ}@חb @0Q  srqE^"@xGJ W@t.ޓ}@KSO@ĥ=[T@$)NGdLVRVo'W@;!)@>א9@VȀZ#@VחATd>&s@$! @`қڗ@L &@kz@9R\@j\Jj2@ UAEolw&v@&?@)g?ZTdUקA$! >&s@קj\Jj29R\@Eo@ UA&?kw&v@;קAށ:h r+-(L5@ק;Yy)c"^@H ?~)dDN5"$B#@0xԥ: ~ ^ᡪ#i_@t5{6PG@R6T` &SKwB.ށ:.\חA,q"@@ɻח7$@H ߿y)c"^@_p5y`n eWbS9L~Q@VwO_@-佅2qohS#Nzf=gUb@΁?]]HFw${82uR&! XAB)AҶ@Gs :@!ߒɛ !`6K@L4iҸ @Zx@j|i1@6^uNc\Qy@O 7S0@&qҌO@BvjBЮp-7`@h %?PX8?`c@'gaU2@;.lNg'kڙ{zt)e@˩J lզ& |+9 M1FX)I8팕KB)A7 rVhwv3A*x5C BxNz aAH|ɝ+@") D@WbͅS:P`@2Pu@<" @VN,@<ϧ\@WV #@2AkS#²?IyO@Eu=@Gma]ҽߖJ\xu˜ѾS@=StNOo1c&@ oG[Q@Qaڰaj~}!"@Wba@6ɒcIj@@"?u@NN, @VV @<ϧ\@2AkS@#@YY:C@7-7Gma]@Eu=@?@I"eU~w(R@c>3@zԣL͞v Qy@ke;qXi2G@0Z&G&@%-q!_̚@G{X<@=ї[;U&Ip[@-K$>v!>_@G{X<@8=Ж@[;U&nuc+ y&@+}@1l$ @`oZ?RJǛ@ 1@Sp@΀Pr@-<,fqrmާd@N! @l7m@`oZ?w aH @>FE@Gmy@+ @{"KX@X7Z u, @[!x@~ KyUb@PJׂ@K+xY@8C%@Lݮ AiiɓA|@#ԑ@U@"4*@: DZleTY@be311@Lݮ A@8|ۀ@zD")'?0ۿ(&s )E 90`@1qÇחAp)8T:ח"X:@ %)!@lR-oLYEu@!@lR-@p)8T:Ax ܧczF-@ 0;$$^Z@-C6~(@E9"(A8^(cxz@Ʀ9+bI 5 rX"i@tZt@?8^"3"Ao_B\g$@yq`Ki@#J="wѿtZt@(sxLA :PBȢ@B!@E_@ Z?@ہv`N@<f@Lw@>#[vm@Ppͻ@jVpB@@i@qo@yPē@e @c! Y:@@tj,@aV~TaN@7YA{I@(]7 :PBKqnקAקHq'N@ 0pRs7saS@@{dqE9-kڐ:;@w$oEB@^K}n<'@%}?sM w@Q$QyU0zmyc@^qH7w,@%% ?z@m-Q@A(N}{Ǫ>X1.@d џ@osw@{dqE9Y5T@yhi@9c[vl7ZJ7Ԇu@& כ@&^֓ރ @U 3aeP#`@Mڳ#In@`rfW,A髨Xkue:@@Lw@i?NX3@NF@@k *Kn@H@yy@NɍX@,c@"(ݿ髨Xȕ@ 8ڃX@;I(?,c@۟x5@?hT?@**T@%bB@jfiߥ]5G@m@,zVص@>#[vm@X3@UmM2h@aqcQ@Oz~L@l۶m@qq @F:@@!_[O@Fr@q9KLpB@]9APopnBZ'P@ɮ`v@O aL@Nh|@q9K@Fr@]9AP@LpB@\ fp5踫9?ɮ`v@ƇKP@j30a~@wm t@YJJ@Y@DmM@EU׾@%o@hB{[]@Y!TL@ut$NJ@L,a@7u "l-@RMZ/%^u0D?HBd?]T$uvu@.,Lc@$oc`"@wZ2==-@YAA@p @CF.Tj!~@a.h@k?PK@h6@Z:?qAXwx^@ W@ˮ;'.@DD܃h9-/zl_Vtәz;^{@<MLSЂ3oۈ@늴B@`0@}zï@Gv{{קAh0pgק86DsZ@θ$cUҚNf@Q9ؿ3-@Hv?}zï@h0pgBNחAחθ$@86DsZ@pc@k~ 3-@i}l8חAs zחw]I8\5~@[&1 @ՆfRs z%GקADQEQ`Atd@ƃٹ_@ļ!@jVpB@yZ?@aqcQ@SV.O@gI "W1`@mέ@;tBW @?H՗@[lp@*~@e aR'g@"U :@oQL@rBIlv=*7@PW3@ @+46WAB5A0*@d:O@46WA@rBI|@znӑO@Yc@!D7&ۇA33@E>@V7@;@{54@YccQ n@Z@ ;/{/ib:8@efuB@Y^>CZ'@y'R259n`"'T@ ;/{@$+Ą@(IkkVԒ@r3QZ+|@( @P@?9H#^9hW@(a}@U.A[c@W@ws5B!`Ɂ@Ց0pIoʊU-1$hF@g|Ƹhbť)@YtDF@F 9(+@ٕNo74:iMV` <ꂈ44Av,p~h=!4J<@.AD3YZJ@H@;WZbqӒ)@W0z'g>k.+@?%y@v;죗C֫[y2Dn `ĭV@srw$*_qבWcXFW&3F@ z2A}D*T1VYx@GA@Rƻ Rd0lDX Id. D~ѧo@ {?@ &d@sZ@-,XO&Ti+:lj@'zq@=pԓf@= dtfoF1.z@}DptybAA8@Z;pOA{DK'ί@0@VW\%7y:@V0 {?ѧo@sZ &d@&Ti@MguQ9r@~ťX@vmE¯@puO@ִ]>썟CNb@DU4֝db@#^yDh@QF9@J}$ɃִHA,B=ٜ@˃ @KF@E6xnR@~ CV@@swqc@u\H@tj,@\~o@ c@CuI@fOG@?t8e9?+r$(&M@]`(@K}$Ƀ@QF9@٧A]a׺קeIvA_4t9qoj.F~@m.|.K;@]a׺Dm7QAIy].^D%ʛpDAxC|N TT$@#e$d6@g(vkjԝ{vo t ݏ1j >V@oO@+T!@D2 a.0q!YZZZA@Myzi!] A*o@VCۦ$HfEDA5A@xC|k1AN TTd#@{ޱu0Ԯ:@R5@I\@j}r oO >V@+TaD2 ա@q!@a)q YZZZAMy@ ূ@Ճ+X"*o Aw@UlJ$5AfEDAԃRקAmǶ<ק*ȰCAKf]A<@PGw*Gr@يb P@Et0Z@8R@@mǶ<q AgDnAx!S@b*+#Et0Zيb P@8R@/R߷@0m9_IM@W=1R3ZapKR hŧUk@=˼7@,3 yk~1i\v#пIaɼ=@`3#q0)@G޸@+vV d@c`qM."M>r;E@߀ @/2}@3NzوfZW@p+=Mh*q;lfE@qU5{@Jv@5 %t@Y`)XǭmKBq.%@֎@$8,]G [ )@ѽj?t8 VD@@Z;>@84oa@g7lFK%@JvqU5{@YU=Jټ AUbK@[r/cF@%8,]G@֎@%h^if>@ Fĸ؃zZ@@84o@;>@)]T3@~8 "c+@ѕ@8@BL3z@od@sYI@_}V- 2+0~c@ff*$;2jy@QoF<:_4"9@{Հ8\@B9ݜyu@ WצBdp0@*O'W@D+O55w:d@qGb$6g@E'5m b@"c(K @`YΊ{uݲR@GMҠ2@3ŧ:~y@o9Rs@V@ݿp@|ciݿN 3iQk@!kDưg@Xit(tW(@ęu"|@:uy@/y_@Jbr> Bl&s@r7#(v@:(6j;.,{f@ATAѕ"c+@BL@8@od@[[*٧A_}V- @sYI@ff*$@2+0~c@QoF<:@;2jy@{Հ?_4"9@B@8\@ WצB@9ݜyu@*O'?dp0@D+O@W@qGb$@55w:d@E'@6g@"@5m b@`Y?c(K @GM@{uݲR@3ŧ:?Ҡ2@o9@~y@V@?Rs@|ci?p@elNXit(@קęu"|tW(@/y_:uy@O @uB:r7#(vBl&s@iLX%ATA@{f@N TT$@N TTdP9חAVLחN`@u$o@"\@_&#g/@FO6d(@)O\K=#fuxI3K Tn@#e#@VLMA*`9au@=M@V BT(@Lz;y]ǫɞ@ q@9@0FDVg@HxL\d@6(@hL_@4D@V@G F!>n$@Wj-?;S*CX{?z@ߩ,@r[1cQZ9S7Jab +#} kjC|K5Ze@?i=1@C26a@;R+@V@1n@[g,G. tVK@+j@%*@zlqJab҆56u-2?շޜO\{A8}e@H @@~@]tE@wqc A%]H@Jp3@i@Oz~L@rޖg@W1`@wqc@ nD}6Ч@G7@) @A_@?Ÿ@@խK@ @E.b%z@s<*P@%O@JQUy+@sx#zV#Mt8}e@9A}6Чj)s<*PE.b%z@JQ@%O@sx@Uy+@ wڙt@r@#FE]2 AVb`@S;eVb`Vb`@OoקA|h@k *Kn@l۶m@T* W@Vb`_&٧Җ@ &;@IAȦ@='1X@hihp.?1Xfhp.˿hihp.?(Z;~@hihp.˿+9|QEȳڧA4:קfyAnXzX@]I;@NtfӺh@C8@3wh@ɛ"g3[N@4:hVL@A  @.c@@ ,4:Aɭ!I$d6@{ޱuuċe@Ytqx Z?;]ʈ owu@C27nB?[VrEl@S J@a]bFR@bFyL@nqA8!}glq@+c(@Eig(v0Ԯ:@Ytqxs EΈ@;q@ h;u[tT {ƹ@s~@/jo9}׌a=@웓@nq@yL@L Bq(}Fi@+c(@.Lj@ @l -<@wH@ġYg@)UQBDC@&rKA@.Lz@ @l -<@wH@"OFġYg@8@r8QBDC@&rKA@hbmgH>&s@$! U]:A_B@Pl(ѯc%Ѧ)@XXR`qƂ@|pl@7~r@?ܙ\@ųk_,@q5WCW (3!xo))U;8y Dحc}@B2!߶@@ plՌBa@pn}!mJ@Am~wLQ@fmkՉѿ]|8WC$! @>&s@_B@חA R+%חE#^PQw0e1')Xjx@PkCTkr@Xf@pR;gR*[@#T@ۛNhoT-A]Ea>A70@&7.A+wbA&7.N>6@JU 3 (@ö @=bW@=]@~ |mwu`ze-Qo"h70@K֭8>A&7.A&7.A+wbAݴ38=RmI@ö (@=]*@HGRl?7=s@2_Nf@4 @@:4@@ u;$̈́eVYx@Z;pOACen(NN@A"@7\zw-'@]GRlƅE>*@ =If@?-%Y@A:44 @ u@@ĭ 6@]_*I&7Z@<`l>1\rf8S"@9}R@TK1>@Z+@SK11~½=asyT@{)a@֎7V@,Y'YSn"j@5Cg\P^yB@i K@D'b,Y'YLs@Nj@wd@-ǕB@webR2[b7w@wi4Hπv@H @@zH@+wbA&7.A+wbA&7.A1jA[@I{i\.ܴ?7j?{~9@rlan?6?Sd@۷r*qMn*@S0;/ߔ E@ϥ?Ќ+2?W?jU h@l*1@'=&%@!Sx^AAπv@AmBcv@,B=ٜ@X媾@&7.+wbA&7.+wbAקAV}?˧w@w@O?DB*\?:޹?aMG@~{I_? ⶲ?.2?S>T?\݂@y<A#~?ܤP?B/DVY(?@E`?EN?ËV?78\@'=&%l*1@!Sx^AȢ@i&@kue:@ >G@sYI@_}V- @M!¿@`!MU#@@ClF@u e@D? 9@dЩhό?f`+ћJ.ա"1-@Ho$@Yoߪa?$K>?’҄ɭҿM1FE?Pb]2?!U_}V- : z? UN @C|ZǗ@i&@ח_}V- sYI@|h@V}?![חA~S@`7ݗka?~)?*Ib@d`?38?|z@^ύ&p@~ @8)ih+?O?4#u"⧪f@C]d?C(BQmD|ܫ#@Acei%@ff*$@g3L?Di8cv˛?_r\s?M. ɋܥ @Vgbn AsHAcv@חE_@8!V@@,zVص@;2jy@QoF<:@]tE@ Dp8@ͱF" n@I{iu e@QuF@חAjC0ra@b ?'9@H<ʥ<af@Χmq٢ŵ;RF@Rj_#92@_ak O@Y7%mb -@ݓ/5 QoF<:fۇ@g"@P}g?r6IJ ?blC@m۶m[AՋOWVW@) @td@KF@?.@QoF<:;2jy@w`7ݗ0ckh5 Au>zڏ? % H(~*~d&<IK{9!۩rOo6-pe\?T5IVkئm v&-QoF<:@wsp( @.߂2G\?[S?sp( De$@yy@ק Z?@k)@_4"9@{Հ?wqc A0No@!!@D?+=@jC0ra@sקAf*@s[.P!@q'+?0Z?4/@_$@徒|1@ّ4Ag? ՄHk@᳍3@2ͼ?z;?g+a@)6S@ 0sjfn(X1? ?y @S1$3@/5l p]{Հ?- '{?gu(?!\2?}N8?-8@5GQ+].%Aח%]H@&yyٔ@\.ܴ?nY?b ?f*@j>)חA4׶? ?~Ii?CƏ?PLf?[[Xa?+"Y } G?[3ڔ죡?k8?~ CV@_"*I5@elЁ3@DB*\?YHQ?zڏ?g?E.xmQ@2?V|S[M4@92?"cQ6OD~?*:7>\g@%3>\gQfd@nPV&@`қڗ>ڤݗAhg?Cl GWd?X{?rE_SځX{?_v-+?*)>@_Sځ@קQקAb\קקAחחA-Nחہv`N@6ys8@8\@B@Jp3@<@7j? 9@L@'9@s[.P!@4׶?YSքחAwVf 1o?Ħ @X )@8[z#@`%܇!@&?( 諭91?DIyդ7?J?+ fB $:@W:?2"ޫ?d7d&@}[@ @"X:@x ܧ$!5:@@V\@ļ!@B8\@:޹?~)?(i[ % ՄHk@5O년קAy>@kyL4I @P:@Ƭ+ @֚ϕ@'@25@w/*j8?1@ Yx?k?&͕?B@]'f&HSmm?@ z9EiI@"X:W㡓A&HSmm뿢K|]@<Tg^@Lw@>#[vm@9ݜyu@ WצB@i@qo@yPē@{~9@dЩMR"H<ʥq'+ ?wVfSJAQ}mkr?/blW@_dܨ/)@\hYqţ c>ˌ WצB2"<Hh)R?v4h?WT |;B!@E_@ק'N~a@f@jVpB@@e @ WצB9ݜyu@aMG@*Ib@F`$ ᳍3@2?y>@ʅקA,w~; -@3t&:@.Hx?@U=*6Ֆe$ I@jo+@P@  @H}v WצB@:f7BQ!@6GT@?S O}M?:i \@BQ!"/=@f@ @חdp0@*O'?hό?`O5?<af@? 1o?Q}חAGW?$٭~?5~?(=?[$??3?pm@K?ܚ铵?U? ;*O'BnWJ?zAܝ?i9t<@) @ @T: yZ?@*O'dp0@~{I_?d`?ONH2ͼ?kyL,w~ȠK}A???_-? W:R?vd9@3?zNϼ@Yx#?\?*O'?#m";?>Lw@-]4@i?NX3@W@D+O@H@f`jv+N@Χmq٢0Z?Ħ @mkrGW?UrAU$N3Kok0v@TZϥ?FG@N 2m`{MV?o)?,hk|hD+O.l?@z9G@@-]4@D+OW@k *Kn@ ⶲ?38?Ɋ@(z;?4I @; -@?? B6^@䱴 @ }@Ĵ]Ҷ@T?d:}@C oP!@cK V?]??D+O@ ܬes?c[@KP 75AyE8X157(E@]˖KyEL5A]By5yE@?x5>#[vm@35XA@X3@UmM55w:d@qGb$@Oz~L@qq @rlan?+ћJRmŵ4/@~Ii?X )@?/bl$٭~?U$N3=A_83-70B?yyS=]2>nd?{C?9qGb$]ɬ•l?_3?^OJ.m@,zVص@$&B@aqcQ@qGb$55w:d@l۶m@.2?|z@5mc~*g+a@P:@3t&:@?䱴 @`啜{G@2zE@zJ8?+d9t@9 H?qGb$@r}׎Y?BƩAeu,@}׎Y2b @Ppͻ@ٹH6D@NF@@2h@ק6g@E'@rޖg@sssss@6?.ա"1-@Ȩ'0@;RF@_$@CƏ?8[z#@W5~?Kok0_8b>קA2`g*@0O};?Y.oj@UK d?bO?pE'a@$o%Qc?i2?+0@ʙ N@!@PYiE@חSV.O@E'6g@T* W@S>T?^ύ&p@u4AH7~d&<)6S@Ƭ+ @.Hx?@_-? }@2zE@%P]IחA7|l+Fp?<ј@] Xej)!?/aU?%?E'@}9^MiuMu?6qvy]1@Mu@jVpB@?6?@aqcQ@ח5m b@"@W1`@mέ@Sd@Ho$@i~Rj_徒|1@PLf?`%܇!@@(=?v@3-2`g*@8חAˉ@\xzdGJ?~`@⡪@Ho"%AK@@f?L4?'(/DQEQ`Atd@kZ+@@yZ?@gI ""5m b@\݂@~ @}KsIK{9 0sjf֚ϕU= W:Ĵ]Ҷ@z7|l+~T'BAs0#@kt+ 7?FGᗭT|a*@e5T@"@K;I4 pߣ?# [t4 pߣ,R# @,B=ٜ@@Px`D?c(K @`Y?wqc@u\H@۷Yoߪa?-No1@#92@ّU@ ѥLYag;bl%`YKJ?[r?HѾ?,* O@˃ @KF@Px`D?stj,@`Y῔c(K @Qҳ?y<8)ih+?>C!۩n(XV|S[@'@*6ՖR?T?J8?Fp?s0#@cqFA]%jG+LQLj?(`*?ŘuVO/!E$<`Y?*U}38?ox @8fHIX@x vQG:@H @@i@ H0@Oz~L@{uݲR@GM@ nD}6ЧG7@) @r*qM$K>?7_ak6W +"Y ( 諭_dܨ?FG@yySY.oj\xzAwhuAZ7( ?p.1M@ v!:GMI?b|=n0`$x!!Cu @fξM@j߁$@T(/?fyA  @(dܷAKN-@?`uT @spj~P7]@Ly@fξM@e,Afy$aHAٹ@Ń@棵V G@@L &@oQL@l -<@ R+%Cl Fpr*&@˚/חAiVh-@Vf=|@0Pi8jQ.--9sח ȣ U6WX0:Jjp Qz@O ip@=yJ? ȣ?xv'T]@8jQ.@n_hA"WO@ A3|;<@񏇪'@:Jj@}ջ@znӑO@l -<@ח-NKN-@&חA9@xE8h+A|ۣ?N1j?i>`h?:Jj@O՚Z/9zO[R@:Jj񏇪'@qo@xgU@H@qq @~y@o9@G7@{¹n*@ɭҿxTY7{k} G?DIyդ\hYpm@`{M=]2U~-?>U@p.v htLA&fc@-@ o9!oʕ.!?nj$j/ؾ?|zk^# [@ Dp8@E37H'W@mέ@o9~y@Җ@ק~?"⧪f@C(BT5Iy @1@P@zNϼ@P!@nd?K d?`@ ѥL1M@ Rk@?&fc@HA$]AˑV@ݿE^???[$˯?Rj6W@+R A%B@ͱF" n@% A?u\H@iZ@V@ݿRs@%B@Ɗd1ާܤP?V A$#۷ X;i;tBW @SYNN)طAc;3n#.@,y!&KJA@H7{u@7@ X;i@Z)ާ2{ͦקA@]ia}!`|Z JA7H7{u@;tBW @:N3xM4iҸ@/45@bc;A9GߧApNͩ-x>SA:Ҋc@Ya,K|2RA\ !@̙AK$o@C4XO@]ia}VKyL@tGhcӿj_FM4iҸ@9zǓk`[ ^$@3n#.@pNŅ{A _@3Ee# &;@68&@ZM r@]?0?/aU?5EB'?tG qƗחA5s?S}aft96A7fQۦ/AX媾@e @)xCM0?קp@|ci?A_@iZ@/ߔPb]2?& 3 @ -@7cFJ@죡?J? cU?o)?{C?bO?⡪@Yagv$̭?-@$]㮣קA_r"|ciݿ*.?4$rB?}fe?2@?.@)xCM0?tj,@eIvAR3 |ciݿp@ȽN ?B/D)uf?Acei%@ v&-/5l p]"cQ6k?&͕?H}v\??C>H?%?e5T@/!E$<Os}ø$̭?+ja?G9a[(ЗA|ci?Z\b? =EF@4ꯜ1V!q@=EF_옄5@RkC)a9A&7+wBAQ@קs<@UV@?,yͩ- _@-,קAEJf?*ȰCAgD}!`hcӿ^(A*F*VAHxcDAc! Y:@q BL@yy@F:@N el?Ÿ@@)@ E@!U_}V- @|3[pff*$@ݓ/5 QoF<:@,{Հ?ˌ WצB@ ;*O'?,hk|hD+O@9qGb$@pE'@Ho"@;bl%`Y?!:GM@투Y@3ŧ:? o9@AˑV@?_r"|ci?H @u`VD@ھ5,@icJ??~vUQttXit(@@td@BLœu!EN5@;tBW @\~o@/'y@3iQk@NIAȦ@VY(?_}V- 'KWff*$g3LQoF<:w{Հ- '{?OD~?B]'f WצB:f7*O'񿉉#mD+O ܬeqGb$rE'}9^Miu"K;I`Y*U}GM:k #x @~6z@рZ`GNA&@MI>/,@У@&UvVC8v E@}T6SgR@ǩF#@#-CLkabau@̟`b#H;@|6$@>?e@!D7&ۇwH@?`uT @xE8h+ &N.{@]2-ob`S1pYA^QjJK?|6$@[EEV &@|ߵJ=Ί|6$̟`b#H;@ Ty7@v=*7@X{?nQVf=|@> #x @6c<#@jI@@DX7[7ׅoN#@PG?Fv=3l]2vEAxhF?G?F?1ucAYM@7[7ׅ@|7%@2vE@R!f?A33@@"OFspA|ۣ?~6z@]2-jI@-ԛ@5?ɑ+@'} ?2vE@h~6zNK@jIvى2vE@ikz@PW3@ġYg@rEp? 0PiрZ`@DX-M@K r@3[V sY7xD!aaGz~|-@ ([!!@aGz@YHrM~'P1kv5gE>@.c@ġYg@_Sځb\T(/j~8jQ.N1j?GNA&@ob`S7[7ׅ5?K r@%v@7[7ׅ$Bn3bjMEF !޸ @ufi!3 it5$@@+ @TcT";BGLa߶@1Bl@< PѦWӜzt@O*fgҢ@Q;= w1C݂MTcT/ @=@EMv%"Z~qh*T@S9[W4o@m;=@Ң@\hDf>-v|Xex>SA*"/>@q8?@Mv@O@1cU/D|@0RS@Ur5%h:Ҋc@q8?@R+@)֙ "@Nx?b G##@h9+*?O@i@L A$XE@M͘?Z@yy@!&KYa,K|3Ee#S}EJf?Df@5)v?Bv}AG!afpؖS@X`=r#@m\>C r@]%[4M*߻Jy7@ @)UX{?>!--9MIoN#@3[V s7[7ׅ42^P@A%% ?GUM#*6fyF#v'?;7!?UM#*6?1ucAYM@7[7ׅ@k0<@#v@gBs#m?V7@;@@8@r8P7i>>/,@1pYA^Qɑ+@$Bn3bjB$w@,軮sE#v@GN훻F>/,@#vk0<@@2sEW@@/ @: z?8L@?fۇ@g"@sp( @#^? $:@&HSmm?2"x9>Bڌ 0i05@@ϥ?Ak?P}g?V @VW:?Hh)R?•l?$o%Qc?f?[r?boʕ.!??4$rB?icJ?7@*$@+S0M?޼?1Y_IQɏ<@a_t@ c@6樛@-qEN?8cv˛?G\?!\2?*:7T@?orS?ٲtN? so?*$@6W@O]$C@X{Wo5~З>~@h0q@խK@/h<:rPT^@Ќ+2?l?r6IJ ?]p@E5!>>\g@2"ޫ?v4h?_3?i2?L4?HѾ?x @|=nE6`@nj$j/ؾ?[$˯?}fe?=EF@?+S0M?I3su@Oxrm,`? OPp@@.SuCuI@ٿO@..ËV?_r\s?[S?}N8?%3S O}M?8fHI[i7Fz\B?4ꯜ,B?O]$C@Oxrm,?Ch@ƃ)@w\je.Su@@tj,@jڠD@!_[O@!kDưg@Xit(@ @ǙSh@W?jU h@ UN @ݪy?blC@C0@k8?d7d&@WT |;zAܝ?@z9G@^OJ.+0@'(/,* O@0`$ 1:?|zk^Rj6W@2@~vUQttXit(ݚŋ~ @޼?`?V$R@Kc[@Aeu,@]1@[tX@ AC"Q@6=+o^?`eC@3`Sxv@1V!q@Xit(@U3pMF? yIkwקAMF|<|O/Y@"zehW$B:@B5A0*@&rKA@fξM@ U6WX0:Jj@&UvVC|6$@v=3l]2vE@~|-@fyF#v@.:Jߢk@WG@p_*CΞ?S't@i!@1&2JAM$B:'2]{54@&rKA@fξM@:JjO՚Z/8v E@[EEV2vEh!޸ @#vGN훻Fڌ ^>p_*CΞ?6Ch[i@X m3s@󭀽-*16@LC5M@tU !+L_Fr@q9K@;eSHAطi@٦? 6@Z:p-5_a/)r-c@4kh@&!A@٦ɿh@;^q9KFr@Vb`='Vb`@٦?Yd@[:p@ 6@nڴ ej!0&!A4kh@)~@tP`@B@\R#-Yw@ڱGo@wCU,\@&8PRLw0Pn@c&@@*%]@xUT'\@IuQ@d @@h D@u/@)Gkk@$8BN@\R$@r1{r@6{^' \@ei@I@QdwBt uI[@oK^@VG aF֌= @&!"<+?g$Q:?ۛ&j^Mq! NO@+Pnu?sp)領 l@^n[`e@'^I33]7?3ESj:K@kRMgq@&!"-頑?@w%$7O4P@AyJ!p!w@j$I@H}$-s",G@8|E @Z'5>W`w6"@9<$B7_LΖ@@|!i@Ujʹ93k` g@R,@Yn@B 5'#.=͛@Ujʹd@.@Mzy@ {@雠@N?%`Ɂ@D3X|@v0aԶH@5?@>]@$̗$:X@ 0aQu/+6~~QՑ0YZJ@vM/r+aaPF@5?@"7{@^ V@1Gpu/+6X{ V Q0 *qQ*?{L@%7@/R$^@:.zbٰ@6cE@!@=@c@u~zH@R'd@ =@fœ5.b))~%7@yx@8'}_QX @i@Nq@bڃa@1^+)@ /@.@s;@y[:!@](=@[5]@}i+ȟpIoʊU-H@zktW̺#k@>]@^ V@KMlU@"8/UWf"uǢK@*f1$hF@;WZb1B0@AG!a+.i@ t@=5@ˏ;ka 0?ߵC'@UjB4@L*ޜx4a@I<9@uz|T#_@QA:@.zbٰ@i@Nq@']TSH.9L@?9c=i[w[r@ D?9vX]o@\ʥj?@2S@na^܂@^ %v@cml@.i@bd} `@qT@GS8Q5mKb@Hq:?Y̬ z@f/dn#"@7/3u}U墪{$@3]fWS7ri@A.A&чK,@V#<(5b@]@4? hōe@>%sv66cE@bڃa@1[i׭ ~kz?9c=id{@ D[w[r@"^ʥj9vX]o@T3Ve@ y{@1Vt 4@~*(W'@ =5@gټ @GS8@qT@Hq:Q5mKb@覲f/?Y̬ z@x,^PQ }@*)'S:S]D@A.@S7ri@9ԋAkN6K{:N+k@f@4翟(5b@ %)czF-@"X:)o@3X@ѱ -v@<9Œ0_]xPI݋is%T@wy^2@ YmL!@lR- 0;$W㡓A3X@:da@qj]鑲Ow@yPPa͔@ C_Xlѱ -v@qj],2K/@,@6%r@EQpi'v@̧Ov;W@6lroml",ܗ<9Œ0鑲Ow@,@6%r@[8@M40p@2ީj'r @[^@l@oLYEu@$^Z@_]xPI݋{m@=v(@@ɧ+f@%@P@E$t@*_)6yA"nb@ .ҔZ|dmArX\Y@$nb&iGA@{DK=u"@F+@Dʆ?@وRSG{e@描z@Ix }a%E@B%gRRƻ Rd'ί@^9xC J{@7Dʆ)@ֈRS@?@" ́@Ix @描z@c(DhWG*v@Y@CFߖig@r,_?@etP@!/dA6J@>Yr@$7D@&ST@]qq{ҥE"tXⲝH+3@ `i@0ɑV@DmM@.Tj!~@+D@g#@!/dԢ[v@XI{l@d2n@P@4sl[@z g2@lzߥ$Ÿ@4W$BF@=33@B} @?MRn&@~O@19Ns4=Ȉ,@jFs!8%ΈE@!YJKт@ >g]qy!AQ@N Nۙ@hk4)R7M@Wu J@:@MhsAy-.@'Wʚgߖ@љ8g9|<$@F Wg@Kт@*R;9n~G|nhk4@N Nۙ@Wu J)R7M@LhsAy@:@'@..@љ8g@Wʚgߖ@G W@T"Xnw?0@, Xڐ:;@9c[v@%dΰ@~2@~V䛅3]@^ae ?@ǟVmړv@.m!]}lv@_fбHPc@TX ^!s@YbGq@V0LSS@Mcp@$z@1nW%ZֱR&_@ M/zT@ahq@CK@ksqFe:@=XC@0]*m86e@bϟIOQs>yxѹ_@Hq@7$RnW[ts@i/ca@%L@Rn&@?ba1nW%6]o<@^乓Y R6_}}ses=ߐk@uC22~s12@t^J@Q s@k@jYr@d2n@P@_A*g@<R@\2f/eգ$^]%q@qWG@jd@;Rҫ9w\@ C.FI@aY֥@<;_tm@or~ t\2fjgj@odC[Ӗ_@{'?F}@dӺ9@A֩NN@Q@&o)[EQʖ@u@0-;@\c@qEF+@Nx @t#}@}K՘}u@&#AKJWj!>ody$w@'C[Ӗ_@eӺ9F}@އ0r u@ @m[Buʖ@M$bc@C4C/@N@qEF+@}.p@%50@&F7wyEvG0.މ?`l(n@ =r}Қ?%50@Ҙ@/.'0Fvd4FdrA7">Er}Қl(n@o*p:Oߓ~Y@gtv@伣n@mu9@飋Cg@SKݺ'@˪IQ= [*ҷ? ~Cym@Qe_,z I = @7 ͦ3N}V~?0թ'ś1 Py`?AKSZc?:O@;#@Jg\@Bm伣n@wuQM4@m3[e@D@# [Sd͖74|@_{ 68@:|ZP.+C$W@Åf5_r`@b&) TMS@*]wI'/g({uZC@J C%jqyI@h6@cm@CN(w鼨Ga@{r@sd-l>[^@ =zRFADzQ@~rPG@yX@åSg):@Q"jchB{[]@Z:?C/@"n@8&7sd-l@{r@ =zR@?[^@IzOyy;5oS@yXPG@jfcZ@Y!TL@qAXwxmu9@m3[e@N(w"n@ؙA@]p/Bݫ "Qُ@މ4Ti>~@ut^@飋Cg@D@鼨Ga@8&7]p/Bݫ(.@;)~Z@{=JR{@5T5>Fw$oEB@l7ZLc~2@9s@=ЌX?MC5 g@^J7Ԇu@_M@~V䛅=Ќ I5د@wIg@|"2&㶰X?3VR@{EPAqAA[@GFt3@CeK8NLyF@k*a)̖A@Kkn y'26+sLN@Z&F)wlfi8e@pT-Vˀ "@ӜF}&pj!]„.NFةޘA͸lSqAEAWATHA ACeK?Et3@r]> ١)@ryfl";@窣a?|; AЗ$a'5Anomē.A-@Dc9*˚(8P@lƳpW Ap@*3 =Dxnu$b@ulWFpآifsQ&phܧs%KH[yV;W@sh;@QsKϘ tfN͗@ ?2K>{<̉><@wêd7<@p@@>A G(0fRKxM-O{x]]tA7~@\Q\G\ish;V;W@ūNNٷQUJWdخ6ު m{͒yʑ6@o $l\2$cj^z@bW_@ #zWEKE@aE @hh@Q@c4%9_i+"1ԖbW_@?Pbܬ@| Y6@k}H|@)\?c4%@Q@BF=@MZtW(@ęu"|*3>A GVZh@SM$gD! @8c3@2* @A3]#F@dʓY-n@EЅ_@Z/%p@ '*0p@D@ nl@(('*@kn@DF%@@Z9e@n<@:Q], @cl#G@TZ@BF=@ęu"|@tW(@ =Dx(0fRKSM$g孓D@'3<@Rg?@3]@2* @V8D@kb@Hv-B@=@{4u l߬7B@gó@B;=A@[A7@24rP@רui+@@𽗧|l/T'~M#i@3+5 &{yv𽗧|"@u]@/a@fF@oRACDDm@hZ뺮SL@e0-B\@7_ 3@ij R54 n𽗧|l/Tu]@呐@,S@ۡ[9@&Z@yk`@i9m?@b;nZO@>$!%@R,@zy@!8%ΈE@ !YJ@as=ߐk@ @١`V@*/tW@^t@kCr|U(P cĕ"_Cl@Xs,%/#苾v@k]="G@?G,@LN~`@Yn@ {@!YJ!8%ΈE@hq@uC2١`V@ @*/tW@@kCr|82(@)eJ(=W%Ps,%/#@"_Cl@k]="G苾v@KN~`?G,@r:o[@lTPzr@ x2zlTPzr@ uP@V[./|CdB V[.@z*@Qߜ@髉@^>כ`6c! .@<@/|Cz*@@@{m9 7j@" ]?᜙-=@ @zj.A;>)1@@F{3-a;gyj @ޟ90z`w@;>0fy A8JJi$@mp}@_ЈH뽵QE@9 &9+yq`ѽ?B.@^?:3t@hP@U%g@Cs#@W@@Х7t@OӪ; ]}bI 5KlCw#t@8a$u4$Y@U%g@4EA@&_ץ@N@:+3t@$WnY@Y8mq1ʗ]@[ J8,5AtG'wL=8j9ҭK@[ J82r@&s|3g>P3}gC65@ !,5&s|3g׬@-Hg@fEʾ@`*3M@5s's@AtG'>P3-Hg@n!*,@`*3MfEʾ@s's@w}֛ f@ I4@ f I4 I4@/pұ? I4/pұڿQHsΪ@ĖC%/fo@:uy@/y_2* @@3]@ f I4:@5ȼU'2{1Brd@ؒ^Kߟ3w.P]@ޭ5N@ŖC%/foPHsΪ@/y_@:uy@A3]2* @ I4/pұڿ5ȼU^o+Q@`ڨd@v9ҘKqn@ေCdݭ5N.P]@xgUs{r@ԧ c@ϯ2tZbw/?nڸ7cRg*}!@ԧ Ks@ϯ?c@N7vYwɹ9 @_V+X_]_@P:.¡? 2K\@̅-xjt@Q>c1a:AEOЌl7@Lq@P:.¡?v*4_@欑xZ@`Z@@Kvfn0AZPЌ`+Ea,/F)a@Leh=@&h͇wo?@w/a@,S@&ߍ@K{`{@jW1@YI[f@gÿJE@n=U@,},@nK-BuikS5cvfF@ۡ[9@K{`{@'2!@} @.tL@='Q+@0;@48@GUi@Ɇ$b@]tA ܮ"AܤVl@ EQ f` ɠ@]5@cGaa)H. @>QF0Ӛ BӤ:ZW z@bsed@~'FN@%xSulWF7~@ܤVl@z@ڹ:@L\ZrcGaa@]5@lˡA` X91@O3u<,n@}Q(70[@&xS@FN@/ib$+Ą@UI@(ϟUO<PI"]u@s|^@ʔ2\ ?@ ZY:8@(I(ϟUO|(@L4|@M&oȝʔ2@s|^@)!+WīY|t@efuB@kk<PIL4|@(aF@dyy@`WWv߯jg@Y^VԒ@"]u@M&oȝdyyޭV@y?;^g@*eU #zWE| Y6@[^=)3@)X4\lt\@(D%@ F_@KE@k)X4\XBP,-w>x@!V о_e:l¿HNOGDOh@nzRIE3g- p@-@^p`j@lP@?j[M`B4}b /֠lZelb@ f@kp@^p`j@bJÆ@"rj[u°@-dO}a $a\ѯWb@N''*kp f@9@VX ^@62@,FL[v3'KRJE:dwVX ^@"NW!@Mi^cMg$ g@iCK帾#+v^rKawB 5雠@CK@2~sؖVW@'~U(P)eJ(18b @amVdĒ@'#.=͛@N?%ks12]YtDF@>k.+@)CQe4 }ñ@"uǢK@/&z/fuPLW$^D462@Mi^cM:@U_F8_inj@Ib&/e8Z͝/+?ZaC@ B.H'@F 9(+@?%y@+@enB*fb>0@Y4ջI2?,FLg$ g@U_F!@h_Y@)aa#h?'uj#~6M8'@Q @x7Y~@V(q =jv@m@7u "DD܃hnƯz@A;W䱸C[Ӗ_@'{r@sd-l@w7¸@ n~@O٩O:@WBP|3@"|^@77zkx@1\@݂ |b84Jutn@ȯȨ@ t@C@DeUï V(q @x7Y~@Vj? _`-l-@9-/z;W䱸@nƯz@A{'?C[Ӗ_@sd-l{r@ O@M٩O:n~@"|^WBP|3@1\77zkx@V@Y@s@5I tȯȨ@MeUï @C@2(!q@jk,H?8ZY@USq@9l6 ?rR=ݭZ@jLi/@T`X@&W szl6 ҿUSq@Z%X[@>e>Kf]nA*F\A˶!2- +N@7m|/1Gy\ 5 2AAx!*VA˶!2^UgL/cA܊xZh{2@fRC@2Aеc8X15%kN15Az̪ˮH@Gcz̪ˮH7(E@]By5z̪ˮH@bdh15A7(E0sq<@z̪ˮHsB/Ts`B@X'F5e@Bj;E@cư̾vu@m8^L@U`eOWpآi\#F@V8D@39,@"=@ EQ ڹ:@H߳@Srf}mi@%?Zx@!أR@)z.4)ռBu[@SP@gv@)8®@/fA@|l@m>@Vѣ@Wmĉ3t@Ap26"@x9@fsQ&dʓY-n@kb@A]0o@@@f` ɠ@L\ZrSrf@D ADQt@g.hK@Í.ya@kæL@7 ]Os@le]qLJ@6Hz0@[xWP^@ݝ @%@oY{ԅ@,K?!椬@yhHzSA}{x2dBQߜ@@.o+(d@]L"Ɨ@gi.2mm4M@&#\h^Xt@ u1m@ÃA4вz髉@{m9 7j@]L"Ɨ@ĄN:@r<l**tp„&#\@m4M@r<l@mlR@gi.r<lZ4@CYw@@M>jl z2m**tp„CYw@@]sI;@myu'` @b3Õ@l1F(A2nф٘:v_@.C}9@e|Rb093@'U7@b3Õ@6[U@]2_"2%;=C@T# @Y*^ I_!Ǥ@@mZ@=[܏j#@[^+hv@9@#tu}@Svj0kxP% s8@=[܏jT@ۄ1pwv@wr[@KX@.k@PqR%x@-vCQrN7@IFrG%\A[@Wm4M@&#\@r+ܙ@ =CR 0@Y=MI<'&5@A[T`g"N@Fg}cJi@CjDXAF@;&#\@GATHA A&#\m4M@ =r+@U(Xlr@`}`#CP'@iv/i @X u@&NMee7@ r-@qpw/u./> xP .z@o5Bpqpw/u0G@y@ȠԳNY@B"N<@ڱGo@{^' \@^Rf1{Ď8~b-@T @=LZv6춦G@ *ɑ~)@wCU,\@ei@I@QzFnT @$Tyt@FJe\,J&F7wy/.'0lP@"rj!Dz@ X q#'ifo@EvG0Fv?j[u°@ X q@c-{@'ʅņ@yOp@ʅņyOpsʅņyOpsyOp@h@yOpsXyOpsẌ́hGeWsasB2P@= [*ҷ?_{ PR@X -CAo} ADo&@GV}Cf XY?6y 2VxU?%^l??E?Y= LR > ?:FR$d@&TҴ"^b ~Cy68@TNm5@PR9_@Do&@>;:ANek>,"O9@_i[zUӾA@-  [^5@tC huzm%@My3,@3{@V“M@ʅņyOpsGVNfMA4()m@ʅņn@yOpS@vCf@_]1Br@yOpsX}Cfek4()m@AyOpS@8@Kт@ >g@q }@ `@"q`2z@kq"_Cl@Ps,%/#@:y@:_Rjc@&[THB71p&mF@k],@$HT_M<@״qc@F>P@R>|@ >gKт@Fe:@F˼"q@ `@kq@`2z@Xs,%/#"_Cl@:_Rˍ@@WMIVw @pi@NL`L@UP\n@״qc`M<@R>|G>P@t@JJ.@Lu9 hM<+?w%jc@WMI?or@K~M'c @@op?xgSiz|jZ@SBUp@8vW?[J0#R;X>a@WYЈGl&@fDHmԞ@U}Vqu@g$$7O4P@&[Vw @K~}R @\E@McT%fT?|@gb@0]"&zhHM@TLX݉؁ C@ט\)ㅗBD@=XC@ 1mTHB71ppi@M\E@2@bܨ ogvBWf'@0]*mJL@&mF@NL`L'c @McbܨGvSAJ{»@ c:x^#X@%m&)@חPlE#^PQ!{@P_R@p Qz@B?HؗA`$'اH@E r)L@%WaےpBqlm?ro@dm;l9@]Spti@("A9@69@wWdB?lf @$}O3f@0q@LC@=$@K?N`@*(ѯw0exB@W;A@O ip@`$'n=اAO,l@A,@9$`}7je<@7h5@+C#O@w T1@6U ~@S(( N@AwWd@69@:0@ў~umA"l82@Tf>@UON@{@K?ZjXdx@Pp@`5+fZ+SyR8|@K3a@ KbК6U2sEWsp( &HSmmBQ!}׎YMu4 pߣY#&HX1{gsBU2@MF, n@-ǑO6tlt\T@a{wr@s'W@pps@ɋܥ @De$@K|]@"/=@2b @@,R# @Y @ᤔU@ |<|O/Y@-Ǒ _RB@kРgS@Ԛ3RI@V@E ;@ze$1x2J@X\ejXdx@Cbl@bl@d@J3`s-j8IJ0=_B@m@:|ZP.&Ag:c@DϡGJj @6X!@*̲ib O)=8@h#@e =RFJ?ev!PDö@#2$e@{V9Qe_,+C$W@\ Sx}@6y,"O9@D ̷"x@[6o`@2*VMS@ O)=8@&BrNFV$E6X@_>@r@@ڳ^Cޜ@s@EvwH@:c<@x!@Gn)i@z'сC!Fk@s%KH[yG\iZ/%p@=@)O1Pp@oA@%?Zx@g.hK@+R>NņE@Z@.~%Au@6|JI@?hDs@U5‚K@܅@ĉ_@IxX@ x"Y?b@BXpacl1F]2_K_f@|l@ Pc3lF@̮̊x@q{}@uX1E#@-[\>(A2nф"2%|l@eQ@K@_Iَoθ}@L4b@ZRGĢb@k.Dz%@ c:DopdF@/jl@0_2e]y2~@1,_M1o> c:Do@FP՜TizVx@E@y1][@i@K'qA{p!> :Uļ]˖yE@.މ?d4Fd7(E̋pԼAle(oiD@OZB`t(@p4@䰅%аK?x5`rA7">0sq<@le(c󈨜A O?oiD@>l(@teSl>SU\F@WBd9/€@_lWDr\@oV|Hv@#@z@+-@{L@ybQnv@؃X mŴ+-@ËF@6,v@KV\@|+A{~w[v3i`_SO@(L@p)3@Nz@'CK帾(L@κ@aB}}Eqy@0Ž4_@,@f?S R:@+Ce:f?Ճz@7;B5H"9@/+K-R,(@!k0LGQ:?AyJ!#@ۄ1pwv@@op?T%Uv[t@0QȱE󎎥@ ![lk߆R(Hl@PW0f]H?@+5haq! j$I@iz|jZgb@4E@z6r@d2!=5s* ؗA@.C}9@T# @F@_IَoT,AjS@@63G@i.e|RbY*^̮̊x@θ}@sW A Im@ 'Cvi q4,"km|@a<\S^09 I_q{}@L4b@ Im@K$0A)m my${U@gwG2@¯QF@\Yx-@c%@oiD@ O?Zp@d@Nrl@PUm@GPհ@F,NV@yf]ue85G8@x]Ct(ш@Ƹ[u@|SYibs@e6@@6:^E,K@Z?/7YA{I@Rs7gC; O6:^E,K@Tf>j@5H=(]7saS@^ǥ?n<J@Z?/5H= #@t/h]@ qpzB@<@PS@Hx- +N@܊xZh3ty{@J{LMBw8l (:F&+ffB@NJ^ '@Gw*Gr@b*+cDA7m{2@J{LMp]?@;zECm)F[Y;@%yep@wg<@e,{@Ou\Z ׁ)x7?S@х,e,{@ݯ\@FKy-ALJ4-yzղ:3Z|!@1^+)@UT_o82@4GJ|@{ccU&ɉoi"E@ )j@PaP@v,o\@3M"(4@:]O W@Yiq2@݌KT@𵯺r*3@R/kf3wI@{ccU(i@LXjҼE@HG`(wU17sP@o4@3SA@ @aG^<@]s<@,9@q xR,@^>" ]w@˸@Che-Uכ`6c?᜙˸@`1@U_߃Pn)1@8JQ@Ψ 7N\T@5 ٙ@ʤc +Uݛ@@F{3Ji$@Ψ r{@Ep@'Uv*cc?5 ٙ@a 6H@ی#3;vr`5+S7;_0] @Q"o@Vl@!mcz@h*@R:@o fZ+ R:@BQ"o@/06v@㙖/y@TЉR@R:h*@lt\@+ /Uv@0~&8@6kDQPz"93 %@( @0~&8@ߚ@Q;([ZA7@-A}FAsubc@I؉۳:@.lDu@@Gⱛ1Jy@b l@̺)Ȋ]<* \X@~!j@"4E*>@툲j@27O<@woVr$:@9D@,UQ@&&8C@aݟSm,^p{wcč?ԃtm@w?J&&cFT@yg"@IKf+DT@X Lȁ@>*?Y( P@@ \X@$4E*>~!j@ 27O<툲j@I{j@ B@ⱛ1Jy@,UQ@1 unu@\~Ӑ@c6%z(j1$҆s`s#ڽ]@j2>4@b l@&&8C@\~Ӑ@c@fZlj"CdJJV[|Nh`Hl북R'd@](=@$ L*ޜ.i@ =5@$2,@Nw|@r S@_57@̺)ȊaݟSc6fZlj"Y@fՖ@%U @%1*0u@ j? =@[5]@Fxxbd} `@gټ @ p 9@HSr@nAR*@( @]<CR 0@U(X30<2@|U@%{~"@!DKB)8@9KSvST@*<.p=P~v@^Z 34:iMC֫k*a ١)@Y=MIlr@|U@ 4"@bE< 2sWe@m9rSUn@;jRp]S@Nn@|F8@p+@5Y@w^-y*?ˤ=|&@槺F@.~+rՆ@t l@5Y@ߩP@jE㡀i"m@ `@@z 3yo_@]@koe#_gdƿgk5@0@W_?]yo_@u/[@rnƿ_00@W_?,S@ +@,E%%m@C=1@_fбH_~H@ar)L@yf]u~7@O b R @ Q$Gc&ɉoLXjҼE@3tL_h@RnP@w:4@^]i"Ea@ ?z@NU]bCKPc@pGcskߍ@!Pge85G8@Yޫj,8&~@((JpX@i"E@HG`(wRnP@rf,,@n)NPM6x@xЕV&v}-a;gmp}@iLMNA?i}@NXMQ߄#B@T hhh} )qQyj @_ЈH?i}@R5HNA;;XMyj 4)@7NEp@Ճtm@wcč?U@й''@U|WS@ ަw@+@@҆#=ԯz@ƺ׿CubPIY@=yPD@ZH-8:l^@lbABi@RjK@}>h@\T@'Uv*ccčԃtm@й;^@U|WS''@szBd@Ў ҆#@+@@׿C@=ԯz@p-}@YH-8@D@lbABi:l^@}>hRjK@-Fyp)@H+Pnu?-s"8vW?"&CFʛ ?[P uT6NCk @NXM;XMA*"0)68&?(\Cu@(vP.lp@s,G@[J0#zhHM@&f>t@I| S]@6.;XM*"0>0XMAk`"7n=@&cFT@w?J&''@U|WS^A/۝@h@]H/K)z@{1uM@2KN,w+c@[Ub@+6:l@NUy ;D'zC;)  T; @4/ @Ki@/)@7@I>h%w?J&@&cFT@U|WS@''@h@Bc%5*@mmѦĞ2KN,w@{1uM@+6@+c@[Ub@OUy ;D@:l@tm:iLG4/ ; @/)Ki@(I>h%?7@>CZ'@r3Q_|@Ii@]5@cGaa@5 ٙ@c?< 򞚗yg"@%U @a)y31 szBd@]Hmm @PljYlz|[f"soA@3JoV88V@yӶ Bt{@gk@AQ@9 3W-OڍcĞy'RZ+|@ gs|@"<@cGaa]5@ʤc5 ٙ@ alJ@IK%1X@ަw@Ў /K)z@ѦĞPljYlzGD|@wW9fv 95X@dѐu~lg@jIgVwQ@x\N$;6@:Ϫ/<-)GŸ4&3 'hqT@GS8@^dl@ZB@vU@̚6@|]$@z@LNHGS8qT@YB^dl@̚6O@{|]$@ZB`>l(@vD^O?,\Go@x V*(t(@teY[ƿ|8TR^x V*(Fr@KRJE#+v8_ih_Y@3@}Eqy@k6%Au@Wf:dw^rKawnj@)aaNz@0Ž4_@Wf9D\@259( @P@s|^@ʔ2@X( P@>*?=ԯz@׿C@+c@[Ub@+6@3JoVv 95X@kg$@_E-a,mƮ@ttdALt0f@h^0Ŕw@O~M@4y6*x@~ YL@n`"'T@?9H#^9ʔ2s|^@>*Y( P@ƺ׿C=ԯz@+6+c@[Ub@88V@dѐu_E-a@kg$@ttdF>@h^0@ALt0f@O~MŔw@~ YL4y6*x@_ZaV~8c@?ߵC'@tĞN |֍GӟS@1'c@|GU tZKw=5@qoP104Pgc@_RUjB{h@)23)L@ θr|GU tZb|@ϖGW QÊj@]q*R;9n86e@#["!أR@Í.yi@Wp@VAgEߜE:2Cى@R55R@ws{l[@f@P b@oMqwjͶ@WE/@#IjL@3[x !*}}@ |Vlq;^h@cQ:So:_y!AQ@~G|nbϟ+y@)za@{H@O`\@gEߜA@A )e56ޡ&zˀD@fl[@_^tbq@yy@"5 %h]e[(~3PW@XQ@iw;6H:@2}.UUj)僐$h@N Nۙ@hk4@E: [HN@Emv@c.!9@Kzd@@@R'LIO@Bo@cZ٘@AZc@s"@_}GX;b@! fY@Ų5q@iN~@F@!e8@hk4N Nۙ@2Cى@)e56Emv@fO^}@Tzzj@"ã@oI?FBoKIO@AZccZ٘@_}GX;bs"@Ų5q! fY@FiN~@ 0aQu/+6Ct~@-6@m?Sy@a@TLX݉ ogJ{»@x$A= A )j@U17sP@w'b@_U)PA.*p@wG@ Ѵk@QUƮE@Cu6h@vpF@b'Kw2aTϺ햄$HTP\n@WYЈ؁ C@vBWf'@ c:x8@PaP@o4@_U)Pc3Z"@5%U@Y-@ebQP@\Sy+@8aN@ >,@)R7M@Wu Jͯ>@TXIOQs8s%@ %퍃@?Zf@+zfX?MwIg@苾v@k]="G_M<@״qcm6@[9/i*ȕ@~(?Wu J@)R7M@T"X ^!s@>yx'U#j?Zf@ %퍃@+zf@@C5 g@|"2&k]="G@苾v@״qc@`M<@[9/ix9EӖ@(?@*ȕ@ 2K\@欑xZ@h\4$@}Zq<7jO[X/~y<@!5V_84 gi Z|@4UX@̅-xjt@`Z@@}Zq<7֘Fm#@X/~y<@zOgma}.$ E|Xa@~ ^>@k,H?T`X@p'^41@^!Lw'+@kuVE8ZY@&W s^!Lqf@~Fh]"`@`c@)FyFS@xԲgnx=ƞho'ȃ@g&07@bOF=@)Fy[юs@T]n*@daR@O+F j&E@:?\p)領8|E @¼p }@9s1SR55R@ޡ&zԒ<@Yv& /Т@ l@Z'59s1S@¼p }@ws{ˀD@YvXxK@s כ@Jx2 mGF˕JbO @ '{4uؒ^Kqn@ 0@k4%x]7L)@/(ԯe~D<yPLs@G]R@U>9r> uB:*0p@ lKߟ3wေCdk4%x}J@p?!E1JM@!Eqݣx@Cmm)̖A@ryfl@Qy vo>N|FJ$)b@Rxbct@Kk";@Qy voe@WL%*b@%d;|)*qnt@T<_L`f4]FR=@Kw=5@ϖGW Qˆsq@S@:0@dr̈́$5y/@Ĺrym%/\@F*@p;* =@S qoPÊj@S@owd@>9$hF`-k改X5@Kxw59@Q3++M,LPDDE@v|>+@oRA&Z@jW1@} @ͭAXvǕ@V.u2ݡ`%\}Ta"Әr]8N@Ǿg2@L$nP6s]ҡ!@g@! {?lCXvǕ@Zb A sr.@w !5 @kOa ;U2@B|ï@ K!@MauGAƪ6( CDDm@yk`@YI[f@.tL@V.u2 sr.@Lz[ @ @'2@=ΔRNΊ@!]K@a@ |@5;?m2e,z?@y7qY8`{s@m[/鿜2Dc{<\@qvR϶v@u>$N@>Ao'&lHu q@WFc@Yju dq\@|Ijܭ?eƢ?!~OQAj?6K&"y?i*#&nƒ&eB@iV2lAIN΅?Hq:?Q5mKb@fiE?njBl@pJR|?_tg@SU\F@5;?m2@ |@y7BElAm[/?pY8`{s@{<\@QCR϶v@xÌP{Ӽc@=`@@\_<Wju @WFc@|Ijܭ࿼dq\@\&UKUeG@10!`{V@+|"l9R@A{8@S%T@:u:M֪@"w@@:+3t@./>y@Ƞ,Φ@=ߴ@kKyUDS%TA{8@cɺ@awt@Х7t@$WnY@ xP Գ=ߴ@@Eո@kDCy ,ŖIiu;T@^+@t 8z[48@z I = @Åf5_X=s2@UoZ 2VxU?_iϡGJj @[6PA@tk%@虩:@6x=]@l<>e@e2,Q@DX\@靮B@Y8Mr"R !gx)Vv@N__7&,@g㸱@O|`@ sx7 ͦ3_r`@b[Vb/"@%[zUӾA@6o`@jn@p7?6x=]@@۾v2[@>6iBc@.l3@F4k1#[K@dMNlr?@ֈRS@ @[yqq?3)WF@zX1T.@ǭƼQ@وRS?@[Ek@sq8F@958D$k@18ZǭƼQ.@V`[y2yqqsq8F@ZجFz@xt6@<Ē90 {k@jB@2;9v@<1ϑ2)+f@TZ~$Bk@*!]@ 6qIxokp1#%߱g\ !@O@Nx?..b@G@dӺ9@F}@O٩O:@n~@'0E|tiA@ݖ@][^@ =zR@CRK&@LJh>Pckl"͇wWBP|3@"|^^l?-  X!@2*l<>e@۾v2/+@!@5?@64Z)_x@F!+맩"|^@WBP|3@?[^5@*VMS@e2[@!@G< nF@vY{@-Ҿ)_o&@P\&c?{4-*@#`@#1Wz@$D;@ɨ{n$n`5=V@q@j@)[EQ[Bpe YY0կ@њLU @P\@eZ>o&@h}[koABO#`4-*@D;#1Wz@0l0@w-'@\zB8ӗѷ@,Mщ@OT@8&$l&@&MИpT<Sޜ@DX VW\z@w-'@,Mщ@,+`\@&YXpyaG1@ M Uk@eoǿ@hMnr@W,t@.vt@k@ou2s\@'26+窣a:}npac9dΏk@0{_B@hMnr@'@ :_v@X.}K'L@u@j}r@=LZFJHm+@ P@(Jh1s\ 6vLFj@eVW@v6e\,J P@ܖ%)k@s\ WX$oEYV;W@sh;FVZ@yu@v,o\@3SA@A.*p@5%U@&zFJ@dI!\C]@^M7@/Z@tNW8@;TҴ"Ɍ"sh;@V;W@$E6X@.Mn@3M"(4@ @wG@Y-@dn'_@C|4@LXC@p^2@bh-W7@ޟ90뽵QE@ a 6H@Q߄#B@yj ubPIY@pʈ#8@Hz`w@9 &+Uݛ@ی#T h4)@=yP-}@HÕ@QsKūD@߬7B@ګ;@uՎ:@)H. @lˡA` .4)ռkæL@_>@~%Au@P b@_^ttse @MLp5@>-ot@(ȅBD@!|7@BRA@ XKf$cN3@Ϙ NNٷ nl@gó@E4иl@7y@>QF0ӚX91@Bu[@7 ]r@6|JI@oMbq@M@U*wq@\7H@ݳ'@*q[@:c@CAw@jS֝.~@a{wr@I@V@-ot@\7H@Ue'@Tշu@@@rUk^@íJ@f&Fa@m1h F::t@wg@%o=@ś1*]wFADzQ@IzOyy ;)~Z@k>@& z!kk6}@@wyhCD@$Y@ PyI~r;5oS@"Qُ@{=J& z!k&Ee϶@~1raܮ@ꂈ44<ĭV@~~V Q@|s5jV@srQ0 *q|s5]p@̲ib O)=8@h?oUV0 +@1o.c@xÓB O)=8@&Brm +@)^SxÓB+w@H'p5@i8|ۀ@ (9ܔ@vax@t@?@2;>gXC@Tj @k͵Ak_!c]@8pb9@+@bJ=aG]@F@]l.@-]:=n@iɓA|@zD")vax{V@3ʫj {k@]ΔR@1@"67bVN7@@,RzZ1Lq@Y{B@dmlmx\@y{vZX;@-#Ar ;@<' Z&F)w AA[T`#CP'@!DK 2sWe@"ӘkOa=ΔR'2@"67b)@UK~iЀ3`@Y{B0Lq@їH~'II@3@!Ǥ@{L@6,v@ 'Cvi )m}(A'|KVQtU-9@'U7@@ybQnv@KV\@q '|KVr D.A$@DN*˵^n[`e@>W:@LhsAy@qyy@LIO@Bo& /s כ@ۍ@ ZcAwk@籁aLET_@h$6@3=Jk@C<&@d<§@/[)@'^I3`w6"@MhsAy:@wjͶ@"5 Bo@KIO@Т@J Zcj@籁a@Awk@k$6LET_@C<&2=Jk@.[)d<§@l(n@Er}Қ /֠l\ѯWb@#'c-{@s"fj@X5bP@ibK@P8 } =r}Қ?l(n@Zelb@N''ifo@'@ TP@lC4@P8 }%񄁮@_1oL:c2@:]O W@aG^<@ Ѵk@ebQP@I!\C]@C|4@|\"֋h@T7y|sЕTf=V |@zb U@|sb3@Қ@;`bǂP <@Yiq2@]s<@QUƮE@\Sy+@^M7@LXC@T7y|B4ݦ@G\{@uJ1@)@D<6yK?g?2WdخDF%@24rP@xf:\@nZX!iG@)8®@6Hz0@EvwH@܅@(ȅBD@ݳ'@~fVP@@@u@yK?g@y@bΛo#@yK?g)ꞗ6K>6@Z9e@רui+@F́@ttF#@/fA@[xWP^@:c<@ĉ_@!|7@*q[@rÅ@rUk^@yK?g@4n@ڕʆ@Qs@-.@'@W%hcZ٘@AZcAwk@籁a@$V@;$u 3F #@Ά?@cyW@GE@rjZc@3/.@3j^@'..@E/@]e[(AZc@cZ٘@籁aAwk@;$M2Ywa@7(.7@n"ƩcyWΆ?@rjZcGE@4j^4/.@?T- 0@S#IjL@~]7L)@p?!EsЕTG\{@u 3F 7(.7@}4۬@sСQߝiEB)Q@ϔ UL^/.z@3[x3PW@/(ԯe1JM@f=V |@uJ#@n"ƩsС,@Xlcoi@o10K@S\g@Bl&s@r7#(vn<@@%@ \X@ZH-8D@NUy ;D:l@ Bt{@jIgVd@r@h^0ALt0f@#gjR@\AZ2PEށ@ȶ$,TOIb&/e8Z#h?T~cq@LN1Q@6ML"r^U}v@Rf2V@91)Ő=@ yT@D_1@͝/+?'uj#LN1Q@5Q@s_iV{JqRφ.<[@(ː <@Q"@FC8@өX@tZt@wѿwy^2@>y̧Ov;W@j'r,N@w@OӪY8mkKkDC \ &@y]@?tZt@ YmLPPa͔@6lr @8,@ ÍY; ]}q1yUDy ,Ŗy]@SnH@ê)?Dh[a@يb P@#Et0Zlfi8e@З$g"N@ivBw8l;zECB)8@m9rSVN7@@UK~i @ƫ'Rvw@@9s@.jcy?@|M?Et0Z@يb P@pT-Vˀa'5AFg/i @ (:Fm)F[9KSUn@,RzZЀ3`@ƫ'Rvw@sJ@h*xUE.@<Ē9MY {.+U@5HL֫2@3"M5HL֫20<ܕ~95HL֫2@Ҩ~0C@@5HL֫2q~Wʚgߖ@љ8g@5s's@ !*XQ@s"@_}GX;bLET_@k$6Ά?@cyWFs @`Mi@91ԛ`'W@GfKr@љ8gWʚgߖ@s's@w}֛}}@iw;6_}GX;b@s"@h$6@LET_@cyW@Ά?@`Mb@91@i@GfKrԛ`'W@7jO[X/~y<@ gm>8]@ZLJ7D"E=@X/~y<@zOgZL+[2q@&X%N=@AyW0D;^{@Xⲝ$Ÿ@PG@yX77zkx@1\5?@vKCih@2VSn?HBd<H+3@yX@PG@1\@77zkx@64ZY{@2VSnP!@h^Xt@r<l@M>myFS@T]n=k@:zjr@2n:}إ&t5[@q$m@h8(_OZ u1m@mlR@jl zu'`xԲgn*@:zjr@cÂ8@ټ{pexQm@3_<,ZO]2Dc{<\@2nټC6ɬ@GԬC_92b?ؿ{<\@QC:}إ&{peGԬC򵍹B@z2b?ؿP m-Q@Yրz f@*kp%s<=ӡʝw^-jE㡀(@21v @@l'8F),TBv@Ph2:?A(N}{0KvfnpdF@FP՜T!5ma}`^@Dy(@~>`@9KS|uDt283c@c10A/jizVx@V_84 gi.$ E|Dy(@6@vb(}6@#Jw@dM< h^@ r3_dC@:0@d>9$r]8N@ ;U2@;g{ Kp@m+a 2ZU:m"cz%@j潡.H@fvN dΠ tA@ĿtپB@lR'@r̈́$hF`Ǿg2@B|ï@m+az[@/I 9#@qa*gH@s9tca FB@m߇pAb5y/@-kL$nP K!@NΊ@!]K1Lq@Y{B 2Z/I 9#@0 @3 H&X@,`׆M ?O\y @V$b@AĹrym改X5@6s]Ma!]K@NΊ@Y{B@0Lq@U:m"cz%@qa3 H&X@Cd@`xrY84@D%&S~A@Gcz̪ˮH%/\@Kj潡.*gH@,`׆M ?`xrYcCd@,;@\n9@O_(z̪ˮHsB/xw59@H@s9tcO\84@,;@%zU@&c)NnC@'zCtm:iLgk@wQ@Ne@Qa*gnvƏbb@;)  TGAQ@x\N$;6@Qa*6l|*@Iz$D@:VސbYZI$@ )_@ *!V о_`uf!Xnve@)_{m@U`ze:lapeGRe@'dg,ԟ)Ҿ?)_Bx#P]p@3*#PZG%࿚WN>@-q@k:\A@ a;e^@,3zג~D@7<ףd,3zג~D3*#P#`@jJB@@P:\A@#z҂;C@k)@]-C,hwM1%!'@_R [?MLS݂ |b8V@Y@s@ZG%jJB@@L @m)=Z0m>FtJ\c@]T$Ђ3oۈ@4Jutn@5IWN>@Pm)=Z`8@5FcQ: |SvPdy@1m@ ![ ]_L@`DXf7@np"-(k&QAoF@u)t(d@m-j0kxPqRvv\@~'te@qlk&.`dUs@SG@3G~眑(oF@OuB@"d8NFmlv@T|l}H|aE @}H|@% %x@1ĮtŎ廿u)t(d@"d8NF /@9_ohh@"_hh@)\?s8@-vC0HŎ廿=PHm-mlv@9_o@u$o@`9au@q_@fTV e5@]Spti@w T1@qvR϶v@n,@zys0@g!'fY[_9z2b?ؿo^R@$!$@2NO@d@SXc5z9<iuw@@@"\@=M@ƒ)0@G'DX@("A9@6U ~@R϶v@xnߍX@v@h1Φjq3? R2b?ؿP ‚"@:& T+?d@Sn\$@:6!wėę a/H@*1]@_&#V BT(@S((Xc:6!w`@w@md33kV"@f{cg/@Lz N@A5z9<ėęw@!Y8@ a3sa3fj-@t5[@xQm@J4Sܰ@񃯗m3kZ|N`-q$m@3_񃯗mȰOa@ġ51Ǫe@nw?0@YbGƲ2G@?q S@.߃3@򼝽L@x]CtY?]R[sbʯ׿ @A(wb=|&@"m@w:4@n)NP@l'8Fqġr5@AcW]˃@>X1.@V)]dd$, Xq@6*qQ\!x@|@_t`d@2(#f|@Bbt(ш@{4&@v{Z5B@槺F@ `@^]M6x@),LAcW]˃@4E@{ު, @P-V@O?*Ϭ@: :O@ZW z@u<Vѣ@oY{ԅ@x!@IxX@BRA@:`@íJ@y@ڕʆ@H`b@f^r#d@C<̉> m{cl#G@1/@O,w|@By\s&@bs,n@Wmĉ3t@,K?Gn)i@ x"Y?b@ XKc@- @f&Fa@bΛo#@Qs@f^r#qE@aTh%O@9|<$@G W~@5T5>Fwyhܮ@:\A@#z*Mcqff@Q@c4%@D%@9%kVG@z"93A7@ F::t@m1h bW5k@$!%@,},@48@ ZY|t@߯jg@*eUs`Hl북 j?*0u@@<ԭeyg@N|FWL%*b@~@I$)b2PƔt(J$)b@%d;|I$)bP:,@h`Ɣ-Q(&zpH~!j@$4E*>:l^@lbABi; @4/ 9:ϪD#@WY/Ŕw@O~M2PEށ@Z6[ͻ&AIArA?O @NF~*Lq }enC"4E*>@~!j@lbABi@:l^@4/ @; @ /WY/@C#@O~M@Ŕw@Z@2PEށ@IArA"HtANF~*@?O @EL\;vg@ѹ_@=*]@81@݌KT@,9@Cu6h@8aN@/Z@p^2@zb U@1@?T@m᥺@$ƛ^F#% 95Hq@x@RH@𵯺r*3@q xR,@vpF@ >,@tNW8@bh-W7@|sb3@)@m᥺@n\A@d'764\P@=Z rg;Eԧ@h\7$V"@t^J?G,@KN~`F>P@R>|*ȕ@(?@$ƛ^d'wf@,\@YVnMkg@h\@f;Eԧ@RnW[4@<B~E@b-Ĵ'@t^J@I>@LN~`@?G,@R>|@G>P@~(?*ȕ@F#%76,\@<~L@J@/t8@ϸmXWpcQ:SoUiN~@Fd<§@.[)3/.@4j^ԛ`'W@GfKrܳZ'@b^EBJi@RIˀ@Jt8J@Cnn,*c:_Uj)F@iN~@/[)@d<§@3j^@4/.@GfKr@ԛ`'W@b^EB@ܳZ'@RIˀ@KH@! .@-=@uX1E#@ZRGY<)63G@Che-U_u>$N@ÌP{w&/MA=3kZ|Nġ2PƔ{J@cPtT||@@<@ @-[\>Ģb@1[\>@i.U߃Pn>Ao'Ӽc@ 2I`-51t(h`ƔcP)d*@έ2@WZ z`&l=`@tT|έ2@Pe@Krr"Hu q@@\_<|@@WZ z`Krr"4 nAƅE>*@]GRlvz9⡣@bތy@" ́@zX18D$k@fxm'@#1)PL؟@+ Ů[*94j%Z@G4j@솈9?HGRl?ƅE>*@bތyvz9⡣@G{e@T18Z+P(T6mux@+ Ů[*/M'@e jG@¤49G4j@4g@=rTi@nKGUiKi@/)gnvIz$D@~)>@vU*e+Isi@.2P@-Bui@Ɇ/)@Ki@Əbb@:VސbYvU*]`N@uvu@늴B@?Q@=v(@ `i@4W$BF@sy@ҫ9w\@rZh@&i@@|ŗ}it7q@N#j"@Vs1:]aF.,Lc@`0@9M+?@@ɧ+f@0ɑV@=33@*:Y9f@ C.FI@lSU@ə4,@9 MH}N#j"@;@RwzkER8,m÷2_c}FABX٪'w$*_q "@nom}cJi@X vST@;jRpdmlmx\@їH~@9s@h*H@Qp\R;!!YC@m|/2T,bqבWcӜF}ē.ACj u@*<.p]S@y{v'II@.jcxUE.@Qp\R@&Qdwr%1D@~=5W69@wWd@!l@]@x^Y@ȋN@ׇgh} Y尵;:ȣ2Fu(R@KmcYE C5|8PRBt4HWr$i@wWd69@]!l@ȋN@tܳ@SEv,Gp9!(!$KpN:K7d{u@SEEϓgI/=_$V`@@1W]@iQ)3@ è9(@g@`(c@b*@ULIog#ԑ@'?0ۿ@t@?@3ʫjg-Gʘł@ r@V [@諽# A@&pj!-@DcRx)*qnt@W,t@ :_v@|@9T_4e)@6DwBb@]„.N9*˚bct@T<_L.vt@X.}K'L@9T4ʉq@*%]@VG fpؖS@Y'x@%@P@"i@Qp|P6N@,Q@>6iBc@uZ,;m@BR@y_>B8Yrx@:/D;|= /V-$]IM@X`=r#@GgG@E$t@T8@wQ@DX\@.l3@BR@ZI @Zm@n*`W+hדfTįv@;|Bvs@swJ=o|@7fQB:@m\)6yA*_ʖ@uȯȨ@ t2;9v@<1ϑ2@y_>B8Zm@c @Ds[2C@Cvqʬ}3@黲c;@Tįv@NJ0Wv]~@{Hۦ/AV0uo>C r@*_@)6yAu@ʖ@ t@ȯȨ@<1ϑ22;9v@Yrx@n*Ds@Cvq@[2C@*gF s: ٣@..>AXFw>n @SAd џ@GC6u@+rtާGC6u+C5H"9@h*@R:.~@TBv@cMh2:ῒ@&@` 9@osw@?DgO@WwDj>]e:/+R:@h*@+z 3Ph2:?TBv@` 9@wf@{ds@ t57sа@?e@o?C6%FÙ^ݜ|G"o @ tau@ 2@B t@#iWB>@f|Ҷ@\s :pM@IJe@1s37IEBvQQGs :@Ҷ@IJe@m9AP3@Blù>ԑ gj^᠉|Qm2@r=Z@%d>, h~9_o@1ձ@n:tAE)yiz@ݵ-e@.Q9@s{iPO\ =@0N^@ =@0N^@GV@4#@(g`@Ub$@%d>RgA;3~Zr@!X:ˆ!;@ @I|[M@Sv@ lewŅ@pFz|R@.HGd"L:bf0E@Ph@bf0E@Ph@n3s@-6I(a@lΚ9y@I-Ee@Prl@{&հ@GehOx@.{cUH5w$Prl@~0@Wx@8cb@_MO[a hdZDe@Mڥzp|gleAP+);PO7}k@Ço@@ =S@zuCn  @.@(v@Zщ@TrHx#h 3TAxɖh@c"L{c@rl~}D1@_tmSaeOKAD|Lq`@P+);POE>uAxP)@ Rz& 3n@JR ƀ-~+.8@FI;1@4< (v.@'TrH@Zщ@A ugk40>/5.b@QvID c[DUl@fU]Ї|yW_A( &\KAJqs7}xP)@d7Z^@8rhۑPźߣ@G@B 4w@ , unB@8},N<@| @RJyd3S`l@rEzk@wk@ Rz& 8rhۑE/-@GPźߣ@|* !@-@BԌ@$$żJ1\c\-@|pˁ/@Ug!Nd : APźߣ@G@\Au& @˸45u@ۿPv@DU.(@V Yc" +=u pe@A}@vOfG@Pźߣ@u& @~NC@?ʸ45u@~DU.(Pv@klx1we>gvOf@A}@MW?p@[<'ϝ@w]p[<'ύqS&ɾ"dc@W'g@0l[<'ϝ@a8@[<'ύpxIY5Pj@vCWS) I+͟@b_M@~U)ew]p[<'ύT@ȝ%֡@[d7-D@oD K"x@~U)e@b_M@[<'ύpxȝ%O{B@[d7-D֡@A{@dz+CLy@"SÇo3n@B 4w@|֡@[d7-D*1$@xxP.`Pz@_߰Tސ{qL@*;3RIKve@?k71@ϳό@巍7S"S@+CLy@@@JR , * !@[d7-D@֡@xxPPR@Qo=H6K@n~qǓ@vHc֠@63Nx@Pӻ :'4+@A?X8@$\z-iȱ&G4@wJO g@5vt@:_1@t5ʟ@I@B@b/f}@jx|/*Z@u?U}/DXX@tlkM@N @V2 z@M9D t@!`>j:k9@?j@S"@{ eIAP@!ZAa@JH(h@lS"?j@TT@ߔaBdG@s֦:wn@O}n-l۲qJ@T'c@3 o"S@'Z)Nr۵;ò@THZ'ڗ·@gp޻@ıCJM/*otȸy@tGlFN@`L*6wF[n1rƮoOFu+ ?kOw- C?AL@ǻ_{k.@1w$;fGt@,c;evfKqR@0*Arg*a <@`L*.#@[n1#6u+ ?.ǝu4V@0L@%|NY@G:Tc(H@oF5<,@fIs1bЅ@$23d@xdi"@XC@!u)@W@mt?z@˴ n~b4J;/뻸r"@@s& [N6I0 ŘoA5[1@WD@bb>a@rR>@KE@>Y$V@xr;7J@cOP1@kf;?Y>DE@OLr_8@@]@I^@Tj @)W@mt?z@@ @צ?,"Ϸ%[S*ΤQw@&o\rc~?, @xFpZѬ >@&>@FPW@:Z#{h@Gr &@Թm@q[Uݒ{bOLr@>DE@^Uoؑ1L+y@5CyD@ F@@ce1 xuT@mٽH@aMa Q 6u0@<})x@vYɵ@@ yJ@P@T])t7@}jN@N0`<@>"@@2k<@Z}@̸ _f,W?jn@?E* h[G@&.b VI Gf@2?kwz<@b#i1+@@2k<@ٖWe@̸ _f@Z}@Z FQa6:$Vj[o9&.b @G@yſVI Gf@}o@_@0^βf@mk!7V@m;QAz֘Wa4^w_@Ew@X"seh@'%z fzc]@s? yTgPSNj@V@J{ @j~j3_+7@(V7#<А@n"j@wd@J{ggf⺷@n?0k3yObI@(V?_+7@Tɐ@#cR!jN @ /@,H~}J{Y7?B*cE@3gҐ@S/-M@ML$@j@5@+af@^.%Q@b~C2̥p Q@J{{@ /@JN'n?@Jף&";d9ǺĐ@*Nc'{@tΒcݰ@=(@M@[^Bj@ɦP@]9@ٿ /+fɈ0z@/d@,H~}Jף&UA3WZ@KpaL#NJE(wuqHo@,]p@fIY@o7@ٳ`!m@w]Qma5(BNe*h@ B'@)AЋB#cD@k=Ґ%=j7@;aMJ{Y7?";d3WZ@R?\n@Hj(l7kYSoV!'ϑw@N@f7@`!mo7@Ƙ">̷{0silͳ@|}%}s@<RG&эk=Ґ?AЋB#cD@#zXLTjb@B*cE@9ǺĐ@->G@%B1/@ ,eAx@o8c7oU;_@ﱾڋ@3gҐ@*Nc'{@%B1/@E=@, RУhل@q@e@o tpL@;m| i@u;@~$VQ%;%@샯%Ń@\x@*G}{zd'ҵw+)S$~@Y@~$V;I-3@[@|ھIp@cv+{&2@FnG9fC?@WS/-M@tΒcݰ@KpaHjQ%;%@[@guAcy@,@ N@]p!dd-G?ܐ@ y@;"@MzǤ@ML$@=(@L#NJ(l샯%Ń@|ھIp@cy@5XރAցy@ip@3x.ФݧؙK[z@' Zd@b/)@{f_@!@Ro1##@k|}Cњ@ ~Em> 6n@ɗ@zRZ@]ٌ@Vi3k@Ro1@!@k|}@##@ ~(łq@!r@uRZɗ@|:2pb@KY@P%}@~WEvp@!ߒɛ mpL9XA-5Ci@^^ؚO|ڕb@3Ǜه@sߛ₃@P#p@Ҫ44@A{ˌ@n,Fְ@KS@_p#@B3v@0ƵS@p~,[@aZB@-q"@[d@@fI@!`m-5Ci@xAOJ8=:*1k[}@H[Z@$Y@#eyp@=~x@%k `@ϓOĂ@y?s`@yUu@t@R@7@,k͓@#a=@n@c`Ԗ@bήjB>i]0g8A@s/u"j̿bήjB@bήjB@;~@ 6гȱm@OHA֎-@ӷLgxi$LՐ@omtMRx+yw@A8a@1eױ C4f};@@ct@@ҷ@֔\Su(@wG @&G4@;֎-P6v AҷLgxi@@omtMR@$LՐ@gվ?b@vYBK@5Uu {zD1S@RɠM<@#.j@(5j@Jݧ@HeB~;b@꛹9}+@ cݰ@Oͳ9Y xnIFʐ2_c&̩@02zJ1Z@:x@ cݰ@ @},Jo 5ݮ(5aBL:02@2_c&̩@M7@\}@~۩@C[6ɯDg@+n{@R@Ugx@@~$.߃ùg@ލ:@C[6ɯDg@,|A@zJF3-e2܅@d@2YFښ{īZ@gt'sq@;Jȉ!A˒R@XeN,j6sMs@3Γu@X;OJ0 +n{@zJF3-˒R@cy# A>^\#qC yb}@i0@+n{^Đ@['K_\,;3~Zr@{CA7V/@8d<8+@M>ϙ@ Mp@j׸7?[5q@kt h~!X:7V/@Z:A`@S-!=w@z}N˃j@ 64&>J@{DK0":%\@9.=@"7[7@o/d@q@lUT,ERTOx ~"7[78.=@q@YFP@ H]RA7?^I{ w g@>:@?Dfvw@j#uv@ Т'a@ZN{@*wD %&;-PHׯ@Jp@y>όHa `>:@?)0@d1Cp1@VAa@Cŷ[J@&©謑`Ɛ.f@bi@&`t6`wz@X"B>a{z?rA]@JK-a?rA]JK-a@JK-aavMù@JK-a@Uy¹]X&A'VBD@ @h6t5 G΢"@W@]S`P@?P>]wD'Pf(v 'VBD@R.AL|@ r(^}@r?(l@@P@]S`P@ @:vid\@1f@?3ar@:TNXs땊ei- y^AmT@]EJ@l*@@khc5@0``\q:bY@Pi#Dfdk3q@?3ar@b,C@'QngǴ@/]tY@q|XG b@@1)5@[%VLdWt@y7\DJ t@z@ jQ{\Hn@xe@zwӇwNր[@!z@RX]ӮvӇ@4%@v ;@z@@|e(fDbBv@ `ͨj_@S H@jZ!A x@ `@ wp@㭘@%q4|@J@P>iXj@6T7c@E\K{K,%iXj@+n\~@p܅@ @RR.@N#W ^`m[ zi7yw(@~32+s@+(@;K@Lt@ vF(m2;@ ?D;Lt@&@lO^! 鿃m2;@4r`wUBg@ҷLgxi@6?(@x?K?.\aJSNz@~_(@ =@wztSؠ@JO g@dɭӷLgxi@x?K?jn@npo_(JSNz@ݠ@ Rʹf@J 'WFvSX nZi7NA+h<@b@\@תZ@^UC@maϫ]@L>C@=e@a,P@ڈes@Dg]@1OtlN3O1_Tb@Sԟk@(kiHB@=i+@R>cWD@4 E+@yeM@6@$5"[@2vD@W-AN@; )CĊ@G^y%@;=pp@3hh^@jqN@Q}AJIE[h*.43F$8qP^y%Ċ@3h@;=pp@|*s(Uv+4Tgq@X'=@E.b%z@s<*P; JIE[s A4ݽ׹6@·yh@/Q@^D|ؘ@ >Ľ@T!@ӎO_5Ekb /S@C1@'uY%@)J8@GKDy?@c:@Ln3p Δ@}A&J@s<*P@E.b%z@h*4ݽ׹6@A8?1@^D|@/Q@ӎO@T!@_~ƷF> 憎@nzCGUL@4@{茈`@gf@|t@@ceGxvDy@}j@&qtx¡~ u@ӯӲY^@V^9^@olJx@qcɊ>"p|tgf@1 xv2}j@6@Sz@P$ <9S,Z@slB@olJxV^9^@=aK(e3g]&(r@5GQ+uT@pZ7g@&Sz@2l^@_/q@cjݡ@Cx?:Ix@d?}^.|e/Ms@YN%[@J"@- F&].%AqtP$ _/q@!Hc?"z@ 6{v@ѢyO@2D揠A@PÙDɟ?}3@BI,տZudMH@fv@=H0Nkiu?PÙDɟ?AA@BI,?}3@q{"@^Sq{"qGK@2(U׿T/TČ!.M|@H7{u@7r-<]@EKſZ}@̸ _f@SrdM@Y`յa@~ѬXKh4yxw@Yf?UO&@n|Fn@N< ?AЫ7@H7{u@EK?r-<]@̸ _fZ}@Y`յa@Q @z1rvSYf5yxw@m|FnUO&@,WZ FQa~ѬXKz1r].BD@ɥb@};@'ܳ#$@ĊAe@<=38@˥kO7*'.Wd?jn@6:$hvSɥb@Q@4V^@ÿh4L@S<=?ĊAe@)LCU|<Ւu@vF?q@7=s@ =If@|L@۽viPWXLq@!wM.?\o==U2'Cj@Qyk8_g2_Nf@?-%Y@۽vi- @vM.ڿPWXLq@+vXj@bj[Wc#g7D}6K@gYwY:eA*&JF, ,4ea@Yd*U6$ =AL4iҸ6KA*&J\#AG}@FBcA(og&#@wHv79 3TKj>W@q{e.Wdwx@$~@2:@H0@G"ūL@~[ݴ_Rr*@N1Hu @ 3Nf_E:@Tdu[@i!g2@فEK90[i@U9swHvA@wz@4ѷ2:$~@ol@rOv(@f5{Yݕ@޼~m@fHue@o! "˂A@+<[O]K@@e@'mg{Ϳ@7C}[H@IF@79 3Tֺ޻@C>@Lhz&E˛^IdΕ}@4FL:@q@F/]HlY`Α@GR^QҹI5S@D)Q'@S Up" $Ny@8]Eh›T`u1C-nW@wC>@1b~@m@jx[m"^u@ErNw!3@Z"HT2=@E˛^3( r3ZNe(H@&F#p@(d斶@&nK1RBCǬ@QyHunr@GR^@lY`Α@:WtdH,-CYV?@[xq@VH "pbX]$)sQyH@־g.j@sC@o t I\@?;]ʈ h;um@iۓT@b(* A='ǂaOu@{+z.@;Xh%ݏ1jj}r owu@[tTjb@='ǂ@(* A{+@aOu@>Xh%@z.@xS @.?v@ndĨSLH,^s4VBt6/-9 t@߆:*1'[@4g_Q@@1?.?v@ڲ@r?'F3YCTMЁA>[I?Pq@qXDH@\@14g_Q@Bs@~7}@χu@vPv}x9dsu~7}Ϯ:Y/E@좣[r@@?@TPs@%C(F'@@#y@a҈gk@Ts@zD@AKz@`$T@~7}@Q@8bF?TPs@~bS~7}4v,WTPs@?@χu@}Ecf+@*#@/(?7`aogJŧl oё@e&$Ae&$Aiyš):+wMua@8r@3m@ý fIW@I |t@:a@T@E|~?7l@.FP@5-`@JB@~b4J;"ϷācYjk|_@GWhեϙūgi@ЮR@.B @@ո>P@YjJ ,O@&h2@TkIBC@oIrq%@SPAPTO@~$@MS:Ɇ@'ޑ{[u@dn#"@x,^PQEm>!r@·yh@8?1@48U@e  @@ܧ:@Izm|52_"U'%^`@R+c1@Avl@EQ: @豞{v@ Q@w!@0@bFQ3/7/3u}U }@ 6n@e  @>a@L{9n%#fk@1p!8-AR+c1a@.b QMHO @\rfZ+@ @@F9@fFɱt@@=>A@uWߓ61z\8S"@@n_@ê(fgw@&JV@?"Qa@M@ $hCZaC@~6M8'@6MLs_is@4|@@96AP{䷷8ۖ&VYt"EYpd:-+@Hn@ZG@!W;h@ B.H'@Q @"r^UV{JqR@#ĺ@VCNaU]a:Pư|lEbg}egHnd:-+@!W;hZG@}v@φ.<[@96VCN/B@\]{@ސL@ǒOso@KފYs@|) $Wb@:U-4{7DKYt {AP{aU]\]{@b㥧@wiUQ@ $0_PxD:TNXs'Qng}@_4xeHh@N$DgP@ +D@/[03|<@=h@X8^B\wA~q@j" w&@WA@"҉H dNO@ 4 8@땊eiǴ@/]_4xeHh@ܩ)r@ D@WЂ:@CernU8^B\@=h@h" w&wA~q@"҉H?WA@`OC@ޚ).@u%@&7"@X'> 4@( @RJjQmFӋW+­@)ۣ@_>wq@b-Q版v@Ü]ݚ&7"@ys@W&@-2@RXpvx:H@mhɷ%N>y0"@'W{[@w*@`OhOPN]@XSO>@^>i@\>b@`OhO6R2A|k@&v.e>iXSO>@}&@?KKHR@WI8*ذW@UX"v@? W);}bV50q@EKt@>@WI8^@v@>;d_S@E9}9rSYcy.@50;q%@9Dm@<>fA"S @4pf@2l@Mi^NBu@UP(yr{M{@έ"S @6^aA`@,Ef>@)U@c\Gm@ŀEGFYoG0E@E\}@eK^rp@4];' Erp`VM;.F@ ;@eK^rp@'{‹@Okqp> :RT`ZY\:@GSҵ/@M9=@VN@ ʠ23r@1Nw@VN@rhr@Hl KQv 9 z@i9%/YP@EuV2@jNk@/OE@,.}]˖o//h@{\cQ@yylhkyZn [eĦ P@jNk@B78<@NE]M t@~lQ@*_AR9@IX.]n xfVgF%P@<a<TPs@$Ȱ"@"Jȇ96BLVJļv@9ds~bS"Jȇ961#d@fz@'@DA,ʴ@)kP@g+b@h]m"ҷCfߎ@}Wq&@+ۜ&@Ovp@)kP@=0@,DN @;@ɲK'ws@"`Tw@1X@4`@5]+A&FZH}@­/th|@j}w)[<&A@<:F@A.0m@]$NkFP(x@pf@,E&FZKW=AtgZ͒I@ :@ 09 %>A;s^8<:F@̵ZUG8n'@4` |@n{ (Tw@!Y-;"PpyF]WQ@*}@KlD֠S"]*q E6@u=?@f`wsr=!nYQɗ]g@TY@~BZC}pQs@M $">ԙn@u\V`KrS|H@(<8T!Y-Kpv @6<@ifKlD֠S@*}@no[ݕhef`wsr@u=?@А @s,B@TY@M $"@YC}pQs@J^m!rKk@(<8T@S|H@JŧM qg@ԋL_@2A>Nu0m=5-LJxgK@{Օ"A].@G*kr)غ@)|M6@޼//Xo;@ꕼ&6k?@ZG~die@*K@orIU,=~@i%ۯ@=b(@ W ɣAUl@KBM4l oё@M Q%@>NuY"AfFs@jU"3U7ű޼/@)|M6@ꕼ@/Xo;@_G~die&6k?@orI@*K@f1$s~@ѽ+?W8@G+N^Wy@RW]cK֥@57sа@ 2@FI=T@}\H@_>C.Pg[oJ@> ;@F +gORɸ@=@?e@B t@}\H@H@}ò8m9A5bs܂@PVKd@g{:t*5Z @EO\@_ a@SM5a9i c^_tϡJᏘ> k@l@g3XeR@%f,@4|@SM \FI@[F"hgwF`W+IE@8ԖŏqT8@g|@D@ =:yq@ vlOWO@хkUl&pV@b@ } enۘ,ȼc@b8gh@z@$5c{~iT@6Ts-oF(^хkUlpc @4B0}MJ@hG@uY[VႲ6z@⋟OB`@O$Rp}6@E#U7@?Hs@Yz;OkKkBv@3^_?]7[>`#.{]^@@2@$\@OזH[1@?Hs@o9@v@aPTU^_KkBv@3N`½t@2#.{]^@QזH[1$\@1Y_X{NYH'@7ˤɦ@"QP@㘙bB@"أ /{IQɏWo57ˤɦ@q ~>H@UOB@ә 5@ X̘f@zRf2V@(ː <@䷷8ۖa:PސL@_y@$fm1{@0e@ LTkB@E9O\{epǣ0U@-zQ;i@91)Ő=@Q"@&VYtư|ǒOso@$fm1{@TM@)5`K@Z'@iGhUՈ?i@M(UO@ yT@FC8@"EYlEbKފYs@0e@)5`K@ ~'@9A]@` G@'M4i@D_1@өX@pg}eg|) $Wb@ LTkB@Z'@9A]@i 4@uRqe *T@E1bĬ@M;x@]`uRqKW7#A8$'@p6l!2pBewoZ@ Ge8$'@3ڢ"A0:R~3RJǛ@>FE@/뻸r"@@%[f2*GW@iV@ȥu@$@Nri nfHVְjn*V@srR#s@ Q]@ 1@Gmy@s& [S*ΤQw@C/bhեiV@a ̬K@Ygۢ@e޿@T&[Fp& bExv@7AZ\@E@Sp@+ @ȥu@Ygۢ@yAk@S7RR8@z㢵sC_I:7pqDI#zVQ'=1@) ɡ@Π,s@΀Pr@{"KX@$@e޿@k@,cl%Y@z㢵@T7RR8@O6KoqrV?!yNqr3V?"@ IivS@nn@ @Zxid;R@e(پl9<@AϏqk@o˴ 1OGTָ>@FZ{@)d{R@sO4]t@5q=@-;@-@=Zx@ @e(پFm3LABϏ@l9<@Xh{#^\D@Eq@ݽ T)d@FZ{@s@{R@#2n6/@G -;@5q=@=@@-@j|i1@(^uNc@^^OJ8=wt*Apy5@Hg} z6^uNck|i1@ؚO|:*1py5@;U/ AH ۳? ʱk7J@Zg|]^9EZ 8|@kc\(ZZg|E_Ċ@x 7|@ig0l?%fͥ@M@墪{$@*)'S@ܧ:@L{9nd:-+@Hn:UwiUQ@6@#]f@w֙ΈJa @Ϧi -T+hꈕ@k. Y&ry@HЈ3]fW:S]D@Izm%#fk@Hn@d:-+@-4{#]f@jy@Q'A`413GSH&\@h. Y&@+hꈕ@IuQ@(Y@@;:ȣKpbUH~@ è9(@='eOX@= l@f؜@}՚|!똁@"IT@:?@d @@xx,@2FNHiwHk@g@y;];@`BWY@}y$@v4t ]ׁ@EC媠!iB@R,@5a9i c[F"h0(QA-g/@Jpڪ@t@biE,X@{nt24ѹ@yW_S_+&G==D$@_@%Թ^_tϡgwF`W-g/@|8@(]pSR^qg,|?+I@` !D@Ckc@OV*?$Q9=@e0J@N4@<ڋt@~`@Ho@ϑw@cjݡ@ 6{v@GMJl {o)@)%}D=@3(1a@HJ@d@U{U@!Ȭ*nAQ&Ƞ@=%d@^pxJԏ@-_#`@Hb i@ˋӤoF,r@l&p@Cx?:Ix@ѢyO@AIu~)%}D=@5@ǡZR`@Lqj,@^zGo^;pTʢvi@ ¯:@؊a?6a`@~t 5@t!`@*#VB+ z8et@BHE@5vt@:_1.\n/գ@7un@Z]PU٬}:_1@6vt@apo7un@@Dtj37mg>@z&@z Msra@P9Fz&@mSq@!D a##e [XJX%Mif|q*,މ@ =S@ƀ-~FC@ LZ& D@Te8ZrLc0(@HmAR:N$C@2E/"qYl̋JR@u)7qZR_;/m!@);)SQ^Gw+p@\޵ t}$D@RÀ@ f֢zu+.8@ LJA @ ;7)ZTq@mhz@`m%D@%[-Q@xY% Ԛp@gH,g&O&x@j A:6(:W}h@/Ѓb@f@ @řy#gmI@o#=*ϝ( k_ex@}e@ÙsPpiOqԶ@o#=*ϝ]:ʴ@+y 8DFp@/iql@ÙsP@}e@!@tJ쯑&~D@sQC@+_}F@ϓqW$]׭gok]0<@ p;vUsQC@ z@NWsCkuHz$¡ŏ)UUhpU>p@MM@J٣Bi)@;ƭ=Th\%h D@1$ J@J٣B_Q@>ƭ=Th@i)@-47DI9Xh\ ըW@50 ,X'> 4@W&@Go@YNsSm@Xty@"! q@eG7@@-@-t2,@O!u@UM@( @-2@YNs8IdAJ(U@zb@ZKw@,)UVl@ҐR@wb#,@3(@&h/C@-bQZ"pN@ld@cǿjpꈂ,@2Dp7@cǿ⾏WU@oa@C!6̮cS̮@!\\pXYv@a"QP@UOB@䥕@!`@Bߛ6 l@&= Vgu@"\gx E6`=EF OPƃ)@յ@pm۾Ѽʝ}U$2:`@GeB@j|z@Qfd@vQG:@'C6@_옄5@p@w\jepm۾N’@Y3(lOX=,h*חMyB@$@S7RR8@z㢵@rwyg@4b/|24Aȋ@"X)+z㢵T7RR8@4b/TqOǻ@!@D8@>}]qɖ)s&F@5)m@rrIK$/@*gh@:R5C^:ҫiVȶ5)m@_t1_@[M@aKsx2jX6քt@Rf{̷VsC_IO6Koqr|24!@;@5)he:7pqV?!yAȋ@D85)heIٍ@q{ez@x[eOy@Rs~9 `7C@u6I]W- ,@ DPTL@4ox:_W@v)7őD8GbBϟ5@[.>@#]+@TKW@^`@_L 1@=6qQX=@`9@Id.\%7y:@4 @A:4a:AEZPЌOT@&Y%7Z[[z;8C@8@LՀuMà@9*#ùb@9nѬ@\LS|@XC@ E<eQ@_<4lh@ D~V0@:4@4 @OЌ`+E8&$lZ@=-Q*װjԔ@5F}@DC9dd1w~@v@ @1t;_Zt)k@qZ@y;B@Oͳ9},܄W@ 1@TwӕY Jo 5ݮ 1@#/U@.s #x\Qy@$I(Lq@Vѱ cGV[.n@Y/ ,Ɏ@3@8=աO 7o"P@Vѱb=k@[.n@P%z2J@Z3ρV:8(JAm@l@E@y~>`@vb(}Db6@s$A[k A&_:[,+vJ6 q@@Y@S)&lJ@0_1][@9KS|6@s@Db6@&_:[,b_A~:@0 Y@(4)@,'2t-@rvNs#>s=%Q@Gg%@+C/@ ex*0V!@>[SrvNs]5[@Ċs=@P z:GV2@LdaLn fO N@W1tDRY@#>sĊs=@3G@1->@2D@X|@UBUW|& Q@=%Q@P z1-} @2D>@N͊B()0@ʿ _@[:GV2@>@2D벼@7Zm.ëlpv@Gg%@LdaL2D@>@7ZFͥbY@e[m@H$GE@TkT)Ah@־R@׍@t'ULժt WspAy @TkT{6/7ӯ@R@ua<@U,q_?2@Єdt#貖į L#@T2o@F]T@YF@> c `~Vc"-@!+g@ڍFC88ma9c]@F]T@69v@3v\Z&x@er@)2M7t~r§t@mvP@rf{&հ@Wx@A[:A@znh@p0_@uA@;JtɣGehOx@8cb@znh@n:@\[aNtB@MC{_ɏzeE@ _f@W;[[>tR9_T@3#C=6?@8dWEW;[@9oۦ]@ߡbWF@W;[gz@+R(d+?@w'@W;[@>raؒGF@# 1@l7@a,/F)a@2e]i@ Z|@Xa@uDt#Jw@+vJ~:@9=@)'Xz7@<ݧ(Lq@Leh=@y2~@K'qA4UX@~ ^>@283c@dM6 q@0 )'jӲ.t@*3g>YoV@]>썟fOG@:̞Bu@+K=@(Tj@`Ҽl@^ @^_c1H@&jNt@EA밻r@5UpI!@CNb@?t8e+KAQ@?@a4M@|<@Pnr%m@C 债p(U4@e~@:cV~@d&a@DU9?`L@vє@;z@g4TB Wм`OF4֝+vє@oA)@f4T@;z@#޹We?H}@tgZv)_c#?@/j@It@%v'Ļ@­͒I@7őD8L/j@kSa׍@ݿbe0h>m@Dm}@[LN>6@ݴ3"tҌ^@\`ul,]p@N@W>(]pS3(1a@GEد@dM0(d`ĀQ|VC@ӮL9M;@'ٓ%Dd|2JU 38=RmI@=`ul?"tҌ^@fIY@f7@z[$cR^qHJ@dM0(&=q@ӟJYP@}mpɳZ0;~(pܹy1y5q;l@a W@1K@U׀;*@?Q$)kk%x@ c@OCW2h@/c8h0_:Fքz4TlJ:ѵ7j@Q@U׀;*@;|@a8௕ nn.@bU@XA@|V+WY@AW`d9k=! ͙F@aM-@?Qa8௕44@l7!H.v|aˉ@kHpސ@As@'~f@$) nl7!@S&&@%Z+@p ^co-Er@oqf@[C@_bڵǐ@H.vS&&@q F@ :?Mgs@{u'rv@~l+WCB}@kkn.@|aˉ@% :?VnbA&^h\[@1zm,É/@}@F$TY:eG@1ǘ]( +y 8DFp@G/c:@gKqwÙsP@텒Y@"'Qp+vV d@k_ex@/iql@gKJi@ÙsP ,LciQ}JypL!V@m9_}e@ÙsP@qwÙsP&qțt@c`ÙsP}e@ÙsP@ ,Lci3fw@lU H]Rjpoa@#@3VM@y%B@SʬT,ERA7?^ꈂ,@C!3VM@7@[EזOU@c%Ѧ)@1')XyNK@l ‡QΪGnҿ8v@1}Ej@WL2_"вLݩ d@XXjx@l ‡.}`@ 0v@Zmau{)xLMz@Ձ]@%0u@&%x@bU@S\)A"9 Ag(/r5 R1d="۱&N@?<d@ c@XA@"9 AԼAl/ drӽ ESioIq@ i@2clP@w]I*~@IM@qM."MmEWP@-@sXq& E6/Y~@)+!@2Q8SWG%@>PAOX8\5~@e aW=1R>r;E@-@⯘@#@'3y@"CwZT0 B;@P}Y=̡he@Sm@J(U@8MS|@ iT@ l@-G.@9D@In)@|4w8)Gi~E?U@Xty@zb@ iT@@%@AMJ@^vRy@R5([@q@ M73[x^ S-I&*vgh}-Jƅ@-<,X7Zu8K@ϙūgi@Nri T&[DI#NqP%M9AN@Fg $o݊67KRà+@7B~c3@v/Vfqr uyo@ЮR@nfHVְFp& zVr3N@E4@|Lѵ6վF.Bv WKW@`{ȳIm@\9@|'RUX4n@4nmާd@, @ɗ@uRZ|51pjn*V@bExv@Q'=1@V?"@Fg |Lݽ@6ys@"@[ۆ,!VqA&&/@[@ݬ>JBԿ1!B+A Yf;#AA@p~lp@DTA@ j@)w@"@T@bЈ @6j"_AHG\I@<Ҝ{k@[V׺@/D@o6=@ЂOTj@꒔}۳t-7, @\;y@ZvNBqOLd+#a)Zjctk@DTAp~lp@=2t@0@6y>V@/il@DTA@iW6ΐdԺ7@[V׺@rif@ߣ u{@Md+⫢7E/@ؑQ:s@hu@/D@ߣ9@ C0C@\XتhM^B"U@i]mv@ܥ@o6=@ u C0C@$Jz\ ϴ@m[@ryt@kv>"@ЂOTj@{@\XFLJ@r*mb@opX*IM@eÈ@Fmci@@Fŭ.8I@j]r@奝\@[ۆ꒔}MdتhM5x<@opXy UmAL@,!Vq۳t-7+⫢^*IM@L@Ӈgh@A&&/@, @n @eÈ@hN@r饐@M$GQ*\HĩKw@Lak"?@) ![[@cǥج}FD*i@O;k@[@\;y@求@Fmci@r饐@vto@>Z'bҋɥD -@+@34mk@m/6g'eQ;kD*i@ݬ>JZvAC @C_V.@N҉(m]BԿNBqC_V.@2J9]@.6Hխ1OLd+ @n]J @}{@Il@Þm#9W,f#˃@!B+#a)Zn]J @(QM*@[n]h@PI@1i%%Aa@S0@&qҌ@0m=5fFs@l9<@BϏ@y^o@`d(jSy@1ָM@/A@AhB7ΐ@sD@d}vp$@'xA@ Vޜ@&}'>@$(1lQ@0z b:@yN^h6qh@&qҌS0@-LJxgK@jAϏl9<@`&lAC҇@a@IB>Ѕ@;Yc@d}vp$sD@ Vޜ'xA@vjB@xM8*0z@$(1lQ@y@ b:@A̓"(@Ѭ˸45u@?6wF[n19r@?S@p@Hۿʸ45u@[n1#6?S@#$^@bH@n _@#uv@VAa@0p[@LE@n߯%GTS/@NFNw4o((@u?F+a@HP)`rjY` Т'a@Cŷ[J@%E@~&X 1@iΞxC}INFN0+q@M݁?T@ AT8W@q(__@Xbaa:W"! q@ZKw@ l@AMJ@g,_E@ĺH@0z#@zeL@hb'ǣ@)J+3p~U>  7P@-0@eG7@,)UVl@-G.@^vRy@ĺH@o;@x@2ņd@F@P )J?hb'ǣ@+Z<b(C6ld?: dmoP}@d_@>Ai[ 5oS:rzU@*@iH E@4A]@̽@i[ 5Qu`A{j@q.ȳBwg@FD4A[!_(zؾqu@Bޑ@`>jJH(h@&@>A[fT$ALh$6@%M>WUUUUX$:k9@l[fT$AHI AQMq"Njc@WUUUUX$qq 4*H@CnFI;1@unB@-.`Pz@Qo=Z& D@ ;7)Zi @-0kh s*,/@2)u@磫T@pTI╸} gH@,Ֆ_/#7u@V7Z2t%@gW:s@+ܖb@@BE  @4< 8},N@_߰TސH6K@Te8ZTq@-v@"@tW@[dD6-!U@2-Ԍ{#8@pk4_,Κt@hԃ2{ȩ@̂<-3$o@R6>@A50AN"xA.tZ@XOX_06w8)SMP¤YN"xA&q2>AXO@.tZ@Ayt56c8b ,.cnl^al=@O@ A-0+``޿>@O@=BC;@c+F4F?>:wn@J}n@5Z@709z A(+yzq֨k*O^x^[]@W1 a@b(dC@õj)@J8@<Z5%ȯ}@0z@j@#n񣜼@&PsMSm:I@m/@%Tu@=Kh r}wdkЙF@ @fTDOGO}n;wn@5Ҡ|Z'Ia@(+yzqj "u AkJ ] 1Y1 a^[]@õj)b(dC@<@J8@Ӥs1ӧ6V8j@@0z@&PsM@#n񣜼@m/@4z@TzSm@@ZO@T)!XbTDOG@ @})x@F/s]+?q@rc;@%}hZNd@!6YT跱@ W\sL?g@W@C@:ZeC ت@ޜ!Ko@gKF<_J$n@4F ;ܡ@@9|{侍@[$NU@P9#-U@e@-U@e@ W\sXFtӚ@WL?g@:Ze@C@ޜ!KoC ت@o¦w@@9|@4F ;ܡ@#NU{侍@ ]oH9e-U@e-U@qWƮGnr@/OE@NE]{pmko@'y|]iaۓ@ƮGnr@%l/',.}]M t@'yNm&^@o2h@q+RPv@~DU.(qS&IY5Pj@p@bRg~DU.(@Pv@ɾ"dc@vCWRg~@̚@E9O\i&⚣@Ɓ @{>B{eGhƁ @-{@Gv2mxn(5aV@V4]Tp1C=Fo0Pv@IFʐBL:V4]Tp9@ؓߔ@>5.tZ@XO@]jvA0Ձ^l1o| dAgWOQ+Ao`-ko-Ab־US@#=@_vdff^AXO.tZ@0Ձ^n*AdR<[@/d^&mK@cGiڣKB"-u@-ko-nW#=@Wb&@pN{ڀ.C9-.m@ѯ$U@{*j@dff^A233*l1o|dR<[@A4@crԬuPG7Ŏ@ C X\sGY@e}Ur@ZW\ÑG@lyJke@" ;@?1 @J$qTqeC@>w@^e=@x8 @vVJR@1y~@KP@%G0r@/*P@ULF{s@y^QbI@/dcrԬu>7 @@QG7Ŏ@|:Jl@B5(AkG@v@^礮;@%`"@kl`@E׭~}"o3N 's@qN@C>xRe.Px/B@*h{@g'V@vޢd'@;h }S@>\+$@/*P&G0r@( iGI@s-_k @&pV@b@4B0}pǣ0U@UՈ?i@{>G@GbKK肂 E;!1D8@)={Ii@F>QP }MJ@-zQ;i@M(UO@Bv2mGbKK肂{U'@&д@&劰&f-Oiў@O^4@(@ǗO@H;@<& ?(@gAҚ@@:z@;u̝ >#0M?S2_c&̩@02@1C=Foؓߔ@S#@O!9C(MM@022_c&̩@'T_/iO6R#@0Pv@>5O!b@+@цU}w@lB]M@9+0{K@ fW@+@-!=w@l'6Rf"цU}w@QDQ@8m׈t嵰9@M>ϙ@z}N˃j@I/0S }lB8m׈=$@`vQ߃@YJ!@Ͱ/i'6Q6&@'Px<@Ͱ/ii2AG@G׃%&@(3`=Px<@f b8m2;@! enۘhG@ E;!1&д@`kI@?T@d!z5 @ ?m2;@,ȼc@uY[VႲD8@&劰?nl@ȴ\@dAd0";@L?g@WX@mm8@-E@B~qo] @ݧTI@+Qr.ֿ/p@%h@&f3f~@M _Vfb@Dhkb@DhkҷCfߎɲK'wW@L?g@mm8@t@B~q@.E@ݧTIo] @|oH<,&f3@%h@N _Vf@f~@?hk@b@?hk@b@ @L|@ jQ|e(UD{@΋@jM8itبaF޽՝@Cnhnzh@haǘ9Bfۆ$VM / @Du2 uՓ@@o@u=*wD %&`Ɛ.f@]{q@0#`>BF@5@H@uWEo+@&[pZ#G@R*@eXaTxyM./jMeW@wu @3Zap߀ @sX#@YcؑQ:s@i]mv@^mE>JFŭ.Q*\'bҋɥR*@i@٣h!(3eۖ"sǗwu @cUx@?r#@P`TwgP@[&1 @RKR h/2}@q& E'3y@f;#AA@tk@z\ ϴ@8I@HĩKw@D -@e٣-@pE%2YI@HrS@]}Jl@$ouDK@<T>@e=qn~d }aw}Z&m@ՆfR'g@ŧUk@3N6/Y~@"Ch!(pE%6R@H@Zrz)0@`qeAR@;@oN`@I@qk@Xh{#$@j`4=@,uĸ9V@@Wq@(~:l@$C#@|d@q0 rE@@7@VJs9 Q@E zZ@E zZo˴^\D@U E@дj|@3ڳF@ve$LÝR@?(~:lWq@|d$C#@7X$@Z30VJs9 Q7@Kr4Kr4@D4b8gh@6z@+C/@n fm.ëe[m@[Sbc@z ki{L"߽n:tI|[M@;r`z@⋟OB`@ exO N@lpv@Hz kiS%@VBi΃@.Pܻ߽e [v}"rU,ᩪ@AE)Sv@ Mp@ 64VBi΃@j]@0筼S9c@Km8ݒ2@PZ f@UNyiz@ lej׸&>J@.Pܻ0筼 n@=?/r:@Aw@fiI_@8e8'i ӳ$AX@ݵ-e@wŅ@j`дj|@,9@sc@E+/Bϝ}&-Dܿ@Fx.@&-Dܿ@Fx.@@Iʂ@&^@ZEgZ@%\d +\XVx@.Q9@pFz|R@4=@3ڳsc@X*@WrlM@0q 0[w޹u`sVy@]W @wV@]W @wV@on@`z8O@w~v@e@J5X@1SV?(@? @ @5 ZIONS?yt@7qBflSw$@Ӂ{Dq@&=a$ K9,uĸF@WrAY- DՁ@6uf,oJ@BbycTo`\ :s@9V@ve$lM@Y- UؿԔ&A j"i[~Ѹ@2MK l25G\V@j@"83% 1OGTEq@LÝR@@ݽ T@? 8 @6uf,i[~Ѹ@'%Jx~ A`$'\~NT$޻@4]myɷn@ļSӕ@G7>?ndsPG<@ߥ׋@ŧtm@kV&$@V|@sP[DœIBCNGwG7>?@FqvqpaS3^,5tPB$@,5tPB$@H<ѐZк!@ @g@6QeMI@L[~s.@$Lf1<˾Ҳ@ {KfSF-̭@z]_Ko'vT[X*% @d@ǡZR`@ndsFqvqp8o1@46F@xTNt@g&~3Vbuw@&W@,b[q[m' u@Xb@c@s5@VÚq@ܹ3!eU7(e/@ƝC_P@K͂vw@׊"+@]q%`@A w:@(Q&o#,`߈@0Yq+vjA@G@pdp@)[Jh̒@Y_?U{U@Lqj,@PG<@aS3^4P,',@T;]v@d uz߹eEz@ V,b[@&W@dGm@4a!t`@g_0@VÚqs5@)B؈@UtW@D1/K͂vwƝC_P@o&&U@NQMb+@w7oˇz_@ iU@={+!j4 ̴OkUvi@3q;@Y_?@)[Jh̒@5Cg\P-ǕB@rƮoOFu+ ? @n?0k3"WV`Y@둂{2^yB@webu+ ?.ǝu4Vj~j3yObI@둂{2ؔJg@JȒ@ӱ%z s@tRS@$LՐ@omtMR@xe@ `JSNz@_(.1JT@ Dي*9_媺|5y"<@/z@`lm@KVf@o@))j#Gn@aP@5ʟ@,HbomtMR$LՐ@zwӇͨj_@~_(@JSNz@ Dي*9~{@.Qձlr@Pgif@I@JpM_@G@F;@.Shw-ba@, h [J@+_}NW9 `7C@}).]gN@ `V<5׊f5U8f@ N3@jw@L=^@xCy==*]@` @ы&Q@F@ϓqWsCku6I])4T2W^@\JD@F]@ΝIы&Q` @ >V@oO5׊f5U@9G@ѣr? 0XԸ3>@k0@58.6.@_wg@6@nw@fn%@0#v@<)#@R:BpoO@ >V@׊f5Uwqѣr?I+@wbhp@8.?k0@_wg@ӹ`4@fn%6@nw@<)#/#v@FH^siɳ,@#1r1Xhihp.˿,5tP6F@T;]v@"g|@",@- @;MAUqkJӚ"T"@IWQ?g8@:0_Oa,ۑ@-bï@rr㿫I^@ PO;wњ@mqӵk@/daC"+#=@M/ރ.Pxߨ@ׅ(R =n. fhp.˿+9|B$@xTNt@d uz",@X@;MAUqkJ"v@>TE,Ux_"L@\0_O?>g8@.@a,ۑ@Trr?bï@ l<PMY@ mq@;wњ@/daC@ӵk@W2.Px~9@ׅ(R @xߨ@ zb@,5tPg&~3߹eEz@- @;MAUqkJ,!@OZӚ"T"@IWQ?g8@:0_Oa,ۑ@-bï@rr㿫I^@ PO;wњ@mqӵk@/daC"+#=@M/ރ.Pxߨ@ׅ(R %'0j ߘB$@Vbuw@ V;MAUqkJ"v@OZw6@>TE,Ux_"L@\0_O?>g8@.@a,ۑ@Trr?bï@ l<PMY@ mq@;wњ@/daC@ӵk@W2.Px~9@ׅ(R @xߨ@˖o//h@~lQ@n D@A^mWd}%rssF8 z{@{\cQ@*_AR9@A^Ь3@mވds1=e~ z{@]/@ em7yMh\p@avN@b{9u&@5@[S@\H@z܇f@(x@t@@cҳ/0 +@ em8!:P{@nu6j@xWC2UchD=@:LP@3:n@|h@UlA@֮u@$oc2@%W@D+V4.@;"P6<@ˬl@uVuhxpSԅ@zA: TWZ'>;@˱:Zdv#x+%L.@!5c@iܒ'@{L{@N%`:4DS@3ΓdppyF]WQ@ifuVu~f*C@}˸pqW`f~*@12\teMs@"@6uvܒ'!5c@Q%`:@{L{@3Γdp@4DS@ :@D+ָU`i@sLva9x=@ 9݃~@sTF=BՂ[ꠖ@LZy"׿ {@5 LrĸEb@+L~?i5@ fH@} | W@2QãD+ָ @0ܕ3@Iwj~{Ƿ@KLmY@(kn@b"2xjC@ OJ,@2[={v~ @΁Pg@ˊPXsf^^ - n@U &+W6=@@ҐR@9D@R5([@0z#@2ņd@ٴ+y@pvn4d@ٮv@64@yR7S/>̯hARϺH c<@-@wb#,@In)@q@zeL@F@pvn4d@No@ 64ٮv@96kpNS] - P<6V`@"oMցnj>su@o e`@?u)\⦵~b/fd@A8a@vYBK@|ձkμ@Ge3+5@cp=Agʴ7&NxCT@=tM^vIюDvy^5yޤ@32<$y , RУ\x@cv+&W@,b[@:"@g.8&*n@iػlIu6?@1qv@m3@@]@,ehل@*G}{&2@,b[&W@g.'X@L.a+:>p6$^u@g=b@'zM{@]@Ax@q@e@H<ѐZq[mdGm@Ӛ"T"@>TE,UӚ"T"@>TE,U8&*nL.a8$@.q@9`6&@O3Z}:)N@ B@n'@Ȥ%[y@0.O[,pк!@' u@4aIWQx_"L@IWQx_"L@@iػl+:>p.q@vpT@QYqUceȈ@Q[X*V?_["@.FHTb|*KkBv@^_BߛOlļ'@]Rl$ʩ@BW6\@t`@Qeʼn@z^@:"e$'3^_?KkBv@6 l@{<|]Rl$ʩ@S,x@t`CW6\@z^Qeʼn@_",n)}"犚@ * ]،=@ u@E"WOɜN@ni@ *@"犚@ u@0@@bZ4@, B XD-DuGTaR@e2܅@sN@E@Ry^0s.䉭@lP@=<# @<1ly@qYxTNQ1yt@wy @Ugx@d@E@jB@)DIyDYW@cg'@,F@s]ć{@ X.xNCOɣ͚D{@+me@U`i@0ܕRy)Dfw A m^@UIlsg@:AT@\@t<Ίu6 Su8E”'^s@ :1HxQ 5>Y@msIS@@4f|Q ^❨Q&@j 7iZܦp@\sL3@^0sIy m^@ɞ 0Ӵ@MՁpXd@"ʯuy)r@ )MHu?5Lw@dsǵP*\@Y~v@<=A|V\(s@>RĂP@}@K1eױ 5Uu=@?@2_ՒAo@. 1|UgXz$@omwk@N9Nh@EK@\I uf%T{@SQ1@Qrn!7P@i Oʉ@jxnmb@C4 {z(Tj@a4M@o@v%A51RҾ@lQb8L7z@퍔[@pjKܽ@zFw S%` [@l'@pGMl@Կ&2fP@E"bZ4@dRs@?HkëY]7 w@" @*5X~H@WOɜN@, B ?HAʣ7@V w@g"5X~H" @.@(vZ''qu@-k:lZ }1@)UTQ@cG@K@(v@.@-kQ@@fqh@V؞@gL(@ E5KcG@ͅS:P`@6ɒWq@(~:lEV\A 8c 2 A Y@Ow'Ȳ@`H@y nq@}Ψ7p@bN/'ƾ0B>Ԯ@ էgcA@t\E79@b^0q Y@Mӂ@`HOw'Ȳ@GPW#w @Tf4/p@=|fƿ@`os +MF@s\E79gcA@mWi@$~@2:#.@ ADt@0E_co@6 o"%k_,& ({hP@5z@yi?2:@$~@ ADt@o7@*fzq6 o"%k@o@ğQx$ʺLByi5z@H0@ol@*ذW@v@ #:@Ϭ1S;@u&ŭ.NK*@G"ūL@rOv(@UX"v@>;d_S@Ϭ1S;@ @zGJWy{?v 6'Z~[ݴ_f5{Yݕ@ErNwW- ,@:ڲxSE0E*f;Lq@TLW{?"h@ݵXzs)%5@2Sv)%PX@e }`/2@fb@Rr*@޼~!3@ DP'oi@_czqTLW{?A2B@ֆ`A^x@X8YbCMAs@~қ5M}be/7V@wTTf@KfVB@? E9}uzGJW;@[-MQ@@OZ@Y3 A\pW);}9rSY&y[-MQ@v{&\B@X3 A\p@@OZ@N1Hm@Z"HTL@ve"h@ֆ`A4k;@gɀ·veU@PҢp#VkPy@e)SFE>@!RvCHzXKe |@u @fHuT2=@4ox:_:ԡ w@ݵXz^x@gɀ·3lI^@1DgLG@/[V~/@|<`\HuB!S@$8-ӽ@BZщ@'TrH@BԌ@V kl԰NޘA%/@TrHZщ@<@$Yc" x%/@x @Ip[@c+ ykE@87 \h@I@ 1|]P'Aێ@-K&@87 \h@}vܻ@2^w@?s<y\@ZnXzX@xQd@d.*#?@<,K,@" 6fzZԙ][%~q@i9vk':]</@4}e%8@(Z``@i)&h<w@z_7Z@TTDA׽0]I;@d.*#?@jZ4Z@T*6A@"d@}]OJ}6}bzde Vy$(@k^W`v:l@ )8CbR'd@ӌ>1=1@c>hZ@Tף1=@'00o=X|@N͊Bva9x=@IwjUIlsg@MՁi?r+@'w@\f\|@l%Ԃ98xQU1OUv@w;(pnT@c&j y@5_`@ }?y,F@by{fY@gqCUB()0@ 9~{Ƿ@:ApXd@'w@͆C8@%&wp6]H@~@:It@X *!?LH@3@u/˭@lDyɂh@^6a]@yeC4r@2l@f>@/th :@ >.`@^HSfGV@S%x[@#r[KxBʓ@7#_' @gզMi^)U@|@ 09^HSJ*!@-l'&@w>k yx@ъF@KX-r58$ƿ@F9@ê(fgw@*}@KlD֠S@fGV@-lO@*[?OgM*~SەS؆Mf`G@Ky Ь@uFqw@,n+w3T,='@2@P@als@1cJ@@t$(q@1zJJ@fFɱt@&JV@KlD֠S*}@S%x'&@*[?V\@}SەS؆@ŒSdMf`G@uFqwKy Ь@B^) dQlk92@PT,='@1cJals@t$(q@,@hEg?[u@"? &d@sZ"]*qno[ݕh쫭,@)3hxpSԅ@}˸pqWOgM*}SەS؆@Y)X A,*dduG@8z\.@,*Wc"B%p<Ld#ظ@wRlb@pFf@ٶ.Qn@vdyX^JnŢoV?y_@W9,?fVjNm@eΐΓqH;z@{zg@&"t@ \;JΕ@<"u@sZ@ &d@`)XUbK@ E6@e)3@,@zA: T`f~*@~SەS؆ŒSd,*dd>[OALԱS,r5.6a"WD-榁@~V%@`E"wRlbLd#ظ@ٶ.Q@pFf@R}P5@r@Ѝ Yn@` a&W9,V?y_@.Ipj-ð@eΐ@gVjNm@B1}@F({zgz@ \;J@&"t@+T!@+TaǭmK[r/cF@FO6d(@;y]u=?@f`wsr@Mf`G@uGLԱSӗ@~Ftyh;[@_4^ @b5Д@@96o@@n&h@fxv(rr=&َ|@, _i@i Iw_@!;ÄJ@Z}jJ@'ZOԍD2 aD2 ա@Bq.%@)O\ǫɞ@f`wsru=?@Mf`G@@,r5.~Fty4\@_4^ h;[@@96ob5Д@n&h@^>1>@=T@a sd(ܨ)$/`@!;ÄJ_@YTA@W{pI@@=>A@?"GbB 1@It@ݿbem_]@KHʯ 6X@%1.uWߓQa@ϟ5@=6%0h>m@KHʯ |qNg@ 9@^)S3"M5HL֫2<\g@Zwf3[cr96}@mSQKNm@5HL֫2q~Zw";@Ȋ}@;7+ޖ\esOl@f3[cȊ}@W+r@LK-c@./~@ :;@tuH5FAB@+J8G@*H-K3 @4WO=b{1h@lLjr96}@;7+ޖLK- !5@#G)nNG@ Li6HG 6T@eW-2㛙dP@xj , R@ )'brF@8EB8|*}/V@wNր[@S H@habSc+rJ@PL(֬@i=@R#8xt#ՎFX@嗍@fO-l@+]|2@!z@jZ!A x@ǘ9BK[^w|@i=@- ~V@/M@{oA\@8tz@ڂ@3&4q@fۆj@_h\~@-аg@\Jr7@Oj@!p@-qrR@`lm@I@\J8M^vIios@嗍@8tz@wB{tqҳN_6/@o&a@,7J@g(g c@|&M@K8&(uhyjŢ+@;&@sVF@6^N:\Єx@hes@@Y1aV9kƭ1@ѼxF-8 @,!5d;LE@PmKM1*@(û`l)@vDwN"%_yJV^ B;&@*i+om@vb `3>u@mIu@, WRMxo@i}οH9`@Wx7r%ӐN@o54t^ԝc@G#55|0Aw@󲻿A!aB;ze@bV5cy.@*j@D@?Z:Ip0q@50;D@)n@fԎO#D>ᚨsVF@vb `ϙh$W@q=A@Su8l DN*tL@aH @ߥ2_O@@a̔?e_@@*U&X3i/@Z.DC`S@LӺ¿M%T@۠Y|Z,@̣pv"8@$,]6^3>u@q=A@.fv@Lhah8@ {?^~A.9,>[e$[j%|@lq߹Val@ۡ.ErE"l[@LӺ?B`S@CYk8q@kWBF`YBV@yOفƈ!5s@9BH@" +::_l:"q@o^ƭ=Th@I@ 12^w@@hXh@.5-zWh3![@+;ƭ=Thi)@|?sJM/*;-bi@ّ(Q@dG@' @$VH@`x@^|"VrDr@ uՓ2W)2wQj@@܎ 0JM/*@otȸy@PHׯ@&`t;S,@̬븨' dG@M / @uWE^|"Vꃏf @"+:Ѡ@T |ç@G] @@z !D a\-47DDu2o+@rDr@"+@ cI⛚?|}^@Qa@"W@"h D@lF㏊Msra@##e %h D@I9Xh\ uՓ@&[ uՓ:Ѡ@ cI⛚?d@Qa|}^@"h D"W@SmLhz&E˛^=!nYА @WZ'>;@12\te8z\.@6a"WI,@B*>nE˛^3( r3Qɗ]g@s,˱:ZdMs@,*WD-榁@B*>n"eci@{n\@D?@!ɕ`@&Jw}rx`8[(F0@HgEMl!m?@+{!@&Jw}G xMSS-Hj@]73N`&= Vgu@3N`@w @rI@{Y4tZ@~~`^=@2`y] b A@G WK+@j\F6b`@c9I@[>`½t"R0ݖX͇@"C `p@ңY-F?%(@@A}u̜>@7vx@=I@+Ԁu>Iln@;m@-,XO&Ti@@ u@S7ri@A.@Q s@jP?8\@,n (c@cQ@v&TiM u@A.S7ri@k1Fs@9.81ߴ.0CF*Dp_th&t:|Y@93p@ q@]@5F@ 6]Y3>ibήjB@]S`P@@P@?g8@\0_O??g8@\0_O?%zȨJ#@.}`8 qPI a@]ᦿ7=1|Z@DzX{?W3Zj@;G ?Վb@ks֕9wk@^B㼄lX﬏;=.P,;~Ӡ]0g8A@;~@?P]S`P@:0_O>g8@:0_O>g8@.}`Lu9@6P@Zv#A?I a@XDzX{7=1|Z@;G X3Zj@ks֕?Վb@^B?9wk@E]3{Օ"U"3hb'ǣ@P )J?ٮv@ 64$r AY'7 ZM?9@ tyEkV@f8po]@A].@U7)Jhb'ǣ@64@ٮv@Y'W4BDrAZM?9Lҁ2Lyw@SV`k6[d/2+> @NN,)|M6@޼/@7 ZM?9)$.Lx\Q0p-A"<2E-sF@ ig@/1S,)SF@\t@#\֣@#m{s@ƴ@E$XI @:Q@z@Fl@]@ EPC@@jM@YCJ83b;@} y@VN,@ @޼/)|M6@ZM?9@Lҁ.Lx\@@Bk".I Ag@(AU$:XYR@V@tu@\t,)SF@#m{s#\֣@E$@ƴ@軴(5?@D1 x%z@Fl:Q@EPC]@DQC\FA} y3b;@o`l@%aH?^~A,p@ ow?Jz\@li%/M@Vj[b$EUxU@ @.9, ow,p@ly(%@SmH(P@stG݈*@Ga< _@;^F6Q \P@AeaH{@#zP(we|է~0fGa< _@@pL2@ .;G@7#zP(@AeaH{@b$f" Q7~r@E@!b^v@;^F .;G@+@R-4&z@"'49Tއ;j,be@2^P@CdPGk@&T@?ܙ\@Tщv@!'TsfRa@6Q \P@7R-4&z@ 恤@WjHjwZJ2Li_YQ@f;A;@D7T@\6?@1s37Blù{L"߽nzR@. 8jǍ@hƷ@ٮCes@IE>ԑ g߽e [v}. 8jǍ@Hl1@Ns@^\jUwk}]'oh'MAjt3@Vt@FP2,j#qC U#1jt3@|,@7NAFP2@Vt@61M@ $h,n+wB^) dLd#ظ@wRlbLEC@_m@PA!m@5%z\C3Qlk9wRlb@Ld#ظ@_m@ P@"U'%^Aw֙ΈQ'ABsA:Ǧ5ٗALmD,@]E6t"A*ƭ@Mn [|r(l AM3t6G^QO!@fHtͩf!.UQ@8@g8bV(@ @0R;TQܯQ@ndĨr?'FMzA:g7@&i@P\@n3Tp@rx@Saue@# Cv*"@n@SLH,3Y&i@@ Elp@2!A\\@6Bt@VIHR@Flpމ=0-n*"@ Q 6vYɵ@@x¡~ u@<9S,Z@cFX;|@ P晻d@ cb%}hZNd@uVؕ@~w$}u0@ ӯӲY^@slB@霨d@kA۹M@1 Td@!6~w$}o)pģ@F@]j@fU@~ |OZ +I@g,|?d`ĀӟJYP@ Mek@߇W+H `s@bO*E׽L@0Uy0@wsaEi@mwu`'rrh,|ҿ+I@Q|VC@}mp߇W+H\еt@bO*@ `s@0?E׽L@yylIX.]nmWdmވdsgi2Χ@pm@@a@g]+I@hkyZn xfV}%rs1=e~pm@BhV}@o`I@^T2@.0q!@(* A='ǂ@PG7Ŏ@@8f@ N3 0Xwb㭽FAi/Q4p qy_E!A_E@V@-nLy ϐnuHc~@&$jFP@M׆D$Au~ @dQ`@"3Wz@K@=no~j[@`@&H_@*oф @뮧N?q!a)q ='ǂ(* AQG7Ŏ@ N3@8f@Ը3>@hpi/QA:r0@ڥ_E_E!A-nL@V@0][)u@].9FC@@P@6o\U!@u~ M׆D$A ([@cǻŹ@{i@n)i\@|/ -@&H_`@뮧N*oф @CY&7qh@- ytY@N$DgP@ D@H9E@@Frb6bo@UV?KaV@_m@A@n˯ k@ͪ^AmT@q| +D@WЂ:@Fr7LYή@qUVb6bo@L@@m5@o7@`!m{zd'ҵFnG]p!3x b@ @h #@\,C@v{⸀?ٳ`!m@o7@w+)9dd-.Фݧ @h #@)g@]{⸀\,C@YZZZAKB C X|:Jl@k0@@8.?4p:r0@\L>k@̎g\r2׮@;p4Cc M@1Ċ@#@hh|8D@i&{hc@58/gB@?LR'@Y9@YY~b@YZZZA"-u@\sGY@B5(58.k0@ qyڥ̎g\rO (@]o M-xv@#gOIX~Ds@hh|8D#@58/gBi&{hc@As@e3yM1RJ1s{@g(l/ ߥ׋@ @g@@82@3bg;(*Ln/r5 drŧtm@6QeMI@9$o AQAH?@Ơ@rKqIN}<2g@ß NAEJ 2b(lt@E-sF@(AU$E @2AEM@8B@.Su@ѼʝY3(lOX{Y4tZ@a4GD@L|vC@ p@ن<~ sZbyz;L@q?5@ka|ui@kS@.Su@}U=,h*ח~~`^=@+g?ڃ&@ p@A۩ Ho}@k1sfq}.p8W/@U=@D"L@szZ06@Xr16Xj^@c@#G)'֌@,5vM@>WeIlYH}Q"/@aS6ҔE@*~1m l@ *4-oL]t @!((GLz@fBA8Y7AD=\@ ?( .nNG@,5vM@5N@vF4Q {Pyk=6ЊDx S@Y1uF+'P@d XR@X)(ƾ(@T\HF@ +8D'U@C@:Ze@-E@B~q@}6@޽<&jL_N@xP@?:"]K@, q|dN$PV@ +\q{ Ѭ@8U u@TWT@kaq`@#.܌@q`@#.܌@:ZeC@B~q.E@޽<&j\Ȝ@yPL_N@A@UYaޡ@R&q +\q@N$PV@9U u{ Ѭ@}** Nݼ@$.܌q`@$.܌q`@N! @[!x@}3@BI,?srR#s@7AZ\@) ɡ@ IivS@$o݊L;E@EoJ0Zd6@qM\m@H3?cl=gȯ2 E@Ѯj;@n{6@I9R-l3(a@a@@ht1 "@4S)O\ŢlhS@>PW@";\v@ys=g۲qJ@4l@htVk(@4S@1 "@lTb!lTu˅w@5zs=g?\v@Gm@MG@qivCkԲ؆XA e@>-x:Dw@)@OAMG@lBɚ@ivCk-:ֿQ>ۿYd@Ԟ)@OA@?-x:Dw@~Z(Agً@ߢLWU"je@:M,S@gͱ>AFbJA@'GM@pz(q3@$3+Ao`-ko-@@ *qF@A0|A-L=@Wb6@#M-ko-nW *qF@1}@ kX=@.uk#MAb־Uc@,A wx@w+6c@F*ˬxPU@ɮgyȵ;@̎~Z@ro $QD@ؙ8-Wm ydOK4|@ov@=UnxyY@9sX@eC@XE89@EUi@9y@iw,9yh@ɮgyȵ;@@@:ڃ'4XD@f /@Lgԏ.tХe@`@MA$VC@~0C@+U*:-@AFKv@@?hS@Q\$@"Tq, K@Oҥzuf@ij@R9ٿzeʚte@'UWrP@HzPP@[Z?@XJdx4>@ e9?ij@K6aߧDK@ 74@<,K,@T*6< 6NXhH3?c)[r@Dc:b@놵 %<w@zUK &@'/l0|!#j@9J_34U@{W cwpc.@hrCt|F!@0%K0," 6A@El=gDc:b@Հz@҉u0y@pI'&ϛ8ӽ;H1\:@;~tυNh@AD}Aq`G_V@ui7֖7O@:D1J5,J@!!6@kcO@c@s{i.HGd7?[5q@{DK0"$C#@|dS9c@=?B0[wOw'Ȳ@`H,L:Ayd6@J-ў@\ܚ>{LxE!axHq|KVzfs?U_@ϼ @IAIe~#RڰPO\"L:kt:%\@|d@$C#@Km/r:@ϝ}`H@Ow'Ȳ@yd6@AP ATn*s{@N @) 12&; 1l+ơ$ Թ 14mO޹xr;ϼ ?U_@.Ӄty@#E|%j~P@9}Д@?'xP[ u#[@vδ G@ޥx@A`[S1tDRY@ Q@[U1OUv@:ދw@X@DGS@Y J߉@ 3Nfe@(dWH>@CTMP\@ Elp@؜f@?2@-,@>q@՝$@e@a ާ^s4ЁAn3Tp@2!A\\@?2@i1s@g[@A ]@;|)8@8@)=M8G|֨k*kJ,{lc Av&@[|@ LѰҥ@s+WD֖*,YA~@TfF@G8=W@O^x ] 1v&@ WAB~n/8#=V7@s+WD@ҥ@1{t@@\ ;8=WTfF@"X)@>}]q7yMnu6j@ {S@em0&8@|\;@+ɖ)h\p@xWC2em3[Ű@|\;0&8@?j@S"fzZԙ]"d@P-Q@ȯ2 E@놵 %҉u0y@ޯzͪ@S??W0Db@ $tQm1@ 1$P2S@ԃ@Bb@6oPb@rhp@rY@J@4a$DC@-~s9@S"@?j@[%~q@}]OJ}$7>;E@Ѯj;@<w@pI'&ϛS?4t@ Mn@8ĻJOwR]A@ѳԛ@7WC|Z@/,/>#_L@OolY@43sC@;#U/@ W.@/^#@kOw- C?@0L@"s@( `cbqM]vS@AL@%|NY( `vDL]~@EqS@:x"T[Z?@]CJ@֮h@XtO)@:52*K6O@Wd"\\~'@GO??NA|t8a *q, K@XJd֮h@ϕ.py@8$ M@,GK@}/i=@zFWI?ڑlT@벥C#$@ɣUrRHC,@V@BvjQ k *ڕb@k[}@*gh@2jX6ք+pέh#@`_@@Bo@'4b|@5[Ou~@< ϡ@G7@V[ >@'Aq@j֧ @kg2Cy@Vxr8@?V@-L@iV?@BЮp-zU3Ǜه@H[Z@:R5Ct@cG @^5ݕ@BoF@G3t@H1[@ZL@0:[@6Cr@O@rx@6Bt@-,@g[@N@4av{@.z}.x<6/-9[Saue@VIHR@>q@A ]@4av{@%@?u1]Nti9v6}bј⥶@t< |@1AMxfi$Ͽ@@%+^fӺh@ ,e,Ak':]zde Vt< |@V(O@510@Ntl^Ꞓ;Tf{@&RzgF@a]<@P~g@KVf@JpM_@>] ю'.p@h\~@o&a@?@:JB~@ Nw@E_f5b@nܙYhp:+~f@2?ܷo@[ؕQ@P@s'%N`t@[J@F0Zd@47@Yn$0k\@Z?g @WV <ϧ\@C27 {ƹ@{u'\[@/1SV@tu@d02\~D@@C^@|[C/@pJtf vp@]?[@N@[6Q^">:J5C@^9^9@ r$ ߳X6u֍@{u'@oHClVn$0k\47@֎@%8,]G@%O@JQ@nB?s~@/Q@^D|@dݓ@C^@2 xAҸ!=@J5C4ݻH2z@S$7c:Xc@ ڥ@$8,]G֎@JQ%O@[VrEl@/j^D|/Q@|[Ҹ!=X3DqZ AJ5C@@#@ǣ' x[@ N-f ڥc@0^βX"seh@A;_s@DDVF@-6PGJV@KcVؑ@D`Xl@f@'%DDVu6a}@L)@eJn@@ ۚH@p~lp@DTAC{i@1ct@~66c5NSӏ79Se7π@h`j@s@nE\@9(OrZHDTA@p~lp@1ct@^~h@(b0#Ayaӥ},u3k@s>@8UB\@ޜy D@e rx* Bs(HQ]@tg+?>WeIlvF4Q|A@ĺ,!Q@"vшK{t!ԨC>@6h+(HQ]@YH}Q {PyĺvA@O Aj Za@9@D#@2AkS@oS:{j@pFf@ٶ.Q@,!Q@O i*A`Y@_ ut1bT@$.O& NmEϖǻ2AkS#@rzU@q.ȳٶ.QpFf@"vшK{Aj Za@`Y@T~Aj1B@y>TхoRuhg0. AOR'c8E#²YY:C@ZC}pQs@M $"@*@Bwg@T,='@2@Pn@R}P5@r@b5Д@@96oj7g@,ֿvP@_ uy>Tmyx@zj9DyaC}Hw@[v Y$gi@[=^}@~0@pTGݐ@0X@lC D nn@t9GͿ$R¾@&?;U@$h9?IyO@7-7M $"YC}pQs@2@P@T,='@vdyX^Ѝ@96o@b5Д@+ֿvPk7g@t1bхoRzj9DyaA5ٽ@\v Y$@B}Hw@[=^}gi@lC@0X@29G? D nn@&?@$R¾@$h9@;U@@}s@D Tra@%7%kȭ@ۦ|kUWq&@" e@bۦ|kUYy[@/A@IB>Ѕ@ 7qB Cv@^Q@|TE@ȝ!ѣ@E~lc%28AhB7ΐ@;Yc@fl̍_ @.!l@ȝ!ѣ@fW3 @Pېm>[~ 6T7c@p܅B!N @1t\Hs(@.x?,D@nsn@8ͽ1SCum@ykYDԈ@J+,h[@RcT,x~It2p͖@X?ch@%@-Hc@E\K{@᭣Y;_Z-x\Hs(@nsn@ͪ@.4qqh`>Ɓ@eC$fr_tk&@X?ch~It2p͖@-Hc%@T'c@3 @AQ&Ƞ@pTʢvi@V0;Ă@t)k@^[]@Y1 aXb@!t`@8ͽ1.4q*hA@q4vcu(w@{+`@ْҟ/@V;leo0Ⱗ@LqVy-&j]@cXd@E:C_@Pgϟ?~ow@G>vh@6@MKh|ג@Mmd+АmP4@x@3 U'c@=%d@ ¯:@W1 a@^[]@c@g_0@SCuqh`q4v/ @W;le@ْҟ/@LqVy@o0Ⱗ@iE@cXd@Ngϟ?~@:C_@,s0c@"a 9@MKh@6@6Wsc@H\r-)uQx@)0ڬJ@RJjQmRXp-t3(@Y}.`@-#gݛ@kE0@j +FӋvx:2,@&h/-#gݛ@"@AZ)P-M @K, @2r@qZ@C ت@ޜ!Koo] @ݧTIL_N@yPm@yk>Ɓ@cu(w@x!J@4ݴ @Z@v۞:y%@|u@J\#ŧ@E<9}r\@h(1r\@h(1%Z@y;B@ޜ!Ko@C ت@ݧTI@o] @xP@L_N@YDԈ@eC{+`@4ݴK(h@}@t̯@/zn[@݆ʒHJ\@|u@E<9}@$ŧ@g(1@r\@g(1@r\@dp3#W ^ @}@[@?JEe?q1kQ\F@ҺqҾxH@|Z4k":]-q@oM]MgA`m[Z@t̯@?JEe?mw@fr@>=@5ԲlY@itjl@KZߌI@ [egF%P@|]io2h@@a@o`I@SZ^+Y@BĦ P@<aP@&h2@t@yia@QYskD,@ TPLnǵ@^_=}@'Vl1]@@F?/1h"@Z 8qu;BOCW2h@|kZ+@1zmMa":@ln2?X@ZO~Bq/c8h0V+WY@Hpސ@p ^c,É/@ln2?X@4S,@lV)q7Dk</@yzUK &@8ӽ;H1?W Mn@o`]@ꢱU dF@q`=&u[p~2@ d\ Tϓ @( fY?ZgP@4}$(@'/l0\:@0Db@8ĻJOwꢱU&3h@7Q5VzVe@o o<$G :^@Ձv[*@V.9{pP@J-'davN@UchD=@N* A @ǧLRt8ɫK@s@)[@dz@1@߬@\ԢZ@b{9u&@:LP@ @KybJ@Rt81R[Z@b@zr8@o@U@kQCS@åuzE?1g>%L@7`@ h %ۿF, ,G}@FZ{@)d@sD@d}vp$ y/@9IbL@n|o :@B͌@sV | y@ O | +@[ Ē@h %?7`@4ea@FB)dFZ{@d}vp$@sD@9I5Z@n|o@bL@{ۤtƨsV |@B͌@ O |@ y@Y Ē +@@EIIv. @aGe5̴3@.LJI!@B 46iيQMa@.{Rt&GV@sTEIIWѻ@@o#5BK@YVCI-]R#a@FC06)L@ci4Pa@q\;E!@Ysj@$2:`@MyB@2`y tcن<~k1sfqŲrX_}@$i@p$lQ>z @n&OcT|;@4"6.RGeB@$@] bg^K s}.p$i@꣌$@c'x+$#@}ˬ|mݨ`3upFR"|g@zJ1Z@M7@Tw.sǗO@@g;I@Ҁϻ@q\=A~Ժ:x@\}@ӕ #xH;@:z@Ҁϻ@4'@[%Zf7<;q\=[%Z?@QT@l2K}@t r@&u̝ A~Ժf7QT@@8'x@&Юj[@PWXLq@vM.ڿPd`/@xՅQK@[VcEO+zY!{r@ !\@8%c!wM.?PWXLq@xՅQK@JnӍ@s*@h>la@rk1J@!Sj |t cGV[.n@ǧLRt8۝AE8@[.n@P%Rt81E8@֠b@PX8?`c@03?T@NS}9jLJC@{a@ߕGR+&~pQ@'ga4xA@N1,@y .@_b%A(JS @t%Ie@4SfH A>a߻@1&y|D"sX@ѵ H]ysbj\X@Sdpu_Q@Q9>a߻@@{!2 x,j@w7D@S}9y .@盨^@jn4ząީ =@s@|7Z@*Pϳ#jLJC@_bjL@q:$+T"@@ny{Ƕ@5@3:n@ɫK@R[Z@1&{!2|~\gnAU@䆐@Y@qA?*@g2:@18hbaӃEr@`aR@9@[S@|h@s@b@y| [e``U@!_z@u*a87Lv8@6COMQ'@e'+>nN@t2d~S3Qg'%@Y;g xA1@7 WUQ6&@(3`=Y1aVRMxo@@a̔?e$[j%|@P@v@`u*adP-<@$NPo$Ke@lb?fT@01zd i@|<@G (ul@Fph@EG}?Vv#v@ᚵn_@"@/ߴqd6pbT!\a@J˞@t`ق$@FExiEG}?x5@ᚵn_Vv#v@/ߴq@"@FFpbzjzt`ق$J˞@$]׭uHjw@+>2W^@(L%@N|azx@- uY,Bڿ[#f@rM@goz$¡L=^@\JD@N|azx@F6@A|tkLM@5yOV3@db@r$(&M@B W#޹EK@pjgяջP@-] s@^ #^yDh@]`(@м`OFWe?\IKܽ@9ǒZ@4j^ rd@Dr@EK@U,Y<l2PbϨcA@$y#@EK@+^]@}WMyY(?=Pki31S2?#@vd1@Td"˂A@&nK1R$/`<@ha6Vŭ.{?vX@~қ5M}@OZ@X3 A\p@#VkPy@/[̵-E@dJZs`t?ET@w@u[@+<[BCǬ@„aA' z@NK*@ 6'Ze }be/7V@Y3 A\p@OZ@eV~/@ _i*s@w@bwt@9kƭ1@i}οH_@@lq߹VIٖ4c 7cN}@87Lv8@$NP3 }G@EǦ^Yы@w''/s&xY9@\.J[P؀Ȓ@@9;ZRTD9CkD@``NP&Ue@ )TӅb%Z@(yO^@S4sc ^,gO$p@x08»]@bF3@t^%p݋@7L`@l(@Zhƕ3 ;*@XW*5.{z@8(K)qu@Tt^%@bF3@EV\@l ]rPp@Zhut@8ѵXڕ@IC.H $@.Gt@Wkk.XtO)@8$ M@v. @@o#5=;@ޭq@x]NsIik?I3@dKS3J]U1@TFl h 9Fc@qIDWzc@&TT:5,GK@aGe5BK@ޭq@Imj̆@Dkk3 VC{7waJa@GCtBݬinX@`d@;fQl>P@1*Єzuj@̗{:ĥv EÙ@%4D'\@uu2j%4D'\4yϙv%4D'\@wIq@%4D'\+ 2DAN]dZQΪG 0v@e}Ur@AkG@㠲^@QIl i@aKY@@vyu@5˫߮ehU@xU0up@Y?1A@G0@Udž_6\v@5YM@cp@$o<<rLcmhz@nҿ8v@Zma0khtW@ZW\ÑG@v@QIlq@ؓOGg`@+uShP؊@>"eJ@@KKBC@oc@ŮIjwENv@qL$hE@B@︼v4Sfu@wU иENzj#ݹw@nbַĤ_H l@<M@<|o#@6sMs@yb}@#pk gC/@-0zAKN2 ݠ@3Γu@i0@m @pJtKNC+ AbbP@;h <H*k 8E@'&J`]!gm@.8_/?C?"Rra@ĵ8aX}p'&J`].9@7_/!gm@a@UנNAb־US@#=@A0| kX=@̎~Z@:ڃ'4XD@g@Šs](撪N~㼇x@܁ +>@GLb@tXb@ L@|@ r@#=@Wb&@A-L=@.ukro $QD@f /@Šs]-ڒ@_ V*go@qZh@ &ŨL@T=:L@Uiu5@wbҀ@5Fl\@kV&L[~s.@s5@VÚq'@Y7Q`۝sG?Y,@h@mdPm$@$LVÚq@s5@Y7Q?@z@]RundPm@h@V|@f1ʝ-M@2@*{è=6q@)SFE>@|<`\Hh+@uig@>cz $,bJAOr @Kjww@!_Ÿ!RvCHuB!S@uig@٣UD{@uzb|ʹ? @xjr&!_Ÿ?Kjww@wte>nk@/~@ Li6>rx#b/["/@k=6**FW@egtP@H 9!@`4?~3m{@@AX7A@Y)=m5 >'@,E<%aS6ЊDx S@egtP@FB}@w_?z:\@,[ۃ)`@eAu5hRS@'qoD ھb@/Xo;@ꕼ@+3+yR796k tyE2Lyw,)SF@\t7z@1!Ff@@&@Op}@{X@1H?ꕼ/Xo;@p~U>Z@e>i=BՂ(kn@=<# @,F@EHu?w;(It@(L*Z]@}zvƴ@E$@Fp\G6@et_@DGS@՝$@;|)8@]?[@f vp@緢i(@lX@t0D@X\ͷ SοbWU@߈(Jۘaѷ@/O@tϟ(g@JB3@0;2Nr@dqPX5f"@UtY@hzJ@H?4c*0@|+v4@3;@Gma]Eu=@^>i@XSO>@[ꠖ@b"<1ly@s]ć{@”'^s@5LpnT@X *~bv_1>@E$ƴ@zJ @#CX8Ug@Y J߉@e@8@f vp]?[@P"@\9Ǻa}@X\ͷj'b AupI@uo@U<70Pʡ@dr~nS,4@:S(@,JrȆY@29v@d3%̻s>6u@,%JT@[@@YrLJ3;|+v4@ҽߖJ?@I"ey nq@GPW#XI軴(5?@"\>N@[6QC}Hw@\v Y$@ SοupI@z/+@ P7{\fze@%[ ۔/n@*O6a@n80~@W\xc@Y :[v Y$B}Hw@bWU@u P09wAAMl `@˖g)G#@EyHqb72@xKXWB̊@*O6a/n@xZ13n%@tԛ@,\Z|.@7`s*_@hɽ(E?Szmq@>@3@|'vI)Ah@R@[>t+R0l@=§r@"ٗQsD;$$ÃhlcR3mODI-L/;`@־R@ua<@R(d=§r@V{ @ZB $/HbqfmH:k\>}&@q0 7X$@޹u`oJ@2MK l5/p@`$'\~$Uw@jXLn@?b@?KKrE@@Z30sVy@Bbyc25G\V@INT$޻@~@?ęU!@x#h A| @$żJ{qL@n~q磫T@2-Ԍ{:lZ@fqh@1:@ K|LT+5@:,TtΝ;@-[3TA ugk40RJy1\c\-@*;3Ǔ@pTI#8@ }1@V؞@ K:TAep䮜Kri8@N4iҸuΝ;)AnP afC;@N$C@xY9_T@+?@╸} gH@pk4_+uShqZ.@ƒI$@"ٗQsZB $'f@0)3Yx*S@r>@=DRQEV@/t1u7%@ R,W&q@SrPب2E/"qY% Ԛp@3#C=6?@w'@,Ֆ_,Κt@P؊@:"Cj8T@D;$$/Hbq0)3Y歑Ǒ@:>@+Q?u'@czuzbk3`@Qe[@DաO@|a]]D@HauM{@Ƀ}$@,  $,b|ʹQe[@|E@ 9mD@%>r׌9@'tBaO @Ƀ}$@*K@orI@׿ {@ OQ 5>Y@dsj y@3@uPчSV`k:Q@z@FlRϔAo@߈(o@ApeC@nBm 7eR@H*xp,Gc8@ vT (l#©@*^ &v;4@]teorI*K@5 LJ,@msǵP*\@5_/˭@6.·@6[d/z@Fl@:Q@-+$&@Jۘaѷ@U<Ml `@nB8@.oG*lw7@LspSpօ@_ )[1Ү@]te@%v;4@>ԙn@J^m!rlyJke@^礮;@v#x+"@als@1cJJnŢ Yn@@n&hf @Ogi@[=^} i@>"eJ@@9j@ _7@7GW;\~~h.}@Enղ 3^B-tc@W yc4@ZP@Z˟KRױu@{@A> k@WG4A@ǻ_{k@u\V`KrKk@" ;@%`"@%L.@6u1cJ@als@o` an&h@@>P?f @[=^}@gi@aKY@@KKBC@  u@'}W@-xqqmF\j@kUQkA@z%jͧ,-YEc9@)2 @Z˟K@ZP@KT=r]3t}@\DŽP)5ie@fzj@PGڴ^jA@\7vx@A}u̜>@=^هAvݒׇAZz: $U.B!A"J"@~7}4v,We&$ASMvZF@``޿>@A}u̜>7vx@vݒׇANهAZz: $U.B!A"J"@iyš)a(ӕ@U,=~@f1$s~@Zz:Zz:D.AWCNA\rC!p:+wcGf9Yp@i%ۯ@ѽ+?W8@ $ $WCNAu92{ABK!lc4];'Okqp'Px<@-8 @Wx7&X3i/@ۡ.E[(VqX|0j@MQ'@lb?Yы@0h՛b@K?;u%.@ae^3|]%@(pgG`J@+j5 Erp> Px<@f b8,!5r%ӐN@Z.DrE"l[@f%Uf@CV8e'+>fT@w''/>CkD@K?&]@H(%KDe{mI@]}iy^@x%+'F]K@6.@_wg@1@c9X@.i>ܻ6@rS%e'ZN}k|@)xǡS_wg@ӹ`4@H(c9X@*Χ!@UeReg:@C\RȚ!|@@rt/@. S@k*f@]KƱ@Eغx@Ckc@` !D@ӮL9ɳ< `s@bO*@3jN@" +o}pi;~SEJ?@Mօf@Rm$\r@ho|@@a !DCkc@M;@qҵ5bO* `s@" +o\@ԊN@7|Qm$\rMօf@o!{S@@fv@q{"@cD+0&8@|\;\åuzED"sX@ӵ H]@@@18ha/¹ATcT\06#J6+=A$51UA:O=HqGK@ҳ/V|\;@0&8@Ԣ?1g>ѵ H]D"sX@s@@bav9uV?1VpZ`9~"c$51UA7xA8db,3Bd`&).43ؘ@0 +@4.@Z@%L@ӃEr@ ) x@Cշ@e? @D:!@@:O8db,qqf &AMi=@3z9]r@M"2k4nE2eh56Wf@&^q;Q@Vw%6= e@z9: @zۃB@u7q}wpa7ĭ@CF$8q >Ľ@3Bd`&Mi=@:AUEȥ誹4t%@y@@TUp@VgtHk/ E5ĭ@P @%m@W䞼0@Vߺ@ e .X>`2ƕ38ѵXڕ@cwnS@k~f@oRxIva@Ig0~6f e[Y_@ d3k`<Щ ;*@ICk~f@󊷾@`JwrNJ}@Ɨqt[Xߝ@?:"A@@߰u.ܵ @@ehj1V@2iP$נ|LQ]e@]K@UYa߰u.ܵ}M7@ @? `!p@ 02B@pT[|@B~n/83z9]r@UEȥ0sK@` rG!D d?@ҮWp@Q!B@ qB@Z̚W&@peH'ە@]6 + LѰ#=V7@M誹4t%@` rG!56fW AHԿ@SXo@%h()}̡Yvn6@TDgݽ@'xxӬ@38 @Oҥx4>@2*K6O@}/ir@Q9<Nǩ9?zuf@ eWd=@Q9z ľ@21߉࿝/Ʃ_+7@(V?׍@U,qYF@3v\?1 @kl`@Wb6@#Mؙ8Lgvyu@oc@(撪_ _7@'}W@@77T@|\%06^[S@H@d_VY@#T!,#x?`WN >WBTW cZ&x@#MAb־Uc@-Wm yԏ.tN~V*77T@ыS@bSΪ4'$e9[V\[Gy"皒@ؠhq@QyHpN{ڀ.CJ$E׭~}!5c@vܒ'V?y_@&W9,2׮@]o MdOK4|@Хe@5Ů㼇x@go@7GW;\-x|\%0bS @k_@ITb<@m,mADk@vdJl,B?٭)i@~L+Y2@';Da7ԃ@9k@ɱm@pXG@$ @V[s@#6Ix#E{LIJjc1FMyzMy@K=#fu q@F/]Hunr@9-.m@qT"o3iܒ'@!5c@W9,?V?y_@fxv(rr^>1>@;p4C-xv@˫߮eIjw~~hqqm6Ϊk_@Zͦy@z4{ʷhplHRAc%oPk@vdJl@Dk@TUKfh9l#6I@V[s@T(`o*K%l E.fAq@i! ূ@ [ )@%hxI9@~umd33kV"@ a3saaOu@{+@qeC@N 's@.Ip=&=T@_E!A_EhU@ENv@.}@F\j@^[S@Iz4{_Hg@JTnB_@9Hl@? @ sVl@=*Cpx@]Ճ+X"ѽj^if>@3K Tn@0FmAf{c3fj-@{+aOu@j-ð@َ|@a sd_E@_E!AʷhJTS>@ sV@? @+:lj@guQ9r@T<jP@\wm@ T@p$s'zq@~ťX@Sޜ@wTvLS|@O[X{p$sPA=h@U8^B\@II*}*'{,@'?0p`=xv͚@ o{@":8bl@\,YG@X8^B\=h@JT{@ɲ)'?:,@'s o{xv͚@\,YG":8bl@8 ~@~66c(7{@$IKn@}òW`Џj@r.@7 X@'rg9vFÙ>C.P8m9r.@ŸZI@LOM"PvJ@pi!@텒Y@Q}Jyp"@6y>V@m[@j]r@Lak"?@+@XaTxy3eۖ2YI@@V|OqԶ@tJ쯑&"'QpL!V@T@bЈ @/il@ryt@奝\@) ![[@34mk@M./jM"sǗHrS@V|N&@g[oJ@A5bs܂@HWįnſ%j'@ค5 @jڀޑKZRS>a@g@\cЭa> ;@PVKd@nſeF1aiusค5 @4fڅ@8.S*>n@d -r@. oX\cЭa@g@cǥجm/eW@wu @Iۍ1@-Ey@ӵ@7 8j@Iɹu.TJ}F6g'ewu @cUx@-Ey@~@Xhs@cŖT@7yaG6jDTA@Sӏ0#Ayan@W@c>~@E v BT!؄@Ku @W+­@H@W@Xi@6jp4@cMrW@ RI%Uy+@sx@'Y_ٯT!@ӎO@$@iM@ZӤs1ӧ4F ;ܡ@@9|@%h@&f3@N$PV@ +\q@>PW@u˅ҥ@s+WD@@J5C@~It2p͖@X?ch-&|u@J\@%xG`0_ɖ^י3AoB;Q'53h2^p@$&@Wv[ cwq_$dtt7@kS@+J`@w]W@^>@Z%yn@MN?p]["ہ@' @["ہ@' @qeg@A#f:sxUy+@ڗ·@j gӎOT!@v떕@!(#c@5%ȯ}@6V8@9|4F ;ܡ@&f3%h@ +\qN$PV@";w@s+WDҥ@J5C@X?ch@~It2p͖@j]@iJ\|u@Oq@Ϙ0_@W;oB;v-c3A2h2^p#qOv[ c@$&@Ԫ @TdkStt7@w]W+J`@x@@_@pʡzHq@$WM' ["ہ@' ["ہ@I#f:@reg@#zV# wڙt@S J@o9}׌x!j@0z@@z@ǣ' EcXd@J6Jv@)I䙸@3h2^p@#q)'@2p|A]y ]y @azҜ@O̫Z@U2@;.lNg@sߛ₃@$Y@{R@s@HgH ۳'xA@ VޜbL@n|o@+ @^#@W7I.c+֬u@Blx"i@rLꢤׁ;.lNgU2@P#p@#eyp@s{R@} z? ʱ Vޜ@'xA@n|obL@^#@~@;br"flOBl@֬u@rLꢤׁ@x"i@u+@\VM٢@?/Ҫ44@=~x@=b(@G+O4#2n6/@&}vjB@1FZ?@4]myJ-ў@Tn*s{@@'4b|@G3t@ {ۤW7I;br`oA F$xq!\` @t׸Dw@&G@[y@EWӐ@1m@h@Ҁ @Տe @WV_@g@ayNQԟ0 9@-Lr@'kڙA{ˌ@%k `@ W N^Wy@]t@G '>@xM8*9ɷn@\ܚ>{N @5[Ou~@H1[@:@tƨ.c+"flO F$x A5N\5q?(b,42@[69A`@au@S@I@g @3 @&e@ (Adٕ.$E @!@%8@ )8C4U@AD}Aq` 1$ԛ@p~2@o o@c'@@Jp@6`w[XJ׏-@6k@c|c@o@pz@P9FXS1Vc O Ьa@u=9rY @wQj@G]Qa@|}^@cAė@, @1$ ըW@.LbSh@"W@"h D$9-A$HLJ@50 ,5-zWh ~"h D@"W@$HLrǠA8dWEW;[@b) !Ʌ@T#@C)tQ]W;[@>rT#@0l~@mO]sL3xi!g2@O]KEx7x&C@xCyF]@th5ܠ<@gH{8فEK@@e@TcE@*IVݽ==*]@ΝIgH{8:: @D@JhO@UYUC@֪\R y EHJ?D@UYUC@C,)@ {w~iҲƼ%bee>w@qN@``@ӌ>pc.@ui7cSZ1o@R+`@ԃ@WC|Z@ϓ @ՁJNkN@N=%#c̡k8&=lr넳pA9@J^t+@*z{ButHmJxReV@-nL@c M@#gOI6oPb@>#_L@Vv#v@ᚵn_Tb<@plHRA1`"j@Z^3PF@*z{YLf@fL@#5F첔@F@?Aur['#"[8h@Ӫ _@YX:@p%]4'I;{O8@)ܩ0{*j@hZ@1A510@<W@bj=ZpKOkY@bV<@­*;k,AVL[@3wh@z_7Z@Tף1=@MxfNtbj=Zp&@59<@!{Q @m̟d=\@eW A@'P+@Zbyz;L@8W/@p$lc'x+$#@\28+ġ@qoo[Ba0E,|Q@ (~:@O:4"6.R@G WK+@[{@q?5@U=@Q>z @}ˬ|mqoo[BamR\&@髆:@$@"C+R@|rĸEb@2[={vIS@@YkëYV w@`@lDyvKT@FIBqn/70Pʡ@EyHqm 7eR@.oG*l*oV ~@^&ހqa" @/wRH-f@wQ#z+~ @4f|Q ^~v@]7 w@g" }ɂh@ΐt+rCe@O@drb72@H*xpw7@^&ހ@xv<q$p@/tf@ D0CFk)\@@mS@pOFn|%䉜u@tCF*D@?@F8S]}Jkl@f`=S@!7#LLЄdt9oۦ]@aؒGF@Ãhlfmx*S@:>@V@&s~@/Zߨ@\1@ժt#貖įߡbWF@# 1@cR3mH:kr>@+Q?u'@&s~@Fyϐ@\1/Zߨ@Rɸ@Z @]}Jl@a@. oX v B8w@p1VPU @|YCm=˼7@zوf)+!@wZT?r$oW31B@g@\cЭa@Ku @T!؄@n|YC4@_X:@@<:-s,3 ykZW@2Q8S0 B;@#@uDK@72\cЭag@T!؄Ku @ݥFVʄ@m_XKpr@rJX@ O @>2b@TKS@y?s`@ ,Ɏ@Z3ρG7@0:[@[y@[69A`@l(@8}c@g_Y+-A9@b6{(]v@)ڸS@k@s@W#@gڲ@ +1weW'g@S) IB![oR[mNZ(JLmuN@)@ ꨼`C1-r@=u pe@>g0l+͟@D1&.|zcY@ ꨼Š#@1-r"d6A}@vOf@n _@(+>H@̚@h/>Rg~@{L{@Q%`:@fVjNm@eΐ@EnkUQkA@Dk@vdJl@`C1-rXK@SvOfA}@(+>Hn _@h/>Rg~̚@N%`:{L{@eΐgVjNm@ղ 3^Bz%jͧvdJlDk@1-r@"d6<89<@[>S@t0@R0=I@B` @w'~eO@sar; Ny*@ݖX͇@+Ԁuy'~e@B` @sar;e%{6@{@ځ>IGky$ }`aR@Z( Lt@ehj1V@? `!Z,@?A2αÔUS%f}@C( u @sbj\X@>9@F_i@"2k4ny@@2!p@D HԿ@?A2αޖ@܈q>|@Ob='+ӄakBV<@$/hjV@ڙ.&@K;e^ M"񩼻@ً@FE2ehTUp@dSXo@$&@Ov[ c@ÔU܈q>|@V͢a A:iI'-ɠp@ ^H^݅Y@}78@ߢLWbJA@Sdpx,j@56Wf@Vgt?@%hWv[ c$&@S%f}@Ob=':*{7A*Nw@W~h9`@X±1aj?ܻ@:hR@i&&!+g@M7tx7x [w@'4eM#ز@B@NڍF~r§t@o @<حi]F뮲@rN\qq@rhp@OolY@`0%w@eoS@Hz8h5My#5F첔@-@Ys?CHUsu@[k@rY@43sC@᤾a@CL>@mJ<9u9-F@Ys?J@@:Iq`@ @$bU@UÏ_@=@#n񣜼@&PsM@:C_@Ngϟ?~@Zas@ sco~:]@&^q;Q@Hk/ ҮWp@()}̡@@}:wq_Ԫ @zҜ@a+ӄakiI'-*Nw@$Abqp3wc@x ϵ@= җU5Rt@ q=UÏ_@&PsM#n񣜼@Pgϟ?~:C_@ sco~:]Zas@Vw%6E5ĭ@QYvn6@}:@@@$dTda@zҜ@BV<@ɠp@W~h9bqp !t9AXǯ23>@= җU@ϵ@*O¨Gl@>]w @қ@42fP}R86P@E@(1B(?D'Pf(v :v*2fP}R@қ@ qPZv#(1B(?p$B@@?@TPsBLfz@'@0 ;6 9@,6TPs@@?@VJļv@Dt7cP54\/,6}@J\{X8@GV@n3s@%C(F'@3m@AXL=ֵ#@on@V4mO޹@b@b"q@G5U[@xeN-@G5U[@xeN-@oLEAt AߩPo@SO׽@]-N$Ar;JU7@+3'+SA9@Xm W@4#@-6I(a@@ý fIW@x G'%Iʂ@`z8O@zfsxr;*~@#сe@7@ILxd@7@ILxd@J\{t AחS@L@aߗ@Fq@b@(B@,i 0@<@~З>~@$\@QזH[1"أ X̘7h+ eP@Qeʼn@z^s~V@z+6?Ua.@J yU+g@a_t@h0q@OזH[1@$\@/{f@z-7RjښIz^@Qeʼn@z+6s~V@J yU+g@^D[q@90[i@'mg{zXK$8-ӽ@JAOr? @DաO@ 9mD@8pI@ZXë(fU9sͿ@e |@B @xjr|a]]D@%>r׌9@ZXë(fNr@iH FD4AT@uhgo3 A\0C 4EB}~E@4A[!_$.O0. A\0C 4nU^A--~d:O@=yJ?AxhF? ([!!@'?;7!?e ]S't@X p0\[aNtB@J@;# fYV.9{pP@{vuL@GթoEY@_4~@ӿ,b'*5C_dNR|%NRp@]=Aag&w46WA@ ȣ?G?F?aGz@UM#*6?x0EXGx9>Bi!@m3s@_@uA@MC{4a$U/@?ZgP@J-'dGթoEY@`@\Կ,b?_4~@M oTo %NRp@xۖܶwwBybwCGK@ųk_,@PkC*)>@j߁$@xv'T]@}T6SgR@1ucAYM@YHuf1ucAYM@|'oN@1}Ej@u{)xLFߟV$l@x/B@xU0up@qL$hE@-tc@,-YEc9@H@,B?٭TUKfnB_@3,.@A7ck*g@]kIqh^ \e@;4q@ZG4G@M~'P@q5WCTkr@_Sځ@T(/?8jQ.@ǩF#@7[7ׅ@ri!3 7[7ׅ@ME@WLMz@foW/&>@*h{@Y?1A@B@W yc4@)2 @d_VY@)i@~h9l9Hl@A7ck*g@۞@ŮGx@U~#8C^@R . &iC@F<@^ݜ|@mk!7V@z fz]ٌ@|:2pb@JᏘ+IE@biE,X@;-buF@-6L)@7 X@LOM"Pv[ 7"@CA[[Ш|:2pbG"o @f|m;QAzc]@> k@8Ԗ{ntyeʞ@PGJV@e'rg9vJ@CA[A!H@&ޏ8ViKY@`@R+c1[ШyW@8[U3k@P%R+c1@a@|:2pb&ޏ88[UtB&@ ½W>11~描z@Ix @.@ǭƼQ9e jG@BDQ@ߢ4Q]MS@ׯ{+~@½Ix 描z@ǭƼQ@.@4j%Z@¤4ߢ4 @(yZ.SVubNP$5c{~iT@O$Rp)={Ii@&f-9C]M@T@d!zȴ\@u7@mT6Ts-o}6@F>QPOiў@(MM@9+05 @dAd0mTFO_@{侍@#NUf~@N _Vf@"C `p@>I{ Ѭ@9U u#ŧ@E<9}@ϒRc\X@tt7@kS N{@ Z ,@F5v@'t@F5v@'t@[$NU@{侍@M _Vff~@ңYln@8U u@{ Ѭ@E<9}$ŧ@? ͐@ݽrBkS@tt7@y*@ځ>IGk .Q@'tE5v@'tE5v@x]Dkk68@Qgw]@Ht=V@lJ@zqHB`@1daH@NsIi3 VC{Qgw]@r(9x@o%"&A@䋡4@PI@`D63@6 [Qp_t̴3@YVCIk?I3@7waJ{1@/;t@0p?z4@RueKOݖ?w2f5w@Kh|;i;~vth&t:|.LJ-]R#a@dKS3Ja@/;t@'m}"@鳞5K$a@t?e@lj~n<@ t@I?Pq@#Flpމ=ņ@)|av@szN0~=߆:*1'[@qXDH@ Cv0-)|av@*@t[̠[+0hjg)n@Ć:T@_:FAW`R1ӽ E2!ǖ>@H?@4SU@ S|@0bT>yGF=T@I&:@քz4Tld9kd="Sio82@Ơ@ S|@N@.d yL/5.b@d3S`l@|pˁRIKve@vHcl̋JR@gH,g/#7u@hԃ︼v6߫ s<@ N|LT+5@ep䮜=DRQEV@@GY̽@Bޑ@C>@DmEϖǻ8EpTGݐ@GY^fځ@@~$.2+n{qYxT X.xL &@t!}@ťXrĽ)߃YFښ{ī^Đ@NQ1NCOɣt!}@)ji@W9]T5sj\F6b`@&\I@ka|ui@D"L@ݨ`0p'0E,|Q@髆:@~f@h?c9I@7vV3@kS@szZ06@n&Oc3u`=s (~:@$@h?4#bf@֘Ws? y"A*ƭ@]E6tKcVؑ@Jn@cI~O@c-c@4-{>3z@@Ug֤Za4^wTgP]E6t@"A*ƭ@D`Xl@@ ۚH@c-c@~{!@zn,cg֤Z@@Բ؆>ۿYd@<]B@Zem⌭]F @XA e@ԞZerϦ@ۣL]yU,@P6YMD_@2b:Ad@w@U8[c/UP6ɫ*?@g3сW/g@l @yzۈ<-{V91xCptTI{8@94bIV@R@@w`N@ֈWGlOx ~ w g&= @kmGn@w`N@!IG@}{@[n]h@ӵ@Xhs@h@ﮂ?<2J˱e?th?)@Sh*XhsIl@PI@7 8j@cŖT@ﮂ?4 XY@k "k}yݑ(a1n@$Kkj(BÖùg@Z@L~΁Pg@yt@͚D{@0;2Nr@,JrȆťXrĽW9]Gc@Uzm@ލ:@gt'sq@?i5@ˊPXwy @+me@dY@)T5sUzm@6ѭ@v?\J~, fH@sf^^❨Q&@<=A?y,F@^6a fj;@FTqPX529v@xKXW,Gc8@LspSqa" @xv@#={R$" ;K t@^v@p@ 泈y@!ݑsHA&чK,@kN6Avl@.b QJa @`413GS<T>@5qMn [|p@Š F@Bۇp@E6;^$M[/@YRZJ`@āydhca@Ѭ >@24ѹ@yW_S@a M3t4-zR|h@3f@nW;@>z@;|Xjd@fDK@BL *̪J?:et@8pb9@\& @rR>@&>@yW_S24ѹ@3z@n,3f@4@pO,y@ԼDV@yRA@qU"'@JGoJ@o iɾ+A+@e@KE@FPW@8,O!@eKŀp^_=}@nW;@pO,y@oQ@ 6Xq8@*S+n@S Gh1@^TcAbJ=aG]@#"C@>Y$V@:Z#{h@U.jZ}@'V>z@ԼDV@ 6k3@ ac@}uJ@-rXSv@|/*Z@ +uRX `@םF;@<6V`@vy^5IyfP@`C\u?U} 2@]ӮvӇ@ wpU/.7@.Shw"yޤ@`C\`@{zt)e@ +3@V:8(J!,㆟ ؊b9@1Iki@@N+{@˩J: 8q@8=աAm@l(PA 5 ac@b6{N+{@@@Hd;J_zq@kܽU@_4~@\Կ,b?5Q @6@5w$ZtɣɏzeE_MO[@!A@ӿ,b_4~@6@sį@QF9@K}$Ƀ@@#.j@^C ufzFw #$qE@Y@לK@1j^m@G ;}S?0YÄABHU@@!9.N ь[ w߈J}$ɃQF9@ҷ(5j@_c债p(%T SK0@93p@Ltj|@]W%u@abdBHU@}b|@~ ô@X/7"iZ@-a+@y)c"^@H ߿W Xf@pRn_hA$}O3f@"l82@ҕx'[@AeaH{@#zP(@"'49WjHj(,uE@@c[6]A{@Iw}@xK8s@"e"D@g%wH ?y)c"^@(3!x;g @McB\#zP(AeaH{@TއwZJ22(PEU s@Iw}@ZLz@ tN}IWpܹmS@F8S]dT96AGT@gÝm1e32@KȌy1y5pOFn}Jkl@GT@Y4A/"I e@"+S4ǗsҬy!` "Q*"@n[ u#[@xnG@wtM@X@szN0t[̠[>N @mt@]FXgHnd@8sr@ `Y%5LSxKtgͲn@*"@vδ G@%j4@XwtM@~=+0hmt@ @X@~#,Br [r@h([T@)kx.z$:X]FX@j5;X@p]$?1X@0cX~#,Bp]$? jP@8Xb 61/g}mn@"%'X@maϫ]@R>cWD@lY`Α@GR^@EKt@q%@Ąi`@>H@?ZfԎO#>-x:Dw@)@OA@uu2j%4D'\֪ {wm⌭ۣL]g1O@O@/g6}ؙC@4 E+@GR^lY`Α@>@9Dm@qh:F@Zrz)0@:IpD>ᚨ)@OA?-x:Dw@%4D'\+ 2DAN\R y~iҲ]F @yO@1(Fj@}ؙ@qZh@#T!4'L+Y2@|V@ H@hF@ < =G'~@+SUg@^pJ@D.@a9c]@rf=UnxyY@MA$VC@GLb@ &ŨL@,#x?$e9[V';Da7ԃ@o@@2@ <n@4ua@ns^J@1@'eq@s&xY9@``NPD@ςpcfLVfhH߉gmQlE,0k@\.J[P&Ue@ςpc<7tT]@Y@{?D_'fDɟ0k@:(HU'GM@= e@PZ̚W&@xx$/h ^H`@3wc@Xǯ}KA//7gԬ@:p'w e@NA(u"je@pz(z @peHӬ@jV@^݅Y@X±x 23>@//?$AG0u2A'FO;jWe@"\\~'@zFWI?I!@FC06]U1@GCtB0p?z4@鳞5KHqU@n6Ee|$ʧB92a35V@J [~E5g@UGO?ڑlT@B 46)L@TFݬinX@RueK$a@n6E\Lf@֡^V[[X@*%+l{JKGqX@tڧ@,X&,l@>WUUUUX$_vdff^AxA;u[WUUUUX$qq dff^A233*;u[OdEA A*ox8 @g'V@6@nw@fn%y0][)u@#@hh|8D?;W̐@?Aurxv%q@Cy@twb@QDUT?@Nf@*o@ AvVJR@vޢd'@fn%@6@nw@ ϐnu].9hh|8D@#@#45ýa@['#"GFCy@,.@QDU?uwb@G`pf@Dwy8@όHaX"B>azX̯e AsK@ 1ӷ/`lzSB@u@-bQZi~Egh}- 7ld?: }w@hARϺ}{j +-M @1H?{X@6<6Q@PΩQ@@sK@`4ϽAcv4W\?#y@T@ L"ST UM@"pN@?U@Jƅ@P@-0@dmoP}@dkZO@k@i!dH c<@Lt@TfF@;8=W?G~z@]r@+J`@w]WߩPo@L@ӕߊ@ 1ӷcv4"ϲB[A=aH8X@LT@{ ʁ@J&φ@a҈gk@E|~?7l@CڄLRL$ЙF@T)!Xi!d@k@G8=W@TfF@A @ ٦6T@w]W@+J`@SO׽@aߗ@X @N<W\?=aj5A 9z@v9]w@Wɪ@_@fh3G)U@G@ )s@7@cT-oL]t @X)(ƾ(X7A@eAu5aK~wmL@g1#TE@ArYC;4ro8>@umF@-K@RF_ @]f7+?ҭHI@S@*cS~*H-'brF@vjjT=6 r@!((@T\HF@Y)=m5hRS@Y=`1X܁XO@  qŶR@umF@-K@f% @<"s7d5U@x BI@q}^S|H@(<8T@@t$(qΓqB1}@_@!;ÄJ8\@,n@0X@lC@ZP@Z˟K@SC@hr)-[?(<8TS|H@t$(q@@H;F(!;ÄJ@_@,n8\@lC0X@Z˟KZP@hr)-[?+E}@\o==U+vXj@[Vs*@ّ,h@vۛaL'g@i*v+zD@􌭡R2'Cj@bj[cEO+hvۛaN@i*v+@L'g@ER `@XvJxhcz=e@yeM@``Yh@`qeAR@ Ƽ%`lE@^X/@BjE[@/ @12^@l]Nk@̗.n{jwa,P@6@mŸR@;@EHbeew5mӟ@vWqZ@/ @)@R]#k@(D]jT@܂xp͙~@c"L{c@ c[oDA{@k763Nx@ZR_;/m!@j A:62t%@̂<wU иE4o @0i1u7%@wƩ;Խv]3@~߷R0n4@`˒CN wp@՞rl~DUl@ K"x@dz1@Pӻ);)S(:W}h@gW-3$o@Nzj#ݹw@=zuXBO@ R,W|-['7n@ҍeq@`*Y:W4@ŌsC@#'{?@$>r_p#@yUu@V[ >@6Cr@R+&t%Ie@|7Z@nyEWӐ@au@")@(]v@D@J7%?aX@KV@t{M@q3/t@ e r@'1|@ Vhwv3B3v@t@R@'Aq@O@~pQ@4S*Pϳ#{Ƕ@1m@S@~߀v@)ڸS@J7d;@C@w[ y@$Pb@Ʌ@˶v2ɿbï@Trr?bï@Trr?7=1|Z@XDzX{s r$#vV/h@N]$οerV\P@qXŸ@oI)r@. w;ɿ)59i@!ۥ ˿7D*r@O{տ0 +rG rr㿟bï@rr㿟bï@DzX{?7=1|Z@'% N]$?#vV/h@qXŸ@,~MI@ w;?oI)r@ ۥ ?)59i@O{?7D*r@X;O['K_N`t@߳X62 bbP@cAVՎB@J0 \[Ju֍@ݠ@;h VՎB@B A%g Stx.d yȐSs@ o@ @TgÀQ@aM-@?<d@2clP@yL=@"w@^隞QZFQ@IிǕ?@nW\RnܧK@rg"nurD@tѨ@T5@~32+s+(@ܹ3!eU)B؈@Q\F@5^ 5@#"sv@yKYլ9~ia5?r@JJT@ac0T=@Gs!%{V@UzѸ@K";/q :@ {KfS7(e/UtW@I^@ l<PI^@ l<P9`6&@QYqU^>@x@隞QZ#"sv@MGO@Ғc7sEK.!@ec,TF-̭@@D1/ POMY@ POMY@O3ZceȈ@ҺqԲlY@Z%yn@@_@FQ@yKYҒc@6cGg@|P] ٍ{ų@ފsn23fkᴛI.TjTˇ@œIBz]_KƝC_P@K͂vw3brKqh@ndPm@RH@/0}@CNGwoK͂vw@ƝC_P@g;(*LnIN}mdPmh@/0}@NqzqB@`:wuqRn@dlo W@ݑi[j:SPVM;RT`ZYdlo W@da@:GP.S gMC)EDZ@B3^@lզ& A*Bvj^᠉0ƵS@7@hƷ@Ns@j֧ @@垴g#A2;LC@+9 MC BxaZB@#a=@Yd*cAVxr8@ކQ@ +@Y ĒՏe @3 @ah!W@W#@t{M@$Pb@In AZ)}@h“GA>+ XB AXYd@1FXNz aAH-q"@n@U6$ =A(?V@K uy@[ Ē@ +@WV_@&e@bIY@gڲ@q3/t@Ʌ@e _@>@>+ ;F_;5MAVey}+he@@ *T@p6l0:R~K3 @8EB8GLz@ +8 >'@'qoDDo"@pFA~%y@dWCRF_ @<"s7(Y'AG(͔@%z@w(L'M4i@E1bĬ@!2p34WO=|*}/V@fBA8D'U@,E ھb@ M* A lv^@r/f鳽a@]f7d5U@G(͔@lOATWT@}**u_Q@w7iP$נ| 02B@C( uڙ.&@1ajWS!9@J=Jѝka Nݼ@Q9D@LQ]e@pT @K;e?ܻ@J=Jѝ+=So@7]@5ɔ@@qgHnd@r [r@+?ҭx BI@Wʔ@FPgVژ@@uAZFn"@_,rIT8sr@h([T@HI@q}^FPgVRa@b)*@"@ ȯ! vN#'@E7P20@q?vjYTHl @][/ o†%$@{@ F$1q?vjYT@E7P20@ Aq;l@|%f`=S@gÝm1/"I e@RmZL.AHb or@a W@䉜u@!7#Le32@"+S4Hb ny5AD@wfNBu@c\Gmj}w) %>A@Y[@w>k )7)AkZ |iE:@ zO@Qh vf@D@U@[<&A;s^8Y@@#r[yx@kZ $5Aۜr좣rHotl@֔\SJݧ@4Pq@-ba@o3<ʼtz@{@%`\Jr7@g(g c@ Nw@26b@>~@Un&@l Ua@L Uw_-q@} U S@o@, h [J@MցJQ_$xLu@ [@Oj@|&M@E_f5b@Q#K@Un&@^@>v>:Y@^)(@@F@M-@xr;7J@Gr &@ÛĒҖfHts@8UB\@;|Xjd@yRA@Xq8@ ac@q.Jh@*[5@T iGUd@]l.@@cOP1@Թm@4%ͩfnE\@ޜy D@fDK@qU"'@*S+n@}uJ@*[5@GLl@ "W)JG1,_{p!>.@G:cbqEqS@mx@ 54M1o> :U1w$;Tc(H@M]vS@:x 54r7-)b}z@fGt@oF5Kjww@&!_Ÿ?Ha'tKT=r`Di@'s("e1| 8@2|hNGv>}⍗@,c;<,@!_ŸKjww@uM{@Ba]3t}@'s("e*L35@TA =CHuX@9[v@" ɯl(?=P8.r@CMzR@1yzLs1$2Pki31CMzR@Bs1%"D@R2?#` ]07P(ŀE@<:FXCpJp~;AO\@yrGFY<:F@@@ E<߯Л0O\@Wc@zeʚte@K6aߧDK@?NA|t벥C#$@l h`d@Ht=V@o%"&A@e|$ʧB֡^V[[X@błp@K{~j]+]B@`-@'UWrP@ 74@8a *ɣUr 9F;flJ@䋡4@92a35V@*%+lK{~jVip@;j6@Gu5Us!@i K@R2[b7#Tɐ@9sX@~0C@tXb@T=:L@`WN\[9k@ =G'~@4ua@e@\h3dˉg @%|LC!q@D'b7w@<А@#ceC@+U*:-@ L@Uiu5@ Gyɱm@+SUg@ns^J@\h3dˉOߢ @o@@Z@UtY@s>6u@&Ѣ@p@bDw4zoWlRg@*ʿ@hzJ@,%JT@1<~BȂ@͐ٴ3O@McstB*ʿ@UN0@Yc9#-CLk &@~6zit5>/,󭀽-EoJn{6@t|F!@:D1J5,AWp@QucQ n@zO[R@abau@|ߵJ=ΊNK@$@@@*16@0Zd6@I9R0%K0,J@!!6@Qux^@VCۦ$w@|7%jIz.@>Xh%@M׆D$Au~ ? @ sV@3xqO@fmcทr"Bgѳ=c@HUlJ$vى;Xh%z.@u~ @M׆D$A sV? @fmcs@fmc@AŤKOkY@59<@m'GXY@*D@m?Sy@<[LI"nyvxQbV<@!{Q @*D@?L@+Gla@!gm@7_/rHcu@C2"@F`^$kSDW8?0*]#dY !\@rk1J@.8_/?!gm@C2"@k@*5_/Im-KD4q~Sc>3@?rA]JK-a@D)Q'@-CYV D nn@29G?/n@*O6aF`^$_p@] UB,@ppQ:3uS@/AQ/sb@MꟹOtNzԣL͞JK-a@Uy¹S U?@t9GͿ D nn@*O6a@/n@] , F@qpQ:3@UB,@.AQ/@uS@S U@DupD1}@(F0@G xMC?"Ra@kS*5_/3W8@ڗ7b THgEMSS-Hj@ra@UנNDW8?Im-ڗ7b TdU@_@8%!SjL'g@i*v+@0*]KD3Jî@4`@c |ti*v+L'g@#dY4q~4`@0PP@nj>su@o e`@nܙ Hdp<P@xX0l`@KFA!P'k[@MZNF@Eu0@e7d_@+ejSG@o e`@hI@Yhpr2(xX0l`@c>b@cUZў3UtwBp/E@Aӛ1@Km@ %+G@=#u092@u(R@:K7dVI Gf@yſUO&@m|FnO7*Ւu@՚|v4t ]ׁ@~pO@ g%:/ؗ@U*Kmc{u@2?VI Gf@n|Fn@UO&@'.WdvWBTW"皒@pXG@/Zߨ@\1^pJ@1@g @o@r]|@[KpAy @TEUi@@?hS@ r@5Fl\@<ؠh$ @\1@/Zߨ@D.@'eq@%|LC!q@@Z@[K2/@~1ip+=\v@5zs=g?k\'@0PZPv̱I59Z@"в%0u@G0@nbַĤ_qhU~#8C^@xK8s@&QDc~Op@j!@Jn3K6@e@Dvp&@x!6yW@L'j@fEv{ z@G @꛹&jNt@e~@Qrn'@`FX@WhC@9.Nô@L Uw>:Y@xKl@jv@@_>wq@N>y]^9EZx 7|@cMl*yʼ@7a4$lRBqwI^@Z}bl@xNOb-0"@ 8|@irW@ko=q$xZc@AW@Þm1i<2J˱k "k}mݧ@ ,@;pß#9W%n~dh @e?thyݑE6;^.@ ,@SԚ,@"'W{Sb)@Y:sLQ@)h V@Iaɼ=@*q;lWG%@P}Y,f#˃@%Aa@P`Tw }aw} @Z`@:@@r?)@(a1n@$Mpj@;pß"'Wh@ 6#X}Q@=헬@6Z!l@`3#qfE@>PAOX=̡he@gP@Z&m@LAB<:-sJX@[/@Y7m{Sb 6#R).@Bx%Q@$B:񏇪'@:Jj̟`b#H;@|6$@2vEk0<@#v0i05@ڌ 1&2JLC5M@'*5M oT@~S@$B:@Bx%Q@:Jj@񏇪'@|6$@̟`b#H;@2vE@@#v@k0<@ڌ @0i05@AMtU C_dNRo ~S@Iz7T@ W@U &ܦp@>RĂ{fY@yeC\|@ R6a )=M8H?4[@@xZ#©@_ H-f@/II.]N@mȁi]L@]2Qã+W6=@\P@gqC4r@JӢ44nװ@ާG|c*0@YrLJ13n%@*^ )[1Ү@wQ#ztf@!LaMC@]_4@k]0<@ŏ)UU- uAƷӞ@gux@c)Eg)s p;vUhpU>p@Y,Bڿ|tgux@x?T5@ X`5s)Mf+af@ɦP@w]QmaƘ">G?ܐ@ؙK[z@tw,l@e0J@Nч>w@ TA@?.Z@q]D@z"ܸ^2@aLk5H) s?wV3@^.%Q@]9@5(B̷{0s y@' Zd@WU@N4@ TA@@6rs@# )D@\c)/@z}EnHTr^_@qb7L J3@еԮ@`os EPC@]@Yn$0k\@47@&?$R¾@3;@|+v4@~@,\Z[L@bppQ:3UB,@f$~EX(#Aw_A@G%$k!n?J%@tR6@*Uv@@Z@S@ 憎@: @c@ ڥYW ^ nQiYFA L)_j+@)_j+]C)Wų@+~é׋3(@p@AK@cG@-[uΝ;)Aq/ܔH6@6v2e]@kVڠF]AHe3ĔrA|%NRp@YMD_@g3сp`U@Ɋ7حCѫ@%NRp@xۖ2b:AW/g@Ɋq #@,ԝ@?ba]=Aagܶww{o@S\@"cvw@$EzBF#YyM&wBybwC"cvw@kF @ "YyMTmWBd@l @7,ԝ@ҳj@9浳Jlxj@Y`Sw@yzۈحCѫ@?ba9浳O@A<,% v.Ű@4g_Q@\@1.z}.?u1ܠ廁@H6@@1?4g_Q@x<]H6@gVӡ@=2@!L^qV^9^@olJxd?2D揠@^؊JǾ@$tzO@9@w%YȨ@q1lb@?;8`@L^q?=2@olJx@V^9^@}^.$wa@pxJԏaY@u棋&@w%YȨ@z @Z_a@ݝq6@D*i@Q;kIɹu.7ySh*$Kkja{4C@_4@O;k@D*i@TJaGXhs(BÖ_4@ޞA@a^ tw@eQ@ :'s@S)(4)@Xz7@*3|iEۜf[BAHŃkPr_#_<4lh@an:@&lJ@,'<ݧ(g>YoV@:@r좣HŃ]A ls,}a?9@b6bo@qUVkɿ@j^7 J7.V}6@.TuUV?b6bo@j^7J!n6@d.gx7.F@\:@4TL@Jc@@dQ`@ ([@[#f@kLM@wFb :lUݑi[:GPRNxR}@UFO@c)Eg X`5s J7d.1 (@^~u@ls]q*&D@֬b4Z@ ;@GSҵ/@ ^@@C{2@rM@5yOV3@uFUV֫Gj:SP.S gMC)s)Mf.gx7^~u@T(B@qR@I$bR@rqE^"@Vo'W@fEDA5A0#v@<)#"cǻŹ@i&{hc@58/gBtwb@QDU?y}xn@,N$nvltd|@{1ύJ@b@LZCzйs@XY\@A{V@_x|#b@.V_ W@X5~#@xGJ W@;!)@5A@fEDA<)#@/#v@3W{i@58/gB@i&{hc@QDUuwb@C@@@!vtMCs]q{1ύJ@@7@дUZ@\Wx{}p=kX`@%.@D<Ǟb@N94@evfKqR@fIs\DŽP1| 8@TA =C}(]@ 8>obzjɡ{@+?ڀ_c%dg{?FyJU@j)2@0*Arg1bЅ@)5ie@2|hNHuX@ 8f" ^@",Gq@#e}3$~M4 1%T@@`@\=@s!6c@;>@84o@Ċ@P^y%ATJ@)9|\D/}ZG@!W;h7D $0_P+hꈕ@h. Y&@{K@ ft嵰`vQ߃@7@VJs9 Q%\J5X@gcA@s\E79?U_@ϼ )_j+@)_j+@;v@J6v@Հ+y:!sۋ@t"W( .氚6s!6c\=@84o;>@G^y%@Ċ@9)>F?q@!W;h@ZG@KYt {xDk. Y&+hꈕ@W@9@YJ!VJs9 Q@7@d +\X1SVt\E79@gcA@ϼ @?U_@)_j+)_j+@J6v@G @+y:!@ %t"W@sۋ@2TX+]k0x݌od [{fD@Fѐz@a@g7)]T3@'uY%@4@ Q@Z}jJ@YTJx@S܅][VӰ@Հ+y:!@BAUH1G2۸o}%[oI@͓1H@lFK%@~8 )J8@{茈`@w!@'ZOԍA@TBջ30* @C)Wų@vw+y:! %UH,G!A4%@@㭘@ =@ݠ@Z]PUDtEA밻r@:cV~@0j\1[Hò/:v@!7P@pGMl@fO-l@ڂ@ @v:"/y@Ziu@roށ@F="Tw:"/y ь[X!6yW@jv@Q@,O@v ;@%q4|@wztSؠ@ Rʹf@٬}j35UpI!@d&a@D<\\0\YDwq@i Oʉ@Կ&2fP@+]|2@3&4q@Y}-K-z@b3:z?M@R+@cp@:4բ-zh w߈/7L'j@@,O@w@4 Zx WA@"҉H?23r@ 9 z@y ftP2xmHz'+c;@T|;@pFR"@/ߴq@":8bl@\,YGYX:@p%]@O:"C+R@/]@V}p@m?Sy+G<|vd@ :dݝQzBR{AF_ә{@0w}G@cn`)"҉HWA@1Nw@i9%/YP@4ݶPiM ͢VO,K!8y4"6.R"|g@/ߴq"@\,YG@":8bl@p%]YX:@4"6.R@|V}p/]@@\+$@bT!\a@zj,s_@'I;{XX Nf@Dwy8@BR{suy;lt@XT@Y\C@Crkq[5-`@TkIBC@%L@g8bV(@m |\@l1]@@<2p@ZP.@pQ4 @f;?YUݒ{bJB@oIrq%@v/@ @ܻ̬?@F?/1h"@ZP.@ DE@OLr@;=pp@3h@^:Rfu+@^cS@ >#0Ml2K}@8'x@sۋ@t"W@pQL:?O*U@?@HFBLZrOLr>DE@3h;=pp@ҫiVȶ{̷V]cSu+@??St r@&Юj[@t"Wsۋ@4 @ 3CJW?@RϺ@BLZr@Bh^@|*s(GKDy?@9: @%m@( 2TX+]kHFBLZr@&b&@h1 {a@jqUvc:@zۃB@W䞼0@.氚60x݌BLZrBh1 {a@a'J-o@l@ŏqT8@_+C~QܯQ@0R;T@cg֤Z@BL JGoJ@+@m߸v@-@g@]-N$AFq@H8X@ 9z@#A~~8ilAB/(@zD@~ȋp@y Ϡ GYCJ8\FAb(lt@8B섈7@rt/@r;JU7@b@LT@v9]w@~~8-g~/#Ar@`;@{0Ƅ@*鯅Q@iيci4Pa@bϨcA@S2?#@fLVfY@{?1yzLR2?#b@дUZ@@-ll~i8+Om|z&e`@vhH߉ӷn4[e@N ]P@CV]5/@(T[@kǐ@w\1S b@QMa@q\;$y#@vd1@hH߉D_'fs1$` ]07-ll~il˒@gH߉?&e`@GjbP@gY;9@򼡻&{iy;wњ@ mq@;wњ@ mq@W3Zj@;G z@K@n)i\@.i>ܻ6@UeRe7lNx@ 0X;ʿoI)r@ w;?ܑb~@x14P@*&D@\Wx{}8+Oezwwu@%@3my@.^¿¨,#ȿ#aSdy˴҂@kGѿ]@_ws8Trmq;wњ@mq;wњ@;G ?X3Zj@=no~j[@|/ -@rS%eg:@|0X;?7lNx@. w;ɿoI)r@H4P@\݀&/!@֬b4Z@LZp=kXm|z%@4tp<@.^?3my@uwrfXS g{.ZfckG?˴҂@@?6a`@_bڵ~l+WCY:eG@׊"+@o&&U@ow@,s0c@X|@TN_9\ PKa@l(ӂ. `@³`@~ ('El)q@klKp@-_#`@~t 5@ǐ@B}@1ǘ]]q%`@NQMb+@G>vh@"a 9@B}~T@l(ӂ. `@x/ɠ@&``@`_t@ϵs@dG&E@p Q@Ɉ0z@<RG;"@b/)@a%@<ڋt@6V@JxoomVoH!@뵭7lHTL4@< L?.Z@# )D@:S@a ``6WgˎF>}@b`OJ{{@/d@)&MzǤ@{f_@a@~`@T"~mvoe@F.l6>ʝ-M@VL-2Kl3b@q]D@\c)/@a `` @Z x@ 4LJ4d@ҾxH@itjRJJT@6cE7P20@q?vjYT@"{e@\f@~wq@--j=փ|Z4kl@nܧK@acGg@q?vjYTE7P20@ѫJv@Ujq~wOq@A\rv9yV@":]-q@KZrg"nu0T=@|P]D~a@$oq@A\rvDQ/@~V2¶joM]ߌI@rD@Gs!% ٍ{ų@c"p2u,@--j=փ9yV@~V2q@/ WtѨ@{V@*&$o@¶j/6ן@|T5@UzѸ@0G0u@vɆ W|P_1@A.0m@̵ZUKxъF@1z,@z@{zgPA!m@)%@J.@39З]$NG8n'@Bʓ@KX-rJJ@hEg{zg@z@5%PA!m@39Зc\s@t(@ӡ?gzk@X9)7@ i q@\{<@:+~f@2KcUZz"ܸ^2@z}EnHWl@!@l@{OI$8+!cmvVo2 c+Mk3٩? *U@X9)7gzk@\{< i q@2?:+~f@FA!Pў3UtwaLk5HTr^_@!@l@1Cs@bCM!U) hzJf]@BC֮JgV&nAJ@Y1LQHd_Nӵk@/daC@ӵk@/daC@DX%f>2<Վb@ks֕?dj}Fq@oĤ)59i@ ۥ ?'k[@Bp/E@3my@.^?{ObCM!U4h^0@!?@L;P@aA9@ 0Yg@@msQ@ԏAz@C մHm[ Mг/daCӵk@/daCӵk@];@$y ks֕Վb@!pĤ?dj}Fq@!ۥ ˿)59i@.^¿3my@I) hz!?@EB@B մ?ԏAz@*a$23d@4DS@3Γdp@&"t@ \;J@Ƀ}$@O @Rױfzj@V[s@#6I@t0@[>S@Gv>}⍗9[v@>ob",Gq@J`@Dʮ <@xdi3Γdp4DS@ \;J&"t@, Ƀ}$@u@{@PGڴ#6IV[s@[>St0@@" ɯzjɡ{@#e}3Dʮݡw)@񊝝u oys_`@MZNF@Aӛ1@$8+!cmJf]@L;P@My@9T{ef:3GR@b[<@iR]`@>Ww4Eu0@Km@vVo2BC֮JgaA9@9T{ef/H@8i{<@o a%@9P@zqHB`@PI@Oݖ?t?e@J [{JKGqX@]+]B@;j6@ӷn4[e@GjbP@Qa@3k(po`B|@_j]@5F@&GV@YsIDWzc@1*Є1daH@`D63@w2f5w@l~E5g@tڧ@,X`-@Gu5Us!@N ]P@gY;9@3k߹@Y+4ee@a7YV@_4t9in-v@RkCCzйs@`@CV]5/@¨uwrχJ@]F&V@rO@'?2f@\][@ZSfىW@쪏j#@qoj.F~@8(H>)a9AsTj@&TTzuj@Kh|;ij~n<@U&,l@XY\@%.@(T[@,#ȿ#fXS(po`B|@Y+4]F&V@4^N@5Sc@p4@&eQk8ߒ@[Q@0Z&(g`@l"r8e8'b^&v;4@]te@g@ (AdٕQ`V@N`䈼@KBM4cK֥@h6qh@Ѭ @Ӂ{Dq@;y+mn+>} y@3b;@lc%28[~ ]te%v;4@ayNQԟ.$E @N`䈼@Bk@kc\g0-U@eb@?hk@q`@$.܌r\@g(1@ aUN;["ہ@' F5v@'t,}4!@ѧ@5p#@\=(Zl?%e@-U@Dhkb@#.܌@q`@h(1r\@NZj' @["ہ@'t@E5v@ѧ@X+@\=4p#@Q版v@'W{-U@eb@?hk@q`@$.܌r\@g(1@ RI%' @["ہ@'t@E5v@xNOW@\=4p#@Nh@t=@:Mq3@tWM]~]7gԬ@G0uק%AuX VQk<@" ]@,S@$3)MGrxtJ:p'w2AuX V\bY4A)MGr@ p@E zZ@Kr45 Z&=To`j@8{AҠhE zZKr4@IONSa$ K9\ :s@"83%Ҡhg;H%A%=j7@#zXLHb i@t!`@_=@-'%ݍ@#,`߈@ iU@=Qn@|ג@6Wsc@txm2@ho|@o!{+L<Αc.@³`@&``@6WgZ x@\t@RчWf;,t8@pqy]@azs@p@;aMTjb@5(@[Ӛﺦu@h3!@7*G>` @*{è@S@@s@r߄ˎF>}@ 4LJRчgA{ /@Ϫ]E4Y@ˋ*#VB+'vT0Y={+!j"+#=@W2.P"+#=@W2.Pn'@Q[X*VE@mP@%@-HcMmdHqeg@I#f:@.!@ᴛI.Tq1lb@Z_a@~ `_Wfz -@ Ĵ@ǟtmWbp@<:,Wa@Ӥo z[X*% @q+v4 ̴M/ރ.Px~9@M/ރ.Px~9@Ȥ%[?_["@Ua3Y@M`j%@JWH>@-Hc@%@+А\r-)QS)֨Z=6q@A#f:reg@ec,TjTˇ@O*pk 5@?;8`@ݝq6@('Et@b`O4d@;,t8@Ϫ Ĵ@wa@EOcH6/v+}@]P'y\@3![@+@܆H/+@2(j$!>_@1l$Aێ@Z+3![@2(j$YC@{M{@ok4` |@[.>@qQX=@v'Dm}@7#_' @58 zO@rHos@0@a\:έG0E@FP(x@n{ #]+@`9@Ļ@[Lgզ$ƿ@Qh o6dq\@|IjܭSt@"%X (c@cQ;U@$h9@Szmq@hɽ(E?uS@.AQ/@J%@k!n?;ŶO*@!gln@5zNaj!_]@4?(5b@`v?}* m@B_l?V!Rh@ycI>6@O@|Ijܭ?dq\@"%X@St@cQ@ (c@$h9;U@ɽ(E˿Szmq@/AQ/uS@k!nJ%@!gln@ Vnd@_8@^U%f,@D@D$@UMaBPDFJZ 8qS Gh1@-rXSgAG@DY@r@~hP`b+`@fh||ɿ m6 |@5n9@M@o97!&eGIsYLBJ݉@P br'T@05F?G#=$ر]?٭J@mɕH@Z@Jv q@q.@* @49L@?{0r@ FcQ: |c+@(mɕH@2 @Jv qZ@* q.@?{0r49L@ܥ@Z_@T**@i\@@ʨ'@7<ףd]-CYEpv|@Z@Jv qՁQ@Es@ݠVJ@8Tohlmf@XU[)ni,3zג~D,hwMn] uJv q@Z@Es@ u׀@7Tohl@ݠVJ@XU[)ni@mf@~)d_p5~)d@DN5@DN5y`n eWDN5@ܥmЅ>W@gԱhUUI@kSyy@[]7Վq.@* ݠVJ@7Tohl@A^D[@ܡe@,B@}L_5` i?"@ %Z@ї^gƚм,Z/@i+oz@ϴo)!@Rez+@zq?@ +pkTԱqk0$@:B,2@<=Q&[I@*8@9@XCg- z/Fba8pu AR.w2[9 @XA28 px%* @q.@8TohlݠVJ@ܡe@ܺ7@~L_5`@,B@R<r#Cm$ q@MdT@ Mo)!i+oz@!{@Vsb@,4ȮV Aq*xp>~b@_W̃CE qUsFx@zP1ע='@@eN2fg#Fg@e:C-<@e%9k Ib@ӵmPkuM?eN2fZ~Yd@c:C-т.̜@sc`0k@bu@ͣfd@.|c>%% Z@t2c@{j@@%lAHF@# @›@FFOu%.AE[Sk@ <7B@,Z/@ MX\$C*`@+91@Aʖ$*$6gAol@flV[p@l&B@ē\ce@\xG@H:@.WuIglyoV@N_+PҋrT@85@76@qO>N$DE@1U$nkɧ@[@Q^ph#&z-i3x@6k;^d9LaB TbTJ|@~M!MS@N·$@?CBa-g0%۴R`ŀ0@ yf5@G)bw@L_ a@[@ .ƦD@*dKa@ɘnU6k?i3x@׿Ine%"$Hs׎y@.F/Q@dB_Ia@f^ax^:x؍@(S_WD3@דt@gD_@SSAșӾ&A+?e @ZZ@OOŠ@}$0ۡ@E)@9}pR7  'șӾ&AO~FA:Էq$mR )X?@io!n@aH]@0&xgFn@b歹&<Eb*@|4nOm<@q<'Y)Ts_oOų@c XK`@|4nO0>w@s<'Y@n<@e@5W@ja+i30@An}i+oz@o)!- V@=^tm@E-qҡ|8h9?r@ƖV wܔbX@u\@ϴo)!@i+oz@sm@:Q @E,ƖV w,&t@u\ܔbX@EBǦ=@ܱ@3$$vʹ$^/S|@ӝR\bN@ܱ@239\@)ڳB"b@I=5@Rez+@!{@+?:m<@s<'Y@9iO@RY읬@,֯>!к)tM\~@Yڴ@zq?@Vsb@e @Էq$mq<'Yn<@RY읬@$@vrCͯbG4R|qfYڴM\~@yX*@BB(o~ 730}uD@ Nh@ +EAaZ@4d=L7r@N4mپw@flV[Hb8҂d@`p3//vӞL@?B<tZ@(BViq@dI2@T='jagu @ a3@pC)x@1, @D@p@ZZ@R )X?@,vrC(t }@e_~@5X@ vZT@7k@`lɃ@_y@Vݏqz@v[%@khb@kTԱޡUM@3 ^YQ@ q@l&B@OOŠ@io!n@֯>!ͯbe_~@׈_@LJy@9<-c@lus@D\dU@uz@x_rL@h@ē\ce@Q^p*dKaYoي@ t*T1|8@z"@p  ` o&h@oe@b&e@\xG@h#&z-@ɘn t*T>r4Ñ@@E@7!ء@kO`Ss MوJJ@$biG@nκg8,L@^qk0$@1iySc|]@ g j5>тH:@i3x@U6k?{ &@`p3/AC@Yɞ?WA㣔 N5@6TphSaA,=@PYZj;n;@8߱fj4@p\%j)T|@:B-xq@B,vz@.̜@.WuIg6k⿨i3x@-CX?//vӞL@Yɞ?:@6k?*קtn]iSj}AP@q@.ICZ&!@ԡ;hYsg @WD>@%JJR\&@4*{PS'au@}o+ra$WseJ@:L໌[i<<@i.@1kWȐp 'X@Zx@D3,n@}o>s|إ<@ xk@ hO͒Nd@IB2,<@( s/Lgʍu@76@c X+i30@wEo%@(N$K`@An}4F]Sϸq@PYZj&!@Vo!:J@P#UxM_`# @׆q@rSl@4;}xaͭ@ējFP%a@<qrrxv@y>6 |@- zpZ95@\DZ7j@Y1_q@w7t2c@DE@b`~$@>B_y@uz@;n;@ԡ;hYuI@vDVga@5h)p@;mQ@4;})B V@Rb+@G!Ao},:%g9 t@Ku@5n9@M@/Fb`o&|@i[{8i@f2;@`,B9j@{j@@1U$oReSViq@Vݏqz@x_rL@8߱fjsg @/:xE@x/_@k} A@XOG~xaͭ@Rb+@LYc@@I~Г@THO %J6SaI~Г@l @ F\m*x,ԛkt:΃a-gf^a o&h@وJJ@uug@g%Q@!$BjqSl65X@Z/X&@>$FT ;AF2H\ä~v0%۴R`x^:oe@$biG@7 e@L ]O@)SQOhVZ/X&@Y[@moW,Ɂv/zP*Ep?Λ@Cr/sG+?__yd@५[/@lw&v@&?Am~wLQ@PmkՉ?zyc@#o `坿d!>|v|@Z_@%lAŀ0@x؍@U&@ O` &<@?ʯgTUBu@.m^L@>$FTmoW,u@ _p@i/E/q@GHY@ oͬ@*J44@ԡv_pNL4\\Um0@K?&?@kw&v@fmkՉѿBm~wLQ@"o @{yc@OC@ zѴ@z C/ܩ]4@$$vʹ)ڳ zѴ@^f@"h$@jmG)bw@דt@]CQBs'S3@,FesBOTH F\mHv/zi/E/q@J}/@Z# @$[9}@QB@ɓkoj@L_ a@gD_@!*F@(^sBO9qm7O *x\ä~vP*EpGHY@kђ@$[9}@n@XCr@Hl=S@48C%Fx@/Ggf@ ԗ{@"*N+6TѦOv@pdX_@Fx@zP1עA$H@0HGb@Dt+~HtpdX_@䠔3@}@o93H@$^/S|@B"b@{j]kPSdI2@Z$٥q-և%,ԛk oͬ@DeBfX@z C"h$@QB@XCr@]I@ؓs\.p,`bF$@ԝ\y?ӝR\bN@I=5@dI2@T='jaq-ևjJ6Sat:΃*J44@.`Ɯ@/ܩ]4@jmɓkoj@Hl=S@ؓs\俭@<wh==M4c 9pEq^Wb@A/,@x䂐@i\@# @ԡv^du.p'ee%bB@p1@"rB@ @R> ?P6@έ?cc@F(@Onb ?f0kj4@NIC'n9ä@Y@d5C`Hp@m@;^kV4Z@B+ ńw%;)Ƥ|Gk@4gI!b @ބrrilr@.j@@/@UQxD@i 3@ UO`l Gg<]wD@wAV:@ L;^kzh#@H?l&,y?@lU@5JwjR:Gb@.(<ZI"͡@n֕/@&k@Zy!j 3@#!@_mG.J10UdΪ@V XLШR _@G F!>n">@2 p@˫tO@?{ħOƵ@N'WruPĵaRR}j@$@[g,GIqD@N'Ps@@Ea||@.xWj-?. tV#Ez0O!(o@WruPĵ@Ea||@VNԵ@\.;S*CXK@WwW/@Fa/aRR}j@.x\. @@lqDPaki\%@U~,Vq~lqD"@i\%@Xu~q~ϰVbAl@Hx}'@SOd:@jpXd@)AigNMSOd: }_մL&"^@Rvs?9rS-Pw+tdQ@m^Nc oq@"Ms"1 Ni@SOd:@1mM@IlWy*ʒD@SOd:Hbi'#>Ӓ@0j )տT%d@#baf%? x@J&WeRU@įOM@zLL`jpXd@IlWy@E/@N=awhJ@.n^?OJ>i0X xC2 b@2ّ^2@KYݼCBE@NL㗃? FQ@Uhe'c!,k[*=C]~@)A*ʒD@N!@s.{@~`F忿^N@ db@ Ɛa v`P4C8b@L㗃BE@`n^p>j@%q3`@*Ш`\oH03@HcCi cb;z *Ш@03@!ivi cbDƓDxW1Nɍ 8ڃX@âaW@G7vTpvbq' K(0X@;IG7vTj휗@,}61RəlPaki\%@igNMSOd:yqh@?W4ht@.=9 병#to@ _%mMl@:a^`C@r3Csi%)@*фs@i\%@Xu~SOd:Hbi'?W4ht@1`@ 병a;vC B;Pl@OTN@`C@EgP*^壉͉PlKb-Mq@QfFU@mm@YÎ@L@D=@dN{8b@xOz@$mm EHh%4xEj+L1?;c=@9Fbicȕ@~d@-L@D=@sul@S@"W @J_ o̤YیȜ*3_K1?;c=@O';O=>Լ@@ ?8?i6Fz@qSu@?L/V4Z@H?la@ V'0hC I@K#t @A|qEitq@Kż1yQ!^p@"ucL@8@abcj@)jC@%'wi,:@r0rK^PwFr@0*X?L/@qSu@B+ ńw&,y?@ V'Ri@W@֢ u(#)@5_~؎Eb`@"ucLyQ!^p@`bcj8@KaITt@*W- W2UE?h@H0pҰR@EKQ@LpB@]9AP@ 6@[:p@%;)ƤlU@dN{8b@S@0hW@ +\2@jCH8f-@:fɧY|@NI@iD/uCdnZG@|rgW"fgs@EKQH0pҰR@]9APLpB@Z:p 6@|Gk@5JwxOz@"W @C I@֢ ujCǽA'!@6v}@<\ )=5ּNIɧY|@M[>@2". L4@6yUopnBZ\ f-5_anڴ e4gI!b @jR:K#t @(#)H86v}@i<ۈ\@i0MI@ډD#@MAt0\]'WLU wD?亮܎)io? 0@)'P@p5踫/)r-c@j!0ބrrGb@A|q@f-@<\i0MI@ꡆO@~~gИ1Uʥ@4OT@IK('ZcpACj@Qrfb@ilr@.(<Z$mJ_ Eitq@5_~؎: )=ډD#@~~gAc@ibQp{@WZ@Q<[uQ@EW1b.I"͡@m Eo̤YیKż1Eb`@f5ּMAИ1Uʥ@ibQp{@5B~@ exp񜼠٬@Ժ$@pq@UQ@# \&oDJN@wan$s:%߽@ڈPDwټuF6@?6]m>@*[CS" J@ؐO.P@pxm# \&o[ƙ@yan$s@DJN@؈PDw@:%߽@}bI@%n帡eHu t@˽~"o@,O[%yOX`hh2c@PS:5AjBsU~,Vq~`\oH03@.=9 병2!@\:v@]7p@ָTT@_$(3B’e@*bjG@>p@S3Y"R@ @G~4c@$*s" +fq~ϰVb03@!iv 병a;v\:v@Wo>@IF% Q@ofS6@>֦QGU3UG@42H=)@M+pQ@(׋3@PGOc@uZ-D@fÓgR@Tr"xi@86DsZ@θ$@ck%vn2@ }_մ#>Ӓ@=as.{@is$Vh@02Bhy 0n^@Ze@y~Q@"Dwf8@~qVZ.@ժ9%u~@(Ը#+TӪ@7h@=Ʒ$4Tr"xifÓgR@θ$86DsZ@].@&sȿL&"^@0jwhJ@~`0|@=32@oqq7ἇHS@~>@ϰQV8v7(u@A@ )P-S@s_Ϋ-D(₯`E@LI{W;R@cUҚpc@U4ж?"ӈ'Rvs? )տ.n^?F忿2Bh=32@:"Ғ@dHʠGoBі}?Zn{1ŭ?%;=U@ ѦNf@k~ ߞ7]J@9rS-PT%d@OJ>i0^N@y 0n^@oqq7dHʠGo v @Y6B&D c/@X<]uN@iCǪ@P6@΁C"NIpZP?ALJij@>n9ä@`%*@έ?cc@Tx&ڴ@C'LJij@K?AAgˤaӼ>KJ(}@˹lpإ!'rѼGl˹lpإ@EJ̓rnȰ@s&4W?wd3[)Lbh@W ?w5uFQ@[-O6B@˹lpإ>9j@Ѽ!'r˹lpإ@Sn$l|Ҕ@/X),"c0@3;ޯ @wvdT@X),@J ;^@NK@ɮ`v@9?4kh@&!AWBd9eƢ?\&UKUeɧY|@NIt0\]4OT@!'rѼP @@b2@\h4q@( @7ݴr(~(Bn9?֙1Df٬-G@ #0}Oɮ`v@&!A@4kh@/€@!~G@NI@ɧY|@'WLUIK(Ѽ!'r@b2@a W@h6A@/ԫʃ?ñQ'FIJ @?O@Gl˹lpإ@$6h@8bZJy<;R#@?d]F@)V@`fIfDJJ˹lpإ@Sn$8b>\M&@һ#@MCd0$9.<@_J?#Ю[tSxu`UdkpR@f E@EJ̓rl|Ҕ@x1_Rb@ Bn߹cH@Ov"”]U)@ݚ;H@|;@nȰ@/ Bn߹Lj?G@!ΰ@V6ypъ@@s+@#/0@UR]^{M@Z@<O:"nb@`?'/g(q %@¿HNE?tC h#@u@.SVB9zb3IW%G-;0%@E@b^66 B1~5@j@@n֕/@x ~7@jY,"3a@*aD`Ν#@5T]#AUYJ@h- ê8@[)q_;qtr(G+ IBf@@sy M1>@/@&k@jY,"3a@]@ {5JlR@= ⁴8@OP&@ek_{M~P-G?Yo~?* IBf@1@) ?,@8m/2=>8@USq@zl6 ҿxf@RA#fCBܔ¬@&ݻ\@:Q"}Q?4*,8 'x(3H|g@S@!|K6@b{WDq@|P@FctEV8Y$%y?U ?@$>;@eo9l6 ?USq@RA#fa~@jj•F@P]36Q"}@&ݻ\@7=eamS@!|K6x(3H|g@|Pb{WDq@bzZ$rm@W=eZ>o&@P\@Y@n9ä@:%߽@؈PDw@>AgˤqkP >A+ "ߩPHX)f脦z M+@݈@΃7η@ h@ꕫ ѡB@x8bwzڇ:@P\eZ>o&@n9äY@ڈPDw:%߽@n9ä@aӼ>p'wC@+ "ߩ2>AGbz@ZQC݈z M+@ h΃7η@BE0/-@ Ӣ{ܙq:@WZ{?z@+j@0-;@M$bc@Kn@[AB@&h}[koPHX)Gbz@ӯcd'A6R<_@s&v9&DE^HwqQ_@ߩ,@%*@\c@C4C/@ؙZ f@&Ǡ0 @c?{ABOf脦ZQC6R<_@UDR#SA @yRC[ U0 `s@Mr᪖ g@r^sA@5ƞO]"yQ!^p@"ucL5uFQ@wvOv"”ypъ@mz#s@T))@MLc9*y@RBS,h[Rtdy5ƞO]"@r^sA@"ucL@yQ!^p@[dT@]U)@?,@MLFbD@RBS,h@c9*y@r[1cz4-*@#`z M+@݈s&v9& @yt&A~I@3s@р1fZQZ9lq#`@4-*@݈@z M+@DE^RC[~I@e@{A؀1fZ@3s@WӜzt@S9[WF(@]S Jm@d5C`\ޝ.Hd@Lq\${O*fg4o@OI@On`pHp@Lq\${lE)@CBܔjj•F@`9L@<4?AQW{@雠0@KJ`7*̍}@Ѹ\*(@¬@P]3<4q]@^b$ {w)@C/Zģt@۹M@Рu@ū*,8 'eamgPy@x`F@?w)\*k@۹MC/Zģt@EF5̣,c@(?0q_L,lP i(pvbq,}61x(3H|g@S@!|K6\*k@?w)mp r@S> -M@ uM@w9?~@ۉ}?MYJZ"(ݿ,c@_S(A_B' K(0RəlS@!|K6@x(3H|g@>w)@\*k@S> -M@0a$d@x9?~ uM@_$>֦#@eH΃7η@ hHwq U0 `s@3s@؀1fZ@'a!Ge"F@*%S*@CiBVS@7F~$@,BFBqkyv=cj떔70Jab҆56u-$D;@#1Wz@*[u t@ h@΃7η@Q_@Mр1fZ3s@2@IIʥCiBVS@>-|d@K}n|]zə@CS"˽~"o@\aA?Nͦꕫ BE0/-@ad(U@cQpTHQ<An9*4 J@,O[%^kǐ2qѡB@ Ӣk@_qoJ@n9*4+L8AX x db@#to@C B;Pl@"Dwf8@ϰQV4bP:a@!q@g.$J(.:֔v@9:U|@C2 b@ Ɛ _%mMl@OTN@~qV8v7(u@!q@.JA@n?u*km{y@h^@7C^>`mCWd@ jVHhȜ8@`bcjc9*y@RBS,h@ZAUȚ@Prf jV@mCWd@%4x*3_abcj@8@RBS,hc9*y@UȚ@w@V#:@4ܤ^Mw+tdQ@#baf2ّ^2@a v`PZ.@A@Bі}?Y6*aD`Ν#@ {550Vl@>@kU͇qdHUV]ֹhUpD9X@ ULԇd_@m^Nc%? x@KYݼC4C8b@ժ9%u~@ )PZn{B&D c/@5T]#AJlR@>@k6e>kuVEh]"`@EV8Y$r SkoC@ً.@Z@X. VsRwzkE1Gzb3ёO\&p@v!E@`. ?Z@1:]aFR8,mi@kA\zw>@?_,@ GQ@yʩ@@l G.J_{Mi@i@X`,@0UVZm@`@@b -@$%ym@7*̍}@Ѹ\*(q{u}?;e@'GTW~@% ]Gʆ@A@?U ?@W=Ѹ\*(@7*̍}@:Jd[\ % ]@'GTW~@A@9@g<]wD@10U9Fb=>Լ@)jC@KaiD/uCM[>@ wD?'ZWZ@ exAw'~@^tҊŊd$@cBڇ5wdΪ@icȕ@@ ?%'wITt@dnZG@2". L亮܎)cpACj@Q<[p񜼠٬@^tҊv.#@4 [mWWYij&i@X1N@ev%@@`fIf#Ю[tSybRpMLZ;C n=w@[U@fv%@X1N@DJJxu`Ut ?dA.d[U@z (1Wh@p" $[xq@o@6 o"%k@sS U@\@9'f+uv &il#@pQg@Ny@VH 6 o"%ko@b@Dup9'fƆ"@by@B*# pQgl#@ɛ"g4:Afy&RzJ˞@zt`ق$O8@'ܩ0@AF_ә{@0w}G0Y\C@O@3[N3[N@ɭ!I$aHAgF@t`ق$@J˞@)ܩ0O8@0w}G@AF_ә{@moMDCr3[Nk A8R@|/1Gy\fRC@2AF*@Q3++fvN da FB@y @D%&\n9@&c)L-\Aw$2@8R@ 5 2Aеcp;*M,LPDDE@Π tA@m߇pV$S~A@O_(NnC@w$2fbAx8b{ܙq:@??@G+Nyhڔ7A@oR@wzڇ:@WZG+N,Zz@n{{@gnFoRA@Ң@m;=@yhn{{@ @QvT@`}yMGSQ;=Ң@ڔ7gnFQvT@-EVH@ 7x8,Q@6;D;Mkhc5@[%VL%G0r@/*P`@&H_?As@]2@dl+GQ~'J@0``dWt@/*P@&G0r@&H_@`@LR'@e3dl+XjZ@h'@4aZ\qy7 dNO@`OC@KaV@L@Y9@yM1RGQ~h'@ޞhj@[ D:bY@\DJ 4 8@ޚ).@_m@A@@m5@YY~bJ1s{@'J@4aZ[ DiS!@?Mf/ZIg8]Eh›"pbxߨ@ׅ(R @xߨ@ׅ(R @M1*@G#55,@kWBw"Y d{¹d@9wk@^B?3Qg'%@|"pK(eYN%[@ z{@]+ ܜQ.pq @BE@L㗃rP*^壉g.n?uN?Tb@ egT@ ,k;mǔNL㗃?BE@3Cs͉Pl$J(*k egT@η|@fai HcCi cbi%)@Kb-Mq@.:֔v@m{y@ ,fCuool@s-W@i cbDƓD*фs@QfFU@9:U|@h^@k;mǔai s-W@5jUm@;qt~P-GkA\zw>@X`,@H;]@·p| tg SS}@ټG@ZC6@r(G?Yo?_,@0UVZm@·p|n5q@ϣ}}@קޝTwI6@^0H$@AV:@V XLi,:@*W- W|rg4@io?QuQ@Ժ$@p+ IBf@~?Ŋd$@4 [mW tgϣ}}@d+ k@^jA@eD!p@x#ET(`l@;4q@ &iC@)L @e%exb# S@h*_+?ڀ_c$~Ml srFP9>9@kF_@UaWu46%dg{?F4 1uy3zEj@kF_@& o!q@y~Tnnc1}yJU@%T@@%exl srF@Uay~TT 9ͱ@ˍj!2.@nbAg.j@jc1FE.fAq@j)2@`@b# S@sWu46nnc1}ˍj!2.@8w@ w1\hD6Y@bbh7@(I>h%?3W-O<-)G|]$@{4y6*x@~ YL7oȶ?O @NF~*@+{5@{@%xSFN@27O<@툲j@}>h@RjK@I>h%7@ڍcĞŸ4z@|]$@~ YL@4y6*x@lDCm$,TONF~*?O @{@z|/j@_,&ğQx`/2@wTTf@+uby@%@"ylj"OذfMBr=@%asC@ ({hP@$ʺLfb@KfVB@MꟹOD1}@v &iB*# "yljw~ee|@y@ftVh*.nǼ5z@Byil#@pQg"Oذy@-h E@c6jR(𦊏)nyi?5z@pQg@l#@fMBr=@ftc6jc,iF@+c(@Fi@ทr"fmc@Hw.@xQEݫ[è/DY@ G6@Bgѳ=cEi+c(@Bgѳ=c@AŤxQE@Hw.@1뽇O>h*_Bgѳ=c @` @ы&QRFH^*oф @뮧N)xǡSG@mNه@ы&Q@` @:Bpsiɳ뮧N?*oф @ǡS|NmNه@蠂Lzv@bK Ah @8TD!)MGrQk<@)MGr@M!AMU@y &p#r h @j;\ @ܲ)*]5#" ]@ p@MU@{ A}jAKz@2v@? 20 a H@]KƱ@+3'+SA(B@{ ʁ@Wɪ@ilAr@y &}8Ǩ3Aar@`$T@U@'iV5m|'ON@Eغx@9@,i 0@J&φ@_p@M+pQ@z,[@#^a@Z}@/ wz@R_36kImBA@R@UN5ޞdS3Y"R@(׋3@dd5a@R]B@/ wz@YX@cXI@xҽϔQ@)pPc@IGS@:fI;z xR_3cXI@"@8Bȳ?:fI@IGS@W16kIxҽ8Bȳ? #@5^6` @PGOc@i{@*wD=w@mBA@ϔQ@^eNg@m{^n@C\wxKLG~4c@uZ-D@}rJw@gX@R@)pPc@m{^n@o\@]5@^n@@ڰ:Q=^+phx>'eea;;S^n@|^|nNq@ʣ]Y@L$l oq@J&We FQ@`n^p(Ը#+-S@1ŭ?X<U͇qC1Sb0@cy@s@=";OAk/j@TӪ@s_Ϋ%;]uN@dHU0)Pzccy@aU@I0^'M@7h@-D(@sy1@V]ֹhU+/q\fV@ GQ@`@@ټG@TwI6@s@I0:w@m?V`=Ʒ$4₯`E@ M1>@) 'w@08;`п"JsCQ@{f@ATA@ts@i/ca2ʁ6D*oV"y?+|"n9?IJVlc?U,ֺ08;tO @b@s#BmI=ATA{f@i/ca@ts@c|ٳO|Hv@i*#l9R@֙1Df @?O@_O\&-/`/0]@"QW`пb@O m@=M]o7Us9Oew/Yk}-a(2FZ 6b,Xn&8Phr|  6 X l  : X v  J & : N R V h z   D j ,:JZjz,n6"n"8NTZ82ntzZ2zbHv N<^nBd>z$VFb~  " . : H V ` j r z !!!$!4!D!J!P!!!!!!!"4"H"\"w"""""" ##(#4#L#d#l#t#########$$1$J$T$^$z$$$$$$$$$%% %4%H%N%T%^%h%p%x%%%%%%%%%%%%%%%&&&&8&B&L&T&\&d&l&&&&&&&&&&&''&'8'R'l't'|''''''''''(( (( (*(4(F(X(^(d(n(x(((((((((()),)6)@)`))))))))))*$***0*:*D*Z*p*~***********+++++6+P+p++++++++++,, ,(,0,8,@,H,T,`,h,p,~,,,,,,,,,,- -0-@-F-L-V-`-j-t-|---------. ...$.4.D.N.X.`.h.|........ / />/\///////////0:0O0d0j0p00000000000011 1(101>1L1^1p11111112"2,262@2J2V2b2|2222223.363>3F3N3`3r3~3333333333334*444>4F4N4d4z44444444445 5>5T5j5t5~5555555566&646B6P6^6t66666666667777*767D7R7Z7b7p7~777777777778 888.8>8H8R8^8j8x888888888899,9B9\9v999999999: :::(:6:H:Z:b:j:p:v::::::::;";6;<;B;R;b;l;v;;;;;;;;<<<(<2<B<R<`<n<<<<<<<<<<<=="=*=D=^=p===========>>">6>J>R>Z>f>r>>>>>>>>>???"?2?B?Z?r?~?????????@ @@&@:@D@N@X@b@n@z@@@@@@@@@@@@@AA"A.A6A>AJAVAdArA~AAAAAAAABBB.BEDEJETE^EnE~EEEEEEEEFFF*F6F>FFFTFbFpF~FFFFFFFFFFG GG$G6GDGRG`GnGGGGGGGGG H"H*H2H:HBHJHRHbHrHxH~HHHHHHHHI III"I(I.I@IRI\IfI|IIIIIIIIIIIIJJJ$J,J4J>JHJRJ\JdJlJvJJJJJJJJJJJKKKK$K2K@KNK\KjKxKKKKKKKKKKKKKLL"L4LHL\LdLlL|LLLLLLLLLMM M(M0M@MPMVM\MfMpMMMMMMMMMN NNN6NPNXN`NfNlNNNNNNNNNO OOOO$O8OLOlOOOOOOOOOOOOOPP,P`L`^`p````````aaa(a8aXaxa~aaaaaaab bb0bLbZbhbpbxbbbbbbbbbcc"c0c>cLcVc`chcpczccccccccccccdd&d8d@dHdVdddxdddddddddddee,e8eDeVeheneteeeeeeeeeff$f8fBfLf^fpfffffffg4g^ggggggggghhh8hTh~hhhhhhh ii$iDidiriiiiiiij jj&j8j@jHjjjjjjk8k@kHkTk`klkxkkkkkkkkkkkll"l4lLZbjpvƋЋڋ.:F^v̌ތ &0:FR^jpvʍ֍6Rntzގ .BP^fn~̏ڏ"*2:@FVfxƐԐ&>Rfvʑ &.>Nf~ؒ "*4>Rf|“ғޓ*<NXbrΔؔ$6<BLVdrƕڕ"2:BNZjz–Ζږ .DZjzʗܗ,>FNV^jvʘؘ",6HZfrz™Йޙ &0:Nb*+RS !,-TU*+RS !,-TUVWtu()VWtu()VW~PQVWVW~PQVW <=RS"#./0145@AXY <=RS"#./0145@AXY  $%JK  $%JK TUlm<=>?z{ TUlm<=>?z{>?~hijk>?~hijk@A67TUno@ABCDEno@A67TUno@ABCDEno)*-.tu !45&'&'*+fg)*-.tu !45&'&'*+fgHI !  BCHI !  BC  *+bc  *+bcjkDE ^_z{jkDE ^_z{01@A. / 0 1 01@A. / 0 1  z{  JKfg67 z{  JKfg67!"!"#$"#:;#$"#:;%&23$%89LM  &',-FGPQRSXY`abc%&23$%89LM  &',-FGPQRSXY`abc'(23bc~'(23bc~)*fg)*fg+,hi+,hi-./0xy45Z[&'rs-./0xy45Z[&'rs-./0Z[rs-./0Z[rs1BClm./23FGLM&'@ANOPQ%&'(23`a~$%6789<=vwDELMRSXY  XYbc, - %&'(23`a~$%6789<=vwDELMRSXY  XYbc, - 45\]^_45\]^_67bc67bc89rs   vw89rs   vw:;"#$%:;"#$% <=0145XY <=0145XY>?  89JK>?  89JK@A67no>?TUno>?@ABCDEno@A67no>?TUno>?@ABCDEno1BCvw&'BCpqrs1BCvw&'BCpqrsDE()DE()FG$%&'BCFG$%&'BCHItu&'HItu&'JK !JK !LM^_LM^_NONOPQ,-BCPQ,-BCRSHIRSHITUz{TUz{VWVWXYjkXYjkZ[~Z[~\]de$ % \]de$ % ^_^_23`a$%()45>?@A~RS23`a$%()45>?@A~RS'(bc'(bcde !|}de !|}fg:;fg:;hipqrs !hipqrs !jkNO HIpqjkNO HIpq1lm&'Z[\]1lm&'Z[\]nonopq  pq  rs|}rstu0167<=rs|}rstu0167<=tutuvw !z{|}fgNOfgvw !z{|}fgNOfg-.xyxyVWrs-.xyxyVWrs TUz{JKfg67. / 0 1  TUz{JKfg67. / 0 1 rs|}rs|}'(23~rstu'(23~rstuZ[xy:;<=Z[xy:;<=rsZ[rsZ[rsrstuvwxy<=VW      rsrstuvwxy<=VW       <=xyPQRS0145JKXY <=xyPQRS0145JKXYjkjkrsturstuLMvwxyLMvwxy    >?>?jkjkjkjk  *+ !,-  *+ !,-  *+ !TU  *+ !TUlm&'Z[lm\]lm&'Z[lm\]VWVWVWVW^_^_()67()67/0nopq*+ !/0nopq*+ !/0NOTUZ[\]^_z{/0NOTUZ[\]^_z{)*/0NOTUVW^_denoz{)*/0NOTUVW^_denoz{)*/0NOTUVWZ[^_denopqz{)*/0NOTUVWZ[^_denopqz{)*/045NOTUdenopqz{^_)*/045NOTUdenopqz{^_:;nopq:;nopq+,<=+,<=>?>?)*/0JKNOTUVWdez{)*/0JKNOTUVWdez{)*/0NOTUVWZ[^_denopqz{)*/0NOTUVWZ[^_denopqz{)*/0NOTUVWdez{)*/0NOTUVWdez{/0NOTUZ[^_z{/0NOTUZ[^_z{)*/0NOTUZ[^_dez{)*/0NOTUZ[^_dez{)*/0NOTUZ[^_bcdez{)*/0NOTUZ[^_bcdez{)*/0NOTUVW^_dez{)*/0NOTUVW^_dez{)*/0NOTUnopqz{)*/0NOTUnopqz{)*/0NOTU^_denopqz{<=)*/0NOTU^_denopqz{<=TUZ[^_z{TUZ[^_z{+,rs+,rs +,<=fg:;RShi +,<=fg:;RShi)*/0NOTUZ[^_dez{)*/0NOTUZ[^_dez{/0NOTUnopqz{  /0NOTUnopqz{  67>?67>?67bc67bc67LMxy67LMxy/0NOTUnopqz{  /0NOTUnopqz{  67tu67tu)*/0NOTUVWZ[^_denopqz{)*/0NOTUVWZ[^_denopqz{+,fg:;hi+,fg:;hi+,fg:;<=hi+,fg:;<=hi+,<=fg:;+,<=fg:;hino hino LMxyLMxy67$%DE, - 67$%DE, - +,fg:;hi+,fg:;hi)*/0NOTU^_de)*/0NOTU^_de+,fghi+,fghinopqnopqnopq<=nopq<=)*/0NOTUVW^_dez{)*/0NOTUVW^_dez{+,fg:;hi+,fg:;hi'(^_'(^_676767`abc67`abc    45~  45~  RSVW|}  RSVW|}jk()pqjk()pqjkjk"#"#    LMLM123LM@APQ&'123LM@APQ&'JK !JK ! ! !JK !^_BCJK !^_BC"#"#%&23`a$%()4589<=vw~DELMRSno, - %&23`a$%()4589<=vw~DELMRSno, - lm&'FG\]lm&'FG\]`a$%()45~RS`a$%()45~RS*+./0123VW$%&',-~*+./0123VW$%&',-~PQ,-BC,-PQ,-BC,-1*+./0123VW|}$%,-0 1 1*+./0123VW|}$%,-0 1 *+./0123VW,-. / 0 1 *+./0123VW,-. / 0 1 1*+./0123LMVW,-@APQ1*+./0123LMVW,-@APQ`a$%()4567~RS`a$%()4567~RS23456789RSXY23456789RSXY%&23$%6789LMVWXY%&23$%6789LMVWXY:;:;23$%<=@AvwDERSno, - 23$%<=@AvwDERSno, - `a>?@ARSno`a>?@ARSno`a<=>?@Ano`a<=>?@AnoPQ,-BC,-PQ,-BC,-DE 89^_z{DE 89^_z{1FGJKLMnobcfglm1FGJKLMnobcfglmRSHItuRSHItu z{FGJKLMfg67fglm z{FGJKLMfg67fglm123FGJKLM@APQfglm123FGJKLM@APQfglmjkNOjkNOPQPQ  RSTU|}  RSTU|} RSTUlm<=>? RSTUlm<=>?  *+./0123VW|},-  *+./0123VW|},-XYZ[XYZ[XYZ[XYZ[\]de\]deLM !^_BCLM !^_BC`abcNO`abcNO`abcNO`abcNOdefgdefg z{JKdefg67 z{JKdefg67hivwhivwjk./jk./ TUlm<=>? TUlm<=>?FGnofg  FGnofg  hipqrs !hipqrs !hipqrshipqrsHItuHItu23$%<=vwDERS, - 23$%<=vwDERS, - xyxyz{z{  ./RSVW|}  ./RSVW|}`a$%()45~RS`a$%()45~RSPQ,-PQ,-jkNOz{jkNOz{%&23`a$%89>?LMRS%&23`a$%89>?LMRS0101tutuvwvwFGJKLMno$%fglmFGJKLMno$%fglm"#XYZ["#XYZ[|}|}"#DE z{"#DE z{BCBC67`a67`a:;xy:;xyJKJK23$%<=vwDERS, - 23$%<=vwDERS, - $%JK$%JK*+./0123VW*+,-*+./0123VW*+,-  *+  *+./*+./*+ |}vwxyRS |}vwxyRShihiTUhiTUhihihi23$%<=vwDERSrs, - 23$%<=vwDERSrs, - JKJKJKrsJKrsFGJKLMbcfglmFGJKLMbcfglmvwxyvwxyDETU\]^_DETU\]^_,-,-:;@A0 1 :;@A0 1 |}|}z{z{  hi  hi  *+45bc  *+45bcxy  xy  |}|}$%DE, - $%DE, - PQ,-PQ,-NONONONOtutujkjkLM^_LM^_PQ$%PQ$%vwxy$%vwxy$% PQ,- PQ,- PQ,- PQ,-*+bc*+bcZ[Z[\]de\]detulmtulm !   !      #$"##$"#jkDE z{jkDE z{        PQ,-PQ,-VW\]deVW\]de !de   !de       !   !  hiPQno !  hiPQno !  123LMfg !@APQ  123LMfg !@APQ  z{z{hipq !  hipq !  #$"#:;#$"#:;*+./$%&'45PQfg~*+./$%&'45PQfg~1*+$%&'NOPQ~1*+$%&'NOPQ~()()*+bc*+bc*+,-./0123BCVW,-*+,-./0123BCVW,-jk./jk./01012323  $%45~  $%45~ z{JKfg67 z{JKfg67DE89DE89#$"#:;#$"#:; TUlm<=>?z{ TUlm<=>?z{ TUlm<=>?z{ TUlm<=>?z{123LM@APQ0 1 123LM@APQ0 1  !^_BC !^_BC23$%<=vwDERS, - 23$%<=vwDERS, - &'FGHI&'FGHIjkFGHIjkFGHIJKLMJKLM%&23$%89JKLMxy%&23$%89JKLMxy1`abc&'NOPQ1`abc&'NOPQ123LM$%&'@ANOPQ123LM$%&'@ANOPQ23`a$%()4567<=>?vw~DERS, - 23`a$%()4567<=>?vw~DERS, - TU\]^_TU\]^_89VWXY89VWXY236789VWXY236789VWXYlmZ[lmZ[TU\]TU\]DETU^_DETU^_`a`aFG*+bcFG*+bc\]de\]deFGJKLMno$%fglmFGJKLMno$%fglmhihijkjkFGJKLMfglmFGJKLMfglm$%<=>?@Ano$%<=>?@AnojkpqjkpqrsrsHItu !&'*+HItu !&'*+hivwxy$%hivwxy$%LMvwxyXYLMvwxyXY DE <=>?z{ DE <=>?z{|}|}  *+$%&'45~  *+$%&'45~:;xy:;xy*+bc*+bc FGJKLMfglm FGJKLMfglm*+$%&'~*+$%&'~$%67$%67 z{JKfg67 z{JKfg67no !  no !  LM !^_BCLM !^_BCtuDE z{tuDE z{HIHI*+bc$%&'~*+bc$%&'~././`a()>?RS`a()>?RS2323@A@APQxy  PQxy  jk./jk./#$:;<=#$:;<= :;<=>?z{ :;<=>?z{:;:;$%vw~RS$%vw~RSvwxyXYvwxyXY23`a23`aRSHIRSHI|}@Avwxy|}@Avwxy|}|}PQ,-  PQ,-  FGJKLMnofglmFGJKLMnofglm*+FGno$%&'fg~*+FGno$%&'fg~>?@Ano>?@AnoHItulmHItulm TUlmpqrs()<=>? TUlmpqrs()<=>?    2323hivwxyhivwxyhi23`ajkhi23`ajk|}|}8989PQ !  PQ !  ./*+bc./*+bc*+./0123VW,-*+./0123VW,-*+$%&'~*+$%&'~Z[@A\]Z[@A\]@A@A&'FGHI^_&'FGHI^_ lm lm`a$%()45~RS`a$%()45~RSjkDE z{jkDE z{xyJKxyJKvwxyvwxyHItuHItuDE89^_DE89^_$%DE, - $%DE, - %&23$%89LM, - %&23$%89LM, - jkjkPQ  PQ  *+*+@A@ABCjkTUBCDEBCjkTUBCDE    JKxyz{    JKxyz{     JKz{     JKz{    @AXYpqrs    @AXYpqrsXYpqXYpq      JKz{    JKz{:;TU()`a:;TU()`aHIhiHIhiPQFG89:;<=~PQFG89:;<=~LM23LM23DEDE@Ajk,-./@Ajk,-./tu !~&'*+tu !~&'*+"#\]^_RS*+"#\]^_RS*+ $%bcdeJK $%bcdeJK&'z{&'z{()67()67*+,-./23novw*+,-./23novw*+,-23  45novw*+,-23  45novw*+./vw*+./vw012345012345*+,-012345no*+,-012345no-.45&'-.45&'@A67no>?@Ano@A67no>?@Ano89    89    :;TU()`a:;TU()`a<=\]fg<=\]fg>?@A>?@A>?@A"#>?@A"#BCjkhiTUBCjkhiTUDEDEFGBCtuHIFGBCtuHIHIBCHIBCJKpqrs  JKpqrs  LM23^_LM23^_NOpqrsNOpqrsPQ89 PQ89 RSlmRSlm:;TU:;TUVW~VWVW~VWXYZ[XYZ[-./0XYZ[xy:;<=rs-./0XYZ[xy:;<=rs45"#\]^_*+45"#\]^_*+45"#\]^_45"#\]^_`aBC`aBC67$%bcdeJK67$%bcdeJK$%bcdexyJK$%bcdexyJKfgfghi  hi  BCjkfghiBCjkfghilm\]lm\]@Ano@Anopqrs\]NOpqrs\]NO89rspqrstu \]BC    89rspqrstu \]BC    rsrstu01<=rsrstu01<=vw()bcpqvw()bcpqxyz{|}  xyz{|}  xyz{|}  xyz{|}  xyz{|}PQ:;    xyz{|}PQ:;    !~$%&' !~$%&'-./045Z[&'&'rs-./045Z[&'&'rs$%$%LM23^_LM23^_67bc67bcXYXY2323VW./VW./xyxy()no89()no89 23 23z{|}>?@Az{|}>?@A*+./45de*+./45deRSbclmRSbclmXYXYZ[bcZ[bcFG !~$%&'BCFG !~$%&'BCFG$%&'BCFG$%&'BC@A>?>?@ABCDE@A>?>?@ABCDE@A67>?@A67>?bcbc&'&'JKJK*+,-23  ,-TUno*+,-23  ,-TUno,-^_  ,-^_  TUTUHIHI  JKxyz{  JKxyz{,-,-lmlmJKJK"#DE"#DE ! !XY"#XY"#FG./tuHIFG./tuHI./BC./BC<=<=fgfg  no  nopqrs\]NOpqrs\]NO  lmjkZ[fg23lmjkZ[fg231lm1lm,-`a,-`a<=<=@Ano@AnofgfgZ[Z[Z[Z[bcLMbcLMz{z{LMbcLMbcjk./jk./no`ano`anono  ,-  ,-TU,-  ,-TU  no  no    &'&'vwvwvw,-vw,-vwvwDE !DE !PQRSPQRS8989devw !z{|}fgfgdevw !z{|}fgfg"#DE"#DEFG~$%&'BC"#FG~$%&'BC"#-.FG45$%&'BC-.FG45$%&'BCDE()DE()*+RS !*+*+RS !*+,-`a,-`a./BC"#./BC"#0123456789:;<=z{|}|}(),-230123456789:;<=z{|}|}(),-2301234567z{01234567z{0123456789z{|},-0123456789z{|},-0123456701234567014589z{|},-01014589z{|},-0101:;()01:;()01<=defg01<=defg@A>?>?@ABCDE@A>?>?@ABCDE  @AXYpqrs  @AXYpqrsFG./BCBC"#$%FG./BCBC"#$%"#DE"#DEFGFGHIHI    JKz{    JKz{LM^_LM^_NONO|}PQde89:;<=~|}PQde89:;<=~"#*+RS*+"#*+RS*+TUno@A89:;TUno@A89:;VWVW  @AXYpqrs  @AXYpqrsZ[bcZ[bc<=\]fg<=\]fgLM^_`a67LMTULM^_`a67LMTU^_`a0167RSTU  ^_`a0167RSTU  Z[bclmZ[bclmdede<=jk\]fghi<=jk\]fghiBCjkfghiBCjkfghijkjkRSbclmRSbclmTUno@A89:;TUno@A89:;JKNOpqrsJKNOpqrsJKNOpqrsJKNOpqrsFGtuHIFGtuHIvw"#vw"#dexyJKdexyJKvw !01234589z{|},-01fgfgvw !01234589z{|},-01fgfgdevw !014589z{|},-defgdefgdevw !014589z{|},-defgdefgVW~ VWVW~ VWTUTURSRSBCTUpqBCTUpqTUBCDEpqTUBCDEpq@A@A89    89                  ()():;NOTUtu():;NOTUtu()01NO  01NO  rs0167  rs0167  89    89    89    89    ././fgfgrsrsXY^_jkXY^_jk"#DE"#DE:;tu()HI:;tu()HI89JKpqrstu()89JKpqrstu()./01vw  ./01vw  ./    ./    XY"#XY"#hihi>?>?XY^_jkXY^_jk:;()`a:;()`a^_hi^_hi xyz{ xyz{BCTU&'pqrsBCTU&'pqrspq    pq    pqpqpqrs\]  pqrs\]  pqrs\]pqrs\]          DEDERShirsFGRSZ[RShirsFGRSZ[XYZ[^_jkXYZ[^_jk$%$%1BClmxy$%rs1BClmxy$%rsrsxy|}VWrsxy|}VW  >?hijk>?hijkNOpqrsNOpqrspqpqNONOLM^_LM^_LMNOLMNOtu()tu()~ XY~ XY VWXY VWXYVWVWJKJKFGtuHIFGtuHItuHIJK* + tuHIJK* + rsrsDEDE<=\]<=\]NOtuNOtu1lm23LM@APQZ[1lm23LM@APQZ[89rs~ XY89rs~ XY    `a    `a8989JK      8989JK      DEDE>?>?BC:;vwpqBC:;vwpq VW VWPQPQxyPQJKxyPQJK:;:;*+ !*+ !@Avw"#@Avw"#$%$%HItu !~&'*+Z[HItu !~&'*+Z[vw()bcpqvw()bcpq"#\]*+RS*+"#\]*+RS*+  ,-TU  ,-TU././rstu`a0167TU$%<=  rstu`a0167TU$%<=  LM23LM23,-012345,-012345rs^_`a0167TUrs^_`a0167TU89  89  :;:;<=\]<=\]>?~hijk>?~hijkTUno@A 89:;TUno@A 89:;FG`a$%&'BCBC"#$%FG`a$%&'BCBC"#$%DERShi:;DERShi:;FG"#$%:;NOFG"#$%:;NOHI\]HI\]JKxyJKxy^_LM^_LMNO67LMNO67LMPQlm  "#45PQlm  "#45DERShiFGRS:;DERShiFGRS:;@ABCTU@ABCDE@ABCTU@ABCDEVWVWXY^_jkXY^_jkZ[Z[pqrsHI\]pqrsHI\]LM^_RSLM^_RS,-`a !,-`a !vw()bcpqjkvw()bcpqjkPQde  :;PQde  :;fgfgDERShiFGRSTU|}DERShiFGRSTU|}jk,-jk,-PQlm  45PQlm  45@A67  no@Ano@A67  no@Anovw()bcpqvw()bcpqrsZ[rsZ[tu()HItu()HI89BCvwxy<=VWpq89BCvwxy<=VWpqxyZ[vwxy:;<=VWrsxyZ[vwxy:;<=VWrs&'z{&'z{01|}23*+Z[01|}23*+Z[>?~>?~BCFG~BCFG~BCFGBCpqBCFGBCpq()()>?>?PQ,-89:;PQ,-89:;PQ89:;<=~PQ89:;<=~PQTUno@A89:;PQTUno@A89:;PQ   PQ   VW./VW./ !~&' !~&'&'&'RShiFGRSRShiFGRS@Ano>?>?@ABCDE@Ano>?>?@ABCDE<=\]<=\]<=de<=dededelm@AFGlm@AFG@A@Avwxyvwxyvwvw`a`a ! !  `a  `ajk XYjk XYTUTUlmlmnono"#01"#01pqrs\]pqrs\] XY XY!" XY!" XYlm45lm45hihi JK`aRS  JK`aRS  @Avw@Avw@ADE@ADE^_LMNO67LM^_LMNO67LM    `a !tu`a !tu././>?hijk>?hijkDEDE $%deJK $%deJKBCXYZ[bcvw^_jk89jkpqBCXYZ[bcvw^_jk89jkpqBCXYvw&'^_BCjkpqrsBCXYvw&'^_BCjkpqrs bc bcXYXY   JKz{   JKz{ JKbc JKbc././XY^_jkXY^_jk`ars./  `ars./  xyz{NOxyz{NOz{|}z{|}jk XYjk XY    xyz{|}PQ89:;<=~  xyz{|}PQ89:;<=~    ,- !TU  ,- !TU`afg`afgXYZ[  vwxy~XYZ[  vwxy~!"XY!"XY@A 89vw@A 89vwde  vwxy~de  vwxy~PQlm  "#PQlm  "#()`aLMNO67LM  ()`aLMNO67LM  rs|}rs^_`a67NOTUrs67LM  rs|}rs^_`a67NOTUrs67LM  rsxy|}tu`a01<=  rsxy|}tu`a01<=  lmZ[lmZ[^_^_)*|}23Z[)*|}23Z[z{z{z{z{HIRShiFGRSHIRShiFGRS ! !$%./BCBCFG"#$%NO$%./BCBCFG"#$%NOBCBCFG"#$%NOBCBCFG"#$%NOBC&'pqrsBC&'pqrs01:;()./01:;()./*+*+014589z{|},-014589z{|},-()./45defg()./45defg89z{0189z{0101|}23Z[01|}23Z[./45defg./45defg6789bc6789bcPQPQTUno@A 6789:;<=tu~PQPQTUno@A 6789:;<=tu~Z[|}PQTUno@AFGdexy89:;<=xy~  Z[|}PQTUno@AFGdexy89:;<=xy~  Z[PQvwxy89:;<=VW~Z[PQvwxy89:;<=VW~@A67>?>?@ABCDE@A67>?>?@ABCDE@A67>?TUno>?@ABCDEno@A67>?TUno>?@ABCDEno@A>?TU>?@ABCDE@A>?TU>?@ABCDE@A>?TU>?@ABCDE@A>?TU>?@ABCDERShiFGRSTU|}RShiFGRSTU|}FGtuHIFGtuHIJKJKLMPQLMPQpqNOpqNOPQPQ`aRS^_hiFGRSTU|}`aRS^_hiFGRSTU|}^_`a0167hiFGRSTU|}^_`a0167hiFGRSTU|}xyvwxy<=VWrsxyvwxy<=VWrsXYXYrsZ[>?rsZ[>?<=\]<=\]XY^_jkXY^_jk  `a  `abcLMbcLM|}./45defg|}./45defgvw !z{|}./45defgfgvw !z{|}./45defgfg>?hijk>?hijk>?hijk89>?hijk89lmnolmno@A67no@Almno@A67no@Almno  @AXYpqrs  @AXYpqrs  @AXYpqrs  @AXYpqrs89tu89tu   vwxy~   vwxy~JK  :;vwxy~JK  :;vwxy~z{z{hiFGRSTU|}hiFGRSTU|}PQ  89:;<=vwxy~PQ  89:;<=vwxy~JKrs  JKrs  xylmxylmxyz{|}TUBCDE  xyz{|}TUBCDE  XYXYpqpqFG^_FG^_fghihi|}~fghihi|}~+,`aPQRS  +,`aPQRS  &'45z{*+&'45z{*+4545&'FG^_&'FG^_bcfglmbcfglmTUno@A89:;tuTUno@A89:;tu4545    vw()vw()8989    $%bcdexyJK$%bcdexyJKPQde  PQde      JKz{    JKz{FG~FG~>?@A>?@A<=\]<=\]&'&'z{&'&'z{HIHI|}|}DEDE<=01defg<=01defg>?>?XY^_jk89jkXY^_jk89jk|}PQvw"#|}PQvw"#)*|})*|})*|}&'defg)*|}&'defgtu !&'*+tu !&'*+tu !&'*+tu !&'*+NONO@Almno@Almnono:;  `ano:;  `a >?xyRSJK >?xyRSJK`a`a()VW&'()VW&'&'&'89VWrs~HIPQVW89VWrs~HIPQVW89rs  89rs  NO67LMNO67LMJK  vwxy~JK  vwxy~lm45lm45HI^_HI^_rs`a0167RSTUrs`a0167RSTUFG./BC"#FG./BC"#z{"#TUz{"#TU|}"#DEPQ|}"#DEPQxyz{|}"#DEPQvwde:;  xyz{|}"#DEPQvwde:;  ^_hiFGRSTU|}^_hiFGRSTU|}>?hijk>?hijklmFG\]lmFG\]VW~PQVWVW~PQVW  JK  JK@A67no@Ano@A67no@Ano89  vw89  vw@Avw@AvwvwvwPQ   tuPQ   tu:;   :;   89  89  @A67no@Ano@A67no@Ano@A67nono@Ano@A67nono@Ano>?hijk>?hijk@A vwxy@A vwxytutu`a`afgfg`a !`a !:;PQ  "#$%:;PQ  "#$%:;01"#$%:;01"#$%&'bc&'bc:;tu()`a:;tu()`atu !&'|}*+Z[tu !&'|}*+Z[jk,-jk,-././01012323PQlm45PQlm45()NO67LM()NO67LMjk89jk89fgDERS:;fgDERS:;rstu01<=  rstu01<=  Z[>?Z[>?@ABCDEFG@ABCDEFGBCHIrs@ABCpq  BCHIrs@ABCpq  @ADE@ADE@AFG@AFGtuHItuHI$%bcdeJK$%bcdeJKNObc67LMNObc67LMvwFG"#$%NOvwFG"#$%NOLMPQRSLMPQRS PQRS PQRS  ,-TU  ,-TUVW~VWVW~VW XY XY&'|}23*+Z[&'|}23*+Z[lm&'lm\]lm&'lm\]^_^_:;()`a:;()`a67&'bc67&'bc<=|}defg<=|}defg)*vw !<=z{|}fgdefg)*vw !<=z{|}fgdefg+,hi+,hiXYbc^_jkXYbc^_jklmlm*+,-23no*+,-23noBCvw&'BCpqrsBCvw&'BCpqrs-./0BCxyZ[xy&'VWpqrs-./0BCxyZ[xy&'VWpqrs tu tu*+,-./vw*+,-./vw xyz{ xyz{   JKxyz{   JKxyz{|}|}~~|}|}vwpqvwpq45\]^_45\]^_89018901fgfg232301XY$%lm01XY$%lm89:;rs0167"#$%89:;rs0167"#$%./ ./ -.xyXYjkfghiTUrs-.xyXYjkfghiTUrs-./0xyZ[VWrs-./0xyZ[VWrsNOTUpqrs !`aNOTUpqrs !`a^_TU\]>?^_TU\]>?`aRSTU`aRSTU !~&' !~&' !XY  de !XY  deXYZ[XYZ[&'&'xyz{|}:;  xyz{|}:;  8901890189  01$%89  01$%*+,-23`a !no*+,-23`a !no   tu   tu   &'   &' &' &'$%$%!"89tuHIno!"89tuHIno89  HI89  HIrs./rs./!"HI!"HI,-HIno,-HIno./0145./0145rsZ[>?rsZ[>?  45  4589pq  89pq  BC&'pqrsBC&'pqrsPQ89:;<=~   PQ89:;<=~   >?@A>?@ATUno@A89:;TUno@A89:;TUno@A6789:;bcTUno@A6789:;bcJK  JK  ,-,-`a !,-,-`a !`a:;   !* + `a:;   !* +   vwxy~  vwxy~`a$%BC"#`a$%BC"#~~8989DEDE  1BC23LM@APQBCpq1BC23LM@APQBCpq ! !   "#89   "#89%&  &',-FGPQRS%&  &',-FGPQRS  ()HIRS  ()HIRS%&23  XYbc%&23  XYbc>?>?%&  &'(),-FGHINOPQRS%&  &'(),-FGHINOPQRS  ()HINORS  ()HINORS>?"#^_>?"#^_:;HI:;HI:;:;%&  &',-FGPQRS%&  &',-FGPQRS   $%89   $%89>?   89>?   89%&23  &'()*+,-FGHIPQRSXYbc%&23  &'()*+,-FGHIPQRSXYbc*+,-<=>?FGVWXY\]*+,-<=>?FGVWXY\]()BCNO()BCNOBCPQBCPQNONOZ[`aZ[`a()BCNO()BCNO $% $%"#@A"#@A>?>? !23 !23 "#./4589@ALM^_ "#./4589@ALM^_vw $%vw $%%&  &',-FGPQRS`a%&  &',-FGPQRS`a  ()BCHIRS  ()BCHIRS  *+<=FGVW  *+<=FGVW%&  &',-<=FGPQRS%&  &',-<=FGPQRS "#./014567@A "#./014567@A <=./0145XY <=./0145XY !2367 !2367 <="#./0145@AXY <="#./0145@AXY./2367./2367>?   "#89>?   "#89:;HI:;HI*+,-<=VW*+,-<=VW>?VWXY\]>?VWXY\] "#./45@A "#./45@A()BCPQ()BCPQDE\]`aDE\]`a%&  &'*+,-FGPQRS%&  &'*+,-FGPQRS  ():;HIRS  ():;HIRS>?xyJK>?xyJK"#LM^_"#LM^_NONO%&  &',-BCFGPQRS%&  &',-BCFGPQRS%&  &'(),-FGHIPQRS%&  &'(),-FGHIPQRSTU\]`aTU\]`a*+<=>?VWXY\]*+<=>?VWXY\] %&23<=xy  0145>?VWXY\]`abc %&23<=xy  0145>?VWXY\]`abcZ[`aZ[`a>?DETUVWXY\]`a>?DETUVWXY\]`a"#LM^_"#LM^_%&&'DETUXYZ[\]`abc%&&'DETUXYZ[\]`abc%&23  XY`abc%&23  XY`abc\]de$ % \]de$ % fgxyz{& ' fgxyz{& ' hino hino XYjkXYjklm  ! " # lm  ! " # hinohinopq  pq  ~rstu~rstu~rstu~rstuvwvwfgxyz{& ' fgxyz{& ' fgxyz{& ' fgxyz{& ' |} ! |} ! Z[~Z[~vwxyvwxyXYXYXYjkpq  XYjkpq  XY^_pq  XY^_pq  ^_pq  ^_pq  pq  pq  lmvw|}  " # lmvw|}  " # '(bcfgxyz{& ' ( ) '(bcfgxyz{& ' ( ) '(bcfgxyz{& ' '(bcfgxyz{& ' hinohino^_@A0 1 ^_@A0 1 XYXYbcfgbcfg23XY$%<=vwDERSjk, - 23XY$%<=vwDERSjk, - pq  ( ) pq  ( ) XYnoXYno~89VWXY~89VWXYXYjkXYjk~XY~XYhinohino@A0 1 @A0 1 Z[de~Z[de~lmlm'(~XY'(~XYz{z{XYjkXYjkfgxyz{& ' ( ) fgxyz{& ' ( ) \]\]pqpqlm  " # lm  " # 0101RSRS%&'(23~$%89LM%&'(23~$%89LMpq( ) pq( ) pq  pq  rsBC    rsBC    rsTUrsTUtu:;tu:;    LM`a0167LM`a0167LM2367LM236789rs   XY89rs   XY XY XY* + * + "#\]^_"#\]^_z{z{|}|}  ( )   ( ) pq  pq  rs`a   rs`a   pq89        pq89                          rs   rs   hi hi     no !  no !  rsBC    rsBC    hi    hi    <=      <=      01  01  |}    |}    xyz{|}    xyz{|}    lm  ! " # lm  ! " # lm|}  ! lm|}  ! lm  " # lm  " # \]de$ % \]de$ % fgxyz{& ' ( ) fgxyz{& ' ( ) & ' ( ) & ' ( ) * + * + 23$%<=vwDERS, - 23$%<=vwDERS, - z{01. / 0 1 z{01. / 0 1 z{./01@A. / 0 1 z{./01@A. / 0 1 (0@f>+ 7,{3B@Uwd$@giM?@* 5@~##K@n1m?!>.@QiA SK|t@Uu@T?;\C& X@H@SGx@(u@sA2yS@$j\@{Q{@@3>@qRk@@EobYA+ǖ<狻ąT@rg@$@wϔ@@72@V@V@U@a&AUl˜iA}iޓU@:$JOs zOI@T$@U&@'q.@ߡ@n<㡺 "@cq@ '2m-7`~|@,#^@/A?K@occd@Zp@pY@pXoS$@ \?.}x|S*KZh@J&w@tzVax;r@V tׯp@!D@7t>HfɐWLI0b]2gY3@@vV?o@#@JC2@=P00rMi? ɾ@3^Ric@61EZ3> ao`Hv8Z:#tCۆ?9vnoM*u1X@`6@@3&I@2ekf@YiۮK@/Y}UjLUD#FAFg5@}3e׌{@(;چYn@!> [LB@ @k2#\d@4.YD@{F4@.G@=ي5_C!`==݅κV@ҽcA2G@bf@3=D@е@3t! i]@eQ痐k@xrccI@0bZ]>Qb St.`@z*V @r t`oR#Hnk@V@mUӖEZ2U5ܜE@Ct"@P;Om@DjA@ae5g@fȺ@fpM$1.E@Z6KtX@wH;@V@j@g xV2@|I ˗S@-^S0gnZO(:@`f)@qm,?C `  ?S"@xHl@vb"x@k@l޾mJч@N1$C 5@D4Gfp {miB(h)E$_@?{ ܎kr4 *ȫV@>0X(Z@"6j(0@bɘ)@c4@r?t)gB@PvnxJxt#^>`-IoP`7(Uq?%QO_<?s@3Aj+GbKj.W7}2!{6Bj<鱺 `V@c\ު1sKS:) e*$?q #t=6 :3ᔒO}D(V?ں1TTҋyYH9nNlFu AuAVٿ <)bb%@:dVFBrk"W}G4@۾&/@lT% ft0ҟ!E+ay ,;9@tk`s6@Yr6A@rSG0@ ?@#T6W@K<D"@9mZAaBx!@ @ >v`@m*yqrYR5{ntu=$JGfV+l-'@@Mb[?'T1a6@^~E@䙐8):L)@c0;"OSQ@3?0>A kc߯ŶE@n2Bz`F@ 3P bIifP ?XޙLHЅnk!ZHyrl*qh. iff@+J}\@o#@~}G@e6'C)<*„‹.&G@:1@7Xd@@@p 1] @HaZ@PHH >3o#6,Z[C84<98߿hd;r"A@/?b7 ` ?5"*3?d AgCjYQ1ԃQB̫I1 2ZZS@cWeQ@N|I%@E Db1QW5Yy m @srи0Q@@ă_fz@_MV3!$y8ux%5pW]W.lA@Ul8@kFTImEP<:-J@ƟQ@]:# U&tz@b:dM?>|;k@È@i|{@J:m6Xtmeר.ߍ FSJX@!yBt Mn6@M&@]M[1?0>8kS@i7p:@=Īץ6]T 8Q֕(_Eg`@b@@K7>xX&"'9!IA/#T鿟L =пspE?1H_!4@~P((vh$s##}Kp߶na$@rȞD " 4:*`B/@l0%@>$[-! K~ Lo]E"w ޅG3,c[@LFT@=o?<@WI0@S*6(ٹa+Ww0@pBvՇELZF*!8=6o6#@ R;1n4?2VG/BB֨TS^kd@`YåM|5NV2@ˊ3@0L.LE>=@18 VC :?8s LV?-=iҥhrKN@ɭuek5E?-]f9%.-y>37!Qe=LIvg b?_ϫTz@ӕ&pwf@1$7w,P@J/ZgGbJMn WJ;̇0@s->D@q>y8Z?.O@Zݜ'"D;z[@`,V8:jy"Q_YNݲ9QP(kFT@IP%YA@%[+@]"X&uM|l&?Un@=l'@JU%seWBN'y4@ @'B$5"@U뎭!A@ ?KQRAT9T7swك!?;T#nT-B-5(fyd (*835y'@21EqyK!a@PKCV@Kk@zԠIٿ!(ɪJhA@!~xUeˣ9}%@JQ ~@()d@,f%9b A@q׍D1\2,4-[x+4X%\@#&):*W?˒ Q5#a-+7t y/6@),V!@bdLO@ձh??.KUڿ9c$6? Q?R"@5M$@հƃu@tJ*fɓa.GI?X+M{󠘢@}Vr,,6xX-@W8L#H >x07@UDؐI+@ͭP @Z @-u֬ -}!DPQ#;N#u?5@@ p k7,=L@;%?}+VobS|c?Ao@'с>6"A}dU]ThqIABY@c0[@uLuhzEg7on!a,@>5cFd#,ϊ$:@-ɖ @ O5y֒@i>Bq!@˕-_wS@.&[;} Ah/UX*:|T:IɿH6E&":|'49Kr7yxWpv7@jj.4@I<[BKwE4K,* )iSY'}J@ZE!G^QkW 6@Vc13G=灤$}k@Qz_z~@{k0<@xvͺM.갑.Qȓ4R@\ $O U@E@mP@C];JIYhL `qj@LPIVRH91l*!Z!l!@mH$@BO@@{H\+  WX3/n@c-/m0)Tq @gBx]H>VA,JP@$^2DV {@jwH`"W*=mUZ2C^@}2B@A"@M2 ?mhp"|\7*y R O4@MX6?n_|]y9 (@ܷq>^JH:P@=L]]@e(TK@S-N:" bەv@R1|#EȖtר'JJ^& +@@T?*[@qp$@b8@z-7Ʈ:;n?)tuY8v7G79&#ŔjB_@Smh%@gu`?X,]ڿQV23#|c3I@@tUx4@9e@hiXp4$}GWy5RF|姢33@H?*KM@T<>Uy,@Gg@?71e@;˓bS@\4H"}f|4@AtX]W@8_lv@m{v@Gc~4@ŌA# L)b@\sx;`@TXE$utKJ^xJa+4ۂÏQ @:.ӯ:? #K-\0?â)V<<1S v=B$Ὶq?}"Ln(~u{[hC9x]#W-7@?Z se #粒GctNI@v:@^O- CqCl9`U+&P"p;Zv0G?9_%@מW@/Ϳ:@c;}I["y|̐?%5&8ZDp'@Mc&zKjZmW@֢V@oi 'lIckMZuK:5j2@uE.T@ TYurv5t'eD@+yT-@xN?:{;:@W#?VQjH10Ɩ?.=i1Qჺ!4^+>x@AHD%9;AΦK;o[?r=@u -#zC13@P=N%U1i>4@\=@߱4\@Yg=:D3?@;Wc$ri@Zh%AH`OS#yQ )@CPI@q8F@@}!#B,Y@Bp&u^H)x77W!GR?+7,( .[5#?sFFN@?MN(2%I@f@^DA@R'J%@Ps^!HD rC1:>o4,* ݿnw42( Vg5h@~Q@M#'Qr_U3@"޿R@Z̮D-O$,RX@WhQWĺX@]jI@;Q?G_M3.4@iw [vVXMgn{k@Fը'@ٕї@^B]?{s]l.`JW 7=i @ aRC?"=N,@0[|Yl=dV&JJq\m5!5m"&/uB<~د ?$%( ȣvW^#@wD;5s{N@d&zyA6Ϊe܈D9-qb@A%@pc@xys2sG"8K?D5?Қ) OUxQ@B,3@ JP@=U) ~93eh rS᧬?鲺⿜H@Lbe3#Ч-a@b]cl+?lZ =rA[5a6 /ue2y`18MT!3UV›& @L׿]Kl.c@g57@uOE@Ej=LmR~>Úljekh c7 +EL6mG{JrX Y>FUYD@b69rV2T@IՎ(Ux) Cjn@̜"?N9 t@%W @s[ڙԷX5֝#&Pį0F@IDWp)<&J@_ B@;> @@!H@ T$^@7o@)fljg @qƲ.VVH<0?I?C @""4ÂB@l.[D @,gd/[e=<@je$ @ɑ!Þ@u:@I"@G6]s}1D?3EW@J,=?0#k@zÖm6[d7H@ߞ3\@3;A@\F\0@ 8'ZB1@H@[$@e7@HjUT@$ +J@H0@@Bc(@!1a@O*:S@uw'.j:"I8ZTsJ @LI(@!h{ Ny@T lk@424)ѿM$0OR)ֽA@K}"E>@ԱÖJ@@Z *hU?&.IZٱ6_KSby뿍վ)˶#h6@ D1NS,@!^?dso=@Ϋ&v;έBQFY=@ bӢ(^U75KFFS%4b`bDؖ"Y9 h$@'m%@M;@ʉ'pe+z0zy=@N*=5EF1% @Y|/@2/%@xdk+@x@89)E%jaV"G@?)DL @85c@_ )@I0@`S-W]N @}* E#@Dmbm?H-7 G& e˔b̔72%~%`/nV @X@zR'c/je<"0=@{z:U 4H6I#0G.=@7"@گ@pf1|1&@Loq@Œ @%DbC3<́q@B8'%cO7>B) @C?d! {ѹ&^ĔJ(@Ia([ת@-' 0">$|8EN]jDP2hW@'x:@~"@°U92]zR%zR7G_gG@f=P$;z?VPE)- YʠM|?O@4Ljڿ7-8\?a2=@8h>@b2vB>ysa2:?[Fˇ9g(A@YSZ pݿ>9E@;?>6VXpc@9@ 5`*laa|?} ^t@~v6= @:pdw@C#Gڗ}Q5( @G-]Ro?xD0a&0[D uo&@>\C@,h@({,Q7fCdYA2L66@זR#A@3EOB6O"%T@obg`qBiC !eMZ@kȷD@{rx*!B xܡ>Lhc*@ߠh/5-fR"OJ̩s}iKbͿ(?>x } m}`@%֍>@ѡy0dÔ@ riUA$awD@?#@[6 LK1Z/0[ j13b)0\D oJ y?fA KKRW' 3@qJ ,sf$@9^'Zb@'ڥ@ޅjH[TbRt $=+U6c @ьF&M@J;9'b4"֌ :7! >GoI.%=M ON)@! Wܿh+')Z2:n@0g[i@A?rWി9'|@<`Mf*Cu+翛2S~4i=<@xc@@Pί1G 4Xk@:+$-m@j[p(7!̿nCJ |]7neqSN@n"`bFNj /?ӂfOc@ <$u0i\M@85 @u;@-FO;@7~@LDqKhf#goX@c@l;woK6h5Ya%527ZU??469'1@=sG}@ @ŋT*?q2Hb4Ju+(>_'׬@bP0@2%pHpqPu;$Jpi;Gl@]p@Rb^0@>>q'@y@B@ׄ({C@9y^2Ӊ,NNEc?nj |@ȥ(^@ ^yr4GSm DYS Y}? <@5W!alۼܷ)Un T/ H29+CO$GԿB4jKI ~@U/YqN@W$&@#VWtb𿍙E)h!Stkz1@W=?? hYpM@ o,@*3`ᥑB5Hs>@]lQ? mG=Afo㪾ؿ vbSB@.} @$ QHqš%@N@f``,Ec3׿7"$T?ke!@ m[pi@;'d&cG꿁)]as~HN@")(Y:^P|bF7.:֝*ȇsH@ぷ@2pQ~m' j?Cd `z.@ @iؾG$^2ec[ P^;Ek%@P8~ܿVaL01zz @F? @ o;z؏A @?`oZ?1@6P>N5Ht5n@Q0@/2ڂf+[GPt@tUb̉@H͈lRhD@ à ePZDI@h6@~3C{*@e)eӨDZTh2ݔ g;A@nj7D=8@5(m1@39䀄鿆D+b@aSSdGQrE”wF(WAk?{ZGdV? or0S̿fqDm(U4,ftY/@m6|Vb rdU{Ѯ=@В[$-sbA@?B(OyRHiBx$zX??e1X?Z$b4@bL>7r15,O47"fFA%Wmi v f6!K / A-@i3~@=@A̹fG@>2!8yRǯkOoe~@dqޠT@a}@: A=]c@O*XK:ɅG@ھ>5eq -0@jD+(3M,2 (?[K'@t?^JJ#@:G`$5o84/͘A@63GYMW@D5@ڹ)?0@x1e@ P3@u\?mw CB@)0\p ?>@X% ' @L8#t?PY.v% M#@DئC@RڍX ͩ]/Ut]M UynUh@i%)@ o@?ZNL=J@I*A+@?; ]h&@*nI|] @G ƒtM? WL~@p A𿡔 ruF`#jϲ g 'eCVŠ9q3i6 @i~Jp@#J<19XesG){- @P0A@MN`)#@OͱY06Aq/ʡb%T]&|_φr@QaIB@:@vώYBt׍X= mo7ur#%dA7o\ft?Mf1c5p*HlFw8u@`(1R)+ݿeg@f\r@l"K=6d)ɟHB^;@gqZvq4 8V3@l"@_k̟C@>B5@ Z_>@K}@Mz(HRb Upª͔5kr<@=!@g? ?2PN@P󿟘t3@.tJ?7a q?8gxu@IT@m?Q?`"HL \ďH0J9Ā?< pc@@g"@Su ?S[4Fn#F8̺?hDTAϹ 5TVfx#y`?~aΥU?t=l IYT#t?tR@b.TR 5RWKԀE'5.7Έ @61",Z4!"QR@ٹմV#Ҙ)b0S91v(#OB_0"ۺb<8Wm1+F4t;AF0H3MڬrgG@'*'|'/[}~ gTwjkC&Ab91? u'{G4mJ/?"d"~Il@֘ou4@4HnBuJ6:?C @1ScҴk)2)v2L塸nHbm@M6ZPLln @)4odU@E^Kb6?ѳ gj@L=`wPy7U/ hA$E'&l\W FKFNN?- zA@/ 12@2ӐP?r-f?y(Ҿ?sfm@fApBWT R@G@*4:@o"E @b!j!FU=^U/NJ@X@-?<?2&:`@(0@qUI9m,`b@9cWC@r #@&Z)E*jY:;Bw:"@O@\"ԅ]sBy灧^H,SMxYdſQܺ&@@A%`}d[:5FjE}7;鯁 @~ "M@TE#lC@GҿJXo4bGRPS@sΥO&3@ w?7$.q}u*@Y !@s${@u"iЅRZ1@b7o..' x6&.@NCgrx T@fg0zp-(&C9h@3$vOT$^@߁V3w(ZYw@?72ɨ)y0@c2_AÌsplI@IQMC|Q7mL R8sFaۅnF@އ2q&=d@}8P@wErD2oU m;K(p:Ih"@+gp?.Dg86`V#3IT;'a&YHHkv7>K|? @-&=pSn@jHT>6;;"_CYo<@Ph FdTq'T?\@&hF*51D@ hWX I3$,Q@flGQ@i)--d@=]͡TdzA%"cX"@ol@GW%?)P&R*MK @a+'7b@%S,~H?ޥ@(R@_m=p3XTl?T-6wLy=Į6o?UצbO@ڟ ~+U:@p4g@GKa}I(FE+-tR/NsCZ(L4@<@չ)B{*60@m|e3h@Iz%Z#@}ey@=oDfB@J#3@Rl$/ڡ@$];\@$M>,@y"@}0a??A7@>X$ @L̫ft\@ja:@r!]=Z2K2bח4=0_9^l<2$,@ B @:er#ی!s$j@ H?"?$R nF&BwE@+@wcA!@2q?w ;جL4]ME`MhmJ@G`U4@s@%Ȍ?@^~?j8Á[m6#o@$`@ޱܰ~@5ӮxS%3@pxh3c\"z1[B@}m0#|:v@0&Kc0@ tc{@r~:FŪ<(#;L.Ĺ<) @S3~ ;\$=;]L_,#"8B0=s]Bf@Y# hq !@&MMf@-/ l`ė L@R@6@$+#,@s@!,X@,%"춫@E_A@SCc4nJmNŰZя,@ HA@G*o_:@SOB۫bF|M쓊Du? iB6 mXKF#"?k\3Cr@3ՐW3'hQ9Gfp%B)Jq|$@˾NUoB?r]:"y&L?zP: ,@o@}D@a|f\d@ lU"Q3`@i 6ҕ\QڿV W%Q?7@f@@@m_<1snX@u`@, G$w:{v!@+\ji*@@t뇖Xz(w] <*7 m@}y8,@q](7xmGM# 2eQ Q]yV<+,I@y[4@r{YR@%w]J3@?4a0yxD\3 f?m=cM?VA(H> <4d m[ِj@oԋR'&S@]ir@k:Nga-5-4/armci/examples/benchmarks/lu/0000755000175000017500000000000012662210430015472 5ustar mbambaga-5-4/armci/examples/benchmarks/lu/armci_multithreaded/0000755000175000017500000000000012662210430021500 5ustar mbambaga-5-4/armci/examples/benchmarks/lu/armci_multithreaded/lu-block-th.c0000644000175000017500000004246212662210430023775 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /************************************************** * LU factorization * * Armci Version * * Block distribution * * Multi-threaded * **************************************************/ #define DEBUG #define DEBUG1_ #define DEBUG2_ #define USE_MUTEX_ #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #include "armci.h" #include "utils.h" #include "message.h" #define MAXRAND 32767.0 #define DEFAULT_N 8 #define DEFAULT_B 2 #define MAX_THREADS 8 /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, th_per_p = 1, nthreads, me = 0, me_th[MAX_THREADS]; thread_t threads[MAX_THREADS]; int proc_bytes, thread_doubles[MAX_THREADS]; int num; int doprint = 1; int d = 0; /* delay */ thread_lock_t mutex; /* function declaration */ void *lu(void *); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_array(int); void print_block_dbg(double *, const char *, int, int, int); void get_remote(double *, int, int); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); main(int argc, char *argv[]) { int i, j, l; int ch; extern char *optarg; int edge; int size; int lu_arg[MAX_THREADS][3]; /* ARMCI */ void **ptr; double **ptr_loc; THREAD_LOCK_INIT(mutex); armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:t:d:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 't': th_per_p = atoi(optarg); break; case 'd': d = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC -tTH_PER_P\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(th_per_p>MAX_THREADS) { th_per_p=MAX_THREADS; if(me==0)printf("Warning: cannot run more than %d threads, adjust MAX_THREADS",MAX_THREADS); } if (d) { fprintf(stderr, "%d: %d\n", me, getpid()); sleep(d); } nthreads = th_per_p * nproc; if(me == 0) { printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d thread(s) per processor, %d threads total\n", th_per_p, nthreads); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nthreads); for (;;) { num_cols = nthreads/num_rows; if (num_rows*num_cols == nthreads) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } num = (nblocks * nblocks)/nthreads; if((num * nthreads) != (nblocks * nblocks)) num++; edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me_th[th_idx]) { A = a[K+K*nblocks]; print_block_dbg(A, "th=%d, idx=%d: before lu0 a[%d]:\n", me_th[th_idx], th_idx, K+K*nblocks); lu0(A, strK, strK); } MT_BARRIER(); /* divide column k by diagonal block */ if(block_owner(K, K) == me_th[th_idx]) D = a[K+K*nblocks]; else { D = buf1; get_remote(D, K, K); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } MT_BARRIER(); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } if(block_owner(I,K) == me_th[th_idx]) A = a[I+K*nblocks]; else { A = buf1; get_remote(A, I, K); } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me_th[th_idx]) { /* parcel out blocks */ if(block_owner(K,J) == me_th[th_idx]) B = a[K+J*nblocks]; else { B = buf2; get_remote(B, K, J); } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } free(buf1); free(buf2); return lu_arg; } void get_remote(double *buf, int I, int J) { int proc_owner; int edge, size; #ifdef USE_MUTEX THREAD_LOCK(mutex); #endif proc_owner = block_owner(I, J) / th_per_p; edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); if (proc_owner == me) memcpy(buf, a[I+J*nblocks], size); else ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); #ifdef USE_MUTEX THREAD_UNLOCK(mutex); #endif } void lu0(double *a, int n, int stride) { int j; int k; int length; double alpha; for (k=0; k #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /** Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /** Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /** Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /** Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/lu/armci_multithreaded/lu-block-th-nbget.c0000644000175000017500000005077012662210430025073 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /************************************************** * LU factorization * * Armci Version * * Block distribution * * Multi-threaded * **************************************************/ #define DEBUG #define DEBUG1_ #define DEBUG2_ #define DEBUG3_ #define USE_MUTEX_ #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDARG_H # include #endif #include "armci.h" #include "utils.h" #include "message.h" #define MAXRAND 32767.0 #define DEFAULT_N 8 #define DEFAULT_B 2 #define MAX_THREADS 8 /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, th_per_p = 1, nthreads, me = 0, me_th[MAX_THREADS]; thread_t threads[MAX_THREADS]; int proc_bytes, thread_doubles[MAX_THREADS]; int num; int doprint = 1; int d = 0; /* delay */ thread_lock_t mutex; FILE *rep[MAX_THREADS]; char fname[] = "threadXX.log"; void report(int th_idx, char *fmt, ...) { #ifdef DEBUG3 va_list ap; va_start(ap, fmt); vfprintf(rep[th_idx], fmt, ap); va_end(ap); #endif } /* function declaration */ void *lu(void *); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_array(int); void print_block_dbg(double *, const char *, int, int, int); void prefetch(double **A, double *buf, int I, int J, int th_idx, armci_hdl_t **hdlp); void get_remote(double *buf, int I, int J, armci_hdl_t **hdlp); int next_block(int th_idx, int bs, int kl, int ci, int cj, int cI, int cJ, int K, int *pI, int *pJ); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); main(int argc, char *argv[]) { int i, j, l; int ch; extern char *optarg; int edge; int size; int lu_arg[MAX_THREADS][3]; /* ARMCI */ void **ptr; double **ptr_loc; THREAD_LOCK_INIT(mutex); armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:t:d:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 't': th_per_p = atoi(optarg); break; case 'd': d = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC -tTH_PER_P\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(th_per_p>MAX_THREADS) { th_per_p=MAX_THREADS; if(me==0)printf("Warning: cannot run more than %d threads, adjust MAX_THREADS",MAX_THREADS); } if (d) { fprintf(stderr, "%d: %d\n", me, getpid()); sleep(d); } nthreads = th_per_p * nproc; if(me == 0) { printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d thread(s) per processor, %d threads total\n", th_per_p, nthreads); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nthreads); for (;;) { num_cols = nthreads/num_rows; if (num_rows*num_cols == nthreads) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } num = (nblocks * nblocks)/nthreads; if((num * nthreads) != (nblocks * nblocks)) num++; edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me_th[th_idx]) { A = a[K+K*nblocks]; lu0(A, strK, strK); } MT_BARRIER(); /* divide column k by diagonal block */ if(block_owner(K, K) == me_th[th_idx]) D = a[K+K*nblocks]; else { D = buf1; hdl1p = NULL; get_remote(D, K, K, &hdl1p); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } MT_BARRIER(); /* prefetch (A1 and B1) */ AB = 0; /* 0 if using A1 and B1 (buf1 and buf2), 1 if A2 and B2 (buf3 and buf4) */ if (next_block(th_idx, bs, kl, kl, kl, K+1, K+1, K, &I, &J)) { report(th_idx, "ij: next %d,%d\n", I, J); /* next block to be computed (I,J) needs blocks A=(I,K) and J=(K,J) */ hdl1p = &hdl1; hdl2p = &hdl2; prefetch(&A1, buf1, I, K, th_idx, &hdl1p); prefetch(&B1, buf2, K, J, th_idx, &hdl2p); } else continue; /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me_th[th_idx]) { /* parcel out blocks */ report(th_idx, "ij: real %d,%d\n", I, J); /* wait for previously prefetched */ A = AB ? A2 : A1; B = AB ? B2 : B1; /* actual wait */ if (hdl1p) ARMCI_Wait(hdl1p); if (hdl2p) ARMCI_Wait(hdl2p); /* prefetch next A and B */ if (next_block(th_idx, bs, kl, i, j+bs, I, J+1, K, &pI, &pJ)) { report(th_idx, "ij: next %d,%d\n", pI, pJ); hdl1p = &hdl1; hdl2p = &hdl2; if (AB) { /* prefetch into A2 and B2 */ prefetch(&A1, buf1, pI, K, th_idx, &hdl1p); prefetch(&B1, buf2, K, pJ, th_idx, &hdl2p); } else { /* prefetch into A1 and B1 */ prefetch(&A2, buf3, pI, K, th_idx, &hdl1p); prefetch(&B2, buf4, K, pJ, th_idx, &hdl2p); } AB = AB ? 0 : 1; } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } free(buf1); free(buf2); free(buf3); free(buf4); } void prefetch(double **A, double *buf, int I, int J, int th_idx, armci_hdl_t **hdlp) { if (block_owner(I,J) == me_th[th_idx]) { *A = a[I+J*nblocks]; *hdlp = NULL; /* local should not ARMCI_Wait */ } else { *A = buf; get_remote(*A, I, J, hdlp); } } void get_remote(double *buf, int I, int J, armci_hdl_t **hdlp) { int proc_owner; int edge, size; #ifdef USE_MUTEX THREAD_LOCK(mutex); #endif proc_owner = block_owner(I, J) / th_per_p; edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); if (proc_owner == me) { memcpy(buf, a[I+J*nblocks], size); *hdlp = NULL; /* local should not ARMCI_Wait */ } else if (*hdlp) ARMCI_NbGet(a[I+J*nblocks], buf, size, proc_owner, *hdlp); else ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); #ifdef USE_MUTEX THREAD_UNLOCK(mutex); #endif } /* returns 1 if there is another block on current processor to be computed for some K * returns 0 otherwise; location of the block is stored in pI, pJ */ int next_block(int th_idx, int bs, int kl, int ci, int cj, int cI, int cJ, int K, int *pI, int *pJ) { int i, j, I, J; j = cj; J = cJ; for (i=ci, I=cI; i #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STRING_H # include #endif #include "armci.h" #include "message.h" /* #define DEBUG */ #define MAXRAND 32767.0 #define DEFAULT_N 8 #define DEFAULT_B 2 #define MAXPROC 256 /* Maximum number of processors */ #define MAXBLOCK 2048 /* Maximum number of blocks in a row/column */ #define ANULL (armci_hdl_t *)NULL /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, me = 0; int proc_bytes; int doprint = 1; /* make it 1 to see the LU decomposition output */ /*funnction declaration */ void lu(int, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_block(); void print_array(int); void get_remote(double *, int, int, armci_hdl_t *); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int main(int argc, char *argv[]) { int i, j; int ch; int edge; int size; /* ARMCI */ void **ptr; double **ptr_loc; armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(me == 0) { printf("\n Using pre_FETCHing \n"); printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nproc); for (;;) { num_cols = nproc/num_rows; if (num_rows*num_cols == nproc) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 2) { for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me) { A = a[K+K*nblocks]; lu0(A, strK, strK); } armci_msg_barrier(); /* divide column k by diagonal block */ if(block_owner(K, K) == me) D = a[K+K*nblocks]; else { D = dbuf; get_remote(D, K, K, NULL); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } armci_msg_barrier(); /* modify subsequent block columns */ t1 = t2 = 0; memset(br, 0, sizeof(br)); memset(bc, 0, sizeof(bc)); for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me) { /* parcel out blocks */ /* Pre-fetch next two blocks that will be required by me */ /* First, identify the next IJ-th block owned by me */ /* This caculation is for block-cyclic distribution */ r = I; c = J + num_cols; if (c >= nblocks) { r = I + num_rows; w = J - (K+1); if (w >= num_cols) c = w%num_cols + (K+1); else c = J; } /* This processor will need the blocks [r,K] and [K, c] next */ /* Now, pre-fetch blocks [r,K] and [K,c] using non-blocking gets*/ if (r < nblocks && c < nblocks) { if (!br[c] && block_owner(K, c) != me) { /* if this block has not been pre-fetched yet and if I already don't own it*/ if (hdl1 == NULL) {/* this is the first time, no previous non-blocking call */ get_remote(bufr[c], K, c, hdl1); } else { if (!ARMCI_Wait(hdl1)) {/* only if previous call with hdl1 returned, then fetch next block */ get_remote(bufr[c], K, c, hdl1); t1 = 1; } } } if (!bc[r] && block_owner(r, K) != me) { if (hdl2 == NULL) get_remote(bufc[r], r, K, hdl2); else { if (!ARMCI_Wait(hdl2)) { get_remote(bufc[r], r, K, hdl2); t2 = 1; } } } } /* end of if (r < nblocks && c < nblocks) */ if(block_owner(I,K) == me) A = a[I+K*nblocks]; else { if (!t1) get_remote(bufc[I], I, K, NULL); /* This is the first time, so make a blocking call */ A = bufc[I]; bc[I] = 1; } if(block_owner(K,J) == me) B = a[K+J*nblocks]; else { if (!t2) get_remote(bufr[J], K, J, NULL); /* This is the first time, so make a blocking call */ B = bufr[J]; br[J] = 1; } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } ARMCI_Free_local(dbuf); ARMCI_Free_local(bufr); ARMCI_Free_local(bufc); } void get_remote(double *buf, int I, int J, armci_hdl_t *handle) { int proc_owner; int edge, size; int rc; proc_owner = block_owner(I, J); edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); if (handle == NULL) {/* do a blocking get */ ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); } else { if ((rc = ARMCI_NbGet(a[I+J*nblocks], buf, size, proc_owner, handle))) /* do a non-blocking get */ ARMCI_Error("Error in ARMCI_NbGet", rc); } } void lu0(double *a, int n, int stride) { int j; int k; /*int length;*/ double alpha; for (k=0; k #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /** Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /** Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /** Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /** Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/lu/armci_nonblocking/lu_nb_put.c0000644000175000017500000003467112662210430023316 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /************************************************** * LU factorization * * Armci Version * **************************************************/ /***************** Non-blocking Version Pre-PUTing ******************/ #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STRING_H # include #endif #include "armci.h" #include "message.h" /*#define DEBUG*/ #define MAXRAND 32767.0 #define DEFAULT_N 8 #define DEFAULT_B 2 #define MAXPROC 256 /* Maximum number of processors */ /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, me = 0; int proc_bytes; int doprint = 0; /* make it 1 to see LU decomposition output */ /* Buffers for pre-fetched data */ double **bufr, **bufc; /* function declaration */ void lu(int, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_block(); void print_array(int); void get_remote(double *, int, int); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int main(int argc, char *argv[]) { int i, j; int ch; int edge; int size; /* ARMCI */ void **ptr; double **ptr_loc; void **bufr_g, **bufc_g; armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(me == 0) { printf("\nUsing pre-PUTing\n"); printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nproc); for (;;) { num_cols = nproc/num_rows; if (num_rows*num_cols == nproc) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me) { A = a[K+K*nblocks]; lu0(A, strK, strK); /* impl algo on this diag block */ } armci_msg_barrier(); /* divide column k by diagonal block */ if(block_owner(K, K) == me) D = a[K+K*nblocks]; else { D = dbuf; get_remote(D, K, K); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); /* Pre-put this block to the block-owners of all blocks on the I-th row with a non-blocking put*/ memset (saved, 0, sizeof(saved)); for (m = K+1; m < nblocks; m++) { destp = block_owner (I, m); if (destp != me && !saved[destp]) { ARMCI_NbPut(A, bufc[destp*nblocks + I], strI*strK*sizeof(double), destp, NULL); saved[destp] = 1; } } } } /* end of for (i=k1, I=K+1...) */ /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); /* Pre-put this block to the block-owners of all blocks on the J-th column with a non-blocking put*/ memset (saved, 0, sizeof(saved)); for (m = K+1; m < nblocks; m++) { destp = block_owner (m, J); if (destp != me && !saved[destp]) { ARMCI_NbPut(A, bufr[destp*nblocks + J], strK*strJ*sizeof(double), destp, NULL); saved[destp] = 1; } } } } ARMCI_WaitAll(); ARMCI_AllFence(); armci_msg_barrier(); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me) { /* parcel out blocks */ if(block_owner(I,K) == me) A = a[I+K*nblocks]; else { A = bufc[me*nblocks+I]; } if(block_owner(K,J) == me) B = a[K+J*nblocks]; else B = bufr[me*nblocks + J]; C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } ARMCI_Free_local(dbuf); } void get_remote(double *buf, int I, int J) { int proc_owner; int edge, size; proc_owner = block_owner(I, J); edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); } /* Function lu0: implements the serial algo on one diag block (*a) */ void lu0(double *a, int n, int stride) { int j; int k; /*int length;*/ double alpha; for (k=0; k #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #include #include "barrier.h" #include "errors.h" #define MAXRAND 32767.0 #define DEFAULT_N 512 #define DEFAULT_P 1 #define DEFAULT_B 16 #define min(a,b) ((a) < (b) ? (a) : (b)) #define MAXTHR 16 barrier_t barrier; pthread_t thread[MAXTHR]; int global_id; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_attr_t attr; int num; /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int n = DEFAULT_N; /* The size of the matrix */ int P = DEFAULT_P; /* Number of processors */ int block_size = DEFAULT_B; /* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ double *rhs; int *proc_bytes; /* Bytes to malloc per processor to hold blocks of A*/ double **last_malloc; /* Starting point of last block of A */ int test_result = 0; /* Test result of factorization? */ int doprint = 0; /* Print out matrix values? */ int dostats = 0; /* Print out individual processor statistics? */ void *SlaveStart(); void OneSolve(int, int, double **, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int BlockOwner(int, int); void lu(int, int, int, int); void InitA(double *); double TouchA(int, int); void PrintA(); void CheckResult(int, double **, double *); void printerr(char *); int main(int argc, char **argv) { int i, j; int ch; int MyNum=0; int proc_num; int edge; int size; int status; while ((ch = getopt(argc, argv, "n:p:b:toh")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'p': P = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 't': test_result = !test_result; break; case 'o': doprint = !doprint; break; case 'h': printf("Usage: LU \n\n"); printf("options:\n"); printf(" -nN : Decompose NxN matrix.\n"); printf(" -pP : P = number of processors.\n"); printf(" -bB : Use a block size of B.\n"); printf(" -t : Test output.\n"); printf(" -o : Print out matrix values.\n"); printf(" -h : Print out command line options.\n\n"); printf("Default: LU -n%1d -p%1d -b%1d\n", DEFAULT_N,DEFAULT_P,DEFAULT_B); exit(0); break; } } printf("\n"); printf("Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n",n,n); printf(" %d Processors\n",P); printf(" %d by %d Element Blocks\n",block_size,block_size); printf("\n"); printf("\n"); num_rows = (int) sqrt((double) P); for (;;) { num_cols = P/num_rows; if (num_rows*num_cols == P) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } num = (nblocks * nblocks)/P; if((num * P) != (nblocks * nblocks)) num++; edge = n%block_size; if (edge == 0) { edge = block_size; } proc_bytes = (int *) malloc(P*sizeof(int)); last_malloc = (double **) malloc(P*sizeof(double *)); for (i=0;iidlock); */ global_id = 0; pthread_attr_init(&attr); pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); for (i=1; iidlock) */ status = pthread_mutex_lock(&mutex); if(status != 0) err_abort(status, "Lock mutex"); MyNum = global_id; global_id ++; /* UNLOCK(Global->idlock) */ status = pthread_mutex_unlock(&mutex); if(status != 0) err_abort(status, "Unlock mutex"); /* printf("binging..\n"); bindprocessor(BINDTHREAD, pthread_self(), MyNum); printf("binging in %d \n", sysconf(_SC_NPROCESSORS_CONF)); */ /* POSSIBLE ENHANCEMENT: Here is where one might pin processes to processors to avoid migration */ OneSolve(n, block_size, a, MyNum, dostats); return NULL; } void OneSolve(n, block_size, a, MyNum, dostats) double **a; int n; int block_size; int MyNum; int dostats; { int status; /* barrier to ensure all initialization is done */ /* BARRIER(Global->start, P); */ status = barrier_wait (&barrier); if (status > 0) err_abort (status, "Wait on barrier"); /* to remove cold-start misses, all processors touch their own data */ TouchA(block_size, MyNum); /* BARRIER(Global->start, P);*/ status = barrier_wait (&barrier); if (status > 0) err_abort (status, "Wait on barrier"); /* Starting the timer */ if(MyNum == 0) start_timer(); lu(n, block_size, MyNum, dostats); /* BARRIER(Global->start, P); */ status = barrier_wait (&barrier); if (status > 0) err_abort (status, "Wait on barrier"); /* Timer Stops here */ if(MyNum == 0) printf("\nRunning time = %f milliseconds.\n\n", elapsed_time()); } void lu0(a, n, stride) double *a; int n; int stride; { int j; int k; /*int length;*/ double alpha; for (k=0; k n) { kl = n; strK = kl - k; } else { strK = bs; } #ifdef DEBUG printf("k = %d, before factorization\n", k); PrintA(); #endif /* factor diagonal block */ diagowner = BlockOwner(K, K); if (diagowner == MyNum) { A = a[K+K*nblocks]; lu0(A, strK, strK); } #ifdef DEBUG printf("k = %d, after factorization\n", k); PrintA(); #endif /* BARRIER(Global->start, P); */ status = barrier_wait (&barrier); if (status > 0) err_abort (status, "Wait on barrier"); /* divide column k by diagonal block */ D = a[K+K*nblocks]; for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } #ifdef DEBUG printf("k = %d, after divide column k by diagonal block\n", k); PrintA(); #endif /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } #ifdef DEBUG printf("k = %d, after modify row k by diagonal block\n", k); PrintA(); #endif /* BARRIER(Global->start, P); */ status = barrier_wait (&barrier); if (status > 0) err_abort (status, "Wait on barrier"); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } /*colowner = BlockOwner(I,K);*/ A = a[I+K*nblocks]; for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (BlockOwner(I, J) == MyNum) { /* parcel out blocks */ B = a[K+J*nblocks]; C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } #ifdef DEBUG printf("k = %d, after modify subsequent block columns\n", k); PrintA(); #endif } } void InitA(rhs) double *rhs; { int i, j; int ii, jj; int edge; int ibs; int jbs, skip; srand48((long) 1); edge = n%block_size; for (j=0; j=0; j--) { for (i=0; i 0.00001) { bogus = 1; max_diff = diff; } } if (bogus) { printf("TEST FAILED: (%.5f diff)\n", max_diff); } else { printf("TEST PASSED\n"); } free(y); } void printerr(s) char *s; { fprintf(stderr,"ERROR: %s\n",s); } ga-5-4/armci/examples/benchmarks/lu/pthreads/errors.h0000644000175000017500000000303512662210430020772 0ustar mbamba#ifndef __errors_h #define __errors_h #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif /** * Define a macro that can be used for diagnostic output from * examples. When compiled -DDEBUG, it results in calling printf * with the specified argument list. When DEBUG is not defined, it * expands to nothing. */ #ifdef DEBUG # define DPRINTF(arg) printf arg #else # define DPRINTF(arg) #endif /** * NOTE: the "do {" ... "} while (0);" bracketing around the macros * allows the err_abort and errno_abort macros to be used as if they * were function calls, even in contexts where a trailing ";" would * generate a null statement. For example, * * if (status != 0) * err_abort (status, "message"); * else * return status; * * will not compile if err_abort is a macro ending with "}", because * C does not expect a ";" to follow the "}". Because C does expect * a ";" following the ")" in the do...while construct, err_abort and * errno_abort can be used as if they were function calls. */ #define err_abort(code,text) do { \ fprintf (stderr, "%s at \"%s\":%d: %s\n", \ text, __FILE__, __LINE__, strerror (code)); \ abort (); \ } while (0) #define errno_abort(text) do { \ fprintf (stderr, "%s at \"%s\":%d: %s\n", \ text, __FILE__, __LINE__, strerror (errno)); \ abort (); \ } while (0) #endif ga-5-4/armci/examples/benchmarks/lu/pthreads/barrier.c0000644000175000017500000001037712662210430021106 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file barrier.c * * This file implements the "barrier" synchronization construct. * * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. * * The barrier_init() and barrier_destroy() functions, * respectively, allow you to initialize and destroy the * barrier. * * The barrier_wait() function allows a thread to wait for a * barrier to be completed. One thread (the one that happens to * arrive last) will return from barrier_wait() with the status * -1 on success -- others will return with 0. The special * status makes it easy for the calling code to cause one thread * to do something in a serial region before entering another * parallel section of code. */ #include #include "errors.h" #include "barrier.h" /** * Initialize a barrier for use. */ int barrier_init (barrier_t *barrier, int count) { int status; barrier->threshold = barrier->counter = count; barrier->cycle = 0; status = pthread_mutex_init (&barrier->mutex, NULL); if (status != 0) return status; status = pthread_cond_init (&barrier->cv, NULL); if (status != 0) { pthread_mutex_destroy (&barrier->mutex); return status; } barrier->valid = BARRIER_VALID; return 0; } /** * Destroy a barrier when done using it. */ int barrier_destroy (barrier_t *barrier) { int status, status2; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; /* * Check whether any threads are known to be waiting; report * "BUSY" if so. */ if (barrier->counter != barrier->threshold) { pthread_mutex_unlock (&barrier->mutex); return EBUSY; } barrier->valid = 0; status = pthread_mutex_unlock (&barrier->mutex); if (status != 0) return status; /* * If unable to destroy either 1003.1c synchronization * object, return the error status. */ status = pthread_mutex_destroy (&barrier->mutex); status2 = pthread_cond_destroy (&barrier->cv); return (status == 0 ? status : status2); } /** * Wait for all members of a barrier to reach the barrier. When * the count (of remaining members) reaches 0, broadcast to wake * all threads waiting. */ int barrier_wait (barrier_t *barrier) { int status, cancel, tmp, cycle; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; cycle = barrier->cycle; /* Remember which cycle we're on */ if (--barrier->counter == 0) { barrier->cycle = !barrier->cycle; barrier->counter = barrier->threshold; status = pthread_cond_broadcast (&barrier->cv); /* * The last thread into the barrier will return status * -1 rather than 0, so that it can be used to perform * some special serial code following the barrier. */ if (status == 0) status = -1; } else { /* * Wait with cancellation disabled, because barrier_wait * should not be a cancellation point. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &cancel); /* * Wait until the barrier's cycle changes, which means * that it has been broadcast, and we don't want to wait * anymore. */ while (cycle == barrier->cycle) { status = pthread_cond_wait ( &barrier->cv, &barrier->mutex); if (status != 0) break; } pthread_setcancelstate (cancel, &tmp); } /* * Ignore an error in unlocking. It shouldn't happen, and * reporting it here would be misleading -- the barrier wait * completed, after all, whereas returning, for example, * EINVAL would imply the wait had failed. The next attempt * to use the barrier *will* return an error, or hang, due * to whatever happened to the mutex. */ pthread_mutex_unlock (&barrier->mutex); return status; /* error, -1 for waker, or 0 */ } ga-5-4/armci/examples/benchmarks/lu/pthreads/barrier.h0000644000175000017500000000252112662210430021103 0ustar mbamba/** @file barrier.h * * This header file describes the "barrier" synchronization * construct. The type barrier_t describes the full state of the * barrier including the POSIX 1003.1c synchronization objects * necessary. * * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. */ #include /** * Structure describing a barrier. */ typedef struct barrier_tag { pthread_mutex_t mutex; /**< Control access to barrier */ pthread_cond_t cv; /**< wait for barrier */ int valid; /**< set when valid */ int threshold; /**< number of threads required */ int counter; /**< current number of threads */ int cycle; /**< alternate wait cycles (0 or 1) */ } barrier_t; #define BARRIER_VALID 0xdbcafe /** * Support static initialization of barriers */ #define BARRIER_INITIALIZER(cnt) \ {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, \ BARRIER_VALID, cnt, cnt, 0} /** * Define barrier functions */ extern int barrier_init (barrier_t *barrier, int count); extern int barrier_destroy (barrier_t *barrier); extern int barrier_wait (barrier_t *barrier); ga-5-4/armci/examples/benchmarks/lu/pthreads/timing.c0000644000175000017500000000235412662210430020743 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * Copyright (c) 1995 by PDCL Corporation. All Rights Reserved. * * NAME * timing.c * PURPOSE * Timing routines for calculating the execution time: * void start_timer(void); Set the timer. * double elapsed_time(void); Return the timing elapsed since * the timer has been set. * NOTES * Jialin Ju - Oct 16, 1995 Created. */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /** Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /** Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /** Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /** Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/lu/armci_blocking/0000755000175000017500000000000012662210430020435 5ustar mbambaga-5-4/armci/examples/benchmarks/lu/armci_blocking/lu.c0000644000175000017500000003731412662210430021231 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /************************************************** * LU factorization * * Armci Version * **************************************************/ #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #include "armci.h" #include "message.h" /*#define DEBUG*/ #define MAXRAND 32767.0 #define DEFAULT_N 1500 #define DEFAULT_B 16 /*#define MPI2_ONESIDED*/ /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, me = 0; int proc_bytes; int doprint = 0; double comm_time=0.0; int get_cntr=0; /* ARMCI */ void **ptr; #ifdef MPI2_ONESIDED MPI_Win win; #endif /* function declaration */ void lu(int, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_block(); void print_array(int); void get_remote(double *, int, int); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int main(int argc, char *argv[]) { int i, j; int ch; int edge; int size; int nloop=5; double **ptr_loc; armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(me == 0) { printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nproc); for (;;) { num_cols = nproc/num_rows; if (num_rows*num_cols == nproc) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me) { A = a[K+K*nblocks]; lu0(A, strK, strK); } armci_msg_barrier(); /* divide column k by diagonal block */ if(block_owner(K, K) == me) D = a[K+K*nblocks]; else { D = buf1; get_remote(D, K, K); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } armci_msg_barrier(); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } if(block_owner(I,K) == me) A = a[I+K*nblocks]; else { A = buf1; get_remote(A, I, K); } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me) { /* parcel out blocks */ if(block_owner(K,J) == me) B = a[K+J*nblocks]; else { B = buf2; get_remote(B, K, J); } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } free(buf1); free(buf2); } void get_remote(double *buf, int I, int J) { int proc_owner; int edge, size; double t1; proc_owner = block_owner(I, J); edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); t1 = armci_timer(); #ifdef MPI2_ONESIDED { int target_disp = ( ((char*)(a[I+J*nblocks])) - ((char*)(ptr[proc_owner])) ); if(target_disp<0) { printf("ERROR!: target disp is < 0, target_disp= %d\n", target_disp); MPI_Abort(MPI_COMM_WORLD, 1); } MPI_Win_lock(MPI_LOCK_EXCLUSIVE, proc_owner, 0, win); MPI_Get(buf, size, MPI_CHAR, proc_owner, target_disp, size, MPI_CHAR, win); MPI_Win_unlock(proc_owner, win); } #else ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); #endif comm_time += armci_timer() - t1; get_cntr++; } void lu0(double *a, int n, int stride) { int j; int k; /*int length;*/ double alpha; for (k=0; k #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #include "armci.h" #include "message.h" #define DEBUG_ #define MAXRAND 32767.0 #define DEFAULT_N 512 #define DEFAULT_B 16 /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, me = 0; int proc_bytes; int num; int nnodes; int doprint = 0; /* function declaration */ void lu(int, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_block(); void print_array(int); void get_remote(double *, int, int); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int main(int argc, char *argv[]) { int i, j; int ch; int edge; int size; /* ARMCI */ void **ptr; double **ptr_loc; armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(me == 0) { printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } /* num_rows = (int) sqrt((double) nproc); */ /* for (;;) { */ /* num_cols = nproc/num_rows; */ /* if (num_rows*num_cols == nproc) */ /* break; */ /* num_rows--; */ /* } */ nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } nnodes = nproc / 4; if((nnodes * 4) != nproc) { num_cols = nproc - nnodes * 4; nnodes++; num_rows = 1; } else { num_cols = 2; num_rows = 2; } num = (nblocks * nblocks)/nnodes; if((num * nnodes) != (nblocks * nblocks)) num++; #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me) { A = a[K+K*nblocks]; lu0(A, strK, strK); } armci_msg_barrier(); /* divide column k by diagonal block */ if(block_owner(K, K) == me) D = a[K+K*nblocks]; else { D = buf1; get_remote(D, K, K); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } armci_msg_barrier(); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } if(block_owner(I,K) == me) A = a[I+K*nblocks]; else { A = buf1; get_remote(A, I, K); } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me) { /* parcel out blocks */ if(block_owner(K,J) == me) B = a[K+J*nblocks]; else { B = buf2; get_remote(B, K, J); } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } free(buf1); free(buf2); } void get_remote(double *buf, int I, int J) { int proc_owner; int edge, size; proc_owner = block_owner(I, J); edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); } void lu0(double *a, int n, int stride) { int j; int k; /*int length;*/ double alpha; for (k=0; k #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #endif #include "armci.h" #include "message.h" #define DEBUG_ #define MAXRAND 32767.0 #define DEFAULT_N 1500 #define DEFAULT_B 16 /* global variables */ int n = DEFAULT_N; /* The size of the matrix */ int block_size = DEFAULT_B;/* Block dimension */ int nblocks; /* Number of blocks in each dimension */ int num_rows; /* Number of processors per row of processor grid */ int num_cols; /* Number of processors per col of processor grid */ double **a; /* a = lu; l and u both placed back in a */ int nproc, me = 0; int proc_bytes; int num; int doprint = 0; /* function declaration */ void lu(int, int, int); void lu0(double *,int, int); void bdiv(double *, double *, int, int, int, int); void bmodd(double *, double*, int, int, int, int); void bmod(double *, double *, double *, int, int, int, int, int, int); void daxpy(double *, double *, int, double); int block_owner(int, int); void init_array(); double touch_array(int, int); void print_block(); void print_array(int); void get_remote(double *, int, int); /* timing functions */ extern void start_timer(void); extern double elapsed_time(void); extern double stop_time(void); int main(int argc, char *argv[]) { int i, j; int ch; int edge; int size; /* ARMCI */ void **ptr; double **ptr_loc; armci_msg_init(&argc,&argv); nproc = armci_msg_nproc(); me = armci_msg_me(); while ((ch = getopt(argc, argv, "n:b:p:h")) != -1) { switch(ch) { case 'n': n = atoi(optarg); break; case 'b': block_size = atoi(optarg); break; case 'p': nproc = atoi(optarg); break; case 'h': { printf("Usage: LU, or \n"); printf(" LU -nMATRIXSIZE -bBLOCKSIZE -pNPROC\n"); armci_msg_barrier(); armci_msg_finalize(); exit(0); } } } if(me == 0) { printf("\n Blocked Dense LU Factorization\n"); printf(" %d by %d Matrix\n", n, n); printf(" %d Processors\n", nproc); printf(" %d by %d Element Blocks\n", block_size, block_size); printf("\n"); } num_rows = (int) sqrt((double) nproc); for (;;) { num_cols = nproc/num_rows; if (num_rows*num_cols == nproc) break; num_rows--; } nblocks = n/block_size; if (block_size * nblocks != n) { nblocks++; } num = (nblocks * nblocks)/nproc; if((num * nproc) != (nblocks * nblocks)) num++; edge = n%block_size; if (edge == 0) { edge = block_size; } #ifdef DEBUG if(me == 0) for (i=0;i n) { kl = n; strK = kl - k; } else { strK = bs; } /* factor diagonal block */ diagowner = block_owner(K, K); if (diagowner == me) { A = a[K+K*nblocks]; lu0(A, strK, strK); } armci_msg_barrier(); /* divide column k by diagonal block */ if(block_owner(K, K) == me) D = a[K+K*nblocks]; else { D = buf1; get_remote(D, K, K); } for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } A = a[I+K*nblocks]; bdiv(A, D, strI, strK, strI, strK); } } /* modify row k by diagonal block */ for (j=kl, J=K+1; j n) { jl = n; strJ = jl - j; } else { strJ = bs; } A = a[K+J*nblocks]; bmodd(D, A, strK, strJ, strK, strK); } } armci_msg_barrier(); /* modify subsequent block columns */ for (i=kl, I=K+1; i n) { il = n; strI = il - i; } else { strI = bs; } if(block_owner(I,K) == me) A = a[I+K*nblocks]; else { A = buf1; get_remote(A, I, K); } for (j=kl, J=K+1; j n) { jl = n; strJ= jl - j; } else { strJ = bs; } if (block_owner(I, J) == me) { /* parcel out blocks */ if(block_owner(K,J) == me) B = a[K+J*nblocks]; else { B = buf2; get_remote(B, K, J); } C = a[I+J*nblocks]; bmod(A, B, C, strI, strJ, strK, strI, strK, strI); } } } } free(buf1); free(buf2); } void get_remote(double *buf, int I, int J) { int proc_owner; int edge, size; proc_owner = block_owner(I, J); edge = n%block_size; if (edge == 0) { edge = block_size; } if ((I == nblocks-1) && (J == nblocks-1)) { size = edge*edge; } else if ((I == nblocks-1) || (J == nblocks-1)) { size = edge*block_size; } else { size = block_size*block_size; } size = size * sizeof(double); ARMCI_Get(a[I+J*nblocks], buf, size, proc_owner); } void lu0(double *a, int n, int stride) { int j; int k; /*int length;*/ double alpha; for (k=0; k #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /** Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /** Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /** Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /** Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/lu/README0000644000175000017500000000020412662210430016346 0ustar mbambaThis directory contains example programs using ARMCI At present time, SPLASH-2 LU factorization on top of ARMCI is included (lu.c). ga-5-4/armci/examples/benchmarks/RandomAccess/0000755000175000017500000000000012662210430017414 5ustar mbambaga-5-4/armci/examples/benchmarks/RandomAccess/smp_bucket/0000755000175000017500000000000012662210430021550 5ustar mbambaga-5-4/armci/examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.c0000644000175000017500000002140112662210430024046 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #include "armci.h" #include "message.h" #include "../ra_common.h" #define DEBUG 0 static int me, nproc,nsmp; static u64Int procnumupdates,myglobalstart,globaltablelen,mytablelen,mintablesize,*procglobalstart; static int bigtables,Remainder; static int *armcismpid; static int my_free_handle; FILE *fd; u64Int **HPCC_Table; struct vector_dscr_t{ int active; int dstproc; int dstsmp; u64Int **xmitbuffer; struct vector_dscr_t *next; armci_giov_t a_v; }; struct vector_dscr_t *vec_dscr; static struct vector_dscr_t curdscr_val; struct vector_dscr_t *curdscr_ptr = &curdscr_val; static armci_hdl_t* _get_next_handle() { my_free_handle++; my_free_handle %= MAX_OUTSTANDING_HANDLES; } /* from hpcc RandomAccess/utility.c */ static u64Int HPCC_starts(s64Int n) { int i,j; u64Int temp,ran,m2[64]; while (n < 0) n += PERIOD; while (n > PERIOD) n -= PERIOD; if (n == 0) return 0x1; temp = 0x1; for (i=0; i<64; i++) { m2[i] = temp; temp = (temp << 1) ^ ((s64Int) temp < 0 ? POLY : 0); temp = (temp << 1) ^ ((s64Int) temp < 0 ? POLY : 0); } for (i=62; i>=0; i--) if ((n >> i) & 1) break; ran = 0x2; while (i > 0) { temp = 0; for (j=0; j<64; j++) if ((ran >> j) & 1) temp ^= m2[j]; ran = temp; i -= 1; if ((n >> i) & 1) ran = (ran << 1) ^ ((s64Int) ran < 0 ? POLY : 0); } return ran; } static void xmitsmpvector(){ struct vector_dscr_t *tmp=curdscr_val.next, *tmp1; int mysmpid = armcismpid[me]; u64Int myscale=0; curdscr_ptr = &curdscr_val; #if DEBUG printf("\n%d:in xmitsmpvector dstproc=%d dstsmp=%d mysmp=%d\n",me,tmp->dstproc,tmp->dstsmp,mysmpid);fflush(stdout); #endif while(tmp!=NULL){ if(tmp->dstsmp!=mysmpid) ARMCI_NbAccV(ARMCI_ACC_RA,&myscale,&tmp->a_v,1,tmp->dstproc,NULL); tmp=tmp->next; } tmp=curdscr_val.next; #if DEBUG printf("\n%d:in xmitsmpvector1 dstproc=%d\n",me,tmp->dstproc);fflush(stdout); #endif while(tmp!=NULL){ if(tmp->dstsmp==mysmpid) ARMCI_AccV(ARMCI_ACC_RA,&myscale,&tmp->a_v,1,tmp->dstproc); tmp=tmp->next; } tmp=curdscr_val.next; #if DEBUG printf("\n%d:in xmitsmpvector2 dstproc=%d\n",me,tmp->dstproc);fflush(stdout); #endif while(tmp!=NULL){ tmp->active=0; tmp->a_v.ptr_array_len=0; tmp1=tmp->next; tmp->next=NULL; tmp = tmp1; } #if DEBUG printf("\n%d:in xmitsmpvector done\n",me);fflush(stdout); #endif } static void addtosmpvector(u64Int ran){ u64Int offset; int proc,smpid; struct vector_dscr_t *tmp; offset = ran & (globaltablelen-1); if(offset < bigtables) proc=offset/(mintablesize+1); else proc=(offset-Remainder)/mintablesize; /*if(vec_dscr[]);*/ smpid = armcismpid[proc]; #if DEBUG printf("\n%d:adding ran=%d offset=%d proc=%d smpid=%d\n",me,ran,offset,proc,smpid);fflush(stdout); #endif tmp =&vec_dscr[smpid]; if(!tmp->active){ tmp->active = 1; tmp->next = NULL; curdscr_ptr->next = tmp; curdscr_ptr = tmp; } *(u64Int *)tmp->a_v.src_ptr_array[tmp->a_v.ptr_array_len]=ran; tmp->a_v.dst_ptr_array[tmp->a_v.ptr_array_len]=(void *)(HPCC_Table[proc]+(offset-procglobalstart[proc])); tmp->a_v.ptr_array_len+=1; #if DEBUG printf("\n%d:added ran=%d smpid=%d ptrarrlen=%d\n",me,ran,smpid,tmp->a_v.ptr_array_len);fflush(stdout); #endif } void HPCCRandom_Access() { int i; u64Int ran; ran = HPCC_starts (4 * myglobalstart); for(i=0;i simple.x inpfile\n"); fflush(stdout); } ARMCI_Finalize(); armci_msg_finalize(); return 0; } globaltablelen = atoi(argv[1]); mintablesize = globaltablelen/nproc; Remainder = globaltablelen - mintablesize*nproc; bigtables = (mintablesize+1)*Remainder; if(me #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif /* Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /* Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /* Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /* Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } ga-5-4/armci/examples/benchmarks/RandomAccess/simple/0000755000175000017500000000000012662210430020705 5ustar mbambaga-5-4/armci/examples/benchmarks/RandomAccess/simple/simple.c0000644000175000017500000001740212662210430022346 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if HAVE_FCNTL_H # include #endif #include "armci.h" #include "message.h" #include "../ra_common.h" #define DEBUG 0 static int me, nproc; static u64Int procnumupdates,myglobalstart,globaltablelen,mytablelen,mintablesize,*procglobalstart; static int bigtables,Remainder; static int my_free_handle; FILE *fd; u64Int **HPCC_Table; struct vector_dscr_t{ int active; int dstproc; u64Int **xmitbuffer; struct vector_dscr_t *next; armci_giov_t a_v; }; struct vector_dscr_t *vec_dscr; static struct vector_dscr_t curdscr_val; struct vector_dscr_t *curdscr_ptr = &curdscr_val; static armci_hdl_t* _get_next_handle() { my_free_handle++; my_free_handle %= MAX_OUTSTANDING_HANDLES; } /* from hpcc RandomAccess/utility.c */ static u64Int HPCC_starts(s64Int n) { int i,j; u64Int temp,ran,m2[64]; while (n < 0) n += PERIOD; while (n > PERIOD) n -= PERIOD; if (n == 0) return 0x1; temp = 0x1; for (i=0; i<64; i++) { m2[i] = temp; temp = (temp << 1) ^ ((s64Int) temp < 0 ? POLY : 0); temp = (temp << 1) ^ ((s64Int) temp < 0 ? POLY : 0); } for (i=62; i>=0; i--) if ((n >> i) & 1) break; ran = 0x2; while (i > 0) { temp = 0; for (j=0; j<64; j++) if ((ran >> j) & 1) temp ^= m2[j]; ran = temp; i -= 1; if ((n >> i) & 1) ran = (ran << 1) ^ ((s64Int) ran < 0 ? POLY : 0); } return ran; } static void xmitvector(){ struct vector_dscr_t *tmp=curdscr_val.next, *tmp1; u64Int myscale=0; curdscr_ptr = &curdscr_val; while(tmp!=NULL){ if(tmp->dstproc!=me) ARMCI_NbAccV(ARMCI_ACC_RA,&myscale,&tmp->a_v,1,tmp->dstproc,NULL); tmp=tmp->next; } tmp=curdscr_val.next; while(tmp!=NULL){ if(tmp->dstproc==me) ARMCI_AccV(ARMCI_ACC_RA,&myscale,&tmp->a_v,1,tmp->dstproc); tmp=tmp->next; } tmp=curdscr_val.next; while(tmp!=NULL){ tmp->active=0; tmp->a_v.ptr_array_len=0; tmp1=tmp->next; tmp->next=NULL; tmp = tmp1; } } static void addtovector(u64Int ran){ u64Int offset; int proc; struct vector_dscr_t *tmp; offset = ran & (globaltablelen-1); if(offset < bigtables) proc=offset/(mintablesize+1); else proc=(offset-Remainder)/mintablesize; tmp =&vec_dscr[proc]; if(!tmp->active){ tmp->active = 1; tmp->next = NULL; curdscr_ptr->next = tmp; curdscr_ptr = tmp; } *(u64Int *)tmp->a_v.src_ptr_array[tmp->a_v.ptr_array_len]=ran; tmp->a_v.dst_ptr_array[tmp->a_v.ptr_array_len]=(void *)(HPCC_Table[proc]+(offset-procglobalstart[proc])); tmp->a_v.ptr_array_len+=1; } void HPCCRandom_Access() { int i; u64Int ran; ran = HPCC_starts (4 * myglobalstart); for(i=0;i simple.x inpfile\n"); fflush(stdout); } ARMCI_Finalize(); armci_msg_finalize(); return 0; } globaltablelen = atoi(argv[1]); mintablesize = globaltablelen/nproc; Remainder = globaltablelen - mintablesize*nproc; bigtables = (mintablesize+1)*Remainder; if(me> endobj 3 0 obj << /D [1 0 R /XYZ null 53 null] >> endobj 4 0 obj << /D [1 0 R /XYZ null 727 null] >> endobj 5 0 obj << /D [1 0 R /XYZ null 700 null] >> endobj 6 0 obj << /D [1 0 R /XYZ null 684 null] >> endobj 7 0 obj << /D [1 0 R /XYZ null 668 null] >> endobj 8 0 obj << /D [1 0 R /XYZ null 652 null] >> endobj 9 0 obj << /D [1 0 R /XYZ null 638 null] >> endobj 10 0 obj << /D [1 0 R /XYZ null 609 null] >> endobj 11 0 obj << /D [1 0 R /XYZ null 588 null] >> endobj 12 0 obj << /D [1 0 R /XYZ null 308 null] >> endobj 13 0 obj << /CreationDate (D:191001102164319) /Producer (\376\377\000A\000c\000r\000o\000b\000a\000t\000 \000D\000i\000s\000t\000i\000l\000l\000e\000r\000 \0003\000.\0000\0002) /Title (Untitled Document) /Creator (FrameMaker 5.5P4f) >> endobj 14 0 obj << /D [1 0 R /XYZ null null null] >> endobj 15 0 obj << /D [1 0 R /XYZ null null null] >> endobj 16 0 obj << /I << /Title (A) >> /F 17 0 R >> endobj 18 0 obj << /Length 4648 /Filter /FlateDecode >> stream HWK#X4ߏy7Hb#I.zȖX"קjJq `ĮLJׯ)1yؾ~DMib,΢2Y5y8~aoٝׯ$|sJSEM*qTUJL,Kk?3ᦎsQan4ʂ%$*a\y 8؅0#j3c)D=dn ƉyT  ΢0I8SYtQĹz4aMFg~5N&']pӈD$LC7aLHWY3k:?*SJe ܕqZҜ/LI*W2:TvbңI #cK`RX|WϾ8 4ʈΛUĤވJ%9Æi@ǖ؆){]O`OcX쟜@NMO`@ÃyTJ1VkzSSQܘI&jq鿅 , X>%òmc vs(4EU&* kęnUT7OEXhBA`qEy}wO .Q8lȧ#^HQ$V&;[4 sPӏ"_ Ln}Ӣ^ o/x>7*zޝ٩" sǐk?8VMDcZi?:s K6r&2ܑ#$є\)5\* c;?7bH5j9WYf;[6%I6~w͙)#rU''+/48P'06V).$=/?HG\-ʞIkEy ׀ZE'G%Eͷ8.hvbi1ȣ *E=vceՅ,[._89`nY%9:<^ DKBy7RRվsr\DȆ_kP"ˇx ~ؙ (pq"#Qr"sT9|b (x݋vw⤂%"x/VN^0(iT}EfxReOad J ZQҰT$9ᰄ5Q!JO}T-{-@qwo2/fhyt*W}k!GEeݿV JꯒQoy<1Z1CX[HfKjY+ճ^ i{Q\l( 愌v-#r=G/ pDi5GwWw/rH IRESamؿbTEU|8;L=-RÈJ7.Z#ꊰM0*i) yQ64sMU>6)L[5;jOᇭ$s8RI ]Qގ#l0hb(gl 8]𳸣 cζ C!,ćGrWtvA?zsǀ';󂇫Õ؝(X0:&Ta֞eYOœhd(K $V޸N~:{TulϷ: RK{upyc|2C悱{ab>WeKو=Pj 2Y_S։: rTΟl;ٵ7~u)c=Q]d0P(}`xfܵ_˜+7} hDDcu<@RjulQe }׹V`/P)IAP=LuloQ}Tz©b_zhh'GNȋX9";hv >?疱뗲Sf{.nk7RaGCz+U0<'&MG|Ihl-W}bZ}MAe:-(CҚ7?ũ12קhrv߸-ZH0&c?GxD<>g3;7S]AgFIsߖ}C7TJh) M'X|yDLvSndXy`”JPK4-X-GHE#u;aK/4A?G0RZzQMNRK 6F@r̍0&zTȍo0B ʚϋD +OmSev kCa~ͭFUH "j KH]sr-Ƞ3UwPG3hWb/}AoWϴ[*^/V | \Ӻ\?3D~ez"<]dSYv8`A: OK;DRs"U `Dm'%)3EȚ Rgı s(-{[.~=XH{\ǧu ȩr2<ϯwabs--br*į\;߲}G[:?99%od @BS^i1&*pZdAd0M J{܉i}x/H}b2tyA(:}-pi'pϧ^ r*ٛc*ۤ0)P^vA*HWu%eWpp9`GvXA2nL6;]UB 쮯aNZ]-“IN% +P-"Y*2J ,ZۆewqVma S2Fa|wjHlNz:|2g8͘3W/:*S؁pEkx'pD\q*&'(}aݜn i ڥ7S);n/gz:꺓!ӄ"n?\0Gvnс75no]:lq# cn:ot<5K cmBQ21{lM2^16-ՎBjg2o:EnFM NJ"4ME?ݸYhG9mVacB }W6Ao]Ee2p[MX4CN1k75^4QZ4J`ybi$6֬ګeYiV-m8K\u E׾mޖDָO;6_rmx(^tk =d~S>DWS%  endstream endobj 19 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 26 0 obj << /D [25 0 R /XYZ null 730 null] >> endobj 27 0 obj << /D [25 0 R /XYZ null 580 null] >> endobj 28 0 obj << /D [25 0 R /XYZ null 339 null] >> endobj 29 0 obj << /D [25 0 R /XYZ null 279 null] >> endobj 30 0 obj << /D [25 0 R /XYZ null 211 null] >> endobj 31 0 obj << /D [25 0 R /XYZ null 193 null] >> endobj 32 0 obj << /D [25 0 R /XYZ null 146 null] >> endobj 33 0 obj << /D [25 0 R /XYZ null null null] >> endobj 35 0 obj << /Length 4997 /Filter /FlateDecode >> stream HWKoF0bćHq&Y0Ƙ12CjICKoU}ՒI~|ϗ~96yٽWFen'2VIWQY/b?ꥒIIeiZ|-ļ2)vAq\ȍ!\GE~/_C]k[ʊZM| ޸+QO݁5erg;T^ Oy}>:g>*/tØ] 3d[~=Jr[sT=R8tc#삍1386ud0-U#Gidjb{U (9zTOࠣBIkî峸zsЪEґBw&}3 PB6SGk蓰>GPɍ8|$rL:5;AZdCjWgyT!c%ZpgdwH>Pp|r$PH\lxQ5䚱(l \%V =ƃWj%Fݽ_ f1HJdmnzY9-XK BౝmB*h1WΊsw|! x (72 @ {*R2FWc BityLrFfHsP'xc}Z՗:Y/҃(Ia%<+ЖqFG=P.VbW;߷ Tj] ~$/78/ipwYGdWf]8ackJ2N057LQ H+-5ssʗ^̰7'a"=mɌ[VF%?̀A40:@W~/]ohp2 ٫ #nhb9Vt%7&ʯ G>#PLv_$C 7U,Ԃq߽}q DNGJ&JHʲk1A^+w4_MeĀ%H2y9Bf/T1RXj!JW=wLZ"WwTtuH!ʥ /?̡S/ "Jz#۹P- ` {[ac4g:F|EރQ\2VrJswpu6`duf?w?D IʸJug>P ^Gw -?QO k͖~J*FV\v9uz3 )-[Ď-`qaBr-{"ݪDn{ן44O5 -JO8QRh,ZK(Mh"6f%;bSZmՁl)reZэvdm朡6O}봁hn&Dxi+@7V zmF{'iz9 }vcpKTb9LDBX$cHj[Vg4T,ZrO4VUsϗZ>"@ cˑL80[A}*J)0GSQ*qkc:xg3T-hŮ|[/đSm?U8rC(m%m 0`\dVFY/K;4VUHV1C t.@?! >H{ERꪄr{ ^eS6 ==Є\P ůVhiq\Xt_0A.5i޽?3=侃bZl蛡Z`cIjHޖ;АPi-*tv~!Vj›ݠd -G@%nTčJ΂TjBoݠաW*cWصo"0k,hOKADi~!_݇wrve>8݃7_{N5olU:UIKǸ`MW޻Ժ{jw]k9nv!tNߥ{܇=>m?/o YfڮaڛWk̹*tFEN-YC%rFTpмֻo红%kݔ9+"i1kŋ w +?Z/Eunf#+noX7$XT!4ko>ӻo9(U:  R)Rt@cEN8mX-I1}IYZ[\3ϵEO<<(Y3nC$?Kn%SU*[j}>*0z?J.*X}_k_9*i/;Gasp"1'Kp %t I5~-ȣ0zq–3[ 4r6)Ev[Aa S\h;5[O$,np\d4dӣ|pW 9B=X˵~^4*q7gUքʒ[.9EOG\E{} l!8<~;p*9P!(5q8 ]Q>dD'PfD~jǩk+ogӘeo)6b0S[q4*f%} Ib.8IR7ʾ:ȽN,Q4J7*@W` */AqѐυGﴟmq}^,N]ndoG6D\T~O(u9/ïF0\5 endstream endobj 36 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 38 0 obj << /D [37 0 R /XYZ null 524 null] >> endobj 39 0 obj << /D [37 0 R /XYZ null 511 null] >> endobj 40 0 obj << /D [37 0 R /XYZ null 498 null] >> endobj 41 0 obj << /D [37 0 R /XYZ null 486 null] >> endobj 42 0 obj << /D [37 0 R /XYZ null 473 null] >> endobj 43 0 obj << /D [37 0 R /XYZ null 461 null] >> endobj 44 0 obj << /D [37 0 R /XYZ null 442 null] >> endobj 45 0 obj << /D [37 0 R /XYZ null 405 null] >> endobj 46 0 obj << /D [37 0 R /XYZ null 387 null] >> endobj 47 0 obj << /D [37 0 R /XYZ null 344 null] >> endobj 48 0 obj << /D [37 0 R /XYZ null 587 null] >> endobj 49 0 obj << /D [37 0 R /XYZ null 91 null] >> endobj 50 0 obj << /D [37 0 R /XYZ null null null] >> endobj 34 0 obj << /P 25 0 R /R [63 63 549 729] /V 17 0 R /N 51 0 R >> endobj 52 0 obj << /Length 6752 /Filter /FlateDecode >> stream HWێܸ}7ࣴp)bdׁ . [ݣ/ Q*cbթSUԟn^z2ٿ~ؘW|9~Uϕ9<͖U~UQ;/bkn~EYZO7ۺfy{|g|Gey7MQentg~k"dSiAf!p{|xwt!{~-50{kk\0zuywypTV ͑ t\`;d/k! !G̯֍=vH3R tDI{=4Uk+fi:t7 ~{hf@!(kۙMrW^A KC[ ѕ[PkN4p?Q7ug=F਺2ɀiKNjXsfAxef/ zP̉R#s|8"5Ѯip/r HWphp`:⵶ Tx&H r &/Uꭼ#(2\ v^8z"=v89c)"/W&G^1-ɲO.H<tzb ( h'p"?PfBmԷS(ՙt5 F7Ɩɰq(#YĕKSέן.E'A|- 2x:MDîx"U-v# T+3?73Z :͑4@w 4 X#X4EPW1>RHE6:Sh1\`m:R)]OicX|\h}/| b 녭>uf]FaFcYئ.ʨNi + ;ۘv݂d4g·ᯅ Bj n!64$ jT*-,r@ǂxHJbYD'.% (Ax]@k`9$s.@W@)cK;GD⣲3%^z#DatDaS]BT4uE%lɞVX13@tʱ }PѢNdCVD˜b4: X*j9 pU[KNӀg 9XVnnJN3V@-$+ 5#cit"4iJ,E[`q/N|,:P)|t+n(T@ZֳQ=3%*QNXr"qlN[d)/ `֗HEKL:ehwymEsPqB\/At;l5KQ@NêJe-@OA}^9>+ e$)'C P-sbu*5%m9 ej}lSk $ǜE$h`ǹ1ttkO*ϽpUb XuKX% ڱEA8Et"K!,2瑔^dUp۴-.5_ݚ_^o^zolHomU[d<hxm|ٸƟoWƝޜ^e/l[˭qy~ڮڵfy]o]aj;$ޚCN*;#WGNLqZYZF|fG@o '\@T{M!?ΫG܆ ?;lc!X۽pJA}H>RRU6X`J({,èyx8r>]͎7˩o1giFy=݈Zm0!r4/K JZMTM0Di^a#y4&RH ǢEȽ ǫ1@J~?bٮ{Ag@ܳчtJG7r3]{Ҕ]d7Ȥ\pPnw͟ڽwm'v% I hfmwL qI+xÝ H:H@jta$ը԰`3Ӹ4 !5 1qd= V4#bz&Fצhg!8)QH0;NwuDj x_/ J)P3=ġD};rM]Q27({l;%XJ+efV&Nt p!x$h=tv,2kl[T*Vπ&>.VRA9=[iҷZԬX.ڒBLqz_*$wɳ}ێQ<ދq*^Ql1|LjbbA^ޫJa @R%e}YDmQxhJ;$Œ|Mz,mNI!o*ɅtЀGCT  PFKECCSTPY[)Y1Syem܏S3IP8(A0CDQy!GR)hyh`@KK}+4 ӌ=2H$*PXifbU&m (j9/389:Ub.zW<9.z h"-ҫZM`|(Х{8 ]w7HR&0BhߪW]Q7I@k;݅Md^FmK7E9Ͳ Awʑ9CM@S5.HvbqvaT1ΙE̠+1 96ɧM ьlgdQoCpflf02PPk%A-0 otۦ# μ-) s9Vx f`ul Kwm(!k9C':AC2f &g7oP[$CjJV1#S@# %@WAJIytmٗif`! 88АxWzH-45c,dbGI6;0yC؍7;l;eCT9v0[ki )3vKH??ƇbN;l;U$ȉnqт6W1i%I#jk h<1 %1jZ(#'<]%`rgBGgݟ/$"wfJhSƂl 8 1~ fZRǶ]Q8%) %`ggEhd~~hqҙdr߹zyybx ɧ/Cri{<'6pq{lv~]~ۍ|oOt!}OUW|J|vLe W~ǟ'&ʾWtDDřZגWK2˒][r@k0.|ry'c |__rWU61]пo_pE ?/0_cdƚ~b,|7G+#ZOq8ۅ+|fJMʹ](hmhtwXGY˪CV;/a~?1, ON ȌMzwU%;ӨNK2ܥs[X;43R+K<2<}xY>x]ҏ7V٨۠ =uR QVhoBM'dVPUї>TyJeP*ml!uh&—b6NiB !cr!]V;߶cv U/۳{^T2”M!M|[/Nu!aٮo3l@״YB$cf hZ,P [1,0Nig Xa.$.vyxc@!K'~HNW5 E۩Q D̖=d#]l&9rPNwI 3KOc Q#.A,b@y9%sfm"Y$ eƥ08i5k4CJ6Nw!$۳0x@/ v E4ofimf$U)к@ś 3&@9T!b*M Į[nö]]1 $:E$T [E*:PtTzъLen?B!O c[JOϫ47PUumTvtXs6: |v:OUr/OrjYY'{ 6IC!yZF@讒ݸaz/.Zlz͡f&,-%ERl MqyG&+*ݹ"r,(e"8C6LlTe4ZW fGlYCi\DUl#A0Vd29KO:nTLB+fwLawu7VʼnhQ4ev> ӬKO̘Q G֦RV}B.sN2e E)@`{0ҋhlf/\lbC(]%\^,ŖFô[a* !ѐt );,((t 0}ZFMl K8 (A8_y 햋3\, !uXPBcUV?! Uֵ` 1(PrF+^m'x .m]mQac\@TҨ׼:_Xae~ R2p|nR>B,9P`HG"iOz@2UeJ` 9 n8 FN*/dd #\@ŷQbA@ sJZFxՂp46d40c% F4lݔLvR#C;pA@bRyRWx=3108}`!kLdEA7Q~BIPֈL /Z` wx ңXEʤ(rlcZBz&[ =-=#Z6rJ$P8*G$HsJUlpp`&/iM6z#UXGJ- g>FFl5rGd@"2Yz/Wx3X1T35cދ z~{?g!@ŗn"m^{gt;0 7TD^?~顽ox7sݵ~Kg|MIyB3;;9)ۓ3=O. R{"]Q{ -écOor.?6\J</rN=zpml 64 PRy:xE]t.Ɛ9J˲sU endstream endobj 53 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 56 0 obj << /D [55 0 R /XYZ null 497 null] >> endobj 57 0 obj << /D [55 0 R /XYZ null 484 null] >> endobj 58 0 obj << /D [55 0 R /XYZ null 471 null] >> endobj 59 0 obj << /D [55 0 R /XYZ null 459 null] >> endobj 60 0 obj << /D [55 0 R /XYZ null 446 null] >> endobj 61 0 obj << /D [55 0 R /XYZ null 434 null] >> endobj 62 0 obj << /D [55 0 R /XYZ null 415 null] >> endobj 63 0 obj << /D [55 0 R /XYZ null 379 null] >> endobj 64 0 obj << /D [55 0 R /XYZ null 350 null] >> endobj 65 0 obj << /D [55 0 R /XYZ null 307 null] >> endobj 66 0 obj << /D [55 0 R /XYZ null 270 null] >> endobj 67 0 obj << /D [55 0 R /XYZ null 251 null] >> endobj 68 0 obj << /D [55 0 R /XYZ null 155 null] >> endobj 69 0 obj << /D [55 0 R /XYZ null 137 null] >> endobj 70 0 obj << /D [55 0 R /XYZ null 121 null] >> endobj 71 0 obj << /D [55 0 R /XYZ null 104 null] >> endobj 72 0 obj << /D [55 0 R /XYZ null 563 null] >> endobj 73 0 obj << /D [55 0 R /XYZ null null null] >> endobj 51 0 obj << /P 37 0 R /R [63 63 549 729] /V 34 0 R /N 74 0 R >> endobj 75 0 obj << /Length 9368 /Filter /FlateDecode >> stream HW[۸~LmEu>%iRشE>,-G->n9qגּj}T>\$S. LϟjŪ݀UE=cJE2ASq$I_6(&;׮٨C_d>"6D')7Q6Q cljou;_D ; ̟ m׺tֳMWC4KHZ ;X-ݙ@7uy{!(Pއ6P ->WB2 r*>kd>qEj/J|(VX- ?V(2MEwbIieB4BW_>n 1x4\$gK(}mu EEg@-+9{?F( ,&bT r<)F%hu[n_Ne>.i%4oF1#[wՊL1@]Ԁ ?7`HJVnzsxb }Y-}3n'NL‰U)OL4H6 -1q-9xCy#P]-A+ pCsFt*C(MI &iCpH*1E06%+Yz~[4^a+t6@hi/BYI=c;aǦ-xtd:5w "VP7SomRYoSo|PU,r EqzՇ#7WBw7Eex%`d?GڧJ1^пكA}im1([CpU.ҺMaB#\{lgraڊG`K9et-uH ujd1Qu@O[ D1>)$:ޥcdy q=(0KQ |=.ѱ}RI~ݻr/>rj+~za8*H0V]֏(|Rkv\:'8RCX:_5m+d(0O6R)u{ J,:(̏Rm)_F*Y:oo.Λ̖lxڿ iNb{6.=Lpg>ߺ 2+7ۃl۱,*чPM%bPZ,`Rq/9穦\MuTq5+b:l],0/:Tp@Y1sID&I& *b?g1d""󱣄}e u]@~bȷz!Q}G׈q2ʂЎLHq|b}3b xLЖ{4r0/śaZ5ڞol#^"`XQjor1DR+bGpEl߾d@αЉ(TW.-y0.@͆~A%cs%\n'"l=_:˜T}4ԍeL2h]0+ 3+c1.$AmQ#̶G8κʹǬTqd'bqrY+$))ȇ硎;ߓ4AsHJ@Zm+s Dd8!N$*FpiW [`A\E,İ5 3 o1 |偅 v@l18GphOF*RofC 5D"k6JnV $+IG{ !CϻicG61obaB6eAh;jA;<ћ xw@7 F;T4XG-70;Xjo),zE$ɇsc9@5ƌ >>2]Ou50׽Rf O6GT UaSm,u75<[l. ?^PmWAaV^C) %ޱ®Ԧ#ѯQ:RzߍIv)ۏ*6!TbUDY1(3}BLZP)cW9Pjl͟}҂FXyuc بQt%ӍB9ND)/7aQV/JZ'ۄ OiԖ$. _X+/I]Q3G2OW6 H1iq_U;/_+M";+z3 ̭W*eBkOfAB%,'P6=^0Q)%5D0`7Ixɶ tlGZz8n݀C®aI8_thg%3*v},=+]4(EG2&GEƯgj lp( ɋmN=p <.޳[h*CD'*X9½PO~f)~] G2 }L>FG'Hcr;n\9/4dm|kSis:a&=y;ߑ9wO.46B۞'l}`ek1QƱ90w; DO _0y8Ԓq 02 刄L *zt&"X*2̞fPhB'Fʄቄ4 Fe\Ą=a\;HP8K zE!0H&H jr㈺Lj@ &D*cI Aָ\23nBDLZB*#0s"\W畟vfMcZ7 %P{-;)4o)PC%N\VFI+^ꐮaoF *Kf#XS1|9($fk?muGh2I5[m4;tWZQ%O&]$)5q[ \ &=]oke-xݚ~ڬ6_ˈ-J~hsvu+N8n),]wt3# bCO=#;a<#ѧ#_M nXg4:< 6`%V%8;ww +q!a8٦LD8- (+LIB*fFKe=xQuhjO&mfa'c[!Z81yU#0[8}ϯi,,{|8_`،,>b.(Ek&r1fu .Q~H0~Nl`{f3q{Y ztrr}`< V#$<칪oMd 4q0[r.x:]"Oq;F*-37#mA -\ Nxezi5kªgnx#E[I Pr م[OwQ9=5gȒ{:W&e) $4Rl?=~U>[A+ 0.,ak2]QSkUA%xe>V>a&=y;ߑwD/']&zxf-;$ma`S Y $ȼ Iٳ&HENI) [p kp N!!8ٲv*Ztmc ěB4noXwS<euS@Ԟ5RQQkF ,53Vѷ?3u.ݷ?1Hd<2X |ny כ{#l#3 WBB%Hc&#ǵZ8hZʦattb$I`iՅ+ gYrYYzy iV; +E *=a"uVP 5Y9)HAILZm"ZBzLCFXaVRl[Yw6.@oدx@OUfK` v#o[yc/- Xd֤Y2_\Rו| a;."r4܀!Ay; :N4HJt[sPj/l"jbl˚`R+8ay1ow EQg~e`+1Kc\$жgl> ۱&\TCBO 7߅opH$憯dqw*ScUA?Ǖ|4xZ( ͧ|7|R~ %QUQ =$烞Ax͋k5{\x ǿz /EZqzԖ=.J0 -{q7s0jWb\{́C uaZTT3\U h"q H˂A4e7GyPUpeC{# ;LAmGj1[p WS f)WˈSu~꬧l\S]H@Y EA4u] w8rs`NGUZ uPUP0]灠<͟`M*dK ۃAO:Εds[Btl}R0ikN< w;2fȻ*Tya(l rSD$\yL9a6)m:E{0L88{Үz'RX8 hŊBIQiU=GVbUaў_V=qXjl} #jX.ڷpH>隡^_\%ib^פ W4.zĚ"Sns8{#)HYyZM*F -Rm0osć:<o;vLϼ^ۣR"2/q6)wJz$[Inc [$= am"1.Q1hKlSv)pm-\s9\d/<;*^x ʄ\sxIGs8`{q`f3 z\osHcLU>.0Hsxp%}|H܀0~%) p,0Q(%x5IQ +R@{y. D <Y!`81K@@sxCbi(ᲁ}{0MމW ,_i\0wa*tjhh|j^OxIHU8X TnP%`2q0 Vzfye 0$yP}|VF3 {A^ /Z2c\yG] =uerZ"m5N) X7njRb da2٤Iinty͔nOVDn8 =kY9f޸ |ixbYpD]Lpr+z \(>#\:c:&b}9懽|>1-s+%ITx/gH&֒ 2#5ymkb,vz#@)\8%>pJ\K4ro/J^6M߽MU{7oXc| HSēĐ{"Z sx71t0E7.TtRܴ.wcTK 3p/gHπh Ȑ% Z+q#m4@M%_K j#^ow8^Oln;|hyEp[ֆmL?Bɵk`6/ꀄ*ケ8׀3 iewV s 5ғWei"B <5ǁ< pwzu -|Μ7g}YI"H RxPߠex=+.ru$Ċ,,' P ys r1[_0ǀd'㫖L2عJC6 G=l}-"oJnלw^2 .2̝tCI+Uh,ӹ`͑O&3k =/=ײ\snjR;MĸˁLJ@/ݣ+wQ!a%+]G}$/qkV<4pU 0 .\lH9,O]DW&OrdCb-ِؐ,."`^޶Q1y#pu_\ jco1,iB0jqy 8^OXx4w6oC9nMc Ac!K:ȱb%Xc!=c\l>߽k6{;FjRd/kّG\58^ln+MPg^-,Ǫ+cV`nϧ+͂2 >^2x˹"4rJlhHtdH9Go-ۈ:-Vs4`~`$.0HJ"d!M jJev"!;SD[ޕ&]o\E7y0Ow+0^*QgN,yk]6pYO0 ` `l.ݯsI .byoT8yJ#)1:H >[cW 7#P x#m{7[mR܇]>&|T壎S-iص jEW͍~{ΏegP/yWsF=gWP9C-[eQVpRosIHpKZ>#ҋ[9!=}0)'o[h LPbA U])%9ݣZxfiy/9^mn'D'5IA5LI!7zR ֓ڽYlmZ2Gڃ¸pF/+|/ӈP7L$%OKkgu3IO =NI7͑8nO4]^=Zxzeoin*gb,-/X{е{+QMRnkmz*uʜ/mּF+y#’m=\q^G[Pacu˭vϝ.B|?ZRx:i]Kixs+Y^+6ϿK,Zg Th$`.3 nZhSedb|2 8^Ya$TUs @= GOdEggG;4n>rp8tO /sQxUxpfs8n.el,о~;RܗP;wò_hn/3%,Wo\]ve- 7- ny^YIPɛT%vV kE-j˛ɐJ(oKy":`x4x}\>yEʕ&R*/Kd^ʡ*txrm, ;j㔈 G^N7mѬ3a˃aN 6 2Sl[IC%l0a-&aǐaa@YQ cQx?RHX*#j&:ɛӂKόöd`~%B0DKoe0 =@!=_y-ڥ SۡC6%"4$'E.GGz\K7"pj4eɵy86SgbdK`K愓!5H4T ZY* 0s7o? uĺ3í1G(S96@ۘm3(gkid!-'%oRHm'kMO!zz "0k-YK7"pj$LQ ɷy86XW,l l)w2A"*s|*h.c0z3-} ax;|Gkx;<'3>H/z3nH endstream endobj 76 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /Pattern << /P1 77 0 R /P2 78 0 R /P3 79 0 R >> /ExtGState << /GS1 23 0 R >> /ColorSpace << /CS1 80 0 R >> >> endobj 80 0 obj [/Pattern /DeviceRGB ] endobj 82 0 obj << /D [81 0 R /XYZ null 730 null] >> endobj 83 0 obj << /D [81 0 R /XYZ null 714 null] >> endobj 84 0 obj << /D [81 0 R /XYZ null 698 null] >> endobj 85 0 obj << /D [81 0 R /XYZ null 683 null] >> endobj 86 0 obj << /D [81 0 R /XYZ null 667 null] >> endobj 87 0 obj << /D [81 0 R /XYZ null 651 null] >> endobj 88 0 obj << /D [81 0 R /XYZ null 636 null] >> endobj 89 0 obj << /D [81 0 R /XYZ null 620 null] >> endobj 90 0 obj << /D [81 0 R /XYZ null 594 null] >> endobj 91 0 obj << /D [81 0 R /XYZ null 575 null] >> endobj 92 0 obj << /D [81 0 R /XYZ null 550 null] >> endobj 93 0 obj << /D [81 0 R /XYZ null 470 null] >> endobj 94 0 obj << /D [81 0 R /XYZ null 445 null] >> endobj 95 0 obj << /D [81 0 R /XYZ null 312 null] >> endobj 96 0 obj << /D [81 0 R /XYZ null 179 null] >> endobj 97 0 obj << /D [81 0 R /XYZ null 136 null] >> endobj 98 0 obj << /D [81 0 R /XYZ null 111 null] >> endobj 99 0 obj << /D [81 0 R /XYZ null null null] >> endobj 74 0 obj << /P 55 0 R /R [63 63 549 729] /V 51 0 R /N 100 0 R >> endobj 101 0 obj << /Length 4597 /Filter /FlateDecode >> stream HW[o6~fu}pم!k豚Tԙ=7jd o|lQoU%. 岸*rMïF\-΢()I k92NL'ĦtL+C*VJ.Dk=us{7TFS6O{}d|xO FvsϵV}D<.Ѣ ]GW>ԥ yA49pEl0$ e^Adهvvk[w9F3 !0;߫^w]DBN I0]ͭVa yTɁ.T fEcPBٖۚCa&On?>tȲr(IT7'4ɪ*+AqwhVC.2il1JRXx &wr:iP(S0U-qV/pjbg_Hܢd՟_P4Eh!u!!.^ )"%NFAʟ .41c}N Q[*I'.,hpHg܌oB־"ċĕqؐ;qjӓ/m7z,g}|WuGa>,Ƞj:gg~GVq戙j&q◟ %hRu=Nl1I\ -Y'ꖔ2-1Bf Iu : n1Rz+|flictMbM }$b.D,N4=Wzm`y6Iٴj Mu^=_*0LѶN`:"$$ fk!3a[\T⁖^.T_ge[$IKx(Rs Ebþp$l"0ܠ/1|Aa :t07@IJf%fd0mF(ϝ;Ce 'Ucw(R\N5mM%9F L R/5;㧣5aX]PG@7!%$0W84%B-VEiOP}x@u"5#lX9PC ѦӶ,d<9$u ftEV-Gw^K*5vX,f %AqBՒsxtj != (!_,ZGTm Vڈ-+j'DsZnj(, O.l.c g2^3Ai 12 oh-fVd?8Y!ܗ3yY84t{\ 6|}do s;ڐI,($ꍤm1݆I 1~j%BFߋ>6OHgp3 QSjDJVЩy} W ]Yu? !l*Dĕ|@,4͓)O)&`+{VNh8@`8Îv]; Ր+Dﯹϩ< ?~ "cOyab1acME)& .}}%Hm tRn, jAk4us^<"qVtܦrR=& 9.JBoj㢀$ii,Y /*7XKb}ݶW+l+ٰ[[dy6~tθ )Xk8iSBCtMzZХbŒJFyFJ 9"&!LE3R&I2GU=>t6rg̶"b:GO KY[Y٣ q X]qf.m#lh!5Ć|ZEGؼ~đ<*V§ir=Dص.*p;]2 r$ןAƙ"M0r~|1X AElրz`pngVorVꌟ$?9CJ^y= GLgI6_{_y~[A%A @q'D nad]B\N%͖8_2qVpe<>4w^$ lÉ><0V7DAfs'A-/;vn,GBH_䙙Qm$rj8H:=t,TGפ CD""bũ\5+3Az@<뙄P00?Ϻlur\9\E٨5Q(P( "\dQAjxkJW'%t7}"&")3iot˸4Z:fI6hy#/xAz3S̈́܄ITasy3otf8<Kd'Z729 ͖[1bA\~*Oֱ\Z v$K1 N&p)B pE9es4z FOr ߵվ/Wz9'3'Ojom\%eo, kNlKaP <+JKEz՚sD)%6W9E%}v)e=ֲ ݩ,sd;V fp U<& >J~: f=ה#x+d_/!"!jD_>QX* q G\S͝r6ZZK \#pLKR钝?e2NNdYP)7pʯ sģܩ,_?˿&z endstream endobj 102 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 104 0 obj << /D [103 0 R /XYZ null 729 null] >> endobj 105 0 obj << /D [103 0 R /XYZ null 711 null] >> endobj 106 0 obj << /D [103 0 R /XYZ null 609 null] >> endobj 107 0 obj << /D [103 0 R /XYZ null 591 null] >> endobj 108 0 obj << /D [103 0 R /XYZ null 399 null] >> endobj 109 0 obj << /D [103 0 R /XYZ null 377 null] >> endobj 110 0 obj << /D [103 0 R /XYZ null 364 null] >> endobj 111 0 obj << /D [103 0 R /XYZ null 352 null] >> endobj 112 0 obj << /D [103 0 R /XYZ null 340 null] >> endobj 113 0 obj << /D [103 0 R /XYZ null 328 null] >> endobj 114 0 obj << /D [103 0 R /XYZ null 316 null] >> endobj 115 0 obj << /D [103 0 R /XYZ null 298 null] >> endobj 116 0 obj << /D [103 0 R /XYZ null 280 null] >> endobj 117 0 obj << /D [103 0 R /XYZ null 268 null] >> endobj 118 0 obj << /D [103 0 R /XYZ null 244 null] >> endobj 119 0 obj << /D [103 0 R /XYZ null 232 null] >> endobj 120 0 obj << /D [103 0 R /XYZ null 221 null] >> endobj 121 0 obj << /D [103 0 R /XYZ null 210 null] >> endobj 122 0 obj << /D [103 0 R /XYZ null 199 null] >> endobj 123 0 obj << /D [103 0 R /XYZ null 188 null] >> endobj 124 0 obj << /D [103 0 R /XYZ null 176 null] >> endobj 125 0 obj << /D [103 0 R /XYZ null 165 null] >> endobj 126 0 obj << /D [103 0 R /XYZ null 153 null] >> endobj 127 0 obj << /D [103 0 R /XYZ null 140 null] >> endobj 128 0 obj << /D [103 0 R /XYZ null 128 null] >> endobj 129 0 obj << /D [103 0 R /XYZ null 116 null] >> endobj 130 0 obj << /D [103 0 R /XYZ null 104 null] >> endobj 131 0 obj << /D [103 0 R /XYZ null 92 null] >> endobj 132 0 obj << /D [103 0 R /XYZ null null null] >> endobj 100 0 obj << /P 81 0 R /R [63 63 549 729] /V 74 0 R /N 133 0 R >> endobj 134 0 obj << /Length 4470 /Filter /FlateDecode >> stream HW]ۺ}GU(q6] ]7BkӶYRe9/ʲ7(Xp8Μ9(UqT&i*Pχb5vPM&+KqR+N̑~)U#~7FǣV>2&7~l"t߿C๮bS\8ɱʸ{8)εT6Lo\% rp[S8C4wpJ4IEiũUڏ .yeat'V%|Vn"ʹGB{Ꮪo<"g2}T"oh؀^&56u6ڱ*ˮGuy̆-g^'pV'D/7HP&E:?Q1(՞tpa |M{V5- i,gz^,U`@ Bm<LMo$G[ş ePq[p5&m@nk.; 14z g%M1"qc,y3dm~}'vZԀ ЗbR{ 00(: Pv$Z,1FNdtLdlSIeȗj6"%I!.N/!R!V2@,BJB=A̻ u#!2.AHwðԫWzf!S5)EW䇀'.Z$A GG/,wkQ=|7f:<7_H azlrϋ$ /o FcFFwG$3W 0DjnZY:|wqB&T(> s9 9n7#Q gz't=&v{RHmd \!Ѓ]?D_zɋ۬AW!> XT=[H9Iu'RCzĮC3wFK!SB,[j QɱJ#-A 1W.v,eb~?<~ !6tAJMLv\oL p&T!n :vrǠ8*H, v{$1UW`طeE9AIOd^!}sWP-dJ?`I! yqJJ&! 7/ D['8b?%O8rҡCQ SO,#%C=Rh1#>:uitET^*CJhq`5iȊB f]7" @xNP04tm7]` ws.6 /` P "Si 0Y4$fu\$]i#F^x=x{Yg 4EHF^x ͖jfOzxOO_:3ІZ_+Sу*Bd&.XNrvJ^Tjj{NdSN6ǰ`pFT\ -"x`pH uHзڒ\!cBҾ嬛T l<9 J7rn'2TAd^.&f/u4MeK\sVg0{/#NP&x?.s2 HfI>9r?@ŚP**Ze3yz  f ?re=>,(uMvV82D" 'z."Nc.CK+IQ@ qrͥח;L֙gx9 wWO07V5ĦᡡH(Ro<#[1^ϴ&}Ʀ@@N!׿~HEQ[6,{>@2Q~;DGŅR\< hnB}W׮Mg=gPYîĠu\7qă)B^ψKpW},?0f(PIBfC-4Od+z^-}ly'V[2&c)D /hbV(-) P86]/TJ^|".2jez._5Cf˙e4{cI.IJ=R8ٸ(r΍kj`5!H{Itnp[ͷ( 󑏝(YksЮz4x LK;oZKj&|(cM aRCpJDam ÈSM 0Ki0|7,`Ib%NYsqp +QU8TZ]#V􏆨qR|m{=JA-kS$/I=0hUH@ E{̊>lM-73;J"DgQ p_7N?x܎Sr'e(qT zΔ] k^*菕' g?P܈bf~~/=>5#ő:viQRk :\8^gྚL5}WOP ϾXǞD k {Bbw>ĔU`sDIj0gK>ZLZ8 >'4s!}mƌLBUxtkN4ʔ) tz:ds+Lhti.' Ƌ$r}Jwtv!c=ATրݎqKv=D\[ژ5!YLt ­Z̐J9^ev=-I3c"8'͇ʾyZFCJ6(9y|\J &#?mf~~|ú NmُX6? DRCDeHD=QfgS:kZj0*67܉Yec/lF1,ͺ0Pr,yk}LkBŸ`3LXZٰpʱ1AHA q P2H ;+I[ƈaee;jiʍl%HJ92W E 13GdBS6an nxV,{+:ބ0] 4|]%9"CBx'aY*hފ%FG5`؀zl_|{ v6\o' ˨+9G&fn"frM2z<'["uΆkVdyoRNrp!Gz5/'SKħli.{ikd՟/I{)'F;c- >4 {Wƃ$KH[%HzlޣY{WѤk;ۆm> $_xf@R>@hq]0|iy&~Q[q3sMܤ2'<)c:HƍdX ӰH$ }K%z-C׷ 'IQ$!pJR8sἛD"xEv4NI.V13֗tQ~"ex#CMo2@Oӟo. endstream endobj 135 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 137 0 obj << /D [136 0 R /XYZ null 730 null] >> endobj 138 0 obj << /D [136 0 R /XYZ null 718 null] >> endobj 139 0 obj << /D [136 0 R /XYZ null 706 null] >> endobj 140 0 obj << /D [136 0 R /XYZ null 694 null] >> endobj 141 0 obj << /D [136 0 R /XYZ null 681 null] >> endobj 142 0 obj << /D [136 0 R /XYZ null 657 null] >> endobj 143 0 obj << /D [136 0 R /XYZ null 646 null] >> endobj 144 0 obj << /D [136 0 R /XYZ null 635 null] >> endobj 145 0 obj << /D [136 0 R /XYZ null 623 null] >> endobj 146 0 obj << /D [136 0 R /XYZ null 612 null] >> endobj 147 0 obj << /D [136 0 R /XYZ null 601 null] >> endobj 148 0 obj << /D [136 0 R /XYZ null 590 null] >> endobj 149 0 obj << /D [136 0 R /XYZ null 578 null] >> endobj 150 0 obj << /D [136 0 R /XYZ null 566 null] >> endobj 151 0 obj << /D [136 0 R /XYZ null 554 null] >> endobj 152 0 obj << /D [136 0 R /XYZ null 541 null] >> endobj 153 0 obj << /D [136 0 R /XYZ null 529 null] >> endobj 154 0 obj << /D [136 0 R /XYZ null 517 null] >> endobj 155 0 obj << /D [136 0 R /XYZ null 505 null] >> endobj 156 0 obj << /D [136 0 R /XYZ null 493 null] >> endobj 157 0 obj << /D [136 0 R /XYZ null 475 null] >> endobj 158 0 obj << /D [136 0 R /XYZ null 456 null] >> endobj 159 0 obj << /D [136 0 R /XYZ null 432 null] >> endobj 160 0 obj << /D [136 0 R /XYZ null 408 null] >> endobj 161 0 obj << /D [136 0 R /XYZ null 396 null] >> endobj 162 0 obj << /D [136 0 R /XYZ null 384 null] >> endobj 163 0 obj << /D [136 0 R /XYZ null 371 null] >> endobj 164 0 obj << /D [136 0 R /XYZ null 359 null] >> endobj 165 0 obj << /D [136 0 R /XYZ null 347 null] >> endobj 166 0 obj << /D [136 0 R /XYZ null 323 null] >> endobj 167 0 obj << /D [136 0 R /XYZ null 311 null] >> endobj 168 0 obj << /D [136 0 R /XYZ null 299 null] >> endobj 169 0 obj << /D [136 0 R /XYZ null 286 null] >> endobj 170 0 obj << /D [136 0 R /XYZ null 274 null] >> endobj 171 0 obj << /D [136 0 R /XYZ null 262 null] >> endobj 172 0 obj << /D [136 0 R /XYZ null 250 null] >> endobj 173 0 obj << /D [136 0 R /XYZ null 238 null] >> endobj 174 0 obj << /D [136 0 R /XYZ null 214 null] >> endobj 175 0 obj << /D [136 0 R /XYZ null 189 null] >> endobj 176 0 obj << /D [136 0 R /XYZ null 177 null] >> endobj 177 0 obj << /D [136 0 R /XYZ null 165 null] >> endobj 178 0 obj << /D [136 0 R /XYZ null 153 null] >> endobj 179 0 obj << /D [136 0 R /XYZ null 141 null] >> endobj 180 0 obj << /D [136 0 R /XYZ null 128 null] >> endobj 181 0 obj << /D [136 0 R /XYZ null 104 null] >> endobj 182 0 obj << /D [136 0 R /XYZ null 92 null] >> endobj 183 0 obj << /D [136 0 R /XYZ null null null] >> endobj 133 0 obj << /P 103 0 R /R [63 63 549 729] /V 100 0 R /N 184 0 R >> endobj 185 0 obj << /Length 3828 /Filter /FlateDecode >> stream HWn8}Qn3Ox&Nc^%nɫV{ ߷.dK€[dԩ__M %_2ODS2O|U `5KW^+i,TRGQ$DY 5MB+UY-ouW]V5<- 6<Ե%?̿o},Z99#Ml-nq-'T2 H̔ Uoe|_7~.3g~] =[$9O d#lʔoh*+@޲g3zӻ/x6ev'3]mæcы+u ^t*BW8vLpW^oH6nKܒ 9jcvC]in}ѷb{}mAbO8Q#fwYܿf} .wёsiې\cHX˦gaʴ 19шU$bRG\0a8%Aٟa@38?A(O@(109,@;S\v7Ʈ 8̼qZj @uܭ.y\L!Qɫ#o":_bM]Hs^x̵>V/ VA萖{T >nxޅK xYG)n=h09p}GqJJx&eBRc AybaS%beHJdEZj28T+lEAޜ?/pH u.fDK"Yd%yl~k_pī@R ![EaZ?f[#/W[6+1Xٝ!*=Ap6!lxdk6;Vcn9J ֞Z?.As=}.DcyK2zOduI$Ue9Vwv-s:̾M4.bp e2 N/l)xr \OX.6m/V<%ga;d˴Ҋ e,̰JL+Ԁ&d> r7Z4-XC/t]JD{Lt, kVK+(/S#[̺G"AB/@*f +$k~BR^ $eBC扟7ӳi8IhNo0+{ӈ;P#B:;RȻ|;4v${ylLbVXq=p#4KCĚ6EJ XwM@*{Iѣw<(ǣ'p-{$ u 8 J6djMEL9i9bcWLf*p| % rm}YCPV)%G!j;|eBQ\ѩf$Um5<A?Zyl=ǓFlQst8%e y+4e+dr'Q= !vT30~yab_ b F\6nM^! ~Xn: I.qYN/+CTVblJ$sΏ9fy6T|Ox-HXn̉-?ַ_"jt\oâ%{ߐIl3oқ6UvoiSU9ThT-K#g)fl,j x׻ٙ<y߿\VT#ͱ1DdݑMKav9+^>J +%hB>tYOrscXf^s>q4X#=~R؃mϱ0^z-א0?NV159k;@Nbny輌r6iUf]>t:9ִx4ʉc=B=moPͷv˒ bȑRdZ8( D 8($NQL UD:29)%\ +(zGQ8 $CT75Y.&J \%Fky&2:Ѣe{+$jWG?ۓJq(du:"H), tP~ ~e)rM%\lO8*ygg>ƧpD OtKt\:]E%+ )S gͻgOvL2%7tt#ha)fQx6 (C wo%_s Y;WlEO/`6Cd]N#`m]Km52x9gPu'J9Hk`L.pO3C>%\_v6GpJ> /ExtGState << /GS1 23 0 R >> >> endobj 188 0 obj << /D [187 0 R /XYZ null 730 null] >> endobj 189 0 obj << /D [187 0 R /XYZ null 718 null] >> endobj 190 0 obj << /D [187 0 R /XYZ null 706 null] >> endobj 191 0 obj << /D [187 0 R /XYZ null 694 null] >> endobj 192 0 obj << /D [187 0 R /XYZ null 675 null] >> endobj 193 0 obj << /D [187 0 R /XYZ null 657 null] >> endobj 194 0 obj << /D [187 0 R /XYZ null 645 null] >> endobj 195 0 obj << /D [187 0 R /XYZ null 621 null] >> endobj 196 0 obj << /D [187 0 R /XYZ null 609 null] >> endobj 197 0 obj << /D [187 0 R /XYZ null 596 null] >> endobj 198 0 obj << /D [187 0 R /XYZ null 584 null] >> endobj 199 0 obj << /D [187 0 R /XYZ null 572 null] >> endobj 200 0 obj << /D [187 0 R /XYZ null 560 null] >> endobj 201 0 obj << /D [187 0 R /XYZ null 548 null] >> endobj 202 0 obj << /D [187 0 R /XYZ null 536 null] >> endobj 203 0 obj << /D [187 0 R /XYZ null 524 null] >> endobj 204 0 obj << /D [187 0 R /XYZ null 511 null] >> endobj 205 0 obj << /D [187 0 R /XYZ null 499 null] >> endobj 206 0 obj << /D [187 0 R /XYZ null 475 null] >> endobj 207 0 obj << /D [187 0 R /XYZ null 463 null] >> endobj 208 0 obj << /D [187 0 R /XYZ null 451 null] >> endobj 209 0 obj << /D [187 0 R /XYZ null 438 null] >> endobj 210 0 obj << /D [187 0 R /XYZ null 426 null] >> endobj 211 0 obj << /D [187 0 R /XYZ null 414 null] >> endobj 212 0 obj << /D [187 0 R /XYZ null 402 null] >> endobj 213 0 obj << /D [187 0 R /XYZ null 390 null] >> endobj 214 0 obj << /D [187 0 R /XYZ null 378 null] >> endobj 215 0 obj << /D [187 0 R /XYZ null 359 null] >> endobj 216 0 obj << /D [187 0 R /XYZ null 341 null] >> endobj 217 0 obj << /D [187 0 R /XYZ null 317 null] >> endobj 218 0 obj << /D [187 0 R /XYZ null 293 null] >> endobj 219 0 obj << /D [187 0 R /XYZ null 281 null] >> endobj 220 0 obj << /D [187 0 R /XYZ null 270 null] >> endobj 221 0 obj << /D [187 0 R /XYZ null 259 null] >> endobj 222 0 obj << /D [187 0 R /XYZ null 248 null] >> endobj 223 0 obj << /D [187 0 R /XYZ null 237 null] >> endobj 224 0 obj << /D [187 0 R /XYZ null 225 null] >> endobj 225 0 obj << /D [187 0 R /XYZ null 214 null] >> endobj 226 0 obj << /D [187 0 R /XYZ null 201 null] >> endobj 227 0 obj << /D [187 0 R /XYZ null 189 null] >> endobj 228 0 obj << /D [187 0 R /XYZ null 177 null] >> endobj 229 0 obj << /D [187 0 R /XYZ null 165 null] >> endobj 230 0 obj << /D [187 0 R /XYZ null 153 null] >> endobj 231 0 obj << /D [187 0 R /XYZ null 141 null] >> endobj 232 0 obj << /D [187 0 R /XYZ null 116 null] >> endobj 233 0 obj << /D [187 0 R /XYZ null 104 null] >> endobj 234 0 obj << /D [187 0 R /XYZ null 92 null] >> endobj 235 0 obj << /D [187 0 R /XYZ null null null] >> endobj 184 0 obj << /P 136 0 R /R [63 63 549 729] /V 133 0 R /N 236 0 R >> endobj 237 0 obj << /Length 2996 /Filter /FlateDecode >> stream HWm۸ t%-9$!1%[,uk[,n33-y{rAXSp8|Ͼ(r?OT<ȏS~@M!Q5} GϼLA"i`r? d~`X !A~>F'~zԃ7\`Sß0ۚ-6+G>HYLyu/cyݦ% ^# tB}܌FZ0QN Co3OXd9`X8Us_D~Dh7(:x3.. |ՕQ5WQ7LQ=+eM͖1UR-Ɖh=0p@ b*6,xgW:A{WϼՃaoI{u!XΰJU-ZMHLp"Hj{ ,qԆg!mBoLQD4R%ݹ?[6û7?oHysх ut/ԪF7zѣBAajoZWٞ6oGrJ= F]oclAvL5x1"a6pCpM&5U uDqg܏ \_(Q|ח#\$p%_;D!5U1q/3ABr4,Pu\X)&\6\30>^r]i,Z1uoN1mFWAFyxG%֋w f)z9"kFqêPXXࣨϷz1F;-B6@~Mw( E&ȶ#N-16Sk)UsRqRT1O m T:7k 뛕蔓(ZQvDDEsw 7Tڒu,*\Z(uIDfv::K Zwv^ra^qPV5ŕ,{,LppzQz3jԿDu(D2qjj_8ݚnk s/{sކ &qL 2J]D:YH׮kj"Qb$唫j7ޔ"-yy|&!_آчxwʞ#pp_3J!̽y:'!>+TA'視%8 ;Y&8f!#C?; f]׺w |;۱M]b:8C SG NŶ͟yN,Fj]G۩zy6H޵=8[oq._s5f$,7hA-ږn|DAy=u7 WH d'~ Ⱥؾ)XX 㥆$A7[c$6OauxSp*{ټx皡ǃtwŕ̻6 lH`Ga61rE+dNy?TAf\gDžf~wje]ꈞMxRsVUrz%%ZHݰ1ݫ :fo QS{R9Ab\FM P~\ `QtiJ'w\qiunQ+iKVnj*uWb4%7/rL{RR@&} 6Zd?$ 0> /ExtGState << /GS1 23 0 R >> >> endobj 240 0 obj << /D [239 0 R /XYZ null 730 null] >> endobj 241 0 obj << /D [239 0 R /XYZ null 718 null] >> endobj 242 0 obj << /D [239 0 R /XYZ null 706 null] >> endobj 243 0 obj << /D [239 0 R /XYZ null 694 null] >> endobj 244 0 obj << /D [239 0 R /XYZ null 682 null] >> endobj 245 0 obj << /D [239 0 R /XYZ null 670 null] >> endobj 246 0 obj << /D [239 0 R /XYZ null 652 null] >> endobj 247 0 obj << /D [239 0 R /XYZ null 634 null] >> endobj 248 0 obj << /D [239 0 R /XYZ null 598 null] >> endobj 249 0 obj << /D [239 0 R /XYZ null 574 null] >> endobj 250 0 obj << /D [239 0 R /XYZ null 562 null] >> endobj 251 0 obj << /D [239 0 R /XYZ null 550 null] >> endobj 252 0 obj << /D [239 0 R /XYZ null 538 null] >> endobj 253 0 obj << /D [239 0 R /XYZ null 526 null] >> endobj 254 0 obj << /D [239 0 R /XYZ null 513 null] >> endobj 255 0 obj << /D [239 0 R /XYZ null 501 null] >> endobj 256 0 obj << /D [239 0 R /XYZ null 489 null] >> endobj 257 0 obj << /D [239 0 R /XYZ null 477 null] >> endobj 258 0 obj << /D [239 0 R /XYZ null 465 null] >> endobj 259 0 obj << /D [239 0 R /XYZ null 453 null] >> endobj 260 0 obj << /D [239 0 R /XYZ null 429 null] >> endobj 261 0 obj << /D [239 0 R /XYZ null 417 null] >> endobj 262 0 obj << /D [239 0 R /XYZ null 405 null] >> endobj 263 0 obj << /D [239 0 R /XYZ null 393 null] >> endobj 264 0 obj << /D [239 0 R /XYZ null 381 null] >> endobj 265 0 obj << /D [239 0 R /XYZ null 369 null] >> endobj 266 0 obj << /D [239 0 R /XYZ null 351 null] >> endobj 267 0 obj << /D [239 0 R /XYZ null 333 null] >> endobj 268 0 obj << /D [239 0 R /XYZ null 321 null] >> endobj 269 0 obj << /D [239 0 R /XYZ null 297 null] >> endobj 270 0 obj << /D [239 0 R /XYZ null 285 null] >> endobj 271 0 obj << /D [239 0 R /XYZ null 273 null] >> endobj 272 0 obj << /D [239 0 R /XYZ null 261 null] >> endobj 273 0 obj << /D [239 0 R /XYZ null 249 null] >> endobj 274 0 obj << /D [239 0 R /XYZ null 237 null] >> endobj 275 0 obj << /D [239 0 R /XYZ null 224 null] >> endobj 276 0 obj << /D [239 0 R /XYZ null 212 null] >> endobj 277 0 obj << /D [239 0 R /XYZ null 200 null] >> endobj 278 0 obj << /D [239 0 R /XYZ null 188 null] >> endobj 279 0 obj << /D [239 0 R /XYZ null 176 null] >> endobj 280 0 obj << /D [239 0 R /XYZ null 158 null] >> endobj 281 0 obj << /D [239 0 R /XYZ null 140 null] >> endobj 282 0 obj << /D [239 0 R /XYZ null 128 null] >> endobj 283 0 obj << /D [239 0 R /XYZ null 104 null] >> endobj 284 0 obj << /D [239 0 R /XYZ null 92 null] >> endobj 285 0 obj << /D [239 0 R /XYZ null null null] >> endobj 236 0 obj << /P 187 0 R /R [63 63 549 729] /V 184 0 R /N 286 0 R >> endobj 287 0 obj << /Length 3522 /Filter /FlateDecode >> stream HW[o:~/G*눺plmO"ӎve+I΅|imi"pofލ^J_~ "?DE&Fׯ1߿*1[ר_77 ȏCw-Iɡ 4c0ŏ CAN܃lͳ tx/DKSz"8,>wPc2m0%:?",jKAw D^xy_p,P`st1s{v*Jaɇ9g"9,_$X!~Y@D]rP@ l^cw՝Πvy!yC@{dWbGm ¶%ĹicG+I$XIȸ̨4BNj&2 T#,YF6q45Xu6 #,{I׆K9nўiLj[AƘ|GVWӶI]΢[&٣W@bT&VЕCv<0Pڷ:k 8eV'tO0uos( P[%y"Z;EuU'OPabb^5@1 lJ4k-'n~ۚt/Yiң*ȷɺBRSusQ*;* d \hDtkj .ga1eROא3N7d Xq dc@!8P` 5P2j3}dc^"e.Ytk/ ~6(`*P/ w92Gjbqz;ZuٵH^rk/k^H*/h1 O*6 a8GAf_KhL=g^ͥiX-Ț/$E KQ Y+B,k"v9% 1Nn{0K<i7vL4I#W[#g:F=\T1V aQanwn ʲb쁒hJQ[)WoiM!U WEo^xH< }ᾨ{"skc݋hxTAR ilö Y(pCRTn2 _#v'?8Fuqyq$gnTg7X/} OrصKw.6!b"ڋ͋M+vzY,\,|jKʍMhiT0$sn~H?څ:J{zG?"m$$`9ؕX-GM"m~lim8x<Z#,Q3 ×>Wmw_oqݵ /ÃrӞɇD[=ކ߾S>PB?0U7&|:H>-?ݟG!@5CtNGZW#!O RE=}{:j12).#.~OM9(cGnuwj2ev84C(&a-]b+B[)uZ.`USw>WN WA*y6q P2%sD9`>ЬjΑ0xG$F-P5;K@&h$ ѥҪn,Sg5ڐ8s7[-Dj%MIZQd+0ͥ<K%y3@ot[,|*J + 喭-òcZ\ނMr^YIXR[R_;wU1\W(rSN=-+)BAo%fzѶ,_ XnL?.!dnGuP3k S=W46~%EUDCګa(#mWMQ3-4@#k4v!&D'a h)H 4/%Q k}i7$^I@eF*<#uH-;-IB63;5vOEV, Ru+qi5s^iZ7IC+ JwlNd#oU endstream endobj 288 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 290 0 obj << /D [289 0 R /XYZ null 730 null] >> endobj 291 0 obj << /D [289 0 R /XYZ null 718 null] >> endobj 292 0 obj << /D [289 0 R /XYZ null 688 null] >> endobj 293 0 obj << /D [289 0 R /XYZ null 670 null] >> endobj 294 0 obj << /D [289 0 R /XYZ null 658 null] >> endobj 295 0 obj << /D [289 0 R /XYZ null 622 null] >> endobj 296 0 obj << /D [289 0 R /XYZ null 610 null] >> endobj 297 0 obj << /D [289 0 R /XYZ null 598 null] >> endobj 298 0 obj << /D [289 0 R /XYZ null 586 null] >> endobj 299 0 obj << /D [289 0 R /XYZ null 574 null] >> endobj 300 0 obj << /D [289 0 R /XYZ null 562 null] >> endobj 301 0 obj << /D [289 0 R /XYZ null 550 null] >> endobj 302 0 obj << /D [289 0 R /XYZ null 538 null] >> endobj 303 0 obj << /D [289 0 R /XYZ null 526 null] >> endobj 304 0 obj << /D [289 0 R /XYZ null 513 null] >> endobj 305 0 obj << /D [289 0 R /XYZ null 501 null] >> endobj 306 0 obj << /D [289 0 R /XYZ null 489 null] >> endobj 307 0 obj << /D [289 0 R /XYZ null 477 null] >> endobj 308 0 obj << /D [289 0 R /XYZ null 465 null] >> endobj 309 0 obj << /D [289 0 R /XYZ null 453 null] >> endobj 310 0 obj << /D [289 0 R /XYZ null 441 null] >> endobj 311 0 obj << /D [289 0 R /XYZ null 429 null] >> endobj 312 0 obj << /D [289 0 R /XYZ null 417 null] >> endobj 313 0 obj << /D [289 0 R /XYZ null 405 null] >> endobj 314 0 obj << /D [289 0 R /XYZ null 393 null] >> endobj 315 0 obj << /D [289 0 R /XYZ null 381 null] >> endobj 316 0 obj << /D [289 0 R /XYZ null 369 null] >> endobj 317 0 obj << /D [289 0 R /XYZ null 345 null] >> endobj 318 0 obj << /D [289 0 R /XYZ null 333 null] >> endobj 319 0 obj << /D [289 0 R /XYZ null 321 null] >> endobj 320 0 obj << /D [289 0 R /XYZ null 303 null] >> endobj 321 0 obj << /D [289 0 R /XYZ null 285 null] >> endobj 322 0 obj << /D [289 0 R /XYZ null 273 null] >> endobj 323 0 obj << /D [289 0 R /XYZ null 249 null] >> endobj 324 0 obj << /D [289 0 R /XYZ null 237 null] >> endobj 325 0 obj << /D [289 0 R /XYZ null 225 null] >> endobj 326 0 obj << /D [289 0 R /XYZ null 212 null] >> endobj 327 0 obj << /D [289 0 R /XYZ null 200 null] >> endobj 328 0 obj << /D [289 0 R /XYZ null 188 null] >> endobj 329 0 obj << /D [289 0 R /XYZ null 176 null] >> endobj 330 0 obj << /D [289 0 R /XYZ null 164 null] >> endobj 331 0 obj << /D [289 0 R /XYZ null 152 null] >> endobj 332 0 obj << /D [289 0 R /XYZ null 140 null] >> endobj 333 0 obj << /D [289 0 R /XYZ null 128 null] >> endobj 334 0 obj << /D [289 0 R /XYZ null 116 null] >> endobj 335 0 obj << /D [289 0 R /XYZ null 104 null] >> endobj 336 0 obj << /D [289 0 R /XYZ null 92 null] >> endobj 337 0 obj << /D [289 0 R /XYZ null null null] >> endobj 286 0 obj << /P 239 0 R /R [63 63 549 729] /V 236 0 R /N 338 0 R >> endobj 339 0 obj << /Length 2891 /Filter /FlateDecode >> stream HWmoF a?.#rR>y9PEEѶ߼쒢$[n.ERH3x쇷J(z,DG:TAh6AP\>(q[XϟIz*#,"ɂP#yCӎP,?( ^x"YߨQ[*T _JQHG˃Lvϖ^KHV?:ez:H8;I a`L;8*T$s?y~$./[/ ,=b*|p=)7$Rзk[p~) HúEmbpC{ko>t=eA`1:QGv y(h;)a\ 1G.˲DS{Mߵ*qx0s|Ȥr@Dk1[Vr,A gUpXy*k+0Jڥ}:~yN |Mh[+k 2zu8Ơ lXϏ= "~`r;`PJYtD7lo}tI@%P≔RJ`Fp-"ЇP觥=MSg*ƫ=RCf7TVv _ ^~wdF'9' 1փdQ aahE١0+/CAWD+Cb2d o acc%&Z\|?JDA6Ʈ޷@@Cy[fLJ`@:oŲk@_J {)WHwekP3>ALtU]ěvА\p_ v&QG*;_Om^}Mω{J_hy¼UlE_@rjVF❞@؞Rkеa:9afAy$5I!tdy86&j\z8</gJ]nYV7 Xx$Y+$Ԁ=K8yMgt,qx@ba9;4EFIu:!0T6 bآnKʠ/DܥRU5(gb;f.a;J1#lj  I*hcMJQO+|a|`+ J#H{ko#1HPXe⛖)syOLek0!)zXf %HEg 2'/Q.Gm24Ev54=@qr [_ ,m֬aȼ%+ox~i~MLW/d;o{o7Vv (l MQN0qncz>rgsqgTv-Jt)=Ls񧍀'zK6x[h{/ɧ(olO޲! qm n]7!eĶdsAXug&(LG9gS3Mt h]6jƯe1#PaK]>sei1c9o09BE;!?WC4zǿ@M5VG#Hf b`O @4 s++ؚfUF Ql19mƤ V>^U*fp!l#M;XqP8y:Lm*.EZuU}]+&cjP*h WqLVqQf1c)b%ݬC$TR* YfI?T*0W 3BzcXUaFEl kx( &|,(*Y4V- jĿP02v*HoV =`A*(H䀥sA)5Ԁ!FFAU[_(ս䔾3{ endstream endobj 340 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 342 0 obj << /D [341 0 R /XYZ null 730 null] >> endobj 343 0 obj << /D [341 0 R /XYZ null 712 null] >> endobj 344 0 obj << /D [341 0 R /XYZ null 700 null] >> endobj 345 0 obj << /D [341 0 R /XYZ null 676 null] >> endobj 346 0 obj << /D [341 0 R /XYZ null 664 null] >> endobj 347 0 obj << /D [341 0 R /XYZ null 652 null] >> endobj 348 0 obj << /D [341 0 R /XYZ null 628 null] >> endobj 349 0 obj << /D [341 0 R /XYZ null 616 null] >> endobj 350 0 obj << /D [341 0 R /XYZ null 604 null] >> endobj 351 0 obj << /D [341 0 R /XYZ null 579 null] >> endobj 352 0 obj << /D [341 0 R /XYZ null 557 null] >> endobj 353 0 obj << /D [341 0 R /XYZ null 539 null] >> endobj 354 0 obj << /D [341 0 R /XYZ null 497 null] >> endobj 355 0 obj << /D [341 0 R /XYZ null 479 null] >> endobj 356 0 obj << /D [341 0 R /XYZ null 461 null] >> endobj 357 0 obj << /D [341 0 R /XYZ null 431 null] >> endobj 358 0 obj << /D [341 0 R /XYZ null 413 null] >> endobj 359 0 obj << /D [341 0 R /XYZ null null null] >> endobj 360 0 obj << /D [341 0 R /XYZ null null null] >> endobj 338 0 obj << /P 289 0 R /R [63 63 549 729] /V 286 0 R /N 361 0 R >> endobj 370 0 obj << /Length 3140 /Filter /FlateDecode >> stream HWKs8"D>@x<=ѬoM%q#J6~EQd*~~xx~F8??˃? *͂X SE|G<0/~0.UU4 sW.V6Wk?vn*L)( ec*q>L]OnƊOޓE"gxewY2~ Æ&^uq*\̆ȘW Ei9S,D^Ob*__dyDʊ',^3Dzо~"եA{o ^zw}_ 4paTY4!j⋬3" ^7&"ׄ b0M&p_5O+sGYb1In^1rcA"89=F0s5s"h ,رA༤F &%_)iهFj#<"R88Z+4Z9Xx9Q+dLhE Dpx!ÉFG4E_U&pX ^9MМP@Sgh@Cxzw6mן{q VrGlnLHtxҪnH!07G:OU]Q 1?~v<xMеݓW.NbQM@^d0B١\yy phfsp(JNu hUS ~B sBWC:UR('!;CRFQ GG@x C29{U(M0Yv1B"j)"{2֪RpB ^E蠥^0p\`x5in~&bT=QL`m=zF`<&H}C`<&=恙R@l q*BT1zjM5? >j|zPu{׾rrSC4}ntޢ"⇰ ds&y +AS9ec';*Uo?]=vMY1>zg^x?&'5wjءPSB_ lQ--dBj#mAݲz8ڎ7mョc5DR7x}ءX gIy4jfFe1hcZd)c;;P J'uf߿c 78}5 ԣHջ-8Vj0j%yM1r(6E{ߥ;mT,+\d^"xC3W$$ EYQѕKn2wgulb|:Q1/:>z9b7"X\bG Ov4a^ N^BӛтY{<ƑcSL4z9MؑOrtDo]=TS}L[ =ju4"dMirn-A:̻cQE +>ɖ?+Iw@'O4b%0Jذ-9sk5+ >Yt=++:rZqd(8Maz^sШGVRK߀rv DhٮqĝӄtǢp@@k48yKFu+3 _͋Y\w1dnhLR˞FN˩&s\cE DS ]jJo`aN]0@"Sfȅ qBPbI<)7&o%A&N-xHf~utp\eG` 1?y}B /ĺ'#{,d{;AKJ b<4$gvIT-Rhunv|(ɪZ3 Ě )Hcw)4J};Ց}t 󇬚Bu)eWe*FZdwQ3K@OH;lj節HݚCB^k.hI ٫`eDjf)k. |VR|xY(X _p4'Mp1o .ևb;S!RoAgIDTu/IC#=4.N.65T_vhY ٟ l9]&ȰN.asQ%|Ŋt&pw.ThKѝ g\R-бuZ+$'yȹ9&YZ$Ve376aPp{̈3yCYqIFg,?N-̤$FI,6JVi5r:5!k*J4K͹3BB@k OhnKJ.x!<6 u2AU. ;ĉTmj;\<<۬icoGA[b!`%nã{j^,8u*-(Z+DjCe ƟV=ϗq=FT&'*oA4W6Ǟ\!i4SyשeTԷK޵zP(op[$DDNڶ6 (:%ڑ4ը9TR*h (Bg+Wmhݱ77? endstream endobj 371 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R /F5 372 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 375 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 77 0 obj << /Type /Pattern /PatternType 1 /Resources 375 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 102 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(00¼\@偼\a endstream endobj 376 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 78 0 obj << /Type /Pattern /PatternType 1 /Resources 376 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 99 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(C/+Py /@E7 endstream endobj 377 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 79 0 obj << /Type /Pattern /PatternType 1 /Resources 377 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 104 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(|o?< d endstream endobj 378 0 obj << /Type /Halftone /HalftoneType 1 /HalftoneName (Default) /Frequency 60 /Angle 45 /SpotFunction /Round >> endobj 23 0 obj << /Type /ExtGState /SA false /OP false /HT /Default >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Times-Roman >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Times-Italic >> endobj 54 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Courier >> endobj 372 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /Encoding 379 0 R /BaseFont /Times-Roman >> endobj 379 0 obj << /Type /Encoding /Differences [ 0/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis /ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl /Lslash/lslash/Zcaron/zcaron/minus 39/quotesingle 96/grave 130/quotesinglbase /florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron /guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash /emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright/ordfeminine 172/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu 183/periodcentered/cedilla /onesuperior/ordmasculine 188/onequarter/onehalf/threequarters 192/Agrave/Aacute/Acircumflex /Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex /Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve /Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute /Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex /atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex /edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve /oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute /ucircumflex/udieresis/yacute/thorn/ydieresis ] >> endobj 1 0 obj << /Type /Page /Parent 24 0 R /Resources 19 0 R /Contents 18 0 R /CropBox [0 0 612 791] /B [17 0 R] >> endobj 25 0 obj << /Type /Page /Parent 24 0 R /Resources 36 0 R /Contents 35 0 R /CropBox [0 0 612 791] /B [34 0 R] >> endobj 37 0 obj << /Type /Page /Parent 24 0 R /Resources 53 0 R /Contents 52 0 R /CropBox [0 0 612 791] /B [51 0 R] >> endobj 55 0 obj << /Type /Page /Parent 24 0 R /Resources 76 0 R /Contents 75 0 R /CropBox [0 0 612 791] /B [74 0 R] >> endobj 81 0 obj << /Type /Page /Parent 24 0 R /Resources 102 0 R /Contents 101 0 R /CropBox [0 0 612 791] /B [100 0 R] >> endobj 103 0 obj << /Type /Page /Parent 24 0 R /Resources 135 0 R /Contents 134 0 R /CropBox [0 0 612 791] /B [133 0 R] >> endobj 136 0 obj << /Type /Page /Parent 24 0 R /Resources 186 0 R /Contents 185 0 R /CropBox [0 0 612 791] /B [184 0 R] >> endobj 187 0 obj << /Type /Page /Parent 24 0 R /Resources 238 0 R /Contents 237 0 R /CropBox [0 0 612 791] /B [236 0 R] >> endobj 239 0 obj << /Type /Page /Parent 24 0 R /Resources 288 0 R /Contents 287 0 R /CropBox [0 0 612 791] /B [286 0 R] >> endobj 289 0 obj << /Type /Page /Parent 24 0 R /Resources 340 0 R /Contents 339 0 R /CropBox [0 0 612 791] /B [338 0 R] >> endobj 341 0 obj << /Type /Page /Parent 374 0 R /Resources 371 0 R /Contents 370 0 R /CropBox [0 0 612 791] /B [361 0 R] >> endobj 24 0 obj << /Type /Pages /Kids [1 0 R 25 0 R 37 0 R 55 0 R 81 0 R 103 0 R 136 0 R 187 0 R 239 0 R 289 0 R] /Count 10 /Parent 373 0 R >> endobj 374 0 obj << /Type /Pages /Kids [341 0 R] /Count 1 /Parent 373 0 R >> endobj 373 0 obj << /Type /Pages /Kids [24 0 R 374 0 R ] /Count 11 /MediaBox [0 0 612 792] >> endobj 380 0 obj << /Count 8 /First 362 0 R /Last 362 0 R >> endobj 362 0 obj << /Title (ARMCI: A Portable Aggregate Remote Memory Copy Interface) /Dest [1 0 R /XYZ null 737 null] /Parent 380 0 R /First 363 0 R /Last 369 0 R /Count 7 >> endobj 363 0 obj << /Title (Motivation and Background) /Dest [1 0 R /XYZ null 617 null] /Parent 362 0 R /Next 364 0 R >> endobj 364 0 obj << /Title (ARMCI Data Structures) /Dest [25 0 R /XYZ null 219 null] /Parent 362 0 R /Prev 363 0 R /Next 365 0 R >> endobj 365 0 obj << /Title (ARMCI Operations) /Dest [81 0 R /XYZ null 602 null] /Parent 362 0 R /Prev 364 0 R /Next 369 0 R /First 366 0 R /Last 368 0 R /Count 3 >> endobj 366 0 obj << /Title (Progress and ordering) /Dest [103 0 R /XYZ null 737 null] /Parent 365 0 R /Next 367 0 R >> endobj 367 0 obj << /Title (Memory allocation) /Dest [103 0 R /XYZ null 617 null] /Parent 365 0 R /Prev 366 0 R /Next 368 0 R >> endobj 368 0 obj << /Title (List of Operations) /Dest [103 0 R /XYZ null 406 null] /Parent 365 0 R /Prev 367 0 R >> endobj 369 0 obj << /Title (References) /Dest [341 0 R /XYZ null 587 null] /Parent 362 0 R /Prev 365 0 R >> endobj 361 0 obj << /P 341 0 R /R [63 63 549 729] /V 338 0 R /N 17 0 R >> endobj 17 0 obj << /T 16 0 R /P 1 0 R /R [63 63 549 729] /V 361 0 R /N 34 0 R >> endobj 381 0 obj [ 16 0 R ] endobj 382 0 obj << /Limits [(F) (G1000493)] /Names [(F) 15 0 R (G1000018) 174 0 R (G1000019) 175 0 R (G1000020) 176 0 R (G1000021) 177 0 R (G1000022) 178 0 R (G1000023) 179 0 R (G1000024) 180 0 R (G1000038) 217 0 R (G1000039) 218 0 R (G1000040) 219 0 R (G1000041) 220 0 R (G1000042) 221 0 R (G1000043) 222 0 R (G1000044) 223 0 R (G1000045) 224 0 R (G1000046) 225 0 R (G1000047) 226 0 R (G1000048) 232 0 R (G1000049) 233 0 R (G1000054) 227 0 R (G1000055) 228 0 R (G1000056) 229 0 R (G1000059) 231 0 R (G1000066) 230 0 R (G1000073) 234 0 R (G1000084) 182 0 R (G1000085) 188 0 R (G1000097) 167 0 R (G1000098) 168 0 R (G1000106) 152 0 R (G1000115) 128 0 R (G1000116) 129 0 R (G1000128) 248 0 R (G1000136) 249 0 R (G1000137) 250 0 R (G1000138) 251 0 R (G1000139) 252 0 R (G1000140) 253 0 R (G1000141) 254 0 R (G1000145) 262 0 R (G1000189) 255 0 R (G1000190) 256 0 R (G1000191) 257 0 R (G1000192) 258 0 R (G1000193) 259 0 R (G1000194) 261 0 R (G1000216) 260 0 R (G1000225) 181 0 R (G1000232) 166 0 R (G1000239) 344 0 R (G1000288) 323 0 R (G1000289) 324 0 R (G1000290) 325 0 R (G1000300) 322 0 R (G1000345) 346 0 R (G1000382) 347 0 R (G1000425) 348 0 R (G1000426) 349 0 R (G1000427) 350 0 R (G1000448) 331 0 R (G1000449) 332 0 R (G1000450) 333 0 R (G1000493) 291 0 R] >> endobj 383 0 obj << /Limits [(G1000504) (G1000923)] /Names [(G1000504) 281 0 R (G1000506) 290 0 R (G1000510) 282 0 R (G1000511) 283 0 R (G1000512) 284 0 R (G1000543) 279 0 R (G1000560) 268 0 R (G1000561) 269 0 R (G1000562) 270 0 R (G1000571) 271 0 R (G1000572) 272 0 R (G1000575) 275 0 R (G1000579) 276 0 R (G1000583) 277 0 R (G1000590) 278 0 R (G1000687) 70 0 R (G1000688) 112 0 R (G1000689) 139 0 R (G1000690) 137 0 R (G1000692) 156 0 R (G1000693) 171 0 R (G1000694) 172 0 R (G1000695) 191 0 R (G1000696) 242 0 R (G1000697) 265 0 R (G1000789) 215 0 R (G1000801) 204 0 R (G1000806) 203 0 R (G1000814) 193 0 R (G1000815) 194 0 R (G1000823) 195 0 R (G1000824) 196 0 R (G1000826) 197 0 R (G1000827) 198 0 R (G1000830) 199 0 R (G1000831) 200 0 R (G1000851) 214 0 R (G1000853) 205 0 R (G1000854) 206 0 R (G1000855) 207 0 R (G1000856) 208 0 R (G1000857) 209 0 R (G1000858) 210 0 R (G1000859) 211 0 R (G1000860) 212 0 R (G1000861) 213 0 R (G1000864) 345 0 R (G1000875) 201 0 R (G1000876) 202 0 R (G1000880) 240 0 R (G1000881) 241 0 R (G1000885) 130 0 R (G1000886) 131 0 R (G1000894) 153 0 R (G1000902) 154 0 R (G1000903) 155 0 R (G1000907) 169 0 R (G1000908) 170 0 R (G1000912) 189 0 R (G1000913) 190 0 R (G1000917) 263 0 R (G1000918) 264 0 R (G1000921) 329 0 R (G1000923) 327 0 R] >> endobj 384 0 obj << /Limits [(G1000924) (G997567)] /Names [(G1000924) 328 0 R (G1000936) 326 0 R (G1000943) 334 0 R (G1000944) 335 0 R (G1000945) 336 0 R (G1000961) 245 0 R (G1000981) 244 0 R (G1000990) 7 0 R (G1001002) 5 0 R (G1001005) 9 0 R (G1001022) 273 0 R (G1001023) 274 0 R (G1001046) 92 0 R (G1001056) 93 0 R (G1001064) 94 0 R (G1001067) 97 0 R (G1001075) 98 0 R (G1001098) 320 0 R (G1001104) 293 0 R (G1001107) 296 0 R (G1001108) 297 0 R (G1001109) 298 0 R (G1001110) 299 0 R (G1001111) 300 0 R (G1001126) 294 0 R (G1001127) 295 0 R (G1001134) 302 0 R (G1001135) 303 0 R (G1001136) 304 0 R (G1001139) 301 0 R (G1001145) 305 0 R (G1001146) 306 0 R (G1001147) 307 0 R (G1001153) 309 0 R (G1001154) 310 0 R (G1001155) 311 0 R (G1001162) 308 0 R (G1001180) 312 0 R (G1001181) 313 0 R (G1001193) 315 0 R (G1001194) 316 0 R (G1001195) 317 0 R (G1001196) 318 0 R (G1001197) 319 0 R (G1001205) 314 0 R (G997335) 3 0 R (G997338) 2 0 R (G997347) 4 0 R (G997358) 12 0 R (G997360) 28 0 R (G997371) 30 0 R (G997372) 31 0 R (G997378) 32 0 R (G997382) 38 0 R (G997383) 39 0 R (G997384) 40 0 R (G997385) 41 0 R (G997386) 42 0 R (G997387) 43 0 R (G997388) 47 0 R (G997390) 56 0 R (G997391) 57 0 R (G997394) 61 0 R (G997567) 59 0 R] >> endobj 385 0 obj << /Limits [(G997568) (G999785)] /Names [(G997568) 60 0 R (G997571) 62 0 R (G997581) 64 0 R (G997603) 157 0 R (G997604) 280 0 R (G997639) 115 0 R (G997658) 158 0 R (G997663) 192 0 R (G997665) 173 0 R (G997672) 140 0 R (G997679) 116 0 R (G997689) 105 0 R (G997698) 292 0 R (G997702) 321 0 R (G997703) 330 0 R (G997704) 107 0 R (G997712) 109 0 R (G997713) 110 0 R (G997714) 113 0 R (G997823) 48 0 R (G997952) 49 0 R (G997963) 8 0 R (G997984) 106 0 R (G997988) 108 0 R (G998097) 6 0 R (G998684) 67 0 R (G998823) 72 0 R (G998824) 90 0 R (G998865) 10 0 R (G998866) 11 0 R (G998964) 58 0 R (G999004) 343 0 R (G999010) 342 0 R (G999023) 65 0 R (G999024) 66 0 R (G999033) 44 0 R (G999039) 63 0 R (G999055) 45 0 R (G999056) 46 0 R (G999098) 91 0 R (G999101) 104 0 R (G999157) 247 0 R (G999215) 95 0 R (G999218) 351 0 R (G999268) 266 0 R (G999271) 246 0 R (G999281) 216 0 R (G999282) 243 0 R (G999296) 267 0 R (G999324) 26 0 R (G999328) 352 0 R (G999329) 29 0 R (G999352) 27 0 R (G999365) 355 0 R (G999412) 353 0 R (G999415) 354 0 R (G999422) 356 0 R (G999437) 357 0 R (G999450) 358 0 R (G999568) 96 0 R (G999780) 68 0 R (G999781) 69 0 R (G999782) 71 0 R (G999785) 82 0 R] >> endobj 386 0 obj << /Limits [(G999786) (P.9)] /Names [(G999786) 83 0 R (G999787) 84 0 R (G999788) 85 0 R (G999789) 86 0 R (G999793) 88 0 R (G999794) 89 0 R (G999798) 87 0 R (G999824) 111 0 R (G999827) 114 0 R (G999851) 149 0 R (G999869) 117 0 R (G999870) 125 0 R (G999871) 126 0 R (G999872) 138 0 R (G999878) 127 0 R (G999883) 118 0 R (G999891) 124 0 R (G999896) 119 0 R (G999897) 120 0 R (G999902) 121 0 R (G999908) 122 0 R (G999914) 123 0 R (G999922) 141 0 R (G999923) 142 0 R (G999924) 143 0 R (G999925) 144 0 R (G999926) 145 0 R (G999927) 146 0 R (G999928) 147 0 R (G999929) 148 0 R (G999935) 150 0 R (G999936) 151 0 R (G999957) 159 0 R (G999965) 160 0 R (G999966) 161 0 R (G999967) 162 0 R (G999977) 163 0 R (G999981) 164 0 R (G999985) 165 0 R (L) 360 0 R (P.1) 14 0 R (P.10) 337 0 R (P.11) 359 0 R (P.2) 33 0 R (P.3) 50 0 R (P.4) 73 0 R (P.5) 99 0 R (P.6) 132 0 R (P.7) 183 0 R (P.8) 235 0 R (P.9) 285 0 R] >> endobj 387 0 obj << /Kids [382 0 R 383 0 R 384 0 R 385 0 R 386 0 R] >> endobj 388 0 obj << /Dests 387 0 R >> endobj 389 0 obj << /Type /Catalog /Pages 373 0 R /Outlines 380 0 R /Threads 381 0 R /Names 388 0 R /OpenAction [1 0 R /XYZ null null null] /PageMode /UseOutlines >> endobj xref 0 390 0000000000 65535 f 0000076306 00000 n 0000000017 00000 n 0000000073 00000 n 0000000128 00000 n 0000000184 00000 n 0000000240 00000 n 0000000296 00000 n 0000000352 00000 n 0000000408 00000 n 0000000464 00000 n 0000000521 00000 n 0000000578 00000 n 0000000635 00000 n 0000000886 00000 n 0000000944 00000 n 0000001002 00000 n 0000079378 00000 n 0000001062 00000 n 0000005791 00000 n 0000074551 00000 n 0000074642 00000 n 0000074736 00000 n 0000074471 00000 n 0000077752 00000 n 0000076434 00000 n 0000005923 00000 n 0000005981 00000 n 0000006039 00000 n 0000006097 00000 n 0000006155 00000 n 0000006213 00000 n 0000006271 00000 n 0000006329 00000 n 0000012352 00000 n 0000006388 00000 n 0000011466 00000 n 0000076563 00000 n 0000011598 00000 n 0000011656 00000 n 0000011714 00000 n 0000011772 00000 n 0000011830 00000 n 0000011888 00000 n 0000011946 00000 n 0000012004 00000 n 0000012062 00000 n 0000012120 00000 n 0000012178 00000 n 0000012236 00000 n 0000012293 00000 n 0000020441 00000 n 0000012431 00000 n 0000019264 00000 n 0000074828 00000 n 0000076692 00000 n 0000019396 00000 n 0000019454 00000 n 0000019512 00000 n 0000019570 00000 n 0000019628 00000 n 0000019686 00000 n 0000019744 00000 n 0000019802 00000 n 0000019860 00000 n 0000019918 00000 n 0000019976 00000 n 0000020034 00000 n 0000020092 00000 n 0000020150 00000 n 0000020208 00000 n 0000020266 00000 n 0000020324 00000 n 0000020382 00000 n 0000031274 00000 n 0000020520 00000 n 0000029969 00000 n 0000073155 00000 n 0000073578 00000 n 0000073997 00000 n 0000030187 00000 n 0000076821 00000 n 0000030229 00000 n 0000030287 00000 n 0000030345 00000 n 0000030403 00000 n 0000030461 00000 n 0000030519 00000 n 0000030577 00000 n 0000030635 00000 n 0000030693 00000 n 0000030751 00000 n 0000030809 00000 n 0000030867 00000 n 0000030925 00000 n 0000030983 00000 n 0000031041 00000 n 0000031099 00000 n 0000031157 00000 n 0000031215 00000 n 0000037918 00000 n 0000031354 00000 n 0000036033 00000 n 0000076953 00000 n 0000036178 00000 n 0000036238 00000 n 0000036298 00000 n 0000036358 00000 n 0000036418 00000 n 0000036478 00000 n 0000036538 00000 n 0000036598 00000 n 0000036658 00000 n 0000036718 00000 n 0000036778 00000 n 0000036838 00000 n 0000036898 00000 n 0000036958 00000 n 0000037018 00000 n 0000037078 00000 n 0000037138 00000 n 0000037198 00000 n 0000037258 00000 n 0000037318 00000 n 0000037378 00000 n 0000037438 00000 n 0000037498 00000 n 0000037558 00000 n 0000037618 00000 n 0000037678 00000 n 0000037738 00000 n 0000037798 00000 n 0000037857 00000 n 0000045516 00000 n 0000037999 00000 n 0000042551 00000 n 0000077086 00000 n 0000042696 00000 n 0000042756 00000 n 0000042816 00000 n 0000042876 00000 n 0000042936 00000 n 0000042996 00000 n 0000043056 00000 n 0000043116 00000 n 0000043176 00000 n 0000043236 00000 n 0000043296 00000 n 0000043356 00000 n 0000043416 00000 n 0000043476 00000 n 0000043536 00000 n 0000043596 00000 n 0000043656 00000 n 0000043716 00000 n 0000043776 00000 n 0000043836 00000 n 0000043896 00000 n 0000043956 00000 n 0000044016 00000 n 0000044076 00000 n 0000044136 00000 n 0000044196 00000 n 0000044256 00000 n 0000044316 00000 n 0000044376 00000 n 0000044436 00000 n 0000044496 00000 n 0000044556 00000 n 0000044616 00000 n 0000044676 00000 n 0000044736 00000 n 0000044796 00000 n 0000044856 00000 n 0000044916 00000 n 0000044976 00000 n 0000045036 00000 n 0000045096 00000 n 0000045156 00000 n 0000045216 00000 n 0000045276 00000 n 0000045336 00000 n 0000045396 00000 n 0000045455 00000 n 0000052522 00000 n 0000045599 00000 n 0000049509 00000 n 0000077219 00000 n 0000049642 00000 n 0000049702 00000 n 0000049762 00000 n 0000049822 00000 n 0000049882 00000 n 0000049942 00000 n 0000050002 00000 n 0000050062 00000 n 0000050122 00000 n 0000050182 00000 n 0000050242 00000 n 0000050302 00000 n 0000050362 00000 n 0000050422 00000 n 0000050482 00000 n 0000050542 00000 n 0000050602 00000 n 0000050662 00000 n 0000050722 00000 n 0000050782 00000 n 0000050842 00000 n 0000050902 00000 n 0000050962 00000 n 0000051022 00000 n 0000051082 00000 n 0000051142 00000 n 0000051202 00000 n 0000051262 00000 n 0000051322 00000 n 0000051382 00000 n 0000051442 00000 n 0000051502 00000 n 0000051562 00000 n 0000051622 00000 n 0000051682 00000 n 0000051742 00000 n 0000051802 00000 n 0000051862 00000 n 0000051922 00000 n 0000051982 00000 n 0000052042 00000 n 0000052102 00000 n 0000052162 00000 n 0000052222 00000 n 0000052282 00000 n 0000052342 00000 n 0000052402 00000 n 0000052461 00000 n 0000058576 00000 n 0000052605 00000 n 0000055683 00000 n 0000077352 00000 n 0000055816 00000 n 0000055876 00000 n 0000055936 00000 n 0000055996 00000 n 0000056056 00000 n 0000056116 00000 n 0000056176 00000 n 0000056236 00000 n 0000056296 00000 n 0000056356 00000 n 0000056416 00000 n 0000056476 00000 n 0000056536 00000 n 0000056596 00000 n 0000056656 00000 n 0000056716 00000 n 0000056776 00000 n 0000056836 00000 n 0000056896 00000 n 0000056956 00000 n 0000057016 00000 n 0000057076 00000 n 0000057136 00000 n 0000057196 00000 n 0000057256 00000 n 0000057316 00000 n 0000057376 00000 n 0000057436 00000 n 0000057496 00000 n 0000057556 00000 n 0000057616 00000 n 0000057676 00000 n 0000057736 00000 n 0000057796 00000 n 0000057856 00000 n 0000057916 00000 n 0000057976 00000 n 0000058036 00000 n 0000058096 00000 n 0000058156 00000 n 0000058216 00000 n 0000058276 00000 n 0000058336 00000 n 0000058396 00000 n 0000058456 00000 n 0000058515 00000 n 0000065276 00000 n 0000058659 00000 n 0000062263 00000 n 0000077485 00000 n 0000062396 00000 n 0000062456 00000 n 0000062516 00000 n 0000062576 00000 n 0000062636 00000 n 0000062696 00000 n 0000062756 00000 n 0000062816 00000 n 0000062876 00000 n 0000062936 00000 n 0000062996 00000 n 0000063056 00000 n 0000063116 00000 n 0000063176 00000 n 0000063236 00000 n 0000063296 00000 n 0000063356 00000 n 0000063416 00000 n 0000063476 00000 n 0000063536 00000 n 0000063596 00000 n 0000063656 00000 n 0000063716 00000 n 0000063776 00000 n 0000063836 00000 n 0000063896 00000 n 0000063956 00000 n 0000064016 00000 n 0000064076 00000 n 0000064136 00000 n 0000064196 00000 n 0000064256 00000 n 0000064316 00000 n 0000064376 00000 n 0000064436 00000 n 0000064496 00000 n 0000064556 00000 n 0000064616 00000 n 0000064676 00000 n 0000064736 00000 n 0000064796 00000 n 0000064856 00000 n 0000064916 00000 n 0000064976 00000 n 0000065036 00000 n 0000065096 00000 n 0000065156 00000 n 0000065215 00000 n 0000069607 00000 n 0000065359 00000 n 0000068332 00000 n 0000077618 00000 n 0000068465 00000 n 0000068525 00000 n 0000068585 00000 n 0000068645 00000 n 0000068705 00000 n 0000068765 00000 n 0000068825 00000 n 0000068885 00000 n 0000068945 00000 n 0000069005 00000 n 0000069065 00000 n 0000069125 00000 n 0000069185 00000 n 0000069245 00000 n 0000069305 00000 n 0000069365 00000 n 0000069425 00000 n 0000069485 00000 n 0000069546 00000 n 0000079296 00000 n 0000078158 00000 n 0000078344 00000 n 0000078473 00000 n 0000078614 00000 n 0000078791 00000 n 0000078918 00000 n 0000079056 00000 n 0000079180 00000 n 0000069690 00000 n 0000072912 00000 n 0000074915 00000 n 0000077988 00000 n 0000077903 00000 n 0000073070 00000 n 0000073493 00000 n 0000073912 00000 n 0000074337 00000 n 0000075026 00000 n 0000078090 00000 n 0000079468 00000 n 0000079499 00000 n 0000080777 00000 n 0000082069 00000 n 0000083309 00000 n 0000084505 00000 n 0000085433 00000 n 0000085509 00000 n 0000085552 00000 n trailer << /Size 390 /Root 389 0 R /Info 13 0 R /ID [] >> startxref 85729 %%EOF ga-5-4/armci/doc/README.myrinet0000644000175000017500000000775412662210420014246 0ustar mbambaThe following instructions describe how to setup Myrinet and build ARMCI to run over Myrinet using the Myricom GM interface and MPICH/GM. Notes: - any other message-passing library is not supported - This code was tested and is supported only on Linux Intel & Sparc and Solaris/sparc platforms. If you have other configuration please try if it works, otherwise please send a message to 1. Installation of Myrinet and the GM library (must have root privilege) * To build gm on linux smp nodes, run configure with the following options. For details, refer to README-linux. --enable-linux-smp --enable-linux-modversions then run make * Install the driver, cd binary ./GM_INSTAll * Run mapper cd sbin mapper active.args * Check the configuration gm_board_info It lists the driver information and routing table. 2. Setting up the environment * Note: We strongly recommend using GM version 1.2 or higher * ARMCI on top of GM requires the following environment variables to be set (Examples are taken on colony cluster of PNNL, using csh) setenv TARGET LINUX setenv GM_HOME /home/myrinet/gm-1.2/gm setenv GM_INCLUDE $GM_HOME/include setenv GM_LIB $GM_HOME/lib setenv ARMCI_NETWORK GM * For MPICH-GM the following additional environment variables need to be set (again using examples of colony cluster of PNNL and csh) setenv MPI_LOC /home/myrinet/mpich-1.2/mpich-gm setenv MPI_LIB $MPI_LOC/build/LINUX/ch_gm/lib setenv MPI_INCLUDE $MPI_LOC/include set path = ($MPI_LOC/bin $MPI_LOC/build/LINUX/ch_gm/bin $path) setenv LIBMPI -lmpich However, if you prefer to use MPICH compiler wrappers mpicc, mpif77 etc these definitions are not needed. Also, since the default name for the MPI library assumed by armci is -lmpi, you would need to set LIBMPI="" or "-lmpich". -- without PBS set a $HOME/.gmpi/conf file like this: # .gmpi/conf file begin # first the number of nodes in the file 8 # the list of (node,port) that make the MPI World nb26.colony.emsl.pnnl.gov 2 nb26.colony.emsl.pnnl.gov 4 nb27.colony.emsl.pnnl.gov 2 nb27.colony.emsl.pnnl.gov 4 nb28.colony.emsl.pnnl.gov 2 nb28.colony.emsl.pnnl.gov 4 nb29.colony.emsl.pnnl.gov 2 nb29.colony.emsl.pnnl.gov 4 # .gmpi/conf file end -- with PBS node files are created dynamically, but should have the same format as the default .gmpi/conf IT IS REQUIRED THAT MPI TASKS RUNNING ON THE SAME SMP NODE BE NUMBERED CONSECUTIVELY GM Port Usage: The current ARMCI implementation uses two GM ports. If STATIC_PORTS is defined, they are called ARMCI_GM_SERVER_RCV_PORT ARMCI_GM_SERVER_SND_PORT The default port numbers are 5 and 6, set in the file armci/src/myrinet.h. Users can choose different ports by editing the definition, depending on the system settings and at least not conflicting with the ports used by MPI. If STATIC_PORTS is NOT defined, ARMCI will search for first two available ports on up to two myrinet boards. 3. Test run Go to armci/src and make test.x Using mpich-gm: run it as regular mpi programs (make sure the mpirun is come from mpich-gm. many systems have multiple mpi installed) mpirun -np #procs test.x This will read the default .gmpi/conf 4. Contact info and bug report email: parsoft-support@emsl.pnl.gov 5. Other issues: GM does not allow fork. This system call is normally used on Unix in ARMCI to test how big a shared memory segment can be allocated. This test is diabled under Myrinet/GM. It means that ARMCI can use only shared memory segments predefined _SHMMAX in shmem.c for a particular platform. If you increase that limit in the system, _SHMMAX must be accordingly modiefied and ARMCI recompiled. The current port or ARMCI to GM is not fully optimized yet. ga-5-4/armci/doc/README.PVM0000644000175000017500000000305012662210420013202 0ustar mbamba Regarding to the group used in PVM, a global variable is defined in armci.h and a extra optional function, ARMCI_PVM_Init, can be used to pass a PVM group to ARMCI. On CrayT3E: the default group is the global group which is (char *)NULL It is the only working group. On Workstations: the default group is "mp_working_group". User can set the group name by calling the ARMCI_PVM_init (defined in message.c) and passing the group name to the library. Differencies between Cray and Unix Workstations 1. Linker libraries: On Cray: -lpvm3 On Unix Workstations: -lgpvm3 -lpvm3 also need the group lib 2. Groups On Cray: There is a default global group, which can be referred to (char *)NULL, or PVMALL) On Unix Workstations: There is no default group. 3. Obtaining PE number. On Cray: pvm_get_PE(get_mytid()) to obtain their own PE number. On Unix Workstations: pvm_getinst(group, mytid) standard. 4. Running the program On Cray: PVM daemon should not be started. The pvm_spawn is not called. The number of process is controlled at compile time, or by using the run command mpprun. mpprun -n 4 test.x So there is no need to initialize the PVM in the test.c On Unix Workstations: Must run PVM daemon first % pvm and then quit Call pvm_spawn to creat other processes. In test.c, there is a initialization routine and the format to run is test.x ga-5-4/armci/tcgmsg/0000755000175000017500000000000012662210402012402 5ustar mbambaga-5-4/armci/tcgmsg/ipcv5.0/0000755000175000017500000000000012662210402013566 5ustar mbambaga-5-4/armci/tcgmsg/ipcv5.0/shmem.c0000644000175000017500000001342512662210402015050 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * * $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/shmem.c,v 1.4 2002-01-24 22:07:27 d3h325 Exp $ * * This stuff attempts to provide a simple interface to temporary shared * memory regions, loosely modelled after that of Alliant Concentrix 5.0 * * * Note that the input arguments switch between integers and pointers * to integers depending on if they are modified on return. * * * Create a shared region of at least size bytes, returning the actual size, * the id associated with the region. The return value is a pointer to the * the region. Any error is a hard fail. * * (char *) CreateSharedRegion((long *) id, (long *) size) * * * Detach a process from a shared memory region. 0 is returned on success, * -1 for failure. id, size, and addr must match exactly those items returned * from CreateSharedRegion * * long DetachSharedRegion((long) id, (long) size, (char *) addr) * * * Delete a shared region from the system. This has to be done on the SUN * to remove it from the system. On the Alliant the shared region disappears * when the last process dies or detaches. Returns 0 on success, -1 on error. * * long DeleteSharedRegion((long) id) * * * Delete all the shared regions associated with this process. * * long DeleteSharedAll() * * * Attach to a shared memory region of known id and size. Returns the * address of the mapped memory. Size must exactly match the size returned * from CreateSharedRegion (which in turn is the requested size rounded * up to a multiple of 4096). Any error is a hard fail. * * (char *) AttachSharedRegion((long) id, (long) size)) */ extern void Error(const char *, long); #if !defined(MMAP) || defined(MACX) #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SHM_H # include #endif #ifdef SUN extern int shmget(key_t, int, int); extern int shmdt(void *); extern int shmctl(int, int, struct shmid_ds *); extern void *shmat(int, const void *, int); #endif char *CreateSharedRegion(long *id, long *size) { char *temp; /* Create the region */ if ( (*id = shmget(IPC_PRIVATE, (int) *size, (int) (IPC_CREAT | 00600))) < 0 ) Error("CreateSharedRegion: failed to create shared region", (long) *id); /* Attach to the region */ if ( (long) (temp = shmat((int) *id, (char *) NULL, 0)) == -1L) Error("CreateSharedRegion: failed to attach to shared region", 0L); return temp; } long DetachSharedRegion(long id, long size, char *addr) { return shmdt(addr); } long DeleteSharedRegion(long id) { return shmctl((int) id, IPC_RMID, (struct shmid_ds *) NULL); } char *AttachSharedRegion(long id, long size) { char *temp; if ( (long) (temp = shmat((int) id, (char *) NULL, 0)) == -1L) Error("AttachSharedRegion: failed to attach to shared region", 0L); return temp; } #else /* MMAP */ #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_FILE_H # include #endif #if HAVE_SYS_MMAN_H # include #endif extern char *strdup(); extern char *mktemp(); #define MAX_ID 20 static struct id_list_struct { char *addr; /* pointer to shmem region */ unsigned size; /* size of region */ char *filename; /* associated file name */ int fd; /* file descriptor */ int status; /* = 1 if in use */ } id_list[MAX_ID]; static int next_id = 0; static char template[] = "/tmp/SHMEM.XXXXXX"; char *CreateSharedRegion(id, size) long *size, *id; { char *temp; if (next_id == MAX_ID) Error("CreateSharedRegion: MAX_ID exceeded ", MAX_ID); *id = next_id; if ( (temp = strdup(template)) == (char *) NULL) Error("CreateSharedRegion: failed to get space for filename", 0); /* Generate scratch file to identify region ... need to know this name to attach to the region so need to establish some policy before AttachtoSharedRegion can work */ id_list[*id].filename = mktemp(temp); if ( (id_list[*id].fd = open(id_list[*id].filename, O_RDWR|O_CREAT, 0666)) < 0) Error("CreateSharedRegion: failed to open temporary file",0); id_list[*id].addr = mmap((caddr_t) 0, (size_t)*size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, id_list[*id].fd, 0); if (id_list[*id].addr == (char *) -1) Error("CreateSharedRegion: mmap failed",-1); id_list[*id].size = *size; id_list[*id].status = 1; next_id++; return id_list[*id].addr; } long DetachSharedRegion(long id, long size, char *addr) { if ( (id < 0) || (id > next_id)) return (long) -1; if (id_list[id].status != 1) return (long) -1; id_list[id].status = 0; return (long) munmap(id_list[id].addr, 0); } long DeleteSharedRegion(long id) { if ( (id < 0) || (id > next_id) ) return (long) -1; if (id_list[id].status != 1) return (long) -1; (void) DetachSharedRegion(id, 0, (char *) 0); if (id_list[id].fd >= 0) { (void) close(id_list[id].fd); (void) unlink(id_list[id].filename); } return (long) 0; } char *AttachSharedRegion(long id, long size) { Error("AttachSharedRegion: need mods for this to work on CONVEX", (long) -1); } long DeleteSharedAll() { long id; long status = 0; for (id=0; id #endif #if HAVE_STRING_H # include #endif #include "srftoc.h" #include "sndrcv.h" /** * Hewlett Packard Risc box and new SparcWorks F77 2.* compilers. * Have to construct the argument list by calling FORTRAN. */ void PBEGINF_() { } /** * Alternative entry for those senstive to FORTRAN making reference * to 7 character external names */ void PBGINF_() { PBEGINF_(); } ga-5-4/armci/tcgmsg/ipcv5.0/queues.c0000644000175000017500000001042212662210402015240 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif extern void free(void *ptr); #include "tcgmsgP.h" static const long false = 0; static const long true = 1; extern void Busy(int); extern long async_send(SendQEntry *); /** * Given a nodeid return a unqiue integer constructed by * combining it with the value of a counter */ static long NextMsgID(long node) { static long id = 0; static long mask = (1<<20)-1; id = (id + 1) & mask; if (id == 0) id = 1; return (node << 20) + id; } /** * Given an id from NextMsgID extract the node */ static long NodeFromMsgID(long msgid) { long node = msgid >> 20; if (node < 0 || node > NNODES_()) Error("NodeFromMsgID: invalid msgid", msgid); return node; } /** * Flush as many messages as possible without blocking from * the send q to the specified node. */ static void flush_send_q_node(long node) { while (TCGMSG_proc_info[node].sendq) { if (!async_send(TCGMSG_proc_info[node].sendq)) { /* Send is incomplete ... stop processing this q*/ break; } else { SendQEntry *tmp = TCGMSG_proc_info[node].sendq; TCGMSG_proc_info[node].sendq = (SendQEntry *) TCGMSG_proc_info[node].sendq->next; if (tmp->free_buf_on_completion) (void) free(tmp->buf); tmp->active = false; /* Matches NewSendQEntry() */ } } } /** * Flush as many messages as possible without blocking * from all of the send q's. */ void flush_send_q() { long node; long nproc = NNODES_(); for (node=0; nodenext) { if (entry->msgid == msgid) { status = 0; break; } } return status; } /** * Wait for the operation referred to by msgid to complete. */ void msg_wait(long msgid) { long nspin = 0; long spinlim = 1000000; while (!msg_status(msgid)) { nspin++; if (nspin < spinlim) Busy(100); else usleep(1); } } static SendQEntry *NewSendQEntry(void) { SendQEntry *new = TCGMSG_sendq_ring; if (new->active) Error("NewSendQEntry: too many outstanding sends\n", 0L); TCGMSG_sendq_ring = (SendQEntry *) TCGMSG_sendq_ring->next_in_ring; new->active = true; return new; } long msg_async_snd(long type, char *buf, long lenbuf, long node) { long msgid; SendQEntry *entry; if (node<0 || node>=TCGMSG_nnodes) Error("msg_async_send: node is out of range", node); if (node == TCGMSG_nodeid) Error("msg_async_send: cannot send to self", node); msgid = NextMsgID(node); entry = NewSendQEntry(); /* Insert a new entry into the q */ entry->tag = TCGMSG_proc_info[node].n_snd++; /* Increment tag */ entry->msgid = msgid; entry->type = type; entry->buf = buf; entry->free_buf_on_completion = 0; entry->lenbuf= lenbuf; entry->node = node; entry->next = (SendQEntry *) 0; entry->written = 0; entry->buffer_number = 0; /* Attach to the send q */ if (!TCGMSG_proc_info[node].sendq) TCGMSG_proc_info[node].sendq = entry; else { SendQEntry *cur = TCGMSG_proc_info[node].sendq; while (cur->next) cur = cur->next; cur->next = entry; } /* Attempt to flush the send q */ flush_send_q(); return msgid; } /** * synchronous send of message to a process * * long *type = user defined integer message type (input) * char *buf = data buffer (input) * long *lenbuf = length of buffer in bytes (input) * long *node = node to send to (input) * * for zero length messages only the header is sent */ void msg_snd(long type, char *buf, long lenbuf, long node) { msg_wait(msg_async_snd(type, buf, lenbuf, node)); } ga-5-4/armci/tcgmsg/ipcv5.0/checkbyte.c0000644000175000017500000000075512662210402015702 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/checkbyte.c,v 1.2 1994-12-30 20:55:37 d3h325 Exp $ */ unsigned char CheckByte(unsigned char *c, long n) { /* unsigned char sum = (char) 0; while (n-- > 0) sum = sum ^ *c++; return sum; */ unsigned int sum = 0; unsigned int mask = 0xff; while (n-- > 0) sum += (int) *c++; sum = (sum + (sum>>8) + (sum>>16) + (sum>>24)) & mask; return (unsigned char) sum; } ga-5-4/armci/tcgmsg/ipcv5.0/snd_rcv_probe.c0000644000175000017500000001505612662210402016566 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif extern void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); #include "srftoc.h" #include "sndrcv.h" #include "tcgmsgP.h" extern long MatchShmMessage(); extern void msg_wait(); extern long DEBUG_; #define INVALID_NODE -3333 /* used to stamp completed msg in the queue */ #define MAX_Q_LEN MAX_PROC /* Maximum no. of outstanding messages */ static volatile long n_in_msg_q = 0; /* actual no. in the message q */ static struct msg_q_struct{ long msg_id; long node; long type; } msg_q[MAX_Q_LEN]; /** * Return 1/0 (TRUE/FALSE) if a message of the given type is available * from the given node. If the node is specified as -1, then all nodes * will be examined. Some attempt is made at ensuring fairness. * * If node is specified as -1 then this value is overwritten with the * node that we got the message from. */ long ProbeNode(long *type, long *node) { static long next_node = 0; long nproc = NNODES_(); long me = NODEID_(); long found = 0; long cur_node; int i, proclo, prochi; if (*node == me) Error("PROBE_ : cannot recv message from self, msgtype=", *type); if (*node == -1) { /* match anyone */ proclo = 0; prochi = nproc-1; cur_node = next_node; } else proclo = prochi = cur_node = *node; for(i = proclo; i<= prochi; i++) { if (cur_node != me){ /* can't receive from self */ found = MatchShmMessage(cur_node, *type); if (found) break; } cur_node = (cur_node +1)%nproc; } if(found) *node = cur_node; /* if wildcard node, determine which node we'll start with next time */ if(*type == -1) next_node = (cur_node +1)%nproc; return(found); } /** * Return 1/0 (TRUE/FALSE) if a message of the given type is available * from the given node. If the node is specified as -1, then all nodes * will be examined. Some attempt is made at ensuring fairness. */ long PROBE_(long *type, long *node) { long nnode = *node; long result; result = ProbeNode(type, &nnode); return(result); } /** * long *type = user defined type of received message (input) * char *buf = data buffer (output) * long *lenbuf = length of buffer in bytes (input) * long *lenmes = length of received message in bytes (output) * (exceeding receive buffer is hard error) * long *nodeselect = node to receive from (input) * -1 implies that any pending message of the specified * type may be received * long *nodefrom = node message is received from (output) * long *sync = flag for sync(1) or async(0) receipt (input) */ void RCV_(long *type, void *buf, long *lenbuf, long *lenmes, long *nodeselect, long *nodefrom, long *sync) { static long ttype; static long node; long me = NODEID_(); void msg_rcv(); node = *nodeselect; ttype = *type; if (DEBUG_) { printf("RCV_: node %ld receiving from %ld, len=%ld, type=%ld, sync=%ld\n", (long)me, (long)*nodeselect, (long)*lenbuf, (long)*type, (long)*sync); fflush(stdout); } /* wait for a matching message */ if(node==-1) while(ProbeNode(type, &node) == 0); msg_rcv(ttype, buf, *lenbuf, lenmes, node); *nodefrom = node; if (DEBUG_) { (void) printf("RCV: me=%ld, from=%ld, len=%ld\n", (long)me, (long)*nodeselect, (long)*lenbuf); (void) fflush(stdout); } } /** * long *type = user defined integer message type (input) * char *buf = data buffer (input) * long *lenbuf = length of buffer in bytes (input) * long *node = node to send to (input) * long *sync = flag for sync(1) or async(0) communication (input) */ void SND_(long *type, void *buf, long *lenbuf, long *node, long *sync) { long me = NODEID_(); long msg_async_snd(); /*asynchronous communication not supported under LAPI */ #ifdef LAPI long block = 1; #else long block = *sync; #endif if (DEBUG_) { (void)printf("SND_: node %ld sending to %ld, len=%ld, type=%ld, sync=%ld\n", (long)me, (long)*node, (long)*lenbuf, (long)*type, (long)*sync); (void) fflush(stdout); } if (block) msg_wait(msg_async_snd(*type, buf, *lenbuf, *node)); else { if (n_in_msg_q >= MAX_Q_LEN) Error("SND: overflowing async Q limit", n_in_msg_q); msg_q[n_in_msg_q].msg_id = msg_async_snd(*type, buf, *lenbuf, *node); msg_q[n_in_msg_q].node = *node; msg_q[n_in_msg_q].type = *type; n_in_msg_q++; } if (DEBUG_) { (void) printf("SND: me=%ld, to=%ld, len=%ld \n", (long)me, (long)*node, (long)*lenbuf); (void) fflush(stdout); } } int compare_msg_q_entries(const void* entry1, const void* entry2) { /* nodes are nondistiguishable unless one of them is INVALID_NODE */ if( ((struct msg_q_struct*)entry1)->node == ((struct msg_q_struct*)entry2)->node) return 0; if( ((struct msg_q_struct*)entry1)->node == INVALID_NODE) return 1; if( ((struct msg_q_struct*)entry2)->node == INVALID_NODE) return -1; return 0; } /** * Wait for all messages (send/receive) to complete between * this node and node *nodesel or everyone if *nodesel == -1. */ void WAITCOM_(long *nodesel) { long i, found = 0; for (i=0; i #endif #include "tcgmsgP.h" /** * Wrapper around nice for FORTRAN users courtesy of Rick Kendall * ... C has the system interface. */ long NICEFTN_(long *ival) { int val = (int)(*ival); return nice(val); } ga-5-4/armci/tcgmsg/ipcv5.0/copyall.ksr.s0000644000175000017500000002313112662210402016213 0ustar mbamba .file "/home/d3g681/tcgmsg/ipcv4.0/" .file "copyall.c" .vstamp 7 # KSR1 ccom -OLM -X28 -X92 -X115 -X151 -X153 -X155 -X156 -X157 -X158 -X159 # -X172 -X187 # ccom: version 1.1.1. built Sun Dec 26 22:03:57 1993. .text .data .def copyto$TXT; .val copyto$TXT; .scl 2; .endef .text .def copyto; .val copyto; .scl 2; .type 513; .endef copyto$TXT: finop ; cxnop finop ; cxnop .def .bf; .val .; .scl 101; .line 11; .endef mov8_8 %i3, %i9 ; ssub8.ntr 0, %sp, 128, %sp itstle8 128, %i4 ; movb8_8 %i2, %c8 add8.ntr 10, %i31, %i31 ; st8 %i13, 80(%sp) mov8_8 %i4, %i13 ; st8 %cp, 112(%sp) finop ; st8 %fp, 120(%sp) finop ; mov8_8 %c10, %cp finop ; sadd8.ntr 0, %sp, 128, %fp finop ; bcc.qn @citst, .L2 finop ; st8 %c14, 104(%sp) finop ; st8 %i12, 88(%sp) clrh8 7, %i9, %i5 ; movb8_8 %c8, %i1 sub8.ntr 128, %i5, %i2 ; cxnop add8.ntr 7, %i31, %i31 ; cxnop sub8.ntr %i9, %i1, %i1 ; cxnop clrh8 3, %i1, %i1 ; cxnop itsteq8 0, %i1 ; cxnop itstge8 0, %i5 ; bcs.qt @citst, .L10 .L2: mov8_8 %i13, %i4 ; ld8 16(%cp), %c6 mov8_8 %i9, %i2 ; movb8_8 %c8, %i3 add8.ntr 4, %i31, %i31 ; ld8 8(%cp), %c10 finop ; jsr %c14, 16(%c6) finop ; cxnop finop ; cxnop movi8 3, %i0 ; movi8 0, %c8 .ln 7, .-32 # 17 add8.ntr 8, %i31, %i31 ; ld8 104(%sp), %c14 finop ; ld8 112(%sp), %cp finop ; ld8 120(%sp), %fp finop ; ld8 88(%sp), %i12 finop ; ld8 80(%sp), %i13 finop ; jmp 32(%c14) finop ; sadd8.ntr 0, %sp, 128, %sp finop ; cxnop .L10: selsc8 %i5, %i2, %i5 ; cxnop itstle8 %i5, %i13 ; cxnop selsc8 %i5, %i13, %i5 ; cxnop sub8.ntr %i13, %i5, %i13 ; cxnop itsteq8 0, %i5 ; cxnop sub8.ntr %i5, 1, %i5 ; bcs.qt @citst, .L8 .L9: add8.ntr 1, %i9, %i9 ; movb8_8 %i9, %c4 itsteq8 0, %i5 ; ld1 0(%c8), %i10 sub8.ntr %i5, 1, %i5 ; bcc.qn @citst, .L9 add8.ntr 3, %i31, %i31 ; sadd8.ntr 0, %c8, 1, %c8 finop ; st1 %i10, -1(%c4) .L8: itstne8 0, %i13 ; movb8_8 %i9, %c7 ash8.ntr -7, %i13, %i10 ; bcc.qt @citst, .L1 ash8.ntr 7, %i10, %i0 ; movb8_8 %i0, %c5 add8.ntr %i9, %i0, %i9 ; mov8_8 %c8, %c6 finop ; pcsp.ex.bl 128(%c7) finop ; pcsp.ex.bl 256(%c7) finop ; pcsp.ex.bl 384(%c7) itsteq8 0, %i10 ; movb8_8 %i9, %c9 sub8.ntr %i13, %i0, %i13 ; sadd8.ntr 0, %c5, %c8, %c8 sub8.ntr %i10, 1, %i10 ; bcs.qt @citst, .L5 .L6: finop ; pcsp.ex.bl 512(%c7) itsteq8 0, %i10 ; ld8.ro 0(%c6), %i11 sub8.ntr %i10, 1, %i10 ; ld8.ro 8(%c6), %i0 add8.ntr 33, %i31, %i31 ; ld8.ro 16(%c6), %i1 finop ; ld8.ro 24(%c6), %i2 finop ; ld8.ro 32(%c6), %i3 finop ; ld8.ro 40(%c6), %i4 finop ; ld8.ro 48(%c6), %i5 finop ; ld8.ro 56(%c6), %i12 finop ; sadd8.ntr 0, %c7, 128, %c7 finop ; st8 %i11, -128(%c7) finop ; st8 %i0, -120(%c7) finop ; st8 %i1, -112(%c7) finop ; st8 %i2, -104(%c7) finop ; st8 %i3, -96(%c7) finop ; st8 %i4, -88(%c7) finop ; st8 %i5, -80(%c7) finop ; st8 %i12, -72(%c7) finop ; ld8.ro 120(%c6), %i12 finop ; ld8.ro 112(%c6), %i5 finop ; ld8.ro 104(%c6), %i4 finop ; ld8.ro 96(%c6), %i3 finop ; ld8.ro 88(%c6), %i2 finop ; ld8.ro 80(%c6), %i1 finop ; ld8.ro 72(%c6), %i0 finop ; ld8.ro 64(%c6), %i11 finop ; st8 %i1, -48(%c7) finop ; st8 %i2, -40(%c7) finop ; st8 %i0, -56(%c7) finop ; st8 %i11, -64(%c7) finop ; st8 %i3, -32(%c7) finop ; st8 %i4, -24(%c7) finop ; st8 %i5, -16(%c7) finop ; bcc.qn @citst, .L6 finop ; st8 %i12, -8(%c7) finop ; sadd8.ntr 0, %c6, 128, %c6 # finop ; pstsp 0(%c7) .L5: itsteq8 0, %i13 ; cxnop sub8.ntr %i13, 1, %i4 ; bcs.qt @citst, .L1 .L4: itsteq8 0, %i4 ; ld1 0(%c8), %i11 sub8.ntr %i4, 1, %i4 ; sadd8.ntr 0, %c9, 1, %c9 add8.ntr 3, %i31, %i31 ; bcc.qn @citst, .L4 finop ; sadd8.ntr 0, %c8, 1, %c8 finop ; st1 %i11, -1(%c9) .L1: add8.ntr 8, %i31, %i31 ; ld8 104(%sp), %c14 finop ; ld8 112(%sp), %cp finop ; ld8 120(%sp), %fp finop ; ld8 88(%sp), %i12 finop ; ld8 80(%sp), %i13 finop ; jmp 32(%c14) finop ; sadd8.ntr 0, %sp, 128, %sp finop ; cxnop .def .ef; .val .; .scl 101; .line 93; .endef .def copyto; .scl -1; .endef .data # nbytes %i5 local # npage %i10 local # from %c6 local # to %c7 local # a %i11 local # b %i0 local # c %i1 local # d %i2 local # e %i3 local # f %i4 local # g %i5 local # h %i12 local # nbytes %i4 local # from %c8 local # to %c9 local .half 0x0, 0x0, 0x60003000, 0x5800 .L21: copyto: .word copyto$TXT .word memcpy .word memcpy$TXT # src %c8 local # dest %i9 local # n %i13 local .text .data .def copyfrom$TXT; .val copyfrom$TXT; .scl 2; .endef .text .def copyfrom; .val copyfrom; .scl 2; .type 513; .endef copyfrom$TXT: finop ; cxnop finop ; cxnop .def .bf; .val .; .scl 101; .line 112; .endef itstle8 128, %i4 ; ssub8.ntr 0, %sp, 128, %sp add8.ntr 10, %i31, %i31 ; movb8_8 %i3, %c8 finop ; st8 %i13, 80(%sp) mov8_8 %i4, %i13 ; st8 %cp, 112(%sp) finop ; st8 %fp, 120(%sp) finop ; mov8_8 %c10, %cp finop ; sadd8.ntr 0, %sp, 128, %fp finop ; bcc.qn @citst, .L25 finop ; st8 %c14, 104(%sp) finop ; st8 %i12, 88(%sp) clrh8 7, %i2, %i5 ; movb8_8 %c8, %i0 sub8.ntr 128, %i5, %i1 ; cxnop add8.ntr 7, %i31, %i31 ; cxnop sub8.ntr %i0, %i2, %i0 ; cxnop clrh8 3, %i0, %i0 ; cxnop itsteq8 0, %i0 ; cxnop itstge8 0, %i5 ; bcs.qt @citst, .L33 .L25: mov8_8 %i2, %i3 ; ld8 16(%cp), %c6 mov8_8 %i13, %i4 ; movb8_8 %c8, %i2 add8.ntr 4, %i31, %i31 ; ld8 8(%cp), %c10 finop ; jsr %c14, 16(%c6) finop ; cxnop finop ; cxnop movi8 3, %i0 ; movi8 0, %c8 .ln 7, .-32 # 118 add8.ntr 8, %i31, %i31 ; ld8 104(%sp), %c14 finop ; ld8 112(%sp), %cp finop ; ld8 120(%sp), %fp finop ; ld8 88(%sp), %i12 finop ; ld8 80(%sp), %i13 finop ; jmp 32(%c14) finop ; sadd8.ntr 0, %sp, 128, %sp finop ; cxnop .L33: selsc8 %i5, %i1, %i5 ; cxnop itstle8 %i5, %i13 ; cxnop selsc8 %i5, %i13, %i5 ; cxnop sub8.ntr %i13, %i5, %i13 ; cxnop itsteq8 0, %i5 ; cxnop sub8.ntr %i5, 1, %i5 ; bcs.qt @citst, .L31 .L32: add8.ntr 1, %i2, %i2 ; movb8_8 %i2, %c4 itsteq8 0, %i5 ; sadd8.ntr 0, %c8, 1, %c8 sub8.ntr %i5, 1, %i5 ; cxnop add8.ntr 5, %i31, %i31 ; ld1 -1(%c4), %i9 finop ; bcc.qn @citst, .L32 finop ; cxnop finop ; st1 %i9, -1(%c8) .L31: itstne8 0, %i13 ; movb8_8 %i2, %c6 finop ; pcsp.ro.bl 128(%c6) finop ; pcsp.ro.bl 256(%c6) finop ; pcsp.ro.bl 384(%c6) ash8.ntr -7, %i13, %i9 ; bcc.qt @citst, .L24 ash8.ntr 7, %i9, %i11 ; movb8_8 %i11, %c5 add8.ntr %i2, %i11, %i2 ; mov8_8 %c8, %c7 itsteq8 0, %i9 ; movb8_8 %i2, %c9 sub8.ntr %i13, %i11, %i13 ; sadd8.ntr 0, %c5, %c8, %c8 sub8.ntr %i9, 1, %i9 ; bcs.qt @citst, .L28 .L29: finop ; pcsp.ro.bl 512(%c6) itsteq8 0, %i9 ; ld8.ro 0(%c6), %i10 sub8.ntr %i9, 1, %i9 ; ld8.ro 8(%c6), %i11 add8.ntr 33, %i31, %i31 ; ld8.ro 16(%c6), %i0 finop ; ld8.ro 24(%c6), %i1 finop ; ld8.ro 32(%c6), %i3 finop ; ld8.ro 40(%c6), %i4 finop ; ld8.ro 48(%c6), %i5 finop ; ld8.ro 56(%c6), %i12 finop ; sadd8.ntr 0, %c7, 128, %c7 finop ; st8 %i10, -128(%c7) finop ; st8 %i11, -120(%c7) finop ; st8 %i0, -112(%c7) finop ; st8 %i1, -104(%c7) finop ; st8 %i3, -96(%c7) finop ; st8 %i4, -88(%c7) finop ; st8 %i5, -80(%c7) finop ; st8 %i12, -72(%c7) finop ; ld8.ro 120(%c6), %i12 finop ; ld8.ro 112(%c6), %i5 finop ; ld8.ro 104(%c6), %i4 finop ; ld8.ro 96(%c6), %i3 finop ; ld8.ro 88(%c6), %i1 finop ; ld8.ro 80(%c6), %i0 finop ; ld8.ro 72(%c6), %i11 finop ; ld8.ro 64(%c6), %i10 finop ; st8 %i0, -48(%c7) finop ; st8 %i1, -40(%c7) finop ; st8 %i11, -56(%c7) finop ; st8 %i10, -64(%c7) finop ; st8 %i3, -32(%c7) finop ; st8 %i4, -24(%c7) finop ; st8 %i5, -16(%c7) finop ; bcc.qn @citst, .L29 finop ; sadd8.ntr 0, %c6, 128, %c6 finop ; st8 %i12, -8(%c7) .L28: itsteq8 0, %i13 ; cxnop sub8.ntr %i13, 1, %i4 ; bcs.qt @citst, .L24 .L27: itsteq8 0, %i4 ; ld1 0(%c9), %i10 sub8.ntr %i4, 1, %i4 ; sadd8.ntr 0, %c8, 1, %c8 add8.ntr 3, %i31, %i31 ; bcc.qn @citst, .L27 finop ; sadd8.ntr 0, %c9, 1, %c9 finop ; st1 %i10, -1(%c8) .L24: add8.ntr 8, %i31, %i31 ; ld8 104(%sp), %c14 finop ; ld8 112(%sp), %cp finop ; ld8 120(%sp), %fp finop ; ld8 88(%sp), %i12 finop ; ld8 80(%sp), %i13 finop ; jmp 32(%c14) finop ; sadd8.ntr 0, %sp, 128, %sp finop ; cxnop .def .ef; .val .; .scl 101; .line 93; .endef .def copyfrom; .scl -1; .endef .data # nbytes %i5 local # npage %i9 local # from %c6 local # to %c7 local # a %i10 local # b %i11 local # c %i0 local # d %i1 local # e %i3 local # f %i4 local # g %i5 local # h %i12 local # nbytes %i4 local # from %c9 local # to %c8 local .half 0x0, 0x0, 0x60003000, 0x5800 .L44: copyfrom: .word copyfrom$TXT .word memcpy .word memcpy$TXT # src %i2 local # dest %c8 local # n %i13 local .text .data .align 128 .L47: .globl copyfrom .globl copyfrom$TXT .globl copyto .globl copyto$TXT .text ga-5-4/armci/tcgmsg/ipcv5.0/async_send_lapi.c0000644000175000017500000002541312662210402017072 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "tcgmsgP.h" /*#define DEBUG 1*/ /*#define DEBUG2 1*/ static const long false = 0; static const long true = 1; typedef struct { int from:16; int to:16; } nodepair_t; typedef union{ long fromto; nodepair_t n; } pair_t; extern void Busy(int); /* All data movement to/from shared memory is done using the COPY_TO/FROM_SHMEM macros */ extern lapi_handle_t lapi_handle; /* ShmemBuf *localbuf = &tmp_snd_buf; */ extern void lapi_put_c(void* dest, void* src, long bytes, long node, lapi_cntr_t *cntr); extern void lapi_put(void* dest, void* src, long bytes, long node); extern void lapi_get(void* dest, void* src, long bytes, long node); #define COPY_TO_LOCAL(src, dest, n) (void) memcpy(dest, src, (long) n) #define COPY_FROM_LOCAL(src, dest, n) (void)memcpy(dest, src, (long) n) #define COPY_TO_REMOTE(src,dest,n,node) lapi_put(dest, src, (long) n, node) #define COPY_FROM_REMOTE(src,dest,n,node)lapi_get(dest, src, (long) n,node) /* #define COPY_TO_REMOTE_CNTR(src, dest, n, node, pcntr) lapi_put_c(dest, src, (long) n, node, pcntr) */ #define COPY_TO_REMOTE_CNTR(localbuf, dest, n, node, pcntr) do { \ if (LAPI_Put(lapi_handle,(uint)node, (uint)n, dest,localbuf->info, pcntr, &localbuf->cntr, NULL)) { \ Error("TCG:lapi_put_c failed",0); \ } \ } while (0) #define NEXT_LOC_BUF(localbuf) localbuf = (sendbuf_t*)localbuf->next; #define GET_LOC_BUF(localbuf) do { \ if(LAPI_Waitcntr(lapi_handle, &localbuf->cntr, 1, NULL)) { \ Error("TCG:LAPI_Waitcntr failed",0); \ } \ } while (0) #ifndef FLUSH_CACHE # define FLUSH_CACHE #endif #ifndef FLUSH_CACHE_LINE # define FLUSH_CACHE_LINE(x) #endif #define TCG_ABS(a) (((a) >= 0) ? (a) : (-(a))) /** * Return the value of a volatile variable in shared memory * that is REMOTE to this processor */ static long remote_flag(long *p, long node) { long tmp; /* FLUSH_CACHE;*/ /* no need to flush for one word only*/ COPY_FROM_REMOTE(p, &tmp, sizeof(tmp), node); return tmp; } /** * Return the value of a volatile variable in shared memory * that is LOCAL to this processor */ static long local_flag(void *p) { long val; FLUSH_CACHE_LINE(p); val = *(long*)p; return(val); } void set_local_flag(void *p, long val) { *(long*)p = val; } void set_remote_flag(void *p, long val, long node) { COPY_TO_REMOTE(&val, p, sizeof(long), node); } /** * Wait on Lapi counter for data to appear * check if *p == value */ static void lapi_await(long *p, long value, lapi_cntr_t* cntr) { int val; long pval; if(LAPI_Waitcntr(lapi_handle, cntr, 1, &val)) Error("lapi_await: error",-1); #if 0 if ( (pval = local_flag(p)) != value) { fprintf(stdout,"%2ld: invalid value=%ld, local_flag=%lx %ld\n", TCGMSG_nodeid, value, (unsigned long)p, pval); fflush(stdout); Error("lapi_await: exiting..",-1);; } #endif } /** * Wait for (*p == value) */ static void local_await(long *p, long value) { long pval; long nspin = 0; long spinlim = 100000000; long waittim = 100000; extern void flush_send_q(void); while ((pval = local_flag(p)) != value) { if (pval && (pval != value)) { fprintf(stdout,"%2ld: invalid value=%ld, local_flag=%lx %ld\n", TCGMSG_nodeid, value, (unsigned long)p, pval); fflush(stdout); exit(1); } nspin++; if((nspin&7)==0)flush_send_q(); if (nspin < spinlim) Busy(100); else USleep(waittim); } } /** * Entry points to info about a message ... determine which * transport mechanism is appropriate and send as much as * possible without blocking. * * Right now just shared memory ... when sockets are working this * routine will become async_shmem_send. * * Shared-memory protocol aims for low latency. Each process has * one buffer for every other process. Thus, to send a message U * merely have to determine if the receivers buffer for you is empty * and copy directly into the receivers buffer. * * Return 0 data has not been sent, 1 if the send is complete. */ long async_send(SendQEntry *entry) { long node = entry->node; ShmemBuf *sendbuf= TCGMSG_proc_info[node].sendbuf; #ifdef NOTIFY_SENDER void *busy_flag = &TCGMSG_proc_info[node].recvbuf->flag; #endif long ncopy, complete; long pval; long info[4]; pair_t pair; #ifdef DEBUG2 (void) fprintf(stdout,"%2ld: sending to %ld buf=%lx len=%ld\n", TCGMSG_nodeid, node, entry->buf, entry->lenbuf); (void) fprintf(stdout,"%2ld: sendbuf=%lx\n", TCGMSG_nodeid, sendbuf); (void) fflush(stdout); #endif /* return if the receiver buffer is not available */ #ifdef NOTIFY_SENDER pval = local_flag(busy_flag); #else pval = remote_flag(&sendbuf->info[3], node); #endif if (pval) { #ifdef DEBUG { long info[4]; FLUSH_CACHE; COPY_FROM_REMOTE(sendbuf->info, info, sizeof(info), node); fprintf(stdout,"%2ld: snd info after full = %ld %ld %ld\n", TCGMSG_nodeid, info[0], info[1], info[2]); fflush(stdout); sleep(1); } #endif return 0; } /* if data has been written already and we are here, operation is complete */ if(entry->written) return 1L; #ifdef NOTIFY_SENDER set_local_flag(busy_flag,true); #endif info[0] = entry->type; info[1] = entry->lenbuf; info[2] = entry->tag; #if 0 entry->buffer_number++; info[3] = entry->buffer_number; #else pair.n.from = TCGMSG_nodeid; pair.n.to = node; info[3] = pair.fromto; #endif /* Copy over the message if it fits in the receiver buffer */ ncopy = (long) (( entry->lenbuf <= SHMEM_BUF_SIZE) ? entry->lenbuf : 0 ); GET_LOC_BUF(localbuf); if (ncopy) { #ifdef DEBUG printf("%ld:snd:copying data node=%ld adr=%lx %ld bytes\n", TCGMSG_nodeid, node, sendbuf->buf, ncopy); fflush(stdout); #endif COPY_TO_LOCAL(entry->buf+entry->written, localbuf->buf, ncopy); complete = 1; } else { #ifdef DEBUG printf("%ld:snd:copying addr node=%ld adr=%lx %ld bytes\n", TCGMSG_nodeid, node, sendbuf->buf, ncopy); fflush(stdout); #endif /* copy address of the user buffer to the send buffer */ COPY_TO_LOCAL(&(entry->buf), localbuf->buf, sizeof(char*)); ncopy = sizeof(char*); complete = 0; /* sent is complete only when receiver gets the data */ entry->written = 1; } #ifdef DEBUG printf("%ld:snd:copying info to node=%ld adr=%lx %ld bytes\n", TCGMSG_nodeid, node, sendbuf->info, sizeof(info)); fflush(stdout); #endif COPY_TO_LOCAL(info, localbuf->info, sizeof(info)); COPY_TO_REMOTE_CNTR(localbuf,sendbuf,sizeof(info)+ncopy,node,&sendbuf->cntr); /* advance to next buf */ NEXT_LOC_BUF(localbuf); return complete; } /** * Receive a message of given type from the specified node, returning * the message and length of the message. * * Right now just shared memory ... when sockets are working this * routine will become msg_shmem_rcv * * Shared-memory protocol aims for low latency. Each process has * one buffer for every other process. Thus, to send a message U * merely have to determine if the receivers buffer for you is empty * and copy directly into the receivers buffer. */ void msg_rcv(long type, char *buf, long lenbuf, long *lenmes, long node) { long me = TCGMSG_nodeid; ShmemBuf *recvbuf; /* Points to receving buffer */ long nleft; long msg_type, msg_tag, msg_len; long buffer_number = 1; long expected_tag = TCGMSG_proc_info[node].tag_rcv++; #ifdef NOTIFY_SENDER void *busy_flag= &TCGMSG_proc_info[node].sendbuf->flag; #endif if (node<0 || node>=TCGMSG_nnodes) Error("msg_rcv: node is out of range", node); recvbuf = TCGMSG_proc_info[node].recvbuf; /* Wait for first part message to be written */ #ifdef DEBUG (void) fprintf(stdout,"%2ld: receiving from %ld buf=%lx len=%ld\n", me, node, recvbuf,lenbuf); (void) fprintf(stdout,"%2ld: user buf=%lx len=%ld\n", me, buf, lenbuf); (void) fflush(stdout); #endif #ifdef LAPI lapi_await(&recvbuf->info[3], buffer_number, &recvbuf->cntr); #else local_await(&recvbuf->info[3], buffer_number); #endif /* Copy over the header information */ msg_type = recvbuf->info[0]; msg_len = recvbuf->info[1]; msg_tag = recvbuf->info[2]; #ifdef DEBUG (void) fprintf(stdout,"%2ld: received msg from %ld len=%ld\n", me, node, msg_len); (void) fflush(stdout); #endif /* Check type and size information */ if(msg_tag != expected_tag) { pair_t pair; pair.fromto = recvbuf->info[3]; fprintf(stdout, "rcv: me=%ld from=%ld type=%ld expectedtag=%ld lenbuf=%ld\ngot: to=%d from=%d type=%ld msg_tag=%ld msg_len=%ld info[3]=%ld\n", me, node, type, expected_tag, lenbuf, (int)pair.n.to, (int)pair.n.from, msg_type, msg_tag, msg_len, recvbuf->info[3]); fflush(stdout); Error("msg_rcv: tag mismatch ... transport layer failed????", 0L); } if (msg_type != type) { (void) fprintf(stderr, "rcv: me=%ld from=%ld type=(%ld != %ld) tag=%ld len=%ld\n", me, node, type, msg_type, msg_tag, msg_len); Error("msg_rcv: type mismatch ... strong typing enforced\n", 0L); } if (msg_len > lenbuf) { (void) fprintf(stderr, "rcv: me=%ld from=%ld type=%ld tag=%ld len=(%ld > %ld)\n", me, node, type, msg_tag, msg_len, lenbuf); Error("msg_rcv: message too long for buffer\n", 0L); } nleft = *lenmes = msg_len; if (nleft) { long ncopy = nleft; /* for short messages data is in local buffer, for long in remote buffer */ if(nleft <= SHMEM_BUF_SIZE) { FLUSH_CACHE; COPY_FROM_LOCAL(recvbuf->buf, buf, ncopy); }else { char *addr = *((char**)recvbuf->buf); COPY_FROM_REMOTE(addr, buf, nleft, node); } } recvbuf->info[3] = false; #ifdef NOTIFY_SENDER /* confirm that data has been transfered */ set_remote_flag(busy_flag,false,node); #endif } long MatchShmMessage(long node, long type) { ShmemBuf *recvbuf; long msg_type; recvbuf = TCGMSG_proc_info[node].recvbuf; if(recvbuf->info[3] == false) return (0); /* no message to receive */ /* we have a message but let's see if want it */ FLUSH_CACHE_LINE(recvbuf->info); COPY_FROM_LOCAL(recvbuf->info, &msg_type, sizeof(long)); if(type == msg_type) return (1); return (0); } ga-5-4/armci/tcgmsg/ipcv5.0/synch.c0000644000175000017500000000027012662210402015055 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "tcgmsgP.h" #include "sndrcv.h" void SYNCH_(long *ptype) { long junk = 0, n = 1; IGOP_(ptype, &junk, &n, "+", 1); } ga-5-4/armci/tcgmsg/ipcv5.0/copyall.c0000644000175000017500000001200112662210402015367 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MEMORY_H # include #endif /** * A copy optimized for DESTINATIONS in shared memory that * are aligned and data is to be read by other processes. * * Both prefetch and poststore the destination. */ void copyto(const unsigned char *src, unsigned char *dest, long n) { if (n < 32 || (dest - src) & 7) { /* small n, or not possible to get src and dest even word aligned */ while (n--) *dest++ = *src++; /* memcpy(dest, src, (size_t) n); */ return; } /* Read ahead so that dest is aligned on a page boundary */ { register long nbytes = (127 & (unsigned long) dest); if (nbytes > 0) nbytes = 128 - nbytes; if (nbytes > n) nbytes = n; n -= nbytes; while (nbytes--) *dest++ = *src++; if (n == 0) return; } { /* src is at least word aligned and dest is subpage aligned */ register long npage = n>>7; register const unsigned long *from = (unsigned long *) src; register unsigned long *to = (unsigned long *) dest; register unsigned long a, b, c, d, e, f, g, h; src += npage<<7; dest += npage<<7; n -= npage<<7; /* _pcsp(to+16, "ex", "nbl"); _pcsp(to+32, "ex", "nbl"); _pcsp(to+48, "ex", "nbl"); */ while (npage--) { /* _pcsp(to+64, "ex", "nbl"); */ a = from[0]; b = from[1]; c = from[2]; d = from[3]; e = from[4]; f = from[5]; g = from[6]; h = from[7]; to[0] = a; to[1] = b; to[2] = c; to[3] = d; to[4] = e; to[5] = f; to[6] = g; to[7] = h; a = from[8]; b = from[9]; c = from[10]; d = from[11]; e = from[12]; f = from[13]; g = from[14]; h = from[15]; to[8] = a; to[9] = b; to[10] = c; to[11] = d; to[12] = e; to[13] = f; to[14] = g; to[15] = h; /* _pstsp((char *) to); */ to += 16; from+= 16; } } { register long nbytes = n; register const unsigned char *from = (unsigned char *) src; register unsigned char *to = (unsigned char *) dest; while (nbytes--) *to++ = *from++; } } /** * A copy optimized for SOURCES in shared memory that * are aligned. * * Prefetch sources only. */ void copyfrom(const unsigned char *src, unsigned char *dest, long n) { if (n < 32 || (dest - src) & 7) { /* small n, or not possible to get src and dest even word aligned */ while (n--) *dest++ = *src++; /* memcpy(dest, src, (size_t) n);*/ return; } /* Read ahead so that src is aligned on a page boundary */ { register long nbytes = (127 & (unsigned long) src); if (nbytes > 0) nbytes = 128 - nbytes; if (nbytes > n) nbytes = n; n -= nbytes; while (nbytes--) *dest++ = *src++; if (n == 0) return; } { /* dest is at least word aligned and src is subpage aligned */ register long npage = n>>7; register const unsigned long *from = (unsigned long *) src; register unsigned long *to = (unsigned long *) dest; register unsigned long a, b, c, d, e, f, g, h; src += npage<<7; dest += npage<<7; n -= npage<<7; /* _pcsp(from+16, "ro", "nbl"); _pcsp(from+32, "ro", "nbl"); _pcsp(from+48, "ro", "nbl"); */ while (npage--) { /* _pcsp(from+64, "ro", "nbl"); */ a = from[0]; b = from[1]; c = from[2]; d = from[3]; e = from[4]; f = from[5]; g = from[6]; h = from[7]; to[0] = a; to[1] = b; to[2] = c; to[3] = d; to[4] = e; to[5] = f; to[6] = g; to[7] = h; a = from[8]; b = from[9]; c = from[10]; d = from[11]; e = from[12]; f = from[13]; g = from[14]; h = from[15]; to[8] = a; to[9] = b; to[10] = c; to[11] = d; to[12] = e; to[13] = f; to[14] = g; to[15] = h; /* _pstsp((char *) to); */ to += 16; from+= 16; } } { register long nbytes = n; register const unsigned char *from = (unsigned char *) src; register unsigned char *to = (unsigned char *) dest; while (nbytes--) *to++ = *from++; } } ga-5-4/armci/tcgmsg/ipcv5.0/busy.c0000644000175000017500000000020412662210402014710 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif int fred; void Busy(int n) { fred = 0; while (n-- >= 0) fred++; } ga-5-4/armci/tcgmsg/ipcv5.0/drand48.c0000644000175000017500000000055212662210402015200 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/drand48.c,v 1.2 1994-12-30 20:55:40 d3h325 Exp $ */ #include "srftoc.h" extern long random(); extern int srandom(); double DRAND48_() { return ( (double) random() ) * 4.6566128752458e-10; } void SRAND48_(seed) unsigned *seed; { (void) srandom(*seed); } ga-5-4/armci/tcgmsg/ipcv5.0/nodeid.c0000644000175000017500000000017712662210402015201 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "tcgmsgP.h" long NODEID_(void) { return (long) TCGMSG_nodeid; } ga-5-4/armci/tcgmsg/ipcv5.0/nxtval.shm.c0000644000175000017500000000510312662210402016033 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * $Id: nxtval.shm.c,v 1.9 2005-02-21 21:51:40 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #include "tcgmsgP.h" long nxtval_counter=0; long *nxtval_shmem = &nxtval_counter; #define LEN 2 #define INCR 1 /* increment for NXTVAL */ #define BUSY -1L /* indicates somebody else updating counter*/ #if (defined(__i386__) || defined(__x86_64__)) && defined(__GNUC__) # define TESTANDSET testandset static inline int testandset(int *spinlock) { int ret; __asm__ __volatile__("xchgl %0, %1" : "=r"(ret), "=m"(*spinlock) : "0"(1), "m"(*spinlock)); return ret; } #elif defined(__APPLE__) && defined(__GNUC__) # define TESTANDSET(x) ( krspin_lock((long int *)(x))) static int krspin_lock(long int *p) { unsigned long tmp; int ret; __asm__ __volatile__( "b 1f # spin_lock\n\ 2: lwzx %0,0,%1\n\ cmpwi 0,%0,0\n\ bne+ 2b\n\ 1: lwarx %0,0,%1\n\ cmpwi 0,%0,0\n\ bne- 2b\n" " stwcx. %2,0,%1\n\ bne- 2b\n\ isync" : "=&r"(tmp) : "r"(p), "r"(1) : "cr0", "memory"); return ret == 0; } #endif #ifdef TESTANDSET # define LOCK if(nproc>1)acquire_spinlock((int*)(nxtval_shmem+1)) # define UNLOCK if(nproc>1)release_spinlock((int*)(nxtval_shmem+1)) static void acquire_spinlock(int *mutex) { int loop=0, maxloop =10; while (TESTANDSET(mutex)){ loop++; if(loop==maxloop){ usleep(1); loop=0; } } } static void release_spinlock(int *mutex) { *mutex =0; } #endif /* TESTANDSET */ #ifndef LOCK # define LOCK if(nproc>1)Error("nxtval: sequential version with silly mproc ", (long) *mproc); # define UNLOCK #endif /** * Get next value of shared counter. * * mproc > 0 ... returns requested value * mproc < 0 ... server blocks until abs(mproc) processes are queued * and returns junk * mproc = 0 ... indicates to server that I am about to terminate */ long NXTVAL_(long *mproc) { long shmem_swap(); long local=0; long sync_type= INTERNAL_SYNC_TYPE; long nproc= NNODES_(); long server=nproc-1; if (DEBUG_) { (void) printf("%2ld: nxtval: mproc=%ld\n",(long)NODEID_(),(long)*mproc); (void) fflush(stdout); } if (*mproc < 0) { SYNCH_(&sync_type); /* reset the counter value to zero */ if( NODEID_() == server) *nxtval_shmem = 0; SYNCH_(&sync_type); } if (*mproc > 0) { LOCK; local = *nxtval_shmem; *nxtval_shmem += INCR; UNLOCK; } return local; } ga-5-4/armci/tcgmsg/ipcv5.0/copyall.save.c0000644000175000017500000001161412662210402016335 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MEMORY_H # include #endif /** * A copy optimized for DESTINATIONS in shared memory that * are aligned and data is to be read by other processes. * * Both prefetch and poststore the destination. */ void copyto(const unsigned char *src, unsigned char *dest, long n) { if (n < 128 || (dest - src) & 7) { /* small n, or not possible to get src and dest even word aligned */ memcpy(dest, src, (size_t) n); return; } /* Read ahead so that dest is aligned on a page boundary */ { register long nbytes = (127 & (unsigned long) dest); if (nbytes > 0) nbytes = 128 - nbytes; if (nbytes > n) nbytes = n; n -= nbytes; while (nbytes--) *dest++ = *src++; if (n == 0) return; } { /* src is at least word aligned and dest is subpage aligned */ register long npage = n>>7; register const unsigned long *from = (unsigned long *) src; register unsigned long *to = (unsigned long *) dest; register unsigned long a, b, c, d, e, f, g, h; src += npage<<7; dest += npage<<7; n -= npage<<7; /* _pcsp(to+16, "ex", "nbl"); _pcsp(to+32, "ex", "nbl"); _pcsp(to+48, "ex", "nbl"); */ while (npage--) { /* _pcsp(to+64, "ex", "nbl"); */ a = from[0]; b = from[1]; c = from[2]; d = from[3]; e = from[4]; f = from[5]; g = from[6]; h = from[7]; to[0] = a; to[1] = b; to[2] = c; to[3] = d; to[4] = e; to[5] = f; to[6] = g; to[7] = h; a = from[8]; b = from[9]; c = from[10]; d = from[11]; e = from[12]; f = from[13]; g = from[14]; h = from[15]; to[8] = a; to[9] = b; to[10] = c; to[11] = d; to[12] = e; to[13] = f; to[14] = g; to[15] = h; /* _pstsp((char *) to); */ to += 16; from+= 16; } } { register long nbytes = n; register const unsigned char *from = (unsigned char *) src; register unsigned char *to = (unsigned char *) dest; while (nbytes--) *to++ = *from++; } } /** * A copy optimized for SOURCES in shared memory that are aligned. * * Prefetch sources only. */ void copyfrom(const unsigned char *src, unsigned char *dest, long n) { if (n < 128 || (dest - src) & 7) { /* small n, or not possible to get src and dest even word aligned */ memcpy(dest, src, (size_t) n); return; } /* Read ahead so that src is aligned on a page boundary */ { register long nbytes = (127 & (unsigned long) src); if (nbytes > 0) nbytes = 128 - nbytes; if (nbytes > n) nbytes = n; n -= nbytes; while (nbytes--) *dest++ = *src++; if (n == 0) return; } { /* dest is at least word aligned and src is subpage aligned */ register long npage = n>>7; register const unsigned long *from = (unsigned long *) src; register unsigned long *to = (unsigned long *) dest; register unsigned long a, b, c, d, e, f, g, h; src += npage<<7; dest += npage<<7; n -= npage<<7; /* _pcsp(from+16, "ro", "nbl"); _pcsp(from+32, "ro", "nbl"); _pcsp(from+48, "ro", "nbl"); */ while (npage--) { /* _pcsp(from+64, "ro", "nbl"); */ a = from[0]; b = from[1]; c = from[2]; d = from[3]; e = from[4]; f = from[5]; g = from[6]; h = from[7]; to[0] = a; to[1] = b; to[2] = c; to[3] = d; to[4] = e; to[5] = f; to[6] = g; to[7] = h; a = from[8]; b = from[9]; c = from[10]; d = from[11]; e = from[12]; f = from[13]; g = from[14]; h = from[15]; to[8] = a; to[9] = b; to[10] = c; to[11] = d; to[12] = e; to[13] = f; to[14] = g; to[15] = h; /* _pstsp((char *) to); */ to += 16; from+= 16; } } { register long nbytes = n; register const unsigned char *from = (unsigned char *) src; register unsigned char *to = (unsigned char *) dest; while (nbytes--) *to++ = *from++; } } ga-5-4/armci/tcgmsg/ipcv5.0/evlog.c0000644000175000017500000002627412662210402015061 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/evlog.c,v 1.3 2003-06-27 13:53:12 manoj Exp $ */ /** Event logging routine with key driven varargs interface */ #if HAVE_STDIO_H # include #endif #if HAVE_STDARG_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_STRING_H # include #endif extern long nodeid_(); #include "evlog.h" #include "sndrcv.h" #define ERROR_RETURN() do { \ error = 1; \ return; \ } while (0) #define DUMPBUF() do { \ (void) fputs(buffer, file); \ (void) fflush(file); \ if (ferror(file)) { \ ERROR_RETURN; \ } \ bufpt = buffer; \ left = BUFLEN; \ } while (0) #define RECORD(A) do { \ A; \ nchars = strlen(bufpt); \ bufpt += nchars; \ left -= nchars; \ } while (0) static double walltime(); /** * The format of the argument list is as follows: * * evlog([(int) key, [values, ...]], ..., EVKEY_LAST_ARG) * * Arguments are read as keys with corresponding values. Recognised keys * are defined in evlog.h and are described in detail below. * * Logging is enabled/disabled by calling evlog with one of EVKEY_ENABLE * or EVKEY_DISABLE specified. Note that EVKEY_ENABLE must be the * first key specified for it to be recognized and that all keys * in the argument list after EVKEY_DISABLE are ignored. By default * events are logged in the file events. This can be overridden with * the key EVKEY_FILENAME, which takes the filename as its value. * * The model for logging events assumed by the post-analysis routines * assumes that upon logging an event: * * a) no state chage occurs (EVKEY_EVENT). The event is just recorded. * * b) the process changes state by pushing the event onto the state stack * (EVKEY_BEGIN). * * c) the process changes state by popping an event off the state stack * (EVKEY_END). If the event or state popped off the stack does not * match the specified event then the post-analysis may get confused * but this does not interfere with the actual logging. * * EVKEY_EVENT, EVKEY_BEGIN or EVKEY_END must be the first key specified other * than a possible EVKEY_ENABLE. * * Internally an event is stored as a large character string to simplify * post-analysis. Users specify data for storage in addition to * that which is automatically stored (only the time and process) with * key, value combinations (EVKEY_STR_INT, EVKEY_STR_DBL, EVKEY_STR). * Many such key-value combinations as required may be specified. * Since the internal data format uses colons ':', double quotation * marks '"' and carriage returns users should avoid these in their * string data. * * ---------------------------- * Sample calling sequence: * * evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); * * evlog(EVKEY_EVENT, "Finished startup code", * EVKEY_STR, "Now do some real work", * EVKEY_LAST_ARG); * * evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); * * evlog(EVKEY_END, "Get matrix", * EVKEY_STR_INT, "Size of matrix", (int) N, * EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, * EVKEY_LAST_ARG); * * evlog(EVKEY_BEGIN, "Transform matrix", * EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, * EVKEY_LAST_ARG); * * evlog(EVKEY_END, "Transform matrix", * EVKEY_STR_INT, "No. of iterations", (int) niters, * EVKEY_LAST_ARG); * * evlog(EVKEY_DUMP, EVKEY_DISABLE, EVKEY_LAST_ARG); * * evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", * EVKEY_DUMP, EVKEY_LAST_ARG); * * ---------------------------- * * EVKEY_LAST_ARG * Terminates list ... takes no value and must be present * * EVKEY_EVENT, (char *) event * Simply log occurence of the event * * EVKEY_BEGIN, (char *) event * Push event onto process state stack * * EVKEY_END, (char *) event * Pop event off process state stack * * EVKEY_MSG_LEN, (int) length * Value is (int) mesage length SND/RCV only * * EVKEY_MSG_TO, (int) to * Value is (int) to process id SND/RCV only * * EVKEY_MSG_FROM, (int) from * Value is (int) from process SND/RCV only * * EVKEY_MSG_TYPE, (int) type * Value is (int) message type SND/RCV only * * EVKEY_STR_INT, (char *) string, (int) data * User data value pair * * EVKEY_STR_DBL, (char *) string, (double) data * User data value pair (char *), (double) * * EVKEY_STR, (char *) string * User data value (char *) * * EVKEY_ENABLE * Enable logging * * EVKEY_DISABLE * Disable logging * * EVKEY_DUMP * Dump out the current buffer to disk * * EVKEY_FILE, (char *) filename * Use specified file to capture events. Default is "events". */ void evlog(int farg_key, ...) { static int logging=0; /* Boolean flag for login enabled/disabled */ static int error=0; /* Boolean flag for error detected */ static int ncall=0; /* Need to do stuff on first entry */ static char *buffer; /* Logging buffer ... null terminated */ static char *bufpt; /* Pointer to next free char in buffer */ static int left; /* Amount of free space in buffer */ #define BUFLEN 262144 /* Size allocated for buffer ... biggish */ #define MAX_EV_LEN 1000 /* Assumed maximum size of single event record */ static FILE *file; /* File where events will be dumped */ static char *filename = "events"; /* Default name of events file */ va_list ap; /* For variable argument list */ int key; /* Hold key being processed */ int nchars; /* No. of chars printed by sprintf call */ char *temp; /* Temporary copy of bufpt */ char *string; /* Temporary */ int integer; /* Temporary */ double dbl; /* Temporary */ int valid; /* Temporary */ /* If an error was detected on a previous call don't even try to do anything */ if (error) { ERROR_RETURN(); } /* First time in need to allocate the buffer, open the file etc */ if (ncall == 0) { ncall = 1; if (!(bufpt = buffer = malloc((unsigned) BUFLEN))) { ERROR_RETURN(); } left = BUFLEN; if (!(file = fopen(filename, "w"))) { ERROR_RETURN(); } } /* Parse the arguments */ temp = bufpt; /* Save to check if anything has been logged */ valid = 0; /* One of BEGIN, END or EVENT must preceed most keys */ va_start(ap, farg_key); key = farg_key; while (key != EVKEY_LAST_ARG) { if ( (!logging) && (key != EVKEY_ENABLE) ) return; switch (key) { case EVKEY_ENABLE: logging = 1; break; case EVKEY_DISABLE: logging = 0; goto done; /* break; */ case EVKEY_FILENAME: if (!(filename = strdup(va_arg(ap, char *)))) {ERROR_RETURN();} if (!(file = freopen(filename, "w", file))) {ERROR_RETURN();} break; case EVKEY_BEGIN: valid = 1; RECORD(sprintf(bufpt, ":BEGIN:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_END: valid = 1; RECORD(sprintf(bufpt, ":END:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_EVENT: valid = 1; RECORD(sprintf(bufpt, ":EVENT:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_MSG_LEN: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":MSG_LEN:%d", va_arg(ap, int))); break; case EVKEY_MSG_TO: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":MSG_TO:%d", va_arg(ap, int))); break; case EVKEY_MSG_FROM: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":MSG_FROM:%d", va_arg(ap, int))); break; case EVKEY_MSG_TYPE: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":MSG_TYPE:%d", va_arg(ap, int))); break; case EVKEY_MSG_SYNC: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":MSG_SYNC:%d", va_arg(ap, int))); break; case EVKEY_STR_INT: if (!valid) {ERROR_RETURN();} string = va_arg(ap, char *); integer = va_arg(ap, int); RECORD(sprintf(bufpt, ":STR_INT:%s:%d", string, integer)); break; case EVKEY_STR_DBL: if (!valid) {ERROR_RETURN();} string = va_arg(ap, char *); dbl = va_arg(ap, double); RECORD(sprintf(bufpt, ":STR_DBL:%s:%g", string, dbl)); break; case EVKEY_STR: if (!valid) {ERROR_RETURN();} RECORD(sprintf(bufpt, ":STR:%s", va_arg(ap, char *))); break; case EVKEY_DUMP: {DUMPBUF();} if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } break; default: {DUMPBUF();} {ERROR_RETURN();} } key = va_arg(ap, int); } done: va_end(ap); /* Put a linefeed on the end of the record if something is written */ if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } /* Should really check on every access to the buffer that there is enough space ... however just assume a very large maximum size for a single event log entry and check here */ if (left <= 0) { ERROR_RETURN(); } if (left < MAX_EV_LEN) { DUMPBUF(); } } /** * return the wall time in seconds as a double */ static double walltime() { return ((double) MTIME_()) * 0.01; } /* int main(int argc, char **argv) { int N = 19; double matrix_norm = 99.1; int niters = 5; evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Finished startup code", EVKEY_STR, "Now do some real work", EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); evlog(EVKEY_END, "Get matrix", EVKEY_STR_INT, "Size of matrix", (int) N, EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Transform matrix", EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_END, "Transform matrix", EVKEY_STR_INT, "No. of iterations", (int) niters, EVKEY_LAST_ARG); evlog(EVKEY_DUMP, EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", EVKEY_DUMP, EVKEY_LAST_ARG); return 0; } */ ga-5-4/armci/tcgmsg/ipcv5.0/llog.c0000644000175000017500000000164412662210402014674 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_SYS_TIME_H # include #endif #include "sndrcv.h" extern void Error(); /** * close and open stdin and stdout to append to a local logfile * with the name log. in the current directory */ void LLOG_() { char name[12]; time_t t; (void) sprintf(name, "log.%03ld",(long)NODEID_()); (void) fflush(stdout); (void) fflush(stderr); if (freopen(name, "a", stdout) == (FILE *) NULL) { Error("LLOG_: error re-opening stdout", (long) -1); } if (freopen(name, "a", stderr) == (FILE *) NULL) { Error("LLOG_: error re-opening stderr", (long) -1); } (void) time(&t); (void) printf("\n\nLog file opened : %s\n\n",ctime(&t)); (void) fflush(stdout); } ga-5-4/armci/tcgmsg/ipcv5.0/lapi_putget.c0000644000175000017500000002011112662210402016242 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_UNISTD_H # include #endif #include #include #include "tcgmsgP.h" lapi_handle_t lapi_handle; lapi_info_t lapi_info; extern ShmemBuf TCGMSG_receive_buffer[]; #define LEN 2 int nxtval_counter=0; int *nxtval_cnt_adr = &nxtval_counter; static lapi_cntr_t req_cnt; #define INCR 1 /* increment for NXTVAL */ #define BUSY -1L /* indicates somebody else updating counter*/ /*#define TRACEINFO 1*/ /** * initialize lapi */ void lapi_initialize() { int myid, numtasks,rc; bzero(&lapi_info,sizeof(lapi_info)); /* needed under Mohonk */ rc = LAPI_Init(&lapi_handle, &lapi_info); if(rc) Error("lapi_init failed",rc); rc=LAPI_Qenv(lapi_handle, TASK_ID, &myid); if(rc) Error("lapi_qenv failed",rc); rc=LAPI_Qenv(lapi_handle, NUM_TASKS, &numtasks); if(rc) Error("lapi_qenv failed 2",rc); TCGMSG_nodeid = (long)myid; TCGMSG_nnodes = (long)numtasks; /* disable LAPI internal error checking */ LAPI_Senv(lapi_handle, ERROR_CHK, 0); rc = LAPI_Setcntr(lapi_handle, &req_cnt, 0); if(rc)Error("lapi_initialize: setcntr failed",rc); #ifdef DEBUG printf("me=%d initialized %d processes\n", myid, numtasks); #endif fflush(stdout); } void lapi_adr_exchg() { long node, tgt; int rc; void **table; int i; table = (void **)malloc(TCGMSG_nnodes * sizeof(void *)); if (!table) Error(" lapi_adr_exchg: malloc failed", 0); /* allocate and initialize send buffers */ sendbuf_arr = (sendbuf_t*)malloc(SENDBUF_NUM*sizeof(sendbuf_t)); if(!sendbuf_arr) Error(" lapi_adr_exchg:malloc 2 failed", 0); /* bzero(sendbuf_arr,SENDBUF_NUM*sizeof(sendbuf_t)); */ for(i=0; i< SENDBUF_NUM; i++){ LAPI_Setcntr(lapi_handle,&sendbuf_arr[i].cntr, 1); sendbuf_arr[i].next = sendbuf_arr+i+1; } sendbuf_arr[SENDBUF_NUM-1].next = sendbuf_arr; localbuf = sendbuf_arr; if(sizeof(ShmemBuf) < sizeof(sendbuf_t)) Error("lapi_adr_exchg: buffer size problem",0); /* exchange addresses */ for(node = 0; node < TCGMSG_nnodes; node++){ /* Lapi does not like NULL address for buffer that we have for sending msg to itself - use some invalid address */ if (node == TCGMSG_nodeid) TCGMSG_proc_info[node].recvbuf = (ShmemBuf *)1; else if(LAPI_Setcntr(lapi_handle, &(TCGMSG_proc_info[node].recvbuf->cntr),0)) Error("lapi_adr_exchg: setcntr failed",-1); rc = LAPI_Address_init(lapi_handle, TCGMSG_proc_info[node].recvbuf, table); if(rc) Error(" lapi_adr_exchg: address_init failed", node); if(rc) Error(" lapi_adr_exchg: cntr init failed", node); if(TCGMSG_nodeid == node) { for(tgt=0; tgt 0 ... returns requested value * mproc < 0 ... server blocks until abs(mproc) processes are queued * and returns junk * mproc = 0 ... indicates to server that I am about to terminate */ long NXTVAL_(long *mproc) { #define INC 1 int local; long stype = INTERNAL_SYNC_TYPE; lapi_cntr_t req_id; int rc, inc = INC; int server = (int)NNODES_() -1; /* id of server process */ if (server>0) { /* parallel execution */ if (DEBUG_) { (void) printf("%2ld: nxtval: mproc=%ld\n",NODEID_(), *mproc); (void) fflush(stdout); } if (*mproc < 0) { SYNCH_(&stype); /* reset the counter value to zero */ if( NODEID_() == server) nxtval_counter = 0; SYNCH_(&stype); } if (*mproc > 0) { /* use atomic swap operation to increment nxtval counter */ rc = LAPI_Setcntr(lapi_handle, &req_id, 0); if(rc)Error("nxtval: setcntr failed",rc); rc = LAPI_Rmw(lapi_handle, FETCH_AND_ADD, server, nxtval_cnt_adr, &inc, &local, &req_id); if(rc)Error("nxtval: rmw failed",rc); rc = LAPI_Waitcntr(lapi_handle, &req_id, 1, NULL); if(rc)Error("nxtval: waitcntr failed",rc); } } else { /* Not running in parallel ... just do a simulation */ static int count = 0; if (*mproc == 1){ int val = count; count+=INCR; local = val; }else if (*mproc == -1) { count = 0; local = 0; } else Error("nxtval: sequential version with silly mproc ", (long) *mproc); } return (long)local; } /** blocking get */ void lapi_get(void* dest, void* src, long bytes, long node) { int rc; #ifdef DEBUG printf("%ld getting %ld bytes from addr=%lx node %ld to adr=%lx\n", TCGMSG_nodeid, bytes, src, node, dest ); fflush(stdout); #endif rc = LAPI_Get(lapi_handle, (uint)node, (uint)bytes, src, dest, NULL,&req_cnt); if(rc)Error("lapi_get: get failed",rc); rc = LAPI_Waitcntr(lapi_handle, &req_cnt, 1, NULL); if(rc)Error("lapi_get: waitcntr failed",rc); } /** put with nonblocking semantics */ void lapi_put(void* dest, void* src, long bytes, long node) { int rc; /* LAPI_Fence(lapi_handle);*/ #ifdef DEBUG printf("%ld puting %ld bytes to addr=%lx node %ld\n", TCGMSG_nodeid, bytes, dest, node); fflush(stdout); #endif #ifdef ERR_CHECKING if(dest < (void*)TCGMSG_receive_buffer){ printf("%ld: Warning: Out of range? %lx(%ld) < %lx\n", TCGMSG_nodeid, dest, node, TCGMSG_receive_buffer); fflush(stdout); } if(dest + bytes > (void*)(TCGMSG_receive_buffer+MAX_PROC) ){ printf("%ld: Warning: Out of range? %lx(%ld) < %lx\n", TCGMSG_nodeid, dest+bytes, node, TCGMSG_receive_buffer+MAX_PROC); fflush(stdout); } #endif rc=LAPI_Put(lapi_handle, (uint)node, (uint)bytes, dest, src,NULL, &req_cnt,NULL); if(rc)Error("lapi_put: sdput failed",rc); rc = LAPI_Waitcntr(lapi_handle, &req_cnt, 1, NULL); if(rc)Error("lapi_put: waitcntr failed",rc); } /** put with nonblocking semantics and counter */ void lapi_put_c(void* dest, void* src, long bytes, long node, lapi_cntr_t* cntr) { int rc; rc = LAPI_Put(lapi_handle, (uint)node, (uint)bytes, dest, src,cntr,NULL,NULL); if(rc)Error("lapi_put_c: put failed",rc); } void PBEGINF_() { PBEGIN_(NULL,NULL); } double fred =0.; void Busy(int n) { while (n-- >= 0) fred++; /* LAPI_Probe(lapi_handle); */ } void SYNCH_(long* type) { int rc; rc=LAPI_Gfence(lapi_handle); if(rc) Error("lapi_gfence failed",rc); } /** Interface from fortran to c error routine */ void PARERR_(long *code) { Error("User detected error in FORTRAN", *code); } ga-5-4/armci/tcgmsg/ipcv5.0/waitall.c0000644000175000017500000000277712662210402015404 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $$ */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_STDIO_H # include #endif #include "sndrcv.h" /** * Wait for all children to finish and return appropriate status * 0 = OK * 1 = bad news */ int WaitAll(long nchild) { int status, pid, child, stat=0, lo, hi; for (child=0; child> 8) & 0xff; if ( lo == 0177 ) (void) fprintf(stderr, "(stopped by signal %d).\n", hi); else if ( (lo != 0) && (lo & 0200) ) (void) fprintf(stderr, "(killed by signal %d, dumped core).\n", lo & 0100); else if ( lo != 0 ) (void) fprintf(stderr, "(killed by signal %d).\n",lo); else (void) fprintf(stderr, "(exited with code %d).\n",hi); (void) fflush(stderr); stat = 1; } } return stat; } ga-5-4/armci/tcgmsg/ipcv5.0/mdtob.c0000644000175000017500000000113412662210402015036 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/mdtob.c,v 1.2 1994-12-30 20:55:49 d3h325 Exp $ * * These routines use C's knowledge of the sizes of data types * to generate a portable mechanism for FORTRAN to translate * between bytes, integers and doubles. Note that we assume that * FORTRAN integers are the same size as C longs. */ #include "sndrcv.h" /** * Return the no. of bytes that n doubles occupy */ long MDTOB_(long *n) { if (*n < 0) Error("MDTOB_: negative argument",*n); return (long) (*n * sizeof(double)); } ga-5-4/armci/tcgmsg/ipcv5.0/error.c0000644000175000017500000000257612662210402015075 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_SIGNAL_H # include #endif #include "sndrcv.h" #include "tcgmsgP.h" extern void perror(const char *); extern void exit(int); extern void ZapChildren(void); #define DEV stderr void Error(char *string, long integer) { (void) signal(SIGINT, SIG_IGN); (void) signal(SIGCHLD, SIG_DFL); /* Death of children to be expected */ (void) fflush(stdout); if (TCGMSG_caught_sigint) { (void) fprintf(DEV,"%2ld: interrupt\n",(long)NODEID_()); } else { (void) fprintf(DEV,"%3ld: %s %ld (%#lx).\n", (long)NODEID_(), string, (long)integer,(long)integer); if (errno != 0) perror("system error message"); } (void) fflush(DEV); /* Shut down the sockets and remove shared memory and semaphores to propagate an error condition to anyone that is trying to communicate with me */ #ifndef LAPI ZapChildren(); /* send interrupt to children which should trap it and call Error in the handler */ DeleteSharedRegion(TCGMSG_shmem_id); #endif exit(1); } /** * Interface from fortran to c error routine */ void PARERR_(long *code) { long lcode = (long)(*code); Error("User detected error in FORTRAN", lcode); } ga-5-4/armci/tcgmsg/ipcv5.0/signals.c0000644000175000017500000000266012662210402015376 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: signals.c,v 1.3 2000-11-14 20:43:56 d3h325 Exp $ */ #if HAVE_SIGNAL_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #include "tcgmsgP.h" #ifndef SIG_ERR # define SIG_ERR (RETSIGTYPE (*)(int))-1 #endif RETSIGTYPE SigintHandler(int sig) { TCGMSG_caught_sigint = 1L; Error("SigintHandler: signal was caught",0L); } /** * Trap the signal SIGINT so that we can propagate error * conditions and also tidy up shared system resources in a * manner not possible just by killing everyone */ void TrapSigint() { if ( signal(SIGINT, SigintHandler) == SIG_ERR) Error("TrapSigint: error from signal setting SIGINT",(long) SIGINT); } /** * kill -SIGINT all of my beloved children */ void ZapChildren() { long node; for (node=0; node #endif #if HAVE_STRINGS_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif /* extern void free(void *ptr); */ #include "msgtypesc.h" #include "sndrcv.h" #include "tcgmsgP.h" /** * Process node0 has a file (assumed unopened) named fname. * This file will be copied to all other processes which must * simultaneously invoke pfilecopy. Since the processes may be * using the same directory one probably ought to make sure * that each process uses a different name in the call. * * e.g. * * on node 0 pfilecopy(99, 0, 'argosin') * on node 1 pfilecopy(99, 0, 'argosin_001') * on node 2 pfilecopy(99, 0, 'argosin_002') */ void tcgi_pfilecopy(long *type, long *node0, char *filename) { char *buffer; FILE *file; long length, nread=32768, len_nread=sizeof(long); long typenr = (*type & 32767) | MSGINT; /* Force user type integer */ long typebuf =(*type & 32767) | MSGCHR; if (!(buffer = malloc((unsigned) nread))) Error("pfilecopy: failed to allocate the I/O buffer",nread); if (*node0 == NODEID_()) { /* I have the original file ... open and check its size */ if ((file = fopen(filename,"r")) == (FILE *) NULL) { (void) fprintf(stderr,"me=%ld, filename = %s.\n", (long)NODEID_(),filename); Error("pfilecopy: node0 failed to open original file", *node0); } /* Quick sanity check on the length */ (void) fseek(file, 0L, (int) 2); /* Seek to end of file */ length = ftell(file); /* Find the length of file */ (void) fseek(file, 0L, (int) 0); /* Seek to beginning of file */ if ( (length<0) || (length>1e12) ) Error("pfilecopy: the file length is -ve or very big", length); /* Send the file in chunks of nread bytes */ while (nread) { nread = fread(buffer, 1, (int) nread, file); BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; } } } else { /* Open the file for the duplicate */ if ((file = fopen(filename,"w+")) == (FILE *) NULL) { (void) fprintf(stderr,"me=%ld, filename = %s.\n", (long)NODEID_(),filename); Error("pfilecopy: failed to open duplicate file", *node0); } /* Receive data and write to file */ while (nread) { BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; if (nread != fwrite(buffer, 1, (int) nread, file)) Error("pfilecopy: error data to duplicate file", nread); } } } /* Tidy up the stuff we have been using */ (void) fflush(file); (void) fclose(file); (void) free(buffer); } /** The original C interface to PFCOPY_. */ void PFILECOPY_(long *type, long *node0, char *filename) { tcgi_pfilecopy(type, node0, filename); } void PFCOPY_(long *type, long *node0, char *fname, int len) { /* Fortran wrapper around pfilecopy */ char *filename; #ifdef DEBUG (void) printf("me=%d, type=%d, node0=%d, fname=%x, fname=%.8s, len=%d\n", NODEID_(), *type, *node0, fname, fname, len); #endif /* Strip trailing blanks off the file name */ while ((len > 0) && (fname[len-1] == ' ')) len--; if (len <= 0) Error("pfcopy_: file name length is toast", (long) len); /* Generate a NULL terminated string */ filename = malloc( (unsigned) (len+1) ); if (filename) { (void) bcopy(fname, filename, len); filename[len] = '\0'; } else Error("PFCOPY_: failed to malloc space for filename", (long) len); /* Now call the C routine to do the work */ tcgi_pfilecopy(type, node0, filename); (void) free(filename); } ga-5-4/armci/tcgmsg/ipcv5.0/getmem.c0000644000175000017500000000156512662210402015217 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_MALLOC_H # include #endif #if HAVE_STDLIB_H # include #endif #define getmem_ F77_FUNC(getmem,GETMEM) /** * getmem gets n real*8 storage locations and returns its * address (iaddr) and offset (ioff) within the real*8 array work * so that the usable memory is (work(i+ioff),i=1,n). * e.g. * call getmem(n,work,iaddr,ioff) * if (iaddr.eq.0) call error * * Mods are needed to release this later. */ void getmem_( unsigned long *pn, double *pwork, unsigned long *paddr, unsigned long *pioff) { double *ptemp; unsigned int size = 8; #if HAVE_MEMALIGN ptemp = (double *) memalign(size, (unsigned) size* *pn); #else ptemp = (double *) malloc((unsigned) size* *pn); #endif *paddr = (unsigned long) ptemp; *pioff = ptemp - pwork; } ga-5-4/armci/tcgmsg/ipcv5.0/evlog.h0000644000175000017500000000301212662210402015047 0ustar mbamba/** @file * Define EVENT and KEY values used when calling evlog. */ #ifndef EVLOG_H_ #define EVLOG_H_ extern void evlog(int farg_key, ...); /* Values of keys in key value pairs */ #define EVKEY_LAST_ARG 0 /**> Terminates list ... takes no value */ #define EVKEY_BEGIN 1 /**> Push (char *) value onto state stack */ #define EVKEY_END 2 /**> Pop (char *) value off state stack */ #define EVKEY_EVENT 3 /**> Record (char *) value, no stack change */ #define EVKEY_MSG_LEN 4 /**> Value is (int) mesage length SND/RCV only */ #define EVKEY_MSG_TO 5 /**> Value is (int) to process id SND/RCV only */ #define EVKEY_MSG_FROM 6 /**> Value is (int) from process SND/RCV only */ #define EVKEY_MSG_TYPE 7 /**> Value is (int) message type SND/RCV only */ #define EVKEY_MSG_SYNC 8 /**> Value is (int) message sync SND/RCV only */ #define EVKEY_STR_INT 9 /**> User data value pair (char *), (int) */ #define EVKEY_STR_DBL 10 /**> User data value pair (char *), (double) */ #define EVKEY_STR 11 /**> User data value (char *) */ #define EVKEY_ENABLE 12 /**> Enable logging ... takes no value */ #define EVKEY_DISABLE 13 /**> Disable logging ... takes no value */ #define EVKEY_DUMP 14 /**> Dump out the current buffer to disk */ #define EVKEY_FILENAME 15 /**> Set the name of the events file */ #define EVENT_SND "Snd" /**> Predefined strings for internal events */ #define EVENT_RCV "Rcv" #define EVENT_PROCESS "Process" #endif /* EVLOG_H_ */ ga-5-4/armci/tcgmsg/ipcv5.0/mitod.c0000644000175000017500000000122212662210402015043 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * * $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/mitod.c,v 1.1 1997-03-05 18:42:31 d3e129 Exp $ * * These routines use C's knowledge of the sizes of data types * to generate a portable mechanism for FORTRAN to translate * between bytes, integers and doubles. Note that we assume that * FORTRAN integers are the same size as C longs. */ #include "sndrcv.h" /** * Return the minimum no. of doubles in which we can store n longs */ long MITOD_(long *n) { if (*n < 0) Error("MITOD_: negative argument",*n); return (long) ( (MITOB_(n) + sizeof(double) - 1) / sizeof(double) ); } ga-5-4/armci/tcgmsg/ipcv5.0/pbegin.c0000644000175000017500000001301212662210402015173 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STDLIB_H # include #endif /* extern long atol(const char *nptr); */ /* extern void exit(int status); */ /* Define PBEGIN_C so that global variables in tcgmsgP.h are defined here and declared extern everywhere else ... SGI linker is a whiner */ #define PBEGIN_C #include "tcgmsgP.h" #ifdef LAPI ShmemBuf TCGMSG_receive_buffer[MAX_PROC]; void lapi_initialize(); #endif extern void TrapSigint(void); extern void TrapSigchld(void); extern int WaitAll(long); static int SR_initialized=0; long TCGREADY_() { return (long)SR_initialized; } /* Define what was externally declared in tcgmsgP.h */ long TCGMSG_nodeid; long TCGMSG_nnodes; long DEBUG_=0; /* debug flag ... see setdbg */ long TCGMSG_nodeid; long TCGMSG_nnodes; char* TCGMSG_shmem; long TCGMSG_shmem_id; long TCGMSG_shmem_size; long TCGMSG_caught_sigint; ProcInfo* TCGMSG_proc_info; SendQEntry* TCGMSG_sendq_ring; /** * shared-memory version of TCGMSG */ void tcgi_pbegin(int argc, char **argv) { long arg, node, i, max_n_msg; TCGMSG_nodeid = 0; TCGMSG_nnodes = 1; /* By default just sequential */ if(SR_initialized)Error("TCGMSG initialized already???",-1); else SR_initialized=1; #ifdef LAPI lapi_initialize(); #else /* LAPI */ for (arg=1; arg<(argc-1); arg++) if (strcmp(argv[arg],"-np") == 0) { TCGMSG_nnodes = atol(argv[arg+1]); break; } #endif /* LAPI */ if (TCGMSG_nnodes > MAX_PROC){ if(NODEID_()){ sleep(1); return; } fprintf(stderr,"\nTCGMSG has been configured for up to %d processes\n", MAX_PROC); fprintf(stderr,"Please change MAX_PROC in `tcgmsgP.h` and recompile\n\n"); sleep(1); Error("aborting ... ",0); } if (TCGMSG_nnodes == 1) { return; }; /* Set up handler for SIGINT and SIGCHLD */ #ifndef LAPI TrapSigint(); TrapSigchld(); #endif /* Allocate the process info structures */ if (!(TCGMSG_proc_info = (ProcInfo *) malloc((size_t) (TCGMSG_nnodes*sizeof(ProcInfo))))) Error("pbegin: failed to malloc procinfo", (long) (TCGMSG_nnodes*sizeof(ProcInfo))); bzero((char *) TCGMSG_proc_info, (int) (TCGMSG_nnodes*sizeof(ProcInfo))); /* Allocate a ring of message q entries to avoid having a malloc/free pair for every message sent */ max_n_msg = 2*TCGMSG_nnodes; if (max_n_msg < MAX_N_OUTSTANDING_MSG) max_n_msg = MAX_N_OUTSTANDING_MSG; if (!(TCGMSG_sendq_ring = (SendQEntry *) malloc((size_t) (max_n_msg*sizeof(SendQEntry))))) Error("pegin: failed to malloc entries for send q", 0L); for (i=0; i 1) { int status; int rc; status = WaitAll(TCGMSG_nnodes-1); /* Wait for demise of children */ rc=DeleteSharedRegion(TCGMSG_shmem_id); if(rc)printf("DeleteSharedMem returned %d\n",rc); if (status) exit(1); } #endif } ga-5-4/armci/tcgmsg/ipcv5.0/tcgshmem.h0000644000175000017500000000256512662210402015556 0ustar mbamba/** @file * Header file which declares stubs for the shared memory interface. * Note that the input arguments switch between integers and pointers * to integers depending on if they are modified on return. */ #ifndef SHMEM_H_ #define SHMEM_H_ /** * Create a shared region of at least size bytes, returning the actual size, * the id associated with the region. The return vaue is a pointer to the * the region. Any error is a hard fail. */ extern char *CreateSharedRegion(long *id, long *size); /** * Detach a process from a shared memory region. 0 is returned on success, * -1 for failure. id, size, and addr much match exactly those items returned * from CreateSharedRegion * */ extern long DetachSharedRegion(long id, long size, char *addr); /** * Delete a shared region from the system. This has to be done on the SUN * to remove it from the system. On the Alliant the shared region disappears * when the last process dies or detaches. Returns 0 on success, -1 on error. */ extern long DeleteSharedRegion(long id); /** * Attach to a shared memory region of known id and size. Returns the * address of the mapped memory. Size must exactly match the size returned * from CreateSharedRegion (which in turn is the requested size rounded * up to a multiple of 4096). Any error is a hard fail. */ extern char *AttachSharedRegion(long id, long size); #endif /* SHMEM_H_ */ ga-5-4/armci/tcgmsg/ipcv5.0/mitob.c0000644000175000017500000000114112662210402015041 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * * $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/mitob.c,v 1.2 1994-12-30 20:55:54 d3h325 Exp $ * * These routines use C's knowledge of the sizes of data types * to generate a portable mechanism for FORTRAN to translate * between bytes, integers and doubles. Note that we assume that * FORTRAN integers are the same size as C longs. */ #include "sndrcv.h" /** * Return the no. of bytes that n ints=longs occupy */ long MITOB_(long *n) { if (*n < 0) Error("MITOB_: negative argument",*n); return (long) (*n * sizeof(long)); } ga-5-4/armci/tcgmsg/ipcv5.0/mdtoi.c0000644000175000017500000000121312662210402015043 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * * $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/mdtoi.c,v 1.1 1997-03-05 18:42:31 d3e129 Exp $ * * These routines use C's knowledge of the sizes of data types * to generate a portable mechanism for FORTRAN to translate * between bytes, integers and doubles. Note that we assume that * FORTRAN integers are the same size as C longs. */ #include "sndrcv.h" /** * Return the minimum no. of integers which will hold n doubles. */ long MDTOI_(long *n) { if (*n < 0) Error("MDTOI_: negative argument",*n); return (long) ( (MDTOB_(n) + sizeof(long) - 1) / sizeof(long) ); } ga-5-4/armci/tcgmsg/ipcv5.0/globalop.c0000644000175000017500000001270612662210402015537 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "srftoc.h" #include "tcgmsgP.h" #define BUF_SIZE 10000 #define IBUF_SIZE (BUF_SIZE * sizeof(double)/sizeof(long)) double _gops_work[BUF_SIZE]; long one=1; #define TCG_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define TCG_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define TCG_ABS(a) (((a) >= 0) ? (a) : (-(a))) void BRDCST_(long *type, void *buf, long *len, long *originator) { long me=NODEID_(), nproc=NNODES_(), lenmes, from, root=0; long up, left, right; /* determine location in the binary tree */ up = (me-1)/2; if(up >= nproc) up = -1; left = 2* me + 1; if(left >= nproc) left = -1; right = 2* me + 2; if(right >= nproc) right = -1; /* originator sends data to root */ if (*originator != root ){ if(me == *originator) SND_(type, buf, len, &root, &one); if(me == root) RCV_(type, buf, len, &lenmes, originator, &from, &one); } if (me != root) RCV_(type, buf, len, &lenmes, &up, &from, &one); if (left > -1) SND_(type, buf, len, &left, &one); if (right > -1) SND_(type, buf, len, &right, &one); } /** * implements x = op(x,work) for integer datatype * x[n], work[n] - arrays of n integers */ static void idoop(long n, char *op, long *x, long *work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = TCG_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = TCG_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else Error("idoop: unknown operation requested", (long) n); } /** * implements x = op(x,work) for double datatype * x[n], work[n] - arrays of n doubles */ static void ddoop(long n, char *op, double *x, double *work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = TCG_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = TCG_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MIN(x1, x2); x++; work++; } else Error("ddoop: unknown operation requested", (long) n); } void DGOP_( long *type, double *x, long *n, char *op, int oplen) { long me=NODEID_(), nproc=NNODES_(), len, lenmes, from, root=0; double *work = _gops_work, *origx = x; long ndo, up, left, right, np=*n, orign = *n; /* determine location in the binary tree */ up = (me-1)/2; if(up >= nproc) up = -1; left = 2* me + 1; if(left >= nproc) left = -1; right = 2* me + 2; if(right >= nproc) right = -1; while ((ndo = (np <= BUF_SIZE) ? np : BUF_SIZE)) { len = lenmes = ndo*sizeof(double); if (left > -1) { RCV_(type, (char *) work, &len, &lenmes, &left, &from, &one); ddoop(ndo, op, x, work); } if (right > -1) { RCV_(type, (char *) work, &len, &lenmes, &right, &from, &one); ddoop(ndo, op, x, work); } if (me != root) SND_(type, x, &len, &up, &one); np -=ndo; x +=ndo; } /* Now, root broadcasts the result down the binary tree */ len = orign*sizeof(double); BRDCST_(type, (char *) origx, &len, &root); } void IGOP_(long *type, long *x, long *n, char *op, int oplen) { long me=NODEID_(), nproc=NNODES_(), len, lenmes, from, root=0; long *work = (long*)_gops_work; long *origx = x; long ndo, up, left, right, np=*n, orign =*n; /* determine location in the binary tree */ up = (me-1)/2; if(up >= nproc) up = -1; left = 2* me + 1; if(left >= nproc) left = -1; right = 2* me + 2; if(right >= nproc) right = -1; while ((ndo = (np<=IBUF_SIZE) ? np : IBUF_SIZE)) { len = lenmes = ndo*sizeof(long); if (left > -1) { RCV_(type, (char *) work, &len, &lenmes, &left, &from, &one); idoop(ndo, op, x, work); } if (right > -1) { RCV_(type, (char *) work, &len, &lenmes, &right, &from, &one); idoop(ndo, op, x, work); } if (me != root) SND_(type, x, &len, &up, &one); np -=ndo; x +=ndo; } /* Now, root broadcasts the result down the binary tree */ len = orign*sizeof(long); BRDCST_(type, (char *) origx, &len, &root); } ga-5-4/armci/tcgmsg/ipcv5.0/usleep.c0000644000175000017500000000214612662210402015232 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/usleep.c,v 1.4 1997-11-07 23:44:20 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_SYS_SELECT_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_TIME_H # include #endif #include "tcgmsgP.h" #ifdef STUPIDUSLEEP void USleep(long us) { int s = us/1000000; if (s == 0) s = 1; (void) sleep(s); } #else /* STUPIDUSLEEP */ /** * Sleep for the specified no. of micro-seconds ... uses the timeout * on select ... it seems to be accurate to about a few centiseconds * on a sun. I don't know how much system resources it eats. */ void USleep(long us) { int width=0; struct timeval timelimit; /* printf("%2ld: sleeping for %ldus\n", TCGMSG_nodeid, us); fflush(stdout);*/ timelimit.tv_sec = (int) (us/1000000); timelimit.tv_usec = (int) (us - timelimit.tv_sec*1000000); (void) select(width, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &timelimit); } #endif /* STUPIDUSLEEP */ ga-5-4/armci/tcgmsg/ipcv5.0/nnodes.c0000644000175000017500000000017712662210402015225 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "tcgmsgP.h" long NNODES_(void) { return (long) TCGMSG_nnodes; } ga-5-4/armci/tcgmsg/ipcv5.0/misc.c0000644000175000017500000000062712662210402014672 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "srftoc.h" #include "tcgmsgP.h" /** * Define value of debug flag */ void SETDBG_(long *onoff) { DEBUG_ = *onoff; } /** * Print out statistics for communications ... not yet implemented */ void STATS_() { (void) fprintf(stderr,"STATS_ not yet supported\n"); (void) fflush(stderr); } ga-5-4/armci/tcgmsg/ipcv5.0/mtime.c0000644000175000017500000000452312662210402015051 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/mtime.c,v 1.5 2002-03-12 18:59:31 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #include "srftoc.h" /** * return wall clock time in centiseconds */ long MTIME_() { double TCGTIME_(); return (long) (TCGTIME_()*100.0); } #if defined(LAPI) && defined(AIX) # define LAPI_AIX #endif #ifndef LAPI_AIX #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_TIME_H # include #endif static unsigned firstsec=0; /* Reference for timer */ static unsigned firstusec=0; /* Reference for timer */ void MtimeReset() /* Sets timer reference */ { struct timeval tp; struct timezone tzp; (void) gettimeofday(&tp,&tzp); firstsec = tp.tv_sec; firstusec = tp.tv_usec; } /** * Return wall clock time in seconds as accurately as possible */ double TCGTIME_() { static int firstcall=1; double low, high; struct timeval tp; struct timezone tzp; if (firstcall) { MtimeReset(); firstcall = 0; } (void) gettimeofday(&tp,&tzp); low = (double) (tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); } #endif #ifdef LAPI_AIX #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_SYSTEMCFG_H # include #endif static int firstsec=0; /* Reference for timer */ static int firstnsec=0; void MtimeReset() /* Sets timer reference */ { timebasestruct_t t; read_real_time(&t, TIMEBASE_SZ); time_base_to_time(&t, TIMEBASE_SZ); firstsec = t.tb_high; firstnsec = t.tb_low; } /** * Return wall clock time in seconds as accurately as possible */ double TCGTIME_() { static int firstcall=1; timebasestruct_t t; int low, high; int secs, nsecs; if (firstcall) { MtimeReset(); firstcall = 0; } read_real_time(&t, TIMEBASE_SZ); time_base_to_time(&t, TIMEBASE_SZ); secs = t.tb_high - firstsec; nsecs = t.tb_low - firstnsec; /* If there was a carry from low-order to high-order during the measurement, we have to undo it */ if(nsecs < 0){ secs--; nsecs+= 1000000000; } return (double)(secs + 1.0e-9*nsecs); } #endif /* LAPI_AIX */ ga-5-4/armci/tcgmsg/ipcv5.0/tcgmsgP.h0000644000175000017500000001011112662210402015335 0ustar mbamba#ifndef TCGMSGP_H_ #define TCGMSGP_H_ #if HAVE_STRING_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SIGNAL_H # include #endif #ifdef LAPI # include #endif #include "tcgshmem.h" #include "sndrcv.h" #include "srftoc.h" /* TODO autoconf way to detect this?? */ #define MAX_PROC 512 /* #define MAX_PROC 16 */ /* under Cygnus we got only serial execution */ /* #define MAX_PROC 1 */ #define INTERNAL_SYNC_TYPE 33333 #define MAX_N_OUTSTANDING_MSG 64 extern void USleep(long); #ifndef LAPI extern long *nxtval_shmem; #endif extern long DEBUG_; extern long TCGMSG_nodeid; /**> The id of this process */ extern long TCGMSG_nnodes; /**> Total no. of processes */ extern char * TCGMSG_shmem; /**> Pointer to shared-memory segment */ extern long TCGMSG_shmem_id; /**> ID of shared-memory segment */ extern long TCGMSG_shmem_size; /**> Size of shared-memory segment */ extern long TCGMSG_caught_sigint; /**> True if SIGINT was trapped */ /* Structure defines shared memory buffer ... each process has one for every process that can send to it via shared memory. Adjust SHMEM_BUF_SIZE so that sizeof(ShmemBuf) is an integer multiple of page sizes. Structure of this buffer is exploited in T3D code. */ #ifdef NOTIFY_SENDER # ifdef LAPI # define RESERVED (6*sizeof(long) + sizeof(lapi_cntr_t)) # else # define RESERVED 6*sizeof(long) # endif #else # define RESERVED 4*sizeof(long) #endif #if defined(MACX) # define WHOLE_BUF_SIZE 2*65536 #elif defined(LAPI) # define WHOLE_BUF_SIZE (3*4096) #else # define WHOLE_BUF_SIZE (16*8192) #endif #define SHMEM_BUF_SIZE (WHOLE_BUF_SIZE - RESERVED) #ifdef LAPI # define SND_RESERVED (4*sizeof(long) + sizeof(lapi_cntr_t) + sizeof(void*)) # define SEND_BUF_SIZE (WHOLE_BUF_SIZE - SND_RESERVED) # define SENDBUF_NUM 2 typedef struct { lapi_cntr_t cntr; void *next; long info[4]; char buf[SEND_BUF_SIZE]; } sendbuf_t; sendbuf_t *sendbuf_arr, *localbuf; #endif typedef struct { long info[4]; /**< 0=type, 1=length, 2=tag, 3=full */ char buf[SHMEM_BUF_SIZE]; /**< Message buffer */ #ifdef NOTIFY_SENDER long stamp; # ifdef LAPI lapi_cntr_t cntr; # endif long flag; /**< JN: used by receiver to signal sender */ #endif } ShmemBuf; /* Structure defines an entry in the send q */ typedef struct { long msgid; /**< Message id for msg_status */ long type; /**< Message type */ long node; /**< Destination node */ long tag; /**< Message tag */ char *buf; /**< User or internally malloc'd buffer */ long lenbuf; /**< Length of user buffer in bytes */ long written; /**< Amount already sent */ long buffer_number; /**< No. of buffers alread sent */ long free_buf_on_completion; /* Boolean true if free buffer using free */ void *next; /**< Pointer to next entry in linked list */ void *next_in_ring; /**< Pointer to next entry in ring of free entries */ long active; /**< 0/1 if free/allocated */ } SendQEntry; /* This structure holds basically all process specific information */ #define COMM_MODE_NONE 0 #define COMM_MODE_SHMEM 1 #define COMM_MODE_SOCK 2 typedef struct { ShmemBuf *sendbuf; /**< Shared-memory buffer for sending to node*/ ShmemBuf *recvbuf; /**< Shared-memory buffer for receiving from */ int sock; /**< Socket for send/receive */ int comm_mode; /**< Defines communication info */ pid_t pid; /**< Unix process id (or 0 if unknown) */ long tag_rcv; /**< Expected tag from next rcv() */ long n_snd; /**< No. of messages sent from this process */ long n_rcv; /**< No. of messages recv from this process */ SendQEntry *sendq; /**< Queue of messages to be sent */ } ProcInfo; extern ProcInfo *TCGMSG_proc_info; /**< Will point to array of structures */ extern SendQEntry *TCGMSG_sendq_ring; /**< Circular ring of SendQEntry structures for fast allocation/free */ #endif /* TCGMSGP_H_ */ ga-5-4/armci/tcgmsg/ipcv5.0/async_send.c0000644000175000017500000001766612662210402016100 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif extern void exit(int status); #include "tcgmsgP.h" static const long false = 0; static const long true = 1; extern void Busy(int); extern void flush_send_q(void); /* All data movement to/from shared memory is done using the COPY_TO/FROM_SHMEM macros */ #define COPY_TO_LOCAL(src, dest, n, destnode) (void) memcpy(dest, src, n) #define COPY_FROM_LOCAL(src, dest, n) (void)memcpy(dest, src, n) #define COPY_FROM_REMOTE(src,dest,n,p) (void)memcpy(dest, src, n) #define COPY_TO_REMOTE(src,dest,n,p) (void)memcpy(dest, src, n) #ifndef FLUSH_CACHE # define FLUSH_CACHE #endif #ifndef FLUSH_CACHE_LINE # define FLUSH_CACHE_LINE(x) #endif /* #define TCG_ABS(a) (((a) >= 0) ? (a) : (-(a))) */ /** * Return the value of a volatile variable in shared memory * that is REMOTE to this processor */ static long remote_flag(long *p, long node) { long tmp; /* FLUSH_CACHE;*/ /* no need to flush for one word only*/ COPY_FROM_REMOTE(p, &tmp, sizeof(tmp), node); return tmp; } /** * Return the value of a volatile variable in shared memory * that is LOCAL to this processor */ static long local_flag(long *p) { FLUSH_CACHE_LINE(p); return(*p); } /** * Wait for (*p == value) */ static void local_await(long *p, long value) { long pval; long nspin = 0; long spinlim = 100000000; while ((pval = local_flag(p)) != value) { if (pval && (pval != value)) { fprintf(stdout,"%2ld: invalid value=%ld, local_flag=%p %ld\n", TCGMSG_nodeid, (long)value, p, (long)pval); fflush(stdout); exit(1); } nspin++; if((nspin&7)==0)flush_send_q(); if (nspin < spinlim) Busy(100); else usleep(1); } } /** * Entry points to info about a message ... determine which * transport mechanism is appropriate and send as much as * possible without blocking. * * Right now just shared memory ... when sockets are working this * routine will become async_shmem_send. * * Shared-memory protocol aims for low latency. Each process has * one buffer for every other process. Thus, to send a message U * merely have to determine if the receivers buffer for you is empty * and copy directly into the receivers buffer. * * Return 0 if more data is to be sent, 1 if the send is complete. */ long async_send(SendQEntry *entry) { long node = entry->node; ShmemBuf *sendbuf= TCGMSG_proc_info[node].sendbuf; long nleft, ncopy; long pval; long info[4]; #ifdef DEBUG (void) fprintf(stdout,"%2ld: sending to %ld buf=%lx len=%ld\n", TCGMSG_nodeid, node, entry->buf, entry->lenbuf); (void) fprintf(stdout,"%2ld: sendbuf=%lx\n", TCGMSG_nodeid, sendbuf); (void) fflush(stdout); #endif if ((pval = remote_flag(&sendbuf->info[3], node))) { #ifdef DEBUG { long info[4]; FLUSH_CACHE; COPY_FROM_REMOTE(sendbuf->info, info, sizeof(info), node); fprintf(stdout,"%2ld: snd info after full = %ld %ld %ld\n", TCGMSG_nodeid, info[0], info[1], info[2]); fflush(stdout); } sleep(1); #endif return 0; } info[0] = entry->type; info[1] = entry->lenbuf; info[2] = entry->tag; /* Copy over the first buffer load of the message */ nleft = entry->lenbuf - entry->written; ncopy = (long) ((nleft <= SHMEM_BUF_SIZE) ? nleft : SHMEM_BUF_SIZE); if (ncopy&7) { #ifdef DEBUG printf("%2ld: rounding buffer up %ld->%ld\n", TCGMSG_nodeid, ncopy, ncopy + 8 - (ncopy&7)); fflush(stdout); #endif ncopy = ncopy + 8 - (ncopy&7); } if (ncopy) { COPY_TO_REMOTE(entry->buf+entry->written, sendbuf->buf, ncopy, node); } /* NOTE that SHMEM_BUF_SIZE is a multiple of 8 by construction so that this ncopy is only rounded up on the last write */ ncopy = (long) ((nleft <= SHMEM_BUF_SIZE) ? nleft : SHMEM_BUF_SIZE); entry->written += ncopy; entry->buffer_number++; /* Copy over the header information include buffer full flag */ info[3] = entry->buffer_number; COPY_TO_REMOTE(info, sendbuf->info, sizeof(info), node); return (long) (entry->written == entry->lenbuf); } /** * Receive a message of given type from the specified node, returning * the message and length of the message. * * Right now just shared memory ... when sockets are working this * routine will become msg_shmem_rcv * * Shared-memory protocol aims for low latency. Each process has * one buffer for every other process. Thus, to send a message U * merely have to determine if the receivers buffer for you is empty * and copy directly into the receivers buffer. * * Return 0 if more data is to be sent, 1 if the send is complete. */ void msg_rcv(long type, char *buf, long lenbuf, long *lenmes, long node) { long me = TCGMSG_nodeid; ShmemBuf *recvbuf; /* Points to receving buffer */ long nleft; long msg_type, msg_tag, msg_len; long buffer_number = 1; long expected_tag = TCGMSG_proc_info[node].tag_rcv++; if (node<0 || node>=TCGMSG_nnodes) Error("msg_rcv: node is out of range", node); recvbuf = TCGMSG_proc_info[node].recvbuf; /* Wait for first part message to be written */ #ifdef DEBUG (void) fprintf(stdout,"%2ld: receiving from %ld buf=%lx len=%ld\n", me, node, buf, lenbuf); (void) fprintf(stdout,"%2ld: recvbuf=%lx\n", me, recvbuf); (void) fflush(stdout); #endif local_await(&recvbuf->info[3], buffer_number); /* Copy over the header information */ /* FLUSH_CACHE;*/ msg_type = recvbuf->info[0]; msg_len = recvbuf->info[1]; msg_tag = recvbuf->info[2]; /* Check type and size information */ if (msg_tag != expected_tag) { (void) fprintf(stdout, "rcv: me=%ld from=%ld type=%ld, tag=%ld, expectedtag=%ld\n", (long)me, (long)node, (long)type, (long)msg_tag, (long)expected_tag); fflush(stdout); Error("msg_rcv: tag mismatch ... transport layer failed????", 0L); } if (msg_type != type) { (void) fprintf(stdout, "rcv: me=%ld from=%ld type=(%ld != %ld) tag=%ld len=%ld\n", (long)me, (long)node, (long)type, (long)msg_type, (long)msg_tag, (long)msg_len); fflush(stdout); Error("msg_rcv: type mismatch ... strong typing enforced\n", 0L); } if (msg_len > lenbuf) { (void) fprintf(stderr, "rcv: me=%ld from=%ld type=%ld tag=%ld len=(%ld > %ld)\n", (long)me, (long)node, (long)type, (long)msg_tag, (long)msg_len, (long)lenbuf); Error("msg_rcv: message too long for buffer\n", 0L); } nleft = *lenmes = msg_len; if (nleft == 0) { recvbuf->info[3] = false; } while (nleft) { long ncopy = (long) ((nleft <= SHMEM_BUF_SIZE) ? nleft : SHMEM_BUF_SIZE); { long line; if(ncopy < 321) for(line = 0; line < ncopy; line+=32) FLUSH_CACHE_LINE(recvbuf->buf+line); else FLUSH_CACHE; } /* if (buffer_number > 1) FLUSH_CACHE;*/ COPY_FROM_LOCAL(recvbuf->buf, buf, ncopy); recvbuf->info[3] = false; nleft -= ncopy; buf += ncopy; if (nleft) { buffer_number++; local_await(&recvbuf->info[3], buffer_number); } } } long MatchShmMessage(long node, long type) { ShmemBuf *recvbuf; long msg_type; recvbuf = TCGMSG_proc_info[node].recvbuf; if(recvbuf->info[3] == false) return (0); /* no message to receive */ /* we have a message but let's see if want it */ FLUSH_CACHE_LINE(recvbuf->info); COPY_FROM_LOCAL(recvbuf->info, &msg_type, sizeof(long)); if(type == msg_type) return (1); return (0); } ga-5-4/armci/tcgmsg/msgtypesf.h0000644000175000017500000000035712662210402014601 0ustar mbambaC C This defines bit masks that can be ORed with user types (1-32767) C to indicate the nature of the data to the message passing system C integer msgdbl, msgint, msgchr parameter (msgdbl=65536, msgint=131072, msgchr=262144) ga-5-4/armci/tcgmsg/sndrcv.h0000644000175000017500000000360612662210402014057 0ustar mbamba/** @file * This header file declares stubs and show prototypes of the * public sndrcv calls * * srftoc.h contains macros which define the names of c routines * accessible from FORTRAN and vice versa */ #ifndef SNDRCV_H_ #define SNDRCV_H_ #include "msgtypesc.h" #include "srftoc.h" #ifdef __cplusplus extern "C" { #endif extern void BRDCST_(long *type, void *buf, long *lenbuf, long *originator); extern void DGOP_(long *type, double *x, long *n, char *op, int oplen); extern double DRAND48_(); extern void IGOP_(long *type, long *x, long *n, char *op, int oplen); extern void LLOG_(); extern long MDTOB_(long *n); extern long MDTOI_(long *n); extern long MITOB_(long *n); extern long MITOD_(long *n); extern long MTIME_(); extern long NICEFTN_(long *ival); extern long NNODES_(); extern long NODEID_(); extern long NXTVAL_(long *mproc); extern void PARERR_(long *code); extern void PBEGINF_(); extern void PBGINF_(); extern void PEND_(); extern void PFCOPY_(long *type, long *node0, char *filename, int flen); extern void PFILECOPY_(long *type, long *node0, char *filename); extern long PROBE_(long *type, long *node); extern void RCV_(long *type, void *buf, long *lenbuf, long *lenmes, long *nodeselect, long *nodefrom, long *sync); extern void SETDBG_(long *value); extern void SND_(long *type, void *buf, long *lenbuf, long *node, long *sync); extern void SRAND48_(long *seed); extern void STATS_(); extern void SYNCH_(long *type); extern long TCGREADY_(); extern double TCGTIME_(); extern void WAITCOM_(long *node); /* Miscellaneous routines for internal use only? */ extern void Error(char *string, long integer); extern void MtimeReset(); extern void PrintProcInfo(); extern void RemoteConnect(long a, long b, long c); extern void tcgi_pbegin(int argc, char **argv); extern void USleep(long us); #ifdef __cplusplus } #endif #endif /* SNDRCV_H_ */ ga-5-4/armci/tcgmsg/msgtypesc.h0000644000175000017500000000043612662210402014574 0ustar mbamba/** @file * This defines bit masks that can be OR'ed with user types (1-32767) * to indicate the nature of the data to the message passing system */ #ifndef MSGTYPES_H_ #define MSGTYPES_H_ #define MSGDBL 65536 #define MSGINT 131072 #define MSGCHR 262144 #endif /* MSGTYPES_H_ */ ga-5-4/armci/tcgmsg/README0000644000175000017500000002122712662210402013266 0ustar mbambaTCGMSG migration path (January 2013) ------------------------------------ TCGMSG (ipcv4.0 and ipcv5.0) have become the MPI-free runtime for ARMCI. It is now C-only i.e. no fortran code. The TCGMSG fortran interface is preserved for backwards compatibility within the Global Arrays distribution. This was a minimal effort migration. MPI is the preferred runtime. TCGMSG Send/receive subroutines ... version 4.04 (January 1994) --------------------------------------------------------------- :author: Robert J. Harrison :address: P.O. Box 999 Richland WA 99352 K1-90 :tel: 509-375-2037 :fax: 509-375-6631 :email: rj_harrison@pnl.gov Summary ------- TCGMSG is a toolkit for writing portable parallel programs using a message passing model. Supported are a variety of common UNIX workstations, mini-super and super computers and hetrogenous networks of the same, along with true parallel computers such as the Touchstone Delta, the Intel iPSC, the Kendall Square Research KSR-1, and the Alliant FX/2800 MPP system. Applications port between all of these environments without modification to the parallel constructs. This toolkit is available without charge, along with a set of example 'chemistry' applications. We are using this toolkit in our production codes, but cannot guarantee support or accept any liability for its use. Release Notes (4.04) -------------------- 1) Several bug fixes for SUN and Intel 2) Fixed, but slow, KSR port ... bug KSR to write quality software instead of hacking 3) Paragon port 4) DEC Alpha port (thanks to Nico Sanna, Rome) 5) Implemented bitwise OR operation for IGOP 6) Fixed UNIX version so that an executable invoked on its own (i.e., without using the parallel command) functions correctly as a single process ... this is very useful for debugging (thanks to J. Nieplocha). 7) Probe now formally supported on all platforms including entry in ipcv4.0/README and the interactive test program Release Notes (4.03) -------------------- 1) Tuning of shared memory communication mechanism. 2) Fixed bugs causing non-conservation of energy in MD example. Release Notes (4.02) -------------------- 0) Note my new address. 1) New port to the KSR, done by KSR and integrated by me back into the main release. This looks good, though the C compiler will not compile the socket based code with any optimisation and I have not done any extensive testing other than verify the test code and examples. 2) Script (makep) to build a .p file for a UNIX workstation network. It queries a list of machines to see if they are up and then sorts them by their load. Finally, a .p file is built to use the desired no. of machines using the least loaded ones first. Have a look at the top of tcgmsg/makep for more info. 3) A few minor bug fixes. Worst one was specific to SUN Fortran. 4) New function returns wall clock time in seconds as accurately as possible (or rather as accurately as currently implemented). DOUBLE PRECISION FUNCTION TCGTIME() double TCGTIME_() 5) Wrapper around nice for FORTRAN users only INTEGER FUNCTION NICE(INCR) INTEGER INCR 6) MD and SCF examples extensively revised to more accurately reflect actual applications. 7) Thanks to multiple users for input (Rick Kendall, Theresa Windus, Mike Coolidge, Joe Golab, Rik Littlefield, ...) 8) Experiments with a function to probe the message queue for available messages. INTEGER FUNCTION PROBE(TYPE, NODE) INTEGER TYPE, NODE long PROBE_(long * type, long * node) 9) Are you aware of the message passing interface standardization effort? Send mail to netlib@ornl.gov with the body 'send index from mpi' to get more information. Release Notes (4.0) ------------------- 1) Hopefully all (?) inconsistencies have now been removed. In particular receive from anyone now checks the type on ALL messages by peeking at data in the socket/buffer if necessary. 2) Numerous bug fixes, mostly to do with specific process distributions and removing stupidities in socket I/O. 3) Much improved (2-10+) short message performance. Part of this comes from SHORT messages being sent asynchronously as far as buffering in the transport mechanism permits. This also makes the UNIX world consistent with the iPSC world. However, the maximum length/number of messages that can be sent asyncrhonously is system and transport mechanism dependent and should not be relied upon. 4) Updating of all existing ports to reflect latest O/S releases (e.g. CRAY UNICOS 6.* and 7.*) 5) New ports including the Alliant Massively parallel system. 6) Simplified install procedure ... just type 'make all MACHINE=CRAY' 7) Broadcast and global operations have been tuned to both the UNIX networked environment (to minimize network traffic) and to the iPSC and DELTA. All exploit full pipe-lining and overlap of operations on large vectors. The requirement to provide workspace for the global operations has been eliminated. 8) Improved support for the IPSC and DELTA, including working demo command for the examples. Obtaining TCGMSG ---------------- a) anonymous ftp from ftp.tcg.anl.gov If you obtain the source by ftp please send e-mail to me so that I can maintain a list of users for bugfixes etc. Using binary mode transfer the file pub/tcgmsg/tcgmsg.4.04.tar.Z (or tcgmsg.4.04.tar if you don't have compress). b) e-mail (only if you can't ftp it please) Send a request to me at the above address. I will send you a split uuencoded version of tcgmsg.4.04.tar.Z. Installing TCGSMG ----------------- a) Existing ports Meaning of status field . - tested and fully functional s - tested but O/S does not support shared memory -> sockets only x - tested but O/S does not support XDR -> no data conversion ? - not tested recently but is supposed to work ! - known problems Status Machine Description ------ ------- ----------- . SUN Sun workstation running Sun O/S 4.0 or above . KSR Kendall Square Research KSR-1 . DEC DecStation running ULTRIX . DECOSF DEC Alpha running OSF (must use 8 byte FORTRAN integers) . SGI Silicon Graphics workstation IRIX 4.0 . ALLIANT Alliant FX/8/80/800/2800 Concentrix 2800 2.2 ? ALLIANTMPP Alliant MPP system ALPHA VERSION . ARDENT Stardent (formerly Ardent) Titan O/S 2.2 . CONVEX Convex C220 running ConvexOS V8.1 . IBM IBM R6000 with AIX 3.1 (xlf -qEXTNAME) . IBMNOEXT IBM R6000 with AIX 3.1 . HPUX Hewlett-Packard risc (HP-UX A.B8.05) (f77 +ppu) . HPUXNOEXT Hewlett-Packard risc (HP-UX A.B8.05) . IPSC Intel iPSC i860 hypercube . DELTA Intel/DARPA Touchstone Delta . PARAGON Intel Paragon running OSF x APOLLO Apollo DN10000, DomainOS Release 10.3 (bsd4.3) s CRAY Cray running UNICOS 6.1 or above s NEXT NeXT Workstation (OS 2.1) (Absoft f77 -f -N9) s NEXTNOEXT NeXT Workstation (OS 2.1) (Absoft f77 -f) ? ENCORE Encore running UMAX-4.3 ! SEQUENT Sequent (DYNIX V3.0.14) In the top-level TCGMSG directory type make all MACHINE= e.g. make all MACHINE=ALLIANT That's it, unless you're building the IPSC source. For the IPSC you also need to log onto the cube manager and in the tcgmsg/ipcv4.0 directory type 'make parallel'. See the section on testing below and the Makefile and README in the ipcv4.0 directory for more detailed information. b) Ports to new UNIX machines See ipcv4.0/README for suggested procedure. c) Ports to new true message passing machines See the source for the iPSC. Testing ------- 1) System test codes in ipcv4.0 Make installs default proc-group files using the local machine only. See the ipcv4.0/README info on how to include additional hosts/processes. a) Hello world ... try the following command. parallel hello b) Interactive system test program parallel test c) Non-interactive FORTRAN test program parallel testf 2) The codes in examples e.g. cd examples demo scf ... respond 15 for the number of basis functions See the README for more info on the examples and how to run them. ga-5-4/armci/tcgmsg/ipcv4.0/0000755000175000017500000000000012662210401013564 5ustar mbambaga-5-4/armci/tcgmsg/ipcv4.0/shmem.c0000644000175000017500000002101512662210401015040 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/shmem.c,v 1.13 2000-10-13 20:55:40 d3h325 Exp $ */ /* This stuff attempts to provide a simple interface to temporary shared memory regions, loosely modelled after that of Alliant Concentrix 5.0 Note that the input arguments switch between integers and pointers to integers depending on if they are modified on return. Create a shared region of at least size bytes, returning the actual size, the id associated with the region. The return value is a pointer to the the region. Any error is a hard fail. (char *) CreateSharedRegion((long *) id, (long *) size) Detach a process from a shared memory region. 0 is returned on success, -1 for failure. id, size, and addr must match exactly those items returned from CreateSharedRegion long DetachSharedRegion((long) id, (long) size, (char *) addr) Delete a shared region from the system. This has to be done on the SUN to remove it from the system. On the Alliant the shared region disappears when the last process dies or detaches. Returns 0 on success, -1 on error. long DeleteSharedRegion((long) id) Delete all the shared regions associated with this process. long DeleteSharedAll() Attach to a shared memory region of known id and size. Returns the address of the mapped memory. Size must exactly match the size returned from CreateSharedRegion (which in turn is the requested size rounded up to a multiple of 4096). Any error is a hard fail. (char *) AttachSharedRegion((long) id, (long) size)) */ extern void Error(); #ifdef ALLIANT #include #include extern char *valloc(); char *CreateSharedRegion(id, size) long *size, *id; { struct timeval tp; struct timezone tzp; char *temp; int status; /* Have to round up to a multiple of page size before allocating on a page boundary */ *size = ( (*size + 4095) / 4096 ) * 4096; if ( (temp = valloc((unsigned) *size)) == (char *) NULL) Error("CreateSharedRegion: failed in valloc", (long) 0); /* Now have to get a unique id ... try using time of day in centi-sec */ if ( (status = gettimeofday(&tp, &tzp)) != 0) Error("CreateSharedRegion: error from gettimeofday", (long) status); *id = (tp.tv_sec + 10000*tp.tv_usec) & 0xffffff; /* Now make the region */ if ( (status = create_shared_region(*id, temp, *size, 0)) != 0) Error("CreateSharedRegion: error from create_shared_region", (long) status); return temp; } long DetachSharedRegion( id, size, addr) long id, size; char *addr; { return detach_shared_region( id, addr, size); } long DeleteSharedRegion(id) long id; { return delete_shared_region(id); } char *AttachSharedRegion(id, size) long id, size; { char *temp; int status; if (size != (((size + 4095) / 4096) * 4096)) Error("AttachSharedRegion: input size is not multiple of 4096", (long) size); if ( (temp = valloc((unsigned) size)) == (char *) NULL) Error("AttachSharedRegion: failed in valloc", (long) 0); /* Now try to attach */ if ( (status = attach_shared_region(id, temp, size)) != 0) Error("AttachSharedRegion: error from attach_shared_region", (long) status); return temp; } #endif #if defined(SEQUENT) || defined(ENCORE) /* @**!ing SEQUENT and CRAY no elif */ #include #ifdef SEQUENT #define SHMALLOC shmalloc #define SHFREE shfree #endif #ifdef ENCORE #define SHMALLOC share_malloc #define SHFREE share_free #endif extern char *SHMALLOC(); extern int SHFREE(); #define MAX_ADDR 20 static int next_id = 0; /* Keep track of id */ static char *shaddr[MAX_ADDR]; /* Keep track of addresses */ char *CreateSharedRegion(id, size) long *size, *id; { char *temp; if (next_id >= MAX_ADDR) Error("CreateSharedRegion: too many shared regions", (long) next_id); if ( (temp = SHMALLOC((unsigned) *size)) == (char *) NULL) Error("CreateSharedRegion: failed in SHMALLOC", (long) *size); *id = next_id++; shaddr[*id] = temp; return temp; } /*ARGSUSED*/ long DetachSharedRegion( id, size, addr) long id, size; char *addr; { /* This needs improving to make more robust */ return SHFREE(addr); } long DeleteSharedRegion(id) long id; { /* This needs improving to make more robust */ return SHFREE(shaddr[id]); } /*ARGSUSED*/ char *AttachSharedRegion(id, size) long id, size; { Error("AttachSharedRegion: cannot do this on SEQUENT or BALANCE", (long) -1); } #endif /* Bizarre sequent has sysv semaphores but proprietary shmem */ /* Encore has sysv shmem but is limited to total of 16384bytes! */ #if defined(SYSV) && !defined(SEQUENT) && !defined(ENCORE) #include #include #include #include char *CreateSharedRegion(id, size) long *size, *id; { char *temp; /* Create the region */ if ( (*id = shmget(IPC_PRIVATE, (int) *size, (int) (IPC_CREAT | 00600))) < 0 ) Error("CreateSharedRegion: failed to create shared region", (long) *id); /* Attach to the region */ if ( (long) (temp = shmat((int) *id, (char *) NULL, 0)) == -1L) Error("CreateSharedRegion: failed to attach to shared region", (long) 0); return temp; } /*ARGSUSED*/ long DetachSharedRegion( id, size, addr) long id, size; char *addr; { return shmdt(addr); } long DeleteSharedRegion(id) long id; { return shmctl((int) id, IPC_RMID, (struct shmid_ds *) NULL); } /*ARGSUSED*/ char *AttachSharedRegion(id, size) long id, size; { char *temp; if ( (long) (temp = shmat((int) id, (char *) NULL, 0)) == -1L) Error("AttachSharedRegion: failed to attach to shared region", (long) 0); return temp; } #endif #if (defined(CONVEX) || defined(APOLLO)) && !defined(HPUX) #include #include #include #include #include extern char *strdup(); extern char *mktemp(); #define MAX_ID 20 static struct id_list_struct { char *addr; /* pointer to shmem region */ unsigned size; /* size of region */ char *filename; /* associated file name */ int fd; /* file descriptor */ int status; /* = 1 if in use */ } id_list[MAX_ID]; static int next_id = 0; static char template[] = "/tmp/SHMEM.XXXXXX"; char *CreateSharedRegion(id, size) long *size, *id; { char *temp; if (next_id == MAX_ID) Error("CreateSharedRegion: MAX_ID exceeded ", MAX_ID); *id = next_id; #ifdef APOLLO id_list[*id].fd = -1; #else if ( (temp = strdup(template)) == (char *) NULL) Error("CreateSharedRegion: failed to get space for filename", 0); /* Generate scratch file to identify region ... need to know this name to attach to the region so need to establish some policy before AttachtoSharedRegion can work */ id_list[*id].filename = mktemp(temp); if ( (id_list[*id].fd = open(id_list[*id].filename, O_RDWR|O_CREAT, 0666)) < 0) Error("CreateSharedRegion: failed to open temporary file",0); #endif id_list[*id].addr = mmap((caddr_t) 0, (unsigned *) size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, id_list[*id].fd, 0); #ifdef APOLLO if (id_list[*id].addr == (char *) 0) Error("CreateSharedRegion: mmap failed",-1); #else if (id_list[*id].addr == (char *) -1) Error("CreateSharedRegion: mmap failed",-1); #endif id_list[*id].size = *size; id_list[*id].status = 1; next_id++; return id_list[*id].addr; } /*ARGSUSED*/ long DetachSharedRegion( id, size, addr) long id, size; char *addr; { if ( (id < 0) || (id > next_id)) return (long) -1; if (id_list[id].status != 1) return (long) -1; id_list[id].status = 0; return (long) munmap(id_list[id].addr, 0); } long DeleteSharedRegion(id) long id; { if ( (id < 0) || (id > next_id) ) return (long) -1; if (id_list[id].status != 1) return (long) -1; (void) DetachSharedRegion(id, 0, (char *) 0); if (id_list[id].fd >= 0) { (void) close(id_list[id].fd); (void) unlink(id_list[id].filename); } return (long) 0; } /*ARGSUSED*/ char *AttachSharedRegion(id, size) long id, size; { Error("AttachSharedRegion: need mods for this to work on CONVEX", (long) -1); } long DeleteSharedAll() { long id; long status = 0; for (id=0; id #include #ifdef SEQUENT #include #else #include #endif #include "sndrcvP.h" #include "defglobals.h" #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT)|| defined(AIX) \ || defined(CONVEX) || defined(ARDENT) || defined(ULTRIX) \ || defined(NEXT) extern char *strdup(); extern char *strtok(); #endif extern void Error(); void InitClusInfoNotParallel() { int SR_n_clus = 0; SR_clus_info[SR_n_clus].user = "?"; SR_clus_info[SR_n_clus].hostname = "?"; SR_clus_info[SR_n_clus].nslave = 1; SR_clus_info[SR_n_clus].image = "?"; SR_clus_info[SR_n_clus].workdir = "?"; SR_clus_info[SR_n_clus].masterid = 0; } void InitClusInfo(procgrp, masterhostname) char *procgrp, *masterhostname; /* Initialize the SR_clus_info structure, SR_n_clus and SR_n_proc by parsing the PROCGRP info. The procgrp file consists of white space separated records. user host nslave image workdir Masterhostname is the name of the host running the parallel command. This routine could do with some more error checking. */ { char *user, *host, *nslave, *image, *workdir; char *white = " \t\n"; char *tmp = strdup(procgrp); int i; SR_n_clus = 0; SR_n_proc = 0; if (!tmp) Error("InitClusInfo: no memory", 0L); while (1) { user = strtok(tmp, white); tmp = (char *) NULL; if (user == (char *) NULL) break; host = strtok(tmp, white); nslave = strtok(tmp, white); image = strtok(tmp, white); workdir = strtok(tmp, white); if (workdir == (char *) NULL) Error("InitClusInfo: error parsing PROCGRP, line=",SR_n_clus+1); if (SR_n_clus == MAX_CLUSTER) Error("InitClusInfo: maximum no. of clusters exceeded", (long) MAX_CLUSTER); if (atoi(nslave) > MAX_SLAVE) Error("InitClusInfo: maximum no. of slaves per cluster exceeded", (long) MAX_SLAVE); SR_clus_info[SR_n_clus].user = strdup(user); SR_clus_info[SR_n_clus].hostname = strdup(host); SR_clus_info[SR_n_clus].nslave = atoi(nslave); SR_clus_info[SR_n_clus].image = strdup(image); SR_clus_info[SR_n_clus].workdir = strdup(workdir); SR_clus_info[SR_n_clus].masterid = SR_n_proc; if (!SR_clus_info[SR_n_clus].user || !SR_clus_info[SR_n_clus].hostname || !SR_clus_info[SR_n_clus].image || !SR_clus_info[SR_n_clus].workdir) Error("InitClusInfo: no memory 2 ", 0L); for (i=0; i= 0) { continue execution } else { wait in queue for the semaphore } decrement value void SemWait(long sem_set_id, long sem_num) 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern void Error(); #include #include #include #include #include #define MAX_SEMA 32 static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; static unsigned shmem_size; #if defined(NAMED_SEMAPHORES_SUPPORTED) static sem_t *sem_arr; long SemSetCreate(long n_sem, long value) { int i; shmem_size = MAX_SEMA*sizeof(sem_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ filename = mktemp(template); if ( (fd = shm_open(filename, O_CREAT|O_RDWR, 0666)) < 0 ) Error("SemSetCreate: failed to open temporary shm file",0); sem_arr = (sem_t*) mmap((caddr_t)0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_HASSEMAPHORE|MAP_SHARED, fd, (off_t)0); if(!sem_arr)Error("SemSetCreate: failed to mmap",0); /* initialize locks and semaphore values */ for (i=0; i= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); if(sem_wait(sem_arr+sem_num)<0) Error("SemWait: failed",sem_num); } void SemPost(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); if(sem_post(sem_arr+sem_num)<0) Error("SemPost: failed",sem_num); } long SemValue(long sem_set_id, long sem_num) { Error("SemValue: not implemented", sem_num); return 1L; } #else typedef struct{ int state; int pad[15]; } lock_t; static lock_t *locks; static char template1[] = "/tmp/SEMA1.XXXXXX"; static char *filename1 = (char *) NULL; static sem_t *sem; static lock_t *locks; #include long SemSetCreate(long n_sem, long value) { int i; shmem_size = MAX_SEMA*sizeof(lock_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ locks = (lock_t*) mmap((caddr_t)0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, (off_t)0); if(locks == (lock_t*)-1)Error("SemSetCreate: failed to mmap",shmem_size); filename1 = mktemp(template1); sem = sem_open(filename1, O_CREAT|O_EXCL, 0666, 1); if(!sem)Error("SemSetCreate: failed to sem_open",0); /* initialize locks and semaphore values */ bzero(locks,shmem_size); return 1L; } long SemSetDestroyAll() { long status=0; status = munmap((char *) locks, shmem_size); if(status)status = -1; sem_unlink(filename1); return status; } double __tcgmsg_fred__=0.0; void Dummy() { int n = 200; /* This seems optimal */ while(n--) __tcgmsg_fred__++; } void SemWait(long sem_set_id, long sem_num) { int value = 0, count=0; if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); while (value<=0) { if(sem_wait(sem)<0)Error("SemWait: sem_op error",sem_num);; value = locks[sem_num].state; if (value>0) locks[sem_num].state--; if(sem_post(sem)<0)Error("SemWait: sem_op error",sem_num);; if (value<=0) Dummy(); count++; if(count%1000 == 999)usleep(1); } } void SemPost(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); if(sem_wait(sem)<0)Error("SemPost: sem_op error",sem_num);; locks[sem_num].state++; if(sem_post(sem)<0)Error("SemWait: sem_op error",sem_num);; } long SemValue(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemVal: invalid sem_num",sem_num); return (long)locks[sem_num].state; } #endif ga-5-4/armci/tcgmsg/ipcv4.0/pbeginf.c0000644000175000017500000000074512662210401015350 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #include "srftoc.h" #include "sndrcv.h" /** * Hewlett Packard Risc box and new SparcWorks F77 2.* compilers. * Have to construct the argument list by calling FORTRAN. */ void PBEGINF_() { } /** * Alternative entry for those senstive to FORTRAN making reference * to 7 character external names */ void PBGINF_() { PBEGINF_(); } ga-5-4/armci/tcgmsg/ipcv4.0/shmem_cray.c0000644000175000017500000000236112662210401016061 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SHMALLOC # define SHMALLOC shmalloc # define SHFREE shfree #endif #if HAVE_SHARE_MALLOC # define SHMALLOC share_malloc # define SHFREE share_free #endif extern char *SHMALLOC(); extern int SHFREE(); #define MAX_ADDR 20 static int next_id = 0; /* Keep track of id */ static char *shaddr[MAX_ADDR]; /* Keep track of addresses */ char *CreateSharedRegion(long *id, long *size) { char *temp; if (next_id >= MAX_ADDR) { Error("CreateSharedRegion: too many shared regions", (long) next_id); } if ( (temp = SHMALLOC((unsigned) *size)) == (char *) NULL) { Error("CreateSharedRegion: failed in SHMALLOC", (long) *size); } *id = next_id++; shaddr[*id] = temp; return temp; } long DetachSharedRegion(long id, long size, char *addr) { /* This needs improving to make more robust */ return SHFREE(addr); } long DeleteSharedRegion(long id) { /* This needs improving to make more robust */ return SHFREE(shaddr[id]); } char *AttachSharedRegion(long id, long size) { Error("AttachSharedRegion: cannot do this on SEQUENT or BALANCE", (long) -1); } ga-5-4/armci/tcgmsg/ipcv4.0/checkbyte.c0000644000175000017500000000075512662210401015700 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/checkbyte.c,v 1.4 1995-02-24 02:17:11 d3h325 Exp $ */ unsigned char CheckByte(c, n) unsigned char *c; long n; { /* unsigned char sum = (char) 0; while (n-- > 0) sum = sum ^ *c++; return sum; */ unsigned int sum = 0; unsigned int mask = 0xff; while (n-- > 0) sum += (int) *c++; sum = (sum + (sum>>8) + (sum>>16) + (sum>>24)) & mask; return (unsigned char) sum; } ga-5-4/armci/tcgmsg/ipcv4.0/sockets.c0000644000175000017500000003151012662210401015403 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/sockets.c,v 1.12 2005-04-08 16:55:04 vinodtipparaju Exp $ */ #include #include #include #ifdef SEQUENT #include #else #include #endif #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || \ defined(SEQUENT) || defined(AIX) || \ defined(NEXT) || defined(LINUX) #include #endif #ifdef AIX #include #endif #ifdef CONVEX #include #else #include #endif #include #include #include #include #include #include #ifdef CRAY #include #include #else extern int errno; #endif #include "sndrcv.h" #include "sndrcvP.h" long WaitForSockets(int nsock, int *socks, int *list) /* Wait until one or more sockets are ready or have an exception. Returns the number of ready sockets and sets corresponding numbers in list. I.e., list[i]=k meaning sock[k] is ready. */ { fd_set ready; int i; long nready; int sockmax = 0; again: FD_ZERO(&ready); for (i=0; i sockmax) sockmax = socks[i]; } nready = (long) select(sockmax+1, &ready, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL); if (nready < 0) { if (errno == EINTR) { /*fprintf(stderr,"wait in sockets got interrupted\n");*/ goto again; } else { Error("WaitForSockets: error from select", 0L); } } else { int n = 0; for (i=0; ip_proto; status = setsockopt(sock, level, TCP_NODELAY, &value, sizeof(int)); if (status != 0) Error("TcpNoDelay: setsockopt failed", (long) status); } void ShutdownAll() /* close all sockets discarding any pending data in either direction. */ { int i; for (i=0; i= 0) { (void) shutdown(SR_proc_info[i].sock, 2); (void) close(SR_proc_info[i].sock); } } int ReadFromSocket(sock, buf, lenbuf) int sock; char *buf; long lenbuf; /* Read from the socket until we get all we want. */ { int nread, status; status = lenbuf; while (lenbuf > 0) { again: if ( (nread = recv(sock, buf, (int) lenbuf, 0)) < 0) { if (errno == EINTR) goto again; else { (void) fprintf(stderr,"sock=%d, pid=%ld, nread=%d, len=%ld\n", sock, NODEID_(), nread, lenbuf); (void) fflush(stderr); status = -1; break; } } buf += nread; lenbuf -= nread; } return status; } int WriteToSocket(sock, buf, lenbuf) int sock; char *buf; long lenbuf; /* Write to the socket in packets of PACKET_SIZE bytes */ { int status = lenbuf; int nsent, len; while (lenbuf > 0) { len = (lenbuf > PACKET_SIZE) ? PACKET_SIZE : lenbuf; nsent = send(sock, buf, (int) len, 0); if (nsent < 0) { /* This is bad news */ (void) fprintf(stderr,"sock=%d, pid=%ld, nsent=%d, len=%ld\n", sock, NODEID_(), nsent, lenbuf); (void) fflush(stderr); status = -1; break; } buf += nsent; lenbuf -= nsent; } return status; } void CreateSocketAndBind(sock, port) int *sock; int *port; /* Create a socket, bind it to a wildcard internet name and return the info so that its port number may be advertised */ { unsigned int length; struct sockaddr_in server; int size = SR_SOCK_BUF_SIZE; int on = 1; #if defined(LINUX) && defined(__powerpc__) int dupsock; #endif length = sizeof (struct sockaddr_in); /* Create socket */ if ( (*sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) Error("CreateSocketAndBind: socket creation failed", (long) *sock); #if defined(LINUX) && defined(__powerpc__) if(*sock==0) dupsock = dup(*sock); *sock = dupsock; #endif if(setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) == -1) Error("CreateSocketAndBind: error from setsockopt", (long) -1); /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(*sock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof size)) Error("CreateSocketAndBind: error setting SO_RCVBUF", (long) size); if(setsockopt(*sock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof size)) Error("CreateSocketAndBind: error setting SO_SNDBUF", (long) size); #ifndef ARDENT TcpNoDelay(*sock); #endif /* Name socket with wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = 0; if (bind(*sock, (struct sockaddr *) &server, length) < 0) Error("CreateSocketAndBind: bind failed", (long) 0); /* Find out port number etc. */ if (getsockname(*sock, (struct sockaddr *) &server, &length) < 0) Error("CreateSocketAndBind: getsockname failed", (long) 0); *port = ntohs(server.sin_port); } void ListenOnSock(sock) int sock; /* Listen for a connection on the specified socket which was created with CreateSocketAndBind */ { againlist: if (listen(sock, 1) < 0) { if (errno == EINTR) goto againlist; else Error("ListenAndAccept: listen failed", (long) 0); } if (DEBUG_) { (void) printf("process %ld out of listen on socket %d\n",NODEID_(),sock); (void) fflush(stdout); } } int AcceptConnection(sock) int sock; /* Accept a connection on the specified socket which was created with CreateSocketAndBind and listen has been called. */ { fd_set ready; struct timeval timelimit; int msgsock, nready; int size = SR_SOCK_BUF_SIZE; /* Use select to wait for someone to try and establish a connection so that we can add a short timeout to avoid hangs */ againsel: FD_ZERO(&ready); FD_SET(sock, &ready); timelimit.tv_sec = TIMEOUT_ACCEPT; timelimit.tv_usec = 0; nready = select(sock+1, &ready, (fd_set *) NULL, (fd_set *) NULL, &timelimit); if ( (nready <= 0) && (errno == EINTR) ) goto againsel; else if (nready < 0) Error("ListenAndAccept: error from select", (long) nready); else if (nready == 0) Error("ListenAndAccept: timeout waiting for connection", (long) nready); if (!FD_ISSET(sock, &ready)) Error("ListenAndAccept: out of select but not ready!", (long) nready); againacc: msgsock = accept(sock, (struct sockaddr *) NULL, (unsigned int *) NULL); if (msgsock == -1) { if (errno == EINTR) goto againacc; else Error("ListenAndAccept: accept failed", (long) msgsock); } if (DEBUG_) { (void) printf("process %ld out of accept on socket %d\n", NODEID_(),msgsock); (void) fflush(stdout); } /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(msgsock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof size)) Error("ListenAndAccept: error setting SO_RCVBUF", (long) size); if(setsockopt(msgsock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof size)) Error("ListenAndAccept: error setting SO_SNDBUF", (long) size); #ifndef ARDENT TcpNoDelay(msgsock); #endif (void) close(sock); /* will not be needing this again */ return msgsock; } int ListenAndAccept(sock) int sock; /* Listen and accept a connection on the specified socket which was created with CreateSocketAndBind */ { fd_set ready; struct timeval timelimit; int msgsock, nready; int size = SR_SOCK_BUF_SIZE; againlist: if (listen(sock, 1) < 0) { if (errno == EINTR) goto againlist; else Error("ListenAndAccept: listen failed", (long) 0); } if (DEBUG_) { (void) printf("process %ld out of listen on socket %d\n",NODEID_(),sock); (void) fflush(stdout); } /* Use select to wait for someone to try and establish a connection so that we can add a short timeout to avoid hangs */ againsel: FD_ZERO(&ready); FD_SET(sock, &ready); timelimit.tv_sec = TIMEOUT_ACCEPT; timelimit.tv_usec = 0; nready = select(sock+1, &ready, (fd_set *) NULL, (fd_set *) NULL, &timelimit); if ( (nready <= 0) && (errno == EINTR) ) goto againsel; else if (nready < 0) Error("ListenAndAccept: error from select", (long) nready); else if (nready == 0) Error("ListenAndAccept: timeout waiting for connection", (long) nready); if (!FD_ISSET(sock, &ready)) Error("ListenAndAccept: out of select but not ready!", (long) nready); againacc: msgsock = accept(sock, (struct sockaddr *) NULL, (unsigned int *) NULL); if (msgsock == -1) { if (errno == EINTR) goto againacc; else Error("ListenAndAccept: accept failed", (long) msgsock); } if (DEBUG_) { (void) printf("process %ld out of accept on socket %d\n", NODEID_(),msgsock); (void) fflush(stdout); } /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(msgsock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof size)) Error("ListenAndAccept: error setting SO_RCVBUF", (long) size); if(setsockopt(msgsock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof size)) Error("ListenAndAccept: error setting SO_SNDBUF", (long) size); #ifndef ARDENT TcpNoDelay(msgsock); #endif (void) close(sock); /* will not be needing this again */ return msgsock; } int CreateSocketAndConnect(hostname, cport) char *hostname; char *cport; /* Return the file descriptor of the socket which connects me to the remote process on hostname at port in string cport hostname = hostname of the remote process cport = asci string containing port number of remote socket */ { int sock, status; struct sockaddr_in server; struct hostent *hp; int on = 1; int size = SR_SOCK_BUF_SIZE; #ifndef SGI struct hostent *gethostbyname(); #endif #if defined(LINUX) && defined(__powerpc__) int dupsock; #endif /* Create socket */ if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { (void) fprintf(stderr,"trying to connect to host=%s, port=%s\n", hostname, cport); Error("CreateSocketAndConnect: socket failed", (long) sock); } #if defined(LINUX) && defined(__powerpc__) if(sock==0) dupsock = dup(sock); sock = dupsock; #endif if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) == -1) Error("CreateSocketAndConnect: error setting REUSEADDR", (long) -1); /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof size)) Error("CreateSocketAndConnect: error setting SO_RCVBUF", (long) size); if(setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof size)) Error("CreateSocketAndConnect: error setting SO_SNDBUF", (long) size); #ifndef ARDENT TcpNoDelay(sock); #endif /* Connect socket */ server.sin_family = AF_INET; hp = gethostbyname(hostname); if (hp == 0) { (void) fprintf(stderr,"trying to connect to host=%s, port=%s\n", hostname, cport); Error("CreateSocketAndConnect: gethostbyname failed", (long) 0); } bcopy((char *) hp->h_addr, (char *) &server.sin_addr, hp->h_length); server.sin_port = htons((ushort) atoi(cport)); againcon: if ((status = connect(sock, (struct sockaddr *) &server, sizeof server)) < 0) { if (errno == EINTR) goto againcon; else { (void) fprintf(stderr,"trying to connect to host=%s, port=%s\n", hostname, cport); Error("CreateSocketAndConnect: connect failed", (long) status); } } return sock; } ga-5-4/armci/tcgmsg/ipcv4.0/niceftn.c0000644000175000017500000000047112662210401015360 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "srftoc.h" #ifndef IPSC #include #endif int NICEFTN_(ival) int *ival; /* Wrapper around nice for FORTRAN users courtesy of Rick Kendall ... C has the system interface */ { #ifndef IPSC return nice(*ival); #else return 0; #endif } ga-5-4/armci/tcgmsg/ipcv4.0/sema.c0000644000175000017500000005606712662210401014673 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/sema.c,v 1.17 2003-05-08 15:44:43 edo Exp $ */ /* These routines simplify the interface to semaphores for use in mutual exclusion and queuing. Hopefully I can also make this portable. An external routine Error is assumed which is called upon an error and tidies up by calling SemSetDestroyAll. In most cases errors cause an internal hard failure (by calling Error). 1) make an array of n_sem semaphores, returning the id associated with the entire set. All the semaphore values are initialized to value which should be a positve integer (queuing) or 0 (synchronization). The semaphores in the set are indexed from 0 to n_sem-1. long SemSetCreate(long n_sem, long value) 2) Decrement and test the value associated with the semaphore specified by (sem_set_id, sem_num). In effect this: if (value >= 0) { continue execution } else { wait in queue for the semaphore } decrement value void SemWait(long sem_set_id, long sem_num) 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern void Error(); #if defined(SYSV) && !defined SGIUS && !defined(SPPLOCKS) && !defined(MACX) /******************************************************************** Most system V compatible machines ********************************************************************/ /* The value used for our semaphore is equal to the value of the System V semaphore (which is always positive) minus the no. of processes in the queue. That is because our interface was modelled after that of Alliant whose semaphore can take on negative values. */ #include #include #include #if !HAVE_UNION_SEMUN union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif /* this global structure maintains a list of allocated semaphore sets which is used for SemSetDestroyAll */ #define MAX_SEM_SETS 20 static int sem_set_id_list[MAX_SEM_SETS]; static int num_sem_set = 0; #if defined(SGITFP) || defined(SGI64) || defined(KSR) || defined(SOLARIS) || defined (AIX) || defined(LINUX64) # define MAX_N_SEM 512 #else # define MAX_N_SEM 40 #endif void InitSemSetList() /* Initialise sem_set_id_list */ { int i; for (i=0; i= MAX_N_SEM) ) Error("SemSetCreate: n_sem has invalid value", (long) n_sem); if (num_sem_set == 0) InitSemSetList(); else if (num_sem_set >= MAX_SEM_SETS) Error("SemSetCreate: Exceeded man no. of semaphore sets", (long) num_sem_set); /* Actually make the semaphore set */ if ( (semid = semget(IPC_PRIVATE, (int) n_sem, IPC_CREAT | 00600)) < 0) Error("SemSetCreate: failed to create semaphore set", (long) semid); /* Put the semid in the first empty slot in sem_set_id_list */ for (i=0; i < MAX_SEM_SETS; i++) { if (sem_set_id_list[i] == -1) { sem_set_id_list[i] = semid; break; } } if (i == MAX_SEM_SETS) Error("SemSetCreate: internal error puting semid in list", (long) i); num_sem_set++; /* Now set the value of all the semaphores */ arg.val = (int) value; for (i=0; i #include extern int errno; /* On the alliant semaphores are handed out one at a time rather than in sets, so have to maintain sets manually */ #define MAX_SEM_SETS 20 #define MAX_N_SEM 128 static struct sem_set_list_struct { int id[MAX_N_SEM]; /* alliant semaphore id */ int n_sem; /* no. of semaphores in set */ } sem_set_list[MAX_SEM_SETS]; static int num_sem_set = 0; void InitSemSetList() /* Initialise sem_set_list */ { int i, j; for (i=0; i= MAX_N_SEM) ) Error("SemSetCreate: n_sem has invalid value", (long) n_sem); if (num_sem_set == 0) InitSemSetList(); else if (num_sem_set >= MAX_SEM_SETS) Error("SemSetCreate: Exceeded man no. of semaphore sets", (long) num_sem_set); /* Find first empty slot in sem_set_list */ for (i=0; i < MAX_SEM_SETS; i++) if (sem_set_list[i].n_sem == 0) break; if (i == MAX_SEM_SETS) Error("SemSetCreate: internal error puting semid in list", (long) i); /* Actually make the semaphore set */ for (j=0; j #include #include #include #include #define MAX_SEM_SETS 20 #define MAX_N_SEM 100 /* On the convex a semaphore is a structure but on the apollo it is an array which does not need dereferencing. Use ADDR to generate the address of a semaphore */ #ifdef APOLLO #define ADDR(x) x #else #define ADDR(x) &x #endif extern char *mktemp(); struct sem_set_struct { int n_sem; /* no. of semaphores in set */ semaphore lock[MAX_N_SEM]; /* locks for changing value */ semaphore wait[MAX_N_SEM]; /* locks for queing */ int value[MAX_N_SEM]; /* values */ }; static int num_sem_set = 0; static struct sem_set_struct *sem_sets; static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; void InitSemSets() /* Initialise sem_sets and allocate associated shmem region */ { int i, j; unsigned size = sizeof(struct sem_set_struct) * MAX_SEM_SETS; #ifndef APOLLO /* Generate scratch file to identify region ... mustn't do this on the APOLLO */ filename = mktemp(template); if ( (fd = open(filename, O_RDWR|O_CREAT, 0666)) < 0 ) Error("InitSemSets: failed to open temporary file",0); #endif sem_sets = (struct sem_set_struct *) mmap((caddr_t) 0, &size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_HASSEMAPHORE|MAP_SHARED, fd, 0); #ifdef APOLLO if (sem_sets == (struct sem_set_struct *) 0) Error("InitSemSets: mmap failed", (long) -1); #else if (sem_sets == (struct sem_set_struct *) -1) Error("InitSemSets: mmap failed", (long) -1); #endif for (i=0; i= MAX_N_SEM) ) Error("SemSetCreate: n_sem has invalid value",n_sem); if (num_sem_set == 0) InitSemSets(); else if (num_sem_set >= MAX_SEM_SETS) Error("SemSetCreate: Exceeded man no. of semaphore sets", num_sem_set); /* Initialize the values */ for (i=0; i= num_sem_set) ) Error("SemWait: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemWait: invalid semaphore number in set",sem_num); while (1) { /* Get the lock around the whole semaphore */ (void) mset(ADDR(sem_sets[sem_set_id].lock[sem_num]), 1); /* If the value is positive fall thru, else wait */ if (sem_sets[sem_set_id].value[sem_num] > 0) break; else { (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); (void) mset(ADDR(sem_sets[sem_set_id].wait[sem_num]), 1); } } /* Are ready to go ... decrement the value and release lock */ sem_sets[sem_set_id].value[sem_num]--; (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); } void SemPost(sem_set_id, sem_num) long sem_set_id; long sem_num; { int i; if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) Error("SemPost: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemPost: invalid semaphore number in set",sem_num); /* Get the lock around the whole semaphore */ (void) mset(ADDR(sem_sets[sem_set_id].lock[sem_num]), 1); /* Read and increment the value. If is now zero wake up up the queue */ sem_sets[sem_set_id].value[sem_num]++; i = sem_sets[sem_set_id].value[sem_num]; (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); if (i >= 0) (void) mclear(ADDR(sem_sets[sem_set_id].wait[sem_num])); } long SemValue(sem_set_id, sem_num) long sem_set_id; long sem_num; { int i; if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) Error("SemValue: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemValue: invalid semaphore number in set",sem_num); /* There seems no point in getting the lock just to read the value and it seems more useful not to (e.g. debugging) */ i = sem_sets[sem_set_id].value[sem_num]; return (long) (i-1); } long SemSetDestroy(sem_set_id) long sem_set_id; { if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) return -1; sem_sets[sem_set_id].n_sem = 0; return (long) 0; } long SemSetDestroyAll() { long i, status=0; for (i=0; i= 0) { (void) close(fd); fd = -1; (void) unlink(filename); } status += munmap((char *) sem_sets, 0); if (status) status = -1; return status; } #endif #if defined(SGIUS) || defined(SPPLOCKS) /* SGI fast US library semaphores ... aren't any faster than system V semaphores ... implement using spin locks */ #include #include #define MAX_SEMA 512 static volatile int *val; #define NAME_LEN 200 #ifdef SGI # include static usptr_t *arena_ptr; static ulock_t *locks[MAX_SEMA]; static char arena_name[NAME_LEN]; # define EIGHT 8 # define LOCK ussetlock # define UNLOCK usunsetlock #define JUMP EIGHT #include "sndrcvP.h" extern char *getenv(const char *); long SemSetCreate(long n_sem, long value) { int i; char *tmp; if (!(tmp = getenv("ARENA_DIR"))) tmp = "/tmp"; sprintf(arena_name,"%s/tcgmsg.arena.%ld",tmp, (long)getpid()); #ifdef PRIVATE_ARENA (void) usconfig(CONF_ARENATYPE, US_SHAREDONLY); #endif (void) usconfig(CONF_INITUSERS, (unsigned int)SR_clus_info[SR_clus_id].nslave ); #ifdef SGI (void) usconfig(CONF_INITSIZE, 1024*1024); #endif if (!(arena_ptr = usinit(arena_name))) Error("SemSetCreate: failed to create arena", 0L); /* Magic factors of EIGHT here to ensure that values are in different cache lines to avoid aliasing -- good on SGI and Convex */ if (!(val = (int *) usmalloc(EIGHT*MAX_SEMA*sizeof(int), arena_ptr))) Error("SemSetCreate: failed to get shmem", (long) (MAX_SEMA*sizeof(int))); for (i=0; i #include #include #include #include #define SIXTEEN 16 #define JUMP SIXTEEN typedef struct{ int state; int pad[15]; } lock_t; static lock_t *locks; # define LOCK(x) set_lock(&x.state) # define UNLOCK(x) unset_lock(&x.state) # define INILOCK(x) init_lock(&x.state) void init_lock(int * volatile ip) { *ip = 1; } void set_lock(int * volatile ip) { while (1) { while (!(*ip)); if (__ldcws32(ip)) break; } } void unset_lock(int *ip) { *ip = 1; asm("sync"); } static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; static unsigned shmem_size; long SemSetCreate(long n_sem, long value) { int i; shmem_size = SIXTEEN*MAX_SEMA*sizeof(int)+MAX_SEMA*sizeof(lock_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ filename = mktemp(template); if ( (fd = open(filename, O_RDWR|O_CREAT, 0666)) < 0 ) Error("SemSetCreate: failed to open temporary file",0); val = (int *) mmap((caddr_t) 0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0); locks = (lock_t*)( val + SIXTEEN*MAX_SEMA); /* initialize locks and semaphore values */ for (i=0; i= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); while (value<=0) { LOCK(locks[sem_num]); value = val[off]; if (value>0) val[off]--; UNLOCK(locks[sem_num]); if (value<=0) Dummy(); } } void SemPost(long sem_set_id, long sem_num) { int off = sem_num*JUMP; if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); LOCK(locks[sem_num]); val[off]++; UNLOCK(locks[sem_num]); } long SemValue(long sem_set_id, long sem_num) { Error("SemValue: not implemented", sem_num); return 1; } long SemSetDestroy(long sem_set_id) { return(SemSetDestroyAll()); } #endif #if defined(MACX) #include #include #include #include #include #define MAX_SEMA 32 static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; static unsigned shmem_size; #if defined(NAMED_SEMAPHORES_SUPPORTED) static sem_t *sem_arr; long SemSetCreate(long n_sem, long value) { int i; shmem_size = MAX_SEMA*sizeof(sem_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ filename = mktemp(template); if ( (fd = shm_open(filename, O_CREAT|O_RDWR, 0666)) < 0 ) Error("SemSetCreate: failed to open temporary shm file",0); sem_arr = (sem_t*) mmap((caddr_t)0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_HASSEMAPHORE|MAP_SHARED, fd, (off_t)0); if(!sem_arr)Error("SemSetCreate: failed to mmap",0); /* initialize locks and semaphore values */ for (i=0; i= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); if(sem_wait(sem_arr+sem_num)<0) Error("SemWait: failed",sem_num); } void SemPost(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); if(sem_post(sem_arr+sem_num)<0) Error("SemPost: failed",sem_num); } long SemValue(long sem_set_id, long sem_num) { Error("SemValue: not implemented", sem_num); return 1L; } #else typedef struct{ int state; int pad[15]; } lock_t; static lock_t *locks; static char template1[] = "/tmp/SEMA1.XXXXXX"; static char *filename1 = (char *) NULL; static sem_t *sem; static lock_t *locks; #include long SemSetCreate(long n_sem, long value) { int i; shmem_size = MAX_SEMA*sizeof(lock_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ locks = (lock_t*) mmap((caddr_t)0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, (off_t)0); if(locks == (lock_t*)-1)Error("SemSetCreate: failed to mmap",shmem_size); filename1 = mktemp(template1); sem = sem_open(filename1, O_CREAT|O_EXCL, 0666, 1); if(!sem)Error("SemSetCreate: failed to sem_open",0); /* initialize locks and semaphore values */ bzero(locks,shmem_size); return 1L; } long SemSetDestroyAll() { long status=0; status = munmap((char *) locks, shmem_size); if(status)status = -1; sem_unlink(filename1); return status; } double __tcgmsg_fred__=0.0; void Dummy() { int n = 200; /* This seems optimal */ while(n--) __tcgmsg_fred__++; } void SemWait(long sem_set_id, long sem_num) { int value = 0, count=0; if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); while (value<=0) { if(sem_wait(sem)<0)Error("SemWait: sem_op error",sem_num);; value = locks[sem_num].state; if (value>0) locks[sem_num].state--; if(sem_post(sem)<0)Error("SemWait: sem_op error",sem_num);; if (value<=0) Dummy(); count++; if(count%1000 == 999)usleep(1); } } void SemPost(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); if(sem_wait(sem)<0)Error("SemPost: sem_op error",sem_num);; locks[sem_num].state++; if(sem_post(sem)<0)Error("SemWait: sem_op error",sem_num);; } long SemValue(long sem_set_id, long sem_num) { if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemVal: invalid sem_num",sem_num); return (long)locks[sem_num].state; } #endif #endif ga-5-4/armci/tcgmsg/ipcv4.0/shmem_convex.c0000644000175000017500000000571412662210401016432 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include extern char *strdup(); extern char *mktemp(); #define MAX_ID 20 static struct id_list_struct { char *addr; /* pointer to shmem region */ unsigned size; /* size of region */ char *filename; /* associated file name */ int fd; /* file descriptor */ int status; /* = 1 if in use */ } id_list[MAX_ID]; static int next_id = 0; static char template[] = "/tmp/SHMEM.XXXXXX"; char *CreateSharedRegion(long *id, long *size) { char *temp; if (next_id == MAX_ID) { Error("CreateSharedRegion: MAX_ID exceeded ", MAX_ID); } *id = next_id; #ifdef APOLLO id_list[*id].fd = -1; #else if ( (temp = strdup(template)) == (char *) NULL) { Error("CreateSharedRegion: failed to get space for filename", 0); } /* Generate scratch file to identify region ... need to know this name to attach to the region so need to establish some policy before AttachtoSharedRegion can work */ id_list[*id].filename = mktemp(temp); if ( (id_list[*id].fd = open(id_list[*id].filename, O_RDWR|O_CREAT, 0666)) < 0) { Error("CreateSharedRegion: failed to open temporary file",0); } #endif id_list[*id].addr = mmap((caddr_t) 0, (unsigned *) size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, id_list[*id].fd, 0); #ifdef APOLLO if (id_list[*id].addr == (char *) 0) { Error("CreateSharedRegion: mmap failed",-1); } #else if (id_list[*id].addr == (char *) -1) { Error("CreateSharedRegion: mmap failed",-1); } #endif id_list[*id].size = *size; id_list[*id].status = 1; next_id++; return id_list[*id].addr; } long DetachSharedRegion(long id, long size, char *addr) { if ( (id < 0) || (id > next_id)) { return (long) -1; } if (id_list[id].status != 1) { return (long) -1; } id_list[id].status = 0; return (long) munmap(id_list[id].addr, 0); } long DeleteSharedRegion(long id) { if ( (id < 0) || (id > next_id) ) { return (long) -1; } if (id_list[id].status != 1) { return (long) -1; } (void) DetachSharedRegion(id, 0, (char *) 0); if (id_list[id].fd >= 0) { (void) close(id_list[id].fd); (void) unlink(id_list[id].filename); } return (long) 0; } char *AttachSharedRegion(long id, long size) { Error("AttachSharedRegion: need mods for this to work on CONVEX", (long) -1); } long DeleteSharedAll() { long id; long status = 0; for (id=0; id= 0) { continue execution } else { wait in queue for the semaphore } decrement value void SemWait(long sem_set_id, long sem_num) 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern void Error(); /* SGI fast US library semaphores ... aren't any faster than system V semaphores ... implement using spin locks */ #include #include #define MAX_SEMA 512 static volatile int *val; #define NAME_LEN 200 #ifdef SGI # include static usptr_t *arena_ptr; static ulock_t *locks[MAX_SEMA]; static char arena_name[NAME_LEN]; # define EIGHT 8 # define LOCK ussetlock # define UNLOCK usunsetlock #define JUMP EIGHT #include "sndrcvP.h" extern char *getenv(const char *); long SemSetCreate(long n_sem, long value) { int i; char *tmp; if (!(tmp = getenv("ARENA_DIR"))) tmp = "/tmp"; sprintf(arena_name,"%s/tcgmsg.arena.%ld",tmp, (long)getpid()); #ifdef PRIVATE_ARENA (void) usconfig(CONF_ARENATYPE, US_SHAREDONLY); #endif (void) usconfig(CONF_INITUSERS, (unsigned int)SR_clus_info[SR_clus_id].nslave ); #ifdef SGI (void) usconfig(CONF_INITSIZE, 1024*1024); #endif if (!(arena_ptr = usinit(arena_name))) Error("SemSetCreate: failed to create arena", 0L); /* Magic factors of EIGHT here to ensure that values are in different cache lines to avoid aliasing -- good on SGI and Convex */ if (!(val = (int *) usmalloc(EIGHT*MAX_SEMA*sizeof(int), arena_ptr))) Error("SemSetCreate: failed to get shmem", (long) (MAX_SEMA*sizeof(int))); for (i=0; i #include #include #include #include #define SIXTEEN 16 #define JUMP SIXTEEN typedef struct{ int state; int pad[15]; } lock_t; static lock_t *locks; # define LOCK(x) set_lock(&x.state) # define UNLOCK(x) unset_lock(&x.state) # define INILOCK(x) init_lock(&x.state) void init_lock(int * volatile ip) { *ip = 1; } void set_lock(int * volatile ip) { while (1) { while (!(*ip)); if (__ldcws32(ip)) break; } } void unset_lock(int *ip) { *ip = 1; asm("sync"); } static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; static unsigned shmem_size; long SemSetCreate(long n_sem, long value) { int i; shmem_size = SIXTEEN*MAX_SEMA*sizeof(int)+MAX_SEMA*sizeof(lock_t); if ( (n_sem <= 0) || (n_sem >= MAX_SEMA) ) Error("SemSetCreate: n_sem has invalid value",n_sem); /* allocate shared memory for locks and semaphore val */ filename = mktemp(template); if ( (fd = open(filename, O_RDWR|O_CREAT, 0666)) < 0 ) Error("SemSetCreate: failed to open temporary file",0); val = (int *) mmap((caddr_t) 0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0); locks = (lock_t*)( val + SIXTEEN*MAX_SEMA); /* initialize locks and semaphore values */ for (i=0; i= MAX_SEMA) ) Error("SemWait: invalid sem_num",sem_num); while (value<=0) { LOCK(locks[sem_num]); value = val[off]; if (value>0) val[off]--; UNLOCK(locks[sem_num]); if (value<=0) Dummy(); } } void SemPost(long sem_set_id, long sem_num) { int off = sem_num*JUMP; if ( (sem_num < 0) || (sem_num >= MAX_SEMA) ) Error("SemPost: invalid sem_num",sem_num); LOCK(locks[sem_num]); val[off]++; UNLOCK(locks[sem_num]); } long SemValue(long sem_set_id, long sem_num) { Error("SemValue: not implemented", sem_num); return 1; } long SemSetDestroy(long sem_set_id) { return(SemSetDestroyAll()); } ga-5-4/armci/tcgmsg/ipcv4.0/synch.c0000644000175000017500000000175012662210401015057 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/synch.c,v 1.5 2002-07-17 17:20:11 vinod Exp $ */ #include "sndrcv.h" #ifdef OLDSYNC void SYNCH_(type) long *type; /* Synchronize by forcing all process to exchange a zero length message of given type with process 0. */ { long me = NODEID_(); long nproc = NNODES_(); char *buf = ""; long zero = 0; long sync = 1; long from, lenmes, i; /* First everyone sends null message to zero */ if (me == 0) for (i=1; i #include "sndrcvP.h" #include "sndrcv.h" void STATS_() /* Print out communication statistics for this node */ { long me = NODEID_(); long nproc = NNODES_(); long i, msg_s, kb_s, s_s, r_s, msg_r, kb_r, s_r, r_r; (void) printf("Communication statistics for node %ld\n",me); (void) printf("-------------------------------------\n\n"); (void) printf("\ sending receiving\n\ ------------------------- -------------------------\n\ node #msgs. #kb secs kb/s #msgs. #kb secs kb/s\n\ ---- ------ ----- ---- ---- ------ ----- ---- ----\n"); for (i=0; i 0) ? kb_s / s_s : 0; msg_r = SR_proc_info[i].n_rcv; kb_r = SR_proc_info[i].nb_rcv/1024.0; s_r = SR_proc_info[i].t_rcv; r_r = (s_r > 0) ? kb_r / s_r : 0; (void) printf("%5ld%9ld%7ld%6ld%6ld%9ld%7ld%6ld%6ld\n", i, msg_s, kb_s, s_s, r_s, msg_r, kb_r, s_r, r_r); } } ga-5-4/armci/tcgmsg/ipcv4.0/defglobals.h0000644000175000017500000000272212662210401016042 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/defglobals.h,v 1.7 2000-10-12 22:43:45 d3g681 Exp $ */ #ifndef SNDRCVP #include "sndrcvP.h" #endif /* Actual definition of these globals ... need this once in any executable ... included by cluster.c */ /********************************************************* Global information and structures ... all begin with SR_ ********************************************************/ long SR_n_clus; /* No. of clusters */ long SR_n_proc; /* No. of processes excluding dummy master process */ int SR_socks[MAX_PROCESS]; int SR_socks_proc[MAX_PROCESS]; int SR_nsock; long SR_using_shmem; long SR_clus_id; /* Logical id of current cluster */ long SR_proc_id; /* Logical id of current process */ long SR_debug; /* flag for debug output */ long SR_parallel; /* True if job started with parallel */ long SR_exit_on_error; /* flag to exit on error */ long SR_error; /* flag indicating error has been called with SR_exit_on_error == FALSE */ long SR_numchild; /* no. of forked processes */ long SR_pids[MAX_SLAVE]; /* pids of forked processes */ /* This is used to store info from the PROCGRP file about each cluster of processes */ struct cluster_info_struct SR_clus_info[MAX_CLUSTER]; struct process_info_struct SR_proc_info[MAX_PROCESS]; ga-5-4/armci/tcgmsg/ipcv4.0/setdbg.c0000644000175000017500000000046212662210401015202 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/setdbg.c,v 1.4 1995-02-24 02:17:42 d3h325 Exp $ */ #include "sndrcv.h" #include "sndrcvP.h" void SETDBG_(value) long *value; /* set global debug flag for this process to value */ { SR_debug = *value; } ga-5-4/armci/tcgmsg/ipcv4.0/drand48.c0000644000175000017500000000054412662210401015177 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/drand48.c,v 1.4 1995-02-24 02:17:14 d3h325 Exp $ */ #include "srftoc.h" extern long random(); extern int srandom(); double DRAND48_() { return ( (double) random() ) * 4.6566128752458e-10; } void SRAND48_(seed) unsigned *seed; { (void) srandom(*seed); } ga-5-4/armci/tcgmsg/ipcv4.0/nodeid.c0000644000175000017500000000042612662210401015174 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/nodeid.c,v 1.4 1995-02-24 02:17:32 d3h325 Exp $ */ #include "sndrcv.h" #include "sndrcvP.h" long NODEID_() /* return logical node no. of current process */ { return SR_proc_id; } ga-5-4/armci/tcgmsg/ipcv4.0/signals.h0000644000175000017500000000031312662210401015372 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/signals.h,v 1.5 2004-04-01 02:04:57 manoj Exp $ */ extern void ZapChildren(); extern void TrapSigint(); extern void TrapSigchld(); extern void TrapSigterm(); ga-5-4/armci/tcgmsg/ipcv4.0/sndrcvP.h0000644000175000017500000001466512662210401015370 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/sndrcvP.h,v 1.17 2002-05-14 22:12:14 d3h325 Exp $ */ /* This include file contains definitions PRIVATE to the message passing routines and not for public use. These items should not be directly manipulated even in the message passing routines, except by the appropriate lowlevel routines. Actual instances of the extern data items are declared in defglobals.h which is included by cluster.c. */ #define SNDRCVP #ifndef MSGTYPES #include "msgtypesc.h" #endif /****************************** Defines and macro definitions *****************************/ #define MAX_CLUSTER 128 /* Maximum no. of clusters */ #define MAX_SLAVE 512 /* Maximum no. of slaves per cluster */ #define MAX_PROCESS 8192 /* Maximum no. of processes */ #define TYPE_SETUP 32768 /* used for setup communication */ #define TYPE_CHECK 32769 /* used for checking communication */ #define TYPE_END 32770 /* used for propagating end message */ #define TYPE_NXTVAL (MSGINT | 32771) /* Used in nxtval */ #define TYPE_CONNECT (MSGINT | 32772) /* Used in RemoteConnect */ #define TYPE_BEGIN 32773 /* Used in pbegin and parallel */ #define TYPE_CLOCK_SYNCH 32774; /* Used to synch clocks */ #ifdef BIG_MESSAGE_PROTECTION #define BIG_MESSAGE 41943040ul /* 40Mb max message only for safety check. Change as needed.*/ #else #define BIG_MESSAGE 2147483647ul /* 2GB */ #endif /* Shared memory allocated per process .. make even multiple of page size ... usually 4096 */ #if defined(SGI) || defined(SGITFP) #define SHMEM_BUF_SIZE 262144 #endif #ifdef KSR #define SHMEM_BUF_SIZE 524288 #endif #ifdef ALLIANT #define SHMEM_BUF_SIZE 524288 #endif #ifdef ENCORE #define SHMEM_BUF_SIZE 4096 #endif #ifdef SEQUENT #define SHMEM_BUF_SIZE 16384 #endif #ifdef HPUX #define SHMEM_BUF_SIZE 262144 #endif #ifdef MACX #define SHMEM_BUF_SIZE 65536 #endif #if defined(SOLARIS) #define SHMEM_BUF_SIZE 253952 #endif #ifdef KSR_NATIVE #include "ksr.h" #undef SHMEM_BUF_SIZE #define SHMEM_BUF_SIZE KSR_SHMEM_BUF_SIZE #endif #if !defined(SHMEM_BUF_SIZE) #define SHMEM_BUF_SIZE 131072 #endif #if defined(PARTIALSPIN) && !defined(NOSPIN) #define NOSPIN #endif #define SR_SOCK_BUF_SIZE 32768 /* Size that system buffers set to */ #define PACKET_SIZE SR_SOCK_BUF_SIZE /* Internal packet size over sockets */ #define TIMEOUT_ACCEPT 180 /* timeout for connection in secs */ #define TRUE 1 #define FALSE 0 #define DEBUG_ SR_debug /* substitute name of debug flag */ /********************************************************* Global information and structures ... all begin with SR_ ********************************************************/ extern long SR_n_clus; /* No. of clusters */ extern long SR_n_proc; /* No. of processes excluding dummy master process */ extern long SR_clus_id; /* Logical id of current cluster */ extern long SR_proc_id; /* Logical id of current process */ extern long SR_debug; /* flag for debug output */ extern long SR_parallel; /* True if job started with parallel */ extern long SR_exit_on_error; /* flag to exit on error */ extern long SR_error; /* flag indicating error has been called with SR_exit_on_error == FALSE */ extern long SR_numchild; /* no. of forked processes */ extern long SR_pids[MAX_SLAVE]; /* pids of forked processes */ extern int SR_socks[MAX_PROCESS]; /* Sockets used for each process */ extern int SR_socks_proc[MAX_PROCESS]; /* Process associated with a given socket */ extern int SR_nsock; /* No. of sockets in the list */ extern long SR_using_shmem; /* 1=if shmem is used for an process, 0 if all processes are connected to this one by sockets */ /* This is used to store info from the PROCGRP file about each cluster of processes */ struct cluster_info_struct { char *user; /* user name */ char *hostname; /* hostname */ long nslave; /* no. slave on this host */ char *image; /* path executable image */ char *workdir; /* work directory */ long masterid; /* process no. of cluster master */ int swtchport; /* Switch port for alliant hippi */ }; extern struct cluster_info_struct SR_clus_info[MAX_CLUSTER]; typedef struct message_header_struct { long nodefrom; /* originating node of message */ long nodeto; /* target node of message */ long type; /* user defined type */ long length; /* length of message in bytes */ long tag; /* No. of this message for id */ } MessageHeader; /* This is used to store all info about processes */ struct process_info_struct { long clusid; /* cluster no. for this process */ long slaveid; /* slave no. in cluster 0,1,...,nslave */ long local; /* boolean flag for local/remote */ int sock; /* socket to remote process */ char *shmem; /* shared memory region */ long shmem_size; /* shared memory region size */ long shmem_id; /* shared memory region id */ char *buffer; /* shared memory message buffer */ long buflen; /* shared memory message buffer size */ MessageHeader *header; /* shared memory message header */ long semid; /* semaphore group id */ long sem_pend; /* semaphore no. posted when data pending */ long sem_read; /* semaphore no. posted when data read */ long sem_written; /* semaphore no. posted when data written */ long n_rcv; /* No. of messages received */ double nb_rcv; /* No. of bytes received */ double t_rcv; /* Time spent receiving in sec */ long n_snd; /* No. of messages sent */ double nb_snd; /* No. of bytes sent */ double t_snd; /* Time spent sending in sec */ long peeked; /* True if have peeked at socket */ MessageHeader head_peek; /* Header that we peeked at */ long *buffer_full; /* Flag indicating full buffer */ }; extern struct process_info_struct SR_proc_info[MAX_PROCESS]; ga-5-4/armci/tcgmsg/ipcv4.0/xdrstuff.c0000644000175000017500000002345512662210401015606 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/xdrstuff.c,v 1.5 2004-04-01 02:04:57 manoj Exp $ */ #ifdef GOTXDR #include #include #ifdef CRAY extern bool_t xdr_char(); extern char *malloc(); #define NULL 0 #endif #ifdef SEQUENT static bool_t xdr_char(); /* below from sun distribution tape */ #define NULL 0 #endif #ifdef HPUX #define NULL 0 #endif #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX)|| \ defined(AIX) || defined(KSR) || defined(DECOSF) extern void *malloc(); #else extern char *malloc(); #endif #define XDR_BUF_LEN 4096 /* Size of XDR buffer in bytes */ #define XDR_DOUBLE_LEN 8 /* Size of XDR double in bytes */ #define XDR_LONG_LEN 4 /* Size of XDR long in bytes */ #define XDR_CHAR_LEN 4 /* Size of XDR char in bytes */ static char *xdrbuf_decode; static char *xdrbuf_encode; static XDR xdr_decode; static XDR xdr_encode; static int xdr_buf_allocated = 0; /* =1 if buffers allocated, 0 otherwise */ extern void Error(); void CreateXdrBuf() /* Call at start to allocate the XDR buffers */ { if (!xdr_buf_allocated) { /* Malloc the buffer space */ if ( (xdrbuf_decode = malloc((unsigned) XDR_BUF_LEN)) == (char *) NULL) Error("CreateXdrBuf: malloc of xdrbuf_decode failed", (long) XDR_BUF_LEN); if ( (xdrbuf_encode = malloc((unsigned) XDR_BUF_LEN)) == (char *) NULL) Error("CreateXdrBuf: malloc of xdrbuf_encode failed", (long) XDR_BUF_LEN); /* Associate the xdr memory streams with the buffers */ xdrmem_create(&xdr_decode, xdrbuf_decode, XDR_BUF_LEN, XDR_DECODE); xdrmem_create(&xdr_encode, xdrbuf_encode, XDR_BUF_LEN, XDR_ENCODE); xdr_buf_allocated = 1; } } void DestroyXdrBuf() /* Call to free the xdr buffers */ { if (xdr_buf_allocated) { /* Destroy the buffers and free the space */ xdr_destroy(&xdr_encode); xdr_destroy(&xdr_decode); (void) free(xdrbuf_encode); (void) free(xdrbuf_decode); xdr_buf_allocated = 0; } } int WriteXdrDouble(sock, x, n_double) int sock; double *x; long n_double; /* Write double x[n_double] to the socket translating to XDR representation. Returned is the number of bytes written to the socket. All errors are treated as fatal. */ { int nd_per_buf = (XDR_BUF_LEN-4)/XDR_DOUBLE_LEN; /* No. of XDR doubles per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_double > 0) { len = (n_double > nd_per_buf) ? nd_per_buf : n_double; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_encode, (u_int) 0)) Error("WriteXdrDouble: xdr_setpos failed", (long) -1); /* Translate the buffer and then write it to the socket */ if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(double), xdr_double)) Error("WriteXdrDouble: xdr_array failed", (long) -1); lenb = xdr_getpos(&xdr_encode); if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb) Error("WriteXdrDouble: WriteToSocket failed", (long) status); nb += lenb; n_double -= len; x += len; } return nb; } int ReadXdrDouble(sock, x, n_double) int sock; double *x; long n_double; /* Read double x[n_double] from the socket translating from XDR representation. Returned is the number of bytes read from the socket. All errors are treated as fatal. */ { int nd_per_buf = (XDR_BUF_LEN-4)/XDR_DOUBLE_LEN; /* No. of XDR doubles per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_double > 0) { len = (n_double > nd_per_buf) ? nd_per_buf : n_double; lenb = 4 + len * XDR_DOUBLE_LEN; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_decode, (u_int) 0)) Error("ReadXdrDouble: xdr_setpos failed", (long) -1); /* Read from the socket and then translate the buffer */ if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb) Error("ReadXdrDouble: ReadFromSocket failed", (long) status); if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(double), xdr_double)) Error("ReadXdrDouble: xdr_array failed", (long) -1); nb += lenb; n_double -= len; x += len; } return nb; } int WriteXdrLong(sock, x, n_long) int sock; long *x; long n_long; /* Write long x[n_long] to the socket translating to XDR representation. Returned is the number of bytes written to the socket. All errors are treated as fatal. */ { int nd_per_buf = (XDR_BUF_LEN-4)/XDR_LONG_LEN; /* No. of XDR longs per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_long > 0) { len = (n_long > nd_per_buf) ? nd_per_buf : n_long; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_encode, (u_int) 0)) Error("WriteXdrLong: xdr_setpos failed", (long) -1); /* Translate the buffer and then write it to the socket */ if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(long), xdr_long)) Error("WriteXdrLong: xdr_array failed", (long) -1); lenb = xdr_getpos(&xdr_encode); if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb) Error("WriteXdrLong: WriteToSocket failed", (long) status); nb += lenb; n_long -= len; x += len; } return nb; } int ReadXdrLong(sock, x, n_long) int sock; long *x; long n_long; /* Read long x[n_long] from the socket translating from XDR representation. Returned is the number of bytes read from the socket. All errors are treated as fatal. */ { int nd_per_buf = (XDR_BUF_LEN-4)/XDR_LONG_LEN; /* No. of XDR longs per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_long > 0) { len = (n_long > nd_per_buf) ? nd_per_buf : n_long; lenb = 4 + len * XDR_LONG_LEN; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_decode, (u_int) 0)) Error("ReadXdrLong: xdr_setpos failed", (long) -1); /* Read from the socket and then translate the buffer */ if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb) Error("ReadXdrLong: ReadFromSocket failed", (long) status); if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(long), xdr_long)) Error("ReadXdrLong: xdr_array failed", (long) -1); nb += lenb; n_long -= len; x += len; } return nb; } int WriteXdrChar(sock, x, n_char) int sock; char *x; long n_char; /* Write char x[n_char] to the socket translating to XDR representation. Returned is the number of bytes written to the socket. All errors are treated as fatal. */ { int nc_per_buf = (XDR_BUF_LEN-4)/XDR_CHAR_LEN; /* No. of XDR chars per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_char > 0) { len = (n_char > nc_per_buf) ? nc_per_buf : n_char; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_encode, (u_int) 0)) Error("WriteXdrChar: xdr_setpos failed", (long) -1); /* Translate the buffer and then write it to the socket */ if (!xdr_array(&xdr_encode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(char), xdr_char)) Error("WriteXdrChar: xdr_array failed", (long) -1); lenb = xdr_getpos(&xdr_encode); if ((status = WriteToSocket(sock, xdrbuf_encode, lenb)) != lenb) Error("WriteXdrChar: WriteToSocket failed", (long) status); nb += lenb; n_char -= len; x += len; } return nb; } int ReadXdrChar(sock, x, n_char) int sock; char *x; long n_char; /* Read char x[n_char] from the socket translating from XDR representation. Returned is the number of bytes read from the socket. All errors are treated as fatal. */ { int nc_per_buf = (XDR_BUF_LEN-4)/XDR_CHAR_LEN; /* No. of XDR chars per buf */ int status, nb=0; u_int len; long lenb; if (!xdr_buf_allocated) CreateXdrBuf(); /* Loop thru buffer loads */ while (n_char > 0) { len = (n_char > nc_per_buf) ? nc_per_buf : n_char; lenb = 4 + len * XDR_CHAR_LEN; /* Position the xdr buffer to the beginning */ if (!xdr_setpos(&xdr_decode, (u_int) 0)) Error("ReadXdrChar: xdr_setpos failed", (long) -1); /* Read from the socket and then translate the buffer */ if ((status = ReadFromSocket(sock, xdrbuf_decode, lenb)) != lenb) Error("ReadXdrChar: ReadFromSocket failed", (long) status); if (!xdr_array(&xdr_decode, (char **) &x, &len, (u_int) XDR_BUF_LEN, (u_int) sizeof(char), xdr_char)) Error("ReadXdrChar: xdr_array failed", (long) -1); nb += lenb; n_char -= len; x += len; } return nb; } #ifdef SEQUENT /* * XDR a char */ static bool_t xdr_char(xdrs, cp) XDR *xdrs; char *cp; { int i; i = (*cp); if (!xdr_int(xdrs, &i)) { return (FALSE); } *cp = i; return (TRUE); } #endif #else /* dummy function to make this source file legitimate */ #include #include void _dummy_ZefP_() {printf("XDR:Illegal function call\n"); exit(1);} #endif ga-5-4/armci/tcgmsg/ipcv4.0/evlog.c0000644000175000017500000002567412662210401015062 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/evlog.c,v 1.7 2003-09-18 18:27:43 edo Exp $ */ /* Event logging routine with key driven varargs interface */ #include #ifdef MACX /* jn: hack around bug in /usr/include/varargs.h */ #ifndef __PPC__ # define __PPC__ #endif #ifndef _CALL_SYSV # define _CALL_SYSV #endif #endif #include extern long nodeid_(); #ifdef SEQUENT #include #else #include #endif #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(CONVEX) || defined(ARDENT) || defined(ULTRIX) || \ defined(AIX) || defined(IPSC) || defined(NEXT) || defined(DECOSF) extern char *strdup(); #endif #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(KSR) || \ defined(DECOSF) extern void *malloc(); #else #include #endif #include "evlog.h" static double walltime(); /* If sprintf returns an integer instead of a character pointer then define the flag INTSPRINTF */ #if defined(SGI) || defined(AIX) || defined(IPSC) || defined(CRAY) || \ defined(HPUX) || defined(ALLIANT) || defined(CONVEX) || defined(NEXT) || \ defined(KSR) || defined(DECOSF) #define INTSPRINTF #endif void evlog(int farg_key, ...) /* The format of the argument list is as follows: evlog([(int) key, [values, ...]], ..., EVKEY_LAST_ARG) Arguments are read as keys with corresponding values. Recognised keys are defined in evlog.h and are described in detail below. Logging is enabled/disabled by calling evlog with one of EVKEY_ENABLE or EVKEY_DISABLE specified. Note that EVKEY_ENABLE must be the first key specified for it to be recognized and that all keys in the argument list after EVKEY_DISABLE are ignored. By default events are logged in the file events. This can be overridden with the key EVKEY_FILENAME, which takes the filename as its value. The model for logging events assumed by the post-analysis routines assumes that upon logging an event: a) no state chage occurs (EVKEY_EVENT). The event is just recorded. b) the process changes state by pushing the event onto the state stack (EVKEY_BEGIN). c) the process changes state by popping an event off the state stack (EVKEY_END). If the event or state popped off the stack does not match the specified event then the post-analysis may get confused but this does not interfere with the actual logging. EVKEY_EVENT, EVKEY_BEGIN or EVKEY_END must be the first key specified other than a possible EVKEY_ENABLE. Internally an event is stored as a large character string to simplify post-analysis. Users specify data for storage in addition to that which is automatically stored (only the time and process) with key, value combinations (EVKEY_STR_INT, EVKEY_STR_DBL, EVKEY_STR). Many such key-value combinations as required may be specified. Since the internal data format uses colons ':', double quotation marks '"' and carriage returns users should avoid these in their string data. ---------------------------- Sample calling sequence: evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Finished startup code", EVKEY_STR, "Now do some real work", EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); evlog(EVKEY_END, "Get matrix", EVKEY_STR_INT, "Size of matrix", (int) N, EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Transform matrix", EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_END, "Transform matrix", EVKEY_STR_INT, "No. of iterations", (int) niters, EVKEY_LAST_ARG); evlog(EVKEY_DUMP, EVKEY_DISABLE, EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", EVKEY_DUMP, EVKEY_LAST_ARG); ---------------------------- EVKEY_LAST_ARG Terminates list ... takes no value and must be present EVKEY_EVENT, (char *) event Simply log occurence of the event EVKEY_BEGIN, (char *) event Push event onto process state stack EVKEY_END, (char *) event Pop event off process state stack EVKEY_MSG_LEN, (int) length Value is (int) mesage length SND/RCV only EVKEY_MSG_TO, (int) to Value is (int) to process id SND/RCV only EVKEY_MSG_FROM, (int) from Value is (int) from process SND/RCV only EVKEY_MSG_TYPE, (int) type Value is (int) message type SND/RCV only EVKEY_STR_INT, (char *) string, (int) data User data value pair EVKEY_STR_DBL, (char *) string, (double) data User data value pair (char *), (double) EVKEY_STR, (char *) string User data value (char *) EVKEY_ENABLE Enable logging EVKEY_DISABLE Disable logging EVKEY_DUMP Dump out the current buffer to disk EVKEY_FILE, (char *) filename Use specified file to capture events. Default is "events". */ { static int logging=0; /* Boolean flag for login enabled/disabled */ static int error=0; /* Boolean flag for error detected */ static int ncall=0; /* Need to do stuff on first entry */ static char *buffer; /* Logging buffer ... null terminated */ static char *bufpt; /* Pointer to next free char in buffer */ static int left; /* Amount of free space in buffer */ #define BUFLEN 262144 /* Size allocated for buffer ... biggish */ #define MAX_EV_LEN 1000 /* Assumed maximum size of single event record */ static FILE *file; /* File where events will be dumped */ static char *filename = "events"; /* Default name of events file */ va_list ap; /* For variable argument list */ int key; /* Hold key being processed */ int nchars; /* No. of chars printed by sprintf call */ char *temp; /* Temporary copy of bufpt */ char *string; /* Temporary */ int integer; /* Temporary */ double dbl; /* Temporary */ int valid; /* Temporary */ #define ERROR_RETURN error = 1; return; #define DUMPBUF (void) fputs(buffer, file); \ (void) fflush(file);\ if(ferror(file)) {ERROR_RETURN} \ bufpt = buffer; left = BUFLEN; /* sprintf is a disaster area!!!! #ifdef INTSPRINTF #define RECORD(A) nchars = (A); bufpt += nchars; left -= nchars #else #define RECORD(A) nchars = strlen(A); bufpt += nchars; left -= nchars #endif */ #define RECORD(A) {A; nchars = strlen(bufpt); bufpt += nchars; left -= nchars;} /* If an error was detected on a previous call don't even try to do anything */ if (error) {ERROR_RETURN} /* First time in need to allocate the buffer, open the file etc */ if (ncall == 0) { ncall = 1; if (!(bufpt = buffer = malloc((unsigned) BUFLEN))) {ERROR_RETURN} left = BUFLEN; if (!(file = fopen(filename, "w"))) {ERROR_RETURN} } /* Parse the arguments */ temp = bufpt; /* Save to check if anything has been logged */ valid = 0; /* One of BEGIN, END or EVENT must preceed most keys */ va_start(ap, farg_key); key = farg_key; while (key != EVKEY_LAST_ARG) { if ( (!logging) && (key != EVKEY_ENABLE) ) return; switch (key) { case EVKEY_ENABLE: logging = 1; break; case EVKEY_DISABLE: logging = 0; goto done; /* break; */ case EVKEY_FILENAME: if (!(filename = strdup(va_arg(ap, char *)))) {ERROR_RETURN} if (!(file = freopen(filename, "w", file))) {ERROR_RETURN} break; case EVKEY_BEGIN: valid = 1; RECORD(sprintf(bufpt, ":BEGIN:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_END: valid = 1; RECORD(sprintf(bufpt, ":END:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_EVENT: valid = 1; RECORD(sprintf(bufpt, ":EVENT:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_MSG_LEN: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":MSG_LEN:%d", va_arg(ap, int))); break; case EVKEY_MSG_TO: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":MSG_TO:%d", va_arg(ap, int))); break; case EVKEY_MSG_FROM: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":MSG_FROM:%d", va_arg(ap, int))); break; case EVKEY_MSG_TYPE: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":MSG_TYPE:%d", va_arg(ap, int))); break; case EVKEY_MSG_SYNC: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":MSG_SYNC:%d", va_arg(ap, int))); break; case EVKEY_STR_INT: if (!valid) {ERROR_RETURN} string = va_arg(ap, char *); integer = va_arg(ap, int); RECORD(sprintf(bufpt, ":STR_INT:%s:%d", string, integer)); break; case EVKEY_STR_DBL: if (!valid) {ERROR_RETURN} string = va_arg(ap, char *); dbl = va_arg(ap, double); RECORD(sprintf(bufpt, ":STR_DBL:%s:%g", string, dbl)); break; case EVKEY_STR: if (!valid) {ERROR_RETURN} RECORD(sprintf(bufpt, ":STR:%s", va_arg(ap, char *))); break; case EVKEY_DUMP: {DUMPBUF} if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } break; default: {DUMPBUF} {ERROR_RETURN} } key = va_arg(ap, int); } done: va_end(ap); /* Put a linefeed on the end of the record if something is written */ if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } /* Should really check on every access to the buffer that there is enough space ... however just assume a very large maximum size for a single event log entry and check here */ if (left <= 0) {ERROR_RETURN} if (left < MAX_EV_LEN) {DUMPBUF} } #include "sndrcv.h" static double walltime() /* return the wall time in seconds as a double */ { return ((double) MTIME_()) * 0.01; } /* int main() { int N = 19; double matrix_norm = 99.1; int niters = 5; evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Finished startup code", EVKEY_STR, "Now do some real work", EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); evlog(EVKEY_END, "Get matrix", EVKEY_STR_INT, "Size of matrix", (int) N, EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Transform matrix", EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_END, "Transform matrix", EVKEY_STR_INT, "No. of iterations", (int) niters, EVKEY_LAST_ARG); evlog(EVKEY_DUMP, EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", EVKEY_DUMP, EVKEY_LAST_ARG); return 0; } */ ga-5-4/armci/tcgmsg/ipcv4.0/llog.c0000644000175000017500000000172412662210401014671 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/llog.c,v 1.6 2004-04-01 02:04:57 manoj Exp $ */ #include #include #include #include #include "sndrcv.h" #if (defined(SUN) && !defined(SOLARIS)) extern char *sprintf(); #endif #ifndef SGI extern time_t time(); #endif extern void Error(); void LLOG_() /* close and open stdin and stdout to append to a local logfile with the name log. in the current directory */ { char name[12]; time_t t; (void) sprintf(name, "log.%03ld",NODEID_()); (void) fflush(stdout); (void) fflush(stderr); if (freopen(name, "a", stdout) == (FILE *) NULL) Error("LLOG_: error re-opening stdout", (long) -1); if (freopen(name, "a", stderr) == (FILE *) NULL) Error("LLOG_: error re-opening stderr", (long) -1); (void) time(&t); (void) printf("\n\nLog file opened : %s\n\n",ctime(&t)); (void) fflush(stdout); } ga-5-4/armci/tcgmsg/ipcv4.0/srmover.c0000644000175000017500000000233112662210401015424 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/srmover.c,v 1.4 1995-02-24 02:17:53 d3h325 Exp $ */ #if defined(SEQUENT) || defined(CONVEX) #define memcpy(a ,b ,c) bcopy((b), (a), (c)) #else #include #endif void SRmover(a, b, n) char *a, *b; long n; /* Move n bytes from b to a */ { #if defined(ALLIANT) || defined(IBM) || defined(IBMNOEXT) || \ defined(CRAY) || defined(CONVEX) || defined(APOLLO) /* memcpy is fast, Cray is not actually used but alignment crap below won't work in anycase */ (void) memcpy(a, b, (int) n); #else #define UNALIGNED(a) (((unsigned long) (a)) % sizeof(int)) if (UNALIGNED(a) || UNALIGNED(b)) (void) memcpy(a, b, (int) n); /* abdicate responsibility */ else { /* Data is integer aligned ... move first n/sizeof(int) bytes as integers and the remainder as bytes */ int ni = n/sizeof(int); int *ai = (int *) a; int *bi = (int *) b; int i; #ifdef ARDENT #pragma ivdep #endif for (i=0; i #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(AIX) || defined(NEXT) || defined(DECOSF) || defined(LINUX) #include #endif int WaitAll(nchild) long nchild; /* Wait for all children to finish and return appropriate status 0 = OK 1 = bad news */ { int status, pid, child, stat=0, lo, hi; #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) union wait ustatus; #endif for (child=0; child> 8) & 0xff; if ( lo == 0177 ) (void) fprintf(stderr, "(stopped by signal %d).\n", hi); else if ( (lo != 0) && (lo & 0200) ) (void) fprintf(stderr, "(killed by signal %d, dumped core).\n", lo & 0100); else if ( lo != 0 ) (void) fprintf(stderr, "(killed by signal %d).\n",lo); else (void) fprintf(stderr, "(exited with code %d).\n",hi); (void) fflush(stderr); stat = 1; } } return stat; } ga-5-4/armci/tcgmsg/ipcv4.0/mdtob.c0000644000175000017500000000111712662210401015035 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/mdtob.c,v 1.4 1995-02-24 02:17:23 d3h325 Exp $ */ #include "sndrcv.h" /* These routines use C's knowledge of the sizes of data types to generate a portable mechanism for FORTRAN to translate between bytes, integers and doubles. Note that we assume that FORTRAN integers are the same size as C longs. */ long MDTOB_(n) long *n; /* Return the no. of bytes that n doubles occupy */ { if (*n < 0) Error("MDTOB_: negative argument",*n); return (long) (*n * sizeof(double)); } ga-5-4/armci/tcgmsg/ipcv4.0/error.c0000644000175000017500000000422412662210401015063 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/error.c,v 1.9 2003-05-27 22:06:51 edo Exp $ */ #include #include #include #include "sndrcvP.h" #include "sndrcv.h" #include "signals.h" #include "tcgsockets.h" #if defined(SHMEM) || defined(SYSV) #include "sema.h" #include "tcgshmem.h" #endif extern jmp_buf SR_jmp_buf; /* Jumped to on soft error */ #include extern void exit(); extern int SR_caught_sigint; void Error(string, integer) char *string; long integer; { (void) signal(SIGCHLD, SIG_DFL); /* Death of children to be expected */ (void) signal(SIGINT, SIG_IGN); (void) fflush(stdout); if (SR_caught_sigint) { (void) fprintf(stderr,"%3ld: interrupt(%d)\n",NODEID_(), SR_caught_sigint); (void) fflush(stderr); } else { (void) fprintf(stdout,"%3ld: %s %ld (%#lx).\n", NODEID_(), string, integer,integer); (void) fflush(stdout); (void) fprintf(stderr,"%3ld: %s %ld (%#lx).\n", NODEID_(), string, integer,integer); if (errno != 0) perror("system error message"); if (DEBUG_) PrintProcInfo(); } (void) fflush(stdout); (void) fflush(stderr); /* Shut down the sockets and remove shared memory and semaphores to propagate an error condition to anyone that is trying to communicate with me */ ZapChildren(); /* send interrupt to children which should trap it and call Error in the handler */ #if defined(SHMEM) || defined(SYSV) # if (defined(SGI_N32) || defined(SGITFP)) # define PARTIALSPIN # else # define NOSPIN # endif #endif #if defined(SHMEM) || defined(SYSV) #if defined(NOSPIN) || defined(PARTIALSPIN) (void) SemSetDestroyAll(); #endif (void) DeleteSharedRegion(SR_proc_info[NODEID_()].shmem_id); #endif ShutdownAll(); /* Close sockets for machines with static kernel */ /* abort(); */ if (SR_exit_on_error) exit(1); else { SR_error = 1; (void) longjmp(SR_jmp_buf, 1); /* For NXTVAL server */ } } void PARERR_(code) long *code; /* Interface from fortran to c error routine */ { Error("User detected error in FORTRAN", *code); } ga-5-4/armci/tcgmsg/ipcv4.0/tcgsockets.h0000644000175000017500000000056312662210401016112 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/sockets.h,v 1.5 2000-09-30 19:04:22 d3g681 Exp $ */ extern void ShutdownAll(); extern int ReadFromSocket(); extern int WriteToSocket(); extern void CreateSocketAndBind(); extern int ListenAndAccept(); extern int CreateSocketAndConnect(); extern long PollSocket(); extern long WaitForSockets(int nsock, int *socks, int *list); ga-5-4/armci/tcgmsg/ipcv4.0/evon.c0000644000175000017500000000675512662210401014714 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/evon.c,v 1.4 1995-02-24 02:17:17 d3h325 Exp $ */ /* Crude FORTRAN interface to C event logging routines. See evlog.c for more details. FORTRAN character variables are so unportable that guaranteeing that U can parse a variable length argument list is next to impossible. This provides very basic event logging functionality. CALL EVON() enable logging. CALL EVOFF() disable logging. CALL EVBGIN("event description") push event onto state stack CALL EVEND("event description") pop event off state stack CALL EVENT("event description") log occurence of event that doesn't change state stack */ #include #ifdef IPSC #define bcopy(a, b, n) memcpy((b), (a), (n)) #endif #if 0 #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX) || \ defined(KSR) || defined(DECOSF) extern void *malloc(); #else extern char *malloc(); #endif #endif #include "evlog.h" /* These to get portable FORTRAN interface ... these routines will not be called from C which has the superior evlog interface */ #if (defined(AIX) || defined(NEXT) || defined(HPUX)) && !defined(EXTNAME) #define evon_ evon #define evoff_ evoff #define evbgin_ evbgin #define evend_ evend #define event_ event #endif #if (defined(CRAY) || defined(ARDENT)) #define evon_ EVON #define evoff_ EVOFF #define evbgin_ EVBGIN #define evend_ EVEND #define event_ EVENT #endif /* Define crap for handling FORTRAN character arguments */ #ifdef CRAY #include #endif #ifdef ARDENT struct char_desc { char *string; int len; }; #endif void evon_() { #ifdef EVENTLOG evlog(EVKEY_ENABLE, EVKEY_LAST_ARG); #endif } void evoff_() { #ifdef EVENTLOG evlog(EVKEY_DISABLE, EVKEY_LAST_ARG); #endif } #ifdef ARDENT void evbgin_(arg) struct char_desc *arg; { char *string = arg->string; int len = arg->len; #endif #ifdef CRAY void evbgin_(arg) _fcd arg; { char *string = _fcdtocp(arg); int len = _fcdlen(arg); #endif #if !defined(ARDENT) && !defined(CRAY) void evbgin_(string, len) char *string; int len; { #endif #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_BEGIN, value, EVKEY_LAST_ARG); (void) free(value); } #endif } #ifdef ARDENT void evend_(arg) struct char_desc *arg; { char *string = arg->string; int len = arg->len; #endif #ifdef CRAY void evend_(arg) _fcd arg; { char *string = _fcdtocp(arg); int len = _fcdlen(arg); #endif #if !defined(CRAY) && !defined(ARDENT) void evend_(string, len) char *string; int len; { #endif #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_END, value, EVKEY_LAST_ARG); (void) free(value); } #endif } #ifdef ARDENT void event_(arg) struct char_desc *arg; { char *string = arg->string; int len = arg->len; #endif #ifdef CRAY void event_(arg) _fcd arg; { char *string = _fcdtocp(arg); int len = _fcdlen(arg); #endif #if !defined(ARDENT) && !defined(CRAY) void event_(string, len) char *string; int len; { #endif #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_EVENT, value, EVKEY_LAST_ARG); (void) free(value); } #endif } ga-5-4/armci/tcgmsg/ipcv4.0/snd.c0000644000175000017500000006577212662210401014535 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/snd.c,v 1.21 2004-04-01 02:04:57 manoj Exp $ */ #include #include #ifdef SEQUENT #include #else #include #endif #ifdef AIX #include #endif #include #include #if defined(SHMEM) || defined(SYSV) # if (defined(SGI_N32) || defined(SGITFP)) # define PARTIALSPIN # else # define NOSPIN # endif #endif #if (defined(SUN) && !defined(SOLARIS)) extern char *sprintf(); #endif extern void Error(); #include "sndrcv.h" #include "sndrcvP.h" #include "tcgsockets.h" #ifdef GOTXDR #include "xdrstuff.h" #endif #if defined(SHMEM) || defined(SYSV) #if !defined(SEQUENT) && !defined(CONVEX) #include #endif #include "sema.h" #include "tcgshmem.h" #if defined(USE_SRMOVER) extern void SRmover(); #else #define SRmover(a,b,n) memcpy(a,b,n) #endif #endif #ifdef EVENTLOG #include "evlog.h" #endif extern void ListenOnSock(int sock); extern int AcceptConnection(int sock); void PrintProcInfo() /* Print out the SR_proc_info structure array for this process */ { long i; (void) fprintf(stderr,"Process info for node %ld: \n",NODEID_()); for (i=0; itype, header->nodefrom, header->nodeto, header->length, header->tag); (void) fflush(stdout); } #if defined(SHMEM) || defined(SYSV) static int DummyRoutine() {int i, sum=0; for(i=0; i<10; i++) sum += i; return sum;} static long flag(p) long *p; { #if defined(CONVEX) && defined(HPUX) asm("sync"); #endif return *p; } static void Await(p, value) long *p; long value; /* Wait until the value pointed to by p equals value. Since *ptr is volatile but cannot usually declare this include another level of procedure call to protect against compiler optimization. */ { int nspin = 0; if (DEBUG_) { printf("%2ld: Await p=%p, value=%ld\n", NODEID_(), p, value); fflush(stdout); } for (; flag(p) != value; nspin++) { #if defined(NOSPIN) && !defined(PARTIALSPIN) if (nspin < 100) (void) DummyRoutine(); else USleep((long) 10000); #else if (nspin < 10000000) (void) DummyRoutine(); else { /* printf("%2ld: Await sleeping\n", NODEID_()); fflush(stdout); */ USleep((long) 100000); } #endif } } static void rcv_local(type, buf, lenbuf, lenmes, nodeselect, nodefrom) long *type; char *buf; long *lenbuf; long *lenmes; long *nodeselect; long *nodefrom; { long me = NODEID_(); long node = *nodeselect; MessageHeader *head = SR_proc_info[node].header; long buflen = SR_proc_info[node].buflen; char *buffer = SR_proc_info[node].buffer; long nodeto, len; #ifdef NOSPIN long semid = SR_proc_info[node].semid; long sem_read = SR_proc_info[node].sem_read; long sem_written = SR_proc_info[node].sem_written; long semid_to = SR_proc_info[me].semid; long sem_pend = SR_proc_info[me].sem_pend; #endif #if !defined(NOSPIN) || defined(PARTIALSPIN) long *buffer_full = SR_proc_info[node].buffer_full; #endif /* Error checking */ if ( (buffer == (char *) NULL) || (head == (MessageHeader *) NULL) ) Error("rcv_local: invalid shared memory", (long) node); #ifdef NOSPIN if ( (semid < 0) || (sem_read < 0) || (sem_written < 0) || (semid_to < 0) || (sem_pend < 0) ) Error("rcv_local: invalid semaphore set", (long) node); #endif #ifdef NOSPIN SemWait(semid_to, sem_pend); #endif Await(&head->nodeto, me); /* Still have this possible spin */ #if defined(NOSPIN) && !defined(PARTIALSPIN) SemWait(semid, sem_written); #else Await(buffer_full, (long) TRUE); #endif /* Now have a message for me ... check the header info and copy the first block of the message. */ if (DEBUG_) PrintMessageHeader("rcv_local ",head); nodeto = head->nodeto; /* Always me ... history here */ head->nodeto = -1; *nodefrom = head->nodefrom; if (head->type != *type) { PrintMessageHeader("rcv_local ",head); /* printf("rcv_local: type mismatch ... strong typing enforced\n"); */ /* abort(); */ Error("rcv_local: type mismatch ... strong typing enforced", (long) *type); } *lenmes = len = head->length; if ( *lenmes > *lenbuf ) Error("rcv_local: message too long for buffer", (long) *lenmes); if (nodeto != me) Error("rcv_local: message meant for someone else?", (long) nodeto); if (len) (void) SRmover(buf, buffer, (len > buflen) ? buflen : len); #if defined(NOSPIN) && !defined(PARTIALSPIN) SemPost(semid, sem_read); #else *buffer_full = FALSE; # if defined(CONVEX) && defined(HPUX) asm("sync"); # endif #endif len -= buflen; buf += buflen; /* Copy the remainder of the message */ while (len > 0) { #if defined(NOSPIN) && !defined(PARTIALSPIN) SemWait(semid, sem_written); #else Await(buffer_full, (long) TRUE); #endif (void) SRmover(buf, buffer, (len > buflen) ? buflen : len); #if defined(NOSPIN) && !defined(PARTIALSPIN) SemPost(semid, sem_read); #else *buffer_full = FALSE; #endif len -= buflen; buf += buflen; } } static void snd_local(type, buf, lenbuf, node) long *type; char *buf; long *lenbuf; long *node; { long me = NODEID_(); MessageHeader *head = SR_proc_info[me].header; long buflen = SR_proc_info[me].buflen; long len = *lenbuf; char *buffer = SR_proc_info[me].buffer; long tag = SR_proc_info[*node].n_snd; #ifdef NOSPIN long semid = SR_proc_info[me].semid; long sem_read = SR_proc_info[me].sem_read; long sem_written = SR_proc_info[me].sem_written; long semid_to = SR_proc_info[*node].semid; long sem_pend = SR_proc_info[*node].sem_pend; #endif #if !defined(NOSPIN) || defined(PARTIALSPIN) long *buffer_full = SR_proc_info[me].buffer_full; #endif /* Error checking */ if ( (buffer == (char *) NULL) || (head == (MessageHeader *) NULL) ) Error("snd_local: invalid shared memory", (long) *node); #ifdef NOSPIN if ( (semid < 0) || (semid_to < 0) || (sem_read < 0) || (sem_written < 0) ) Error("snd_local: invalid semaphore set", (long) *node); #endif /* Check that final segment of last message has been consumed */ #if defined(NOSPIN) && !defined(PARTIALSPIN) SemWait(semid, sem_read); #else Await(buffer_full, (long) FALSE); #endif /* Fill in message header */ head->nodefrom = (char) me; head->type = *type; head->length = *lenbuf; head->tag = tag; head->nodeto = (char) *node; #if defined(CONVEX) && defined(HPUX) asm("sync"); #endif if (DEBUG_) { PrintMessageHeader("snd_local ",head); (void) fflush(stdout); } /* Copy the first piece of the message so that send along with header to minimize use of semaphores. Also need to send header even for messages of zero length */ if (len) (void) SRmover(buffer, buf, (len > buflen) ? buflen : len); #if defined(NOSPIN) && !defined(PARTIALSPIN) SemPost(semid, sem_written); #else *buffer_full = TRUE; # if defined(CONVEX) && defined(HPUX) asm("sync"); # endif #endif #ifdef NOSPIN SemPost(semid_to, sem_pend); #endif len -= buflen; buf += buflen; while (len > 0) { #if defined(NOSPIN) && !defined(PARTIALSPIN) SemWait(semid, sem_read); #else Await(buffer_full, (long) FALSE); #endif (void) SRmover(buffer, buf, (len > buflen) ? buflen : len); #if defined(NOSPIN) && !defined(PARTIALSPIN) SemPost(semid, sem_written); #else *buffer_full = TRUE; # if defined(CONVEX) && defined(HPUX) asm("sync"); # endif #endif len -= buflen; buf += buflen; } } #endif static void snd_remote(type, buf, lenbuf, node) long *type; char *buf; long *lenbuf; long *node; /* synchronous send to remote process long *type = user defined integer message type (input) char *buf = data buffer (input) long *lenbuf = length of buffer in bytes (input) long *node = node to send to (input) for zero length messages only the header is sent */ { #define SHORT_MSG_BUF_SIZE (2048 + 40) static char fudge[SHORT_MSG_BUF_SIZE]; MessageHeader header; long me=NODEID_(); int sock=SR_proc_info[*node].sock; long len; #ifdef SOCK_FULL_SYNC char sync=0; #endif if ( sock < 0 ) Error("snd_remote: sending to process without socket", (long) *node); header.nodefrom = me; header.nodeto = *node; header.type = *type; header.length = *lenbuf; header.tag = SR_proc_info[*node].n_snd; /* header.length is the no. of items if XDR is used or just the number of bytes */ #ifdef GOTXDR if ( *type & MSGDBL ) header.length = *lenbuf / sizeof(double); else if ( *type & MSGINT ) header.length = *lenbuf / sizeof(long); else if ( *type & MSGCHR ) header.length = *lenbuf / sizeof(char); else header.length = *lenbuf; #else header.length = *lenbuf; #endif if (DEBUG_) PrintMessageHeader("snd_remote",&header); #ifndef GOTXDR /* Combine header and messages less than a certain size to avoid * performance problem on (older?) linuxes */ if ((*lenbuf + sizeof(header)) <= sizeof(fudge)) { memcpy(fudge,(char *) &header, sizeof(header)); memcpy(fudge+sizeof(header), buf, *lenbuf); if ( (len = WriteToSocket(sock, fudge, sizeof(header)+*lenbuf)) != ((long)sizeof(header)+*lenbuf)) Error("snd_remote: writing message to socket", (long) (len+100000*(sock + 1000* *node))); return; } #endif #ifdef GOTXDR (void) WriteXdrLong(sock, (long *) &header, (long) (sizeof(header)/sizeof(long))); #else if ( (len = WriteToSocket(sock, (char *) &header, (long) sizeof(header))) != sizeof(header) ) Error("snd_remote: writing header to socket", len); #endif if (*lenbuf) { #ifdef GOTXDR if ( *type & MSGDBL ) (void) WriteXdrDouble(sock, (double *) buf, header.length); else if ( *type & MSGINT ) (void) WriteXdrLong(sock, (long *) buf, header.length); else if ( *type & MSGCHR ) (void) WriteXdrChar(sock, (char *) buf, header.length); else if ( (len = WriteToSocket(sock, buf, header.length)) != header.length) Error("snd_remote: writing message to socket", (long) (len+100000*(sock + 1000* *node))); #else if ( (len = WriteToSocket(sock, buf, header.length)) != header.length) Error("snd_remote: writing message to socket", (long) (len+100000*(sock + 1000* *node))); #endif } #ifdef SOCK_FULL_SYNC /* this read (and write in rcv_remote) of an acknowledgment forces synchronous */ if ( ReadFromSocket(sock, &sync, (long) 1) != 1) Error("snd_remote: reading acknowledgement", (long) (len+100000*(sock + 1000* *node))); #endif } /*ARGSUSED*/ void SND_(type, buf, lenbuf, node, sync) long *type; void *buf; long *lenbuf; long *node; long *sync; /* mostly syncrhonous send long *type = user defined integer message type (input) void *buf = data buffer (input) long *lenbuf = length of buffer in bytes (input) long *node = node to send to (input) long *sync = flag for sync/async ... IGNORED for zero length messages only the header is sent */ { long me=NODEID_(); long nproc=NNODES_(); #ifdef TIMINGS double start; #endif /* Error checking */ if (*node == me) Error("SND_: cannot send message to self", (long) me); if ( (*node < 0) || (*node > nproc) ) Error("SND_: out of range node requested", (long) *node); if ( (*lenbuf < 0) || (*lenbuf > (long)BIG_MESSAGE) ) Error("SND_: message length out of range", (long) *lenbuf); #ifdef EVENTLOG evlog(EVKEY_BEGIN, EVENT_SND, EVKEY_MSG_LEN, (int) *lenbuf, EVKEY_MSG_FROM, (int) me, EVKEY_MSG_TO, (int) *node, EVKEY_MSG_TYPE, (int) *type, EVKEY_MSG_SYNC, (int) *sync, EVKEY_LAST_ARG); #endif /* Send via shared memory or sockets */ #ifdef TIMINGS start = TCGTIME_(); #endif #if defined(SHMEM) || defined(SYSV) if (SR_proc_info[*node].local){ #ifdef KSR_NATIVE KSR_snd_local(type, buf, lenbuf, node); #else snd_local(type, buf, lenbuf, node); #endif } else { #endif snd_remote(type, buf, lenbuf, node); #if defined(SHMEM) || defined(SYSV) } #endif /* Collect statistics */ SR_proc_info[*node].n_snd += 1; SR_proc_info[*node].nb_snd += *lenbuf; #ifdef TIMINGS SR_proc_info[*node].t_snd += TCGTIME_() - start; #endif #ifdef EVENTLOG evlog(EVKEY_END, EVENT_SND, EVKEY_LAST_ARG); #endif } static long MatchMessage(header, me, type) MessageHeader *header; long me, type; /* Wrapper round check on if header is to me and of required type so that compiler does not optimize out fetching header info from shared memory. */ { return (long) ((header->nodeto == me) && (header->type == type)); } static long NextReadyNode(type) long type; /* Select a node from which input is pending ... also match the desired type. next_node is maintained as the last node that NextReadyNode chose plus one modulo NNODES_(). This aids in ensuring fairness. First use select to get info about the sockets and then loop through processes looking either at the bit in the fd_set for the socket (remote process) or the message header in the shared memory buffer (local process). This may be an expensive operation but fairness seems important. If only sockets are in use, just block in select until data is available. */ { static long next_node = 0; long nproc = NNODES_(); long me = NODEID_(); int i, nspin = 0; if (!SR_using_shmem) { int list[MAX_PROCESS]; int nready; nready = WaitForSockets(SR_nsock,SR_socks,list); if (nready == 0) Error("NextReadyNode: nready = 0\n", 0); /* Insert here type checking logic ... not yet done */ return SR_socks_proc[list[0]]; } /* With both local and remote processes end up with a busy wait as no way to wait for both a semaphore and a socket. Moderate this slightly by having short timeout in select */ while (1) { for(i=0; i= 0) { /* Look for message over socket */ int sock = SR_proc_info[next_node].sock; /* Have we already peeked at this socket? */ if (SR_proc_info[next_node].peeked) { if (SR_proc_info[next_node].head_peek.type == type) break; } else if (PollSocket(sock)) { /* Data is available ... let's peek at it */ #ifdef GOTXDR (void) ReadXdrLong(sock, (long *) &SR_proc_info[next_node].head_peek, (long) (sizeof(MessageHeader)/sizeof(long))); #else if (ReadFromSocket(sock, (char *) &SR_proc_info[next_node].head_peek, (long) sizeof(MessageHeader)) != sizeof(MessageHeader) ) Error("NextReadyNode: reading header from socket", next_node); #endif SR_proc_info[next_node].peeked = TRUE; if (DEBUG_) PrintMessageHeader("peeked_at ", &SR_proc_info[next_node].head_peek); if (SR_proc_info[next_node].head_peek.type == type) break; } } } if (i < nproc) /* If found a node skip out of the while loop */ break; nspin++; /* Compromise between low latency and low cpu use */ if (nspin < 10) continue; else if (nspin < 100) USleep((long) 1000); else if (nspin < 600) USleep((long) 10000); else USleep((long) 100000); } i = next_node; next_node = (next_node + 1) % nproc; return (long) i; } long PROBE_(type, node) long *type, *node; /* Return 1/0 (TRUE/FALSE) if a message of the given type is available from the given node. If the node is specified as -1, then all nodes will be examined. Some attempt is made at ensuring fairness. First use select to get info about the sockets and then loop through processes looking either at the bit in the fd_set for the socket (remote process) or the message header in the shared memory buffer (local process). This may be an expensive operation but fairness seems important. */ { long nproc = NNODES_(); long me = NODEID_(); int i, proclo, prochi; if (*node == me) Error("PROBE_ : cannot recv message from self, msgtype=", *type); if (*node == -1) { /* match anyone */ proclo = 0; prochi = nproc-1; } else proclo = prochi = *node; for(i=proclo; i<=prochi; i++) { if (i == me) { ; /* can't receive from self */ } else if (SR_proc_info[i].local) { /* Look for local message */ #ifdef KSR_NATIVE if (KSR_MatchMessage(i, me, type)) #else if (MatchMessage(SR_proc_info[i].header, me, *type)) #endif break; } else if (SR_proc_info[i].sock >= 0) { /* Look for message over socket */ int sock = SR_proc_info[i].sock; /* Have we already peeked at this socket? */ if (SR_proc_info[i].peeked) { if (SR_proc_info[i].head_peek.type == *type) break; } else if (PollSocket(sock)) { /* Data is available ... let's peek at it */ #ifdef GOTXDR (void) ReadXdrLong(sock, (long *) &SR_proc_info[i].head_peek, (long) (sizeof(MessageHeader)/sizeof(long))); #else if (ReadFromSocket(sock, (char *) &SR_proc_info[i].head_peek, (long) sizeof(MessageHeader)) != sizeof(MessageHeader) ) Error("NextReadyNode: reading header from socket", (long) i); #endif SR_proc_info[i].peeked = TRUE; if (DEBUG_) PrintMessageHeader("peeked_at ", &SR_proc_info[i].head_peek); if (SR_proc_info[i].head_peek.type == *type) break; } } } if (i <= prochi) return 1; else return 0; } static void rcv_remote(type, buf, lenbuf, lenmes, nodeselect, nodefrom) long *type; char *buf; long *lenbuf; long *lenmes; long *nodeselect; long *nodefrom; /* synchronous receive of data long *type = user defined type of received message (input) char *buf = data buffer (output) long *lenbuf = length of buffer in bytes (input) long *lenmes = length of received message in bytes (output) (exceeding receive buffer is hard error) long *nodeselect = node to receive from (input) -1 implies that any pending message may be received long *nodefrom = node message is received from (output) */ { long me = NODEID_(); long node = *nodeselect; int sock = SR_proc_info[node].sock; long len; MessageHeader header; #ifdef SOCK_FULL_SYNC char sync = 0; #endif if ( sock < 0 ) Error("rcv_remote: receiving from process without socket", (long) node); /* read the message header and check contents */ if (SR_proc_info[node].peeked) { /* Have peeked at this socket ... get message header from buffer */ if (DEBUG_) printf("%2ld: rcv_remote message has been peeked at\n", me); (void) memcpy((char *) &header, (char *) &SR_proc_info[node].head_peek, sizeof(MessageHeader)); SR_proc_info[node].peeked = FALSE; } else { #ifdef GOTXDR (void) ReadXdrLong(sock, (long *) &header, (long) (sizeof(header)/sizeof(long))); #else if ( (len = ReadFromSocket(sock, (char *) &header, (long) sizeof(header))) != sizeof(header) ) Error("rcv_remote: reading header from socket", len); #endif } if (DEBUG_) PrintMessageHeader("rcv_remote",&header); if (header.nodeto != me) { PrintMessageHeader("rcv_remote",&header); Error("rcv_remote: got message meant for someone else", (long) header.nodeto); } *nodefrom = header.nodefrom; if (*nodefrom != node) Error("rcv_remote: got message from someone on incorrect socket", (long) *nodefrom); if (header.type != *type) { PrintMessageHeader("rcv_remote",&header); printf("rcv_remote: type mismatch ... strong typing enforced\n"); abort(); Error("rcv_remote: type mismatch ... strong typing enforced", (long) *type); } #ifdef GOTXDR if ( *type & MSGDBL ) *lenmes = header.length * sizeof(double); else if ( *type & MSGINT ) *lenmes = header.length * sizeof(long); else if ( *type & MSGCHR ) *lenmes = header.length * sizeof(char); else *lenmes = header.length; #else *lenmes = header.length; #endif if ( (*lenmes < 0) || (*lenmes > (long)BIG_MESSAGE) || (*lenmes > *lenbuf) ) { PrintMessageHeader("rcv_remote",&header); (void) fprintf(stderr, "rcv_remote err: lenbuf=%ld\n",*lenbuf); Error("rcv_remote: message length out of range",(long) *lenmes); } if (*lenmes > 0) { #ifdef GOTXDR if ( *type & MSGDBL ) (void) ReadXdrDouble(sock, (double *) buf, header.length); else if ( *type & MSGINT ) (void) ReadXdrLong(sock, (long *) buf, header.length); else if ( *type & MSGCHR ) (void) ReadXdrChar(sock, (char *) buf, header.length); else if ( (len = ReadFromSocket(sock, buf, *lenmes)) != *lenmes) Error("rcv_remote: reading message from socket", (long) (len+100000*(sock+ 1000* *nodefrom))); #else if ( (len = ReadFromSocket(sock, buf, *lenmes)) != *lenmes) Error("rcv_remote: reading message from socket", (long) (len+100000*(sock+ 1000* *nodefrom))); #endif } /* this write (and read in snd_remote) makes the link synchronous */ #ifdef SOCK_FULL_SYNC if ( WriteToSocket(sock, &sync, (long) 1) != 1) Error("rcv_remote: writing sync to socket", (long) node); #endif } /*ARGSUSED*/ void RCV_(type, buf, lenbuf, lenmes, nodeselect, nodefrom, sync) long *type; void *buf; long *lenbuf; long *lenmes; long *nodeselect; long *nodefrom; long *sync; /* long *type = user defined type of received message (input) void *buf = data buffer (output) long *lenbuf = length of buffer in bytes (input) long *lenmes = length of received message in bytes (output) (exceeding receive buffer is hard error) long *nodeselect = node to receive from (input) -1 implies that any pending message may be received long *nodefrom = node message is received from (output) long *sync = 0 for asynchronous, 1 for synchronous (NOT USED) */ { long me = NODEID_(); long nproc = NNODES_(); long node; #ifdef TIMINGS double start; #endif #ifdef EVENTLOG evlog(EVKEY_BEGIN, EVENT_RCV, EVKEY_MSG_FROM, (int) *nodeselect, EVKEY_MSG_TO, (int) me, EVKEY_MSG_TYPE, (int) *type, EVKEY_MSG_SYNC, (int) *sync, EVKEY_LAST_ARG); #endif /* Assign the desired node or the next ready node */ #ifdef TIMINGS start = TCGTIME_(); #endif if (*nodeselect == -1) node = NextReadyNode(*type); else node = *nodeselect; /* Check for some errors ... need more checking here ... note that the overall master process has id nproc */ if (node == me) Error("RCV_: cannot receive message from self", (long) me); if ( (node < 0) || (node > nproc) ) Error("RCV_: out of range node requested", (long) node); /* Receive the message ... use shared memory, switch or socket */ #if defined(SHMEM) || defined(SYSV) if (SR_proc_info[node].local){ #ifdef KSR_NATIVE KSR_rcv_local(type, buf, lenbuf, lenmes, &node, nodefrom); #else rcv_local(type, buf, lenbuf, lenmes, &node, nodefrom); #endif } else { #endif rcv_remote(type, buf, lenbuf, lenmes, &node, nodefrom); #if defined(SHMEM) || defined(SYSV) } #endif /* Collect statistics */ SR_proc_info[node].n_rcv += 1; SR_proc_info[node].nb_rcv += *lenmes; #ifdef TIMINGS SR_proc_info[node].t_rcv += TCGTIME_() - start; #endif #ifdef EVENTLOG evlog(EVKEY_END, EVENT_RCV, EVKEY_MSG_FROM, (int) node, EVKEY_MSG_LEN, (int) *lenmes, EVKEY_LAST_ARG); #endif } void RemoteConnect(a, b, c) long a, b, c; /* Make a socket connection between processes a and b via the process c to which both are already connected. */ { long me = NODEID_(); long nproc = NNODES_(); long type = TYPE_CONNECT; /* Overriden below */ char cport[8]; long tmp, lenmes, nodefrom, clusid, lenbuf, sync=1; int sock, port; long lport; if ((a == b) || (a == c) || (b == c) ) return; /* Gracefully ignore redundant connections */ if ( (me != a) && (me != b) && (me != c) ) return; /* I'm not involved in this connection */ if (a < b) { tmp = a; a = b; b = tmp; } type = (a + nproc*b) | MSGINT; /* Create a unique type */ if (DEBUG_) { (void) printf("RC a=%ld, b=%ld, c=%ld, me=%ld\n",a,b,c,me); (void) fflush(stdout); } if (a == me) { CreateSocketAndBind(&sock, &port); /* Create port */ if (DEBUG_) { (void) printf("RC node=%ld, sock=%d, port=%d\n",me, sock, port); (void) fflush(stdout); } lport = port; lenbuf = sizeof lport; ListenOnSock(sock); SND_(&type, (char *) &lport, &lenbuf, &c, &sync); /* Port to intermediate */ SR_proc_info[b].sock = AcceptConnection(sock); /* Accept connection and save socket info */ } else if (b == me) { clusid = SR_proc_info[a].clusid; lenbuf = sizeof lport; RCV_(&type, (char *) &lport, &lenbuf, &lenmes, &c, &nodefrom, &sync); port = lport; (void) sprintf(cport,"%d",port); lenbuf = strlen(cport) + 1; if (lenbuf > (long)sizeof(cport)) Error("RemoteConnect: cport too small", (long) lenbuf); SR_proc_info[a].sock = CreateSocketAndConnect(SR_clus_info[clusid].hostname, cport); } else if (c == me) { lenbuf = sizeof lport; RCV_(&type, (char *) &lport, &lenbuf, &lenmes, &a, &nodefrom, &sync); SND_(&type, (char *) &lport, &lenbuf, &b, &sync); } } ga-5-4/armci/tcgmsg/ipcv4.0/signals.c0000644000175000017500000000663512662210401015402 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/signals.c,v 1.11 2004-04-01 02:04:57 manoj Exp $ */ #include #include "sndrcvP.h" #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(AIX) || defined(NEXT) #include #else #include #include #endif extern void Error(); int SR_caught_sigint = 0; #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) # define SigType int #else # define SigType void #endif #ifndef SIG_ERR # define SIG_ERR (SigType (*)())-1 #endif #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) || (defined(SUN) && !defined(SOLARIS)) SigType SigintHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigintHandler(sig) #endif int sig; { SR_caught_sigint = 1; Error("SigintHandler: signal was caught",(long) sig); } void TrapSigint() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( signal(SIGINT, SigintHandler) == SIG_ERR) Error("TrapSigint: error from signal setting SIGINT",(long) SIGINT); } void ZapChildren() /* kill -SIGINT all of my beloved children */ { while (SR_numchild--) (void) kill((int) SR_pids[SR_numchild], SIGINT); } #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) || (defined(SUN) && !defined(SOLARIS)) SigType SigchldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else void SigchldHandler(sig) #endif int sig; { int status; #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) union wait ustatus; #endif #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) (void) wait(&ustatus); status = ustatus.w_status; #else (void) wait(&status); #endif SR_caught_sigint = 1; Error("Child process terminated prematurely, status=",(long) status); } void TrapSigchld() /* Trap SIGCHLD so that can tell if children die unexpectedly. */ { if ( signal(SIGCHLD, SigchldHandler) == SIG_ERR) Error("TrapSigchld: error from signal setting SIGCHLD", (long) SIGCHLD); } #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) || (defined(SUN) && !defined(SOLARIS)) SigType SigsegvHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigsegvHandler(sig) #endif int sig; { SR_caught_sigint = 1; Error("SigsegvHandler: signal was caught",(long) sig); } void TrapSigsegv() /* parallel needs to trap the signal SIGSEGV under Solaris that is generated when interrupted in NxtVal */ { if ( signal(SIGSEGV, SigsegvHandler) == SIG_ERR) Error("TrapSigsegv: error from signal setting SIGSEGV", (long) SIGSEGV); } #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) || (defined(SUN) && !defined(SOLARIS)) SigType SigtermHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigtermHandler(sig) #endif int sig; { SR_caught_sigint = 1; Error("SigtermHandler: signal was caught",(long) sig); } void TrapSigterm() /* parallel needs to trap the SIGTERM for batch jobs */ { if ( signal(SIGTERM, SigtermHandler) == SIG_ERR) Error("TrapSigterm: error from signal setting SIGTERM", (long) SIGTERM); } ga-5-4/armci/tcgmsg/ipcv4.0/pfilecopy.c0000644000175000017500000001104712662210401015725 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/pfilecopy.c,v 1.9 2004-05-07 20:45:10 pollack Exp $ */ #include #ifdef SEQUENT #include #else #include #endif #include "sndrcv.h" #include "msgtypesc.h" #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX) || \ defined(KSR) || defined(DECOSF) extern void *malloc(); #else extern void *malloc(); #endif extern void free(); void tcgi_pfilecopy(type, node0, filename) long *type, *node0; char *filename; /* Process node0 has a file (assumed unopened) named fname. This file will be copied to all other processes which must simultaneously invoke pfilecopy. Since the processes may be using the same directory one probably ought to make sure that each process uses a different name in the call. e.g. on node 0 pfilecopy(99, 0, 'argosin') on node 1 pfilecopy(99, 0, 'argosin_001') on node 2 pfilecopy(99, 0, 'argosin_002') */ { char *buffer; FILE *file; long length, nread=32768, len_nread=sizeof(long); long typenr = (*type & 32767) | MSGINT; /* Force user type integer */ long typebuf =(*type & 32767) | MSGCHR; if (!(buffer = malloc((unsigned) nread))) Error("pfilecopy: failed to allocate the I/O buffer",nread); if (*node0 == NODEID_()) { /* I have the original file ... open and check its size */ if ((file = fopen(filename,"r")) == (FILE *) NULL) { (void) fprintf(stderr,"me=%ld, filename = %s.\n",NODEID_(),filename); Error("pfilecopy: node0 failed to open original file", *node0); } /* Quick sanity check on the length */ (void) fseek(file, 0L, (int) 2); /* Seek to end of file */ length = ftell(file); /* Find the length of file */ (void) fseek(file, 0L, (int) 0); /* Seek to beginning of file */ if ( (length<0) || (length>1e12) ) Error("pfilecopy: the file length is -ve or very big", length); /* Send the file in chunks of nread bytes */ while (nread) { nread = fread(buffer, 1, (int) nread, file); BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; } } } else { /* Open the file for the duplicate */ if ((file = fopen(filename,"w+")) == (FILE *) NULL) { (void) fprintf(stderr,"me=%ld, filename = %s.\n",NODEID_(),filename); Error("pfilecopy: failed to open duplicate file", *node0); } /* Receive data and write to file */ while (nread) { BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; if (nread != (long)fwrite(buffer, 1, (int) nread, file)) Error("pfilecopy: error data to duplicate file", nread); } } } /* Tidy up the stuff we have been using */ (void) fflush(file); (void) fclose(file); (void) free(buffer); } void PFILECOPY_(type, node0, filename) long *type, *node0; char *filename; { tcgi_pfilecopy(type, node0, filename); } #ifdef IPSC #define bcopy(a, b, n) memcpy((b), (a), (n)) #endif #ifdef CRAY #include #endif #ifdef ARDENT struct char_desc { char *string; int len; }; #endif /* This crap because FORTRAN has no standard for passing strings */ #ifdef ARDENT void PFCOPY_(type, node0, arg) long *type; long *node0; struct char_desc *arg; { char *fname = arg->string; int len = arg->len; #endif #ifdef CRAY void PFCOPY_(type, node0, arg) long *type; long *node0; _fcd arg; { char *fname = _fcdtocp(arg); int len = _fcdlen(arg); #endif #if !defined(ARDENT) && !defined(CRAY) void PFCOPY_(type, node0, fname, len) long *type; long *node0; char *fname; int len; { #endif /* Fortran wrapper around pfilecopy */ char *filename; #ifdef DEBUG (void) printf("me=%d, type=%d, node0=%d, fname=%x, fname=%.8s, len=%d\n", NODEID_(), *type, *node0, fname, fname, len); #endif /* Strip trailing blanks off the file name */ while ((len > 0) && (fname[len-1] == ' ')) len--; if (len <= 0) Error("pfcopy_: file name length is toast", (long) len); /* Generate a NULL terminated string */ filename = malloc( (unsigned) (len+1) ); if (filename) { (void) bcopy(fname, filename, len); filename[len] = '\0'; } else Error("PFCOPY_: failed to malloc space for filename", (long) len); /* Now call the C routine to do the work */ tcgi_pfilecopy(type, node0, filename); (void) free(filename); } ga-5-4/armci/tcgmsg/ipcv4.0/evlog.h0000644000175000017500000000306712662210401015057 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/evlog.h,v 1.5 2003-06-27 13:52:54 manoj Exp $ */ /* Define EVENT and KEY values used when calling evlog. */ extern void evlog(int farg_key, ...); /* Values of keys in key value pairs */ #define EVKEY_LAST_ARG 0 /* Terminates list ... takes no value */ #define EVKEY_BEGIN 1 /* Push (char *) value onto state stack */ #define EVKEY_END 2 /* Pop (char *) value off state stack */ #define EVKEY_EVENT 3 /* Record (char *) value, no stack change */ #define EVKEY_MSG_LEN 4 /* Value is (int) mesage length SND/RCV only */ #define EVKEY_MSG_TO 5 /* Value is (int) to process id SND/RCV only */ #define EVKEY_MSG_FROM 6 /* Value is (int) from process SND/RCV only */ #define EVKEY_MSG_TYPE 7 /* Value is (int) message type SND/RCV only */ #define EVKEY_MSG_SYNC 8 /* Value is (int) message sync SND/RCV only */ #define EVKEY_STR_INT 9 /* User data value pair (char *), (int) */ #define EVKEY_STR_DBL 10 /* User data value pair (char *), (double) */ #define EVKEY_STR 11 /* User data value (char *) */ #define EVKEY_ENABLE 12 /* Enable logging ... takes no value */ #define EVKEY_DISABLE 13 /* Disable logging ... takes no value */ #define EVKEY_DUMP 14 /* Dump out the current buffer to disk */ #define EVKEY_FILENAME 15 /* Set the name of the events file */ #define EVENT_SND "Snd" /* Predefined strings for internal events */ #define EVENT_RCV "Rcv" #define EVENT_PROCESS "Process" ga-5-4/armci/tcgmsg/ipcv4.0/parallel.c0000644000175000017500000002626412662210401015536 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/parallel.c,v 1.22 2005-02-22 18:47:02 manoj Exp $ */ #include #ifdef SEQUENT #include #else #include #endif #include #include #include #include #include #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(AIX) || defined(NEXT) || defined(LINUX) #include #endif #include "sndrcvP.h" #include "cluster.h" #include "sndrcv.h" #include "signals.h" #include "tcgsockets.h" extern char *getenv(); #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX) || \ defined(KSR) || defined(DECOSF) extern void *malloc(); #else #include #endif #if 0 #if !(defined(SGI) || defined(LINUX)) extern char *strdup(); #endif #endif extern void NextValueServer(); extern void Error(); extern int WaitAll(long nchild); #if (defined(SUN) && !defined(SOLARIS)) extern char *sprintf(); #endif static char *ProcgrpFile(argc, argv) int argc; char **argv; /* Find the name of the procgrp file from 1) the first argument on the command line with .p appended 2) as 1) but also prepending $HOME/pdir/ 2) the translation of the environmental variable PROCGRP 3) the file PROCGRP in the current directory */ { char *tmp, *home; int len; struct stat buf; if (argc > 1) { len = strlen(argv[1]); tmp = malloc((unsigned) (len+3) ); (void) strcpy(tmp, argv[1]); (void) strcpy(tmp+len, ".p"); if (stat(tmp, &buf) == 0) /* try ./arg1.p */ return tmp; else (void) free(tmp); if ( (home = getenv("HOME")) != (char *) NULL ) { tmp = malloc((unsigned) (strlen(home) + len + 9)); (void) strcpy(tmp, home); (void) strcpy(tmp+strlen(home),"/pdir/"); (void) strcpy(tmp+strlen(home)+6,argv[1]); (void) strcpy(tmp+strlen(home)+6+len,".p"); (void) printf("tmp = %s\n",tmp); if (stat(tmp, &buf) == 0) /* try $HOME/pdir/arg1.p */ return tmp; else (void) free(tmp); } } if ( (tmp = getenv("PROCGRP")) != (char *) NULL ) if (stat(tmp, &buf) == 0) return tmp; return strdup("PROCGRP"); } static void SkipPastEOL(fp) FILE *fp; /* Read past first newline character */ { int test; while ( (char) (test = getc(fp)) != '\n') if (test == EOF) break; } static char *GetProcgrp(filename, len_procgrp) char *filename; long *len_procgrp; /* Read the entire contents of the PROCGRP into a NULL terminated character string. Be lazy and read the file twice, first to count the number of characters (ftell cannot be beleived?). */ { FILE *file; char *tmp, *procgrp; int status; if ( (file = fopen(filename,"r")) == (FILE *) NULL ) { (void) fprintf(stderr,"Master: PROCGRP = %s\n",filename); Error("Master: failed to open PROCGRP", (long) 0); } *len_procgrp = 0; while ( (status = getc(file)) != EOF) { if (status == '#') SkipPastEOL(file); else (*len_procgrp)++; } (*len_procgrp)++; if ( (tmp = procgrp = malloc((unsigned) *len_procgrp)) == (char *) NULL ) Error("GetProcgrp: failed in malloc", (long) *len_procgrp); (void) fseek(file, 0L, (int) 0); /* Seek to beginning of file */ while ( (status = getc(file)) != EOF) { if (status == '#') SkipPastEOL(file); else *tmp++ = (char) status; } *tmp = '\0'; if ( (int) (tmp - procgrp + 1) != *len_procgrp ) Error("GetProcgrp: screwup dimensioning procgrp", (long) *len_procgrp); (void) fclose(file); return procgrp; } char *Canonical(name) char *name; /* Use gethostbyname and return the canonicalized name. */ { struct hostent *host; if ( (host = gethostbyname(name)) != (struct hostent *) NULL ) return strdup(host->h_name); else return (char *) NULL; } static long RemoteCreate(remote_hostname, remote_username, remote_executable, argc, argv, n_clus, n_proc, clus_id, proc_id) char *remote_hostname; char *remote_username; char *remote_executable; int argc; char **argv; long n_clus; long n_proc; long clus_id; long proc_id; /* Using rsh create a process on remote_hostname running the executable in the remote file remote_executable. Through arguments pass it my hostname and the port number of a socket to conenct on. Also propagate the arguments which this program was invoked with. Listen for a connection to be established. The return value of RemoteCreate is the filedescriptor of the socket connecting the processes together. Rsh should ensure that the standard output of the remote process is connected to the local standard output and that local interrupts are propagated to the remote process. */ { char local_hostname[256], c_port[8]; char c_n_clus[8], c_n_proc[8], c_clus_id[8], c_proc_id[8]; char *argv2[256]; int sock, port, i, pid; char *tmp; /* Create and bind socket to wild card internet name */ CreateSocketAndBind(&sock, &port); /* create remote process using rsh passing master hostname and port as arguments */ if (gethostname(local_hostname, 256) || strlen(local_hostname) == 0) Error("RemoteCreate: gethostname failed", (long) 0); (void) sprintf(c_port, "%d", port); (void) sprintf(c_n_clus, "%ld", n_clus); (void) sprintf(c_n_proc, "%ld", n_proc); (void) sprintf(c_clus_id, "%ld", clus_id); (void) sprintf(c_proc_id, "%ld", proc_id); (void) printf(" Creating: host=%s, user=%s,\n\ file=%s, port=%s\n", remote_hostname, remote_username, remote_executable, c_port); pid = fork(); if (pid == 0) { /* In child process */ sleep(1); /* So that parallel can make the sockets */ #ifndef SUN if (proc_id != 0) /* Close all uneeded files */ (void) fclose(stdin); #ifdef SPARC64_GP for (i=3; i<62; i++) #else for (i=3; i<64; i++) #endif (void) close(i); #endif /* Overlay the desired executable */ if (strcmp(remote_hostname, local_hostname) != 0) { argv2[0 ] = "rsh"; argv2[1 ] = remote_hostname; argv2[2 ] = "-l"; argv2[3 ] = remote_username; argv2[4 ] = "-n"; argv2[5 ] = remote_executable; argv2[6 ] = " "; for (i=2; i 0) SR_pids[SR_numchild++] = pid; else Error("RemoteCreate: failed forking process", (long) pid); /* accept one connection */ return ListenAndAccept(sock); } int main(argc, argv) int argc; char **argv; /* This is the master process of the cluster network. a) read the procgrp file. This is found by trying in turn: 1) the first argument on the command line with .p appended 2) the translation of the environmental variable PROCGRP 3) the file PROCGRP in the current directory b) create the remote processes specified in this file, connecting to them via sockets and pass them the entire contents of the PROCGRP file in ascii c) Navigate messages to establish connections between the remote processes d) wait for all the children to finish and exit with the appropriate status */ { char hostname[256]; /* Me */ char *filename; /* The name of PROCGRP file */ char *procgrp; /* The contents of PROCGRP */ long len_procgrp; /* The length of PROCGRP */ long i, j, node, type, lenbuf, status=0, sync=1; /* Initialize all the globals */ InitGlobal(); /* Set up handler for SIGINT and SIGCHLD */ TrapSigint(); TrapSigchld(); TrapSigterm(); /* on Solaris parallel gets SIGSEGV interrupted while polling in NxtVal */ #ifdef SOLARIS TrapSigsegv(); #endif /* Generate a name for the PROCGRP file */ filename = ProcgrpFile(argc, argv); if (DEBUG_) (void) printf("PROCGRP = %s\n",filename); /* Read in the entire contents of the PROCGRP file */ procgrp = GetProcgrp(filename, &len_procgrp); /* Parse the procgrp info filling in the ClusterInfo structure and computing the number of clusters */ if (gethostname(hostname, sizeof hostname) || strlen(hostname) == 0) Error("parallel: gethostname failed?", (long) sizeof hostname); InitClusInfo(procgrp, hostname); if (DEBUG_) PrintClusInfo(); /* I am the master process so I have the highest ids */ SR_proc_id = SR_n_proc; /* Now create the remote cluster master processes */ for (i=0; i= 0) { SR_socks[SR_nsock] = SR_proc_info[i].sock; SR_socks_proc[SR_nsock] = i; SR_nsock++; } } /* Provide the next value service ... exit gracefully when get termination message from everyone or detect error */ NextValueServer(); /* Now wait patiently for everything to finish, then close all sockets and return */ status = WaitAll(SR_n_clus); if (SR_error) status = 1; ShutdownAll(); return status; } ga-5-4/armci/tcgmsg/ipcv4.0/mitod.c0000644000175000017500000000120112662210401015036 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/mitod.c,v 1.4 1995-02-24 02:17:27 d3h325 Exp $ */ #include "sndrcv.h" /* These routines use C's knowledge of the sizes of data types to generate a portable mechanism for FORTRAN to translate between bytes, integers and doubles. Note that we assume that FORTRAN integers are the same size as C longs. */ long MITOD_(n) long *n; /* Return the minimum no. of doubles in which we can store n longs */ { if (*n < 0) Error("MITOD_: negative argument",*n); return (long) ( (MITOB_(n) + sizeof(double) - 1) / sizeof(double) ); } ga-5-4/armci/tcgmsg/ipcv4.0/pbegin.c0000644000175000017500000003704212662210401015202 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/pbegin.c,v 1.20 2005-02-22 18:47:02 manoj Exp $ */ #include #include #include #ifdef SEQUENT #include #else #include #endif #include #include #if defined(CONVEX) && defined(HPUX) #include #endif #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) \ || defined(CONVEX) || defined(AIX) || defined(NEXT) \ || defined(LINUX) #include #endif #if defined(SHMEM) || defined(SYSV) # if (defined(SGI_N32) || defined(SGITFP)) # define PARTIALSPIN # else # define NOSPIN # endif #endif #if defined(SOLARIS) /* See notes below on processor binding */ /*#include */ /*#include */ #endif #include "cluster.h" #include "sndrcv.h" #include "sndrcvP.h" #include "signals.h" #include "tcgsockets.h" #if defined(SHMEM) || defined(SYSV) #include "tcgshmem.h" #include "sema.h" #endif #ifdef EVENTLOG #include "evlog.h" #endif extern void exit(); extern void InitClusInfoNotParallel(); extern int WaitAll(long nchild); #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(CONVEX) || defined(ARDENT) || defined(ULTRIX) || defined(AIX) || \ defined(NEXT) || defined(DECOSF) extern char *strdup(); #endif #define max(A, B) ( (A) > (B) ? (A) : (B) ) #define min(A, B) ( (A) < (B) ? (A) : (B) ) #if defined(ULTRIX) || defined(SGI) || defined(NEXT) || defined(HPUX) || \ defined(KSR) || defined(DECOSF) extern void *malloc(); #else #include #endif #ifdef IPSC #define bzero(A,N) memset((A), 0, (N)) #endif static int SR_initialized=0; long TCGREADY_() { return (long)SR_initialized; } static void ConnectAll() { long j, k, clus1, clus2, node1, node2, nslave1, nslave2; for (clus1=1; clus1 < SR_n_clus; clus1++) { node1 = SR_clus_info[clus1].masterid; nslave1 = SR_clus_info[clus1].nslave; for (clus2=0; clus2 < clus1; clus2++) { node2 = SR_clus_info[clus2].masterid; RemoteConnect(node1, node2, SR_n_proc); /* connect masters */ #if defined(SHMEM) || defined(SYSV) nslave2 = SR_clus_info[clus2].nslave; for (j=1; j= argc ) Error("pbegin: -master present but not other arguments", (long) argc); break; } if ( (i+6) >= argc ) { SR_parallel = FALSE; InitClusInfoNotParallel(); SR_n_clus=1; return; } else SR_parallel = TRUE; if (DEBUG_) { (void) printf("pbegin: assign argument values\n"); (void) fflush(stdout); } masterhostname = strdup(argv[i+1]); cport = strdup(argv[i+2]); SR_n_clus = atoi(argv[i+3]); SR_n_proc = atoi(argv[i+4]); SR_clus_id = atoi(argv[i+5]); SR_proc_id = atoi(argv[i+6]); /* Check out some of this info */ if ((SR_n_clus >= MAX_CLUSTER) || (SR_n_clus < 1)) Error("pbegin: invalid no. of clusters", SR_n_clus); if ((SR_n_proc >= MAX_PROCESS) || (SR_n_proc < 1)) Error("pbegin: invalid no. of processes", SR_n_proc); if ((SR_clus_id >= SR_n_clus) || (SR_clus_id < 0)) Error("pbegin: invalid cluster id", SR_clus_id); if ((SR_proc_id >= SR_n_proc) || (SR_proc_id < 0)) Error("pbegin: invalid process id", SR_proc_id); /* Close all files we don't need. Process 0 keeps stdin/out/err. All others only stdout/err. */ if (SR_clus_id != 0) (void) fclose(stdin); #ifdef SPARC64_GP for (i=3; i<62; i++) #else for (i=3; i<64; i++) #endif (void) close((int) i); /* Connect to the master process which will have process id equal to the number of processes */ if (DEBUG_) { (void) printf("pbegin: %ld CreateSocketAndConnect\n",NODEID_()); (void) fflush(stdout); } masterid = SR_n_proc; SR_proc_info[SR_n_proc].sock = CreateSocketAndConnect(masterhostname, cport); /* Now we have initialized this info we should be able to use the standard interface routines rather than accessing the SR variables directly */ /* Get the procgrp from the master process Note that byteordering and word length start to be an issue. */ if (DEBUG_) { (void) printf("pbegin: %ld get len_pgrp\n",NODEID_()); (void) fflush(stdout); } type = TYPE_BEGIN | MSGINT; lenbuf = sizeof(long); nodesel = masterid; RCV_(&type, (char *) &len_pgrp, &lenbuf, &lenmes, &nodesel, &nodefrom, &sync); if (DEBUG_) { (void) printf("len_pgrp = %ld\n",len_pgrp); (void) fflush(stdout); } if ( (procgrp = malloc((unsigned) len_pgrp)) == (char *) NULL ) Error("pbegin: failed to allocate procgrp",len_pgrp); if (DEBUG_) { (void) printf("pbegin: %ld get progcrp len=%ld\n",NODEID_(),len_pgrp); (void) fflush(stdout); } type = TYPE_BEGIN | MSGCHR; RCV_(&type, procgrp, &len_pgrp, &lenmes, &nodesel, &nodefrom, &sync); if (DEBUG_) { (void) printf("procgrp:\n%55s...\n",procgrp); (void) fflush(stdout); (void) fflush(stdout); } /* Parse the procgrp to fill out SR_clus_info ... it also again works out SR_n_clus and SR_n_proc ... ugh */ InitClusInfo(procgrp, masterhostname); if (DEBUG_) { PrintClusInfo(); (void) fflush(stdout); } /* Change to desired working directory ... forked processes will inherit it */ if(chdir(SR_clus_info[SR_clus_id].workdir) != 0) Error("pbegin: failed to switch to work directory", (long) -1); if (DEBUG_) { printf("%2ld: pbegin: changed to working directory %s\n", NODEID_(), SR_clus_info[SR_clus_id].workdir); (void) fflush(stdout); } /* If we have more than 1 process in this cluster we have to create the shared memory and semaphores and fork the processes partitioning out the resources */ SR_using_shmem = 0; #if defined(SHMEM) || defined(SYSV) me = NODEID_(); nslave = SR_clus_info[SR_clus_id].nslave; if (nslave > 1) { SR_proc_info[me].shmem_size = nslave*SHMEM_BUF_SIZE + (nslave+1)*sizeof(long); SR_proc_info[me].shmem_size = ((SR_proc_info[me].shmem_size - 1)/4096)*4096 + 4096; if (DEBUG_) { (void) printf("pbegin: %ld allocate shmem, nslave=%ld\n", NODEID_(), nslave); (void) fflush(stdout); } SR_using_shmem = 1; SR_proc_info[me].shmem = CreateSharedRegion(&SR_proc_info[me].shmem_id, &SR_proc_info[me].shmem_size); if (DEBUG_) { (void) printf("pbegin: %ld allocate sema, nslave=%ld\n", NODEID_(), nslave); (void) fflush(stdout); } flags = (long *) (SR_proc_info[me].shmem + nslave*SHMEM_BUF_SIZE); (void) bzero(SR_proc_info[me].shmem, SR_proc_info[me].shmem_size); for (i=0; inodeto = -1; flags[i] = FALSE; } #if defined(NOSPIN) SR_proc_info[me].semid = SemSetCreate((long) 3*nslave, (long) 0); #else #ifdef KSR_NATIVE /* Bind myself to a processor */ KSR_BindProcess(0); if (DEBUG_) { (void) printf("pbegin: bound master process\n"); (void) fflush(stdout); } #endif #endif #if defined(SOLARIS) /* If there fewer processes than processors it appears beneficial to bind processes to processors. It also appears useful to leave the lowest numbered processors free (???). BUT ... this code is not general enough since the configured processors are not necessarily numbered consecutively and we also need to add logic to determine the list of processors that have not already been bound to a process. Need to also modify the code below for binding slaves and enable the include of processor.h and procset.h */ /* printf("binding master process %d to processor %d\n", getpid(), 31-0); if (processor_bind(P_PID, P_MYID, 31-0, (void *) NULL)) printf("binding to %d failed\n", 31-0); */ #endif for (i=1; i 0) SR_pids[SR_numchild++] = status; } masterid = SR_clus_info[SR_clus_id].masterid; for (i=masterid; i<(masterid+nslave); i++) { long slaveid = i - masterid; SR_proc_info[i].slaveid = slaveid; SR_proc_info[i].local = 1; SR_proc_info[i].sock = -1; SR_proc_info[i].shmem = SR_proc_info[masterid].shmem; SR_proc_info[i].shmem_size = SR_proc_info[masterid].shmem_size; SR_proc_info[i].shmem_id = SR_proc_info[masterid].shmem_id; #ifndef KSR_NATIVE SR_proc_info[i].header = (MessageHeader *) (SR_proc_info[i].shmem + slaveid * SHMEM_BUF_SIZE); /* SR_proc_info[i].header->nodeto = -1; */ SR_proc_info[i].buffer = ((char *) SR_proc_info[i].header) + sizeof(MessageHeader) + (sizeof(MessageHeader) % 8); SR_proc_info[i].buflen = SHMEM_BUF_SIZE - sizeof(MessageHeader) - (sizeof(MessageHeader) % 8); #ifdef NOSPIN SR_proc_info[i].semid = SR_proc_info[masterid].semid; SR_proc_info[i].sem_pend = 3*slaveid; SR_proc_info[i].sem_read = 3*slaveid + 1; SR_proc_info[i].sem_written = 3*slaveid + 2; #else SR_proc_info[i].semid = -1; #endif SR_proc_info[i].buffer_full = flags + slaveid; /* *SR_proc_info[i].buffer_full = FALSE;*/ #endif } #ifdef KSR_NATIVE /* Map the data structures onto the shared memory */ KSR_MapBufferSpace(masterid, nslave); if (DEBUG_) { (void) printf("pbegin: %2ld: Mapped buffer space\n", NODEID_()); (void) fflush(stdout); } #else /* Post read semaphore to make sends partially asynchronous */ #ifdef NOSPIN SemPost(SR_proc_info[me].semid, SR_proc_info[me].sem_read); #endif #endif #ifdef KSR_NATIVE /* Initialize the buffer space data structures */ KSR_InitBufferSpace(); if (DEBUG_) { (void) printf("pbegin: %2ld: Initialized buffer space\n", NODEID_()); (void) fflush(stdout); } #endif } #else if (SR_clus_info[SR_clus_id].nslave != 1) Error("pbegin: no shared memory on this host ... nslave=1 only", SR_clus_info[SR_clus_id].nslave); #endif /* Now have to connect everyone together */ ConnectAll(); /* If we are only using sockets we can block in select when waiting for a message */ SR_nsock = 0; for (i=0; i<(SR_n_proc+1); i++) { if (SR_proc_info[i].sock >= 0) { SR_socks[SR_nsock] = SR_proc_info[i].sock; SR_socks_proc[SR_nsock] = i; SR_nsock++; } } /* Synchronize timers before returning to application or logging any events */ (void) TCGTIME_(); type = TYPE_CLOCK_SYNCH; SYNCH_(&type); MtimeReset(); /* If logging events make the file events. */ #ifdef EVENTLOG if (eventfile=malloc((unsigned) 32)) { (void) sprintf(eventfile, "events.%03ld", NODEID_()); evlog(EVKEY_ENABLE, EVKEY_FILENAME, eventfile, EVKEY_BEGIN, EVENT_PROCESS, EVKEY_STR_INT, "Startup used (cs)", (int) (MTIME_()-start), EVKEY_STR_INT, "No. of processes", (int) NNODES_(), EVKEY_DISABLE, EVKEY_LAST_ARG); (void) free(eventfile); SYNCH_(&type); } #endif if (DEBUG_) { printf("pbegin: %2ld: Returning to application\n",NODEID_()); fflush(stdout); } } void PEND_() /* Call this to tidy up after parallel section. The cluster master is responsible for tidying up any shared memory/semaphore resources. Everyone else can just quit. Woops ... everyone should return so that FORTRAN can tidy up after itself. */ { long me = NODEID_(); long masterid = SR_clus_info[SR_clus_id].masterid; long nslave = SR_clus_info[SR_clus_id].nslave; long zero = 0; long status; #ifdef EVENTLOG long start=MTIME_(); #endif SR_initialized = 0; if (!SR_parallel) return; (void) signal(SIGCHLD, SIG_DFL); /* Death of children now OK */ (void) NXTVAL_(&zero); /* Send termination flag to nxtval server */ if (me != masterid) status = 0; else { status = WaitAll(nslave-1); /* Wait for demise of children */ #if defined(SHMEM) || defined(SYSV) if (nslave > 1) { #if defined(NOSPIN) (void) SemSetDestroyAll(); /* Ex the semaphores and shmem */ #endif (void) DeleteSharedRegion(SR_proc_info[me].shmem_id); } #endif } ShutdownAll(); /* Close sockets for machines with static kernel */ /* If logging events log end of process and dump trace */ #ifdef EVENTLOG evlog(EVKEY_ENABLE, EVKEY_END, EVENT_PROCESS, EVKEY_STR_INT, "Time (cs) waiting to finish", (int) (MTIME_()-start), EVKEY_DUMP, EVKEY_LAST_ARG); #endif /* Return to calling program unless we had an error */ if (status) exit((int) status); } void tcgi_alt_pbegin(int *argc, char **argv[]) { tcgi_pbegin(*argc, *argv); } ga-5-4/armci/tcgmsg/ipcv4.0/tcgshmem.h0000644000175000017500000000301612662210401015544 0ustar mbamba/* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/shmem.h,v 1.4 1995-02-24 02:17:44 d3h325 Exp $ */ /* Header file which declares stubs for the shared memory interface. Note that the input arguments switch between integers and pointers to integers depending on if they are modified on return. */ /* Create a shared region of at least size bytes, returning the actual size, the id associated with the region. The return vaue is a pointer to the the region. Any error is a hard fail. (char *) CreateSharedRegion((long *) id, (long *) size) */ extern char *CreateSharedRegion(); /* Detach a process from a shared memory region. 0 is returned on success, -1 for failure. id, size, and addr much match exactly those items returned from CreateSharedRegion long DetachSharedRegion((long) id, (long) size, (char *) addr) */ extern long DetachSharedRegion(); /* Delete a shared region from the system. This has to be done on the SUN to remove it from the system. On the Alliant the shared region disappears when the last process dies or detaches. Returns 0 on success, -1 on error. long DeleteSharedRegion( (long) id) */ extern long DeleteSharedRegion(); /* Attach to a shared memory region of known id and size. Returns the address of the mapped memory. Size must exactly match the size returned from CreateSharedRegion (which in turn is the requested size rounded up to a multiple of 4096). Any error is a hard fail. (char *) AttachSharedRegion( (long) id, (long) size)) */ extern char *AttachSharedRegion(); ga-5-4/armci/tcgmsg/ipcv4.0/nxtval.c0000644000175000017500000001072312662210401015247 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/nxtval.c,v 1.6 2004-04-01 02:04:57 manoj Exp $ */ #include #include #include #include #include "sndrcvP.h" #include "sndrcv.h" jmp_buf SR_jmp_buf; /* Jumped to on soft error */ void NextValueServer() /* This runs as process SR_n_proc and provides load balancing service. */ { long cnt = 0; /* actual counter */ long lencnt = sizeof cnt; /* length of cnt */ long ndone = 0; /* no. finished for this loop */ long ntermin = 0; /* no. terminated so far (pend) */ long node = -1; /* select any node */ long type = TYPE_NXTVAL; /* message type */ long buf[2]; /* buffer to get values */ long lenbuf = sizeof buf; /* length of buffer */ long mproc; /* no. of processes running loop */ long nval; /* no. of values requested */ long done_list[MAX_PROCESS]; /* list of processes finished with this loop */ long sync = 1; /* all info goes synchronously */ long on=0; long lenmes, nodefrom; SR_exit_on_error = FALSE; /* Want to return no matter what */ if (setjmp(SR_jmp_buf)) { /* Error should long jump to here */ /* (void) printf("Error long jumped to NXTVAL ... returning.\n"); */ SR_exit_on_error = TRUE; return; } SETDBG_(&on); while (1) { /* Wait for input from any node */ RCV_(&type, (char *) buf, &lenbuf, &lenmes, &node, &nodefrom, &sync); if (lenmes != lenbuf) { Error("NextValueServer: lenmes != lenbuf", lenmes); return; /* Never actually gets here as does long jump */ } mproc = buf[0]; nval = buf[1]; if (DEBUG_) (void) printf("NVS: from=%ld, mproc=%ld, ndone=%ld, ntermin=%ld\n", nodefrom, mproc, ndone, ntermin); if (mproc == 0) { /* Sending process is about to terminate. Send reply and disable sending to him. If all processes have finished return. Modified so that all processes block on waiting for message from nxtval server before terminating. nxtval only lets everyone go when all have registered termination. This is so that processes do not close their sockets while another process is doing a RCV from any node (which results in an unavoidable error condition). */ if (++ntermin == NNODES_()) { (void) signal(SIGCHLD, SIG_DFL); /* Will be dying naturally */ for (node=0; node 0) { /* This is what we are here for */ SND_(&type, (char *) &cnt, &lencnt, &nodefrom, &sync); cnt += nval; } else if (mproc < 0) { /* This process has finished the loop. Wait until all mproc processes have finished before releasing it */ done_list[ndone++] = nodefrom; if (ndone == -mproc) { while (ndone--) { nodefrom = done_list[ndone]; SND_(&type, (char *) &cnt, &lencnt, &nodefrom, &sync); } cnt = 0; ndone = 0; } } } } long NXTVAL_(mproc) long *mproc; /* Get next value of shared counter. mproc > 0 ... returns requested value mproc < 0 ... server blocks until abs(mproc) processes are queued and returns junk mproc = 0 ... indicates to server that I am about to terminate this needs to be extended so that clusters of processes with shared memory collectively get a bunch of values from the server thus reducing the overhead of calling nextvalue. */ { long server = NNODES_(); /* id of server process */ long buf[2]; long lenbuf = sizeof buf; long type = TYPE_NXTVAL; long lenmes, nodefrom; long sync = 1; long result=0; if (SR_parallel) { buf[0] = *mproc; buf[1] = 1; if (DEBUG_) { (void) printf("%2ld: nxtval: mproc=%ld\n",NODEID_(), *mproc); (void) fflush(stdout); } SND_(&type, (char *) buf, &lenbuf, &server, &sync); RCV_(&type, (char *) buf, &lenbuf, &lenmes, &server, &nodefrom, &sync); result = buf[0]; } else { /* Not running in parallel ... just do a simulation */ static int count = 0; if (*mproc == 1) result = count++; else if (*mproc == -1) { count = 0; result = 0; } else Error("nxtval: sequential version with silly mproc ", (long) *mproc); } return result; } ga-5-4/armci/tcgmsg/ipcv4.0/shmem_alliant.c0000644000175000017500000000354112662210401016550 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_MALLOC_H # include #endif char *CreateSharedRegion(long *id, long *size) { struct timeval tp; struct timezone tzp; char *temp; int status; /* Have to round up to a multiple of page size before allocating on a page boundary */ *size = ( (*size + 4095) / 4096 ) * 4096; if ( (temp = valloc((unsigned) *size)) == (char *) NULL) { Error("CreateSharedRegion: failed in valloc", (long) 0); } /* Now have to get a unique id ... try using time of day in centi-sec */ if ( (status = gettimeofday(&tp, &tzp)) != 0) { Error("CreateSharedRegion: error from gettimeofday", (long) status); } *id = (tp.tv_sec + 10000*tp.tv_usec) & 0xffffff; /* Now make the region */ if ( (status = create_shared_region(*id, temp, *size, 0)) != 0) { Error("CreateSharedRegion: error from create_shared_region", (long) status); } return temp; } long DetachSharedRegion(long id, long size, char *addr) { return detach_shared_region( id, addr, size); } long DeleteSharedRegion(long id) { return delete_shared_region(id); } char *AttachSharedRegion(long id, long size) { char *temp; int status; if (size != (((size + 4095) / 4096) * 4096)) { Error("AttachSharedRegion: input size is not multiple of 4096", (long) size); } if ( (temp = valloc((unsigned) size)) == (char *) NULL) { Error("AttachSharedRegion: failed in valloc", (long) 0); } /* Now try to attach */ if ( (status = attach_shared_region(id, temp, size)) != 0) { Error("AttachSharedRegion: error from attach_shared_region", (long) status); } return temp; } ga-5-4/armci/tcgmsg/ipcv4.0/waitcom.c0000644000175000017500000000047112662210401015375 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/waitcom.c,v 1.3 1995-02-24 02:18:06 d3h325 Exp $ */ #include "sndrcv.h" /*ARGSUSED*/ void WAITCOM_(node) long *node; /* Wait for async communications to complete ... null operation in the UNIX environment */ { } ga-5-4/armci/tcgmsg/ipcv4.0/mitob.c0000644000175000017500000000112012662210401015034 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/mitob.c,v 1.4 1995-02-24 02:17:26 d3h325 Exp $ */ #include "sndrcv.h" /* These routines use C's knowledge of the sizes of data types to generate a portable mechanism for FORTRAN to translate between bytes, integers and doubles. Note that we assume that FORTRAN integers are the same size as C longs. */ long MITOB_(n) long *n; /* Return the no. of bytes that n ints=longs occupy */ { if (*n < 0) Error("MITOB_: negative argument",*n); return (long) (*n * sizeof(long)); } ga-5-4/armci/tcgmsg/ipcv4.0/brdcst.c0000644000175000017500000000405212662210401015212 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/brdcst.c,v 1.6 2002-07-17 17:20:11 vinod Exp $ */ #include "sndrcv.h" #include #include "sndrcvP.h" void BRDCST_(type, buf, lenbuf, originator) long *type; void *buf; long *lenbuf; long *originator; /* broadcast buffer to all other processes from process originator ... all processes call this routine specifying the same orginating process. Optimized for communicating clusters of processes ... broadcast amoung cluster masters, and then amoung slaves in a cluster. */ { long me = NODEID_(); long master = SR_clus_info[SR_clus_id].masterid; long nslave = SR_clus_info[SR_clus_id].nslave; long slaveid = me - master; long synch = 1; long lenmes, from, up, left, right; /* Process zero is at the top of the broadcast tree */ if ((me == *originator) && (me != 0)) { long zero = 0; SND_(type, buf, lenbuf, &zero, &synch); } else if ((*originator != 0) && (me == 0)) { RCV_(type, buf, lenbuf, &lenmes, originator, &from, &synch); } if ((*originator != 0) && (SR_n_proc == 2)) return; /* Special case */ /* Broadcast amoung cluster masters */ if (me == master) { up = (SR_clus_id-1)/2; left = 2*SR_clus_id + 1; right = 2*SR_clus_id + 2; up = SR_clus_info[up].masterid; left = (left < SR_n_clus) ? SR_clus_info[left].masterid : -1; right = (right < SR_n_clus) ? SR_clus_info[right].masterid : -1; if (me != 0) RCV_(type, buf, lenbuf, &lenmes, &up, &from, &synch); if (left > 0) SND_(type, buf, lenbuf, &left, &synch); if (right > 0) SND_(type, buf, lenbuf, &right, &synch); } /* Broadcast amoung local slaves */ up = master + (slaveid-1)/2; left = master + 2*slaveid + 1; right = master + 2*slaveid + 2; if (me != master) RCV_(type, buf, lenbuf, &lenmes, &up, &from, &synch); if (left < (master+nslave)) SND_(type, buf, lenbuf, &left, &synch); if (right < (master+nslave)) SND_(type, buf, lenbuf, &right, &synch); } ga-5-4/armci/tcgmsg/ipcv4.0/mdtoi.c0000644000175000017500000000117412662210401015047 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/mdtoi.c,v 1.4 1995-02-24 02:17:24 d3h325 Exp $ */ #include "sndrcv.h" /* These routines use C's knowledge of the sizes of data types to generate a portable mechanism for FORTRAN to translate between bytes, integers and doubles. Note that we assume that FORTRAN integers are the same size as C longs. */ long MDTOI_(n) long *n; /* Return the minimum no. of integers which will hold n doubles. */ { if (*n < 0) Error("MDTOI_: negative argument",*n); return (long) ( (MDTOB_(n) + sizeof(long) - 1) / sizeof(long) ); } ga-5-4/armci/tcgmsg/ipcv4.0/globalop.c0000644000175000017500000002054112662210401015531 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/globalop.c,v 1.8 2004-04-01 02:04:56 manoj Exp $ */ #include #ifdef SEQUENT #include #else #include #endif #include "sndrcv.h" #include "msgtypesc.h" #define TCG_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define TCG_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define TCG_ABS(a) (((a) >= 0) ? (a) : (-(a))) extern void free(); #ifndef IPSC #include "sndrcvP.h" #define GOP_BUF_SIZE 81920 static void idoop(n, op, x, work) long n; char *op; long *x, *work; { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = TCG_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = TCG_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else Error("idoop: unknown operation requested", (long) n); } static void ddoop(n, op, x, work) long n; char *op; double *x, *work; { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = TCG_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = TCG_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = TCG_ABS(*x), x2 = TCG_ABS(*work); *x = TCG_MIN(x1, x2); x++; work++; } else Error("ddoop: unknown operation requested", (long) n); } /*ARGSUSED*/ void DGOP_(ptype, x, pn, op, len) double *x; long *ptype, *pn; char *op; int len; /* Global summation optimized for networks of clusters of processes. This routine is directly callable from C only. There is a wrapper that makes fortran work (see bottom of this file). */ { long me = NODEID_(); long master = SR_clus_info[SR_clus_id].masterid; long nslave = SR_clus_info[SR_clus_id].nslave; long slaveid = me - master; long synch = 1; long type = (*ptype & MSGDBL) ? *ptype : *ptype + MSGDBL; long nleft = *pn; long buflen = TCG_MIN(nleft,GOP_BUF_SIZE); /* Try to get even sized buffers */ long nbuf = (nleft-1) / buflen + 1; long zero = 0; double *tmp = x; double *work; long nb, ndo, lenmes, from, up, left, right; buflen = (nleft-1) / nbuf + 1; if (!(work = (double *) malloc((unsigned) (buflen*sizeof(double))))) Error("DGOP: failed to malloc workspace", nleft); /* This loop for pipelining and to avoid caller having to provide workspace */ while (nleft) { ndo = TCG_MIN(nleft, buflen); nb = ndo * sizeof(double); /* Do summation amoung slaves in a cluster */ up = master + (slaveid-1)/2; left = master + 2*slaveid + 1; right = master + 2*slaveid + 2; if (left < (master+nslave)) { RCV_(&type, (char *) work, &nb, &lenmes, &left, &from, &synch); ddoop(ndo, op, x, work); } if (right < (master+nslave)) { RCV_(&type, (char *) work, &nb, &lenmes, &right, &from, &synch); ddoop(ndo, op, x, work); } if (me != master) SND_(&type, (char *) x, &nb, &up, &synch); /* Do summation amoung masters */ if (me == master) { up = (SR_clus_id-1)/2; left = 2*SR_clus_id + 1; right = 2*SR_clus_id + 2; up = SR_clus_info[up].masterid; left = (left < SR_n_clus) ? SR_clus_info[left].masterid : -1; right = (right < SR_n_clus) ? SR_clus_info[right].masterid : -1; if (left > 0) { RCV_(&type, (char *) work, &nb, &lenmes, &left, &from, &synch); ddoop(ndo, op, x, work); } if (right > 0) { RCV_(&type, (char *) work, &nb, &lenmes, &right, &from, &synch); ddoop(ndo, op, x, work); } if (me != 0) SND_(&type, (char *) x, &nb, &up, &synch); } nleft -= ndo; x += ndo; type += 13; /* Temporary hack for hippi switch */ } free((char *) work); /* Zero has the results ... broadcast them back */ nb = *pn * sizeof(double); BRDCST_(&type, (char *) tmp, &nb, &zero); } void IGOP_(ptype, x, pn, op, len) long *x; long *ptype, *pn; char *op; int len; /* Global summation optimized for networks of clusters of processes. This routine is directly callable from C only. There is a wrapper that makes fortran work (see the bottom of this file). */ { long me = NODEID_(); long master = SR_clus_info[SR_clus_id].masterid; long nslave = SR_clus_info[SR_clus_id].nslave; long slaveid = me - master; long synch = 1; long type = (*ptype & MSGINT) ? *ptype : *ptype + MSGINT; long nleft = *pn; long zero = 0; long *tmp = x; long *work; long nb, ndo, lenmes, from, up, left, right; if (!(work = (long *) malloc((unsigned) (TCG_MIN(nleft,GOP_BUF_SIZE)*sizeof(long))))) Error("IGOP: failed to malloc workspace", nleft); /* This loop for pipelining and to avoid caller having to provide workspace */ while (nleft) { ndo = TCG_MIN(nleft, GOP_BUF_SIZE); nb = ndo * sizeof(long); /* Do summation amoung slaves in a cluster */ up = master + (slaveid-1)/2; left = master + 2*slaveid + 1; right = master + 2*slaveid + 2; if (left < (master+nslave)) { RCV_(&type, (char *) work, &nb, &lenmes, &left, &from, &synch); idoop(ndo, op, x, work); } if (right < (master+nslave)) { RCV_(&type, (char *) work, &nb, &lenmes, &right, &from, &synch); idoop(ndo, op, x, work); } if (me != master) SND_(&type, (char *) x, &nb, &up, &synch); /* Do summation amoung masters */ if (me == master) { up = (SR_clus_id-1)/2; left = 2*SR_clus_id + 1; right = 2*SR_clus_id + 2; up = SR_clus_info[up].masterid; left = (left < SR_n_clus) ? SR_clus_info[left].masterid : -1; right = (right < SR_n_clus) ? SR_clus_info[right].masterid : -1; if (left > 0) { RCV_(&type, (char *) work, &nb, &lenmes, &left, &from, &synch); idoop(ndo, op, x, work); } if (right > 0) { RCV_(&type, (char *) work, &nb, &lenmes, &right, &from, &synch); idoop(ndo, op, x, work); } if (me != 0) SND_(&type, (char *) x, &nb, &up, &synch); } nleft -= ndo; x += ndo; type += 13; /* Temporary hack for hippi switch */ } (void) free((char *) work); /* Zero has the results ... broadcast them back */ nb = *pn * sizeof(long); BRDCST_(&type, (char *) tmp, &nb, &zero); } #endif /* Wrapper for fortran interface ... UGH ... note that string comparisons above do NOT rely on NULL termination of the operation character string */ #ifdef CRAY #include #endif #ifdef ARDENT struct char_desc { char *string; int len; }; #endif /*ARGSUSED*/ #if defined(CRAY) || defined(CRAY) #ifdef ARDENT void dgop_(ptype, x, pn, arg) long *ptype, *pn; double *x; struct char_desc *arg; { char *op = arg->string; int len_op = arg->len; #endif #if defined(CRAY) void dgop_(ptype, x, pn, arg) long *ptype, *pn; double *x; _fcd arg; { char *op = _fcdtocp(arg); int len_op = _fcdlen(arg); #endif DGOP_(ptype, x, pn, op); } #endif /* This crap to handle FORTRAN character strings */ /*ARGSUSED*/ #if defined(CRAY) || defined(CRAY) #ifdef ARDENT void igop_(ptype, x, pn, arg) long *ptype, *pn; long *x; struct char_desc *arg; { char *op = arg->string; int len_op = arg->len; #endif #if defined(CRAY) void igop_(wrap_ptype, x, wrap_pn, arg) long *wrap_ptype, *wrap_pn; long *x; _fcd arg; { long ptype, pn; ptype = (long) *ptype; char *op = _fcdtocp(arg); int len_op = _fcdlen(arg); #endif IGOP_(ptype, x, pn, op); } #endif ga-5-4/armci/tcgmsg/ipcv4.0/usleep.c0000644000175000017500000000151712662210401015231 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/usleep.c,v 1.3 1995-02-24 02:18:03 d3h325 Exp $ */ #ifdef AIX #include #include #endif #include #include #ifdef STUPIDUSLEEP void USleep(us) long us; { int s = us/1000000; if (s == 0) s = 1; (void) sleep(s); } #else void USleep(us) long us; /* Sleep for the specified no. of micro-seconds ... uses the timeout on select ... it seems to be accurate to about a few centiseconds on a sun. I don't know how much system resources it eats. */ { int width=0; struct timeval timelimit; timelimit.tv_sec = (int) (us/1000000); timelimit.tv_usec = (int) (us - timelimit.tv_sec*1000000); (void) select(width, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &timelimit); } #endif ga-5-4/armci/tcgmsg/ipcv4.0/nnodes.c0000644000175000017500000000041112662210401015212 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/nnodes.c,v 1.4 1995-02-24 02:17:30 d3h325 Exp $ */ #include "sndrcv.h" #include "sndrcvP.h" long NNODES_() /* return total no. of processes */ { return SR_n_proc; } ga-5-4/armci/tcgmsg/ipcv4.0/sema_alliant.c0000644000175000017500000001225512662210401016366 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* These routines simplify the interface to semaphores for use in mutual exclusion and queuing. Hopefully I can also make this portable. An external routine Error is assumed which is called upon an error and tidies up by calling SemSetDestroyAll. In most cases errors cause an internal hard failure (by calling Error). 1) make an array of n_sem semaphores, returning the id associated with the entire set. All the semaphore values are initialized to value which should be a positve integer (queuing) or 0 (synchronization). The semaphores in the set are indexed from 0 to n_sem-1. long SemSetCreate(long n_sem, long value) 2) Decrement and test the value associated with the semaphore specified by (sem_set_id, sem_num). In effect this: if (value >= 0) { continue execution } else { wait in queue for the semaphore } decrement value void SemWait(long sem_set_id, long sem_num) 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern void Error(); /************************************************************* Alliant Concentrix 5.0 and Concentrix FX/2800 *************************************************************/ /* This is very specific to the Alliant. */ #include #include extern int errno; /* On the alliant semaphores are handed out one at a time rather than in sets, so have to maintain sets manually */ #define MAX_SEM_SETS 20 #define MAX_N_SEM 128 static struct sem_set_list_struct { int id[MAX_N_SEM]; /* alliant semaphore id */ int n_sem; /* no. of semaphores in set */ } sem_set_list[MAX_SEM_SETS]; static int num_sem_set = 0; void InitSemSetList() /* Initialise sem_set_list */ { int i, j; for (i=0; i= MAX_N_SEM) ) Error("SemSetCreate: n_sem has invalid value", (long) n_sem); if (num_sem_set == 0) InitSemSetList(); else if (num_sem_set >= MAX_SEM_SETS) Error("SemSetCreate: Exceeded man no. of semaphore sets", (long) num_sem_set); /* Find first empty slot in sem_set_list */ for (i=0; i < MAX_SEM_SETS; i++) if (sem_set_list[i].n_sem == 0) break; if (i == MAX_SEM_SETS) Error("SemSetCreate: internal error puting semid in list", (long) i); /* Actually make the semaphore set */ for (j=0; j= 0) { continue execution } else { wait in queue for the semaphore } void SemWait(long sem_set_id, long sem_num) */ extern void SemWait(); /* 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) */ extern void SemPost(); /* 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) */ extern long SemValue(); /* 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) */ extern long SemSetDestroy(); /* 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern long SemSetDestroyAll(); ga-5-4/armci/tcgmsg/ipcv4.0/sema_convex.c0000644000175000017500000001610512662210401016242 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* These routines simplify the interface to semaphores for use in mutual exclusion and queuing. Hopefully I can also make this portable. An external routine Error is assumed which is called upon an error and tidies up by calling SemSetDestroyAll. In most cases errors cause an internal hard failure (by calling Error). 1) make an array of n_sem semaphores, returning the id associated with the entire set. All the semaphore values are initialized to value which should be a positve integer (queuing) or 0 (synchronization). The semaphores in the set are indexed from 0 to n_sem-1. long SemSetCreate(long n_sem, long value) 2) Decrement and test the value associated with the semaphore specified by (sem_set_id, sem_num). In effect this: if (value >= 0) { continue execution } else { wait in queue for the semaphore } decrement value void SemWait(long sem_set_id, long sem_num) 3) Increment the value associated with the semaphore specified by (sem_set_id, sem_num). If value <= 0 (i.e. there are processes in the queue) this releases the next process. void SemPost(long sem_set_id, long sem_num) 4) Return the current value associated with the semaphore sepcified by (sem_set_id, sem_num). long SemValue(long sem_set_id, long sem_num) 5) Destroy the set of semaphores. Any other processes that are accessing or try to access the semaphore set should get an error. On the SUN (all system V machines?) the semaphore sets should be destroyed explicitly before the final process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroy(long sem_set_id) 6) Destroy all the semaphore sets that are known about. This is really meant for an error routine to call to try and tidy up. Though all applications could call it before the last process exits. 0 is returned if OK. -1 implies an error. long SemSetDestroyAll() */ extern void Error(); #include #include #include #include #include #define MAX_SEM_SETS 20 #define MAX_N_SEM 100 /* On the convex a semaphore is a structure but on the apollo it is an array which does not need dereferencing. Use ADDR to generate the address of a semaphore */ #ifdef APOLLO #define ADDR(x) x #else #define ADDR(x) &x #endif extern char *mktemp(); struct sem_set_struct { int n_sem; /* no. of semaphores in set */ semaphore lock[MAX_N_SEM]; /* locks for changing value */ semaphore wait[MAX_N_SEM]; /* locks for queing */ int value[MAX_N_SEM]; /* values */ }; static int num_sem_set = 0; static struct sem_set_struct *sem_sets; static int fd = -1; static char template[] = "/tmp/SEMA.XXXXXX"; static char *filename = (char *) NULL; void InitSemSets() /* Initialise sem_sets and allocate associated shmem region */ { int i, j; unsigned size = sizeof(struct sem_set_struct) * MAX_SEM_SETS; #ifndef APOLLO /* Generate scratch file to identify region ... mustn't do this on the APOLLO */ filename = mktemp(template); if ( (fd = open(filename, O_RDWR|O_CREAT, 0666)) < 0 ) Error("InitSemSets: failed to open temporary file",0); #endif sem_sets = (struct sem_set_struct *) mmap((caddr_t) 0, &size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_HASSEMAPHORE|MAP_SHARED, fd, 0); #ifdef APOLLO if (sem_sets == (struct sem_set_struct *) 0) Error("InitSemSets: mmap failed", (long) -1); #else if (sem_sets == (struct sem_set_struct *) -1) Error("InitSemSets: mmap failed", (long) -1); #endif for (i=0; i= MAX_N_SEM) ) Error("SemSetCreate: n_sem has invalid value",n_sem); if (num_sem_set == 0) InitSemSets(); else if (num_sem_set >= MAX_SEM_SETS) Error("SemSetCreate: Exceeded man no. of semaphore sets", num_sem_set); /* Initialize the values */ for (i=0; i= num_sem_set) ) Error("SemWait: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemWait: invalid semaphore number in set",sem_num); while (1) { /* Get the lock around the whole semaphore */ (void) mset(ADDR(sem_sets[sem_set_id].lock[sem_num]), 1); /* If the value is positive fall thru, else wait */ if (sem_sets[sem_set_id].value[sem_num] > 0) break; else { (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); (void) mset(ADDR(sem_sets[sem_set_id].wait[sem_num]), 1); } } /* Are ready to go ... decrement the value and release lock */ sem_sets[sem_set_id].value[sem_num]--; (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); } void SemPost(sem_set_id, sem_num) long sem_set_id; long sem_num; { int i; if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) Error("SemPost: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemPost: invalid semaphore number in set",sem_num); /* Get the lock around the whole semaphore */ (void) mset(ADDR(sem_sets[sem_set_id].lock[sem_num]), 1); /* Read and increment the value. If is now zero wake up up the queue */ sem_sets[sem_set_id].value[sem_num]++; i = sem_sets[sem_set_id].value[sem_num]; (void) mclear(ADDR(sem_sets[sem_set_id].lock[sem_num])); if (i >= 0) (void) mclear(ADDR(sem_sets[sem_set_id].wait[sem_num])); } long SemValue(sem_set_id, sem_num) long sem_set_id; long sem_num; { int i; if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) Error("SemValue: invalid sem_set_id",sem_set_id); if ( (sem_num < 0) || (sem_num >= sem_sets[sem_set_id].n_sem) ) Error("SemValue: invalid semaphore number in set",sem_num); /* There seems no point in getting the lock just to read the value and it seems more useful not to (e.g. debugging) */ i = sem_sets[sem_set_id].value[sem_num]; return (long) (i-1); } long SemSetDestroy(sem_set_id) long sem_set_id; { if ( (sem_set_id < 0) || (sem_set_id >= num_sem_set) ) return -1; sem_sets[sem_set_id].n_sem = 0; return (long) 0; } long SemSetDestroyAll() { long i, status=0; for (i=0; i= 0) { (void) close(fd); fd = -1; (void) unlink(filename); } status += munmap((char *) sem_sets, 0); if (status) status = -1; return status; } ga-5-4/armci/tcgmsg/ipcv4.0/mtime.c0000644000175000017500000000424712662210401015052 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/mtime.c,v 1.4 1995-02-24 02:17:28 d3h325 Exp $ */ #include #include "sndrcv.h" long MTIME_() /* return wall clock time in centiseconds */ { return (long) (TCGTIME_()*100.0); } #if !(defined(KSR) || defined(ALLIANT)) #include #include static unsigned firstsec=0; /* Reference for timer */ static unsigned firstusec=0; /* Reference for timer */ void MtimeReset() /* Sets timer reference */ { struct timeval tp; struct timezone tzp; (void) gettimeofday(&tp,&tzp); firstsec = tp.tv_sec; firstusec = tp.tv_usec; } double TCGTIME_() /* Return wall clock time in seconds as accurately as possible */ { static int firstcall=1; double low, high; struct timeval tp; struct timezone tzp; if (firstcall) { MtimeReset(); firstcall = 0; } (void) gettimeofday(&tp,&tzp); low = (double) (tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); } #endif #ifdef KSR static double firsttime = 0; static double KSRTime() { long time; #pragma setregval (time, i12) /* Read timer */ asm("finop; movb8_8 %x_all_timer,%i12"); asm("finop; cxnop"); asm("finop; cxnop"); return(time * 4.0e-7); } double TCGTIME_() /* Return wall clock time in seconds as accurately as possible */ { static int firstcall = 1; if (firstcall) { firstcall = 0; MtimeReset(); } return KSRTime() - firsttime; } void MtimeReset() /* Sets timer reference */ { firsttime = KSRTime(); } #endif #ifdef ALLIANT #include struct hrcval firsttime; void MtimeReset() { hrcstamp(&firsttime); } double TCGTIME_() { double low, high; struct hrcval current; static int firstcall = 1; if (firstcall) { firstcall = 0; MtimeReset(); } hrcstamp(¤t); /* Lose a bit but does this avoid the roll problem ? */ low = (double) (current.hv_low>>1) - (double) (firsttime.hv_low>>1); high = (double) (current.hv_high - firsttime.hv_high); return (high*4294967296e-6+ 2.0*low) * 0.997e-5; } #endif ga-5-4/armci/tcgmsg/srftoc.h0000644000175000017500000000320212662210402014050 0ustar mbamba/** @file This header file provides definitions for c for the names of the c message passing routines accessible from FORTRAN. It need not be included directly in user c code, assuming that sndrcv.h has already. It is needed as the FORTRAN naming convention varies between machines and it is the FORTRAN interface that is portable, not the c interface. However by coding with the macro defnition names c portability is ensured. */ #ifndef SRFTOC_H_ #define SRFTOC_H_ #define BRDCST_ armci_tcgmsg_brdcst #define DGOP_ armci_tcgmsg_dgop #define DRAND48_ armci_tcgmsg_drand48 #define IGOP_ armci_tcgmsg_igop #define LLOG_ armci_tcgmsg_llog #define MDTOB_ armci_tcgmsg_mdtob #define MDTOI_ armci_tcgmsg_mdtoi #define MITOB_ armci_tcgmsg_mitob #define MITOD_ armci_tcgmsg_mitod #define MTIME_ armci_tcgmsg_mtime #define NICEFTN_ armci_tcgmsg_niceftn #define NNODES_ armci_tcgmsg_nnodes #define NODEID_ armci_tcgmsg_nodeid #define NXTVAL_ armci_tcgmsg_nxtval #define PARERR_ armci_tcgmsg_parerr #define PBEGINF_ armci_tcgmsg_pbeginf #define PBGINF_ armci_tcgmsg_pbginf #define PEND_ armci_tcgmsg_pend #define PFCOPY_ armci_tcgmsg_pfcopy #define PFILECOPY_ armci_tcgmsg_pfilecopy #define PROBE_ armci_tcgmsg_probe #define RCV_ armci_tcgmsg_rcv #define SETDBG_ armci_tcgmsg_setdbg #define SND_ armci_tcgmsg_snd #define SRAND48_ armci_tcgmsg_srand48 #define STATS_ armci_tcgmsg_stats #define SYNCH_ armci_tcgmsg_synch #define TCGREADY_ armci_tcgmsg_tcgready #define TCGTIME_ armci_tcgmsg_tcgtime #define WAITCOM_ armci_tcgmsg_waitcom #endif /* SRFTOC_H_ */ ga-5-4/armci/config.h.in0000644000175000017500000004265612662210417013164 0ustar mbamba/* config.h.in. Generated from configure.ac by autoheader. */ /* TODO */ #undef ACC_SMP /* TODO */ #undef ALLOC_MUNMAP /* TODO */ #undef ALLOW_PIN /* Defined when using DCMF */ #undef ARMCIX /* upper bound for ARMCI_DEFAULT_SHMMAX environment variable */ #undef ARMCI_DEFAULT_SHMMAX_UBOUND /* Define to 1 if GPC calls are enabled */ #undef ARMCI_ENABLE_GPC_CALLS /* TODO */ #undef ARMCI_GROUP /* Define if profiling is enabled */ #undef ARMCI_PROFILE /* Define to 1 on BlueGene/L systems */ #undef BGL /* TODO */ #undef BGML /* Define to 1 on BlueGene/P systems */ #undef BGP /* Define to 1 on Cray XT systems using Catamount */ #undef CATAMOUNT /* TODO */ #undef CLUSTER /* TODO */ #undef CRAY_SHMEM /* Define to 1 on Cray SV1 systems */ #undef CRAY_SV1 /* Define to 1 on Cray SV2 systems */ #undef CRAY_SV2 /* Define to 1 on Cray T3E systems */ #undef CRAY_T3E /* for Gemini */ #undef CRAY_UGNI /* TODO */ #undef CRAY_XT /* Define to 1 on Cray YMP systems */ #undef CRAY_YMP /* Define to 1 on Cygnus systems */ #undef CYGNUS /* Define to 1 on Cygwin systems */ #undef CYGWIN /* TODO */ #undef DATA_SERVER /* Defined when using DCMF */ #undef DCMF /* Define to 1 on DEC OSF */ #undef DECOSF /* TODO */ #undef DOELAN4 /* Define if checkpointing is enabled */ #undef ENABLE_CHECKPOINT /* Define if tracing is enabled */ #undef ENABLE_TRACE /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP64 /* CPP symbol for function name, if available */ #undef FUNCTION_NAME /* for Gemini */ #undef GEMINI /* TODO */ #undef GM /* set to 1 if ARMCI has armci_group_comm function */ #undef HAVE_ARMCI_GROUP_COMM /* set to 1 if ARMCI has ARMCI_Group.comm member */ #undef HAVE_ARMCI_GROUP_COMM_MEMBER /* set to 1 if ARMCI has ARMCI_Initialized function */ #undef HAVE_ARMCI_INITIALIZED /* set to 1 if ARMCI has armci_msg_finalize function */ #undef HAVE_ARMCI_MSG_FINALIZE /* set to 1 if ARMCI has armci_msg_init function */ #undef HAVE_ARMCI_MSG_INIT /* set to 1 if ARMCI has armci_notify function */ #undef HAVE_ARMCI_NOTIFY /* set to 1 if ARMCI has armci_stride_info_init function */ #undef HAVE_ARMCI_STRIDE_INFO_INIT /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the header file. */ #undef HAVE_C_ASM_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the `fastbcopy' function. */ #undef HAVE_FASTBCOPY /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the 'floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `ftruncate' function. */ #undef HAVE_FTRUNCATE /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_IA64_SYS_INLINE_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_MPP_SHMEM_H /* Define to 1 if you have the `munmap' function. */ #undef HAVE_MUNMAP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_TCP_H /* set to 1 if libonesided has onesided_fadd (added in v1.6) */ #undef HAVE_ONESIDED_FADD /* set to 1 if libonesided has onesided_mem_htflush (added in v1.5) */ #undef HAVE_ONESIDED_MEM_HTFLUSH /* Define to 1 if you have the 'pow' function. */ #undef HAVE_POW /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H /* Define to 1 if you have the `pthread_getconcurrency' function. */ #undef HAVE_PTHREAD_GETCONCURRENCY /* Define to 1 if you have the `pthread_setconcurrency' function. */ #undef HAVE_PTHREAD_SETCONCURRENCY /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if you have the header file. */ #undef HAVE_RPC_RPC_H /* Define to 1 if you have the header file. */ #undef HAVE_RPC_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_RPC_XDR_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the header file. */ #undef HAVE_SETJMP_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the 'sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ATOMIC_OP_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IPC_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SEM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SHM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCALL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMCFG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define this if weak aliases may be created with #pragma weak */ #undef HAVE_SYS_WEAK_ALIAS_PRAGMA /* Define to 1 if you have the header file. */ #undef HAVE_TIME_H /* define if sys/sem.h has union semun */ #undef HAVE_UNION_SEMUN /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the `xdr_char' function. */ #undef HAVE_XDR_CHAR /* Define to 1 if you have the `_acquire_lock' function. */ #undef HAVE__ACQUIRE_LOCK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 if you have the `_lock_try' function. */ #undef HAVE__LOCK_TRY /* Define to 1 on hitachi systems */ #undef HITACHI /* Define to 1 on HP-UX systems */ #undef HPUX /* Define to 1 on 64bit HP-UX systems */ #undef HPUX64 /* Define to 1 on IBM SP systems */ #undef IBM /* Define to 1 on 64bit IBM SP systems */ #undef IBM64 /* Define to 1 on ??? systems */ #undef INTERIX /* TODO */ #undef LAPI /* Define to 1 on 64bit IBM systems with LAPI */ #undef LAPI64 /* TODO */ #undef LAPI_RDMA /* for Gemini */ #undef LIBONESIDED /* Define to 1 on generic Linux systems */ #undef LINUX /* Define to 1 on generic 64bit Linux systems */ #undef LINUX64 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 on OSX systems */ #undef MACX /* Define to 1 on 64bit OSX systems */ #undef MACX64 /* TODO */ #undef MELLANOX /* TODO */ #undef MPI_MT /* TODO */ #undef MPI_PT /* TODO */ #undef MPI_SPAWN /* Use MPI for messaging */ #undef MSG_COMMS_MPI /* Use TCGMSG for messaging */ #undef MSG_COMMS_TCGMSG /* Use TCGMSG (ipcv4.0) for messaging */ #undef MSG_COMMS_TCGMSG4 /* Use TCGMSG (ipcv5.0) for messaing */ #undef MSG_COMMS_TCGMSG5 /* TODO */ #undef MULTI_CTX /* TODO */ #undef NB_NONCONT /* Define to 1 if assertions should be disabled. */ #undef NDEBUG /* Define to 1 on NEC systems */ #undef NEC /* Define to 1 on 64bit NEC systems */ #undef NEC64 /* whether to wait until the last moment to call ARMCI_Init() in TCGMSG-MPI */ #undef NEED_DELAY_TCGMSG_MPI_STARTUP /* Creates memfenc macro */ #undef NEED_MEM_SYNC /* for portals, enable new malloc */ #undef NEW_MALLOC /* this was defined unconditionally when using LAPI for tcgmsg 5 */ #undef NOTIFY_SENDER /* define when inline asm is not supported */ #undef NO_I386ASM /* Disables use of shared memory */ #undef NO_SHM /* TODO */ #undef OPENIB /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* TODO */ #undef PEND_BUFS /* TODO */ #undef PORTALS /* TODO */ #undef POSIX_THREADS /* TODO */ #undef PTHREADS /* TODO */ #undef QUADRICS /* TODO */ #undef REPORT_SHMMAX /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* TODO */ #undef SERVER_THREAD /* Define to 1 on ??? systems */ #undef SGI /* Define to 1 on ??? systems */ #undef SGITFP /* Define to 1 on ??? systems */ #undef SGI_N32 /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `float', as computed by sizeof. */ #undef SIZEOF_FLOAT /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* TODO */ #undef SOCKETS /* Define to 1 on Solaris systems */ #undef SOLARIS /* Define to 1 on 64bit Solaris systems */ #undef SOLARIS64 /* TODO */ #undef SPAWN_CRAY_XT /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Defined if we want this system to use SYSV shared memory */ #undef SYSV /* deprecated, use MSG_COMMS_TCGMSG */ #undef TCGMSG /* remote shell for TCGMSG */ #undef TCGMSG_RSH /* Gather timing information for TCGMSG */ #undef TCGMSG_TIMINGS /* turn on thread safety */ #undef THREAD_SAFE /* TODO */ #undef USE_MALLOC /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* TODO */ #undef VAPI /* Version number of package */ #undef VERSION /* TODO */ #undef VIA /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* TODO */ #undef _REENTRANT /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define as `fork' if `vfork' does not work. */ #undef vfork /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile ga-5-4/armci/tools/0000755000175000017500000000000012662210417012264 5ustar mbambaga-5-4/armci/tools/armci_profile.h0000644000175000017500000000230312662210417015246 0ustar mbamba#ifndef _ARMCI_PROFILING_H_ #define _ARMCI_PROFILING_H_ /* $Id: armci_profile.h,v 1.5 2005-11-30 10:20:53 vinod Exp $ */ enum events {ARMCI_PROF_GET=0, ARMCI_PROF_PUT, ARMCI_PROF_ACC, /* get/put/acc */ ARMCI_PROF_GETS, ARMCI_PROF_PUTS, ARMCI_PROF_ACCS, /* strided */ ARMCI_PROF_GETV, ARMCI_PROF_PUTV, ARMCI_PROF_ACCV, /* vector */ ARMCI_PROF_NBGET, ARMCI_PROF_NBPUT, ARMCI_PROF_NBACC,/*Non-block*/ ARMCI_PROF_NBGETS, ARMCI_PROF_NBPUTS, ARMCI_PROF_NBACCS, ARMCI_PROF_NBGETV, ARMCI_PROF_NBPUTV, ARMCI_PROF_NBACCV, ARMCI_PROF_BARRIER, ARMCI_PROF_WAIT, ARMCI_PROF_NOTIFY, /*misc*/ ARMCI_PROF_FENCE, ARMCI_PROF_ALLFENCE, ARMCI_PROF_RMW }; extern void armci_profile_init(); extern void armci_profile_terminate(); extern void armci_profile_start_strided(int count[], int stride_levels, int proc, int event_type); extern void armci_profile_stop_strided(int event_type); extern void armci_profile_start_vector(armci_giov_t darr[], int len, int proc, int event_type); extern void armci_profile_stop_vector(int event_type); extern void armci_profile_start(int event_type); extern void armci_profile_stop(int event_type); #endif /* _ARMCI_PROFILING_H_ */ ga-5-4/armci/tools/armci_prof.c0000644000175000017500000002631612662210417014561 0ustar mbamba #if HAVE_CONFIG_H # include "config.h" #endif #include #include "armci.h" #include "parmci.h" #include "armci_profile.h" #include "armci_profile.c" int ARMCI_Acc(int optype, void *scale, void *src, void *dst, int bytes, int proc) { int ret; armci_profile_start_strided(&bytes, 0, proc, ARMCI_PROF_ACC); ret = PARMCI_Acc(optype, scale, src, dst, bytes, proc); armci_profile_stop_strided(ARMCI_PROF_ACC); return ret; } int ARMCI_AccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_ACCS); ret = PARMCI_AccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); armci_profile_stop_strided(ARMCI_PROF_ACCS); return ret; } int ARMCI_AccV(int op, void *scale, armci_giov_t *darr, int len, int proc) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_ACCV); ret = PARMCI_AccV(op, scale, darr, len, proc); armci_profile_stop_vector(ARMCI_PROF_ACCV); return ret; } void ARMCI_AllFence() { armci_profile_start(ARMCI_PROF_ALLFENCE); PARMCI_AllFence(); armci_profile_stop(ARMCI_PROF_ALLFENCE); } void ARMCI_Barrier() { armci_profile_start(ARMCI_PROF_BARRIER); PARMCI_Barrier(); armci_profile_stop(ARMCI_PROF_BARRIER); } int ARMCI_Create_mutexes(int num) { int ret; ret = PARMCI_Create_mutexes(num); return ret; } int ARMCI_Destroy_mutexes() { int ret; ret = PARMCI_Destroy_mutexes(); return ret; } void ARMCI_Fence(int proc) { if (!SAMECLUSNODE(proc)) armci_profile_start(ARMCI_PROF_FENCE); PARMCI_Fence(proc); if (!SAMECLUSNODE(proc)) armci_profile_stop(ARMCI_PROF_FENCE); } void ARMCI_Finalize() { armci_profile_terminate(); PARMCI_Finalize(); } int ARMCI_Free(void *ptr) { int ret; ret = PARMCI_Free(ptr); return ret; } int ARMCI_Free_local(void *ptr) { int ret; ret = PARMCI_Free_local(ptr); return ret; } int ARMCI_Get(void *src, void *dst, int bytes, int proc) { int ret; armci_profile_start_strided(&bytes, 0, proc, ARMCI_PROF_GET); ret = PARMCI_Get(src, dst, bytes, proc); armci_profile_stop_strided(ARMCI_PROF_GET); return ret; } int ARMCI_GetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_GETS); ret = PARMCI_GetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); armci_profile_stop_strided(ARMCI_PROF_GETS); return ret; } int ARMCI_GetV(armci_giov_t *darr, int len, int proc) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_GETV); ret = PARMCI_GetV(darr, len, proc); armci_profile_stop_vector(ARMCI_PROF_GETV); return ret; } double ARMCI_GetValueDouble(void *src, int proc) { double ret; ret = PARMCI_GetValueDouble(src, proc); return ret; } float ARMCI_GetValueFloat(void *src, int proc) { float ret; ret = PARMCI_GetValueFloat(src, proc); return ret; } int ARMCI_GetValueInt(void *src, int proc) { int ret; ret = PARMCI_GetValueInt(src, proc); return ret; } long ARMCI_GetValueLong(void *src, int proc) { long ret; ret = PARMCI_GetValueLong(src, proc); return ret; } int ARMCI_Init() { int ret; ret = PARMCI_Init(); armci_profile_init(); return ret; } int ARMCI_Init_args(int *argc, char ***argv) { int ret; ret = PARMCI_Init_args(argc, argv); armci_profile_init(); return ret; } void ARMCI_Lock(int mutex, int proc) { PARMCI_Lock(mutex, proc); } int ARMCI_Malloc(void **ptr_arr, armci_size_t bytes) { int ret; ret = PARMCI_Malloc(ptr_arr, bytes); return ret; } void* ARMCI_Malloc_local(armci_size_t bytes) { void* ret; ret = PARMCI_Malloc_local(bytes); return ret; } void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset) { void* ret; ret = PARMCI_Memat(meminfo, offset); return ret; } void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { PARMCI_Memget(bytes, meminfo, memflg); } int ARMCI_NbAccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_NBACCS); ret = PARMCI_NbAccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); armci_profile_stop_strided(ARMCI_PROF_NBACCS); return ret; } int ARMCI_NbAccV(int op, void *scale, armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_NBACCV); ret = PARMCI_NbAccV(op, scale, darr, len, proc, nb_handle); armci_profile_stop_vector(ARMCI_PROF_NBACCV); return ret; } int ARMCI_NbGet(void *src, void *dst, int bytes, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_strided(&bytes, 0, proc, ARMCI_PROF_NBGET); ret = PARMCI_NbGet(src, dst, bytes, proc, nb_handle); armci_profile_stop_strided(ARMCI_PROF_NBGET); return ret; } int ARMCI_NbGetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_NBGETS); ret = PARMCI_NbGetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); armci_profile_stop_strided(ARMCI_PROF_NBGETS); return ret; } int ARMCI_NbGetV(armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_NBGETV); ret = PARMCI_NbGetV(darr, len, proc, nb_handle); armci_profile_stop_vector(ARMCI_PROF_NBGETV); return ret; } int ARMCI_NbPut(void *src, void *dst, int bytes, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_strided(&bytes, 0, proc, ARMCI_PROF_NBPUT); ret = PARMCI_NbPut(src, dst, bytes, proc, nb_handle); armci_profile_stop_strided(ARMCI_PROF_NBPUT); return ret; } int ARMCI_NbPutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_NBPUTS); ret = PARMCI_NbPutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); armci_profile_stop_strided(ARMCI_PROF_NBPUTS); return ret; } int ARMCI_NbPutV(armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_NBPUTV); ret = PARMCI_NbPutV(darr, len, proc, nb_handle); armci_profile_stop_vector(ARMCI_PROF_NBPUTV); return ret; } int ARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t *nb_handle) { int ret; ret = PARMCI_NbPutValueDouble(src, dst, proc, nb_handle); return ret; } int ARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t *nb_handle) { int ret; ret = PARMCI_NbPutValueFloat(src, dst, proc, nb_handle); return ret; } int ARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t *nb_handle) { int ret; ret = PARMCI_NbPutValueInt(src, dst, proc, nb_handle); return ret; } int ARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t *nb_handle) { int ret; ret = PARMCI_NbPutValueLong(src, dst, proc, nb_handle); return ret; } int ARMCI_Put(void *src, void *dst, int bytes, int proc) { int ret; armci_profile_start_strided(&bytes, 0, proc, ARMCI_PROF_PUT); ret = PARMCI_Put(src, dst, bytes, proc); armci_profile_stop_strided(ARMCI_PROF_PUT); return ret; } int ARMCI_PutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int ret; armci_profile_start_strided(count, stride_levels, proc, ARMCI_PROF_PUTS); ret = PARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); armci_profile_stop_strided(ARMCI_PROF_PUTS); return ret; } int ARMCI_PutS_flag(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int ret; ret = PARMCI_PutS_flag(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); return ret; } int ARMCI_PutS_flag_dir(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int ret; ret = PARMCI_PutS_flag_dir(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); return ret; } int ARMCI_PutV(armci_giov_t *darr, int len, int proc) { int ret; armci_profile_start_vector(darr, len, proc, ARMCI_PROF_PUTV); ret = PARMCI_PutV(darr, len, proc); armci_profile_stop_vector(ARMCI_PROF_PUTV); return ret; } int ARMCI_PutValueDouble(double src, void *dst, int proc) { int ret; ret = PARMCI_PutValueDouble(src, dst, proc); return ret; } int ARMCI_PutValueFloat(float src, void *dst, int proc) { int ret; ret = PARMCI_PutValueFloat(src, dst, proc); return ret; } int ARMCI_PutValueInt(int src, void *dst, int proc) { int ret; ret = PARMCI_PutValueInt(src, dst, proc); return ret; } int ARMCI_PutValueLong(long src, void *dst, int proc) { int ret; ret = PARMCI_PutValueLong(src, dst, proc); return ret; } int ARMCI_Put_flag(void *src, void *dst, int bytes, int *f, int v, int proc) { int ret; ret = PARMCI_Put_flag(src, dst, bytes, f, v, proc); return ret; } int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { int ret; armci_profile_start(ARMCI_PROF_RMW); ret = PARMCI_Rmw(op, ploc, prem, extra, proc); armci_profile_stop(ARMCI_PROF_RMW); return ret; } int ARMCI_Test(armci_hdl_t *nb_handle) { int ret; ret = PARMCI_Test(nb_handle); return ret; } void ARMCI_Unlock(int mutex, int proc) { PARMCI_Unlock(mutex, proc); } int ARMCI_Wait(armci_hdl_t *nb_handle) { int ret; armci_profile_start(ARMCI_PROF_WAIT); ret = PARMCI_Wait(nb_handle); armci_profile_stop(ARMCI_PROF_WAIT); return ret; } int ARMCI_WaitAll() { int ret; ret = PARMCI_WaitAll(); return ret; } int ARMCI_WaitProc(int proc) { int ret; ret = PARMCI_WaitProc(proc); return ret; } void armci_msg_barrier() { armci_profile_start(ARMCI_PROF_BARRIER); parmci_msg_barrier(); armci_profile_stop(ARMCI_PROF_BARRIER); } void armci_msg_group_barrier(ARMCI_Group *group) { armci_profile_start(ARMCI_PROF_BARRIER); parmci_msg_group_barrier(group); armci_profile_stop(ARMCI_PROF_BARRIER); } int armci_notify_wait(int proc, int *pval) { int ret; armci_profile_start(ARMCI_PROF_NOTIFY); ret = parmci_notify_wait(proc, pval); armci_profile_stop(ARMCI_PROF_NOTIFY); return ret; } ga-5-4/armci/tools/armci_profile.c0000644000175000017500000005776712662210417015271 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: armci_profile.c,v 1.8 2005-11-30 10:20:53 vinod Exp $ */ /** * Profiler can profile the following ARMCI Calls: * ARMCI_Get,ARMCI_Put,ARMCI_Acc,ARMCI_NbGet,ARMCI_NbPut,ARMCI_NbAcc, * ARMCI_GetS,ARMCI_PutS,ARMCI_AccS,ARMCI_NbGetS,ARMCI_NbPutS,ARMCI_NbAccS, * ARMCI_GetV,ARMCI_PutV,ARMCI_AccV,ARMCI_NbGetV,ARMCI_NbPutV,ARMCI_NbAccV, * ARMCI_Wait, armci_wait_notify * (NOTE: As armci_notify is same as ARMCI_Put, it is not profiled.) * * * Note #1: Right now, only process 0's profile is printed. * Each and every process saves its profile in the correspoding data struture. * Each process prints its profile to an output file armci_profile. * when armci_profile_terminate() is called (called in ARMCI_Finalize()). * * Note #2: By default profiler prints msg ranges 0 to 21. Example: range 10 * corresponds to message ranges from 1024 bytes to 2047 bytes. * Message ranges are in the power of 2. for ex: * ------------------------------------ * MSG_RANGE (r) BYTES (2^r to 2^(r+1)-1) * ------------------------------------ * 0 0-1 * 1 2-3 * 2 4-7 * ... ... * 10 1024-2047 bytes * ... ... * 20 1MB - (2MB-1) * 21 >= 2MB * ------------------------------------- * To increase the message range, set ARMCI_MAX_MSG_RANGE accordingly. * * Note #3: If Stride information needs to be printed, set ARMCI_PRINT_STRIDE. * Stride information is printed in armci_profile_terminate() for a various * selective message ranges and event types.Modify it according to your needs. * * Note #4: There is no profiling support for non-blocking operations yet!! */ #define DEBUG_ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MATH_H # include #endif #include "armci.h" #include "armcip.h" #include "armci_profile.h" #ifndef MSG_COMMS_MPI # include "tcgmsg.h" # define MP_TIMER tcg_time #else # include "mpi.h" # define MP_TIMER MPI_Wtime #endif #define ARMCI_PRINT_STRIDE 1 #define ARMCI_MAX_MSG_RANGE 22 /* 0 to 21 */ #if ARMCI_PRINT_STRIDE # define STRIDE_COUNT 1000 # define ARMCI_MAX_DIM 7 typedef struct armci_stride { int stride_levels; int proc; int count[ARMCI_MAX_DIM]; double time; }armci_stride_t; typedef struct giov { int ptr_array_len; int bytes; }giov_t; typedef struct armci_vector { int vec_len; int proc; giov_t *giov; double time; }armci_vector_t; #endif #define ARMCI_EVENTS 24 char *gEventName[ARMCI_EVENTS]={ "GET", "PUT", "ACC", "STRIDED GET", "STRIDED PUT", "STRIDED ACC", "VECTOR GET", "VECTOR PUT", "VECTOR ACC", "NBGET", "NBPUT", "NBACC", "STRIDED NBGET", "STRIDED NBPUT", "STRIDED NBACC", "VECTOR NBGET", "VECTOR NBPUT", "VECTOR NBACC", "BARRIER","ARMCI_WAIT","NOTIFY_WAIT", "FENCE", "ALLFENCE", "RMW" }; typedef struct armci_profile { int count; /* number of times called */ double time; /* total execution time for "count" calls */ #if ARMCI_PRINT_STRIDE armci_stride_t *stride; armci_vector_t *vector; #endif }armci_profile_t; /* profile get/put/acc for various message ranges (i.e ARMCI_MAX_MSG_RANGE) */ static armci_profile_t ARMCI_PROF[ARMCI_EVENTS][ARMCI_MAX_MSG_RANGE]; /* Current event */ struct event_info { int is_set; int event_type; int range; double start_time; } gCURRENT_EVNT; static int strided_event(int e) { if (e==ARMCI_PROF_GETS || e==ARMCI_PROF_PUTS || e==ARMCI_PROF_ACCS || e==ARMCI_PROF_NBGETS || e==ARMCI_PROF_NBPUTS || e==ARMCI_PROF_NBACCS) return 1; return 0; } void armci_profile_init() { int i,j; if(armci_me==0) {printf("\nProfiling ARMCI - ON\n");fflush(stdout);} gCURRENT_EVNT.is_set = 0; for(i=0; i= ARMCI_MAX_DIM) armci_die("ARMCI_PROFILE: stride_levels >= ARMCI_MAX_DIM. Increase ARMCI_MAX_DIM.", armci_me); /* find the message range */ for(i=0; i<= stride_levels; i++) bytes *= count[i]; if(bytes<=0) range=0; else range = (int) (log((double)bytes)/log(2.0)); if(range>=ARMCI_MAX_MSG_RANGE-1) range = ARMCI_MAX_MSG_RANGE-1; /* set the curent event for timer */ status = armci_profile_set_event(event_type, range); if(status == ARMCI_EVENT_SET) { /* new event set */ /* profile update: i.e. update event count */ ARMCI_PROF[event_type][range].count++; # if ARMCI_PRINT_STRIDE if(strided_event(event_type)) { int idx = ARMCI_PROF[event_type][range].count-1; if(idx=ARMCI_MAX_MSG_RANGE-1) range = ARMCI_MAX_MSG_RANGE-1; /* set the curent event for timer */ status = armci_profile_set_event(event_type, range); if(status == ARMCI_EVENT_SET) { /* new event set */ /* profile update: i.e. update event count */ ARMCI_PROF[event_type][range].count++; # if ARMCI_PRINT_STRIDE { int idx = ARMCI_PROF[event_type][range].count-1; if(idx=%d)\n", 1<<(ARMCI_MAX_MSG_RANGE-1)); } } /* print profile of contiguous get/put/acc calls for every message range */ static void armci_print_contig(FILE *fp) { int i, nrange=ARMCI_MAX_MSG_RANGE; ARMCI_HDR1(fp); ARMCI_HDR3(fp); for(i=0; i< nrange; i++) { fprintf(fp, "%d\t %d\t %d\t %.2e %.2e %.2e ", ARMCI_PROF[ARMCI_PROF_GET][i].count, ARMCI_PROF[ARMCI_PROF_PUT][i].count, ARMCI_PROF[ARMCI_PROF_ACC][i].count, ARMCI_PROF[ARMCI_PROF_GET][i].time, ARMCI_PROF[ARMCI_PROF_PUT][i].time, ARMCI_PROF[ARMCI_PROF_ACC][i].time); if(i< nrange-1) fprintf(fp, "(%d-%d)\n", 1<=%d)\n", 1<<(ARMCI_MAX_MSG_RANGE-1)); } } /* This prints the number of non-contiguous get/put/acc/ calls for every message range */ static void armci_print_noncontig(FILE *fp) { int i, nget, nput, nacc, nrange=ARMCI_MAX_MSG_RANGE; double gtime, ptime, atime; ARMCI_HDR2(fp); ARMCI_HDR3(fp); for(i=0; i< nrange; i++) { nget = (ARMCI_PROF[ARMCI_PROF_GETS][i].count + ARMCI_PROF[ARMCI_PROF_GETV][i].count); nput = (ARMCI_PROF[ARMCI_PROF_PUTS][i].count + ARMCI_PROF[ARMCI_PROF_PUTV][i].count); nacc = (ARMCI_PROF[ARMCI_PROF_ACCS][i].count + ARMCI_PROF[ARMCI_PROF_ACCV][i].count); gtime = (ARMCI_PROF[ARMCI_PROF_GETS][i].time + ARMCI_PROF[ARMCI_PROF_GETV][i].time); ptime = (ARMCI_PROF[ARMCI_PROF_PUTS][i].time + ARMCI_PROF[ARMCI_PROF_PUTV][i].time); atime = (ARMCI_PROF[ARMCI_PROF_ACCS][i].time + ARMCI_PROF[ARMCI_PROF_ACCV][i].time); fprintf(fp, "%d\t %d\t %d\t %.2e %.2e %.2e ", nget, nput, nacc, gtime, ptime, atime); if (i< nrange-1) fprintf(fp, "(%d-%d)\n", 1<=%d)\n", 1<<(ARMCI_MAX_MSG_RANGE-1)); } } /* print profile of non-blocking contiguous get/put/acc calls for every message range */ static void armci_print_nbcontig(FILE *fp) { int i, nrange=ARMCI_MAX_MSG_RANGE; ARMCI_HDR6(fp); ARMCI_HDR8(fp); for(i=0; i< nrange; i++) { fprintf(fp, "%d\t %d\t %d\t %.2e %.2e %.2e ", ARMCI_PROF[ARMCI_PROF_NBGET][i].count, ARMCI_PROF[ARMCI_PROF_NBPUT][i].count, ARMCI_PROF[ARMCI_PROF_NBACC][i].count, ARMCI_PROF[ARMCI_PROF_NBGET][i].time, ARMCI_PROF[ARMCI_PROF_NBPUT][i].time, ARMCI_PROF[ARMCI_PROF_NBACC][i].time); if(i< nrange-1) fprintf(fp, "(%d-%d)\n", 1<=%d)\n", 1<<(ARMCI_MAX_MSG_RANGE-1)); } } /* This prints the number of non-blocking non-contiguous get/put/acc/ calls for every message range */ static void armci_print_nbnoncontig(FILE *fp) { int i, nget, nput, nacc, nrange=ARMCI_MAX_MSG_RANGE; double gtime, ptime, atime; ARMCI_HDR7(fp); ARMCI_HDR8(fp); for(i=0; i< nrange; i++) { nget = (ARMCI_PROF[ARMCI_PROF_NBGETS][i].count + ARMCI_PROF[ARMCI_PROF_NBGETV][i].count); nput = (ARMCI_PROF[ARMCI_PROF_NBPUTS][i].count + ARMCI_PROF[ARMCI_PROF_NBPUTV][i].count); nacc = (ARMCI_PROF[ARMCI_PROF_NBACCS][i].count + ARMCI_PROF[ARMCI_PROF_NBACCV][i].count); gtime = (ARMCI_PROF[ARMCI_PROF_NBGETS][i].time + ARMCI_PROF[ARMCI_PROF_NBGETV][i].time); ptime = (ARMCI_PROF[ARMCI_PROF_NBPUTS][i].time + ARMCI_PROF[ARMCI_PROF_NBPUTV][i].time); atime = (ARMCI_PROF[ARMCI_PROF_NBACCS][i].time + ARMCI_PROF[ARMCI_PROF_NBACCV][i].time); fprintf(fp, "%d\t %d\t %d\t %.2e %.2e %.2e ", nget, nput, nacc, gtime, ptime, atime); if (i< nrange-1) fprintf(fp, "(%d-%d)\n", 1<=%d)\n", 1<<(ARMCI_MAX_MSG_RANGE-1)); } } /* Profile of armci_notify_wait(), ARMCI_Wait() and ARMCI_Barrier() */ static void armci_print_misc(FILE *fp) { ARMCI_HDR9(fp); fprintf(fp, "#calls\t time\t EVENT\n\n"); fprintf(fp, "%d\t %.2e ARMCI_Wait()\n", ARMCI_PROF[ARMCI_PROF_WAIT][0].count, ARMCI_PROF[ARMCI_PROF_WAIT][0].time); fprintf(fp, "%d\t %.2e armci_notify_wait()\n", ARMCI_PROF[ARMCI_PROF_NOTIFY][0].count, ARMCI_PROF[ARMCI_PROF_NOTIFY][0].time); fprintf(fp, "%d\t %.2e ARMCI_Barrier()\n", ARMCI_PROF[ARMCI_PROF_BARRIER][0].count, ARMCI_PROF[ARMCI_PROF_BARRIER][0].time); fprintf(fp, "%d\t %.2e ARMCI_Fence()\n", ARMCI_PROF[ARMCI_PROF_FENCE][0].count, ARMCI_PROF[ARMCI_PROF_FENCE][0].time); fprintf(fp, "%d\t %.2e ARMCI_Allfence()\n", ARMCI_PROF[ARMCI_PROF_ALLFENCE][0].count, ARMCI_PROF[ARMCI_PROF_ALLFENCE][0].time); fprintf(fp, "%d\t %.2e ARMCI_Rmw()\n", ARMCI_PROF[ARMCI_PROF_RMW][0].count, ARMCI_PROF[ARMCI_PROF_RMW][0].time); } #if ARMCI_PRINT_STRIDE static void armci_print_warning_msg(FILE *fp, int range, int str_count) { fprintf(fp, "WARNING: In your program, total number of data transfers\n"); fprintf(fp, "for message range[%d - %d] is %d. This exceeds\n", 1< %d (in armci_profile.c)\n", str_count); } static void armci_print_stridedinfo(FILE *fp, int event, int range) { int i, j, stride_levels, str_count; double time=0.0; str_count = ARMCI_PROF[event][range].count; if(str_count <=0) return; if(str_count > STRIDE_COUNT) { armci_print_warning_msg(fp, range, str_count); str_count = STRIDE_COUNT; } fprintf(fp, "\n\nSTRIDE INFORMATION FOR MSG_RANGE %d-%d for EVENT: %s\n", 1< STRIDE_COUNT) { armci_print_warning_msg(fp, range, str_count); str_count = STRIDE_COUNT; } fprintf(fp, "\n\nVECTOR INFORMATION FOR MSG_RANGE %d-%d for EVENT: %s\n", 1< > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include #include "armci.h" #include "parmci.h" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # now process the functions for name in sorted(functions): func = functions[name] maybe_return = '' if '*' in func.return_type or 'void' not in func.return_type: maybe_return = 'return ' func = functions[name] new_name = None if 'PARMCI_' in name: new_name = name.replace('PARMCI_','ARMCI_') elif 'parmci_' in name: new_name = name.replace('parmci_','armci_') print ''' #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak %s #endif %s { %s%s; } ''' % (new_name, func.get_signature(new_name), maybe_return, func.get_call()) ga-5-4/armci/tools/prof_gen.py0000755000175000017500000002027412662210417014445 0ustar mbamba#!/usr/bin/env python '''Generate the armci_prof.c source from the parmci.h header.''' import sys name_to_event = { "ARMCI_Acc" : "ARMCI_PROF_ACC", "ARMCI_AccS" : "ARMCI_PROF_ACCS", "ARMCI_AccV" : "ARMCI_PROF_ACCV", "ARMCI_AllFence" : "ARMCI_PROF_ALLFENCE", "ARMCI_Barrier" : "ARMCI_PROF_BARRIER", "ARMCI_Fence" : "ARMCI_PROF_FENCE", "ARMCI_Get" : "ARMCI_PROF_GET", "ARMCI_GetS" : "ARMCI_PROF_GETS", "ARMCI_GetV" : "ARMCI_PROF_GETV", "ARMCI_NbAcc" : "ARMCI_PROF_NBACC", "ARMCI_NbAccS" : "ARMCI_PROF_NBACCS", "ARMCI_NbAccV" : "ARMCI_PROF_NBACCV", "ARMCI_NbGet" : "ARMCI_PROF_NBGET", "ARMCI_NbGetS" : "ARMCI_PROF_NBGETS", "ARMCI_NbGetV" : "ARMCI_PROF_NBGETV", "ARMCI_NbPut" : "ARMCI_PROF_NBPUT", "ARMCI_NbPutS" : "ARMCI_PROF_NBPUTS", "ARMCI_NbPutV" : "ARMCI_PROF_NBPUTV", "ARMCI_Put" : "ARMCI_PROF_PUT", "ARMCI_PutS" : "ARMCI_PROF_PUTS", "ARMCI_PutV" : "ARMCI_PROF_PUTV", "ARMCI_Rmw" : "ARMCI_PROF_RMW", "ARMCI_Wait" : "ARMCI_PROF_WAIT", "armci_msg_barrier" : "ARMCI_PROF_BARRIER", "armci_msg_group_barrier" : "ARMCI_PROF_BARRIER", "armci_notify_wait" : "ARMCI_PROF_NOTIFY", } def get_signatures(header): # first, gather all function signatures from parmci.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() if '*' not in self.return_type and signature[0] == '*': # return type is void* not void self.return_type += '*' signature = signature[1:].strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: prof_gen.py > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include #include "armci.h" #include "parmci.h" #include "armci_profile.h" #include "armci_profile.c" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # now process the functions for name in sorted(functions): func = functions[name] maybe_declare = '' maybe_assign = '' maybe_return = '' if '*' in func.return_type or 'void' not in func.return_type: maybe_declare = '%s ret;' % func.return_type maybe_assign = 'ret = ' maybe_return = 'return ret;' func = functions[name] new_name = None if 'PARMCI_' in name: new_name = name.replace('PARMCI_','ARMCI_') elif 'parmci_' in name: new_name = name.replace('parmci_','armci_') if new_name in ['ARMCI_Init','ARMCI_Init_args']: print ''' %s { int ret; ret = %s; armci_profile_init(); return ret; } ''' % (func.get_signature(new_name), func.get_call()) elif new_name in ['ARMCI_Finalize']: print ''' %s { armci_profile_terminate(); %s; } ''' % (func.get_signature(new_name), func.get_call()) elif new_name in ['ARMCI_GetV', 'ARMCI_PutV', 'ARMCI_AccV', 'ARMCI_NbGetV', 'ARMCI_NbPutV', 'ARMCI_NbAccV']: print ''' %s { %s armci_profile_start_vector(darr, len, proc, %s); %s%s; armci_profile_stop_vector(%s); %s } ''' % (func.get_signature(new_name), maybe_declare, name_to_event[new_name], maybe_assign, func.get_call(), name_to_event[new_name], maybe_return) elif new_name in ['ARMCI_GetS', 'ARMCI_PutS', 'ARMCI_AccS', 'ARMCI_NbGetS', 'ARMCI_NbPutS', 'ARMCI_NbAccS']: print ''' %s { %s armci_profile_start_strided(count, stride_levels, proc, %s); %s%s; armci_profile_stop_strided(%s); %s } ''' % (func.get_signature(new_name), maybe_declare, name_to_event[new_name], maybe_assign, func.get_call(), name_to_event[new_name], maybe_return) elif new_name in ['ARMCI_Get', 'ARMCI_Put', 'ARMCI_Acc', 'ARMCI_NbGet', 'ARMCI_NbPut', 'ARMCI_NbAcc']: print ''' %s { %s armci_profile_start_strided(&bytes, 0, proc, %s); %s%s; armci_profile_stop_strided(%s); %s } ''' % (func.get_signature(new_name), maybe_declare, name_to_event[new_name], maybe_assign, func.get_call(), name_to_event[new_name], maybe_return) elif "ARMCI_Fence" in new_name: print ''' %s { if (!SAMECLUSNODE(proc)) armci_profile_start(ARMCI_PROF_FENCE); %s%s; if (!SAMECLUSNODE(proc)) armci_profile_stop(ARMCI_PROF_FENCE); } ''' % (func.get_signature(new_name), maybe_assign, func.get_call()) elif new_name in name_to_event: print ''' %s { %s armci_profile_start(%s); %s%s; armci_profile_stop(%s); %s } ''' % (func.get_signature(new_name), maybe_declare, name_to_event[new_name], maybe_assign, func.get_call(), name_to_event[new_name], maybe_return) else: print ''' %s { %s %s%s; %s } ''' % (func.get_signature(new_name), maybe_declare, maybe_assign, func.get_call(), maybe_return) ga-5-4/armci/tools/armci_trace.c0000644000175000017500000006631112662210417014710 0ustar mbamba#include #include #include "parmci.h" #define TIME MPI_Wtime static double ARMCI_AccV_t; static double ARMCI_Barrier_t; static double ARMCI_AccS_t; static double ARMCI_Finalize_t; static double ARMCI_NbPut_t; static double ARMCI_GetValueInt_t; static double ARMCI_Put_flag_t; static double ARMCI_WaitAll_t; static double ARMCI_Malloc_local_t; static double ARMCI_Free_local_t; static double ARMCI_Get_t; static double ARMCI_PutValueFloat_t; static double ARMCI_NbAccV_t; static double ARMCI_GetValueFloat_t; static double ARMCI_Malloc_t; static double ARMCI_NbAccS_t; static double ARMCI_PutS_t; static double ARMCI_PutV_t; static double ARMCI_Destroy_mutexes_t; static double ARMCI_Free_t; static double ARMCI_Init_args_t; static double ARMCI_PutValueInt_t; static double ARMCI_Memget_t; static double ARMCI_AllFence_t; static double ARMCI_NbPutV_t; static double ARMCI_PutValueDouble_t; static double ARMCI_GetV_t; static double ARMCI_Test_t; static double ARMCI_GetS_t; static double ARMCI_Unlock_t; static double ARMCI_Fence_t; static double ARMCI_Create_mutexes_t; static double ARMCI_PutS_flag_t; static double ARMCI_WaitProc_t; static double ARMCI_Lock_t; static double ARMCI_GetValueDouble_t; static double ARMCI_NbGetV_t; static double ARMCI_Rmw_t; static double ARMCI_Init_t; static double ARMCI_NbGetS_t; static double ARMCI_NbGet_t; static double ARMCI_Put_t; static double ARMCI_NbPutS_t; static double ARMCI_PutS_flag_dir_t; static double ARMCI_Wait_t; static double ARMCI_GetValueLong_t; static double ARMCI_PutValueLong_t; static int ARMCI_AccV_c; static int ARMCI_Barrier_c; static int ARMCI_AccS_c; static int ARMCI_Finalize_c; static int ARMCI_NbPut_c; static int ARMCI_GetValueInt_c; static int ARMCI_Put_flag_c; static int ARMCI_WaitAll_c; static int ARMCI_Malloc_local_c; static int ARMCI_Free_local_c; static int ARMCI_Get_c; static int ARMCI_PutValueFloat_c; static int ARMCI_NbAccV_c; static int ARMCI_GetValueFloat_c; static int ARMCI_Malloc_c; static int ARMCI_NbAccS_c; static int ARMCI_PutS_c; static int ARMCI_PutV_c; static int ARMCI_Destroy_mutexes_c; static int ARMCI_Free_c; static int ARMCI_Init_args_c; static int ARMCI_PutValueInt_c; static int ARMCI_Memget_c; static int ARMCI_AllFence_c; static int ARMCI_NbPutV_c; static int ARMCI_PutValueDouble_c; static int ARMCI_GetV_c; static int ARMCI_Test_c; static int ARMCI_GetS_c; static int ARMCI_Unlock_c; static int ARMCI_Fence_c; static int ARMCI_Create_mutexes_c; static int ARMCI_PutS_flag_c; static int ARMCI_WaitProc_c; static int ARMCI_Lock_c; static int ARMCI_GetValueDouble_c; static int ARMCI_NbGetV_c; static int ARMCI_Rmw_c; static int ARMCI_Init_c; static int ARMCI_NbGetS_c; static int ARMCI_NbGet_c; static int ARMCI_Put_c; static int ARMCI_NbPutS_c; static int ARMCI_PutS_flag_dir_c; static int ARMCI_Wait_c; static int ARMCI_GetValueLong_c; static int ARMCI_PutValueLong_c; static double t; static int c; static int me; void ARMCI_Finalize() { MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Reduce(&ARMCI_AccV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_AccV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_AccV,%d,%lf\n", ARMCI_AccV_c, ARMCI_AccV_t); } MPI_Reduce(&ARMCI_Barrier_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Barrier_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Barrier,%d,%lf\n", ARMCI_Barrier_c, ARMCI_Barrier_t); } MPI_Reduce(&ARMCI_AccS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_AccS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_AccS,%d,%lf\n", ARMCI_AccS_c, ARMCI_AccS_t); } MPI_Reduce(&ARMCI_NbPut_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbPut_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbPut,%d,%lf\n", ARMCI_NbPut_c, ARMCI_NbPut_t); } MPI_Reduce(&ARMCI_GetValueInt_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetValueInt_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetValueInt,%d,%lf\n", ARMCI_GetValueInt_c, ARMCI_GetValueInt_t); } MPI_Reduce(&ARMCI_Put_flag_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Put_flag_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Put_flag,%d,%lf\n", ARMCI_Put_flag_c, ARMCI_Put_flag_t); } MPI_Reduce(&ARMCI_NbGetS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbGetS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbGetS,%d,%lf\n", ARMCI_NbGetS_c, ARMCI_NbGetS_t); } MPI_Reduce(&ARMCI_Malloc_local_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Malloc_local_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Malloc_local,%d,%lf\n", ARMCI_Malloc_local_c, ARMCI_Malloc_local_t); } MPI_Reduce(&ARMCI_Free_local_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Free_local_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Free_local,%d,%lf\n", ARMCI_Free_local_c, ARMCI_Free_local_t); } MPI_Reduce(&ARMCI_Get_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Get_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Get,%d,%lf\n", ARMCI_Get_c, ARMCI_Get_t); } MPI_Reduce(&ARMCI_Put_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Put_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Put,%d,%lf\n", ARMCI_Put_c, ARMCI_Put_t); } MPI_Reduce(&ARMCI_Destroy_mutexes_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Destroy_mutexes_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Destroy_mutexes,%d,%lf\n", ARMCI_Destroy_mutexes_c, ARMCI_Destroy_mutexes_t); } MPI_Reduce(&ARMCI_GetS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetS,%d,%lf\n", ARMCI_GetS_c, ARMCI_GetS_t); } MPI_Reduce(&ARMCI_NbAccV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbAccV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbAccV,%d,%lf\n", ARMCI_NbAccV_c, ARMCI_NbAccV_t); } MPI_Reduce(&ARMCI_GetValueFloat_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetValueFloat_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetValueFloat,%d,%lf\n", ARMCI_GetValueFloat_c, ARMCI_GetValueFloat_t); } MPI_Reduce(&ARMCI_Malloc_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Malloc_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Malloc,%d,%lf\n", ARMCI_Malloc_c, ARMCI_Malloc_t); } MPI_Reduce(&ARMCI_NbAccS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbAccS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbAccS,%d,%lf\n", ARMCI_NbAccS_c, ARMCI_NbAccS_t); } MPI_Reduce(&ARMCI_PutS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutS,%d,%lf\n", ARMCI_PutS_c, ARMCI_PutS_t); } MPI_Reduce(&ARMCI_PutV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutV,%d,%lf\n", ARMCI_PutV_c, ARMCI_PutV_t); } MPI_Reduce(&ARMCI_Free_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Free_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Free,%d,%lf\n", ARMCI_Free_c, ARMCI_Free_t); } MPI_Reduce(&ARMCI_Init_args_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Init_args_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Init_args,%d,%lf\n", ARMCI_Init_args_c, ARMCI_Init_args_t); } MPI_Reduce(&ARMCI_PutValueInt_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutValueInt_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutValueInt,%d,%lf\n", ARMCI_PutValueInt_c, ARMCI_PutValueInt_t); } MPI_Reduce(&ARMCI_Memget_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Memget_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Memget,%d,%lf\n", ARMCI_Memget_c, ARMCI_Memget_t); } MPI_Reduce(&ARMCI_AllFence_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_AllFence_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_AllFence,%d,%lf\n", ARMCI_AllFence_c, ARMCI_AllFence_t); } MPI_Reduce(&ARMCI_NbPutV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbPutV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbPutV,%d,%lf\n", ARMCI_NbPutV_c, ARMCI_NbPutV_t); } MPI_Reduce(&ARMCI_PutValueDouble_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutValueDouble_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutValueDouble,%d,%lf\n", ARMCI_PutValueDouble_c, ARMCI_PutValueDouble_t); } MPI_Reduce(&ARMCI_GetV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetV,%d,%lf\n", ARMCI_GetV_c, ARMCI_GetV_t); } MPI_Reduce(&ARMCI_Test_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Test_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Test,%d,%lf\n", ARMCI_Test_c, ARMCI_Test_t); } MPI_Reduce(&ARMCI_Unlock_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Unlock_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Unlock,%d,%lf\n", ARMCI_Unlock_c, ARMCI_Unlock_t); } MPI_Reduce(&ARMCI_Fence_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Fence_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Fence,%d,%lf\n", ARMCI_Fence_c, ARMCI_Fence_t); } MPI_Reduce(&ARMCI_Create_mutexes_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Create_mutexes_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Create_mutexes,%d,%lf\n", ARMCI_Create_mutexes_c, ARMCI_Create_mutexes_t); } MPI_Reduce(&ARMCI_PutS_flag_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutS_flag_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutS_flag,%d,%lf\n", ARMCI_PutS_flag_c, ARMCI_PutS_flag_t); } MPI_Reduce(&ARMCI_WaitProc_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_WaitProc_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_WaitProc,%d,%lf\n", ARMCI_WaitProc_c, ARMCI_WaitProc_t); } MPI_Reduce(&ARMCI_Lock_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Lock_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Lock,%d,%lf\n", ARMCI_Lock_c, ARMCI_Lock_t); } MPI_Reduce(&ARMCI_GetValueDouble_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetValueDouble_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetValueDouble,%d,%lf\n", ARMCI_GetValueDouble_c, ARMCI_GetValueDouble_t); } MPI_Reduce(&ARMCI_NbGetV_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbGetV_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbGetV,%d,%lf\n", ARMCI_NbGetV_c, ARMCI_NbGetV_t); } MPI_Reduce(&ARMCI_Rmw_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Rmw_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Rmw,%d,%lf\n", ARMCI_Rmw_c, ARMCI_Rmw_t); } MPI_Reduce(&ARMCI_Init_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Init_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Init,%d,%lf\n", ARMCI_Init_c, ARMCI_Init_t); } MPI_Reduce(&ARMCI_WaitAll_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_WaitAll_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_WaitAll,%d,%lf\n", ARMCI_WaitAll_c, ARMCI_WaitAll_t); } MPI_Reduce(&ARMCI_NbGet_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbGet_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbGet,%d,%lf\n", ARMCI_NbGet_c, ARMCI_NbGet_t); } MPI_Reduce(&ARMCI_PutValueFloat_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutValueFloat_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutValueFloat,%d,%lf\n", ARMCI_PutValueFloat_c, ARMCI_PutValueFloat_t); } MPI_Reduce(&ARMCI_NbPutS_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_NbPutS_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_NbPutS,%d,%lf\n", ARMCI_NbPutS_c, ARMCI_NbPutS_t); } MPI_Reduce(&ARMCI_PutS_flag_dir_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutS_flag_dir_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutS_flag_dir,%d,%lf\n", ARMCI_PutS_flag_dir_c, ARMCI_PutS_flag_dir_t); } MPI_Reduce(&ARMCI_PutValueLong_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_PutValueLong_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_PutValueLong,%d,%lf\n", ARMCI_PutValueLong_c, ARMCI_PutValueLong_t); } MPI_Reduce(&ARMCI_Wait_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_Wait_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_Wait,%d,%lf\n", ARMCI_Wait_c, ARMCI_Wait_t); } MPI_Reduce(&ARMCI_GetValueLong_c, &c, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); MPI_Reduce(&ARMCI_GetValueLong_t, &t, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("ARMCI_GetValueLong,%d,%lf\n", ARMCI_GetValueLong_c, ARMCI_GetValueLong_t); } PARMCI_Finalize(); } int ARMCI_AccV(int op, void *scale, armci_giov_t * darr, int len, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_AccV(op, scale, darr, len, proc); etime = TIME(); ARMCI_AccV_t += etime - stime; return rval; } void ARMCI_Barrier() { static double stime, etime; stime = TIME(); PARMCI_Barrier(); etime = TIME(); ARMCI_Barrier_t += etime - stime; } int ARMCI_AccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_AccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); etime = TIME(); ARMCI_AccS_t += etime - stime; return rval; } int ARMCI_NbPut(void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbPut(src, dst, bytes, proc, nb_handle); etime = TIME(); ARMCI_NbPut_t += etime - stime; return rval; } int ARMCI_GetValueInt(void *src, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetValueInt(src, proc); etime = TIME(); ARMCI_GetValueInt_t += etime - stime; return rval; } int ARMCI_Put_flag(void *src, void *dst, int bytes, int *f, int v, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Put_flag(src, dst, bytes, f, v, proc); etime = TIME(); ARMCI_Put_flag_t += etime - stime; return rval; } int ARMCI_NbGetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbGetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); etime = TIME(); ARMCI_NbGetS_t += etime - stime; return rval; } void *ARMCI_Malloc_local(armci_size_t bytes) { void *rval; static double stime, etime; stime = TIME(); rval = PARMCI_Malloc_local(bytes); etime = TIME(); ARMCI_Malloc_local_t += etime - stime; return rval; } int ARMCI_Free_local(void *ptr) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Free_local(ptr); etime = TIME(); ARMCI_Free_local_t += etime - stime; return rval; } int ARMCI_Get(void *src, void *dst, int bytes, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Get(src, dst, bytes, proc); etime = TIME(); ARMCI_Get_t += etime - stime; return rval; } int ARMCI_Put(void *src, void *dst, int bytes, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Put(src, dst, bytes, proc); etime = TIME(); ARMCI_Put_t += etime - stime; return rval; } int ARMCI_Destroy_mutexes() { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Destroy_mutexes(); etime = TIME(); ARMCI_Destroy_mutexes_t += etime - stime; return rval; } int ARMCI_GetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); etime = TIME(); ARMCI_GetS_t += etime - stime; return rval; } int ARMCI_NbAccV(int op, void *scale, armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbAccV(op, scale, darr, len, proc, nb_handle); etime = TIME(); ARMCI_NbAccV_t += etime - stime; return rval; } float ARMCI_GetValueFloat(void *src, int proc) { float rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetValueFloat(src, proc); etime = TIME(); ARMCI_GetValueFloat_t += etime - stime; return rval; } int ARMCI_Malloc(void **ptr_arr, armci_size_t bytes) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Malloc(ptr_arr, bytes); etime = TIME(); ARMCI_Malloc_t += etime - stime; return rval; } int ARMCI_NbAccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbAccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); etime = TIME(); ARMCI_NbAccS_t += etime - stime; return rval; } int ARMCI_PutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); etime = TIME(); ARMCI_PutS_t += etime - stime; return rval; } int ARMCI_PutV(armci_giov_t * darr, int len, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutV(darr, len, proc); etime = TIME(); ARMCI_PutV_t += etime - stime; return rval; } int ARMCI_Free(void *ptr) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Free(ptr); etime = TIME(); ARMCI_Free_t += etime - stime; return rval; } int ARMCI_Init_args(int *argc, char ***argv) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Init_args(argc, argv); etime = TIME(); ARMCI_Init_args_t += etime - stime; return rval; } int ARMCI_PutValueInt(int src, void *dst, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutValueInt(src, dst, proc); etime = TIME(); ARMCI_PutValueInt_t += etime - stime; return rval; } void ARMCI_Memget(size_t bytes, armci_meminfo_t * meminfo, int memflg) { static double stime, etime; stime = TIME(); PARMCI_Memget(bytes, meminfo, memflg); etime = TIME(); ARMCI_Memget_t += etime - stime; } void ARMCI_AllFence() { static double stime, etime; stime = TIME(); PARMCI_AllFence(); etime = TIME(); ARMCI_AllFence_t += etime - stime; } int ARMCI_NbPutV(armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbPutV(darr, len, proc, nb_handle); etime = TIME(); ARMCI_NbPutV_t += etime - stime; return rval; } int ARMCI_PutValueDouble(double src, void *dst, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutValueDouble(src, dst, proc); etime = TIME(); ARMCI_PutValueDouble_t += etime - stime; return rval; } int ARMCI_GetV(armci_giov_t * darr, int len, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetV(darr, len, proc); etime = TIME(); ARMCI_GetV_t += etime - stime; return rval; } int ARMCI_Test(armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Test(nb_handle); etime = TIME(); ARMCI_Test_t += etime - stime; return rval; } void ARMCI_Unlock(int mutex, int proc) { static double stime, etime; stime = TIME(); PARMCI_Unlock(mutex, proc); etime = TIME(); ARMCI_Unlock_t += etime - stime; } void ARMCI_Fence(int proc) { static double stime, etime; stime = TIME(); PARMCI_Fence(proc); etime = TIME(); ARMCI_Fence_t += etime - stime; } int ARMCI_Create_mutexes(int num) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Create_mutexes(num); etime = TIME(); ARMCI_Create_mutexes_t += etime - stime; return rval; } int ARMCI_PutS_flag(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutS_flag(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); etime = TIME(); ARMCI_PutS_flag_t += etime - stime; return rval; } int ARMCI_WaitProc(int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_WaitProc(proc); etime = TIME(); ARMCI_WaitProc_t += etime - stime; return rval; } void ARMCI_Lock(int mutex, int proc) { static double stime, etime; stime = TIME(); PARMCI_Lock(mutex, proc); etime = TIME(); ARMCI_Lock_t += etime - stime; } double ARMCI_GetValueDouble(void *src, int proc) { double rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetValueDouble(src, proc); etime = TIME(); ARMCI_GetValueDouble_t += etime - stime; return rval; } int ARMCI_NbGetV(armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbGetV(darr, len, proc, nb_handle); etime = TIME(); ARMCI_NbGetV_t += etime - stime; return rval; } int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Rmw(op, ploc, prem, extra, proc); etime = TIME(); ARMCI_Rmw_t += etime - stime; return rval; } int ARMCI_Init() { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Init(); etime = TIME(); ARMCI_Init_t += etime - stime; return rval; } int ARMCI_WaitAll() { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_WaitAll(); etime = TIME(); ARMCI_WaitAll_t += etime - stime; return rval; } int ARMCI_NbGet(void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbGet(src, dst, bytes, proc, nb_handle); etime = TIME(); ARMCI_NbGet_t += etime - stime; return rval; } int ARMCI_PutValueFloat(float src, void *dst, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutValueFloat(src, dst, proc); etime = TIME(); ARMCI_PutValueFloat_t += etime - stime; return rval; } int ARMCI_NbPutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_NbPutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); etime = TIME(); ARMCI_NbPutS_t += etime - stime; return rval; } int ARMCI_PutS_flag_dir(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutS_flag_dir(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); etime = TIME(); ARMCI_PutS_flag_dir_t += etime - stime; return rval; } int ARMCI_PutValueLong(long src, void *dst, int proc) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_PutValueLong(src, dst, proc); etime = TIME(); ARMCI_PutValueLong_t += etime - stime; return rval; } int ARMCI_Wait(armci_hdl_t * nb_handle) { int rval; static double stime, etime; stime = TIME(); rval = PARMCI_Wait(nb_handle); etime = TIME(); ARMCI_Wait_t += etime - stime; return rval; } long ARMCI_GetValueLong(void *src, int proc) { long rval; static double stime, etime; stime = TIME(); rval = PARMCI_GetValueLong(src, proc); etime = TIME(); ARMCI_GetValueLong_t += etime - stime; return rval; } ga-5-4/armci/src-gemini/0000755000175000017500000000000012662210416013160 5ustar mbambaga-5-4/armci/src-gemini/copy.h0000644000175000017500000003752112662210416014313 0ustar mbamba/* $Id: copy.h,v 1.86.2.6 2007-08-29 17:32:32 manoj Exp $ */ #ifndef _COPY_H_ #define _COPY_H_ #include #include #ifdef WIN32 # include #endif #ifdef DECOSF #include #endif #ifndef EXTERN # define EXTERN extern #endif #if defined(SGI) || defined(FUJITSU) || defined(HPUX) || defined(SOLARIS) || defined (DECOSF) || defined(__ia64__) || defined(__crayx1) # define PTR_ALIGN #endif #if defined(NB_NONCONT) && !defined(CRAY_SHMEM) && !defined(QUADRICS) #error NB_NONCONT is only available on CRAY_SHMEM,QUADRICS and PORTALS #endif #if defined(SHMEM_HANDLE_SUPPORTED) && !defined(CRAY_SHMEM) #error SHMEM_HANDLE_SUPPORTED should not be defined on a non CRAY_SHMEM network #endif /* 08/30/06 moved up here from lines 252-397, MEM_FENCE before FENCE_NODE */ #if defined(NEED_MEM_SYNC) # ifdef AIX # define MEM_FENCE {int _dummy=1; _clear_lock((int *)&_dummy,0); } # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define MEM_FENCE __asm__ __volatile__ ("mf" ::: "memory"); # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define MEM_FENCE _armci_ia64_mb(); # endif # elif defined(LINUX) && defined(__GNUC__) && defined(__ppc__) # define MEM_FENCE \ __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif #ifndef armci_copy # define armci_copy(src,dst,n) bcopy(src,dst,n) #endif /****************************** 2D Copy *******************/ # define DCopy2D(rows, cols, src_ptr, src_ld, dst_ptr, dst_ld){\ int j, nbytes = sizeof(double)* rows;\ char *ps=src_ptr, *pd=dst_ptr;\ for (j = 0; j < cols; j++){\ armci_copy(ps, pd, nbytes);\ ps += sizeof(double)* src_ld;\ pd += sizeof(double)* dst_ld;\ }\ } # define ByteCopy2D(bytes, count, src_ptr, src_stride, dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_copy(ps, pd, bytes);\ ps += src_stride;\ pd += dst_stride;\ }\ } #if defined(FUJITSU) # define armci_put2D(p, bytes,count,src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchTo(src_ptr, src_stride, dst_ptr, dst_stride, count,bytes, p) # define armci_get2D(p, bytes, count, src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchFrom(src_ptr, src_stride, dst_ptr, dst_stride,count,bytes,p) #elif defined(HITACHI) || defined(_ELAN_PUTGET_H) && !defined(NB_NONCONT) #if defined(QUADRICS) #if 0 # define WAIT_FOR_PUTS elan_putWaitAll(elan_base->state,200) # define WAIT_FOR_GETS elan_getWaitAll(elan_base->state,200) #else # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_wait_put(); extern void armcill_wait_get(); #endif #endif extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D #elif defined(NB_NONCONT) extern void armcill_wait_put(); extern void armcill_wait_get(); # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D # if defined(QUADRICS) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_put(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_get(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_wait(_hdl)\ elan_wait(_hdl,100) # elif defined(CRAY_SHMEM) # define armcill_nb_wait(_hdl)\ shmem_wait_nb(_hdl) /*VT:this should be ifdef'ed based on if shmem_handle is defined or not*/ # if defined (CRAY_XT) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ shmem_putmem(_dst, _src, (size_t)_sz, _proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ shmem_getmem(_dst, _src, (size_t)_sz, _proc) # else # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_putmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_getmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # endif # endif #else # define armci_put2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_put(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } # define armci_get2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_get(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } #endif /* macros to ensure ordering of consecutive puts or gets following puts */ #if defined(LAPI) # include "lapidefs.h" #elif defined(_CRAYMPP) || defined(QUADRICS) || defined(__crayx1)\ || defined(CRAY_SHMEM) #if defined(CRAY) || defined(CRAY_XT) # include #else # include #ifndef ptrdiff_t # include #endif # include #endif # ifdef ELAN_ACC # define FENCE_NODE(p) {\ if(((p)armci_clus_last))armci_elan_fence(p);} # define UPDATE_FENCE_STATE(p, op, nissued) # else int cmpl_proc; # ifdef DECOSF # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet();\ else asm ("mb"); } # else # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet(); } # endif # define UPDATE_FENCE_STATE(p, op, nissued) if((op)==PUT) cmpl_proc=(p); # endif #else # if defined(GM) && defined(ACK_FENCE) extern void armci_gm_fence(int p); # define FENCE_NODE(p) armci_gm_fence(p) # elif defined(BGML) # include "bgmldefs.h" # define FENCE_NODE(p) BGML_WaitProc(p) # else # define FENCE_NODE(p) # endif # define UPDATE_FENCE_STATE(p, op, nissued) #endif #ifdef NEC # define THRESH 1 # define THRESH1D 1 #else # define THRESH 32 # define THRESH1D 512 #endif #define ALIGN_SIZE sizeof(double) /********* interface to C 1D and 2D memory copy functions ***********/ /* dcopy2d_u_ uses explicit unrolled loops to depth 4 */ void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur); void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur); void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur); void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur); /********* interface to fortran 1D and 2D memory copy functions ***********/ #if defined(AIX) || defined(BGML) # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ #elif defined(LINUX) || defined(__crayx1) || defined(HPUX64) || defined(DECOSF) || defined(CRAY) || defined(WIN32) || defined(HITACHI) # define DCOPY2D c_dcopy2d_n_ # define DCOPY1D c_dcopy1d_n_ #else # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ #endif #define DCOPY21 c_dcopy21_ #define DCOPY12 c_dcopy12_ #define DCOPY31 c_dcopy31_ #define DCOPY13 c_dcopy13_ /***************************** 1-Dimensional copy ************************/ #if defined(QUADRICS) # include # if defined(_ELAN_PUTGET_H) # define qsw_put(src,dst,n,proc) \ elan_wait(elan_put(elan_base->state,src,dst,n,proc),elan_base->waitType) # define qsw_get(src,dst,n,proc) \ elan_wait(elan_get(elan_base->state,src,dst,n,proc),elan_base->waitType) /* # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ *(phandle)=elan_put(elan_base->state,src,dst,n,proc) */ #ifdef DOELAN4 extern void armci_elan_put_with_tracknotify(char *src,char *dst,int n,int proc, ELAN_EVENT **phandle); # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ armci_elan_put_with_tracknotify(src,dst,n,proc,phandle) #endif # define ARMCI_NB_GET(src,dst,n,proc,phandle)\ *(phandle)=elan_get(elan_base->state,src,dst,n,proc) # define ARMCI_NB_WAIT(handle) if(handle)elan_wait(handle,elan_base->waitType) # define ARMCI_NB_TEST(handle,_succ) (*(_succ))= (handle)? !elan_poll(handle,1L): 1 # else # define qsw_put(src,dst,n,proc) shmem_putmem((dst),(src),(int)(n),(proc)) # define qsw_get(src,dst,n,proc) shmem_getmem((dst),(src),(int)(n),(proc)) # endif # define armci_put(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_put(src,dst,n,proc);} # define armci_get(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_get((src),(dst),(int)(n),(proc));} #elif defined(CRAY_T3E) || defined(CRAY_SHMEM) # define armci_copy_disabled(src,dst,n)\ if((n)<256 || n%sizeof(long) ) memcpy((dst),(src),(n));\ else {\ shmem_put((long*)(dst),(long*)(src),(int)(n)/sizeof(long),armci_me);\ shmem_quiet(); } # define armci_put(src,dst,n,proc) \ shmem_put32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() # define armci_get(src,dst,n,proc) \ shmem_get32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() #elif defined(HITACHI) extern void armcill_put(void *src, void *dst, int bytes, int proc); extern void armcill_get(void *src, void *dst, int bytes, int proc); # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_put((src), (dst),(n),(proc));} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_get((src), (dst),(n),(proc));} #elif defined(FUJITSU) # include "fujitsu-vpp.h" # ifndef __sparc # define armci_copy(src,dst,n) _MmCopy((char*)(dst), (char*)(src), (n)) # endif # define armci_put CopyTo # define armci_get CopyFrom #elif defined(LAPI) # include extern lapi_handle_t lapi_handle; # define armci_put(src,dst,n,proc)\ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL,&(ack_cntr[ARMCI_THREAD_IDX].cntr),&cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} /**** this copy is nonblocking and requires fence to complete!!! ****/ # define armci_get(src,dst,n,proc) \ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &(get_cntr[ARMCI_THREAD_IDX].cntr)))\ ARMCI_Error("LAPI_Get failed",0);else;} # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_PUT failed",0);\ (cmplt)->val=1;\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL, &((cmplt)->cntr), &cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_GET failed",0);\ (cmplt)->val=1;\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &((cmplt)->cntr)))\ ARMCI_Error("LAPI_Get NB_GET failed",0);else;} # define ARMCI_NB_WAIT(cmplt) CLEAR_COUNTER((cmplt)) # define ARMCI_NB_TEST(cmplt,_succ) TEST_COUNTER((cmplt),(_succ)) #elif defined(PORTALS) # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armci_portals_put((proc),(src), (dst),(n),NULL,0);} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armci_portals_get((proc),(src), (dst),(n),NULL,0);} # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_put((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_get((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) #elif defined(BGML) #define armci_get(src, dst, n, p) PARMCI_Get(src, dst, n, p) #define armci_put(src, dst, n, p) PARMCI_Put(src, dst, n, p) #else # define armci_get(src,dst,n,p) armci_copy((src),(dst),(n)) # define armci_put(src,dst,n,p) armci_copy((src),(dst),(n)) #endif #ifndef MEM_FENCE # define MEM_FENCE #endif #ifndef armci_copy_fence # define armci_copy_fence armci_copy #endif #endif ga-5-4/armci/src-gemini/memlock.h0000644000175000017500000000217612662210416014766 0ustar mbamba/* $Id: memlock.h,v 1.18 2004-09-21 17:26:23 manoj Exp $ */ #ifndef _MEMLOCK_H_ #define _MEMLOCK_H_ /* data structure for locking memory areas */ #define MAX_SLOTS 8 typedef struct{ void *start; void *end; } memlock_t; /* SGI Altix Stuff */ typedef struct { void *seg_addr; /* master's starting address of the segment */ size_t seg_size; size_t tile_size; size_t mem_offset; }armci_memoffset_t; extern void** memlock_table_array; extern int *armci_use_memlock_table; #if defined(LAPI) || defined(FUJITSU) || defined(PTHREADS) || defined(QUADRICS)\ || defined(PORTALS) || defined(HITACHI) || (defined(LINUX64)&&defined(__GNUC__)&&defined(__alpha__))\ || defined(CYGWIN) || defined(__crayx1) || defined(NEC) || defined(LIBONESIDED) # define ARMCI_LOCKMEM armci_lockmem_ # define ARMCI_UNLOCKMEM armci_unlockmem_ #else # define ARMCI_LOCKMEM armci_lockmem # define ARMCI_UNLOCKMEM armci_unlockmem # error "rmo: i think this is broken and should not be used" #endif extern void ARMCI_LOCKMEM(void *pstart, void *pend, int proc); extern void ARMCI_UNLOCKMEM(int proc); #define MEMLOCK_SHMEM_FLAG #endif ga-5-4/armci/src-gemini/rtinfo.c0000644000175000017500000000102112662210416014617 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: rtinfo.c,v 1.1 2003-03-20 00:57:27 d3h325 Exp $ Run-time system configuration */ #include #include /*\ determine number of CPUs on the current SMP node- Linux version for now \*/ int armci_getnumcpus(void) { int numproc=0; FILE* fp; char line[80]; fp=fopen("/proc/cpuinfo","r"); if(fp==NULL) return -1; while(!feof(fp)){ fgets(line,80,fp); if(strncmp(line,"processor",9)==0) numproc++; } fclose(fp); return(numproc); } ga-5-4/armci/src-gemini/ccopy.c0000644000175000017500000002213512662210416014444 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "copy.h" /* ONE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy1d_n(A, B, n) integer n,i double precision A(n), B(n) ccdir$ no_cache_alloc a,b do i = 1, n B(i) = A(i) end do end #endif void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; for ( i = 0 ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } #if 0 subroutine dcopy1d_u(A, B, n) integer n,n1,i double precision A(n), B(n) double precision d1, d2, d3, d4 n1 = iand(max0(n,0),3) do i = 1, n1 B(i) = A(i) end do do i = n1+1, n, 4 d1 = a(i) d2 = a(i+1) d3 = a(i+2) d4 = a(i+3) b(i) = d1 b(i+1) = d2 b(i+2) = d3 b(i+3) = d4 end do end #endif void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; int m = (*n) - ((*n)%4); for ( i = 0 ; i < m ; i+=4 ){ B[i ] = A[i ]; B[i+1] = A[i+1]; B[i+2] = A[i+2]; B[i+3] = A[i+3]; } for ( i = m ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } /* TWO-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy21(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c) end do end do end #endif void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur) { int r, c, i=0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ c * (*ald) + r ]; } } (*cur) = i; return; } #if 0 subroutine dcopy12(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 A(r,c) = buf(cur) end do end do end #endif void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur) { int r, c, i=0; i = 0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] = buf[i++]; } } (*cur) = i; return; } #if 0 subroutine dcopy2d_n(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) do c = 1, cols do r = 1, rows B(r,c) = A(r,c) end do end do end #endif void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } #if 0 subroutine dcopy2d_u(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) integer r1 double precision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 b(r,c) = a(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) d2 = a(r+1,c) d3 = a(r+2,c) d4 = a(r+3,c) b(r,c) = d1 b(r+1,c) = d2 b(r+2,c) = d3 b(r+3,c) = d4 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 c$$$ b(r+1,c) = a(r+1,c) + b(r+1,c) * 0 c$$$ b(r+2,c) = a(r+2,c) + b(r+2,c) * 0 c$$$ b(r+3,c) = a(r+3,c) + b(r+3,c) * 0 enddo enddo end #endif void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ int m = (*rows) - ((*rows)%4); for ( r = 0 ; r < m ; r+=4 ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; B[ c * (*bld) + r+1 ] = A[ c * (*ald) + r+1 ]; B[ c * (*bld) + r+2 ] = A[ c * (*ald) + r+2 ]; B[ c * (*bld) + r+3 ] = A[ c * (*ald) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } /* THREE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy31(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c,p) end do end do end do end #endif void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ]; } } } (*cur) = i; return; } #if 0 subroutine dcopy13(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 A(r,c,p) = buf(cur) end do end do end do end #endif void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ] = buf[i++]; } } } (*cur) = i; return; } ga-5-4/armci/src-gemini/shmem.c0000644000175000017500000007625712662210416014456 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmem.c,v 1.87.2.2 2007-09-10 23:31:32 manoj Exp $ */ /* System V shared memory allocation and managment * * Interface: * ~~~~~~~~~ * char *Create_Shared_Region(long *idlist, long size, long *offset) * . to be called by just one process. * . calls kr_malloc, malloc-like memory allocator from the K&R book. * kr_malloc inturn calls armci_allocate() that does shmget() and shmat(). * . idlist might be just a pointer to integer or a true array in the * MULTIPLE_REGIONS versions (calling routine has to take care of it) * char *Attach_Shared_Region(long *idlist, long size, long offset) * . called by any other process to attach to existing shmem region or * if attached just calculate the address based on the offset * . has to be called after shmem region was created * void Free_Shmem_Ptr(long id, long size, char* addr) * . called ONLY by the process that created shmem region (id) to return * pointer to kr_malloc (shmem is not destroyed) * void Delete_All_Regions() * . destroys all shared memory regions * . can be called by any process assuming that all processes attached * to alllocated shmem regions * . needs to by called by cleanup procedure(s) * * Jarek Nieplocha, 06.13.94 * */ #ifdef SYSV #define DEBUG_ 0 #define DEBUG1 0 #define DEBUG2_ 0 /* For debugging purposes at the beginning of the shared memory region * creator process can write a stamp which then is read by attaching processes * NOTE: on clusters we cannot use it anymore since ARMCI node master * uses it since Nov 99 to write the value of address it attached at * This feature is used in the ARMCI memlock table. */ #define STAMP 0 #include #include #include #include #include #include #include #include #include "armci_shmem.h" #include "kr_malloc.h" #include "shmlimit.h" #include "message.h" #include "armcip.h" #ifdef ALLOC_MUNMAP #include #include static size_t pagesize=0; static int logpagesize=0; /* allow only that big shared memory segment (in MB)- incresed from 128 11/02 */ #define MAX_ALLOC_MUNMAP 128 #define MAX_ALLOC_MUNMAP_ 368 static long max_alloc_munmap=MAX_ALLOC_MUNMAP; #endif #if defined(SUN) extern char *shmat(); #endif #define SHM_UNIT (1024) /* Need to determine the max shmem segment size. There are 2 alternatives: * 1. use predefined SHMMAX if available or set some reasonable values, or * 2. trial-and-error search for a max value (default) * case a) fork a process to determine shmmax size (more accurate) * case b) search w/o forking until success (less accurate) */ /* under Myrinet GM, we cannot fork */ #if defined(GM) || defined(VAPI) # define SHMMAX_SEARCH_NO_FORK #endif #if defined(LAPI) || defined(AIX) || defined(SHMMAX_SEARCH_NO_FORK) || defined(CRAY_XT) || defined(CRAY_UGNI) # define NO_SHMMAX_SEARCH #endif /* Limits for the largest shmem segment are in Kilobytes to avoid passing * Gigavalues to kr_malloc * the limit for the KSR is lower than SHMMAX in sys/param.h because * shmat would fail -- SHMMAX cannot be trusted (a bug) */ #define _SHMMAX 4*1024 #if defined(SUN)||defined(SOLARIS) # undef _SHMMAX # define _SHMMAX (1024) /* memory in KB */ #elif defined(SGI64) || defined(AIX) || defined(CONVEX) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(SGI) && !defined(SGI64) # undef _SHMMAX # define _SHMMAX ((unsigned long)128*1024) #elif defined(KSR) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(HPUX) # undef _SHMMAX # define _SHMMAX ((unsigned long)64*1024) #elif defined(__FreeBSD__) # undef _SHMMAX # define _SHMMAX ((unsigned long)3*1024) #elif defined(LINUX) # if !defined(SHMMAX) /* Red Hat does not define SHMMAX */ # undef _SHMMAX # if defined(__sparc__) || defined(__powerpc__) # define _SHMMAX ((unsigned long)16*1024) # elif defined(__alpha__) # define _SHMMAX ((unsigned long)4072) # else /* Intel */ # define _SHMMAX ((unsigned long)32*1024) # endif # endif #elif defined(SHMMAX) # undef _SHMMAX # define _SHMMAX (((unsigned long)SHMMAX)>>10) #endif static unsigned long MinShmem_per_core = 0; static unsigned long MaxShmem_per_core = 0; static unsigned long MinShmem = _SHMMAX; static unsigned long MaxShmem = MAX_REGIONS*_SHMMAX; static context_t ctx_shmem; /* kr_malloc context */ static context_t *ctx_shmem_global; /* kr_malloc context stored in shmem */ static int create_call=0; #ifdef SHMMAX_SEARCH_NO_FORK static char *ptr_search_no_fork = (char*)0; static int id_search_no_fork=0; #endif #ifdef LINUX #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm shm %d",id); #elif defined(SOLARIS) #define CLEANUP_CMD(command) sprintf(command,"/bin/ipcrm -m %d",id); #elif defined(SGI) #define CLEANUP_CMD(command) sprintf(command,"/usr/sbin/ipcrm -m %d",id); #else #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm -m %d",id); #endif #ifdef ALLOC_MUNMAP #ifdef QUADRICS # include # include static char *armci_elan_starting_address = (char*)0; # ifdef __ia64__ # define ALLOC_MUNMAP_ALIGN 1024*1024 # else # define ALLOC_MUNMAP_ALIGN 64*1024 # endif # define ALGN_MALLOC(s,a) elan_allocMain(elan_base->state, (a), (s)) #else # define ALGN_MALLOC(s,a) malloc((s)) #endif static char* alloc_munmap(size_t size) { char *tmp; unsigned long iptr; size_t bytes = size+pagesize-1; if(armci_elan_starting_address){ tmp = armci_elan_starting_address; armci_elan_starting_address += size; # ifdef ALLOC_MUNMAP_ALIGN armci_elan_starting_address += ALLOC_MUNMAP_ALIGN; # endif if(DEBUG_) {printf("%d: address for shm attachment is %p size=%ld\n", armci_me,tmp,(long)size); fflush(stdout); } } else { tmp = ALGN_MALLOC(bytes, getpagesize()); if(tmp){ iptr = (unsigned long)tmp + pagesize-1; iptr >>= logpagesize; iptr <<= logpagesize; if(DEBUG_) printf("%d:unmap ptr=%p->%p size=%d pagesize=%d\n",armci_me, tmp,(char*)iptr,(int)size,pagesize); tmp = (char*)iptr; if(munmap(tmp, size) == -1) armci_die("munmap failed",0); if(DEBUG_){printf("%d: unmap OK\n",armci_me); fflush(stdout);} }else armci_die("alloc_munmap: malloc failed",(int)size); } return tmp; } #endif /*\ A wrapper to shmget. Just to be sure that ID is not 0. \*/ int armci_shmget(size_t size,char *from) { int id; id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); /*attaching with id 0 somehow fails (Seen on pentium4+linux24+gm163) *so if id=0, shmget again. */ while(id==0){ /* free id=0 and get a new one */ if(shmctl((int)id,IPC_RMID,(struct shmid_ds *)NULL)) { fprintf(stderr,"id=%d \n",id); armci_die("allocate: failed to _delete_ shared region ",id); } id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); } if(DEBUG_){ printf("\n%d:armci_shmget sz=%ld caller=%s id=%d\n",armci_me,(long)size, from,id); fflush(stdout); } return(id); } static int Semget(key_t key,int nsems,int semflg) { int ret; if((ret = semget(key,nsems,semflg)) == -1) { switch(errno) { case EACCES: fprintf(stdout," semget errno=EACCES.\n"); break; case EINVAL: fprintf(stdout," semget errno=EINVAL.\n"); break; case ENOENT: fprintf(stdout," semget errno=ENOENT.\n"); break; case ENOSPC: fprintf(stdout," semget errno=ENOSPC -- check system limit for sysv semaphores.\n"); break; case ENOMEM: fprintf(stdout," semget errno=ENOMEM.\n"); break; case EEXIST: fprintf(stdout," semget errno=EEXIST.\n"); break; default: fprintf(stdout," unusual semget errno=%d\n",errno); break; } armci_die("semget failed",errno); } return ret; } int armci_semget(int count) { int id; id = Semget(IPC_PRIVATE,2,0600); return id; } int armci_semrm(int id) { semctl(id,0,IPC_RMID); } int armci_shmrm(int id) { int ret; if((ret = shmctl(id,IPC_RMID,NULL)) != 0) { fprintf(stdout,"[cp]: shmctl return an error.\n"); switch(errno) { case EINVAL: fprintf(stdout," Error EINVAL: shmid is not a valid shared memory segment.\n"); break; case EFAULT: fprintf(stdout," Error EFAULT: argument 3 is not a valid struct shmid_ds.\n"); break; case EPERM: fprintf(stdout," Error EPREM: permission to access/change shared mem segment denied.\n"); break; default: fprintf(stdout," unusual shmctl errno=%d\n",errno); break; break; } armci_die("error deleting shmid",id); } return ret; } /*\ test is a shared memory region of a specified size can be allocated * return 0 (no) or 1 (yes) \*/ int armci_test_allocate(long size) { char *ptr; int id = armci_shmget((size_t)size,"armci_test_allocate"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* delete segment id */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); /* test pointer */ if (((long)ptr) == -1L) return 0; else return 1; } /*\ try to allocate a shared memory region of a specified size; return pointer \*/ static int armci_shmalloc_try(long size) { #ifdef SHMMAX_SEARCH_NO_FORK char *ptr; int id = armci_shmget((size_t) size,"armci_shmalloc_try"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* test pointer */ if (((long)ptr) == -1L) return 0; ptr_search_no_fork = ptr; id_search_no_fork = id; #endif return 1; } /* parameters that define range and granularity of search for shm segment size * UBOUND is chosen to be < 2GB to avoid overflowing on 32-bit systems * smaller PAGE gives more accurate results but with more search steps * LBOUND is set to minimum amount for our purposes * change UBOUND=512MB if you need larger arrays than 512 MB */ #define PAGE (16*65536L) #define LBOUND 1048576L #if defined(MULTI_CTX) && defined(QUADRICS) #define UBOUND (256*LBOUND) #else #define UBOUND (512*LBOUND) #endif static long get_user_shmmax() { char *uval; long x=0; uval = getenv("ARMCI_DEFAULT_SHMMAX"); if(uval != NULL){ sscanf(uval,"%ld",&x); if(x<1L || x> 2048L){ fprintf(stderr,"incorrect ARMCI_DEFAULT_SHMMAX should be <1,2048>mb and 2^N Found=%ld\n",x); x=0; } } return x*1048576; /* return value in bytes */ } /*\ determine the max shmem segment size using bisection \*/ int armci_shmem_test() { long x; int i,rc; long upper_bound=UBOUND; long lower_bound=0; x = get_user_shmmax(); if(!x) x = upper_bound; else upper_bound =x; if(DEBUG_){printf("%d: x = %ld upper_bound=%ld\n",armci_me, x, upper_bound); fflush(stdout);} for(i=1;;i++){ long step; rc = armci_test_allocate(x); if(DEBUG_) printf("%d:test %d size=%ld bytes status=%d\n",armci_me,i,x,rc); if(rc){ lower_bound = x; step = (upper_bound -x)>>1; if(step < PAGE) break; x += step; }else{ upper_bound = x; step = (x-lower_bound)>>1; if(step>=20; x <<=20; } if(!lower_bound){ /* try if can get LBOUND - necessary if search starts from UBOUND */ lower_bound=LBOUND; rc = armci_test_allocate(lower_bound); if(!rc) return(0); } if(DEBUG_) printf("%ld bytes segment size, %d calls \n",lower_bound,i); return (int)( lower_bound>>20); /* return shmmax in mb */ } #ifdef SHMMAX_SEARCH_NO_FORK /*\ determine the max shmem segment size by halving \*/ static int armci_shmem_test_no_fork() { long x; int i,rc; long lower_bound=_SHMMAX*SHM_UNIT; #define UBOUND_SEARCH_NO_FORK (256*SHM_UNIT*SHM_UNIT) x = get_user_shmmax(); if(!x) x = UBOUND_SEARCH_NO_FORK; for(i=1;;i++){ rc = armci_shmalloc_try(x); if(DEBUG_) printf("%d:test by halving size=%ld bytes rc=%d\n",armci_me,x,rc); if(rc){ lower_bound = x; break; }else{ x >>= 1 ; if(x>20); /* return shmmax in mb */ } #endif #ifdef MULTI_CTX void armci_nattach_preallocate_info(int* segments, int *segsize) { int x; char *uval; uval = getenv("LIBELAN_NATTACH"); if(uval != NULL){ sscanf(uval,"%d",&x); if(x<2 || x>8) armci_die("Error in LIBELAN_NATTACH <8, >1 ",(int)x); }else armci_die("Inconsistent configuration: ARMCI needs LIBELAN_NATTACH",0); *segments =x; *segsize = (int) (SHM_UNIT * MinShmem); } #endif /* Create shared region to store kr_malloc context in shared memory */ void armci_krmalloc_init_ctxshmem() { void *myptr=NULL; long idlist[SHMIDLEN]; long size; int offset = sizeof(void*)/sizeof(int); /* to store shared memory context and myptr */ size = SHMEM_CTX_MEM; if(armci_me == armci_master ){ myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_krmalloc_init_ctxshmem: could not create", (int)(size>>10)); if(size) *(volatile void**)myptr = myptr; if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem addr mptr=%p ref=%p size=%ld\n", armci_me, myptr, *(void**)myptr, size); fflush(stdout); } /* Bootstrapping: allocate storage for ctx_shmem_global. NOTE:there is offset,as master places its address at begining for others to see */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); *ctx_shmem_global = ctx_shmem; /*master copies ctx into shared region */ } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_krmalloc_init_ctxshmem: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } /* store context info */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem: shmid=%d off=%ld size=%ld\n", armci_me, ctx_shmem_global->shmid, ctx_shmem_global->shmoffset, (long)ctx_shmem_global->shmsize); fflush(stdout); } } } void armci_shmem_init() { #ifdef ALLOC_MUNMAP #if defined(QUADRICS) # if (defined(__ia64__) || defined(__alpha)) && !defined(DECOSF) /* this is to determine size of Elan Main memory allocator for munmap */ long x; char *uval; uval = getenv("LIBELAN_ALLOC_SIZE"); if(uval != NULL){ sscanf(uval,"%ld",&x); if((x>80000000) && (x< 4*1024*1024*1024L)){ max_alloc_munmap = (x>>20) - 72; if(DEBUG_){ printf("%d: max_alloc_munmap is %ld\n",armci_me,max_alloc_munmap); fflush(stdout); } } } /* an alternative approach is to use MMAP area where we get the address from the Elan environment variable in qsnetlibs 1.4+ */ uval = getenv("LIBELAN3_MMAPBASE"); if(uval != NULL){ sscanf(uval,"%p",&armci_elan_starting_address); } # endif # if defined(__ia64__) /* need aligment on 1MB boundary rather than the actual pagesize */ pagesize = 1024*1024; logpagesize = 20; # else /* determine log2(pagesize) needed for address alignment */ int tp=512; logpagesize = 9; pagesize = getpagesize(); if(tp>pagesize)armci_die("armci_shmem_init:pagesize",pagesize); while(tpmax_alloc_munmap && !armci_elan_starting_address) x=max_alloc_munmap; # else x = 10; /* mb */ # endif # endif if(DEBUG_){ printf("%d:shmem_init: %d mbytes max segment size\n",armci_me,x);fflush(stdout);} MinShmem = (long)(x<<10); /* make sure it is in kb: mb <<10 */ MaxShmem = MAX_REGIONS*MinShmem; # ifdef REPORT_SHMMAX printf("%d using x=%d SHMMAX=%ldKB\n", armci_me,x, MinShmem); fflush(stdout); # endif #else /* nothing to do here - limits were given */ #endif } armci_krmalloc_init_ctxshmem(); if(DEBUG_)printf("%d: out of shmem_init\n",armci_me); } void armci_set_shmem_limit_per_node(int nslaves) { if (MaxShmem_per_core > 0) MaxShmem = nslaves*MaxShmem_per_core; if (MinShmem_per_core > 0) MinShmem = nslaves*MinShmem_per_core; } void armci_set_shmem_limit_per_core(unsigned long shmemlimit) { MaxShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; MinShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; } /*\ application can reset the upper limit (bytes) for memory allocation \*/ void armci_set_shmem_limit(unsigned long shmemlimit) { unsigned long kbytes; kbytes = (shmemlimit + SHM_UNIT -1)/SHM_UNIT; if(MaxShmem > kbytes) MaxShmem = kbytes; if(MinShmem > kbytes) MinShmem = kbytes; } static void shmem_errmsg(size_t size) { long sz=(long)size; printf("******************* ARMCI INFO ************************\n"); printf("The application attempted to allocate a shared memory segment "); printf("of %ld bytes in size. This might be in addition to segments ",sz); printf("that were allocated succesfully previously. "); printf("The current system configuration does not allow enough "); printf("shared memory to be allocated to the application.\n"); printf("This is most often caused by:\n1) system parameter SHMMAX "); printf("(largest shared memory segment) being too small or\n"); printf("2) insufficient swap space.\n"); printf("Please ask your system administrator to verify if SHMMAX "); printf("matches the amount of memory needed by your application and "); printf("the system has sufficient amount of swap space. "); printf("Most UNIX systems can be easily reconfigured "); printf("to allow larger shared memory segments,\n"); printf("see http://www.emsl.pnl.gov/docs/global/support.shtml\n"); printf("In some cases, the problem might be caused by insufficient swap space.\n"); printf("*******************************************************\n"); } static struct shm_region_list{ char *addr; long id; long sz; long attached; }region_list[MAX_REGIONS]; static int alloc_regions=0; static long occup_blocks=0; /* Terminology * region - actual piece of shared memory allocated from OS * block - a part of allocated shmem that is given to the requesting process */ static int last_allocated=-1; unsigned long armci_max_region() { return MinShmem; } int find_regions(char *addrp, long* id, int *region) { int nreg, reg; if(last_allocated!=-1){ reg=last_allocated; last_allocated = -1; } else{ for(reg=-1,nreg=0;nreg= region_list[nreg].addr && addrp < (region_list[nreg].addr + region_list[nreg].sz)) { reg = nreg; break; } } if(reg == -1) armci_die("find_regions: failed to locate shared region", 0L); } *region = reg; *id = region_list[reg].id; return 1; } /* returns the shmem info based on the addr */ int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize) { int region; long id; find_regions(addrp, &id, ®ion); *shmid = id; *shmoffset = (long)(addrp - region_list[region].addr); *shmsize = region_list[region].sz; return 1; } long armci_shm_reg_size(int i, long id) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_size: bad i",i); return region_list[i].sz; } void* armci_shm_reg_ptr(int i) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_ptr: bad i",i); return (void *)region_list[i].addr; } Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize) { /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset)*/ long idlist[SHMIDLEN]; Header *p = NULL; idlist[1] = (long)shmid; idlist[0] = shmoffset; idlist[IDLOC+1] = shmsize; /* CHECK : idlist in CreateShmem????*/ if(!(p=(Header*)Attach_Shared_Region(idlist+1, shmsize, idlist[0]))) armci_die("kr_malloc:could not attach",(int)(p->s.shmsize>>10)); #if DEBUG_ printf("%d: armci_get_shmem_ptr: %d %ld %ld %p\n", armci_me, idlist[1], idlist[0], shmsize, p); fflush(stdout); #endif return p; } char *Attach_Shared_Region(id, size, offset) long *id, offset, size; { int reg, found, shmflag=0; static char *temp; if(alloc_regions>=MAX_REGIONS) armci_die("Attach_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:AttachSharedRegion %d:size=%ld id=%ld\n", armci_me, create_call++, size,*id); fflush(stdout); } /* under Linux we can get valid id=0 */ #ifndef LINUX if(!*id) armci_die("Attach_Shared_Region: shmem ID=0 ",(int)*id); #endif /* first time needs to initialize region_list structure */ if(!alloc_regions){ for(reg=0;reg= MAX_REGIONS) armci_die("Create_Shared_Region:allocate:too many regions allocated ",0); last_allocated = alloc_regions; #ifdef SHMMAX_SEARCH_NO_FORK if (ptr_search_no_fork){ temp = ptr_search_no_fork; id = id_search_no_fork; ptr_search_no_fork = (char*)0; /* do not look at it again */ }else #endif { if ( (id = armci_shmget(sz,"armci_allocate")) < 0 ) { fprintf(stderr,"id=%d size=%ld\n",id, size); shmem_errmsg(sz); armci_die("allocate: failed to create shared region ",id); } if ( (long)( (temp = shmat(id, pref_addr, shmflag))) == -1L){ char command[64]; CLEANUP_CMD(command); if(system(command) == -1) printf("Please clean shared memory (id=%d): see man ipcrm\n",id); armci_die("allocate: failed to attach to shared region id=",id); } if(DEBUG_){ printf("%d:allocate:attach:id=%d paddr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } #if 1 /* delete segment id so that OS cleans it when all attached processes are gone */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); #endif } POST_ALLOC_CHECK(temp,sz); region_list[alloc_regions].addr = temp; region_list[alloc_regions].id = id; region_list[alloc_regions].attached=1; region_list[alloc_regions].sz=sz; alloc_regions++; if(DEBUG2_){ printf("%d:allocate:id=%d addr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } return (void*) (temp); } /******************** common code for the two versions *********************/ /*\ Allocate a block of shared memory - called by master process \*/ char *Create_Shared_Region(long *id, long size, long *offset) { char *temp; int reg, refreg=0,nreg; if(alloc_regions>=MAX_REGIONS) armci_die("Create_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:CreateSharedRegion %d:size=%ld\n",armci_me,create_call++,size); fflush(stdout); } /*initialization: 1st allocation request */ if(!alloc_regions){ for(reg=0;reg #include "armcip.h" armci_user_threads_t armci_user_threads; void armci_init_threads() { int i, bytes; char *uval = getenv("ARMCI_MAX_THREADS"); armci_user_threads.max = 1; armci_user_threads.avail = 0; if (uval != NULL) sscanf(uval, "%d", &armci_user_threads.max); if (armci_user_threads.max < 1 || armci_user_threads.max > ARMCI_THREADS_LIMIT) { printf("Error: Only 1-%d threads are supported. ",ARMCI_THREADS_LIMIT); printf("Set ARMCI_MAX_THREADS appropriately\n"); fflush(stdout); armci_die("armci_init_threads: failed", 0); } bytes = sizeof(thread_id_t) * armci_user_threads.max; if ( !(armci_user_threads.ids = (thread_id_t*) malloc(bytes)) ) { armci_die("armci_init_threads: armci_user_threads.ids malloc failed", armci_user_threads.max); } memset(armci_user_threads.ids, 0, bytes); #if 0 /* spinlock has void return value */ if (THREAD_LOCK_INIT(armci_user_threads.lock) || THREAD_LOCK_INIT(armci_user_threads.buf_lock) || THREAD_LOCK_INIT(armci_user_threads.net_lock)) armci_die("armci_init_threads:locks initialization failed", 0); #else THREAD_LOCK_INIT(armci_user_threads.lock); THREAD_LOCK_INIT(armci_user_threads.buf_lock); THREAD_LOCK_INIT(armci_user_threads.net_lock); #endif #if 0 /* using one lock per socket for now, it might be feasible (and usefull) * to use two (one for sending and one for receiving) */ armci_user_threads.sock_locks = malloc(armci_nclus *sizeof(thread_lock_t)); for (i = 0; i < armci_nclus; i++) if (THREAD_LOCK_INIT(armci_user_threads.sock_locks[i])) armci_die("armci_init_threads:sock locks initialization failed", i); #endif } void armci_finalize_threads() { THREAD_LOCK_DESTROY(armci_user_threads.lock); THREAD_LOCK_DESTROY(armci_user_threads.net_lock); THREAD_LOCK_DESTROY(armci_user_threads.buf_lock); free(armci_user_threads.ids); } /* calling armci_thread_idx for every function that accesses thread-private data * might be expensive -- needs optiomization */ INLINE int armci_thread_idx() { int i, n = ARMCI_MIN(armci_user_threads.avail, armci_user_threads.max); thread_id_t id = THREAD_ID_SELF(); for (i = 0; i < n; i++) if (id == armci_user_threads.ids[i]) { /*PRNDBG2("thread id=%ld already registered, idx=%d\n", id, i);*/ return i; } /* see this thread for the first time */ return armci_register_thread(id); } INLINE int armci_register_thread(thread_id_t id) { int i; THREAD_LOCK(armci_user_threads.lock); i = armci_user_threads.avail; armci_user_threads.avail++; THREAD_UNLOCK(armci_user_threads.lock); if (i < armci_user_threads.max) armci_user_threads.ids[i] = id; else armci_die("armci_thread_idx: too many threads, adjust ARMCI_MAX_THREADS", armci_user_threads.avail); PRNDBG2("registered a new thread: idx=%d, id=%ld\n", i, id); return i; } ga-5-4/armci/src-gemini/spinlock.h0000644000175000017500000001226112662210416015155 0ustar mbamba/** * @file spinlock.h * * This file attempts to implement spin locks for various platforms and/or CPU * instruction sets. */ #ifndef SPINLOCK_H #define SPINLOCK_H #define DEBUG_SPINLOCK 0 #define OPENPA 0 #if OPENPA # if DEBUG_SPINLOCK # warning SPINLOCK: openpa # endif # define SPINLOCK # include "opa_primitives.h" # define LOCK_T OPA_int_t # define TESTANDSET(x) OPA_swap_int((x), 1) # define MEMORY_BARRIER OPA_read_write_barrier #elif (defined(PPC) || defined(__PPC__) || defined(__PPC)) # if DEBUG_SPINLOCK # warning SPINLOCK: PPC # endif # define SPINLOCK # include "asm-ppc.h" //# define TESTANDSET testandset //# define TESTANDSET acquireLock # define armci_acquire_spinlock acquire_spinlock # define armci_release_spinlock release_spinlock # define MEMORY_BARRIER memory_barrier static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } static void memory_barrier() { __asm__ __volatile__ ("sync" : : : "memory"); } #elif defined(__i386__) || defined(__x86_64__) # if DEBUG_SPINLOCK # warning SPINLOCK: x86_64 # endif # define SPINLOCK # include "atomics-i386.h" static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } # define TESTANDSET testandset #elif defined(__ia64) # if DEBUG_SPINLOCK # warning SPINLOCK: ia64 # endif # define SPINLOCK # include "atomic_ops_ia64.h" static int testandset(void *spinlock) { int val=1; int res; atomic_swap_int(spinlock, val, &res); return res; } # define TESTANDSET testandset #elif defined(DECOSF) # if DEBUG_SPINLOCK # warning SPINLOCK: DECOSF # endif # error "no implementation" #elif defined(SGI) # if DEBUG_SPINLOCK # warning SPINLOCK: SGI # endif # include # define SPINLOCK # define TESTANDSET(x) __lock_test_and_set((x), 1) # define RELEASE_SPINLOCK __lock_release /*#elif defined(AIX)*/ #elif HAVE_SYS_ATOMIC_OP_H # if DEBUG_SPINLOCK # warning SPINLOCK: sys/atomic_op.h (AIX) # endif # include # define SPINLOCK # define TESTANDSET(x) (_check_lock((x), 0, 1)==TRUE) # define RELEASE_SPINLOCK(x) _clear_lock((x),0) #elif defined(SOLARIS) # if DEBUG_SPINLOCK # warning SPINLOCK: SOLARIS # endif # include # include # define SPINLOCK # define TESTANDSET(x) (!_lock_try((x))) # define RELEASE_SPINLOCK _lock_clear #elif defined(MACX) #elif defined(HPUX__) # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX__ # endif extern int _acquire_lock(); extern void _release_lock(); # define SPINLOCK # define TESTANDSET(x) (!_acquire_lock((x))) # define RELEASE_SPINLOCK _release_lock #elif defined(HPUX) && defined(__ia64) /* HPUX on IA64, non gcc */ # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX ia64 # endif # define SPINLOCK typedef unsigned int slock_t; # include # define TESTANDSET(lock) _Asm_xchg(_SZ_W, lock, 1, _LDHINT_NONE) # define RELEASE_SPINLOCK(lock) (*((volatile LOCK_T *) (lock)) = 0) #elif defined(NEC) # if DEBUG_SPINLOCK # warning SPINLOCK: NEC # endif extern ullong ts1am_2me(); # define LOCK_T ullong # define _LKWD (1ULL << 63) # define SPINLOCK # define TESTANDSET(x) ((_LKWD & ts1am_2me(_LKWD, 0xffULL, (ullong)(x)))) # define MEMORY_BARRIER mpisx_clear_cache extern void mpisx_clear_cache(); # define RELEASE_SPINLOCK(x) ts1am_2me(0ULL, 0xffULL, (ullong)x); #endif #ifdef SPINLOCK #if DEBUG_ # if HAVE_STDIO_H # include # endif #endif #if HAVE_UNISTD_H # include #endif #ifndef DBL_PAD # define DBL_PAD 16 #endif /* make sure that locks are not sharing the same cache line */ typedef struct{ double lock[DBL_PAD]; }pad_lock_t; #ifndef LOCK_T # define LOCK_T int #endif #define PAD_LOCK_T pad_lock_t static inline void armci_init_spinlock(LOCK_T *mutex) { #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif } #ifdef TESTANDSET static inline void armci_acquire_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else int loop=0, maxloop =10; while (TESTANDSET(mutex)){ loop++; if(loop==maxloop){ # if DEBUG_ extern int armci_me; printf("%d:spinlock sleeping\n",armci_me); fflush(stdout); # endif usleep(1); loop=0; } } #endif } #ifdef RELEASE_SPINLOCK # ifdef MEMORY_BARRIER # define armci_release_spinlock(x) MEMORY_BARRIER(); RELEASE_SPINLOCK(x) # else # define armci_release_spinlock(x) RELEASE_SPINLOCK(x) # endif #else static inline void armci_release_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif # if (defined(MACX)||defined(LINUX)) && defined(__GNUC__) && defined(__ppc__) __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif } #endif /* RELEASE_SPINLOCK */ #endif /* TESTANDSET */ #endif /* SPINLOCK */ #endif /* SPINLOCK_H */ ga-5-4/armci/src-gemini/ds-shared.c0000644000175000017500000004037612662210416015210 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "request.h" #include "message.h" #include "memlock.h" #include "copy.h" #include "gpc.h" #include #include #ifdef WIN32 #include #else #include #endif #define DEBUG_ 0 #define DEBUG1 0 #ifndef SERV # define SERV 2 #endif #ifdef SOCKETS # define EQ_TAGS(a_, b_) ((a_) == (b_)) #else # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #endif int _armci_server_started=0; extern active_socks_t *_armci_active_socks; #ifdef ARMCI_CHECK_STATE typedef struct sarns{ int data; long data1; struct sarns *next; } sarnode; sarnode **sarn_np=NULL; sarnode * sarlist_add(int pr, int i,long j) { sarnode **p = &sarn_np[pr]; sarnode *n = (sarnode *)malloc(sizeof(sarnode)); assert(n != NULL); n->next = *p; *p = n; n->data = i; n->data1 = j; return *p; } void sarlist_remove(sarnode **p) { if(*p != NULL){ sarnode *n = *p; *p = (*p)->next; free(n); } } sarnode **sarlist_search(sarnode **n, long i) { while (*n != NULL){ if ((*n)->data == i){ return n; } n = &(*n)->next; } return NULL; } void sarlist_print(int proc) { sarnode *n =sarn_np[proc]; if (n == NULL){ /*printf("sarlist is empty\n");*/ } while (n != NULL){ printf("(%d):%d %d next=%d\n", armci_me,n->data,n->data1,(n->next==NULL)?0:1); n = n->next; } } #endif /*\ client sends request to server \*/ void armci_send_req(int proc, request_header_t* msginfo, int len,int tag) { int hdrlen = sizeof(request_header_t); int bytes; ARMCI_PR_DBG("enter",0); if(msginfo->operation == GET) { if(msginfo->format==VECTOR && msginfo->ehlen > 0) { printf("%d [cp] unhandled condition in send_req for VECTOR and ehlen\n",armci_me); abort(); bytes = msginfo->dscrlen + hdrlen + msginfo->datalen; } else { bytes = msginfo->dscrlen + hdrlen; } } else bytes = msginfo->bytes + hdrlen; if(0 || DEBUG_) { printf("%d: sending req %d (len=%d dscr=%d data=%d) to %d \n", armci_me, msginfo->operation, bytes,msginfo->dscrlen, msginfo->datalen,proc); fflush(stdout); } if(bytes > len) armci_die2("armci_send_req:buffer overflow",bytes,len); // msginfo->tag.data_ptr = (msginfo+1); // not really data, but dscr ptr armci_send_req_msg(proc,msginfo, bytes,tag); ARMCI_PR_DBG("exit",0); } /*\ client sends strided data + request to server \*/ void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[],int tag) { int hdrlen = sizeof(request_header_t); int dscrlen = msginfo->dscrlen; int datalen = msginfo->datalen; int cluster = armci_clus_id(proc); int bytes; int i,na; char *a; double *tmp; ARMCI_PR_DBG("enter",0); bytes = msginfo->bytes + hdrlen; if(0){ printf("%d:sending strided %d to(%d,%d,%d) bytes=%d dslen=%d dlen=%d,\n", armci_me, msginfo->operation, msginfo->to, cluster, proc, bytes, dscrlen, datalen); fflush(stdout); } armci_write_strided(ptr, strides, stride_arr, count, bdata); // msginfo->tag.data_ptr = (msginfo+1); #ifdef RMO_DEBUG_ a = (char *) (msginfo + 1); a += msginfo->dscrlen; tmp = (double *) a; na = msginfo->datalen/sizeof(double); for(i=0; idatalen; char *buf; ARMCI_PR_DBG("enter",0); if(rcvlen)datalen=rcvlen; if(DEBUG_) { printf("%d:armci_rcv_data: bytes= %d \n", armci_me, datalen); fflush(stdout); } if(datalen == 0) armci_die("armci_rcv_data: no data to receive",datalen); buf = armci_ReadFromDirect(proc, msginfo, datalen); if(DEBUG_){ printf("%d:armci_rcv_data: got %d bytes \n",armci_me,datalen); fflush(stdout); } ARMCI_PR_DBG("exit",0); return(buf); } /*\ client receives vector data from server and unpacks to the right loc \*/ void armci_rcv_vector_data(int proc, request_header_t* msginfo, armci_giov_t darr[], int len) { ARMCI_PR_DBG("enter",0); char *buf = armci_rcv_data(proc, msginfo, 0); armci_vector_from_buf(darr, len, buf); ARMCI_PR_DBG("exit",0); } /*\ client receives strided data from server \*/ void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]) { char *databuf; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d: armci_rcv_strided_data: expecting datalen %d from %d\n", armci_me, datalen, proc); fflush(stdout); } databuf = armci_ReadFromDirect(proc,msginfo,0); armci_read_strided(ptr, strides, stride_arr, count, databuf); ARMCI_PR_DBG("exit",0); } void armci_rem_state(int clus) { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc = 0; request_header_t *msginfo; destproc = SERVER_NODE(clus); msginfo = (request_header_t *)GET_SEND_BUFFER(bufsize,STATE,destproc); int tag=0; ARMCI_PR_DBG("enter",0); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(clus); msginfo->operation = STATE; msginfo->bytes =0; msginfo->datalen =sizeof(int); // msginfo->tag.data_ptr = (msginfo+1); if(DEBUG_){ printf("%d(c):sending ACKreq to %d clus=%d\n",armci_me,msginfo->to,clus); fflush(stdout); } armci_send_req(armci_clus_info[clus].master, msginfo, bufsize,tag); armci_rcv_data(armci_clus_info[clus].master, msginfo,0); /* receive */ FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ get ACK from server \*/ void armci_rem_ack(int clus) { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc = 0; request_header_t *msginfo; destproc = SERVER_NODE(clus); msginfo = (request_header_t *) GET_SEND_BUFFER(bufsize,ACK,destproc); int tag=0; ARMCI_PR_DBG("enter",0); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(clus); msginfo->operation = ACK; msginfo->bytes =0; msginfo->datalen =sizeof(int); // msginfo->tag.data_ptr = (msginfo+1); if(DEBUG_){ printf("%d(c):sending ACKreq to %d clus=%d\n",armci_me,msginfo->to,clus); fflush(stdout); } armci_send_req(armci_clus_info[clus].master, msginfo, bufsize,tag); armci_rcv_data(armci_clus_info[clus].master, msginfo,0); /* receive ACK */ FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ request to QUIT sent by client \*/ void armci_serv_quit() { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc; request_header_t *msginfo; destproc = SERVER_NODE(armci_clus_me); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,QUIT,destproc); int tag=0; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d master: sending quit request to server\n",armci_me); fflush(stdout); } msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->operation = QUIT; if(ACK_QUIT) msginfo->bytes = msginfo->datalen = sizeof(int); /* ACK */ else msginfo->bytes = msginfo->datalen = 0; /* no ACK */ armci_send_req(armci_master, msginfo, bufsize,tag); if(ACK_QUIT){ int stat; stat = *(int*)armci_rcv_data(armci_master,msginfo,0); /* receive ACK */ if(stat != QUIT) armci_die("armci_serv_quit: wrong response from server", stat); FREE_SEND_BUFFER(msginfo); } ARMCI_PR_SDBG("exit",0); } /***************************** server side *********************************/ static void armci_check_req(request_header_t *msginfo, int buflen) { ARMCI_PR_SDBG("enter",msginfo->operation); if((msginfo->to != armci_me && msginfo->to < armci_master) || msginfo->to >= armci_master + armci_clus_info[armci_clus_me].nslave) /*armci_die("armci_check_req: invalid to", msginfo->to);*/ printf("\n%d:got following to %d",armci_me,msginfo->to); if(msginfo->dscrlen < 0) armci_die("armci_check_req: dscrlen < 0", msginfo->dscrlen); if(msginfo->datalen < 0) armci_die("armci_check_req: datalen < 0", msginfo->datalen); if(msginfo->dscrlen > (int)msginfo->bytes) armci_die2("armci_check_req: dsclen > bytes", msginfo->dscrlen, msginfo->bytes); ARMCI_PR_SDBG("exit",0); } /*\ server response - send data to client \*/ void armci_send_data(request_header_t* msginfo, void *data) { int to = msginfo->from; ARMCI_PR_SDBG("enter",0); armci_WriteToDirect(to, msginfo, data); ARMCI_PR_SDBG("exit",0); } /*\ server sends strided data back to client \*/ void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { int i,na; double *a = NULL; int to = msginfo->from; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d(server): sending datalen = %d to %d %p\n", armci_me, msginfo->datalen, to,ptr); fflush(stdout); } /* for small contiguous blocks copy into a buffer before sending */ armci_write_strided(ptr, strides, stride_arr, count, bdata); #ifdef RMO_PORTALS_DEBUG_GET a = (double *) bdata; na = msginfo->datalen/sizeof(double); for(i=0; idatalen,to); fflush(stdout); } ARMCI_PR_SDBG("exit",0); } /*\ server sends ACK to client ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: terminating request by %d\n",armci_me,msginfo->from); fflush(stdout); } portals_ds_send_ack(ev->initiator,ev->hdr_data); \*/ void armci_server_ack(request_header_t* msginfo) { int *ack=(int*)(msginfo+1); ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: sending ACK to %d\n",armci_me,msginfo->from); fflush(stdout); } *ack = ACK; if(msginfo->datalen != sizeof(int)) armci_die("armci_server_ack: bad datalen=",msginfo->datalen); armci_send_data(msginfo,ack); ARMCI_PR_SDBG("exit",0); } /*\ server action triggered by request to quit \*/ void armci_server_goodbye(request_header_t* msginfo) { #ifdef LIBONESIDED #else ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; ARMCI_PR_SDBG("enter",0); if(DEBUG_){ printf("%d server: terminating request by %d\n",armci_me,msginfo->from); fflush(stdout); } portals_ds_send_ack(ev->initiator,ev->hdr_data); #ifdef ARMCI_CHECK_STATE_ for(int i=0;ifrom; if(DEBUG_){ printf("%d(serv):got %d request from %d\n",armci_me,msginfo->operation, from); fflush(stdout); } /*if(msginfo->operation==GET)fprintf(stderr,"GET request received with tag: %d\n",msginfo->tag);*/ switch(msginfo->operation){ # ifdef ARMCI_CHECK_STATE case STATE: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); if(DEBUG_){printf("\n%d:state request\n",armci_me);fflush(stdout);} sarlist_print(msginfo->from); armci_WriteToDirect(msginfo->from, msginfo, (msginfo+1)); break; # endif case QUIT: if(DEBUG_){ printf("%d(serv):got QUIT request from %d\n",armci_me, from); fflush(stdout); } armci_server_goodbye(msginfo); break; /*pessimism?*/ case ACK: // printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); // abort(); if(DEBUG_) { fprintf(stdout, "%d(server): got ACK request from %d\n", armci_me, msginfo->from); fflush(stdout); } armci_server_ack(msginfo); break; case ATTACH: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); // if(DEBUG_){ // printf("%d(serv):got ATTACH request from%d\n",armci_me, from); // fflush(stdout); // } // armci_server_ipc(msginfo, descr, buffer, buflen); break; case ARMCI_SWAP: case ARMCI_SWAP_LONG: case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: armci_server_rmw(msginfo,descr,buffer); break; case LOCK: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); // armci_server_lock(msginfo); break; case UNLOCK: printf("[ds %d]: operation=%d not supported yet\n",armci_me,msginfo->operation); abort(); // armci_server_unlock(msginfo, descr); // msginfo->tag.ack=ARMCI_STAMP; // x_net_send_ack(msginfo,msginfo->from,msginfo->tag.ack_ptr,&msginfo->tag.ack); break; default: if(msginfo->format == VECTOR){ armci_server_vector(msginfo, descr, buffer, buflen); // point 1 if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)) { // point 2 armci_server_send_ack(msginfo); } // the obove if clause and the similar cause below for a strided operation // was the reason for the race condition in the original portals code. // if the original request was a get, it could return it's data to the CP // once the the data is returned, the CP could fire off a new request which // would overwrite the 'now' volatile msginfo ... in which case, after returning // from armci_server_vector (having finished the get); the operation could now be // a put, in which case, it would repy back that it has also finished the put, // with out actually doing it. Msginfo could be different at points 1 and 2 if // at point 1 the operation was a get. } else if(msginfo->format == STRIDED){ // if(msginfo->operation != PUT && msginfo->operation != GET && !ARMCI_ACC(msginfo->operation)) { // printf("[ds %d]: operation=%d (format==STRIDED) not supported yet\n",armci_me,msginfo->operation); // abort(); // } armci_server(msginfo, descr, buffer, buflen); // point 1 if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)){ // point 2 armci_server_send_ack(msginfo); } } else armci_die2("armci_data_serv: unknown format code", msginfo->format, msginfo->from); } ARMCI_PR_SDBG("exit",0); } ga-5-4/armci/src-gemini/groups.c0000644000175000017500000004152112662210416014646 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: groups.c,v 1.4.6.2 2007-08-15 08:37:16 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI #endif #include "armcip.h" #include "message.h" #define DEBUG_ 0 MPI_Comm ARMCI_COMM_WORLD; /*dup of MPI_COMM_WORLD. Initialized first thing in ARMCI_Init*/ ARMCI_Group ARMCI_Default_Proc_Group = 0; ARMCI_Group ARMCI_World_Proc_Group = 0; typedef struct group_list_struct { ARMCI_Group group; ARMCI_iGroup igroup; struct group_list_struct *next; } group_list_t; group_list_t *group_list = NULL; ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; assert(group_list != NULL); while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { return ¤t_group_list_item->igroup; } current_group_list_item = current_group_list_item->next; } armci_die("ARMCI_Group lookup failed", -1); return NULL; } static void armci_create_group_and_igroup(ARMCI_Group *group, ARMCI_iGroup **igroup) { group_list_t *new_group_list_item = NULL; group_list_t *last_group_list_item = NULL; /* create the new group in the linked list */ last_group_list_item = group_list; while (last_group_list_item->next != NULL) { last_group_list_item = last_group_list_item->next; } new_group_list_item = malloc(sizeof(group_list_t)); new_group_list_item->group = last_group_list_item->group + 1; new_group_list_item->next = NULL; *igroup = &new_group_list_item->igroup; *group = new_group_list_item->group; last_group_list_item->next = new_group_list_item; } #ifdef ARMCI_GROUP void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group) { armci_msg_group_bcast_scope(SCOPE_ALL, buffer, len, ARMCI_Absolute_id(group, root), group); } #else void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm) { int result; MPI_Comm_compare(comm, ARMCI_COMM_WORLD, &result); if(result == MPI_IDENT) armci_msg_brdcst(buffer, len, root); else MPI_Bcast(buffer, len, MPI_BYTE, root, (MPI_Comm)comm); } #endif int ARMCI_Group_rank(ARMCI_Group *group, int *rank) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP if(!igroup) return MPI_ERR_GROUP; *rank = igroup->grp_attr.grp_me; return MPI_SUCCESS; #else return MPI_Group_rank((MPI_Group)(igroup->igroup), rank); #endif } void ARMCI_Group_size(ARMCI_Group *group, int *size) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP *size = igroup->grp_attr.nproc; #else MPI_Group_size((MPI_Group)(igroup->igroup), size); #endif } int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank) { int abs_rank,status; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP assert(group_rank < igroup->grp_attr.nproc); return igroup->grp_attr.proc_list[group_rank]; #else MPI_Group grp; status = MPI_Comm_group(ARMCI_COMM_WORLD,&grp); MPI_Group_translate_ranks(igroup->igroup,1,&group_rank,grp,&abs_rank); return(abs_rank); #endif } void ARMCI_Group_set_default(ARMCI_Group *group) { ARMCI_Default_Proc_Group = *group; } void ARMCI_Group_get_default(ARMCI_Group *group_out) { *group_out = ARMCI_Default_Proc_Group; } void ARMCI_Group_get_world(ARMCI_Group *group_out) { *group_out = ARMCI_World_Proc_Group; } static void get_group_clus_id(ARMCI_iGroup *igroup, int grp_nproc, int *grp_clus_id) { #ifdef ARMCI_GROUP int i; assert(grp_nproc<=igroup->grp_attr.nproc); for(i=0; igrp_attr.proc_list[i]); } #else int i, *ranks1, *ranks2; MPI_Group group2; /* Takes the list of processes from one group and attempts to determine * the corresponding ranks in a second group (here, ARMCI_COMM_WORLD) */ ranks1 = (int *)malloc(2*grp_nproc*sizeof(int)); ranks2 = ranks1 + grp_nproc; for(i=0; iigroup, grp_nproc, ranks1, group2, ranks2); /* get the clus_id of processes */ for(i=0; iicomm; #endif int grp_me, grp_nproc, grp_nclus, grp_clus_me; armci_clus_t *grp_clus_info=NULL; #ifdef CLUSTER int i, len, root=0; #endif #ifndef ARMCI_GROUP if(comm==MPI_COMM_NULL || igroup->igroup==MPI_GROUP_NULL) armci_die("group_process_list: NULL COMMUNICATOR",0); #endif ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_nproc); #ifdef CLUSTER # ifdef ARMCI_GROUP /*all processes construct the clus_info structure in parallel*/ grp_clus_info = group_construct_clusinfo(&grp_nclus, group); # else /* process 0 gets group cluster information: grp_nclus, grp_clus_info */ if(grp_me == 0) { grp_clus_info = group_construct_clusinfo(&grp_nclus, group); } /* process 0 broadcasts group cluster information */ len = sizeof(int); ARMCI_Bcast_(&grp_nclus, len, root, comm); if(grp_me){ /* allocate memory */ grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*grp_nclus; ARMCI_Bcast_(grp_clus_info, len, root, comm); # endif /* determine current group cluster node id by comparing me to master */ grp_clus_me = grp_nclus-1; for(i =0; i< grp_nclus-1; i++) { if(grp_me < grp_clus_info[i+1].master){ grp_clus_me=i; break; } } #else /* !CLUSTER */ grp_clus_me = 0; grp_nclus = 1; grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!grp_clus_info)armci_die("malloc failed for clusinfo",grp_nclus); strcpy(grp_clus_info[0].hostname, armci_clus_info[0].hostname); grp_clus_info[0].master=0; grp_clus_info[0].nslave=grp_nproc; #endif /* CLUSTER */ #ifdef ARMCI_GROUP /*Set in ARMCI_Group_create. ARMCI_Group_rank is used before setting this field. So moving it there in the generic implementation.*/ #else grp_attr->grp_me = grp_me; #endif grp_attr->grp_clus_info = grp_clus_info; grp_attr->grp_nclus = grp_nclus; grp_attr->grp_clus_me = grp_clus_me; } /* attribute caching: group_cluster_information and memory_offset should be cached in group data structure */ static void armci_cache_attr(ARMCI_Group *group) { armci_grp_attr_t *grp_attr; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); /* allocate storage for the attribute content. Note: Attribute contents should be stored in persistent memory */ grp_attr = &(igroup->grp_attr); /* get group cluster information and grp_attr */ group_process_list(group, grp_attr); } armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return(&(igroup->grp_attr)); } static void armci_igroup_finalize(ARMCI_iGroup *igroup) { #ifdef ARMCI_GROUP int world_me, i; world_me = armci_msg_me(); for(i=0; igrp_attr.nproc; i++) { if(igroup->grp_attr.proc_list[i] == world_me) { break; } } if(i==igroup->grp_attr.nproc) { return; /*not in group to be freed*/ } assert(igroup); free(igroup->grp_attr.grp_clus_info); free(igroup->grp_attr.proc_list); igroup->grp_attr.nproc = 0; #else int rv; assert(igroup); /*the following was causing seg fault*/ /*free(igroup->grp_attr.grp_clus_info);*/ rv=MPI_Group_free(&(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_free: Failed ",armci_me); if(igroup->icomm != MPI_COMM_NULL) { rv = MPI_Comm_free( (MPI_Comm*)&(igroup->icomm) ); if(rv != MPI_SUCCESS) armci_die("MPI_Comm_free: Failed ",armci_me); } #endif } void ARMCI_Group_free(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* find the group to free */ while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { break; } previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; } /* make sure we found a group */ assert(current_group_list_item != NULL); /* remove the group from the linked list */ if (previous_group_list_item != NULL) { previous_group_list_item->next = current_group_list_item->next; } /* free the group */ armci_igroup_finalize(¤t_group_list_item->igroup); free(current_group_list_item); } /* Create a child group for to the given group. @param n IN #procs in this group (<= that in group_parent) @param pid_list IN The list of proc ids (w.r.t. group_parent) @param group_out OUT Handle to store the created group @param group_parent IN Parent group */ void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *grp_parent) { int i,grp_me; ARMCI_iGroup *igroup = NULL; #ifdef ARMCI_GROUP int world_me, parent_grp_me; armci_grp_attr_t *grp_attr = NULL; #else int rv; ARMCI_iGroup *igroup_parent = NULL; MPI_Group *group_parent = NULL; MPI_Comm *comm_parent = NULL; #endif armci_create_group_and_igroup(group_out, &igroup); #ifdef ARMCI_GROUP grp_attr = &igroup->grp_attr; ARMCI_Group_rank(grp_parent, &parent_grp_me); for(i=0; inproc=0; grp_attr->proc_list = NULL; return; /*not in group to be created*/ } for(i=0; i pid_list[i+1]){ armci_die("ARMCI_Group_create: Process ids are not sorted ",armci_me); break; } } grp_attr->grp_clus_info = NULL; grp_attr->nproc = n; grp_attr->proc_list = (int *)malloc(n*sizeof(int)); assert(grp_attr->proc_list!=NULL); for(i=0; iproc_list[i] = ARMCI_Absolute_id(grp_parent,pid_list[i]); } world_me = armci_msg_me(); grp_attr->grp_me = grp_me = MPI_UNDEFINED; for(i=0; igrp_attr.proc_list[i] == world_me) { grp_attr->grp_me = grp_me = i; break; } } if(grp_me != MPI_UNDEFINED) armci_cache_attr(group_out); armci_msg_group_barrier(group_out); #else igroup_parent = armci_get_igroup_from_group(grp_parent); /* NOTE: default group is the parent group */ group_parent = &(igroup_parent->igroup); comm_parent = &(igroup_parent->icomm); rv=MPI_Group_incl(*group_parent, n, pid_list, &(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_incl: Failed ",armci_me); { MPI_Comm comm, comm1, comm2; int lvl=1, local_ldr_pos; MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me == MPI_UNDEFINED) { igroup->icomm = MPI_COMM_NULL; /*FIXME: keeping the group around for now*/ return; } assert(grp_me>=0); /*SK: sanity check for the following bitwise operations*/ MPI_Comm_dup(MPI_COMM_SELF, &comm); /*FIXME: can be optimized away*/ local_ldr_pos = grp_me; while(n> lvl) { int tag=0; int remote_ldr_pos = local_ldr_pos^lvl; if(remote_ldr_pos < n) { int remote_leader = pid_list[remote_ldr_pos]; MPI_Comm peer_comm = *comm_parent; int high = (local_ldr_posicomm = comm; MPI_Group_free(&igroup->igroup); /*cleanup temporary group*/ MPI_Comm_group(igroup->icomm, &igroup->igroup); /*the group associated with comm*/ igroup->grp_attr.grp_clus_info=NULL; /* processes belong to this group should cache attributes */ armci_cache_attr(group_out); } #endif } void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out) { ARMCI_Group_create_child(n, pid_list, group_out, (ARMCI_Group *)&ARMCI_Default_Proc_Group); } void armci_group_init() { #ifdef ARMCI_GROUP int i; #else int grp_me; #endif ARMCI_iGroup *igroup; /* Initially, World group is the default group */ ARMCI_World_Proc_Group = 0; ARMCI_Default_Proc_Group = 0; /* create the head of the group linked list */ assert(group_list == NULL); group_list = malloc(sizeof(group_list_t)); group_list->group = ARMCI_World_Proc_Group; group_list->next = NULL; igroup = &group_list->igroup; #ifdef ARMCI_GROUP /*setup the world proc group*/ igroup->grp_attr.nproc = armci_msg_nproc(); igroup->grp_attr.grp_me = armci_msg_me(); igroup->grp_attr.proc_list = (int *)malloc(igroup->grp_attr.nproc*sizeof(int)); assert(igroup->grp_attr.proc_list != NULL); for(i=0; igrp_attr.nproc; i++) { igroup->grp_attr.proc_list[i] = i; } igroup->grp_attr.grp_clus_info = NULL; armci_cache_attr(&ARMCI_World_Proc_Group); #else /* save MPI world group and communicatior in ARMCI_World_Proc_Group */ igroup->icomm = ARMCI_COMM_WORLD; MPI_Comm_group(ARMCI_COMM_WORLD, &(igroup->igroup)); /* processes belong to this group should cache attributes */ MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me != MPI_UNDEFINED) { armci_cache_attr(&ARMCI_World_Proc_Group); } #endif } void armci_group_finalize() { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* don't free the world group (the list head) */ current_group_list_item = current_group_list_item->next; while (current_group_list_item != NULL) { previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; armci_igroup_finalize(&previous_group_list_item->igroup); free(previous_group_list_item); } } /* ISSUES: 1. Make sure ARMCI_Group_free frees the attribute data structures 2. replace malloc with, kr_malloc using local_context. */ ga-5-4/armci/src-gemini/aggregate.c0000644000175000017500000003011212662210416015247 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** $Id: aggregate.c,v 1.6 2003-10-22 22:12:14 d3h325 Exp $ * Aggregate Put/Get requests */ #include "armcip.h" #include /* memcpy */ #include #define _MAX_AGG_BUFFERS 32 /* Maximum # of aggregation buffers available*/ #define _MAX_AGG_BUFSIZE 2048 /* size of each buffer. should be < 2^15 */ #define _MAX_PTRS 256 /* < 2^15, as it is "short int" in agg_req_t */ #define _MAX_AGG_HANDLE _MAX_AGG_BUFFERS /* Max # of aggregation handles */ /* aggregate request handle */ typedef struct { unsigned int tag; /* non-blocking request tag */ short int proc; /* remote process id */ short int request_len ; /* number of requests */ short int ptr_array_len; /* pointer length for this request */ short int buf_pos_end; /* position of buffer (from right end) */ armci_giov_t *darr; /* giov vectors */ }agg_req_t; static agg_req_t *aggr[_MAX_AGG_HANDLE]; /* aggregate request handle */ /* data structure for dynamic buffer management */ typedef struct { int size; /* represents the size of the list (not linked list) */ int index[_MAX_AGG_HANDLE]; } agg_list_t; static agg_list_t ulist, alist;/*in-use & available aggr buffer index list*/ /* aggregation buffer */ static char agg_buf[_MAX_AGG_BUFFERS][_MAX_AGG_BUFSIZE]; /* aggregation buffer to store the pointers */ static void* agg_src_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; static void* agg_dst_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; /** * --------------------------------------------------------------------- * fill descriptor from this side (left to right) * ---> * _______________________________________________ * | | | |. . . . . . . . . . | | | | * |__|__|__|_____________________________|__|__|__| * * <--- * fill src and dst pointer (arrays) in this direction * (right to left) * * Once they are about to cross each other (implies buffer is full), * complete the data transfer. * --------------------------------------------------------------------- */ #define AGG_INIT_NB_HANDLE(op_type, p, nb_handle) \ if(nb_handle->proc < 0) { \ nb_handle->tag = GET_NEXT_NBTAG(); \ nb_handle->op = op_type; \ nb_handle->proc = p; \ nb_handle->bufid= NB_NONE; \ } \ else if(nb_handle->op != op_type) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", nb_handle->op); \ else if(nb_handle->proc != p) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", p) /* initialize/set the fields in the buffer*/ #define _armci_agg_set_buffer(index, tag, proc, len) { \ aggr[(index)]->tag = (tag); \ aggr[(index)]->proc = (proc); \ aggr[(index)]->request_len = (len); \ ulist.index[ulist.size++] = (index);/* add the new index to the in-use list and increment it's size*/ \ } /* get the index of the aggregation buffer to be used */ static int _armci_agg_get_bufferid(armci_ihdl_t nb_handle) { int i, index, tag = nb_handle->tag, proc = nb_handle->proc; /* check if there is an entry for this handle in the existing list*/ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == tag && aggr[index]->proc == proc) return index; } /* else it is a new handle, so get a aggr buffer from either of the lists. ???? don't throw exception here */ if(ulist.size >= _MAX_AGG_BUFFERS && alist.size == 0) armci_die("_armci_agg_get_index: Too many outstanding aggregation requests\n", ulist.size); /*If there is a buffer in readily available list,use it*/ if(alist.size > 0) index = alist.index[--alist.size]; else { /* else use/get a buffer from the main list */ index = ulist.size; /* allocate memory for aggregate request handle */ aggr[index] = (agg_req_t *)agg_buf[index]; aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* allocate memory for giov vector field in aggregate request handler */ aggr[index]->darr = (armci_giov_t *)(agg_buf[index]+sizeof(agg_req_t)); } _armci_agg_set_buffer(index, tag, proc, 0); return index; } static void _armci_agg_update_lists(int index) { int i; /* remove that index from the in-use list and bring the last element in the in-use list to the position of the removed one. */ for(i=0; irequest_len; /* index of giov descriptor */ bytes_remaining = aggr[index]->buf_pos_end - (sizeof(agg_req_t) + aggr[index]->request_len*sizeof(armci_giov_t)); /* extra bytes required to store registered put data */ if(is_registered_put) bytes_needed = bytes; /* if (byte-)sizes are equal, use previously created descriptor else get a new descriptor */ if( rid && bytes==aggr[index]->darr[rid-1].bytes) --rid; else { get_new_descr=1; bytes_needed += sizeof(armci_giov_t); } /* If buffer is full, then complete data transfer. After completion, if still ptr array_len is greater than maximum limit(_MAX_PTRS), then do it by parts. Determine new ptr_array_len that fits buffer */ if( (bytes_needed > bytes_remaining) || (_MAX_PTRS - aggr[index]->ptr_array_len < *ptr_array_len)) { armci_agg_complete(nb_handle, SET); rid = 0; get_new_descr=1; if(*ptr_array_len > _MAX_PTRS) *ptr_array_len = _MAX_PTRS; } /* if new descriptor, allocate memory for src_ptr & dst_ptr arrays */ if(get_new_descr) { int i = aggr[index]->ptr_array_len; aggr[index]->darr[rid].src_ptr_array = (void **)&agg_src_ptr[index][i]; aggr[index]->darr[rid].dst_ptr_array = (void **)&agg_dst_ptr[index][i]; aggr[index]->darr[rid].ptr_array_len = 0; aggr[index]->request_len++; } /* store registered put data */ if(is_registered_put) { aggr[index]->buf_pos_end -= bytes; memcpy(&((char *)aggr[index])[aggr[index]->buf_pos_end], *((char **)registered_put_data), bytes); *(char **)registered_put_data = (char *)&((char *)aggr[index])[aggr[index]->buf_pos_end]; } aggr[index]->ptr_array_len += *ptr_array_len; return (&aggr[index]->darr[rid]); } int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle) { int one=1, idx; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); darr = _armci_agg_get_descriptor(&one, bytes, nb_handle, is_registered_put, &src); idx = darr->ptr_array_len; darr->src_ptr_array[idx] = src; darr->dst_ptr_array[idx] = dst; darr->bytes = bytes; darr->ptr_array_len += 1; fflush(stdout); return 0; } int armci_agg_save_giov_descriptor(armci_giov_t dscr[], int len, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, bytes, ptr_array_len; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=0; iptr_array_len; for(j=idx; jsrc_ptr_array[j] = dscr[i].src_ptr_array[k]; darr->dst_ptr_array[j] = dscr[i].dst_ptr_array[k]; } darr->bytes = dscr[i].bytes; darr->ptr_array_len += ptr_array_len; ptr_array_len = dscr[i].ptr_array_len - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_giov_descr failed", 0L); } while(k < darr[i].ptr_array_len); } return 0; } int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, ptr_array_len=1, total1D=1, num1D=0; int offset1, offset2, factor[MAX_STRIDE_LEVEL]; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=1; i<=stride_levels; i++) { total1D *= count[i]; factor[i-1]=0; } ptr_array_len = total1D; do { darr=_armci_agg_get_descriptor(&ptr_array_len,count[0],nb_handle,0,0); idx = darr->ptr_array_len; /* converting stride into giov vector */ for(i=idx; isrc_ptr_array[i] = (char *)src_ptr + offset1; darr->dst_ptr_array[i] = (char *)dst_ptr + offset2; ++factor[0]; ++num1D; for(j=1; jbytes = count[0]; darr->ptr_array_len += ptr_array_len; ptr_array_len = total1D - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_strided_descr failed", 0L); } while(num1D < total1D); return 0; } void armci_agg_complete(armci_ihdl_t nb_handle, int condition) { int i, index=0, rc; /* get the buffer index for this handle */ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == nb_handle->tag && aggr[index]->proc == nb_handle->proc) break; } if(i<0) return; /* implies this handle has no requests at all */ #if 0 printf("%d: Aggregation Complete to remote process %d (%d:%d requests)\n", armci_me, nb_handle->proc, index, aggr[index]->request_len); #endif /* complete the data transfer. NOTE: in LAPI, Non-blocking calls (followed by wait) performs better than blocking put/get */ if(aggr[index]->request_len) { switch(nb_handle->op) { #ifdef LAPI armci_hdl_t usr_hdl; case PUT: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbPutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbputv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; case GET: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbGetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbgetv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; #else case PUT: if((rc=PARMCI_PutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: putv failed",rc); break; case GET: if((rc=PARMCI_GetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: getv failed",rc); break; #endif } } /* setting request length to zero, as the requests are completed */ aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* If armci_agg_complete() is called PARMCI_Wait(), then unset nb_handle*/ if(condition==UNSET) { nb_handle->proc = -1; _armci_agg_update_lists(index); } } ga-5-4/armci/src-gemini/portals.c0000644000175000017500000003434112662210416015015 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* ---------------------------------------------------------------------------------------------- *\ portals.c -- wrapper for commonly used portals calls author: ryan olson email: ryan@cray.com \* ---------------------------------------------------------------------------------------------- */ # include "armcip.h" /* ---------------------------------------------------------------------------------------------- *\ global variables \* ---------------------------------------------------------------------------------------------- */ ptl_process_id_t *portals_id_map = NULL; ptl_process_id_t *portals_cloned_id_map = NULL; size_t portalsMaxEagerMessageSize; MPI_Comm portals_smp_comm; /* ---------------------------------------------------------------------------------------------- *\ static variables for this object \* ---------------------------------------------------------------------------------------------- */ static int portals_verbose = 0; /* ---------------------------------------------------------------------------------------------- *\ portals wrappers \* ---------------------------------------------------------------------------------------------- */ int portals_init(ptl_handle_ni_t *nih) { int num_interfaces = 0; int rc; rc = PtlInit(&num_interfaces); if (rc != PTL_OK) { printf("PtlInit err %d\n", rc); return rc; } rc = PtlNIInit(CRAY_UK_SSNAL, PTL_PID_ANY, NULL, NULL, nih); if (rc != PTL_OK && rc != PTL_IFACE_DUP) { printf("PtlNIInit err %d\n", rc); return rc; } portalsMaxEagerMessageSize = PORTALS_MAX_EAGER_MESSAGE_SIZE; return PTL_OK; } int portals_finalize(ptl_handle_ni_t nih) { PtlNIFini(nih); PtlFini(); return PTL_OK; } int portals_getid(ptl_handle_ni_t nih, ptl_process_id_t *id) { int rc; rc = PtlGetId(nih, id); if(rc != PTL_OK) { printf("PtlGetId err %d\n",rc); return rc; } return PTL_OK; } int portals_create_eq(ptl_handle_ni_t nih, ptl_size_t count, ptl_handle_eq_t *eq_handle) { int rc; rc = PtlEQAlloc(nih, count, PTL_EQ_HANDLER_NONE, eq_handle); if (rc != PTL_OK) { printf("PtlEQAlloc err %d\n", rc); return rc; } return PTL_OK; } int portals_free_eq(ptl_handle_eq_t eq) { int rc; rc = PtlEQFree(eq); if (rc != PTL_OK) { printf("PtlEQFree err %d\n",rc); return rc; } return PTL_OK; } /* permanent buffers - such as unexpected receive buffers or data requests buffers should not be unlinked. client side buffers, such as large puts/accs would create a ME in front of the MATCH ALL unexpected buffer/data req ME. on the client side, the MATCH ALL ME should catch the ACKs */ int portals_me_attach(ptl_handle_ni_t nih, ptl_process_id_t match_id, ptl_match_bits_t match_bits, ptl_match_bits_t ignore_bits, ptl_handle_me_t *me_handle) { int rc = PtlMEAttach(nih,PORTALS_INDEX,match_id,match_bits,ignore_bits, PTL_UNLINK,PTL_INS_BEFORE,me_handle); if (rc != PTL_OK) { printf("PtlAttach err %d in me_attach\n",rc); return rc; } return PTL_OK; } int portals_me_insert(ptl_handle_me_t base, ptl_process_id_t pe_match_id, ptl_match_bits_t match_bits, ptl_match_bits_t ignore_bits, ptl_handle_me_t *me_handle) { int rc = PtlMEInsert(base,pe_match_id,match_bits,ignore_bits, PTL_UNLINK,PTL_INS_BEFORE,me_handle); if (rc != PTL_OK) { printf("PtlME err %d in portals_push_me\n",rc); return rc; } return rc; } int portals_me_unlink(ptl_handle_me_t meh) { int rc = PtlMEUnlink(meh); if(rc != PTL_OK) { printf("PtlMEUnlink err %d in me_unlink\n",rc); } return rc; } int portals_md_attach(ptl_handle_me_t me_handle, ptl_md_t md, ptl_unlink_t unlink_op, ptl_handle_md_t *md_handle) { int rc = PtlMDAttach(me_handle, md, unlink_op, md_handle); if (rc != PTL_OK) { printf("PtlMDAttach err %d\n",rc); return rc; } return PTL_OK; } int portals_md_bind(ptl_handle_ni_t nih, ptl_md_t md, ptl_unlink_t unlink_op, ptl_handle_md_t *md_handle) { int rc = PtlMDBind(nih, md, unlink_op, md_handle); if (rc != PTL_OK) { printf("PtlMDBind err %d\n",rc); return rc; } return rc; } int portals_eqwait(ptl_handle_eq_t eqh, ptl_event_t *ev) { int rc = PtlEQWait(eqh, ev); if (rc != PTL_OK) { printf("PtlEQWait err %d\n",rc); return rc; } return PTL_OK; } static int notify(portals_desc_t *desc, int state, char *name) { if(desc->state & state) { desc->state &= ~state; if(desc->state == 0) desc->done = 1; return 1; } else { printf("event: %s with desc state %x not %x\n",name,desc->state,state); abort(); return 0; } } int portals_wait(portals_desc_t *wait_on_desc) { int rc; ptl_event_t ev; portals_desc_t *desc = NULL; while(wait_on_desc->state) { rc = portals_eqwait(wait_on_desc->eqh, &ev); if (rc != PTL_OK) { printf("eq wait error in portals_wait\n"); abort(); } desc = (portals_desc_t *) ev.md.user_ptr; switch(ev.type) { case PTL_EVENT_SEND_START: if (portals_verbose) printf("%s event: send start\n",Portals_ID()); notify(desc, STATE_SEND_START, "send start"); break; case PTL_EVENT_SEND_END: if (portals_verbose) printf("%s event: send end\n",Portals_ID()); notify(desc, STATE_SEND_END, "send end"); break; case PTL_EVENT_REPLY_START: if (portals_verbose) printf("%s event: reply start\n",Portals_ID()); notify(desc, STATE_REPLY_START, "reply start"); break; case PTL_EVENT_REPLY_END: if (portals_verbose) printf("%s event: reply end\n",Portals_ID()); notify(desc, STATE_REPLY_END, "reply end"); break; case PTL_EVENT_ACK: if (portals_verbose) printf("%s event: ack\n",Portals_ID()); printf("%s event ack: md.threshold=%d\n",Portals_ID(),ev.md.threshold); notify(desc, STATE_ACK, "ack"); break; case PTL_EVENT_PUT_START: if (portals_verbose) printf("%s event: put start\n",Portals_ID()); notify(desc, STATE_PUT_START, "put start"); break; case PTL_EVENT_PUT_END: if (portals_verbose) printf("%s event: put end\n",Portals_ID()); if (notify(desc, STATE_PUT_END, "put end")) { // desc->len = ev.mlength; // desc->off = ev.offset; } break; case PTL_EVENT_GET_START: if (portals_verbose) printf("%s event: get start\n",Portals_ID()); notify(desc, STATE_GET_START, "get start"); break; case PTL_EVENT_GET_END: if (portals_verbose) printf("%s event: get end\n",Portals_ID()); notify(desc, STATE_GET_END, "get end"); break; case PTL_EVENT_UNLINK: if (portals_verbose) printf("%s event: unlink\n",Portals_ID()); notify(desc, STATE_UNLINK, "unlink"); break; default: printf("%s event: %d\n",Portals_ID(), ev.type); break; } } return PTL_OK; } int portals_put(portals_desc_t *desc) { int rc; int threshold = 1; ptl_md_t md = { 0 }; ptl_handle_md_t md_handle; ptl_ack_req_t ack_req = PTL_NOACK_REQ; # ifdef PORTALS_PUT_USE_ACK ack_req = PTL_ACK_REQ; threshold++; # endif md.start = desc->buffer; md.length = desc->length; md.threshold = threshold; md.options = 0; # ifndef PORTALS_PUT_USE_START md.options |= PTL_MD_EVENT_START_DISABLE; # endif md.user_ptr = desc; md.eq_handle = desc->eqh; rc = portals_md_bind(desc->nih, md, PTL_UNLINK, &md_handle); if (rc != PTL_OK) { printf("failed to bind local md in put; err %d",rc); Fatal_error(rc); } rc = PtlPut(md_handle, ack_req, desc->id, PORTALS_INDEX, 0, desc->mbits, 0, desc->hdr); if (rc != PTL_OK) { printf("PtlPut err %d\n",rc); return rc; } desc->done = 0; desc->state = STATE_SEND_END; # ifdef PORTALS_PUT_USE_START desc->state |= STATE_SEND_START; # endif # ifdef PORTALS_PUT_USE_ACK desc->state |= STATE_ACK; # endif return PTL_OK; } int portals_get(portals_desc_t* desc) { int rc; ptl_md_t md = { 0 }; ptl_handle_md_t md_handle; md.start = desc->buffer; md.length = desc->length; md.threshold = 2; md.options = 0; # ifndef PORTALS_GET_USE_START md.options |= PTL_MD_EVENT_START_DISABLE; # endif md.user_ptr = desc; md.eq_handle = desc->eqh; rc = portals_md_bind(desc->nih, md, PTL_UNLINK, &md_handle); if (rc != PTL_OK) { printf("failed to bind local md in get; err %d\n",rc); Fatal_error(rc); } rc = PtlGet(md_handle, desc->id, PORTALS_INDEX, 0, desc->mbits, 0); if (rc != PTL_OK) { printf("PtlGet err %d\n",rc); Fatal_error(rc); } desc->done = 0; desc->state = STATE_REPLY_END | STATE_SEND_END; # ifdef PORTALS_GET_USE_START desc->state |= STATE_REPLY_START; # endif return PTL_OK; } /* portals_desc_t* portals_get_free_desc(void) { int i,rc; portals_desc_t *desc = NULL; while(desc == NULL) { for(i=0; i= 0;bit--) { if ((mask << bit) & (unsigned char)*(data+ptr)) { printf("1"); } else { printf("0"); } } printf(" "); } printf("\n"); } void portals_print_summary() { printf("PORTALS_MAX_DESCRIPTORS = %d\n",PORTALS_MAX_DESCRIPTORS); printf("PORTALS_MAX_BUFS = %d\n",PORTALS_MAX_BUFS); printf("PORTALS_MAX_SMALL_BUFS = %d\n",PORTALS_MAX_SMALL_BUFS); printf("PORTALS_BUF_SIZE = %d\n",PORTALS_BUF_SIZE); printf("PORTALS_SMALL_BUF_SIZE = %d\n",PORTALS_SMALL_BUF_SIZE); printf("PORTALS_NREQUEST_BUFFERS = %d\n",PORTALS_NREQUEST_BUFFERS); printf("PORTALS_MAX_EAGER_MESSAGE_SIZE = %d\n",PORTALS_MAX_EAGER_MESSAGE_SIZE); return; } ga-5-4/armci/src-gemini/signaltrap.c0000644000175000017500000003163412662210416015477 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: signaltrap.c,v 1.28 2005-05-13 19:06:40 vinod Exp $ */ /******************************************************\ * Signal handler functions for the following signals: * * SIGINT, SIGCHLD, SIGBUS, SIGFPE, SIGILL, * * SIGSEGV, SIGSYS, SIGTRAP, SIGHUP, SIGTERM * * Used to call armci_error that frees up IPC resources * \******************************************************/ #include #include #ifndef WIN32 #include #include #include #include #include #endif #define PAUSE_ON_ERROR #define Error armci_die #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) # define SigType int #else # define SigType void #endif #ifndef SIG_ERR # define SIG_ERR (SigType (*)())-1 #endif #if defined(SUN) || defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || \ defined(AIX) || defined(NEXT) #include #endif extern void Error(); extern int armci_me; int AR_caught_sigint=0; int AR_caught_sigterm=0; int AR_caught_sigchld=0; int AR_caught_sigsegv=0; int AR_caught_sig=0; SigType (*SigChldOrig)(), (*SigIntOrig)(), (*SigHupOrig)(), (*SigTermOrig)(); SigType (*SigSegvOrig)(); /*********************** SIGINT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIntHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIntHandler(sig) #endif int sig; { AR_caught_sigint = 1; AR_caught_sig= sig; Error("SigIntHandler: interrupt signal was caught",(int) sig); } void TrapSigInt() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( (SigIntOrig = signal(SIGINT, SigIntHandler)) == SIG_ERR) Error("TrapSigInt: error from signal setting SIGINT",0); } void RestoreSigInt() /* Restore the original signal handler */ { if(AR_caught_sigint) SigIntOrig(SIGINT); if ( signal(SIGINT, SigIntOrig) == SIG_ERR) Error("RestoreSigInt: error from restoring signal SIGINT",0); } /*********************** SIGABORT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigAbortHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigAbortHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("SigIntHandler: abort signal was caught: cleaning up",(int) sig); } void TrapSigAbort() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( signal(SIGINT, SigAbortHandler) == SIG_ERR) Error("TrapSigAbort: error from signal setting SIGABORT",0); } /*********************** SIGCHLD *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigChldHandler(sig) #endif int sig; { int status; #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) union wait ustatus; #endif #if defined(LINUX) pid_t ret; /* Trap signal as soon as possible to avoid race */ if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("SigChldHandler: error from signal setting SIGCHLD",0); #endif #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) # if defined(LINUX) ret = wait(&ustatus); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void) wait(&ustatus); # endif status = ustatus.w_status; #else # if defined(LINUX) ret = waitpid(0, &status, WNOHANG); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void)wait(&status); # endif #endif AR_caught_sigchld=1; AR_caught_sig= sig; Error("Child process terminated prematurely, status=",(int) status); } void TrapSigChld() /* Trap SIGCHLD so that can tell if children die unexpectedly. */ { if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("TrapSigChld: error from signal setting SIGCHLD",0); } void RestoreSigChld() /* Restore the original signal handler */ { if(AR_caught_sigchld) SigChldOrig(SIGCHLD); if ( signal(SIGCHLD, SigChldOrig) == SIG_ERR) Error("RestoreSigChld: error from restoring signal SIGChld",0); } void RestoreSigChldDfl() { (void) signal(SIGCHLD, SIG_DFL); } /*********************** SIGBUS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigBusHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigBusHandler(sig) #endif int sig; { AR_caught_sig= sig; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%d): Bus Error ... pausing\n", armci_me, getpid() );pause(); #endif Error("Bus error, status=",(int) sig); } void TrapSigBus() /* Trap SIGBUS */ { if ( signal(SIGBUS, SigBusHandler) == SIG_ERR) Error("TrapSigBus: error from signal setting SIGBUS", 0); } /*********************** SIGFPE *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigFpeHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigFpeHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Floating Point Exception error, status=",(int) sig); } void TrapSigFpe() /* Trap SIGFPE */ { if ( signal(SIGFPE, SigFpeHandler) == SIG_ERR) Error("TrapSigFpe: error from signal setting SIGFPE", 0); } /*********************** SIGILL *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIllHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIllHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Illegal Instruction error, status=",(int) sig); } void TrapSigIll() /* Trap SIGILL */ { if ( signal(SIGILL, SigIllHandler) == SIG_ERR) Error("TrapSigIll: error from signal setting SIGILL", 0); } /*********************** SIGSEGV *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSegvHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSegvHandler(sig) #endif int sig; { AR_caught_sig= sig; AR_caught_sigsegv=1; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%d): Segmentation Violation ... pausing\n", armci_me, getpid() );pause(); #endif Error("Segmentation Violation error, status=",(int) sig); } #ifdef DO_CKPT static void * signal_arr[100]; SigType SigSegvActionSa(int sig,siginfo_t *sinfo, void *ptr) { int (*func)(); AR_caught_sig= sig; AR_caught_sigsegv=1; func = signal_arr[sig]; /*printf("\n%d:in sigaction %p, %d\n",armci_me,sinfo->si_addr,sinfo->si_errno);fflush(stdout);*/ if(func(sinfo->si_addr,sinfo->si_errno,sinfo->si_fd)) Error("Segmentation Violation error, status=",(int) SIGSEGV); } void TrapSigSegvSigaction() { struct sigaction sa; sa.sa_sigaction = (void *)SigSegvActionSa; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); } #endif void TrapSigSegv() /* Trap SIGSEGV */ { if ( (SigSegvOrig=signal(SIGSEGV, SigSegvHandler)) == SIG_ERR) Error("TrapSigSegv: error from signal setting SIGSEGV", 0); } void RestoreSigSegv() /* Restore the original signal handler */ { /* if(AR_caught_sigsegv) SigSegvOrig(SIGSEGV); */ #ifdef DO_CKPT__ struct sigaction sa; sa.sa_handler = (void *)SigSegvOrig; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGSEGV,&sa,NULL); #else if ( signal(SIGSEGV,SigSegvOrig) == SIG_ERR) Error("RestoreSigSegv: error from restoring signal SIGSEGV",0); #endif } /*********************** SIGSYS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSysHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSysHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Bad Argument To System Call error, status=",(int) sig); } void TrapSigSys() /* Trap SIGSYS */ { #ifndef LINUX if ( signal(SIGSYS, SigSysHandler) == SIG_ERR) Error("TrapSigSys: error from signal setting SIGSYS", 0); #endif } /*********************** SIGTRAP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTrapHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTrapHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Trace Trap error, status=",(int) sig); } void TrapSigTrap() /* Trap SIGTRAP */ { if ( signal(SIGTRAP, SigTrapHandler) == SIG_ERR) Error("TrapSigTrap: error from signal setting SIGTRAP", 0); } /*********************** SIGHUP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigHupHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigHupHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Hangup error, status=",(int) sig); } void TrapSigHup() /* Trap SIGHUP */ { if ( (SigHupOrig = signal(SIGHUP, SigHupHandler)) == SIG_ERR) Error("TrapSigHup: error from signal setting SIGHUP", 0); } void RestoreSigHup() /* Restore the original signal handler */ { if(AR_caught_sig== SIGHUP) SigHupOrig(SIGHUP); if ( signal(SIGHUP, SigHupOrig) == SIG_ERR) Error("RestoreSigHUP: error from restoring signal SIGHUP",0); } /*********************** SIGTERM *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTermHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTermHandler(sig) #endif int sig; { AR_caught_sigterm = 1; AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigTerm() /* Trap SIGTERM */ { if ( (SigTermOrig = signal(SIGTERM, SigTermHandler)) == SIG_ERR) Error("TrapSigTerm: error from signal setting SIGTERM", 0); } void RestoreSigTerm() /* Restore the original signal handler */ { if(AR_caught_sigterm && (SigTermOrig != SIG_DFL) ) SigTermOrig(SIGTERM); if ( signal(SIGTERM, SigTermOrig) == SIG_ERR) Error("RestoreSigTerm: error from restoring signal SIGTerm",0); } /*********************** SIGIOT *************************************/ #ifdef SIGIOT #if defined(SUN) && !defined(SOLARIS) SigType SigIotHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIotHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("IOT signal was sent, status=",(int) sig); } void TrapSigIot() /* Trap SIGIOT */ { if ( signal(SIGIOT, SigIotHandler) == SIG_ERR) Error("TrapSigIot: error from signal setting SIGIOT", 0); } #endif /*********************** SIGCONT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigContHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigContHandler(sig) #endif int sig; { /* Error("Trace Cont error, status=",(int) sig);*/ AR_caught_sig= sig; } void TrapSigCont() /* Trap SIGCONT */ { if ( signal(SIGCONT, SigContHandler) == SIG_ERR) Error("TrapSigCont: error from signal setting SIGCONT", 0); } /*********************** SIGXCPU *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigXcpuHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigXcpuHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigXcpu() /* Trap SIGXCPU */ { if ( signal(SIGXCPU, SigXcpuHandler) == SIG_ERR) Error("TrapSigXcpu: error from signal setting SIGXCPU", 0); } /******************* external API *********************************/ void ARMCI_ChildrenTrapSignals() { #ifndef LAPI TrapSigBus(); #endif TrapSigFpe(); TrapSigIll(); #ifdef DO_CKPT TrapSigSegvSigaction(); #else TrapSigSegv(); #endif TrapSigSys(); TrapSigTrap(); TrapSigAbort(); TrapSigTerm(); TrapSigInt(); #if defined(LAPI) || defined(SGI) TrapSigIot(); #endif #ifdef SGI TrapSigXcpu(); #endif } void ARMCI_ParentTrapSignals() { #ifndef LAPI TrapSigChld(); #endif TrapSigHup(); } void ARMCI_RestoreSignals() { RestoreSigTerm(); RestoreSigInt(); RestoreSigSegv(); } void ARMCI_ParentRestoreSignals() { #ifndef LAPI RestoreSigChld(); #endif ARMCI_RestoreSignals(); RestoreSigHup(); } #ifdef DO_CKPT /*user can register a function with 3 parameters, 1st offending address * 2nd err number and third file descriptor*/ void ARMCI_Register_Signal_Handler(int sig, void (*func)()) { signal_arr[sig]=func; } #endif ga-5-4/armci/src-gemini/portals_cp.c0000644000175000017500000007746212662210416015512 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* ---------------------------------------------------------------------------------------------- *\ portals_cp.c -- compute process portals calls author: ryan olson email: ryan@cray.com \* ---------------------------------------------------------------------------------------------- */ # include "armcip.h" # include # include # include # include /* ---------------------------------------------------------------------------------------------- *\ \* ---------------------------------------------------------------------------------------------- */ static ptl_handle_ni_t cp_nih; static ptl_handle_eq_t cp_eqh; static ptl_handle_eq_t cp_tx_eqh; static void *portals_eager_send_buffer = NULL; static size_t portals_unique_msg_counter = 373; static int portals_smp_sem = -1; static int *active_requests_by_node = NULL; /* ---------------------------------------------------------------------------------------------- *\ \* ---------------------------------------------------------------------------------------------- */ int portals_cp_finished = 0; /* ---------------------------------------------------------------------------------------------- *\ Implementation \* ---------------------------------------------------------------------------------------------- */ int portals_cp_init(void) { int rc; int me; ptl_process_id_t id; rc = portals_init(&cp_nih); if(rc != PTL_OK) { printf("error in portals_init: err %d\n",rc); Fatal_error(rc); } rc = portals_create_eq(cp_nih,10*PORTALS_MAX_DESCRIPTORS,&cp_eqh); if(rc != PTL_OK) { printf("failed to create cp event queue; err %d\n",rc); Fatal_error(911); } rc = portals_create_eq(cp_nih,30,&cp_tx_eqh); if(rc != PTL_OK) { printf("failed to create cp_tx event queue; err %d\n",rc); Fatal_error(911); } rc = portals_cp_getid(&id); if(rc != PTL_OK) { printf("failed to get the portals id; err %d\n",rc); Fatal_error(rc); } /* creating an smp/intra-node communicator */ MPI_Comm_rank(ARMCI_COMM_WORLD,&me); MPI_Comm_split(ARMCI_COMM_WORLD,id.nid,me,&portals_smp_comm); /* set affinity */ # ifdef PORTALS_AFFINITY int smp_np, smp_me; unsigned long mask; unsigned int len = sizeof(mask); unsigned long ncpus; unsigned int nsockets, siblings; int cores_per_socket, cps_per_socket; int verbose = 0; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); if((ncpus = sysconf(_SC_NPROCESSORS_ONLN)) < 0) { printf("%d [cp] sysconf(_SC_NPROCESSORS_ONLN) failed; err=%d\n", ncpus); armci_die("sysconf in init_throttle",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error in ds_init",911); } if(armci_clus_me == 0 && /* verbose */ 0 ) { printf("%d [cp]: old affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } if(smp_me == 0) { mask = 1 << (ncpus-1); if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity to probe the socket count"); armci_die("setaffinity error in ds_init",911); } siblings = cpuid_ebx(1) >>16 & 0xff; nsockets = ncpus / siblings; } MPI_Bcast(&nsockets,1,MPI_INT,0,portals_smp_comm); cores_per_socket = ncpus/nsockets; cps_per_socket = (smp_np / nsockets); cps_per_socket += (smp_np % nsockets); if(nsockets > 2) { armci_die("nsockets > 2 not supported",911); } if(smp_me < cps_per_socket) { mask = 1 << smp_me; } else { mask = 1 << (smp_me + (cores_per_socket - cps_per_socket)); } if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity"); armci_die("setaffinity error in ds_init",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error (#2) in ds_init",911); } if(armci_clus_me == 0 && verbose) { printf("%d [cp]: new affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } # endif return PTL_OK; } int portals_cp_finalize() { int rc; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE armci_semrm(portals_smp_sem); # endif rc = portals_free_eq(cp_eqh); if (rc != PTL_OK) { printf("error freeing cp_eqh; err %d\n",rc); } MPI_Barrier(ARMCI_COMM_WORLD); MPI_Finalize(); portals_cp_finished = 1; exit(0); return PTL_OK; // return portals_finalize(cp_nih); } int portals_cp_getid(ptl_process_id_t *id) { return portals_getid(cp_nih, id); } static size_t portals_get_unique_msg_id(void) { size_t val = armci_me*1000; portals_unique_msg_counter++; if(portals_unique_msg_counter == 1000) portals_unique_msg_counter=1; val += portals_unique_msg_counter; return val; } static void portals_req_clear(portals_ds_req_t *req) { req->active = 0; req->unique_msg_id = 0; req->req_desc.done = 1; req->req_desc.state = 0; req->req_desc.eqh = cp_tx_eqh; req->ack_desc.done = 1; req->ack_desc.state = 0; req->ack_desc.eqh = cp_eqh; req->data_desc.done = 1; req->data_desc.state = 0; req->data_desc.eqh = cp_eqh; req->remote_node = -1; } static ptl_process_id_t portals_get_dsid_from_node(int remote_node) { int rank = armci_clus_info[remote_node].master; if(portals_cloned_id_map) return portals_cloned_id_map[rank]; else return portals_id_map[rank]; } static ptl_process_id_t portals_get_dsid_from_rank(int remote_id) { if(portals_cloned_id_map) return portals_cloned_id_map[remote_id]; else return portals_id_map[remote_id]; } void portals_req_nbsend(void *buffer, size_t size, portals_ds_req_t *req) { int rc; portals_desc_t *desc = &req->req_desc; assert(req->unique_msg_id); assert(size < portalsMaxEagerMessageSize); assert(req->remote_node >= 0); /* ---------------------------------------------------------------------------- *\ if we get here, we can guarantee that where are no outstanding requests from this PE to the remote node; however, we can not guarantee that other PEs on this node aren't talking to the intended data server ... so now we wait on value in the "shared" array. \* ---------------------------------------------------------------------------- */ # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE int got_lock = 0; while(!got_lock) { portalsSpinLockOnInt(&active_requests_by_node[req->remote_node],0,1000); semaphoreAcquire(portals_smp_sem,1,PORTALS_WRITE_ACCESS); if(active_requests_by_node[req->remote_node] == 0) { active_requests_by_node[req->remote_node] = 1; got_lock = 1; } semaphoreRelease(portals_smp_sem,1,PORTALS_WRITE_ACCESS); } # endif desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = MATCH_ALL_MBITS; desc->hdr = req->unique_msg_id; desc->state = 0; desc->eqh = cp_tx_eqh; desc->nih = cp_nih; rc = portals_put(desc); if(rc != PTL_OK) { printf("portals_put err %d\n",rc); Fatal_error(rc); } } void portals_req_send(void *buffer, size_t size, portals_ds_req_t *req) { int rc; portals_desc_t *desc = &req->req_desc; portals_req_nbsend(buffer,size,req); rc = portals_wait(desc); if(rc != PTL_OK) { printf("portals_wait err %d\n",rc); Fatal_error(rc); } } static inline void portals_req_wait(portals_ds_req_t *req) { int rc; if(req->req_desc.state) { rc = portals_wait( &(req->req_desc) ); if(rc != PTL_OK) { printf("portals wait error on req_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } if(req->ack_desc.state) { rc = portals_wait( &(req->ack_desc) ); if(rc != PTL_OK) { printf("portals wait error on ack_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } if(req->data_desc.state) { rc = portals_wait( &(req->data_desc) ); if(rc != PTL_OK) { printf("portals wait error on data_desc in req_wait; err=%d\n",rc); Fatal_error(rc); } } req->active = 0; return; } void portalsWaitOnRequest(portals_ds_req_t *req) { portals_req_wait(req); } static int portals_prepost_ack_from_ds(portals_ds_req_t *req) { int rc; ptl_md_t md; portals_desc_t *desc = &req->ack_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); assert(req->remote_node >= 0); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE desc->buffer = &active_requests_by_node[req->remote_node]; desc->length = sizeof(int); # else desc->buffer = NULL; desc->length = 0; # endif desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_ACK; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost ack\n"); Fatal_error(rc); } md.start = desc->buffer; md.length = desc->length; md.threshold = 1; md.options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md.user_ptr = desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost ack\n"); Fatal_error(rc); } // desc->state = STATE_PUT_END; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_PUT_END; desc->done = 0; } static int portals_prepost_put_from_ds(void *buffer, size_t size, portals_ds_req_t *req) { int rc; int nputs; ptl_md_t md; portals_desc_t *desc = &req->data_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_PUT; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost put\n"); Fatal_error(rc); } md.start = buffer; md.length = size; md.threshold = desc->noperations; md.options = PTL_MD_OP_PUT | PTL_MD_EVENT_AUTO_UNLINK_ENABLE | PTL_MD_EVENT_START_DISABLE | PTL_MD_EVENT_END_DISABLE; md.user_ptr = (void *) desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost put\n"); Fatal_error(rc); } // desc->state = STATE_UNLINK; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_UNLINK; desc->done = 0; } static int portals_prepost_get_from_ds(void *buffer, size_t size, portals_ds_req_t *req) { int rc; ptl_md_t md; portals_desc_t *desc = &req->data_desc; unsigned long mbits = req->unique_msg_id; assert(req->unique_msg_id); desc->buffer = buffer; desc->length = size; desc->id = req->dsid; desc->mbits = mbits | DS_RESPONSE_GET; desc->hdr = mbits; desc->eqh = cp_eqh; rc = portals_me_attach(cp_nih,desc->id,desc->mbits,0,&desc->meh); if(rc != PTL_OK) { printf("me failed in prepost get\n"); Fatal_error(rc); } md.start = buffer; md.length = size; md.threshold = desc->noperations; md.options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; // | PTL_MD_EVENT_AUTO_UNLINK_ENABLE // | PTL_MD_EVENT_START_DISABLE // | PTL_MD_EVENT_END_DISABLE; md.user_ptr = (void *) desc; md.eq_handle = cp_eqh; rc = portals_md_attach(desc->meh,md,PTL_UNLINK,&desc->mdh); if(rc != PTL_OK) { printf("md failed in prepost get\n"); Fatal_error(rc); } // printf("%d: preposted get of lenght=%ld\n",armci_me,size); // desc->state = STATE_UNLINK; // desc->state = STATE_GET_END; // |= needed for rendez-vous gets; put and get using the same descriptor desc->state |= STATE_GET_END; desc->done = 0; } void portalsBlockingRemoteOperationToNode(void *buffer, size_t length, int remote_node) { portals_ds_req_t req; portals_req_clear(&req); portalsRemoteOperationToNode(buffer,length,remote_node,&req); portalsWaitOnRequest(&req); } void portalsRemoteOperationToNode(void *buffer, size_t length, int remote_node, portals_ds_req_t *req) { ptl_process_id_t id = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; portalsRemoteOperation(buffer,length,id,req); } /* void portalsRemoteOperationToRank(void *buffer, size_t length, int remote_rank, portals_ds_req_t *req) { ptl_process_id_t id = portals_get_dsid_from_rank(remote_rank); portalsRemoteOperation(buffer,length,id,req); } */ void portalsRemoteOperation(void *buffer, size_t length, ptl_process_id_t dsid, portals_ds_req_t *req) { /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ // portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = dsid; /* --------------------------------------------------------------------- *\ the only response from the ds will be a 0-byte ack coming in as a put \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ send data request; this is a completely blocking req \* --------------------------------------------------------------------- */ portals_req_send(buffer,length,req); } void portals_send_oper(int remote_node,int val, portals_ds_req_t *req) { int rc; request_header_t msg; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ the only response from the ds will be a 0-byte ack coming in as a put \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ prepare data request and send it; this is a completely blocking req \* --------------------------------------------------------------------- */ msg.operation = val; portals_req_send(&msg,sizeof(request_header_t),req); return; } void portals_send_QUIT(int remote_node) { portals_ds_req_t req; portals_send_oper(remote_node,QUIT,&req); portals_req_wait(&req); } static int portals_determine_remote_op_count(request_header_t *msg) { #ifdef DDI int nr,nc,np; int datatype_extent = sizeof(double); /* --------------------------------------------------------------------- *\ previously we have worked with words, but to provide support for other data types, we must work with bytes. note to developers: datatype_extent = the size in bytes of the stored datatype \* --------------------------------------------------------------------- */ if(msg->size*datatype_extent <= MAX_DS_MSG_SIZE) return 1; /* --------------------------------------------------------------------- *\ the data must be moved in segments; determine patch dimensions \* --------------------------------------------------------------------- */ nr = msg->ihi - msg->ilo + 1; nc = msg->jhi - msg->jlo + 1; /* --------------------------------------------------------------------- *\ each column individually is too long to fit in the buffer \* --------------------------------------------------------------------- */ if(nr*datatype_extent < MAX_DS_MSG_SIZE) { /* ------------------------------------------------------------------ *\ np the number of "evenly" sized passed needed to send a column \* ------------------------------------------------------------------ */ np = 2; while(((nr/np)+((nr%np)?1:0)*datatype_extent)>MAX_DS_MSG_SIZE) np++; /* ------------------------------------------------------------------ *\ noperations is np times the number of columns to be sent \* ------------------------------------------------------------------ */ return np*nc; } /* --------------------------------------------------------------------- *\ determine the number of full columns that can be sent in one pass break down the subpatch on this metric \* --------------------------------------------------------------------- */ else { /* ------------------------------------------------------------------ *\ np is the number of passes needed to send the full patch which is broken down into "evenly" sized sets of columns that fit in the allocated buffer region \* ------------------------------------------------------------------ */ np = 2; while(nr*((nc/np)+((nc%np)?1:0))*datatype_extent>MAX_DS_MSG_SIZE) np++; /* ------------------------------------------------------------------ *\ noperations is np \* ------------------------------------------------------------------ */ return np; } assert(0); // should not happen return -1; #else return 1; #endif } void portals_remote_rmw(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { ptl_size_t length; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepare the buffer into which the ds will put data \* --------------------------------------------------------------------- */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_put_from_ds(buffer,msginfo->datalen,req); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_prepost_ack_from_ds(req); # endif /* --------------------------------------------------------------------- *\ send data request note: from armci_send_req - if get, the value of bytes (local: length) is msginfo->dscrlen + (hdrlen=sizeof(request_header_t) ... this is the size of the "data server request message" to be sent \* --------------------------------------------------------------------- */ length = sizeof(request_header_t) + msginfo->dscrlen + msginfo->datalen; portals_req_send(msginfo,length,req); } void portals_remote_get(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbget(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbget(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { ptl_size_t length; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepare the buffer into which the ds will put data \* --------------------------------------------------------------------- */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_put_from_ds(buffer,msginfo->datalen,req); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE portals_prepost_ack_from_ds(req); # endif /* --------------------------------------------------------------------- *\ send data request note: from armci_send_req - if get, the value of bytes (local: length) is msginfo->dscrlen + (hdrlen=sizeof(request_header_t) ... this is the size of the "data server request message" to be sent \* --------------------------------------------------------------------- */ length = sizeof(request_header_t) + msginfo->dscrlen; # if defined(PORTALS_USE_RENDEZ_VOUS) if(length < portalsMaxEagerMessageSize) portals_req_send(msginfo,length,req); else { req->data_desc.noperations = 1; portals_prepost_get_from_ds(msginfo,length,req); /* ------------------------------------------------------------------ *\ send data request: branch here for eager vs. rendez-vous \* ------------------------------------------------------------------ */ assert(length <= PORTALS_BUF_SIZE); portals_req_send(msginfo,sizeof(request_header_t),req); } # else portals_req_send(msginfo,length,req); # endif } void portals_remote_put(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbput(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbput(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { char *eagerBuffer = NULL; size_t eagerSendSize = 0; /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); req->remote_node = remote_node; /* --------------------------------------------------------------------- *\ prepost ack response from the data server \* --------------------------------------------------------------------- */ portals_prepost_ack_from_ds(req); /* --------------------------------------------------------------------- *\ eager vs. rendez-vous messaging eager: pack and send the message immediate (only for small messages) developers note: since portals_eager_send_buffer only exists once, this has to be a blocking send (ie the data is on the wire when req_send has finished and the buffer can be reused. for greater overlap, create a set of eager send buffers ... however they have to be managed ... probably best to do it in a ring. note: armci put/acc buffer is prepacked. \* --------------------------------------------------------------------- */ eagerSendSize = sizeof(request_header_t) + msginfo->dscrlen + msginfo->datalen; if(eagerSendSize < portalsMaxEagerMessageSize) { // printf("sending eager message\n"); # if 0 /* armci prepacked */ eagerBuffer = (char *) portals_eager_send_buffer; memcpy(eagerBuffer,msginfo,sizeof(request_header_t)); eagerBuffer += sizeof(request_header_t); memcpy(eagerBuffer,buffer,msginfo->bytes); # endif eagerBuffer = (char *) msginfo; /* buffer == msginfo for armci */ portals_req_send(eagerBuffer,eagerSendSize,req); } /* --------------------------------------------------------------------- *\ rendez-vous: send the ds a request; ds will "get/pull" data \* --------------------------------------------------------------------- */ else { # ifdef PORTALS_USE_RENDEZ_VOUS /* ------------------------------------------------------------------ *\ prepare the buffer into which the ds will put data \* ------------------------------------------------------------------ */ // req->data_desc.noperations=portals_determine_remote_op_count(msginfo); req->data_desc.noperations = 1; portals_prepost_get_from_ds(msginfo,eagerSendSize,req); /* ------------------------------------------------------------------ *\ send data request: branch here for eager vs. rendez-vous \* ------------------------------------------------------------------ */ assert(eagerSendSize <= PORTALS_BUF_SIZE); portals_req_send(msginfo,sizeof(request_header_t),req); # else printf("%d [cp]: rendez-vous messaging not supported\n",armci_me); abort(); # endif } } #if 0 void portals_remote_acc(void *buffer, request_header_t *msginfo, int remote_node) { portals_ds_req_t req; portals_remote_nbacc(buffer,msginfo,remote_node,&req); portals_req_wait(&req); } void portals_remote_nbacc(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req) { char *eagerBuffer = NULL; size_t eagerSendSize = 0; assert(msginfo->bytes); /* --------------------------------------------------------------------- *\ initialize the data server request \* --------------------------------------------------------------------- */ portals_req_clear(req); req->active = 1; req->unique_msg_id = portals_get_unique_msg_id(); req->dsid = portals_get_dsid_from_node(remote_node); /* --------------------------------------------------------------------- *\ eager vs. rendez-vous messaging eager: pack and send the message immediate (only for small messages) \* --------------------------------------------------------------------- */ eagerSendSize = msginfo->bytes + sizeof(request_header_t); if(eagerSendSize < portalsMaxEagerMessageSize) { /* ------------------------------------------------------------------ *\ prepost ack response from the data server developers note: if you globally fence an array with a collective operation prior to a section of code and defence it after, then you don't need to micro manage the fence on a per request basis in that section; this eliminates the need for a DS ack \* ------------------------------------------------------------------ */ portals_prepost_ack_from_ds(req); /* ------------------------------------------------------------------ *\ pack and send eager data request blocking for now, since portals_eager_send_buffer only exists once create multiple eager buffers for greater overlap \* ------------------------------------------------------------------ */ eagerBuffer = (char *) portals_eager_send_buffer; memcpy(eagerBuffer,msginfo,sizeof(request_header_t)); eagerBuffer += sizeof(request_header_t); memcpy(eagerBuffer,buffer,msginfo->bytes); eagerBuffer = (char *) portals_eager_send_buffer; portals_req_send(eagerBuffer,eagerSendSize,req); } /* --------------------------------------------------------------------- *\ rendez-vous: send the ds a request; ds will "get/pull" data developers note: a ds ack is not required for a rendez-vous pull, this is because the ds will not start the pull until a local fence has been raised (if needed - see note above) \* --------------------------------------------------------------------- */ else { /* ------------------------------------------------------------------ *\ prepare the buffer from which the ds will pull data \* ------------------------------------------------------------------ */ req->data_desc.noperations=portals_determine_remote_op_count(msginfo); portals_prepost_get_from_ds(buffer,msginfo->bytes,req); /* ------------------------------------------------------------------ *\ send data request \* ------------------------------------------------------------------ */ portals_req_send(msginfo,sizeof(request_header_t),req); portalsWaitOnRequest(req); } } #endif extern int armci_shmget(size_t,char*); extern int armci_semget(int); extern void *shmat(int,int,int); void portals_cp_init_throttle(int nnodes) { int i, shmid, smp_np, smp_me; size_t size = nnodes*sizeof(int); char *buf = NULL; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE if(armci_me == armci_master) { if(smp_me != 0) armci_die("smp_me and armci_master are different",911); } if(smp_me == 0) { shmid = armci_shmget(size,"portals_cp_init_throttle"); active_requests_by_node = (int *) shmat(shmid,0,0); if(active_requests_by_node == (void *) -1) { printf("%d [cp] shmat failed for shmid %d\n",armci_me,shmid); armci_die("badness",911); } armci_shmrm(shmid); for(i=0; i #include #include #include #include #include #include "shmlimit.h" #define DEBUG_ 0 #if defined(DECOSF) || defined(SOLARIS64) || defined(HPUX) #define PIPE_AFTER_FORK_BUG #endif void (*armci_sig_chld_orig)(); static int status=0; int armci_shmlimit_caught_sigchld=0; #if defined(SUN) && !defined(SOLARIS) static void SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else static void SigChldHandler(sig) #endif int sig; { #ifdef DISABLED int pid; pid = wait(&status); #endif armci_shmlimit_caught_sigchld=1; } static void TrapSigChld() { if ( (armci_sig_chld_orig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) armci_die("TrapSigChld: error from signal setting SIGCHLD",0); } static void RestoreSigChld() { if ( signal(SIGCHLD, armci_sig_chld_orig) == SIG_ERR) armci_die("Restore_SigChld: error from restoring signal SIGChld",0); } static int child_finished() { return armci_shmlimit_caught_sigchld; } int armci_child_shmem_init() { pid_t pid; int x; #ifdef PIPE_AFTER_FORK_BUG int i; #endif int y; int fd[2]; if(pipe(fd)==-1) armci_die("armci shmem_test pipe failed",0); TrapSigChld(); if ( (pid = fork() ) < 0) armci_die("armci shmem_test fork failed", (int)pid); else if(pid == 0){ x= armci_shmem_test(); #ifdef PIPE_AFTER_FORK_BUG /* due to a bug in OSF1 V4.0/1229/alpha first item written gets hosed*/ for(i=0;i<2;i++) #endif if(write(fd[1],&x,sizeof(int)) real * bb[i].real - alpha->imag * bb[i].imag; aa[i].imag += alpha->imag * bb[i].real + alpha->real * bb[i].imag; } } } void Z_ACCUMULATE_2D(dcmpl_t* alpha, int* rows, int* cols, dcmpl_t* a, int* lda, dcmpl_t* b, int* ldb) { int i,j; for(j=0;j< *cols; j++){ dcmpl_t *aa = a + j* *lda; dcmpl_t *bb = b + j* *ldb; for(i=0;i< *rows; i++){ aa[i].real += alpha->real * bb[i].real - alpha->imag * bb[i].imag; aa[i].imag += alpha->imag * bb[i].real + alpha->real * bb[i].imag; } } } void FORT_DADD(int *n, double *x, double *work){ int i; for(i=0;i<*n;i++) x[i] = x[i] + work[i]; } void FORT_DADD2(int *n, double *x, double *work, double *work2){ int i; for(i=0;i<*n;i++) x[i] = work[i] + work2[i]; } void FORT_DMULT(int *n, double *x, double *work){ int i; for(i=0;i<*n;i++) x[i] = x[i]*work[i]; } void FORT_DMULT2(int *n, double *x, double *work, double *work2){ int i; for(i=0;i<*n;i++) x[i] = work[i]*work2[i]; } #endif ga-5-4/armci/src-gemini/utils.c0000644000175000017500000001456712662210416014501 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. * * The barrier_init() and barrier_destroy() functions, * respectively, allow you to initialize and destroy the * barrier. * * The barrier_wait() function allows a thread to wait for a * barrier to be completed. One thread (the one that happens to * arrive last) will return from barrier_wait() with the status * -1 on success -- others will return with 0. The special * status makes it easy for the calling code to cause one thread * to do something in a serial region before entering another * parallel section of code. */ #include #include #include #include #include #include #include #include #include "utils.h" #define DEBUG_ int mt_size; /* number of processes: needed for collective mt ops */ int mt_tpp; /* number of threads used for collective ops */ thread_barrier_t mt_barrier; /* static barrier used for multi-threaded MT_BARRIER */ int armci_malloc_mt(void *ptr[], int bytes) { int rc, th_size, i, j; th_size = mt_size * mt_tpp; if (thread_barrier_wait(&mt_barrier)==-1) { rc = PARMCI_Malloc(ptr, bytes * mt_tpp); #ifdef DEBUG printf("bytes=%d\n", bytes); for (i = 0; i < mt_size; i++) printf("ptr[%d]=%p\n",i,ptr[i]); #endif /* at this point proc ptrs are at beggining of the list */ for (i = mt_size - 1; i >= 0; i--) for (j = mt_tpp - 1; j >= 0; j--) { #ifdef DEBUG printf("mt_size=%d,mt_tpp=%d,i=%d,j=%d,ptr[%d]=%p+%d\n", mt_size,mt_tpp,i,j,i*mt_tpp+j,ptr[i],j*bytes); fflush(stdout); #endif ptr[i * mt_tpp + j] = ((char*)ptr[i]) + j * bytes; } } thread_barrier_wait(&mt_barrier); return rc; } int armci_free_mt(void *ptr, int th_idx) { } #ifdef POSIX_THREADS /* * Initialize a barrier for use. */ int thread_barrier_init (thread_barrier_t *barrier, int count) { int status; barrier->threshold = barrier->counter = count; barrier->cycle = 0; status = pthread_mutex_init (&barrier->mutex, NULL); if (status != 0) return status; status = pthread_cond_init (&barrier->cv, NULL); if (status != 0) { pthread_mutex_destroy (&barrier->mutex); return status; } barrier->valid = BARRIER_VALID; return 0; } /* * Destroy a barrier when done using it. */ int thread_barrier_destroy (thread_barrier_t *barrier) { int status, status2; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; /* * Check whether any threads are known to be waiting; report * "BUSY" if so. */ if (barrier->counter != barrier->threshold) { pthread_mutex_unlock (&barrier->mutex); return EBUSY; } barrier->valid = 0; status = pthread_mutex_unlock (&barrier->mutex); if (status != 0) return status; /* * If unable to destroy either 1003.1c synchronization * object, return the error status. */ status = pthread_mutex_destroy (&barrier->mutex); status2 = pthread_cond_destroy (&barrier->cv); return (status == 0 ? status : status2); } /* * Wait for all members of a barrier to reach the barrier. When * the count (of remaining members) reaches 0, broadcast to wake * all threads waiting. */ int thread_barrier_wait (thread_barrier_t *barrier) { int status, cancel, tmp, cycle; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; cycle = barrier->cycle; /* Remember which cycle we're on */ if (--barrier->counter == 0) { barrier->cycle = !barrier->cycle; barrier->counter = barrier->threshold; status = pthread_cond_broadcast (&barrier->cv); /* * The last thread into the barrier will return status * -1 rather than 0, so that it can be used to perform * some special serial code following the barrier. */ if (status == 0) status = -1; } else { /* * Wait with cancellation disabled, because barrier_wait * should not be a cancellation point. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &cancel); /* * Wait until the barrier's cycle changes, which means * that it has been broadcast, and we don't want to wait * anymore. */ while (cycle == barrier->cycle) { status = pthread_cond_wait ( &barrier->cv, &barrier->mutex); if (status != 0) break; } pthread_setcancelstate (cancel, &tmp); } /* * Ignore an error in unlocking. It shouldn't happen, and * reporting it here would be misleading -- the barrier wait * completed, after all, whereas returning, for example, * EINVAL would imply the wait had failed. The next attempt * to use the barrier *will* return an error, or hang, due * to whatever happened to the mutex. */ pthread_mutex_unlock (&barrier->mutex); return status; /* error, -1 for waker, or 0 */ } #endif #if 0 /*** NAME timing.c PURPOSE Timing routines for calculating the execution time: void start_timer(void); Set the timer. double elapsed_time(void); Return the timing elapsed since the timer has been set. NOTES Jialin Ju - Oct 16, 1995 Created. ***/ /* Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /* Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /* Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /* Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } #endif ga-5-4/armci/src-gemini/pendbufs.c0000644000175000017500000006123312662210416015137 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if defined(PEND_BUFS) #include "pendbufs.h" #include "armcip.h" #include #include #include #include #define DEBUG_SERVER 0 /*-------------------Attributes-------------------------*/ /**Attributes to control buffer count and sizes. Implement this way to hide the global variables, and provide get/set methods.*/ #define NUM_ATTRIBUTES 4 #define ATTRIB_IMMBUF_LEN 0 #define ATTRIB_IMMBUF_NUM 1 #define ATTRIB_PNDBUF_LEN 2 #define ATTRIB_PNDBUF_NUM 3 /** List of hidden attributes and their operations. * @param attid IN Attribute id. Choose from the list above * @param gs IN Get(=0)/Set(=1) * @param v IN Value (used only when gs==1) * @return Value of the attribute on return */ static int att_ops(int attid, int gs, int v) { static not_first[NUM_ATTRIBUTES]; /*auto-init to zero*/ static val[NUM_ATTRIBUTES]; assert(attid>=0 && attidIMM_BUF_LEN*/ INIT=7, /**buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; assert(msginfo->tag.imm_msg == 0); pbuf = _armci_serv_pendbuf_getbuf(); if(pbuf) { pbuf->status = INIT; pbuf->avail = 0; pbuf->vbuf = vbuf; memcpy(pbuf->buf, vbuf->buf, sizeof(request_header_t)+msginfo->dscrlen); /* pbuf_proc_list_info[msginfo->from].waiting_on=pbuf; */ pbuf->order_prev = info->order_tail; if(info->order_tail) info->order_tail->order_next = pbuf; info->order_tail = pbuf; if(!info->order_head) info->order_head = pbuf; } return pbuf; } /**Free a pending buffer * @param pbuf IN Pointer to Pending buffer to be freed * @return none */ static void _armci_serv_pendbuf_freebuf(pendbuf_t *pbuf){ const request_header_t *msginfo = (request_header_t *)pbuf->buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); assert(pbuf != NULL); pbuf->avail=1; pbuf->status = -1; pbuf->vbuf = NULL; /* assert(info->waiting_on == pbuf); */ /* info->waiting_on = NULL; */ if(pbuf->order_prev) pbuf->order_prev->order_next = pbuf->order_next; if(pbuf->order_next) pbuf->order_next->order_prev = pbuf->order_prev; if(info->order_head == pbuf) { assert(pbuf->order_prev == NULL); info->order_head = pbuf->order_next; } if(info->order_tail == pbuf) { assert(pbuf->order_next == NULL); info->order_tail = pbuf->order_prev; } pbuf->order_prev = pbuf->order_next = NULL; /*not necessary here*/ _nPendBufsUsed -= 1; assert(_nPendBufsUsed>=0); ARMCI_PR_DBG("exit",0); } /** Implement ordering between messages. This function needs to be * implemented in conjunction with @_armci_serv_pendbuf_promote to * ensure ordered processing of messages. * @param vbuf IN Message in immediate buffer being checked * @return 1 if the message can be progressed (either in-place or * after copying to a pending buffer). 0 therwise. */ static int _armci_serv_pendbuf_can_progress(immbuf_t *vbuf) { const request_header_t *msginfo=(request_header_t*)vbuf->buf; const int proc = msginfo->from; const proc_waitlist_t *info = &pbuf_proc_list_info[proc]; if(_pbufOrder == ONE_PBUF_MESG) { /*Only one pending buffer used at any time*/ if(_nPendBufsUsed>0) return 0; return 1; } if(_pbufOrder == ONE_PBUF_MESG_PER_PROC) { /*Only one non-immediate mesg can be assigned to the pending buffers at any time*/ if(info->order_head || (info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf)) { return 0;/*other requests from this process remain*/ } if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } assert(info->n_pending == 0 || info->immbuf_wlist_head==vbuf); return 1; } if(_pbufOrder == ACC_NO_ORDER) { /*Messages are processed in-place in immediate buffers or issued into pending buffers for progress in order (like ONE_PBUF_PER_MESG). This rule relaxes ONE_PBUF_PER_MESG by allowing a sequence of ACCs to be processed in-place/issued without waiting for the prior ones to complete*/ int i, nwaiting_on, nacc; pendbuf_t *ptr; if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { /* printf("%d(s): op=%d from=%d datalen=%d waiting for pending buffers\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*This buffer needs a free pending buffer*/ } #if 1 /*commented for now: it does work*/ if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } #endif if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { /* printf("%d(s): op=%d from=%d datalen=%d not queue head\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*in order issue*/ } if(!ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } assert(ARMCI_ACC(msginfo->operation)); for(ptr=info->order_head; ptr!=NULL; ptr=ptr->order_next) { request_header_t *m = (request_header_t *)ptr->buf; assert(m->from == msginfo->from); if(!ARMCI_ACC(m->operation)) break; } if(ptr != NULL) return 0; return 1; } if(_pbufOrder == PUTACC_SPLIT_ORDER) { if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { return 0; } if(msginfo->operation!=PUT && !ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } #if 1 if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } #endif if(IS_IMM_MSG(*msginfo) && info->order_head) return 0; return 1; } armci_die("Unknown pbuf ordering rule",_pbufOrder); return 0; } /** Goes through the set of immediate buffers waiting to be processed * and completed, and identifies a buffer that can be processed * now. Removes it from the list and returns it. Promote also * considers availability of pending buffers if need be. * @return Pointer to buffer that can be processed now. NULL if none exists. */ static immbuf_t* _armci_serv_pendbuf_promote() { immbuf_t *immbuf = NULL; proc_waitlist_t *info; ARMCI_PR_DBG("enter",0); assert(_nPendBufsUsed>=0); if(!pbuf_ordering_plist_head) { return NULL; /*nothing to promote*/ } info = pbuf_ordering_plist_head; do { if(info->immbuf_wlist_head==NULL) { printf("%d(s): Why is info->immbuf_wlist_head NULL\n", armci_me); fflush(stdout); pause(); } assert(info->immbuf_wlist_head!=NULL); assert(info->n_pending>0); if(_armci_serv_pendbuf_can_progress(info->immbuf_wlist_head)) { immbuf = info->immbuf_wlist_head; info->immbuf_wlist_head = immbuf->immbuf_list_next; info->n_pending -= 1; immbuf->immbuf_list_next = NULL; if(!info->immbuf_wlist_head) { info->immbuf_wlist_tail = NULL; /*remove this proc from proc list*/ info->prev->next = info->next; info->next->prev = info->prev; if(pbuf_ordering_plist_head == info) { pbuf_ordering_plist_head = (info->next==info)?NULL:info->next; } info->prev = info->next = NULL; } break; } info = info->next; } while(info != pbuf_ordering_plist_head); if(DEBUG_SERVER) if(immbuf) { request_header_t *msginfo=(request_header_t*)immbuf->buf; printf("%d:: promoting a buffer immbuf=%p op=%d from=%d n_pending=%d\n", armci_me,immbuf,msginfo->operation,msginfo->from,info->n_pending); fflush(stdout); } ARMCI_PR_DBG("exit",0); return immbuf; } /** Enqueue a message. It could be an immediate message that cannot * make progress or a non-immediate message that cannot make progress * either due to ordering constraints or lack of pending buffers. * @param vbuf IN Immediate buffer to be enqueud * @return Pending buffer into which the message was enqueued. NULL * if no pending buffer was allocated (which is always the case for * immediate messages) */ static pendbuf_t* _armci_serv_pendbuf_enqueue(immbuf_t *vbuf) { request_header_t *msginfo=(request_header_t *)vbuf->buf; int from = msginfo->from; pendbuf_t *pbuf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); /* printf("%d: Entered serv_pbuf_enqueue\n", armci_me); */ pbuf=NULL; if(msginfo->tag.imm_msg) { assert(!_armci_serv_pendbuf_can_progress(vbuf)); } else if(_armci_serv_pendbuf_can_progress(vbuf)) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); /*can_progress() should ensure this*/ } if(pbuf == NULL) { /* printf("%d(s):: Enqueing op=%d imm=%d from %d. n_pending=%d\n", armci_me, msginfo->operation, msginfo->tag.imm_msg, msginfo->from,info->n_pending); */ /* fflush(stdout); */ vbuf->immbuf_list_next = NULL; assert(info->n_pending < IMM_BUF_NUM); /*How another message now?*/ info->n_pending += 1; if(!info->immbuf_wlist_head) { assert(!info->immbuf_wlist_tail); assert(!info->prev && !info->next); /*insert proc into proc list*/ if(!pbuf_ordering_plist_head) { pbuf_ordering_plist_head=info->next=info->prev=info; } else { info->next = pbuf_ordering_plist_head; info->prev = pbuf_ordering_plist_head->prev; pbuf_ordering_plist_head->prev->next = info; pbuf_ordering_plist_head->prev = info; } } /*insert vbuf into immbuf list for this proc*/ if(info->immbuf_wlist_tail) info->immbuf_wlist_tail->immbuf_list_next=vbuf; info->immbuf_wlist_tail = vbuf; if(!info->immbuf_wlist_head) info->immbuf_wlist_head = vbuf; } /* printf("%d: Leaving serv_pbuf_enqueue\n", armci_me); */ ARMCI_PR_DBG("exit",0); return pbuf; } /** Progress GET requests. * @param pbuf IN Pending buffer containing the GET request * @return none */ static void _armci_serv_pendbuf_progress_get(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1)+msginfo->dscrlen); int *status = &pbuf->status; assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalendscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ armci_complete_pendbuf(pbuf); *status = SEND_DATA_PENDING; } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: GET getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case SEND_DATA_PENDING: armci_die("call_data_server should set status to SEND_DATA_DONE before calling progress",*status); break; case RECV_DSCR_DONE: /* printf("%d(s):: GET. Done recving descriptor index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ armci_complete_pendbuf(pbuf); *status = SEND_DATA_PENDING; break; case SEND_DATA_DONE: _armci_serv_pendbuf_freebuf(pbuf); break; case RECV_DATA_PENDING: case RECV_DATA_DONE: default: armci_die("pendbuf_progress_get: invalid status", *status); } } /** Progress PUT/ACC requests. * @param pbuf IN Pending buffer containing the PUT/ACC request * @return none */ static void _armci_serv_pendbuf_progress_putacc(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1))+msginfo->dscrlen; int *status = &pbuf->status; assert(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)); assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalenoperation,msginfo->from); */ /* fflush(stdout); */ if(sizeof(request_header_t)+msginfo->dscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: PUT getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case RECV_DATA_PENDING: armci_die("call_data_server should set status to RECV_DONE before calling progress",*status); break; case RECV_DSCR_DONE: assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; break; case RECV_DATA_DONE: /* printf("%d(s):: Done PUT/ACC with buf index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ if(msginfo->operation == PUT && pbuf->order_prev!=NULL) { assert(pbuf->commit_me == 0); /*Why called so many times in thie state?*/ pbuf->commit_me = 1; break; } pbuf->commit_me = 0; armci_complete_pendbuf(pbuf); _armci_serv_pendbuf_freebuf(pbuf); break; case SEND_DATA_PENDING: case SEND_DATA_DONE: default: armci_die("pendbuf_progress_putacc: invalid status", *status); } } /** Make progress on processing a pending buffer. This function, also * ensures any other waiting messages get processed if they can * be. Thus, progress and eventual termination is guaranteed by this * function. * @param _pbuf IN Pending buffer to make progress on * @return none */ static void _armci_serv_pendbuf_progress(pendbuf_t *_pbuf){ request_header_t *msginfo = (request_header_t *)_pbuf->buf; immbuf_t *vbuf = _pbuf->vbuf; pendbuf_t *pbuf = _pbuf; assert(pbuf->vbuf!=NULL); do { if(vbuf && !IS_IMM_MSG(*msginfo)) { assert(pbuf->vbuf == vbuf); } /* printf("%d(s):: progressing op=%d imm=%d from=%d datalen=%d pbuf=%p vbuf=%p n_pending=%d\n", armci_me, */ /* msginfo->operation,msginfo->tag.imm_msg,msginfo->from,msginfo->datalen, pbuf,vbuf,pbuf_proc_list_info[msginfo->from].n_pending); */ /* fflush(stdout); */ if(IS_IMM_MSG(*msginfo)) { armci_complete_immbuf(vbuf); } else { /*non-immediate message*/ proc_waitlist_t* info = &pbuf_proc_list_info[msginfo->from]; do { assert(pbuf->vbuf == vbuf); if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { _armci_serv_pendbuf_progress_putacc(pbuf); } else if (msginfo->operation == GET) { _armci_serv_pendbuf_progress_get(pbuf); } else { armci_die("pending buffer processing for this op not yet implemented", msginfo->operation); } pbuf = info->order_head; vbuf = pbuf ? pbuf->vbuf : NULL; } while(info->order_head && info->order_head->commit_me); } /* sleep(2); */ vbuf = _armci_serv_pendbuf_promote(); if(vbuf) { msginfo = (request_header_t *)vbuf->buf; if(!msginfo->tag.imm_msg) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); } } } while(vbuf != NULL); } /*----------------External functions--------------------*/ /** Initialize array of pending buffers * @return none */ void armci_pendbuf_init() { int i; ARMCI_PR_DBG("enter",0); /* bzero(serv_pendbuf_arr, sizeof(pendbuf_t)*PENDING_BUF_NUM); */ for(i=0; ibuf; bzero(pbuf, sizeof(pendbuf_t)); pbuf->buf = buf; pbuf->avail=1; } pbuf_ordering_plist_head=NULL; pbuf_proc_list_info = (proc_waitlist_t *)malloc(sizeof(proc_waitlist_t)*armci_nproc); assert(pbuf_proc_list_info != NULL); bzero(pbuf_proc_list_info, sizeof(proc_waitlist_t)*armci_nproc); ARMCI_PR_DBG("exit",0); } void armci_pendbuf_service_req(immbuf_t *immbuf) { pendbuf_t *pbuf; request_header_t *msginfo=(request_header_t*)immbuf->buf; if(IS_IMM_MSG(*msginfo) && _armci_serv_pendbuf_can_progress(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p can progress. Completing it now!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ armci_complete_immbuf(immbuf); } else if(pbuf = _armci_serv_pendbuf_enqueue(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p got pending buf. Progressing it!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ _armci_serv_pendbuf_progress(pbuf); } else { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p in waitlist!\n", armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ } } /**Network layer reporting to split buffers code that a put completed * on a pending buffer. * @param pbufid IN Pending buffer id (specified when starting a * put). * @return void */ void armci_pendbuf_done_put(int pbufid) { assert(pbufid>=0 && pbufid=0 && pbufidstatus) { case RECV_DSCR_PENDING: pbuf->status = RECV_DSCR_DONE; break; case RECV_DATA_PENDING: pbuf->status = RECV_DATA_DONE; break; default: armci_die("Reporting get done on buf with inappropriate status",pbufid); } _armci_serv_pendbuf_progress(pbuf); } #endif /*PEND_BUFS*/ ga-5-4/armci/src-gemini/bufalloc.c0000644000175000017500000002610412662210416015116 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: bufalloc.c,v 1.2 2001-06-07 23:23:23 d3h325 Exp $ * storage manager for a chunk of memory passed by user in armci_init_buf_alloc * derived from K&R that manages a chunk of memory */ #include #define USAGE_ extern char *buf_allocate(); /* Used to get memory from the system */ extern void armci_die(); #define VALID1 0xaaaaaaaa /* For validity check on headers */ #define VALID2 0x55555555 #define LOG_ALIGN 6 #define ALIGNMENT (1 << LOG_ALIGN) #define DEFAULT_NALLOC (1024 - ALIGNMENT) #ifdef USAGE static struct shmalloc_struct { size_t total; /* Amount request from system in units */ long nchunk; /* No. of chunks of system memory */ long inuse; /* Amount in use in units */ long maxuse; /* Maximum value of inuse */ long nfrags; /* No. of fragments divided into */ long nmcalls; /* No. of calls to shmalloc */ long nfcalls; /* No. of calls to buf_free */ } usage; #endif union header{ struct { unsigned valid1; /* Token to check if is not overwritten */ union header *ptr; /* next block if on free list */ size_t size; /* size of this block*/ unsigned valid2; /* Another token acting as a guard */ } s; char align[ALIGNMENT]; /* Align to ALIGNMENT byte boundary */ }; typedef union header Header; static Header base; /* empty list to get started */ static Header *freep = NULL; /* start of free list */ static Header *usedp = NULL; /* start of used list */ static size_t nalloc = DEFAULT_NALLOC; static size_t max_nalloc = DEFAULT_NALLOC; static int do_verify = 0; /* Flag for automatic heap verification */ static int initialized=0; static void buf_error(char* s, unsigned long i) { void buf_alloc_print_stats(); fflush(stdout); fprintf(stderr,"buf_alloc error: %s %ld(0x%lx)\n", s, i, i); fflush(stderr); #ifdef USAGE buf_alloc_print_stats(); #endif armci_die("buf_alloc: fatal error", i); } void armci_buf_alloc_request(size_t size, size_t maxsize) { nalloc = (size+ALIGNMENT-1) >> LOG_ALIGN; max_nalloc = (maxsize+ALIGNMENT-1) >> LOG_ALIGN; } void armci_buf_alloc_debug(int code) { do_verify = code; } void armci_buf_alloc_verify() { Header *p; if ( freep ) { /* Check the used list */ for (p=usedp; p; p=p->s.ptr) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) buf_error("invalid header on usedlist", (unsigned long) p->s.valid1); #ifdef USAGE if (p->s.size > usage.total) buf_error("invalid size in header usedlist",(unsigned long)p->s.size); #endif } /* Check the free list */ p = base.s.ptr; while (p != &base) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) buf_error("invalid header on freelist", (unsigned long) p->s.valid1); #ifdef USAGE if (p->s.size > usage.total) buf_error("invalid size in header freelist",(unsigned long)p->s.size); #endif p = p->s.ptr; } } /* end if */ } static void addtofree(char* ap) { Header *bp, *p, **up; #ifdef USAGE usage.nfcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) buf_error("buf_free: pointer not from buf_alloc", (unsigned long) ap); #ifdef USAGE usage.inuse -= bp->s.size; /* Decrement memory usage */ #endif /* Extract the block from the used linked list ... for debug only */ for (up=&usedp; ; up = &((*up)->s.ptr)) { if (!*up) buf_error("buf_free:block not found in used list\n",(unsigned long)ap); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else p->s.ptr = bp; freep = p; } /* end if on ap */ } void armci_init_buf_alloc(size_t len, void* buffer) { char *cp; Header *up, *prevp; size_t nu; /* need to initialize the free list */ if (sizeof(Header) != ALIGNMENT) buf_error("Alignment is not valid", (unsigned long) ALIGNMENT); if(initialized)armci_die("armci_init_buf_alloc: already initialized",0); #ifdef USAGE usage.total = 0; /* Initialize statistics */ usage.nchunk = 0; usage.inuse = 0; usage.nfrags = 0; usage.maxuse = 0; usage.nmcalls= 0; usage.nfcalls= 0; #endif base.s.ptr = freep = prevp = &base; /* Initialize linked list */ base.s.size = 0; base.s.valid1 = VALID1; base.s.valid2 = VALID2; nu = len/sizeof(Header); /* nu must by a multiplicity of nalloc */ max_nalloc = nu*nalloc; if(nu<1) armci_die("buffer less than nalloc",(int)len); cp = (char*)buffer; #ifdef USAGE usage.total += nu; /* Have just got nu more units */ usage.nchunk++; /* One more chunk */ usage.nfrags++; /* Currently one more frag */ usage.inuse += nu; /* Inuse will be decremented by buf_free */ #endif up = (Header *) cp; up->s.size = nu; up->s.valid1 = VALID1; up->s.valid2 = VALID2; /* Insert into linked list of blocks in use so that buf_free works ... for debug only */ up->s.ptr = usedp; usedp = up; addtofree((char *)(up+1)); /* Try to join into the free list */ } /*\ return a chunk memory of given size \*/ char *armci_buf_alloc(size_t nbytes) { Header *p, *prevp; size_t nunits; char *return_ptr; /* need to initialize the free list */ if ((prevp = freep) == NULL) armci_die("not initialized", 0); #ifdef USAGE usage.nmcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; for (p=prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) /* exact fit */ prevp->s.ptr = p->s.ptr; else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; #ifdef USAGE usage.nfrags++; /* Have just increased the fragmentation */ #endif } /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = usedp; usedp = p; #ifdef USAGE usage.inuse += nunits; /* Record usage */ if (usage.inuse > usage.maxuse) usage.maxuse = usage.inuse; #endif freep = prevp; return_ptr = (char *) (p+1); break; } if (p == freep){ /* wrapped around the free list */ return_ptr = (char *) NULL; break; } } return return_ptr; } void armci_buf_free(char *ap) { Header *bp, *p, **up; #ifdef USAGE usage.nfcalls++; #endif if (do_verify) armci_buf_alloc_verify(); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) buf_error("buf_free: pointer not from buf_alloc", (unsigned long) ap); #ifdef USAGE usage.inuse -= bp->s.size; /* Decrement memory usage */ #endif /* Extract the block from the used linked list for debug only */ for (up=&usedp; ; up = &((*up)->s.ptr)) { if (!*up) buf_error("buf_free:block not found in used list\n",(unsigned long)ap); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; #ifdef USAGE usage.nfrags--; /* Lost a fragment */ #endif } else p->s.ptr = bp; freep = p; } /* end if on ap */ } #ifdef USAGE /* Return stats on buf_alloc performance. Use arg list instead of returning structure so that FORTRAN can eventually use it */ void buf_alloc_stats(size_t *total, long* nchunk, size_t * inuse, size_t * maxuse, long* nfrags, long* nmcalls,long* nfcalls) { *total = usage.total * sizeof(Header); *nchunk = usage.nchunk; *inuse = (size_t)usage.inuse * sizeof(Header); *maxuse = (size_t)usage.maxuse* sizeof(Header); *nfrags = usage.nfrags; *nmcalls= usage.nmcalls; *nfcalls= usage.nfcalls; } /* Print to standard output the usage statistics. */ void buf_alloc_print_stats() { size_t total, inuse, maxuse; long nchunk, nfrags, nmcalls, nfcalls; buf_alloc_stats(&total, &nchunk, &inuse, &maxuse, &nfrags, &nmcalls, &nfcalls); fflush(stderr); printf("\nbuf_alloc statistics\n-------------------\n\n"); printf("Total memory from system ... %ld bytes\n", (long)total); printf("Current memory usage ....... %ld bytes\n", (long)inuse); printf("Maximum memory usage ....... %ld bytes\n", (long)maxuse); printf("No. chunks from system ..... %ld\n", nchunk); printf("No. of fragments ........... %ld\n", nfrags); printf("No. of calls to buf_alloc ... %ld\n", nmcalls); printf("No. of calls to buf_free ..... %ld\n", nfcalls); printf("\n"); fflush(stdout); } #endif #if 0 void armci_die(char *str, int c) { fprintf(stderr,"%s %d\n",str,c); _exit(1); } #define LEN (16*1024) char buf[LEN]; main (int argc, char **argv) { int i,k,total=0,size=1024; char *ar[100]; armci_init_buf_alloc(LEN, buf); for(i=0; i<100; i++)ar[i]=(char*)0; for(i=0; i<100; i++){ ar[i] =armci_buf_alloc(size); if(!ar[i]){ printf("i =%d total=%d\n", i, total); buf_alloc_print_stats(); k=i; break; } total+=size; } for(i=0; i #include #define DEBUG_ 0 #define DEBUG_MEM 0 #if 0 # define MARK_ENTER(func_) { fprintf(stdout, "ENTERING %s\n", func_); fflush(stdout); } # define MARK_EXIT(func_) { fprintf(stdout, "EXITING %s\n", func_); fflush(stdout); } #else # define MARK_ENTER(func_) # define MARK_EXIT(func_) #endif #if 0 # define PRNDBG3(m,a1,a2,a3) \ fprintf(stderr,"DBG %d: " m,armci_me,a1,a2,a3);fflush(stderr) # define PRNDBG(m) PRNDBG3(m,0,0,0) # define PRNDBG1(m,a1) PRNDBG3(m,a1,0,0) # define PRNDBG2(m,a1,a2) PRNDBG3(m,a1,a2,0) #else # define PRNDBG(m) # define PRNDBG1(m,a1) # define PRNDBG2(m,a1,a2) # define PRNDBG3(m,a1,a2,a3) #endif #if !defined(GM) && !defined(VIA) && !defined(LAPI) &&!defined(VAPI) double _armci_rcv_buf[MSG_BUFLEN_DBL]; double _armci_snd_buf[MSG_BUFLEN_DBL]; char* MessageSndBuffer = (char*)_armci_snd_buf; char* MessageRcvBuffer = (char*)_armci_rcv_buf; #endif #define MAX_EHLEN 248 #define ADDBUF(buf,type,val) *(type*)(buf) = (val); (buf) += sizeof(type) #define GETBUF(buf,type,var) (var) = *(type*)(buf); (buf) += sizeof(type) #define ALLIGN8(buf){size_t _adr=(size_t)(buf); \ _adr>>=3; _adr<<=3; _adr+=8; (buf) = (char*)_adr; } #ifndef CLN # define CLN 1 #endif #ifndef SERV # define SERV 2 #endif /*******************Routines to handle completion descriptor******************/ /*\ *Following the the routines to fill a completion descriptor, if necessary *copy the data to destination based on completion descriptor *NOTE, THE FOLLOWING ROUTINES ARE FOR CLIENTS ONLY \*/ /*\Routine to complete a vector request, data is in buf and descriptor in dscr \*/ extern int armci_direct_vector_get(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); static void armci_complete_vector_get(armci_giov_t darr[],int len,void *buf) { int proc; request_header_t *msginfo = (request_header_t*) buf; proc = msginfo->to; #if defined(USE_SOCKET_VECTOR_API) armci_direct_vector_get(msginfo, darr, len, proc); #else armci_rcv_vector_data(proc, msginfo, darr, len); #endif FREE_SEND_BUFFER(buf); } /*\ Routine called from buffers.c to complete a request for which the buffer was * used for, so that the buffer can be reused. \*/ void armci_complete_req_buf(BUF_INFO_T *info, void *buffer) { request_header_t *msginfo = (request_header_t*) buffer; ARMCI_PR_DBG("enter",0); if(info->protocol==0)return; else if(info->protocol==SDSCR_IN_PLACE){ char *dscr = info->dscr; void *loc_ptr; int stride_levels; int *loc_stride_arr,*count; loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; if(0 || DEBUG_){ if(armci_me==0){ printf("\n%d:extracted loc_ptr=%p, stridelevels=%d\n",armci_me, loc_ptr,stride_levels); fflush(stdout); } } armci_rcv_strided_data(msginfo->to, msginfo, msginfo->datalen, loc_ptr, stride_levels,loc_stride_arr,count); FREE_SEND_BUFFER(msginfo); } else if(info->protocol==VDSCR_IN_PLACE || info->protocol==VDSCR_IN_PTR){ char *dscr; int len,i; if(info->protocol==VDSCR_IN_PLACE){ dscr = info->dscr; //printf("\n%d:vdscr in place\n",armci_me); } else { dscr = info->ptr.dscrbuf; //printf("\n%d:vdscr in buf\n",armci_me); } GETBUF(dscr, long ,len); { armci_giov_t *darr; darr = (armci_giov_t *)malloc(sizeof(armci_giov_t)*len); if(!darr)armci_die("malloc in complete_req_buf failed",len); for(i = 0; i< len; i++){ int parlen, bytes; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); darr[i].ptr_array_len = parlen; darr[i].bytes = bytes; if(msginfo->operation==GET)darr[i].dst_ptr_array=(void **)dscr; else darr[i].src_ptr_array=(void **)dscr; dscr+=sizeof(void *)*parlen; } if (msginfo->operation==GET) armci_complete_vector_get(darr,len,buffer); } } else armci_die("armci_complete_req_buf,protocol val invalid",info->protocol); ARMCI_PR_DBG("exit",0); } extern long x_net_offset(void *,int); /*\ save a part of strided descriptor needed to complete request rmo: it seems as if save_ \*/ void armci_save_strided_dscr(char **bptr, void *rem_ptr,int rem_stride_arr[], int count[], int stride_levels,int is_nb,int proc) { int i; char *bufptr=*bptr; BUF_INFO_T *info=NULL; long network_offset,tmpoffset; ARMCI_PR_DBG("enter",0); # ifdef PORTALS_UNRESOLVED if(!is_nb){ network_offset=x_net_offset(rem_ptr,proc); if(DEBUG_){printf("\n%d:rem_ptr=%p offset=%d newrem=%p",armci_me,rem_ptr,network_offset,(char *)rem_ptr+network_offset);fflush(stdout);} rem_ptr = (char *)rem_ptr+network_offset; } # endif if(is_nb){ info=BUF_TO_BUFINFO(*bptr); bufptr = (info->dscr); } *(void**)bufptr = rem_ptr; bufptr += sizeof(void*); *(int*)bufptr = stride_levels; bufptr += sizeof(int); for(i=0;idscr); if(armci_me==0) printf("\n%d:rem_ptr %p=%p stride_levels %d=%d\n",armci_me, *(void**)bufptr,rem_ptr, *(int*)(bufptr + sizeof(void*)),stride_levels); } /*remote_strided expects the pointer to point to the end of descr hence..*/ if(is_nb) info->protocol=SDSCR_IN_PLACE; else *bptr=bufptr; ARMCI_PR_DBG("exit",0); } /*\ save a part of vector descriptor needed to complete request \*/ void armci_save_vector_dscr(char **bptr,armci_giov_t darr[],int len, int op,int is_nb, int proc) { int i,size=sizeof(int); BUF_INFO_T *info; char *buf,*bufptr=*bptr; void *rem_ptr; long offst; ARMCI_PR_DBG("enter",0); if(is_nb){ for(i=0;idscr; info->protocol=VDSCR_IN_PLACE; } else { info->ptr.dscrbuf = (void *)malloc(size); buf = (char *)info->ptr.dscrbuf; info->protocol=VDSCR_IN_PTR; } } else buf=bufptr; ADDBUF(buf,long,len); /* number of sets */ for(i=0;ibufid to val, else set it to the id of the buf \*/ void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle,char *buf,int val) { BUF_INFO_T *info; if(buf){ info = BUF_TO_BUFINFO(buf); val = info->bufid; } nb_handle->bufid = val; } /**************End--Routines to handle completion descriptor******************/ /*\ send request to server to LOCK MUTEX \*/ void armci_rem_lock(int mutex, int proc, int *ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(int); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,LOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->datalen = sizeof(int); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = LOCK; msginfo->format = mutex; msginfo->bytes = msginfo->datalen + msginfo->dscrlen; ibuf = (int*)(msginfo+1); *ibuf = mutex; armci_send_req(proc, msginfo, bufsize, 0); /* receive ticket from server */ *ticket = *(int*)armci_rcv_data(proc,msginfo,0); FREE_SEND_BUFFER(msginfo); if(DEBUG_)fprintf(stderr,"%d receiving ticket %d\n",armci_me, *ticket); } void armci_server_lock(request_header_t *msginfo) { int *ibuf = (int*)(msginfo+1); int proc = msginfo->from; int mutex; int ticket; ARMCI_PR_DBG("enter",0); mutex = *(int*)ibuf; /* acquire lock on behalf of requesting process */ ticket = armci_server_lock_mutex(mutex, proc, msginfo->tag); if(ticket >-1){ /* got lock */ msginfo->datalen = sizeof(int); armci_send_data(msginfo, &ticket); } ARMCI_PR_DBG("exit",0); } /*\ send request to server to UNLOCK MUTEX \*/ void armci_rem_unlock(int mutex, int proc, int ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(ticket); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,UNLOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = msginfo->bytes = sizeof(ticket); msginfo->datalen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = UNLOCK; msginfo->format = mutex; ibuf = (int*)(msginfo+1); *ibuf = ticket; if(DEBUG_)fprintf(stderr,"%d sending unlock\n",armci_me); armci_send_req(proc, msginfo, bufsize,0); } /*\ server unlocks mutex and passes lock to the next waiting process \*/ void armci_server_unlock(request_header_t *msginfo, char* dscr) { int ticket = *(int*)dscr; int mutex = msginfo->format; int proc = msginfo->to; int waiting; waiting = armci_server_unlock_mutex(mutex,proc,ticket,&msginfo->tag); if(waiting >-1){ /* -1 means that nobody is waiting */ ticket++; /* pass ticket to the waiting process */ msginfo->from = waiting; msginfo->datalen = sizeof(ticket); armci_send_data(msginfo, &ticket); } } void armci_unlock_waiting_process(msg_tag_t tag, int proc, int ticket) { request_header_t header; request_header_t *msginfo = &header; msginfo->datalen = sizeof(int); msginfo->tag = tag; msginfo->from = proc; msginfo->to = armci_me; armci_send_data(msginfo, &ticket); } void * armci_server_ptr(int id){ char *buf; int bufsize = sizeof(int); request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = 0; msginfo->datalen = sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(&id, msginfo +1, sizeof(int)); if(DEBUG_MEM){ printf("\n%d:attach req:sending id %d \n",armci_me,id);fflush(stdout); } armci_send_req(armci_master, msginfo, bufsize,0); buf= armci_rcv_data(armci_master,msginfo,sizeof(void *));/* receive response */ if(DEBUG_MEM){ printf("\n%d:attach req:got %p \n",armci_me,buf);fflush(stdout); } FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); return (void *)buf; } /*\ control message to the server, e.g.: ATTACH to shmem, return ptr etc. \*/ void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen) { char *buf; ARMCI_PR_DBG("enter",0); int bufsize = 2*sizeof(request_header_t)+ilen + sizeof(long)+sizeof(rlen); long *idlist=(long *)info; request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = ilen; msginfo->datalen = sizeof(long)+sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(info, msginfo +1, ilen); if(DEBUG_MEM){printf("\n%d:sending idlist+1 %d, size %d, idlist[0] %d, idlist[1] %d\n",armci_me,idlist+1,size,idlist[0],idlist[1]);} buf = ((char*)msginfo) + ilen + sizeof(request_header_t); *((long*)buf) =size; *(int*)(buf+ sizeof(long)) = rlen; armci_send_req(armci_master, msginfo, bufsize,0); if(rlen){ buf= armci_rcv_data(armci_master, msginfo,rlen); /* receive response */ bcopy(buf, resp, rlen); FREE_SEND_BUFFER(msginfo); if(DEBUG_MEM){printf("%d:client attaching got ptr=%p %d bytes\n",armci_me,buf,rlen); fflush(stdout); } } ARMCI_PR_DBG("exit",0); } /*\ server initializes its copy of the memory lock data structures \*/ static void server_alloc_memlock(void *ptr_myclus) { int i; /* for protection, set pointers for processes outside local node NULL */ memlock_table_array = calloc(armci_nproc,sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); /* set pointers for processes on local cluster node * ptr_myclus - corresponds to the master process */ for(i=0; i< armci_clus_info[armci_clus_me].nslave; i++){ memlock_table_array[armci_master +i] = ((char*)ptr_myclus) + MAX_SLOTS*sizeof(memlock_t)*i; } /* set pointer to the use flag */ #ifdef MEMLOCK_SHMEM_FLAG armci_use_memlock_table = (int*) (MAX_SLOTS*sizeof(memlock_t) + (char*) memlock_table_array[armci_clus_last]); if(DEBUG_) fprintf(stderr,"server initialized memlock %p\n",armci_use_memlock_table); #endif } static int allocate_memlock=1; /*\ server actions triggered by client request to ATTACH \*/ void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen) { double *ptr; long *idlist = (long*)descr; long size = *(long*)buffer; int rlen = *(int*)(sizeof(long)+(char*)buffer); extern int **_armci_int_mutexes; ARMCI_PR_DBG("enter",0); if(size<0) armci_die("armci_server_ipc: size<0",(int)size); if(DEBUG_MEM)printf("\n%d:got idlist+1 %p, size %d, idlist[0] %d, idlist[1] %d",armci_me,idlist+1,size,idlist[0],idlist[1]); ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("armci_server_ipc: failed to attach",0); /* provide data server with access to the memory lock data structures */ if(allocate_memlock){ allocate_memlock = 0; server_alloc_memlock(ptr); } if(_armci_int_mutexes==NULL){ printf("unresolved portals external\n"); abort(); # ifdef PORTALS_UNRESOLVED extern int _armci_server_mutex_ready; extern void *_armci_server_mutex_ptr; if(_armci_server_mutex_ready){ _armci_int_mutexes=(int **)_armci_server_mutex_ptr; } # endif } if(size>0)armci_set_mem_offset(ptr); if(msginfo->datalen != sizeof(long)+sizeof(int)) armci_die("armci_server_ipc: bad msginfo->datalen ",msginfo->datalen); if(rlen==sizeof(ptr)){ msginfo->datalen = rlen; armci_send_data(msginfo, &ptr); } else armci_die("armci_server_ipc: bad rlen",rlen); ARMCI_PR_DBG("exit",0); } /*\ send RMW request to server \*/ void armci_rem_rmw(int op, void *ploc, void *prem, int extra, int proc) { request_header_t *msginfo; char *buf; void *buffer; int bufsize = sizeof(request_header_t)+sizeof(long)+sizeof(void*); long offst; ARMCI_PR_DBG("enter",0); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,op,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = sizeof(void*); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->datalen = sizeof(long); # ifdef PORTALS_UNRESOLVED offst=x_net_offset(prem,proc); prem = ((char *)prem+offst); # endif buf = (char*)(msginfo+1); ADDBUF(buf, void*, prem); /* pointer is shipped as descriptor */ /* data field: extra argument in fetch&add and local value in swap */ if(op==ARMCI_SWAP){ ADDBUF(buf, int, *((int*)ploc)); }else if(op==ARMCI_SWAP_LONG) { ADDBUF(buf, long, *((long*)ploc) ); msginfo->datalen = sizeof(long); }else { ADDBUF(buf, int, extra); } msginfo->bytes = msginfo->datalen+msginfo->dscrlen ; if(DEBUG_){ printf("%d sending RMW request %d to %d\n",armci_me,op,proc); fflush(stdout); } armci_send_req(proc, msginfo, bufsize,0); buffer = armci_rcv_data(proc,msginfo,0); /* receive response */ if(op==ARMCI_FETCH_AND_ADD || op== ARMCI_SWAP) *(int*)ploc = *(int*)buffer; else *(long*)ploc = *(long*)buffer; FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); } /*\ server response to RMW \*/ void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra) { long lold; int iold; void *pold=0; int op = msginfo->operation; ARMCI_PR_DBG("enter",0); if(DEBUG_){ printf("%d server: executing RMW from %d. op=%d pextra=%p\n",armci_me,msginfo->from, op, pextra); fflush(stdout); } if(msginfo->datalen != sizeof(long)) armci_die2("armci_server_rmw: bad datalen=",msginfo->datalen,op); /* for swap operations *pextra has the value to swap * for fetc&add it carries the increment argument */ switch(op){ case ARMCI_SWAP: iold = *(int*) pextra; case ARMCI_FETCH_AND_ADD: pold = &iold; break; case ARMCI_SWAP_LONG: lold = *(long*) pextra; case ARMCI_FETCH_AND_ADD_LONG: pold = &lold; break; default: armci_die("armci_server_rmw: bad operation code=",op); } armci_generic_rmw(op, pold, *(int**)ptr, *(int*) pextra, msginfo->to); armci_send_data(msginfo, pold); ARMCI_PR_DBG("exit",0); } extern int armci_direct_vector_snd(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); extern int armci_direct_vector(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,int flag, armci_ihdl_t nb_handle) { char *buf,*buf0; request_header_t *msginfo; int bytes =0, s, slen=0; size_t adr; int bufsize = sizeof(request_header_t); int tag=0; if(nb_handle)tag=nb_handle->tag; /* compute size of the buffer needed */ for(s=0; stag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } buf += sizeof(request_header_t); /* fill vector descriptor */ armci_save_vector_dscr(&buf,darr,len,op,0,proc); /* align buf for doubles (8-bytes) before copying data */ adr = (size_t)buf; adr >>=3; adr <<=3; adr +=8; buf = (char*)adr; msginfo->ehlen = 0; /* fill message header */ msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->format = VECTOR; msginfo->datalen = bytes; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; default: slen=0; } buf += slen; msginfo->datalen += slen; msginfo->bytes = msginfo->datalen+msginfo->dscrlen; /* for put and accumulate copy data into buffer */ if(op != GET){ /* fprintf(stderr,"sending %lf\n",*(double*)darr[0].src_ptr_array[0]);*/ armci_vector_to_buf(darr, len, buf); } armci_send_req(proc, msginfo, bufsize,tag); /*x_buf_send_complete(buf0);*/ if(nb_handle && op==GET) armci_save_vector_dscr(&buf0,darr,len,op,1,proc); if(op == GET&& !nb_handle){ armci_complete_vector_get(darr,len,msginfo); } return 0; } #define CHUN_ (8*8096) #define CHUN 200000 /*\ client version of remote strided operation \*/ int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int flag,armci_ihdl_t nb_handle) { char *buf, *buf0; request_header_t *msginfo; int i, slen=0, bytes; void *rem_ptr; int *rem_stride_arr; int bufsize = sizeof(request_header_t); int ehlen =0; msg_tag_t msg_tag; int tag=0; /* we send ext header only for last chunk */ #if 0 if(h) ehlen = h->len; #else if(h) if(h->last) ehlen = h->len; #endif if(ehlen>MAX_EHLEN || ehlen <0) armci_die2("armci_rem_strided ehlen out of range",MAX_EHLEN,ehlen); /* calculate size of the buffer needed */ for(i=0, bytes=1;i<=stride_levels;i++)bytes*=count[i]; bufsize += bytes+sizeof(void*)+2*sizeof(int)*(stride_levels+1) +ehlen +2*sizeof(double) + 16; /* +scale+alignment */ if (flag){ printf("%d: flag=%d\n",armci_me,flag); if(op==GET)bufsize -=bytes; } buf = buf0= GET_SEND_BUFFER((bufsize),op,proc); msginfo = (request_header_t*)buf; bzero(msginfo,sizeof(request_header_t)); if(nb_handle) #ifdef ACC_SMP if(!ARMCI_ACC(op)) #endif { // printf("%s: non-blocking ops not yet supported\n",Portals_ID()); // abort(); /* INIT_SENDBUF_INFO(nb_handle,buf,op,proc); same as _armci_buf_set_tag, why here? */ _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); tag = nb_handle->tag; } if(op == GET){ rem_ptr = src_ptr; rem_stride_arr = src_stride_arr; }else{ rem_ptr = dst_ptr; rem_stride_arr = dst_stride_arr; } msginfo->datalen=bytes; /* fill strided descriptor */ buf += sizeof(request_header_t); /*this function fills the dscr into buf and also moves the buf ptr to the end of the dscr*/ armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0,proc); /* align buf for doubles (8-bytes) before copying data */ ALLIGN8(buf); /* fill message header */ msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = op; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; case ARMCI_ACC_LNG: *(long*)buf = *(long*)scale; slen = sizeof(long); break; default: slen=0; } /* if(ARMCI_ACC(op))printf("%d client len=%d alpha=%lf data=%lf,%lf\n", armci_me, buf-(char*)msginfo,((double*)buf)[0],*((double*)src_ptr), ((double*)buf)[1]); */ buf += slen; /**** add extended header *******/ if(ehlen){ bcopy(h->exthdr,buf,ehlen); i = ehlen%8; ehlen += (8-i); /* make sure buffer is still alligned */ buf += ehlen; } msginfo->ehlen = ehlen; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->datalen+msginfo->dscrlen; if(op == GET){ /* if(nb_handle) { printf("%s rem_strided: nb gets not yet available\n",Portals_ID()); abort(); } */ armci_send_req(proc, msginfo, bufsize,tag); armci_save_strided_dscr(&buf0,dst_ptr,dst_stride_arr,count, stride_levels,1,proc); if(!nb_handle){ armci_rcv_strided_data(proc, msginfo, msginfo->datalen, dst_ptr, stride_levels, dst_stride_arr, count); FREE_SEND_BUFFER(msginfo); } } else { /* for put and accumulate send data */ armci_send_strided(proc,msginfo, buf, src_ptr, stride_levels, src_stride_arr, count,tag); } return 0; } void armci_process_extheader(request_header_t *msginfo, char *dscr, char* buf, int buflen) { armci_flag_t *h; int *flag; h = (armci_flag_t*)(dscr + msginfo->dscrlen - msginfo->ehlen); #if 0 if(msginfo->ehlen)printf("%d:server from=%d len=%d: ptr=%p val=%d\n",armci_me,msginfo->from, msginfo->ehlen,h->ptr,h->val); fflush(stdout); #endif flag = (int*)(h->ptr); *flag = h->val; } void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen) { int buf_stride_arr[MAX_STRIDE_LEVEL+1]; int *loc_stride_arr,slen; int *count, stride_levels; void *buf_ptr, *loc_ptr; void *scale; char *dscr_save = dscr; int rc, i,proc; int stat; ARMCI_PR_DBG("enter",msginfo->datalen);fflush(stdout); /*return if using readv/socket for put*/ if(msginfo->operation==PUT && msginfo->datalen==0){ if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr, buf, buflen); return; } /* unpack descriptor record */ loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; /* compute stride array for buffer */ buf_stride_arr[0]=count[0]; for(i=0; i< stride_levels; i++) buf_stride_arr[i+1]= buf_stride_arr[i]*count[i+1]; /* get scale for accumulate, adjust buf to point to data */ switch(msginfo->operation){ case ARMCI_ACC_INT: slen = sizeof(int); break; case ARMCI_ACC_DCP: slen = 2*sizeof(double); break; case ARMCI_ACC_DBL: slen = sizeof(double); break; case ARMCI_ACC_CPL: slen = 2*sizeof(float); break; case ARMCI_ACC_FLT: slen = sizeof(float); break; case ARMCI_ACC_LNG: slen = sizeof(long); break; default: slen=0; } scale = dscr_save+ (msginfo->dscrlen - slen -msginfo->ehlen); /* if(ARMCI_ACC(msginfo->operation)) fprintf(stderr,"%d in server len=%d slen=%d alpha=%lf data=%lf\n", armci_me, msginfo->dscrlen, slen, *(double*)scale,*(double*)buf); */ buf_ptr = buf; /* data in buffer */ proc = msginfo->to; if(msginfo->operation == GET){ armci_send_strided_data(proc, msginfo, buf, loc_ptr, stride_levels, loc_stride_arr, count); /* fprintf(stderr, "GET response sent with tag: %d\n, msginfo->tag", msginfo->tag); */ } else{ if((rc = armci_op_strided(msginfo->operation, scale, proc, buf_ptr, buf_stride_arr, loc_ptr, loc_stride_arr, count, stride_levels, 1,NULL))) armci_die("server_strided: op from buf failed",rc); } if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr_save, buf, buflen); ARMCI_PR_DBG("exit",0); } void armci_server_vector( request_header_t *msginfo, char *dscr, char* buf, int buflen) { int proc; long len; void *scale; int i,s; char *sbuf = buf; if(msginfo->operation==PUT && msginfo->datalen==0)return;/*return if using readv/socket for put*/ /* unpack descriptor record */ GETBUF(dscr, long ,len); /* get scale for accumulate, adjust buf to point to data */ scale = buf; switch(msginfo->operation){ case ARMCI_ACC_INT: buf += sizeof(int); break; case ARMCI_ACC_DCP: buf += 2*sizeof(double); break; case ARMCI_ACC_DBL: buf += sizeof(double); break; case ARMCI_ACC_CPL: buf += 2*sizeof(float); break; case ARMCI_ACC_FLT: buf += sizeof(float); break; } proc = msginfo->to; /*fprintf(stderr,"scale=%lf\n",*(double*)scale);*/ /* execute the operation */ switch(msginfo->operation) { case GET: /* fprintf(stderr, "%d:: Got a vector message!!\n", armci_me); */ if(msginfo->ehlen) { armci_die("Unexpected vector message with non-zero ehlen. GPC call?", msginfo->ehlen); } else { for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); /* fprintf(stderr,"len=%d bytes=%d parlen=%d\n",len,bytes,parlen);*/ ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ armci_copy(ptr[s], buf, bytes); buf += bytes; } } /* fprintf(stderr,"%d:: VECTOR GET. server sending buffer %p datalen=%d\n",armci_me, sbuf, msginfo->datalen); */ armci_send_data(msginfo, sbuf); } break; case PUT: /* fprintf(stderr,"received in buffer %lf\n",*(double*)buf);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ /* armci_copy(buf, ptr[s], bytes); */ bcopy(buf, ptr[s], (size_t)bytes); buf += bytes; } } break; default: /* this should be accumulate */ if(!ARMCI_ACC(msginfo->operation)) armci_die("v server: wrong op code",msginfo->operation); /* fprintf(stderr,"received first=%lf last =%lf in buffer\n",*/ /* *((double*)buf),((double*)buf)[99]);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); armci_lockmem_scatter(ptr, parlen, bytes, proc); for(s=0; s< parlen; s++){ armci_acc_2D(msginfo->operation, scale, proc, buf, ptr[s], bytes, 1, bytes, bytes, 0); buf += bytes; } ARMCI_UNLOCKMEM(proc); } } } ga-5-4/armci/src-gemini/armci-onesided.c0000644000175000017500000005221012662210416016207 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" int armci_onesided_ds_handler(void *); #ifdef ARMCI_REGISTER_SHMEM typedef struct { void *base_ptr; void *serv_ptr; size_t size; int islocal; int valid; } aptl_reginfo_t; typedef struct { aptl_reginfo_t reginfo[MAX_MEM_REGIONS]; int reg_count; } rem_meminfo_t; static rem_meminfo_t *_rem_meminfo; static aptl_reginfo_t *_tmp_rem_reginfo; #define IN_REGION(_ptr__,_reg__) ((_reg__.valid) && (_ptr__)>=(_reg__.serv_ptr) \ && (_ptr__) <= ( (char *)(_reg__.serv_ptr)+_reg__.size)) #endif static cos_mdesc_t _send_mdesc, _recv_mdesc; static cos_mdesc_t *send_mdesc = NULL; static cos_mdesc_t *recv_mdesc = NULL; int armci_onesided_direct_get_enabled = 1; int armci_onesided_direct_put_enabled = 1; cos_desc_t __global_1sided_direct_comm_desc; cos_desc_t __global_1sided_direct_get_comm_desc; // linked-list to hold mdh arrays for all ARMCI_Malloc calls remote_mdh_node_t *remote_mdh_base_node = NULL; char **client_buf_ptrs; int armci_onesided_init() { int i; cos_parameters_t cos_params; cos_params.options = ONESIDED_DS_PER_NUMA; cos_params.nDataServers = 1; cos_params.maxDescriptors = ARMCI_MAX_DESCRIPTORS*10; cos_params.maxRequestSize = ARMCI_MAX_REQUEST_SIZE; cos_params.dsHandlerFunc = armci_onesided_ds_handler; bzero(&__global_1sided_direct_comm_desc,sizeof(cos_desc_t)); // check to make sure things are properly sized if(armci_me == 0) { // ARMCI_ONESIDED_SIZEOF_IREQ is defined in armci.h if(sizeof(armci_ireq_t) != ARMCI_ONESIDED_SIZEOF_IREQ) { printf("ARMCI_ONESIDED_SIZEOF_IREQ is not sized correctly.\n"); printf("ARMCI_ONESIDED_SIZEOF_IREQ = %d\nsizeof(armci_ireq_t) = %d\n", ARMCI_ONESIDED_SIZEOF_IREQ,sizeof(armci_ireq_t)); abort(); } } // initialize libonesided COS_Init( &cos_params ); // initialize armci memory # ifdef ARMCI_REGISTER_SHMEM _rem_meminfo = (rem_meminfo_t *)calloc(armci_nproc,sizeof(rem_meminfo_t)); _tmp_rem_reginfo = (aptl_reginfo_t *)malloc(sizeof(aptl_reginfo_t)*armci_nproc); if( _rem_meminfo==NULL || _tmp_rem_reginfo ==NULL) { armci_die("malloc failed in init_portals",0); } if(armci_me == 0) { printf("sizeof(rem_meminfo_t)=%ld\n",sizeof(rem_meminfo_t)); } # endif client_buf_ptrs = (char **) calloc(armci_nproc,sizeof(char *)); assert(client_buf_ptrs); armci_msg_barrier(); _armci_buf_init(); // each armci buffer has a cos_request_t associated with it // initialize that cos_request_t now // moved into the above _armci_buf_init routine // for(i=0; idscrlen + msginfo->datalen; // print_data(msginfo); cpReqInit(remote_node, req); cpPrePostRecv(buffer, length, req); cpCopyLocalDataMDesc(req, &msginfo->tag.response_mdesc); if(length > ARMCI_MAX_REQUEST_SIZE) length = sizeof(request_header_t); cpReqSend(msginfo, length, req); // cpReqWait(req); // required until a new fence operation is created } void print_data(void* buf) { request_header_t *msginfo = (request_header_t *) buf; char *buffer = (char *) buf; buffer += sizeof(request_header_t) + msginfo->dscrlen; int ndouble = msginfo->datalen/8; double *data = (double *) buffer; printf("%d: [0]=%lf; [%d]=%lf; from=%d; to=%d\n",armci_me,data[0],ndouble-1,data[ndouble-1],msginfo->from, msginfo->to); } static void armci_onesided_recv(void* buffer, request_header_t *msginfo, int remote_node, cos_request_t *req) { size_t length = sizeof(request_header_t) + msginfo->dscrlen; size_t reg_len = length + msginfo->datalen; cpReqInit(remote_node, req); cpPrePostRecv(buffer, reg_len, req); cpCopyLocalDataMDesc(req, &msginfo->tag.response_mdesc); if(length > ARMCI_MAX_REQUEST_SIZE) length = sizeof(request_header_t); cpReqSend(msginfo, length, req); } static void armci_onesided_oper(void* buffer, request_header_t *msginfo, int remote_node, cos_request_t *req) { size_t length = sizeof(request_header_t); cpReqInit(remote_node, req); cpPrePostRecv(buffer, length, req); cpCopyLocalDataMDesc(req, &msginfo->tag.response_mdesc); cpReqSend(msginfo, length, req); } static void armci_onesided_rmw(void *buffer, request_header_t *msginfo, int remote_node, cos_request_t *req) { size_t length = sizeof(request_header_t) + msginfo->dscrlen + msginfo->datalen; cpReqInit(remote_node, req); cpPrePostRecv(buffer, msginfo->datalen, req); cpCopyLocalDataMDesc(req, &msginfo->tag.response_mdesc); cpReqSend(msginfo, length, req); } extern _buf_ackresp_t *_buf_ackresp_first,*_buf_ackresp_cur; #if defined CRAY_REGISTER_ARMCI_MALLOC && HAVE_ONESIDED_FADD void armci_onesided_fadd(void *ploc, void *prem, int extra, int proc) { onesided_hnd_t cp_hnd; cos_desc_t comm_desc; cos_mdesc_t local_mdh, remote_mdh, *mdh = NULL; cpGetOnesidedHandle(&cp_hnd); armci_onesided_search_remote_mdh_list(prem, proc, &remote_mdh); onesided_mem_register(cp_hnd, ploc, sizeof(long), NULL, &local_mdh); onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, &comm_desc); onesided_fadd(extra, &comm_desc); onesided_wait(&comm_desc); } #endif int armci_send_req_msg(int proc, void *buf, int bytes, int tag) { int cluster = armci_clus_id(proc); int serv = armci_clus_info[cluster].master; char *buffer = (char *) buf; request_header_t *msginfo = (request_header_t *) buf; # ifdef ARMCI_LIMIT_REMOTE_REQUESTS_BY_NODE _armci_buf_ensure_one_outstanding_op_per_node(buf,cluster); # endif # ifdef SPECIAL_PUT_OPERATION_BROKEN_WHEN_INITIATED_FROM_USER_BUFFER // ensure any outstanding onesided direct operations have finished int state = __global_1sided_direct_comm_desc.state; onesided_wait(&__global_1sided_direct_comm_desc); if(state) cpMemDeregister(&__global_1sided_direct_comm_desc.local_mdesc); # endif BUF_INFO_T *bufinfo=_armci_buf_to_bufinfo(msginfo); _buf_ackresp_t *ar = &bufinfo->ar; cos_request_t *req = &ar->req; if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { armci_onesided_send(buffer, msginfo, cluster, req); } else if(msginfo->operation == GET) { // move the buffer shift into the data server handler // buffer = (char *) buf; // buffer += sizeof(request_header_t); // buffer += msginfo->dscrlen; armci_onesided_recv(buffer, msginfo, cluster, req); } else if(msginfo->operation == ACK) { armci_onesided_oper(buffer, msginfo, cluster, req); #if HAVE_ONESIDED_MEM_HTFLUSH onesided_mem_htflush(cluster); #endif } else if(msginfo->operation == ARMCI_SWAP || msginfo->operation == ARMCI_SWAP_LONG || msginfo->operation == ARMCI_FETCH_AND_ADD || msginfo->operation == ARMCI_FETCH_AND_ADD_LONG) { buffer = (char *) buf; buffer += sizeof(request_header_t); buffer += msginfo->dscrlen; armci_onesided_rmw(buffer, msginfo, cluster, req); } else { cosError("armci_send_req_msg: operation not supported",msginfo->operation); } // this had to be included in the portals version or shit would go down ... not sure y! // for now, we'll leave it in and see what happens later when we remote it # if 1 ar->val = ar->valc = 0; if(ar==_buf_ackresp_first)_buf_ackresp_first=ar->next; if(ar->next!=NULL){ ar->next->previous=ar->previous; } if(ar->previous!=NULL){ ar->previous->next=ar->next; if(_buf_ackresp_cur==ar)_buf_ackresp_cur=ar->previous; } if(_buf_ackresp_cur==ar)_buf_ackresp_cur=NULL; ar->previous=ar->next=NULL; # endif return 0; } char * armci_ReadFromDirect(int proc, request_header_t *msginfo, int len) { // this is a CP funciton BUF_INFO_T *bufinfo = _armci_buf_to_bufinfo(msginfo); cos_request_t *req = &bufinfo->ar.req; cpReqWait(req); // return pointer to data char *ret = (char *) msginfo; ret += sizeof(request_header_t); ret += msginfo->dscrlen; return ret; } void armci_WriteToDirect(int proc, request_header_t *msginfo, void *buf) { // this is a DS function cos_desc_t resp_desc; cos_mdesc_t *resp_mdesc = &msginfo->tag.response_mdesc; dsDescInit(resp_mdesc, &resp_desc); resp_desc.event_type = EVENT_LOCAL | EVENT_REMOTE; if(send_mdesc == NULL) { send_mdesc = &_send_mdesc; dsMemRegister(MessageSndBuffer, sizeof(double)*MSG_BUFLEN_DBL, send_mdesc); } memcpy(&resp_desc.local_mdesc, send_mdesc, sizeof(cos_mdesc_t)); resp_desc.local_mdesc.addr = (uint64_t) buf; resp_desc.local_mdesc.length = (uint64_t) msginfo->datalen; // cosPut(buf, msginfo->datalen, &resp_desc); cosPutWithDesc(&resp_desc); dsDescWait(&resp_desc); } int armci_onesided_ds_handler(void *buffer) { size_t length = 0; cos_desc_t get_desc; cos_mdesc_t *mdesc = NULL; void *buffer_to_data_server = buffer; request_header_t *request = (request_header_t *) buffer; if(request->operation == PUT || ARMCI_ACC(request->operation)) { length = sizeof(request_header_t) + request->dscrlen + request->datalen; if(length > ARMCI_MAX_REQUEST_SIZE) { char *get_buffer = (char *) MessageRcvBuffer; if(recv_mdesc == NULL) { recv_mdesc = &_recv_mdesc; dsMemRegister(MessageRcvBuffer, sizeof(double)*MSG_BUFLEN_DBL, recv_mdesc); } mdesc = &request->tag.response_mdesc; dsDescInit(mdesc, &get_desc); get_desc.event_type = EVENT_LOCAL; memcpy(&get_desc.local_mdesc, recv_mdesc, sizeof(cos_mdesc_t)); get_desc.local_mdesc.length = length; assert(length <= sizeof(double)*MSG_BUFLEN_DBL); cosGetWithDesc(&get_desc); dsDescWait(&get_desc); buffer_to_data_server = (void *) get_buffer; } } else if(request->operation == GET) { length = sizeof(request_header_t) + request->dscrlen; if(length > ARMCI_MAX_REQUEST_SIZE) { // printf("[ds %d]: boom - rz fetch of get dscr\n",armci_me); char *get_buffer = (char *) MessageRcvBuffer; if(recv_mdesc == NULL) { recv_mdesc = &_recv_mdesc; dsMemRegister(MessageRcvBuffer, sizeof(double)*MSG_BUFLEN_DBL, recv_mdesc); } mdesc = &request->tag.response_mdesc; dsDescInit(mdesc, &get_desc); get_desc.event_type = EVENT_LOCAL; memcpy(&get_desc.local_mdesc, recv_mdesc, sizeof(cos_mdesc_t)); get_desc.local_mdesc.length = length; assert(length <= sizeof(double)*MSG_BUFLEN_DBL); cosGetWithDesc(&get_desc); dsDescWait(&get_desc); buffer_to_data_server = (void *) get_buffer; } // regardless of rendez-vous or eager protocols // we have to shift the buffer and data lengths in the response_mdesc tag request = (request_header_t *) buffer_to_data_server; char *rbuf = (char *) request->tag.response_mdesc.addr; rbuf += length; request->tag.response_mdesc.addr = (uint64_t) rbuf; request->tag.response_mdesc.length -= length; } if(request->operation == 0) { printf("%d [ds] possible zeroed buffer problem\n",armci_me); abort(); } armci_data_server(buffer_to_data_server); } void armci_rcv_req(void *mesg,void *phdr,void *pdescr,void *pdata,int *buflen) { int i,na; char *a; double *tmp; request_header_t *msginfo = (request_header_t *)mesg; ARMCI_PR_SDBG("enter",msginfo->operation); *(void **) phdr = msginfo; if(0) { printf("%d [ds]: got %d req (hdrlen=%d dscrlen=%d datalen=%d %d) from %d\n", armci_me, msginfo->operation, sizeof(request_header_t), msginfo->dscrlen, msginfo->datalen, msginfo->bytes,msginfo->from); fflush(stdout); } /* we leave room for msginfo on the client side */ *buflen = MSG_BUFLEN - sizeof(request_header_t); if(send_mdesc == NULL) { send_mdesc = &_send_mdesc; dsMemRegister(MessageSndBuffer, sizeof(double)*MSG_BUFLEN_DBL, send_mdesc); } // printf("%d [ds] oper=%d; bytes=%d\n",armci_me,msginfo->operation,msginfo->bytes); if(msginfo->bytes) { *(void **) pdescr = msginfo+1; *(void **) pdata = msginfo->dscrlen + (char*)(msginfo+1); if(msginfo->operation == GET) { // the descriptor will exists after the request header // but there will be no data buffer // use the MessageRcvBuffer *(void**) pdata = MessageSndBuffer; // printf("%s (server) overriding pdata in rcv_req\n",Portals_ID()); if(send_mdesc == NULL) { send_mdesc = &_send_mdesc; dsMemRegister(MessageSndBuffer, sizeof(double)*MSG_BUFLEN_DBL, send_mdesc); // printf("send_mdesc registered\n"); // fflush(stdout); } } } else { // printf("%d [ds]: hit this\n",armci_me); *(void**) pdescr = NULL; *(void**) pdata = MessageRcvBuffer; if(recv_mdesc == NULL) { recv_mdesc = &_recv_mdesc; dsMemRegister(MessageRcvBuffer, sizeof(double)*MSG_BUFLEN_DBL, recv_mdesc); } } ARMCI_PR_SDBG("exit",msginfo->operation); } void armci_server_send_ack(request_header_t *msginfo) { // this is a DS function cos_desc_t resp_desc; cos_mdesc_t *resp_mdesc = &msginfo->tag.response_mdesc; dsDescInit(resp_mdesc, &resp_desc); resp_desc.event_type = EVENT_LOCAL | EVENT_REMOTE; cosPut(NULL, 0, &resp_desc); dsDescWait(&resp_desc); } void x_buf_wait_ack(request_header_t *msginfo, BUF_INFO_T *bufinfo) { armci_die("x_buf_wait_ack not implemented",911); } void x_net_send_ack(request_header_t *msginfo, int proc, void *dst, void *src) { armci_die("x_net_send_ack not implemented",911); } long x_net_offset(char *buf, int proc) { armci_die("x_net_offset not implemented",911); # if 0 ARMCI_PR_DBG("enter",_rem_meminfo[proc].reg_count); if(DEBUG_COMM) { printf("\n%d:%s:buf=%p",armci_me,__FUNCTION__,buf);fflush(stdout); } for(i=0;i<_rem_meminfo[proc].reg_count;i++) { if(IN_REGION(buf,_rem_meminfo[proc].reginfo[i])) { return((long)((char *)_rem_meminfo[proc].reginfo[i].serv_ptr-(char *)_rem_meminfo[proc].reginfo[i].base_ptr)); } } ARMCI_PR_DBG("exit",0); # endif return 0; } // currently our list of remote mdhs appears that it can get several entries with various // lengths. we should scan the mdh list first to see if an entry exists in the list // if so, that could be an indication that the remote list entry function is not working // properly, or that a different type of armci_free call is being used to by pass the // removal of the mdh entry. either way, we need to examine these occurences. void armci_onesided_append_remote_mdh_list(void* tgt_ptr, int proc, cos_mdesc_t *ret_mdh) { } void armci_onesided_search_remote_mdh_list(void* tgt_ptr, int proc, cos_mdesc_t *ret_mdh) { int node = armci_clus_id(proc); uint64_t length; uint64_t rem_addr; uint64_t tgt_addr = (uint64_t) tgt_ptr; remote_mdh_node_t *ll = remote_mdh_base_node; const cos_mdesc_t *mdh = NULL; // search the link-list for remote address and return the while(ll) { // if we are in this routine, we are doing a direct onesided operations on a chuck of local // memory that was registered by the master process on this node. typically, an armci operation // would work directly off the virtual address of that data as attached by the current process; // however, because we are going to do a UGNI operation targetted at the MDH registered by the // armci_master rank on this node, we have to translate the virtual address on this rank to the // virtual address on armci_master. this means we have to find the mdh by searching the ptrs // array and not the mdhs[*].addr values if(SAMECLUSNODE(proc) && armci_me != armci_master) { rem_addr = (uint64_t) ll->ptrs[proc]; } else { rem_addr = (uint64_t) ll->mdhs[proc].addr; } length = ll->mdhs[proc].length; if(tgt_addr >= rem_addr && tgt_addr < (rem_addr+length) /* check length of msg */) { mdh = &ll->mdhs[proc]; break; } ll = ll->next; } // if remote mdh not found if(mdh == NULL) { printf("[cp %d]: warning - could not locate remote mdh for a direct put.\n",armci_me); printf("[cp %d]: searching for tgt_ptr=%p on node=%d / proc=%d\n",armci_me,tgt_ptr,node,proc); ll = remote_mdh_base_node; while(ll) { rem_addr = (uint64_t) ll->ptrs[proc]; length = ll->mdhs[proc].length; printf("[cp %d]: ll->ptrs[proc]=%p; ll->mdhs[node].length=%ld\n",armci_me,ll->ptrs[proc], length); ll = ll->next; } abort(); } // setup return mdh // on the remote side the node master is the only rank that registers the "shared" memmory. however, // shmat doesn't guarantee that all ranks on the node share the same starting virtual address. that // is why we have to calculate the offset from the starting address on the node master based on the // actual virutal addresses on the remote rank. memcpy(ret_mdh, mdh, sizeof(cos_mdesc_t)); // ret_mdh->addr += (tgt_addr-rem_addr); // if(ret_mdh->addr != tgt_addr) { // printf("%d: ret_mdh->addr=%ld; tgt_addr=%ld\n",armci_me,ret_mdh->addr, tgt_addr); // fflush(stdout); // } // if we are targeting a rank on the node for a direct operation, we need to translate the address // if not, then we can use the tgt_addr as passed in if(SAMECLUSNODE(proc) && armci_me != armci_master) { ret_mdh->addr += (tgt_addr-rem_addr); } else { ret_mdh->addr = tgt_addr; } } void armci_onesided_remove_from_remote_mdh_list(void *tgt_ptr) { cos_comm_t info; cos_mdesc_t *mdh = NULL; onesided_hnd_t cp_hnd; int node = armci_clus_id(armci_me); long total_bytes; remote_mdh_node_t *rm_ll, *ll = remote_mdh_base_node; NTK_MPI_GetComm(MPI_COMM_WORLD, &info); // get the onesided v2.0 api handle for the compute process cpGetOnesidedHandle(&cp_hnd); // find mdh while(ll) { if(tgt_ptr == ll->ptrs[armci_me]) { mdh = &ll->mdhs[armci_me]; break; } ll = ll->next; } // ensure we have a valid mdh if(mdh == NULL) abort(); // sum the total bytes allocated on the node MPI_Allreduce(&mdh->length, &total_bytes, 1, MPI_LONG, MPI_SUM, info.numa_comm); // node master only if(info.numa_me == 0 && total_bytes) { // deregister memory onesided_mem_deregister(cp_hnd, mdh); // cpMemDeregister(mdh); } // free mdhs free(ll->mdhs); ll->mdhs = NULL; // update linked-list rm_ll = ll; if(rm_ll == remote_mdh_base_node) remote_mdh_base_node = rm_ll->next; else { ll = remote_mdh_base_node; while(ll->next != rm_ll) ll = ll->next; assert(ll->next == rm_ll); ll->next = rm_ll->next; } free(rm_ll); } void ARMCI_INIT_HANDLE(void *hdl) { bzero(hdl, ARMCI_ONESIDED_SIZEOF_IREQ); } void armci_direct_on() { armci_onesided_direct_get_enabled = 1; armci_onesided_direct_put_enabled = 1; } void armci_direct_off() { armci_onesided_direct_get_enabled = 0; armci_onesided_direct_put_enabled = 0; } void armci_direct_on_() { armci_direct_on(); } void armci_direct_off_() { armci_direct_off(); } ga-5-4/armci/src-gemini/kr_malloc.h0000644000175000017500000000651112662210416015277 0ustar mbamba#ifndef KR_MALLOC_H /* K&R malloc */ #define KR_MALLOC_H #ifdef CRAY #define LOG_ALIGN 6 #elif defined(KSR) #define LOG_ALIGN 7 #else #define LOG_ALIGN 6 #endif #define ALIGNMENT (1 << LOG_ALIGN) #define KR_CTX_SHMEM 101 #define KR_CTX_LOCALMEM 102 union header{ struct { unsigned valid1; /* Token to check if is not overwritten */ union header *ptr; /* next block if on free list */ int shmid; /* next block's shared memory id */ long shmoffset; /* next block's shmem offset */ size_t shmsize; /* next block's shared memory segment size */ size_t size; /* size of this block*/ unsigned valid2; /* Another token acting as a guard */ } s; char align[ALIGNMENT]; /* Align to ALIGNMENT byte boundary */ }; typedef union header Header; typedef struct malloc_context { size_t usize; /* unit size in bytes */ size_t nalloc; /* No. of units of length ALIGNMENT */ size_t max_nalloc; /* Maximum no. of units that can get */ void * (*alloc_fptr)(); /* function pointer to memory alloc routine */ size_t total; /* Amount request from system in units */ long nchunk; /* No. of chunks of system memory */ long inuse; /* Amount in use in units */ long maxuse; /* Maximum value of inuse */ long nfrags; /* No. of fragments divided into */ long nmcalls; /* No. of calls to _armci_alloc() */ long nfcalls; /* No. of calls to memfree */ int ctx_type; /* context id. -1 represents ctx_local context. otherwise, it is ctx_shmem context. */ int shmid; /* first free block's (i.e.freep) shmem id */ long shmoffset; /* first free block's shmem offset */ size_t shmsize; /* first free block's shmem total size */ Header base; /* empty list to get started */ Header *freep; /* start of free list */ Header *usedp; /* start of used list */ } context_t; /* Memory required to store the shmem context in shared memory. This shmem context shuld be stored in shared memory and is stored in the first shared memory segment created (i.e.armci_krmalloc_init_ctxshmem) */ #define SHMEM_CTX_MEM (sizeof(context_t)+sizeof(void*)) #define SHMEM_CTX_BYTES ((SHMEM_CTX_MEM + sizeof(Header) - 1)>>LOG_ALIGN) + 1; extern void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx); /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *kr_malloc(size_t size, context_t *ctx, int new_allocation, void **new_base, size_t *new_size); /* Frees memory allocated by kr_malloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-memalloc'ed pointers */ extern void kr_free(char *ptr, context_t *ctx); /* Print to standard output the usage statistics ... a wrapper for kr_malloc_stats(); */ extern void kr_malloc_print_stats(context_t *ctx); extern void kr_malloc_verify(context_t *ctx); #endif ga-5-4/armci/src-gemini/armcip.h0000644000175000017500000003660012662210416014611 0ustar mbamba/* $Id: armcip.h,v 1.82.2.9 2007-08-29 17:32:31 manoj Exp $ */ /* armci private header file */ #ifndef _ARMCI_P_H #define _ARMCI_P_H #include #include "armci.h" #include "message.h" // #include "code_options.h" #if 0 #define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) \ printf("\n%d:%s:%d:%s:%s:%d",armci_me,__FILE__,__LINE__,__FUNCTION__,__ARMCI_ST,__ARMCI_NU);fflush(stdout) #define ARMCI_PR_SDBG(__ARMCI_ST,__ARMCI_NU) \ printf("\n(%d):%s:%d:%s:%s:%d",armci_me,__FILE__,__LINE__,__FUNCTION__,__ARMCI_ST,__ARMCI_NU);fflush(stdout) #else #define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) #define ARMCI_PR_SDBG(__ARMCI_ST,__ARMCI_NU) #endif #ifdef LIBONESIDED #include "armci-onesided.h" #endif #define DATA_SERVER #define SERVER_THREAD /*#define ARMCI_CHECK_STATE*/ #define ARMCI_STAMP 11214 #define ARMCI_TAIL 31121 #ifdef QUADRICS #include #ifdef QSNETLIBS_VERSION_CODE #ifndef DECOSF # define ELAN_ACC # define PENDING_OPER(x) ARMCI_ACC_INT #endif # if QSNETLIBS_VERSION_CODE > QSNETLIBS_VERSION(1,5,0) # define LIBELAN_ATOMICS # endif #endif extern void armci_elan_fence(int p); #endif /* we got problems on IA64/Linux64 with Elan if inlining is used */ #if defined(__GNUC__) && !defined(QUADRICS) # define INLINE inline #else # define INLINE #endif #ifdef WIN32 #include #define sleep(x) Sleep(100*(x)) #else #include #endif #if (defined(SYSV) || defined(WIN32)|| defined(MMAP)) && !defined(NO_SHM) && !defined(HITACHI) && !defined(CATAMOUNT) #define CLUSTER #ifdef SERVER_THREAD # define SERVER_NODE(c) (armci_clus_info[(c)].master); # define NODE_SERVER(c) (c); #else # define SOFFSET -1000000 # define SERVER_NODE(c) ((int)(SOFFSET -armci_clus_info[(c)].master)); # define NODE_SERVER(c) ((int)(SOFFSET - c)) #endif #endif /*\GPC call stuff \*/ typedef struct { int hndl, hlen, dlen; void *hdr, *data; }gpc_send_t; /*\ Stuff for non-blocking API \*/ #define NB_MULTI -1 /*more than one armci buffer(buffers.c) used for nbcall*/ #define NB_NONE -2 /*no armci buffer(buffers.c) used for nbcall*/ extern unsigned int _armci_get_next_tag(); #define GET_NEXT_NBTAG _armci_get_next_tag #define ARMCI_MAX_IMPLICIT 15 typedef struct{ int len; int last; void *exthdr; } ext_header_t; typedef struct{ int val; void *ptr; } armci_flag_t; #if defined(LAPI) || defined(PTHREADS) || defined(POSIX_THREADS) # include typedef pthread_t thread_id_t; # define THREAD_ID_SELF pthread_self #elif defined(WIN32) # include typedef DWORD thread_id_t; # define THREAD_ID_SELF GetCurrentThreadId #else typedef int thread_id_t; # define THREAD_ID_SELF() 1 #endif extern thread_id_t armci_usr_tid; #ifdef SERVER_THREAD # define SERVER_CONTEXT (armci_usr_tid != THREAD_ID_SELF()) #else # define SERVER_CONTEXT (armci_me<0) #endif #if defined(LAPI) || defined(CLUSTER) || defined(CRAY) \ || defined(CRAY_SHMEM) || defined(BGML) || defined(DCMF) # include "request.h" #endif /* ------------------------ ARMCI threads support ------------------------- */ #define ARMCI_THREADS_LIMIT 32 #include "utils.h" #if defined(THREAD_SAFE) typedef struct { int max; /* max # of threads per proc */ int avail; /* next available position */ thread_id_t *ids; /* list of threads' ids */ thread_lock_t lock; /* general case lock */ thread_lock_t buf_lock; /* lock for buffer access */ thread_lock_t net_lock; /* lock for network accees */ } armci_user_threads_t; extern armci_user_threads_t armci_user_threads; extern void armci_init_threads(); extern void armci_finalize_threads(); extern int armci_thread_idx(); extern INLINE int armci_register_thread(thread_id_t id); #define ARMCI_THREAD_IDX armci_thread_idx() /* needs to be optimized */ #else # define ARMCI_THREAD_IDX 0 #endif /* ------------------------------------------------------------------------ */ /* min amount of data in strided request to be sent in single TCP/IP message*/ #if defined(SOCKETS) || defined(MPI_SPAWN_ZEROCOPY) # define TCP_PAYLOAD 128 # define LONG_GET_THRESHOLD TCP_PAYLOAD # define LONG_GET_THRESHOLD_STRIDED LONG_GET_THRESHOLD # define LONG_PUT_THRESHOLD 128 #endif #ifdef WIN32 # define bzero(a,len){\ int _i;\ char *_c = (char*)(a);\ for(_i=0; _i< (int)(len); _i++)_c[_i]=(char)0;\ } # define bcopy(a,b,len) memcpy(b,a,len) #else # include #endif /*#define ACC_COPY*/ #if defined(CRAY_T3E) || defined(FUJITSU)\ || defined(HITACHI) || (defined(QUADRICS) && !defined(ELAN_ACC)) #define ACC_COPY #endif #ifndef FATR # ifdef WIN32 # define FATR __stdcall # else # define FATR # endif #endif #define MAX_PROC 8096 #define MAX_STRIDE_LEVEL ARMCI_MAX_STRIDE_LEVEL /* msg tag ARMCI uses in collective ops */ #define ARMCI_TAG 30000 #ifndef EXTRA_MSG_BUFLEN_DBL # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL) #else # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL +\ EXTRA_MSG_BUFLEN_DBL) #endif #if defined(HITACHI) # define BUFSIZE ((0x50000) * sizeof(double)) #else /* packing algorithm for double complex numbers requires even number */ # ifdef MSG_BUFLEN_DBL # define BUFSIZE_DBL (MSG_BUFLEN_DBL - RESERVED_BUFLEN) # else # define BUFSIZE_DBL 32768 # endif # define BUFSIZE (BUFSIZE_DBL * sizeof(double)) #endif /* note opcodes must be lower than ARMCI_ACC_OFF !!! */ #define PUT 1 #define GET 2 #define RMW 3 #define LOCK 4 #define UNLOCK 5 #define ACK 6 #define STATE 11214 /* must fit in two bits, see msginfo->format in request.h */ #define STRIDED 1 #define VECTOR 2 extern int armci_me, armci_nproc; extern int _armci_initialized; #ifdef HITACHI extern int sr8k_server_ready; extern double *armci_internal_buffer; #else extern double armci_internal_buffer[BUFSIZE_DBL]; #endif extern int armci_getbufsize(); extern void armci_shmem_init(); extern void armci_krmalloc_init_localmem(); extern void armci_die(char *msg, int code); extern void armci_die2(char *msg, int code1, int code2); extern void armci_write_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern void armci_read_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern int armci_op_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int lockit,armci_ihdl_t nb_handle); extern int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_acc_vector(int op, /* operation code */ void *scale, /* scale factor */ armci_giov_t darr[],/* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *hdr, int fit_level, int nb, int last,armci_ihdl_t nb_handle); extern int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,armci_ihdl_t nb_handle); extern void armci_lockmem(void *pstart, void* pend, int proc); extern void armci_unlockmem(int proc); extern int armci_acc_copy_strided(int optype, void* scale, int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels); extern void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf); extern void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf); extern void armci_init_fence(); #ifdef SOCKETS #ifdef SERVER_THREAD extern void armci_create_server_thread ( void* (* func)(void*) ); extern void armci_terminate_server_thread(); #else extern void armci_create_server_process ( void* (* func)(void*) ); extern void armci_wait_server_process(); extern void RestoreSigChldDfl(); #endif #endif #ifdef MPI_SPAWN extern void armci_create_server_MPIprocess (); #endif #define ARMCI_MAX(a,b) (((a)>(b))?(a):(b)) #define ARMCI_MIN(a,b) (((a)<(b))?(a):(b)) #define ARMCI_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define ARMCI_ACC(op) ((((int)(op))-ARMCI_ACC_INT)>=0) #ifdef CLUSTER extern char *_armci_fence_arr; # define FENCE_ARR(p_) (_armci_fence_arr[p_]) # define SAMECLUSNODE(p)\ ( ((p) <= armci_clus_last) && ((p) >= armci_clus_first) ) #elif defined(__crayx1) # define SAMECLUSNODE(p) 1 #elif defined(ARMCIX) # define SAMECLUSNODE(p) 0 #else # define SAMECLUSNODE(p) ((p)==armci_me) #endif #if defined(LAPI) || defined(ELAN_ACC) # define ORDER(op,proc)\ if( proc == armci_me || ( ARMCI_ACC(op) && ARMCI_ACC(PENDING_OPER(proc))) );\ else FENCE_NODE(proc) # define UPDATE_FENCE_INFO(proc_) #elif defined(CLUSTER) && !defined(QUADRICS) && !defined(HITACHI)\ && !defined(CRAY_SHMEM) # define ORDER(op_,proc_)\ if(!SAMECLUSNODE(proc_) && op_ != GET )FENCE_ARR(proc_)=1 # define UPDATE_FENCE_INFO(proc_) if(!SAMECLUSNODE(proc_))FENCE_ARR(proc_)=1 #else # if defined(GM) && defined(ACK_FENCE) # define ORDER(op,proc) # else # define ORDER(op,proc) if(proc != armci_me) FENCE_NODE(proc) # endif # define UPDATE_FENCE_INFO(proc_) #endif typedef struct { int ptr_array_len; int bytes; void **ptr_array; } armci_riov_t; /*\ consider up to HOSTNAME_LEN characters in host name * we can truncate names of the SP nodes since it is not used * to establish socket communication like on the networks of workstations * SP node names must be distinct within first HOSTNAME_LEN characters \*/ #if defined(LAPI) && defined(AIX) # define HOSTNAME_TRUNCATE # define HOSTNAME_LEN 12 #else # define HOSTNAME_LEN 64 #endif typedef struct { int master; int nslave; char hostname[HOSTNAME_LEN]; } armci_clus_t; extern armci_clus_t *armci_clus_info; extern int armci_nclus, armci_clus_me, armci_master; extern int armci_clus_first, armci_clus_last; extern int armci_clus_id(int p); extern void armci_init_clusinfo(); extern void armci_set_mem_offset(void *ptr); extern int _armci_terminating; extern void armci_acc_2D(int op, void* scale, int proc, void *src_ptr, void *dst_ptr, int bytes, int cols, int src_stride, int dst_stride, int lockit); extern void armci_lockmem_scatter(void *ptr_array[], int len, int bytes, int p); extern void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int p); extern unsigned long armci_max_region(); extern void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg); extern void armci_msg_gop_init(); extern void armci_util_spin(int n, void *notused); #if defined(SYSV) || defined(WIN32) extern void armci_shmem_init(); extern void armci_set_shmem_limit_per_core(unsigned long shmemlimit); extern void armci_set_shmem_limit_per_node(int nslaves); extern void armci_set_shmem_limit(unsigned long shmemlimit); #endif #define ALIGN_PTR_LONG(type, x) if( ((long)(x)) % sizeof(long)) { long _y = (long)(x);\ if(sizeof(long)==8){_y>>=3; _y<<=3; }\ else { _y>>=2; _y<<=2; }\ _y += sizeof(long); (x) = (type*)_y; } #define SIXTYFOUR 64 #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) #define ALIGNLONGADD(buf) ((((ssize_t)(buf))%sizeof(long))?(sizeof(long)-(((ssize_t)(buf))%sizeof(long))):0) #define SET 1 #define UNSET 0 extern int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_giov_descriptor(armci_giov_t darr[], int len, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle); extern void armci_agg_complete(armci_ihdl_t nb_handle, int condition); extern armci_ihdl_t armci_set_implicit_handle (int op, int proc); extern int armci_getnumcpus(void); extern long armci_util_long_getval(long* p); extern int armci_util_int_getval(int* p); extern void armci_region_register_shm(void *start, long size); extern void armci_region_register_loc(void *start, long size); extern void armci_region_clus_record(int node, void *start, long size); extern void armci_region_init(); extern int armci_region_clus_found(int node, void *start, int size); extern int armci_region_loc_found(void *start, int size); extern int armci_region_both_found(void *loc, void *rem, int size, int node); #ifdef REGIONS_REQUIRE_MEMHDL extern int get_armci_region_local_hndl(void *loc, int node, ARMCI_MEMHDL_T **loc_memhdl); #endif extern void armci_region_exchange(void *start, long size); extern void cpu_yield(); #ifdef ALLOW_PIN extern void armci_global_region_exchange(void *, long); #endif /* -------------------- ARMCI Groups ---------------------- */ /* data structure that caches a group's attribute */ #ifdef BGML #define PCLASS 3 #endif #ifdef MSG_COMMS_MPI typedef int ARMCI_Datatype; extern int ATTR_KEY; /* attribute key */ /* #define ARMCI_GROUP /\*Generic ARMCI implementation*\/ */ typedef struct { armci_clus_t *grp_clus_info; int grp_me; /* my group id */ int grp_nclus; /* number of cluster nodes */ int grp_clus_me; /* my cluster node id */ int mem_offset; /* memory offset */ #ifdef ARMCI_GROUP int nproc; /* #procs in this group*/ int *proc_list; /* Ids of procs in this group (w.r.t. MPI_COMM_WORLD)*/ #endif }armci_grp_attr_t; #include "mpi.h" /**dup of MPI_COMM_WORLD for internal MPI communication*/ extern MPI_Comm ARMCI_COMM_WORLD; #ifdef PORTALS #include "portals.h" #endif typedef MPI_Comm ARMCI_Comm; typedef struct { #ifndef ARMCI_GROUP MPI_Comm icomm; MPI_Group igroup; #endif armci_grp_attr_t grp_attr; }ARMCI_iGroup; armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *grp); extern void armci_group_init(); extern void armci_group_finalize(); extern ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group); #endif /* ifdef MSG_COMMS_MPI */ /* -------------------------------------------------------- */ /* ------------ ARMCI Chekcpointing/Recovery -------------- */ #ifdef DO_CKPT extern int armci_init_checkpoint(); extern void armci_create_ckptds(armci_ckpt_ds_t *ckptds, int count); extern int armci_icheckpoint_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds); extern int armci_icheckpoint(int rid); extern int armci_irecover(int rid,int iamreplacement); extern void armci_icheckpoint_finalize(int rid); #endif /* ifdef DO_CKPT */ /* -------------------------------------------------------- */ #endif ga-5-4/armci/src-gemini/portals_ds.c0000644000175000017500000004514112662210416015503 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif # include "armcip.h" # include # include # include # include static ptl_handle_ni_t ds_nih; static ptl_handle_eq_t ds_eqh; static ptl_handle_eq_t request_eqh; static ptl_handle_me_t matchall_meh; static int request_buffer_cur_block; static ptl_md_t request_buffer_md[PORTALS_NREQUEST_BUFFERS]; static ptl_handle_me_t request_buffer_meh[PORTALS_NREQUEST_BUFFERS]; int portals_ds_ready = 0; // void *portals_ds_working_buffer = NULL; void* portals_ds_thread(void* args) { portals_ds_init(); portals_ds(); portals_ds_finalize(); portalsSpinLockOnInt(&portals_cp_finished,1,1000); exit(0); return NULL; } int portals_ds_init() { int i,rc; size_t bufferSize; float warningSize; portals_ds_ready = 0; /* --------------------------------------------------------------------- *\ unhook set affinity ... data servers can roam \* --------------------------------------------------------------------- */ # ifdef PORTALS_AFFINITY int smp_np, smp_me; unsigned long mask; unsigned int len = sizeof(mask); unsigned long ncpus; int verbose = 0; MPI_Comm_size(portals_smp_comm,&smp_np); MPI_Comm_rank(portals_smp_comm,&smp_me); if((ncpus = sysconf(_SC_NPROCESSORS_ONLN)) < 0) { printf("%d [ds] sysconf(_SC_NPROCESSORS_ONLN) failed; err=%d\n", armci_me, ncpus); armci_die("sysconf in init_throttle",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error in ds_init",911); } if(armci_clus_me == 0 && /* verbose */ 0 ) { printf("%d [ds]: old affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } if(smp_np == ncpus) { mask = (1 << ncpus) - 1; /* let the data server roam over all cores */ } else { mask = 1 << (ncpus - 1); /* pin the ds to the last core on the node */ } if(sched_setaffinity(0, len, (cpu_set_t *) &mask) < 0) { perror("sched_setaffinity"); armci_die("setaffinity error in ds_init",911); } if(sched_getaffinity(0, len, &mask) < 0) { perror("sched_getaffinity"); armci_die("getaffinity error (#2) in ds_init",911); } if(armci_clus_me == 0 && verbose) { printf("%d [ds]: new affinity = 0x%x, ncpus = %d\n", armci_me, mask, ncpus); } # endif /* --------------------------------------------------------------------- *\ initialize the network interface \* --------------------------------------------------------------------- */ rc = portals_init(&ds_nih); if (rc != PTL_OK) { printf("failed to initialize portals on ds; err %d\n",rc); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ used for responding to data requests; this keeps the response events in a separate queue from the multitude of incoming data requests \* --------------------------------------------------------------------- */ rc = portals_create_eq(ds_nih, 200, &ds_eqh); /* --------------------------------------------------------------------- *\ used to process incoming data requests. at very large scale we will have to do some sort of messaging by node group to reduce the worst case scenario off all to one type operations. use the data server to message forward from node groups. \* --------------------------------------------------------------------- */ i = ARMCI_MAX(6*PORTALS_MAX_DESCRIPTORS*armci_nproc,200); i = ARMCI_MAX(6*armci_nproc,200); rc = portals_create_eq(ds_nih, i, &request_eqh); if (rc != PTL_OK) { printf("failed to create request event queue"); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ create ME list that matches all incoming data requests this will be a dead ME with no MD ... it will only be used as a place holder in which the "active" me/md will be placed in front of. \* --------------------------------------------------------------------- */ rc = portals_create_matchall_me(&matchall_meh); if (rc != PTL_OK) { printf("failed to create matchall ME\n"); Fatal_error(rc); } /* --------------------------------------------------------------------- *\ create buffer space for the ds buffer \* --------------------------------------------------------------------- */ assert(portalsMaxEagerMessageSize > sizeof(request_header_t)); bufferSize = portalsMaxEagerMessageSize; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE bufferSize *= armci_nclus; # else bufferSize *= armci_nproc; # endif bufferSize = bufferSize/(PORTALS_NREQUEST_BUFFERS-2); bufferSize = ARMCI_MAX(bufferSize,portalsMaxEagerMessageSize); // if(armci_me == 0) printf("%s: bufferSize=%ld\n",Portals_ID(),bufferSize); /* if(bufferSize*PORTALS_NREQUEST_BUFFERS > PORTALS_REQUEST_BUFFER_SIZE_WARNING) { warningSize = (float) bufferSize * PORTALS_NREQUEST_BUFFERS; warningSize /= ONE_MB; printf("[data server]: internal request buffer is %.2f MB\n",warningSize); } */ for(i=0; itag.user_ptr = (void *) &ev; if(request->operation == PUT || ARMCI_ACC(request->operation)) { buffersize = sizeof(request_header_t) + request->dscrlen + request->datalen; if(buffersize >= portalsMaxEagerMessageSize) { buffer = (char *) MessageRcvBuffer; portals_ds_get_from_cp(buffer,buffersize,ev.initiator,ev.hdr_data); request = (request_header_t *) buffer; request->tag.user_ptr = (void *) &ev; armci_data_server(buffer); // printf("%d: FINISHED RENDEZ-VOUS!\n",armci_me); break; } } if(request->operation == GET) { buffersize = sizeof(request_header_t) + request->dscrlen; if(buffersize >= portalsMaxEagerMessageSize) { buffer = (char *) MessageRcvBuffer; portals_ds_get_from_cp(buffer,buffersize,ev.initiator,ev.hdr_data); request = (request_header_t *) buffer; request->tag.user_ptr = (void *) &ev; armci_data_server(buffer); // printf("%d: FINISHED RENDEZ-VOUS!\n",armci_me); break; } } /* ------------------------------------------------------------- *\ process request \* ------------------------------------------------------------- */ armci_data_server(buffer); if(request->operation == QUIT) active = 0; break; case PTL_EVENT_UNLINK: // printf("captured an unlink event!!\n"); // portals_print_event_details(&ev); /* if((long) ev.md.user_ptr != request_buffer_cur_block) { printf("sanity check failed: user_ptr=%ld; cur_block=%ld\n",(long) ev.md.user_ptr, request_buffer_cur_block); armci_die("hummm ... unlink issue?",911); } */ portals_ds_requeue_md((long) ev.md.user_ptr); break; default: printf("unexpected event type %d in recvany\n"); Fatal_error(911); break; } } while(active); // flush out event q; the only thing that should remain is possibly 1 unlink event; while( (rc=PtlEQGet(request_eqh, &ev)) != PTL_EQ_EMPTY) { if(rc == PTL_OK) { if(ev.type != PTL_EVENT_UNLINK) { printf("%s: flushing request_eqh: event type=%d\n",Portals_ID(),ev.type); } else { portals_ds_requeue_md((long) ev.md.user_ptr); } } else if(rc == PTL_EQ_DROPPED) { printf("%s: eq dropped\n",Portals_ID()); } else { printf("%s: some error in PtlEQGet; err=%d\n",Portals_ID(),rc); Fatal_error(rc); } } return PTL_OK; } int portals_ds_finalize() { int i,rc; // unlink and request buffers for(i=0; itype, ev->offset, ev->mlength, ev->hdr_data, (long) ev->md.user_ptr); fflush(stdout); } int portals_ds_requeue_md(int i) { int rc; ptl_handle_me_t meh; ptl_handle_md_t mdh; ptl_process_id_t match_id; ptl_match_bits_t match_bits = MATCH_ALL_MBITS; ptl_match_bits_t ignore_bits = MATCH_ALL_IBITS; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = portals_me_insert(matchall_meh,match_id,match_bits,ignore_bits,&meh); if(rc != PTL_OK) { printf("me insert failed in ds requeue md; err %d\n",rc); Fatal_error(rc); } rc = portals_md_attach(meh,request_buffer_md[i],PTL_UNLINK,&mdh); if(rc != PTL_OK) { printf("md attach failed in ds requeue md; err %d\n",rc); Fatal_error(rc); } request_buffer_meh[i] = meh; request_buffer_cur_block++; if(request_buffer_cur_block == PORTALS_NREQUEST_BUFFERS) request_buffer_cur_block=0; return PTL_OK; } int portals_create_matchall_me(ptl_handle_me_t* me_handle) { int rc; ptl_process_id_t match_id; ptl_match_bits_t match_bits = MATCH_ALL_MBITS; ptl_match_bits_t ignore_bits = MATCH_ALL_IBITS; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = portals_me_attach(ds_nih,match_id,match_bits,ignore_bits,&matchall_meh); if (rc != PTL_OK) { printf("PtlMEAttachAny err %d in portals_create_melist\n",rc); return rc; } return rc; } void portals_ds_send_ack(ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE static int ack = 0; desc.buffer = &ack; desc.length = sizeof(int); # else desc.buffer = NULL; desc.length = 0; # endif desc.id = id; desc.mbits = mbits | DS_RESPONSE_ACK; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); } void portals_ds_send_put(void *buffer, ptl_size_t length, ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; desc.buffer = buffer; desc.length = length; desc.id = id; desc.mbits = mbits | DS_RESPONSE_PUT; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); } void portals_ds_get_from_cp(void *buffer, ptl_size_t length, ptl_process_id_t id, ptl_match_bits_t mbits) { portals_desc_t desc; desc.buffer = buffer; desc.length = length; desc.id = id; desc.mbits = mbits | DS_RESPONSE_GET; desc.hdr = mbits; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_get(&desc); portals_wait(&desc); } #ifdef DDI static void ds_handler(DDI_Patch *request, ptl_process_id_t from) { int i,j,nr,nc; long array[10],*a; size_t size; char *data_ptr; portals_desc_t desc; ptl_event_t *ev = (ptl_event_t *) request->user_ptr; switch(request->oper) { case DDI_GET: // printf("%s received DDI_GET request of size %d\n",Portals_ID(),request->size); nr = request->ihi - request->ilo + 1; nc = request->jhi - request->jlo + 1; if(nr < 0 || nc < 0 || nr > 10 || nc > 1) { printf("test get dimension problem\n"); abort(); } if(nr*sizeof(long) != request->size) { printf("test get request size does not match\n"); abort(); } for(i=0,j=317; iinitiator; desc.mbits = ev->hdr_data | DS_RESPONSE_PUT; desc.hdr = ev->hdr_data; desc.state = 0; desc.eqh = ds_eqh; desc.nih = ds_nih; portals_put(&desc); portals_wait(&desc); break; case DDI_PUT: nr = request->ihi - request->ilo + 1; nc = request->jhi - request->jlo + 1; data_ptr = NULL; if(ev->mlength > sizeof(DDI_Patch)) { printf("recv'ed eager put - size %d\n",ev->mlength-sizeof(DDI_Patch)); data_ptr = (char *) request; data_ptr += sizeof(DDI_Patch); } if(request->size != ev->mlength-sizeof(DDI_Patch)) { printf("eager msg buffer length does not match request size %d\n",request->size); abort(); } a = (long *) data_ptr; for(i=0; iinitiator,ev->hdr_data); break; case DDI_QUIT: // printf("%s received DDI_QUIT request\n",Portals_ID()); portals_ds_send_ack(ev->initiator,ev->hdr_data); /* desc.buffer = NULL; desc.length = 0; desc.id = ev->initiator; desc.mbits = ev->hdr_data | DS_RESPONSE_ACK; desc.hdr = ev->hdr_data; desc.state = 0; portals_put(&desc); portals_wait(&desc); */ break; case DDI_MEMORY: DDI_Memory_server(request->size); portals_ds_send_ack(ev->initiator,ev->hdr_data); break; default: printf("%s unknown operation in request=%d\n",Portals_ID(),request->oper); abort(); break; } return; } #endif ga-5-4/armci/src-gemini/clusterinfo.c0000644000175000017500000003435412662210416015672 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: clusterinfo.c,v 1.36.2.3 2007-06-13 00:46:13 vinod Exp $ */ /****************************************************************************** * file: cluster.c * purpose: Determine cluster info i.e., number of machines and processes * running on each of them. * *******************************************************************************/ #include #include #include #ifdef unix #include #endif #include "message.h" #include "armcip.h" #ifdef WIN32 /* this is where gethostbyname is declared */ # include #endif /* NO_SHMEM enables to simulate cluster environment on a single workstation. * Must define NO_SHMMAX_SEARCH in shmem.c to prevent depleting shared memory * due to a gready shmem request by the master process on cluster node 0. */ #if defined(DECOSF) && defined(QUADRICS) # if !defined(REGION_ALLOC) # define NO_SHMEM extern int armci_enable_alpha_hack(); # endif #else # define armci_enable_alpha_hack() 1 #endif #define DEBUG 0 #define MAX_HOSTNAME 80 #define CHECK_NODE_NAMES /* print info on how many cluster nodes detected */ #ifdef CLUSTER # define PRINT_CLUSTER_INFO 1 #else # define PRINT_CLUSTER_INFO 0 #endif #if defined(GM) static char *network_protocol="Myrinet GM"; #elif defined(VIA) static char *network_protocol="VIA"; #elif defined(MELLANOX) static char *network_protocol="Mellanox Verbs API"; #elif defined(OPENIB) static char *network_protocol="OpenIB Verbs API"; #elif defined(DOELAN4) static char *network_protocol="Quadrics ELAN-4"; #elif defined(QUADRICS) static char *network_protocol="Quadrics ELAN-3"; #elif defined(PM) static char *network_protocol="Score PM"; #elif defined(PORTALS) static char *network_protocol="PORTALS"; #elif defined(MPI_SPAWN) static char *network_protocol="MPI-SPAWN"; #elif defined(LIBONESIDED) static char *network_protocol="Cray Onesided"; #else static char *network_protocol="TCP/IP Sockets"; #endif /*** stores cluster configuration ***/ armci_clus_t *armci_clus_info; #ifdef HITACHI #include # define GETHOSTNAME sr_gethostname ndes_t _armci_group; static int sr_gethostname(char *name, int len) { int no; pid_t ppid; if(hmpp_nself (&_armci_group,&no,&ppid,0,NULL) <0) return -1; if(len<6)armci_die("len too small",len); if(no>1024)armci_die("expected node id <1024",no); sprintf(name,"n%d",no); return 0; } #elif defined(SGIALTIX) # define GETHOSTNAME altix_gethostname static int altix_gethostname(char *name, int len) { sprintf(name,"altix"); return 0; } #elif defined(XT3) && !defined(PORTALS) #define GETHOSTNAME cnos_gethostname static int cnos_gethostname(char *name, int len) { sprintf(name,"%d",cnos_get_rank()); } #else # define GETHOSTNAME gethostname #endif static char* merge_names(char *name) { int jump = 1, rem, to, from; int lenmes, lenbuf, curlen, totbuflen= armci_nproc*HOSTNAME_LEN; int len = strlen(name); char *work = malloc(totbuflen); if(!work)armci_die("armci: merge_names: malloc failed: ",totbuflen); strcpy(work, name); curlen = len+1; /* prefix tree merges names in the order of process numbering in log(P)time * result = name_1//name_2//...//name_P-1 */ do { jump *= 2; rem = armci_me%jump; if(rem){ to = armci_me - rem; armci_msg_snd(ARMCI_TAG, work, curlen, to); break; }else{ from = armci_me + jump/2; if(from < armci_nproc){ lenbuf = totbuflen - curlen; armci_msg_rcv(ARMCI_TAG, work+curlen, lenbuf, &lenmes, from); curlen += lenmes; } } }while (jump < armci_nproc); return(work); } static void process_hostlist(char *names) { #ifdef CLUSTER int i, cluster=0; char *s,*master; int len, root=0; /******** inspect list of machine names to determine locality ********/ if (armci_me==0){ /* first find out how many cluster nodes we got */ armci_nclus =1; s=master=names; for(i=1; i < armci_nproc; i++){ s += strlen(s)+1; if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_nclus++; /*fprintf(stderr,"new name %s len =%d\n",master, strlen(master));*/ } } /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); /* fill the data structure -- go through the list again */ s=names; master="*-"; /* impossible hostname */ cluster =0; for(i=0; i < armci_nproc; i++){ if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_clus_info[cluster].nslave=1; armci_clus_info[cluster].master=i; strcpy(armci_clus_info[cluster].hostname, master); #ifdef CHECK_NODE_NAMES /* need consecutive task id allocated on the same node * the current test only compares hostnames against first cluster */ if(cluster) if(!strcmp(master,armci_clus_info[0].hostname)){ /* we have seen that hostname before */ fprintf(stderr, "\nIt appears that tasks allocated on the same"); fprintf(stderr, " host machine do not have\n"); fprintf(stderr, "consecutive message-passing IDs/numbers. "); fprintf(stderr,"This is not acceptable \nto the ARMCI library "); fprintf(stderr,"as it prevents SMP optimizations and would\n"); fprintf(stderr,"lead to poor resource utilization.\n\n"); fprintf(stderr,"Please contact your System Administrator "); fprintf(stderr,"or, if you can, modify the "); # if defined(MSG_COMMS_MPI) fprintf(stderr,"MPI"); # elif defined(TCGMSG) fprintf(stderr,"TCGMSG"); # elif defined(PVM) fprintf(stderr,"PVM"); # endif fprintf(stderr,"\nmessage-passing job startup configuration.\n\n"); #ifdef HITACHI fprintf(stderr,"On Hitachi it can be done by setting environment variable MPIR_RANK_NO_ROUND, for example\n setenv MPIR_RANK_NO_ROUND yes\n\n"); #endif sleep(1); armci_die("Cannot run: improper task to host mapping!",0); } #endif cluster++; }else{ /* the process is still on the same host */ armci_clus_info[cluster-1].nslave++; } s += strlen(s)+1; } if(armci_nclus != cluster) armci_die("inconsistency processing clusterinfo",armci_nclus); } /******** process 0 got all data ********/ /* now broadcast locality info struct to all processes * two steps are needed because of the unknown length of hostname list */ len = sizeof(int); armci_msg_brdcst(&armci_nclus, len, root); if(armci_me){ /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*armci_nclus; armci_msg_brdcst(armci_clus_info, len, root); /******** all processes 0 got all data ********/ /* now determine current cluster node id by comparing me to master */ armci_clus_me = armci_nclus-1; for(i =0; i< armci_nclus-1; i++) if(armci_me < armci_clus_info[i+1].master){ armci_clus_me=i; break; } #else armci_clus_me=0; armci_nclus=1; armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); strcpy(armci_clus_info[0].hostname, names); armci_clus_info[0].master=0; armci_clus_info[0].nslave=armci_nproc; #endif armci_clus_first = armci_clus_info[armci_clus_me].master; armci_clus_last = armci_clus_first +armci_clus_info[armci_clus_me].nslave-1; } /*\ Substring Replacement: replace needle with nail in a haystack \*/ static char *substr_replace(char *haystack, char *needle, char *nail) { char *tmp, *pos, *first; size_t len=strlen(needle), nlen=strlen(nail),bytes; size_t left; pos = strstr(haystack,needle); if (pos ==NULL) return NULL; first= tmp = calloc(strlen(haystack)+nlen-len+1+1,1); if(first==NULL) return(NULL); bytes = pos - haystack; while(bytes){ *tmp = *haystack; tmp++; haystack++; bytes--;} while(nlen) { *tmp = *nail; tmp++; nail++; nlen--;} haystack += len; left = strlen(haystack); while(left>0){*tmp = *haystack; tmp++; haystack++; left --;} *tmp='\0'; return(first); } /*\ ARMCI_HOSTNAME_REPLACE contains "needle/nail" string to derive new hostname \*/ static char *new_hostname(char *host) { char *tmp, *needle, *nail; if((tmp =getenv("ARMCI_HOSTNAME_REPLACE"))){ needle = strdup(tmp); if(needle== NULL) return NULL; nail = strchr(needle,'/'); if(nail == NULL) return NULL; *nail = '\0'; nail++; if(nail == (needle+1)){ char* tmp1 = calloc(strlen(host)+strlen(nail)+1,1); if(tmp1 == NULL) return NULL; strcpy(tmp1,host); strcat(tmp1,nail); return tmp1; } return substr_replace(host,needle,nail); } else return NULL; } static void print_clus_info() { int i; if(PRINT_CLUSTER_INFO && armci_nclus >1 && armci_me ==0){ #if defined(DATA_SERVER) || defined(SERVER_THREAD) printf("ARMCI configured for %d cluster nodes. Network protocol is '%s'.\n", armci_nclus, network_protocol); #else printf("ARMCI configured for %d cluster nodes\n", armci_nclus); #endif fflush(stdout); } if(armci_me==0 && DEBUG) for(i=0;i= MAX_HOSTNAME) armci_die("armci: hostname too long",strlen(tmp)); strcpy(name,tmp); printf("%d using %s hostname\n",armci_me, name); fflush(stdout); } len = strlen(name); /*a simple way to run as many servers as compute processes*/ enval = getenv("ARMCI_NSERV_EQ_NPROC"); if(enval != NULL){ sprintf(name+len,"n%d",getpid()); len = strlen(name); printf("\n%s\n",name); } #ifdef HOSTNAME_TRUNCATE { /* in some cases (e.g.,SP) when name is used to determine * cluster structure but not to establish communication * we can truncate hostnames to save memory */ int i; limit = HOSTNAME_LEN-1; for(i=0; i",i+1); } if(len>limit)name[limit]='\0'; len =limit; } #else if(len >= HOSTNAME_LEN-1) armci_die("armci: gethostname overrun name string length",len); #endif #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { name[len]='0'+armci_me; name[len+1]='\0'; len++; } #endif if(DEBUG) fprintf(stderr,"%d: %s len=%d\n",armci_me, name,(int)strlen(name)); #ifdef CLUSTER merged = merge_names(name); /* create hostname list */ process_hostlist(merged); /* compute cluster info */ free(merged); #else process_hostlist(name); /* compute cluster info */ #endif #ifndef NO_SHMEM armci_set_shmem_limit_per_node(armci_clus_info[0].nslave); #endif armci_master = armci_clus_info[armci_clus_me].master; #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { int i; for(i=0;i= armci_nproc)armci_die("armci_clus_id: out of range",p); if(p < armci_clus_first){ from = 0; to = armci_clus_me;} else {from = armci_clus_me; to = armci_nclus;} found = to-1; for(c = from; c< to-1; c++) if(p < armci_clus_info[c+1].master){ found=c; break; } return (found); } int armci_smp_master(int i) { return(armci_clus_info[i].master); } /*\ return number of processes in the domain represented by id; id<0 means my node \*/ int armci_domain_nprocs(armci_domain_t domain, int id) { if(id>= armci_nclus) armci_die2("armci domain error",id,armci_nclus); if(id<0) id = armci_clus_me; return armci_clus_info[id].nslave; } /*\ return number of nodes in diven domain \*/ int armci_domain_count(armci_domain_t domain) { return armci_nclus; } /*\ return domain ID of the specified process \*/ int armci_domain_id(armci_domain_t domain, int glob_proc_id) { int id = glob_proc_id; if(id<0 || id>= armci_nproc) armci_die2("armci domain error",id,armci_nproc); return armci_clus_id(glob_proc_id); } /*\ return global ID of a process loc_proc_id in domain identified by id * armci_domain_nproc(id)< loc_proc_id >=0 \*/ int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id) { if(id<0 || id>= armci_nclus) armci_die2("armci domain error",id,armci_nclus); if(loc_proc_id<0 || loc_proc_id>= armci_clus_info[id].nslave) armci_die2("armci domain proc error",loc_proc_id,armci_clus_info[id].nslave); return (armci_clus_info[id].master + loc_proc_id); } /*\ return ID of domain that the calling process belongs to \*/ int armci_domain_my_id(armci_domain_t domain) { return(armci_clus_me); } int armci_domain_same_id (armci_domain_t domain, int proc) { int rc = SAMECLUSNODE(proc); return(rc); } ga-5-4/armci/src-gemini/armci.c0000644000175000017500000006046012662210416014425 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: armci.c,v 1.114.2.17 2007-08-30 22:58:18 manoj Exp $ */ /* DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #define EXTERN /*#define PRINT_BT*/ #define _GNU_SOURCE #include #include #include #if defined(CRAY) && !defined(__crayx1) # include # include # include #endif #ifdef LAPI # include "lapidefs.h" #endif #include #include "armcip.h" #include "copy.h" #include "memlock.h" #include "armci_shmem.h" #include "signaltrap.h" #ifdef ARMCIX #include "x/armcix.h" #endif #ifdef BGML #include "bgml.h" #include #include "bgmldefs.h" extern void armci_msg_barrier(void); #endif #ifdef CRAY_SHMEM # ifdef CRAY_XT # include # else # include # endif #endif #include /* global variables */ int armci_me, armci_Sme, armci_nproc; int armci_clus_me, armci_nclus, armci_master; int armci_clus_first, armci_clus_last; int *_armci_argc=NULL; char ***_armci_argv=NULL; int _armci_initialized_args=0; int _armci_initialized=0; int _armci_terminating =0; thread_id_t armci_usr_tid; armci_ireq_t armci_inb_handle[ARMCI_MAX_IMPLICIT];/*implicit non-blocking handle*/ #ifndef HITACHI double armci_internal_buffer[BUFSIZE_DBL]; #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) || defined(CATAMOUNT) || defined(BGML) # include "locks.h" lockset_t lockid; #endif int* armci_prot_switch_fence=NULL; int armci_prot_switch_preproc = -1; int armci_prot_switch_preop = -1; #ifdef BGML /* void armci_allocate_locks(); */ void armci_init_memlock(); #endif #ifdef LIBELAN_ATOMICS ELAN_ATOMIC *a; #warning "Enabling new atomics" #endif typedef struct{ int sent; int received; int waited; }armci_notify_t; armci_notify_t **_armci_notify_arr; void ARMCI_Cleanup() { #if defined(DATA_SERVER) #if defined(LIBONESIDED) dsTurnOff(); #else if(armci_nclus >1){ armci_wait_for_server(); } #endif #endif #if (defined(SYSV) || defined(WIN32) || defined(MMAP))&& !defined(HITACHI) Delete_All_Regions(); if(armci_nproc>1) #if !defined(LAPI) DeleteLocks(lockid); #endif #ifndef WIN32 ARMCI_RestoreSignals(); #endif #endif armci_transport_cleanup(); } int armci_getbufsize() { return(BUFSIZE); } void armci_notify_init() { int rc,bytes=sizeof(armci_notify_t)*armci_nproc; #ifdef DOELAN4 armci_elan_notify_init(); return; #endif _armci_notify_arr= (armci_notify_t**)malloc(armci_nproc*sizeof(armci_notify_t*)); if(!_armci_notify_arr)armci_die("armci_notify_ini:malloc failed",armci_nproc); if((rc=PARMCI_Malloc((void **)_armci_notify_arr, bytes))) armci_die(" armci_notify_init: armci_malloc failed",bytes); bzero(_armci_notify_arr[armci_me], bytes); } static void armci_perror_msg() { char perr_str[80]; if(!errno)return; sprintf(perr_str,"Last System Error Message from Task %d:",armci_me); perror(perr_str); } static void armci_abort(int code) { abort(); #if !defined(BGML) armci_perror_msg(); #endif ARMCI_Cleanup(); /* data server process cannot use message-passing library to abort * it simply exits, parent will get SIGCHLD and abort the program */ #if defined(DATA_SERVER) if(armci_me<0)_exit(1); else #endif armci_msg_abort(code); } void armci_die(char *msg, int code) { void *bt[100]; if(_armci_terminating)return; else _armci_terminating=1; if(SERVER_CONTEXT){ fprintf(stdout,"%d(s):%s: %d\n",armci_me, msg, code); fflush(stdout); // fprintf(stderr,"%d(s):%s: %d\n",armci_me, msg, code); }else{ fprintf(stdout,"%d:%s: %d\n",armci_me, msg, code); fflush(stdout); //fprintf(stderr,"%d:%s: %d\n",armci_me, msg, code); } #ifdef PRINT_BT backtrace_symbols_fd(bt, backtrace(bt, 100), 2); #endif armci_abort(code); } void armci_die2(char *msg, int code1, int code2) { void *bt[100]; if(_armci_terminating)return; else _armci_terminating=1; if(SERVER_CONTEXT){ fprintf(stdout,"%d(s):%s: (%d,%d)\n",armci_me,msg,code1,code2); fflush(stdout); fprintf(stderr,"%d(s):%s: (%d,%d)\n",armci_me,msg,code1,code2); }else{ fprintf(stdout,"%d:%s: (%d,%d)\n",armci_me,msg,code1,code2); fflush(stdout); fprintf(stderr,"%d:%s: (%d,%d)\n",armci_me,msg,code1,code2); } #ifdef PRINT_BT backtrace_symbols_fd(bt, backtrace(bt, 100), 2); #endif armci_abort(code1); } void ARMCI_Error(char *msg, int code) { armci_die(msg,code); } void armci_allocate_locks() { /* note that if ELAN_ACC is defined the scope of locks is limited to SMP */ #if !defined(CRAY_SHMEM) && (defined(HITACHI) || defined(CATAMOUNT) || \ (defined(QUADRICS) && defined(_ELAN_LOCK_H) && !defined(ELAN_ACC))) armcill_allocate_locks(NUM_LOCKS); #elif (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) if(armci_nproc == 1)return; # if defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) CreateInitLocks(NUM_LOCKS, &lockid); # else if(armci_master==armci_me)CreateInitLocks(NUM_LOCKS, &lockid); armci_msg_clus_brdcst(&lockid, sizeof(lockid)); if(armci_master != armci_me)InitLocks(NUM_LOCKS, lockid); # endif #endif } void ARMCI_Set_shm_limit(unsigned long shmemlimit) { #if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) #define EXTRASHM 1024 /* extra shmem used internally in ARMCI */ unsigned long limit; limit = shmemlimit + EXTRASHM; armci_set_shmem_limit_per_core(limit); #endif } /*\ allocate and initialize memory locking data structure \*/ void armci_init_memlock() { int bytes = MAX_SLOTS*sizeof(memlock_t); int rc, msize_per_proc=bytes; #ifdef MEMLOCK_SHMEM_FLAG /* last proc on node allocates memlock flag in shmem */ if(armci_clus_last == armci_me) bytes += sizeof(int); #endif memlock_table_array = malloc(armci_nproc*sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); rc = PARMCI_Malloc(memlock_table_array, bytes); if(rc) armci_die("failed to allocate ARMCI memlock array",rc); armci_msg_barrier(); bzero(memlock_table_array[armci_me],bytes); #ifdef BGML bgml_init_locks ((void *) memlock_table_array[armci_me]); #elif ARMCIX ARMCIX_init_memlock ((memlock_t *) memlock_table_array[armci_me]); #endif #ifdef MEMLOCK_SHMEM_FLAG /* armci_use_memlock_table is a pointer to local memory variable=1 * we overwrite the pointer with address of shared memory variable * armci_use_memlock_table and initialize it >0 */ armci_use_memlock_table = (int*) (msize_per_proc + (char*) memlock_table_array[armci_clus_last]); /* printf("%d: last=%d bytes=%d ptr =(%d, %d)\n", armci_me,armci_clus_last,bytes,armci_use_memlock_table, memlock_table_array[armci_clus_last]); fflush(stdout); */ if(armci_clus_last == armci_me) *armci_use_memlock_table =1+armci_me; #endif *armci_use_memlock_table = 0; armci_msg_barrier(); } #if defined(SYSV) || defined(WIN32) static void armci_check_shmmax() { long mylimit, limit; mylimit = limit = (long) armci_max_region(); armci_msg_bcast_scope(SCOPE_MASTERS, &limit, sizeof(long), 0); if(mylimit != limit){ printf("%d:Shared mem limit in ARMCI is %ld bytes on node %s vs %ld on %s\n", armci_me,mylimit<<10,armci_clus_info[armci_clus_me].hostname, limit<<10, armci_clus_info[0].hostname); fflush(stdout); sleep(1); armci_die("All nodes must have the same SHMMAX limit if NO_SHM is not defined",0); } } #endif extern void armci_region_shm_malloc(void *ptr_arr[], size_t bytes); void ARMCI_NetInit() { /*armci_portals_net_init();*/ } int PARMCI_Init_args(int *argc, char ***argv) { armci_msg_init(argc,argv); _armci_argc = argc; _armci_argv = argv; _armci_initialized_args=1; PARMCI_Init(); } extern void *sbrk(intptr_t); extern void code_summary(); int PARMCI_Init() { caddr_t atbeginbrval = (caddr_t)sbrk(0); if(_armci_initialized>0) return 0; #ifdef NEW_MALLOC mallopt(M_MMAP_MAX, 0); mallopt(M_TRIM_THRESHOLD, -1); #endif armci_msg_init(NULL, NULL); armci_nproc = armci_msg_nproc(); armci_me = armci_msg_me(); armci_usr_tid = THREAD_ID_SELF(); /*remember the main user thread id */ armci_init_clusinfo(); armci_prot_switch_fence = malloc(sizeof(int*)*armci_nproc); assert(armci_prot_switch_fence !=NULL); # ifdef LIBONESIDED armci_onesided_init(); # endif #ifdef MSG_COMMS_MPI armci_group_init(); #endif #ifndef NEW_MALLOC armci_krmalloc_init_localmem(); #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) if(ARMCI_Uses_shm() ) { armci_shmem_init(); } #endif armci_allocate_locks(); armci_init_fence(); #if ARMCI_ENABLE_GPC_CALLS gpc_init_signals(); #endif armci_msg_barrier(); armci_init_memlock(); /* allocate data struct for locking memory areas */ armci_msg_barrier(); //if(armci_me == 0) code_summary(); armci_msg_barrier(); armci_msg_gop_init(); _armci_initialized++; return 0; } void PARMCI_Finalize() { if(!_armci_initialized)return; _armci_initialized--; if(_armci_initialized)return; _armci_terminating =1; armci_msg_barrier(); if(armci_me==armci_master) ARMCI_ParentRestoreSignals(); #ifdef PORTALS request_header_t msg; portals_ds_req_t req; ptl_process_id_t dsid = portals_id_map[armci_me]; msg.operation = QUIT; if(armci_me == armci_master) { portalsBlockingRemoteOperationToNode(&msg,sizeof(request_header_t),armci_clus_me); } armci_msg_barrier(); portals_cp_finalize(); #else ARMCI_Cleanup(); armci_msg_barrier(); armci_group_finalize(); free(armci_prot_switch_fence); #endif #ifdef MSG_COMMS_MPI MPI_Comm_free(&ARMCI_COMM_WORLD); /*JD: free at last*/ #endif } /* Indicates whether ARMCI_Init or ARMCI_Init_args has been called. */ int PARMCI_Initialized() { return (_armci_initialized > 0) ? 1 : 0; } #if !(defined(SYSV) || defined(WIN32)) void ARMCI_Set_shmem_limit(unsigned long shmemlimit) { /* not applicable here * aborting would make user's life harder */ } #endif void ARMCI_Copy(void *src, void *dst, int n) { armci_copy(src,dst,n); } extern void cpu_yield(); void armci_util_wait_int(volatile int *p, int val, int maxspin) { int count=0; extern void cpu_yield(); while(*p != val) if((++count)proc); if(direct) { return(success); } if(nb_handle) { if(nb_handle->onesided_direct) { for(i=0; icomm_desc[i].state) { onesided_wait(&nb_handle->comm_desc[i]); cpMemDeregister(&nb_handle->comm_desc[i].local_mdesc); } } __asm__ __volatile__ ("mfence" ::: "memory"); __asm__ __volatile__ ("sfence" ::: "memory"); ARMCI_INIT_HANDLE(nb_handle); return(success); } if(nb_handle->agg_flag) { armci_agg_complete(nb_handle, UNSET); return (success); } if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE) { ARMCI_NB_WAIT(nb_handle->cmpl_info); __asm__ __volatile__ ("mfence" ::: "memory"); __asm__ __volatile__ ("sfence" ::: "memory"); return(success); } # ifdef COMPLETE_HANDLE COMPLETE_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); # endif } __asm__ __volatile__ ("mfence" ::: "memory"); __asm__ __volatile__ ("sfence" ::: "memory"); return(success); } /** * implicit handle */ static char hdl_flag[ARMCI_MAX_IMPLICIT]; static int impcount=0; armci_ihdl_t armci_set_implicit_handle (int op, int proc) { int i=impcount%ARMCI_MAX_IMPLICIT; if(hdl_flag[i]=='1') PARMCI_Wait((armci_hdl_t*)&armci_inb_handle[i]); #ifdef BGML armci_inb_handle[i].count=0; #endif armci_inb_handle[i].tag = GET_NEXT_NBTAG(); armci_inb_handle[i].op = op; armci_inb_handle[i].proc = proc; armci_inb_handle[i].bufid = NB_NONE; armci_inb_handle[i].agg_flag = 0; hdl_flag[i]='1'; ++impcount; return &armci_inb_handle[i]; } /* wait for all non-blocking operations to finish */ int PARMCI_WaitAll (void) { #ifdef BGML BGML_WaitAll(); #elif ARMCIX ARMCIX_WaitAll (); #else int i; if(impcount) { for(i=0; iagg_flag = 1; ((armci_ihdl_t)(nb_handle))->proc = -1; } void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle) { ((armci_ihdl_t)(nb_handle))->agg_flag = 0; ((armci_ihdl_t)(nb_handle))->proc = -1; } int parmci_notify(int proc) { #ifdef DOELAN4 if(proc==armci_me){ return 0; } #endif #if defined(GM) || (defined(DOELAN4) && defined(ELAN_ACC)) { extern int armci_inotify_proc(int); return(armci_inotify_proc(proc)); } #else armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->sent++; # ifdef MEM_FENCE if(SAMECLUSNODE(proc)) MEM_FENCE; # endif PARMCI_Put(&pnotify->sent,&(_armci_notify_arr[proc]+armci_me)->received, sizeof(pnotify->sent),proc); return(pnotify->sent); #endif } /*\ blocks until received count becomes >= waited count * return received count and store waited count in *pval \*/ int parmci_notify_wait(int proc,int *pval) { int retval; #ifdef DOELAN4 if(proc==armci_me){ #ifdef MEM_FENCE MEM_FENCE; #endif return 0; } #endif #if defined(GM) || (defined(DOELAN4) && defined(ELAN_ACC)) { extern int armci_inotify_wait(int,int*); retval=armci_inotify_wait(proc,pval); } #else { long loop=0; armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->waited++; while( pnotify->waited > pnotify->received) { if(++loop == 1000) { loop=0;cpu_yield(); } armci_util_spin(loop, pnotify); } *pval = pnotify->waited; retval=pnotify->received; } #endif return retval; } long armci_util_long_getval(long* p) { return *p; } int armci_util_int_getval(int* p) { return *p; } int PARMCI_Test(armci_hdl_t *usr_hdl) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int success=0; #ifdef BGML success=(int)nb_handle->count; #else int direct=SAMECLUSNODE(nb_handle->proc); if(direct)return(success); if(nb_handle) { if(nb_handle->agg_flag) { armci_die("test for aggregate handle not yet implemented\n",0); } } if(nb_handle){ # ifdef ARMCI_NB_TEST if(nb_handle->tag==0){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } # ifdef LAPI if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } # endif # endif # ifdef TEST_HANDLE TEST_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); # endif } #endif return(success); } #ifdef DO_CKPT void ARMCI_Ckpt_create_ds(armci_ckpt_ds_t *ckptds, int count) { armci_create_ckptds(ckptds,count); } int ARMCI_Ckpt_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds) { int rid; rid = armci_icheckpoint_init(filename,grp,savestack,saveheap,ckptds); return(rid); } int ARMCI_Ckpt(int rid) { return(armci_icheckpoint(rid)); } void ARMCI_Ckpt_Recover(int rid, int iamreplacement) { armci_irecover(rid, iamreplacement); } void ARMCI_Ckpt_finalize(int rid) { armci_icheckpoint_finalize(rid); } #endif #if ARMCI_ENABLE_GPC_CALLS int armci_gpc(int hndl, int proc, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, armci_hdl_t* nbh) { armci_ihdl_t nb_handle = (armci_ihdl_t)nbh; armci_giov_t darr[2]; /* = {{&rhdr, &rhdr, 1, rhlen}, {&rdata, &rdata, 1, rdlen}};*/ gpc_send_t send; char *ptr; /* initialize giov */ darr[0].src_ptr_array = &rhdr; darr[0].dst_ptr_array = &rhdr; darr[0].ptr_array_len = 1; darr[0].bytes = rhlen; darr[1].src_ptr_array = &rdata; darr[1].dst_ptr_array = &rdata; darr[1].ptr_array_len = 1; darr[1].bytes = rdlen; /* if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ /* if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ if(hlen>0 && hdr==NULL) return FAIL3; if(rhlen>0 && rhdr==NULL) return FAIL3; if(dlen>0 && data==NULL) return FAIL3; if(rdlen>0 && rdata==NULL) return FAIL3; if(proc<0 || proc >= armci_nproc) return FAIL4; send.hndl = hndl; send.hlen = hlen; send.dlen = dlen; send.hdr = hdr; send.data = data; if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else { ORDER(GET,proc); /*ensure ordering */ nb_handle = NULL; } #if defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS) if(armci_rem_gpc(GET, darr, 2, &send, proc, 1, nb_handle)) #endif return FAIL2; return 0; } int armci_sameclusnode(int proc) { return SAMECLUSNODE(proc); } #endif void _armci_init_handle(armci_hdl_t *hdl) { ((double *)((hdl)->data))[0]=0; ((double *)((hdl)->data))[1]=0; } static inline int val_to_char(int v) { if (v >= 0 && v < 10) return '0' + v; else if (v >= 10 && v < 16) return ('a' - 10) + v; else return -1; } static const char *nexttoken(const char *q, int sep) { if (q) q = strchr(q, sep); if (q) q++; return q; } #ifdef PORTALS_UNRESOLVED int cstr_to_cpuset(cpu_set_t * mask, const char *str) { const char *p, *q; q = str; CPU_ZERO(mask); while (p = q, q = nexttoken(q, ','), p) { unsigned int a; /* beginning of range */ unsigned int b; /* end of range */ unsigned int s; /* stride */ const char *c1, *c2; if (sscanf(p, "%u", &a) < 1) return 1; b = a; s = 1; c1 = nexttoken(p, '-'); c2 = nexttoken(p, ','); if (c1 != NULL && (c2 == NULL || c1 < c2)) { if (sscanf(c1, "%u", &b) < 1) return 1; c1 = nexttoken(c1, ':'); if (c1 != NULL && (c2 == NULL || c1 < c2)) if (sscanf(c1, "%u", &s) < 1) { return 1; } } if (!(a <= b)) return 1; while (a <= b) { CPU_SET(a, mask); a += s; } } return 0; } char *cpuset_to_cstr(cpu_set_t * mask, char *str) { int i; char *ptr = str; int entry_made = 0; for (i = 0; i < CPU_SETSIZE; i++) { if (CPU_ISSET(i, mask)) { int j; int run = 0; entry_made = 1; for (j = i + 1; j < CPU_SETSIZE; j++) { if (CPU_ISSET(j, mask)) run++; else break; } if (!run) sprintf(ptr, "%d,", i); else if (run == 1) { sprintf(ptr, "%d,%d,", i, i + 1); i++; } else { sprintf(ptr, "%d-%d,", i, i + run); i += run; } while (*ptr != 0) ptr++; } } ptr -= entry_made; *ptr = 0; return str; } char *cpuset_to_str(cpu_set_t * mask, char *str) { int base; char *ptr = str; char *ret = 0; for (base = CPU_SETSIZE - 4; base >= 0; base -= 4) { char val = 0; if (CPU_ISSET(base, mask)) val |= 1; if (CPU_ISSET(base + 1, mask)) val |= 2; if (CPU_ISSET(base + 2, mask)) val |= 4; if (CPU_ISSET(base + 3, mask)) val |= 8; if (!ret && val) ret = ptr; *ptr++ = val_to_char(val); } *ptr = 0; return ret ? ret : ptr - 1; } #endif long armci_cksm_copy(char *src, char *dst, size_t bytes) { long sum = 0; size_t count=bytes; while( count > 1 ) { sum += * (unsigned int *) src++; count -= 4; } if( count > 0 ){ printf("\nblistering barnicles"); sum += * (unsigned char *) src; } while (sum>>32) sum = (sum & 0xffffffff) + (sum >> 32); return(~sum); } void code_summary() { printf("\nActive #defines that could affect ARMCI"); printf("\n----------------------------------------"); # ifdef ORNL_USE_DS_FOR_REMOTE_GETS printf("\n#define ORNL_USE_DS_FOR_REMOTE_GETS"); # endif # ifdef PORTALS_USE_RENDEZ_VOUS printf("\n#define PORTALS_USE_RENDEZ_VOUS"); # endif # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE printf("\n#define PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE"); # endif # ifdef PORTALS_AFFINITY printf("\n#define PORTALS_AFFINITY"); # endif /* # ifdef CRAY_USE_MDMD_COPY printf("\n#define CRAY_USE_MDMD_COPY"); # endif */ printf("\n----------------------------------------"); printf("\nInfo @ armci/src/code_options.h"); printf("\n----------------------------------------\n"); # ifdef PORTALS portals_print_summary(); # endif } ga-5-4/armci/src-gemini/portals.h0000644000175000017500000001734712662210416015031 0ustar mbamba/* ---------------------------------------------------------------------------------------------- *\ portals.h header \* ---------------------------------------------------------------------------------------------- */ # ifndef _PORTALS_H_ # define _PORTALS_H_ # define PORTALS_INDEX 1 # define ONE_KB 1024 # define ONE_MB 1048576 # define MAX_DS_MSG_SIZE ONE_MB # define PORTALS_MAX_DESCRIPTORS (MAX_BUFS+MAX_SMALL_BUFS) # define PORTALS_MAX_BUFS MAX_BUFS # define PORTALS_MAX_SMALL_BUFS MAX_SMALL_BUFS # define PORTALS_BUF_SIZE MSG_BUFLEN /* defined in requesh.h */ /* define small buf length here - formerly request.h */ # ifdef PORTALS_USE_RENDEZ_VOUS # define PORTALS_SMALL_BUF_SIZE 1024 /* for use with nwchem only -- will not pass armci test.x */ # define PORTALS_MAX_EAGER_MESSAGE_SIZE PORTALS_SMALL_BUF_SIZE # else # define PORTALS_SMALL_BUF_SIZE 1024 # define PORTALS_MAX_EAGER_MESSAGE_SIZE PORTALS_BUF_SIZE # endif # define PORTALS_NREQUEST_BUFFERS 40 # define PORTALS_REQUEST_BUFFER_SIZE_WARNING (128*ONE_MB) # define PORTALS_READ_ACCESS 1 # define PORTALS_WRITE_ACCESS 1000 # define MATCH_ALL_MBITS 0x8000000000000000 /* should be set for all data requests */ # define MATCH_ALL_IBITS ~MATCH_ALL_MBITS /* used to mask out all other bits, but MATCH_ALL */ # define STATE_SEND_START 0x1 # define STATE_SEND_END 0x2 # define STATE_REPLY_START 0x4 # define STATE_REPLY_END 0x8 # define STATE_ACK 0x10 # define STATE_PUT_START 0x20 # define STATE_PUT_END 0x40 # define STATE_GET_START 0x80 # define STATE_GET_END 0x100 # define STATE_UNLINK 0x200 # define DS_RESPONSE_ACK 0x100000000000000 # define DS_RESPONSE_PUT 0x200000000000000 # define DS_RESPONSE_GET 0x400000000000000 # define PORTALS_ALLOW_NBGETS # define PORTALS_USE_ARMCI_CLIENT_BUFFERS # define PORTALS_PUT_USE_ACK_TURNED_OFF # define PORTALS_PUT_USE_START_TURNED_OFF # define PORTALS_GET_USE_START_TURNED_OFF /* ---------------------------------------------------------------------------------------------- *\ portals types \* ---------------------------------------------------------------------------------------------- */ typedef struct portals_desc_s { void* buffer; // used for the md ptl_size_t length; // used for the md ptl_process_id_t id; // on whom the operation is acting on ptl_match_bits_t mbits; // operations destination mbits ptl_hdr_data_t hdr; // used for puts/unique counter value ptl_handle_ni_t nih; // network interface handle ptl_handle_eq_t eqh; // event handler ptl_handle_me_t meh; // me handle (if necessary) ptl_handle_md_t mdh; // md handle (if necessary) int state; // track outstanding events remaining on the descriptor int done; // flag to test whether all work on the descriptor is finished int noperations; // the number of remote operations allowed on buffer // this is only used when preposting/pinning CP memory // for remote operations initiated by the data server } portals_desc_t; typedef struct portals_ds_req_s { portals_desc_t req_desc; portals_desc_t ack_desc; portals_desc_t data_desc; ptl_process_id_t dsid; size_t unique_msg_id; int active; int remote_node; } portals_ds_req_t; /* ---------------------------------------------------------------------------------------------- *\ portals global variables \* ---------------------------------------------------------------------------------------------- */ ptl_handle_ni_t cp_nih; ptl_handle_ni_t ds_nih; ptl_handle_eq_t cp_eqh; ptl_handle_eq_t ds_eqh; ptl_process_id_t *portals_id_map; ptl_process_id_t *portals_cloned_id_map; int portals_ds_ready; int portals_cp_finished; size_t portalsMaxEagerMessageSize; /* ---------------------------------------------------------------------------------------------- *\ portals prototypes \* ---------------------------------------------------------------------------------------------- */ int portals_init(ptl_handle_ni_t*); int portals_finalize(ptl_handle_ni_t); int portals_getid(ptl_handle_ni_t,ptl_process_id_t *); int portals_free_eq(ptl_handle_eq_t); int portals_create_eq(ptl_handle_ni_t, ptl_size_t, ptl_handle_eq_t*); int portals_create_matchall_me(ptl_handle_me_t*); int portals_me_attach(ptl_handle_ni_t,ptl_process_id_t,ptl_match_bits_t,ptl_match_bits_t,ptl_handle_me_t*); int portals_me_insert(ptl_handle_me_t,ptl_process_id_t,ptl_match_bits_t,ptl_match_bits_t,ptl_handle_me_t*); int portals_me_unlink(ptl_handle_me_t); int portals_md_attach(ptl_handle_me_t,ptl_md_t,ptl_unlink_t,ptl_handle_md_t*); int portals_md_bind(ptl_handle_ni_t,ptl_md_t,ptl_unlink_t,ptl_handle_md_t*); int portals_eqwait(ptl_handle_eq_t,ptl_event_t*); int portals_put(portals_desc_t*); int portals_get(portals_desc_t*); int portals_wait(portals_desc_t*); void* portalsCloneDataServer(void *); void portalsSpinLockOnInt(volatile int*, int, int); void portals_print_event_details(ptl_event_t *ev); void Fatal_error(int); const char *Portals_ID(); void bit_print(const char *,int); void hex_print(const char *,int); void portals_print_summary(); /* ---------------------------------------------------------------------------------------------- *\ portals data server prototypes \* ---------------------------------------------------------------------------------------------- */ void* portals_ds_thread(void* args); int portals_ds_init(void); int portals_ds(void); int portal_send_test_ack(int to,int val); int portals_ds_requeue_md(int); void portals_ds_get_from_cp(void*,ptl_size_t,ptl_process_id_t,ptl_match_bits_t); //void ds_handler(DDI_Patch*,ptl_process_id_t); /* ---------------------------------------------------------------------------------------------- *\ portals compute process prototypes \* ---------------------------------------------------------------------------------------------- */ int portals_cp_init(void); int portals_cp_getid(ptl_process_id_t *id); void portals_req_send(void *buffer, size_t size, portals_ds_req_t *req); void portals_req_nbsend(void *buffer, size_t size, portals_ds_req_t *req); void portals_req_wait(portals_ds_req_t *req); void portals_remote_get(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_put(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_acc(void *buffer, request_header_t *msginfo, int remote_node); void portals_remote_rmw(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbget(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbput(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portals_remote_nbacc(void *buffer, request_header_t *msginfo, int remote_node, portals_ds_req_t *req); void portalsRemoteOperation(void*,size_t,ptl_process_id_t,portals_ds_req_t*); void portalsRemoteOperationToRank(void*,size_t,int,portals_ds_req_t*); void portalsRemoteOperationToNode(void*,size_t,int,portals_ds_req_t*); void portalsBlockingRemoteOperationToNode(void*,size_t,int); static inline unsigned int cpuid_ebx(unsigned int op) { unsigned int eax, ebx; __asm__("cpuid" : "=a" (eax), "=b" (ebx) : "0" (op) : "cx", "dx" ); return ebx; } # endif ga-5-4/armci/src-gemini/build.env0000644000175000017500000000052212662210416014770 0ustar mbambasetenv NWCHEM_TOP `pwd` setenv USE_MPI y setenv LIBMPI " " setenv LARGE_FILES y setenv ARMCI_NETWORK LIBONESIDED setenv NWCHEM_TARGET LINUX64 setenv TARGET LINUX64 setenv USE_64TO32 y setenv HAS_BLAS yes setenv USE_SCALAPACK y setenv TARGET LINUX64 setenv BLASOPT " " setenv BLAS_OPT " " alias gmake "make FC=ftn _FC=pgf90 COPT='-O0 -g'" ga-5-4/armci/src-gemini/sockets.h0000644000175000017500000000321212662210416015002 0ustar mbamba#ifndef SOCKETS_H_ #define SOCKETS_H_ #include "armci.h" #ifndef WIN32 #define USE_SOCKET_VECTOR_API #endif #if defined(USE_SOCKET_VECTOR_API) # include #endif extern int tcp_sendrcv_bufsize; extern int armci_PollSocket(int sock); extern int armci_WaitSock(int *socklist, int num, int *ready); extern int armci_ReadFromSocket(int sock, void* buffer, int lenbuf); extern int armci_WriteToSocket (int sock, void* buffer, int lenbuf); #if defined(USE_SOCKET_VECTOR_API) extern int armci_RecvStridedFromSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_SendStridedToSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_RecvVectorFromSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_SendVectorToSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_ReadVFromSocket(int sock,struct iovec *iov, int iovlength, int totalsize); extern int armci_WriteVToSocket (int sock,struct iovec *iov, int iovlength, int totalsize); #endif extern void armci_ListenSockAll(int* socklist, int num); extern void armci_AcceptSockAll(int* socklist, int num); extern int armci_CreateSocketAndConnect(char *hostname, int port); extern void armci_ShutdownAll(int socklist[], int num); extern void armci_CreateSocketAndBind(int *sock, int *port); #define PACKET_SIZE tcp_sendrcv_bufsize #define TIMEOUT_ACCEPT 60 #define GET_SEND_BUFFER _armci_buf_get_clear_busy #define FREE_SEND_BUFFER _armci_buf_release #ifndef UIO_MAXIOV #define MAX_IOVEC 8 #else #define MAX_IOVEC (UIO_MAXIOV>100?100:UIO_MAXIOV) #endif #endif ga-5-4/armci/src-gemini/armci_shmem.h0000644000175000017500000000115012662210416015612 0ustar mbamba#ifndef _SHMEM_H_ #define _SHMEM_H_ extern void Set_Shmem_Limit(unsigned long shmemlimit); extern void Delete_All_Regions(); extern char* Create_Shared_Region(long idlist[], long size, long *offset); extern char* Attach_Shared_Region(long idlist[], long size, long offset); extern void Free_Shmem_Ptr(long id, long size, char* addr); extern long armci_shmem_reg_size(int i, long id); extern char* armci_shmem_reg_ptr(int i); #define POST_ALLOC_CHECK(temp,size) ; #define MAX_REGIONS 64 #if defined(WIN32) #define SHMIDLEN 3 #else #define SHMIDLEN (MAX_REGIONS + 2) #endif #define IDLOC (SHMIDLEN - 3) #endif ga-5-4/armci/src-gemini/shmalloc.h0000644000175000017500000000325712662210416015142 0ustar mbamba#ifndef SHMALLOC_H #define SHMALLOC_H /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *armci_shmalloc(size_t size); /* void shfree(char *pointer) Frees memory allocated by armci_shmalloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-shmalloc'ed pointers */ extern void shfree(); /* void shmalloc_print_stats(); Print to standard output the usage statistics ... a wrapper for shmalloc_stats(); */ extern void shmalloc_print_stats(); /* void shmalloc_stats(size_t *total, long *nchunk, size_t *inuse, size_t *maxuse, long *nfrags, long *nmcalls, long *nfcalls) Returns the statistics about memory usage. total = total amount of memory got from system in bytes nchunk = total no. of chunks of memory got from the system inuse = amount of memory application is using in bytes maxuse = maximum value of inuse to dat nfrags = no. of fragments that memory is split into nmcalls= no. of calls to shmalloc nfcalls= no. of calls to shfree */ extern void shmalloc_stats(); /* void shmalloc_debug(int code) Enable debuging code = 0 ... no debugging code != 0 ... entire heap is verified on every call */ extern void shmalloc_debug(); /* Verify the heap. */ extern void shmalloc_verify(); /* size ... minimum size in bytes that chunks of data should be obtained from the system in. The default is 131072. maxsize ... maximum amount of memory that should be obtained from the system. The default is 12,582,912. */ extern void shmalloc_request(size_t size, size_t maxsize); #endif ga-5-4/armci/src-gemini/message.h0000644000175000017500000000645012662210416014762 0ustar mbamba#ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define ARMCI_INT -99 #define ARMCI_LONG -101 #define ARMCI_LONG_LONG -102 #define ARMCI_FLOAT -306 #define ARMCI_DOUBLE -307 #define SCOPE_ALL 333 #define SCOPE_NODE 337 #define SCOPE_MASTERS 339 #define armci_msg_sel(x,n,op,type,contribute)\ armci_msg_sel_scope(SCOPE_ALL,(x),(n),(op),(type),(contribute)) #if 0 #define armci_msg_bcast(buffer, len, root)\ armci_msg_bcast_scope(SCOPE_ALL, (buffer), (len), (root)) #else extern void armci_msg_bcast(void *buffer, int len, int root); #endif extern void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute); extern void armci_msg_bcast_scope(int scope, void* buffer, int len, int root); extern void armci_msg_brdcst(void* buffer, int len, int root); extern void armci_msg_snd(int tag, void* buffer, int len, int to); extern void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from); extern int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen); extern void armci_msg_reduce(void *x, int n, char *op, int type); extern void armci_msg_reduce_scope(int scope, void *x, int n, char *op, int type); extern void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type); extern void armci_msg_igop(int *x, int n, char* op); extern void armci_msg_lgop(long *x, int n, char* op); extern void armci_msg_llgop(long long *x, int n, char* op); extern void armci_msg_fgop(float *x, int n, char* op); extern void armci_msg_dgop(double *x, int n, char* op); extern void armci_exchange_address(void *ptr_ar[], int n); extern void armci_msg_barrier(); extern void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right); extern int armci_msg_me(); extern int armci_msg_nproc(); extern void armci_msg_abort(int code); extern void armci_msg_init(int *argc, char ***argv); extern void armci_msg_finalize(); extern double armci_timer(); extern void armci_msg_clus_brdcst(void *buf, int len); extern void armci_msg_clus_igop(int *x, int n, char* op); extern void armci_msg_clus_fgop(float *x, int n, char* op); extern void armci_msg_clus_lgop(long *x, int n, char* op); extern void armci_msg_clus_llgop(long long *x, int n, char* op); extern void armci_msg_clus_dgop(double *x, int n, char* op); extern void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group); extern void armci_msg_group_igop(int *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_dgop(double *x, int n,char* op,ARMCI_Group *group); extern void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group); extern void armci_msg_group_barrier(ARMCI_Group *group); extern void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group); extern void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc,ARMCI_Group *mastergroup); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif ga-5-4/armci/src-gemini/shmalloc.c0000644000175000017500000000470212662210416015131 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmalloc.c,v 1.10 2002-06-20 23:34:17 vinod Exp $ */ #include #include #include "armcip.h" #include "message.h" #include "kr_malloc.h" static long *offset_arr; void armci_shmalloc_exchange_offsets(context_t *ctx_local) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); offset_arr = (long*) malloc(armci_nproc*sizeof(long)); if(!ptr_arr || !offset_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); /* get memory with same size on all procs */ ptr = kr_malloc(bytes, ctx_local); if(!ptr) armci_die("armci_shmalloc_get_offsets: kr_malloc failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); /* identify offets */ for (i=0; i #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SEM_H # include #endif #if !HAVE_UNION_SEMUN union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif /* how many semaphores are available ? */ #ifndef SEMMSL # ifdef AIX # define SEMMSL 8094 # else # define SEMMSL 16 # endif #endif /* on HPUX 10.2 SEMMSL is much bigger than realistically we can allocate */ #ifdef HPUX #undef SEMMSL #define SEMMSL 64 #endif extern struct sembuf sops; extern int semaphoreID; int semop(); #define ALL_SEMS -1 #define _P_code -1 #define _V_code 1 #define P_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _P_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } #define V_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _V_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } typedef int lockset_t; #endif ga-5-4/armci/src-gemini/pack.c0000644000175000017500000002711412662210416014247 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: pack.c,v 1.36.10.1 2006-12-14 13:24:37 manoj Exp $ */ #include "armcip.h" #include #if !defined(ACC_COPY) &&!defined(CRAY_YMP) &&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML) # define REMOTE_OP #endif #if defined(REMOTE_OP) # define OP_STRIDED armci_rem_strided #else # define OP_STRIDED(_a,_b,_c,_d,_e,_f,_g,_h,_i,_delete1,_j,_hdl)\ armci_op_strided(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_hdl) #endif /*\ determine if patch fits in the ARMCI buffer, and if not * at which stride level (patch dim) need to decompose it * *fit_level is the value of stride level to perform packing at * *nb means number of elements of count[*fit_level] that fit in buf \*/ static void armci_fit_buffer(int count[], int stride_levels, int* fit_level, int *nb, int bufsize) { int bytes=1, sbytes=1; int level; /* find out at which stride level BUFFER becomes too small */ for(level=0; level<= stride_levels; level++){ sbytes = bytes; /* store #bytes at current level to save div cost later */ bytes *= count[level]; if(bufsize < bytes) break; } /* buffer big enough for entire patch */ if(bufsize >= bytes){ *fit_level = stride_levels; *nb = count[stride_levels]; return; } /* buffer too small */ switch (level){ case 0: /* smaller than a single column */ *fit_level = 0; *nb = bufsize; break; case -1: /* one column fits */ *fit_level = 0; *nb = sbytes; break; default: /* it could keep nb instances of (level-1)-dimensional patch */ *fit_level = level; *nb = bufsize/sbytes; } } /*\ The function decomposes a multi-dimensional patch so that it fits in the * internal ARMCI buffer. * It works by recursively reducing patch dimension until some portion of the * subpatch fits in the buffer. * The recursive process is controlled by "fit_level" and "nb" arguments, * which have to be set to -1 at the top-level of the recursion tree. * * Argument last and variable looplast are used to indicate to sending/packing * routine that we are dealing with the last portion of the request. * Due to the recursive nature of packing code, the algorithm is following: * if last=1 then internal for loop passes 1 for the last chunk * else it passes 0 * \*/ int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int fit_level, int nb, int last,armci_ihdl_t nb_handle) { int rc=0, sn, bufsize=BUFSIZE,noswap=0; void *src, *dst; #ifdef REMOTE_OP int flag=0; #else int flag=1; #endif int b; static int call_count; #ifdef STRIDED_GET_BUFLEN if(op==GET) bufsize=STRIDED_GET_BUFLEN; # ifdef HITACHI else if(stride_levels || ARMCI_ACC(op)) bufsize=MSG_BUFLEN_SMALL-PAGE_SIZE; # endif #endif #if (defined(GM_) || defined(VIA_) || defined(VAPI_)) /*we cant assume that the entire available buffer will be used for data, fact that the header and descriptor also go in the same buffer should be considered while packing. */ bufsize-=(sizeof(request_header_t)+(MAX_STRIDE_LEVEL+4)*sizeof(int)+2*sizeof(void *)); # if defined(PIPE_BUFSIZE) && defined(MAX_PIPELINE_CHUNKS) bufsize-=8*MAX_PIPELINE_CHUNKS; # endif #endif #ifdef BALANCE_FACTOR /* Added the following for balancing buffers */ if(op==PUT){ int bytes=1, i; for(i=0; i<= stride_levels; i++) bytes *= count[i]; if(bytes > bufsize && bytes/bufsize < 3 && bytes%bufsize < BALANCE_BUFSIZE){ /* bytes div bufsize - 1 is to increase the balence factor for 3 buffer case */ bufsize = bytes/ (bytes/bufsize - 1 + BALANCE_FACTOR); noswap = 1; /*** yuck: if set to 1, error in buffers.c ***/ } bytes = bufsize%8; bufsize -= bytes; } #endif /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ armci_fit_buffer(count, stride_levels, &fit_level, &nb, bufsize); last = 1; } // printf("%s [cp]: pack_strided: flag=%d, bufsize=%ld; fit_level=%d; stride_level=%d; nb=%d\n",Portals_ID(),flag,(long) bufsize,fit_level,stride_levels,nb); if(fit_level == stride_levels){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int dst_stride, src_stride; if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ if(h) h->last = last?1:0; if(nb_handle && call_count ){ nb_handle->bufid=NB_MULTI; call_count++; } return(OP_STRIDED(op, scale, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels,h,flag,nb_handle)); } if(fit_level){ dst_stride = dst_stride_arr[fit_level -1]; src_stride = src_stride_arr[fit_level -1]; }else{ dst_stride = src_stride = 1; } if(op == GET || noswap == 1) b =nb; else{ b = chunk%nb; if(b==0)b=nb; } /* put smallest piece first */ for(sn = 0; sn < chunk; ){ src = (char*)src_ptr + src_stride* sn; dst = (char*)dst_ptr + dst_stride* sn; count[fit_level] = ARMCI_MIN(b, chunk-sn); /*modify count for this level*/ if(h) h->last = (last && ((sn+b)>=chunk))? 1: 0 ; if(nb_handle)call_count++; rc = OP_STRIDED( op, scale, proc, src, src_stride_arr, dst,dst_stride_arr,count,fit_level,h,flag,nb_handle); if(rc) break; sn += b; b = nb; } count[fit_level] = chunk; /* restore original count */ } else { for(sn = 0; sn < count[stride_levels]; sn++){ int looplast =0; src = (char*)src_ptr + src_stride_arr[stride_levels -1]* sn; dst = (char*)dst_ptr + dst_stride_arr[stride_levels -1]* sn; if(last && (sn == count[stride_levels]-1)) looplast =1; rc = armci_pack_strided(op, scale, proc, src, src_stride_arr, dst, dst_stride_arr, count, stride_levels -1, h,fit_level, nb, looplast,nb_handle); if(rc) return rc; } } if(nb_handle && call_count ) nb_handle->bufid=NB_MULTI; return rc; } /*\ decompose strided data into chunks and call func on each chunk \*/ void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg) { int sn,first_call=0; void *ptr_upd; /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ first_call=1; armci_fit_buffer(count, strides, &fit_level, &nb, bufsize); } if(fit_level == strides){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int stride_upd; # ifdef PIPE_MEDIUM_BUFSIZE_ /* for first call we adjust nb for performance in medium request */ if(first_call && strides==0) if(chunk<2*bufsize && chunk>PIPE_MEDIUM_BUFSIZE) nb = PIPE_MEDIUM_BUFSIZE; # endif if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ fun(ptr, stride_arr, count, strides, arg); } if(fit_level) stride_upd = stride_arr[fit_level -1]; else stride_upd = 1; for(sn = 0; sn < chunk; sn += nb){ ptr_upd = (char*)ptr + stride_upd* sn; count[fit_level] = ARMCI_MIN(nb, chunk-sn); /*modify count for this level*/ fun(ptr_upd, stride_arr, count, fit_level, arg); } count[fit_level] = chunk; /* restore original count */ }else for(sn = 0; sn < count[strides]; sn++){ ptr_upd = (char*)ptr + stride_arr[strides -1]* sn; armci_dispatch_strided(ptr_upd, stride_arr, count, strides -1, fit_level, nb, bufsize, fun, arg); } } /* how much space is needed to move data + reduced descriptor ? */ int armci_vector_bytes( armci_giov_t darr[], int len) { int i, bytes=0; for(i=0; isrc_ptr_array=NULL; /* go through the sets looking for set to be split */ for(s=0;sBUFSIZE1){ split =(BUFSIZE1 -bytes-2*sizeof(int))/(darr[s].bytes +sizeof(void*)); if(split == 0) s--; /* no room available - do not split */ break; }else bytes+=csize; if(BUFSIZE1 -bytes < 64) break; /* stop here if almost full */ } if(s==len)s--; /* adjust loop counter should be < number of sets */ *nlen = s+1; if(split){ /* save the value to be overwritten only if "save" is not filled */ if(!save->src_ptr_array)*save= darr[s]; /* split the set: reduce # of elems, "extra" keeps info for rest of set*/ *extra = darr[s]; darr[s].ptr_array_len = split; extra->ptr_array_len -= split; extra->src_ptr_array = &extra->src_ptr_array[split]; extra->dst_ptr_array = &extra->dst_ptr_array[split]; } } int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,armci_ihdl_t nb_handle) { armci_giov_t extra; /* keeps data remainder of set to be processed in chunks */ armci_giov_t save; /* keeps original value of set to be processed in chunks */ armci_giov_t *ndarr; /* points to first array element to be processed now */ int rc=0, nlen, count=0; ndarr = darr; save.src_ptr_array=NULL; /* indicates that save slot is empty */ while(len){ armci_split_dscr_array(ndarr, len, &extra, &nlen, &save); # if defined(REMOTE_OP) rc = armci_rem_vector(op, scale, ndarr,nlen,proc,0,nb_handle); # else if(ARMCI_ACC(op))rc=armci_acc_vector(op,scale,ndarr,nlen,proc); else rc = armci_copy_vector(op,ndarr,nlen,proc); # endif if(rc) break; /* non-NULL pointer indicates that set was split */ if(extra.src_ptr_array){ if(nb_handle) { nb_handle->bufid = NB_MULTI; /*can be set multiple times here; but not reset here*/ } ndarr[nlen-1]=extra; /* set the pointer to remainder of last set */ nlen--; /* since last set not done in full need to process it again */ }else{ if(save.src_ptr_array){ ndarr[0]=save; save.src_ptr_array=NULL; /* indicates that save slot is empty */ } if(nlen==0) armci_die("vector packetization problem:buffer too small",BUFSIZE1); } len -=nlen; ndarr +=nlen; count ++; } return rc; } ga-5-4/armci/src-gemini/timer.c0000644000175000017500000000176712662210416014457 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: timer.c,v 1.3 2004-04-09 22:03:51 manoj Exp $ */ #ifdef WIN32 static double msec; /* reference for timer */ # include #else # include # include static unsigned firstsec=0; /* Reference for timer */ static unsigned firstusec=0; /* Reference for timer */ #endif static int first_call=1; double armci_timer() { #ifdef WIN32 double t0 = (double)GetCurrentTime(); if(first_call){ first_call=0; msec=t0; return 0.0; } t0 -=msec; if(t0<0.0)t0 += (double)0xffffffff; return 0.01*t0; #else double low, high; struct timeval tp; struct timezone tzp; (void) gettimeofday(&tp,&tzp); if (first_call) { firstsec = tp.tv_sec; firstusec = tp.tv_usec; first_call = 0; } low = (double)(tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); #endif } ga-5-4/armci/src-gemini/armci_portals.h0000644000175000017500000001051512662210416016172 0ustar mbamba#ifndef ARMCI_PORTALS_H #define ARMCI_PORTALS_H /* portals header file */ #include #include #include #define NUM_COMP_DSCR 4 #define ARMCI_PORTALS_PTL_NUMBER 37 #define HAS_RDMA_GET #define NUM_SERV_BUFS 1 /*corresponds to num of different armci mem regions*/ #define MAX_MEM_REGIONS 10 #define VBUF_DLEN_ORG 4*64*1024 #define VBUF_DLEN 16*1024 #define MSG_BUFLEN_DBL_VT ((VBUF_DLEN)>>3) /* VBUF_DLEN are only used in Vinod's code */ #ifdef PORTALS_USE_RENDEZ_VOUS # define MSG_BUFLEN_DBL 262144 /* for rendez-vous, this can go bigger i think */ #else # define MSG_BUFLEN_DBL 1280 /* this is smaller when rendez-vous is off */ #endif #define ARMCI_NET_ERRTOSTR(__ARMCI_ERC_) ptl_err_str[__ARMCI_ERC_] typedef enum op { ARMCI_PORTALS_PUT, ARMCI_PORTALS_NBPUT, ARMCI_PORTALS_GET, ARMCI_PORTALS_NBGET, ARMCI_PORTALS_ACC, ARMCI_PORTALS_NBACC, ARMCI_PORTALS_GETPUT, ARMCI_PORTALS_NBGETPUT } armci_portals_optype; typedef struct { void *data_ptr; /* pointer where the data should go */ long ack; /* header ack */ void *ack_ptr; /* pointer where the data should go */ void *user_ptr; #if defined(SERV_QUEUE) int imm_msg; size_t data_len; #endif } msg_tag_t; typedef struct armci_portals_desc{ int active; int tag; int dest_id; armci_portals_optype type; ptl_md_t mem_dsc; ptl_handle_md_t mem_dsc_hndl; char *bufptr; }comp_desc; /*for buffers*/ extern char *armci_portals_client_buf_allocate(int); #define BUF_ALLOCATE armci_portals_client_buf_allocate #define BUF_EXTRA_FIELD_T comp_desc* #define INIT_SEND_BUF(_field,_snd,_rcv) _snd=1;_rcv=1;_field=NULL #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release #define CLEAR_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op) if((_op==UNLOCK || _op==PUT || ARMCI_ACC(_op)) && _field!=NULL)x_buf_wait_ack((request_header_t *)((void **)&(_field)+1),((char *)&(_field)-sizeof(BUF_INFO_T)));_field=NULL; #define TEST_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op,_ret) #define COMPLETE_HANDLE _armci_buf_complete_nb_request #define NB_CMPL_T comp_desc* #define ARMCI_NB_WAIT(_cntr) if(_cntr){\ int rc;\ if(nb_handle->tag)\ if(nb_handle->tag==_cntr->tag)\ rc = armci_client_complete(0,nb_handle->proc,nb_handle->tag,_cntr);\ } else{\ printf("\n%d:wait null ctr\n",armci_me);} #ifndef MAX_DS #define MAX_DS 16 #endif /* structure of computing process */ typedef struct { ptl_pt_index_t ptl; ptl_process_id_t rank; ptl_handle_ni_t ni_h; ptl_handle_eq_t eq_h; ptl_process_id_t Srank; ptl_handle_ni_t Sni_h; ptl_handle_eq_t Seq_h; int outstanding_puts; int outstanding_gets; ptl_process_id_t *procid_map; ptl_process_id_t *servid_map; int free_comp_desc_index; caddr_t dsbase[MAX_DS]; size_t dssizes[MAX_DS]; ptl_match_bits_t heap_mb[MAX_DS]; ptl_md_t heap_md[MAX_DS]; ptl_handle_me_t heap_me_h[MAX_DS]; ptl_handle_md_t heap_md_h[MAX_DS]; void *brval[MAX_DS]; long serv_offs[MAX_DS]; int cur_ds; }armci_portals_proc_t; typedef struct { ptl_match_bits_t mb; ptl_md_t md; ptl_handle_me_t me_h; ptl_handle_md_t md_h; }armci_portals_serv_mem_t; typedef struct { int reg_count; int outstanding_puts; int outstanding_gets; armci_portals_serv_mem_t meminfo[MAX_MEM_REGIONS]; }armci_portals_serv_t; extern void print_mem_desc_table(void); extern int armci_init_portals(caddr_t); extern void armci_fini_portals(void); extern int armci_post_descriptor(ptl_md_t *md); extern int armci_prepost_descriptor(void* start, long bytes); extern ptl_size_t armci_get_offset(ptl_md_t md, void *ptr,int proc); extern int armci_get_md(void * start, int bytes , ptl_md_t * md, ptl_match_bits_t * mb); extern void armci_portals_put(int,void *,void *,int,void **,int ); extern void armci_portals_get(int,void *,void *,int,void **,int ); extern void comp_desc_init(); extern int armci_client_complete(ptl_event_kind_t evt,int proc_id, int nb_tag ,comp_desc * cdesc); extern void armci_portals_memsetup(long); extern MPI_Comm portals_smp_comm; #endif /* ARMCI_PORTALS_H */ ga-5-4/armci/src-gemini/locks.c0000644000175000017500000000432512662210416014443 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: locks.c,v 1.15.6.1 2006-12-14 13:24:36 manoj Exp $ */ #define _LOCKS_C_ #include "armcip.h" #include "locks.h" #ifndef WIN32 # include #endif #include extern void armci_die(char*,int); #if defined(SPINLOCK) || defined(PMUTEXES) void **ptr_arr; void CreateInitLocks(int num_locks, lockset_t *plockid) { int locks_per_proc, size; extern void armci_set_serv_mutex_arr(void *); ARMCI_PR_DBG("enter",0); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); locks_per_proc = (num_locks*armci_nclus)/armci_nproc + 1; size=locks_per_proc*sizeof(PAD_LOCK_T); PARMCI_Malloc(ptr_arr, size); _armci_int_mutexes = (PAD_LOCK_T*) ptr_arr[armci_master]; # ifdef PORTALS_SPECIFIC_QUESTION if(armci_me==armci_master)armci_set_serv_mutex_arr(_armci_int_mutexes); # endif if(!_armci_int_mutexes) armci_die("Failed to create spinlocks",size); #ifdef PMUTEXES if(armci_me == armci_master) { int i; pthread_mutexattr_t pshared; if(pthread_mutexattr_init(&pshared)) armci_die("armci_allocate_locks: could not init mutex attr",0); # ifndef LINUX if(pthread_mutexattr_setpshared(&pshared,PTHREAD_PROCESS_SHARED)) armci_die("armci_allocate_locks: could not set PROCESS_SHARED",0); # endif for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){ if(pthread_mutex_init(_armci_int_mutexes+i,&pshared)) armci_die("armci_allocate_locks: could not init mutex",i); } } #else bzero((char*)ptr_arr[armci_me],size); ARMCI_PR_DBG("exit",0); #endif } void InitLocks(int num_locks, lockset_t lockid) { /* what are you doing here ? All processes should've called CreateInitLocks(). Check preprocessor directtives and see lock allocation in armci_init */ armci_die("InitLocks(): what are you doing here ?",armci_me); } void DeleteLocks(lockset_t lockid) { _armci_int_mutexes = (PAD_LOCK_T*)0; } #else /*********************** every thing else *************************/ void CreateInitLocks(int num_locks, lockset_t *lockid) {} void InitLocks(int num_locks, lockset_t lockid) { } void DeleteLocks(lockset_t lockid) { } #endif ga-5-4/armci/src-gemini/locks.h0000644000175000017500000001302212662210416014442 0ustar mbamba#ifndef _ARMCI_LOCKS_H_ #define _ARMCI_LOCKS_H_ #if HAVE_SYS_TYPES_H # include #endif #define MAX_LOCKS 1024 #define NUM_LOCKS MAX_LOCKS #if !(defined(PMUTEX) || defined(PSPIN) || defined(CYGNUS) || defined(CRAY_XT)) # include "spinlock.h" #endif #if !(defined(PMUTEX) || defined(PSPIN) || defined(SPINLOCK)) # error cannot run #endif #if (defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) || defined(HITACHI)) && !(defined(BGML) || defined(DCMF)) # include "armci_shmem.h" typedef struct { long off; long idlist[SHMIDLEN]; } lockset_t; extern lockset_t lockid; #elif defined(BGML) || defined(DCMF) typedef int lockset_t; #endif #if defined(PMUTEX) # warning SPINLOCK: pthread_mutex_lock # include # include # define NAT_LOCK(x,p) pthread_mutex_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_mutex_t # define PAD_LOCK_T LOCK_T PAD_LOCK_T *_armci_int_mutexes; #elif defined(PSPIN) # warning SPINLOCK: pthread_spin_lock # include # include # define NAT_LOCK(x,p) pthread_spin_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_spin_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_spinlock_t # define PAD_LOCK_T LOCK_T PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) && defined(SGIALTIX) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) PAD_LOCK_T *_armci_int_mutexes; #elif defined(HITACHI) extern void armcill_lock(int mutex, int proc); extern void armcill_unlock(int mutex, int proc); # define LOCK_T int # define PAD_LOCK_T LOCK_T # define NAT_LOCK(x,p) armcill_lock((x),(p)) # define NAT_UNLOCK(x,p) armcill_unlock((x),(p)) PAD_LOCK_T *_armci_int_mutexes; #elif defined(SGI) # define SGI_SPINS 100 # include typedef struct { int id; ulock_t * lock_array[NUM_LOCKS]; }lockset_t; extern lockset_t lockset; # define NAT_LOCK(x,p) (void) uswsetlock(lockset.lock_array[(x)],SGI_SPINS) # define NAT_UNLOCK(x,p) (void) usunsetlock(lockset.lock_array[(x)]) #elif defined(CONVEX) # include typedef struct{ unsigned state; unsigned pad[15]; } lock_t; typedef int lockset_t; extern lock_t *lock_array; extern void setlock(unsigned * volatile lp); extern void unsetlock(unsigned * volatile lp); # define NAT_LOCK(x,p) (void) setlock(&lock_array[x].state) # define NAT_UNLOCK(x,p) (void) unsetlock(&lock_array[(x)].state) #elif defined(WIN32) typedef int lockset_t; extern void setlock(int); extern void unsetlock(int); # define NAT_LOCK(x,p) setlock(x) # define NAT_UNLOCK(x,p) unsetlock(x) #elif defined(CRAY_YMP) && !defined(__crayx1) # include typedef int lockset_t; extern lock_t cri_l[NUM_LOCKS]; # pragma _CRI common cri_l # define NAT_LOCK(x,p) t_lock(cri_l+(x)) # define NAT_UNLOCK(x,p) t_unlock(cri_l+(x)) #elif defined(CRAY_T3E) || defined(__crayx1) || defined(CATAMOUNT) || defined(CRAY_SHMEM) || defined(PORTALS) # include # if defined(CRAY) || defined(CRAY_XT) # include # endif # if defined(DECOSF) || defined(LINUX64) || defined(__crayx1) || defined(CATAMOUNT) # define _INT_MIN_64 (LONG_MAX-1) # endif # undef NUM_LOCKS # define NUM_LOCKS 4 static long armci_lock_var[4]={0,0,0,0}; typedef int lockset_t; # define INVALID (long)(_INT_MIN_64 +1) # define NAT_LOCK(x,p) while( shmem_swap(armci_lock_var+(x),INVALID,(p)) ) # define NAT_UNLOCK(x,p) shmem_swap(armci_lock_var+(x), 0, (p)) #elif defined(SYSV) && defined(LAPI) && defined(AIX) int **_armci_int_mutexes; # define NAT_LOCK(x,p) armci_lapi_lock(_armci_int_mutexes[armci_master]+(x)) # define NAT_UNLOCK(x,p) armci_lapi_unlock(_armci_int_mutexes[armci_master]+(x)) typedef int lockset_t; #elif defined(CYGNUS) typedef int lockset_t; # define NAT_LOCK(x,p) armci_die("does not run in parallel",0) # define NAT_UNLOCK(x,p) armci_die("does not run in parallel",0) #elif defined(LAPI) && !defined (LINUX) # include typedef int lockset_t; extern pthread_mutex_t _armci_mutex_thread; # define NAT_LOCK(x,p) pthread_mutex_lock(&_armci_mutex_thread) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(&_armci_mutex_thread) #elif defined(FUJITSU) typedef int lockset_t; # include "fujitsu-vpp.h" #elif defined(SYSV) || defined(MACX) # include "semaphores.h" # undef NUM_LOCKS # define NUM_LOCKS ((MAX_LOCKS< SEMMSL) ? MAX_LOCKS:SEMMSL) # define NAT_LOCK(x,p) P_semaphore(x) # define NAT_UNLOCK(x,p) V_semaphore(x) # ifndef _LOCKS_C_ # define CreateInitLocks Sem_CreateInitLocks # define InitLocks Sem_InitLocks # define DeleteLocks Sem_DeleteLocks # endif #else # error #endif extern void CreateInitLocks(int num, lockset_t *id); extern void InitLocks(int num , lockset_t id); extern void DeleteLocks(lockset_t id); #ifdef FUJITSU # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(p); } #else # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(x,p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(x,p); } #endif #endif /* _ARMCI_LOCKS_H_ */ ga-5-4/armci/src-gemini/message.c0000644000175000017500000017776212662210416014774 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: message.c,v 1.58.6.4 2007-04-24 10:08:26 vinod Exp $ */ #if defined(BGML) # include "bgml.h" #elif defined(PVM) # include #elif defined(TCGMSG) # include #else # ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI # endif # include #endif #include "message.h" #include "armcip.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #ifdef _POSIX_PRIORITY_SCHEDULING #ifndef HITACHI # include #endif #endif #include "armci.h" #include "acc.h" #define DEBUG_ 0 #if defined(SYSV) || defined(MMAP) ||defined (WIN32) # include "armci_shmem.h" #endif /* global operations are use buffer size of BUF_SIZE doubles */ #define BUF_SIZE (4*2048) #define INFO_BUF_SIZE (BUF_SIZE*sizeof(BUF_SIZE) - sizeof(double)) #undef EMPTY #define EMPTY 0 #define FULL 1 static double *work=NULL; static long *lwork = NULL; static long long *llwork = NULL; static int *iwork = NULL; static float *fwork = NULL; static int _armci_gop_init=0; /* tells us if we have a buffers allocated */ static int _armci_gop_shmem =0; /* tells us to use shared memory for gops */ extern void armci_util_wait_int(volatile int *, int , int ); static int empty=EMPTY,full=FULL; #if !defined(SGIALTIX) && defined(SYSV) || defined(MMAP) || defined(WIN32) static void **ptr_arr=NULL; #endif typedef struct { union { volatile int flag; double dummy[16]; }a; union { volatile int flag; double dummy[16]; }b; double array[BUF_SIZE]; } bufstruct; static bufstruct *_gop_buffer; #define GOP_BUF(p) (_gop_buffer+((p)-armci_master)) /*\ macro to set a flag includes mem barrier to assure that flag is not set * before any outstanding writes complete \*/ #ifdef NEED_MEM_SYNC # ifdef AIX # define SET_SHM_FLAG(_flg,_val) _clear_lock((int *)(_flg),_val); # elif defined(NEC) # define SET_SHM_FLAG(_flg,_val) MEM_FENCE; *(_flg)=(_val) # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define SET_SHM_FLAG(_flg,_val)\ __asm__ __volatile__ ("mf" ::: "memory"); *(_flg)=(_val) # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define SET_SHM_FLAG(_flg,_val)\ _armci_ia64_mb(); *(_flg)=(_val); # endif # elif defined(MACX) # if defined(__GNUC__) # define SET_SHM_FLAG(_flg,_val)\ *(_flg)=(_val);__asm__ __volatile__ ("isync" ::: "memory") # endif # endif #endif #ifndef SET_SHM_FLAG # define SET_SHM_FLAG(_flg,_val) *(_flg)=_val; #endif /*\ * Variables/structures for use in Barrier and for Binomial tree \*/ #if HAVE_MATH_H # include #endif int barr_switch; static int LnB=0,powof2nodes,Lp2; typedef struct { volatile int flag1; double dum[16]; volatile int flag2; } barrier_struct; barrier_struct *_bar_buff; #define BAR_BUF(p) (_bar_buff+((p))) void **barr_snd_ptr,**barr_rcv_ptr; int _armci_barrier_init=0; int _armci_barrier_shmem=0; /*\ * Tree generation code \*/ static void _dfs_bintree_parse(int *idlist, int index, int max, int *result) { int left = (int)2*index+1; int right = (int) 2*index+2; static int pos=0; int r_end,l_end; l_end=pos++; result[pos++]=idlist[index]; if(leftarray; /* each process finds its place */ GOP_BUF(armci_me)->a.flag=EMPTY; /* initially buffer is empty */ GOP_BUF(armci_me)->b.flag=EMPTY; /* initially buffer is empty */ if(armci_me == armci_master ){ GOP_BUF(armci_clus_last+1)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+1)->b.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->b.flag=EMPTY;/*initially buffer is empty*/ } _armci_gop_shmem = 1; } #endif /*stuff needed for barrier and binomial bcast/reduce*/ #ifdef LAPI if(!_armci_barrier_shmem){ int size = 2*sizeof(int); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barrinit failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barrinit failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); powof2nodes=1; LnB = floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)-1) _armci_dummy_work *=DUMMY_INIT; if(_armci_dummy_work>(double)armci_msg_nproc())_armci_dummy_work=DUMMY_INIT; } /***************************Barrier Code*************************************/ void armci_msg_barr_init(){ #if defined(SYSV) || defined(MMAP) || defined(WIN32) int size=sizeof(barrier_struct)*armci_clus_info[armci_clus_me].nslave; char *tmp; void **ptr_arr; barr_switch=0; /*First allocate space for flags*/ ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(armci_me==armci_master) size = size+128; else size=0; PARMCI_Malloc(ptr_arr, size); tmp = (char*)ptr_arr[armci_master]; size=2*sizeof(int); if(!tmp)armci_die("allocate barr shm failed",0); _bar_buff=(barrier_struct *)tmp; SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag1),empty); SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag2),empty); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barr_init failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barr_init failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); /*we have to figure if we have power of ,two nodes*/ powof2nodes=1; LnB = (int)floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)flag1,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag1),empty); } if(armci_nclus>1){ last = ((int)pow(2,(LnB-1)))^armci_clus_me; if(last>=0 && lastarmci_clus_me){ /*the pow2 set of procs*/ if(last=0 && next armci_me){ armci_msg_snd(ARMCI_TAG, srcp,4,next_node); armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); } else{ /*would we gain anything by doing a snd,rcv instead of rcv,snd*/ armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); armci_msg_snd(ARMCI_TAG, srcp,4,next_node); } armci_util_wait_int((volatile int *)dstn,barr_count,100000); } } if(last1*/ for(i=1;iflag2),full); } else { /*if not master, partake in the smp barrier,only*/ i=armci_me-armci_master; SET_SHM_FLAG(&(BAR_BUF(i)->flag1),full); armci_util_wait_int(&BAR_BUF(i)->flag2,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag2),empty); } } #endif /*barrier enabled only for lapi*/ void parmci_msg_barrier() { #ifdef BGML bgml_barrier (3); /* this is always faster than MPI_Barrier() */ #elif defined(MSG_COMMS_MPI) MPI_Barrier(ARMCI_COMM_WORLD); # elif defined(PVM) pvm_barrier(mp_group_name, armci_nproc); # elif defined(LAPI) #if !defined(NEED_MEM_SYNC) if(_armci_barrier_init) _armci_msg_barrier(); else #endif { tcg_synch(ARMCI_TAG); } # else { tcg_synch(ARMCI_TAG); } # endif } /***********************End Barrier Code*************************************/ void armci_msg_init(int *argc, char ***argv) { #if defined(TCGMSG) if (!tcg_ready()) { tcg_pbegin(argc,argv); } #elif defined(BGML) /* empty */ #elif defined(MSG_COMMS_MPI) int flag=0; MPI_Initialized(&flag); if (!flag) { # if defined(DCMF) || defined(MPI_MT) int provided; MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); # else MPI_Init(argc, argv); # endif } if (!PARMCI_Initialized()) { MPI_Comm_dup(MPI_COMM_WORLD, &ARMCI_COMM_WORLD); } #endif } int armci_msg_me() { #ifdef BGML return BGML_Messager_rank(); #elif defined(DCMF) return DCMF_Messager_rank(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int me; MPI_Comm_rank(ARMCI_COMM_WORLD, &me); armci_me = me; counter = 1; } return armci_me; #elif defined(PVM) return(pvm_getinst(mp_group_name,pvm_mytid())); #else return (int)tcg_nodeid(); #endif } int armci_msg_nproc() { #ifdef BGML return BGML_Messager_size(); #elif defined(DCMF) return DCMF_Messager_size(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int nproc; MPI_Comm_size(ARMCI_COMM_WORLD, &nproc); armci_nproc = nproc; counter = 1; } return armci_nproc; #elif defined(PVM) return(pvm_gsize(mp_group_name)); #else return (int)tcg_nnodes(); #endif } #ifdef CRAY_YMP #define BROKEN_MPI_ABORT #endif #ifndef PVM double armci_timer() { #ifdef BGML return BGML_Timer(); #elif defined(DCMF) return DCMF_Timer(); #elif defined(MSG_COMMS_MPI) return MPI_Wtime(); #else return tcg_time(); #endif } #endif void armci_msg_abort(int code) { #ifdef BGML fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(DCMF) fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(MSG_COMMS_MPI) # ifndef BROKEN_MPI_ABORT MPI_Abort(ARMCI_COMM_WORLD,code); # endif #elif defined(PVM) char error_msg[25]; sprintf(error_msg, "ARMCI aborting [%d]", code); pvm_halt(); #else tcg_error("ARMCI aborting",(long)code); #endif fprintf(stderr,"%d:aborting\n",armci_me); /* trap for broken abort in message passing libs */ _exit(1); } void armci_msg_finalize() { #if defined(TCGMSG) tcg_pend(); #elif defined(MSG_COMMS_MPI) MPI_Finalize(); #endif } void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right) { int root, up, left, right, index, nproc; if(scope == SCOPE_NODE){ root = armci_clus_info[armci_clus_me].master; nproc = armci_clus_info[armci_clus_me].nslave; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = armci_clus_info[0].master; nproc = armci_nclus; if(armci_me != armci_master){up = -1; left = -1; right = -1; } else{ index = armci_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: armci_clus_info[up].master; left = 2*index + 1 + root; left = ( left >= root+nproc)? -1: armci_clus_info[left].master; right = 2*index + 2 + root; right =( right >= root+nproc)? -1: armci_clus_info[right].master; } }else{ root = 0; nproc = armci_nproc; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = up; *Left = left; *Right = right; *Root = root; } /*\ root broadcasts to everyone else \*/ void armci_msg_bcast_scope(int scope, void *buf, int len, int root) { int up, left, right, Root; if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buf, len, 3); #else armci_msg_bintree(scope, &Root, &up, &left, &right); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); #endif } /*\ shared memory based broadcast for a single SMP node \*/ void armci_smp_bcast(void *x, int n , int root) { int ndo, len,i, bufsize = BUF_SIZE*sizeof(double); static int bufid=1; if(armci_clus_info[armci_clus_me].nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_bcast: NULL pointer", n); /* enable or balance pipeline for messages comparable to bufsize */ if((n>bufsize/2) && (n <(2*bufsize-64))){ bufsize = n/2; bufsize>>=3; bufsize<<=3; } while ((ndo = (n<=bufsize) ? n : bufsize)) { len = ndo; if(armci_me==root){ /* wait for the flag protecting the buffer to clear */ armci_util_wait_int(&(GOP_BUF(armci_clus_last+bufid)->a.flag),EMPTY,100); SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),full); #if 0 for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); armci_copy(x,GOP_BUF(armci_clus_last+bufid+1)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root) GOP_BUF(i)->b.flag=FULL; #else armci_copy(x,GOP_BUF(armci_clus_last+bufid)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); SET_SHM_FLAG(&(GOP_BUF(i)->b.flag),full); } #endif }else{ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag, FULL, 100); armci_copy(GOP_BUF(armci_clus_last+bufid)->array,x,len); SET_SHM_FLAG(&(GOP_BUF(armci_me)->b.flag),empty); } n -=ndo; x = len + (char*)x; bufid = (bufid)%2 +1; /* since root waited for everybody to check in the previous buffer is free*/ if(armci_me==root){ SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),empty); } } } /*\ shared memory based broadcast for a single SMP node out of shmem buffer \*/ void armci_smp_buf_bcast(void *x, int n, int root, void *shmbuf ) { int i, nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2){ armci_copy(shmbuf,x,n); return; /* nothing to do */ } if(!x)armci_die("armci_msg_bcast: NULL pointer", n); if(!shmbuf)armci_die("armci_msg_bcast: NULL pointer", n); if(armci_me==root){ /* notify others that the data in buffer is ready */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); GOP_BUF(i)->b.flag=FULL; } /* root also needs to copy */ armci_copy(shmbuf,x,n); /* wait until everybody is finished -- can reclaim buffer */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY,100000); }else{ /* spin until data in buffer is ready */ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag , FULL, 100000); armci_copy(shmbuf,x,n); /* copy data */ GOP_BUF(armci_me)->b.flag = EMPTY; /* indicate we are done */ } } void _armci_msg_binomial_bcast(void *buf, int len, int root){ int Root = armci_master; int nslave = armci_clus_info[armci_clus_me].nslave; int i,next_node,next; /* int my_rank,root_rank,next_rank; */ /* inter-node operation between masters */ if(root !=armci_clus_info[0].master){ Root = armci_clus_info[0].master; if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); root = Root; Root = armci_master; } if(armci_nclus>1 &&armci_me==armci_master){/*the internode bcast, first*/ /*first do the recv*/ int rcv_proc=armci_clus_me,flag=1,diff=1; if(armci_me!=root){ while(!(rcv_proc & flag)){ diff=diff<<1; flag=flag<<1; } rcv_proc = armci_clus_info[armci_clus_me-diff].master; armci_msg_rcv(ARMCI_TAG, buf,len,NULL,rcv_proc); /*printf("\n%d: recv from %d \n",armci_me,rcv_proc);fflush(stdout);*/ } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1)armci_msg_bcast_scope(SCOPE_MASTERS, buf, len, root); else Root = root; /* intra-node operation */ #if 1 if(_armci_gop_shmem && nslave<33) armci_smp_bcast(buf, len, Root); else #endif armci_msg_bcast_scope(SCOPE_NODE, buf, len, Root); } #endif void armci_msg_brdcst(void* buffer, int len, int root) { if(!buffer)armci_die("armci_msg_brdcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buffer, len, PCLASS); # elif defined(MSG_COMMS_MPI) MPI_Bcast(buffer, len, MPI_CHAR, root, ARMCI_COMM_WORLD); # elif defined(PVM) armci_msg_bcast(buffer, len, root); # else { long ttag=ARMCI_TAG, llen=len, rroot=root; tcg_brdcst(ttag, buffer, llen, rroot); } # endif } void armci_msg_snd(int tag, void* buffer, int len, int to) { # ifdef MSG_COMMS_MPI MPI_Send(buffer, len, MPI_CHAR, to, tag, ARMCI_COMM_WORLD); # elif defined(PVM) pvm_psend(pvm_gettid(mp_group_name, to), tag, buffer, len, PVM_BYTE); # elif defined(BGML) /* We don't actually used armci_msg_snd in ARMCI. we use optimized * collectives where * armci_msg_snd is used. If you build Global Arrays, the MSG_COMMS_MPI flag is * set, so that * will work fine */ armci_die("bgl shouldn't use armci_msg_snd", armci_me); # else long ttag=tag, llen=len, tto=to, block=1; tcg_snd(ttag, buffer, llen, tto, block); # endif } /*\ receive message of specified tag from proc and get its len if msglen!=NULL \*/ void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from) { # ifdef MSG_COMMS_MPI MPI_Status status; MPI_Recv(buffer, buflen, MPI_CHAR, from, tag, ARMCI_COMM_WORLD, &status); if(msglen) MPI_Get_count(&status, MPI_CHAR, msglen); # elif defined(PVM) int src, rtag,mlen; pvm_precv(pvm_gettid(mp_group_name, from), tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; #elif defined(BGML) armci_die("bgl shouldn't use armci_msg_rcv", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=from, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; # endif } int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen) { #if defined(MSG_COMMS_MPI) int ierr; MPI_Status status; ierr = MPI_Recv(buffer, buflen, MPI_CHAR, MPI_ANY_SOURCE, tag, ARMCI_COMM_WORLD, &status); if(ierr != MPI_SUCCESS) armci_die("armci_msg_rcvany: Recv failed ", tag); if(msglen)if(MPI_SUCCESS!=MPI_Get_count(&status, MPI_CHAR, msglen)) armci_die("armci_msg_rcvany: count failed ", tag); return (int)status.MPI_SOURCE; # elif defined(PVM) int src, rtag,mlen; pvm_precv(-1, tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; return(pvm_getinst(mp_group_name,src)); # elif defined (BGML) armci_die("bgl shouldn't use armci_msg_rcvany", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=-1, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; return (int)sender; # endif } /*\ cluster master broadcasts to everyone else in the same cluster \*/ void armci_msg_clus_brdcst(void *buf, int len) { int root, up, left, right; int tag=ARMCI_TAG, lenmes; armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(armci_me != root) armci_msg_rcv(tag, buf, len, &lenmes, up); if (left > -1) armci_msg_snd(tag, buf, len, left); if (right > -1) armci_msg_snd(tag, buf, len, right); } /*\ reduce operation for long \*/ static void ldoop(int n, char *op, long *x, long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("ldoop: unknown operation requested", n); } /*\ reduce operation for long x= op(work,work2) \*/ static void ldoop2(int n, char *op, long *x, long* work, long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for long long \*/ static void lldoop(int n, char *op, long long *x, long long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("lldoop: unknown operation requested", n); } /*\ reduce operation for long long x= op(work,work2) \*/ static void lldoop2(int n, char *op, long long *x, long long* work, long long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for int \*/ static void idoop(int n, char *op, int *x, int* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("idoop: unknown operation requested", n); } /*\ reduce operation for int x= op(work,work2) \*/ static void idoop2(int n, char *op, int *x, int* work, int* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("idoop2: unknown operation requested", n); } /*\ reduce operation for double \*/ static void ddoop(int n, char* op, double* x, double* work) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD(&n,x,work); else while(n--) *x++ += *work++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT(&n,x,work); else while(n--) *x++ *= *work++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("ddoop: unknown operation requested", n); } /*\ reduce operation for double x= op(work,work2) \*/ static void ddoop2(int n, char *op, double *x, double* work, double* work2) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD2(&n,x,work,work2); else while(n--) *x++ = *work++ + *work2++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT2(&n,x,work,work2); while(n--) *x++ = *work++ * *work2++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("ddoop2: unknown operation requested", n); } /*\ reduce operation for float \*/ static void fdoop(int n, char* op, float* x, float* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("fdoop: unknown operation requested", n); } /*\ reduce operation for float x= op(work,work2) \*/ static void fdoop2(int n, char *op, float *x, float* work, float* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("fdoop2: unknown operation requested", n); } /*\ combine array of longs/ints accross all processes \*/ void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, orign =n, ratio; void *origx =x; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); #ifdef BGML BGML_Dt dt; BGML_Op theop; if(n > 0 && (strncmp(op, "+", 1) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_SUM; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "max", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MAX; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "min", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MIN; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else #endif { armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_bcast_scope(scope, origx, len, root); } } void armci_msg_reduce_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, ratio; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } } static void gop(int type, int ndo, char* op, void *x, void *work) { if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); } static void gop2(int type, int ndo, char* op, void *x, void *work, void *work2) { #if 0 int size; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); armci_copy(work2,x,ndo*size); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); #else if(type==ARMCI_INT) idoop2(ndo, op, (int*)x, (int*)work, (int*)work2); else if(type==ARMCI_LONG)ldoop2(ndo,op,(long*)x,(long*)work,(long*)work2); else if(type==ARMCI_LONG_LONG) lldoop2(ndo,op,(long long*)x,(long long*)work,(long long*)work2); else if(type==ARMCI_FLOAT)fdoop2(ndo,op,(float*)x,(float*)work,(float*)work2); else ddoop2(ndo, op, (double*)x, (double*)work,(double*)work2); #endif } /*\ shared memory based reduction for a single SMP node \*/ static void armci_smp_reduce(void *x, int n, char* op, int type) { int root, up, left, right, size; int ndo, len, lenmes, ratio; int nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_gop: NULL pointer", n); armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; armci_util_wait_int(&GOP_BUF(armci_me)->a.flag, EMPTY, 100); #if 1 if(left<0 && right<0) armci_copy(x,GOP_BUF(armci_me)->array,len); /* version oblivious to the order of data arrival */ { int need_left = left >-1; int need_right = right >-1; int from, first =1, maxspin=100, count=0; bufstruct *b; while(need_left || need_right){ from =-1; if(need_left && GOP_BUF(left)->a.flag == FULL){ from =left; need_left =0; }else if(need_right && GOP_BUF(right)->a.flag == FULL) { from =right; need_right =0; } if(from != -1){ b = GOP_BUF(from); #if 1 if(armci_me == root) gop(type, ndo, op, x, b->array); else { if(first) gop2(type, ndo, op, GOP_BUF(armci_me)->array, b->array,x); else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); } first =0; #else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); #endif SET_SHM_FLAG(&( b->a.flag),empty); }else if((++count)array,len); /* this version requires a specific order of data arrival */ if (left >-1) { while(GOP_BUF(left)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(left)->array); SET_SHM_FLAG(&( GOP_BUF(left)->a.flag),empty); } if (right >-1 ) { while(GOP_BUF(right)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(right)->array); GOP_BUF(right)->a.flag = EMPTY; } #endif if (armci_me != root ) { SET_SHM_FLAG(&(GOP_BUF(armci_me)->a.flag),full); } #if 0 else /* NOTE: this copy can be eliminated in a cluster configuration */ armci_copy(GOP_BUF(armci_me)->array,x,len); #endif n -=ndo; x = len + (char*)x; } } void _armci_msg_binomial_reduce(void *x, int n, char* op, int type){ int root = armci_clus_info[0].master; int i,next_node,next; int size, ratio, ndo, lenmes,len; /* int my_rank,root_rank,next_rank; */ if(work==NULL)_allocate_mem_for_work(); if(armci_me!=armci_master)return; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { int snd_proc=armci_clus_me,flag=1,diff=1; len = lenmes = ndo*size; if(armci_me!=root){ while(!(snd_proc & flag)){ diff=diff<<1; flag=flag<<1; } snd_proc = armci_clus_info[armci_clus_me-diff].master; } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1){ #ifdef LAPI if(_armci_gop_init) _armci_msg_binomial_reduce(x,n,op,type); else #endif armci_msg_reduce_scope(SCOPE_MASTERS, x, n, op, type); } } static void armci_msg_gop2(void *x, int n, char* op, int type) { int size, root=0; if(work==NULL)_allocate_mem_for_work(); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); #ifdef BGML /*optimize what we can at the message layer */ void *origx=x; BGML_Dt dt; BGML_Op rop; if(n>0 && (strncmp(op, "+", 1) == 0)) { rop=BGML_SUM; if(type == ARMCI_INT) { dt=BGML_SIGNED_INT; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_LONG || type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); /* dt=BGML_UNSIGNED_LONG; */ /* BGTr_Allreduce(origx, x, n, dt, rop, -1, 3);*/ } else if(type == ARMCI_DOUBLE) { dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_FLOAT) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } } else if(n>0 && ((strncmp(op, "max", 3) == 0) || (strncmp(op, "min", 3) ==0 ))) { if(strncmp(op, "max", 3) == 0) rop=BGML_MAX; else rop=BGML_MIN; if(type == ARMCI_INT) dt=BGML_SIGNED_INT; else if(type == ARMCI_DOUBLE) dt=BGML_DOUBLE; else if(type == ARMCI_FLOAT) dt=BGML_FLOAT; else if(type == ARMCI_LONG) dt=BGML_SIGNED_LONG; else if(type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } if(type != ARMCI_LONG_LONG) BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else #endif { /* brackets needed for final gelse clause of bgml */ armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } } static void armci_sel(int type, char *op, void *x, void* work, int n) { int selected=0; switch (type) { case ARMCI_INT: if(strncmp(op,"min",3) == 0){ if(*(int*)x > *(int*)work) selected=1; }else if(*(int*)x < *(int*)work) selected=1; break; case ARMCI_LONG: if(strncmp(op,"min",3) == 0){ if(*(long*)x > *(long*)work) selected=1; }else if(*(long*)x < *(long*)work) selected=1; break; case ARMCI_LONG_LONG: if(strncmp(op,"min",3) == 0){ if(*(long long*)x > *(long long*)work) selected=1; }else if(*(long long*)x < *(long long*)work) selected=1; break; case ARMCI_FLOAT: if(strncmp(op,"min",3) == 0){ if(*(float*)x > *(float*)work) selected=1; }else if(*(float*)x < *(float*)work) selected=1; break; default: if(strncmp(op,"min",3) == 0){ if(*(double*)x > *(double*)work) selected=1; }else if(*(double*)x < *(double*)work) selected=1; } if(selected)armci_copy(work,x, n); } /*\ global for op with extra info \*/ void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute) { int root, up, left, right; int tag=ARMCI_TAG; int len, lenmes, min; min = (strncmp(op,"min",3) == 0); if(!min && (strncmp(op,"max",3) != 0)) armci_die("armci_msg_gop_info: operation not supported ", 0); if(!x)armci_die("armci_msg_gop_info: NULL pointer", n); if(n>((int)INFO_BUF_SIZE))armci_die("armci_msg_gop_info: info too large",n); len = lenmes = n; armci_msg_bintree(scope, &root, &up, &left, &right); if (left > -1) { /* receive into work if contributing otherwise into x */ if(contribute)armci_msg_rcv(tag, work, len, &lenmes, left); else armci_msg_rcv(tag, x, len, &lenmes, left); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (right > -1) { /* receive into work if contributing otherwise into x */ if(contribute) armci_msg_rcv(tag, work, len, &lenmes, right); else armci_msg_rcv(tag, x, len, &lenmes, right); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (armci_me != root){ if(contribute) armci_msg_snd(tag, x, len, up); else armci_msg_snd(tag, x, 0, up); /* send 0 bytes */ } /* Now, root broadcasts the result down the binary tree */ armci_msg_bcast_scope(scope, x, n, root); } /*\ combine array of longs/ints/doubles accross all processes \*/ #if defined(NEC) void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE); } void armci_msg_fgop (float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT);} #else void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG_LONG); } void armci_msg_fgop(float *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_FLOAT); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_DOUBLE); } #endif /*\ add array of longs/ints within the same cluster node \*/ void armci_msg_clus_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_INT); } void armci_msg_clus_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG); } void armci_msg_clus_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG_LONG); } void armci_msg_clus_fgop(float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_FLOAT); } void armci_msg_clus_dgop_scope(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_DOUBLE); } void armci_exchange_address(void *ptr_ar[], int n) { int ratio = sizeof(void*)/sizeof(int); /* armci_msg_lgop((long*)ptr_ar, n, "+"); */ if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me,(long)ptr_ar[armci_me],ratio); armci_msg_gop2(ptr_ar, n*ratio, "+",ARMCI_INT); } /** * ********************* Begin ARMCI Groups Code **************************** * NOTE: This part is MPI dependent (i.e. ifdef MSG_COMMS_MPI) */ #ifdef MSG_COMMS_MPI MPI_Comm armci_group_comm(ARMCI_Group *group) { #ifdef ARMCI_GROUP return MPI_COMM_NULL; #else ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return (MPI_Comm)igroup->icomm; #endif } void parmci_msg_group_barrier(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP { int val=0; armci_msg_group_igop(&val, 1, "+", group); } #else MPI_Barrier((MPI_Comm)(igroup->icomm)); #endif } #ifdef ARMCI_GROUP extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group); #else extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm); #endif void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc, ARMCI_Group *mastergroup) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(mastergroup); int i, *pid_list, root=0; #ifdef ARMCI_GROUP ARMCI_Group group; #else MPI_Group group_world; MPI_Group group; MPI_Comm comm; #endif /* create a communicator for the processes with in a node */ pid_list = (int *)malloc(grp_clus_nproc*sizeof(int)); for(i=0; iicomm), &group_world); MPI_Group_incl(group_world, grp_clus_nproc, pid_list, &group); MPI_Comm_create((MPI_Comm)(igroup->icomm), (MPI_Group)group, (MPI_Comm*)&comm); /* Broadcast within the node (for this sub group of processes) */ ARMCI_Bcast_(buf, len, root, comm); free(pid_list); MPI_Comm_free(&comm); /* free the temporary communicator */ MPI_Group_free(&group); #endif } /* to avoid warning */ extern int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank); void armci_msg_group_bintree(int scope, int* Root, int *Up, int *Left, int *Right, ARMCI_Group *group) { int root, up, left, right, index, nproc,grp_clus_me,grp_me,grp_master,grp_nproc; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); grp_me = grp_attr->grp_me; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; ARMCI_Group_size(group, &grp_nproc); if(scope == SCOPE_NODE){ root = grp_attr->grp_clus_info[grp_clus_me].master; nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = grp_attr->grp_clus_info[0].master; nproc = grp_attr->grp_nclus; if(grp_me != grp_master){up = -1; left = -1; right = -1; } else{ index = grp_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: grp_attr->grp_clus_info[up].master; left = 2*index + 1 + root; left =( left >= root+nproc)?-1:grp_attr->grp_clus_info[left].master; right= 2*index + 2 + root; right=( right>=root+nproc)?-1:grp_attr->grp_clus_info[right].master; } }else{ root = 0; nproc = grp_nproc; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = (up==-1)?up:ARMCI_Absolute_id(group,up); *Left = (left==-1)?left:ARMCI_Absolute_id(group,left); *Right = (right==-1)?right:ARMCI_Absolute_id(group,right); *Root = (root==-1)?root:ARMCI_Absolute_id(group,root); } void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group) { int up, left, right, Root; int grp_me; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); if(!group)armci_msg_bcast_scope(scope,buf,len,root); else grp_me = igroup->grp_attr.grp_me; armci_msg_group_bintree(scope, &Root, &up, &left, &right,group); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); } void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group) { int root, up, left, right, size; int tag=ARMCI_TAG,grp_me; int ndo, len, lenmes, orign =n, ratio; void *origx =x; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!group)armci_msg_gop_scope(scope,x,n,op,type); else grp_me = igroup->grp_attr.grp_me; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_group_bintree(scope, &root, &up, &left, &right,group); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x, llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_group_bcast_scope(scope, origx, len, root,group); } void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group) { int ratio = sizeof(void*)/sizeof(int); ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); int grp_me = igroup->grp_attr.grp_me; if(DEBUG_){ printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); } armci_msg_group_gop_scope(SCOPE_ALL, ptr_arr, n*ratio, "+", ARMCI_INT, group); } /*\ combine array of longs/ints/doubles accross all processes \*/ void armci_msg_group_igop(int *x, int n, char* op, ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT,group); } void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG,group); } void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG,group); } void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT,group); } void armci_msg_group_dgop(double *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE,group); } # endif /* ifdef MSG_COMMS_MPI */ /*********************** End ARMCI Groups Code ****************************/ #ifdef PVM /* set the group name if using PVM */ void ARMCI_PVM_Init(char *mpgroup) { #ifdef CRAY mp_group_name = (char *)NULL; #else if(mpgroup != NULL) { /* free(mp_group_name); */ mp_group_name = (char *)malloc(25 * sizeof(char)); strcpy(mp_group_name, mpgroup); } #endif } #endif ga-5-4/armci/src-gemini/atomics-i386.h0000644000175000017500000000071612662210416015463 0ustar mbamba/** Atomic instructions for i386. To be populated as need arises. * @author Sriram Krishnamoorthy */ #ifndef __ATOMICS_I386__ #define __ATOMICS_I386__ #include #define v4b (volatile unsigned int *) static inline void atomic_exchange(void *val, void *ptr, int size) { assert(size == 4); __asm__ __volatile__ ("xchgl %0, %1" : "=r"(*v4b(val)), "+m"(*v4b(ptr)) : "0"(*v4b(val)) : "memory"); } #undef v4b #endif /*__ATOMICS_I386__*/ ga-5-4/armci/src-gemini/run_test0000755000175000017500000000017312662210416014752 0ustar mbamba#!/bin/tcsh rm -f core* limit coredumpsize 128megabytes # setenv CRAY_PORTALS_USE_BLOCKING_POLL 1 aprun -n 4 -N 2 ./test.x ga-5-4/armci/src-gemini/generategnuplot.sh0000644000175000017500000000046412662210416016723 0ustar mbamba#!/bin/sh echo "#Range number process" > profile_3d.dat for (( i = 0 ; i <= 128; i++ )) do affile="armci_profile.${i}" if test -s $affile then head -n 28 $affile | tail -n 22 | awk '{print $7" "$0+$1+$2" '$i'"}' | awk -F- '{print $2}' | awk -F")" '{print $1" "$2}' >> profile_3d.dat fi done ga-5-4/armci/src-gemini/armci.h0000644000175000017500000004003312662210416014424 0ustar mbamba/*$id$*/ /* ARMCI header file */ #ifndef _ARMCI_H #define _ARMCI_H /* for size_t */ #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef unsigned long long u64Int; typedef long long s64Int; extern int armci_sameclusnode(int proc); typedef struct { void **src_ptr_array; void **dst_ptr_array; int ptr_array_len; int bytes; } armci_giov_t; typedef long armci_size_t; extern int armci_notify(int proc); extern int armci_notify_wait(int proc,int *pval); extern int ARMCI_Init(void); /* initialize ARMCI */ extern int ARMCI_Init_args(int *argc, char ***argv); extern void ARMCI_Barrier(void); /* ARMCI Barrier*/ extern int ARMCI_Put(void *src, void* dst, int bytes, int proc); extern int ARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc); #define ARMCI_Put1(_s,_d,_b,_p) memcpy(_d,_s,_b), 0 extern int ARMCI_PutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag_dir( /* put with flag that uses direct put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_Acc(int optype, void *scale, void *src, void *dst, int bytes, int proc); extern int ARMCI_AccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_Get(void *src, void* dst, int bytes, int proc); extern int ARMCI_GetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_AccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueFloat(float src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueDouble(double src,/* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_GetValueInt(void *src, int proc); extern long ARMCI_GetValueLong(void *src, int proc); extern float ARMCI_GetValueFloat(void *src, int proc); extern double ARMCI_GetValueDouble(void *src, int proc); extern int ARMCI_Malloc(void* ptr_arr[], armci_size_t bytes); extern int ARMCI_Free(void *ptr); extern void* ARMCI_Malloc_local(armci_size_t bytes); extern int ARMCI_Free_local(void *ptr); extern int ARMCI_Same_node(int proc); extern void ARMCI_Finalize(); /* terminate ARMCI */ extern void ARMCI_Error(char *msg, int code); extern void ARMCI_Fence(int proc); extern void ARMCI_DoFence(int proc); extern void ARMCI_AllFence(void); extern int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc); extern void ARMCI_Cleanup(void); extern int ARMCI_Create_mutexes(int num); extern int ARMCI_Destroy_mutexes(void); extern void ARMCI_Lock(int mutex, int proc); extern void ARMCI_Unlock(int mutex, int proc); extern void ARMCI_Set_shm_limit(unsigned long shmemlimit); extern int ARMCI_Uses_shm(); extern void ARMCI_Copy(void *src, void *dst, int n); #define FAIL -1 #define FAIL2 -2 #define FAIL3 -3 #define FAIL4 -4 #define FAIL5 -5 #define FAIL6 -6 #define FAIL7 -7 #define FAIL8 -8 #define ARMCI_SWAP 10 #define ARMCI_SWAP_LONG 11 #define ARMCI_FETCH_AND_ADD 12 #define ARMCI_FETCH_AND_ADD_LONG 13 #define ARMCI_ACC_OFF 36 #define ARMCI_ACC_INT (ARMCI_ACC_OFF + 1) #define ARMCI_ACC_DBL (ARMCI_ACC_OFF + 2) #define ARMCI_ACC_FLT (ARMCI_ACC_OFF + 3) #define ARMCI_ACC_CPL (ARMCI_ACC_OFF + 4) #define ARMCI_ACC_DCP (ARMCI_ACC_OFF + 5) #define ARMCI_ACC_LNG (ARMCI_ACC_OFF + 6) #define ARMCI_ACC_RA (ARMCI_ACC_OFF + 7) #define ARMCI_MAX_STRIDE_LEVEL 8 #ifdef BGML #define ARMCI_CRITICAL_SECTION_ENTER() BGML_CriticalSection_enter(); #define ARMCI_CRITICAL_SECTION_EXIT() BGML_CriticalSection_exit(); #else #define ARMCI_CRITICAL_SECTION_ENTER() #define ARMCI_CRITICAL_SECTION_EXIT() #endif /************ locality information **********************************************/ typedef int armci_domain_t; #define ARMCI_DOMAIN_SMP 0 /* SMP node domain for armci_domain_XXX calls */ extern int armci_domain_nprocs(armci_domain_t domain, int id); extern int armci_domain_id(armci_domain_t domain, int glob_proc_id); extern int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id); extern int armci_domain_my_id(armci_domain_t domain); extern int armci_domain_count(armci_domain_t domain); extern int armci_domain_same_id(armci_domain_t domain, int proc); extern int armci_smp_master(int); /* PVM group * On CrayT3E: the default group is the global group which is (char *)NULL * It is the only working group. * On Workstations: the default group is "mp_working_group". User can set * the group name by calling the ARMCI_PVM_init (defined * in message.c) and passing the group name to the library. */ extern char *mp_group_name; /*********************stuff for non-blocking API******************************/ /*\ the request structure for non-blocking api. rmo: it appears that we need measure the size of armci_ireq_t and set the size of armci_hdl_t accordingly. this really needs to be re-designed. \*/ #define ARMCI_ONESIDED_SIZEOF_IREQ 21016 typedef struct { char data[ARMCI_ONESIDED_SIZEOF_IREQ]; } armci_hdl_t; #define armci_req_t armci_hdl_t typedef int ARMCI_Group; extern void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out); extern void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *group_parent); extern void ARMCI_Group_free(ARMCI_Group *group); extern int ARMCI_Group_rank(ARMCI_Group *group, int *rank); extern void ARMCI_Group_size(ARMCI_Group *group, int *size); extern void ARMCI_Group_set_default(ARMCI_Group *group); extern void ARMCI_Group_get_default(ARMCI_Group *group_out); extern void ARMCI_Group_get_world(ARMCI_Group *group_out); extern int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes,ARMCI_Group *group); extern int ARMCI_Free_group(void *ptr, ARMCI_Group *group); extern int ARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbPutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbGetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handler/*armci_non-blocking request handle*/ ); extern int ARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueFloat(float src,/* value in a register to put */ void *dst,/* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueDouble(double src,/* value in a register to put */ void *dst,/* dest starting addr to put data*/ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_Wait(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_Test(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_WaitAll (void); extern int ARMCI_WaitProc (int proc); extern void ARMCI_SET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); extern void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); extern void ARMCI_INIT_HANDLE(void *hdl); /* -------------- ARMCI Non-collective memory allocator ------------- */ typedef struct armci_meminfo_ds { char * armci_addr; /* remote address of the creator which can be used in ARMCI communication */ char *addr; /* local address of creator which can be used in to set SMP memoffset, armci_set_mem_offset() */ size_t size; /* size of remote pid's segment (bytes) */ int cpid; /* armci pid of creator */ long idlist[64]; } armci_meminfo_t; extern void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg); extern void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset); extern void ARMCI_Memdt(armci_meminfo_t *meminfo, int memflg); extern void ARMCI_Memctl(armci_meminfo_t *meminfo); /* ------------------- ARMCI Checkpointing/Recovery ----------------- */ #ifdef DO_CKPT #define ARMCI_CKPT 0 #define ARMCI_RESTART 1 typedef struct { void **ptr_arr; size_t *sz; int *saveonce; int count; }armci_ckpt_ds_t; void ARMCI_Ckpt_create_ds(armci_ckpt_ds_t *ckptds, int count); int ARMCI_Ckpt_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds); int ARMCI_Ckpt(int rid); void ARMCI_Ckpt_finalize(int rid); #define ARMCI_Restart_simulate armci_irecover # ifdef MSG_COMMS_MPI ARMCI_Group * ARMCI_Get_ft_group(); # endif #endif /* ------------------------------------------------------------------ */ #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* _ARMCI_H */ ga-5-4/armci/src-gemini/rmw.c0000644000175000017500000000771712662210416014145 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: rmw.c,v 1.24.2.5 2007-08-29 17:32:47 manoj Exp $ */ #include "armcip.h" #include "locks.h" #include "copy.h" #include #if (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC) # include "atomics-i386.h" #endif #ifdef LIBELAN_ATOMICS ELAN_ATOMIC *a; int elan_int_fadd(int *target, int inc, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); return(result); } int elan_long_fadd(long *target, long inc, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #endif return(result); } int elan_int_swap(int *target, int value, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); return(result); } int elan_long_swap(long *target, long value, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #endif return(result); } #endif /* LIBELAN_ATOMICS */ /* enable use of newer interfaces in SHMEM */ #ifndef CRAY #ifndef LIBELAN_ATOMICS /* manpages for shmem_fadd exist on the T3E but library code does not */ #define SHMEM_FADD #endif #endif /* global scope to prevent compiler optimization of volatile code */ int _a_temp; long _a_ltemp; void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif ARMCI_PR_DBG("enter",0); NATIVE_LOCK(lock,proc); switch (op) { case ARMCI_FETCH_AND_ADD: armci_get(prem,ploc,sizeof(int),proc); _a_temp = *(int*)ploc + extra; armci_put(&_a_temp,prem,sizeof(int),proc); break; case ARMCI_FETCH_AND_ADD_LONG: armci_get(prem,ploc,sizeof(long),proc); _a_ltemp = *(long*)ploc + extra; armci_put(&_a_ltemp,prem,sizeof(long),proc); break; case ARMCI_SWAP: #if (defined(__i386__) || defined(__x86_64__)) && !defined(_CRAYC) if(SERVER_CONTEXT || armci_nclus==1){ atomic_exchange(ploc, prem, sizeof(int)); } else #endif { armci_get(prem,&_a_temp,sizeof(int),proc); armci_put(ploc,prem,sizeof(int),proc); *(int*)ploc = _a_temp; } break; case ARMCI_SWAP_LONG: armci_get(prem,&_a_ltemp,sizeof(long),proc); armci_put(ploc,prem,sizeof(long),proc); *(long*)ploc = _a_ltemp; break; default: armci_die("rmw: operation not supported",op); } /*TODO memfence here*/ NATIVE_UNLOCK(lock,proc); ARMCI_PR_DBG("exit",0); } int PARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { if(!SAMECLUSNODE(proc)){ # if defined CRAY_REGISTER_ARMCI_MALLOC && HAVE_ONESIDED_FADD if(op == ARMCI_FETCH_AND_ADD_LONG) { armci_onesided_fadd(ploc, prem, extra, proc); } else { # endif armci_rem_rmw(op, ploc, prem, extra, proc); # if defined CRAY_REGISTER_ARMCI_MALLOC && HAVE_ONESIDED_FADD } # endif return 0; } switch (op) { case ARMCI_FETCH_AND_ADD_LONG: # if defined CRAY_REGISTER_ARMCI_MALLOC && HAVE_ONESIDED_FADD armci_onesided_fadd(ploc, prem, extra, proc); break; # endif case ARMCI_FETCH_AND_ADD: case ARMCI_SWAP: case ARMCI_SWAP_LONG: armci_generic_rmw(op, ploc, prem, extra, proc); break; default: armci_die("rmw: operation not supported",op); } return 0; } ga-5-4/armci/src-gemini/buffers.c0000644000175000017500000007276512662210416015001 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: buffers.c,v 1.29.6.9 2007-07-02 05:16:50 d3p687 Exp $ **/ #define SIXTYFOUR 64 #define DEBUG_ 0 #define DEBUG2_ 0 #define EXTRA_ERR_CHECK /**********************************************************************/ #include #include #include #include "armcip.h" #include "request.h" #ifdef WIN32 # include typedef unsigned long ssize_t; #else # include #endif # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) /* the following symbols should be defined if needed in protocol specific header file: BUF_EXTRA_FIELD, BUF_ALLOCATE */ #ifndef BUF_ALLOCATE # define BUF_ALLOCATE malloc #endif #if defined LIBONESIDED # define SMALL_BUF_LEN ARMCI_SMALL_BUF_SIZE #else # if defined(SERV_QUEUE) # define SMALL_BUF_LEN 4096 # else # define SMALL_BUF_LEN 2048 # endif #endif #ifndef MSG_BUFLEN_SMALL # define MSG_BUFLEN_SMALL (MSG_BUFLEN >>0) #endif #define LEFT_GUARD 11.11e11 #define RIGHT_GUARD 22.22e22 #define CLEAR_TABLE_SLOT(idx) *((int*)(_armci_buf_state->table+(idx))) =0 #ifndef BUF_NET_INIT #define BUF_NET_INIT(x,xX,Xx) #endif _buf_ackresp_t *_buf_ackresp_first,*_buf_ackresp_cur; /* we allow multiple buffers (up to 15) per single request * adjacent buffers can be coalesced into a large one */ typedef struct { int op; /* pending operation code */ int snd; /* if 1 then buffer is used for sending request */ int rcv; /* if 1 then buffer is used for receiving data */ int async; /* if 1 then request is nonblocking */ int first; /* id of the 1st buffer in the set in same request */ int count; /* count is not used and is always 1 (or 0???) */ /*unsigned int count:4; \* how many buffers used for this request 8 possible */ int busy; /* if 1 buffer is used and cannot be completed */ int cmpl; /* set to 1 if buffer was completed and can be released */ int to; /* serv/proc to which request was sent, 8172 possible */ }buf_state_t; #ifndef BUFID_PAD_T #define BUFID_PAD_T BUF_INFO_T #endif /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[MSG_BUFLEN_SMALL]; } buf_ext_t; /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[SMALL_BUF_LEN]; } buf_smext_t; /* we keep table and buffer pointer together for better locality */ typedef struct { double left_guard; /* stamp to verify if array was corrupted */ buf_state_t table[MAX_BUFS+MAX_SMALL_BUFS]; /*array with state of buffer */ buf_ext_t *buf; /* address of buffer pool */ buf_smext_t *smallbuf; /* address of the large buffer pool */ int avail; int smavail; int pad; double right_guard; /* stamp to verify if array was corrupted */ unsigned buf_bitmap; /* bitmaps to track available buffers: */ unsigned smbuf_bitmap;/* 1 - available, 0 - not available */ } reqbuf_pool_t; #ifndef BUF_EXTRA_FIELD_T # define SIZE_BUF_EXTRA_FIELD 0 # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) #else # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) #endif #define BUF_TO_BUFINDEX(buf) (BUF_TO_EBUF((buf)))->id.bufid #define BUF_TO_SMBUFINDEX(buf) (BUF_TO_SMEBUF((buf)))->id.bufid buf_ext_t *_armci_buffers; /* these are the actual buffers */ buf_smext_t *_armci_smbuffers; /* no, these are the actual buffers */ reqbuf_pool_t* _armci_buf_state; /* array that describes state of each buf */ extern active_socks_t *_armci_active_socks; /* returns bufinfo, given bufid */ INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid) { if (bufid < 0 || bufid >= (MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("_armci_id_to_bufinfo: bad id",bufid,MAX_BUFS); return bufid < MAX_BUFS ? &(_armci_buf_state->buf[bufid].id) : &(_armci_buf_state->smallbuf[bufid-MAX_BUFS].id); } /*\ we allocate alligned buffer space * this operation can be implemented in platform specific files \*/ void _armci_buf_init() { char *tmp; int extra=0; int smallbuf_size = sizeof(buf_smext_t)*(MAX_SMALL_BUFS); // tmp = (char *) BUF_ALLOCATE((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64)); tmp = (char *) malloc((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64)); bzero(tmp,MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64); extra= ALIGN64ADD(tmp); /* libonesided: register buffer memory */ # ifdef CRAY_REGISTER_ARMCI_MALLOC onesided_hnd_t cp_hnd; cos_mdesc_t local_mdesc; uint64_t length = (MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size + 64); // get the onesided v2.0 api handle for the compute process cpGetOnesidedHandle(&cp_hnd); // register the memory onesided_mem_register(cp_hnd, tmp, length, 0, &local_mdesc); // for now; until we can search through the linked-list of registered memory // to deregister it by pointer (ptr) value only [see ARMCI_Free_local], we'll // take advanatage of lazy deregistration and assume that this segment will // be kept around as long as it's active. onesided_mem_deregister(cp_hnd, &local_mdesc); # endif _armci_buffers = (buf_ext_t *) (tmp + extra); tmp = (char *)(_armci_buffers + MAX_BUFS); extra = ALIGN64ADD(tmp); _armci_smbuffers = (buf_smext_t *) (tmp + extra); if(DEBUG2_){ printf("%d:armci_init_bufs: pointer %p, before align ptr=%p bufptr=%p end of region is %p size=%d extra=%d\n", armci_me,_armci_buffers,tmp,_armci_buffers->buffer,(_armci_buffers+MAX_BUFS), MAX_BUFS*sizeof(buf_ext_t),extra); fflush(stdout); } /* now allocate state array */ tmp = malloc(sizeof(reqbuf_pool_t) + 64); bzero(tmp,sizeof(reqbuf_pool_t) + 64); if(!tmp)armci_die("_armci_buf_init calloc failed",0); extra= ALIGN64ADD(tmp); _armci_buf_state = (reqbuf_pool_t*)(tmp + extra); /* initialize it */ _armci_buf_state->left_guard = LEFT_GUARD; _armci_buf_state->right_guard = RIGHT_GUARD; _armci_buf_state->avail =0; _armci_buf_state->smavail =MAX_BUFS; _armci_buf_state->buf = _armci_buffers; _armci_buf_state->smallbuf = _armci_smbuffers; _buf_ackresp_first=_buf_ackresp_cur=NULL; if(BUF_TO_EBUF(_armci_buf_state->buf[0].buffer)!=_armci_buf_state->buf) armci_die("buffers.c, internal structure alignment problem",0); # ifdef LIBONESIDED int i; for(i=0; i (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ index = BUF_TO_BUFINDEX(ptr); if((index >= MAX_BUFS)|| (index<0)) armci_die2("armci_buf_to_index: bad index:",index,MAX_BUFS); return(index); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ index = BUF_TO_SMBUFINDEX(ptr); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (indextable + index; ARMCI_PR_DBG("enter",0); if(index>=MAX_BUFS){ int relidx; relidx = index-MAX_BUFS; CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); } else CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[index].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); ARMCI_PR_DBG("exit",0); } /*\ complete outstanding operation that uses the specified buffer \*/ void _armci_buf_complete_index(int idx, int called) { int count; buf_state_t *buf_state = _armci_buf_state->table +idx; cos_request_t *req = NULL; count = buf_state->count; if(DEBUG_ || 0) { printf("%d:buf_complete_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("complete_buf_index:inconsistent Index:",idx,buf_state->first); } /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx,rr; relidx = idx-MAX_BUFS; //printf("\n%d:in clear idx=%d %d",armci_me,idx,_armci_buf_state->smallbuf[relidx].id.tag);fflush(stdout); /* ------------------------------------------------------------------------------------------- *\ active buffers need to be completed \* ------------------------------------------------------------------------------------------- */ # ifdef LIBONESIDED req = &_armci_buf_state->smallbuf[relidx].id.ar.req; cpReqWait(req); # else if(_armci_buf_state->smallbuf[relidx].id.tag && (_armci_buf_state->smallbuf[relidx].field)->tag>0) { rr=armci_client_complete(0,buf_state->to,_armci_buf_state->smallbuf[relidx].id.tag,_armci_buf_state->smallbuf[relidx].field); } CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); # endif // later, we might just need to do this for all operations, not just get // Complete NBGET: non-blocking get if(_armci_buf_state->smallbuf[relidx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->smallbuf[relidx].id), _armci_buf_state->smallbuf[relidx].buffer); } _armci_buf_state->smallbuf[relidx].id.tag=0; } else { int rr; /* ------------------------------------------------------------------------------------------- *\ active buffers need to be completed \* ------------------------------------------------------------------------------------------- */ # ifdef LIBONESIDED req = &_armci_buf_state->buf[idx].id.ar.req; cpReqWait(req); # else if(_armci_buf_state->buf[idx].id.tag && (_armci_buf_state->buf[idx].field)->tag>0 ) rr=armci_client_complete(0,buf_state->to,_armci_buf_state->buf[idx].id.tag,_armci_buf_state->buf[idx].field); CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); //printf("\n%d:in clear large idx=%d %d",armci_me,idx,_armci_buf_state->buf[idx].id.tag);fflush(stdout); # endif // later, we might just need to do this for all operations, not just get // Complete NBGET: non-blocking get if(_armci_buf_state->buf[idx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->buf[idx].id), _armci_buf_state->buf[idx].buffer); } _armci_buf_state->buf[idx].id.tag=0; } /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) *(int*)buf_state = 0; } /*\ test outstanding operation that uses the specified buffer for complete * It is important not to change the state of the buffer, the buffer has * to remain as it was, only completion has to be indicated \*/ int _armci_buf_test_index(int idx, int called) { int count,retval=0; buf_state_t *buf_state = _armci_buf_state->table +idx; count = buf_state->count; if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("_buf_test_index:inconsistent index:",idx,buf_state->first); } # ifdef BUF_EXTRA_FIELD_T /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; /*printf("\n%d:relidx=%d \n",armci_me,relidx);fflush(stdout);*/ TEST_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } else { TEST_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } # endif if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d ret=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called,retval); fflush(stdout); } return(retval); } /** an addition to the below operation to allow for multiple outstanding operations per server node */ void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); int buf_pend_count=0; int changeid=0; nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if(_armci_buf_state->table[index].to<0){ _armci_buf_state->table[index].to = 0-1e6-_armci_buf_state->table[index].to; changeid=1; } if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_pend_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); buf_pend_count=0; for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) if( (buf_state->first != (unsigned int) this) && (buf_state->first==(unsigned int) i) && buf_state->op){ buf_pend_count++; if(buf_pend_count == NUM_SERV_BUFS){ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); break; } } } if(changeid)_armci_buf_state->table[index].to = 0-1e6-_armci_buf_state->table[index].to; } /*\ make sure that there are no other pending operations to that smp node * this operation is called from platforms specific routine that sends * request * we could have accomplished the same in armci_buf_get but as Vinod * is pointing out, it is better to delay completing outstanding * calls to overlap memcpy for the current buffer with communication \*/ void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_one_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } /*\ same as above but for process \*/ void _armci_buf_ensure_one_outstanding_op_per_proc(void *buf, int proc) { int i; int index = _armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; void _armci_buf_release_index(int i); if(_armci_buf_state->table[index].to !=(unsigned int) proc ) armci_die2("_armci_buf_ensure_one_outstanding_op_per_proc: bad to", proc, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if(buf_state->to == (unsigned int) proc) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } #define HISTORY__ #ifdef HISTORY typedef struct{ int size; int op; int count; int id; } history_t; history_t history[100]; int h=0; void print_history() { int i; fflush(stdout); printf("%d records\n",h); for(i=0; ibuf[history[i].id].buffer, history[i].count, history[i].op); fflush(stdout); } #endif /*\ call corresponding to GET_SEND_BUF \*/ char *_armci_buf_get_small(int size, int operation, int to) { int avail=_armci_buf_state->smavail,i; _buf_ackresp_t *ar; if(_armci_buf_state->table[avail].op || _armci_buf_state->table[avail].first || _armci_buf_state->smallbuf[avail-MAX_BUFS].id.ar.req.active) { for(i=MAX_BUFS;itable[i].op && !_armci_buf_state->table[i].first && !_armci_buf_state->smallbuf[i-MAX_BUFS].id.ar.req.active) break; } if(i<(MAX_SMALL_BUFS+MAX_BUFS))avail = i; else { _armci_buf_complete_index(avail,1); } } _armci_buf_state->table[avail].op = operation; _armci_buf_state->table[avail].to = to; _armci_buf_state->table[avail].count= 1; _armci_buf_state->table[avail].first = avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.tag=0; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.bufid= avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.protocol=0; ar=&_armci_buf_state->smallbuf[avail-MAX_BUFS].id.ar; assert(ar->val==0);assert(ar->next==NULL);assert(ar->previous==NULL); ar->req.active = 1; if(_buf_ackresp_cur!=NULL) _buf_ackresp_cur->next=ar; if(_buf_ackresp_first==NULL) _buf_ackresp_first=ar; ar->previous=_buf_ackresp_cur; ar->next=NULL; _buf_ackresp_cur=ar; if(DEBUG_ || 0) { printf("%d:buf_get_sm1:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, (int)_armci_buf_state->table[avail].count,(int)_armci_buf_state->table[avail].first); fflush(stdout); } # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->smallbuf[avail-MAX_BUFS].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif _armci_buf_state->smavail = (avail+1-MAX_BUFS)%MAX_SMALL_BUFS + MAX_BUFS; if(DEBUG_ || 0) { printf("%d:buf_get_sm:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, _armci_buf_state->table[avail].count,_armci_buf_state->table[avail].first); fflush(stdout); } return(_armci_buf_state->smallbuf[avail-MAX_BUFS].buffer); } /*\ call corresponding to GET_SEND_BUF \*/ static char *rmo_buffer = NULL; char *_armci_buf_get(int size, int operation, int to) { int avail=_armci_buf_state->avail; int count=1, i; _buf_ackresp_t *ar; /*if small buffer, we go to another routine that gets smallbuf*/ if(size MSG_BUFLEN_SMALL) ){ double val = (double)size; /* use double due to a bug in gcc */ val /= MSG_BUFLEN_SMALL; count=(int)val; if(size%MSG_BUFLEN_SMALL) count++; assert(0); } /* start from 0 if there is not enough bufs available from here */ if((avail+count) > MAX_BUFS)avail = 0; /* avail should never point to buffer in a middle of a set of used bufs */ if(_armci_buf_state->table[avail].op && (_armci_buf_state->table[avail].first != (unsigned int) avail)){ sleep(1); printf("%d: inconsistent first. avail=%d count=%d first=%d size=%d\n", armci_me, avail, count, _armci_buf_state->table[avail].first, size); armci_die2("armci_buf_get: inconsistent first", avail, _armci_buf_state->table[avail].first); } /* we need complete "count" number of buffers */ for(i=0;itable[cur].op && _armci_buf_state->table[cur].first==(unsigned int) cur) || _armci_buf_state->buf[cur].id.ar.req.active) { _armci_buf_complete_index(cur,1); } } for(i=0; itable[avail+i].op = operation; _armci_buf_state->table[avail+i].to = to; _armci_buf_state->table[avail+i].count= count; _armci_buf_state->table[avail+i].first = avail; } _armci_buf_state->buf[avail].id.tag=0; _armci_buf_state->buf[avail].id.bufid=avail; _armci_buf_state->buf[avail].id.protocol=0; ar=&_armci_buf_state->buf[avail].id.ar; assert(ar->val==0);assert(ar->next==NULL);assert(ar->previous==NULL); assert(ar->req.active == 0); ar->req.active = 1; if(_buf_ackresp_cur!=NULL) _buf_ackresp_cur->next=ar; if(_buf_ackresp_first==NULL) _buf_ackresp_first=ar; ar->previous=_buf_ackresp_cur; ar->next=NULL; _buf_ackresp_cur = ar; # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->buf[avail].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif #ifdef HISTORY history[h].size=size; history[h].op=operation; history[h].count=count; history[h].id = avail; h++; #endif if(DEBUG_ || 0) { printf("%d:buf_get:size=%d max=%d got %d ptr=%p count=%d op=%d to=%d\n", armci_me,size,MSG_BUFLEN_SMALL,avail, _armci_buf_state->buf[avail].buffer, count,operation,to); fflush(stdout); } /* select candidate buffer for next allocation request */ _armci_buf_state->avail = avail+count; _armci_buf_state->avail %= MAX_BUFS; return(_armci_buf_state->buf[avail].buffer); } void _armci_buf_release_index(int index) { int count; buf_state_t *buf_state = _armci_buf_state->table +index; char *_armci_buf_ptr_from_id(int id); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (index<0)) armci_die2("armci_buf_release: bad index:",index,MAX_BUFS); count = _armci_buf_state->table[index].count; if(DEBUG_ || 0) { printf("%d:_armci_buf_release_index %d ptr=%p count=%d op=%d smavail=%d\n", armci_me,index,_armci_buf_ptr_from_id(index),count, _armci_buf_state->table[index].op,_armci_buf_state->smavail); fflush(stdout); } /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) *(int*)buf_state = 0; if(index >= MAX_BUFS){ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=0; //_armci_buf_state->smavail = index; } else{ _armci_buf_state->buf[index].id.tag=0; // _armci_buf_state->avail = index; } /* the current buffer is prime candidate to satisfy next buffer request */ } /*\ release buffer when it becomes free \*/ void _armci_buf_release(void *buf) { _armci_buf_release_index(_armci_buf_to_index(buf)); } /*\ return pointer to buffer number id \*/ char *_armci_buf_ptr_from_id(int id) { if(id <0 || id >=(MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("armci_buf_ptr_from_id: bad id",id,MAX_BUFS); if(id >=MAX_BUFS)return(_armci_buf_state->smallbuf[id-MAX_BUFS].buffer); return(_armci_buf_state->buf[id].buffer); } /*\function called from PARMCI_Wait to wait for non-blocking ops \*/ void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode) { int i=0; #if 0 printf("\n%d:wait called with bufid=%d tag=%d \n",armci_me,bufid,tag); fflush(stdout); #endif if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag) _armci_buf_complete_index(i,1); } for(i=0;ismallbuf[i].id.tag) _armci_buf_complete_index(i+MAX_BUFS,1); } *retcode=0; } else { if(bufidbuf[bufid].id.tag) _armci_buf_complete_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) _armci_buf_complete_index(bufid,1); } *retcode=0; } } /*\function called from PARMCI_Test to test completion of non-blocking ops \*/ void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode) { int i; if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag){ if(_armci_buf_test_index(i,1)){ *retcode=1; break; } } } for(i=0;ismallbuf[i].id.tag) if(_armci_buf_test_index(i+MAX_BUFS,1)){ *retcode=1; break; } } } else { if(bufidbuf[bufid].id.tag) *retcode = _armci_buf_test_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) *retcode = _armci_buf_test_index(bufid,1); } } } /*\function to set the buffer tag and the protocol \*/ void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol) { int index = _armci_buf_to_index(bufptr); /*_armci_buf_state->table[index].async=1;*/ if(indexbuf[index].id.tag=tag; _armci_buf_state->buf[index].id.protocol=protocol; } else{ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=tag; _armci_buf_state->smallbuf[index-MAX_BUFS].id.protocol=protocol; } } int _armci_buf_get_tag(void *bufptr) { int index = _armci_buf_to_index(bufptr); if(indexbuf[index].id.tag); else return(_armci_buf_state->smallbuf[index-MAX_BUFS].id.tag); } /*\function to return bufinfo, given buf ptr \*/ BUF_INFO_T *_armci_buf_to_bufinfo(void *buf){ if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ return(&((BUF_TO_EBUF(buf))->id)); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ return(&((BUF_TO_SMEBUF(buf))->id)); } else { armci_die("armci_buf_to_index: bad pointer",0); return(0); } } /*\function to clear all buffers \*/ void _armci_buf_clear_all() { int i; for(i=0;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[i].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } for(i=MAX_BUFS;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[i-MAX_BUFS].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } } /* function to return bufinfo, given buf tag */ BUF_INFO_T *_armci_tag_to_bufinfo(msg_tag_t tag) { int idx; for (idx=0; idx < MAX_BUFS; idx++) if (EQ_TAGS(_armci_buffers[idx].id.tag, tag)) break; if (idx == MAX_BUFS) {/* not found is regular buffers */ for (idx = 0; idx < MAX_SMALL_BUFS; idx++) if (EQ_TAGS(_armci_smbuffers[idx].id.tag, tag)) break; if (idx == MAX_SMALL_BUFS) /* not found at all */ armci_die("_armci_tag_to_bufinfo: bad tag",0); return &(_armci_smbuffers[idx].id); } else return &(_armci_buffers[idx].id); } /* inline primitives for buffer state management */ INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to) { char *buf = _armci_buf_get(size, operation, to); _armci_buf_set_busy(buf, 0); return buf; } INLINE void _armci_buf_set_busy(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].busy = state; } INLINE void _armci_buf_set_busy_idx(int idx, int state) { _armci_buf_state->table[idx].busy = state; } #if 0 INLINE int _armci_buf_cmpld(void *buf) { return _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl; } #else INLINE int _armci_buf_cmpld(int bufid) { return _armci_buf_state->table[bufid].cmpl; } #endif INLINE void _armci_buf_set_cmpld(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl = state; } INLINE void _armci_buf_set_cmpld_idx(int idx, int state) { _armci_buf_state->table[idx].cmpl = state; } ga-5-4/armci/src-gemini/vector.c0000644000175000017500000004325012662210416014632 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: vector.c,v 1.32.6.4 2007-08-29 17:32:32 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #include #include #define SERVER_GET 1 #define SERVER_NBGET 2 #define DIRECT_GET 3 #define DIRECT_NBGET 4 #define SERVER_PUT 5 #define SERVER_NBPUT 6 #define DIRECT_PUT 7 #define DIRECT_NBPUT 8 # define DO_FENCE(__proc,__prot) if(__prot==SERVER_GET);\ else if(__prot==SERVER_PUT);\ else if(__prot==DIRECT_GET || __prot==DIRECT_NBGET){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else if(__prot==DIRECT_PUT || __prot==DIRECT_NBPUT){\ if(armci_prot_switch_fence[__proc]==SERVER_PUT)\ ARMCI_DoFence(__proc);\ }\ else;\ armci_prot_switch_fence[__proc]=__prot /* defined in acc.h so don't redefine here #ifndef ARMCI_COMPLEX_TYPES typedef struct { float real; float imag; } complex_t; typedef struct { double real; double imag; } dcomplex_t; #endif */ /* void I_ACCUMULATE(void* scale, int elems, void*src, void* dst) { int j; int *a=(int*)dst, *b=(int*)src; int alpha = *(int*)scale; for(j=0;j BUFSIZE/2){ /* for large segments use strided implementation */ for(j=0; j< dr.ptr_array_len; j++){ rc = armci_acc_copy_strided(op, scale,proc, dr.src_ptr_array[j], NULL, dr.dst_ptr_array[j],NULL, &dr.bytes, 0); if(rc)return(rc); } }else{ armci_giov_t dl; /*lock memory:should optimize it to lock only a chunk at a time*/ armci_lockmem_scatter(dr.dst_ptr_array, dr.ptr_array_len, dr.bytes, proc); /* copy as many blocks as possible into the local buffer */ dl.bytes = dr.bytes; nb = ARMCI_MIN(PWORKLEN,BUFSIZE/dr.bytes); for(j=0; j< dr.ptr_array_len; j+= nb){ int nblocks = ARMCI_MIN(nb, dr.ptr_array_len -j); int k; /* setup vector descriptor for remote memory copy to bring data into buffer*/ dl.ptr_array_len = nblocks; dl.src_ptr_array = dr.dst_ptr_array + j; /* GET destination becomes source for copy */ for(k=0; k< nblocks; k++) pwork[k] = k*dl.bytes + (char*)armci_internal_buffer; dl.dst_ptr_array = pwork; /* get data to the local buffer */ rc = armci_copy_vector(GET, &dl, 1, proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} /* update source array for accumulate */ dl.src_ptr_array = dr.src_ptr_array +j; /* do scatter accumulate updating copy of data in buffer */ armci_scatter_acc(op, scale, dl, armci_me, 0); /* modify descriptor-now source becomes destination for PUT*/ dl.dst_ptr_array = dr.dst_ptr_array + j; dl.src_ptr_array = pwork; /* put data back */ rc = armci_copy_vector(PUT, &dl, 1, proc); FENCE_NODE(proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} } ARMCI_UNLOCKMEM(proc); } }/*endfor*/ } #endif return 0; } int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int i,s,shmem= SAMECLUSNODE(proc); int armci_th_idx = ARMCI_THREAD_IDX; if(shmem){ /* local/shared memory copy */ for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s],darr[i].bytes); } } }else { switch(op){ case PUT: for(i = 0; i< len; i++){ UPDATE_FENCE_STATE(proc, PUT, darr[i].ptr_array_len); for( s=0; s< darr[i].ptr_array_len; s++){ armci_put(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes, proc); } } break; case GET: for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_get(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes,proc); } } break; default: armci_die("armci_copy_vector: wrong optype",op); } } return 0; } void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],ptr,darr[i].bytes); ptr += darr[i].bytes; } } } void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(ptr, darr[i].dst_ptr_array[s],darr[i].bytes); ptr += darr[i].bytes; } } } int PARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(PUT,proc); /* ensure ordering */ direct=SAMECLUSNODE(proc); if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); rc = armci_copy_vector(PUT, darr, len, proc); } else{ DO_FENCE(proc,SERVER_PUT); rc = armci_pack_vector(PUT, NULL, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } int PARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(GET,proc); /* ensure ordering */ #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_copy_vector(GET, darr, len, proc); } else{ DO_FENCE(proc,SERVER_GET); rc = armci_pack_vector(GET, NULL, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } int PARMCI_AccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=0; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(op,proc); /* ensure ordering */ direct=SAMECLUSNODE(proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # error "grrr" # endif if(direct) { rc = armci_acc_vector( op, scale, darr, len, proc); } else { DO_FENCE(proc,SERVER_PUT); rc = armci_pack_vector(op, scale, darr, len, proc,NULL); } if(rc) return FAIL6; else return 0; } /*****************************************************************************/ /*\ Non-blocking vector API \*/ int PARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; direct=SAMECLUSNODE(proc); /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, PUT, nb_handle); return rc; } } else { /*ORDER(PUT,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = PUT; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(PUT, proc); } if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); rc = armci_copy_vector(PUT, darr, len, proc); } else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_vector(PUT, NULL, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } int PARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; direct=SAMECLUSNODE(proc); /* aggregate get */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, GET, nb_handle); return rc; } } else { /* ORDER(GET,proc); ensure ordering */ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(GET, proc); } if(direct){ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_GET); rc = armci_copy_vector(GET, darr, len, proc); } else{ DO_FENCE(proc,SERVER_NBGET); rc = armci_pack_vector(GET, NULL, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } int PARMCI_NbAccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; UPDATE_FENCE_INFO(proc); direct=SAMECLUSNODE(proc); if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(op, proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct) rc = armci_acc_vector( op, scale, darr, len, proc); else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_vector(op, scale, darr, len, proc,nb_handle); } if(rc) return FAIL6; else return 0; } /*****************************************************************************/ ga-5-4/armci/src-gemini/fence.c0000644000175000017500000000357012662210416014411 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: fence.c,v 1.25.4.6 2007-08-30 19:17:02 manoj Exp $ */ #include "armcip.h" #include "armci.h" #include "copy.h" #include #if defined(PVM) # include #elif defined(TCGMSG) # include #elif defined(BGML) # include "bgml.h" #else # include #endif char *_armci_fence_arr; void armci_init_fence() { _armci_fence_arr=calloc(armci_nproc,1); if(!_armci_fence_arr) armci_die("armci_init_fence: calloc failed",0); } void ARMCI_DoFence(int proc) { int i; if(!SAMECLUSNODE(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); armci_rem_ack(cluster); } } void PARMCI_Fence(int proc) { int i; #if defined(DATA_SERVER) && !(defined(GM) && defined(ACK_FENCE)) // printf("%d [cp] fence_arr(%d)=%d\n",armci_me,proc,FENCE_ARR(proc)); if(FENCE_ARR(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); int master=armci_clus_info[cluster].master; armci_rem_ack(cluster); /* one ack per cluster node suffices */ /* note, in multi-threaded case it will only clear for current thread */ bzero(&FENCE_ARR(master),armci_clus_info[cluster].nslave); } #elif defined(BGML) BGML_WaitProc(proc); MEM_FENCE; #else FENCE_NODE(proc); MEM_FENCE; #endif } /* portals developers' note: armci fence is not guaranteed to be correct unless PUT_START events are captured PUT_ENDs do NOT guarantee order; only PUT_STARTs */ void PARMCI_AllFence() { #if defined(CLUSTER) { int p; for(p=0;p #include #include "armcip.h" #include "message.h" #include #include #include #include #include #define DEBUG_COMM 0 #define DEBUG_INIT 0 #define DEBUG_SERV 0 #define PUT_LOCAL_ONLY_COMPLETION__ typedef struct arminfo{ caddr_t ptr[MAX_DS]; size_t size[MAX_DS]; long serv_offs[MAX_DS]; int cur_ds; }rm_info_t; static rm_info_t *all_meminfo; static int client_md_count=0,serv_md_count=0; typedef struct arns{ long data; long data1; struct arns *next; } arnode; #ifdef ARMCI_CHECK_STATE arnode * arlist_add(arnode **p, long i,long j) { arnode *n = (arnode *)malloc(sizeof(arnode)); if(n == NULL) return NULL; n->next = *p; *p = n; n->data = i; n->data1 = j; return *p; } void arlist_remove(arnode **p) { if(*p != NULL){ arnode *n = *p; *p = (*p)->next; free(n); } } arnode **arlist_search(arnode **n, long i) { while (*n != NULL){ if ((*n)->data == i){ return n; } n = &(*n)->next; } return NULL; } void arlist_print(arnode *n) { if (n == NULL){ /*printf("arlist is empty\n");*/ } while (n != NULL){ printf("%d:%d %d next=%d\n", armci_me,n->data,n->data1,(n->next==NULL)?0:1); n = n->next; } } #endif extern void armci_util_wait_int(volatile int *, int , int ); extern void armci_util_wait_long(volatile long *, long, int ); int _armci_portals_server_ready=0; int _armci_portals_client_ready=0; int _armci_server_mutex_ready=0; void *_armci_server_mutex_ptr = NULL; #ifdef ARMCI_REGISTER_SHMEM typedef struct { void *base_ptr; void *serv_ptr; size_t size; int islocal; int valid; }aptl_reginfo_t; typedef struct { aptl_reginfo_t reginfo[MAX_MEM_REGIONS]; int reg_count; } rem_meminfo_t; #endif typedef struct serv_buf_t{ ptl_handle_md_t md_h; ptl_handle_me_t me_h; ptl_md_t md; char *buf; char *bufend; } serv_buf_t; char **client_buf_ptrs; static int armci_server_terminating=0; serv_buf_t *serv_bufs; long servackval=ARMCI_STAMP,*serv_ack_ptr=&servackval; ptl_handle_md_t serv_ack_md_h,serv_response_md_h; static armci_portals_proc_t _armci_portals_proc_struct; static armci_portals_serv_t _armci_portals_serv_struct; static armci_portals_proc_t *portals = &_armci_portals_proc_struct; static armci_portals_serv_t *serv_portals = &_armci_portals_serv_struct; /*static */comp_desc _compdesc_array[NUM_COMP_DSCR]; static arnode *arn = NULL; #ifdef ARMCI_REGISTER_SHMEM static rem_meminfo_t *_rem_meminfo; static aptl_reginfo_t *_tmp_rem_reginfo; #define IN_REGION(_ptr__,_reg__) ((_reg__.valid) && (_ptr__)>=(_reg__.serv_ptr) \ && (_ptr__) <= ( (char *)(_reg__.serv_ptr)+_reg__.size)) #endif static int ptl_initialized = 0; extern pid_t server_pid; ptl_ni_limits_t armci_ptl_nilimits; ptl_ni_limits_t armci_ptl_Snilimits; void armci_portals_init_ptl() { int rc; int npes,i; ARMCI_PR_DBG("enter",0); /*initialize data structures*/ portals->ptl = ARMCI_PORTALS_PTL_NUMBER; /* our own ptl number */ rc=PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK,PTL_IFACE_SS), PTL_PID_ANY, NULL, &armci_ptl_nilimits, &(portals->ni_h)); switch(rc) { case PTL_OK: /*printf("\n%d:ok for nii\n",armci_me);*/ break; case PTL_IFACE_DUP: /*printf("\n%d:dup for nii\n",armci_me);*/ break; default: printf( "PtlNIInit() failed %d error=%s\n",rc,ARMCI_NET_ERRTOSTR(rc) ); exit(1); } if((rc=PtlGetId(portals->ni_h,&portals->rank)) !=PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n",__FUNCTION__, rc, server_pid); exit(1); } ARMCI_PR_DBG("exit",0); } static inline void init_serv_buf(serv_buf_t *tmp) { int rc; ptl_match_bits_t ignbits = 0xFFFFFFFFF00000FF; ptl_match_bits_t mbits; ptl_process_id_t match_id; ptl_md_t *md_ptr,md; ARMCI_PR_DBG("enter",0); tmp->md.user_ptr=tmp; tmp->md.start=tmp->buf; tmp->md.length=armci_nproc*NUM_SERV_BUFS*VBUF_DLEN; tmp->md.eq_handle=portals->Seq_h; tmp->md.max_size=0; tmp->md.threshold=PTL_MD_THRESH_INF; tmp->md.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; { match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; mbits = 16<<8; rc = PtlMEAttach(portals->Sni_h,portals->ptl,match_id,mbits,ignbits, PTL_RETAIN,PTL_INS_AFTER,&(tmp->me_h)); if (rc != PTL_OK) { printf("(%d):PtlMEAttach: %s\n", portals->Srank,ARMCI_NET_ERRTOSTR(rc)); armci_die("portals attach error isb",rc); } tmp->md.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE | PTL_MD_MANAGE_REMOTE; rc = PtlMDAttach((tmp->me_h),tmp->md,PTL_RETAIN,&(tmp->md_h)); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count) ); exit(1); } serv_md_count++; } /*set up for sending acks */ md_ptr = &(md); md_ptr->start = serv_ack_ptr; md_ptr->length = sizeof(long); md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = sizeof(long); md_ptr->eq_handle = portals->Seq_h; rc = PtlMDBind(portals->Sni_h,md,PTL_RETAIN,&serv_ack_md_h); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBindxn: %s %d\n", portals->Srank.nid, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count)); armci_die("ptlmdbind failed",0); } serv_md_count++; /*set up for sending response */ md_ptr = &(md); md_ptr->start = tmp->buf; md_ptr->length = tmp->md.length; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = tmp->md.length; md_ptr->eq_handle = portals->Seq_h; rc = PtlMDBind(portals->Sni_h, md, PTL_RETAIN, &serv_response_md_h); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBindxn: %s %d\n", portals->Srank.nid, ARMCI_NET_ERRTOSTR(rc),(serv_md_count+client_md_count)); armci_die("ptlmdbind failed",0); } serv_md_count++; ARMCI_PR_DBG("exit",0); } void armci_portals_wait_for_client() { int rc; int *procidinfo; extern armci_clus_t *armci_clus_info; ptl_process_id_t *tmp; ARMCI_PR_SDBG("enter",0); //printf(" "); armci_util_wait_int(&_armci_portals_client_ready,1,1000); if((armci_me)!=armci_master){ exit(0); } else{ if(DEBUG_SERV){ printf("\n%d:chosen one nid,pid=%d,%d\n",armci_me,portals->Srank.nid,portals->Srank.pid); } } ARMCI_PR_SDBG("exit",0); } void armci_portals_prepare_server() { int rc,i,j; ARMCI_PR_SDBG("enter",0); serv_bufs=(serv_buf_t *)malloc(sizeof(serv_buf_t)); bzero(serv_bufs,sizeof(serv_buf_t)); assert(serv_bufs); serv_bufs->buf=(char *)malloc((NUM_SERV_BUFS*armci_nproc*VBUF_DLEN)); bzero(serv_bufs->buf,(NUM_SERV_BUFS*armci_nproc*VBUF_DLEN)); assert(serv_bufs->buf); serv_bufs->bufend=(char *)serv_bufs->buf+(NUM_SERV_BUFS*armci_nproc*VBUF_DLEN); rc = PtlEQAlloc(portals->Sni_h,4*(NUM_SERV_BUFS*armci_nproc),NULL, &(portals->Seq_h)); if (rc != PTL_OK) { printf("(%d):Ptleaalloc() failed: %s %d (%d)\n",portals->Srank, ARMCI_NET_ERRTOSTR(rc),(NUM_SERV_BUFS*armci_nproc),rc); armci_die("EQ Alloc failed",rc); } init_serv_buf(serv_bufs); _armci_portals_server_ready=1; ARMCI_PR_SDBG("exit",0); } void *armci_server_code(void *data) { int rc,num_interface; ARMCI_PR_SDBG("enter",0); if(DEBUG_INIT) printf("%d: in server after creating thread.\n",armci_me); rc = PtlInit(&num_interface); if (rc != PTL_OK) { printf("PtlInit() failed %d %s\n",rc, ARMCI_NET_ERRTOSTR(rc) ); exit(1); } rc=PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK,PTL_IFACE_SS), PTL_PID_ANY, NULL, &armci_ptl_Snilimits, &(portals->Sni_h)); switch(rc) { case PTL_OK: //printf("\n(%d):ok for serv nii\n",armci_me); break; case PTL_IFACE_DUP: //printf("\n(%d):dup for serv nii\n",armci_me); break; default: printf( "PtlNIInit() serv failed %d error=%s\n",rc,ARMCI_NET_ERRTOSTR(rc) ); exit(1); } if((rc=PtlGetId(portals->Sni_h,&portals->Srank)) !=PTL_OK) { printf("%s: PtlGetId failed: %d(%d)\n",__FUNCTION__, rc, server_pid); exit(1); } /*printf("\n(%d):server nid=%d pid=%d\n",armci_me,portals->Srank.nid,portals->Srank.pid);*/ armci_portals_wait_for_client(); armci_portals_prepare_server(); if(DEBUG_INIT) { printf("(%d): connected to all computing processes\n",armci_me); fflush(stdout); } armci_call_data_server(); armci_transport_cleanup(); ARMCI_PR_SDBG("exit",0); return(NULL); } void armci_client_connect_to_servers() { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t md_local; ptl_handle_md_t md_hdl_local; ptl_process_id_t *tmp; int *procidinfo; int c_info; int *flag,shmid; void *addr; char *buf; extern int _armci_server_started; ARMCI_PR_DBG("enter",0); _armci_portals_client_ready=1; if(armci_me==armci_master){ armci_util_wait_int(&_armci_portals_server_ready,1,1000); } armci_msg_barrier(); _armci_server_started=1; if(armci_me==armci_master){ portals->servid_map[armci_clus_me].pid=portals->Srank.pid; portals->servid_map[armci_clus_me].nid=portals->Srank.nid; } armci_msg_gop_scope(SCOPE_ALL,portals->servid_map,(sizeof(ptl_process_id_t)*armci_nclus)/sizeof(int),"+",ARMCI_INT); ARMCI_PR_DBG("exit",0); } static int check_meminfo(void *ptr, long size, int proc) { for(int i=0;i=0) && (right>=size)) return(i+1); } return 0; } static void add_meminfo(void *ptr, size_t size, int proc) { if(check_meminfo(ptr,(long)size,proc)!=0)armci_die("repeat add request for dss",proc); all_meminfo[proc].cur_ds++; all_meminfo[proc].ptr[all_meminfo[proc].cur_ds]=ptr; all_meminfo[proc].size[all_meminfo[proc].cur_ds]=size; #ifdef DEBUG_MEM printf("\n%d:%s:adding %p %ld %d at %d",armci_me,__FUNCTION__,ptr,size,proc,all_meminfo[proc].cur_ds); #endif } typedef struct{ void *ptr; size_t size; size_t serv_offs; } meminfo_t; void armci_exchange_meminfo(void *ptr, size_t size,size_t off) { static meminfo_t exng[armci_nproc]; bzero(exng,sizeof(meminfo_t)*armci_nproc); exng[armci_me].ptr=ptr; exng[armci_me].size=size; exng[armci_me].serv_offs = off; armci_msg_gop_scope(SCOPE_ALL,exng,(sizeof(meminfo_t)*armci_nproc)/sizeof(int),"+",ARMCI_INT); for(int i=0;ibrval[portals->cur_ds]){ ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; int rc,cds=++portals->cur_ds; if(cds>=MAX_DS)armci_die("increase MAX_CDS",cds); portals->dsbase[cds]=portals->brval[cds-1]; //portals->dsbase[cds]=sbrk(0); ptr = portals->brval[cds] = br_val; size = portals->dssizes[cds]=((caddr_t)portals->brval[cds] - portals->dsbase[cds]); portals->serv_offs[cds] = serv_offset; printf("\n%d:%s:base=%p brval=%p dslen=%ld %p end=%p",armci_me,__FUNCTION__,portals->dsbase[cds],br_val, portals->dssizes[cds],portals->brval[cds],get_heap_bottom_addr()); md_ptr = &(portals->heap_md[cds]); md_ptr->start = portals->dsbase[cds]; md_ptr->length = portals->dssizes[cds]; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; portals->heap_mb[cds]=cds+1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, portals->heap_mb[cds], ignbits, PTL_RETAIN,PTL_INS_AFTER, &(portals->heap_me_h[cds])); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((portals->heap_me_h[cds]), *md_ptr,PTL_RETAIN, &(portals->heap_md_h[cds])); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } } else{ #ifdef DEBUG_MEM_ extern caddr_t _end; printf("\n%d:%s:curds=%d brvalin=%p curbrval=%p _end=%p &_end=%p",armci_me,__FUNCTION__,portals->cur_ds,portals->brval[portals->cur_ds],br_val,_end,&_end); #endif } armci_exchange_meminfo(ptr,size,serv_offset); } #ifndef PMI_SUCCESS #define PMI_SUCCESS 0 #endif static int *_client_servbuf_count; int armci_init_portals(caddr_t atbeginbrval) { #ifndef OLD_PORTALS_CODE int i,rc,np,me; ptl_process_id_t id; ptl_process_id_t clone_id; MPI_Comm_size(ARMCI_COMM_WORLD,&np); MPI_Comm_rank(ARMCI_COMM_WORLD,&me); if(armci_me != me) { printf("[mpi %d]: armci_me=%d ... this is a problem\n",me,armci_me); armci_die("mpi rank mismatch",911); } portals_cp_init(); MPI_Barrier(ARMCI_COMM_WORLD); portals_ds_ready = 0; if(armci_me == armci_master) { portalsCloneDataServer( portals_ds_thread ); portalsSpinLockOnInt( &portals_ds_ready,1,10000 ); } MPI_Barrier(ARMCI_COMM_WORLD); i=0; if((rc=PMI_Initialized(&i))!=PMI_SUCCESS){ printf("PMI_Initialized failed\n"); } if(i==0){ if((rc==PMI_Init(&i))!=PMI_SUCCESS){ printf("MPI_Init failed (npes=%d)\n", armci_nproc); } } if((rc=PMI_CNOS_Get_nidpid_map(&portals_id_map))!=PMI_SUCCESS){ printf("Getting proc map failed (npes=%d)\n", armci_nproc); } /* create intra-node communicator */ MPI_Barrier(ARMCI_COMM_WORLD); portals_cp_init_throttle(armci_nclus); MPI_Barrier(ARMCI_COMM_WORLD); /* stuff from old code ... */ bzero(portals,sizeof(armci_portals_proc_t)); // note: i got rid of this rem_meminfo stuff with the gemini version // see that code to see how to remove it here # ifdef ARMCI_REGISTER_SHMEM _rem_meminfo = (rem_meminfo_t *)calloc(armci_nproc,sizeof(rem_meminfo_t)); _tmp_rem_reginfo = (aptl_reginfo_t *)malloc(sizeof(aptl_reginfo_t)*armci_nproc); if( _rem_meminfo==NULL || _tmp_rem_reginfo ==NULL) armci_die("malloc failed in init_portals",0); //if(armci_me == 0) { // printf("sizeof(rem_meminfo_t)=%ld\n",sizeof(rem_meminfo_t)); //} # endif # ifdef CRAY_USE_ARMCI_CLIENT_BUFFERS client_buf_ptrs = (char **) calloc(armci_nproc,sizeof(char *)); assert(client_buf_ptrs); armci_msg_barrier(); _armci_buf_init(); # endif /* end old stuff */ return 0; #else int num_interface; int rc; int npes,i; ARMCI_PR_DBG("enter",0); bzero(portals,sizeof(armci_portals_proc_t)); _rem_meminfo = (rem_meminfo_t *)calloc(armci_nproc,sizeof(rem_meminfo_t)); _tmp_rem_reginfo = (aptl_reginfo_t *)malloc(sizeof(aptl_reginfo_t)*armci_nproc); if( _rem_meminfo==NULL || _tmp_rem_reginfo ==NULL) armci_die("malloc failed in init_portals",0); portals->servid_map=(ptl_process_id_t *)calloc(armci_nclus,sizeof(ptl_process_id_t)); if(portals->servid_map==NULL)armci_die("calloc of servidmap failed",0); rc = PtlInit(&num_interface); if (rc != PTL_OK) { printf("PtlInit() failed %d %s\n",rc, ARMCI_NET_ERRTOSTR(rc) ); exit(1); } armci_portals_init_ptl(); #if 1 i=0; if((rc=PMI_Initialized(&i))!=PMI_SUCCESS){ printf("PMI_Initialized failed\n"); } if(i==0){ if((rc==PMI_Init(&i))!=PMI_SUCCESS){ printf("MPI_Init failed (npes=%d)\n", armci_nproc); } } if((rc=PMI_CNOS_Get_nidpid_map(&portals->procid_map))!=PMI_SUCCESS){ printf("Getting proc map failed (npes=%d)\n", armci_nproc); } //printf(" "); # else portals->procid_map = (ptl_process_id_t *) calloc(armci_nproc,sizeof(ptl_process_id_t)); portals->procid_map[armci_me]=portals->rank; armci_msg_gop_scope(SCOPE_ALL,portals->procid_map,(sizeof(ptl_process_id_t)*armci_nproc)/sizeof(int),"+",ARMCI_INT); //printf(" "); #endif client_buf_ptrs = (char **) calloc(armci_nproc,sizeof(char *)); assert(client_buf_ptrs); armci_msg_barrier(); if(armci_me==armci_master)armci_create_server_process( armci_server_code ); rc = PtlEQAlloc(portals->ni_h,16*NUM_COMP_DSCR,NULL, &(portals->eq_h)); if (rc != PTL_OK) { printf("%d:Ptleqalloc() failed: %s (%d)\n", armci_me, ARMCI_NET_ERRTOSTR(rc) , rc); armci_die("EQ Alloc failed",rc); } /*printf("\n%d:client nid=%d pid=%d\n",armci_me,portals->rank.nid,portals->rank.pid);*/ _armci_buf_init(); for(i=0;ieq_h; _compdesc_array[i].mem_dsc.max_size=0; /*_compdesc_array[i].mem_dsc.threshold=PTL_MD_THRESH_INF;*/ _compdesc_array[i].mem_dsc.threshold=2; _compdesc_array[i].mem_dsc.options=PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; } ptl_initialized = 1; portals->free_comp_desc_index=0; /*for(i=0;iprocid_map[i].nid,portals->procid_map[i].pid);*/ _client_servbuf_count = calloc(armci_nclus,sizeof(int)); armci_msg_barrier(); armci_client_connect_to_servers(); armci_msg_barrier(); if(DEBUG_COMM){ cpu_set_t mycpuid,new_mask; char cid[8],*cidptr; int rrr; extern char * cpuset_to_cstr(cpu_set_t *mask, char *str); rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if(rrr)perror("sched_getaffinity"); cidptr = cpuset_to_cstr(&mycpuid,cid); printf("%d:my affinity is to %s\n",armci_me,cid); } #ifdef NEW_MALLOC /*post entire heap wildcard for direct communication*/ { ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; portals->cur_ds = 0; portals->dsbase[0]=get_heap_bottom_addr(); //portals->brval[0] = sbrk(0); portals->brval[0] = atbeginbrval; portals->dssizes[0]=((caddr_t)portals->brval[0] - portals->dsbase[0]); printf("\n%d:base=%p dslen=%ld %p",armci_me,portals->dsbase[0], portals->dssizes[0],portals->brval[0]); md_ptr = &(portals->heap_md[0]); md_ptr->start = portals->dsbase[0]; md_ptr->length = portals->dssizes[0]; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; portals->heap_mb[0]=1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, portals->heap_mb[0], ignbits, PTL_RETAIN,PTL_INS_AFTER, &(portals->heap_me_h[0])); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((portals->heap_me_h[0]), *md_ptr,PTL_RETAIN, &(portals->heap_md_h[0])); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } all_meminfo = (rm_info_t *)malloc(sizeof(rm_info_t)*armci_nproc); all_meminfo[armci_me].cur_ds = -1; armci_exchange_meminfo(portals->dsbase[0],portals->dssizes[0],0); } #endif ARMCI_PR_DBG("exit",0); return 0; #endif } void armci_fini_portals() { ARMCI_PR_DBG("enter",0); if(DEBUG_INIT){ printf("ENTERING ARMCI_FINI_PORTALS\n");fflush(stdout); } #ifdef ARMCI_CHECK_STATE arlist_print(arn); #endif PtlNIFini(portals->ni_h); /*PtlFini();*/ if(DEBUG_INIT){ printf("LEAVING ARMCI_FINI_PORTALS\n");fflush(stdout); } ARMCI_PR_DBG("exit",0); } void armci_pin_contig1(void *start,size_t bytes) { } #ifdef ARMCI_REGISTER_SHMEM #ifndef NEW_MALLOC void armci_register_req(void *start,int bytes, int ID) { int rc; ptl_md_t *md_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFF00; ptl_process_id_t match_id; ARMCI_PR_DBG("enter",serv_portals->reg_count); #ifdef DEBUG_MEM printf("\n(%d):armci_register_req start=%p bytes=%d\n", armci_me,start,bytes);fflush(stdout); #endif md_ptr = &(serv_portals->meminfo[serv_portals->reg_count].md); md_ptr->start = start; md_ptr->length = bytes; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; md_ptr->eq_handle = PTL_EQ_NONE; serv_portals->meminfo[serv_portals->reg_count].mb=serv_portals->reg_count+1; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, serv_portals->meminfo[serv_portals->reg_count].mb, ignbits, PTL_RETAIN,PTL_INS_AFTER, &(serv_portals->meminfo[serv_portals->reg_count].me_h)); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error reg",rc); } rc = PtlMDAttach((serv_portals->meminfo[serv_portals->reg_count].me_h), *md_ptr,PTL_RETAIN, &serv_portals->meminfo[serv_portals->reg_count].md_h); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count)); armci_die("portals attach error reg",rc); } client_md_count++; serv_portals->reg_count++; ARMCI_PR_DBG("exit",serv_portals->reg_count); } #endif #endif int armci_must_remotecomplete=1; extern _buf_ackresp_t *_buf_ackresp_first,*_buf_ackresp_cur; int x_net_wait_ackresp(_buf_ackresp_t *ar) { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; comp_desc *temp_comp = NULL; int loop=1; int temp_proc; ARMCI_PR_DBG("enter",0); while(ar->val){ ev->type=0; if((rc = PtlEQWait(portals->eq_h, ev)) != PTL_OK){ printf("%d:PtlEQWait(): %d %s\n", portals->rank,rc, ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { temp_comp = (comp_desc *)ev->md.user_ptr; printf("%d:NI sent %d in event %d,%d.\n", armci_me,portals->rank.nid, portals->rank.pid, ev->ni_fail_type); armci_die("event failure problem",temp_comp->dest_id); } if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:done waiting type=%d\n",armci_me, ev->type); fflush(stdout); } if (ev->type == PTL_EVENT_SEND_END){ if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:event send end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; if(temp_comp->type==ARMCI_PORTALS_GETPUT || temp_comp->type==ARMCI_PORTALS_NBGETPUT){ temp_comp->active=0; temp_comp->tag=-1; continue; } if(!armci_must_remotecomplete){ if(temp_comp->type==ARMCI_PORTALS_PUT || temp_comp->type==ARMCI_PORTALS_NBPUT){ temp_comp->active=0; temp_comp->tag=-1; } else continue; } else{ temp_comp->active++; continue; } } else if (ev->type == PTL_EVENT_REPLY_END){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:reply end tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active = 0; /*this was a get request, so we are done*/ temp_comp->tag=-1; continue; } else if (ev->type == PTL_EVENT_ACK){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:net_wait_ackresp:event ack tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active=0; temp_comp->tag=-1; portals->outstanding_puts--; } else if (ev->type==PTL_EVENT_PUT_END){ _buf_ackresp_t *sweep=_buf_ackresp_first; if(DEBUG_COMM){printf("\n%d:put end offset=%d",armci_me,ev->offset);fflush(stdout);} if(ar->val==ev->offset){ /*bingo!*/ ar->val=0; } else{ while(sweep!=NULL){ if(sweep->val==ev->offset){ sweep->val=0; break; } sweep=sweep->next; } /*if(sweep==NULL)armci_die("server wrote data at unexpected offset",ev->offset);*/ if(sweep==NULL){ int y; printf("%d:server wrote data at unexpected offset %d",armci_me,ev->offset);fflush(stdout); abort(); # ifdef ARMCI_CHECK_STATE for(y=0;yservid_map[y].pid==ev->initiator.pid && portals->servid_map[y].nid==ev->initiator.nid)break; assert(y!=armci_nclus); arlist_print(arn); armci_rem_state(y); # endif } } } else armci_die("in net_wait_ackresp unknown event",ev->type); } # ifdef ARMCI_CHECK_STATE arlist_remove(arlist_search(&arn, ar->valc)); # endif ar->valc=0; if(ar==_buf_ackresp_first)_buf_ackresp_first=ar->next; if(ar->next!=NULL){ ar->next->previous=ar->previous; } if(ar->previous!=NULL){ /*printf("\n%d:prev=%p %d %p %p\n",armci_me,ar->previous, ar->val,ar->next,ar);fflush(stdout);*/ ar->previous->next=ar->next; if(_buf_ackresp_cur==ar)_buf_ackresp_cur=ar->previous; } if(_buf_ackresp_cur==ar)_buf_ackresp_cur=NULL; ar->previous=ar->next=NULL; ARMCI_PR_DBG("exit",0); return rc; } int armci_client_complete(ptl_event_kind_t evt,int proc_id, int nb_tag, comp_desc *cdesc) { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; comp_desc *temp_comp = NULL; int loop=1; int temp_proc; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("\n%d:enter:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } if(nb_tag>0){ if(cdesc->tag!=nb_tag)return 0; } while(cdesc->active!=0){ ev->type=0; if((rc = PtlEQWait(portals->eq_h, ev)) != PTL_OK){ printf("%d:PtlEQWait(): %d %s\n", portals->rank,rc, ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { temp_comp = (comp_desc *)ev->md.user_ptr; printf("%d:NI sent %d in event %d,%d.\n", armci_me,portals->rank.nid, portals->rank.pid, ev->ni_fail_type); armci_die("event failure problem",temp_comp->dest_id); } if(DEBUG_COMM){ printf("\n%d:armci_client_complete:done waiting type=%d\n",armci_me, ev->type); fflush(stdout); } if(cdesc!=ev->md.user_ptr){ /*printf("\n%d:expecting desc %p completing %p\n",armci_me,cdesc,ev->md.user_ptr);*/ } if (ev->type == PTL_EVENT_SEND_END){ if(DEBUG_COMM){ printf("\n%d:armci_client_complete:event send end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; if(temp_comp->type==ARMCI_PORTALS_GETPUT || temp_comp->type==ARMCI_PORTALS_NBGETPUT){ temp_comp->active=0; temp_comp->tag=-1; continue; } if(!armci_must_remotecomplete){ if(temp_comp->type==ARMCI_PORTALS_PUT || temp_comp->type==ARMCI_PORTALS_NBPUT){ temp_comp->active=0; temp_comp->tag=-1; } else continue; } else{ temp_comp->active++; continue; } } else if (ev->type == PTL_EVENT_REPLY_END){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:client_send_complete:reply end tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active = 0; /*this was a get request, so we are done*/ temp_comp->tag=-1; continue; } else if (ev->type == PTL_EVENT_ACK){ temp_comp = (comp_desc *)ev->md.user_ptr; if(DEBUG_COMM){ printf("\n%d:client_send_complete:event ack tag=%d\n",armci_me,temp_comp->tag); fflush(stdout); } temp_comp->active=0; temp_comp->tag=-1; portals->outstanding_puts--; } else if (ev->type==PTL_EVENT_PUT_END){ _buf_ackresp_t *ar=_buf_ackresp_first; while(ar!=NULL){ if(ar->val==ev->offset){ ar->val=0; break; } ar=ar->next; } if(ar==NULL)armci_die("server wrote data at unexpected offset",ev->offset); if(DEBUG_COMM){printf("\n%d:put end offset=%d",armci_me,ev->offset);fflush(stdout);} } else armci_die("in client_complete unknown event",ev->type); } if(DEBUG_COMM){ printf("\n%d:exit:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } ARMCI_PR_DBG("exit",0); return rc; } comp_desc * get_free_comp_desc(int * comp_id) { comp_desc * c; int rc = PTL_OK; ARMCI_PR_DBG("enter",0); c = &(_compdesc_array[portals->free_comp_desc_index]); if(c->active!=0 && c->tag>0) armci_client_complete(0,c->dest_id,c->tag,c); else{ /* if(c->active!=0) printf("\n%d:potential problem:active completion descriptor but tag=%d",armci_me,c->tag); else printf("\n%d:potential problem:active completion descriptor with tag=%d",armci_me,c->tag); */ } if(!armci_must_remotecomplete){ do{ rc = PtlMDUnlink(c->mem_dsc_hndl); }while(rc==PTL_MD_IN_USE); } *comp_id = portals->free_comp_desc_index; if(DEBUG_COMM){ printf("\nthe value of comp_desc_id is %d\n",*comp_id); fflush(stdout); } portals->free_comp_desc_index = (portals->free_comp_desc_index+1) % NUM_COMP_DSCR; ARMCI_PR_DBG("exit",0); return c; } void print_mem_desc(ptl_md_t * md) { printf("%d:%p:start=%p length=%d threshold=%d max_size=%d options=%d eq_handle=%d\n",armci_me,md,md->start, md->length,md->threshold,md->max_size,md->options,md->eq_handle); fflush(stdout); } #ifndef NEW_MALLOC #if 0 void armci_unregister_shmem(void *my_ptr, long size) { int i=0,dst,found=0; long id ; long reg_size=0; int reg_num = _rem_meminfo[armci_me].reg_count; void *tptr; ARMCI_PR_DBG("enter",reg_num); #ifdef DEBUG_MEM printf("%d:%s:got size=%ld myptr %p\n",armci_me,__FUNCTION__,size,my_ptr); fflush(stdout); #endif bzero(_tmp_rem_reginfo,sizeof(aptl_reginfo_t)*armci_nproc); if(reg_num>=MAX_MEM_REGIONS) armci_die("reg_num corrupted",reg_num); for(i=0;i=MAX_MEM_REGIONS) armci_die("reg_num corrupted",reg_num); for(i=0;i=MAX_MEM_REGIONS-1){ printf("\n%d:more than expected regions -- %d, increase MAX_MEM_REGIONS",armci_me,_rem_meminfo[i].reg_count++);fflush(stdout); armci_die2("more than expected regions",_rem_meminfo[i].reg_count,MAX_MEM_REGIONS); } } #ifdef DEBUG_MEM printf("%d: regist id=%ld found=%d size=%ld reg_num=%d\n", armci_me,id,found,reg_size,reg_num); fflush(stdout); #endif ARMCI_PR_DBG("exit",0); } void armci_register_shmem_grp(void *my_ptr, long size, long *idlist, long off, void *sptr,ARMCI_Group *group) { ARMCI_Group orig_group; ARMCI_PR_DBG("enter",0); ARMCI_Group_get_default(&orig_group); ARMCI_Group_set_default(group); armci_register_shmem(my_ptr,size,idlist,off,sptr); ARMCI_Group_set_default(&orig_group); ARMCI_PR_DBG("enter",0); } #endif #endif // end #ifdef ARMCI_REGISTER_SHMEM static int _get_rem_servinfo(int serv,size_t bytes, size_t* offset) { int i; ARMCI_PR_DBG("enter",0); i = 16<<8; *offset=(armci_me*NUM_SERV_BUFS+_client_servbuf_count[serv])*VBUF_DLEN; _client_servbuf_count[serv] = (_client_servbuf_count[serv]+1)%NUM_SERV_BUFS; ARMCI_PR_DBG("exit",i); return i; } static int _get_rem_info(int proc, void *ptr,size_t bytes, size_t* offset) { #ifdef ARMCI_REGISTER_SHMEM int i; ARMCI_PR_DBG("enter",0); #ifdef NEW_MALLOC i = check_meminfo(ptr,(long)bytes,proc); if(i==0){ printf("\n%d:ptr=%p bytes=%d proc=%d",armci_me,ptr,bytes,proc); armci_die("region not found",proc); } *offset = (size_t)((caddr_t)ptr-(caddr_t)portals->dsbase[i-1]); printf("\n%d:ptr=%p dsbase[0]=%p offs=%ld",armci_me,ptr,portals->dsbase[0],*offset);fflush(stdout); if(*offset>=0){ ARMCI_PR_DBG("exit A",(i+1)); return(i); } #else rem_meminfo_t *mem_info=&(_rem_meminfo[proc]); aptl_reginfo_t *memreg = mem_info->reginfo; for(i=0;ireg_count;i++){ /*for now size is not verified*/ if(DEBUG_COMM){ printf("\n%d:proc=%d regcount=%d reg=%d base=%p size=%d end=%p checkptr=%p\n",armci_me,proc,mem_info->reg_count,i,memreg[i].base_ptr,memreg[i].size, ((char *)memreg[i].base_ptr+memreg[i].size), ptr);fflush(stdout); } if((memreg[i].valid) && ptr>= memreg[i].base_ptr && ptr< ((char *)memreg[i].base_ptr+memreg[i].size)){ *offset = ((char *)ptr-(char *)memreg[i].base_ptr); ARMCI_PR_DBG("exit A",(i+1)); return (i+1); } } #endif ARMCI_PR_DBG("exit B",i); armci_die("_get_rem_info, rem memory region not found",bytes); #else printf("_get_rem_info called ... this shouldn't happen"); abort(); #endif } void armci_client_direct_get(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local, ptl_handle_md_t *md_hdl_local) { int rc; ptl_size_t offset_local = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("\n%d:armci_client_direct_get:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); fflush(stdout); } rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ printf("%d:PtlMDBind: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("ptlmdbind get failed",0); } #ifdef CRAY_USE_MDMD_COPY if (dest_proc.nid == portals->rank.nid) { rc = PtlMDMDCopy(*md_hdl_local, dest_proc, portals->ptl, 0, mb, offset_remote); } else { #endif rc = PtlGetRegion(*md_hdl_local,offset_local,bytes,dest_proc, portals->ptl, 0, mb, offset_remote); #ifdef CRAY_USE_MDMD_COPY } #endif if (rc != PTL_OK){ printf("%d:PtlGetRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlGetRegion failed",0); } if(DEBUG_COMM){ printf("\n%d:issued get\n",armci_me);fflush(stdout); } ARMCI_PR_DBG("exit",0); } void armci_portals_get(int proc, void *src_buf, void *dst_buf, int bytes, void** cptr,int tag) { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); /*first remote process information*/ /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=dst_buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_info(proc,src_buf,bytes,&offset_remote); cdesc->dest_id = proc; if (tag){ *((comp_desc **)cptr) = cdesc; cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBGET; /*printf("\n%d:get tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ } else{ cdesc->tag = 0; cdesc->type = ARMCI_PORTALS_GET; } cdesc->active = 1; armci_client_direct_get(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); if(!tag){ armci_client_complete(0,proc,0,cdesc); /* check this later */ } ARMCI_PR_DBG("exit",0); } void armci_client_nb_get(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag) { } void armci_client_direct_send(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local, ptl_handle_md_t *md_hdl_local) { int rc; ptl_size_t offset_local = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("%d:armci_client_direct_send:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); fflush(stdout); } /*print_mem_desc(md_local);*/ rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc)); armci_die("ptlmdbind send failed",0); } if(armci_must_remotecomplete){ rc = PtlPutRegion(*md_hdl_local,offset_local,bytes, PTL_ACK_REQ, dest_proc,portals->ptl,0, mb,offset_remote, 0); } else{ rc = PtlPutRegion(*md_hdl_local,offset_local,bytes, PTL_NOACK_REQ, dest_proc,portals->ptl,0, mb,offset_remote, 0); } if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_DBG("exit",0); } void armci_portals_put(int proc, void *src_buf, void *dst_buf, int bytes, void** cptr,int tag) { int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); /*first process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=src_buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_info(proc,dst_buf,bytes,&offset_remote); if(DEBUG_COMM){ printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); } cdesc->dest_id = proc; if (tag){ *((comp_desc **)cptr) = cdesc; cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBPUT; /*printf("\n%d:put tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ } else{ cdesc->tag = 0; cdesc->type = ARMCI_PORTALS_PUT; } cdesc->active = 1; armci_client_direct_send(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); if(!tag){ armci_client_complete(0,proc,0,cdesc); /* check this later */ } else portals->outstanding_puts++; ARMCI_PR_DBG("exit",0); } void armci_client_nb_send(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag) { } /*using non-blocking for multiple 1ds inside a 2d*/ void armci_network_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle) { int i, j,tag=0; long idxs,idxd; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue_s[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bvalue_d[MAX_STRIDE_LEVEL]; int bytes = count[0]; void *sptr,*dptr; NB_CMPL_T cptr; ptl_process_id_t dest_proc; ptl_size_t offset_remote; comp_desc *cdesc; int c_info; ptl_md_t *md_local; int rem_info; int cluster = armci_clus_id(proc); ARMCI_PR_DBG("enter",0); printf("%s calling abort ... network_strided not implemented\n",Portals_ID()); abort(); if(nb_handle)tag=nb_handle->tag; /*first remote process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*dest_proc.nid = portals->procid_map[proc].nid; dest_proc.pid = portals->procid_map[proc].pid;*/ rem_info = _get_rem_info(proc,(op==GET)?src_ptr:dst_ptr,bytes,&offset_remote); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue_s[0] = 0; bvalue_s[1] = 0; bunit[0] = 1; bvalue_d[0] = 0; bvalue_d[1] = 0; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue_s[i] = bvalue_d[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } if(ARMCI_ACC(op)){ /*for now die for acc*/ /*lock here*/ # ifdef ARMCI_CHECK_STATE arlist_print(arn); armci_rem_state(armci_clus_info[proc].master%armci_clus_info[0].nslave); # endif printf("\nSHOULD NOT DO NETWORK_STRIDED FOR ACCS \n",armci_me); fflush(stdout); armci_die("network_strided called for acc",proc); } /*loop over #contig chunks*/ for(i=0; i (count[j]-1)) bvalue_s[j] = 0; if(bvalue_d[j] > (count[j]-1)) bvalue_d[j] = 0; } sptr = ((char *)src_ptr)+idxs; dptr = ((char *)dst_ptr)+idxd; cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=(op==GET)?dptr:sptr; md_local->user_ptr = (void *)cdesc; cdesc->dest_id = proc; cdesc->tag = tag; if(op==GET){ md_local->options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; cdesc->active = 1; cdesc->type = ARMCI_PORTALS_NBGET; /* printf("\n%d:reminfo=%d off=%d idxs=%d idxd=%d",armci_me, rem_info, offset_remote, idxs, idxd); */ armci_client_direct_get( dest_proc,offset_remote+idxs,rem_info, bytes,md_local,md_hdl_local); } else if(op==PUT){ cdesc->active = 1; cdesc->type = ARMCI_PORTALS_NBPUT; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; armci_client_direct_send(dest_proc,offset_remote+idxd,rem_info, bytes,md_local,md_hdl_local); if(op==PUT)portals->outstanding_puts++; } else if(ARMCI_ACC(op)){ assert(0); } else{ ARMCI_PR_DBG("exit",0); armci_die("in network_strided unknown opcode",op); } armci_client_complete(0,proc,tag,cdesc); } if(ARMCI_ACC(op)){ /*unlock here*/ } if(nb_handle){ /* completing the last call is sufficient, given ordering semantics*/ nb_handle->tag=tag; nb_handle->cmpl_info=cdesc; } else{ /*completing the last call ensures everything before it is complete this * is one of the main reasons why dataserver is necessary*/ /*armci_client_complete(0,proc,tag,cdesc);*/ } ARMCI_PR_DBG("exit",0); } void armci_client_direct_getput(ptl_process_id_t dest_proc, ptl_size_t offset_remote, ptl_match_bits_t mb, size_t bytes, ptl_md_t *md_local_get,ptl_md_t *md_local_put, ptl_handle_md_t *md_hdl_local_get, ptl_handle_md_t *md_hdl_local_put) { int rc; ptl_size_t offset_get = 0; ptl_size_t offset_put = 0; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("%d:armci_client_direct_getput:BYTES = %d\n",armci_me,bytes); printf("\n%d:offr=%ld\n",armci_me,offset_remote);fflush(stdout); } rc = PtlGetPutRegion(*md_hdl_local_get, offset_get, *md_hdl_local_put, offset_put,bytes,dest_proc, portals->ptl,0,mb, offset_remote,0); if (rc != PTL_OK){ printf("%d:PtlGetPutRegion: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlGetPutRegion failed",0); } ARMCI_PR_DBG("exit",0); } long a_p_putfrom; long a_p_getinto; int armci_portals_rmw_(int op, int *ploc, int *prem, int extra, int proc) { printf("error rmw"); return(0); } void armci_portals_shmalloc_allocate_mem(int num_lks) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ARMCI_PR_DBG("enter",0); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(!ptr_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); PARMCI_Malloc(ptr_arr,bytes); ARMCI_PR_DBG("exit",0); return; } void armci_wait_for_server() { ARMCI_PR_DBG("enter",0); armci_server_terminating=1; armci_serv_quit(); ARMCI_PR_DBG("exit",0); } /*client buffers info*/ void armci_portals_client_buf_info(char *buf, ptl_match_bits_t *mb, ptl_size_t *offset,int proc) { ARMCI_PR_DBG("enter",0); *mb = (1<<30); *offset = buf-client_buf_ptrs[proc]; if(DEBUG_SERV){printf("\n(%d):serv writing to ofset %d on %d\n",armci_me,*offset,proc);fflush(stdout);} ARMCI_PR_DBG("exit",0); } /*memory for client buffers*/ char *armci_portals_client_buf_allocate(int bytes) { void *ptr; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_md_t *md_ptr,md; ptl_process_id_t match_id; ptl_handle_me_t me_h; ptl_handle_md_t md_h; int rc; ARMCI_PR_DBG("enter",sizeof(ptl_match_bits_t)); ptr = malloc(bytes); bzero(ptr,bytes); assert(ptr); mbits = (1<<30); md_ptr = &(md); md_ptr->start = ptr; md_ptr->length = bytes; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = NULL; md_ptr->max_size = 0; /*logic that says, eq_h is now recieving data for the buffers, including acks! */ md_ptr->eq_handle = portals->eq_h; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id, mbits,ignbits,PTL_RETAIN,PTL_INS_AFTER,&(me_h)); if (rc != PTL_OK){ printf("%d:PtlMEAttach: %s\n", portals->rank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("portals attach error2",rc); } rc = PtlMDAttach(me_h,md,PTL_RETAIN,&md_h); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s %d\n", portals->rank, ARMCI_NET_ERRTOSTR(rc),(client_md_count+serv_md_count) ); armci_die("portals attach error CBA",rc); } client_md_count++; client_buf_ptrs[armci_me]=ptr; armci_msg_barrier(); armci_exchange_address(client_buf_ptrs,armci_nproc); ARMCI_PR_DBG("exit",0); return(ptr); } void armci_transport_cleanup() { /*for i=0tomaxpendingclean*/ ARMCI_PR_DBG("enter",0); free(client_buf_ptrs); ARMCI_PR_DBG("exit",0); } void free_serv_bufs() { if(serv_bufs) free(serv_bufs); } int armci_send_req_msg(int proc, void *buf, int bytes,int tag) { #ifndef OLD_PORTALS_CODE int cluster = armci_clus_id(proc); int serv = armci_clus_info[cluster].master; char *buffer = NULL; request_header_t *msginfo = (request_header_t *) buf; // # ifdef PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE _armci_buf_ensure_one_outstanding_op_per_node(buf,cluster); // # endif # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS BUF_INFO_T *bufinfo=_armci_buf_to_bufinfo(msginfo); _buf_ackresp_t *ar = &bufinfo->ar; portals_ds_req_t *req = &ar->req; # endif if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { // printf("%s cp: sending packed put\n",Portals_ID()); # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portals_remote_nbput(buf, buf, cluster, req); // portalsWaitOnRequest(req); # else portals_remote_put(buf, buf, cluster); # endif // printf("%s cp: finished packed put\n",Portals_ID()); } else if(msginfo->operation == GET) { buffer = (char *) buf; buffer += sizeof(request_header_t); buffer += msginfo->dscrlen; // printf("%s cp: sending blocking get request\n",Portals_ID()); # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portals_remote_nbget(buffer, msginfo, cluster, req); // portalsWaitOnRequest(req); # else portals_remote_get(buffer, msginfo, cluster); # endif // printf("%s cp: get request finished\n",Portals_ID()); } else if(msginfo->operation == ACK) { # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS portalsRemoteOperationToNode(buf, bytes, cluster, req); // portalsWaitOnRequest(req); # else portalsBlockingRemoteOperationToNode(buf, bytes, cluster); # endif } else if(msginfo->operation == ARMCI_SWAP || msginfo->operation == ARMCI_SWAP_LONG || msginfo->operation == ARMCI_FETCH_AND_ADD || msginfo->operation == ARMCI_FETCH_AND_ADD_LONG) { buffer = (char *) buf; buffer += sizeof(request_header_t); buffer += msginfo->dscrlen; portals_remote_rmw(buffer, msginfo, cluster, req); # ifndef PORTALS_USE_ARMCI_CLIENT_BUFFERS portalsWaitOnOperation(req); # endif } else { printf("%s cp: msginfo->operation=%d not supported yet\n",Portals_ID(),msginfo->operation); abort(); } # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS /* for now, clear the ackresp structure because the call had to have been blocking later, we will allow a modified x_net_wait_ackresp clear it */ ar->val = ar->valc = 0; if(ar==_buf_ackresp_first)_buf_ackresp_first=ar->next; if(ar->next!=NULL){ ar->next->previous=ar->previous; } if(ar->previous!=NULL){ ar->previous->next=ar->next; if(_buf_ackresp_cur==ar)_buf_ackresp_cur=ar->previous; } if(_buf_ackresp_cur==ar)_buf_ackresp_cur=NULL; ar->previous=ar->next=NULL; # endif return 0; #else int rc; ptl_size_t offset_local = 0, offset_remote=0; ptl_md_t *md_local; ptl_handle_md_t *md_hdl_local; int rem_info; comp_desc *cdesc; void *cptr; ptl_process_id_t dest_proc; int c_info; int cluster = armci_clus_id(proc); int serv = armci_clus_info[cluster].master; request_header_t *msginfo = (request_header_t *)buf; ARMCI_PR_DBG("enter",0); if(msginfo->operation==GET && msginfo->dscrlen<=msginfo->datalen){ *(long *)((char *)(msginfo+1)+msginfo->datalen)=0; } /*badbadbad*/ msginfo->tag.ack_ptr=&(msginfo->tag.ack); cptr = (void *)((double *)buf-1); /*first process information*/ dest_proc.nid = portals->servid_map[cluster].nid; dest_proc.pid = portals->servid_map[cluster].pid; /*create local xfer info*/ cdesc = get_free_comp_desc(&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=buf; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; /*get remote info*/ rem_info = _get_rem_servinfo(cluster,(size_t)bytes,&offset_remote); if(DEBUG_COMM){ printf("\n%d:offr=%ld offl=%ld\n",armci_me,offset_remote,offset_local); } cdesc->dest_id = serv; *((comp_desc **)cptr) = cdesc; if(tag==0)tag=GET_NEXT_NBTAG(); cdesc->tag = tag; cdesc->type = ARMCI_PORTALS_NBPUT; /*printf("\n%d:put tag=%d c_info=%d * %p",armci_me,tag,c_info,cdesc);fflush(stdout);*/ cdesc->active = 1; if(msginfo->operation==PUT || msginfo->operation == UNLOCK || ARMCI_ACC(msginfo->operation)){ _buf_ackresp_cur->valc = _buf_ackresp_cur->val = (char *)msginfo->tag.ack_ptr-client_buf_ptrs[armci_me]; # ifdef ARMCI_CHECK_STATE arlist_add(&arn,_buf_ackresp_cur->val,msginfo->operation); # endif } else { _buf_ackresp_cur->valc = _buf_ackresp_cur->val = (char *)msginfo->tag.data_ptr-client_buf_ptrs[armci_me]; # ifdef ARMCI_CHECK_STATE arlist_add(&arn,_buf_ackresp_cur->val,msginfo->operation); # endif } if(DEBUG_COMM){printf("\n%d:registered %d in val to %d at %d %d\n",armci_me,_buf_ackresp_cur->val,serv,offset_remote,msginfo->operation);fflush(stdout);} _armci_buf_ensure_pend_outstanding_op_per_node(buf,cluster); armci_client_direct_send(dest_proc,offset_remote,(ptl_match_bits_t)rem_info, bytes,md_local,md_hdl_local); /*if(msginfo->operation==GET){ BUF_INFO_T *info=((char *)msginfo-sizeof(BUF_EXTRA_FIELD_T)-sizeof(BUF_INFO_T)); armci_client_complete(0,proc,cdesc->tag,cdesc); }*/ /*armci_client_complete(0,proc,cdesc->tag,cdesc);*/ portals->outstanding_puts++; ARMCI_PR_DBG("exit",0); return 0; #endif } char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len) { #ifndef OLD_PORTALS_CODE # ifdef PORTALS_USE_ARMCI_CLIENT_BUFFERS BUF_INFO_T *bufinfo = _armci_buf_to_bufinfo(msginfo); portals_ds_req_t *req = &bufinfo->ar.req; portalsWaitOnRequest(req); # endif char *ret = (char *) msginfo; ret += sizeof(request_header_t); ret += msginfo->dscrlen; return ret; #else long *flag; int loop; BUF_INFO_T *bufinfo=_armci_buf_to_bufinfo(msginfo); ARMCI_PR_DBG("enter",0); if(len) flag = (long *)((char *)(msginfo+1)+len); else flag = (long *)((char *)(msginfo+1)+msginfo->datalen); x_net_wait_ackresp(&(bufinfo->ar)); while(armci_util_long_getval(flag) != ARMCI_TAIL){ loop++; loop %=100000; if(loop==0){ if(DEBUG_COMM){ printf("%d: client flag(%p)=%ld off=%d %d\n", armci_me,flag,*flag,msginfo->datalen,*((int*)(msginfo+1))); fflush(stdout); } } } *flag=0; ARMCI_PR_DBG("exit",0); return (msginfo+1); #endif } #ifdef ARMCI_CHECK_STATE extern void sarlist_add(int,int,long); #endif void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf) { #ifndef OLD_PORTALS_CODE ptl_size_t bytes = (ptl_size_t) msginfo->datalen; ptl_event_t *ev = (ptl_event_t *) msginfo->tag.user_ptr; portals_ds_send_put(buf, msginfo->datalen, ev->initiator, ev->hdr_data); // you could do an assertion that the portals_id_map of proc == ev->initiator #else long *tail; int bytes; void *dst_addr = msginfo->tag.data_ptr; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_md_t *md_ptr,md; ptl_process_id_t match_id; ptl_handle_me_t me_h; ptl_size_t offst,localoffset; int rc; /* set tail ack, make sure it is alligned */ ARMCI_PR_SDBG("enter",0); bytes = msginfo->datalen+sizeof(long); if(!(buf>=serv_bufs->buf && bufbufend)){ bcopy(buf,(msginfo+1),bytes); buf=(msginfo+1); } tail = (long*)(buf + msginfo->datalen); *tail = ARMCI_TAIL; armci_portals_client_buf_info((char *)dst_addr,&mbits,&offst,proc); # ifdef ARMCI_CHECK_STATE sarlist_add(proc,msginfo->operation,offst); # endif match_id.nid = portals->procid_map[proc].nid; match_id.pid = portals->procid_map[proc].pid; localoffset=(char *)buf-(char *)serv_bufs->buf; if(DEBUG_COMM){ printf("\n(%d):dst=%p,mbits=%d,localoffset=%d,offst=%d,proc=%d,nid=%d,pid=%d len=%d\n",armci_me, dst_addr,mbits,localoffset,offst,proc,portals->procid_map[proc].nid, portals->procid_map[proc].pid,bytes);fflush(stdout); } rc = PtlPutRegion(serv_response_md_h,localoffset,bytes,PTL_NOACK_REQ, match_id,portals->ptl,0,mbits,offst,0); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_SDBG("exit",0); #endif } void armci_rcv_req(void *mesg,void *phdr,void *pdescr,void *pdata,int *buflen) { int i,na; char *a; double *tmp; request_header_t *msginfo = (request_header_t *)mesg; ARMCI_PR_SDBG("enter",msginfo->operation); *(void **)phdr = msginfo; if(0){ printf("%s [ds]: got %d req (hdrlen=%d dscrlen=%d datalen=%d %d) from %d\n", Portals_ID(), msginfo->operation, sizeof(request_header_t), msginfo->dscrlen, msginfo->datalen, msginfo->bytes,msginfo->from); fflush(stdout); } /* we leave room for msginfo on the client side */ *buflen = MSG_BUFLEN - sizeof(request_header_t); if(msginfo->bytes) { *(void **)pdescr = msginfo+1; *(void **)pdata = msginfo->dscrlen + (char*)(msginfo+1); if(msginfo->operation == GET) { // the descriptor will exists after the request header // but there will be no data buffer // use the MessageRcvBuffer *(void**) pdata = MessageSndBuffer; // printf("%s (server) overriding pdata in rcv_req\n",Portals_ID()); } printf("%s [ds] oper=%d; bytes=%d\n",armci_me,msginfo->operation,msginfo->bytes); } else { printf("%s [ds] bytes=%d\n",armci_me,msginfo->bytes); *(void**)pdescr = NULL; *(void**)pdata = MessageRcvBuffer; } ARMCI_PR_SDBG("exit",msginfo->operation); } void armci_call_data_server() { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; serv_buf_t *compbuf = NULL; int loop=1; int temp_proc; int ccc=2,rrr; cpu_set_t mycpuid,new_mask; char str[CPU_SETSIZE]; char ncid[8],*cidptr,cid[8]; extern char * cpuset_to_cstr(cpu_set_t *mask, char *str); ARMCI_PR_SDBG("enter",0); //if(armci_me==0)unsetenv("CRAY_PORTALS_USE_BLOCKING_POLL"); sprintf (cid, "%d", ccc); rrr = cstr_to_cpuset(&new_mask,cid); /* ------------------------------------------------------------ *\ Change affinity for the data server \* ------------------------------------------------------------ */ if(sched_setaffinity(0, sizeof (new_mask), &new_mask)) { perror("sched_setaffinity"); printf("failed to set pid %d's affinity.\n", getpid()); } if(DEBUG_SERV){ rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if(rrr)perror("sched_getaffinity"); cidptr = cpuset_to_cstr(&mycpuid,ncid); printf("(%d):my affinity is to %s\n",armci_me,ncid); fflush(stdout); } /* ------------------------------------- *\ Main data server loop \* ------------------------------------- */ while(armci_server_terminating==0){ /* ------------------------------------------------------------ *\ check event queue for incoming data requests from remote CPs \* ------------------------------------------------------------ */ ev->type=0; if((rc = PtlEQWait(portals->Seq_h, ev)) != PTL_OK){ printf("(%d):PtlEQWait(): %d %s\n", armci_me,rc,ARMCI_NET_ERRTOSTR(rc) ); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { printf("(%d)%d,%d:NI sent %d in event.\n", armci_me,portals->Srank.nid, portals->Srank.pid,ev->ni_fail_type); fflush(stdout); armci_die2("event failure problem",ev->initiator.nid,ev->initiator.pid); } if(DEBUG_SERV){ printf("\n(%d):armci_call_data_server: ptl event detected=%d\n",armci_me,ev->type); fflush(stdout); } /* ------------------------------------------------------------ *\ PTL_EVENT_SEND_END: is ignored. This event is triggered as the DS returns data to a remote CP via a PtlPut. This event signals that that PtlPut has complete. \* ------------------------------------------------------------ */ if(ev->type == PTL_EVENT_SEND_END) continue; /* ------------------------------------------------------------ *\ PTL_EVENT_PUT_END: this is the key portals event for the DS. PUT_END signifies that a remote data request has come in from a remote CP. This data request will be handled by the data server: armci_data_server \* ------------------------------------------------------------ */ else if(ev->type == PTL_EVENT_PUT_END) { if(DEBUG_SERV) { printf("\n(%d):ev->offset=%d from %d%d",armci_me,ev->offset, ev->initiator.pid,ev->initiator.nid); fflush(stdout); } armci_data_server(((char *)serv_bufs->buf+ev->offset)); } /* ------------------------------------------------------------ *\ Unexpected Portals Event -- Panic! \* ------------------------------------------------------------ */ else { armci_die("unexpected event in data server",ev->type); } } ARMCI_PR_SDBG("exit",0); } void x_buf_wait_ack(request_header_t *msginfo, BUF_INFO_T *bufinfo) { ARMCI_PR_DBG("enter",bufinfo->ar.val); if(DEBUG_COMM){printf("\n%d:waiting for ack at %p",armci_me,&(msginfo->tag.ack));fflush(stdout);} x_net_wait_ackresp(&(bufinfo->ar)); armci_util_wait_long(&(msginfo->tag.ack),ARMCI_STAMP,10000); if(DEBUG_COMM){printf("\n%d:done waiting for ack at %p",armci_me,&(msginfo->tag.ack));fflush(stdout);} msginfo->tag.ack=0; ARMCI_PR_DBG("exit",0); } void x_net_send_ack(request_header_t *msginfo, int proc,void *dst,void *src) { long *tail; int bytes=sizeof(long); ptl_size_t offst; ptl_match_bits_t ignbits = 0xFFFFFFFF0FFFFFFF; ptl_match_bits_t mbits = 1; ptl_process_id_t match_id; int rc; /* set tail ack, make sure it is alligned */ ARMCI_PR_SDBG("enter",0); armci_portals_client_buf_info((char *)dst,&mbits,&offst,proc); # ifdef ARMCI_CHECK_STATE sarlist_add(proc,msginfo->operation,offst); # endif match_id.nid = portals->procid_map[proc].nid; match_id.pid = portals->procid_map[proc].pid; if(DEBUG_SERV){ printf("\n(%d):dst=%p,mbits=%d,offst=%d,proc=%d,nid=%d,pid=%d len=%d\n",armci_me, dst,mbits,offst,proc,portals->procid_map[proc].nid, portals->procid_map[proc].pid,bytes);fflush(stdout); } rc = PtlPutRegion(serv_ack_md_h,0,bytes,PTL_NOACK_REQ, match_id,portals->ptl,0,mbits,offst,0); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->Srank, ARMCI_NET_ERRTOSTR(rc) ); armci_die("PtlPutRegion failed",0); } ARMCI_PR_SDBG("exit",0); } long x_net_offset(char *buf,int proc) { #ifdef ARMCI_REGISTER_SHMEM int i; #if NEW_MALLOC if((i=check_meminfo(buf,1,proc))==0) armci_die("x_net_offset,reg not found",proc); return(all_meminfo[proc].serv_offs[i]); #else ARMCI_PR_DBG("enter",_rem_meminfo[proc].reg_count); if(DEBUG_COMM){printf("\n%d:%s:buf=%p",armci_me,__FUNCTION__,buf);fflush(stdout); } for(i=0;i<_rem_meminfo[proc].reg_count;i++){ if(IN_REGION(buf,_rem_meminfo[proc].reginfo[i])){ #ifdef DEBUG_MEM {printf("\n%d:found it in reg=%d (%p,%d) for proc=%d",armci_me,i,_rem_meminfo[proc].reginfo[i].base_ptr,_rem_meminfo[proc].reginfo[i].size,proc);} #endif return((long)((char *)_rem_meminfo[proc].reginfo[i].serv_ptr-(char *)_rem_meminfo[proc].reginfo[i].base_ptr)); } } #endif ARMCI_PR_DBG("exit",0); #else printf("x_net_offset called; this shouldn't happen ...\n"); abort(); #endif } void armci_set_serv_mutex_arr(void *ptr) { int i; long offset; ARMCI_PR_DBG("enter",0); offset=x_net_offset(ptr,armci_me); _armci_server_mutex_ready=1; _armci_server_mutex_ptr = (char *)ptr+offset; ARMCI_PR_DBG("exit",0); } ga-5-4/armci/src-gemini/armci-onesided.h0000644000175000017500000000721612662210416016222 0ustar mbamba#ifndef __ARMCI_ONESIDED_H__ #define __ARMCI_ONESIDED_H__ #include "onesided.h" #define NUM_SERV_BUFS 1 #define MAX_MEM_REGIONS 30 #define ARMCI_BUF_SIZE 262144 #define ARMCI_SMALL_BUF_SIZE 2048 #define ARMCI_MAX_BUFS 4 #define ARMCI_MAX_SMALL_BUFS 8 #define ARMCI_MAX_DESCRIPTORS (ARMCI_MAX_BUFS+ARMCI_MAX_SMALL_BUFS) #define ARMCI_MAX_REQUEST_SIZE ARMCI_SMALL_BUF_SIZE /* There is a problem with ga_transpose when CRAY_REGISTER_ARMCI_MALLOC is defined. The fix is a special hook in ga_transpose to turn off the direct puts during the transpose. This may indicate a race condition in the transpose code or a problem with the direct fencing. */ #define CRAY_REGISTER_ARMCI_MALLOC #define ARMCI_LIMIT_REMOTE_REQUESTS_BY_NODE_TURNED_OFF #define MAX_OUTSTANDING_ONESIDED_GETS 64 #define ARMCI_ONESIDED_GETS_USES_NBGETS /* typedefs */ typedef struct armci_onesided_msg_tag_s { int msgid; cos_mdesc_t response_mdesc; } armci_onesided_msg_tag_t; typedef struct remote_mdh_node { void **ptrs; cos_mdesc_t *mdhs; struct remote_mdh_node *next; } remote_mdh_node_t; // linked-list of remote mdhs // a new node is created on each ARMCI_Malloc operation // not an ideal scenario -- perhaps use Abhinav's new dreg routines // to store this data ... it would require two pieces of info ... // remote target and remote virtual addr ... and return the mdh // for now: manually look up the mdh in ARMCI_GetS and ARMCI_PutS extern remote_mdh_node_t *remote_mdh_base_node; /* functions */ int armci_onesided_init(); void armci_transport_cleanup(); void armci_rcv_req(void *,void *,void *,void *,int *); void print_data(void *); void armci_onesided_search_remote_mdh_list(void* tgt_ptr, int proc, cos_mdesc_t *mdh); void armci_onesided_remove_from_remote_mdh_list(void *tgt_ptr); #if defined CRAY_REGISTER_ARMCI_MALLOC && HAVE_ONESIDED_FADD void armci_onesided_fadd(void *ploc, void *prem, int extra, int proc); #endif extern int armci_onesided_direct_get_enabled; extern int armci_onesided_direct_put_enabled; extern cos_desc_t __global_1sided_direct_comm_desc; extern cos_desc_t __global_1sided_direct_get_comm_desc; /* set up internals */ #ifdef MAX_BUFS #error "MAX_BUFS should not be defined yet" #else #define MAX_BUFS ARMCI_MAX_BUFS #endif #ifdef MAX_SMALL_BUFS #error "MAX_SMALL_BUFS should not be defined yet" #else #define MAX_SMALL_BUFS ARMCI_MAX_SMALL_BUFS #endif #ifdef MSG_BUFLEN_DBL #error "MSG_BUFLEN_DBL should not be defined yet" #else #define MSG_BUFLEN_DBL ARMCI_BUF_SIZE #endif /* for buffers */ extern char **client_buf_ptrs; #define BUF_ALLOCATE armci_portals_client_buf_allocate //define BUF_EXTRA_FIELD_T comp_desc* //define INIT_SEND_BUF(_field,_snd,_rcv) _snd=1;_rcv=1;_field=NULL #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release //define CLEAR_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op) if((_op==UNLOCK || _op==PUT || ARMCI_ACC(_op)) && _field!=NULL)x_buf_wait_ack((request_header_t *)((void **)&(_field)+1),((char *)&(_field)-sizeof(BUF_INFO_T)));_field=NULL; //define TEST_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op,_ret) #define CLEAR_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op) #define TEST_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op,_ret) #define COMPLETE_HANDLE _armci_buf_complete_nb_request //define NB_CMPL_T comp_desc* #if 0 #define ARMCI_NB_WAIT(_cntr) if(_cntr){\ int rc;\ if(nb_handle->tag)\ if(nb_handle->tag==_cntr->tag)\ rc = armci_client_complete(0,nb_handle->proc,nb_handle->tag,_cntr);\ } else{\ printf("\n%d:wait null ctr\n",armci_me);} #endif #define ARMCI_NB_WAIT(_cntr) #endif ga-5-4/armci/src-gemini/strided.c0000644000175000017500000016304312662210416014771 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #include #include extern int cos_me; #define DATA_SERVER_ 1 // by default use the ds remote gets #define ORNL_USE_DS_FOR_REMOTE_GETS #ifdef ORNL_USE_DS_FOR_REMOTE_GETS #define DATA_SERVER_GET_ 1 #else #define DATA_SERVER_GET_ 0 #endif #define ARMCI_OP_2D(op, scale, proc, src, dst, bytes, count, src_stride, dst_stride,lockit)\ if(op == GET || op ==PUT)\ armci_copy_2D(op, proc, src, dst, bytes, count, src_stride,dst_stride);\ else if(count==1) armci_acc_1D(op, scale, proc, src, dst, bytes,lockit);\ else\ armci_acc_2D(op, scale, proc, src, dst, bytes, count, src_stride,dst_stride,lockit) /* macro supports run-time selection of request sending scheme */ #if defined(CLIENT_BUF_BYPASS) #define CAN_REQUEST_DIRECTLY _armci_bypass #else # if defined(HITACHI) # define CAN_REQUEST_DIRECTLY 0 # else # define CAN_REQUEST_DIRECTLY 1 # endif #endif #define PREPROCESS_STRIDED(tmp_count) {\ tmp_count=0;\ if(stride_levels) \ for(;stride_levels;stride_levels--)if(count[stride_levels]>1)break;\ if(stride_levels&&(count[0]==src_stride_arr[0]&&count[0]==dst_stride_arr[0])){\ tmp_count=seg_count[1];\ count = seg_count+1;\ seg_count[1] = seg_count[0] * seg_count[1];\ stride_levels --;\ src_stride_arr ++; dst_stride_arr++ ;\ }\ } #define POSTPROCESS_STRIDED(tmp_count) if(tmp_count)seg_count[1]=tmp_count #define SERVER_PUT 1 #define SERVER_NBPUT 2 #define DIRECT_PUT 3 #define DIRECT_NBPUT 4 #define SERVER_GET 5 #define SERVER_NBGET 6 #define DIRECT_GET 7 #define DIRECT_NBGET 8 #define ONESIDED_PUT 9 #define ONESIDED_GET 10 # define DO_FENCE(__proc,__prot) \ if(__prot==SERVER_GET); \ else if(__prot==SERVER_PUT); \ else if(__prot==DIRECT_GET || __prot==DIRECT_NBGET) { \ if(armci_prot_switch_fence[__proc]==SERVER_PUT) \ ARMCI_DoFence(__proc); \ } \ else if(__prot==DIRECT_PUT || __prot==DIRECT_NBPUT) { \ if(armci_prot_switch_fence[__proc]==SERVER_PUT) \ ARMCI_DoFence(__proc); \ } \ else if(__prot==ONESIDED_GET) { \ if(armci_prot_switch_fence[__proc]==SERVER_PUT) { \ ARMCI_DoFence(__proc); \ } \ } \ else if(__prot==ONESIDED_PUT); \ else; \ armci_prot_switch_fence[__proc]=__prot #ifndef REGIONS_REQUIRE_MEMHDL # define ARMCI_MEMHDL_T void #endif ARMCI_MEMHDL_T *mhloc=NULL,*mhrem=NULL; #ifdef REGIONS_REQUIRE_MEMHDL int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl); # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found_hndl((_s),(_d),(_b),(_p),&mhloc,&mhrem) #else # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found((_s),(_d),(_b),(_p)) #endif #ifdef HAS_RDMA_GET # ifdef REGIONS_REQUIRE_MEMHDL void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** cptr,int nbtag,ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl); # else void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** contextptr,int nbtag,void *mhdl,void *mhdl1); # endif # define ARMCI_NBREM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],&((_hdl)->cmpl_info),(_hdl)->tag,(void *)mhloc,(void *)mhrem); \ # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],NULL,0,(void *)mhloc,(void *)mhrem); \ #else # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_rem_get((_p),(_s),(_sst),(_d),(_dst),(_cou),(_lev),(_hdl),(void *)mhloc,(void *)mhrem) # define ARMCI_NBREM_GET ARMCI_REM_GET #endif extern int* armci_prot_switch_fence; extern int armci_prot_switch_preproc; extern int armci_prot_switch_preop; int armci_iwork[MAX_STRIDE_LEVEL]; /*\ 2-dimensional array copy \*/ static void armci_copy_2D(int op, int proc, void *src_ptr, void *dst_ptr, int bytes, int count, int src_stride, int dst_stride) { int armci_th_idx = ARMCI_THREAD_IDX; #ifdef LAPI2__ # define COUNT 1 #else # define COUNT count #endif #ifdef __crayx1 int shmem = 1; #else int shmem = SAMECLUSNODE(proc); #endif if(shmem) { /* data is in local/shared memory -- can use memcpy */ // printf("%s: shmem==true; count==%d\n",Portals_ID(),count); if(count==1){ armci_copy(src_ptr, dst_ptr, bytes); // printf("%s: shmem==true; finished\n",Portals_ID(),count); }else { char *ps=(char*)src_ptr; char *pd=(char*)dst_ptr; int j; for (j = 0; j < count; j++){ bcopy(ps,pd,bytes); ps += src_stride; pd += dst_stride; } } } else { /* data not in local/shared memory-access through global address space*/ if(op==PUT){ // printf("%s: pre UPDATE_FENCE_STATE\n",Portals_ID()); UPDATE_FENCE_STATE(proc, PUT, COUNT); // printf("%s: post UPDATE_FENCE_STATE\n",Portals_ID()); #ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx],COUNT); #endif if(count==1){ armci_put(src_ptr, dst_ptr, bytes, proc); }else{ armci_put2D(proc, bytes, count, src_ptr, src_stride, dst_ptr, dst_stride); } }else{ #ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], COUNT); #endif if(count==1){ armci_get(src_ptr, dst_ptr, bytes, proc); }else{ armci_get2D(proc, bytes, count, src_ptr, src_stride, dst_ptr, dst_stride); } } } } #if (defined(CRAY) && !defined(__crayx1)) || defined(FUJITSU) #ifdef CRAY # define DAXPY SAXPY #else # define DAXPY daxpy_ #endif static int ONE=1; #define THRESH_ACC 32 static void daxpy_2d_(void* alpha, int *rows, int *cols, void *a, int *ald, void* b, int *bld) { int c,r; double *A = (double*)a; double *B = (double*)b; double Alpha = *(double*)alpha; if(*rows < THRESH_ACC) for(c=0;c<*cols;c++) for(r=0;r<*rows;r++) A[c* *ald+ r] += Alpha * B[c* *bld+r]; else for(c=0;c<*cols;c++) DAXPY(rows, alpha, B + c* *bld, &ONE, A + c* *ald, &ONE); } #endif void armci_acc_1D(int op, void *scale, int proc, void *src, void *dst, int bytes, int lockit) { int rows; void (*func)(void*, void*, void*, int*); ARMCI_PR_DBG("enter",0); switch (op){ case ARMCI_ACC_INT: rows = bytes/sizeof(int); func = I_ACCUMULATE_1D; break; case ARMCI_ACC_LNG: rows = bytes/sizeof(long); func = L_ACCUMULATE_1D; break; case ARMCI_ACC_DBL: rows = bytes/sizeof(double); func = D_ACCUMULATE_1D; break; case ARMCI_ACC_DCP: rows = bytes/(2*sizeof(double)); func = Z_ACCUMULATE_1D; break; case ARMCI_ACC_CPL: rows = bytes/(2*sizeof(float)); func = C_ACCUMULATE_1D; break; case ARMCI_ACC_FLT: rows = bytes/sizeof(float); func = F_ACCUMULATE_1D; break; default: armci_die("ARMCI accumulate: operation not supported",op); func = F_ACCUMULATE_1D; /*avoid compiler whining */ } if(lockit){ ARMCI_LOCKMEM(dst, bytes + (char*)dst, proc); } func(scale, dst, src, &rows); if(lockit)ARMCI_UNLOCKMEM(proc); ARMCI_PR_DBG("exit",0); } /*\ 2-dimensional accumulate \*/ void armci_acc_2D(int op, void* scale, int proc, void *src_ptr, void *dst_ptr, int bytes, int cols, int src_stride, int dst_stride, int lockit) { int rows, lds, ldd, span; void (*func)(void*, int*, int*, void*, int*, void*, int*); ARMCI_PR_DBG("enter",0); /* if((long)src_ptr%ALIGN)armci_die("src not aligned",(long)src_ptr); if((long)dst_ptr%ALIGN)armci_die("src not aligned",(long)dst_ptr); */ switch (op){ case ARMCI_ACC_INT: rows = bytes/sizeof(int); ldd = dst_stride/sizeof(int); lds = src_stride/sizeof(int); func = I_ACCUMULATE_2D; break; case ARMCI_ACC_LNG: rows = bytes/sizeof(long); ldd = dst_stride/sizeof(long); lds = src_stride/sizeof(long); func = L_ACCUMULATE_2D; break; case ARMCI_ACC_DBL: rows = bytes/sizeof(double); ldd = dst_stride/sizeof(double); lds = src_stride/sizeof(double); func = D_ACCUMULATE_2D; break; case ARMCI_ACC_DCP: rows = bytes/(2*sizeof(double)); ldd = dst_stride/(2*sizeof(double)); lds = src_stride/(2*sizeof(double)); func = Z_ACCUMULATE_2D; break; case ARMCI_ACC_CPL: rows = bytes/(2*sizeof(float)); ldd = dst_stride/(2*sizeof(float)); lds = src_stride/(2*sizeof(float)); func = C_ACCUMULATE_2D; break; case ARMCI_ACC_FLT: rows = bytes/sizeof(float); ldd = dst_stride/sizeof(float); lds = src_stride/sizeof(float); func = F_ACCUMULATE_2D; break; case ARMCI_ACC_RA: rows = bytes/sizeof(long); ldd = dst_stride/sizeof(long); lds = src_stride/sizeof(long); func = RA_ACCUMULATE_2D_; break; default: armci_die("ARMCI accumulate: operation not supported",op); func = F_ACCUMULATE_2D; /*avoid compiler whining */ } if(lockit){ span = cols*dst_stride; ARMCI_LOCKMEM(dst_ptr, span + (char*)dst_ptr, proc); } func(scale, &rows, &cols, dst_ptr, &ldd, src_ptr, &lds); if(lockit)ARMCI_UNLOCKMEM(proc); ARMCI_PR_DBG("exit",0); } /*\ compute range of strided data AND lock it \*/ static void armci_lockmem_patch(void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc) { long span = count[stride_levels]; ARMCI_PR_DBG("enter",0); span *= dst_stride_arr[stride_levels-1]; /* lock region of remote memory */ ARMCI_LOCKMEM(dst_ptr, span + (char*)dst_ptr, proc); ARMCI_PR_DBG("exit",0); } /*\ strided accumulate on top of remote memory copy: * copies remote data to local buffer, accumulates, puts it back * Note: if we are here then remote patch must fit in the ARMCI buffer \*/ int armci_acc_copy_strided(int optype, void* scale, int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels) { void *buf_ptr = armci_internal_buffer; int rc, i, *buf_stride_arr = armci_iwork; ARMCI_PR_DBG("enter",0); armci_lockmem_patch(dst_ptr,dst_stride_arr, count, stride_levels, proc); /* setup stride array for internal buffer */ buf_stride_arr[0]=count[0]; for(i=0; i< stride_levels; i++) { buf_stride_arr[i+1]= buf_stride_arr[i]*count[i+1]; } /* get remote data to local buffer */ rc = armci_op_strided(GET, scale, proc, dst_ptr, dst_stride_arr, buf_ptr, buf_stride_arr, count, stride_levels, 0,NULL); if(rc) { ARMCI_UNLOCKMEM(proc); return(rc); } /* call local accumulate with lockit=0 (we locked it already) and proc=me */ rc = armci_op_strided(optype, scale, armci_me, src_ptr, src_stride_arr, buf_ptr,buf_stride_arr, count, stride_levels,0,NULL); if(rc) { ARMCI_UNLOCKMEM(proc); return(rc); } /* put data back from the buffer to remote location */ rc = armci_op_strided(PUT, scale, proc, buf_ptr, buf_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels,0,NULL); FENCE_NODE(proc); /* make sure put completes before unlocking */ ARMCI_UNLOCKMEM(proc); /* release memory lock */ ARMCI_PR_DBG("exit",0); return(rc); } /*\ Strided operation \*/ int armci_op_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int lockit, armci_ihdl_t nb_handle) { char *src = (char*)src_ptr, *dst=(char*)dst_ptr; int s2, s3, i,j, unlockit=0; int total_of_2D; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",op); # if defined(ACC_COPY) # ifdef ACC_SMP if(ARMCI_ACC(op) && !(SAMECLUSNODE(proc)) ) # else if ( ARMCI_ACC(op) && proc!=armci_me) # endif /* copy remote data, accumulate, copy back*/ return (armci_acc_copy_strided(op,scale, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels)); else; /* do it directly through shared/local memory */ # endif if(ARMCI_ACC(op) && (stride_levels>2) && lockit){ /* we need one lock operation only - must be done outside 2d acc */ armci_lockmem_patch(dst_ptr,dst_stride_arr, count, stride_levels, proc); unlockit=1; lockit =0; } /* if(proc!=armci_me) INTR_OFF;*/ if(armci_me>=0 && !SAMECLUSNODE(proc)) { printf("%d network_strided not supported (in op_strided)\n",cos_me); abort(); # if 0 armci_network_strided(op,scale,proc,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,nb_handle); # endif } else { // printf("%s in large switch stmt in op_strided (stride_levels=%d)\n",Portals_ID(),stride_levels); switch (stride_levels) { case 0: /* 1D copy */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], 1, count[0], count[0], lockit); break; case 1: /* 2D op */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); break; case 2: /* 3D op */ for (s2= 0; s2 < count[2]; s2++){ /* 2D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit ); } break; case 3: /* 4D op */ for(s3=0; s3< count[3]; s3++){ src = (char*)src_ptr + src_stride_arr[2]*s3; dst = (char*)dst_ptr + dst_stride_arr[2]*s3; for (s2= 0; s2 < count[2]; s2++){ /* 3D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1],src_stride_arr[0], dst_stride_arr[0],lockit); } } break; default: /* N-dimensional */ { /* stride_levels is not the same as ndim. it is ndim-1 * For example a 10x10x10... array, suppose the datatype is byte * the stride_arr is 10, 10x10, 10x10x10 .... */ index[2] = 0; unit[2] = 1; total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } ARMCI_OP_2D(op, scale, proc, src, dst, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); } } } } // ends else block // printf("%s after switch stmt; prior to fence/lock\n",Portals_ID()); if(unlockit){ # if defined(ACC_COPY) FENCE_NODE(proc); # endif ARMCI_UNLOCKMEM(proc); /* release memory lock */ } // printf("%s after fence/lock; leaving op_strided\n",Portals_ID()); ARMCI_PR_DBG("exit",op); return 0; } int PARMCI_PutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { int rc=0, direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; ORDER(PUT,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ if(stride_levels) direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif // printf("%s direct=%d, proc=%d\n",Portals_ID(),direct,proc); if(!direct){ # ifdef CRAY_REGISTER_ARMCI_MALLOC if (stride_levels == 0 && armci_onesided_direct_put_enabled) { // maybe move this to just before the operation happen of even after it happens // it's possible we may want to skip the ONESIDED_PUT and do a SERVER_PUT if we can't find the remote mdh DO_FENCE(proc,SERVER_PUT); // local variable within stride_level == 0 scope cos_desc_t *comm_desc = &__global_1sided_direct_comm_desc; onesided_hnd_t cp_hnd; cos_mdesc_t local_mdh, remote_mdh; // find remote mdh armci_onesided_search_remote_mdh_list(dst_ptr, proc, &remote_mdh); // register local memory -- this should use abhinav's dreg routines cpMemRegister(src_ptr, count[0], &local_mdh); // onesided_mem_register(cp_hnd, src_ptr, count[0], NULL, &local_mdh); // get the onesided v2.0 api handle for the compute process cpGetOnesidedHandle(&cp_hnd); // initialize onesided communication descriptor onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, comm_desc); // initiate put onesided_put_nb(comm_desc); // complete put [locally] onesided_wait(comm_desc); // deregister memory -- if we were using the dreg routines, we would let the // dreg memory do this for us "on demand" = lazy mem deregisteration cpMemDeregister(&local_mdh); // onesided_mem_deregister(cp_hnd, &local_mdh); // issue a flushing get - does nothing to fix the fence problem /* static long flushaddr = 911; cpMemRegister(&flushaddr, sizeof(long), &local_mdh); onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, NULL, comm_desc); onesided_get_nb(comm_desc); onesided_wait(comm_desc); cpMemDeregister(&local_mdh); */ // done! goto fn_exit; } else # endif { DO_FENCE(proc,SERVER_PUT); // printf("%s calling pack_strided in PARMCI_PutS\n",Portals_ID()); rc = armci_pack_strided(PUT, NULL, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels, NULL, -1, -1, -1,NULL); } } else { if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_PUT); // printf("%s calling op_strided in PARMCI_PutS\n",Portals_ID()); rc = armci_op_strided( PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count,stride_levels, 0,NULL); } POSTPROCESS_STRIDED(tmp_count); #ifdef ARMCI_PROFILE armci_profile_stop_strided(ARMCI_PROF_PUTS); #endif fn_exit: ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_PutS_flag( void* src_ptr, /* pointer to 1st segment at source */ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination */ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level, count[0] = #bytes */ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ) { int bytes; /* Put local data on remote processor */ PARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); /* Send signal to remote processor that data transfer has * been completed. */ bytes = sizeof(int); PARMCI_Put(&val, flag, bytes, proc); return 1; } int PARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc) { return PARMCI_PutS_flag(src, NULL, dst, NULL, &bytes, 0, f, v, proc); } int PARMCI_PutS_flag_dir(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, int *flag, int val, int proc) { return PARMCI_PutS_flag(src_ptr, src_stride_arr,dst_ptr,dst_stride_arr, seg_count, stride_levels, flag, val, proc); } int PARMCI_GetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { int rc,direct=1; int *count=seg_count, tmp_count=0; ARMCI_PR_DBG("enter",proc); #ifdef ARMCI_ONESIDED_GETS_USES_NBGETS armci_hdl_t nb_handle; ARMCI_INIT_HANDLE(&nb_handle); PARMCI_NbGetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, seg_count, stride_levels, proc, &nb_handle); rc = PARMCI_Wait(&nb_handle); #else if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0||proc>=armci_nproc){printf("\n%d:%s:proc=%d",armci_me,__FUNCTION__,proc);fflush(stdout);return FAIL5;} ORDER(GET,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); direct=SAMECLUSNODE(proc); # ifdef CRAY_REGISTER_ARMCI_MALLOC if(!direct && armci_onesided_direct_get_enabled) { onesided_hnd_t cp_hnd; cpGetOnesidedHandle(&cp_hnd); cos_mdesc_t local_mdh, remote_mdh, *mdh = NULL; int node = armci_clus_id(proc); if(stride_levels == 0) { // if a strided put/acc is outstanding to proc, then we need to ensure that is completed // we allow the maximum possible overlap for strided puts/acc. that means they are not fully blocking // calls. they are however, guaranteed to be complete prior to another request being sent. DO_FENCE(proc,ONESIDED_GET); // local varaibles cos_desc_t *comm_desc = &__global_1sided_direct_get_comm_desc; // printf("[cp %d]: direct remote get - src=%p; dst=%p; tgt_rank=%d; tgt_node=%d\n",armci_me,src_ptr,dst_ptr,proc,node); // find remote mdh armci_onesided_search_remote_mdh_list(src_ptr, proc, &remote_mdh); // register local memory -- will use UDREG if ONESIDED_USE_UDREG is active cpMemRegister(dst_ptr, count[0], &local_mdh); // onesided_mem_register(cp_hnd, src_ptr, count[0], NULL, &local_mdh); // initialize onesided communication descriptor onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, comm_desc); // initiate get onesided_get_nb(comm_desc); // complete put [locally] onesided_wait(comm_desc); // deregister memory -- if we were using the dreg routines, we would let the // dreg memory do this for us "on demand" = lazy mem deregisteration cpMemDeregister(&local_mdh); // onesided_mem_deregister(cp_hnd, &local_mdh); // done! rc=0; goto fn_exit; } else { DO_FENCE(proc,ONESIDED_GET); int i,j,id; long src_idx; /* index offset of the current block position to src_ptr */ long dst_idx; /* index offset of the current block position to dst_ptr */ int n1dim; /* number of 1-dimensional blocks to xfer */ int bvalue[MAX_STRIDE_LEVEL]; int bunit[MAX_STRIDE_LEVEL]; cos_desc_t cds[MAX_OUTSTANDING_ONESIDED_GETS]; uint64_t src_addr, dst_addr; n1dim = 1; for(i=1; i<=stride_levels; i++) { n1dim *= count[i]; } bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0,id=0; i (count[j]-1)) bvalue[j] = 0; } src_addr = (uint64_t) ((char *) src_ptr + src_idx); dst_addr = (uint64_t) ((char *) dst_ptr + dst_idx); if(i >= MAX_OUTSTANDING_ONESIDED_GETS) { if(id == MAX_OUTSTANDING_ONESIDED_GETS) id=0; onesided_wait(&cds[id]); cpMemDeregister(&cds[id].local_mdesc); } armci_onesided_search_remote_mdh_list((void*)src_addr, proc, &remote_mdh); cpMemRegister((void*)dst_addr, count[0], &local_mdh); onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, &cds[id]); onesided_get_nb(&cds[id]); id++; } // finish up any outstanding requests int count = n1dim; if(MAX_OUTSTANDING_ONESIDED_GETS < n1dim) count = MAX_OUTSTANDING_ONESIDED_GETS; for(i=0; i MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; ORDER(optype,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ direct=SAMECLUSNODE(proc); #endif # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct) rc = armci_op_strided(optype,scale, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,1,NULL); else{ DO_FENCE(proc,SERVER_PUT); rc = armci_pack_strided(optype,scale,proc,src_ptr, src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,NULL,-1,-1,-1,NULL); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc) { int rc=0; rc = PARMCI_AccS(optype, scale, src, NULL, dst, NULL, &bytes, 0, proc); return rc; } /* whatever original put and get functions were here have been replaced with the proper ones from the main armci branch. the old functions were entirely responsible for causing the test_vector_acc test to fail in test.x */ int PARMCI_Put(void *src, void* dst, int bytes, int proc) { int rc=0; //ARMCI_PROFILE_START_STRIDED(&bytes, 0, proc, ARMCI_PROF_PUT); rc = PARMCI_PutS(src, NULL, dst, NULL, &bytes, 0, proc); //ARMCI_PROFILE_STOP_STRIDED(ARMCI_PROF_PUT); assert(rc==0); return rc; } int PARMCI_Get(void *src, void* dst, int bytes, int proc) { int rc=0; //ARMCI_PROFILE_START_STRIDED(&bytes, 0, proc, ARMCI_PROF_GET); #ifdef __crayx1 memcpy(dst,src,bytes); #else rc = PARMCI_GetS(src, NULL, dst, NULL, &bytes, 0, proc); #endif //ARMCI_PROFILE_STOP_STRIDED(ARMCI_PROF_GET); //dassert(1,rc==0); assert(rc==0); return rc; } #define PACK1D 1 #if PACK1D # define armci_read_strided1 armci_read_strided # define armci_write_strided1 armci_write_strided #else # define armci_read_strided2 armci_read_strided # define armci_write_strided2 armci_write_strided #endif void armci_write_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bytes = count[0]; ARMCI_PR_DBG("enter",stride_levels); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } armci_copy( ((char*)ptr)+idx, buf, bytes); buf += count[0]; } ARMCI_PR_DBG("exit",stride_levels); } void armci_write_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",stride_levels); if(stride_levels == 0){ armci_copy( ptr, buf, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE ) armci_write_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY21(&rows, count+1, ptr, &ld, buf, &idx); break; case 2: ldd = stride_arr[1]/stride_arr[0]; DCOPY31(&rows, count+1, count+2, ptr, &ld, &ldd, buf,&idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY21(&rows, count+1,src, &ld, buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ ARMCI_PR_DBG("exit",stride_levels); } void armci_read_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bytes = count[0]; ARMCI_PR_DBG("enter",stride_levels); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } armci_copy(buf, ((char*)ptr)+idx,bytes); buf += count[0]; } ARMCI_PR_DBG("exit",stride_levels); } void armci_read_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; ARMCI_PR_DBG("enter",stride_levels); if(stride_levels == 0){ armci_copy( buf, ptr, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE) armci_read_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY12(&rows, count+1, ptr, &ld, buf, &idx); break; case 2: ldd = stride_arr[1]/stride_arr[0]; DCOPY13(&rows, count+1, count+2, ptr, &ld, &ldd, buf,&idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY12(&rows, count+1,src, &ld, buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ ARMCI_PR_DBG("exit",stride_levels); } /*\Non-Blocking API \*/ int PARMCI_NbPutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int *count=seg_count, tmp_count=0; int rc=0, direct=1; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ if(stride_levels)direct=SAMECLUSNODE(proc); direct=SAMECLUSNODE(proc); #endif /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, PUT, nb_handle); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = PUT; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(PUT, proc); } if(!direct){ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_strided(PUT, NULL, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,NULL,-1,-1,-1,nb_handle); } else{ if(!SAMECLUSNODE(proc))DO_FENCE(proc,DIRECT_NBPUT); rc = armci_op_strided( PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, 0,nb_handle); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_NbGetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: byte_count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { int rc=0,direct=1; int *count=seg_count, tmp_count=0; armci_ihdl_t nb_handle = (armci_ihdl_t) usr_hdl; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0) return FAIL3; if(stride_levels<0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0 || proc>=armci_nproc) { printf("\n%d:%s:proc=%d",armci_me,__FUNCTION__,proc); fflush(stdout); return FAIL5; } // ORDER(GET,proc); /* ensure ordering */ PREPROCESS_STRIDED(tmp_count); direct = SAMECLUSNODE(proc); // direct ==> local on node operation if(nb_handle && nb_handle->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, GET, nb_handle); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { // ORDER(GET,proc); ensure ordering // set tag and op in the nb handle if(nb_handle) { nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(GET, proc); } if(nb_handle) { nb_handle->onesided_direct = 0; } # ifdef CRAY_REGISTER_ARMCI_MALLOC if(!direct && armci_onesided_direct_get_enabled) { // set up the non-blocking descriptor nb_handle->onesided_direct = 1; bzero(&nb_handle->comm_desc, MAX_OUTSTANDING_ONESIDED_GETS*sizeof(cos_desc_t)); onesided_hnd_t cp_hnd; cpGetOnesidedHandle(&cp_hnd); cos_mdesc_t local_mdh, remote_mdh, *mdh = NULL; int node = armci_clus_id(proc); if(stride_levels == 0) { // if a strided put/acc is outstanding to proc, then we need to ensure that is completed // we allow the maximum possible overlap for strided puts/acc. that means they are not fully blocking // calls. they are however, guaranteed to be complete prior to another request being sent. DO_FENCE(proc,ONESIDED_GET); // local varaibles cos_desc_t *comm_desc = &nb_handle->comm_desc[0]; // printf("[cp %d]: direct remote get - src=%p; dst=%p; tgt_rank=%d; tgt_node=%d\n",armci_me,src_ptr,dst_ptr,proc,node); // find remote mdh armci_onesided_search_remote_mdh_list(src_ptr, proc, &remote_mdh); // register local memory -- will use UDREG if ONESIDED_USE_UDREG is active cpMemRegister(dst_ptr, count[0], &local_mdh); // onesided_mem_register(cp_hnd, src_ptr, count[0], NULL, &local_mdh); // initialize onesided communication descriptor onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, comm_desc); // initiate get onesided_get_nb(comm_desc); // done! rc=0; goto fn_exit; } else { DO_FENCE(proc,ONESIDED_GET); int i,j,id; long src_idx; /* index offset of the current block position to src_ptr */ long dst_idx; /* index offset of the current block position to dst_ptr */ int n1dim; /* number of 1-dimensional blocks to xfer */ int bunit[MAX_STRIDE_LEVEL]; int bvalue[MAX_STRIDE_LEVEL]; cos_desc_t *cds = nb_handle->comm_desc; uint64_t src_addr, dst_addr; n1dim = 1; for(i=1; i<=stride_levels; i++) { n1dim *= count[i]; } bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0,id=0; i (count[j]-1)) bvalue[j] = 0; } src_addr = (uint64_t) ((char *) src_ptr + src_idx); dst_addr = (uint64_t) ((char *) dst_ptr + dst_idx); /* if(armci_me == 0) { printf("1dpass=%d of %d; src_idx=%d; dst_idx=%d; count[0]=%d\n",i,n1dim,src_idx, dst_idx,count[0]); } */ if(i >= MAX_OUTSTANDING_ONESIDED_GETS) { if(id == MAX_OUTSTANDING_ONESIDED_GETS) id=0; onesided_wait(&cds[id]); cpMemDeregister(&cds[id].local_mdesc); } armci_onesided_search_remote_mdh_list((void*)src_addr, proc, &remote_mdh); cpMemRegister((void*)dst_addr, count[0], &local_mdh); onesided_desc_init(cp_hnd, &local_mdh, &remote_mdh, 0, &cds[id]); onesided_get_nb(&cds[id]); id++; } // done rc=0; goto fn_exit; } } // end if(!direct && armci_onesided_direct_get_enabled) # endif // CRAY_REGISTER_ARMCI_MALLOC if(!direct) { DO_FENCE(proc,SERVER_NBGET); rc = armci_pack_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, NULL,-1,-1,-1,nb_handle); } else { // DO_FENCE(proc,DIRECT_GET); rc = armci_op_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count, stride_levels,0,nb_handle); } POSTPROCESS_STRIDED(tmp_count); fn_exit: #ifdef ARMCI_PROFILE armci_profile_stop_strided(ARMCI_PROF_GETS); #endif ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } int PARMCI_NbAccS( int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int *count=seg_count, tmp_count=0; int rc, direct=1; ARMCI_PR_DBG("enter",proc); if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(src_stride_arr == NULL || dst_stride_arr ==NULL) return FAIL2; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; UPDATE_FENCE_INFO(proc); PREPROCESS_STRIDED(tmp_count); #if DATA_SERVER_ direct=SAMECLUSNODE(proc); #endif # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = optype; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(optype, proc); if(direct){ rc = armci_op_strided(optype,scale, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,1,NULL); } else{ DO_FENCE(proc,SERVER_NBPUT); rc = armci_pack_strided(optype,scale,proc,src_ptr, src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,NULL,-1,-1,-1,nb_handle); } POSTPROCESS_STRIDED(tmp_count); ARMCI_PR_DBG("exit",proc); if(rc) return FAIL6; else return 0; } #if !defined(ACC_COPY)&&!defined(CRAY_YMP)&&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML) # define REMOTE_OP #endif #define INIT_NB_HANDLE(nb,o,p) if(nb){\ (nb)->tag = 0;\ (nb)->op = (o); (nb)->proc= (p);\ (nb)->bufid=NB_NONE;}\ else { (nb)=armci_set_implicit_handle(o, p); (nb)->tag=0; } void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc) { if(nb_handle) { *nbh=(armci_ihdl_t)nb_handle; } else { *nbh=armci_set_implicit_handle(op, proc); } } int PARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc=0, direct=0; armci_ihdl_t nb_handle = (armci_ihdl_t)uhandle; ARMCI_PR_DBG("enter",proc); if(src == NULL || dst == NULL) return FAIL; direct =SAMECLUSNODE(proc); /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(direct) { armci_copy(src,dst,bytes); rc=0; } else rc=armci_agg_save_descriptor(src,dst,bytes,proc,PUT,0,nb_handle); return rc; } if(direct) { /*armci_wait needs proc to compute direct*/ INIT_NB_HANDLE(nb_handle,PUT,proc); armci_copy(src,dst,bytes); } else{ # ifdef PORTALS rc=PARMCI_NbPutS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # else # ifdef ARMCI_NB_PUT INIT_NB_HANDLE(nb_handle,PUT,proc); UPDATE_FENCE_STATE(proc, PUT, 1); ARMCI_NB_PUT(src, dst, bytes, proc, &nb_handle->cmpl_info); # else rc=PARMCI_NbPutS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # endif # endif } ARMCI_PR_DBG("exit",proc); return(rc); } int PARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc=0, direct=0; armci_ihdl_t nb_handle = (armci_ihdl_t)uhandle; ARMCI_PR_DBG("enter",proc); if(src == NULL || dst == NULL) return FAIL; direct =SAMECLUSNODE(proc); if(nb_handle && nb_handle->agg_flag == SET) { if(direct) { armci_copy(src,dst,bytes); rc=0; } else rc=armci_agg_save_descriptor(src,dst,bytes,proc,GET,0,nb_handle); return rc; } if(direct) { /*armci_wait needs proc to compute direct*/ INIT_NB_HANDLE(nb_handle,PUT,proc); armci_copy(src,dst,bytes); }else{ # ifdef PORTALS rc=PARMCI_NbGetS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # else # ifdef ARMCI_NB_GET /*set tag and op in the nb handle*/ INIT_NB_HANDLE(nb_handle,GET,proc); ARMCI_NB_GET(src, dst, bytes, proc, &nb_handle->cmpl_info); # else rc=PARMCI_NbGetS(src, NULL,dst,NULL, &bytes,0,proc,uhandle); # endif # endif } ARMCI_PR_DBG("exit",proc); return(rc); } static void _armci_rem_value(int op, void *src, void *dst, int proc, int bytes) { int rc=0; int armci_th_idx = ARMCI_THREAD_IDX; ORDER(op,proc); /* ensure ordering */ #if defined(REMOTE_OP) && !defined(QUADRICS) rc = armci_rem_strided(op, NULL, proc, src, NULL, dst, NULL, &bytes, 0, NULL, 0, NULL); if(rc) armci_die("ARMCI_Value: armci_rem_strided incomplete", FAIL6); #else if(op==PUT) { UPDATE_FENCE_STATE(proc, PUT, 1); # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx], 1); # endif #if defined(BGML) /* fprintf(stderr,"bytes: %d\n",bytes); */ /* this call is blocking, so local count is fine */ BG1S_t req; unsigned count=1; BGML_Callback_t cb_wait={wait_callback, &count}; BG1S_Memput(&req, proc, src, 0, dst, bytes, &cb_wait, 1); BGML_Wait(&count); #else armci_put(src, dst, bytes, proc); #endif } else { # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], 1); # endif #if defined(BGML) /* fprintf(stderr,"before memget\n"); */ BG1S_t req; unsigned count=1; BGML_Callback_t cb_wait={wait_callback, &count}; BG1S_Memget(&req, proc, dst, 0, src, bytes, &cb_wait, 1); BGML_Wait(&count); #else armci_get(src, dst, bytes, proc); #endif } /* deal with non-blocking loads and stores */ # if defined(LAPI) || defined(_ELAN_PUTGET_H) if(proc != armci_me){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } #endif #endif } /* non-blocking remote value put/get operation */ static void _armci_nb_rem_value(int op, void *src, void *dst, int proc, int bytes, armci_ihdl_t nb_handle) { int rc=0, pv=0; int armci_th_idx = ARMCI_THREAD_IDX; if(nb_handle && nb_handle->agg_flag == SET) { if(op==PUT) pv = 1; (void)armci_agg_save_descriptor(src,dst,bytes,proc,op,pv,nb_handle); return; } else { if(op==PUT) UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = armci_set_implicit_handle(op, proc); } #if defined(REMOTE_OP) && !defined(QUADRICS) rc = armci_rem_strided(op, NULL, proc, src, NULL, dst, NULL, &bytes, 0, NULL, 0, nb_handle); if(rc) armci_die("ARMCI_Value: armci_rem_strided incomplete", FAIL6); #else if(op==PUT) { UPDATE_FENCE_STATE(proc, PUT, 1); # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx], 1); # endif armci_put(src, dst, bytes, proc); } else { # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], 1); # endif armci_get(src, dst, bytes, proc); } /* deal with non-blocking loads and stores */ # if defined(LAPI) || defined(_ELAN_PUTGET_H) # ifdef LAPI if(!nb_handle) # endif { if(proc != armci_me){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } } # endif #endif } #define CHK_ERR(dst, proc) \ if(dst==NULL) armci_die("PARMCI_PutValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("PARMCI_PutValue: Invalid process rank", proc); #define CHK_ERR_GET(src, dst, proc, bytes) \ if(src==NULL || dst==NULL) armci_die("PARMCI_GetValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("PARMCI_GetValue: Invalid process rank", proc); \ if(bytes<0) armci_die("PARMCI_GetValue: Invalid size", bytes); /** * Register-Originated Put. */ int PARMCI_PutValueInt(int src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(int)); return 0; } int PARMCI_PutValueLong(long src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(long)); return 0; } int PARMCI_PutValueFloat(float src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(float)); return 0; } int PARMCI_PutValueDouble(double src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(double)); return 0; } /** * Non-Blocking register-originated put. */ int PARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(int),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(long),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(float),(armci_ihdl_t)usr_hdl); return 0; } int PARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(double),(armci_ihdl_t)usr_hdl); return 0; } #if 1 /** * Register-Originated Get. */ int PARMCI_GetValueInt(void *src, int proc) { int dst; if( SAMECLUSNODE(proc) ) return *(int *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(int)); return dst; } long PARMCI_GetValueLong(void *src, int proc) { long dst; if( SAMECLUSNODE(proc) ) return *(long *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(long)); return dst; } float PARMCI_GetValueFloat(void *src, int proc) { float dst; if( SAMECLUSNODE(proc) ) return *(float *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(float)); return dst; } double PARMCI_GetValueDouble(void *src, int proc) { double dst; if( SAMECLUSNODE(proc) ) return *(double *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(double)); return dst; } #endif #if 0 /** * Register-Originated Get. */ int PARMCI_GetValue(void *src, void *dst, int proc, int bytes) { CHK_ERR_GET(src, dst, proc, bytes); if( SAMECLUSNODE(proc) ) { armci_copy(src, dst, bytes); } else _armci_rem_value(GET, src, dst, proc, bytes); return 0; } /** * Non-Blocking register-originated get. */ int PARMCI_NbGetValue(void *src, void *dst, int proc, int bytes, armci_hdl_t* usr_hdl) { CHK_ERR_GET(src, dst, proc, bytes); if( SAMECLUSNODE(proc) ) { armci_copy(src, dst, bytes); } else _armci_nb_rem_value(GET, src, dst, proc, bytes, (armci_ihdl_t)usr_hdl); return 0; } #endif ga-5-4/armci/src-gemini/request.h0000644000175000017500000003354512662210416015033 0ustar mbamba#ifndef _REQUEST_H_ #define _REQUEST_H_ /******** client buffer managment ops ****************************/ extern void _armci_buf_init(); extern char* _armci_buf_get(int size, int operation, int to); extern void _armci_buf_release(void *buf); extern int _armci_buf_to_index(void *buf); extern char* _armci_buf_ptr_from_id(int id); extern void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node); #if defined(SERV_QUEUE) extern void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node); #endif extern void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol); extern void _armci_buf_clear_all(); extern void x_buf_send_complete(void *); extern INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to); extern INLINE void _armci_buf_set_busy(void *buf, int state); extern INLINE void _armci_buf_set_busy_idx(int tbl_idx, int state); extern INLINE int _armci_buf_cmpld(int bufid); extern INLINE void _armci_buf_set_cmpld(void *buf, int state); extern INLINE void _armci_buf_set_cmpld_idx(int idx, int state); #ifdef LAPI # include "lapidefs.h" #elif LIBONESIDED typedef armci_onesided_msg_tag_t msg_tag_t; #elif PORTALS # include "armci_portals.h" #elif defined(GM) # include "myrinet.h" #elif defined(DOELAN4) # include "elandefs.h" #elif defined(QUADRICS) # include typedef void* msg_tag_t; # ifdef _ELAN_PUTGET_H # define NB_CMPL_T ELAN_EVENT* # endif #elif defined(VIA) # include "via.h" typedef void* msg_tag_t; #elif defined(VAPI) # include "armci-vapi.h" #elif defined(SOCKETS) # include "sockets.h" typedef long msg_tag_t; typedef unsigned short msg_id_t; # define DTAG_ ((1<<(sizeof(msg_id_t)*8))-1) # define NB_SOCKETS_ /* define NB_SOCKETS to allow non-blocking path */ #elif defined(HITACHI) # include "sr8k.h" #elif defined(BGML) # include "bgml.h" # include "bgmldefs.h" # define NB_CMPL_T BG1S_t typedef long msg_tag_t; #elif defined(MPI_SPAWN) # include "mpi2.h" # define MSG_BUFLEN_DBL 500000 typedef long msg_tag_t; #else typedef long msg_tag_t; #endif #ifndef CLEAR_HNDL_FIELD # define CLEAR_HNDL_FIELD(_x) #endif #define ACK_QUIT 0 #define QUIT 33 #define ATTACH 34 #define REGISTER 35 /*\ the internal request structure for non-blocking api. \*/ typedef struct{ unsigned int tag; int bufid; int agg_flag; int op; int proc; #ifdef NB_CMPL_T NB_CMPL_T cmpl_info; #endif int onesided_direct; cos_desc_t comm_desc[MAX_OUTSTANDING_ONESIDED_GETS]; } armci_ireq_t; /*\ the internal request structure for non-blocking api. \*/ typedef armci_ireq_t* armci_ihdl_t; extern void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle, char *buf, int val); extern void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc); typedef struct { int to; /* message recipient */ int from; /* message sender */ int operation; /* operation code */ int format; /* data format used */ int bytes; /* number of bytes requested */ int datalen; /* >0 in lapi means that data is included */ int ehlen; /* size of extra header and the end of descr */ int dscrlen; /* >0 in lapi means that descriptor is included */ msg_tag_t tag; /* message tag for response to this request, MUST BE LAST */ }request_header_t; typedef struct _buf_ackresp{ long val,valc; cos_request_t req; struct _buf_ackresp *next, *previous; } _buf_ackresp_t; /*******gpc call strctures*************/ #include #define MAX_GPC_REQ 1 #define MAX_GPC_REPLY_LEN (64*1024) #define MAX_GPC_SEND_LEN (64*1024) #define GPC_COMPLETION_SIGNAL SIGUSR1 typedef struct { int hndl; int hlen, dlen; void *hdr, *data; int rhlen, rdlen; void *rhdr, *rdata; } gpc_call_t; typedef struct { int active; /* int zombie; */ request_header_t msginfo; gpc_call_t call; char send[MAX_GPC_SEND_LEN]; char reply[MAX_GPC_REPLY_LEN]; } gpc_buf_t; /* gpc_buf_t *gpc_req; */ extern gpc_buf_t *gpc_req; extern void block_pthread_signal(int signo); extern void unblock_pthread_signal(int signo); /*******structures copied from async.c for storing cmpl dscr for nb req*******/ #define UBUF_LEN 112 typedef struct { unsigned int tag; /* request id*/ _buf_ackresp_t ar; short int bufid; /* communication buffer id */ short int protocol; /* what does this buf hold?*/ union { void *dscrbuf; /*in case dscr below is not enough, do a*/ double pad; /*malloc, save pointer in dscrbuf and use it*/ }ptr; char dscr[UBUF_LEN]; /*place to store the dscr*/ }_buf_info_t; #define BUF_INFO_T _buf_info_t extern BUF_INFO_T *_armci_buf_to_bufinfo(void *buf); #define BUF_TO_BUFINFO _armci_buf_to_bufinfo void armci_complete_req_buf(BUF_INFO_T *info, void *buffer); extern INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid); #ifndef MAX_BUFS #define MAX_BUFS 8 #error "MAX_BUFS set to 8" #endif #ifndef MAX_SMALL_BUFS #define MAX_SMALL_BUFS 16 #error "MAX_SMALL_BUFS set to 16" #endif /* tracks sockets used for receiving responces from data server (GET) */ typedef struct { int socks[MAX_BUFS+MAX_SMALL_BUFS]; /* sock # or -1 if not used */ int ready[MAX_BUFS+MAX_SMALL_BUFS]; /* 1 - ready, 0 - not */ } active_socks_t; /*valid values for the element protocol in BUF_INFO_T*/ #define SDSCR_IN_PLACE 1 /*indicated that strided descriptor is in place*/ #define VDSCR_IN_PLACE 2 /*indicated that vector descriptor is in place*/ #define VDSCR_IN_PTR 3 /*indicates that the vector descriptor in allocated and pointer stored in dscrbuf */ /****************************************************************************/ /* this effects: buf_ext_t, portalsEagerMessageSendSize, portals ds buffer size */ /* note: MSG_BUFLEN_DBL is being defined earlier in armci-portals.h */ #ifndef MSG_BUFLEN_DBL # error "MSG_BUFLEN_DBL not yet defined" # if defined(HITACHI) # define MSG_BUFLEN_DBL 0x50000 # else # ifdef PORTALS_USE_RENDEZ_VOUS # define MSG_BUFLEN_DBL 50000 /* for rendez-vous, this can go bigger i think */ # else # define MSG_BUFLEN_DBL 8192 /* this is smaller when rendez-vous is off */ # endif # endif #endif #define MSG_BUFLEN sizeof(double)*MSG_BUFLEN_DBL extern char* MessageRcvBuffer; extern char* MessageSndBuffer; #ifdef LAPI # define GET_SEND_BUFFER_(_size)(MessageSndBuffer+sizeof(lapi_cmpl_t));\ CLEAR_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer));\ SET_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer),1); # define GET_SEND_BUFFER _armci_buf_get # define GA_SEND_REPLY armci_lapi_send #else # ifdef SOCKETS # define GA_SEND_REPLY(tag, buf, len, p) armci_sock_send(p,buf,len) # else # define GA_SEND_REPLY(tag, buf, len, p) # endif #endif #ifdef QUADRICS_ # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer;\ while(((request_header_t*)MessageSndBuffer)->tag)\ armci_util_spin(100, MessageSndBuffer) # define FREE_SEND_BUFFER(_ptr) ((request_header_t*)MessageSndBuffer)->tag = (void*)0 #endif #ifndef GET_SEND_BUFFER # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer #endif #ifndef FREE_SEND_BUFFER #define FREE_SEND_BUFFER(_ptr) #endif #ifndef INIT_SENDBUF_INFO #define INIT_SENDBUF_INFO(_hdl,_buf,_op,_proc) #endif typedef struct { char *buf; char* buf_posted; int count; int proc; int op; int extra; } buf_arg_t; /*includes for SERVER_LOCK*/ #if defined(SERVER_THREAD) && !defined(VIA) extern void armci_rem_lock(int mutex, int proc, int *ticket); extern void armci_rem_unlock(int mutex, int proc, int ticket); extern void armci_unlock_waiting_process(msg_tag_t tag,int proc, int ticket); #endif #ifdef PIPE_BUFSIZE extern void armcill_pipe_post_bufs(void *ptr, int stride_arr[], int count[], int strides, void* argvoid); extern void armcill_pipe_extract_data(void *ptr,int stride_arr[],int count[], int strides, void* argvoid); extern void armcill_pipe_send_chunk(void *data, int stride_arr[],int count[], int strides, void* argvoid); #endif extern void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[],int tag); extern void armci_rcv_hdlr(request_header_t* msginfo); extern char *armci_rcv_data(int proc, request_header_t *msginfo, int rcvlen); extern void armci_rcv_strided_data_bypass(int proc, request_header_t *msginfo, void *ptr, int stride_levels); extern void armci_send_strided_data_bypass(int proc, request_header_t *msginfo, void *loc_buf, int msg_buflen, void *loc_ptr, int *loc_stride_arr, void *rem_ptr, int *rem_stride_arr, int *count, int stride_levels); extern void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]); extern void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_send_req(int proc, request_header_t* msginfo, int len,int tag); extern void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra); extern int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,int flag,armci_ihdl_t nb_handle); extern int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int lockit,armci_ihdl_t nb_handle); extern void armci_rem_rmw(int op, void *ploc, void *prem, int extra, int proc); extern void armci_rem_ack(int clus); extern void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void armci_server_vector(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void *armci_server_ptr(int); extern void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen); extern void armci_server_lock(request_header_t *msginfo); extern void armci_server_unlock(request_header_t *msginfo, char* dscr); extern void armci_create_server_thread ( void* (* func)(void*) ); extern int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag); extern void armci_send_data(request_header_t* msginfo, void *data); extern int armci_server_unlock_mutex(int mutex, int p, int tkt, msg_tag_t* tag); extern void armci_rcv_vector_data(int p, request_header_t* msginfo, armci_giov_t dr[], int len); #if !defined(LAPI) extern void armci_wait_for_server(); extern void armci_start_server(); extern void armci_transport_cleanup(); extern int armci_send_req_msg(int proc, void *buf, int bytes,int tag); extern void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf); extern char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len); extern void armci_init_connections(); extern void *armci_server_code(void *data); extern void armci_rcv_req(void *mesg, void *phdr, void *pdescr, void *pdata, int *buflen); extern void armci_client_connect_to_servers(); extern void armci_data_server(void *mesg); extern void armci_server_initial_connection(); extern void armci_call_data_server(); #endif #ifdef SOCKETS extern void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_WriteStridedToDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_serv_quit(); extern int armci_send_req_msg_strided(int proc, request_header_t *msginfo, char *ptr, int strides, int stride_arr[],int count[]); extern void armci_server_goodbye(request_header_t* msginfo); #endif #ifdef MPI_SPAWN extern void armci_serv_quit(); extern void armci_server_goodbye(request_header_t* msginfo); #endif #ifdef HITACHI extern void armci_server_goodbye(request_header_t* msginfo); extern void armci_serv_quit(); #endif extern void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen); #ifdef PIPE_BUFSIZE extern void armci_pipe_prep_receive_strided(request_header_t *msginfo,char *buf, int strides, int stride_arr[], int count[], int bufsize); extern void armci_pipe_receive_strided(request_header_t* msginfo, void *ptr, int stride_arr[], int count[], int strides); extern void armci_pipe_send_req(int proc, void *buf, int bytes); #endif extern void armci_rcv_strided_data_bypass_both(int, request_header_t*,void*, int*, int); extern int armci_rem_get(int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle,void *mhloc,void *mhrem); #if defined(ALLOW_PIN) && defined(VAPI) extern int armci_two_phase_send(int proc,void *src_ptr,int src_stride_arr[], void *dst_ptr,int dst_stride_arr[],int count[], int stride_levels,void ** context_ptr,armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); extern int armci_two_phase_get(int proc, void*src_ptr, int src_stride_arr[], void*dst_ptr,int dst_stride_arr[], int count[], int stride_levels, void**context_ptr, armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); #endif #endif ga-5-4/armci/src-gemini/spawn.c0000644000175000017500000000550512662210416014461 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* OS specific server process/thread creation and destruction * JN/03.25.2000 */ #include #include #include "armcip.h" #ifdef WIN32 /************************** Windows threads **************************/ #include #include thread_id_t armci_serv_tid; unsigned long armci_serv_handle; #ifndef NO_STDLIBC #define NEWTHREAD CreateThread #else #define NEWTHREAD _beginthreadex #endif unsigned __stdcall armci_wrap_func(void *arg) { void (*func)(void*); func = arg; /* boost the server thread priority be better responsiveness */ (void)SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); func(NULL); return (unsigned)0; } void armci_create_server_thread ( void* (* func)(void*) ) { /* as we need to use std C rt library we cannot use CreateThread */ armci_serv_handle = NEWTHREAD(NULL, 0, armci_wrap_func, (void*)func, 0, &armci_serv_tid); if(!armci_serv_handle) armci_die("armci_create_server_thread: create failed",0); } void armci_terminate_server_thread() { /*int rc;*/ /* TerminateThread(armci_serv_handle,&rc);*/ } /****************************** PTHREADS *****************************/ #elif defined(PTHREADS) #include thread_id_t armci_serv_tid; void armci_create_server_thread ( void* (* func)(void*) ) { pthread_attr_t attr; int rc; if(pthread_attr_init(&attr)) armci_die("armci_create_server_thread: attr init failed",0); #if defined(AIX) || defined(SOLARIS) pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); #endif rc = pthread_create(&armci_serv_tid, &attr, func, NULL); if(rc) armci_die("armci_create_server_thread: create failed",errno); pthread_attr_destroy(&attr); } void armci_terminate_server_thread() { if(pthread_join(armci_serv_tid,NULL)) armci_die("armci_terminate_server_thread: failed",0); } #else /**************************** Unix processes ******************************/ #include #include #include pid_t server_pid= (pid_t)0; char child_stack[256*1024]; char *child_stack_top = &child_stack[256*1024-1]; void armci_create_server_process ( void* (* func)(void*) ) { pid_t pid; /* if ( (pid = fork() ) < 0) armci_die("fork failed", (int)pid); */ pid = clone(func, (void*)child_stack_top, CLONE_THREAD|CLONE_SIGHAND|CLONE_VM, NULL); if (pid == -1) { armci_die("fork failed", (int)pid); } server_pid = pid; } void armci_wait_server_process() { int stat; pid_t rc; if(!server_pid) return; rc = wait (&stat); if (rc != server_pid){ perror("ARMCI master: wait for child process (server) failed:"); } server_pid = (pid_t)0; } #endif ga-5-4/armci/src-gemini/utils.h0000644000175000017500000000724612662210416014502 0ustar mbamba/* $Id: utils.h,v 1.1.2.3 2007-07-02 05:35:31 d3p687 Exp $ * * primitives for transparent handling of multi-threading */ #ifndef UTILS_H #define UTILS_H /* * This header file describes the "barrier" synchronization * construct. The type barrier_t describes the full state of the * barrier including the POSIX 1003.1c synchronization objects * necessary. * * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. */ #ifdef THREAD_SAFE # ifdef POSIX_THREADS # include #if 1 typedef pthread_mutex_t thread_lock_t; # define THREAD_LOCK_INIT(x) pthread_mutex_init(&x,NULL) # define THREAD_LOCK_DESTROY(x) pthread_mutex_destroy(&x) # define THREAD_LOCK(x) pthread_mutex_lock(&x) # define THREAD_UNLOCK(x) pthread_mutex_unlock(&x) #else #ifndef INLINE # define INLINE # include "spinlock.h" # undef INLINE #else # include "spinlock.h" #endif typedef LOCK_T thread_lock_t; # define THREAD_LOCK_INIT(x) armci_init_spinlock(&x) # define THREAD_LOCK_DESTROY(x) 0 # define THREAD_LOCK(x) armci_acquire_spinlock(&x) # define THREAD_UNLOCK(x) armci_release_spinlock(&x) #endif typedef pthread_t thread_t; # define THREAD_CREATE(th_,func_,arg_) pthread_create(th_,NULL,func_,arg_) # define THREAD_JOIN(th_,ret_) pthread_join(th_,ret_) /* structure describing a barrier */ typedef struct thread_barrier_tag { pthread_mutex_t mutex; /* Control access to barrier */ pthread_cond_t cv; /* wait for barrier */ int valid; /* set when valid */ int threshold; /* number of threads required */ int counter; /* current number of threads */ int cycle; /* alternate wait cycles (0 or 1) */ } thread_barrier_t; # define BARRIER_VALID 0xdbcafe /* support static initialization of barriers */ # define BARRIER_INITIALIZER(cnt) {\ PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER,\ BARRIER_VALID, cnt, cnt, 0} # else # error ONLY PTHREADS SUPPORT HAS BEEN IMPLEMENTED # endif # define TH2PROC(th_) (th_/mt_tpp) /* computes processor from thread id */ /* barrier functions */ int thread_barrier_init (thread_barrier_t *barrier, int count); int thread_barrier_destroy (thread_barrier_t *barrier); int thread_barrier_wait (thread_barrier_t *barrier); /* multi-threaded memory functions */ int armci_malloc_mt(void *ptr[], int bytes); int armci_free_mt(void *ptr, int th_idx); # define ARMCI_MALLOC_MT armci_malloc_mt # define ARMCI_FREE_MT armci_free_mt # define TH_INIT(p_,t_) mt_size=p_;mt_tpp=t_;\ thread_barrier_init(&mt_barrier,mt_tpp) # define TH_FINALIZE() thread_barrier_destroy(&mt_barrier) # define MT_BARRIER() if (thread_barrier_wait(&mt_barrier)==-1) armci_msg_barrier();\ thread_barrier_wait(&mt_barrier) extern int mt_size; extern int mt_tpp; extern thread_barrier_t mt_barrier; #else # define THREAD_LOCK_INIT(x) # define THREAD_LOCK_DESTROY(x) # define THREAD_LOCK(x) # define THREAD_UNLOCK(x) # define TH_INIT(p_,t_) # define TH_FINALIZE() # define MT_BARRIER armci_msg_barrier # define ARMCI_MALLOC_MT PARMCI_Malloc # define ARMCI_FREE_MT(p_,th_) PARMCI_Free(p_) #endif #endif/*UTILS_H*/ ga-5-4/armci/src-gemini/memlock.c0000644000175000017500000001622012662210416014754 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: memlock.c,v 1.24.2.3 2007-08-29 17:32:32 manoj Exp $ */ #include "armcip.h" #include "locks.h" #include "copy.h" #include "memlock.h" #include #define DEBUG_ 0 #define INVALID_VAL -9999999 #ifdef DATA_SERVER # define CORRECT_PTR #endif size_t armci_mem_offset=0; /* We start by using table: assign address of local variable set to 1 * On shmem systems, this addres is overwritten by a shared memory location * when memlock array is allocated in armci_init * Therefore, any process within shmem node can reset armci_use_memlock_table * to "not used" when offset changes. Since the variable is in shmem, everybody * on that SMP node will see the change and use the same locking functions */ int init_use_memlock_table=1; int *armci_use_memlock_table=&init_use_memlock_table; static int locked_slot=INVALID_VAL; volatile double armci_dummy_work=0.; void **memlock_table_array; /* constants for cache line alignment */ # define CALGN 64 # define LOG_CALGN 6 #define ALIGN_ADDRESS(x) (char*)((((unsigned long)x) >> LOG_CALGN) << LOG_CALGN) static memlock_t table[MAX_SLOTS]; /*\ simple locking scheme that ignores addresses \*/ void armci_lockmem_(void *pstart, void *pend, int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif if(DEBUG_){ printf("%d: armci_lockmem_ proc=%d lock=%d\n",armci_me,proc,lock); fflush(stdout); } NATIVE_LOCK(lock,proc); if(DEBUG_){ printf("%d: armci_lockmem_ done\n",armci_me); fflush(stdout); } } void armci_unlockmem_(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif if(DEBUG_){ printf("%d: armci_unlockmem_ proc=%d lock=%d\n",armci_me,proc,lock); fflush(stdout); } NATIVE_UNLOCK(lock,proc); } /*\ idle for a time proportional to factor \*/ void armci_waitsome(int factor) { int i=factor*100000; if(factor <= 1) armci_dummy_work =0.; if(factor < 1) return; while(--i){ armci_dummy_work = armci_dummy_work + 1./(double)i; } } /*\ acquire exclusive LOCK to MEMORY area owned by process "proc" * . only one area can be locked at a time by the calling process * . must unlock it with armci_unlockmem \*/ void armci_lockmem(void *start, void *end, int proc) { register void* pstart, *pend; register int slot, avail=0; int turn=0, conflict=0; memlock_t *memlock_table; #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_lockmem_(start, end, proc); return; } # ifndef SGIALTIX /* when processes are attached to a shmem region at different addresses, * addresses written to memlock table must be adjusted to the node master */ if(armci_mem_offset){ start = armci_mem_offset + (char*)start; end = armci_mem_offset + (char*)end; } # endif #endif if(DEBUG_){ printf("%d: calling armci_lockmem for %d range %p -%p\n", armci_me, proc, start,end); fflush(stdout); } memlock_table = (memlock_t*)memlock_table_array[proc]; #ifdef ALIGN_ADDRESS /* align address range on cache line boundary to avoid false sharing */ pstart = ALIGN_ADDRESS(start); pend = CALGN -1 + ALIGN_ADDRESS(end); #else pstart=start; pend =end; #endif #ifdef CRAY_SHMEM { /* adjust according the remote process raw address */ long bytes = (long) ((char*)pend-(char*)pstart); extern void* armci_shmalloc_remote_addr(void *ptr, int proc); pstart = armci_shmalloc_remote_addr(pstart, proc); pend = (char*)pstart + bytes; } #endif while(1){ NATIVE_LOCK(lock,proc); armci_get(memlock_table, table, sizeof(table), proc); /* armci_copy(memlock_table, table, sizeof(table));*/ /* inspect the table */ conflict = 0; avail =-1; for(slot = 0; slot < MAX_SLOTS; slot ++){ /* nonzero starting address means the slot is occupied */ if(table[slot].start == NULL){ /* remember a free slot to store address range */ avail = slot; }else{ /*check for conflict: overlap between stored and current range*/ if( (pstart >= table[slot].start && pstart <= table[slot].end) || (pend >= table[slot].start && pend <= table[slot].end) ){ conflict = 1; break; } /* printf("%d: locking %ld-%ld (%d) conflict\n", armci_me, */ } } if(avail != -1 && !conflict) break; NATIVE_UNLOCK(lock,proc); armci_waitsome( ++turn ); } /* we got the memory lock: enter address into the table */ table[avail].start = pstart; table[avail].end = pend; armci_put(table+avail,memlock_table+avail,sizeof(memlock_t),proc); FENCE_NODE(proc); NATIVE_UNLOCK(lock,proc); locked_slot = avail; } /*\ release lock to the memory area locked by previous call to armci_lockemem \*/ void armci_unlockmem(int proc) { void *null[2] = {NULL,NULL}; memlock_t *memlock_table; #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_unlockmem_(proc); return; } #endif #ifdef DEBUG if(locked_slot == INVALID_VAL) armci_die("armci_unlock: empty",0); if(locked_slot >= MAX_SLOTS || locked_slot <0) armci_die("armci_unlock: corrupted slot?",locked_slot); #endif memlock_table = (memlock_t*)memlock_table_array[proc]; armci_put(null,&memlock_table[locked_slot].start,2*sizeof(void*),proc); } /*\ based on address for set by master, determine correction for * memory addresses set in memlock table * if the correction/offset ever changes stop using memlock table locking \*/ void armci_set_mem_offset(void *ptr) { extern size_t armci_mem_offset; size_t off; static int first_time=1; volatile void *ref_ptr; ARMCI_PR_DBG("enter",0); /* do not care if memlock not used */ if(! *armci_use_memlock_table) return; if(!ptr) armci_die("armci_set_mem_offset : null ptr",0); ref_ptr = *(void**)ptr; off = (size_t)((char*)ref_ptr - (char*)ptr); if(first_time){ armci_mem_offset =off; first_time =0; if(DEBUG_){ printf("%d memlock offset=%ld ref=%p ptr=%p\n",armci_me, (long)armci_mem_offset, ref_ptr, ptr); fflush(stdout); } }else{ if(armci_mem_offset != off){ *armci_use_memlock_table =0; fprintf(stderr, "%d: WARNING:armci_set_mem_offset: offset changed %ld to %ld\n", armci_me, (long)armci_mem_offset, (long)off); fflush(stdout); } } } ga-5-4/armci/src-gemini/mutex.c0000644000175000017500000002615712662210416014501 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: mutex.c,v 1.24.10.1 2006-12-21 23:50:48 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "request.h" #include #define DEBUG 0 #define MAX_LOCKS 32768 #define SPINMAX 1000 #if defined(LAPI) || defined(GM) # define SERVER_LOCK #endif double _dummy_work_=0.; #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int mymutexcount; double _dummy_server_work_=0.; #endif static int num_mutexes=0, *tickets; typedef struct { int mutex; int turn; msg_tag_t tag; } waiting_list_t; /* data structure to store info about blocked (waiting) process for mutex */ static waiting_list_t* blocked=(waiting_list_t*)0; typedef struct { int* token; int* turn; int* tickets; int count; } mutex_entry_t; void** mutex_mem_ar; mutex_entry_t *glob_mutex; int PARMCI_Create_mutexes(int num) { int rc,p, totcount; int *mutex_count = (int*)armci_internal_buffer; if((sizeof(int)*armci_nproc) > armci_getbufsize()){ mutex_count = (double *)malloc(sizeof(int)*armci_nproc); } if (num < 0 || num > MAX_LOCKS) return(FAIL); if(num_mutexes) armci_die("mutexes already created",num_mutexes); if(armci_nproc == 1){ num_mutexes=1; return(0); } /* local memory allocation for mutex arrays*/ mutex_mem_ar = (void*) malloc(armci_nproc*sizeof(void*)); if(!mutex_mem_ar) armci_die("PARMCI_Create_mutexes: malloc failed",0); glob_mutex = (void*)malloc(armci_nproc*sizeof(mutex_entry_t)); if(!glob_mutex){ free(mutex_mem_ar); armci_die("PARMCI_Create_mutexes: malloc 2 failed",0); } /* bzero(mutex_count,armci_nproc*sizeof(int));*/ bzero((char*)mutex_count,sizeof(int)*armci_nproc); /* find out how many mutexes everybody allocated */ mutex_count[armci_me]=num; armci_msg_igop(mutex_count, armci_nproc, "+"); for(p=totcount=0; p< armci_nproc; p++)totcount+=mutex_count[p]; tickets = calloc(totcount,sizeof(int)); if(!tickets) { free(glob_mutex); free(mutex_mem_ar); return(FAIL2); } /* we need memory for token and turn - 2 ints */ rc = PARMCI_Malloc(mutex_mem_ar,2*num*sizeof(int)); if(rc){ free(glob_mutex); free(mutex_mem_ar); free(tickets); return(FAIL3); } if(num)bzero((char*)mutex_mem_ar[armci_me],2*num*sizeof(int)); /* setup global mutex array */ for(p=totcount=0; p< armci_nproc; p++){ glob_mutex[p].token = mutex_mem_ar[p]; glob_mutex[p].turn = glob_mutex[p].token + mutex_count[p]; glob_mutex[p].count = mutex_count[p]; glob_mutex[p].tickets = tickets + totcount; totcount += mutex_count[p]; } num_mutexes= totcount; #ifdef LAPI mymutexcount = num; #endif PARMCI_Barrier(); if(DEBUG) fprintf(stderr,"%d created (%d,%d) mutexes\n",armci_me,num,totcount); return(0); } void armci_serv_mutex_create() { int mem = armci_nproc*sizeof(waiting_list_t); blocked = (waiting_list_t*)malloc(mem); if(!blocked) armci_die("armci server:error allocating mutex memory ",0); } void armci_serv_mutex_close() { if(blocked) free(blocked ); blocked = (waiting_list_t*)0; } int PARMCI_Destroy_mutexes() { #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int proc, mutex, i,factor=0; #endif if(num_mutexes==0)armci_die("armci_destroy_mutexes: not created",0); if(armci_nproc == 1) return(0); armci_msg_barrier(); #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ for(proc=0;proc myturn) armci_die2("armci: problem with tickets",myturn,next_in_line); /* apply a linear backoff delay before retrying */ for(i=0; i< SPINMAX * factor; i++) _dummy_work_ += 1.; factor += 1; }while (myturn != next_in_line); glob_mutex[proc].tickets[mutex] = myturn; /* save ticket value */ } static void armci_generic_unlock(int mutex, int proc) { int *mutex_ticket= glob_mutex[proc].turn + mutex; int *newval = glob_mutex[proc].tickets +mutex; int len=sizeof(int); /* update ticket for next process requesting this mutex */ (*newval) ++; /* write new ticket value stored previously in tickets */ PARMCI_Put(newval, mutex_ticket, len, proc); MEM_FENCE; } /*\ Acquire mutex for "proc" * -must be executed in hrecv/AM handler thread * -application thread must use generic_lock routine \*/ int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag) { int myturn; int *mutex_ticket, next_in_line, len=sizeof(int); int owner = armci_me; if(DEBUG)fprintf(stderr,"SLOCK=%d owner=%d p=%d m=%d\n", armci_me,owner, proc,mutex); mutex_ticket= glob_mutex[owner].turn + mutex; myturn = register_in_mutex_queue(mutex, owner); armci_copy(mutex_ticket, &next_in_line, len); if(next_in_line > myturn) armci_die2("armci-s: problem with tickets",myturn,next_in_line); if(next_in_line != myturn){ if(!blocked)armci_serv_mutex_create(); blocked[proc].mutex = mutex; blocked[proc].turn = myturn; blocked[proc].tag = tag; if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d blocked (%d,%d)\n", armci_me, proc, next_in_line,myturn); return -1; } else { if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d sending ticket (%d)\n", armci_me, proc, myturn); /* send ticket to requesting node */ /* GA_SEND_REPLY(tag, &myturn, sizeof(int), proc); */ return (myturn); } } /*\ Release mutex "id" held by proc * called from hrecv/AM handler AND application thread \*/ int armci_server_unlock_mutex(int mutex, int proc, int Ticket, msg_tag_t* ptag) { #define NOBODY -1 int owner = armci_me; int i, p=NOBODY, *mutex_ticket= glob_mutex[owner].turn + mutex; int len=sizeof(int); if(DEBUG) fprintf(stderr,"SUNLOCK=%d node=%d mutex=%d ticket=%d\n", armci_me,proc,mutex,Ticket); Ticket++; armci_copy(&Ticket, mutex_ticket, len); /* if mutex is free then nobody is reqistered in queue */ if(armci_mutex_free(mutex, proc)) return -1; /* search for the next process in queue waiting for this mutex */ for(i=0; i< armci_nproc; i++){ if(!blocked)break; /* not allocated yet - nobody is waiting */ if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d list=(%d,%d)\n", armci_me, i, blocked[i].mutex, blocked[i].turn); if((blocked[i].mutex == mutex) && (blocked[i].turn == Ticket)){ p = i; break; } } /* send Ticket to a process waiting for mutex */ if(p != NOBODY){ if(p == armci_me)armci_die("server_unlock: cannot unlock self",0); else { if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d unlock ticket=%d go=%d\n", armci_me, proc, Ticket, p); /* GA_SEND_REPLY(blocked[p].tag, &Ticket, sizeof(int), p); */ *ptag = blocked[p].tag; return p; } } return -1; /* nobody is waiting */ } void PARMCI_Lock(int mutex, int proc) { #if defined(SERVER_LOCK) int direct; #endif if(DEBUG)fprintf(stderr,"%d enter lock\n",armci_me); if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); if(armci_nproc == 1) return; # if defined(SERVER_LOCK) direct=SAMECLUSNODE(proc); if(!direct) armci_rem_lock(mutex,proc, glob_mutex[proc].tickets + mutex ); else # endif armci_generic_lock(mutex,proc); if(DEBUG)fprintf(stderr,"%d leave lock\n",armci_me); } void PARMCI_Unlock(int mutex, int proc) { if(DEBUG)fprintf(stderr,"%d enter unlock\n",armci_me); if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); if(armci_nproc == 1) return; # if defined(SERVER_LOCK) if(armci_nclus >1) { if(proc != armci_me) armci_rem_unlock(mutex, proc, glob_mutex[proc].tickets[mutex]); else { int ticket = glob_mutex[proc].tickets[mutex]; msg_tag_t tag; int waiting; waiting = armci_server_unlock_mutex(mutex, proc, ticket, &tag); if(waiting >-1) armci_unlock_waiting_process(tag, waiting, ++ticket); } } else # endif armci_generic_unlock(mutex, proc); if(DEBUG)fprintf(stderr,"%d leave unlock\n",armci_me); } ga-5-4/armci/src-gemini/gpc.h0000644000175000017500000000204712662210416014105 0ustar mbamba#ifndef __GPCDEF #if ARMCI_ENABLE_GPC_CALLS #define __GPCDEF #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define GPC_INIT 1 #define GPC_PROBE 2 #define GPC_WAIT 3 #define GPC_DONE 4 #define GPC_PENDING 5 typedef struct { int proc; armci_hdl_t ahdl; }gpc_hdl_t; /* #define ARMCI_GPC_HLEN 1024 */ /* #define ARMCI_GPC_DLEN 1024*1024 */ extern int ARMCI_Gpc_register( int (*func) ()); extern void ARMCI_Gpc_release(int handle); extern void * ARMCI_Gpc_translate(void *ptr, int proc, int from); extern void ARMCI_Gpc_lock(int proc); extern void ARMCI_Gpc_unlock(int proc); extern int ARMCI_Gpc_trylock(int proc); extern int ARMCI_Gpc_exec(int h,int p, void *hdr, int hlen, void *data,int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh); extern int PARMCI_Get_gpc_hlen(); extern int PARMCI_Get_gpc_dlen(); extern void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh); extern void ARMCI_Gpc_wait(gpc_hdl_t *nbh); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif #endif ga-5-4/armci/src-gemini/semaphores.c0000644000175000017500000000401712662210416015474 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: semaphores.c,v 1.12 2005-03-10 19:11:23 vinodtipparaju Exp $ */ #include "semaphores.h" #include #include int num_sem_alloc=0; void perror(); #ifdef SUN int fprintf(); void fflush(); int semget(),semctl(); #endif extern void armci_die(char*, int); struct sembuf sops; int semaphoreID; int SemGet(num_sem) int num_sem; { semaphoreID = semget(IPC_PRIVATE,num_sem, IPC_CREAT | 0600); if(semaphoreID<0){ fprintf(stderr," Semaphore Allocation Failed \nsuggestions to fix the problem: \n"); fprintf(stderr," 1. run ipcs and ipcrm -s commands to clean any semaphore ids\n"); fprintf(stderr," 2. verify if constant SEMMSL defined in file semaphore.h is set correctly for your system\n"); fprintf(stderr," 3. recompile semaphore.c\n"); sleep(1); perror("Error message from failed semget:"); armci_die(" exiting ...", num_sem); } num_sem_alloc = num_sem; return(semaphoreID); } void SemInit(id,value) int id,value; { int i, semid, num_sem; union semun semctl_arg; semctl_arg.val = value; if(id == ALL_SEMS){ semid = 0; num_sem = num_sem_alloc;} else { semid = id; num_sem = 1;} for(i=0; i< num_sem; i++){ if( semctl(semaphoreID, semid, SETVAL,semctl_arg )<0){ perror((char*)0); armci_die("SemInit error",id); } semid++; } } /* release semaphore(s) */ void SemDel() { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(semaphoreID,0,IPC_RMID,dummy); } void Sem_CreateInitLocks(int num, lockset_t *id) { *id = SemGet(num); SemInit(ALL_SEMS,1); } void Sem_InitLocks(int num, lockset_t id) { semaphoreID = id; num_sem_alloc = num; } void Sem_DeleteLocks(lockset_t id) { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(id,0,IPC_RMID,dummy); } ga-5-4/armci/src-gemini/kr_malloc.c0000644000175000017500000004231412662210416015273 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "kr_malloc.h" #include "armcip.h" /* for DEBUG purpose only. remove later */ #include "locks.h" #define DEBUG 0 /* Storage allocator basically copied from ANSI K&R and corrupted */ extern char *armci_allocate(); /* Used to get memory from the system */ extern void armci_die(); static char *kr_malloc_shmem(size_t nbytes, context_t *ctx); static void kr_free_shmem(char *ap, context_t *ctx); /** * DEFAULT_NALLOC: No. of units of length ALIGNMENT to get in every * request to the system for memory (8MB/64 => 128*1024units) * DEFAULT_MAX_NALLOC: Maximum number of units that can get i.e.1GB * (if unit size=64bytes, then max units=1024MB/64 = 16*1024*1024) */ #define DEFAULT_NALLOC (128*1024) #define DEFAULT_NALLOC_ALIGN 1024 #define DEFAULT_MAX_NALLOC (1024*1024*16) /* mutual exclusion defs go here */ #define LOCKED 100 #define UNLOCKED 101 static int lock_mode=UNLOCKED; /* enable locking only after armci is initailized as locks (and lock data structures) are initialized in PARMCI_Init */ #define LOCKIT(p) \ if(_armci_initialized && lock_mode==UNLOCKED) { \ NAT_LOCK(0,p); lock_mode=LOCKED; \ } #define UNLOCKIT(p) \ if(_armci_initialized && lock_mode==LOCKED) { \ NAT_UNLOCK(0,p); lock_mode=UNLOCKED; \ } static int do_verify = 0; /* Flag for automatic heap verification */ #define VALID1 0xaaaaaaaa /* For validity check on headers */ #define VALID2 0x55555555 #define USEDP 0 /* CHECK. By default anable this. */ static void kr_error(char *s, unsigned long i, context_t *ctx) { char string[256]; sprintf(string,"kr_malloc: %s %ld(0x%lx)\n", s, i, i); #if 0 kr_malloc_print_stats(ctx); #endif armci_die(string, i); } static Header *morecore(size_t nu, context_t *ctx, size_t *last_size, char **last_ptr) { char *cp; Header *up; #if DEBUG (void) printf("%d: morecore 1: Getting %ld more units of length %d nalloc=%d\n", armci_me, (long)nu, sizeof(Header),ctx->nalloc); (void) fflush(stdout); #endif if (ctx->total >= ctx->max_nalloc) { # if DEBUG armci_die("kr_malloc: morecore: maximum allocation reached",armci_me); # endif return (Header *) NULL; /* Enforce upper limit on core usage */ } #if 1 /* 07/03 ctx->nalloc is now the minimum # units we ask from OS */ nu = DEFAULT_NALLOC_ALIGN*((nu-1)/DEFAULT_NALLOC_ALIGN+1); if(nu < ctx->nalloc) nu = ctx->nalloc; #else nu = ctx->nalloc*((nu-1)/ctx->nalloc+1); /* nu must by a multiplicity of nalloc */ #endif #if DEBUG (void) printf("%d: morecore: Getting %ld more units of length %d\n", armci_me, (long)nu, sizeof(Header)); (void) fflush(stdout); #endif if ((cp =(char *)(*ctx->alloc_fptr)((size_t)nu * sizeof(Header))) == (char *)NULL) return (Header *) NULL; if(last_size!=NULL && last_ptr!=NULL){ *last_size = ((size_t)nu * sizeof(Header)); *last_ptr = cp; /*printf("\n%d:%s:got %p %d",armci_me,__FUNCTION__,*last_ptr,*last_size);*/ } /* if(armci_nclus==armci_nproc && armci_nclus!=1) armci_register_shmem(cp,((size_t)nu * sizeof(Header)),NULL,0,cp); */ ctx->total += nu; /* Have just got nu more units */ ctx->nchunk++; /* One more chunk */ ctx->nfrags++; /* Currently one more frag */ ctx->inuse += nu; /* Inuse will be decremented by kr_free */ up = (Header *) cp; up->s.size = nu; up->s.valid1 = VALID1; up->s.valid2 = VALID2; /* Insert into linked list of blocks in use so that kr_free works ... for debug only */ up->s.ptr = ctx->usedp; ctx->usedp = up; kr_free((char *)(up+1), ctx); /* Try to join into the free list */ return ctx->freep; } void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx) { int scale; if(usize <= 0) usize = sizeof(Header); scale = usize>>LOG_ALIGN; if(scale<1)fprintf(stderr,"Error: kr_malloc_init !!!\n"); if(nalloc==0) nalloc = DEFAULT_NALLOC; if(max_nalloc==0) max_nalloc = DEFAULT_MAX_NALLOC; ctx->usize = sizeof(Header); ctx->nalloc = nalloc * scale; ctx->max_nalloc = max_nalloc * scale; ctx->alloc_fptr = alloc_fptr; ctx->freep = NULL; ctx->usedp = NULL; ctx->shmid = -1; ctx->shmoffset = 0; ctx->shmsize = 0; ctx->ctx_type = -1; do_verify = debug; } char *_kr_last_ptr; size_t _kr_last_size; char *kr_malloc(size_t nbytes, context_t *ctx, int record_allocation, void **new_base, size_t *new_size) { Header *p, *prevp; size_t nunits; char *return_ptr; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) return kr_malloc_shmem(nbytes,ctx); #endif /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = 0; ctx->inuse = 0; ctx->nfrags = 0; ctx->maxuse = 0; ctx->nmcalls= 0; ctx->nfcalls= 0; /* Initialize linked list */ ctx->base.s.ptr = ctx->freep = prevp = &(ctx->base); ctx->base.s.size = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; } ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; for (p=prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) /* exact fit */ prevp->s.ptr = p->s.ptr; else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; return_ptr = (char *) (p+1); break; } if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx, &_kr_last_size,&_kr_last_ptr)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } } } if(record_allocation){ *((char **)new_base)=_kr_last_ptr; *new_size=_kr_last_size; } return return_ptr; } void kr_free(char *ap, context_t *ctx) { Header *bp, *p, **up; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) { kr_free_shmem(ap,ctx); return; } #endif ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=ctx->freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else p->s.ptr = bp; ctx->freep = p; } /* end if on ap */ } /* Print to standard output the usage statistics. */ void kr_malloc_print_stats(context_t *ctx) { fflush(stderr); printf("\nkr_malloc statistics\n-------------------\n\n"); printf("Total memory from system ... %ld bytes\n", (long)(ctx->total*ctx->usize)); printf("Current memory usage ....... %ld bytes\n", (long)(ctx->inuse*ctx->usize)); printf("Maximum memory usage ....... %ld bytes\n", (long)(ctx->maxuse*ctx->usize)); printf("No. chunks from system ..... %ld\n", ctx->nchunk); printf("No. of fragments ........... %ld\n", ctx->nfrags); printf("No. of calls to kr_malloc ... %ld\n", ctx->nmcalls); printf("No. of calls to kr_free ..... %ld\n", ctx->nfcalls); printf("\n"); fflush(stdout); } /* Currently assumes that are working in a single region. */ void kr_malloc_verify(context_t *ctx) { Header *p; if(_armci_initialized && lock_mode==UNLOCKED) { LOCKIT(armci_master); lock_mode=LOCKED; } if ( ctx->freep ) { /* Check the used list */ for (p=ctx->usedp; p; p=p->s.ptr) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on usedlist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on usedlist", (unsigned long) p->s.size, ctx); } /* Check the free list */ p = ctx->base.s.ptr; while (p != &(ctx->base)) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on freelist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on freelist", (unsigned long) p->s.size, ctx); p = p->s.ptr; } } /* end if */ if(_armci_initialized && lock_mode==LOCKED) { UNLOCKIT(armci_master); lock_mode=UNLOCKED; } } /********************** BEGIN: kr_malloc for ctx_shmem *********************/ #if defined(SYSV) || defined(MMAP) #include "armci_shmem.h" extern int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize); extern Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize); /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset) */ #define SHM_PTR(hdr) armci_get_shmem_ptr((hdr)->s.shmid, (hdr)->s.shmoffset, (hdr)->s.shmsize) /* * kr_malloc_shmem: memory allocator for shmem context (i.e ctx_shmem) */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { Header *p, *prevp; size_t nunits, prev_shmsize=0; char *return_ptr; int prev_shmid=-1; long prev_shmoffset=0; LOCKIT(armci_master); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("kr_malloc_shmem: Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = ctx->inuse = ctx->maxuse = 0; ctx->nfrags = ctx->nmcalls = ctx->nfcalls = 0; /* Initialize linked list */ ctx->base.s.size = 0; ctx->base.s.shmid = -1; ctx->base.s.shmoffset = 0; ctx->base.s.shmsize = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; if ((p = morecore(nunits, ctx,NULL,NULL)) == (Header *) NULL) return NULL; ctx->base.s.ptr = prevp = ctx->freep; /* CHECK */ } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; prevp = ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); for (p=SHM_PTR(prevp); ; prevp = p, p = SHM_PTR(p)) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) { /* exact fit */ prevp->s.ptr = p->s.ptr; prevp->s.shmid = p->s.shmid; prevp->s.shmoffset = p->s.shmoffset; prevp->s.shmsize = p->s.shmsize; } else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } #if USEDP /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; #endif ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; ctx->shmid = prev_shmid; ctx->shmoffset = prev_shmoffset; ctx->shmsize = prev_shmsize; return_ptr = (char *) (p+1); break; } prev_shmid = prevp->s.shmid; prev_shmoffset = prevp->s.shmoffset; prev_shmsize = prevp->s.shmsize; if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx,NULL,NULL)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; } } UNLOCKIT(armci_master); return return_ptr; } static void kr_free_shmem(char *ap, context_t *ctx) { Header *bp, *p, **up, *nextp; int shmid=-1; long shmoffset=0; size_t shmsize=0; LOCKIT(armci_master); ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free_shmem: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ #if USEDP /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free_shmem: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } #endif if(ctx->shmid==-1) { armci_get_shmem_info((char*)bp, &ctx->shmid, &ctx->shmoffset, &ctx->shmsize); ctx->base.s.shmid = ctx->shmid; ctx->base.s.shmsize = ctx->shmsize; ctx->base.s.shmoffset = ctx->shmoffset; p = ctx->freep = bp; p->s.ptr = bp; p->s.size-=SHMEM_CTX_BYTES; /*memory to store shmem info in context*/ p->s.shmid = ctx->shmid; p->s.shmsize = ctx->shmsize; p->s.shmoffset = ctx->shmoffset; UNLOCKIT(armci_master); return; } ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); shmid = ctx->shmid; shmoffset = ctx->shmoffset; shmsize = ctx->shmsize; /* Join the memory back into the free linked list */ p = ctx->freep; nextp = SHM_PTR(p); for ( ; !(bp > p && bp < nextp); p=nextp, nextp=SHM_PTR(p)) { if (p >= nextp && (bp > p || bp < nextp)) break; /* Freed block at start or end of arena */ nextp = SHM_PTR(p); shmid = p->s.shmid; shmoffset = p->s.shmoffset; shmsize = p->s.shmsize; } if (bp + bp->s.size == nextp) {/* join to upper neighbour */ bp->s.size += nextp->s.size; bp->s.ptr = nextp->s.ptr; ctx->nfrags--; /* Lost a fragment */ bp->s.shmid = nextp->s.shmid; bp->s.shmoffset = nextp->s.shmoffset; bp->s.shmsize = nextp->s.shmsize; } else { bp->s.ptr = nextp; bp->s.shmid = p->s.shmid; bp->s.shmoffset = p->s.shmoffset; bp->s.shmsize = p->s.shmsize; } if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ p->s.shmid = bp->s.shmid; p->s.shmoffset = bp->s.shmoffset; p->s.shmsize = bp->s.shmsize; } else { p->s.ptr = bp; armci_get_shmem_info((char*)bp, &p->s.shmid, &p->s.shmoffset, &p->s.shmsize); } ctx->freep = p; ctx->shmid = shmid; ctx->shmoffset = shmoffset; ctx->shmsize = shmsize; } /* end if on ap */ UNLOCKIT(armci_master); } #else /* #ifdef SYSV */ /* What are doing here */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { armci_die("kr_malloc_shmem(): Invalid Function Call", 0L); } static void kr_free_shmem(char *ap, context_t *ctx) { armci_die("kr_free_shmem(): Invalid Function Call", 0L); } #endif /* #ifdef SYSV */ /********************** END: kr_malloc for ctx_shmem *********************/ /** issues: 1. do usage statistics only if debug/DEBUG is enabled */ ga-5-4/armci/src-gemini/acc.h0000644000175000017500000002175512662210416014071 0ustar mbamba#ifndef _ACC_H_ #define _ACC_H_ typedef struct { float real; float imag; } complex_t; typedef struct { double real; double imag; } dcomplex_t; void c_d_accumulate_1d_(const double* const restrict alpha, double* const restrict A, const double* const restrict B, const int* const restrict rows); void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows); void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows); void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows); void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows); void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows); void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows); void c_d_accumulate_2d_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void c_d_accumulate_2d_u_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_u_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_u_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_u_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_u_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_u_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_u_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void RA_ACCUMULATE_2D_(long*, int*, int*, long*, int*, long*, int*); void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); #define I_ACCUMULATE_1D c_i_accumulate_1d_ #define L_ACCUMULATE_1D c_l_accumulate_1d_ #define LL_ACCUMULATE_1D c_ll_accumulate_1d_ #define D_ACCUMULATE_1D c_d_accumulate_1d_ #define C_ACCUMULATE_1D c_c_accumulate_1d_ #define Z_ACCUMULATE_1D c_z_accumulate_1d_ #define F_ACCUMULATE_1D c_f_accumulate_1d_ #define I_ACCUMULATE_2D c_i_accumulate_2d_ #define L_ACCUMULATE_2D c_l_accumulate_2d_ #define LL_ACCUMULATE_2D c_ll_accumulate_2d_ #define D_ACCUMULATE_2D c_d_accumulate_2d_ #define C_ACCUMULATE_2D c_c_accumulate_2d_ #define Z_ACCUMULATE_2D c_z_accumulate_2d_ #define F_ACCUMULATE_2D c_f_accumulate_2d_ #define FORT_DADD c_dadd_ #define FORT_DADD2 c_dadd2_ #define FORT_DMULT c_dmult_ #define FORT_DMULT2 c_dmult2_ #endif /* _ACC_H_ */ ga-5-4/armci/src-gemini/memory.c0000644000175000017500000010305412662210416014637 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: memory.c,v 1.56.2.3 2007-04-25 23:49:55 d3p687 Exp $ */ #ifndef NEW_MALLOC #include #include #include "armcip.h" #include "message.h" #include "kr_malloc.h" #define DEBUG_ 0 #define USE_MALLOC #define USE_SHMEM_ #define SHM_UNIT 1024 static context_t ctx_localmem; /* static context_t ctx_mlocalmem; */ #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) #include "armci_shmem.h" #if !defined(USE_SHMEM) && (defined(HITACHI) || defined(MULTI_CTX)) # define USE_SHMEM #endif #if !(defined(LAPI)||defined(QUADRICS)||defined(SERVER_THREAD)) ||\ defined(USE_SHMEM)||defined(LIBONESIDED) #define RMA_NEEDS_SHMEM #endif void kr_check_local() { #if 0 kr_malloc_print_stats(&ctx_localmem); #endif kr_malloc_verify(&ctx_localmem); } void armci_print_ptr(void **ptr_arr, int bytes, int size, void* myptr, int off) { int i; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); for(i=0; i< armci_nproc; i++){ int j; if(armci_me ==i){ printf("%d master =%d nproc=%d off=%d\n",armci_me, armci_master,nproc, off); printf("%d:bytes=%d mptr=%p s=%d ",armci_me, bytes, myptr,size); for(j = 0; j< armci_nproc; j++)printf(" %p",ptr_arr[j]); printf("\n"); fflush(stdout); } armci_msg_barrier(); } ARMCI_PR_DBG("exit",0); } /*\ master exports its address of shmem region at the beggining of that region \*/ static void armci_master_exp_attached_ptr(void* ptr) { ARMCI_PR_DBG("enter",0); if(!ptr) armci_die("armci_master_exp_att_ptr: null ptr",0); *(volatile void**)ptr = ptr; ARMCI_PR_DBG("exit",0); } /*\ Collective Memory Allocation on shared memory systems \*/ void armci_shmem_malloc(void *ptr_arr[], armci_size_t bytes) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(armci_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc:calloc failed",armci_nproc); /* allocate arrays for cluster address translations */ ptr_ref_arr = calloc(armci_nclus,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc:calloc 2 failed",armci_nclus); /* combine all memory requests into size_arr */ size_arr[armci_me] = bytes; armci_msg_lgop(size_arr, armci_nproc, "+"); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< nproc; i++) size += size_arr[i+armci_master]; /* master process creates shmem region and then others attach to it */ if(armci_me == armci_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if(nproc == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 )armci_die("armci_malloc: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc addr mptr=%p size=%ld\n",armci_me,myptr,size); fflush(stdout); } } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # if defined(DATA_SERVER) /* get server reference address for every cluster node to perform * remote address translation for global address space */ if(armci_nclus>1){ if(armci_me == armci_master){ # ifdef SERVER_THREAD ptr_ref_arr[armci_clus_me]=myptr; # else { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[armci_clus_me]= myptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[armci_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",armci_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ armci_exchange_address(ptr_ref_arr, armci_nclus); # ifdef ARMCI_REGISTER_SHMEM armci_register_shmem(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me]); # endif }else { ptr_ref_arr[armci_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < armci_nclus; cn++){ int master = armci_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (armci_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< armci_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] = (size_arr[i+master])? ((char*)ptr)+offset : NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< nproc; i++) { ptr_ref_arr[i] = (size_arr[i+armci_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+armci_master]; } /* exchange addreses with all other processes */ ptr_arr[armci_me] = (char*)ptr_ref_arr[armci_me-armci_master]; armci_exchange_address(ptr_arr, armci_nproc); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+armci_master), nproc*sizeof(void*)); /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ # endif armci_msg_barrier(); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } /******************************************************************** * Non-collective Memory Allocation on shared memory systems \*/ void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMIptr used in ARMCI data xfer ops */ long idlist[SHMIDLEN]; /* can malloc if there is no data server process & has 1 process/node*/ #ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else #endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_shmem_memget: create failed", (int)(size>>10)); if(DEBUG_) { printf("%d: armci_shmem_memget: addr=%p size=%ld %ld %ld \n", armci_me, myptr, size, idlist[0], idlist[1]); fflush(stdout); } armci_ptr = myptr; #if defined(DATA_SERVER) /* get server reference address to perform * remote address translation for global address space */ if(armci_nclus>1) { # ifdef SERVER_THREAD /* data server thread runs on master process */ if(armci_me != armci_master) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } # else /* ask dataserver process to attach to region and get ptr*/ { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } } # endif } #endif /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; bcopy(idlist, meminfo->idlist, SHMIDLEN*sizeof(long)); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { void *ptr=NULL; long size = (long) meminfo->size; long *idlist = (long*) meminfo->idlist; if(SAMECLUSNODE(meminfo->cpid)) { /* Attach to the shared memory segment */ ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("ARMCi_Memat: could not attach", (int)(size>>10)); /* CHECK: now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(ptr); } else { ptr = meminfo->armci_addr; /* remote address */ } return ptr; } void armci_shmem_memctl(armci_meminfo_t *meminfo) { /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { void *ptr = meminfo->addr; #ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); #else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); #endif } } /****** End: Non-collective memory allocation on shared memory systems *****/ #ifdef MSG_COMMS_MPI /******************************************************************** * Group Memory Allocation on shared memory systems for ARMCI Groups \*/ void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; /* int nproc = armci_clus_info[armci_clus_me].nslave; ? change ? */ int grp_me, grp_nproc, grp_nclus, grp_master, grp_clus_nproc, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); /* Get the group info: group size & group rank */ ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } grp_nclus = grp_attr->grp_nclus; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; grp_clus_nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(grp_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc_group:calloc failed",grp_nproc); /* allocate arrays for cluster address translations */ # if defined(DATA_SERVER) len = grp_nclus; # else len = grp_clus_nproc; # endif ptr_ref_arr = calloc(len,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc_group:calloc 2 failed",len); /* combine all memory requests into size_arr */ size_arr[grp_me] = bytes; armci_msg_group_gop_scope(SCOPE_ALL, size_arr, grp_nproc, "+", ARMCI_LONG, group); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< grp_clus_nproc; i++) size += size_arr[i+grp_master]; /* master process creates shmem region and then others attach to it */ if(grp_me == grp_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_malloc_group: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc_group addr mptr=%p ref=%p size=%ld %ld %ld \n",armci_me,myptr,*(void**)myptr, size,idlist[0],idlist[1]); fflush(stdout); } } /* broadcast shmem id to other processes (in the same group) on the same cluster node */ armci_grp_clus_brdcst(idlist, SHMIDLEN*sizeof(long), grp_master, grp_clus_nproc, group); if(grp_me != grp_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc_group: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc_group attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # if defined(DATA_SERVER) /* get server reference address for every cluster node in the group * to perform remote address translation for global address space */ if(grp_nclus>1){ if(grp_me == grp_master){ # ifdef SERVER_THREAD /* data server thread runs on master process */ if(ARMCI_Absolute_id(group,grp_master)!=armci_master){ /*printf("\n%d: grp_master=%d %ld %ld \n",armci_me,ARMCI_Absolute_id(group,grp_master),idlist[0],idlist[1]);*/ armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else ptr_ref_arr[grp_clus_me]=myptr; # else /* ask data server process to attach to the region and get ptr */ { extern int _armci_server_started; if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[grp_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",grp_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ { int ratio = sizeof(void*)/sizeof(int); if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); armci_msg_group_gop_scope(SCOPE_ALL, ptr_ref_arr, grp_nclus*ratio, "+", ARMCI_INT, group); # ifdef ARMCI_REGISTER_SHMEM armci_register_shmem_grp(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me],group); # endif } }else { ptr_ref_arr[grp_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < grp_nclus; cn++){ int master = grp_attr->grp_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (grp_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< grp_attr->grp_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] =(size_arr[i+master])? ((char*)ptr)+offset: NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< grp_clus_nproc; i++) { ptr_ref_arr[i] = (size_arr[i+grp_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+grp_master]; } /* exchange addreses with all other processes */ ptr_arr[grp_me] = (char*)ptr_ref_arr[grp_me-grp_master]; armci_exchange_address_grp(ptr_arr, grp_nproc, group); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+grp_master), grp_clus_nproc*sizeof(void*)); # endif /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ armci_msg_group_barrier(group); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } #endif /* ifdef MSG_COMMS_MPI */ #else void armci_shmem_malloc(void* ptr_arr[], int bytes) { armci_die("armci_shmem_malloc should never be called on this system",0); } void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { armci_die("armci_shmem_memget should never be called on this system",0); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memat should never be called on this system",0); } void armci_shmem_memctl(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memctl should never be called on this system",0); } # ifdef MSG_COMMS_MPI void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { armci_die("armci_shmem_malloc_group should never be called on this system",0); } # endif #endif /* public constructor to initialize the kr_malloc context */ void armci_krmalloc_init_localmem() { #if defined(ALLOW_PIN) kr_malloc_init(0, 0, 0, reg_malloc, 0, &ctx_localmem); kr_malloc_init(0, 0, 0, malloc, 0, &ctx_mlocalmem); ctx_mlocalmem.ctx_type = KR_CTX_LOCALMEM; #elif defined(CRAY_SHMEM) && defined(CRAY_XT) # ifdef CATAMOUNT int units_avail = (cnos_shmem_size() - 1024 * 1024) / SHM_UNIT; # else extern size_t get_xt_heapsize(); int units_avail = (get_xt_heapsize() - 1024 * 1024) / SHM_UNIT; # endif if(DEBUG_) { fprintf(stderr,"%d:krmalloc_init_localmem: symheap=%llu,units(%d)=%d\n", armci_me, SHM_UNIT*units_avail, SHM_UNIT, units_avail); } kr_malloc_init(SHM_UNIT, units_avail, units_avail, shmalloc, 0, &ctx_localmem); armci_shmalloc_exchange_offsets(&ctx_localmem); #else kr_malloc_init(0, 0, 0, malloc, 0, &ctx_localmem); #endif ctx_localmem.ctx_type = KR_CTX_LOCALMEM; } /** * Local Memory Allocation and Free */ void *PARMCI_Malloc_local(armci_size_t bytes) { void *rptr; ARMCI_PR_DBG("enter",0); ARMCI_PR_DBG("exit",0); rptr = (void *)kr_malloc((size_t)bytes, &ctx_localmem, 0, NULL, NULL); # ifdef CRAY_REGISTER_ARMCI_MALLOC onesided_hnd_t cp_hnd; cos_mdesc_t local_mdesc; // get the onesided v2.0 api handle for the compute process cpGetOnesidedHandle(&cp_hnd); // register the memory onesided_mem_register(cp_hnd, rptr, bytes, 0, &local_mdesc); // for now; until we can search through the linked-list of registered memory // to deregister it by pointer (ptr) value only [see ARMCI_Free_local], we'll // take advanatage of lazy deregistration and assume that this segment will // be kept around as long as it's active. onesided_mem_deregister(cp_hnd, &local_mdesc); # endif //printf("\n%d:%s:%d:%p\n",armci_me,__FUNCTION__,bytes,rptr); return rptr; } int PARMCI_Free_local(void *ptr) { ARMCI_PR_DBG("enter",0); kr_free((char *)ptr, &ctx_localmem); ARMCI_PR_DBG("exit",0); return 0; } /*\ Collective Memory Allocation * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int PARMCI_Malloc(void *ptr_arr[], armci_size_t bytes) { void *ptr; char *new_base; size_t new_size=0; ARMCI_PR_DBG("enter",0); if(DEBUG_){ fprintf(stderr,"%d bytes in armci_malloc %d\n",armci_me, (int)bytes); fflush(stderr); armci_msg_barrier(); } # ifdef USE_MALLOC if(armci_nproc == 1) { # ifdef CRAY_REGISTER_ARMCI_MALLOC printf("%d: special case where ARMCI_Malloc uses malloc for nppn=1 - broken!\n",armci_me); abort(); # endif ptr = kr_malloc((size_t) bytes, &ctx_localmem, 0, NULL, NULL); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 1 failed",(int)bytes); ptr_arr[armci_me] = ptr; ARMCI_PR_DBG("exit",0); return (0); } # endif // static int one_time = 0; if( ARMCI_Uses_shm() ) { // if(one_time++ == 0 && armci_me==0) printf("%d: ARMCI_Uses_shm = true\n",armci_me); armci_shmem_malloc(ptr_arr,bytes); } else { /* on distributed-memory systems just malloc & collect all addresses */ ptr = kr_malloc(bytes, &ctx_localmem, 1, &new_base, &new_size); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 2 failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); # ifdef ARMCI_REGISTER_SHMEM if(new_size) armci_register_shmem(new_base,new_size,NULL,0,new_base); else armci_register_shmem(ptr,bytes,NULL,0,ptr); # endif } # ifdef CRAY_REGISTER_ARMCI_MALLOC int i; cos_comm_t info; cos_mdesc_t mdesc, *mdhs; onesided_hnd_t cp_hnd; //uint64_t options = 0; uint64_t options = ONESIDED_MEM_NO_UDREG | ONESIDED_MEM_NO_RX_CQH; remote_mdh_node_t *ll; int node_master = armci_me; long total_bytes, lbytes = (long) bytes; NTK_MPI_GetComm(MPI_COMM_WORLD, &info); long *bytes_per_rank = (long *) malloc(info.numa_np*sizeof(long)); // not a wonderfully scalable solution // revisit this at a later time and make the storage node based if(info.np > 80000 && armci_me == 0) { // make it obvious!!!! for(i=0; i<50; i++) printf("WARNING: Examine ARMCI_Malloc for memory scaling issues at large scale.\n"); } mdhs = (cos_mdesc_t *) malloc(info.np*sizeof(cos_mdesc_t)); ptr = ptr_arr[armci_me]; // determine the total number of bytes on the node that were allocated // also allgather the number of bytes per rank on the node so we can set the offsets MPI_Allreduce(&lbytes, &total_bytes, 1, MPI_LONG, MPI_SUM, info.numa_comm); MPI_Allgather(&lbytes, 1, MPI_LONG, bytes_per_rank, 1, MPI_LONG, info.numa_comm); // get the onesided v2.0 api handle for the compute process cpGetOnesidedHandle(&cp_hnd); if(info.numa_me == 0 && total_bytes) { // register the data for the entire node // ABHINAV: ASSERT(armci_me == node master) onesided_mem_register(cp_hnd, ptr, total_bytes, options, &mdesc); } else { bzero(&mdesc, sizeof(cos_mdesc_t)); } // bcast rank of the node master and and the mdesc for the nodes shared-memory segment MPI_Bcast(&node_master, 1, MPI_INT, 0, info.numa_comm); MPI_Bcast(&mdesc, sizeof(cos_mdesc_t), MPI_BYTE, 0, info.numa_comm); // each rank need to compare is starting virtual address to the master's starting virtual // address. if it is differnet (ptr != mdesc.addr), then set the offset // each rank will update mdesc to point at the memory region it owns uint64_t offset = 0; for(i=0; i<(armci_me-node_master); i++) offset += bytes_per_rank[i]; mdesc.addr += offset; mdesc.length = bytes_per_rank[armci_me-node_master]; // now we allgather over all np ranks - this used to be over the node master - much more scalable // but i couldn't come up with a simple solution to look up remote mdhs MPI_Allgather(&mdesc, sizeof(cos_mdesc_t), MPI_BYTE, mdhs, sizeof(cos_mdesc_t), MPI_BYTE, info.world_comm); // update the linked list ll = remote_mdh_base_node; if(ll == NULL) { remote_mdh_base_node = ll = (remote_mdh_node_t *) malloc(sizeof(remote_mdh_node_t)); ll->ptrs = ptr_arr; ll->mdhs = mdhs; ll->next = NULL; } else { while(ll->next != NULL) { ll = ll->next; } assert(ll->next == NULL); ll->next = (remote_mdh_node_t *) malloc(sizeof(remote_mdh_node_t)); ll = ll->next; ll->ptrs = ptr_arr; ll->mdhs = mdhs; ll->next = NULL; } # endif ARMCI_PR_DBG("exit",0); //printf("\n%d:%s:%d:%p\n",armci_me,__FUNCTION__,bytes,ptr_arr[armci_me]); return(0); } /*\ shared memory is released to kr_malloc only on process 0 * with data server malloc cannot be used \*/ int PARMCI_Free(void *ptr) { ARMCI_PR_DBG("enter",0); # ifdef CRAY_REGISTER_ARMCI_MALLOC // assumes that PARMCI_Free is a collective operation, the following function requires // a collective operation for all ranks on the node armci_onesided_remove_from_remote_mdh_list(ptr); # endif // if ptr is NULL, we can now return if(!ptr)return 1; # if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(NO_SHM) # ifdef USE_MALLOC if(armci_nproc > 1) # endif if(ARMCI_Uses_shm()){ if(armci_me==armci_master){ # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) { kr_free(ptr, &ctx_localmem); // Free_Shmem_Ptr(0,0,ptr); } # endif } ptr = NULL; return 0; } # endif // kr_free(ptr, &ctx_localmem); //armci_unregister_shmem(ptr,0); ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } int ARMCI_Uses_shm() { int uses=0; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(armci_nproc >1) uses= 1; /* always unless serial mode */ # else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_ || 0) fprintf(stderr,"%d:uses shmem %d\n",armci_me, uses); return uses; } #ifdef MSG_COMMS_MPI int ARMCI_Uses_shm_grp(ARMCI_Group *group) { int uses=0, grp_me, grp_nproc, grp_nclus; ARMCI_PR_DBG("enter",0); armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); grp_nclus = grp_attr->grp_nclus; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(grp_nproc >1) uses= 1; /* always unless serial mode */ # else if(grp_nproc != grp_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d (grp_id=%d):uses shmem %d\n",armci_me, grp_me, uses); ARMCI_PR_DBG("exit",0); return uses; } /*\ ************** Begin Group Collective Memory Allocation ****************** * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *ptr; int grp_me, grp_nproc; ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(DEBUG_)fprintf(stderr,"%d (grp_id=%d) bytes in armci_malloc_group %d\n", armci_me, grp_me, (int)bytes); #ifdef USE_MALLOC if(grp_nproc == 1) { ptr = kr_malloc((size_t) bytes, &ctx_localmem, 0, NULL, NULL); if(bytes) if(!ptr) armci_die("armci_malloc_group:malloc 1 failed",(int)bytes); ptr_arr[grp_me] = ptr; ARMCI_PR_DBG("exit",0); return (0); } #endif if( ARMCI_Uses_shm_grp(group) ) { # ifdef SGIALTIX armci_altix_shm_malloc_group(ptr_arr,bytes,group); # else armci_shmem_malloc_group(ptr_arr,bytes,group); # endif } else { void *new_base=NULL; size_t new_size=NULL; ptr = kr_malloc(bytes, &ctx_localmem, 1, &new_base, &new_size); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 2 failed",bytes); bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); ptr_arr[grp_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address_grp(ptr_arr, grp_nproc, group); } ARMCI_PR_DBG("exit",0); return(0); } /*\ shared memory is released to kr_malloc only on process 0 * with data server malloc cannot be used \*/ int ARMCI_Free_group(void *ptr, ARMCI_Group *group) { int grp_me, grp_nproc, grp_master, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } /* get the group cluster info */ grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; # if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(NO_SHM) # ifdef USE_MALLOC if(grp_nproc > 1) # endif if(ARMCI_Uses_shm_grp(group)){ if(grp_me == grp_master) { # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); # endif } ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } # endif kr_free(ptr, &ctx_localmem); ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } /* ***************** End Group Collective Memory Allocation ******************/ /* ************** Begin Non-Collective Memory Allocation ****************** * Prototype similar to SysV shared memory. */ /** * CHECK: On Altix we are forced to use SysV as shmalloc is collective. We * may use a preallocated shmalloc memory, however, it may NOT still solve * our problem... * NOTE: "int memflg" option for future optimiztions. */ void PARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMI ptr used in ARMCI data xfer ops*/ size_t size = bytes; if(size<=0) armci_die("PARMCI_Memget: size must be > 0", (int)size); if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("PARMCI_Memget: Invalid memflg", memflg); if( !ARMCI_Uses_shm() ) { armci_ptr = myptr = kr_malloc(size, &ctx_localmem, 0, NULL, NULL); if(size) if(!myptr) armci_die("PARMCI_Memget failed", (int)size); /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; /* meminfo->attr = NULL; */ } else { armci_shmem_memget(meminfo, size); } if(DEBUG_){ printf("%d: PARMCI_Memget: addresses server=%p myptr=%p bytes=%ld\n", armci_me, meminfo->armci_addr, meminfo->addr, bytes); fflush(stdout); } } void* PARMCI_Memat(armci_meminfo_t *meminfo, long memflg) { void *ptr=NULL; if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("PARMCI_Memget: Invalid memflg", memflg); if(meminfo->cpid==armci_me) { ptr = meminfo->addr; return ptr; } if( !ARMCI_Uses_shm()) { ptr = meminfo->addr; } else { ptr = armci_shmem_memat(meminfo); } if(DEBUG_) { printf("%d:PARMCI_Memat: attached addr mptr=%p size=%ld\n", armci_me, ptr, meminfo->size); fflush(stdout); } return ptr; } void ARMCI_Memdt(armci_meminfo_t *meminfo, int memflg) { /** * Do nothing. May be we need to have reference counting in future. This * is to avoid the case of dangling pointers when the creator of shm * segment calls Memctl and other processes are still attached to this * segment */ } void ARMCI_Memctl(armci_meminfo_t *meminfo) { if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { if( !ARMCI_Uses_shm() ) { void *ptr = meminfo->addr; kr_free(ptr, &ctx_localmem); } else { armci_shmem_memctl(meminfo); } } meminfo->addr = NULL; meminfo->armci_addr = NULL; /* if(meminfo->attr!=NULL) free(meminfo->attr); */ } /* ***************** End Non-Collective Memory Allocation ******************/ #endif #endif ga-5-4/armci/src-gemini/new_memory.c0000644000175000017500000002557112662210416015517 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include "armcip.h" #include "message.h" #define DEBUG_ 0 #define USE_SHMEM_ #define SHM_UNIT 1024 void armci_print_ptr(void **ptr_arr, int bytes, int size, void* myptr, int off) { int i; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); for(i=0; i< armci_nproc; i++){ int j; if(armci_me ==i){ printf("%d master =%d nproc=%d off=%d\n",armci_me, armci_master,nproc, off); printf("%d:bytes=%d mptr=%p s=%d ",armci_me, bytes, myptr,size); for(j = 0; j< armci_nproc; j++)printf(" %p",ptr_arr[j]); printf("\n"); fflush(stdout); } armci_msg_barrier(); } ARMCI_PR_DBG("exit",0); } /******************************************************************** * Non-collective Memory Allocation on shared memory systems \*/ void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMIptr used in ARMCI data xfer ops */ /* can malloc if there is no data server process & has 1 process/node*/ } void* armci_shmem_memat(armci_meminfo_t *meminfo) { return NULL; } void armci_shmem_memctl(armci_meminfo_t *meminfo) { } /****** End: Non-collective memory allocation on shared memory systems *****/ /** * Local Memory Allocation and Free */ void *PARMCI_Malloc_local(armci_size_t bytes) { void *rptr; ARMCI_PR_DBG("enter",0); ARMCI_PR_DBG("exit",0); return malloc(bytes); } int PARMCI_Free_local(void *ptr) { ARMCI_PR_DBG("enter",0); free(ptr); ARMCI_PR_DBG("exit",0); return 0; } /*\ A wrapper to shmget. Just to be sure that ID is not 0. \*/ static int armci_shmget(size_t size,char *from) { int id; id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); /*attaching with id 0 somehow fails (Seen on pentium4+linux24+gm163) *so if id=0, shmget again. */ while(id==0){ /* free id=0 and get a new one */ if(shmctl((int)id,IPC_RMID,(struct shmid_ds *)NULL)) { fprintf(stderr,"id=%d \n",id); armci_die("allocate: failed to _delete_ shared region ",id); } id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); } if(DEBUG_){ printf("\n%d:armci_shmget sz=%ld caller=%s id=%d\n",armci_me,(long)size, from,id); fflush(stdout); } return(id); } /*\ Collective Memory Allocation * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm shm %d",id); int PARMCI_Malloc(void *ptr_arr[], armci_size_t bytes) { int mynslave = armci_clus_info[armci_clus_me].nslave; void *servptr,*mynodeptrs[mynslave]; int id,nodeids[mynslave],mynodeid=armci_me-armci_master; ARMCI_PR_DBG("enter",0); #ifdef DEBUG_MEM fprintf(stderr,"%d bytes in armci_malloc %d\n",armci_me, (int)bytes); fflush(stderr); armci_msg_barrier(); #endif if(bytes>0){ if(mynslave>1){ #ifdef DEBUG_MEM printf("\n%d:%s:mynslave is %d",armci_me,__FUNCTION__,mynslave);fflush(stdout); #endif bzero((void *)nodeids,sizeof(int)*mynslave); id =nodeids[mynodeid]= armci_shmget(bytes,"PARMCI_Malloc"); armci_msg_gop_scope(SCOPE_NODE,nodeids,mynslave,"+",ARMCI_INT); for(int i=0;i1){ servptr = armci_server_ptr(id); } else servptr = mynodeptrs[mynodeid]; } else{ #ifdef DEBUG_MEM printf("\n%d:%s:mynslave is %d, doing malloc",armci_me,__FUNCTION__,mynslave);fflush(stdout); #endif mynodeptrs[mynodeid] = servptr = malloc(bytes); } } else{ mynodeptrs[mynodeid] = servptr = NULL; } bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); /*ptr_arr[armci_me] = servptr;*/ ptr_arr[armci_me] = mynodeptrs[mynodeid]; armci_exchange_address(ptr_arr,armci_nproc); if(mynslave>1)for(int i=0;i1){ armci_portals_memsetup((long)servptr-(long)ptr_arr[armci_me]); } ARMCI_PR_DBG("exit",0); return(0); } int PARMCI_Free(void *ptr) { ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_PR_DBG("exit",0); return 0; } int ARMCI_Uses_shm() { int uses=0; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(armci_nproc >1) uses= 1; /* always unless serial mode */ # else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d:uses shmem %d\n",armci_me, uses); return uses; } #ifdef MSG_COMMS_MPI int ARMCI_Uses_shm_grp(ARMCI_Group *group) { int uses=0, grp_me, grp_nproc, grp_nclus; ARMCI_PR_DBG("enter",0); armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); grp_nclus = grp_attr->grp_nclus; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) \ && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(grp_nproc >1) uses= 1; /* always unless serial mode */ # else if(grp_nproc != grp_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d (grp_id=%d):uses shmem %d\n",armci_me, grp_me, uses); ARMCI_PR_DBG("exit",0); return uses; } /*\ ************** Begin Group Collective Memory Allocation ****************** * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *ptr; int grp_me, grp_nproc; ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(DEBUG_)fprintf(stderr,"%d (grp_id=%d) bytes in armci_malloc_group %d\n", armci_me, grp_me, (int)bytes); ARMCI_PR_DBG("exit",0); return(0); } int ARMCI_Free_group(void *ptr, ARMCI_Group *group) { int grp_me, grp_nproc, grp_master, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } /* get the group cluster info */ grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; ARMCI_PR_DBG("exit",0); return 0; } /* ***************** End Group Collective Memory Allocation ******************/ /* ************** Begin Non-Collective Memory Allocation ****************** * Prototype similar to SysV shared memory. */ /** * CHECK: On Altix we are forced to use SysV as shmalloc is collective. We * may use a preallocated shmalloc memory, however, it may NOT still solve * our problem... * NOTE: "int memflg" option for future optimiztions. */ void PARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMI ptr used in ARMCI data xfer ops*/ size_t size = bytes; if(size<=0) armci_die("PARMCI_Memget: size must be > 0", (int)size); if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("PARMCI_Memget: Invalid memflg", memflg); if( !ARMCI_Uses_shm() ) { /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; /* meminfo->attr = NULL; */ } else { armci_shmem_memget(meminfo, size); } if(DEBUG_){ printf("%d: PARMCI_Memget: addresses server=%p myptr=%p bytes=%ld\n", armci_me, meminfo->armci_addr, meminfo->addr, bytes); fflush(stdout); } } void* PARMCI_Memat(armci_meminfo_t *meminfo, long memflg) { void *ptr=NULL; if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("PARMCI_Memget: Invalid memflg", memflg); if(meminfo->cpid==armci_me) { ptr = meminfo->addr; return ptr; } if( !ARMCI_Uses_shm()) { ptr = meminfo->addr; } else { ptr = armci_shmem_memat(meminfo); } if(DEBUG_) { printf("%d:PARMCI_Memat: attached addr mptr=%p size=%ld\n", armci_me, ptr, meminfo->size); fflush(stdout); } return ptr; } void ARMCI_Memdt(armci_meminfo_t *meminfo, int memflg) { /** * Do nothing. May be we need to have reference counting in future. This * is to avoid the case of dangling pointers when the creator of shm * segment calls Memctl and other processes are still attached to this * segment */ } void ARMCI_Memctl(armci_meminfo_t *meminfo) { if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { if( !ARMCI_Uses_shm() ) { void *ptr = meminfo->addr; } else { armci_shmem_memctl(meminfo); } } meminfo->addr = NULL; meminfo->armci_addr = NULL; /* if(meminfo->attr!=NULL) free(meminfo->attr); */ } /* ***************** End Non-Collective Memory Allocation ******************/ #endif ga-5-4/armci/src-gemini/code_options.h0000644000175000017500000001234112662210416016017 0ustar mbamba/* Questions: ORNL - tipparajuv@ornl.gov CRAY - ryan@cray.com */ /* --------------------------------------------------------------------------- *\ PORTALS_USE_RENDEZ_VOUS ======================= When the number of PEs gets very large, the data server is required to have buffer space available for all possible incoming messages which is defined by PORTALS_MAX_DESCRIPTORS = (MAX_BUFS+MAX_SMALL_BUFS). For each PE, the DS must have at least: min_memory_per_pe = PORTALS_MAX_BUFS*PORTALS_BUF_SIZE + PORTALS_MAX_SMALL_BUFS*PORTALS_SMALL_BUF_SIZE This becomes a memory constraint at large core count. Rendez-vous message is one mechanism to get around requiring the DS to have buffer space for all messages. When rendez-vous (RZV) messaging is enabled, the messages what use the large buffers no longer send the entire buffer "eagerly". Instead, only the data request (request_header_t) gets sent to the data server. When the data server is ready to handle the request, it "pulls" the entire buffer over via a portals_get operation. One can immediately see that this can lead to a slow down in performance, since the data server is idle when it has to pull the data over. This is the price paid when you remove the bufferign for those messsages. Ideally, when the DS is pulling the message, it could be processing another request. This double buffering technique needs to be programmed in. Care must be taken to ensure proper ARMCI behavior. The next request handled can not be from the same PE, nor can it be a FENCE operation ... all other (?) requests/operations can be double buffered. \* --------------------------------------------------------------------------- */ # define PORTALS_USE_RENDEZ_VOUS /* --------------------------------------------------------------------------- *\ PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE ===================================== Another means to reduce the required buffer needed by the data server is to limit the number of cores that can talk to the data server at any given moment. When this options is turned on, only 1 request per node is allowed to be in the buffer of any given data server. On a 10 core node, the size of the buffer required by the data server is reduced by more than an order of magnitude. You get more than an order of magnitude, because you don't need to reserve space for any of the small buffers, since you can only have one small or one large from any given node in the ds buffer at any one time. Another major benefit is you can increase MAX_BUFS and MAX_SMALL_BUFS to increase concurrency without affecting the DS's buffer size. Can be used with PORTALS_USE_RENDEZ_VOUS. notes: every request needs to respond with an ack, even gets. acks actually send data when we limit remote request ... the ack response is needed to trigger that the outstanding request has been finished by the data server ... the ack zeros out the index in the active_requests_by_node array. \* --------------------------------------------------------------------------- */ # define PORTALS_LIMIT_REMOTE_REQUESTS_BY_NODE_TURNED_OFF /* --------------------------------------------------------------------------- *\ PORTALS_AFFINITY ================ When initializing compute processes and data servers, the affinity passed in by aprun/alps is ignored. Compute processes are bound strictly to a particular core. Cores are evenly divided between sockets keeping the last core (mask = 1 << (ncpus-1)) free for the data server. If the node is not fully subscribed, then the data server is bound to the last core on the node (mask = 1 << (ncpus-1)); otherwise, the data server is "free floating" (mask = (1 << ncpus)-1) on a fully subscribed node. \* --------------------------------------------------------------------------- */ # define PORTALS_AFFINITY # define PORTALS_AFFINITY_NSOCKETS 2 /* --------------------------------------------------------------------------- *\ CRAY_USE_MDMD_COPY ================== Used MDMD copy instead of PtlGetRegion for on-node "local" transfers \* --------------------------------------------------------------------------- */ # define CRAY_USE_MDMD_COPY /* --------------------------------------------------------------------------- *\ ORNL_USE_DS_FOR_REMOTE_GETS =========================== Vinod informed us of a modification that can be made to enable the use of the data server for remote gets. Without this option, direct gets are used. This can cause severe network congestion, because many armci_gets are not stride 1. The data server packs those gets into contiguous blocks and sends them back as a single put. However, the direct gets, require many small messages. Unfortunately, there is a small bug in the DS for remote gets. This bug may cause the program to abort or print out the following message: %d: server wrote data at unexpected offset %d This is a bug actively being worked on @ CRAY and ORNL. \* --------------------------------------------------------------------------- */ # define ORNL_USE_DS_FOR_REMOTE_GETS # define CRAY_USE_ARMCI_CLIENT_BUFFERS ga-5-4/armci/src-gemini/caccumulate.c0000644000175000017500000006037012662210416015620 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ /*********************************************************************** * accumulate operation for the following datatypes: * real, double precision, complex, double complex, integer * * WARNING: This file must be compiled WITH optimization under AIX. * IBM fortran compilers generate bad code with -g option. * * Two versions of each routine are provided: * original and unrolled loops. * ***********************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "acc.h" #if 0 subroutine d_accumulate_1d(alpha, A, B, rows) integer rows, r double precision A(*), B(*), alpha ccdir$ no_cache_alloc a,b do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_d_accumulate_1d_(const double* const restrict alpha, double* restrict A, const double* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine d_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha ccdir$ no_cache_alloc a,b do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_d_accumulate_2d_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_1d(alpha, A, B, rows) integer rows, r real A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine f_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_f_accumulate_2d_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_1d(alpha, A, B, rows) integer rows, r double complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine z_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_c_accumulate_2d_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_1d(alpha, A, B, rows) integer rows, r complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine c_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_z_accumulate_2d_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine i_accumulate_1d(alpha, A, B, rows) integer rows, r integer A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_i_accumulate_2d_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine d_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha integer r1 doubleprecision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_d_accumulate_2d_u_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha integer r1 real d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_f_accumulate_2d_u_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha integer r1 double complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_c_accumulate_2d_u_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha integer r1 complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_z_accumulate_2d_u_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha integer r1, j2, j3, j4, j5 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 j2 = a(r,c) + alpha*b(r,c) j3 = a(r+1,c) + alpha*b(r+1,c) j4 = a(r+2,c) + alpha*b(r+2,c) j5 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = j2 a(r+1,c) = j3 a(r+2,c) = j4 a(r+3,c) = j5 enddo enddo end #endif void c_i_accumulate_2d_u_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_u_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_u_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 c---------- operations used in armci gops -------------- c subroutine fort_dadd(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) + work(i) enddo end #endif void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] += work[i]; } return; } #if 0 subroutine fort_dadd2(n, x, work, work2) integer n,i double precision x(n), work(n), work2(n) do i= 1,n x(i) = work(i) + work2(i) enddo end #endif void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] + work2[i]; } return; } #if 0 subroutine fort_dmult(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) * work(i) enddo end #endif void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] *= work[i]; } return; } #if 0 subroutine fort_dmult2(n, x, work,work2) integer n,i double precision x(n), work(n) do i= 1,n x(i) = work(i)*work2(i) enddo end #endif void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] * work2[i]; } return; } // specific to src-portals && to src-gemini void RA_ACCUMULATE_2D_(long* alpha, int* rows, int* cols, long* a, int* lda, long* b, int* ldb) { int i,j; for(j=0;j< *cols; j++){ long *aa = a + j* *lda; long *bb = b + j* *ldb; for(i=0;i< *rows; i++) aa[i] ^= bb[i]; } } ga-5-4/armci/src-gemini/gpc.c0000644000175000017500000002610112662210416014075 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: gpc.c,v 1.7.4.4 2007-06-13 00:44:01 vinod Exp $ ***************************************************** Prototype of Global Procedure Calls. July/03 JN - shared memory version *************************************************************/ #include #include "armcip.h" #include "locks.h" #include "gpc.h" #define GPC_SLOTS 32 #define GPC_OFFSET -100 static void *_table[GPC_SLOTS]={ (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0}; #if (defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS)) && ARMCI_ENABLE_GPC_CALLS /*\ callback functions must be registered -- user gets int handle back \*/ int ARMCI_Gpc_register( int (*func) ()) { int handle =-1, candidate = 0; PARMCI_Barrier(); do{ if(!_table[candidate]){ handle = candidate; _table[candidate]=func; } candidate++; }while(candidate < GPC_SLOTS && handle == -1); return(GPC_OFFSET-handle); } /*\ release/deassociate handle with previously registered callback function \*/ void ARMCI_Gpc_release(int handle) { int h = -handle + GPC_OFFSET; PARMCI_Barrier(); if(h<0 || h >= GPC_SLOTS) armci_die("ARMCI_Gpc_release: bad handle",h); _table[h] = (void*)0; } /*\ Send Request to Execute callback function in a global address space * Arguments: * f - handle to the callback function * p - remote processor * hdr - header data - used to pack extra args for callback (local buffer) * hlen - size of header data < ARMCI_GPC_HLEN * data - bulk data passed to callback (local buffer) * dlen - length of bulk data * rhdr - ptr to reply header (return args from callback) * rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN * rdata - ptr to where reply data from callback should be stored (local buf) * rdlen - size of the buffer to store reply data * nbh - nonblocking handle * \*/ int ARMCI_Gpc_exec(int h, int p, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh) { int hnd = -h + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); } /* func - handle to the function executed at each process in the chain callba- handle to the callback to be executed when hdr - header data used to pack extra args for callback (local buffer) hlen - size of header data < ARMCI_GPC_HLEN data - bulk data passed to callback (local buffer) dlen - length of bulk data rhdr - ptr to reply header (return args from callback) rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN rdata - ptr to where reply data from callback should be stored (local buf) rdlen - size of the buffer to store reply data idlen - number of ID's idslst- list of id's in the chained GPC nbh - nonblocking handle which also acts as a context for each individual GPC Tree - the id of tree function used (default is 0=>binary, 1=>binomial, n=> user defined) */ int ARMCI_Gpc_chained_exec(int func, int callback, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int idlen, int *idlst, gpc_hdl_t* nbh, int TREE) { #if 0 int hnd = -func + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); tree_id = armci_msg_generate_tree(idlst,idlen,id_tree,TREE); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); #endif } int armci_gpc_local_exec(int h, int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int rtype) { int rhsize, rdsize; int (*func)(); int hnd = -h + GPC_OFFSET; if(hnd <0 || hnd>= GPC_SLOTS) armci_die2("armci_gpc_local_exec: bad callback handle",hnd,GPC_SLOTS); if(!_table[hnd]) armci_die("armci_gpc_local_exec: NULL function",hnd); func = _table[hnd]; if(!SAMECLUSNODE(to)) armci_die("armci_gpc_local_exec: GPC call to a different node received!", armci_me); /* func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, */ /* rdata, rdlen, &rdsize); */ /* return 0; */ return func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, rtype); } /*\ * This is a template for the callback function * The arguments are passed as specified in ARMCI_Gpc_exec * In addition, * rhsize specifies the actual size of reply header data returned * rdsize specifies the actual size of reply data returned \*/ int example_func(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); #ifdef LAPI void armci_gpc_set_serverpid(){ } #endif /*\ * Translate pointer to memory on processor "proc" * to be used in a callback function send by processor "from" \*/ void * ARMCI_Gpc_translate(void *ptr, int proc, int from) { return ptr; } /*\ acquire lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_lock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_LOCK(lock,proc); } /*\ try acquire lock in a callback function to be executed in context of * processor "proc" * return value: 1 - success * 0 - failure (already locked by another thread) \*/ int ARMCI_Gpc_trylock(int proc) { armci_die("ARMCI_Gpc_trylock: not yet implemented",0); return 0; } /*\ release lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_unlock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_UNLOCK(lock,proc); } void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh) { nbh->proc = armci_me; ARMCI_INIT_HANDLE(&nbh->ahdl); } void ARMCI_Gpc_wait(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Wait(&nbh->ahdl); } void ARMCI_Gpc_test(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Test(&nbh->ahdl); } #define ARMCI_GPC_HLEN 65536 #define ARMCI_GPC_DLEN 65536 int ARMCI_Gpc_get_hlen() { return ARMCI_GPC_HLEN; } int ARMCI_Gpc_get_dlen() { return ARMCI_GPC_DLEN; } #endif ga-5-4/armci/src-gemini/Makefile.inc0000644000175000017500000000456612662210416015403 0ustar mbambalibarmci_la_SOURCES += src-gemini/acc.h libarmci_la_SOURCES += src-gemini/aggregate.c libarmci_la_SOURCES += src-gemini/armci.c libarmci_la_SOURCES += src-gemini/armci-onesided.c libarmci_la_SOURCES += src-gemini/armci-onesided.h libarmci_la_SOURCES += src-gemini/armcip.h libarmci_la_SOURCES += src-gemini/atomics-i386.h libarmci_la_SOURCES += src-gemini/buffers.c libarmci_la_SOURCES += src-gemini/caccumulate.c libarmci_la_SOURCES += src-gemini/ccopy.c libarmci_la_SOURCES += src-gemini/clusterinfo.c libarmci_la_SOURCES += src-gemini/copy.h libarmci_la_SOURCES += src-gemini/ds-shared.c libarmci_la_SOURCES += src-gemini/fence.c libarmci_la_SOURCES += src-gemini/groups.c libarmci_la_SOURCES += src-gemini/kr_malloc.c libarmci_la_SOURCES += src-gemini/kr_malloc.h libarmci_la_SOURCES += src-gemini/locks.c libarmci_la_SOURCES += src-gemini/locks.h libarmci_la_SOURCES += src-gemini/memlock.c libarmci_la_SOURCES += src-gemini/memlock.h libarmci_la_SOURCES += src-gemini/memory.c libarmci_la_SOURCES += src-gemini/message.c libarmci_la_SOURCES += src-gemini/mutex.c libarmci_la_SOURCES += src-gemini/pack.c libarmci_la_SOURCES += src-gemini/pendbufs.h libarmci_la_SOURCES += src-gemini/request.c libarmci_la_SOURCES += src-gemini/request.h libarmci_la_SOURCES += src-gemini/rmw.c libarmci_la_SOURCES += src-gemini/rtinfo.c libarmci_la_SOURCES += src-gemini/semaphores.c libarmci_la_SOURCES += src-gemini/semaphores.h libarmci_la_SOURCES += src-gemini/shmalloc.h libarmci_la_SOURCES += src-gemini/shmem.c libarmci_la_SOURCES += src-gemini/armci_shmem.h libarmci_la_SOURCES += src-gemini/shmlimit.c libarmci_la_SOURCES += src-gemini/shmlimit.h libarmci_la_SOURCES += src-gemini/signaltrap.c libarmci_la_SOURCES += src-gemini/signaltrap.h libarmci_la_SOURCES += src-gemini/sockets.h libarmci_la_SOURCES += src-gemini/spawn.c libarmci_la_SOURCES += src-gemini/spinlock.h libarmci_la_SOURCES += src-gemini/strided.c libarmci_la_SOURCES += src-gemini/utils.h libarmci_la_SOURCES += src-gemini/vector.c if ARMCI_ENABLE_GPC_CALLS libarmci_la_SOURCES += src-gemini/gpc.c endif if THREAD_SAFE libarmci_la_SOURCES += src-gemini/threads.c libarmci_la_SOURCES += src-gemini/utils.c endif include_HEADERS += src-gemini/armci.h include_HEADERS += src-gemini/gpc.h include_HEADERS += src-gemini/message.h AM_CPPFLAGS += -I$(top_srcdir)/src-gemini AM_CPPFLAGS += -I$(top_srcdir)/src/include LDADD += -lnumatoolkit LDADD += -lonesided ga-5-4/armci/Makefile.in0000644000175000017500000104771112662210401013175 0ustar mbamba# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ############################################################################## # Makefile.am for ARMCI. # # Rationale: # This Makefile.am follows many of the suggestions outlined in the paper # "Recursive Make Considered Harmful". We do not use Automake's # 'include' feature (instead preferring a single, large Makefile.am). # # Additional targets: # Besides the traditional make targets supplied by Automake, we have added the # "examples" and "checkprogs" targets to build example programs and test # programs, respectively. # # Notes: # In general, each subdirectory has a corresponding section of this # Makefile.am with the notable exception being the many examples getting # rolled up into the examples section. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = $(am__EXEEXT_1) check_PROGRAMS = testing/msgcheck$(EXEEXT) testing/perf$(EXEEXT) \ testing/perf2$(EXEEXT) testing/perf_aggr$(EXEEXT) \ testing/perf_nb$(EXEEXT) testing/perf_strided$(EXEEXT) \ testing/shmclean$(EXEEXT) testing/shmtest$(EXEEXT) \ testing/simplelock$(EXEEXT) testing/test$(EXEEXT) \ testing/test2$(EXEEXT) $(am__EXEEXT_2) $(am__EXEEXT_3) \ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \ examples/benchmarks/cg/armci_sharedmemory/cg$(EXEEXT) \ examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT) \ examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT) \ examples/benchmarks/lu/armci_blocking/lu$(EXEEXT) \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT) \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT) \ examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT) \ examples/features/aggregation/simple/simple$(EXEEXT) \ examples/features/aggregation/sparse_matvecmul/sparse_matvecmul$(EXEEXT) \ examples/features/non-blocking/simple/simple$(EXEEXT) \ examples/features/symmetric_memory/simple/simple$(EXEEXT) \ examples/simpleApps/transp1D-c$(EXEEXT) $(am__EXEEXT_10) \ $(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13) \ $(am__EXEEXT_14) $(am__EXEEXT_15) $(am__EXEEXT_16) @ARMCI_NETWORK_EXTERNAL_FALSE@am__append_1 = libarmci.la @ARMCI_NETWORK_COMEX_TRUE@am__append_2 = -I$(abs_srcdir)/../comex/src-armci @ARMCI_NETWORK_COMEX_TRUE@am__append_3 = -L$(abs_builddir)/../comex @ARMCI_NETWORK_COMEX_TRUE@am__append_4 = $(abs_builddir)/../comex/libarmci.la @MSG_COMMS_MPI_FALSE@am__append_5 = -I$(top_srcdir)/tcgmsg @ARMCI_NETWORK_EXTERNAL_TRUE@am__append_6 = $(ARMCI_NETWORK_LIBS) \ @ARMCI_NETWORK_EXTERNAL_TRUE@ $(GA_MP_LIBS) @ARMCI_NETWORK_EXTERNAL_FALSE@am__append_7 = libarmci.la $(LTLIBOBJS) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(GA_MP_LIBS) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(ARMCI_NETWORK_LIBS) @ARMCI_NETWORK_EXTERNAL_FALSE@am__append_8 = $(GA_MP_LIBS) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(ARMCI_NETWORK_LIBS) DIST_COMMON = README $(am__configure_deps) $(am__include_HEADERS_DIST) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(top_srcdir)/configure \ $(top_srcdir)/src-gemini/Makefile.inc \ $(top_srcdir)/src-portals/Makefile.inc INSTALL NEWS \ build-aux/compile build-aux/config.guess build-aux/config.sub \ build-aux/depcomp build-aux/install-sh build-aux/ltmain.sh \ build-aux/missing @ARMCI_NETWORK_PORTALS_TRUE@am__append_9 = src-portals/acc.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/aggregate.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armcip.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci_portals.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci_portals.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/atomics-i386.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/buffers.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/caccumulate.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/ccopy.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/clusterinfo.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/copy.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/ds-shared.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/fence.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/kr_malloc.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/kr_malloc.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/locks.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/locks.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/memlock.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/memlock.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/memory.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/message.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/mutex.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/pack.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/pendbufs.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals_cp.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals_ds.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/request.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/request.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/rmw.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/rtinfo.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/semaphores.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/semaphores.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmalloc.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmem.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci_shmem.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmlimit.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmlimit.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/signaltrap.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/signaltrap.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/sockets.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/spawn.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/spinlock.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/strided.c \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/utils.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/vector.c @ARMCI_NETWORK_PORTALS_TRUE@@PORTALS_ENABLE_NEW_MALLOC_TRUE@am__append_10 = src-portals/new_memory.c @ARMCI_NETWORK_PORTALS_TRUE@@MSG_COMMS_MPI_TRUE@am__append_11 = src-portals/groups.c @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_PORTALS_TRUE@am__append_12 = src-portals/gpc.c @ARMCI_NETWORK_PORTALS_TRUE@@THREAD_SAFE_TRUE@am__append_13 = src-portals/threads.c \ @ARMCI_NETWORK_PORTALS_TRUE@@THREAD_SAFE_TRUE@ src-portals/utils.c @ARMCI_NETWORK_PORTALS_TRUE@am__append_14 = src-portals/armci.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/gpc.h \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/message.h @ARMCI_NETWORK_PORTALS_TRUE@am__append_15 = \ @ARMCI_NETWORK_PORTALS_TRUE@ -I$(top_srcdir)/src-portals \ @ARMCI_NETWORK_PORTALS_TRUE@ -I$(top_srcdir)/src/include @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_16 = src-gemini/acc.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/aggregate.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci-onesided.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci-onesided.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armcip.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/atomics-i386.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/buffers.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/caccumulate.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/ccopy.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/clusterinfo.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/copy.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/ds-shared.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/fence.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/groups.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/kr_malloc.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/kr_malloc.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/locks.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/locks.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/memlock.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/memlock.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/memory.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/message.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/mutex.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/pack.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/pendbufs.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/request.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/request.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/rmw.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/rtinfo.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/semaphores.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/semaphores.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmalloc.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmem.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci_shmem.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmlimit.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmlimit.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/signaltrap.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/signaltrap.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/sockets.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/spawn.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/spinlock.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/strided.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/utils.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/vector.c @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_17 = src-gemini/gpc.c @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@am__append_18 = src-gemini/threads.c \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@ src-gemini/utils.c @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_19 = src-gemini/armci.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/gpc.h \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/message.h @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_20 = -I$(top_srcdir)/src-gemini \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ -I$(top_srcdir)/src/include @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_21 = -lnumatoolkit \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ -lonesided ############################################################################## # src-portals # ############################################################################## # src-gemini # ############################################################################## # src # @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_22 = src/collectives/message.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/aggregate.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/armci.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/ccopy.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/clusterinfo.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/pack.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/iterator.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/iterator.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/ft/armci_chkpt.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/ft/armci_storage.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/acc.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/armcip.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/asm-ppc.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/atomic_ops_ia64.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/atomics-i386.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/copy.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/fujitsu-vpp.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/kr_malloc.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/locks.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/memlock.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/request.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/semaphores.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/shmalloc.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/armci_shmem.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/shmlimit.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/signaltrap.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/spinlock.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/utils.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/locks.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/memlock.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/mutex.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/semaphores.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/kr_malloc.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/memory.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/progress/fence.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/progress/wait.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/caccumulate.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/rmw.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/strided.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/vector.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MSG_COMMS_MPI_TRUE@am__append_23 = src/common/groups.c @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_24 = -I$(top_srcdir)/src/devices/bgml @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_25 = src/devices/bgml/bgmlacc.h \ @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/bgml/bgml.c \ @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/bgml/bgmldefs.h \ @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/bgml/bgml.h @ARMCI_NETWORK_CRAY_SHMEM_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_26 = -I$(top_srcdir)/src/devices/cray-shmem @ARMCI_NETWORK_CRAY_SHMEM_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_27 = src/memory/shmalloc.c @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_28 = -I$(top_srcdir)/src/devices/dcmf @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_29 = src/devices/dcmf/armcix.h @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@am__append_30 = src/devices/dcmf/dcmf2/armcix_acc.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_fence.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_get.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_impl.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_lock.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_put.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_rmw.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_wait.c @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@am__append_31 = src/devices/dcmf/dcmf-0.2.0/armcix_acc.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_fence.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_get.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_impl.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_lock.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_put.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_rmw.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_wait.c @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@am__append_32 = src/devices/dcmf/dcmf-0.3.0/armcix_acc.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_fence.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_get.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_impl.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_lock.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_put.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_rmw.c \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_wait.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_33 = -I$(top_srcdir)/src/devices/lapi @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_34 = src/common/async.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/lapi/lapi.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/lapi/lapidefs.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_35 = -I$(top_srcdir)/src/devices/mpi-mt @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_36 = src/common/ds-shared.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/spawn.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-mt/mpi2_client.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-mt/mpi2.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-mt/mpi2_server.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_37 = -I$(top_srcdir)/src/devices/mpi-spawn @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_38 = src/common/ds-shared.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-spawn/mpi2_client.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-spawn/mpi2.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-spawn/mpi2_server.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_39 = -I$(top_srcdir)/src/devices/openib @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_40 = src/common/async.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/ds-shared.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/regions.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/spawn.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/armci-vapi.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/cbuf.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/cbuf.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/openib.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/pendbufs.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/pendbufs.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/rtinfo.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@am__append_41 = -I$(top_srcdir)/src/devices/sockets @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@am__append_42 = src/common/async.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/ds-shared.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/request.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/spawn.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/devices/sockets/dataserv.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/devices/sockets/sockets.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/devices/sockets/sockets.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/memory/buffers.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ENABLE_CHECKPOINT_TRUE@am__append_43 = src/ft/armci_chkpt.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ENABLE_CHECKPOINT_TRUE@ src/ft/armci_storage.c @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_44 = src/common/gpc.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@am__append_45 = src/common/signaltrap.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@ src/memory/shmalloc.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@ src/memory/winshmem.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@am__append_46 = -DSHMEM -DMMAP @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@am__append_47 = src/common/signaltrap.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@ src/memory/shmalloc.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@ src/memory/winshmem.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@am__append_48 = -DSHMEM -DMMAP @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@am__append_49 = src/common/signaltrap.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@ src/memory/shmem.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@ src/memory/shmlimit.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NB_NONCONT_TRUE@am__append_50 = src/common/noncont.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@am__append_51 = src/common/utils.c \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@ src/util/threads.c @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@am__append_52 = src/locks/tas-sx.s @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_53 = src/include/armci.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/gpc.h \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/include/message.h @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_54 = -I$(top_srcdir)/src/include ############################################################################## # profiling # @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__append_55 = libarmci_prof.la @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__append_56 = src/common/capi.c @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__append_57 = tools/armci_prof.c @ENABLE_PROFILING_FALSE@am__append_58 = src/common/capi.c ############################################################################## # tcgmsg/ipcv4.0 # @MSG_COMMS_TCGMSG4_TRUE@am__append_59 = -I$(top_srcdir)/tcgmsg/ipcv4.0 @MSG_COMMS_TCGMSG4_TRUE@am__append_60 = tcgmsg/ipcv4.0/brdcst.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/checkbyte.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/cluster.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/cluster.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/defglobals.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/drand48.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/error.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/evlog.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/evlog.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/evon.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/globalop.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/llog.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mdtob.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mdtoi.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mitob.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mitod.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mtime.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/niceftn.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nnodes.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nodeid.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nxtval.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pbegin.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pbeginf.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pfilecopy.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sema.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sema.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/setdbg.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/shmem.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/signals.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/signals.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/snd.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sndrcv.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sndrcvP.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sockets.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/srftoc.h \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/srmover.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/stats.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/synch.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/usleep.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/waitall.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/waitcom.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/xdrstuff.c \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/xdrstuff.h @MSG_COMMS_TCGMSG4_TRUE@am__append_61 = parallel ############################################################################## # tcgmsg/ipcv5.0 # @MSG_COMMS_TCGMSG5_TRUE@am__append_62 = -I$(top_srcdir)/tcgmsg/ipcv5.0 @MSG_COMMS_TCGMSG5_TRUE@am__append_63 = tcgmsg/ipcv5.0/drand48.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/evlog.h \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/globalop.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/llog.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mdtob.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mdtoi.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/misc.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mitob.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mitod.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mtime.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/niceftn.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nnodes.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nodeid.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pbegin.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pfilecopy.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/queues.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/signals.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/sndrcv.h \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/snd_rcv_probe.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/srftoc.h \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/tcgmsgP.h \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/usleep.c \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/waitall.c @ARMCI_NETWORK_LAPI_TRUE@@MSG_COMMS_TCGMSG5_TRUE@am__append_64 = tcgmsg/ipcv5.0/async_send_lapi.c \ @ARMCI_NETWORK_LAPI_TRUE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/lapi_putget.c @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@am__append_65 = tcgmsg/ipcv5.0/async_send.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/busy.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/error.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nxtval.shm.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pbeginf.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/shmem.c \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/synch.c @HAVE_ARMCI_NOTIFY_TRUE@am__append_66 = testing/testnotify @ENABLE_CHECKPOINT_TRUE@am__append_67 = testing/fttest @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_68 = testing/gpctest @MSG_COMMS_MPI_TRUE@am__append_69 = testing/simple testing/test_groups @ARMCI_NETWORK_EXTERNAL_FALSE@@MSG_COMMS_MPI_TRUE@@SYSV_TRUE@am__append_70 = testing/ipctest @THREAD_SAFE_TRUE@am__append_71 = testing/test_mt @ARMCI_NETWORK_PORTALS_TRUE@am__append_72 = testing/clone testing/fork \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/origptl testing/ptltest \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/te @HAVE_ARMCI_STRIDE_INFO_INIT_TRUE@am__append_73 = testing/testitr @HAVE_ARMCI_MSG_INIT_FALSE@am__append_74 = testing/rpl_armci_msg_init.c @HAVE_ARMCI_MSG_FINALIZE_FALSE@am__append_75 = testing/rpl_armci_msg_finalize.c @HAVE_ARMCI_NOTIFY_TRUE@am__append_76 = testing/testnotify$(EXEEXT) @ENABLE_CHECKPOINT_TRUE@am__append_77 = testing/fttest$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_78 = testing/gpctest$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__append_79 = testing/simple$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ testing/test_groups$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/ipctest$(EXEEXT) # needs bug fixes @THREAD_SAFE_TRUE@am__append_80 = testing/test_mt$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/clone$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/fork$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/origptl$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/ptltest$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/te$(EXEEXT) @HAVE_ARMCI_STRIDE_INFO_INIT_TRUE@am__append_81 = testing/testitr$(EXEEXT) @HAVE_ARMCI_NOTIFY_TRUE@am__append_82 = examples/features/concurrency/simple/comdegree \ @HAVE_ARMCI_NOTIFY_TRUE@ examples/features/notification/simple/testnotify @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_83 = examples/features/gpc/hashtable/test_hashtable @ARMCI_ENABLE_GPC_CALLS_TRUE@@HAVE_BLAS_TRUE@@HAVE_LAPACK_TRUE@am__append_84 = examples/features/proc_affinity/computation_impact/computation_impact @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_85 = examples/features/proc_affinity/simple/simple @MSG_COMMS_MPI_TRUE@am__append_86 = examples/features/concurrency/multidma/multidma \ @MSG_COMMS_MPI_TRUE@ examples/features/non-blocking/overlap/overlap @RANDOM_ACCESS_TRUE@am__append_87 = examples/benchmarks/RandomAccess/simple/simple \ @RANDOM_ACCESS_TRUE@ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket @THREAD_SAFE_TRUE@am__append_88 = examples/benchmarks/lu/armci_multithreaded/lu-block-th @HAVE_ARMCI_NOTIFY_TRUE@am__append_89 = examples/features/concurrency/simple/comdegree$(EXEEXT) \ @HAVE_ARMCI_NOTIFY_TRUE@ examples/features/notification/simple/testnotify$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_90 = examples/features/gpc/hashtable/test_hashtable$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@@HAVE_BLAS_TRUE@@HAVE_LAPACK_TRUE@am__append_91 = examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__append_92 = examples/features/proc_affinity/simple/simple$(EXEEXT) #ARMCI_PARALLEL_TESTS += examples/features/concurrency/multidma/multidma$(EXEEXT) # needs bug fixes #ARMCI_PARALLEL_TESTS += examples/features/non-blocking/overlap/overlap$(EXEEXT) # needs bug fixes @RANDOM_ACCESS_TRUE@am__append_93 = examples/benchmarks/RandomAccess/simple/simple$(EXEEXT) \ @RANDOM_ACCESS_TRUE@ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT) @THREAD_SAFE_TRUE@am__append_94 = examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT) TESTS = $(am__EXEEXT_17) $(am__EXEEXT_18) XFAIL_TESTS = $(am__EXEEXT_20) $(am__EXEEXT_20) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../m4/armci_as_no_i386asm.m4 \ $(top_srcdir)/../m4/armci_c_opt.m4 \ $(top_srcdir)/../m4/armci_cxx_opt.m4 \ $(top_srcdir)/../m4/armci_enable_gpc.m4 \ $(top_srcdir)/../m4/armci_enable_profile.m4 \ $(top_srcdir)/../m4/armci_group.m4 \ $(top_srcdir)/../m4/armci_nb_noncont.m4 \ $(top_srcdir)/../m4/armci_setup.m4 \ $(top_srcdir)/../m4/armci_shmmax.m4 \ $(top_srcdir)/../m4/ax_sys_weak_alias.m4 \ $(top_srcdir)/../m4/ga_ar.m4 \ $(top_srcdir)/../m4/ga_arg_parse.m4 \ $(top_srcdir)/../m4/ga_armci_network.m4 \ $(top_srcdir)/../m4/ga_as.m4 \ $(top_srcdir)/../m4/ga_c_match_types.m4 \ $(top_srcdir)/../m4/ga_check_func.m4 \ $(top_srcdir)/../m4/ga_check_header.m4 \ $(top_srcdir)/../m4/ga_compiler_vendor.m4 \ $(top_srcdir)/../m4/ga_cross_compiling.m4 \ $(top_srcdir)/../m4/ga_enable_checkpoint.m4 \ $(top_srcdir)/../m4/ga_enable_opt.m4 \ $(top_srcdir)/../m4/ga_enable_trace.m4 \ $(top_srcdir)/../m4/ga_function.m4 \ $(top_srcdir)/../m4/ga_mpi_test_disable.m4 \ $(top_srcdir)/../m4/ga_mpi_unwrap.m4 \ $(top_srcdir)/../m4/ga_mpicc.m4 \ $(top_srcdir)/../m4/ga_mpicc_test.m4 \ $(top_srcdir)/../m4/ga_mpicxx.m4 \ $(top_srcdir)/../m4/ga_mpicxx_test.m4 \ $(top_srcdir)/../m4/ga_msg_comms.m4 \ $(top_srcdir)/../m4/ga_sys_weak_alias.m4 \ $(top_srcdir)/../m4/ga_target.m4 \ $(top_srcdir)/../m4/ga_thread_safe.m4 \ $(top_srcdir)/../m4/ga_union_semun.m4 \ $(top_srcdir)/../m4/ga_warn_flags.m4 \ $(top_srcdir)/../m4/ga_with_help.m4 \ $(top_srcdir)/../m4/tcgmsg_rsh.m4 \ $(top_srcdir)/../m4/tcgmsg_timings.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lt_obsolete.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(am__append_4) @ARMCI_NETWORK_EXTERNAL_FALSE@am__DEPENDENCIES_3 = \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(am__DEPENDENCIES_1) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(am__DEPENDENCIES_2) libarmci_la_DEPENDENCIES = $(am__DEPENDENCIES_3) am__libarmci_la_SOURCES_DIST = src-portals/acc.h \ src-portals/aggregate.c src-portals/armci.c \ src-portals/armcip.h src-portals/armci_portals.c \ src-portals/armci_portals.h src-portals/atomics-i386.h \ src-portals/buffers.c src-portals/caccumulate.c \ src-portals/ccopy.c src-portals/clusterinfo.c \ src-portals/copy.h src-portals/ds-shared.c src-portals/fence.c \ src-portals/kr_malloc.c src-portals/kr_malloc.h \ src-portals/locks.c src-portals/locks.h src-portals/memlock.c \ src-portals/memlock.h src-portals/memory.c \ src-portals/message.c src-portals/mutex.c src-portals/pack.c \ src-portals/pendbufs.h src-portals/portals_cp.c \ src-portals/portals_ds.c src-portals/portals.c \ src-portals/request.c src-portals/request.h src-portals/rmw.c \ src-portals/rtinfo.c src-portals/semaphores.c \ src-portals/semaphores.h src-portals/shmalloc.h \ src-portals/shmem.c src-portals/armci_shmem.h \ src-portals/shmlimit.c src-portals/shmlimit.h \ src-portals/signaltrap.c src-portals/signaltrap.h \ src-portals/sockets.h src-portals/spawn.c \ src-portals/spinlock.h src-portals/strided.c \ src-portals/utils.h src-portals/vector.c \ src-portals/new_memory.c src-portals/groups.c \ src-portals/gpc.c src-portals/threads.c src-portals/utils.c \ src-gemini/acc.h src-gemini/aggregate.c src-gemini/armci.c \ src-gemini/armci-onesided.c src-gemini/armci-onesided.h \ src-gemini/armcip.h src-gemini/atomics-i386.h \ src-gemini/buffers.c src-gemini/caccumulate.c \ src-gemini/ccopy.c src-gemini/clusterinfo.c src-gemini/copy.h \ src-gemini/ds-shared.c src-gemini/fence.c src-gemini/groups.c \ src-gemini/kr_malloc.c src-gemini/kr_malloc.h \ src-gemini/locks.c src-gemini/locks.h src-gemini/memlock.c \ src-gemini/memlock.h src-gemini/memory.c src-gemini/message.c \ src-gemini/mutex.c src-gemini/pack.c src-gemini/pendbufs.h \ src-gemini/request.c src-gemini/request.h src-gemini/rmw.c \ src-gemini/rtinfo.c src-gemini/semaphores.c \ src-gemini/semaphores.h src-gemini/shmalloc.h \ src-gemini/shmem.c src-gemini/armci_shmem.h \ src-gemini/shmlimit.c src-gemini/shmlimit.h \ src-gemini/signaltrap.c src-gemini/signaltrap.h \ src-gemini/sockets.h src-gemini/spawn.c src-gemini/spinlock.h \ src-gemini/strided.c src-gemini/utils.h src-gemini/vector.c \ src-gemini/gpc.c src-gemini/threads.c src-gemini/utils.c \ src/collectives/message.c src/common/aggregate.c \ src/common/armci.c src/common/ccopy.c src/common/clusterinfo.c \ src/common/pack.c src/common/iterator.c src/include/iterator.h \ src/ft/armci_chkpt.h src/ft/armci_storage.h src/include/acc.h \ src/include/armcip.h src/include/asm-ppc.h \ src/include/atomic_ops_ia64.h src/include/atomics-i386.h \ src/include/copy.h src/include/fujitsu-vpp.h \ src/include/kr_malloc.h src/include/locks.h \ src/include/memlock.h src/include/request.h \ src/include/semaphores.h src/include/shmalloc.h \ src/include/armci_shmem.h src/include/shmlimit.h \ src/include/signaltrap.h src/include/spinlock.h \ src/include/utils.h src/locks/locks.c src/locks/memlock.c \ src/locks/mutex.c src/locks/semaphores.c \ src/memory/kr_malloc.c src/memory/memory.c \ src/progress/fence.c src/progress/wait.c \ src/xfer/caccumulate.c src/xfer/rmw.c src/xfer/strided.c \ src/xfer/vector.c src/common/groups.c \ src/devices/bgml/bgmlacc.h src/devices/bgml/bgml.c \ src/devices/bgml/bgmldefs.h src/devices/bgml/bgml.h \ src/memory/shmalloc.c src/devices/dcmf/armcix.h \ src/devices/dcmf/dcmf2/armcix_acc.c \ src/devices/dcmf/dcmf2/armcix_fence.c \ src/devices/dcmf/dcmf2/armcix_get.c \ src/devices/dcmf/dcmf2/armcix_impl.c \ src/devices/dcmf/dcmf2/armcix_lock.c \ src/devices/dcmf/dcmf2/armcix_put.c \ src/devices/dcmf/dcmf2/armcix_rmw.c \ src/devices/dcmf/dcmf2/armcix_wait.c \ src/devices/dcmf/dcmf-0.2.0/armcix_acc.c \ src/devices/dcmf/dcmf-0.2.0/armcix_fence.c \ src/devices/dcmf/dcmf-0.2.0/armcix_get.c \ src/devices/dcmf/dcmf-0.2.0/armcix_impl.c \ src/devices/dcmf/dcmf-0.2.0/armcix_lock.c \ src/devices/dcmf/dcmf-0.2.0/armcix_put.c \ src/devices/dcmf/dcmf-0.2.0/armcix_rmw.c \ src/devices/dcmf/dcmf-0.2.0/armcix_wait.c \ src/devices/dcmf/dcmf-0.3.0/armcix_acc.c \ src/devices/dcmf/dcmf-0.3.0/armcix_fence.c \ src/devices/dcmf/dcmf-0.3.0/armcix_get.c \ src/devices/dcmf/dcmf-0.3.0/armcix_impl.c \ src/devices/dcmf/dcmf-0.3.0/armcix_lock.c \ src/devices/dcmf/dcmf-0.3.0/armcix_put.c \ src/devices/dcmf/dcmf-0.3.0/armcix_rmw.c \ src/devices/dcmf/dcmf-0.3.0/armcix_wait.c src/common/async.c \ src/common/request.c src/devices/lapi/lapi.c \ src/devices/lapi/lapidefs.h src/memory/buffers.c \ src/common/ds-shared.c src/common/spawn.c \ src/devices/mpi-mt/mpi2_client.c src/devices/mpi-mt/mpi2.h \ src/devices/mpi-mt/mpi2_server.c \ src/devices/mpi-spawn/mpi2_client.c \ src/devices/mpi-spawn/mpi2.h \ src/devices/mpi-spawn/mpi2_server.c src/common/regions.c \ src/devices/openib/armci-vapi.h src/devices/openib/cbuf.c \ src/devices/openib/cbuf.h src/devices/openib/openib.c \ src/devices/openib/pendbufs.c src/devices/openib/pendbufs.h \ src/devices/openib/rtinfo.c src/devices/sockets/dataserv.c \ src/devices/sockets/sockets.c src/devices/sockets/sockets.h \ src/ft/armci_chkpt.c src/ft/armci_storage.c src/common/gpc.c \ src/common/signaltrap.c src/memory/winshmem.c \ src/memory/shmem.c src/memory/shmlimit.c src/common/noncont.c \ src/common/utils.c src/util/threads.c src/locks/tas-sx.s \ src/common/capi.c tools/armci_prof.c tcgmsg/ipcv4.0/brdcst.c \ tcgmsg/ipcv4.0/checkbyte.c tcgmsg/ipcv4.0/cluster.c \ tcgmsg/ipcv4.0/cluster.h tcgmsg/ipcv4.0/defglobals.h \ tcgmsg/ipcv4.0/drand48.c tcgmsg/ipcv4.0/error.c \ tcgmsg/ipcv4.0/evlog.c tcgmsg/ipcv4.0/evlog.h \ tcgmsg/ipcv4.0/evon.c tcgmsg/ipcv4.0/globalop.c \ tcgmsg/ipcv4.0/llog.c tcgmsg/ipcv4.0/mdtob.c \ tcgmsg/ipcv4.0/mdtoi.c tcgmsg/ipcv4.0/mitob.c \ tcgmsg/ipcv4.0/mitod.c tcgmsg/ipcv4.0/mtime.c \ tcgmsg/ipcv4.0/niceftn.c tcgmsg/ipcv4.0/nnodes.c \ tcgmsg/ipcv4.0/nodeid.c tcgmsg/ipcv4.0/nxtval.c \ tcgmsg/ipcv4.0/pbegin.c tcgmsg/ipcv4.0/pbeginf.c \ tcgmsg/ipcv4.0/pfilecopy.c tcgmsg/ipcv4.0/sema.c \ tcgmsg/ipcv4.0/sema.h tcgmsg/ipcv4.0/setdbg.c \ tcgmsg/ipcv4.0/shmem.c tcgmsg/ipcv4.0/signals.c \ tcgmsg/ipcv4.0/signals.h tcgmsg/ipcv4.0/snd.c \ tcgmsg/ipcv4.0/sndrcv.h tcgmsg/ipcv4.0/sndrcvP.h \ tcgmsg/ipcv4.0/sockets.c tcgmsg/ipcv4.0/srftoc.h \ tcgmsg/ipcv4.0/srmover.c tcgmsg/ipcv4.0/stats.c \ tcgmsg/ipcv4.0/synch.c tcgmsg/ipcv4.0/usleep.c \ tcgmsg/ipcv4.0/waitall.c tcgmsg/ipcv4.0/waitcom.c \ tcgmsg/ipcv4.0/xdrstuff.c tcgmsg/ipcv4.0/xdrstuff.h \ tcgmsg/ipcv5.0/drand48.c tcgmsg/ipcv5.0/evlog.h \ tcgmsg/ipcv5.0/globalop.c tcgmsg/ipcv5.0/llog.c \ tcgmsg/ipcv5.0/mdtob.c tcgmsg/ipcv5.0/mdtoi.c \ tcgmsg/ipcv5.0/misc.c tcgmsg/ipcv5.0/mitob.c \ tcgmsg/ipcv5.0/mitod.c tcgmsg/ipcv5.0/mtime.c \ tcgmsg/ipcv5.0/niceftn.c tcgmsg/ipcv5.0/nnodes.c \ tcgmsg/ipcv5.0/nodeid.c tcgmsg/ipcv5.0/pbegin.c \ tcgmsg/ipcv5.0/pfilecopy.c tcgmsg/ipcv5.0/queues.c \ tcgmsg/ipcv5.0/signals.c tcgmsg/ipcv5.0/sndrcv.h \ tcgmsg/ipcv5.0/snd_rcv_probe.c tcgmsg/ipcv5.0/srftoc.h \ tcgmsg/ipcv5.0/tcgmsgP.h tcgmsg/ipcv5.0/usleep.c \ tcgmsg/ipcv5.0/waitall.c tcgmsg/ipcv5.0/async_send_lapi.c \ tcgmsg/ipcv5.0/lapi_putget.c tcgmsg/ipcv5.0/async_send.c \ tcgmsg/ipcv5.0/busy.c tcgmsg/ipcv5.0/error.c \ tcgmsg/ipcv5.0/nxtval.shm.c tcgmsg/ipcv5.0/pbeginf.c \ tcgmsg/ipcv5.0/shmem.c tcgmsg/ipcv5.0/synch.c am__dirstamp = $(am__leading_dot)dirstamp @ARMCI_NETWORK_PORTALS_TRUE@am__objects_1 = src-portals/aggregate.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/armci_portals.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/buffers.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/caccumulate.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/ccopy.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/clusterinfo.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/ds-shared.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/fence.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/kr_malloc.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/locks.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/memlock.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/memory.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/message.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/mutex.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/pack.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals_cp.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals_ds.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/portals.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/request.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/rmw.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/rtinfo.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/semaphores.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmem.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/shmlimit.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/signaltrap.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/spawn.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/strided.lo \ @ARMCI_NETWORK_PORTALS_TRUE@ src-portals/vector.lo @ARMCI_NETWORK_PORTALS_TRUE@@PORTALS_ENABLE_NEW_MALLOC_TRUE@am__objects_2 = src-portals/new_memory.lo @ARMCI_NETWORK_PORTALS_TRUE@@MSG_COMMS_MPI_TRUE@am__objects_3 = src-portals/groups.lo @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_PORTALS_TRUE@am__objects_4 = src-portals/gpc.lo @ARMCI_NETWORK_PORTALS_TRUE@@THREAD_SAFE_TRUE@am__objects_5 = src-portals/threads.lo \ @ARMCI_NETWORK_PORTALS_TRUE@@THREAD_SAFE_TRUE@ src-portals/utils.lo @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_6 = src-gemini/aggregate.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/armci-onesided.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/buffers.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/caccumulate.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/ccopy.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/clusterinfo.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/ds-shared.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/fence.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/groups.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/kr_malloc.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/locks.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/memlock.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/memory.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/message.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/mutex.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/pack.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/request.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/rmw.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/rtinfo.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/semaphores.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmem.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/shmlimit.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/signaltrap.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/spawn.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/strided.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src-gemini/vector.lo @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_7 = src-gemini/gpc.lo @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@am__objects_8 = src-gemini/threads.lo \ @ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@ src-gemini/utils.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_9 = src/collectives/message.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/aggregate.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/armci.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/ccopy.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/clusterinfo.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/pack.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/iterator.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/locks.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/memlock.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/mutex.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/locks/semaphores.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/kr_malloc.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/memory.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/progress/fence.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/progress/wait.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/caccumulate.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/rmw.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/strided.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ src/xfer/vector.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MSG_COMMS_MPI_TRUE@am__objects_10 = src/common/groups.lo @ARMCI_NETWORK_BGML_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_11 = src/devices/bgml/bgml.lo @ARMCI_NETWORK_CRAY_SHMEM_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_12 = src/memory/shmalloc.lo am__objects_13 = @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@am__objects_14 = src/devices/dcmf/dcmf2/armcix_acc.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_fence.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_get.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_impl.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_lock.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_put.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_rmw.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_2_TRUE@ src/devices/dcmf/dcmf2/armcix_wait.lo @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@am__objects_15 = src/devices/dcmf/dcmf-0.2.0/armcix_acc.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_fence.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_get.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_impl.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_lock.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_put.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_rmw.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_2_TRUE@ src/devices/dcmf/dcmf-0.2.0/armcix_wait.lo @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@am__objects_16 = src/devices/dcmf/dcmf-0.3.0/armcix_acc.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_fence.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_get.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_impl.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_lock.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_put.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_rmw.lo \ @ARMCI_NETWORK_DCMF_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@DCMF_VER_0_3_TRUE@ src/devices/dcmf/dcmf-0.3.0/armcix_wait.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_17 = src/common/async.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/lapi/lapi.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_LAPI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_18 = src/common/ds-shared.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/spawn.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-mt/mpi2_client.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-mt/mpi2_server.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_MT_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_19 = src/common/ds-shared.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-spawn/mpi2_client.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/mpi-spawn/mpi2_server.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_MPI_SPAWN_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_20 = src/common/async.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/ds-shared.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/regions.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/request.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/common/spawn.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/cbuf.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/openib.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/pendbufs.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/devices/openib/rtinfo.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_OPENIB_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ src/memory/buffers.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@am__objects_21 = src/common/async.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/ds-shared.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/request.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/common/spawn.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/devices/sockets/dataserv.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/devices/sockets/sockets.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ARMCI_NETWORK_SOCKETS_TRUE@ src/memory/buffers.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ENABLE_CHECKPOINT_TRUE@am__objects_22 = src/ft/armci_chkpt.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@ENABLE_CHECKPOINT_TRUE@ src/ft/armci_storage.lo @ARMCI_ENABLE_GPC_CALLS_TRUE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__objects_23 = src/common/gpc.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@am__objects_24 = src/common/signaltrap.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@ src/memory/shmalloc.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@MACX_TRUE@ src/memory/winshmem.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@am__objects_25 = src/common/signaltrap.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@ src/memory/shmalloc.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_TRUE@@MACX_FALSE@ src/memory/winshmem.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@am__objects_26 = src/common/signaltrap.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@ src/memory/shmem.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@CYGWIN_FALSE@@MACX_FALSE@@SYSV_TRUE@ src/memory/shmlimit.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NB_NONCONT_TRUE@am__objects_27 = src/common/noncont.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@am__objects_28 = src/common/utils.lo \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@THREAD_SAFE_TRUE@ src/util/threads.lo @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@am__objects_29 = src/locks/tas-sx.lo @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__objects_30 = src/common/capi.lo @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__objects_31 = tools/armci_prof.lo @ENABLE_PROFILING_FALSE@am__objects_32 = src/common/capi.lo @MSG_COMMS_TCGMSG4_TRUE@am__objects_33 = tcgmsg/ipcv4.0/brdcst.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/checkbyte.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/cluster.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/drand48.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/error.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/evlog.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/evon.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/globalop.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/llog.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mdtob.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mdtoi.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mitob.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mitod.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/mtime.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/niceftn.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nnodes.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nodeid.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/nxtval.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pbegin.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pbeginf.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/pfilecopy.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sema.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/setdbg.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/shmem.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/signals.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/snd.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/sockets.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/srmover.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/stats.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/synch.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/usleep.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/waitall.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/waitcom.lo \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/xdrstuff.lo @MSG_COMMS_TCGMSG5_TRUE@am__objects_34 = tcgmsg/ipcv5.0/drand48.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/globalop.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/llog.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mdtob.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mdtoi.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/misc.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mitob.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mitod.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/mtime.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/niceftn.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nnodes.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nodeid.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pbegin.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pfilecopy.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/queues.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/signals.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/snd_rcv_probe.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/usleep.lo \ @MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/waitall.lo @ARMCI_NETWORK_LAPI_TRUE@@MSG_COMMS_TCGMSG5_TRUE@am__objects_35 = tcgmsg/ipcv5.0/async_send_lapi.lo \ @ARMCI_NETWORK_LAPI_TRUE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/lapi_putget.lo @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@am__objects_36 = tcgmsg/ipcv5.0/async_send.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/busy.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/error.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/nxtval.shm.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/pbeginf.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/shmem.lo \ @ARMCI_NETWORK_LAPI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@ tcgmsg/ipcv5.0/synch.lo am_libarmci_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ $(am__objects_9) $(am__objects_10) $(am__objects_11) \ $(am__objects_12) $(am__objects_13) $(am__objects_14) \ $(am__objects_15) $(am__objects_16) $(am__objects_17) \ $(am__objects_18) $(am__objects_19) $(am__objects_20) \ $(am__objects_21) $(am__objects_22) $(am__objects_23) \ $(am__objects_24) $(am__objects_25) $(am__objects_26) \ $(am__objects_27) $(am__objects_28) $(am__objects_29) \ $(am__objects_30) $(am__objects_31) $(am__objects_32) \ $(am__objects_33) $(am__objects_34) $(am__objects_35) \ $(am__objects_36) nodist_libarmci_la_OBJECTS = libarmci_la_OBJECTS = $(am_libarmci_la_OBJECTS) \ $(nodist_libarmci_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent @ARMCI_NETWORK_EXTERNAL_FALSE@am_libarmci_la_rpath = -rpath $(libdir) libarmci_prof_la_LIBADD = am__libarmci_prof_la_SOURCES_DIST = tools/armci_prof.c @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am_libarmci_prof_la_OBJECTS = tools/armci_prof.lo libarmci_prof_la_OBJECTS = $(am_libarmci_prof_la_OBJECTS) @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am_libarmci_prof_la_rpath = -rpath \ @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@ $(libdir) @MSG_COMMS_TCGMSG4_TRUE@am__EXEEXT_1 = parallel$(EXEEXT) @HAVE_ARMCI_NOTIFY_TRUE@am__EXEEXT_2 = testing/testnotify$(EXEEXT) @ENABLE_CHECKPOINT_TRUE@am__EXEEXT_3 = testing/fttest$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__EXEEXT_4 = testing/gpctest$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__EXEEXT_5 = testing/simple$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ testing/test_groups$(EXEEXT) @ARMCI_NETWORK_EXTERNAL_FALSE@@MSG_COMMS_MPI_TRUE@@SYSV_TRUE@am__EXEEXT_6 = testing/ipctest$(EXEEXT) @THREAD_SAFE_TRUE@am__EXEEXT_7 = testing/test_mt$(EXEEXT) @ARMCI_NETWORK_PORTALS_TRUE@am__EXEEXT_8 = testing/clone$(EXEEXT) \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/fork$(EXEEXT) \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/origptl$(EXEEXT) \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/ptltest$(EXEEXT) \ @ARMCI_NETWORK_PORTALS_TRUE@ testing/te$(EXEEXT) @HAVE_ARMCI_STRIDE_INFO_INIT_TRUE@am__EXEEXT_9 = \ @HAVE_ARMCI_STRIDE_INFO_INIT_TRUE@ testing/testitr$(EXEEXT) @HAVE_ARMCI_NOTIFY_TRUE@am__EXEEXT_10 = examples/features/concurrency/simple/comdegree$(EXEEXT) \ @HAVE_ARMCI_NOTIFY_TRUE@ examples/features/notification/simple/testnotify$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__EXEEXT_11 = examples/features/gpc/hashtable/test_hashtable$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@@HAVE_BLAS_TRUE@@HAVE_LAPACK_TRUE@am__EXEEXT_12 = examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT) @ARMCI_ENABLE_GPC_CALLS_TRUE@am__EXEEXT_13 = examples/features/proc_affinity/simple/simple$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__EXEEXT_14 = examples/features/concurrency/multidma/multidma$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ examples/features/non-blocking/overlap/overlap$(EXEEXT) @RANDOM_ACCESS_TRUE@am__EXEEXT_15 = examples/benchmarks/RandomAccess/simple/simple$(EXEEXT) \ @RANDOM_ACCESS_TRUE@ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT) @THREAD_SAFE_TRUE@am__EXEEXT_16 = examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) LIBOBJDIR = compat/ am__examples_benchmarks_RandomAccess_simple_simple_SOURCES_DIST = \ examples/benchmarks/RandomAccess/simple/simple.c \ examples/benchmarks/RandomAccess/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c @HAVE_ARMCI_MSG_INIT_FALSE@am__objects_37 = testing/rpl_armci_msg_init.$(OBJEXT) @HAVE_ARMCI_MSG_FINALIZE_FALSE@am__objects_38 = testing/rpl_armci_msg_finalize.$(OBJEXT) am__objects_39 = $(am__objects_37) $(am__objects_38) am_examples_benchmarks_RandomAccess_simple_simple_OBJECTS = \ examples/benchmarks/RandomAccess/simple/simple.$(OBJEXT) \ examples/benchmarks/RandomAccess/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_RandomAccess_simple_simple_OBJECTS = \ $(am_examples_benchmarks_RandomAccess_simple_simple_OBJECTS) examples_benchmarks_RandomAccess_simple_simple_LDADD = $(LDADD) @ARMCI_NETWORK_EXTERNAL_TRUE@am__DEPENDENCIES_4 = \ @ARMCI_NETWORK_EXTERNAL_TRUE@ $(am__DEPENDENCIES_2) \ @ARMCI_NETWORK_EXTERNAL_TRUE@ $(am__DEPENDENCIES_1) @ARMCI_NETWORK_EXTERNAL_FALSE@am__DEPENDENCIES_5 = libarmci.la \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(LTLIBOBJS) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(am__DEPENDENCIES_1) \ @ARMCI_NETWORK_EXTERNAL_FALSE@ $(am__DEPENDENCIES_2) examples_benchmarks_RandomAccess_simple_simple_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_SOURCES_DIST = \ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.c \ examples/benchmarks/RandomAccess/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_OBJECTS = examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.$(OBJEXT) \ examples/benchmarks/RandomAccess/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_OBJECTS = $(am_examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_OBJECTS) examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_LDADD = \ $(LDADD) examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_cg_armci_sharedmemory_cg_SOURCES_DIST = \ examples/benchmarks/cg/armci_sharedmemory/cg.c \ examples/benchmarks/cg/armci_sharedmemory/compute.c \ examples/benchmarks/cg/armci_sharedmemory/read_input.c \ examples/benchmarks/cg/armci_sharedmemory/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_cg_armci_sharedmemory_cg_OBJECTS = \ examples/benchmarks/cg/armci_sharedmemory/cg.$(OBJEXT) \ examples/benchmarks/cg/armci_sharedmemory/compute.$(OBJEXT) \ examples/benchmarks/cg/armci_sharedmemory/read_input.$(OBJEXT) \ examples/benchmarks/cg/armci_sharedmemory/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_cg_armci_sharedmemory_cg_OBJECTS = \ $(am_examples_benchmarks_cg_armci_sharedmemory_cg_OBJECTS) examples_benchmarks_cg_armci_sharedmemory_cg_LDADD = $(LDADD) examples_benchmarks_cg_armci_sharedmemory_cg_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_blocking_lu_SOURCES_DIST = \ examples/benchmarks/lu/armci_blocking/lu.c \ examples/benchmarks/lu/armci_blocking/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_blocking_lu_OBJECTS = \ examples/benchmarks/lu/armci_blocking/lu.$(OBJEXT) \ examples/benchmarks/lu/armci_blocking/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_blocking_lu_OBJECTS = \ $(am_examples_benchmarks_lu_armci_blocking_lu_OBJECTS) examples_benchmarks_lu_armci_blocking_lu_LDADD = $(LDADD) examples_benchmarks_lu_armci_blocking_lu_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_blocking_lu_b_bc_SOURCES_DIST = \ examples/benchmarks/lu/armci_blocking/lu-b-bc.c \ examples/benchmarks/lu/armci_blocking/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_blocking_lu_b_bc_OBJECTS = \ examples/benchmarks/lu/armci_blocking/lu-b-bc.$(OBJEXT) \ examples/benchmarks/lu/armci_blocking/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_blocking_lu_b_bc_OBJECTS = \ $(am_examples_benchmarks_lu_armci_blocking_lu_b_bc_OBJECTS) examples_benchmarks_lu_armci_blocking_lu_b_bc_LDADD = $(LDADD) examples_benchmarks_lu_armci_blocking_lu_b_bc_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_blocking_lu_block_SOURCES_DIST = \ examples/benchmarks/lu/armci_blocking/lu-block.c \ examples/benchmarks/lu/armci_blocking/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_blocking_lu_block_OBJECTS = \ examples/benchmarks/lu/armci_blocking/lu-block.$(OBJEXT) \ examples/benchmarks/lu/armci_blocking/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_blocking_lu_block_OBJECTS = \ $(am_examples_benchmarks_lu_armci_blocking_lu_block_OBJECTS) examples_benchmarks_lu_armci_blocking_lu_block_LDADD = $(LDADD) examples_benchmarks_lu_armci_blocking_lu_block_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_multithreaded_lu_block_th_SOURCES_DIST = \ examples/benchmarks/lu/armci_multithreaded/lu-block-th.c \ examples/benchmarks/lu/armci_multithreaded/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_multithreaded_lu_block_th_OBJECTS = examples/benchmarks/lu/armci_multithreaded/lu-block-th.$(OBJEXT) \ examples/benchmarks/lu/armci_multithreaded/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_multithreaded_lu_block_th_OBJECTS = $(am_examples_benchmarks_lu_armci_multithreaded_lu_block_th_OBJECTS) examples_benchmarks_lu_armci_multithreaded_lu_block_th_LDADD = \ $(LDADD) examples_benchmarks_lu_armci_multithreaded_lu_block_th_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_nonblocking_lu_nb_get_SOURCES_DIST = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get.c \ examples/benchmarks/lu/armci_nonblocking/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_nonblocking_lu_nb_get_OBJECTS = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get.$(OBJEXT) \ examples/benchmarks/lu/armci_nonblocking/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_nonblocking_lu_nb_get_OBJECTS = $(am_examples_benchmarks_lu_armci_nonblocking_lu_nb_get_OBJECTS) examples_benchmarks_lu_armci_nonblocking_lu_nb_get_LDADD = $(LDADD) examples_benchmarks_lu_armci_nonblocking_lu_nb_get_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_armci_nonblocking_lu_nb_put_SOURCES_DIST = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put.c \ examples/benchmarks/lu/armci_nonblocking/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_armci_nonblocking_lu_nb_put_OBJECTS = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put.$(OBJEXT) \ examples/benchmarks/lu/armci_nonblocking/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_armci_nonblocking_lu_nb_put_OBJECTS = $(am_examples_benchmarks_lu_armci_nonblocking_lu_nb_put_OBJECTS) examples_benchmarks_lu_armci_nonblocking_lu_nb_put_LDADD = $(LDADD) examples_benchmarks_lu_armci_nonblocking_lu_nb_put_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_benchmarks_lu_pthreads_lu_thread_SOURCES_DIST = \ examples/benchmarks/lu/pthreads/barrier.c \ examples/benchmarks/lu/pthreads/barrier.h \ examples/benchmarks/lu/pthreads/errors.h \ examples/benchmarks/lu/pthreads/lu-thread.c \ examples/benchmarks/lu/pthreads/timing.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_benchmarks_lu_pthreads_lu_thread_OBJECTS = \ examples/benchmarks/lu/pthreads/barrier.$(OBJEXT) \ examples/benchmarks/lu/pthreads/lu-thread.$(OBJEXT) \ examples/benchmarks/lu/pthreads/timing.$(OBJEXT) \ $(am__objects_39) examples_benchmarks_lu_pthreads_lu_thread_OBJECTS = \ $(am_examples_benchmarks_lu_pthreads_lu_thread_OBJECTS) examples_benchmarks_lu_pthreads_lu_thread_DEPENDENCIES = am__examples_features_aggregation_simple_simple_SOURCES_DIST = \ examples/features/aggregation/simple/simple.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_aggregation_simple_simple_OBJECTS = \ examples/features/aggregation/simple/simple.$(OBJEXT) \ $(am__objects_39) examples_features_aggregation_simple_simple_OBJECTS = \ $(am_examples_features_aggregation_simple_simple_OBJECTS) examples_features_aggregation_simple_simple_LDADD = $(LDADD) examples_features_aggregation_simple_simple_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_SOURCES_DIST = examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_OBJECTS = examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.$(OBJEXT) \ $(am__objects_39) examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_OBJECTS = $(am_examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_OBJECTS) examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_LDADD = \ $(LDADD) examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_concurrency_multidma_multidma_SOURCES_DIST = \ examples/features/concurrency/multidma/multidma.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_concurrency_multidma_multidma_OBJECTS = \ examples/features/concurrency/multidma/multidma.$(OBJEXT) \ $(am__objects_39) examples_features_concurrency_multidma_multidma_OBJECTS = \ $(am_examples_features_concurrency_multidma_multidma_OBJECTS) examples_features_concurrency_multidma_multidma_LDADD = $(LDADD) examples_features_concurrency_multidma_multidma_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_concurrency_simple_comdegree_SOURCES_DIST = \ examples/features/concurrency/simple/comdegree.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_concurrency_simple_comdegree_OBJECTS = \ examples/features/concurrency/simple/comdegree.$(OBJEXT) \ $(am__objects_39) examples_features_concurrency_simple_comdegree_OBJECTS = \ $(am_examples_features_concurrency_simple_comdegree_OBJECTS) examples_features_concurrency_simple_comdegree_LDADD = $(LDADD) examples_features_concurrency_simple_comdegree_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_gpc_hashtable_test_hashtable_SOURCES_DIST = \ examples/features/gpc/hashtable/DistHashmap.cc \ examples/features/gpc/hashtable/DistHashmap.h \ examples/features/gpc/hashtable/GPCHashmap.cc \ examples/features/gpc/hashtable/GPCHashmap.h \ examples/features/gpc/hashtable/GPCHashmapHandler.cc \ examples/features/gpc/hashtable/Hash_common.h \ examples/features/gpc/hashtable/HashFunctions.cc \ examples/features/gpc/hashtable/hash_map.h \ examples/features/gpc/hashtable/HashUtil.cc \ examples/features/gpc/hashtable/test_hashtable.cc \ examples/features/gpc/hashtable/Util.h \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_gpc_hashtable_test_hashtable_OBJECTS = \ examples/features/gpc/hashtable/DistHashmap.$(OBJEXT) \ examples/features/gpc/hashtable/GPCHashmap.$(OBJEXT) \ examples/features/gpc/hashtable/GPCHashmapHandler.$(OBJEXT) \ examples/features/gpc/hashtable/HashFunctions.$(OBJEXT) \ examples/features/gpc/hashtable/HashUtil.$(OBJEXT) \ examples/features/gpc/hashtable/test_hashtable.$(OBJEXT) \ $(am__objects_39) examples_features_gpc_hashtable_test_hashtable_OBJECTS = \ $(am_examples_features_gpc_hashtable_test_hashtable_OBJECTS) am__DEPENDENCIES_6 = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) examples_features_gpc_hashtable_test_hashtable_DEPENDENCIES = \ $(am__DEPENDENCIES_6) examples_features_gpc_hashtable_test_hashtable_LINK = $(LIBTOOL) \ $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ $(examples_features_gpc_hashtable_test_hashtable_LDFLAGS) \ $(LDFLAGS) -o $@ am__examples_features_non_blocking_overlap_overlap_SOURCES_DIST = \ examples/features/non-blocking/overlap/overlap.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_non_blocking_overlap_overlap_OBJECTS = \ examples/features/non-blocking/overlap/overlap.$(OBJEXT) \ $(am__objects_39) examples_features_non_blocking_overlap_overlap_OBJECTS = \ $(am_examples_features_non_blocking_overlap_overlap_OBJECTS) examples_features_non_blocking_overlap_overlap_LDADD = $(LDADD) examples_features_non_blocking_overlap_overlap_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_non_blocking_simple_simple_SOURCES_DIST = \ examples/features/non-blocking/simple/simple.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_non_blocking_simple_simple_OBJECTS = \ examples/features/non-blocking/simple/simple.$(OBJEXT) \ $(am__objects_39) examples_features_non_blocking_simple_simple_OBJECTS = \ $(am_examples_features_non_blocking_simple_simple_OBJECTS) examples_features_non_blocking_simple_simple_LDADD = $(LDADD) examples_features_non_blocking_simple_simple_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_notification_simple_testnotify_SOURCES_DIST = \ examples/features/notification/simple/testnotify.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_notification_simple_testnotify_OBJECTS = \ examples/features/notification/simple/testnotify.$(OBJEXT) \ $(am__objects_39) examples_features_notification_simple_testnotify_OBJECTS = $(am_examples_features_notification_simple_testnotify_OBJECTS) examples_features_notification_simple_testnotify_LDADD = $(LDADD) examples_features_notification_simple_testnotify_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_proc_affinity_computation_impact_computation_impact_SOURCES_DIST = examples/features/proc_affinity/computation_impact/computation_impact.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_proc_affinity_computation_impact_computation_impact_OBJECTS = examples/features/proc_affinity/computation_impact/computation_impact.$(OBJEXT) \ $(am__objects_39) examples_features_proc_affinity_computation_impact_computation_impact_OBJECTS = $(am_examples_features_proc_affinity_computation_impact_computation_impact_OBJECTS) examples_features_proc_affinity_computation_impact_computation_impact_DEPENDENCIES = \ $(am__DEPENDENCIES_6) examples_features_proc_affinity_computation_impact_computation_impact_LINK = \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(examples_features_proc_affinity_computation_impact_computation_impact_LDFLAGS) \ $(LDFLAGS) -o $@ am__examples_features_proc_affinity_simple_simple_SOURCES_DIST = \ examples/features/proc_affinity/simple/simple.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_proc_affinity_simple_simple_OBJECTS = \ examples/features/proc_affinity/simple/simple.$(OBJEXT) \ $(am__objects_39) examples_features_proc_affinity_simple_simple_OBJECTS = \ $(am_examples_features_proc_affinity_simple_simple_OBJECTS) examples_features_proc_affinity_simple_simple_LDADD = $(LDADD) examples_features_proc_affinity_simple_simple_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_features_symmetric_memory_simple_simple_SOURCES_DIST = \ examples/features/symmetric_memory/simple/simple.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_examples_features_symmetric_memory_simple_simple_OBJECTS = \ examples/features/symmetric_memory/simple/simple.$(OBJEXT) \ $(am__objects_39) examples_features_symmetric_memory_simple_simple_OBJECTS = $(am_examples_features_symmetric_memory_simple_simple_OBJECTS) examples_features_symmetric_memory_simple_simple_LDADD = $(LDADD) examples_features_symmetric_memory_simple_simple_DEPENDENCIES = \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__examples_simpleApps_transp1D_c_SOURCES_DIST = \ examples/simpleApps/transp1D-c.c testing/rpl_armci_msg_init.c \ testing/rpl_armci_msg_finalize.c am_examples_simpleApps_transp1D_c_OBJECTS = \ examples/simpleApps/transp1D-c.$(OBJEXT) $(am__objects_39) examples_simpleApps_transp1D_c_OBJECTS = \ $(am_examples_simpleApps_transp1D_c_OBJECTS) examples_simpleApps_transp1D_c_LDADD = $(LDADD) examples_simpleApps_transp1D_c_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__parallel_SOURCES_DIST = tcgmsg/ipcv4.0/parallel.c @MSG_COMMS_TCGMSG4_TRUE@am_parallel_OBJECTS = \ @MSG_COMMS_TCGMSG4_TRUE@ tcgmsg/ipcv4.0/parallel.$(OBJEXT) parallel_OBJECTS = $(am_parallel_OBJECTS) parallel_LDADD = $(LDADD) parallel_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__testing_clone_SOURCES_DIST = testing/clone.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_clone_OBJECTS = testing/clone.$(OBJEXT) $(am__objects_39) testing_clone_OBJECTS = $(am_testing_clone_OBJECTS) testing_clone_LDADD = $(LDADD) testing_clone_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_fork_SOURCES_DIST = testing/fork.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_fork_OBJECTS = testing/fork.$(OBJEXT) $(am__objects_39) testing_fork_OBJECTS = $(am_testing_fork_OBJECTS) testing_fork_LDADD = $(LDADD) testing_fork_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_fttest_SOURCES_DIST = testing/fttest.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_fttest_OBJECTS = testing/fttest.$(OBJEXT) $(am__objects_39) testing_fttest_OBJECTS = $(am_testing_fttest_OBJECTS) testing_fttest_LDADD = $(LDADD) testing_fttest_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_gpctest_SOURCES_DIST = testing/gpctest.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_gpctest_OBJECTS = testing/gpctest.$(OBJEXT) \ $(am__objects_39) testing_gpctest_OBJECTS = $(am_testing_gpctest_OBJECTS) testing_gpctest_LDADD = $(LDADD) testing_gpctest_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_ipctest_SOURCES_DIST = testing/ipctest.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_ipctest_OBJECTS = testing/ipctest.$(OBJEXT) \ $(am__objects_39) testing_ipctest_OBJECTS = $(am_testing_ipctest_OBJECTS) testing_ipctest_LDADD = $(LDADD) testing_ipctest_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_msgcheck_SOURCES_DIST = testing/msgcheck.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_msgcheck_OBJECTS = testing/msgcheck.$(OBJEXT) \ $(am__objects_39) testing_msgcheck_OBJECTS = $(am_testing_msgcheck_OBJECTS) testing_msgcheck_LDADD = $(LDADD) testing_msgcheck_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_origptl_SOURCES_DIST = testing/origptl.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_origptl_OBJECTS = testing/origptl.$(OBJEXT) \ $(am__objects_39) testing_origptl_OBJECTS = $(am_testing_origptl_OBJECTS) testing_origptl_LDADD = $(LDADD) testing_origptl_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_perf_SOURCES_DIST = testing/perf.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_perf_OBJECTS = testing/perf.$(OBJEXT) $(am__objects_39) testing_perf_OBJECTS = $(am_testing_perf_OBJECTS) testing_perf_LDADD = $(LDADD) testing_perf_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_perf2_SOURCES_DIST = testing/perf2.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_perf2_OBJECTS = testing/perf2.$(OBJEXT) $(am__objects_39) testing_perf2_OBJECTS = $(am_testing_perf2_OBJECTS) testing_perf2_LDADD = $(LDADD) testing_perf2_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_perf_aggr_SOURCES_DIST = testing/perf_aggr.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_perf_aggr_OBJECTS = testing/perf_aggr.$(OBJEXT) \ $(am__objects_39) testing_perf_aggr_OBJECTS = $(am_testing_perf_aggr_OBJECTS) testing_perf_aggr_LDADD = $(LDADD) testing_perf_aggr_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_perf_nb_SOURCES_DIST = testing/perf_nb.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_perf_nb_OBJECTS = testing/perf_nb.$(OBJEXT) \ $(am__objects_39) testing_perf_nb_OBJECTS = $(am_testing_perf_nb_OBJECTS) testing_perf_nb_LDADD = $(LDADD) testing_perf_nb_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_perf_strided_SOURCES_DIST = testing/perf_strided.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_perf_strided_OBJECTS = testing/perf_strided.$(OBJEXT) \ $(am__objects_39) testing_perf_strided_OBJECTS = $(am_testing_perf_strided_OBJECTS) testing_perf_strided_LDADD = $(LDADD) testing_perf_strided_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_ptltest_SOURCES_DIST = testing/ptltest.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_ptltest_OBJECTS = testing/ptltest.$(OBJEXT) \ $(am__objects_39) testing_ptltest_OBJECTS = $(am_testing_ptltest_OBJECTS) testing_ptltest_LDADD = $(LDADD) testing_ptltest_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_shmclean_SOURCES_DIST = testing/shmclean.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_shmclean_OBJECTS = testing/shmclean.$(OBJEXT) \ $(am__objects_39) testing_shmclean_OBJECTS = $(am_testing_shmclean_OBJECTS) testing_shmclean_LDADD = $(LDADD) testing_shmclean_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_shmtest_SOURCES_DIST = testing/shmtest.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_shmtest_OBJECTS = testing/shmtest.$(OBJEXT) \ $(am__objects_39) testing_shmtest_OBJECTS = $(am_testing_shmtest_OBJECTS) testing_shmtest_LDADD = $(LDADD) testing_shmtest_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_simple_SOURCES_DIST = testing/simple.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_simple_OBJECTS = testing/simple.$(OBJEXT) $(am__objects_39) testing_simple_OBJECTS = $(am_testing_simple_OBJECTS) testing_simple_LDADD = $(LDADD) testing_simple_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_simplelock_SOURCES_DIST = testing/simplelock.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_simplelock_OBJECTS = testing/simplelock.$(OBJEXT) \ $(am__objects_39) testing_simplelock_OBJECTS = $(am_testing_simplelock_OBJECTS) testing_simplelock_LDADD = $(LDADD) testing_simplelock_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_te_SOURCES_DIST = testing/te.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_te_OBJECTS = testing/te.$(OBJEXT) $(am__objects_39) testing_te_OBJECTS = $(am_testing_te_OBJECTS) testing_te_LDADD = $(LDADD) testing_te_DEPENDENCIES = $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \ $(am__DEPENDENCIES_1) am__testing_test_SOURCES_DIST = testing/test.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_test_OBJECTS = testing/test.$(OBJEXT) $(am__objects_39) testing_test_OBJECTS = $(am_testing_test_OBJECTS) testing_test_LDADD = $(LDADD) testing_test_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_test2_SOURCES_DIST = testing/test2.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_test2_OBJECTS = testing/test2.$(OBJEXT) $(am__objects_39) testing_test2_OBJECTS = $(am_testing_test2_OBJECTS) testing_test2_LDADD = $(LDADD) testing_test2_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_test_groups_SOURCES_DIST = testing/test_groups.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_test_groups_OBJECTS = testing/test_groups.$(OBJEXT) \ $(am__objects_39) testing_test_groups_OBJECTS = $(am_testing_test_groups_OBJECTS) testing_test_groups_LDADD = $(LDADD) testing_test_groups_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_test_mt_SOURCES_DIST = testing/test_mt.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_test_mt_OBJECTS = testing/test_mt.$(OBJEXT) \ $(am__objects_39) testing_test_mt_OBJECTS = $(am_testing_test_mt_OBJECTS) testing_test_mt_LDADD = $(LDADD) testing_test_mt_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_testitr_SOURCES_DIST = testing/testitr.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c @HAVE_ARMCI_MSG_INIT_FALSE@am__objects_40 = testing/testing_testitr-rpl_armci_msg_init.$(OBJEXT) @HAVE_ARMCI_MSG_FINALIZE_FALSE@am__objects_41 = testing/testing_testitr-rpl_armci_msg_finalize.$(OBJEXT) am__objects_42 = $(am__objects_40) $(am__objects_41) am_testing_testitr_OBJECTS = \ testing/testing_testitr-testitr.$(OBJEXT) $(am__objects_42) testing_testitr_OBJECTS = $(am_testing_testitr_OBJECTS) testing_testitr_LDADD = $(LDADD) testing_testitr_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) am__testing_testnotify_SOURCES_DIST = testing/testnotify.c \ testing/rpl_armci_msg_init.c testing/rpl_armci_msg_finalize.c am_testing_testnotify_OBJECTS = testing/testnotify.$(OBJEXT) \ $(am__objects_39) testing_testnotify_OBJECTS = $(am_testing_testnotify_OBJECTS) testing_testnotify_LDADD = $(LDADD) testing_testnotify_DEPENDENCIES = $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) LTCCASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ $(CCASFLAGS) AM_V_CCAS = $(am__v_CCAS_@AM_V@) am__v_CCAS_ = $(am__v_CCAS_@AM_DEFAULT_V@) am__v_CCAS_0 = @echo " CCAS " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libarmci_la_SOURCES) $(nodist_libarmci_la_SOURCES) \ $(libarmci_prof_la_SOURCES) \ $(examples_benchmarks_RandomAccess_simple_simple_SOURCES) \ $(examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_SOURCES) \ $(examples_benchmarks_cg_armci_sharedmemory_cg_SOURCES) \ $(examples_benchmarks_lu_armci_blocking_lu_SOURCES) \ $(examples_benchmarks_lu_armci_blocking_lu_b_bc_SOURCES) \ $(examples_benchmarks_lu_armci_blocking_lu_block_SOURCES) \ $(examples_benchmarks_lu_armci_multithreaded_lu_block_th_SOURCES) \ $(examples_benchmarks_lu_armci_nonblocking_lu_nb_get_SOURCES) \ $(examples_benchmarks_lu_armci_nonblocking_lu_nb_put_SOURCES) \ $(examples_benchmarks_lu_pthreads_lu_thread_SOURCES) \ $(examples_features_aggregation_simple_simple_SOURCES) \ $(examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_SOURCES) \ $(examples_features_concurrency_multidma_multidma_SOURCES) \ $(examples_features_concurrency_simple_comdegree_SOURCES) \ $(examples_features_gpc_hashtable_test_hashtable_SOURCES) \ $(examples_features_non_blocking_overlap_overlap_SOURCES) \ $(examples_features_non_blocking_simple_simple_SOURCES) \ $(examples_features_notification_simple_testnotify_SOURCES) \ $(examples_features_proc_affinity_computation_impact_computation_impact_SOURCES) \ $(examples_features_proc_affinity_simple_simple_SOURCES) \ $(examples_features_symmetric_memory_simple_simple_SOURCES) \ $(examples_simpleApps_transp1D_c_SOURCES) $(parallel_SOURCES) \ $(testing_clone_SOURCES) $(testing_fork_SOURCES) \ $(testing_fttest_SOURCES) $(testing_gpctest_SOURCES) \ $(testing_ipctest_SOURCES) $(testing_msgcheck_SOURCES) \ $(testing_origptl_SOURCES) $(testing_perf_SOURCES) \ $(testing_perf2_SOURCES) $(testing_perf_aggr_SOURCES) \ $(testing_perf_nb_SOURCES) $(testing_perf_strided_SOURCES) \ $(testing_ptltest_SOURCES) $(testing_shmclean_SOURCES) \ $(testing_shmtest_SOURCES) $(testing_simple_SOURCES) \ $(testing_simplelock_SOURCES) $(testing_te_SOURCES) \ $(testing_test_SOURCES) $(testing_test2_SOURCES) \ $(testing_test_groups_SOURCES) $(testing_test_mt_SOURCES) \ $(testing_testitr_SOURCES) $(testing_testnotify_SOURCES) DIST_SOURCES = $(am__libarmci_la_SOURCES_DIST) \ $(am__libarmci_prof_la_SOURCES_DIST) \ $(am__examples_benchmarks_RandomAccess_simple_simple_SOURCES_DIST) \ $(am__examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_SOURCES_DIST) \ $(am__examples_benchmarks_cg_armci_sharedmemory_cg_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_blocking_lu_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_blocking_lu_b_bc_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_blocking_lu_block_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_multithreaded_lu_block_th_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_nonblocking_lu_nb_get_SOURCES_DIST) \ $(am__examples_benchmarks_lu_armci_nonblocking_lu_nb_put_SOURCES_DIST) \ $(am__examples_benchmarks_lu_pthreads_lu_thread_SOURCES_DIST) \ $(am__examples_features_aggregation_simple_simple_SOURCES_DIST) \ $(am__examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_SOURCES_DIST) \ $(am__examples_features_concurrency_multidma_multidma_SOURCES_DIST) \ $(am__examples_features_concurrency_simple_comdegree_SOURCES_DIST) \ $(am__examples_features_gpc_hashtable_test_hashtable_SOURCES_DIST) \ $(am__examples_features_non_blocking_overlap_overlap_SOURCES_DIST) \ $(am__examples_features_non_blocking_simple_simple_SOURCES_DIST) \ $(am__examples_features_notification_simple_testnotify_SOURCES_DIST) \ $(am__examples_features_proc_affinity_computation_impact_computation_impact_SOURCES_DIST) \ $(am__examples_features_proc_affinity_simple_simple_SOURCES_DIST) \ $(am__examples_features_symmetric_memory_simple_simple_SOURCES_DIST) \ $(am__examples_simpleApps_transp1D_c_SOURCES_DIST) \ $(am__parallel_SOURCES_DIST) $(am__testing_clone_SOURCES_DIST) \ $(am__testing_fork_SOURCES_DIST) \ $(am__testing_fttest_SOURCES_DIST) \ $(am__testing_gpctest_SOURCES_DIST) \ $(am__testing_ipctest_SOURCES_DIST) \ $(am__testing_msgcheck_SOURCES_DIST) \ $(am__testing_origptl_SOURCES_DIST) \ $(am__testing_perf_SOURCES_DIST) \ $(am__testing_perf2_SOURCES_DIST) \ $(am__testing_perf_aggr_SOURCES_DIST) \ $(am__testing_perf_nb_SOURCES_DIST) \ $(am__testing_perf_strided_SOURCES_DIST) \ $(am__testing_ptltest_SOURCES_DIST) \ $(am__testing_shmclean_SOURCES_DIST) \ $(am__testing_shmtest_SOURCES_DIST) \ $(am__testing_simple_SOURCES_DIST) \ $(am__testing_simplelock_SOURCES_DIST) \ $(am__testing_te_SOURCES_DIST) \ $(am__testing_test_SOURCES_DIST) \ $(am__testing_test2_SOURCES_DIST) \ $(am__testing_test_groups_SOURCES_DIST) \ $(am__testing_test_mt_SOURCES_DIST) \ $(am__testing_testitr_SOURCES_DIST) \ $(am__testing_testnotify_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__include_HEADERS_DIST = src-portals/armci.h src-portals/gpc.h \ src-portals/message.h src-gemini/armci.h src-gemini/gpc.h \ src-gemini/message.h src/include/armci.h src/include/gpc.h \ src/include/message.h src/include/parmci.h HEADERS = $(include_HEADERS) ETAGS = etags CTAGS = ctags # If stdout is a non-dumb tty, use colors. If test -t is not supported, # then this fails; a conservative approach. Of course do not redirect # stdout here, just stderr. am__tty_colors = \ red=; grn=; lgn=; blu=; std=; \ test "X$(AM_COLOR_TESTS)" != Xno \ && test "X$$TERM" != Xdumb \ && { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \ && { \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ std=''; \ } # Restructured Text title and section. am__rst_title = sed 's/.*/ & /;h;s/./=/g;p;x;p;g;p;s/.*//' am__rst_section = sed 'p;s/./=/g;p;g' # Put stdin (possibly several lines separated by ". ") in a box. # Prefix each line by 'col' and terminate each with 'std', for coloring. # Multi line coloring is problematic with "less -R", so we really need # to color each line individually. am__text_box = $(AWK) '{ \ n = split($$0, lines, "\\. "); max = 0; \ for (i = 1; i <= n; ++i) \ if (max < length(lines[i])) \ max = length(lines[i]); \ for (i = 0; i < max; ++i) \ line = line "="; \ print col line std; \ for (i = 1; i <= n; ++i) \ if (lines[i]) \ print col lines[i] std; \ print col line std; \ }' # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log, and passes # TESTS_ENVIRONMENT. Save and restore TERM around use of # TESTS_ENVIRONMENT, in case that unsets it. am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ srcdir=$(srcdir); export srcdir; \ rm -f $@-t; \ am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \ trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2; \ trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \ am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`; \ test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM; \ $(TESTS_ENVIRONMENT) # To be appended to the command running the test. Handle the stdout # and stderr redirection, and catch the exit status. am__check_post = \ >$@-t 2>&1; \ estatus=$$?; \ if test -n '$(DISABLE_HARD_ERRORS)' \ && test $$estatus -eq 99; then \ estatus=1; \ fi; \ TERM=$$__SAVED_TERM; export TERM; \ $(am__tty_colors); \ xfailed=PASS; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ xfailed=XFAIL;; \ esac; \ case $$estatus.$$xfailed in \ 0.XFAIL) col=$$red; res=XPASS;; \ 0.*) col=$$grn; res=PASS ;; \ 77.*) col=$$blu; res=SKIP ;; \ 99.*) col=$$red; res=FAIL ;; \ *.XFAIL) col=$$lgn; res=XFAIL;; \ *.*) col=$$red; res=FAIL ;; \ esac; \ echo "$${col}$$res$${std}: $$f"; \ echo "$$res: $$f (exit: $$estatus)" | \ $(am__rst_section) >$@; \ cat $@-t >>$@; \ rm -f $@-t RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck check-html recheck-html TEST_SUITE_HTML = $(TEST_SUITE_LOG:.log=.html) am__EXEEXT_17 = $(ARMCI_SERIAL_TESTS) am__EXEEXT_18 = $(ARMCI_PARALLEL_TESTS) am__EXEEXT_19 = am__EXEEXT_20 = $(am__EXEEXT_19) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) TEST_LOGS_TMP = $(TEST_LOGS:.log=.log-t) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARMCI_COPT = @ARMCI_COPT@ ARMCI_CXXOPT = @ARMCI_CXXOPT@ ARMCI_NETWORK_CPPFLAGS = @ARMCI_NETWORK_CPPFLAGS@ $(am__append_2) ARMCI_NETWORK_LDFLAGS = @ARMCI_NETWORK_LDFLAGS@ $(am__append_3) ARMCI_NETWORK_LIBS = @ARMCI_NETWORK_LIBS@ $(am__append_4) ARMCI_SRC_DIR = @ARMCI_SRC_DIR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ C_POINTER_AS_INTEGER = @C_POINTER_AS_INTEGER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GA_CXX_WARN = @GA_CXX_WARN@ GA_C_WARN = @GA_C_WARN@ GA_MP_CPPFLAGS = @GA_MP_CPPFLAGS@ GA_MP_LDFLAGS = @GA_MP_LDFLAGS@ GA_MP_LIBS = @GA_MP_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NPROCS = @NPROCS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TCGEXEC = @TCGEXEC@ THREAD_LIBRARY = @THREAD_LIBRARY@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ ga_cv_path_rsh = @ga_cv_path_rsh@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The usual aclocal nonsense to get include paths right. ACLOCAL_AMFLAGS = -I m4 -I ../m4 # All public headers, installed programs, test programs, and example programs # are listed in these variables. Appended to throughout. These are the # automake variables used. include_HEADERS = $(am__append_14) $(am__append_19) $(am__append_53) \ src/include/parmci.h check_LTLIBRARIES = lib_LTLIBRARIES = $(am__append_1) $(am__append_55) ############################################################################## # tcgmsg # EXTRA_DIST = README tcgmsg/README examples/benchmarks/lu/README \ examples/features/aggregation/README \ examples/features/concurrency/README \ examples/features/gpc/hashtable/README \ examples/features/non-blocking/README \ examples/features/notification/README \ examples/features/proc_affinity/README examples/README BUILT_SOURCES = MOSTLYCLEANFILES = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_FFLAGS = $(ARMCI_FOPT) $(GA_F_WARN) $(FFLAG_INT) AM_CFLAGS = $(ARMCI_COPT) $(GA_C_WARN) AM_CXXFLAGS = $(ARMCI_CXXOPT) $(GA_CXX_WARN) AM_CPPFLAGS = $(GA_MP_CPPFLAGS) $(ARMCI_NETWORK_CPPFLAGS) \ $(am__append_5) $(am__append_15) $(am__append_20) \ $(am__append_24) $(am__append_26) $(am__append_28) \ $(am__append_33) $(am__append_35) $(am__append_37) \ $(am__append_39) $(am__append_41) $(am__append_46) \ $(am__append_48) $(am__append_54) $(am__append_59) \ $(am__append_62) AM_LDFLAGS = $(LDFLAGS_BASE) LDADD = $(am__append_6) $(am__append_7) $(am__append_21) libarmci_la_SOURCES = $(am__append_9) $(am__append_10) \ $(am__append_11) $(am__append_12) $(am__append_13) \ $(am__append_16) $(am__append_17) $(am__append_18) \ $(am__append_22) $(am__append_23) $(am__append_25) \ $(am__append_27) $(am__append_29) $(am__append_30) \ $(am__append_31) $(am__append_32) $(am__append_34) \ $(am__append_36) $(am__append_38) $(am__append_40) \ $(am__append_42) $(am__append_43) $(am__append_44) \ $(am__append_45) $(am__append_47) $(am__append_49) \ $(am__append_50) $(am__append_51) $(am__append_52) \ $(am__append_56) $(am__append_57) $(am__append_58) \ $(am__append_60) $(am__append_63) $(am__append_64) \ $(am__append_65) nodist_libarmci_la_SOURCES = libarmci_la_LIBADD = $(am__append_8) LDFLAGS_BASE = $(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) ############################################################################## # compiler and linker flags # # Important for external tools wanting to know how to link to ARMCI. SED_NORMALIZE_WHITESPACE = $(SED) 's/ [ ]*/ /g;s/" /"/g;s/ "/"/g' @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@libarmci_prof_la_SOURCES = tools/armci_prof.c @MSG_COMMS_TCGMSG4_TRUE@parallel_SOURCES = tcgmsg/ipcv4.0/parallel.c atsrc = $(am__append_74) $(am__append_75) ARMCI_SERIAL_TESTS = $(am__append_81) ARMCI_SERIAL_TESTS_XFAIL = #ARMCI_PARALLEL_TESTS += testing/perf2(EXEEXT) # only a benchmark #ARMCI_PARALLEL_TESTS += testing/perf_nb$(EXEEXT) # needs bug fixes #ARMCI_SERIAL_TESTS += testing/shmclean$(EXEEXT) # not sure we need this #ARMCI_SERIAL_TESTS += testing/shmtest$(EXEEXT) # not sure we need this #ARMCI_PARALLEL_TESTS += examples/benchmarks/cg/armci_sharedmemory/cg$(EXEEXT) # needs input file #ARMCI_PARALLEL_TESTS += examples/features/aggregation/sparse_matvecmul/sparse_matvecmul$(EXEEXT) # needs input file ARMCI_PARALLEL_TESTS = testing/msgcheck$(EXEEXT) testing/perf$(EXEEXT) \ testing/perf_aggr$(EXEEXT) testing/simplelock$(EXEEXT) \ testing/test$(EXEEXT) testing/test2$(EXEEXT) $(am__append_76) \ $(am__append_77) $(am__append_78) $(am__append_79) \ $(am__append_80) \ examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT) \ examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT) \ examples/benchmarks/lu/armci_blocking/lu$(EXEEXT) \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT) \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT) \ examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT) \ examples/features/aggregation/simple/simple$(EXEEXT) \ examples/features/non-blocking/simple/simple$(EXEEXT) \ $(am__append_89) \ examples/features/symmetric_memory/simple/simple$(EXEEXT) \ examples/simpleApps/transp1D-c$(EXEEXT) $(am__append_90) \ $(am__append_91) $(am__append_92) $(am__append_93) \ $(am__append_94) ARMCI_PARALLEL_TESTS_XFAIL = ARMCI_TESTS = $(ARMCI_SERIAL_TESTS) $(ARMCI_PARALLEL_TESTS) ARMCI_TESTS_XFAIL = $(ARMCI_SERIAL_TESTS_XFAIL) $(ARMCI_PARALLEL_TESTS_XFAIL) testing_clone_SOURCES = testing/clone.c $(atsrc) testing_fork_SOURCES = testing/fork.c $(atsrc) testing_fttest_SOURCES = testing/fttest.c $(atsrc) testing_gpctest_SOURCES = testing/gpctest.c $(atsrc) testing_ipctest_SOURCES = testing/ipctest.c $(atsrc) testing_msgcheck_SOURCES = testing/msgcheck.c $(atsrc) testing_origptl_SOURCES = testing/origptl.c $(atsrc) testing_perf_aggr_SOURCES = testing/perf_aggr.c $(atsrc) testing_perf_nb_SOURCES = testing/perf_nb.c $(atsrc) testing_perf_strided_SOURCES = testing/perf_strided.c $(atsrc) testing_perf_SOURCES = testing/perf.c $(atsrc) testing_perf2_SOURCES = testing/perf2.c $(atsrc) testing_ptltest_SOURCES = testing/ptltest.c $(atsrc) testing_shmclean_SOURCES = testing/shmclean.c $(atsrc) testing_shmtest_SOURCES = testing/shmtest.c $(atsrc) testing_simple_SOURCES = testing/simple.c $(atsrc) testing_simplelock_SOURCES = testing/simplelock.c $(atsrc) testing_te_SOURCES = testing/te.c $(atsrc) testing_test2_SOURCES = testing/test2.c $(atsrc) testing_test_groups_SOURCES = testing/test_groups.c $(atsrc) testing_testitr_SOURCES = testing/testitr.c $(atsrc) testing_test_mt_SOURCES = testing/test_mt.c $(atsrc) testing_testnotify_SOURCES = testing/testnotify.c $(atsrc) testing_test_SOURCES = testing/test.c $(atsrc) testing_testitr_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/include examples_benchmarks_cg_armci_sharedmemory_cg_SOURCES = \ examples/benchmarks/cg/armci_sharedmemory/cg.c \ examples/benchmarks/cg/armci_sharedmemory/compute.c \ examples/benchmarks/cg/armci_sharedmemory/read_input.c \ examples/benchmarks/cg/armci_sharedmemory/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_block_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu-block.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_b_bc_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu-b-bc.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_multithreaded_lu_block_th_SOURCES = \ examples/benchmarks/lu/armci_multithreaded/lu-block-th.c \ examples/benchmarks/lu/armci_multithreaded/timing.c $(atsrc) examples_benchmarks_lu_armci_nonblocking_lu_nb_put_SOURCES = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put.c \ examples/benchmarks/lu/armci_nonblocking/timing.c $(atsrc) examples_benchmarks_lu_armci_nonblocking_lu_nb_get_SOURCES = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get.c \ examples/benchmarks/lu/armci_nonblocking/timing.c $(atsrc) examples_benchmarks_lu_pthreads_lu_thread_SOURCES = \ examples/benchmarks/lu/pthreads/barrier.c \ examples/benchmarks/lu/pthreads/barrier.h \ examples/benchmarks/lu/pthreads/errors.h \ examples/benchmarks/lu/pthreads/lu-thread.c \ examples/benchmarks/lu/pthreads/timing.c $(atsrc) examples_benchmarks_lu_pthreads_lu_thread_LDADD = -lpthread examples_benchmarks_RandomAccess_simple_simple_SOURCES = \ examples/benchmarks/RandomAccess/simple/simple.c \ examples/benchmarks/RandomAccess/timing.c $(atsrc) examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_SOURCES = \ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.c \ examples/benchmarks/RandomAccess/timing.c $(atsrc) examples_features_aggregation_simple_simple_SOURCES = \ examples/features/aggregation/simple/simple.c $(atsrc) examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_SOURCES = \ examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.c $(atsrc) examples_features_concurrency_multidma_multidma_SOURCES = \ examples/features/concurrency/multidma/multidma.c $(atsrc) examples_features_concurrency_simple_comdegree_SOURCES = \ examples/features/concurrency/simple/comdegree.c $(atsrc) examples_features_gpc_hashtable_test_hashtable_SOURCES = \ examples/features/gpc/hashtable/DistHashmap.cc \ examples/features/gpc/hashtable/DistHashmap.h \ examples/features/gpc/hashtable/GPCHashmap.cc \ examples/features/gpc/hashtable/GPCHashmap.h \ examples/features/gpc/hashtable/GPCHashmapHandler.cc \ examples/features/gpc/hashtable/Hash_common.h \ examples/features/gpc/hashtable/HashFunctions.cc \ examples/features/gpc/hashtable/hash_map.h \ examples/features/gpc/hashtable/HashUtil.cc \ examples/features/gpc/hashtable/test_hashtable.cc \ examples/features/gpc/hashtable/Util.h $(atsrc) examples_features_gpc_hashtable_test_hashtable_LDFLAGS = $(LDFLAGS_BASE) examples_features_gpc_hashtable_test_hashtable_LDADD = $(LDADD) $(MAYBE_FLIBS) examples_features_non_blocking_overlap_overlap_SOURCES = \ examples/features/non-blocking/overlap/overlap.c $(atsrc) examples_features_non_blocking_simple_simple_SOURCES = \ examples/features/non-blocking/simple/simple.c $(atsrc) examples_features_notification_simple_testnotify_SOURCES = \ examples/features/notification/simple/testnotify.c $(atsrc) examples_features_proc_affinity_computation_impact_computation_impact_SOURCES = \ examples/features/proc_affinity/computation_impact/computation_impact.c $(atsrc) examples_features_proc_affinity_computation_impact_computation_impact_LDFLAGS = \ $(AM_LDFLAGS) \ $(LAPACK_LDFLAGS) \ $(BLAS_LDFLAGS) examples_features_proc_affinity_computation_impact_computation_impact_LDADD = \ $(LDADD) \ $(LAPACK_LIBS) \ $(BLAS_LIBS) examples_features_proc_affinity_simple_simple_SOURCES = \ examples/features/proc_affinity/simple/simple.c $(atsrc) examples_features_symmetric_memory_simple_simple_SOURCES = \ examples/features/symmetric_memory/simple/simple.c $(atsrc) examples_simpleApps_transp1D_c_SOURCES = \ examples/simpleApps/transp1D-c.c $(atsrc) # support verbose/silent make rules for additional programs # sed SED_V = $(SED__v_$(V)) SED__v_ = $(SED__v_$(AM_DEFAULT_VERBOSITY)) SED__v_0 = @echo " SED " $@; # ARMCI_TAS_AS ARMCI_TAS_AS_V = $(ARMCI_TAS_AS__v_$(V)) ARMCI_TAS_AS__v_ = $(ARMCI_TAS_AS__v_$(AM_DEFAULT_VERBOSITY)) ARMCI_TAS_AS__v_0 = @echo " GCC " $@; # ARMCI_X86COPY_AS ARMCI_X86COPY_AS_V = $(ARMCI_X86COPY_AS__v_$(V)) ARMCI_X86COPY_AS__v_ = $(ARMCI_X86COPY_AS__v_$(AM_DEFAULT_VERBOSITY)) ARMCI_X86COPY_AS__v_0 = @echo " GCC " $@; ############################################################################## # test suite # # Some tests were commented out either because they required an input file or # they were failing for unknown reasons and we didn't want to further debug. # SERIAL_TESTS = $(GAF2C_SERIAL_TESTS) $(TCGMSG_SERIAL_TESTS) \ $(ARMCI_SERIAL_TESTS) SERIAL_TESTS_XFAIL = $(GAF2C_SERIAL_TESTS_XFAIL) \ $(TCGMSG_SERIAL_TESTS_XFAIL) $(ARMCI_SERIAL_TESTS_XFAIL) PARALLEL_TESTS = $(GAF2C_PARALLEL_TESTS) $(TCGMSG_PARALLEL_TESTS) \ $(ARMCI_PARALLEL_TESTS) PARALLEL_TESTS_XFAIL = $(GAF2C_PARALLEL_TESTS_XFAIL) \ $(TCGMSG_PARALLEL_TESTS_XFAIL) $(ARMCI_PARALLEL_TESTS_XFAIL) @CROSS_COMPILING_FALSE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@LOG_COMPILER = \ @CROSS_COMPILING_FALSE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@maybe_mpiexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else if echo "$(MPIEXEC)" | $(GREP) "%NP%" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; else echo "$(MPIEXEC)"; fi; fi`; eval $$maybe_mpiexec @MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_TRUE@LOG_COMPILER = tst="$$dir$$f -np $(NPROCS)"; eval @MSG_COMMS_TCGMSG4_TRUE@LOG_COMPILER = \ @MSG_COMMS_TCGMSG4_TRUE@maybe_parexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else echo "$(TCGEXEC)"; fi`; eval $$maybe_parexec @CROSS_COMPILING_TRUE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@maybe_mpiexec = `if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/1/'; else echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; fi`; eval $$maybe_mpiexec all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cc .html .lo .log .o .obj .s .test .test$(EXEEXT) am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/src-portals/Makefile.inc $(top_srcdir)/src-gemini/Makefile.inc $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_srcdir)/src-portals/Makefile.inc $(top_srcdir)/src-gemini/Makefile.inc: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done src-portals/$(am__dirstamp): @$(MKDIR_P) src-portals @: > src-portals/$(am__dirstamp) src-portals/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src-portals/$(DEPDIR) @: > src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/aggregate.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/armci.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/armci_portals.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/buffers.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/caccumulate.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/ccopy.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/clusterinfo.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/ds-shared.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/fence.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/kr_malloc.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/locks.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/memlock.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/memory.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/message.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/mutex.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/pack.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/portals_cp.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/portals_ds.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/portals.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/request.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/rmw.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/rtinfo.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/semaphores.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/shmem.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/shmlimit.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/signaltrap.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/spawn.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/strided.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/vector.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/new_memory.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/groups.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/gpc.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/threads.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-portals/utils.lo: src-portals/$(am__dirstamp) \ src-portals/$(DEPDIR)/$(am__dirstamp) src-gemini/$(am__dirstamp): @$(MKDIR_P) src-gemini @: > src-gemini/$(am__dirstamp) src-gemini/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src-gemini/$(DEPDIR) @: > src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/aggregate.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/armci.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/armci-onesided.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/buffers.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/caccumulate.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/ccopy.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/clusterinfo.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/ds-shared.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/fence.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/groups.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/kr_malloc.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/locks.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/memlock.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/memory.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/message.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/mutex.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/pack.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/request.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/rmw.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/rtinfo.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/semaphores.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/shmem.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/shmlimit.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/signaltrap.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/spawn.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/strided.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/vector.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/gpc.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/threads.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src-gemini/utils.lo: src-gemini/$(am__dirstamp) \ src-gemini/$(DEPDIR)/$(am__dirstamp) src/collectives/$(am__dirstamp): @$(MKDIR_P) src/collectives @: > src/collectives/$(am__dirstamp) src/collectives/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/collectives/$(DEPDIR) @: > src/collectives/$(DEPDIR)/$(am__dirstamp) src/collectives/message.lo: src/collectives/$(am__dirstamp) \ src/collectives/$(DEPDIR)/$(am__dirstamp) src/common/$(am__dirstamp): @$(MKDIR_P) src/common @: > src/common/$(am__dirstamp) src/common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/common/$(DEPDIR) @: > src/common/$(DEPDIR)/$(am__dirstamp) src/common/aggregate.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/armci.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/ccopy.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/clusterinfo.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/pack.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/iterator.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/locks/$(am__dirstamp): @$(MKDIR_P) src/locks @: > src/locks/$(am__dirstamp) src/locks/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/locks/$(DEPDIR) @: > src/locks/$(DEPDIR)/$(am__dirstamp) src/locks/locks.lo: src/locks/$(am__dirstamp) \ src/locks/$(DEPDIR)/$(am__dirstamp) src/locks/memlock.lo: src/locks/$(am__dirstamp) \ src/locks/$(DEPDIR)/$(am__dirstamp) src/locks/mutex.lo: src/locks/$(am__dirstamp) \ src/locks/$(DEPDIR)/$(am__dirstamp) src/locks/semaphores.lo: src/locks/$(am__dirstamp) \ src/locks/$(DEPDIR)/$(am__dirstamp) src/memory/$(am__dirstamp): @$(MKDIR_P) src/memory @: > src/memory/$(am__dirstamp) src/memory/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/memory/$(DEPDIR) @: > src/memory/$(DEPDIR)/$(am__dirstamp) src/memory/kr_malloc.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/memory/memory.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/progress/$(am__dirstamp): @$(MKDIR_P) src/progress @: > src/progress/$(am__dirstamp) src/progress/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/progress/$(DEPDIR) @: > src/progress/$(DEPDIR)/$(am__dirstamp) src/progress/fence.lo: src/progress/$(am__dirstamp) \ src/progress/$(DEPDIR)/$(am__dirstamp) src/progress/wait.lo: src/progress/$(am__dirstamp) \ src/progress/$(DEPDIR)/$(am__dirstamp) src/xfer/$(am__dirstamp): @$(MKDIR_P) src/xfer @: > src/xfer/$(am__dirstamp) src/xfer/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/xfer/$(DEPDIR) @: > src/xfer/$(DEPDIR)/$(am__dirstamp) src/xfer/caccumulate.lo: src/xfer/$(am__dirstamp) \ src/xfer/$(DEPDIR)/$(am__dirstamp) src/xfer/rmw.lo: src/xfer/$(am__dirstamp) \ src/xfer/$(DEPDIR)/$(am__dirstamp) src/xfer/strided.lo: src/xfer/$(am__dirstamp) \ src/xfer/$(DEPDIR)/$(am__dirstamp) src/xfer/vector.lo: src/xfer/$(am__dirstamp) \ src/xfer/$(DEPDIR)/$(am__dirstamp) src/common/groups.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/devices/bgml/$(am__dirstamp): @$(MKDIR_P) src/devices/bgml @: > src/devices/bgml/$(am__dirstamp) src/devices/bgml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/bgml/$(DEPDIR) @: > src/devices/bgml/$(DEPDIR)/$(am__dirstamp) src/devices/bgml/bgml.lo: src/devices/bgml/$(am__dirstamp) \ src/devices/bgml/$(DEPDIR)/$(am__dirstamp) src/memory/shmalloc.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf2 @: > src/devices/dcmf/dcmf2/$(am__dirstamp) src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf2/$(DEPDIR) @: > src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_acc.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_fence.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_get.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_impl.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_lock.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_put.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_rmw.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf2/armcix_wait.lo: \ src/devices/dcmf/dcmf2/$(am__dirstamp) \ src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf-0.2.0 @: > src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf-0.2.0/$(DEPDIR) @: > src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_acc.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_fence.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_get.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_impl.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_lock.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_put.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_rmw.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.2.0/armcix_wait.lo: \ src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf-0.3.0 @: > src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/dcmf/dcmf-0.3.0/$(DEPDIR) @: > src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_acc.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_fence.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_get.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_impl.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_lock.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_put.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_rmw.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/devices/dcmf/dcmf-0.3.0/armcix_wait.lo: \ src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) \ src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) src/common/async.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/request.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/devices/lapi/$(am__dirstamp): @$(MKDIR_P) src/devices/lapi @: > src/devices/lapi/$(am__dirstamp) src/devices/lapi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/lapi/$(DEPDIR) @: > src/devices/lapi/$(DEPDIR)/$(am__dirstamp) src/devices/lapi/lapi.lo: src/devices/lapi/$(am__dirstamp) \ src/devices/lapi/$(DEPDIR)/$(am__dirstamp) src/memory/buffers.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/common/ds-shared.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/spawn.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-mt/$(am__dirstamp): @$(MKDIR_P) src/devices/mpi-mt @: > src/devices/mpi-mt/$(am__dirstamp) src/devices/mpi-mt/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/mpi-mt/$(DEPDIR) @: > src/devices/mpi-mt/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-mt/mpi2_client.lo: src/devices/mpi-mt/$(am__dirstamp) \ src/devices/mpi-mt/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-mt/mpi2_server.lo: src/devices/mpi-mt/$(am__dirstamp) \ src/devices/mpi-mt/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-spawn/$(am__dirstamp): @$(MKDIR_P) src/devices/mpi-spawn @: > src/devices/mpi-spawn/$(am__dirstamp) src/devices/mpi-spawn/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/mpi-spawn/$(DEPDIR) @: > src/devices/mpi-spawn/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-spawn/mpi2_client.lo: \ src/devices/mpi-spawn/$(am__dirstamp) \ src/devices/mpi-spawn/$(DEPDIR)/$(am__dirstamp) src/devices/mpi-spawn/mpi2_server.lo: \ src/devices/mpi-spawn/$(am__dirstamp) \ src/devices/mpi-spawn/$(DEPDIR)/$(am__dirstamp) src/common/regions.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/devices/openib/$(am__dirstamp): @$(MKDIR_P) src/devices/openib @: > src/devices/openib/$(am__dirstamp) src/devices/openib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/openib/$(DEPDIR) @: > src/devices/openib/$(DEPDIR)/$(am__dirstamp) src/devices/openib/cbuf.lo: src/devices/openib/$(am__dirstamp) \ src/devices/openib/$(DEPDIR)/$(am__dirstamp) src/devices/openib/openib.lo: src/devices/openib/$(am__dirstamp) \ src/devices/openib/$(DEPDIR)/$(am__dirstamp) src/devices/openib/pendbufs.lo: src/devices/openib/$(am__dirstamp) \ src/devices/openib/$(DEPDIR)/$(am__dirstamp) src/devices/openib/rtinfo.lo: src/devices/openib/$(am__dirstamp) \ src/devices/openib/$(DEPDIR)/$(am__dirstamp) src/devices/sockets/$(am__dirstamp): @$(MKDIR_P) src/devices/sockets @: > src/devices/sockets/$(am__dirstamp) src/devices/sockets/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/devices/sockets/$(DEPDIR) @: > src/devices/sockets/$(DEPDIR)/$(am__dirstamp) src/devices/sockets/dataserv.lo: src/devices/sockets/$(am__dirstamp) \ src/devices/sockets/$(DEPDIR)/$(am__dirstamp) src/devices/sockets/sockets.lo: src/devices/sockets/$(am__dirstamp) \ src/devices/sockets/$(DEPDIR)/$(am__dirstamp) src/ft/$(am__dirstamp): @$(MKDIR_P) src/ft @: > src/ft/$(am__dirstamp) src/ft/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/ft/$(DEPDIR) @: > src/ft/$(DEPDIR)/$(am__dirstamp) src/ft/armci_chkpt.lo: src/ft/$(am__dirstamp) \ src/ft/$(DEPDIR)/$(am__dirstamp) src/ft/armci_storage.lo: src/ft/$(am__dirstamp) \ src/ft/$(DEPDIR)/$(am__dirstamp) src/common/gpc.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/signaltrap.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/memory/winshmem.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/memory/shmem.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/memory/shmlimit.lo: src/memory/$(am__dirstamp) \ src/memory/$(DEPDIR)/$(am__dirstamp) src/common/noncont.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/common/utils.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) src/util/$(am__dirstamp): @$(MKDIR_P) src/util @: > src/util/$(am__dirstamp) src/util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/util/$(DEPDIR) @: > src/util/$(DEPDIR)/$(am__dirstamp) src/util/threads.lo: src/util/$(am__dirstamp) \ src/util/$(DEPDIR)/$(am__dirstamp) src/locks/tas-sx.lo: src/locks/$(am__dirstamp) \ src/locks/$(DEPDIR)/$(am__dirstamp) src/common/capi.lo: src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) tools/$(am__dirstamp): @$(MKDIR_P) tools @: > tools/$(am__dirstamp) tools/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tools/$(DEPDIR) @: > tools/$(DEPDIR)/$(am__dirstamp) tools/armci_prof.lo: tools/$(am__dirstamp) \ tools/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/$(am__dirstamp): @$(MKDIR_P) tcgmsg/ipcv4.0 @: > tcgmsg/ipcv4.0/$(am__dirstamp) tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tcgmsg/ipcv4.0/$(DEPDIR) @: > tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/brdcst.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/checkbyte.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/cluster.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/drand48.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/error.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/evlog.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/evon.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/globalop.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/llog.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/mdtob.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/mdtoi.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/mitob.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/mitod.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/mtime.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/niceftn.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/nnodes.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/nodeid.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/nxtval.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/pbegin.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/pbeginf.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/pfilecopy.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/sema.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/setdbg.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/shmem.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/signals.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/snd.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/sockets.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/srmover.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/stats.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/synch.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/usleep.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/waitall.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/waitcom.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv4.0/xdrstuff.lo: tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/$(am__dirstamp): @$(MKDIR_P) tcgmsg/ipcv5.0 @: > tcgmsg/ipcv5.0/$(am__dirstamp) tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tcgmsg/ipcv5.0/$(DEPDIR) @: > tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/drand48.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/globalop.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/llog.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/mdtob.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/mdtoi.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/misc.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/mitob.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/mitod.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/mtime.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/niceftn.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/nnodes.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/nodeid.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/pbegin.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/pfilecopy.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/queues.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/signals.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/snd_rcv_probe.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/usleep.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/waitall.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/async_send_lapi.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/lapi_putget.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/async_send.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/busy.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/error.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/nxtval.shm.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/pbeginf.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/shmem.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) tcgmsg/ipcv5.0/synch.lo: tcgmsg/ipcv5.0/$(am__dirstamp) \ tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) libarmci.la: $(libarmci_la_OBJECTS) $(libarmci_la_DEPENDENCIES) $(EXTRA_libarmci_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libarmci_la_rpath) $(libarmci_la_OBJECTS) $(libarmci_la_LIBADD) $(LIBS) libarmci_prof.la: $(libarmci_prof_la_OBJECTS) $(libarmci_prof_la_DEPENDENCIES) $(EXTRA_libarmci_prof_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libarmci_prof_la_rpath) $(libarmci_prof_la_OBJECTS) $(libarmci_prof_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list examples/benchmarks/RandomAccess/simple/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess/simple @: > examples/benchmarks/RandomAccess/simple/$(am__dirstamp) examples/benchmarks/RandomAccess/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess/simple/$(DEPDIR) @: > examples/benchmarks/RandomAccess/simple/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/simple/simple.$(OBJEXT): \ examples/benchmarks/RandomAccess/simple/$(am__dirstamp) \ examples/benchmarks/RandomAccess/simple/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess @: > examples/benchmarks/RandomAccess/$(am__dirstamp) examples/benchmarks/RandomAccess/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess/$(DEPDIR) @: > examples/benchmarks/RandomAccess/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/timing.$(OBJEXT): \ examples/benchmarks/RandomAccess/$(am__dirstamp) \ examples/benchmarks/RandomAccess/$(DEPDIR)/$(am__dirstamp) testing/$(am__dirstamp): @$(MKDIR_P) testing @: > testing/$(am__dirstamp) testing/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) testing/$(DEPDIR) @: > testing/$(DEPDIR)/$(am__dirstamp) testing/rpl_armci_msg_init.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/rpl_armci_msg_finalize.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/simple/simple$(EXEEXT): $(examples_benchmarks_RandomAccess_simple_simple_OBJECTS) $(examples_benchmarks_RandomAccess_simple_simple_DEPENDENCIES) $(EXTRA_examples_benchmarks_RandomAccess_simple_simple_DEPENDENCIES) examples/benchmarks/RandomAccess/simple/$(am__dirstamp) @rm -f examples/benchmarks/RandomAccess/simple/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_RandomAccess_simple_simple_OBJECTS) $(examples_benchmarks_RandomAccess_simple_simple_LDADD) $(LIBS) examples/benchmarks/RandomAccess/smp_bucket/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess/smp_bucket @: > examples/benchmarks/RandomAccess/smp_bucket/$(am__dirstamp) examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR) @: > examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.$(OBJEXT): \ examples/benchmarks/RandomAccess/smp_bucket/$(am__dirstamp) \ examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT): $(examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_OBJECTS) $(examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_DEPENDENCIES) $(EXTRA_examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_DEPENDENCIES) examples/benchmarks/RandomAccess/smp_bucket/$(am__dirstamp) @rm -f examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_OBJECTS) $(examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_LDADD) $(LIBS) examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/cg/armci_sharedmemory @: > examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR) @: > examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/cg.$(OBJEXT): \ examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) \ examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/compute.$(OBJEXT): \ examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) \ examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/read_input.$(OBJEXT): \ examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) \ examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/timing.$(OBJEXT): \ examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) \ examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/cg/armci_sharedmemory/cg$(EXEEXT): $(examples_benchmarks_cg_armci_sharedmemory_cg_OBJECTS) $(examples_benchmarks_cg_armci_sharedmemory_cg_DEPENDENCIES) $(EXTRA_examples_benchmarks_cg_armci_sharedmemory_cg_DEPENDENCIES) examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) @rm -f examples/benchmarks/cg/armci_sharedmemory/cg$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_cg_armci_sharedmemory_cg_OBJECTS) $(examples_benchmarks_cg_armci_sharedmemory_cg_LDADD) $(LIBS) examples/benchmarks/lu/armci_blocking/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_blocking @: > examples/benchmarks/lu/armci_blocking/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_blocking/$(DEPDIR) @: > examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/lu.$(OBJEXT): \ examples/benchmarks/lu/armci_blocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/timing.$(OBJEXT): \ examples/benchmarks/lu/armci_blocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/lu$(EXEEXT): $(examples_benchmarks_lu_armci_blocking_lu_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_blocking_lu_DEPENDENCIES) examples/benchmarks/lu/armci_blocking/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_blocking/lu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_blocking_lu_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_LDADD) $(LIBS) examples/benchmarks/lu/armci_blocking/lu-b-bc.$(OBJEXT): \ examples/benchmarks/lu/armci_blocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT): $(examples_benchmarks_lu_armci_blocking_lu_b_bc_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_b_bc_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_blocking_lu_b_bc_DEPENDENCIES) examples/benchmarks/lu/armci_blocking/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_blocking_lu_b_bc_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_b_bc_LDADD) $(LIBS) examples/benchmarks/lu/armci_blocking/lu-block.$(OBJEXT): \ examples/benchmarks/lu/armci_blocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT): $(examples_benchmarks_lu_armci_blocking_lu_block_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_block_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_blocking_lu_block_DEPENDENCIES) examples/benchmarks/lu/armci_blocking/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_blocking_lu_block_OBJECTS) $(examples_benchmarks_lu_armci_blocking_lu_block_LDADD) $(LIBS) examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_multithreaded @: > examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp) examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_multithreaded/$(DEPDIR) @: > examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_multithreaded/lu-block-th.$(OBJEXT): \ examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp) \ examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_multithreaded/timing.$(OBJEXT): \ examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp) \ examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT): $(examples_benchmarks_lu_armci_multithreaded_lu_block_th_OBJECTS) $(examples_benchmarks_lu_armci_multithreaded_lu_block_th_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_multithreaded_lu_block_th_DEPENDENCIES) examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_multithreaded_lu_block_th_OBJECTS) $(examples_benchmarks_lu_armci_multithreaded_lu_block_th_LDADD) $(LIBS) examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_nonblocking @: > examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/armci_nonblocking/$(DEPDIR) @: > examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_nonblocking/lu_nb_get.$(OBJEXT): \ examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_nonblocking/timing.$(OBJEXT): \ examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT): $(examples_benchmarks_lu_armci_nonblocking_lu_nb_get_OBJECTS) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_get_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_nonblocking_lu_nb_get_DEPENDENCIES) examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_get_OBJECTS) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_get_LDADD) $(LIBS) examples/benchmarks/lu/armci_nonblocking/lu_nb_put.$(OBJEXT): \ examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) \ examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT): $(examples_benchmarks_lu_armci_nonblocking_lu_nb_put_OBJECTS) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_put_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_armci_nonblocking_lu_nb_put_DEPENDENCIES) examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) @rm -f examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_put_OBJECTS) $(examples_benchmarks_lu_armci_nonblocking_lu_nb_put_LDADD) $(LIBS) examples/benchmarks/lu/pthreads/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/pthreads @: > examples/benchmarks/lu/pthreads/$(am__dirstamp) examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/benchmarks/lu/pthreads/$(DEPDIR) @: > examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/pthreads/barrier.$(OBJEXT): \ examples/benchmarks/lu/pthreads/$(am__dirstamp) \ examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/pthreads/lu-thread.$(OBJEXT): \ examples/benchmarks/lu/pthreads/$(am__dirstamp) \ examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/pthreads/timing.$(OBJEXT): \ examples/benchmarks/lu/pthreads/$(am__dirstamp) \ examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp) examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT): $(examples_benchmarks_lu_pthreads_lu_thread_OBJECTS) $(examples_benchmarks_lu_pthreads_lu_thread_DEPENDENCIES) $(EXTRA_examples_benchmarks_lu_pthreads_lu_thread_DEPENDENCIES) examples/benchmarks/lu/pthreads/$(am__dirstamp) @rm -f examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_benchmarks_lu_pthreads_lu_thread_OBJECTS) $(examples_benchmarks_lu_pthreads_lu_thread_LDADD) $(LIBS) examples/features/aggregation/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/aggregation/simple @: > examples/features/aggregation/simple/$(am__dirstamp) examples/features/aggregation/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/aggregation/simple/$(DEPDIR) @: > examples/features/aggregation/simple/$(DEPDIR)/$(am__dirstamp) examples/features/aggregation/simple/simple.$(OBJEXT): \ examples/features/aggregation/simple/$(am__dirstamp) \ examples/features/aggregation/simple/$(DEPDIR)/$(am__dirstamp) examples/features/aggregation/simple/simple$(EXEEXT): $(examples_features_aggregation_simple_simple_OBJECTS) $(examples_features_aggregation_simple_simple_DEPENDENCIES) $(EXTRA_examples_features_aggregation_simple_simple_DEPENDENCIES) examples/features/aggregation/simple/$(am__dirstamp) @rm -f examples/features/aggregation/simple/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_aggregation_simple_simple_OBJECTS) $(examples_features_aggregation_simple_simple_LDADD) $(LIBS) examples/features/aggregation/sparse_matvecmul/$(am__dirstamp): @$(MKDIR_P) examples/features/aggregation/sparse_matvecmul @: > examples/features/aggregation/sparse_matvecmul/$(am__dirstamp) examples/features/aggregation/sparse_matvecmul/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/aggregation/sparse_matvecmul/$(DEPDIR) @: > examples/features/aggregation/sparse_matvecmul/$(DEPDIR)/$(am__dirstamp) examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.$(OBJEXT): examples/features/aggregation/sparse_matvecmul/$(am__dirstamp) \ examples/features/aggregation/sparse_matvecmul/$(DEPDIR)/$(am__dirstamp) examples/features/aggregation/sparse_matvecmul/sparse_matvecmul$(EXEEXT): $(examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_OBJECTS) $(examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_DEPENDENCIES) $(EXTRA_examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_DEPENDENCIES) examples/features/aggregation/sparse_matvecmul/$(am__dirstamp) @rm -f examples/features/aggregation/sparse_matvecmul/sparse_matvecmul$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_OBJECTS) $(examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_LDADD) $(LIBS) examples/features/concurrency/multidma/$(am__dirstamp): @$(MKDIR_P) examples/features/concurrency/multidma @: > examples/features/concurrency/multidma/$(am__dirstamp) examples/features/concurrency/multidma/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/concurrency/multidma/$(DEPDIR) @: > examples/features/concurrency/multidma/$(DEPDIR)/$(am__dirstamp) examples/features/concurrency/multidma/multidma.$(OBJEXT): \ examples/features/concurrency/multidma/$(am__dirstamp) \ examples/features/concurrency/multidma/$(DEPDIR)/$(am__dirstamp) examples/features/concurrency/multidma/multidma$(EXEEXT): $(examples_features_concurrency_multidma_multidma_OBJECTS) $(examples_features_concurrency_multidma_multidma_DEPENDENCIES) $(EXTRA_examples_features_concurrency_multidma_multidma_DEPENDENCIES) examples/features/concurrency/multidma/$(am__dirstamp) @rm -f examples/features/concurrency/multidma/multidma$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_concurrency_multidma_multidma_OBJECTS) $(examples_features_concurrency_multidma_multidma_LDADD) $(LIBS) examples/features/concurrency/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/concurrency/simple @: > examples/features/concurrency/simple/$(am__dirstamp) examples/features/concurrency/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/concurrency/simple/$(DEPDIR) @: > examples/features/concurrency/simple/$(DEPDIR)/$(am__dirstamp) examples/features/concurrency/simple/comdegree.$(OBJEXT): \ examples/features/concurrency/simple/$(am__dirstamp) \ examples/features/concurrency/simple/$(DEPDIR)/$(am__dirstamp) examples/features/concurrency/simple/comdegree$(EXEEXT): $(examples_features_concurrency_simple_comdegree_OBJECTS) $(examples_features_concurrency_simple_comdegree_DEPENDENCIES) $(EXTRA_examples_features_concurrency_simple_comdegree_DEPENDENCIES) examples/features/concurrency/simple/$(am__dirstamp) @rm -f examples/features/concurrency/simple/comdegree$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_concurrency_simple_comdegree_OBJECTS) $(examples_features_concurrency_simple_comdegree_LDADD) $(LIBS) examples/features/gpc/hashtable/$(am__dirstamp): @$(MKDIR_P) examples/features/gpc/hashtable @: > examples/features/gpc/hashtable/$(am__dirstamp) examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/gpc/hashtable/$(DEPDIR) @: > examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/DistHashmap.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/GPCHashmap.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/GPCHashmapHandler.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/HashFunctions.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/HashUtil.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/test_hashtable.$(OBJEXT): \ examples/features/gpc/hashtable/$(am__dirstamp) \ examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) examples/features/gpc/hashtable/test_hashtable$(EXEEXT): $(examples_features_gpc_hashtable_test_hashtable_OBJECTS) $(examples_features_gpc_hashtable_test_hashtable_DEPENDENCIES) $(EXTRA_examples_features_gpc_hashtable_test_hashtable_DEPENDENCIES) examples/features/gpc/hashtable/$(am__dirstamp) @rm -f examples/features/gpc/hashtable/test_hashtable$(EXEEXT) $(AM_V_CXXLD)$(examples_features_gpc_hashtable_test_hashtable_LINK) $(examples_features_gpc_hashtable_test_hashtable_OBJECTS) $(examples_features_gpc_hashtable_test_hashtable_LDADD) $(LIBS) examples/features/non-blocking/overlap/$(am__dirstamp): @$(MKDIR_P) examples/features/non-blocking/overlap @: > examples/features/non-blocking/overlap/$(am__dirstamp) examples/features/non-blocking/overlap/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/non-blocking/overlap/$(DEPDIR) @: > examples/features/non-blocking/overlap/$(DEPDIR)/$(am__dirstamp) examples/features/non-blocking/overlap/overlap.$(OBJEXT): \ examples/features/non-blocking/overlap/$(am__dirstamp) \ examples/features/non-blocking/overlap/$(DEPDIR)/$(am__dirstamp) examples/features/non-blocking/overlap/overlap$(EXEEXT): $(examples_features_non_blocking_overlap_overlap_OBJECTS) $(examples_features_non_blocking_overlap_overlap_DEPENDENCIES) $(EXTRA_examples_features_non_blocking_overlap_overlap_DEPENDENCIES) examples/features/non-blocking/overlap/$(am__dirstamp) @rm -f examples/features/non-blocking/overlap/overlap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_non_blocking_overlap_overlap_OBJECTS) $(examples_features_non_blocking_overlap_overlap_LDADD) $(LIBS) examples/features/non-blocking/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/non-blocking/simple @: > examples/features/non-blocking/simple/$(am__dirstamp) examples/features/non-blocking/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/non-blocking/simple/$(DEPDIR) @: > examples/features/non-blocking/simple/$(DEPDIR)/$(am__dirstamp) examples/features/non-blocking/simple/simple.$(OBJEXT): \ examples/features/non-blocking/simple/$(am__dirstamp) \ examples/features/non-blocking/simple/$(DEPDIR)/$(am__dirstamp) examples/features/non-blocking/simple/simple$(EXEEXT): $(examples_features_non_blocking_simple_simple_OBJECTS) $(examples_features_non_blocking_simple_simple_DEPENDENCIES) $(EXTRA_examples_features_non_blocking_simple_simple_DEPENDENCIES) examples/features/non-blocking/simple/$(am__dirstamp) @rm -f examples/features/non-blocking/simple/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_non_blocking_simple_simple_OBJECTS) $(examples_features_non_blocking_simple_simple_LDADD) $(LIBS) examples/features/notification/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/notification/simple @: > examples/features/notification/simple/$(am__dirstamp) examples/features/notification/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/notification/simple/$(DEPDIR) @: > examples/features/notification/simple/$(DEPDIR)/$(am__dirstamp) examples/features/notification/simple/testnotify.$(OBJEXT): \ examples/features/notification/simple/$(am__dirstamp) \ examples/features/notification/simple/$(DEPDIR)/$(am__dirstamp) examples/features/notification/simple/testnotify$(EXEEXT): $(examples_features_notification_simple_testnotify_OBJECTS) $(examples_features_notification_simple_testnotify_DEPENDENCIES) $(EXTRA_examples_features_notification_simple_testnotify_DEPENDENCIES) examples/features/notification/simple/$(am__dirstamp) @rm -f examples/features/notification/simple/testnotify$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_notification_simple_testnotify_OBJECTS) $(examples_features_notification_simple_testnotify_LDADD) $(LIBS) examples/features/proc_affinity/computation_impact/$(am__dirstamp): @$(MKDIR_P) examples/features/proc_affinity/computation_impact @: > examples/features/proc_affinity/computation_impact/$(am__dirstamp) examples/features/proc_affinity/computation_impact/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/proc_affinity/computation_impact/$(DEPDIR) @: > examples/features/proc_affinity/computation_impact/$(DEPDIR)/$(am__dirstamp) examples/features/proc_affinity/computation_impact/computation_impact.$(OBJEXT): examples/features/proc_affinity/computation_impact/$(am__dirstamp) \ examples/features/proc_affinity/computation_impact/$(DEPDIR)/$(am__dirstamp) examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT): $(examples_features_proc_affinity_computation_impact_computation_impact_OBJECTS) $(examples_features_proc_affinity_computation_impact_computation_impact_DEPENDENCIES) $(EXTRA_examples_features_proc_affinity_computation_impact_computation_impact_DEPENDENCIES) examples/features/proc_affinity/computation_impact/$(am__dirstamp) @rm -f examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT) $(AM_V_CCLD)$(examples_features_proc_affinity_computation_impact_computation_impact_LINK) $(examples_features_proc_affinity_computation_impact_computation_impact_OBJECTS) $(examples_features_proc_affinity_computation_impact_computation_impact_LDADD) $(LIBS) examples/features/proc_affinity/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/proc_affinity/simple @: > examples/features/proc_affinity/simple/$(am__dirstamp) examples/features/proc_affinity/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/proc_affinity/simple/$(DEPDIR) @: > examples/features/proc_affinity/simple/$(DEPDIR)/$(am__dirstamp) examples/features/proc_affinity/simple/simple.$(OBJEXT): \ examples/features/proc_affinity/simple/$(am__dirstamp) \ examples/features/proc_affinity/simple/$(DEPDIR)/$(am__dirstamp) examples/features/proc_affinity/simple/simple$(EXEEXT): $(examples_features_proc_affinity_simple_simple_OBJECTS) $(examples_features_proc_affinity_simple_simple_DEPENDENCIES) $(EXTRA_examples_features_proc_affinity_simple_simple_DEPENDENCIES) examples/features/proc_affinity/simple/$(am__dirstamp) @rm -f examples/features/proc_affinity/simple/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_proc_affinity_simple_simple_OBJECTS) $(examples_features_proc_affinity_simple_simple_LDADD) $(LIBS) examples/features/symmetric_memory/simple/$(am__dirstamp): @$(MKDIR_P) examples/features/symmetric_memory/simple @: > examples/features/symmetric_memory/simple/$(am__dirstamp) examples/features/symmetric_memory/simple/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/features/symmetric_memory/simple/$(DEPDIR) @: > examples/features/symmetric_memory/simple/$(DEPDIR)/$(am__dirstamp) examples/features/symmetric_memory/simple/simple.$(OBJEXT): \ examples/features/symmetric_memory/simple/$(am__dirstamp) \ examples/features/symmetric_memory/simple/$(DEPDIR)/$(am__dirstamp) examples/features/symmetric_memory/simple/simple$(EXEEXT): $(examples_features_symmetric_memory_simple_simple_OBJECTS) $(examples_features_symmetric_memory_simple_simple_DEPENDENCIES) $(EXTRA_examples_features_symmetric_memory_simple_simple_DEPENDENCIES) examples/features/symmetric_memory/simple/$(am__dirstamp) @rm -f examples/features/symmetric_memory/simple/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_features_symmetric_memory_simple_simple_OBJECTS) $(examples_features_symmetric_memory_simple_simple_LDADD) $(LIBS) examples/simpleApps/$(am__dirstamp): @$(MKDIR_P) examples/simpleApps @: > examples/simpleApps/$(am__dirstamp) examples/simpleApps/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/simpleApps/$(DEPDIR) @: > examples/simpleApps/$(DEPDIR)/$(am__dirstamp) examples/simpleApps/transp1D-c.$(OBJEXT): \ examples/simpleApps/$(am__dirstamp) \ examples/simpleApps/$(DEPDIR)/$(am__dirstamp) examples/simpleApps/transp1D-c$(EXEEXT): $(examples_simpleApps_transp1D_c_OBJECTS) $(examples_simpleApps_transp1D_c_DEPENDENCIES) $(EXTRA_examples_simpleApps_transp1D_c_DEPENDENCIES) examples/simpleApps/$(am__dirstamp) @rm -f examples/simpleApps/transp1D-c$(EXEEXT) $(AM_V_CCLD)$(LINK) $(examples_simpleApps_transp1D_c_OBJECTS) $(examples_simpleApps_transp1D_c_LDADD) $(LIBS) tcgmsg/ipcv4.0/parallel.$(OBJEXT): tcgmsg/ipcv4.0/$(am__dirstamp) \ tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) parallel$(EXEEXT): $(parallel_OBJECTS) $(parallel_DEPENDENCIES) $(EXTRA_parallel_DEPENDENCIES) @rm -f parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_OBJECTS) $(parallel_LDADD) $(LIBS) testing/clone.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/clone$(EXEEXT): $(testing_clone_OBJECTS) $(testing_clone_DEPENDENCIES) $(EXTRA_testing_clone_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/clone$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_clone_OBJECTS) $(testing_clone_LDADD) $(LIBS) testing/fork.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/fork$(EXEEXT): $(testing_fork_OBJECTS) $(testing_fork_DEPENDENCIES) $(EXTRA_testing_fork_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/fork$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_fork_OBJECTS) $(testing_fork_LDADD) $(LIBS) testing/fttest.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/fttest$(EXEEXT): $(testing_fttest_OBJECTS) $(testing_fttest_DEPENDENCIES) $(EXTRA_testing_fttest_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/fttest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_fttest_OBJECTS) $(testing_fttest_LDADD) $(LIBS) testing/gpctest.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/gpctest$(EXEEXT): $(testing_gpctest_OBJECTS) $(testing_gpctest_DEPENDENCIES) $(EXTRA_testing_gpctest_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/gpctest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_gpctest_OBJECTS) $(testing_gpctest_LDADD) $(LIBS) testing/ipctest.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/ipctest$(EXEEXT): $(testing_ipctest_OBJECTS) $(testing_ipctest_DEPENDENCIES) $(EXTRA_testing_ipctest_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/ipctest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_ipctest_OBJECTS) $(testing_ipctest_LDADD) $(LIBS) testing/msgcheck.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/msgcheck$(EXEEXT): $(testing_msgcheck_OBJECTS) $(testing_msgcheck_DEPENDENCIES) $(EXTRA_testing_msgcheck_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/msgcheck$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_msgcheck_OBJECTS) $(testing_msgcheck_LDADD) $(LIBS) testing/origptl.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/origptl$(EXEEXT): $(testing_origptl_OBJECTS) $(testing_origptl_DEPENDENCIES) $(EXTRA_testing_origptl_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/origptl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_origptl_OBJECTS) $(testing_origptl_LDADD) $(LIBS) testing/perf.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/perf$(EXEEXT): $(testing_perf_OBJECTS) $(testing_perf_DEPENDENCIES) $(EXTRA_testing_perf_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/perf$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_perf_OBJECTS) $(testing_perf_LDADD) $(LIBS) testing/perf2.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/perf2$(EXEEXT): $(testing_perf2_OBJECTS) $(testing_perf2_DEPENDENCIES) $(EXTRA_testing_perf2_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/perf2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_perf2_OBJECTS) $(testing_perf2_LDADD) $(LIBS) testing/perf_aggr.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/perf_aggr$(EXEEXT): $(testing_perf_aggr_OBJECTS) $(testing_perf_aggr_DEPENDENCIES) $(EXTRA_testing_perf_aggr_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/perf_aggr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_perf_aggr_OBJECTS) $(testing_perf_aggr_LDADD) $(LIBS) testing/perf_nb.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/perf_nb$(EXEEXT): $(testing_perf_nb_OBJECTS) $(testing_perf_nb_DEPENDENCIES) $(EXTRA_testing_perf_nb_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/perf_nb$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_perf_nb_OBJECTS) $(testing_perf_nb_LDADD) $(LIBS) testing/perf_strided.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/perf_strided$(EXEEXT): $(testing_perf_strided_OBJECTS) $(testing_perf_strided_DEPENDENCIES) $(EXTRA_testing_perf_strided_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/perf_strided$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_perf_strided_OBJECTS) $(testing_perf_strided_LDADD) $(LIBS) testing/ptltest.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/ptltest$(EXEEXT): $(testing_ptltest_OBJECTS) $(testing_ptltest_DEPENDENCIES) $(EXTRA_testing_ptltest_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/ptltest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_ptltest_OBJECTS) $(testing_ptltest_LDADD) $(LIBS) testing/shmclean.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/shmclean$(EXEEXT): $(testing_shmclean_OBJECTS) $(testing_shmclean_DEPENDENCIES) $(EXTRA_testing_shmclean_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/shmclean$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_shmclean_OBJECTS) $(testing_shmclean_LDADD) $(LIBS) testing/shmtest.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/shmtest$(EXEEXT): $(testing_shmtest_OBJECTS) $(testing_shmtest_DEPENDENCIES) $(EXTRA_testing_shmtest_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/shmtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_shmtest_OBJECTS) $(testing_shmtest_LDADD) $(LIBS) testing/simple.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/simple$(EXEEXT): $(testing_simple_OBJECTS) $(testing_simple_DEPENDENCIES) $(EXTRA_testing_simple_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/simple$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_simple_OBJECTS) $(testing_simple_LDADD) $(LIBS) testing/simplelock.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/simplelock$(EXEEXT): $(testing_simplelock_OBJECTS) $(testing_simplelock_DEPENDENCIES) $(EXTRA_testing_simplelock_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/simplelock$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_simplelock_OBJECTS) $(testing_simplelock_LDADD) $(LIBS) testing/te.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/te$(EXEEXT): $(testing_te_OBJECTS) $(testing_te_DEPENDENCIES) $(EXTRA_testing_te_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/te$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_te_OBJECTS) $(testing_te_LDADD) $(LIBS) testing/test.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/test$(EXEEXT): $(testing_test_OBJECTS) $(testing_test_DEPENDENCIES) $(EXTRA_testing_test_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_test_OBJECTS) $(testing_test_LDADD) $(LIBS) testing/test2.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/test2$(EXEEXT): $(testing_test2_OBJECTS) $(testing_test2_DEPENDENCIES) $(EXTRA_testing_test2_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/test2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_test2_OBJECTS) $(testing_test2_LDADD) $(LIBS) testing/test_groups.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/test_groups$(EXEEXT): $(testing_test_groups_OBJECTS) $(testing_test_groups_DEPENDENCIES) $(EXTRA_testing_test_groups_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/test_groups$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_test_groups_OBJECTS) $(testing_test_groups_LDADD) $(LIBS) testing/test_mt.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/test_mt$(EXEEXT): $(testing_test_mt_OBJECTS) $(testing_test_mt_DEPENDENCIES) $(EXTRA_testing_test_mt_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/test_mt$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_test_mt_OBJECTS) $(testing_test_mt_LDADD) $(LIBS) testing/testing_testitr-testitr.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/testing_testitr-rpl_armci_msg_init.$(OBJEXT): \ testing/$(am__dirstamp) testing/$(DEPDIR)/$(am__dirstamp) testing/testing_testitr-rpl_armci_msg_finalize.$(OBJEXT): \ testing/$(am__dirstamp) testing/$(DEPDIR)/$(am__dirstamp) testing/testitr$(EXEEXT): $(testing_testitr_OBJECTS) $(testing_testitr_DEPENDENCIES) $(EXTRA_testing_testitr_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/testitr$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_testitr_OBJECTS) $(testing_testitr_LDADD) $(LIBS) testing/testnotify.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) testing/testnotify$(EXEEXT): $(testing_testnotify_OBJECTS) $(testing_testnotify_DEPENDENCIES) $(EXTRA_testing_testnotify_DEPENDENCIES) testing/$(am__dirstamp) @rm -f testing/testnotify$(EXEEXT) $(AM_V_CCLD)$(LINK) $(testing_testnotify_OBJECTS) $(testing_testnotify_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f examples/benchmarks/RandomAccess/simple/simple.$(OBJEXT) -rm -f examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.$(OBJEXT) -rm -f examples/benchmarks/RandomAccess/timing.$(OBJEXT) -rm -f examples/benchmarks/cg/armci_sharedmemory/cg.$(OBJEXT) -rm -f examples/benchmarks/cg/armci_sharedmemory/compute.$(OBJEXT) -rm -f examples/benchmarks/cg/armci_sharedmemory/read_input.$(OBJEXT) -rm -f examples/benchmarks/cg/armci_sharedmemory/timing.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_blocking/lu-b-bc.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_blocking/lu-block.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_blocking/lu.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_blocking/timing.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_multithreaded/lu-block-th.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_multithreaded/timing.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_nonblocking/lu_nb_get.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_nonblocking/lu_nb_put.$(OBJEXT) -rm -f examples/benchmarks/lu/armci_nonblocking/timing.$(OBJEXT) -rm -f examples/benchmarks/lu/pthreads/barrier.$(OBJEXT) -rm -f examples/benchmarks/lu/pthreads/lu-thread.$(OBJEXT) -rm -f examples/benchmarks/lu/pthreads/timing.$(OBJEXT) -rm -f examples/features/aggregation/simple/simple.$(OBJEXT) -rm -f examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.$(OBJEXT) -rm -f examples/features/concurrency/multidma/multidma.$(OBJEXT) -rm -f examples/features/concurrency/simple/comdegree.$(OBJEXT) -rm -f examples/features/gpc/hashtable/DistHashmap.$(OBJEXT) -rm -f examples/features/gpc/hashtable/GPCHashmap.$(OBJEXT) -rm -f examples/features/gpc/hashtable/GPCHashmapHandler.$(OBJEXT) -rm -f examples/features/gpc/hashtable/HashFunctions.$(OBJEXT) -rm -f examples/features/gpc/hashtable/HashUtil.$(OBJEXT) -rm -f examples/features/gpc/hashtable/test_hashtable.$(OBJEXT) -rm -f examples/features/non-blocking/overlap/overlap.$(OBJEXT) -rm -f examples/features/non-blocking/simple/simple.$(OBJEXT) -rm -f examples/features/notification/simple/testnotify.$(OBJEXT) -rm -f examples/features/proc_affinity/computation_impact/computation_impact.$(OBJEXT) -rm -f examples/features/proc_affinity/simple/simple.$(OBJEXT) -rm -f examples/features/symmetric_memory/simple/simple.$(OBJEXT) -rm -f examples/simpleApps/transp1D-c.$(OBJEXT) -rm -f src-gemini/aggregate.$(OBJEXT) -rm -f src-gemini/aggregate.lo -rm -f src-gemini/armci-onesided.$(OBJEXT) -rm -f src-gemini/armci-onesided.lo -rm -f src-gemini/armci.$(OBJEXT) -rm -f src-gemini/armci.lo -rm -f src-gemini/buffers.$(OBJEXT) -rm -f src-gemini/buffers.lo -rm -f src-gemini/caccumulate.$(OBJEXT) -rm -f src-gemini/caccumulate.lo -rm -f src-gemini/ccopy.$(OBJEXT) -rm -f src-gemini/ccopy.lo -rm -f src-gemini/clusterinfo.$(OBJEXT) -rm -f src-gemini/clusterinfo.lo -rm -f src-gemini/ds-shared.$(OBJEXT) -rm -f src-gemini/ds-shared.lo -rm -f src-gemini/fence.$(OBJEXT) -rm -f src-gemini/fence.lo -rm -f src-gemini/gpc.$(OBJEXT) -rm -f src-gemini/gpc.lo -rm -f src-gemini/groups.$(OBJEXT) -rm -f src-gemini/groups.lo -rm -f src-gemini/kr_malloc.$(OBJEXT) -rm -f src-gemini/kr_malloc.lo -rm -f src-gemini/locks.$(OBJEXT) -rm -f src-gemini/locks.lo -rm -f src-gemini/memlock.$(OBJEXT) -rm -f src-gemini/memlock.lo -rm -f src-gemini/memory.$(OBJEXT) -rm -f src-gemini/memory.lo -rm -f src-gemini/message.$(OBJEXT) -rm -f src-gemini/message.lo -rm -f src-gemini/mutex.$(OBJEXT) -rm -f src-gemini/mutex.lo -rm -f src-gemini/pack.$(OBJEXT) -rm -f src-gemini/pack.lo -rm -f src-gemini/request.$(OBJEXT) -rm -f src-gemini/request.lo -rm -f src-gemini/rmw.$(OBJEXT) -rm -f src-gemini/rmw.lo -rm -f src-gemini/rtinfo.$(OBJEXT) -rm -f src-gemini/rtinfo.lo -rm -f src-gemini/semaphores.$(OBJEXT) -rm -f src-gemini/semaphores.lo -rm -f src-gemini/shmem.$(OBJEXT) -rm -f src-gemini/shmem.lo -rm -f src-gemini/shmlimit.$(OBJEXT) -rm -f src-gemini/shmlimit.lo -rm -f src-gemini/signaltrap.$(OBJEXT) -rm -f src-gemini/signaltrap.lo -rm -f src-gemini/spawn.$(OBJEXT) -rm -f src-gemini/spawn.lo -rm -f src-gemini/strided.$(OBJEXT) -rm -f src-gemini/strided.lo -rm -f src-gemini/threads.$(OBJEXT) -rm -f src-gemini/threads.lo -rm -f src-gemini/utils.$(OBJEXT) -rm -f src-gemini/utils.lo -rm -f src-gemini/vector.$(OBJEXT) -rm -f src-gemini/vector.lo -rm -f src-portals/aggregate.$(OBJEXT) -rm -f src-portals/aggregate.lo -rm -f src-portals/armci.$(OBJEXT) -rm -f src-portals/armci.lo -rm -f src-portals/armci_portals.$(OBJEXT) -rm -f src-portals/armci_portals.lo -rm -f src-portals/buffers.$(OBJEXT) -rm -f src-portals/buffers.lo -rm -f src-portals/caccumulate.$(OBJEXT) -rm -f src-portals/caccumulate.lo -rm -f src-portals/ccopy.$(OBJEXT) -rm -f src-portals/ccopy.lo -rm -f src-portals/clusterinfo.$(OBJEXT) -rm -f src-portals/clusterinfo.lo -rm -f src-portals/ds-shared.$(OBJEXT) -rm -f src-portals/ds-shared.lo -rm -f src-portals/fence.$(OBJEXT) -rm -f src-portals/fence.lo -rm -f src-portals/gpc.$(OBJEXT) -rm -f src-portals/gpc.lo -rm -f src-portals/groups.$(OBJEXT) -rm -f src-portals/groups.lo -rm -f src-portals/kr_malloc.$(OBJEXT) -rm -f src-portals/kr_malloc.lo -rm -f src-portals/locks.$(OBJEXT) -rm -f src-portals/locks.lo -rm -f src-portals/memlock.$(OBJEXT) -rm -f src-portals/memlock.lo -rm -f src-portals/memory.$(OBJEXT) -rm -f src-portals/memory.lo -rm -f src-portals/message.$(OBJEXT) -rm -f src-portals/message.lo -rm -f src-portals/mutex.$(OBJEXT) -rm -f src-portals/mutex.lo -rm -f src-portals/new_memory.$(OBJEXT) -rm -f src-portals/new_memory.lo -rm -f src-portals/pack.$(OBJEXT) -rm -f src-portals/pack.lo -rm -f src-portals/portals.$(OBJEXT) -rm -f src-portals/portals.lo -rm -f src-portals/portals_cp.$(OBJEXT) -rm -f src-portals/portals_cp.lo -rm -f src-portals/portals_ds.$(OBJEXT) -rm -f src-portals/portals_ds.lo -rm -f src-portals/request.$(OBJEXT) -rm -f src-portals/request.lo -rm -f src-portals/rmw.$(OBJEXT) -rm -f src-portals/rmw.lo -rm -f src-portals/rtinfo.$(OBJEXT) -rm -f src-portals/rtinfo.lo -rm -f src-portals/semaphores.$(OBJEXT) -rm -f src-portals/semaphores.lo -rm -f src-portals/shmem.$(OBJEXT) -rm -f src-portals/shmem.lo -rm -f src-portals/shmlimit.$(OBJEXT) -rm -f src-portals/shmlimit.lo -rm -f src-portals/signaltrap.$(OBJEXT) -rm -f src-portals/signaltrap.lo -rm -f src-portals/spawn.$(OBJEXT) -rm -f src-portals/spawn.lo -rm -f src-portals/strided.$(OBJEXT) -rm -f src-portals/strided.lo -rm -f src-portals/threads.$(OBJEXT) -rm -f src-portals/threads.lo -rm -f src-portals/utils.$(OBJEXT) -rm -f src-portals/utils.lo -rm -f src-portals/vector.$(OBJEXT) -rm -f src-portals/vector.lo -rm -f src/collectives/message.$(OBJEXT) -rm -f src/collectives/message.lo -rm -f src/common/aggregate.$(OBJEXT) -rm -f src/common/aggregate.lo -rm -f src/common/armci.$(OBJEXT) -rm -f src/common/armci.lo -rm -f src/common/async.$(OBJEXT) -rm -f src/common/async.lo -rm -f src/common/capi.$(OBJEXT) -rm -f src/common/capi.lo -rm -f src/common/ccopy.$(OBJEXT) -rm -f src/common/ccopy.lo -rm -f src/common/clusterinfo.$(OBJEXT) -rm -f src/common/clusterinfo.lo -rm -f src/common/ds-shared.$(OBJEXT) -rm -f src/common/ds-shared.lo -rm -f src/common/gpc.$(OBJEXT) -rm -f src/common/gpc.lo -rm -f src/common/groups.$(OBJEXT) -rm -f src/common/groups.lo -rm -f src/common/iterator.$(OBJEXT) -rm -f src/common/iterator.lo -rm -f src/common/noncont.$(OBJEXT) -rm -f src/common/noncont.lo -rm -f src/common/pack.$(OBJEXT) -rm -f src/common/pack.lo -rm -f src/common/regions.$(OBJEXT) -rm -f src/common/regions.lo -rm -f src/common/request.$(OBJEXT) -rm -f src/common/request.lo -rm -f src/common/signaltrap.$(OBJEXT) -rm -f src/common/signaltrap.lo -rm -f src/common/spawn.$(OBJEXT) -rm -f src/common/spawn.lo -rm -f src/common/utils.$(OBJEXT) -rm -f src/common/utils.lo -rm -f src/devices/bgml/bgml.$(OBJEXT) -rm -f src/devices/bgml/bgml.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_acc.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_acc.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_fence.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_fence.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_get.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_get.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_impl.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_impl.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_lock.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_lock.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_put.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_put.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_rmw.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_rmw.lo -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_wait.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.2.0/armcix_wait.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_acc.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_acc.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_fence.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_fence.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_get.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_get.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_impl.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_impl.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_lock.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_lock.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_put.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_put.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_rmw.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_rmw.lo -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_wait.$(OBJEXT) -rm -f src/devices/dcmf/dcmf-0.3.0/armcix_wait.lo -rm -f src/devices/dcmf/dcmf2/armcix_acc.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_acc.lo -rm -f src/devices/dcmf/dcmf2/armcix_fence.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_fence.lo -rm -f src/devices/dcmf/dcmf2/armcix_get.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_get.lo -rm -f src/devices/dcmf/dcmf2/armcix_impl.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_impl.lo -rm -f src/devices/dcmf/dcmf2/armcix_lock.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_lock.lo -rm -f src/devices/dcmf/dcmf2/armcix_put.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_put.lo -rm -f src/devices/dcmf/dcmf2/armcix_rmw.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_rmw.lo -rm -f src/devices/dcmf/dcmf2/armcix_wait.$(OBJEXT) -rm -f src/devices/dcmf/dcmf2/armcix_wait.lo -rm -f src/devices/lapi/lapi.$(OBJEXT) -rm -f src/devices/lapi/lapi.lo -rm -f src/devices/mpi-mt/mpi2_client.$(OBJEXT) -rm -f src/devices/mpi-mt/mpi2_client.lo -rm -f src/devices/mpi-mt/mpi2_server.$(OBJEXT) -rm -f src/devices/mpi-mt/mpi2_server.lo -rm -f src/devices/mpi-spawn/mpi2_client.$(OBJEXT) -rm -f src/devices/mpi-spawn/mpi2_client.lo -rm -f src/devices/mpi-spawn/mpi2_server.$(OBJEXT) -rm -f src/devices/mpi-spawn/mpi2_server.lo -rm -f src/devices/openib/cbuf.$(OBJEXT) -rm -f src/devices/openib/cbuf.lo -rm -f src/devices/openib/openib.$(OBJEXT) -rm -f src/devices/openib/openib.lo -rm -f src/devices/openib/pendbufs.$(OBJEXT) -rm -f src/devices/openib/pendbufs.lo -rm -f src/devices/openib/rtinfo.$(OBJEXT) -rm -f src/devices/openib/rtinfo.lo -rm -f src/devices/sockets/dataserv.$(OBJEXT) -rm -f src/devices/sockets/dataserv.lo -rm -f src/devices/sockets/sockets.$(OBJEXT) -rm -f src/devices/sockets/sockets.lo -rm -f src/ft/armci_chkpt.$(OBJEXT) -rm -f src/ft/armci_chkpt.lo -rm -f src/ft/armci_storage.$(OBJEXT) -rm -f src/ft/armci_storage.lo -rm -f src/locks/locks.$(OBJEXT) -rm -f src/locks/locks.lo -rm -f src/locks/memlock.$(OBJEXT) -rm -f src/locks/memlock.lo -rm -f src/locks/mutex.$(OBJEXT) -rm -f src/locks/mutex.lo -rm -f src/locks/semaphores.$(OBJEXT) -rm -f src/locks/semaphores.lo -rm -f src/locks/tas-sx.$(OBJEXT) -rm -f src/locks/tas-sx.lo -rm -f src/memory/buffers.$(OBJEXT) -rm -f src/memory/buffers.lo -rm -f src/memory/kr_malloc.$(OBJEXT) -rm -f src/memory/kr_malloc.lo -rm -f src/memory/memory.$(OBJEXT) -rm -f src/memory/memory.lo -rm -f src/memory/shmalloc.$(OBJEXT) -rm -f src/memory/shmalloc.lo -rm -f src/memory/shmem.$(OBJEXT) -rm -f src/memory/shmem.lo -rm -f src/memory/shmlimit.$(OBJEXT) -rm -f src/memory/shmlimit.lo -rm -f src/memory/winshmem.$(OBJEXT) -rm -f src/memory/winshmem.lo -rm -f src/progress/fence.$(OBJEXT) -rm -f src/progress/fence.lo -rm -f src/progress/wait.$(OBJEXT) -rm -f src/progress/wait.lo -rm -f src/util/threads.$(OBJEXT) -rm -f src/util/threads.lo -rm -f src/xfer/caccumulate.$(OBJEXT) -rm -f src/xfer/caccumulate.lo -rm -f src/xfer/rmw.$(OBJEXT) -rm -f src/xfer/rmw.lo -rm -f src/xfer/strided.$(OBJEXT) -rm -f src/xfer/strided.lo -rm -f src/xfer/vector.$(OBJEXT) -rm -f src/xfer/vector.lo -rm -f tcgmsg/ipcv4.0/brdcst.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/brdcst.lo -rm -f tcgmsg/ipcv4.0/checkbyte.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/checkbyte.lo -rm -f tcgmsg/ipcv4.0/cluster.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/cluster.lo -rm -f tcgmsg/ipcv4.0/drand48.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/drand48.lo -rm -f tcgmsg/ipcv4.0/error.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/error.lo -rm -f tcgmsg/ipcv4.0/evlog.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/evlog.lo -rm -f tcgmsg/ipcv4.0/evon.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/evon.lo -rm -f tcgmsg/ipcv4.0/globalop.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/globalop.lo -rm -f tcgmsg/ipcv4.0/llog.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/llog.lo -rm -f tcgmsg/ipcv4.0/mdtob.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/mdtob.lo -rm -f tcgmsg/ipcv4.0/mdtoi.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/mdtoi.lo -rm -f tcgmsg/ipcv4.0/mitob.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/mitob.lo -rm -f tcgmsg/ipcv4.0/mitod.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/mitod.lo -rm -f tcgmsg/ipcv4.0/mtime.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/mtime.lo -rm -f tcgmsg/ipcv4.0/niceftn.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/niceftn.lo -rm -f tcgmsg/ipcv4.0/nnodes.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/nnodes.lo -rm -f tcgmsg/ipcv4.0/nodeid.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/nodeid.lo -rm -f tcgmsg/ipcv4.0/nxtval.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/nxtval.lo -rm -f tcgmsg/ipcv4.0/parallel.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/pbegin.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/pbegin.lo -rm -f tcgmsg/ipcv4.0/pbeginf.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/pbeginf.lo -rm -f tcgmsg/ipcv4.0/pfilecopy.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/pfilecopy.lo -rm -f tcgmsg/ipcv4.0/sema.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/sema.lo -rm -f tcgmsg/ipcv4.0/setdbg.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/setdbg.lo -rm -f tcgmsg/ipcv4.0/shmem.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/shmem.lo -rm -f tcgmsg/ipcv4.0/signals.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/signals.lo -rm -f tcgmsg/ipcv4.0/snd.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/snd.lo -rm -f tcgmsg/ipcv4.0/sockets.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/sockets.lo -rm -f tcgmsg/ipcv4.0/srmover.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/srmover.lo -rm -f tcgmsg/ipcv4.0/stats.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/stats.lo -rm -f tcgmsg/ipcv4.0/synch.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/synch.lo -rm -f tcgmsg/ipcv4.0/usleep.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/usleep.lo -rm -f tcgmsg/ipcv4.0/waitall.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/waitall.lo -rm -f tcgmsg/ipcv4.0/waitcom.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/waitcom.lo -rm -f tcgmsg/ipcv4.0/xdrstuff.$(OBJEXT) -rm -f tcgmsg/ipcv4.0/xdrstuff.lo -rm -f tcgmsg/ipcv5.0/async_send.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/async_send.lo -rm -f tcgmsg/ipcv5.0/async_send_lapi.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/async_send_lapi.lo -rm -f tcgmsg/ipcv5.0/busy.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/busy.lo -rm -f tcgmsg/ipcv5.0/drand48.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/drand48.lo -rm -f tcgmsg/ipcv5.0/error.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/error.lo -rm -f tcgmsg/ipcv5.0/globalop.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/globalop.lo -rm -f tcgmsg/ipcv5.0/lapi_putget.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/lapi_putget.lo -rm -f tcgmsg/ipcv5.0/llog.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/llog.lo -rm -f tcgmsg/ipcv5.0/mdtob.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/mdtob.lo -rm -f tcgmsg/ipcv5.0/mdtoi.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/mdtoi.lo -rm -f tcgmsg/ipcv5.0/misc.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/misc.lo -rm -f tcgmsg/ipcv5.0/mitob.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/mitob.lo -rm -f tcgmsg/ipcv5.0/mitod.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/mitod.lo -rm -f tcgmsg/ipcv5.0/mtime.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/mtime.lo -rm -f tcgmsg/ipcv5.0/niceftn.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/niceftn.lo -rm -f tcgmsg/ipcv5.0/nnodes.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/nnodes.lo -rm -f tcgmsg/ipcv5.0/nodeid.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/nodeid.lo -rm -f tcgmsg/ipcv5.0/nxtval.shm.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/nxtval.shm.lo -rm -f tcgmsg/ipcv5.0/pbegin.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/pbegin.lo -rm -f tcgmsg/ipcv5.0/pbeginf.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/pbeginf.lo -rm -f tcgmsg/ipcv5.0/pfilecopy.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/pfilecopy.lo -rm -f tcgmsg/ipcv5.0/queues.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/queues.lo -rm -f tcgmsg/ipcv5.0/shmem.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/shmem.lo -rm -f tcgmsg/ipcv5.0/signals.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/signals.lo -rm -f tcgmsg/ipcv5.0/snd_rcv_probe.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/snd_rcv_probe.lo -rm -f tcgmsg/ipcv5.0/synch.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/synch.lo -rm -f tcgmsg/ipcv5.0/usleep.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/usleep.lo -rm -f tcgmsg/ipcv5.0/waitall.$(OBJEXT) -rm -f tcgmsg/ipcv5.0/waitall.lo -rm -f testing/clone.$(OBJEXT) -rm -f testing/fork.$(OBJEXT) -rm -f testing/fttest.$(OBJEXT) -rm -f testing/gpctest.$(OBJEXT) -rm -f testing/ipctest.$(OBJEXT) -rm -f testing/msgcheck.$(OBJEXT) -rm -f testing/origptl.$(OBJEXT) -rm -f testing/perf.$(OBJEXT) -rm -f testing/perf2.$(OBJEXT) -rm -f testing/perf_aggr.$(OBJEXT) -rm -f testing/perf_nb.$(OBJEXT) -rm -f testing/perf_strided.$(OBJEXT) -rm -f testing/ptltest.$(OBJEXT) -rm -f testing/rpl_armci_msg_finalize.$(OBJEXT) -rm -f testing/rpl_armci_msg_init.$(OBJEXT) -rm -f testing/shmclean.$(OBJEXT) -rm -f testing/shmtest.$(OBJEXT) -rm -f testing/simple.$(OBJEXT) -rm -f testing/simplelock.$(OBJEXT) -rm -f testing/te.$(OBJEXT) -rm -f testing/test.$(OBJEXT) -rm -f testing/test2.$(OBJEXT) -rm -f testing/test_groups.$(OBJEXT) -rm -f testing/test_mt.$(OBJEXT) -rm -f testing/testing_testitr-rpl_armci_msg_finalize.$(OBJEXT) -rm -f testing/testing_testitr-rpl_armci_msg_init.$(OBJEXT) -rm -f testing/testing_testitr-testitr.$(OBJEXT) -rm -f testing/testnotify.$(OBJEXT) -rm -f tools/armci_prof.$(OBJEXT) -rm -f tools/armci_prof.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/RandomAccess/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/RandomAccess/simple/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR)/smp_bucket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/cg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/compute.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/read_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_blocking/$(DEPDIR)/lu-b-bc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_blocking/$(DEPDIR)/lu-block.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_blocking/$(DEPDIR)/lu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_blocking/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/lu-block-th.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/lu_nb_get.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/lu_nb_put.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/pthreads/$(DEPDIR)/barrier.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/pthreads/$(DEPDIR)/lu-thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/benchmarks/lu/pthreads/$(DEPDIR)/timing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/aggregation/simple/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/aggregation/sparse_matvecmul/$(DEPDIR)/sparse_matvecmul.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/concurrency/multidma/$(DEPDIR)/multidma.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/concurrency/simple/$(DEPDIR)/comdegree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/DistHashmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/GPCHashmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/GPCHashmapHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/HashFunctions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/HashUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/gpc/hashtable/$(DEPDIR)/test_hashtable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/non-blocking/overlap/$(DEPDIR)/overlap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/non-blocking/simple/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/notification/simple/$(DEPDIR)/testnotify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/proc_affinity/computation_impact/$(DEPDIR)/computation_impact.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/proc_affinity/simple/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/features/symmetric_memory/simple/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/simpleApps/$(DEPDIR)/transp1D-c.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/aggregate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/armci-onesided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/armci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/buffers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/caccumulate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/ccopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/clusterinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/ds-shared.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/gpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/groups.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/kr_malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/locks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/memlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/memory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/pack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/rtinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/semaphores.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/shmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/shmlimit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/signaltrap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/spawn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/strided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/threads.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-gemini/$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/aggregate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/armci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/armci_portals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/buffers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/caccumulate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/ccopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/clusterinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/ds-shared.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/gpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/groups.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/kr_malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/locks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/memlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/memory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/new_memory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/pack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/portals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/portals_cp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/portals_ds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/rtinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/semaphores.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/shmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/shmlimit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/signaltrap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/spawn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/strided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/threads.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src-portals/$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/collectives/$(DEPDIR)/message.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/aggregate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/armci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/async.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/capi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/ccopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/clusterinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/ds-shared.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/gpc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/groups.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/iterator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/noncont.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/pack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/regions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/signaltrap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/spawn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/bgml/$(DEPDIR)/bgml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_acc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_lock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_put.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/armcix_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_acc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_lock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_put.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/armcix_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_acc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_get.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_impl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_lock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_put.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/dcmf/dcmf2/$(DEPDIR)/armcix_wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/lapi/$(DEPDIR)/lapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/mpi-mt/$(DEPDIR)/mpi2_client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/mpi-mt/$(DEPDIR)/mpi2_server.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/mpi-spawn/$(DEPDIR)/mpi2_client.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/mpi-spawn/$(DEPDIR)/mpi2_server.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/openib/$(DEPDIR)/cbuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/openib/$(DEPDIR)/openib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/openib/$(DEPDIR)/pendbufs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/openib/$(DEPDIR)/rtinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/sockets/$(DEPDIR)/dataserv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/devices/sockets/$(DEPDIR)/sockets.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ft/$(DEPDIR)/armci_chkpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ft/$(DEPDIR)/armci_storage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/locks/$(DEPDIR)/locks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/locks/$(DEPDIR)/memlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/locks/$(DEPDIR)/mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/locks/$(DEPDIR)/semaphores.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/buffers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/kr_malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/memory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/shmalloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/shmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/shmlimit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/winshmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/progress/$(DEPDIR)/fence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/progress/$(DEPDIR)/wait.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/util/$(DEPDIR)/threads.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xfer/$(DEPDIR)/caccumulate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xfer/$(DEPDIR)/rmw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xfer/$(DEPDIR)/strided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/xfer/$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/brdcst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/checkbyte.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/cluster.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/drand48.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/evlog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/evon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/globalop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/llog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/mdtob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/mdtoi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/mitob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/mitod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/mtime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/niceftn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/nnodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/nodeid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/nxtval.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/parallel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/pbegin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/pbeginf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/pfilecopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/sema.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/setdbg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/shmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/signals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/snd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/sockets.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/srmover.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/synch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/usleep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/waitall.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/waitcom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv4.0/$(DEPDIR)/xdrstuff.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/async_send.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/async_send_lapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/busy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/drand48.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/globalop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/lapi_putget.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/llog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/mdtob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/mdtoi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/mitob.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/mitod.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/mtime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/niceftn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/nnodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/nodeid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/nxtval.shm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/pbegin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/pbeginf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/pfilecopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/shmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/signals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/snd_rcv_probe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/synch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/usleep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/ipcv5.0/$(DEPDIR)/waitall.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/clone.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/fork.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/fttest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/gpctest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/ipctest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/msgcheck.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/origptl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/perf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/perf2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/perf_aggr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/perf_nb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/perf_strided.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/ptltest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/rpl_armci_msg_finalize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/rpl_armci_msg_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/shmclean.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/shmtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/simple.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/simplelock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/te.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/test2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/test_groups.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/test_mt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/testing_testitr-testitr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/testnotify.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/armci_prof.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< testing/testing_testitr-testitr.o: testing/testitr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-testitr.o -MD -MP -MF testing/$(DEPDIR)/testing_testitr-testitr.Tpo -c -o testing/testing_testitr-testitr.o `test -f 'testing/testitr.c' || echo '$(srcdir)/'`testing/testitr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-testitr.Tpo testing/$(DEPDIR)/testing_testitr-testitr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/testitr.c' object='testing/testing_testitr-testitr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-testitr.o `test -f 'testing/testitr.c' || echo '$(srcdir)/'`testing/testitr.c testing/testing_testitr-testitr.obj: testing/testitr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-testitr.obj -MD -MP -MF testing/$(DEPDIR)/testing_testitr-testitr.Tpo -c -o testing/testing_testitr-testitr.obj `if test -f 'testing/testitr.c'; then $(CYGPATH_W) 'testing/testitr.c'; else $(CYGPATH_W) '$(srcdir)/testing/testitr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-testitr.Tpo testing/$(DEPDIR)/testing_testitr-testitr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/testitr.c' object='testing/testing_testitr-testitr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-testitr.obj `if test -f 'testing/testitr.c'; then $(CYGPATH_W) 'testing/testitr.c'; else $(CYGPATH_W) '$(srcdir)/testing/testitr.c'; fi` testing/testing_testitr-rpl_armci_msg_init.o: testing/rpl_armci_msg_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-rpl_armci_msg_init.o -MD -MP -MF testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Tpo -c -o testing/testing_testitr-rpl_armci_msg_init.o `test -f 'testing/rpl_armci_msg_init.c' || echo '$(srcdir)/'`testing/rpl_armci_msg_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Tpo testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/rpl_armci_msg_init.c' object='testing/testing_testitr-rpl_armci_msg_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-rpl_armci_msg_init.o `test -f 'testing/rpl_armci_msg_init.c' || echo '$(srcdir)/'`testing/rpl_armci_msg_init.c testing/testing_testitr-rpl_armci_msg_init.obj: testing/rpl_armci_msg_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-rpl_armci_msg_init.obj -MD -MP -MF testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Tpo -c -o testing/testing_testitr-rpl_armci_msg_init.obj `if test -f 'testing/rpl_armci_msg_init.c'; then $(CYGPATH_W) 'testing/rpl_armci_msg_init.c'; else $(CYGPATH_W) '$(srcdir)/testing/rpl_armci_msg_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Tpo testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/rpl_armci_msg_init.c' object='testing/testing_testitr-rpl_armci_msg_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-rpl_armci_msg_init.obj `if test -f 'testing/rpl_armci_msg_init.c'; then $(CYGPATH_W) 'testing/rpl_armci_msg_init.c'; else $(CYGPATH_W) '$(srcdir)/testing/rpl_armci_msg_init.c'; fi` testing/testing_testitr-rpl_armci_msg_finalize.o: testing/rpl_armci_msg_finalize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-rpl_armci_msg_finalize.o -MD -MP -MF testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Tpo -c -o testing/testing_testitr-rpl_armci_msg_finalize.o `test -f 'testing/rpl_armci_msg_finalize.c' || echo '$(srcdir)/'`testing/rpl_armci_msg_finalize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Tpo testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/rpl_armci_msg_finalize.c' object='testing/testing_testitr-rpl_armci_msg_finalize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-rpl_armci_msg_finalize.o `test -f 'testing/rpl_armci_msg_finalize.c' || echo '$(srcdir)/'`testing/rpl_armci_msg_finalize.c testing/testing_testitr-rpl_armci_msg_finalize.obj: testing/rpl_armci_msg_finalize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT testing/testing_testitr-rpl_armci_msg_finalize.obj -MD -MP -MF testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Tpo -c -o testing/testing_testitr-rpl_armci_msg_finalize.obj `if test -f 'testing/rpl_armci_msg_finalize.c'; then $(CYGPATH_W) 'testing/rpl_armci_msg_finalize.c'; else $(CYGPATH_W) '$(srcdir)/testing/rpl_armci_msg_finalize.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Tpo testing/$(DEPDIR)/testing_testitr-rpl_armci_msg_finalize.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testing/rpl_armci_msg_finalize.c' object='testing/testing_testitr-rpl_armci_msg_finalize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(testing_testitr_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o testing/testing_testitr-rpl_armci_msg_finalize.obj `if test -f 'testing/rpl_armci_msg_finalize.c'; then $(CYGPATH_W) 'testing/rpl_armci_msg_finalize.c'; else $(CYGPATH_W) '$(srcdir)/testing/rpl_armci_msg_finalize.c'; fi` .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .s.o: $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ $< .s.obj: $(AM_V_CCAS)$(CCASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .s.lo: $(AM_V_CCAS)$(LTCCASCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf examples/benchmarks/RandomAccess/simple/.libs examples/benchmarks/RandomAccess/simple/_libs -rm -rf examples/benchmarks/RandomAccess/smp_bucket/.libs examples/benchmarks/RandomAccess/smp_bucket/_libs -rm -rf examples/benchmarks/cg/armci_sharedmemory/.libs examples/benchmarks/cg/armci_sharedmemory/_libs -rm -rf examples/benchmarks/lu/armci_blocking/.libs examples/benchmarks/lu/armci_blocking/_libs -rm -rf examples/benchmarks/lu/armci_multithreaded/.libs examples/benchmarks/lu/armci_multithreaded/_libs -rm -rf examples/benchmarks/lu/armci_nonblocking/.libs examples/benchmarks/lu/armci_nonblocking/_libs -rm -rf examples/benchmarks/lu/pthreads/.libs examples/benchmarks/lu/pthreads/_libs -rm -rf examples/features/aggregation/simple/.libs examples/features/aggregation/simple/_libs -rm -rf examples/features/aggregation/sparse_matvecmul/.libs examples/features/aggregation/sparse_matvecmul/_libs -rm -rf examples/features/concurrency/multidma/.libs examples/features/concurrency/multidma/_libs -rm -rf examples/features/concurrency/simple/.libs examples/features/concurrency/simple/_libs -rm -rf examples/features/gpc/hashtable/.libs examples/features/gpc/hashtable/_libs -rm -rf examples/features/non-blocking/overlap/.libs examples/features/non-blocking/overlap/_libs -rm -rf examples/features/non-blocking/simple/.libs examples/features/non-blocking/simple/_libs -rm -rf examples/features/notification/simple/.libs examples/features/notification/simple/_libs -rm -rf examples/features/proc_affinity/computation_impact/.libs examples/features/proc_affinity/computation_impact/_libs -rm -rf examples/features/proc_affinity/simple/.libs examples/features/proc_affinity/simple/_libs -rm -rf examples/features/symmetric_memory/simple/.libs examples/features/symmetric_memory/simple/_libs -rm -rf examples/simpleApps/.libs examples/simpleApps/_libs -rm -rf src-gemini/.libs src-gemini/_libs -rm -rf src-portals/.libs src-portals/_libs -rm -rf src/collectives/.libs src/collectives/_libs -rm -rf src/common/.libs src/common/_libs -rm -rf src/devices/bgml/.libs src/devices/bgml/_libs -rm -rf src/devices/dcmf/dcmf-0.2.0/.libs src/devices/dcmf/dcmf-0.2.0/_libs -rm -rf src/devices/dcmf/dcmf-0.3.0/.libs src/devices/dcmf/dcmf-0.3.0/_libs -rm -rf src/devices/dcmf/dcmf2/.libs src/devices/dcmf/dcmf2/_libs -rm -rf src/devices/lapi/.libs src/devices/lapi/_libs -rm -rf src/devices/mpi-mt/.libs src/devices/mpi-mt/_libs -rm -rf src/devices/mpi-spawn/.libs src/devices/mpi-spawn/_libs -rm -rf src/devices/openib/.libs src/devices/openib/_libs -rm -rf src/devices/sockets/.libs src/devices/sockets/_libs -rm -rf src/ft/.libs src/ft/_libs -rm -rf src/locks/.libs src/locks/_libs -rm -rf src/memory/.libs src/memory/_libs -rm -rf src/progress/.libs src/progress/_libs -rm -rf src/util/.libs src/util/_libs -rm -rf src/xfer/.libs src/xfer/_libs -rm -rf tcgmsg/ipcv4.0/.libs tcgmsg/ipcv4.0/_libs -rm -rf tcgmsg/ipcv5.0/.libs tcgmsg/ipcv5.0/_libs -rm -rf testing/.libs testing/_libs -rm -rf tools/.libs tools/_libs distclean-libtool: -rm -f libtool config.lt install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__sh_e_setup); \ list='$(TEST_LOGS)'; \ results=`for f in $$list; do \ test -r $$f && read line < $$f && echo "$$line" \ || echo FAIL; \ done`; \ all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[ ]*//'`; \ fail=`echo "$$results" | grep -c '^FAIL'`; \ pass=`echo "$$results" | grep -c '^PASS'`; \ skip=`echo "$$results" | grep -c '^SKIP'`; \ xfail=`echo "$$results" | grep -c '^XFAIL'`; \ xpass=`echo "$$results" | grep -c '^XPASS'`; \ failures=`expr $$fail + $$xpass`; \ all=`expr $$all - $$skip`; \ if test "$$all" -eq 1; then tests=test; All=; \ else tests=tests; All="All "; fi; \ case fail=$$fail:xpass=$$xpass:xfail=$$xfail in \ fail=0:xpass=0:xfail=0) \ msg="$$All$$all $$tests passed. "; \ exit=true;; \ fail=0:xpass=0:xfail=*) \ msg="$$All$$all $$tests behaved as expected"; \ if test "$$xfail" -eq 1; then xfailures=failure; \ else xfailures=failures; fi; \ msg="$$msg ($$xfail expected $$xfailures). "; \ exit=true;; \ fail=*:xpass=0:xfail=*) \ msg="$$fail of $$all $$tests failed. "; \ exit=false;; \ fail=*:xpass=*:xfail=*) \ msg="$$failures of $$all $$tests did not behave as expected"; \ if test "$$xpass" -eq 1; then xpasses=pass; \ else xpasses=passes; fi; \ msg="$$msg ($$xpass unexpected $$xpasses). "; \ exit=false;; \ *) \ echo >&2 "incorrect case"; exit 4;; \ esac; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ msg="$$msg($$skip test was not run). "; \ else \ msg="$$msg($$skip tests were not run). "; \ fi; \ fi; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ echo "$$msg"; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for f in $$list; do \ test -r $$f && read line < $$f || line=; \ case $$line in \ PASS:*|XFAIL:*);; \ *) echo; cat $$f;; \ esac; \ done; \ } >$(TEST_SUITE_LOG).tmp; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if test "$$failures" -ne 0; then \ msg="$${msg}See $(subdir)/$(TEST_SUITE_LOG). "; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ msg="$${msg}Please report to $(PACKAGE_BUGREPORT). "; \ fi; \ fi; \ test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG); \ $(am__tty_colors); \ if $$exit; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$$msg" | $(am__text_box) "col=$$col" "std=$$std"; \ $$exit || exit 1 check-TESTS recheck: @if test $@ != recheck; then \ list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list; \ fi @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @list='' list2='$(TEST_LOGS)'; for f in $$list2; do \ test .log = $$f && continue; \ if test $@ = recheck; then \ test -f $$f || continue; \ if test -r $$f && read line < $$f; then \ case $$line in FAIL*|XPASS*) : ;; *) continue;; esac; \ fi; \ fi; \ if test -z "$$list"; then list=$$f; else list="$$list $$f"; fi; \ done; \ if test $@ = recheck && test -n "$$list"; then \ $(am__make_dryrun) || rm -f $$list || exit 1; \ fi; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list" recheck: $(check_LTLIBRARIES) $(check_PROGRAMS) am--mostlyclean-test-html: list='$(TEST_LOGS:.log=.html)'; test -z "$$list" || rm -f $$list rm -f $(TEST_SUITE_HTML) .log.html: @list='$(RST2HTML) $$RST2HTML rst2html rst2html.py'; \ for r2h in $$list; do \ if ($$r2h --version) >/dev/null 2>&1; then \ R2H=$$r2h; \ fi; \ done; \ if test -z "$$R2H"; then \ echo >&2 "cannot find rst2html, cannot create $@"; \ exit 2; \ fi; \ $$R2H $< >$@.tmp @mv $@.tmp $@ # Be sure to run check first, and then to convert the result. # Beware of concurrent executions. Run "check" not "check-TESTS", as # check-SCRIPTS and other dependencies are rebuilt by the former only. # And expect check to fail. check-html recheck-html: @target=`echo $@ | sed 's/-html$$//'`; \ rv=0; $(MAKE) $(AM_MAKEFLAGS) $$target || rv=$$?; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) TEST_LOGS= || exit 4; \ exit $$rv testing/testitr.log: testing/testitr$(EXEEXT) @p='testing/testitr$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/msgcheck.log: testing/msgcheck$(EXEEXT) @p='testing/msgcheck$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/perf.log: testing/perf$(EXEEXT) @p='testing/perf$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/perf_aggr.log: testing/perf_aggr$(EXEEXT) @p='testing/perf_aggr$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/simplelock.log: testing/simplelock$(EXEEXT) @p='testing/simplelock$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/test.log: testing/test$(EXEEXT) @p='testing/test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/test2.log: testing/test2$(EXEEXT) @p='testing/test2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/testnotify.log: testing/testnotify$(EXEEXT) @p='testing/testnotify$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/fttest.log: testing/fttest$(EXEEXT) @p='testing/fttest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/gpctest.log: testing/gpctest$(EXEEXT) @p='testing/gpctest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/simple.log: testing/simple$(EXEEXT) @p='testing/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/test_groups.log: testing/test_groups$(EXEEXT) @p='testing/test_groups$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) testing/test_mt.log: testing/test_mt$(EXEEXT) @p='testing/test_mt$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_blocking/lu-b-bc.log: examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT) @p='examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_blocking/lu-block.log: examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT) @p='examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_blocking/lu.log: examples/benchmarks/lu/armci_blocking/lu$(EXEEXT) @p='examples/benchmarks/lu/armci_blocking/lu$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_nonblocking/lu_nb_get.log: examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT) @p='examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_nonblocking/lu_nb_put.log: examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT) @p='examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/pthreads/lu-thread.log: examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT) @p='examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/aggregation/simple/simple.log: examples/features/aggregation/simple/simple$(EXEEXT) @p='examples/features/aggregation/simple/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/non-blocking/simple/simple.log: examples/features/non-blocking/simple/simple$(EXEEXT) @p='examples/features/non-blocking/simple/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/concurrency/simple/comdegree.log: examples/features/concurrency/simple/comdegree$(EXEEXT) @p='examples/features/concurrency/simple/comdegree$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/notification/simple/testnotify.log: examples/features/notification/simple/testnotify$(EXEEXT) @p='examples/features/notification/simple/testnotify$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/symmetric_memory/simple/simple.log: examples/features/symmetric_memory/simple/simple$(EXEEXT) @p='examples/features/symmetric_memory/simple/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/simpleApps/transp1D-c.log: examples/simpleApps/transp1D-c$(EXEEXT) @p='examples/simpleApps/transp1D-c$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/gpc/hashtable/test_hashtable.log: examples/features/gpc/hashtable/test_hashtable$(EXEEXT) @p='examples/features/gpc/hashtable/test_hashtable$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/proc_affinity/computation_impact/computation_impact.log: examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT) @p='examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/features/proc_affinity/simple/simple.log: examples/features/proc_affinity/simple/simple$(EXEEXT) @p='examples/features/proc_affinity/simple/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/RandomAccess/simple/simple.log: examples/benchmarks/RandomAccess/simple/simple$(EXEEXT) @p='examples/benchmarks/RandomAccess/simple/simple$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.log: examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT) @p='examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) examples/benchmarks/lu/armci_multithreaded/lu-block-th.log: examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT) @p='examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) .test.log: @p='$<'; $(am__check_pre) $(TEST_LOG_COMPILE) "$$tst" $(am__check_post) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; $(am__check_pre) $(TEST_LOG_COMPILE) "$$tst" $(am__check_post) distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) config.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(LIBOBJS)" || rm -f $(LIBOBJS) -test -z "$(LTLIBOBJS)" || rm -f $(LTLIBOBJS) -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS_TMP)" || rm -f $(TEST_LOGS_TMP) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f examples/benchmarks/RandomAccess/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/RandomAccess/$(am__dirstamp) -rm -f examples/benchmarks/RandomAccess/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/RandomAccess/simple/$(am__dirstamp) -rm -f examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/RandomAccess/smp_bucket/$(am__dirstamp) -rm -f examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/cg/armci_sharedmemory/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_blocking/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_blocking/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_multithreaded/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_multithreaded/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_nonblocking/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/lu/armci_nonblocking/$(am__dirstamp) -rm -f examples/benchmarks/lu/pthreads/$(DEPDIR)/$(am__dirstamp) -rm -f examples/benchmarks/lu/pthreads/$(am__dirstamp) -rm -f examples/features/aggregation/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/aggregation/simple/$(am__dirstamp) -rm -f examples/features/aggregation/sparse_matvecmul/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/aggregation/sparse_matvecmul/$(am__dirstamp) -rm -f examples/features/concurrency/multidma/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/concurrency/multidma/$(am__dirstamp) -rm -f examples/features/concurrency/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/concurrency/simple/$(am__dirstamp) -rm -f examples/features/gpc/hashtable/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/gpc/hashtable/$(am__dirstamp) -rm -f examples/features/non-blocking/overlap/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/non-blocking/overlap/$(am__dirstamp) -rm -f examples/features/non-blocking/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/non-blocking/simple/$(am__dirstamp) -rm -f examples/features/notification/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/notification/simple/$(am__dirstamp) -rm -f examples/features/proc_affinity/computation_impact/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/proc_affinity/computation_impact/$(am__dirstamp) -rm -f examples/features/proc_affinity/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/proc_affinity/simple/$(am__dirstamp) -rm -f examples/features/symmetric_memory/simple/$(DEPDIR)/$(am__dirstamp) -rm -f examples/features/symmetric_memory/simple/$(am__dirstamp) -rm -f examples/simpleApps/$(DEPDIR)/$(am__dirstamp) -rm -f examples/simpleApps/$(am__dirstamp) -rm -f src-gemini/$(DEPDIR)/$(am__dirstamp) -rm -f src-gemini/$(am__dirstamp) -rm -f src-portals/$(DEPDIR)/$(am__dirstamp) -rm -f src-portals/$(am__dirstamp) -rm -f src/collectives/$(DEPDIR)/$(am__dirstamp) -rm -f src/collectives/$(am__dirstamp) -rm -f src/common/$(DEPDIR)/$(am__dirstamp) -rm -f src/common/$(am__dirstamp) -rm -f src/devices/bgml/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/bgml/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf-0.2.0/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf-0.2.0/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf-0.3.0/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf-0.3.0/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf2/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/dcmf/dcmf2/$(am__dirstamp) -rm -f src/devices/lapi/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/lapi/$(am__dirstamp) -rm -f src/devices/mpi-mt/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/mpi-mt/$(am__dirstamp) -rm -f src/devices/mpi-spawn/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/mpi-spawn/$(am__dirstamp) -rm -f src/devices/openib/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/openib/$(am__dirstamp) -rm -f src/devices/sockets/$(DEPDIR)/$(am__dirstamp) -rm -f src/devices/sockets/$(am__dirstamp) -rm -f src/ft/$(DEPDIR)/$(am__dirstamp) -rm -f src/ft/$(am__dirstamp) -rm -f src/locks/$(DEPDIR)/$(am__dirstamp) -rm -f src/locks/$(am__dirstamp) -rm -f src/memory/$(DEPDIR)/$(am__dirstamp) -rm -f src/memory/$(am__dirstamp) -rm -f src/progress/$(DEPDIR)/$(am__dirstamp) -rm -f src/progress/$(am__dirstamp) -rm -f src/util/$(DEPDIR)/$(am__dirstamp) -rm -f src/util/$(am__dirstamp) -rm -f src/xfer/$(DEPDIR)/$(am__dirstamp) -rm -f src/xfer/$(am__dirstamp) -rm -f tcgmsg/ipcv4.0/$(DEPDIR)/$(am__dirstamp) -rm -f tcgmsg/ipcv4.0/$(am__dirstamp) -rm -f tcgmsg/ipcv5.0/$(DEPDIR)/$(am__dirstamp) -rm -f tcgmsg/ipcv5.0/$(am__dirstamp) -rm -f testing/$(DEPDIR)/$(am__dirstamp) -rm -f testing/$(am__dirstamp) -rm -f tools/$(DEPDIR)/$(am__dirstamp) -rm -f tools/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) @MSG_COMMS_TCGMSG4_FALSE@clean-local: clean: clean-am clean-am: clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \ clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf examples/benchmarks/RandomAccess/$(DEPDIR) examples/benchmarks/RandomAccess/simple/$(DEPDIR) examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR) examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR) examples/benchmarks/lu/armci_blocking/$(DEPDIR) examples/benchmarks/lu/armci_multithreaded/$(DEPDIR) examples/benchmarks/lu/armci_nonblocking/$(DEPDIR) examples/benchmarks/lu/pthreads/$(DEPDIR) examples/features/aggregation/simple/$(DEPDIR) examples/features/aggregation/sparse_matvecmul/$(DEPDIR) examples/features/concurrency/multidma/$(DEPDIR) examples/features/concurrency/simple/$(DEPDIR) examples/features/gpc/hashtable/$(DEPDIR) examples/features/non-blocking/overlap/$(DEPDIR) examples/features/non-blocking/simple/$(DEPDIR) examples/features/notification/simple/$(DEPDIR) examples/features/proc_affinity/computation_impact/$(DEPDIR) examples/features/proc_affinity/simple/$(DEPDIR) examples/features/symmetric_memory/simple/$(DEPDIR) examples/simpleApps/$(DEPDIR) src-gemini/$(DEPDIR) src-portals/$(DEPDIR) src/collectives/$(DEPDIR) src/common/$(DEPDIR) src/devices/bgml/$(DEPDIR) src/devices/dcmf/dcmf-0.2.0/$(DEPDIR) src/devices/dcmf/dcmf-0.3.0/$(DEPDIR) src/devices/dcmf/dcmf2/$(DEPDIR) src/devices/lapi/$(DEPDIR) src/devices/mpi-mt/$(DEPDIR) src/devices/mpi-spawn/$(DEPDIR) src/devices/openib/$(DEPDIR) src/devices/sockets/$(DEPDIR) src/ft/$(DEPDIR) src/locks/$(DEPDIR) src/memory/$(DEPDIR) src/progress/$(DEPDIR) src/util/$(DEPDIR) src/xfer/$(DEPDIR) tcgmsg/ipcv4.0/$(DEPDIR) tcgmsg/ipcv5.0/$(DEPDIR) testing/$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf examples/benchmarks/RandomAccess/$(DEPDIR) examples/benchmarks/RandomAccess/simple/$(DEPDIR) examples/benchmarks/RandomAccess/smp_bucket/$(DEPDIR) examples/benchmarks/cg/armci_sharedmemory/$(DEPDIR) examples/benchmarks/lu/armci_blocking/$(DEPDIR) examples/benchmarks/lu/armci_multithreaded/$(DEPDIR) examples/benchmarks/lu/armci_nonblocking/$(DEPDIR) examples/benchmarks/lu/pthreads/$(DEPDIR) examples/features/aggregation/simple/$(DEPDIR) examples/features/aggregation/sparse_matvecmul/$(DEPDIR) examples/features/concurrency/multidma/$(DEPDIR) examples/features/concurrency/simple/$(DEPDIR) examples/features/gpc/hashtable/$(DEPDIR) examples/features/non-blocking/overlap/$(DEPDIR) examples/features/non-blocking/simple/$(DEPDIR) examples/features/notification/simple/$(DEPDIR) examples/features/proc_affinity/computation_impact/$(DEPDIR) examples/features/proc_affinity/simple/$(DEPDIR) examples/features/symmetric_memory/simple/$(DEPDIR) examples/simpleApps/$(DEPDIR) src-gemini/$(DEPDIR) src-portals/$(DEPDIR) src/collectives/$(DEPDIR) src/common/$(DEPDIR) src/devices/bgml/$(DEPDIR) src/devices/dcmf/dcmf-0.2.0/$(DEPDIR) src/devices/dcmf/dcmf-0.3.0/$(DEPDIR) src/devices/dcmf/dcmf2/$(DEPDIR) src/devices/lapi/$(DEPDIR) src/devices/mpi-mt/$(DEPDIR) src/devices/mpi-spawn/$(DEPDIR) src/devices/openib/$(DEPDIR) src/devices/sockets/$(DEPDIR) src/ft/$(DEPDIR) src/locks/$(DEPDIR) src/memory/$(DEPDIR) src/progress/$(DEPDIR) src/util/$(DEPDIR) src/xfer/$(DEPDIR) tcgmsg/ipcv4.0/$(DEPDIR) tcgmsg/ipcv5.0/$(DEPDIR) testing/$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: am--mostlyclean-test-html mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ uninstall-libLTLIBRARIES .MAKE: all check check-am check-html install install-am install-strip \ recheck-html .PHONY: CTAGS GTAGS all all-am am--mostlyclean-test-html am--refresh \ check check-TESTS check-am check-html clean clean-binPROGRAMS \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libtool clean-local ctags dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am \ install-includeHEADERS install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck recheck-html tags uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-includeHEADERS \ uninstall-libLTLIBRARIES .PHONY: flags flags: @echo ' =========================================================================== ' @echo ' Suggested compiler/linker options are as follows.' @echo ' ARMCI libraries are installed in $(libdir)' @echo ' ARMCI headers are installed in $(includedir)' @echo ' ' @echo ' CPPFLAGS="$(GA_MP_CPPFLAGS) $(ARMCI_NETWORK_CPPFLAGS) -I$(includedir)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' ' @echo ' LDFLAGS="$(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) -L$(libdir)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' ' @echo ' For C/C++ Programs: ' @echo ' LIBS="-larmci $(GA_MP_LIBS) $(ARMCI_NETWORK_LIBS) $(MAYBE_FLIBS)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' =========================================================================== ' @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@src/locks/tas-sx.o: src/locks/tas-sx.s @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(AM_V_CCAS) \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ -c -o src/locks/tas-sx.o $(top_srcdir)/src/locks/tas-sx.s @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@src/locks/tas-sx.lo: src/locks/tas-sx.s @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(AM_V_CCAS) \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ @ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@@NEC_TRUE@ $(CCASFLAGS) -c -o src/locks/tas-sx.lo $(top_srcdir)/src/locks/tas-sx.s ############################################################################## # the end # .PHONY: checkprogs checkprogs: $(check_PROGRAMS) .PHONY: pfiles clean-pfiles @MSG_COMMS_TCGMSG4_TRUE@pfiles: $(check_PROGRAMS) @MSG_COMMS_TCGMSG4_TRUE@ for p in $(check_PROGRAMS); do \ @MSG_COMMS_TCGMSG4_TRUE@ echo "`whoami` `hostname` $(NPROCS) `pwd`/$$p /tmp" > $$p.p; \ @MSG_COMMS_TCGMSG4_TRUE@ done @MSG_COMMS_TCGMSG4_TRUE@check: pfiles @MSG_COMMS_TCGMSG4_TRUE@clean-pfiles: @MSG_COMMS_TCGMSG4_TRUE@ find . -name '*.p' -exec rm {} \; ; @MSG_COMMS_TCGMSG4_TRUE@clean-local: clean-pfiles .PHONY: check-gaf2c check-gaf2c: $(all-am) $(check_LTLIBRARIES) $(GAF2C_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(GAF2C_TESTS)" XFAIL_TESTS="$(GAF2C_TESTS_XFAIL)" check-TESTS .PHONY: check-tcgmsg check-tcgmsg: $(all-am) $(check_LTLIBRARIES) $(TCGMSG_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(TCGMSG_TESTS)" XFAIL_TESTS="$(TCGMSG_TESTS_XFAIL)" check-TESTS .PHONY: check-armci check-armci: $(all-am) $(check_LTLIBRARIES) $(ARMCI_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(ARMCI_TESTS)" XFAIL_TESTS="$(ARMCI_TESTS_XFAIL)" check-TESTS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ga-5-4/armci/build-aux/0000755000175000017500000000000012662210414013013 5ustar mbambaga-5-4/armci/build-aux/config.guess0000755000175000017500000012367212662210414015346 0ustar mbamba#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-11-04' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/armci/build-aux/missing0000755000175000017500000002415212662210414014416 0ustar mbamba#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/armci/build-aux/depcomp0000755000175000017500000005064312662210414014400 0ustar mbamba#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # 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, 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, see . # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/armci/build-aux/compile0000755000175000017500000000717312662210414014401 0ustar mbamba#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software # Foundation, Inc. # Written by Tom Tromey . # # 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, 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, see . # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use `[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/armci/build-aux/config.sub0000755000175000017500000010622312662210414015002 0ustar mbamba#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-12-03' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/armci/build-aux/ltmain.sh0000755000175000017500000105154412662210414014650 0ustar mbamba # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -mkl*|-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 ga-5-4/armci/build-aux/install-sh0000755000175000017500000003325612662210414015030 0ustar mbamba#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/armci/Makefile.am0000644000175000017500000010036312662210425013162 0ustar mbamba############################################################################## # Makefile.am for ARMCI. # # Rationale: # This Makefile.am follows many of the suggestions outlined in the paper # "Recursive Make Considered Harmful". We do not use Automake's # 'include' feature (instead preferring a single, large Makefile.am). # # Additional targets: # Besides the traditional make targets supplied by Automake, we have added the # "examples" and "checkprogs" targets to build example programs and test # programs, respectively. # # Notes: # In general, each subdirectory has a corresponding section of this # Makefile.am with the notable exception being the many examples getting # rolled up into the examples section. # # The usual aclocal nonsense to get include paths right. ACLOCAL_AMFLAGS = -I m4 -I ../m4 # All public headers, installed programs, test programs, and example programs # are listed in these variables. Appended to throughout. These are the # automake variables used. include_HEADERS = bin_PROGRAMS = check_PROGRAMS = check_LTLIBRARIES = lib_LTLIBRARIES = EXTRA_DIST = README BUILT_SOURCES = MOSTLYCLEANFILES = CLEANFILES = DISTCLEANFILES = MAINTAINERCLEANFILES = AM_FFLAGS = AM_CFLAGS = AM_CXXFLAGS = AM_CPPFLAGS = AM_LDFLAGS = LDADD = if ARMCI_NETWORK_EXTERNAL else lib_LTLIBRARIES += libarmci.la endif libarmci_la_SOURCES = nodist_libarmci_la_SOURCES = libarmci_la_LIBADD = if ARMCI_NETWORK_COMEX ARMCI_NETWORK_CPPFLAGS += -I$(abs_srcdir)/../comex/src-armci ARMCI_NETWORK_LDFLAGS += -L$(abs_builddir)/../comex ARMCI_NETWORK_LIBS += $(abs_builddir)/../comex/libarmci.la endif AM_FFLAGS += $(ARMCI_FOPT) AM_FFLAGS += $(GA_F_WARN) AM_FFLAGS += $(FFLAG_INT) AM_CFLAGS += $(ARMCI_COPT) AM_CFLAGS += $(GA_C_WARN) AM_CXXFLAGS += $(ARMCI_CXXOPT) AM_CXXFLAGS += $(GA_CXX_WARN) AM_CPPFLAGS += $(GA_MP_CPPFLAGS) AM_CPPFLAGS += $(ARMCI_NETWORK_CPPFLAGS) if MSG_COMMS_MPI else AM_CPPFLAGS += -I$(top_srcdir)/tcgmsg endif LDFLAGS_BASE = LDFLAGS_BASE += $(GA_MP_LDFLAGS) LDFLAGS_BASE += $(ARMCI_NETWORK_LDFLAGS) AM_LDFLAGS += $(LDFLAGS_BASE) if ARMCI_NETWORK_EXTERNAL LDADD += $(ARMCI_NETWORK_LIBS) LDADD += $(GA_MP_LIBS) else LDADD += libarmci.la LDADD += $(LTLIBOBJS) LDADD += $(GA_MP_LIBS) LDADD += $(ARMCI_NETWORK_LIBS) endif if ARMCI_NETWORK_EXTERNAL else libarmci_la_LIBADD += $(GA_MP_LIBS) libarmci_la_LIBADD += $(ARMCI_NETWORK_LIBS) endif ############################################################################## # compiler and linker flags # # Important for external tools wanting to know how to link to ARMCI. SED_NORMALIZE_WHITESPACE = $(SED) 's/ [ ]*/ /g;s/" /"/g;s/ "/"/g' .PHONY: flags flags: @echo ' =========================================================================== ' @echo ' Suggested compiler/linker options are as follows.' @echo ' ARMCI libraries are installed in $(libdir)' @echo ' ARMCI headers are installed in $(includedir)' @echo ' ' @echo ' CPPFLAGS="$(GA_MP_CPPFLAGS) $(ARMCI_NETWORK_CPPFLAGS) -I$(includedir)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' ' @echo ' LDFLAGS="$(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) -L$(libdir)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' ' @echo ' For C/C++ Programs: ' @echo ' LIBS="-larmci $(GA_MP_LIBS) $(ARMCI_NETWORK_LIBS) $(MAYBE_FLIBS)"' | $(SED_NORMALIZE_WHITESPACE) @echo ' =========================================================================== ' ############################################################################## # src-portals # if ARMCI_NETWORK_PORTALS include $(top_srcdir)/src-portals/Makefile.inc ############################################################################## # src-gemini # else # !ARMCI_NETWORK_PORTALS if ARMCI_NETWORK_GEMINI include $(top_srcdir)/src-gemini/Makefile.inc ############################################################################## # src # else # !ARMCI_NETWORK_GEMINI libarmci_la_SOURCES += src/collectives/message.c libarmci_la_SOURCES += src/common/aggregate.c libarmci_la_SOURCES += src/common/armci.c libarmci_la_SOURCES += src/common/ccopy.c libarmci_la_SOURCES += src/common/clusterinfo.c libarmci_la_SOURCES += src/common/pack.c libarmci_la_SOURCES += src/common/iterator.c libarmci_la_SOURCES += src/include/iterator.h libarmci_la_SOURCES += src/ft/armci_chkpt.h libarmci_la_SOURCES += src/ft/armci_storage.h libarmci_la_SOURCES += src/include/acc.h libarmci_la_SOURCES += src/include/armcip.h libarmci_la_SOURCES += src/include/asm-ppc.h libarmci_la_SOURCES += src/include/atomic_ops_ia64.h libarmci_la_SOURCES += src/include/atomics-i386.h libarmci_la_SOURCES += src/include/copy.h libarmci_la_SOURCES += src/include/fujitsu-vpp.h libarmci_la_SOURCES += src/include/kr_malloc.h libarmci_la_SOURCES += src/include/locks.h libarmci_la_SOURCES += src/include/memlock.h libarmci_la_SOURCES += src/include/request.h libarmci_la_SOURCES += src/include/semaphores.h libarmci_la_SOURCES += src/include/shmalloc.h libarmci_la_SOURCES += src/include/armci_shmem.h libarmci_la_SOURCES += src/include/shmlimit.h libarmci_la_SOURCES += src/include/signaltrap.h libarmci_la_SOURCES += src/include/spinlock.h libarmci_la_SOURCES += src/include/utils.h libarmci_la_SOURCES += src/locks/locks.c libarmci_la_SOURCES += src/locks/memlock.c libarmci_la_SOURCES += src/locks/mutex.c libarmci_la_SOURCES += src/locks/semaphores.c libarmci_la_SOURCES += src/memory/kr_malloc.c libarmci_la_SOURCES += src/memory/memory.c libarmci_la_SOURCES += src/progress/fence.c libarmci_la_SOURCES += src/progress/wait.c libarmci_la_SOURCES += src/xfer/caccumulate.c libarmci_la_SOURCES += src/xfer/rmw.c libarmci_la_SOURCES += src/xfer/strided.c libarmci_la_SOURCES += src/xfer/vector.c if MSG_COMMS_MPI libarmci_la_SOURCES += src/common/groups.c endif if ARMCI_NETWORK_BGML AM_CPPFLAGS += -I$(top_srcdir)/src/devices/bgml libarmci_la_SOURCES += src/devices/bgml/bgmlacc.h libarmci_la_SOURCES += src/devices/bgml/bgml.c libarmci_la_SOURCES += src/devices/bgml/bgmldefs.h libarmci_la_SOURCES += src/devices/bgml/bgml.h endif if ARMCI_NETWORK_CRAY_SHMEM AM_CPPFLAGS += -I$(top_srcdir)/src/devices/cray-shmem libarmci_la_SOURCES += src/memory/shmalloc.c endif if ARMCI_NETWORK_DCMF AM_CPPFLAGS += -I$(top_srcdir)/src/devices/dcmf libarmci_la_SOURCES += src/devices/dcmf/armcix.h if DCMF_VER_2 libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_acc.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_fence.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_get.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_impl.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_lock.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_put.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_rmw.c libarmci_la_SOURCES += src/devices/dcmf/dcmf2/armcix_wait.c endif if DCMF_VER_0_2 libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_acc.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_fence.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_get.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_impl.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_lock.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_put.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_rmw.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.2.0/armcix_wait.c endif if DCMF_VER_0_3 libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_acc.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_fence.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_get.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_impl.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_lock.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_put.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_rmw.c libarmci_la_SOURCES += src/devices/dcmf/dcmf-0.3.0/armcix_wait.c endif endif # ARMCI_NETWORK_DCMF if ARMCI_NETWORK_LAPI AM_CPPFLAGS += -I$(top_srcdir)/src/devices/lapi libarmci_la_SOURCES += src/common/async.c libarmci_la_SOURCES += src/common/request.c libarmci_la_SOURCES += src/devices/lapi/lapi.c libarmci_la_SOURCES += src/devices/lapi/lapidefs.h libarmci_la_SOURCES += src/memory/buffers.c endif if ARMCI_NETWORK_MPI_MT AM_CPPFLAGS += -I$(top_srcdir)/src/devices/mpi-mt libarmci_la_SOURCES += src/common/ds-shared.c libarmci_la_SOURCES += src/common/request.c libarmci_la_SOURCES += src/common/spawn.c libarmci_la_SOURCES += src/devices/mpi-mt/mpi2_client.c libarmci_la_SOURCES += src/devices/mpi-mt/mpi2.h libarmci_la_SOURCES += src/devices/mpi-mt/mpi2_server.c libarmci_la_SOURCES += src/memory/buffers.c endif if ARMCI_NETWORK_MPI_SPAWN AM_CPPFLAGS += -I$(top_srcdir)/src/devices/mpi-spawn libarmci_la_SOURCES += src/common/ds-shared.c libarmci_la_SOURCES += src/common/request.c libarmci_la_SOURCES += src/devices/mpi-spawn/mpi2_client.c libarmci_la_SOURCES += src/devices/mpi-spawn/mpi2.h libarmci_la_SOURCES += src/devices/mpi-spawn/mpi2_server.c libarmci_la_SOURCES += src/memory/buffers.c endif if ARMCI_NETWORK_OPENIB AM_CPPFLAGS += -I$(top_srcdir)/src/devices/openib libarmci_la_SOURCES += src/common/async.c libarmci_la_SOURCES += src/common/ds-shared.c libarmci_la_SOURCES += src/common/regions.c libarmci_la_SOURCES += src/common/request.c libarmci_la_SOURCES += src/common/spawn.c libarmci_la_SOURCES += src/devices/openib/armci-vapi.h libarmci_la_SOURCES += src/devices/openib/cbuf.c libarmci_la_SOURCES += src/devices/openib/cbuf.h libarmci_la_SOURCES += src/devices/openib/openib.c libarmci_la_SOURCES += src/devices/openib/pendbufs.c libarmci_la_SOURCES += src/devices/openib/pendbufs.h libarmci_la_SOURCES += src/devices/openib/rtinfo.c libarmci_la_SOURCES += src/memory/buffers.c endif if ARMCI_NETWORK_SOCKETS AM_CPPFLAGS += -I$(top_srcdir)/src/devices/sockets libarmci_la_SOURCES += src/common/async.c libarmci_la_SOURCES += src/common/ds-shared.c libarmci_la_SOURCES += src/common/request.c libarmci_la_SOURCES += src/common/spawn.c libarmci_la_SOURCES += src/devices/sockets/dataserv.c libarmci_la_SOURCES += src/devices/sockets/sockets.c libarmci_la_SOURCES += src/devices/sockets/sockets.h libarmci_la_SOURCES += src/memory/buffers.c endif if ENABLE_CHECKPOINT libarmci_la_SOURCES += src/ft/armci_chkpt.c libarmci_la_SOURCES += src/ft/armci_storage.c endif if ARMCI_ENABLE_GPC_CALLS libarmci_la_SOURCES += src/common/gpc.c endif if MACX libarmci_la_SOURCES += src/common/signaltrap.c libarmci_la_SOURCES += src/memory/shmalloc.c libarmci_la_SOURCES += src/memory/winshmem.c AM_CPPFLAGS += -DSHMEM -DMMAP else if CYGWIN libarmci_la_SOURCES += src/common/signaltrap.c libarmci_la_SOURCES += src/memory/shmalloc.c libarmci_la_SOURCES += src/memory/winshmem.c AM_CPPFLAGS += -DSHMEM -DMMAP else if SYSV libarmci_la_SOURCES += src/common/signaltrap.c libarmci_la_SOURCES += src/memory/shmem.c libarmci_la_SOURCES += src/memory/shmlimit.c endif endif endif if NB_NONCONT libarmci_la_SOURCES += src/common/noncont.c endif if THREAD_SAFE libarmci_la_SOURCES += src/common/utils.c libarmci_la_SOURCES += src/util/threads.c endif if NEC libarmci_la_SOURCES += src/locks/tas-sx.s src/locks/tas-sx.o: src/locks/tas-sx.s $(AM_V_CCAS) \ $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS) \ -c -o src/locks/tas-sx.o $(top_srcdir)/src/locks/tas-sx.s src/locks/tas-sx.lo: src/locks/tas-sx.s $(AM_V_CCAS) \ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(AM_CCASFLAGS) \ $(CCASFLAGS) -c -o src/locks/tas-sx.lo $(top_srcdir)/src/locks/tas-sx.s endif include_HEADERS += src/include/armci.h include_HEADERS += src/include/gpc.h include_HEADERS += src/include/message.h AM_CPPFLAGS += -I$(top_srcdir)/src/include endif # ARMCI_NETWORK_GEMINI endif # ARMCI_NETWORK_PORTALS ############################################################################## # profiling # if ENABLE_PROFILING if HAVE_SYS_WEAK_ALIAS_PRAGMA lib_LTLIBRARIES += libarmci_prof.la libarmci_prof_la_SOURCES = libarmci_prof_la_SOURCES += tools/armci_prof.c libarmci_la_SOURCES += src/common/capi.c else # HAVE_SYS_WEAK_ALIAS_PRAGMA libarmci_la_SOURCES += tools/armci_prof.c endif # HAVE_SYS_WEAK_ALIAS_PRAGMA else # ENABLE_PROFILING libarmci_la_SOURCES += src/common/capi.c endif include_HEADERS += src/include/parmci.h ############################################################################## # tcgmsg # EXTRA_DIST += tcgmsg/README ############################################################################## # tcgmsg/ipcv4.0 # if MSG_COMMS_TCGMSG4 AM_CPPFLAGS += -I$(top_srcdir)/tcgmsg/ipcv4.0 libarmci_la_SOURCES += tcgmsg/ipcv4.0/brdcst.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/checkbyte.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/cluster.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/cluster.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/defglobals.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/drand48.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/error.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/evlog.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/evlog.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/evon.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/globalop.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/llog.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/mdtob.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/mdtoi.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/mitob.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/mitod.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/mtime.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/niceftn.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/nnodes.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/nodeid.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/nxtval.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/pbegin.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/pbeginf.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/pfilecopy.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/sema.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/sema.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/setdbg.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/shmem.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/signals.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/signals.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/snd.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/sndrcv.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/sndrcvP.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/sockets.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/srftoc.h libarmci_la_SOURCES += tcgmsg/ipcv4.0/srmover.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/stats.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/synch.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/usleep.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/waitall.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/waitcom.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/xdrstuff.c libarmci_la_SOURCES += tcgmsg/ipcv4.0/xdrstuff.h bin_PROGRAMS += parallel parallel_SOURCES = tcgmsg/ipcv4.0/parallel.c endif # MSG_COMMS_TCGMSG4 ############################################################################## # tcgmsg/ipcv5.0 # if MSG_COMMS_TCGMSG5 AM_CPPFLAGS += -I$(top_srcdir)/tcgmsg/ipcv5.0 libarmci_la_SOURCES += tcgmsg/ipcv5.0/drand48.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/evlog.h libarmci_la_SOURCES += tcgmsg/ipcv5.0/globalop.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/llog.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/mdtob.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/mdtoi.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/misc.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/mitob.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/mitod.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/mtime.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/niceftn.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/nnodes.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/nodeid.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/pbegin.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/pfilecopy.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/queues.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/signals.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/sndrcv.h libarmci_la_SOURCES += tcgmsg/ipcv5.0/snd_rcv_probe.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/srftoc.h libarmci_la_SOURCES += tcgmsg/ipcv5.0/tcgmsgP.h libarmci_la_SOURCES += tcgmsg/ipcv5.0/usleep.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/waitall.c if ARMCI_NETWORK_LAPI libarmci_la_SOURCES += tcgmsg/ipcv5.0/async_send_lapi.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/lapi_putget.c else libarmci_la_SOURCES += tcgmsg/ipcv5.0/async_send.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/busy.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/error.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/nxtval.shm.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/pbeginf.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/shmem.c libarmci_la_SOURCES += tcgmsg/ipcv5.0/synch.c endif # ARMCI_NETWORK_LAPI endif # MSG_COMMS_TCGMSG5 ############################################################################## # testing # check_PROGRAMS += testing/msgcheck check_PROGRAMS += testing/perf check_PROGRAMS += testing/perf2 check_PROGRAMS += testing/perf_aggr check_PROGRAMS += testing/perf_nb check_PROGRAMS += testing/perf_strided check_PROGRAMS += testing/shmclean check_PROGRAMS += testing/shmtest check_PROGRAMS += testing/simplelock check_PROGRAMS += testing/test check_PROGRAMS += testing/test2 if HAVE_ARMCI_NOTIFY check_PROGRAMS += testing/testnotify endif if ENABLE_CHECKPOINT check_PROGRAMS += testing/fttest endif if ARMCI_ENABLE_GPC_CALLS check_PROGRAMS += testing/gpctest endif if MSG_COMMS_MPI check_PROGRAMS += testing/simple check_PROGRAMS += testing/test_groups if SYSV if ARMCI_NETWORK_EXTERNAL else check_PROGRAMS += testing/ipctest endif endif endif if THREAD_SAFE check_PROGRAMS += testing/test_mt endif if ARMCI_NETWORK_PORTALS check_PROGRAMS += testing/clone check_PROGRAMS += testing/fork check_PROGRAMS += testing/origptl check_PROGRAMS += testing/ptltest check_PROGRAMS += testing/te endif if HAVE_ARMCI_STRIDE_INFO_INIT check_PROGRAMS += testing/testitr endif atsrc = if HAVE_ARMCI_MSG_INIT else atsrc += testing/rpl_armci_msg_init.c endif if HAVE_ARMCI_MSG_FINALIZE else atsrc += testing/rpl_armci_msg_finalize.c endif ARMCI_SERIAL_TESTS = ARMCI_SERIAL_TESTS_XFAIL = ARMCI_PARALLEL_TESTS = ARMCI_PARALLEL_TESTS_XFAIL = ARMCI_TESTS = $(ARMCI_SERIAL_TESTS) $(ARMCI_PARALLEL_TESTS) ARMCI_TESTS_XFAIL = $(ARMCI_SERIAL_TESTS_XFAIL) $(ARMCI_PARALLEL_TESTS_XFAIL) ARMCI_PARALLEL_TESTS += testing/msgcheck$(EXEEXT) ARMCI_PARALLEL_TESTS += testing/perf$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/perf2(EXEEXT) # only a benchmark ARMCI_PARALLEL_TESTS += testing/perf_aggr$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/perf_nb$(EXEEXT) # needs bug fixes #ARMCI_SERIAL_TESTS += testing/shmclean$(EXEEXT) # not sure we need this #ARMCI_SERIAL_TESTS += testing/shmtest$(EXEEXT) # not sure we need this ARMCI_PARALLEL_TESTS += testing/simplelock$(EXEEXT) ARMCI_PARALLEL_TESTS += testing/test$(EXEEXT) ARMCI_PARALLEL_TESTS += testing/test2$(EXEEXT) if HAVE_ARMCI_NOTIFY ARMCI_PARALLEL_TESTS += testing/testnotify$(EXEEXT) endif if ENABLE_CHECKPOINT ARMCI_PARALLEL_TESTS += testing/fttest$(EXEEXT) endif if ARMCI_ENABLE_GPC_CALLS ARMCI_PARALLEL_TESTS += testing/gpctest$(EXEEXT) endif if MSG_COMMS_MPI ARMCI_PARALLEL_TESTS += testing/simple$(EXEEXT) ARMCI_PARALLEL_TESTS += testing/test_groups$(EXEEXT) if SYSV if ARMCI_NETWORK_EXTERNAL else #ARMCI_PARALLEL_TESTS += testing/ipctest$(EXEEXT) # needs bug fixes endif endif endif if THREAD_SAFE ARMCI_PARALLEL_TESTS += testing/test_mt$(EXEEXT) endif if ARMCI_NETWORK_PORTALS #ARMCI_PARALLEL_TESTS += testing/clone$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/fork$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/origptl$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/ptltest$(EXEEXT) #ARMCI_PARALLEL_TESTS += testing/te$(EXEEXT) endif if HAVE_ARMCI_STRIDE_INFO_INIT ARMCI_SERIAL_TESTS += testing/testitr$(EXEEXT) endif testing_clone_SOURCES = testing/clone.c $(atsrc) testing_fork_SOURCES = testing/fork.c $(atsrc) testing_fttest_SOURCES = testing/fttest.c $(atsrc) testing_gpctest_SOURCES = testing/gpctest.c $(atsrc) testing_ipctest_SOURCES = testing/ipctest.c $(atsrc) testing_msgcheck_SOURCES = testing/msgcheck.c $(atsrc) testing_origptl_SOURCES = testing/origptl.c $(atsrc) testing_perf_aggr_SOURCES = testing/perf_aggr.c $(atsrc) testing_perf_nb_SOURCES = testing/perf_nb.c $(atsrc) testing_perf_strided_SOURCES= testing/perf_strided.c $(atsrc) testing_perf_SOURCES = testing/perf.c $(atsrc) testing_perf2_SOURCES = testing/perf2.c $(atsrc) testing_ptltest_SOURCES = testing/ptltest.c $(atsrc) testing_shmclean_SOURCES = testing/shmclean.c $(atsrc) testing_shmtest_SOURCES = testing/shmtest.c $(atsrc) testing_simple_SOURCES = testing/simple.c $(atsrc) testing_simplelock_SOURCES = testing/simplelock.c $(atsrc) testing_te_SOURCES = testing/te.c $(atsrc) testing_test2_SOURCES = testing/test2.c $(atsrc) testing_test_groups_SOURCES = testing/test_groups.c $(atsrc) testing_testitr_SOURCES = testing/testitr.c $(atsrc) testing_test_mt_SOURCES = testing/test_mt.c $(atsrc) testing_testnotify_SOURCES = testing/testnotify.c $(atsrc) testing_test_SOURCES = testing/test.c $(atsrc) testing_testitr_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/include ############################################################################## # examples # check_PROGRAMS += examples/benchmarks/cg/armci_sharedmemory/cg check_PROGRAMS += examples/benchmarks/lu/armci_blocking/lu-b-bc check_PROGRAMS += examples/benchmarks/lu/armci_blocking/lu-block check_PROGRAMS += examples/benchmarks/lu/armci_blocking/lu check_PROGRAMS += examples/benchmarks/lu/armci_nonblocking/lu_nb_get check_PROGRAMS += examples/benchmarks/lu/armci_nonblocking/lu_nb_put check_PROGRAMS += examples/benchmarks/lu/pthreads/lu-thread check_PROGRAMS += examples/features/aggregation/simple/simple check_PROGRAMS += examples/features/aggregation/sparse_matvecmul/sparse_matvecmul check_PROGRAMS += examples/features/non-blocking/simple/simple check_PROGRAMS += examples/features/symmetric_memory/simple/simple check_PROGRAMS += examples/simpleApps/transp1D-c if HAVE_ARMCI_NOTIFY check_PROGRAMS += examples/features/concurrency/simple/comdegree check_PROGRAMS += examples/features/notification/simple/testnotify endif if ARMCI_ENABLE_GPC_CALLS check_PROGRAMS += examples/features/gpc/hashtable/test_hashtable if HAVE_BLAS if HAVE_LAPACK check_PROGRAMS += examples/features/proc_affinity/computation_impact/computation_impact endif # HAVE_LAPACK endif # HAVE_BLAS check_PROGRAMS += examples/features/proc_affinity/simple/simple endif # ARMCI_ENABLE_GPC_CALLS if MSG_COMMS_MPI check_PROGRAMS += examples/features/concurrency/multidma/multidma check_PROGRAMS += examples/features/non-blocking/overlap/overlap endif if RANDOM_ACCESS check_PROGRAMS += examples/benchmarks/RandomAccess/simple/simple check_PROGRAMS += examples/benchmarks/RandomAccess/smp_bucket/smp_bucket endif if THREAD_SAFE check_PROGRAMS += examples/benchmarks/lu/armci_multithreaded/lu-block-th endif #ARMCI_PARALLEL_TESTS += examples/benchmarks/cg/armci_sharedmemory/cg$(EXEEXT) # needs input file ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_blocking/lu-b-bc$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_blocking/lu-block$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_blocking/lu$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_nonblocking/lu_nb_get$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_nonblocking/lu_nb_put$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/pthreads/lu-thread$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/features/aggregation/simple/simple$(EXEEXT) #ARMCI_PARALLEL_TESTS += examples/features/aggregation/sparse_matvecmul/sparse_matvecmul$(EXEEXT) # needs input file ARMCI_PARALLEL_TESTS += examples/features/non-blocking/simple/simple$(EXEEXT) if HAVE_ARMCI_NOTIFY ARMCI_PARALLEL_TESTS += examples/features/concurrency/simple/comdegree$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/features/notification/simple/testnotify$(EXEEXT) endif ARMCI_PARALLEL_TESTS += examples/features/symmetric_memory/simple/simple$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/simpleApps/transp1D-c$(EXEEXT) if ARMCI_ENABLE_GPC_CALLS ARMCI_PARALLEL_TESTS += examples/features/gpc/hashtable/test_hashtable$(EXEEXT) if HAVE_BLAS if HAVE_LAPACK ARMCI_PARALLEL_TESTS += examples/features/proc_affinity/computation_impact/computation_impact$(EXEEXT) endif # HAVE_LAPACK endif # HAVE_BLAS ARMCI_PARALLEL_TESTS += examples/features/proc_affinity/simple/simple$(EXEEXT) endif # ARMCI_ENABLE_GPC_CALLS if MSG_COMMS_MPI #ARMCI_PARALLEL_TESTS += examples/features/concurrency/multidma/multidma$(EXEEXT) # needs bug fixes #ARMCI_PARALLEL_TESTS += examples/features/non-blocking/overlap/overlap$(EXEEXT) # needs bug fixes endif if RANDOM_ACCESS ARMCI_PARALLEL_TESTS += examples/benchmarks/RandomAccess/simple/simple$(EXEEXT) ARMCI_PARALLEL_TESTS += examples/benchmarks/RandomAccess/smp_bucket/smp_bucket$(EXEEXT) endif if THREAD_SAFE ARMCI_PARALLEL_TESTS += examples/benchmarks/lu/armci_multithreaded/lu-block-th$(EXEEXT) endif examples_benchmarks_cg_armci_sharedmemory_cg_SOURCES = \ examples/benchmarks/cg/armci_sharedmemory/cg.c \ examples/benchmarks/cg/armci_sharedmemory/compute.c \ examples/benchmarks/cg/armci_sharedmemory/read_input.c \ examples/benchmarks/cg/armci_sharedmemory/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_block_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu-block.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_blocking_lu_b_bc_SOURCES = \ examples/benchmarks/lu/armci_blocking/lu-b-bc.c \ examples/benchmarks/lu/armci_blocking/timing.c $(atsrc) examples_benchmarks_lu_armci_multithreaded_lu_block_th_SOURCES = \ examples/benchmarks/lu/armci_multithreaded/lu-block-th.c \ examples/benchmarks/lu/armci_multithreaded/timing.c $(atsrc) examples_benchmarks_lu_armci_nonblocking_lu_nb_put_SOURCES = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_put.c \ examples/benchmarks/lu/armci_nonblocking/timing.c $(atsrc) examples_benchmarks_lu_armci_nonblocking_lu_nb_get_SOURCES = \ examples/benchmarks/lu/armci_nonblocking/lu_nb_get.c \ examples/benchmarks/lu/armci_nonblocking/timing.c $(atsrc) examples_benchmarks_lu_pthreads_lu_thread_SOURCES = \ examples/benchmarks/lu/pthreads/barrier.c \ examples/benchmarks/lu/pthreads/barrier.h \ examples/benchmarks/lu/pthreads/errors.h \ examples/benchmarks/lu/pthreads/lu-thread.c \ examples/benchmarks/lu/pthreads/timing.c $(atsrc) examples_benchmarks_lu_pthreads_lu_thread_LDADD = -lpthread examples_benchmarks_RandomAccess_simple_simple_SOURCES = \ examples/benchmarks/RandomAccess/simple/simple.c \ examples/benchmarks/RandomAccess/timing.c $(atsrc) examples_benchmarks_RandomAccess_smp_bucket_smp_bucket_SOURCES = \ examples/benchmarks/RandomAccess/smp_bucket/smp_bucket.c \ examples/benchmarks/RandomAccess/timing.c $(atsrc) examples_features_aggregation_simple_simple_SOURCES = \ examples/features/aggregation/simple/simple.c $(atsrc) examples_features_aggregation_sparse_matvecmul_sparse_matvecmul_SOURCES = \ examples/features/aggregation/sparse_matvecmul/sparse_matvecmul.c $(atsrc) examples_features_concurrency_multidma_multidma_SOURCES = \ examples/features/concurrency/multidma/multidma.c $(atsrc) examples_features_concurrency_simple_comdegree_SOURCES = \ examples/features/concurrency/simple/comdegree.c $(atsrc) examples_features_gpc_hashtable_test_hashtable_SOURCES = \ examples/features/gpc/hashtable/DistHashmap.cc \ examples/features/gpc/hashtable/DistHashmap.h \ examples/features/gpc/hashtable/GPCHashmap.cc \ examples/features/gpc/hashtable/GPCHashmap.h \ examples/features/gpc/hashtable/GPCHashmapHandler.cc \ examples/features/gpc/hashtable/Hash_common.h \ examples/features/gpc/hashtable/HashFunctions.cc \ examples/features/gpc/hashtable/hash_map.h \ examples/features/gpc/hashtable/HashUtil.cc \ examples/features/gpc/hashtable/test_hashtable.cc \ examples/features/gpc/hashtable/Util.h $(atsrc) examples_features_gpc_hashtable_test_hashtable_LDFLAGS = $(LDFLAGS_BASE) examples_features_gpc_hashtable_test_hashtable_LDADD = $(LDADD) $(MAYBE_FLIBS) examples_features_non_blocking_overlap_overlap_SOURCES = \ examples/features/non-blocking/overlap/overlap.c $(atsrc) examples_features_non_blocking_simple_simple_SOURCES = \ examples/features/non-blocking/simple/simple.c $(atsrc) examples_features_notification_simple_testnotify_SOURCES = \ examples/features/notification/simple/testnotify.c $(atsrc) examples_features_proc_affinity_computation_impact_computation_impact_SOURCES = \ examples/features/proc_affinity/computation_impact/computation_impact.c $(atsrc) examples_features_proc_affinity_computation_impact_computation_impact_LDFLAGS = \ $(AM_LDFLAGS) \ $(LAPACK_LDFLAGS) \ $(BLAS_LDFLAGS) examples_features_proc_affinity_computation_impact_computation_impact_LDADD = \ $(LDADD) \ $(LAPACK_LIBS) \ $(BLAS_LIBS) examples_features_proc_affinity_simple_simple_SOURCES = \ examples/features/proc_affinity/simple/simple.c $(atsrc) examples_features_symmetric_memory_simple_simple_SOURCES = \ examples/features/symmetric_memory/simple/simple.c $(atsrc) examples_simpleApps_transp1D_c_SOURCES = \ examples/simpleApps/transp1D-c.c $(atsrc) EXTRA_DIST += examples/benchmarks/lu/README EXTRA_DIST += examples/features/aggregation/README EXTRA_DIST += examples/features/concurrency/README EXTRA_DIST += examples/features/gpc/hashtable/README EXTRA_DIST += examples/features/non-blocking/README EXTRA_DIST += examples/features/notification/README EXTRA_DIST += examples/features/proc_affinity/README EXTRA_DIST += examples/README ############################################################################## # the end # .PHONY: checkprogs checkprogs: $(check_PROGRAMS) # support verbose/silent make rules for additional programs # sed SED_V = $(SED__v_$(V)) SED__v_ = $(SED__v_$(AM_DEFAULT_VERBOSITY)) SED__v_0 = @echo " SED " $@; # ARMCI_TAS_AS ARMCI_TAS_AS_V = $(ARMCI_TAS_AS__v_$(V)) ARMCI_TAS_AS__v_ = $(ARMCI_TAS_AS__v_$(AM_DEFAULT_VERBOSITY)) ARMCI_TAS_AS__v_0 = @echo " GCC " $@; # ARMCI_X86COPY_AS ARMCI_X86COPY_AS_V = $(ARMCI_X86COPY_AS__v_$(V)) ARMCI_X86COPY_AS__v_ = $(ARMCI_X86COPY_AS__v_$(AM_DEFAULT_VERBOSITY)) ARMCI_X86COPY_AS__v_0 = @echo " GCC " $@; .PHONY: pfiles clean-pfiles if MSG_COMMS_TCGMSG4 pfiles: $(check_PROGRAMS) for p in $(check_PROGRAMS); do \ echo "`whoami` `hostname` $(NPROCS) `pwd`/$$p /tmp" > $$p.p; \ done check: pfiles clean-pfiles: find . -name '*.p' -exec rm {} \; ; clean-local: clean-pfiles endif # MSG_COMMS_TCGMSG4 ############################################################################## # test suite # # Some tests were commented out either because they required an input file or # they were failing for unknown reasons and we didn't want to further debug. # SERIAL_TESTS = SERIAL_TESTS += $(GAF2C_SERIAL_TESTS) SERIAL_TESTS += $(TCGMSG_SERIAL_TESTS) SERIAL_TESTS += $(ARMCI_SERIAL_TESTS) SERIAL_TESTS_XFAIL = SERIAL_TESTS_XFAIL += $(GAF2C_SERIAL_TESTS_XFAIL) SERIAL_TESTS_XFAIL += $(TCGMSG_SERIAL_TESTS_XFAIL) SERIAL_TESTS_XFAIL += $(ARMCI_SERIAL_TESTS_XFAIL) PARALLEL_TESTS = PARALLEL_TESTS += $(GAF2C_PARALLEL_TESTS) PARALLEL_TESTS += $(TCGMSG_PARALLEL_TESTS) PARALLEL_TESTS += $(ARMCI_PARALLEL_TESTS) PARALLEL_TESTS_XFAIL = PARALLEL_TESTS_XFAIL += $(GAF2C_PARALLEL_TESTS_XFAIL) PARALLEL_TESTS_XFAIL += $(TCGMSG_PARALLEL_TESTS_XFAIL) PARALLEL_TESTS_XFAIL += $(ARMCI_PARALLEL_TESTS_XFAIL) TESTS = TESTS += $(SERIAL_TESTS) TESTS += $(PARALLEL_TESTS) XFAIL_TESTS = XFAIL_TESTS += $(SERIAL_TESTS_XFAIL) XFAIL_TESTS += $(PARALLEL_TESTS_XFAIL) if MSG_COMMS_TCGMSG4 LOG_COMPILER = \ maybe_parexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else echo "$(TCGEXEC)"; fi`; eval $$maybe_parexec else if MSG_COMMS_TCGMSG5 LOG_COMPILER = tst="$$dir$$f -np $(NPROCS)"; eval else if CROSS_COMPILING maybe_mpiexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/1/'; else echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; fi`; eval $$maybe_mpiexec else LOG_COMPILER = \ maybe_mpiexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else if echo "$(MPIEXEC)" | $(GREP) "%NP%" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; else echo "$(MPIEXEC)"; fi; fi`; eval $$maybe_mpiexec endif # CROSS_COMPILING endif # MSG_COMMS_TCGMSG5 endif # MSG_COMMS_TCGMSG4 .PHONY: check-gaf2c check-gaf2c: $(all-am) $(check_LTLIBRARIES) $(GAF2C_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(GAF2C_TESTS)" XFAIL_TESTS="$(GAF2C_TESTS_XFAIL)" check-TESTS .PHONY: check-tcgmsg check-tcgmsg: $(all-am) $(check_LTLIBRARIES) $(TCGMSG_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(TCGMSG_TESTS)" XFAIL_TESTS="$(TCGMSG_TESTS_XFAIL)" check-TESTS .PHONY: check-armci check-armci: $(all-am) $(check_LTLIBRARIES) $(ARMCI_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(ARMCI_TESTS)" XFAIL_TESTS="$(ARMCI_TESTS_XFAIL)" check-TESTS ga-5-4/armci/src/0000755000175000017500000000000012662210413011707 5ustar mbambaga-5-4/armci/src/xfer/0000755000175000017500000000000012662210407012656 5ustar mbambaga-5-4/armci/src/xfer/rmw.c0000644000175000017500000002153712662210407013637 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "locks.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if (defined(__i386__) || defined(__x86_64__)) && !defined(NO_I386ASM) # include "atomics-i386.h" #endif /* enable use of newer interfaces in SHMEM */ #ifndef CRAY #ifndef LIBELAN_ATOMICS /* manpages for shmem_fadd exist on the T3E but library code does not */ #define SHMEM_FADD #endif #endif /* global scope to prevent compiler optimization of volatile code */ int _a_temp; long _a_ltemp; /* JAD -- DCMF implements its own rmw there were linking errors with missing atomic_fetch_and_add for DCMF */ #if !ARMCIX void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_LOCK(lock,proc); switch (op) { case ARMCI_FETCH_AND_ADD: #if (defined(__i386__) || defined(__x86_64__)) && !defined(NO_I386ASM) #if (defined(__GNUC__) || defined(__INTEL_COMPILER__) ||defined(__PGIC__)) && !defined(PORTALS) && !defined(NO_I386ASM) if(SERVER_CONTEXT || armci_nclus == 1){ /* *(int*)ploc = __sync_fetch_and_add((int*)prem, extra); */ atomic_fetch_and_add(prem, ploc, extra, sizeof(int)); } else #endif #endif { armci_get(prem,ploc,sizeof(int),proc); _a_temp = *(int*)ploc + extra; armci_put(&_a_temp,prem,sizeof(int),proc); } break; case ARMCI_FETCH_AND_ADD_LONG: armci_get(prem,ploc,sizeof(long),proc); _a_ltemp = *(long*)ploc + extra; armci_put(&_a_ltemp,prem,sizeof(long),proc); break; case ARMCI_SWAP: #if (defined(__i386__) || defined(__x86_64__)) && !defined(PORTALS) && !defined(NO_I386ASM) if(SERVER_CONTEXT || armci_nclus==1){ atomic_exchange(ploc, prem, sizeof(int)); } else #endif { armci_get(prem,&_a_temp,sizeof(int),proc); armci_put(ploc,prem,sizeof(int),proc); *(int*)ploc = _a_temp; } break; case ARMCI_SWAP_LONG: armci_get(prem,&_a_ltemp,sizeof(long),proc); armci_put(ploc,prem,sizeof(long),proc); *(long*)ploc = _a_ltemp; break; default: armci_die("rmw: operation not supported",op); } #ifdef VAPI if(!SERVER_CONTEXT) #endif PARMCI_Fence(proc); NATIVE_UNLOCK(lock,proc); } #endif /* ARMCIX */ int PARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { #ifdef LAPI64 extern int LAPI_Rmw64(lapi_handle_t hndl, RMW_ops_t op, uint tgt, long long *tgt_var, long long *in_val, long long *prev_tgt_val, lapi_cntr_t *org_cntr); long long llval, *pllarg = (long long*)ploc, lltmp; /* enable RMWBROKEN if RMW fails for long datatype */ #define RMWBROKEN_ #endif #ifdef LAPI int ival, rc, opcode=SWAP, *parg=ploc; lapi_cntr_t req_id; #elif defined(_CRAYMPP) || defined(QUADRICS) || defined(CRAY_SHMEM) int ival; long lval; #endif #if defined(LAPI64) && defined(RMWBROKEN) /* hack for rmw64 BROKEN: we operate on least significant part of long */ if(op==ARMCI_FETCH_AND_ADD_LONG || op==ARMCI_SWAP_LONG){ ploc[0]=0; ploc[1]=0; ploc++; parg ++; prem++; } #endif #if defined(CLUSTER) && !defined(LAPI) && !defined(QUADRICS) &&!defined(CYGWIN)\ && !defined(HITACHI) && !defined(CRAY_SHMEM) && !defined(PORTALS) if(!SAMECLUSNODE(proc)){ armci_rem_rmw(op, ploc, prem, extra, proc); return 0; } #endif #ifdef REGION_ALLOC if(SAMECLUSNODE(proc)) (void)armci_region_fixup(proc,&prem); #endif #ifdef BGML BGML_Op oper; BGML_Dt dt; void *temp; long ltemp; switch(op) { case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: dt=BGML_SIGNED_INT; temp=(int *)&extra; oper=BGML_SUM; break; #if 0 case ARMCI_FETCH_AND_ADD_LONG: fprintf(stderr,"adding int to longs....\n"); dt=BGML_SIGNED_LONG; ltemp=(long)extra; temp=<emp; oper=BGML_SUM; break; #endif case ARMCI_SWAP: case ARMCI_SWAP_LONG: dt=BGML_SIGNED_INT; oper=BGML_NOOP; temp=(int *)ploc; break; #if 0 case ARMCI_SWAP_LONG: fprintf(stderr,"long armci_swap\n"); dt=BGML_SIGNED_LONG; oper=BGML_NOOP; temp=(long *)ploc; break; #endif default: ARMCI_Error("Invalid operation for RMW", op); } /* int PARMCI_Rmw(int op, int *ploc, int *prem, int extra, int proc) */ /* assumes ploc will change dstbuf=prem, input=temp(extra), output=ploc val=ploc, arr[0]=prem, 1=extra */ int me=armci_msg_me(); BG1S_t request; unsigned done=1; BGML_Callback_t cb_wait={wait_callback, &done}; BG1S_rmw(&request, proc, 0, prem, temp, ploc, oper, dt, &cb_wait, 1); BGML_Wait(&done); #elif ARMCIX ARMCIX_Rmw(op, ploc, prem, extra, proc); #else switch (op) { # if defined(QUADRICS) || defined(_CRAYMPP) || defined(CRAY_SHMEM) case ARMCI_FETCH_AND_ADD: #ifdef SHMEM_FADD /* printf(" calling intfdd arg %x %ld \n", prem, *prem); */ *(int*) ploc = shmem_int_fadd(prem, extra, proc); #elif defined(LIBELAN_ATOMICS) *(int*) ploc = elan_int_fadd(prem, extra, proc); #else while ( (ival = shmem_int_swap(prem, INT_MAX, proc) ) == INT_MAX); (void) shmem_int_swap(prem, ival +extra, proc); *(int*) ploc = ival; #endif break; case ARMCI_FETCH_AND_ADD_LONG: #ifdef SHMEM_FADD *(long*) ploc = shmem_long_fadd( (long*)prem, (long) extra, proc); #elif defined(LIBELAN_ATOMICS) *(long*) ploc = elan_long_fadd( (long*)prem, (long) extra, proc); #else while ((lval=shmem_long_swap((long*)prem,LONG_MAX,proc)) == LONG_MAX); (void) shmem_long_swap((long*)prem, (lval + extra), proc); *(long*)ploc = lval; #endif break; case ARMCI_SWAP: #ifdef LIBELAN_ATOMICS *(int*)ploc = elan_int_swap((int*)prem, *(int*)ploc, proc); #else *(int*)ploc = shmem_int_swap((int*)prem, *(int*)ploc, proc); #endif break; case ARMCI_SWAP_LONG: #ifdef LIBELAN_ATOMICS *(long*)ploc = elan_long_swap((long*)prem, *(long*)ploc, proc); #else *(long*)ploc = shmem_long_swap((long*)prem, *(long*)ploc, proc); #endif break; # elif defined(LAPI) # if defined(LAPI64) && !defined(RMWBROKEN) case ARMCI_FETCH_AND_ADD_LONG: opcode = FETCH_AND_ADD; lltmp = (long long)extra; pllarg = &lltmp; case ARMCI_SWAP_LONG: #if 0 printf("before opcode=%d rem=%ld, loc=(%ld,%ld) extra=%ld\n", opcode,*prem,*(long*)ploc,llval, lltmp); rc= sizeof(long); PARMCI_Get(prem, &llval, rc, proc); printf("%d:rem val before %ld\n",armci_me, llval); fflush(stdout); #endif if( rc = LAPI_Setcntr(lapi_handle,&req_id,0)) armci_die("rmw setcntr failed",rc); if( rc = LAPI_Rmw64(lapi_handle, opcode, proc, (long long*)prem, pllarg, &llval, &req_id)) armci_die("rmw failed",rc); if( rc = LAPI_Waitcntr(lapi_handle, &req_id, 1, NULL)) armci_die("rmw wait failed",rc); *(long*)ploc = (long)llval; #if 0 rc= sizeof(long); PARMCI_Get(prem, &lltmp, rc, proc); printf("%d:after rmw remote val from rmw=%ld and get=%ld extra=%d\n", armci_me,llval, lltmp,extra); #endif break; # endif /************** here sizeof(long)= sizeof(int) **************/ case ARMCI_FETCH_AND_ADD: # if !defined(LAPI64) || defined(RMWBROKEN) case ARMCI_FETCH_AND_ADD_LONG: # endif opcode = FETCH_AND_ADD; parg = &extra; case ARMCI_SWAP: # if !defined(LAPI64) || defined(RMWBROKEN) case ARMCI_SWAP_LONG: # endif /* Within SMPs LAPI_Rmw needs target's address. */ if(SAMECLUSNODE(proc)) proc=armci_me; if( rc = LAPI_Setcntr(lapi_handle,&req_id,0)) armci_die("rmw setcntr failed",rc); if( rc = LAPI_Rmw(lapi_handle, opcode, proc, prem, parg, &ival, &req_id)) armci_die("rmw failed",rc); if( rc = LAPI_Waitcntr(lapi_handle, &req_id, 1, NULL)) armci_die("rmw wait failed",rc); * (int *)ploc = ival; break; # else case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: case ARMCI_SWAP: case ARMCI_SWAP_LONG: armci_generic_rmw(op, ploc, prem, extra, proc); break; # endif default: armci_die("rmw: operation not supported",op); } #endif /*bgml*/ return 0; } ga-5-4/armci/src/xfer/vector.c0000644000175000017500000005422612662210407014335 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: vector.c,v 1.32.6.4 2007-08-29 17:32:32 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif /* void I_ACCUMULATE(void* scale, int elems, void*src, void* dst) { int j; int *a=(int*)dst, *b=(int*)src; int alpha = *(int*)scale; for(j=0;j BUFSIZE/2){ /* for large segments use strided implementation */ for(j=0; j< dr.ptr_array_len; j++){ rc = armci_acc_copy_strided(op, scale,proc, dr.src_ptr_array[j], NULL, dr.dst_ptr_array[j],NULL, &dr.bytes, 0); if(rc)return(rc); } }else{ armci_giov_t dl; /*lock memory:should optimize it to lock only a chunk at a time*/ armci_lockmem_scatter(dr.dst_ptr_array, dr.ptr_array_len, dr.bytes, proc); /* copy as many blocks as possible into the local buffer */ dl.bytes = dr.bytes; nb = ARMCI_MIN(PWORKLEN,BUFSIZE/dr.bytes); for(j=0; j< dr.ptr_array_len; j+= nb){ int nblocks = ARMCI_MIN(nb, dr.ptr_array_len -j); int k; /* setup vector descriptor for remote memory copy to bring data into buffer*/ dl.ptr_array_len = nblocks; dl.src_ptr_array = dr.dst_ptr_array + j; /* GET destination becomes source for copy */ for(k=0; k< nblocks; k++) pwork[k] = k*dl.bytes + (char*)armci_internal_buffer; dl.dst_ptr_array = pwork; /* get data to the local buffer */ rc = armci_copy_vector(GET, &dl, 1, proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} /* update source array for accumulate */ dl.src_ptr_array = dr.src_ptr_array +j; /* do scatter accumulate updating copy of data in buffer */ armci_scatter_acc(op, scale, dl, armci_me, 0); /* modify descriptor-now source becomes destination for PUT*/ dl.dst_ptr_array = dr.dst_ptr_array + j; dl.src_ptr_array = pwork; /* put data back */ rc = armci_copy_vector(PUT, &dl, 1, proc); FENCE_NODE(proc); if(rc){ ARMCI_UNLOCKMEM(proc); return(rc);} } ARMCI_UNLOCKMEM(proc); } }/*endfor*/ } #endif return 0; } int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int i,s,shmem= SAMECLUSNODE(proc); #ifdef LAPI int armci_th_idx = ARMCI_THREAD_IDX; #endif if(shmem ){ /* local/shared memory copy */ for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s],darr[i].bytes); } } }else { /* access through global address space */ /* March 19 - removed FENCE from here - it is in ORDER inside armci.c */ switch(op){ case PUT: for(i = 0; i< len; i++){ #ifdef QUADRICS armcill_putv(proc, darr[i].bytes, darr[i].ptr_array_len, darr[i].src_ptr_array, darr[i].dst_ptr_array); #else # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx],darr[i].ptr_array_len); # endif UPDATE_FENCE_STATE(proc, PUT, darr[i].ptr_array_len); for( s=0; s< darr[i].ptr_array_len; s++){ armci_put(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes, proc); } #endif } break; case GET: for(i = 0; i< len; i++){ #ifdef QUADRICS armcill_getv(proc, darr[i].bytes, darr[i].ptr_array_len, darr[i].src_ptr_array, darr[i].dst_ptr_array); #else # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx],darr[i].ptr_array_len); # endif for( s=0; s< darr[i].ptr_array_len; s++){ armci_get(darr[i].src_ptr_array[s],darr[i].dst_ptr_array[s], darr[i].bytes,proc); } #endif } break; default: armci_die("armci_copy_vector: wrong optype",op); } } #ifdef LAPI if(!shmem){ if(op == GET) CLEAR_COUNTER(get_cntr[armci_th_idx]); /* wait for data arrival */ if(op == PUT) CLEAR_COUNTER(ack_cntr[armci_th_idx]); /* data must be copied out*/ } #endif return 0; } void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(darr[i].src_ptr_array[s],ptr,darr[i].bytes); ptr += darr[i].bytes; } } } void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf) { int i,s; char *ptr = (char*)buf; for(i = 0; i< len; i++){ for( s=0; s< darr[i].ptr_array_len; s++){ armci_copy(ptr, darr[i].dst_ptr_array[s],darr[i].bytes); ptr += darr[i].bytes; } } } int PARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; #if defined(USE_SOCKET_VECTOR_API) int totvec=0; #endif if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(PUT,proc); /* ensure ordering */ #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif /* use direct protocol for remote access when performance is better */ # if defined(LAPI) || defined(PORTALS) # if defined(PORTALS) direct=1; # else if(!direct) if(len <5 || darr[0].ptr_array_len <5) direct=1; # endif # endif #ifdef BGML armci_hdl_t nb_handle; ARMCI_INIT_HANDLE(&nb_handle); PARMCI_NbPutV(darr, len, proc, &nb_handle); PARMCI_Wait(&nb_handle); #elif ARMCIX ARMCIX_PutV (darr, len, proc); #else if(direct) rc = armci_copy_vector(PUT, darr, len, proc); else{ #if defined(DATA_SERVER) && defined(SOCKETS) && defined(USE_SOCKET_VECTOR_API) /*500 is very conservative, the number here should be modified to be based on the size of send/recv buffer*/ if(totvec<500) rc = armci_rem_vector(PUT, NULL, darr, len, proc, 1,NULL); else #endif rc = armci_pack_vector(PUT, NULL, darr, len, proc,NULL); } #endif if(rc) return FAIL6; else return 0; } int PARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; #if defined(USE_SOCKET_VECTOR_API) int totvec=0; #endif if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(GET,proc); /* ensure ordering */ #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif /* use direct protocol for remote access when performance is better */ # if defined(LAPI) || defined(PORTALS) # if defined(PORTALS) direct=1; # else if(!direct) if(len <5 || darr[0].ptr_array_len <8) direct=1; # endif # endif #ifdef BGML armci_hdl_t nb_handle; ARMCI_INIT_HANDLE(&nb_handle); PARMCI_NbGetV(darr, len, proc, &nb_handle); PARMCI_Wait(&nb_handle); #elif ARMCIX ARMCIX_GetV (darr, len, proc); #else if(direct) rc = armci_copy_vector(GET, darr, len, proc); else{ #if defined(DATA_SERVER) && defined(SOCKETS) && defined(USE_SOCKET_VECTOR_API) /*500 is very conservative, the number here should be modified to be based on the size of send/recv buffer*/ if(totvec<500) rc = armci_rem_vector(GET, NULL, darr, len, proc,1,NULL); else #endif rc = armci_pack_vector(GET, NULL, darr, len, proc,NULL); } #endif if(rc) return FAIL6; else return 0; } int PARMCI_AccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ) { int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; ORDER(op,proc); /* ensure ordering */ direct=SAMECLUSNODE(proc); #ifdef BGML armci_hdl_t nb_handle; ARMCI_INIT_HANDLE(&nb_handle); PARMCI_NbAccV(op, scale, darr, len, proc, &nb_handle); PARMCI_Wait(&nb_handle); #elif ARMCIX ARMCIX_AccV (op, scale, darr, len, proc); #else # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct) rc = armci_acc_vector( op, scale, darr, len, proc); else rc = armci_pack_vector(op, scale, darr, len, proc,NULL); #endif if(rc) return FAIL6; else return 0; } /*****************************************************************************/ /*\ Non-blocking vector API \*/ int PARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; #if defined(USE_SOCKET_VECTOR_API) int totvec=0; #endif if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif /* aggregate put */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, PUT, nb_handle); return rc; } } else { /*ORDER(PUT,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = PUT; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = (armci_ihdl_t)armci_set_implicit_handle(PUT, proc); } # if defined(PORTALS) direct=1; # endif if(direct){ #ifdef BGML nb_handle->count = 0; #endif rc = armci_copy_vector(PUT, darr, len, proc); } else{ #ifdef BGML nb_handle->count = 1; BGML_Callback_t cb_wait={wait_callback, &nb_handle->count}; BGML_giov_t *array=(BGML_giov_t *)darr; BG1S_MemputV(&nb_handle->cmpl_info, proc, len, (BGML_giov_t *)darr, 0, &cb_wait, 1); #elif ARMCIX ARMCIX_NbPutV (darr, len, proc, nb_handle); #else #if defined(DATA_SERVER) && defined(SOCKETS) && defined(USE_SOCKET_VECTOR_API) /*500 is very conservative, the number here should be modified to be based on the size of send/recv buffer*/ if(totvec<500) rc = armci_rem_vector(PUT, NULL, darr, len, proc, 1,nb_handle); else #endif rc = armci_pack_vector(PUT, NULL, darr, len, proc,nb_handle); #endif /* BGML */ } if(rc) return FAIL6; else return 0; } int PARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; #if defined(USE_SOCKET_VECTOR_API) int totvec=0; #endif if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; #ifndef QUADRICS direct=SAMECLUSNODE(proc); #endif #if defined(PORTALS) direct=1; #endif /* aggregate get */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct) { rc=armci_agg_save_giov_descriptor(darr, len, proc, GET, nb_handle); return rc; } } else { /* ORDER(GET,proc); ensure ordering */ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = (armci_ihdl_t)armci_set_implicit_handle(GET, proc); } if(direct){ #ifdef BGML nb_handle->count = 0; #endif rc = armci_copy_vector(GET, darr, len, proc); } else{ #ifdef BGML nb_handle->count = 1; BGML_Callback_t cb_wait={wait_callback, &nb_handle->count}; BG1S_MemgetV(&nb_handle->cmpl_info, proc, len, (BGML_giov_t *)darr, 0, &cb_wait, 1); #elif ARMCIX ARMCIX_NbGetV (darr, len, proc, nb_handle); #else #if defined(DATA_SERVER) && defined(SOCKETS) && defined(USE_SOCKET_VECTOR_API) /*500 is very conservative, the number here should be modified to be based on the size of send/recv buffer*/ if(totvec<500) rc = armci_rem_vector(GET, NULL, darr, len, proc,1,nb_handle); else #endif rc = armci_pack_vector(GET, NULL, darr, len, proc,nb_handle); #endif /* BGML */ } if(rc) return FAIL6; else return 0; } int PARMCI_NbAccV( int op, /* oeration code */ void *scale, /*scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /*non-blocking request handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0, i,direct=1; if(len<1) return FAIL; for(i=0;i= armci_nproc)return FAIL5; #ifdef BGML if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = (armci_ihdl_t)armci_set_implicit_handle(op, proc); BGML_Dt dt; switch(op) { case ARMCI_ACC_INT: dt=BGML_SIGNED_INT; break; case ARMCI_ACC_LNG: #if 1 dt=BGML_SIGNED_LONG; #else dt=BGML_SIGNED_INT; #endif break; case ARMCI_ACC_DBL: dt=BGML_DOUBLE; break; case ARMCI_ACC_CPL: dt=BGML_SINGLE_COMPLEX; break; case ARMCI_ACC_FLT: dt=BGML_FLOAT; break; case ARMCI_ACC_DCP: dt=BGML_DOUBLE_COMPLEX; break; default: armci_die("Unsupported data operation\n",0); } nb_handle->count = 1; BGML_Callback_t cb_wait={wait_callback, &nb_handle->count}; BG1S_AccumulateV(&nb_handle->cmpl_info, proc, len, (BGML_giov_t *)darr, scale, 0, dt, BGML_PROD, BGML_SUM, &cb_wait, 1); #else /* ORDER(op,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); direct=SAMECLUSNODE(proc); if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = op; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = (armci_ihdl_t)armci_set_implicit_handle(op, proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif if(direct){ rc = armci_acc_vector( op, scale, darr, len, proc); } else{ rc = armci_pack_vector(op, scale, darr, len, proc,nb_handle); } #endif /* BGML */ if(rc) return FAIL6; else return 0; } /*****************************************************************************/ ga-5-4/armci/src/xfer/strided.c0000644000175000017500000014225112662210407014465 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: strided.c,v 1.117.2.6 2007-08-29 17:46:40 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #include "armci.h" #include "iterator.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #define ARMCI_OP_2D(op, scale, proc, src, dst, bytes, count, src_stride, dst_stride,lockit) \ if(op == GET || op ==PUT) \ armci_copy_2D(op, proc, src, dst, bytes, count, src_stride,dst_stride); \ else if(count==1) armci_acc_1D(op, scale, proc, src, dst, bytes,lockit); \ else \ armci_acc_2D(op, scale, proc, src, dst, bytes, count, src_stride,dst_stride,lockit) /* macro supports run-time selection of request sending scheme */ #if defined(CLIENT_BUF_BYPASS) #define CAN_REQUEST_DIRECTLY _armci_bypass #else # if defined(HITACHI) # define CAN_REQUEST_DIRECTLY 0 # else # define CAN_REQUEST_DIRECTLY 1 # endif #endif #if defined(BGML) || defined(ARMCIX) #define PREPROCESS_STRIDED(tmp_count) #define POSTPROCESS_STRIDED(tmp_count) #else #define PREPROCESS_STRIDED(tmp_count) { \ tmp_count=0; \ if(stride_levels) \ for(;stride_levels;stride_levels--)if(count[stride_levels]>1)break; \ if(stride_levels&&(count[0]==src_stride_arr[0]&&count[0]==dst_stride_arr[0])){ \ tmp_count=seg_count[1]; \ count = seg_count+1; \ seg_count[1] = seg_count[0] * seg_count[1]; \ stride_levels --; \ src_stride_arr ++; dst_stride_arr++ ; \ } \ } #define POSTPROCESS_STRIDED(tmp_count) if(tmp_count)seg_count[1]=tmp_count #endif #define SERVER_GET 1 #define SERVER_NBGET 2 #define DIRECT_GET 3 #define DIRECT_NBGET 4 #define SERVER_PUT 5 #define SERVER_NBPUT 6 #define DIRECT_PUT 7 #define DIRECT_NBPUT 8 #ifdef ALLOW_PIN # define DO_FENCE(__proc,__prot) if(__prot==SERVER_GET); \ else if(__prot==SERVER_PUT); \ else if(__prot==DIRECT_GET || __prot==DIRECT_NBGET){ \ if(armci_prot_switch_fence[__proc]==SERVER_PUT) \ PARMCI_Fence(__proc); \ } \ else if(__prot==DIRECT_PUT || __prot==DIRECT_NBPUT){ \ if(armci_prot_switch_fence[__proc]==SERVER_PUT) \ PARMCI_Fence(__proc); \ } \ else; \ armci_prot_switch_fence[__proc]=__prot #else # define DO_FENCE(__proc,__prot) #endif #ifndef REGIONS_REQUIRE_MEMHDL # define ARMCI_MEMHDL_T void #endif ARMCI_MEMHDL_T *mhloc=NULL,*mhrem=NULL; #ifdef REGIONS_REQUIRE_MEMHDL int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl); # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found_hndl((_s),(_d),(_b),(_p),&mhloc,&mhrem) #else # define ARMCI_REGION_BOTH_FOUND(_s,_d,_b,_p) \ armci_region_both_found((_s),(_d),(_b),(_p)) #endif #ifdef HAS_RDMA_GET # ifdef REGIONS_REQUIRE_MEMHDL void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** cptr,int nbtag,ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl); # else void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** contextptr,int nbtag,void *mhdl,void *mhdl1); # endif # define ARMCI_NBREM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],&((_hdl)->cmpl_info),(_hdl)->tag,(void *)mhloc,(void *)mhrem); \ # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_client_direct_get((_p),(_s),(_d),(_cou)[0],NULL,0,(void *)mhloc,(void *)mhrem) \ #else # define ARMCI_REM_GET(_p,_s,_sst,_d,_dst,_cou,_lev,_hdl) \ armci_rem_get((_p),(_s),(_sst),(_d),(_dst),(_cou),(_lev),(_hdl),(void *)mhloc,(void *)mhrem) # define ARMCI_NBREM_GET ARMCI_REM_GET #endif #ifdef ALLOW_PIN extern int* armci_prot_switch_fence; extern int armci_prot_switch_preproc; extern int armci_prot_switch_preop; #endif int armci_iwork[MAX_STRIDE_LEVEL]; /*\ 2-dimensional array copy \*/ static void armci_copy_2D(int op, int proc, void *src_ptr, void *dst_ptr, int bytes, int count, int src_stride, int dst_stride) { #ifdef LAPI int armci_th_idx = ARMCI_THREAD_IDX; #endif #ifdef LAPI2__ # define COUNT 1 #else # define COUNT count #endif #ifdef __crayx1 int shmem = 1; #else int shmem = SAMECLUSNODE(proc); #endif if(shmem) { /* data is in local/shared memory -- can use memcpy */ if(count==1 && bytes 2) && lockit){ /* we need one lock operation only - must be done outside 2d acc */ armci_lockmem_patch(dst_ptr,dst_stride_arr, count, stride_levels, proc); unlockit=1; lockit =0; } /* if(proc!=armci_me) INTR_OFF;*/ # if defined(LAPI2) || defined(PORTALS) /*|| defined(DOELAN4) && !defined(NB_NONCONT)*/ /*even 1D armci_nbput has to use different origin counters for 1D */ # if defined(LAPI2) if(!ARMCI_ACC(op) && !SAMECLUSNODE(proc) && (nb_handle || (!nb_handle && stride_levels>=1 && count[0]<=LONG_PUT_THRESHOLD))) # elif defined(DOELAN4) && !defined(NB_NONCONT) /*if(!ARMCI_ACC(op) && !SAMECLUSNODE(proc) && nb_handle && stride_levels<2)*/ if(!ARMCI_ACC(op) && !SAMECLUSNODE(proc) && stride_levels<2) # else if(!SAMECLUSNODE(proc)) # endif armci_network_strided(op,scale,proc,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,nb_handle); else # endif switch (stride_levels) { case 0: /* 1D copy */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], 1, count[0], count[0], lockit); break; case 1: /* 2D op */ ARMCI_OP_2D(op, scale, proc, src_ptr, dst_ptr, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); break; case 2: /* 3D op */ for (s2= 0; s2 < count[2]; s2++){ /* 2D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit ); } break; case 3: /* 4D op */ for(s3=0; s3< count[3]; s3++){ src = (char*)src_ptr + src_stride_arr[2]*s3; dst = (char*)dst_ptr + dst_stride_arr[2]*s3; for (s2= 0; s2 < count[2]; s2++){ /* 3D copy */ ARMCI_OP_2D(op, scale, proc, src+s2*src_stride_arr[1], dst+s2*dst_stride_arr[1], count[0], count[1],src_stride_arr[0], dst_stride_arr[0],lockit); } } break; default: /* N-dimensional */ { /* stride_levels is not the same as ndim. it is ndim-1 * For example a 10x10x10... array, suppose the datatype is byte * the stride_arr is 10, 10x10, 10x10x10 .... */ index[2] = 0; unit[2] = 1; total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } ARMCI_OP_2D(op, scale, proc, src, dst, count[0], count[1], src_stride_arr[0], dst_stride_arr[0], lockit); } } } /* deal with non-blocking loads and stores */ #if defined(LAPI) || defined(_ELAN_PUTGET_H) || defined(NB_NONCONT) # if defined(LAPI) if(!nb_handle) # endif { if(!(SAMECLUSNODE(proc))){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } } #endif /* if(proc!=armci_me) INTR_ON;*/ /* __asm__ __volatile__ ("sfence":::"memory"); */ if(unlockit){ # if defined(ACC_COPY) FENCE_NODE(proc); # endif ARMCI_UNLOCKMEM(proc); /* release memory lock */ } return 0; } /**Internal puts function. Combines both blocking and non-blocking * variants. Any use of implicit handles should be outside of this * function. * @param src_ptr pointer to 1st segment at source * @param src_stride_arr array of strides at source * @param dst_ptr pointer to 1st segment at destination * @param dst_stride_arr array of strides at destination * @param seg_count number of segments at each stride levels: count[0]=bytes * @param stride_levels number of stride levels * @param proc remote process(or) ID * @param nbh non-blocking handle (NULL implies blocking call) * @param put_flag Flag to set after the PUT is remote complete (if any) * @return */ static int _armci_puts(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, int proc, armci_ihdl_t nbh, armci_flag_t *put_flag) { int *count=seg_count, tmp_count=0; int rc=0, direct=1; if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; #ifdef __crayx1 if(!stride_levels) { memcpy(dst_ptr, src_ptr,count[0]); return 0; } #endif PREPROCESS_STRIDED(tmp_count); # if (!defined(QUADRICS) || defined(PACKPUT)) direct=SAMECLUSNODE(proc); # endif /*(!QUADRICS||!PACKPUT)&&!PORTALS*/ if(put_flag) dassert(1,nbh==NULL); if(!nbh) { ORDER(PUT,proc);/* ensure ordering */ } else {/* aggregate put */ if(nbh->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, PUT, nbh); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { /*ORDER(PUT,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ nbh->tag = GET_NEXT_NBTAG(); nbh->op = PUT; nbh->proc= proc; nbh->bufid=NB_NONE; } } #ifdef BGML if(nbh) { nbh->count = 1; BGML_Callback_t cb_wait={wait_callback, &nbh->count}; BG1S_MemputS (&nbh->cmpl_info, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, seg_count, stride_levels, 0, &cb_wait, 1); } else if(!stride_levels) { unsigned temp_count=1; BGML_Callback_t cb_wait={wait_callback, &temp_count}; BG1S_t request; BGML_CriticalSection_enter(); BG1S_Memput(&request, proc, src_ptr, 0, dst_ptr, count[0], &cb_wait, 1); /*BGML_Wait(&count);*/ while (temp_count) BGML_Messager_advance(); BGML_CriticalSection_exit(); } else { armci_hdl_t nb_handle; ARMCI_INIT_HANDLE(&nb_handle); PARMCI_NbPutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, &nb_handle); PARMCI_Wait(&nb_handle); } if(put_flag) { /*=>!nbh*/ PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } #elif ARMCIX if(nbh) ARMCIX_NbPutS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nbh); else if(!stride_levels) { ARMCIX_Put(src_ptr, dst_ptr, count[0], proc); } else { ARMCIX_PutS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); } if(put_flag) { /*=>!nbh*/ PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } #else /*BGML*/ /* use direct protocol for remote access when performance is better */ # if defined(LAPI) || defined(DOELAN4) if(!direct) { switch(stride_levels) { case 0: # ifndef LAPI_RDMA direct =1; # endif break; case 1: if((count[1]LONG_PUT_THRESHOLD) direct =1; break; default: if(count[0]> LONG_PUT_THRESHOLD )direct=1; break; } } # endif /*LAPI||DOELAN4*/ # ifdef PORTALS if(stride_levels) direct=1; # endif # if !defined(LAPI2) || defined(LAPI_RDMA) if(!direct){ # ifdef ALLOW_PIN /*if we can pin, we do*/ if(!stride_levels && ARMCI_REGION_BOTH_FOUND(src_ptr,dst_ptr,count[0],armci_clus_id(proc))){ if(nbh) { DO_FENCE(proc,DIRECT_NBPUT); armci_client_direct_send(proc, src_ptr, dst_ptr, count[0], (void **)(&nbh->cmpl_info), nbh->tag,mhloc,mhrem); } else { DO_FENCE(proc,DIRECT_PUT); armci_client_direct_send(proc,src_ptr,dst_ptr,count[0],NULL,0,mhloc,mhrem); } POSTPROCESS_STRIDED(tmp_count); if(put_flag) { PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } return 0; } # if 0 && defined(VAPI) # if !defined(PEND_BUFS) if(stride_levels==1 && count[0]>VAPI_SGPUT_MIN_COLUMN && ARMCI_REGION_BOTH_FOUND(src_ptr,dst_ptr,count[0],armci_clus_id(proc))){ if(nbh) { DO_FENCE(proc,DIRECT_NBPUT); } else { DO_FENCE(proc,DIRECT_PUT); } /* printf("%d:Calling two phase send\n", armci_me); */ armci_two_phase_send(proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count,stride_levels,NULL,nbh,mhloc); if(put_flag) { PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } return 0; } # else /*!PEND_BUFS*/ { int i, off; for(i=0; i0); if(i!=0) assert(src_stride_arr[i]>=src_stride_arr[i-1]*count[i]); } off = (stride_levels>0)? src_stride_arr[stride_levels-1]*count[stride_levels] : count[0]; mhloc=mhrem=NULL; if(ARMCI_REGION_BOTH_FOUND(src_ptr,dst_ptr,off,armci_clus_id(proc))) { assert(mhloc != NULL); assert(mhrem != NULL); if(nbh) { DO_FENCE(proc, DIRECT_NBPUT); armci_client_direct_rdma_strided(PUT,proc,src_ptr,src_stride_arr, dst_ptr,dst_stride_arr, count, stride_levels, (void**)&nbh->cmpl_info,nbh->tag, mhloc,mhrem); } else { DO_FENCE(proc, DIRECT_PUT); armci_client_direct_rdma_strided(PUT,proc,src_ptr,src_stride_arr, dst_ptr,dst_stride_arr, count, stride_levels,NULL,0, mhloc,mhrem); } if(put_flag) { PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } return 0; } } # endif /*!PEND_BUFS*/ # endif /*VAPI*/ # endif /*ALLOW_PIN*/ } #endif /* !LAPI2||LAPI_RDMA */ # ifndef LAPI2 if(!direct){ if(nbh) { DO_FENCE(proc,SERVER_PUT); } else { DO_FENCE(proc,SERVER_NBPUT); } # if defined(DATA_SERVER) && defined(SOCKETS) && defined(USE_SOCKET_VECTOR_API) if(count[0]> LONG_PUT_THRESHOLD && stride_levels>0){ ext_header_t h, *hdr; h.exthdr = put_flag; h.len = sizeof(armci_flag_t); hdr = put_flag?&h:NULL; rc = armci_rem_strided(PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, hdr,1, nbh); } else # endif /*DATA_SERVER && SOCKETS && USE_SOCKET_VECTOR_API*/ { ext_header_t h,*hdr; h.exthdr = put_flag; h.len = sizeof(armci_flag_t); hdr = put_flag?&h:NULL; if(nbh) { nbh->tag =0; /* packed request is completed locally */ CLEAR_HNDL_FIELD(nbh->cmpl_info); } rc = armci_pack_strided(PUT,NULL,proc,src_ptr,src_stride_arr, dst_ptr,dst_stride_arr, count, stride_levels,hdr,-1,-1,-1,NULL); } } else # endif /*!LAPI*/ { if(!nbh && stride_levels == 0) { armci_copy_2D(PUT, proc, src_ptr, dst_ptr, count[0], 1, count[0], count[0]); # if defined(LAPI) || defined(_ELAN_PUTGET_H) if(proc != armci_me) { WAIT_FOR_PUTS; } # endif /*LAPI||_ELAN_PUTGET_H*/ } else { rc = armci_op_strided( PUT, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count,stride_levels, 0,nbh); } if(put_flag) { /*=>!nbh*/ PARMCI_Fence(proc); PARMCI_Put(&put_flag->val,put_flag->ptr,sizeof(int),proc); } } #endif /*BGML*/ POSTPROCESS_STRIDED(tmp_count); if(rc) return FAIL6; else return 0; } int PARMCI_PutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { #if 1 return _armci_puts(src_ptr,src_stride_arr,dst_ptr,dst_stride_arr, seg_count,stride_levels,proc,NULL,NULL); #else armci_hdl_t nbh; ARMCI_INIT_HANDLE(&nbh); PARMCI_NbPutS(src_ptr,src_stride_arr,dst_ptr,dst_stride_arr,seg_count,stride_levels,proc,&nbh); PARMCI_Wait(&nbh); return 0; #endif } int PARMCI_PutS_flag_dir(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, int *flag, int val, int proc) { return PARMCI_PutS_flag(src_ptr, src_stride_arr,dst_ptr,dst_stride_arr, seg_count, stride_levels, flag, val, proc); } int PARMCI_PutS_flag(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, int *flag, int val, int proc) { armci_flag_t put_flag; put_flag.val=val; put_flag.ptr=flag; return _armci_puts(src_ptr,src_stride_arr,dst_ptr,dst_stride_arr,seg_count,stride_levels,proc,NULL,&put_flag); } int PARMCI_GetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { armci_hdl_t nbh; ORDER(GET,proc); ARMCI_INIT_HANDLE(&nbh); PARMCI_NbGetS(src_ptr,src_stride_arr,dst_ptr,dst_stride_arr,seg_count,stride_levels,proc,&nbh); PARMCI_Wait(&nbh); return 0; } /**Internal strided accumulate. Implicit handles should be used * outsise this function. * @param optype operation * @param scale scale factor x += scale*y * @param src_ptr pointer to 1st segment at source * @param src_stride_arr[] array of strides at source * @param dst_ptr 1st segment at destination * @param dst_stride_arr[] array of strides at destination * @param seg_count[] number of segments at each stride * levels: count[0]=bytes * @param stride_levels number of stride levels * @param proc remote process(or) ID * @param nbh armci non-blocking call handle * @return */ static int _armci_accs( int optype, void *scale, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int seg_count[],int stride_levels, int proc, armci_ihdl_t nbh) { int rc, direct=1; int *count=seg_count, tmp_count=0; if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(src_stride_arr == NULL || dst_stride_arr ==NULL) return FAIL2; if(count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; if(!nbh) { ORDER(optype,proc); } else { UPDATE_FENCE_INFO(proc); nbh->tag = GET_NEXT_NBTAG(); nbh->op = optype; nbh->proc= proc; nbh->bufid=NB_NONE; } PREPROCESS_STRIDED(tmp_count); #ifdef BGML armci_ihdl_t inbh; armci_hdl_t tmp_hdl; if(nbh) inbh = nbh; else { ARMCI_INIT_HANDLE(&tmp_hdl); inbh = (armci_ihdl_t)&tmp_hdl; } inbh->count=1; BGML_Callback_t cb_wait={wait_callback, &inbh->count}; BGML_Op oper1=BGML_PROD; BGML_Op oper2=BGML_SUM; BGML_Dt dt; switch(optype) { case ARMCI_ACC_INT: case ARMCI_ACC_LNG: dt=BGML_SIGNED_INT; break; #if 0 case ARMCI_ACC_LNG: dt=BGML_SIGNED_LONG; break; #endif case ARMCI_ACC_DBL: dt=BGML_DOUBLE; break; case ARMCI_ACC_CPL: dt=BGML_SINGLE_COMPLEX; break; case ARMCI_ACC_DCP: dt=BGML_DOUBLE_COMPLEX; break; case ARMCI_ACC_FLT: dt=BGML_FLOAT; break; default: assert(0); } BG1S_AccumulateS (&inbh->cmpl_info, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, seg_count, stride_levels, scale, 0, dt, oper1, oper2, &cb_wait, 1); if(!nbh) PARMCI_Wait(&tmp_hdl); #elif ARMCIX if(!nbh) ARMCIX_AccS (optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); else ARMCIX_NbAccS (optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nbh); #else direct=SAMECLUSNODE(proc); # if defined(ACC_COPY) && !defined(ACC_SMP) if(armci_me != proc) direct=0; # endif /*ACC_COPY && !ACC_SMP*/ if(direct) rc = armci_op_strided(optype,scale, proc, src_ptr, src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels,1,NULL); else{ if(nbh) { DO_FENCE(proc,SERVER_NBPUT); } else { DO_FENCE(proc,SERVER_PUT); } rc = armci_pack_strided(optype,scale,proc,src_ptr, src_stride_arr,dst_ptr, dst_stride_arr,count,stride_levels,NULL,-1,-1,-1,nbh); } #endif /*BGML*/ POSTPROCESS_STRIDED(tmp_count); if(rc) return FAIL6; else return 0; } int PARMCI_AccS( int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ) { return _armci_accs(optype,scale,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,seg_count,stride_levels,proc,NULL); } int PARMCI_Put(void *src, void* dst, int bytes, int proc) { int rc=0; rc = PARMCI_PutS(src, NULL, dst, NULL, &bytes, 0, proc); return rc; } int PARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc) { int rc=0; rc = PARMCI_AccS(optype, scale, src, NULL, dst, NULL, &bytes, 0, proc); return rc; } int PARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc) { return PARMCI_PutS_flag(src, NULL, dst, NULL, &bytes, 0, f, v, proc); } int PARMCI_Get(void *src, void* dst, int bytes, int proc) { int rc=0; #ifdef __crayx1 memcpy(dst,src,bytes); #else rc = PARMCI_GetS(src, NULL, dst, NULL, &bytes, 0, proc); #endif dassert(1,rc==0); return rc; } #define PACK1D 1 #if PACK1D # define armci_read_strided1 armci_read_strided # define armci_write_strided1 armci_write_strided #else # define armci_read_strided2 armci_read_strided # define armci_write_strided2 armci_write_strided #endif void armci_write_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { const int seg_size = count[0]; int off=0; stride_info_t sinfo; armci_stride_info_init(&sinfo, ptr,stride_levels,stride_arr,count); while(armci_stride_info_has_more(&sinfo)) { char *sptr = armci_stride_info_seg_ptr(&sinfo); armci_copy(sptr,&buf[off],seg_size); off += seg_size; armci_stride_info_next(&sinfo); } armci_stride_info_destroy(&sinfo); } void armci_write_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; if(stride_levels == 0){ armci_copy( ptr, buf, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE ) armci_write_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY21(&rows, count+1, ptr, &ld, (void*)buf, &idx); break; case 2: #if 0 for(i=0; i< count[2]; i++){ DCOPY21(&rows, count+1, ptr, &ld, buf, &idx); ptr = ((char*)ptr)+stride_arr[1]; buf = (char*) ((double*)buf + idx); } #endif ldd = stride_arr[1]/stride_arr[0]; DCOPY31(&rows, count+1, count+2, ptr, &ld, &ldd, (void*)buf, &idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY21(&rows, count+1, (void*)src, &ld, (void*)buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ } void armci_read_strided1(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { const int seg_size = count[0]; int off=0; stride_info_t sinfo; armci_stride_info_init(&sinfo,ptr,stride_levels,stride_arr,count); while(armci_stride_info_has_more(&sinfo)) { char *dptr = armci_stride_info_seg_ptr(&sinfo); armci_copy(&buf[off],dptr,seg_size); off += seg_size; armci_stride_info_next(&sinfo); } armci_stride_info_destroy(&sinfo); } void armci_read_strided2(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf) { int i, j; int total; /* number of 2 dim block */ int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; if(stride_levels == 0){ armci_copy( buf, ptr, count[0]); }else if (count[0]%ALIGN_SIZE || (unsigned long)ptr%ALIGN_SIZE) armci_read_strided1(ptr,stride_levels, stride_arr,count,buf); else { int rows, ld, idx, ldd; char *src; rows = count[0]/8; ld = stride_arr[0]/8; switch(stride_levels){ case 1: DCOPY12(&rows, count+1, ptr, &ld, (void*)buf, &idx); break; case 2: #if 0 for(i=0; i< count[2]; i++){ DCOPY12(&rows, count+1, ptr, &ld, buf, &idx); ptr = ((char*)ptr)+stride_arr[1]; buf = (char*) ((double*)buf + idx); } #endif ldd = stride_arr[1]/stride_arr[0]; DCOPY13(&rows, count+1, count+2, ptr, &ld, &ldd, (void*)buf, &idx); break; default: index[2] = 0; unit[2] = 1; total = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } DCOPY12(&rows, count+1, (void*)src, &ld, (void*)buf, &idx); buf = (char*) ((double*)buf + idx); } } /*switch */ } /*else */ } /**Read data from buffer into the locations pointed to by the stride * iterator. The reading happens incrementally. The stride iterator is * traversed to copy as much data as possible in the buffer. When all * the data in buf is consumed the function returns with the number of * bytes consumed from the buffer. * @param sinfo Stride iterator * @param buf IN Pointer to data to be read into user memory * @param bytes IN #bytes available in buf for reading * @param seg_off INOUT Bytes of the current segment written in the * last call (on partial segment write). On return, this parameter * contains the bytes of the last segment written if it was partial. * @return #bytes read from buf into user memory. */ int armci_read_strided_inc(stride_info_t *sinfo, const char *buf,int bytes, int *seg_off) { int off=0; const int seg_size = armci_stride_info_seg_size(sinfo); dassert1(1,bytes>0,bytes); off=0; if(*seg_off) { char *sptr = (char*) &buf[off]; char *dptr = ((char*)armci_stride_info_seg_ptr(sinfo))+*seg_off; int size = ARMCI_MIN(seg_size-*seg_off,bytes); /* printf("%d:%s(): seg_size=%d,seg_off=%d,bytes=%d\n",armci_me,FUNCTION_NAME,seg_size,*seg_off,bytes); */ dassert(1,armci_stride_info_has_more(sinfo)); armci_copy(sptr,dptr,size); off += size; if(*seg_off+size == seg_size) { armci_stride_info_next(sinfo); } } while(bytes>off) { int size = ARMCI_MIN(seg_size, bytes-off); dassert(1,armci_stride_info_has_more(sinfo)); armci_copy(&buf[off],armci_stride_info_seg_ptr(sinfo),size); if(size==seg_size) armci_stride_info_next(sinfo); off += size; } dassertp(1,off==bytes,("%d:off=%d bytes=%d",armci_me,off,bytes)); *seg_off = (bytes + *seg_off) % seg_size; return bytes; } #define INIT_NB_HANDLE(nb,o,p) if(nb){ \ (nb)->tag = 0; \ (nb)->op = (o); (nb)->proc= (p); \ (nb)->bufid=NB_NONE;} \ else { (nb)=(armci_ihdl_t)armci_set_implicit_handle(o, p); (nb)->tag=0; } /*\Non-Blocking API \*/ int PARMCI_NbPutS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { if(!usr_hdl) usr_hdl = armci_set_implicit_handle(PUT, proc); return _armci_puts(src_ptr, src_stride_arr,dst_ptr,dst_stride_arr, seg_count,stride_levels,proc,(armci_ihdl_t)usr_hdl,NULL); } int PARMCI_NbGetS( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: byte_count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int rc=0,direct=1; int *count=seg_count, tmp_count=0; if(src_ptr == NULL || dst_ptr == NULL) return FAIL; if(seg_count[0]<0)return FAIL3; if(stride_levels <0 || stride_levels > MAX_STRIDE_LEVEL) return FAIL4; if(proc<0)return FAIL5; #ifdef BGML armci_ihdl_t nbh; set_nbhandle(&nbh, usr_hdl, PUT, proc); nbh->count=1; BGML_Callback_t cb_wait={wait_callback, &nbh->count}; BG1S_MemgetS (&nbh->cmpl_info, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, seg_count, stride_levels, 0, &cb_wait, 1); #else #if !defined(QUADRICS) direct=SAMECLUSNODE(proc); #endif PREPROCESS_STRIDED(tmp_count); /* aggregate get */ if(nb_handle && nb_handle->agg_flag == SET) { if(!direct){ rc= armci_agg_save_strided_descriptor(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, GET, nb_handle); POSTPROCESS_STRIDED(tmp_count); return(rc); } } else { /* ORDER(GET,proc); ensure ordering */ UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else nb_handle = (armci_ihdl_t)armci_set_implicit_handle(GET, proc); } #ifdef LAPI_RDMA if(stride_levels == 0 || count[0] > LONG_GET_THRESHOLD) direct=0; #endif #ifdef PORTALS if(stride_levels) direct=1; #endif #if !defined(LAPI2) || defined(LAPI_RDMA) if(!direct){ # ifdef ALLOW_PIN #if defined(VAPI) extern int armci_max_num_sg_ent; #endif if(!stride_levels && ARMCI_REGION_BOTH_FOUND(dst_ptr,src_ptr,count[0],armci_clus_id(proc))){ DO_FENCE(proc,DIRECT_NBGET); ARMCI_NBREM_GET(proc, src_ptr,NULL,dst_ptr,NULL,count, 0, nb_handle); POSTPROCESS_STRIDED(tmp_count); return 0; } # endif } #endif /*!LAPI||LAPI_RDMA */ #ifndef LAPI2 if(!direct){ DO_FENCE(proc,SERVER_NBGET); #if defined(DATA_SERVER) && (defined(SOCKETS) || defined(CLIENT_BUF_BYPASS) ) /* for larger strided or 1D reqests buffering can be avoided to send data * we can try to bypass the packetization step and send request directly */ if(CAN_REQUEST_DIRECTLY && ((count[0]> LONG_GET_THRESHOLD) || (stride_levels && count[0]>LONG_GET_THRESHOLD_STRIDED) ) ) { int nobuf =1; /* tells the sending routine not to buffer */ rc = armci_rem_strided(GET, NULL, proc,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels, (ext_header_t*)0,nobuf,nb_handle); if(rc) goto DefaultPath; /* attempt to avoid buffering failed */ }else DefaultPath: /* standard buffered path */ #endif #ifdef ARMCIX rc = ARMCIX_NbGetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); #else rc = armci_pack_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels, NULL,-1,-1,-1,nb_handle); #endif }else #else /* avoid LAPI_GetV */ if(stride_levels==1 && count[0]>320 && !direct) ARMCI_REM_GET(proc,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr, count, stride_levels, nb_handle); else #endif rc = armci_op_strided(GET, NULL, proc, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,count, stride_levels,0,nb_handle); POSTPROCESS_STRIDED(tmp_count); #endif /*bgml*/ if(rc) return FAIL6; else return 0; } int PARMCI_NbAccS( int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int seg_count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* usr_hdl /* armci non-blocking call handle*/ ) { if(!usr_hdl) usr_hdl = armci_set_implicit_handle(optype, proc); return _armci_accs(optype,scale,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,seg_count,stride_levels,proc,(armci_ihdl_t)usr_hdl); } #if !defined(ACC_COPY)&&!defined(CRAY_YMP)&&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML)&&!defined(DCMF) # define REMOTE_OP #endif void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc) { if(nb_handle) { *nbh=(armci_ihdl_t)nb_handle; } else { *nbh=(armci_ihdl_t)armci_set_implicit_handle(op, proc); } } int PARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc; rc = PARMCI_NbPutS(src,NULL,dst,NULL,&bytes,0,proc,uhandle); return(rc); } int PARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* uhandle) { int rc; rc=PARMCI_NbGetS(src,NULL,dst,NULL,&bytes,0,proc,uhandle); return(rc); } static void _armci_op_value(int op, void *src, void *dst, int proc, int bytes, armci_hdl_t *usr_hdl) { int rc=0,pv=0; #ifdef LAPI int armci_th_idx = ARMCI_THREAD_IDX; #endif armci_ihdl_t nbh = (armci_ihdl_t)usr_hdl; if(!nbh) { ORDER(op,proc); /* ensure ordering */ }else { if(nbh->agg_flag == SET) { if(op==PUT) pv = 1; (void)armci_agg_save_descriptor(src,dst,bytes,proc,op,pv,nbh); return; } else { if(op==PUT) UPDATE_FENCE_INFO(proc); /*set tag and op in the nb handle*/ nbh->tag = GET_NEXT_NBTAG(); nbh->op = op; nbh->proc= proc; nbh->bufid=NB_NONE; } } #if defined(REMOTE_OP) && !defined(QUADRICS) rc = armci_rem_strided(op, NULL, proc, src, NULL, dst, NULL, &bytes, 0, NULL, 0, nbh); if(rc) armci_die("ARMCI_Value: armci_rem_strided incomplete", FAIL6); #else if(op==PUT) { UPDATE_FENCE_STATE(proc, PUT, 1); # ifdef LAPI SET_COUNTER(ack_cntr[armci_th_idx], 1); # endif # if defined(BGML) || defined(ARMCIX) if(usr_hdl) PARMCI_NbPut(src,dst,bytes,proc,usr_hdl); else PARMCI_Put(src,dst,bytes,proc); # else armci_put(src, dst, bytes, proc); # endif } else { # ifdef LAPI SET_COUNTER(get_cntr[armci_th_idx], 1); # endif # if defined(BGML) || defined(ARMCIX) if(usr_hdl) PARMCI_NbGet(src,dst,bytes,proc,usr_hdl); else PARMCI_Get(src,dst,bytes,proc); # else armci_get(src, dst, bytes, proc); # endif } /* deal with non-blocking loads and stores */ # if defined(LAPI) || defined(_ELAN_PUTGET_H) # ifdef LAPI if(!nbh) # endif { if(proc != armci_me){ if(op == GET){ WAIT_FOR_GETS; /* wait for data arrival */ }else { WAIT_FOR_PUTS; /* data must be copied out*/ } } } # endif #endif } static void _armci_rem_value(int op, void *src, void *dst, int proc, int bytes) { _armci_op_value(op,src,dst,proc,bytes,NULL); } /* non-blocking remote value put/get operation */ static void _armci_nb_rem_value(int op, void *src, void *dst, int proc, int bytes, armci_hdl_t *usr_hdl) { if(!usr_hdl) usr_hdl = (armci_hdl_t*)armci_set_implicit_handle(op,proc); _armci_op_value(op,src,dst,proc,bytes,usr_hdl); } #define CHK_ERR(dst, proc) \ if(dst==NULL) armci_die("ARMCI_PutValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("ARMCI_PutValue: Invalid process rank", proc); #define CHK_ERR_GET(src, dst, proc, bytes) \ if(src==NULL || dst==NULL) armci_die("ARMCI_GetValue: NULL pointer passed",FAIL); \ if(proc<0) armci_die("ARMCI_GetValue: Invalid process rank", proc); \ if(bytes<0) armci_die("ARMCI_GetValue: Invalid size", bytes); /** * Register-Originated Put. */ int PARMCI_PutValueInt(int src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(int)); return 0; } int PARMCI_PutValueLong(long src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(long)); return 0; } int PARMCI_PutValueFloat(float src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(float)); return 0; } int PARMCI_PutValueDouble(double src, void *dst, int proc) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_rem_value(PUT, &src, dst, proc, sizeof(double)); return 0; } /** * Non-Blocking register-originated put. */ int PARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(int *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(int),usr_hdl); return 0; } int PARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(long *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(long),usr_hdl); return 0; } int PARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(float *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(float),usr_hdl); return 0; } int PARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t* usr_hdl) { CHK_ERR(dst, proc); if( SAMECLUSNODE(proc) ) *(double *)dst = src; else _armci_nb_rem_value(PUT,&src,dst,proc,sizeof(double),usr_hdl); return 0; } /** * Register-Originated Get. */ int PARMCI_GetValueInt(void *src, int proc) { int dst; if (SAMECLUSNODE(proc)) return *(int *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(int)); return dst; } long PARMCI_GetValueLong(void *src, int proc) { long dst; if (SAMECLUSNODE(proc)) return *(long *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(long)); return dst; } float PARMCI_GetValueFloat(void *src, int proc) { float dst; if (SAMECLUSNODE(proc)) return *(float *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(float)); return dst; } double PARMCI_GetValueDouble(void *src, int proc) { double dst; if(SAMECLUSNODE(proc)) return *(double *)src; else _armci_rem_value(GET, src, &dst, proc, sizeof(double)); return dst; } ga-5-4/armci/src/xfer/caccumulate.c0000644000175000017500000005767112662210407015330 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ /*********************************************************************** * accumulate operation for the following datatypes: * real, double precision, complex, double complex, integer * * WARNING: This file must be compiled WITH optimization under AIX. * IBM fortran compilers generate bad code with -g option. * * Two versions of each routine are provided: * original and unrolled loops. * ***********************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "acc.h" #if 0 subroutine d_accumulate_1d(alpha, A, B, rows) integer rows, r double precision A(*), B(*), alpha ccdir$ no_cache_alloc a,b do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_d_accumulate_1d_(const double* const restrict alpha, double* restrict A, const double* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine d_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha ccdir$ no_cache_alloc a,b do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_d_accumulate_2d_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_1d(alpha, A, B, rows) integer rows, r real A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine f_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_f_accumulate_2d_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_1d(alpha, A, B, rows) integer rows, r double complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine z_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_c_accumulate_2d_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_1d(alpha, A, B, rows) integer rows, r complex A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i].real += (*alpha).real * B[i].real - (*alpha).imag * B[i].imag; A[i].imag += (*alpha).imag * B[i].real + (*alpha).real * B[i].imag; } return; } #if 0 subroutine c_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_z_accumulate_2d_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ) { for ( r = 0 ; r < (*rows) ; r++ ) { A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha do c = 1, cols do r = 1, rows A(r,c) = A(r,c)+ alpha*B(r,c) enddo enddo end #endif void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows) { int i; for ( i = 0 ; i < (*rows) ; i++ ){ A[i] += (*alpha) * B[i]; } return; } #if 0 subroutine i_accumulate_1d(alpha, A, B, rows) integer rows, r integer A(*), B(*), alpha do r = 1, rows A(r) = A(r)+ alpha*B(r) enddo end #endif void c_i_accumulate_2d_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine d_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*), alpha integer r1 doubleprecision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_d_accumulate_2d_u_(const double* const alpha, const int* const rows, const int* const cols, double* restrict A, const int* const ald, const double* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine f_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld real A(ald,*), B(bld,*), alpha integer r1 real d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) + alpha*b(r,c) d2 = a(r+1,c) + alpha*b(r+1,c) d3 = a(r+2,c) + alpha*b(r+2,c) d4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = d1 a(r+1,c) = d2 a(r+2,c) = d3 a(r+3,c) = d4 enddo enddo end #endif void c_f_accumulate_2d_u_(const float* const alpha, const int* const rows, const int* const cols, float* restrict A, const int* const ald, const float* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 subroutine z_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double complex A(ald,*), B(bld,*), alpha integer r1 double complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_c_accumulate_2d_u_(const complex_t* const alpha, const int* const rows, const int* const cols, complex_t* restrict A, const int* const ald, const complex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine c_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld complex A(ald,*), B(bld,*), alpha integer r1 complex x1, x2, x3, x4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 x1 = a(r,c) + alpha*b(r,c) x2 = a(r+1,c) + alpha*b(r+1,c) x3 = a(r+2,c) + alpha*b(r+2,c) x4 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = x1 a(r+1,c) = x2 a(r+2,c) = x3 a(r+3,c) = x4 enddo enddo end #endif void c_z_accumulate_2d_u_(const dcomplex_t* const alpha, const int* const rows, const int* const cols, dcomplex_t* restrict A, const int* const ald, const dcomplex_t* const B, const int* const bld) { int r, c; int jA, jB; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ jA = c * (*ald) + r; jB = c * (*bld) + r; A[ jA ].real += (*alpha).real * B[ jB ].real - (*alpha).imag * B[ jB ].imag; A[ jA ].imag += (*alpha).imag * B[ jB ].real + (*alpha).real * B[ jB ].imag; A[ jA+1 ].real += (*alpha).real * B[ jB+1 ].real - (*alpha).imag * B[ jB+1 ].imag; A[ jA+1 ].imag += (*alpha).imag * B[ jB+1 ].real + (*alpha).real * B[ jB+1 ].imag; A[ jA+2 ].real += (*alpha).real * B[ jB+2 ].real - (*alpha).imag * B[ jB+2 ].imag; A[ jA+2 ].imag += (*alpha).imag * B[ jB+2 ].real + (*alpha).real * B[ jB+2 ].imag; A[ jA+3 ].real += (*alpha).real * B[ jB+3 ].real - (*alpha).imag * B[ jB+3 ].imag; A[ jA+3 ].imag += (*alpha).imag * B[ jB+3 ].real + (*alpha).real * B[ jB+3 ].imag; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ].real += (*alpha).real * B[ c * (*bld) + r ].real - (*alpha).imag * B[ c * (*bld) + r ].imag; A[ c * (*ald) + r ].imag += (*alpha).imag * B[ c * (*bld) + r ].real + (*alpha).real * B[ c * (*bld) + r ].imag; } } return; } #if 0 subroutine i_accumulate_2d_u(alpha, rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld integer A(ald,*), B(bld,*), alpha integer r1, j2, j3, j4, j5 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 a(r,c) = a(r,c) + alpha*b(r,c) end do do r = r1 + 1, rows, 4 j2 = a(r,c) + alpha*b(r,c) j3 = a(r+1,c) + alpha*b(r+1,c) j4 = a(r+2,c) + alpha*b(r+2,c) j5 = a(r+3,c) + alpha*b(r+3,c) a(r,c) = j2 a(r+1,c) = j3 a(r+2,c) = j4 a(r+3,c) = j5 enddo enddo end #endif void c_i_accumulate_2d_u_(const int* const alpha, const int* const rows, const int* const cols, int* restrict A, const int* const ald, const int* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_l_accumulate_2d_u_(const long* const alpha, const int* const rows, const int* const cols, long* restrict A, const int* const ald, const long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } void c_ll_accumulate_2d_u_(const long long* const alpha, const int* const rows, const int* const cols, long long* restrict A, const int* const ald, const long long* const B, const int* const bld) { int r, c; int m = (*rows) - ((*rows)%4); for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < m ; r+=4 ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; A[ c * (*ald) + r+1 ] += (*alpha) * B[ c * (*bld) + r+1 ]; A[ c * (*ald) + r+2 ] += (*alpha) * B[ c * (*bld) + r+2 ]; A[ c * (*ald) + r+3 ] += (*alpha) * B[ c * (*bld) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] += (*alpha) * B[ c * (*bld) + r ]; } } return; } #if 0 c---------- operations used in armci gops -------------- c subroutine fort_dadd(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) + work(i) enddo end #endif void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] += work[i]; } return; } #if 0 subroutine fort_dadd2(n, x, work, work2) integer n,i double precision x(n), work(n), work2(n) do i= 1,n x(i) = work(i) + work2(i) enddo end #endif void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] + work2[i]; } return; } #if 0 subroutine fort_dmult(n, x, work) integer n,i double precision x(n), work(n) do i= 1,n x(i) = x(i) * work(i) enddo end #endif void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] *= work[i]; } return; } #if 0 subroutine fort_dmult2(n, x, work,work2) integer n,i double precision x(n), work(n) do i= 1,n x(i) = work(i)*work2(i) enddo end #endif void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2) { int i; for ( i = 0 ; i < (*n) ; i++ ){ x[i] = work[i] * work2[i]; } return; } ga-5-4/armci/src/util/0000755000175000017500000000000012662210413012664 5ustar mbambaga-5-4/armci/src/util/threads.c0000644000175000017500000000675512662210413014477 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: threads.c,v 1.1.2.5 2007-08-28 21:29:46 manoj Exp $ */ #if 0 # define PRNDBG3(m,a1,a2,a3) \ fprintf(stderr,"DBG %d: " m,armci_me,a1,a2,a3);fflush(stderr) # define PRNDBG(m) PRNDBG3(m,0,0,0) # define PRNDBG1(m,a1) PRNDBG3(m,a1,0,0) # define PRNDBG2(m,a1,a2) PRNDBG3(m,a1,a2,0) #else # define PRNDBG(m) # define PRNDBG1(m,a1) # define PRNDBG2(m,a1,a2) # define PRNDBG3(m,a1,a2,a3) #endif #if HAVE_STDIO_H # include #endif #include "armcip.h" armci_user_threads_t armci_user_threads; void armci_init_threads() { int i, bytes; char *uval = getenv("ARMCI_MAX_THREADS"); armci_user_threads.max = 1; armci_user_threads.avail = 0; if (uval != NULL) sscanf(uval, "%d", &armci_user_threads.max); if (armci_user_threads.max < 1 || armci_user_threads.max > ARMCI_THREADS_LIMIT) { printf("Error: Only 1-%d threads are supported. ",ARMCI_THREADS_LIMIT); printf("Set ARMCI_MAX_THREADS appropriately\n"); fflush(stdout); armci_die("armci_init_threads: failed", 0); } bytes = sizeof(thread_id_t) * armci_user_threads.max; if ( !(armci_user_threads.ids = (thread_id_t*) malloc(bytes)) ) { armci_die("armci_init_threads: armci_user_threads.ids malloc failed", armci_user_threads.max); } memset(armci_user_threads.ids, 0, bytes); #if 0 /* spinlock has void return value */ if (THREAD_LOCK_INIT(armci_user_threads.lock) || THREAD_LOCK_INIT(armci_user_threads.buf_lock) || THREAD_LOCK_INIT(armci_user_threads.net_lock)) armci_die("armci_init_threads:locks initialization failed", 0); #else THREAD_LOCK_INIT(armci_user_threads.lock); THREAD_LOCK_INIT(armci_user_threads.buf_lock); THREAD_LOCK_INIT(armci_user_threads.net_lock); #endif #if 0 /* using one lock per socket for now, it might be feasible (and usefull) * to use two (one for sending and one for receiving) */ armci_user_threads.sock_locks = malloc(armci_nclus *sizeof(thread_lock_t)); for (i = 0; i < armci_nclus; i++) if (THREAD_LOCK_INIT(armci_user_threads.sock_locks[i])) armci_die("armci_init_threads:sock locks initialization failed", i); #endif } void armci_finalize_threads() { THREAD_LOCK_DESTROY(armci_user_threads.lock); THREAD_LOCK_DESTROY(armci_user_threads.net_lock); THREAD_LOCK_DESTROY(armci_user_threads.buf_lock); free(armci_user_threads.ids); } /* calling armci_thread_idx for every function that accesses thread-private data * might be expensive -- needs optiomization */ INLINE int armci_thread_idx() { int i, n = ARMCI_MIN(armci_user_threads.avail, armci_user_threads.max); thread_id_t id = THREAD_ID_SELF(); for (i = 0; i < n; i++) if (id == armci_user_threads.ids[i]) { /*PRNDBG2("thread id=%ld already registered, idx=%d\n", id, i);*/ return i; } /* see this thread for the first time */ return armci_register_thread(id); } INLINE int armci_register_thread(thread_id_t id) { int i; THREAD_LOCK(armci_user_threads.lock); i = armci_user_threads.avail; armci_user_threads.avail++; THREAD_UNLOCK(armci_user_threads.lock); if (i < armci_user_threads.max) armci_user_threads.ids[i] = id; else armci_die("armci_thread_idx: too many threads, adjust ARMCI_MAX_THREADS", armci_user_threads.avail); PRNDBG2("registered a new thread: idx=%d, id=%ld\n", i, id); return i; } ga-5-4/armci/src/util/armci_cpp0000755000175000017500000002734212662210413014557 0ustar mbamba#!/usr/bin/env perl # This script is designed to preprocess selected #if defined(), #ifdef # and #ifndef # statements in source code. The syntax for using this # script is # # ./armci_cpp SYMBOL1 SYMBOL2 SYMBOL3 .... SYMBOLN # # where SYMBOL refers to arguments that appear in the #if, #ifdef, # #ifndef statements. This script will process ALL files in the # directory in which it is run. This is done so that symbols defined # in include files can be added to the list of symbols used by the # script to parse the files. The files produced by the parser will have # a .new extension. The parser also produces a fairly large amount of # debugging output to standard IO. This can be ignored. # # An example invocation of armci_cpp is as follows: # # armci_cpp __ia64 LINUX64 LINUX SYSV PTHREADS DATA_SERVER \ # SERVER_THREAD _REENTRANT VAPI ALLOW_PIN PEND_BUFS REF_THREAD_SAFE \ # MPI OPENIB # # Symbols that end in _H and _H_ are handled differently if they # appear in .h files. The code bracketed by these symbols is parsed if # the symbol exists, even though it is using the #ifndef syntax. # # Note that this parser will probably not produce compilable code. There # are a few instances where symbols are defined if a comparative # relation is satisfied (e.g. SYMBOL_A < SYMBOL_B) and this causes some # symbols to be left out of the symbol table and some parts of the code # to be incorrectly parsed. The parser will, however, give an rough idea # of what post process code will look like. # $numargs = @ARGV; if ($numargs == 0) { print "No environment settings specified\n"; print "Usage: ./armci_cpp SYMBOL1 SYMBOL2 SYMBOL3 .... SYMBOLN\n"; exit(0); } # Get environment settings and use these to file the symbol list %arg_symbols = {}; for ($i=0; $i<$numargs; $i++) { print "ARGV[$i]: $ARGV[$i]\n"; $arg_symbols{$ARGV[$i]} = 1; } # Get a list of all files in the directory opendir(MYDIR,"./"); @tfiles = readdir(MYDIR); closedir(MYDIR); $num_files = @tfiles; # Scan the include files for symbols for ($ifile=0; $ifile<$num_files; $ifile++) { if ($tfiles[$ifile] =~ /\.h$/ || $tfiles[$ifile] =~ /\.c$/) { $level = 0; %symbols = {}; %symbols = %arg_symbols; %header_symbols = {}; # Initialize file variable @state = (); $state[0] = 1; @save_cpp = (); $save_cpp[0] = 0; @once_true = (); $once_true[0] = 1; @parse_else = (); $parse_else[0] = 0; @ignore = (); $ignore[0] = 0; $newfile = ""; $continuation_cnt = 0; # $file_level = 0; @parsing_header = (); $parsing_header[0] = 0; # &parse_file($tfiles[$ifile]); # print "PRINTING NEWFILE:\n$newfile\n"; $filename = $tfiles[$ifile]; $filename .= "\.new"; open (NEW_HEADER,">$filename"); print NEW_HEADER ("$newfile"); close(NEW_HEADER); # foreach $symbol (keys %header_symbols) { print "(header symbols) \($symbol\):$header_symbols{$symbol}\n"; } foreach $symbol (keys %symbols) { print "(symbols) \($symbol\):$symbols{$symbol}\n"; } } } # Subroutine to reduce string to evaluatable expression sub reduce_expr { if ($state[$level] == 1) { print "Expression1: \($expr\)\n"; } $expr =~ s/\/\*.*\*\///g; $expr =~ s/undefined/\!/g; $expr =~ s/defined//g; if ($state[$level] == 1) { print "Expression2: \($expr\)\n"; } foreach $symbol (keys %header_symbols) { if ($symbol =~ /^\s*[a-zA-Z0-9\_]*\s*$/) { if ($expr =~ /[\s\!\(\|\&]+$symbol[\s\)\|\&]+/ || $expr =~ /\s+$symbol$/ || $expr =~ /$symbol $/ || $expr =~ /^$symbol$/) { print "Matching header_symbol: $symbol\n"; $expr =~ s/$symbol/1/; } } } foreach $symbol (keys %symbols) { if ($symbol =~ /ARMCI_STAMP/ ) { print "Found ARMCI_STAMP: \($symbol\)\n"; } if ($symbol =~ /^\s*[a-zA-Z0-9\_]*\s*$/) { if ($expr =~ /[\s\!\(\|\&]+$symbol[\s\)\|\&]+/ || $expr =~ /\s+$symbol$/ || $expr =~ /$symbol $/ || $expr =~ /^$symbol$/) { print "Matching symbol: $symbol\n"; $expr =~ s/$symbol/1/; } } } if ($state[$level] == 1) { print "Expression3: \($expr\)\n"; } # Set anything that hasn't been recognized to 0 $copy = $expr; # Replace delimiters etc. by blanks $copy =~ s/[&|\(\)]+/ /g; chomp($copy); @strings = (); @strings = split(/\s+/,$copy); # Loop through list of strings and replace anything that isn't a 1 $test_string = ""; for ($j=0; $j<@strings; $j++) { $test_string .= $strings[$j]; $test_string .= " "; if (!($strings[$j] =~ /\s*1\s+/ || $strings[$j] =~ /\s+1\s*/ || $strings[$j] =~ /^1$/)) { $tmp_string = $strings[$j]; if (!($tmp_string =~ /[\s+|\!]/ || $tmp_string =~ /\\/ || $tmp_string eq "")) { $expr =~ s/$tmp_string/0/; } } } # Get rid of continuation characters $expr =~ s/\\//g; if ($state[$level] == 1) { print "Expression4: \($expr\)\n"; } } # Subroutine to get the rest of the expression if a line continuation appears sub get_expr { my($local_expr,$filesize,$iline,@myfile) = @_; $expr = $local_expr; # See if line continues print "Local expr: $local_expr filesize: $filesize iline: $iline\n"; while ($line =~/\\\s*$/ && $iline<$filesize-1) { $iline++; $line = $myfile[$iline]; $expr .= $line; print "Current line: $line\n"; print "Continuation line: $expr\n"; } $continuation_cnt = $iline; # Remove continuation characters $expr =~ s/\\//; } # Subroutine to set parsing parameters sub set_pars_params { $level++; print "Level: $level\n"; if ($expr =~ /0 0/) { print "Bogus expression: $expr\n"; print "Filename: $tfiles[$ifile]\n"; } $chk = eval $expr; if ($chk) { print "Expression $expr : true\n"; } else { print "Expression $expr : false\n"; } if ($chk) { if ($state[$level-1] == 1) { $state[$level] = 1; $save_cpp[$level] = 0; } else { $state[$level] = 0; $save_cpp[$level] = 0; } } else { $state[$level] = 0; $save_cpp[$level] = 0; } $parse_else[$level] = 1; $ignore[$level] = 0; } # Subroutine to parse files sub parse_file($filename) { my ($filename) = @_; my (@file, $filesize, $iline); my ($comment); # my (@state, @save_cpp, @once_true); # my (@parse_else); # Get strings from file; print "Parsing file: $tfiles[$ifile]\n"; open(HEADER, $filename); @file =
; close(HEADER); $filesize = @file; $iline = 0; # Initialize parser contol variables $comment = 0; while ($iline<$filesize) { $line = $file[$iline]; # Check for comments if ($line =~ /\/\*/ && !($line =~/\*\//)) { $comment = 1; } if ($line =~ /\*\// && !($line =~ /\/\*/)) { $comment = 0; } # Check for #if constructs if ($line =~ /^\s*\#\s*if([\s\(])*def(ined)?(.*)/) { $tmp_string = $1; &get_expr($3,$filesize,$iline,@file); $iline = $continuation_cnt; print "ifdef expression: $3\n"; if ($tmp_string =~ /\(*/) { $tmp_string .= $expr; $expr = $tmp_string; } &reduce_expr; &set_pars_params; $chk = eval $expr; if ($chk) { $once_true[$level] = 1; } else { $once_true[$level] = 0; } print "ifdef: state[$level]: $state[$level]\n"; } elsif ($line =~ /^\s*\#\s*if\s+0/) { print "if 0: $line"; $level++; print "Level: $level\n"; $state[$level] = 0; $save_cpp[$level] = 0; $once_true[$level] = 0; $pars_else[$level] = 1; $ignore[$level] = 0; } elsif ($line =~ /^\s*\#\s*if\s+1/) { print "if 1: $line"; $level++; print "Level: $level\n"; if ($state[$level-1] == 1) { $state[$level] = 1; $save_cpp[$level] = 0; } else { $state[$level] = 0; $save_cpp[$level] = 0; } $once_true[$level] = 1; $pars_else[$level] = 1; $ignore[$level] = 0; } elsif ($line =~ /^\s*\#\s*if\s*\!\s*defined(.*)/) { &get_expr($1,$filesize,$iline,@file); $iline = $continuation_cnt; &reduce_expr; $expr = "!\($expr\)"; &set_pars_params; $chk = eval $expr; if ($chk) { $once_true[$level] = 1; } else { $once_true[$level] = 0; } } elsif ($line =~ /^\s*\#\s*if\s+/) { # Some other kind of conditional that will be ignored $level++; if ($state[$level-1] == 1) { $state[$level] = 1; $save_cpp[$level] = 1; $parse_else[$level] = 0; $newfile .= $line; $ignore[$level] = 1; } else { $state[$level] = 0; $save_cpp[$level] = 0; $ignore[$level] = 0; } } elsif ($line =~ /^\s*\#\s*ifndef\s+(.*)/) { # Check for header symbol if ($line =~ /\s+(\S+_H)\s*$/ || $line =~ /\s+(\S+_H_)\s*$/) { if (!defined($header_symbols{$1})) { $level++; print "Level: $level\n"; if ($state[$level-1] == 1) { $state[$level] = 1; $save_cpp[$level] = 1; $once_true[$level] = 1; $newfile .= $line; $header_symbols{$1} = 1; } else { $state[$level] = 0; $save_cpp[$level] = 0; $once_true[$level] = 0; } } else { $level++; $state[$level] = 0; $save_cpp[$level] = 1; $once_true[$level] = 1; } $pars_else[$level] = 1; $ignore[$level] = 0; } else { &get_expr($1,$filesize,$iline,@file); $iline = $continuation_cnt; &reduce_expr; $expr = "!\($expr\)"; &set_pars_params; $chk = eval $expr; if ($chk) { $once_true[$level] = 1; } else { $once_true[$level] = 0; } } } elsif ($line =~ /^\s*\#\s*elif\s+(.*)/ && $ignore[$level]==0) { &get_expr($1,$filesize,$iline,@file); $iline = $continuation_cnt; &reduce_expr; $chk = eval $expr; if ($chk) { if ($once_true[$level] == 0 && $state[$level-1] == 1) { $state[$level] = 1; $once_true[$level] = 1; } else { $state[$level] = 0; } } else { $state[$level] = 0; } } elsif ($line =~ /^\s*\#\s*else/ && $ignore[$level]==0) { if ($once_true[$level] == 0 && $state[$level-1] == 1) { $state[$level] = 1; $once_true[$level] = 1; } else { $state[$level] = 0; } } elsif ($line =~ /^\s*\#\s*endif/) { if ($state[$level] == 1 && $save_cpp[$level] == 1) { $newfile .= $line; } print "endif: $line"; $level--; print "Level: $level\n"; if ($level < 0) { exit(0); } } elsif ($line =~ /^\s*\#\s*define\s+(\S+)\s*(\S*)/) { if ($comment == 0) { $key = $1; $value = $2; $key =~ s/\(.*//; if (($ignore[$level] == 0 && $parsing_header[$file_level] == 1) || $state[$level] == 1) { if ($2 ne "") { $symbols{$key} = $value; print "new symbol key: $key value: $value\n"; } else { $symbols{$key} = 1; print "new symbol key: $key (no value)\n"; } } } if ($state[$level] == 1) { print "new definition: $line\n"; $newfile .= $line; } } elsif ($line =~ /^\s*\#\s*include\s+(\S+)/) { $include_file = $1; # Ignore include if it is a system level header file if (!($include_file =~ /\<.*\>/) && $include_file =~ /\.h\"\s*$/ && $state[$level] == 1) { $newfile .= $line; $include_file =~ s/\"//g; print "Adding contents of $include_file\n"; $level++; $ignore[$level] = 0; $state[$level] = 0; $file_level++; $parsing_header[$file_level] = 1; &parse_file($include_file); $file_level--; $level--; } elsif ( $state[$level] == 1) { $newfile .= $line; } } else { if ($state[$level] == 1) { $newfile .= $line; } } $iline++; } } ga-5-4/armci/src/collectives/0000755000175000017500000000000012662210413014223 5ustar mbambaga-5-4/armci/src/collectives/message.c0000644000175000017500000020146112662210413016017 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: message.c,v 1.58.6.4 2007-04-24 10:08:26 vinod Exp $ */ #if defined(BGML) # include "bgml.h" #elif defined(PVM) # include #elif defined(TCGMSG) # include static void tcg_brdcst(long type, void *buf, long lenbuf, long originator) { long atype = type; long alenbuf = lenbuf; long aoriginator = originator; BRDCST_(&atype, buf, &alenbuf, &aoriginator); } static void tcg_synch(long type) { long atype = type; SYNCH_(&atype); } static void tcg_snd(long type, void *buf, long lenbuf, long node, long sync) { long atype = type; long alenbuf = lenbuf; long anode = node; long async = sync; SND_(&atype, buf, &alenbuf, &anode, &async); } static void tcg_rcv(long type, void *buf, long lenbuf, long *lenmes, long nodeselect, long *nodefrom, long sync) { long atype = type; long alenbuf = lenbuf; long anodeselect = nodeselect; long async = sync; RCV_(&atype, buf, &alenbuf, lenmes, &anodeselect, nodefrom, &async); } #else # ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI # endif # include #endif #include "message.h" #include "armcip.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #ifdef _POSIX_PRIORITY_SCHEDULING #ifndef HITACHI # include #endif #endif #include "armci.h" #include "acc.h" #define DEBUG_ 0 #if defined(SYSV) || defined(MMAP) ||defined (WIN32) # include "armci_shmem.h" #endif /* global operations are use buffer size of BUF_SIZE doubles */ #define BUF_SIZE (4*2048) #define INFO_BUF_SIZE (BUF_SIZE*sizeof(BUF_SIZE) - sizeof(double)) #undef EMPTY #define EMPTY 0 #define FULL 1 static double *work=NULL; static long *lwork = NULL; static long long *llwork = NULL; static int *iwork = NULL; static float *fwork = NULL; static int _armci_gop_init=0; /* tells us if we have a buffers allocated */ static int _armci_gop_shmem =0; /* tells us to use shared memory for gops */ extern void armci_util_wait_int(volatile int *, int , int ); static int empty=EMPTY,full=FULL; #if !defined(SGIALTIX) && defined(SYSV) || defined(MMAP) || defined(WIN32) static void **ptr_arr=NULL; #endif typedef struct { union { volatile int flag; double dummy[16]; }a; union { volatile int flag; double dummy[16]; }b; double array[BUF_SIZE]; } bufstruct; static bufstruct *_gop_buffer; #define GOP_BUF(p) (_gop_buffer+((p)-armci_master)) /*\ macro to set a flag includes mem barrier to assure that flag is not set * before any outstanding writes complete \*/ #ifdef NEED_MEM_SYNC # ifdef AIX # define SET_SHM_FLAG(_flg,_val) _clear_lock((int *)(_flg),_val); # elif defined(NEC) # define SET_SHM_FLAG(_flg,_val) MEM_FENCE; *(_flg)=(_val) # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define SET_SHM_FLAG(_flg,_val)\ __asm__ __volatile__ ("mf" ::: "memory"); *(_flg)=(_val) # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define SET_SHM_FLAG(_flg,_val)\ _armci_ia64_mb(); *(_flg)=(_val); # endif # elif defined(MACX) # if defined(__GNUC__) # define SET_SHM_FLAG(_flg,_val)\ *(_flg)=(_val);__asm__ __volatile__ ("isync" ::: "memory") # endif # endif #endif #ifndef SET_SHM_FLAG # define SET_SHM_FLAG(_flg,_val) *(_flg)=_val; #endif /*\ * Variables/structures for use in Barrier and for Binomial tree \*/ #if HAVE_MATH_H # include #endif int barr_switch; static int LnB=0,powof2nodes,Lp2; typedef struct { volatile int flag1; double dum[16]; volatile int flag2; } barrier_struct; barrier_struct *_bar_buff; #define BAR_BUF(p) (_bar_buff+((p))) void **barr_snd_ptr,**barr_rcv_ptr; int _armci_barrier_init=0; int _armci_barrier_shmem=0; /*\ * Tree generation code \*/ static void _dfs_bintree_parse(int *idlist, int index, int max, int *result) { int left = (int)2*index+1; int right = (int) 2*index+2; static int pos=0; int r_end,l_end; l_end=pos++; result[pos++]=idlist[index]; if(leftarray; /* each process finds its place */ GOP_BUF(armci_me)->a.flag=EMPTY; /* initially buffer is empty */ GOP_BUF(armci_me)->b.flag=EMPTY; /* initially buffer is empty */ if(armci_me == armci_master ){ GOP_BUF(armci_clus_last+1)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->a.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+1)->b.flag=EMPTY;/*initially buffer is empty*/ GOP_BUF(armci_clus_last+2)->b.flag=EMPTY;/*initially buffer is empty*/ } _armci_gop_shmem = 1; } #endif /*stuff needed for barrier and binomial bcast/reduce*/ #ifdef LAPI if(!_armci_barrier_shmem){ int size = 2*sizeof(int); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barrinit failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barrinit failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); powof2nodes=1; LnB = floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)-1) _armci_dummy_work *=DUMMY_INIT; if(_armci_dummy_work>(double)armci_msg_nproc())_armci_dummy_work=DUMMY_INIT; } /***************************Barrier Code*************************************/ void armci_msg_barr_init(){ #if defined(SYSV) || defined(MMAP) || defined(WIN32) int size=sizeof(barrier_struct)*armci_clus_info[armci_clus_me].nslave; char *tmp; void **ptr_arr; barr_switch=0; /*First allocate space for flags*/ ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(armci_me==armci_master) size = size+128; else size=0; PARMCI_Malloc(ptr_arr, size); tmp = (char*)ptr_arr[armci_master]; size=2*sizeof(int); if(!tmp)armci_die("allocate barr shm failed",0); _bar_buff=(barrier_struct *)tmp; SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag1),empty); SET_SHM_FLAG(&(BAR_BUF(armci_me-armci_master)->flag2),empty); /*allocate memory to send/rcv data*/ barr_snd_ptr = (void **)malloc(sizeof(void *)*armci_nproc); barr_rcv_ptr = (void **)malloc(sizeof(void *)*armci_nproc); if(PARMCI_Malloc(barr_snd_ptr,size))armci_die("malloc barr_init failed",0); if(PARMCI_Malloc(barr_rcv_ptr,size))armci_die("malloc barr_init failed",0); if(barr_rcv_ptr[armci_me]==NULL || barr_snd_ptr[armci_me]==NULL) armci_die("problems in malloc barr_init",0); /*we have to figure if we have power of ,two nodes*/ powof2nodes=1; LnB = (int)floor(log(armci_nclus)/log(2))+1; if(pow(2,LnB-1)flag1,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag1),empty); } if(armci_nclus>1){ last = ((int)pow(2,(LnB-1)))^armci_clus_me; if(last>=0 && lastarmci_clus_me){ /*the pow2 set of procs*/ if(last=0 && next armci_me){ armci_msg_snd(ARMCI_TAG, srcp,4,next_node); armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); } else{ /*would we gain anything by doing a snd,rcv instead of rcv,snd*/ armci_msg_rcv(ARMCI_TAG, dstn,4,NULL,next_node); armci_msg_snd(ARMCI_TAG, srcp,4,next_node); } armci_util_wait_int((volatile int *)dstn,barr_count,100000); } } if(last1*/ for(i=1;iflag2),full); } else { /*if not master, partake in the smp barrier,only*/ i=armci_me-armci_master; SET_SHM_FLAG(&(BAR_BUF(i)->flag1),full); armci_util_wait_int(&BAR_BUF(i)->flag2,FULL,100000); SET_SHM_FLAG(&(BAR_BUF(i)->flag2),empty); } } #endif /*barrier enabled only for lapi*/ void parmci_msg_barrier() { #ifdef BGML bgml_barrier (3); /* this is always faster than MPI_Barrier() */ #elif defined(MSG_COMMS_MPI) MPI_Barrier(ARMCI_COMM_WORLD); # elif defined(PVM) pvm_barrier(mp_group_name, armci_nproc); # elif defined(LAPI) #if !defined(NEED_MEM_SYNC) if(_armci_barrier_init) _armci_msg_barrier(); else #endif { tcg_synch(ARMCI_TAG); } # else { tcg_synch(ARMCI_TAG); } # endif } /***********************End Barrier Code*************************************/ void armci_msg_init(int *argc, char ***argv) { #if defined(TCGMSG) if (!TCGREADY_()) { tcgi_pbegin(*argc,*argv); } #elif defined(BGML) /* empty */ #elif defined(MSG_COMMS_MPI) int flag=0; MPI_Initialized(&flag); if (!flag) { # if defined(DCMF) || defined(MPI_MT) int provided; MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); # else MPI_Init(argc, argv); # endif } if (!PARMCI_Initialized()) { MPI_Comm_dup(MPI_COMM_WORLD, &ARMCI_COMM_WORLD); } #endif } int armci_msg_me() { #ifdef BGML return BGML_Messager_rank(); #elif defined(DCMF) return DCMF_Messager_rank(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int me; MPI_Comm_rank(ARMCI_COMM_WORLD, &me); armci_me = me; counter = 1; } return armci_me; #elif defined(PVM) return(pvm_getinst(mp_group_name,pvm_mytid())); #else return (int)NODEID_(); #endif } int armci_msg_nproc() { #ifdef BGML return BGML_Messager_size(); #elif defined(DCMF) return DCMF_Messager_size(); #elif defined(MSG_COMMS_MPI) static int counter = 0; if (counter == 0) { int nproc; MPI_Comm_size(ARMCI_COMM_WORLD, &nproc); armci_nproc = nproc; counter = 1; } return armci_nproc; #elif defined(PVM) return(pvm_gsize(mp_group_name)); #else return (int)NNODES_(); #endif } #ifdef CRAY_YMP #define BROKEN_MPI_ABORT #endif #ifndef PVM double armci_timer() { #ifdef BGML return BGML_Timer(); #elif defined(DCMF) return DCMF_Timer(); #elif defined(MSG_COMMS_MPI) return MPI_Wtime(); #else return TCGTIME_(); #endif } #endif void armci_msg_abort(int code) { #ifdef BGML fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(DCMF) fprintf(stderr,"ARMCI aborting [%d]\n", code); #elif defined(MSG_COMMS_MPI) # ifndef BROKEN_MPI_ABORT MPI_Abort(ARMCI_COMM_WORLD,code); # endif #elif defined(PVM) char error_msg[25]; sprintf(error_msg, "ARMCI aborting [%d]", code); pvm_halt(); #else Error("ARMCI aborting",(long)code); #endif fprintf(stderr,"%d:aborting\n",armci_me); /* trap for broken abort in message passing libs */ _exit(1); } void armci_msg_finalize() { #if defined(TCGMSG) PEND_(); #elif defined(MSG_COMMS_MPI) MPI_Finalize(); #endif } void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right) { int root, up, left, right, index, nproc; if(scope == SCOPE_NODE){ root = armci_clus_info[armci_clus_me].master; nproc = armci_clus_info[armci_clus_me].nslave; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = armci_clus_info[0].master; nproc = armci_nclus; if(armci_me != armci_master){up = -1; left = -1; right = -1; } else{ index = armci_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: armci_clus_info[up].master; left = 2*index + 1 + root; left = ( left >= root+nproc)? -1: armci_clus_info[left].master; right = 2*index + 2 + root; right =( right >= root+nproc)? -1: armci_clus_info[right].master; } }else{ root = 0; nproc = armci_nproc; index = armci_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = up; *Left = left; *Right = right; *Root = root; } /*\ root broadcasts to everyone else \*/ void armci_msg_bcast_scope(int scope, void *buf, int len, int root) { int up, left, right, Root; if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buf, len, 3); #else armci_msg_bintree(scope, &Root, &up, &left, &right); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); #endif } /*\ shared memory based broadcast for a single SMP node \*/ void armci_smp_bcast(void *x, int n , int root) { int ndo, len,i, bufsize = BUF_SIZE*sizeof(double); static int bufid=1; if(armci_clus_info[armci_clus_me].nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_bcast: NULL pointer", n); /* enable or balance pipeline for messages comparable to bufsize */ if((n>bufsize/2) && (n <(2*bufsize-64))){ bufsize = n/2; bufsize>>=3; bufsize<<=3; } while ((ndo = (n<=bufsize) ? n : bufsize)) { len = ndo; if(armci_me==root){ /* wait for the flag protecting the buffer to clear */ armci_util_wait_int(&(GOP_BUF(armci_clus_last+bufid)->a.flag),EMPTY,100); SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),full); #if 0 for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); armci_copy(x,GOP_BUF(armci_clus_last+bufid+1)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root) GOP_BUF(i)->b.flag=FULL; #else armci_copy(x,GOP_BUF(armci_clus_last+bufid)->array,len); for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); SET_SHM_FLAG(&(GOP_BUF(i)->b.flag),full); } #endif }else{ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag, FULL, 100); armci_copy(GOP_BUF(armci_clus_last+bufid)->array,x,len); SET_SHM_FLAG(&(GOP_BUF(armci_me)->b.flag),empty); } n -=ndo; x = len + (char*)x; bufid = (bufid)%2 +1; /* since root waited for everybody to check in the previous buffer is free*/ if(armci_me==root){ SET_SHM_FLAG(&(GOP_BUF(armci_clus_last+bufid)->a.flag),empty); } } } /*\ shared memory based broadcast for a single SMP node out of shmem buffer \*/ void armci_smp_buf_bcast(void *x, int n, int root, void *shmbuf ) { int i, nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2){ armci_copy(shmbuf,x,n); return; /* nothing to do */ } if(!x)armci_die("armci_msg_bcast: NULL pointer", n); if(!shmbuf)armci_die("armci_msg_bcast: NULL pointer", n); if(armci_me==root){ /* notify others that the data in buffer is ready */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root){ armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY, 100); GOP_BUF(i)->b.flag=FULL; } /* root also needs to copy */ armci_copy(shmbuf,x,n); /* wait until everybody is finished -- can reclaim buffer */ for(i=armci_clus_first; i <= armci_clus_last; i++) if(i!=root)armci_util_wait_int(&GOP_BUF(i)->b.flag, EMPTY,100000); }else{ /* spin until data in buffer is ready */ armci_util_wait_int(&GOP_BUF(armci_me)->b.flag , FULL, 100000); armci_copy(shmbuf,x,n); /* copy data */ GOP_BUF(armci_me)->b.flag = EMPTY; /* indicate we are done */ } } void _armci_msg_binomial_bcast(void *buf, int len, int root){ int Root = armci_master; int nslave = armci_clus_info[armci_clus_me].nslave; int i,next_node,next; /* int my_rank,root_rank,next_rank; */ /* inter-node operation between masters */ if(root !=armci_clus_info[0].master){ Root = armci_clus_info[0].master; if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); root = Root; Root = armci_master; } if(armci_nclus>1 &&armci_me==armci_master){/*the internode bcast, first*/ /*first do the recv*/ int rcv_proc=armci_clus_me,flag=1,diff=1; if(armci_me!=root){ while(!(rcv_proc & flag)){ diff=diff<<1; flag=flag<<1; } rcv_proc = armci_clus_info[armci_clus_me-diff].master; armci_msg_rcv(ARMCI_TAG, buf,len,NULL,rcv_proc); /*printf("\n%d: recv from %d \n",armci_me,rcv_proc);fflush(stdout);*/ } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1)armci_msg_bcast_scope(SCOPE_MASTERS, buf, len, root); else Root = root; /* intra-node operation */ #if 1 if(_armci_gop_shmem && nslave<33) armci_smp_bcast(buf, len, Root); else #endif armci_msg_bcast_scope(SCOPE_NODE, buf, len, Root); } #endif void armci_msg_brdcst(void* buffer, int len, int root) { if(!buffer)armci_die("armci_msg_brdcast: NULL pointer", len); #ifdef BGML BGTr_Bcast(root, buffer, len, PCLASS); # elif defined(MSG_COMMS_MPI) MPI_Bcast(buffer, len, MPI_CHAR, root, ARMCI_COMM_WORLD); # elif defined(PVM) armci_msg_bcast(buffer, len, root); # else { long ttag=ARMCI_TAG, llen=len, rroot=root; tcg_brdcst(ttag, buffer, llen, rroot); } # endif } void armci_msg_snd(int tag, void* buffer, int len, int to) { # ifdef MSG_COMMS_MPI MPI_Send(buffer, len, MPI_CHAR, to, tag, ARMCI_COMM_WORLD); # elif defined(PVM) pvm_psend(pvm_gettid(mp_group_name, to), tag, buffer, len, PVM_BYTE); # elif defined(BGML) /* We don't actually used armci_msg_snd in ARMCI. we use optimized * collectives where * armci_msg_snd is used. If you build Global Arrays, the MSG_COMMS_MPI flag is * set, so that * will work fine */ armci_die("bgl shouldn't use armci_msg_snd", armci_me); # else long ttag=tag, llen=len, tto=to, block=1; tcg_snd(ttag, buffer, llen, tto, block); # endif } /*\ receive message of specified tag from proc and get its len if msglen!=NULL \*/ void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from) { # ifdef MSG_COMMS_MPI MPI_Status status; MPI_Recv(buffer, buflen, MPI_CHAR, from, tag, ARMCI_COMM_WORLD, &status); if(msglen) MPI_Get_count(&status, MPI_CHAR, msglen); # elif defined(PVM) int src, rtag,mlen; pvm_precv(pvm_gettid(mp_group_name, from), tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; #elif defined(BGML) armci_die("bgl shouldn't use armci_msg_rcv", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=from, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; # endif } int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen) { #if defined(MSG_COMMS_MPI) int ierr; MPI_Status status; ierr = MPI_Recv(buffer, buflen, MPI_CHAR, MPI_ANY_SOURCE, tag, ARMCI_COMM_WORLD, &status); if(ierr != MPI_SUCCESS) armci_die("armci_msg_rcvany: Recv failed ", tag); if(msglen)if(MPI_SUCCESS!=MPI_Get_count(&status, MPI_CHAR, msglen)) armci_die("armci_msg_rcvany: count failed ", tag); return (int)status.MPI_SOURCE; # elif defined(PVM) int src, rtag,mlen; pvm_precv(-1, tag, buffer, buflen, PVM_BYTE, &src, &rtag, &mlen); if(msglen)*msglen=mlen; return(pvm_getinst(mp_group_name,src)); # elif defined (BGML) armci_die("bgl shouldn't use armci_msg_rcvany", armci_me); # else long ttag=tag, llen=buflen, mlen, ffrom=-1, sender, block=1; tcg_rcv(ttag, buffer, llen, &mlen, ffrom, &sender, block); if(msglen)*msglen = (int)mlen; return (int)sender; # endif } /*\ cluster master broadcasts to everyone else in the same cluster \*/ void armci_msg_clus_brdcst(void *buf, int len) { int root, up, left, right; int tag=ARMCI_TAG, lenmes; armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(armci_me != root) armci_msg_rcv(tag, buf, len, &lenmes, up); if (left > -1) armci_msg_snd(tag, buf, len, left); if (right > -1) armci_msg_snd(tag, buf, len, right); } /*\ reduce operation for long \*/ static void ldoop(int n, char *op, long *x, long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("ldoop: unknown operation requested", n); } /*\ reduce operation for long x= op(work,work2) \*/ static void ldoop2(int n, char *op, long *x, long* work, long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for long long \*/ static void lldoop(int n, char *op, long long *x, long long* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("lldoop: unknown operation requested", n); } /*\ reduce operation for long long x= op(work,work2) \*/ static void lldoop2(int n, char *op, long long *x, long long* work, long long* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register long long x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("ldoop2: unknown operation requested", n); } /*\ reduce operation for int \*/ static void idoop(int n, char *op, int *x, int* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x |= *work; x++; work++; } else armci_die("idoop: unknown operation requested", n); } /*\ reduce operation for int x= op(work,work2) \*/ static void idoop2(int n, char *op, int *x, int* work, int* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register int x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else if (strncmp(op,"or",2) == 0) while(n--) { *x = *work | *work2; x++; work++; work2++; } else armci_die("idoop2: unknown operation requested", n); } /*\ reduce operation for double \*/ static void ddoop(int n, char* op, double* x, double* work) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD(&n,x,work); else while(n--) *x++ += *work++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT(&n,x,work); else while(n--) *x++ *= *work++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("ddoop: unknown operation requested", n); } /*\ reduce operation for double x= op(work,work2) \*/ static void ddoop2(int n, char *op, double *x, double* work, double* work2) { if (strncmp(op,"+",1) == 0){ if(n>63) FORT_DADD2(&n,x,work,work2); else while(n--) *x++ = *work++ + *work2++; }else if (strncmp(op,"*",1) == 0){ if(n>63) FORT_DMULT2(&n,x,work,work2); while(n--) *x++ = *work++ * *work2++; }else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register double x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("ddoop2: unknown operation requested", n); } /*\ reduce operation for float \*/ static void fdoop(int n, char* op, float* x, float* work) { if (strncmp(op,"+",1) == 0) while(n--) *x++ += *work++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ *= *work++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*x, *work); x++; work++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*x, *work); x++; work++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MAX(x1, x2); x++; work++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*x), x2 = ARMCI_ABS(*work); *x = ARMCI_MIN(x1, x2); x++; work++; } else armci_die("fdoop: unknown operation requested", n); } /*\ reduce operation for float x= op(work,work2) \*/ static void fdoop2(int n, char *op, float *x, float* work, float* work2) { if (strncmp(op,"+",1) == 0) while(n--) *x++ = *work++ + *work2++; else if (strncmp(op,"*",1) == 0) while(n--) *x++ = *work++ * *work2++; else if (strncmp(op,"max",3) == 0) while(n--) { *x = ARMCI_MAX(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"min",3) == 0) while(n--) { *x = ARMCI_MIN(*work2, *work); x++; work++; work2++; } else if (strncmp(op,"absmax",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MAX(x1, x2); x++; work++; work2++; } else if (strncmp(op,"absmin",6) == 0) while(n--) { register float x1 = ARMCI_ABS(*work), x2 = ARMCI_ABS(*work2); *x = ARMCI_MIN(x1, x2); x++; work++; work2++; } else armci_die("fdoop2: unknown operation requested", n); } /*\ combine array of longs/ints accross all processes \*/ void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, orign =n, ratio; void *origx =x; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); #ifdef BGML BGML_Dt dt; BGML_Op theop; if(n > 0 && (strncmp(op, "+", 1) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_SUM; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "max", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MAX; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else if(n > 0 && (strncmp(op, "min", 3) == 0) && (type==ARMCI_INT || type==ARMCI_DOUBLE)) { theop=BGML_MIN; if(type==ARMCI_INT) dt=BGML_SIGNED_INT; else if(type==ARMCI_DOUBLE) dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, theop, -1, PCLASS); } else #endif { armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_bcast_scope(scope, origx, len, root); } } void armci_msg_reduce_scope(int scope, void *x, int n, char* op, int type) { int root, up, left, right, size; int tag=ARMCI_TAG; int ndo, len, lenmes, ratio; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_bintree(scope, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } } static void gop(int type, int ndo, char* op, void *x, void *work) { if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); } static void gop2(int type, int ndo, char* op, void *x, void *work, void *work2) { #if 0 int size; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); armci_copy(work2,x,ndo*size); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, (int*)work); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, (long*)work); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x, (long long*)work); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, (float*)work); else ddoop(ndo, op, (double*)x, (double*)work); #else if(type==ARMCI_INT) idoop2(ndo, op, (int*)x, (int*)work, (int*)work2); else if(type==ARMCI_LONG)ldoop2(ndo,op,(long*)x,(long*)work,(long*)work2); else if(type==ARMCI_LONG_LONG) lldoop2(ndo,op,(long long*)x,(long long*)work,(long long*)work2); else if(type==ARMCI_FLOAT)fdoop2(ndo,op,(float*)x,(float*)work,(float*)work2); else ddoop2(ndo, op, (double*)x, (double*)work,(double*)work2); #endif } /*\ shared memory based reduction for a single SMP node \*/ static void armci_smp_reduce(void *x, int n, char* op, int type) { int root, up, left, right, size; int ndo, len, lenmes, ratio; int nslave = armci_clus_info[armci_clus_me].nslave; if(nslave<2) return; /* nothing to do */ if(!x)armci_die("armci_msg_gop: NULL pointer", n); armci_msg_bintree(SCOPE_NODE, &root, &up, &left, &right); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; armci_util_wait_int(&GOP_BUF(armci_me)->a.flag, EMPTY, 100); #if 1 if(left<0 && right<0) armci_copy(x,GOP_BUF(armci_me)->array,len); /* version oblivious to the order of data arrival */ { int need_left = left >-1; int need_right = right >-1; int from, first =1, maxspin=100, count=0; bufstruct *b; while(need_left || need_right){ from =-1; if(need_left && GOP_BUF(left)->a.flag == FULL){ from =left; need_left =0; }else if(need_right && GOP_BUF(right)->a.flag == FULL) { from =right; need_right =0; } if(from != -1){ b = GOP_BUF(from); #if 1 if(armci_me == root) gop(type, ndo, op, x, b->array); else { if(first) gop2(type, ndo, op, GOP_BUF(armci_me)->array, b->array,x); else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); } first =0; #else gop(type, ndo, op, GOP_BUF(armci_me)->array, b->array); #endif SET_SHM_FLAG(&( b->a.flag),empty); }else if((++count)array,len); /* this version requires a specific order of data arrival */ if (left >-1) { while(GOP_BUF(left)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(left)->array); SET_SHM_FLAG(&( GOP_BUF(left)->a.flag),empty); } if (right >-1 ) { while(GOP_BUF(right)->a.flag != FULL) cpu_yield(); gop(type, ndo, op, GOP_BUF(armci_me)->array, GOP_BUF(right)->array); GOP_BUF(right)->a.flag = EMPTY; } #endif if (armci_me != root ) { SET_SHM_FLAG(&(GOP_BUF(armci_me)->a.flag),full); } #if 0 else /* NOTE: this copy can be eliminated in a cluster configuration */ armci_copy(GOP_BUF(armci_me)->array,x,len); #endif n -=ndo; x = len + (char*)x; } } void _armci_msg_binomial_reduce(void *x, int n, char* op, int type){ int root = armci_clus_info[0].master; int i,next_node,next; int size, ratio, ndo, lenmes,len; /* int my_rank,root_rank,next_rank; */ if(work==NULL)_allocate_mem_for_work(); if(armci_me!=armci_master)return; if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { int snd_proc=armci_clus_me,flag=1,diff=1; len = lenmes = ndo*size; if(armci_me!=root){ while(!(snd_proc & flag)){ diff=diff<<1; flag=flag<<1; } snd_proc = armci_clus_info[armci_clus_me-diff].master; } else diff = Lp2; /*printf("\n%d: %d diff>>1 = %d\n",armci_me,Lp2,diff>>1);*/ for(i=diff>>1;i>=1;i=i>>1){ next=i^armci_clus_me; if(next>=0 && next1){ #ifdef LAPI if(_armci_gop_init) _armci_msg_binomial_reduce(x,n,op,type); else #endif armci_msg_reduce_scope(SCOPE_MASTERS, x, n, op, type); } } static void armci_msg_gop2(void *x, int n, char* op, int type) { int size, root=0; if(work==NULL)_allocate_mem_for_work(); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); #ifdef BGML /*optimize what we can at the message layer */ void *origx=x; BGML_Dt dt; BGML_Op rop; if(n>0 && (strncmp(op, "+", 1) == 0)) { rop=BGML_SUM; if(type == ARMCI_INT) { dt=BGML_SIGNED_INT; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_LONG || type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); /* dt=BGML_UNSIGNED_LONG; */ /* BGTr_Allreduce(origx, x, n, dt, rop, -1, 3);*/ } else if(type == ARMCI_DOUBLE) { dt=BGML_DOUBLE; BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else if(type == ARMCI_FLOAT) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } } else if(n>0 && ((strncmp(op, "max", 3) == 0) || (strncmp(op, "min", 3) ==0 ))) { if(strncmp(op, "max", 3) == 0) rop=BGML_MAX; else rop=BGML_MIN; if(type == ARMCI_INT) dt=BGML_SIGNED_INT; else if(type == ARMCI_DOUBLE) dt=BGML_DOUBLE; else if(type == ARMCI_FLOAT) dt=BGML_FLOAT; else if(type == ARMCI_LONG) dt=BGML_SIGNED_LONG; else if(type == ARMCI_LONG_LONG) { armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } else { fprintf(stderr,"Unknown data type\n"); exit(1); } if(type != ARMCI_LONG_LONG) BGTr_Allreduce(origx, x, n, dt, rop, -1, 3); } else #endif { /* brackets needed for final gelse clause of bgml */ armci_msg_reduce(x, n, op, type); armci_msg_bcast(x, size*n, root); } } static void armci_sel(int type, char *op, void *x, void* work, int n) { int selected=0; switch (type) { case ARMCI_INT: if(strncmp(op,"min",3) == 0){ if(*(int*)x > *(int*)work) selected=1; }else if(*(int*)x < *(int*)work) selected=1; break; case ARMCI_LONG: if(strncmp(op,"min",3) == 0){ if(*(long*)x > *(long*)work) selected=1; }else if(*(long*)x < *(long*)work) selected=1; break; case ARMCI_LONG_LONG: if(strncmp(op,"min",3) == 0){ if(*(long long*)x > *(long long*)work) selected=1; }else if(*(long long*)x < *(long long*)work) selected=1; break; case ARMCI_FLOAT: if(strncmp(op,"min",3) == 0){ if(*(float*)x > *(float*)work) selected=1; }else if(*(float*)x < *(float*)work) selected=1; break; default: if(strncmp(op,"min",3) == 0){ if(*(double*)x > *(double*)work) selected=1; }else if(*(double*)x < *(double*)work) selected=1; } if(selected)armci_copy(work,x, n); } /*\ global for op with extra info \*/ void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute) { int root, up, left, right; int tag=ARMCI_TAG; int len, lenmes, min; min = (strncmp(op,"min",3) == 0); if(!min && (strncmp(op,"max",3) != 0)) armci_die("armci_msg_gop_info: operation not supported ", 0); if(!x)armci_die("armci_msg_gop_info: NULL pointer", n); if(n>((int)INFO_BUF_SIZE))armci_die("armci_msg_gop_info: info too large",n); len = lenmes = n; armci_msg_bintree(scope, &root, &up, &left, &right); if (left > -1) { /* receive into work if contributing otherwise into x */ if(contribute)armci_msg_rcv(tag, work, len, &lenmes, left); else armci_msg_rcv(tag, x, len, &lenmes, left); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (right > -1) { /* receive into work if contributing otherwise into x */ if(contribute) armci_msg_rcv(tag, work, len, &lenmes, right); else armci_msg_rcv(tag, x, len, &lenmes, right); if(lenmes){ if(contribute) armci_sel(type, op, x, work, n); else contribute =1; /* now we got data to pass */ } } if (armci_me != root){ if(contribute) armci_msg_snd(tag, x, len, up); else armci_msg_snd(tag, x, 0, up); /* send 0 bytes */ } /* Now, root broadcasts the result down the binary tree */ armci_msg_bcast_scope(scope, x, n, root); } /*\ combine array of longs/ints/doubles accross all processes \*/ #if defined(NEC) void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE); } void armci_msg_fgop (float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT);} #else void armci_msg_igop(int *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_INT); } void armci_msg_lgop(long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG); } void armci_msg_llgop(long long *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_LONG_LONG); } void armci_msg_fgop(float *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_FLOAT); } void armci_msg_dgop(double *x, int n, char* op) { armci_msg_gop2(x, n, op, ARMCI_DOUBLE); } #endif /*\ add array of longs/ints within the same cluster node \*/ void armci_msg_clus_igop(int *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_INT); } void armci_msg_clus_lgop(long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG); } void armci_msg_clus_llgop(long long *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_LONG_LONG); } void armci_msg_clus_fgop(float *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_FLOAT); } void armci_msg_clus_dgop_scope(double *x, int n, char* op) { armci_msg_gop_scope(SCOPE_NODE,x, n, op, ARMCI_DOUBLE); } void armci_exchange_address(void *ptr_ar[], int n) { int ratio = sizeof(void*)/sizeof(int); /* armci_msg_lgop((long*)ptr_ar, n, "+"); */ if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me,(long)ptr_ar[armci_me],ratio); armci_msg_gop2(ptr_ar, n*ratio, "+",ARMCI_INT); } /** * ********************* Begin ARMCI Groups Code **************************** * NOTE: This part is MPI dependent (i.e. ifdef MSG_COMMS_MPI) */ #ifdef MSG_COMMS_MPI MPI_Comm armci_group_comm(ARMCI_Group *group) { #ifdef ARMCI_GROUP return MPI_COMM_NULL; #else ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return (MPI_Comm)igroup->icomm; #endif } void parmci_msg_group_barrier(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP { int val=0; armci_msg_group_igop(&val, 1, "+", group); } #else MPI_Barrier((MPI_Comm)(igroup->icomm)); #endif } #ifdef ARMCI_GROUP extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group); #else extern void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm); #endif void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc, ARMCI_Group *mastergroup) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(mastergroup); int i, *pid_list, root=0; #ifdef ARMCI_GROUP ARMCI_Group group; #else MPI_Group group_world; MPI_Group group; MPI_Comm comm; #endif /* create a communicator for the processes with in a node */ pid_list = (int *)malloc(grp_clus_nproc*sizeof(int)); for(i=0; iicomm), &group_world); MPI_Group_incl(group_world, grp_clus_nproc, pid_list, &group); MPI_Comm_create((MPI_Comm)(igroup->icomm), (MPI_Group)group, (MPI_Comm*)&comm); /* Broadcast within the node (for this sub group of processes) */ ARMCI_Bcast_(buf, len, root, comm); free(pid_list); MPI_Comm_free(&comm); /* free the temporary communicator */ MPI_Group_free(&group); #endif } /* to avoid warning */ extern int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank); void armci_msg_group_bintree(int scope, int* Root, int *Up, int *Left, int *Right, ARMCI_Group *group) { int root, up, left, right, index, nproc,grp_clus_me,grp_me,grp_master,grp_nproc; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); grp_me = grp_attr->grp_me; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; ARMCI_Group_size(group, &grp_nproc); if(scope == SCOPE_NODE){ root = grp_attr->grp_clus_info[grp_clus_me].master; nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; }else if(scope ==SCOPE_MASTERS){ root = grp_attr->grp_clus_info[0].master; nproc = grp_attr->grp_nclus; if(grp_me != grp_master){up = -1; left = -1; right = -1; } else{ index = grp_clus_me - root; up = (index-1)/2 + root; up = ( up < root)? -1: grp_attr->grp_clus_info[up].master; left = 2*index + 1 + root; left =( left >= root+nproc)?-1:grp_attr->grp_clus_info[left].master; right= 2*index + 2 + root; right=( right>=root+nproc)?-1:grp_attr->grp_clus_info[right].master; } }else{ root = 0; nproc = grp_nproc; index = grp_me - root; up = (index-1)/2 + root; if( up < root) up = -1; left = 2*index + 1 + root; if(left >= root+nproc) left = -1; right = 2*index + 2 + root; if(right >= root+nproc)right = -1; } *Up = (up==-1)?up:ARMCI_Absolute_id(group,up); *Left = (left==-1)?left:ARMCI_Absolute_id(group,left); *Right = (right==-1)?right:ARMCI_Absolute_id(group,right); *Root = (root==-1)?root:ARMCI_Absolute_id(group,root); } void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group) { int up, left, right, Root; int grp_me; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!buf)armci_die("armci_msg_bcast: NULL pointer", len); if(!group)armci_msg_bcast_scope(scope,buf,len,root); else grp_me = igroup->grp_attr.grp_me; armci_msg_group_bintree(scope, &Root, &up, &left, &right,group); if(root !=Root){ if(armci_me == root) armci_msg_snd(ARMCI_TAG, buf,len, Root); if(armci_me ==Root) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, root); } /* printf("%d: scope=%d left=%d right=%d up=%d\n",armci_me, scope, left, right, up);*/ if(armci_me != Root && up!=-1) armci_msg_rcv(ARMCI_TAG, buf, len, NULL, up); if (left > -1) armci_msg_snd(ARMCI_TAG, buf, len, left); if (right > -1) armci_msg_snd(ARMCI_TAG, buf, len, right); } void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group) { int root, up, left, right, size; int tag=ARMCI_TAG,grp_me; int ndo, len, lenmes, orign =n, ratio; void *origx =x; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); if(!group)armci_msg_gop_scope(scope,x,n,op,type); else grp_me = igroup->grp_attr.grp_me; if(!x)armci_die("armci_msg_gop: NULL pointer", n); if(work==NULL)_allocate_mem_for_work(); armci_msg_group_bintree(scope, &root, &up, &left, &right,group); if(type==ARMCI_INT) size = sizeof(int); else if(type==ARMCI_LONG) size = sizeof(long); else if(type==ARMCI_LONG_LONG) size = sizeof(long long); else if(type==ARMCI_FLOAT) size = sizeof(float); else size = sizeof(double); ratio = sizeof(double)/size; while ((ndo = (n<=BUF_SIZE*ratio) ? n : BUF_SIZE*ratio)) { len = lenmes = ndo*size; if (left > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, left); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op, (long long*)x,llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (right > -1) { armci_msg_rcv(tag, lwork, len, &lenmes, right); if(type==ARMCI_INT) idoop(ndo, op, (int*)x, iwork); else if(type==ARMCI_LONG) ldoop(ndo, op, (long*)x, lwork); else if(type==ARMCI_LONG_LONG) lldoop(ndo, op,(long long*)x, llwork); else if(type==ARMCI_FLOAT) fdoop(ndo, op, (float*)x, fwork); else ddoop(ndo, op, (double*)x, work); } if (armci_me != root && up!=-1) armci_msg_snd(tag, x, len, up); n -=ndo; x = len + (char*)x; } /* Now, root broadcasts the result down the binary tree */ len = orign*size; armci_msg_group_bcast_scope(scope, origx, len, root,group); } void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group) { int ratio = sizeof(void*)/sizeof(int); ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); int grp_me = igroup->grp_attr.grp_me; if(DEBUG_){ printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); } armci_msg_group_gop_scope(SCOPE_ALL, ptr_arr, n*ratio, "+", ARMCI_INT, group); } /*\ combine array of longs/ints/doubles accross all processes \*/ void armci_msg_group_igop(int *x, int n, char* op, ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_INT,group); } void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG,group); } void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_LONG_LONG,group); } void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_FLOAT,group); } void armci_msg_group_dgop(double *x, int n, char* op,ARMCI_Group *group) { armci_msg_group_gop_scope(SCOPE_ALL,x, n, op, ARMCI_DOUBLE,group); } # endif /* ifdef MSG_COMMS_MPI */ /*********************** End ARMCI Groups Code ****************************/ #ifdef PVM /* set the group name if using PVM */ void ARMCI_PVM_Init(char *mpgroup) { #ifdef CRAY mp_group_name = (char *)NULL; #else if(mpgroup != NULL) { /* free(mp_group_name); */ mp_group_name = (char *)malloc(25 * sizeof(char)); strcpy(mp_group_name, mpgroup); } #endif } #endif ga-5-4/armci/src/locks/0000755000175000017500000000000012662210413013022 5ustar mbambaga-5-4/armci/src/locks/tas-sx.s0000644000175000017500000000103212662210413014421 0ustar mbamba set arg1,1*8 set arg2,2*8 set arg3,3*8 set arg4,4*8 text # ts1am_2me(sx, sy, sz) # global ts1am_2me align 4 ts1am_2me: using ts1am_2me,$s33 lds $s35,arg1(,$s34) # Sx : atomic data lds $s36,arg2(,$s34) # Sy : control flag lds $s37,arg3(,$s34) # Sz : pointer ts1am $s35,$s36,$s37 # or $s123,0,$s35 # RVAL = original data; be 0,0(,$s32) ga-5-4/armci/src/locks/locks.c0000644000175000017500000002212112662210413014277 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: locks.c,v 1.15.6.1 2006-12-14 13:24:36 manoj Exp $ */ #define _LOCKS_C_ #include "armcip.h" #include "locks.h" #if HAVE_UNISTD_H # include #endif #if HAVE_STDIO_H # include #endif PAD_LOCK_T *_armci_int_mutexes; #if !defined(armci_die) extern void armci_die(char*,int); #endif #if defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) void **ptr_arr; #ifdef SGIALTIX void CreateInitLocks(int num_locks, lockset_t *plockid) { int locks_per_proc, size; /* locks per process in the SMP node */ locks_per_proc = num_locks/armci_clus_info[armci_clus_me].nslave + 1; locks_per_proc = num_locks; /* this is am altix hack and no clue why this is works */ size=locks_per_proc*sizeof(PAD_LOCK_T); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); PARMCI_Malloc(ptr_arr, size); _armci_int_mutexes = (PAD_LOCK_T*) ptr_arr; bzero((char*)ptr_arr[armci_me],size); } void DeleteLocks(lockset_t lockid) { ptr_arr = (void**)_armci_int_mutexes; PARMCI_Free(ptr_arr[armci_me]); _armci_int_mutexes = (PAD_LOCK_T*)0; } #else void CreateInitLocks(int num_locks, lockset_t *plockid) { int locks_per_proc, size; #ifdef BGML fprintf(stderr,"createinitlocks\n"); #endif ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); locks_per_proc = (num_locks*armci_nclus)/armci_nproc + 1; size=locks_per_proc*sizeof(PAD_LOCK_T); PARMCI_Malloc(ptr_arr, size); _armci_int_mutexes = (PAD_LOCK_T*) ptr_arr[armci_master]; if(!_armci_int_mutexes) armci_die("Failed to create spinlocks",size); #ifdef PMUTEX if(armci_me == armci_master) { int i; pthread_mutexattr_t pshared; if(pthread_mutexattr_init(&pshared)) armci_die("armci_allocate_locks: could not init mutex attr",0); # ifndef LINUX if(pthread_mutexattr_setpshared(&pshared,PTHREAD_PROCESS_SHARED)) armci_die("armci_allocate_locks: could not set PROCESS_SHARED",0); # endif for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){ if(pthread_mutex_init(_armci_int_mutexes+i,&pshared)) armci_die("armci_allocate_locks: could not init mutex",i); } } #elif defined(PSPIN) if(armci_me == armci_master) { for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){ if(pthread_spin_init(_armci_int_mutexes+i,PTHREAD_PROCESS_SHARED)) armci_die("armci_allocate_locks: could not init mutex",i); } } #else bzero((char*)ptr_arr[armci_me],size); #endif } void InitLocks(int num_locks, lockset_t lockid) { /* what are you doing here ? All processes should've called CreateInitLocks(). Check preprocessor directtives and see lock allocation in armci_init */ armci_die("InitLocks(): what are you doing here ?",armci_me); } void DeleteLocks(lockset_t lockid) { _armci_int_mutexes = (PAD_LOCK_T*)0; } #endif /********************* all SGI systems ****************/ #elif defined(SGI) #define FILE_LEN 200 lockset_t lockset; static char arena_name[FILE_LEN]; usptr_t *arena_ptr; static int avail =0; extern char *getenv(const char *); void CreateInitLocks(int num_locks, lockset_t *lockid) { int i; char *tmp; if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks); lockset.id = (int)getpid(); if (!(tmp = getenv("ARENA_DIR"))) tmp = "/tmp"; sprintf(arena_name,"%s/armci_arena%d.%ld", tmp,armci_clus_me,lockset.id); (void) usconfig(CONF_ARENATYPE, US_GENERAL); (void) usconfig(CONF_INITUSERS, (unsigned int) armci_clus_info[armci_clus_me].nslave+1); /* +1 for server */ arena_ptr = usinit(arena_name); if(!arena_ptr) armci_die("Failed to Create Arena", 0); for(i=0; i #include #include #include #include #include #define FILE_LEN 200 lock_t *lock_array; static char file_name[FILE_LEN]; static int fd=-1; static unsigned shmem_size=-1; void CreateInitLocks(int num_locks, lockset_t *lockid) { int i; if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks); *lockid = (int)getpid(); sprintf(file_name,"/tmp/ga.locks.%ld", *lockid); if ( (fd = open(file_name, O_RDWR|O_CREAT, 0666)) < 0 ) armci_die("CreateInitLocks: failed to open temporary file",0); shmem_size = (NUM_LOCKS)*sizeof(lock_t); lock_array = (lock_t*) mmap((caddr_t) 0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0); if(((unsigned)lock_array)%16)armci_die("CreateInitLocks: not aligned",0); for (i=0; i NUM_LOCKS) armci_die("To many locks requested", num_locks); sprintf(file_name,"/tmp/ga.locks.%ld", lockid); if ( (fd = open(file_name, O_RDWR|O_CREAT, 0666)) < 0 ) armci_die("InitLocks: failed to open temporary file",0); shmem_size = (NUM_LOCKS)*sizeof(lock_t); lock_array = (lock_t*) mmap((caddr_t) 0, shmem_size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0); if(((unsigned)lock_array)%16)armci_die("InitLocks: not aligned",0); } void DeleteLocks(lockset_t lockid) { lock_array = 0; (void)unlink(file_name); /*ignore armci_die code: file might be already gone*/ (void)munmap((char *) shmem_size, 0); } void setlock(unsigned * volatile lp) { volatile unsigned flag; flag = fetch_and_inc32(lp); while(flag){ flag = fetch32(lp); } } void unsetlock(unsigned * volatile lp) { (void)fetch_and_clear32(lp); } #elif defined(WIN32) /****************************** Windows NT ********************************/ #include #include HANDLE mutex_arr[NUM_LOCKS]; static int parent_pid; static int num_alloc_locks=0; void CreateInitLocks(int num_locks, lockset_t *lockid) { if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks); *lockid = parent_pid = _getpid(); InitLocks(num_locks, *lockid); } void InitLocks(int num_locks, lockset_t lockid) { int i; char lock_name[64]; for(i=0;inum_alloc_locks || mutex <0)armci_die("setlock: invalid",mutex); rc =WaitForSingleObject(mutex_arr[mutex],INFINITE); switch(rc) { case WAIT_OBJECT_0: /* OK */ break; case WAIT_ABANDONED: /*abandoned: some process crashed holding mutex? */ armci_die("setlock: mutex abandoned",mutex); default: /* some other problem */ fprintf(stderr,"WaitForSingleObject code=%d\n",rc); armci_die("setlock: failed",mutex); } } void unsetlock(int mutex) { if(mutex >num_alloc_locks || mutex <0)armci_die("unsetlock: invalid",mutex); if(ReleaseMutex(mutex_arr[mutex])==FALSE)armci_die("unsetlock: failed",mutex); } #elif defined(CRAY_YMP) lock_t cri_l[NUM_LOCKS]; #pragma _CRI common cri_l void CreateInitLocks(int num_locks, lockset_t *lockid) { int i; if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks); for(i=0;i #endif #define DEBUG_ 0 #define INVALID_VAL -9999999 #ifdef DATA_SERVER # define CORRECT_PTR #endif static size_t armci_mem_offset=0; /* We start by using table: assign address of local variable set to 1 * On shmem systems, this addres is overwritten by a shared memory location * when memlock array is allocated in armci_init * Therefore, any process within shmem node can reset armci_use_memlock_table * to "not used" when offset changes. Since the variable is in shmem, everybody * on that SMP node will see the change and use the same locking functions */ int init_use_memlock_table=1; int *armci_use_memlock_table=&init_use_memlock_table; static int locked_slot=INVALID_VAL; volatile double armci_dummy_work=0.; void **memlock_table_array; /* constants for cache line alignment */ #ifdef SOLARIS # define CALGN 32 # define LOG_CALGN 5 #else # define CALGN 64 # define LOG_CALGN 6 #endif #define ALIGN_ADDRESS(x) (char*)((((unsigned long)x) >> LOG_CALGN) << LOG_CALGN) #ifdef CRAY_T3E #pragma _CRI cache_align table #endif static memlock_t table[MAX_SLOTS]; #if defined(SGIALTIX) || (defined(CRAY_SHMEM) && defined(CRAY_XT)) #define MAX_SEGS 512 armci_memoffset_t armci_memoffset_table[MAX_SEGS]; static short int seg_count=0; static short int new_seg=0; #endif /*\ simple locking scheme that ignores addresses \*/ void armci_lockmem_(void *pstart, void *pend, int proc) { #ifdef BGML bgml_lockmem(pstart, pend, proc); #else #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif if(DEBUG_){ printf("%d: armci_lockmem_ proc=%d lock=%d\n",armci_me,proc,lock); fflush(stdout); } NATIVE_LOCK(lock,proc); # ifdef LAPI { extern int kevin_ok; kevin_ok=0; } # endif if(DEBUG_){ printf("%d: armci_lockmem_ done\n",armci_me); fflush(stdout); } #endif } void armci_unlockmem_(int proc) { #ifdef BGML bgml_unlockmem(proc); #else #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_UNLOCK(lock,proc); # ifdef LAPI { extern int kevin_ok; kevin_ok=1; } # endif #endif } /*\ idle for a time proportional to factor \*/ void armci_waitsome(int factor) { int i=factor*100000; if(factor <= 1) armci_dummy_work =0.; if(factor < 1) return; while(--i){ armci_dummy_work = armci_dummy_work + 1./(double)i; } } #ifdef SGIALTIX #include #endif /*\ acquire exclusive LOCK to MEMORY area owned by process "proc" * . only one area can be locked at a time by the calling process * . must unlock it with armci_unlockmem \*/ void armci_lockmem(void *start, void *end, int proc) { #ifdef ARMCIX ARMCIX_Lockmem (start, end, proc); #else register void* pstart, *pend; register int slot, avail=0; int turn=0, conflict=0; memlock_t *memlock_table; #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_lockmem_(start, end, proc); return; } # ifndef SGIALTIX /* when processes are attached to a shmem region at different addresses, * addresses written to memlock table must be adjusted to the node master */ if(armci_mem_offset){ start = armci_mem_offset + (char*)start; end = armci_mem_offset + (char*)end; } # endif #endif if(DEBUG_){ printf("%d: calling armci_lockmem for %d range %p -%p\n", armci_me, proc, start,end); fflush(stdout); } memlock_table = (memlock_t*)memlock_table_array[proc]; #ifdef ALIGN_ADDRESS /* align address range on cache line boundary to avoid false sharing */ pstart = ALIGN_ADDRESS(start); pend = CALGN -1 + ALIGN_ADDRESS(end); #else pstart=start; pend =end; #endif #ifdef CRAY_SHMEM { /* adjust according the remote process raw address */ long bytes = (long) ((char*)pend-(char*)pstart); extern void* armci_shmalloc_remote_addr(void *ptr, int proc); pstart = armci_shmalloc_remote_addr(pstart, proc); pend = (char*)pstart + bytes; } #endif #ifdef SGIALTIX if (proc == armci_me) { pstart = shmem_ptr(pstart,armci_me); pend = shmem_ptr(pend,armci_me); } /* In SGI Altix processes are attached to a shmem region at different addresses. Addresses written to memlock table must be adjusted to the node master */ if(ARMCI_Uses_shm()){ int i, seg_id=-1; size_t tile_size,offset; void *start_addr, *end_addr; for(i=0; i=start_addr && pend<=end_addr) {seg_id=i; break;}*/ if(pstart >= start_addr && pstart <= end_addr) {seg_id=i; break;} } if(seg_id==-1) armci_die("armci_lockmem: Invalid segment", seg_id); offset = armci_memoffset_table[seg_id].mem_offset; pstart = ((char*)pstart + offset); pend = ((char*)pend + offset); } #endif while(1){ NATIVE_LOCK(lock,proc); armci_get(memlock_table, table, sizeof(table), proc); /* armci_copy(memlock_table, table, sizeof(table));*/ /* inspect the table */ conflict = 0; avail =-1; for(slot = 0; slot < MAX_SLOTS; slot ++){ /* nonzero starting address means the slot is occupied */ if(table[slot].start == NULL){ /* remember a free slot to store address range */ avail = slot; }else{ /*check for conflict: overlap between stored and current range*/ if( (pstart >= table[slot].start && pstart <= table[slot].end) || (pend >= table[slot].start && pend <= table[slot].end) ){ conflict = 1; break; } /* printf("%d: locking %ld-%ld (%d) conflict\n", armci_me, */ } } if(avail != -1 && !conflict) break; NATIVE_UNLOCK(lock,proc); armci_waitsome( ++turn ); } /* we got the memory lock: enter address into the table */ table[avail].start = pstart; table[avail].end = pend; armci_put(table+avail,memlock_table+avail,sizeof(memlock_t),proc); FENCE_NODE(proc); NATIVE_UNLOCK(lock,proc); locked_slot = avail; #endif /* ! ARMCIX */ } /*\ release lock to the memory area locked by previous call to armci_lockemem \*/ void armci_unlockmem(int proc) { #ifdef ARMCIX ARMCIX_Unlockmem (proc); #else void *null[2] = {NULL,NULL}; memlock_t *memlock_table; #ifdef CORRECT_PTR if(! *armci_use_memlock_table){ /* if offset invalid, use dumb locking scheme ignoring addresses */ armci_unlockmem_(proc); return; } #endif #ifdef DEBUG if(locked_slot == INVALID_VAL) armci_die("armci_unlock: empty",0); if(locked_slot >= MAX_SLOTS || locked_slot <0) armci_die("armci_unlock: corrupted slot?",locked_slot); #endif memlock_table = (memlock_t*)memlock_table_array[proc]; armci_put(null,&memlock_table[locked_slot].start,2*sizeof(void*),proc); #endif /* ! ARMCIX */ } /*\ based on address for set by master, determine correction for * memory addresses set in memlock table * if the correction/offset ever changes stop using memlock table locking \*/ void armci_set_mem_offset(void *ptr) { size_t off; static int first_time=1; volatile void *ref_ptr; /* do not care if memlock not used */ if(! *armci_use_memlock_table) return; if(!ptr) armci_die("armci_set_mem_offset : null ptr",0); ref_ptr = *(void**)ptr; off = (size_t)((char*)ref_ptr - (char*)ptr); if(first_time){ armci_mem_offset =off; first_time =0; if(DEBUG_){ printf("%d memlock offset=%ld ref=%p ptr=%p\n",armci_me, (long)armci_mem_offset, ref_ptr, ptr); fflush(stdout); } }else{ if(armci_mem_offset != off){ *armci_use_memlock_table =0; fprintf(stderr, "%d: WARNING:armci_set_mem_offset: offset changed %ld to %ld\n", armci_me, (long)armci_mem_offset, (long)off); fflush(stdout); } } } #ifdef SGIALTIX /* SGI Altix Stuff */ static void armci_altix_gettilesize(void *ptr, void **ptr_arr, size_t *tile_size) { int i; size_t diff=0; for(i=0; i0) diff = (size_t)((char*)ptr_arr[i]-(char*)ptr_arr[i-1]); if(i>1 && diff!=*tile_size) armci_die("armci_memoffset_table_newentry:Inconsistent tile size", armci_me); *tile_size = diff; } } void armci_memoffset_table_newentry(void *ptr, size_t seg_size) { void **ptr_arr; void *master_addr = NULL; size_t tile_size=0, offset=0; if(!ptr) armci_die("armci_memoffset_table_newentry : null ptr",0); if(seg_count >= MAX_SEGS) /* CHECK: make it dynamic */ armci_die("armci_altix_allocate: Increase MAX_SEGS > 512", armci_me); if(armci_me == armci_master) master_addr = shmem_ptr(ptr, armci_me); armci_msg_brdcst(&master_addr, sizeof(void*), armci_master); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); armci_altix_gettilesize(ptr, ptr_arr, &tile_size); offset = (size_t)((char*)master_addr - (char*)ptr_arr[armci_master]); /* enter in memoffset table */ armci_memoffset_table[seg_count].seg_addr = ptr_arr[armci_master]; armci_memoffset_table[seg_count].seg_size = seg_size; armci_memoffset_table[seg_count].tile_size = tile_size; armci_memoffset_table[seg_count].mem_offset = offset; #if DEBUG_ printf("%d: addr=%p seg_size=%ld tile_size=%ld offset=%ld\n", armci_me, ptr_arr[armci_master], seg_size, tile_size, offset); #endif ++seg_count; free(ptr_arr); } #endif #if defined(CRAY_SHMEM) && defined(CRAY_XT) /* CRAY-CRAY_XT stuff */ static void armci_cray_gettilesize(void *ptr, void **ptr_arr, size_t *tile_size) { int i; size_t diff=0; for(i=0; i0) diff = (size_t)((char*)ptr_arr[i]-(char*)ptr_arr[i-1]); if(i>1 && diff!=*tile_size) armci_die("armci_memoffset_table_newentry:Inconsistent tile size", armci_me); *tile_size = diff; } } void armci_memoffset_table_newentry(void *ptr, size_t seg_size) { void **ptr_arr; void *master_addr = NULL; size_t tile_size=0, offset=0; if(!ptr) armci_die("armci_memoffset_table_newentry : null ptr",0); if(seg_count >= MAX_SEGS) /* CHECK: make it dynamic */ armci_die("armci_cary_allocate: Increase MAX_SEGS > 512", armci_me); if(armci_me == armci_master) master_addr = ptr; armci_msg_brdcst(&master_addr, sizeof(void*), armci_master); ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); armci_cray_gettilesize(ptr, ptr_arr, &tile_size); offset = (size_t)((char*)master_addr - (char*)ptr_arr[armci_master]); /* enter in memoffset table */ armci_memoffset_table[seg_count].seg_addr = ptr_arr[armci_master]; armci_memoffset_table[seg_count].seg_size = seg_size; armci_memoffset_table[seg_count].tile_size = tile_size; armci_memoffset_table[seg_count].mem_offset = offset; #if DEBUG_ printf("%d: addr=%p seg_size=%ld tile_size=%ld offset=%ld\n", armci_me, ptr_arr[armci_master], seg_size, tile_size, offset); #endif ++seg_count; free(ptr_arr); } #endif ga-5-4/armci/src/locks/mutex.c0000644000175000017500000002623312662210413014336 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: mutex.c,v 1.24.10.1 2006-12-21 23:50:48 manoj Exp $ */ #include "armcip.h" #include "copy.h" #include "request.h" #if HAVE_STDIO_H # include #endif #define DEBUG 0 #define MAX_LOCKS 32768 #define SPINMAX 1000 #if defined(LAPI) || defined(GM) # define SERVER_LOCK #endif double _dummy_work_=0.; #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int mymutexcount; double _dummy_server_work_=0.; #endif static int num_mutexes=0, *tickets; typedef struct { int mutex; int turn; msg_tag_t tag; } waiting_list_t; /* data structure to store info about blocked (waiting) process for mutex */ static waiting_list_t* blocked=(waiting_list_t*)0; typedef struct { int* token; int* turn; int* tickets; int count; } mutex_entry_t; void** mutex_mem_ar; mutex_entry_t *glob_mutex; int PARMCI_Create_mutexes(int num) { int rc,p, totcount; int *mutex_count; if (num < 0 || num > MAX_LOCKS) return(FAIL); if(num_mutexes) armci_die("mutexes already created",num_mutexes); if(armci_nproc == 1){ num_mutexes=1; return(0); } mutex_count = malloc(sizeof(int)*armci_nproc); dassert(1, mutex_count); /* local memory allocation for mutex arrays*/ mutex_mem_ar = (void*) malloc(armci_nproc*sizeof(void*)); if(!mutex_mem_ar) armci_die("PARMCI_Create_mutexes: malloc failed",0); glob_mutex = (void*)malloc(armci_nproc*sizeof(mutex_entry_t)); if(!glob_mutex){ free(mutex_count); free(mutex_mem_ar); armci_die("PARMCI_Create_mutexes: malloc 2 failed",0); } /* bzero(mutex_count,armci_nproc*sizeof(int));*/ bzero((char*)mutex_count,sizeof(int)*armci_nproc); /* find out how many mutexes everybody allocated */ mutex_count[armci_me]=num; armci_msg_igop(mutex_count, armci_nproc, "+"); for(p=totcount=0; p< armci_nproc; p++)totcount+=mutex_count[p]; tickets = calloc(totcount,sizeof(int)); if(!tickets) { free(glob_mutex); free(mutex_mem_ar); free(mutex_count); return(FAIL2); } /* we need memory for token and turn - 2 ints */ rc = PARMCI_Malloc(mutex_mem_ar,2*num*sizeof(int)); if(rc){ free(glob_mutex); free(mutex_mem_ar); free(tickets); free(mutex_count); return(FAIL3); } if(num)bzero((char*)mutex_mem_ar[armci_me],2*num*sizeof(int)); /* setup global mutex array */ for(p=totcount=0; p< armci_nproc; p++){ glob_mutex[p].token = mutex_mem_ar[p]; glob_mutex[p].turn = glob_mutex[p].token + mutex_count[p]; glob_mutex[p].count = mutex_count[p]; glob_mutex[p].tickets = tickets + totcount; totcount += mutex_count[p]; } num_mutexes= totcount; #ifdef LAPI mymutexcount = num; #endif PARMCI_Barrier(); if(DEBUG) fprintf(stderr,"%d created (%d,%d) mutexes\n",armci_me,num,totcount); free(mutex_count); return(0); } void armci_serv_mutex_create() { int mem = armci_nproc*sizeof(waiting_list_t); blocked = (waiting_list_t*)malloc(mem); if(!blocked) armci_die("armci server:error allocating mutex memory ",0); } void armci_serv_mutex_close() { if(blocked) free(blocked ); blocked = (waiting_list_t*)0; } int PARMCI_Destroy_mutexes() { #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ int proc, mutex, i,factor=0; #endif if(num_mutexes==0)armci_die("armci_destroy_mutexes: not created",0); if(armci_nproc == 1) return(0); armci_msg_barrier(); #ifdef LAPI /*fix to if cmpl handler for a pending unlock runs after destroy*/ for(proc=0;proc myturn) armci_die2("armci: problem with tickets",myturn,next_in_line); /* apply a linear backoff delay before retrying */ for(i=0; i< SPINMAX * factor; i++) _dummy_work_ += 1.; factor += 1; }while (myturn != next_in_line); glob_mutex[proc].tickets[mutex] = myturn; /* save ticket value */ } static void armci_generic_unlock(int mutex, int proc) { int *mutex_ticket= glob_mutex[proc].turn + mutex; int *newval = glob_mutex[proc].tickets +mutex; int len=sizeof(int); /* update ticket for next process requesting this mutex */ (*newval) ++; /* write new ticket value stored previously in tickets */ PARMCI_Put(newval, mutex_ticket, len, proc); MEM_FENCE; } /*\ Acquire mutex for "proc" * -must be executed in hrecv/AM handler thread * -application thread must use generic_lock routine \*/ int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag) { int myturn; int *mutex_ticket, next_in_line, len=sizeof(int); int owner = armci_me; if(DEBUG)fprintf(stderr,"SLOCK=%d owner=%d p=%d m=%d\n", armci_me,owner, proc,mutex); mutex_ticket= glob_mutex[owner].turn + mutex; myturn = register_in_mutex_queue(mutex, owner); armci_copy(mutex_ticket, &next_in_line, len); if(next_in_line > myturn) armci_die2("armci-s: problem with tickets",myturn,next_in_line); if(next_in_line != myturn){ if(!blocked)armci_serv_mutex_create(); blocked[proc].mutex = mutex; blocked[proc].turn = myturn; blocked[proc].tag = tag; if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d blocked (%d,%d)\n", armci_me, proc, next_in_line,myturn); return -1; } else { if(DEBUG) fprintf(stderr,"SLOCK=%d proc=%d sending ticket (%d)\n", armci_me, proc, myturn); /* send ticket to requesting node */ /* GA_SEND_REPLY(tag, &myturn, sizeof(int), proc); */ return (myturn); } } /*\ Release mutex "id" held by proc * called from hrecv/AM handler AND application thread \*/ int armci_server_unlock_mutex(int mutex, int proc, int Ticket, msg_tag_t* ptag) { #define NOBODY -1 int owner = armci_me; int i, p=NOBODY, *mutex_ticket= glob_mutex[owner].turn + mutex; int len=sizeof(int); if(DEBUG) fprintf(stderr,"SUNLOCK=%d node=%d mutex=%d ticket=%d\n", armci_me,proc,mutex,Ticket); Ticket++; armci_copy(&Ticket, mutex_ticket, len); /* if mutex is free then nobody is reqistered in queue */ if(armci_mutex_free(mutex, proc)) return -1; /* search for the next process in queue waiting for this mutex */ for(i=0; i< armci_nproc; i++){ if(!blocked)break; /* not allocated yet - nobody is waiting */ if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d list=(%d,%d)\n", armci_me, i, blocked[i].mutex, blocked[i].turn); if((blocked[i].mutex == mutex) && (blocked[i].turn == Ticket)){ p = i; break; } } /* send Ticket to a process waiting for mutex */ if(p != NOBODY){ if(p == armci_me)armci_die("server_unlock: cannot unlock self",0); else { if(DEBUG)fprintf(stderr,"SUNLOCK=%d node=%d unlock ticket=%d go=%d\n", armci_me, proc, Ticket, p); /* GA_SEND_REPLY(blocked[p].tag, &Ticket, sizeof(int), p); */ *ptag = blocked[p].tag; return p; } } return -1; /* nobody is waiting */ } void PARMCI_Lock(int mutex, int proc) { #if defined(SERVER_LOCK) int direct; #endif if(DEBUG)fprintf(stderr,"%d enter lock\n",armci_me); if(armci_nproc == 1) return; if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); # if defined(SERVER_LOCK) direct=SAMECLUSNODE(proc); if(!direct) armci_rem_lock(mutex,proc, glob_mutex[proc].tickets + mutex ); else # endif armci_generic_lock(mutex,proc); if(DEBUG)fprintf(stderr,"%d leave lock\n",armci_me); } void PARMCI_Unlock(int mutex, int proc) { if(DEBUG)fprintf(stderr,"%d enter unlock\n",armci_me); if(armci_nproc == 1) return; if(!num_mutexes) armci_die("armci_lock: create mutexes first",0); if(mutex > glob_mutex[proc].count) armci_die2("armci_lock: mutex not allocated", mutex, glob_mutex[proc].count); # if defined(SERVER_LOCK) if(armci_nclus >1) { if(proc != armci_me) armci_rem_unlock(mutex, proc, glob_mutex[proc].tickets[mutex]); else { int ticket = glob_mutex[proc].tickets[mutex]; msg_tag_t tag; int waiting; waiting = armci_server_unlock_mutex(mutex, proc, ticket, &tag); if(waiting >-1) armci_unlock_waiting_process(tag, waiting, ++ticket); } } else # endif armci_generic_unlock(mutex, proc); if(DEBUG)fprintf(stderr,"%d leave unlock\n",armci_me); } ga-5-4/armci/src/locks/semaphores.c0000644000175000017500000000406712662210413015343 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: semaphores.c,v 1.12 2005-03-10 19:11:23 vinodtipparaju Exp $ */ #include "semaphores.h" #if HAVE_STDIO_H # include #endif #if HAVE_UNISTD_H # include #endif int num_sem_alloc=0; void perror(); #ifdef SUN int fprintf(); void fflush(); int semget(),semctl(); #endif #include "armcip.h" struct sembuf sops; int semaphoreID; int SemGet(num_sem) int num_sem; { semaphoreID = semget(IPC_PRIVATE,num_sem, IPC_CREAT | 0600); if(semaphoreID<0){ fprintf(stderr," Semaphore Allocation Failed \nsuggestions to fix the problem: \n"); fprintf(stderr," 1. run ipcs and ipcrm -s commands to clean any semaphore ids\n"); fprintf(stderr," 2. verify if constant SEMMSL defined in file semaphore.h is set correctly for your system\n"); fprintf(stderr," 3. recompile semaphore.c\n"); sleep(1); perror("Error message from failed semget:"); armci_die(" exiting ...", num_sem); } num_sem_alloc = num_sem; return(semaphoreID); } void SemInit(id,value) int id,value; { int i, semid, num_sem; union semun semctl_arg; semctl_arg.val = value; if(id == ALL_SEMS){ semid = 0; num_sem = num_sem_alloc;} else { semid = id; num_sem = 1;} for(i=0; i< num_sem; i++){ if( semctl(semaphoreID, semid, SETVAL,semctl_arg )<0){ perror((char*)0); armci_die("SemInit error",id); } semid++; } } /* release semaphore(s) */ void SemDel() { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(semaphoreID,0,IPC_RMID,dummy); } void Sem_CreateInitLocks(int num, lockset_t *id) { *id = SemGet(num); SemInit(ALL_SEMS,1); } void Sem_InitLocks(int num, lockset_t id) { semaphoreID = id; num_sem_alloc = num; } void Sem_DeleteLocks(lockset_t id) { union semun dummy; /* this is only to avoid compiler whinning about the unitialized variable*/ dummy.val=0; (void) semctl(id,0,IPC_RMID,dummy); } ga-5-4/armci/src/memory/0000755000175000017500000000000012662210413013217 5ustar mbambaga-5-4/armci/src/memory/shmem.c0000644000175000017500000011162112662210413014476 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmem.c,v 1.87.2.2 2007-09-10 23:31:32 manoj Exp $ */ /* System V shared memory allocation and managment * * Interface: * ~~~~~~~~~ * char *Create_Shared_Region(long *idlist, long size, long *offset) * . to be called by just one process. * . calls kr_malloc, malloc-like memory allocator from the K&R book. * kr_malloc inturn calls armci_allocate() that does shmget() and shmat(). * . idlist might be just a pointer to integer or a true array in the * MULTIPLE_REGIONS versions (calling routine has to take care of it) * char *Attach_Shared_Region(long *idlist, long size, long offset) * . called by any other process to attach to existing shmem region or * if attached just calculate the address based on the offset * . has to be called after shmem region was created * void Free_Shmem_Ptr(long id, long size, char* addr) * . called ONLY by the process that created shmem region (id) to return * pointer to kr_malloc (shmem is not destroyed) * void Delete_All_Regions() * . destroys all shared memory regions * . can be called by any process assuming that all processes attached * to alllocated shmem regions * . needs to by called by cleanup procedure(s) * * Jarek Nieplocha, 06.13.94 * */ #ifdef SYSV #define DEBUG_ 0 #define DEBUG1 0 #define DEBUG2_ 0 /* For debugging purposes at the beginning of the shared memory region * creator process can write a stamp which then is read by attaching processes * NOTE: on clusters we cannot use it anymore since ARMCI node master * uses it since Nov 99 to write the value of address it attached at * This feature is used in the ARMCI memlock table. */ #define STAMP 0 #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SHM_H # include #endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "armci_shmem.h" #include "kr_malloc.h" #include "shmlimit.h" #include "message.h" #include "armcip.h" #ifdef ALLOC_MUNMAP #if HAVE_SYS_MMAN_H # include #endif #if HAVE_UNISTD_H # include #endif static size_t pagesize=0; static int logpagesize=0; /* allow only that big shared memory segment (in MB)- incresed from 128 11/02 */ #define MAX_ALLOC_MUNMAP 128 #define MAX_ALLOC_MUNMAP_ 368 static long max_alloc_munmap=MAX_ALLOC_MUNMAP; #endif #if defined(SUN) extern char *shmat(); #endif #define SHM_UNIT (1024) /* Need to determine the max shmem segment size. There are 2 alternatives: * 1. use predefined SHMMAX if available or set some reasonable values, or * 2. trial-and-error search for a max value (default) * case a) fork a process to determine shmmax size (more accurate) * case b) search w/o forking until success (less accurate) */ /* under Myrinet GM, we cannot fork */ #if defined(GM) || defined(VAPI) # define SHMMAX_SEARCH_NO_FORK #endif #if defined(LAPI) || defined(AIX) || defined(SHMMAX_SEARCH_NO_FORK) # define NO_SHMMAX_SEARCH #endif /* on some platforms with tiny shmmax can try to glue multiple regions */ #if (defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK) # define MULTIPLE_REGIONS #endif /* Limits for the largest shmem segment are in Kilobytes to avoid passing * Gigavalues to kr_malloc * the limit for the KSR is lower than SHMMAX in sys/param.h because * shmat would fail -- SHMMAX cannot be trusted (a bug) */ #define _SHMMAX 4*1024 #if defined(SUN)||defined(SOLARIS) # undef _SHMMAX # define _SHMMAX (1024) /* memory in KB */ #elif defined(SGI64) || defined(AIX) || defined(CONVEX) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(SGI) && !defined(SGI64) # undef _SHMMAX # define _SHMMAX ((unsigned long)128*1024) #elif defined(KSR) # undef _SHMMAX # define _SHMMAX ((unsigned long)512*1024) #elif defined(HPUX) # undef _SHMMAX # define _SHMMAX ((unsigned long)64*1024) #elif defined(__FreeBSD__) # undef _SHMMAX # define _SHMMAX ((unsigned long)3*1024) #elif defined(LINUX) # if !defined(SHMMAX) /* Red Hat does not define SHMMAX */ # undef _SHMMAX # if defined(__sparc__) || defined(__powerpc__) # define _SHMMAX ((unsigned long)16*1024) # elif defined(__alpha__) # define _SHMMAX ((unsigned long)4072) # else /* Intel */ # define _SHMMAX ((unsigned long)32*1024) # endif # endif #elif defined(SHMMAX) # undef _SHMMAX # define _SHMMAX (((unsigned long)SHMMAX)>>10) #endif static unsigned long MinShmem_per_core = 0; static unsigned long MaxShmem_per_core = 0; static unsigned long MinShmem = _SHMMAX; static unsigned long MaxShmem = MAX_REGIONS*_SHMMAX; static context_t ctx_shmem; /* kr_malloc context */ static context_t *ctx_shmem_global; /* kr_malloc context stored in shmem */ static int create_call=0; #ifdef SHMMAX_SEARCH_NO_FORK static char *ptr_search_no_fork = (char*)0; static int id_search_no_fork=0; #endif #ifdef LINUX #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm shm %d",id); #elif defined(SOLARIS) #define CLEANUP_CMD(command) sprintf(command,"/bin/ipcrm -m %d",id); #elif defined(SGI) #define CLEANUP_CMD(command) sprintf(command,"/usr/sbin/ipcrm -m %d",id); #else #define CLEANUP_CMD(command) sprintf(command,"/usr/bin/ipcrm -m %d",id); #endif #ifdef ALLOC_MUNMAP #ifdef QUADRICS # include # include static char *armci_elan_starting_address = (char*)0; # ifdef __ia64__ # define ALLOC_MUNMAP_ALIGN 1024*1024 # else # define ALLOC_MUNMAP_ALIGN 64*1024 # endif # define ALGN_MALLOC(s,a) elan_allocMain(elan_base->state, (a), (s)) #else # define ALGN_MALLOC(s,a) malloc((s)) #endif static char* alloc_munmap(size_t size) { char *tmp; unsigned long iptr; size_t bytes = size+pagesize-1; if(armci_elan_starting_address){ tmp = armci_elan_starting_address; armci_elan_starting_address += size; # ifdef ALLOC_MUNMAP_ALIGN armci_elan_starting_address += ALLOC_MUNMAP_ALIGN; # endif if(DEBUG_) {printf("%d: address for shm attachment is %p size=%ld\n", armci_me,tmp,(long)size); fflush(stdout); } } else { tmp = ALGN_MALLOC(bytes, getpagesize()); if(tmp){ iptr = (unsigned long)tmp + pagesize-1; iptr >>= logpagesize; iptr <<= logpagesize; if(DEBUG_) printf("%d:unmap ptr=%p->%p size=%d pagesize=%d\n",armci_me, tmp,(char*)iptr,(int)size,pagesize); tmp = (char*)iptr; if(munmap(tmp, size) == -1) armci_die("munmap failed",0); if(DEBUG_){printf("%d: unmap OK\n",armci_me); fflush(stdout);} }else armci_die("alloc_munmap: malloc failed",(int)size); } return tmp; } #endif /*\ A wrapper to shmget. Just to be sure that ID is not 0. \*/ static int armci_shmget(size_t size,char *from) { int id; id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); /*attaching with id 0 somehow fails (Seen on pentium4+linux24+gm163) *so if id=0, shmget again. */ while(id==0){ /* free id=0 and get a new one */ if(shmctl((int)id,IPC_RMID,(struct shmid_ds *)NULL)) { fprintf(stderr,"id=%d \n",id); armci_die("allocate: failed to _delete_ shared region ",id); } id = shmget(IPC_PRIVATE, size, (IPC_CREAT | 00600)); } if(DEBUG_){ printf("\n%d:armci_shmget sz=%ld caller=%s id=%d\n",armci_me,(long)size, from,id); fflush(stdout); } return(id); } /*\ test is a shared memory region of a specified size can be allocated * return 0 (no) or 1 (yes) \*/ int armci_test_allocate(long size) { char *ptr; int id = armci_shmget((size_t)size,"armci_test_allocate"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* delete segment id */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); /* test pointer */ if (((long)ptr) == -1L) return 0; else return 1; } #ifdef SHMMAX_SEARCH_NO_FORK /*\ try to allocate a shared memory region of a specified size; return pointer \*/ static int armci_shmalloc_try(long size) { char *ptr; int id = armci_shmget((size_t) size,"armci_shmalloc_try"); if (id <0) return 0; /* attach to segment */ ptr = shmat(id, (char *) NULL, 0); /* test pointer */ if (((long)ptr) == -1L) return 0; ptr_search_no_fork = ptr; id_search_no_fork = id; return 1; } #endif /* parameters that define range and granularity of search for shm segment size * UBOUND is chosen to be < 2GB to avoid overflowing on 32-bit systems * smaller PAGE gives more accurate results but with more search steps * LBOUND is set to minimum amount for our purposes * change UBOUND=512MB if you need larger arrays than 512 MB */ #define PAGE (16*65536L) #define LBOUND 1048576L #if defined(MULTI_CTX) && defined(QUADRICS) #define UBOUND 256*LBOUND #else #define UBOUND 512*LBOUND #endif #define ARMCI_STRINGIFY(str) #str #define ARMCI_CONCAT(str) strL #ifndef ARMCI_DEFAULT_SHMMAX_UBOUND #define ARMCI_DEFAULT_SHMMAX_UBOUND 8192 #endif static long get_user_shmmax() { char *uval; int x=0; uval = getenv("ARMCI_DEFAULT_SHMMAX"); if(uval != NULL){ sscanf(uval,"%d",&x); if(x<1 || x> ARMCI_DEFAULT_SHMMAX_UBOUND){ fprintf(stderr, "incorrect ARMCI_DEFAULT_SHMMAX should be <1," ARMCI_STRINGIFY(ARMCI_DEFAULT_SHMMAX) ">mb and 2^N Found=%ld\n",x); x=0; } } return ((long)x)*1048576L; /* return value in bytes */ } /*\ determine the max shmem segment size using bisection \*/ int armci_shmem_test() { long x; int i,rc; long upper_bound=UBOUND; long lower_bound=0; x = get_user_shmmax(); if(!x) x = upper_bound; else upper_bound =x; if(DEBUG_){printf("%d: x = %ld upper_bound=%ld\n",armci_me, x, upper_bound); fflush(stdout);} for(i=1;;i++){ long step; rc = armci_test_allocate(x); if(DEBUG_) printf("%d:test %d size=%ld bytes status=%d\n",armci_me,i,x,rc); if(rc){ lower_bound = x; step = (upper_bound -x)>>1; if(step < PAGE) break; x += step; }else{ upper_bound = x; step = (x-lower_bound)>>1; if(step>=20; x <<=20; } if(!lower_bound){ /* try if can get LBOUND - necessary if search starts from UBOUND */ lower_bound=LBOUND; rc = armci_test_allocate(lower_bound); if(!rc) return(0); } if(DEBUG_) printf("%ld bytes segment size, %d calls \n",lower_bound,i); return (int)( lower_bound>>20); /* return shmmax in mb */ } #ifdef SHMMAX_SEARCH_NO_FORK /*\ determine the max shmem segment size by halving \*/ static int armci_shmem_test_no_fork() { long x; int i,rc; long lower_bound=_SHMMAX*SHM_UNIT; #define UBOUND_SEARCH_NO_FORK (256*SHM_UNIT*SHM_UNIT) x = get_user_shmmax(); if(!x) x = UBOUND_SEARCH_NO_FORK; for(i=1;;i++){ rc = armci_shmalloc_try(x); if(DEBUG_) printf("%d:test by halving size=%ld bytes rc=%d\n",armci_me,x,rc); if(rc){ lower_bound = x; break; }else{ x >>= 1 ; if(x>20); /* return shmmax in mb */ } #endif #ifdef MULTI_CTX void armci_nattach_preallocate_info(int* segments, int *segsize) { int x; char *uval; uval = getenv("LIBELAN_NATTACH"); if(uval != NULL){ sscanf(uval,"%d",&x); if(x<2 || x>8) armci_die("Error in LIBELAN_NATTACH <8, >1 ",(int)x); }else armci_die("Inconsistent configuration: ARMCI needs LIBELAN_NATTACH",0); *segments =x; *segsize = (int) (SHM_UNIT * MinShmem); } #endif /* Create shared region to store kr_malloc context in shared memory */ void armci_krmalloc_init_ctxshmem() { void *myptr=NULL; long idlist[SHMIDLEN]; long size; int offset = sizeof(void*)/sizeof(int); /* to store shared memory context and myptr */ size = SHMEM_CTX_MEM; if(armci_me == armci_master ){ myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_krmalloc_init_ctxshmem: could not create", (int)(size>>10)); if(size) *(volatile void**)myptr = myptr; if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem addr mptr=%p ref=%p size=%ld\n", armci_me, myptr, *(void**)myptr, size); fflush(stdout); } /* Bootstrapping: allocate storage for ctx_shmem_global. NOTE:there is offset,as master places its address at begining for others to see */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); *ctx_shmem_global = ctx_shmem; /*master copies ctx into shared region */ } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_krmalloc_init_ctxshmem: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } /* store context info */ ctx_shmem_global = (context_t*) ( ((int*)myptr)+offset ); if(DEBUG_){ printf("%d:armci_krmalloc_init_ctxshmem: shmid=%d off=%ld size=%ld\n", armci_me, ctx_shmem_global->shmid, ctx_shmem_global->shmoffset, (long)ctx_shmem_global->shmsize); fflush(stdout); } } } void armci_shmem_init() { #ifdef ALLOC_MUNMAP #if defined(QUADRICS) # if (defined(__ia64__) || defined(__alpha)) && !defined(DECOSF) /* this is to determine size of Elan Main memory allocator for munmap */ long x; char *uval; uval = getenv("LIBELAN_ALLOC_SIZE"); if(uval != NULL){ sscanf(uval,"%ld",&x); if((x>80000000) && (x< 4*1024*1024*1024L)){ max_alloc_munmap = (x>>20) - 72; if(DEBUG_){ printf("%d: max_alloc_munmap is %ld\n",armci_me,max_alloc_munmap); fflush(stdout); } } } /* an alternative approach is to use MMAP area where we get the address from the Elan environment variable in qsnetlibs 1.4+ */ uval = getenv("LIBELAN3_MMAPBASE"); if(uval != NULL){ sscanf(uval,"%p",&armci_elan_starting_address); } # endif # if defined(__ia64__) /* need aligment on 1MB boundary rather than the actual pagesize */ pagesize = 1024*1024; logpagesize = 20; # else /* determine log2(pagesize) needed for address alignment */ int tp=512; logpagesize = 9; pagesize = getpagesize(); if(tp>pagesize)armci_die("armci_shmem_init:pagesize",pagesize); while(tpmax_alloc_munmap && !armci_elan_starting_address) x=max_alloc_munmap; # else x = 10; /* mb */ # endif # endif if(DEBUG_){ printf("%d:shmem_init: %d mbytes max segment size\n",armci_me,x);fflush(stdout);} MinShmem = (long)(x<<10); /* make sure it is in kb: mb <<10 */ MaxShmem = MAX_REGIONS*MinShmem; # ifdef REPORT_SHMMAX printf("%d using x=%d SHMMAX=%ldKB\n", armci_me,x, MinShmem); fflush(stdout); # endif #else /* nothing to do here - limits were given */ #endif } armci_krmalloc_init_ctxshmem(); if(DEBUG_)printf("%d: out of shmem_init\n",armci_me); } void armci_set_shmem_limit_per_node(int nslaves) { if (MaxShmem_per_core > 0) MaxShmem = nslaves*MaxShmem_per_core; if (MinShmem_per_core > 0) MinShmem = nslaves*MinShmem_per_core; } void armci_set_shmem_limit_per_core(unsigned long shmemlimit) { MaxShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; MinShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; } /*\ application can reset the upper limit (bytes) for memory allocation \*/ void armci_set_shmem_limit(unsigned long shmemlimit) { unsigned long kbytes; kbytes = (shmemlimit + SHM_UNIT -1)/SHM_UNIT; if(MaxShmem > kbytes) MaxShmem = kbytes; if(MinShmem > kbytes) MinShmem = kbytes; } static void shmem_errmsg(size_t size) { long sz=(long)size; printf("******************* ARMCI INFO ************************\n"); printf("The application attempted to allocate a shared memory segment "); printf("of %ld bytes in size. This might be in addition to segments ",sz); printf("that were allocated succesfully previously. "); printf("The current system configuration does not allow enough "); printf("shared memory to be allocated to the application.\n"); printf("This is most often caused by:\n1) system parameter SHMMAX "); printf("(largest shared memory segment) being too small or\n"); printf("2) insufficient swap space.\n"); printf("Please ask your system administrator to verify if SHMMAX "); printf("matches the amount of memory needed by your application and "); printf("the system has sufficient amount of swap space. "); printf("Most UNIX systems can be easily reconfigured "); printf("to allow larger shared memory segments,\n"); printf("see http://www.emsl.pnl.gov/docs/global/support.shtml\n"); printf("In some cases, the problem might be caused by insufficient swap space.\n"); printf("*******************************************************\n"); } static struct shm_region_list{ char *addr; long id; long sz; long attached; }region_list[MAX_REGIONS]; static int alloc_regions=0; static long occup_blocks=0; /* Terminology * region - actual piece of shared memory allocated from OS * block - a part of allocated shmem that is given to the requesting process */ #if defined(MULTIPLE_REGIONS) /********************************* MULTIPLE_REGIONS *******************/ /* allocate contiguous shmem -- glue pieces together -- works on SUN * SUN max shmem segment is only 1MB so we might need several to satisfy request */ /* SHM_OP is an operator to calculate shmem address to attach * might be + or - depending on the system */ #if defined(DECOSF) || defined(LINUX) #define SHM_OP + #else #define SHM_OP - #endif static int prev_alloc_regions=0; unsigned long armci_max_region() { /* we assume that at least two regions can be glued */ return MinShmem*2; } /*\ * assembles the list of shmem id for the block \*/ int find_regions(char *addrp, long* idlist, int *first) { int reg, nreg, freg=-1, min_reg, max_reg; /* find the region where addrp belongs */ for(reg = 0; reg < alloc_regions-1; reg++){ if(region_list[reg].addr < region_list[reg+1].addr){ min_reg = reg; max_reg = reg+1; }else{ min_reg = reg+1; max_reg = reg; } if(region_list[min_reg].addr <= addrp && region_list[max_reg].addr > addrp){ freg = min_reg; break; } } /* if not found yet, it must be the last region */ if(freg < 0) freg=alloc_regions-1; if( alloc_regions == prev_alloc_regions){ /* no new regions were allocated this time - just get the id */ idlist[0] = 1; idlist[1] = region_list[freg].id; }else{ /* get ids of the allocated regions */ idlist[0] = alloc_regions - prev_alloc_regions; if(idlist[0] < 0)armci_die("armci find_regions error ",0); for(reg =prev_alloc_regions,nreg=1; reg =MAX_REGIONS) armci_die("Attach_Shared_Region: too many regions ",0L); /* first time needs to initialize region_list structure */ if(!alloc_regions){ for(reg=0;reg(b)? (b): (a)) char *temp = (char*)0, *pref_addr=(char*)0, *ftemp; int id, newreg, i; size_t sz; if(DEBUG1){ printf("%d:Shmem allocate: size %ld bytes\n",armci_me,size); fflush(stdout); } newreg = (size+(SHM_UNIT*MinShmem)-1)/(SHM_UNIT*MinShmem); if( (alloc_regions + newreg)> MAX_REGIONS) armci_die("allocate: to many regions already allocated ",(long)newreg); prev_alloc_regions = alloc_regions; if(DEBUG_)fprintf(stderr, "in allocate size=%ld\n",size); #ifdef ALLOC_MUNMAP pref_addr = alloc_munmap((size_t) size); #else pref_addr = (char*)0; /* first time let the OS choose address */ #endif /* allocate shmem in as many segments as neccesary */ for(i =0; i< newreg; i++){ long szl; szl =(i==newreg-1)?size-i*MinShmem*SHM_UNIT: min(size,SHM_UNIT*MinShmem); sz = (size_t) szl; if ( (int)(id = armci_shmget(sz,"MULTIPLE_REGIONarmci_allocate")) < 0){ fprintf(stderr,"%d:id=%d size=%d MAX=%ld\n",armci_me,id,szl,MinShmem); alloc_regions++; shmem_errmsg(size); armci_die("allocate: failed to create shared region ",id); } /* make sure the next shmem region will be adjacent to previous one */ if(temp) pref_addr= temp SHM_OP (MinShmem*SHM_UNIT); if(DEBUG_)printf("calling shmat:id=%d adr=%p sz=%ld\n",id,pref_addr,szl); if ( (long)(temp = (char*)shmat(id, pref_addr, 0)) == -1L){ char command[64]; CLEANUP_CMD(command); if(system(command) == -1) printf("Please clean shared memory (id=%d): see man ipcrm\n",id); if(pref_addr){ printf("ARMCI shared memory allocator was unable to obtain from "); printf("the operating system multiple segments adjacent to "); printf("each other in order to combine them into a one large "); printf("segment together\n"); shmem_errmsg(size); armci_die("allocate: failed to attach to shared region", 0L); } } POST_ALLOC_CHECK(temp,MinShmem*SHM_UNIT); region_list[alloc_regions].addr = temp; region_list[alloc_regions].id = id; region_list[alloc_regions].attached=1; if(DEBUG_) fprintf(stderr," allocate:attach: id=%d addr=%p \n",id, temp); alloc_regions++; if(i==0)ftemp = temp; } return (void*)(min(ftemp,temp)); } /************************** END of MULTIPLE_REGIONS *******************/ #else /* Now, the machines where shm segments are not glued together */ static int last_allocated=-1; unsigned long armci_max_region() { return MinShmem; } int find_regions(char *addrp, long* id, int *region) { int nreg, reg; if(last_allocated!=-1){ reg=last_allocated; last_allocated = -1; } else{ for(reg=-1,nreg=0;nreg= region_list[nreg].addr && addrp < (region_list[nreg].addr + region_list[nreg].sz)) { reg = nreg; break; } } if(reg == -1) armci_die("find_regions: failed to locate shared region", 0L); } *region = reg; *id = region_list[reg].id; return 1; } /* returns the shmem info based on the addr */ int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize) { int region; long id; find_regions(addrp, &id, ®ion); *shmid = id; *shmoffset = (long)(addrp - region_list[region].addr); *shmsize = region_list[region].sz; return 1; } long armci_shm_reg_size(int i, long id) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_size: bad i",i); return region_list[i].sz; } void* armci_shm_reg_ptr(int i) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_ptr: bad i",i); return (void *)region_list[i].addr; } Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize) { /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset)*/ long idlist[SHMIDLEN]; Header *p = NULL; idlist[1] = (long)shmid; idlist[0] = shmoffset; idlist[IDLOC+1] = shmsize; /* CHECK : idlist in CreateShmem????*/ if(!(p=(Header*)Attach_Shared_Region(idlist+1, shmsize, idlist[0]))) armci_die("kr_malloc:could not attach",(int)(p->s.shmsize>>10)); #if DEBUG_ printf("%d: armci_get_shmem_ptr: %d %ld %ld %p\n", armci_me, idlist[1], idlist[0], shmsize, p); fflush(stdout); #endif return p; } char *Attach_Shared_Region(id, size, offset) long *id, offset, size; { int reg, found, shmflag=0; static char *temp; #if defined(SGI_N32) && defined(SHM_SGI_ANYADDR) shmflag= SHM_SGI_ANYADDR; #endif if(alloc_regions>=MAX_REGIONS) armci_die("Attach_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:AttachSharedRegion %d:size=%ld id=%ld\n", armci_me, create_call++, size,*id); fflush(stdout); } /* under Linux we can get valid id=0 */ #ifndef LINUX if(!*id) armci_die("Attach_Shared_Region: shmem ID=0 ",(int)*id); #endif /* first time needs to initialize region_list structure */ if(!alloc_regions){ for(reg=0;reg= MAX_REGIONS) armci_die("Create_Shared_Region:allocate:too many regions allocated ",0); last_allocated = alloc_regions; #ifdef SHMMAX_SEARCH_NO_FORK if (ptr_search_no_fork){ temp = ptr_search_no_fork; id = id_search_no_fork; ptr_search_no_fork = (char*)0; /* do not look at it again */ }else #endif { if ( (id = armci_shmget(sz,"armci_allocate")) < 0 ) { fprintf(stderr,"id=%d size=%ld\n",id, size); shmem_errmsg(sz); armci_die("allocate: failed to create shared region ",id); } if ( (long)( (temp = shmat(id, pref_addr, shmflag))) == -1L){ char command[64]; CLEANUP_CMD(command); if(system(command) == -1) printf("Please clean shared memory (id=%d): see man ipcrm\n",id); armci_die("allocate: failed to attach to shared region id=",id); } if(DEBUG_){ printf("%d:allocate:attach:id=%d paddr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } #if !defined(AIX) && !defined(HPUX64) /* delete segment id so that OS cleans it when all attached processes are gone */ if(shmctl( id, IPC_RMID, (struct shmid_ds *)NULL)) fprintf(stderr,"failed to remove shm id=%d\n",id); #endif } POST_ALLOC_CHECK(temp,sz); region_list[alloc_regions].addr = temp; region_list[alloc_regions].id = id; region_list[alloc_regions].attached=1; region_list[alloc_regions].sz=sz; alloc_regions++; if(DEBUG2_){ printf("%d:allocate:id=%d addr=%p size=%ld\n",armci_me,id,temp,size); fflush(stdout); } #ifdef ALLOW_PIN armci_region_register_shm(temp, size); #endif return (void*) (temp); } #endif /******************** common code for the two versions *********************/ /*\ Allocate a block of shared memory - called by master process \*/ char *Create_Shared_Region(long *id, long size, long *offset) { char *temp; int reg, refreg=0,nreg; if(alloc_regions>=MAX_REGIONS) armci_die("Create_Shared_Region: to many regions ",0); if(DEBUG_){ printf("%d:CreateSharedRegion %d:size=%ld\n",armci_me,create_call++,size); fflush(stdout); } /*initialization: 1st allocation request */ if(!alloc_regions){ for(reg=0;reg #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_SIGNAL_H # include #endif #include "shmlimit.h" #include "armci.h" #include "message.h" #define DEBUG_ 0 #if defined(DECOSF) || defined(SOLARIS64) || defined(HPUX) #define PIPE_AFTER_FORK_BUG #endif void (*armci_sig_chld_orig)(); static int status=0; int armci_shmlimit_caught_sigchld=0; #if defined(SUN) && !defined(SOLARIS) static void SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else static void SigChldHandler(sig) #endif int sig; { #ifdef DISABLED int pid; pid = wait(&status); #endif armci_shmlimit_caught_sigchld=1; } static void TrapSigChld() { if ( (armci_sig_chld_orig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) armci_die("TrapSigChld: error from signal setting SIGCHLD",0); } static void RestoreSigChld() { if ( signal(SIGCHLD, armci_sig_chld_orig) == SIG_ERR) armci_die("Restore_SigChld: error from restoring signal SIGChld",0); } #ifdef SOLARIS static int child_finished() { return armci_shmlimit_caught_sigchld; } #endif int armci_child_shmem_init() { pid_t pid; int x; #ifdef PIPE_AFTER_FORK_BUG int i; #endif int y; int fd[2]; int val; if(pipe(fd)==-1) armci_die("armci shmem_test pipe failed",0); TrapSigChld(); if ( (pid = fork() ) < 0) armci_die("armci shmem_test fork failed", (int)pid); else if(pid == 0){ x= armci_shmem_test(); #ifdef PIPE_AFTER_FORK_BUG /* due to a bug in OSF1 V4.0/1229/alpha first item written gets hosed*/ for(i=0;i<2;i++) #endif val=write(fd[1],&x,sizeof(int)); if(val < 0 || (size_t)val < sizeof(int)) armci_die("armci shmem_test: write failed",0); _exit(0); }else{ pid_t rc; #ifdef PIPE_AFTER_FORK_BUG /* due to a bug in OSF1 V4.0/1229/alpha first item read is garbage */ for(i=0;i<2;i++) #endif val=read(fd[0],&y,sizeof(int)); if(val < 0 || (size_t)val < sizeof(int)) armci_die("armci shmem_test: read failed",val); #ifdef SOLARIS while(!child_finished()); #endif again: rc = wait (&status); if(rc == -1 && errno == EINTR) goto again; if (!WIFEXITED(status)) armci_die("ARMCI: child did not return rc",0); x = WEXITSTATUS(status); } /* restore previous signal handler */ RestoreSigChld(); close(fd[0]); close(fd[1]); if(DEBUG_) printf("%d:in parent: x=%d y=%d\n",armci_me,x,y);fflush(stdout);sleep(1); return y; } ga-5-4/armci/src/memory/shmalloc.c0000644000175000017500000000711712662210413015173 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: shmalloc.c,v 1.10 2002-06-20 23:34:17 vinod Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #include "armcip.h" #include "message.h" #include "kr_malloc.h" static long *offset_arr; void armci_shmalloc_exchange_offsets(context_t *ctx_local) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); offset_arr = (long*) malloc(armci_nproc*sizeof(long)); if(!ptr_arr || !offset_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); /* get memory with same size on all procs */ ptr = kr_malloc(bytes, ctx_local); if(!ptr) armci_die("armci_shmalloc_get_offsets: kr_malloc failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); /* identify offets */ for (i=0; i 1MB",0); } else { size = XT_SYMMETRIC_HEAP_SIZE; } return size; } #endif /* defined CRAY_XT */ ga-5-4/armci/src/memory/winshmem.c0000644000175000017500000004444712662210413015227 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: winshmem.c,v 1.20 2005-09-29 21:30:10 d3h325 Exp $ */ /* WIN32 & Posix SysV-like shared memory allocation and management * * * Interface: * ~~~~~~~~~ * char *Create_Shared_Region(long *idlist, long *size, long *offset) * . to be called by just one process. * . calls kr_malloc, malloc-like * memory allocator from K&R.kr_malloc inturn calls armci_allocate() that * does shmget() and shmat(). * . idlist might be just a pointer to integer or a true array in the * MULTIPLE_REGIONS versions (calling routine has to take cere of it) * char *Attach_Shared_Region(long *idlist, long *size, long *offset) * . called by any other process to attach to existing shmem region or * if attached just calculate the address based on the offset * . has to be called after shmem region was created * void Free_Shmem_Ptr(long id, long size, char* addr) * . called ONLY by the process that created shmem region (id) to return * pointer to kr_malloc (shmem is not destroyed) * long Delete_All_Regions() * . destroys all shared memory regions * . can be called by any process assuming that all processes attached * to alllocated shmem regions * . needs to by called by cleanup procedure(s) */ #define DEBUG 0 #define DEBUG0 0 #if HAVE_STDIO_H # include #endif #ifdef WIN32 # include # include # define GETPID _getpid #elif defined(NEC) # if HAVE_UNISTD_H # include # endif # include typedef void* HANDLE; typedef void* LPVOID; # define GETPID getpid #elif defined(HITACHI) # if HAVE_UNISTD_H # include # endif # define PAGE_SIZE 0x1000 # define ROUND_UP_PAGE(size) ((size + (PAGE_SIZE-1)) & ~(PAGE_SIZE-1)) # if HAVE_STRINGS_H # include # endif # if HAVE_STDLIB_H # include # endif # include # include typedef long HANDLE; typedef char* LPVOID; # define GETPID getpid static long cb_key=1961; static long _hitachi_reg_size; #elif defined(MMAP) # if HAVE_FCNTL_H # include # endif # if HAVE_UNISTD_H # include # endif # if HAVE_SYS_STAT_H # include # endif # if HAVE_SYS_MMAN_H # include # endif typedef int HANDLE; typedef void* LPVOID; # define GETPID getpid #else # ifndef _POSIX_C_SOURCE # define _POSIX_C_SOURCE 199309L # endif # if HAVE_FCNTL_H # include # endif # if HAVE_UNISTD_H # include # endif # if HAVE_SYS_STAT_H # include # endif # if HAVE_SYS_MMAN_H # include # endif typedef int HANDLE; typedef void* LPVOID; # define GETPID getpid #endif #if HAVE_ASSERT_H # include #endif #include "kr_malloc.h" #include "armci_shmem.h" #include "armcip.h" #include "armci.h" #define SHM_UNIT (1024) /* default unit for shared memory allocation in KB! */ #if defined(WIN32) # define _SHMMAX 32678 #elif defined(MACX) # define _SHMMAX 64*1024 #else # define _SHMMAX 2*32678 #endif #define SET_MAPNAME(id) sprintf(map_fname,"/tmp/ARMCIshmem.%d.%d",parent_pid,(id)) /*********************** global data structures ****************************/ /* Terminology * region - actual piece of shared memory allocated from OS * block - a part of allocated shmem that is given to the requesting process */ /* array holds handles and addreses for each shmem region*/ static struct shm_region_list{ char *addr; HANDLE id; long size; }region_list[MAX_REGIONS]; static char map_fname[64]; static int alloc_regions=0; /* counter to identify mapping handle */ static int last_allocated=0; /* counter trailing alloc_regions by 0/1 */ /* Min and Max amount of aggregate memory that can be allocated */ static unsigned long MinShmem_per_core = 0; static unsigned long MaxShmem_per_core = 0; static unsigned long MinShmem = _SHMMAX; static unsigned long MaxShmem = MAX_REGIONS*_SHMMAX; static context_t ctx_winshmem; /* kr_malloc context */ static context_t *ctx_winshmem_global;/*for processor groups,kr_malloc context is stored in shared memory */ static int parent_pid=-1; /* process id of process 0 "parent" */ extern int armci_me; /* Create shared region to store kr_malloc context in shared memory */ void armci_krmalloc_init_ctxwinshmem() { void *myptr=NULL; long idlist[SHMIDLEN]; long size; int offset = sizeof(void*)/sizeof(int); /* to store shared memory context and myptr */ size = SHMEM_CTX_MEM; if(armci_me == armci_master ){ myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_krmalloc_init_ctxwinshmem: could not create", (int)(size>>10)); if(size) *(volatile void**)myptr = myptr; if(DEBUG){ printf("%d:armci_krmalloc_init_ctxwinshmem addr mptr=%p ref=%p size=%ld\n", armci_me, myptr, *(void**)myptr, size); fflush(stdout); } /* Bootstrapping: allocate storage for ctx_winshmem_global. NOTE:there is offset,as master places its addr at begining for others to see */ ctx_winshmem_global = (context_t*) ( ((int*)myptr)+offset ); *ctx_winshmem_global=ctx_winshmem;/*master copies ctx into shared rgn*/ } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_krmalloc_init_ctxwinshmem: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG){ printf("%d:armci_krmalloc_init_ctxwinshmem attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } /* store context info */ ctx_winshmem_global = (context_t*) ( ((int*)myptr)+offset ); if(DEBUG){ printf("%d:armci_krmalloc_init_ctxwinshmem:shmid=%d off=%ld size=%ld\n", armci_me, ctx_winshmem_global->shmid,ctx_winshmem_global->shmoffset, (long)ctx_winshmem_global->shmsize); fflush(stdout); } } } /* not done here yet */ void armci_shmem_init() { armci_krmalloc_init_ctxwinshmem(); } unsigned long armci_max_region() { return MinShmem; } void armci_set_shmem_limit_per_node(int nslaves) { if (MaxShmem_per_core > 0) MaxShmem = nslaves*MaxShmem_per_core; if (MinShmem_per_core > 0) MinShmem = nslaves*MinShmem_per_core; } void armci_set_shmem_limit_per_core(unsigned long shmemlimit) { MaxShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; MinShmem_per_core = (shmemlimit + SHM_UNIT - 1)/SHM_UNIT; } /*\ application can reset the upper limit for memory allocation \*/ void armci_set_shmem_limit(unsigned long shmemlimit) /* comes in bytes */ { unsigned long kbytes; kbytes = (shmemlimit + SHM_UNIT -1)/SHM_UNIT; if(MaxShmem > kbytes) MaxShmem = kbytes; if(MinShmem > kbytes) MinShmem = kbytes; } void Delete_All_Regions() { int reg; for(reg = 0; reg < alloc_regions; reg++){ if(region_list[reg].addr != (char*)0){ # if defined(WIN32) UnmapViewOfFile(region_list[reg].addr); CloseHandle(region_list[reg].id); # elif defined(NEC) (int)dp_xmfree(region_list[reg].addr); # else munmap(region_list[reg].addr, region_list[reg].size); SET_MAPNAME(reg); (void)unlink(map_fname); # endif region_list[reg].addr = (char*)0; } } } /*\ only process that created shared region returns the pointer to kr_malloc \*/ void Free_Shmem_Ptr(long id, long size, char* addr) { kr_free(addr, ctx_winshmem_global); } char *armci_get_core_from_map_file(int exists, long size) { LPVOID ptr; #if defined(HITACHI) Cb_object_t oid; int desc; region_list[alloc_regions].addr = (char*)0; if(exists){ int rc,nsize=_hitachi_reg_size; if(size < MinShmem*SHM_UNIT) size = MinShmem*SHM_UNIT; nsize = ROUND_UP_PAGE(nsize); if((rc=combuf_object_get(region_list[alloc_regions].id,(Cb_size_t)nsize,0, &oid)) != COMBUF_SUCCESS) armci_die("attaching combufget fail",0); if((rc=combuf_map(oid, 0, (Cb_size_t)nsize, COMBUF_COMMON_USE, &ptr)) != COMBUF_SUCCESS) armci_die("combuf map failed",0); }else{ int rc; size = ROUND_UP_PAGE(size); if((rc=combuf_object_get(cb_key,(Cb_size_t)size,COMBUF_OBJECT_CREATE,&oid)) != COMBUF_SUCCESS) armci_die("creat combufget fail",0); if((rc=combuf_map(oid, 0, (Cb_size_t)size, COMBUF_COMMON_USE, &ptr)) != COMBUF_SUCCESS) armci_die("combuf map failed",0); /* make the region suitable for communication */ if(combuf_create_field(oid, ptr, (Cb_size_t)size, FIELD_NUM, 0, 0, &desc) != COMBUF_SUCCESS) armci_die("create field failed",0); region_list[alloc_regions].id = cb_key; _hitachi_reg_size=size; cb_key++; /* increment for next combuf create call */ } #elif defined(NEC) region_list[alloc_regions].addr = (char*)0; if(exists) ptr = dp_xmatt(parent_pid, region_list[alloc_regions].id, (void*)0); else { ptr = dp_xmalloc((void*)0, (long long) size); region_list[alloc_regions].id = ptr; } if(ptr == (void*)-1) return ((char*)0); #else HANDLE h_shm_map; SET_MAPNAME(alloc_regions); region_list[alloc_regions].addr = (char*)0; #if defined(WIN32) h_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (int)size, map_fname); if(h_shm_map == NULL) return NULL; if(exists){ /* get an error code when mapping should exist */ if (GetLastError() != ERROR_ALREADY_EXISTS){ CloseHandle(h_shm_map); fprintf(stderr,"map handle does not exist (attach)\n"); return NULL; }else { /* OK */ } } else { /* problem if mapping it should not be there */ if (GetLastError() == ERROR_ALREADY_EXISTS){ CloseHandle(h_shm_map); fprintf(stderr,"map handle already exists (create)\n"); return NULL; } } /* now map file into process address space */ ptr = MapViewOfFile(h_shm_map, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0); if((char*)ptr == NULL){ CloseHandle(h_shm_map); h_shm_map = INVALID_HANDLE_VALUE; } #elif defined(MMAP)&&!defined(HITACHI) && !defined(MACX) if(exists){ if(size < MinShmem*SHM_UNIT) size = MinShmem*SHM_UNIT; h_shm_map = open(map_fname, O_RDWR, S_IRWXU); if(h_shm_map <0) return NULL; }else{ (void)unlink(map_fname); /* sanity cleanup */ h_shm_map = open(map_fname, O_CREAT|O_RDWR, S_IRWXU); if(h_shm_map <0) return NULL; if(ftruncate(h_shm_map,size) < 0) return NULL; } ptr = mmap((caddr_t)0, (size_t)size, PROT_READ|PROT_WRITE, MAP_SHARED, h_shm_map, 0); close(h_shm_map); h_shm_map = -1; #elif defined(MACX) if(exists){ if(size < MinShmem*SHM_UNIT) size = MinShmem*SHM_UNIT; h_shm_map = shm_open(map_fname, O_RDWR, S_IRWXU); if(h_shm_map == -1) return NULL; }else{ (void)shm_unlink(map_fname); /* sanity cleanup */ h_shm_map = shm_open(map_fname, O_CREAT|O_RDWR, S_IRWXU); if(h_shm_map<0) perror("open"); if(h_shm_map == -1) return NULL; if(ftruncate(h_shm_map,size) < 0){ perror("ftruncate"); return NULL; } } ptr = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, h_shm_map, 0L); if((long)ptr <0){ perror("mmap"); return NULL; } close(h_shm_map); h_shm_map = -1; #else if(exists){ h_shm_map = shm_open(map_fname, O_RDWR, S_IRWXU); if(h_shm_map == -1) return NULL; }else{ (void)shm_unlink(map_fname); /* sanity cleanup */ h_shm_map = shm_open(map_fname, O_CREAT|O_RDWR, S_IRWXU); if(h_shm_map) perror("shm_open"); if(h_shm_map == -1) return NULL; if(ftruncate(h_shm_map,size) < 0) return NULL; } ptr = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, h_shm_map, 0L); close(h_shm_map); h_shm_map = -1; #endif /* save file handle in the array to close it in the future */ region_list[alloc_regions].id = h_shm_map; #endif if(DEBUG0){printf("%d: got ptr=%p bytes=%ld mmap\n",armci_me,ptr,size); fflush(stdout); } region_list[alloc_regions].addr = (char*)ptr; region_list[alloc_regions].size = size; return((char*)ptr); } int find_regions(char *addrp, long* id, int *region) { int nreg, reg; if(last_allocated!=-1){ reg=last_allocated; last_allocated = -1; } else{ for(reg=0,nreg=0;nreg addrp )break; reg = nreg; } } *region = reg; *id = reg; return 1; } /*\ function called by shared memory allocator (kr_malloc) \*/ char *armci_allocate(size_t size) { char *ptr; if(alloc_regions>= MAX_REGIONS) armci_die("max alloc regions exceeded", alloc_regions); ptr = armci_get_core_from_map_file( 0, (long)size); if(ptr !=NULL) alloc_regions++; if(DEBUG)printf("%d:got more core %lx %ld this was %d segment allocated\n",armci_me,(unsigned long)ptr, (long)size, alloc_regions); return ptr; } char* Create_Shared_Region(long idlist[], long size, long *offset) { char *temp; int reg; /*initialization */ if(!alloc_regions){ for(reg=0;reg= MAX_REGIONS)armci_die("armci_shmem_reg_size: bad i",i); if(region_list[i].id !=(HANDLE)id)armci_die("armci_shmem_reg_size id",(int)id); return region_list[i].size; } char* armci_shmem_reg_ptr(int i) { if(i<0 || i>= MAX_REGIONS)armci_die("armci_shmem_reg_ptr: bad i",i); return region_list[i].addr; } int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize) { int region; long idlist[SHMIDLEN]; if(!find_regions(addrp,idlist,®ion)) armci_die("CreateSharedRegion: allocation inconsitent",0); *shmid = (int) (*idlist); *shmoffset = (long)(addrp - region_list[region].addr); *shmsize = region_list[region].size; #if DEBUG printf("%d: armci_get_shmem_info: shmid=%d offset=%ld size=%ld %p\n", armci_me, *shmid, *shmoffset, *shmsize, addrp); fflush(stdout); #endif return 1; } Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize) { /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset)*/ long idlist[SHMIDLEN]; Header *p = NULL; idlist[1] = (long)shmid; idlist[0] = shmoffset; idlist[IDLOC+1] = shmsize; if(!(p=(Header*)Attach_Shared_Region(idlist+1, shmsize, shmoffset))) armci_die("armci_get_shmem_ptr: could not attach", (int)(shmsize>>10)); #if DEBUG printf("%d: armci_get_shmem_ptr: shmid=%d offset=%ld size=%ld %p\n", armci_me, shmid, shmoffset, shmsize, p); fflush(stdout); #endif return p; } ga-5-4/armci/src/memory/buffers.c0000644000175000017500000016200712662210413015025 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: buffers.c,v 1.29.6.9 2007-07-02 05:16:50 d3p687 Exp $ **/ #define SIXTYFOUR 64 #define DEBUG_ 0 #define DEBUG2_ 0 #define EXTRA_ERR_CHECK /**********************************************************************/ #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #include "armcip.h" #include "request.h" #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include typedef unsigned long ssize_t; #endif #ifdef SOCKETS # define EQ_TAGS(a_, b_) ((a_) == (b_)) #else # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #endif #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) /* the following symbols should be defined if needed in protocol specific header file: BUF_EXTRA_FIELD, BUF_ALLOCATE */ #ifndef BUF_ALLOCATE # define BUF_ALLOCATE malloc #endif #if defined(PEND_BUFS) #define SMALL_BUF_LEN 8192 #else #define SMALL_BUF_LEN 8192 #endif #ifndef MSG_BUFLEN_SMALL #define MSG_BUFLEN_SMALL (MSG_BUFLEN >>0) #endif #define LEFT_GUARD 11.11e11 #define RIGHT_GUARD 22.22e22 /* #define CLEAR_TABLE_SLOT(idx) *((int*)(_armci_buf_state->table+(idx))) =0 */ #define CLEAR_TABLE_SLOT(idx) (memset(_armci_buf_state->table+(idx),'\0',sizeof(buf_state_t)) /* we allow multiple buffers (up to 15) per single request * adjacent buffers can be coalesced into a large one */ #if 0 typedef struct { unsigned int op:8; /* pending operation code */ unsigned int snd:1; /* if 1 then buffer is used for sending request */ unsigned int rcv:1; /* if 1 then buffer is used for receiving data */ unsigned int async:1; /* if 1 then request is nonblocking */ unsigned int first:5; /* id of the 1st buffer in the set in same request */ unsigned int count:1; /* count is not used and is always 1 (or 0???) */ /*unsigned int count:4; \* how many buffers used for this request 8 possible */ unsigned int busy:1; /* if 1 buffer is used and cannot be completed */ unsigned int cmpl:1; /* set to 1 if buffer was completed and can be released */ unsigned int to:13; /* serv/proc to which request was sent, 8172 possible */ }buf_state_t; #else typedef struct { unsigned int op:8; /* pending operation code */ unsigned int snd:1; /* if 1 then buffer is used for sending request */ unsigned int rcv:1; /* if 1 then buffer is used for receiving data */ unsigned int async:1; /* if 1 then request is nonblocking */ unsigned int first:20; /* id of the 1st buffer in the set in same request */ unsigned int count:1; /* count is not used and is always 1 (or 0???) */ /*unsigned int count:4; \* how many buffers used for this request 8 possible */ unsigned int busy:1; /* if 1 buffer is used and cannot be completed */ unsigned int cmpl:1; /* set to 1 if buffer was completed and can be released */ unsigned int to:30; /* serv/proc to which request was sent, can handle pretty large counts (can be used for fields in the future) */ }buf_state_t; #endif #ifndef BUFID_PAD_T #define BUFID_PAD_T BUF_INFO_T #endif /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[MSG_BUFLEN_SMALL]; } buf_ext_t; /* message send buffer data structure */ typedef struct { BUF_INFO_T id; # ifdef BUF_EXTRA_FIELD_T BUF_EXTRA_FIELD_T field; # endif char buffer[SMALL_BUF_LEN]; } buf_smext_t; /* we keep table and buffer pointer together for better locality */ typedef struct { double left_guard; /* stamp to verify if array was corrupted */ buf_state_t table[MAX_BUFS+MAX_SMALL_BUFS]; /*array with state of buffer */ buf_ext_t *buf; /* address of buffer pool */ buf_smext_t *smallbuf; /* address of the large buffer pool */ int avail; int smavail; int pad; double right_guard; /* stamp to verify if array was corrupted */ unsigned buf_bitmap; /* bitmaps to track available buffers: */ unsigned smbuf_bitmap;/* 1 - available, 0 - not available */ } reqbuf_pool_t; #ifndef BUF_EXTRA_FIELD_T # define SIZE_BUF_EXTRA_FIELD 0 # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ SIZE_BUF_EXTRA_FIELD) #else # define BUF_TO_EBUF(buf) (buf_ext_t*)(((char*)buf) - sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) # define BUF_TO_SMEBUF(buf) (buf_smext_t*)(((char*)buf)- sizeof(BUFID_PAD_T) -\ sizeof(BUF_EXTRA_FIELD_T)) #endif #define BUF_TO_BUFINDEX(buf) (BUF_TO_EBUF((buf)))->id.bufid #define BUF_TO_SMBUFINDEX(buf) (BUF_TO_SMEBUF((buf)))->id.bufid buf_ext_t *_armci_buffers; /* these are the actual buffers */ buf_smext_t *_armci_smbuffers; /* no, these are the actual buffers */ reqbuf_pool_t* _armci_buf_state; /* array that describes state of each buf */ extern active_socks_t *_armci_active_socks; /* returns bufinfo, given bufid */ INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid) { if (bufid < 0 || bufid >= (MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("_armci_id_to_bufinfo: bad id",bufid,MAX_BUFS); return bufid < MAX_BUFS ? &(_armci_buf_state->buf[bufid].id) : &(_armci_buf_state->smallbuf[bufid-MAX_BUFS].id); } #if (defined(THREAD_SAFE) || defined(SOCKETS)) /* check if buffer was completed and can be released */ int armci_test_network_complete() { int idx; for (idx=0;idxtable[idx].cmpl) break; return (idx == MAX_BUFS+MAX_SMALL_BUFS ? -1 : idx); } /*\ we allocate alligned buffer space * this operation can be implemented in platform specific files \*/ void _armci_buf_init() { char *tmp; int extra=0; int smallbuf_size = sizeof(buf_smext_t)*(MAX_SMALL_BUFS); tmp = (char *)BUF_ALLOCATE((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size)); extra= ALIGN64ADD(tmp); /* if(sizeof(buf_state_t) != sizeof(int)) */ /* armci_die("armci_buf_init size buf_state_t!=int",sizeof(buf_state_t)); */ dassert(1,MAX_BUFSbuffer, (void*)(_armci_buffers+MAX_BUFS), (long unsigned)MAX_BUFS*sizeof(buf_ext_t), extra); fflush(stdout); } /* now allocate state array */ tmp = calloc(1, sizeof(reqbuf_pool_t) + 64); if(!tmp)armci_die("_armci_buf_init calloc failed",0); extra= ALIGN64ADD(tmp); _armci_buf_state = (reqbuf_pool_t*)(tmp + extra); /* initialize it */ _armci_buf_state->left_guard = LEFT_GUARD; _armci_buf_state->right_guard = RIGHT_GUARD; _armci_buf_state->avail =0; _armci_buf_state->smavail =MAX_BUFS; _armci_buf_state->buf = _armci_buffers; _armci_buf_state->smallbuf = _armci_smbuffers; /* initialize bitmaps */ /* should not be more than sizeof(unsigned int) buffers */ if (MAX_BUFS > sizeof(unsigned)*8 && MAX_SMALL_BUFS > sizeof(unsigned)*8) armci_die("_armci_buf_init: cannot allocate this many buffers",0); _armci_buf_state->buf_bitmap = (1 << MAX_BUFS) - 1; _armci_buf_state->smbuf_bitmap = (1 << MAX_SMALL_BUFS) - 1; if(BUF_TO_EBUF(_armci_buf_state->buf[0].buffer)!=_armci_buf_state->buf) armci_die("buffers.c, internal structure alignment problem",0); } /*\ convert buffer pointer to index (in state array) \*/ int _armci_buf_to_index(void *buf) { int index; char *ptr = (char*)buf; if(DEBUG2_){ printf("%d: in _armci_buf_to_index %p\n",armci_me, buf); fflush(stdout); } if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ index = BUF_TO_BUFINDEX(ptr); if((index >= MAX_BUFS)|| (index<0)) armci_die2("armci_buf_to_index: bad index:",index,MAX_BUFS); return(index); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ index = BUF_TO_SMBUFINDEX(ptr); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (indextable +idx; /* fprintf(stderr, "%d:: entered %s. called=%d\n", armci_me, FUNCTION_NAME); */ count = buf_state->count; if(DEBUG_ ) { printf("%d:buf_complete_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("complete_buf_index:Inconsistent index:",idx,buf_state->first); } if(buf_state->async){ /* completion of strided get should release that buffer */ if(buf_state->op == GET); else armci_die2("buf_complete_index: async mode not avail for this op", buf_state->op,idx); } # ifdef BUF_EXTRA_FIELD_T else{ /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); /*later, we might just need to do this for all operations, not just get*/ if(_armci_buf_state->smallbuf[relidx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->smallbuf[relidx].id), _armci_buf_state->smallbuf[relidx].buffer); } _armci_buf_state->smallbuf[relidx].id.tag=0; } else { CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); /*later, we might just need to do this for all operations, not just get*/ if(_armci_buf_state->buf[idx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->buf[idx].id), _armci_buf_state->buf[idx].buffer); } _armci_buf_state->buf[idx].id.tag=0; } } # endif /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) { /* *(int*)buf_state = 0; */ memset(buf_state,'\0',sizeof(buf_state_t)); } } /*\ test outstanding operation that uses the specified buffer for complete * It is important not to change the state of the buffer, the buffer has * to remain as it was, only completion has to be indicated \*/ int _armci_buf_test_index(int idx, int called) { int count,retval=0; buf_state_t *buf_state = _armci_buf_state->table +idx; count = buf_state->count; if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("_buf_test_index:inconsistent index:",idx,buf_state->first); } # ifdef BUF_EXTRA_FIELD_T /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; /*printf("\n%d:relidx=%d \n",armci_me,relidx);fflush(stdout);*/ TEST_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } else { TEST_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } # endif if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d ret=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called,retval); fflush(stdout); } return(retval); } /*\ make sure that there are no other pending operations to that smp node * this operation is called from platforms specific routine that sends * request * we could have accomplished the same in armci_buf_get but as Vinod * is pointing out, it is better to delay completing outstanding * calls to overlap memcpy for the current buffer with communication \*/ void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_one_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op){ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } /*\ same as above but for process \*/ void _armci_buf_ensure_one_outstanding_op_per_proc(void *buf, int proc) { int i; int index = _armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; if(_armci_buf_state->table[index].to !=(unsigned int) proc ) armci_die2("_armci_buf_ensure_one_outstanding_op_per_proc: bad to", proc, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if(buf_state->to == (unsigned int) proc) if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) _armci_buf_complete_index(i,0); } } #define HISTORY__ #ifdef HISTORY typedef struct{ int size; int op; int count; int id; } history_t; history_t history[100]; int h=0; void print_history() { int i; fflush(stdout); printf("%d records\n",h); for(i=0; ibuf[history[i].id].buffer, history[i].count, history[i].op); fflush(stdout); } #endif enum {CALL_GET, CALL_RELEASE} last_call_ = CALL_RELEASE; #if DEBUG3_ static int get_count_ = 0; static int release_count_ = 0; #endif /* release buffer, update free buffers bitmaps */ void _armci_buf_release_index(int tbl_idx) { int idx; #if DEBUG3_ release_count_++; if (last_call_ != CALL_GET) { printf("same call: trying to release %s buffer\n" " %d release calls to date\n", tbl_idx >= MAX_BUFS ? "small" : "regular", release_count_); } else last_call_ = CALL_RELEASE; int mark = !(tbl_idx < MAX_BUFS ? _armci_buf_state->buf_bitmap : _armci_buf_state->smbuf_bitmap); #endif if ((tbl_idx >= MAX_BUFS+MAX_SMALL_BUFS) || (tbl_idx < 0)) armci_die2("armci_buf_release: bad index:", tbl_idx, MAX_BUFS); THREAD_LOCK(armci_user_threads.buf_lock); if (tbl_idx < MAX_BUFS) { idx = tbl_idx; _armci_buf_state->buf_bitmap |= 1 << idx; _armci_buf_state->buf[idx].id.tag = 0; } else { idx = tbl_idx - MAX_BUFS; _armci_buf_state->smbuf_bitmap |= 1 << idx; _armci_buf_state->smallbuf[idx].id.tag = 0; } _armci_buf_state->table[tbl_idx].busy = 0; THREAD_UNLOCK(armci_user_threads.buf_lock); #if DEBUG3_ if (mark) printf("release of empty buffer pool, after: %d\n", tbl_idx < MAX_BUFS ? _armci_buf_state->buf_bitmap : _armci_buf_state->smbuf_bitmap); #endif } /*\ release buffer when it becomes free \*/ INLINE void _armci_buf_release(void *buf) { _armci_buf_release_index(_armci_buf_to_index(buf)); } /* call corresponding to GET_SEND_BUF */ char *_armci_buf_get(int size, int operation, int to) { int avail; /* needed by INIT_SEND_BUF for MELLANOX */ unsigned bitmap; int small = size < SMALL_BUF_LEN; int max_bufs = small ? MAX_SMALL_BUFS : MAX_BUFS; int idx = 0; /* same type buffers index: 0..{MAX_BUFS|MAX_SMALL_BUFS}-1 */ int tbl_idx; /* global index in table: 0..MAX_BUFS+MAX_SMALL_BUFS-1 */ int not_ready = 1; #if DEBUG3_ get_count_++; if (last_call_ != CALL_RELEASE) { printf("same call: trying to get %s buffer\n" " %d get calls to date, %d release calls to date, bitmap: %d\n", small ? "small" : "regular", get_count_, release_count_, small ? _armci_buf_state->smbuf_bitmap : _armci_buf_state->buf_bitmap); } else last_call_ = CALL_GET; /* debug hook: no buffers left */ if (!(small ? _armci_buf_state->smbuf_bitmap : _armci_buf_state->buf_bitmap)) bitmap = small ? _armci_buf_state->smbuf_bitmap : _armci_buf_state->buf_bitmap; #endif while (not_ready) { THREAD_LOCK(armci_user_threads.buf_lock); bitmap = small ? _armci_buf_state->smbuf_bitmap : _armci_buf_state->buf_bitmap; /* check if there are available buffers */ if (bitmap) { /* find available buffer in the bitmap */ for (idx = 0; idx < max_bufs; idx++) { if (bitmap & (1 << idx)) break; } if (idx >= max_bufs) armci_die("_armci_buf_get: buffer idx is out of the range",idx); /* mark buffer as taken in the bitmap and busy */ bitmap &= ~((unsigned)(1 << idx)); if (small) { tbl_idx = idx + MAX_BUFS; _armci_buf_state->smbuf_bitmap = bitmap; } else { tbl_idx = idx; _armci_buf_state->buf_bitmap = bitmap; } #if 0 _armci_buf_state->table[tbl_idx].busy = 1; #endif THREAD_UNLOCK(armci_user_threads.buf_lock); not_ready = 0; } else { THREAD_UNLOCK(armci_user_threads.buf_lock); /* try network complete */ #if defined(SOCKETS) || defined(MELLANOX) tbl_idx = armci_test_network_complete(); #else /* all network should eventually use armci_test_network_complete */ tbl_idx = small ? _armci_buf_state->smavail : _armci_buf_state->avail; #endif avail = tbl_idx; if ((tbl_idx >= MAX_BUFS+MAX_SMALL_BUFS) || (tbl_idx < 0 && tbl_idx != -1)) armci_die2("_armci_buf_get: bad idx:", tbl_idx, MAX_BUFS); if (tbl_idx < 0) { /*printf("armci_test_network_complete returned -1\n");fflush(stdout);*/ cpu_yield(); } else { /* could complete a buffer */ /* ignore a busy buffer */ #if DEBUG3_ printf("armci_test_network_complete, gets:%d, releases:%d\n", get_count_, release_count_); #endif if (_armci_buf_state->table[tbl_idx].busy) { printf("BUFFER BUSY 1\n"); continue; } /* complete buffer */ _armci_buf_complete_index(tbl_idx, 0); /* tbl_idx < MAX_BUFS ^ small - 1 if completed compatible buffer */ if ((tbl_idx < MAX_BUFS) ^ small) { THREAD_LOCK(armci_user_threads.buf_lock); /* is this check really necessary ??? */ if (!_armci_buf_state->table[tbl_idx].busy) { #if 0 _armci_buf_state->table[tbl_idx].busy = 1; #endif not_ready = 0; #if DEBUG3_ release_count_++; printf("released in get, gets:%d, releases:%d\n", get_count_, release_count_); #endif } else { printf("BUFFER BUSY 2\n"); } THREAD_UNLOCK(armci_user_threads.buf_lock); idx = small ? tbl_idx - MAX_BUFS : tbl_idx; } else _armci_buf_release_index(tbl_idx); } } } /* initialize buffer */ _armci_buf_state->table[tbl_idx].op = operation; _armci_buf_state->table[tbl_idx].to = to; _armci_buf_state->table[tbl_idx].count = 1; _armci_buf_state->table[tbl_idx].first = tbl_idx; _armci_buf_state->table[tbl_idx].cmpl = 0; /* Note: tbl_idx is used in vapi vesrion of INIT_SEND_BUF */ if (small) { _armci_buf_state->smallbuf[idx].id.tag = 0; _armci_buf_state->smallbuf[idx].id.bufid = tbl_idx; _armci_buf_state->smallbuf[idx].id.protocol = 0; # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->smallbuf[idx].field, _armci_buf_state->table[tbl_idx].snd, _armci_buf_state->table[tbl_idx].rcv); #endif } else { _armci_buf_state->buf[idx].id.tag = 0; _armci_buf_state->buf[idx].id.bufid = tbl_idx; _armci_buf_state->buf[idx].id.protocol = 0; # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->buf[idx].field, _armci_buf_state->table[idx].snd, _armci_buf_state->table[idx].rcv); #endif } return small ? _armci_buf_state->smallbuf[idx].buffer : _armci_buf_state->buf[idx].buffer; } /*\ return pointer to buffer number id \*/ char *_armci_buf_ptr_from_id(int id) { if(id <0 || id >=(MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("armci_buf_ptr_from_id: bad id",id,MAX_BUFS); if(id >=MAX_BUFS)return(_armci_buf_state->smallbuf[id-MAX_BUFS].buffer); return(_armci_buf_state->buf[id].buffer); } /*\function called from PARMCI_Wait to wait for non-blocking ops \*/ void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode) { int i=0; #if 0 printf("\n%d:wait called with bufid=%d tag=%d \n",armci_me,bufid,tag); fflush(stdout); #endif if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag) _armci_buf_complete_index(i,1); } for(i=0;ismallbuf[i].id.tag) _armci_buf_complete_index(i+MAX_BUFS,1); } *retcode=0; } else { if(bufidbuf[bufid].id.tag) _armci_buf_complete_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) _armci_buf_complete_index(bufid,1); } *retcode=0; } } /*\function called from PARMCI_Test to test completion of non-blocking ops \*/ void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode) { int i; if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag){ if(_armci_buf_test_index(i,1)){ *retcode=1; break; } } } for(i=0;ismallbuf[i].id.tag) if(_armci_buf_test_index(i+MAX_BUFS,1)){ *retcode=1; break; } } } else { if(bufidbuf[bufid].id.tag) *retcode = _armci_buf_test_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) *retcode = _armci_buf_test_index(bufid,1); } } } /*\function to set the buffer tag and the protocol \*/ void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol) { int index = _armci_buf_to_index(bufptr); /*_armci_buf_state->table[index].async=1;*/ if(indexbuf[index].id.tag=tag; _armci_buf_state->buf[index].id.protocol=protocol; } else{ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=tag; _armci_buf_state->smallbuf[index-MAX_BUFS].id.protocol=protocol; } } /*\function to return bufinfo, given buf ptr \*/ BUF_INFO_T *_armci_buf_to_bufinfo(void *buf){ if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ return(&((BUF_TO_EBUF(buf))->id)); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ return(&((BUF_TO_SMEBUF(buf))->id)); } else { armci_die("armci_buf_to_index: bad pointer",0); return(0); } } /*\function to clear all buffers \*/ void _armci_buf_clear_all() { int i; for(i=0;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[i].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } for(i=MAX_BUFS;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[i-MAX_BUFS].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } } #ifdef VAPI /* this will work for vapi as there is no get pipeline enabled in vapi * with get pipeline, this will break very badly */ void _armci_buf_update_scatter_count(int id) { int i,num,last,first; for(i=0;itable[i].op==GET){ request_header_t *msginfo; msginfo = (request_header_t*)_armci_buf_state->buf[i].buffer; if(msginfo->pinned && msginfo->bypass && msginfo->format == STRIDED){ num = *(int *)((char *)msginfo+msginfo->bytes); last = *(int *)((char *)msginfo+msginfo->bytes+sizeof(int)); first = last - num+1; if(first < 0 )first+=DSCRID_SCATTERCLIENT_END-DSCRID_SCATTERCLIENT-1; if(id == first && num!=0){ *(int *)((char *)msginfo+msginfo->bytes) = (--num); return; } } } # endif } for(i=MAX_BUFS;itable[i].op==GET){ request_header_t *msginfo = (request_header_t*)_armci_buf_state->smallbuf[i-MAX_BUFS].buffer; if(msginfo->pinned && msginfo->bypass && msginfo->format == STRIDED){ num = *(int *)((char *)msginfo+msginfo->bytes); last = *(int *)((char *)msginfo+msginfo->bytes+sizeof(int)); first = last - num+1; if(first < 0 )first+=DSCRID_SCATTERCLIENT_END-DSCRID_SCATTERCLIENT-1; if(id == first && num!=0){ *(int *)((char *)msginfo+msginfo->bytes) = (--num); return; } } } # endif } } #endif #else /* (defined(THREAD_SAFE) || defined(SOCKETS)) */ /*\ we allocate alligned buffer space * this operation can be implemented in platform specific files \*/ void _armci_buf_init() { char *tmp; int extra=0; int smallbuf_size = sizeof(buf_smext_t)*(MAX_SMALL_BUFS); tmp = (char *)BUF_ALLOCATE((MAX_BUFS*sizeof(buf_ext_t) + 64 + smallbuf_size)); extra= ALIGN64ADD(tmp); #if 0 if(sizeof(buf_state_t) != sizeof(int)) armci_die("armci_buf_init size buf_state_t!=int",sizeof(buf_state_t)); #endif _armci_buffers = (buf_ext_t *) (tmp + extra); tmp = (char *)(_armci_buffers + MAX_BUFS); extra = ALIGN64ADD(tmp); _armci_smbuffers = (buf_smext_t *) (tmp + extra); if(DEBUG2_){ printf("%d:armci_init_bufs: pointer %p, before align ptr=%p bufptr=%p end of region is %p size=%d extra=%d\n", armci_me,_armci_buffers,tmp,_armci_buffers->buffer,(_armci_buffers+MAX_BUFS), MAX_BUFS*sizeof(buf_ext_t),extra); fflush(stdout); } /* now allocate state array */ tmp = calloc(1, sizeof(reqbuf_pool_t) + 64); if(!tmp)armci_die("_armci_buf_init calloc failed",0); extra= ALIGN64ADD(tmp); _armci_buf_state = (reqbuf_pool_t*)(tmp + extra); /* initialize it */ _armci_buf_state->left_guard = LEFT_GUARD; _armci_buf_state->right_guard = RIGHT_GUARD; _armci_buf_state->avail =0; _armci_buf_state->smavail =MAX_BUFS; _armci_buf_state->buf = _armci_buffers; _armci_buf_state->smallbuf = _armci_smbuffers; if(BUF_TO_EBUF(_armci_buf_state->buf[0].buffer)!=_armci_buf_state->buf) armci_die("buffers.c, internal structure alignment problem",0); } /*\ convert buffer pointer to index (in state array) \*/ int _armci_buf_to_index(void *buf) { int index; char *ptr = (char*)buf; if(DEBUG2_){ printf("%d: in _armci_buf_to_index %p\n",armci_me, buf); fflush(stdout); } if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ index = BUF_TO_BUFINDEX(ptr); if((index >= MAX_BUFS)|| (index<0)) armci_die2("armci_buf_to_index: bad index:",index,MAX_BUFS); return(index); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ index = BUF_TO_SMBUFINDEX(ptr); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (indextable +idx; /* printf("%d: buf_complete_index. idx=%d\n", armci_me, idx);*/ /* fflush(stdout);*/ /* if(buf_state->op==GET) { */ /* printf("%d: %s(): op is get\n",armci_me,FUNCTION_NAME); */ /* } */ count = buf_state->count; if(DEBUG_ ) { printf("%d:buf_complete_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("complete_buf_index:inconsistent Index:",idx,buf_state->first); } if(buf_state->async){ /* completion of strided get should release that buffer */ if(buf_state->op == GET); else armci_die2("buf_complete_index: async mode not avail for this op", buf_state->op,idx); } # ifdef BUF_EXTRA_FIELD_T else{ /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; /* printf("%d:%s(): Calling clear_send_buf_field\n",armci_me,FUNCTION_NAME); */ CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); /*later, we might just need to do this for all operations, not just get*/ if(_armci_buf_state->smallbuf[relidx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->smallbuf[relidx].id), _armci_buf_state->smallbuf[relidx].buffer); } _armci_buf_state->smallbuf[relidx].id.tag=0; } else { CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op); /*later, we might just need to do this for all operations, not just get*/ if(_armci_buf_state->buf[idx].id.tag!=0 &&(buf_state->op == GET)){ armci_complete_req_buf(&(_armci_buf_state->buf[idx].id), _armci_buf_state->buf[idx].buffer); } _armci_buf_state->buf[idx].id.tag=0; } } # endif /* clear table slots for all the buffers in the set for this request */ assert(count==1); for(; count; count--, buf_state++) { /* *(int*)buf_state = 0; */ memset(buf_state, '\0', sizeof(buf_state_t)); } } /*\ test outstanding operation that uses the specified buffer for complete * It is important not to change the state of the buffer, the buffer has * to remain as it was, only completion has to be indicated \*/ int _armci_buf_test_index(int idx, int called) { int count,retval=0; buf_state_t *buf_state = _armci_buf_state->table +idx; count = buf_state->count; if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called); fflush(stdout); } if(buf_state->first != (unsigned int)idx){ armci_die2("_buf_test_index:inconsistent index:",idx,buf_state->first); } # ifdef BUF_EXTRA_FIELD_T /* need to call platform specific function */ if(idx>=MAX_BUFS){ int relidx; relidx = idx-MAX_BUFS; /*printf("\n%d:relidx=%d \n",armci_me,relidx);fflush(stdout);*/ TEST_SEND_BUF_FIELD(_armci_buf_state->smallbuf[relidx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } else { TEST_SEND_BUF_FIELD(_armci_buf_state->buf[idx].field,buf_state->snd,buf_state->rcv,buf_state->to,buf_state->op,&retval); } # endif if(DEBUG_ ){ printf("%d:buf_test_index:%d op=%d first=%d count=%d called=%d ret=%d\n", armci_me,idx,buf_state->op,buf_state->first,buf_state->count, called,retval); fflush(stdout); } return(retval); } /** an addition to the below operation to allow for multiple outstanding operations per server node */ #if defined(PEND_BUFS) /** Need to implement effective mechanisms to ensure a given number of outstanding operations. The key is to not wait for a recently sent message. Another issue might be priority between the large and small messages. This function will be improved as needed. X_BUFS+ */ void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node) { unsigned int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; unsigned int nfirst, nlast; void _armci_buf_release_index(int i); int buf_pend_count=0; int max_pend_count=IMM_BUF_NUM; /* printf("%d: ensure_pend_os_per_node. idx=%d\n", armci_me, index);*/ /* fflush(stdout);*/ nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_pend_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); #if 0 for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op){ buf_pend_count++; if(buf_pend_count > IMM_BUF_NUM-1){ /* printf("%d: client. pend_os_per_node. completing buf index=%d\n", armci_me, i); */ /* fflush(stdout); */ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); /* printf("%d: client. pend_os_per_node. done completing buf index=%d\n", armci_me, i); */ fflush(stdout); buf_pend_count--; } } } #else const int smavail=_armci_buf_state->smavail; const int avail = _armci_buf_state->avail; const int startsmall = (smavail-MAX_BUFS-1+MAX_SMALL_BUFS)%MAX_SMALL_BUFS+MAX_BUFS; const int start =(avail-1+MAX_BUFS)%MAX_BUFS; buf_pend_count=0; buf_state_t *bs; i = start; bs = &_armci_buf_state->table[i]; do { if((bs->to>=nfirst) && (bs->to<=nlast)) { if((bs->first!=this) && (bs->first==i) && bs->op) { #if defined(OPENIB) /*SK: not tested on other platforms*/ if(!_armci_buf_test_index(i,1)) { buf_pend_count++; } #else buf_pend_count++; #endif if(buf_pend_count > max_pend_count-1) { /* printf("%d:%s():complete largebuf %d\n",armci_me,FUNCTION_NAME,i); */ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); buf_pend_count--; } } } i = (i-1+MAX_BUFS)%MAX_BUFS; bs = &_armci_buf_state->table[i]; } while(i != start); /* printf("%d: largebuf pend=%d\n",armci_me,buf_pend_count); */ i = startsmall; bs = &_armci_buf_state->table[i]; do { if((bs->to>=nfirst) && (bs->to<=nlast)) { if((bs->first!=this) && (bs->first==i) && bs->op) { #if defined(OPENIB) /*SK:not tested on other platforms*/ if(!_armci_buf_test_index(i,1)) { buf_pend_count++; } #else buf_pend_count++; #endif if(buf_pend_count > max_pend_count-1) { /* printf("%d:%s():complete smallbuf %d\n",armci_me,FUNCTION_NAME,i); */ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); buf_pend_count--; } } } i = (i-MAX_BUFS-1+MAX_SMALL_BUFS)%MAX_SMALL_BUFS+MAX_BUFS; bs = &_armci_buf_state->table[i]; } while(i != startsmall); buf_pend_count=0; for(i=0; ito>=nfirst) && (bs->to<=nlast)) { if((bs->first!=this) && (bs->first==i) && bs->op) { buf_pend_count += 1; } } } assert(buf_pend_count <= max_pend_count); #endif } void _armci_buf_ensure_pend_outstanding_op_per_proc(void *buf, int proc) { int i; int index = _armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; void _armci_buf_release_index(int i); int buf_pend_count=0; if(_armci_buf_state->table[index].to !=(unsigned int) proc ) armci_die2("_armci_buf_ensure_one_outstanding_op_per_proc: bad to", proc, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if(buf_state->to == (unsigned int) proc) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op){ buf_pend_count++; if(buf_pend_count > IMM_BUF_NUM-1){ _armci_buf_complete_index(i,0); _armci_buf_release_index(i); buf_pend_count--; } } } } } #endif /*\ make sure that there are no other pending operations to that smp node * this operation is called from platforms specific routine that sends * request * we could have accomplished the same in armci_buf_get but as Vinod * is pointing out, it is better to delay completing outstanding * calls to overlap memcpy for the current buffer with communication \*/ void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node) { int i; int index =_armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; int nfirst, nlast; void _armci_buf_release_index(int i); nfirst=armci_clus_info[node].master; nlast = nfirst+armci_clus_info[node].nslave-1; if((_armci_buf_state->table[index].to<(unsigned int) nfirst) || (_armci_buf_state->table[index].to>(unsigned int) nlast)) armci_die2("_armci_buf_ensure_one_outstanding_op_per_node: bad to",node, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if((buf_state->to >= nfirst) && (buf_state->to<= (unsigned int) nlast)) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } /*\ same as above but for process \*/ void _armci_buf_ensure_one_outstanding_op_per_proc(void *buf, int proc) { int i; int index = _armci_buf_to_index(buf); int this = _armci_buf_state->table[index].first; void _armci_buf_release_index(int i); if(_armci_buf_state->table[index].to !=(unsigned int) proc ) armci_die2("_armci_buf_ensure_one_outstanding_op_per_proc: bad to", proc, (int)_armci_buf_state->table[index].to); for(i=0;itable +i; if(buf_state->to == (unsigned int) proc) { if((buf_state->first != (unsigned int) this)&&(buf_state->first==(unsigned int) i) && buf_state->op) { _armci_buf_complete_index(i,0); _armci_buf_release_index(i); } } } } #define HISTORY__ #ifdef HISTORY typedef struct{ int size; int op; int count; int id; } history_t; history_t history[100]; int h=0; void print_history() { int i; fflush(stdout); printf("%d records\n",h); for(i=0; ibuf[history[i].id].buffer, history[i].count, history[i].op); fflush(stdout); } #endif /*\ call corresponding to GET_SEND_BUF \*/ char *_armci_buf_get_small(int size, int operation, int to) { int avail=_armci_buf_state->smavail,i; /* int ous_in=0,ous_out; */ /* for(i=MAX_BUFS; itable[i].first) { */ /* assert(_armci_buf_state->table[i].op); */ /* } */ /* if(_armci_buf_state->table[i].op) { */ /* assert(_armci_buf_state->table[i].first==i); */ /* ous_in++; */ /* } */ /* } */ if((_armci_buf_state->table[avail].op || _armci_buf_state->table[avail].first)) { for(i=MAX_BUFS;itable[i].op && !_armci_buf_state->table[i].first) break; #if defined(OPENIB) /*not tested on other platforms*/ if(_armci_buf_test_index(i,1)) { /* ous_in-=1; */ break; } #endif } if(i<(MAX_SMALL_BUFS+MAX_BUFS))avail = i; else { /* printf("%d: no free smallbuf. complete index %d\n",armci_me,avail); */ _armci_buf_complete_index(avail,1); /* ous_in-=1; */ } } _armci_buf_state->table[avail].op = operation; _armci_buf_state->table[avail].to = to; _armci_buf_state->table[avail].count= 1; _armci_buf_state->table[avail].first = avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.tag=0; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.bufid= avail; _armci_buf_state->smallbuf[avail-MAX_BUFS].id.protocol=0; if(DEBUG_ || 0) { printf("%d:buf_get_sm1:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, (int)_armci_buf_state->table[avail].count,(int)_armci_buf_state->table[avail].first); fflush(stdout); } # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->smallbuf[avail-MAX_BUFS].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif _armci_buf_state->smavail = (avail+1-MAX_BUFS)%MAX_SMALL_BUFS + MAX_BUFS; if(DEBUG_ || 0) { printf("%d:buf_get_sm:size=%d max=%d got %d ptr=%p op=%d to=%d count=%d first=%d\n", armci_me,size,SMALL_BUF_LEN,avail, _armci_buf_state->smallbuf[avail-MAX_BUFS].buffer,operation,to, _armci_buf_state->table[avail].count,_armci_buf_state->table[avail].first); fflush(stdout); } /* ous_out=0; */ /* for(i=MAX_BUFS; itable[i].first) { */ /* assert(_armci_buf_state->table[i].op); */ /* } */ /* if(_armci_buf_state->table[i].op) { */ /* assert(_armci_buf_state->table[i].first==i); */ /* ous_out++; */ /* } */ /* } */ /* assert(ous_in+1 == ous_out); */ return(_armci_buf_state->smallbuf[avail-MAX_BUFS].buffer); } /*\ call corresponding to GET_SEND_BUF \*/ char *_armci_buf_get(int size, int operation, int to) { int avail=_armci_buf_state->avail; int count=1, i; /* int ous_in, ous_out; */ /*if small buffer, we go to another routine that gets smallbuf*/ if(size MSG_BUFLEN_SMALL) ){ double val = (double)size; /* use double due to a bug in gcc */ val /= MSG_BUFLEN_SMALL; count=(int)val; if(size%MSG_BUFLEN_SMALL) count++; assert(0); /*FOR NOW:Should never require multiple buffers; what else is pack.c for?*/ } /* start from 0 if there is not enough bufs available from here */ if((avail+count) > MAX_BUFS)avail = 0; /* ous_in=0; */ /* for(i=0; itable[i].first) { */ /* assert(_armci_buf_state->table[i].op); */ /* } */ /* if(_armci_buf_state->table[i].op) { */ /* assert(_armci_buf_state->table[i].first==i); */ /* ous_in++; */ /* } */ /* } */ /* avail should never point to buffer in a middle of a set of used bufs */ if(_armci_buf_state->table[avail].op && (_armci_buf_state->table[avail].first != (unsigned int) avail)){ sleep(1); printf("%d: inconsistent first. avail=%d count=%d first=%d size=%d\n", armci_me, avail, count, _armci_buf_state->table[avail].first, size); armci_die2("armci_buf_get: inconsistent first", avail, _armci_buf_state->table[avail].first); } #if 0 /* we need complete "count" number of buffers */ for(i=0;itable[cur].op && _armci_buf_state->table[cur].first==(unsigned int) cur) _armci_buf_complete_index(cur,1); } #else assert(count == 1); if(_armci_buf_state->table[avail].op || _armci_buf_state->table[avail].first) { for(i=0; itable[i].op && !_armci_buf_state->table[i].first) break; #if defined(OPENIB) if(_armci_buf_test_index(i,1)) { /* ous_in -= 1; */ break; } #endif } if(itable[avail+i].op = operation; _armci_buf_state->table[avail+i].to = to; _armci_buf_state->table[avail+i].count= count; _armci_buf_state->table[avail+i].first = avail; } _armci_buf_state->buf[avail].id.tag=0; _armci_buf_state->buf[avail].id.bufid=avail; _armci_buf_state->buf[avail].id.protocol=0; # ifdef BUF_EXTRA_FIELD_T INIT_SEND_BUF(_armci_buf_state->buf[avail].field,_armci_buf_state->table[avail].snd,_armci_buf_state->table[avail].rcv); #endif #ifdef HISTORY history[h].size=size; history[h].op=operation; history[h].count=count; history[h].id = avail; h++; #endif if(DEBUG_ || 0) { printf("%d:buf_get:size=%d max=%d got %d ptr=%p count=%d op=%d to=%d\n", armci_me,size,MSG_BUFLEN_SMALL,avail, _armci_buf_state->buf[avail].buffer, count,operation,to); fflush(stdout); } /* select candidate buffer for next allocation request */ _armci_buf_state->avail = avail+count; _armci_buf_state->avail %= MAX_BUFS; /* ous_out=0; */ /* for(i=0; itable[i].first) { */ /* assert(_armci_buf_state->table[i].op); */ /* } */ /* if(_armci_buf_state->table[i].op) { */ /* assert(_armci_buf_state->table[i].first==i); */ /* ous_out++; */ /* } */ /* } */ /* assert(ous_in+1 == ous_out); */ return(_armci_buf_state->buf[avail].buffer); } void _armci_buf_release_index(int index) { int count; buf_state_t *buf_state = _armci_buf_state->table +index; char *_armci_buf_ptr_from_id(int id); if((index >= MAX_BUFS+MAX_SMALL_BUFS)|| (index<0)) armci_die2("armci_buf_release: bad index:",index,MAX_BUFS); count = _armci_buf_state->table[index].count; if(DEBUG_) { printf("%d:_armci_buf_release_index %d ptr=%p count=%d op=%d smavail=%d\n", armci_me,index,_armci_buf_ptr_from_id(index),count, _armci_buf_state->table[index].op,_armci_buf_state->smavail); fflush(stdout); } /* clear table slots for all the buffers in the set for this request */ for(; count; count--, buf_state++) { memset(buf_state, '\0', sizeof(buf_state_t)); /* *(int*)buf_state = 0; */ } if(index >= MAX_BUFS){ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=0; #ifndef VAPI _armci_buf_state->smavail = index; #endif } else{ _armci_buf_state->buf[index].id.tag=0; #ifndef VAPI _armci_buf_state->avail = index; #endif } /* the current buffer is prime candidate to satisfy next buffer request */ } /*\ release buffer when it becomes free \*/ void _armci_buf_release(void *buf) { _armci_buf_release_index(_armci_buf_to_index(buf)); } /*\ return pointer to buffer number id \*/ char *_armci_buf_ptr_from_id(int id) { if(id <0 || id >=(MAX_BUFS+MAX_SMALL_BUFS)) armci_die2("armci_buf_ptr_from_id: bad id",id,MAX_BUFS); if(id >=MAX_BUFS)return(_armci_buf_state->smallbuf[id-MAX_BUFS].buffer); return(_armci_buf_state->buf[id].buffer); } /*\function called from PARMCI_Wait to wait for non-blocking ops \*/ void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode) { int i=0; #if 0 printf("\n%d:wait called with bufid=%d tag=%d \n",armci_me,bufid,tag); fflush(stdout); #endif if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { #if 0 for(i=0;ibuf[i].id.tag) _armci_buf_complete_index(i,1); } for(i=0;ismallbuf[i].id.tag) _armci_buf_complete_index(i+MAX_BUFS,1); } #else { const int smavail=_armci_buf_state->smavail; const int avail = _armci_buf_state->avail; const int startsmall = (smavail-MAX_BUFS+1+MAX_SMALL_BUFS)%MAX_SMALL_BUFS+MAX_BUFS; const int start =(avail+1+MAX_BUFS)%MAX_BUFS; i = start; do { if(tag && tag==_armci_buf_state->buf[i].id.tag) _armci_buf_complete_index(i,1); i = (i+1+MAX_BUFS)%MAX_BUFS; } while(i != start); i = startsmall; do { if(tag && tag==_armci_buf_state->smallbuf[i-MAX_BUFS].id.tag) _armci_buf_complete_index(i,1); i = (i-MAX_BUFS+1+MAX_SMALL_BUFS)%MAX_SMALL_BUFS+MAX_BUFS; } while(i != startsmall); } #endif *retcode=0; } else { if(bufidbuf[bufid].id.tag) _armci_buf_complete_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) _armci_buf_complete_index(bufid,1); } *retcode=0; } } /*\function called from PARMCI_Test to test completion of non-blocking ops \*/ void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode) { int i; if(bufid == NB_NONE) *retcode=0; else if(bufid == NB_MULTI) { for(i=0;ibuf[i].id.tag){ if(_armci_buf_test_index(i,1)){ *retcode=1; break; } } } for(i=0;ismallbuf[i].id.tag) if(_armci_buf_test_index(i+MAX_BUFS,1)){ *retcode=1; break; } } } else { if(bufidbuf[bufid].id.tag) *retcode = _armci_buf_test_index(bufid,1); } else{ if(tag && tag==_armci_buf_state->smallbuf[bufid-MAX_BUFS].id.tag) *retcode = _armci_buf_test_index(bufid,1); } } } /*\function to set the buffer tag and the protocol \*/ void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol) { int index = _armci_buf_to_index(bufptr); /*_armci_buf_state->table[index].async=1;*/ if(indexbuf[index].id.tag=tag; _armci_buf_state->buf[index].id.protocol=protocol; } else{ _armci_buf_state->smallbuf[index-MAX_BUFS].id.tag=tag; _armci_buf_state->smallbuf[index-MAX_BUFS].id.protocol=protocol; } } /*\function to return bufinfo, given buf ptr \*/ BUF_INFO_T *_armci_buf_to_bufinfo(void *buf){ if(buf > (void *)_armci_buffers && buf < (void *)(_armci_buffers+MAX_BUFS)){ return(&((BUF_TO_EBUF(buf))->id)); } else if(buf > (void *)_armci_smbuffers && buf < (void *)(_armci_smbuffers+MAX_SMALL_BUFS)){ return(&((BUF_TO_SMEBUF(buf))->id)); } else { armci_die("armci_buf_to_index: bad pointer",0); return(0); } } /*\function to clear all buffers \*/ void _armci_buf_clear_all() { int i; for(i=0;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->buf[i].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } for(i=MAX_BUFS;itable[i].op || _armci_buf_state->table[i].first) CLEAR_SEND_BUF_FIELD(_armci_buf_state->smallbuf[i-MAX_BUFS].field,_armci_buf_state->table[i].snd,_armci_buf_state->table[i].rcv,_armci_buf_state->table[i].to,_armci_buf_state->table[i].op); #endif } } #ifdef VAPI /* this will work for vapi as there is no get pipeline enabled in vapi * with get pipeline, this will break very badly */ void _armci_buf_update_scatter_count(int id) { int i,num,last,first; for(i=0;itable[i].op==GET){ request_header_t *msginfo; msginfo = (request_header_t*)_armci_buf_state->buf[i].buffer; if(msginfo->pinned && msginfo->bypass && msginfo->format == STRIDED){ num = *(int *)((char *)msginfo+msginfo->bytes); last = *(int *)((char *)msginfo+msginfo->bytes+sizeof(int)); first = last - num+1; if(first < 0 )first+=DSCRID_SCATTERCLIENT_END-DSCRID_SCATTERCLIENT-1; if(id == first && num!=0){ *(int *)((char *)msginfo+msginfo->bytes) = (--num); return; } } } # endif } for(i=MAX_BUFS;itable[i].op==GET){ request_header_t *msginfo = (request_header_t*)_armci_buf_state->smallbuf[i-MAX_BUFS].buffer; if(msginfo->pinned && msginfo->bypass && msginfo->format == STRIDED){ num = *(int *)((char *)msginfo+msginfo->bytes); last = *(int *)((char *)msginfo+msginfo->bytes+sizeof(int)); first = last - num+1; if(first < 0 )first+=DSCRID_SCATTERCLIENT_END-DSCRID_SCATTERCLIENT-1; if(id == first && num!=0){ *(int *)((char *)msginfo+msginfo->bytes) = (--num); return; } } } # endif } } #endif #endif /* function to return bufinfo, given buf tag */ BUF_INFO_T *_armci_tag_to_bufinfo(msg_tag_t tag) { int idx; for (idx=0; idx < MAX_BUFS; idx++) if (EQ_TAGS(_armci_buffers[idx].id.tag, tag)) break; if (idx == MAX_BUFS) {/* not found is regular buffers */ for (idx = 0; idx < MAX_SMALL_BUFS; idx++) if (EQ_TAGS(_armci_smbuffers[idx].id.tag, tag)) break; if (idx == MAX_SMALL_BUFS) /* not found at all */ #ifdef SOCKETS armci_die("_armci_tag_to_bufinfo: bad tag",tag); #else armci_die("_armci_tag_to_bufinfo: bad tag",0); #endif return &(_armci_smbuffers[idx].id); } else return &(_armci_buffers[idx].id); } /* inline primitives for buffer state management */ INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to) { char *buf = _armci_buf_get(size, operation, to); _armci_buf_set_busy(buf, 0); return buf; } INLINE void _armci_buf_set_busy(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].busy = state; } INLINE void _armci_buf_set_busy_idx(int idx, int state) { _armci_buf_state->table[idx].busy = state; } #if 0 INLINE int _armci_buf_cmpld(void *buf) { return _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl; } #else INLINE int _armci_buf_cmpld(int bufid) { return _armci_buf_state->table[bufid].cmpl; } #endif INLINE void _armci_buf_set_cmpld(void *buf, int state) { _armci_buf_state->table[_armci_buf_to_index(buf)].cmpl = state; } INLINE void _armci_buf_set_cmpld_idx(int idx, int state) { _armci_buf_state->table[idx].cmpl = state; } ga-5-4/armci/src/memory/kr_malloc.c0000644000175000017500000004126512662210413015336 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: kr_malloc.c,v 1.24 2006-09-12 23:21:21 andriy Exp $ */ #if HAVE_STDIO_H # include #endif #include "kr_malloc.h" #include "armcip.h" /* for DEBUG purpose only. remove later */ #include "locks.h" #define DEBUG 0 /* Storage allocator basically copied from ANSI K&R and corrupted */ extern char *armci_allocate(); /* Used to get memory from the system */ #if !defined(armci_die) extern void armci_die(); #endif static char *kr_malloc_shmem(size_t nbytes, context_t *ctx); static void kr_free_shmem(char *ap, context_t *ctx); /** * DEFAULT_NALLOC: No. of units of length ALIGNMENT to get in every * request to the system for memory (8MB/64 => 128*1024units) * DEFAULT_MAX_NALLOC: Maximum number of units that can get i.e.1GB * (if unit size=64bytes, then max units=1024MB/64 = 16*1024*1024) */ #define DEFAULT_NALLOC (4*128*1024) #define DEFAULT_NALLOC_ALIGN 1024 #define DEFAULT_MAX_NALLOC (64*1024*1024*16) /* mutual exclusion defs go here */ #define LOCKED 100 #define UNLOCKED 101 static int lock_mode=UNLOCKED; /* enable locking only after armci is initailized as locks (and lock data structures) are initialized in PARMCI_Init */ #define LOCKIT(p) \ if(_armci_initialized && lock_mode==UNLOCKED) { \ NAT_LOCK(0,p); lock_mode=LOCKED; \ } #define UNLOCKIT(p) \ if(_armci_initialized && lock_mode==LOCKED) { \ NAT_UNLOCK(0,p); lock_mode=UNLOCKED; \ } static int do_verify = 0; /* Flag for automatic heap verification */ #define VALID1 0xaaaaaaaa /* For validity check on headers */ #define VALID2 0x55555555 #define USEDP 0 /* CHECK. By default anable this. */ static void kr_error(char *s, unsigned long i, context_t *ctx) { char string[256]; sprintf(string,"kr_malloc: %s %ld(0x%lx)\n", s, i, i); #if 0 kr_malloc_print_stats(ctx); #endif armci_die(string, i); } static Header *morecore(size_t nu, context_t *ctx) { char *cp; Header *up; #if DEBUG (void) printf("%d: morecore 1: Getting %ld more units of length %d nalloc=%d\n", armci_me, (long)nu, sizeof(Header),ctx->nalloc); (void) fflush(stdout); #endif if (ctx->total >= ctx->max_nalloc) { # if DEBUG armci_die("kr_malloc: morecore: maximum allocation reached",armci_me); # endif return (Header *) NULL; /* Enforce upper limit on core usage */ } #if 1 /* 07/03 ctx->nalloc is now the minimum # units we ask from OS */ nu = DEFAULT_NALLOC_ALIGN*((nu-1)/DEFAULT_NALLOC_ALIGN+1); if(nu < ctx->nalloc) nu = ctx->nalloc; #else nu = ctx->nalloc*((nu-1)/ctx->nalloc+1); /* nu must by a multiplicity of nalloc */ #endif #if DEBUG (void) printf("%d: morecore: Getting %ld more units of length %d\n", armci_me, (long)nu, sizeof(Header)); (void) fflush(stdout); #endif if ((cp =(char *)(*ctx->alloc_fptr)((size_t)nu * sizeof(Header))) == (char *)NULL) return (Header *) NULL; ctx->total += nu; /* Have just got nu more units */ ctx->nchunk++; /* One more chunk */ ctx->nfrags++; /* Currently one more frag */ ctx->inuse += nu; /* Inuse will be decremented by kr_free */ up = (Header *) cp; up->s.size = nu; up->s.valid1 = VALID1; up->s.valid2 = VALID2; /* Insert into linked list of blocks in use so that kr_free works ... for debug only */ up->s.ptr = ctx->usedp; ctx->usedp = up; kr_free((char *)(up+1), ctx); /* Try to join into the free list */ return ctx->freep; } void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx) { int scale; if(usize <= 0) usize = sizeof(Header); scale = usize>>LOG_ALIGN; if(scale<1)fprintf(stderr,"Error: kr_malloc_init !!!\n"); if(nalloc==0) nalloc = DEFAULT_NALLOC; if(max_nalloc==0) max_nalloc = DEFAULT_MAX_NALLOC; ctx->usize = sizeof(Header); ctx->nalloc = nalloc * scale; ctx->max_nalloc = max_nalloc * scale; ctx->alloc_fptr = alloc_fptr; ctx->freep = NULL; ctx->usedp = NULL; ctx->shmid = -1; ctx->shmoffset = 0; ctx->shmsize = 0; ctx->ctx_type = -1; do_verify = debug; } char *kr_malloc(size_t nbytes, context_t *ctx) { Header *p, *prevp; size_t nunits; char *return_ptr; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) return kr_malloc_shmem(nbytes,ctx); #endif /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = 0; ctx->inuse = 0; ctx->nfrags = 0; ctx->maxuse = 0; ctx->nmcalls= 0; ctx->nfcalls= 0; /* Initialize linked list */ ctx->base.s.ptr = ctx->freep = prevp = &(ctx->base); ctx->base.s.size = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; } ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; for (p=prevp->s.ptr; ; prevp = p, p = p->s.ptr) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) /* exact fit */ prevp->s.ptr = p->s.ptr; else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; return_ptr = (char *) (p+1); break; } if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } } } return return_ptr; } void kr_free(char *ap, context_t *ctx) { Header *bp, *p, **up; #if !((defined(SUN) || defined(SOLARIS)) && !defined(SHMMAX_SEARCH_NO_FORK)) if(ctx->ctx_type == KR_CTX_SHMEM) { kr_free_shmem(ap,ctx); return; } #endif ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } /* Join the memory back into the free linked list */ for (p=ctx->freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) if (p >= p->s.ptr && (bp > p || bp < p->s.ptr)) break; /* Freed block at start or end of arena */ if (bp + bp->s.size == p->s.ptr) {/* join to upper neighbour */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else bp->s.ptr = p->s.ptr; if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ } else p->s.ptr = bp; ctx->freep = p; } /* end if on ap */ } /* Print to standard output the usage statistics. */ void kr_malloc_print_stats(context_t *ctx) { fflush(stderr); printf("\nkr_malloc statistics\n-------------------\n\n"); printf("Total memory from system ... %ld bytes\n", (long)(ctx->total*ctx->usize)); printf("Current memory usage ....... %ld bytes\n", (long)(ctx->inuse*ctx->usize)); printf("Maximum memory usage ....... %ld bytes\n", (long)(ctx->maxuse*ctx->usize)); printf("No. chunks from system ..... %ld\n", ctx->nchunk); printf("No. of fragments ........... %ld\n", ctx->nfrags); printf("No. of calls to kr_malloc ... %ld\n", ctx->nmcalls); printf("No. of calls to kr_free ..... %ld\n", ctx->nfcalls); printf("\n"); fflush(stdout); } /* Currently assumes that are working in a single region. */ void kr_malloc_verify(context_t *ctx) { Header *p; if(_armci_initialized && lock_mode==UNLOCKED) { LOCKIT(armci_master); lock_mode=LOCKED; } if ( ctx->freep ) { /* Check the used list */ for (p=ctx->usedp; p; p=p->s.ptr) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on usedlist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on usedlist", (unsigned long) p->s.size, ctx); } /* Check the free list */ p = ctx->base.s.ptr; while (p != &(ctx->base)) { if (p->s.valid1 != VALID1 || p->s.valid2 != VALID2) kr_error("invalid header on freelist", (unsigned long) p->s.valid1, ctx); if (p->s.size > ctx->total) kr_error("invalid size in header on freelist", (unsigned long) p->s.size, ctx); p = p->s.ptr; } } /* end if */ if(_armci_initialized && lock_mode==LOCKED) { UNLOCKIT(armci_master); lock_mode=UNLOCKED; } } /********************** BEGIN: kr_malloc for ctx_shmem *********************/ #if defined(SYSV) || defined(MMAP) #include "armci_shmem.h" extern int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize); extern Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize); /* returns, address of the shared memory region based on shmid, offset. * (i.e. return_addr = stating address of shmid + offset) */ #define SHM_PTR(hdr) armci_get_shmem_ptr((hdr)->s.shmid, (hdr)->s.shmoffset, (hdr)->s.shmsize) /* * kr_malloc_shmem: memory allocator for shmem context (i.e ctx_shmem) */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { Header *p, *prevp; size_t nunits, prev_shmsize=0; char *return_ptr; int prev_shmid=-1; long prev_shmoffset=0; LOCKIT(armci_master); /* Rather than divide make the alignment a known power of 2 */ nunits = ((nbytes + sizeof(Header) - 1)>>LOG_ALIGN) + 1; /* If first time in need to initialize the free list */ if ((prevp = ctx->freep) == NULL) { if (sizeof(Header) != ALIGNMENT) kr_error("kr_malloc_shmem: Alignment is not valid", (unsigned long) ALIGNMENT, ctx); ctx->total = 0; /* Initialize statistics */ ctx->nchunk = ctx->inuse = ctx->maxuse = 0; ctx->nfrags = ctx->nmcalls = ctx->nfcalls = 0; /* Initialize linked list */ ctx->base.s.size = 0; ctx->base.s.shmid = -1; ctx->base.s.shmoffset = 0; ctx->base.s.shmsize = 0; ctx->base.s.valid1 = VALID1; ctx->base.s.valid2 = VALID2; if ((p = morecore(nunits, ctx)) == (Header *) NULL) return NULL; ctx->base.s.ptr = prevp = ctx->freep; /* CHECK */ } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; prevp = ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); ctx->nmcalls++; if (do_verify) kr_malloc_verify(ctx); for (p=SHM_PTR(prevp); ; prevp = p, p = SHM_PTR(p)) { if (p->s.size >= nunits) { /* Big enuf */ if (p->s.size == nunits) { /* exact fit */ prevp->s.ptr = p->s.ptr; prevp->s.shmid = p->s.shmid; prevp->s.shmoffset = p->s.shmoffset; prevp->s.shmsize = p->s.shmsize; } else { /* allocate tail end */ p->s.size -= nunits; p += p->s.size; p->s.size = nunits; p->s.valid1 = VALID1; p->s.valid2 = VALID2; ctx->nfrags++; /* Have just increased the fragmentation */ } #if USEDP /* Insert into linked list of blocks in use ... for debug only */ p->s.ptr = ctx->usedp; ctx->usedp = p; #endif ctx->inuse += nunits; /* Record usage */ if (ctx->inuse > ctx->maxuse) ctx->maxuse = ctx->inuse; ctx->freep = prevp; ctx->shmid = prev_shmid; ctx->shmoffset = prev_shmoffset; ctx->shmsize = prev_shmsize; return_ptr = (char *) (p+1); break; } prev_shmid = prevp->s.shmid; prev_shmoffset = prevp->s.shmoffset; prev_shmsize = prevp->s.shmsize; if (p == ctx->freep) { /* wrapped around the free list */ if ((p = morecore(nunits, ctx)) == (Header *) NULL) { return_ptr = (char *) NULL; break; } prev_shmid = ctx->shmid; prev_shmoffset = ctx->shmoffset; prev_shmsize = ctx->shmsize; } } UNLOCKIT(armci_master); return return_ptr; } static void kr_free_shmem(char *ap, context_t *ctx) { Header *bp, *p, *nextp; #if USEDP Header **up; #endif int shmid=-1; long shmoffset=0; size_t shmsize=0; LOCKIT(armci_master); ctx->nfcalls++; if (do_verify) kr_malloc_verify(ctx); /* only do something if pointer is not NULL */ if ( ap ) { bp = (Header *) ap - 1; /* Point to block header */ if (bp->s.valid1 != VALID1 || bp->s.valid2 != VALID2) kr_error("kr_free_shmem: pointer not from kr_malloc", (unsigned long) ap, ctx); ctx->inuse -= bp->s.size; /* Decrement memory ctx->usage */ #if USEDP /* Extract the block from the used linked list ... for debug only */ for (up=&(ctx->usedp); ; up = &((*up)->s.ptr)) { if (!*up) kr_error("kr_free_shmem: block not found in used list\n", (unsigned long) ap, ctx); if (*up == bp) { *up = bp->s.ptr; break; } } #endif if(ctx->shmid==-1) { armci_get_shmem_info((char*)bp, &ctx->shmid, &ctx->shmoffset, &ctx->shmsize); ctx->base.s.shmid = ctx->shmid; ctx->base.s.shmsize = ctx->shmsize; ctx->base.s.shmoffset = ctx->shmoffset; p = ctx->freep = bp; p->s.ptr = bp; p->s.size-=SHMEM_CTX_UNITS; /*memory to store shmem info in context*/ p->s.shmid = ctx->shmid; p->s.shmsize = ctx->shmsize; p->s.shmoffset = ctx->shmoffset; UNLOCKIT(armci_master); return; } ctx->freep = armci_get_shmem_ptr(ctx->shmid, ctx->shmoffset, ctx->shmsize); shmid = ctx->shmid; shmoffset = ctx->shmoffset; shmsize = ctx->shmsize; /* Join the memory back into the free linked list */ p = ctx->freep; nextp = SHM_PTR(p); for ( ; !(bp > p && bp < nextp); p=nextp, nextp=SHM_PTR(p)) { if (p >= nextp && (bp > p || bp < nextp)) break; /* Freed block at start or end of arena */ nextp = SHM_PTR(p); shmid = p->s.shmid; shmoffset = p->s.shmoffset; shmsize = p->s.shmsize; } if (bp + bp->s.size == nextp) {/* join to upper neighbour */ bp->s.size += nextp->s.size; bp->s.ptr = nextp->s.ptr; ctx->nfrags--; /* Lost a fragment */ bp->s.shmid = nextp->s.shmid; bp->s.shmoffset = nextp->s.shmoffset; bp->s.shmsize = nextp->s.shmsize; } else { bp->s.ptr = nextp; bp->s.shmid = p->s.shmid; bp->s.shmoffset = p->s.shmoffset; bp->s.shmsize = p->s.shmsize; } if (p + p->s.size == bp) { /* Join to lower neighbour */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; ctx->nfrags--; /* Lost a fragment */ p->s.shmid = bp->s.shmid; p->s.shmoffset = bp->s.shmoffset; p->s.shmsize = bp->s.shmsize; } else { p->s.ptr = bp; armci_get_shmem_info((char*)bp, &p->s.shmid, &p->s.shmoffset, &p->s.shmsize); } ctx->freep = p; ctx->shmid = shmid; ctx->shmoffset = shmoffset; ctx->shmsize = shmsize; } /* end if on ap */ UNLOCKIT(armci_master); } #else /* #ifdef SYSV */ /* What are doing here */ static char *kr_malloc_shmem(size_t nbytes, context_t *ctx) { armci_die("kr_malloc_shmem(): Invalid Function Call", 0L); } static void kr_free_shmem(char *ap, context_t *ctx) { armci_die("kr_free_shmem(): Invalid Function Call", 0L); } #endif /* #ifdef SYSV */ /********************** END: kr_malloc for ctx_shmem *********************/ /** issues: 1. do usage statistics only if debug/DEBUG is enabled */ ga-5-4/armci/src/memory/memory.c0000644000175000017500000011303612662210413014677 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: memory.c,v 1.56.2.3 2007-04-25 23:49:55 d3p687 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #include "armcip.h" #include "message.h" #include "kr_malloc.h" #define DEBUG_ 0 #define USE_MALLOC #define USE_SHMEM_ #define SHM_UNIT 1024 #if defined(CRAY_SHMEM) extern void armci_shmalloc_exchange_address(void **ptr_arr); extern void armci_shmalloc_exchange_offsets(context_t *); # if defined(CRAY_XT) # include # ifdef CATAMOUNT # include # endif # endif #endif static context_t ctx_localmem; #if defined(PORTALS_WITHREG) || defined(PORTALS) || defined(ALLOW_PIN) static context_t ctx_mlocalmem; #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) #include "armci_shmem.h" #if !defined(USE_SHMEM) && (defined(HITACHI) || defined(MULTI_CTX)) # define USE_SHMEM #endif #if !(defined(LAPI)||defined(QUADRICS)||defined(SERVER_THREAD)) ||\ defined(USE_SHMEM) #define RMA_NEEDS_SHMEM #endif #if defined(DATA_SERVER) && !defined(SERVER_THREAD) extern int _armci_server_started; #endif /**************************************************************************** * Memory Allocator called by kr_malloc on SGI Altix to get more core from OS */ #ifdef SGIALTIX #include #if HAVE_UNISTD_H # include #endif #define DEF_UNITS (64) #define MAX_SEGS 512 #define _SHMMAX_ALTIX 32*1024 /* 32 MB */ #define _SHMMAX_ALTIX_GRP 512*1024 /* 512 MB */ static context_t altix_ctx_shmem; static context_t altix_ctx_shmem_grp; static size_t altix_pagesize; extern void armci_memoffset_table_newentry(void *ptr, size_t seg_size); void *armci_altix_allocate(size_t bytes) { void *ptr, *sptr; ARMCI_PR_DBG("enter",0); sptr=ptr= shmalloc(bytes); if(sptr == NULL) armci_die("armci_altix_allocate: shmalloc failed\n", armci_me); armci_memoffset_table_newentry(ptr, bytes); #if 0 if(ptr){ /* touch each page to establish ownership */ int i; for(i=0; i< bytes/altix_pagesize; i++){ *(double*)ptr=0.; ((char*)ptr) += altix_pagesize; } } #endif ARMCI_PR_DBG("exit",0); return sptr; } void armci_altix_shm_init() { ARMCI_PR_DBG("enter",0); altix_pagesize = getpagesize(); kr_malloc_init(SHM_UNIT, _SHMMAX_ALTIX, 0, armci_altix_allocate, 0, &altix_ctx_shmem); kr_malloc_init(SHM_UNIT, _SHMMAX_ALTIX_GRP, _SHMMAX_ALTIX_GRP, armci_altix_allocate, 0, &altix_ctx_shmem_grp); /* allocate a huge segment for groups. When kr_malloc() is called for the first time for this altix_ctx_shmem_grp context with some minimal size of 8 bytes, a huge segment of size (SHM_UNIT*_SHMMAX_ALTIX_GRP) will be created */ { void *ptr; ptr=kr_malloc((size_t)8, &altix_ctx_shmem_grp); if(ptr==NULL) armci_die("armci_altix_shm_init(): malloc failed", armci_me); } ARMCI_PR_DBG("exit",0); } void armci_altix_shm_malloc(void *ptr_arr[], armci_size_t bytes) { long size=bytes; void *ptr; int i; ARMCI_PR_DBG("enter",0); armci_msg_lgop(&size,1,"max"); ptr=kr_malloc((size_t)size, &altix_ctx_shmem); bzero(ptr_arr,(armci_nproc)*sizeof(void*)); ptr_arr[armci_me] = ptr; if(size!=0 && ptr==NULL) armci_die("armci_altix_shm_malloc(): malloc failed", armci_me); for(i=0; i< armci_nproc; i++) if(i!=armci_me) ptr_arr[i]=shmem_ptr(ptr,i); ARMCI_PR_DBG("exit",0); } #ifdef MSG_COMMS_MPI void armci_altix_shm_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { long size=bytes; void *ptr; int i,grp_me, grp_nproc; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); armci_msg_group_lgop(&size,1,"max",group); ptr=kr_malloc((size_t)size, &altix_ctx_shmem_grp); if(size!=0 && ptr==NULL) armci_die("armci_altix_shm_malloc_group(): malloc failed for groups. Increase _SHMMAX_ALTIX_GRP", armci_me); bzero(ptr_arr,(grp_nproc)*sizeof(void*)); ptr_arr[grp_me] = ptr; for(i=0; i< grp_nproc; i++) if(i!=grp_me) ptr_arr[i]=shmem_ptr(ptr,ARMCI_Absolute_id(group, i)); ARMCI_PR_DBG("exit",0); } #endif #endif /* end ifdef SGIALTIX */ /* ------------------ End Altix memory allocator ----------------- */ void kr_check_local() { #if 0 kr_malloc_print_stats(&ctx_localmem); #endif kr_malloc_verify(&ctx_localmem); #if defined(PORTALS_WITHREG) kr_malloc_verify(&ctx_mlocalmem); #endif } void armci_print_ptr(void **ptr_arr, int bytes, int size, void* myptr, int off) { int i; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); for(i=0; i< armci_nproc; i++){ int j; if(armci_me ==i){ printf("%d master =%d nproc=%d off=%d\n",armci_me, armci_master,nproc, off); printf("%d:bytes=%d mptr=%p s=%d ",armci_me, bytes, myptr,size); for(j = 0; j< armci_nproc; j++)printf(" %p",ptr_arr[j]); printf("\n"); fflush(stdout); } armci_msg_barrier(); } ARMCI_PR_DBG("exit",0); } /*\ master exports its address of shmem region at the beggining of that region \*/ static void armci_master_exp_attached_ptr(void* ptr) { ARMCI_PR_DBG("enter",0); if(!ptr) armci_die("armci_master_exp_att_ptr: null ptr",0); *(volatile void**)ptr = ptr; ARMCI_PR_DBG("exit",0); } /*\ Collective Memory Allocation on shared memory systems \*/ void armci_shmem_malloc(void *ptr_arr[], armci_size_t bytes) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; int nproc = armci_clus_info[armci_clus_me].nslave; ARMCI_PR_DBG("enter",0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(armci_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc:calloc failed",armci_nproc); /* allocate arrays for cluster address translations */ # if defined(DATA_SERVER) len = armci_nclus; # else len = nproc; # endif ptr_ref_arr = calloc(len,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc:calloc 2 failed",len); /* combine all memory requests into size_arr */ size_arr[armci_me] = bytes; armci_msg_lgop(size_arr, armci_nproc, "+"); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< nproc; i++) size += size_arr[i+armci_master]; /* master process creates shmem region and then others attach to it */ if(armci_me == armci_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if(nproc == 1) myptr = kr_malloc(size, &ctx_localmem); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 )armci_die("armci_malloc: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc addr mptr=%p size=%ld\n",armci_me,myptr,size); fflush(stdout); } } /* broadcast shmem id to other processes on the same cluster node */ armci_msg_clus_brdcst(idlist, SHMIDLEN*sizeof(long)); if(armci_me != armci_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # ifdef HITACHI armci_register_shmem(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me]); # endif # if defined(DATA_SERVER) /* get server reference address for every cluster node to perform * remote address translation for global address space */ if(armci_nclus>1){ if(armci_me == armci_master){ # ifdef SERVER_THREAD /* data server thread runs on master process */ ptr_ref_arr[armci_clus_me]=myptr; # else /* ask dataserver process to attach to the region and get * ptr*/ { if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[armci_clus_me]= ptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[armci_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",armci_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ armci_exchange_address(ptr_ref_arr, armci_nclus); }else { ptr_ref_arr[armci_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < armci_nclus; cn++){ int master = armci_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (armci_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< armci_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] = (size_arr[i+master])? ((char*)ptr)+offset : NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< nproc; i++) { ptr_ref_arr[i] = (size_arr[i+armci_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+armci_master]; } /* exchange addreses with all other processes */ ptr_arr[armci_me] = (char*)ptr_ref_arr[armci_me-armci_master]; armci_exchange_address(ptr_arr, armci_nproc); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+armci_master), nproc*sizeof(void*)); /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ # endif #ifdef ALLOW_PIN if(armci_nclus>1)armci_global_region_exchange(myptr, (long) size_arr[armci_me]); else #endif armci_msg_barrier(); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } /******************************************************************** * Non-collective Memory Allocation on shared memory systems \*/ void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMIptr used in ARMCI data xfer ops */ long idlist[SHMIDLEN]; /* can malloc if there is no data server process & has 1 process/node*/ #ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem); else #endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 ) armci_die("armci_shmem_memget: create failed", (int)(size>>10)); if(DEBUG_) { printf("%d: armci_shmem_memget: addr=%p size=%ld %ld %ld \n", armci_me, myptr, (long)size, idlist[0], idlist[1]); fflush(stdout); } armci_ptr = myptr; #if defined(DATA_SERVER) /* get server reference address to perform * remote address translation for global address space */ if(armci_nclus>1) { # ifdef SERVER_THREAD /* data server thread runs on master process */ if(armci_me != armci_master) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } # else /* ask dataserver process to attach to region and get ptr*/ { if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &armci_ptr, sizeof(void*)); } } # endif } #endif /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; bcopy(idlist, meminfo->idlist, SHMIDLEN*sizeof(long)); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { void *ptr=NULL; long size = (long) meminfo->size; long *idlist = (long*) meminfo->idlist; if(SAMECLUSNODE(meminfo->cpid)) { /* Attach to the shared memory segment */ ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("ARMCi_Memat: could not attach", (int)(size>>10)); /* CHECK: now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(ptr); } else { ptr = meminfo->armci_addr; /* remote address */ } return ptr; } void armci_shmem_memctl(armci_meminfo_t *meminfo) { /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { void *ptr = meminfo->addr; #ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); #else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); #endif } } /****** End: Non-collective memory allocation on shared memory systems *****/ #ifdef MSG_COMMS_MPI /******************************************************************** * Group Memory Allocation on shared memory systems for ARMCI Groups \*/ void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *myptr=NULL, *ptr=NULL; long idlist[SHMIDLEN]; long size=0, offset=0; long *size_arr; void **ptr_ref_arr; int i,cn, len; /* int nproc = armci_clus_info[armci_clus_me].nslave; ? change ? */ int grp_me, grp_nproc, grp_nclus, grp_master, grp_clus_nproc, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); /* Get the group info: group size & group rank */ ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } grp_nclus = grp_attr->grp_nclus; grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; grp_clus_nproc = grp_attr->grp_clus_info[grp_clus_me].nslave; bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); /* allocate work arrays */ size_arr = (long*)calloc(grp_nproc,sizeof(long)); if(!size_arr)armci_die("armci_malloc_group:calloc failed",grp_nproc); /* allocate arrays for cluster address translations */ # if defined(DATA_SERVER) len = grp_nclus; # else len = grp_clus_nproc; # endif ptr_ref_arr = calloc(len,sizeof(void*)); /* must be zero */ if(!ptr_ref_arr)armci_die("armci_malloc_group:calloc 2 failed",len); /* combine all memory requests into size_arr */ size_arr[grp_me] = bytes; armci_msg_group_gop_scope(SCOPE_ALL, size_arr, grp_nproc, "+", ARMCI_LONG, group); /* determine aggregate request size on the cluster node */ for(i=0, size=0; i< grp_clus_nproc; i++) size += size_arr[i+grp_master]; /* master process creates shmem region and then others attach to it */ if(grp_me == grp_master ){ /* can malloc if there is no data server process and has 1 process/node*/ # ifndef RMA_NEEDS_SHMEM if( armci_clus_info[armci_clus_me].nslave == 1) myptr = kr_malloc(size, &ctx_localmem); else # endif myptr = Create_Shared_Region(idlist+1,size,idlist); if(!myptr && size>0 )armci_die("armci_malloc_group: could not create", (int)(size>>10)); /* place its address at begining of attached region for others to see */ if(size)armci_master_exp_attached_ptr(myptr); if(DEBUG_){ printf("%d:armci_malloc_group addr mptr=%p ref=%p size=%ld %ld %ld \n",armci_me,myptr,*(void**)myptr, size,idlist[0],idlist[1]); fflush(stdout); } } /* broadcast shmem id to other processes (in the same group) on the same cluster node */ armci_grp_clus_brdcst(idlist, SHMIDLEN*sizeof(long), grp_master, grp_clus_nproc, group); if(grp_me != grp_master){ myptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!myptr)armci_die("armci_malloc_group: could not attach", (int)(size>>10)); /* now every process in a SMP node needs to find out its offset * w.r.t. master - this offset is necessary to use memlock table */ if(size) armci_set_mem_offset(myptr); if(DEBUG_){ printf("%d:armci_malloc_group attached addr mptr=%p ref=%p size=%ld\n", armci_me,myptr, *(void**)myptr,size); fflush(stdout); } } # ifdef HITACHI armci_register_shmem_grp(myptr,size,idlist+1,idlist[0],ptr_ref_arr[armci_clus_me],group); # endif # if defined(DATA_SERVER) /* get server reference address for every cluster node in the group * to perform remote address translation for global address space */ if(grp_nclus>1){ if(grp_me == grp_master){ # ifdef SERVER_THREAD /* data server thread runs on master process */ if(ARMCI_Absolute_id(group,grp_master)!=armci_master){ /*printf("\n%d: grp_master=%d %ld %ld \n",armci_me,ARMCI_Absolute_id(group,grp_master),idlist[0],idlist[1]);*/ armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else ptr_ref_arr[grp_clus_me]=myptr; # else /* ask data server process to attach to the region and get ptr */ { if(_armci_server_started) { armci_serv_attach_req(idlist, SHMIDLEN*sizeof(long), size, &ptr, sizeof(void*)); ptr_ref_arr[grp_clus_me]= ptr; /* from server*/ } else /* server not yet started */ ptr_ref_arr[grp_clus_me]=myptr; } if(DEBUG_){ printf("%d:addresses server=%p myptr=%p\n",grp_me,ptr,myptr); fflush(stdout); } # endif } /* exchange ref addr of shared memory region on every cluster node*/ { int ratio = sizeof(void*)/sizeof(int); if(DEBUG_)printf("%d: exchanging %ld ratio=%d\n",armci_me, (long)ptr_arr[grp_me], ratio); armci_msg_group_gop_scope(SCOPE_ALL, ptr_ref_arr, grp_nclus*ratio, "+", ARMCI_INT, group); } }else { ptr_ref_arr[grp_master] = myptr; } /* translate addresses for all cluster nodes */ for(cn = 0; cn < grp_nclus; cn++){ int master = grp_attr->grp_clus_info[cn].master; offset = 0; /* on local cluster node use myptr directly */ ptr = (grp_clus_me == cn) ? myptr: ptr_ref_arr[cn]; /* compute addresses pointing to the memory regions on cluster node*/ for(i=0; i< grp_attr->grp_clus_info[cn].nslave; i++){ /* NULL if request size is 0*/ ptr_arr[i+master] =(size_arr[i+master])? ((char*)ptr)+offset: NULL; offset += size_arr[i+master]; } } # else /* compute addresses for local cluster node */ offset =0; for(i=0; i< grp_clus_nproc; i++) { ptr_ref_arr[i] = (size_arr[i+grp_master])? ((char*)myptr)+offset : 0L; offset += size_arr[i+grp_master]; } /* exchange addreses with all other processes */ ptr_arr[grp_me] = (char*)ptr_ref_arr[grp_me-grp_master]; armci_exchange_address_grp(ptr_arr, grp_nproc, group); /* overwrite entries for local cluster node with ptr_ref_arr */ bcopy((char*)ptr_ref_arr, (char*)(ptr_arr+grp_master), grp_clus_nproc*sizeof(void*)); # endif /* armci_print_ptr(ptr_arr, bytes, size, myptr, offset);*/ #ifdef ALLOW_PIN #if 0 /* ????? check ?????? */ armci_die("armci_malloc_group: Not yet implemented", 0); if(grp_nclus>1)armci_global_region_exchange(myptr, (long) size_arr[grp_me]); else #endif #endif armci_msg_group_barrier(group); /* free work arrays */ free(ptr_ref_arr); free(size_arr); ARMCI_PR_DBG("exit",0); } #endif /* ifdef MSG_COMMS_MPI */ #else void armci_shmem_malloc(void* ptr_arr[], int bytes) { armci_die("armci_shmem_malloc should never be called on this system",0); } void armci_shmem_memget(armci_meminfo_t *meminfo, size_t size) { armci_die("armci_shmem_memget should never be called on this system",0); } void* armci_shmem_memat(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memat should never be called on this system",0); } void armci_shmem_memctl(armci_meminfo_t *meminfo) { armci_die("armci_shmem_memctl should never be called on this system",0); } # ifdef MSG_COMMS_MPI void armci_shmem_malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { armci_die("armci_shmem_malloc_group should never be called on this system",0); } # endif #endif #ifdef ALLOW_PIN void *reg_malloc(size_t size) { #ifdef PORTALS char *ptr; extern void *shmalloc(size_t); ARMCI_PR_DBG("enter",0); ptr = malloc(size); #else char *ptr; ARMCI_PR_DBG("enter",0); ptr = malloc(size); #endif armci_region_register_loc(ptr,size); ARMCI_PR_DBG("exit",0); return(ptr); } #endif /* public constructor to initialize the kr_malloc context */ void armci_krmalloc_init_localmem() { #if defined(ALLOW_PIN) kr_malloc_init(0, 0, 0, reg_malloc, 0, &ctx_localmem); kr_malloc_init(0, 0, 0, malloc, 0, &ctx_mlocalmem); ctx_mlocalmem.ctx_type = KR_CTX_LOCALMEM; #elif defined(CRAY_SHMEM) && defined(CRAY_XT) # ifdef CATAMOUNT int units_avail = (cnos_shmem_size() - 1024 * 1024) / SHM_UNIT; # else extern size_t get_xt_heapsize(); int units_avail = (get_xt_heapsize() - 1024 * 1024) / SHM_UNIT; # endif if(DEBUG_) { fprintf(stderr,"%d:krmalloc_init_localmem: symheap=%llu,units(%d)=%d\n", armci_me, SHM_UNIT*units_avail, SHM_UNIT, units_avail); } kr_malloc_init(SHM_UNIT, units_avail, units_avail, shmalloc, 0, &ctx_localmem); armci_shmalloc_exchange_offsets(&ctx_localmem); #else kr_malloc_init(0, 0, 0, malloc, 0, &ctx_localmem); #endif ctx_localmem.ctx_type = KR_CTX_LOCALMEM; } /** * Local Memory Allocation and Free */ void *PARMCI_Malloc_local(armci_size_t bytes) { #if defined(PORTALS) void *rptr; #endif ARMCI_PR_DBG("enter",0); #if defined(PORTALS) rptr=kr_malloc((size_t)bytes, &ctx_mlocalmem); ARMCI_PR_DBG("exit",0); return rptr; #else ARMCI_PR_DBG("exit",0); return (void *)kr_malloc((size_t)bytes, &ctx_localmem); #endif } int PARMCI_Free_local(void *ptr) { ARMCI_PR_DBG("enter",0); #if defined(PORTALS) kr_free((char *)ptr, &ctx_mlocalmem); #else kr_free((char *)ptr, &ctx_localmem); #endif ARMCI_PR_DBG("exit",0); return 0; } #ifdef REGION_ALLOC static context_t ctx_region_shmem; static long *reg_pids=NULL; void armci_region_shm_malloc(void *ptr_arr[], size_t bytes) { long size=bytes; void *ptr; int i, peers=armci_clus_last-armci_clus_first+1; extern void* armci_region_getcore(size_t); extern int armci_region_register(int p, void **pinout, long pid, size_t bytes); if(!reg_pids){ kr_malloc_init(0,0,500*1024*1024, armci_region_getcore, 0, &ctx_region_shmem); reg_pids = (long*)calloc(peers,sizeof(long)); reg_pids[armci_me -armci_clus_first] = getpid(); armci_msg_gop_scope(SCOPE_NODE,reg_pids, peers,"+",ARMCI_LONG); } ptr=kr_malloc((size_t)size, &ctx_region_shmem); if(bytes) if(!ptr) armci_die("armci_region_shm_malloc: failed",bytes); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); ptr_arr[armci_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address(ptr_arr, armci_nproc); for(i=0; igrp_clus_me; int i, peers=grp_attr->grp_clus_info[grp_clus_me].nslave; int grp_clus_first=grp_attr->grp_clus_info[grp_clus_me].master; extern void* armci_region_getcore(size_t); extern int armci_region_register(int p, void **pinout, long pid, size_t bytes); ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_nproc); ptr=kr_malloc((size_t)size, &ctx_region_shmem); if(bytes) if(!ptr) armci_die("armci_region_shm_malloc_grp: failed",bytes); bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); ptr_arr[grp_me] = ptr; /* now combine individual addresses into a single array */ armci_exchange_address_grp(ptr_arr, grp_nproc, group); for(i=0; i 1) # endif if(ARMCI_Uses_shm()){ if(armci_me==armci_master){ # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); # endif } ptr = NULL; return 0; } # endif kr_free(ptr, &ctx_localmem); # endif /* REGION_ALLOC */ #else /* Altix */ if( ARMCI_Uses_shm() ) kr_free(ptr, &altix_ctx_shmem); else kr_free(ptr, &ctx_localmem); #endif ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } int ARMCI_Uses_shm() { int uses=0; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(armci_nproc >1) uses= 1; /* always unless serial mode */ # else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ # endif #endif if(DEBUG_) fprintf(stderr,"%d:uses shmem %d\n",armci_me, uses); return uses; } #ifdef MSG_COMMS_MPI int ARMCI_Uses_shm_grp(ARMCI_Group *group) { int uses=0, grp_me, grp_nproc, grp_nclus; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); grp_nclus = grp_attr->grp_nclus; #if (defined(SYSV) || defined(WIN32) || defined(MMAP) ||defined(HITACHI)) && !defined(NO_SHM) # ifdef RMA_NEEDS_SHMEM if(grp_nproc >1) uses= 1; /* always unless serial mode */ # else #if 0 if(grp_nproc != grp_nclus)uses= 1; /* only when > 1 node used */ #else if(armci_nproc != armci_nclus)uses= 1; /* only when > 1 node used */ #endif # endif #endif if(DEBUG_) fprintf(stderr,"%d (grp_id=%d):uses shmem %d\n",armci_me, grp_me, uses); ARMCI_PR_DBG("exit",0); return uses; } /*\ ************** Begin Group Collective Memory Allocation ****************** * returns array of pointers to blocks of memory allocated by everybody * Note: as the same shared memory region can be mapped at different locations * in each process address space, the array might hold different values * on every process. However, the addresses are legitimate * and can be used in the ARMCI data transfer operations. * ptr_arr[nproc] \*/ int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes, ARMCI_Group *group) { void *ptr; int grp_me, grp_nproc; ARMCI_PR_DBG("enter",0); ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(DEBUG_)fprintf(stderr,"%d (grp_id=%d) bytes in armci_malloc_group %d\n", armci_me, grp_me, (int)bytes); #ifdef REGION_ALLOC armci_region_shm_malloc_grp(ptr_arr, bytes, group); #else #ifdef USE_MALLOC if(grp_nproc == 1) { ptr = kr_malloc((size_t) bytes, &ctx_localmem); if(bytes) if(!ptr) armci_die("armci_malloc_group:malloc 1 failed",(int)bytes); ptr_arr[grp_me] = ptr; ARMCI_PR_DBG("exit",0); return (0); } #endif if( ARMCI_Uses_shm_grp(group) ) { # ifdef SGIALTIX armci_altix_shm_malloc_group(ptr_arr,bytes,group); # else armci_shmem_malloc_group(ptr_arr,bytes,group); # endif } else { /* on distributed-memory systems just malloc & collect all addresses */ ptr = kr_malloc(bytes, &ctx_localmem); if(bytes) if(!ptr) armci_die("armci_malloc:malloc 2 failed",bytes); bzero((char*)ptr_arr,grp_nproc*sizeof(void*)); ptr_arr[grp_me] = ptr; /* now combine individual addresses into a single array */ #if defined(CRAY_SHMEM) armci_shmalloc_exchange_address_grp(ptr_arr, group); #else armci_exchange_address_grp(ptr_arr, grp_nproc, group); #endif # ifdef ALLOW_PIN # if 0 /* ????? check ?????? */ armci_die("armci_malloc_group: Not yet implemented", 0); armci_global_region_exchange(ptr, (long) bytes); # endif # endif } #endif ARMCI_PR_DBG("exit",0); return(0); } /*\ shared memory is released to kr_malloc only on process 0 * with data server malloc cannot be used \*/ int ARMCI_Free_group(void *ptr, ARMCI_Group *group) { int grp_me, grp_nproc, grp_master, grp_clus_me; armci_grp_attr_t *grp_attr=ARMCI_Group_getattr(group); ARMCI_PR_DBG("enter",0); if(!ptr)return 1; ARMCI_Group_size(group, &grp_nproc); ARMCI_Group_rank(group, &grp_me); if(grp_me == MPI_UNDEFINED) { /* check if the process is in this group */ armci_die("armci_malloc_group: process is not a member in this group", armci_me); } /* get the group cluster info */ grp_clus_me = grp_attr->grp_clus_me; grp_master = grp_attr->grp_clus_info[grp_clus_me].master; #ifndef SGIALTIX #ifdef REGION_ALLOC kr_free(ptr, &ctx_region_shmem); #else # if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(NO_SHM) # ifdef USE_MALLOC if(grp_nproc > 1) # endif if(ARMCI_Uses_shm_grp(group)){ if(grp_me == grp_master) { # ifdef RMA_NEEDS_SHMEM Free_Shmem_Ptr(0,0,ptr); # else if(armci_clus_info[armci_clus_me].nslave>1) Free_Shmem_Ptr(0,0,ptr); else kr_free(ptr, &ctx_localmem); # endif } ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } # endif kr_free(ptr, &ctx_localmem); #endif /* ifdef REGION_ALLOC */ #else /* SGI Altix */ if(ARMCI_Uses_shm_grp(group)) kr_free(ptr, &altix_ctx_shmem_grp); else kr_free(ptr, &ctx_localmem); #endif /* SGIALTIX */ ptr = NULL; ARMCI_PR_DBG("exit",0); return 0; } /* ***************** End Group Collective Memory Allocation ******************/ #endif /* ************** Begin Non-Collective Memory Allocation ****************** * Prototype similar to SysV shared memory. */ /** * CHECK: On Altix we are forced to use SysV as shmalloc is collective. We * may use a preallocated shmalloc memory, however, it may NOT still solve * our problem... * NOTE: "int memflg" option for future optimiztions. */ void PARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { void *myptr=NULL; void *armci_ptr=NULL; /* legal ARCMI ptr used in ARMCI data xfer ops*/ size_t size = bytes; if(size<=0) armci_die("PARMCI_Memget: size must be > 0", (int)size); if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); if(memflg!=0) armci_die("PARMCI_Memget: Invalid memflg", memflg); if( !ARMCI_Uses_shm() ) { armci_ptr = myptr = kr_malloc(size, &ctx_localmem); if(size) if(!myptr) armci_die("PARMCI_Memget failed", (int)size); /* fill the meminfo structure */ meminfo->armci_addr = armci_ptr; meminfo->addr = myptr; meminfo->size = size; meminfo->cpid = armci_me; /* meminfo->attr = NULL; */ } else { armci_shmem_memget(meminfo, size); } #ifdef ALLOW_PIN # if 0 /* disabled for now. May not go thru' the fast zero-copy path */ if(armci_nclus>1) armci_global_region_exchange(meminfo->addr, (long)size_arr[armci_me]); # endif #endif if(DEBUG_){ printf("%d: PARMCI_Memget: addresses server=%p myptr=%p bytes=%ld\n", armci_me, meminfo->armci_addr, meminfo->addr, (long)bytes); fflush(stdout); } } void* PARMCI_Memat(armci_meminfo_t *meminfo, long offset) { void *ptr=NULL; if(meminfo==NULL) armci_die("PARMCI_Memat: Invalid arg #1 (NULL ptr)",0); if(meminfo->cpid==armci_me) { ptr = meminfo->addr; return ptr; } if( !ARMCI_Uses_shm()) { ptr = meminfo->addr; } else { ptr = armci_shmem_memat(meminfo); ptr = ((char*)ptr) + offset; } if(DEBUG_) { printf("%d:PARMCI_Memat: attached addr mptr=%p size=%ld\n", armci_me, ptr, (long)meminfo->size); fflush(stdout); } return ptr; } void ARMCI_Memdt(armci_meminfo_t *meminfo, long offset) { /** * Do nothing. May be we need to have reference counting in future. This * is to avoid the case of dangling pointers when the creator of shm * segment calls Memctl and other processes are still attached to this * segment */ } void ARMCI_Memctl(armci_meminfo_t *meminfo) { if(meminfo==NULL) armci_die("PARMCI_Memget: Invalid arg #2 (NULL ptr)",0); /* only the creator can delete the segment */ if(meminfo->cpid == armci_me) { if( !ARMCI_Uses_shm() ) { void *ptr = meminfo->addr; kr_free(ptr, &ctx_localmem); } else { armci_shmem_memctl(meminfo); } } meminfo->addr = NULL; meminfo->armci_addr = NULL; /* if(meminfo->attr!=NULL) free(meminfo->attr); */ } /* ***************** End Non-Collective Memory Allocation ******************/ ga-5-4/armci/src/common/0000755000175000017500000000000012662210413013177 5ustar mbambaga-5-4/armci/src/common/ccopy.c0000644000175000017500000002213512662210413014463 0ustar mbamba/*************************************************************************** COPYRIGHT The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. Copyright Notice + 2009 University of Chicago Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: Jeff R. Hammond Leadership Computing Facility Argonne National Laboratory Argonne IL 60439 USA phone: (630) 252-5381 e-mail: jhammond@anl.gov GOVERNMENT LICENSE Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. DISCLAIMER This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. ***************************************************************************/ #if HAVE_CONFIG_H # include "config.h" #endif #include "copy.h" /* ONE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy1d_n(A, B, n) integer n,i double precision A(n), B(n) ccdir$ no_cache_alloc a,b do i = 1, n B(i) = A(i) end do end #endif void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; for ( i = 0 ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } #if 0 subroutine dcopy1d_u(A, B, n) integer n,n1,i double precision A(n), B(n) double precision d1, d2, d3, d4 n1 = iand(max0(n,0),3) do i = 1, n1 B(i) = A(i) end do do i = n1+1, n, 4 d1 = a(i) d2 = a(i+1) d3 = a(i+2) d4 = a(i+3) b(i) = d1 b(i+1) = d2 b(i+2) = d3 b(i+3) = d4 end do end #endif void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n) { int i; int m = (*n) - ((*n)%4); for ( i = 0 ; i < m ; i+=4 ){ B[i ] = A[i ]; B[i+1] = A[i+1]; B[i+2] = A[i+2]; B[i+3] = A[i+3]; } for ( i = m ; i < (*n) ; i++ ){ B[i] = A[i]; } return; } /* TWO-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy21(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c) end do end do end #endif void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur) { int r, c, i=0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ c * (*ald) + r ]; } } (*cur) = i; return; } #if 0 subroutine dcopy12(rows, cols, A, ald, buf, cur) integer rows, cols integer c, r, ald, cur double precision A(ald,*), buf(ald) cur = 0 do c = 1, cols do r = 1, rows cur = cur+1 A(r,c) = buf(cur) end do end do end #endif void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur) { int r, c, i=0; i = 0; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ c * (*ald) + r ] = buf[i++]; } } (*cur) = i; return; } #if 0 subroutine dcopy2d_n(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) do c = 1, cols do r = 1, rows B(r,c) = A(r,c) end do end do end #endif void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } #if 0 subroutine dcopy2d_u(rows, cols, A, ald, B, bld) integer rows, cols integer c, r, ald, bld double precision A(ald,*), B(bld,*) integer r1 double precision d1, d2, d3, d4 do c = 1, cols r1 = iand(max0(rows,0),3) do r = 1, r1 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 b(r,c) = a(r,c) end do do r = r1 + 1, rows, 4 d1 = a(r,c) d2 = a(r+1,c) d3 = a(r+2,c) d4 = a(r+3,c) b(r,c) = d1 b(r+1,c) = d2 b(r+2,c) = d3 b(r+3,c) = d4 c$$$ b(r,c) = a(r,c) + b(r,c) * 0 c$$$ b(r+1,c) = a(r+1,c) + b(r+1,c) * 0 c$$$ b(r+2,c) = a(r+2,c) + b(r+2,c) * 0 c$$$ b(r+3,c) = a(r+3,c) + b(r+3,c) * 0 enddo enddo end #endif void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld) { int r, c; for ( c = 0 ; c < (*cols) ; c++ ){ int m = (*rows) - ((*rows)%4); for ( r = 0 ; r < m ; r+=4 ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; B[ c * (*bld) + r+1 ] = A[ c * (*ald) + r+1 ]; B[ c * (*bld) + r+2 ] = A[ c * (*ald) + r+2 ]; B[ c * (*bld) + r+3 ] = A[ c * (*ald) + r+3 ]; } for ( r = m ; r < (*rows) ; r++ ){ B[ c * (*bld) + r ] = A[ c * (*ald) + r ]; } } return; } /* THREE-DIMENSIONAL COPY OPERATIONS */ #if 0 subroutine dcopy31(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 buf(cur) = A(r,c,p) end do end do end do end #endif void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ buf[i++] = A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ]; } } } (*cur) = i; return; } #if 0 subroutine dcopy13(rows, cols, planes, A, aldr, aldc, buf, cur) integer rows, cols, planes integer c, r, p, aldr, aldc, cur double precision A(aldr, aldc, *), buf(aldr) cur = 0 do p = 1, planes do c = 1, cols do r = 1, rows cur = cur+1 A(r,c,p) = buf(cur) end do end do end do end #endif void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur) { int r, c, p, i=0; for ( p = 0 ; p < (*plns) ; p++ ){ for ( c = 0 ; c < (*cols) ; c++ ){ for ( r = 0 ; r < (*rows) ; r++ ){ A[ p * (*aldc) * (*aldr) + c * (*aldr) + r ] = buf[i++]; } } } (*cur) = i; return; } ga-5-4/armci/src/common/ds-shared.c0000644000175000017500000011126412662210413015222 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "request.h" #include "message.h" #include "memlock.h" #include "copy.h" #include "gpc.h" #include "iterator.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_PROCESS_H # include #endif #if HAVE_UNISTD_H # include #endif #define DEBUG_ 0 #define DEBUG1 0 #ifndef SERV # define SERV 2 #endif #ifdef SOCKETS # define EQ_TAGS(a_, b_) ((a_) == (b_)) #else # define EQ_TAGS(a_, b_) !memcmp(&(a_), &(b_), sizeof(a_)) #endif int _armci_server_started=0; #if defined(SOCKETS) extern active_socks_t *_armci_active_socks; extern void armci_sock_send(int to, void *data, int len); #endif /**************************** pipelining for medium size msg ***********/ #ifdef PIPE_BUFSIZE static int pack_size(int len) { int oldlen = len; #define PIPE_ROUNDUP 512 #define PIPE_SHORT_ROUNDUP (1024) int n; if(len <4*PIPE_BUFSIZE){ len /=2; n = len%PIPE_SHORT_ROUNDUP; if(n)len += (PIPE_SHORT_ROUNDUP-n); } #if defined(VIA) || defined(VAPI) else if(len <25*PIPE_BUFSIZE){ len /=4; n = len%PIPE_SHORT_ROUNDUP; if(n)len += (PIPE_SHORT_ROUNDUP-n); } else if(len <41*PIPE_BUFSIZE){ len /=8; n = len%PIPE_SHORT_ROUNDUP; if(n)len += (PIPE_SHORT_ROUNDUP-n); } #else else if(len <32*PIPE_BUFSIZE){ len /=8; n = len%PIPE_SHORT_ROUNDUP; if(n)len += (PIPE_SHORT_ROUNDUP-n); } #endif else #if defined(VIA) || defined(VAPI) len = 8*4096; #elif defined(HITACHI) len = 128*1024-128; #else len = 64*1024-128; #endif #ifdef MAX_PIPELINE_CHUNKS if(oldlen/len > MAX_PIPELINE_CHUNKS-1){ len = oldlen/MAX_PIPELINE_CHUNKS; n = len%PIPE_SHORT_ROUNDUP; if(n)len += (PIPE_SHORT_ROUNDUP-n); } #endif return len; } #define PACK_SIZE1(_len) ((_len)datalen); arg.buf_posted = arg.buf = buf; #ifdef HITACHI arg.count = 0; #else arg.count = bufsize; #endif arg.proc = (msginfo->operation==GET)?msginfo->to:msginfo->from; arg.op = msginfo->operation; armci_dispatch_strided(buf, stride_arr, count, strides, -1, -1, packsize, armcill_pipe_post_bufs,&arg); } void armci_pipe_receive_strided(request_header_t* msginfo, void *ptr, int stride_arr[], int count[], int strides) { buf_arg_t arg; int packsize = PACK_SIZE(msginfo->datalen); #if defined(GM) arg.buf_posted = msginfo->tag.data_ptr; #endif #if (defined(VIA) && defined(VIA_USES_RDMA)) || defined(VAPI) arg.buf_posted = msginfo->tag; #endif arg.buf = ptr; arg.count = 0; arg.proc = (msginfo->operation==GET)?msginfo->to:msginfo->from; arg.op = msginfo->operation; armci_dispatch_strided(ptr, stride_arr, count, strides, -1, -1, packsize, armcill_pipe_extract_data, &arg); } void armci_pipe_send_strided(request_header_t *msginfo, void *buf, int buflen, void *ptr, int *stride_arr,int count[],int strides) { buf_arg_t arg; int packsize = PACK_SIZE(msginfo->datalen); #if defined(GM) || defined(HITACHI) arg.buf_posted = msginfo->tag.data_ptr; #endif #if (defined(VIA) && defined(VIA_USES_RDMA)) || defined(VAPI) arg.buf_posted = msginfo->tag; #endif arg.buf = buf; arg.count = 0; arg.proc = (msginfo->operation==GET)?msginfo->from:msginfo->to; arg.op = msginfo->operation; armci_dispatch_strided(ptr, stride_arr, count, strides, -1, -1, packsize, armcill_pipe_send_chunk, &arg); #ifdef GM armci_serv_send_nonblocking_complete(0); #endif } #endif /**************************** end of pipelining for medium size msg ***********/ #if defined(CLIENT_BUF_BYPASS) && !defined(GM) /**************** NOTE: for now this code can only handle contiguous data *****/ void armci_send_strided_data_bypass(int proc, request_header_t *msginfo, void *loc_buf, int msg_buflen, void *loc_ptr, int *loc_stride_arr, void *rem_ptr, int *rem_stride_arr, int *count, int stride_levels) { int armcill_server_wait_ack(int,int); if(DEBUG_){ printf("%d(s): strided(%d) get bypass from %d\n",armci_me,stride_levels, msginfo->from); fflush(stdout); } #ifdef VAPI if(stride_levels==0 && msginfo->pinned){ armci_send_contig_bypass(proc,msginfo,loc_ptr,rem_ptr,count[0]); return; } else { armci_die("***Contact Developers with machine/network info at hpctools@emsl.pnl.gov: bypass path wrongly invoked***",0); } #endif armci_pin_memory(loc_ptr, loc_stride_arr,count, stride_levels); /*wait until client ready*/ if(!armcill_server_wait_ack(msginfo->from,1)){ /*client was not able to pin memory, it will revert to default protocol hence, unpin the memory and leave. */ armci_unpin_memory(loc_ptr, loc_stride_arr,count, stride_levels); return; } armcill_server_put(msginfo->from,loc_ptr,rem_ptr,count[0]); armci_unpin_memory(loc_ptr, loc_stride_arr,count, stride_levels); if(DEBUG_){ printf("%d(s): strided(%d) get bypass done \n",armci_me,stride_levels); fflush(stdout); } } #endif /*\ client initialization \*/ void armci_client_code() { if(DEBUG_){ printf("in client after fork %d(%d)\n",armci_me,getpid()); fflush(stdout); } armci_client_connect_to_servers(); armci_msg_barrier(); if(DEBUG_){ printf("%d client connected to all %d servers\n",armci_me, armci_nclus-1); fflush(stdout); } } /*\ client sends request to server \*/ void armci_send_req(int proc, request_header_t* msginfo, int len) { int hdrlen = sizeof(request_header_t); int bytes; if(msginfo->operation == GET) { if(msginfo->format==VECTOR && msginfo->ehlen > 0) bytes = msginfo->dscrlen + hdrlen + msginfo->datalen; else bytes = msginfo->dscrlen + hdrlen; } else bytes = msginfo->bytes + hdrlen; if(DEBUG_){printf("%d: sending req %d (len=%d dscr=%d data=%d) to %d \n", armci_me, msginfo->operation, bytes,msginfo->dscrlen, msginfo->datalen,proc); fflush(stdout); } if(bytes > len)armci_die2("armci_send_req:buffer overflow",bytes,len); #ifdef PIPE_BUFSIZE if( # ifdef CLIENT_BUF_BYPASS (!msginfo->bypass) && # endif (msginfo->datalen>2*PIPE_MIN_BUFSIZE) && (msginfo->operation == GET) && (msginfo->format == STRIDED)){ char *buf = sizeof(void*) + (char*)(msginfo+1); int *ibuf = (int*)buf; int *strides =ibuf; int *stride_arr= ibuf +1; int *count = stride_arr + *strides; armci_pipe_prep_receive_strided(msginfo, buf, *strides, stride_arr, count, len-2**strides*sizeof(int)-sizeof(void*)); armci_pipe_send_req(proc,msginfo, bytes); }else #endif armci_send_req_msg(proc,msginfo, bytes); } /*\ client sends strided data + request to server \*/ void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { int hdrlen = sizeof(request_header_t); int dscrlen = msginfo->dscrlen; int datalen = msginfo->datalen; int cluster = armci_clus_id(proc); int bytes; bytes = msginfo->bytes + hdrlen; if(DEBUG_){ printf("%d:sending strided %d to(%d,%d,%d) bytes=%d dslen=%d dlen=%d,\n", armci_me, msginfo->operation, msginfo->to, cluster, proc, bytes, dscrlen, datalen); fflush(stdout); } #if defined(SOCKETS) /* zero-copy optimization for large requests */ if(count[0] > TCP_PAYLOAD){ if(armci_send_req_msg_strided(proc, msginfo,ptr,strides, stride_arr, count))armci_die("armci_send_strided_req long: failed",0); return; /************** done **************/ } #elif defined(MPI_SPAWN_ZEROCOPY) /* zero-copy optimization for large requests */ if(msginfo->operation==PUT && msginfo->datalen==0 && count[0]>TCP_PAYLOAD){ if(armci_send_req_msg_strided(proc, msginfo,ptr,strides, stride_arr, count))armci_die("armci_send_strided_req long: failed",0); return; /************** done **************/ } #elif defined(PIPE_BUFSIZE___) #warning Network resource is only locked inside armci_send_req_msg, no common lock if((msginfo->datalen>2*PIPE_MIN_BUFSIZE) && (msginfo->operation == PUT)){ msginfo->bytes =0; /*** this tells server that we use pipelined put ****/ armci_send_req_msg(proc,msginfo, hdrlen+dscrlen); armci_pipe_send_strided(msginfo, bdata, datalen, ptr, stride_arr, count, strides); return; /************** done **************/ } #endif /* copy into a buffer before sending */ # ifdef SERV_BUF_IDX_T msginfo->inbuf = armcill_getbidx((msginfo->datalen+msginfo->dscrlen), proc, &msginfo->tag.ack); msginfo->tag.ack_ptr = &msginfo->tag.ack; # endif armci_write_strided(ptr, strides, stride_arr, count, bdata); if(armci_send_req_msg(proc,msginfo, bytes)) armci_die("armci_send_strided_req: failed",0); } #ifdef SOCKETS /* main handler to process responses from dataserver */ void armci_rcv_hdlr(request_header_t* msginfo) { int not_rcvd, my_id, nready, i, n, rc; msg_tag_t rcvd_id; BUF_INFO_T *info; n = MAX_BUFS + MAX_SMALL_BUFS; my_id = _armci_buf_to_bufinfo(msginfo)->bufid; not_rcvd = 1; while (not_rcvd) { THREAD_LOCK(armci_user_threads.net_lock); if (!_armci_buf_cmpld(my_id)) { /* my buffer has not been completed yet */ nready=armci_WaitSock(_armci_active_socks->socks,n,_armci_active_socks->ready); if (nready) { for (i = 0; i < n && nready; i++) { if (!_armci_active_socks->ready[i]) continue; /* not a ready sock */ nready--; /* receive data from socket _armci_active_socks->ready[i] * Note: socks[i] is the socket with incoming data HOWEVER * i is NOT necessarily the index of the associated buffer. * This is because armci_WaitSock will mark ALL entries for * the same socket as ready */ rc = armci_ReadFromSocket(_armci_active_socks->socks[i], &rcvd_id, sizeof(rcvd_id)); if(rc<0)armci_die("armci_rcv_strided_data: read tag failed",rc); /* receive response and process it */ msginfo = (request_header_t *)_armci_buf_ptr_from_id(rcvd_id); switch (msginfo->operation) { case PUT: case UNLOCK: armci_die("armci_rcv_hdlr: unexpected op",msginfo->operation); break; case GET: info = _armci_id_to_bufinfo(rcvd_id); armci_complete_req_buf(info, msginfo); break; case LOCK: case RMW: case ARMCI_SWAP: case ARMCI_SWAP_LONG: case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: armci_rcv_data(msginfo->to, msginfo); break; case ACK: armci_rcv_data(NODE_SERVER(msginfo->to), msginfo); break; default: armci_die("armci_rcv_hdlr: unrecognized op",msginfo->operation); } /* clear this socket in active sockets */ _armci_active_socks->socks[i] = -1; THREAD_UNLOCK(armci_user_threads.net_lock); /* check if the data we received were sent to us */ if (rcvd_id == my_id) not_rcvd = 0; /* mark received buffer as completed */ _armci_buf_set_cmpld_idx(rcvd_id, 1); } if(nready)armci_die("armci_rcv_hdlr:nready in not consistent",nready); } else { /* timed out in select */ THREAD_UNLOCK(armci_user_threads.net_lock); cpu_yield(); } } else { /* buffer was completed by another thread */ THREAD_UNLOCK(armci_user_threads.net_lock); not_rcvd = 0; } } } #if 0 /* receives plain(contiguous) data from dataserver */ void armci_rcv_data_hdlr(int bufid) { request_header_t* msginfo; int proc, datalen; char *buf; /* obtain buffer and buffer info associated with this receive */ msginfo = (request_header_t *)_armci_buf_ptr_from_id(bufid); proc = msginfo->to; datalen = msginfo->datalen; if(datalen == 0) armci_die("armci_rcv_data_hdlr: no data to receive",datalen); if(datalen > (MSG_BUFLEN-sizeof(request_header_t)-sizeof(long))) armci_die("armci_rcv_data_hdlr: data overflowing rcv buffer",datalen); /* fills msginfo buffer */ buf = armci_ReadFromDirect(proc, msginfo, datalen); if ((char *)(msginfo+1) != buf) armci_die("armci_rcv_data_hdlr: buf != msginfo+1",datalen); } /* received strided data from dataserver */ void armci_rcv_strided_data_hdlr(int bufid) { BUF_INFO_T *info; char *dscr; request_header_t *msginfo; void *ptr; int proc, strides, *stride_arr, *count; char *databuf; /* obtain buffer and buffer info associated with this receive */ info = _armci_id_to_bufinfo(bufid); dscr = info->dscr; msginfo = (request_header_t *)_armci_buf_ptr_from_id(bufid); proc = msginfo->to; /* ptr, strides, stride_arr and count should be extracted from buf_info */ ptr = *(void**)dscr; dscr += sizeof(void*); strides = *(int*)dscr; dscr += sizeof(int); stride_arr = (int*)dscr; dscr += strides*sizeof(int); count = (int*)dscr; /* actual rcv: copied from old armci_rcv_strided_data */ /* zero-copy optimization for large requests */ if(count[0] > TCP_PAYLOAD){ armci_ReadStridedFromDirect(proc,msginfo,ptr,strides,stride_arr, count); return; /*********************** done ************************/ } databuf = armci_ReadFromDirect(proc,msginfo,msginfo->datalen); armci_read_strided(ptr, strides, stride_arr, count, databuf); } /* receives vector data from dataserver */ void armci_rcv_vector_data_hdlr(int bufid) { request_header_t* msginfo; int proc, datalen; char *buf; armci_giov_t *darr; /* obtain buffer and buffer info associated with this receive */ msginfo = (request_header_t *)_armci_buf_ptr_from_id(bufid); proc = msginfo->to; /*datalen = msginfo->datalen;*/ buf = (char *)(msginfo + 1); /* receive vector as cont block, data is in buf */ armci_rcv_data_hdlr(bufid); /* unpack vector */ /* armci_giov_t darr[], int len) */ armci_vector_from_buf(darr, len, buf); } #endif #endif /*\ client receives data from server \*/ char *armci_rcv_data(int proc, request_header_t* msginfo) { int datalen = msginfo->datalen; char *buf; if(DEBUG_) { printf("%d:armci_rcv_data: bytes= %d \n", armci_me, datalen); fflush(stdout); } if(datalen == 0) armci_die("armci_rcv_data: no data to receive",datalen); if(datalen > (((int)MSG_BUFLEN)-((int)sizeof(request_header_t))-((int)sizeof(long)))) armci_die("armci_rcv_data:data overflowing rcv buffer",datalen); buf = armci_ReadFromDirect(proc, msginfo, datalen); if(DEBUG_){ printf("%d:armci_rcv_data: got %d bytes \n",armci_me,datalen); fflush(stdout); } return(buf); } /*\ client receives vector data from server and unpacks to the right loc \*/ void armci_rcv_vector_data(int proc, request_header_t* msginfo, armci_giov_t darr[], int len) { char *buf = armci_rcv_data(proc, msginfo); armci_vector_from_buf(darr, len, buf); } /*\ client receives strided data from server \*/ #if 0 void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]) { extern BUF_INFO_T *_armci_tag_to_bufinfo(msg_tag_t tag); extern BUF_INFO_T *_armci_buf_to_bufinfo(void *buf); int not_received = 1; int sel, idx, rc, n=MAX_BUFS+MAX_SMALL_BUFS; char *databuf; msg_tag_t tag; BUF_INFO_T *info; char *dscr; void *loc_ptr; int stride_levels, *loc_stride_arr; request_header_t* buf; while (not_received) { THREAD_LOCK(armci_user_threads.net_lock); if (!_armci_buf_cmpld(msginfo)) { /* buffer not completed */ #ifdef SOCKETS sel=armci_WaitSock(_armci_active_socks->socks,n,_armci_active_socks->ready); #endif if (sel > 0) { /* pick a socket (should I check if sel > 1?) */ for(idx=0;idxready[idx])break; /* socks[idx] is the socket with incoming data HOWEVER idx is * NOT necessarily the index of the associated buffer. It is * because armci_WaitSock will mark ALL entries for the same * socket as ready */ /* read tag */ #ifdef SOCKETS rc=armci_ReadFromSocket(_armci_active_socks->socks[idx],&tag,sizeof(tag)); if(rc<0)armci_die("armci_rcv_strided_data: read tag failed",rc); #if 0 || defined(DTAG) idx = tag & DTAG; printf("DAG RCV: dtag=%ld,idx=%d,",tag,idx); tag >>= (sizeof(msg_id_t) * 8); printf("tag=%d,",tag); /* find proper buffer idx */ info = _armci_tag_to_bufinfo(tag); printf("idx(tag)=%d\n",info->bufid); fflush(stdout); if(info->bufid!=idx)armci_die("armci_rcv_strided_data: bad tag",tag); #else idx = tag; #endif #endif info = _armci_id_to_bufinfo(idx); dscr = info->dscr; /* network complete -- old armci_rcv_strided_data * ptr, strides, stride_arr and count should be extracted from buf_info */ ptr = *(void**)dscr; dscr += sizeof(void*); strides = *(int*)dscr; dscr += sizeof(int); stride_arr = (int*)dscr; dscr += strides*sizeof(int); count = (int*)dscr; /* find appropriate msginfo for received response */ buf = (request_header_t *)_armci_buf_ptr_from_id(idx); proc = buf->to; #ifdef CLIENT_BUF_BYPASS #error THIS PATH IS NOT UPDATED if(msginfo->bypass){ /* zero-copy protocol: get ACK and then unpin user buffer */ armci_rcv_strided_data_bypass(proc, msginfo, ptr, strides); armci_unpin_memory(ptr, stride_arr, count, strides); return; /* we are done */ } #endif #ifdef SOCKETS /* zero-copy optimization for large requests */ if (count[0] > TCP_PAYLOAD) armci_ReadStridedFromDirect(proc,buf,ptr,strides,stride_arr,count); else #elif defined(PIPE_BUFSIZE) if (buf->datalen > 2*PIPE_MIN_BUFSIZE) armci_pipe_receive_strided(buf, ptr, stride_arr, count, strides); else #endif { databuf = armci_ReadFromDirect(proc,buf,datalen); armci_read_strided(ptr, strides, stride_arr, count, databuf); } /* update active sockets */ _armci_active_socks->socks[idx] = -1; THREAD_UNLOCK(armci_user_threads.net_lock); /* check if the response we received was for our request */ if (EQ_TAGS(tag, _armci_buf_to_bufinfo(msginfo)->tag)) { /* if (tag == _armci_buf_to_bufinfo(buf)->tag) { _armci_buf_release(msginfo); released in armci_rem_strided */ not_received = 0; } else { _armci_buf_set_cmpld_idx(idx, 1); /* completed */ } } else { THREAD_UNLOCK(armci_user_threads.net_lock); #if 0 if(sel)armci_die("armci_rcv_strided_data: error in select",errno); else #endif cpu_yield(); /* timed out in select */ } } else { /* buffer was completed by another thread */ THREAD_UNLOCK(armci_user_threads.net_lock); /* _armci_buf_release(msginfo); released in armci_rem_strided */ not_received = 0; } } } #else void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]) { char *databuf; if(DEBUG_){ printf("%d: armci_rcv_strided_data: expecting datalen %d from %d\n", armci_me, datalen, proc); fflush(stdout); } #ifdef CLIENT_BUF_BYPASS if(msginfo->bypass){ /* zero-copy protocol: get ACK and then unpin user buffer */ armci_rcv_strided_data_bypass(proc, msginfo, ptr, strides); armci_unpin_memory(ptr, stride_arr, count, strides); return; /* we are done */ } #endif #if defined(SOCKETS) || defined(MPI_SPAWN_ZEROCOPY) /* zero-copy optimization for large requests */ if(count[0] > TCP_PAYLOAD){ armci_ReadStridedFromDirect(proc,msginfo,ptr,strides,stride_arr, count); return; /*********************** done ************************/ } #elif defined(PIPE_BUFSIZE) if(msginfo->datalen>2*PIPE_MIN_BUFSIZE){ armci_pipe_receive_strided(msginfo, ptr, stride_arr, count, strides); return; /*********************** done ************************/ } #endif #if !defined(GET_STRIDED_COPY_PIPELINED) databuf = armci_ReadFromDirect(proc,msginfo,datalen); armci_read_strided(ptr, strides, stride_arr, count, databuf); #else { int bytes_buf = 0, bytes_usr = 0, seg_off=0; int ctr=0; stride_info_t sinfo; char *armci_ReadFromDirectSegment(int proc,request_header_t *msginfo, int datalen, int *bytes_buf); armci_stride_info_init(&sinfo,ptr,strides,stride_arr,count); do { databuf = armci_ReadFromDirectSegment(proc,msginfo,datalen,&bytes_buf); bytes_usr += armci_read_strided_inc(&sinfo,&databuf[bytes_usr],bytes_buf-bytes_usr, &seg_off); } while(bytes_bufdscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(clus); msginfo->operation = ACK; msginfo->bytes =0; msginfo->datalen =sizeof(int); #ifdef SOCKETS msginfo->tag = BUF_TO_BUFINFO(msginfo)->bufid; #endif if(DEBUG_){ printf("%d(c):sending ACKreq to %d clus=%d\n",armci_me,msginfo->to,clus); fflush(stdout); } armci_send_req(armci_clus_info[clus].master, msginfo, bufsize); #ifdef SOCKETS armci_rcv_hdlr(msginfo); #else armci_rcv_data(armci_clus_info[clus].master, msginfo); /* receive ACK */ #endif assert(*(int*)(msginfo+1) == ACK); #ifdef VAPI assert(*(((int *)(msginfo+1))+1) == ARMCI_STAMP); #endif FREE_SEND_BUFFER(msginfo); } /***************************** server side *********************************/ static void armci_check_req(request_header_t *msginfo, int buflen) { if((msginfo->to != armci_me && msginfo->to < armci_master) || msginfo->to >= armci_master + armci_clus_info[armci_clus_me].nslave) armci_die("armci_rcv_req: invalid to", msginfo->to); #if 0 /* should be done in recv_req */ if(msginfo->operation != GET && msginfo->bytes > buflen) armci_die2("armci_rcv_req: message overflowing rcv buffer", msginfo->bytes,MSG_BUFLEN); #endif if(msginfo->dscrlen < 0) armci_die("armci_rcv_req: dscrlen < 0", msginfo->dscrlen); if(msginfo->datalen < 0) armci_die("armci_rcv_req: datalen < 0", msginfo->datalen); #ifndef PIPE_BUFSIZE if(msginfo->dscrlen > (int)msginfo->bytes) armci_die2("armci_rcv_req: dsclen > bytes", msginfo->dscrlen, msginfo->bytes); #endif } /*\ server response - send data to client \*/ void armci_send_data(request_header_t* msginfo, void *data) { int to = msginfo->from; #if defined(VIA) || defined(GM) || defined(VAPI) /* if the data is in the pinned buffer: MessageRcvBuffer */ #if defined(PEND_BUFS) extern int armci_data_in_serv_buf(void *); if(armci_data_in_serv_buf(data)) #else if((data > (void *)MessageRcvBuffer) && (data < (void *)(MessageRcvBuffer + MSG_BUFLEN))) #endif /* write the message to the client */ armci_WriteToDirect(to, msginfo, data); else { /* copy the data to the MessageRcvBuffer */ #ifdef GM /* leave space for header ack */ char *buf = MessageRcvBuffer + sizeof(long); #else char *buf = MessageRcvBuffer; # if defined(PEND_BUFS) fprintf(stderr, "%d:: op=%d len=%d ptr=%p working on unpinned memory. aborting!\n", armci_me, msginfo->operation,msginfo->datalen, data); assert(0); buf = NULL; /* extern char *armci_openib_get_msg_rcv_buf(int); */ /* buf = armci_openib_get_msg_rcv_buf(msginfo->from); */ # endif #endif assert(buf != NULL); armci_copy(data, buf, msginfo->datalen); armci_WriteToDirect(to, msginfo, buf); } #else #ifdef DOELAN4 /*this is because WriteToDirect is a no-op in elan4.c so we have * to do a put. This will not cause problems anywhere else in the * code and this part on elan4 will only be invoked in a GPC */ PARMCI_Put(data,msginfo->tag.data_ptr,msginfo->datalen,to); #else armci_WriteToDirect(to, msginfo, data); #endif #endif } /*\ server sends strided data back to client \*/ void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { int to = msginfo->from; if(DEBUG_){ printf("%d(server): sending datalen = %d to %d %p\n", armci_me, msginfo->datalen, to,ptr); fflush(stdout); } #if defined(SOCKETS) || defined(MPI_SPAWN_ZEROCOPY) /* zero-copy optimization for large requests */ if(count[0] > TCP_PAYLOAD){ armci_WriteStridedToDirect(to,msginfo,ptr, strides, stride_arr, count); return; /*********************** done ************************/ } #elif defined(PIPE_BUFSIZE) if(msginfo->datalen>2*PIPE_MIN_BUFSIZE) { armci_pipe_send_strided(msginfo, bdata, msginfo->datalen, ptr, stride_arr, count, strides); return; } #endif #if defined(GET_NO_SRV_COPY) { ARMCI_MEMHDL_T *mhloc=NULL, *mhrem=NULL; int nsegs, i; /* printf("%d(s): TRYING to use rdma contig to strided\n",armci_me); */ /* fflush(stdout); */ nsegs = 1; for(i=0;ioperation==GET && !msginfo->pinned && strides>=0 && get_armci_region_local_hndl(ptr,armci_clus_id(armci_me),&mhloc)) { /* printf("%d(s): using rdma contig to strided\n",armci_me); */ /* fflush(stdout); */ armci_server_rdma_strided_to_contig(ptr, stride_arr, count, strides, msginfo->tag.data_ptr, to, msginfo); return; } else { /* printf("%d(s): not taking rdma to contig path. mhloc=%p mhrem=%p\n",armci_me,mhloc,mhrem); */ } } #endif /* for small contiguous blocks copy into a buffer before sending */ armci_write_strided(ptr, strides, stride_arr, count, bdata); /* write the message to the client */ armci_WriteToDirect(to, msginfo, bdata); if(DEBUG_){ printf("%d(serv):sent len=%d to %d\n",armci_me,msginfo->datalen,to); fflush(stdout); } } /*\ server sends ACK to client \*/ void armci_server_ack(request_header_t* msginfo) { int ack=ACK; if(DEBUG_){ printf("%d server: sending ACK to %d\n",armci_me,msginfo->from); fflush(stdout); } if(msginfo->datalen != sizeof(int)) armci_die("armci_server_ack: bad datalen=",msginfo->datalen); #if defined(PEND_BUFS) { /*Send from server known memory -- avoid extra buffers and copying on server*/ int *ack1 = (int *)(msginfo+1); /*msginfo is in some server buffer. I can overwrite the descriptor*/ *ack1 = ACK; assert(sizeof(request_header_t)+2*sizeof(int)from; if(DEBUG_){ printf("%d(serv):got %d request from %d\n",armci_me,msginfo->operation, from); fflush(stdout); } /*if(msginfo->operation==GET)fprintf(stderr,"GET request received with tag: %d\n",msginfo->tag);*/ switch(msginfo->operation){ case ACK: if(DEBUG_) { fprintf(stdout, "%d(server): got ACK request from %d\n", armci_me, msginfo->from); fflush(stdout); } #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif armci_server_ack(msginfo); break; case ATTACH: if(DEBUG_){ printf("%d(serv):got ATTACH request from%d\n",armci_me, from); fflush(stdout); } armci_server_ipc(msginfo, descr, buffer, buflen); break; #if defined(SOCKETS) || defined(HITACHI) || defined(MPI_SPAWN) || defined(MPI_MT) case QUIT: if(DEBUG_){ printf("%d(serv):got QUIT request from %d\n",armci_me, from); fflush(stdout); } armci_server_goodbye(msginfo); break; #endif case ARMCI_SWAP: case ARMCI_SWAP_LONG: case ARMCI_FETCH_AND_ADD: case ARMCI_FETCH_AND_ADD_LONG: armci_server_rmw(msginfo,descr,buffer); break; case LOCK: armci_server_lock(msginfo); break; case UNLOCK: armci_server_unlock(msginfo, descr); break; default: if(msginfo->format ==VECTOR) armci_server_vector(msginfo, descr, buffer, buflen); else if(msginfo->format ==STRIDED){ #if defined(VAPI) /* buffer bypass protocol */ if(msginfo->pinned == 1){ int armci_post_gather(void *, int *, int *,int, armci_vapi_memhndl_t *,int,int,int,void *); void * src_ptr; int stride_levels; int count[MAX_STRIDE_LEVEL]; int src_stride_arr[MAX_STRIDE_LEVEL]; int found; ARMCI_MEMHDL_T *mhandle; int i,num,id; if(DEBUG1){ printf("%d(s) : unpacking dscr\n",armci_me); fflush(stdout); } src_ptr = *(void**)descr; descr = (char*)descr + sizeof(void*); stride_levels = *(int*)descr; descr = (char*)descr + sizeof(int); for(i =0; ifrom,mytag,SERV,NULL ); mytag = (mytag+1)%MAX_PENDING; if(mytag==0)mytag=1; if(DEBUG1){ printf("%d(s) : finished posting %d gather\n", armci_me,num); fflush(stdout); } } else #endif armci_server(msginfo, descr, buffer, buflen); } else armci_die2("armci_data_serv: unknown format code", msginfo->format, msginfo->from); } } /*\ initialize connection and start server thread/processes \*/ void armci_start_server() { armci_init_connections(); #if defined(MPI_SPAWN) /* For MPI_SPAWN, this should be called by all processes */ armci_create_server_MPIprocess( ); #else if(armci_me == armci_master) { # ifdef SERVER_THREAD armci_create_server_thread( armci_server_code ); # else armci_create_server_process( armci_server_code ); # endif } #endif armci_client_code(); _armci_server_started=1; } void *armci_server_code(void *data) { #ifdef SERVER_THREAD #if (defined(GM) || defined(VAPI) || defined(QUADRICS)) && ARMCI_ENABLE_GPC_CALLS # ifdef PTHREADS extern pthread_t data_server; data_server = pthread_self(); # else armci_die("armci_server_code: threaded data servers not using pthreads not supported by gpc", 0); # endif #endif #endif if(DEBUG_) printf("%d: in server after creating thread.\n",armci_me); /* make initial contact with all the computing process */ armci_server_initial_connection(); if(DEBUG_) { printf("%d(server): connected to all computing processes\n",armci_me); fflush(stdout); } #if ARMCI_ENABLE_GPC_CALLS gpc_init(); #endif armci_call_data_server(); armci_transport_cleanup(); return(NULL); } /*\ request to QUIT sent by client \*/ void armci_serv_quit() { int bufsize = sizeof(request_header_t)+sizeof(int); int destproc; request_header_t *msginfo; destproc = SERVER_NODE(armci_clus_me); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,QUIT,destproc); if(DEBUG_){ printf("%d master: sending quit request to server\n",armci_me); fflush(stdout); } msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->operation = QUIT; if(ACK_QUIT) msginfo->bytes = msginfo->datalen = sizeof(int); /* ACK */ else msginfo->bytes = msginfo->datalen = 0; /* no ACK */ armci_send_req(armci_master, msginfo, bufsize); if(ACK_QUIT){ int stat; stat = *(int*)armci_rcv_data(armci_master,msginfo); /* receive ACK */ if(stat != QUIT) armci_die("armci_serv_quit: wrong response from server", stat); FREE_SEND_BUFFER(msginfo); } } /*\ server action triggered by request to quit \*/ void armci_server_goodbye(request_header_t* msginfo) { int ack=QUIT; if(DEBUG_){ printf("%d server: terminating request by %d\n",armci_me,msginfo->from); fflush(stdout); } if(msginfo->datalen){ msginfo->datalen = -msginfo->datalen; if(msginfo->datalen != sizeof(int)) armci_die("armci_server_goodbye: bad datalen=",msginfo->datalen); armci_send_data(msginfo, &ack); } armci_transport_cleanup(); /* Finalizing data server process w.r.t. MPI is not portable */ _exit(0); } ga-5-4/armci/src/common/groups.c0000644000175000017500000004152212662210413014666 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: groups.c,v 1.4.6.2 2007-08-15 08:37:16 manoj Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ASSERT_H # include #endif #ifndef MSG_COMMS_MPI # define MSG_COMMS_MPI #endif #include "armcip.h" #include "message.h" #define DEBUG_ 0 MPI_Comm ARMCI_COMM_WORLD; /*dup of MPI_COMM_WORLD. Initialized first thing in ARMCI_Init*/ ARMCI_Group ARMCI_Default_Proc_Group = 0; ARMCI_Group ARMCI_World_Proc_Group = 0; typedef struct group_list_struct { ARMCI_Group group; ARMCI_iGroup igroup; struct group_list_struct *next; } group_list_t; group_list_t *group_list = NULL; ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; assert(group_list != NULL); while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { return ¤t_group_list_item->igroup; } current_group_list_item = current_group_list_item->next; } armci_die("ARMCI_Group lookup failed", -1); return NULL; } static void armci_create_group_and_igroup(ARMCI_Group *group, ARMCI_iGroup **igroup) { group_list_t *new_group_list_item = NULL; group_list_t *last_group_list_item = NULL; /* create the new group in the linked list */ last_group_list_item = group_list; while (last_group_list_item->next != NULL) { last_group_list_item = last_group_list_item->next; } new_group_list_item = malloc(sizeof(group_list_t)); new_group_list_item->group = last_group_list_item->group + 1; new_group_list_item->next = NULL; *igroup = &new_group_list_item->igroup; *group = new_group_list_item->group; last_group_list_item->next = new_group_list_item; } #ifdef ARMCI_GROUP void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Group *group) { armci_msg_group_bcast_scope(SCOPE_ALL, buffer, len, ARMCI_Absolute_id(group, root), group); } #else void ARMCI_Bcast_(void *buffer, int len, int root, ARMCI_Comm comm) { int result; MPI_Comm_compare(comm, ARMCI_COMM_WORLD, &result); if(result == MPI_IDENT) armci_msg_brdcst(buffer, len, root); else MPI_Bcast(buffer, len, MPI_BYTE, root, (MPI_Comm)comm); } #endif int ARMCI_Group_rank(ARMCI_Group *group, int *rank) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP if(!igroup) return MPI_ERR_GROUP; *rank = igroup->grp_attr.grp_me; return MPI_SUCCESS; #else return MPI_Group_rank((MPI_Group)(igroup->igroup), rank); #endif } void ARMCI_Group_size(ARMCI_Group *group, int *size) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP *size = igroup->grp_attr.nproc; #else MPI_Group_size((MPI_Group)(igroup->igroup), size); #endif } int ARMCI_Absolute_id(ARMCI_Group *group,int group_rank) { int abs_rank,status; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); #ifdef ARMCI_GROUP assert(group_rank < igroup->grp_attr.nproc); return igroup->grp_attr.proc_list[group_rank]; #else MPI_Group grp; status = MPI_Comm_group(ARMCI_COMM_WORLD,&grp); MPI_Group_translate_ranks(igroup->igroup,1,&group_rank,grp,&abs_rank); return(abs_rank); #endif } void ARMCI_Group_set_default(ARMCI_Group *group) { ARMCI_Default_Proc_Group = *group; } void ARMCI_Group_get_default(ARMCI_Group *group_out) { *group_out = ARMCI_Default_Proc_Group; } void ARMCI_Group_get_world(ARMCI_Group *group_out) { *group_out = ARMCI_World_Proc_Group; } static void get_group_clus_id(ARMCI_iGroup *igroup, int grp_nproc, int *grp_clus_id) { #ifdef ARMCI_GROUP int i; assert(grp_nproc<=igroup->grp_attr.nproc); for(i=0; igrp_attr.proc_list[i]); } #else int i, *ranks1, *ranks2; MPI_Group group2; /* Takes the list of processes from one group and attempts to determine * the corresponding ranks in a second group (here, ARMCI_COMM_WORLD) */ ranks1 = (int *)malloc(2*grp_nproc*sizeof(int)); ranks2 = ranks1 + grp_nproc; for(i=0; iigroup, grp_nproc, ranks1, group2, ranks2); /* get the clus_id of processes */ for(i=0; iicomm; #endif int grp_me, grp_nproc, grp_nclus, grp_clus_me; armci_clus_t *grp_clus_info=NULL; #ifdef CLUSTER int i, len, root=0; #endif #ifndef ARMCI_GROUP if(comm==MPI_COMM_NULL || igroup->igroup==MPI_GROUP_NULL) armci_die("group_process_list: NULL COMMUNICATOR",0); #endif ARMCI_Group_rank(group, &grp_me); ARMCI_Group_size(group, &grp_nproc); #ifdef CLUSTER # ifdef ARMCI_GROUP /*all processes construct the clus_info structure in parallel*/ grp_clus_info = group_construct_clusinfo(&grp_nclus, group); # else /* process 0 gets group cluster information: grp_nclus, grp_clus_info */ if(grp_me == 0) { grp_clus_info = group_construct_clusinfo(&grp_nclus, group); } /* process 0 broadcasts group cluster information */ len = sizeof(int); ARMCI_Bcast_(&grp_nclus, len, root, comm); if(grp_me){ /* allocate memory */ grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!armci_clus_info)armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*grp_nclus; ARMCI_Bcast_(grp_clus_info, len, root, comm); # endif /* determine current group cluster node id by comparing me to master */ grp_clus_me = grp_nclus-1; for(i =0; i< grp_nclus-1; i++) { if(grp_me < grp_clus_info[i+1].master){ grp_clus_me=i; break; } } #else /* !CLUSTER */ grp_clus_me = 0; grp_nclus = 1; grp_clus_info = (armci_clus_t*)malloc(grp_nclus*sizeof(armci_clus_t)); if(!grp_clus_info)armci_die("malloc failed for clusinfo",grp_nclus); strcpy(grp_clus_info[0].hostname, armci_clus_info[0].hostname); grp_clus_info[0].master=0; grp_clus_info[0].nslave=grp_nproc; #endif /* CLUSTER */ #ifdef ARMCI_GROUP /*Set in ARMCI_Group_create. ARMCI_Group_rank is used before setting this field. So moving it there in the generic implementation.*/ #else grp_attr->grp_me = grp_me; #endif grp_attr->grp_clus_info = grp_clus_info; grp_attr->grp_nclus = grp_nclus; grp_attr->grp_clus_me = grp_clus_me; } /* attribute caching: group_cluster_information and memory_offset should be cached in group data structure */ static void armci_cache_attr(ARMCI_Group *group) { armci_grp_attr_t *grp_attr; ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); /* allocate storage for the attribute content. Note: Attribute contents should be stored in persistent memory */ grp_attr = &(igroup->grp_attr); /* get group cluster information and grp_attr */ group_process_list(group, grp_attr); } armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *group) { ARMCI_iGroup *igroup = armci_get_igroup_from_group(group); return(&(igroup->grp_attr)); } static void armci_igroup_finalize(ARMCI_iGroup *igroup) { #ifdef ARMCI_GROUP int world_me, i; world_me = armci_msg_me(); for(i=0; igrp_attr.nproc; i++) { if(igroup->grp_attr.proc_list[i] == world_me) { break; } } if(i==igroup->grp_attr.nproc) { return; /*not in group to be freed*/ } assert(igroup); free(igroup->grp_attr.grp_clus_info); free(igroup->grp_attr.proc_list); igroup->grp_attr.nproc = 0; #else int rv; assert(igroup); /*the following was causing seg fault*/ /*free(igroup->grp_attr.grp_clus_info);*/ rv=MPI_Group_free(&(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_free: Failed ",armci_me); if(igroup->icomm != MPI_COMM_NULL) { rv = MPI_Comm_free( (MPI_Comm*)&(igroup->icomm) ); if(rv != MPI_SUCCESS) armci_die("MPI_Comm_free: Failed ",armci_me); } #endif } void ARMCI_Group_free(ARMCI_Group *group) { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* find the group to free */ while (current_group_list_item != NULL) { if (current_group_list_item->group == *group) { break; } previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; } /* make sure we found a group */ assert(current_group_list_item != NULL); /* remove the group from the linked list */ if (previous_group_list_item != NULL) { previous_group_list_item->next = current_group_list_item->next; } /* free the group */ armci_igroup_finalize(¤t_group_list_item->igroup); free(current_group_list_item); } /* Create a child group for to the given group. @param n IN #procs in this group (<= that in group_parent) @param pid_list IN The list of proc ids (w.r.t. group_parent) @param group_out OUT Handle to store the created group @param group_parent IN Parent group */ void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *grp_parent) { int grp_me; ARMCI_iGroup *igroup = NULL; #ifdef ARMCI_GROUP int i, world_me, parent_grp_me; armci_grp_attr_t *grp_attr = NULL; #else int rv; ARMCI_iGroup *igroup_parent = NULL; MPI_Group *group_parent = NULL; MPI_Comm *comm_parent = NULL; #endif armci_create_group_and_igroup(group_out, &igroup); #ifdef ARMCI_GROUP grp_attr = &igroup->grp_attr; ARMCI_Group_rank(grp_parent, &parent_grp_me); for(i=0; inproc=0; grp_attr->proc_list = NULL; return; /*not in group to be created*/ } for(i=0; i pid_list[i+1]){ armci_die("ARMCI_Group_create: Process ids are not sorted ",armci_me); break; } } grp_attr->grp_clus_info = NULL; grp_attr->nproc = n; grp_attr->proc_list = (int *)malloc(n*sizeof(int)); assert(grp_attr->proc_list!=NULL); for(i=0; iproc_list[i] = ARMCI_Absolute_id(grp_parent,pid_list[i]); } world_me = armci_msg_me(); grp_attr->grp_me = grp_me = MPI_UNDEFINED; for(i=0; igrp_attr.proc_list[i] == world_me) { grp_attr->grp_me = grp_me = i; break; } } if(grp_me != MPI_UNDEFINED) armci_cache_attr(group_out); armci_msg_group_barrier(group_out); #else igroup_parent = armci_get_igroup_from_group(grp_parent); /* NOTE: default group is the parent group */ group_parent = &(igroup_parent->igroup); comm_parent = &(igroup_parent->icomm); rv=MPI_Group_incl(*group_parent, n, pid_list, &(igroup->igroup)); if(rv != MPI_SUCCESS) armci_die("MPI_Group_incl: Failed ",armci_me); { MPI_Comm comm, comm1, comm2; int lvl=1, local_ldr_pos; MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me == MPI_UNDEFINED) { igroup->icomm = MPI_COMM_NULL; /*FIXME: keeping the group around for now*/ return; } assert(grp_me>=0); /*SK: sanity check for the following bitwise operations*/ MPI_Comm_dup(MPI_COMM_SELF, &comm); /*FIXME: can be optimized away*/ local_ldr_pos = grp_me; while(n> lvl) { int tag=0; int remote_ldr_pos = local_ldr_pos^lvl; if(remote_ldr_pos < n) { int remote_leader = pid_list[remote_ldr_pos]; MPI_Comm peer_comm = *comm_parent; int high = (local_ldr_posicomm = comm; MPI_Group_free(&igroup->igroup); /*cleanup temporary group*/ MPI_Comm_group(igroup->icomm, &igroup->igroup); /*the group associated with comm*/ igroup->grp_attr.grp_clus_info=NULL; /* processes belong to this group should cache attributes */ armci_cache_attr(group_out); } #endif } void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out) { ARMCI_Group_create_child(n, pid_list, group_out, (ARMCI_Group *)&ARMCI_Default_Proc_Group); } void armci_group_init() { #ifdef ARMCI_GROUP int i; #else int grp_me; #endif ARMCI_iGroup *igroup; /* Initially, World group is the default group */ ARMCI_World_Proc_Group = 0; ARMCI_Default_Proc_Group = 0; /* create the head of the group linked list */ assert(group_list == NULL); group_list = malloc(sizeof(group_list_t)); group_list->group = ARMCI_World_Proc_Group; group_list->next = NULL; igroup = &group_list->igroup; #ifdef ARMCI_GROUP /*setup the world proc group*/ igroup->grp_attr.nproc = armci_msg_nproc(); igroup->grp_attr.grp_me = armci_msg_me(); igroup->grp_attr.proc_list = (int *)malloc(igroup->grp_attr.nproc*sizeof(int)); assert(igroup->grp_attr.proc_list != NULL); for(i=0; igrp_attr.nproc; i++) { igroup->grp_attr.proc_list[i] = i; } igroup->grp_attr.grp_clus_info = NULL; armci_cache_attr(&ARMCI_World_Proc_Group); #else /* save MPI world group and communicatior in ARMCI_World_Proc_Group */ igroup->icomm = ARMCI_COMM_WORLD; MPI_Comm_group(ARMCI_COMM_WORLD, &(igroup->igroup)); /* processes belong to this group should cache attributes */ MPI_Group_rank((MPI_Group)(igroup->igroup), &grp_me); if(grp_me != MPI_UNDEFINED) { armci_cache_attr(&ARMCI_World_Proc_Group); } #endif } void armci_group_finalize() { group_list_t *current_group_list_item = group_list; group_list_t *previous_group_list_item = NULL; /* don't free the world group (the list head) */ current_group_list_item = current_group_list_item->next; while (current_group_list_item != NULL) { previous_group_list_item = current_group_list_item; current_group_list_item = current_group_list_item->next; armci_igroup_finalize(&previous_group_list_item->igroup); free(previous_group_list_item); } } /* ISSUES: 1. Make sure ARMCI_Group_free frees the attribute data structures 2. replace malloc with, kr_malloc using local_context. */ ga-5-4/armci/src/common/aggregate.c0000644000175000017500000003022212662210413015270 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** $Id: aggregate.c,v 1.6 2003-10-22 22:12:14 d3h325 Exp $ * Aggregate Put/Get requests */ #include "armcip.h" #if HAVE_STRING_H # include /* memcpy */ #endif #if HAVE_STDIO_H # include #endif #define _MAX_AGG_BUFFERS 32 /* Maximum # of aggregation buffers available*/ #define _MAX_AGG_BUFSIZE 2048 /* size of each buffer. should be < 2^15 */ #define _MAX_PTRS 256 /* < 2^15, as it is "short int" in agg_req_t */ #define _MAX_AGG_HANDLE _MAX_AGG_BUFFERS /* Max # of aggregation handles */ /* aggregate request handle */ typedef struct { unsigned int tag; /* non-blocking request tag */ short int proc; /* remote process id */ short int request_len ; /* number of requests */ short int ptr_array_len; /* pointer length for this request */ short int buf_pos_end; /* position of buffer (from right end) */ armci_giov_t *darr; /* giov vectors */ }agg_req_t; static agg_req_t *aggr[_MAX_AGG_HANDLE]; /* aggregate request handle */ /* data structure for dynamic buffer management */ typedef struct { int size; /* represents the size of the list (not linked list) */ int index[_MAX_AGG_HANDLE]; } agg_list_t; static agg_list_t ulist, alist;/*in-use & available aggr buffer index list*/ /* aggregation buffer */ static char agg_buf[_MAX_AGG_BUFFERS][_MAX_AGG_BUFSIZE]; /* aggregation buffer to store the pointers */ static void* agg_src_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; static void* agg_dst_ptr[_MAX_AGG_BUFFERS][_MAX_PTRS]; /** * --------------------------------------------------------------------- * fill descriptor from this side (left to right) * ---> * _______________________________________________ * | | | |. . . . . . . . . . | | | | * |__|__|__|_____________________________|__|__|__| * * <--- * fill src and dst pointer (arrays) in this direction * (right to left) * * Once they are about to cross each other (implies buffer is full), * complete the data transfer. * --------------------------------------------------------------------- */ #define AGG_INIT_NB_HANDLE(op_type, p, nb_handle) \ if(nb_handle->proc < 0) { \ nb_handle->tag = GET_NEXT_NBTAG(); \ nb_handle->op = op_type; \ nb_handle->proc = p; \ nb_handle->bufid= NB_NONE; \ } \ else if(nb_handle->op != op_type) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", nb_handle->op); \ else if(nb_handle->proc != p) \ armci_die("ARMCI_NbXXX: AGG_INIT_NB_HANDLE(): Aggregate Failed, Invalid non-blocking handle", p) /* initialize/set the fields in the buffer*/ #define _armci_agg_set_buffer(index, tag, proc, len) { \ aggr[(index)]->tag = (tag); \ aggr[(index)]->proc = (proc); \ aggr[(index)]->request_len = (len); \ ulist.index[ulist.size++] = (index);/* add the new index to the in-use list and increment it's size*/ \ } /* get the index of the aggregation buffer to be used */ static int _armci_agg_get_bufferid(armci_ihdl_t nb_handle) { int i, index, proc = nb_handle->proc; unsigned int tag = nb_handle->tag; /* check if there is an entry for this handle in the existing list*/ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == tag && aggr[index]->proc == proc) return index; } /* else it is a new handle, so get a aggr buffer from either of the lists. ???? don't throw exception here */ if(ulist.size >= _MAX_AGG_BUFFERS && alist.size == 0) armci_die("_armci_agg_get_index: Too many outstanding aggregation requests\n", ulist.size); /*If there is a buffer in readily available list,use it*/ if(alist.size > 0) index = alist.index[--alist.size]; else { /* else use/get a buffer from the main list */ index = ulist.size; /* allocate memory for aggregate request handle */ aggr[index] = (agg_req_t *)agg_buf[index]; aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* allocate memory for giov vector field in aggregate request handler */ aggr[index]->darr = (armci_giov_t *)(agg_buf[index]+sizeof(agg_req_t)); } _armci_agg_set_buffer(index, tag, proc, 0); return index; } static void _armci_agg_update_lists(int index) { int i; /* remove that index from the in-use list and bring the last element in the in-use list to the position of the removed one. */ for(i=0; irequest_len; /* index of giov descriptor */ bytes_remaining = aggr[index]->buf_pos_end - (sizeof(agg_req_t) + aggr[index]->request_len*sizeof(armci_giov_t)); /* extra bytes required to store registered put data */ if(is_registered_put) bytes_needed = bytes; /* if (byte-)sizes are equal, use previously created descriptor else get a new descriptor */ if( rid && bytes==aggr[index]->darr[rid-1].bytes) --rid; else { get_new_descr=1; bytes_needed += sizeof(armci_giov_t); } /* If buffer is full, then complete data transfer. After completion, if still ptr array_len is greater than maximum limit(_MAX_PTRS), then do it by parts. Determine new ptr_array_len that fits buffer */ if( (bytes_needed > bytes_remaining) || (_MAX_PTRS - aggr[index]->ptr_array_len < *ptr_array_len)) { armci_agg_complete(nb_handle, SET); rid = 0; get_new_descr=1; if(*ptr_array_len > _MAX_PTRS) *ptr_array_len = _MAX_PTRS; } /* if new descriptor, allocate memory for src_ptr & dst_ptr arrays */ if(get_new_descr) { int i = aggr[index]->ptr_array_len; aggr[index]->darr[rid].src_ptr_array = (void **)&agg_src_ptr[index][i]; aggr[index]->darr[rid].dst_ptr_array = (void **)&agg_dst_ptr[index][i]; aggr[index]->darr[rid].ptr_array_len = 0; aggr[index]->request_len++; } /* store registered put data */ if(is_registered_put) { aggr[index]->buf_pos_end -= bytes; memcpy(&((char *)aggr[index])[aggr[index]->buf_pos_end], *((char **)registered_put_data), bytes); *(char **)registered_put_data = (char *)&((char *)aggr[index])[aggr[index]->buf_pos_end]; } aggr[index]->ptr_array_len += *ptr_array_len; return (&aggr[index]->darr[rid]); } int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle) { int one=1, idx; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); darr = _armci_agg_get_descriptor(&one, bytes, nb_handle, is_registered_put, &src); idx = darr->ptr_array_len; darr->src_ptr_array[idx] = src; darr->dst_ptr_array[idx] = dst; darr->bytes = bytes; darr->ptr_array_len += 1; fflush(stdout); return 0; } int armci_agg_save_giov_descriptor(armci_giov_t dscr[], int len, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, bytes, ptr_array_len; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=0; iptr_array_len; for(j=idx; jsrc_ptr_array[j] = dscr[i].src_ptr_array[k]; darr->dst_ptr_array[j] = dscr[i].dst_ptr_array[k]; } darr->bytes = dscr[i].bytes; darr->ptr_array_len += ptr_array_len; ptr_array_len = dscr[i].ptr_array_len - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_giov_descr failed", 0L); } while(k < darr[i].ptr_array_len); } return 0; } int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle) { int i, j, k, idx, ptr_array_len=1, total1D=1, num1D=0; int offset1, offset2, factor[MAX_STRIDE_LEVEL]; armci_giov_t * darr; /* set up the handle if it is a new aggregation request */ AGG_INIT_NB_HANDLE(op, proc, nb_handle); for(i=1; i<=stride_levels; i++) { total1D *= count[i]; factor[i-1]=0; } ptr_array_len = total1D; do { darr=_armci_agg_get_descriptor(&ptr_array_len,count[0],nb_handle,0,0); idx = darr->ptr_array_len; /* converting stride into giov vector */ for(i=idx; isrc_ptr_array[i] = (char *)src_ptr + offset1; darr->dst_ptr_array[i] = (char *)dst_ptr + offset2; ++factor[0]; ++num1D; for(j=1; jbytes = count[0]; darr->ptr_array_len += ptr_array_len; ptr_array_len = total1D - ptr_array_len; if(ptr_array_len <0) armci_die("agg_save_strided_descr failed", 0L); } while(num1D < total1D); return 0; } void armci_agg_complete(armci_ihdl_t nb_handle, int condition) { int i, index=0, rc; /* get the buffer index for this handle */ for(i=ulist.size-1; i>=0; i--) { index = ulist.index[i]; if(aggr[index]->tag == nb_handle->tag && aggr[index]->proc == nb_handle->proc) break; } if(i<0) return; /* implies this handle has no requests at all */ #if 0 printf("%d: Aggregation Complete to remote process %d (%d:%d requests)\n", armci_me, nb_handle->proc, index, aggr[index]->request_len); #endif /* complete the data transfer. NOTE: in LAPI, Non-blocking calls (followed by wait) performs better than blocking put/get */ if(aggr[index]->request_len) { switch(nb_handle->op) { #ifdef LAPI armci_hdl_t usr_hdl; case PUT: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbPutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbputv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; case GET: ARMCI_INIT_HANDLE(&usr_hdl); if((rc=PARMCI_NbGetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc, (armci_hdl_t*)&usr_hdl))) ARMCI_Error("armci_agg_complete: nbgetv failed",rc); PARMCI_Wait((armci_hdl_t*)&usr_hdl); break; #else case PUT: if((rc=PARMCI_PutV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: putv failed",rc); break; case GET: if((rc=PARMCI_GetV(aggr[index]->darr, aggr[index]->request_len, nb_handle->proc))) ARMCI_Error("armci_agg_complete: getv failed",rc); break; #endif } } /* setting request length to zero, as the requests are completed */ aggr[index]->request_len = 0; aggr[index]->ptr_array_len = 0; aggr[index]->buf_pos_end = _MAX_AGG_BUFSIZE; /* If armci_agg_complete() is called PARMCI_Wait(), then unset nb_handle*/ if(condition==UNSET) { nb_handle->proc = -1; _armci_agg_update_lists(index); } } ga-5-4/armci/src/common/signaltrap.c0000644000175000017500000003234712662210413015520 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: signaltrap.c,v 1.28 2005-05-13 19:06:40 vinod Exp $ */ /******************************************************\ * Signal handler functions for the following signals: * * SIGINT, SIGCHLD, SIGBUS, SIGFPE, SIGILL, * * SIGSEGV, SIGSYS, SIGTRAP, SIGHUP, SIGTERM * * Used to call armci_error that frees up IPC resources * \******************************************************/ #if HAVE_SIGNAL_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #include "armci.h" #include "armcip.h" #define PAUSE_ON_ERROR__ #define Error armci_die #if !defined(armci_die) extern void Error(); #endif #if (defined(ENCORE) || defined(SEQUENT) || defined(ARDENT)) # define SigType int #else # define SigType void #endif #ifndef SIG_ERR # define SIG_ERR (SigType (*)())-1 #endif extern int armci_me; int AR_caught_sigint=0; int AR_caught_sigterm=0; int AR_caught_sigchld=0; int AR_caught_sigsegv=0; int AR_caught_sig=0; SigType (*SigChldOrig)(), (*SigIntOrig)(), (*SigHupOrig)(), (*SigTermOrig)(); SigType (*SigSegvOrig)(); /*********************** SIGINT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIntHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIntHandler(sig) #endif int sig; { AR_caught_sigint = 1; AR_caught_sig= sig; Error("SigIntHandler: interrupt signal was caught",(int) sig); } void TrapSigInt() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( (SigIntOrig = signal(SIGINT, SigIntHandler)) == SIG_ERR) Error("TrapSigInt: error from signal setting SIGINT",0); } void RestoreSigInt() /* Restore the original signal handler */ { if(AR_caught_sigint) SigIntOrig(SIGINT); if ( signal(SIGINT, SigIntOrig) == SIG_ERR) Error("RestoreSigInt: error from restoring signal SIGINT",0); } /*********************** SIGABORT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigAbortHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigAbortHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("SigIntHandler: abort signal was caught: cleaning up",(int) sig); } void TrapSigAbort() /* Trap the signal SIGINT so that we can propagate error conditions and also tidy up shared system resources in a manner not possible just by killing everyone */ { if ( signal(SIGINT, SigAbortHandler) == SIG_ERR) Error("TrapSigAbort: error from signal setting SIGABORT",0); } /*********************** SIGCHLD *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigChldHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigChldHandler(sig) #endif int sig; { int status; #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) union wait ustatus; #endif #if defined(LINUX) pid_t ret; /* Trap signal as soon as possible to avoid race */ if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("SigChldHandler: error from signal setting SIGCHLD",0); #endif #if defined(ALLIANT) || defined(ENCORE) || defined(SEQUENT) || defined(NEXT) # if defined(LINUX) ret = wait(&ustatus); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void) wait(&ustatus); # endif status = ustatus.w_status; #else # if defined(LINUX) ret = waitpid(0, &status, WNOHANG); if((ret == 0) || ((ret == -1) && (errno == ECHILD))) { return; } # else (void)wait(&status); # endif #endif AR_caught_sigchld=1; AR_caught_sig= sig; Error("Child process terminated prematurely, status=",(int) status); } void TrapSigChld() /* Trap SIGCHLD so that can tell if children die unexpectedly. */ { if ( (SigChldOrig = signal(SIGCHLD, SigChldHandler)) == SIG_ERR) Error("TrapSigChld: error from signal setting SIGCHLD",0); } void RestoreSigChld() { if(AR_caught_sigchld) SigChldOrig(SIGCHLD); if (signal(SIGCHLD, SigChldOrig) == SIG_ERR) Error("RestoreSigChld: error from restoring signal SIGChld",0); } void RestoreSigChldDfl() { (void) signal(SIGCHLD, SIG_DFL); } /*********************** SIGBUS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigBusHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigBusHandler(sig) #endif int sig; { AR_caught_sig= sig; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%d): Bus Error ... pausing\n", armci_me, getpid() );pause(); #endif Error("Bus error, status=",(int) sig); } void TrapSigBus() /* Trap SIGBUS */ { if ( signal(SIGBUS, SigBusHandler) == SIG_ERR) Error("TrapSigBus: error from signal setting SIGBUS", 0); } /*********************** SIGFPE *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigFpeHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigFpeHandler(sig) #endif int sig; { AR_caught_sig= sig; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%s:%d): Sig FPE ... pausing\n", armci_me, armci_clus_info[armci_clus_me].hostname, getpid() );pause(); #endif Error("Floating Point Exception error, status=",(int) sig); } void TrapSigFpe() /* Trap SIGFPE */ { if ( signal(SIGFPE, SigFpeHandler) == SIG_ERR) Error("TrapSigFpe: error from signal setting SIGFPE", 0); } /*********************** SIGILL *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigIllHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIllHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Illegal Instruction error, status=",(int) sig); } void TrapSigIll() /* Trap SIGILL */ { if ( signal(SIGILL, SigIllHandler) == SIG_ERR) Error("TrapSigIll: error from signal setting SIGILL", 0); } /*********************** SIGSEGV *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSegvHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSegvHandler(sig) #endif int sig; { AR_caught_sig= sig; AR_caught_sigsegv=1; #ifdef PAUSE_ON_ERROR fprintf(stderr,"%d(%s:%d): Segmentation Violation ... pausing\n", armci_me, armci_clus_info[armci_clus_me].hostname, getpid() );pause(); #endif Error("Segmentation Violation error, status=",(int) sig); } #ifdef ENABLE_CHECKPOINT static void * signal_arr[100]; SigType SigSegvActionSa(int sig,siginfo_t *sinfo, void *ptr) { int (*func)(); AR_caught_sig= sig; AR_caught_sigsegv=1; func = signal_arr[sig]; /*printf("\n%d:in sigaction %p, %d\n",armci_me,sinfo->si_addr,sinfo->si_errno);fflush(stdout);*/ if(func(sinfo->si_addr,sinfo->si_errno,sinfo->si_fd)) Error("Segmentation Violation error, status=",(int) SIGSEGV); } void TrapSigSegvSigaction() { struct sigaction sa; sa.sa_sigaction = (void *)SigSegvActionSa; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); } #endif void TrapSigSegv() /* Trap SIGSEGV */ { if ( (SigSegvOrig=signal(SIGSEGV, SigSegvHandler)) == SIG_ERR) Error("TrapSigSegv: error from signal setting SIGSEGV", 0); } void RestoreSigSegv() /* Restore the original signal handler */ { /* if(AR_caught_sigsegv) SigSegvOrig(SIGSEGV); */ #ifdef ENABLE_CHECKPOINT__ struct sigaction sa; sa.sa_handler = (void *)SigSegvOrig; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGSEGV,&sa,NULL); #else if ( signal(SIGSEGV,SigSegvOrig) == SIG_ERR) Error("RestoreSigSegv: error from restoring signal SIGSEGV",0); #endif } /*********************** SIGSYS *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigSysHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigSysHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Bad Argument To System Call error, status=",(int) sig); } void TrapSigSys() /* Trap SIGSYS */ { #ifndef LINUX if ( signal(SIGSYS, SigSysHandler) == SIG_ERR) Error("TrapSigSys: error from signal setting SIGSYS", 0); #endif } /*********************** SIGTRAP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTrapHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTrapHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Trace Trap error, status=",(int) sig); } void TrapSigTrap() /* Trap SIGTRAP */ { if ( signal(SIGTRAP, SigTrapHandler) == SIG_ERR) Error("TrapSigTrap: error from signal setting SIGTRAP", 0); } /*********************** SIGHUP *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigHupHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigHupHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Hangup error, status=",(int) sig); } void TrapSigHup() /* Trap SIGHUP */ { if ( (SigHupOrig = signal(SIGHUP, SigHupHandler)) == SIG_ERR) Error("TrapSigHup: error from signal setting SIGHUP", 0); } void RestoreSigHup() /* Restore the original signal handler */ { if(AR_caught_sig== SIGHUP) SigHupOrig(SIGHUP); if ( signal(SIGHUP, SigHupOrig) == SIG_ERR) Error("RestoreSigHUP: error from restoring signal SIGHUP",0); } /*********************** SIGTERM *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigTermHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigTermHandler(sig) #endif int sig; { AR_caught_sigterm = 1; AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigTerm() /* Trap SIGTERM */ { if ( (SigTermOrig = signal(SIGTERM, SigTermHandler)) == SIG_ERR) Error("TrapSigTerm: error from signal setting SIGTERM", 0); } void RestoreSigTerm() /* Restore the original signal handler */ { if(AR_caught_sigterm && (SigTermOrig != SIG_DFL) ) SigTermOrig(SIGTERM); if ( signal(SIGTERM, SigTermOrig) == SIG_ERR) Error("RestoreSigTerm: error from restoring signal SIGTerm",0); } /*********************** SIGIOT *************************************/ #ifdef SIGIOT #if defined(SUN) && !defined(SOLARIS) SigType SigIotHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigIotHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("IOT signal was sent, status=",(int) sig); } void TrapSigIot() /* Trap SIGIOT */ { if ( signal(SIGIOT, SigIotHandler) == SIG_ERR) Error("TrapSigIot: error from signal setting SIGIOT", 0); } #endif /*********************** SIGCONT *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigContHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigContHandler(sig) #endif int sig; { /* Error("Trace Cont error, status=",(int) sig);*/ AR_caught_sig= sig; } void TrapSigCont() /* Trap SIGCONT */ { if ( signal(SIGCONT, SigContHandler) == SIG_ERR) Error("TrapSigCont: error from signal setting SIGCONT", 0); } /*********************** SIGXCPU *************************************/ #if defined(SUN) && !defined(SOLARIS) SigType SigXcpuHandler(sig, code, scp, addr) int code; struct sigcontext *scp; char *addr; #else SigType SigXcpuHandler(sig) #endif int sig; { AR_caught_sig= sig; Error("Terminate signal was sent, status=",(int) sig); } void TrapSigXcpu() /* Trap SIGXCPU */ { if ( signal(SIGXCPU, SigXcpuHandler) == SIG_ERR) Error("TrapSigXcpu: error from signal setting SIGXCPU", 0); } /******************* external API *********************************/ void ARMCI_ChildrenTrapSignals() { #ifndef LAPI TrapSigBus(); #endif TrapSigFpe(); TrapSigIll(); #ifdef ENABLE_CHECKPOINT TrapSigSegvSigaction(); #else TrapSigSegv(); #endif TrapSigSys(); TrapSigTrap(); TrapSigAbort(); TrapSigTerm(); TrapSigInt(); #if defined(LAPI) || defined(SGI) TrapSigIot(); #endif #ifdef SGI TrapSigXcpu(); #endif } void ARMCI_ParentTrapSignals() { #ifndef LAPI TrapSigChld(); #endif TrapSigHup(); } void ARMCI_RestoreSignals() { RestoreSigTerm(); RestoreSigInt(); RestoreSigSegv(); } void ARMCI_ParentRestoreSignals() { #ifndef LAPI RestoreSigChld(); #endif ARMCI_RestoreSignals(); RestoreSigHup(); } #ifdef ENABLE_CHECKPOINT /*user can register a function with 3 parameters, 1st offending address * 2nd err number and third file descriptor*/ void ARMCI_Register_Signal_Handler(int sig, void (*func)()) { signal_arr[sig]=func; } #endif ga-5-4/armci/src/common/regions.c0000644000175000017500000004220212662210413015011 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: regions.c,v 1.14.2.3 2007-10-05 16:51:51 manoj Exp $ interface to keep track of memory regions accross the cluster */ /* * armci_region_init - allocates list of regions, initialization * armci_region_register_shm - registers shared memory on the current node * armci_region_register_loc - registers local memory * armci_region_clus_record - stores info on pinned region on a given cluster node * armci_region_clus_found - returns 1/0 if specified memory is registered * armci_region_loc_found - same for local memory * armci_region_loc_both_found - returns 1 if local and remote are found, otherwise 0 * */ /*7/7/06 * REGIONS REQUIRE MEMHDL was for all networks like via, infiniband, etc.. * which had a handle associated with remote/local memory required for * rdma. Coincidentally all these networks also used a server thread. * so server_regions were allocated and enabled when REGIONS_REQUIRE_MEMHDL * was defined. * With Catamount, we require portals memory descriptors to be stored * there is no server but we still need the server_regions to post match all * md to accept all incomming requests */ #include "armcip.h" #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #include "copy.h" /*this should match similar def in portals.c vapi.c and openib.c */ #ifdef PORTALS # define MAX_REGIONS 24 #else # define MAX_REGIONS 8 #endif typedef struct { void *start; void *end; #ifdef REGIONS_REQUIRE_MEMHDL ARMCI_MEMHDL_T memhdl; #endif } armci_region_t; typedef struct { long n; armci_region_t list[MAX_REGIONS]; } armci_reglist_t; static int allow_pin=0; static armci_reglist_t *clus_regions; /* cluster shared/remote memory */ #ifdef REGIONS_REQUIRE_MEMHDL static armci_reglist_t *serv_regions; /* server regions */ #endif static armci_reglist_t loc_regions_arr; /* local memory */ static void *needs_pin_shmptr=NULL, *needs_pin_ptr=NULL; static size_t needs_pin_shmsize=0, needs_pin_size=0; #ifdef REGIONS_REQUIRE_MEMHDL extern int armci_pin_contig_hndl(void *ptr, size_t bytes, ARMCI_MEMHDL_T *memhdl); extern int armci_server_pin_contig(void *ptr, size_t bytes, ARMCI_MEMHDL_T *memhdl); #else extern int armci_pin_contig1(void *ptr, size_t bytes); #endif static void **exch_list=(void**)0; static char exch_loc[MAX_REGIONS]; static char exch_rem[MAX_REGIONS]; void armci_serv_register_req(void *start,long bytes, ARMCI_MEMHDL_T *reg_mem); static int armci_region_record(void *start, void *end, armci_reglist_t *reg) { int cur=reg->n; #ifdef DEBUG_ int i; for(i=0; in; i++) if(reg->start >= start && reg->end < start) armci_die("armci_region_record: already recorded",i); #endif if(reg->n >= MAX_REGIONS) return 0; (reg->list+cur)->start = start; (reg->list+cur)->end = end; reg->n++; return 1; } static void armci_region_register(void *start, long size, armci_reglist_t *reg) { int regid; ARMCI_PR_DBG("enter",0); if(reg->n >= MAX_REGIONS) return; if(armci_nclus<=1)return; regid = reg->n; #ifdef REGIONS_REQUIRE_MEMHDL # if defined(PORTALS) /*we really shouldn't have network specific ifdef's here but this is an * exception to avoid significant code change in the portals layer * ARMCI portals layer maintains a list of memory descriptors for each * region allocated. It uses them in a round robin fashion. We store it * in the memhdl to identify which memory region the memory used by a * communication call corresponds to. */ (reg->list+(regid))->memhdl.regid=regid; # endif if(!armci_pin_contig_hndl(start, size, &((reg->list+reg->n)->memhdl))){ printf("%d pin failed %p bytes=%ld\n",armci_me,start,size); fflush(stdout); return; } #else if(!armci_pin_contig1(start, size)){ printf("%d pin failed %p bytes=%ld\n",armci_me,start,size); fflush(stdout); return; } #endif (void) armci_region_record(start,((char*)start)+size,reg); } void armci_region_register_shm(void *start, long size) { armci_reglist_t *reg = clus_regions+armci_clus_me; if(allow_pin) armci_region_register(start, size, clus_regions+armci_clus_me); else{ needs_pin_shmptr = start; needs_pin_shmsize= size; } #ifdef PORTALS /* we mark the region as local region so that portals layer uses * the md from memhdl instead of any region list*/ (reg->list+(reg->n-1))->memhdl.islocal=0; #endif #if 0 if(allow_pin){ printf("\n%d:%d registering shm %p bytes=%ld\n",armci_me,allow_pin,start,size); fflush(stdout); } #endif } void armci_region_register_loc(void *start, long size) { armci_reglist_t *reg = &loc_regions_arr; if(allow_pin)armci_region_register(start, size, &loc_regions_arr); else{ needs_pin_ptr = start; needs_pin_size= size; } #ifdef PORTALS { extern int _armci_malloc_local_region; if(_armci_malloc_local_region){ (reg->list+(reg->n-1))->memhdl.islocal=1; _armci_malloc_local_region=0; } else (reg->list+(reg->n-1))->memhdl.islocal=0; } #endif #ifdef DEBUG_ if(allow_pin){ printf("\n%d:%d registered local %p bytes=%ld\n",armci_me,allow_pin,start,size); fflush(stdout); } #endif } void armci_region_clus_record(int node, void *start, long size) { if(node > armci_nclus || node <0 ) armci_die("armci_region_remote: bad node ",node); (void)armci_region_record(start,((char*)start)+size,clus_regions+node); } void armci_region_init() { ARMCI_PR_DBG("enter",0); allow_pin =1; clus_regions=(armci_reglist_t*)calloc(armci_nclus,sizeof(armci_reglist_t)); if(!clus_regions)armci_die("armci_region_init: calloc failed",armci_nclus); #ifdef REGIONS_REQUIRE_MEMHDL serv_regions=(armci_reglist_t*)calloc(armci_nclus,sizeof(armci_reglist_t)); if(!serv_regions)armci_die("armci_region_init: calloc failed",armci_nclus); #endif exch_list = (void**)calloc(2*armci_nclus, sizeof(void*)); if(!exch_list) armci_die("armci_region_init: calloc 2 failed",armci_nclus); bzero(exch_loc,sizeof(exch_loc)); bzero(exch_rem,sizeof(exch_rem)); if(needs_pin_ptr) armci_region_register_loc(needs_pin_ptr,needs_pin_size); if(needs_pin_shmptr) armci_region_register_shm(needs_pin_shmptr,needs_pin_shmsize); ARMCI_PR_DBG("exit",0); } void armci_region_destroy() { armci_reglist_t *reg = &loc_regions_arr; int i; #ifdef REGIONS_REQUIRE_MEMHDL ARMCI_MEMHDL_T *loc_memhdl; #endif if(!allow_pin) return; for(i=0; in; i++){ #ifdef REGIONS_REQUIRE_MEMHDL loc_memhdl=&((reg->list+i)->memhdl); armci_network_client_deregister_memory(loc_memhdl); #endif } reg=clus_regions+armci_clus_me; for(i=0; in; i++){ #ifdef REGIONS_REQUIRE_MEMHDL loc_memhdl=&((reg->list+i)->memhdl); armci_network_client_deregister_memory(loc_memhdl); #endif } } void armci_server_region_destroy() { armci_reglist_t *reg; int i; #ifdef REGIONS_REQUIRE_MEMHDL ARMCI_MEMHDL_T *loc_memhdl; ARMCI_PR_DBG("enter",0); reg=serv_regions+armci_clus_me; for(i=0; in; i++){ loc_memhdl=&((reg->list+i)->memhdl); armci_network_server_deregister_memory(loc_memhdl); } ARMCI_PR_DBG("exit",0); #endif } int armci_region_clus_found(int node, void *start, int size) { armci_reglist_t *reg=clus_regions+node; int i,found=-1; if(!allow_pin) return 0; if(node > armci_nclus || node <0 ) armci_die("armci_region_clus_found: bad node ",node); for(i=0; in; i++) if((reg->list+i)->start <= start && (reg->list+i)->end > start){ found=i; break; } return(found); } int armci_region_loc_found(void *start, int size) { armci_reglist_t *reg = &loc_regions_arr; int i,found=-1; ARMCI_PR_DBG("enter",0); if(!allow_pin) return 0; for(i=0; in; i++) if((reg->list+i)->start <= start && (reg->list+i)->end > start){ found=i; break; } #ifdef DEBUG if(found){ printf("%d: found loc %d n=%ld (%p,%p) %p\n",armci_me,found,reg->n, (reg->list)->start,(reg->list)->end, start); fflush(stdout); } #endif ARMCI_PR_DBG("exit",0); return(found); } #ifdef REGIONS_REQUIRE_MEMHDL int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl) { armci_reglist_t *reg = &loc_regions_arr; int i,found=0; if(!allow_pin) return 0; /* first scan for local */ for(i=0; in; i++){ if((reg->list+i)->start <= loc && (reg->list+i)->end > loc){ #if 0 printf("\n%d:loc found %d %p\n",armci_me,i,loc); #endif found=1; break; } #if 0 else { printf("\n%d: loc ptr=%p st=%p end=%p size=%d\n",armci_me,loc, (reg->list+i)->start,(reg->list+i)->end,size); fflush(stdout); } #endif } if(!found){ /* might be local shared */ reg=clus_regions+armci_clus_me; for(i=0; in; i++){ if((reg->list+i)->start <= loc && (reg->list+i)->end > loc){ found=1; break; } #if 0 else { printf("\n%d:clus ptr=%p st=%p end=%p size=%d\n",armci_me,loc, (reg->list+i)->start,(reg->list+i)->end,size); fflush(stdout); } #endif } } #ifdef PORTALS if(found!=1){ *loc_memhdl=NULL; found=1; } #else if(!found) return 0; #endif else {*loc_memhdl=&((reg->list+i)->memhdl);} /* now check remote shared */ reg=serv_regions+node; for(i=0; in; i++){ if((reg->list+i)->start <= rem && (reg->list+i)->end > rem){ #if 0 printf("\n%d: serv found %d %p %p\n",armci_me,i,rem,(reg->list+i)->start); #endif found=2;break; } #if 0 else { printf("\n%d: serv ptr=%p st=%p end=%p size=%d nd=%d\n",armci_me,rem, (reg->list+i)->start,(reg->list+i)->end,size,node); fflush(stdout); } #endif } if(0){ if(found==2){printf("%d: found both %d %p\n", armci_me,node,*loc_memhdl); fflush(stdout); } } if(found==2){*rem_memhdl=&((reg->list+i)->memhdl); return 1;} else return 0; } int armci_region_remote_found_hndl(void *rem,int size, int node, ARMCI_MEMHDL_T **remhdl) { armci_reglist_t *reg = serv_regions+node; int i,found=0; for(i=0; in; i++) if((reg->list+i)->start <= rem && (reg->list+i)->end > rem){ found=1;break; } if(found==1){*remhdl=&((reg->list+i)->memhdl); return 1;} else return 0; } int get_armci_region_local_hndl(void *loc, int node,ARMCI_MEMHDL_T **loc_memhdl) { armci_reglist_t *reg = &loc_regions_arr; int i, found = 0; if(!allow_pin) {printf("inside get_armci_region_local_hndl : case allow_pin = 0\n"); return 0; } if(!found){ reg = serv_regions+armci_clus_me; for(i=0; in; i++){ if((reg->list+i)->start <= loc && (reg->list+i)->end >loc){ found =1; break; } #if 0 else { printf("\n%d: serv ptr=%p st=%p end=%p nd=%d nreg=%d\n",armci_me,loc, (reg->list+i)->start,(reg->list+i)->end,node,reg->n); fflush(stdout); } #endif } } if(found == 1){ *loc_memhdl = &((reg->list+i)->memhdl); if(0){ printf("%d(s) : found local %p\n",armci_me,*loc_memhdl); fflush(stdout); } return 1; } else return 0; } int armci_region_serv_found(int node,void *start,int size) { armci_reglist_t *reg=serv_regions+node; int i,found=-1; if(!allow_pin) return 0; if(node > armci_nclus || node <0 ) armci_die("armci_region_serv_found: bad node ",node); for(i=0; in; i++) if((reg->list+i)->start <= start && (reg->list+i)->end > start){found=i; break;} return(found); } #endif int armci_region_both_found(void *loc, void *rem, int size, int node) { armci_reglist_t *reg = &loc_regions_arr; int i,found=0; if(!allow_pin) return 0; /* first scan for local */ for(i=0; in; i++) if((reg->list+i)->start <= loc && (reg->list+i)->end > loc){found=1; break;} if(!found){ /* might be local shared */ reg=clus_regions+armci_clus_me; for(i=0; in; i++) if((reg->list+i)->start <= loc && (reg->list+i)->end > loc){found=1; break;} } if(!found) return 0; /* now check remote shared */ reg=clus_regions+node; for(i=0; in; i++) if((reg->list+i)->start <= rem && (reg->list+i)->end > rem){found=2;break;} #if 0 if(found==2){printf("%d: found both %d\n",armci_me,node); fflush(stdout); } #endif if(found==2) return 1; else return 0; } void armci_region_exchange(void *start, long size) { int found=0, i; armci_region_t *reg=0; #ifdef REGIONS_REQUIRE_MEMHDL ARMCI_MEMHDL_T *hdlarr; hdlarr = calloc(armci_nclus,sizeof(ARMCI_MEMHDL_T)); #endif if(!allow_pin)return; if(armci_nclus<=1)return; found=armci_region_clus_found(armci_clus_me, start,size); if(found>-1){ if(!exch_rem[found]){ reg = (clus_regions+armci_clus_me)->list+found; exch_rem[found]=1; } }else{ found= armci_region_loc_found(start,size); if(found>-1){ if(!exch_loc[found]){ reg = (&loc_regions_arr)->list+found; exch_loc[found]=1; } } } bzero(exch_list,2*armci_nclus*sizeof(void *)); if( reg && (armci_me == armci_master)){ exch_list[2*armci_clus_me] = reg->start; exch_list[2*armci_clus_me+1] = reg->end; #ifdef REGIONS_REQUIRE_MEMHDL armci_copy(®->memhdl,&hdlarr[armci_clus_me],sizeof(ARMCI_MEMHDL_T)); #endif } /* exchange info on new regions with other nodes */ armci_exchange_address(exch_list,2*armci_nclus); #ifdef REGIONS_REQUIRE_MEMHDL i = armci_nclus*sizeof(ARMCI_MEMHDL_T)/sizeof(int); armci_msg_gop_scope(SCOPE_ALL,hdlarr,i,"+",ARMCI_INT); #endif for(i=0; in); fflush(stdout); #endif #ifdef REGIONS_REQUIRE_MEMHDL armci_copy(&hdlarr[i],&(r->list+r->n)->memhdl,sizeof(ARMCI_MEMHDL_T)); #endif armci_region_record(exch_list[2*i],exch_list[2*i+1], r); } } } /*\ * for server thread to know which region is what in cases where there is one * process per node \*/ void armci_global_region_exchange(void *start, long size) { #ifdef REGIONS_REQUIRE_MEMHDL ARMCI_MEMHDL_T *hdlarr; hdlarr = calloc(armci_nclus,sizeof(ARMCI_MEMHDL_T)); #endif if(!allow_pin)return; if(armci_nclus<=1)return; armci_region_exchange(start,size); #ifdef REGIONS_REQUIRE_MEMHDL { int foundclus=0, foundserv=0, i,loc=0; armci_reglist_t *reglist=NULL,*clreglist=NULL; armci_region_t *reg=NULL; foundclus=armci_region_clus_found(armci_clus_me, start,size); foundserv=armci_region_serv_found(armci_clus_me, start,size); if(foundclus==-1){ foundclus = armci_region_loc_found(start,size); loc=1; } if(foundclus!=-1 && foundserv==-1){ reglist = (serv_regions+armci_clus_me); if(loc) clreglist = &(loc_regions_arr); else clreglist = (clus_regions+armci_clus_me); #if defined(DATA_SERVER) || defined(PORTALS) # if defined(PORTALS) ((reglist->list+reglist->n)->memhdl).regid=(reglist->n); # endif armci_serv_register_req((clreglist->list+foundclus)->start,((char *)(clreglist->list+foundclus)->end-(char *)((clreglist->list+foundclus)->start)),&((reglist->list+reglist->n)->memhdl)); #endif (void)armci_region_record((clreglist->list+foundclus)->start,(clreglist->list+foundclus)->end,reglist); #ifdef LAPI_RDMA armci_copy(&(clreglist->list+foundclus)->memhdl, &(reglist->list+foundclus)->memhdl, sizeof(ARMCI_MEMHDL_T)); #endif #if DEBUG printf("\n%d:serv recording st=%p end=%p sz=%d from %d n=%d sz=%d\n",armci_me,(clreglist->list+foundclus)->start,(clreglist->list+foundclus)->end,(clreglist->list+foundclus)->end-(clreglist->list+foundclus)->start,armci_clus_me,reglist->n,sizeof(ARMCI_MEMHDL_T));fflush(stdout); #endif foundserv=armci_region_serv_found(armci_clus_me, start,size); reg = (serv_regions+armci_clus_me)->list+foundserv; } if(reg) armci_copy(®->memhdl,&hdlarr[armci_clus_me],sizeof(ARMCI_MEMHDL_T)); i = armci_nclus*sizeof(ARMCI_MEMHDL_T)/sizeof(int); armci_msg_gop_scope(SCOPE_ALL,hdlarr,i,"+",ARMCI_INT); for(i=0; ilist+r->n)->start){ #if 0 printf("\n%d:serv recording %p from %d n=%d \n",armci_me,(rc->list+r->n)->start,i,r->n);fflush(stdout); #endif armci_copy(&hdlarr[i],&(r->list+r->n)->memhdl,sizeof(ARMCI_MEMHDL_T)); armci_region_record((rc->list+r->n)->start,(rc->list+r->n)->end,r); } } } #endif } ga-5-4/armci/src/common/utils.c0000644000175000017500000001513512662210413014510 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. * * The barrier_init() and barrier_destroy() functions, * respectively, allow you to initialize and destroy the * barrier. * * The barrier_wait() function allows a thread to wait for a * barrier to be completed. One thread (the one that happens to * arrive last) will return from barrier_wait() with the status * -1 on success -- others will return with 0. The special * status makes it easy for the calling code to cause one thread * to do something in a serial region before entering another * parallel section of code. */ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_ERRNO_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #include "utils.h" #define DEBUG_ int mt_size; /* number of processes: needed for collective mt ops */ int mt_tpp; /* number of threads used for collective ops */ thread_barrier_t mt_barrier; /* static barrier used for multi-threaded MT_BARRIER */ int armci_malloc_mt(void *ptr[], int bytes) { int rc, th_size, i, j; th_size = mt_size * mt_tpp; if (thread_barrier_wait(&mt_barrier)==-1) { rc = PARMCI_Malloc(ptr, bytes * mt_tpp); #ifdef DEBUG printf("bytes=%d\n", bytes); for (i = 0; i < mt_size; i++) printf("ptr[%d]=%p\n",i,ptr[i]); #endif /* at this point proc ptrs are at beggining of the list */ for (i = mt_size - 1; i >= 0; i--) for (j = mt_tpp - 1; j >= 0; j--) { #ifdef DEBUG printf("mt_size=%d,mt_tpp=%d,i=%d,j=%d,ptr[%d]=%p+%d\n", mt_size,mt_tpp,i,j,i*mt_tpp+j,ptr[i],j*bytes); fflush(stdout); #endif ptr[i * mt_tpp + j] = ((char*)ptr[i]) + j * bytes; } } thread_barrier_wait(&mt_barrier); return rc; } int armci_free_mt(void *ptr, int th_idx) { } #ifdef POSIX_THREADS /* * Initialize a barrier for use. */ int thread_barrier_init (thread_barrier_t *barrier, int count) { int status; barrier->threshold = barrier->counter = count; barrier->cycle = 0; status = pthread_mutex_init (&barrier->mutex, NULL); if (status != 0) return status; status = pthread_cond_init (&barrier->cv, NULL); if (status != 0) { pthread_mutex_destroy (&barrier->mutex); return status; } barrier->valid = BARRIER_VALID; return 0; } /* * Destroy a barrier when done using it. */ int thread_barrier_destroy (thread_barrier_t *barrier) { int status, status2; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; /* * Check whether any threads are known to be waiting; report * "BUSY" if so. */ if (barrier->counter != barrier->threshold) { pthread_mutex_unlock (&barrier->mutex); return EBUSY; } barrier->valid = 0; status = pthread_mutex_unlock (&barrier->mutex); if (status != 0) return status; /* * If unable to destroy either 1003.1c synchronization * object, return the error status. */ status = pthread_mutex_destroy (&barrier->mutex); status2 = pthread_cond_destroy (&barrier->cv); return (status == 0 ? status : status2); } /* * Wait for all members of a barrier to reach the barrier. When * the count (of remaining members) reaches 0, broadcast to wake * all threads waiting. */ int thread_barrier_wait (thread_barrier_t *barrier) { int status, cancel, tmp, cycle; if (barrier->valid != BARRIER_VALID) return EINVAL; status = pthread_mutex_lock (&barrier->mutex); if (status != 0) return status; cycle = barrier->cycle; /* Remember which cycle we're on */ if (--barrier->counter == 0) { barrier->cycle = !barrier->cycle; barrier->counter = barrier->threshold; status = pthread_cond_broadcast (&barrier->cv); /* * The last thread into the barrier will return status * -1 rather than 0, so that it can be used to perform * some special serial code following the barrier. */ if (status == 0) status = -1; } else { /* * Wait with cancellation disabled, because barrier_wait * should not be a cancellation point. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &cancel); /* * Wait until the barrier's cycle changes, which means * that it has been broadcast, and we don't want to wait * anymore. */ while (cycle == barrier->cycle) { status = pthread_cond_wait ( &barrier->cv, &barrier->mutex); if (status != 0) break; } pthread_setcancelstate (cancel, &tmp); } /* * Ignore an error in unlocking. It shouldn't happen, and * reporting it here would be misleading -- the barrier wait * completed, after all, whereas returning, for example, * EINVAL would imply the wait had failed. The next attempt * to use the barrier *will* return an error, or hang, due * to whatever happened to the mutex. */ pthread_mutex_unlock (&barrier->mutex); return status; /* error, -1 for waker, or 0 */ } #endif #if 0 /*** NAME timing.c PURPOSE Timing routines for calculating the execution time: void start_timer(void); Set the timer. double elapsed_time(void); Return the timing elapsed since the timer has been set. NOTES Jialin Ju - Oct 16, 1995 Created. ***/ /* Timing routines that use standard Unix gettingofday() */ static struct timezone tz; static struct timeval start_time, finish_time; /* Start measuring a time delay */ void start_timer(void) { gettimeofday( &start_time, &tz); } /* Retunrn elapsed time in milliseconds */ double elapsed_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*(finish_time.tv_sec - start_time.tv_sec) + (finish_time.tv_usec - start_time.tv_usec)/1000.0 ); } /* Return the stopping time in milliseconds */ double stop_time(void) { gettimeofday( &finish_time, &tz); return(1000.0*finish_time.tv_sec + finish_time.tv_usec/1000.0); } #endif ga-5-4/armci/src/common/request.c0000644000175000017500000015612212662210413015042 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: request.c,v 1.74.2.11 2007-10-18 06:09:37 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_SIGNAL_H # include #endif #include "armcip.h" #include "request.h" #include "memlock.h" #include "armci_shmem.h" #include "copy.h" #include "gpc.h" #ifdef SOCKETS extern void armci_sock_send(int to, void *data, int len); #endif #define DEBUG_ 0 #if 0 # define MARK_ENTER(func_) { fprintf(stdout, "ENTERING %s\n", func_); fflush(stdout); } # define MARK_EXIT(func_) { fprintf(stdout, "EXITING %s\n", func_); fflush(stdout); } #else # define MARK_ENTER(func_) # define MARK_EXIT(func_) #endif #if 0 # define PRNDBG3(m,a1,a2,a3) \ fprintf(stderr,"DBG %d: " m,armci_me,a1,a2,a3);fflush(stderr) # define PRNDBG(m) PRNDBG3(m,0,0,0) # define PRNDBG1(m,a1) PRNDBG3(m,a1,0,0) # define PRNDBG2(m,a1,a2) PRNDBG3(m,a1,a2,0) #else # define PRNDBG(m) # define PRNDBG1(m,a1) # define PRNDBG2(m,a1,a2) # define PRNDBG3(m,a1,a2,a3) #endif #if !defined(GM) && !defined(VIA) && !defined(LAPI) &&!defined(VAPI) double _armci_rcv_buf[MSG_BUFLEN_DBL]; double _armci_snd_buf[MSG_BUFLEN_DBL]; char* MessageSndBuffer = (char*)_armci_snd_buf; char* MessageRcvBuffer = (char*)_armci_rcv_buf; #endif #define MAX_EHLEN 248 #define ADDBUF(buf,type,val) *(type*)(buf) = (val); (buf) += sizeof(type) #define GETBUF(buf,type,var) (var) = *(type*)(buf); (buf) += sizeof(type) #define ALLIGN8(buf){size_t _adr=(size_t)(buf); \ _adr>>=3; _adr<<=3; _adr+=8; (buf) = (char*)_adr; } #ifndef CLN # define CLN 1 #endif #ifndef SERV # define SERV 2 #endif /*******************Routines to handle completion descriptor******************/ /*\ *Following the the routines to fill a completion descriptor, if necessary *copy the data to destination based on completion descriptor *NOTE, THE FOLLOWING ROUTINES ARE FOR CLIENTS ONLY \*/ /*\Routine to complete a vector request, data is in buf and descriptor in dscr \*/ extern int armci_direct_vector_get(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); static void armci_complete_vector_get(armci_giov_t darr[],int len,void *buf) { int proc; request_header_t *msginfo = (request_header_t*) buf; proc = msginfo->to; #if defined(USE_SOCKET_VECTOR_API) armci_direct_vector_get(msginfo, darr, len, proc); #else armci_rcv_vector_data(proc, msginfo, darr, len); #endif FREE_SEND_BUFFER(buf); } /*\ Routine called from buffers.c to complete a request for which the buffer was * used for, so that the buffer can be reused. \*/ void armci_complete_req_buf(BUF_INFO_T *info, void *buffer) { request_header_t *msginfo = (request_header_t*) buffer; if(info->protocol==0)return; else if(info->protocol==SDSCR_IN_PLACE){ char *dscr = info->dscr; void *loc_ptr; int stride_levels; int *loc_stride_arr,*count; loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; if(0 || DEBUG_){ if(armci_me==0){ printf("\n%d:extracted loc_ptr=%p, stridelevels=%d\n",armci_me, loc_ptr,stride_levels); fflush(stdout); } } #if defined(ALLOW_PIN) || defined(LAPI2) if(msginfo->pinned && msginfo->bypass){ armci_rcv_strided_data_bypass_both(msginfo->to,msginfo,loc_ptr,count, stride_levels); } else #endif armci_rcv_strided_data(msginfo->to, msginfo, msginfo->datalen, loc_ptr, stride_levels,loc_stride_arr,count); FREE_SEND_BUFFER(msginfo); } else if(info->protocol==VDSCR_IN_PLACE || info->protocol==VDSCR_IN_PTR){ char *dscr; int len,i; if(info->protocol==VDSCR_IN_PLACE)dscr = info->dscr; else dscr = info->ptr.dscrbuf; GETBUF(dscr, long ,len); { armci_giov_t *darr; darr = (armci_giov_t *)malloc(sizeof(armci_giov_t)*len); if(!darr)armci_die("malloc in complete_req_buf failed",len); for(i = 0; i< len; i++){ int parlen, bytes; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); darr[i].ptr_array_len = parlen; darr[i].bytes = bytes; if(msginfo->operation==GET)darr[i].dst_ptr_array=(void **)dscr; else darr[i].src_ptr_array=(void **)dscr; dscr+=sizeof(void *)*parlen; } if (msginfo->operation==GET) armci_complete_vector_get(darr,len,buffer); } } else armci_die("armci_complete_req_buf,protocol val invalid",info->protocol); } /*\ save a part of strided descriptor needed to complete request \*/ void armci_save_strided_dscr(char **bptr, void *rem_ptr,int rem_stride_arr[], int count[], int stride_levels,int is_nb) { int i; char *bufptr=*bptr; BUF_INFO_T *info=NULL; MARK_ENTER("armci_save_strided_dscr"); if(is_nb){ info=BUF_TO_BUFINFO(*bptr); bufptr = (info->dscr); } *(void**)bufptr = rem_ptr; bufptr += sizeof(void*); *(int*)bufptr = stride_levels; bufptr += sizeof(int); for(i=0;idscr); if(armci_me==0) printf("\n%d:rem_ptr %p=%p stride_levels %d=%d\n",armci_me, *(void**)bufptr,rem_ptr, *(int*)(bufptr + sizeof(void*)),stride_levels); } /*remote_strided expects the pointer to point to the end of descr hence..*/ if(is_nb) info->protocol=SDSCR_IN_PLACE; else *bptr=bufptr; MARK_EXIT("armci_save_strided_dscr"); } /*\ save a part of vector descriptor needed to complete request \*/ void armci_save_vector_dscr(char **bptr,armci_giov_t darr[],int len, int op,int is_nb) { int i,size=sizeof(int); BUF_INFO_T *info; char *buf,*bufptr=*bptr; void *rem_ptr; if(is_nb){ for(i=0;idscr; info->protocol=VDSCR_IN_PLACE; } else { info->ptr.dscrbuf = (void *)malloc(size); buf = (char *)info->ptr.dscrbuf; info->protocol=VDSCR_IN_PTR; } } else buf=bufptr; ADDBUF(buf,long,len); /* number of sets */ for(i=0;ibufid to val, else set it to the id of the buf \*/ void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle,char *buf,int val) { BUF_INFO_T *info; if(buf){ info = BUF_TO_BUFINFO(buf); val = info->bufid; } nb_handle->bufid = val; } /**************End--Routines to handle completion descriptor******************/ /*\ send request to server to LOCK MUTEX \*/ void armci_rem_lock(int mutex, int proc, int *ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(int); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,LOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->datalen = sizeof(int); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = LOCK; msginfo->format = mutex; msginfo->bytes = msginfo->datalen + msginfo->dscrlen; #ifdef SOCKETS msginfo->tag = BUF_TO_BUFINFO(msginfo)->bufid; #endif ibuf = (int*)(msginfo+1); *ibuf = mutex; armci_send_req(proc, msginfo, bufsize); /* receive ticket from server */ #ifdef SOCKETS armci_rcv_hdlr(msginfo); *ticket = *(int*)(msginfo + 1); #else *ticket = *(int*)armci_rcv_data(proc,msginfo); #endif FREE_SEND_BUFFER(msginfo); if(DEBUG_)fprintf(stderr,"%d receiving ticket %d\n",armci_me, *ticket); } void armci_server_lock(request_header_t *msginfo) { int *ibuf = (int*)(msginfo+1); int proc = msginfo->from; int mutex; int ticket; mutex = *(int*)ibuf; /* acquire lock on behalf of requesting process */ ticket = armci_server_lock_mutex(mutex, proc, msginfo->tag); if(ticket >-1){ /* got lock */ msginfo->datalen = sizeof(int); #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif armci_send_data(msginfo, &ticket); } } /*\ send request to server to UNLOCK MUTEX \*/ void armci_rem_unlock(int mutex, int proc, int ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(ticket); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,UNLOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = msginfo->bytes = sizeof(ticket); msginfo->datalen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = UNLOCK; msginfo->format = mutex; #ifdef SOCKETS msginfo->tag = BUF_TO_BUFINFO(msginfo)->bufid; #endif ibuf = (int*)(msginfo+1); *ibuf = ticket; if(DEBUG_)fprintf(stderr,"%d sending unlock\n",armci_me); armci_send_req(proc, msginfo, bufsize); } /*\ server unlocks mutex and passes lock to the next waiting process \*/ void armci_server_unlock(request_header_t *msginfo, char* dscr) { int ticket = *(int*)dscr; int mutex = msginfo->format; int proc = msginfo->to; int waiting; waiting = armci_server_unlock_mutex(mutex,proc,ticket,&msginfo->tag); if(waiting >-1){ /* -1 means that nobody is waiting */ ticket++; /* pass ticket to the waiting process */ msginfo->from = waiting; msginfo->datalen = sizeof(ticket); #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif armci_send_data(msginfo, &ticket); } } void armci_unlock_waiting_process(msg_tag_t tag, int proc, int ticket) { request_header_t header; request_header_t *msginfo = &header; msginfo->datalen = sizeof(int); msginfo->tag = tag; msginfo->from = proc; msginfo->to = armci_me; armci_send_data(msginfo, &ticket); } #ifdef REGIONS_REQUIRE_MEMHDL void armci_serv_register_req(void *ptr,long sz,ARMCI_MEMHDL_T *memhdl) { char *buf; int bufsize = sizeof(request_header_t)+sizeof(long)+sizeof(void *)+sizeof(ARMCI_MEMHDL_T); request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,REGISTER,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = sizeof(long)+sizeof(void *); msginfo->datalen = sizeof(ARMCI_MEMHDL_T); msginfo->operation = REGISTER; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; #ifndef LAPI msginfo->tag.ack = 0; #endif buf = (char *)(msginfo+1); ADDBUF(buf,void*,ptr); ADDBUF(buf,long,sz); armci_send_req(armci_master, msginfo, bufsize); buf= armci_rcv_data(armci_master, msginfo); /* receive response */ armci_copy(buf,memhdl,sizeof(ARMCI_MEMHDL_T)); FREE_SEND_BUFFER(msginfo); if(DEBUG_){ printf("%d:client register req sent ptr=%p %d bytes\n",armci_me, buf,bufsize);fflush(stdout); } } #endif /*\ control message to the server, e.g.: ATTACH to shmem, return ptr etc. \*/ void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen) { char *buf; int bufsize = sizeof(request_header_t)+ilen + sizeof(long)+sizeof(rlen); request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = ilen; msginfo->datalen = sizeof(long)+sizeof(rlen); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(info, msginfo +1, ilen); buf = ((char*)msginfo) + ilen + sizeof(request_header_t); *((long*)buf) =size; *(int*)(buf+ sizeof(long)) =rlen; armci_send_req(armci_master, msginfo, bufsize); if(rlen){ buf= armci_rcv_data(armci_master, msginfo); /* receive response */ armci_copy(buf, resp, rlen); FREE_SEND_BUFFER(msginfo); if(DEBUG_){printf("%d:client attaching got ptr=%p %d bytes\n",armci_me,buf,rlen); fflush(stdout); } } } /*\ server initializes its copy of the memory lock data structures \*/ static void server_alloc_memlock(void *ptr_myclus) { int i; /* for protection, set pointers for processes outside local node NULL */ memlock_table_array = calloc(armci_nproc,sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); /* set pointers for processes on local cluster node * ptr_myclus - corresponds to the master process */ for(i=0; i< armci_clus_info[armci_clus_me].nslave; i++){ memlock_table_array[armci_master +i] = ((char*)ptr_myclus) + MAX_SLOTS*sizeof(memlock_t)*i; } /* set pointer to the use flag */ #ifdef MEMLOCK_SHMEM_FLAG armci_use_memlock_table = (int*) (MAX_SLOTS*sizeof(memlock_t) + (char*) memlock_table_array[armci_clus_last]); if(DEBUG_) fprintf(stderr,"server initialized memlock %p\n", (void*)armci_use_memlock_table); #endif } static int allocate_memlock=1; /*\ server actions triggered by client request to ATTACH \*/ void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen) { double *ptr; long *idlist = (long*)descr; long size = *(long*)buffer; int rlen = *(int*)(sizeof(long)+(char*)buffer); if(size<0) armci_die("armci_server_ipc: size<0",(int)size); ptr=(double*)Attach_Shared_Region(idlist+1,size,idlist[0]); if(!ptr)armci_die("armci_server_ipc: failed to attach",0); /* provide data server with access to the memory lock data structures */ if(allocate_memlock){ allocate_memlock = 0; server_alloc_memlock(ptr); } if(size>0)armci_set_mem_offset(ptr); if(msginfo->datalen != sizeof(long)+sizeof(int)) armci_die("armci_server_ipc: bad msginfo->datalen ",msginfo->datalen); if(rlen==sizeof(ptr)){ #if defined(PEND_BUFS) memcpy(buffer, &ptr, sizeof(&ptr)); armci_send_data(msginfo, buffer); #else armci_send_data(msginfo, &ptr); #endif }else armci_die("armci_server_ipc: bad rlen",rlen); } /*\ send RMW request to server \*/ void armci_rem_rmw(int op, int *ploc, int *prem, int extra, int proc) { request_header_t *msginfo; char *buf; void *buffer; int bufsize = sizeof(request_header_t)+sizeof(long)+sizeof(void*); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,op,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = sizeof(void*); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->datalen = sizeof(long); #ifdef SOCKETS msginfo->tag = BUF_TO_BUFINFO(msginfo)->bufid; #endif buf = (char*)(msginfo+1); ADDBUF(buf, void*, prem); /* pointer is shipped as descriptor */ /* data field: extra argument in fetch&add and local value in swap */ if(op==ARMCI_SWAP){ ADDBUF(buf, int, *ploc); }else if(op==ARMCI_SWAP_LONG) { ADDBUF(buf, long, *((long*)ploc) ); msginfo->datalen = sizeof(long); }else { ADDBUF(buf, int, extra); } msginfo->bytes = msginfo->datalen+msginfo->dscrlen ; if(DEBUG_){ printf("%d sending RMW request %d to %d\n",armci_me,op,proc); fflush(stdout); } armci_send_req(proc, msginfo, bufsize); #ifdef SOCKETS armci_rcv_hdlr(msginfo); buffer = msginfo + 1; #else buffer = armci_rcv_data(proc,msginfo); /* receive response */ #endif if(op==ARMCI_FETCH_AND_ADD || op== ARMCI_SWAP) *ploc = *(int*)buffer; else *(long*)ploc = *(long*)buffer; FREE_SEND_BUFFER(msginfo); } /*\ server response to RMW \*/ void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra) { long lold; int iold; void *pold=0; int op = msginfo->operation; if(DEBUG_){ printf("%d server: executing RMW from %d. op=%d pextra=%p\n",armci_me,msginfo->from, op, pextra); fflush(stdout); } if(msginfo->datalen != sizeof(long)) armci_die2("armci_server_rmw: bad datalen=",msginfo->datalen,op); /* for swap operations *pextra has the value to swap * for fetc&add it carries the increment argument */ switch(op){ case ARMCI_SWAP: iold = *(int*) pextra; case ARMCI_FETCH_AND_ADD: pold = &iold; break; case ARMCI_SWAP_LONG: lold = *(long*) pextra; case ARMCI_FETCH_AND_ADD_LONG: pold = &lold; break; default: armci_die("armci_server_rmw: bad operation code=",op); } armci_generic_rmw(op, pold, *(int**)ptr, *(int*) pextra, msginfo->to); #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif #if defined(PEND_BUFS) memcpy(pextra,pold,msginfo->datalen); armci_send_data(msginfo, pextra); /*Send from server-anointed buffers*/ #else armci_send_data(msginfo, pold); #endif } extern int armci_direct_vector_snd(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); extern int armci_direct_vector(request_header_t *msginfo , armci_giov_t darr[], int len, int proc); int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,int flag, armci_ihdl_t nb_handle) { char *buf,*buf0; request_header_t *msginfo; int bytes =0, s, slen=0; size_t adr; int bufsize = sizeof(request_header_t),isnonblocking=0; if(nb_handle)isnonblocking=1; /* compute size of the buffer needed */ for(s=0; stag = BUF_TO_BUFINFO(buf)->bufid; #endif /* printf("%d:: rem_vector. len=%d. ptr_len[len-1]=%d bytes[len-1]=%d bufsize=%d\n", */ /* armci_me, len, darr[len-1].ptr_array_len, darr[len-1].bytes,bufsize); */ /* fflush(stdout); */ if(nb_handle){ INIT_SENDBUF_INFO(nb_handle,buf,op,proc); _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } buf += sizeof(request_header_t); /* fill vector descriptor */ armci_save_vector_dscr(&buf,darr,len,op,0); /* align buf for doubles (8-bytes) before copying data */ adr = (size_t)buf; adr >>=3; adr <<=3; adr +=8; buf = (char*)adr; msginfo->ehlen = 0; /* fill message header */ msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->format = VECTOR; msginfo->datalen = bytes; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; default: slen=0; } buf += slen; msginfo->datalen += slen; msginfo->bytes = msginfo->datalen+msginfo->dscrlen; #ifdef USE_SOCKET_VECTOR_API if (flag && (op == GET || op == PUT)) { /*armci_direct_vector(msginfo,darr,len,proc);*/ armci_direct_vector_snd(msginfo,darr,len,proc); if (op == GET) { armci_save_vector_dscr(&buf0,darr,len,op,1); /*armci_complete_vector_get(darr,len,msginfo);*/ armci_rcv_hdlr(msginfo); } _armci_buf_set_cmpld(msginfo, 1); /* this may not be the best place */ return 0; } #endif /* for put and accumulate copy data into buffer */ if(op != GET){ /* fprintf(stderr,"sending %f\n",*(double*)darr[0].src_ptr_array[0]);*/ armci_vector_to_buf(darr, len, buf); } /* #ifdef VAPI */ /* else{ */ /* if(msginfo->dscrlen < (bytes - sizeof(int))) */ /* *(int*)(((char*)(msginfo+1))+(bytes-sizeof(int))) = ARMCI_STAMP; */ /* else */ /* *(int*)(((char*)(msginfo+1))+(msginfo->dscrlen+bytes-sizeof(int))) = ARMCI_STAMP; */ /* } */ /* #endif */ armci_send_req(proc, msginfo, bufsize); #ifdef KOT if (op == GET #ifndef SOCKETS && nb_handle #endif ) { armci_save_vector_dscr(&buf0,darr,len,op,1); #ifdef SOCKETS armci_rcv_hdlr(msginfo); #else armci_complete_vector_get(darr,len,msginfo); #endif } #ifdef SOCKETS _armci_buf_set_cmpld(msginfo, 1); /* this may not be the best place */ #endif #else if(nb_handle && op==GET)armci_save_vector_dscr(&buf0,darr,len,op,1); if(op == GET # if !defined(SOCKETS) && !defined(MPI_SPAWN) && !defined(MPI_MT) && !nb_handle # endif ){ #ifdef SOCKETS armci_rcv_hdlr(msginfo); #else armci_complete_vector_get(darr,len,msginfo); #endif } #if defined(SOCKETS) && !defined(NB_SOCKETS) _armci_buf_set_cmpld(msginfo, 1); /* this may not be the best place */ #endif #endif return 0; } #define CHUN_ (8*8096) #define CHUN 200000 /*\ client version of remote strided operation \*/ int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int flag,armci_ihdl_t nb_handle) { char *buf, *buf0; request_header_t *msginfo; int i, slen=0, bytes; void *rem_ptr; int *rem_stride_arr; int bufsize = sizeof(request_header_t); int ehlen =0; /* we send ext header only for last chunk */ #if 0 if(h) ehlen = h->len; #else if(h) if(h->last) ehlen = h->len; #endif if(ehlen>MAX_EHLEN || ehlen <0) armci_die2("armci_rem_strided ehlen out of range",MAX_EHLEN,ehlen); /* calculate size of the buffer needed */ for(i=0, bytes=1;i<=stride_levels;i++)bytes*=count[i]; bufsize += bytes+sizeof(void*)+2*sizeof(int)*(stride_levels+1) +ehlen +2*sizeof(double) + 16; /* +scale+alignment */ if (flag){ # ifdef CLIENT_BUF_BYPASS if(_armci_bypass) bufsize -=bytes; /* we are not sending data*/ # elif defined(USE_SOCKET_VECTOR_API) bufsize -=bytes; /* we are not sending data*/ bufsize += sizeof(struct iovec)*MAX_IOVEC; # else if(op==GET)bufsize -=bytes; # endif } buf = buf0= GET_SEND_BUFFER((bufsize),op,proc); msginfo = (request_header_t*)buf; bzero(msginfo,sizeof(request_header_t)); #ifdef SOCKETS #if 0 || defined(DTAG) msginfo->tag = nb_handle ? nb_handle->tag : GET_NEXT_NBTAG(); _armci_buf_set_tag(buf,msginfo->tag,0); printf("DTAG: tag=%ld,DTAG=%d,",msginfo->tag,DTAG); msginfo->tag &= DTAG; msginfo->tag <<= sizeof(msg_id_t) * 8; msginfo->tag |= BUF_TO_BUFINFO(buf)->bufid; printf("bufid=%hd,dtag=%ld\n",BUF_TO_BUFINFO(buf)->bufid,msginfo->tag); fflush(stdout); #else msginfo->tag = BUF_TO_BUFINFO(buf)->bufid; #endif #endif if(nb_handle) #ifdef ACC_SMP if(!ARMCI_ACC(op)) #endif { /* INIT_SENDBUF_INFO(nb_handle,buf,op,proc); same as _armci_buf_set_tag, why here? */ _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } if(op == GET){ rem_ptr = src_ptr; rem_stride_arr = src_stride_arr; }else{ rem_ptr = dst_ptr; rem_stride_arr = dst_stride_arr; } msginfo->datalen=bytes; #if defined(USE_SOCKET_VECTOR_API) || defined(MPI_SPAWN_ZEROCOPY) /*****for making put use readv/writev on sockets*****/ if(op==PUT && flag) msginfo->datalen=0; #endif /* fill strided descriptor */ buf += sizeof(request_header_t); /*this function fills the dscr into buf and also moves the buf ptr to the end of the dscr*/ armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0); # ifdef CLIENT_BUF_BYPASS if(flag && _armci_bypass){ /* to bypass the client MessageSnd buffer in get we need to add source pointer and stride info - server will put data directly there */ ADDBUF(buf,void*,dst_ptr); for(i=0;ibypass=1; msginfo->pinned=0; /* if set then pin is done before sending req*/ }else{ msginfo->bypass=0; msginfo->pinned=0; } # endif #ifdef LAPI2 msginfo->bypass=0; msginfo->pinned=0; #endif /* align buf for doubles (8-bytes) before copying data */ ALLIGN8(buf); /* fill message header */ msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = op; /* put scale for accumulate */ switch(op){ case ARMCI_ACC_INT: *(int*)buf = *(int*)scale; slen= sizeof(int); break; case ARMCI_ACC_DCP: ((double*)buf)[0] = ((double*)scale)[0]; ((double*)buf)[1] = ((double*)scale)[1]; slen=2*sizeof(double);break; case ARMCI_ACC_DBL: *(double*)buf = *(double*)scale; slen = sizeof(double); break; case ARMCI_ACC_CPL: ((float*)buf)[0] = ((float*)scale)[0]; ((float*)buf)[1] = ((float*)scale)[1]; slen=2*sizeof(float);break; case ARMCI_ACC_FLT: *(float*)buf = *(float*)scale; slen = sizeof(float); break; case ARMCI_ACC_LNG: *(long*)buf = *(long*)scale; slen = sizeof(long); break; default: slen=0; } /* if(ARMCI_ACC(op))printf("%d client len=%d alpha=%f data=%f,%f\n", armci_me, buf-(char*)msginfo,((double*)buf)[0],*((double*)src_ptr), ((double*)buf)[1]); */ buf += slen; /**** add extended header *******/ if(ehlen){ bcopy(h->exthdr,buf,ehlen); i = ehlen%8; ehlen += (8-i); /* make sure buffer is still alligned */ buf += ehlen; } msginfo->ehlen = ehlen; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->datalen+msginfo->dscrlen; if(op == GET){ /* #ifdef VAPI */ /* if(msginfo->dscrlen < (bytes - sizeof(int))) */ /* *(int*)(((char*)(msginfo+1))+(bytes-sizeof(int)))=ARMCI_STAMP; */ /* else */ /* *(int*)(((char*)(msginfo+1))+(msginfo->dscrlen+bytes-sizeof(int))) = */ /* ARMCI_STAMP; */ /* #endif */ # if defined(CLIENT_BUF_BYPASS) if(msginfo->bypass){ #ifdef MULTISTEP_PIN if(stride_levels==0 && !msginfo->pinned && count[0]>=400000){ int seq=1; armci_send_req(proc,msginfo,bufsize); for(i=0; i< bytes; i+=CHUN){ int len= ARMCI_MIN(CHUN,(bytes-i)); char *p = i +(char*)dst_ptr; armci_pin_contig(p, len); armci_client_send_ack(proc, seq); seq++; } }else #endif { int armci_pin_memory(void *,int *,int *,int); void armci_client_send_ack(int, int); if(!msginfo->pinned) armci_send_req(proc,msginfo,bufsize); if(!armci_pin_memory(dst_ptr,dst_stride_arr,count, stride_levels)){ armci_client_send_ack(proc, -1); armci_rcv_strided_data_bypass(proc,msginfo,dst_ptr,stride_levels); FREE_SEND_BUFFER(msginfo); return 1; /* failed:cannot do bypass */ } if(msginfo->pinned) armci_send_req(proc,msginfo,bufsize); else armci_client_send_ack(proc, 1); /*if(nb_handle) armci_save_strided_dscr(&buf,dst_ptr,dst_stride_arr,count, stride_levels,1);*/ } }else # endif { armci_send_req(proc, msginfo, bufsize); } #if !defined(MPI_SPAWN) && !defined(MPI_MT) #ifdef ACC_SMP if(!ARMCI_ACC(op)) #endif armci_save_strided_dscr(&buf0,dst_ptr,dst_stride_arr,count, stride_levels,1); #endif #if defined(SOCKETS) # ifdef NB_SOCKETS if(!nb_handle) # endif { armci_rcv_hdlr(msginfo); FREE_SEND_BUFFER(msginfo); } #else # if !defined(MPI_SPAWN) && !defined(MPI_MT) if(!nb_handle) # endif { armci_rcv_strided_data(proc, msginfo, msginfo->datalen, dst_ptr, stride_levels, dst_stride_arr,count); FREE_SEND_BUFFER(msginfo); } #endif } else { /* for put and accumulate send data */ armci_send_strided(proc,msginfo, buf, src_ptr, stride_levels, src_stride_arr, count); #ifdef SOCKETS _armci_buf_set_cmpld(msginfo, 1); /* this may not be the best place */ #endif } return 0; } #if defined(ALLOW_PIN) && defined(VAPI) /*\ * two phase send \*/ int armci_two_phase_send(int proc,void *src_ptr,int src_stride_arr[], void *dst_ptr,int dst_stride_arr[],int count[], int stride_levels,void ** context_ptr,armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc) { char *buf, *buf0; request_header_t *msginfo; int bytes, i; int ehlen = 0,nbtag=0; int *rem_ptr; int * rem_stride_arr; int bufsize = sizeof(request_header_t); void armci_post_gather(void *, int *, int *,int, armci_vapi_memhndl_t *,int,int,int,NB_CMPL_T *); bytes = 0; if(nbhandle)nbtag = nbhandle->tag; /*calculate the size of buffer needed */ bufsize += bytes+sizeof(void *) + 2*sizeof(int)*(stride_levels+1) + ehlen +2*sizeof(double) + 16; buf = buf0 = GET_SEND_BUFFER(bufsize,PUT,proc); msginfo = (request_header_t*)buf; buf += sizeof(request_header_t); bzero(msginfo, sizeof(request_header_t)); rem_ptr = dst_ptr; rem_stride_arr = dst_stride_arr; armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0); if(DEBUG_) { printf(" CLIENT :the dest_ptr is %p src is %p\n", rem_ptr,src_ptr); for(i =0; idatalen = 0; msginfo->bypass = 1; msginfo->pinned = 1; msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = PUT; msginfo->ehlen = 0; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->datalen + msginfo->dscrlen; /* I have not set msginfo->tag */ /* send the first phase request */ armci_send_req(proc, msginfo, bufsize); if(DEBUG_) { printf("%d:CLIENT : finished sending first put request \n",armci_me); fflush(stdout); } armci_wait_ack(buf0); if(DEBUG_) { printf("\n%d: client got ack about to post gather\n",armci_me); fflush(stdout); } /* the client is now in the second phase, in a loop creates the gather descr one at a time and posts them */ armci_post_gather(src_ptr,src_stride_arr,count,stride_levels, mhloc,proc,nbtag,CLN,&nbhandle->cmpl_info); if(DEBUG_) { printf("%d(c) : returned from armci_post_gather\n",armci_me); fflush(stdout); } if(nbhandle){ BUF_INFO_T *info=NULL; info=BUF_TO_BUFINFO(buf0); info->protocol=0; } FREE_SEND_BUFFER(msginfo); return 0; } int armci_two_phase_get(int proc, void*src_ptr, int src_stride_arr[], void*dst_ptr,int dst_stride_arr[], int count[], int stride_levels, void**context_ptr, armci_ihdl_t nb_handle, ARMCI_MEMHDL_T *mhloc) { char *buf, *buf0; request_header_t *msginfo; int bytes; int ehlen = 0,nbtag=0; int *rem_ptr; int num; int *rem_stride_arr; int bufsize = sizeof(request_header_t); extern void armci_post_scatter(void *,int *,int *,int, armci_vapi_memhndl_t *,int,int,int,NB_CMPL_T *); extern void armci_wait_for_blocking_scatter(); if(DEBUG_){ printf("%d(c):about to call armci_post_scatter, CLN value is %d\n", armci_me,CLN); fflush(stdout); } if(nb_handle)nbtag = nb_handle->tag; armci_post_scatter(dst_ptr, dst_stride_arr, count, stride_levels,mhloc, proc,nbtag,CLN,&nb_handle->cmpl_info); if(DEBUG_){ printf("\n%d: returned from armci_post_scatter %d\n",armci_me,num); fflush(stdout); } bytes = 0; bufsize += bytes+sizeof(void *) + 2*sizeof(int)*(stride_levels+1) + ehlen +2*sizeof(int) +2*sizeof(double) + 16; buf = buf0 = GET_SEND_BUFFER(bufsize,GET,proc); msginfo = (request_header_t *)buf; buf += sizeof(request_header_t); rem_ptr = src_ptr; rem_stride_arr = src_stride_arr; /*this call is to put the remote descriptor into the buffer to send*/ armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0); msginfo->datalen = 0; msginfo->bypass = 1; msginfo->pinned = 1; msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = GET; msginfo->ehlen = 0; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->datalen + msginfo->dscrlen; /* send the request asking the server to post gather */ armci_send_req(proc, msginfo, bufsize); if(DEBUG_){ printf("%d(c) : finished sending get request to server\n",armci_me); fflush(stdout); } if(nb_handle){ BUF_INFO_T *info=NULL; info=BUF_TO_BUFINFO(buf0); info->protocol=0; } else{ armci_wait_for_blocking_scatter(); FREE_SEND_BUFFER(msginfo); } if(DEBUG_){ printf("%d(c) : finished polling for scatter_recv\n",armci_me); fflush(stdout); } return 0; } #endif #if (defined(ALLOW_PIN) || defined(LAPI2)) && !defined(HAS_RDMA_GET) /*\ client version of remote strided get \*/ int armci_rem_get(int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle,void *mhloc,void *mhrem) { char *buf, *buf0; request_header_t *msginfo; int i, bytes; void *rem_ptr; int *rem_stride_arr; int bufsize = sizeof(request_header_t); /* calculate size of the buffer needed */ for(i=0, bytes=1;i<=stride_levels;i++)bytes*=count[i]; bufsize += sizeof(void*)+2*sizeof(int)*(stride_levels+1) +2*sizeof(double) + 16; /* +scale+alignment */ #ifdef VAPI /*need to send the rkey and lkey*/ /* lkey and rkey are unsigned its, but we cant trust it to stay like that*/ # ifdef OPENIB bufsize +=(sizeof(uint32_t)+sizeof(uint32_t)); # else bufsize +=(sizeof(VAPI_lkey_t)+sizeof(VAPI_rkey_t)); # endif #endif buf = buf0= GET_SEND_BUFFER(bufsize,GET,proc); if(nb_handle){ INIT_SENDBUF_INFO(nb_handle,buf,op,proc); _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } msginfo = (request_header_t*)buf; buf += sizeof(request_header_t); rem_ptr = src_ptr; rem_stride_arr = src_stride_arr; /*this function fills the dscr into buf and also moves the buf ptr to the end of the dscr*/ armci_save_strided_dscr(&buf,rem_ptr,rem_stride_arr,count,stride_levels,0); /* to bypass the client MessageSnd buffer in get we need to add source pointer and stride info - server will put data directly there */ ADDBUF(buf,void*,dst_ptr); #ifdef VAPI #ifdef OPENIB ADDBUF(buf,uint32_t,((ARMCI_MEMHDL_T *)mhloc)->rkey); ADDBUF(buf,uint32_t,((ARMCI_MEMHDL_T *)mhrem)->lkey); #else ADDBUF(buf,VAPI_rkey_t,((ARMCI_MEMHDL_T *)mhloc)->rkey); ADDBUF(buf,VAPI_lkey_t,((ARMCI_MEMHDL_T *)mhrem)->lkey); #endif #endif for(i=0;ibypass=1; msginfo->pinned=1; msginfo->from = armci_me; msginfo->to = proc; msginfo->format = STRIDED; msginfo->operation = GET; msginfo->ehlen = 0; msginfo->datalen=0; msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->bytes = msginfo->dscrlen; #if defined(GM) || defined(VAPI) || defined(QUADRICS) /* prepare for set the stamp at the end of the user buffer */ if(count[0]dscrlen - msginfo->ehlen); #if 0 if(msginfo->ehlen)printf("%d:server from=%d len=%d: ptr=%p val=%d\n",armci_me,msginfo->from, msginfo->ehlen,h->ptr,h->val); fflush(stdout); #endif flag = (int*)(h->ptr); *flag = h->val; } void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen) { int buf_stride_arr[MAX_STRIDE_LEVEL+1]; int *loc_stride_arr,slen; int *count, stride_levels; void *buf_ptr, *loc_ptr; void *scale; char *dscr_save = dscr; int rc, i,proc; # if defined(CLIENT_BUF_BYPASS) || defined(LAPI2) int *client_stride_arr=0; void *client_ptr=0; # endif /*return if using readv/socket for put*/ if(msginfo->operation==PUT && msginfo->datalen==0){ if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr, buf, buflen); return; } /* unpack descriptor record */ loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; /* compute stride array for buffer */ buf_stride_arr[0]=count[0]; for(i=0; i< stride_levels; i++) buf_stride_arr[i+1]= buf_stride_arr[i]*count[i+1]; # if defined(CLIENT_BUF_BYPASS) || defined(LAPI2) if(msginfo->bypass){ dscr += (1+stride_levels)*sizeof(int); /* move past count */ GETBUF(dscr,void*,client_ptr); client_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); } # endif /* get scale for accumulate, adjust buf to point to data */ switch(msginfo->operation){ case ARMCI_ACC_INT: slen = sizeof(int); break; case ARMCI_ACC_DCP: slen = 2*sizeof(double); break; case ARMCI_ACC_DBL: slen = sizeof(double); break; case ARMCI_ACC_CPL: slen = 2*sizeof(float); break; case ARMCI_ACC_FLT: slen = sizeof(float); break; case ARMCI_ACC_LNG: slen = sizeof(long); break; default: slen=0; } scale = dscr_save+ (msginfo->dscrlen - slen -msginfo->ehlen); /* if(ARMCI_ACC(msginfo->operation)) fprintf(stderr,"%d in server len=%d slen=%d alpha=%f data=%f\n", armci_me, msginfo->dscrlen, slen, *(double*)scale,*(double*)buf); */ buf_ptr = buf; /* data in buffer */ proc = msginfo->to; if(msginfo->operation == GET){ # if defined(CLIENT_BUF_BYPASS) || defined(LAPI2) || defined(VAPI) /* This path was not updated */ if(msginfo->bypass){ armci_send_strided_data_bypass(proc, msginfo, buf, buflen, loc_ptr, loc_stride_arr, client_ptr, client_stride_arr, count, stride_levels); }else # endif /* send tag followed by the actual message */ #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif armci_send_strided_data(proc, msginfo, buf, loc_ptr, stride_levels, loc_stride_arr, count); /* fprintf(stderr, "GET response sent with tag: %d\n, msginfo->tag", msginfo->tag); */ /* TBD:alternatively could include tag into strided message or pack */ } else{ #ifdef PIPE_BUFSIZE if((msginfo->bytes==0) && (msginfo->operation==PUT)){ armci_pipe_prep_receive_strided(msginfo,buf_ptr,stride_levels, loc_stride_arr, count, buflen); armci_pipe_receive_strided(msginfo,loc_ptr,loc_stride_arr, count, stride_levels); } else #endif { #if defined(PUT_NO_SRV_COPY) ARMCI_MEMHDL_T *mhloc; int nsegs; nsegs = 1; for(i=0; ioperation==PUT && msginfo->format==STRIDED && !msginfo->pinned && get_armci_region_local_hndl(loc_ptr,armci_clus_id(armci_me),&mhloc) && !msginfo->tag.imm_msg) { /*do nothing; data movement done done in pbuf_start_get().*/ } else #endif if((rc = armci_op_strided(msginfo->operation, scale, proc, buf_ptr, buf_stride_arr, loc_ptr, loc_stride_arr, count, stride_levels, 1,NULL))) armci_die("server_strided: op from buf failed",rc); } } if(msginfo->ehlen) /* process extra header if available */ armci_process_extheader(msginfo, dscr_save, buf, buflen); } #if ARMCI_ENABLE_GPC_CALLS && (defined(LAPI) || defined(GM) || defined(VAPI) || defined(DOELAN4) || defined(SOCKETS)) static int gpc_call_process( request_header_t *msginfo, int len, char *dscr, char* buf, int buflen, char *sbuf); #endif void armci_server_vector( request_header_t *msginfo, char *dscr, char* buf, int buflen) { int proc; long len; void *scale; int i,s; char *sbuf = buf; if(msginfo->operation==PUT && msginfo->datalen==0)return;/*return if using readv/socket for put*/ /* unpack descriptor record */ GETBUF(dscr, long ,len); /* get scale for accumulate, adjust buf to point to data */ scale = buf; switch(msginfo->operation){ case ARMCI_ACC_INT: buf += sizeof(int); break; case ARMCI_ACC_DCP: buf += 2*sizeof(double); break; case ARMCI_ACC_DBL: buf += sizeof(double); break; case ARMCI_ACC_CPL: buf += 2*sizeof(float); break; case ARMCI_ACC_FLT: buf += sizeof(float); break; } proc = msginfo->to; /*fprintf(stderr,"scale=%f\n",*(double*)scale);*/ /* execute the operation */ switch(msginfo->operation) { case GET: /* fprintf(stderr, "%d:: Got a vector message!!\n", armci_me); */ if(msginfo->ehlen) { #if ARMCI_ENABLE_GPC_CALLS && (defined(LAPI) || defined(GM) || defined(VAPI) || defined(DOELAN4)) gpc_call_process(msginfo, len, dscr, buf, buflen, sbuf); #else armci_die("Unexpected vector message with non-zero ehlen. GPC call?", msginfo->ehlen); #endif } else { for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); /* fprintf(stderr,"len=%d bytes=%d parlen=%d\n",len,bytes,parlen);*/ ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ armci_copy(ptr[s], buf, bytes); buf += bytes; } } /* send tag followed by the actual message */ #ifdef SOCKETS armci_sock_send(msginfo->from, &(msginfo->tag), sizeof(msg_tag_t)); #endif /* fprintf(stderr,"%d:: VECTOR GET. server sending buffer %p datalen=%d\n",armci_me, sbuf, msginfo->datalen); */ armci_send_data(msginfo, sbuf); } break; case PUT: /* fprintf(stderr,"received in buffer %f\n",*(double*)buf);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); for(s=0; s< parlen; s++){ /* armci_copy(buf, ptr[s], bytes); */ bcopy(buf, ptr[s], (size_t)bytes); buf += bytes; } } break; default: /* this should be accumulate */ if(!ARMCI_ACC(msginfo->operation)) armci_die("v server: wrong op code",msginfo->operation); /* fprintf(stderr,"received first=%f last =%f in buffer\n",*/ /* *((double*)buf),((double*)buf)[99]);*/ for(i = 0; i< len; i++){ int parlen, bytes; void **ptr; GETBUF(dscr, int, parlen); GETBUF(dscr, int, bytes); ptr = (void**)dscr; dscr += parlen*sizeof(char*); armci_lockmem_scatter(ptr, parlen, bytes, proc); for(s=0; s< parlen; s++){ armci_acc_2D(msginfo->operation, scale, proc, buf, ptr[s], bytes, 1, bytes, bytes, 0); buf += bytes; } ARMCI_UNLOCKMEM(proc); } } } /**Routines for GPC calls**/ /**Server side routine to handle a GPC call request**/ /*===============Register this memory=====================*/ #if ARMCI_ENABLE_GPC_CALLS #if defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS) gpc_buf_t *gpc_req; /*VT: I made the change below because DATA_SERVER is not defined for elan4 *VT: This will only be invoked in case of GPC call and should not intefere *VT: with any other call */ #if (defined(DOELAN4) || defined(DATA_SERVER)) && defined(SERVER_THREAD) # ifdef PTHREADS pthread_t data_server; # else # error Threading other than pthreads not yet implemented # endif #endif #if defined(LAPI) pthread_t data_server; #endif void block_thread_signal(int signo) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGUSR1); pthread_sigmask(SIG_BLOCK, &mask, NULL); } void unblock_thread_signal(int signo) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGUSR1); pthread_sigmask(SIG_UNBLOCK, &mask, NULL); } void gpc_init() { int i; for(i=0; ihndl, gpc_req[i].msginfo.to, gpc_req[i].msginfo.from, gcall->hdr, gcall->hlen, gcall->data, gcall->dlen, gcall->rhdr, gcall->rhlen, gcall->rdata, gcall->rdlen, GPC_PROBE) == GPC_DONE) { armci_send_data(&gpc_req[i].msginfo, gpc_req[i].reply); gpc_free_buf_handle(i); } } } void gpc_completion_handler(int sig) { if(sig != SIGUSR1) armci_die("gpc_completion_handler. Invoked with unexpected signal", sig); if(!pthread_equal(pthread_self(), data_server)) armci_die("Signal in a thread other than the data server!!!", sig); /* fprintf(stderr, "%d::SIGNAL\n", armci_me); */ gpc_completion_scan(); } void gpc_init_signals() { struct sigaction action; /*register signal handler**/ action.sa_handler = gpc_completion_handler; sigemptyset(&action.sa_mask); action.sa_flags = SA_RESTART; sigaction(SIGUSR1, &action, NULL); /*Block the GPC completion signal. data server unblocks it later for itself*/ /* block_thread_signal(SIGUSR1); */ #if 0 /*Mask this signal on main thread. Should only execute in the context of the data server.*/ if(pthread_self() == armci_usr_tid) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGUSR1); pthread_sigmask(SIG_BLOCK, &mask, NULL); } #endif } int gpc_get_buf_handle() { int i; gpc_call_t *gcall; for(i=0; ihndl, gpc_req[i].msginfo.to, gpc_req[i].msginfo.from, gcall->hdr, gcall->hlen, gcall->data, gcall->dlen, gcall->rhdr, gcall->rhlen, gcall->rdata, gcall->rdlen, GPC_WAIT) != GPC_DONE) armci_die("Wait on GPC call completion failed", 0); armci_send_data(&gpc_req[i].msginfo, gpc_req[i].reply); gpc_free_buf_handle(i); } gpc_req[i].active = 1; return i; } static int gpc_call_process( request_header_t *msginfo, int len, char *dscr, char* buf, int buflen, char *sbuf) { int h, hlen, dlen, rhlen, rdlen; int parlen; int rbuf; void *hdr, *data, *rhdr, *rdata; gpc_buf_t *gbuf; gpc_call_t *gcall; /*printf("%d:%s dscr=%p buf=%p \n",armci_me,FUNCTION_NAME,dscr,buf);fflush(stdout);*/ GETBUF(dscr, int, parlen); if(parlen != 1) armci_die("gpc_call_process: Invalid parlen in dscr", parlen); GETBUF(dscr, int, rhlen); dscr += parlen*sizeof(char*); GETBUF(dscr, int, parlen); if(parlen != 1) armci_die("gpc_call_process: Invalid parlen in dscr", parlen); GETBUF(dscr, int, rdlen); dscr += parlen*sizeof(char *); GETBUF(dscr, int, h); GETBUF(dscr, int, hlen); hdr = dscr; dscr += hlen; GETBUF(dscr, int, dlen); data = dscr; dscr += dlen; rhdr = buf; rdata = (char *)rhdr + rhlen; rbuf = gpc_get_buf_handle(); gbuf = &gpc_req[rbuf]; gbuf->msginfo = *msginfo; gbuf->call.hndl = h; gbuf->call.hlen = hlen; gbuf->call.dlen = dlen; gbuf->call.rhlen = rhlen; gbuf->call.rdlen = rdlen; gbuf->call.hdr = gbuf->send; gbuf->call.data = gbuf->send + hlen; bcopy(hdr, gbuf->call.hdr, gbuf->call.hlen); bcopy(data, gbuf->call.data, gbuf->call.dlen); gbuf->call.rhdr = gbuf->reply; gbuf->call.rdata = gbuf->reply + rhlen; gcall = &gbuf->call; if(armci_gpc_local_exec(gcall->hndl, gbuf->msginfo.to, gbuf->msginfo.from, gcall->hdr, gcall->hlen, gcall->data, gcall->dlen, gcall->rhdr, gcall->rhlen, gcall->rdata, gcall->rdlen, GPC_INIT) == GPC_DONE) { armci_send_data(msginfo, gbuf->reply); gpc_free_buf_handle(rbuf); } return 0; } /*Based on armci_rem_vector. On the server side, a vector GET request with a non-zero ehlen is a GPC call*/ int armci_rem_gpc(int op, armci_giov_t darr[],int len, gpc_send_t *send, int proc, int flag, armci_ihdl_t nb_handle) { char *buf, *buf0; request_header_t *msginfo; int bytes =0, s/*, slen=0*/; size_t adr; int bufsize = sizeof(request_header_t),isnonblocking=0; int send_len=0, i; void *ptr; if(nb_handle)isnonblocking=1; if(len != 2) armci_die("armci_rem_gpc: invalid len parameter", len); /* compute size of the buffer needed */ for(s=0; shlen + send->dlen; bufsize += bytes + sizeof(long) + send_len + 2*sizeof(double) + sizeof(double) + 8; /*+scale+allignment*/ #if defined(USE_SOCKET_VECTOR_API) if(flag){ int totaliovecs=MAX_IOVEC; /*if(op==PUT)*/bufsize-=bytes; buf = buf0= GET_SEND_BUFFER((bufsize+sizeof(struct iovec)*totaliovecs),op,proc); } else #endif { buf = buf0= GET_SEND_BUFFER(bufsize,op,proc); } msginfo = (request_header_t*)buf; bzero(msginfo,sizeof(request_header_t)); if(nb_handle){ INIT_SENDBUF_INFO(nb_handle,buf,op,proc); _armci_buf_set_tag(buf,nb_handle->tag,0); if(nb_handle->bufid == NB_NONE) armci_set_nbhandle_bufid(nb_handle,buf,0); } buf += sizeof(request_header_t); /* fill vector descriptor */ armci_save_vector_dscr(&buf,darr,len,op,0); /* add data to send*/ ptr = buf; ADDBUF(ptr, int, send->hndl); ADDBUF(ptr, int, send->hlen); bcopy(send->hdr, ptr, send->hlen); /* armci_copy? */ ptr += send->hlen; ADDBUF(ptr, int, send->dlen); bcopy(send->data, ptr, send->dlen); /* armci_copy? */ i = send_len%8; send_len += 8-i; buf += send_len; /*Dummy non-zero extended header to identify a GPC call*/ buf += sizeof(double); msginfo->ehlen = sizeof(double); /* fill message header */ msginfo->dscrlen = buf - buf0 - sizeof(request_header_t); msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = op; msginfo->format = VECTOR; msginfo->datalen = bytes; msginfo->bytes = msginfo->datalen+msginfo->dscrlen; #if defined(USE_SOCKET_VECTOR_API) if(flag&&(op==GET||op==PUT)){ armci_direct_vector(msginfo,darr,len,proc); return 0; } #endif /* #ifdef VAPI */ /* if(op == GET) { */ /* if(msginfo->dscrlen < (bytes - sizeof(int))) */ /* *(int*)(((char*)(msginfo+1))+(bytes-sizeof(int))) = ARMCI_STAMP; */ /* else */ /* *(int*)(((char*)(msginfo+1))+(msginfo->dscrlen+bytes-sizeof(int))) = ARMCI_STAMP; */ /* } */ /* #endif */ armci_send_req(proc, msginfo, bufsize); if (nb_handle && op==GET) armci_save_vector_dscr(&buf0,darr,len,op,1); if (op == GET # if !defined(SOCKETS) && !nb_handle # endif ){ armci_complete_vector_get(darr,len,msginfo); } return 0; } #else /*Empty functions to let unsupported hardware smoothly pass through initialization*/ void gpc_init(void) {} void gpc_init_signals(void) {} #endif #endif ga-5-4/armci/src/common/clusterinfo.c0000644000175000017500000003310212662210413015677 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /****************************************************************************** * file: clusterinfo.c * purpose: Determine cluster info i.e., number of machines and processes * running on each of them. * *******************************************************************************/ #if HAVE_STRING_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINSOCK_H # include /* this is where gethostbyname is declared */ #endif #include "message.h" #include "armcip.h" /* NO_SHMEM enables to simulate cluster environment on a single workstation. * Must define NO_SHMMAX_SEARCH in shmem.c to prevent depleting shared memory * due to a gready shmem request by the master process on cluster node 0. */ #if defined(DECOSF) && defined(QUADRICS) # if !defined(REGION_ALLOC) # define NO_SHMEM extern int armci_enable_alpha_hack(); # endif #else # define armci_enable_alpha_hack() 1 #endif #define DEBUG 0 #define MAX_HOSTNAME 80 #define CHECK_NODE_NAMES /* print info on how many cluster nodes detected */ #ifdef CLUSTER # define PRINT_CLUSTER_INFO 0 #else # define PRINT_CLUSTER_INFO 0 #endif #if defined(OPENIB) static const char *network_protocol="OpenIB Verbs API"; #elif defined(PM) static const char *network_protocol="Score PM"; #elif defined(MPI_MT) static const char *network_protocol="MPI-MT"; #elif defined(MPI_SPAWN) static const char *network_protocol="MPI-SPAWN"; #else static const char *network_protocol="TCP/IP Sockets"; #endif /*** stores cluster configuration. Initialized before user threads are created and then read-only ***/ armci_clus_t *armci_clus_info; #ifdef HITACHI #include # define GETHOSTNAME sr_gethostname ndes_t _armci_group; static int sr_gethostname(char *name, int len) { int no; pid_t ppid; if(hmpp_nself (&_armci_group,&no,&ppid,0,NULL) <0) return -1; if(len<6)armci_die("len too small",len); if(no>1024)armci_die("expected node id <1024",no); sprintf(name,"n%d",no); return 0; } #elif defined(SGIALTIX) # define GETHOSTNAME altix_gethostname static int altix_gethostname(char *name, int len) { sprintf(name,"altix"); return 0; } #elif defined(CRAY_XT) /* && !defined(PORTALS) */ #define GETHOSTNAME cnos_gethostname static int cnos_gethostname(char *name, int len) { int size,rank; size=PMI_Get_rank(&rank); sprintf(name,"%d",rank); } #else # define GETHOSTNAME gethostname #endif static char* merge_names(char *name) { int jump = 1, rem, to, from; int lenmes, lenbuf, curlen, totbuflen= armci_nproc*HOSTNAME_LEN; int len = strlen(name); char *work = malloc(totbuflen); if(!work)armci_die("armci: merge_names: malloc failed: ",totbuflen); strcpy(work, name); curlen = len+1; /* prefix tree merges names in the order of process numbering in log(P)time * result = name_1//name_2//...//name_P-1 */ do { jump *= 2; rem = armci_me%jump; if(rem){ to = armci_me - rem; armci_msg_snd(ARMCI_TAG, work, curlen, to); break; }else{ from = armci_me + jump/2; if(from < armci_nproc){ lenbuf = totbuflen - curlen; armci_msg_rcv(ARMCI_TAG, work+curlen, lenbuf, &lenmes, from); curlen += lenmes; } } }while (jump < armci_nproc); return(work); } static void process_hostlist(char *names) { #ifdef CLUSTER int i, cluster=0; char *s,*master; int len, root=0; /******** inspect list of machine names to determine locality ********/ if (armci_me==0){ /* first find out how many cluster nodes we got */ armci_nclus =1; s=master=names; for(i=1; i < armci_nproc; i++){ s += strlen(s)+1; if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_nclus++; /*fprintf(stderr,"new name %s len =%d\n",master, strlen(master));*/ } } /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info) armci_die("malloc failed for clusinfo",armci_nclus); /* fill the data structure -- go through the list again */ s=names; master="*-"; /* impossible hostname */ cluster =0; for(i=0; i < armci_nproc; i++){ if(strcmp(s,master)){ /* we found a new machine name on the list */ master = s; armci_clus_info[cluster].nslave=1; armci_clus_info[cluster].master=i; strcpy(armci_clus_info[cluster].hostname, master); #ifdef CHECK_NODE_NAMES /* need consecutive task id allocated on the same node * the current test only compares hostnames against first cluster */ if(cluster) if(!strcmp(master,armci_clus_info[0].hostname)){ /* we have seen that hostname before */ fprintf(stderr, "ARMCI supports block process mapping only\n"); armci_die("Cannot run: improper task to host mapping!",0); } #endif cluster++; } else{ /* the process is still on the same host */ armci_clus_info[cluster-1].nslave++; } s += strlen(s)+1; } if(armci_nclus != cluster) armci_die("inconsistency processing clusterinfo",armci_nclus); } /******** process 0 got all data ********/ /* now broadcast locality info struct to all processes * two steps are needed because of the unknown length of hostname list */ len = sizeof(int); armci_msg_brdcst(&armci_nclus, len, root); if(armci_me){ /* allocate memory */ armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info) armci_die("malloc failed for clusinfo",armci_nclus); } len = sizeof(armci_clus_t)*armci_nclus; armci_msg_brdcst(armci_clus_info, len, root); /******** all processes 0 got all data ********/ /* now determine current cluster node id by comparing me to master */ armci_clus_me = armci_nclus-1; for(i =0; i< armci_nclus-1; i++) if(armci_me < armci_clus_info[i+1].master){ armci_clus_me=i; break; } #else armci_clus_me=0; armci_nclus=1; armci_clus_info = (armci_clus_t*)malloc(armci_nclus*sizeof(armci_clus_t)); if(!armci_clus_info) armci_die("malloc failed for clusinfo",armci_nclus); strcpy(armci_clus_info[0].hostname, names); armci_clus_info[0].master=0; armci_clus_info[0].nslave=armci_nproc; #endif /* Starting process ID on my node */ armci_clus_first = armci_clus_info[armci_clus_me].master; /* Last process ID on my node */ armci_clus_last = armci_clus_first + armci_clus_info[armci_clus_me].nslave-1; } /*\ Substring Replacement: replace needle with nail in a haystack \*/ static char *substr_replace(char *haystack, char *needle, char *nail) { char *tmp, *pos, *first; size_t len=strlen(needle), nlen=strlen(nail),bytes; size_t left; pos = strstr(haystack,needle); if (pos ==NULL) return NULL; first= tmp = calloc(strlen(haystack)+nlen-len+1+1,1); if(first==NULL) return(NULL); bytes = pos - haystack; while(bytes){ *tmp = *haystack; tmp++; haystack++; bytes--;} while(nlen) { *tmp = *nail; tmp++; nail++; nlen--;} haystack += len; left = strlen(haystack); while(left>0){*tmp = *haystack; tmp++; haystack++; left --;} *tmp='\0'; return(first); } /*\ ARMCI_HOSTNAME_REPLACE contains "needle/nail" string to derive new hostname \*/ static char *new_hostname(char *host) { char *tmp, *needle, *nail; if((tmp =getenv("ARMCI_HOSTNAME_REPLACE"))){ needle = strdup(tmp); if(needle== NULL) return NULL; nail = strchr(needle,'/'); if(nail == NULL) return NULL; *nail = '\0'; nail++; if(nail == (needle+1)){ char* tmp1 = calloc(strlen(host)+strlen(nail)+1,1); if(tmp1 == NULL) return NULL; strcpy(tmp1,host); strcat(tmp1,nail); return tmp1; } return substr_replace(host,needle,nail); } else return NULL; } static void print_clus_info() { int i; if(PRINT_CLUSTER_INFO && armci_nclus > 1 && armci_me ==0){ #if defined(DATA_SERVER) || defined(SERVER_THREAD) || defined(PORTALS) printf("ARMCI configured for %d cluster nodes. Network protocol is '%s'.\n", armci_nclus, network_protocol); #else printf("ARMCI configured for %d cluster nodes\n", armci_nclus); #endif fflush(stdout); } if(armci_me==0 && DEBUG) for(i=0;i= MAX_HOSTNAME) armci_die("armci: hostname too long",strlen(tmp)); strcpy(name,tmp); printf("%d using %s hostname\n",armci_me, name); fflush(stdout); } len = strlen(name); #if ARMCI_ENABLE_GPC_CALLS /*a simple way to run as many servers as compute processes*/ enval = getenv("ARMCI_NSERV_EQ_NPROC"); if(enval != NULL){ sprintf(name+len,"n%d",getpid()); len = strlen(name); printf("\n%s\n",name); } #endif #ifdef HOSTNAME_TRUNCATE { /* in some cases (e.g.,SP) when name is used to determine * cluster structure but not to establish communication * we can truncate hostnames to save memory */ int i; limit = HOSTNAME_LEN-1; for(i=0; i",i+1); } if(len>limit)name[limit]='\0'; len =limit; } #else if(len >= HOSTNAME_LEN-1) armci_die("armci: gethostname overrun name string length",len); #endif #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { name[len]='0'+armci_me; name[len+1]='\0'; len++; } #endif if(DEBUG) fprintf(stderr,"%d: %s len=%d\n",armci_me, name,(int)strlen(name)); #ifdef CLUSTER merged = merge_names(name); /* create hostname list */ process_hostlist(merged); /* compute cluster info */ free(merged); #else process_hostlist(name); /* compute cluster info */ #endif #if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) armci_set_shmem_limit_per_node(armci_clus_info[0].nslave); #endif armci_master = armci_clus_info[armci_clus_me].master; #ifdef NO_SHMEM if(armci_enable_alpha_hack()) { int i; for(i=0;i= armci_nproc) armci_die("armci_clus_id: out of range",p); if (p < armci_clus_first){ from = 0; to = armci_clus_me; } else { from = armci_clus_me; to = armci_nclus; } found = to - 1; /* Binary search algorithm to be implemented, * sequential search for now */ for(c = from; c < to - 1; c++) if (p < armci_clus_info[c+1].master) { found = c; break; } return found; } /*\ return number of processes in the domain represented by id; id<0 means my node \*/ int armci_domain_nprocs(armci_domain_t domain, int id) { if(id >= armci_nclus) armci_die2("armci domain error",id,armci_nclus); /* This is an error condition */ if(id < 0) { fprintf(stderr,"[%d] Returned domain is invalid\n", armci_me); id = armci_clus_me; } return armci_clus_info[id].nslave; } /* return number of nodes in diven domain */ int armci_domain_count(armci_domain_t domain) { return armci_nclus; } /* return domain ID of the specified process */ int armci_domain_id(armci_domain_t domain, int glob_proc_id) { int id = glob_proc_id; if(id <0 || id >= armci_nproc) { armci_die2("armci domain error",id,armci_nproc); } return armci_clus_id(glob_proc_id); } /* return global ID of a process loc_proc_id in domain identified by id * armci_domain_nproc(id)< loc_proc_id >=0 */ int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id) { if(id <0 || id >= armci_nclus) armci_die2("armci domain error",id,armci_nclus); if(loc_proc_id<0 || loc_proc_id>= armci_clus_info[id].nslave) armci_die2("armci domain proc error", loc_proc_id,armci_clus_info[id].nslave); return (armci_clus_info[id].master + loc_proc_id); } /* return ID of domain that the calling process belongs to */ int armci_domain_my_id(armci_domain_t domain) { return armci_clus_me; } /* Check whether the oricess is in the same domain */ int armci_domain_same_id (armci_domain_t domain, int proc) { int rc = SAMECLUSNODE(proc); return rc; } ga-5-4/armci/src/common/armci.c0000644000175000017500000006336512662210413014453 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #define EXTERN /*#define PRINT_BT*/ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDARG_H # include #endif #if defined(CRAY) && !defined(__crayx1) # include # include # if HAVE_UNISTD_H # include # endif #endif #ifdef LAPI # include "lapidefs.h" #endif #if HAVE_ERRNO_H # include #endif #include "armcip.h" #include "copy.h" #include "memlock.h" #include "armci_shmem.h" #include "signaltrap.h" #ifdef ARMCIX #include "armcix.h" #endif #ifdef BGML #include "bgml.h" #if HAVE_ASSERT_H # include #endif #include "bgmldefs.h" extern void armci_msg_barrier(void); #endif #ifdef CRAY_SHMEM # ifdef CRAY_XT # include # else # include # endif #endif /* global variables -- Initialized in PARMCI_Init() and never modified*/ int armci_me, armci_nproc; int armci_clus_me, armci_nclus, armci_master; int armci_clus_first, armci_clus_last; int _armci_initialized=0; int _armci_initialized_args=0; int _armci_terminating =0; int *_armci_argc=NULL; char ***_armci_argv=NULL; thread_id_t armci_usr_tid; #if !defined(HITACHI) && !defined(THREAD_SAFE) double armci_internal_buffer[BUFSIZE_DBL]; #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) || defined(HITACHI) || defined(CATAMOUNT) || defined(BGML) # include "locks.h" lockset_t lockid; #endif #ifdef ALLOW_PIN int* armci_prot_switch_fence=NULL; int armci_prot_switch_preproc = -1; int armci_prot_switch_preop = -1; #endif #ifdef BGML /* void armci_allocate_locks(); */ void armci_init_memlock(); #endif typedef struct{ int sent; int received; int waited; }armci_notify_t; armci_notify_t **_armci_notify_arr; #ifdef CRAY_XT int _armci_malloc_local_region; #endif void ARMCI_Cleanup() { #if (defined(SYSV) || defined(WIN32) || defined(MMAP))&& !defined(HITACHI) Delete_All_Regions(); if(armci_nproc>1) #if !defined(LAPI) DeleteLocks(lockid); #endif /* in case of an error notify server that it is time to quit */ #if defined(DATA_SERVER) if(armci_nclus >1){ /* send quit request to server unless it is already dead */ armci_wait_for_server(); armci_transport_cleanup(); } #endif armci_finalize_fence(); #ifndef WIN32 ARMCI_RestoreSignals(); #endif #endif } void armci_notify_init() { int rc, bytes= sizeof(armci_notify_t)*armci_nproc; _armci_notify_arr= (armci_notify_t**)malloc(armci_nproc*sizeof(armci_notify_t*)); if(!_armci_notify_arr)armci_die("armci_notify_ini:malloc failed",armci_nproc); if((rc=PARMCI_Malloc((void **)_armci_notify_arr, bytes))) armci_die(" armci_notify_init: armci_malloc failed",bytes); bzero(_armci_notify_arr[armci_me], bytes); } static void armci_perror_msg() { char perr_str[80]; if(!errno) return; sprintf(perr_str,"Last System Error Message from Task %d:",armci_me); perror(perr_str); } #if defined(IBM) || defined(IBM64) int AR_caught_sigint; int AR_caught_sigterm; #else extern int AR_caught_sigint; extern int AR_caught_sigterm; #endif void armci_abort(int code) { #if !defined(BGML) armci_perror_msg(); #endif ARMCI_Cleanup(); /* data server process cannot use message-passing library to abort * it simply exits, parent will get SIGCHLD and abort the program */ #if defined(IBM) || defined(IBM64) /* hack for a problem in POE signal handlers in non-LAPI MPI */ if(AR_caught_sigint || AR_caught_sigterm) _exit(1); #endif #if defined(DATA_SERVER) if(armci_me<0) _exit(1); else #endif armci_msg_abort(code); } /*For now, until no code requires a function pointer to ARMCI_Error (used by GA now).*/ void ARMCI_Error(char *msg, int code) { armci_die(msg,code); } void armci_allocate_locks() { /* note that if ELAN_ACC is defined the scope of locks is limited to SMP */ #if !defined(CRAY_SHMEM) && \ ( defined(HITACHI) || defined(CATAMOUNT) || \ (defined(QUADRICS) && defined(_ELAN_LOCK_H) && !defined(ELAN_ACC)) ) armcill_allocate_locks(NUM_LOCKS); #elif (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) if(armci_nproc == 1)return; # if defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) CreateInitLocks(NUM_LOCKS, &lockid); # else if(armci_master==armci_me)CreateInitLocks(NUM_LOCKS, &lockid); armci_msg_clus_brdcst(&lockid, sizeof(lockid)); if(armci_master != armci_me)InitLocks(NUM_LOCKS, lockid); # endif #endif } void ARMCI_Set_shm_limit(unsigned long shmemlimit) { #if (defined(SYSV) || defined(WIN32) || defined(MMAP)) && !defined(HITACHI) #define EXTRASHM 1024 /* extra shmem used internally in ARMCI */ unsigned long limit; limit = shmemlimit+EXTRASHM; armci_set_shmem_limit_per_core(limit); #endif } /*\ allocate and initialize memory locking data structure \*/ void armci_init_memlock() { int bytes = MAX_SLOTS*sizeof(memlock_t); int rc, msize_per_proc=bytes; #ifdef MEMLOCK_SHMEM_FLAG /* last proc on node allocates memlock flag in shmem */ if(armci_clus_last == armci_me) bytes += sizeof(int); #endif memlock_table_array = malloc(armci_nproc*sizeof(void*)); if(!memlock_table_array) armci_die("malloc failed for ARMCI lock array",0); rc = PARMCI_Malloc(memlock_table_array, bytes); if(rc) armci_die("failed to allocate ARMCI memlock array",rc); armci_msg_barrier(); bzero(memlock_table_array[armci_me],bytes); #ifdef BGML bgml_init_locks ((void *) memlock_table_array[armci_me]); #elif ARMCIX ARMCIX_init_memlock ((memlock_t *) memlock_table_array[armci_me]); #endif #ifdef MEMLOCK_SHMEM_FLAG /* armci_use_memlock_table is a pointer to local memory variable=1 * we overwrite the pointer with address of shared memory variable * armci_use_memlock_table and initialize it >0 */ armci_use_memlock_table = (int*) (msize_per_proc + (char*) memlock_table_array[armci_clus_last]); /* printf("%d: last=%d bytes=%d ptr =(%d, %d)\n", armci_me,armci_clus_last,bytes,armci_use_memlock_table, memlock_table_array[armci_clus_last]); fflush(stdout); */ if(armci_clus_last == armci_me) *armci_use_memlock_table =1+armci_me; #endif armci_msg_barrier(); } #if defined(SYSV) || defined(WIN32) || defined(MMAP) # if defined(QUADRICS) && !defined(NO_SHM) static void armci_check_shmmax() { long mylimit, limit; mylimit = limit = (long) armci_max_region(); armci_msg_bcast_scope(SCOPE_MASTERS, &limit, sizeof(long), 0); if(mylimit != limit){ printf("%d:Shared mem limit in ARMCI is %ld bytes on node %s vs %ld on %s\n", armci_me,mylimit<<10,armci_clus_info[armci_clus_me].hostname, limit<<10, armci_clus_info[0].hostname); fflush(stdout); sleep(1); armci_die("All nodes must have the same SHMMAX limit if NO_SHM is not defined",0); } } # endif #endif extern void armci_region_shm_malloc(void *ptr_arr[], size_t bytes); #ifdef ENABLE_CHECKPOINT int armci_ft_spare_procs; void armci_set_spare_procs(int spare) { armci_ft_spare_procs = spare; } ARMCI_Group armci_ft_group; ARMCI_Group *ARMCI_Get_ft_group() { return(&armci_ft_group); } void armci_create_ft_group() { int i, list[MAX_PROC]; for(i=0;i0) return 0; dassertp(1,sizeof(armci_ireq_t) <= sizeof(armci_hdl_t), ("nb handle sizes: internal(%d) should be <= external(%d)\n", sizeof(armci_ireq_t), sizeof(armci_hdl_t))); /* let's hope that the message passing environment was initialized outside * of ARMCI such that passing NULL for argc/argv here is okay */ armci_msg_init(NULL, NULL); #ifdef MPI_SPAWN if(!_armci_initialized_args) armci_die("ARMCI is built w/ ARMCI_NETWORK=MPI-SPAWN. For this network " "setting, ARMCI must be initialized with PARMCI_Init_args() " "instead of PARMCI_Init(). Please replace PARMCI_Init() " " with PARMCI_Init_args(&argc, &argv) as in the API docs", 0L); #endif #if defined(MPI_MT) || defined(DCMF) { int provided; MPI_Query_thread(&provided); if (provided == MPI_THREAD_SINGLE) { armci_die("ARMCI is built w/ ARMCI_NETWORK=MPI_MT but the " "provided MPI threading level is MPI_THREAD_SINGLE " " not MPI_THREAD_MULTIPLE", 1); } else if (provided == MPI_THREAD_FUNNELED) { armci_die("ARMCI is built w/ ARMCI_NETWORK=MPI_MT but the " "provided MPI threading level is MPI_THREAD_FUNNELED " " not MPI_THREAD_MULTIPLE", 1); } else if (provided == MPI_THREAD_SERIALIZED) { armci_die("ARMCI is built w/ ARMCI_NETWORK=MPI_MT but the " "provided MPI threading level is MPI_THREAD_SERIALIZED " " not MPI_THREAD_MULTIPLE", 1); } else if (provided == MPI_THREAD_MULTIPLE) { } } #endif #ifdef BGML BGML_Messager_Init(); BG1S_Configuration_t config; config=BG1S_Configure(NULL); config.consistency= BG1S_ConsistencyModel_Weak; BG1S_Configure(&config); unsigned long long available = BGML_Messager_available(); if (available & BGML_MESSAGER_GI) bgml_barrier = (BGML_Barrier) BGGI_Barrier; else bgml_barrier = (BGML_Barrier) BGTr_Barrier; #endif #ifdef ARMCIX ARMCIX_Init (); #endif armci_nproc = armci_msg_nproc(); armci_me = armci_msg_me(); armci_usr_tid = THREAD_ID_SELF(); /*remember the main user thread id */ #if defined(THREAD_SAFE) armci_init_threads(); th_idx = ARMCI_THREAD_IDX; if (th_idx) printf("WARNING: PARMCI_Init is called from thread %d, should be 0\n",th_idx); #endif #ifdef _CRAYMPP cmpl_proc=-1; #endif #ifdef LAPI # ifdef AIX { char *tmp1 = getenv("RT_GRQ"), *tmp2 = getenv("AIXTHREAD_SCOPE"); if(tmp1 == NULL || strcmp((const char *)tmp1,"ON")) armci_die("Armci_Init: environment variable RT_GRQ not set. It should be set as RT_GRQ=ON, to restore original thread scheduling LAPI relies upon",0); if(tmp2 == NULL || strcmp((const char *)tmp2,"S")) armci_die("Armci_Init: environment variable AIXTHREAD_SCOPE=S should be set to assure correct operation of LAPI", 0); } # endif armci_init_lapi(); #endif #ifdef PORTALS armci_init_portals(); shmem_init(); #endif #ifdef CRAY_SHMEM shmem_init(); #endif armci_init_clusinfo(); #ifdef MSG_COMMS_MPI armci_group_init(); #endif armci_krmalloc_init_localmem(); #ifndef BLRTS /* trap signals to cleanup ARMCI system resources in case of crash */ if(armci_me == armci_master) { ARMCI_ParentTrapSignals(); } ARMCI_ChildrenTrapSignals(); #endif #if defined(SYSV) || defined(WIN32) || defined(MMAP) /* init shared/K&R memory */ if(ARMCI_Uses_shm() ) { # ifdef SGIALTIX armci_altix_shm_init(); # else armci_shmem_init(); # endif } # if defined(QUADRICS) && !defined(NO_SHM) if(armci_me == armci_master)armci_check_shmmax(); # endif #endif #ifdef REGION_ALLOC { void* test_ptr_arr = malloc(sizeof(void *)*MAX_PROC); dassert(1,test_ptr_arr); PARMCI_Malloc(test_ptr_arr,256*1024*1024); PARMCI_Free(test_ptr_arr[armci_me]); free(test_ptr_arr); } #endif #ifdef MULTI_CTX /* this is a hack for the Elan-3 multi-tiled memory (qsnetlibs v 1.4.10) * we need to allocate and then free memory to satisfy libelan requirements * for symmetric memory addresses */ if(armci_nclus >1){ int segments, segsize, seg; void **addr; armci_nattach_preallocate_info(&segments, &segsize); segsize -= 1024*1024; /* leave some for the K&RM headers */ if(armci_me!=armci_master)segsize=0; /* only one allocates mem on node*/ addr = (void*) malloc(segments*armci_nproc*sizeof(void*)); if(!addr)armci_die("armci_init:addr malloc failed",segments*armci_nproc); for(seg=0; seg< segments; seg++) /* allocate segments */ if(PARMCI_Malloc(addr+armci_nproc*seg,segsize)) armci_die("problem in Elan-3 mem preallocation",seg); for(seg=0; seg< segments; seg++) /* return to free pool */ if(armci_me==armci_master) if(PARMCI_Free(*(addr+armci_nproc*seg+armci_me))) armci_die("problem in Elan-3 mem preallocation - free stage",seg); free(addr); #if 0 if(armci_me==armci_master){ printf("%d:preallocated %d segments %d bytes each\n",armci_me, segments, segsize); fflush(stdout); } #endif } #endif /* allocate locks: we need to do it before server is started */ armci_allocate_locks(); armci_init_fence(); #if ARMCI_ENABLE_GPC_CALLS gpc_init_signals(); #endif #ifdef ALLOW_PIN armci_prot_switch_fence = malloc(sizeof(int*)*armci_nproc); armci_prot_switch_preproc = -1; armci_prot_switch_preop = -1; #endif /* NOTE: FOR PROCESS-BASED DATA SERVER WE CANNOT call PARMCI_Malloc yet */ # if defined(DATA_SERVER) if(armci_nclus >1) armci_start_server(); # endif #if defined(GM) || defined(VAPI) || defined(PORTALS) || (defined(LAPI) && defined(LAPI_RDMA)) /* initialize registration of memory */ armci_region_init(); #endif armci_msg_barrier(); armci_init_memlock(); /* allocate data struct for locking memory areas */ #if !defined(GM) armci_notify_init(); #endif armci_msg_barrier(); armci_msg_gop_init(); _armci_initialized=1; #ifdef ENABLE_CHECKPOINT armci_init_checkpoint(armci_ft_spare_procs); #endif #ifdef MPI_MT _armci_test_connections(); #else uval = getenv("ARMCI_TEST_CONNECTIONS"); if(uval!=NULL) { _armci_test_connections(); } #endif #if MSG_COMMS_TCGMSGMPI install_nxtval(NULL, NULL); #endif return 0; } /* ARMCI Finalize is called multiple times, if both GA and TCGMSG are used * */ void PARMCI_Finalize() { if(_armci_initialized <= 0 ) { return; } _armci_initialized = 0; _armci_terminating =1; _armci_initialized_args=0; _armci_argc = NULL; _armci_argv = NULL; armci_msg_barrier(); if(armci_me==armci_master) ARMCI_ParentRestoreSignals(); #if defined(DATA_SERVER) if(armci_nclus >1){ armci_wait_for_server(); armci_msg_barrier(); } #endif #ifdef PORTALS armci_fini_portals(); #endif #ifdef LAPI armci_term_lapi(); #endif #ifdef ALLOW_PIN free(armci_prot_switch_fence); #endif armci_msg_gop_finalize(); ARMCI_Cleanup(); armci_msg_barrier(); #ifdef MSG_COMMS_MPI armci_group_finalize(); #endif #ifdef ARMCIX ARMCIX_Finalize (); #endif #ifdef MSG_COMMS_MPI MPI_Comm_free(&ARMCI_COMM_WORLD); /*SK: free at last*/ #endif } /* Indicates whether ARMCI_Init or ARMCI_Init_args has been called. */ int PARMCI_Initialized() { return (_armci_initialized > 0) ? 1 : 0; } #if !(defined(SYSV) || defined(WIN32)) void ARMCI_Set_shmem_limit(unsigned long shmemlimit) { /* not applicable here * aborting would make user's life harder */ } #endif void ARMCI_Copy(void *src, void *dst, int n) { armci_copy(src,dst,n); } extern void cpu_yield(); void armci_util_wait_int(volatile int *p, int val, int maxspin) { int count=0; while(*p != val) if((++count)agg_flag = 1; ((armci_ihdl_t)(nb_handle))->proc = -1; } void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle) { ((armci_ihdl_t)(nb_handle))->agg_flag = 0; ((armci_ihdl_t)(nb_handle))->proc = -1; } int parmci_notify(int proc) { armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->sent++; # ifdef MEM_FENCE if(SAMECLUSNODE(proc)) MEM_FENCE; # endif #ifdef OPENIB /* IB will optimze a simple Put by using RDMA. This can bypass non-RDMA * Puts and lead to incorrect behavour. Avoid that by using PutV, which * presently does not optimize to RDMA. * This workaround is sub-optimal for two reasons: * 1. This adds more overhead when there is may be no need. * 2. There is no guarantee that PutV will always be un-optimized. */ void *sp = &pnotify->sent; void *dp = &(_armci_notify_arr[proc]+armci_me)->received; armci_giov_t gv; gv.src_ptr_array = &sp; gv.dst_ptr_array = &dp; gv.ptr_array_len = 1; gv.bytes = sizeof(pnotify->sent); PARMCI_PutV(&gv, 1, proc); #else PARMCI_Put(&pnotify->sent,&(_armci_notify_arr[proc]+armci_me)->received, sizeof(pnotify->sent),proc); #endif /* OPENIB */ return(pnotify->sent); } /* blocks until received count becomes >= waited count * return received count and store waited count in *pval */ int parmci_notify_wait(int proc,int *pval) { int retval; long loop=0; armci_notify_t *pnotify = _armci_notify_arr[armci_me]+proc; pnotify->waited++; while( pnotify->waited > pnotify->received) { if(++loop == 1000) { loop=0;cpu_yield(); } armci_util_spin(loop, pnotify); } *pval = pnotify->waited; retval=pnotify->received; return retval; } long armci_util_long_getval(long* p) { return *p; } int armci_util_int_getval(int* p) { return *p; } #if ARMCI_ENABLE_GPC_CALLS int armci_gpc(int hndl, int proc, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, armci_hdl_t* nbh) { armci_ihdl_t nb_handle = (armci_ihdl_t)nbh; armci_giov_t darr[2]; /* = {{&rhdr, &rhdr, 1, rhlen}, {&rdata, &rdata, 1, rdlen}};*/ gpc_send_t send; char *ptr; /* initialize giov */ darr[0].src_ptr_array = &rhdr; darr[0].dst_ptr_array = &rhdr; darr[0].ptr_array_len = 1; darr[0].bytes = rhlen; darr[1].src_ptr_array = &rdata; darr[1].dst_ptr_array = &rdata; darr[1].ptr_array_len = 1; darr[1].bytes = rdlen; /* if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) */ /* return FAIL2; */ /* if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ /* if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) */ /* return FAIL2; */ if(hlen>0 && hdr==NULL) return FAIL3; if(rhlen>0 && rhdr==NULL) return FAIL3; if(dlen>0 && data==NULL) return FAIL3; if(rdlen>0 && rdata==NULL) return FAIL3; if(proc<0 || proc >= armci_nproc) return FAIL4; send.hndl = hndl; send.hlen = hlen; send.dlen = dlen; send.hdr = hdr; send.data = data; if(nb_handle){ nb_handle->tag = GET_NEXT_NBTAG(); nb_handle->op = GET; nb_handle->proc= proc; nb_handle->bufid=NB_NONE; } else { ORDER(GET,proc); /*ensure ordering */ nb_handle = NULL; } #if defined(LAPI) || defined(GM) || defined(VAPI) || defined(QUADRICS) if(armci_rem_gpc(GET, darr, 2, &send, proc, 1, nb_handle)) #endif return FAIL2; return 0; } int armci_sameclusnode(int proc) { return SAMECLUSNODE(proc); } #endif void _armci_init_handle(armci_hdl_t *hdl) { ((double *)((hdl)->data))[0]=0; ((double *)((hdl)->data))[1]=0; } #ifdef CHANGE_SERVER_AFFINITY static inline int val_to_char(int v) { if (v >= 0 && v < 10) return '0' + v; else if (v >= 10 && v < 16) return ('a' - 10) + v; else return -1; } static const char *nexttoken(const char *q, int sep) { if (q) q = strchr(q, sep); if (q) q++; return q; } int cstr_to_cpuset(cpu_set_t * mask, const char *str) { const char *p, *q; q = str; CPU_ZERO(mask); while (p = q, q = nexttoken(q, ','), p) { unsigned int a; /* beginning of range */ unsigned int b; /* end of range */ unsigned int s; /* stride */ const char *c1, *c2; if (sscanf(p, "%u", &a) < 1) return 1; b = a; s = 1; c1 = nexttoken(p, '-'); c2 = nexttoken(p, ','); if (c1 != NULL && (c2 == NULL || c1 < c2)) { if (sscanf(c1, "%u", &b) < 1) return 1; c1 = nexttoken(c1, ':'); if (c1 != NULL && (c2 == NULL || c1 < c2)) if (sscanf(c1, "%u", &s) < 1) { return 1; } } if (!(a <= b)) return 1; while (a <= b) { CPU_SET(a, mask); a += s; } } return 0; } char *cpuset_to_cstr(cpu_set_t * mask, char *str) { int i; char *ptr = str; int entry_made = 0; for (i = 0; i < CPU_SETSIZE; i++) { if (CPU_ISSET(i, mask)) { int j; int run = 0; entry_made = 1; for (j = i + 1; j < CPU_SETSIZE; j++) { if (CPU_ISSET(j, mask)) run++; else break; } if (!run) sprintf(ptr, "%d,", i); else if (run == 1) { sprintf(ptr, "%d,%d,", i, i + 1); i++; } else { sprintf(ptr, "%d-%d,", i, i + run); i += run; } while (*ptr != 0) ptr++; } } ptr -= entry_made; *ptr = 0; return str; } char *cpuset_to_str(cpu_set_t * mask, char *str) { int base; char *ptr = str; char *ret = 0; for (base = CPU_SETSIZE - 4; base >= 0; base -= 4) { char val = 0; if (CPU_ISSET(base, mask)) val |= 1; if (CPU_ISSET(base + 1, mask)) val |= 2; if (CPU_ISSET(base + 2, mask)) val |= 4; if (CPU_ISSET(base + 3, mask)) val |= 8; if (!ret && val) ret = ptr; *ptr++ = val_to_char(val); } *ptr = 0; return ret ? ret : ptr - 1; } #endif static int in_error_cleanup=0; void derr_printf(const char *format, ...) { if(!in_error_cleanup) { #ifdef SYSV if((!AR_caught_sigterm && !AR_caught_sigint) || armci_me==0) #endif { va_list ap; va_start(ap, format); vprintf(format, ap); va_end(ap); } } } int dassertp_fail(const char *cond_string, const char *file, const char *func, unsigned int line, int code) { if(!in_error_cleanup) { /* JAD 02/23/2012 for applications, an exit/error code of 0 indicates * success, it is therefore wrong to call dassertp_fail with a zero value */ if (0 == code) { code = -1; } in_error_cleanup=1; #ifdef SYSV if((!AR_caught_sigterm && !AR_caught_sigint) || armci_me==0) #endif { printf("(rank:%d hostname:%s pid:%d):ARMCI DASSERT fail. %s:%s():%d cond:%s\n", armci_me,armci_clus_info[armci_clus_me].hostname, getpid(), file,func,line,cond_string); #if defined(PRINT_BT) backtrace_symbols_fd(bt, backtrace(bt, 100), 2); #endif } armci_abort(code); } return code; } ga-5-4/armci/src/common/async.c0000644000175000017500000000735012662210413014465 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: async.c,v 1.5 2002-12-18 18:25:33 vinod Exp $ */ /* data structures and interfaces for handling asynchronous requests */ #if HAVE_STDIO_H # include #endif #include "armcip.h" #define DEBUG_ 0 /* #define UBUF_LEN 496 */ #define MAX_PENDING_REQ 4 #define MAX_STRIDE_LEVELS 8 typedef struct { void *ptr; int stride_levels; int stride_arr[MAX_STRIDE_LEVELS]; int count[MAX_STRIDE_LEVELS]; }strided_dscr_t; typedef struct { int segments; int len; void *ptrs[60]; }vector_dscr_t; typedef struct { int reqid; /* request id */ int bufid; /* communication buffer id */ union { /* 8 bytes for alignment reason */ void *dscrbuf; double pad; }ptr; union { char buf[UBUF_LEN]; strided_dscr_t strided; vector_dscr_t vector; }dscr; }saved_dscr_t; static int cur_id=191; #define GET_REQ_ID cur_id++ #define REQ_TO_DSC_ID(reqid) ((reqid)>>8) static saved_dscr_t armci_pending_dscr[MAX_PENDING_REQ]; /*\ save a part of strided descriptor needed to complete request \*/ void _armci_asyn_save_dscr_strided(int id, void *ptr, int stride[], int count[], int levels) { strided_dscr_t *dscr; int i, dsc_id = REQ_TO_DSC_ID(id); dscr = &armci_pending_dscr[dsc_id].dscr.strided; dscr->stride_levels = levels; dscr->ptr =ptr; for(i=0;istride_arr[i]=stride[i]; for(i=0;icount[i]=count[i]; } /*\ for request stored in buf, save local strided descriptor and return req id \*/ int _armci_asyn_init_strided_get(void *buf, void *ptr,int levels, int stride[], int count[]) { int id, i; int dsc_id=_armci_buf_to_index(buf); strided_dscr_t *dscr; dscr = &armci_pending_dscr[dsc_id].dscr.strided; dscr->stride_levels = levels; dscr->ptr =ptr; for(i=0;istride_arr[i]=stride[i]; for(i=0;icount[i]=count[i]; /* convert bufid into req id returned to user */ id = dsc_id; id <<= 8; /* buffer id is in second byte */ cur_id = (cur_id+1)%255 +1; /* counter in LSB */ id += cur_id; armci_pending_dscr[dsc_id].reqid = id; if(DEBUG_){ printf("%d: init strided get: ptr=%p reqid=%d bufid=%d cid=%d levels=%d count[0]=%d\n", armci_me,ptr,id,dsc_id, cur_id, levels,count[0]); fflush(stdout); } return id; } void _armci_asyn_complete_strided_get(int dsc_id, void *buf) { request_header_t *msginfo = (request_header_t*) buf; strided_dscr_t *dscr; dscr = &armci_pending_dscr[dsc_id].dscr.strided; armci_pending_dscr[dsc_id].reqid = 0; if(DEBUG_){ printf("%d:complete_strided_get: ptr=%p bufid=%d levels=%d count[0]=%d\n", armci_me,dscr->ptr,dsc_id,dscr->stride_levels,dscr->count[0]); fflush(stdout); } armci_rcv_strided_data(msginfo->to, msginfo, msginfo->datalen, dscr->ptr, dscr->stride_levels, dscr->stride_arr,dscr->count); } #if 0 /*this function has been added in armci.c*/ int PARMCI_Wait(int req_id) { int dsc_id = REQ_TO_DSC_ID(req_id); void *buf; if(DEBUG_){ printf("%d: WAIT for req id=%d bufid=%d\n",armci_me,req_id,dsc_id); fflush(stdout); } buf = _armci_buf_ptr_from_id(dsc_id); if(dsc_id >MAX_PENDING_REQ) armci_die2("PARMCI_Wait: bad id",dsc_id,MAX_PENDING_REQ); /* when 0 it means the request was completed to get the buffer */ if(armci_pending_dscr[dsc_id].reqid == 0) return 0; /* return 1 if request id looks bad */ if(armci_pending_dscr[dsc_id].reqid < req_id) return 1; _armci_asyn_complete_strided_get(dsc_id,buf); FREE_SEND_BUFFER(buf); return 0; } #endif ga-5-4/armci/src/common/iterator.c0000644000175000017500000001041312662210413015173 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file iterator.h * @author Sriram Krishnamoorthy * @brief Stride iterator. * An iterator for the stride descriptor to reuse common traversal * functionality. More functionality related to the strided * descriptor reusable across files will be extracted here as well. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "iterator.h" /**Create a stride iterator. * @param base_ptr IN Starting pointer for stride descriptor * @param stride_levels IN #stride levels * @param stride_arr IN the strides (arr of size[stride_levels]) * @param seg_count IN #segments in each stride * level([stride_levels+1]) * @return Handle to stride iterator created */ void armci_stride_info_init(stride_info_t *sinfo, void *base_ptr, int stride_levels, const int *stride_arr, const int *seg_count) { int i; dassert(1,sinfo!=NULL); dassert(1,stride_levels>=0); dassert(1,stride_levels<=ARMCI_MAX_STRIDE_LEVEL); for(i=0; i= seg_count[0]); else dassert(1,stride_arr[i] >= stride_arr[i-1]*seg_count[i]); } sinfo->base_ptr= base_ptr; sinfo->stride_levels = stride_levels; for(i=0; istride_arr[i] = stride_arr[i]; } for(i=0; iseg_count[i] = seg_count[i]; } sinfo->size=1; for(i=1; isize *= sinfo->seg_count[i]; } dassert(1,sinfo->size>0); sinfo->pos=0; for(i=0; iitr[i] = 0; } } /**Destroy a stride iterator. * @param psitr IN/OUT Pointer to stride iterator * @return void */ void armci_stride_info_destroy(stride_info_t *sinfo) { } /**Size of the stride iterator. Defined as total #contiguous * segments in the stride iterator. * @param sitr IN Handle to stride iterator * @return Size of the stride iterator */ int armci_stride_info_size(stride_info_t *sinfo) { dassert(1,sinfo!=NULL); return sinfo->size; } /**Position of the stride iterator. Between 0 and (size-1), * inclusive. Position is the index of the contiguous segment * currently traversed by the iterator. * @param sitr IN Handle to stride descriptor * @return Position of the iterator */ int armci_stride_info_pos(stride_info_t *sinfo) { dassert(1,sinfo!=NULL); return sinfo->pos; } /**Move the iterator to the next position. Assumes position<=size. * @param sitr IN Handle to stride descriptor * @return void */ void armci_stride_info_next(stride_info_t *sinfo) { int i; dassert(1,sinfo!=NULL); dassert(1,sinfo->pos size); sinfo->pos += 1; if(sinfo->stride_levels>0) { sinfo->itr[0] += 1; for(i=0; istride_levels-1 && sinfo->itr[i]==sinfo->seg_count[i+1]; i++) { sinfo->itr[i] = 0; sinfo->itr[i+1] += 1; } dassert(1,sinfo->itr[i] <= sinfo->seg_count[i+1]); } } /**Get pointer to the contiguous segment currently being * traversed. This is the pointer to the user buffer. * @param sitr IN Handle to stride descriptor * @return pointer to current contiguous segment */ void *armci_stride_info_seg_ptr(stride_info_t *sinfo) { dassert(1,sinfo!=NULL); return sinfo->base_ptr + armci_stride_info_seg_off(sinfo); } /**Get the size of the current segment. * @param sitr IN Handle to stride descriptor * @return Size of the current segment */ int armci_stride_info_seg_size(stride_info_t *sinfo) { dassert(1,sinfo!=NULL); return sinfo->seg_count[0]; } /**Get the offset of the current segment with respect to the start of * the first segment (a.k.a src_ptr) * @param sitr IN Handle to stride descriptor * @return Offset of the current segment */ int armci_stride_info_seg_off(stride_info_t *sinfo) { int i; int off; dassert(1,sinfo!=NULL); off=0; for(i=0; istride_levels; i++) { off += sinfo->itr[i] * sinfo->stride_arr[i]; } return off; } /**Check if there are more segments to iterate over. (a.k.a * positionpossize; } ga-5-4/armci/src/common/pack.c0000644000175000017500000003134712662210413014271 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: pack.c,v 1.36.10.1 2006-12-14 13:24:37 manoj Exp $ */ #include "armcip.h" #if HAVE_STDIO_H # include #endif #if !defined(ACC_COPY) &&!defined(CRAY_YMP) &&!defined(CYGNUS)&&!defined(CYGWIN) &&!defined(BGML) &&!defined(DCMF) # define REMOTE_OP #endif #if defined(REMOTE_OP) # define OP_STRIDED armci_rem_strided #else # define OP_STRIDED(_a,_b,_c,_d,_e,_f,_g,_h,_i,_delete1,_j,_hdl)\ armci_op_strided(_a,_b,_c,_d,_e,_f,_g,_h,_i,_j,_hdl) #endif /*\ determine if patch fits in the ARMCI buffer, and if not * at which stride level (patch dim) need to decompose it * *fit_level is the value of stride level to perform packing at * *nb means number of elements of count[*fit_level] that fit in buf \*/ static void armci_fit_buffer(int count[], int stride_levels, int* fit_level, int *nb, int bufsize) { int bytes=1, sbytes=1; int level; /* find out at which stride level BUFFER becomes too small */ for(level=0; level<= stride_levels; level++){ sbytes = bytes; /* store #bytes at current level to save div cost later */ bytes *= count[level]; if(bufsize < bytes) break; } /* buffer big enough for entire patch */ if(bufsize >= bytes){ *fit_level = stride_levels; *nb = count[stride_levels]; return; } /* buffer too small */ switch (level){ case 0: /* smaller than a single column */ *fit_level = 0; *nb = bufsize; break; case -1: /* one column fits */ *fit_level = 0; *nb = sbytes; break; default: /* it could keep nb instances of (level-1)-dimensional patch */ *fit_level = level; *nb = bufsize/sbytes; } } /*\ The function decomposes a multi-dimensional patch so that it fits in the * internal ARMCI buffer. * It works by recursively reducing patch dimension until some portion of the * subpatch fits in the buffer. * The recursive process is controlled by "fit_level" and "nb" arguments, * which have to be set to -1 at the top-level of the recursion tree. * * Argument last and variable looplast are used to indicate to sending/packing * routine that we are dealing with the last portion of the request. * Due to the recursive nature of packing code, the algorithm is following: * if last=1 then internal for loop passes 1 for the last chunk * else it passes 0 * \*/ int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int fit_level, int nb, int last,armci_ihdl_t nb_handle) { int rc=0, bufsize=BUFSIZE,noswap=0; long sn; void *src, *dst; #ifdef REMOTE_OP int flag=0; #else int flag=1; #endif int b; static int call_count; #ifdef STRIDED_GET_BUFLEN if(op==GET)bufsize=STRIDED_GET_BUFLEN; # ifdef HITACHI else if(stride_levels || ARMCI_ACC(op))bufsize=MSG_BUFLEN_SMALL-PAGE_SIZE; # endif #endif #if (defined(GM_) || defined(VIA_) || defined(VAPI_)) /*we cant assume that the entire available buffer will be used for data, fact that the header and descriptor also go in the same buffer should be considered while packing. */ bufsize-=(sizeof(request_header_t)+(MAX_STRIDE_LEVEL+4)*sizeof(int)+2*sizeof(void *)); # if defined(PIPE_BUFSIZE) && defined(MAX_PIPELINE_CHUNKS) bufsize-=8*MAX_PIPELINE_CHUNKS; # endif #endif #ifdef BALANCE_FACTOR /* Added the following for balancing buffers */ if(op==PUT){ int bytes=1, i; for(i=0; i<= stride_levels; i++) bytes *= count[i]; if(bytes > bufsize && bytes/bufsize < 3 && bytes%bufsize < BALANCE_BUFSIZE){ /* bytes div bufsize - 1 is to increase the balence factor for 3 buffer case */ bufsize = bytes/ (bytes/bufsize - 1 + BALANCE_FACTOR); noswap = 1; /*** yuck: if set to 1, error in buffers.c ***/ } bytes = bufsize%8; bufsize -= bytes; } #endif /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ armci_fit_buffer(count, stride_levels, &fit_level, &nb, bufsize); last = 1; } if(fit_level == stride_levels){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int dst_stride, src_stride; if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ if(h) h->last = last?1:0; if(nb_handle && call_count ){ nb_handle->bufid=NB_MULTI; call_count++; } return(OP_STRIDED(op, scale, proc, src_ptr, src_stride_arr, dst_ptr,dst_stride_arr,count,stride_levels,h,flag,nb_handle)); } if(fit_level){ dst_stride = dst_stride_arr[fit_level -1]; src_stride = src_stride_arr[fit_level -1]; }else{ dst_stride = src_stride = 1; } if(op == GET || noswap == 1) b =nb; else{ b = chunk%nb; if(b==0)b=nb; } /* put smallest piece first */ for(sn = 0; sn < chunk; ){ src = (char*)src_ptr + src_stride* sn; dst = (char*)dst_ptr + dst_stride* sn; count[fit_level] = ARMCI_MIN(b, chunk-sn); /*modify count for this level*/ if(h) h->last = (last && ((sn+b)>=chunk))? 1: 0 ; if(nb_handle)call_count++; rc = OP_STRIDED( op, scale, proc, src, src_stride_arr, dst,dst_stride_arr,count,fit_level,h,flag,nb_handle); if(rc) break; sn += b; b = nb; } count[fit_level] = chunk; /* restore original count */ } else { for(sn = 0; sn < count[stride_levels]; sn++){ int looplast =0; src = (char*)src_ptr + src_stride_arr[stride_levels -1]* sn; dst = (char*)dst_ptr + dst_stride_arr[stride_levels -1]* sn; if(last && (sn == count[stride_levels]-1)) looplast =1; rc = armci_pack_strided(op, scale, proc, src, src_stride_arr, dst, dst_stride_arr, count, stride_levels -1, h,fit_level, nb, looplast,nb_handle); if(rc) return rc; } } if(nb_handle && call_count ) nb_handle->bufid=NB_MULTI; return rc; } /*\ decompose strided data into chunks and call func on each chunk \*/ void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg) { int sn,first_call=0; void *ptr_upd; /* determine decomposition of the patch to fit in the buffer */ if(fit_level<0){ first_call=1; armci_fit_buffer(count, strides, &fit_level, &nb, bufsize); } if(fit_level == strides){ /* we can fit subpatch into the buffer */ int chunk = count[fit_level]; int stride_upd; # ifdef PIPE_MEDIUM_BUFSIZE_ /* for first call we adjust nb for performance in medium request */ if(first_call && strides==0) if(chunk<2*bufsize && chunk>PIPE_MEDIUM_BUFSIZE) nb = PIPE_MEDIUM_BUFSIZE; # endif if(nb == chunk){ /* take shortcut when whole patch fits in the buffer */ fun(ptr, stride_arr, count, strides, arg); } if(fit_level) stride_upd = stride_arr[fit_level -1]; else stride_upd = 1; for(sn = 0; sn < chunk; sn += nb){ ptr_upd = (char*)ptr + stride_upd* sn; count[fit_level] = ARMCI_MIN(nb, chunk-sn); /*modify count for this level*/ fun(ptr_upd, stride_arr, count, fit_level, arg); } count[fit_level] = chunk; /* restore original count */ }else for(sn = 0; sn < count[strides]; sn++){ ptr_upd = (char*)ptr + stride_arr[strides -1]* sn; armci_dispatch_strided(ptr_upd, stride_arr, count, strides -1, fit_level, nb, bufsize, fun, arg); } } /* how much space is needed to move data + reduced descriptor ? */ int armci_vector_bytes( armci_giov_t darr[], int len) { int i, bytes=0; for(i=0; isrc_ptr_array=NULL; /* go through the sets looking for set to be split */ for(s=0;s((int)BUFSIZE1)){ split =(BUFSIZE1 -bytes-2*sizeof(int))/(darr[s].bytes +sizeof(void*)); if(split == 0) s--; /* no room available - do not split */ break; }else bytes+=csize; if(BUFSIZE1 -bytes < 64) break; /* stop here if almost full */ } if(s==len)s--; /* adjust loop counter should be < number of sets */ *nlen = s+1; if(split){ /* save the value to be overwritten only if "save" is not filled */ if(!save->src_ptr_array)*save= darr[s]; /* split the set: reduce # of elems, "extra" keeps info for rest of set*/ *extra = darr[s]; darr[s].ptr_array_len = split; extra->ptr_array_len -= split; extra->src_ptr_array = &extra->src_ptr_array[split]; extra->dst_ptr_array = &extra->dst_ptr_array[split]; } } static inline void armcip_init_giov_t(armci_giov_t *thing) { thing->src_ptr_array=NULL; thing->dst_ptr_array=NULL; thing->ptr_array_len=0; thing->bytes=0; } int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,armci_ihdl_t nb_handle) { armci_giov_t extra; /* keeps data remainder of set to be processed in chunks */ armci_giov_t save; /* keeps original value of set to be processed in chunks */ armci_giov_t *ndarr; /* points to first array element to be processed now */ int rc=0, nlen, count=0; armcip_init_giov_t(&extra); armcip_init_giov_t(&save); ndarr = darr; save.src_ptr_array=NULL; /* indicates that save slot is empty */ while(len){ armci_split_dscr_array(ndarr, len, &extra, &nlen, &save); # if defined(REMOTE_OP) /* A problem will occur if len is 1 and nlen is 0. This corresponds to a * situation where the size of an individual element is found to exceed * BUFSIZE1. Treat this as a single transfer of contiguous data using * the standard PARMCI_Get/Put/Acc call */ if (len == 1 && nlen == 0) { if(ARMCI_ACC(op))rc=PARMCI_Acc(op, scale, ndarr[0].src_ptr_array[0], ndarr[0].dst_ptr_array[0],ndarr[0].bytes, proc); else if(op == GET)rc=PARMCI_Get(ndarr[0].src_ptr_array[0], ndarr[0].dst_ptr_array[0],ndarr[0].bytes, proc); else if(op == PUT)rc=PARMCI_Put(ndarr[0].src_ptr_array[0], ndarr[0].dst_ptr_array[0],ndarr[0].bytes, proc); else armci_die("Unknown op in armci_pack_vector",op); nlen = 1; } else { rc = armci_rem_vector(op, scale, ndarr,nlen,proc,0,nb_handle); } # else if(ARMCI_ACC(op))rc=armci_acc_vector(op,scale,ndarr,nlen,proc); else rc = armci_copy_vector(op,ndarr,nlen,proc); # endif if(rc) break; /* non-NULL pointer indicates that set was split */ if(extra.src_ptr_array){ if(nb_handle) { nb_handle->bufid = NB_MULTI; /*can be set multiple times here; but not reset here*/ } ndarr[nlen-1]=extra; /* set the pointer to remainder of last set */ nlen--; /* since last set not done in full need to process it again */ }else{ if(save.src_ptr_array){ ndarr[0]=save; save.src_ptr_array=NULL; /* indicates that save slot is empty */ } if(nlen == 0) armci_die("vector packetization problem:buffer too small",BUFSIZE1); } len -=nlen; ndarr +=nlen; count ++; } return rc; } ga-5-4/armci/src/common/timer.c0000644000175000017500000000176512662210413014474 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #ifdef WIN32 static double msec; /* reference for timer */ # include #else #if HAVE_SYS_TYPES_H # include #endif #if HAVE SYS_TIME_H # include #endif static unsigned firstsec=0; /* Reference for timer */ static unsigned firstusec=0; /* Reference for timer */ #endif static int first_call=1; double armci_timer() { #ifdef WIN32 double t0 = (double)GetCurrentTime(); if(first_call){ first_call=0; msec=t0; return 0.0; } t0 -=msec; if(t0<0.0)t0 += (double)0xffffffff; return 0.01*t0; #else double low, high; struct timeval tp; struct timezone tzp; (void) gettimeofday(&tp,&tzp); if (first_call) { firstsec = tp.tv_sec; firstusec = tp.tv_usec; first_call = 0; } low = (double)(tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); #endif } ga-5-4/armci/src/common/capi.c0000644000175000017500000002604412662210413014265 0ustar mbamba #if HAVE_CONFIG_H # include "config.h" #endif #include #include "armci.h" #include "parmci.h" #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Acc #endif int ARMCI_Acc(int optype, void *scale, void *src, void *dst, int bytes, int proc) { return PARMCI_Acc(optype, scale, src, dst, bytes, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_AccS #endif int ARMCI_AccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { return PARMCI_AccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_AccV #endif int ARMCI_AccV(int op, void *scale, armci_giov_t *darr, int len, int proc) { return PARMCI_AccV(op, scale, darr, len, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_AllFence #endif void ARMCI_AllFence() { PARMCI_AllFence(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Barrier #endif void ARMCI_Barrier() { PARMCI_Barrier(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Create_mutexes #endif int ARMCI_Create_mutexes(int num) { return PARMCI_Create_mutexes(num); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Destroy_mutexes #endif int ARMCI_Destroy_mutexes() { return PARMCI_Destroy_mutexes(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Fence #endif void ARMCI_Fence(int proc) { PARMCI_Fence(proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Finalize #endif void ARMCI_Finalize() { PARMCI_Finalize(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Free #endif int ARMCI_Free(void *ptr) { return PARMCI_Free(ptr); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Free_local #endif int ARMCI_Free_local(void *ptr) { return PARMCI_Free_local(ptr); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Get #endif int ARMCI_Get(void *src, void *dst, int bytes, int proc) { return PARMCI_Get(src, dst, bytes, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetS #endif int ARMCI_GetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { return PARMCI_GetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetV #endif int ARMCI_GetV(armci_giov_t *darr, int len, int proc) { return PARMCI_GetV(darr, len, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetValueDouble #endif double ARMCI_GetValueDouble(void *src, int proc) { return PARMCI_GetValueDouble(src, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetValueFloat #endif float ARMCI_GetValueFloat(void *src, int proc) { return PARMCI_GetValueFloat(src, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetValueInt #endif int ARMCI_GetValueInt(void *src, int proc) { return PARMCI_GetValueInt(src, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_GetValueLong #endif long ARMCI_GetValueLong(void *src, int proc) { return PARMCI_GetValueLong(src, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Init #endif int ARMCI_Init() { return PARMCI_Init(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Init_args #endif int ARMCI_Init_args(int *argc, char ***argv) { return PARMCI_Init_args(argc, argv); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Initialized #endif int ARMCI_Initialized() { return PARMCI_Initialized(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Lock #endif void ARMCI_Lock(int mutex, int proc) { PARMCI_Lock(mutex, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Malloc #endif int ARMCI_Malloc(void **ptr_arr, armci_size_t bytes) { return PARMCI_Malloc(ptr_arr, bytes); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Malloc_local #endif void* ARMCI_Malloc_local(armci_size_t bytes) { return PARMCI_Malloc_local(bytes); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Memat #endif void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset) { return PARMCI_Memat(meminfo, offset); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Memget #endif void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg) { PARMCI_Memget(bytes, meminfo, memflg); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbAccS #endif int ARMCI_NbAccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbAccS(optype, scale, src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbAccV #endif int ARMCI_NbAccV(int op, void *scale, armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbAccV(op, scale, darr, len, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbGet #endif int ARMCI_NbGet(void *src, void *dst, int bytes, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbGet(src, dst, bytes, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbGetS #endif int ARMCI_NbGetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbGetS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbGetV #endif int ARMCI_NbGetV(armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbGetV(darr, len, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPut #endif int ARMCI_NbPut(void *src, void *dst, int bytes, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPut(src, dst, bytes, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutS #endif int ARMCI_NbPutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutV #endif int ARMCI_NbPutV(armci_giov_t *darr, int len, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutV(darr, len, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutValueDouble #endif int ARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutValueDouble(src, dst, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutValueFloat #endif int ARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutValueFloat(src, dst, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutValueInt #endif int ARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutValueInt(src, dst, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_NbPutValueLong #endif int ARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t *nb_handle) { return PARMCI_NbPutValueLong(src, dst, proc, nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Put #endif int ARMCI_Put(void *src, void *dst, int bytes, int proc) { return PARMCI_Put(src, dst, bytes, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutS #endif int ARMCI_PutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc) { return PARMCI_PutS(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutS_flag #endif int ARMCI_PutS_flag(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { return PARMCI_PutS_flag(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutS_flag_dir #endif int ARMCI_PutS_flag_dir(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc) { return PARMCI_PutS_flag_dir(src_ptr, src_stride_arr, dst_ptr, dst_stride_arr, count, stride_levels, flag, val, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutV #endif int ARMCI_PutV(armci_giov_t *darr, int len, int proc) { return PARMCI_PutV(darr, len, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutValueDouble #endif int ARMCI_PutValueDouble(double src, void *dst, int proc) { return PARMCI_PutValueDouble(src, dst, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutValueFloat #endif int ARMCI_PutValueFloat(float src, void *dst, int proc) { return PARMCI_PutValueFloat(src, dst, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutValueInt #endif int ARMCI_PutValueInt(int src, void *dst, int proc) { return PARMCI_PutValueInt(src, dst, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_PutValueLong #endif int ARMCI_PutValueLong(long src, void *dst, int proc) { return PARMCI_PutValueLong(src, dst, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Put_flag #endif int ARMCI_Put_flag(void *src, void *dst, int bytes, int *f, int v, int proc) { return PARMCI_Put_flag(src, dst, bytes, f, v, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Rmw #endif int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc) { return PARMCI_Rmw(op, ploc, prem, extra, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Test #endif int ARMCI_Test(armci_hdl_t *nb_handle) { return PARMCI_Test(nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Unlock #endif void ARMCI_Unlock(int mutex, int proc) { PARMCI_Unlock(mutex, proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_Wait #endif int ARMCI_Wait(armci_hdl_t *nb_handle) { return PARMCI_Wait(nb_handle); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_WaitAll #endif int ARMCI_WaitAll() { return PARMCI_WaitAll(); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak ARMCI_WaitProc #endif int ARMCI_WaitProc(int proc) { return PARMCI_WaitProc(proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak armci_msg_barrier #endif void armci_msg_barrier() { parmci_msg_barrier(); } #if MSG_COMMS_MPI #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak armci_msg_group_barrier #endif void armci_msg_group_barrier(ARMCI_Group *group) { parmci_msg_group_barrier(group); } #endif #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak armci_notify #endif int armci_notify(int proc) { return parmci_notify(proc); } #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak armci_notify_wait #endif int armci_notify_wait(int proc, int *pval) { return parmci_notify_wait(proc, pval); } ga-5-4/armci/src/common/spawn.c0000644000175000017500000000560212662210413014476 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* OS specific server process/thread creation and destruction * JN/03.25.2000 */ #if HAVE_STDIO_H # include #endif #if HAVE_ERRNO_H # include #endif #include "armcip.h" #ifdef WIN32 /************************** Windows threads **************************/ #if HAVE_WINDOWS_H # include #endif #if HAVE_PROCESS_H # include #endif thread_id_t armci_serv_tid; unsigned long armci_serv_handle; #ifndef NO_STDLIBC #define NEWTHREAD CreateThread #else #define NEWTHREAD _beginthreadex #endif unsigned __stdcall armci_wrap_func(void *arg) { void (*func)(void*); func = arg; /* boost the server thread priority be better responsiveness */ (void)SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); func(NULL); return (unsigned)0; } void armci_create_server_thread ( void* (* func)(void*) ) { /* as we need to use std C rt library we cannot use CreateThread */ armci_serv_handle = NEWTHREAD(NULL, 0, armci_wrap_func, (void*)func, 0, &armci_serv_tid); if(!armci_serv_handle) armci_die("armci_create_server_thread: create failed",0); } void armci_terminate_server_thread() { /*int rc;*/ /* TerminateThread(armci_serv_handle,&rc);*/ } /****************************** PTHREADS *****************************/ #elif defined(PTHREADS) #include thread_id_t armci_serv_tid; void armci_create_server_thread ( void* (* func)(void*) ) { pthread_attr_t attr; int rc; if(pthread_attr_init(&attr)) armci_die("armci_create_server_thread: attr init failed",0); #if defined(AIX) || defined(SOLARIS) pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); #endif rc = pthread_create(&armci_serv_tid, &attr, func, NULL); if(rc) armci_die("armci_create_server_thread: create failed",errno); pthread_attr_destroy(&attr); } void armci_terminate_server_thread() { if(pthread_join(armci_serv_tid,NULL)) armci_die("armci_terminate_server_thread: failed",0); } #else /**************************** Unix processes ******************************/ #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_WAIT_H # include #endif pid_t server_pid= (pid_t)0; void armci_create_server_process ( void* (* func)(void*) ) { pid_t pid; if ( (pid = fork() ) < 0) armci_die("fork failed", (int)pid); else if(pid == 0){ armci_me = SOFFSET - armci_me; /* server id derived from parent id */ func(NULL); } else server_pid = pid; } void armci_wait_server_process() { int stat; pid_t rc; if(!server_pid) return; rc = wait (&stat); if (rc != server_pid){ perror("ARMCI master: wait for child process (server) failed:"); } server_pid = (pid_t)0; } #endif ga-5-4/armci/src/common/noncont.c0000644000175000017500000002052412662210413015024 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: noncont.c,v 1.3.2.2 2007-05-04 16:43:35 d3p687 Exp $ * noncont.c * * Developed by Andriy Kot * Copyright (c) 2006 Pacific Northwest National Laboratory * * Alternative version of non-contiguous calls using non-blocking ones * * Changelog: * 2006-09-08 - created * */ #include "armcip.h" #include "copy.h" #include "acc.h" #include "memlock.h" #if HAVE_STDIO_H # include #endif #ifdef PORTALS #include "armci_portals.h" #endif #if 0 # define PRN_DBG_MSG3(m,a1,a2,a3) \ fprintf(stderr,"DBG %d: " m,armci_me,a1,a2,a3);fflush(stderr) # define PRN_DBG_MSG(m) PRN_DBG_MSG3(m,0,0,0) # define PRN_DBG_MSG1(m,a1) PRN_DBG_MSG3(m,a1,0,0) # define PRN_DBG_MSG2(m,a1,a2) PRN_DBG_MSG3(m,a1,a2,0) #else # define PRN_DBG_MSG(m) # define PRN_DBG_MSG1(m,a1) # define PRN_DBG_MSG2(m,a1,a2) # define PRN_DBG_MSG3(m,a1,a2,a3) #endif #if 0 # define CALL_IN(_func) { if (armci_me == 0) printf("ENTERED %s\n", _func); fflush(stdout); } # define CALL_OUT(_func) { if (armci_me == 0) printf("EXITING %s\n", _func); fflush(stdout); } #else # define CALL_IN(_func) # define CALL_OUT(_func) #endif #ifdef NB_NONCONT #if defined(QUADRICS) typedef ELAN_EVENT *HTYPE; #define SHMEM_HANDLE_SUPPORTED #elif defined(CRAY_SHMEM) typedef void *HTYPE; #else typedef armci_ireq_t HTYPE; #endif #define MAX_SLOTS_LL 64 #define MIN_OUTSTANDING 6 static int max_pending = 16; /* throttle number of outstanding nb calls */ /* might have to use MAX_SLOTS_LL < MAX_PENDING due to throttling problem */ #define MAX_PENDING 6 #define ZR (HTYPE)0 static HTYPE put_dscr[MAX_SLOTS_LL]; static HTYPE get_dscr[MAX_SLOTS_LL]; /* static variables alreay initialize to 0 (?) static HTYPE put_dscr[MAX_SLOTS_LL]= { ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR, ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR}; static HTYPE get_dscr[MAX_SLOTS_LL] = { ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR, ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR,ZR}; */ #if defined(PORTALS) extern ARMCI_MEMHDL_T *mhloc; extern ARMCI_MEMHDL_T *mhrem; # define INI_HDL(_hdl, _op, _proc) { \ (_hdl).tag = GET_NEXT_NBTAG(); \ (_hdl).op = _op; \ (_hdl).proc = _proc; \ (_hdl).bufid = NB_NONE; \ } # define CLR_HDL(_hdl) ((_hdl).tag = 0) # define CHK_HDL(_hdl) (_hdl.tag) #else # define CLR_HDL(_hdl) ((_hdl) = ZR) # define CHK_HDL(_hdl) (_hdl) # define INI_HDL(_hdl, _op, _proc) #endif static int cur_get=0; static int cur_put=0; static int pending_get=0; static int pending_put=0; /* strided put, nonblocking */ void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride) { CALL_IN("armcill_put2D"); int _j, i, batch, issued=0; char *ps=src_ptr, *pd=dst_ptr; for (_j = 0; _j < count; ){ /* how big a batch of requests can we issue */ batch = (count - _j )=max_pending)cur_put=0; } } if(issued != count) armci_die2("armcill_put2D: mismatch %d %d \n", count,issued); CALL_OUT("armcill_put2D"); } /* blocking vector put */ void armcill_putv(int proc, int bytes, int count, void* src[], void* dst[]) { int _j, i, batch, issued=0; void *ps, *pd; for (_j = 0; _j < count; ){ /* how big a batch of requests can we issue */ batch = (count - _j )=max_pending)cur_put=0; } } if(issued != count) armci_die2("armcill_putv: mismatch\n", count,issued); #ifdef SHMEM_HANDLE_SUPPORTED for(i=0; i=max_pending)cur_get=0; } } if(issued != count) armci_die2("armcill_get2D: mismatch %d %d \n", count,issued); CALL_OUT("armcill_get2D"); } /* blocking vector get */ void armcill_getv(int proc, int bytes, int count, void* src[], void* dst[]) { int _j, i, batch, issued=0; void *ps, *pd; for (_j = 0; _j < count; ){ /* how big a batch of requests can we issue */ batch = (count - _j )=max_pending)cur_get=0; } } if(issued != count) armci_die2("armcill_getv: mismatch %d %d \n", count,issued); #ifdef SHMEM_HANDLE_SUPPORTED for(i=0; i #endif #include "armcip.h" #include "locks.h" #include "gpc.h" #define GPC_SLOTS 32 #define GPC_OFFSET -100 static void *_table[GPC_SLOTS]={ (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0, (void*)0}; /*\ callback functions must be registered -- user gets int handle back \*/ int ARMCI_Gpc_register( int (*func) ()) { int handle =-1, candidate = 0; PARMCI_Barrier(); do{ if(!_table[candidate]){ handle = candidate; _table[candidate]=func; } candidate++; }while(candidate < GPC_SLOTS && handle == -1); return(GPC_OFFSET-handle); } /*\ release/deassociate handle with previously registered callback function \*/ void ARMCI_Gpc_release(int handle) { int h = -handle + GPC_OFFSET; PARMCI_Barrier(); if(h<0 || h >= GPC_SLOTS) armci_die("ARMCI_Gpc_release: bad handle",h); _table[h] = (void*)0; } /*\ Send Request to Execute callback function in a global address space * Arguments: * f - handle to the callback function * p - remote processor * hdr - header data - used to pack extra args for callback (local buffer) * hlen - size of header data < ARMCI_GPC_HLEN * data - bulk data passed to callback (local buffer) * dlen - length of bulk data * rhdr - ptr to reply header (return args from callback) * rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN * rdata - ptr to where reply data from callback should be stored (local buf) * rdlen - size of the buffer to store reply data * nbh - nonblocking handle * \*/ int ARMCI_Gpc_exec(int h, int p, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh) { int hnd = -h + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); } /* func - handle to the function executed at each process in the chain callba- handle to the callback to be executed when hdr - header data used to pack extra args for callback (local buffer) hlen - size of header data < ARMCI_GPC_HLEN data - bulk data passed to callback (local buffer) dlen - length of bulk data rhdr - ptr to reply header (return args from callback) rhlen - length of buffer to store reply header < ARMCI_GPC_HLEN rdata - ptr to where reply data from callback should be stored (local buf) rdlen - size of the buffer to store reply data idlen - number of ID's idslst- list of id's in the chained GPC nbh - nonblocking handle which also acts as a context for each individual GPC Tree - the id of tree function used (default is 0=>binary, 1=>binomial, n=> user defined) */ int ARMCI_Gpc_chained_exec(int func, int callback, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int idlen, int *idlst, gpc_hdl_t* nbh, int TREE) { #if 0 int hnd = -func + GPC_OFFSET; int err = 0; armci_hdl_t *ahdl = (nbh ? &(nbh->ahdl): NULL); if(hnd <0 || hnd>= GPC_SLOTS) err += fprintf(stderr, "ARMCI_Gpc_exec: bad callback handle %d: %d\n",hnd,GPC_SLOTS); if(!_table[hnd]) err += fprintf(stderr, "ARMCI_Gpc_exec: NULL function %d",hnd); if(hlen<0 || hlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send header size %d %d\n", hlen, ARMCI_Gpc_get_hlen()); if(rhlen<0 || rhlen>=ARMCI_Gpc_get_hlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv header size %d %d\n", rhlen, ARMCI_Gpc_get_hlen()); if(dlen<0 || dlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid send data size %d %d\n", dlen, ARMCI_Gpc_get_dlen()); if(rdlen<0 || rdlen>=ARMCI_Gpc_get_dlen()) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid recv data size %d %d\n", rdlen, ARMCI_Gpc_get_dlen()); if(hlen>0 && hdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send header for non-zero header size %d\n", hlen); if(rhlen>0 && rhdr==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv header for non-zero header size %d\n", rhlen); if(dlen>0 && data==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null send data for non-zero data size %d\n", dlen); if(rdlen>0 && rdata==NULL) err += fprintf(stderr, "ARMCI_Gpc_exec: Null recv data for non-zero header size %d\n", rdlen); if(p<0 || p >= armci_nproc) err += fprintf(stderr, "ARMCI_Gpc_exec: Invalid target processor id %d\n", p, armci_nproc); if(err) return FAIL; if(rhlen + rdlen == 0) armci_die("Zero reply header + data length not yet supported", 0); tree_id = armci_msg_generate_tree(idlst,idlen,id_tree,TREE); if(nbh) nbh->proc = p; #if 1 if(SAMECLUSNODE(p) && armci_nproc==1) { int rhsize, rdsize; int (*func)(); /* fprintf(stderr, "%d:: armci gpc exec. SAMECLUSNODE\n", armci_me); */ func = _table[hnd]; if(func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_INIT) != GPC_DONE) { func(p, armci_me, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, GPC_WAIT); } #ifndef VAPI PARMCI_Fence(p); #endif return 0; } #endif /* fprintf(stderr, "%d:: armci gpc exec. invoking armci gpc\n", armci_me); */ return armci_gpc(h, p, hdr, hlen, data, dlen, rhdr, rhlen, rdata, rdlen, ahdl); #endif } int armci_gpc_local_exec(int h, int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, int rtype) { int rhsize, rdsize; int (*func)(); int hnd = -h + GPC_OFFSET; if(hnd <0 || hnd>= GPC_SLOTS) armci_die2("armci_gpc_local_exec: bad callback handle",hnd,GPC_SLOTS); if(!_table[hnd]) armci_die("armci_gpc_local_exec: NULL function",hnd); func = _table[hnd]; if(!SAMECLUSNODE(to)) armci_die("armci_gpc_local_exec: GPC call to a different node received!", armci_me); /* func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, */ /* rdata, rdlen, &rdsize); */ /* return 0; */ return func(to, from, hdr, hlen, data, dlen, rhdr, rhlen, &rhsize, rdata, rdlen, &rdsize, rtype); } /*\ * This is a template for the callback function * The arguments are passed as specified in ARMCI_Gpc_exec * In addition, * rhsize specifies the actual size of reply header data returned * rdsize specifies the actual size of reply data returned \*/ int example_func(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); #ifdef LAPI void armci_gpc_set_serverpid(){ } #endif /*\ * Translate pointer to memory on processor "proc" * to be used in a callback function send by processor "from" \*/ void * ARMCI_Gpc_translate(void *ptr, int proc, int from) { return ptr; } /*\ acquire lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_lock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_LOCK(lock,proc); } /*\ try acquire lock in a callback function to be executed in context of * processor "proc" * return value: 1 - success * 0 - failure (already locked by another thread) \*/ int ARMCI_Gpc_trylock(int proc) { armci_die("ARMCI_Gpc_trylock: not yet implemented",0); return 0; } /*\ release lock in a callback function executed in context of processor "proc" \*/ void ARMCI_Gpc_unlock(int proc) { #if defined(CLUSTER) && !defined(SGIALTIX) int lock = (proc-armci_clus_info[armci_clus_id(proc)].master)%NUM_LOCKS; #else int lock = 0; #endif NATIVE_UNLOCK(lock,proc); } void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh) { nbh->proc = armci_me; ARMCI_INIT_HANDLE(&nbh->ahdl); } void ARMCI_Gpc_wait(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Wait(&nbh->ahdl); } void ARMCI_Gpc_test(gpc_hdl_t *nbh) { if(SAMECLUSNODE(nbh->proc)) return; PARMCI_Test(&nbh->ahdl); } #define ARMCI_GPC_HLEN 65536 #define ARMCI_GPC_DLEN 65536 int ARMCI_Gpc_get_hlen() { return ARMCI_GPC_HLEN; } int ARMCI_Gpc_get_dlen() { return ARMCI_GPC_DLEN; } ga-5-4/armci/src/progress/0000755000175000017500000000000012662210406013555 5ustar mbambaga-5-4/armci/src/progress/wait.c0000644000175000017500000000672512662210406014677 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #define EXTERN #include "armcip.h" int PARMCI_Wait(armci_hdl_t* usr_hdl) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int success=0; int direct = SAMECLUSNODE(nb_handle->proc); #ifdef BGML assert(nb_handle->cmpl_info); BGML_Wait(&(nb_handle->count)); return(success); #else if(direct) { return(success); } if(nb_handle) { if(nb_handle->agg_flag) { armci_agg_complete(nb_handle, UNSET); return (success); } } if(nb_handle){ #ifdef ARMCI_NB_WAIT if(nb_handle->tag==0){ ARMCI_NB_WAIT(nb_handle->cmpl_info); return(success); } #if defined(LAPI) || defined(ALLOW_PIN) || defined(ARMCIX) if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE){ ARMCI_NB_WAIT(nb_handle->cmpl_info); return(success); } #endif #endif #ifdef COMPLETE_HANDLE COMPLETE_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); #endif } #endif return(success); } /** * * implicit handle * */ static armci_hdl_t armci_nb_handle[ARMCI_MAX_IMPLICIT];/*implicit non-blocking handle*/ static char hdl_flag[ARMCI_MAX_IMPLICIT]; static int impcount=0; armci_hdl_t *armci_set_implicit_handle (int op, int proc) { armci_ihdl_t nbh; int i=impcount%ARMCI_MAX_IMPLICIT; if(hdl_flag[i]=='1') PARMCI_Wait(&armci_nb_handle[i]); nbh = (armci_ihdl_t)&armci_nb_handle[i]; #ifdef BGML nbh->count=0; #endif nbh->tag = GET_NEXT_NBTAG(); nbh->op = op; nbh->proc = proc; nbh->bufid = NB_NONE; nbh->agg_flag = 0; hdl_flag[i]='1'; ++impcount; return &armci_nb_handle[i]; } /* wait for all non-blocking operations to finish */ int PARMCI_WaitAll (void) { #ifdef BGML BGML_WaitAll(); #elif ARMCIX ARMCIX_WaitAll (); #else int i; if(impcount) { for(i=0; iproc==proc) { PARMCI_Wait(&armci_nb_handle[i]); hdl_flag[i]='0'; } } } #endif return 0; } int PARMCI_Test(armci_hdl_t *usr_hdl) { armci_ihdl_t nb_handle = (armci_ihdl_t)usr_hdl; int success=0; #ifdef BGML success=(int)nb_handle->count; #else int direct=SAMECLUSNODE(nb_handle->proc); if(direct)return(success); if(nb_handle) { if(nb_handle->agg_flag) { armci_die("test for aggregate handle not yet implemented\n",0); } } if(nb_handle){ #ifdef ARMCI_NB_TEST if(nb_handle->tag==0){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } #ifdef LAPI if(nb_handle->tag!=0 && nb_handle->bufid==NB_NONE){ ARMCI_NB_TEST(nb_handle->cmpl_info,&success); return(success); } #endif #endif #ifdef TEST_HANDLE TEST_HANDLE(nb_handle->bufid,nb_handle->tag,(&success)); #endif } #endif return(success); } ga-5-4/armci/src/progress/fence.c0000644000175000017500000000414512662210406015005 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "armcip.h" #include "armci.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if defined(PVM) # include #elif defined(TCGMSG) # include static void tcg_synch(long type) { long atype = type; SYNCH_(&atype); } #elif defined(BGML) # include "bgml.h" #else # include #endif char *_armci_fence_arr; void armci_init_fence() { #if defined (DATA_SERVER) || defined(PORTALS) #if defined(THREAD_SAFE) _armci_fence_arr = calloc(armci_nproc*armci_user_threads.max,1); #else _armci_fence_arr=calloc(armci_nproc,1); #endif if(!_armci_fence_arr) armci_die("armci_init_fence: calloc failed",0); #endif } void armci_finalize_fence() { #if defined (DATA_SERVER) || defined(PORTALS) free(_armci_fence_arr); _armci_fence_arr = NULL; #endif } #ifdef PORTALS void armci_update_fence_array(int proc, int inc) { if (inc) FENCE_ARR(proc)++; else FENCE_ARR(proc)--; } #endif void PARMCI_Fence(int proc) { #if defined(DATA_SERVER) && !(defined(GM) && defined(ACK_FENCE)) if(FENCE_ARR(proc) && (armci_nclus >1)){ int cluster = armci_clus_id(proc); int master = armci_clus_info[cluster].master; armci_rem_ack(cluster); bzero(&FENCE_ARR(master), armci_clus_info[cluster].nslave); } #elif defined(ARMCIX) ARMCIX_Fence (proc); #elif defined(BGML) BGML_WaitProc(proc); MEM_FENCE; #else FENCE_NODE(proc); MEM_FENCE; #endif } void PARMCI_AllFence() { #if defined(ARMCIX) ARMCIX_AllFence (); #elif defined(BGML) BGML_WaitAll(); #elif defined(LAPI) || defined(CLUSTER) int p; for(p = 0;p < armci_nproc; p++) { PARMCI_Fence(p); } #endif MEM_FENCE; } void PARMCI_Barrier() { if (armci_nproc==1) return; #if defined(BGML) BGML_WaitAll(); bgml_barrier(3); #else PARMCI_AllFence(); # ifdef MSG_COMMS_MPI MPI_Barrier(ARMCI_COMM_WORLD); # else { long type=ARMCI_TAG; tcg_synch(type); } # endif #endif MEM_FENCE; } ga-5-4/armci/src/devices/0000755000175000017500000000000012662210404013331 5ustar mbambaga-5-4/armci/src/devices/gemini/0000755000175000017500000000000012662210402014577 5ustar mbambaga-5-4/armci/src/devices/mpi-mt/0000755000175000017500000000000012662210402014532 5ustar mbambaga-5-4/armci/src/devices/mpi-mt/mpi2_server.c0000644000175000017500000002326112662210402017137 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include /** * mpi2_server.c: MPI_SPAWN Server Code * Manojkumar Krishnan */ #if HAVE_STDARG_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STDLIB_H # include #endif #include "mpi.h" #include "armcip.h" #include "mpi2.h" #include "kr_malloc.h" #include "locks.h" /* Inter-communicators for communicating with clients */ /* Abhinav Vishnu */ void armci_mpi2_server_init_twosided(); MPI_Comm MPI_COMM_SERVER2CLIENT = MPI_COMM_NULL; static int armci_server_me=-1, armci_nserver=-1; static int armci_client_first=-1, armci_nclients=-1; extern Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize); #if MPI_SPAWN_DEBUG void armci_mpi2_server_debug(int rank, const char *format, ...) { va_list arg; if(rank == armci_server_me) { va_start(arg, format); printf("**** Server %d: ", armci_server_me); vprintf(format, arg); va_end(arg); fflush(stdout); } } #else # define armci_mpi2_server_debug(x, ...) #endif #if 1 static inline int MPI_Check (int status) { if(status != MPI_SUCCESS) { armci_mpi2_server_debug(armci_me, "MPI Check failed.\n"); armci_die("MPI_Check failed.", 0); } } #else # define MPI_Check(x) x #endif void armci_mpi_strided_s2c(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; MPI_Status status; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } if(op == SEND) { MPI_Check( MPI_Send(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_SERVER2CLIENT_TAG, comm) ); } else /* ( op == RECV) */ { MPI_Check( MPI_Recv(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_CLIENT2SERVER_TAG, comm, &status) ); } } } void check_comm() { int result; assert(SERVER_CONTEXT); assert(ARMCI_COMM_WORLD != MPI_COMM_NULL); } /************************************************************************** * Platform specific server code as required by the ARMCI s/w layer. (BEGIN) */ /* establish connections with client (i.e compute) processes */ void armci_server_initial_connection() { armci_mpi2_server_init_twosided(); armci_mpi2_server_debug(0, "armci_server_initial_connection\n"); } /* close all open connections, called before terminating/aborting */ void armci_transport_cleanup() { #if 0 /* armci_transport_cleanup is called by all procs (clients and servers). Therefore, only in server case we need to finalize MPI before exit. */ if(ARMCI_COMM_WORLD != MPI_COMM_NULL) { armci_mpi2_server_debug(0, "Calling MPI_Finalize\n"); MPI_Finalize(); exit(EXIT_SUCCESS); /* server termination */ } #endif } static void armci_mpi_rcv_strided_data(request_header_t *msginfo, void *vdscr, int from) { int bytes; void *ptr; char *dscr; int stride_levels, *stride_arr, *count; bytes = msginfo->dscrlen; dscr = (char*)(msginfo + 1); *(void**)vdscr = (void *)dscr; ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; dscr += (stride_levels+1)*sizeof(int); check_comm(); { armci_mpi_strided_s2c(RECV, ptr, stride_levels, stride_arr, count, from, ARMCI_COMM_WORLD); } } static void armci_mpi_rcv_vector_data(request_header_t *msginfo, void *vdscr, int proc) { armci_die("armci_mpi_rcv_vector_data(): Not yet implemented!", 0); } /* server receives request */ void armci_rcv_req (void *mesg, void *phdr, void *pdescr, void *pdata, int *buflen) { request_header_t *msginfo = NULL; int hdrlen = sizeof(request_header_t); int p=-1; int bytes; check_comm(); MPI_Status status; msginfo = (request_header_t*) MessageRcvBuffer; p = * (int *) mesg; MPI_Check( MPI_Recv(MessageRcvBuffer, MSG_BUFLEN, MPI_BYTE, p, ARMCI_MPI_CLIENT2SERVER_TAG, ARMCI_COMM_WORLD, &status) ); * (void **) phdr = msginfo; if( !(p >= 0 && p < armci_nproc) ) armci_die("armci_rcv_req: request from invalid client", p); armci_mpi2_server_debug(armci_server_me, "armci_rcv_req: op=%d mesg=%p, phdr=%p " "pdata=%p, buflen=%p, p=%d\n", msginfo->operation, mesg, phdr, pdata, buflen, p, MSG_BUFLEN); #ifdef MPI_SPAWN_ZEROCOPY assert(0); #endif *buflen = MSG_BUFLEN - hdrlen; if (msginfo->operation == GET) { bytes = msginfo->dscrlen; } else { bytes = msginfo->bytes; if (bytes > *buflen) armci_die2("armci_rcv_req: message overflowing rcv buf", msginfo->bytes, *buflen); } if (msginfo->bytes) { * (void **) pdescr = msginfo + 1; * (void **) pdata = msginfo->dscrlen + (char *) (msginfo+1); *buflen -= msginfo->dscrlen; if (msginfo->operation != GET && msginfo->datalen) { *buflen -= msginfo->datalen; } } else { * (void**) pdata = msginfo + 1; * (void**) pdescr = NULL; } if (msginfo->datalen > 0 && msginfo->operation != GET) { if (msginfo->datalen > (MSG_BUFLEN - hdrlen - msginfo->dscrlen)) { armci_die2("armci_rcv_req:data overflowing buffer", msginfo->dscrlen, msginfo->datalen); } *buflen -= msginfo->datalen; } } /* server sends data back to client */ void armci_WriteToDirect (int to, request_header_t *msginfo, void *data) { armci_mpi2_server_debug(armci_server_me, "armci_WriteToDirect: " "to=%d, msginfo=%p, data=%p, bytes=%d\n", to, msginfo, data, msginfo->datalen); if( !(to >= 0 && to < armci_nproc) ) armci_die("armci_WriteToDirect: send request to invalid client", to); check_comm(); MPI_Check( MPI_Send(data, msginfo->datalen, MPI_BYTE, to, ARMCI_MPI_SERVER2CLIENT_TAG, ARMCI_COMM_WORLD) ); } /*\ server sends strided data back to client \*/ void armci_WriteStridedToDirect(int to, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { armci_mpi2_server_debug(armci_server_me, "armci_WriteStridedToDirect: " "to=%d, stride_levels=%d, bytes=%d\n", to, strides, msginfo->datalen); check_comm(); { armci_mpi_strided_s2c(SEND, ptr, strides, stride_arr, count, to, ARMCI_COMM_WORLD); } } void armci_call_data_server() { int p=-1; MPI_Status status; armci_mpi2_server_debug(0, "armci_call_data_server(): Server main loop\n"); int result; check_comm(); /* server main loop; wait for and service requests until QUIT requested */ int flag = 0; for(;;) { #if 1 while (!flag) { MPI_Check( MPI_Iprobe(MPI_ANY_SOURCE, ARMCI_MPI_CLIENT2SERVER_TAG, ARMCI_COMM_WORLD, &flag, &status) ); } #else MPI_Check( MPI_Probe(MPI_ANY_SOURCE, ARMCI_MPI_CLIENT2SERVER_TAG, ARMCI_COMM_WORLD, &status) ); #endif flag = 0; p = status.MPI_SOURCE; assert((p>= 0) && (p < armci_nproc)); armci_mpi2_server_debug(armci_server_me, "Processing message from client %d\n", p); armci_data_server(&p); } } /** * Platform specific server code ENDs here. **************************************************************************/ static void emulate_armci_init_clusinfo() { assert(0); } static void emulate_armci_allocate_locks(long *shm_info) { assert(0); } /* Abhinav Vishnu */ void armci_mpi2_server_init_twosided() { int namelen, version, subversion; char processor_name[MPI_MAX_PROCESSOR_NAME]; long shm_info[3]; MPI_Status status; assert(ARMCI_COMM_WORLD != MPI_COMM_NULL); MPI_Check(MPI_Comm_rank(ARMCI_COMM_WORLD, &armci_server_me)); armci_nserver = armci_nclus; MPI_Check(MPI_Get_processor_name(processor_name, &namelen)); MPI_Check(MPI_Get_version(&version, &subversion)); } void armci_mpi2_server_init() { assert(0); } void armci_mpi2_server() { assert(0); } void armci_comm_dup_server(MPI_Comm * comm) { /* Do nothing */ } ga-5-4/armci/src/devices/mpi-mt/mpi2.h0000644000175000017500000000274612662210402015563 0ustar mbamba#ifndef MPI2_H #define MPI2_H #include #define MPI_SPAWN_DEBUG 0 #undef MPI_SPAWN_ZEROCOPY /* enables zero-copy for large requests */ #ifdef MPI_SPAWN_ZEROCOPY # define MPI_USER_DEF_DATATYPE /* Enables MPI userdefined type for non-contig * data, if MPI_SPAWN_ZEROCOPY is enabled */ #endif /* uncomment MULTIPLE_BUFS macro definition to disable multiple buffers */ #undef MULTIPLE_BUFS #define ARMCI_MPI_SPAWN_INIT_TAG 1000 #define ARMCI_MPI_SPAWN_TAG 2000 #define ARMCI_MPI_SPAWN_DATA_TAG 3000 #define ARMCI_MPI_SPAWN_VDATA_TAG 4000 #define ARMCI_MPI_CLIENT2SERVER_TAG 4500 #define ARMCI_MPI_SERVER2CLIENT_TAG 5000 /* In case of multiple buffers, we use tags from 2001 to 2999 (999 tags * total) to ensure flow control at the server side */ #define ARMCI_MPI_SPAWN_TAG_BEGIN 2001 #define ARMCI_MPI_SPAWN_TAG_END 2999 #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release #define COMPLETE_HANDLE _armci_buf_complete_nb_request #define TEST_HANDLE _armci_buf_test_nb_request #define SEND 0 #define RECV 1 extern void armci_mpi_strided(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm); extern void armci_mpi_strided2(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm); #endif /* MPI2_H */ ga-5-4/armci/src/devices/mpi-mt/mpi2_client.c0000644000175000017500000002052212662210402017104 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** * MPI_SPAWN: ARMCI on top of MPI Multithreaded * Abhinav Vishnu */ #if HAVE_STDARG_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #include "mpi.h" #include "mpi2.h" #include "armcip.h" #include "request.h" #include "armci_shmem.h" #include "locks.h" #include #define ARMCI_ROOT 0 /* root process */ /* Inter-communicators for communicating between clients and data servers */ MPI_Comm MPI_COMM_CLIENT2SERVER=MPI_COMM_NULL; static int armci_nserver=-1; static int *_armci_mpi_tag=NULL; extern char ***_armci_argv; extern int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize); #if MPI_SPAWN_DEBUG void armci_mpi2_debug(int rank, const char *format, ...) { va_list arg; if(rank == armci_me) { va_start(arg, format); printf("%d: ", rank); vprintf(format, arg); va_end(arg); fflush(stdout); } } #else #define armci_mpi2_debug(x, ...) #endif #if MPI_SPAWN_DEBUG static inline int MPI_Check (int status) { if(status != MPI_SUCCESS) { armci_mpi2_debug(armci_me, "MPI Check failed.\n"); armci_die("MPI_Check failed.", 0); } } #else # define MPI_Check(x) x #endif /************************************************************************** * Platform specific server code as required by the ARMCI s/w layer. (BEGIN) */ /* Create connections between clients and servers */ void armci_init_connections() { armci_mpi2_debug(0, "armci_init_connections\n"); _armci_buf_init(); /* CHECK: Is this correct ? */ MPI_Check(MPI_Barrier(ARMCI_COMM_WORLD)); /* Abhinav Vishnu */ armci_create_server_MPIprocess(); armci_mpi2_debug(0, "armci_init_connections completed\n"); } void armci_wait_for_server() { armci_mpi2_debug(0, "armci_wait_for_server: wait for server to quit\n"); if (armci_me == armci_master) { armci_serv_quit(); } } void armci_client_connect_to_servers() { /* Abhinav Vishnu */ } /* NOTE: armci_mpi_strided and armci_mpi_strided2 are the only 2 functions * that are common to client and server part */ void armci_mpi_strided_c2s(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; MPI_Status status; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } if(op == SEND) { MPI_Check( MPI_Send(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_CLIENT2SERVER_TAG, comm) ); } else /* ( op == RECV) */ { MPI_Check( MPI_Recv(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_SERVER2CLIENT_TAG, comm, &status) ); } } } /* This is the only function that is common to client and server part */ void armci_mpi_strided2(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm) { /* Not supported */ assert(0); } /*\ client sends request message to server \*/ int armci_send_req_msg (int proc, void *buf, int bytes) { int clus_id = armci_clus_id(proc); int server ; /* Abhinav Vishnu */ server = armci_clus_info[clus_id].master; armci_mpi2_debug(armci_me, "armci_send_req_msg(): proc=%d, server=%d, " "buf=%p, bytes=%d\n", proc, server, buf, bytes); MPI_Check( MPI_Send(buf, bytes, MPI_BYTE, server, ARMCI_MPI_CLIENT2SERVER_TAG, ARMCI_COMM_WORLD) ); armci_mpi2_debug(armci_me, "armci_send_req_msg(): send msg to server(%d), to" "fwd to client %d\n", server, proc); return 0; } /*\ client sends strided data + request to server \*/ int armci_send_req_msg_strided(int proc, request_header_t *msginfo,char *ptr, int strides, int stride_arr[], int count[]) { int server; int clus_id = armci_clus_id(proc); int bytes; /* Abhinav Vishnu */ server = armci_clus_info[clus_id].master; armci_mpi2_debug(armci_me, "armci_send_req_msg_strided: proc=%d server=%d " "bytes=%d (op=%d)\n", proc, server, msginfo->datalen, msginfo->operation); /* we write header + descriptor of strided data */ bytes = sizeof(request_header_t) + msginfo->dscrlen; armci_send_req_msg(proc, msginfo, bytes); { /* for larger blocks write directly thus avoiding memcopy */ armci_mpi_strided_c2s(SEND, ptr, strides, stride_arr, count, server, ARMCI_COMM_WORLD); } armci_mpi2_debug(armci_me, "armci_send_req_msg_strided(): send msg to " "server(%d), to fwd to client %d\n", server, proc); return 0; } /*\ client receives data from server \*/ char *armci_ReadFromDirect (int proc, request_header_t *msginfo, int len) { int server; int clus_id = armci_clus_id(proc); MPI_Status status; server = armci_clus_info[clus_id].master; armci_mpi2_debug(armci_me, "armci_ReadFromDirect: proc=%d, server=%d, " "msginfo=%p, bytes=%d (op=%d)\n", proc, server, msginfo, len, msginfo->operation); MPI_Check( MPI_Recv(msginfo + 1, len, MPI_BYTE, server, ARMCI_MPI_SERVER2CLIENT_TAG, ARMCI_COMM_WORLD, &status) ); armci_mpi2_debug(armci_me, "recv msg from server(%d), fwd by client %d\n", server, proc); { int count; MPI_Get_count(&status, MPI_BYTE, &count); if (count != len) { armci_mpi2_debug(armci_me, "armci_ReadFromDirect: got %d bytes, " "expected %d bytes\n", count, len); armci_die("armci_ReadFromDirect: MPI_Recv failed.", count); } } return (char *) (msginfo+1); } /*\ client receives strided data from server \*/ void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { int server; int clus_id = armci_clus_id(proc); /* Abhinav Vishnu */ server = armci_clus_info[clus_id].master; armci_mpi2_debug(armci_me, "armci_ReadStridedFromDirect: proc=%d " "stride_levels=%d, server=%d bytes=%d (op=%d)\n", proc, strides, server, msginfo->datalen, msginfo->operation); { armci_mpi_strided_c2s(RECV, ptr, strides, stride_arr, count, server, ARMCI_COMM_WORLD); } } /** * Platform specific server code ENDs here. (END) **************************************************************************/ static void armci_gather_hostnames(char **hostname_arr) { /* Code must not flow through here */ assert(0); } /** * Create server processes. This is called in armci_start_server. * Must be called after armci_init_clusinfo(). */ void armci_create_server_MPIprocess () { int rank, size, flag, i; MPI_Check(MPI_Initialized(&flag)); if (flag == 0) armci_die("ARMCI error: MPI_Init must be called before PARMCI_Init()",0); MPI_Check(MPI_Comm_rank(ARMCI_COMM_WORLD, &rank)); MPI_Check(MPI_Comm_size(ARMCI_COMM_WORLD, &size)); armci_nserver = armci_nclus; /* makesure all processes sync here. CHECK: does it ensure global sync ? */ MPI_Check(MPI_Barrier(ARMCI_COMM_WORLD)); armci_mpi2_debug(0, "armci_create_server_MPIprocess: Servers spawned!\n"); } ga-5-4/armci/src/devices/portals/0000755000175000017500000000000012662210402015013 5ustar mbambaga-5-4/armci/src/devices/portals/portals.c0000644000175000017500000010223312662210402016644 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* preliminary implementation on top of portals */ /*there are 3 kinds of ARMCI memory: PARMCI_Malloc, PARMCI_Malloc_local, user * allocated memory. For PARMCI_Malloc, we use region specific md that * comes from completion descriptor. * For PARMCI_Malloc_local, we use the MD from the lochdl * For user allocated memory, we use another list of MD's * which binds the user memory. We never keep track of non-armci allocated * memory. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_FLOAT_H # include #endif #include "armcip.h" #include "message.h" #if HAVE_STDINT_H # include #endif #define DEBUG_COMM 0 #define DEBUG_INIT 0 #ifndef PMI_SUCCESS #define PMI_SUCCESS 0 #endif #ifdef CRAY_XT #include "locks.h" typedef struct { int off; int desc; } cnos_mutex_t; static cnos_mutex_t *_mutex_array; #endif /*global variables and data structures */ armci_portals_proc_t _armci_portals_proc_struct; armci_portals_proc_t *portals = &_armci_portals_proc_struct; comp_desc *_region_compdesc_array[PORTALS_MEM_REGIONS+1]; int ptl_initialized = 0; int free_desc_index[PORTALS_MEM_REGIONS+1]; FILE *utcp_lib_out; FILE* utcp_api_out; ptl_ni_limits_t armci_ptl_nilimits; int armci_init_portals(void) { int num_interface; int rc; int npes,i; comp_desc *armci_comp_desc; ptl_process_id_t match_id; ARMCI_PR_DBG("enter",0); if (PtlInit(&num_interface) != PTL_OK) { fprintf(stderr, "PtlInit() failed\n"); exit(1); } portals->ptl = 37; /* our own ptl number */ for(i=0;i<=PORTALS_MEM_REGIONS;i++){ free_desc_index[i]=0; } rc=PtlNIInit(IFACE_FROM_BRIDGE_AND_NALID(PTL_BRIDGE_UK,PTL_IFACE_SS), PTL_PID_ANY, NULL, &armci_ptl_nilimits, &(portals->ni_h)); switch(rc) { case PTL_OK: case PTL_IFACE_DUP: break; default: printf( "PtlNIInit() failed %d error=%s\n",rc,ptl_err_str[rc]); armci_die("NIInit Failed",0); } if(DEBUG_INIT || DEBUG_COMM) PtlNIDebug(portals->ni_h,PTL_DEBUG_ALL); PtlGetId(portals->ni_h,&portals->ptl_my_procid); if(DEBUG_INIT){ printf("%d:the rank is %d, size is %d\n",armci_me, portals->ptl_my_procid,portals->size); } if((rc=PMI_CNOS_Get_nidpid_map(&portals->ptl_pe_procid_map))!=PMI_SUCCESS){ printf("Getting proc map failed (npes=%d)\n", armci_nproc); } /* Allocate one shared event queue for all operations * TODO tune size. */ rc = PtlEQAlloc(portals->ni_h,1024,NULL, &(portals->eq_h)); if (rc != PTL_OK) { printf("%d:PtlEQAlloc() failed: %s (%d)\n", portals->ptl_my_procid, ptl_err_str[rc], rc); armci_die("EQ Alloc failed",rc); } ptl_initialized = 1; portals->num_match_entries = 0; #ifndef CRAY_XT utcp_lib_out = stdout; utcp_api_out = stdout; #endif /*now prepare for use of local memory*/ armci_comp_desc = (comp_desc *)malloc(sizeof(comp_desc)*MAX_OUT); for(i=0; i< MAX_OUT;i++){ ptl_md_t *md_ptr; ptl_handle_md_t *md_h; armci_comp_desc[i].active=0; md_ptr = &armci_comp_desc[i].mem_dsc; md_h = &armci_comp_desc[i].mem_dsc_hndl; md_ptr->eq_handle = portals->eq_h; md_ptr->max_size =0; md_ptr->threshold = 2;/*PTL_MD_THRESH_INF;*/ md_ptr->options = PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; } _region_compdesc_array[PORTALS_MEM_REGIONS]=armci_comp_desc; ARMCI_PR_DBG("exit",0); return 0; } void armci_fini_portals() { ARMCI_PR_DBG("enter",0); if(DEBUG_INIT){ printf("ENTERING ARMCI_FINI_PORTALS\n");fflush(stdout); } PtlNIFini(portals->ni_h); /*PtlFini();*/ if(DEBUG_INIT){ printf("LEAVING ARMCI_FINI_PORTALS\n");fflush(stdout); } ARMCI_PR_DBG("exit",0); } void armci_serv_register_req(void *start,long bytes, ARMCI_MEMHDL_T *reg_mem) { int rc; void * context; ptl_md_t *md_ptr; ptl_match_bits_t *mb; ptl_process_id_t match_id; ptl_handle_md_t *md_h; ptl_match_bits_t ignbits = 0xFFFFFFFFFFFFFFF0; ARMCI_PR_DBG("enter",reg_mem->regid); if(DEBUG_COMM){ printf("%d:armci_serv_register_req:size of mem_hndl is %d\n", armci_me,sizeof(region_memhdl_t)); printf("\n%d:armci_serv_register_req start=%p bytes=%d\n", armci_me,start,bytes);fflush(stdout); } md_ptr = ®_mem->cdesc.mem_dsc; mb = ®_mem->match_bits; md_h = ®_mem->cdesc.mem_dsc_hndl; context = NULL; md_ptr->start = start; md_ptr->length = bytes; md_ptr->threshold = PTL_MD_THRESH_INF; md_ptr->options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE; md_ptr->user_ptr = context; /*eq_hdl is null for the attaches done for a remote proc*/ /*md_ptr->eq_handle = portals->eq_h;*/ md_ptr->eq_handle = PTL_EQ_NONE; md_ptr->max_size =0; *mb = 0x0000000000000000; *mb = (*mb+reg_mem->regid); match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; rc = PtlMEAttach(portals->ni_h,portals->ptl,match_id,*mb,ignbits, PTL_RETAIN,PTL_INS_AFTER, &(portals->me_h[portals->num_match_entries])); if (rc != PTL_OK) { printf("%d:PtlMEAttach: %s\n", portals->ptl_my_procid, ptl_err_str[rc]); armci_die("portals attach error2",rc); } rc = PtlMDAttach(portals->me_h[portals->num_match_entries],*md_ptr,PTL_RETAIN,md_h); if (rc != PTL_OK) { printf("%d:PtlMDAttach: %s\n", portals->ptl_my_procid, ptl_err_str[rc]); armci_die("portals attach error1",rc); } portals->num_match_entries++; ARMCI_PR_DBG("exit",reg_mem->regid); } int armci_pin_contig_hndl(void *start,int bytes, ARMCI_MEMHDL_T *reg_mem) { int rc,i; void * context; ptl_md_t *md_ptr; ptl_process_id_t match_id; ptl_handle_md_t *md_h; comp_desc *armci_comp_desc; ARMCI_PR_DBG("enter",reg_mem->regid); /*first create comp_desc arr for this region if it is not local*/ if(!reg_mem->islocal){ armci_comp_desc = (comp_desc *)malloc(sizeof(comp_desc)*MAX_OUT); for(i=0; i< MAX_OUT;i++){ armci_comp_desc[i].active=0; md_ptr = &armci_comp_desc[i].mem_dsc; md_h = &armci_comp_desc[i].mem_dsc_hndl; context = NULL; md_ptr->start = start; md_ptr->length = bytes; md_ptr->threshold = 2;/*PTL_MD_THRESH_INF;*/ md_ptr->options = PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; /*md_ptr->options = PTL_MD_EVENT_START_DISABLE;*/ md_ptr->user_ptr = context; md_ptr->eq_handle = portals->eq_h; md_ptr->max_size =0; #ifdef DO_MD_UPDATE rc = PtlMDBind(portals->ni_h,*md_ptr, PTL_RETAIN, md_h); if (rc != PTL_OK){ printf("%d:PtlMDBind: %s\n", portals->ptl_my_procid, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } #endif } _region_compdesc_array[reg_mem->regid]=armci_comp_desc; ARMCI_PR_DBG("exit",0); return 1; } else { md_ptr = ®_mem->cdesc.mem_dsc; md_h = ®_mem->cdesc.mem_dsc_hndl; context = NULL; md_ptr->start = start; md_ptr->length = bytes; md_ptr->threshold = 2;/*PTL_MD_THRESH_INF;*/ md_ptr->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; md_ptr->user_ptr = context; md_ptr->eq_handle = portals->eq_h; md_ptr->max_size =0; #if DO_MD_UPDATE rc = PtlMDBind(portals->ni_h,*md_ptr, PTL_RETAIN, md_h); if (rc != PTL_OK){ printf("%d:PtlMDBind: %s\n", portals->ptl_my_procid, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } #endif ARMCI_PR_DBG("exit",1); return 1; } } int armci_client_complete(ptl_event_kind_t *evt,int proc_id, int nb_tag, comp_desc *cdesc) { int rc; ptl_event_t ev_t; ptl_event_t *ev=&ev_t; comp_desc *temp_comp = NULL; int loop=1; int temp_proc; ARMCI_PR_DBG("enter",0); if(DEBUG_COMM){ printf("\n%d:enter:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } while(cdesc->active!=0){ ev->type=0; if((rc = PtlEQWait(portals->eq_h, ev)) != PTL_OK){ printf("%d:PtlEQWait(): %d %s\n", portals->ptl_my_procid,rc, ptl_err_str[rc]); armci_die("EQWait problem",rc); } if (ev->ni_fail_type != PTL_NI_OK) { printf("%d:NI sent %d in event.\n", portals->ptl_my_procid, ev->ni_fail_type); armci_die("event failure problem",0); } if(DEBUG_COMM){ printf("\n%d:armci_client_complete:done waiting type=%d\n",armci_me, ev->type); fflush(stdout); } if (ev->type == PTL_EVENT_SEND_END){ if(DEBUG_COMM){ printf("\n%d:armci_client_complete:event send end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; #ifdef PUT_LOCAL_ONLY_COMPLETION if(temp_comp->type==ARMCI_PORTALS_PUT || temp_comp->type=ARMCI_PORTALS_NBPUT){ temp_comp->active=0; temp_comp->tag=-1; } else #else temp_comp->active++; #endif continue; } if (ev->type == PTL_EVENT_REPLY_END){ if(DEBUG_COMM){ printf("\n%d:client_send_complete:reply end\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; temp_comp->active = 0; /*this was a get request, so we are done*/ temp_comp->tag=-1; continue; } if (ev->type == PTL_EVENT_ACK){ if(DEBUG_COMM){ printf("\n%d:client_send_complete:event ack\n",armci_me); fflush(stdout); } temp_comp = (comp_desc *)ev->md.user_ptr; temp_comp->active=0; temp_comp->tag=-1; armci_update_fence_array(temp_comp->dest_id,0); portals->outstanding_puts--; } } if(DEBUG_COMM){ printf("\n%d:exit:client_complete active=%d tag=%d %d\n",armci_me, cdesc->active,cdesc->tag,nb_tag);fflush(stdout); } ARMCI_PR_DBG("exit",0); return rc; } comp_desc * get_free_comp_desc(int region_id, int * comp_id) { comp_desc * c; int rc = PTL_OK; ARMCI_PR_DBG("enter",region_id); c = &(_region_compdesc_array[region_id][free_desc_index[region_id]]); if(c->active!=0 && c->tag>0)armci_client_complete(NULL,c->dest_id,c->tag,c); #ifdef PUT_LOCAL_ONLY_COMPLETION if(region_idstart, md->length); fflush(stdout); } void armci_client_direct_get(int proc, void *src_buf, void *dst_buf, int bytes, void** cptr,int tag,ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { int clus = armci_clus_id(proc); int rc, i; ptl_size_t offset_local = 0, offset_remote=0; ptl_match_bits_t mb = remhdl->regid; ptl_md_t *md_remote,md, *md_local; ptl_md_t * md_ptr; ptl_handle_md_t *md_hdl_local; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int lproc,rproc,user_memory=0; ARMCI_PR_DBG("enter",remhdl->regid); if(DEBUG_COMM){ printf("%d:armci_client_direct_get:src_buf %p dstbuf %p loc_hd is %p\n" "rem_hndl is %p, BYTES = %d\n",armci_me,src_buf,dst_buf, lochdl,remhdl,bytes); fflush(stdout); } /*first process information*/ dest_proc.nid = portals->ptl_pe_procid_map[proc].nid; dest_proc.pid = portals->ptl_pe_procid_map[proc].pid; md_remote =&remhdl->cdesc.mem_dsc; /*updating md to send*/ if(lochdl == NULL){ /*this is user memory (stack/heap/whatever) */ user_memory=1; cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=dst_buf; } else { if(lochdl->islocal){ /*PARMCI_Malloc_local memory*/ user_memory=1; #if 1 cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=dst_buf; #else cdesc=&lochdl->cdesc; md_local = &lochdl->cdesc.mem_dsc; md_hdl_local = &lochdl->cdesc.mem_dsc_hndl; #endif } else{ /*we need to pass region id to get corresponding md*/ cdesc = get_free_comp_desc(lochdl->regid,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; } } /*compute the local and remote offsets*/ offset_local = (char*)dst_buf - (char *)md_local->start; offset_remote = (char*)src_buf - (char *)md_remote->start; if(DEBUG_COMM){ printf("\n%d:offr=%d offl=%d %p %p\n",armci_me,offset_remote,offset_local,md_local->start,md_remote->start); } /*printf("\n%d:get offr=%d ptrr=%p offl=%d ptrl=%p\n",armci_me,offset_remote,md_remote->start,offset_local,md_local->start);fflush(stdout);*/ if(tag) *((comp_desc **)cptr) = cdesc; /*if(tag){printf("\n%d:get tag=%d c_info=%d %p",armci_me,tag,c_info,cdesc);fflush(stdout);}*/ if (tag){ cdesc->tag = tag; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_NBGET; } else{ cdesc->tag = 0; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_GET; } cdesc->active = 1; md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_GET | PTL_MD_EVENT_START_DISABLE; #if DO_MD_UPDATE if(user_memory==0){ do{ rc = PtlMDUpdate(*md_hdl_local,NULL,md_local,portals->eq_h); printf("\n%d:trying to update\n",armci_me);fflush(stdout); } while (rc == PTL_MD_NO_UPDATE); if (rc != PTL_OK){ printf("%d:PtlMDUpdate: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } } else{ #endif rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } #if DO_MD_UPDATE } #endif rc = PtlGetRegion(*md_hdl_local,offset_local,bytes,dest_proc, portals->ptl, 0, mb, offset_remote); if (rc != PTL_OK){ printf("%d:PtlGetRegion: %s\n", portals->rank,ptl_err_str[rc]); armci_die("PtlGetRegion failed",0); } if(DEBUG_COMM){ printf("\n%d:issued get to %d %d\n",armci_me,proc,c_info);fflush(stdout); } if(!tag){ armci_client_complete(NULL,proc,0,cdesc); /* check this later */ } /*printf("\n%d:issued get to %d %d\n",armci_me,proc,c_info);fflush(stdout);*/ ARMCI_PR_DBG("exit",remhdl->regid); } void armci_client_nb_get(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag,ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { } int armci_client_direct_send(int proc,void *src, void* dst, int bytes, void **cptr, int tag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl ) { int clus = armci_clus_id(proc); int rc, i; ptl_size_t offset_local = 0, offset_remote = 0; ptl_match_bits_t mb = remhdl->regid; ptl_md_t *md_remote,md, *md_local; ptl_md_t * md_ptr; ptl_match_bits_t * mb_ptr; ptl_handle_md_t *md_hdl_local; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int lproc,rproc,user_memory=0; ARMCI_PR_DBG("enter",remhdl->regid); dest_proc.nid = portals->ptl_pe_procid_map[proc].nid; dest_proc.pid = portals->ptl_pe_procid_map[proc].pid; md_remote =&remhdl->cdesc.mem_dsc; if(lochdl == NULL){ /*this is user memory*/ user_memory=1; cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=src; } else { if(lochdl->islocal){ /*PARMCI_Malloc_local memory*/ user_memory=1; #if 1 cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; md_local->length=bytes; md_local->start=src; #else cdesc=&lochdl->cdesc; md_local = &lochdl->cdesc.mem_dsc; md_hdl_local = &lochdl->cdesc.mem_dsc_hndl; #endif } else{ /*we need to pass region id to get corresponding md*/ cdesc = get_free_comp_desc(lochdl->regid,&c_info); md_local = &cdesc->mem_dsc; md_hdl_local = &cdesc->mem_dsc_hndl; } } offset_local = (char *)src - (char *)md_local->start; offset_remote =(char *)dst - (char *)md_remote->start; if(DEBUG_COMM){ printf("\n%d:offr=%d offl=%d\n",armci_me,offset_remote,offset_local); } /*printf("\n%d:offr=%d ptrr=%p offl=%d ptrl=%p\n",armci_me,offset_remote,md_remote->start,offset_local,md_local->start);fflush(stdout);*/ if(tag) *((comp_desc **)cptr) = cdesc; /*TOED*/ /* if(tag){printf("\n%d:put tag=%d c_info=%d %p",armci_me,tag,c_info,cdesc);fflush(stdout);} */ if (tag){ cdesc->tag = tag; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_NBPUT; } else{ cdesc->tag = 0; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_PUT; } #ifdef PUT_LOCAL_COMPLETION_ONLY cdesc->active = 2; #else cdesc->active = 1; #endif md_local->user_ptr = (void *)cdesc; md_local->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; #if DO_MD_UPDATE if(user_memory==0){ do{ rc = PtlMDUpdate(*md_hdl_local,NULL,md_local,portals->eq_h); } while (rc == PTL_MD_NO_UPDATE); if (rc != PTL_OK){ printf("%d:PtlMDUpdate: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdupdate failed",0); } } else{ #endif rc = PtlMDBind(portals->ni_h,*md_local, PTL_UNLINK, md_hdl_local); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } #if DO_MD_UPDATE } #endif rc = PtlPutRegion(*md_hdl_local,offset_local,bytes, #ifdef PUT_LOCAL_COMPLETION_ONLY PTL_NOACK_REQ, #else PTL_ACK_REQ, #endif dest_proc, portals->ptl, 0, mb,offset_remote, 0); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlPutRegion: %s\n", portals->rank,ptl_err_str[rc]); armci_die("PtlPutRegion failed",0); } if(DEBUG_COMM){ printf("\n%d:issued put to %d\n",armci_me,proc);fflush(stdout); } armci_update_fence_array(proc, 1); if(!tag){ armci_client_complete(NULL,proc,0,cdesc); /* check this later */ } else portals->outstanding_puts++; ARMCI_PR_DBG("exit",remhdl->regid); return rc; } void armci_client_nb_send(int proc, void *src_buf, int *src_stride_arr, void *dst_buf, int *dst_stride_arr, int bytes, void** cptr,int tag,ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { } #if 1 /*using non-blocking for multiple 1ds inside a 2d*/ void armci_network_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle) { int i, j,tag=0; long idxs,idxd; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalues[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bvalued[MAX_STRIDE_LEVEL]; int bytes = count[0]; void *loc, *rem; void *sptr,*dptr; ARMCI_MEMHDL_T *loc_memhdl=NULL,*rem_memhdl=NULL; NB_CMPL_T cptr; int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl); if(nb_handle)tag=nb_handle->tag; if(op==GET){ loc = dst_ptr; rem = src_ptr; } else { loc = src_ptr; rem = dst_ptr; } armci_region_both_found_hndl(loc,rem,bytes,armci_clus_id(proc), &loc_memhdl,&rem_memhdl); /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalues[0] = 0; bvalues[1] = 0; bunit[0] = 1; bvalued[0] = 0; bvalued[1] = 0; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalues[i] = bvalued[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } if(ARMCI_ACC(op)){ /*lock here*/ printf("\nSHOULD NOT DO NETWORK_STRIDED FOR ACCS \n",armci_me); fflush(stdout); armci_die("network_strided called for acc",proc); } for(i=0; i (count[j]-1)) bvalues[j] = 0; if(bvalued[j] > (count[j]-1)) bvalued[j] = 0; } sptr = ((char *)src_ptr)+idxs; dptr = ((char *)dst_ptr)+idxd; if(op==GET){ armci_client_direct_get(proc,sptr,dptr,bytes,&cptr,tag,loc_memhdl, rem_memhdl); } else if(op==PUT){ armci_client_direct_send(proc,sptr,dptr,bytes,&cptr,tag,loc_memhdl, rem_memhdl); } else if(ARMCI_ACC(op)){ armci_client_direct_get(proc,sptr,dptr,bytes,&cptr,tag,loc_memhdl, rem_memhdl); /*DO ACC*/ armci_client_direct_send(proc,sptr,dptr,bytes,&cptr,tag,loc_memhdl, rem_memhdl); } else armci_die("in network_strided unknown opcode",op); } if(ARMCI_ACC(op)){ /*unlock here*/ } if(nb_handle){ nb_handle->tag=tag; nb_handle->cmpl_info=cptr; } else{ armci_client_complete(NULL,proc,tag,cptr); /* check this later */ } } #else /*using blocking for multiple 1ds inside a 2d*/ void armci_network_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle) { int i, j; long idxs,idxd; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalues[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; int bvalued[MAX_STRIDE_LEVEL]; int bytes = count[0]; void *loc, *rem; void *sptr,*dptr; #if 0 ARMCI_MEMHDL_T *loc_memhdl=NULL,*rem_memhdl=NULL; int armci_region_both_found_hndl(void *loc, void *rem, int size, int node, ARMCI_MEMHDL_T **loc_memhdl,ARMCI_MEMHDL_T **rem_memhdl); #endif if(op==GET){ loc = dst_ptr; rem = src_ptr; } else { loc = src_ptr; rem = dst_ptr; } #if 0 armci_region_both_found_hndl(loc,rem,count[0],armci_clus_id(proc), &loc_memhdl,&rem_memhdl); #endif /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalues[0] = 0; bvalues[1] = 0; bunit[0] = 1; bvalued[0] = 0; bvalued[1] = 0; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalues[i] = bvalued[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalues[j] = 0; if(bvalued[j] > (count[j]-1)) bvalued[j] = 0; } sptr = ((char *)src_ptr)+idxs; dptr = ((char *)dst_ptr)+idxd; if((i<(n1dim-1)) || nb_handle==NULL){ if(op==GET) PARMCI_Get(sptr,dptr,bytes,proc); else if(op==PUT) PARMCI_Put(sptr,dptr,bytes,proc); else if(ARMCI_ACC(op)) PARMCI_AccS(op,scale,sptr,NULL,dptr,NULL,count,1,proc); else armci_die("in network_strided unknown opcode",op); } } if(nb_handle!=NULL){ if(op==GET) PARMCI_NbGet(sptr,dptr,bytes,proc,(armci_hdl_t *)nb_handle); else if(op==PUT) PARMCI_NbPut(sptr,dptr,bytes,proc,(armci_hdl_t *)nb_handle); else if(ARMCI_ACC(op)) PARMCI_NbAccS(op,scale,sptr,NULL,dptr,NULL,count,1,proc,(armci_hdl_t *)nb_handle); else armci_die("in network_strided unknown opcode",op); } } #endif int armci_client_direct_getput(int proc,void *getinto, void *putfrom, void* dst, int bytes, void **cptr, int tag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl ) { int clus = armci_clus_id(proc); int rc, i; ptl_size_t offset_get = 0, offset_put=0, offset_remote = 0; ptl_match_bits_t mb = 100; ptl_md_t *md_remote,md, *md_local_put, *md_local_get; ptl_md_t * md_ptr; ptl_match_bits_t * mb_ptr; ptl_handle_md_t *md_hdl_local_put,*md_hdl_local_get; comp_desc *cdesc; ptl_process_id_t dest_proc; int c_info; int lproc,rproc; printf("\n%d:****************getput*********\n",armci_me); dest_proc.nid = portals->ptl_pe_procid_map[proc].nid; dest_proc.pid = portals->ptl_pe_procid_map[proc].pid; md_remote =&remhdl->cdesc.mem_dsc; cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local_get = &cdesc->mem_dsc; md_hdl_local_get = &cdesc->mem_dsc_hndl; md_local_get->length=bytes; md_local_get->start=getinto; offset_get = (char *)getinto - (char *)md_local_get->start; offset_remote =(char *)dst - (char *)md_remote->start; cdesc->tag = 999999; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_PUT; cdesc->active = 0; md_local_get->user_ptr = (void *)cdesc; md_local_get->options = PTL_MD_OP_GET | PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE | PTL_MD_EVENT_END_DISABLE; rc = PtlMDBind(portals->ni_h,*md_local_get, PTL_UNLINK, md_hdl_local_get); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } cdesc = get_free_comp_desc(PORTALS_MEM_REGIONS,&c_info); md_local_put = &cdesc->mem_dsc; md_hdl_local_put = &cdesc->mem_dsc_hndl; md_local_put->length=bytes; md_local_put->start=putfrom; offset_put = (char *)putfrom - (char *)md_local_put->start; cdesc->tag = 999999; cdesc->dest_id = proc; cdesc->type = ARMCI_PORTALS_GET; cdesc->active = 0; md_local_put->user_ptr = (void *)cdesc; md_local_put->options = PTL_MD_OP_PUT | PTL_MD_EVENT_START_DISABLE; rc = PtlMDBind(portals->ni_h,*md_local_put, PTL_UNLINK, md_hdl_local_put); if (rc != PTL_OK){ fprintf(stderr, "%d:PtlMDBind: %s\n", portals->rank, ptl_err_str[rc]); armci_die("ptlmdbind failed",0); } rc = PtlGetPutRegion(*md_hdl_local_get,offset_get,*md_hdl_local_put, offset_put,bytes,dest_proc, portals->ptl,0,mb,offset_remote, 0); if (rc != PTL_OK){ printf("%d:PtlPutRegion: %s\n", portals->rank,ptl_err_str[rc]); armci_die("PtlPutRegion failed",0); } if(DEBUG_COMM){ printf("\n%d:issued getput to %d\n",armci_me,proc);fflush(stdout); } armci_client_complete(NULL,proc,0,cdesc); /* check this later */ return rc; } void armci_network_client_deregister_memory(ARMCI_MEMHDL_T *mh) { } void armci_network_server_deregister_memory(ARMCI_MEMHDL_T *mh) { } #ifdef CRAY_XT_ static int num_locks=0; static long **all_locks; #define ARMCI_PORTALS_MAX_LOCKS 16 typedef struct { ptl_handle_md_t mem_dsc_h; ptl_handle_me_t me_lock_h; region_memhdl_t armci_portal_lock_memhdl; } armci_lock_struct; armci_lock_struct armci_portals_lock_st; void armcill_allocate_locks(int num) { ptl_md_t *md_ptr; ptl_match_bits_t *mb; ptl_process_id_t match_id; ptl_handle_md_t *md_h; int ace_any=1; int rc; long *my_locks; int elems; armci_lock_struct *armci_portals_lock=&armci_portals_lock_st; num_locks = num; if(DEBUG_COMM){ printf("%d:armci_allocate_locks num=%d\n", armci_me,num_locks); } if(MAX_LOCKSni_h, ace_any, (ptl_process_id_t){PTL_NID_ANY, PTL_PID_ANY}, PTL_PID_ANY, 128); if (rc != PTL_OK) { printf("%d: PtlACEntry() failed: %s\n", armci_me, ptl_err_str[rc]); armci_die("PtlACEntry failed",0); } #endif armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.start =&my_locks; armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.length = sizeof(my_locks); armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.threshold = PTL_MD_THRESH_INF; armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.options = PTL_MD_OP_PUT | PTL_MD_OP_GET | PTL_MD_MANAGE_REMOTE | PTL_MD_TRUNCATE | PTL_MD_EVENT_START_DISABLE; armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.max_size = 0; armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.user_ptr = NULL; armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc.eq_handle = PTL_EQ_NONE; match_id.nid = PTL_NID_ANY; match_id.pid = PTL_PID_ANY; /* Lockmaster needs a match entry for clients to access lock value. */ rc = PtlMEAttach(portals->ni_h, portals->ptl, match_id, /* source address */ 100, /* expected match bits */ 0, /* ignore bits to mask */ PTL_RETAIN, /* unlink when md is unlinked */ PTL_INS_AFTER, &armci_portals_lock->me_lock_h); if (rc != PTL_OK){ printf("%d: PtlMEAttach(): %s\n", armci_me, ptl_err_str[rc]); armci_die("PtlMEAttach in init_locks failed",0); } rc = PtlMDAttach(armci_portals_lock->me_lock_h, armci_portals_lock->armci_portal_lock_memhdl.cdesc.mem_dsc, PTL_RETAIN, &armci_portals_lock->mem_dsc_h); if (rc != PTL_OK) { printf("%d: PtlMDAttach(): %s\n", armci_me, ptl_err_str[rc]); armci_die("PtlMDAttach in init_locks failed",0); } } void armcill_lock(int mutex, int proc) { long getinto=0,putfrom=1; armci_lock_struct *armci_portal_lock=&armci_portals_lock_st; region_memhdl_t *rem_lock_hdl=&armci_portal_lock->armci_portal_lock_memhdl; printf("\n%d:in lock before\n",armci_me);fflush(stdout); do{ armci_client_direct_getput(proc,&getinto,&putfrom,(all_locks[proc]+mutex), sizeof(long), NULL, 0, NULL,rem_lock_hdl); }while(getinto!=0); printf("\n%d:in lock after\n",armci_me);fflush(stdout); } /*\ unlock specified mutex on node where process proc is running \*/ void armcill_unlock(int mutex, int proc) { long getinto=0,putfrom=0; armci_lock_struct *armci_portal_lock=&armci_portals_lock_st; region_memhdl_t *rem_lock_hdl=&armci_portal_lock->armci_portal_lock_memhdl; armci_client_direct_getput(proc,&getinto,&putfrom,(all_locks[proc]+mutex), sizeof(long), NULL, 0, NULL,rem_lock_hdl); } int armci_portals_rmw_(int op, int *ploc, int *prem, int extra, int proc) { return(0); } #endif void armci_portals_shmalloc_allocate_mem(int num_lks) { void **ptr_arr; void *ptr; armci_size_t bytes = 128; int i; ptr_arr = (void**)malloc(armci_nproc*sizeof(void*)); if(!ptr_arr) armci_die("armci_shmalloc_get_offsets: malloc failed", 0); bzero((char*)ptr_arr,armci_nproc*sizeof(void*)); PARMCI_Malloc(ptr_arr,bytes); return; } ga-5-4/armci/src/devices/portals/portals.h0000644000175000017500000000557712662210402016666 0ustar mbamba #ifndef PORTALS_H #define PORTALS_H /* portals header file */ #ifdef CRAY_XT #include #include #else #include #include P3_NAL #include #include #endif #define MAX_OUT 1000 #define MAX_ENT 64 #define MAX_PREPOST 1 #define HAS_RDMA_GET typedef enum op { ARMCI_PORTALS_PUT, ARMCI_PORTALS_NBPUT, ARMCI_PORTALS_GET, ARMCI_PORTALS_NBGET, ARMCI_PORTALS_ACC } armci_portals_optype; /* array of memory segments and corresponding memory descriptors */ typedef struct md_table{ ptl_md_t md; /* make this a ptr instead of struct */ void * start; void * end; int id; int bytes; ptl_match_bits_t mb; } md_table_entry_t; typedef struct desc{ int active; unsigned int tag; int dest_id; armci_portals_optype type; }comp_desc; typedef struct region_memhdl{ ptl_match_bits_t match_bits; ptl_size_t offset; ptl_md_t mem_dsc; ptl_handle_md_t mem_dsc_hndl; } region_memhdl_t; #define NB_CMPL_T int #define REGIONS_REQUIRE_MEMHDL #define ARMCI_MEMHDL_T region_memhdl_t /* structure of computing process */ typedef struct { int armci_rank; /* if different from portals_rank */ int rank; /* my rank*/ int size; /* size of the group */ ptl_handle_me_t me_h[64]; ptl_handle_md_t md_h[64]; ptl_handle_me_t mh; ptl_handle_md_t mdh; ptl_handle_eq_t eq_h; ptl_handle_ni_t ni_h; ptl_pt_index_t ptl; int outstanding_puts; int outstanding_gets; int outstanding_accs; void * buffers; /* ptr to head of buffer */ int num_match_entries; } armci_portals_proc_t; extern void print_mem_desc_table(void); extern int armci_init_portals(void); extern void armci_fini_portals(void); extern int armci_post_descriptor(ptl_md_t *md); extern int armci_prepost_descriptor(void* start, long bytes); extern ptl_size_t armci_get_offset(ptl_md_t md, void *ptr,int proc); extern int armci_get_md(void * start, int bytes , ptl_md_t * md, ptl_match_bits_t * mb); extern int armci_portals_put(ptl_handle_md_t md_h,ptl_process_id_t dest_id,int bytes,int mb,int local_offset, int remote_offset,int ack ); extern int armci_portals_get(ptl_handle_md_t md_h,ptl_process_id_t dest_id,int bytes,int mb,int local_offset, int remote_offset); extern comp_desc * get_free_comp_desc(int * c_info); extern int armci_client_direct_send(int proc,void *src, void* dst, int bytes, NB_CMPL_T *cmpl_info, int tag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl); extern int armci_portals_direct_get(void *src, void *dst, int bytes, int proc, int nbtag, NB_CMPL_T *cmpl_info); extern int armci_portals_complete(int nbtag, NB_CMPL_T *cmpl_info); extern void comp_desc_init(); extern int armci_client_complete(ptl_event_kind_t *evt,int proc_id, int nb_tag ,comp_desc * cdesc,int b_tag); #endif /* PORTALS_H */ ga-5-4/armci/src/devices/portals/armci_portals.h0000644000175000017500000000617312662210402020032 0ustar mbamba #ifndef PORTALS_H #define PORTALS_H /* portals header file */ #ifdef CRAY_XT #include #include #else #include #include P3_NAL #include #include #endif /*this should match regions.c*/ #define PORTALS_MEM_REGIONS 24 #define MAX_OUT_ORG 16 #define MAX_OUT 1 #define HAS_RDMA_GET typedef enum op { ARMCI_PORTALS_PUT, ARMCI_PORTALS_NBPUT, ARMCI_PORTALS_GET, ARMCI_PORTALS_NBGET, ARMCI_PORTALS_ACC } armci_portals_optype; /* array of memory segments and corresponding memory descriptors */ typedef struct md_table{ ptl_md_t md; /* make this a ptr instead of struct */ void * start; void * end; int id; int bytes; ptl_match_bits_t mb; } md_table_entry_t; typedef struct desc{ int active; int tag; int dest_id; armci_portals_optype type; ptl_md_t mem_dsc; ptl_md_t mem_dsc_save; ptl_handle_md_t mem_dsc_hndl; }comp_desc; typedef struct region_memhdl{ ptl_match_bits_t match_bits; int regid; int islocal; ptl_size_t offset; comp_desc cdesc; } region_memhdl_t; #define NB_CMPL_T comp_desc* #define REGIONS_REQUIRE_MEMHDL #define ARMCI_MEMHDL_T region_memhdl_t #define ARMCI_NB_WAIT(_cntr) if(_cntr){\ int rc;\ if(nb_handle->tag==_cntr->tag)\ rc = armci_client_complete(NULL,nb_handle->proc,nb_handle->tag,_cntr);\ } /* structure of computing process */ typedef struct { int armci_rank; /* if different from portals_rank */ int rank; /* my rank*/ int size; /* size of the group */ ptl_handle_me_t me_h[64]; ptl_handle_eq_t eq_h; ptl_handle_ni_t ni_h; ptl_pt_index_t ptl; int outstanding_puts; int outstanding_gets; int outstanding_accs; void * buffers; /* ptr to head of buffer */ int num_match_entries; cnos_nidpid_map_t *ptl_pe_procid_map; ptl_process_id_t ptl_my_procid; } armci_portals_proc_t; extern void print_mem_desc_table(void); extern int armci_init_portals(void); extern void armci_fini_portals(void); extern int armci_post_descriptor(ptl_md_t *md); extern int armci_prepost_descriptor(void* start, long bytes); extern ptl_size_t armci_get_offset(ptl_md_t md, void *ptr,int proc); extern int armci_get_md(void * start, int bytes , ptl_md_t * md, ptl_match_bits_t * mb); extern int armci_portals_put(ptl_handle_md_t md_h,ptl_process_id_t dest_id,int bytes,int mb,int local_offset, int remote_offset,int ack ); extern int armci_portals_get(ptl_handle_md_t md_h,ptl_process_id_t dest_id,int bytes,int mb,int local_offset, int remote_offset); extern comp_desc * get_free_comp_desc(int,int *); extern int armci_client_direct_send(int proc,void *src, void* dst, int bytes, void **cmpl_info, int tag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl); extern int armci_portals_direct_get(void *src, void *dst, int bytes, int proc, int nbtag, NB_CMPL_T *cmpl_info); extern void comp_desc_init(); extern int armci_client_complete(ptl_event_kind_t *evt,int proc_id, int nb_tag ,comp_desc * cdesc); #endif /* PORTALS_H */ ga-5-4/armci/src/devices/mpi-spawn/0000755000175000017500000000000012662210404015244 5ustar mbambaga-5-4/armci/src/devices/mpi-spawn/mpi2_server.c0000644000175000017500000004210212662210404017644 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** * mpi2_server.c: MPI_SPAWN Server Code * Manojkumar Krishnan */ #if HAVE_STDARG_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STDLIB_H # include #endif #include "mpi.h" #include "armcip.h" #include "mpi2.h" #include "kr_malloc.h" #include "locks.h" /* Inter-communicators for communicating with clients */ MPI_Comm MPI_COMM_SERVER2CLIENT=MPI_COMM_NULL; static int armci_server_me=-1, armci_nserver=-1; static int armci_client_first=-1, armci_nclients=-1; extern Header *armci_get_shmem_ptr(int shmid, long shmoffset, size_t shmsize); /* ====================== MUltiple Buffers Code ======================== */ #ifdef MULTIPLE_BUFS #define MPI2_MAX_BUFS 10 typedef struct req_waitlist { int reqid; int p; int tag; struct req_waitlist *next; } req_waitlist_t; static double _mpi2_rcv_buf[MPI2_MAX_BUFS][MSG_BUFLEN_DBL]; static MPI_Request _mpi_request[MPI2_MAX_BUFS]; static int *_next_tag=NULL; static int _reqid_ready=0; static req_waitlist_t *_req_waitlist_head = NULL; static req_waitlist_t *_req_waitlist_tail = NULL; /* increment the tag value to maintain flowcontrol */ #define INCR_TAG(p) \ { \ if(++_next_tag[p] > ARMCI_MPI_SPAWN_TAG_END) \ _next_tag[p] = ARMCI_MPI_SPAWN_TAG_BEGIN; \ } static int wlist_get_req(int *p, int *tag, int *reqid) { req_waitlist_t *itr, *prev=NULL; for(itr=_req_waitlist_head; itr != NULL; itr=itr->next) { if(itr->tag == _next_tag[itr->p]) { /* mark the request id as ready to be processed, and update the * tag order and waitlist */ *p = itr->p; *tag = itr->tag; *reqid = itr->reqid; INCR_TAG(*p); /* remove this request from the waiting list */ if(itr==_req_waitlist_head) _req_waitlist_head = itr->next; if(itr==_req_waitlist_tail) _req_waitlist_tail = prev; if(prev != NULL) prev->next = itr->next; free(itr); return 1; } prev = itr; } return 0; } static void wlist_add_req(int reqid, int p, int tag) { req_waitlist_t *node = (req_waitlist_t *) malloc(sizeof(req_waitlist_t)); node->reqid = reqid; node->p = p; node->tag = tag; node->next = NULL; if(_req_waitlist_head == NULL) { _req_waitlist_head = node; _req_waitlist_tail = node; return; } /* append the new request at the end of the list */ _req_waitlist_tail->next = node; _req_waitlist_tail = node; } #endif /* ==================== END: Multiple Buffers Code ====================== */ #if MPI_SPAWN_DEBUG void armci_mpi2_server_debug(int rank, const char *format, ...) { va_list arg; if(rank == armci_server_me) { va_start(arg, format); printf("**** Server %d: ", armci_server_me); vprintf(format, arg); va_end(arg); fflush(stdout); } } #else # define armci_mpi2_server_debug(x, ...) #endif #if MPI_SPAWN_DEBUG static inline int MPI_Check (int status) { if(status != MPI_SUCCESS) { armci_mpi2_server_debug(armci_me, "MPI Check failed.\n"); armci_die("MPI_Check failed.", 0); } } #else # define MPI_Check(x) x #endif /************************************************************************** * Platform specific server code as required by the ARMCI s/w layer. (BEGIN) */ /* establish connections with client (i.e compute) processes */ void armci_server_initial_connection() { armci_mpi2_server_debug(0, "armci_server_initial_connection\n"); } /* close all open connections, called before terminating/aborting */ void armci_transport_cleanup() { /* armci_transport_cleanup is called by all procs (clients and servers). Therefore, only in server case we need to finalize MPI before exit. */ if(MPI_COMM_SERVER2CLIENT != MPI_COMM_NULL) { armci_mpi2_server_debug(0, "Calling MPI_Finalize\n"); MPI_Finalize(); exit(EXIT_SUCCESS); /* server termination */ } } static void armci_mpi_rcv_strided_data(request_header_t *msginfo, void *vdscr, int from) { int bytes; void *ptr; char *dscr; int stride_levels, *stride_arr, *count; bytes = msginfo->dscrlen; dscr = (char*)(msginfo + 1); *(void**)vdscr = (void *)dscr; ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; dscr += (stride_levels+1)*sizeof(int); #ifdef MPI_USER_DEF_DATATYPE if(stride_levels>0) { armci_mpi_strided2(RECV, ptr, stride_levels, stride_arr, count, from, MPI_COMM_SERVER2CLIENT); } else #endif { armci_mpi_strided(RECV, ptr, stride_levels, stride_arr, count, from, MPI_COMM_SERVER2CLIENT); } } static void armci_mpi_rcv_vector_data(request_header_t *msginfo, void *vdscr, int proc) { armci_die("armci_mpi_rcv_vector_data(): Not yet implemented!", 0); } /* server receives request */ void armci_rcv_req (void *mesg, void *phdr, void *pdescr, void *pdata, int *buflen) { request_header_t *msginfo = NULL; int hdrlen = sizeof(request_header_t); int p=-1; int bytes; #if !defined(MULTIPLE_BUFS) MPI_Status status; msginfo = (request_header_t*) MessageRcvBuffer; p = * (int *) mesg; MPI_Check( MPI_Recv(MessageRcvBuffer, MSG_BUFLEN, MPI_BYTE, p, ARMCI_MPI_SPAWN_TAG, MPI_COMM_SERVER2CLIENT, &status) ); #else int reqid = _reqid_ready;;/*get request id that is ready to be processed */ msginfo = (request_header_t*) _mpi2_rcv_buf[reqid]; p = * (int *) mesg; if(p != msginfo->from) armci_die("armci_rcv_req: invalid client", p); #endif * (void **) phdr = msginfo; if( !(p >= 0 && p < armci_nproc) ) armci_die("armci_rcv_req: request from invalid client", p); armci_mpi2_server_debug(armci_server_me, "armci_rcv_req: op=%d mesg=%p, phdr=%p " "pdata=%p, buflen=%p, p=%d\n", msginfo->operation, mesg, phdr, pdata, buflen, p, MSG_BUFLEN); #ifdef MPI_SPAWN_ZEROCOPY if(msginfo->operation==PUT && msginfo->datalen==0) { if(msginfo->format==STRIDED) { armci_mpi_rcv_strided_data(msginfo, pdescr, p); } if(msginfo->format==VECTOR) { armci_mpi_rcv_vector_data(msginfo, pdescr, p); } return; } #endif *buflen = MSG_BUFLEN - hdrlen; if (msginfo->operation == GET) { bytes = msginfo->dscrlen; } else { bytes = msginfo->bytes; if (bytes > *buflen) armci_die2("armci_rcv_req: message overflowing rcv buf", msginfo->bytes, *buflen); } #if MPI_SPAWN_DEBUG && !defined(MPI_SPAWN_ZEROCOPY) && 0 { int count; MPI_Get_count(&status, MPI_BYTE, &count); if (count != (bytes + hdrlen)) { armci_mpi2_server_debug(armci_server_me, "armci_rcv_req: " "got %d bytes, expected %d bytes\n", count, bytes + hdrlen); printf("%d: armci_rcv_req: got %d bytes, expected %d bytes (%d)\n", armci_me, count, bytes + hdrlen, msginfo->datalen); armci_die("armci_rcv_req: count check failed.\n", 0); } } #endif if (msginfo->bytes) { * (void **) pdescr = msginfo + 1; * (void **) pdata = msginfo->dscrlen + (char *) (msginfo+1); *buflen -= msginfo->dscrlen; if (msginfo->operation != GET && msginfo->datalen) { *buflen -= msginfo->datalen; } } else { * (void**) pdata = msginfo + 1; * (void**) pdescr = NULL; } if (msginfo->datalen > 0 && msginfo->operation != GET) { if (msginfo->datalen > (MSG_BUFLEN - hdrlen - msginfo->dscrlen)) { armci_die2("armci_rcv_req:data overflowing buffer", msginfo->dscrlen, msginfo->datalen); } *buflen -= msginfo->datalen; } } /* server sends data back to client */ void armci_WriteToDirect (int to, request_header_t *msginfo, void *data) { armci_mpi2_server_debug(armci_server_me, "armci_WriteToDirect: " "to=%d, msginfo=%p, data=%p, bytes=%d\n", to, msginfo, data, msginfo->datalen); if( !(to >= 0 && to < armci_nproc) ) armci_die("armci_WriteToDirect: send request to invalid client", to); MPI_Check( MPI_Send(data, msginfo->datalen, MPI_BYTE, to, ARMCI_MPI_SPAWN_TAG, MPI_COMM_SERVER2CLIENT) ); } /*\ server sends strided data back to client \*/ void armci_WriteStridedToDirect(int to, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { armci_mpi2_server_debug(armci_server_me, "armci_WriteStridedToDirect: " "to=%d, stride_levels=%d, bytes=%d\n", to, strides, msginfo->datalen); #ifdef MPI_USER_DEF_DATATYPE if(strides>0) { armci_mpi_strided2(SEND, ptr, strides, stride_arr, count, to, MPI_COMM_SERVER2CLIENT); } else #endif { armci_mpi_strided(SEND, ptr, strides, stride_arr, count, to, MPI_COMM_SERVER2CLIENT); } } void armci_call_data_server() { int p=-1; MPI_Status status; armci_mpi2_server_debug(0, "armci_call_data_server(): Server main loop\n"); #if !defined(MULTIPLE_BUFS) /* server main loop; wait for and service requests until QUIT requested */ for(;;) { MPI_Check( MPI_Probe(MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_TAG,MPI_COMM_SERVER2CLIENT, &status) ); p = status.MPI_SOURCE; armci_mpi2_server_debug(armci_server_me, "Processing message from client %d\n", p); armci_data_server(&p); } #else int i, tag, reqid, do_waitlist=0; /* server multiple bufs setup */ _req_waitlist_head = NULL; _req_waitlist_tail = NULL; /* Initialize "next tag" array, which manages flow control */ if( (_next_tag = (int*) malloc(armci_nproc*sizeof(int)) ) == NULL) armci_die("mpi2_server: _next_tag malloc failed", 0); for(i=0; itag; /* check if it is in or out of order request */ if(tag == _next_tag[p]) { INCR_TAG(p); } else { /* out of order req - enforce ordering by waitlisting this req */ wlist_add_req(reqid, p, tag); continue; } } /* mark the request id that is ready to processed */ _reqid_ready = reqid; /* server process the incoming (or waitlisted) request */ armci_data_server(&p); /* After completing the request (which also frees a buffer), server * posts a receive using this buffer */ MPI_Check( MPI_Irecv(_mpi2_rcv_buf[reqid], MSG_BUFLEN, MPI_BYTE, MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_TAG, MPI_COMM_SERVER2CLIENT, &_mpi_request[reqid]) ); } #endif } /** * Platform specific server code ENDs here. **************************************************************************/ static void emulate_armci_init_clusinfo() { int psize; MPI_Comm_remote_size(MPI_COMM_SERVER2CLIENT, &psize); /* server id (i.e. server's armci_me) is derived from node master's id. Similar to armci_create_server_process() to set SERVER_CONTEXT */ armci_me = SOFFSET - armci_client_first; armci_nproc = psize; armci_usr_tid = THREAD_ID_SELF(); /*remember the main user thread id */ armci_master = armci_client_first; /* ***** emulate armci_init_clusinfo() ***** */ armci_clus_me = armci_server_me; armci_nclus = armci_nserver; armci_clus_first = armci_clus_info[armci_clus_me].master; armci_clus_last = (armci_clus_first + armci_clus_info[armci_clus_me].nslave - 1); if(armci_clus_first != armci_client_first || armci_nclients != armci_clus_info[armci_clus_me].nslave) { armci_mpi2_server_debug(armci_server_me, "armci_clus_first=%d, armci_clus_last=%d\n", armci_clus_first, armci_clus_last); armci_die("mpi2_server: armci_clus_info is incorrect.", 0); } } static void emulate_armci_allocate_locks(long *shm_info) { int shmid = (int) shm_info[0]; long shmoffset = shm_info[1]; size_t shmsize = (size_t) shm_info[2]; _armci_int_mutexes = (PAD_LOCK_T*) armci_get_shmem_ptr(shmid, shmoffset, shmsize); } void armci_mpi2_server_init() { int namelen, version, subversion; char processor_name[MPI_MAX_PROCESSOR_NAME]; long shm_info[3]; MPI_Status status; MPI_Comm_rank(ARMCI_COMM_WORLD, &armci_server_me); MPI_Comm_size(ARMCI_COMM_WORLD, &armci_nserver); MPI_Get_processor_name(processor_name, &namelen); MPI_Get_version(&version, &subversion); armci_mpi2_server_debug(armci_server_me, "I'm %d of %d SERVERS running on %s (MPI %d.%d)\n", armci_server_me, armci_nserver, processor_name, version, subversion); /* get parent's groupinfo */ MPI_Comm_get_parent(&MPI_COMM_SERVER2CLIENT); if (MPI_COMM_SERVER2CLIENT == MPI_COMM_NULL) { armci_die("mpi2_server: Invalid spawn. No parent process found.\n",0); } /* receive my clients info */ { int msg[3]; MPI_Recv(msg, 3, MPI_INT, MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_INIT_TAG, MPI_COMM_SERVER2CLIENT, &status); if(msg[0]-ARMCI_MPI_SPAWN_INIT_TAG != armci_server_me) { armci_die("mpi2_server: Recv failed", msg[0]); } armci_client_first = msg[1]; armci_nclients = msg[2]; armci_mpi2_server_debug(armci_server_me, "My clients are [%d-%d]\n", armci_client_first, armci_client_first+armci_nclients-1); } /********************************************************************** * Emulate PARMCI_Init(). * Spawned Data server processes emulate PARMCI_Init() to complete the * ARMCI Initalization process similar to clients */ armci_clus_info =(armci_clus_t*)malloc(armci_nserver*sizeof(armci_clus_t)); if(armci_clus_info == NULL) { armci_die("mpi2_server: armci_clus_info malloc failed", 0); } /* receive and emulate clus info, lock info */ MPI_Recv(armci_clus_info, armci_nserver*sizeof(armci_clus_t), MPI_BYTE, armci_client_first, ARMCI_MPI_SPAWN_INIT_TAG, MPI_COMM_SERVER2CLIENT, &status); MPI_Recv(shm_info, 3, MPI_LONG, armci_client_first, ARMCI_MPI_SPAWN_INIT_TAG, MPI_COMM_SERVER2CLIENT, &status); /* server setup clusinfo&locks, exactly as this node's armci master */ emulate_armci_init_clusinfo(); /* armci_init_clusinfo() in PARMCI_Init */ emulate_armci_allocate_locks(shm_info); /* armci_allocate_locks() */ /* Fence data structures should be initialized by server too. see * armci_generic_rmw (called by armci_server_rmw) */ armci_init_fence(); /** * End of PARMCI_Init() emulation. * *******************************************************************/ MPI_Barrier(ARMCI_COMM_WORLD); } void armci_mpi2_server() { armci_mpi2_server_init(); armci_server_code(NULL); /* Should never come here */ armci_die("mpi2_server: server died in an unexpected manner", 0); } ga-5-4/armci/src/devices/mpi-spawn/mpi2.h0000644000175000017500000000262412662210404016270 0ustar mbamba#ifndef MPI2_H #define MPI2_H #include #define MPI_SPAWN_DEBUG 0 #define MPI_SPAWN_ZEROCOPY /* enables zero-copy for large requests */ #ifdef MPI_SPAWN_ZEROCOPY # define MPI_USER_DEF_DATATYPE /* Enables MPI userdefined type for non-contig * data, if MPI_SPAWN_ZEROCOPY is enabled */ #endif /* uncomment MULTIPLE_BUFS macro definition to disable multiple buffers */ #define MULTIPLE_BUFS #define ARMCI_MPI_SPAWN_INIT_TAG 1000 #define ARMCI_MPI_SPAWN_TAG 2000 #define ARMCI_MPI_SPAWN_DATA_TAG 3000 #define ARMCI_MPI_SPAWN_VDATA_TAG 4000 /* In case of multiple buffers, we use tags from 2001 to 2999 (999 tags * total) to ensure flow control at the server side */ #define ARMCI_MPI_SPAWN_TAG_BEGIN 2001 #define ARMCI_MPI_SPAWN_TAG_END 2999 #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release #define COMPLETE_HANDLE _armci_buf_complete_nb_request #define TEST_HANDLE _armci_buf_test_nb_request #define SEND 0 #define RECV 1 extern void armci_mpi_strided(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm); extern void armci_mpi_strided2(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm); #endif /* MPI2_H */ ga-5-4/armci/src/devices/mpi-spawn/mpi2_client.c0000644000175000017500000004142412662210404017622 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** * MPI_SPAWN: ARMCI on top of MPI. * Manojkumar Krishnan */ #if HAVE_STDARG_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #include "mpi.h" #include "mpi2.h" #include "armcip.h" #include "request.h" #include "armci_shmem.h" #include "locks.h" #define ARMCI_ROOT 0 /* root process */ /* Inter-communicators for communicating between clients and data servers */ MPI_Comm MPI_COMM_CLIENT2SERVER=MPI_COMM_NULL; static int armci_nserver=-1; static int *_armci_mpi_tag=NULL; extern char ***_armci_argv; extern int armci_get_shmem_info(char *addrp, int* shmid, long *shmoffset, size_t *shmsize); #if MPI_SPAWN_DEBUG void armci_mpi2_debug(int rank, const char *format, ...) { va_list arg; if(rank == armci_me) { va_start(arg, format); printf("%d: ", rank); vprintf(format, arg); va_end(arg); fflush(stdout); } } #else #define armci_mpi2_debug(x, ...) #endif #if MPI_SPAWN_DEBUG static inline int MPI_Check (int status) { if(status != MPI_SUCCESS) { armci_mpi2_debug(armci_me, "MPI Check failed.\n"); armci_die("MPI_Check failed.", 0); } } #else # define MPI_Check(x) x #endif /************************************************************************** * Platform specific server code as required by the ARMCI s/w layer. (BEGIN) */ /* Create connections between clients and servers */ void armci_init_connections() { armci_mpi2_debug(0, "armci_init_connections\n"); _armci_buf_init(); /* CHECK: Is this correct ? */ } void armci_wait_for_server() { armci_mpi2_debug(0, "armci_wait_for_server: wait for server to quit\n"); if (armci_me == armci_master) { armci_serv_quit(); } } void armci_client_connect_to_servers() { armci_mpi2_debug(0, "armci_client_connect_to_servers\n"); } /* NOTE: armci_mpi_strided and armci_mpi_strided2 are the only 2 functions * that are common to client and server part */ void armci_mpi_strided(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm) { int i, j; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; MPI_Status status; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } if(op == SEND) { MPI_Check( MPI_Send(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_SPAWN_DATA_TAG, comm) ); } else /* ( op == RECV) */ { MPI_Check( MPI_Recv(((char*)ptr)+idx, count[0], MPI_BYTE, proc, ARMCI_MPI_SPAWN_DATA_TAG, comm, &status) ); } } } /* This is the only function that is common to client and server part */ void armci_mpi_strided2(int op, void *ptr, int stride_levels, int stride_arr[], int count[], int proc, MPI_Comm comm) { int i, stride=1; MPI_Status status; MPI_Datatype type[MAX_STRIDE_LEVEL]; if(stride_levels == 0) { armci_mpi_strided(op, ptr, stride_levels, stride_arr, count, proc, comm); return; } /* convert stided data desciption to MPI type */ type[0] = MPI_BYTE; for(i=1; i<=stride_levels; i++) { stride *= stride_arr[i-1]; MPI_Check( MPI_Type_hvector(count[i], count[i-1], stride, type[i-1], &type[i]) ); } MPI_Check( MPI_Type_commit(&type[stride_levels]) ); if(op == SEND) { MPI_Check( MPI_Send(ptr, 1, type[stride_levels], proc, ARMCI_MPI_SPAWN_VDATA_TAG, comm) ); } else /* ( op == RECV) */ { MPI_Check( MPI_Recv(ptr, 1, type[stride_levels], proc, ARMCI_MPI_SPAWN_VDATA_TAG, comm, &status) ); } } /*\ client sends request message to server \*/ int armci_send_req_msg (int proc, void *buf, int bytes) { int server = armci_clus_id(proc); armci_mpi2_debug(armci_me, "armci_send_req_msg(): proc=%d, server=%d, " "buf=%p, bytes=%d\n", proc, server, buf, bytes); if( !(server >= 0 && server < armci_nserver) ) armci_die("armci_send_req_msg: Invalid server.", 0); #ifdef MULTIPLE_BUFS /** * Sequentially ordered tags to ensure flow control at the server side. * For example, a put followed by get from a client should be processed in * ORDER at the server side. If we don't have the flow control, the server * might process the get request first instead of put (and thus violating * ARMCI's ordering semantics. */ ((request_header_t*)buf)->tag = _armci_mpi_tag[server]; MPI_Check( MPI_Send(buf, bytes, MPI_BYTE, server, ARMCI_MPI_SPAWN_TAG, MPI_COMM_CLIENT2SERVER) ); _armci_mpi_tag[server]++; if(_armci_mpi_tag[server] > ARMCI_MPI_SPAWN_TAG_END) _armci_mpi_tag[server] = ARMCI_MPI_SPAWN_TAG_BEGIN; #else MPI_Check( MPI_Send(buf, bytes, MPI_BYTE, server, ARMCI_MPI_SPAWN_TAG, MPI_COMM_CLIENT2SERVER) ); #endif armci_mpi2_debug(armci_me, "armci_send_req_msg(): send msg to server(%d), to" "fwd to client %d\n", server, proc); return 0; } /*\ client sends strided data + request to server \*/ int armci_send_req_msg_strided(int proc, request_header_t *msginfo,char *ptr, int strides, int stride_arr[], int count[]) { int server = armci_clus_id(proc); int bytes; armci_mpi2_debug(armci_me, "armci_send_req_msg_strided: proc=%d server=%d " "bytes=%d (op=%d)\n", proc, server, msginfo->datalen, msginfo->operation); THREAD_LOCK(armci_user_threads.net_lock); /* we write header + descriptor of strided data */ bytes = sizeof(request_header_t) + msginfo->dscrlen; armci_send_req_msg(proc, msginfo, bytes); #ifdef MPI_USER_DEF_DATATYPE if(strides>0) { armci_mpi_strided2(SEND, ptr, strides, stride_arr, count, server, MPI_COMM_CLIENT2SERVER); } else #endif { /* for larger blocks write directly thus avoiding memcopy */ armci_mpi_strided(SEND, ptr, strides, stride_arr, count, server, MPI_COMM_CLIENT2SERVER); } THREAD_UNLOCK(armci_user_threads.net_lock); armci_mpi2_debug(armci_me, "armci_send_req_msg_strided(): send msg to " "server(%d), to fwd to client %d\n", server, proc); return 0; } /*\ client receives data from server \*/ char *armci_ReadFromDirect (int proc, request_header_t *msginfo, int len) { int server = armci_clus_id(proc); MPI_Status status; armci_mpi2_debug(armci_me, "armci_ReadFromDirect: proc=%d, server=%d, " "msginfo=%p, bytes=%d (op=%d)\n", proc, server, msginfo, len, msginfo->operation); if( !(server >= 0 && server < armci_nserver) ) armci_die("armci_ReadFromDirect: Invalid server.", 0); MPI_Check( MPI_Recv(msginfo + 1, len, MPI_BYTE, server, ARMCI_MPI_SPAWN_TAG, MPI_COMM_CLIENT2SERVER, &status) ); armci_mpi2_debug(armci_me, "recv msg from server(%d), fwd by client %d\n", server, proc); #if MPI_SPAWN_DEBUG { int count; MPI_Get_count(&status, MPI_BYTE, &count); if (count != len) { armci_mpi2_debug(armci_me, "armci_ReadFromDirect: got %d bytes, " "expected %d bytes\n", count, len); armci_die("armci_ReadFromDirect: MPI_Recv failed.", count); } } #endif return (char *) (msginfo+1); } /*\ client receives strided data from server \*/ void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { int server=armci_clus_id(proc); armci_mpi2_debug(armci_me, "armci_ReadStridedFromDirect: proc=%d " "stride_levels=%d, server=%d bytes=%d (op=%d)\n", proc, strides, server, msginfo->datalen, msginfo->operation); if( !(server >= 0 && server < armci_nserver) ) armci_die("armci_ReadStridedFromDirect: Invalid server.", 0); #ifdef MPI_USER_DEF_DATATYPE if(strides > 0) { armci_mpi_strided2(RECV, ptr, strides, stride_arr, count, server, MPI_COMM_CLIENT2SERVER); } else #endif { armci_mpi_strided(RECV, ptr, strides, stride_arr, count, server, MPI_COMM_CLIENT2SERVER); } } /** * Platform specific server code ENDs here. (END) **************************************************************************/ static void armci_gather_hostnames(char **hostname_arr) { int i, j, k, namelen, is_master; char hostname[MPI_MAX_PROCESSOR_NAME], *hostnames=NULL; int *master_arr=NULL; master_arr = (int*) malloc(armci_nproc * sizeof(int)); hostnames = (char*) malloc(armci_nproc * MPI_MAX_PROCESSOR_NAME * sizeof(char)); if(hostnames==NULL || master_arr==NULL) { armci_die("armci_gather_hostnames: malloc failed.", 0); } MPI_Get_processor_name(hostname, &namelen); MPI_Check( MPI_Allgather(hostname, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, hostnames, MPI_MAX_PROCESSOR_NAME, MPI_CHAR, ARMCI_COMM_WORLD) ); if(armci_me == armci_master) { is_master = 1; } else { is_master = 0; } MPI_Check(MPI_Allgather(&is_master, 1, MPI_INT, master_arr, 1, MPI_INT, ARMCI_COMM_WORLD)); { /* get only the hostname of armci master processes */ for(i=0,j=0,k=0; i=armci_nserver) armci_die("armci_gather_hostnames: Invalid masters.",0); strncpy(hostname_arr[j++], &hostnames[k], MPI_MAX_PROCESSOR_NAME); } k += MPI_MAX_PROCESSOR_NAME; } } free(hostnames); free(master_arr); } void select_server_program(char *server_program, int num_procs) { strcpy(server_program, (*_armci_argv)[0]); return; } static void armci_mpi2_spawn() { int i; char server_program[100]; char **command_arr=NULL, **hostname_arr=NULL, **nid_arr=NULL; int *size_arr=NULL; MPI_Info *info_arr; /* we need to start 1 data server process on each node. So a total of "armci_nclus" data servers */ armci_nserver = armci_nclus; select_server_program(server_program, armci_nserver); armci_mpi2_debug(0, "armci_mpi2_init(): Spawning %d data server processes " "running %s\n", armci_nserver, server_program); /* allocate necessary data structures */ { command_arr = (char**) malloc(armci_nserver * sizeof(char*)); size_arr = (int*) malloc(armci_nserver * sizeof(int)); info_arr = (MPI_Info*) malloc(armci_nserver * sizeof(MPI_Info)); hostname_arr = (char**) malloc(armci_nserver * sizeof(char*)); #ifdef SPAWN_CRAY_XT nid_arr = (char**) malloc(armci_nserver * sizeof(char*));; #endif for(i=0; i #endif #if HAVE_STRING_H # include #endif /* determine number of CPUs on the current SMP node- Linux version for now */ int armci_getnumcpus(void) { int numproc = 0; FILE* fp; char line[80]; fp = fopen("/proc/cpuinfo","r"); if(fp == NULL) return -1; while(!feof(fp)){ fgets(line,80,fp); if(strncmp(line,"processor",9)==0) numproc++; } fclose(fp); return numproc; } ga-5-4/armci/src/devices/openib/pendbufs.h0000644000175000017500000000476412662210405016600 0ustar mbamba/** @file Split buffer implementation. * @author Sriram Krishnamoorthy * * Supports multiple short/immediate buffers posted per client and a * client-independent number of buffers to handle large messages. */ #ifndef _PENDBUFS_H_ #define _PENDBUFS_H_ #if defined(PEND_BUFS) #include "armcip.h" #include "request.h" #define PBUF_RGUARD_SIZE 256 /**The buf should be the first field in immbuf_t and pendbuf_t. For example, look at openib.c:armci_rcv_req and maybe other places*/ typedef struct immbuf_t { char *buf; /*immediate buffer[IMMBUF_LEN]*/ /* IMMBUF_NW_T fields; */ char rguard[PBUF_RGUARD_SIZE]; IMMBUF_NW_T struct immbuf_t *immbuf_list_next; } immbuf_t; typedef struct pendbuf_t { char *buf; /*pending buffer[PENDBUF_LEN]*/ /* PENDBUF_NW_T fields; */ char rguard[PBUF_RGUARD_SIZE]; PENDBUF_NW_T int status; /* * Michael Welcome */ /* Copyright (c) 2002-2008, The Ohio State University. All rights * reserved. * * This file is part of the MVAPICH software package developed by the * team members of The Ohio State University's Network-Based Computing * Laboratory (NBCL), headed by Professor Dhabaleswar K. (DK) Panda. * * For detailed copyright and licensing information, please refer to the * copyright file COPYRIGHT_MVAPICH in the top level MPICH directory. * */ #define _XOPEN_SOURCE 600 #include "cbuf.h" #include /* * cbufs * * cbufs provide system buffers for VMPICH. They are analogous to mbufs * in BSD networking. * The primary motivation for cbufs is that implementing MPI on VIA * seems to requiring pre-posting a number of fixed-sized buffers. * These buffers must be registered (pinned). Life is easier if * they are all registered at once so there is only one memory * handle. We manage a fixed-size pool of cbufs that are * allocated and pinned when a progam starts up. We manage * the free cbuf list as a singly linked list. * * Two different ways to manage the free list as a singly-linked list. * 1. head and tail pointers. Add to tail, remove from head. * 2. only head pointer, treat as a stack. * * #1 Eliminates contention between adding to list and removing from list * Lock-free possible? * * #2 Has slightly less overhead when there is no contention, and is more * likely to produce a cbuf that is already in cache. * * Currently anticipate that most access near-term will be single-threaded, * so go with head only. (#2) */ /* head of list of allocated cbuf regions */ static cbuf_region *cbuf_region_head = NULL; /* * free_cbuf_head is the head of the free list */ static cbuf *free_cbuf_head = NULL; static int cbuf_n_allocated = 0; static long num_free_cbuf = 0; static long num_cbuf_get = 0; static long num_cbuf_free = 0; static pthread_spinlock_t cbuf_lock; int viadev_cbuf_max = -1; int viadev_cbuf_total_size = (2 * 1024); int viadev_cbuf_secondary_pool_size = 128; void init_cbuf_lock() { pthread_spin_init(&cbuf_lock, 0); } static void lock_cbuf() { pthread_spin_lock(&cbuf_lock); return; } static void unlock_cbuf() { pthread_spin_unlock(&cbuf_lock); return; } void dump_cbuf_region(cbuf_region * r) { } void dump_cbuf_regions() { cbuf_region *r = cbuf_region_head; while (r) { dump_cbuf_region(r); r = r->next; } } void deallocate_cbufs() { cbuf_region *r = cbuf_region_head; lock_cbuf(); while (r) { if (r->mem_handle != NULL) { /* free cbufs add it later */ } r = r->next; } unlock_cbuf(); } static void allocate_cbuf_region(int ncbufs) { struct cbuf_region *reg; void *mem; void *cbuf_dma_buffer; int i; cbuf *cur; int alignment_cbuf = 64; int alignment_dma; alignment_dma = getpagesize(); if (free_cbuf_head != NULL) { } if (ncbufs <= 0) { } /* are we limiting cbuf allocation? If so, make sure * we dont alloc more than allowed */ reg = (struct cbuf_region *) malloc(sizeof(struct cbuf_region)); if (NULL == reg) { } if(posix_memalign((void **) &mem, alignment_cbuf, ncbufs * sizeof(cbuf))) { } /* ALLOCATE THE DMA BUFFER */ if(posix_memalign((void **) &cbuf_dma_buffer, alignment_dma, ncbufs * viadev_cbuf_total_size)) { } memset(mem, 0, ncbufs * sizeof(cbuf)); memset(cbuf_dma_buffer, 0, ncbufs * viadev_cbuf_total_size); cbuf_n_allocated += ncbufs; num_free_cbuf += ncbufs; reg->malloc_start = mem; reg->malloc_buf_start = cbuf_dma_buffer; reg->malloc_end = (void *) ((char *) mem + ncbufs * sizeof(cbuf)); reg->malloc_buf_end = (void *) ((char *) cbuf_dma_buffer + ncbufs * viadev_cbuf_total_size); reg->count = ncbufs; free_cbuf_head = (cbuf *) ((aint_t) mem); reg->cbuf_head = free_cbuf_head; reg->mem_handle = armci_register_memory(cbuf_dma_buffer, ncbufs * viadev_cbuf_total_size); if (reg->mem_handle == NULL) { } /* init the free list */ for (i = 0; i < ncbufs - 1; i++) { cur = free_cbuf_head + i; cur->desc.next = free_cbuf_head + i + 1; cur->region = reg; #ifdef ADAPTIVE_RDMA_FAST_PATH #else cur->buffer = (unsigned char *) ((char *)(cbuf_dma_buffer) + (i * viadev_cbuf_total_size)); #endif } /* last one needs to be set to NULL */ cur = free_cbuf_head + ncbufs - 1; cur->desc.next = NULL; cur->region = reg; #ifdef ADAPTIVE_RDMA_FAST_PATH #else cur->buffer = (unsigned char *) ((char *)cbuf_dma_buffer + ((ncbufs - 1) * viadev_cbuf_total_size)); #endif /* thread region list */ reg->next = cbuf_region_head; cbuf_region_head = reg; } void allocate_cbufs(int ncbufs) { /* this function is only called by the init routines. * cache the nic handle and ptag for later cbuf_region allocations */ /* now allocate the first cbuf region */ allocate_cbuf_region(ncbufs); } /* * Get a cbuf off the free list */ cbuf *get_cbuf(void) { cbuf *v; lock_cbuf(); /* * It will often be possible for higher layers to recover * when no cbuf is available, but waiting for more descriptors * to complete. For now, just abort. */ if (NULL == free_cbuf_head) { allocate_cbuf_region(viadev_cbuf_secondary_pool_size); if (NULL == free_cbuf_head) { } } v = free_cbuf_head; num_free_cbuf--; num_cbuf_get++; /* this correctly handles removing from single entry free list */ free_cbuf_head = free_cbuf_head->desc.next; #ifdef ADAPTIVE_RDMA_FAST_PATH /* need to change this to RPUT_CBUF_FLAG or RGET_CBUF_FLAG later * if we are doing rput */ v->padding = NORMAL_CBUF_FLAG; #endif /* this is probably not the right place to initialize shandle to NULL. * Do it here for now because it will make sure it is always initialized. * Otherwise we would need to very carefully add the initialization in * a dozen other places, and probably miss one. */ v->shandle = NULL; v->ref_count = 0; v->len = 0; v->grank = -1; /* Make sure it is not inadvertantly used anywhere */ unlock_cbuf(); return (v); } /* * Put a cbuf back on the free list */ void release_cbuf(cbuf * v) { lock_cbuf(); /* note this correctly handles appending to empty free list */ assert(v != free_cbuf_head); v->desc.next = free_cbuf_head; #ifdef ADAPTIVE_RDMA_FAST_PATH #endif free_cbuf_head = v; num_free_cbuf++; num_cbuf_free++; unlock_cbuf(); } /* * fill in cbuf descriptor with all necessary info */ void cbuf_init_send(cbuf * v, unsigned long len) { v->desc.u.sr.next = NULL; v->desc.u.sr.send_flags = IBV_SEND_SIGNALED; v->desc.u.sr.opcode = IBV_WR_SEND; v->desc.u.sr.wr_id = (aint_t) v; v->desc.u.sr.num_sge = 1; v->desc.u.sr.sg_list = &(v->desc.sg_entry); v->desc.sg_entry.addr = (uintptr_t) v->buffer; v->desc.sg_entry.length = len; v->desc.sg_entry.lkey = v->region->mem_handle->lkey; } void cbuf_init_recv(cbuf * v, unsigned long len) { v->desc.u.rr.next = NULL; v->desc.u.rr.wr_id = (aint_t) v; v->desc.u.rr.num_sge = 1; v->desc.u.rr.sg_list = &(v->desc.sg_entry); v->desc.sg_entry.addr = (uintptr_t) v->buffer; v->desc.sg_entry.length = len; v->desc.sg_entry.lkey = v->region->mem_handle->lkey; #ifdef ADAPTIVE_RDMA_FAST_PATH v->padding = NORMAL_CBUF_FLAG; #endif } void cbuf_init_sendrecv(cbuf * v, unsigned long len) { } void cbuf_init_rput(cbuf * v, void *local_address, uint32_t lkey, void *remote_address, uint32_t rkey, int len) { v->desc.u.sr.next = NULL; v->desc.u.sr.send_flags = IBV_SEND_SIGNALED; v->desc.u.sr.opcode = IBV_WR_RDMA_WRITE; v->desc.u.sr.wr_id = (aint_t) v; v->desc.u.sr.num_sge = 1; v->desc.u.sr.sg_list = &(v->desc.sg_entry); v->desc.sg_entry.length = len; v->desc.sg_entry.lkey = lkey; v->desc.sg_entry.addr = (uintptr_t) local_address; v->desc.u.sr.wr.rdma.remote_addr = (uintptr_t) remote_address; v->desc.u.sr.wr.rdma.rkey = rkey; #ifdef ADAPTIVE_RDMA_FAST_PATH v->padding = RPUT_CBUF_FLAG; #endif } void cbuf_init_rget(cbuf * v, void *local_address, uint32_t lkey, void *remote_address, uint32_t rkey, int len) { v->desc.u.sr.next = NULL; v->desc.u.sr.send_flags = IBV_SEND_SIGNALED; v->desc.u.sr.opcode = IBV_WR_RDMA_READ; v->desc.u.sr.wr_id = (aint_t) v; v->desc.u.sr.num_sge = 1; v->desc.u.sr.sg_list = &(v->desc.sg_entry); v->desc.sg_entry.length = len; v->desc.sg_entry.lkey = lkey; v->desc.sg_entry.addr = (uintptr_t) local_address; v->desc.u.sr.wr.rdma.remote_addr = (uintptr_t) remote_address; v->desc.u.sr.wr.rdma.rkey = rkey; #ifdef ADAPTIVE_RDMA_FAST_PATH v->padding = RGET_CBUF_FLAG; #endif } /* * print out cbuf contents for debugging */ void dump_cbuf(char *msg, cbuf * v) { } #ifdef ADAPTIVE_RDMA_FAST_PATH #endif ga-5-4/armci/src/devices/openib/pendbufs.c0000644000175000017500000007027312662210405016571 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if defined(PEND_BUFS) #include "pendbufs.h" #include "armcip.h" #if HAVE_STDIO_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #define DEBUG_SERVER 0 /*-------------------Attributes-------------------------*/ /**Attributes to control buffer count and sizes. Implement this way to hide the global variables, and provide get/set methods.*/ #define NUM_ATTRIBUTES 4 #define ATTRIB_IMMBUF_LEN 0 #define ATTRIB_IMMBUF_NUM 1 #define ATTRIB_PNDBUF_LEN 2 #define ATTRIB_PNDBUF_NUM 3 /** List of hidden attributes and their operations. * @param attid IN Attribute id. Choose from the list above * @param gs IN Get(=0)/Set(=1) * @param v IN Value (used only when gs==1) * @return Value of the attribute on return */ static int att_ops(int attid, int gs, int v) { static not_first[NUM_ATTRIBUTES]; /*auto-init to zero*/ static val[NUM_ATTRIBUTES]; assert(attid>=0 && attidIMM_BUF_LEN*/ INIT=7, /**buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; assert(msginfo->tag.imm_msg == 0); pbuf = _armci_serv_pendbuf_getbuf(); if(pbuf) { pbuf->status = INIT; pbuf->avail = 0; pbuf->vbuf = vbuf; memcpy(pbuf->buf, vbuf->buf, sizeof(request_header_t)+msginfo->dscrlen); /* pbuf_proc_list_info[msginfo->from].waiting_on=pbuf; */ pbuf->order_prev = info->order_tail; if(info->order_tail) info->order_tail->order_next = pbuf; info->order_tail = pbuf; if(!info->order_head) info->order_head = pbuf; } return pbuf; } /**Free a pending buffer * @param pbuf IN Pointer to Pending buffer to be freed * @return none */ static void _armci_serv_pendbuf_freebuf(pendbuf_t *pbuf){ const request_header_t *msginfo = (request_header_t *)pbuf->buf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); assert(pbuf != NULL); pbuf->avail=1; pbuf->status = -1; pbuf->vbuf = NULL; /* assert(info->waiting_on == pbuf); */ /* info->waiting_on = NULL; */ if(pbuf->order_prev) pbuf->order_prev->order_next = pbuf->order_next; if(pbuf->order_next) pbuf->order_next->order_prev = pbuf->order_prev; if(info->order_head == pbuf) { assert(pbuf->order_prev == NULL); info->order_head = pbuf->order_next; } if(info->order_tail == pbuf) { assert(pbuf->order_next == NULL); info->order_tail = pbuf->order_prev; } pbuf->order_prev = pbuf->order_next = NULL; /*not necessary here*/ _nPendBufsUsed -= 1; assert(_nPendBufsUsed>=0); ARMCI_PR_DBG("exit",0); } #if 0 /*Messages are processed in-place in immediate buffers or issued into pending buffers for progress in order (like ONE_PBUF_PER_MESG). This rule relaxes ONE_PBUF_PER_MESG by allowing ACCs to be processed in-place/issued without waiting for the prior reqs to complete*/ static int _can_progress_accnoorder(immbuf_t *vbuf) { const request_header_t *msginfo=(request_header_t*)vbuf->buf; const int proc = msginfo->from; const proc_waitlist_t *info = &pbuf_proc_list_info[proc]; int i, nwaiting_on, nacc; pendbuf_t *ptr; assert(_pbufOrder == ACC_NO_ORDER); if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { /* printf("%d(s): op=%d from=%d datalen=%d waiting for pending buffers\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*This buffer needs a free pending buffer*/ } if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { /* printf("%d(s): op=%d from=%d datalen=%d not queue head\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*in order issue*/ } if(!ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } assert(ARMCI_ACC(msginfo->operation)); for(ptr=info->order_head; ptr!=NULL; ptr=ptr->order_next) { request_header_t *m = (request_header_t *)ptr->buf; assert(m->from == msginfo->from); if(!ARMCI_ACC(m->operation)) break; } if(ptr != NULL) return 0; return 1; } static int _can_progress_putaccsplitorder(immbuf_t*vbuf) { if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { return 0; } if(msginfo->operation!=PUT && !ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } if(IS_IMM_MSG(*msginfo) && info->order_head) return 0; return 1; } #endif /** Implement ordering between messages. This function needs to be * implemented in conjunction with @_armci_serv_pendbuf_promote to * ensure ordered processing of messages. * @param vbuf IN Message in immediate buffer being checked * @return 1 if the message can be progressed (either in-place or * after copying to a pending buffer). 0 therwise. */ static int _armci_serv_pendbuf_can_progress(immbuf_t *vbuf) { const request_header_t *msginfo=(request_header_t*)vbuf->buf; const int proc = msginfo->from; const proc_waitlist_t *info = &pbuf_proc_list_info[proc]; if(_pbufOrder == ONE_PBUF_MESG) { /*Only one pending buffer used at any time*/ if(_nPendBufsUsed>0) return 0; return 1; } if(_pbufOrder == ONE_PBUF_MESG_PER_PROC) { /*Only one non-immediate mesg can be assigned to the pending buffers at any time*/ if(info->order_head || (info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf)) { return 0;/*other requests from this process remain*/ } if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } assert(info->n_pending == 0 || info->immbuf_wlist_head==vbuf); return 1; } if(_pbufOrder == ACC_NO_ORDER) { /*Messages are processed in-place in immediate buffers or issued into pending buffers for progress in order (like ONE_PBUF_PER_MESG). This rule relaxes ONE_PBUF_PER_MESG by allowing a sequence of ACCs to be processed in-place/issued without waiting for the prior ones to complete*/ int i, nwaiting_on, nacc; pendbuf_t *ptr; if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { /* printf("%d(s): op=%d from=%d datalen=%d waiting for pending buffers\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*This buffer needs a free pending buffer*/ } #if 1 /*commented for now: it does work*/ if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } #endif if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { /* printf("%d(s): op=%d from=%d datalen=%d not queue head\n",armci_me,msginfo->operation,msginfo->from,msginfo->tag.data_len); */ /* fflush(stdout); */ return 0; /*in order issue*/ } if(!ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } assert(ARMCI_ACC(msginfo->operation)); for(ptr=info->order_head; ptr!=NULL; ptr=ptr->order_next) { request_header_t *m = (request_header_t *)ptr->buf; assert(m->from == msginfo->from); if(!ARMCI_ACC(m->operation)) break; } if(ptr != NULL) return 0; return 1; } if(_pbufOrder == PUTACC_SPLIT_ORDER) { if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { return 0; } if(msginfo->operation!=PUT && !ARMCI_ACC(msginfo->operation)) { if(info->order_head) return 0; return 1; } if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } if(IS_IMM_MSG(*msginfo) && info->order_head) return 0; return 1; } if(_pbufOrder == GET_GET_REORDER) { if(!IS_IMM_MSG(*msginfo) && _nPendBufsUsed==PENDING_BUF_NUM) { return 0; /*This buffer needs a free pending buffer*/ } if(IS_IMM_MSG(*msginfo) && ARMCI_ACC(msginfo->operation)) { return 1; } if(info->immbuf_wlist_head && info->immbuf_wlist_head!=vbuf) { return 0; } if(msginfo->operation!=PUT && !ARMCI_ACC(msginfo->operation)) { if(info->order_tail) { request_header_t *m=(request_header_t*)info->order_tail->buf; if(msginfo->operation==GET && m->operation == GET) { /* printf("%d: Get Get progressing\n", armci_me); */ return 1; } return 0; } return 1; } if(IS_IMM_MSG(*msginfo) && info->order_head) return 0; return 1; } armci_die("Unknown pbuf ordering rule",_pbufOrder); return 0; } /** Goes through the set of immediate buffers waiting to be processed * and completed, and identifies a buffer that can be processed * now. Removes it from the list and returns it. Promote also * considers availability of pending buffers if need be. * @return Pointer to buffer that can be processed now. NULL if none exists. */ static immbuf_t* _armci_serv_pendbuf_promote() { immbuf_t *immbuf = NULL; proc_waitlist_t *info; ARMCI_PR_DBG("enter",0); assert(_nPendBufsUsed>=0); if(!pbuf_ordering_plist_head) { return NULL; /*nothing to promote*/ } info = pbuf_ordering_plist_head; do { if(info->immbuf_wlist_head==NULL) { printf("%d(s): Why is info->immbuf_wlist_head NULL\n", armci_me); fflush(stdout); pause(); } assert(info->immbuf_wlist_head!=NULL); assert(info->n_pending>0); if(_armci_serv_pendbuf_can_progress(info->immbuf_wlist_head)) { immbuf = info->immbuf_wlist_head; info->immbuf_wlist_head = immbuf->immbuf_list_next; info->n_pending -= 1; immbuf->immbuf_list_next = NULL; if(!info->immbuf_wlist_head) { assert(info->immbuf_wlist_tail == immbuf); info->immbuf_wlist_tail = NULL; /*remove this proc from proc list*/ info->prev->next = info->next; info->next->prev = info->prev; if(pbuf_ordering_plist_head == info) { pbuf_ordering_plist_head = (info->next==info)?NULL:info->next; } info->prev = info->next = NULL; } break; } info = info->next; } while(info != pbuf_ordering_plist_head); if(DEBUG_SERVER) if(immbuf) { request_header_t *msginfo=(request_header_t*)immbuf->buf; printf("%d:: promoting a buffer immbuf=%p op=%d from=%d n_pending=%d\n", armci_me,immbuf,msginfo->operation,msginfo->from,info->n_pending); fflush(stdout); } ARMCI_PR_DBG("exit",0); return immbuf; } /** Enqueue a message. It could be an immediate message that cannot * make progress or a non-immediate message that cannot make progress * either due to ordering constraints or lack of pending buffers. * @param vbuf IN Immediate buffer to be enqueud * @return Pending buffer into which the message was enqueued. NULL * if no pending buffer was allocated (which is always the case for * immediate messages) */ static pendbuf_t* _armci_serv_pendbuf_enqueue(immbuf_t *vbuf) { request_header_t *msginfo=(request_header_t *)vbuf->buf; int from = msginfo->from; pendbuf_t *pbuf; immbuf_t *ibuf; proc_waitlist_t *info = &pbuf_proc_list_info[msginfo->from]; ARMCI_PR_DBG("enter",0); /* printf("%d: Entered serv_pbuf_enqueue\n", armci_me); */ pbuf=NULL; if(msginfo->tag.imm_msg) { assert(!_armci_serv_pendbuf_can_progress(vbuf)); } else if(_armci_serv_pendbuf_can_progress(vbuf)) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); /*can_progress() should ensure this*/ } if(pbuf == NULL) { /* printf("%d(s):: Enqueing op=%d imm=%d from %d. n_pending=%d\n", armci_me, msginfo->operation, msginfo->tag.imm_msg, msginfo->from,info->n_pending); */ /* fflush(stdout); */ vbuf->immbuf_list_next = NULL; assert(info->n_pending < IMM_BUF_NUM); /*How another message now?*/ for(ibuf=info->immbuf_wlist_head;ibuf!=NULL;ibuf=ibuf->immbuf_list_next) { assert(vbuf != ibuf); /*enqueueing the same buffer twice*/ } info->n_pending += 1; if(!info->immbuf_wlist_head) { assert(!info->immbuf_wlist_tail); assert(!info->prev && !info->next); /*insert proc into proc list*/ if(!pbuf_ordering_plist_head) { pbuf_ordering_plist_head=info->next=info->prev=info; } else { info->next = pbuf_ordering_plist_head; info->prev = pbuf_ordering_plist_head->prev; pbuf_ordering_plist_head->prev->next = info; pbuf_ordering_plist_head->prev = info; } } /*insert vbuf into immbuf list for this proc*/ if(info->immbuf_wlist_tail) info->immbuf_wlist_tail->immbuf_list_next=vbuf; info->immbuf_wlist_tail = vbuf; if(!info->immbuf_wlist_head) info->immbuf_wlist_head = vbuf; } /* printf("%d: Leaving serv_pbuf_enqueue\n", armci_me); */ ARMCI_PR_DBG("exit",0); return pbuf; } /** Progress GET requests. * @param pbuf IN Pending buffer containing the GET request * @return none */ static void _armci_serv_pendbuf_progress_get(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1)+msginfo->dscrlen); int *status = &pbuf->status; assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalendscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ armci_complete_pendbuf(pbuf); if(msginfo->pinned) { *status = SEND_DATA_DONE; _armci_serv_pendbuf_freebuf(pbuf); } else { *status = SEND_DATA_PENDING; } } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: GET getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo,rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case SEND_DATA_PENDING: armci_die("call_data_server should set status to SEND_DATA_DONE before calling progress",*status); break; case RECV_DSCR_DONE: /* printf("%d(s):: GET. Done recving descriptor index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ armci_complete_pendbuf(pbuf); if(msginfo->pinned) { *status = SEND_DATA_DONE; _armci_serv_pendbuf_freebuf(pbuf); } else { *status = SEND_DATA_PENDING; } break; case SEND_DATA_DONE: _armci_serv_pendbuf_freebuf(pbuf); break; case RECV_DATA_PENDING: case RECV_DATA_DONE: default: armci_die("pendbuf_progress_get: invalid status", *status); } } /** Progress PUT/ACC requests. * @param pbuf IN Pending buffer containing the PUT/ACC request * @return none */ static void _armci_serv_pendbuf_progress_putacc(pendbuf_t *pbuf) { int index = (pbuf - serv_pendbuf_arr); request_header_t *msginfo = (request_header_t *)pbuf->buf; void *buffer =((char *)(msginfo+1))+msginfo->dscrlen; int *status = &pbuf->status; assert(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)); assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->datalenoperation,msginfo->from); */ /* fflush(stdout); */ if(sizeof(request_header_t)+msginfo->dscrlen <= IMM_BUF_LEN) { /*Have the header and descriptor; go process*/ assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo,msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; } else { /*Need to get rest of descriptor*/ const int bytes = sizeof(request_header_t)+msginfo->dscrlen-IMM_BUF_LEN; #warning "PEND_BUFS: Abusing msginfo->tag.ack_ptr for GETS with large descriptors!" assert(msginfo->tag.ack_ptr != NULL); /*sanity check. Should point to tag.ack on the client side*/ void *lptr = ((char *)msginfo)+IMM_BUF_LEN; void *rptr = ((char *)msginfo->tag.ack_ptr) - (int)(&((request_header_t *)0)->tag.ack) + IMM_BUF_LEN; /* printf("%d(s):: PUT getting rest of descriptor index=%d bytes=%d ptr=%p from=%d\n", */ /* armci_me,index,bytes,rptr,msginfo->from); */ /* fflush(stdout); */ assert(IMM_BUF_LEN+bytes < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo,rptr,lptr,bytes,msginfo->from,index); *status = RECV_DSCR_PENDING; } break; case RECV_DSCR_PENDING: armci_die("call_data_server should set status to RECV_DSCR_DONE before calling progress",*status); break; case RECV_DATA_PENDING: armci_die("call_data_server should set status to RECV_DONE before calling progress",*status); break; case RECV_DSCR_DONE: assert(sizeof(request_header_t)+msginfo->dscrlen+msginfo->tag.data_len < PENDING_BUF_LEN); armci_pbuf_start_get(msginfo,msginfo->tag.data_ptr,buffer,msginfo->tag.data_len, msginfo->from, index); /* printf("%d(s): PUT/ACC getting data. pbuf_num=%d data_ptr=%p data_len=%d bytes=%d\n", armci_me,index,msginfo->tag.data_ptr, msginfo->tag.data_len,msginfo->bytes); */ *status = RECV_DATA_PENDING; break; case RECV_DATA_DONE: /* printf("%d(s):: Done PUT/ACC with buf index=%d op=%d datalen=%d from=%d\n", */ /* armci_me,index,msginfo->operation,msginfo->datalen,msginfo->from); */ /* fflush(stdout); */ if(msginfo->operation == PUT && pbuf->order_prev!=NULL) { assert(pbuf->commit_me == 0); /*Why called so many times in thie state?*/ pbuf->commit_me = 1; break; } pbuf->commit_me = 0; armci_complete_pendbuf(pbuf); _armci_serv_pendbuf_freebuf(pbuf); break; case SEND_DATA_PENDING: case SEND_DATA_DONE: default: armci_die("pendbuf_progress_putacc: invalid status", *status); } } /** Make progress on processing a pending buffer. This function, also * ensures any other waiting messages get processed if they can * be. Thus, progress and eventual termination is guaranteed by this * function. * @param _pbuf IN Pending buffer to make progress on * @return none */ static void _armci_serv_pendbuf_progress(pendbuf_t *_pbuf){ request_header_t *msginfo = (request_header_t *)_pbuf->buf; immbuf_t *vbuf = _pbuf->vbuf; pendbuf_t *pbuf = _pbuf; assert(pbuf->vbuf!=NULL); do { if(vbuf && !IS_IMM_MSG(*msginfo)) { assert(pbuf->vbuf == vbuf); } /* printf("%d(s):: progressing op=%d imm=%d from=%d datalen=%d pbuf=%p vbuf=%p n_pending=%d\n", armci_me, */ /* msginfo->operation,msginfo->tag.imm_msg,msginfo->from,msginfo->datalen, pbuf,vbuf,pbuf_proc_list_info[msginfo->from].n_pending); */ /* fflush(stdout); */ if(IS_IMM_MSG(*msginfo)) { armci_complete_immbuf(vbuf); } else { /*non-immediate message*/ proc_waitlist_t* info = &pbuf_proc_list_info[msginfo->from]; do { assert(pbuf->vbuf == vbuf); if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)) { _armci_serv_pendbuf_progress_putacc(pbuf); } else if (msginfo->operation == GET) { _armci_serv_pendbuf_progress_get(pbuf); } else { armci_die("pending buffer processing for this op not yet implemented", msginfo->operation); } pbuf = info->order_head; vbuf = pbuf ? pbuf->vbuf : NULL; } while(info->order_head && info->order_head->commit_me); } /* sleep(2); */ vbuf = _armci_serv_pendbuf_promote(); if(vbuf) { msginfo = (request_header_t *)vbuf->buf; if(!msginfo->tag.imm_msg) { pbuf = _armci_serv_pendbuf_assignbuf(vbuf); assert(pbuf != NULL); } } } while(vbuf != NULL); } /*----------------External functions--------------------*/ /** Initialize array of pending buffers * @return none */ void armci_pendbuf_init() { int i; ARMCI_PR_DBG("enter",0); /* bzero(serv_pendbuf_arr, sizeof(pendbuf_t)*PENDING_BUF_NUM); */ for(i=0; ibuf; bzero(pbuf, sizeof(pendbuf_t)); pbuf->buf = buf; pbuf->avail=1; } pbuf_ordering_plist_head=NULL; pbuf_proc_list_info = (proc_waitlist_t *)malloc(sizeof(proc_waitlist_t)*armci_nproc); assert(pbuf_proc_list_info != NULL); bzero(pbuf_proc_list_info, sizeof(proc_waitlist_t)*armci_nproc); ARMCI_PR_DBG("exit",0); } void armci_pendbuf_service_req(immbuf_t *immbuf) { pendbuf_t *pbuf; request_header_t *msginfo=(request_header_t*)immbuf->buf; if(IS_IMM_MSG(*msginfo) && _armci_serv_pendbuf_can_progress(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p can progress. Completing it now!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ armci_complete_immbuf(immbuf); } else if(pbuf = _armci_serv_pendbuf_enqueue(immbuf)) { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p got pending buf. Progressing it!\n", */ /* armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ _armci_serv_pendbuf_progress(pbuf); } else { /* printf("%d: msg vbuf=%p op=%d from=%d imm=%d datalen=%d bytes=%d data_ptr=%p in waitlist!\n", armci_me, vbuf, msginfo->operation, msginfo->from, msginfo->tag.imm_msg,msginfo->datalen,msginfo->bytes,msginfo->tag.data_ptr); */ /* fflush(stdout); */ } } /**Network layer reporting to split buffers code that a put completed * on a pending buffer. * @param pbufid IN Pending buffer id (specified when starting a * put). * @return void */ void armci_pendbuf_done_put(int pbufid) { assert(pbufid>=0 && pbufid=0 && pbufidstatus) { case RECV_DSCR_PENDING: pbuf->status = RECV_DSCR_DONE; break; case RECV_DATA_PENDING: pbuf->status = RECV_DATA_DONE; break; default: armci_die("Reporting get done on buf with inappropriate status",pbufid); } _armci_serv_pendbuf_progress(pbuf); } #endif /*PEND_BUFS*/ ga-5-4/armci/src/devices/openib/armci-vapi.h0000644000175000017500000001715112662210405017014 0ustar mbamba/*$Id: armci-vapi.h,v 1.21.2.1 2007-03-06 19:50:24 vinod Exp $ */ #ifndef _VAPI_H #define _VAPI_H /*vapi includes*/ #ifdef MELLANOX #include #include #include #include #include #endif #ifdef OPENIB #include #endif #define DSCRID_NBDSCR 10000 #define MAX_RDMA_SIZE (8388608) #define DEFAULT_ADDR_LEN (8) /* format length of hcalid/qp_num.*/ #define DEFAULT_PORT (1) /*for vapi*/ #define DEFAULT_MTU (MTU1024) #define DEFAULT_PSN (0) #define DEFAULT_PKEY_IX (0) #define DEFAULT_P_KEY (0x0) #define DEFAULT_MIN_RNR_TIMER (5) #define DEFAULT_SERVICE_LEVEL (0) #define DEFAULT_TIME_OUT (5) #define DEFAULT_STATIC_RATE (2) #define DEFAULT_SRC_PATH_BITS (0) #define DEFAULT_RETRY_COUNT (1) #define DEFAULT_RNR_RETRY (1) #define DEFAULT_R_KEY (0x0) #define DEFAULT_L_KEY (0x0) #define DEFAULT_MAX_WQE 2048/*(1023)*/ typedef struct { void *data_ptr; /* pointer where the data should go */ long ack; /* header ack */ void *ack_ptr; /* pointer where the data should go */ #if defined(PEND_BUFS) unsigned int imm_msg:1; unsigned int data_len:31; #endif } msg_tag_t; typedef struct { #ifdef MELLANOX VAPI_sr_desc_t sdscr; VAPI_sg_lst_entry_t ssg_entry; VAPI_rr_desc_t rdscr; VAPI_sg_lst_entry_t rsg_entry; #endif #ifdef OPENIB struct ibv_send_wr sdscr; struct ibv_sge ssg_entry; struct ibv_recv_wr rdscr; struct ibv_sge rsg_entry; #endif } armci_vapi_field_t; typedef struct { #ifdef MELLANOX VAPI_lkey_t lkey; VAPI_rkey_t rkey; VAPI_mr_hndl_t memhndl; #endif #ifdef OPENIB uint32_t rkey; uint32_t lkey; struct ibv_mr *memhndl; #endif }armci_vapi_memhndl_t; extern char * armci_vapi_client_mem_alloc(int); typedef struct { int tag; int issg; #ifdef MELLANOX VAPI_sr_desc_t sdescr; VAPI_rr_desc_t rdescr; VAPI_sg_lst_entry_t sg_entry[56]; /*ff:this has to be malloced*/ #endif #ifdef OPENIB struct ibv_send_wr sdescr; struct ibv_recv_wr rdescr; struct ibv_sge sg_entry[56]; /*ff:this has to be malloced*/ #endif int numofsends; int numofrecvs; int myindex; } sr_descr_t; typedef struct { int tag; int issg; #ifdef MELLANOX VAPI_rr_desc_t descr; VAPI_sg_lst_entry_t sg_entry[56]; /*ff:this has to be malloced*/ #endif #ifdef OPENIB struct ibv_recv_wr descr; struct ibv_send_wr sg_entry[56]; /*ff:this has to be malloced*/ #endif int numofrecvs; int myindex; } rdescr_t; #if defined(PEND_BUFS) #ifdef OPENIB /* typedef struct { */ /* struct ibv_recv_wr dscr; */ /* struct ibv_sge sg_entry; */ /* } IMMBUF_NW_T; */ /* typedef struct { */ /* struct ibv_sge sg_entry; */ /* struct ibv_recv_wr rdscr; */ /* struct ibv_send_wr sdscr; */ /* } PENDBUF_NW_T; */ #define IMMBUF_NW_T \ struct ibv_recv_wr dscr; \ struct ibv_sge sg_entry; \ int send_pending; #define PENDBUF_NW_T \ struct ibv_sge sg_entry; \ struct ibv_recv_wr rdscr; \ struct ibv_send_wr sdscr; #define IS_IMM_MSG(msginfo) ((msginfo).tag.imm_msg) void armci_complete_immbuf(void *vbuf); void armci_complete_pendbuf(void *buf); /*Note that start_put and start_get cannot report completion from within. They have to just return and report completion later. */ void armci_pbuf_start_put(void *src, void *dst, int bytes, int proc, int bufid); void armci_pbuf_start_get(void *msg_info, void *src, void *dst, int bytes, int proc, int bufid); #else #error "PEND_BUFS only implemented for OPENIB" #endif #endif void armci_client_nbcall_complete(sr_descr_t *,int,int); void armci_vapi_set_mark_buf_send_complete(int); #define ARMCI_MEMHDL_T armci_vapi_memhndl_t #define REGIONS_REQUIRE_MEMHDL #define PIPE_BUFSIZE__ (4096) #define PIPE_MIN_BUFSIZE 1024 #define PIPE_MEDIUM_BUFSIZE (2*1024) #define VBUF_DLEN 4*64*1023 #define MSG_BUFLEN_DBL ((VBUF_DLEN)>>3) #if defined(PEND_BUFS) #define IMM_BUF_NUM_DEFAULT 4 #define IMM_BUF_LEN_DEFAULT 2048 #define PENDING_BUF_NUM_DEFAULT 20 #define PENDING_BUF_LEN_DEFAULT (VBUF_DLEN) #endif #ifdef PIPE_BUFSIZE # define STRIDED_GET_BUFLEN_DBL 31*1024 # define STRIDED_GET_BUFLEN (STRIDED_GET_BUFLEN_DBL<<3) # define MAX_BUFLEN (STRIDED_GET_BUFLEN+EXTRA_MSG_BUFLEN) #else # define MAX_BUFLEN (MSG_BUFLEN+EXTRA_MSG_BUFLEN) #endif #define BALANCE_BUFFERS #ifdef BALANCE_BUFFERS # define BALANCE_FACTOR 1.6 /* # define BALANCE_FACTOR 2.0 */ # define BALANCE_BUFSIZE 25000 #endif #define BUF_EXTRA_FIELD_T armci_vapi_field_t #define GET_SEND_BUFFER _armci_buf_get #define FREE_SEND_BUFFER _armci_buf_release #ifdef MELLANOX #define INIT_SEND_BUF(_field,_snd,_rcv) _snd=1;_rcv=1;memset(&((_field).sdscr),0,sizeof(VAPI_sr_desc_t));(_field).sdscr.id=avail+1;armci_vapi_set_mark_buf_send_complete(avail+1) #endif #ifdef OPENIB #define INIT_SEND_BUF(_field,_snd,_rcv) _snd=1;_rcv=1;memset(&((_field).sdscr),0,sizeof(struct ibv_send_wr));(_field).sdscr.wr_id=avail+1;armci_vapi_set_mark_buf_send_complete(avail+1) #endif #define BUF_ALLOCATE armci_vapi_client_mem_alloc #define CLEAR_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op) armci_vapi_complete_buf((armci_vapi_field_t *)(&(_field)),(_snd),(_rcv),(_to),(_op));_snd=0;_rcv=0;_to=0 #define TEST_SEND_BUF_FIELD(_field,_snd,_rcv,_to,_op,_pret) armci_vapi_test_buf((armci_vapi_field_t *)(&(_field)),(_snd),(_rcv),(_to),(_op),(_pret)) #define CLIENT_BUF_BYPASS 1 #define _armci_bypass 1 #define COMPLETE_HANDLE _armci_buf_complete_nb_request #if defined(ALLOW_PIN) # define NB_CMPL_T sr_descr_t* # define ARMCI_NB_WAIT(_cntr) if(_cntr)if(nb_handle->tag==(_cntr)->tag)\ armci_client_nbcall_complete(_cntr,nb_handle->tag,nb_handle->op); # define CLEAR_HNDL_FIELD(_x) _x=NULL #endif /* #define DIRECT_PUT_MIN_SIZE 8192 */ #define DIRECT_PUT_MIN_SIZE 0 #define LONG_GET_THRESHOLD 2147483648 #define LONG_GET_THRESHOLD_STRIDED 2147483648 #ifndef ARMCI_STAMP #error "ARMCI_STAMP used to define ARMCI_VAPI_COMPLETE not found!" #define ARMCI_VAPI_COMPLETE 1088451863 #else #define ARMCI_VAPI_COMPLETE ARMCI_STAMP #endif #define ARMCI_POST_SCATTER 1000000001 #define ARMCI_VAPI_CLEAR 0 #ifdef MELLANOX #define VAPI_SGGET_MIN_COLUMN 720 #define VAPI_SGPUT_MIN_COLUMN 720 #endif #ifdef OPENIB /* #define VAPI_SGGET_MIN_COLUMN 2147483648 */ #define VAPI_SGPUT_MIN_COLUMN 2147483648 #define VAPI_SGGET_MIN_COLUMN 10 /* #define VAPI_SGPUT_MIN_COLUMN 720 */ #endif #define DSCRID_SCATTERCLIENT 70000 #define DSCRID_SCATTERCLIENT_END 70000+9999 #define MAX_PENDING 32 #define HAS_RDMA_GET #if defined(OPENIB) #if 1 #define PUT_NO_SRV_COPY /*server rdma-s from to client buffers (in buffers.c) to remote memory (bypassing servers intermediate buffers) when possible*/ #define GET_NO_SRV_COPY /*server rdma-s from remote memory to client buffers (in buffers.c) (bypassing server intermediate buffers) when possible*/ int no_srv_copy_nsegs_ulimit();/*max #contig segs for which we avoid server copy. Too many segments might overflow a queue*/ #endif #define GET_STRIDED_COPY_PIPELINED /*client copies data from buffers to user memory in segments rather than waiting for all the data*/ #define GET_STRIDED_COPY_PIPELINED_SIZE (1*1024) /*size of each segment*/ #endif #endif /* _VAPI_CONST_H */ extern void armci_wait_ack(char *buffer); extern void armci_complete_multi_sglist_sends(int proc); extern void armci_client_direct_send(int p,void *src_buf, void *dst_buf, int len,void** contextptr,int nbtag,ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl); ga-5-4/armci/src/devices/openib/cbuf.h0000644000175000017500000001236512662210405015705 0ustar mbamba/* * Copyright (C) 1999-2001 The Regents of the University of California * (through E.O. Lawrence Berkeley National Laboratory), subject to * approval by the U.S. Department of Energy. * * Use of this software is under license. The license agreement is included * in the file MVICH_LICENSE.TXT. * * Developed at Berkeley Lab as part of MVICH. * * Authors: Bill Saphir * Michael Welcome */ /* Copyright (c) 2002-2008, The Ohio State University. All rights * reserved. * * This file is part of the MVAPICH software package developed by the * team members of The Ohio State University's Network-Based Computing * Laboratory (NBCL), headed by Professor Dhabaleswar K. (DK) Panda. * * For detailed copyright and licensing information, please refer to the * copyright file COPYRIGHT_MVAPICH in the top level MPICH directory. * */ #ifndef _CBUF_H #define _CBUF_H #include #include #include #include #include #ifdef _IA64_ #define CBUF_FLAG_TYPE uint64_t #else #define CBUF_FLAG_TYPE uint32_t #endif #if (defined(RDMA_FAST_PATH) || defined(ADAPTIVE_RDMA_FAST_PATH)) #define CBUF_BUFFER_SIZE (viadev_cbuf_total_size - \ 2*sizeof(CBUF_FLAG_TYPE)) #else #define CBUF_BUFFER_SIZE (viadev_cbuf_total_size) #endif /* * brief justification for cbuf format: * descriptor must be aligned (64 bytes). * cbuf size must be multiple of this alignment to allow contiguous allocation * descriptor and buffer should be contiguous to allow via implementations that * optimize contiguous descriptor/data (? how likely ?) * need to be able to store send handle in cbuf so that we can mark sends * complete when communication completes. don't want to store * it in packet header because we don't always need to send over the network. * don't want to store at beginning or between desc and buffer (see above) so * store at end. */ #define QP_CON_REQ 1 #define QP_CON_ACK 2 #define QP_CON_BREAK_FROM_CLIENT 3 #define QP_CON_BREAK_FROM_SERVER 4 typedef struct { uint32_t src_rank; uint16_t lid; uint32_t qpnum; int msg_type; } armci_ud_rank; struct ibv_descriptor { union { struct ibv_recv_wr rr; struct ibv_send_wr sr; } u; struct ibv_sge sg_entry; void *next; }; typedef struct ibv_descriptor IBV_DESCRIPTOR; typedef struct cbuf { #if (defined(RDMA_FAST_PATH) || defined(ADAPTIVE_RDMA_FAST_PATH)) CBUF_FLAG_TYPE *head_flag; #endif unsigned char *buffer; #if (defined(RDMA_FAST_PATH) || defined(ADAPTIVE_RDMA_FAST_PATH)) int padding; #endif IBV_DESCRIPTOR desc; /* NULL shandle means not send or not complete. Non-null * means pointer to send handle that is now complete. Used * by viadev_process_send */ void *shandle; struct cbuf_region *region; int grank; uint16_t bytes_remaining; uint16_t len; unsigned char *data_start; uint16_t ref_count; } cbuf; /* one for head and one for tail */ #define CBUF_FAST_RDMA_EXTRA_BYTES (2*sizeof(CBUF_FLAG_TYPE)) #define FAST_RDMA_ALT_TAG 0x8000 #define FAST_RDMA_SIZE_MASK 0x7fff /* * Vbufs are allocated in blocks and threaded on a single free list. * * These data structures record information on all the cbuf * regions that have been allocated. They can be used for * error checking and to un-register and deallocate the regions * at program termination. * */ typedef struct cbuf_region { struct ibv_mr *mem_handle; /* memory handle for entire region */ void *malloc_start; /* used to free region later */ void *malloc_end; /* to bracket mem region */ void *malloc_buf_start; /* used to free DMA region later */ void *malloc_buf_end; /* bracket DMA region */ int count; /* number of cbufs in region */ struct cbuf *cbuf_head; /* first cbuf in region */ struct cbuf_region *next; /* thread cbuf regions */ } cbuf_region; /* ack. needed here after cbuf is defined. need to clean up header files * and dependencies. */ typedef unsigned long aint_t; extern int viadev_cbuf_max; extern int viadev_cbuf_total_size; extern int viadev_cbuf_secondary_pool_size; void dump_cbuf_regions(void); void dump_cbuf_region(cbuf_region * r); void allocate_cbufs(int ncbufs); void deallocate_cbufs(void); cbuf *get_cbuf(void); void release_cbuf(cbuf * v); void cbuf_init_send(cbuf * v, unsigned long len); void cbuf_init_recv(cbuf * v, unsigned long len); void cbuf_init_sendrecv(cbuf * v, unsigned long len); void cbuf_init_rput(cbuf * v, void *local_address, uint32_t local_memhandle, void *remote_address, uint32_t remote_memhandle_rkey, int nbytes); void cbuf_init_rget(cbuf * v, void *local_address, uint32_t local_memhandle, void *remote_address, uint32_t remote_memhandle_rkey, int nbytes); void init_cbuf_lock(); void dump_cbuf(char *msg, cbuf * v); struct ibv_mr * armci_register_memory(void *, int); /* * Macros for working with cbufs */ #define CBUF_BUFFER_START(v) (v->buffer) #define CBUF_DATA_SIZE(type) (CBUF_BUFFER_SIZE - sizeof(type)) #endif /* _CBUF_H */ ga-5-4/armci/src/devices/openib/openib.c0000644000175000017500000046716712662210405016253 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: openib.c,v 1.4.2.9 2007-10-18 06:08:03 d3h325 Exp $ * * File organized as follows */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_STRING_H # include #endif #include #include "cbuf.h" #include "armcip.h" #include "copy.h" #include "request.h" #include "armci-vapi.h" #include "iterator.h" #define DEBUG_INIT 0 #define DEBUG_FINALIZE 0 #define DEBUG_SERVER 0 #define DEBUG_CLN 0 #define TIME_INIT 0 # define VAPIDEV_NAME "InfiniHost0" # define INVAL_HNDL 0xFFFFFFFF #define RNR_TIMER 12 /*Debug macros used to tune what is being tested -- mostly openib calls*/ #define DBG_INIT 1 #define DBG_POLL 1 #define DBG_ALL 1 #define QP_INACTIVE 5 #define QP_REQ_SENT 2 #define QP_ACK_RCVD 3 #define QP_ACTIVE 4 u_int32_t armci_max_num_sg_ent; u_int32_t armci_max_qp_ous_swr; u_int32_t armci_max_qp_ous_rwr; typedef struct { struct ibv_qp *qp; uint32_t sqpnum; /*we need to exchng qp nums,arr for that*/ uint16_t lid; uint16_t state; void *next; } armci_connect_t; armci_connect_t *CLN_con, *SRV_con; static uint32_t *SRV_rqpnums, *CLN_rqpnums; /*relevant rqp num arrs, to connect to svr and client*/ static uint32_t *CLN_rqpnumtmpbuf=NULL; /*temporary buf used during connection setup*/ /*\ * datastrucure for infinihost NIC \*/ typedef struct { uint16_t *lid_arr; /*we need to exchange lids, arr for that*/ struct ibv_context *handle; /*device context/handle*/ int maxtransfersize; struct ibv_device_attr attr; /*device properties*/ struct ibv_port_attr hca_port; /*mostly for getting lid*/ uint8_t active_port; struct ibv_pd *ptag; /*protection tag*/ const char *vendor; struct ibv_cq *scq; /*send completion queue*/ struct ibv_cq *rcq; /*recv completion queue*/ struct ibv_comp_channel *sch; /*send completion channel*/ struct ibv_comp_channel *rch; /*recv completion channel*/ void *scq_cntx; /*send context for completion queue*/ void *rcq_cntx; /*recv context for completion queue*/ int scv; /*send completion vector*/ int rcv; /*recv completion vector*/ } vapi_nic_t; typedef struct { armci_vapi_memhndl_t *prem_handle; /*address server to store memory handle*/ armci_vapi_memhndl_t handle; }ack_t; armci_vapi_memhndl_t *CLN_handle; armci_vapi_memhndl_t serv_memhandle, client_memhandle; armci_vapi_memhndl_t *handle_array; armci_vapi_memhndl_t *pinned_handle; static vapi_nic_t nic_arr[3]; static vapi_nic_t *SRV_nic= nic_arr; static vapi_nic_t *CLN_nic= nic_arr+1; static int armci_server_terminating; #define NONE -1 static int armci_ack_proc=NONE; static int armci_vapi_server_ready; static int armci_vapi_server_stage1=0; static int armci_vapi_client_stage1=0; static int armci_vapi_server_stage2=0; static int armci_vapi_client_ready; int _s=-1,_c=-1; static int armci_vapi_max_inline_size=-1; #define CLIENT_STAMP 101 #define SERV_STAMP 99 #define MAX_PROC_INLINE_SIZE 2048 static char * client_tail; static char * serv_tail; static ack_t *SRV_ack; #if defined(PEND_BUFS) typedef immbuf_t vapibuf_t; typedef pendbuf_t vapibuf_pend_t; #else typedef struct { struct ibv_recv_wr dscr; struct ibv_sge sg_entry; char buf[CBUF_DLEN]; } vapibuf_t; #endif typedef struct { struct ibv_send_wr snd_dscr; struct ibv_sge ssg_entry; struct ibv_recv_wr rcv_dscr; struct ibv_sge rsg_entry; char buf[VBUF_DLEN]; } vapibuf_ext_t; typedef struct { struct ibv_send_wr rmw_dscr; struct ibv_sge rmw_entry; } vapirmw_t; unsigned int armci_use_odcm = 0; unsigned int armci_use_lazy_break = 0; unsigned int armci_use_apm = 0; unsigned int armci_use_apm_test = 0; unsigned int armci_use_srq = 0; unsigned int armci_use_snft = 0; unsigned int armci_use_affinity = 0; unsigned int armci_srq_size = 4096; pthread_t armci_async_thread[4]; void async_thread_hca_events(void *ctx); void async_thread_ud_events(void *ctx); void init_apm_lock(void); static struct ibv_srq *create_srq(vapi_nic_t *nic); void setup_ud_channel(void); void process_recv_completion_from_server(armci_ud_rank *h, cbuf *v); void process_recv_completion_from_client(armci_ud_rank *h, cbuf *v); struct ibv_srq *CLN_srq_hndl; struct ibv_srq *SRV_srq_hndl; void post_recv(void); struct Remote_Buf { char **buf; uint32_t *qp_num; uint16_t *lid; uint32_t *rkey; }; struct HCA { struct ibv_device *ib_dev; struct ibv_context *context; struct ibv_pd *pd; struct ibv_cq *cq; struct ibv_srq *srq_hndl; struct ibv_comp_channel *comp_channel; }; struct RC_Conn { struct ibv_qp **qp; uint16_t *lid; int *status; uint32_t *qp_num; struct ibv_ah **ud_ah; }; struct Remote_Buf rbuf; struct RC_Conn conn; struct HCA hca; void handle_network_fault(struct ibv_wc *pdscr); int process_recv_completion_from_client_flag; int total_active_conn_to_server, total_active_conn_to_client, total_breaks; void check_state_of_ib_connection(int a, int b); static vapibuf_t **serv_buf_arr; #if !defined(PEND_BUFS) /*These are typically used as spare buffers for communication. Since we do not wait on completion anymore, we need to ensure things work fine when these have in-flight messages. Disabled for now.*/ static vapibuf_t *spare_serv_buf, *spare_serv_bufptr; static vapibuf_ext_t *serv_buf; #endif static vapirmw_t rmw[64]; static int *flag_arr; /* flag indicates its receiving scatter data */ #define SERV 2 #define CLN 1 #define MAX_DESCR 2 typedef struct { int avail; struct ibv_qp *qp; struct ibv_recv_wr *descr; } descr_pool_t; static int* _gtmparr; static void* test_ptr; static int test_stride_arr[1]; static int test_count[2]; static int test_stride_levels; char *MessageRcvBuffer; extern void armci_util_wait_int(volatile int *,int,int); void armci_send_data_to_client(int proc, void *buf,int bytes,void *dbuf); void armci_server_register_region(void *,long,ARMCI_MEMHDL_T *); static descr_pool_t serv_descr_pool = {MAX_DESCR,NULL,NULL}; static descr_pool_t client_descr_pool = {MAX_DESCR,NULL,NULL}; /**Buffer (long[1] used to set msginfo->tag.ack_ptr in client-side. See usage in SERVER_SEND_ACK macro*/ static long *ack_buf; #define GET_DATA_PTR(buf) (sizeof(request_header_t) + (char*)buf) #define BUF_TO_SDESCR(buf) ((struct ibv_send_wr *)(&((armci_vapi_field_t *)((char *)(buf) - sizeof(armci_vapi_field_t)))->sdscr)) #define BUF_TO_RDESCR(buf) ((struct ibv_recv_wr *)(&((armci_vapi_field_t *)((char *)(buf) - sizeof(armci_vapi_field_t)))->rdscr)) #define BUF_TO_SSGLST(buf) ((struct ibv_sge *)(&((armci_vapi_field_t *)((char *)(buf) - sizeof(armci_vapi_field_t)))->ssg_entry)) #define BUF_TO_RSGLST(buf) ((struct ibv_sge *)(&((armci_vapi_field_t *)((char *)(buf) - sizeof(armci_vapi_field_t)))->rsg_entry)) #define BUF_TO_ECBUF(buf) (vapibuf_ext_t*)(((char*)buf) - (sizeof(struct ibv_send_wr)+sizeof(struct ibv_recv_wr)+2*sizeof(struct ibv_sge))) #define SERVER_SEND_ACK(p) do { \ assert(*ack_buf == ARMCI_STAMP); \ assert((p)>=0); \ armci_send_data_to_client((p),ack_buf, \ sizeof(long),msginfo->tag.ack_ptr); \ } while(0) /* #define SERVER_SEND_ACK(p) {assert(serv_buf!=NULL);assert(msginfo->from==(p));*((long *)serv_buf->buf)=ARMCI_STAMP;armci_send_data_to_client((p),serv_buf->buf,sizeof(long),msginfo->tag.ack_ptr);} */ #define SERVER_SEND_DATA(_SS_proc,_SS_src,_SS_dst,_SS_size) {armci_send_data_to_client(_SS_proc,_SS_src,_SS_size,_SS_dst);} #define SERVER_GET_DATA(_SG_proc,_SG_src,_SG_dst,_SG_size) {armci_get_data_from_client(_SG_proc,_SG_src,_SG_size,_SG_dst);} /*\ descriptors will have unique ID's for the wait on descriptor routine to * complete a descriptor and know where it came from \*/ #define NUMOFBUFFERS (MAX_BUFS+MAX_SMALL_BUFS) #define DSCRID_FROMBUFS 1 #define DSCRID_FROMBUFS_END (DSCRID_FROMBUFS+NUMOFBUFFERS) #define DSCRID_NBDSCR 10000 #define DSCRID_NBDSCR_END (10000+MAX_PENDING) #define DSCRID_SCATGAT 20000 #define DSCRID_SCATGAT_END 20000+MAX_PENDING #define DSCRID_RMW 30000 #define DSCRID_RMW_END 30000+9999 #if defined(PEND_BUFS) #define DSCRID_PENDBUF (40000) #define DSCRID_PENDBUF_END (DSCRID_PENDBUF + 2*PENDING_BUF_NUM+1) #define DSCRID_IMMBUF_RECV (200000) #define DSCRID_IMMBUF_RECV_END (600000) #define DSCRID_IMMBUF_RESP (600000) #define DSCRID_IMMBUF_RESP_END (1000000) #endif extern double MPI_Wtime(); static double inittime0=0,inittime1=0,inittime2=0,inittime3=0,inittime4=0; static int mark_buf_send_complete[NUMOFBUFFERS+1]; static sr_descr_t armci_vapi_client_nbsdscr_array[MAX_PENDING]; static sr_descr_t armci_vapi_client_nbrdscr_array[MAX_PENDING]; static sr_descr_t armci_vapi_serv_nbsdscr_array[MAX_PENDING]; static sr_descr_t armci_vapi_serv_nbrdscr_array[MAX_PENDING]; void armci_server_transport_cleanup(); /********************FUNCTIONS TO CHECK OPENIB RETURN STATUS*******************/ void armci_check_status(int debug, int rc,char *msg) { dassertp(debug,rc==0,("%d: %s, rc=%d\n",armci_me,msg,rc)); /* if(debug)printf("%d:%s, rc = %d\n", armci_me,msg, rc); */ /* if(rc!=0)armci_die(msg,rc); */ } void armci_vapi_check_return(int debug, int ret, const char *ss) { } void armci_vapi_print_dscr_info(struct ibv_send_wr *sr, struct ibv_recv_wr *rr) { int i; if(rr){ printf("\n%d:print_dscr rr id=%ld sg_lst_len=%d", armci_me, rr->wr_id, rr->num_sge); for (i = 0; i < rr->num_sge; i++) { printf("\n\t:sg_entry=%d addr=%p len=%d", i, rr->sg_list[i].addr, rr->sg_list[i].length); } fflush(stdout); } if(sr){ printf("\n%d:print_dscr sr id=%d opcode=%d sg_lst_len=%d", armci_me, sr->wr_id, sr->opcode, sr->num_sge); for (i = 0; i < sr->num_sge; i++) { printf("\n\t:sg_entry=%d addr=%p len=%d", i, sr->sg_list[i].addr, sr->sg_list[i].length); } fflush(stdout); } } /*****************END FUNCTIONS TO CHECK VAPI RETURN STATUS********************/ void armci_recv_complete(struct ibv_recv_wr *rcv_dscr, char *from, int numofrecvs) { int rc=0; struct ibv_wc pdscr1; struct ibv_wc *pdscr = &pdscr1; sr_descr_t *rdscr_arr; vapi_nic_t *nic; int debug,i,done=0; if(SERVER_CONTEXT){ rdscr_arr = armci_vapi_serv_nbrdscr_array; nic=CLN_nic; debug = DEBUG_SERVER; } else{ rdscr_arr = armci_vapi_client_nbrdscr_array; nic=SRV_nic; debug = DEBUG_CLN; } if(debug){ printf("\n%d%s:recv_complete called from %s id=%ld\n",armci_me, ((SERVER_CONTEXT)?"(s)":" "),from,rcv_dscr->wr_id);fflush(stdout); } for(i=0;ircq, 1, pdscr); } dassertp(DBG_POLL|DBG_ALL,rc>=0, ("%d: rc=%d id=%d status=%d (%d/%d)\n", armci_me,rc,pdscr->wr_id,pdscr->status,i,numofrecvs)); dassert1(1,pdscr->status==IBV_WC_SUCCESS,pdscr->status); if(debug){ if(pdscr->wr_id >= DSCRID_SCATGAT && pdscr->wr_id < DSCRID_SCATGAT_END) printf("\n%d:recv from %s complete id=%d num=%d",armci_me, from,pdscr->wr_id,rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofrecvs); } if(pdscr->wr_id >= DSCRID_SCATGAT && pdscr->wr_id < DSCRID_SCATGAT_END){ rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofrecvs--; if(rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofrecvs==0) rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].tag=0; } else if(pdscr->wr_id == (DSCRID_SCATGAT + MAX_PENDING)){ /*this was from a blocking call, do nothing*/ continue; } else { armci_die("\nclient should be posting only one kind of recv",armci_me); } rc = 0; }while(pdscr->wr_id!=rcv_dscr->wr_id); rc = 0; } } void armci_vapi_set_mark_buf_send_complete(int id) { mark_buf_send_complete[id]=0; } void armci_send_complete(struct ibv_send_wr *snd_dscr, char *from,int numoftimes) { int rc=0; struct ibv_wc pdscr1; struct ibv_wc *pdscr = &pdscr1; sr_descr_t *sdscr_arr; vapi_nic_t *nic; int debug,i; pdscr1.status = IBV_WC_SUCCESS; /* bzero(&pdscr1, sizeof(pdscr1)); */ /* printf("%d: Waiting for send with wr_id=%d to complete\n", armci_me, snd_dscr->wr_id); */ /* fflush(stdout); */ if(SERVER_CONTEXT){ sdscr_arr = armci_vapi_serv_nbsdscr_array; nic=CLN_nic; debug = DEBUG_SERVER; } else{ sdscr_arr = armci_vapi_client_nbsdscr_array; nic=SRV_nic; debug = DEBUG_CLN; } if(debug) { printf("\n%d%s:send_complete called from %s id=%ld nt=%d\n",armci_me, ((SERVER_CONTEXT)?"(s)":" "),from,snd_dscr->wr_id,numoftimes); fflush(stdout); } for(i=0;ircq,1,pdscr); else #endif rc = ibv_poll_cq(nic->scq,1, pdscr); } dassertp(DBG_POLL|DBG_ALL,rc>=0, ("%d:rc=%d status=%d id=%d (%d/%d)",armci_me, rc,pdscr->status,(int)pdscr->wr_id,i,numoftimes)); dassert1(1,pdscr->status==IBV_WC_SUCCESS,pdscr->status); /* printf("%d: Obtained completion of wr_id=%d\n", armci_me, pdscr->wr_id); */ /* fflush(stdout); */ if(SERVER_CONTEXT){ if(debug)printf("%d:completed id %d i=%d\n",armci_me,pdscr->wr_id,i); if(pdscr->wr_id >=DSCRID_SCATGAT && pdscr->wr_id < DSCRID_SCATGAT_END){ sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends--; if(sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends==0) sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].tag=0; } else if(pdscr->wr_id >=armci_nproc && pdscr->wr_id < 2*armci_nproc){ /*its coming from send_data_to_client just return*/ } #if defined(PEND_BUFS) else if(pdscr->wr_id >= DSCRID_IMMBUF_RESP && pdscr->wr_id>DSCRID_IMMBUF_RESP_END) { /*send from server to client completed*/ } #endif else armci_die("server send complete got weird id",pdscr->wr_id); } else{ if(debug)printf("%d:completed id %d i=%d\n",armci_me,pdscr->wr_id,i); if(pdscr->wr_id >=DSCRID_FROMBUFS && pdscr->wr_id < DSCRID_FROMBUFS_END) { /* printf("%d: marking send buffer %d as complete\n", armci_me, pdscr->wr_id);*/ mark_buf_send_complete[pdscr->wr_id]=1; } else if(pdscr->wr_id >=DSCRID_NBDSCR && pdscr->wr_id < DSCRID_NBDSCR_END){ sdscr_arr[pdscr->wr_id-DSCRID_NBDSCR].numofsends--; if(sdscr_arr[pdscr->wr_id-DSCRID_NBDSCR].numofsends==0) sdscr_arr[pdscr->wr_id-DSCRID_NBDSCR].tag=0; } else if(pdscr->wr_id >=DSCRID_SCATGAT && pdscr->wr_id < DSCRID_SCATGAT_END){ sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends--; if(sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends==0) sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].tag=0; } else if(pdscr->wr_id == (DSCRID_SCATGAT + MAX_PENDING)){ /* printf("%d: completed a blocking scatgat descriptor\n", armci_me); */ /*this was from a blocking call, do nothing*/ continue; } else armci_die("client send complete got weird id",pdscr->wr_id); } rc = 0; }while(pdscr->wr_id!=snd_dscr->wr_id); rc = 0; } } void armci_dscrlist_recv_complete(int tag, char* from,sr_descr_t *dscr) { int i,nr,j; sr_descr_t *retdscr,*rdscr_arr; if(dscr == NULL){ if(SERVER_CONTEXT) rdscr_arr = armci_vapi_serv_nbrdscr_array; else rdscr_arr = armci_vapi_client_nbrdscr_array; for(i=0;inumofrecvs; armci_recv_complete(&(retdscr->rdescr),"(s)list_send_complete",nr); } void armci_dscrlist_send_complete(int tag,char *from, sr_descr_t *dscr) { int i,ns,j; sr_descr_t *retdscr,*sdscr_arr; if(dscr==NULL){ if(SERVER_CONTEXT) sdscr_arr = armci_vapi_serv_nbsdscr_array; else sdscr_arr = armci_vapi_client_nbsdscr_array; for(i=0;inumofsends; armci_send_complete(&(retdscr->sdescr),"dscrlist_send_complete",ns); } void armci_client_nbcall_complete(sr_descr_t *dscr, int tag, int op) { if(tag != dscr->tag) return; THREAD_LOCK(armci_user_threads.net_lock); if(op == GET){ if(dscr->issg){ if(dscr->numofrecvs>0) armci_dscrlist_recv_complete(tag,"armci_client_nbcall_complete recv", dscr); } else{ if(dscr->numofsends>0) armci_dscrlist_send_complete(tag,"armci_client_nbcall_complete send", dscr); } } if(op == PUT){ if(dscr->numofsends>0) armci_dscrlist_send_complete(tag,"armci_client_nbcall_complete send", dscr); } THREAD_UNLOCK(armci_user_threads.net_lock); } static int cur_serv_pend_descr; static int cur_client_pend_descr; sr_descr_t *armci_vapi_get_next_rdescr(int nbtag,int sg) { static int serverthreadavail=-1; /*client thread can't touch this*/ static int clientthreadavail=-1; /*server thread can't touch this*/ int avail,newavail; sr_descr_t *retdscr,*rdscr_arr; if(SERVER_CONTEXT){ rdscr_arr = armci_vapi_serv_nbrdscr_array; avail = serverthreadavail; /*printf("\n%d:serv thread avail=%d",armci_me,serverthreadavail);*/ } else{ rdscr_arr = armci_vapi_client_nbrdscr_array; avail = clientthreadavail; } if(avail==-1){ int i; for(i=0;irdescr,0,sizeof(struct ibv_recv_wr)); if(sg) retdscr->rdescr.wr_id = DSCRID_SCATGAT + avail; else{ retdscr->rdescr.wr_id = DSCRID_NBDSCR + avail; retdscr->numofrecvs=1; } newavail = (avail+1)%MAX_PENDING; if(SERVER_CONTEXT){ cur_serv_pend_descr = avail; serverthreadavail=newavail; } else{ cur_client_pend_descr = avail; clientthreadavail=newavail; } return(retdscr); } sr_descr_t *armci_vapi_get_next_sdescr(int nbtag,int sg) { static int serverthreadavail=-1; /*client thread can't touch this*/ static int clientthreadavail=-1; /*server thread can't touch this*/ int avail,newavail; sr_descr_t *retdscr,*sdscr_arr; if(SERVER_CONTEXT){ sdscr_arr = armci_vapi_serv_nbsdscr_array; avail = serverthreadavail; } else{ sdscr_arr = armci_vapi_client_nbsdscr_array; avail = clientthreadavail; } if(avail==-1){ /*first call*/ int i; for(i=0;isdescr,0,sizeof(struct ibv_recv_wr)); if(sg) retdscr->sdescr.wr_id = DSCRID_SCATGAT + avail; else{ retdscr->sdescr.wr_id = DSCRID_NBDSCR + avail; retdscr->numofsends=1; } newavail = (avail+1)%MAX_PENDING; if(SERVER_CONTEXT){ cur_serv_pend_descr = avail; serverthreadavail=newavail; } else{ cur_client_pend_descr = avail; clientthreadavail=newavail; } return(retdscr); } void armci_wait_for_server() { armci_server_terminating = 1; } /* ibv_create_qp does not use separate structure to return properties, seems it is all inside ibv_qp */ static void armci_create_qp(vapi_nic_t *nic, struct ibv_qp **qp) { struct ibv_qp_init_attr initattr; bzero(&initattr, sizeof(struct ibv_qp_init_attr)); *qp = NULL; initattr.cap.max_send_wr = armci_max_qp_ous_swr; initattr.cap.max_recv_wr = armci_max_qp_ous_rwr; initattr.cap.max_recv_sge = armci_max_num_sg_ent; initattr.cap.max_send_sge = armci_max_num_sg_ent; #if defined(PEND_BUFS) if(nic==CLN_nic) { initattr.send_cq = nic->rcq; initattr.recv_cq = nic->rcq; } else #endif { initattr.send_cq = nic->scq; initattr.recv_cq = nic->rcq; } initattr.qp_type = IBV_QPT_RC; *qp = ibv_create_qp(nic->ptag, &initattr); dassert(1,*qp!=NULL); /* The value of inline size should be dependent on number of processes * */ if (armci_nproc >= MAX_PROC_INLINE_SIZE) { armci_vapi_max_inline_size = -1; } else { armci_vapi_max_inline_size = initattr.cap.max_inline_data; } } int armci_openib_sl; int armci_openib_server_poll; void armci_openib_env_init() { char *value; if ((value = getenv("ARMCI_OPENIB_USE_SL")) != NULL){ armci_openib_sl = atoi(value); } else { armci_openib_sl = 0; } /* Don't enable server polling by default */ if ((value = getenv("ARMCI_OPENIB_SERVER_POLL")) != NULL){ armci_openib_server_poll = atoi(value); } else { armci_openib_server_poll = 0; } } static void armci_init_nic(vapi_nic_t *nic, int scq_entries, int rcq_entries) { int rc, ndevs, i; struct ibv_device **devs=NULL; struct ibv_context *cxt; if (nic == SRV_nic) { /* Initialize OpenIB runtime variables only once*/ armci_openib_env_init(); } bzero(nic,sizeof(vapi_nic_t)); nic->lid_arr = (uint16_t *)calloc(armci_nproc,sizeof(uint16_t)); dassert(1,nic->lid_arr!=NULL); devs = ibv_get_device_list(&ndevs); char *runtime_devname; int device_found = 0, device_id = 0; runtime_devname = getenv("ARMCI_OPENIB_DEVICE"); if (runtime_devname) { for (i = 0; i < ndevs; i++) { if (!strncmp(ibv_get_device_name(devs[i]), runtime_devname, 32)) { device_found = 1; device_id = i; break; } } } else { device_id = 0; device_found = 1; } assert(device_found); nic->handle = ibv_open_device(devs[device_id]); nic->maxtransfersize = MAX_RDMA_SIZE; nic->vendor = ibv_get_device_name(devs[device_id]); rc = ibv_query_device(nic->handle, &nic->attr); int down_port_count_check = 0; for (i = 1; i <= 2; i++) { rc = ibv_query_port(nic->handle, (uint8_t)i, &nic->hca_port); if (IBV_PORT_ACTIVE == nic->hca_port.state) { nic->active_port = i; break; } else { down_port_count_check++; } } /* Assert that the number of inactive ports is not equal to the number * of down ports on any adapter */ assert(down_port_count_check != 2); /*save the lid for doing a global exchange later */ nic->lid_arr[armci_me] = nic->hca_port.lid; /*allocate tag (protection domain) */ nic->ptag = ibv_alloc_pd(nic->handle); /* properties of scq and rcq required for the cq number, this also needs * to be globally exchanged */ nic->scv = 1; nic->rcv = 2; nic->scq = nic->rcq = NULL; if(scq_entries) { nic->sch = ibv_create_comp_channel(nic->handle); nic->scq = ibv_create_cq(nic->handle, 16000, nic->scq_cntx,nic->sch, 0); } if(rcq_entries) { nic->rch = ibv_create_comp_channel(nic->handle); nic->rcq = ibv_create_cq(nic->handle, 32768, nic->rcq_cntx,nic->rch, 0); } ibv_free_device_list(devs); armci_max_num_sg_ent = 29; armci_max_qp_ous_swr = 100; armci_max_qp_ous_rwr = 50; char *value; if ((value = getenv("ARMCI_USE_ODCM")) != NULL){ armci_use_odcm = atoi(value); } else { armci_use_odcm = 0; } armci_use_lazy_break = 0; if(armci_max_qp_ous_rwr + armci_max_qp_ous_swr>nic->attr.max_qp_wr){ armci_max_qp_ous_swr = nic->attr.max_qp_wr/16; armci_max_qp_ous_rwr = nic->attr.max_qp_wr - armci_max_qp_ous_swr; } if(armci_max_num_sg_ent >= nic->attr.max_sge){ armci_max_num_sg_ent = nic->attr.max_sge - 1; } } void armci_setaffinity(char *cpu_mapping) { long N_CPUs_online; cpu_set_t affinity_mask; unsigned long affinity_mask_len = sizeof(affinity_mask); char *tp; char *cp; char tp_str[8]; int cpu, i, j; if (!armci_use_affinity) return; /*Get number of CPU on machine */ if ((N_CPUs_online = sysconf(_SC_NPROCESSORS_ONLN)) < 1) { perror("sysconf"); } if (cpu_mapping) { tp = cpu_mapping; j = 0; while (*tp != '\0') { i = 0; cp = tp; while (*cp != '\0' && *cp != ',' && *cp != ':') { cp++; i++; } strncpy(tp_str, tp, i); tp_str[i] = '\0'; cpu = atoi(tp_str); if (j == armci_me - armci_master) { CPU_ZERO(&affinity_mask); CPU_SET(cpu, &affinity_mask); if (sched_setaffinity(0, affinity_mask_len, &affinity_mask)<0 ) { perror("sched_setaffinity"); } break; } tp = cp + 1; j++; } free(cpu_mapping); } else { CPU_ZERO(&affinity_mask); CPU_SET(((armci_me) - armci_master) %N_CPUs_online, &affinity_mask); if (sched_setaffinity(0,affinity_mask_len,&affinity_mask)<0 ) { perror("sched_setaffinity"); } } } /****************MEMORY ALLOCATION REGISTRATION DEREGISTRATION****************/ static char * serv_malloc_buf_base; #if ARMCI_ENABLE_GPC_CALLS extern gpc_buf_t *gpc_req; #endif void armci_server_alloc_bufs() { int rc; int mod, bytes, total, extra =sizeof(struct ibv_recv_wr)*MAX_DESCR+SIXTYFOUR; int mhsize = armci_nproc*sizeof(armci_vapi_memhndl_t); /* ack */ char *tmp, *tmp0; int i, j=0; #if defined(PEND_BUFS) int clients = (IMM_BUF_NUM+1)*armci_nproc; #else int clients = armci_nproc; #endif /* allocate memory for the recv buffers-must be alligned on 64byte bnd */ /* note we add extra one to repost it for the client we are received req */ bytes = (clients+1)*sizeof(vapibuf_t)+sizeof(vapibuf_ext_t) + extra+ mhsize #if ARMCI_ENABLE_GPC_CALLS + MAX_GPC_REQ * sizeof(gpc_buf_t) #endif #if defined(PEND_BUFS) + (clients+1)*IMM_BUF_LEN + PENDING_BUF_NUM*(sizeof(vapibuf_pend_t)+PENDING_BUF_LEN) #endif + sizeof(long) + 7*SIXTYFOUR; total = bytes + SIXTYFOUR; if(total%4096!=0) total = total - (total%4096) + 4096; tmp0=tmp = malloc(total); serv_malloc_buf_base = tmp0; dassert1(1,tmp!=NULL,(int)total); /* stamp the last byte */ serv_tail= tmp + bytes+SIXTYFOUR-1; *serv_tail=SERV_STAMP; /* allocate memory for client memory handle to support put response * in dynamic memory registration protocols */ CLN_handle = (armci_vapi_memhndl_t*)tmp; memset(CLN_handle,0,mhsize); /* set it to zero */ tmp += mhsize; #if ARMCI_ENABLE_GPC_CALLS /* gpc_req memory*/ tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); gpc_req = (gpc_buf_t *)tmp; tmp += MAX_GPC_REQ * sizeof(gpc_buf_t); #endif /* setup descriptor memory */ tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); serv_descr_pool.descr= (struct ibv_recv_wr *)(tmp); tmp += extra; /* setup ack buffer*/ tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); ack_buf = (long *)(tmp); *ack_buf=ARMCI_STAMP; tmp += sizeof(long); /* setup buffer pointers */ tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); serv_buf_arr = (vapibuf_t **)malloc(sizeof(vapibuf_t*)*clients); for(i=0;ibuf = tmp + i*IMM_BUF_LEN; } tmp += clients*IMM_BUF_LEN; /*setup pending buffers*/ tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); serv_pendbuf_arr = (vapibuf_pend_t *)(tmp); tmp=(char *)(serv_pendbuf_arr+PENDING_BUF_NUM); tmp += SIXTYFOUR - ((ssize_t)tmp % SIXTYFOUR); for(i=0; ibuf; #endif flag_arr = (int *)malloc(sizeof(int)*armci_nproc); for (i =0; iptag,CLN_nic->handle);fflush(stdout); } serv_memhandle.memhndl = ibv_reg_mr(CLN_nic->ptag, tmp0, total, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ); dassert1(1,serv_memhandle.memhndl!=NULL,total); serv_memhandle.lkey=serv_memhandle.memhndl->lkey; serv_memhandle.rkey=serv_memhandle.memhndl->rkey; /* exchange address of ack/memhandle flag on servers */ if(DEBUG_SERVER){ printf("%d(s):registered mem %p %dbytes mhandle=%d mharr starts%p\n", armci_me, tmp0, total, serv_memhandle.memhndl,CLN_handle); fflush(stdout); } } static char * client_malloc_buf_base; char * armci_vapi_client_mem_alloc(int size) { int rc; int mod, total; int extra = MAX_DESCR*sizeof(struct ibv_recv_wr)+SIXTYFOUR; char *tmp,*tmp0; /*we use the size passed by the armci_init_bufs routine instead of bytes*/ total = size + extra + 2*SIXTYFOUR; if(total%4096!=0) total = total - (total%4096) + 4096; tmp0 = tmp = malloc(total); dassert1(1,tmp!=NULL,total); client_malloc_buf_base = tmp; #if 0 /*SK: could this lead to a problem at ibv_reg_mr() because of unfixed 'total'?*/ if(ALIGN64ADD(tmp0))tmp0+=ALIGN64ADD(tmp0); #endif /* stamp the last byte */ client_tail= tmp + extra+ size +2*SIXTYFOUR-1; *client_tail=CLIENT_STAMP; /* we also have a place to store memhandle for zero-copy get */ pinned_handle =(armci_vapi_memhndl_t *) (tmp + extra+ size +SIXTYFOUR-16); mod = ((ssize_t)tmp)%SIXTYFOUR; client_descr_pool.descr= (struct ibv_recv_wr*)(tmp+SIXTYFOUR-mod); tmp += extra; client_memhandle.memhndl = ibv_reg_mr(SRV_nic->ptag, tmp0, total, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ); dassert(1,client_memhandle.memhndl!=NULL); client_memhandle.lkey = client_memhandle.memhndl->lkey; client_memhandle.rkey = client_memhandle.memhndl->rkey; handle_array[armci_me].lkey = client_memhandle.lkey; handle_array[armci_me].rkey = client_memhandle.rkey; handle_array[armci_me].memhndl = client_memhandle.memhndl; if(DEBUG_INIT){ printf("%d: registered client memory %p %dsize tmp=%p \n", armci_me,tmp0, total, tmp); fflush(stdout); } /*now that we have the handle array, we get every body elses RDMA handle*/ total = (sizeof(armci_vapi_memhndl_t)*armci_nproc)/sizeof(int); armci_msg_gop_scope(SCOPE_ALL,handle_array,total,"+",ARMCI_INT); return(tmp); } void armci_server_register_region(void *ptr,long bytes, ARMCI_MEMHDL_T *memhdl) { bzero(memhdl,sizeof(ARMCI_MEMHDL_T)); memhdl->memhndl = ibv_reg_mr(CLN_nic->ptag, ptr, bytes, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ); dassert(1,memhdl->memhndl!=NULL); memhdl->lkey=memhdl->memhndl->lkey; memhdl->rkey=memhdl->memhndl->rkey; if(DEBUG_SERVER){ printf("\n%d(s):registered lkey=%d rkey=%d ptr=%p end=%p %p\n",armci_me, memhdl->lkey,memhdl->rkey,ptr,(char *)ptr+bytes,memhdl); fflush(stdout); } } int armci_pin_contig_hndl(void *ptr, size_t bytes, ARMCI_MEMHDL_T *memhdl) { memhdl->memhndl = ibv_reg_mr(SRV_nic->ptag, ptr, bytes, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ); dassert(1,memhdl->memhndl!=NULL); memhdl->lkey=memhdl->memhndl->lkey; memhdl->rkey=memhdl->memhndl->rkey; if(0){ printf("\n%d:registered lkey=%d rkey=%d ptr=%p end=%p\n",armci_me, memhdl->lkey,memhdl->rkey,ptr,(char *)ptr+bytes);fflush(stdout); } return 1; } #if 1 void armci_network_client_deregister_memory(ARMCI_MEMHDL_T *mh) { int rc; rc = ibv_dereg_mr(mh->memhndl); dassert1(1,rc==0,rc); armci_vapi_check_return(DEBUG_FINALIZE,rc, "armci_network_client_deregister_memory:deregister_mr"); } void armci_network_server_deregister_memory(ARMCI_MEMHDL_T *mh) { int rc; return; /* ??? why ??? */ printf("\n%d:deregister ptr=%p",armci_me,mh);fflush(stdout); rc = ibv_dereg_mr(mh->memhndl); dassert1(1,rc==0,rc); armci_vapi_check_return(DEBUG_FINALIZE,rc, "armci_network_server_deregister_memory:deregister_mr"); } #else # define armci_network_client_deregister_memory(mh) \ armci_vapi_check_return(DEBUG_FINALIZE, \ ibv_dereg_mr(mh->memhndl), \ "armci_network_client_deregister_memory:deregister_mr") # define armci_network_server_deregister_memory(mh) \ armci_vapi_check_return(DEBUG_FINALIZE, \ ibv_dereg_mr(mh->memhndl), \ "armci_network_server_deregister_memory:deregister_mr") #endif void armci_set_serv_mh() { int s, ratio = sizeof(ack_t)/sizeof(int); /* first collect addrresses on all masters */ if(armci_me == armci_master){ SRV_ack[armci_clus_me].prem_handle=CLN_handle; SRV_ack[armci_clus_me].handle =serv_memhandle; armci_msg_gop_scope(SCOPE_MASTERS,SRV_ack,ratio*armci_nclus,"+", ARMCI_INT); } /* next master broadcasts the addresses within its node */ armci_msg_bcast_scope(SCOPE_NODE,SRV_ack,armci_nclus*sizeof(ack_t), armci_master); /* Finally save address corresponding to my id on each server */ for(s=0; s< armci_nclus; s++){ SRV_ack[s].prem_handle += armci_me; } } /**********END MEMORY ALLOCATION REGISTRATION AND DEREGISTRATION**************/ /*\ * init_connections, client_connect_to_servers -- client code * server_initial_connection, all_data_server -- server code \*/ void armci_init_connections() { int c,s; int sz; uint32_t *tmpbuf; int *tmparr; if(TIME_INIT)inittime0 = MPI_Wtime(); #if defined(PEND_BUFS) armci_pbuf_init_buffer_env(); #endif armci_setaffinity(NULL); /* initialize nic connection for qp numbers and lid's */ armci_init_nic(SRV_nic,1,1); for(c=0; c < NUMOFBUFFERS+1; c++) { mark_buf_send_complete[c]=1; } _gtmparr = (int *)calloc(armci_nproc,sizeof(int)); /*qp_numbers and lids need to be exchanged globally*/ tmparr = (int *)calloc(armci_nproc,sizeof(int)); tmparr[armci_me] = SRV_nic->lid_arr[armci_me]; sz = armci_nproc; armci_msg_gop_scope(SCOPE_ALL,tmparr,sz,"+",ARMCI_INT); for(c=0;clid_arr[c]=tmparr[c]; tmparr[c]=0; } /*SRV_con is for client to connect to servers */ SRV_con=(armci_connect_t *)malloc(sizeof(armci_connect_t)*armci_nclus); dassert1(1,SRV_con!=NULL,sizeof(armci_connect_t)*armci_nclus); bzero(SRV_con,sizeof(armci_connect_t)*armci_nclus); CLN_con=(armci_connect_t*)malloc(sizeof(armci_connect_t)*armci_nproc); dassert1(1,CLN_con!=NULL,sizeof(armci_connect_t)*armci_nproc); bzero(CLN_con,sizeof(armci_connect_t)*armci_nproc); /*every client creates a qp with every server other than the one on itself*/ SRV_rqpnums = (uint32_t*)malloc(sizeof(uint32_t)*armci_nproc); dassert(1,SRV_rqpnums); tmpbuf = (uint32_t*)calloc(armci_nproc,sizeof(uint32_t)); dassert(1,tmpbuf); sz = armci_nproc*(sizeof(uint32_t)/sizeof(int)); armci_vapi_max_inline_size = 0; if (!armci_use_odcm) { for(s = 0; s < armci_nclus; s++){ armci_connect_t *con = SRV_con + s; { armci_create_qp(SRV_nic,&con->qp); con->sqpnum = con->qp->qp_num; tmpbuf[armci_clus_info[s].master] = con->qp->qp_num; con->lid = SRV_nic->lid_arr[s]; } } MPI_Alltoall(tmpbuf,sizeof(uint32_t),MPI_CHAR,SRV_rqpnums, sizeof(uint32_t),MPI_CHAR,ARMCI_COMM_WORLD); free(tmpbuf); if(armci_me != armci_master) { free(SRV_rqpnums); SRV_rqpnums = NULL; } } else { for(s = 0; s < armci_nclus; s++){ armci_connect_t *con = SRV_con + s; con->state = QP_INACTIVE; } } SRV_ack = (ack_t*)calloc(armci_nclus, sizeof(ack_t)); dassert1(1,SRV_ack!=NULL,armci_nclus*sizeof(ack_t)); handle_array = (armci_vapi_memhndl_t *)calloc(sizeof(armci_vapi_memhndl_t), armci_nproc); dassert1(1,handle_array!=NULL,sizeof(armci_vapi_memhndl_t)*armci_nproc); if (armci_use_odcm) { setup_ud_channel(); } } static void vapi_connect_client() { int i, start, sz=0, c, rc; struct ibv_qp_attr qp_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; if (TIME_INIT) inittime0 = MPI_Wtime(); if (armci_me == armci_master) armci_util_wait_int(&armci_vapi_server_stage1, 1, 10); if (TIME_INIT) printf("\n%d:wait for server to get to stage 1 time for " "vapi_connect_client is %f", armci_me, (inittime1 = MPI_Wtime()) - inittime0); sz = armci_nproc; if (armci_me == armci_master) { armci_msg_gop_scope(SCOPE_MASTERS, _gtmparr, sz, "+", ARMCI_INT); for (c=0; clid_arr[c] = _gtmparr[c]; _gtmparr[c] = 0; } if (DEBUG_CLN) { printf("\n%d(svc): mylid = %d",armci_me,CLN_nic->lid_arr[armci_me]); fflush(stdout); } } armci_vapi_client_stage1 = 1; /* allocate and initialize connection structs */ sz = armci_nproc*sizeof(uint32_t)/sizeof(int); if (armci_me == armci_master) armci_util_wait_int(&armci_vapi_server_stage2, 1, 10); #if 0 for (c = 0; c < armci_nproc; c++){ armci_connect_t *con = CLN_con + c; if (armci_me != armci_master) { char *ptrr; int extra; ptrr = malloc(8 + sizeof(uint32_t) * armci_nproc); extra = ALIGNLONGADD(ptrr); ptrr = ptrr + extra; con->rqpnum = (uint32_t *)ptrr; bzero(con->rqpnum, sizeof(uint32_t) * armci_nproc); } armci_msg_gop_scope(SCOPE_ALL, con->rqpnum, sz, "+", ARMCI_INT); } #else CLN_rqpnums = (uint32_t*)malloc(sizeof(uint32_t)*armci_nproc); if (!armci_use_odcm) { if(armci_me != armci_master) { /*just has junk*/ CLN_rqpnumtmpbuf = (uint32_t*)malloc(sizeof(uint32_t)*armci_nproc); } dassert(1, CLN_rqpnumtmpbuf); MPI_Alltoall(CLN_rqpnumtmpbuf, sizeof(uint32_t), MPI_CHAR, CLN_rqpnums, sizeof(uint32_t), MPI_CHAR, ARMCI_COMM_WORLD); free(CLN_rqpnumtmpbuf); CLN_rqpnumtmpbuf=NULL; #endif if (TIME_INIT) printf("\n%d:wait for server tog et to stage 2 time for " "vapi_connect_client is %f", armci_me, (inittime2 = MPI_Wtime()) - inittime1); /*armci_set_serv_mh();*/ if (DEBUG_CLN) { printf("%d:all connections ready\n", armci_me); fflush(stdout); } /* For sanity */ memset(&qp_attr, 0, sizeof qp_attr); /* Modifying QP to INIT */ qp_attr_mask = IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = DEFAULT_PKEY_IX; qp_attr.port_num = SRV_nic->active_port; qp_attr.qp_access_flags = IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ; /* start from from server on my_node -1 */ start = (armci_clus_me == 0) ? armci_nclus - 1 : armci_clus_me - 1; for (i = 0; i < armci_nclus; i++) { armci_connect_t *con; con = SRV_con + i; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); dassertp(1,!rc,("%d: client RST->INIT i=%d rc=%d\n",armci_me,i,rc)); } if (TIME_INIT) printf("\n%d:to init time for vapi_connect_client is %f", armci_me, (inittime1 = MPI_Wtime()) - inittime2); qp_attr_mask = IBV_QP_STATE | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_PATH_MTU | IBV_QP_RQ_PSN | IBV_QP_MIN_RNR_TIMER; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_RTR; qp_attr.max_dest_rd_atomic = 4; qp_attr.path_mtu = IBV_MTU_1024; qp_attr.rq_psn = 0; qp_attr.min_rnr_timer = RNR_TIMER; /* AV: Adding the service level parameter */ qp_attr.ah_attr.sl = armci_openib_sl; start = (armci_clus_me == 0) ? armci_nclus - 1 : armci_clus_me - 1; for (i = 0; i < armci_nclus; i++) { armci_connect_t *con; armci_connect_t *conS; con = SRV_con + i; #if 0 conS = CLN_con + armci_me; #endif qp_attr_mask |= IBV_QP_AV | IBV_QP_DEST_QPN; #if 0 qp_attr.dest_qp_num = conS->rqpnum[armci_clus_info[i].master]; #else qp_attr.dest_qp_num = CLN_rqpnums[armci_clus_info[i].master]; #endif qp_attr.ah_attr.dlid = SRV_nic->lid_arr[armci_clus_info[i].master]; qp_attr.ah_attr.port_num = SRV_nic->active_port; qp_attr.ah_attr.sl = armci_openib_sl; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); dassertp(1,!rc,("%d: INIT->RTR client i=%d rc=%d\n",armci_me,i,rc)); } } /*to to to RTS, other side must be in RTR*/ armci_msg_barrier(); if (TIME_INIT) printf("\n%d:init to rtr time for vapi_connect_client is %f", armci_me, (inittime2 = MPI_Wtime()) - inittime1); armci_vapi_client_ready=1; if (!armci_use_odcm) { qp_attr_mask = IBV_QP_STATE | IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 0; qp_attr.timeout = 18; qp_attr.retry_cnt = 7; qp_attr.rnr_retry = 7; qp_attr.max_rd_atomic = 4; start = (armci_clus_me == 0) ? armci_nclus - 1 : armci_clus_me - 1; for (i = 0; i < armci_nclus; i++){ armci_connect_t *con; con = SRV_con + i; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); dassertp(1,!rc,("%d: client RTR->RTS i=%d rc=%d\n",armci_me,i,rc)); } if (TIME_INIT) printf("\n%d:rtr to rts time for vapi_connect_client is %f", armci_me, (inittime1 = MPI_Wtime()) - inittime2); free(CLN_rqpnums); CLN_rqpnums=NULL; } } void armci_client_connect_to_servers() { extern void armci_util_wait_int(volatile int *,int,int); if (TIME_INIT) inittime0 = MPI_Wtime(); _armci_buf_init(); vapi_connect_client(); if (armci_me == armci_master) armci_util_wait_int(&armci_vapi_server_ready,1,10); armci_msg_barrier(); if (DEBUG_CLN && armci_me == armci_master) { printf("\n%d:server_ready=%d\n",armci_me,armci_vapi_server_ready); fflush(stdout); } if (TIME_INIT) printf("\n%d:time for client_connect_to_s is %f", armci_me,MPI_Wtime()-inittime0); } void armci_init_vapibuf_recv(struct ibv_recv_wr *rd, struct ibv_sge *sg_entry, char *buf, int len, armci_vapi_memhndl_t *mhandle) { memset(rd,0,sizeof(struct ibv_recv_wr)); rd->next = NULL; rd->num_sge = 1; rd->sg_list = sg_entry; rd->wr_id = 0; sg_entry->lkey = mhandle->lkey; sg_entry->addr = (uint64_t)buf; sg_entry->length = len; } void armci_init_vapibuf_send(struct ibv_send_wr *sd, struct ibv_sge *sg_entry, char *buf, int len, armci_vapi_memhndl_t *mhandle) { sd->opcode = IBV_WR_SEND; sd->next = NULL; sd->send_flags = IBV_SEND_SIGNALED; sd->num_sge = 1; sd->sg_list = sg_entry; sg_entry->lkey = mhandle->lkey; sg_entry->addr = (uint64_t)buf; sg_entry->length = len; } static void armci_init_cbuf_srdma(struct ibv_send_wr *sd, struct ibv_sge *sg_entry, char *lbuf, char *rbuf, int len, armci_vapi_memhndl_t *lhandle, armci_vapi_memhndl_t *rhandle) { /* NOTE: sd->wr is a union, sr->wr.ud might conflict with sr->wr.rdma */ sd->opcode = IBV_WR_RDMA_WRITE; sd->send_flags = IBV_SEND_SIGNALED; sd->next = NULL; sd->num_sge = 1; sd->sg_list = sg_entry; if (rhandle) sd->wr.rdma.rkey = rhandle->rkey; sd->wr.rdma.remote_addr = (uint64_t)rbuf; if (lhandle) sg_entry->lkey = lhandle->lkey; sg_entry->addr = (uint64_t)lbuf; sg_entry->length = len; } static void armci_init_cbuf_rrdma(struct ibv_send_wr *sd, struct ibv_sge *sg_entry, char *lbuf, char *rbuf, int len, armci_vapi_memhndl_t *lhandle, armci_vapi_memhndl_t *rhandle) { sd->opcode = IBV_WR_RDMA_READ; sd->next = NULL; sd->send_flags = IBV_SEND_SIGNALED; sd->num_sge = 1; sd->sg_list = sg_entry; sd->wr.ud.remote_qkey = 0; if (rhandle) sd->wr.rdma.rkey = rhandle->rkey; sd->wr.rdma.remote_addr = (uint64_t)rbuf; if (lhandle) sg_entry->lkey = lhandle->lkey; sg_entry->addr = (uint64_t)lbuf; sg_entry->length = len; /* sd->wr is a union, sr->wr.ud might conflict with sr->wr.rdma */ } void armci_server_initial_connection() { int c, rc, i, j; struct ibv_qp_attr qp_attr; struct ibv_qp_init_attr qp_init_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; char *enval; struct ibv_recv_wr *bad_wr; if (TIME_INIT) inittime0 = MPI_Wtime(); if (DEBUG_SERVER) { printf("in server after fork %d (%d)\n",armci_me,getpid()); fflush(stdout); } #if defined(PEND_BUFS) && !defined(SERVER_THREAD) armci_pbuf_init_buffer_env(); #endif armci_init_nic(CLN_nic,1,1); if (!armci_openib_server_poll) { /* * Start a notify event request immediately after creation so * nothing is missed. */ rc = ibv_req_notify_cq(CLN_nic->rcq, 0); dassert1(1,rc==0,rc); } _gtmparr[armci_me] = CLN_nic->lid_arr[armci_me]; armci_vapi_server_stage1 = 1; armci_util_wait_int(&armci_vapi_client_stage1, 1, 10); CLN_rqpnumtmpbuf = (uint32_t*)malloc(sizeof(uint32_t)*armci_nproc); dassert(1, CLN_rqpnumtmpbuf); if (!armci_use_odcm) { for (c = 0; c < armci_nproc; c++) { char *ptrr; int extra; armci_connect_t *con = CLN_con + c; armci_create_qp(CLN_nic, &con->qp); con->sqpnum = con->qp->qp_num; con->lid = CLN_nic->lid_arr[c]; CLN_rqpnumtmpbuf[c] = con->qp->qp_num; } } else { for (c = 0; c < armci_nproc; c++) { armci_connect_t *con = CLN_con + c; con->state = QP_INACTIVE; } } armci_vapi_server_stage2 = 1; if (!armci_use_odcm) { qp_attr_mask = IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = DEFAULT_PKEY_IX; qp_attr.port_num = CLN_nic->active_port; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ; for (c = 0; c < armci_nproc; c++) { armci_connect_t *con = CLN_con + c; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); dassertp(1,!rc,("%d: RTS->INIT server c=%d rc=%d\n",armci_me,c,rc)); } memset(&qp_attr, 0, sizeof qp_attr); qp_attr_mask = IBV_QP_STATE | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_PATH_MTU | IBV_QP_RQ_PSN | IBV_QP_MIN_RNR_TIMER; qp_attr.qp_state = IBV_QPS_RTR; qp_attr.path_mtu = IBV_MTU_1024; qp_attr.max_dest_rd_atomic = 4; qp_attr.min_rnr_timer = RNR_TIMER; qp_attr.rq_psn = 0; for(c = 0; c < armci_nproc; c++) { armci_connect_t *con = CLN_con + c; qp_attr_mask |= IBV_QP_DEST_QPN | IBV_QP_AV; qp_attr.dest_qp_num = SRV_rqpnums[c]; qp_attr.ah_attr.dlid = SRV_nic->lid_arr[c]; qp_attr.ah_attr.port_num = CLN_nic->active_port; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); dassertp(1,!rc,("%d: INIT->RTR server cln=%d rc=%d\n",armci_me,c,rc)); } } armci_util_wait_int(&armci_vapi_client_ready,1,10); memset(&qp_attr, 0, sizeof qp_attr); if (!armci_use_odcm) { qp_attr_mask = IBV_QP_STATE | IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 0; qp_attr.timeout = 18; qp_attr.retry_cnt = 7; qp_attr.rnr_retry = 7; qp_attr.max_rd_atomic = 4; for (c = 0; c < armci_nproc; c++) { armci_connect_t *con = CLN_con + c; rc = ibv_modify_qp(con->qp, &qp_attr,qp_attr_mask); dassertp(1,!rc,("%d: server RTR->RTS cln=%d rc=%d\n",armci_me,c,rc)); } free(SRV_rqpnums); SRV_rqpnums = NULL; } armci_server_alloc_bufs(); if (!armci_use_odcm) { /* setup descriptors and post nonblocking receives */ #if defined(PEND_BUFS) assert(armci_nproc*(IMM_BUF_NUM+1)dscr, &cbuf->sg_entry, cbuf->buf, IMM_BUF_LEN, &serv_memhandle); /* we use index of the buffer to identify the buffer, this index is * returned with a call to ibv_poll_cq inside the ibv_wr */ cbuf->dscr.wr_id = i*(IMM_BUF_NUM+1)+j + DSCRID_IMMBUF_RECV; if (DEBUG_SERVER) { printf("\n%d(s):posted rr with lkey=%d",armci_me,cbuf->sg_entry.lkey); fflush(stdout); } rc = ibv_post_recv((CLN_con+i)->qp, &cbuf->dscr, &bad_wr); dassert1(1,rc==0,rc); } } #else for(i = 0; i < armci_nproc; i++) { vapibuf_t *cbuf; cbuf = serv_buf_arr[i]; armci_init_vapibuf_recv(&cbuf->dscr, &cbuf->sg_entry, cbuf->buf, CBUF_DLEN, &serv_memhandle); /* we use index of the buffer to identify the buffer, this index is * returned with a call to ibv_poll_cq inside the ibv_wr */ cbuf->dscr.wr_id = i+armci_nproc; if (DEBUG_SERVER) { printf("\n%d(s):posted rr with lkey=%d",armci_me,cbuf->sg_entry.lkey); fflush(stdout); } rc = ibv_post_recv((CLN_con+i)->qp, &cbuf->dscr, &bad_wr); dassert1(1,rc==0,rc); } #endif } if (TIME_INIT) printf("\n%d:post time for server_initial_conn is %f", armci_me, MPI_Wtime() - inittime4); armci_vapi_server_ready=1; if (DEBUG_SERVER) { printf("%d: server connected to all clients\n",armci_me); fflush(stdout); } if (TIME_INIT) printf("\n%d:time for server_initial_conn is %f", armci_me, MPI_Wtime() - inittime0); } static void armci_finalize_nic(vapi_nic_t *nic) { int ret; ret = ibv_destroy_cq(nic->scq); dassert1(1,ret==0,ret); armci_vapi_check_return(DEBUG_FINALIZE,ret,"armci_finalize_nic:destroy_scq"); ret = ibv_destroy_comp_channel(nic->sch); dassert1(1,ret==0,ret); armci_vapi_check_return(DEBUG_FINALIZE,ret,"armci_finalize_nic:destroy_sch"); ret = ibv_destroy_cq(nic->rcq); dassert1(1,ret==0,ret); armci_vapi_check_return(DEBUG_FINALIZE,ret,"armci_finalize_nic:destroy_rcq"); ret = ibv_destroy_comp_channel(nic->rch); dassert1(1,ret==0,ret); armci_vapi_check_return(DEBUG_FINALIZE,ret,"armci_finalize_nic:destroy_rch"); ret = ibv_close_device(nic->handle); dassert1(1,ret==0,ret); armci_vapi_check_return(DEBUG_FINALIZE,ret,"armci_finalize_nic:release_hca"); } void armci_server_transport_cleanup() { int s; int rc; /*first we have empty send/recv queues TBD*/ if(serv_malloc_buf_base){ rc = ibv_dereg_mr(serv_memhandle.memhndl); dassert1(1,rc==0,rc); armci_vapi_check_return(DEBUG_FINALIZE,rc, "armci_server_transport_cleanup:deregister_mr"); /*now free it*/ free(serv_malloc_buf_base); } /*now deregister all my regions from regionskk.c*/ armci_server_region_destroy(); if (CLN_con) { for (s = 0; s < armci_nproc; s++) { armci_connect_t *con = CLN_con + s; if (con->qp) { rc = ibv_destroy_qp(con->qp); armci_vapi_check_return(DEBUG_FINALIZE,rc, "armci_server_transport_cleanup:destroy_qp"); } #if 0 free(con->rqpnum); #endif } free(CLN_con); } armci_finalize_nic(CLN_nic); } void armci_transport_cleanup() { int s; int rc; /*first deregister buffers memory */ if (client_malloc_buf_base) { rc = ibv_dereg_mr(client_memhandle.memhndl); dassert1(1,rc==0,rc); armci_vapi_check_return(DEBUG_FINALIZE,rc,"armci_client_transport_cleanup:deregister_mr"); /*now free it*/ free(client_malloc_buf_base); } /*now deregister all my regions from regions.c*/ armci_region_destroy(); if (SRV_con) { for (s = 0; s < armci_nclus; s++) { armci_connect_t *con = SRV_con + s; if (con->qp) { rc = ibv_destroy_qp(con->qp); dassert1(1,rc==0,rc); armci_vapi_check_return(DEBUG_FINALIZE,rc,"armci_client_transport_cleanup:destroy_qp"); } #if 0 free(con->rqpnum); #endif } free(SRV_con); } armci_finalize_nic(SRV_nic); } /** Post an immediate buffer back for the client to send. */ static void _armci_pendbuf_post_immbuf(vapibuf_t *cbuf, int to) { int rc; struct ibv_recv_wr *bad_wr; #if defined(PEND_BUFS) assert(cbuf->dscr.wr_id == cbuf-serv_buf_arr[0]+DSCRID_IMMBUF_RECV); #endif rc = ibv_post_recv((CLN_con+to)->qp, &(cbuf->dscr), &bad_wr); dassert1(1,rc==0,rc); } #if defined(PEND_BUFS) #define DSCRID_TO_IMMBUFID(x) (x-DSCRID_IMMBUF_RECV) #else #define DSCRID_TO_IMMBUFID(x) ((x)-armci_nproc) #endif #if defined(PEND_BUFS) /**Obtain a message receive buffer to receive a message. Used in place * of MessageRcvBuffer. Should not be used. */ char *armci_openib_get_msg_rcv_buf(int proc) { armci_die("PEND_BUFS in OPENIB: MessageRcvBuffer not available. Should use the in-place buffers to receive data", proc); return NULL; } /** Check that the data is in a server allocated buffer. This is * guaranteed to be pinned. Ideally, this should always be true. Any * operation that request alternative support will have to fix this * function and possibly @armci_openib_get_msg_rcv_buf(). * @param br IN Buffer pointer being checked * @return 1 if it is a server-allocated buffer. 0 otherwise. */ int armci_data_in_serv_buf(void *br) { if(br>=(void *)serv_malloc_buf_base && br<(void *)serv_tail) return 1; if(DEBUG_SERVER) { printf("%d:: serv_bufs=%p<->%p. br=%p out of range\n", armci_me, serv_malloc_buf_base, serv_tail, br); fflush(stdout); } return 0; } #define PBUF_BUFID_TO_PUT_WRID(_pbufid) (DSCRID_PENDBUF+(_pbufid)*2) #define PBUF_BUFID_TO_GET_WRID(_pbufid) (DSCRID_PENDBUF+(_pbufid)*2+1) #define PBUF_WRID_TO_PBUFID(_id) (((_id)-DSCRID_PENDBUF)/2) #define PBUF_IS_GET_WRID(_id) (((_id)-DSCRID_PENDBUF)&1) #define PBUF_IS_PUT_WRID(_id) (!(((_id)-DSCRID_PENDBUF)&1)) /**Complete processing this immediate buffer. Parameters is void *, * since vapibuf_t*|immbuf_t* is not available in armci-vapi.h */ void armci_complete_immbuf(void *buf) { vapibuf_t *cbuf = (vapibuf_t*)buf; request_header_t *msginfo=(request_header_t*)cbuf->buf; #if SRI_CORRECT #error cbuf->send_pending = 0; #else _armci_pendbuf_post_immbuf(cbuf,msginfo->from); #endif armci_data_server(cbuf); if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)) { SERVER_SEND_ACK(msginfo->from); } #if SRI_CORRECT if(!cbuf->send_pending) { _armci_pendbuf_post_immbuf(cbuf,msginfo->from); } #endif } /**Complete processing this pending buffer. Parameters is void *, * since vapibuf_t*|immbuf_t* is not available in armci-vapi.h. Note * that the pending buffer may not yet be available for reuse. This * will depend on the state of the pending buffer (which might have to * wait for a communication innitiated by armci_data_server() to * complete. */ void armci_complete_pendbuf(void *buf) { vapibuf_pend_t *pbuf = (vapibuf_pend_t *)buf; request_header_t *msginfo=(request_header_t*)pbuf->buf; assert(pbuf->vbuf); #if SRI_CORRECT pbuf->cbuf->send_pending=0; #else _armci_pendbuf_post_immbuf(pbuf->vbuf,msginfo->from); #endif armci_data_server(pbuf); if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)) { SERVER_SEND_ACK(msginfo->from); } #if SRI_CORRECT #error assert(!pbuf->cbuf->send_pending); _armci_pendbuf_post_immbuf(pbuf->cbuf,msginfo->from); #endif } void _armci_get_data_from_client(int proc, struct ibv_send_wr *sdscr, int dscrid, struct ibv_sge *ssg_entry, void *rbuf, void *lbuf, int bytes) ; void _armci_send_data_to_client_pbuf(int proc, struct ibv_send_wr *sdscr, int dscrid, struct ibv_sge *ssg_entry, void *rbuf, void *lbuf, int bytes); int no_srv_copy_nsegs_ulimit() { return armci_max_qp_ous_swr*armci_max_num_sg_ent/10; } /** Initiate a get operation to progress a pending buffer. * @param msginfo Request header for any additional processing * @param src Pointer to src of data (remote for GET) * @param dst Pointer to dst * @param bytes #bytes to transfer * @param proc proc to transfer from(for get)/to(for put) * @param pbufid Index of pending buffer */ void armci_pbuf_start_get(void *msg_info, void *src, void *dst, int bytes, int proc, int pbufid) { struct ibv_send_wr sdscr; struct ibv_sge sg_entry; int wrid = PBUF_BUFID_TO_GET_WRID(pbufid); request_header_t *msginfo=(request_header_t *)msg_info; void armci_server_rdma_contig_to_strided(char *src_ptr, int proc, char *dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, request_header_t *msginfo); #if defined(PUT_NO_SRV_COPY) if(msginfo->operation==PUT && msginfo->format==STRIDED && !msginfo->pinned && src==msginfo->tag.data_ptr) { char *loc_ptr, *rem_ptr; int stride_levels, *count; int *loc_stride_arr; char *dscr = (char *)(msginfo+1); ARMCI_MEMHDL_T *mhloc=NULL; int nsegs, i; /* unpack descriptor record */ loc_ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); loc_stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; rem_ptr = msginfo->tag.data_ptr; nsegs = 1; for(i=0; ifrom); if(nsegswr_id = dscrid; struct ibv_send_wr *bad_wr; rc = ibv_post_send((CLN_con+proc)->qp, sdscr, &bad_wr); dassert1(1,rc==0,rc); } void _armci_send_data_to_client_pbuf(int proc, struct ibv_send_wr *sdscr, int dscrid, struct ibv_sge *ssg_entry, void *rbuf, void *lbuf, int bytes) { int rc = 0; if(DEBUG_SERVER) { printf("\n%d(s):sending data to client %d at %p flag = %p bytes=%d\n", armci_me, proc,rbuf,(char *)rbuf+bytes-sizeof(int),bytes);fflush(stdout); } memset(sdscr,0,sizeof(struct ibv_send_wr)); armci_init_cbuf_srdma(sdscr,ssg_entry,lbuf,rbuf,bytes, &serv_memhandle,(handle_array+proc)); if(DEBUG_SERVER){ printf("\n%d(s):handle_array[%d]=%p dbuf=%p flag=%p bytes=%d\n",armci_me, proc,&handle_array[proc],(char *)rbuf, (char *)rbuf+bytes-sizeof(int),bytes); fflush(stdout); } sdscr->wr_id = dscrid; struct ibv_send_wr *bad_wr; rc = ibv_post_send((CLN_con+proc)->qp, sdscr, &bad_wr); dassert1(1,rc==0,rc); } #endif #define DATA_SERVER_YIELD_CPU void armci_call_data_server() { int rc = 0; int rc1 = 0; vapibuf_t *cbuf,*cbufs; request_header_t *msginfo,*msg; int c,i,need_ack,pollcount; static int mytag=1; int rrr,serverwcount=0; #ifdef CHANGE_SERVER_AFFINITY cpu_set_t mycpuid,new_mask; char str[CPU_SETSIZE]; char cid[8]; extern char * cpuset_to_cstr(cpu_set_t *mask, char *str); int nslave=armci_clus_info[armci_clus_me].nslave; rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); #endif #if ARMCI_ENABLE_GPC_CALLS unblock_thread_signal(GPC_COMPLETION_SIGNAL); #endif #if defined(PEND_BUFS) armci_pendbuf_init(); #endif for (;;) { struct ibv_wc *pdscr=NULL; struct ibv_wc pdscr1; pdscr = &pdscr1; pdscr->status = IBV_WC_SUCCESS; rc = 0; #ifdef CHANGE_SERVER_AFFINITY static int ccc; serverwcount++; if(serverwcount==100){ serverwcount=0; ccc=(ccc+1)%nslave; sprintf (cid, "%d", ccc); rrr = cstr_to_cpuset(&new_mask,cid); if (sched_setaffinity(0, sizeof (new_mask), &new_mask)) { perror("sched_setaffinity"); printf("failed to set pid %d's affinity.\n", getpid()); } rrr=sched_getaffinity(0, sizeof(mycpuid), &mycpuid); if(rrr)perror("sched_getaffinity"); } #else #ifdef DATA_SERVER_YIELD_CPU_ serverwcount++; if(serverwcount==50){ serverwcount=0;usleep(1); } #endif #endif #if ARMCI_ENABLE_GPC_CALLS block_thread_signal(GPC_COMPLETION_SIGNAL); #endif bzero(pdscr, sizeof(*pdscr)); do { rc = ibv_poll_cq(CLN_nic->rcq, 1, pdscr); if (armci_server_terminating) { /* server is interrupted when clients terminate connections */ armci_server_transport_cleanup(); sleep(1); _exit(0); } if (rc == 0 && !armci_openib_server_poll) { /* wait for a notify event */ rc1 = ibv_get_cq_event(CLN_nic->rch,&CLN_nic->rcq,&CLN_nic->rcq_cntx); dassert1(1,rc1==0,rc1); ibv_ack_cq_events(CLN_nic->rcq, 1); /* re-arm notify event */ rc1 = ibv_req_notify_cq(CLN_nic->rcq, 0); dassert1(1,rc1==0,rc1); /* note: an event receive does not guarantee an actual completion */ continue; } } while (rc == 0); if(DEBUG_SERVER) { printf("\n%d:pdscr=%p %p %d %d %d %d\n",armci_me,pdscr,&pdscr1, pdscr->status,pdscr->opcode,pdscr->vendor_err, pdscr->src_qp); fflush(stdout); } dassertp(1,rc>=0,("%d: rc=%d id=%d status=%d", armci_me,rc,(int)pdscr->wr_id,pdscr->status)); dassert1(1,pdscr->status==IBV_WC_SUCCESS,pdscr->status); if (DEBUG_SERVER) { printf("%d(s) : NEW MESSAGE bytelen %d \n",armci_me,pdscr->byte_len); printf("%d(s) : NEW MESSAGE id is %ld \n",armci_me,pdscr->wr_id); fflush(stdout); } #if defined(PEND_BUFS) if(pdscr->wr_id>=DSCRID_IMMBUF_RESP && pdscr->wr_idwr_id - DSCRID_IMMBUF_RESP; if(id>=0 && idsend_pending==1); serv_buf_arr[id]->send_pending = 0; _armci_pendbuf_post_immbuf(serv_buf_arr[id],dest); } #endif continue; } if (pdscr->wr_id>=DSCRID_PENDBUF && pdscr->wr_idwr_id); /* printf("%d(s) : Progressing pending msg (something completed) pbufid=%d id=%ld byte_len=%d status=%d\n", armci_me, pbufid,pdscr->wr_id,pdscr->byte_len,done_status); */ /* fflush(stdout); */ if(PBUF_IS_GET_WRID(pdscr->wr_id)) armci_pendbuf_done_get(pbufid); else if(PBUF_IS_PUT_WRID(pdscr->wr_id)) armci_pendbuf_done_put(pbufid); else armci_die("Pending buffer op completed. But not PUT or GET!",pdscr->wr_id); continue; } #endif if (pdscr->wr_id >= DSCRID_SCATGAT && pdscr->wr_id < DSCRID_SCATGAT_END) { sr_descr_t *sdscr_arr, *rdscr_arr; if (DEBUG_SERVER) { printf("%d(s) : received SCATGAT DATA id = %ld, length = %d\n", armci_me,pdscr->wr_id, pdscr->byte_len); fflush(stdout); } #if defined(PEND_BUFS) sdscr_arr = armci_vapi_serv_nbsdscr_array; assert(sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends>0); sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends--; if(sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofsends==0) sdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].tag=0; #else rdscr_arr; rdscr_arr = armci_vapi_serv_nbrdscr_array; rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofrecvs--; if(rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].numofrecvs==0) rdscr_arr[pdscr->wr_id-DSCRID_SCATGAT].tag=0; #endif continue; } #if defined(PEND_BUFS) assert(pdscr->wr_id>=DSCRID_IMMBUF_RECV && pdscr->wr_idwr_id)]; assert(cbuf->dscr.wr_id == pdscr->wr_id); msginfo = (request_header_t*)cbuf->buf; armci_ack_proc = c = msginfo->from; if (DEBUG_SERVER) { printf("%d(s) : request id is %ld operation is %d, length is %d from=%d cbuf->dscr.wr_id=%d\n", armci_me,pdscr->wr_id,msginfo->operation,pdscr->byte_len,msginfo->from, (int)cbuf->dscr.wr_id); fflush(stdout); } #if defined(PEND_BUFS) cbufs = cbuf; armci_init_vapibuf_recv(&cbufs->dscr, &cbufs->sg_entry,cbufs->buf, IMM_BUF_LEN, &serv_memhandle); cbufs->dscr.wr_id = pdscr->wr_id; #else cbufs = serv_buf_arr[pdscr->wr_id - armci_nproc] = spare_serv_buf; armci_init_vapibuf_recv(&cbufs->dscr, &cbufs->sg_entry,cbufs->buf, CBUF_DLEN, &serv_memhandle); cbufs->dscr.wr_id = c + armci_nproc; spare_serv_buf = cbuf; #endif if(DEBUG_SERVER) { printf("%d(s):Came out of poll id=%ld\n",armci_me,pdscr->wr_id); fflush(stdout); } if(msginfo->operation == PUT &&msginfo->pinned == 1){ int found, num; int stride_arr[MAX_STRIDE_LEVEL]; /*should be MAX_STRIDE_LEVELS*/ int count[MAX_STRIDE_LEVEL]; void *dest_ptr; int stride_levels; ARMCI_MEMHDL_T *loc_memhandle; void armci_post_scatter(void *,int *,int *,int, armci_vapi_memhndl_t *,int,int,int,sr_descr_t **); /*unpack decsriptor_record : should call a function instead */ msg = msginfo + 1; test_ptr = dest_ptr = *(void**)msg; msg = (request_header_t *) ((char*)msg + sizeof(void*)); test_stride_levels=stride_levels = *(int*)msg; msg = (request_header_t *) ((char*)msg + sizeof(int)); for(i =0; iwr_id)); if(DEBUG_SERVER) { printf("%d(s) : about to call armci_post_scatter\n",armci_me); fflush(stdout); } armci_post_scatter(dest_ptr, stride_arr, count, stride_levels, loc_memhandle,msginfo->from, mytag, SERV,NULL ); mytag = (mytag+1)%(MAX_PENDING); if(mytag==0)mytag=1; if(DEBUG_SERVER) { printf("%d(s) : finished posting %d scatter\n",armci_me,num); fflush(stdout); } _armci_pendbuf_post_immbuf(cbufs, msginfo->from); SERVER_SEND_ACK(msginfo->from); need_ack = 0; } else if(msginfo->operation == REGISTER){ if (DEBUG_SERVER) { printf("%d(s) : Register_op id is %d, comp_dscr_id is %ld\n", armci_me,msginfo->operation,pdscr->wr_id); fflush(stdout); } armci_server_register_region(*((void **)(msginfo+1)), *((long *)((char *)(msginfo+1)+sizeof(void *))), (ARMCI_MEMHDL_T *)(msginfo->tag.data_ptr)); _armci_pendbuf_post_immbuf(cbufs, msginfo->from); *(long *)(msginfo->tag.ack_ptr) = ARMCI_STAMP; continue; } else { if(DEBUG_SERVER) { printf("%d(s) : request is %ld about to call armci_data_server\n", armci_me, pdscr->wr_id); fflush(stdout); } #if defined(PEND_BUFS) armci_pendbuf_service_req(cbuf); #else _armci_pendbuf_post_immbuf(cbufs, msginfo->from); armci_data_server(cbuf); if((msginfo->operation == PUT) || ARMCI_ACC(msginfo->operation)) { /* for operations that do not send data back we can send ACK now */ SERVER_SEND_ACK(msginfo->from); need_ack=0; if(DEBUG_SERVER){ printf("%d(s) : posted ack\n\n",armci_me); fflush(stdout); } } else need_ack=1; #endif } if (0) { printf("%d(s):Done processed request\n\n",armci_me); fflush(stdout); } #if ARMCI_ENABLE_GPC_CALLS unblock_thread_signal(GPC_COMPLETION_SIGNAL); #endif }/* end of for */ } void armci_vapi_complete_buf(armci_vapi_field_t *field,int snd,int rcv,int to,int op) { struct ibv_send_wr *snd_dscr; BUF_INFO_T *info; info = (BUF_INFO_T *)((char *)field-sizeof(BUF_INFO_T)); if(info->tag && op==GET)return; if(snd){ request_header_t *msginfo = (request_header_t *)(field+1); snd_dscr=&(field->sdscr); if(mark_buf_send_complete[snd_dscr->wr_id]==0) armci_send_complete(snd_dscr,"armci_vapi_complete_buf",1); } if(rcv){ int *last; long *flag; int loop = 0; request_header_t *msginfo = (request_header_t *)(field+1); flag = (long *)&msginfo->tag.ack; if(op==PUT || ARMCI_ACC(op)){ if(msginfo->bypass && msginfo->pinned && msginfo->format == STRIDED && op == PUT); else{ while(armci_util_long_getval(flag) != ARMCI_STAMP) { loop++; loop %=100000; if(loop==0){ } } } /* printf("%d: client complete_buf. op=%d loop=%d till *flag=ARMCI_STAMP\n", armci_me,op,loop); */ /* fflush(stdout); */ *flag = 0L; } else{ /*SK: I think we get here only for GET with result directly going to client's pinned memory. (info.tag==0 && op==GET)*/ last = (int *)((char *)msginfo+msginfo->datalen-sizeof(int)); while(armci_util_int_getval(last) == ARMCI_STAMP && armci_util_long_getval(flag) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client last(%p)=%d flag(%p)=%ld off=%d\n", armci_me,last,*last,flag,*flag,msginfo->datalen); fflush(stdout); } } } } } } void armci_vapi_test_buf(armci_vapi_field_t *field,int snd,int rcv,int to,int op, int *retval) { struct ibv_send_wr *snd_dscr; BUF_INFO_T *info; info = (BUF_INFO_T *)((char *)field-sizeof(BUF_INFO_T)); *retval = 0; if(info->tag && op==GET)return; if(snd){ request_header_t *msginfo = (request_header_t *)(field+1); snd_dscr=&(field->sdscr); if(mark_buf_send_complete[snd_dscr->wr_id]==0) { /* printf("%d: test buf. send not complete\n",armci_me); */ /* fflush(stdout); */ return; } } if(rcv){ int *last; long *flag; int loop = 0; request_header_t *msginfo = (request_header_t *)(field+1); flag = (long *)&msginfo->tag.ack; if(op==PUT || ARMCI_ACC(op)){ if(msginfo->bypass && msginfo->pinned && msginfo->format == STRIDED && op == PUT) *retval=1; else{ if(armci_util_long_getval(flag) == ARMCI_STAMP) { *retval = 1; } } return; } else{ /*SK: I think we get here only for GET with result directly going to client's pinned memory. (info.tag==0 && op==GET)*/ last = (int *)((char *)msginfo+msginfo->datalen-sizeof(int)); if(armci_util_int_getval(last) != ARMCI_STAMP || armci_util_long_getval(flag) == ARMCI_STAMP){ *retval=1; } return; } } } static inline void armci_vapi_post_send(int isclient,int con_offset, struct ibv_send_wr *snd_dscr,char *from) { int rc = 0; vapi_nic_t *nic; armci_connect_t *con; int total = 0; if(!isclient){ nic = CLN_nic; con = CLN_con+con_offset; } else{ nic = SRV_nic; con = SRV_con+con_offset; } if(DEBUG_CLN){ printf("vapi_post_send: snd_dscr->num_sge=%d, snd_dscr->sg_list->length=%d\n", snd_dscr->num_sge, snd_dscr->sg_list->length); fflush(stdout); } /* find the total length of all the segments */ total = snd_dscr->sg_list->length * snd_dscr->num_sge; if(DEBUG_CLN){ printf("%d(c) : total is %d\t, max_size is %d\n",armci_me,total, armci_vapi_max_inline_size); } struct ibv_send_wr *bad_wr; if (total > armci_vapi_max_inline_size) { rc = ibv_post_send(con->qp, snd_dscr, &bad_wr); } else { rc = ibv_post_send(con->qp, snd_dscr, &bad_wr); /* no corresponding call, using ibv_post_send rc = EVAPI_post_inline_sr(nic->handle,con->qp,snd_dscr);*/ } dassert1(1,rc==0,rc); } /** Send request to server. */ int armci_send_req_msg(int proc, void *buf, int bytes) { int cluster = armci_clus_id(proc), i; request_header_t *msginfo = (request_header_t *)buf; struct ibv_send_wr *snd_dscr; struct ibv_sge *ssg_lst; THREAD_LOCK(armci_user_threads.net_lock); check_state_of_ib_connection(proc, 0); snd_dscr = BUF_TO_SDESCR((char *)buf); ssg_lst = BUF_TO_SSGLST((char *)buf); /*Stamp end of buffers as needed*/ if(msginfo->operation == GET && !msginfo->pinned) { const int dscrlen = msginfo->dscrlen; const int datalen = msginfo->datalen; int *last; if(dscrlen < (datalen - sizeof(int))) last = (int*)(((char*)(msginfo+1))+(datalen-sizeof(int))); else last = (int*)(((char*)(msginfo+1))+(dscrlen+datalen-sizeof(int))); *last = ARMCI_STAMP; #ifdef GET_STRIDED_COPY_PIPELINED if(msginfo->format == STRIDED) { const int ssize = GET_STRIDED_COPY_PIPELINED_SIZE/sizeof(int); int *sfirst = (int*)(dscrlen+(char*)(msginfo+1))+ssize; /*stamping can start here*/ int *slast = last, *ptr; for(ptr=sfirst; ptroperation == ACK) { *(int *)(msginfo +1) = ARMCI_STAMP+1; *(((int *)(msginfo +1))+1) = ARMCI_STAMP+1; } #if defined(PEND_BUFS) if((msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)) && bytes > IMM_BUF_LEN) { msginfo->tag.imm_msg=0; assert(sizeof(request_header_t)datalen, IMM_BUF_LEN); assert(bytes==IMM_BUF_LEN||(bytes==sizeof(*msginfo)+msginfo->dscrlen)); } else if(msginfo->operation==GET && !(msginfo->datalen+sizeof(request_header_t)+msginfo->dscrlentag.imm_msg=0; bytes = ARMCI_MIN(sizeof(request_header_t)+msginfo->dscrlen, IMM_BUF_LEN); } #if defined(PUT_NO_SRV_COPY) && 0 /*SK:disabled. Imm msgs are sent inline for latency reasons*/ else if(msginfo->operation==PUT && !msginfo->pinned && msginfo->format==STRIDED && msginfo->tag.data_len>=2048) { msginfo->tag.imm_msg = 0; assert(sizeof(request_header_t)datalen, IMM_BUF_LEN); assert(bytes==IMM_BUF_LEN||(bytes==sizeof(*msginfo)+msginfo->dscrlen)); } #endif else{ msginfo->tag.imm_msg=1; } /* printf("%d: send_req: op=%d bytes=%d data_len=%d imm=%d\n",*/ /* armci_me, msginfo->operation, bytes, msginfo->datalen,msginfo->tag.imm_msg);*/ /* fflush(stdout);*/ if(bytes<0 || bytes>IMM_BUF_LEN) { printf("%d(pid=%d): Trying to send too large a mesg. op=%d bytes=%d(max=%d) to=%d\n", armci_me, getpid(),msginfo->operation,bytes,IMM_BUF_LEN, proc); fflush(stdout); pause(); assert(bytes>=0); assert(bytes <= IMM_BUF_LEN); } _armci_buf_ensure_pend_outstanding_op_per_node(buf,cluster); /* printf("%d: send_req. ensured pend os per node. to=%d op=%d\n", armci_me, msginfo->to,msginfo->operation); */ /* fflush(stdout); */ #else _armci_buf_ensure_one_outstanding_op_per_node(buf,cluster); #endif if(msginfo->operation == PUT || ARMCI_ACC(msginfo->operation)){ #if defined(PEND_BUFS) if(!msginfo->tag.imm_msg){ msginfo->tag.data_ptr = (char *)(msginfo+1)+msginfo->dscrlen; msginfo->tag.data_len = msginfo->datalen; } else msginfo->tag.data_ptr = NULL; #else { msginfo->tag.data_ptr = (void *)&msginfo->tag.ack; } #endif } else { if(msginfo->operation == GET && !msginfo->bypass && msginfo->dscrlen >= (msginfo->datalen-sizeof(int))) msginfo->tag.data_ptr = (char *)(msginfo+1)+msginfo->dscrlen; else msginfo->tag.data_ptr = GET_DATA_PTR(buf); } /*this has to be reset so that we can wait on it see ReadFromDirect*/ msginfo->tag.ack = 0; msginfo->tag.ack_ptr = &(msginfo->tag.ack); if(DEBUG_CLN){ printf("%d:the ack_ptr is initialised to %p, ack->value is %ld\n", armci_me,msginfo->tag.ack_ptr,msginfo->tag.ack);fflush(stdout); } armci_init_vapibuf_send(snd_dscr, ssg_lst,buf, bytes, &client_memhandle); /* printf("%d: Sending req wr_id=%d to=%d\n",armci_me,snd_dscr->wr_id,proc);*/ /* fflush(stdout);*/ armci_vapi_post_send(1,cluster,snd_dscr,"send_req_msg:post_send"); THREAD_UNLOCK(armci_user_threads.net_lock); if(DEBUG_CLN){ printf("%d:client sent REQ=%d %d bytes serv=%d qp=%ld id =%ld lkey=%d\n", armci_me,msginfo->operation,bytes,cluster, (SRV_con+cluster)->qp,snd_dscr->wr_id,ssg_lst->lkey); fflush(stdout); } return(0); } /*\ * client waits for first phase ack before posting gather desr \*/ void armci_wait_ack(char *buffer) { long *flag; request_header_t *msginfo = (request_header_t *)(buffer); flag = (long*)&msginfo->tag.ack; while(armci_util_long_getval(flag) != ARMCI_STAMP); flag = 0; } void armci_client_direct_send(int p,void *src_buf, void *dst_buf, int len,void** contextptr,int nbtag,ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl) { sr_descr_t *dirdscr; int clus = armci_clus_id(p); check_state_of_ib_connection(p, 0); THREAD_LOCK(armci_user_threads.net_lock); /*ID for the desr that comes from get_next_descr is already set*/ dirdscr = armci_vapi_get_next_sdescr(nbtag,0); if(nbtag)*contextptr = dirdscr; armci_init_cbuf_srdma(&dirdscr->sdescr,dirdscr->sg_entry,src_buf,dst_buf, len,lochdl,remhdl); armci_vapi_post_send(1,clus,&(dirdscr->sdescr), "client_direct_send:post_send"); /* the following unlock/lock ensures fairness (in case other threads are waiting on the lock) not required to work */ #if 1 THREAD_UNLOCK(armci_user_threads.net_lock); THREAD_LOCK(armci_user_threads.net_lock); #endif if(nbtag==0) armci_send_complete(&(dirdscr->sdescr),"armci_client_direct_send",1); THREAD_UNLOCK(armci_user_threads.net_lock); } /*\ RDMA get \*/ void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** cptr,int nbtag,ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { int rc = 0; sr_descr_t *dirdscr; int clus = armci_clus_id(p); check_state_of_ib_connection(p, 0); struct ibv_send_wr *bad_wr; THREAD_LOCK(armci_user_threads.net_lock); /*ID for the desr that comes from get_next_descr is already set*/ dirdscr = armci_vapi_get_next_sdescr(nbtag,0); if(nbtag)*cptr = dirdscr; if(DEBUG_CLN){ printf("\n%d: in direct get lkey=%d rkey=%d\n",armci_me,lochdl->lkey, remhdl->rkey);fflush(stdout); } armci_init_cbuf_rrdma(&dirdscr->sdescr,dirdscr->sg_entry,dst_buf,src_buf, len,lochdl,remhdl); rc = ibv_post_send((SRV_con+clus)->qp, &(dirdscr->sdescr), &bad_wr); dassert1(1,rc==0,rc); /* unlock/lock to ensure fairness: allows others thread post before waiting for completion */ /*VT?check to see if this should be UNLOCK followed by lock*/ #if 1 THREAD_UNLOCK(armci_user_threads.net_lock); THREAD_LOCK(armci_user_threads.net_lock); #endif if(!nbtag){ armci_send_complete(&(dirdscr->sdescr),"armci_client_direct_get",1); } THREAD_UNLOCK(armci_user_threads.net_lock); } #define WQE_LIST_LENGTH 32 #define WQE_LIST_COUNT 1 /** Direct put into remote processor memory. Assumes that (and invoked * only when) the source buffers in user memory are pinned as well. * @param operation PUT/GET * @param src_ptr Source pointer for data * @param src_stride_arr Strides on the source array * @param dst_ptr Destination pointer to start writing to * @param seq_count[stride_levels+1] #els in each stride * level. seg_count[0] is contiguous bytes * @param proc Destimation process * @param cptr OUT Pointer to store the descriptor to wait on for completion * @param nbtag IN Non-blocking tag (non-blocking op if nbtag!=0) * @param lochdl IN Local memory handle/key (registered memory stuff) * @param remhdl IN Remote memory handle/key * */ #if 0 void armci_client_direct_rdma_strided(int operation, int proc, char *src_ptr, int src_stride_arr[], char *dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, void **cptr, int nbtag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { int rc; sr_descr_t *dirdscr; const int clus = armci_clus_id(proc); struct ibv_send_wr *bad_wr; struct ibv_send_wr sdscr[WQE_LIST_COUNT][WQE_LIST_LENGTH]; struct ibv_sge sg_entry[WQE_LIST_COUNT][WQE_LIST_LENGTH]; int busy[WQE_LIST_COUNT], wait_count[WQE_LIST_COUNT],clst; int i, j, c, numposts; int idx[MAX_STRIDE_LEVEL]; THREAD_LOCK(armci_user_threads.net_lock); assert(stride_levels >= 0); assert(stride_levels<=MAX_STRIDE_LEVEL); /*ID for the desr that comes from get_next_descr is already set*/ dirdscr = armci_vapi_get_next_sdescr(nbtag,0); if(nbtag)*cptr = dirdscr; assert(dirdscr->tag == nbtag); if(DEBUG_CLN) { printf("\n%d: in direct rdma strided id=%d lkey=%ld rkey=%ld\n", armci_me,dirdscr->sdescr.wr_id,lochdl->lkey,remhdl->rkey);fflush(stdout); } for(c=0; csdescr.wr_id; sdscr[j][i].send_flags = 0; /*non-signalled*/ if(inumofsends=0; bzero(idx, stride_levels*sizeof(int)); int count = (numposts%WQE_LIST_LENGTH) ? (numposts%WQE_LIST_LENGTH):WQE_LIST_LENGTH; assert(count == ARMCI_MIN(count, numposts)); clst=0; for(i=0; i0); armci_send_complete(&dirdscr->sdescr,"client_direct_rdma_strided",wait_count[clst]); dirdscr->numofsends -= wait_count[clst]; busy[clst]=0; wait_count[clst]=0; } if(operation == PUT) { sg_entry[clst][j-i].addr = (uint64_t)(src_ptr + src_offset); sdscr[clst][j-i].wr.rdma.remote_addr = (uint64_t)(dst_ptr + dst_offset); } else if (operation == GET) { sg_entry[clst][j-i].addr = (uint64_t)(dst_ptr + dst_offset); sdscr[clst][j-i].wr.rdma.remote_addr = (uint64_t)(src_ptr + src_offset); } assert(sg_entry[clst][j-i].length == seg_count[0]); idx[0] += 1; for(c=0;cnumofsends += 1; wait_count[clst] = 1; /* armci_send_complete(&dirdscr->sdescr,"armci_client_direct_rdma_strided",count); */ if(count < WQE_LIST_LENGTH) { sdscr[clst][count-1].next=&sdscr[clst][count]; /*reset it*/ } sdscr[clst][count-1].send_flags=0; /*reset it*/ i += count; count = ARMCI_MIN(WQE_LIST_LENGTH,numposts-i); assert(count==0 || count==WQE_LIST_LENGTH); clst = (clst+1)%WQE_LIST_COUNT; } if(!nbtag) { armci_send_complete(&dirdscr->sdescr,"armci_client_direct_get",dirdscr->numofsends); dirdscr->numofsends = 0; dirdscr->tag = 0; } THREAD_UNLOCK(armci_user_threads.net_lock); } #else void armci_client_direct_rdma_strided(int operation, int proc, char *src_ptr, int src_stride_arr[], char *dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, void **cptr, int nbtag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { int rc, i, j, c, busy[WQE_LIST_COUNT], clst, ctr; sr_descr_t *dirdscr; const int clus = armci_clus_id(proc); struct ibv_send_wr *bad_wr; struct ibv_send_wr sdscr[WQE_LIST_COUNT][WQE_LIST_LENGTH]; struct ibv_sge sg_entry[WQE_LIST_COUNT][WQE_LIST_LENGTH]; stride_info_t sinfo, dinfo; THREAD_LOCK(armci_user_threads.net_lock); assert(stride_levels >= 0); assert(stride_levels<=MAX_STRIDE_LEVEL); /*ID for the desr that comes from get_next_descr is already set*/ dirdscr = armci_vapi_get_next_sdescr(nbtag,0); if(nbtag)*cptr = dirdscr; assert(dirdscr->tag == nbtag); if(DEBUG_CLN) { printf("\n%d: in direct rdma strided id=%d lkey=%ld rkey=%ld\n", armci_me,dirdscr->sdescr.wr_id,lochdl->lkey,remhdl->rkey);fflush(stdout); } /*initialize fixed values for descriptors*/ bzero(sdscr, WQE_LIST_COUNT*WQE_LIST_LENGTH*sizeof(struct ibv_send_wr)); bzero(sg_entry, WQE_LIST_COUNT*WQE_LIST_LENGTH*sizeof(struct ibv_sge)); for(j=0; jsdescr.wr_id; sdscr[j][i].send_flags = 0; /*non-signalled*/ if(inumofsends=0; clst=ctr=0; bzero(busy, sizeof(int)*WQE_LIST_COUNT); while(armci_stride_info_has_more(&sinfo)) { assert(armci_stride_info_has_more(&dinfo)); uint64_t saddr = (uint64_t)armci_stride_info_seg_ptr(&sinfo); uint64_t daddr = (uint64_t)armci_stride_info_seg_ptr(&dinfo); if(operation == PUT) { sg_entry[clst][ctr].addr = saddr; sdscr[clst][ctr].wr.rdma.remote_addr = daddr; } else if (operation == GET) { sg_entry[clst][ctr].addr = daddr; sdscr[clst][ctr].wr.rdma.remote_addr = saddr; } assert(sg_entry[clst][ctr].length == seg_count[0]); ctr+=1; armci_stride_info_next(&sinfo); armci_stride_info_next(&dinfo); if(ctr == WQE_LIST_LENGTH || !armci_stride_info_has_more(&sinfo)) { sdscr[clst][ctr-1].next=NULL; sdscr[clst][ctr-1].send_flags=IBV_SEND_SIGNALED; /*only the last one*/ for(c=0; cnumofsends += 1; if(ctrsdescr,"client_direct_rdma_strided",1); dirdscr->numofsends -= 1; busy[clst]=0; } } } armci_stride_info_destroy(&sinfo); armci_stride_info_destroy(&dinfo); if(!nbtag) { armci_send_complete(&dirdscr->sdescr,"armci_client_direct_get",dirdscr->numofsends); dirdscr->numofsends = 0; dirdscr->tag = 0; } THREAD_UNLOCK(armci_user_threads.net_lock); } #endif #if defined(PEND_BUFS) int armci_server_msginfo_to_pbuf_index(request_header_t *msginfo) { int index=-1, i; vapibuf_pend_t *pbuf=NULL; assert(!msginfo->tag.imm_msg); for(i = 0; ioperation == GET); assert(stride_levels >= 0); assert(stride_levels<=MAX_STRIDE_LEVEL); if(!get_armci_region_local_hndl(src_ptr,armci_clus_id(armci_me), &loc_memhdl)) { armci_die("rdma_strided_to_contig: failed to get local handle\n",0); } if(!msginfo->tag.imm_msg) { int index = armci_server_msginfo_to_pbuf_index(msginfo); assert(index>=0); wr_id = PBUF_BUFID_TO_PUT_WRID(index); } else { wr_id = DSCRID_IMMBUF_RESP_END-1-proc; } bzero(&sdscr1, sizeof(sdscr1)); sdscr1.wr_id = wr_id; if(DEBUG_CLN) { printf("\n%d: in rdma strided to contig id=%d lkey=%ld rkey=%ld\n", armci_me,wr_id,loc_memhdl->lkey,rem_memhdl->rkey); fflush(stdout); } /*initialize fixed values for descriptors*/ bzero(sdscr, WQE_LIST_COUNT*WQE_LIST_LENGTH*sizeof(struct ibv_send_wr)); bzero(sg_entry, WQE_LIST_COUNT*WQE_LIST_LENGTH*sizeof(struct ibv_sge)); for(j=0; jfrom); THREAD_UNLOCK(armci_user_threads.net_lock); } #else #define MAX_NUM_SGE 64 /*same as above, but uses gather rdma writes*/ void armci_server_rdma_strided_to_contig(char *src_ptr, int src_stride_arr[], int seg_count[], int stride_levels, char *dst_ptr, int proc, request_header_t *msginfo) { int rc, ctr, wr_id, bytes; struct ibv_send_wr *bad_wr, sdscr1, sdscr; struct ibv_sge sg_entry[MAX_NUM_SGE]; stride_info_t sinfo; uint64_t daddr; ARMCI_MEMHDL_T *loc_memhdl; ARMCI_MEMHDL_T *rem_memhdl = &handle_array[proc]; const int max_num_sge = ARMCI_MIN(MAX_NUM_SGE, armci_max_num_sg_ent); int numposts=0, numsegs=0; THREAD_LOCK(armci_user_threads.net_lock); assert(msginfo->operation == GET); assert(stride_levels >= 0); assert(stride_levels<=MAX_STRIDE_LEVEL); if(!get_armci_region_local_hndl(src_ptr,armci_clus_id(armci_me), &loc_memhdl)) { armci_die("rdma_strided_to_contig: failed to get local handle\n",0); } if(!msginfo->tag.imm_msg) { int index = armci_server_msginfo_to_pbuf_index(msginfo); assert(index>=0); wr_id = PBUF_BUFID_TO_PUT_WRID(index); } else { wr_id = DSCRID_IMMBUF_RESP_END-1-proc; } bzero(&sdscr1, sizeof(sdscr1)); sdscr1.wr_id = wr_id; if(DEBUG_CLN) { printf("\n%d: in rdma strided to contig id=%d lkey=%ld rkey=%ld\n", armci_me,wr_id,loc_memhdl->lkey,rem_memhdl->rkey); fflush(stdout); } /*initialize fixed values for descriptors*/ bzero(&sdscr, sizeof(sdscr)); bzero(sg_entry, max_num_sge*sizeof(struct ibv_sge)); armci_init_cbuf_srdma(&sdscr,&sg_entry[0],NULL,NULL,seg_count[0],loc_memhdl,rem_memhdl); sdscr.send_flags = 0; /*non-signalled*/ sdscr.num_sge = 0; /*set below in the loop*/ sdscr.wr_id = wr_id; for(ctr=0; ctrlkey; } /*post requests in a loop*/ armci_stride_info_init(&sinfo,src_ptr,stride_levels,src_stride_arr,seg_count); numposts = numsegs = 0; ctr=0; daddr = (uint64_t)dst_ptr; bytes=0; while(armci_stride_info_has_more(&sinfo)) { sg_entry[ctr].addr = (uint64_t)armci_stride_info_seg_ptr(&sinfo); assert(sg_entry[ctr].length == seg_count[0]); sdscr.num_sge += 1; bytes += seg_count[0]; ctr+=1; numsegs += 1; armci_stride_info_next(&sinfo); if(ctr == max_num_sge || !armci_stride_info_has_more(&sinfo)) { sdscr.wr.rdma.remote_addr = daddr; if(!armci_stride_info_has_more(&sinfo)) { sdscr.send_flags=IBV_SEND_SIGNALED; /*only the last one*/ } else { assert(sdscr.send_flags == 0); } assert(ctr == sdscr.num_sge); rc = ibv_post_send(CLN_con[proc].qp, &sdscr, &bad_wr); dassert1(1,rc==0,rc); numposts += 1; ctr=0; sdscr.num_sge = 0; daddr += bytes; bytes = 0; } } /* printf("%d(s): scatgat write numposts=%d numsegs=%d\n",armci_me,numposts,numsegs); */ armci_stride_info_destroy(&sinfo); assert(proc == msginfo->from); THREAD_UNLOCK(armci_user_threads.net_lock); } /*Directly read data from client buffers into remote memory. Data is contiguous in client-side. */ void armci_server_rdma_contig_to_strided(char *src_ptr, int proc, char *dst_ptr, int dst_stride_arr[], int seg_count[], int stride_levels, request_header_t *msginfo) { int rc, ctr, wr_id, bytes; struct ibv_send_wr *bad_wr, sdscr1, sdscr; struct ibv_sge sg_entry[MAX_NUM_SGE]; stride_info_t dinfo; uint64_t saddr; ARMCI_MEMHDL_T *loc_memhdl; ARMCI_MEMHDL_T *rem_memhdl = &handle_array[proc]; const int max_num_sge = ARMCI_MIN(MAX_NUM_SGE, armci_max_num_sg_ent); int numposts=0, numsegs=0; THREAD_LOCK(armci_user_threads.net_lock); assert(msginfo->operation == PUT); assert(stride_levels >= 0); assert(stride_levels<=MAX_STRIDE_LEVEL); if(!get_armci_region_local_hndl(dst_ptr,armci_clus_id(armci_me), &loc_memhdl)) { armci_die("rdma_strided_to_contig: failed to get local handle\n",0); } if(!msginfo->tag.imm_msg) { int index = armci_server_msginfo_to_pbuf_index(msginfo); assert(index>=0); wr_id = PBUF_BUFID_TO_GET_WRID(index); } else { wr_id = DSCRID_IMMBUF_RESP_END-1-proc; } bzero(&sdscr1, sizeof(sdscr1)); sdscr1.wr_id = wr_id; if(DEBUG_CLN) { printf("\n%d: in rdma strided to contig id=%d lkey=%ld rkey=%ld\n", armci_me,wr_id,loc_memhdl->lkey,rem_memhdl->rkey); fflush(stdout); } /*initialize fixed values for descriptors*/ bzero(&sdscr, sizeof(sdscr)); bzero(sg_entry, max_num_sge*sizeof(struct ibv_sge)); armci_init_cbuf_rrdma(&sdscr,&sg_entry[0],NULL,NULL,seg_count[0],loc_memhdl,rem_memhdl); sdscr.send_flags = 0; /*non-signalled*/ sdscr.num_sge = 0; /*set below in the loop*/ sdscr.wr_id = wr_id; for(ctr=0; ctrlkey; } /*post requests in a loop*/ armci_stride_info_init(&dinfo,dst_ptr,stride_levels,dst_stride_arr,seg_count); numposts = numsegs = 0; ctr=0; saddr = (uint64_t)src_ptr; bytes=0; while(armci_stride_info_has_more(&dinfo)) { sg_entry[ctr].addr = (uint64_t)armci_stride_info_seg_ptr(&dinfo); assert(sg_entry[ctr].length == seg_count[0]); sdscr.num_sge += 1; bytes += seg_count[0]; ctr+=1; numsegs += 1; armci_stride_info_next(&dinfo); if(ctr == max_num_sge || !armci_stride_info_has_more(&dinfo)) { sdscr.wr.rdma.remote_addr = saddr; if(!armci_stride_info_has_more(&dinfo)) { sdscr.send_flags=IBV_SEND_SIGNALED; /*only the last one*/ } else { assert(sdscr.send_flags == 0); } assert(ctr == sdscr.num_sge); rc = ibv_post_send(CLN_con[proc].qp, &sdscr, &bad_wr); dassert1(1,rc==0,rc); numposts += 1; ctr=0; sdscr.num_sge = 0; saddr += bytes; bytes = 0; } } /* printf("%d(s): scatgat write numposts=%d numsegs=%d\n",armci_me,numposts,numsegs); */ armci_stride_info_destroy(&dinfo); assert(proc == msginfo->from); THREAD_UNLOCK(armci_user_threads.net_lock); } #endif #endif char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len) { int cluster = armci_clus_id(proc); vapibuf_ext_t* ecbuf=BUF_TO_ECBUF(msginfo); char *dataptr = GET_DATA_PTR(ecbuf->buf); extern void armci_util_wait_int(volatile int *,int,int); if(DEBUG_CLN){ printf("%d(c):read direct %d qp=%p\n",armci_me, len,&(SRV_con+cluster)->qp); fflush(stdout); } if(mark_buf_send_complete[ecbuf->snd_dscr.wr_id]==0) armci_send_complete(&(ecbuf->snd_dscr),"armci_ReadFromDirect",1); if(!msginfo->bypass){ long *flag; int *last; int loop = 0; flag = &(msginfo->tag.ack); if(msginfo->operation==GET){ last = (int *)(dataptr+len-sizeof(int)); if(msginfo->dscrlen >= (len-sizeof(int))){ last = (int *)(dataptr+len+msginfo->dscrlen-sizeof(int)); dataptr+=msginfo->dscrlen; } if(DEBUG_CLN){ printf("\n%d:flagval=%d at ptr=%p ack=%ld dist=%d\n",armci_me,*last, last,*flag,len);fflush(stdout); } while(armci_util_int_getval(last) == ARMCI_STAMP && armci_util_long_getval(flag) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client last(%p)=%d flag(%p)=%ld off=%d\n", armci_me,last,*last,flag,*flag,msginfo->datalen); fflush(stdout); } } } *flag = 0L; } else if(msginfo->operation == REGISTER){ while(armci_util_long_getval(flag) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client flag(%p)=%ld off=%d\n", armci_me,flag,*flag,msginfo->datalen); fflush(stdout); } } } } else{ int *flg = (int *)(dataptr+len); while(armci_util_int_getval(flg) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client waiting (%p)=%d off=%d\n", armci_me,flg,*flg,len); fflush(stdout); } } } } } return dataptr; } #ifdef GET_STRIDED_COPY_PIPELINED /**Same as armci_ReadFromDirect, except reads partial segments * (identify by stamping done in armci_send_req_msg() and * returns. Note that the return value is the starting pointer of the * buffer containig the data. It is the same for all the segments * read for a message. * @param proc IN Read data corresponding to an earlier req to this proc * @param msginfo IN The request for which we are reading now * @param len IN #bytes in the total response * @param bytes_done OUT @bytes of the total response read so far (monotonic) * @return Starting pointer to the buffer containing the data */ char *armci_ReadFromDirectSegment(int proc, request_header_t *msginfo, int len, int *bytes_done) { int cluster = armci_clus_id(proc); vapibuf_ext_t* ecbuf=BUF_TO_ECBUF(msginfo); char *dataptr = GET_DATA_PTR(ecbuf->buf); extern void armci_util_wait_int(volatile int *,int,int); if(DEBUG_CLN){ printf("%d(c):read direct %d qp=%p\n",armci_me, len,&(SRV_con+cluster)->qp); fflush(stdout); } if(mark_buf_send_complete[ecbuf->snd_dscr.wr_id]==0) armci_send_complete(&(ecbuf->snd_dscr),"armci_ReadFromDirect",1); if(!msginfo->bypass){ long *flag; int *last, *mid1, *mid2, third; int loop = 0; flag = &(msginfo->tag.ack); if(msginfo->operation==GET){ last = (int *)(dataptr+len-sizeof(int)); if(msginfo->dscrlen >= (len-sizeof(int))){ last = (int *)(dataptr+len+msginfo->dscrlen-sizeof(int)); dataptr+=msginfo->dscrlen; } third = (last-(int*)(msginfo->dscrlen+(char*)(msginfo+1)))/3; mid2 = (last - third); mid1 = mid2 - third; if(DEBUG_CLN){ printf("\n%d:flagval=%d at ptr=%p ack=%ld dist=%d\n",armci_me,*last, last,*flag,len);fflush(stdout); } while(armci_util_int_getval(last) == ARMCI_STAMP && armci_util_long_getval(flag) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client last(%p)=%d flag(%p)=%ld off=%d\n", armci_me,last,*last,flag,*flag,msginfo->datalen); fflush(stdout); } } { int ssize = GET_STRIDED_COPY_PIPELINED_SIZE/sizeof(int); int *sfirst = (int*)(msginfo->dscrlen+(char*)(msginfo+1))+ssize; /*stamping can start here*/ int *slast = last; int off = (((int *)(dataptr+*bytes_done)-sfirst+ssize)/ssize)*ssize; int *ptr = sfirst+off; dassert(1,off>=0); dassert(1,(void *)sfirst>dataptr); dassert(1,(void *)ptr>dataptr); if(ptr<=slast && armci_util_int_getval(ptr)!=ARMCI_STAMP) { *bytes_done = ((char*)ptr)-dataptr; return dataptr; } } } *flag = 0L; *bytes_done = len; return dataptr; } else if(msginfo->operation == REGISTER){ while(armci_util_long_getval(flag) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client flag(%p)=%ld off=%d\n", armci_me,flag,*flag,msginfo->datalen); fflush(stdout); } } } } else{ int *flg = (int *)(dataptr+len); while(armci_util_int_getval(flg) != ARMCI_STAMP){ loop++; loop %=100000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client waiting (%p)=%d off=%d\n", armci_me,flg,*flg,len); fflush(stdout); } } } } } *bytes_done = len; return dataptr; } #endif /** * @param proc IN id of remote client to put to * @param buf IN local buf (has to be registered) */ void armci_send_data_to_client(int proc, void *buf, int bytes,void *dbuf) { int i, rc = 0; struct ibv_send_wr *bad_wr; struct ibv_send_wr sdscr; struct ibv_sge ssg_entry; if(DEBUG_SERVER){ printf("\n%d(s):sending data to client %d at %p flag = %p bytes=%d\n", armci_me, proc,dbuf,(char *)dbuf+bytes-sizeof(int),bytes);fflush(stdout); } memset(&sdscr,0,sizeof(struct ibv_send_wr)); memset(&ssg_entry,0,sizeof(ssg_entry)); armci_init_cbuf_srdma(&sdscr,&ssg_entry,buf,dbuf,bytes, &serv_memhandle,(handle_array+proc)); if(DEBUG_SERVER){ printf("\n%d(s):handle_array[%d]=%p dbuf=%p flag=%p bytes=%d\n",armci_me, proc,&handle_array[proc],(char *)dbuf, (char *)dbuf+bytes-sizeof(int),bytes); fflush(stdout); } #if defined(PEND_BUFS) for(i=proc*(IMM_BUF_NUM+1); i<(proc+1)*(IMM_BUF_NUM+1); i++) { if((char*)buf>= serv_buf_arr[i]->buf && (char*)bufbuf) break; } #if SRI_CORRECT if(i<(proc+1)*(IMM_BUF_NUM+1)) { /*Message from an immediate buffer*/ assert(serv_buf_arr[i]->send_pending==0); serv_buf_arr[i]->send_pending=1; sdscr.wr_id = DSCRID_IMMBUF_RESP+i; } else #endif { sdscr.wr_id = DSCRID_IMMBUF_RESP+armci_nproc*(IMM_BUF_NUM+1)+1; } /* #endif */ /* #if defined(PEND_BUFS) */ /* { */ /* static uint64_t ctr=DSCRID_IMMBUF_RESP; */ /* sdscr.wr_id = ctr; */ /* ctr = (ctr+1-DSCRID_IMMBUF_RESP)%(DSCRID_IMMBUF_RESP_END-DSCRID_IMMBUF_RESP)+DSCRID_IMMBUF_RESP; */ /* } */ #else sdscr.wr_id = proc+armci_nproc; #endif rc = ibv_post_send((CLN_con+proc)->qp, &sdscr, &bad_wr); dassert1(1,rc==0,rc); #if !defined(PEND_BUFS) armci_send_complete(&sdscr,"armci_send_data_to_client",1); #endif } void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf) { int bytes; int *last; ARMCI_PR_DBG("enter",0); bytes = (int)msginfo->datalen; if(DEBUG_SERVER){ printf("%d(s):write to direct sent %d to %d at %p\n",armci_me, bytes,proc,(char *)msginfo->tag.data_ptr); fflush(stdout); } if(msginfo->operation!=GET){ *(int *)((char *)buf+bytes)=ARMCI_STAMP; bytes+=sizeof(int); } #if defined(PEND_BUFS) if(!msginfo->tag.imm_msg) { int i; /* fprintf(stderr, "%d:: Not immediate mesg operated on\n", armci_me); */ assert(msginfo->operation == GET); /*nothing else uses this for now*/ /**This is a pending buf*/ vapibuf_pend_t *pbuf=NULL; int index; for(i = 0; idscrlen+bytessdscr, PBUF_BUFID_TO_PUT_WRID(index), &pbuf->sg_entry, msginfo->tag.data_ptr, buf, bytes); } else #endif { armci_send_data_to_client(proc,buf,bytes,msginfo->tag.data_ptr); } /*if(msginfo->dscrlen >= (bytes-sizeof(int))) last = (int*)(((char*)(buf)) + (msginfo->dscrlen+bytes - sizeof(int))); else*/ last = (int*)(((char*)(buf)) + (bytes - sizeof(int))); if(msginfo->operation==GET && *last == ARMCI_STAMP){ SERVER_SEND_ACK(msginfo->from); } armci_ack_proc=NONE; ARMCI_PR_DBG("exit",0); } #if defined(PEND_BUFS) void armci_rcv_req(void *mesg,void *phdr,void *pdescr,void *pdata,int *buflen) { request_header_t *msginfo = *(request_header_t**)mesg; *(void **)phdr = msginfo; if(msginfo->tag.imm_msg) *buflen = IMM_BUF_LEN - sizeof(request_header_t) - msginfo->dscrlen; else *buflen = PENDING_BUF_LEN - sizeof(request_header_t) - msginfo->dscrlen; *(void **)pdata = msginfo->dscrlen + (char *)(msginfo+1); if(msginfo->bytes) *(void **)pdescr = msginfo+1; else *(void **)pdescr = NULL; } #else void armci_rcv_req(void *mesg,void *phdr,void *pdescr,void *pdata,int *buflen) { vapibuf_t *cbuf = (vapibuf_t*)mesg; request_header_t *msginfo = (request_header_t *)cbuf->buf; *(void **)phdr = msginfo; ARMCI_PR_DBG("enter",msginfo->operation); if(DEBUG_SERVER){ printf("%d(server): got %d req (dscrlen=%d datalen=%d) from %d\n", armci_me, msginfo->operation, msginfo->dscrlen, msginfo->datalen, msginfo->from); fflush(stdout); } /* we leave room for msginfo on the client side */ *buflen = MSG_BUFLEN - sizeof(request_header_t); if(msginfo->bytes) { *(void **)pdescr = msginfo+1; if(msginfo->operation == GET) *(void **)pdata = MessageRcvBuffer; else *(void **)pdata = msginfo->dscrlen + (char*)(msginfo+1); }else { *(void**)pdescr = NULL; *(void**)pdata = MessageRcvBuffer; } ARMCI_PR_DBG("exit",msginfo->operation); } #endif static void posts_scatter_desc(sr_descr_t *pend_dscr,int proc,int type) { int rc; int cluster = armci_clus_id(proc); struct ibv_recv_wr *scat_dscr; struct ibv_recv_wr *bad_wr; scat_dscr = &pend_dscr->rdescr; /*armci_vapi_print_dscr_info(NULL,scat_dscr);*/ if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN)){ printf("%d(%d) : inside posts scatter dscr, id is %d\n", armci_me,type,scat_dscr->wr_id); fflush(stdout); } if(type == SERV) rc = ibv_post_recv((CLN_con + proc)->qp, scat_dscr, &bad_wr); else rc = ibv_post_recv((SRV_con+cluster)->qp, scat_dscr, &bad_wr); dassert1(1,rc==0,rc); if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN) ) { printf("\n%d: list_length is %d, id is %ld\n", armci_me,scat_dscr->num_sge,scat_dscr->wr_id); fflush(stdout); } } /*\ * client calls from request.c * server calls from ds-shared.c \*/ static sr_descr_t serv_blocking_scatter_dscr; static sr_descr_t client_blocking_scatter_dscr; void armci_post_scatter(void *dest_ptr, int dest_stride_arr[], int count[], int stride_levels, armci_vapi_memhndl_t *mhandle, int proc, int nbtag, int type, sr_descr_t **srd) { int i; int total_size = 0; int total_of_2D = 1; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; int j,k,y,z; int num_dscr = 0; int num_xmit = 0, num_seg, max_seg, rem_seg,vecind; char* src, *src1; sr_descr_t *pend_dscr; struct ibv_sge *scat_sglist; struct ibv_recv_wr *scat_dscr; if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN) ){ printf("%d(%d) : inside post_scatter %d\n",armci_me,type,nbtag); fflush(stdout); } max_seg = armci_max_num_sg_ent; THREAD_LOCK(armci_user_threads.net_lock); if(nbtag){ pend_dscr = armci_vapi_get_next_rdescr(nbtag,1); if(srd!=NULL)*srd=pend_dscr; } else{ pend_dscr = &client_blocking_scatter_dscr; pend_dscr->rdescr.wr_id=DSCRID_SCATGAT + MAX_PENDING; } /*pend_dscr->proc = proc;*/ pend_dscr->numofrecvs=0; scat_dscr = &pend_dscr->rdescr; scat_sglist = pend_dscr->sg_entry; /* scat_dscr->opcode = VAPI_RECEIVE; no ->opcode in ibv_recv_wr */ /* scat_dscr->comp_type = VAPI_SIGNALED; no ->comp_type in ibv_recv_wr */ scat_dscr->sg_list = scat_sglist; scat_dscr->num_sge = 0; index[2] = 0; unit[2] = 1; if(stride_levels > 1){ total_of_2D = count[2]; for(j=3; j<=stride_levels; j++){ index[j] = 0; unit[j] = unit[j-1]*count[j-1]; total_of_2D*=count[j]; } } num_xmit = total_of_2D*count[1]/max_seg; rem_seg = (total_of_2D*count[1])%max_seg; if(num_xmit == 0) num_xmit = 1; else if(rem_seg!= 0)num_xmit++; if ((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN) ) { printf("%d(%d):armci_post_scatter num_xmit = %d\t, rem_seg = %d\n", armci_me,type,num_xmit,rem_seg); fflush(stdout); } k=0; vecind = 0; if(rem_seg!=0 && k==(num_xmit-1))num_seg = rem_seg; else num_seg = max_seg; y=0,z=0; for(i=0;i= count[j]) index[j] =0; } src1 = src; for(j=0; jnumofrecvs++; /* the previous one has been posted, start off new*/ scat_dscr->num_sge = 0; y = 0; /* reuse the same scatter descriptor */ vecind=0;total_size=0;k++; if(rem_seg!=0 && k==(num_xmit-1))num_seg = rem_seg; } /* fill the scatter descriptor */ scat_sglist[y].addr = (uint64_t)src1; scat_sglist[y].lkey = mhandle->lkey; scat_sglist[y].length = count[0]; scat_dscr->num_sge++; src1 += dest_stride_arr[0]; y++; } if(vecind == num_seg){ posts_scatter_desc(pend_dscr,proc,type); pend_dscr->numofrecvs++; /* the previous one has been posted, start off new*/ scat_dscr->num_sge = 0; y =0 ; vecind = 0; total_size=0; k++; if(rem_seg!=0 && k==(num_xmit-1))num_seg=rem_seg; else num_seg = max_seg; } } THREAD_UNLOCK(armci_user_threads.net_lock); /* printf("%d(s): num scatters posted=%d\n", armci_me,pend_dscr->numofrecvs); */ if(!nbtag){ /*if blocking call wait_for_blocking_scatter to complete*/ } return; } void armci_wait_for_blocking_scatter() { sr_descr_t *pend_dscr=&client_blocking_scatter_dscr; int i; armci_recv_complete(&pend_dscr->rdescr,"armci_post_scatter",pend_dscr->numofrecvs); } /*\ * function used by armci_post_gather to actually post the sctter list \*/ static void posts_gather_desc(sr_descr_t *pend_dscr,int proc,int type) { int rc; int cluster = armci_clus_id(proc); struct ibv_send_wr *gat_dscr; struct ibv_send_wr *bad_wr; THREAD_LOCK(armci_user_threads.net_lock); gat_dscr = &pend_dscr->sdescr; /*armci_vapi_print_dscr_info(gat_dscr,NULL);*/ if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN)){ printf("%d: type(client=1)=%d inside posts gather dscr, id is %d\n", armci_me,type,gat_dscr->wr_id); fflush(stdout); } rc = 0; if(type == CLN){ rc = ibv_post_send((SRV_con+cluster)->qp, gat_dscr, &bad_wr); } else{ rc = ibv_post_send((CLN_con + proc)->qp, gat_dscr, &bad_wr); } dassert1(1,rc==0,rc); THREAD_UNLOCK(armci_user_threads.net_lock); } /*\ * posts a bunch of gather descriptors \*/ static sr_descr_t serv_blocking_gather_dscr; static sr_descr_t client_blocking_gather_dscr; void armci_post_gather(void *src_ptr, int src_stride_arr[], int count[], int stride_levels, armci_vapi_memhndl_t *mhandle, int proc,int nbtag, int type, sr_descr_t **srd) { int i; int total_of_2D = 1; int total_size = 0; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; int j,k,y,z; int num_posted = 0; char *src, *src1; int num_xmit = 0, num_seg, max_seg, rem_seg,vecind; sr_descr_t *pend_dscr; struct ibv_sge *gat_sglist; struct ibv_send_wr *gat_dscr; if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN)){ printf("%d(%d) : inside post_gather\n",armci_me,type); fflush(stdout); } max_seg = armci_max_num_sg_ent; if(nbtag){ pend_dscr = armci_vapi_get_next_sdescr(nbtag,1); if(srd!=NULL)*srd=pend_dscr; } else{ pend_dscr = &client_blocking_gather_dscr; pend_dscr->sdescr.wr_id=DSCRID_SCATGAT + MAX_PENDING; } pend_dscr->numofsends=0; gat_dscr = &pend_dscr->sdescr; gat_sglist = pend_dscr->sg_entry; gat_dscr->opcode = IBV_WR_SEND; gat_dscr->send_flags = IBV_SEND_SIGNALED; gat_dscr->sg_list = gat_sglist; gat_dscr->num_sge = 0; /* gat_dscr->send_flags = 0; */ index[2] = 0; unit[2] = 1; if(stride_levels > 1){ total_of_2D = count[2]; for(j=3; j<=stride_levels; j++){ index[j] = 0; unit[j] = unit[j-1]*count[j-1]; total_of_2D*=count[j]; } } num_xmit = total_of_2D*count[1]/max_seg; rem_seg = (total_of_2D*count[1])%max_seg; if(num_xmit == 0) num_xmit = 1; else if(rem_seg!= 0)num_xmit++; if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN) ){ printf("%d(%d):armci_post_gather total_2D=%d, num_xmit=%d, rem_seg =%d, count[1] = %d\n",armci_me,type,total_of_2D, num_xmit,rem_seg,count[1]); fflush(stdout); } k=0; vecind = 0; if(rem_seg!=0 && k==(num_xmit-1))num_seg = rem_seg; else num_seg = max_seg; y=0,z=0; for(i=0;i= count[j]) index[j] =0; } src1 = src; for(j=0; jnumofsends++; /* the previous one has been posted, start off new*/ gat_dscr->num_sge = 0; y = 0; vecind=0;total_size=0;k++; if(rem_seg!=0 && k==(num_xmit-1))num_seg = rem_seg; } /* fill the gather descriptor */ gat_sglist[y].addr = (uint64_t)src1; gat_sglist[y].lkey = mhandle->lkey; gat_sglist[y].length = count[0]; gat_dscr->num_sge++; src1 += src_stride_arr[0]; y++; } if(vecind == num_seg){ posts_gather_desc(pend_dscr,proc,type); pend_dscr->numofsends++; if((type==SERV && DEBUG_SERVER) || (type==CLN && DEBUG_CLN) ){ printf("%d(%d)posts_gather_desc done\n",armci_me,type); fflush(stdout); } /* the previous one has been posted, start off new*/ gat_dscr->num_sge = 0; y = 0; vecind = 0; total_size=0; k++; if(rem_seg!=0 && k==(num_xmit-1))num_seg=rem_seg; else num_seg = max_seg; } } /* printf("%d: num gathers posted =%d\n",armci_me,pend_dscr->numofsends); */ if(!nbtag){ /*complete here*/ armci_send_complete(&pend_dscr->sdescr,"armci_post_gather",pend_dscr->numofsends); } return; } /***********************END SCATTER GATHER STUFF******************************/ /***********************SPECIAL SEND/RECV*************************************/ void armci_server_direct_send(int dst, char *src_buf, char *dst_buf, int len, uint32_t *lkey, uint32_t *rkey) { int rc = 0; struct ibv_wc *pdscr=NULL; struct ibv_wc pdscr1; struct ibv_send_wr sdscr; struct ibv_sge ssg_entry; pdscr = &pdscr1; if(DEBUG_SERVER){ printf("\n%d(s):sending dir data to client %d at %p bytes=%d last=%p\n", armci_me,dst,dst_buf,len,(dst_buf+len-4));fflush(stdout); } memset(&sdscr,0,sizeof(struct ibv_send_wr)); armci_init_cbuf_srdma(&sdscr,&ssg_entry,src_buf,dst_buf,len,NULL,NULL); sdscr.wr.rdma.rkey = *rkey; ssg_entry.lkey = *lkey; sdscr.wr_id = dst+armci_nproc; struct ibv_send_wr *bad_wr; rc = ibv_post_send((CLN_con+dst)->qp, &sdscr, &bad_wr); dassert1(1,rc==0,rc); while (rc == 0) { rc = ibv_poll_cq(CLN_nic->scq, 1, pdscr); } dassertp(1,rc>=0,("%d: rc=%d id=%d status=%d\n", armci_me,rc,(int)pdscr->wr_id,pdscr->status)); dassert1(1,pdscr->status==IBV_WC_SUCCESS,pdscr->status);; } void armci_send_contig_bypass(int proc, request_header_t *msginfo, void *src_ptr, void *rem_ptr, int bytes) { int *last; uint32_t *lkey=NULL; uint32_t *rkey; int dscrlen = msginfo->dscrlen; last = (int*)(((char*)(src_ptr)) + (bytes - sizeof(int))); dassertp(1,msginfo->pinned,("%d: not pinned proc=%d",armci_me,proc)); rkey = (uint32_t *)((char *)(msginfo+1)+dscrlen-(sizeof(uint32_t)+sizeof(uint32_t))); if(DEBUG_SERVER){ printf("%d(server): sending data bypass to %d (%p,%p) %d %d\n", armci_me, msginfo->from,src_ptr, rem_ptr,*lkey,*rkey); fflush(stdout); } armci_server_direct_send(msginfo->from,src_ptr,rem_ptr,bytes,lkey,rkey); if(*last == ARMCI_STAMP){ SERVER_SEND_ACK(msginfo->from); } } void armci_rcv_strided_data_bypass_both(int proc, request_header_t *msginfo, void *ptr, int *count, int stride_levels) { int datalen = msginfo->datalen; int *last; long *ack; int loop=0; if(DEBUG_CLN){ printf("%d:rcv_strided_data_both bypass from %d\n", armci_me, proc); fflush(stdout); } if(!stride_levels){ last = (int*)(((char*)(ptr)) + (count[0] -sizeof(int))); ack = (long *)&msginfo->tag; while(armci_util_int_getval(last) == ARMCI_STAMP && armci_util_long_getval(ack) != ARMCI_STAMP){ loop++; loop %=1000000; if(loop==0){ if(DEBUG_CLN){ printf("%d: client last(%p)=%d ack(%p)=%ld off=%d\n", armci_me,last,*last,ack,*ack,(int)((char*)last - (char*)ptr)); fflush(stdout); } } } } else { printf("\n%d:rcv_strided_data called, it should never be called\n",armci_me); armci_dscrlist_recv_complete(0,"armci_rcv_strided_data_bypass_both",NULL); } if(DEBUG_CLN){printf("%d:rcv_strided_data bypass both: %d bytes from %d\n", armci_me, datalen, proc); fflush(stdout); } } int armci_pin_memory(void *ptr, int stride_arr[], int count[], int strides) { fprintf(stderr, "[%d]:armci_pin_memory not implemented\n",armci_me); fflush(stderr); return 0; } void armci_client_send_ack(int proc, int n) { printf("\n%d:client_send_ack not implemented",armci_me);fflush(stdout); } void armci_rcv_strided_data_bypass(int proc, request_header_t* msginfo, void *ptr, int stride_levels) { printf("\n%d:armci_rcv_strided_data_bypass not implemented",armci_me); fflush(stdout); } void armci_unpin_memory(void *ptr, int stride_arr[], int count[], int strides) { printf("\n%d:armci_unpin_memory not implemented",armci_me);fflush(stdout); } int armcill_server_wait_ack(int proc, int n) { printf("\n%d:armcill_server_wait_ack not implemented",armci_me); fflush(stdout); return(0); } void armcill_server_put(int proc, void* s, void *d, int len) { printf("\n%d:armcill_server_put not implemented",armci_me);fflush(stdout); } /*\ * initialising the atomic send descriptor \*/ void armci_init_vapibuf_atomic(struct ibv_send_wr *sd, struct ibv_sge *sg, int op, int*ploc,int *prem, int extra, int id,ARMCI_MEMHDL_T *lhandle, ARMCI_MEMHDL_T *rhandle) { if (1) { printf("%d(c) : entered armci_init_vapibuf_atomic\n",armci_me); fflush(stdout); } memset(sd,0,sizeof(struct ibv_send_wr)); if (op == ARMCI_FETCH_AND_ADD_LONG ) { printf("%d(c) :setting opcode for snd dscr to FETCH_AND_ADD\n",armci_me); sd->opcode = IBV_WR_ATOMIC_FETCH_AND_ADD; sd->wr.atomic.compare_add = (uint64_t)extra; } else if(op == ARMCI_SWAP_LONG){ sd->opcode = IBV_WR_ATOMIC_CMP_AND_SWP; sd->wr.atomic.swap = (uint64_t)extra; } sd->send_flags = IBV_SEND_SIGNALED; sg->length = 8; /* 64 bit atomic*/ printf("--------\n"); sg->addr= (uint64_t)(void *)ploc; if(lhandle) sg->lkey = lhandle->lkey; sd->sg_list = sg; sd->num_sge = 1; sd->wr.atomic.remote_addr = (uint64_t)(void *)prem; if(rhandle) sd->wr.atomic.rkey = rhandle->rkey; /* how do we get the remote key */ sd->wr_id = DSCRID_RMW + armci_me; if(1){ printf("%d(c) : finished initialising atomic send desc id is %ld,armci_ime = %d\n",armci_me,sd->wr_id,armci_me); fflush(stdout); } } /*\ * using vapi remote atomic operations \*/ void client_rmw_complete(struct ibv_send_wr *snd_dscr, char *from) { int rc = 0; struct ibv_wc pdscr1; struct ibv_wc *pdscr=&pdscr1; printf("%d(c) : inside client_rmw_complete\n",armci_me); do { while (rc == 0) { rc = ibv_poll_cq(CLN_nic->scq, 1, pdscr); } dassertp(DBG_POLL|DBG_ALL,rc>=0, ("%d: rc=%d id=%d status=%d\n", armci_me,rc,pdscr->wr_id,pdscr->status)); dassert1(1,pdscr->status==IBV_WC_SUCCESS,pdscr->status); rc = 0; } while(pdscr->wr_id != snd_dscr->wr_id); } void armci_direct_rmw(int op, int*ploc, int *prem, int extra, int proc, ARMCI_MEMHDL_T *lhandle, ARMCI_MEMHDL_T *rhandle) { int rc = 0; struct ibv_send_wr *sd; struct ibv_sge *sg; vapi_nic_t *nic; armci_connect_t *con; nic = SRV_nic; con = CLN_con+proc; sd = &(rmw[armci_me].rmw_dscr); sg = &(rmw[armci_me].rmw_entry); if (1) { printf("%d(c) : about to call armci_init_vapibuf_atomic\n",armci_me); fflush(stdout); } armci_init_vapibuf_atomic(sd, sg, op,ploc,prem,extra,proc,lhandle,rhandle); if (1) { printf("%d(c) : finished armci_init_vapibuf_atomic\n",armci_me); fflush(stdout); } struct ibv_send_wr * bad_wr; rc = ibv_post_send(con->qp, sd, &bad_wr); dassert1(1,rc==0,rc); if (1) { printf("%d(c) : finished posting desc\n",armci_me); fflush(stdout); } /*armci_send_complete(sd,"send_remote_atomic");*/ client_rmw_complete(sd,"send_remote_atomic"); return; } struct node *dto_q = NULL; void process_con_break_from_client(armci_ud_rank *h, cbuf *v) { struct ibv_qp_attr qp_attr; struct ibv_qp_init_attr qp_init_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; char *enval; struct ibv_recv_wr *bad_wr; int rc, j; armci_connect_t *con = CLN_con + h->src_rank; cbuf *v1 = get_cbuf(); assert( v1 != NULL); v1->desc.u.sr.wr.ud.remote_qpn = rbuf.qp_num[h->src_rank]; v1->desc.u.sr.wr.ud.remote_qkey = 0; v1->desc.u.sr.wr.ud.ah = conn.ud_ah[h->src_rank]; armci_ud_rank *h1 = (armci_ud_rank *)CBUF_BUFFER_START(v1); h1->src_rank = armci_me; h1->qpnum = con->sqpnum; h1->msg_type = QP_CON_BREAK_FROM_SERVER; cbuf_init_send(v1, sizeof(armci_ud_rank)); /* Release the receiving cbuf */ release_cbuf(v); struct ibv_send_wr *send_wr; if(ibv_post_send(conn.qp[0], &(v1->desc.u.sr), &send_wr)) { fprintf(stderr, "Error posting send\n"); } } void process_con_break_from_server(armci_ud_rank *h, cbuf *v) { int rc, j; armci_connect_t *con = SRV_con + armci_clus_id(h->src_rank); con->state = QP_INACTIVE; release_cbuf(v); } void process_recv_completion_from_client(armci_ud_rank *h, cbuf *v) { struct ibv_qp_attr qp_attr; struct ibv_qp_init_attr qp_init_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; char *enval; struct ibv_recv_wr *bad_wr; int rc, j; static int qp_flag = 1; if (qp_flag == 1) { total_active_conn_to_client = 0; qp_flag = 0; } total_active_conn_to_client++; double t_init_start, t_init_end, t_rtr_start, t_rts_end; static int flag = 0; t_init_start = MPI_Wtime(); armci_connect_t *con = CLN_con + h->src_rank; if (con->state == QP_ACTIVE) { qp_attr_mask = IBV_QP_STATE; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_SQD; if (ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask)) { fprintf(stdout," Error modifying QP\n"); fflush(stdout); } if (ibv_destroy_qp(con->qp)) { printf("Error destroying QP\n"); } total_active_conn_to_client--; } armci_create_qp(CLN_nic, &con->qp); con->sqpnum = con->qp->qp_num; con->lid = CLN_nic->lid_arr[h->src_rank]; CLN_rqpnumtmpbuf[h->src_rank] = con->qp->qp_num; qp_attr_mask = IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = DEFAULT_PKEY_IX; qp_attr.port_num = CLN_nic->active_port; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE| IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); t_init_end = MPI_Wtime(); memset(&qp_attr, 0, sizeof qp_attr); qp_attr_mask = IBV_QP_STATE | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_PATH_MTU | IBV_QP_RQ_PSN | IBV_QP_MIN_RNR_TIMER; qp_attr.qp_state = IBV_QPS_RTR; qp_attr.path_mtu = IBV_MTU_1024; /*MTU*/ qp_attr.max_dest_rd_atomic = 4; qp_attr.min_rnr_timer = RNR_TIMER; qp_attr.rq_psn = 0; /* Fill in the information from the header */ SRV_rqpnums[h->src_rank] = h->qpnum; qp_attr_mask |= IBV_QP_DEST_QPN | IBV_QP_AV; qp_attr.dest_qp_num = SRV_rqpnums[h->src_rank]; qp_attr.ah_attr.dlid = SRV_nic->lid_arr[h->src_rank]; qp_attr.ah_attr.port_num = CLN_nic->active_port; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); memset(&qp_attr, 0, sizeof qp_attr); qp_attr_mask = IBV_QP_STATE | IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 0; qp_attr.timeout = 18; qp_attr.retry_cnt = 7; qp_attr.rnr_retry = 7; qp_attr.max_rd_atomic = 4; rc = ibv_modify_qp(con->qp, &qp_attr,qp_attr_mask); t_rts_end = MPI_Wtime(); #if defined(PEND_BUFS) assert(armci_nproc*(IMM_BUF_NUM+1)src_rank*(IMM_BUF_NUM+1)+j]; armci_init_vapibuf_recv(&cbuf->dscr, &cbuf->sg_entry, cbuf->buf, IMM_BUF_LEN, &serv_memhandle); cbuf->dscr.wr_id = h->src_rank*(IMM_BUF_NUM+1)+j + DSCRID_IMMBUF_RECV; if (DEBUG_SERVER) { printf("\n%d(s):posted rr with lkey=%d",armci_me,cbuf->sg_entry.lkey); fflush(stdout); } if (armci_use_srq) { rc = ibv_post_srq_recv(CLN_srq_hndl, &cbuf->dscr, &bad_wr); } else { rc = ibv_post_recv((CLN_con + h->src_rank)->qp, &cbuf->dscr, &bad_wr); } dassert1(1,rc==0,rc); } #else int i; for(i = 0; i < armci_nproc; i++) { vapibuf_t *cbuf; cbuf = serv_buf_arr[h->src_rank]; armci_init_vapibuf_recv(&cbuf->dscr, &cbuf->sg_entry, cbuf->buf, CBUF_DLEN, &serv_memhandle); cbuf->dscr.wr_id = h->src_rank+armci_nproc; if (DEBUG_SERVER) { printf("\n%d(s):posted rr with lkey=%d",armci_me,cbuf->sg_entry.lkey); fflush(stdout); } if (armci_use_srq) { rc = ibv_post_srq_recv(CLN_srq_hndl, &cbuf->dscr, &bad_wr); } else { rc = ibv_post_recv((CLN_con+h->src_rank)->qp, &cbuf->dscr, &bad_wr); } dassert1(1,rc==0,rc); } #endif /* Now send back the information */ struct cbuf *v1 = get_cbuf(); assert( v1 != NULL); v1->desc.u.sr.wr.ud.remote_qpn = rbuf.qp_num[h->src_rank]; v1->desc.u.sr.wr.ud.remote_qkey = 0; v1->desc.u.sr.wr.ud.ah = conn.ud_ah[h->src_rank]; armci_ud_rank *h1 = (armci_ud_rank *)CBUF_BUFFER_START(v1); h1->src_rank = armci_me; h1->qpnum = con->sqpnum; h1->msg_type = 2; cbuf_init_send(v1, sizeof(armci_ud_rank)); /* Release the receiving cbuf */ release_cbuf(v); struct ibv_send_wr *send_wr; if(ibv_post_send(conn.qp[0], &(v1->desc.u.sr), &send_wr)) { fprintf(stderr, "Error posting send\n"); } con->state = QP_ACTIVE; } void progress_engine() { struct ibv_cq *ev_cq; void *ev_ctx; struct ibv_wc *sc; int ne; struct ibv_wc wc; int send_comp = 0; int recv_comp = 0; int count; void *cbuf_addr; cbuf *v; int ret; do { ne = ibv_poll_cq(hca.cq, 1, &wc); } while (ne < 1); /* Okay, got an entry, check for errors */ if(ne < 0) { fprintf(stderr,"Error Polling CQ\n"); } if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, "[%d] Failed status %d\n", armci_me, wc.status); } cbuf_addr = (void *) ((aint_t) wc.wr_id); assert(cbuf_addr != NULL); v = (cbuf *)cbuf_addr; armci_ud_rank *h = (armci_ud_rank *)(CBUF_BUFFER_START(v) + 40); if(IBV_WC_SEND == wc.opcode || IBV_WC_RDMA_WRITE == wc.opcode) { release_cbuf(v); /* Do nothing, just release the cbuf */ /* Send Completion */ } else if (IBV_WC_RECV == wc.opcode) { /* Recv completion */ post_recv(); /* Check if the message received is from a data server */ assert((h->msg_type == QP_CON_REQ) || (h->msg_type == QP_CON_ACK) || (h->msg_type == QP_CON_BREAK_FROM_CLIENT) || (h->msg_type == QP_CON_BREAK_FROM_SERVER)); if (h->msg_type == QP_CON_REQ) { process_recv_completion_from_client(h, v); } else if (h->msg_type == QP_CON_BREAK_FROM_CLIENT) { process_con_break_from_client(h, v); } else if (h->msg_type == QP_CON_BREAK_FROM_SERVER) { process_con_break_from_server(h, v); } else { process_recv_completion_from_server(h, v); } } else { fprintf(stderr, "Unknown opcode recv'd\n"); } } void async_thread_ud_events(void *context) { struct ibv_cq *ev_cq; void *ev_ctx; struct ibv_wc *sc; int ne; struct ibv_wc wc; int send_comp = 0; int recv_comp = 0; int count; void *cbuf_addr; cbuf *v; int ret; while (1) { progress_engine(); } } static struct ibv_srq *create_srq(vapi_nic_t *nic) { struct ibv_srq_init_attr srq_init_attr; struct ibv_srq *srq_ptr = NULL; memset(&srq_init_attr, 0, sizeof(srq_init_attr)); srq_init_attr.srq_context = nic->handle; #ifdef PEND_BUFS srq_init_attr.attr.max_wr = armci_nproc * (IMM_BUF_NUM + 1) + 200; #else srq_init_attr.attr.max_wr = armci_nproc + 200; #endif srq_init_attr.attr.max_sge = 1; /* The limit value should be ignored during SRQ create */ srq_init_attr.attr.srq_limit = 30; srq_ptr = ibv_create_srq(nic->ptag, &srq_init_attr); return srq_ptr; } int init_params(void) { conn.qp = (struct ibv_qp **) malloc(armci_nproc * sizeof(struct ibv_qp *)); conn.lid = (uint16_t *) malloc(armci_nproc * sizeof(int)); conn.qp_num = (uint32_t *) malloc(armci_nproc * sizeof(int)); conn.ud_ah = (struct ibv_ah **) malloc (armci_nproc * sizeof (struct ibv_ah *)); conn.status = (int *) malloc(armci_nproc * sizeof(int)); memset((void *)conn.status, 0, sizeof(int) * armci_nproc); rbuf.qp_num = (uint32_t *) malloc(armci_nproc * sizeof(int)); rbuf.lid = (uint16_t *) malloc(armci_nproc * sizeof(int)); rbuf.rkey = (uint32_t *) malloc(armci_nproc * sizeof(int)); rbuf.buf = (char **) malloc(armci_nproc * sizeof(char *)); assert(conn.qp && conn.lid && rbuf.qp_num && rbuf.lid && rbuf.rkey && rbuf.buf); return 0; } int open_hca(void) { struct ibv_device **dev_list; struct ibv_device *ib_dev; int num_hcas; dev_list = ibv_get_device_list(&num_hcas); hca.ib_dev = dev_list[0]; hca.context = ibv_open_device(hca.ib_dev); if(!hca.context) { fprintf(stderr,"Couldn't get context %s\n", ibv_get_device_name(hca.ib_dev)); return 1; } hca.pd = ibv_alloc_pd(hca.context); if(!hca.pd) { fprintf(stderr,"Couldn't get pd %s\n", ibv_get_device_name(hca.ib_dev)); return 1; } return 0; } int create_cq(void) { hca.cq = ibv_create_cq(hca.context, 16000, NULL, NULL, 0); if(!hca.cq) { fprintf(stderr, "Couldn't create CQ\n"); return 1; } if (armci_me == armci_master) { pthread_create(&armci_async_thread[1], NULL, (void *) async_thread_ud_events, (void *) hca.context); } return 0; } int get_lid(void) { struct ibv_port_attr port_attr[2]; int i, j, count; int active_port_search_count; for (j = 1; j <= 1; j++) { if (!ibv_query_port(hca.context, j, &port_attr[j - 1]) && (port_attr[j - 1].state == IBV_PORT_ACTIVE)) { for (i = 0; i < armci_nproc; i++) conn.lid[i] = port_attr[j - 1].lid; return 0; } } return 1; } int exch_addr(void) { MPI_Status status; int i; MPI_Allgather((void *)conn.qp_num, sizeof(uint32_t), MPI_BYTE, (void *)rbuf.qp_num, sizeof(uint32_t), MPI_BYTE, ARMCI_COMM_WORLD); MPI_Alltoall((void *)conn.lid, sizeof(uint16_t), MPI_BYTE, (void *)rbuf.lid, sizeof(uint16_t), MPI_BYTE, ARMCI_COMM_WORLD); #ifdef DEBUG for (i = 0; i < nprocs; i++) { if (me == i) continue; fprintf(stdout,"[%d] Remote QP %d, Remote LID %u, Rkey %u, Lkey %u\n" " LBuf %p, RBuf %p\n", me, rbuf.qp_num[i], rbuf.lid[i], rbuf.rkey[i], lbuf.mr->lkey, lbuf.buf, rbuf.buf[i]); fflush(stdout); } #endif return 0; } int create_qp(void) { struct ibv_qp_attr qp_attr; int i; memset(&qp_attr, 0, sizeof qp_attr); struct ibv_qp_init_attr attr = { .send_cq = hca.cq, .recv_cq = hca.cq, .cap = { .max_send_wr = 8192, .max_recv_wr = 8192, .max_send_sge = 1, .max_recv_sge = 1, .max_inline_data = 0 }, .qp_type = IBV_QPT_UD }; conn.qp[0] = ibv_create_qp(hca.pd, &attr); if(!conn.qp[0]) { fprintf(stderr,"Couldn't create QP\n"); return 1; } conn.qp_num[0] = conn.qp[0]->qp_num; qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = 0; qp_attr.port_num = 1; qp_attr.qkey = 0; if(ibv_modify_qp(conn.qp[0], &qp_attr, IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_QKEY)) { fprintf(stderr,"Could not modify QP to INIT\n"); return 1; } #ifdef DEBUG fprintf(stdout,"[%d] Created QP %d, LID %d\n", me, conn.qp_num[0], conn.lid[0]); fflush(stdout); #endif return 0; } struct ibv_mr* armci_register_memory(void* buf, int len) { return (ibv_reg_mr(hca.pd, buf, len, IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ)); } int connect_qp(void) { struct ibv_qp_attr attr; int i; memset(&attr, 0 , sizeof attr); attr.qp_state = IBV_QPS_RTR; if (ibv_modify_qp(conn.qp[0], &attr, IBV_QP_STATE)) { fprintf(stderr, "Failed to modify QP to RTR\n"); return 1; } attr.qp_state = IBV_QPS_RTS; attr.sq_psn = 0; if (ibv_modify_qp(conn.qp[0], &attr, IBV_QP_STATE | IBV_QP_SQ_PSN)) { fprintf(stderr, "Failed to modify QP to RTS\n"); return 1; } for (i = 0; i < armci_nproc; i++) { struct ibv_ah_attr ah_attr; memset(&ah_attr, 0, sizeof(ah_attr)); ah_attr.is_global = 0; ah_attr.dlid = rbuf.lid[i]; ah_attr.sl = 0; ah_attr.src_path_bits = 0; ah_attr.port_num = 1; conn.ud_ah[i] = ibv_create_ah(hca.pd, &ah_attr); if (!conn.ud_ah[i]) { fprintf(stderr, "Error creating address handles\n"); } } return 0; } int total_ud_recv_buffers = 4096; void post_recv() { cbuf *v = get_cbuf(); cbuf_init_recv(v, CBUF_BUFFER_SIZE); struct ibv_recv_wr *bad_wr; /* set id to be the global_rank */ v->grank = -1; if(ibv_post_recv(conn.qp[0], &(v->desc.u.rr), &bad_wr)) { fprintf(stderr," Error posting UD recv\n"); fflush(stderr); } } int post_buffers() { init_cbuf_lock(); allocate_cbufs(8192); int i; for (i = 0; i < total_ud_recv_buffers; i++) { post_recv(); } return 0; } void test_connectivity(void) { int i; struct ibv_send_wr *bad_wr; cbuf *v = NULL; for (i = 0; i < armci_nproc;i++) { if (armci_me == i) continue; int j; for (j = 0 ; j < 2; j++) { v = get_cbuf(); assert(v != NULL); v->desc.u.sr.wr.ud.remote_qpn = rbuf.qp_num[i]; v->desc.u.sr.wr.ud.remote_qkey = 0; v->desc.u.sr.wr.ud.ah = conn.ud_ah[i]; armci_ud_rank *h = (armci_ud_rank *)CBUF_BUFFER_START(v); h->src_rank = armci_me; cbuf_init_send(v, sizeof(armci_ud_rank)); if(ibv_post_send(conn.qp[0], &(v->desc.u.sr), &bad_wr)) { fprintf(stderr, "Error posting send\n"); } } } } int recycle_dead_qp() { } void handle_network_fault(struct ibv_wc *pdscr) { recycle_dead_qp(); } void setup_ud_channel() { if(init_params()) { } if(open_hca()) { } if(create_cq()) { } if(get_lid()) { } if(create_qp()) { } if (exch_addr()) { } if(connect_qp()) { } MPI_Barrier(ARMCI_COMM_WORLD); if(post_buffers()) { } MPI_Barrier(ARMCI_COMM_WORLD); } void process_recv_completion_from_server(armci_ud_rank *h, cbuf *v) { struct ibv_qp_attr qp_attr; struct ibv_qp_init_attr qp_init_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; char *enval; struct ibv_recv_wr *bad_wr; int rc, j; armci_connect_t *con = SRV_con + armci_clus_id(h->src_rank); qp_attr_mask = IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = DEFAULT_PKEY_IX; qp_attr.port_num = SRV_nic->active_port; qp_attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE| IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); memset(&qp_attr, 0, sizeof qp_attr); qp_attr_mask = IBV_QP_STATE | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_PATH_MTU | IBV_QP_RQ_PSN | IBV_QP_MIN_RNR_TIMER; qp_attr.qp_state = IBV_QPS_RTR; qp_attr.path_mtu = IBV_MTU_1024; /*MTU*/ qp_attr.max_dest_rd_atomic = 4; qp_attr.min_rnr_timer = RNR_TIMER; qp_attr.rq_psn = 0; /* Fill in the information from the header */ CLN_rqpnums[h->src_rank] = h->qpnum; qp_attr_mask |= IBV_QP_DEST_QPN | IBV_QP_AV; qp_attr.dest_qp_num = CLN_rqpnums[h->src_rank]; qp_attr.ah_attr.dlid = SRV_nic->lid_arr[h->src_rank]; qp_attr.ah_attr.port_num = SRV_nic->active_port; rc = ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask); memset(&qp_attr, 0, sizeof qp_attr); qp_attr_mask = IBV_QP_STATE | IBV_QP_SQ_PSN | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_MAX_QP_RD_ATOMIC; qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 0; qp_attr.timeout = 18; qp_attr.retry_cnt = 7; qp_attr.rnr_retry = 7; qp_attr.max_rd_atomic = 4; rc = ibv_modify_qp(con->qp, &qp_attr,qp_attr_mask); release_cbuf(v); con->state = QP_ACTIVE; } struct con_q_t { struct armci_connect_t *head; void *next; }; struct con_q_t *con_q; #define MAX_CLIENT_TO_SERVER_CONN 2 armci_connect_t * dequeue_conn() { return NULL; } int get_max_client_to_server_conn() { static int env_read_flag = 0; static int max_client_to_server_conn = 0; if (!env_read_flag) { char *value; if ((value = getenv("ARMCI_MAX_CLIENT_TO_SERVER_FACTOR")) != NULL){ max_client_to_server_conn = armci_nclus/atoi(value); /* We need a minimum of 4 connections */ if (max_client_to_server_conn <= 1) max_client_to_server_conn = 2; if (armci_me == 0) { fprintf(stdout, "max_client_to_server_conn[%d]\n", max_client_to_server_conn); } } else { max_client_to_server_conn = armci_nclus / 2; if (max_client_to_server_conn <= 1) max_client_to_server_conn = 2; } } return max_client_to_server_conn; } int get_the_victim_connection() { return 0; } void break_a_connection_if_needed() { assert(!SERVER_CONTEXT); if (!armci_use_lazy_break) return; int victim, proc; armci_connect_t *con; int max_client_to_server_conn = get_max_client_to_server_conn(); if ((total_active_conn_to_server >= max_client_to_server_conn) && (armci_me != armci_master)) { int proc, clus_id; do { proc = get_the_victim_connection(); /* Not enough on the queue */ if (proc == -1) return; clus_id = armci_clus_id(proc); } while ((armci_clus_me == clus_id) || ((SRV_con + clus_id)->state != QP_ACTIVE)); double t_fence_start, t_fence_end; t_fence_start = MPI_Wtime(); ARMCI_WaitAll(); ARMCI_Fence(proc); struct ibv_qp_attr qp_attr; struct ibv_qp_init_attr qp_init_attr; struct ibv_qp_cap qp_cap; enum ibv_qp_attr_mask qp_attr_mask; char *enval; double t_destroy_start, t_destroy_end; t_destroy_start = MPI_Wtime(); armci_connect_t *con = SRV_con + clus_id; int rc, j; dassert(1, con->state == QP_ACTIVE); qp_attr_mask = IBV_QP_STATE; memset(&qp_attr, 0, sizeof qp_attr); qp_attr.qp_state = IBV_QPS_SQD; if (ibv_modify_qp(con->qp, &qp_attr, qp_attr_mask)) { fprintf(stdout," Error modifying QP\n"); fflush(stdout); } cbuf *v = get_cbuf(); assert(v != NULL); v->desc.u.sr.wr.ud.remote_qpn = rbuf.qp_num[armci_clus_info[clus_id].master]; v->desc.u.sr.wr.ud.remote_qkey = 0; v->desc.u.sr.wr.ud.ah = conn.ud_ah[armci_clus_info[clus_id].master]; armci_ud_rank *h = (armci_ud_rank *)CBUF_BUFFER_START(v); h->src_rank = armci_me; h->qpnum = con->sqpnum; h->msg_type = QP_CON_BREAK_FROM_CLIENT; struct ibv_send_wr *bad_wr; cbuf_init_send(v, sizeof(armci_ud_rank)); if(ibv_post_send(conn.qp[0], &(v->desc.u.sr), &bad_wr)) { printf("Error posting send\n"); } while (con->state != QP_INACTIVE) { if (armci_me != armci_master) progress_engine(); } if (ibv_destroy_qp(con->qp)) { printf("Error destroying QP\n"); } } } void check_state_of_ib_connection(int proc, int force) { int clus_id; armci_connect_t *con; /* return if ARMCI does not use on demand connection management */ if (!armci_use_odcm) return; static int flag = 1; static int last = 0; if (flag == 1) { total_active_conn_to_server = 0; total_breaks = 0; flag = 0; } /* Check clus id */ clus_id = armci_clus_id(proc); con = SRV_con + clus_id; assert(!SERVER_CONTEXT); if (con->state != QP_ACTIVE) { if (!force) break_a_connection_if_needed(); total_active_conn_to_server++; double t_create_start, t_create_end; t_create_start = MPI_Wtime(); armci_create_qp(SRV_nic, &con->qp); con->sqpnum = con->qp->qp_num; con->lid = SRV_nic->lid_arr[clus_id]; cbuf *v = get_cbuf(); assert(v != NULL); v->desc.u.sr.wr.ud.remote_qpn = rbuf.qp_num[armci_clus_info[clus_id].master]; v->desc.u.sr.wr.ud.remote_qkey = 0; v->desc.u.sr.wr.ud.ah = conn.ud_ah[armci_clus_info[clus_id].master]; armci_ud_rank *h = (armci_ud_rank *)CBUF_BUFFER_START(v); h->src_rank = armci_me; h->qpnum = con->sqpnum; h->msg_type = QP_CON_REQ; struct ibv_send_wr *bad_wr; cbuf_init_send(v, sizeof(armci_ud_rank)); if(ibv_post_send(conn.qp[0], &(v->desc.u.sr), &bad_wr)) { printf("Error posting send\n"); } if (armci_me != armci_master) { while (con->state != QP_ACTIVE) { progress_engine(); } } else { while (con->state != QP_ACTIVE) { usleep(1); } } t_create_end = MPI_Wtime(); } } ga-5-4/armci/src/devices/sockets/0000755000175000017500000000000012662210404015004 5ustar mbambaga-5-4/armci/src/devices/sockets/sockets.c0000644000175000017500000005763012662210404016636 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: sockets.c,v 1.23.8.1 2007-02-09 17:10:18 andriy Exp $ */ /************************************************************************** Some parts of this code were derived from the TCGMSG file sockets.c Jarek Nieplocha, last update 10/28/99 02/28/00: modified armci_WaitSock to allow some elements of socklist to be <0 (and ignored). Needed for the threaded version of server. *************************************************************************/ #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_SYS_TIME_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_SOCKET_H # include #endif /*# include */ /*moved to sockets.h*/ #if HAVE_NETINET_IN_H # include #endif #if HAVE_NETINET_TCP_H # include #endif #if HAVE_NETDB_H # include #endif #if HAVE_UNISTD_H # include # define CLOSE close #elif HAVE_WINSOCK_H # include # define bcopy(s1,s2,n) memcpy(s2,s1,n) # define sleep(x) Sleep(1000*(x)) # define CLOSE closesocket #endif #include "armcip.h" #include "sockets.h" /* JAD 2010-05-06 Code these days is safe to use socklen_t so long as it uses * it throughout. */ #if 0 # ifdef AIX # include # if HAVE_SYS_SELECT_H # include # endif # ifdef _AIXVERSION_430 typedef socklen_t soclen_t; # else typedef size_t soclen_t; # endif # elif defined(XLCLINUX) typedef socklen_t soclen_t; # else typedef int soclen_t; # endif #else # ifdef NEC typedef int soclen_t; # else typedef socklen_t soclen_t; # endif #endif #ifdef CRAY # if HAVE_MEMORY_H # include # endif #endif /* portability of socklen_t definition is iffy - we need to avoid it !! #if defined(LINUX) && ( defined(_SOCKETBITS_H) || defined(__BITS_SOCKET_H)) #elif defined(AIX) typedef size_t socklen_t; #else typedef int socklen_t; #endif */ #ifndef MAX_STRIDE_LEVEL #define MAX_STRIDE_LEVEL 8 #endif extern int armci_me, armci_nproc,armci_nclus; int tcp_sendrcv_bufsize=131072; #define DEBUG_ 0 #define DEBUG1 0 #define CONNECT_TRIALS 4 #define MAX_INTR_NO_DATA 8 int armci_PollSocket(int sock) /* Poll the socket for available input. Return 1 if data is available, 0 otherwise. */ { fd_set ready; struct timeval timelimit; int nready; if (sock < 0) return 0; again: FD_ZERO(&ready); FD_SET(sock, &ready); timelimit.tv_sec = 0; timelimit.tv_usec = 0; nready = select(sock+1, &ready, (fd_set *) NULL, (fd_set *) NULL, &timelimit); if (nready < 0) { if (errno == EINTR) goto again; else armci_die("armci_PollSocket: error from select", sock); } return nready; } /*\ sleep in select until data appears on one of sockets * return number of sockets ready and indicate which ones are in ready array * allows <0 values in socklist array (ignores them) \*/ int armci_WaitSock(int *socklist, int num, int *ready) { int sock,maxsock=0; fd_set dset; int nready; if(num<0) armci_die("armci_WaitSock: num <0",num); again: FD_ZERO(&dset); maxsock=0; for(sock=0; sock maxsock)maxsock = socklist[sock]; if(socklist[sock] >0){ /* ignore fd=-1 on the list */ FD_SET(socklist[sock], &dset); } } nready = select(maxsock+1, &dset, (fd_set*)NULL, (fd_set*)NULL, NULL); if (nready < 0) { if (errno == EINTR){ fprintf(stderr,"%d:interrupted in select\n",armci_me); goto again; } else armci_die("armci_WaitSocket: error from select", sock); } for(sock=0; sock maxsock)maxsock = socklist[sock]; if(socklist[sock] >0){ /* ignore fd=-1 on the list */ FD_SET(socklist[sock], &dset); } } timelimit.tv_sec = 0; timelimit.tv_usec = lim; nready = select(maxsock+1, &dset, (fd_set*)NULL, (fd_set*)NULL, &timelimit); if (nready < 0) { if (errno == EINTR){ fprintf(stderr,"%d:interrupted in select\n",armci_me); goto again; } else armci_die("armci_WaitSocket: error from select", sock); } for(sock=0; sockp_proto; status = setsockopt(sock, level, TCP_NODELAY, optval, sizeof(int)); if (status != 0) armci_die("armci_TcpNoDelay: setsockopt failed", status); } void armci_ShutdownAll(int socklist[], int num) /* close all sockets discarding any pending data in either direction. */ { int i; for (i=0; i= 0) { (void) shutdown(socklist[i], 2); (void) CLOSE(socklist[i]); socklist[i]=-1; } } #if defined(USE_SOCKET_VECTOR_API) int _armci_tcp_writev(int sock, struct iovec *iovptr,int writeiovlength,int currentwritesize,struct iovec *iov){ int n=0; while(n!=currentwritesize){ int rc; rc=writev(sock,iovptr,writeiovlength); if(rc<0)perror("writev failed"); if(DEBUG1&&0)if(rciov_len)+templength>rc){ iovptr->iov_base=(char *)((*iovptr).iov_base)+(rc-templength); iovptr->iov_len-=(rc-templength); templength+=(rc-templength); } else { templength+=iovptr->iov_len; iovptr+=1; completediovs++; } } writeiovlength-=completediovs; if(writeiovlength<=0)writeiovlength=1; } } return(n); } int _armci_tcp_readv(int sock, struct iovec *iovptr,int readiovlength,int currentreadsize,struct iovec *iov){ int n=0; while(n!=currentreadsize){ int rc; rc=readv(sock,iovptr,readiovlength); if(rc<0)perror("readv failed"); if(DEBUG1&&0)if(rciov_len)+templength>rc){ iovptr->iov_base=(char *)((*iovptr).iov_base)+(rc-templength); iovptr->iov_len-=(rc-templength); templength+=(rc-templength); } else { templength+=iovptr->iov_len; iovptr+=1; completediovs++; } } readiovlength-=completediovs; if(readiovlength<=0)readiovlength=1; } } return(n); } int armci_ReadVFromSocket(int sock,struct iovec *iov, int iovlength, int totalsize) { struct iovec *iovptr; int i=0,num_xmit=1,lastiovoriglen=0,lastiovnewlen=0,lastiovindex=-1,n=0; int readiovlength,currentreadsize=totalsize,totalreadsofar=0,byteslefttoread=0; char *lastiovorigbase=NULL; iovptr=iov; if(totalsize>PACKET_SIZE){ while(totalreadsofar!=totalsize){ currentreadsize=0; if(lastiovindex>=0) iovptr=iov+lastiovindex; if(lastiovoriglen!=0){ iov[lastiovindex].iov_base = (lastiovorigbase+lastiovnewlen); iov[lastiovindex].iov_len=lastiovoriglen-lastiovnewlen; lastiovoriglen=0; } iovlength=0; if(totalsize-totalreadsofarbyteslefttoread){ lastiovoriglen=iov[i].iov_len;lastiovorigbase=(char *)iov[i].iov_base; lastiovindex=i; iov[i].iov_len=byteslefttoread-currentreadsize; currentreadsize+=iov[i].iov_len; lastiovnewlen=iov[i].iov_len; } else { currentreadsize+=iov[i].iov_len; i++; lastiovindex=i; iovlength++; } } if(lastiovoriglen>0)iovlength+=1; totalreadsofar+=currentreadsize; num_xmit++; readiovlength=iovlength; n=_armci_tcp_readv(sock,iovptr,readiovlength,currentreadsize,iov); if(DEBUG1){printf("\nFinished reading n=%d bytes iov of length %d \n",n,iovlength);fflush(stdout);} } } else { iovptr=iov; readiovlength=iovlength; n=0; n+=_armci_tcp_readv(sock,iovptr,readiovlength,currentreadsize,iov); if(DEBUG1){printf("\nFits in one packet Finished reading n=%d bytes iov of length %d \n",n,iovlength);fflush(stdout);} } return(n); } int armci_WriteVToSocket(int sock,struct iovec *iov, int iovlength, int totalsize){ int lastiovoriglen=0,lastiovnewlen=0,lastiovindex=-1,totalwritesofar=0,byteslefttowrite=0; struct iovec *iovptr; int i=0,num_xmit=0,n=0; int currentwritesize=totalsize,writeiovlength; char *lastiovorigbase=NULL; iovptr=iov; if(totalsize>PACKET_SIZE){ while(totalwritesofar!=totalsize){ currentwritesize=0; if(lastiovindex>=0) iovptr=iov+lastiovindex; if(lastiovoriglen!=0){ iov[lastiovindex].iov_base = (lastiovorigbase+lastiovnewlen); iov[lastiovindex].iov_len= lastiovoriglen-lastiovnewlen; lastiovoriglen=0; } iovlength=0; if(totalsize-totalwritesofarbyteslefttowrite){ lastiovoriglen=iov[i].iov_len;lastiovorigbase=(char *)iov[i].iov_base; lastiovindex=i; iov[i].iov_len=byteslefttowrite-currentwritesize; currentwritesize+=iov[i].iov_len;lastiovnewlen=iov[i].iov_len; } else { currentwritesize+=iov[i].iov_len; i++; lastiovindex=i; iovlength++; } } totalwritesofar+=currentwritesize; num_xmit++; if(lastiovoriglen>0)iovlength+=1; writeiovlength=iovlength; n=_armci_tcp_writev(sock,iovptr,writeiovlength,currentwritesize,iov); if(DEBUG1){printf("\nFinished writing n=%d iov of length %d \n",n,iovlength);fflush(stdout);} if(n!=currentwritesize)armci_die2("\n problems with writing using writev\n",n,currentwritesize); } } else { iovptr=iov; writeiovlength=iovlength; n=0; n= _armci_tcp_writev(sock,iovptr,writeiovlength,currentwritesize,iov); if(n<0)perror("write failed"); if(DEBUG1){printf("\nFits in one packet Finished writing n=%d iov of length %d \n",n,iovlength);fflush(stdout);} if(n!=currentwritesize)armci_die2("\n problems with writing using writev\n",n,currentwritesize); } return(n); } #endif /*for use_socket_vec_api*/ int armci_ReadFromSocket(int sock, void* buffer, int lenbuf) /* Read from the socket until we get all we want. */ { int nread, status, nintr=0; char *buf = (char*)buffer; status = lenbuf; while (lenbuf > 0) { again: nread = recv(sock, buf, lenbuf, 0); /* on linux 0 can be returned if socket is closed by sender */ if(nread < 0 || ((nread == 0) && errno ) ){ if (errno == EINTR){ if(DEBUG_){ fprintf(stderr,"%d:interrupted in recv\n",armci_me); } /* retry a few times if nread==0 */ if(nread==0) nintr++; else nintr=0; if(nintr>MAX_INTR_NO_DATA) return -1; /* the socket must be closed */ goto again; }else { if(DEBUG_){ (void) fprintf(stderr,"sock=%d, pid=%d, nread=%d, len=%d\n", sock, armci_me, nread, lenbuf); if(errno)perror("armci_ReadFromSocket: recv failed"); } status = -1; break; } } buf += nread; lenbuf -= nread; } return status; } int armci_WriteToSocket (int sock, void* buffer, int lenbuf) /* Write to the socket in packets of PACKET_SIZE bytes */ { int status = lenbuf; int nsent, len; char *buf = (char*)buffer; if(DEBUG_){ printf("%d armci_WriteToSocket sock=%d lenbuf=%d\n",armci_me,sock,lenbuf); fflush(stdout); } while (lenbuf > 0) { again: len = (lenbuf > PACKET_SIZE) ? PACKET_SIZE : lenbuf; nsent = send(sock, buf, len, 0); if (nsent < 0) { /* This is bad news */ if(errno ==EINTR){ if(DEBUG_){ fprintf(stderr,"%d:interrupted in socket send\n",armci_me); } goto again; }else{ if(DEBUG_){ (void) fprintf(stderr,"sock=%d, pid=%d, nsent=%d, len=%d\n", sock, armci_me, nsent, lenbuf); (void) fflush(stderr); } status = -1; break; } } buf += nsent; lenbuf -= nsent; } return status; } void armci_CreateSocketAndBind(int *sock, int *port) /* Create a socket, bind it to a wildcard internet name and return the info so that its port number may be advertised */ { soclen_t length; struct sockaddr_in server; int size = PACKET_SIZE; int on = 1; length = sizeof (struct sockaddr_in); /* Create socket */ if ( (*sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) armci_die("armci_CreateSocketAndBind: socket creation failed", *sock); if(setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) == -1) armci_die("armci_CreateSocketAndBind: error from setsockopt", -1); /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(*sock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size))) armci_die("armci_CreateSocketAndBind: error setting SO_RCVBUF", size); if(setsockopt(*sock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size))) armci_die("armci_CreateSocketAndBind: error setting SO_SNDBUF", size); armci_TcpNoDelay(*sock); /* Name socket with wildcards */ server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = 0; if (bind(*sock, (struct sockaddr *) &server, length) < 0) armci_die("armci_CreateSocketAndBind: bind failed", 0); /* Find out port number etc. */ if (getsockname(*sock, (struct sockaddr *) &server, &length) < 0) armci_die("armci_CreateSocketAndBind: getsockname failed", 0); *port = ntohs(server.sin_port); } /*\ listen for socket connections \*/ void armci_ListenSockAll(int* socklist, int num) { int i; if(num<0)armci_die("armci_ListenSockAll invalid number of sockets",num); for(i=0; i< num; i++){ againlist: if (listen(socklist[i], num) < 0) { if (errno == EINTR) goto againlist; else armci_die("armci_ListenSockAll: listen failed", 0); } } if (DEBUG_) { (void) printf("process %d out of listen on %d sockets\n",armci_me,num); (void) fflush(stdout); } } void armci_tcp_get_sock_buf_size(int msgsock){ int buffer_orig=32768,r; r = -1; while ( r < 0 && (tcp_sendrcv_bufsize > buffer_orig) ) { r= setsockopt(msgsock, SOL_SOCKET, SO_SNDBUF, (char *) &tcp_sendrcv_bufsize, sizeof(tcp_sendrcv_bufsize)); r= setsockopt(msgsock, SOL_SOCKET, SO_RCVBUF, (char *) &tcp_sendrcv_bufsize, sizeof(tcp_sendrcv_bufsize)); if( r < 0 ) tcp_sendrcv_bufsize =(tcp_sendrcv_bufsize/2); } } /*\ accept connections on the specified sockets \*/ void armci_AcceptSockAll(int* socklist, int num) { fd_set ready, fdzero; struct timeval timelimit; int maxsock, msgsock, nready, num_accept=0; int i; if(num<0)armci_die("armci_AcceptSockAll invalid number of sockets",num); /* Use select to wait for someone to try and establish a connection so that we can add a short timeout to avoid hangs */ FD_ZERO(&fdzero); againsel: FD_ZERO(&ready); /* we negate socket number on the list to mark already connected */ maxsock=0; for(i=0; i maxsock)maxsock = socklist[i]; /* find largest value*/ if(socklist[i]>0) FD_SET(socklist[i], &ready); /* printf("%d: accepting socket%d=%d of %d\n",armci_me,i,socklist[i],num);*/ } timelimit.tv_sec = TIMEOUT_ACCEPT; timelimit.tv_usec = 0; nready = select(maxsock+1, &ready, (fd_set *) NULL, (fd_set *) NULL, &timelimit); /* error screening */ if ( (nready <= 0) && (errno == EINTR) ) goto againsel; else if (nready < 0) armci_die("armci_AcceptSockAll: error from select",nready); else if (nready == 0) armci_die("armci_AcceptSockAll:timeout waiting for connection",nready); /* if (bcmp(&ready,&fdzero,sizeof(fdzero)))*/ /* armci_die("armci_AcceptSockAll: out of select but not ready!",nready);*/ /* accept connection from newly contacted clients */ for(i=0; i< num; i++){ int sock = socklist[i]; if(sock<0) continue; /* accepted already */ if(!FD_ISSET(sock, &ready)) continue; /* not contacted yet */ againacc: msgsock = accept(sock, (struct sockaddr *) NULL, (soclen_t *) NULL); if(msgsock==0){ int msgsock2; msgsock2 = dup(msgsock); /*(void) CLOSE(msgsock);*/ msgsock = msgsock2; } if (msgsock == -1) { if (errno == EINTR) goto againacc; else armci_die("armci_AcceptSockAll: accept failed", msgsock); } if(DEBUG_){ (void) printf("process %d out of accept socket=%d\n",armci_me,msgsock); (void) fflush(stdout); } /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ armci_tcp_get_sock_buf_size(msgsock); armci_TcpNoDelay(msgsock); (void) CLOSE(sock); /* will not be needing this again */ socklist[i] = -msgsock; /* negate connected socket on the list */ num_accept++; } if(num_accept < num) goto againsel; for(i=0; i< num; i++) if(socklist[i]>=0) armci_die("armci_AcceptSockAll: not connected",socklist[i]); else socklist[i] = - socklist[i]; } int armci_ListenAndAccept(int sock) /* Listen and accept a connection on the specified socket which was created with CreateSocketAndBind */ { fd_set ready; struct timeval timelimit; int msgsock, nready; int size = PACKET_SIZE; againlist: if (listen(sock, 1) < 0) { if (errno == EINTR) goto againlist; else armci_die("armci_ListenAndAccept: listen failed", 0); } if (DEBUG_) { (void) printf("process %d out of listen on socket %d\n",armci_me,sock); (void) fflush(stdout); } /* Use select to wait for someone to try and establish a connection so that we can add a short timeout to avoid hangs */ againsel: FD_ZERO(&ready); FD_SET(sock, &ready); timelimit.tv_sec = TIMEOUT_ACCEPT; timelimit.tv_usec = 0; nready = select(sock+1, &ready, (fd_set *) NULL, (fd_set *) NULL, &timelimit); if ( (nready <= 0) && (errno == EINTR) ) goto againsel; else if (nready < 0) armci_die("armci_ListenAndAccept: error from select", nready); else if (nready == 0) armci_die("armci_ListenAndAccept: timeout waiting for connection", nready); if (!FD_ISSET(sock, &ready)) armci_die("armci_ListenAndAccept: out of select but not ready!", nready); againacc: msgsock = accept(sock, (struct sockaddr *) NULL, (soclen_t *) NULL); if (msgsock == -1) { if (errno == EINTR) goto againacc; else armci_die("armci_ListenAndAccept: accept failed", msgsock); } if (DEBUG_) { (void) printf("process %d out of accept on socket %d\n", armci_me,msgsock); (void) fflush(stdout); } /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ if(setsockopt(msgsock, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof size)) armci_die("armci_ListenAndAccept: error setting SO_RCVBUF", size); if(setsockopt(msgsock, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof size)) armci_die("armci_ListenAndAccept: error setting SO_SNDBUF", size); armci_TcpNoDelay(sock); (void) CLOSE(sock); /* will not be needing this again */ return msgsock; } #if !defined(SGI) && !defined(WIN32) struct hostent *gethostbyname(); #endif int armci_CreateSocketAndConnect(char *hostname, int port) /* Return the file descriptor of the socket which connects me to the remote process on hostname at port hostname = hostname of the remote process port = port number of remote socket */ { int sock, status; struct sockaddr_in server; struct hostent *hp; int on = 1; int trial; /* Create socket */ if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { (void) fprintf(stderr,"trying to connect to host=%s, port=%d\n", hostname, port); armci_die("armci_CreateSocketAndConnect: socket failed", sock); } /* the following can be disabled */ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) == -1) armci_die("armci_CreateSocketAndConnect: error setting REUSEADDR", -1); /* Connect socket */ server.sin_family = AF_INET; hp = gethostbyname(hostname); if (hp == 0) { (void) fprintf(stderr,"trying to connect to host=%s, port=%d\n", hostname, port); armci_die("armci_CreateSocketAndConnect: gethostbyname failed", 0); } bcopy((char *) hp->h_addr, (char *) &server.sin_addr, hp->h_length); server.sin_port = htons((unsigned short) port); trial = 0; againcon: if ((status = connect(sock, (struct sockaddr *) &server, sizeof server)) < 0) { if (errno == EINTR) goto againcon; else if(trial>CONNECT_TRIALS){ (void) fprintf(stderr,"%d:trying connect to host=%s, port=%d t=%d %d\n", armci_me,hostname, port,trial,errno); perror("trying to connect:"); armci_die("armci_CreateSocketAndConnect: connect failed", status); }else { trial++; sleep(1); goto againcon; } } /* Increase size of socket buffers to improve long message performance and increase size of message that goes asynchronously */ armci_tcp_get_sock_buf_size(sock); armci_TcpNoDelay(sock); return sock; } ga-5-4/armci/src/devices/sockets/sockets.h0000644000175000017500000000321212662210404016626 0ustar mbamba#ifndef SOCKETS_H_ #define SOCKETS_H_ #include "armci.h" #ifndef WIN32 #define USE_SOCKET_VECTOR_API #endif #if defined(USE_SOCKET_VECTOR_API) # include #endif extern int tcp_sendrcv_bufsize; extern int armci_PollSocket(int sock); extern int armci_WaitSock(int *socklist, int num, int *ready); extern int armci_ReadFromSocket(int sock, void* buffer, int lenbuf); extern int armci_WriteToSocket (int sock, void* buffer, int lenbuf); #if defined(USE_SOCKET_VECTOR_API) extern int armci_RecvStridedFromSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_SendStridedToSocket(int sock,void* buffer,int *str_arr,int *cnt,int str_level,struct iovec *iov); extern int armci_RecvVectorFromSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_SendVectorToSocket(int sock,armci_giov_t darr[], int len,struct iovec *iov); extern int armci_ReadVFromSocket(int sock,struct iovec *iov, int iovlength, int totalsize); extern int armci_WriteVToSocket (int sock,struct iovec *iov, int iovlength, int totalsize); #endif extern void armci_ListenSockAll(int* socklist, int num); extern void armci_AcceptSockAll(int* socklist, int num); extern int armci_CreateSocketAndConnect(char *hostname, int port); extern void armci_ShutdownAll(int socklist[], int num); extern void armci_CreateSocketAndBind(int *sock, int *port); #define PACKET_SIZE tcp_sendrcv_bufsize #define TIMEOUT_ACCEPT 60 #define GET_SEND_BUFFER _armci_buf_get_clear_busy #define FREE_SEND_BUFFER _armci_buf_release #ifndef UIO_MAXIOV #define MAX_IOVEC 8 #else #define MAX_IOVEC (UIO_MAXIOV>100?100:UIO_MAXIOV) #endif #endif ga-5-4/armci/src/devices/sockets/dataserv.c0000644000175000017500000006327412662210404016775 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: dataserv.c,v 1.30.8.5 2007-07-02 05:18:13 d3p687 Exp $ */ #include "armcip.h" #include "request.h" #include "copy.h" #if HAVE_STDIO_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_MATH_H # include #endif #define DEBUG_ 0 #define DEBUG1 0 #define USE_VECTOR_FORMAT_ 1 active_socks_t *_armci_active_socks; extern int AR_ready_sigchld; int *SRV_sock; int *AR_port; int *CLN_sock; char *msg="hello from server"; static int *readylist=(int*)0; #define GETBUF(buf,type,var) (var) = *(type*)(buf); (buf) += sizeof(type) #if defined(USE_SOCKET_VECTOR_API) int armci_RecvVectorFromSocket(int sock,armci_giov_t darr[], int len, struct iovec *iov){ int i,j=0,k,num_xmit=0,lastiovlength,iovlength,n=0,max_iovec,totalsize=0; int totaliovs=0,dim1=0,dim2=0; struct iovec *saveiov=iov; max_iovec = MAX_IOVEC; for(i=0;i1){ total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } } num_xmit = (total_of_2D*count[1])/max_iovec; lastiovlength = (total_of_2D*count[1])%max_iovec; if(num_xmit == 0) num_xmit = 1; else if(lastiovlength!=0)num_xmit++; k=0;vecind=0; if(lastiovlength!=0 && k==(num_xmit-1))iovlength=lastiovlength; else iovlength=max_iovec; for(i=0; i= count[j]) index[j] = 0; } dst1=dst; for(j=0;j1){ total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } } num_xmit = total_of_2D*count[1]/max_iovec; lastiovlength = (total_of_2D*count[1])%max_iovec; if(num_xmit == 0) num_xmit = 1; else if(lastiovlength!=0)num_xmit++; k=0;vecind=0; if(lastiovlength!=0 && k==(num_xmit-1))iovlength=lastiovlength; else iovlength=max_iovec; for(i=0; i= count[j]) index[j] = 0; } src1=src; for(j=0;joperation==GET) bufsize = msginfo->dscrlen+sizeof(request_header_t); if(msginfo->operation==PUT){ msginfo->datalen=0; msginfo->bytes=msginfo->dscrlen; bufsize=msginfo->dscrlen+sizeof(request_header_t); } armci_send_req(proc, msginfo, bufsize); if(msginfo->operation==PUT){ bytes=armci_SendVectorToSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } return(bytes); } int armci_direct_vector_get(request_header_t *msginfo , armci_giov_t darr[], int len, int proc) { return armci_RecvVectorFromSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } int armci_direct_vector(request_header_t *msginfo , armci_giov_t darr[], int len, int proc){ int bufsize=0,bytes=0,s; for(s=0; soperation==GET) bufsize = msginfo->dscrlen+sizeof(request_header_t); if(msginfo->operation==PUT){ msginfo->datalen=0; msginfo->bytes=msginfo->dscrlen; bufsize=msginfo->dscrlen+sizeof(request_header_t); } armci_send_req(proc, msginfo, bufsize); if(msginfo->operation==GET){ bytes=armci_RecvVectorFromSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } if(msginfo->operation==PUT){ bytes=armci_SendVectorToSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } return(bytes); } #endif /*\ client sends request message to server \*/ int armci_send_req_msg(int proc, void *buf, int bytes) { int cluster = armci_clus_id(proc); request_header_t* msginfo = (request_header_t*)buf; int idx, rc; THREAD_LOCK(armci_user_threads.net_lock); /* mark sockets as active (only if reply is expected?) */ idx = _armci_buf_to_index(msginfo); _armci_active_socks->socks[idx] = SRV_sock[cluster]; rc = (armci_WriteToSocket(SRV_sock[cluster], buf, bytes) < 0); THREAD_UNLOCK(armci_user_threads.net_lock); return rc; } void armci_write_strided_sock(void *ptr, int stride_levels, int stride_arr[], int count[], int fd) { int i, j, stat; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } /* memcpy(buf, ((char*)ptr)+idx, count[0]); */ /* buf += count[0]; */ stat = armci_WriteToSocket(fd, ((char*)ptr)+idx, count[0]); if(stat<0)armci_die("armci_write_strided_sock:write failed",stat); } } void armci_read_strided_sock(void *ptr, int stride_levels, int stride_arr[], int count[], int fd) { int i, j, stat; long idx; /* index offset of current block position to ptr */ int n1dim; /* number of 1 dim block */ int bvalue[MAX_STRIDE_LEVEL], bunit[MAX_STRIDE_LEVEL]; /* number of n-element of the first dimension */ n1dim = 1; for(i=1; i<=stride_levels; i++) n1dim *= count[i]; /* calculate the destination indices */ bvalue[0] = 0; bvalue[1] = 0; bunit[0] = 1; bunit[1] = 1; for(i=2; i<=stride_levels; i++) { bvalue[i] = 0; bunit[i] = bunit[i-1] * count[i-1]; } for(i=0; i (count[j]-1)) bvalue[j] = 0; } /* memcpy(buf, ((char*)ptr)+idx, count[0]); */ /* buf += count[0]; */ stat = armci_ReadFromSocket(fd, ((char*)ptr)+idx, count[0]); if(stat<0)armci_die("armci_read_strided_sock:read failed",stat); } } /*\ client sends strided data + request to server \*/ int armci_send_req_msg_strided(int proc, request_header_t *msginfo,char *ptr, int strides, int stride_arr[], int count[]) { int cluster = armci_clus_id(proc); int stat, bytes; if(DEBUG_){ printf("%d:armci_send_req_msg_strided: op=%d to=%d bytes= %d \n",armci_me, msginfo->operation,proc,msginfo->datalen); fflush(stdout); } /* we write header + data descriptor */ bytes = sizeof(request_header_t) + msginfo->dscrlen; THREAD_LOCK(armci_user_threads.net_lock); stat = armci_WriteToSocket(SRV_sock[cluster], msginfo, bytes); if(stat<0)armci_die("armci_send_strided:write failed",stat); #if defined(USE_SOCKET_VECTOR_API) if(msginfo->operation==PUT && msginfo->datalen==0) armci_SendStridedToSocket( SRV_sock[cluster],ptr,stride_arr,count, strides,(struct iovec *)(msginfo+1) ); else #endif /* for larger blocks write directly to socket thus avoiding memcopy */ armci_write_strided_sock(ptr, strides,stride_arr,count,SRV_sock[cluster]); THREAD_UNLOCK(armci_user_threads.net_lock); return 0; } char *armci_ReadFromDirect(int proc, request_header_t * msginfo, int len) { int cluster=armci_clus_id(proc); int stat; if(DEBUG_){ printf("%d:armci_ReadFromDirect: from %d \n",armci_me,proc); fflush(stdout); } stat =armci_ReadFromSocket(SRV_sock[cluster],msginfo+1,len); if(stat<0)armci_die("armci_rcv_data: read failed",stat); return(char*)(msginfo+1); } /*\ client receives strided data from server \*/ void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { int cluster=armci_clus_id(proc); if(DEBUG_){ printf("%d:armci_ReadStridedFromDirect: from %d \n",armci_me,proc); fflush(stdout); } #if defined(USE_SOCKET_VECTOR_API) if(msginfo->operation==GET && strides > 0) armci_RecvStridedFromSocket( SRV_sock[cluster],ptr,stride_arr,count, strides,(struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen)); else #endif armci_read_strided_sock(ptr, strides, stride_arr, count, SRV_sock[cluster]); } /*********************************** server side ***************************/ #if defined(USE_SOCKET_VECTOR_API) void armci_tcp_read_vector_data(request_header_t *msginfo,void *vdscr,int p){ int bytes,i,j,stat; void **ptr; char *dscr; long len; armci_giov_t *mydarr; bytes = msginfo->dscrlen; if(DEBUG1){ printf("\n in armci_tcp_read_vector_data reading bytes=%d infonext=%p\n", bytes,(void*)(msginfo+1));fflush(stdout); } stat = armci_ReadFromSocket(CLN_sock[p], (MessageRcvBuffer+sizeof(request_header_t)),bytes); if(stat<0)armci_die("armci_tcp_read_vector_data: read of data failed",stat); dscr=(MessageRcvBuffer+sizeof(request_header_t)); ptr=(void**)dscr; *(void**)vdscr=(void *)dscr; mydarr = (armci_giov_t *)(dscr+bytes); GETBUF(dscr, long ,len); if(len!=0){ for(i=0;idscrlen; if(DEBUG1){ printf("\n in armci tcp read strided data reading bytes=%d infonext=%p\n" ,bytes,(void*)(msginfo+1));fflush(stdout); } stat = armci_ReadFromSocket(CLN_sock[p], (MessageRcvBuffer+sizeof(request_header_t)),bytes); if(stat<0)armci_die("armci_tcp_read_strided_data:read of data failed",stat); dscr=(MessageRcvBuffer+sizeof(request_header_t)); *(void**)vdscr=(void *)dscr; ptr = *(void**)dscr; dscr += sizeof(void*); stride_levels = *(int*)dscr; dscr += sizeof(int); stride_arr = (int*)dscr; dscr += stride_levels*sizeof(int); count = (int*)dscr; dscr += (stride_levels+1)*sizeof(int); armci_RecvStridedFromSocket( CLN_sock[p],ptr,stride_arr,count,stride_levels, (struct iovec *)dscr); /*armci_RecvStridedFromSocket( CLN_sock[p],ptr,stride_arr,count, stride_levels,(struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) );*/ } #endif /*\ server receives request \*/ void armci_rcv_req(void *mesg, void *phdr, void *pdescr,void *pdata,int *buflen) { request_header_t *msginfo = (request_header_t*)MessageRcvBuffer; int hdrlen = sizeof(request_header_t); int stat, p = *(int*)mesg; int bytes; stat =armci_ReadFromSocket(CLN_sock[p],MessageRcvBuffer,hdrlen); if(stat<0) armci_die("armci_rcv_req: failed to receive header ",p); *(void**)phdr = msginfo; #if defined(USE_SOCKET_VECTOR_API) if(msginfo->operation == PUT && msginfo->datalen==0){ if(msginfo->format==STRIDED) armci_tcp_read_strided_data(msginfo,pdescr,p); if(msginfo->format==VECTOR){ armci_tcp_read_vector_data(msginfo,pdescr,p); } return; } #endif *buflen = MSG_BUFLEN - hdrlen; if (msginfo->operation == GET) bytes = msginfo->dscrlen; else{ bytes = msginfo->bytes; if(bytes >*buflen)armci_die2("armci_rcv_req: message overflowing rcv buf", msginfo->bytes,*buflen); } if(msginfo->bytes){ stat = armci_ReadFromSocket(CLN_sock[p],msginfo+1,bytes); if(stat<0)armci_die("armci_rcv_req: read of data failed",stat); *(void**)pdescr = msginfo+1; *(void**)pdata = msginfo->dscrlen + (char*)(msginfo+1); *buflen -= msginfo->dscrlen; if (msginfo->operation != GET) if(msginfo->datalen)*buflen -= msginfo->datalen; }else { *(void**)pdata = msginfo+1; *(void**)pdescr = NULL; } if(msginfo->datalen>0 && msginfo->operation != GET){ if(msginfo->datalen > ((int)MSG_BUFLEN) -((int)hdrlen) -msginfo->dscrlen) armci_die2("armci_rcv_req:data overflowing buffer", msginfo->dscrlen,msginfo->datalen); *buflen -= msginfo->datalen; } } /*\ send data back to client \*/ void armci_WriteToDirect(int to, request_header_t* msginfo, void *data) { int stat = armci_WriteToSocket(CLN_sock[to], data, msginfo->datalen); if(stat<0)armci_die("armci_WriteToDirect:write failed",stat); } /*\ server sends strided data back to client \*/ void armci_WriteStridedToDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]) { if(DEBUG_){ printf("%d:armci_WriteStridedToDirect:from %d\n",armci_me,proc); fflush(stdout); } #if defined(USE_SOCKET_VECTOR_API) if(msginfo->operation==GET && strides>0) armci_SendStridedToSocket(CLN_sock[proc],ptr,stride_arr,count,strides, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ) ; else #endif armci_write_strided_sock(ptr, strides, stride_arr, count, CLN_sock[proc]); } /*\ server writes data to socket associated with process "to" \*/ void armci_sock_send(int to, void* data, int len) { int stat = armci_WriteToSocket(CLN_sock[to], data, len); if(stat<0)armci_die("armci_sock_send:write failed",stat); } /*\ close all open sockets, called before terminating/aborting \*/ void armci_transport_cleanup() { if(SERVER_CONTEXT){ if(readylist)free(readylist); armci_ShutdownAll(CLN_sock,armci_nproc); /*server */ }else armci_ShutdownAll(SRV_sock,armci_nclus); /*client */ } /*\ main routine for data server process in a cluster environment * the process is blocked (in select) until message arrives from * the clients and services the requests \*/ void armci_call_data_server() { int nready; int up=1; readylist = (int*)calloc(sizeof(int),armci_nproc); if(!readylist)armci_die("armci_data_server:could not allocate readylist",0); if(DEBUG_){ printf("%d server waiting for request\n",armci_me); fflush(stdout); sleep(1); } /* server main loop; wait for and service requests until QUIT requested */ for(;;){ int i, p; nready = armci_WaitSock(CLN_sock, armci_nproc, readylist); for(i = 0; i < armci_nproc; i++){ p = (up) ? i : armci_nproc -1 -i; if(!readylist[p])continue; armci_data_server(&p); nready--; if(nready==0) break; /* all sockets read */ } /* fairness attempt: each time process the list in a different direction*/ up = 1- up; /* switch directions for the next round */ if(nready) armci_die("armci_dataserv:readylist not consistent with nready",nready); } } extern int tcp_sendrcv_bufsize; void armci_determine_sock_buf_size(){ if(armci_nclus<=8)return; if(armci_nclus>=128){tcp_sendrcv_bufsize = 32768;return;} tcp_sendrcv_bufsize =(int)pow(2,(22-(int)(log(armci_nclus)/log(2)))); return; } /*\ Create Sockets for clients and servers \*/ void armci_init_connections() { int i,n,p,master = armci_clus_info[armci_clus_me].master; _armci_buf_init(); /* sockets for communication with data server */ SRV_sock = (int*) malloc(sizeof(int)*armci_nclus); if(!SRV_sock)armci_die("ARMCI cannot allocate SRV_sock",armci_nclus); /* array that will be used to exchange port info */ AR_port = (int*) calloc(armci_nproc * armci_nclus, sizeof(int)); if(!AR_port)armci_die("ARMCI cannot allocate AR_port",armci_nproc*armci_nclus); /* create active sockets list select */ if (!(_armci_active_socks = malloc(sizeof(active_socks_t)))) armci_die("dataserv.c, malloc _armci_active_socks failed",0); for(i=0,n=MAX_BUFS+MAX_SMALL_BUFS;isocks[i]=-1; /* create sockets for communication with each user process */ if(master==armci_me){ CLN_sock = (int*) malloc(sizeof(int)*armci_nproc); if(!CLN_sock)armci_die("ARMCI cannot allocate CLN_sock",armci_nproc); armci_determine_sock_buf_size(); for(p=0; p< armci_nproc; p++){ int off_port = armci_clus_me*armci_nproc; # ifdef SERVER_THREAD if(p >=armci_clus_first && p <= armci_clus_last) CLN_sock[p]=-1; else # endif armci_CreateSocketAndBind(CLN_sock + p, AR_port + p +off_port); } #ifdef SERVER_THREAD /* skip sockets associated with processes on the current node */ if(armci_clus_first>0) armci_ListenSockAll(CLN_sock, armci_clus_first); if(armci_clus_last< armci_nproc-1) armci_ListenSockAll(CLN_sock + armci_clus_last+1, armci_nproc-armci_clus_last-1); #else armci_ListenSockAll(CLN_sock, armci_nproc); #endif } } void armci_wait_for_server() { if(armci_me == armci_master){ #ifndef SERVER_THREAD RestoreSigChldDfl(); armci_serv_quit(); armci_wait_server_process(); #endif } } void armci_client_connect_to_servers() { int stat,c, nall; char str[100]; #ifndef SERVER_THREAD int p; /* master has to close all sockets -- they are used by server PROCESS */ if(armci_master==armci_me)for(p=0; p< armci_nproc; p++){ close(CLN_sock[p]); } #endif /* exchange port numbers with processes in all cluster nodes * save number of messages by using global sum -only masters contribute */ nall = armci_nclus*armci_nproc; armci_msg_igop(AR_port,nall,"+"); /*using port number create socket & connect to data server in each clus node*/ for(c=0; c< armci_nclus; c++){ int off_port = c*armci_nproc; #ifdef SERVER_THREAD /*no intra node socket connection with server thread*/ if(c == armci_clus_me) SRV_sock[c]=-1; else #endif SRV_sock[c] = armci_CreateSocketAndConnect(armci_clus_info[c].hostname, AR_port[off_port + armci_me]); if(DEBUG_ && SRV_sock[c]!=-1){ printf("%d: client connected to %s:%d\n",armci_me, armci_clus_info[c].hostname, AR_port[off_port + armci_me]); fflush(stdout); } } if(DEBUG_){ bzero(str,99); for(c=0; c< armci_nclus; c++)if(SRV_sock[c]!=-1){ stat =armci_ReadFromSocket(SRV_sock[c],str, sizeof(msg)+1); if(stat<0)armci_die("read failed",stat); printf("in client %d message was=%s from%d\n",armci_me,str,c); fflush(stdout); } } free(AR_port); /* we do not need the port numbers anymore */ } /*\ establish connections with compute processes \*/ void armci_server_initial_connection() { #ifdef SERVER_THREAD if(armci_clus_first>0) armci_AcceptSockAll(CLN_sock, armci_clus_first); if(armci_clus_last< armci_nproc-1) armci_AcceptSockAll(CLN_sock + armci_clus_last+1, armci_nproc-armci_clus_last-1); #else armci_AcceptSockAll(CLN_sock, armci_nproc); #endif if(DEBUG_){ int stat, p; printf("%d: server connected to all clients\n",armci_me); fflush(stdout); sleep(1); for(p=0; p #ifdef LAPI_ERR_BAD_NINTH_PARM #define LAPI2 #endif #define COMPLETE_HANDLE _armci_buf_complete_nb_request #define TEST_HANDLE _armci_buf_test_nb_request #define NB_CMPL_T lapi_cmpl_t extern lapi_handle_t lapi_handle; extern int lapi_max_uhdr_data_sz; /* max data payload in AM header */ typedef struct{ lapi_cntr_t cntr; /* counter to trace completion of stores */ int val; /* number of pending LAPI store ops */ int oper; /* code for last ARMCI store operation */ }lapi_cmpl_t; typedef struct{ /* generalized pointer to buffer */ void *cntr; void *buf; }gp_buf_t; typedef struct{ void *buf; lapi_cntr_t *cntr; }msg_tag_t; #ifdef LAPI_RDMA typedef struct region_memhdl{ void *start; lapi_user_pvo_t pvo; } region_memhdl_t; #define HAS_RDMA_GET #define REGIONS_REQUIRE_MEMHDL #define ARMCI_MEMHDL_T region_memhdl_t extern void armci_client_direct_send(int p, void *src_buf, void *dst_buf, int len, void** contextptr, int nbtag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl); /* LAPI RDMA */ #endif /* LAPI_RDMA */ extern lapi_cmpl_t *cmpl_arr; /* completion state array, dim=NPROC */ extern lapi_cmpl_t *ack_cntr; /* ACK counter used in handshaking protocols between origin and target */ extern lapi_cmpl_t buf_cntr; /* AM data buffer counter */ extern lapi_cmpl_t *get_cntr; /* lapi_get counter */ extern lapi_cmpl_t hdr_cntr; /* AM header buffer counter */ extern int intr_status; extern void armci_init_lapi(void); /* initialize LAPI data structures*/ extern void armci_term_lapi(void); /* destroy LAPI data structures */ extern void armci_lapi_send(msg_tag_t, void*, int, int); /* LAPI send */ #define BUF_EXTRA_FIELD_T lapi_cmpl_t #define EXTRA_MSG_BUFLEN_DBL (sizeof(lapi_cmpl_t)>>3) #define MAX_CHUNKS_SHORT_GET 9 #define SHORT_ACC_THRESHOLD (6 * lapi_max_uhdr_data_sz) #define SHORT_PUT_THRESHOLD (6 * lapi_max_uhdr_data_sz) #define LONG_PUT_THRESHOLD 128 #define LONG_GET_THRESHOLD 4000 #define LONG_GET_THRESHOLD_STRIDED LONG_GET_THRESHOLD #define PACKPUT 8 #define MSG_BUFLEN_DBL 30000 #define INTR_ON if(intr_status==1)LAPI_Senv(lapi_handle, INTERRUPT_SET, 1) #define INTR_OFF {\ LAPI_Qenv(lapi_handle, INTERRUPT_SET, &intr_status);\ LAPI_Senv(lapi_handle, INTERRUPT_SET, 0);\ } /**** macros to control LAPI modes and ordering of operations ****/ #define TEST_COUNTER(counter,_ret_) if((counter).val){\ int _val__;\ if(LAPI_Getcntr(lapi_handle,&(counter).cntr,&_val__))\ armci_die("LAPI_Getcntr failed",-1);\ if(_val__ != (counter).val) *(_ret_)=1;\ }else *(_ret_)=1; #define WAIT_COUNTER(counter) if((counter).val)\ for(;;){\ int _val__;\ if(LAPI_Getcntr(lapi_handle,&(counter).cntr,&_val__))\ armci_die("LAPI_Getcntr failed",-1);\ if(_val__ == (counter).val) break;\ LAPI_Probe(lapi_handle);\ } #define CLEAR_COUNTER(counter) if((counter).val) {\ int _val_;\ if(LAPI_Waitcntr(lapi_handle,&(counter).cntr, (counter).val, &_val_))\ armci_die("LAPI_Waitcntr failed",-1);\ if(_val_ != 0) armci_die("CLEAR_COUNTER: nonzero in file ", _val_);\ (counter).val = 0; \ } #define INIT_COUNTER(counter,_val) {\ int _rc = LAPI_Setcntr(lapi_handle, &(counter).cntr, 0);\ if(_rc)armci_die("INIT_COUNTER:setcntr failed ", _rc);\ (counter).val = (_val);\ } #define SET_COUNTER(counter, value) (counter).val += (value) #define INIT_SEND_BUF(_cntr,_snd,_rcv) INIT_COUNTER(_cntr,1) #define CLEAR_SEND_BUF_FIELD(_cntr, _s, _r,_t,_o) CLEAR_COUNTER(_cntr) #define TEST_SEND_BUF_FIELD(_cntr, _s, _r,_t,_o,_ret) TEST_COUNTER(_cntr,(_ret)) #define FIRST_INIT_SEND_BUF INIT_COUNTER #define SET_BUF_TAG _armci_buf_set_tag #define INIT_SENDBUF_INFO(_hdl,_buf,_op,_proc) \ _armci_buf_set_tag(_buf,(_hdl)->tag,0) #define FENCE_NODE(p) CLEAR_COUNTER(cmpl_arr[(p)]) #define UPDATE_FENCE_STATE(p, opcode, nissued)\ {/* if((opcode)==0)armci_die("op code 0 - buffer overwritten?",(p));*/\ cmpl_arr[(p)].val += (nissued);\ cmpl_arr[(p)].oper = (opcode);\ } #define PENDING_OPER(p) cmpl_arr[(p)].oper #define WAIT_FOR_GETS CLEAR_COUNTER(get_cntr[ARMCI_THREAD_IDX]) #define WAIT_FOR_PUTS CLEAR_COUNTER(ack_cntr[ARMCI_THREAD_IDX]) #endif ga-5-4/armci/src/devices/lapi/lapi.c0000644000175000017500000005767612662210402015372 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* initialization of data structures and setup of lapi internal parameters */ #include #if HAVE_STDIO_H # include #endif #if HAVE_STRINGS_H # include #endif #include "lapidefs.h" #include "armcip.h" #include "copy.h" #ifdef AIX #include #endif #if (defined(PPC) || defined(__PPC__) || defined(__PPC)) # include "asm-ppc.h" #endif #define DEBUG_ 0 #define ERROR(str,val) armci_die((str),(val)) #define BUF_TO_EVBUF(buf) ((lapi_cmpl_t*)(((char*)buf) - sizeof(lapi_cmpl_t))) char err_msg_buf[LAPI_MAX_ERR_STRING]; /* for error msg returned by LAPI */ /* ** macro to check return code of function calls. keeps return ** code checking logic from needing to be in main logic */ #define CHECK(func_and_args) \ { \ int rc; \ if ((rc = (func_and_args)) != LAPI_SUCCESS) { \ LAPI_Msg_string(rc, err_msg_buf); \ fprintf(stderr, \ "LAPI ERROR: %s, rc = %d\n", err_msg_buf, rc); \ armci_die("LAPI Error", 0); \ } \ } #if ARMCI_ENABLE_GPC_CALLS extern gpc_buf_t *gpc_req; #endif int lapi_max_uhdr_data_sz; /* max data payload */ lapi_cmpl_t *cmpl_arr; /* completion state array, dim=NPROC */ lapi_cmpl_t hdr_cntr; /* AM header buffer counter */ lapi_cmpl_t buf_cntr; /* AM data buffer counter */ lapi_cmpl_t* ack_cntr; /* ACK counter used in handshaking protocols between origin and target */ lapi_cmpl_t* get_cntr; /* counter used with lapi_get */ lapi_user_cxt_t *lapi_remote_cxt; /* Remote context for RDMA call */ int intr_status; lapi_info_t lapi_info; #ifndef TCGMSG lapi_handle_t lapi_handle; #endif pthread_mutex_t _armci_mutex_thread=PTHREAD_MUTEX_INITIALIZER; double _armci_rcv_buf[MSG_BUFLEN_DBL]; char* MessageRcvBuffer = (char*)_armci_rcv_buf; char* MessageSndBuffer = (char*)0; extern void armci_waitsome(int factor); /************* LAPI Active Message handlers *******************************/ volatile static int hndlcnt=0, header_cnt=0; static int hhnum=0; static long num_malloc=0; /* trace and limit the number malloc calls in HH */ #define MAX_NUM_MALLOC 100 /* trace state of accumulate lock */ int kevin_ok=1; /* "1" indicates that no other thread is holding the lock */ void armci_completion_handler(lapi_handle_t *t_hndl, void *save) { lapi_handle_t hndl = *t_hndl; int need_data; void *message; int whofrom, msglen; request_header_t *msginfo = (request_header_t *)save; char *descr= (char*)(msginfo+1), *buf=MessageRcvBuffer; int buflen=MSG_BUFLEN; #if ARMCI_ENABLE_GPC_CALLS extern pthread_t data_server; data_server = pthread_self(); #endif if(DEBUG_) fprintf(stderr,"%d:CH:op=%d from=%d datalen=%d dscrlen=%d\n", armci_me, msginfo->operation, msginfo->from,msginfo->datalen,msginfo->dscrlen); /*** assure that descriptor and data are in the right format and place ***/ if( msginfo->dscrlen < 0 || msginfo->datalen <0 ){ /* for large put/acc/scatter need to get the data */ int rc; lapi_cntr_t req_cntr; int bytes=0; char *origin_ptr = msginfo->tag.buf; if (msginfo->dscrlen<0) { descr =MessageRcvBuffer; msginfo->dscrlen = -msginfo->dscrlen; buf = descr + msginfo->dscrlen; buflen += msginfo->dscrlen; bytes += msginfo->dscrlen; } if (msginfo->datalen <0){ msginfo->datalen = -msginfo->datalen; bytes += msginfo->datalen; } if(rc=LAPI_Setcntr(hndl, &req_cntr, 0)) ERROR("CH:setcntr failed",rc); if(rc=LAPI_Get(hndl, (uint)msginfo->from, bytes, origin_ptr, MessageRcvBuffer, msginfo->tag.cntr,&req_cntr))ERROR("CH:LAPI_Get failed",rc); if(rc=LAPI_Waitcntr(hndl, &req_cntr,1,NULL))ERROR("CH:Waitcntr failed",rc); } else{ /* desc is in save, data could be but not for GET */ if(msginfo->operation !=GET)buf = descr + msginfo->dscrlen; buflen = MSG_BUFLEN; } /* fprintf(stderr,"CH: val=%lf\n",*(double*)(buf+msginfo->datalen -8));*/ /*** dispatch request to the appropriate handler function ***/ switch(msginfo->operation){ case LOCK: armci_server_lock(msginfo); break; case UNLOCK: armci_server_unlock(msginfo, descr); break; default: if(msginfo->format == STRIDED) armci_server(msginfo, descr, buf, buflen); else armci_server_vector(msginfo, descr, buf, buflen); } free(msginfo); #ifdef LINUX (void)fetch_and_add(&num_malloc, (long)-1); #else (void)fetch_and_addlp(&num_malloc, (long)-1); #endif } void* armci_header_handler(lapi_handle_t *t_hndl, void *uhdr, uint *t_uhdrlen, uint *msglen, compl_hndlr_t **handler, void** psave) { lapi_handle_t hndl = *t_hndl; uint uhdrlen = *t_uhdrlen; request_header_t *msginfo = (request_header_t *)uhdr; if(DEBUG_) fprintf(stderr,"%d:HH: op=%d from %d\n",armci_me,msginfo->operation, msginfo->from); if(msginfo->to != armci_me) armci_die("wrong message delivered",msginfo->to); /* process small requests that do not require comms in header handler */ if(msginfo->datalen >0 && msginfo->dscrlen>0 && msginfo->operation != GET && msginfo->operation != LOCK && msginfo->operation != UNLOCK){ /* If another thread is in accumulate use compl. handler path: * Try to avoid blocking inside HH which degrades Lapi performance. * The completion handler path requires malloc to save request info. * Only up to approx. MAX_NUM_MALLOC requests can be rescheduled to * run in CH instead of HH. * MAX_NUM_MALLOC is a soft limit to avoid cost of locking when reading */ if( msginfo->operation==PUT || num_malloc>MAX_NUM_MALLOC || kevin_ok){ char *descr = (char*)(msginfo+1); char *buf = descr + msginfo->dscrlen; int buflen = uhdrlen - sizeof(request_header_t) - msginfo->dscrlen; if(DEBUG_) fprintf(stderr,"%d:HH: buf =%lf\n",armci_me,*(double*)buf); if(msginfo->format == STRIDED) armci_server(msginfo, descr, buf, buflen); else armci_server_vector(msginfo, descr, buf, buflen); /* fprintf(stderr,"%d:HH: getting out of server\n",armci_me);*/ *psave = NULL; *handler = NULL; return(NULL); } } #ifdef LINUX (void)fetch_and_add(&num_malloc, (long)1); #else (void)fetch_and_addlp(&num_malloc, (long)1); /* AIX atomic increment */ #endif msginfo = (request_header_t*) malloc(uhdrlen); /* recycle pointer */ if(!msginfo) ERROR("HH: malloc failed in header handler",num_malloc); /* save the request info for processing in compl. handler */ memcpy((char*)msginfo, uhdr, uhdrlen); *psave = msginfo; *handler = armci_completion_handler; return(NULL); } void armci_send_req(int proc, request_header_t* msginfo, int len) { int msglen = sizeof(request_header_t); lapi_cntr_t *pcmpl_cntr, *pcntr = &(BUF_TO_EVBUF(msginfo)->cntr); int rc; msginfo->tag.cntr= pcntr; #if ARMCI_ENABLE_GPC_CALLS if(msginfo->operation==GET && msginfo->format==VECTOR && msginfo->ehlen){ msginfo->tag.buf = (char *)(msginfo+1)+msginfo->dscrlen; } else #endif msginfo->tag.buf = msginfo+1; if(msginfo->operation==GET || msginfo->operation==LOCK){ SET_COUNTER(*(lapi_cmpl_t*)pcntr,1);/*dataarrive in same buf*/ /*The GPC case. Note that we don't use the parameter len*/ if(msginfo->format==VECTOR && msginfo->ehlen > 0) msglen += msginfo->datalen; if(lapi_max_uhdr_data_sz < msginfo->dscrlen){ msginfo->dscrlen = -msginfo->dscrlen; /* no room for descriptor */ pcntr = NULL; /* GET(descr) from CH will increment buf cntr */ }else msglen += msginfo->dscrlen; /* we should send the mutex, too. When op==LOCK, Value of len parameter is already sizeof(reqest_header_t)+sizeof(int), since we dont use len but construct our own msglen, we need to add sizeof(int). */ if(msginfo->operation==LOCK) msglen += sizeof(int); pcmpl_cntr=NULL; /* don't trace completion status for load ops */ }else if (msginfo->operation==UNLOCK){ msglen += msginfo->dscrlen; pcmpl_cntr=NULL; /* don't trace completion status for unlock */ }else{ if(lapi_max_uhdr_data_sz < (msginfo->datalen + msginfo->dscrlen)){ msginfo->datalen = -msginfo->datalen; msginfo->dscrlen = -msginfo->dscrlen; pcntr = NULL; /* GET/LOCK from CH will increment buf cntr */ }else msglen += msginfo->dscrlen+msginfo->datalen; /* trace completion of store ops */ pcmpl_cntr = &cmpl_arr[msginfo->to].cntr; } if(msginfo->operation==PUT || ARMCI_ACC(msginfo->operation)) UPDATE_FENCE_STATE(msginfo->to, msginfo->operation, 1); if((rc=LAPI_Amsend(lapi_handle,(uint)msginfo->to, (void*)armci_header_handler, msginfo, msglen, NULL, 0, NULL, pcntr, pcmpl_cntr))) armci_die("AM failed",rc); if(DEBUG_) fprintf(stderr,"%d sending req=%d to %d\n", armci_me, msginfo->operation, proc); } /*\ client sends strided data + request to server \*/ void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { armci_write_strided(ptr, strides, stride_arr, count, bdata); armci_send_req(proc,msginfo,msginfo->bytes + sizeof(request_header_t)); } /*\ server sends data back to client \*/ void armci_send_data(request_header_t* msginfo, void *data) { armci_lapi_send(msginfo->tag, data, msginfo->datalen, msginfo->from); } /*\ server sends strided data back to client \*/ void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { armci_write_strided(ptr, strides, stride_arr, count, bdata); armci_lapi_send(msginfo->tag, bdata, msginfo->datalen, msginfo->from); } char* armci_rcv_data(int proc, request_header_t *msginfo) { lapi_cmpl_t *pcntr=BUF_TO_EVBUF(msginfo); CLEAR_COUNTER((*pcntr)); #if ARMCI_ENABLE_GPC_CALLS if(msginfo->operation==GET && msginfo->format==VECTOR && msginfo->ehlen){ return((char *)(msginfo+1)+msginfo->dscrlen); } else #endif return (char*)(msginfo+1); } /*\ client receives strided data from server \*/ void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides, int stride_arr[], int count[]) { lapi_cmpl_t *pcntr=BUF_TO_EVBUF(msginfo); CLEAR_COUNTER((*pcntr)); armci_read_strided(ptr, strides, stride_arr, count, (char*)(msginfo+1)); } /*\ client receives vector data from server to buffer and unpacks it \*/ void armci_rcv_vector_data(int proc, request_header_t* msginfo, armci_giov_t darr[], int len) { char *buf; buf = armci_rcv_data(proc,msginfo); armci_vector_from_buf(darr, len, buf); } /*\ initialization of LAPI related data structures \*/ void armci_init_lapi() { int rc, p; int lapi_max_uhdr_sz; lapi_cmpl_t *pcntr; lapi_remote_cxt_t util_cxt; /* For call to obtain rCxt */ #ifndef TCGMSG rc = LAPI_Init(&lapi_handle, &lapi_info); if(rc) ERROR("lapi_init failed",rc); #endif /* set the max limit for AM header data length */ rc = LAPI_Qenv(lapi_handle,MAX_UHDR_SZ, &lapi_max_uhdr_sz); if(rc) ERROR("armci_init_lapi: LAPI_Qenv failed", rc); /* fprintf(stderr,"max header size = %d\n",lapi_max_uhdr_sz);*/ /* how much data can fit into AM header ? */ lapi_max_uhdr_data_sz = lapi_max_uhdr_sz - sizeof(request_header_t); /* allocate memory for completion state array */ cmpl_arr = (lapi_cmpl_t*)malloc(armci_nproc*sizeof(lapi_cmpl_t)); if(cmpl_arr==NULL) ERROR("armci_init_lapi:malloc for cmpl_arr failed",0); /* allocate memory for ack and get counters, 1 if not thread safe */ #ifdef THREAD_SAFE ack_cntr = calloc(armci_user_threads.max, sizeof(lapi_cmpl_t)); get_cntr = calloc(armci_user_threads.max, sizeof(lapi_cmpl_t)); #else ack_cntr = calloc(1, sizeof(lapi_cmpl_t)); get_cntr = calloc(1, sizeof(lapi_cmpl_t)); #endif if (!(ack_cntr && get_cntr)) ERROR("armci_init_lapi:calloc for ack or get counters failed",0); /* initialize completion state array */ for(p = 0; p< armci_nproc; p++){ rc = LAPI_Setcntr(lapi_handle, &cmpl_arr[p].cntr, 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (arr)",rc); cmpl_arr[p].oper = -1; cmpl_arr[p].val = 0; } /* initialize ack/buf/hdr counters */ #ifdef THREAD_SAFE # define N armci_user_threads.max #else # define N 1 #endif for (p = 0; p < N; p++) { rc = LAPI_Setcntr(lapi_handle, &(ack_cntr[p].cntr), 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (ack)",rc); ack_cntr[p].val = 0; rc = LAPI_Setcntr(lapi_handle, &(get_cntr[p].cntr), 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (get)",rc); get_cntr[p].val = 0; } rc = LAPI_Setcntr(lapi_handle, &hdr_cntr.cntr, 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (hdr)",rc); hdr_cntr.val = 0; rc = LAPI_Setcntr(lapi_handle, &buf_cntr.cntr, 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (buf)",rc); buf_cntr.val = 0; #if 0 pcntr = (lapi_cmpl_t*)MessageSndBuffer; rc = LAPI_Setcntr(lapi_handle, &pcntr->cntr, 0); if(rc) ERROR("armci_init_lapi: LAPI_Setcntr failed (bufcntr)",rc); pcntr->val = 0; #endif #ifdef LAPI_RDMA /* allocate rCxt */ lapi_remote_cxt = (lapi_user_cxt_t*)malloc(armci_nproc * sizeof(lapi_user_cxt_t)); if(lapi_remote_cxt==NULL) ERROR("armci_init_lapi: rCxt malloc failed",0); /* obtain remote context "rCxt" for RDMA Operation of all procs */ for(p = 0; p< armci_nproc; p++){ if(p==armci_me) continue; util_cxt.Util_type = LAPI_REMOTE_RCXT; util_cxt.operation = LAPI_RDMA_ACQUIRE; util_cxt.dest = p; CHECK(LAPI_Util(lapi_handle, (lapi_util_t *) &util_cxt)); lapi_remote_cxt[p] = util_cxt.usr_rcxt; } #endif #if !defined(LAPI2) /* for high performance, disable LAPI internal error checking */ LAPI_Senv(lapi_handle, ERROR_CHK, 0); #endif /* make sure that interrupt mode is on */ LAPI_Senv(lapi_handle, INTERRUPT_SET, 1); /* initialize buffer managment module */ _armci_buf_init(); #ifdef LAPI_RDMA CHECK((LAPI_Gfence(lapi_handle))); #endif #if ARMCI_ENABLE_GPC_CALLS gpc_req = (gpc_buf_t *)malloc(sizeof(gpc_buf_t)*MAX_GPC_REQ); if(gpc_req==NULL)armci_die("malloc for gpc failed",sizeof(gpc_buf_t)); gpc_init(); #endif } void armci_term_lapi() { int p; lapi_remote_cxt_t util_cxt; /* For call to obtain rCxt */ #ifdef LAPI_RDMA CHECK((LAPI_Gfence(lapi_handle))); /* release remote context "rCxt" for RDMA Operation of all procs */ for(p = 0; p< armci_nproc; p++){ if(p==armci_me) continue; util_cxt.Util_type = LAPI_REMOTE_RCXT; util_cxt.operation = LAPI_RDMA_RELEASE; util_cxt.dest = p; util_cxt.usr_rcxt = lapi_remote_cxt[p]; CHECK(LAPI_Util(lapi_handle, (lapi_util_t *) &util_cxt)); } free(lapi_remote_cxt); #endif #ifndef TCGMSG CHECK((LAPI_Term(lapi_handle))); /* terminate the LAPI handle */ #endif free(cmpl_arr); free(ack_cntr); free(get_cntr); } /* primitive pseudo message-passing on top of lapi */ /* send data to remote process using p specified message tag */ /* tag contains address of receive buffer guarded by cntr at process p */ void armci_lapi_send(msg_tag_t tag, void* data, int len, int p) { int rc; lapi_cntr_t org_cntr; void *buf = tag.buf; lapi_cntr_t *cntr = tag.cntr; if(!buf)ERROR("armci_lapi_send: NULL tag(buf) error",0); if(!cntr)ERROR("armci_lapi_send: NULL tag(cntr) error",0); rc=LAPI_Setcntr(lapi_handle, &org_cntr, 0); if(rc) ERROR("armci_lapi_send:setcntr failed",rc); rc=LAPI_Put(lapi_handle, (uint)p, (uint)len, buf, data, cntr, &org_cntr, NULL); if(rc) ERROR("armci_lapi_send:put failed",rc); rc+=LAPI_Waitcntr(lapi_handle, &org_cntr, 1, NULL); if(rc) ERROR("armci_lapi_send:waitcntr failed",rc); } /* subroutine versions of macros disabling and enabling interrupts */ void intr_off_() { INTR_OFF; } void intr_on_() { INTR_ON; } void print_counters_() { int i; printf("bufcntr: val =%d cntr=%d\n", buf_cntr.val, buf_cntr.cntr); for(i=0; i< armci_nproc;i++){ printf("cmpl_arr: val=%d cntr=%d oper=%d\n",cmpl_arr[i].val, cmpl_arr[i].cntr, cmpl_arr[i].oper); } fflush(stdout); } #ifdef LAPI_RDMA /* LAPI Put RDMA */ void armci_client_direct_send(int p, void *src_buf, void *dst_buf, int len, void** contextptr, int nbtag, ARMCI_MEMHDL_T *lochdl,ARMCI_MEMHDL_T *remhdl) { lapi_xfer_t xfer_struct; /* Data structure for the xfer call */ lapi_rdma_tag_t lapi_rdma_tag; /* RDMA notification tag */ uint src_offset, tgt_offset; int val, rc; /* can be any number that fits in ushort */ lapi_rdma_tag = 22; /* CHECK: offset problem. what if client and server attached (shmat) at diff address */ src_offset = (char *)src_buf- (char *)lochdl->start; tgt_offset = (char *)dst_buf - (char *)remhdl->start; #if DEBUG_ printf("%d: Doing LAPI_Xfer (RDMA Put): dst=%d srchdl_start=%p remhdl_start=%p (bytes=%ld src_off=%d tgt_off=%d)\n", armci_me, p, lochdl->start, remhdl->start, len, src_offset, tgt_offset); fflush(stdout); #endif bzero(&xfer_struct, sizeof(xfer_struct)); xfer_struct.HwXfer.Xfer_type = LAPI_RDMA_XFER; xfer_struct.HwXfer.tgt = p; /*xfer_struct.HwXfer.op = LAPI_RDMA_PUT|LAPI_RCNTR_UPDATE;*/ xfer_struct.HwXfer.op = LAPI_RDMA_PUT; xfer_struct.HwXfer.rdma_tag = lapi_rdma_tag; xfer_struct.HwXfer.remote_cxt = lapi_remote_cxt[p]; xfer_struct.HwXfer.src_pvo = lochdl->pvo; xfer_struct.HwXfer.tgt_pvo = remhdl->pvo; xfer_struct.HwXfer.src_offset = src_offset; xfer_struct.HwXfer.tgt_offset = tgt_offset; xfer_struct.HwXfer.len = (ulong) (len); xfer_struct.HwXfer.shdlr = (scompl_hndlr_t *) NULL; xfer_struct.HwXfer.sinfo = (void *) NULL; xfer_struct.HwXfer.org_cntr = &(ack_cntr->cntr); /* Initiate RDMA Xfer */ if((rc = LAPI_Xfer(lapi_handle, &xfer_struct)) != LAPI_SUCCESS) { LAPI_Msg_string(rc, err_msg_buf); fprintf(stderr, "LAPI ERROR: %s, rc = %d\n", err_msg_buf, rc); armci_die("LAPI_Xfer (RDMA Put) failed", 0); } /* wait for RDMA completion */ rc = LAPI_Waitcntr(lapi_handle, &(ack_cntr->cntr),1,&val); if(rc != LAPI_SUCCESS) { LAPI_Msg_string(rc, err_msg_buf); fprintf(stderr, "LAPI ERROR: %s, rc = %d\n", err_msg_buf, rc); armci_die("LAPI_Waitcntr (RDMA Put) failed", 0); } /* CHECK((LAPI_Fence(lapi_handle))); */ #if DEBUG_ printf("%d: Completed LAPI_Xfer RDMA (Put): dst=%d\n", armci_me, p); #endif } /* LAPI Get RDMA */ void armci_client_direct_get(int p, void *src_buf, void *dst_buf, int len, void** cptr, int nbtag, ARMCI_MEMHDL_T *lochdl, ARMCI_MEMHDL_T *remhdl) { lapi_xfer_t xfer_struct; /* Data structure for the xfer call */ lapi_rdma_tag_t lapi_rdma_tag; /* RDMA notification tag */ uint src_offset, tgt_offset; int val, rc; /* can be any number that fits in ushort */ lapi_rdma_tag = 21; /* CHECK: offset problem. what if client and server attached (shmat) at diff address */ src_offset = (char *)dst_buf- (char *)lochdl->start; tgt_offset = (char *)src_buf - (char *)remhdl->start; #if DEBUG_ printf("%d: Doing LAPI_Xfer (RDMA Get): dst=%d srchdl_start=%p remhdl_start=%p (bytes=%ld src_off=%d tgt_off=%d)\n", armci_me, p, lochdl->start, remhdl->start, len, src_offset, tgt_offset); fflush(stdout); #endif bzero(&xfer_struct, sizeof(xfer_struct)); xfer_struct.HwXfer.Xfer_type = LAPI_RDMA_XFER; xfer_struct.HwXfer.tgt = p; /*xfer_struct.HwXfer.op = LAPI_RDMA_GET|LAPI_RCNTR_UPDATE;*/ xfer_struct.HwXfer.op = LAPI_RDMA_GET; xfer_struct.HwXfer.rdma_tag = lapi_rdma_tag; xfer_struct.HwXfer.remote_cxt = lapi_remote_cxt[p]; xfer_struct.HwXfer.src_pvo = lochdl->pvo; xfer_struct.HwXfer.tgt_pvo = remhdl->pvo; xfer_struct.HwXfer.src_offset = src_offset; xfer_struct.HwXfer.tgt_offset = tgt_offset; xfer_struct.HwXfer.len = (ulong) (len); xfer_struct.HwXfer.shdlr = (scompl_hndlr_t *) NULL; xfer_struct.HwXfer.sinfo = (void *) NULL; xfer_struct.HwXfer.org_cntr = &(get_cntr->cntr); /* Initiate RDMA Xfer */ if((rc = LAPI_Xfer(lapi_handle, &xfer_struct)) != LAPI_SUCCESS) { LAPI_Msg_string(rc, err_msg_buf); fprintf(stderr, "LAPI ERROR: %s, rc = %d\n", err_msg_buf, rc); armci_die("LAPI_Xfer (RDMA Get) failed", 0); } /* wait for RDMA completion */ rc = LAPI_Waitcntr(lapi_handle, &(get_cntr->cntr),1,&val); if(rc != LAPI_SUCCESS) { LAPI_Msg_string(rc, err_msg_buf); fprintf(stderr, "LAPI ERROR: %s, rc = %d\n", err_msg_buf, rc); armci_die("LAPI_Waitcntr (RDMA Get) failed", 0); } #if DEBUG_ printf("%d: Completed LAPI_Xfer (RDMA Get): dst=%d\n", armci_me, p); #endif } int armci_pin_contig_hndl(void *ptr, int bytes, ARMCI_MEMHDL_T *memhdl) { lapi_get_pvo_t util_pvo; /* For call to obtain PVO */ int rc; /* translate and pin the buffer to the adapter */ util_pvo.Util_type = LAPI_XLATE_ADDRESS; util_pvo.length = bytes; util_pvo.usr_pvo = 0; util_pvo.address = ptr; util_pvo.operation = LAPI_RDMA_ACQUIRE; /*bzero(ptr, bytes);*/ /* CHECK: Is touching the entire shmem sgement feasible */ if((rc=LAPI_Util(lapi_handle, (lapi_util_t *) &util_pvo)) != LAPI_SUCCESS) { return 0; } memhdl->pvo = util_pvo.usr_pvo; memhdl->start = ptr; #if DEBUG_ printf("\n%d:armci_pin_contig_hndl(): memhdl(pvo)=%ld ptr=%p bytes=%ld\n", armci_me, (long)memhdl->pvo, ptr, bytes);fflush(stdout); #endif return 1; } void armci_network_client_deregister_memory(ARMCI_MEMHDL_T *mh) { fprintf(stderr," armci_network_client_deregister_memory not available\n"); fflush(stderr); } void armci_network_server_deregister_memory(ARMCI_MEMHDL_T *mh) { fprintf(stderr," armci_network_client_deregister_memory not available\n"); fflush(stderr); } #endif /* LAPI_RDMA */ #ifdef AIX #define LOCKED 1 void armci_lapi_lock(int *lock) { atomic_p word_addr = (atomic_p)lock; int spin = 1; while(1){ if(_check_lock(word_addr, 0, LOCKED) == FALSE ) break; /* we got the lock */ if(spin){ armci_waitsome(1); spin = 0; }else{ /* yield processor to another thread */ /* cannot yield w/o affecting thread priority - better sleep */ /* yield(); */ /* call usleep to notify scheduler */ (void)usleep(5); } } } void armci_lapi_unlock(int *lock) { atomic_p word_addr = (atomic_p)lock; if(_check_lock(word_addr, LOCKED, 0) == TRUE ) armci_die("somebody else unlocked",0); } #endif #ifdef LAPI2 #include "lapi2.c" #endif ga-5-4/armci/src/devices/lapi/lapi2.c0000644000175000017500000003545212662210402015440 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: lapi2.c,v 1.18.2.3 2007-07-02 05:24:34 d3p687 Exp $ */ #define DEBUG 0 #define DSCR_SIZE 4096*8 /*given that bufsize=30000*8,conservative,indeed*/ #define LAPI_CLEAR_CNTR(ocmpl_) if((ocmpl_)->val) {\ int _val_;\ if(LAPI_Waitcntr(lapi_handle,&((ocmpl_)->cntr), ((ocmpl_)->val), &_val_))\ armci_die("LAPI_Waitcntr failed",-1);\ if(_val_ != 0) armci_die("CLEAR_COUNTER: nonzero in file ", _val_);\ (ocmpl_)->val = 0; \ } /*\ create lapi vector descriptors from the buffer \*/ static void lapi2_create_vec_info(lapi_vec_t **srcv, lapi_vec_t **dstv, int iovnum,int iovlen,char *bufptr) { int dsize = iovnum*sizeof(void *); int dlen = iovlen*sizeof(int); int offset=0; *srcv = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); *dstv = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); (*srcv)->info= (void **)(bufptr+offset); offset+=dsize; (*dstv)->info= (void **)(bufptr+offset); offset+=dsize; if(dlen!=0){ (*srcv)->len = (unsigned long *)(bufptr+offset); offset+=dlen; (*dstv)->len = (unsigned long *)(bufptr+offset); offset+=dlen; } else { (*srcv)->len = (*dstv)->len = NULL; } } /*\ 2D strided get/put using lapi vector/strided transfer \*/ void armcill_op2D(int op,void *src_ptr,int src_stride,void *dst_ptr, int dst_stride,int count, int bytes, int p, lapi_cntr_t *ocntr,char *bufptr) { lapi_vec_t *src, *dst; int reqid,rc; int offset=0; if(DEBUG){ printf("\n%d:in put2d p=%d bytes=%d\n",armci_me,p,bytes);fflush(stdout); } /*lapi2_create_vec_info(&src,&dst,3,0,bufptr);*/ src = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); dst = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); src->info = (void **)(bufptr+offset); offset+=3*sizeof(void *); dst->info = (void **)(bufptr+offset); offset+=3*sizeof(void *); src->vec_type = dst->vec_type = LAPI_GEN_STRIDED_XFER; src->num_vecs = (uint)count; dst->num_vecs= (uint)count; src->len = NULL; dst->len = NULL; src->info[0] = src_ptr; dst->info[0] = dst_ptr; src->info[1] = (void*)bytes; dst->info[1] = (void*)bytes; src->info[2] = (void*)src_stride; dst->info[2] = (void*)dst_stride; if(op==GET) rc = LAPI_Getv(lapi_handle, (uint)p, src, dst,NULL,ocntr); else rc = LAPI_Putv(lapi_handle,(uint)p,dst,src,NULL,ocntr,&cmpl_arr[p].cntr); if(rc) armci_die2("LAPI_op2D failed",rc,op); if(DEBUG)printf("\n%d: put completed \n",armci_me); } /*\ ND strided get/put packed and sent as vectors \*/ void armcill_opND(int op,void *src_ptr, int src_stride_arr[],void* dst_ptr, int dst_stride_arr[],int count[], int stride_levels, int proc, lapi_cmpl_t *ocmpl,char *bufptr) { char *dst=(char*)dst_ptr; char *src=(char*)src_ptr; char *dst1; char *src1; int i,j,k,num_xmit=0,lastiovlength,iovlength,n=0,max_iovec,totalsize=0; int total_of_2D=1; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; int rc,vecind; lapi_vec_t *srcv, *dstv; lapi_cntr_t *ocntr=&(ocmpl->cntr); int offset=0; if(DEBUG){ printf("\n%d:in getND count[0] is %d and strarr[0] is%d maxiov=%d\n", armci_me,count[0],dst_stride_arr[0],max_iovec); fflush(stdout); } index[2] = 0; unit[2] = 1; if(stride_levels>1){ total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } } max_iovec=(DSCR_SIZE-2*sizeof(lapi_vec_t))/(2*(sizeof(int)+sizeof(void*))); /*compute number of loops and the size of last iovector based of buf size*/ num_xmit = total_of_2D*count[1]/max_iovec; lastiovlength = (total_of_2D*count[1])%max_iovec; if(num_xmit == 0) num_xmit = 1; else if(lastiovlength!=0)num_xmit++; /*set the current iov length*/ k=0;vecind=0; if(lastiovlength!=0 && k==(num_xmit-1))iovlength=lastiovlength; else iovlength=max_iovec; /*create the lapi_vec_t from the buffer*/ /*lapi2_create_vec_info(&srcv,&dstv,iovlength,iovlength,bufptr);*/ srcv = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); dstv = (lapi_vec_t *)(bufptr+offset); offset+=sizeof(lapi_vec_t); srcv->info= (void **)(bufptr+offset); offset+=iovlength*sizeof(void*); dstv->info= (void **)(bufptr+offset); offset+=iovlength*sizeof(void*); srcv->len = (unsigned long *)(bufptr+offset);offset+=iovlength*sizeof(unsigned long); dstv->len = (unsigned long *)(bufptr+offset);offset+=iovlength*sizeof(unsigned long); srcv->vec_type = dstv->vec_type = LAPI_GEN_IOVECTOR; srcv->num_vecs = (uint)iovlength; dstv->num_vecs= (uint)iovlength; for(i=0; i= count[j]) index[j] = 0; } dst1=dst; src1=src; for(j=0;jval+=1; if(op==GET){ rc = LAPI_Getv(lapi_handle,(uint)proc,srcv,dstv,NULL,ocntr); } else { UPDATE_FENCE_STATE(proc,PUT,1); rc = LAPI_Putv(lapi_handle,(uint)proc,dstv,srcv,NULL,ocntr, &cmpl_arr[proc].cntr); } if(rc) armci_die2("LAPI_opND failed",rc,op); vecind = 0; totalsize=0; k++; if(lastiovlength!=0 && k==(num_xmit-1))iovlength=lastiovlength; else iovlength=max_iovec; srcv->num_vecs = (uint)iovlength; dstv->num_vecs= (uint)iovlength; } dstv->info[vecind] = dst1; dstv->len[vecind] = count[0]; srcv->info[vecind] = src1; srcv->len[vecind] = count[0]; totalsize+=count[0]; dst1+=dst_stride_arr[0]; src1+=src_stride_arr[0]; } if(vecind==iovlength){ LAPI_CLEAR_CNTR((ocmpl)); ocmpl->val+=1; if(op==GET){ rc = LAPI_Getv(lapi_handle,(uint)proc,srcv,dstv,NULL,ocntr); } else { UPDATE_FENCE_STATE(proc,PUT,1); rc = LAPI_Putv(lapi_handle,(uint)proc,dstv,srcv,NULL,ocntr, &cmpl_arr[proc].cntr); } if(rc) armci_die2("LAPI_opND failed",rc,op); vecind = 0; totalsize=0; k++; if(lastiovlength!=0 && k==(num_xmit-1))iovlength=lastiovlength; else iovlength=max_iovec; srcv->num_vecs = (uint)iovlength; dstv->num_vecs= (uint)iovlength; } } if(DEBUG)printf("\n%d: get completed \n",armci_me); } void lapi_op_2d(int op, uint proc, void *src_ptr, void *dst_ptr,uint bytes, int count, int src_stride, int dst_stride,lapi_cmpl_t* o_cmpl) { int i,rc; if(op==PUT)UPDATE_FENCE_STATE(proc, PUT, count); o_cmpl->val+=count; for(i=0;icntr),&cmpl_arr[proc].cntr); else rc=LAPI_Get(lapi_handle,proc,bytes,(src_ptr),(dst_ptr),NULL, &(o_cmpl->cntr)); if(rc)ARMCI_Error("LAPI_put failed",0); src_ptr = (void*) ((unsigned long)src_ptr+src_stride); dst_ptr = (void*) ((unsigned long)dst_ptr+dst_stride); } } /*\This function is designed as follows. * CONTIG code breaks ND into 1D chunks a does Lapi_Put on each chunk. * STRIDED code uses strided option in the LAPI_PutV call * VECTOR code packs multi-strided/vector data as vectors as transmits. * ____________________________________ * | type small/medium large | * |------------------------------------ * | 1D CONTIG CONTIG| * | 2D STRIDED CONTIG| * | >2D VECTOR CONTIG| * |-----------------------------------| * this code uses orig counter from nb_handle for non-blk call * completion counter should always be same for non-blk and blk code to be * able to do ordering/fence. \*/ void armci_network_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle) { int rc=0; lapi_cmpl_t *o_cmpl; int total_of_2D,i,j; char *src = (char*)src_ptr, *dst=(char*)dst_ptr; char *bufptr; int index[MAX_STRIDE_LEVEL], unit[MAX_STRIDE_LEVEL]; int dsize=3*sizeof(void*); /*pick a counter, default for blocking, from descriptor for non-blocking*/ if(nb_handle){ INIT_COUNTER((nb_handle->cmpl_info),0); o_cmpl = &(nb_handle->cmpl_info); } else{ if(op==GET) #if 0 o_cmpl = &get_cntr; else o_cmpl = &ack_cntr; #else /* multithreaded lapi uses array of counters (one per thread) */ o_cmpl = get_cntr; /* same as &(get_cntr[0]) */ else o_cmpl = ack_cntr; /* same as &(ack_cntr[0]) */ #endif } /*CONTIG protocol: used for 1D(contiguous) or if stride is very large in a multi strided case*/ if(stride_levels==0 || count[0]>LONG_PUT_THRESHOLD){ /*set bufid in nb_handle, in this case, no buffer used, hence NB_NONE*/ if(nb_handle) armci_set_nbhandle_bufid(nb_handle,NULL,NB_NONE); switch (stride_levels) { case 0: /* 1D op */ lapi_op_2d(op, (uint)proc, src_ptr, dst_ptr, count[0], 1, 0,0,o_cmpl); break; case 1: /* 2D op */ lapi_op_2d(op, (uint)proc, src_ptr,dst_ptr, (uint)count[0], count[1], src_stride_arr[0], dst_stride_arr[0], o_cmpl); break; default: /* N-dimensional */ { index[2] = 0; unit[2] = 1; total_of_2D = count[2]; for(j=3; j<=stride_levels; j++) { index[j] = 0; unit[j] = unit[j-1] * count[j-1]; total_of_2D *= count[j]; } for(i=0; i= count[j]) index[j] = 0; } lapi_op_2d(op, (uint)proc, src, dst,(uint)count[0], count[1], src_stride_arr[0], dst_stride_arr[0],o_cmpl); } } } } else{ /* greated than 1D small/med stride */ if(stride_levels==1){ /*small/med 2D, use lapi STRIDED */ bufptr = GET_SEND_BUFFER(2*(sizeof(lapi_vec_t)+dsize),op,proc); if(nb_handle){ /*update info in the buf_info_t data-structure*/ SET_BUF_TAG(bufptr,nb_handle->tag,0); /*set the buffer id in nb_handle*/ armci_set_nbhandle_bufid(nb_handle,bufptr,0); } if(op==PUT)UPDATE_FENCE_STATE(proc, PUT, 1); /*we use the counter in the buffer*/ o_cmpl = (BUF_TO_EVBUF(bufptr)); armcill_op2D(op,src_ptr,src_stride_arr[0],dst_ptr,dst_stride_arr[0], count[1],count[0],proc,&(o_cmpl->cntr),bufptr); } else { /*small/med >2D, use lapi VECTOR*/ bufptr = GET_SEND_BUFFER(DSCR_SIZE,op,proc); if(nb_handle){ /*update info in the buf_info_t data-structure*/ SET_BUF_TAG(bufptr,nb_handle->tag,0); /*set the buffer id in nb_handle*/ armci_set_nbhandle_bufid(nb_handle,bufptr,0); } /*we use the counter in the buffer*/ o_cmpl = (BUF_TO_EVBUF(bufptr)); /*val set to 0 because of the way opND is writted, to be modified*/ o_cmpl->val=0; armcill_opND(op,src_ptr,src_stride_arr,dst_ptr, dst_stride_arr,count, stride_levels,proc,o_cmpl,bufptr); } /* for blocking cases, we can free cmpldescr buffer and wait for op to complete. */ if(!nb_handle){ /*for now, we manually clear the counter here for blocking calls. for later, this has to be done in FREE_SEND_BUFFER.*/ LAPI_CLEAR_CNTR(o_cmpl); FREE_SEND_BUFFER(bufptr); } } } void armci_send_strided_data_bypass(int proc, request_header_t *msginfo, void *bufptr, int msg_buflen, void *src_ptr, int *loc_stride_arr, void *dst_ptr, int *rem_stride_arr, int *pcount, int stride_levels) { lapi_cntr_t c; int count= pcount[1],bytes=pcount[0],rc; int src_stride= loc_stride_arr[0]; int dst_stride= rem_stride_arr[0]; lapi_vec_t *src, *dst; int offset=0; int p=msginfo->from; if(stride_levels!=1)armci_die("armci_send_strided_data_bypass wrong stride",stride_levels); LAPI_Setcntr(lapi_handle,&c,0); src = (lapi_vec_t *)((unsigned long)bufptr+offset); offset+=sizeof(lapi_vec_t); dst = (lapi_vec_t *)((unsigned long)bufptr+offset); offset+=sizeof(lapi_vec_t); src->info = (void **)((unsigned long)bufptr+offset); offset+=3*sizeof(void *); dst->info = (void **)((unsigned long)bufptr+offset); offset+=3*sizeof(void *); src->vec_type = dst->vec_type = LAPI_GEN_STRIDED_XFER; src->num_vecs = (uint)count; dst->num_vecs= (uint)count; src->len = NULL; dst->len = NULL; src->info[0] = src_ptr; dst->info[0] = dst_ptr; src->info[1] = (void*)bytes; dst->info[1] = (void*)bytes; src->info[2] = (void*)src_stride; dst->info[2] = (void*)dst_stride; rc = LAPI_Putv(lapi_handle,(uint)p,dst,src,msginfo->tag.cntr,&c,NULL); if(rc)armci_die("armci_send_strided_data_bypass failed",rc); if(DEBUG_){ printf("%dserv: did putv to %d cntr =%p\n",armci_me,p,msginfo->tag.cntr); fflush(stdout); } LAPI_Waitcntr(lapi_handle, &c,1,NULL); } /*\ client receives strided data from server \*/ void armci_rcv_strided_data_bypass_both(int proc, request_header_t* msginfo, void *ptr, int count[], int strides) { lapi_cmpl_t *pcntr=BUF_TO_EVBUF(msginfo); if(DEBUG_){ printf("%d: expecting data from %d cntr =%p v=%d\n",armci_me,proc,&pcntr->cntr,pcntr->val); fflush(stdout); } CLEAR_COUNTER((*pcntr)); if(DEBUG_){ printf("%d: got data from %d\n",armci_me,proc); fflush(stdout); } } ga-5-4/armci/src/ft/0000755000175000017500000000000012662210413012320 5ustar mbambaga-5-4/armci/src/ft/armci_chkpt.c0000644000175000017500000011025512662210413014754 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*interfaces for checkpointing */ /* TODO * work on the case if pagenum==firstpage or lastpage when writing pages */ #if HAVE_STDIO_H # include #endif #if HAVE_SETJMP_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_SYSCALL_H # include #endif #if HAVE_SYS_MMAN_H # include #endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_DIRENT_H # include #endif #if HAVE_STDARG_H # include #endif #include #include "armcip.h" #include "message.h" #include "armci_chkpt.h" #define DEBUG 0 #define DEBUG_ 1 /*\ * ----------CORE FUNCTIONS ----------- * armci_init_checkpoint() - the checkpointing code is initialized * armci_icheckpoint_init() - called when with first checkpoint * armci_icheckpoint_finalize() - called when done with chkpt * armci_icheckpoint() - called every time we checkpoint * armci_recover() - called to recoved * ----------SUPPORT FUNCTIONS ----------- * armci_ckpt_pgfh() - pagefault handler, to set the list of dirty pages * armci_monitor_addr() - monitors address to look for and pages to set readonly * armci_create_record() - create the record for local part of data being stored * armci_protect_pages() - to protect pages in the dirty page list * armci_storage_read() - reads record from storage * armci_storage_write() - writes into storage * armci_storage_fopen() - opens a file in storage * \*/ /*\ global variables \*/ static armci_storage_record_t armci_storage_record[1001]; static int isheap; static int number_of_records=1; static int next_available_rid=0; static int mypagesize; int **armci_rec_ind; static armci_page_info_t armci_dpage_info; static int checkpointing_initialized=0; static int armci_recovering=0; static char *armci_ckpt_bspBottom=NULL; /* return the current position (index) of the ckpt file */ #define CURR_FILE_POS(rid) armci_storage_record[rid].fileinfo.startindex #define UPDATE_FILE_POS(rid,size) \ armci_storage_record[rid].fileinfo.startindex += (size) void ARMCI_Ckpt_create_ds(armci_ckpt_ds_t *ckptds, int count) { armci_create_ckptds(ckptds,count); } int ARMCI_Ckpt_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds) { int rid; rid = armci_icheckpoint_init(filename,grp,savestack,saveheap,ckptds); return(rid); } int ARMCI_Ckpt(int rid) { return(armci_icheckpoint(rid)); } void ARMCI_Ckpt_Recover(int rid, int iamreplacement) { armci_irecover(rid, iamreplacement); } void ARMCI_Ckpt_finalize(int rid) { armci_icheckpoint_finalize(rid); } /* ----------SUPPORT FUNCTIONS ----------- */ /* This function is called from ARMCI sigv and sigbus handler */ int armci_ckpt_pgfh(void *addr, int errno, int fd) { char *paddr; unsigned long pagenum; /*find the page number and the corresponding page aligned address*/ pagenum = (unsigned long)((long)addr/mypagesize); paddr = (char*)(pagenum*mypagesize); if(DEBUG)printf("%d:paddr=%p addr=%p %lu\n",armci_me,paddr,addr,pagenum); /*page is being touched change page permission to READ/WRITE*/ mprotect(paddr, mypagesize, PROT_READ | PROT_WRITE); /*mark pagenumber dirty in dirty page array*/ armci_dpage_info.touched_page_arr[armci_dpage_info.num_touched_pages++] = pagenum; if(pagenumarmci_dpage_info.lastpage) armci_dpage_info.lastpage = pagenum; #if 1 printf("%d: armci_ckpt_pgfh(): num_touched_pages = %ld\n",armci_me,armci_dpage_info.num_touched_pages);fflush(stdout); #endif return(0); } #if 0 printf("%d:pagenum=%d first=%d last=%d\n",armci_me,pagenum,armci_storage_record[i].firstpage,(armci_storage_record[i].firstpage+armci_storage_record[i].totalpages));fflush(stdout); #endif static int armci_create_record(ARMCI_Group *group, int count) { int recind; int relprocid; int rc; rc = ARMCI_Group_rank(group,&relprocid); /*create and broadcast new index in the records data structure*/ next_available_rid = 0; if(next_available_rid==0){ if(relprocid==0) ARMCI_Rmw(ARMCI_FETCH_AND_ADD,&recind,armci_rec_ind[0],1,0); } else recind=next_available_rid; armci_msg_group_bcast_scope(SCOPE_ALL,&recind,sizeof(int),0,group); if(recind>1001) armci_die("create_record, failure",recind); armci_storage_record[recind].pid = armci_me; armci_storage_record[recind].rid = recind; armci_storage_record[recind].rel_pid = relprocid; memcpy(&armci_storage_record[recind].group,group,sizeof(ARMCI_Group)); if(count!=0) armci_storage_record[recind].user_addr = (armci_monitor_address_t *)malloc(sizeof(armci_monitor_address_t)*count); armci_storage_record[recind].user_addr_count=count; if(next_available_rid!=0) next_available_rid = 0; else number_of_records++; return(recind); } static void armci_protect_pages(unsigned long startpagenum,unsigned long numpages) { char *addr; addr =(char *)((unsigned long)(startpagenum*mypagesize)); mprotect(addr, mypagesize*numpages,PROT_READ); if(DEBUG)printf("%d:protecting address %p %ld\n",armci_me,addr,mypagesize*numpages); } /* CHECK: This is a temporary function - remove later. Then make sure remove * the ifdef CHECKPOINT2 in armci_init_checkpoint(). Note this should be * called inside main(int argc, char **argv), I guess ... */ void armci_init_checkpoint2() { printf("%d:in armci init checkpoint2\n",armci_me);fflush(stdout); #ifdef __ia64 /* get backing store bottom */ asm("mov %0=ar.bsp": "=r"(armci_ckpt_bspBottom)); printf("%d: armci_ckpt_bspBottom=%p\n", armci_me, armci_ckpt_bspBottom); #endif } /*\ ----------CORE FUNCTIONS ----------- \*/ /*called in armci init*/ int armci_init_checkpoint(int spare) { int rc; extern void ARMCI_Register_Signal_Handler(int sig, void (*func)()); extern void armci_create_ft_group(); #ifdef CHECKPOINT2 printf("%d:in armci init checkpoint\n",armci_me);fflush(stdout); #ifdef __ia64 /* get backing store bottom */ asm("mov %0=ar.bsp": "=r"(armci_ckpt_bspBottom)); printf("%d: armci_ckpt_bspBottom=%p\n", armci_me, armci_ckpt_bspBottom); #endif #endif mypagesize = getpagesize(); if(checkpointing_initialized)return(0); /* malloc for record index */ armci_rec_ind = (int **)malloc(sizeof(int *)*armci_nproc); if(armci_me==0){ rc = ARMCI_Malloc((void **)armci_rec_ind, 2*sizeof(int)); armci_rec_ind[armci_me][0]=armci_rec_ind[armci_me][1]=1; } else rc = ARMCI_Malloc((void **)armci_rec_ind, 0); assert(rc==0); ARMCI_Register_Signal_Handler(SIGSEGV,(void *)armci_ckpt_pgfh); armci_dpage_info.touched_page_arr = (unsigned long *)malloc(sizeof(unsigned long)*100000); armci_dpage_info.num_touched_pages=armci_dpage_info.lastpage=0; armci_dpage_info.firstpage = 99999999; armci_create_ft_group(spare); checkpointing_initialized = 1; return(0); } void armci_create_ckptds(armci_ckpt_ds_t *ckptds, int count) { printf("%d:in armci_create_ckptds with count=%d\n",armci_me,count);fflush(stdout); ckptds->count=count; ckptds->ptr_arr=(void **)malloc(sizeof(void *)*(count+1)); ckptds->sz=(size_t *)malloc(sizeof(size_t)*(count+1)); ckptds->saveonce=(int *)calloc((count+1),sizeof(int)); if( ckptds->saveonce==NULL || ckptds->ptr_arr==NULL || ckptds->sz == NULL ) armci_die("malloc failed in armci_create_ckptds",count); } void armci_free_ckptds(armci_ckpt_ds_t *ckptds) { free(ckptds->ptr_arr); free(ckptds->sz); } static void armci_create_protect_pages(armci_monitor_address_t *addrds, void *ptr, unsigned long bytes,int callprotect) { unsigned long laddr; unsigned long totalpages; unsigned long j; addrds->ptr=(void *)(ptr); addrds->bytes = bytes; laddr = (unsigned long)(addrds->ptr); addrds->firstpage = (unsigned long)((unsigned long)laddr/mypagesize); if(laddr%mypagesize ==0){ totalpages = (int)(bytes/mypagesize); if(bytes%mypagesize)totalpages++; } else { int shift; shift = mypagesize - laddr%mypagesize; if(DEBUG);{ printf("%d:shift=%d bytes=%ld\n",armci_me,shift,bytes); fflush(stdout); } if(bytestotalpages = totalpages; addrds->num_touched_pages = totalpages; addrds->touched_page_arr = malloc(totalpages*sizeof(unsigned long)); if(addrds->touched_page_arr==NULL) armci_die("malloc failed in armci_icheckpoint_init",totalpages); addrds->touched_page_arr[0]=addrds->firstpage; for(j=1;jtouched_page_arr[j]=addrds->touched_page_arr[j-1]+1; } if(DEBUG);{ printf("%d: addrds=%p first=%lu total=%lu laddr=%lu (%p)\n",armci_me, addrds, addrds->firstpage, addrds->totalpages, laddr, (void*)laddr); fflush(stdout); } if(callprotect){ if(isheap) armci_protect_pages(addrds->firstpage+16,addrds->totalpages); else armci_protect_pages(addrds->firstpage,addrds->totalpages); } } /*called everytime a new checkpoint record is created*/ int armci_icheckpoint_init(char *filename,ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds) { int rid; int i=0; char line[256],tmpfilename[100]; unsigned long databottom; FILE *fp; printf("%d:in armci ckpt init\n",armci_me);fflush(stdout); if(DEBUG && ckptds!=NULL) printf("%d:ckptdscount=%d\n",armci_me,ckptds->count); /*create the record*/ if(ckptds!=NULL) rid = armci_create_record(grp,ckptds->count); else rid = armci_create_record(grp,0); if(DEBUG) printf("%d:got rid = %d\n",armci_me,rid);fflush(stdout); armci_storage_record[rid].ckpt_heap = saveheap; armci_storage_record[rid].ckpt_stack = savestack; /*open the file for reading and writing*/ if(filename == NULL){ filename = (char *)malloc(sizeof(char)*(11+1+6+1+4)); if(filename==NULL)armci_die("alloc for filename failed",11+1+6+1+4); sprintf(filename,"%s","armci_chkpt_"); sprintf((filename+strlen(filename)),"%d",armci_me); sprintf((filename+strlen(filename)),"%s","_"); sprintf(filename+strlen(filename),"%d",rid); } armci_storage_record[rid].fileinfo.filename = malloc(sizeof(char)*strlen(filename)); if(NULL==armci_storage_record[rid].fileinfo.filename) armci_die("malloc failed for filename in ga_icheckpoint_init",0); strcpy(armci_storage_record[rid].fileinfo.filename,filename); armci_storage_record[rid].fileinfo.fd = armci_storage_fopen(filename); armci_storage_record[rid].fileinfo.startindex = 0; /* initialize */ if(DEBUG){printf("filename=%s\n",filename);fflush(stdout);} sprintf(tmpfilename, "/proc/%d/maps",getpid()); fp=fopen(tmpfilename, "r"); if (fp == NULL){ armci_die("couldnt find dseg base",getpid()); } if(armci_storage_record[rid].ckpt_stack){ unsigned long stackbottom; char *start,*end,*tmp; armci_monitor_address_t *addrds =&armci_storage_record[rid].stack_mon; do { fgets(line, 255, fp); } while ( line[0] != '6' ); sscanf(line, "%p", (void**)&databottom); printf("%p databot\n",(char *)databottom); # ifdef KERNEL_2_4 do { start = fgets(line, 255, fp); } while(start != NULL); # else /* KERNEL_2_6 */ { char tmpline[256]; do { strncpy(line, tmpline, 256); start = fgets(tmpline, 255, fp); } while(tmpline[0] == '6'); } # endif start = strstr(line, "-") + 1; if(DEBUG);{printf("stack top=%s\n",start);fflush(stdout);} end = strstr(line, " "); *end = 0; sscanf(start, "%p", (void**)&stackbottom); addrds->ptr = (void *)(stackbottom); } if(armci_storage_record[rid].ckpt_heap){ char *datatop; armci_monitor_address_t *addrds =&armci_storage_record[rid].heap_mon; datatop=(char *)sbrk(0); if(!armci_storage_record[rid].ckpt_stack){ do { fgets(line, 255, fp); } while ( line[0] != '6' ); sscanf(line, "%p", (void**)&databottom); } printf("%d:databot=%p datatop=%p %ld %p %p\n",armci_me,(void*)databottom,datatop,(unsigned long)((char *)datatop-(char *)databottom),&armci_storage_record[rid].jmp, &addrds); isheap = 1; printf("I'm here 1\n"); fflush(stdout); armci_create_protect_pages(addrds,(void *)databottom,(unsigned long)((char *)datatop-(char *)databottom),1); printf("I'm here 1a\n"); fflush(stdout); isheap = 0; mprotect(armci_storage_record,sizeof(armci_storage_record_t)*1000, PROT_READ | PROT_WRITE); mprotect(&armci_recovering,sizeof(int), PROT_READ | PROT_WRITE); mprotect(&armci_dpage_info,sizeof(armci_page_info_t), PROT_READ | PROT_WRITE); mprotect(armci_dpage_info.touched_page_arr,sizeof(unsigned long)*99999999, PROT_READ | PROT_WRITE); printf("I'm here 2\n"); fflush(stdout); } else { if(ckptds!=NULL) for(i=0;icount;i++){ armci_monitor_address_t *addrds =&armci_storage_record[rid].user_addr[i]; addrds->saveonce = ckptds->saveonce[i]; if(addrds->saveonce) armci_create_protect_pages(addrds,ckptds->ptr_arr[i],ckptds->sz[i],0); else armci_create_protect_pages(addrds,ckptds->ptr_arr[i],ckptds->sz[i],1); } } if(DEBUG){printf("%d:completed init\n",armci_me);fflush(stdout);} return(rid); } int armci_create_touchedpagearray(unsigned long *tpa,unsigned long firstpage, unsigned long totalpages){ unsigned long i,j=0; printf("In armci_create_touchedpagearray(): armci_dpage_info.num_touched_page=%ld\n", armci_dpage_info.num_touched_pages); tpa = (unsigned long *)malloc(sizeof(unsigned long)*armci_dpage_info.num_touched_pages); for(i=0;i=firstpage || armci_dpage_info.touched_page_arr[i] < (firstpage+totalpages)){ tpa[j]=armci_dpage_info.touched_page_arr[i]; j++; } } armci_dpage_info.num_touched_pages=0; return(j); } /* CHECK: put all the defines here in the armci_chpt.h header or in some * meaningful header*/ /* returns the stack head address. SP register contains this address. We save some EXTRA_SPACE as there may be some space used below the current SP */ #define EXTRA_STACK_SPACE (1 << 11) #define TMP_STACK_SIZE (1 << 12) /* CHECK: 4K is enough, I guess */ #ifndef JB_SP #define JB_SP 0 #endif #define EST_OFFSET 100 #define ARMCI_STACK_VERIFY 1234 #define STACK_TOP ((unsigned long)((unsigned long)(&dummy_first) - EST_OFFSET)) #if 0 static char* stack_head_addr() { jmp_buf tmp_j; setjmp(tmp_j); return ((char*) ((tmp_j->__jmpbuf[JB_SP] - EXTRA_STACK_SPACE) & (~PAGE_SIZE)) ); } /* to get the stack pointer */ unsigned long get_esp() { __asm__(" movl %esp,%eax "); } #endif void what_is_going_on() { int a; printf("what_is_going_on(): a=%p\n", &a); } /* In IA64, there is a seperate stack called register stack engine (RSE, contains 96 registers) to manage across functions calls (e.g. these registers stores the function return address, etc.. In order to save this info, flush the stack registers to backing store and save backing store. NOTE: backing store is a cache to register stack. */ #if defined(__ia64) static void armci_ckpt_write_backstore(int rid) { char *bspTop; /* in IA64 only, back store pointer (bsp) */ off_t ofs; /* flush the register stack */ asm("flushrs"); /* getting back store pointer (bsp). BSP is similar to stack pointer, * which points to the top of backing store */ asm("mov %0=ar.bsp": "=r"(bspTop)); printf("BSP Pointer (ar.bsp) = %p\n", bspTop); armci_storage_record[rid].bsp_mon.ptr = armci_ckpt_bspBottom; armci_storage_record[rid].bsp_mon.bytes=((unsigned long)(bspTop) - (unsigned long)(armci_ckpt_bspBottom)); ofs=CURR_FILE_POS(rid); UPDATE_FILE_POS(rid, armci_storage_record[rid].bsp_mon.bytes); armci_storage_record[rid].bsp_mon.fileoffset = ofs; printf("%d: Save Backing store: %p to %p (bytes=%ld: off=%ld)\n\n",armci_me, armci_ckpt_bspBottom, armci_ckpt_bspBottom+armci_storage_record[rid].bsp_mon.bytes, armci_storage_record[rid].bsp_mon.bytes, ofs);fflush(stdout); armci_storage_write_ptr(armci_storage_record[rid].fileinfo.fd, armci_storage_record[rid].bsp_mon.ptr, armci_storage_record[rid].bsp_mon.bytes, armci_storage_record[rid].bsp_mon.fileoffset); } #endif static void armci_ckpt_write_stack(int rid) { int dummy_first=ARMCI_STACK_VERIFY; char *top=NULL; off_t ofs = 0; int dummy_last=ARMCI_STACK_VERIFY; /* top = stack_head_addr(); */ top = (char*)STACK_TOP; armci_storage_record[rid].stack_mon.bytes=(unsigned long)(armci_storage_record[rid].stack_mon.ptr)-((unsigned long)(top)); ofs=CURR_FILE_POS(rid); UPDATE_FILE_POS(rid, armci_storage_record[rid].stack_mon.bytes); armci_storage_record[rid].stack_mon.fileoffset = ofs; printf("%d: ptr = %p\n",armci_me,armci_storage_record[rid].stack_mon.ptr); printf("%d: Save stack: %p to %p (bytes=%ld : off=%ld)\n\n",armci_me, top, top+armci_storage_record[rid].stack_mon.bytes, armci_storage_record[rid].stack_mon.bytes, ofs);fflush(stdout); armci_storage_write_ptr(armci_storage_record[rid].fileinfo.fd,top, armci_storage_record[rid].stack_mon.bytes, armci_storage_record[rid].stack_mon.fileoffset); #if defined(__ia64) /* In IA64, write Backing Store, as it is the cache for Stack Registers */ armci_ckpt_write_backstore(rid); #endif } static void armci_ckpt_write_heap(int rid) { int j; off_t ofs = 0; char *addr=NULL; armci_monitor_address_t *addrds =&armci_storage_record[rid].heap_mon; addr = sbrk(0); ofs=CURR_FILE_POS(rid); /* UPDATE_FILE_POS(rid, armci_storage_record[rid].heap_mon.bytes); */ armci_storage_record[rid].heap_mon.fileoffset = ofs; if(addr > (char *)armci_storage_record[rid].heap_mon.ptr){ /*this means change in data segment - save what ever is new and reset size*/ void *tmpaddr = addrds->ptr; void *tmpaddr1 = (void *)((char *)addrds->ptr+addrds->bytes); unsigned long firstpage = addrds->firstpage; unsigned long totalpages = addrds->totalpages; /*first save new pages*/ ofs=(off_t)(armci_storage_record[rid].heap_mon.fileoffset+totalpages*mypagesize); /*problem here - remove mallocs*/ isheap = 1; armci_create_protect_pages(addrds,tmpaddr1,(addr-(char *)tmpaddr1),1); isheap = 0; printf("%d: Hello 1\n", armci_me); armci_storage_write_pages(armci_storage_record[rid].fileinfo.fd,addrds->firstpage,addrds->touched_page_arr,addrds->num_touched_pages,mypagesize,ofs); /*now write the touched pages*/ addrds->ptr = tmpaddr; addrds->bytes = addr-(char *)tmpaddr; addrds->firstpage = firstpage; /*problem here if last data seg addr is not a page boundary*/ addrds->totalpages+=totalpages; } /*write touched pages since*/ ofs=(off_t)(armci_storage_record[rid].heap_mon.fileoffset); addrds->num_touched_pages = armci_create_touchedpagearray(addrds->touched_page_arr,addrds->firstpage,addrds->totalpages); printf("%d: Hello 2\n", armci_me); /*problem here - remove mallocs*/ if(addrds->num_touched_pages!=0) addrds->num_touched_pages = armci_create_touchedpagearray(addrds->touched_page_arr,addrds->firstpage,addrds->totalpages); printf("%d: Hello 3: %ld %p %ld %d %ld\n", armci_me,addrds->firstpage,addrds->touched_page_arr,addrds->num_touched_pages,mypagesize,ofs); armci_storage_write_pages(armci_storage_record[rid].fileinfo.fd,addrds->firstpage,addrds->touched_page_arr,addrds->num_touched_pages,mypagesize,ofs); printf("%d: Hello 3a\n", armci_me); for(j=0;jnum_touched_pages;j++){ addr =(char *)(addrds->touched_page_arr[j]*mypagesize); mprotect(addr, mypagesize,PROT_READ); } printf("%d: Hello 4\n", armci_me); } static void armci_ckpt_write_data(int rid) { int i,j; off_t ofs=0; char *addr=NULL; printf("%d: armci_ckpt_write_data(): Saving data ...\n", armci_me); for(i=0;ifileoffset = ofs; /*if(addrds->num_touched_pages!=0) CHECK this... */ addrds->num_touched_pages = armci_create_touchedpagearray(addrds->touched_page_arr,addrds->firstpage,addrds->totalpages); printf("%d: DATA:[i=%d] addrds=%p off=%ld size=%ld (#ofPages=%ld total=%ld pagesize=%d)\n", armci_me, i, addrds, addrds->fileoffset, addrds->num_touched_pages*mypagesize, addrds->num_touched_pages, addrds->totalpages, mypagesize); armci_storage_write_pages(armci_storage_record[rid].fileinfo.fd,addrds->firstpage,addrds->touched_page_arr,addrds->num_touched_pages,mypagesize,ofs); for(j=0;jnum_touched_pages;j++){ addr =(char *)(addrds->touched_page_arr[j]*mypagesize); mprotect(addr, mypagesize,PROT_READ); } /* CHECK: should I uncomment this ? check it out! bzero(addrds->touched_page_arr, sizeof(unsigned long)*addrds->num_touched_pages); addrds->num_touched_pages = 0; */ /* update the file offset */ UPDATE_FILE_POS(rid, addrds->bytes); } } static void armci_ckpt_write_rid(int rid) { } /*get the list of changed pages from touched_page_array and rewrite the * changed pages*/ int armci_icheckpoint(int rid) { int rc=ARMCI_CKPT; off_t ofs; if(DEBUG);{ printf("%d: in checkpoint rid=%d %p\n",armci_me,rid,&armci_recovering);fflush(stdout); } if(armci_storage_record[rid].ckpt_stack || armci_storage_record[rid].ckpt_heap) { #if defined(__ia64) { char *tmp_bsp; /* flush the register stack */ asm("flushrs"); /* get the top of backing store */ asm("mov %0=ar.bsp": "=r"(tmp_bsp)); printf("tmp: ar.bsp = %p\n", tmp_bsp); } #endif if((armci_recovering=setjmp(armci_storage_record[rid].jmp))==0){ /* 1. file offsets */ armci_storage_record[rid].fileinfo.startindex = 0; ofs=CURR_FILE_POS(rid); UPDATE_FILE_POS(rid,sizeof(jmp_buf)); /* 1a. save jmp buffer env */ printf("%d: Save jmp_buf: %p to %p (bytes=%ld : off=%ld)\n\n",armci_me, &armci_storage_record[rid].jmp, &armci_storage_record[rid].jmp+armci_storage_record[rid].stack_mon.bytes, sizeof(jmp_buf), ofs);fflush(stdout); armci_storage_write_ptr(armci_storage_record[rid].fileinfo.fd, &armci_storage_record[rid].jmp, sizeof(jmp_buf), ofs); /* 2. save stack */ printf("%d: Saving stack\n", armci_me); if(armci_storage_record[rid].ckpt_stack){ armci_ckpt_write_stack(rid); } /* 3. save data segment (entire heap (or) user specified data ) */ if(armci_storage_record[rid].ckpt_heap) armci_ckpt_write_heap(rid); else armci_ckpt_write_data(rid); /* 4. CHECK: sync file system, thus data is flushed to disk */ /* armci_storage_fsync(armci_storage_record[rid].fileinfo.fd); */ /* 5. TODO: save the record index in the file. Caution: there are mallocs in the structure. beware. */ armci_ckpt_write_rid(rid); } else { /*long jump brings us here */ /* CHECK: open the ckpt files*/ printf("long jump brought us here. Performed Recovery..\n"); printf("address(rid)=%p address(rc)=%p\n", &rid, &rc); what_is_going_on(); printf("rid=%d address(rid)=%p\n", rid, &rid); rc = ARMCI_RESTART; } } else{ armci_ckpt_write_data(rid); } armci_msg_group_barrier(&armci_storage_record[rid].group); printf("%d: After Barrier\n", armci_me); return(rc); } /** * Recover Backing Store. */ #if defined(__ia64) static void armci_recover_backstore(int rid) { off_t offset = armci_storage_record[rid].bsp_mon.fileoffset; size_t size = armci_storage_record[rid].bsp_mon.bytes; char *bspTop = (char*)((unsigned long)(armci_storage_record[rid].bsp_mon.ptr) + size); char *bsp; asm("flushrs"); asm("mov %0=ar.bsp": "=r"(bsp)); /* CHECK: expand the backing store so that the current backing store is replaced with saved backing store (CHECK: register stack can be as large as 96 registers, so 96*8 bytes) */ if( (unsigned long)bsp < (unsigned long)(bspTop + 96*8 + EST_OFFSET) ) { armci_recover_backstore(rid); } else{ printf("%d: armci_recover_backstore(): size=%ld offset=%ld backing store: %p to %p\n", armci_me, size, offset, bspTop, armci_storage_record[rid].bsp_mon.ptr); armci_storage_read_ptr(armci_storage_record[rid].fileinfo.fd, bspTop, size, offset); printf("%d: armci_recover_backstore(): rid=%d\n", armci_me, rid); /* CHECK: Is there a way to verify backing store recovery (similar to stack) */ } /** * CHECK: Do nothing here. Recursive function in action. */ } #endif /** * Recover stack: restore a saved stack by overwriting the current stack * of this process . The idea of restoring the stack is, we are going to * replace the contents of current stack, so that longjmp is legitimate. */ #if 0 static void armci_recover_stack(int rid) { off_t offset = sizeof(jmp_buf)+4*sizeof(int); size_t size = armci_storage_record[rid].stack_mon.bytes; char *stacktop = (char*)((unsigned long)(armci_storage_record[rid].stack_mon.ptr) - size); int dummy; printf("check=%p %p; rid=%d\n", &dummy, &offset, rid); /* CHECK: check whether current stack frame is above the old (saved) stack. If so, the recover the stack, else call thus recursively until the current stack is above the old stack */ if( (unsigned long)&dummy >= (unsigned long)(stacktop-EST_OFFSET) ) { armci_recover_stack(rid); } else { printf("%d: armci_recover_stack(): size=%ld offset=%ld stack: %p to %p\n", armci_me, size, offset, stacktop, armci_storage_record[rid].stack_mon.ptr); armci_storage_read_ptr(armci_storage_record[rid].fileinfo.fd, stacktop, size, offset); { /* verify stack recovery */ int dummy = *((int*)(stacktop+EST_OFFSET)); if(dummy != ARMCI_STACK_VERIFY) { printf("WARNING: armci_recover_stack FAILED: %d", dummy); armci_die("armci_recover_stack FAILED", dummy); } else if(DEBUG_) printf("%d: armci_recover_stack SUCCESS (%d)\n", armci_me, dummy); } #ifdef __ia64 /* recover the backing store (BSP) */ armci_recover_backstore(rid); #endif } /** * CHECK: Do nothing here...recursive function in action here.. */ } #endif static void armci_recover_memory(int rid) { int dummy; off_t ofs; size_t stacksize = armci_storage_record[rid].stack_mon.bytes; char *stacktop = (char*)((unsigned long)(armci_storage_record[rid].stack_mon.ptr) - stacksize); #ifdef __ia64 size_t bspsize = armci_storage_record[rid].bsp_mon.bytes; char *bspTop = (char*)((unsigned long)(armci_storage_record[rid].bsp_mon.ptr) + bspsize); char *bsp; #endif printf("armci_recover_stack(): check=%p ; rid=%d\n", &dummy, rid); /* call recursively until current stack is above saved stack */ if( (unsigned long)&dummy >= (unsigned long)(stacktop-EST_OFFSET) ) armci_recover_memory(rid); #ifdef __ia64 asm("flushrs"); asm("mov %0=ar.bsp": "=r"(bsp)); printf("armci_recover_bsp(): check=%p ; rid=%d\n", &dummy, rid); /* similarly, call recursively until current backing store expands (register stack can be as large as 96 registers) */ if( (unsigned long)bsp < (unsigned long)(bspTop + 97*8) ) armci_recover_memory(rid); #endif /* ------------------ recover stack segment ------------------- */ printf("%d: armci_recover_stack(): fp=%p size=%ld off=%ld stack: %p to %p\n", armci_me, armci_storage_record[rid].fileinfo.fd, stacksize, armci_storage_record[rid].stack_mon.fileoffset, stacktop, armci_storage_record[rid].stack_mon.ptr); armci_storage_read_ptr(armci_storage_record[rid].fileinfo.fd, stacktop, stacksize, armci_storage_record[rid].stack_mon.fileoffset); { /* verify stack recovery */ int dummy = *((int*)(stacktop+EST_OFFSET)); if(dummy != ARMCI_STACK_VERIFY) { printf("WARNING: armci_recover_stack FAILED: %d", dummy); armci_die("armci_recover_stack FAILED", dummy); } else if(DEBUG_) printf("%d: armci_recover_stack SUCCESS (%d)\n", armci_me, dummy); } /* -------- recover register stack (RSE) segment (IA64 only) -------- */ #ifdef __ia64 { size_t bspsize = armci_storage_record[rid].bsp_mon.bytes; char *bspTop = (char*)((unsigned long)(armci_storage_record[rid].bsp_mon.ptr) + bspsize); bsp = (char*)armci_storage_record[rid].bsp_mon.ptr; /* CHECK: */ printf("%d: armci_recover_backstore(): size=%ld off=%ld backing store: %p to %p\n", armci_me, bspsize, armci_storage_record[rid].bsp_mon.fileoffset, armci_storage_record[rid].bsp_mon.ptr, bspTop); armci_storage_read_ptr(armci_storage_record[rid].fileinfo.fd, bsp, bspsize, armci_storage_record[rid].bsp_mon.fileoffset); printf("%d: armci_recover_backstore(): rid=%d\n", armci_me, rid); /* CHECK: Is there a way to verify backing store recovery (similar to stack) */ } #endif ofs=0; /* jmp_buf is the first one to be stored in ckpt file, so ofs=0 */ printf("%d: armci_recover jmp_buf(): size=%ld off=%ld (%p to %p)\n", armci_me, sizeof(jmp_buf), ofs, &armci_storage_record[rid].jmp, (char*)(&armci_storage_record[rid].jmp)+sizeof(jmp_buf)); armci_storage_read_ptr(armci_storage_record[rid].fileinfo.fd, &armci_storage_record[rid].jmp, sizeof(jmp_buf), ofs); armci_msg_group_barrier(&armci_storage_record[rid].group); printf("%d: restoring original stack starts @ %p\n", armci_me, (void*)armci_storage_record[rid].jmp->__jmpbuf[JB_SP]); longjmp(armci_storage_record[rid].jmp,1);/*goto the restored stack*/ } static void armci_recover_stack(int rid, char *filename) { armci_recover_memory(rid); } static void armci_recover_heap(int rid, char *filename) { /* TODO: restore heap */ } static void armci_recover_data(int rid, char *filename) { int i,j; printf("%d: armci_recover_data(): rid=%d\n", armci_me, rid); for(i=0;iptr, addrds->bytes, addrds->fileoffset); armci_storage_read_pages(armci_storage_record[rid].fileinfo.fd, addrds->firstpage, addrds->touched_page_arr, addrds->num_touched_pages, mypagesize, addrds->fileoffset); } } int armci_irecover_NEW(int rid,int iamreplacement) { /* CHECK: do you need to fille rest of fileinfo like name, startindex? */ char *filename = armci_storage_record[rid].fileinfo.filename; sprintf(filename,"%s","armci_chkpt_"); sprintf((filename+strlen(filename)),"%d",armci_me); sprintf((filename+strlen(filename)),"%s","_"); sprintf(filename+strlen(filename),"%d",rid); printf("\n%d: Starting recovery...\n", armci_me); printf("%d: filename = %s\n", armci_me, filename); if(armci_storage_record[rid].ckpt_heap) { armci_recover_heap(rid,filename); } else { armci_recover_data(rid, filename); } /* stack should be the last thing recovered, as it calls longjmp() */ if(armci_storage_record[rid].ckpt_stack) armci_recover_stack(rid,filename); /*we should never come here things are hosed */ armci_die("recovery hosed",0); return(1); } int armci_irecover(int rid,int iamreplacement) { armci_irecover_NEW(rid, iamreplacement); return 1; } #if 0 static int tmpStack[TMP_STACK_SIZE]; int armci_irecover_OLD(int rid,int iamreplacement) { int rc; jmp_buf jmp; /* Save "rid" and "iamreplacement" in a global variable as we are going to replace the contents of the current stack. */ RID = rid; /* CHECK: save rid in a file or somewhere instead of * global variable*/ tmp_iamreplacement = iamreplacement; #if 0 /* create a temporary stack */ rc = _setjmp(jmp); if (rc == 0) { /* Goto a temporary stack as we still running on the original stack. To do this, update Stack Pointer (SP) to be in a temp stack area. */ jmp->__jmpbuf[JB_SP] = ((long)((char *)(tmpStack + TMP_STACK_SIZE) - EXTRA_STACK_SPACE) & ~0xf); printf("%d: temporary stack starts @ %p\n", armci_me, jmp->__jmpbuf[JB_SP]); /* CHECK: make this TMP_STACK_SIZE dynamic, by measuring the size of the stack from file */ /* * Jump back ... * But with new 'jmp' */ _longjmp(jmp, 1); } else #endif { /** * Now we are on temporary stack. So it is safe to recover stack. */ armci_recover_stack(RID); /** * go to the restored stack by calling longjmp(). Read jmpbuf from file */ if(tmp_iamreplacement){ /* CHECK: what is iamreplacement */ rc=armci_storage_read_ptr(armci_storage_record[RID].fileinfo.fd,&armci_storage_record[RID].jmp,sizeof(jmp_buf),4*sizeof(int)); } armci_msg_group_barrier(&armci_storage_record[RID].group); printf("%d: restoring original stack starts @ %p\n", armci_me, armci_storage_record[RID].jmp->__jmpbuf[JB_SP]); longjmp(armci_storage_record[RID].jmp,1);/*goto the restored stack*/ } /*we should never come here things are hosed */ armci_die2("recovery hosed",RID,iamreplacement); return(1); } #endif void armci_icheckpoint_finalize(int rid) { int i; armci_msg_group_barrier(&armci_storage_record[rid].group); for(i=0;itouched_page_arr); } free(armci_storage_record[rid].user_addr); free(armci_storage_record[rid].fileinfo.filename); armci_storage_fclose(armci_storage_record[rid].fileinfo.fd); next_available_rid = rid; } /* TODO: 1. organize all the $ifdef __ia64's properly..They are scattered all over and it is difficult to track down and potentially buggy 2. checkpoint shared memory and mmap regions 3. I/O file open/close, signals and other system specific stuff ??? 4. memory leaks due to malloc()....free'em */ ga-5-4/armci/src/ft/armci_chkpt.h0000644000175000017500000000245212662210413014760 0ustar mbamba #ifndef _ARMCI_CHKPT_H #define _ARMCI_CHKPT_H #include "armci_storage.h" typedef struct{ void *ptr; size_t bytes; int saveonce; unsigned long *touched_page_arr; unsigned long num_touched_pages; unsigned long firstpage; unsigned long totalpages; unsigned long fileoffset; } armci_monitor_address_t; typedef struct{ FILE_DS fd; long startindex; int status; char *filename; } armci_file_info_t; typedef struct{ unsigned long num_touched_pages; unsigned long *touched_page_arr; unsigned long firstpage; unsigned long lastpage; }armci_page_info_t; typedef struct{ int rid; /*unique record id*/ int pid; /*id of the process*/ int rel_pid; /*group pid for the process*/ int tmp; /*for jmp_buf alignment*/ jmp_buf jmp; /*the jmp buffer for setjmp and longjmp*/ int ckpt_heap,ckpt_stack; #ifdef __ia64 armci_monitor_address_t bsp_mon; /*registerStack(backingStorePtr) monitor*/ #endif armci_monitor_address_t stack_mon,heap_mon; armci_monitor_address_t *user_addr; int user_addr_count; armci_file_info_t fileinfo; ARMCI_Group group; } armci_storage_record_t; #endif /* _ARMCI_CHKPT_H */ ga-5-4/armci/src/ft/armci_storage.c0000644000175000017500000000741712662210413015314 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_SYSCALL_H # include #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_STDARG_H # include #endif #include "armci_storage.h" extern int armci_me; extern void armci_die(char *msg, int code); #define DEBUG 0 FILE_DS armci_storage_fopen(char *filename) { FILE_DS file_d; remove ( filename ); file_d = fopen(filename,"w+"); if(file_d==NULL) armci_die("armci_storage_fopen(): cannot open file",0); if(DEBUG); printf("\n%d:filed=%p %s\n",armci_me,file_d,filename); return(file_d); } FILE_DS armci_storage_fopen_RONLY(char *filename) { FILE_DS file_d; file_d = fopen(filename,"r"); if(file_d==NULL) armci_die("armci_storage_fopen_RONLY():cannot open file",0); if(DEBUG); printf("\n%d:filed=%p %s\n",armci_me,file_d,filename); return(file_d); } void armci_storage_fclose(FILE_DS filed) { int rc = fclose(filed); if(rc!=0)armci_die("armci_storage_fclose(): cannot close file",0); } int armci_storage_read_ptr(FILE_DS file_d,void *ptr,size_t size,off_t ofs) { int rc=0,orc=0,isize=size; if(isize<0) armci_die("armci_storage_read_ptr(): Invalid size(<0)", isize); rc = fseek(file_d,ofs,SEEK_SET); if(rc)armci_die("fseek failed in armci_storage_read_ptr",rc); while(orc!=isize){ printf("ptr=%p ofs=%ld size=%ld filed=%p\n", ptr,ofs,size,file_d); rc = fread(ptr,1,size,file_d); if(!rc) armci_die("armci_storage_read_ptr(): fread failed",0); orc+=rc; if(DEBUG); printf("\n%d:read %d so far of %d\n",armci_me,orc,isize); if(orc!=isize){ ptr+=rc; size-=rc; } } rc = fseek(file_d,0,SEEK_SET); if(rc)armci_die("fseek failed in armci_storage_read_ptr",rc); return 0; } int armci_storage_read_pages(FILE_DS file_d, unsigned long first_page, unsigned long *page_arr, unsigned long page_arr_sz,int pagesize, off_t ofs) { int i,rc=0; /*this can be heavily optimized*/ for(i=0;i #endif #if HAVE_SETJMP_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_SYSCALL_H # include #endif #if HAVE_SYS_MMAN_H # include #endif #if HAVE_SYS_PARAM_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_ERRNO_H # include #endif #if HAVE_DIRENT_H # include #endif #if HAVE_STDARG_H # include #endif #define FILE_DS FILE * FILE_DS armci_storage_fopen(char *filename); FILE_DS armci_storage_fopen_RONLY(char *filename); void armci_storage_fclose(FILE_DS filed); int armci_storage_read_ptr(FILE_DS file_d,void *ptr,size_t size,off_t ofs); int armci_storage_read_pages(FILE_DS file_d, unsigned long first_page, unsigned long *page_arr, unsigned long page_arr_sz,int pagesize, off_t ofs); int armci_storage_write_ptr(FILE_DS file_d,void *ptr,size_t size,off_t ofs); int armci_storage_write_pages(FILE_DS file_d, unsigned long first_page, unsigned long *page_arr, unsigned long page_arr_sz,int pagesize, off_t ofs); ga-5-4/armci/src/include/0000755000175000017500000000000012662210406013334 5ustar mbambaga-5-4/armci/src/include/copy.h0000644000175000017500000004350012662210406014461 0ustar mbamba/* $Id: copy.h,v 1.86.2.6 2007-08-29 17:32:32 manoj Exp $ */ #ifndef _COPY_H_ #define _COPY_H_ #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #ifdef DECOSF #include #endif #if 1 || defined(HITACHI) || defined(CRAY_T3E) || defined(CRAY_XT) || defined(BGML) # define MEMCPY #endif #if defined(LINUX64) && defined(SGIALTIX) && defined(MSG_COMMS_MPI) /* fastbcopy from Wayne Vieira and Gerardo Cisneros */ #define MEMCPY #define armci_copy(src, dst, len) _fastbcopy(src, dst, len) #define memcpy(dst, src, len) _fastbcopy(src, dst, len) #define bcopy(src, dst, len) _fastbcopy(src, dst, len) #endif #ifndef EXTERN # define EXTERN extern #endif #ifdef NEC # define memcpy1 _VEC_memcpy # define armci_copy1(src,dst,n) _VEC_memcpy((dst),(src),(n)) EXTERN long long _armci_vec_sync_flag; #endif #if defined(SGI) || defined(FUJITSU) || defined(HPUX) || defined(SOLARIS) || defined (DECOSF) || defined(__ia64__) || defined(__crayx1) # define PTR_ALIGN #endif #if defined(NB_NONCONT) && !defined(CRAY_SHMEM) && !defined(QUADRICS) && !defined(PORTALS) #error NB_NONCONT is only available on CRAY_SHMEM,QUADRICS and PORTALS #endif #if defined(SHMEM_HANDLE_SUPPORTED) && !defined(CRAY_SHMEM) #error SHMEM_HANDLE_SUPPORTED should not be defined on a non CRAY_SHMEM network #endif #if defined(MEMCPY) && !defined(armci_copy) #if defined(BGML) #define armci_copy(src, dst, n) BGLML_memcpy((dst), (src), (n)) #else # define armci_copy(src,dst,n) memcpy((dst), (src), (n)) #endif #endif #ifdef NEC # define MEM_FENCE {mpisx_clear_cache(); _armci_vec_sync_flag=1;mpisx_syncset0_long(&_armci_vec_sync_flag);} #endif #ifdef DECOSF # define MEM_FENCE asm ("mb") #endif #if defined(NEED_MEM_SYNC) # ifdef AIX # define MEM_FENCE {int _dummy=1; _clear_lock((int *)&_dummy,0); } # elif defined(__ia64) # if defined(__GNUC__) && !defined (__INTEL_COMPILER) # define MEM_FENCE __asm__ __volatile__ ("mf" ::: "memory"); # else /* Intel Compiler */ extern void _armci_ia64_mb(); # define MEM_FENCE _armci_ia64_mb(); # endif # elif defined(LINUX) && defined(__GNUC__) && defined(__ppc__) # define MEM_FENCE \ __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif #ifndef armci_copy # ifdef PTR_ALIGN # define armci_copy(src,dst,n) \ do if( ((n) < THRESH1D) || ((n)%ALIGN_SIZE) || \ ((unsigned long)(src)%ALIGN_SIZE) ||\ ((unsigned long)(dst)%ALIGN_SIZE)) memcpy((dst),(src),(n));\ else{ int _bytes=(n)/sizeof(double); DCOPY1D((double*)(src),(double*)(dst),&_bytes);}\ while (0) # else # define armci_copy(src,dst,n) \ do if( ((n) < THRESH1D) || ((n)%ALIGN_SIZE) ) memcpy((dst), (src), (n));\ else{ int _bytes=(n)/sizeof(double); DCOPY1D((double*)(src),(double*)(dst),&_bytes);}\ while (0) # endif #endif /****************************** 2D Copy *******************/ #ifndef MEMCPY # define DCopy2D(rows, cols, src_ptr, src_ld, dst_ptr, dst_ld){\ int rrows, ldd, lds, ccols;\ rrows = (rows);\ lds = (src_ld);\ ldd = (dst_ld);\ ccols = (cols);\ DCOPY2D(&rrows, &ccols, src_ptr, &lds,dst_ptr,&ldd);\ } #else # define DCopy2D(rows, cols, src_ptr, src_ld, dst_ptr, dst_ld){\ int j, nbytes = sizeof(double)* rows;\ char *ps=src_ptr, *pd=dst_ptr;\ for (j = 0; j < cols; j++){\ armci_copy(ps, pd, nbytes);\ ps += sizeof(double)* src_ld;\ pd += sizeof(double)* dst_ld;\ }\ } #endif # define ByteCopy2D(bytes, count, src_ptr, src_stride, dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_copy(ps, pd, bytes);\ ps += src_stride;\ pd += dst_stride;\ }\ } #if defined(FUJITSU) # define armci_put2D(p, bytes,count,src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchTo(src_ptr, src_stride, dst_ptr, dst_stride, count,bytes, p) # define armci_get2D(p, bytes, count, src_ptr,src_stride,dst_ptr,dst_stride)\ CopyPatchFrom(src_ptr, src_stride, dst_ptr, dst_stride,count,bytes,p) #elif defined(HITACHI) || defined(_ELAN_PUTGET_H) && !defined(NB_NONCONT) #if defined(QUADRICS) #if 0 # define WAIT_FOR_PUTS elan_putWaitAll(elan_base->state,200) # define WAIT_FOR_GETS elan_getWaitAll(elan_base->state,200) #else # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_wait_put(); extern void armcill_wait_get(); #endif #endif extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D #elif defined(NB_NONCONT) extern void armcill_wait_put(); extern void armcill_wait_get(); # define WAIT_FOR_PUTS armcill_wait_put() # define WAIT_FOR_GETS armcill_wait_get() extern void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); extern void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride); # define armci_put2D armcill_put2D # define armci_get2D armcill_get2D # if defined(QUADRICS) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_put(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = elan_get(elan_base->state,_src,_dst,(size_t)_sz,_proc) # define armcill_nb_wait(_hdl)\ elan_wait(_hdl,100) # elif defined(CRAY_SHMEM) # define armcill_nb_wait(_hdl)\ shmem_wait_nb(_hdl) /*VT:this should be ifdef'ed based on if shmem_handle is defined or not*/ # if defined (CRAY_XT) # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ shmem_putmem(_dst, _src, (size_t)_sz, _proc) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ shmem_getmem(_dst, _src, (size_t)_sz, _proc) # else # define armcill_nb_put(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_putmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # define armcill_nb_get(_dst, _src, _sz, _proc, _hdl)\ _hdl = shmem_getmem_nb(_dst, _src, (size_t)_sz, _proc, &(_hdl)) # endif # endif #else # define armci_put2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_put(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } # define armci_get2D(proc,bytes,count,src_ptr,src_stride,dst_ptr,dst_stride){\ int _j;\ char *ps=src_ptr, *pd=dst_ptr;\ for (_j = 0; _j < count; _j++){\ armci_get(ps, pd, bytes, proc);\ ps += src_stride;\ pd += dst_stride;\ }\ } #endif /* macros to ensure ordering of consecutive puts or gets following puts */ #if defined(LAPI) # include "lapidefs.h" #elif defined(_CRAYMPP) || defined(QUADRICS) || defined(__crayx1)\ || defined(CRAY_SHMEM) || defined(PORTALS) #if defined(CRAY) || defined(CRAY_XT) # include #else # include #ifndef ptrdiff_t # include #endif # include #endif # ifdef ELAN_ACC # define FENCE_NODE(p) {\ if(((p)armci_clus_last))armci_elan_fence(p);} # define UPDATE_FENCE_STATE(p, op, nissued) # else int cmpl_proc; # ifdef DECOSF # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet();\ else asm ("mb"); } # else # define FENCE_NODE(p) if(cmpl_proc == (p)){\ if(((p)armci_clus_last))shmem_quiet(); } # endif # define UPDATE_FENCE_STATE(p, op, nissued) if((op)==PUT) cmpl_proc=(p); # endif #else # if defined(GM) && defined(ACK_FENCE) extern void armci_gm_fence(int p); # define FENCE_NODE(p) armci_gm_fence(p) # elif defined(BGML) # include "bgmldefs.h" # define FENCE_NODE(p) BGML_WaitProc(p) # elif defined(ARMCIX) # define FENCE_NODE(p) ARMCIX_Fence(p) # else # define FENCE_NODE(p) # endif # define UPDATE_FENCE_STATE(p, op, nissued) #endif #ifdef NEC # define THRESH 1 # define THRESH1D 1 #else # define THRESH 32 # define THRESH1D 512 #endif #define ALIGN_SIZE sizeof(double) /********* interface to C 1D and 2D memory copy functions ***********/ /* dcopy2d_u_ uses explicit unrolled loops to depth 4 */ void c_dcopy2d_n_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy2d_u_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict B, const int* const restrict bld); void c_dcopy1d_n_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy1d_u_(const double* const restrict A, double* const restrict B, const int* const restrict n); void c_dcopy21_(const int* const restrict rows, const int* const restrict cols, const double* const restrict A, const int* const restrict ald, double* const restrict buf, int* const restrict cur); void c_dcopy12_(const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict buf, int* const restrict cur); void c_dcopy31_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, const double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, double* const restrict buf, int* const restrict cur); void c_dcopy13_(const int* const restrict rows, const int* const restrict cols, const int* const restrict plns, double* const restrict A, const int* const restrict aldr, const int* const restrict aldc, const double* const restrict buf, int* const restrict cur); #if defined(AIX) || defined(BGML) # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ #elif defined(LINUX) || defined(__crayx1) || defined(HPUX64) || defined(DECOSF) || defined(CRAY) || defined(WIN32) || defined(HITACHI) # define DCOPY2D c_dcopy2d_n_ # define DCOPY1D c_dcopy1d_n_ #else # define DCOPY2D c_dcopy2d_u_ # define DCOPY1D c_dcopy1d_u_ #endif #define DCOPY21 c_dcopy21_ #define DCOPY12 c_dcopy12_ #define DCOPY31 c_dcopy31_ #define DCOPY13 c_dcopy13_ /***************************** 1-Dimensional copy ************************/ #if defined(QUADRICS) # include # if defined(_ELAN_PUTGET_H) # define qsw_put(src,dst,n,proc) \ elan_wait(elan_put(elan_base->state,src,dst,n,proc),elan_base->waitType) # define qsw_get(src,dst,n,proc) \ elan_wait(elan_get(elan_base->state,src,dst,n,proc),elan_base->waitType) /* # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ *(phandle)=elan_put(elan_base->state,src,dst,n,proc) */ #ifdef DOELAN4 extern void armci_elan_put_with_tracknotify(char *src,char *dst,int n,int proc, ELAN_EVENT **phandle); # define ARMCI_NB_PUT(src,dst,n,proc,phandle)\ armci_elan_put_with_tracknotify(src,dst,n,proc,phandle) #endif # define ARMCI_NB_GET(src,dst,n,proc,phandle)\ *(phandle)=elan_get(elan_base->state,src,dst,n,proc) # define ARMCI_NB_WAIT(handle) if(handle)elan_wait(handle,elan_base->waitType) # define ARMCI_NB_TEST(handle,_succ) (*(_succ))= (handle)? !elan_poll(handle,1L): 1 # else # define qsw_put(src,dst,n,proc) shmem_putmem((dst),(src),(int)(n),(proc)) # define qsw_get(src,dst,n,proc) shmem_getmem((dst),(src),(int)(n),(proc)) # endif # define armci_put(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_put(src,dst,n,proc);} # define armci_get(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { qsw_get((src),(dst),(int)(n),(proc));} #elif defined(CRAY_T3E) || defined(CRAY_SHMEM) # define armci_copy_disabled(src,dst,n)\ if((n)<256 || n%sizeof(long) ) memcpy((dst),(src),(n));\ else {\ shmem_put((long*)(dst),(long*)(src),(int)(n)/sizeof(long),armci_me);\ shmem_quiet(); } # define armci_put(src,dst,n,proc) \ shmem_put32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() # define armci_get(src,dst,n,proc) \ shmem_get32((void *)(dst),(void *)(src),(int)(n)/4,(proc));\ shmem_quiet() #elif defined(HITACHI) extern void armcill_put(void *src, void *dst, int bytes, int proc); extern void armcill_get(void *src, void *dst, int bytes, int proc); # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_put((src), (dst),(n),(proc));} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { armcill_get((src), (dst),(n),(proc));} #elif defined(FUJITSU) # include "fujitsu-vpp.h" # ifndef __sparc # define armci_copy(src,dst,n) _MmCopy((char*)(dst), (char*)(src), (n)) # endif # define armci_put CopyTo # define armci_get CopyFrom #elif defined(LAPI) # include extern lapi_handle_t lapi_handle; # define armci_put(src,dst,n,proc)\ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL,&(ack_cntr[ARMCI_THREAD_IDX].cntr),&cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} /**** this copy is nonblocking and requires fence to complete!!! ****/ # define armci_get(src,dst,n,proc) \ if(proc==armci_me){\ armci_copy(src,dst,n);\ } else {\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &(get_cntr[ARMCI_THREAD_IDX].cntr)))\ ARMCI_Error("LAPI_Get failed",0);else;} # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_PUT failed",0);\ (cmplt)->val=1;\ if(LAPI_Put(lapi_handle, (uint)proc, (uint)n, (dst), (src),\ NULL, &((cmplt)->cntr), &cmpl_arr[proc].cntr))\ ARMCI_Error("LAPI_put failed",0); else;} # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ {if(LAPI_Setcntr(lapi_handle, &((cmplt)->cntr), 0))\ ARMCI_Error("LAPI_Setcntr in NB_GET failed",0);\ (cmplt)->val=1;\ if(LAPI_Get(lapi_handle, (uint)proc, (uint)n, (src), (dst), \ NULL, &((cmplt)->cntr)))\ ARMCI_Error("LAPI_Get NB_GET failed",0);else;} # define ARMCI_NB_WAIT(cmplt) CLEAR_COUNTER((cmplt)) # define ARMCI_NB_TEST(cmplt,_succ) TEST_COUNTER((cmplt),(_succ)) #elif defined(PORTALS) # define armci_put(src,dst,n,proc) \ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { PARMCI_Put((src), (dst),(n),(proc));} # define armci_get(src,dst,n,proc)\ if(((proc)<=armci_clus_last) && ((proc>= armci_clus_first))){\ armci_copy(src,dst,n);\ } else { PARMCI_Get((src), (dst),(n),(proc));} #if 0 # define ARMCI_NB_PUT(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_put((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) # define ARMCI_NB_GET(src,dst,n,proc,cmplt)\ nb_handle->tag=GET_NEXT_NBTAG();armci_portals_get((proc),(src),\ (dst),(n),cmplt,nb_handle->tag) #endif #elif defined(BGML) #define armci_get(src, dst, n, p) PARMCI_Get(src, dst, n, p) #define armci_put(src, dst, n, p) PARMCI_Put(src, dst, n, p) #elif defined(ARMCIX) #define armci_get(src, dst, n, p) PARMCI_Get(src, dst, n, p) #define armci_put(src, dst, n, p) PARMCI_Put(src, dst, n, p) #define ARMCI_NB_WAIT(cmplt) ARMCIX_Wait(&(cmplt)) #else # define armci_get(src,dst,n,p) armci_copy((src),(dst),(n)) # define armci_put(src,dst,n,p) armci_copy((src),(dst),(n)) #endif #ifndef MEM_FENCE # define MEM_FENCE {} #endif #ifndef armci_copy_fence # define armci_copy_fence armci_copy #endif #endif ga-5-4/armci/src/include/memlock.h0000644000175000017500000000202712662210406015135 0ustar mbamba/* $Id: memlock.h,v 1.18 2004-09-21 17:26:23 manoj Exp $ */ #ifndef _MEMLOCK_H_ #define _MEMLOCK_H_ /* data structure for locking memory areas */ #define MAX_SLOTS 8 typedef struct{ void *start; void *end; } memlock_t; /* SGI Altix Stuff */ typedef struct { void *seg_addr; /* master's starting address of the segment */ size_t seg_size; size_t tile_size; size_t mem_offset; }armci_memoffset_t; extern void** memlock_table_array; extern int *armci_use_memlock_table; #if defined(LAPI ) || defined(FUJITSU) || defined(PTHREADS) || \ defined(QUADRICS) || defined(HITACHI) || \ defined(CYGWIN) || defined(__crayx1) || defined(NEC) || \ (defined(LINUX64) && defined(__GNUC__) && defined(__alpha__)) # define ARMCI_LOCKMEM armci_lockmem_ # define ARMCI_UNLOCKMEM armci_unlockmem_ #else # define ARMCI_LOCKMEM armci_lockmem # define ARMCI_UNLOCKMEM armci_unlockmem #endif extern void ARMCI_LOCKMEM(void *pstart, void *pend, int proc); extern void ARMCI_UNLOCKMEM(int proc); #define MEMLOCK_SHMEM_FLAG #endif ga-5-4/armci/src/include/shmlimit.h0000644000175000017500000000027512662210406015337 0ustar mbamba#ifndef _SHMLIMIT_H_ #define _SHMLIMIT_H_ extern int armci_me, armci_master; extern void armci_die(char *, int); extern int armci_shmem_test(); extern int armci_child_shmem_init(); #endif ga-5-4/armci/src/include/spinlock.h0000644000175000017500000001226112662210406015331 0ustar mbamba/** * @file spinlock.h * * This file attempts to implement spin locks for various platforms and/or CPU * instruction sets. */ #ifndef SPINLOCK_H #define SPINLOCK_H #define DEBUG_SPINLOCK 0 #define OPENPA 0 #if OPENPA # if DEBUG_SPINLOCK # warning SPINLOCK: openpa # endif # define SPINLOCK # include "opa_primitives.h" # define LOCK_T OPA_int_t # define TESTANDSET(x) OPA_swap_int((x), 1) # define MEMORY_BARRIER OPA_read_write_barrier #elif (defined(PPC) || defined(__PPC__) || defined(__PPC)) # if DEBUG_SPINLOCK # warning SPINLOCK: PPC # endif # define SPINLOCK # include "asm-ppc.h" //# define TESTANDSET testandset //# define TESTANDSET acquireLock # define armci_acquire_spinlock acquire_spinlock # define armci_release_spinlock release_spinlock # define MEMORY_BARRIER memory_barrier static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } static void memory_barrier() { __asm__ __volatile__ ("sync" : : : "memory"); } #elif defined(__i386__) || defined(__x86_64__) # if DEBUG_SPINLOCK # warning SPINLOCK: x86_64 # endif # define SPINLOCK # include "atomics-i386.h" static int testandset(void *spinlock) { int v=1; atomic_exchange(&v,spinlock,sizeof(int)); return v; } # define TESTANDSET testandset #elif defined(HPUX) && defined(__ia64) /* HPUX on IA64, non gcc */ # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX ia64 # endif # define SPINLOCK typedef unsigned int slock_t; # include # define TESTANDSET(lock) _Asm_xchg(_SZ_W, lock, 1, _LDHINT_NONE) # define RELEASE_SPINLOCK(lock) (*((volatile LOCK_T *) (lock)) = 0) #elif defined(__ia64) # if DEBUG_SPINLOCK # warning SPINLOCK: ia64 # endif # define SPINLOCK # include "atomic_ops_ia64.h" static int testandset(void *spinlock) { int val=1; int res; atomic_swap_int(spinlock, val, &res); return res; } # define TESTANDSET testandset #elif defined(DECOSF) # if DEBUG_SPINLOCK # warning SPINLOCK: DECOSF # endif # error "no implementation" #elif defined(SGI) # if DEBUG_SPINLOCK # warning SPINLOCK: SGI # endif # include # define SPINLOCK # define TESTANDSET(x) __lock_test_and_set((x), 1) # define RELEASE_SPINLOCK __lock_release /*#elif defined(AIX)*/ #elif HAVE_SYS_ATOMIC_OP_H # if DEBUG_SPINLOCK # warning SPINLOCK: sys/atomic_op.h (AIX) # endif # include # define SPINLOCK # define TESTANDSET(x) (_check_lock((x), 0, 1)==TRUE) # define RELEASE_SPINLOCK(x) _clear_lock((x),0) #elif defined(SOLARIS) # if DEBUG_SPINLOCK # warning SPINLOCK: SOLARIS # endif # include # include # define SPINLOCK # define TESTANDSET(x) (!_lock_try((x))) # define RELEASE_SPINLOCK _lock_clear #elif defined(MACX) #elif defined(HPUX__) # if DEBUG_SPINLOCK # warning SPINLOCK: HPUX__ # endif extern int _acquire_lock(); extern void _release_lock(); # define SPINLOCK # define TESTANDSET(x) (!_acquire_lock((x))) # define RELEASE_SPINLOCK _release_lock #elif defined(NEC) # if DEBUG_SPINLOCK # warning SPINLOCK: NEC # endif extern ullong ts1am_2me(); # define LOCK_T ullong # define _LKWD (1ULL << 63) # define SPINLOCK # define TESTANDSET(x) ((_LKWD & ts1am_2me(_LKWD, 0xffULL, (ullong)(x)))) # define MEMORY_BARRIER mpisx_clear_cache extern void mpisx_clear_cache(); # define RELEASE_SPINLOCK(x) ts1am_2me(0ULL, 0xffULL, (ullong)x); #endif #ifdef SPINLOCK #if DEBUG_ # if HAVE_STDIO_H # include # endif #endif #if HAVE_UNISTD_H # include #endif #ifndef DBL_PAD # define DBL_PAD 16 #endif /* make sure that locks are not sharing the same cache line */ typedef struct{ double lock[DBL_PAD]; }pad_lock_t; #ifndef LOCK_T # define LOCK_T int #endif #define PAD_LOCK_T pad_lock_t static inline void armci_init_spinlock(LOCK_T *mutex) { #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif } #ifdef TESTANDSET static inline void armci_acquire_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else int loop=0, maxloop =10; while (TESTANDSET(mutex)){ loop++; if(loop==maxloop){ # if DEBUG_ extern int armci_me; printf("%d:spinlock sleeping\n",armci_me); fflush(stdout); # endif usleep(1); loop=0; } } #endif } #ifdef RELEASE_SPINLOCK # ifdef MEMORY_BARRIER # define armci_release_spinlock(x) MEMORY_BARRIER(); RELEASE_SPINLOCK(x) # else # define armci_release_spinlock(x) RELEASE_SPINLOCK(x) # endif #else static inline void armci_release_spinlock(LOCK_T *mutex) { #if defined(BGML) || defined(DCMF) return; #else # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif #if OPENPA OPA_store_int(mutex, 0); #else *mutex =0; #endif # ifdef MEMORY_BARRIER MEMORY_BARRIER (); # endif # if (defined(MACX)||defined(LINUX)) && defined(__GNUC__) && defined(__ppc__) __asm__ __volatile__ ("isync" : : : "memory"); # endif #endif } #endif /* RELEASE_SPINLOCK */ #endif /* TESTANDSET */ #endif /* SPINLOCK */ #endif /* SPINLOCK_H */ ga-5-4/armci/src/include/atomic_ops_ia64.h0000644000175000017500000000352612662210406016473 0ustar mbamba/* * Copyright (c) 2003 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. * * $FreeBSD: src/lib/libkse/arch/ia64/include/atomic_ops.h,v 1.2.2.1 2009/06/09 15:09:10 des Exp $ */ #ifndef _ATOMIC_OPS_H_ #define _ATOMIC_OPS_H_ static inline void atomic_swap_int(volatile int *dst, int val, int *res) { __asm("xchg4 %0=[%2],%1" : "=r"(*res) : "r"(val), "r"(dst)); } static inline void atomic_swap_long(volatile long *dst, long val, long *res) { __asm("xchg8 %0=[%2],%1" : "=r"(*res) : "r"(val), "r"(dst)); } #define atomic_swap_ptr(d,v,r) \ atomic_swap_long((volatile long *)d, (long)v, (long *)r) #endif /* _ATOMIC_OPS_H_ */ ga-5-4/armci/src/include/kr_malloc.h0000644000175000017500000000642212662210406015454 0ustar mbamba#ifndef KR_MALLOC_H /* K&R malloc */ #define KR_MALLOC_H #ifdef CRAY #define LOG_ALIGN 6 #elif defined(KSR) #define LOG_ALIGN 7 #else #define LOG_ALIGN 6 #endif #define ALIGNMENT (1 << LOG_ALIGN) #define KR_CTX_SHMEM 101 #define KR_CTX_LOCALMEM 102 union header{ struct { unsigned valid1; /* Token to check if is not overwritten */ union header *ptr; /* next block if on free list */ int shmid; /* next block's shared memory id */ long shmoffset; /* next block's shmem offset */ size_t shmsize; /* next block's shared memory segment size */ size_t size; /* size of this block*/ unsigned valid2; /* Another token acting as a guard */ } s; char align[ALIGNMENT]; /* Align to ALIGNMENT byte boundary */ }; typedef union header Header; typedef struct malloc_context { size_t usize; /* unit size in bytes */ size_t nalloc; /* No. of units of length ALIGNMENT */ size_t max_nalloc; /* Maximum no. of units that can get */ void * (*alloc_fptr)(); /* function pointer to memory alloc routine */ size_t total; /* Amount request from system in units */ long nchunk; /* No. of chunks of system memory */ long inuse; /* Amount in use in units */ long maxuse; /* Maximum value of inuse */ long nfrags; /* No. of fragments divided into */ long nmcalls; /* No. of calls to _armci_alloc() */ long nfcalls; /* No. of calls to memfree */ int ctx_type; /* context id. -1 represents ctx_local context. otherwise, it is ctx_shmem context. */ int shmid; /* first free block's (i.e.freep) shmem id */ long shmoffset; /* first free block's shmem offset */ size_t shmsize; /* first free block's shmem total size */ Header base; /* empty list to get started */ Header *freep; /* start of free list */ Header *usedp; /* start of used list */ } context_t; /* Memory required to store the shmem context in shared memory. This shmem context shuld be stored in shared memory and is stored in the first shared memory segment created (i.e.armci_krmalloc_init_ctxshmem) */ #define SHMEM_CTX_MEM (sizeof(context_t)+sizeof(void*)) #define SHMEM_CTX_UNITS ((SHMEM_CTX_MEM + sizeof(Header) - 1)>>LOG_ALIGN) + 1; extern void kr_malloc_init(size_t usize, /* unit size in bytes */ size_t nalloc, size_t max_nalloc, void * (*alloc_fptr)(), /* memory alloc routine */ int debug, context_t *ctx); /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *kr_malloc(size_t size, context_t *ctx); /* Frees memory allocated by kr_malloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-memalloc'ed pointers */ extern void kr_free(char *ptr, context_t *ctx); /* Print to standard output the usage statistics ... a wrapper for kr_malloc_stats(); */ extern void kr_malloc_print_stats(context_t *ctx); extern void kr_malloc_verify(context_t *ctx); #endif ga-5-4/armci/src/include/armcip.h0000644000175000017500000003731612662210406014772 0ustar mbamba/* $Id: armcip.h,v 1.82.2.9 2007-08-29 17:32:31 manoj Exp $ */ /* armci private header file */ #ifndef _ARMCI_P_H #define _ARMCI_P_H #if HAVE_STDLIB_H # include #endif #include "armci.h" #include "parmci.h" #include "message.h" /*#define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) \ printf("\n%d:%s:%d:%s:%s:%d",armci_me,__FILE__,__LINE__,FUNCTION_NAME,__ARMCI_ST,__ARMCI_NU)*/ #define ARMCI_PR_DBG(__ARMCI_ST,__ARMCI_NU) #ifdef QUADRICS #include #ifdef QSNETLIBS_VERSION_CODE #ifndef DECOSF # define ELAN_ACC # define PENDING_OPER(x) ARMCI_ACC_INT #endif # if QSNETLIBS_VERSION_CODE > QSNETLIBS_VERSION(1,5,0) # define LIBELAN_ATOMICS # endif #endif extern void armci_elan_fence(int p); #endif /* we got problems on IA64/Linux64 with Elan if inlining is used */ #if defined(__GNUC__) && !defined(QUADRICS) # define INLINE inline #else # define INLINE #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(100*(x)) #endif #if (defined(SYSV) || defined(WIN32)|| defined(MMAP)) && !defined(NO_SHM) && !defined(HITACHI) && !defined(CATAMOUNT) #define CLUSTER #ifdef SERVER_THREAD # define SERVER_NODE(c) (armci_clus_info[(c)].master); # define NODE_SERVER(c) (c); #else # define SOFFSET -10000 # define SERVER_NODE(c) ((int)(SOFFSET -armci_clus_info[(c)].master)); # define NODE_SERVER(c) ((int)(SOFFSET - c)) #endif #endif /**Symbol to stamp end of buffers in certain networks*/ #define ARMCI_STAMP 20080528 /*\GPC call stuff \*/ typedef struct { int hndl, hlen, dlen; void *hdr, *data; }gpc_send_t; /*\ Stuff for non-blocking API \*/ #define NB_MULTI -1 /*more than one armci buffer(buffers.c) used for nbcall*/ #define NB_NONE -2 /*no armci buffer(buffers.c) used for nbcall*/ extern unsigned int _armci_get_next_tag(); #define GET_NEXT_NBTAG _armci_get_next_tag #define ARMCI_MAX_IMPLICIT 15 typedef struct{ int len; int last; void *exthdr; } ext_header_t; typedef struct{ int val; void *ptr; } armci_flag_t; #if defined(LAPI) || defined(PTHREADS) || defined(POSIX_THREADS) # include typedef pthread_t thread_id_t; # define THREAD_ID_SELF pthread_self #elif defined(WIN32) # include typedef DWORD thread_id_t; # define THREAD_ID_SELF GetCurrentThreadId #else typedef int thread_id_t; # define THREAD_ID_SELF() 1 #endif extern thread_id_t armci_usr_tid; extern thread_id_t armci_serv_tid; #ifdef SERVER_THREAD # define SERVER_CONTEXT (armci_serv_tid == THREAD_ID_SELF()) #else # define SERVER_CONTEXT (armci_me<0) #endif #if defined(LAPI) || defined(CLUSTER) || defined(CRAY) || defined(CRAY_XT)\ || defined(CRAY_SHMEM) || defined(BGML) || defined(DCMF) # include "request.h" #endif #ifdef ARMCIX #include "armcix.h" #endif /* ------------------------ ARMCI threads support ------------------------- */ #define ARMCI_THREADS_LIMIT 32 #include "utils.h" #if defined(THREAD_SAFE) typedef struct { int max; /* max # of threads per proc */ int avail; /* next available position */ thread_id_t *ids; /* list of threads' ids */ thread_lock_t lock; /* general case lock */ thread_lock_t buf_lock; /* lock for buffer access */ thread_lock_t net_lock; /* lock for network accees */ } armci_user_threads_t; extern armci_user_threads_t armci_user_threads; extern void armci_init_threads(); extern void armci_finalize_threads(); extern int armci_thread_idx(); extern INLINE int armci_register_thread(thread_id_t id); #define ARMCI_THREAD_IDX armci_thread_idx() /* needs to be optimized */ #else # define ARMCI_THREAD_IDX 0 #endif /* ------------------------------------------------------------------------ */ /* min amount of data in strided request to be sent in single TCP/IP message*/ #if defined(SOCKETS) || defined(MPI_SPAWN_ZEROCOPY) # define TCP_PAYLOAD 128 # define LONG_GET_THRESHOLD TCP_PAYLOAD # define LONG_GET_THRESHOLD_STRIDED LONG_GET_THRESHOLD # define LONG_PUT_THRESHOLD 128 #endif #ifdef WIN32 # define bzero(a,len){\ int _i;\ char *_c = (char*)(a);\ for(_i=0; _i< (int)(len); _i++)_c[_i]=(char)0;\ } # define bcopy(a,b,len) memcpy(b,a,len) #else # if HAVE_STRINGS_H # include # endif #endif #if defined(CRAY_XT) || defined(CRAY_T3E) || defined(FUJITSU)\ || defined(HITACHI) || (defined(QUADRICS) && !defined(ELAN_ACC)) #define ACC_COPY #endif #ifndef FATR # if defined(WIN32) && !defined(__MINGW32__) # define FATR __stdcall # else # define FATR # endif #endif #define MAX_PROC 8096 #define MAX_STRIDE_LEVEL ARMCI_MAX_STRIDE_LEVEL /* msg tag ARMCI uses in collective ops */ #define ARMCI_TAG 30000 #ifndef EXTRA_MSG_BUFLEN_DBL # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL) #else # define RESERVED_BUFLEN ((sizeof(request_header_t)>>3)+3*MAX_STRIDE_LEVEL +\ EXTRA_MSG_BUFLEN_DBL) #endif #if defined(HITACHI) # define BUFSIZE ((0x50000) * sizeof(double)) #else /* packing algorithm for double complex numbers requires even number */ # ifdef MSG_BUFLEN_DBL # define BUFSIZE_DBL (MSG_BUFLEN_DBL - RESERVED_BUFLEN) # else # define BUFSIZE_DBL 32768 # endif # define BUFSIZE (BUFSIZE_DBL * sizeof(double)) #endif /* note opcodes must be lower than ARMCI_ACC_OFF !!! */ #define PUT 1 #define GET 2 #define RMW 3 #define LOCK 4 #define UNLOCK 5 #define ACK 6 /* must fit in two bits, see msginfo->format in request.h */ #define STRIDED 1 #define VECTOR 2 extern int armci_me, armci_nproc; extern int _armci_initialized; #ifdef HITACHI extern int sr8k_server_ready; extern double *armci_internal_buffer; #else #if !defined(THREAD_SAFE) extern double armci_internal_buffer[BUFSIZE_DBL]; #endif #endif extern void armci_shmem_init(); extern void armci_krmalloc_init_localmem(); #if 0 extern void armci_die(char *msg, int code); extern void armci_die2(char *msg, int code1, int code2); #endif extern void armci_write_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern void armci_read_strided(void *ptr, int stride_levels, int stride_arr[], int count[], char *buf); extern int armci_op_strided(int op, void* scale, int proc,void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int lockit,armci_ihdl_t nb_handle); extern int armci_copy_vector(int op, /* operation code */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_acc_vector(int op, /* operation code */ void *scale, /* scale factor */ armci_giov_t darr[],/* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int armci_pack_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *hdr, int fit_level, int nb, int last,armci_ihdl_t nb_handle); extern int armci_pack_vector(int op, void *scale, armci_giov_t darr[],int len,int proc,armci_ihdl_t nb_handle); extern void armci_lockmem(void *pstart, void* pend, int proc); extern void armci_unlockmem(int proc); extern int armci_acc_copy_strided(int optype, void* scale, int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels); extern void armci_vector_to_buf(armci_giov_t darr[], int len, void* buf); extern void armci_vector_from_buf(armci_giov_t darr[], int len, void* buf); extern void armci_init_fence(); extern void armci_finalize_fence(); #ifdef SOCKETS #ifdef SERVER_THREAD extern void armci_create_server_thread ( void* (* func)(void*) ); extern void armci_terminate_server_thread(); #else extern void armci_create_server_process ( void* (* func)(void*) ); extern void armci_wait_server_process(); extern void RestoreSigChldDfl(); #endif #endif #if defined(MPI_SPAWN) || defined(MPI_MT) extern void armci_create_server_MPIprocess (); #endif #define ARMCI_MAX(a,b) (((a)>(b))?(a):(b)) #define ARMCI_MIN(a,b) (((a)<(b))?(a):(b)) #define ARMCI_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define ARMCI_ACC(op) ((((int)(op))-ARMCI_ACC_INT)>=0) #ifdef CLUSTER extern char *_armci_fence_arr; #ifdef THREAD_SAFE # define FENCE_ARR(p_) (_armci_fence_arr[ARMCI_THREAD_IDX*armci_nproc+p_]) #else # define FENCE_ARR(p_) (_armci_fence_arr[p_]) #endif # define SAMECLUSNODE(p)\ ( ((p) <= armci_clus_last) && ((p) >= armci_clus_first) ) #elif defined(__crayx1) # define SAMECLUSNODE(p) 1 #elif defined(ARMCIX) # define SAMECLUSNODE(p) 0 #else # define SAMECLUSNODE(p) ((p)==armci_me) #endif #if defined(LAPI) || defined(ELAN_ACC) # define ORDER(op,proc)\ if( proc == armci_me || ( ARMCI_ACC(op) && ARMCI_ACC(PENDING_OPER(proc))) );\ else FENCE_NODE(proc) # define UPDATE_FENCE_INFO(proc_) #elif defined(CLUSTER) && !defined(QUADRICS) && !defined(HITACHI)\ && !defined(CRAY_SHMEM) && !defined(PORTALS) # define ORDER(op_,proc_)\ if(!SAMECLUSNODE(proc_) && op_ != GET )FENCE_ARR(proc_)=1 # define UPDATE_FENCE_INFO(proc_) if(!SAMECLUSNODE(proc_))FENCE_ARR(proc_)=1 #else # if defined(GM) && defined(ACK_FENCE) # define ORDER(op,proc) # else # define ORDER(op,proc) if(proc != armci_me) FENCE_NODE(proc) # endif # define UPDATE_FENCE_INFO(proc_) #endif typedef struct { int ptr_array_len; int bytes; void **ptr_array; } armci_riov_t; /*\ consider up to HOSTNAME_LEN characters in host name * we can truncate names of the SP nodes since it is not used * to establish socket communication like on the networks of workstations * SP node names must be distinct within first HOSTNAME_LEN characters \*/ #if defined(LAPI) && defined(AIX) # define HOSTNAME_TRUNCATE # define HOSTNAME_LEN 12 #else # define HOSTNAME_LEN 64 #endif typedef struct { int master; int nslave; char hostname[HOSTNAME_LEN]; } armci_clus_t; extern armci_clus_t *armci_clus_info; extern int armci_nclus, armci_clus_me, armci_master; extern int armci_clus_first, armci_clus_last; extern int armci_clus_id(int p); extern void armci_init_clusinfo(); extern void armci_set_mem_offset(void *ptr); extern int _armci_terminating; extern void armci_acc_2D(int op, void* scale, int proc, void *src_ptr, void *dst_ptr, int bytes, int cols, int src_stride, int dst_stride, int lockit); extern void armci_lockmem_scatter(void *ptr_array[], int len, int bytes, int p); extern void armci_generic_rmw(int op, void *ploc, void *prem, int extra, int p); extern unsigned long armci_max_region(); extern void armci_dispatch_strided(void *ptr, int stride_arr[], int count[], int strides, int fit_level, int nb, int bufsize, void (*fun)(void*,int*,int*,int,void*), void *arg); extern void armci_msg_gop_init(); extern void armci_msg_gop_finalize(); extern void armci_util_spin(int n, void *notused); #if defined(SYSV) || defined(WIN32) extern void armci_shmem_init(); extern void armci_set_shmem_limit_per_core(unsigned long shmemlimit); extern void armci_set_shmem_limit_per_node(int nslaves); extern void armci_set_shmem_limit(unsigned long shmemlimit); #endif #define ALIGN_PTR_LONG(type, x) if( ((long)(x)) % sizeof(long)) { long _y = (long)(x);\ if(sizeof(long)==8){_y>>=3; _y<<=3; }\ else { _y>>=2; _y<<=2; }\ _y += sizeof(long); (x) = (type*)_y; } #define SIXTYFOUR 64 #define ALIGN64ADD(buf) (SIXTYFOUR-(((ssize_t)(buf))%SIXTYFOUR)) #define ALIGNLONGADD(buf) ((((ssize_t)(buf))%sizeof(long))?(sizeof(long)-(((ssize_t)(buf))%sizeof(long))):0) #define SET 1 #define UNSET 0 extern int armci_agg_save_strided_descriptor(void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_giov_descriptor(armci_giov_t darr[], int len, int proc, int op, armci_ihdl_t nb_handle); extern int armci_agg_save_descriptor(void *src, void *dst, int bytes, int proc, int op, int is_registered_put, armci_ihdl_t nb_handle); extern void armci_agg_complete(armci_ihdl_t nb_handle, int condition); extern armci_hdl_t *armci_set_implicit_handle (int op, int proc); extern int armci_getnumcpus(void); extern long armci_util_long_getval(long* p); extern int armci_util_int_getval(int* p); extern void armci_region_register_shm(void *start, long size); extern void armci_region_register_loc(void *start, long size); extern void armci_region_clus_record(int node, void *start, long size); extern void armci_region_init(); extern int armci_region_clus_found(int node, void *start, int size); extern int armci_region_loc_found(void *start, int size); extern int armci_region_both_found(void *loc, void *rem, int size, int node); #ifdef REGIONS_REQUIRE_MEMHDL extern int get_armci_region_local_hndl(void *loc, int node, ARMCI_MEMHDL_T **loc_memhdl); #endif extern void armci_region_exchange(void *start, long size); extern void cpu_yield(); #ifdef ALLOW_PIN extern void armci_global_region_exchange(void *, long); #endif /* -------------------- ARMCI Groups ---------------------- */ /* data structure that caches a group's attribute */ #ifdef BGML #define PCLASS 3 #endif #ifdef MSG_COMMS_MPI typedef int ARMCI_Datatype; extern int ATTR_KEY; /* attribute key */ /* #define ARMCI_GROUP /\*Generic ARMCI implementation*\/ */ typedef struct { armci_clus_t *grp_clus_info; int grp_me; /* my group id */ int grp_nclus; /* number of cluster nodes */ int grp_clus_me; /* my cluster node id */ int mem_offset; /* memory offset */ #ifdef ARMCI_GROUP int nproc; /* #procs in this group*/ int *proc_list; /* Ids of procs in this group (w.r.t. MPI_COMM_WORLD)*/ #endif }armci_grp_attr_t; #include "mpi.h" /**dup of MPI_COMM_WORLD for internal MPI communication*/ extern MPI_Comm ARMCI_COMM_WORLD; typedef MPI_Comm ARMCI_Comm; typedef struct { #ifndef ARMCI_GROUP MPI_Comm icomm; MPI_Group igroup; #endif armci_grp_attr_t grp_attr; }ARMCI_iGroup; armci_grp_attr_t *ARMCI_Group_getattr(ARMCI_Group *grp); extern void armci_group_init(); extern void armci_group_finalize(); extern ARMCI_iGroup* armci_get_igroup_from_group(ARMCI_Group *group); #endif /* ifdef MSG_COMMS_MPI */ /* -------------------------------------------------------- */ /* ------------ ARMCI Chekcpointing/Recovery -------------- */ #ifdef ENABLE_CHECKPOINT extern int armci_init_checkpoint(); extern void armci_create_ckptds(armci_ckpt_ds_t *ckptds, int count); extern int armci_icheckpoint_init(char *filename, ARMCI_Group *grp, int savestack, int saveheap, armci_ckpt_ds_t *ckptds); extern int armci_icheckpoint(int rid); extern int armci_irecover(int rid,int iamreplacement); extern void armci_icheckpoint_finalize(int rid); #endif /* ifdef ENABLE_CHECKPOINT */ /* -------------------------------------------------------- */ #ifdef BGML #define ARMCI_CRITICAL_SECTION_ENTER() BGML_CriticalSection_enter(); #define ARMCI_CRITICAL_SECTION_EXIT() BGML_CriticalSection_exit(); #else #define ARMCI_CRITICAL_SECTION_ENTER() #define ARMCI_CRITICAL_SECTION_EXIT() #endif #endif ga-5-4/armci/src/include/fujitsu-vpp.h0000644000175000017500000001422312662210406016003 0ustar mbamba/* This file "fujitsu-vpp.h" #defines common set of macros used in * the Global Array and TCGMSG-MPI ports to Fujitsu VX and VPP systems. * * Author: Jarek Nieplocha * Organization: Pacific Northwest National Laboratory, Richland, WA 99552 * Date: 08.21.1997 * History: 11.27.1997 added optimized 2-D array copy macros * 03.10.2000 Both strided operations made optional * * Notes: * 1. This file contains calls to an undisclosed Fujitsu MPlib library and * is NOT intended for public distribution. */ #ifndef _FUJITSU_VPP_H #define _FUJITSU_VPP_H #ifdef __sparc /* the AP3000 version is limited */ # include "/opt/FSUNaprun/include/vpp_mplib.h" # define VPP_NbWrite VPP_Write #else /* specify full path to MPlib include file (here is my account on Fecit VX)*/ # include "/home/jniep/include/mplib.h" #endif #define TOTAL_NUM_SEM 128 /* number of MPlib semaphores per node */ #define NUM_SEM 16 /* we will use only that+1 many semaphores */ #define SEM_BASE (TOTAL_NUM_SEM-NUM_SEM-2) #define NXTV_SEM SEM_BASE+NUM_SEM+1 /*nxtval server semaphore in tcgmsg-mpi */ #define MPLIB_TERMINATE {\ fflush(stdout);sleep(1);\ fprintf(stderr,"%d: MPlib call failed: %s in line %d compiled on %s\n",\ VPP_MyPe(),__FILE__,__LINE__,__DATE__);\ fprintf(stdout,"%d: MPlib call failed: %s in line %d compiled on %s\n",\ VPP_MyPe(),__FILE__,__LINE__,__DATE__);\ fflush(stdout); sleep(1);\ VPP_Abort();\ } #define NATIVE_LOCK0(proc,mtx) if(VPP_SemWait((PROC)(proc),(mtx)))MPLIB_TERMINATE #define NATIVE_UNLOCK0(proc,mtx) if(VPP_SemPost((PROC)(proc),(mtx)))MPLIB_TERMINATE #define NAT_LOCK(proc) if(VPP_SemWait((PROC)(proc),SEM_BASE))MPLIB_TERMINATE #define NAT_UNLOCK(proc) if(VPP_SemPost((PROC)(proc),SEM_BASE))MPLIB_TERMINATE #define NATIVE_BARRIER VPP_Barrier #define NATIVE_BARRIER__() MPI_Barrier(MPI_COMM_WORLD) /**************************** MEMORY COPY macros ************************/ /*copy n words from remote memory (proc) at (src) to local memory (dst) */ #define CopyElemFrom(src,dst,n,proc) \ if(VPP_Read((PROC)(proc),(ADDRP) (src), (ADDRP)(dst), n*sizeof(long)))\ MPLIB_TERMINATE /*copy n words to remote memory (proc) at (dst) from local memory (src) */ #define CopyElemTo(src,dst,n,proc) \ if(VPP_Write((PROC)(proc),(ADDRP)(dst),(ADDRP) (src),n*sizeof(long)))\ MPLIB_TERMINATE /*copy n bytes from remote memory (proc) at (src) to local memory (dst) */ #define CopyFrom(src,dst,n,proc) \ if(VPP_Read((PROC)(proc),(ADDRP) (src), (ADDRP)(dst), n))\ MPLIB_TERMINATE /*copy n bytes o remote memory (proc) at (dst) from local memory (src) */ #define CopyTo(src,dst,n,proc) \ if(VPP_Write((PROC)(proc),(ADDRP)(dst),(ADDRP) (src),n ))\ MPLIB_TERMINATE /* Memory copy for 2-dimensional array patches between local and remote memory: * we use nonblocking read/write operations followed by a blocking read/write * of 1 byte to force completion of outstanding nonblocking operations. * This works because of the "in-order" rule for remote memory operations. * This code is using byte- rather than word- interface. */ #ifdef VPP_STRIDED_WRITE # define CopyPatchTo(src, ld_src, dst, ld_dst, blocks, bytes, proc){\ if(VPP_WriteBothStrided((PROC)(proc), (ADDRP)dst, (ADDRP)src,\ bytes, ld_dst, ld_src, bytes*blocks))MPLIB_TERMINATE; } #else # define CopyPatchTo(src, ld_src, dst, ld_dst, blocks, bytes, proc){\ int _iii, _stat=0, _bytes2copy=1;\ char *ps=(char*)src, *pd=(char*)dst;\ if((blocks)>1)for (_iii=0;_iii<(blocks);_iii++){\ _stat += VPP_NbWrite((PROC)(proc),(ADDRP)pd,(ADDRP)ps,(bytes));\ ps += (ld_src);\ pd += (ld_dst);\ }else _bytes2copy=(bytes);\ _stat += VPP_Write((PROC)(proc),(ADDRP)(dst),(ADDRP)(src),_bytes2copy);\ if(_stat)MPLIB_TERMINATE; } #endif #ifdef VPP_STRIDED_READ # define CopyPatchFrom(src, ld_src, dst, ld_dst, blocks, _bytes, proc){\ if(VPP_ReadBothStrided((PROC)(proc), (ADDRP)src, (ADDRP)dst,\ _bytes, ld_src, ld_dst, _bytes*blocks))MPLIB_TERMINATE;} #else # define CopyPatchFrom(src, ld_src, dst, ld_dst, blocks, _bytes, proc){\ int _iii, _stat=0, _bytes2copy=1;\ char *ps=(char*)src, *pd=(char*)dst;\ if((blocks)>1)for (_iii=0;_iii<(blocks);_iii++){\ _stat += VPP_Read((PROC)(proc),(ADDRP)ps,(ADDRP)pd,(_bytes));\ ps += (ld_src);\ pd += (ld_dst);\ }else _bytes2copy=(_bytes);\ _stat += VPP_Read((PROC)(proc),(ADDRP)(src),(ADDRP)(dst),_bytes2copy);\ if(_stat)MPLIB_TERMINATE; } #endif #if 0 #define MAX_IDS 10 static DRWD *_id[MAX_IDS]; #define CopyPatchFromXX(src, ld_src, dst, ld_dst, blocks, _bytes, proc){\ int _iii, _stat=0, _idx;\ char *ps=(char*)src, *pd=(char*)dst;\ printf("lds=%d ldd=%d bl=%d bytes=%d proc=%d\n",ld_src,ld_dst,blocks, _bytes, proc); fflush(stdout);\ if((blocks)>1){\ for (_iii=0; _iii<(blocks); _iii++){\ _idx = _iii%MAX_IDS;\ if(_iii >= MAX_IDS)_stat += VPP_ReadDone(_id[_idx]);\ _id[_idx]=VPP_StartRead((PROC)(proc),(ADDRP)ps,(ADDRP)pd,(_bytes));\ ps += (ld_src);\ pd += (ld_dst);\ }\ for (_idx=0; _idx < (blocks) && _idx < MAX_IDS; _idx++){\ _stat += VPP_ReadDone(_id[_idx]);\ }\ }else _stat = VPP_Read((PROC)(proc),(ADDRP)(src),(ADDRP)(dst),(_bytes));\ if(_stat)MPLIB_TERMINATE;\ } #define CopyPatchFromYY(src, ld_src, dst, ld_dst, blocks, _bytes, proc){\ int _iii, _stat=0, _bytes2copy=1;\ char *ps=(char*)src, *pd=(char*)dst;\ if((blocks)>1) { for (_iii=0;_iii<(blocks);_iii++){\ _id[0]= VPP_StartRead((PROC)(proc),(ADDRP)ps,(ADDRP)pd,(_bytes));\ ps += (ld_src);\ pd += (ld_dst);\ }\ _stat += VPP_ReadDone(_id[0]);\ }else _bytes2copy=(_bytes);\ _stat += VPP_Read((PROC)(proc),(ADDRP)(src),(ADDRP)(dst),_bytes2copy);\ if(_stat)MPLIB_TERMINATE;\ } #endif #endif ga-5-4/armci/src/include/armci_shmem.h0000644000175000017500000000156112662210406015774 0ustar mbamba#ifndef _SHMEM_H_ #define _SHMEM_H_ extern void Set_Shmem_Limit(unsigned long shmemlimit); extern void Delete_All_Regions(); extern char* Create_Shared_Region(long idlist[], long size, long *offset); extern char* Attach_Shared_Region(long idlist[], long size, long offset); extern void Free_Shmem_Ptr(long id, long size, char* addr); extern long armci_shmem_reg_size(int i, long id); extern char* armci_shmem_reg_ptr(int i); #ifdef MULTI_CTX extern void armci_nattach_preallocate_info(int* segments, int *segsize); #endif #ifdef HITACHI #define FIELD_NUM 0x1 #endif #if defined(QUADRICS) && defined(MULTI_CTX) #define POST_ALLOC_CHECK(temp,size) armci_checkMapped(temp,size); #else #define POST_ALLOC_CHECK(temp,size) ; #endif #define MAX_REGIONS 64 #if defined(WIN32) #define SHMIDLEN 3 #else #define SHMIDLEN (MAX_REGIONS + 2) #endif #define IDLOC (SHMIDLEN - 3) #endif ga-5-4/armci/src/include/shmalloc.h0000644000175000017500000000325712662210406015316 0ustar mbamba#ifndef SHMALLOC_H #define SHMALLOC_H /* Returns data aligned on a quad boundary. Even if the request size is zero it returns a non-zero pointer. */ extern char *armci_shmalloc(size_t size); /* void shfree(char *pointer) Frees memory allocated by armci_shmalloc(). Ignores NULL pointers but must not be called twice for the same pointer or called with non-shmalloc'ed pointers */ extern void shfree(); /* void shmalloc_print_stats(); Print to standard output the usage statistics ... a wrapper for shmalloc_stats(); */ extern void shmalloc_print_stats(); /* void shmalloc_stats(size_t *total, long *nchunk, size_t *inuse, size_t *maxuse, long *nfrags, long *nmcalls, long *nfcalls) Returns the statistics about memory usage. total = total amount of memory got from system in bytes nchunk = total no. of chunks of memory got from the system inuse = amount of memory application is using in bytes maxuse = maximum value of inuse to dat nfrags = no. of fragments that memory is split into nmcalls= no. of calls to shmalloc nfcalls= no. of calls to shfree */ extern void shmalloc_stats(); /* void shmalloc_debug(int code) Enable debuging code = 0 ... no debugging code != 0 ... entire heap is verified on every call */ extern void shmalloc_debug(); /* Verify the heap. */ extern void shmalloc_verify(); /* size ... minimum size in bytes that chunks of data should be obtained from the system in. The default is 131072. maxsize ... maximum amount of memory that should be obtained from the system. The default is 12,582,912. */ extern void shmalloc_request(size_t size, size_t maxsize); #endif ga-5-4/armci/src/include/message.h0000644000175000017500000000645012662210406015136 0ustar mbamba#ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define ARMCI_INT -99 #define ARMCI_LONG -101 #define ARMCI_LONG_LONG -102 #define ARMCI_FLOAT -306 #define ARMCI_DOUBLE -307 #define SCOPE_ALL 333 #define SCOPE_NODE 337 #define SCOPE_MASTERS 339 #define armci_msg_sel(x,n,op,type,contribute)\ armci_msg_sel_scope(SCOPE_ALL,(x),(n),(op),(type),(contribute)) #if 0 #define armci_msg_bcast(buffer, len, root)\ armci_msg_bcast_scope(SCOPE_ALL, (buffer), (len), (root)) #else extern void armci_msg_bcast(void *buffer, int len, int root); #endif extern void armci_msg_sel_scope(int scope, void *x, int n, char* op, int type, int contribute); extern void armci_msg_bcast_scope(int scope, void* buffer, int len, int root); extern void armci_msg_brdcst(void* buffer, int len, int root); extern void armci_msg_snd(int tag, void* buffer, int len, int to); extern void armci_msg_rcv(int tag, void* buffer, int buflen, int *msglen, int from); extern int armci_msg_rcvany(int tag, void* buffer, int buflen, int *msglen); extern void armci_msg_reduce(void *x, int n, char *op, int type); extern void armci_msg_reduce_scope(int scope, void *x, int n, char *op, int type); extern void armci_msg_gop_scope(int scope, void *x, int n, char* op, int type); extern void armci_msg_igop(int *x, int n, char* op); extern void armci_msg_lgop(long *x, int n, char* op); extern void armci_msg_llgop(long long *x, int n, char* op); extern void armci_msg_fgop(float *x, int n, char* op); extern void armci_msg_dgop(double *x, int n, char* op); extern void armci_exchange_address(void *ptr_ar[], int n); extern void armci_msg_barrier(); extern void armci_msg_bintree(int scope, int* Root, int *Up, int *Left, int *Right); extern int armci_msg_me(); extern int armci_msg_nproc(); extern void armci_msg_abort(int code); extern void armci_msg_init(int *argc, char ***argv); extern void armci_msg_finalize(); extern double armci_timer(); extern void armci_msg_clus_brdcst(void *buf, int len); extern void armci_msg_clus_igop(int *x, int n, char* op); extern void armci_msg_clus_fgop(float *x, int n, char* op); extern void armci_msg_clus_lgop(long *x, int n, char* op); extern void armci_msg_clus_llgop(long long *x, int n, char* op); extern void armci_msg_clus_dgop(double *x, int n, char* op); extern void armci_msg_group_gop_scope(int scope, void *x, int n, char* op, int type, ARMCI_Group *group); extern void armci_msg_group_igop(int *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_lgop(long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_llgop(long long *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_fgop(float *x, int n, char* op,ARMCI_Group *group); extern void armci_msg_group_dgop(double *x, int n,char* op,ARMCI_Group *group); extern void armci_exchange_address_grp(void *ptr_arr[], int n, ARMCI_Group *group); extern void armci_msg_group_barrier(ARMCI_Group *group); extern void armci_msg_group_bcast_scope(int scope, void *buf, int len, int root, ARMCI_Group *group); extern void armci_grp_clus_brdcst(void *buf, int len, int grp_master, int grp_clus_nproc,ARMCI_Group *mastergroup); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif ga-5-4/armci/src/include/parmci.h0000644000175000017500000001066512662210406014770 0ustar mbamba#ifndef _PARMCI_H_ #define _PARMCI_H_ #include "armci.h" extern int PARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc); extern int PARMCI_AccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); extern int PARMCI_AccV(int op, void *scale, armci_giov_t * darr, int len, int proc); extern void PARMCI_AllFence(); extern void PARMCI_Barrier(); extern int PARMCI_Create_mutexes(int num); extern int PARMCI_Destroy_mutexes(); extern void PARMCI_Fence(int proc); extern void PARMCI_Finalize(); extern int PARMCI_Free_local(void *ptr); extern int PARMCI_Free(void *ptr); extern int PARMCI_GetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); extern double PARMCI_GetValueDouble(void *src, int proc); extern float PARMCI_GetValueFloat(void *src, int proc); extern int PARMCI_GetValueInt(void *src, int proc); extern long PARMCI_GetValueLong(void *src, int proc); extern int PARMCI_GetV(armci_giov_t * darr, int len, int proc); extern int PARMCI_Get(void *src, void *dst, int bytes, int proc); extern int PARMCI_Init(); extern int PARMCI_Init_args(int *argc, char ***argv); extern int PARMCI_Initialized(); extern void PARMCI_Lock(int mutex, int proc); extern void* PARMCI_Malloc_local(armci_size_t bytes); extern int PARMCI_Malloc(void **ptr_arr, armci_size_t bytes); extern void* PARMCI_Memat(armci_meminfo_t * meminfo, long offset); extern void PARMCI_Memget(size_t bytes, armci_meminfo_t * meminfo, int memflg); extern int PARMCI_NbAccS(int optype, void *scale, void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbAccV(int op, void *scale, armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbGetS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbGetV(armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbGet(void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbPutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbPutValueDouble(double src, void *dst, int proc, armci_hdl_t* nb_handle); extern int PARMCI_NbPutValueFloat(float src, void *dst, int proc, armci_hdl_t* nb_handle); extern int PARMCI_NbPutValueInt(int src, void *dst, int proc, armci_hdl_t* nb_handle); extern int PARMCI_NbPutValueLong(long src, void *dst, int proc, armci_hdl_t* nb_handle); extern int PARMCI_NbPutV(armci_giov_t * darr, int len, int proc, armci_hdl_t * nb_handle); extern int PARMCI_NbPut(void *src, void *dst, int bytes, int proc, armci_hdl_t * nb_handle); extern int PARMCI_Put_flag(void *src, void *dst, int bytes, int *f, int v, int proc); extern int PARMCI_PutS_flag_dir(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc); extern int PARMCI_PutS_flag(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int *flag, int val, int proc); extern int PARMCI_PutS(void *src_ptr, int *src_stride_arr, void *dst_ptr, int *dst_stride_arr, int *count, int stride_levels, int proc); extern int PARMCI_PutValueDouble(double src, void *dst, int proc); extern int PARMCI_PutValueFloat(float src, void *dst, int proc); extern int PARMCI_PutValueInt(int src, void *dst, int proc); extern int PARMCI_PutValueLong(long src, void *dst, int proc); extern int PARMCI_PutV(armci_giov_t * darr, int len, int proc); extern int PARMCI_Put(void *src, void *dst, int bytes, int proc); extern int PARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc); extern int PARMCI_Test(armci_hdl_t * nb_handle); extern void PARMCI_Unlock(int mutex, int proc); extern int PARMCI_WaitAll(); extern int PARMCI_Wait(armci_hdl_t * nb_handle); extern int PARMCI_WaitProc(int proc); extern void parmci_msg_barrier(); extern void parmci_msg_group_barrier(ARMCI_Group *group); extern int parmci_notify(int proc); extern int parmci_notify_wait(int proc, int *pval); #endif /* _PARMCI_H_ */ ga-5-4/armci/src/include/iterator.h0000644000175000017500000000260412662210406015340 0ustar mbamba/** @file iterator.h * @author Sriram Krishnamoorthy * @brief Stride iterator. * An iterator for the stride descriptor to reuse common traversal * functionality. More functionality related to the strided * descriptor reusable across files will be extracted here as well. */ #ifndef _STRIDE_INFO_H_ #define _STRIDE_INFO_H_ #include "armci.h" /*for ARMCI_MAX_STRIDE_LEVEL and dassert*/ #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif typedef struct { char *base_ptr; int stride_levels; int stride_arr[ARMCI_MAX_STRIDE_LEVEL]; int seg_count[ARMCI_MAX_STRIDE_LEVEL+1]; int size, pos, itr[ARMCI_MAX_STRIDE_LEVEL]; } stride_info_t; void armci_stride_info_init(stride_info_t *sinfo, void *base_ptr, int stride_levels, const int *stride_arr, const int *seg_count); void armci_stride_info_destroy(stride_info_t *sinfo); int armci_stride_info_count(stride_info_t *sinfo); int armci_stride_info_pos(stride_info_t *sinfo); void armci_stride_info_next(stride_info_t *sinfo); void *armci_stride_info_seg_ptr(stride_info_t *sinfo); int armci_stride_info_seg_size(stride_info_t *sinfo); int armci_stride_info_seg_off(stride_info_t *sinfo); int armci_stride_info_size(stride_info_t *sinfo); int armci_stride_info_has_more(stride_info_t *sinfo); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /*_STRIDE_INFO_H_*/ ga-5-4/armci/src/include/signaltrap.h0000644000175000017500000000054612662210406015656 0ustar mbamba#ifndef _SIGNALTRAP_H_ #define _SIGNALTRAP_H_ #ifdef SYSV extern void ARMCI_ChildrenTrapSignals(); extern void ARMCI_ParentTrapSignals(); extern void ARMCI_ParentRestoreSignals(); extern void ARMCI_RestoreSignals(); #else # define ARMCI_ChildrenTrapSignals() # define ARMCI_ParentTrapSignals() # define ARMCI_ParentRestoreSignals() #endif #endif ga-5-4/armci/src/include/semaphores.h0000644000175000017500000000231412662210406015653 0ustar mbamba#ifndef _SEMAPHORES_H_ #define _SEMAPHORES_H_ #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_IPC_H # include #endif #if HAVE_SYS_SEM_H # include #endif #if !HAVE_UNION_SEMUN union semun { int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */ unsigned short int *array; /* array for GETALL, SETALL */ struct seminfo *__buf; /* buffer for IPC_INFO */ }; #endif /* how many semaphores are available ? */ #ifndef SEMMSL # ifdef AIX # define SEMMSL 8094 # else # define SEMMSL 16 # endif #endif /* on HPUX 10.2 SEMMSL is much bigger than realistically we can allocate */ #ifdef HPUX #undef SEMMSL #define SEMMSL 64 #endif extern struct sembuf sops; extern int semaphoreID; int semop(); #define ALL_SEMS -1 #define _P_code -1 #define _V_code 1 #define P_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _P_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } #define V_semaphore(s) \ {\ sops.sem_num = (s);\ sops.sem_op = _V_code;\ sops.sem_flg = 0; \ semop(semaphoreID,&sops,1);\ } typedef int lockset_t; #endif ga-5-4/armci/src/include/asm-ppc.h0000644000175000017500000000671312662210406015054 0ustar mbamba/** Atomic instructions for ppc. To be populated as need arises. * @author Sriram Krishnamoorthy */ #ifndef __ATOMICS_PPC__ #define __ATOMICS_PPC__ #if HAVE_ASSERT_H # include #endif #define v4b (volatile unsigned int *) /* sriram's original asm (didn't work) */ static inline void atomic_exchange(void *val, void *ptr, int size) { int ret; assert(size==4); assert(sizeof(unsigned int)==4); assert((((unsigned)ptr)&3)==0); /*make sure it is 4-byte aligned*/ asm volatile( "loop: lwarx %[ret],0,%[ptr] \n\t" /*Load & reserve*/ " stwcx. %[val],0,%[ptr] \n\t" /*Store if still reserved*/ " bne- loop \n\t" /*Loop otherwise*/ : [ret]"=&r"(ret) : [val]"r"(*v4b(val)), [ptr]"r"(v4b(ptr)) : "memory", "cc" ); *v4b(val) = ret; } /* adapted from "Synchronising C/C++ and POWER" by Sarkar et al, appearing in * PLDI'12 */ static inline void acquire_spinlock(void *lock) { int temp; int free = 0; int held = 1; asm volatile( "0: lwarx %0,0,%3 \n" /*load-reserve lock into temp*/ " cmpw %1,%0 \n" /*lock is free?*/ " bne- 0b \n" /*loop if lock not free*/ " stwcx. %2,0,%3 \n" /*store if still reserved*/ " bne- 0b \n" /*loop if lost reservation*/ " isync \n" /*import barrier*/ : "+r"(temp) : "r"(free), "r"(held), "r"(lock) : "cr0", "memory" ); } /* adapted from "Synchronising C/C++ and POWER" by Sarkar et al, appearing in * PLDI'12 */ static inline void release_spinlock(void *lock) { int free = 0; assert(sizeof(unsigned int)==4); assert((((unsigned)lock)&3)==0); /*make sure it is 4-byte aligned*/ /* TODO: lwsync might not be strong enough, consider 'sync' */ asm volatile( "lwsync \n" /*export barrier*/ "stw %0,0(%1) \n" /*normal store to release lock*/ : : "r"(free), "r"(lock) : "memory" ); } /* adapted from "Synchronising C/C++ and POWER" by Sarkar et al, appearing in * PLDI'12 */ static inline int fetch_and_add(void *addr, int inc) { int ret; int tmp; asm volatile( "0: lwarx %0,0,%2 \n" /*load-reserve addr into tmp*/ " mr %1,%0 \n" /*copy tmp into ret*/ " add %0,%3,%0 \n" /*add inc to addr, store in addr*/ " stwcx. %0,0,%2 \n" /*store if still reserved*/ " bne- 0b \n" /*loop if lost reservation*/ : "+r"(tmp), "+r"(ret) : "r"(addr), "r"(inc) ); } /* from http://www.ibm.com/developerworks/rational/library/inline-assembly-C-Cpp-guide/index.html */ /* this did NOT work */ static inline int acquireLock(int *lock){ int returnvalue = 0; int lockval; asm volatile ( "0: lwarx %0,0,%2 \n" //load lock and reserve " cmpwi 0,%0,0 \n" //compare the lock value to 0 " bne 1f \n" //not 0 then exit function " ori %0,%0,1 \n" //set the lock to 1 " stwcx. %0,0,%2 \n" //try to acquire the lock " bne 0b \n" //reservation lost, try again " sync \n" //import barrier " ori %1,%1,1 \n" //set the return value to true "1: \n" //didn't get lock, return false : "+r" (lockval), "+r" (returnvalue) : "r"(lock) //parameter lock is an address : "cr0" ); //cmpwi, stwcx both clobber cr0 return returnvalue; } #undef v4b #endif /* __ATOMICS_PPC__ */ ga-5-4/armci/src/include/locks.h0000644000175000017500000001306512662210406014625 0ustar mbamba#ifndef _ARMCI_LOCKS_H_ #define _ARMCI_LOCKS_H_ #if HAVE_SYS_TYPES_H # include #endif #define MAX_LOCKS 1024 #define NUM_LOCKS MAX_LOCKS #if !(defined(PMUTEX) || defined(PSPIN) || defined(CYGNUS) || defined(CRAY_XT)) # include "spinlock.h" #endif #if !(defined(PMUTEX) || defined(PSPIN) || defined(SPINLOCK)) # error cannot run #endif #if (defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN) || defined(HITACHI)) && !(defined(BGML) || defined(DCMF)) # include "armci_shmem.h" typedef struct { long off; long idlist[SHMIDLEN]; } lockset_t; extern lockset_t lockid; #elif defined(BGML) || defined(DCMF) typedef int lockset_t; #endif #if defined(PMUTEX) # warning SPINLOCK: pthread_mutex_lock # include # include # define NAT_LOCK(x,p) pthread_mutex_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_mutex_t # define PAD_LOCK_T LOCK_T extern PAD_LOCK_T *_armci_int_mutexes; #elif defined(PSPIN) # warning SPINLOCK: pthread_spin_lock # include # include # define NAT_LOCK(x,p) pthread_spin_lock(_armci_int_mutexes +x) # define NAT_UNLOCK(x,p) pthread_spin_unlock(_armci_int_mutexes +x) # define LOCK_T pthread_spinlock_t # define PAD_LOCK_T LOCK_T extern PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) && defined(SGIALTIX) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x )) extern PAD_LOCK_T *_armci_int_mutexes; #elif defined(SPINLOCK) # define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) # define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)(_armci_int_mutexes+(x))) extern PAD_LOCK_T *_armci_int_mutexes; #elif defined(HITACHI) extern void armcill_lock(int mutex, int proc); extern void armcill_unlock(int mutex, int proc); # define LOCK_T int # define PAD_LOCK_T LOCK_T # define NAT_LOCK(x,p) armcill_lock((x),(p)) # define NAT_UNLOCK(x,p) armcill_unlock((x),(p)) extern PAD_LOCK_T *_armci_int_mutexes; #elif defined(SGI) # define SGI_SPINS 100 # include typedef struct { int id; ulock_t * lock_array[NUM_LOCKS]; }lockset_t; extern lockset_t lockset; # define NAT_LOCK(x,p) (void) uswsetlock(lockset.lock_array[(x)],SGI_SPINS) # define NAT_UNLOCK(x,p) (void) usunsetlock(lockset.lock_array[(x)]) #elif defined(CONVEX) # include typedef struct{ unsigned state; unsigned pad[15]; } lock_t; typedef int lockset_t; extern lock_t *lock_array; extern void setlock(unsigned * volatile lp); extern void unsetlock(unsigned * volatile lp); # define NAT_LOCK(x,p) (void) setlock(&lock_array[x].state) # define NAT_UNLOCK(x,p) (void) unsetlock(&lock_array[(x)].state) #elif defined(WIN32) typedef int lockset_t; extern void setlock(int); extern void unsetlock(int); # define NAT_LOCK(x,p) setlock(x) # define NAT_UNLOCK(x,p) unsetlock(x) #elif defined(CRAY_YMP) && !defined(__crayx1) # include typedef int lockset_t; extern lock_t cri_l[NUM_LOCKS]; # pragma _CRI common cri_l # define NAT_LOCK(x,p) t_lock(cri_l+(x)) # define NAT_UNLOCK(x,p) t_unlock(cri_l+(x)) #elif defined(CRAY_T3E) || defined(__crayx1) || defined(CATAMOUNT) || defined(CRAY_SHMEM) || defined(PORTALS) # include # if defined(CRAY) || defined(CRAY_XT) # include # endif # if defined(DECOSF) || defined(LINUX64) || defined(__crayx1) || defined(CATAMOUNT) # define _INT_MIN_64 (LONG_MAX-1) # endif # undef NUM_LOCKS # define NUM_LOCKS 4 static long armci_lock_var[4]={0,0,0,0}; typedef int lockset_t; # define INVALID (long)(_INT_MIN_64 +1) # define NAT_LOCK(x,p) while( shmem_swap(armci_lock_var+(x),INVALID,(p)) ) # define NAT_UNLOCK(x,p) shmem_swap(armci_lock_var+(x), 0, (p)) #elif defined(SYSV) && defined(LAPI) && defined(AIX) int **_armci_int_mutexes; # define NAT_LOCK(x,p) armci_lapi_lock(_armci_int_mutexes[armci_master]+(x)) # define NAT_UNLOCK(x,p) armci_lapi_unlock(_armci_int_mutexes[armci_master]+(x)) typedef int lockset_t; #elif defined(CYGNUS) typedef int lockset_t; # define NAT_LOCK(x,p) armci_die("does not run in parallel",0) # define NAT_UNLOCK(x,p) armci_die("does not run in parallel",0) #elif defined(LAPI) && !defined (LINUX) # include typedef int lockset_t; extern pthread_mutex_t _armci_mutex_thread; # define NAT_LOCK(x,p) pthread_mutex_lock(&_armci_mutex_thread) # define NAT_UNLOCK(x,p) pthread_mutex_unlock(&_armci_mutex_thread) #elif defined(FUJITSU) typedef int lockset_t; # include "fujitsu-vpp.h" #elif defined(SYSV) || defined(MACX) # include "semaphores.h" # undef NUM_LOCKS # define NUM_LOCKS ((MAX_LOCKS< SEMMSL) ? MAX_LOCKS:SEMMSL) # define NAT_LOCK(x,p) P_semaphore(x) # define NAT_UNLOCK(x,p) V_semaphore(x) # ifndef _LOCKS_C_ # define CreateInitLocks Sem_CreateInitLocks # define InitLocks Sem_InitLocks # define DeleteLocks Sem_DeleteLocks # endif #else # error #endif extern void CreateInitLocks(int num, lockset_t *id); extern void InitLocks(int num , lockset_t id); extern void DeleteLocks(lockset_t id); #ifdef FUJITSU # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(p); } #else # define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(x,p); } # define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(x,p); } #endif #endif /* _ARMCI_LOCKS_H_ */ ga-5-4/armci/src/include/asm-ia64.h0000644000175000017500000002004112662210406015023 0ustar mbamba/* Excerpt from: * * Implementing Spinlocks * on the Intel Itanium Architecture * and PA-RISC * * Tor Ekqvist and David Graves * * Version 1.0 * * June 30, 2003 * * Copyright Hewlett-Packard Company 2003 * * Notice * * The software examples and their documentation have not been subjected * quality control and are not a Hewlett-Packard Company product. This * information is provided as a guide to allow you to create your own * spinlock implementation, which you would maintain and own. * * The software and documentation is provided "as is". HP does not * warrant that the software or documentation is error free. HP * disclaims all warranties, express and implied, with regard to the * software and the documentation. HP specifically disclaims all * warranties of merchantability and fitness for a particular purpose. * * Hewlett-Packard Company will not in any event be liable for any * direct, indirect, special, incidental or consequential damages * (including lost profits) related to any use, reproduction, * modification, or distribution of the software or documentation. */ #include #define LOCKED 1 /* spinlock is locked */ #define UNLOCKED 0 /* spinlock is free */ #define LOCK_ERROR 2 /* spinlock is in a bad state */ /* Memory fence to be used, when consistency needs to be * guaranteed. */ #define MEMORY_FENCE _Asm_mf() /* Compile fence that can be used to make sure that the * compiler does not reorder memory operations around the * fence */ #define COMP_FENCE _Asm_fence(_UP_MEM_FENCE | _DOWN_MEM_FENCE) /* get_lock attempts to quickly get a spoinlock by doing a * atomic 'xchg' on the word containing the lock * If the lock attempt is successfull, the value * 'LOCKED' will be returened, indicating that thie lock * is now loked to me, the calling process * * Note, that the 'xchg' instruction will blindly set the * memory location to the 'LOCKED' state, even if the * lock word contains an illegal value! * * The xchg instruction always has the 'acquire' semantics, * so the necessary memory ordering is enforced by this * instruction. * * this function returns '1', if the lock was free, * '0' if the lock was not free. */ #define get_lock_1(lock) \ ( \ _Asm_xchg((_Asm_sz)_SZ_W, (int *)lock, \ (int)LOCKED, (_Asm_ldhint)_LDHINT_NONE) > 0 ? \ (int)UNLOCKED : (int)LOCKED \ ) /* free_lock_1 frees a spinlock by executing a ordered store * with the release semantics on the word containing the * lock. * * The only possible value of the memory location (int *)lock * is really 'LOCKED' when this macro is called, as the calling * process/thread should have obtained teh lock by a call to * 'get_lock', setting the lock to 'LOCKED'. * * Just to make sure, we check for the correct value, to make * sure that no other process or thread has messed up the * shared memory location containing the lock. */ #define free_lock(lock) \ ( \ ( *lock == LOCKED ) ? \ (_Asm_st_volatile((_Asm_sz)_SZ_W, \ (_Asm_sthint)_STHINT_NONE, \ (int *)lock, \ UNLOCKED ),UNLOCKED) : LOCK_ERROR \ ) /* A lock free macro using the 'fetchadd' instruction * to release the lock instead of a volatile store * This assumes, that a free lock is indicated by the * integer value '0' */ #define free_lock_fetchadd(lock) \ ( \ ( *lock == LOCKED ) ? \ (_Asm_fetchadd((_Asm_fasz)_SZ_W, (_Asm_sem)_SEM_REL, \ (int *)lock, -1, (_Asm_ldhint)_LDHINT_NONE ), UNLOCKED) \ : LOCK_ERROR \ ) /* Compile fence to use with the store to application * register, in order to make it possible for the * compiler to more efficiently schedule instructions */ #define FENCE \ (_Asm_fence)(_UP_CALL_FENCE | _UP_SYS_FENCE | \ _DOWN_CALL_FENCE | _DOWN_SYS_FENCE ) /* The cas_acq macro performs an atomic compare and * exchange instruction on a 64-bit memory location * If the compare succeedes, the value '1' is returned * otherwise a '0' is returned */ #define cas_acq(location, currvalue, newvalue) \ ( \ _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, \ (long)currvalue, FENCE), \ _Asm_cmpxchg((_Asm_sz)_SZ_D, (_Asm_sem)_SEM_ACQ, \ (long *)location, (long)newvalue, \ (_Asm_ldhint)_LDHINT_NONE) \ ) /* The cas_rel macro performs an atomic comapare and * exchange instruction on a 64-bit memory location. * If the compare succeedes, '1' is returned, otherwise * a '0' is returned. * The 'release' semantincs is used for the cmpxchg * instruction. */ #define cas_rel(location, currvalue, newvalue) \ ( \ _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, \ (long)currvalue, FENCE), \ _Asm_cmpxchg((_Asm_sz)_SZ_D, (_Asm_sem)_SEM_REL, \ (long *)location, (long)newvalue, \ (_Asm_ldhint)_LDHINT_NONE) \ ) /* The cas_mf macro performs an atomic compare and exchange * on a memory location. The insttruction is fenced by * a 'mf' instruction, making it exepsive to execute, * but safe to execute in situations, where it is * impossible to make a choice between the acquire and * releas semantics. */ #define cas_mf(location, currvalue, newvalue) \ ( \ _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, \ (long)currvalue, FENCE), \ _Asm_mf(), \ _Asm_cmpxchg((_Asm_sz)SZ_D, (_Asm_sem)_SEM_ACQ, \ (long *)location, (long)newvalue, \ (_Asm_ldhint)_LDHINT_NONE) \ ) /* The count_acq macro adds a value to the specified * memory location with acquire semantics. Only the * values 0,1,2,4,8 and 16 are supported (positive and * negative */ #define count_acq(location, value) \ ( _Asm_fetchadd( (_Asm_fasz)_FASZ_D, (_Asm_sem)_SEM_ACQ, \ (long *)location, -1, \ (_Asm_ldhint)_LDHINT_NONE ) \ ) /* The count_rel macro adds a value to the specified * memory location with release semantics. Only the * values 0,1,2,4,8 and 16 are supported (positive and * negative */ #define count_rel(location, value) \ ( _Asm_fetchadd( (_Asm_fasz)_FASZ_D, (_Asm_sem)_SEM_REL, \ (long *)location, (int)value, \ (_Asm_ldhint)_LDHINT_NONE ) \ ) /* The count_mf macro adds a value to the specified * memory location with a memory fence. Only the * values 0,1,2,4,8 and 16 are supported (positive and * negative */ #define count_mf(location, value) \ ( _Asm_mf(), \ _Asm_fetchadd( (_Asm_fasz)_FASZ_D, (_Asm_sem)_SEM_REL, \ (long *)location, (int)value, \ (_Asm_ldhint)_LDHINT_NONE \ ) /* spin_get tries to get the spinlock in the location defined * by the argument 'lock'. The number of spins to spin on the * lock before giving up is passed as the second argument * THe value of the spin count is dependent on your environment, * on a single CPY system, it is proabaly not worth spinning * at all */ __inline int spin_get(int *lock, int spin) { int i; for ( i = spin; i > 0; i-- ) { /* Test the lock before actually try to exchange it's value, * to reduce memory traffic for highly contended locks */ if (*lock == UNLOCKED && get_lock_1(lock) == LOCKED ) return LOCKED; } return UNLOCKED; } ga-5-4/armci/src/include/atomics-i386.h0000644000175000017500000000231612662210406015635 0ustar mbamba/** Atomic instructions for i386. To be populated as need arises. * @author Sriram Krishnamoorthy */ #ifndef __ATOMICS_I386__ #define __ATOMICS_I386__ #if HAVE_ASSERT_H # include #endif #define v4b (volatile unsigned int *) static inline void atomic_exchange(void *val, void *ptr, int size) { assert(size == 4); __asm__ __volatile__ ("xchgl %0, %1" : "=r"(*v4b(val)), "+m"(*v4b(ptr)) : "0"(*v4b(val)) : "memory"); } /*SK: fixme. only available in 486+. This breaks i386 compatibility. atomic: *(type*)ploc = *(type*)prem; *(type*)prem += extra*/ static inline void atomic_fetch_and_add(void *prem, void *ploc, int extra, int size) { int _a_temp; assert(size == 4); #if 0 *(int*)ploc = __sync_fetch_and_add((int*)prem, extra); #elif 0 __asm__ __volatile__ ("movq %2, %%rax; \ lock xaddl %0, (%%rax);" : "=r"(_a_temp) : "0"(extra), "m"((int*)prem) : "memory", "rax"); *(int *)ploc = _a_temp; #else __asm__ __volatile__ ("lock xaddl %0, (%2)" : "=r"(_a_temp) : "0"(extra), "r"((int*)prem) : "memory"); *(int *)ploc = _a_temp; #endif } #undef v4b #endif /*__ATOMICS_I386__*/ ga-5-4/armci/src/include/armci.h0000644000175000017500000004154112662210406014605 0ustar mbamba/* ARMCI header file */ #ifndef _ARMCI_H #define _ARMCI_H /* for size_t */ #include #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif extern int armci_sameclusnode(int proc); typedef struct { void **src_ptr_array; void **dst_ptr_array; int ptr_array_len; int bytes; } armci_giov_t; typedef long armci_size_t; extern int armci_notify(int proc); extern int armci_notify_wait(int proc,int *pval); extern int ARMCI_Init(void); /* initialize ARMCI */ extern int ARMCI_Init_args(int *argc, char ***argv); /* initialize ARMCI */ extern int ARMCI_Initialized(); extern void ARMCI_Barrier(void); /* ARMCI Barrier*/ extern int ARMCI_Put(void *src, void* dst, int bytes, int proc); extern int ARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc); /* On path for deprecation */ #define ARMCI_Put1(_s,_d,_b,_p) memcpy(_d,_s,_b), 0 extern int ARMCI_PutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag_dir( /* put with flag that uses direct put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutS_flag( void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of segments at each stride levels: count[0]=bytes*/ int stride_levels, /* number of stride levels */ int *flag, /* pointer to remote flag */ int val, /* value to set flag upon completion of data transfer */ int proc /* remote process(or) ID */ ); extern int ARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc); extern int ARMCI_AccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_Get(void *src, void* dst, int bytes, int proc); extern int ARMCI_GetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc /* remote process(or) ID */ ); extern int ARMCI_GetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_AccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc /* remote process(or) ID */ ); extern int ARMCI_PutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueFloat(float src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_PutValueDouble(double src,/* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc /* remote process (or) ID */ ); extern int ARMCI_GetValueInt(void *src, int proc); extern long ARMCI_GetValueLong(void *src, int proc); extern float ARMCI_GetValueFloat(void *src, int proc); extern double ARMCI_GetValueDouble(void *src, int proc); extern int ARMCI_Malloc(void* ptr_arr[], armci_size_t bytes); extern int ARMCI_Free(void *ptr); extern void* ARMCI_Malloc_local(armci_size_t bytes); extern int ARMCI_Free_local(void *ptr); extern int ARMCI_Same_node(int proc); extern void ARMCI_Finalize(); /* terminate ARMCI */ extern void ARMCI_Error(char *msg, int code); extern void ARMCI_Fence(int proc); extern void ARMCI_AllFence(void); extern int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc); extern void ARMCI_Cleanup(void); extern int ARMCI_Create_mutexes(int num); extern int ARMCI_Destroy_mutexes(void); extern void ARMCI_Lock(int mutex, int proc); extern void ARMCI_Unlock(int mutex, int proc); extern void ARMCI_Set_shm_limit(unsigned long shmemlimit); extern int ARMCI_Uses_shm(); extern void ARMCI_Copy(void *src, void *dst, int n); #define FAIL -1 #define FAIL2 -2 #define FAIL3 -3 #define FAIL4 -4 #define FAIL5 -5 #define FAIL6 -6 #define FAIL7 -7 #define FAIL8 -8 #define ARMCI_SWAP 10 #define ARMCI_SWAP_LONG 11 #define ARMCI_FETCH_AND_ADD 12 #define ARMCI_FETCH_AND_ADD_LONG 13 #define ARMCI_ACC_OFF 36 #define ARMCI_ACC_INT (ARMCI_ACC_OFF + 1) #define ARMCI_ACC_DBL (ARMCI_ACC_OFF + 2) #define ARMCI_ACC_FLT (ARMCI_ACC_OFF + 3) #define ARMCI_ACC_CPL (ARMCI_ACC_OFF + 4) #define ARMCI_ACC_DCP (ARMCI_ACC_OFF + 5) #define ARMCI_ACC_LNG (ARMCI_ACC_OFF + 6) #define ARMCI_MAX_STRIDE_LEVEL 8 /****************Error/termination macros************************/ /**Debug assert macro. To be used instead of assert for more user * informative and cleaner death. Also allows individualized * enabling/disabling of assert statements. * @param _enable Ignore this assertion if _enable==0 * @param _cond Condition to be evaluated (assert that it is true) * @param _plist Information to be printed using printf, should be * within parenthesis (eg., dassert(1,0,("%d:test n=%d\n",me,0)); * ). This is fed directly to printf. */ int dassertp_fail(const char *cond_string, const char *file, const char *func, unsigned int line, int code); void derr_printf(const char *format, ...); #undef dassertp #define dassertp(_enable,_cond,_plist) do { \ if((_enable) && !(_cond)) { \ derr_printf _plist; \ dassertp_fail(#_cond,__FILE__,FUNCTION_NAME,__LINE__,1); \ }} while(0) #undef dassertc #define dassertc(_enable,_cond,_plist,_code) do { \ if((_enable) && !(_cond)) { \ derr_printf _plist; \ dassertp_fail(#_cond,__FILE__,FUNCTION_NAME,__LINE__,_code); \ }} while(0) #undef dassert #define dassert(_enable,_cond) dassertp((_enable),(_cond),("")) #undef dassert1 #define dassert1(_enable,_cond,_ival) \ dassertp((_enable),(_cond),("%d: error ival=%d\n", \ armci_msg_me(),(int)(_ival))) #define armci_die(_msg,_code) dassertc(1,0, \ ("%d:%s: %d\n", armci_msg_me(),(_msg),(_code)),_code) #define armci_die2(_msg,_code1,_code2) dassertc(1,0, \ ("%d:%s: (%d,%d)\n",armci_msg_me(),(_msg),(_code1),(_code2)),_code1) /************ locality information **********************************************/ typedef int armci_domain_t; #define ARMCI_DOMAIN_SMP 0 /* SMP node domain for armci_domain_XXX calls */ extern int armci_domain_nprocs(armci_domain_t domain, int id); extern int armci_domain_id(armci_domain_t domain, int glob_proc_id); extern int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id); extern int armci_domain_my_id(armci_domain_t domain); extern int armci_domain_count(armci_domain_t domain); extern int armci_domain_same_id(armci_domain_t domain, int proc); /* PVM group * On CrayT3E: the default group is the global group which is (char *)NULL * It is the only working group. * On Workstations: the default group is "mp_working_group". User can set * the group name by calling the ARMCI_PVM_init (defined * in message.c) and passing the group name to the library. */ extern char *mp_group_name; /*********************stuff for non-blocking API******************************/ /*\ the request structure for non-blocking api. \*/ /*max of sizes for all platforms. Increase if any platform needs more*/ typedef struct{ int data[4]; /* tag, bufid, agg_flag, op, proc */ double dummy[72]; } armci_hdl_t; #define armci_req_t armci_hdl_t typedef int ARMCI_Group; extern void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out); extern void ARMCI_Group_create_child(int n, int *pid_list, ARMCI_Group *group_out, ARMCI_Group *group_parent); extern void ARMCI_Group_free(ARMCI_Group *group); extern int ARMCI_Group_rank(ARMCI_Group *group, int *rank); extern void ARMCI_Group_size(ARMCI_Group *group, int *size); extern void ARMCI_Group_set_default(ARMCI_Group *group); extern void ARMCI_Group_get_default(ARMCI_Group *group_out); extern void ARMCI_Group_get_world(ARMCI_Group *group_out); extern int ARMCI_Absolute_id(ARMCI_Group *group, int group_rank); extern int ARMCI_Uses_shm_grp(ARMCI_Group *group); extern int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes,ARMCI_Group *group); extern int ARMCI_Free_group(void *ptr, ARMCI_Group *group); extern int ARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbPutS( /* strided put */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccS( /* strided accumulate */ int optype, /* operation */ void *scale, /* scale factor x += scale*y */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle); extern int ARMCI_NbGetS( /* strided get */ void *src_ptr, /* pointer to 1st segment at source*/ int src_stride_arr[], /* array of strides at source */ void* dst_ptr, /* pointer to 1st segment at destination*/ int dst_stride_arr[], /* array of strides at destination */ int count[], /* number of units at each stride level count[0]=bytes */ int stride_levels, /* number of stride levels */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handler/*armci_non-blocking request handle*/ ); extern int ARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbAccV( int op, /* operation code */ void *scale, /* scaling factor for accumulate */ armci_giov_t darr[], /* descriptor array */ int len, /* length of descriptor array */ int proc, /* remote process(or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle*/ ); extern int ARMCI_NbPutValueInt(int src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueLong(long src, /* value in a register to put */ void *dst, /* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueFloat(float src,/* value in a register to put */ void *dst,/* dest starting addr to put data */ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_NbPutValueDouble(double src,/* value in a register to put */ void *dst,/* dest starting addr to put data*/ int proc, /* remote process (or) ID */ armci_hdl_t* nb_handle /*armci_non-blocking request handle */ ); extern int ARMCI_Wait(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_Test(armci_hdl_t* nb_handle); /*non-blocking request handle*/ extern int ARMCI_WaitAll (void); extern int ARMCI_WaitProc (int proc); extern void ARMCI_SET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); extern void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle); #define ARMCI_INIT_HANDLE(hdl) do {((double *)((hdl)->data))[0]=0; \ ((double *)((hdl)->data))[1]=0; }while(0) /* -------------- ARMCI Non-collective memory allocator ------------- */ typedef struct armci_meminfo_ds { char * armci_addr; /* remote address of the creator which can be used in ARMCI communication */ char *addr; /* local address of creator which can be used in to set SMP memoffset, armci_set_mem_offset() */ size_t size; /* size of remote pid's segment (bytes) */ int cpid; /* armci pid of creator */ long idlist[128]; } armci_meminfo_t; extern void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg); extern void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset); extern void ARMCI_Memdt(armci_meminfo_t *meminfo, long offset); extern void ARMCI_Memctl(armci_meminfo_t *meminfo); /* ------------------------------------------------------------------ */ #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif /* _ARMCI_H */ ga-5-4/armci/src/include/request.h0000644000175000017500000003416612662210406015207 0ustar mbamba#ifndef _REQUEST_H_ #define _REQUEST_H_ /******** client buffer managment ops ****************************/ extern void _armci_buf_init(); extern char* _armci_buf_get(int size, int operation, int to); extern void _armci_buf_release(void *buf); extern int _armci_buf_to_index(void *buf); extern char* _armci_buf_ptr_from_id(int id); extern void _armci_buf_ensure_one_outstanding_op_per_node(void *buf, int node); #if defined(PEND_BUFS) extern void _armci_buf_ensure_pend_outstanding_op_per_node(void *buf, int node); #endif extern void _armci_buf_complete_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_test_nb_request(int bufid,unsigned int tag, int *retcode); extern void _armci_buf_set_tag(void *bufptr,unsigned int tag,short int protocol); extern void _armci_buf_clear_all(); extern INLINE char *_armci_buf_get_clear_busy(int size, int operation, int to); extern INLINE void _armci_buf_set_busy(void *buf, int state); extern INLINE void _armci_buf_set_busy_idx(int tbl_idx, int state); extern INLINE int _armci_buf_cmpld(int bufid); extern INLINE void _armci_buf_set_cmpld(void *buf, int state); extern INLINE void _armci_buf_set_cmpld_idx(int idx, int state); #ifdef LAPI # include "lapidefs.h" #elif PORTALS # include "armci_portals.h" typedef long msg_tag_t; #elif defined(GM) # include "myrinet.h" #elif defined(DOELAN4) # include "elandefs.h" #elif defined(QUADRICS) # include typedef void* msg_tag_t; # ifdef _ELAN_PUTGET_H # define NB_CMPL_T ELAN_EVENT* # endif #elif defined(VIA) # include "via.h" typedef void* msg_tag_t; #elif defined(VAPI) # include "armci-vapi.h" #elif defined(SOCKETS) # include "sockets.h" typedef long msg_tag_t; typedef unsigned short msg_id_t; # define DTAG_ ((1<<(sizeof(msg_id_t)*8))-1) # define NB_SOCKETS_ /* define NB_SOCKETS to allow non-blocking path */ #elif defined(HITACHI) # include "sr8k.h" #elif defined(BGML) # include "bgml.h" # include "bgmldefs.h" # define NB_CMPL_T BG1S_t typedef long msg_tag_t; #elif defined(ARMCIX) # ifndef ARMCIX_OPAQUE_SIZE # define ARMCIX_OPAQUE_SIZE 8 # endif typedef char armcix_opaque_t [ARMCIX_OPAQUE_SIZE]; # define NB_CMPL_T armcix_opaque_t typedef long msg_tag_t; #elif defined(MPI_SPAWN) || defined(MPI_MT) # include "mpi2.h" typedef long msg_tag_t; #else typedef long msg_tag_t; #endif #ifdef OPENIB # include "pendbufs.h" #endif #ifndef CLEAR_HNDL_FIELD # define CLEAR_HNDL_FIELD(_x) #endif #define ACK_QUIT 0 #define QUIT 33 #define ATTACH 34 #define REGISTER 35 /*\ the internal request structure for non-blocking api. \*/ typedef struct{ unsigned int tag; short int bufid; short int agg_flag; int op; int proc; #ifdef PORTALS int flag; #endif #ifdef NB_CMPL_T NB_CMPL_T cmpl_info; #endif #ifdef BGML unsigned count; #endif } armci_ireq_t; /*\ the internal request structure for non-blocking api. \*/ typedef armci_ireq_t* armci_ihdl_t; extern void armci_set_nbhandle_bufid(armci_ihdl_t nb_handle, char *buf, int val); extern void set_nbhandle(armci_ihdl_t *nbh, armci_hdl_t *nb_handle, int op, int proc); typedef struct { #if 0 int to:16; /* message recipient */ int from:16; /* message sender */ #else short int to; /* message recipient */ short int from; /* message sender */ #endif unsigned int operation:8; /* operation code */ #if defined(DOELAN4) unsigned int format:2; /* data format used */ unsigned int dowait:1; /* indicates if should wait for data */ unsigned int inbuf:1; /* data is in one of the buffers */ #elif defined(CLIENT_BUF_BYPASS) || defined(LAPI2) unsigned int format:2; /* data format used */ unsigned int pinned:1; /* indicates if sender memory was pinned */ unsigned int bypass:1; /* indicate if bypass protocol used */ #else unsigned int format:4; /* data format used */ #endif unsigned int bytes:20; /* number of bytes requested */ int datalen; /* >0 in lapi means that data is included */ unsigned int ehlen:8; /* size of extra header and the end of descr */ signed int dscrlen:24; /* >0 in lapi means that descriptor is included */ msg_tag_t tag; /* message tag for response to this request, MUST BE LAST */ }request_header_t; /*******gpc call strctures*************/ #if HAVE_SIGNAL_H # include #endif #define MAX_GPC_REQ 1 #define MAX_GPC_REPLY_LEN (64*1024) #define MAX_GPC_SEND_LEN (64*1024) #define GPC_COMPLETION_SIGNAL SIGUSR1 typedef struct { int hndl; int hlen, dlen; void *hdr, *data; int rhlen, rdlen; void *rhdr, *rdata; } gpc_call_t; typedef struct { int active; /* int zombie; */ request_header_t msginfo; gpc_call_t call; char send[MAX_GPC_SEND_LEN]; char reply[MAX_GPC_REPLY_LEN]; } gpc_buf_t; /* gpc_buf_t *gpc_req; */ extern gpc_buf_t *gpc_req; extern void block_pthread_signal(int signo); extern void unblock_pthread_signal(int signo); /*******structures copied from async.c for storing cmpl dscr for nb req*******/ #define UBUF_LEN 112 typedef struct { unsigned int tag; /* request id*/ short int bufid; /* communication buffer id */ short int protocol; /* what does this buf hold?*/ union { void *dscrbuf; /*in case dscr below is not enough, do a*/ double pad; /*malloc, save pointer in dscrbuf and use it*/ }ptr; char dscr[UBUF_LEN]; /*place to store the dscr*/ }_buf_info_t; #define BUF_INFO_T _buf_info_t extern BUF_INFO_T *_armci_buf_to_bufinfo(void *buf); #define BUF_TO_BUFINFO _armci_buf_to_bufinfo void armci_complete_req_buf(BUF_INFO_T *info, void *buffer); extern INLINE BUF_INFO_T *_armci_id_to_bufinfo(int bufid); #if 0 && defined(DATA_SERVER) && defined(SOCKETS) #define MAX_BUFS 1 #define MAX_SMALL_BUFS 1 #else #define MAX_BUFS 15 #define MAX_SMALL_BUFS 16 #endif /* tracks sockets used for receiving responces from data server (GET) */ typedef struct { int socks[MAX_BUFS+MAX_SMALL_BUFS]; /* sock # or -1 if not used */ int ready[MAX_BUFS+MAX_SMALL_BUFS]; /* 1 - ready, 0 - not */ } active_socks_t; /*valid values for the element protocol in BUF_INFO_T*/ #define SDSCR_IN_PLACE 1 /*indicated that strided descriptor is in place*/ #define VDSCR_IN_PLACE 2 /*indicated that vector descriptor is in place*/ #define VDSCR_IN_PTR 3 /*indicates that the vector descriptor in allocated and pointer stored in dscrbuf */ /****************************************************************************/ #ifndef MSG_BUFLEN_DBL # if defined(HITACHI) # define MSG_BUFLEN_DBL 0x50000 # else # define MSG_BUFLEN_DBL 50000 # endif #endif #define MSG_BUFLEN sizeof(double)*MSG_BUFLEN_DBL extern char* MessageRcvBuffer; extern char* MessageSndBuffer; #ifdef LAPI # define GET_SEND_BUFFER_(_size)(MessageSndBuffer+sizeof(lapi_cmpl_t));\ CLEAR_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer));\ SET_COUNTER(*((lapi_cmpl_t*)MessageSndBuffer),1); # define GET_SEND_BUFFER _armci_buf_get # define GA_SEND_REPLY armci_lapi_send #else # ifdef SOCKETS # define GA_SEND_REPLY(tag, buf, len, p) armci_sock_send(p,buf,len) # else # define GA_SEND_REPLY(tag, buf, len, p) # endif #endif #ifdef QUADRICS_ # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer;\ while(((request_header_t*)MessageSndBuffer)->tag)\ armci_util_spin(100, MessageSndBuffer) # define FREE_SEND_BUFFER(_ptr) ((request_header_t*)MessageSndBuffer)->tag = (void*)0 #endif #ifndef GET_SEND_BUFFER # define GET_SEND_BUFFER(_size,_op,_to) MessageSndBuffer #endif #ifndef FREE_SEND_BUFFER #define FREE_SEND_BUFFER(_ptr) #endif #ifndef INIT_SENDBUF_INFO #define INIT_SENDBUF_INFO(_hdl,_buf,_op,_proc) #endif typedef struct { char *buf; char* buf_posted; int count; int proc; int op; int extra; } buf_arg_t; /*includes for SERVER_LOCK*/ #if defined(SERVER_THREAD) && !defined(VIA) extern void armci_rem_lock(int mutex, int proc, int *ticket); extern void armci_rem_unlock(int mutex, int proc, int ticket); extern void armci_unlock_waiting_process(msg_tag_t tag,int proc, int ticket); #endif #ifdef PIPE_BUFSIZE extern void armcill_pipe_post_bufs(void *ptr, int stride_arr[], int count[], int strides, void* argvoid); extern void armcill_pipe_extract_data(void *ptr,int stride_arr[],int count[], int strides, void* argvoid); extern void armcill_pipe_send_chunk(void *data, int stride_arr[],int count[], int strides, void* argvoid); #endif extern void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_rcv_hdlr(request_header_t* msginfo); extern char *armci_rcv_data(int proc, request_header_t *msginfo); extern void armci_rcv_strided_data_bypass(int proc, request_header_t *msginfo, void *ptr, int stride_levels); extern void armci_send_strided_data_bypass(int proc, request_header_t *msginfo, void *loc_buf, int msg_buflen, void *loc_ptr, int *loc_stride_arr, void *rem_ptr, int *rem_stride_arr, int *count, int stride_levels); extern void armci_rcv_strided_data(int proc, request_header_t* msginfo, int datalen, void *ptr, int strides,int stride_arr[],int count[]); extern void armci_send_strided_data(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_send_req(int proc, request_header_t* msginfo, int len); extern void armci_server_rmw(request_header_t* msginfo,void* ptr, void* pextra); extern int armci_rem_vector(int op, void *scale, armci_giov_t darr[],int len, int proc,int flag,armci_ihdl_t nb_handle); extern int armci_rem_strided(int op, void* scale, int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, ext_header_t *h, int lockit,armci_ihdl_t nb_handle); extern void armci_rem_rmw(int op, int *ploc, int *prem, int extra, int proc); extern void armci_rem_ack(int clus); extern void armci_server(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void armci_server_vector(request_header_t *msginfo, char *dscr, char* buf, int buflen); extern void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen); extern void armci_server_lock(request_header_t *msginfo); extern void armci_server_unlock(request_header_t *msginfo, char* dscr); extern void armci_create_server_thread ( void* (* func)(void*) ); extern int armci_server_lock_mutex(int mutex, int proc, msg_tag_t tag); extern void armci_send_data(request_header_t* msginfo, void *data); extern int armci_server_unlock_mutex(int mutex, int p, int tkt, msg_tag_t* tag); extern void armci_rcv_vector_data(int p, request_header_t* msginfo, armci_giov_t dr[], int len); #if !defined(LAPI) extern void armci_wait_for_server(); extern void armci_start_server(); extern void armci_transport_cleanup(); extern int armci_send_req_msg(int proc, void *buf, int bytes); extern void armci_WriteToDirect(int proc, request_header_t* msginfo, void *buf); extern char *armci_ReadFromDirect(int proc, request_header_t *msginfo, int len); extern void armci_init_connections(); extern void *armci_server_code(void *data); extern void armci_rcv_req(void *mesg, void *phdr, void *pdescr, void *pdata, int *buflen); extern void armci_client_connect_to_servers(); extern void armci_data_server(void *mesg); extern void armci_server_initial_connection(); extern void armci_call_data_server(); #endif #ifdef SOCKETS extern void armci_ReadStridedFromDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_WriteStridedToDirect(int proc, request_header_t* msginfo, void *ptr, int strides, int stride_arr[], int count[]); extern void armci_serv_quit(); extern int armci_send_req_msg_strided(int proc, request_header_t *msginfo, char *ptr, int strides, int stride_arr[],int count[]); extern void armci_server_goodbye(request_header_t* msginfo); #endif #if defined(MPI_SPAWN) || defined(MPI_MT) extern void armci_serv_quit(); extern void armci_server_goodbye(request_header_t* msginfo); #endif #ifdef HITACHI extern void armci_server_goodbye(request_header_t* msginfo); extern void armci_serv_quit(); #endif extern void armci_server_ipc(request_header_t* msginfo, void* descr, void* buffer, int buflen); #ifdef PIPE_BUFSIZE extern void armci_pipe_prep_receive_strided(request_header_t *msginfo,char *buf, int strides, int stride_arr[], int count[], int bufsize); extern void armci_pipe_receive_strided(request_header_t* msginfo, void *ptr, int stride_arr[], int count[], int strides); extern void armci_pipe_send_req(int proc, void *buf, int bytes); #endif extern void armci_rcv_strided_data_bypass_both(int, request_header_t*,void*, int*, int); extern int armci_rem_get(int proc, void *src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels, armci_ihdl_t nb_handle,void *mhloc,void *mhrem); #if defined(ALLOW_PIN) && defined(VAPI) extern int armci_two_phase_send(int proc,void *src_ptr,int src_stride_arr[], void *dst_ptr,int dst_stride_arr[],int count[], int stride_levels,void ** context_ptr,armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); extern int armci_two_phase_get(int proc, void*src_ptr, int src_stride_arr[], void*dst_ptr,int dst_stride_arr[], int count[], int stride_levels, void**context_ptr, armci_ihdl_t nbhandle, ARMCI_MEMHDL_T *mhloc); #endif #endif ga-5-4/armci/src/include/utils.h0000644000175000017500000000724412662210406014654 0ustar mbamba/* $Id: utils.h,v 1.1.2.3 2007-07-02 05:35:31 d3p687 Exp $ * * primitives for transparent handling of multi-threading */ #ifndef UTILS_H #define UTILS_H /* * This header file describes the "barrier" synchronization * construct. The type barrier_t describes the full state of the * barrier including the POSIX 1003.1c synchronization objects * necessary. * * A barrier causes threads to wait until a set of threads has * all "reached" the barrier. The number of threads required is * set when the barrier is initialized, and cannot be changed * except by reinitializing. */ #ifdef THREAD_SAFE # ifdef POSIX_THREADS # include #if 1 typedef pthread_mutex_t thread_lock_t; # define THREAD_LOCK_INIT(x) pthread_mutex_init(&x,NULL) # define THREAD_LOCK_DESTROY(x) pthread_mutex_destroy(&x) # define THREAD_LOCK(x) pthread_mutex_lock(&x) # define THREAD_UNLOCK(x) pthread_mutex_unlock(&x) #else #ifndef INLINE # define INLINE # include "spinlock.h" # undef INLINE #else # include "spinlock.h" #endif typedef LOCK_T thread_lock_t; # define THREAD_LOCK_INIT(x) armci_init_spinlock(&x) # define THREAD_LOCK_DESTROY(x) 0 # define THREAD_LOCK(x) armci_acquire_spinlock(&x) # define THREAD_UNLOCK(x) armci_release_spinlock(&x) #endif typedef pthread_t thread_t; # define THREAD_CREATE(th_,func_,arg_) pthread_create(th_,NULL,func_,arg_) # define THREAD_JOIN(th_,ret_) pthread_join(th_,ret_) /* structure describing a barrier */ typedef struct thread_barrier_tag { pthread_mutex_t mutex; /* Control access to barrier */ pthread_cond_t cv; /* wait for barrier */ int valid; /* set when valid */ int threshold; /* number of threads required */ int counter; /* current number of threads */ int cycle; /* alternate wait cycles (0 or 1) */ } thread_barrier_t; # define BARRIER_VALID 0xdbcafe /* support static initialization of barriers */ # define BARRIER_INITIALIZER(cnt) {\ PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER,\ BARRIER_VALID, cnt, cnt, 0} # else # error ONLY PTHREADS SUPPORT HAS BEEN IMPLEMENTED # endif # define TH2PROC(th_) (th_/mt_tpp) /* computes processor from thread id */ /* barrier functions */ int thread_barrier_init (thread_barrier_t *barrier, int count); int thread_barrier_destroy (thread_barrier_t *barrier); int thread_barrier_wait (thread_barrier_t *barrier); /* multi-threaded memory functions */ int armci_malloc_mt(void *ptr[], int bytes); int armci_free_mt(void *ptr, int th_idx); # define ARMCI_MALLOC_MT armci_malloc_mt # define ARMCI_FREE_MT armci_free_mt # define TH_INIT(p_,t_) mt_size=p_;mt_tpp=t_;\ thread_barrier_init(&mt_barrier,mt_tpp) # define TH_FINALIZE() thread_barrier_destroy(&mt_barrier) # define MT_BARRIER() if (thread_barrier_wait(&mt_barrier)==-1) armci_msg_barrier();\ thread_barrier_wait(&mt_barrier) extern int mt_size; extern int mt_tpp; extern thread_barrier_t mt_barrier; #else # define THREAD_LOCK_INIT(x) # define THREAD_LOCK_DESTROY(x) # define THREAD_LOCK(x) # define THREAD_UNLOCK(x) # define TH_INIT(p_,t_) # define TH_FINALIZE() # define MT_BARRIER armci_msg_barrier # define ARMCI_MALLOC_MT ARMCI_Malloc # define ARMCI_FREE_MT(p_,th_) ARMCI_Free(p_) #endif #endif/*UTILS_H*/ ga-5-4/armci/src/include/gpc.h0000644000175000017500000000200312662210406014251 0ustar mbamba#ifndef __GPCDEF #define __GPCDEF #include "armci.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif #define GPC_INIT 1 #define GPC_PROBE 2 #define GPC_WAIT 3 #define GPC_DONE 4 #define GPC_PENDING 5 typedef struct { int proc; armci_hdl_t ahdl; }gpc_hdl_t; /* #define ARMCI_GPC_HLEN 1024 */ /* #define ARMCI_GPC_DLEN 1024*1024 */ extern int ARMCI_Gpc_register( int (*func) ()); extern void ARMCI_Gpc_release(int handle); extern void * ARMCI_Gpc_translate(void *ptr, int proc, int from); extern void ARMCI_Gpc_lock(int proc); extern void ARMCI_Gpc_unlock(int proc); extern int ARMCI_Gpc_trylock(int proc); extern int ARMCI_Gpc_exec(int h,int p, void *hdr, int hlen, void *data,int dlen, void *rhdr, int rhlen, void *rdata, int rdlen, gpc_hdl_t* nbh); extern int ARMCI_Get_gpc_hlen(); extern int ARMCI_Get_gpc_dlen(); extern void ARMCI_Gpc_init_handle(gpc_hdl_t *nbh); extern void ARMCI_Gpc_wait(gpc_hdl_t *nbh); #if defined(__cplusplus) || defined(c_plusplus) } #endif #endif ga-5-4/armci/src/include/acc.h0000644000175000017500000002164712662210406014245 0ustar mbamba#ifndef _ACC_H_ #define _ACC_H_ typedef struct { float real; float imag; } complex_t; typedef struct { double real; double imag; } dcomplex_t; void c_d_accumulate_1d_(const double* const restrict alpha, double* const restrict A, const double* const restrict B, const int* const restrict rows); void c_f_accumulate_1d_(const float* const restrict alpha, float* const restrict A, const float* const restrict B, const int* const restrict rows); void c_c_accumulate_1d_(const complex_t* const restrict alpha, complex_t* const restrict A, const complex_t* const restrict B, const int* const restrict rows); void c_z_accumulate_1d_(const dcomplex_t* const restrict alpha, dcomplex_t* const restrict A, const dcomplex_t* const restrict B, const int* const restrict rows); void c_i_accumulate_1d_(const int* const restrict alpha, int* const restrict A, const int* const restrict B, const int* const restrict rows); void c_l_accumulate_1d_(const long* const restrict alpha, long* const restrict A, const long* const restrict B, const int* const restrict rows); void c_ll_accumulate_1d_(const long long* const restrict alpha, long long* const restrict A, const long long* const restrict B, const int* const restrict rows); void c_d_accumulate_2d_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void c_d_accumulate_2d_u_(const double* const restrict alpha, const int* const restrict rows, const int* const restrict cols, double* const restrict A, const int* const restrict ald, const double* const restrict B, const int* const restrict bld); void c_f_accumulate_2d_u_(const float* const restrict alpha, const int* const restrict rows, const int* const restrict cols, float* const restrict A, const int* const restrict ald, const float* const restrict B, const int* const restrict bld); void c_c_accumulate_2d_u_(const complex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, complex_t* const restrict A, const int* const restrict ald, const complex_t* const restrict B, const int* const restrict bld); void c_z_accumulate_2d_u_(const dcomplex_t* const restrict alpha, const int* const restrict rows, const int* const restrict cols, dcomplex_t* const restrict A, const int* const restrict ald, const dcomplex_t* const restrict B, const int* const restrict bld); void c_i_accumulate_2d_u_(const int* const restrict alpha, const int* const restrict rows, const int* const restrict cols, int* const restrict A, const int* const restrict ald, const int* const restrict B, const int* const restrict bld); void c_l_accumulate_2d_u_(const long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long* const restrict A, const int* const restrict ald, const long* const restrict B, const int* const restrict bld); void c_ll_accumulate_2d_u_(const long long* const restrict alpha, const int* const restrict rows, const int* const restrict cols, long long* const restrict A, const int* const restrict ald, const long long* const restrict B, const int* const restrict bld); void c_dadd_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dadd2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); void c_dmult_(const int* const restrict n, double* const restrict x, const double* const restrict work); void c_dmult2_(const int* const restrict n, double* const restrict x, const double* const restrict work, const double* const restrict work2); #define I_ACCUMULATE_1D c_i_accumulate_1d_ #define L_ACCUMULATE_1D c_l_accumulate_1d_ #define LL_ACCUMULATE_1D c_ll_accumulate_1d_ #define D_ACCUMULATE_1D c_d_accumulate_1d_ #define C_ACCUMULATE_1D c_c_accumulate_1d_ #define Z_ACCUMULATE_1D c_z_accumulate_1d_ #define F_ACCUMULATE_1D c_f_accumulate_1d_ #define I_ACCUMULATE_2D c_i_accumulate_2d_ #define L_ACCUMULATE_2D c_l_accumulate_2d_ #define LL_ACCUMULATE_2D c_ll_accumulate_2d_ #define D_ACCUMULATE_2D c_d_accumulate_2d_ #define C_ACCUMULATE_2D c_c_accumulate_2d_ #define Z_ACCUMULATE_2D c_z_accumulate_2d_ #define F_ACCUMULATE_2D c_f_accumulate_2d_ #define FORT_DADD c_dadd_ #define FORT_DADD2 c_dadd2_ #define FORT_DMULT c_dmult_ #define FORT_DMULT2 c_dmult2_ #endif /* _ACC_H_ */ ga-5-4/armci/compat/0000755000175000017500000000000012662210401012400 5ustar mbambaga-5-4/armci/compat/dummy.c0000644000175000017500000000026312662210401013700 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif int dummy_func_for_nonempty_libcompat_armci(int dummy) { int dont_optimize_away = 4; return dont_optimize_away + dummy; } ga-5-4/armci/compat/malloc.c0000644000175000017500000000041412662210401014012 0ustar mbamba#include #undef malloc #include void *malloc(); /* Allocate an N-byte block of memory from the heap. If N is zero, allocate a 1-byte block. */ void *rpl_malloc(size_t n) { if (n == 0) { n = 1; } return malloc(n); } ga-5-4/armci/configure0000755000175000017500000337343412662210401013045 0ustar mbamba#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Aggregate Remote Memory Copy Interface (ARMCI) 1.5. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and hpctools@pnl.gov $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Aggregate Remote Memory Copy Interface (ARMCI)' PACKAGE_TARNAME='armci' PACKAGE_VERSION='1.5' PACKAGE_STRING='Aggregate Remote Memory Copy Interface (ARMCI) 1.5' PACKAGE_BUGREPORT='hpctools@pnl.gov' PACKAGE_URL='http://www.emsl.pnl.gov/docs/parsoft/armci/' ac_config_libobj_dir=compat ac_unique_file="src/common/armci.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS TCGEXEC MPIEXEC NPROCS ENABLE_SHARED_FALSE ENABLE_SHARED_TRUE RANDOM_ACCESS_FALSE RANDOM_ACCESS_TRUE ga_cv_path_rsh CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL ac_ct_AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP LIBTOOL RANLIB AR_FLAGS AR SED HAVE_LAPACK_FALSE HAVE_LAPACK_TRUE HAVE_BLAS_FALSE HAVE_BLAS_TRUE am__fastdepCCAS_FALSE am__fastdepCCAS_TRUE CCASDEPMODE CCASFLAGS CCAS ARMCI_CXXOPT GA_CXX_WARN am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX MPICXX ARMCI_COPT C_POINTER_AS_INTEGER HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE SYSV_FALSE SYSV_TRUE CRAY_XT_NETWORKS_FALSE CRAY_XT_NETWORKS_TRUE ARMCI_NETWORK_COMEX_FALSE ARMCI_NETWORK_COMEX_TRUE ARMCI_NETWORK_EXTERNAL_FALSE ARMCI_NETWORK_EXTERNAL_TRUE ARMCI_SRC_DIR_SRC_FALSE ARMCI_SRC_DIR_SRC_TRUE ARMCI_SRC_DIR_COMEX_FALSE ARMCI_SRC_DIR_COMEX_TRUE ARMCI_SRC_DIR_GEMINI_FALSE ARMCI_SRC_DIR_GEMINI_TRUE ARMCI_SRC_DIR_PORTALS_FALSE ARMCI_SRC_DIR_PORTALS_TRUE ARMCI_SRC_DIR DCMF_VER_0_3_FALSE DCMF_VER_0_3_TRUE DCMF_VER_0_2_FALSE DCMF_VER_0_2_TRUE DCMF_VER_2_FALSE DCMF_VER_2_TRUE ARMCI_NETWORK_CPPFLAGS ARMCI_NETWORK_LIBS ARMCI_NETWORK_LDFLAGS ARMCI_NETWORK_SOCKETS_FALSE ARMCI_NETWORK_SOCKETS_TRUE ARMCI_NETWORK_PORTALS_FALSE ARMCI_NETWORK_PORTALS_TRUE ARMCI_NETWORK_PORTALS4_FALSE ARMCI_NETWORK_PORTALS4_TRUE ARMCI_NETWORK_GEMINI_FALSE ARMCI_NETWORK_GEMINI_TRUE ARMCI_NETWORK_OPENIB_FALSE ARMCI_NETWORK_OPENIB_TRUE ARMCI_NETWORK_OFA_FALSE ARMCI_NETWORK_OFA_TRUE ARMCI_NETWORK_MPI_SPAWN_FALSE ARMCI_NETWORK_MPI_SPAWN_TRUE ARMCI_NETWORK_MPI_PR_FALSE ARMCI_NETWORK_MPI_PR_TRUE ARMCI_NETWORK_MPI_PT_FALSE ARMCI_NETWORK_MPI_PT_TRUE ARMCI_NETWORK_MPI_MT_FALSE ARMCI_NETWORK_MPI_MT_TRUE ARMCI_NETWORK_MPI_TS_FALSE ARMCI_NETWORK_MPI_TS_TRUE ARMCI_NETWORK_LAPI_FALSE ARMCI_NETWORK_LAPI_TRUE ARMCI_NETWORK_DMAPP_FALSE ARMCI_NETWORK_DMAPP_TRUE ARMCI_NETWORK_DCMF_FALSE ARMCI_NETWORK_DCMF_TRUE ARMCI_NETWORK_CRAY_SHMEM_FALSE ARMCI_NETWORK_CRAY_SHMEM_TRUE ARMCI_NETWORK_BGML_FALSE ARMCI_NETWORK_BGML_TRUE ARMCI_NETWORK_ARMCI_FALSE ARMCI_NETWORK_ARMCI_TRUE HAVE_ARMCI_MSG_FINALIZE_FALSE HAVE_ARMCI_MSG_FINALIZE_TRUE HAVE_ARMCI_MSG_INIT_FALSE HAVE_ARMCI_MSG_INIT_TRUE HAVE_ARMCI_NOTIFY_FALSE HAVE_ARMCI_NOTIFY_TRUE HAVE_ARMCI_STRIDE_INFO_INIT_FALSE HAVE_ARMCI_STRIDE_INFO_INIT_TRUE HAVE_ARMCI_INITIALIZED_FALSE HAVE_ARMCI_INITIALIZED_TRUE HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE HAVE_ARMCI_GROUP_COMM_FALSE HAVE_ARMCI_GROUP_COMM_TRUE PERL GA_C_WARN EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MPICC THREAD_LIBRARY THREAD_SAFE_FALSE THREAD_SAFE_TRUE ENABLE_TRACE_FALSE ENABLE_TRACE_TRUE ENABLE_CHECKPOINT_FALSE ENABLE_CHECKPOINT_TRUE ENABLE_PROFILING_FALSE ENABLE_PROFILING_TRUE NB_NONCONT_FALSE NB_NONCONT_TRUE ARMCI_GROUP_FALSE ARMCI_GROUP_TRUE ARMCI_ENABLE_GPC_CALLS_FALSE ARMCI_ENABLE_GPC_CALLS_TRUE PORTALS_ENABLE_NEW_MALLOC_FALSE PORTALS_ENABLE_NEW_MALLOC_TRUE GA_MP_CPPFLAGS GA_MP_LDFLAGS GA_MP_LIBS MSG_COMMS_TCGMSG5_FALSE MSG_COMMS_TCGMSG5_TRUE MSG_COMMS_TCGMSG4_FALSE MSG_COMMS_TCGMSG4_TRUE MSG_COMMS_MPI_FALSE MSG_COMMS_MPI_TRUE MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM CROSS_COMPILING_FALSE CROSS_COMPILING_TRUE SOLARIS_FALSE SOLARIS_TRUE SGITFP_FALSE SGITFP_TRUE SGI_N32_FALSE SGI_N32_TRUE SGI_FALSE SGI_TRUE NEC_FALSE NEC_TRUE MACX_FALSE MACX_TRUE LINUX_FALSE LINUX_TRUE LAPI_FALSE LAPI_TRUE INTERIX_FALSE INTERIX_TRUE IBM_FALSE IBM_TRUE HPUX_FALSE HPUX_TRUE HITACHI_FALSE HITACHI_TRUE FUJITSU_VPP_FALSE FUJITSU_VPP_TRUE DECOSF_FALSE DECOSF_TRUE CYGWIN_FALSE CYGWIN_TRUE CYGNUS_FALSE CYGNUS_TRUE CRAY_YMP_FALSE CRAY_YMP_TRUE CRAY_XT_FALSE CRAY_XT_TRUE CRAY_T3E_FALSE CRAY_T3E_TRUE CRAY_SV2_FALSE CRAY_SV2_TRUE CRAY_SV1_FALSE CRAY_SV1_TRUE CATAMOUNT_FALSE CATAMOUNT_TRUE BGP_FALSE BGP_TRUE BGL_FALSE BGL_TRUE host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode with_PACKAGE with_mpi enable_portals_new_malloc enable_gpc enable_armci_group enable_nb_noncont enable_profiling enable_mpi_tests enable_warnings enable_checkpoint enable_opt enable_trace enable_thread_safety enable_dependency_tracking enable_autodetect with_armci with_bgml with_cray_shmem with_dcmf with_dmapp with_gemini with_lapi with_mpi_mt with_mpi_pt with_mpi_pr with_mpi_spawn with_mpi_ts with_ofa with_openib with_portals4 with_portals with_sockets enable_assert enable_weak enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias THREAD_LIBRARY MPICC CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP ARMCI_COPT MPICXX CXX CXXFLAGS CCC ARMCI_CXXOPT CCAS CCASFLAGS AR AR_FLAGS RANLIB CXXCPP NPROCS MPIEXEC' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Aggregate Remote Memory Copy Interface (ARMCI) 1.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/armci] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Aggregate Remote Memory Copy Interface (ARMCI) 1.5:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-portals-new-malloc add -DNEW_MALLOC to CPPFLAGS --enable-gpc enable GPC calls --enable-armci-group TODO --enable-nb-noncont TODO --enable-profiling enable profiling --disable-mpi-tests disable MPI linker tests --enable-warnings use compiler-specific warnings --enable-checkpoint enable checkpointing --disable-opt don't use hard-coded optimization flags --enable-trace enable tracing --enable-thread-safety **unsupported** turn on thread safety --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-autodetect attempt to locate ARMCI_NETWORK besides SOCKETS --disable-assert turn off assertions --disable-weak don't use weak symbols for profiling --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-PACKAGE[=ARG] for most of the external software packages, ARG can be one or more whitespace-separated directories, linker or preprocessor directives; for example, --with-PACKAGE="/path/to/PACKAGE -lmylib -I/mydir" --with-mpi[=ARG] select MPI as the messaging library (default); leave ARG blank to use MPI compiler wrappers --with-armci[=ARG] select armci network as external; path to external ARMCI library --with-bgml[=ARG] select armci network as IBM BG/L --with-cray-shmem[=ARG] select armci network as Cray XT shmem --with-dcmf[=ARG] select armci network as IBM BG/P Deep Computing Message Framework --with-dmapp[=ARG] select armci network as (Comex) Cray DMAPP --with-gemini[=ARG] select armci network as Cray XE Gemini using libonesided --with-lapi[=ARG] select armci network as IBM LAPI --with-mpi-mt[=ARG] select armci network as (Comex) MPI-2 multi-threading --with-mpi-pt[=ARG] select armci network as (Comex) MPI-2 multi-threading with progress thread --with-mpi-pr[=ARG] select armci network as (Comex) MPI-1 two-sided with progress rank --with-mpi-spawn[=ARG] select armci network as MPI-2 dynamic process mgmt --with-mpi-ts[=ARG] select armci network as (Comex) MPI-1 two-sided --with-ofa[=ARG] select armci network as (Comex) Infiniband OpenIB --with-openib[=ARG] select armci network as Infiniband OpenIB --with-portals4[=ARG] select armci network as (Comex) Portals4 --with-portals[=ARG] select armci network as Cray XT portals --with-sockets[=ARG] select armci network as Ethernet TCP/IP --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: THREAD_LIBRARY See --enable-thread-safety MPICC MPI C compiler CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor ARMCI_COPT ARMCI C optimization flags MPICXX MPI C++ compiler CXX C++ compiler command CXXFLAGS C++ compiler flags ARMCI_CXXOPT ARMCI C++ optimization flags CCAS assembler compiler command (defaults to CC) CCASFLAGS assembler compiler flags (defaults to CFLAGS) AR archiver used by libtool (default: ar) AR_FLAGS archiver flags used by libtool (default: cru) RANLIB generates index to archive (default: ranlib) CXXCPP C++ preprocessor NPROCS number of procs to use for parallel tests (default 4) MPIEXEC how to run parallel tests if built with MPI e.g. "mpiexec -np %NP%" Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . Aggregate Remote Memory Copy Interface (ARMCI) home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Aggregate Remote Memory Copy Interface (ARMCI) configure 1.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------- ## ## Report this to hpctools@pnl.gov ## ## ------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Aggregate Remote Memory Copy Interface (ARMCI) $as_me 1.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi as_fn_append ac_header_list " stdlib.h" as_fn_append ac_header_list " unistd.h" as_fn_append ac_header_list " sys/param.h" # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" ############################################################################### # Must occur before automake init ############################################################################### # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AH_TEMPLATE for all known TARGETs { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TARGET base (64bit-ness checked later)" >&5 $as_echo_n "checking for TARGET base (64bit-ness checked later)... " >&6; } if ${ga_cv_target_base+:} false; then : $as_echo_n "(cached) " >&6 else ga_cv_target_base=UNKNOWN if test "x$ga_cv_target_base" = xUNKNOWN; then : if test -f /bgsys/drivers/ppcfloor/arch/include/common/bgp_personality.h; then : ga_cv_target_base=BGP fi fi if test "x$ga_cv_target_base" = xUNKNOWN; then : if test -d /bgl/BlueLight/ppcfloor/bglsys/include; then : ga_cv_target_base=BGL fi fi if test "x$ga_cv_target_base" = xUNKNOWN; then : case $host in #( *bgl*) : ga_cv_target_base=BGL ;; #( *bgp*) : ga_cv_target_base=BGP ;; #( #[TODO], [ga_cv_target_base=CATAMOUNT], #[TODO], [ga_cv_target_base=CRAY_XT], *cygwin*) : ga_cv_target_base=CYGWIN ;; #( *fujitsu*) : ga_cv_target_base=FUJITSU_VPP ;; #( *hpux*) : ga_cv_target_base=HPUX ;; #( *ibm*) : ga_cv_target_base=IBM ;; #( #[TODO], [ga_cv_target_base=LAPI], *linux*) : ga_cv_target_base=LINUX ;; #( *darwin*) : ga_cv_target_base=MACX ;; #( *apple*) : ga_cv_target_base=MACX ;; #( *superux*) : ga_cv_target_base=NEC ;; #( *solaris*) : ga_cv_target_base=SOLARIS ;; #( *) : ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_target_base" >&5 $as_echo "$ga_cv_target_base" >&6; } cat >>confdefs.h <<_ACEOF #define $ga_cv_target_base 1 _ACEOF # A horrible hack that should go away somehow... { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we think this system is what we call SYSV" >&5 $as_echo_n "checking whether we think this system is what we call SYSV... " >&6; } if ${ga_cv_sysv+:} false; then : $as_echo_n "(cached) " >&6 else case $ga_cv_target_base in #( SUN|SOLARIS|SGI|SGI_N32|SGITFP|HPUX|IBM|DECOSF|LINUX|INTERIX|NEC|LAPI) : ga_cv_sysv=yes ;; #( *) : ga_cv_sysv=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_sysv" >&5 $as_echo "$ga_cv_sysv" >&6; } if test x$ga_cv_sysv = xyes; then : $as_echo "#define SYSV 1" >>confdefs.h fi # Hopefully these will never be used and we can remove them soon. if test "$ga_cv_target_base" = BGL; then BGL_TRUE= BGL_FALSE='#' else BGL_TRUE='#' BGL_FALSE= fi if test "$ga_cv_target_base" = BGP; then BGP_TRUE= BGP_FALSE='#' else BGP_TRUE='#' BGP_FALSE= fi if test "$ga_cv_target_base" = CATAMOUNT; then CATAMOUNT_TRUE= CATAMOUNT_FALSE='#' else CATAMOUNT_TRUE='#' CATAMOUNT_FALSE= fi if test "$ga_cv_target_base" = CRAY_SV1; then CRAY_SV1_TRUE= CRAY_SV1_FALSE='#' else CRAY_SV1_TRUE='#' CRAY_SV1_FALSE= fi if test "$ga_cv_target_base" = CRAY_SV2; then CRAY_SV2_TRUE= CRAY_SV2_FALSE='#' else CRAY_SV2_TRUE='#' CRAY_SV2_FALSE= fi if test "$ga_cv_target_base" = CRAY_T3E; then CRAY_T3E_TRUE= CRAY_T3E_FALSE='#' else CRAY_T3E_TRUE='#' CRAY_T3E_FALSE= fi if test "$ga_cv_target_base" = CRAY_XT; then CRAY_XT_TRUE= CRAY_XT_FALSE='#' else CRAY_XT_TRUE='#' CRAY_XT_FALSE= fi if test "$ga_cv_target_base" = CRAY_YMP; then CRAY_YMP_TRUE= CRAY_YMP_FALSE='#' else CRAY_YMP_TRUE='#' CRAY_YMP_FALSE= fi if test "$ga_cv_target_base" = CYGNUS; then CYGNUS_TRUE= CYGNUS_FALSE='#' else CYGNUS_TRUE='#' CYGNUS_FALSE= fi if test "$ga_cv_target_base" = CYGWIN; then CYGWIN_TRUE= CYGWIN_FALSE='#' else CYGWIN_TRUE='#' CYGWIN_FALSE= fi if test "$ga_cv_target_base" = DECOSF; then DECOSF_TRUE= DECOSF_FALSE='#' else DECOSF_TRUE='#' DECOSF_FALSE= fi if test "$ga_cv_target_base" = FUJITSU_VPP; then FUJITSU_VPP_TRUE= FUJITSU_VPP_FALSE='#' else FUJITSU_VPP_TRUE='#' FUJITSU_VPP_FALSE= fi if test "$ga_cv_target_base" = HITACHI; then HITACHI_TRUE= HITACHI_FALSE='#' else HITACHI_TRUE='#' HITACHI_FALSE= fi if test "$ga_cv_target_base" = HPUX; then HPUX_TRUE= HPUX_FALSE='#' else HPUX_TRUE='#' HPUX_FALSE= fi if test "$ga_cv_target_base" = IBM; then IBM_TRUE= IBM_FALSE='#' else IBM_TRUE='#' IBM_FALSE= fi if test "$ga_cv_target_base" = INTERIX; then INTERIX_TRUE= INTERIX_FALSE='#' else INTERIX_TRUE='#' INTERIX_FALSE= fi if test "$ga_cv_target_base" = LAPI; then LAPI_TRUE= LAPI_FALSE='#' else LAPI_TRUE='#' LAPI_FALSE= fi if test "$ga_cv_target_base" = LINUX; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test "$ga_cv_target_base" = MACX; then MACX_TRUE= MACX_FALSE='#' else MACX_TRUE='#' MACX_FALSE= fi if test "$ga_cv_target_base" = NEC; then NEC_TRUE= NEC_FALSE='#' else NEC_TRUE='#' NEC_FALSE= fi if test "$ga_cv_target_base" = SGI; then SGI_TRUE= SGI_FALSE='#' else SGI_TRUE='#' SGI_FALSE= fi if test "$ga_cv_target_base" = SGI_N32; then SGI_N32_TRUE= SGI_N32_FALSE='#' else SGI_N32_TRUE='#' SGI_N32_FALSE= fi if test "$ga_cv_target_base" = SGITFP; then SGITFP_TRUE= SGITFP_FALSE='#' else SGITFP_TRUE='#' SGITFP_FALSE= fi if test "$ga_cv_target_base" = SOLARIS; then SOLARIS_TRUE= SOLARIS_FALSE='#' else SOLARIS_TRUE='#' SOLARIS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if ${ga_cv_cross_compiling+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ga_cv_target_base" = xBGP; then : cross_compiling=yes fi ga_cv_cross_compiling=$cross_compiling fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cross_compiling" >&5 $as_echo "$ga_cv_cross_compiling" >&6; } if test "x$cross_compiling" = xyes; then CROSS_COMPILING_TRUE= CROSS_COMPILING_FALSE='#' else CROSS_COMPILING_TRUE='#' CROSS_COMPILING_FALSE= fi ############################################################################### # Init automake ############################################################################### am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='armci' VERSION='1.5' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Don't emit "rebuild rules" for configure, Makefile.ins, etc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ############################################################################### # Misc. information and package setup. ############################################################################### # Check whether --with-PACKAGE was given. if test "${with_PACKAGE+set}" = set; then : withval=$with_PACKAGE; fi ARMCI_TOP_BUILDDIR="`pwd`" cd "$srcdir" ARMCI_TOP_SRCDIR="`pwd`" cd "$ARMCI_TOP_BUILDDIR" if test "$ARMCI_TOP_BUILDDIR" != "$ARMCI_TOP_SRCDIR"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Detected VPATH build" >&5 $as_echo "$as_me: Detected VPATH build" >&6;} fi # Determine messaging library up front because if MPI is desired we use the # MPI compiler wrappers instead of the standard compilers. # GA_MP_* vars might exist in environment, but they are really internal. # Reset them. GA_MP_LIBS= GA_MP_LDFLAGS= GA_MP_CPPFLAGS= # Check whether --with-mpi was given. if test "${with_mpi+set}" = set; then : withval=$with_mpi; else with_mpi=yes fi with_mpi_need_parse=no case $with_mpi in #( yes) : with_mpi_wrappers=yes; ga_msg_comms=MPI ;; #( no) : case $ga_cv_target_base in #( MACX|LAPI|CYGNUS|CYGWIN|INTERIX) : ga_msg_comms=TCGMSG5 ;; #( *) : ga_msg_comms=TCGMSG ;; esac ;; #( *) : with_mpi_need_parse=yes; ga_msg_comms=MPI ;; #( *) : ;; esac if test "x$ga_msg_comms" = xMPI; then MSG_COMMS_MPI_TRUE= MSG_COMMS_MPI_FALSE='#' else MSG_COMMS_MPI_TRUE='#' MSG_COMMS_MPI_FALSE= fi if test "x$ga_msg_comms" = xTCGMSG; then MSG_COMMS_TCGMSG4_TRUE= MSG_COMMS_TCGMSG4_FALSE='#' else MSG_COMMS_TCGMSG4_TRUE='#' MSG_COMMS_TCGMSG4_FALSE= fi if test "x$ga_msg_comms" = xTCGMSG5; then MSG_COMMS_TCGMSG5_TRUE= MSG_COMMS_TCGMSG5_FALSE='#' else MSG_COMMS_TCGMSG5_TRUE='#' MSG_COMMS_TCGMSG5_FALSE= fi case $ga_msg_comms in #( MPI) : $as_echo "#define MSG_COMMS_MPI 1" >>confdefs.h ;; #( TCGMSG) : $as_echo "#define MSG_COMMS_TCGMSG4 1" >>confdefs.h $as_echo "#define MSG_COMMS_TCGMSG 1" >>confdefs.h $as_echo "#define TCGMSG 1" >>confdefs.h ;; #( TCGMSG5) : $as_echo "#define MSG_COMMS_TCGMSG5 1" >>confdefs.h $as_echo "#define MSG_COMMS_TCGMSG 1" >>confdefs.h $as_echo "#define TCGMSG 1" >>confdefs.h ;; #( *) : ;; esac # Hack to enable NEW_MALLOC feature # Check whether --enable-portals-new-malloc was given. if test "${enable_portals_new_malloc+set}" = set; then : enableval=$enable_portals_new_malloc; fi if test "x$enable_portals_new_malloc" = xyes; then : $as_echo "#define NEW_MALLOC 1" >>confdefs.h fi if test "x$enable_portals_new_malloc" = xyes; then PORTALS_ENABLE_NEW_MALLOC_TRUE= PORTALS_ENABLE_NEW_MALLOC_FALSE='#' else PORTALS_ENABLE_NEW_MALLOC_TRUE='#' PORTALS_ENABLE_NEW_MALLOC_FALSE= fi # Check whether --enable-gpc was given. if test "${enable_gpc+set}" = set; then : enableval=$enable_gpc; enable_gpc=yes else enable_gpc=no fi if test $enable_gpc = yes; then : $as_echo "#define ARMCI_ENABLE_GPC_CALLS 1" >>confdefs.h else $as_echo "#define ARMCI_ENABLE_GPC_CALLS 0" >>confdefs.h fi if test x$enable_gpc = xyes; then ARMCI_ENABLE_GPC_CALLS_TRUE= ARMCI_ENABLE_GPC_CALLS_FALSE='#' else ARMCI_ENABLE_GPC_CALLS_TRUE='#' ARMCI_ENABLE_GPC_CALLS_FALSE= fi # Check whether --enable-armci_group was given. if test "${enable_armci_group+set}" = set; then : enableval=$enable_armci_group; enable_armci_group=yes $as_echo "#define ARMCI_GROUP 1" >>confdefs.h else enable_armci_group=no fi if test x$enable_armci_group = xyes; then ARMCI_GROUP_TRUE= ARMCI_GROUP_FALSE='#' else ARMCI_GROUP_TRUE='#' ARMCI_GROUP_FALSE= fi # Check whether --enable-nb_noncont was given. if test "${enable_nb_noncont+set}" = set; then : enableval=$enable_nb_noncont; enable_nb_noncont=yes $as_echo "#define NB_NONCONT 1" >>confdefs.h else enable_nb_noncont=no fi if test x$enable_nb_noncont = xyes; then NB_NONCONT_TRUE= NB_NONCONT_FALSE='#' else NB_NONCONT_TRUE='#' NB_NONCONT_FALSE= fi # Check whether --enable-profiling was given. if test "${enable_profiling+set}" = set; then : enableval=$enable_profiling; else enable_profiling=no fi if test "x$enable_profiling" = xyes; then : $as_echo "#define ARMCI_PROFILE 1" >>confdefs.h fi if test "x$enable_profiling" = xyes; then ENABLE_PROFILING_TRUE= ENABLE_PROFILING_FALSE='#' else ENABLE_PROFILING_TRUE='#' ENABLE_PROFILING_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARMCI_DEFAULT_SHMMAX upper bound" >&5 $as_echo_n "checking for ARMCI_DEFAULT_SHMMAX upper bound... " >&6; } if ${armci_cv_shmmax+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ARMCI_DEFAULT_SHMMAX_UBOUND" != x; then : armci_cv_shmmax=$ARMCI_DEFAULT_SHMMAX_UBOUND else armci_cv_shmmax=8192 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $armci_cv_shmmax" >&5 $as_echo "$armci_cv_shmmax" >&6; } if test $armci_cv_shmmax -le 1; then : as_fn_error $? "invalid ARMCI_DEFAULT_SHMMAX upper bound; <= 1" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define ARMCI_DEFAULT_SHMMAX_UBOUND $armci_cv_shmmax _ACEOF # Check whether --enable-mpi-tests was given. if test "${enable_mpi_tests+set}" = set; then : enableval=$enable_mpi_tests; else enable_mpi_tests=yes fi # Check whether --enable-warnings was given. if test "${enable_warnings+set}" = set; then : enableval=$enable_warnings; enable_warnings=yes else enable_warnings=no fi # Check whether --enable-checkpoint was given. if test "${enable_checkpoint+set}" = set; then : enableval=$enable_checkpoint; enable_checkpoint=yes $as_echo "#define ENABLE_CHECKPOINT 1" >>confdefs.h else enable_checkpoint=no fi if test x$enable_checkpoint = xyes; then ENABLE_CHECKPOINT_TRUE= ENABLE_CHECKPOINT_FALSE='#' else ENABLE_CHECKPOINT_TRUE='#' ENABLE_CHECKPOINT_FALSE= fi # Check whether --enable-opt was given. if test "${enable_opt+set}" = set; then : enableval=$enable_opt; else enable_opt=no fi # Check whether --enable-trace was given. if test "${enable_trace+set}" = set; then : enableval=$enable_trace; enable_trace=yes $as_echo "#define ENABLE_TRACE 1" >>confdefs.h else enable_trace=no fi if test x$enable_trace = xyes; then ENABLE_TRACE_TRUE= ENABLE_TRACE_FALSE='#' else ENABLE_TRACE_TRUE='#' ENABLE_TRACE_FALSE= fi # Check whether --enable-thread-safety was given. if test "${enable_thread_safety+set}" = set; then : enableval=$enable_thread_safety; thread_safety=yes $as_echo "#define THREAD_SAFE 1" >>confdefs.h else thread_safety=no fi if test x$thread_safety = xyes; then THREAD_SAFE_TRUE= THREAD_SAFE_FALSE='#' else THREAD_SAFE_TRUE='#' THREAD_SAFE_FALSE= fi ######################################### # C compiler ######################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: C compiler" >&5 $as_echo "$as_me: C compiler" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} ga_save_CFLAGS="$CFLAGS" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi case $ga_cv_target_base in #( BGP) : ga_mpicc_pref=mpixlc_r; ga_cc_pref=bgxlc_r ;; #( *) : ;; esac # In the case of using MPI wrappers, set CC=MPICC since CC will override # absolutely everything in our list of compilers. # Save CC, just in case. if test x$with_mpi_wrappers = xyes; then : if test "x$CC" != "x$MPICC"; then : ga_orig_CC="$CC" fi case x$CC:x$MPICC in #( x:x) : ;; #( x:x*) : CC="$MPICC" ;; #( x*:x) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired but CC is set while MPICC is unset." >&5 $as_echo "$as_me: WARNING: MPI compilers desired but CC is set while MPICC is unset." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CC will be ignored during compiler selection, but will be" >&5 $as_echo "$as_me: WARNING: CC will be ignored during compiler selection, but will be" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&5 $as_echo "$as_me: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: meant to set MPICC instead of or in addition to CC?" >&5 $as_echo "$as_me: WARNING: meant to set MPICC instead of or in addition to CC?" >&2;} CC= ;; #( x*:x*) : if test "x$CC" != "x$MPICC"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired, MPICC and CC are set, and MPICC!=CC." >&5 $as_echo "$as_me: WARNING: MPI compilers desired, MPICC and CC are set, and MPICC!=CC." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Choosing MPICC as main compiler." >&5 $as_echo "$as_me: WARNING: Choosing MPICC as main compiler." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CC will be assumed as the unwrapped MPI compiler." >&5 $as_echo "$as_me: WARNING: CC will be assumed as the unwrapped MPI compiler." >&2;} fi ga_cv_mpic_naked="$CC" CC="$MPICC" ;; #( *) : as_fn_error $? "CC/MPICC case failure" "$LINENO" 5 ;; esac fi ga_cc="bgxlc_r bgxlc xlc_r xlc pgcc pathcc icc sxcc fcc opencc suncc craycc gcc cc ecc cl ccc" ga_mpicc="mpicc mpixlc_r mpixlc hcc mpxlc_r mpxlc sxmpicc mpifcc mpgcc mpcc cmpicc cc" if test x$with_mpi_wrappers = xyes; then : CC_TO_TEST="$ga_mpicc_pref $ga_mpicc" else CC_TO_TEST="$ga_cc_pref $ga_cc" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CC_TO_TEST do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in $CC_TO_TEST do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi CFLAGS="$ga_save_CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 $as_echo_n "checking for C compiler vendor... " >&6; } if ${ga_cv_c_compiler_vendor+:} false; then : $as_echo_n "(cached) " >&6 else ga_save_ac_ext="$ac_ext" ga_cv_c_compiler_vendor=unknown ga_cpp_vendor_symbols= for vendor in intel ibm pathscale amd cray gnu sun hp dec borland comeau kai lcc metrowerks sgi microsoft watcom portland fujitsu do case $vendor in #( amd) : ga_cpp_vendor_symbols="defined(__OPEN64__)" ;; #( borland) : ga_cpp_vendor_symbols="defined(__BORLANDC__) || defined(__TURBOC__)" ;; #( comeau) : ga_cpp_vendor_symbols="defined(__COMO__)" ;; #( cray) : ga_cpp_vendor_symbols="defined(_CRAYC) || defined(_ADDR64)" ;; #( dec) : ga_cpp_vendor_symbols="defined(__DECC) || defined(__DECCXX) || defined(__DECC_VER) || defined(__DECCXX_VER)" ;; #( fujitsu) : ga_cpp_vendor_symbols="defined(__fcc__) || defined(__fcc_version__) || defined(_FCC_VER) || defined(__FCC_VER_)" ;; #( gnu) : ga_cpp_vendor_symbols="defined(__GNUC__)" ;; #( hp) : ga_cpp_vendor_symbols="defined(__HP_cc) || defined(__HP_aCC)" ;; #( ibm) : ga_cpp_vendor_symbols="defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)" ;; #( intel) : ga_cpp_vendor_symbols="defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)" ;; #( kai) : ga_cpp_vendor_symbols="defined(__KCC)" ;; #( lcc) : ga_cpp_vendor_symbols="defined(__LCC__)" ;; #( metrowerks) : ga_cpp_vendor_symbols="defined(__MWERKS__)" ;; #( microsoft) : ga_cpp_vendor_symbols="defined(_MSC_VER)" ;; #( pathscale) : ga_cpp_vendor_symbols="defined(__PATHCC__) || defined(__PATHSCALE__)" ;; #( portland) : ga_cpp_vendor_symbols="defined(__PGI)" ;; #( sgi) : ga_cpp_vendor_symbols="defined(__sgi) || defined(sgi)" ;; #( sun) : ga_cpp_vendor_symbols="defined(__SUNPRO_C) || defined(__SUNPRO_CC)" ;; #( watcom) : ga_cpp_vendor_symbols="defined(__WATCOMC__)" ;; #( *) : ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if !($ga_cpp_vendor_symbols) chokeonthis #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ga_cv_c_compiler_vendor=$vendor; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ga_cpp_vendor_symbols= ac_ext="$ga_save_ac_ext" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_compiler_vendor" >&5 $as_echo "$ga_cv_c_compiler_vendor" >&6; } if test "x$enable_warnings" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C warning flags" >&5 $as_echo_n "checking for C warning flags... " >&6; } if ${ga_cv_c_warning_flags+:} false; then : $as_echo_n "(cached) " >&6 else case $ga_cv_c_compiler_vendor in #( amd) : ga_cv_c_warning_flags="-Wall -W -Wdeclaration-after-statement" ;; #( borland) : ga_cv_c_warning_flags= ;; #( comeau) : ga_cv_c_warning_flags= ;; #( cray) : ga_cv_c_warning_flags= ;; #( dec) : ga_cv_c_warning_flags= ;; #( fujitsu) : ga_cv_c_warning_flags="-Xc -pvctl,fullmsg" ;; #( gnu) : ga_cv_c_warning_flags="-Wall -Wextra -Wdeclaration-after-statement -Wno-unused-parameter -pedantic -Wno-long-long -Wnested-externs -ansi" ;; #( hp) : ga_cv_c_warning_flags= ;; #( ibm) : ga_cv_c_warning_flags= ;; #( intel) : ga_cv_c_warning_flags="-Wall" ;; #( kai) : ga_cv_c_warning_flags= ;; #( lcc) : ga_cv_c_warning_flags= ;; #( metrowerks) : ga_cv_c_warning_flags= ;; #( microsoft) : ga_cv_c_warning_flags= ;; #( pathscale) : ga_cv_c_warning_flags="-Wall -fullwarn -Wno-unused-parameter -pedantic -Wno-long-long -Wnested-externs" ;; #( portland) : ga_cv_c_warning_flags="-Xc" ;; #( sgi) : ga_cv_c_warning_flags= ;; #( sun) : ga_cv_c_warning_flags= ;; #( watcom) : ga_cv_c_warning_flags= ;; #( *) : ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: ga_cv_c_warning_flags: $ga_cv_c_warning_flags" >&5 $as_echo "$ga_cv_c_warning_flags" >&6; } GA_C_WARN=$ga_cv_c_warning_flags fi ga_save_CFLAGS="$CFLAGS" CFLAGS="$ga_cv_c_warning_flags $CFLAGS" if test x$with_mpi_wrappers = xyes; then : # Find perl. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Create inside.pl. rm -f inside.pl cat >inside.pl <<"EOF" #!/usr/bin/perl use strict; use warnings; my $numargs = $#ARGV + 1; if ($numargs != 2) { print "Usage: wrapped.txt naked.txt\n"; exit 1; } # Read each input file as a string (rather than a list). local $/=undef; open WRAPPED, "$ARGV[0]" or die "Could not open wrapped text file: $!"; my $wrapped_lines = ; close WRAPPED; open NAKED, "$ARGV[1]" or die "Could not open naked text file: $!"; my $naked_lines = ; close NAKED; # Replace newlines, + from wrapped and naked lines. $wrapped_lines =~ tr/\n+/ /; $naked_lines =~ tr/\n+/ /; # Remove whitespace from beginning of wrapped and naked lines. $wrapped_lines =~ s/^\s+//; $naked_lines =~ s/^\s+//; # Remove whitespace from end of wrapped and naked lines. $wrapped_lines =~ s/\s+$//; $naked_lines =~ s/\s+$//; # If either wrapped_lines or naked_lines are empty, this is an error. # It is assumed that the particular version string which created the input # files should generate SOMETHING. unless ($wrapped_lines) { exit 1; } unless ($naked_lines) { exit 1; } # Cray compilers append a timestamp into their version string. Remove it. if ($wrapped_lines =~ /\QCray\E/) { $wrapped_lines = substr $wrapped_lines, 0, -28; $naked_lines = substr $naked_lines, 0, -28; } # Can the naked lines be found within the wrapped lines? if ($wrapped_lines =~ /\Q$naked_lines\E/) { #print "Found as substring\n"; exit 0; } # Are the naked lines exactly the same as the wrapped lines? elsif ($wrapped_lines eq $naked_lines) { #print "Found equal\n"; exit 0; } else { #print "Not found\n"; exit 1; } EOF inside="$PERL inside.pl" wrapped="$CC" case $wrapped in #( *_r) : compilers="bgxlc_r xlc_r" ;; #( *) : compilers="bgxlc xlc pgcc pathcc icc sxcc fcc opencc suncc craycc gcc ecc cl ccc cc" ;; #( *) : ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for base $wrapped compiler" >&5 $as_echo_n "checking for base $wrapped compiler... " >&6; } if ${ga_cv_mpic_naked+:} false; then : $as_echo_n "(cached) " >&6 else base="`$wrapped -show 2>/dev/null | sed 's/[ ].*$//' | head -1`" ga_save_CC="$CC" CC="$base" # if -m32 or -m64 is present in the -show params, or separately, add it unwrapped_args="`$wrapped -show 2>/dev/null`" extra_arg="" for arg in $unwrapped_args $wrapped do case $arg in #( *-m32*) : extra_arg="-m32" ;; #( *-m64*) : extra_arg="-m64" ;; #( *) : ;; esac done if test "x$extra_arg" != x; then : base="$base $extra_arg" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ga_cv_mpic_naked="$base" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CC="$ga_save_CC" versions="--version -v -V -qversion" found_wrapped_version=0 # Try separating stdout and stderr. Only compare stdout. if test "x$ga_cv_mpic_naked" = x; then : # prepend any CC/CXX/F77 the user may have specified compilers="$ga_orig_CC $compilers" echo "only comparing stdout" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err naked.txt naked.err if $wrapped $version 1>mpi.txt 2>mpi.err; then : found_wrapped_version=1 for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpic_naked" != x; then : break fi done fi # Perhaps none of the MPI compilers had a zero exit status (this is bad). # In this case we have to do a brute force match regardless of exit status. if test "x$found_wrapped_version" = x0; then : if test "x$ga_cv_mpic_naked" = x; then : echo "no zero exit status found for MPI compilers" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpic_naked" != x; then : break fi done fi fi # Try by combining stdout/err into one file. if test "x$ga_cv_mpic_naked" = x; then : echo "try combining stdout and stderr into one file" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt naked.txt if $wrapped $version 1>mpi.txt 2>&1; then : for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>&1; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpic_naked" != x; then : break fi done fi # If we got this far, then it's likely that the MPI compiler had a zero exit # status when it shouldn't have for one version flag, but later had a non-zero # exit status for a flag it shouldn't have. One false positive hid a false # negative. In this case, brute force compare all MPI compiler output against # all compiler output. if test "x$ga_cv_mpic_naked" = x; then : echo "we have a very badly behaving MPI compiler" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpic_naked" != x; then : break fi done fi rm -f mpi.txt mpi.err naked.txt naked.err fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_mpic_naked" >&5 $as_echo "$ga_cv_mpic_naked" >&6; } if test "x$ga_cv_mpic_naked" = x; then : as_fn_error $? "Could not determine the C compiler wrapped by MPI" "$LINENO" 5 else if test "x$ga_orig_CC" != x && test "x$ga_orig_CC" != "x$ga_cv_mpic_naked"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unwrapped $wrapped ($ga_cv_mpic_naked) does not match user-specified $ga_orig_CC" >&5 $as_echo "$as_me: WARNING: unwrapped $wrapped ($ga_cv_mpic_naked) does not match user-specified $ga_orig_CC" >&2;} fi fi rm -f inside.pl else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( -L*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -WL*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -Wl*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -I*) : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS $arg" ;; #( *.a) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *.so) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *lib) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( -mkl*) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi done fi if test "x$with_mpi" != xno; then : case $enable_mpi_tests in #( yes) : ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ga_cv_c_mpi_test_link=no if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a C MPI program links natively" >&5 $as_echo_n "checking whether a C MPI program links natively... " >&6; } if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link=yes GA_MP_LIBS= GA_MP_LDFLAGS= GA_MP_CPPFLAGS= else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi # That didn't work, so now let's try adding our GA_MP_* flags. # The CPPFLAGS and LDFLAGS are added up top here, but LIBS will change. ga_save_LIBS="$LIBS" ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a C MPI program links with additional env" >&5 $as_echo_n "checking whether a C MPI program links with additional env... " >&6; } LIBS="$LIBS $GA_MP_LIBS" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link=yes else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi # That didn't work, so now let's try with specific libs. if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mvapich libraries" >&5 $as_echo_n "checking for mvapich libraries... " >&6; } for lib in "-lmpich -lpthread" "-lmpich" do LIBS="$LIBS $lib" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link="$lib"; break else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" done LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpich libraries" >&5 $as_echo_n "checking for mpich libraries... " >&6; } for lib in "-lmpich -lpthread" "-lmpich" do LIBS="$LIBS $lib" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link="$lib"; break else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" done LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hpmpi libraries" >&5 $as_echo_n "checking for hpmpi libraries... " >&6; } for lib in "-lhpmpio -lhpmpi" "-lhpmpi" do LIBS="$LIBS $lib" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link="$lib"; break else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" done LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intelmpi libraries" >&5 $as_echo_n "checking for intelmpi libraries... " >&6; } for lib in "-lmpi -lmpiif -lmpigi -lrt -lpthread" "-lmpi -lmpiif -lmpigi" do LIBS="$LIBS $lib" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link="$lib"; break else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" done LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi if test "x$ga_cv_c_mpi_test_link" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openmpi libraries" >&5 $as_echo_n "checking for openmpi libraries... " >&6; } for lib in "-lmpi -lpthread" "-lmpi" do LIBS="$LIBS $lib" if ac_fn_c_try_link "$LINENO"; then : ga_cv_c_mpi_test_link="$lib"; break else ga_cv_c_mpi_test_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext LIBS="$ga_save_LIBS" done LIBS="$ga_save_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_link" >&5 $as_echo "$ga_cv_c_mpi_test_link" >&6; } fi rm -f conftest.$ac_ext LIBS="$ga_save_LIBS" LDFLAGS="$ga_save_LDFLAGS" CPPFLAGS="$ga_save_CPPFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ga_cv_c_mpi_test_link in #( yes) : ;; #( no) : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "could not link a C MPI program See \`config.log' for more details" "$LINENO" 5; } ;; #( *) : GA_MP_LIBS="$ga_cv_c_mpi_test_link" ;; #( *) : ;; esac ;; #( no) : ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a simple C MPI program compiles" >&5 $as_echo_n "checking whether a simple C MPI program compiles... " >&6; } if ${ga_cv_c_mpi_test_compile+:} false; then : $as_echo_n "(cached) " >&6 else ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" if ac_fn_c_try_compile "$LINENO"; then : ga_cv_c_mpi_test_compile=yes else ga_cv_c_mpi_test_compile=no fi rm -f core conftest.err conftest.$ac_objext CPPFLAGS="$ga_save_CPPFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_compile" >&5 $as_echo "$ga_cv_c_mpi_test_compile" >&6; } rm -f conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ga_cv_c_mpi_test_compile" = xno; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "could not compile simple C MPI program See \`config.log' for more details" "$LINENO" 5; } fi ;; #( *) : ;; esac fi # Hack to append .x to executables. EXEEXT=.x$EXEEXT if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_target64_sizeof_voidp" ""; then : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TARGET 64bit-ness" >&5 $as_echo_n "checking for TARGET 64bit-ness... " >&6; } if ${ga_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test x$ga_target64_sizeof_voidp = x8; then : ga_cv_target=${ga_cv_target_base}64 else ga_cv_target=$ga_cv_target_base fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_target" >&5 $as_echo "$ga_cv_target" >&6; } cat >>confdefs.h <<_ACEOF #define $ga_cv_target 1 _ACEOF # Establish the underlying network infrastructure (SOCKETS, OPENIB, etc) # Clear the variables we will be using, just in case. ga_armci_network= ARMCI_NETWORK_LIBS= ARMCI_NETWORK_LDFLAGS= ARMCI_NETWORK_CPPFLAGS= # Check whether --enable-autodetect was given. if test "${enable_autodetect+set}" = set; then : enableval=$enable_autodetect; fi # First, all of the "--with" stuff is taken care of. armci_network_external=0 armci_network_count=0 # Check whether --with-armci was given. if test "${with_armci+set}" = set; then : withval=$with_armci; fi if test "x$with_armci" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_armci ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_armci not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_armci not parsed" >&2;} fi done fi if test "x$with_armci" != xno && test "x$with_armci" != x; then : ga_armci_network=ARMCI as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-bgml was given. if test "${with_bgml+set}" = set; then : withval=$with_bgml; fi if test "x$with_bgml" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_bgml ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_bgml not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_bgml not parsed" >&2;} fi done fi if test "x$with_bgml" != xno && test "x$with_bgml" != x; then : ga_armci_network=BGML as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-cray-shmem was given. if test "${with_cray_shmem+set}" = set; then : withval=$with_cray_shmem; fi if test "x$with_cray_shmem" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_cray_shmem ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_cray_shmem not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_cray_shmem not parsed" >&2;} fi done fi if test "x$with_cray_shmem" != xno && test "x$with_cray_shmem" != x; then : ga_armci_network=CRAY_SHMEM as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-dcmf was given. if test "${with_dcmf+set}" = set; then : withval=$with_dcmf; fi if test "x$with_dcmf" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_dcmf ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dcmf not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dcmf not parsed" >&2;} fi done fi if test "x$with_dcmf" != xno && test "x$with_dcmf" != x; then : ga_armci_network=DCMF as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-dmapp was given. if test "${with_dmapp+set}" = set; then : withval=$with_dmapp; fi if test "x$with_dmapp" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_dmapp ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_dmapp not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_dmapp not parsed" >&2;} fi done fi if test "x$with_dmapp" != xno && test "x$with_dmapp" != x; then : ga_armci_network=DMAPP as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-gemini was given. if test "${with_gemini+set}" = set; then : withval=$with_gemini; fi if test "x$with_gemini" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_gemini ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_gemini not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_gemini not parsed" >&2;} fi done fi if test "x$with_gemini" != xno && test "x$with_gemini" != x; then : ga_armci_network=GEMINI as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-lapi was given. if test "${with_lapi+set}" = set; then : withval=$with_lapi; fi if test "x$with_lapi" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_lapi ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_lapi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_lapi not parsed" >&2;} fi done fi if test "x$with_lapi" != xno && test "x$with_lapi" != x; then : ga_armci_network=LAPI as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-mpi-mt was given. if test "${with_mpi_mt+set}" = set; then : withval=$with_mpi_mt; fi if test "x$with_mpi_mt" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi_mt ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_mt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_mt not parsed" >&2;} fi done fi if test "x$with_mpi_mt" != xno && test "x$with_mpi_mt" != x; then : ga_armci_network=MPI_MT as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-mpi-pt was given. if test "${with_mpi_pt+set}" = set; then : withval=$with_mpi_pt; fi if test "x$with_mpi_pt" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi_pt ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pt not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pt not parsed" >&2;} fi done fi if test "x$with_mpi_pt" != xno && test "x$with_mpi_pt" != x; then : ga_armci_network=MPI_PT as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-mpi-pr was given. if test "${with_mpi_pr+set}" = set; then : withval=$with_mpi_pr; fi if test "x$with_mpi_pr" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi_pr ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_pr not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_pr not parsed" >&2;} fi done fi if test "x$with_mpi_pr" != xno && test "x$with_mpi_pr" != x; then : ga_armci_network=MPI_PR as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-mpi-spawn was given. if test "${with_mpi_spawn+set}" = set; then : withval=$with_mpi_spawn; fi if test "x$with_mpi_spawn" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi_spawn ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_spawn not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_spawn not parsed" >&2;} fi done fi if test "x$with_mpi_spawn" != xno && test "x$with_mpi_spawn" != x; then : ga_armci_network=MPI_SPAWN as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-mpi-ts was given. if test "${with_mpi_ts+set}" = set; then : withval=$with_mpi_ts; fi if test "x$with_mpi_ts" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi_ts ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi_ts not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi_ts not parsed" >&2;} fi done fi if test "x$with_mpi_ts" != xno && test "x$with_mpi_ts" != x; then : ga_armci_network=MPI_TS as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-ofa was given. if test "${with_ofa+set}" = set; then : withval=$with_ofa; fi if test "x$with_ofa" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_ofa ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ofa not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ofa not parsed" >&2;} fi done fi if test "x$with_ofa" != xno && test "x$with_ofa" != x; then : ga_armci_network=OFA as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-openib was given. if test "${with_openib+set}" = set; then : withval=$with_openib; fi if test "x$with_openib" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_openib ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_openib not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_openib not parsed" >&2;} fi done fi if test "x$with_openib" != xno && test "x$with_openib" != x; then : ga_armci_network=OPENIB as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-portals4 was given. if test "${with_portals4+set}" = set; then : withval=$with_portals4; fi if test "x$with_portals4" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_portals4 ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals4 not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals4 not parsed" >&2;} fi done fi if test "x$with_portals4" != xno && test "x$with_portals4" != x; then : ga_armci_network=PORTALS4 as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-portals was given. if test "${with_portals+set}" = set; then : withval=$with_portals; fi if test "x$with_portals" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_portals ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_portals not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_portals not parsed" >&2;} fi done fi if test "x$with_portals" != xno && test "x$with_portals" != x; then : ga_armci_network=PORTALS as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Check whether --with-sockets was given. if test "${with_sockets+set}" = set; then : withval=$with_sockets; fi if test "x$with_sockets" != x; then : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_sockets ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( -L*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -WL*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -Wl*) : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS $arg" ;; #( -I*) : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS $arg" ;; #( *.a) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *.so) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *lib) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi ;; #( -mkl*) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : ARMCI_NETWORK_LDFLAGS="$ARMCI_NETWORK_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : ARMCI_NETWORK_CPPFLAGS="$ARMCI_NETWORK_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_sockets not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_sockets not parsed" >&2;} fi done fi if test "x$with_sockets" != xno && test "x$with_sockets" != x; then : ga_armci_network=SOCKETS as_fn_arith $armci_network_count + 1 && armci_network_count=$as_val fi # Temporarily add ARMCI_NETWORK_CPPFLAGS to CPPFLAGS. ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $ARMCI_NETWORK_CPPFLAGS" # Temporarily add ARMCI_NETWORK_LDFLAGS to LDFLAGS. ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $ARMCI_NETWORK_LDFLAGS" # Temporarily add ARMCI_NETWORK_LIBS to LIBS. ga_save_LIBS="$LIBS"; LIBS="$ARMCI_NETWORK_LIBS $LIBS" if test "x$enable_autodetect" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for ARMCI_NETWORK..." >&5 $as_echo "$as_me: searching for ARMCI_NETWORK..." >&6;} if test "x$ga_armci_network" = x && test "x$with_bgml" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for BGML..." >&5 $as_echo "$as_me: searching for BGML..." >&6;} happy=yes if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing BGLML_memcpy" >&5 $as_echo_n "checking for library containing BGLML_memcpy... " >&6; } if ${ac_cv_search_BGLML_memcpy+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char BGLML_memcpy (); int main () { return BGLML_memcpy (); ; return 0; } _ACEOF for ac_lib in '' msglayer.rts; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lrts.rts -ldevices.rts $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_BGLML_memcpy=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_BGLML_memcpy+:} false; then : break fi done if ${ac_cv_search_BGLML_memcpy+:} false; then : else ac_cv_search_BGLML_memcpy=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_BGLML_memcpy" >&5 $as_echo "$ac_cv_search_BGLML_memcpy" >&6; } ac_res=$ac_cv_search_BGLML_memcpy if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_BGLML_memcpy in #( "none required") : ;; #( no) : ;; #( *) : # add msglayer.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *msglayer.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lmsglayer.rts" ;; esac # add extra lib rts.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *rts.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lrts.rts" ;; esac # add extra lib devices.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *devices.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldevices.rts" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=BGML; with_bgml=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_cray_shmem" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for CRAY_SHMEM..." >&5 $as_echo "$as_me: searching for CRAY_SHMEM..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "mpp/shmem.h" "ac_cv_header_mpp_shmem_h" "$ac_includes_default" if test "x$ac_cv_header_mpp_shmem_h" = xyes; then : else ac_fn_c_check_header_mongrel "$LINENO" "shmem.h" "ac_cv_header_shmem_h" "$ac_includes_default" if test "x$ac_cv_header_shmem_h" = xyes; then : else happy=no fi fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing shmem_init" >&5 $as_echo_n "checking for library containing shmem_init... " >&6; } if ${ac_cv_search_shmem_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmem_init (); int main () { return shmem_init (); ; return 0; } _ACEOF for ac_lib in '' sma; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_shmem_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_shmem_init+:} false; then : break fi done if ${ac_cv_search_shmem_init+:} false; then : else ac_cv_search_shmem_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_shmem_init" >&5 $as_echo "$ac_cv_search_shmem_init" >&6; } ac_res=$ac_cv_search_shmem_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_shmem_init in #( "none required") : ;; #( no) : ;; #( *) : # add sma to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *sma*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lsma" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=CRAY_SHMEM; with_cray_shmem=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_dcmf" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for DCMF..." >&5 $as_echo "$as_me: searching for DCMF..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "dcmf.h" "ac_cv_header_dcmf_h" "$ac_includes_default" if test "x$ac_cv_header_dcmf_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing DCMF_Messager_initialize" >&5 $as_echo_n "checking for library containing DCMF_Messager_initialize... " >&6; } if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DCMF_Messager_initialize (); int main () { return DCMF_Messager_initialize (); ; return 0; } _ACEOF for ac_lib in '' dcmf.cnk; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -ldcmfcoll.cnk -lSPI.cna -lrt $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_DCMF_Messager_initialize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : break fi done if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : else ac_cv_search_DCMF_Messager_initialize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_DCMF_Messager_initialize" >&5 $as_echo "$ac_cv_search_DCMF_Messager_initialize" >&6; } ac_res=$ac_cv_search_DCMF_Messager_initialize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_DCMF_Messager_initialize in #( "none required") : ;; #( no) : ;; #( *) : # add dcmf.cnk to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *dcmf.cnk*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldcmf.cnk" ;; esac # add extra lib dcmfcoll.cnk if not there case $ARMCI_NETWORK_LIBS in #( *dcmfcoll.cnk*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldcmfcoll.cnk" ;; esac # add extra lib SPI.cna if not there case $ARMCI_NETWORK_LIBS in #( *SPI.cna*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lSPI.cna" ;; esac # add extra lib rt if not there case $ARMCI_NETWORK_LIBS in #( *rt*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lrt" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=DCMF; with_dcmf=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_lapi" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for LAPI..." >&5 $as_echo "$as_me: searching for LAPI..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "lapi.h" "ac_cv_header_lapi_h" "$ac_includes_default" if test "x$ac_cv_header_lapi_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing LAPI_Init" >&5 $as_echo_n "checking for library containing LAPI_Init... " >&6; } if ${ac_cv_search_LAPI_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char LAPI_Init (); int main () { return LAPI_Init (); ; return 0; } _ACEOF for ac_lib in '' lapi_r lapi; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_LAPI_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_LAPI_Init+:} false; then : break fi done if ${ac_cv_search_LAPI_Init+:} false; then : else ac_cv_search_LAPI_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_LAPI_Init" >&5 $as_echo "$ac_cv_search_LAPI_Init" >&6; } ac_res=$ac_cv_search_LAPI_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_LAPI_Init in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_LAPI_Init*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_LAPI_Init" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=LAPI; with_lapi=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_ofa" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for OFA..." >&5 $as_echo "$as_me: searching for OFA..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_verbs_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ibv_open_device" >&5 $as_echo_n "checking for library containing ibv_open_device... " >&6; } if ${ac_cv_search_ibv_open_device+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ibv_open_device (); int main () { return ibv_open_device (); ; return 0; } _ACEOF for ac_lib in '' ibverbs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ibv_open_device=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ibv_open_device+:} false; then : break fi done if ${ac_cv_search_ibv_open_device+:} false; then : else ac_cv_search_ibv_open_device=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ibv_open_device" >&5 $as_echo "$ac_cv_search_ibv_open_device" >&6; } ac_res=$ac_cv_search_ibv_open_device if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ibv_open_device in #( "none required") : ;; #( no) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ibv_open_device" ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=OFA; with_ofa=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_openib" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for OPENIB..." >&5 $as_echo "$as_me: searching for OPENIB..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_verbs_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ibv_open_device" >&5 $as_echo_n "checking for library containing ibv_open_device... " >&6; } if ${ac_cv_search_ibv_open_device+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ibv_open_device (); int main () { return ibv_open_device (); ; return 0; } _ACEOF for ac_lib in '' ibverbs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ibv_open_device=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ibv_open_device+:} false; then : break fi done if ${ac_cv_search_ibv_open_device+:} false; then : else ac_cv_search_ibv_open_device=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ibv_open_device" >&5 $as_echo "$ac_cv_search_ibv_open_device" >&6; } ac_res=$ac_cv_search_ibv_open_device if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ibv_open_device in #( "none required") : ;; #( no) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ibv_open_device" ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=OPENIB; with_openib=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_portals4" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for PORTALS4..." >&5 $as_echo "$as_me: searching for PORTALS4..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=PORTALS4; with_portals4=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_portals" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for PORTALS..." >&5 $as_echo "$as_me: searching for PORTALS..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "portals/portals3.h" "ac_cv_header_portals_portals3_h" "$ac_includes_default" if test "x$ac_cv_header_portals_portals3_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "portals/nal.h" "ac_cv_header_portals_nal_h" "$ac_includes_default" if test "x$ac_cv_header_portals_nal_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing PtlInit" >&5 $as_echo_n "checking for library containing PtlInit... " >&6; } if ${ac_cv_search_PtlInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char PtlInit (); int main () { return PtlInit (); ; return 0; } _ACEOF for ac_lib in '' portals; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_PtlInit=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_PtlInit+:} false; then : break fi done if ${ac_cv_search_PtlInit+:} false; then : else ac_cv_search_PtlInit=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_PtlInit" >&5 $as_echo "$ac_cv_search_PtlInit" >&6; } ac_res=$ac_cv_search_PtlInit if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi if test "x$happy" = xyes; then : ga_armci_network=PORTALS; with_portals=yes; fi fi if test "x$ga_armci_network" = x && test "x$with_dmapp" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for DMAPP..." >&5 $as_echo "$as_me: searching for DMAPP..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=DMAPP; with_dmapp=yes; fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethugepagesize" >&5 $as_echo_n "checking for library containing gethugepagesize... " >&6; } if ${ac_cv_search_gethugepagesize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethugepagesize (); int main () { return gethugepagesize (); ; return 0; } _ACEOF for ac_lib in '' hugetlbfs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethugepagesize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethugepagesize+:} false; then : break fi done if ${ac_cv_search_gethugepagesize+:} false; then : else ac_cv_search_gethugepagesize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethugepagesize" >&5 $as_echo "$ac_cv_search_gethugepagesize" >&6; } ac_res=$ac_cv_search_gethugepagesize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi case $ac_cv_search_gethugepagesize in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_gethugepagesize*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_gethugepagesize" ;; esac ;; esac fi fi if test "x$ga_armci_network" = x && test "x$with_gemini" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for GEMINI..." >&5 $as_echo "$as_me: searching for GEMINI..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_compile "$LINENO" "numatoolkit.h" "ac_cv_header_numatoolkit_h" " $ac_includes_default #include " if test "x$ac_cv_header_numatoolkit_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing NTK_Init" >&5 $as_echo_n "checking for library containing NTK_Init... " >&6; } if ${ac_cv_search_NTK_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char NTK_Init (); int main () { return NTK_Init (); ; return 0; } _ACEOF for ac_lib in '' numatoolkit; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_NTK_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_NTK_Init+:} false; then : break fi done if ${ac_cv_search_NTK_Init+:} false; then : else ac_cv_search_NTK_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_NTK_Init" >&5 $as_echo "$ac_cv_search_NTK_Init" >&6; } ac_res=$ac_cv_search_NTK_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi # CPPFLAGS must have CRAY_UGNI before looking for the next headers. gemini_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS -DCRAY_UGNI" if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "onesided.h" "ac_cv_header_onesided_h" "$ac_includes_default" if test "x$ac_cv_header_onesided_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "gni.h" "ac_cv_header_gni_h" "$ac_includes_default" if test "x$ac_cv_header_gni_h" = xyes; then : else happy=no fi fi CPPFLAGS="$gemini_save_CPPFLAGS" if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gniInit" >&5 $as_echo_n "checking for library containing gniInit... " >&6; } if ${ac_cv_search_gniInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gniInit (); int main () { return gniInit (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gniInit=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gniInit+:} false; then : break fi done if ${ac_cv_search_gniInit+:} false; then : else ac_cv_search_gniInit=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gniInit" >&5 $as_echo "$ac_cv_search_gniInit" >&6; } ac_res=$ac_cv_search_gniInit if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi if test "x$happy" = xyes; then : ga_armci_network=GEMINI; with_gemini=yes; fi # check for a function introduced in libonesided/1.5 # we purposefully abuse the ac_cv_search_onesided_mem_htflush value if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing onesided_mem_htflush" >&5 $as_echo_n "checking for library containing onesided_mem_htflush... " >&6; } if ${ac_cv_search_onesided_mem_htflush+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char onesided_mem_htflush (); int main () { return onesided_mem_htflush (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_onesided_mem_htflush=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_onesided_mem_htflush+:} false; then : break fi done if ${ac_cv_search_onesided_mem_htflush+:} false; then : else ac_cv_search_onesided_mem_htflush=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_onesided_mem_htflush" >&5 $as_echo "$ac_cv_search_onesided_mem_htflush" >&6; } ac_res=$ac_cv_search_onesided_mem_htflush if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_onesided_mem_htflush" != xno; then : ac_cv_search_onesided_mem_htflush=1 else ac_cv_search_onesided_mem_htflush=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ONESIDED_MEM_HTFLUSH $ac_cv_search_onesided_mem_htflush _ACEOF fi # check for a function introduced in libonesided/1.6 # we purposefully abuse the ac_cv_search_onesided_fadd value if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing onesided_fadd" >&5 $as_echo_n "checking for library containing onesided_fadd... " >&6; } if ${ac_cv_search_onesided_fadd+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char onesided_fadd (); int main () { return onesided_fadd (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_onesided_fadd=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_onesided_fadd+:} false; then : break fi done if ${ac_cv_search_onesided_fadd+:} false; then : else ac_cv_search_onesided_fadd=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_onesided_fadd" >&5 $as_echo "$ac_cv_search_onesided_fadd" >&6; } ac_res=$ac_cv_search_onesided_fadd if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_onesided_fadd" != xno; then : ac_cv_search_onesided_fadd=1 else ac_cv_search_onesided_fadd=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ONESIDED_FADD $ac_cv_search_onesided_fadd _ACEOF fi fi if test "x$ga_armci_network" = x && test "x$with_armci" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for external ARMCI..." >&5 $as_echo "$as_me: searching for external ARMCI..." >&6;} happy=yes CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" LIBS="$LIBS $GA_MP_LIBS" if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "armci.h" "ac_cv_header_armci_h" "$ac_includes_default" if test "x$ac_cv_header_armci_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ARMCI_Init" >&5 $as_echo_n "checking for library containing ARMCI_Init... " >&6; } if ${ac_cv_search_ARMCI_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ARMCI_Init (); int main () { return ARMCI_Init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ARMCI_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ARMCI_Init+:} false; then : break fi done if ${ac_cv_search_ARMCI_Init+:} false; then : else ac_cv_search_ARMCI_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ARMCI_Init" >&5 $as_echo "$ac_cv_search_ARMCI_Init" >&6; } ac_res=$ac_cv_search_ARMCI_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ARMCI_Init in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_ARMCI_Init*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ARMCI_Init" ;; esac ;; esac fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_group_comm" >&5 $as_echo_n "checking for library containing armci_group_comm... " >&6; } if ${ac_cv_search_armci_group_comm+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_group_comm (); int main () { return armci_group_comm (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_group_comm=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_group_comm+:} false; then : break fi done if ${ac_cv_search_armci_group_comm+:} false; then : else ac_cv_search_armci_group_comm=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_group_comm" >&5 $as_echo "$ac_cv_search_armci_group_comm" >&6; } ac_res=$ac_cv_search_armci_group_comm if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_group_comm" != xno; then : ac_cv_search_armci_group_comm=1 else ac_cv_search_armci_group_comm=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_GROUP_COMM $ac_cv_search_armci_group_comm _ACEOF fi if test "x$happy" = xyes; then : ac_fn_c_check_member "$LINENO" "ARMCI_Group" "comm" "ac_cv_member_ARMCI_Group_comm" "#include " if test "x$ac_cv_member_ARMCI_Group_comm" = xyes; then : fi if test "x$ac_cv_member_ARMCI_Group_comm" != xno; then : ac_cv_member_ARMCI_Group_comm=1 else ac_cv_member_ARMCI_Group_comm=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_GROUP_COMM_MEMBER $ac_cv_member_ARMCI_Group_comm _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ARMCI_Initialized" >&5 $as_echo_n "checking for library containing ARMCI_Initialized... " >&6; } if ${ac_cv_search_ARMCI_Initialized+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ARMCI_Initialized (); int main () { return ARMCI_Initialized (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ARMCI_Initialized=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ARMCI_Initialized+:} false; then : break fi done if ${ac_cv_search_ARMCI_Initialized+:} false; then : else ac_cv_search_ARMCI_Initialized=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ARMCI_Initialized" >&5 $as_echo "$ac_cv_search_ARMCI_Initialized" >&6; } ac_res=$ac_cv_search_ARMCI_Initialized if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_ARMCI_Initialized" != xno; then : ac_cv_search_ARMCI_Initialized=1 else ac_cv_search_ARMCI_Initialized=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_INITIALIZED $ac_cv_search_ARMCI_Initialized _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_stride_info_init" >&5 $as_echo_n "checking for library containing armci_stride_info_init... " >&6; } if ${ac_cv_search_armci_stride_info_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_stride_info_init (); int main () { return armci_stride_info_init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_stride_info_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_stride_info_init+:} false; then : break fi done if ${ac_cv_search_armci_stride_info_init+:} false; then : else ac_cv_search_armci_stride_info_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_stride_info_init" >&5 $as_echo "$ac_cv_search_armci_stride_info_init" >&6; } ac_res=$ac_cv_search_armci_stride_info_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_stride_info_init" != xno; then : ac_cv_search_armci_stride_info_init=1 else ac_cv_search_armci_stride_info_init=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_STRIDE_INFO_INIT $ac_cv_search_armci_stride_info_init _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_notify" >&5 $as_echo_n "checking for library containing armci_notify... " >&6; } if ${ac_cv_search_armci_notify+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_notify (); int main () { return armci_notify (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_notify=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_notify+:} false; then : break fi done if ${ac_cv_search_armci_notify+:} false; then : else ac_cv_search_armci_notify=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_notify" >&5 $as_echo "$ac_cv_search_armci_notify" >&6; } ac_res=$ac_cv_search_armci_notify if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_notify" != xno; then : ac_cv_search_armci_notify=1 else ac_cv_search_armci_notify=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_NOTIFY $ac_cv_search_armci_notify _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_msg_init" >&5 $as_echo_n "checking for library containing armci_msg_init... " >&6; } if ${ac_cv_search_armci_msg_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_msg_init (); int main () { return armci_msg_init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_msg_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_msg_init+:} false; then : break fi done if ${ac_cv_search_armci_msg_init+:} false; then : else ac_cv_search_armci_msg_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_msg_init" >&5 $as_echo "$ac_cv_search_armci_msg_init" >&6; } ac_res=$ac_cv_search_armci_msg_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_msg_init" != xno; then : ac_cv_search_armci_msg_init=1 else ac_cv_search_armci_msg_init=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_MSG_INIT $ac_cv_search_armci_msg_init _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_msg_finalize" >&5 $as_echo_n "checking for library containing armci_msg_finalize... " >&6; } if ${ac_cv_search_armci_msg_finalize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_msg_finalize (); int main () { return armci_msg_finalize (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_msg_finalize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_msg_finalize+:} false; then : break fi done if ${ac_cv_search_armci_msg_finalize+:} false; then : else ac_cv_search_armci_msg_finalize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_msg_finalize" >&5 $as_echo "$ac_cv_search_armci_msg_finalize" >&6; } ac_res=$ac_cv_search_armci_msg_finalize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_msg_finalize" != xno; then : ac_cv_search_armci_msg_finalize=1 else ac_cv_search_armci_msg_finalize=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_MSG_FINALIZE $ac_cv_search_armci_msg_finalize _ACEOF fi if test "x$ac_cv_search_armci_group_comm" = x1; then HAVE_ARMCI_GROUP_COMM_TRUE= HAVE_ARMCI_GROUP_COMM_FALSE='#' else HAVE_ARMCI_GROUP_COMM_TRUE='#' HAVE_ARMCI_GROUP_COMM_FALSE= fi if test "x$ac_cv_member_ARMCI_Group_comm" = x1; then HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE= HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE='#' else HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE='#' HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE= fi if test "x$ac_cv_search_ARMCI_Initialized" = x1; then HAVE_ARMCI_INITIALIZED_TRUE= HAVE_ARMCI_INITIALIZED_FALSE='#' else HAVE_ARMCI_INITIALIZED_TRUE='#' HAVE_ARMCI_INITIALIZED_FALSE= fi if test "x$ac_cv_search_armci_stride_info_init" = x1; then HAVE_ARMCI_STRIDE_INFO_INIT_TRUE= HAVE_ARMCI_STRIDE_INFO_INIT_FALSE='#' else HAVE_ARMCI_STRIDE_INFO_INIT_TRUE='#' HAVE_ARMCI_STRIDE_INFO_INIT_FALSE= fi if test "x$ac_cv_search_armci_notify" = x1; then HAVE_ARMCI_NOTIFY_TRUE= HAVE_ARMCI_NOTIFY_FALSE='#' else HAVE_ARMCI_NOTIFY_TRUE='#' HAVE_ARMCI_NOTIFY_FALSE= fi if test "x$ac_cv_search_armci_msg_init" = x1; then HAVE_ARMCI_MSG_INIT_TRUE= HAVE_ARMCI_MSG_INIT_FALSE='#' else HAVE_ARMCI_MSG_INIT_TRUE='#' HAVE_ARMCI_MSG_INIT_FALSE= fi if test "x$ac_cv_search_armci_msg_finalize" = x1; then HAVE_ARMCI_MSG_FINALIZE_TRUE= HAVE_ARMCI_MSG_FINALIZE_FALSE='#' else HAVE_ARMCI_MSG_FINALIZE_TRUE='#' HAVE_ARMCI_MSG_FINALIZE_FALSE= fi if test "x$happy" = xyes; then : ga_armci_network=ARMCI; with_armci=yes; armci_network_external=1; else armci_network_external=0; fi fi if test "x$ga_armci_network" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: !!!" >&5 $as_echo "$as_me: WARNING: !!!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No ARMCI_NETWORK detected, defaulting to MPI_TS" >&5 $as_echo "$as_me: WARNING: No ARMCI_NETWORK detected, defaulting to MPI_TS" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: !!!" >&5 $as_echo "$as_me: WARNING: !!!" >&2;} ga_armci_network=MPI_TS; with_mpi_ts=yes fi else # Not autodetecting # Check whether multiple armci networks were selected by user. case $armci_network_count in #( 0) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No ARMCI_NETWORK specified, defaulting to MPI_TS" >&5 $as_echo "$as_me: WARNING: No ARMCI_NETWORK specified, defaulting to MPI_TS" >&2;} ga_armci_network=MPI_TS; with_mpi_ts=yes ;; #( 1) : if test "x$ga_armci_network" = xARMCI; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for external ARMCI..." >&5 $as_echo "$as_me: searching for external ARMCI..." >&6;} happy=yes CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" LIBS="$LIBS $GA_MP_LIBS" if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "armci.h" "ac_cv_header_armci_h" "$ac_includes_default" if test "x$ac_cv_header_armci_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ARMCI_Init" >&5 $as_echo_n "checking for library containing ARMCI_Init... " >&6; } if ${ac_cv_search_ARMCI_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ARMCI_Init (); int main () { return ARMCI_Init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ARMCI_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ARMCI_Init+:} false; then : break fi done if ${ac_cv_search_ARMCI_Init+:} false; then : else ac_cv_search_ARMCI_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ARMCI_Init" >&5 $as_echo "$ac_cv_search_ARMCI_Init" >&6; } ac_res=$ac_cv_search_ARMCI_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ARMCI_Init in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_ARMCI_Init*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ARMCI_Init" ;; esac ;; esac fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_group_comm" >&5 $as_echo_n "checking for library containing armci_group_comm... " >&6; } if ${ac_cv_search_armci_group_comm+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_group_comm (); int main () { return armci_group_comm (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_group_comm=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_group_comm+:} false; then : break fi done if ${ac_cv_search_armci_group_comm+:} false; then : else ac_cv_search_armci_group_comm=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_group_comm" >&5 $as_echo "$ac_cv_search_armci_group_comm" >&6; } ac_res=$ac_cv_search_armci_group_comm if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_group_comm" != xno; then : ac_cv_search_armci_group_comm=1 else ac_cv_search_armci_group_comm=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_GROUP_COMM $ac_cv_search_armci_group_comm _ACEOF fi if test "x$happy" = xyes; then : ac_fn_c_check_member "$LINENO" "ARMCI_Group" "comm" "ac_cv_member_ARMCI_Group_comm" "#include " if test "x$ac_cv_member_ARMCI_Group_comm" = xyes; then : fi if test "x$ac_cv_member_ARMCI_Group_comm" != xno; then : ac_cv_member_ARMCI_Group_comm=1 else ac_cv_member_ARMCI_Group_comm=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_GROUP_COMM_MEMBER $ac_cv_member_ARMCI_Group_comm _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ARMCI_Initialized" >&5 $as_echo_n "checking for library containing ARMCI_Initialized... " >&6; } if ${ac_cv_search_ARMCI_Initialized+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ARMCI_Initialized (); int main () { return ARMCI_Initialized (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ARMCI_Initialized=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ARMCI_Initialized+:} false; then : break fi done if ${ac_cv_search_ARMCI_Initialized+:} false; then : else ac_cv_search_ARMCI_Initialized=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ARMCI_Initialized" >&5 $as_echo "$ac_cv_search_ARMCI_Initialized" >&6; } ac_res=$ac_cv_search_ARMCI_Initialized if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_ARMCI_Initialized" != xno; then : ac_cv_search_ARMCI_Initialized=1 else ac_cv_search_ARMCI_Initialized=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_INITIALIZED $ac_cv_search_ARMCI_Initialized _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_stride_info_init" >&5 $as_echo_n "checking for library containing armci_stride_info_init... " >&6; } if ${ac_cv_search_armci_stride_info_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_stride_info_init (); int main () { return armci_stride_info_init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_stride_info_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_stride_info_init+:} false; then : break fi done if ${ac_cv_search_armci_stride_info_init+:} false; then : else ac_cv_search_armci_stride_info_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_stride_info_init" >&5 $as_echo "$ac_cv_search_armci_stride_info_init" >&6; } ac_res=$ac_cv_search_armci_stride_info_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_stride_info_init" != xno; then : ac_cv_search_armci_stride_info_init=1 else ac_cv_search_armci_stride_info_init=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_STRIDE_INFO_INIT $ac_cv_search_armci_stride_info_init _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_notify" >&5 $as_echo_n "checking for library containing armci_notify... " >&6; } if ${ac_cv_search_armci_notify+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_notify (); int main () { return armci_notify (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_notify=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_notify+:} false; then : break fi done if ${ac_cv_search_armci_notify+:} false; then : else ac_cv_search_armci_notify=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_notify" >&5 $as_echo "$ac_cv_search_armci_notify" >&6; } ac_res=$ac_cv_search_armci_notify if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_notify" != xno; then : ac_cv_search_armci_notify=1 else ac_cv_search_armci_notify=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_NOTIFY $ac_cv_search_armci_notify _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_msg_init" >&5 $as_echo_n "checking for library containing armci_msg_init... " >&6; } if ${ac_cv_search_armci_msg_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_msg_init (); int main () { return armci_msg_init (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_msg_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_msg_init+:} false; then : break fi done if ${ac_cv_search_armci_msg_init+:} false; then : else ac_cv_search_armci_msg_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_msg_init" >&5 $as_echo "$ac_cv_search_armci_msg_init" >&6; } ac_res=$ac_cv_search_armci_msg_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_msg_init" != xno; then : ac_cv_search_armci_msg_init=1 else ac_cv_search_armci_msg_init=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_MSG_INIT $ac_cv_search_armci_msg_init _ACEOF fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing armci_msg_finalize" >&5 $as_echo_n "checking for library containing armci_msg_finalize... " >&6; } if ${ac_cv_search_armci_msg_finalize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char armci_msg_finalize (); int main () { return armci_msg_finalize (); ; return 0; } _ACEOF for ac_lib in '' armci; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_armci_msg_finalize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_armci_msg_finalize+:} false; then : break fi done if ${ac_cv_search_armci_msg_finalize+:} false; then : else ac_cv_search_armci_msg_finalize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_armci_msg_finalize" >&5 $as_echo "$ac_cv_search_armci_msg_finalize" >&6; } ac_res=$ac_cv_search_armci_msg_finalize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_armci_msg_finalize" != xno; then : ac_cv_search_armci_msg_finalize=1 else ac_cv_search_armci_msg_finalize=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ARMCI_MSG_FINALIZE $ac_cv_search_armci_msg_finalize _ACEOF fi if test "x$ac_cv_search_armci_group_comm" = x1; then HAVE_ARMCI_GROUP_COMM_TRUE= HAVE_ARMCI_GROUP_COMM_FALSE='#' else HAVE_ARMCI_GROUP_COMM_TRUE='#' HAVE_ARMCI_GROUP_COMM_FALSE= fi if test "x$ac_cv_member_ARMCI_Group_comm" = x1; then HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE= HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE='#' else HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE='#' HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE= fi if test "x$ac_cv_search_ARMCI_Initialized" = x1; then HAVE_ARMCI_INITIALIZED_TRUE= HAVE_ARMCI_INITIALIZED_FALSE='#' else HAVE_ARMCI_INITIALIZED_TRUE='#' HAVE_ARMCI_INITIALIZED_FALSE= fi if test "x$ac_cv_search_armci_stride_info_init" = x1; then HAVE_ARMCI_STRIDE_INFO_INIT_TRUE= HAVE_ARMCI_STRIDE_INFO_INIT_FALSE='#' else HAVE_ARMCI_STRIDE_INFO_INIT_TRUE='#' HAVE_ARMCI_STRIDE_INFO_INIT_FALSE= fi if test "x$ac_cv_search_armci_notify" = x1; then HAVE_ARMCI_NOTIFY_TRUE= HAVE_ARMCI_NOTIFY_FALSE='#' else HAVE_ARMCI_NOTIFY_TRUE='#' HAVE_ARMCI_NOTIFY_FALSE= fi if test "x$ac_cv_search_armci_msg_init" = x1; then HAVE_ARMCI_MSG_INIT_TRUE= HAVE_ARMCI_MSG_INIT_FALSE='#' else HAVE_ARMCI_MSG_INIT_TRUE='#' HAVE_ARMCI_MSG_INIT_FALSE= fi if test "x$ac_cv_search_armci_msg_finalize" = x1; then HAVE_ARMCI_MSG_FINALIZE_TRUE= HAVE_ARMCI_MSG_FINALIZE_FALSE='#' else HAVE_ARMCI_MSG_FINALIZE_TRUE='#' HAVE_ARMCI_MSG_FINALIZE_FALSE= fi if test "x$happy" = xyes; then : ga_armci_network=ARMCI; with_armci=yes; armci_network_external=1; else armci_network_external=0; as_fn_error $? "test for ARMCI_NETWORK=ARMCI failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xBGML; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for BGML..." >&5 $as_echo "$as_me: searching for BGML..." >&6;} happy=yes if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing BGLML_memcpy" >&5 $as_echo_n "checking for library containing BGLML_memcpy... " >&6; } if ${ac_cv_search_BGLML_memcpy+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char BGLML_memcpy (); int main () { return BGLML_memcpy (); ; return 0; } _ACEOF for ac_lib in '' msglayer.rts; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lrts.rts -ldevices.rts $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_BGLML_memcpy=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_BGLML_memcpy+:} false; then : break fi done if ${ac_cv_search_BGLML_memcpy+:} false; then : else ac_cv_search_BGLML_memcpy=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_BGLML_memcpy" >&5 $as_echo "$ac_cv_search_BGLML_memcpy" >&6; } ac_res=$ac_cv_search_BGLML_memcpy if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_BGLML_memcpy in #( "none required") : ;; #( no) : ;; #( *) : # add msglayer.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *msglayer.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lmsglayer.rts" ;; esac # add extra lib rts.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *rts.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lrts.rts" ;; esac # add extra lib devices.rts to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *devices.rts*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldevices.rts" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=BGML; with_bgml=yes; else as_fn_error $? "test for ARMCI_NETWORK=BGML failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xCRAY_SHMEM; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for CRAY_SHMEM..." >&5 $as_echo "$as_me: searching for CRAY_SHMEM..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "mpp/shmem.h" "ac_cv_header_mpp_shmem_h" "$ac_includes_default" if test "x$ac_cv_header_mpp_shmem_h" = xyes; then : else ac_fn_c_check_header_mongrel "$LINENO" "shmem.h" "ac_cv_header_shmem_h" "$ac_includes_default" if test "x$ac_cv_header_shmem_h" = xyes; then : else happy=no fi fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing shmem_init" >&5 $as_echo_n "checking for library containing shmem_init... " >&6; } if ${ac_cv_search_shmem_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmem_init (); int main () { return shmem_init (); ; return 0; } _ACEOF for ac_lib in '' sma; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_shmem_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_shmem_init+:} false; then : break fi done if ${ac_cv_search_shmem_init+:} false; then : else ac_cv_search_shmem_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_shmem_init" >&5 $as_echo "$ac_cv_search_shmem_init" >&6; } ac_res=$ac_cv_search_shmem_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_shmem_init in #( "none required") : ;; #( no) : ;; #( *) : # add sma to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *sma*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lsma" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=CRAY_SHMEM; with_cray_shmem=yes; else as_fn_error $? "test for ARMCI_NETWORK=CRAY_SHMEM failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xDCMF; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for DCMF..." >&5 $as_echo "$as_me: searching for DCMF..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "dcmf.h" "ac_cv_header_dcmf_h" "$ac_includes_default" if test "x$ac_cv_header_dcmf_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing DCMF_Messager_initialize" >&5 $as_echo_n "checking for library containing DCMF_Messager_initialize... " >&6; } if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DCMF_Messager_initialize (); int main () { return DCMF_Messager_initialize (); ; return 0; } _ACEOF for ac_lib in '' dcmf.cnk; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -ldcmfcoll.cnk -lSPI.cna -lrt $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_DCMF_Messager_initialize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : break fi done if ${ac_cv_search_DCMF_Messager_initialize+:} false; then : else ac_cv_search_DCMF_Messager_initialize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_DCMF_Messager_initialize" >&5 $as_echo "$ac_cv_search_DCMF_Messager_initialize" >&6; } ac_res=$ac_cv_search_DCMF_Messager_initialize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_DCMF_Messager_initialize in #( "none required") : ;; #( no) : ;; #( *) : # add dcmf.cnk to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *dcmf.cnk*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldcmf.cnk" ;; esac # add extra lib dcmfcoll.cnk if not there case $ARMCI_NETWORK_LIBS in #( *dcmfcoll.cnk*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -ldcmfcoll.cnk" ;; esac # add extra lib SPI.cna if not there case $ARMCI_NETWORK_LIBS in #( *SPI.cna*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lSPI.cna" ;; esac # add extra lib rt if not there case $ARMCI_NETWORK_LIBS in #( *rt*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS -lrt" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=DCMF; with_dcmf=yes; else as_fn_error $? "test for ARMCI_NETWORK=DCMF failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xDMAPP; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for DMAPP..." >&5 $as_echo "$as_me: searching for DMAPP..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=DMAPP; with_dmapp=yes; else as_fn_error $? "test for ARMCI_NETWORK=DMAPP failed" "$LINENO" 5 fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethugepagesize" >&5 $as_echo_n "checking for library containing gethugepagesize... " >&6; } if ${ac_cv_search_gethugepagesize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethugepagesize (); int main () { return gethugepagesize (); ; return 0; } _ACEOF for ac_lib in '' hugetlbfs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethugepagesize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethugepagesize+:} false; then : break fi done if ${ac_cv_search_gethugepagesize+:} false; then : else ac_cv_search_gethugepagesize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethugepagesize" >&5 $as_echo "$ac_cv_search_gethugepagesize" >&6; } ac_res=$ac_cv_search_gethugepagesize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi case $ac_cv_search_gethugepagesize in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_gethugepagesize*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_gethugepagesize" ;; esac ;; esac fi fi if test "x$ga_armci_network" = xLAPI; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for LAPI..." >&5 $as_echo "$as_me: searching for LAPI..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "lapi.h" "ac_cv_header_lapi_h" "$ac_includes_default" if test "x$ac_cv_header_lapi_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing LAPI_Init" >&5 $as_echo_n "checking for library containing LAPI_Init... " >&6; } if ${ac_cv_search_LAPI_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char LAPI_Init (); int main () { return LAPI_Init (); ; return 0; } _ACEOF for ac_lib in '' lapi_r lapi; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_LAPI_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_LAPI_Init+:} false; then : break fi done if ${ac_cv_search_LAPI_Init+:} false; then : else ac_cv_search_LAPI_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_LAPI_Init" >&5 $as_echo "$ac_cv_search_LAPI_Init" >&6; } ac_res=$ac_cv_search_LAPI_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_LAPI_Init in #( "none required") : ;; #( no) : ;; #( *) : # add missing lib to ARMCI_NETWORK_LIBS if not there case $ARMCI_NETWORK_LIBS in #( *$ac_cv_search_LAPI_Init*) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_LAPI_Init" ;; esac ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=LAPI; with_lapi=yes; else as_fn_error $? "test for ARMCI_NETWORK=LAPI failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xMPI_TS; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for MPI_TS..." >&5 $as_echo "$as_me: searching for MPI_TS..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=MPI_TS; with_mpi_ts=yes; else as_fn_error $? "test for ARMCI_NETWORK=MPI_TS failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xMPI_MT; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for MPI_MT..." >&5 $as_echo "$as_me: searching for MPI_MT..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=MPI_MT; with_mpi_mt=yes; else as_fn_error $? "test for ARMCI_NETWORK=MPI_MT failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xMPI_PT; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for MPI_PT..." >&5 $as_echo "$as_me: searching for MPI_PT..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=MPI_PT; with_mpi_pt=yes; else as_fn_error $? "test for ARMCI_NETWORK=MPI_PT failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xMPI_PR; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for MPI_PR..." >&5 $as_echo "$as_me: searching for MPI_PR..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=MPI_PR; with_mpi_pr=yes; else as_fn_error $? "test for ARMCI_NETWORK=MPI_PR failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xMPI_SPAWN; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for MPI_SPAWN..." >&5 $as_echo "$as_me: searching for MPI_SPAWN..." >&6;} happy=yes CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" LIBS="$LIBS $GA_MP_LIBS" if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "mpi.h" "ac_cv_header_mpi_h" "$ac_includes_default" if test "x$ac_cv_header_mpi_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing MPI_Comm_spawn_multiple" >&5 $as_echo_n "checking for library containing MPI_Comm_spawn_multiple... " >&6; } if ${ac_cv_search_MPI_Comm_spawn_multiple+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char MPI_Comm_spawn_multiple (); int main () { return MPI_Comm_spawn_multiple (); ; return 0; } _ACEOF for ac_lib in '' mpi mpich.cnk mpich.rts; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_MPI_Comm_spawn_multiple=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_MPI_Comm_spawn_multiple+:} false; then : break fi done if ${ac_cv_search_MPI_Comm_spawn_multiple+:} false; then : else ac_cv_search_MPI_Comm_spawn_multiple=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_MPI_Comm_spawn_multiple" >&5 $as_echo "$ac_cv_search_MPI_Comm_spawn_multiple" >&6; } ac_res=$ac_cv_search_MPI_Comm_spawn_multiple if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi if test "x$happy" = xyes; then : ga_armci_network=MPI_SPAWN; with_mpi_spawn=yes; else as_fn_error $? "test for ARMCI_NETWORK=MPI_SPAWN failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xOFA; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for OFA..." >&5 $as_echo "$as_me: searching for OFA..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_verbs_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ibv_open_device" >&5 $as_echo_n "checking for library containing ibv_open_device... " >&6; } if ${ac_cv_search_ibv_open_device+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ibv_open_device (); int main () { return ibv_open_device (); ; return 0; } _ACEOF for ac_lib in '' ibverbs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ibv_open_device=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ibv_open_device+:} false; then : break fi done if ${ac_cv_search_ibv_open_device+:} false; then : else ac_cv_search_ibv_open_device=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ibv_open_device" >&5 $as_echo "$ac_cv_search_ibv_open_device" >&6; } ac_res=$ac_cv_search_ibv_open_device if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ibv_open_device in #( "none required") : ;; #( no) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ibv_open_device" ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=OFA; with_ofa=yes; else as_fn_error $? "test for ARMCI_NETWORK=OFA failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xOPENIB; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for OPENIB..." >&5 $as_echo "$as_me: searching for OPENIB..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default" if test "x$ac_cv_header_infiniband_verbs_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ibv_open_device" >&5 $as_echo_n "checking for library containing ibv_open_device... " >&6; } if ${ac_cv_search_ibv_open_device+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ibv_open_device (); int main () { return ibv_open_device (); ; return 0; } _ACEOF for ac_lib in '' ibverbs; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_ibv_open_device=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_ibv_open_device+:} false; then : break fi done if ${ac_cv_search_ibv_open_device+:} false; then : else ac_cv_search_ibv_open_device=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ibv_open_device" >&5 $as_echo "$ac_cv_search_ibv_open_device" >&6; } ac_res=$ac_cv_search_ibv_open_device if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi case $ac_cv_search_ibv_open_device in #( "none required") : ;; #( no) : ;; #( *) : ARMCI_NETWORK_LIBS="$ARMCI_NETWORK_LIBS $ac_cv_search_ibv_open_device" ;; esac fi if test "x$happy" = xyes; then : ga_armci_network=OPENIB; with_openib=yes; else as_fn_error $? "test for ARMCI_NETWORK=OPENIB failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xPORTALS4; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for PORTALS4..." >&5 $as_echo "$as_me: searching for PORTALS4..." >&6;} happy=yes if test "x$happy" = xyes; then : ga_armci_network=PORTALS4; with_portals4=yes; else as_fn_error $? "test for ARMCI_NETWORK=PORTALS4 failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xPORTALS; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for PORTALS..." >&5 $as_echo "$as_me: searching for PORTALS..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "portals/portals3.h" "ac_cv_header_portals_portals3_h" "$ac_includes_default" if test "x$ac_cv_header_portals_portals3_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "portals/nal.h" "ac_cv_header_portals_nal_h" "$ac_includes_default" if test "x$ac_cv_header_portals_nal_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing PtlInit" >&5 $as_echo_n "checking for library containing PtlInit... " >&6; } if ${ac_cv_search_PtlInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char PtlInit (); int main () { return PtlInit (); ; return 0; } _ACEOF for ac_lib in '' portals; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_PtlInit=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_PtlInit+:} false; then : break fi done if ${ac_cv_search_PtlInit+:} false; then : else ac_cv_search_PtlInit=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_PtlInit" >&5 $as_echo "$ac_cv_search_PtlInit" >&6; } ac_res=$ac_cv_search_PtlInit if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi if test "x$happy" = xyes; then : ga_armci_network=PORTALS; with_portals=yes; else as_fn_error $? "test for ARMCI_NETWORK=PORTALS failed" "$LINENO" 5 fi fi if test "x$ga_armci_network" = xGEMINI; then : { $as_echo "$as_me:${as_lineno-$LINENO}: searching for GEMINI..." >&5 $as_echo "$as_me: searching for GEMINI..." >&6;} happy=yes if test "x$happy" = xyes; then : ac_fn_c_check_header_compile "$LINENO" "numatoolkit.h" "ac_cv_header_numatoolkit_h" " $ac_includes_default #include " if test "x$ac_cv_header_numatoolkit_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing NTK_Init" >&5 $as_echo_n "checking for library containing NTK_Init... " >&6; } if ${ac_cv_search_NTK_Init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char NTK_Init (); int main () { return NTK_Init (); ; return 0; } _ACEOF for ac_lib in '' numatoolkit; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_NTK_Init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_NTK_Init+:} false; then : break fi done if ${ac_cv_search_NTK_Init+:} false; then : else ac_cv_search_NTK_Init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_NTK_Init" >&5 $as_echo "$ac_cv_search_NTK_Init" >&6; } ac_res=$ac_cv_search_NTK_Init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi # CPPFLAGS must have CRAY_UGNI before looking for the next headers. gemini_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS -DCRAY_UGNI" if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "onesided.h" "ac_cv_header_onesided_h" "$ac_includes_default" if test "x$ac_cv_header_onesided_h" = xyes; then : else happy=no fi fi if test "x$happy" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "gni.h" "ac_cv_header_gni_h" "$ac_includes_default" if test "x$ac_cv_header_gni_h" = xyes; then : else happy=no fi fi CPPFLAGS="$gemini_save_CPPFLAGS" if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gniInit" >&5 $as_echo_n "checking for library containing gniInit... " >&6; } if ${ac_cv_search_gniInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gniInit (); int main () { return gniInit (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gniInit=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gniInit+:} false; then : break fi done if ${ac_cv_search_gniInit+:} false; then : else ac_cv_search_gniInit=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gniInit" >&5 $as_echo "$ac_cv_search_gniInit" >&6; } ac_res=$ac_cv_search_gniInit if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else happy=no fi fi if test "x$happy" = xyes; then : ga_armci_network=GEMINI; with_gemini=yes; else as_fn_error $? "test for ARMCI_NETWORK=GEMINI failed" "$LINENO" 5 fi # check for a function introduced in libonesided/1.5 # we purposefully abuse the ac_cv_search_onesided_mem_htflush value if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing onesided_mem_htflush" >&5 $as_echo_n "checking for library containing onesided_mem_htflush... " >&6; } if ${ac_cv_search_onesided_mem_htflush+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char onesided_mem_htflush (); int main () { return onesided_mem_htflush (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_onesided_mem_htflush=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_onesided_mem_htflush+:} false; then : break fi done if ${ac_cv_search_onesided_mem_htflush+:} false; then : else ac_cv_search_onesided_mem_htflush=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_onesided_mem_htflush" >&5 $as_echo "$ac_cv_search_onesided_mem_htflush" >&6; } ac_res=$ac_cv_search_onesided_mem_htflush if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_onesided_mem_htflush" != xno; then : ac_cv_search_onesided_mem_htflush=1 else ac_cv_search_onesided_mem_htflush=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ONESIDED_MEM_HTFLUSH $ac_cv_search_onesided_mem_htflush _ACEOF fi # check for a function introduced in libonesided/1.6 # we purposefully abuse the ac_cv_search_onesided_fadd value if test "x$happy" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing onesided_fadd" >&5 $as_echo_n "checking for library containing onesided_fadd... " >&6; } if ${ac_cv_search_onesided_fadd+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char onesided_fadd (); int main () { return onesided_fadd (); ; return 0; } _ACEOF for ac_lib in '' onesided; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_onesided_fadd=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_onesided_fadd+:} false; then : break fi done if ${ac_cv_search_onesided_fadd+:} false; then : else ac_cv_search_onesided_fadd=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_onesided_fadd" >&5 $as_echo "$ac_cv_search_onesided_fadd" >&6; } ac_res=$ac_cv_search_onesided_fadd if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test "x$ac_cv_search_onesided_fadd" != xno; then : ac_cv_search_onesided_fadd=1 else ac_cv_search_onesided_fadd=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_ONESIDED_FADD $ac_cv_search_onesided_fadd _ACEOF fi fi ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: too many armci networks specified: $armci_network_count" >&5 $as_echo "$as_me: WARNING: too many armci networks specified: $armci_network_count" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the following were specified:" >&5 $as_echo "$as_me: WARNING: the following were specified:" >&2;} if test "x$with_armci" != x && test "x$with_armci" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-armci=$with_armci" >&5 $as_echo "$as_me: WARNING: --with-armci=$with_armci" >&2;} fi if test "x$with_bgml" != x && test "x$with_bgml" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-bgml=$with_bgml" >&5 $as_echo "$as_me: WARNING: --with-bgml=$with_bgml" >&2;} fi if test "x$with_cray_shmem" != x && test "x$with_cray_shmem" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-cray-shmem=$with_cray_shmem" >&5 $as_echo "$as_me: WARNING: --with-cray-shmem=$with_cray_shmem" >&2;} fi if test "x$with_dcmf" != x && test "x$with_dcmf" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-dcmf=$with_dcmf" >&5 $as_echo "$as_me: WARNING: --with-dcmf=$with_dcmf" >&2;} fi if test "x$with_dmapp" != x && test "x$with_dmapp" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-dmapp=$with_dmapp" >&5 $as_echo "$as_me: WARNING: --with-dmapp=$with_dmapp" >&2;} fi if test "x$with_lapi" != x && test "x$with_lapi" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-lapi=$with_lapi" >&5 $as_echo "$as_me: WARNING: --with-lapi=$with_lapi" >&2;} fi if test "x$with_mpi_ts" != x && test "x$with_mpi_ts" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-mpi-ts=$with_mpi_ts" >&5 $as_echo "$as_me: WARNING: --with-mpi-ts=$with_mpi_ts" >&2;} fi if test "x$with_mpi_mt" != x && test "x$with_mpi_mt" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-mpi-mt=$with_mpi_mt" >&5 $as_echo "$as_me: WARNING: --with-mpi-mt=$with_mpi_mt" >&2;} fi if test "x$with_mpi_pt" != x && test "x$with_mpi_pt" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-mpi-pt=$with_mpi_pt" >&5 $as_echo "$as_me: WARNING: --with-mpi-pt=$with_mpi_pt" >&2;} fi if test "x$with_mpi_pr" != x && test "x$with_mpi_pr" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-mpi-pr=$with_mpi_pr" >&5 $as_echo "$as_me: WARNING: --with-mpi-pr=$with_mpi_pr" >&2;} fi if test "x$with_mpi_spawn" != x && test "x$with_mpi_spawn" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-mpi-spawn=$with_mpi_spawn" >&5 $as_echo "$as_me: WARNING: --with-mpi-spawn=$with_mpi_spawn" >&2;} fi if test "x$with_ofa" != x && test "x$with_ofa" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-ofa=$with_ofa" >&5 $as_echo "$as_me: WARNING: --with-ofa=$with_ofa" >&2;} fi if test "x$with_openib" != x && test "x$with_openib" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-openib=$with_openib" >&5 $as_echo "$as_me: WARNING: --with-openib=$with_openib" >&2;} fi if test "x$with_portals4" != x && test "x$with_portals4" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-portals4=$with_portals4" >&5 $as_echo "$as_me: WARNING: --with-portals4=$with_portals4" >&2;} fi if test "x$with_portals" != x && test "x$with_portals" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-portals=$with_portals" >&5 $as_echo "$as_me: WARNING: --with-portals=$with_portals" >&2;} fi if test "x$with_gemini" != x && test "x$with_gemini" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-gemini=$with_gemini" >&5 $as_echo "$as_me: WARNING: --with-gemini=$with_gemini" >&2;} fi if test "x$with_sockets" != x && test "x$with_sockets" != xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-sockets=$with_sockets" >&5 $as_echo "$as_me: WARNING: --with-sockets=$with_sockets" >&2;} fi as_fn_error $? "please select only one armci network" "$LINENO" 5 ;; esac fi # Remove ARMCI_NETWORK_CPPFLAGS from CPPFLAGS. CPPFLAGS="$ga_save_CPPFLAGS" # Remove ARMCI_NETWORK_LDFLAGS from LDFLAGS. LDFLAGS="$ga_save_LDFLAGS" # Remove ARMCI_NETWORK_LIBS from LIBS. LIBS="$ga_save_LIBS" if test "x$with_armci" != x && test "x$with_armci" != xno; then ARMCI_NETWORK_ARMCI_TRUE= ARMCI_NETWORK_ARMCI_FALSE='#' else ARMCI_NETWORK_ARMCI_TRUE='#' ARMCI_NETWORK_ARMCI_FALSE= fi if test "x$with_bgml" != x && test "x$with_bgml" != xno; then ARMCI_NETWORK_BGML_TRUE= ARMCI_NETWORK_BGML_FALSE='#' else ARMCI_NETWORK_BGML_TRUE='#' ARMCI_NETWORK_BGML_FALSE= fi if test "x$with_cray_shmem" != x && test "x$with_cray_shmem" != xno; then ARMCI_NETWORK_CRAY_SHMEM_TRUE= ARMCI_NETWORK_CRAY_SHMEM_FALSE='#' else ARMCI_NETWORK_CRAY_SHMEM_TRUE='#' ARMCI_NETWORK_CRAY_SHMEM_FALSE= fi if test "x$with_dcmf" != x && test "x$with_dcmf" != xno; then ARMCI_NETWORK_DCMF_TRUE= ARMCI_NETWORK_DCMF_FALSE='#' else ARMCI_NETWORK_DCMF_TRUE='#' ARMCI_NETWORK_DCMF_FALSE= fi if test "x$with_dmapp" != x && test "x$with_dmapp" != xno; then ARMCI_NETWORK_DMAPP_TRUE= ARMCI_NETWORK_DMAPP_FALSE='#' else ARMCI_NETWORK_DMAPP_TRUE='#' ARMCI_NETWORK_DMAPP_FALSE= fi if test "x$with_lapi" != x && test "x$with_lapi" != xno; then ARMCI_NETWORK_LAPI_TRUE= ARMCI_NETWORK_LAPI_FALSE='#' else ARMCI_NETWORK_LAPI_TRUE='#' ARMCI_NETWORK_LAPI_FALSE= fi if test "x$with_mpi_ts" != x && test "x$with_mpi_ts" != xno; then ARMCI_NETWORK_MPI_TS_TRUE= ARMCI_NETWORK_MPI_TS_FALSE='#' else ARMCI_NETWORK_MPI_TS_TRUE='#' ARMCI_NETWORK_MPI_TS_FALSE= fi if test "x$with_mpi_mt" != x && test "x$with_mpi_mt" != xno; then ARMCI_NETWORK_MPI_MT_TRUE= ARMCI_NETWORK_MPI_MT_FALSE='#' else ARMCI_NETWORK_MPI_MT_TRUE='#' ARMCI_NETWORK_MPI_MT_FALSE= fi if test "x$with_mpi_pt" != x && test "x$with_mpi_pt" != xno; then ARMCI_NETWORK_MPI_PT_TRUE= ARMCI_NETWORK_MPI_PT_FALSE='#' else ARMCI_NETWORK_MPI_PT_TRUE='#' ARMCI_NETWORK_MPI_PT_FALSE= fi if test "x$with_mpi_pr" != x && test "x$with_mpi_pr" != xno; then ARMCI_NETWORK_MPI_PR_TRUE= ARMCI_NETWORK_MPI_PR_FALSE='#' else ARMCI_NETWORK_MPI_PR_TRUE='#' ARMCI_NETWORK_MPI_PR_FALSE= fi if test "x$with_mpi_spawn" != x && test "x$with_mpi_spawn" != xno; then ARMCI_NETWORK_MPI_SPAWN_TRUE= ARMCI_NETWORK_MPI_SPAWN_FALSE='#' else ARMCI_NETWORK_MPI_SPAWN_TRUE='#' ARMCI_NETWORK_MPI_SPAWN_FALSE= fi if test "x$with_ofa" != x && test "x$with_ofa" != xno; then ARMCI_NETWORK_OFA_TRUE= ARMCI_NETWORK_OFA_FALSE='#' else ARMCI_NETWORK_OFA_TRUE='#' ARMCI_NETWORK_OFA_FALSE= fi if test "x$with_openib" != x && test "x$with_openib" != xno; then ARMCI_NETWORK_OPENIB_TRUE= ARMCI_NETWORK_OPENIB_FALSE='#' else ARMCI_NETWORK_OPENIB_TRUE='#' ARMCI_NETWORK_OPENIB_FALSE= fi if test "x$with_gemini" != x && test "x$with_gemini" != xno; then ARMCI_NETWORK_GEMINI_TRUE= ARMCI_NETWORK_GEMINI_FALSE='#' else ARMCI_NETWORK_GEMINI_TRUE='#' ARMCI_NETWORK_GEMINI_FALSE= fi if test "x$with_portals4" != x && test "x$with_portals4" != xno; then ARMCI_NETWORK_PORTALS4_TRUE= ARMCI_NETWORK_PORTALS4_FALSE='#' else ARMCI_NETWORK_PORTALS4_TRUE='#' ARMCI_NETWORK_PORTALS4_FALSE= fi if test "x$with_portals" != x && test "x$with_portals" != xno; then ARMCI_NETWORK_PORTALS_TRUE= ARMCI_NETWORK_PORTALS_FALSE='#' else ARMCI_NETWORK_PORTALS_TRUE='#' ARMCI_NETWORK_PORTALS_FALSE= fi if test "x$with_sockets" != x && test "x$with_sockets" != xno; then ARMCI_NETWORK_SOCKETS_TRUE= ARMCI_NETWORK_SOCKETS_FALSE='#' else ARMCI_NETWORK_SOCKETS_TRUE='#' ARMCI_NETWORK_SOCKETS_FALSE= fi # TODO if test x != x; then DCMF_VER_2_TRUE= DCMF_VER_2_FALSE='#' else DCMF_VER_2_TRUE='#' DCMF_VER_2_FALSE= fi # always false if test x != x; then DCMF_VER_0_2_TRUE= DCMF_VER_0_2_FALSE='#' else DCMF_VER_0_2_TRUE='#' DCMF_VER_0_2_FALSE= fi # always false if test x = x; then DCMF_VER_0_3_TRUE= DCMF_VER_0_3_FALSE='#' else DCMF_VER_0_3_TRUE='#' DCMF_VER_0_3_FALSE= fi # always true # permanent hack case $ga_armci_network in #( DMAPP) : ARMCI_SRC_DIR=comex ;; #( GEMINI) : ARMCI_SRC_DIR=src-gemini ;; #( MPI_MT) : ARMCI_SRC_DIR=comex ;; #( MPI_PT) : ARMCI_SRC_DIR=comex ;; #( MPI_PR) : ARMCI_SRC_DIR=comex ;; #( MPI_TS) : ARMCI_SRC_DIR=comex ;; #( OFA) : ARMCI_SRC_DIR=comex ;; #( OPENIB) : ARMCI_SRC_DIR=src ;; #( PORTALS4) : ARMCI_SRC_DIR=comex ;; #( PORTALS) : ARMCI_SRC_DIR=src-portals ;; #( *) : ARMCI_SRC_DIR=src ;; esac if test "x$ARMCI_SRC_DIR" = "xsrc-portals"; then ARMCI_SRC_DIR_PORTALS_TRUE= ARMCI_SRC_DIR_PORTALS_FALSE='#' else ARMCI_SRC_DIR_PORTALS_TRUE='#' ARMCI_SRC_DIR_PORTALS_FALSE= fi if test "x$ARMCI_SRC_DIR" = "xsrc-gemini"; then ARMCI_SRC_DIR_GEMINI_TRUE= ARMCI_SRC_DIR_GEMINI_FALSE='#' else ARMCI_SRC_DIR_GEMINI_TRUE='#' ARMCI_SRC_DIR_GEMINI_FALSE= fi if test "x$ARMCI_SRC_DIR" = "xcomex"; then ARMCI_SRC_DIR_COMEX_TRUE= ARMCI_SRC_DIR_COMEX_FALSE='#' else ARMCI_SRC_DIR_COMEX_TRUE='#' ARMCI_SRC_DIR_COMEX_FALSE= fi if test "x$ARMCI_SRC_DIR" = "xsrc"; then ARMCI_SRC_DIR_SRC_TRUE= ARMCI_SRC_DIR_SRC_FALSE='#' else ARMCI_SRC_DIR_SRC_TRUE='#' ARMCI_SRC_DIR_SRC_FALSE= fi if test "x$ARMCI_SRC_DIR" = "xcomex"; then : armci_network_external=1 fi if test "x$armci_network_external" = x1; then ARMCI_NETWORK_EXTERNAL_TRUE= ARMCI_NETWORK_EXTERNAL_FALSE='#' else ARMCI_NETWORK_EXTERNAL_TRUE='#' ARMCI_NETWORK_EXTERNAL_FALSE= fi if test "x$ARMCI_SRC_DIR" = "xcomex"; then ARMCI_NETWORK_COMEX_TRUE= ARMCI_NETWORK_COMEX_FALSE='#' else ARMCI_NETWORK_COMEX_TRUE='#' ARMCI_NETWORK_COMEX_FALSE= fi # tcgmsg5 requires this if test x$ga_armci_network = xLAPI; then : $as_echo "#define NOTIFY_SENDER 1" >>confdefs.h $as_echo "#define LAPI 1" >>confdefs.h fi ga_cray_xt_networks=no if test x$ga_armci_network = xPORTALS; then : ga_cray_xt_networks=yes fi if test x$ga_armci_network = xCRAY_SHMEM; then : ga_cray_xt_networks=yes fi if test x$ga_cray_xt_networks = xyes; then CRAY_XT_NETWORKS_TRUE= CRAY_XT_NETWORKS_FALSE='#' else CRAY_XT_NETWORKS_TRUE='#' CRAY_XT_NETWORKS_FALSE= fi ga_cv_sysv_hack=no # Only perform this hack for ARMCI build. if test "x$ARMCI_TOP_BUILDDIR" != x; then : if test x$ga_cv_sysv = xno; then : case $ga_armci_network in #( BGML|DCMF|PORTALS|GEMINI) : ga_cv_sysv_hack=no ;; #( *) : ga_cv_sysv_hack=yes ;; esac else ga_cv_sysv_hack=yes fi if test x$ga_cv_sysv_hack = xyes; then : $as_echo "#define SYSV 1" >>confdefs.h fi fi if test x$ga_cv_sysv_hack = xyes; then SYSV_TRUE= SYSV_FALSE='#' else SYSV_TRUE='#' SYSV_FALSE= fi # if not using external armci library, the following functions are always available if test "x$ga_armci_network" != xARMCI; then : $as_echo "#define HAVE_ARMCI_GROUP_COMM 1" >>confdefs.h $as_echo "#define HAVE_ARMCI_INITIALIZED 1" >>confdefs.h $as_echo "#define HAVE_ARMCI_NOTIFY 1" >>confdefs.h $as_echo "#define HAVE_ARMCI_MSG_INIT 1" >>confdefs.h $as_echo "#define HAVE_ARMCI_MSG_FINALIZE 1" >>confdefs.h fi if test "x$ac_cv_member_ARMCI_Group_comm" = x1; then HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE= HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE='#' else HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE='#' HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE= fi if test "x$ga_armci_network" != xARMCI; then HAVE_ARMCI_GROUP_COMM_TRUE= HAVE_ARMCI_GROUP_COMM_FALSE='#' else HAVE_ARMCI_GROUP_COMM_TRUE='#' HAVE_ARMCI_GROUP_COMM_FALSE= fi if test "x$ga_armci_network" != xARMCI; then HAVE_ARMCI_INITIALIZED_TRUE= HAVE_ARMCI_INITIALIZED_FALSE='#' else HAVE_ARMCI_INITIALIZED_TRUE='#' HAVE_ARMCI_INITIALIZED_FALSE= fi if test "x$ga_armci_network" != xARMCI; then HAVE_ARMCI_NOTIFY_TRUE= HAVE_ARMCI_NOTIFY_FALSE='#' else HAVE_ARMCI_NOTIFY_TRUE='#' HAVE_ARMCI_NOTIFY_FALSE= fi if test "x$ga_armci_network" != xARMCI; then HAVE_ARMCI_MSG_INIT_TRUE= HAVE_ARMCI_MSG_INIT_FALSE='#' else HAVE_ARMCI_MSG_INIT_TRUE='#' HAVE_ARMCI_MSG_INIT_FALSE= fi if test "x$ga_armci_network" != xARMCI; then HAVE_ARMCI_MSG_FINALIZE_TRUE= HAVE_ARMCI_MSG_FINALIZE_FALSE='#' else HAVE_ARMCI_MSG_FINALIZE_TRUE='#' HAVE_ARMCI_MSG_FINALIZE_FALSE= fi # the armci iterators only available in the conglomerate sources case $ga_armci_network in #( ARMCI|GEMINI|PORTALS) : ;; #( *) : $as_echo "#define HAVE_ARMCI_STRIDE_INFO_INIT 1" >>confdefs.h ;; esac if test "x$ga_armci_network" != xARMCI && test "x$ga_armci_network" != xGEMINI && test "x$ga_armci_network" != xPORTALS; then HAVE_ARMCI_STRIDE_INFO_INIT_TRUE= HAVE_ARMCI_STRIDE_INFO_INIT_FALSE='#' else HAVE_ARMCI_STRIDE_INFO_INIT_TRUE='#' HAVE_ARMCI_STRIDE_INFO_INIT_FALSE= fi # ugly hack for working around NWChem memory requirements # and MPI_PR startup verus the 'classic' ARMCI startup delay_tcgmsg_mpi_startup=1 case $ga_armci_network in #( ARMCI) : delay_tcgmsg_mpi_startup=0 ;; #( BGML) : delay_tcgmsg_mpi_startup=1 ;; #( CRAY_SHMEM) : delay_tcgmsg_mpi_startup=1 ;; #( DCMF) : delay_tcgmsg_mpi_startup=1 ;; #( DMAPP) : delay_tcgmsg_mpi_startup=0 ;; #( LAPI) : delay_tcgmsg_mpi_startup=1 ;; #( MPI_TS) : delay_tcgmsg_mpi_startup=0 ;; #( MPI_MT) : delay_tcgmsg_mpi_startup=0 ;; #( MPI_PT) : delay_tcgmsg_mpi_startup=0 ;; #( MPI_PR) : delay_tcgmsg_mpi_startup=0 ;; #( MPI_SPAWN) : delay_tcgmsg_mpi_startup=1 ;; #( OFA) : delay_tcgmsg_mpi_startup=0 ;; #( OPENIB) : delay_tcgmsg_mpi_startup=1 ;; #( GEMINI) : delay_tcgmsg_mpi_startup=1 ;; #( PORTALS4) : delay_tcgmsg_mpi_startup=0 ;; #( PORTALS) : delay_tcgmsg_mpi_startup=1 ;; #( SOCKETS) : delay_tcgmsg_mpi_startup=1 ;; #( *) : ;; esac cat >>confdefs.h <<_ACEOF #define NEED_DELAY_TCGMSG_MPI_STARTUP $delay_tcgmsg_mpi_startup _ACEOF # Checks for C header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5 $as_echo_n "checking whether to enable assertions... " >&6; } # Check whether --enable-assert was given. if test "${enable_assert+set}" = set; then : enableval=$enable_assert; ac_enable_assert=$enableval if test "x$enableval" = xno; then : $as_echo "#define NDEBUG 1" >>confdefs.h elif test "x$enableval" != xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5 $as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;} ac_enable_assert=yes fi else ac_enable_assert=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_enable_assert" >&5 $as_echo "$ac_enable_assert" >&6; } ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi for ac_header in assert.h c_asm.h errno.h fcntl.h float.h ia64/sys/inline.h malloc.h math.h memory.h mpp/shmem.h netdb.h netinet/in.h netinet/tcp.h process.h setjmp.h signal.h stdarg.h stdint.h stdio.h stdlib.h string.h strings.h sys/types.h sys/atomic_op.h sys/errno.h sys/file.h sys/ipc.h sys/mman.h sys/param.h sys/sem.h sys/shm.h sys/socket.h sys/stat.h sys/syscall.h sys/systemcfg.h sys/time.h sys/uio.h sys/wait.h time.h unistd.h windows.h winsock.h rpc/rpc.h rpc/types.h rpc/xdr.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_RPC_TYPES_H #include #endif #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_IPC_H #include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 0 _ACEOF fi done # Checks for C typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if ${ac_cv_c_volatile+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor symbol for function name" >&5 $as_echo_n "checking for preprocessor symbol for function name... " >&6; } if ${ga_cv_cpp_function+:} false; then : $as_echo_n "(cached) " >&6 else if test x$ga_cv_cpp_function = x; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern int printf(const char *format, ...); int main () { printf("__func__ = %s\n", __func__); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ga_cv_cpp_function=__func__ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test x$ga_cv_cpp_function = x; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern int printf(const char *format, ...); int main () { printf("__FUNCTION__ = %s\n", __FUNCTION__); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ga_cv_cpp_function=__FUNCTION__ fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test x$ga_cv_cpp_function = x; then : ga_cv_cpp_function='"Unknown"' fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cpp_function" >&5 $as_echo "$ga_cv_cpp_function" >&6; } cat >>confdefs.h <<_ACEOF #define FUNCTION_NAME $ga_cv_cpp_function _ACEOF # Check whether --enable-weak was given. if test "${enable_weak+set}" = set; then : enableval=$enable_weak; else enable_weak=yes fi if test "x$ga_cv_target_base" = xCYGWIN; then : enable_weak=no fi if test "x$enable_weak" = xyes; then : ax_sys_weak_alias=no # Test whether compiler accepts #pragma form of weak aliasing { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports #pragma weak" >&5 $as_echo_n "checking whether $CC supports #pragma weak... " >&6; } if ${ax_cv_sys_weak_alias_pragma+:} false; then : $as_echo_n "(cached) " >&6 else # Try linking with a weak alias... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern void weakf(int c); #pragma weak weakf = __weakf void __weakf(int c) {} int main () { weakf(0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_cv_sys_weak_alias_pragma=yes else ax_cv_sys_weak_alias_pragma=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_sys_weak_alias_pragma" >&5 $as_echo "$ax_cv_sys_weak_alias_pragma" >&6; } # What was the result of the test? if test $ax_sys_weak_alias = no && test $ax_cv_sys_weak_alias_pragma = yes; then : ax_sys_weak_alias=pragma $as_echo "#define HAVE_SYS_WEAK_ALIAS_PRAGMA 1" >>confdefs.h fi else ax_cv_sys_weak_alias_pragma=no $as_echo "#define HAVE_SYS_WEAK_ALIAS_PRAGMA 0" >>confdefs.h fi if test "x$ax_cv_sys_weak_alias_pragma" = xyes; then HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE= HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE='#' else HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE='#' HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE= fi # enable shared libs automatically if profiling using weak symbols if test "x$ax_cv_sys_weak_alias_pragma" = xyes; then : if test "x$enable_profiling" = xyes; then : enable_shared=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for union semun in sys/sem.h" >&5 $as_echo_n "checking for union semun in sys/sem.h... " >&6; } if ${ga_cv_union_semun+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { union semun arg; semctl(0, 0, 0, arg); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ga_cv_union_semun=yes else ga_cv_union_semun=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_union_semun" >&5 $as_echo "$ga_cv_union_semun" >&6; } if test x$ga_cv_union_semun = xyes; then : $as_echo "#define HAVE_UNION_SEMUN 1" >>confdefs.h fi # Checks for C type sizes. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 $as_echo_n "checking size of void*... " >&6; } if ${ac_cv_sizeof_voidp+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : else if test "$ac_cv_type_voidp" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void*) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_voidp=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 $as_echo "$ac_cv_sizeof_voidp" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOIDP $ac_cv_sizeof_voidp _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 $as_echo_n "checking size of char... " >&6; } if ${ac_cv_sizeof_char+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : else if test "$ac_cv_type_char" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (char) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_char=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 $as_echo "$ac_cv_sizeof_char" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : else if test "$ac_cv_type_float" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 $as_echo "$ac_cv_sizeof_float" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for smallest C integer matching void*" >&5 $as_echo_n "checking for smallest C integer matching void*... " >&6; } if ${ga_cv_c_pointer_as_integer+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ac_cv_sizeof_voidp" = "x$ac_cv_sizeof_short"; then : ga_cv_c_pointer_as_integer=short elif test "x$ac_cv_sizeof_voidp" = "x$ac_cv_sizeof_int"; then : ga_cv_c_pointer_as_integer=int elif test "x$ac_cv_sizeof_voidp" = "x$ac_cv_sizeof_long"; then : ga_cv_c_pointer_as_integer=long elif test "x$ac_cv_sizeof_voidp" = "x$ac_cv_sizeof_long_long"; then : ga_cv_c_pointer_as_integer="long long" else as_fn_error $? "Could not determine smallest C integer matching void*" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_pointer_as_integer" >&5 $as_echo "$ga_cv_c_pointer_as_integer" >&6; } C_POINTER_AS_INTEGER=$ga_cv_c_pointer_as_integer # Checks for C library functions. for ac_header in vfork.h do : ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" if test "x$ac_cv_header_vfork_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VFORK_H 1 _ACEOF fi done for ac_func in fork vfork do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 $as_echo_n "checking for working fork... " >&6; } if ${ac_cv_func_fork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_fork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_fork_works=yes else ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 $as_echo "$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 $as_echo_n "checking for working vfork... " >&6; } if ${ac_cv_func_vfork_works+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_vfork_works=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #ifdef HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_vfork_works=yes else ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 $as_echo "$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 $as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then $as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h else $as_echo "#define vfork fork" >>confdefs.h fi if test "x$ac_cv_func_fork_works" = xyes; then $as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h fi for ac_header in $ac_header_list do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in getpagesize do : ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" if test "x$ac_cv_func_getpagesize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPAGESIZE 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 $as_echo_n "checking for working mmap... " >&6; } if ${ac_cv_func_mmap_fixed_mapped+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_mmap_fixed_mapped=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. Grep wants private fixed already mapped. The main things grep needs to know about mmap are: * does it exist and is it safe to write into the mmap'd area * how to use it (BSD variants) */ #include #include #if !defined STDC_HEADERS && !defined HAVE_STDLIB_H char *malloc (); #endif /* This mess was copied from the GNU getpagesize.h. */ #ifndef HAVE_GETPAGESIZE # ifdef _SC_PAGESIZE # define getpagesize() sysconf(_SC_PAGESIZE) # else /* no _SC_PAGESIZE */ # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif /* no _SC_PAGESIZE */ #endif /* no HAVE_GETPAGESIZE */ int main () { char *data, *data2, *data3; const char *cdata2; int i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); if (munmap (data2, pagesize)) return 8; /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_mmap_fixed_mapped=yes else ac_cv_func_mmap_fixed_mapped=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 $as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then $as_echo "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done if test "x$ga_msg_comms" = xTCGMSG; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing xdr_array" >&5 $as_echo_n "checking for library containing xdr_array... " >&6; } if ${ac_cv_search_xdr_array+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xdr_array (); int main () { return xdr_array (); ; return 0; } _ACEOF for ac_lib in '' rpclib; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_xdr_array=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_xdr_array+:} false; then : break fi done if ${ac_cv_search_xdr_array+:} false; then : else ac_cv_search_xdr_array=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_xdr_array" >&5 $as_echo "$ac_cv_search_xdr_array" >&6; } ac_res=$ac_cv_search_xdr_array if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5 $as_echo_n "checking for library containing floor... " >&6; } if ${ac_cv_search_floor+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char floor (); int main () { return floor (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_floor=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_floor+:} false; then : break fi done if ${ac_cv_search_floor+:} false; then : else ac_cv_search_floor=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5 $as_echo "$ac_cv_search_floor" >&6; } ac_res=$ac_cv_search_floor if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_floor=1 else have_floor=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_FLOOR $have_floor _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5 $as_echo_n "checking for library containing pow... " >&6; } if ${ac_cv_search_pow+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pow (); int main () { return pow (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_pow=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_pow+:} false; then : break fi done if ${ac_cv_search_pow+:} false; then : else ac_cv_search_pow=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5 $as_echo "$ac_cv_search_pow" >&6; } ac_res=$ac_cv_search_pow if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_pow=1 else have_pow=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_POW $have_pow _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sqrt" >&5 $as_echo_n "checking for library containing sqrt... " >&6; } if ${ac_cv_search_sqrt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sqrt (); int main () { return sqrt (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sqrt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sqrt+:} false; then : break fi done if ${ac_cv_search_sqrt+:} false; then : else ac_cv_search_sqrt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sqrt" >&5 $as_echo "$ac_cv_search_sqrt" >&6; } ac_res=$ac_cv_search_sqrt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_sqrt=1 else have_sqrt=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_SQRT $have_sqrt _ACEOF for ac_func in bzero fastbcopy ftruncate gethostbyname getpagesize gettimeofday memset munmap select socket strchr strdup strerror strstr strtol _lock_try _acquire_lock xdr_char do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 0 _ACEOF fi done for ac_func in pthread_getconcurrency pthread_setconcurrency do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 0 _ACEOF fi done # Checks for C libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for specific C optimizations" >&5 $as_echo_n "checking for specific C optimizations... " >&6; } if ${armci_cv_c_opt+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ARMCI_COPT" != x; then : armci_cv_c_opt="$ARMCI_COPT" else armci_cv_c_opt= fi if test "x$armci_cv_c_opt" = x && test "x$enable_opt" = xyes; then : case $ga_cv_target:$ga_cv_c_compiler_vendor:$host_cpu:$ga_armci_network in #( BGL:*:*:*) : armci_cv_c_opt="-O0" ;; #( BGP:ibm:*:*) : armci_cv_c_opt="-O3 -qstrict -qarch=450 -qtune=450" ;; #( BGP:gnu:*:*) : armci_cv_c_opt="-O2" ;; #( CATAMOUNT:*:*:*) : armci_cv_c_opt= ;; #( CRAY_XT:*:*:*) : armci_cv_c_opt= ;; #( CYGWIN:*:*:*) : armci_cv_c_opt="-malign-double" ;; #( FUJITSU_VPP64:*:*:*) : armci_cv_c_opt="-x100" ;; #( FUJITSU_VPP:*:*:*) : armci_cv_c_opt="-x100 -KA32" ;; #( HPUX64:*:*:*) : armci_cv_c_opt="-Ae" ;; #( HPUX64:*:ia64:*) : armci_cv_c_opt="-Ae" ;; #( HPUX:*:*:*) : armci_cv_c_opt="-Ae" ;; #( IBM64:*:*:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( IBM:*:*:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( LAPI64:*:*:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( LAPI:*:*:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( LINUX64:fujitsu:ia64:*) : armci_cv_c_opt="-Kfast" ;; #( LINUX64:fujitsu:x86_64:*) : armci_cv_c_opt="-Kfast" ;; #( LINUX64:gnu:ia64:*) : armci_cv_c_opt="-O0 -g" ;; #( LINUX64:gnu:x86_64:*) : armci_cv_c_opt="-O3 -funroll-loops" ;; #( LINUX64:ibm:powerpc64:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( LINUX64:ibm:ppc64:*) : armci_cv_c_opt="-O3 -qinline=100 -qstrict -qarch=auto -qtune=auto" ;; #( LINUX64:ibm:x86_64:*) : armci_cv_c_opt="" ;; #( LINUX64:intel:ia64:*) : armci_cv_c_opt="-w1" ;; #( LINUX64:unknown:alpha:*) : armci_cv_c_opt="-assume no2underscore -fpe3 -check nooverflow -assume accuracy_sensitive -check nopower -check nounderflow" ;; #( LINUX:fujitsu:*:*) : armci_cv_c_opt="-Kfast" ;; #( LINUX:gnu:686:*) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro -malign-double" ;; #( LINUX:gnu:686:MELLANOX) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro" ;; #( LINUX:gnu:686:OPENIB) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro" ;; #( LINUX:gnu:786:*) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro -malign-double" ;; #( LINUX:gnu:786:MELLANOX) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro" ;; #( LINUX:gnu:786:OPENIB) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -march=pentiumpro" ;; #( LINUX:gnu:x86:*) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops -malign-double" ;; #( LINUX:gnu:x86:MELLANOX) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops " ;; #( LINUX:gnu:x86:OPENIB) : armci_cv_c_opt="-O2 -finline-functions -funroll-loops " ;; #( LINUX:ibm:*:*) : armci_cv_c_opt="-q32" ;; #( LINUX:intel:*:*) : armci_cv_c_opt="-O3 -prefetch" ;; #( MACX64:*:*:*) : armci_cv_c_opt= ;; #( MACX:*:*:*) : armci_cv_c_opt= ;; #( NEC64:*:*:*) : armci_cv_c_opt="-Cvsafe -size_t64" ;; #( NEC:*:*:*) : armci_cv_c_opt="-Cvsafe" ;; #( SOLARIS64:fujitsu:*:*) : armci_cv_c_opt="-Kfast -KV9FMADD -x0" ;; #( SOLARIS64:gnu:*:*) : armci_cv_c_opt="-dalign" ;; #( SOLARIS64:gnu:i386:*) : armci_cv_c_opt="-dalign -xarch=amd64" ;; #( SOLARIS:fujitsu:*:*) : armci_cv_c_opt="-Kfast -KV8PFMADD -x0" ;; #( SOLARIS:gnu:*:*) : armci_cv_c_opt="-dalign" ;; #( SOLARIS:gnu:i386:*) : armci_cv_c_opt="-dalign -xarch=sse2" ;; #( *) : armci_cv_c_opt= ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $armci_cv_c_opt" >&5 $as_echo "$armci_cv_c_opt" >&6; } ARMCI_COPT=$armci_cv_c_opt CFLAGS="$ga_save_CFLAGS" ######################################### # C++ compiler ######################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} if test "x$enable_cxx" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: C++ compiler" >&5 $as_echo "$as_me: C++ compiler" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: C++ compiler (disabled, but some tests still required)" >&5 $as_echo "$as_me: C++ compiler (disabled, but some tests still required)" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # GA_PROG_MPICXX is required to silence complaints that C++ source exists # even if C++ support has been disabled. ga_save_CXXFLAGS="$CXXFLAGS" case $ga_cv_target_base in #( BGP) : ga_mpicxx_pref=mpixlcxx_r; ga_cxx_pref=bgxlC_r ;; #( *) : ;; esac # In the case of using MPI wrappers, set CXX=MPICXX since CXX will override # absolutely everything in our list of compilers. if test x$with_mpi_wrappers = xyes; then : if test "x$CXX" != "x$MPICXX"; then : ga_orig_CXX="$CXX" fi case x$CXX:x$MPICXX in #( x:x) : ;; #( x:x*) : CXX="$MPICXX" ;; #( x*:x) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired but CXX is set while MPICXX is unset." >&5 $as_echo "$as_me: WARNING: MPI compilers desired but CXX is set while MPICXX is unset." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CXX will be ignored during compiler selection, but will be" >&5 $as_echo "$as_me: WARNING: CXX will be ignored during compiler selection, but will be" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&5 $as_echo "$as_me: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: meant to set MPICXX instead of or in addition to CXX?" >&5 $as_echo "$as_me: WARNING: meant to set MPICXX instead of or in addition to CXX?" >&2;} CXX= ;; #( x*:x*) : if test "x$CXX" != "x$MPICXX"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired, MPICXX and CXX are set, and MPICXX!=CXX." >&5 $as_echo "$as_me: WARNING: MPI compilers desired, MPICXX and CXX are set, and MPICXX!=CXX." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Choosing MPICXX as main compiler." >&5 $as_echo "$as_me: WARNING: Choosing MPICXX as main compiler." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CXX will be assumed as the unwrapped MPI compiler." >&5 $as_echo "$as_me: WARNING: CXX will be assumed as the unwrapped MPI compiler." >&2;} fi ga_cv_mpicxx_naked="$CXX" CXX="$MPICXX" ;; #( *) : as_fn_error $? "CXX/MPICXX case failure" "$LINENO" 5 ;; esac fi ga_cxx="icpc pgCC pathCC sxc++ xlC_r xlC bgxlC_r bgxlC openCC sunCC crayc++ g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC" ga_mpicxx="mpic++ mpicxx mpiCC sxmpic++ hcp mpxlC_r mpxlC mpixlcxx_r mpixlcxx mpg++ mpc++ mpCC cmpic++ mpiFCC CC" if test x$with_mpi_wrappers = xyes; then : CXX_TO_TEST="$ga_mpicxx_pref $ga_mpicxx" else CXX_TO_TEST="$ga_cxx_pref $ga_cxx" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in $CXX_TO_TEST do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CXX_TO_TEST do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi CXXFLAGS="$ga_save_CXXFLAGS" if test x$with_mpi_wrappers = xyes; then : # Find perl. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Create inside.pl. rm -f inside.pl cat >inside.pl <<"EOF" #!/usr/bin/perl use strict; use warnings; my $numargs = $#ARGV + 1; if ($numargs != 2) { print "Usage: wrapped.txt naked.txt\n"; exit 1; } # Read each input file as a string (rather than a list). local $/=undef; open WRAPPED, "$ARGV[0]" or die "Could not open wrapped text file: $!"; my $wrapped_lines = ; close WRAPPED; open NAKED, "$ARGV[1]" or die "Could not open naked text file: $!"; my $naked_lines = ; close NAKED; # Replace newlines, + from wrapped and naked lines. $wrapped_lines =~ tr/\n+/ /; $naked_lines =~ tr/\n+/ /; # Remove whitespace from beginning of wrapped and naked lines. $wrapped_lines =~ s/^\s+//; $naked_lines =~ s/^\s+//; # Remove whitespace from end of wrapped and naked lines. $wrapped_lines =~ s/\s+$//; $naked_lines =~ s/\s+$//; # If either wrapped_lines or naked_lines are empty, this is an error. # It is assumed that the particular version string which created the input # files should generate SOMETHING. unless ($wrapped_lines) { exit 1; } unless ($naked_lines) { exit 1; } # Cray compilers append a timestamp into their version string. Remove it. if ($wrapped_lines =~ /\QCray\E/) { $wrapped_lines = substr $wrapped_lines, 0, -28; $naked_lines = substr $naked_lines, 0, -28; } # Can the naked lines be found within the wrapped lines? if ($wrapped_lines =~ /\Q$naked_lines\E/) { #print "Found as substring\n"; exit 0; } # Are the naked lines exactly the same as the wrapped lines? elsif ($wrapped_lines eq $naked_lines) { #print "Found equal\n"; exit 0; } else { #print "Not found\n"; exit 1; } EOF inside="$PERL inside.pl" wrapped="$CXX" case $wrapped in #( *_r) : compilers="bgxlC_r xlC_r" ;; #( *) : compilers="icpc pgCC pathCC sxc++ xlC bgxlC openCC sunCC crayc++ g++ c++ gpp aCC cxx cc++ cl.exe FCC KCC RCC CC" ;; #( *) : ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for base $wrapped compiler" >&5 $as_echo_n "checking for base $wrapped compiler... " >&6; } if ${ga_cv_mpicxx_naked+:} false; then : $as_echo_n "(cached) " >&6 else base="`$wrapped -show 2>/dev/null | sed 's/[ ].*$//' | head -1`" ga_save_CXX="$CXX" CXX="$base" # if -m32 or -m64 is present in the -show params, or separately, add it unwrapped_args="`$wrapped -show 2>/dev/null`" extra_arg="" for arg in $unwrapped_args $wrapped do case $arg in #( *-m32*) : extra_arg="-m32" ;; #( *-m64*) : extra_arg="-m64" ;; #( *) : ;; esac done if test "x$extra_arg" != x; then : base="$base $extra_arg" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_mpicxx_naked="$base" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXX="$ga_save_CXX" versions="--version -v -V -qversion" found_wrapped_version=0 # Try separating stdout and stderr. Only compare stdout. if test "x$ga_cv_mpicxx_naked" = x; then : # prepend any CC/CXX/F77 the user may have specified compilers="$ga_orig_CXX $compilers" echo "only comparing stdout" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err naked.txt naked.err if $wrapped $version 1>mpi.txt 2>mpi.err; then : found_wrapped_version=1 for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi # Perhaps none of the MPI compilers had a zero exit status (this is bad). # In this case we have to do a brute force match regardless of exit status. if test "x$found_wrapped_version" = x0; then : if test "x$ga_cv_mpicxx_naked" = x; then : echo "no zero exit status found for MPI compilers" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi fi # Try by combining stdout/err into one file. if test "x$ga_cv_mpicxx_naked" = x; then : echo "try combining stdout and stderr into one file" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt naked.txt if $wrapped $version 1>mpi.txt 2>&1; then : for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>&1; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi # If we got this far, then it's likely that the MPI compiler had a zero exit # status when it shouldn't have for one version flag, but later had a non-zero # exit status for a flag it shouldn't have. One false positive hid a false # negative. In this case, brute force compare all MPI compiler output against # all compiler output. if test "x$ga_cv_mpicxx_naked" = x; then : echo "we have a very badly behaving MPI compiler" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi rm -f mpi.txt mpi.err naked.txt naked.err fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_mpicxx_naked" >&5 $as_echo "$ga_cv_mpicxx_naked" >&6; } if test "x$ga_cv_mpicxx_naked" = x; then : as_fn_error $? "Could not determine the C++ compiler wrapped by MPI" "$LINENO" 5 else if test "x$ga_orig_CXX" != x && test "x$ga_orig_CXX" != "x$ga_cv_mpicxx_naked"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unwrapped $wrapped ($ga_cv_mpicxx_naked) does not match user-specified $ga_orig_CXX" >&5 $as_echo "$as_me: WARNING: unwrapped $wrapped ($ga_cv_mpicxx_naked) does not match user-specified $ga_orig_CXX" >&2;} fi fi rm -f inside.pl fi if test "x$enable_cxx" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler vendor" >&5 $as_echo_n "checking for C++ compiler vendor... " >&6; } if ${ga_cv_cxx_compiler_vendor+:} false; then : $as_echo_n "(cached) " >&6 else ga_save_ac_ext="$ac_ext" ga_cv_cxx_compiler_vendor=unknown ga_cpp_vendor_symbols= for vendor in intel ibm pathscale amd cray gnu sun hp dec borland comeau kai lcc metrowerks sgi microsoft watcom portland fujitsu do case $vendor in #( amd) : ga_cpp_vendor_symbols="defined(__OPEN64__)" ;; #( borland) : ga_cpp_vendor_symbols="defined(__BORLANDC__) || defined(__TURBOC__)" ;; #( comeau) : ga_cpp_vendor_symbols="defined(__COMO__)" ;; #( cray) : ga_cpp_vendor_symbols="defined(_CRAYC) || defined(_ADDR64)" ;; #( dec) : ga_cpp_vendor_symbols="defined(__DECC) || defined(__DECCXX) || defined(__DECC_VER) || defined(__DECCXX_VER)" ;; #( fujitsu) : ga_cpp_vendor_symbols="defined(__fcc__) || defined(__fcc_version__) || defined(_FCC_VER) || defined(__FCC_VER_)" ;; #( gnu) : ga_cpp_vendor_symbols="defined(__GNUC__)" ;; #( hp) : ga_cpp_vendor_symbols="defined(__HP_cc) || defined(__HP_aCC)" ;; #( ibm) : ga_cpp_vendor_symbols="defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)" ;; #( intel) : ga_cpp_vendor_symbols="defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)" ;; #( kai) : ga_cpp_vendor_symbols="defined(__KCC)" ;; #( lcc) : ga_cpp_vendor_symbols="defined(__LCC__)" ;; #( metrowerks) : ga_cpp_vendor_symbols="defined(__MWERKS__)" ;; #( microsoft) : ga_cpp_vendor_symbols="defined(_MSC_VER)" ;; #( pathscale) : ga_cpp_vendor_symbols="defined(__PATHCC__) || defined(__PATHSCALE__)" ;; #( portland) : ga_cpp_vendor_symbols="defined(__PGI)" ;; #( sgi) : ga_cpp_vendor_symbols="defined(__sgi) || defined(sgi)" ;; #( sun) : ga_cpp_vendor_symbols="defined(__SUNPRO_C) || defined(__SUNPRO_CC)" ;; #( watcom) : ga_cpp_vendor_symbols="defined(__WATCOMC__)" ;; #( *) : ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if !($ga_cpp_vendor_symbols) chokeonthis #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ga_cv_cxx_compiler_vendor=$vendor; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ga_cpp_vendor_symbols= ac_ext="$ga_save_ac_ext" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cxx_compiler_vendor" >&5 $as_echo "$ga_cv_cxx_compiler_vendor" >&6; } if test "x$enable_warnings" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ warning flags" >&5 $as_echo_n "checking for C++ warning flags... " >&6; } if ${ga_cv_cxx_warning_flags+:} false; then : $as_echo_n "(cached) " >&6 else ga_cv_cxx_warning_flags= fi { $as_echo "$as_me:${as_lineno-$LINENO}: ga_cv_cxx_warning_flags: $ga_cv_cxx_warning_flags" >&5 $as_echo "$ga_cv_cxx_warning_flags" >&6; } GA_CXX_WARN=$ga_cv_cxx_warning_flags fi ga_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$ga_cv_cxx_warning_flags $CXXFLAGS" if test "x$with_mpi" != xno; then : if test "x$with_mpi" != xno; then : ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a simple C++ MPI program works" >&5 $as_echo_n "checking whether a simple C++ MPI program works... " >&6; } if ${ga_cv_cxx_mpi_test+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=yes else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext # That didn't work, so now let's try with our GA_MP_* flags. if test "x$ga_cv_cxx_mpi_test" = xno; then : ga_save_LIBS="$LIBS"; LIBS="$LIBS $GA_MP_LIBS" ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=yes else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" fi # That didn't work, so now let's try with our GA_MP_* flags and various libs. if test "x$ga_cv_cxx_mpi_test" = xno; then : for lib in -lmpi -lmpich; do ga_save_LIBS="$LIBS"; LIBS="$LIBS $GA_MP_LIBS $lib" ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=$lib; break else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" done LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cxx_mpi_test" >&5 $as_echo "$ga_cv_cxx_mpi_test" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu case $ga_cv_cxx_mpi_test in #( yes) : ;; #( no) : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "could not link simple C++ MPI program See \`config.log' for more details" "$LINENO" 5; } ;; #( *) : GA_MP_LIBS="$ga_cv_cxx_mpi_test" ;; #( *) : ;; esac fi fi # Checks for C++ header files. # Checks for C++ typedefs, structures, and compiler characteristics. # Checks for C++ type sizes. # Checks for C++ library functions. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for specific C++ optimizations" >&5 $as_echo_n "checking for specific C++ optimizations... " >&6; } if ${armci_cv_cxx_opt+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ARMCI_CXXOPT" != x; then : armci_cv_cxx_opt="$ARMCI_CXXOPT" else armci_cv_cxx_opt= fi if test "x$armci_cv_cxx_opt" = x && test "x$enable_opt" = xyes; then : case $ga_cv_target:$ga_cv_cxx_compiler_vendor:$host_cpu:$ga_armci_network in #( LINUX:*:*:*) : armci_cv_cxx_opt="-O0" ;; #( NEC64:*:*:*) : armci_cv_cxx_opt="-Cvsafe -size_t64" ;; #( NEC:*:*:*) : armci_cv_cxx_opt="-Cvsafe" ;; #( *) : armci_cv_cxx_opt= ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $armci_cv_cxx_opt" >&5 $as_echo "$armci_cv_cxx_opt" >&6; } ARMCI_CXXOPT=$armci_cv_cxx_opt CXXFLAGS="$ga_save_CXXFLAGS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ######################################### # Assembler ######################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Assembler" >&5 $as_echo "$as_me: Assembler" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} if test "x$CCAS" = x; then : case $ga_cv_target in #( NEC|NEC64) : CCAS=sxas ;; #( *) : ;; esac fi if test "x$CCASFLAGS" = x; then : case $ga_cv_target in #( NEC) : CCASFLAGS= ;; #( NEC64) : CCASFLAGS="-h size_t64" ;; #( *) : ;; esac fi # By default we simply use the C compiler to build assembly code. test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS depcc="$CCAS" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CCAS_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CCAS_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CCAS_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CCAS_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5 $as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; } CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then am__fastdepCCAS_TRUE= am__fastdepCCAS_FALSE='#' else am__fastdepCCAS_TRUE='#' am__fastdepCCAS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NO_I386ASM is needed" >&5 $as_echo_n "checking whether NO_I386ASM is needed... " >&6; } if ${armci_cv_as_no_i386asm+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ax_cv_c_compiler_vendor" = xfujitsu; then : armci_cv_as_no_i386asm=yes else armci_cv_as_no_i386asm=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $armci_cv_as_no_i386asm" >&5 $as_echo "$armci_cv_as_no_i386asm" >&6; } if test "x$armci_cv_as_no_i386asm" = xyes; then : $as_echo "#define NO_I386ASM 1" >>confdefs.h fi ############################################################################### # BLAS/LAPACK are used in one test program. We don't locate these libraries due # to many of them requiring Fortran. An enthusiastic user of the lone test # program can still build it if they are highly motivated -- but the build will # not be automated. ############################################################################### if test 0 = 1; then HAVE_BLAS_TRUE= HAVE_BLAS_FALSE='#' else HAVE_BLAS_TRUE='#' HAVE_BLAS_FALSE= fi if test 0 = 1; then HAVE_LAPACK_TRUE= HAVE_LAPACK_FALSE='#' else HAVE_LAPACK_TRUE='#' HAVE_LAPACK_FALSE= fi ############################################################################### # Checks for programs. ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Checks for additional programs" >&5 $as_echo "$as_me: Checks for additional programs" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed ############################################################################### # Libtool setup -- no compiler/linker tests after this ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Libtool setup" >&5 $as_echo "$as_me: Libtool setup" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} # temporarily restore unwrapped compilers # this works around a bug where libtool sadly relies on matching compiler # names in order to determine features (Fortran only, I think) # libtool doesn't recognize MPI compiler names, nor should it if test x$with_mpi_wrappers = xyes; then : ga_mpi_unwrap_push_save_CC="$CC" ga_mpi_unwrap_push_save_CXX="$CXX" ga_mpi_unwrap_push_save_F77="$F77" ga_mpi_unwrap_push_save_FC="$FC" if test "x$ga_cv_mpic_naked" != x; then : CC="$ga_cv_mpic_naked" fi if test "x$ga_cv_mpicxx_naked" != x; then : CXX="$ga_cv_mpicxx_naked" fi if test "x$ga_cv_mpif77_naked" != x; then : F77="$ga_cv_mpif77_naked" fi if test "x$ga_cv_mpifc_naked" != x; then : FC="$ga_cv_mpifc_naked" fi fi if test "x$AR" = x; then : case $ga_cv_target in #( NEC|NEC64) : AR=sxar ;; #( *) : ;; esac fi if test "x$RANLIB" = x; then : case $ga_cv_target in #( NEC|NEC64) : RANLIB=true ;; #( *) : ;; esac fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi enable_dlopen=no enable_win32_dll=no # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # and now that that's over, put the MPI compilers back # also, the above hack incorrectly sets the base compiler as the linker if test x$with_mpi_wrappers = xyes; then : CC="$ga_mpi_unwrap_push_save_CC" CXX="$ga_mpi_unwrap_push_save_CXX" F77="$ga_mpi_unwrap_push_save_F77" FC="$ga_mpi_unwrap_push_save_FC" compiler="$CC" LTCC="$CC" lt_save_CC="$CC" compiler_DEFAULT="$CC" compiler_CXX="$CXX" compiler_F77="$F77" fi ############################################################################### # Remaining setup -- some tests, some individual components ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Miscellaneous remaining setup" >&5 $as_echo "$as_me: Miscellaneous remaining setup" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} # Establish some preprocessor symbols. case $ga_armci_network in #( BGML) : $as_echo "#define NO_SHM 1" >>confdefs.h $as_echo "#define USE_MALLOC 1" >>confdefs.h $as_echo "#define BGML 1" >>confdefs.h ;; #( CRAY_SHMEM) : $as_echo "#define CLUSTER 1" >>confdefs.h $as_echo "#define CRAY_XT 1" >>confdefs.h $as_echo "#define CRAY_SHMEM 1" >>confdefs.h ;; #( DCMF) : $as_echo "#define NO_SHM 1" >>confdefs.h $as_echo "#define ARMCIX 1" >>confdefs.h $as_echo "#define DCMF 1" >>confdefs.h ;; #( ELAN3) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define ACC_SMP 1" >>confdefs.h $as_echo "#define QUADRICS 1" >>confdefs.h if test x$LIBELAN_NATTACH != x; then : $as_echo "#define MULTI_CTX 1" >>confdefs.h else $as_echo "#define ALLOC_MUNMAP 1" >>confdefs.h fi ;; #( ELAN4) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define ACC_SMP 1" >>confdefs.h $as_echo "#define QUADRICS 1" >>confdefs.h $as_echo "#define DOELAN4 1" >>confdefs.h ;; #( GEMINI) : $as_echo "#define LIBONESIDED 1" >>confdefs.h $as_echo "#define CRAY_UGNI 1" >>confdefs.h $as_echo "#define GEMINI 1" >>confdefs.h ;; #( GM) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define ALLOW_PIN 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define GM 1" >>confdefs.h ;; #( LAPI) : $as_echo "#define LAPI 1" >>confdefs.h if test x$LAPI_RDMA != x; then : $as_echo "#define ALLOW_PIN 1" >>confdefs.h $as_echo "#define LAPI_RDMA 1" >>confdefs.h fi ;; #( MELLANOX) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define VAPI 1" >>confdefs.h $as_echo "#define ALLOW_PIN 1" >>confdefs.h $as_echo "#define MELLANOX 1" >>confdefs.h ;; #( MPI_MT) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define MPI_MT 1" >>confdefs.h ;; #( MPI_PT) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define MPI_PT 1" >>confdefs.h ;; #( MPI_SPAWN) : $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define MPI_SPAWN 1" >>confdefs.h if test x$ARMCI_SPAWN_CRAY_XT != x; then : $as_echo "#define SPAWN_CRAY_XT 1" >>confdefs.h fi ;; #( OPENIB) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define VAPI 1" >>confdefs.h $as_echo "#define ALLOW_PIN 1" >>confdefs.h $as_echo "#define PEND_BUFS 1" >>confdefs.h $as_echo "#define OPENIB 1" >>confdefs.h ;; #( PORTALS) : $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define CRAY_XT 1" >>confdefs.h $as_echo "#define PORTALS 1" >>confdefs.h ;; #( SOCKETS) : $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SOCKETS 1" >>confdefs.h ;; #( VIA) : $as_echo "#define PTHREADS 1" >>confdefs.h $as_echo "#define DATA_SERVER 1" >>confdefs.h $as_echo "#define SERVER_THREAD 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define VIA 1" >>confdefs.h ;; #( *) : ;; esac if test x$REPORT_SHMMAX != x; then : $as_echo "#define REPORT_SHMMAX 1" >>confdefs.h fi if test x$thread_safety = xyes; then : $as_echo "#define POSIX_THREADS 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h fi # Set up TCGMSG. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remote shell" >&5 $as_echo "$as_me: checking for remote shell" >&6;} for ac_prog in rsh remsh ssh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ga_cv_path_rsh+:} false; then : $as_echo_n "(cached) " >&6 else case $ga_cv_path_rsh in [\\/]* | ?:[\\/]*) ac_cv_path_ga_cv_path_rsh="$ga_cv_path_rsh" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ga_cv_path_rsh="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ga_cv_path_rsh=$ac_cv_path_ga_cv_path_rsh if test -n "$ga_cv_path_rsh"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_path_rsh" >&5 $as_echo "$ga_cv_path_rsh" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ga_cv_path_rsh" && break done test -n "$ga_cv_path_rsh" || ga_cv_path_rsh="not found" if test "x$ga_cv_path_rsh" = "xnot found"; then : as_fn_error $? "Could not find remote shell for use by TCGMSG" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define TCGMSG_RSH "$ga_cv_path_rsh" _ACEOF $as_echo "#define TCGMSG_TIMINGS 1" >>confdefs.h # TODO not sure, but thus far required for 'dist' target at least if test x != x; then RANDOM_ACCESS_TRUE= RANDOM_ACCESS_FALSE='#' else RANDOM_ACCESS_TRUE='#' RANDOM_ACCESS_FALSE= fi # always false # Whether to use PIC for the inline GCC code. if test x$enable_shared = xyes; then ENABLE_SHARED_TRUE= ENABLE_SHARED_FALSE='#' else ENABLE_SHARED_TRUE='#' ENABLE_SHARED_FALSE= fi if test "x$ga_cv_target" = xLINUX64; then : case $host_cpu in #( x86_64|ppc64|ia64) : $as_echo "#define NEED_MEM_SYNC 1" >>confdefs.h ;; #( *) : ;; esac fi if test "x$host_cpu" = xPWR4; then : $as_echo "#define NEED_MEM_SYNC 1" >>confdefs.h fi ############################################################################### # Test suite setup ############################################################################### if test "x$NPROCS" = x; then : NPROCS=4 fi case $ga_msg_comms in #( TCGMSG) : TCGEXEC="`pwd`/parallel.x" ;; #( TCGMSG5) : TCGEXEC= ;; #( MPI) : if test "x$MPIEXEC" = x; then : for ac_prog in mpirun mpiexec do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MPIEXEC+:} false; then : $as_echo_n "(cached) " >&6 else case $MPIEXEC in [\\/]* | ?:[\\/]*) ac_cv_path_MPIEXEC="$MPIEXEC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MPIEXEC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MPIEXEC=$ac_cv_path_MPIEXEC if test -n "$MPIEXEC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIEXEC" >&5 $as_echo "$MPIEXEC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MPIEXEC" && break done MPIEXEC="$MPIEXEC -n %NP%" fi ;; #( *) : ;; esac ############################################################################### # The End ############################################################################### ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${BGL_TRUE}" && test -z "${BGL_FALSE}"; then as_fn_error $? "conditional \"BGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BGP_TRUE}" && test -z "${BGP_FALSE}"; then as_fn_error $? "conditional \"BGP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CATAMOUNT_TRUE}" && test -z "${CATAMOUNT_FALSE}"; then as_fn_error $? "conditional \"CATAMOUNT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_SV1_TRUE}" && test -z "${CRAY_SV1_FALSE}"; then as_fn_error $? "conditional \"CRAY_SV1\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_SV2_TRUE}" && test -z "${CRAY_SV2_FALSE}"; then as_fn_error $? "conditional \"CRAY_SV2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_T3E_TRUE}" && test -z "${CRAY_T3E_FALSE}"; then as_fn_error $? "conditional \"CRAY_T3E\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_XT_TRUE}" && test -z "${CRAY_XT_FALSE}"; then as_fn_error $? "conditional \"CRAY_XT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_YMP_TRUE}" && test -z "${CRAY_YMP_FALSE}"; then as_fn_error $? "conditional \"CRAY_YMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CYGNUS_TRUE}" && test -z "${CYGNUS_FALSE}"; then as_fn_error $? "conditional \"CYGNUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CYGWIN_TRUE}" && test -z "${CYGWIN_FALSE}"; then as_fn_error $? "conditional \"CYGWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DECOSF_TRUE}" && test -z "${DECOSF_FALSE}"; then as_fn_error $? "conditional \"DECOSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FUJITSU_VPP_TRUE}" && test -z "${FUJITSU_VPP_FALSE}"; then as_fn_error $? "conditional \"FUJITSU_VPP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HITACHI_TRUE}" && test -z "${HITACHI_FALSE}"; then as_fn_error $? "conditional \"HITACHI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HPUX_TRUE}" && test -z "${HPUX_FALSE}"; then as_fn_error $? "conditional \"HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IBM_TRUE}" && test -z "${IBM_FALSE}"; then as_fn_error $? "conditional \"IBM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INTERIX_TRUE}" && test -z "${INTERIX_FALSE}"; then as_fn_error $? "conditional \"INTERIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LAPI_TRUE}" && test -z "${LAPI_FALSE}"; then as_fn_error $? "conditional \"LAPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MACX_TRUE}" && test -z "${MACX_FALSE}"; then as_fn_error $? "conditional \"MACX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEC_TRUE}" && test -z "${NEC_FALSE}"; then as_fn_error $? "conditional \"NEC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGI_TRUE}" && test -z "${SGI_FALSE}"; then as_fn_error $? "conditional \"SGI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGI_N32_TRUE}" && test -z "${SGI_N32_FALSE}"; then as_fn_error $? "conditional \"SGI_N32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGITFP_TRUE}" && test -z "${SGITFP_FALSE}"; then as_fn_error $? "conditional \"SGITFP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SOLARIS_TRUE}" && test -z "${SOLARIS_FALSE}"; then as_fn_error $? "conditional \"SOLARIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_MPI_TRUE}" && test -z "${MSG_COMMS_MPI_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_TCGMSG4_TRUE}" && test -z "${MSG_COMMS_TCGMSG4_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_TCGMSG4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_TCGMSG5_TRUE}" && test -z "${MSG_COMMS_TCGMSG5_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_TCGMSG5\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PORTALS_ENABLE_NEW_MALLOC_TRUE}" && test -z "${PORTALS_ENABLE_NEW_MALLOC_FALSE}"; then as_fn_error $? "conditional \"PORTALS_ENABLE_NEW_MALLOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_ENABLE_GPC_CALLS_TRUE}" && test -z "${ARMCI_ENABLE_GPC_CALLS_FALSE}"; then as_fn_error $? "conditional \"ARMCI_ENABLE_GPC_CALLS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_GROUP_TRUE}" && test -z "${ARMCI_GROUP_FALSE}"; then as_fn_error $? "conditional \"ARMCI_GROUP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NB_NONCONT_TRUE}" && test -z "${NB_NONCONT_FALSE}"; then as_fn_error $? "conditional \"NB_NONCONT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_PROFILING_TRUE}" && test -z "${ENABLE_PROFILING_FALSE}"; then as_fn_error $? "conditional \"ENABLE_PROFILING\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CHECKPOINT_TRUE}" && test -z "${ENABLE_CHECKPOINT_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CHECKPOINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TRACE_TRUE}" && test -z "${ENABLE_TRACE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TRACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${THREAD_SAFE_TRUE}" && test -z "${THREAD_SAFE_FALSE}"; then as_fn_error $? "conditional \"THREAD_SAFE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM_MEMBER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_INITIALIZED_TRUE}" && test -z "${HAVE_ARMCI_INITIALIZED_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_INITIALIZED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_TRUE}" && test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_STRIDE_INFO_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_NOTIFY_TRUE}" && test -z "${HAVE_ARMCI_NOTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_NOTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_INIT_TRUE}" && test -z "${HAVE_ARMCI_MSG_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_FINALIZE_TRUE}" && test -z "${HAVE_ARMCI_MSG_FINALIZE_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_FINALIZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM_MEMBER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_INITIALIZED_TRUE}" && test -z "${HAVE_ARMCI_INITIALIZED_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_INITIALIZED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_TRUE}" && test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_STRIDE_INFO_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_NOTIFY_TRUE}" && test -z "${HAVE_ARMCI_NOTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_NOTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_INIT_TRUE}" && test -z "${HAVE_ARMCI_MSG_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_FINALIZE_TRUE}" && test -z "${HAVE_ARMCI_MSG_FINALIZE_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_FINALIZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_ARMCI_TRUE}" && test -z "${ARMCI_NETWORK_ARMCI_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_ARMCI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_BGML_TRUE}" && test -z "${ARMCI_NETWORK_BGML_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_BGML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_CRAY_SHMEM_TRUE}" && test -z "${ARMCI_NETWORK_CRAY_SHMEM_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_CRAY_SHMEM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_DCMF_TRUE}" && test -z "${ARMCI_NETWORK_DCMF_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_DCMF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_DMAPP_TRUE}" && test -z "${ARMCI_NETWORK_DMAPP_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_DMAPP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_LAPI_TRUE}" && test -z "${ARMCI_NETWORK_LAPI_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_LAPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_MPI_TS_TRUE}" && test -z "${ARMCI_NETWORK_MPI_TS_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_MPI_TS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_MPI_MT_TRUE}" && test -z "${ARMCI_NETWORK_MPI_MT_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_MPI_MT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_MPI_PT_TRUE}" && test -z "${ARMCI_NETWORK_MPI_PT_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_MPI_PT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_MPI_PR_TRUE}" && test -z "${ARMCI_NETWORK_MPI_PR_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_MPI_PR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_MPI_SPAWN_TRUE}" && test -z "${ARMCI_NETWORK_MPI_SPAWN_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_MPI_SPAWN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_OFA_TRUE}" && test -z "${ARMCI_NETWORK_OFA_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_OFA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_OPENIB_TRUE}" && test -z "${ARMCI_NETWORK_OPENIB_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_OPENIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_GEMINI_TRUE}" && test -z "${ARMCI_NETWORK_GEMINI_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_GEMINI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_PORTALS4_TRUE}" && test -z "${ARMCI_NETWORK_PORTALS4_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_PORTALS4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_PORTALS_TRUE}" && test -z "${ARMCI_NETWORK_PORTALS_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_PORTALS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_SOCKETS_TRUE}" && test -z "${ARMCI_NETWORK_SOCKETS_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_SOCKETS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DCMF_VER_2_TRUE}" && test -z "${DCMF_VER_2_FALSE}"; then as_fn_error $? "conditional \"DCMF_VER_2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DCMF_VER_0_2_TRUE}" && test -z "${DCMF_VER_0_2_FALSE}"; then as_fn_error $? "conditional \"DCMF_VER_0_2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DCMF_VER_0_3_TRUE}" && test -z "${DCMF_VER_0_3_FALSE}"; then as_fn_error $? "conditional \"DCMF_VER_0_3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_SRC_DIR_PORTALS_TRUE}" && test -z "${ARMCI_SRC_DIR_PORTALS_FALSE}"; then as_fn_error $? "conditional \"ARMCI_SRC_DIR_PORTALS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_SRC_DIR_GEMINI_TRUE}" && test -z "${ARMCI_SRC_DIR_GEMINI_FALSE}"; then as_fn_error $? "conditional \"ARMCI_SRC_DIR_GEMINI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_SRC_DIR_COMEX_TRUE}" && test -z "${ARMCI_SRC_DIR_COMEX_FALSE}"; then as_fn_error $? "conditional \"ARMCI_SRC_DIR_COMEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_SRC_DIR_SRC_TRUE}" && test -z "${ARMCI_SRC_DIR_SRC_FALSE}"; then as_fn_error $? "conditional \"ARMCI_SRC_DIR_SRC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_EXTERNAL_TRUE}" && test -z "${ARMCI_NETWORK_EXTERNAL_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_EXTERNAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ARMCI_NETWORK_COMEX_TRUE}" && test -z "${ARMCI_NETWORK_COMEX_FALSE}"; then as_fn_error $? "conditional \"ARMCI_NETWORK_COMEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_XT_NETWORKS_TRUE}" && test -z "${CRAY_XT_NETWORKS_FALSE}"; then as_fn_error $? "conditional \"CRAY_XT_NETWORKS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SYSV_TRUE}" && test -z "${SYSV_FALSE}"; then as_fn_error $? "conditional \"SYSV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_MEMBER_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM_MEMBER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_GROUP_COMM_TRUE}" && test -z "${HAVE_ARMCI_GROUP_COMM_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_GROUP_COMM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_INITIALIZED_TRUE}" && test -z "${HAVE_ARMCI_INITIALIZED_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_INITIALIZED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_NOTIFY_TRUE}" && test -z "${HAVE_ARMCI_NOTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_NOTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_INIT_TRUE}" && test -z "${HAVE_ARMCI_MSG_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_MSG_FINALIZE_TRUE}" && test -z "${HAVE_ARMCI_MSG_FINALIZE_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_MSG_FINALIZE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_TRUE}" && test -z "${HAVE_ARMCI_STRIDE_INFO_INIT_FALSE}"; then as_fn_error $? "conditional \"HAVE_ARMCI_STRIDE_INFO_INIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE}" && test -z "${HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE}"; then as_fn_error $? "conditional \"HAVE_SYS_WEAK_ALIAS_PRAGMA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_BLAS_TRUE}" && test -z "${HAVE_BLAS_FALSE}"; then as_fn_error $? "conditional \"HAVE_BLAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LAPACK_TRUE}" && test -z "${HAVE_LAPACK_FALSE}"; then as_fn_error $? "conditional \"HAVE_LAPACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RANDOM_ACCESS_TRUE}" && test -z "${RANDOM_ACCESS_FALSE}"; then as_fn_error $? "conditional \"RANDOM_ACCESS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Aggregate Remote Memory Copy Interface (ARMCI) $as_me 1.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to . Aggregate Remote Memory Copy Interface (ARMCI) home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Aggregate Remote Memory Copy Interface (ARMCI) config.status 1.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # Report on what we found. { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: **************************************************************" >&5 $as_echo "$as_me: **************************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: $PACKAGE_NAME configured as follows:" >&5 $as_echo "$as_me: $PACKAGE_NAME configured as follows:" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: **************************************************************" >&5 $as_echo "$as_me: **************************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: TARGET=$ga_cv_target" >&5 $as_echo "$as_me: TARGET=$ga_cv_target" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: MSG_COMMS=$ga_msg_comms" >&5 $as_echo "$as_me: MSG_COMMS=$ga_msg_comms" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_LIBS=$GA_MP_LIBS" >&5 $as_echo "$as_me: GA_MP_LIBS=$GA_MP_LIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_LDFLAGS=$GA_MP_LDFLAGS" >&5 $as_echo "$as_me: GA_MP_LDFLAGS=$GA_MP_LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS" >&5 $as_echo "$as_me: GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_NETWORK=$ga_armci_network" >&5 $as_echo "$as_me: ARMCI_NETWORK=$ga_armci_network" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_NETWORK_LDFLAGS=$ARMCI_NETWORK_LDFLAGS" >&5 $as_echo "$as_me: ARMCI_NETWORK_LDFLAGS=$ARMCI_NETWORK_LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_NETWORK_LIBS=$ARMCI_NETWORK_LIBS" >&5 $as_echo "$as_me: ARMCI_NETWORK_LIBS=$ARMCI_NETWORK_LIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_NETWORK_CPPFLAGS=$ARMCI_NETWORK_CPPFLAGS" >&5 $as_echo "$as_me: ARMCI_NETWORK_CPPFLAGS=$ARMCI_NETWORK_CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CC=$CC" >&5 $as_echo "$as_me: CC=$CC" >&6;} if test "x$with_mpi_wrappers" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: unwrapped CC=$ga_cv_mpic_naked" >&5 $as_echo "$as_me: unwrapped CC=$ga_cv_mpic_naked" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: CFLAGS=$CFLAGS" >&5 $as_echo "$as_me: CFLAGS=$CFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_COPT=$ARMCI_COPT" >&5 $as_echo "$as_me: ARMCI_COPT=$ARMCI_COPT" >&6;} if test "x$enable_cxx" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: CXX=$CXX" >&5 $as_echo "$as_me: CXX=$CXX" >&6;} if test "x$with_mpi_wrappers" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: unwrapped CXX=$ga_cv_mpicxx_naked" >&5 $as_echo "$as_me: unwrapped CXX=$ga_cv_mpicxx_naked" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: CXXFLAGS=$CXXFLAGS" >&5 $as_echo "$as_me: CXXFLAGS=$CXXFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: ARMCI_CXXOPT=$ARMCI_CXXOPT" >&5 $as_echo "$as_me: ARMCI_CXXOPT=$ARMCI_CXXOPT" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: CPP=$CPP" >&5 $as_echo "$as_me: CPP=$CPP" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CPPFLAGS=$CPPFLAGS" >&5 $as_echo "$as_me: CPPFLAGS=$CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: LDFLAGS=$LDFLAGS" >&5 $as_echo "$as_me: LDFLAGS=$LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: LIBS=$LIBS" >&5 $as_echo "$as_me: LIBS=$LIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: FLIBS=$FLIBS" >&5 $as_echo "$as_me: FLIBS=$FLIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: AR=$AR" >&5 $as_echo "$as_me: AR=$AR" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: AR_FLAGS=$AR_FLAGS" >&5 $as_echo "$as_me: AR_FLAGS=$AR_FLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CCAS=$CCAS" >&5 $as_echo "$as_me: CCAS=$CCAS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CCAS_FLAGS=$CCAS_FLAGS" >&5 $as_echo "$as_me: CCAS_FLAGS=$CCAS_FLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: DEFS=$DEFS" >&5 $as_echo "$as_me: DEFS=$DEFS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: SHELL=$SHELL" >&5 $as_echo "$as_me: SHELL=$SHELL" >&6;} case $ga_msg_comms in #( MPI) : { $as_echo "$as_me:${as_lineno-$LINENO}: MPIEXEC=$MPIEXEC" >&5 $as_echo "$as_me: MPIEXEC=$MPIEXEC" >&6;} ;; #( *) : ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: NPROCS=$NPROCS" >&5 $as_echo "$as_me: NPROCS=$NPROCS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} ga-5-4/armci/configure.ac0000644000175000017500000003001412662210420013402 0ustar mbamba# Process this file with autoconf to produce a configure script. ############################################################################### # Init autoconf ############################################################################### AC_PREREQ([2.67]) AC_INIT([Aggregate Remote Memory Copy Interface (ARMCI)], [1.5], [hpctools@pnl.gov], [armci], [http://www.emsl.pnl.gov/docs/parsoft/armci/]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_LIBOBJ_DIR([compat]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/common/armci.c]) ############################################################################### # Must occur before automake init ############################################################################### GA_TARGET GA_CROSS_COMPILING ############################################################################### # Init automake ############################################################################### AM_INIT_AUTOMAKE([color-tests foreign parallel-tests silent-rules subdir-objects]) # Don't emit "rebuild rules" for configure, Makefile.ins, etc. AM_MAINTAINER_MODE ############################################################################### # Misc. information and package setup. ############################################################################### GA_WITH_HELP ARMCI_TOP_BUILDDIR="`pwd`" cd "$srcdir" ARMCI_TOP_SRCDIR="`pwd`" cd "$ARMCI_TOP_BUILDDIR" AS_IF([test "$ARMCI_TOP_BUILDDIR" != "$ARMCI_TOP_SRCDIR"], [AC_MSG_NOTICE([Detected VPATH build])]) # Determine messaging library up front because if MPI is desired we use the # MPI compiler wrappers instead of the standard compilers. GA_MSG_COMMS # Hack to enable NEW_MALLOC feature AC_ARG_ENABLE([portals-new-malloc], [AS_HELP_STRING([--enable-portals-new-malloc], [add -DNEW_MALLOC to CPPFLAGS])]) AS_IF([test "x$enable_portals_new_malloc" = xyes], [AC_DEFINE([NEW_MALLOC], [1], [for portals, enable new malloc])]) AM_CONDITIONAL([PORTALS_ENABLE_NEW_MALLOC], [test "x$enable_portals_new_malloc" = xyes]) ARMCI_ENABLE_GPC ARMCI_ENABLE_GROUP ARMCI_ENABLE_NB_NONCONT ARMCI_ENABLE_PROFILING ARMCI_SHMMAX GA_DISABLE_MPI_TESTS GA_ENABLE_WARNINGS GA_ENABLE_CHECKPOINT GA_ENABLE_OPT GA_ENABLE_TRACE GA_THREAD_SAFE ######################################### # C compiler ######################################### AC_MSG_NOTICE AC_MSG_NOTICE([C compiler]) AC_MSG_NOTICE ga_save_CFLAGS="$CFLAGS" GA_PROG_MPICC CFLAGS="$ga_save_CFLAGS" AC_USE_SYSTEM_EXTENSIONS GA_COMPILER_VENDOR GA_WARN_FLAGS ga_save_CFLAGS="$CFLAGS" CFLAGS="$ga_cv_c_warning_flags $CFLAGS" AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP], [GA_ARG_PARSE([with_mpi], [GA_MP_LIBS], [GA_MP_LDFLAGS], [GA_MP_CPPFLAGS])]) AS_IF([test "x$with_mpi" != xno], [ AS_CASE([$enable_mpi_tests], [yes],[GA_MPICC_TEST_LINK], [no], [GA_MPICC_TEST_COMPILE])]) # Hack to append .x to executables. AC_SUBST([EXEEXT], [.x$EXEEXT]) GA_TARGET64 # Establish the underlying network infrastructure (SOCKETS, OPENIB, etc) GA_ARMCI_NETWORK # Checks for C header files. AC_HEADER_ASSERT AC_HEADER_DIRENT AC_HEADER_STDBOOL AC_HEADER_STDC AC_HEADER_SYS_WAIT GA_CHECK_HEADERS([assert.h c_asm.h errno.h fcntl.h float.h ia64/sys/inline.h malloc.h math.h memory.h mpp/shmem.h netdb.h netinet/in.h netinet/tcp.h process.h setjmp.h signal.h stdarg.h stdint.h stdio.h stdlib.h string.h strings.h sys/types.h sys/atomic_op.h sys/errno.h sys/file.h sys/ipc.h sys/mman.h sys/param.h sys/sem.h sys/shm.h sys/socket.h sys/stat.h sys/syscall.h sys/systemcfg.h sys/time.h sys/uio.h sys/wait.h time.h unistd.h windows.h winsock.h rpc/rpc.h rpc/types.h rpc/xdr.h], [], [], [@%:@ifdef HAVE_RPC_TYPES_H @%:@include @%:@endif @%:@ifdef HAVE_SYS_TYPES_H @%:@include @%:@endif @%:@ifdef HAVE_SYS_IPC_H @%:@include @%:@endif]) # Checks for C typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_C_RESTRICT AC_C_VOLATILE AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_SIGNAL AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT8_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_CHECK_TYPES([ptrdiff_t]) GA_FUNCTION GA_DISABLE_SYS_WEAK_ALIAS GA_SYS_WEAK_ALIAS GA_UNION_SEMUN # Checks for C type sizes. AC_CHECK_SIZEOF([void*]) AC_CHECK_SIZEOF([char]) AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AC_CHECK_SIZEOF([long long]) AC_CHECK_SIZEOF([float]) AC_CHECK_SIZEOF([double]) GA_C_POINTER_AS_INTEGER # Checks for C library functions. AC_FUNC_FORK AC_FUNC_MMAP AC_FUNC_SELECT_ARGTYPES AC_FUNC_VPRINTF AS_IF([test "x$ga_msg_comms" = xTCGMSG], [AC_SEARCH_LIBS([xdr_array], [rpclib], [], [], [])]) AC_SEARCH_LIBS([floor], [m], [have_floor=1], [have_floor=0]) AC_DEFINE_UNQUOTED([HAVE_FLOOR], [$have_floor], [Define to 1 if you have the 'floor' function.]) AC_SEARCH_LIBS([pow], [m], [have_pow=1], [have_pow=0]) AC_DEFINE_UNQUOTED([HAVE_POW], [$have_pow], [Define to 1 if you have the 'pow' function.]) AC_SEARCH_LIBS([sqrt], [m], [have_sqrt=1], [have_sqrt=0]) AC_DEFINE_UNQUOTED([HAVE_SQRT], [$have_sqrt], [Define to 1 if you have the 'sqrt' function.]) GA_CHECK_FUNCS([bzero fastbcopy ftruncate gethostbyname getpagesize gettimeofday memset munmap select socket strchr strdup strerror strstr strtol _lock_try _acquire_lock xdr_char]) GA_CHECK_FUNCS([pthread_getconcurrency pthread_setconcurrency]) # Checks for C libraries. ARMCI_C_OPT CFLAGS="$ga_save_CFLAGS" ######################################### # C++ compiler ######################################### AC_MSG_NOTICE AS_IF([test "x$enable_cxx" = xyes], [AC_MSG_NOTICE([C++ compiler])], [AC_MSG_NOTICE([C++ compiler (disabled, but some tests still required)])]) AC_MSG_NOTICE AC_LANG_PUSH([C++]) # GA_PROG_MPICXX is required to silence complaints that C++ source exists # even if C++ support has been disabled. ga_save_CXXFLAGS="$CXXFLAGS" GA_PROG_MPICXX CXXFLAGS="$ga_save_CXXFLAGS" AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP]) AS_IF([test "x$enable_cxx" = xyes], [ GA_COMPILER_VENDOR GA_WARN_FLAGS ga_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$ga_cv_cxx_warning_flags $CXXFLAGS" AS_IF([test "x$with_mpi" != xno], [GA_MPICXX_TEST]) # Checks for C++ header files. # Checks for C++ typedefs, structures, and compiler characteristics. # Checks for C++ type sizes. # Checks for C++ library functions. ARMCI_CXX_OPT CXXFLAGS="$ga_save_CXXFLAGS" ]) AC_LANG_POP([C++]) ######################################### # Assembler ######################################### AC_MSG_NOTICE AC_MSG_NOTICE([Assembler]) AC_MSG_NOTICE GA_AS AM_PROG_AS ARMCI_AS_NO_I386ASM ############################################################################### # BLAS/LAPACK are used in one test program. We don't locate these libraries due # to many of them requiring Fortran. An enthusiastic user of the lone test # program can still build it if they are highly motivated -- but the build will # not be automated. ############################################################################### AM_CONDITIONAL([HAVE_BLAS], [test 0 = 1]) AM_CONDITIONAL([HAVE_LAPACK], [test 0 = 1]) ############################################################################### # Checks for programs. ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([Checks for additional programs]) AC_MSG_NOTICE AC_PROG_GREP AC_PROG_SED ############################################################################### # Libtool setup -- no compiler/linker tests after this ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([Libtool setup]) AC_MSG_NOTICE # temporarily restore unwrapped compilers # this works around a bug where libtool sadly relies on matching compiler # names in order to determine features (Fortran only, I think) # libtool doesn't recognize MPI compiler names, nor should it AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP_PUSH]) GA_AR LT_INIT([disable-shared]) # and now that that's over, put the MPI compilers back # also, the above hack incorrectly sets the base compiler as the linker AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP_POP compiler="$CC" LTCC="$CC" lt_save_CC="$CC" compiler_DEFAULT="$CC" compiler_CXX="$CXX" compiler_F77="$F77"]) ############################################################################### # Remaining setup -- some tests, some individual components ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([Miscellaneous remaining setup]) AC_MSG_NOTICE # Establish some preprocessor symbols. ARMCI_SETUP # Set up TCGMSG. TCGMSG_REMOTE_SHELL TCGMSG_ENABLE_TIMINGS # TODO not sure, but thus far required for 'dist' target at least AM_CONDITIONAL([RANDOM_ACCESS], [test x != x]) # always false # Whether to use PIC for the inline GCC code. AM_CONDITIONAL([ENABLE_SHARED], [test x$enable_shared = xyes]) AS_IF([test "x$ga_cv_target" = xLINUX64], [AS_CASE([$host_cpu], [x86_64|ppc64|ia64], [AC_DEFINE([NEED_MEM_SYNC], [1], [Creates memfenc macro])])]) AS_IF([test "x$host_cpu" = xPWR4], [AC_DEFINE([NEED_MEM_SYNC], [1], [Creates memfenc macro])]) ############################################################################### # Test suite setup ############################################################################### AC_ARG_VAR([NPROCS], [number of procs to use for parallel tests (default 4)]) AS_IF([test "x$NPROCS" = x], [NPROCS=4]) AC_SUBST([NPROCS]) AC_ARG_VAR([MPIEXEC], [how to run parallel tests if built with MPI e.g. "mpiexec -np %NP%"]) AS_CASE([$ga_msg_comms], [TCGMSG], [TCGEXEC="`pwd`/parallel.x"], [TCGMSG5], [TCGEXEC=], [MPI], [AS_IF([test "x$MPIEXEC" = x], [AC_PATH_PROGS([MPIEXEC], [mpirun mpiexec]) MPIEXEC="$MPIEXEC -n %NP%"])]) AC_SUBST([MPIEXEC]) AC_SUBST([TCGEXEC]) ############################################################################### # The End ############################################################################### AC_CONFIG_FILES([Makefile]) AC_OUTPUT # Report on what we found. AC_MSG_NOTICE([]) AC_MSG_NOTICE([**************************************************************]) AC_MSG_NOTICE([ $PACKAGE_NAME configured as follows:]) AC_MSG_NOTICE([**************************************************************]) AC_MSG_NOTICE([]) AC_MSG_NOTICE([ TARGET=$ga_cv_target]) AC_MSG_NOTICE([ MSG_COMMS=$ga_msg_comms]) AC_MSG_NOTICE([ GA_MP_LIBS=$GA_MP_LIBS]) AC_MSG_NOTICE([ GA_MP_LDFLAGS=$GA_MP_LDFLAGS]) AC_MSG_NOTICE([ GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS]) AC_MSG_NOTICE([ ARMCI_NETWORK=$ga_armci_network]) AC_MSG_NOTICE([ ARMCI_NETWORK_LDFLAGS=$ARMCI_NETWORK_LDFLAGS]) AC_MSG_NOTICE([ ARMCI_NETWORK_LIBS=$ARMCI_NETWORK_LIBS]) AC_MSG_NOTICE([ARMCI_NETWORK_CPPFLAGS=$ARMCI_NETWORK_CPPFLAGS]) AC_MSG_NOTICE([ CC=$CC]) AS_IF([test "x$with_mpi_wrappers" = xyes], [ AC_MSG_NOTICE([ unwrapped CC=$ga_cv_mpic_naked]) ]) AC_MSG_NOTICE([ CFLAGS=$CFLAGS]) AC_MSG_NOTICE([ ARMCI_COPT=$ARMCI_COPT]) AS_IF([test "x$enable_cxx" = xyes], [ AC_MSG_NOTICE([ CXX=$CXX]) AS_IF([test "x$with_mpi_wrappers" = xyes], [ AC_MSG_NOTICE([ unwrapped CXX=$ga_cv_mpicxx_naked]) ]) AC_MSG_NOTICE([ CXXFLAGS=$CXXFLAGS]) AC_MSG_NOTICE([ ARMCI_CXXOPT=$ARMCI_CXXOPT]) ]) AC_MSG_NOTICE([ CPP=$CPP]) AC_MSG_NOTICE([ CPPFLAGS=$CPPFLAGS]) AC_MSG_NOTICE([ LDFLAGS=$LDFLAGS]) AC_MSG_NOTICE([ LIBS=$LIBS]) AC_MSG_NOTICE([ FLIBS=$FLIBS]) AC_MSG_NOTICE([ AR=$AR]) AC_MSG_NOTICE([ AR_FLAGS=$AR_FLAGS]) AC_MSG_NOTICE([ CCAS=$CCAS]) AC_MSG_NOTICE([ CCAS_FLAGS=$CCAS_FLAGS]) AC_MSG_NOTICE([ DEFS=$DEFS]) AC_MSG_NOTICE([ SHELL=$SHELL]) AS_CASE([$ga_msg_comms], [MPI], [ AC_MSG_NOTICE([ MPIEXEC=$MPIEXEC]) ]) AC_MSG_NOTICE([ NPROCS=$NPROCS]) AC_MSG_NOTICE([]) ga-5-4/armci/README0000644000175000017500000003457412662210416012020 0ustar mbambaAggregate Remote Memory Copy Interface (ARMCI) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DISCLAIMER ========== This material was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor the United States Department of Energy, nor Battelle, nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS. ACKNOWLEDGMENT ============== This software and its documentation were produced with United States Government support under Contract Number DE-AC06-76RLO-1830 awarded by the United States Department of Energy. The United States Government retains a paid-up non-exclusive, irrevocable worldwide license to reproduce, prepare derivative works, perform publicly and display publicly by or for the US Government, including the right to distribute to other US Government contractors. FOR THE IMPATIENT ================= The command:: ./configure && make && make install should compile the static ARMCI library (libarmci.a) to use sockets and install headers and libraries to /usr/local/include and /usr/local/lib, respectively. Please refer to the INSTALL file for generic build instructions. That is a good place to start if you are new to using "configure; make; make install" types of builds. Detailed instructions are covered later in this file. QUESTIONS/HELP/SUPPORT/BUG-REPORT ================================= email: hpctools@pnl.gov website: http://www.emsl.pnl.gov/docs/parsoft/armci ABOUT THIS SOFTWARE =================== This document lists the platforms supported by ARMCI and operating system configuration/settings for these platform. Additional limited documentation is available at ./doc/armci.pdf. Test programs test.c and perf.c are in ./testing directory. SPLASH LU benchmark it in ./examples directory. Index ----- 1. Supported Platforms 2. General Settings 3. Building ARMCI on SGI. 4. Building ARMCI on IBM. 5. Building ARMCI on CRAY. 6. Building ARMCI on other platforms 7. Platform specific issues/tuning Supported Platforms ------------------- - leadership class machines: Cray XE6, Cray XTs, IBM Blue Gene/L, IBM Blue Gene /P - shared-memory systems: SUN Solaris, SGI, SGI Altix, IBM, Linux, DEC, HP, Cray SV1, Cray X1, and Windows NT/95/2000 - distributed-memory systems: Cray T3E, IBM SP(TARGET=LAPI), FUJITSU VX/VPP. - clusters of workstations (InfiniBand, sockets) configure options ----------------- ARMCI should be run with MPI. PVM and TCGMSG message-passing libraries are no longer supported. ARMCI has been tested with MPI vendor implementations in addition to MPICH and WMPI(NT). ARMCI has been tested with TCGMSG by developers of the NWChem package on many platforms. GNU make is REQUIRED on Unix. For command line build on Windows, microsoft nmake instead of GNU make should be used. Historically, the TARGET environment variable needed to be set. This variable is now detected automatically by configure. It also detects whether the system is a 64-bit platform. Historically, the MSG_COMMS environment variable needed to be set. This variable is obsolete. Instead, options are passed to configure. Read on for details. There are many options available when configuring ARMCI. Although configure can be safely run within this distributions' root folder, we recommend performing an out-of-source (aka VPATH) build. This will cleanly separate the generated Makefiles and compiled object files and libraries from the source code. This will allow, for example, one build using sockets versus another build using OpenIB for the communication layer to use the same source tree e.g.:: mkdir bld_mpi_sockets && cd bld_mpi_sockets && ../configure mkdir bld_mpi_openib && cd bld_mpi_openib && ../configure --with-openib Regardless of your choice to perform a VPATH build, the following should hopefully elucidate the myriad options to configure. Only the options requiring additional details are documented here. ./configure --help will certainly list more options in addition to limited documentation. For most of the external software packages an optional argument is allowed (represented as ARG below.) **ARG can be omitted** or can be one or more whitespace-separated directories, linker or preprocessor directives. For example:: --with-mpi="/path/to/mpi -lmylib -I/mydir" --with-mpi=/path/to/mpi/base --with-mpi=-lmpich The messaging libraries supported include MPI. If you omit their respective --with-* option, MPI is the default. --with-mpi=ARG Select MPI as the messaging library (default). If you omit ARG, we attempt to locate the MPI compiler wrappers. If you supply anything for ARG, we will parse ARG as indicated above. The ARMCI_NETWORK environment variable is now also obsolete. Instead use one of the following configure options. Our ability to automatically locate required headers libraries is currently inadequate. Therefore, you will likely need to specify the optional ARG pointing to the necessary directories and/or libraries. sockets is the default ARMCI network if nothing else is specified. --with-bgml=ARG select armci network as IBM BG/L --with-cray-shmem=ARG select armci network as Cray XT shmem --with-dcmf=ARG select armci network as IBM BG/P Deep Computing Message Framework --with-lapi=ARG select armci network as IBM LAPI --with-mpi-spawn=ARG select armci network as MPI-2 dynamic process mgmt --with-openib=ARG select armci network as InfiniBand OpenIB --with-portals=ARG select armci network as Cray XT portals --with-sockets=ARG select armci network as Ethernet TCP/IP (default) --enable-autodetect attempt to locate ARMCI network besides sockets SOCKETS is the assumed default for clusters connected with Ethernet. This protocol might also work on other networks however, the performance might be sub-optimal and on Myrinet it could even hang (GM does not work with fork and the standard version of ARMCI uses fork). Cross-Compilation Issues ------------------------ Certain platforms cross-compile from a login node for a compute node, or one might choose to cross-compile for other reasons. Cross-compiling requires the use of the --host option to configure which indicates to configure that certain run-time tests should not be executed. See INSTALL for details on use of the --host option. Two of our target platforms are known to require cross-compilation, Cray XT and IBM Blue Gene. Cray XT +++++++ It has been noted that configure still succeeds without the use of the --host flag. If you experience problems without --host, we recommend:: configure --host=x86_64-unknown-linux-gnu And if that doesn't work (cross-compilation is not detected) you must then *force* cross-compilation using both --host and --build together:: configure --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu BlueGene/P ++++++++++ Currently the only way to detect the BGP platform and compile correctly is to use:: configure --host=powerpc-bgp-linux The rest of the configure options apply as usual e.g. --with-dcmf in this case. Compiler Selection ------------------ Unless otherwise noted you can try to overwrite the default compiler names detected by configure by defining F77, CC, and CXX for Fortran (77), C, and C++ compilers, respectively. Or when using the MPI compilers MPIF77, MPICC, and MPICXX for MPI Fortran (77), C, and C++ compilers, respectively:: configure F77=f90 CC=gcc configure MPIF77=mpif90 MPICC=mpicc Although you can change the compiler at make-time it will likely fail. Many platform-specific compiler flags are detected at configure-time based on the compiler selection. If changing compilers, we recommend rerunning configure as above. After Configuration ------------------- By this point we assume you have successfully run configure either from the base distribution directory or from a separate build directory (aka VPATH build.) You are now ready to run 'make'. You can optionally run parallel make using the "-j" option which significantly speeds up the build. If using the MPI compiler wrappers, occasionally using "-j" will cause build failures because the MPI compiler wrapper creates a temporary symlink to the mpif.h header. In that case, you won't be able to use the "-j" option. Further, the influential environment variables used at configure-time can be overridden at make-time in case problems are encountered. For example:: ./configure CFLAGS=-Wimplicit ... make CFLAGS="-Wimplicit -g -O0" One particularly influential make variable is "V" which controls the verbosity of the make output. This variable corresponds to the --dis/enable-silent-riles configure-time option, but I often prefer the make-time variable:: make V=0 (configure --enable-silent-rules) make V=1 (configure --disable-silent-rules) Test Programs ------------- Running "make checkprogs" will build most test and example programs. Note that not all tests are built -- some tests depend on certain features being detected or enabled during configure. These programs are not intented to be examples of good ARMCI coding practices because they often include private headers. However, they help us debug or time our ARMCI library. Test Suite ++++++++++ Running "make check" will build most test and example programs (See "make checkprogs" notes above) in addition to running the test suite. The test suite runs both the serial and parallel tests. The test suite must know how to launch the parallel tests via the MPIEXEC variable. Please read your MPI flavor's documentation on how to launch. For example, the following is the command to launch the test suite when compiled with OpenMPI:: make check MPIEXEC="mpiexec -np 4" All tests have a per-test log file containing the output of the test. So if the test is testing/test.x, the log file would be testing/test.log. The output of failed tests is collected in the top-level log summary test-suite.log. ANCIENT WISDOM ============== Building on SGI --------------- For running on SGI machines running the irix os, three target settings are available: - TARGET=SGI generates a MIPS-4 64-bit code with 32-bit address space when compiling on any R8000 based machines and a 32 bit MPIS-2 code on any non-R8000 machines. - Use TARGET=SGI64 For generating a 64 bit code with 64-bit address space. - TARGET=SGI_N32 generates a 32bit code with a 32bit address space. By default, SGI_N32 generates a MIPS3 code and SGI64 generates a MIPS4 code. There is a possibility of conflict between the SGI's implementation of MPI (but not others, MPICH for example) and ARMCI in their use of the SGI specific inter-processor communication facility called arena. Building on IBM --------------- Running on IBM without LAPI +++++++++++++++++++++++++++ On IBM's running AIX, target can be set to IBM or IBM64 to run 32/64 bit versions of the code. Running on the IBM-SP +++++++++++++++++++++ TARGET on IBM-SP can be set to LAPI (LAPI64 for 64 bit object). POE environment variable settings for the parallel environment PSSP 3.1: - ARMCI applications like any other LAPI-based codes must define MP_MSG_API=lapi or MP_MSG_API=mpi,lapi (when using ARMCI and MPI) - The LAPI-based implementation of ARMCI cannot be used on the very old SP-2 systems because LAPI did not support the TB2 switch used in those models. If in doubt which switch you got use odmget command: odmget -q name=css0 CuDv - For AIX versions 4.3.1 and later, environment variable AIXTHREAD_SCOPE=S must be set to assure correct operation of LAPI (IBM should do it in PSSP by default). - Under AIX 4.3.3 and later an additional environment variable is required(RT_GRQ=ON) to restore the original thread scheduling that LAPI relies on. Building on CRAY ---------------- - TARGET environment variable is also used by cc on CRAY. It has to be set to CRAY-SV1 on SV1, CRAY-YMP on YMP, CRAY-T3E on T3E. ARMCI on CRAY'S hence uses the same values to this environment variable as cc requires. - On CRAY-T3E, ARMCI can be run with either of the CRAY Message Passing Libraries(PVM and MPI). For more information on running with PVM look at docs/README.PVM. If running with PVM, MSG_COMMS has to be set to PVM. Building on other platforms --------------------------- On other platforms, only setting required is the TARGET environment environment variable. Optionally, MSG_COMMS and related environment can be set as described in the General Settings section. Platform specific issues/tuning ------------------------------- The Linux kernel has traditionally fairly small limit for the shared memory segment size (SHMMAX). In kernels 2.2.x it is 32MB on Intel, 16MB on Sun Ultra, and 4MB on Alpha processors. There are two ways to increase this limit: - rebuild the kernel after changing SHMMAX in /usr/src/linux/include/asm-i386/shmparam.h, for example, setting SHMMAX as 0x8000000 (128MB) - A system admin can increase the limit without rebuilding the kernel, for example:: echo "134217728" >/proc/sys/kernel/shmmax SUN +++ Solaris by default provides only 1MB limit for the largest shared memory segment. You need to increase this value to do any useful work with ARMCI. For example to make SHMMAX= 2GB, add either of the lines to /etc/system:: set shmsys:shminfo_shmmax=0x80000000 /* hexidecimal */ set shmsys:shminfo_shmmax=2147483648 /* decimal */ After rebooting, you should be able to take advantage of the increased shared memory limits. Compaq/DEC ++++++++++ Tru64 is another example of an OS with a pitifully small size of the shared memory region limit. Here are instruction on how to modify shared memory max segment size to 256MB on the Tru64 UNIX Version 4.0F: 1. create a file called /etc/sysconfig.shmmax:: cat > /etc/sysconfig.shmmax << EOF ipc: shm-max = 268435456 EOF You can check if the file created is OK by typing:: /sbin/sysconfigdb -l -t /etc/sysconfig.shmmax 2. Modify kernel values:: sysconfigdb -a -f /etc/sysconfig.shmmax ipc 3. Reboot 4. To check new values:: /sbin/sysconfig -q ipc|egrep shm-max HP-UX +++++ In most HP-UX/11 installations, the default limit for the largest shared memory segment is 64MB. A system administrator should be able to. ga-5-4/armci/m4/0000755000175000017500000000000012662210376011450 5ustar mbambaga-5-4/armci/m4/lt_obsolete.m40000644000175000017500000001375612662210376014241 0ustar mbamba# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) ga-5-4/armci/m4/ltsugar.m40000644000175000017500000001042412662210376013374 0ustar mbamba# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) ga-5-4/armci/m4/libtool.m40000644000175000017500000105721612662210376013372 0ustar mbamba# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS ga-5-4/armci/m4/ltoptions.m40000644000175000017500000003007312662210376013750 0ustar mbamba# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) ga-5-4/armci/m4/ltversion.m40000644000175000017500000000126212662210376013740 0ustar mbamba# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) ga-5-4/armci/f90/0000755000175000017500000000000012662210417011522 5ustar mbambaga-5-4/armci/f90/arraywrap.c0000644000175000017500000000606412662210417013704 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /******************************************************************************************************* * This is a language (python,f90) independent layer of array management operations * Oerations defined here are called from language-specific layer to allocate & free memory * *******************************************************************************************************/ #include #include #include #include #include #include extern int armci_nproc, armci_me; /*\ allocates memory for array according to rank an lower/upper bounds * pptr contains address to user visible array data * lb can be specified as NULL - in that case ub contains shape \*/ void _array_create(void **pptr, int elemsize, int rank, index_size_t *lb, index_size_t *ub) { void **tmp; char *hptr; armci_arr_dsc_t *ad; void *gtemp; int* ia, i; int bytes=0, elems=1, apsize; *pptr = (void*)0; if(rank <1 || rank > MAXDIM) {fprintf(stderr,"%d: bad rank %d\n",armci_me,rank); return;} if(lb) for(i=0; i< rank; i++) elems *= 1 + ub[i] - lb[i]; else for(i=0; i< rank; i++) elems *= ub[i]; /* allocate pointer vector */ apsize = armci_nproc *sizeof(void*); tmp = (void*) malloc(apsize); if(!tmp) {fprintf(stderr,"%: malloc failed\n",armci_me); return;} bytes += apsize; /* allocate header */ bytes += HEADER_SIZE; /* allocate array memory */ bytes += elemsize * elems; if( ARMCI_Malloc(tmp,bytes)) { fprintf(stderr,"%: armci_malloc failed\n",armci_me); return;} /* set up the header */ hptr = ((char*)tmp[armci_me])+apsize; gtemp = ((char*)hptr)+HEADER_SIZE; #if DEBUG_ printf("%d: array memory %p tmp=%p\n", armci_me, gtemp,tmp[armci_me]); fflush(stdout); #endif /* store array descriptor */ ad = (armci_arr_dsc_t*) hptr; /* */ ad->aptr = tmp[armci_me]; /* store ptr to array of ptrs */ ad->elemsize = elemsize; ad->amem = gtemp; ad->rank = rank; if(lb){ for(i=0; i< rank; i++) ad->lo[i] = lb[i]; for(i=0; i< rank; i++) ad->hi[i] = ub[i]; for(i=0; i< rank; i++) ad->extent[i] = 1 + ub[i] - lb[i]; }else { for(i=0; i< rank; i++) ad->lo[i] = 0; /* C default for array lower bound */ for(i=0; i< rank; i++) ad->hi[i] = ub[i]-1; /* C default for array upper bound */ for(i=0; i< rank; i++) ad->extent[i] = ub[i]; } ad->stride[0]=elemsize; for(i=1; i< rank; i++) ad->stride[i] = ad->stride[i-1]*ad->extent[i-1]; /* adjust ptr array to point to the user f90 array rather than allocated memory */ for(i = 0; iaptr,apsize); *pptr = gtemp; free(tmp); } /*\ deallocates array corresponding to ptr \*/ void _array_free(void *ptr) { armci_arr_dsc_t *ad; ad = GET_ARR_DSC_FROM_ARRAY(ptr); if(ptr != ad->amem)ARMCI_Error("free - bad memory\n",0); ARMCI_Free(ad->aptr); #if DEBUG_ printf("%d: freed %p\n",armci_me, addr); fflush(stdout); #endif } ga-5-4/armci/f90/testfa_type.f900000644000175000017500000027050212662210417014377 0ustar mbambasubroutine testa_i4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc integer(kind=i4), pointer :: a7_i4(:,:,:,:,:,:,:), b7_i4(:,:,:,:,:,:,:) integer(kind=i4), pointer :: a6_i4(:,:,:,:,:,:), b6_i4(:,:,:,:,:,:) integer(kind=i4), pointer :: a5_i4(:,:,:,:,:), b5_i4(:,:,:,:,:) integer(kind=i4), pointer :: a4_i4(:,:,:,:), b4_i4(:,:,:,:) integer(kind=i4), pointer :: a3_i4(:,:,:), b3_i4(:,:,:) integer(kind=i4), pointer :: a2_i4(:,:), b2_i4(:,:) integer(kind=i4), pointer :: a1_i4(:), b1_i4(:) integer(kind=i4), pointer :: v_i4(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst * afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! test i4 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v_i4,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1_i4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1_i4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1_i4 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! i4 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d_i4(a7_i4,b7_i4,lb,ub,lb,ub,afirst,bfirst) a6_i4(:,:,:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i4(:,:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i4(:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i4(:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i4(:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i4(:) = a7_i4(lb(1):ub(1),1,1,1,1,1,1) b6_i4(:,:,:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i4(:,:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i4(:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i4(:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i4(:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i4(:) = b7_i4(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_put_fa(a1_i4, src_slice, b1_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d i4, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d i4, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2_i4, src_slice, b2_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d i4, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2_i4,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2_i4,dst_slice,src_slice,remote_proc, & v_i4(1:asize(2)) = reshape(b2_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d i4, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3_i4, src_slice, b3_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d i4, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v_i4(1:asize(3)) = reshape(b3_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d i4, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4_i4, src_slice, b4_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d i4, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v_i4(1:asize(4)) = reshape(b4_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d i4, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5_i4, src_slice, b5_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d i4, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v_i4(1:asize(5)) = reshape(b5_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d i4, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6_i4, src_slice, b6_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d i4, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v_i4(1:asize(6)) = reshape(b6_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d i4, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7_i4, src_slice, b7_i4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d i4, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v_i4(1:asize(7)) = reshape(b7_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d i4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for i4, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7_i4,b7_i4,lb,ub,lb,ub,afirst,bfirst) a6_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i4 = a7_i4(lb(1):ub(1),1,1,1,1,1,1) b6_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i4 = b7_i4(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1_i4, dst_slice, a1_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2_i4, dst_slice, a2_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(2)) = reshape(a2_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3_i4, dst_slice, a3_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(3)) = reshape(a3_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4_i4, dst_slice, a4_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(4)) = reshape(a4_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5_i4, dst_slice, a5_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(5)) = reshape(a5_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6_i4, dst_slice, a6_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(6)) = reshape(a6_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d i4, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7_i4, dst_slice, a7_i4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i4(1:asize(7)) = reshape(a7_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d i4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for i4, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v_i4, rc) call armci_free_fa(a1_i4, rc) call armci_free_fa(b1_i4, rc) call armci_free_fa(a2_i4, rc) call armci_free_fa(b2_i4, rc) call armci_free_fa(a3_i4, rc) call armci_free_fa(b3_i4, rc) call armci_free_fa(a4_i4, rc) call armci_free_fa(b4_i4, rc) call armci_free_fa(a5_i4, rc) call armci_free_fa(b5_i4, rc) call armci_free_fa(a6_i4, rc) call armci_free_fa(b6_i4, rc) call armci_free_fa(a7_i4, rc) call armci_free_fa(b7_i4, rc) call armci_sync() return endsubroutine subroutine testa_i8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc integer(kind=i8), pointer :: a7_i8(:,:,:,:,:,:,:), b7_i8(:,:,:,:,:,:,:) integer(kind=i8), pointer :: a6_i8(:,:,:,:,:,:), b6_i8(:,:,:,:,:,:) integer(kind=i8), pointer :: a5_i8(:,:,:,:,:), b5_i8(:,:,:,:,:) integer(kind=i8), pointer :: a4_i8(:,:,:,:), b4_i8(:,:,:,:) integer(kind=i8), pointer :: a3_i8(:,:,:), b3_i8(:,:,:) integer(kind=i8), pointer :: a2_i8(:,:), b2_i8(:,:) integer(kind=i8), pointer :: a1_i8(:), b1_i8(:) integer(kind=i8), pointer :: v_i8(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo afirst = (1+me) bfirst = afirst * afirst ! test i8 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v_i8,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1_i8 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1_i8, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1_i8 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! i8 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d(a7_i8,b7_i8,lb,ub,lb,ub,afirst,bfirst) a6_i8(:,:,:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i8(:,:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i8(:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i8(:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i8(:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i8(:) = a7_i8(lb(1):ub(1),1,1,1,1,1,1) b6_i8(:,:,:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i8(:,:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i8(:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i8(:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i8(:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i8(:) = b7_i8(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_put_fa(a1_i8, src_slice, b1_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d i8, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d i8, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2_i8, src_slice, b2_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d i8, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2_i8,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2_i8,dst_slice,src_slice,remote_proc, & v_i8(1:asize(2)) = reshape(b2_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d i8, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3_i8, src_slice, b3_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d i8, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v_i8(1:asize(3)) = reshape(b3_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d i8, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4_i8, src_slice, b4_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d i8, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v_i8(1:asize(4)) = reshape(b4_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d i8, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5_i8, src_slice, b5_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d i8, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v_i8(1:asize(5)) = reshape(b5_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d i8, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6_i8, src_slice, b6_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d i8, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v_i8(1:asize(6)) = reshape(b6_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d i8, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7_i8, src_slice, b7_i8, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d i8, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v_i8(1:asize(7)) = reshape(b7_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d i8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for i8, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7_i8,b7_i8,lb,ub,lb,ub,afirst,bfirst) a6_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i8 = a7_i8(lb(1):ub(1),1,1,1,1,1,1) b6_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i8 = b7_i8(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1_i8, dst_slice, a1_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2_i8, dst_slice, a2_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(2)) = reshape(a2_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3_i8, dst_slice, a3_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(3)) = reshape(a3_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4_i8, dst_slice, a4_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(4)) = reshape(a4_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5_i8, dst_slice, a5_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(5)) = reshape(a5_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6_i8, dst_slice, a6_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(6)) = reshape(a6_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d i8, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7_i8, dst_slice, a7_i8, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v_i8(1:asize(7)) = reshape(a7_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d i8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for i8, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v_i8, rc) call armci_free_fa(a1_i8, rc) call armci_free_fa(b1_i8, rc) call armci_free_fa(a2_i8, rc) call armci_free_fa(b2_i8, rc) call armci_free_fa(a3_i8, rc) call armci_free_fa(b3_i8, rc) call armci_free_fa(a4_i8, rc) call armci_free_fa(b4_i8, rc) call armci_free_fa(a5_i8, rc) call armci_free_fa(b5_i8, rc) call armci_free_fa(a6_i8, rc) call armci_free_fa(b6_i8, rc) call armci_free_fa(a7_i8, rc) call armci_free_fa(b7_i8, rc) call armci_sync() return endsubroutine subroutine testa_r4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc real(kind=r4), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) real(kind=r4), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) real(kind=r4), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) real(kind=r4), pointer :: a4(:,:,:,:), b4(:,:,:,:) real(kind=r4), pointer :: a3(:,:,:), b3(:,:,:) real(kind=r4), pointer :: a2(:,:), b2(:,:) real(kind=r4), pointer :: a1(:), b1(:) real(kind=r4), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! test r4 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! r4 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_put_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d r4, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d r4, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d r4, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d r4, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d r4, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d r4, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d r4, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d r4, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d r4, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d r4, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d r4, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d r4, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d r4, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d r4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for r4, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d r4, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d r4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for r4, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v, rc) call armci_free_fa(a1, rc) call armci_free_fa(b1, rc) call armci_free_fa(a2, rc) call armci_free_fa(b2, rc) call armci_free_fa(a3, rc) call armci_free_fa(b3, rc) call armci_free_fa(a4, rc) call armci_free_fa(b4, rc) call armci_free_fa(a5, rc) call armci_free_fa(b5, rc) call armci_free_fa(a6, rc) call armci_free_fa(b6, rc) call armci_free_fa(a7, rc) call armci_free_fa(b7, rc) call armci_sync() return endsubroutine subroutine testa_r8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use armci_nbmov use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc real(kind=r8), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) real(kind=r8), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) real(kind=r8), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) real(kind=r8), pointer :: a4(:,:,:,:), b4(:,:,:,:) real(kind=r8), pointer :: a3(:,:,:), b3(:,:,:) real(kind=r8), pointer :: a2(:,:), b2(:,:) real(kind=r8), pointer :: a1(:), b1(:) real(kind=r8), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! test r8 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! r8 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_nbput_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d r8, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d r8, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d r8, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d r8, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d r8, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d r8, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d r8, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d r8, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d r8, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d r8, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d r8, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d r8, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d r8, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d r8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for r8, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d r8, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d r8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for r8, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v, rc) call armci_free_fa(a1, rc) call armci_free_fa(b1, rc) call armci_free_fa(a2, rc) call armci_free_fa(b2, rc) call armci_free_fa(a3, rc) call armci_free_fa(b3, rc) call armci_free_fa(a4, rc) call armci_free_fa(b4, rc) call armci_free_fa(a5, rc) call armci_free_fa(b5, rc) call armci_free_fa(a6, rc) call armci_free_fa(b6, rc) call armci_free_fa(a7, rc) call armci_free_fa(b7, rc) call armci_sync() return endsubroutine subroutine testa_c4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc complex(kind=c4), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) complex(kind=c4), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) complex(kind=c4), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) complex(kind=c4), pointer :: a4(:,:,:,:), b4(:,:,:,:) complex(kind=c4), pointer :: a3(:,:,:), b3(:,:,:) complex(kind=c4), pointer :: a2(:,:), b2(:,:) complex(kind=c4), pointer :: a1(:), b1(:) complex(kind=c4), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! test c4 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! c4 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_put_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d c4, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d c4, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d c4, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d c4, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d c4, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d c4, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d c4, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d c4, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d c4, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d c4, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d c4, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d c4, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d c4, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d c4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for c4, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d c4, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d c4, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for c4, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v, rc) call armci_free_fa(a1, rc) call armci_free_fa(b1, rc) call armci_free_fa(a2, rc) call armci_free_fa(b2, rc) call armci_free_fa(a3, rc) call armci_free_fa(b3, rc) call armci_free_fa(a4, rc) call armci_free_fa(b4, rc) call armci_free_fa(a5, rc) call armci_free_fa(b5, rc) call armci_free_fa(a6, rc) call armci_free_fa(b6, rc) call armci_free_fa(a7, rc) call armci_free_fa(b7, rc) call armci_sync() return endsubroutine subroutine testa_c8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use testa_init use checkput implicit none type(armci_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc complex(kind=c8), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) complex(kind=c8), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) complex(kind=c8), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) complex(kind=c8), pointer :: a4(:,:,:,:), b4(:,:,:,:) complex(kind=c8), pointer :: a3(:,:,:), b3(:,:,:) complex(kind=c8), pointer :: a2(:,:), b2(:,:) complex(kind=c8), pointer :: a1(:), b1(:) complex(kind=c8), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 ub(7) = 3 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! test c8 flavor. vlb(1) = 1 vub(1) = asize(7) call armci_malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' armci_malloc_fa for v failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b7 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b6 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b5 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b4 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b3 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b2 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for a1 failed rc = ',rc call armci_abort() endif call armci_malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' armci_malloc_fa for b1 failed rc = ',rc call armci_abort() endif ! let all processors get alloccated. call armci_sync() ! c8 allocations done, now loop over slices. ! we will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! test put. ! do m = 1,3 ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the put. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%lo(7) = 1 src_slice%hi(7) = 2 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%lo(7) = 2 dst_slice%hi(7) = 3 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! rank 1. rank = 1 call armci_put_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 1d c8, m = ',m,' failed, rc = ',rc endif ! check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 1d c8, m = ',m,' failed' endif call armci_sync() ! rank 2. rank = 2 vshape(1) = asize(2) call armci_put_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 2d c8, m = ',m,' failed, rc = ',rc endif ! check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 2d c8, m = ',m,' failed' endif call armci_sync() ! rank 3. rank = 3 vshape(1) = asize(3) call armci_put_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 3d c8, m = ',m,' failed, rc = ',rc endif ! check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 3d c8, m = ',m,' failed' endif call armci_sync() ! rank 4. rank = 4 vshape(1) = asize(4) call armci_put_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 4d c8, m = ',m,' failed, rc = ',rc endif ! check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d c8, m = ',m,' failed' endif call armci_sync() ! rank 5. rank = 5 vshape(1) = asize(5) call armci_put_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 5d c8, m = ',m,' failed, rc = ',rc endif ! check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 4d c8, m = ',m,' failed' endif call armci_sync() ! rank 6. rank = 6 vshape(1) = asize(6) call armci_put_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 6d c8, m = ',m,' failed, rc = ',rc endif ! check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 6d c8, m = ',m,' failed' endif call armci_sync() ! rank 7. rank = 7 vshape(1) = asize(7) call armci_put_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call armci_sync() if (rc .ne. 0) then print *,me,': armci_put_fa for 7d c8, m = ',m,' failed, rc = ',rc endif ! check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_put_fa verify for 7d c8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_put_fa for c8, ',m,'d passed' endif enddo endif ! ! test get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! let all processors get initialized. call armci_sync() ! set up slice info for the get. ! ! for m = 1, the slice has all unit strides. ! for m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! for m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%lo(7) = 1 src_slice%hi(7) = 2 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%lo(7) = 2 dst_slice%hi(7) = 3 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! rank 1 ! rank = 1 call armci_get_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 1d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 2 ! rank = 2 vshape(1) = asize(2) call armci_get_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 2d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 3 ! rank = 3 vshape(1) = asize(3) call armci_get_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 3d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 4 ! rank = 4 vshape(1) = asize(4) call armci_get_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 4d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 5 ! rank = 5 vshape(1) = asize(5) call armci_get_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 5d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 6 ! rank = 6 vshape(1) = asize(6) call armci_get_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 6d c8, m = ',m,' failed' endif call armci_sync() ! ! rank 7 ! rank = 7 vshape(1) = asize(7) call armci_get_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call armci_sync() ! ! check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': armci_get_fa verify for 7d c8, m = ',m,' failed' endif call armci_sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' armci_get_fa for c8, ',m,'d passed' endif enddo endif ! ! free v, a and b arrays. ! call armci_sync() call armci_free_fa(v, rc) call armci_free_fa(a1, rc) call armci_free_fa(b1, rc) call armci_free_fa(a2, rc) call armci_free_fa(b2, rc) call armci_free_fa(a3, rc) call armci_free_fa(b3, rc) call armci_free_fa(a4, rc) call armci_free_fa(b4, rc) call armci_free_fa(a5, rc) call armci_free_fa(b5, rc) call armci_free_fa(a6, rc) call armci_free_fa(b6, rc) call armci_free_fa(a7, rc) call armci_free_fa(b7, rc) call armci_sync() return endsubroutine ga-5-4/armci/f90/armci_mem_f90.f900000644000175000017500000015741512662210417014466 0ustar mbambamodule armci_mem_f90 use armci_types interface armci_malloc_fa module procedure armci_malloc_1di4 module procedure armci_malloc_2di4 module procedure armci_malloc_3di4 module procedure armci_malloc_4di4 module procedure armci_malloc_5di4 module procedure armci_malloc_6di4 module procedure armci_malloc_7di4 module procedure armci_malloc_1di8 module procedure armci_malloc_2di8 module procedure armci_malloc_3di8 module procedure armci_malloc_4di8 module procedure armci_malloc_5di8 module procedure armci_malloc_6di8 module procedure armci_malloc_7di8 module procedure armci_malloc_1dr4 module procedure armci_malloc_2dr4 module procedure armci_malloc_3dr4 module procedure armci_malloc_4dr4 module procedure armci_malloc_5dr4 module procedure armci_malloc_6dr4 module procedure armci_malloc_7dr4 module procedure armci_malloc_1dr8 module procedure armci_malloc_2dr8 module procedure armci_malloc_3dr8 module procedure armci_malloc_4dr8 module procedure armci_malloc_5dr8 module procedure armci_malloc_6dr8 module procedure armci_malloc_7dr8 module procedure armci_malloc_1dc4 module procedure armci_malloc_2dc4 module procedure armci_malloc_3dc4 module procedure armci_malloc_4dc4 module procedure armci_malloc_5dc4 module procedure armci_malloc_6dc4 module procedure armci_malloc_7dc4 module procedure armci_malloc_1dc8 module procedure armci_malloc_2dc8 module procedure armci_malloc_3dc8 module procedure armci_malloc_4dc8 module procedure armci_malloc_5dc8 module procedure armci_malloc_6dc8 module procedure armci_malloc_7dc8 end interface interface armci_free_fa module procedure armci_free_1di4 module procedure armci_free_2di4 module procedure armci_free_3di4 module procedure armci_free_4di4 module procedure armci_free_5di4 module procedure armci_free_6di4 module procedure armci_free_7di4 module procedure armci_free_1di8 module procedure armci_free_2di8 module procedure armci_free_3di8 module procedure armci_free_4di8 module procedure armci_free_5di8 module procedure armci_free_6di8 module procedure armci_free_7di8 module procedure armci_free_1dr4 module procedure armci_free_2dr4 module procedure armci_free_3dr4 module procedure armci_free_4dr4 module procedure armci_free_5dr4 module procedure armci_free_6dr4 module procedure armci_free_7dr4 module procedure armci_free_1dr8 module procedure armci_free_2dr8 module procedure armci_free_3dr8 module procedure armci_free_4dr8 module procedure armci_free_5dr8 module procedure armci_free_6dr8 module procedure armci_free_7dr8 module procedure armci_free_1dc4 module procedure armci_free_2dc4 module procedure armci_free_3dc4 module procedure armci_free_4dc4 module procedure armci_free_5dc4 module procedure armci_free_6dc4 module procedure armci_free_7dc4 module procedure armci_free_1dc8 module procedure armci_free_2dc8 module procedure armci_free_3dc8 module procedure armci_free_4dc8 module procedure armci_free_5dc8 module procedure armci_free_6dc8 module procedure armci_free_7dc8 end interface contains subroutine armci_malloc_1di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_1di4: error = ", rc end subroutine armci_malloc_1di4 subroutine armci_malloc_2di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_2di4: error = ", rc end subroutine armci_malloc_2di4 subroutine armci_malloc_3di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_3di4: error = ", rc end subroutine armci_malloc_3di4 subroutine armci_malloc_4di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_4di4: error = ", rc end subroutine armci_malloc_4di4 subroutine armci_malloc_5di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_5di4: error = ", rc end subroutine armci_malloc_5di4 subroutine armci_malloc_6di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_6di4: error = ", rc end subroutine armci_malloc_6di4 subroutine armci_malloc_7di4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_7di4: error = ", rc end subroutine armci_malloc_7di4 subroutine armci_free_1di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_1di4: error = ", rc end subroutine armci_free_1di4 subroutine armci_free_2di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_2di4: error = ", rc end subroutine armci_free_2di4 subroutine armci_free_3di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_3di4: error = ", rc end subroutine armci_free_3di4 subroutine armci_free_4di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_4di4: error = ", rc end subroutine armci_free_4di4 subroutine armci_free_5di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_5di4: error = ", rc end subroutine armci_free_5di4 subroutine armci_free_6di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_6di4: error = ", rc end subroutine armci_free_6di4 subroutine armci_free_7di4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) if (rc .ne. 0) print *, "error armci_free_7di4: error = ", rc end subroutine armci_free_7di4 subroutine armci_malloc_1di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_1di8: error = ", rc end subroutine armci_malloc_1di8 subroutine armci_malloc_2di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_2di8: error = ", rc end subroutine armci_malloc_2di8 subroutine armci_malloc_3di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_3di8: error = ", rc end subroutine armci_malloc_3di8 subroutine armci_malloc_4di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_4di8: error = ", rc end subroutine armci_malloc_4di8 subroutine armci_malloc_5di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) if (rc .ne. 0) print *, "error armci_malloc_5di8: error = ", rc end subroutine armci_malloc_5di8 subroutine armci_malloc_6di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_6di8: error = ", rc end subroutine armci_malloc_6di8 subroutine armci_malloc_7di8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_7di8: error = ", rc end subroutine armci_malloc_7di8 subroutine armci_free_1di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_1di8: error = ", rc end subroutine armci_free_1di8 subroutine armci_free_2di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_2di8: error = ", rc end subroutine armci_free_2di8 subroutine armci_free_3di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_3di8: error = ", rc end subroutine armci_free_3di8 subroutine armci_free_4di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_4di8: error = ", rc end subroutine armci_free_4di8 subroutine armci_free_5di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_5di8: error = ", rc end subroutine armci_free_5di8 subroutine armci_free_6di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_6di8: error = ", rc end subroutine armci_free_6di8 subroutine armci_free_7di8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_7di8: error = ", rc end subroutine armci_free_7di8 subroutine armci_malloc_1dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_1dr4: error = ", rc end subroutine armci_malloc_1dr4 subroutine armci_malloc_2dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_2dr4: error = ", rc end subroutine armci_malloc_2dr4 subroutine armci_malloc_3dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_3dr4: error = ", rc end subroutine armci_malloc_3dr4 subroutine armci_malloc_4dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_4dr4: error = ", rc end subroutine armci_malloc_4dr4 subroutine armci_malloc_5dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_5dr4: error = ", rc end subroutine armci_malloc_5dr4 subroutine armci_malloc_6dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_6dr4: error = ", rc end subroutine armci_malloc_6dr4 subroutine armci_malloc_7dr4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 4 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_7dr4: error = ", rc end subroutine armci_malloc_7dr4 subroutine armci_free_1dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_1dr4: error = ", rc end subroutine armci_free_1dr4 subroutine armci_free_2dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_2dr4: error = ", rc end subroutine armci_free_2dr4 subroutine armci_free_3dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_3dr4: error = ", rc end subroutine armci_free_3dr4 subroutine armci_free_4dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_4dr4: error = ", rc end subroutine armci_free_4dr4 subroutine armci_free_5dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_5dr4: error = ", rc end subroutine armci_free_5dr4 subroutine armci_free_6dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_6dr4: error = ", rc end subroutine armci_free_6dr4 subroutine armci_free_7dr4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_7dr4: error = ", rc end subroutine armci_free_7dr4 subroutine armci_malloc_1dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_1dr8: error = ", rc end subroutine armci_malloc_1dr8 subroutine armci_malloc_2dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_2dr8: error = ", rc end subroutine armci_malloc_2dr8 subroutine armci_malloc_3dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_3dr8: error = ", rc end subroutine armci_malloc_3dr8 subroutine armci_malloc_4dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_4dr8: error = ", rc end subroutine armci_malloc_4dr8 subroutine armci_malloc_5dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_5dr8: error = ", rc end subroutine armci_malloc_5dr8 subroutine armci_malloc_6dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_6dr8: error = ", rc end subroutine armci_malloc_6dr8 subroutine armci_malloc_7dr8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_7dr8: error = ", rc end subroutine armci_malloc_7dr8 subroutine armci_free_1dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_1dr8: error = ", rc end subroutine armci_free_1dr8 subroutine armci_free_2dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_2dr8: error = ", rc end subroutine armci_free_2dr8 subroutine armci_free_3dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_3dr8: error = ", rc end subroutine armci_free_3dr8 subroutine armci_free_4dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_4dr8: error = ", rc end subroutine armci_free_4dr8 subroutine armci_free_5dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_5dr8: error = ", rc end subroutine armci_free_5dr8 subroutine armci_free_6dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_6dr8: error = ", rc end subroutine armci_free_6dr8 subroutine armci_free_7dr8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_7dr8: error = ", rc end subroutine armci_free_7dr8 subroutine armci_malloc_1dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_1dc4: error = ", rc end subroutine armci_malloc_1dc4 subroutine armci_malloc_2dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_2dc4: error = ", rc end subroutine armci_malloc_2dc4 subroutine armci_malloc_3dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_3dc4: error = ", rc end subroutine armci_malloc_3dc4 subroutine armci_malloc_4dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_4dc4: error = ", rc end subroutine armci_malloc_4dc4 subroutine armci_malloc_5dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_5dc4: error = ", rc end subroutine armci_malloc_5dc4 subroutine armci_malloc_6dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_6dc4: error = ", rc end subroutine armci_malloc_6dc4 subroutine armci_malloc_7dc4(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 8 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_7dc4: error = ", rc end subroutine armci_malloc_7dc4 subroutine armci_free_1dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_1dc4: error = ", rc end subroutine armci_free_1dc4 subroutine armci_free_2dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_2dc4: error = ", rc end subroutine armci_free_2dc4 subroutine armci_free_3dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_3dc4: error = ", rc end subroutine armci_free_3dc4 subroutine armci_free_4dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_4dc4: error = ", rc end subroutine armci_free_4dc4 subroutine armci_free_5dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_5dc4: error = ", rc end subroutine armci_free_5dc4 subroutine armci_free_6dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_6dc4: error = ", rc end subroutine armci_free_6dc4 subroutine armci_free_7dc4(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_7dc4: error = ", rc end subroutine armci_free_7dc4 subroutine armci_malloc_1dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:), pointer :: a integer, intent(in) :: rank, elemsize, lb(1), ub(1) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:), pointer :: a integer, dimension(1) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 1 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_1dc8: error = ", rc end subroutine armci_malloc_1dc8 subroutine armci_malloc_2dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(2), ub(2) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:), pointer :: a integer, dimension(2) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 2 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_2dc8: error = ", rc end subroutine armci_malloc_2dc8 subroutine armci_malloc_3dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(3), ub(3) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:,:), pointer :: a integer, dimension(3) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 3 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_3dc8: error = ", rc end subroutine armci_malloc_3dc8 subroutine armci_malloc_4dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(4), ub(4) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:,:,:), pointer :: a integer, dimension(4) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 4 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_4dc8: error = ", rc end subroutine armci_malloc_4dc8 subroutine armci_malloc_5dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(5), ub(5) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:,:,:,:), pointer :: a integer, dimension(5) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 5 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_5dc8: error = ", rc end subroutine armci_malloc_5dc8 subroutine armci_malloc_6dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(6), ub(6) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: a integer, dimension(6) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 6 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_6dc8: error = ", rc end subroutine armci_malloc_6dc8 subroutine armci_malloc_7dc8(a, lb, ub, rc) use definekind implicit none interface subroutine armci_malloc_farray(a, rank, elemsize, lb, ub, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank, elemsize, lb(7), ub(7) integer, intent(out) :: rc end subroutine armci_malloc_farray end interface complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: a integer, dimension(7) :: lb, ub integer, intent(out), optional :: rc integer :: elemsize = 16 integer :: rank = 7 call armci_malloc_farray(a, rank, elemsize, lb, ub, rc) ! if (rc .ne. 0) print *, "error armci_malloc_7dc8: error = ", rc end subroutine armci_malloc_7dc8 subroutine armci_free_1dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 1 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_1dc8: error = ", rc end subroutine armci_free_1dc8 subroutine armci_free_2dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 2 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_2dc8: error = ", rc end subroutine armci_free_2dc8 subroutine armci_free_3dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 3 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_3dc8: error = ", rc end subroutine armci_free_3dc8 subroutine armci_free_4dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 4 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_4dc8: error = ", rc end subroutine armci_free_4dc8 subroutine armci_free_5dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 5 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_5dc8: error = ", rc end subroutine armci_free_5dc8 subroutine armci_free_6dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 6 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_6dc8: error = ", rc end subroutine armci_free_6dc8 subroutine armci_free_7dc8(a, rc) use definekind implicit none interface subroutine armci_free_farray(a, rank, rc) use definekind complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(in) :: rank integer, intent(out) :: rc end subroutine armci_free_farray end interface complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: a integer, intent(out), optional :: rc integer :: rank = 7 call armci_free_farray(a, rank, rc) ! if (rc .ne. 0) print *, "error armci_free_7dc8: error = ", rc end subroutine armci_free_7dc8 end module armci_mem_f90 ga-5-4/armci/f90/armci_mov_f90.f900000644000175000017500000021566012662210417014506 0ustar mbambamodule armci_mov_f90 use armci_types interface armci_put_fa module procedure armci_put_1di4 module procedure armci_put_2di4 module procedure armci_put_3di4 module procedure armci_put_4di4 module procedure armci_put_5di4 module procedure armci_put_6di4 module procedure armci_put_7di4 module procedure armci_put_1di8 module procedure armci_put_2di8 module procedure armci_put_3di8 module procedure armci_put_4di8 module procedure armci_put_5di8 module procedure armci_put_6di8 module procedure armci_put_7di8 module procedure armci_put_1dr4 module procedure armci_put_2dr4 module procedure armci_put_3dr4 module procedure armci_put_4dr4 module procedure armci_put_5dr4 module procedure armci_put_6dr4 module procedure armci_put_7dr4 module procedure armci_put_1dr8 module procedure armci_put_2dr8 module procedure armci_put_3dr8 module procedure armci_put_4dr8 module procedure armci_put_5dr8 module procedure armci_put_6dr8 module procedure armci_put_7dr8 module procedure armci_put_1dc4 module procedure armci_put_2dc4 module procedure armci_put_3dc4 module procedure armci_put_4dc4 module procedure armci_put_5dc4 module procedure armci_put_6dc4 module procedure armci_put_7dc4 module procedure armci_put_1dc8 module procedure armci_put_2dc8 module procedure armci_put_3dc8 module procedure armci_put_4dc8 module procedure armci_put_5dc8 module procedure armci_put_6dc8 module procedure armci_put_7dc8 end interface interface armci_get_fa module procedure armci_get_1di4 module procedure armci_get_2di4 module procedure armci_get_3di4 module procedure armci_get_4di4 module procedure armci_get_5di4 module procedure armci_get_6di4 module procedure armci_get_7di4 module procedure armci_get_1di8 module procedure armci_get_2di8 module procedure armci_get_3di8 module procedure armci_get_4di8 module procedure armci_get_5di8 module procedure armci_get_6di8 module procedure armci_get_7di8 module procedure armci_get_1dr4 module procedure armci_get_2dr4 module procedure armci_get_3dr4 module procedure armci_get_4dr4 module procedure armci_get_5dr4 module procedure armci_get_6dr4 module procedure armci_get_7dr4 module procedure armci_get_1dr8 module procedure armci_get_2dr8 module procedure armci_get_3dr8 module procedure armci_get_4dr8 module procedure armci_get_5dr8 module procedure armci_get_6dr8 module procedure armci_get_7dr8 module procedure armci_get_1dc4 module procedure armci_get_2dc4 module procedure armci_get_3dc4 module procedure armci_get_4dc4 module procedure armci_get_5dc4 module procedure armci_get_6dc4 module procedure armci_get_7dc4 module procedure armci_get_1dc8 module procedure armci_get_2dc8 module procedure armci_get_3dc8 module procedure armci_get_4dc8 module procedure armci_get_5dc8 module procedure armci_get_6dc8 module procedure armci_get_7dc8 end interface contains subroutine armci_put_1di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1di4 subroutine armci_put_2di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2di4 subroutine armci_put_3di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3di4 subroutine armci_put_4di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4di4 subroutine armci_put_5di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5di4 subroutine armci_put_6di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6di4 subroutine armci_put_7di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7di4 subroutine armci_put_1di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1di8 subroutine armci_put_2di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2di8 subroutine armci_put_3di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3di8 subroutine armci_put_4di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4di8 subroutine armci_put_5di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5di8 subroutine armci_put_6di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6di8 subroutine armci_put_7di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7di8 subroutine armci_put_1dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1dr4 subroutine armci_put_2dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2dr4 subroutine armci_put_3dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3dr4 subroutine armci_put_4dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4dr4 subroutine armci_put_5dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5dr4 subroutine armci_put_6dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6dr4 subroutine armci_put_7dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7dr4 subroutine armci_put_1dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1dr8 subroutine armci_put_2dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2dr8 subroutine armci_put_3dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3dr8 subroutine armci_put_4dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4dr8 subroutine armci_put_5dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5dr8 subroutine armci_put_6dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6dr8 subroutine armci_put_7dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7dr8 subroutine armci_put_1dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1dc4 subroutine armci_put_2dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2dc4 subroutine armci_put_3dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3dc4 subroutine armci_put_4dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4dc4 subroutine armci_put_5dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5dc4 subroutine armci_put_6dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6dc4 subroutine armci_put_7dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7dc4 subroutine armci_put_1dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_1dc8 subroutine armci_put_2dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_2dc8 subroutine armci_put_3dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_3dc8 subroutine armci_put_4dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_4dc8 subroutine armci_put_5dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_5dc8 subroutine armci_put_6dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_6dc8 subroutine armci_put_7dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_put_farrays end interface complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_put_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_put_7dc8 !get subroutine armci_get_1di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1di4 subroutine armci_get_2di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2di4 subroutine armci_get_3di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3di4 subroutine armci_get_4di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4di4 subroutine armci_get_5di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5di4 subroutine armci_get_6di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6di4 subroutine armci_get_7di4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7di4 subroutine armci_get_1di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1di8 subroutine armci_get_2di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2di8 subroutine armci_get_3di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3di8 subroutine armci_get_4di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4di8 subroutine armci_get_5di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5di8 subroutine armci_get_6di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6di8 subroutine armci_get_7di8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface integer(kind=i8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7di8 subroutine armci_get_1dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1dr4 subroutine armci_get_2dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2dr4 subroutine armci_get_3dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3dr4 subroutine armci_get_4dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4dr4 subroutine armci_get_5dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5dr4 subroutine armci_get_6dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6dr4 subroutine armci_get_7dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7dr4 subroutine armci_get_1dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1dr8 subroutine armci_get_2dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2dr8 subroutine armci_get_3dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3dr8 subroutine armci_get_4dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4dr8 subroutine armci_get_5dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5dr8 subroutine armci_get_6dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6dr8 subroutine armci_get_7dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface real(kind=r8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7dr8 subroutine armci_get_1dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1dc4 subroutine armci_get_2dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2dc4 subroutine armci_get_3dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3dc4 subroutine armci_get_4dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4dc4 subroutine armci_get_5dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5dc4 subroutine armci_get_6dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6dc4 subroutine armci_get_7dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7dc4 subroutine armci_get_1dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_1dc8 subroutine armci_get_2dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_2dc8 subroutine armci_get_3dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_3dc8 subroutine armci_get_4dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_4dc8 subroutine armci_get_5dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_5dc8 subroutine armci_get_6dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_6dc8 subroutine armci_get_7dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind implicit none interface subroutine armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine armci_get_farrays end interface complex(kind=c8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call armci_get_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine armci_get_7dc8 end module armci_mov_f90 ga-5-4/armci/f90/testa.F900000644000175000017500000000425512662210417013130 0ustar mbambaprogram main use definekind use armci_types use armci_mem_f90 use armci_mov_f90 use armci_nbmov use testa_init type(armci_slice) :: src_slice, dst_slice ! integer(kind=i4), pointer :: a1(:) integer :: remote_proc integer :: lb(7), ub(7), rc, i, j,me, nproc integer :: myunit integer :: m integer :: extent(7) integer :: asize(7) type(armci_slice) :: src_slice, dst_slice real(kind=8), dimension(:,:), pointer :: buff real(kind=8) :: time1,time2,time_array(28) integer chunk(28) data chunk /1,9,16,36,81,144,256,400,576,900,1600,2304,2704,4096,& 6084,8281,10816,16384,20164,29241,44100,65536,90000,124609,& 160000,193600,226576, 262144/ integer tbuffid,oldtbuffid #ifdef MPI integer :: ierr include 'mpif.h' call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world,me,ierr) call mpi_comm_size(mpi_comm_world,nproc,ierr) #else call pbeginf() nproc = nnodes() me = nodeid() #endif remote_proc = nproc -1 -me call armci_arr_init() lb(:) = 1 ub(:) = 550*550 ub(2) = 2 call armci_malloc_fa(buff,lb,ub,ierr) tbuffid = 2 write (6,*) 'start' ! 1d if( me .eq. 0) then do m=1,28 src_slice%lo(1) = 1 src_slice%lo(2) = tbuffid src_slice%hi(1) = chunk(m) src_slice%hi(2) = tbuffid src_slice%stride(:)=2 dst_slice%lo(1) = 1 dst_slice%lo(2) = tbuffid dst_slice%hi(1) = chunk(m) dst_slice%hi(2) = tbuffid dst_slice%stride(:)=2 call armci_put_fa(buff,src_slice,buff,dst_slice,1,ierr) time1 = mpi_wtime() i = 50 ! if (m .gt. 13) i = 4 do k=1,i if(tbuffid .eq. 1) then tbuffid=2 else tbuffid=1 endif src_slice%lo(2) = tbuffid src_slice%hi(2) = tbuffid dst_slice%lo(2) = tbuffid dst_slice%hi(2) = tbuffid call armci_put_fa(buff,src_slice,buff,dst_slice,1,ierr) enddo time2 = mpi_wtime() time_array(m) = (time2 - time1)/i write (6,*) chunk(m),' ',time_array(m) enddo endif call mpi_barrier(mpi_comm_world,ierr) call armci_arr_finalize() #ifdef MPI call mpi_finalize(ierr) #else call pend() #endif end program main ga-5-4/armci/f90/arraydesc.h0000644000175000017500000000113612662210417013651 0ustar mbamba#ifndef __ARMCIARR__ #define __ARMCIARR__ #define MAXDIM 7 typedef struct { int rank; int elemsize; int extent[MAXDIM]; int lo[MAXDIM]; int hi[MAXDIM]; int stride[MAXDIM]; void **aptr; void *amem; }armci_arr_dsc_t; #define HEADER_SIZE 256 #define GET_PTR_ARR_FROM_ARRAY(ptr) (((char*)ptr)-HEADER_SIZE -armci_nproc*sizeof(void*)) #define GET_ARR_DSC_FROM_ARRAY(ptr) (armci_arr_dsc_t*)(((char*)ptr)-HEADER_SIZE) typedef int index_size_t; extern void _array_create(void **pptr, int elemsize, int rank, index_size_t *lb, index_size_t *ub); extern void _array_free(void *ptr); #endif ga-5-4/armci/f90/armci_nbmov.f900000644000175000017500000021776412662210417014357 0ustar mbambamodule ARMCI_NbMov use armci_types interface ARMCI_NbPut_fa module procedure ARMCI_NbPut_1di4 module procedure ARMCI_NbPut_2di4 module procedure ARMCI_NbPut_3di4 module procedure ARMCI_NbPut_4di4 module procedure ARMCI_NbPut_5di4 module procedure ARMCI_NbPut_6di4 module procedure ARMCI_NbPut_7di4 module procedure ARMCI_NbPut_1di8 module procedure ARMCI_NbPut_2di8 module procedure ARMCI_NbPut_3di8 module procedure ARMCI_NbPut_4di8 module procedure ARMCI_NbPut_5di8 module procedure ARMCI_NbPut_6di8 module procedure ARMCI_NbPut_7di8 module procedure ARMCI_NbPut_1dr4 module procedure ARMCI_NbPut_2dr4 module procedure ARMCI_NbPut_3dr4 module procedure ARMCI_NbPut_4dr4 module procedure ARMCI_NbPut_5dr4 module procedure ARMCI_NbPut_6dr4 module procedure ARMCI_NbPut_7dr4 module procedure ARMCI_NbPut_1dr8 module procedure ARMCI_NbPut_2dr8 module procedure ARMCI_NbPut_3dr8 module procedure ARMCI_NbPut_4dr8 module procedure ARMCI_NbPut_5dr8 module procedure ARMCI_NbPut_6dr8 module procedure ARMCI_NbPut_7dr8 module procedure ARMCI_NbPut_1dc4 module procedure ARMCI_NbPut_2dc4 module procedure ARMCI_NbPut_3dc4 module procedure ARMCI_NbPut_4dc4 module procedure ARMCI_NbPut_5dc4 module procedure ARMCI_NbPut_6dc4 module procedure ARMCI_NbPut_7dc4 module procedure ARMCI_NbPut_1dc8 module procedure ARMCI_NbPut_2dc8 module procedure ARMCI_NbPut_3dc8 module procedure ARMCI_NbPut_4dc8 module procedure ARMCI_NbPut_5dc8 module procedure ARMCI_NbPut_6dc8 module procedure ARMCI_NbPut_7dc8 end interface interface ARMCI_NbGet_fa module procedure ARMCI_NbGet_1di4 module procedure ARMCI_NbGet_2di4 module procedure ARMCI_NbGet_3di4 module procedure ARMCI_NbGet_4di4 module procedure ARMCI_NbGet_5di4 module procedure ARMCI_NbGet_6di4 module procedure ARMCI_NbGet_7di4 module procedure ARMCI_NbGet_1di8 module procedure ARMCI_NbGet_2di8 module procedure ARMCI_NbGet_3di8 module procedure ARMCI_NbGet_4di8 module procedure ARMCI_NbGet_5di8 module procedure ARMCI_NbGet_6di8 module procedure ARMCI_NbGet_7di8 module procedure ARMCI_NbGet_1dr4 module procedure ARMCI_NbGet_2dr4 module procedure ARMCI_NbGet_3dr4 module procedure ARMCI_NbGet_4dr4 module procedure ARMCI_NbGet_5dr4 module procedure ARMCI_NbGet_6dr4 module procedure ARMCI_NbGet_7dr4 module procedure ARMCI_NbGet_1dr8 module procedure ARMCI_NbGet_2dr8 module procedure ARMCI_NbGet_3dr8 module procedure ARMCI_NbGet_4dr8 module procedure ARMCI_NbGet_5dr8 module procedure ARMCI_NbGet_6dr8 module procedure ARMCI_NbGet_7dr8 module procedure ARMCI_NbGet_1dc4 module procedure ARMCI_NbGet_2dc4 module procedure ARMCI_NbGet_3dc4 module procedure ARMCI_NbGet_4dc4 module procedure ARMCI_NbGet_5dc4 module procedure ARMCI_NbGet_6dc4 module procedure ARMCI_NbGet_7dc4 module procedure ARMCI_NbGet_1dc8 module procedure ARMCI_NbGet_2dc8 module procedure ARMCI_NbGet_3dc8 module procedure ARMCI_NbGet_4dc8 module procedure ARMCI_NbGet_5dc8 module procedure ARMCI_NbGet_6dc8 module procedure ARMCI_NbGet_7dc8 end interface contains subroutine ARMCI_NbPut_1di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use ARMCI_types integer(kind=I4), dimension(:), pointer :: src, dst type(ARMCI_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1di4 subroutine ARMCI_NbPut_2di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2di4 subroutine ARMCI_NbPut_3di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3di4 subroutine ARMCI_NbPut_4di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4di4 subroutine ARMCI_NbPut_5di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5di4 subroutine ARMCI_NbPut_6di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6di4 subroutine ARMCI_NbPut_7di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7di4 subroutine ARMCI_NbPut_1di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1di8 subroutine ARMCI_NbPut_2di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2di8 subroutine ARMCI_NbPut_3di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3di8 subroutine ARMCI_NbPut_4di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4di8 subroutine ARMCI_NbPut_5di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5di8 subroutine ARMCI_NbPut_6di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6di8 subroutine ARMCI_NbPut_7di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface integer(kind=I8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7di8 subroutine ARMCI_NbPut_1dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1dr4 subroutine ARMCI_NbPut_2dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2dr4 subroutine ARMCI_NbPut_3dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3dr4 subroutine ARMCI_NbPut_4dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4dr4 subroutine ARMCI_NbPut_5dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5dr4 subroutine ARMCI_NbPut_6dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6dr4 subroutine ARMCI_NbPut_7dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7dr4 subroutine ARMCI_NbPut_1dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1dr8 subroutine ARMCI_NbPut_2dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2dr8 subroutine ARMCI_NbPut_3dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3dr8 subroutine ARMCI_NbPut_4dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4dr8 subroutine ARMCI_NbPut_5dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5dr8 subroutine ARMCI_NbPut_6dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6dr8 subroutine ARMCI_NbPut_7dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface real(kind=R8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7dr8 subroutine ARMCI_NbPut_1dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1dc4 subroutine ARMCI_NbPut_2dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2dc4 subroutine ARMCI_NbPut_3dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3dc4 subroutine ARMCI_NbPut_4dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4dc4 subroutine ARMCI_NbPut_5dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5dc4 subroutine ARMCI_NbPut_6dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6dc4 subroutine ARMCI_NbPut_7dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7dc4 subroutine ARMCI_NbPut_1dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_1dc8 subroutine ARMCI_NbPut_2dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_2dc8 subroutine ARMCI_NbPut_3dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_3dc8 subroutine ARMCI_NbPut_4dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_4dc8 subroutine ARMCI_NbPut_5dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_5dc8 subroutine ARMCI_NbPut_6dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_6dc8 subroutine ARMCI_NbPut_7dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbPut_farrays end interface complex(kind=C8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbPut_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbPut_7dc8 !Get subroutine ARMCI_NbGet_1di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1di4 subroutine ARMCI_NbGet_2di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2di4 subroutine ARMCI_NbGet_3di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3di4 subroutine ARMCI_NbGet_4di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4di4 subroutine ARMCI_NbGet_5di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5di4 subroutine ARMCI_NbGet_6di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6di4 subroutine ARMCI_NbGet_7di4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7di4 subroutine ARMCI_NbGet_1di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1di8 subroutine ARMCI_NbGet_2di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2di8 subroutine ARMCI_NbGet_3di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3di8 subroutine ARMCI_NbGet_4di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4di8 subroutine ARMCI_NbGet_5di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5di8 subroutine ARMCI_NbGet_6di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6di8 subroutine ARMCI_NbGet_7di8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types integer(kind=I8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface integer(kind=I8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7di8 subroutine ARMCI_NbGet_1dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1dr4 subroutine ARMCI_NbGet_2dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2dr4 subroutine ARMCI_NbGet_3dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3dr4 subroutine ARMCI_NbGet_4dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4dr4 subroutine ARMCI_NbGet_5dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5dr4 subroutine ARMCI_NbGet_6dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6dr4 subroutine ARMCI_NbGet_7dr4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7dr4 subroutine ARMCI_NbGet_1dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1dr8 subroutine ARMCI_NbGet_2dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2dr8 subroutine ARMCI_NbGet_3dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3dr8 subroutine ARMCI_NbGet_4dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4dr8 subroutine ARMCI_NbGet_5dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5dr8 subroutine ARMCI_NbGet_6dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6dr8 subroutine ARMCI_NbGet_7dr8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types real(kind=R8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface real(kind=R8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7dr8 subroutine ARMCI_NbGet_1dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1dc4 subroutine ARMCI_NbGet_2dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2dc4 subroutine ARMCI_NbGet_3dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3dc4 subroutine ARMCI_NbGet_4dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4dc4 subroutine ARMCI_NbGet_5dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5dc4 subroutine ARMCI_NbGet_6dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6dc4 subroutine ARMCI_NbGet_7dc4(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C4), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7dc4 subroutine ARMCI_NbGet_1dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 1 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_1dc8 subroutine ARMCI_NbGet_2dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 2 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_2dc8 subroutine ARMCI_NbGet_3dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 3 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_3dc8 subroutine ARMCI_NbGet_4dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 4 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_4dc8 subroutine ARMCI_NbGet_5dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 5 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_5dc8 subroutine ARMCI_NbGet_6dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 6 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_6dc8 subroutine ARMCI_NbGet_7dc8(src, src_slc, dst, dst_slc, proc, rc) use definekind ! implicit none interface subroutine ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) use definekind use armci_types complex(kind=C8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc, rank integer, intent(out) :: rc end subroutine ARMCI_NbGet_farrays end interface complex(kind=C8), dimension(:,:,:,:,:,:,:), pointer :: src, dst type(armci_slice), intent(in) :: src_slc, dst_slc integer, intent(in) :: proc integer, intent(out) :: rc integer :: rank rank = 7 call ARMCI_NbGet_farrays(src, src_slc, dst, dst_slc, proc, rank, rc) end subroutine ARMCI_NbGet_7dc8 end module ARMCI_NbMov ga-5-4/armci/f90/armci_types.f900000644000175000017500000000023112662210417014355 0ustar mbambamodule armci_types type armci_slice integer :: lo(7) integer :: hi(7) integer :: stride(7) end type armci_slice end module armci_types ga-5-4/armci/f90/definekind.f900000644000175000017500000000055112662210417014143 0ustar mbambamodule definekind integer, parameter :: I4 = SELECTED_INT_KIND(9) integer, parameter :: I8 = SELECTED_INT_KIND(16) integer, parameter :: R4 = SELECTED_REAL_KIND(5) integer, parameter :: R8 = SELECTED_REAL_KIND(12) integer, parameter :: C4 = SELECTED_REAL_KIND(5) integer, parameter :: C8 = SELECTED_REAL_KIND(12) end module definekind ga-5-4/armci/f90/checkput.f900000644000175000017500000005740712662210417013665 0ustar mbambamodule checkput use definekind use armci_types interface check_b module procedure check_b_i4 module procedure check_b_i8 module procedure check_b_r4 module procedure check_b_r8 module procedure check_b_c4 module procedure check_b_c8 end interface contains subroutine check_b_i4(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank integer(kind=i4), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer j1s,j2s,j3s,j4s,j5s,j6s,j7s integer j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer jbase ! me = nodeid() ! myunit = 10+me ! write(myunit,*)me,'check_b_i4 rank = ',rank ! write(myunit,*)me,'check_b_i4 dst_slice = ',dst_slice ! write(myunit,*)me,'check_b_i4 src_slice = ',src_slice ! write(myunit,*)me,'check_b_i4 remote_proc = ',remote_proc ! write(myunit,*)me,'check_b_i4 dlb = ',dlb ! write(myunit,*)me,'check_b_i4 dub = ',dub ! write(myunit,*)me,'check_b_i4 slb = ',slb ! write(myunit,*)me,'check_b_i4 sub = ',sub ! write(myunit,*)me,'check_b_i4 joff = ',joff dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo ! write(myunit,*)me,'check_b_i4 j7d,j7s = ',j7d,j7s pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. jbase + j1s) then ! write(myunit,*)'b(',j1d,') = ',b(j1d),' jbase + j1s = ',jbase+j1s pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_i4 subroutine check_b_i8(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank integer(kind=i8), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer(kind=i8) :: j1s,j2s,j3s,j4s,j5s,j6s,j7s integer(kind=i8) :: j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer(kind=i8) :: jbase dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. jbase + j1s) then print *,'checkb_i8 fail: j1d,b(j1d),jbase,j1s,jbase+j1s = ',& & j1d,b(j1d),jbase,j1s,jbase+j1s stop pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_i8 subroutine check_b_r4(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank real(kind=r4), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer j1s,j2s,j3s,j4s,j5s,j6s,j7s integer j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer jbase dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. float(jbase + j1s)) then pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_r4 subroutine check_b_r8(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank real(kind=r8), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer j1s,j2s,j3s,j4s,j5s,j6s,j7s integer j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer jbase dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. dble(jbase + j1s)) then pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_r8 subroutine check_b_c4(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank complex(kind=c4), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer j1s,j2s,j3s,j4s,j5s,j6s,j7s integer j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer jbase dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. cmplx(jbase+j1s,jbase+j1s,c4)) then pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_c4 subroutine check_b_c8(rank,b,dst_slice,src_slice,remote_proc,dlb,dub, & & slb,sub,joff,pass) implicit none integer rank complex(kind=c8), pointer :: b(:) type(armci_slice) :: dst_slice, src_slice integer remote_proc integer dlb(7),dub(7),slb(7),sub(7) integer joff integer pass integer me integer index integer dextent(7) integer sextent(7) integer dst_stride(7) integer src_stride(7) integer src_off(7),dst_off(7) integer src_lo(7),src_hi(7) integer dst_lo(7),dst_hi(7) integer i,m,i1,i2,i3,k4,i5,i6,i7 integer j1s,j2s,j3s,j4s,j5s,j6s,j7s integer j1d,j2d,j3d,j4d,j5d,j6d,j7d integer factor integer myunit integer jbase dst_lo(:) = 1 dst_hi(:) = 1 dst_stride(:) = 1 do m = 1,rank dst_lo(m) = dst_slice%lo(m) enddo do m = 1,rank dst_hi(m) = dst_slice%hi(m) enddo do m = 1,rank dst_stride(m) = dst_slice%stride(m) enddo src_lo(:) = 1 src_hi(:) = 1 src_stride(:) = 1 do m = 1,rank src_lo(m) = src_slice%lo(m) enddo do m = 1,rank src_hi(m) = src_slice%hi(m) enddo do m = 1,rank src_stride(m) = src_slice%stride(m) enddo do m = 1,rank sextent(m) = sub(m) - slb(m) + 1 enddo do m = 1,rank dextent(m) = dub(m) - dlb(m) + 1 enddo do m = rank+1,7 dextent(m) = 1 enddo do m = rank+1,7 sextent(m) = 1 enddo src_off(1) = 1 do m = 2,rank src_off(m) = src_off(m-1)*sextent(m-1) enddo dst_off(1) = 1 do m = 2,rank dst_off(m) = dst_off(m-1)*dextent(m-1) enddo do m = 1,rank src_off(m) = src_off(m) * src_slice%stride(m) enddo do m = 1,rank dst_off(m) = dst_off(m) * dst_slice%stride(m) enddo do m= rank+1,7 dst_off(m) = 0 enddo do m= rank+1,7 src_off(m) = 0 enddo j7d = 1 factor = 1 do m = 1,rank j7d = j7d + (dst_lo(m) - dlb(m))*factor factor = factor * dextent(1) enddo j7s = 1 factor = 1 do m = 1,rank j7s = j7s + (src_lo(m) - slb(m))*factor factor = factor * sextent(1) enddo pass = 1 index = 0 jbase = joff -1 do i7 = dst_lo(7),dst_hi(7),dst_stride(7) j6d = j7d j6s = j7s do i6 = dst_lo(6),dst_hi(6),dst_stride(6) j5d = j6d j5s = j6s do i5 = dst_lo(5),dst_hi(5),dst_stride(5) j4d = j5d j4s = j5s do k4 = dst_lo(4),dst_hi(4),dst_stride(4) j3d = j4d j3s = j4s do i3 = dst_lo(3),dst_hi(3),dst_stride(3) j2d = j3d j2s = j3s do i2 = dst_lo(2),dst_hi(2),dst_stride(2) j1d = j2d j1s = j2s do i1 = dst_lo(1),dst_hi(1),dst_stride(1) if (b(j1d) .ne. cmplx(jbase+j1s,jbase+j1s,c8)) then pass = 0 index = j1d endif j1d = j1d + dst_off(1) j1s = j1s + src_off(1) enddo j2d = j2d + dst_off(2) j2s = j2s + src_off(2) enddo j3d = j3d + dst_off(3) j3s = j3s + src_off(3) enddo j4d = j4d + dst_off(4) j4s = j4s + src_off(4) enddo j5d = j5d + dst_off(5) j5s = j5s + src_off(5) enddo j6d = j6d + dst_off(6) j6s = j6s + src_off(6) enddo j7d = j7d + dst_off(7) j7s = j7s + src_off(7) enddo return end subroutine check_b_c8 end module checkput ga-5-4/armci/f90/kinds.f900000644000175000017500000000102712662210417013152 0ustar mbamba program kinds INTEGER*4 I4 INTEGER*8 I8 I4 = 1 I8 = 1234567890123_8 write (*,'("The KIND for single precision is ",I2)') KIND(0.0) write (*,'("The KIND for double precision is ",I2)') KIND(0.0D0) write (*,'("The KIND for integer *4 is ",I2)') KIND(I4) write (*,'("The KIND for integer *8 is ",I2)') KIND(I8) write (*,'("The KIND for single complex is ",I2)') KIND((0.0,0.0)) write (*,'("The KIND for double precision is ",I2)') KIND((0.0D0,0.0D0)) stop end ga-5-4/armci/f90/testnbfa_type.f900000644000175000017500000027357212662210417014731 0ustar mbambasubroutine testanb_i4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc integer(kind=I4), pointer :: a7_i4(:,:,:,:,:,:,:), b7_i4(:,:,:,:,:,:,:) integer(kind=I4), pointer :: a6_i4(:,:,:,:,:,:), b6_i4(:,:,:,:,:,:) integer(kind=I4), pointer :: a5_i4(:,:,:,:,:), b5_i4(:,:,:,:,:) integer(kind=I4), pointer :: a4_i4(:,:,:,:), b4_i4(:,:,:,:) integer(kind=I4), pointer :: a3_i4(:,:,:), b3_i4(:,:,:) integer(kind=I4), pointer :: a2_i4(:,:), b2_i4(:,:) integer(kind=I4), pointer :: a1_i4(:), b1_i4(:) integer(kind=I4), pointer :: v_i4(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst * afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! Test I4 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v_i4,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1_i4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1_i4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1_i4 failed rc = ',rc stop endif ! Let all processors get allocated. call ARMCI_Sync() ! I4 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7_i4,b7_i4,lb,ub,lb,ub,afirst,bfirst) a6_i4(:,:,:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i4(:,:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i4(:,:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i4(:,:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i4(:,:) = a7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i4(:) = a7_i4(lb(1):ub(1),1,1,1,1,1,1) b6_i4(:,:,:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i4(:,:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i4(:,:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i4(:,:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i4(:,:) = b7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i4(:) = b7_i4(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1_i4, src_slice, b1_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2_i4, src_slice, b2_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2_i4,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2_i4,dst_slice,src_slice,remote_proc, & v_i4(1:asize(2)) = reshape(b2_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3_i4, src_slice, b3_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v_i4(1:asize(3)) = reshape(b3_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4_i4, src_slice, b4_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v_i4(1:asize(4)) = reshape(b4_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5_i4, src_slice, b5_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v_i4(1:asize(5)) = reshape(b5_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6_i4, src_slice, b6_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v_i4(1:asize(6)) = reshape(b6_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D I4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7_i4, src_slice, b7_i4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D I4, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v_i4(1:asize(7)) = reshape(b7_i4,vshape) call check_b(rank,v_i4,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D I4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for I4, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7_i4,b7_i4,lb,ub,lb,ub,afirst,bfirst) a6_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i4 = a7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i4 = a7_i4(lb(1):ub(1),1,1,1,1,1,1) b6_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i4 = b7_i4(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i4 = b7_i4(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1_i4, dst_slice, a1_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2_i4, dst_slice, a2_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(2)) = reshape(a2_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3_i4, dst_slice, a3_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(3)) = reshape(a3_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4_i4, dst_slice, a4_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(4)) = reshape(a4_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5_i4, dst_slice, a5_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(5)) = reshape(a5_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6_i4, dst_slice, a6_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(6)) = reshape(a6_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D I4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7_i4, dst_slice, a7_i4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i4(1:asize(7)) = reshape(a7_i4,vshape) call check_b(rank,v_i4,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D I4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for I4, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v_i4, rc) call ARMCI_Free_fa(a1_i4, rc) call ARMCI_Free_fa(b1_i4, rc) call ARMCI_Free_fa(a2_i4, rc) call ARMCI_Free_fa(b2_i4, rc) call ARMCI_Free_fa(a3_i4, rc) call ARMCI_Free_fa(b3_i4, rc) call ARMCI_Free_fa(a4_i4, rc) call ARMCI_Free_fa(b4_i4, rc) call ARMCI_Free_fa(a5_i4, rc) call ARMCI_Free_fa(b5_i4, rc) call ARMCI_Free_fa(a6_i4, rc) call ARMCI_Free_fa(b6_i4, rc) call ARMCI_Free_fa(a7_i4, rc) call ARMCI_Free_fa(b7_i4, rc) call ARMCI_Sync() return endsubroutine subroutine testanb_i8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc integer(kind=I8), pointer :: a7_i8(:,:,:,:,:,:,:), b7_i8(:,:,:,:,:,:,:) integer(kind=I8), pointer :: a6_i8(:,:,:,:,:,:), b6_i8(:,:,:,:,:,:) integer(kind=I8), pointer :: a5_i8(:,:,:,:,:), b5_i8(:,:,:,:,:) integer(kind=I8), pointer :: a4_i8(:,:,:,:), b4_i8(:,:,:,:) integer(kind=I8), pointer :: a3_i8(:,:,:), b3_i8(:,:,:) integer(kind=I8), pointer :: a2_i8(:,:), b2_i8(:,:) integer(kind=I8), pointer :: a1_i8(:), b1_i8(:) integer(kind=I8), pointer :: v_i8(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo afirst = (1+me) bfirst = afirst * afirst ! Test I8 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v_i8,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1_i8 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1_i8, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1_i8 failed rc = ',rc stop endif ! Let all processors get alloccated. call ARMCI_Sync() ! I8 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7_i8,b7_i8,lb,ub,lb,ub,afirst,bfirst) a6_i8(:,:,:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i8(:,:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i8(:,:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i8(:,:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i8(:,:) = a7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i8(:) = a7_i8(lb(1):ub(1),1,1,1,1,1,1) b6_i8(:,:,:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i8(:,:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i8(:,:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i8(:,:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i8(:,:) = b7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i8(:) = b7_i8(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1_i8, src_slice, b1_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2_i8, src_slice, b2_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2_i8,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2_i8,dst_slice,src_slice,remote_proc, & v_i8(1:asize(2)) = reshape(b2_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3_i8, src_slice, b3_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v_i8(1:asize(3)) = reshape(b3_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4_i8, src_slice, b4_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v_i8(1:asize(4)) = reshape(b4_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5_i8, src_slice, b5_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v_i8(1:asize(5)) = reshape(b5_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6_i8, src_slice, b6_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v_i8(1:asize(6)) = reshape(b6_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D I8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7_i8, src_slice, b7_i8, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D I8, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v_i8(1:asize(7)) = reshape(b7_i8,vshape) call check_b(rank,v_i8,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D I8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for I8, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7_i8,b7_i8,lb,ub,lb,ub,afirst,bfirst) a6_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2_i8 = a7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1_i8 = a7_i8(lb(1):ub(1),1,1,1,1,1,1) b6_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2_i8 = b7_i8(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1_i8 = b7_i8(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1_i8, dst_slice, a1_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2_i8, dst_slice, a2_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(2)) = reshape(a2_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3_i8, dst_slice, a3_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(3)) = reshape(a3_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4_i8, dst_slice, a4_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(4)) = reshape(a4_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5_i8, dst_slice, a5_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(5)) = reshape(a5_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6_i8, dst_slice, a6_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(6)) = reshape(a6_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D I8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7_i8, dst_slice, a7_i8, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v_i8(1:asize(7)) = reshape(a7_i8,vshape) call check_b(rank,v_i8,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D I8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for I8, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v_i8, rc) call ARMCI_Free_fa(a1_i8, rc) call ARMCI_Free_fa(b1_i8, rc) call ARMCI_Free_fa(a2_i8, rc) call ARMCI_Free_fa(b2_i8, rc) call ARMCI_Free_fa(a3_i8, rc) call ARMCI_Free_fa(b3_i8, rc) call ARMCI_Free_fa(a4_i8, rc) call ARMCI_Free_fa(b4_i8, rc) call ARMCI_Free_fa(a5_i8, rc) call ARMCI_Free_fa(b5_i8, rc) call ARMCI_Free_fa(a6_i8, rc) call ARMCI_Free_fa(b6_i8, rc) call ARMCI_Free_fa(a7_i8, rc) call ARMCI_Free_fa(b7_i8, rc) call ARMCI_Sync() return endsubroutine subroutine testanb_r4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc real(kind=R4), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) real(kind=R4), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) real(kind=R4), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) real(kind=R4), pointer :: a4(:,:,:,:), b4(:,:,:,:) real(kind=R4), pointer :: a3(:,:,:), b3(:,:,:) real(kind=R4), pointer :: a2(:,:), b2(:,:) real(kind=R4), pointer :: a1(:), b1(:) real(kind=R4), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! Test R4 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1 failed rc = ',rc stop endif ! Let all processors get alloccated. call ARMCI_Sync() ! R4 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D R4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D R4, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D R4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for R4, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D R4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D R4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for R4, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v, rc) call ARMCI_Free_fa(a1, rc) call ARMCI_Free_fa(b1, rc) call ARMCI_Free_fa(a2, rc) call ARMCI_Free_fa(b2, rc) call ARMCI_Free_fa(a3, rc) call ARMCI_Free_fa(b3, rc) call ARMCI_Free_fa(a4, rc) call ARMCI_Free_fa(b4, rc) call ARMCI_Free_fa(a5, rc) call ARMCI_Free_fa(b5, rc) call ARMCI_Free_fa(a6, rc) call ARMCI_Free_fa(b6, rc) call ARMCI_Free_fa(a7, rc) call ARMCI_Free_fa(b7, rc) call ARMCI_Sync() return endsubroutine subroutine testanb_r8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc real(kind=R8), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) real(kind=R8), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) real(kind=R8), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) real(kind=R8), pointer :: a4(:,:,:,:), b4(:,:,:,:) real(kind=R8), pointer :: a3(:,:,:), b3(:,:,:) real(kind=R8), pointer :: a2(:,:), b2(:,:) real(kind=R8), pointer :: a1(:), b1(:) real(kind=R8), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! Test R8 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1 failed rc = ',rc stop endif ! Let all processors get alloccated. call ARMCI_Sync() ! R8 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D R8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D R8, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D R8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for R8, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D R8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D R8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for R8, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v, rc) call ARMCI_Free_fa(a1, rc) call ARMCI_Free_fa(b1, rc) call ARMCI_Free_fa(a2, rc) call ARMCI_Free_fa(b2, rc) call ARMCI_Free_fa(a3, rc) call ARMCI_Free_fa(b3, rc) call ARMCI_Free_fa(a4, rc) call ARMCI_Free_fa(b4, rc) call ARMCI_Free_fa(a5, rc) call ARMCI_Free_fa(b5, rc) call ARMCI_Free_fa(a6, rc) call ARMCI_Free_fa(b6, rc) call ARMCI_Free_fa(a7, rc) call ARMCI_Free_fa(b7, rc) call ARMCI_Sync() return endsubroutine subroutine testanb_c4(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc complex(kind=C4), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) complex(kind=C4), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) complex(kind=C4), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) complex(kind=C4), pointer :: a4(:,:,:,:), b4(:,:,:,:) complex(kind=C4), pointer :: a3(:,:,:), b3(:,:,:) complex(kind=C4), pointer :: a2(:,:), b2(:,:) complex(kind=C4), pointer :: a1(:), b1(:) complex(kind=C4), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! Test C4 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1 failed rc = ',rc stop endif ! Let all processors get alloccated. call ARMCI_Sync() ! C4 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D C4, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D C4, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D C4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for C4, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D C4, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D C4, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for C4, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v, rc) call ARMCI_Free_fa(a1, rc) call ARMCI_Free_fa(b1, rc) call ARMCI_Free_fa(a2, rc) call ARMCI_Free_fa(b2, rc) call ARMCI_Free_fa(a3, rc) call ARMCI_Free_fa(b3, rc) call ARMCI_Free_fa(a4, rc) call ARMCI_Free_fa(b4, rc) call ARMCI_Free_fa(a5, rc) call ARMCI_Free_fa(b5, rc) call ARMCI_Free_fa(a6, rc) call ARMCI_Free_fa(b6, rc) call ARMCI_Free_fa(a7, rc) call ARMCI_Free_fa(b7, rc) call ARMCI_Sync() return endsubroutine subroutine testanb_c8(nproc,me,remote_proc) use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput implicit none type(ARMCI_slice) :: src_slice, dst_slice integer :: nproc,me,remote_proc complex(kind=C8), pointer :: a7(:,:,:,:,:,:,:), b7(:,:,:,:,:,:,:) complex(kind=C8), pointer :: a6(:,:,:,:,:,:), b6(:,:,:,:,:,:) complex(kind=C8), pointer :: a5(:,:,:,:,:), b5(:,:,:,:,:) complex(kind=C8), pointer :: a4(:,:,:,:), b4(:,:,:,:) complex(kind=C8), pointer :: a3(:,:,:), b3(:,:,:) complex(kind=C8), pointer :: a2(:,:), b2(:,:) complex(kind=C8), pointer :: a1(:), b1(:) complex(kind=C8), pointer :: v(:) integer :: lb(7), ub(7), rc, i, j integer :: pass integer :: myunit integer :: m integer :: rank integer :: joff integer :: vshape(1) integer :: extent(7) integer :: asize(7) integer :: score(7) integer :: vlb(1),vub(1) integer :: afirst,bfirst afirst = 1+me bfirst = afirst*afirst lb(:) = 1 ub(:) = 7 ub(7) = 3 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo ! Test C8 flavor. vlb(1) = 1 vub(1) = asize(7) call ARMCI_Malloc_fa(v,vlb,vub,rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for v failed rc = ',rc stop endif call ARMCI_Malloc_fa(a7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b7, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b7 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b6, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b6 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b5, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b5 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b4, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b4 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b3, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b3 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b2, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b2 failed rc = ',rc stop endif call ARMCI_Malloc_fa(a1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for a1 failed rc = ',rc stop endif call ARMCI_Malloc_fa(b1, lb, ub, rc) if (rc .ne. 0) then print *,' ARMCI_Malloc_fa for b1 failed rc = ',rc stop endif ! Let all processors get alloccated. call ARMCI_Sync() ! C8 allocations done, now loop over slices. ! We will test three flavors of slices, ! all unit stride, unit stride in the first dimension only, ! all non-unit stride (2). score(:) = 0 joff = remote_proc + 1 ! ! Test Put. ! do m = 1,3 ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6(:,:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5(:,:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4(:,:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3(:,:,:) = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2(:,:) = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1(:) = a7(lb(1):ub(1),1,1,1,1,1,1) b6(:,:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5(:,:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4(:,:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3(:,:,:) = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2(:,:) = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1(:) = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the put. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%lo(7) = 1 src_slice%hi(7) = 2 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%lo(7) = 2 dst_slice%hi(7) = 3 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! Rank 1. rank = 1 call ARMCI_NbPut_fa(a1, src_slice, b1, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 1D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b1 is the piece of the sent a1. ! call check_b(rank,b1,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 1D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 2. rank = 2 vshape(1) = asize(2) call ARMCI_NbPut_fa(a2, src_slice, b2, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 2D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b2 is the piece of the sent a2. ! ! call check_b(rank,reshape(b2,vshape),dst_slice,src_slice,remote_proc, & ! call check_b(rank,b2,dst_slice,src_slice,remote_proc, & v(1:asize(2)) = reshape(b2,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 2D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 3. rank = 3 vshape(1) = asize(3) call ARMCI_NbPut_fa(a3, src_slice, b3, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 3D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b3 is the piece of the sent a3. ! v(1:asize(3)) = reshape(b3,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 3D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 4. rank = 4 vshape(1) = asize(4) call ARMCI_NbPut_fa(a4, src_slice, b4, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 4D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b4 is the piece of the sent a4. ! v(1:asize(4)) = reshape(b4,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 5. rank = 5 vshape(1) = asize(5) call ARMCI_NbPut_fa(a5, src_slice, b5, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 5D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b5 is the piece of the sent a5. ! v(1:asize(5)) = reshape(b5,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 4D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 6. rank = 6 vshape(1) = asize(6) call ARMCI_NbPut_fa(a6, src_slice, b6, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 6D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b6 is the piece of the sent a6 ! v(1:asize(6)) = reshape(b6,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 6D C8, m = ',m,' failed' endif call ARMCI_Sync() ! Rank 7. rank = 7 vshape(1) = asize(7) call ARMCI_NbPut_fa(a7, src_slice, b7, dst_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() if (rc .ne. 0) then print *,me,': ARMCI_NbPut_fa for 7D C8, m = ',m,' failed, rc = ',rc endif ! Check that received b7 is the piece of the sent a7 ! v(1:asize(7)) = reshape(b7,vshape) call check_b(rank,v,dst_slice,src_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbPut_fa verify for 7D C8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbPut_fa for C8, ',m,'D passed' endif enddo endif ! ! Test Get. ! score(:) = 0 joff = (remote_proc + 1)*(remote_proc+1) do m = 1,3 ! ! Initialize arrays. ! call init_7d(a7,b7,lb,ub,lb,ub,afirst,bfirst) a6 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) a5 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) a4 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) a3 = a7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) a2 = a7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) a1 = a7(lb(1):ub(1),1,1,1,1,1,1) b6 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),lb(6):ub(6),1) b5 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),lb(5):ub(5),1,1) b4 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),lb(4):ub(4),1,1,1) b3 = b7(lb(1):ub(1),lb(2):ub(2),lb(3):ub(3),1,1,1,1) b2 = b7(lb(1):ub(1),lb(2):ub(2),1,1,1,1,1) b1 = b7(lb(1):ub(1),1,1,1,1,1,1) ! Let all processors get initialized. call ARMCI_Sync() ! Set up slice info for the get. ! ! For m = 1, the slice has all unit strides. ! For m = 2, the first dimension has a unit stride and all other ! dimensions have a stride of 2. ! For m = 3, all dimensions have a stride of 2. ! src_slice%lo(:) = 2 src_slice%hi(:) = 6 src_slice%lo(7) = 1 src_slice%hi(7) = 2 src_slice%stride(:) = (m+2)/2 src_slice%stride(1) = (m+1)/2 dst_slice%lo(:) = 3 dst_slice%hi(:) = 7 dst_slice%lo(7) = 2 dst_slice%hi(7) = 3 dst_slice%stride(:) = (m+2)/2 dst_slice%stride(1) = (m+1)/2 ! ! Rank 1 ! rank = 1 call ARMCI_NbGet_fa(b1, dst_slice, a1, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. call check_b(rank,a1,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(1) = score(1) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 1D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 2 ! rank = 2 vshape(1) = asize(2) call ARMCI_NbGet_fa(b2, dst_slice, a2, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(2)) = reshape(a2,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(2) = score(2) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 2D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 3 ! rank = 3 vshape(1) = asize(3) call ARMCI_NbGet_fa(b3, dst_slice, a3, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(3)) = reshape(a3,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(3) = score(3) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 3D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 4 ! rank = 4 vshape(1) = asize(4) call ARMCI_NbGet_fa(b4, dst_slice, a4, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(4)) = reshape(a4,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(4) = score(4) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 4D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 5 ! rank = 5 vshape(1) = asize(5) call ARMCI_NbGet_fa(b5, dst_slice, a5, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(5)) = reshape(a5,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(5) = score(5) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 5D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 6 ! rank = 6 vshape(1) = asize(6) call ARMCI_NbGet_fa(b6, dst_slice, a6, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(6)) = reshape(a6,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(6) = score(6) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 6D C8, m = ',m,' failed' endif call ARMCI_Sync() ! ! Rank 7 ! rank = 7 vshape(1) = asize(7) call ARMCI_NbGet_fa(b7, dst_slice, a7, src_slice, remote_proc, rc) call ARMCI_Waitall_fa() call ARMCI_Sync() ! ! Check that recieved a is the piece of b that was sent. v(1:asize(7)) = reshape(a7,vshape) call check_b(rank,v,src_slice,dst_slice,remote_proc, & & lb,ub,lb,ub,joff,pass) score(7) = score(7) + pass if (pass .ne. 1) then print *,me,': ARMCI_NbGet_fa verify for 7D C8, m = ',m,' failed' endif call ARMCI_Sync() enddo if (me .eq. 0) then do m = 1,7 if (score(m) .eq. 3) then print *,' ARMCI_NbGet_fa for C8, ',m,'D passed' endif enddo endif ! ! Free v, a and b arrays. ! call ARMCI_Sync() call ARMCI_Free_fa(v, rc) call ARMCI_Free_fa(a1, rc) call ARMCI_Free_fa(b1, rc) call ARMCI_Free_fa(a2, rc) call ARMCI_Free_fa(b2, rc) call ARMCI_Free_fa(a3, rc) call ARMCI_Free_fa(b3, rc) call ARMCI_Free_fa(a4, rc) call ARMCI_Free_fa(b4, rc) call ARMCI_Free_fa(a5, rc) call ARMCI_Free_fa(b5, rc) call ARMCI_Free_fa(a6, rc) call ARMCI_Free_fa(b6, rc) call ARMCI_Free_fa(a7, rc) call ARMCI_Free_fa(b7, rc) call ARMCI_Sync() return endsubroutine ga-5-4/armci/f90/testa_init.f900000644000175000017500000002152112662210417014206 0ustar mbambamodule testa_init use definekind interface init_7d module procedure init_7d_i4 module procedure init_7d_i8 module procedure init_7d_r4 module procedure init_7d_r8 module procedure init_7d_c4 module procedure init_7d_c8 end interface contains subroutine init_7d_i4(a,b,alb,aub,blb,bub,aoff,boff) integer(kind=i4), pointer :: a(:,:,:,:,:,:,:) integer(kind=i4), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff, boff integer i1,i2,i3,k4,i5,i6,i7 integer j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = j j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = j j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_i4 subroutine init_7d_i8(a,b,alb,aub,blb,bub,aoff,boff) integer(kind=i8), pointer :: a(:,:,:,:,:,:,:) integer(kind=i8), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff, boff integer i1,i2,i3,k4,i5,i6,i7 integer(kind=i8) :: j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = j j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = j j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_i8 subroutine init_7d_r4(a,b,alb,aub,blb,bub,aoff,boff) real(kind=r4), pointer :: a(:,:,:,:,:,:,:) real(kind=r4), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff, boff integer i1,i2,i3,k4,i5,i6,i7 integer(kind=i4) :: j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = float(j) j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = float(j) j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_r4 subroutine init_7d_r8(a,b,alb,aub,blb,bub,aoff,boff) real(kind=r8), pointer :: a(:,:,:,:,:,:,:) real(kind=r8), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff, boff integer i1,i2,i3,k4,i5,i6,i7 integer(kind=i4) :: j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = dble(j) j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = dble(j) j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_r8 subroutine init_7d_c4(a,b,alb,aub,blb,bub,aoff,boff) complex(kind=c4), pointer :: a(:,:,:,:,:,:,:) complex(kind=c4), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff, boff integer i1,i2,i3,k4,i5,i6,i7 integer(kind=i4) :: j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = cmplx(j,j,c4) j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = cmplx(j,j,c4) j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_c4 subroutine init_7d_c8(a,b,alb,aub,blb,bub,aoff,boff) complex(kind=c8), pointer :: a(:,:,:,:,:,:,:) complex(kind=c8), pointer :: b(:,:,:,:,:,:,:) integer alb(7),aub(7),blb(7),bub(7) integer aoff,boff integer i1,i2,i3,k4,i5,i6,i7 integer(kind=i4) :: j j = aoff do i7 = alb(7),aub(7) do i6 = alb(6),aub(6) do i5 = alb(5),aub(5) do k4 = alb(4),aub(4) do i3 = alb(3),aub(3) do i2 = alb(2),aub(2) do i1 = alb(1),aub(1) a(i1,i2,i3,k4,i5,i6,i7) = cmplx(j,j,c8) j = j + 1 enddo enddo enddo enddo enddo enddo enddo j = boff do i7 = blb(7),bub(7) do i6 = blb(6),bub(6) do i5 = blb(5),bub(5) do k4 = blb(4),bub(4) do i3 = blb(3),bub(3) do i2 = blb(2),bub(2) do i1 = blb(1),bub(1) b(i1,i2,i3,k4,i5,i6,i7) = cmplx(j,j,c8) j = j + 1 enddo enddo enddo enddo enddo enddo enddo return end subroutine init_7d_c8 end module testa_init ga-5-4/armci/f90/testanb.f900000644000175000017500000000177312662210417013512 0ustar mbambaprogram main use definekind use armci_types use armci_mem_f90 use armci_nbmov use testa_init use checkput type(ARMCI_slice) :: src_slice, dst_slice ! integer(kind=I4), pointer :: a1(:) integer :: remote_proc integer :: lb(7), ub(7), rc, i, j,me, nproc integer :: myunit integer :: m integer :: extent(7) integer :: asize(7) call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world, me, ierr) call mpi_comm_size(mpi_comm_world, nproc, ierr) remote_proc = nproc -1 -me myunit = 10+me call ARMCI_Arr_init() lb(:) = 1 ub(:) = 7 extent(:) = 1 extent(:) = extent(:) + ub(:) - lb(:) asize(1) = extent(1) do m= 2,7 asize(m) = asize(m-1)*extent(m) enddo call testanb_i4(nproc,me,remote_proc) call testanb_i8(nproc,me,remote_proc) call testanb_r4(nproc,me,remote_proc) call testanb_r8(nproc,me,remote_proc) call testanb_c4(nproc,me,remote_proc) call testanb_c8(nproc,me,remote_proc) call ARMCI_Arr_finalize() call mpi_finalize(ierr) end program main ga-5-4/armci/f90/armcif90.c0000644000175000017500000007234012662210417013306 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "CompilerCharacteristics.h" #include #include #include #include #include #include #define HIDDEN_DESC #if defined(F90_SYM_CASE_LOWER) # define ARMCI_Arr_init F90_SYMBOL( armci_arr_init ) # define ARMCI_Arr_finalize F90_SYMBOL( armci_arr_finalize ) # define ARMCI_Malloc_farray F90_SYMBOL( armci_malloc_farray ) # define ARMCI_Free_farray F90_SYMBOL( armci_free_farray ) # define ARMCI_Put_farrays F90_SYMBOL( armci_put_farrays ) # define ARMCI_NbPut_farrays F90_SYMBOL( armci_nbput_farrays ) # define ARMCI_Get_farrays F90_SYMBOL( armci_get_farrays ) # define ARMCI_NbGet_farrays F90_SYMBOL( armci_nbget_farrays ) # define ARMCI_Sync F90_SYMBOL( armci_sync ) # define ARMCI_Waitall_fa F90_SYMBOL( armci_waitall_fa ) # define ARMCI_Notify_fa F90_SYMBOL( armci_notify_fa ) # define ARMCI_NotifyWait_fa F90_SYMBOL( armci_notifywait_fa ) # define ARMCI_Malloc_fa F90_SYMBOL( armci_malloc_fa ) #endif /* F90_SYM_CASE_LOWER */ #if defined(F90_SYM_CASE_MIXED) # define ARMCI_Arr_init F90_SYMBOL( ARMCI_Arr_init ) # define ARMCI_Arr_finalize F90_SYMBOL( ARMCI_Arr_finalize ) # define ARMCI_Malloc_farray F90_SYMBOL( ARMCI_Malloc_farray ) # define ARMCI_Free_farray F90_SYMBOL( ARMCI_Free_farray ) # define ARMCI_Put_farrays F90_SYMBOL( ARMCI_Put_farrays ) # define ARMCI_NbPut_farrays F90_SYMBOL( ARMCI_NbPut_farrays ) # define ARMCI_Get_farrays F90_SYMBOL( ARMCI_Get_farrays ) # define ARMCI_NbGet_farrays F90_SYMBOL( ARMCI_NbGet_farrays ) # define ARMCI_Sync F90_SYMBOL( ARMCI_Sync ) # define ARMCI_Waitall_fa F90_SYMBOL( ARMCI_Waitall_fa ) # define ARMCI_Notify_fa F90_SYMBOL( ARMCI_Notify_fa ) # define ARMCI_NotifyWait_fa F90_SYMBOL( ARMCI_NotifyWait_fa ) #endif /* F90_SYM_CASE_MIXED */ #ifdef F90_SYM_CASE_UPPER # define ARMCI_Arr_init F90_SYMBOL( ARMCI_ARR_INIT ) # define ARMCI_Arr_finalize F90_SYMBOL( ARMCI_ARR_FINALIZE ) # define ARMCI_Malloc_farray F90_SYMBOL( ARMCI_MALLOC_FARRAY ) # define ARMCI_Free_farray F90_SYMBOL( ARMCI_FREE_FARRAY ) # define ARMCI_Put_farrays F90_SYMBOL( ARMCI_PUT_FARRAYS ) # define ARMCI_NbPut_farrays F90_SYMBOL( ARMCI_NBPUT_FARRAYS ) # define ARMCI_Get_farrays F90_SYMBOL( ARMCI_GET_FARRAYS ) # define ARMCI_NbGet_farrays F90_SYMBOL( ARMCI_NBGET_FARRAYS ) # define ARMCI_Sync F90_SYMBOL( ARMCI_SYNC ) # define ARMCI_Waitall_fa F90_SYMBOL( ARMCI_WAITALL_FA ) # define ARMCI_Notify_fa F90_SYMBOL( ARMCI_NOTIFY_FA ) # define ARMCI_NotifyWait_fa F90_SYMBOL( ARMCI_NOTIFYWAIT_FA ) #endif /* F90_SYM_CASE_UPPER */ #ifdef F90_INTEL # define GET_ADDRESS_FROM_FDSC(dsc) (((void**)(dsc))[2]) #else # define GET_ADDRESS_FROM_FDSC(dsc) (((void**)(dsc))[0]) #endif typedef struct { int lo[MAXDIM]; int hi[MAXDIM]; int stride[MAXDIM]; } array_slice_t; /* allows simple test to assure that allocated and freed addresses the same */ void* g_save_addr; /* structure containing function pointers to chasm lib, must be initialized */ F90_CompilerCharacteristics cc; extern int armci_nproc, armci_me; void ARMCI_Arr_init() { F90_SetCompilerCharacteristics(&cc, FORTRAN_COMPILER); ARMCI_Init(); } void ARMCI_Arr_finalize() { ARMCI_Finalize(); } void ARMCI_Waitall_fa() { ARMCI_WaitAll(); } void ARMCI_Notify_fa(int* proc) { int tempvar; tempvar = armci_notify(*proc); } void ARMCI_NotifyWait_fa(int* proc) { int rc,wc; rc = armci_notify_wait(*proc,&wc); } void armci_abort() { } void armci_abort_() { } void ARMCI_Sync() { ARMCI_Barrier(); } void ARMCI_Terminate() { } void ARMCI_Malloc_farray(void* dv, int* rank, int* elemsize, int lb_in[], int ub_in[], int* rc, void* dv_hidden) { long stride[MAXDIM]; long lo[MAXDIM]; unsigned long extent[MAXDIM]; void* dv_local; armci_arr_dsc_t *ad; int i; _array_create(&g_save_addr,*elemsize, *rank, lb_in, ub_in); if(!g_save_addr)ARMCI_Error("_array_create failed",*rank); /************************ chasm interface ***************************/ /* memory for dope vector */ dv_local = malloc( cc.getArrayDescSize(*rank) ); if(!dv_local) {*rc = -2; return;} ad = GET_ARR_DSC_FROM_ARRAY(g_save_addr); /* *rc = cc.setArrayDesc(dv_local, g_save_addr, *rank, F90_ArrayPointer, F90_Integer, elemsize, ad->lo, ad->extent, ad->stride); */ for(i=0; i< *rank; i++) lo[i] = (long)ad->lo[i]; for(i=0; i< *rank; i++) stride[i] = (long)ad->stride[i]; for(i=0; i< *rank; i++) extent[i] = (unsigned long) ad->extent[i]; *rc = cc.setArrayDesc(dv_local, g_save_addr, *rank, F90_ArrayPointer, F90_Integer, *elemsize, lo, extent, stride); if (*rc) { fprintf(stderr, "ERROR in setting array descriptor\n"); return; } /* copy dope vector to the stack memory */ *rc = cc.copyToArrayDescAndHidden(dv_local, *rank, F90_ArrayPointer, dv, dv_hidden); if (*rc) { fprintf(stderr, "ERROR in copying array descriptor\n"); return; } free(dv_local); } void ARMCI_Free_farray(void* dv, int* rank, int* rc, void* dv_hidden) { F90_CompilerCharacteristics cc; void* dv_local; void* addr; armci_arr_dsc_t *ad; *rc = 0; F90_SetCompilerCharacteristics(&cc, FORTRAN_COMPILER); dv_local = cc.createArrayDesc(dv, dv_hidden, *rank, F90_ArrayPointer); if (dv_local == 0) { fprintf(stderr, "ERROR in createArrayDesc\n"); *rc = -1; return; } addr = cc.getArrayBaseAddress(dv_local, *rank); if (addr == 0) { fprintf(stderr, "ERROR in getArrayBaseAddress rank=%d\n",*rank); *rc = -1; return; } _array_free(addr); } static long Index(int rank, int subscript[], int lo[], int extent[]) { long idx = 0, i, factor=1; for(i=0;ielemsize; ad_src_rank = ad_dst->rank; for (i=0;ilo, ad_src_lo, ad_src_extent)*ad_src_elemsize + (char*) addr_src; ptr_dst= Index(ad_dst->rank, dst_slc->lo, ad_dst->lo, ad_dst->extent)*ad_dst->elemsize + (char*) ad_dst->aptr[*proc]; /* The following attempts to deal with non-unit stride. */ /* Seems like we assume that src_slc->hi[i] >= src_slc->lo[i] and stride[i] > 0 for all i. One might wish to modify that assumption at some point. Should we check that the patches are the same size, does ARMCI_Puts handle that? */ if (ad_dst->rank != ad_src_rank) { fprintf(stderr, "ARMCI_Put_farrays: ERROR ranks of src and dst do not match\n"); *rc = -1; return; } src_first_stride_eq_1 = 1; src_unit_stride = 1; for(i=0; i< ad_src_rank; i++) { if (src_slc->stride[i] > 1) { if (i == 0) { src_first_stride_eq_1 = 0; } src_unit_stride = 0; src_count[i] = (int)((src_slc->hi[i] -src_slc->lo[i]+src_slc->stride[i])/src_slc->stride[i]); } else { src_count[i] = src_slc->hi[i] -src_slc->lo[i]+1; } } dst_first_stride_eq_1 = 1; dst_unit_stride = 1; for(i=0; i< ad_dst->rank; i++) { if (dst_slc->stride[i] > 1) { if (i == 0) { dst_first_stride_eq_1 = 0; } dst_unit_stride = 0; dst_count[i] = (int)((dst_slc->hi[i] -dst_slc->lo[i]+dst_slc->stride[i])/dst_slc->stride[i]); } else { dst_count[i] = dst_slc->hi[i] -dst_slc->lo[i]+1; } } /* Might want to check that src_count and dst_count match here?, perhaps that happens in ARMC_PutS but I think not. */ for (i=0;istride[i+1]; } src_count[0] *= ad_src_elemsize; } else { /* If first dimension strides are both 1, then we can till use ad_src->rank-1 levels. Just the strides need changing. */ if ((src_first_stride_eq_1 != 0) && (dst_first_stride_eq_1 != 0)) { mv_rank = ad_src_rank-1; src_count[0] *= ad_src_elemsize; for (i=0; i< mv_rank; i++) { src_stride[i] = ad_src_stride[i+1]*src_slc->stride[i+1]; } for (i=0; i< mv_rank; i++) { dst_stride[i] = ad_dst->stride[i+1]*dst_slc->stride[i+1]; } } else { mv_rank = ad_src_rank; /* Shift counts, right, set count[0] to elemsize. */ for (i=mv_rank;i>0;i--) { src_count[i] = src_count[i-1]; } src_count[0] = ad_src_elemsize; /* Adjust strides. */ for (i=0;istride[i]; } for (i=0;istride[i]*dst_slc->stride[i]; } } } #if 0 printf(" ARMCI_Put_farrays(src): lo = %d hi = %d stride = %d\n", src_slc->lo[0], src_slc->hi[0], src_slc->stride[0]); printf(" ARMCI_Put_farrays(dst): lo = %d hi = %d stride = %d on proc = %d\n", dst_slc->lo[0], dst_slc->hi[0], dst_slc->stride[0], *proc); #endif /* ARMCI_PutS(ptr_src, ad_src->stride+1, ptr_dst, ad_dst->stride+1, count, ad_src->rank-1, *proc); */ ARMCI_PutS(ptr_src, src_stride, ptr_dst, dst_stride, src_count, mv_rank, *proc); } ARMCI_NbPut_farrays(void* dv_src, array_slice_t* src_slc, void* dv_dst, array_slice_t* dst_slc, int* proc, int* rank, int* rc, void* dv_h_src, void* dv_h_dst) { void *addr_src, *addr_dst, *dv_l_src, *dv_l_dst; armci_arr_dsc_t *ad_dst,*ad_src; void *ptr_src, *ptr_dst; int i; int src_count[MAXDIM+1]; int dst_count[MAXDIM+1]; int src_stride[MAXDIM]; int dst_stride[MAXDIM]; int src_unit_stride, src_first_stride_eq_1; int dst_unit_stride, dst_first_stride_eq_1; int mv_rank; int ad_src_rank; int ad_src_elemsize; int ad_src_lo[MAXDIM]; int ad_src_extent[MAXDIM]; int ad_src_stride[MAXDIM]; *rc = 0; dv_l_src = cc.createArrayDesc(dv_src, dv_h_src, *rank, F90_ArrayPointer); if (dv_l_src == 0) { fprintf(stderr, "nb_ARMCI_Put_farrays: ERROR in createArrayDesc\n"); *rc = -1; return; } addr_src = cc.getArrayBaseAddress(dv_l_src, *rank); if (addr_src == 0) { fprintf(stderr, "%d:nb_ARMCI_Put_farrays: ERROR in getArrayBaseAddress src %d\n",armci_me,*rank); *rc = -1; return; } dv_l_dst = cc.createArrayDesc(dv_dst, dv_h_dst, *rank, F90_ArrayPointer); if (dv_l_dst == 0) { fprintf(stderr, "nb_ARMCI_Put_farrays: ERROR in createArrayDesc\n"); *rc = -1; return; } addr_dst = cc.getArrayBaseAddress(dv_l_dst, *rank); if (addr_dst == 0) { fprintf(stderr, "%d:nb_ARMCI_Put_farrays: ERROR in getArrayBaseAddress dst %d\n",armci_me,*rank); *rc = -1; return; } #if 0 assert(addr_src = g_save_addr); assert(addr_dst = g_save_addr); #endif /* ad_src = GET_ARR_DSC_FROM_ARRAY(addr_src); Need to replace ad_src_rank, ad_src_lo, ad_src_extent, ad_src_stride, and ad_src_elemsize with local stuff from the chasm interface. No way to get elemsize from chasm stuff, so for now take src_elemsize to be the same as dst_elemsize. */ ad_dst = GET_ARR_DSC_FROM_ARRAY(addr_dst); ad_src_elemsize = ad_dst->elemsize; ad_src_rank = ad_dst->rank; for (i=0;ilo, ad_src_lo, ad_src_extent)*ad_src_elemsize + (char*) addr_src; ptr_dst= Index(ad_dst->rank, dst_slc->lo, ad_dst->lo, ad_dst->extent)*ad_dst->elemsize + (char*) ad_dst->aptr[*proc]; /* The following attempts to deal with non-unit stride. */ /* Seems like we assume that src_slc->hi[i] >= src_slc->lo[i] and stride[i] > 0 for all i. One might wish to modify that assumption at some point. Should we check that the patches are the same size, does ARMCI_Puts handle that? */ if (ad_dst->rank != ad_src_rank) { fprintf(stderr, "nb_ARMCI_Put_farrays: ERROR ranks of src and dst do not match\n"); *rc = -1; return; } src_first_stride_eq_1 = 1; src_unit_stride = 1; for(i=0; i< ad_src_rank; i++) { if (src_slc->stride[i] > 1) { if (i == 0) { src_first_stride_eq_1 = 0; } src_unit_stride = 0; src_count[i] = (int)((src_slc->hi[i] -src_slc->lo[i]+src_slc->stride[i])/src_slc->stride[i]); } else { src_count[i] = src_slc->hi[i] -src_slc->lo[i]+1; } } dst_first_stride_eq_1 = 1; dst_unit_stride = 1; for(i=0; i< ad_dst->rank; i++) { if (dst_slc->stride[i] > 1) { if (i == 0) { dst_first_stride_eq_1 = 0; } dst_unit_stride = 0; dst_count[i] = (int)((dst_slc->hi[i] -dst_slc->lo[i]+dst_slc->stride[i])/dst_slc->stride[i]); } else { dst_count[i] = dst_slc->hi[i] -dst_slc->lo[i]+1; } } /* Might want to check that src_count and dst_count match here?, * perhaps that happens in ARMC_PutS but I think not. * */ for (i=0;istride[i+1]; } src_count[0] *= ad_src_elemsize; } else { /* If first dimension strides are both 1, then we * can till use ad_src->rank-1 levels. Just * the strides need changing. * */ if ((src_first_stride_eq_1 != 0) && (dst_first_stride_eq_1 != 0)) { mv_rank = ad_src_rank-1; src_count[0] *= ad_src_elemsize; for (i=0; i< mv_rank; i++) { src_stride[i] = ad_src_stride[i+1]*src_slc->stride[i+1]; } for (i=0; i< mv_rank; i++) { dst_stride[i] = ad_dst->stride[i+1]*dst_slc->stride[i+1]; } } else { mv_rank = ad_src_rank; /* Shift counts, right, set count[0] to elemsize. */ for (i=mv_rank;i>0;i--) { src_count[i] = src_count[i-1]; } src_count[0] = ad_src_elemsize; /* Adjust strides. */ for (i=0;istride[i]; } for (i=0;istride[i]*dst_slc->stride[i]; } } } #if 0 printf(" nb_ARMCI_Put_farrays(src): lo = %d hi = %d stride = %d\n", src_slc->lo[0], src_slc->hi[0], src_slc->stride[0]); printf(" nb_ARMCI_Put_farrays(dst): lo = %d hi = %d stride = %d on proc = %d\n", dst_slc->lo[0], dst_slc->hi[0], dst_slc->stride[0], *proc); #endif /* * ARMCI_PutS(ptr_src, ad_src->stride+1, ptr_dst, ad_dst->stride+1, count, ad_src->rank-1, *proc); * */ ARMCI_NbPutS(ptr_src, src_stride, ptr_dst, dst_stride, src_count, mv_rank, *proc,NULL); } void ARMCI_Get_farrays(void* dv_src, array_slice_t* src_slc, void* dv_dst, array_slice_t* dst_slc, int* proc, int* rank, int* rc, void* dv_h_src, void* dv_h_dst) { void *addr_src, *addr_dst, *dv_l_src, *dv_l_dst; armci_arr_dsc_t *ad_src, *ad_dst; void *ptr_src, *ptr_dst; int i; int src_count[MAXDIM+1]; int dst_count[MAXDIM+1]; int src_stride[MAXDIM]; int dst_stride[MAXDIM]; int src_unit_stride, src_first_stride_eq_1; int dst_unit_stride, dst_first_stride_eq_1; int mv_rank; int ad_dst_rank; int ad_dst_elemsize; int ad_dst_lo[MAXDIM]; int ad_dst_extent[MAXDIM]; int ad_dst_stride[MAXDIM]; *rc = 0; #ifdef HIDDEN_DESC dv_l_src = cc.createArrayDesc(dv_src, dv_h_src, *rank, F90_ArrayPointer); #else dv_l_src = dv_src; #endif if (dv_l_src == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in createArrayDesc\n"); *rc = -1; return; } addr_src = cc.getArrayBaseAddress(dv_l_src, *rank); if (addr_src == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in getArrayBaseAddress\n"); *rc = -1; return; } #ifdef HIDDEN_DESC dv_l_dst = cc.createArrayDesc(dv_dst, dv_h_dst, *rank, F90_ArrayPointer); #else dv_l_dst = dv_dst; #endif if (dv_l_dst == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in createArrayDesc\n"); *rc = -1; return; } addr_dst = cc.getArrayBaseAddress(dv_l_dst, *rank); if (addr_dst == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in getArrayBaseAddress\n"); *rc = -1; return; } #if 0 assert(addr_src = g_save_addr); assert(addr_dst = g_save_addr); #endif ad_src = GET_ARR_DSC_FROM_ARRAY(addr_src); /* ad_dst = GET_ARR_DSC_FROM_ARRAY(addr_dst); */ ad_dst_elemsize = ad_src->elemsize; ad_dst_rank = ad_src->rank; for (i=0;irank, src_slc->lo, ad_src->lo, ad_src->extent)*ad_src->elemsize + (char*) ad_src->aptr[*proc]; ptr_dst= Index(ad_dst_rank, dst_slc->lo, ad_dst_lo, ad_dst_extent)*ad_dst_elemsize + (char*) addr_dst; /* The following attempts to deal with non-unit stride. */ /* Seems like we assume that src_slc->hi[i] >= src_slc->lo[i] and stride[i] > 0 for all i. One might wish to modify that assumption at some point. Should we check that the patches are the same size, does ARMCI_Gets handle that? */ if (ad_dst_rank != ad_src->rank) { fprintf(stderr, "ARMCI_Get_farrays: ERROR ranks of src and dst do not match\n"); *rc = -1; return; } src_first_stride_eq_1 = 1; src_unit_stride = 1; for(i=0; i< ad_src->rank; i++) { if (src_slc->stride[i] > 1) { if (i == 0) { src_first_stride_eq_1 = 0; } src_unit_stride = 0; src_count[i] = (int)((src_slc->hi[i] -src_slc->lo[i]+src_slc->stride[i])/src_slc->stride[i]); } else { src_count[i] = src_slc->hi[i] -src_slc->lo[i]+1; } } dst_first_stride_eq_1 = 1; dst_unit_stride = 1; for(i=0; i< ad_dst_rank; i++) { if (dst_slc->stride[i] > 1) { if (i == 0) { dst_first_stride_eq_1 = 0; } dst_unit_stride = 0; dst_count[i] = (int)((dst_slc->hi[i] -dst_slc->lo[i]+dst_slc->stride[i])/dst_slc->stride[i]); } else { dst_count[i] = dst_slc->hi[i] -dst_slc->lo[i]+1; } } /* Might want to check that src_count and dst_count match here?, perhaps that happens in ARMC_PutS but I think not. */ for (i=0;irank;i++) { if (dst_count[i] != src_count[i]) { fprintf(stderr, "ARMCI_Get_farrays: ERROR counts of src and dst slices do not match\n"); *rc = -1; return; } } if ((src_unit_stride != 0) && (dst_unit_stride != 0)) { mv_rank = ad_src->rank-1; for (i=0; istride[i+1]; } for (i=0; ielemsize; } else { /* If first dimension strides are both 1, then we can till use ad_src->rank-1 levels. Just the strides need changing. */ if ((src_first_stride_eq_1 != 0) && (dst_first_stride_eq_1 != 0)) { mv_rank = ad_src->rank-1; src_count[0] *= ad_src->elemsize; for (i=0; i< mv_rank; i++) { src_stride[i] = ad_src->stride[i+1]*src_slc->stride[i+1]; } for (i=0; i< mv_rank; i++) { dst_stride[i] = ad_dst_stride[i+1]*dst_slc->stride[i+1]; } } else { mv_rank = ad_src->rank; /* Shift counts, right, set count[0] to elemsize. */ for (i=mv_rank;i>0;i--) { src_count[i] = src_count[i-1]; } src_count[0] = ad_src->elemsize; /* Adjust strides. */ for (i=0;istride[i]*src_slc->stride[i]; } for (i=0;istride[i]; } } } #if 0 printf(" ARMCI_Get_farrays(src): lo = %d hi = %d stride = %d\n", src_slc->lo[0], src_slc->hi[0], src_slc->stride[0]); printf(" ARMCI_Get_farrays(dst): lo = %d hi = %d stride = %d on proc = %d\n", dst_slc->lo[0], dst_slc->hi[0], dst_slc->stride[0], *proc); #endif /* ARMCI_GetS(ptr_src, ad_src->stride+1, ptr_dst, ad_dst->stride+1, count, ad_src->rank-1, *proc); */ ARMCI_GetS(ptr_src, src_stride, ptr_dst, dst_stride, src_count, mv_rank, *proc); } void ARMCI_NbGet_farrays(void* dv_src, array_slice_t* src_slc, void* dv_dst, array_slice_t* dst_slc, int* proc, int* rank, int* rc, void* dv_h_src, void* dv_h_dst) { void *addr_src, *addr_dst, *dv_l_src, *dv_l_dst; armci_arr_dsc_t *ad_src, *ad_dst; void *ptr_src, *ptr_dst; int i; int src_count[MAXDIM+1]; int dst_count[MAXDIM+1]; int src_stride[MAXDIM]; int dst_stride[MAXDIM]; int src_unit_stride, src_first_stride_eq_1; int dst_unit_stride, dst_first_stride_eq_1; int mv_rank; int ad_dst_rank; int ad_dst_elemsize; int ad_dst_lo[MAXDIM]; int ad_dst_extent[MAXDIM]; int ad_dst_stride[MAXDIM]; *rc = 0; dv_l_src = cc.createArrayDesc(dv_src, dv_h_src, *rank, F90_ArrayPointer); if (dv_l_src == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in createArrayDesc\n"); *rc = -1; return; } addr_src = cc.getArrayBaseAddress(dv_l_src, *rank); if (addr_src == 0) { fprintf(stderr, "ARMCI_Get_farrays: ERROR in getArrayBaseAddress\n"); *rc = -1; return; } #if 0 assert(addr_src = g_save_addr); assert(addr_dst = g_save_addr); #endif ad_src = GET_ARR_DSC_FROM_ARRAY(addr_src); /* * ad_dst = GET_ARR_DSC_FROM_ARRAY(addr_dst); * */ ad_dst_elemsize = ad_src->elemsize; ad_dst_rank = ad_src->rank; for (i=0;irank, src_slc->lo, ad_src->lo, ad_src->extent)*ad_src->elemsize + (char*) ad_src->aptr[*proc]; ptr_dst= Index(ad_dst_rank, dst_slc->lo, ad_dst_lo, ad_dst_extent)*ad_dst_elemsize + (char*) addr_dst; /* The following attempts to deal with non-unit stride. */ /* Seems like we assume that src_slc->hi[i] >= src_slc->lo[i] and * stride[i] > 0 for all i. One might wish to modify that * assumption at some point. Should we check that the patches * are the same size, does ARMCI_Gets handle that? * */ if (ad_dst_rank != ad_src->rank) { fprintf(stderr, "ARMCI_Get_farrays: ERROR ranks of src and dst do not match\n"); *rc = -1; return; } src_first_stride_eq_1 = 1; src_unit_stride = 1; for(i=0; i< ad_src->rank; i++) { if (src_slc->stride[i] > 1) { if (i == 0) { src_first_stride_eq_1 = 0; } src_unit_stride = 0; src_count[i] = (int)((src_slc->hi[i] -src_slc->lo[i]+src_slc->stride[i])/src_slc->stride[i]); } else { src_count[i] = src_slc->hi[i] -src_slc->lo[i]+1; } } dst_first_stride_eq_1 = 1; dst_unit_stride = 1; for(i=0; i< ad_dst_rank; i++) { if (dst_slc->stride[i] > 1) { if (i == 0) { dst_first_stride_eq_1 = 0; } dst_unit_stride = 0; dst_count[i] = (int)((dst_slc->hi[i] -dst_slc->lo[i]+dst_slc->stride[i])/dst_slc->stride[i]); } else { dst_count[i] = dst_slc->hi[i] -dst_slc->lo[i]+1; } } /* Might want to check that src_count and dst_count match here?, * perhaps that happens in ARMC_PutS but I think not. * */ for (i=0;irank;i++) { if (dst_count[i] != src_count[i]) { fprintf(stderr, "ARMCI_Get_farrays: ERROR counts of src and dst slices do not match\n"); *rc = -1; return; } } if ((src_unit_stride != 0) && (dst_unit_stride != 0)) { mv_rank = ad_src->rank-1; for (i=0; istride[i+1]; } for (i=0; ielemsize; } else { /* If first dimension strides are both 1, then we can till use ad_src->rank-1 levels. Just the strides need changing. */ if ((src_first_stride_eq_1 != 0) && (dst_first_stride_eq_1 != 0)) { mv_rank = ad_src->rank-1; src_count[0] *= ad_src->elemsize; for (i=0; i< mv_rank; i++) { src_stride[i] = ad_src->stride[i+1]*src_slc->stride[i+1]; } for (i=0; i< mv_rank; i++) { dst_stride[i] = ad_dst_stride[i+1]*dst_slc->stride[i+1]; } } else { mv_rank = ad_src->rank; /* Shift counts, right, set count[0] to elemsize. */ for (i=mv_rank;i>0;i--) { src_count[i] = src_count[i-1]; } src_count[0] = ad_src->elemsize; /* Adjust strides. */ for (i=0;istride[i]*src_slc->stride[i]; } for (i=0;istride[i]; } } } #if 0 printf(" ARMCI_Get_farrays(src): lo = %d hi = %d stride = %d\n", src_slc->lo[0], src_slc->hi[0], src_slc->stride[0]); printf(" ARMCI_Get_farrays(dst): lo = %d hi = %d stride = %d on proc = %d\n", dst_slc->lo[0], dst_slc->hi[0], dst_slc->stride[0], *proc); #endif /* * ARMCI_GetS(ptr_src, ad_src->stride+1, ptr_dst, ad_dst->stride+1, count, ad_src->rank-1, *proc); */ ARMCI_NbGetS(ptr_src, src_stride, ptr_dst, dst_stride, src_count, mv_rank, *proc,NULL); } ga-5-4/armci/f90/definekind_cray.f900000644000175000017500000000036012662210417015157 0ustar mbambamodule definekind integer, parameter :: I4 = 4 integer, parameter :: I8 = 8 integer, parameter :: R4 = 4 integer, parameter :: R8 = 8 integer, parameter :: C4 = 4 integer, parameter :: C8 = 8 end module definekind ga-5-4/armci/aclocal.m40000644000175000017500000011763312662210426012777 0ustar mbamba# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Figure out how to run the assembler. -*- Autoconf -*- # Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_PROG_AS # ---------- AC_DEFUN([AM_PROG_AS], [# By default we simply use the C compiler to build assembly code. AC_REQUIRE([AC_PROG_CC]) test "${CCAS+set}" = set || CCAS=$CC test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([../m4/armci_as_no_i386asm.m4]) m4_include([../m4/armci_c_opt.m4]) m4_include([../m4/armci_cxx_opt.m4]) m4_include([../m4/armci_enable_gpc.m4]) m4_include([../m4/armci_enable_profile.m4]) m4_include([../m4/armci_group.m4]) m4_include([../m4/armci_nb_noncont.m4]) m4_include([../m4/armci_setup.m4]) m4_include([../m4/armci_shmmax.m4]) m4_include([../m4/ax_sys_weak_alias.m4]) m4_include([../m4/ga_ar.m4]) m4_include([../m4/ga_arg_parse.m4]) m4_include([../m4/ga_armci_network.m4]) m4_include([../m4/ga_as.m4]) m4_include([../m4/ga_c_match_types.m4]) m4_include([../m4/ga_check_func.m4]) m4_include([../m4/ga_check_header.m4]) m4_include([../m4/ga_compiler_vendor.m4]) m4_include([../m4/ga_cross_compiling.m4]) m4_include([../m4/ga_enable_checkpoint.m4]) m4_include([../m4/ga_enable_opt.m4]) m4_include([../m4/ga_enable_trace.m4]) m4_include([../m4/ga_function.m4]) m4_include([../m4/ga_mpi_test_disable.m4]) m4_include([../m4/ga_mpi_unwrap.m4]) m4_include([../m4/ga_mpicc.m4]) m4_include([../m4/ga_mpicc_test.m4]) m4_include([../m4/ga_mpicxx.m4]) m4_include([../m4/ga_mpicxx_test.m4]) m4_include([../m4/ga_msg_comms.m4]) m4_include([../m4/ga_sys_weak_alias.m4]) m4_include([../m4/ga_target.m4]) m4_include([../m4/ga_thread_safe.m4]) m4_include([../m4/ga_union_semun.m4]) m4_include([../m4/ga_warn_flags.m4]) m4_include([../m4/ga_with_help.m4]) m4_include([../m4/tcgmsg_rsh.m4]) m4_include([../m4/tcgmsg_timings.m4]) m4_include([m4/libtool.m4]) m4_include([m4/lt_obsolete.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) ga-5-4/NEWS0000644000175000017500000001444612662210514010537 0ustar mbamba5.0 November 2010 * Now built using GNU autotools (autoconf,automake,libtool) * Restricted arrays (see user manual) * ARMCI runtime enhancements + On-demand connection management + Improved scalability for fence * New Python interface * Task Scheduling Library (tascel) 5.0b July 2010 * Now built using GNU autotools (autoconf,automake,libtool) 4.3 May 2010 * Optimized portals port to scale upto 200K procs * Optimized OpenIB port * BlueGene/P * Support for Sparse Data Operations + (See GA user manual - Chapter 11 for more details) 4.2 July 2009 * Support for several new platforms * Optimized portals port for Cray XT5 * BlueGene/P * Optimized OpenIB port * Support for Sparse Data Operations + (See GA user manual - Chapter 11 for more details) 4.1 May 2008 * Support for several new platforms + Cray XT4 + BlueGene/L, BlueGene/P + OpenIB network * Optimized one-sided non-blocking operations * New networks. i.e. ARMCI_NETWORK + OPENIB + PORTALS + MPI-SPAWN (one-sided communication thru' MPI2 Dynamic Process management and Send/Recv) 4.0 April 2006 * Support for multilevel parallelism: processor group awareness * GA_Dgemm matrix multiplication based on SRUMMA * Support for large arrays (a terabyte Global Array now possible) * Optimized one-sided non-blocking operations * Supports various platforms (Crays, IBM SPs, SGI Altix, ...) and interconnects (Myrinet, Quadrics, Infiniband, ...) 3.4 2004 (beta) * Initial support for multilevel parallelism * processor group awareness * nonblocking one-sided interfaces * optimized port to Cray X1, SGI Altix 3.3 July, 2003 * nonblocking one-sided interfaces * optimized matrix multiplication (ga_dgemm) * mirrored arrays * unoptimized port to Cray X1 * support for infiniband network (Mellanox VAPI) * GA CCA component 3.2 October, 2002 * support for ghost cells * port to Linux64/Itanium, Hitachi, Cray SV1, MAC X, and Cygwin * support two underscores in fortran names on Linux/Cygwin (enabled by setting F2C_TWO_UNDERSCORES) * C++ bindings to Global Arrays * element-wise and matrix operations * synchronization control in collective operations * additional datatypes: float & long in C, real in Fortran * cluster information calls * n-dim DRA 3.1 November 6th, 2000 * ports to 64-bit IBM, HP, Sun, Fujitsu, Linux/Alpha platforms * new operations: + periodic version of put,get,accumulate + nga_scatter_acc + nga_select_elem + ga_nblock + nga_select_elem * restructured makefiles to simplify changes and enable export of make definitions to application makefiles * new platforms supported by ARMCI (and thus GA) + Myrinet on Linux (Intel, Sparc) and Solaris/Sparc + Giganet on Linux/Intel + Compaq/Quadrics clusters + clusters of Windows NT under TCP/IP 3.0 November 15th, 1999 * This is the most significant update of the GA package to date: all source code for the core functionality of the library has been rewritten, ~90% of the library code is new/changed; * added support for n-dimensional arrays (n<=7); * added several n-dimensional test programs; * updated utility tools: ga_print, ga_summarize, which support n-dimensional operations; * improved interoperability with MPI on clusters of workstations * ports to Cray J90 and Windows NT (single machine) * ga_create uses default distribution for block size <1 rather than <2 (the old scheme can be restored see OLD_DEFAULT_BLK in src/GNUmakefile) * added a new, easier-to-use C interface (see ntestc.c) * added User's Manual 2.4 * port to IBM SP running LAPI active messages (significant performance improvement). Version >=2.3 of the IBM PSSP parallel environment and threaded version of MPI are required to run with LAPI. * port to Fujitsu VX-4 and VPP-700. * minor platform specific updates. 2.3 * added lock operations: ga_lock, ga_unlock, ga_create_mutex, ga_destroy_mutex * ga_acc works for integer data type * port to the CRAY T3E (with streams disabled) * environment variable TARGET_CPU can be use to guide compilation for particular CPU (R10000 and R8000 are currently recognized on the SGI systems) * a new TARGET, SGI_N32 used for the 64-bit SGI systems 2.2 * added support for double complex datatype; * port to HP and Convex SPP; * latency optimizations for IBM SP running AIX 4.X; * relaxed restriction on data types in ga_dscal, ga_dscal_patch, ga_dadd, ga_dadd_patch, ga_ifill_patch, ga_dfill_patch - these functions has been renamed to: ga_scale, ga_scale_patch, ga_add, ga_add_patch, ga_fill_patch; * new functions: ga_fence and ga_init_fence, ga_zdot, and ga_zdot_patch, ga_print_stats; * new interface functions to ScaLAPACK: ga_cholesky, ga_llt_solve, ga_spd_invert, ga_solve * several configuration parameters are exposed to the user in global/src/config.h to allow customization of the package. 2.1 * selection of message-passing (TCGMSG or MPI) library * new operations: ga_mpi_communicator and ga_proc_topology; * performance optimizations; * alternative C interface and C test programs; * port to Sun Solaris and PC running Linux. 2.0 * support for networks of multiprocessors (SMP); * (tightly) integrated shared and distributed memory versions; * ability to restrict memory usage in global arrays; * ga_scatter/gather supports integers; * a program to test performance of GA primitives; * different numbering of global array handles (< 0); * and other internal improvements, like randomized order of remote operations, prototypes of C-callable ops, etc. 1.3.1 * port to CRAY-T3D; * new operation ga_summarize; * improved ga_dgemm. 1.3 * introduced patch versions of ga_ddot, ga_dscal, ga_dadd; * also ga_matmul_patch, ga_ifill_patch, ga_dfill_patch, and ga_duplicate. * ga_copy_patch now has a transpose argument. 1.2 * (loosely) integrated shared and distributed memory versions ga-5-4/gparrays/0000755000175000017500000000000012662210375011664 5ustar mbambaga-5-4/gparrays/testing/0000755000175000017500000000000012662210375013341 5ustar mbambaga-5-4/gparrays/testing/testc.c0000644000175000017500000005123412662210375014634 0ustar mbamba/* Test algorithm parameters */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include "ga.h" #include "gp.h" #include "macdecls.h" #include "mp3.h" #include /* #define N_I 4 #define N_J 4 */ #define N_I 32 #define N_J 32 #define N_K 32 /* #define Q_I 2 #define Q_J 2 */ #define Q_I 8 #define Q_J 8 /* get random patch for GP */ void get_range( int ndim, int dims[], int lo[], int hi[], int g_p) { int dim, nproc, i, itmp; nproc = NGA_Nodeid(); /* Mix up values on different processors */ for (i=0; i MAX_FACTOR) printf("Overflow in grid factor\n"); prime[pmax-1] = i; } } /** * find all prime factors of p */ ip = p; ifac = 0; for (i=0; i=0; ii--) { i = idim/ti; j = jdim/tj; k = kdim/tk; if (i >= j && i >= k && i > 1) { ti = fac[ii]*ti; } else if (j >= i && j >= k && j > 1) { tj = fac[ii]*tj; } else if (k >= i && k >= j && k > 1) { tk = fac[ii]*tk; } else { printf("Too many processors in factoring routine\n"); } } free(prime); free(fac); *pdi = ti; *pdj = tj; *pdk = tk; } void do_work() { int g_p, me, i, ii, j, jj, l, k, nv; int nproc, next; int m_k_ij, m_l_ij, idx; int dims[2], lo[2], hi[2], ndim; int lo_t[2], hi_t[2]; int dims3[3], lo3[3], hi3[3], blocks[3], chunk[3]; int nelems, nsize; int idim, jdim, kdim, subscript[2], size; int pdi, pdj, pdk; int ld[2], ld_sz[2]; int checksize; int *ptr, *mapc; void **buf_ptr; void *buf; int *buf_size; void *elem_buf; int *subscripts; /* Create Global Pointer array */ dims[0] = N_I; dims[1] = N_J; ndim = 2; me = NGA_Nodeid(); nproc = NGA_Nnodes(); g_p = GP_Create_handle(); GP_Set_dimensions(g_p, ndim, dims); GP_Allocate(g_p); /* Find locally owned elements in Global Pointer array. Only these elements can be assigned to data using the GP_Assign_local_element routine. */ GP_Distribution(g_p, me, lo, hi); idim = hi[0] - lo[0] + 1; jdim = hi[1] - lo[1] + 1; for (ii=0; iihi[0] || subscript[1]hi[1]) { printf("p[%d] assign i: %d j: %d lo[0]: %d hi[0]: %d lo[1]: %d hi[1]: %d\n", me,subscript[0],subscript[1],lo[0],hi[0],lo[1],hi[1]); } GP_Assign_local_element(g_p, subscript, (void*)ptr, size); } } /* Guarantee data consistency */ GP_Sync(); /*GP_Debug(g_p);*/ /* Generate bounding coordinates to an arbitrary patch in GP array */ get_range(ndim, dims, lo, hi, g_p); /* Find the total amount of data contained in the patch */ nsize = (hi[0]-lo[0]+1)*(hi[1]-lo[1]+1); GP_Get_size(g_p, lo, hi, &size); /* Allocate local buffers and retrieve data */ buf = (void*)malloc(size); buf_ptr = (void**)malloc(nsize*sizeof(void*)); buf_size = (int*) malloc(nsize*sizeof(int)); ld[1] = hi[0]-lo[0]+1; ld[0] = hi[1]-lo[1]+1; ld_sz[1] = hi[0]-lo[0]+1; ld_sz[0] = hi[1]-lo[1]+1; GA_Set_debug(1); GP_Get(g_p, lo, hi, buf, buf_ptr, ld, buf_size, ld_sz, &size, 0); if (me==0) printf("\nCompleted GP_Get\n"); GA_Set_debug(0); /* Check contents of buffers to see if data is as expected */ for (i=lo[0]; i<=hi[0]; i++) { ii = i - lo[0]; for (j=lo[1]; j<=hi[1]; j++) { jj = j - lo[1]; idx = j*N_I + i; ptr = (int*)buf_ptr[ii*ld[0]+jj]; m_k_ij = i%Q_I + 1; m_l_ij = j%Q_J + 1; if (buf_size[ii*ld_sz[0]+jj] != 4*(ptr[0]*ptr[1]+2)) { printf("p[%d] size expected: %d actual: %d\n",me,buf_size[ii*ld_sz[0]+jj], 4*(ptr[0]*ptr[1]+2)); } if (ptr[0] != m_k_ij) { printf("p[%d] [%d,%d] Dimension(1) i actual: %d expected: %d\n",me,i,j,ptr[0],m_k_ij); } if (ptr[1] != m_l_ij) { printf("p[%d] [%d,%d] Dimension(1) j actual: %d expected: %d\n",me,i,j,ptr[1],m_l_ij); } for (k=0; k #include "macdecls.h" #include "ga.h" #include "gp.h" #define USE_HYPRE 0 #define IMAX 100 #define JMAX 100 #define KMAX 100 #define LMAX IMAX*JMAX*KMAX #define MAXVEC 5000000 #define EPSLN 1.0d-10 #define CHECK_BOUND 1 #define bb_a(ib) bb_v(bb_i + (ib)) #define cc_a(ib) cc_v(cc_i + (ib)) #define Integer int #define MAX_FACTOR 10000 #if USE_HYPRE #include "HYPRE.h" #include "HYPRE_struct_mv.h" #include "mpi.h" #endif void grid_factor(int p, int xdim, int ydim, int zdim, int *idx, int *idy, int *idz) { int i, j; int ip, ifac, pmax, prime[MAX_FACTOR]; int fac[MAX_FACTOR]; int ix, iy, iz, ichk; i = 1; /* factor p completely first, find all prime numbers, besides 1, less than or equal to the square root of p */ ip = (int)(sqrt((double)p))+1; pmax = 0; for (i=2; i<=ip; i++) { ichk = 1; for (j=0; j MAX_FACTOR) printf("Overflow in grid_factor\n"); prime[pmax-1] = i; } } /* find all prime factors of p */ ip = p; ifac = 0; for (i=0; i= 0; i--) { ix = xdim/(*idx); iy = ydim/(*idy); iz = zdim/(*idz); if (ix >= iy && ix >= iz && ix > 1) { *idx = fac[i]*(*idx); } else if (iy >= ix && iy >= iz && iy > 1) { *idy = fac[i]*(*idy); } else if (iz >= ix && iz >= iy && iz > 1) { *idz = fac[i]*(*idz); } else { printf("Too many processors in grid factoring routine\n"); } } } /* Short subroutine for multiplying sparse matrix block with vector segment */ void loc_matmul(double *a_mat, int *jvec, int *ivec, double *bvec, double *cvec, int nrows) { double tempc; int i, j, jj, jmin,jmax; for (i=0; i hi[0]) { jdx = kp*pdi*pdj + jp*pdi + ip + 1; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } if (ix-1 >= 0) { if (ix-1 < lo[0]) { jdx = kp*pdi*pdj + jp*pdi + ip - 1; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } if (iy+1 <= jdim-1) { if (iy+1 > hi[1]) { jdx = kp*pdi*pdj + (jp+1)*pdi + ip; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } if (iy-1 >= 0) { if (iy-1 < lo[1]) { jdx = kp*pdi*pdj + (jp-1)*pdi + ip; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } if (iz+1 <= kdim-1) { if (iz+1 > hi[2]) { jdx = (kp+1)*pdi*pdj + jp*pdi + ip; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } if (iz-1 >= 0) { if (iz-1 < lo[2]) { jdx = (kp-1)*pdi*pdj + jp*pdi + ip; ecnt[jdx] = ecnt[jdx] + 1; } else { ecnt[me] = ecnt[me] + 1; } } } /* Create list of processors that this processor is coupled to. If ecnt[i] is greater than zero then process i is coupled to this process. ltotal_procs: the total number of other processor that this process is coupled to. This includes this process (the diagonal term). lproclist[i]: the IDs of the processor that this processor is coupled to lproc_inv[i]: the location in lproclist of processor i. If processor i is not coupled to this process, the lproc_inv[i] = -1 ncnt: total number of non-zero elements held by this process nnz_list[i]: number of processes coupled to process i by sparse blocks nnz: total number of sparse blocks */ ltotal_procs = 0; ncnt = 0; for (i=0; i 0) { ltotal_procs++; ncnt += ecnt[i]; } } nsave = ncnt; lproclist = (int*)malloc(ltotal_procs*sizeof(int)); lproc_inv = (int*)malloc(nprocs*sizeof(int)); licnt = (int*)malloc(ltotal_procs*sizeof(int)); for (i=0; i 0) { lproclist[j] = i; if (j > 0) { lvoffset[j] = ecnt[lproclist[j-1]]+lvoffset[j-1]; } lproc_inv[i] = j; j++; } } /* Create arrays the hold the sparse block representation of the sparse matrix gp_block[nnz]: Global Pointer array holding the sparse sub-matrices g_j[nnz]: column block indices for the element in gp_block g_i[nprocs]: row block indices for the elements in g_j */ tmapc = (int*)malloc((nprocs+1)*sizeof(int)); tmapc[0] = 0; for (i=1; i<=nprocs; i++) { tmapc[i] = tmapc[i-1]+nnz_list[i-1]; } *gp_block = GP_Create_handle(); GP_Set_dimensions(*gp_block,one,&nnz); GP_Set_irreg_distr(*gp_block, tmapc, &nprocs); GP_Allocate(*gp_block); *g_j = NGA_Create_handle(); NGA_Set_data(*g_j,one,&nnz,C_INT); NGA_Set_irreg_distr(*g_j, tmapc, &nprocs); NGA_Allocate(*g_j); for (i=0; i hi[0]) { jdx = kp*pdi*pdj + jp*pdi + ip + 1; il = 0; jl = iy - lo[1]; kl = iz - lo[2]; ldpi = xld[ip+1]; } else { jdx = me; il = ix - lo[0] + 1; jl = iy - lo[1]; kl = iz - lo[2]; ldpi = ldi; } idx = kl*ldpi*ldj + jl*ldpi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } if (ix-1 >= 0) { ncnt++; ixn[ncnt] = ix - 1; iyn[ncnt] = iy; izn[ncnt] = iz; if (ix-1 < lo[0]) { jdx = kp*pdi*pdj + jp*pdi + ip - 1; il = xld[ip-1] - 1; jl = iy - lo[1]; kl = iz - lo[2]; ldmi = xld[ip-1]; } else { jdx = me; il = ix - lo[0] - 1; jl = iy - lo[1]; kl = iz - lo[2]; ldmi = ldi; } idx = kl*ldmi*ldj + jl*ldmi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } if (iy+1 <= jdim-1) { ncnt++; ixn[ncnt] = ix; iyn[ncnt] = iy + 1; izn[ncnt] = iz; if (iy+1 > hi[1]) { jdx = kp*pdi*pdj + (jp+1)*pdi + ip; il = ix - lo[0]; jl = 0; kl = iz - lo[2]; ldpj = yld[jp+1]; } else { jdx = me; il = ix - lo[0]; jl = iy - lo[1] + 1; kl = iz - lo[2]; ldpj = ldj; } idx = kl*ldi*ldpj + jl*ldi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } if (iy-1 >= 0) { ncnt++; ixn[ncnt] = ix; iyn[ncnt] = iy - 1; izn[ncnt] = iz; if (iy-1 < lo[1]) { jdx = kp*pdi*pdj + (jp-1)*pdi + ip; il = ix - lo[0]; jl = yld[jp-1] - 1; kl = iz - lo[2]; ldmj = yld[jp-1]; } else { jdx = me; il = ix - lo[0]; jl = iy - lo[1] - 1; kl = iz - lo[2]; ldmj = ldj; } idx = kl*ldi*ldmj + jl*ldi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } if (iz+1 <= kdim-1) { ncnt++; ixn[ncnt] = ix; iyn[ncnt] = iy; izn[ncnt] = iz + 1; if (iz+1 > hi[2]) { jdx = (kp+1)*pdi*pdj + jp*pdi + ip; il = ix - lo[0]; jl = iy - lo[1]; kl = 0; } else { jdx = me; il = ix - lo[0]; jl = iy - lo[1]; kl = iz - lo[2] + 1; } idx = kl*ldi*ldj + jl*ldi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } if (iz-1 >= 0) { ncnt++; ixn[ncnt] = ix; iyn[ncnt] = iy; izn[ncnt] = iz - 1; if (iz-1 < lo[2]) { jdx = (kp-1)*pdi*pdj + jp*pdi + ip; il = ix - lo[0]; jl = iy - lo[1]; kl = zld[kp-1] - 1; } else { jdx = me; il = ix - lo[0]; jl = iy - lo[1]; kl = iz - lo[2] - 1; } idx = kl*ldi*ldj + jl*ldi + il; nghbrs[ncnt] = idx; procid[ncnt] = jdx; } /* sort indices so that neighbors run from lowest to highest local index. This sort is not particularly efficient but ncnt is generally small */ ncnt++; for (j=0; j nghbrs[k]) { itmp = nghbrs[j]; nghbrs[j] = nghbrs[k]; nghbrs[k] = itmp; itmp = ixn[j]; ixn[j] = ixn[k]; ixn[k] = itmp; itmp = iyn[j]; iyn[j] = iyn[k]; iyn[k] = itmp; itmp = izn[j]; izn[j] = izn[k]; izn[k] = itmp; itmp = procid[j]; procid[j] = procid[k]; procid[k] = itmp; } } } for (k=0; k= ntot) { printf("p[%d] Invalid neighbor %d\n",me,nghbrs[k]); } } /* set weights corresponding to a finite difference Laplacian on a 7-point stencil */ for (j=0; j= nsave) { printf("p[%d] Out of bounds (lvoffset+licnt)[%d]: %d\n",me,idx,lvoffset[idx]+licnt[idx]); } if (lvoffset[idx]+licnt[idx]>=idbg) { } /* TODO: Check this carefully */ jval[lvoffset[idx]+licnt[idx]] = nghbrs[j]; ivalt[idx*isize+i-imin] = ivalt[idx*isize+i-imin]+1; licnt[idx]++; } } /* finish evaluating ival array */ for (i=0; i MAXVEC) NGA_Error("ISIZE exceeds MAXVEC in local arrays ",isize); /* Local portion of sparse matrix has been evaluated and decomposed into blocks that match partitioning of right hand side across processors. The following data is available at this point: 1) ltotal_procs: the number of processors that are coupled to this one via the sparse matrix 2) lproclist(ltotal_procs): a list of processor IDs that are coupled to this processor 3) lproc_inv(nprocs): The entry in proc_list that corresponds to a given processor. If the entry is -1 then that processor does not couple to this processor. 4) licnt(ltotal_procs): The number of non-zero entries in the sparse matrix that couple the process represented by proc_list(j) to this process 5) lvoffset(ltotal_procs): The offsets for the non-zero data in the arrays rval and jval for the blocks that couple this processor to other processes in proc_list 6) offset(nprocs): the offset array for the distributed right hand side vector These arrays describe how the sparse matrix is layed out both locally and across processors. In addition, the actual data for the distributed sparse matrix is found in the following arrays: 1) rval: values of matrix for all blocks on this processor 2) jval: j-indices of matrix for all blocks on this processor 3) ival(ltotal_procs*(lnsize(me)+1)): starting index in rval and jval for each row in each block */ NGA_Sync(); /* Create a sparse array of sparse blocks. Each block element is divided into for sections. The first section consists of 7 ints and contains the parameters imin: minimum i index represented by block imin: maximum i index represented by block jmin: minimum j index represented by block jmin: maximum j index represented by block iblock: row index of block jblock: column index of block nnz: number of non-zero elements in block The next section consists of nnz doubles that represent the non-zero values in the block. The third section consists of nnz ints and contains the local j indices of all values. The final section consists of (imax-imin+2) ints and contains the starting index in jval and rval for the each row between imin and imax. An extra value is included at the end and is set equal to nnz+1. This is included to simplify some coding. */ offset = 0; for (i=0; i ntot-1) { bhi[1] = ntot-1; } btot = (hi[0]-lo[0]+1)*(hi[1]-lo[1]+1)*(hi[2]-lo[2]+1); for (i=0; i 1.0e-10) { printf("p[%d] i: %d vector: %f cbuf: %f\n",me,i,vector[i],cbuf[i]); } prdot2 = prdot2 + (vector[i]-cbuf[i])*(vector[i]-cbuf[i]); } NGA_Dgop(&dotga,1,"+"); NGA_Dgop(&dothypre,1,"+"); NGA_Dgop(&prdot2,1,"+"); prtot2 += sqrt(prdot2); gatot2 += sqrt(dotga); hypretot2 += sqrt(dothypre); free(cbuf); free(blk_ptr); #endif /* Clean up transposed matrix */ GP_Distribution(gt_a_data,me,blo,bhi); for (i=blo[0]; i #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #include "gacommon.h" #include "typesf2c.h" #include "gpbase.h" #include "armci.h" #include "message.h" #include "ga-papi.h" #include "gp-papi.h" #include "gp-wapi.h" #define gpm_GetRangeFromMap(p, ndim, plo, phi){ \ Integer _mloc = p* ndim *2; \ *plo = (Integer*)_gp_map + _mloc; \ *phi = *plo + ndim; \ } /** * Utility arrays used in onesided communication */ Integer *_gp_map; Integer *_gp_proclist; /** * Initialize utility arrays */ void gpi_onesided_init() { Integer nproc; nproc = pnga_pgroup_nnodes(pnga_pgroup_get_world()); _gp_proclist = (Integer*)malloc((size_t)nproc*sizeof(Integer)); _gp_map = (Integer*)malloc((size_t)(nproc*2*GP_MAX_DIM)*sizeof(Integer)); } /** * Clean utility arrays */ void gpi_onesided_clean() { free(_gp_map); free(_gp_proclist); } /** * Get sizes of element in GP array and return them to a local buffer. Also * evaluate the total size of the data to be copied and return that in the * variable size. intsize is an internal variable that can be used to * distinguish between 4 and 8 byte integers * @param[in] g_p pointer array handle * @param[in] lo[ndim] lower corner of pointer array block * @param[in] hi[ndim] upper corner of pointer array block * @param[out] buf buffer that holds element sizes * @param[in] ld[ndim-1] physical dimensions of buffer * @param[out] size total size of requested data * @param[in] intsize parameter to distinguish between 4 and 8 * byte integers */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wgp_get_size = pgp_get_size #endif void pgp_get_size(Integer g_p, Integer *lo, Integer *hi, Integer *size, Integer intsize) { Integer handle, ndim, i, nelems; Integer block_ld[GP_MAX_DIM-1]; int *int_ptr; int *long_ptr; handle = g_p + GP_OFFSET; if (!GP[handle].active) { pnga_error("gp_get_size: inactive array handle specified", g_p); } ndim = pnga_ndim(GP[handle].g_ptr_array); for (i=0; i GP[handle].hi[i]) pnga_error("gp_get_size: illegal block size specified", g_p); } /* Find total number of elements in block and get strides of requested block */ ndim = GP[handle].ndim; nelems = 1; for (i=0; i GP[handle].hi[i]) pnga_error("gp_get: illegal block size specified", g_p); } /*bjp printf("p[%d] (gp_get) lo[0]: %d hi[0]: %d lo[1]: %d hi[1]: %d\n", me,lo[0],hi[0],lo[1],hi[1]); */ if (!setbuf) { pnga_get(GP[handle].g_size_array, lo, hi, buf_size, ld_sz); } /* Get strides of requested block */ ndim = GP[handle].ndim; nelems = 1; for (i=0; i=0; d--) { offset_sz = offset_sz*ld_sz[d] + index[d]; offset_d = offset_d*ld[d] + index[d]; } /* evaluate offset in data buffer */ buf_ptr[offset_d] = (void*)(((char*)buf)+offset_ptr); if (intsize == 4) { offset_ptr += ((int*)buf_size)[offset_sz]; } else { offset_ptr += ((int64_t*)buf_size)[offset_sz]; } /*bjp printf("p[%d] (gp_get) buf_size[%d]: %d\n",me,offset_sz,((int*)buf_size)[offset_sz]); */ idx++; } *size = offset_ptr; /* locate the processors containing some portion of the patch represented by * lo and hi and return the results in _gp_map, gp_proclist, and np. * _gp_proclist contains a list of processors containing some portion of the * patch, _gp_map contains the lower and upper indices of the portion of the * patch held by a given processor and np contains the number of processors * that contain some portion of the patch. */ pnga_locate_region(GP[handle].g_size_array, lo, hi, _gp_map, _gp_proclist, &np); /* Loop over processors containing data */ for (idx=0; idx=0; d--) { offset_rem = offset_rem*block_ld_loc[d] + index[d]; offset_sz = offset_sz*ld_sz[d] + index[d] + plo[d] - lo[d]; offset_d = offset_d*ld[d] + index[d] + plo[d] - lo[d]; } /*bjp printf("p[%d] j: %d offset_rem: %d offset_sz: %d offset_d: %d\n", me, j, offset_rem, offset_sz, offset_d); */ if (intsize == 4) { bytes = (int)((int*)buf_size)[offset_sz]; } else { bytes = (int)((int64_t*)buf_size)[offset_sz]; } /*bjp printf("p[%d] bytes: %d\n",me,bytes); */ if (bytes > 0) { if (rem_ptr[offset_rem].cpid == me) { (src_array[j])[0] = ((void*)(rem_ptr[offset_rem].addr)); /* handle remote and SMP case */ } else if (pnga_cluster_proc_nodeid(me) == pnga_cluster_proc_nodeid(rem_ptr[offset_rem].cpid)) { (src_array[j])[0] = ARMCI_Memat(&rem_ptr[offset_rem], sizeof(armci_meminfo_t)); } else { (src_array[j])[0] = (void*)rem_ptr[offset_rem].armci_addr; } (dst_array[j])[0] = (void*)buf_ptr[offset_d]; #define DBG desc[jcnt].src_ptr_array = src_array[j]; desc[jcnt].dst_ptr_array = dst_array[j]; desc[jcnt].bytes = bytes; desc[jcnt].ptr_array_len = 1; /*bjp printf("p[%ld] jcnt: %d nelems: %ld index[%ld,%ld] bytes: %d src_ptr: %ld p: %d dst_ptr: %ld\n", (long)pnga_nodeid(), jcnt, (long)nelems, (long)(index[0]+plo[0]), (long)(index[1]+plo[1]), desc[jcnt].bytes, (long)desc[jcnt].src_ptr_array[0], (int)p, (long)desc[jcnt].dst_ptr_array[0]); */ jcnt++; } else { /*bjp printf("p[%ld] null pointer at i: %ld j: %ld\n", (long)pnga_nodeid(), (long)(index[0]+plo[0]), (long)(index[1]+plo[1])); */ } } /*bjp printf("p[%ld] (gp_get) jcnt: %d p: %d\n",(long)pnga_nodeid(),jcnt,p); */ #ifdef XDBG for (j=0; j 0) { rc = ARMCI_GetV(desc, (int)jcnt, (int)p); if (rc) pnga_error("ARMCI_GetV failure in gp_get",rc); } #endif for (j=0; j GP[handle].hi[i]) pnga_error("gp_put: illegal block size specified", g_p); } /* Get strides of target block */ ndim = GP[handle].ndim; nelems = 1; for (i=0; i=0; d--) { offset_rem = offset_rem*block_ld_loc[d] + index[d]; offset_sz = offset_sz*ld_sz[d] + index[d] + plo[d] - lo[d]; offset_d = offset_d*ld[d] + index[d] + plo[d] - lo[d]; } if (intsize == 4) { bytes = (int)((int*)buf_size)[offset_sz]; } else { bytes = (int)((int64_t*)buf_size)[offset_sz]; } if (bytes > 0) { if (rem_ptr[offset_rem].cpid == me) { (dst_array[j])[0] = ((void*)(rem_ptr[offset_rem].addr)); /* handle remote and SMP case */ } else if (pnga_cluster_proc_nodeid(me) == pnga_cluster_proc_nodeid(rem_ptr[offset_rem].cpid)) { (dst_array[j])[0] = ARMCI_Memat(&rem_ptr[offset_rem], sizeof(armci_meminfo_t)); } else { (dst_array[j])[0] = (void*)rem_ptr[offset_rem].armci_addr; } (src_array[j])[0] = (void*)buf_ptr[offset_d]; #define DBG desc[jcnt].src_ptr_array = src_array[j]; desc[jcnt].dst_ptr_array = dst_array[j]; desc[jcnt].bytes = bytes; desc[jcnt].ptr_array_len = 1; jcnt++; } else { /*bjp printf("p[%ld] null pointer at i: %ld j: %ld\n", (long)pnga_nodeid(), (long)(index[0]+plo[0]), (long)(index[1]+plo[1])); */ } } #ifdef XDBG for (j=0; j 0) { rc = ARMCI_PutV(desc, (int)jcnt, (int)p); if (rc) pnga_error("ARMCI_PutV failure in gp_put",rc); } #endif for (j=0; jhi[i]) { pnga_error("gp_access_element: subscript out of bounds", i); } if (i 0) { idx = header[iproc]; /* allocate descriptor array for this vector call */ desc = (armci_giov_t*)malloc((int)nelems[iproc]*sizeof(armci_giov_t)); src_array = (void***)malloc((int)nelems[iproc]*sizeof(void**)); dst_array = (void***)malloc((int)nelems[iproc]*sizeof(void**)); j = 0; while (idx > -1) { if (intsize == 4) { bytes = (int)((int*)buf_size)[idx]; } else { bytes = (int)((int64_t*)buf_size)[idx]; } if (bytes>0) { src_array[j] = (void**)malloc(sizeof(void*)); dst_array[j] = (void**)malloc(sizeof(void*)); if (iproc == me) { (src_array[j])[0] = ((void*)(info_buf[idx].addr)); } else if (pnga_cluster_proc_nodeid(me) == pnga_cluster_proc_nodeid(iproc)) { (src_array[j])[0] = ARMCI_Memat(&info_buf[idx],sizeof(armci_meminfo_t)); } else { (src_array[j])[0] = (void*)(info_buf[idx].armci_addr); } (dst_array[j])[0] = (void*)(buf_ptr[idx]); if (intsize == 4) { desc[j].bytes = (int)((int*)buf_size)[idx]; } else { desc[j].bytes = (int)((int64_t*)buf_size)[idx]; } desc[j].src_ptr_array = src_array[j]; desc[j].dst_ptr_array = dst_array[j]; desc[j].ptr_array_len = 1; j++; } idx = list[idx]; } /* gather data from remote locations */ #ifdef XDBG for (idx=0; idx 0) { rc = ARMCI_GetV(desc, (int)j, (int)iproc); if (rc) pnga_error("ARMCI_GetV failure in gp_gather",rc); } #endif /* free arrays */ for (j=0; j 0) { idx = header[iproc]; /* allocate descriptor array for this vector call */ desc = (armci_giov_t*)malloc((int)nelems[iproc]*sizeof(armci_giov_t)); src_array = (void***)malloc((int)nelems[iproc]*sizeof(void**)); dst_array = (void***)malloc((int)nelems[iproc]*sizeof(void**)); j = 0; while (idx > -1) { if (intsize == 4) { bytes = (int)((int*)buf_size)[idx]; } else { bytes = (int)((int64_t*)buf_size)[idx]; } if (bytes>0) { src_array[j] = (void**)malloc(sizeof(void*)); dst_array[j] = (void**)malloc(sizeof(void*)); if (iproc == me) { (dst_array[j])[0] = ((void*)(info_buf[idx].addr)); } else if (pnga_cluster_proc_nodeid(me) == pnga_cluster_proc_nodeid(iproc)) { (dst_array[j])[0] = ARMCI_Memat(&info_buf[idx],sizeof(armci_meminfo_t)); } else { (dst_array[j])[0] = (void*)(info_buf[idx].armci_addr); } (src_array[j])[0] = (void*)(buf_ptr[idx]); if (intsize == 4) { desc[j].bytes = (int)((int*)buf_size)[idx]; } else { desc[j].bytes = (int)((int64_t*)buf_size)[idx]; } desc[j].src_ptr_array = src_array[j]; desc[j].dst_ptr_array = dst_array[j]; desc[j].ptr_array_len = 1; j++; } idx = list[idx]; } /* gather data from remote locations */ #ifdef XDBG for (idx=0; idx 0) { rc = ARMCI_PutV(desc, (int)j, (int)iproc); if (rc) pnga_error("ARMCI_PutV failure in gp_gather",rc); } #endif /* free arrays */ for (j=0; j extern void GP_Access_element(int g_p, int *subscript, void *ptr, int *size); extern int GP_Allocate(int g_p); extern void GP_Assign_local_element(int g_p, int *subscript, void *ptr, int size); extern int GP_Create_handle(); extern void GP_Debug(int g_p); extern int GP_Destroy(int g_p); extern void GP_Distribution(int g_p, int proc, int *lo, int *hi); extern void GP_Free(void* ptr); extern void* GP_Free_local_element(int g_p, int *subscript); extern int GP_Get_dimension(int g_p); extern void GP_Gather_size(int g_p, int nv, int *subscript, int *size); extern void GP_Gather(int g_p, int nv, int *subscript, void *buf, void **buf_ptr, int *buf_size, int *size, int setbuf); extern void GP_Get_size(int g_p, int *lo, int *hi, int *size); extern void GP_Get(int g_p, int *lo, int *hi, void *buf, void **buf_ptr, int *ld, void *buf_size, int *ld_sz, int *size, int setbuf); extern void GP_Initialize(); extern void* GP_Malloc(size_t size); extern void GP_Memzero(int g_p); extern void GP_Put(int g_p, int *lo, int *hi, void **buf_ptr, int *ld, void *buf_size, int *ld_sz, int *size, int checksize); extern void GP_Release_element(int g_p, int *subscript); extern void GP_Release_update_element(int g_p, int *subscript); extern void GP_Scatter(int g_p, int nv, int *subscript, void **buf_ptr, int *buf_size, int *size, int checksize); extern void GP_Set_chunk(int g_p, int *chunk); extern void GP_Set_dimensions(int g_p, int ndim, int *dims); extern void GP_Set_irreg_distr(int g_p, int *mapc, int *blocks); extern void GP_Sync(); extern void GP_Terminate(); ga-5-4/gparrays/src/gpbase.c0000644000175000017500000003555212662210375014072 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_ASSERT_H # include #endif #include "gacommon.h" #include "typesf2c.h" #include "ga-papi.h" #include "gp-papi.h" #include "gp-wapi.h" #include "gpbase.h" #include "armci.h" extern void gpi_onesided_init(); extern void gpi_onesided_clean(); gp_array_t *GP; int GP_pointer_type; /** * Initialize internal library structures for Global Pointer Arrays */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wgp_initialize = pgp_initialize #endif void pgp_initialize() { Integer i; GP = (gp_array_t*)malloc(sizeof(gp_array_t)*GP_MAX_ARRAYS); GP_pointer_type = pnga_register_type(sizeof(armci_meminfo_t)); if (!GP) { pnga_error("gp_initialize: malloc GP failed",0); } for (i=0; iarmci_addr = ((char*)meminfo_ptr->armci_addr) + meminfo_sz; meminfo_ptr->addr = ((char*)meminfo_ptr->addr) + meminfo_sz; meminfo_ptr->size -= meminfo_sz; /*bjp printf("p[%d]: armci_addr = %ld\n", pnga_nodeid(), (long)meminfo_ptr->armci_addr); */ return meminfo_ptr->addr; } /** * Special free() for Global Pointer Arrays */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wgp_free = pgp_free #endif void pgp_free(void* ptr) { armci_meminfo_t meminfo; size_t meminfo_sz = sizeof(armci_meminfo_t); if(!ptr) pnga_error("gp_free: Invalid pointer",0); memcpy( &meminfo, ((char*)ptr)-meminfo_sz, meminfo_sz); /* update the meminfo structure */ meminfo.armci_addr = ((char*)meminfo.armci_addr) - meminfo_sz; meminfo.addr = ((char*)meminfo.addr) - meminfo_sz; meminfo.size += meminfo_sz; ARMCI_Memctl(&meminfo); } /** * Create a handle for a GP array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wgp_create_handle = pgp_create_handle #endif Integer pgp_create_handle() { Integer i, handle=-GP_OFFSET-1; for (i=0; i GP_MAX_DIM) { pnga_error("gp_set_dimensions: dimension is not valid", ndim); } for (i=0; iGP[handle].hi[i]) { /*bjp printf("p[%d] subscript[%d]: %d\n",pnga_nodeid(),i,subscript[i]); printf("p[%d] lo[%d]: %d hi[%d]: %d\n",pnga_nodeid(),i,GP[handle].lo[i],i, GP[handle].hi[i]); */ /* printf("p[%d] subscript[%d]: %d lo[%d]: %d hi[%d]: %d\n",pnga_nodeid(), i, subscript[i], i, GP[handle].lo[i], i, GP[handle].hi[i]); */ pnga_error("gp_assign_local_element: subscript out of bounds", i); } } pnga_access_ptr(GP[handle].g_size_array,subscript,subscript,&gp_ptr,ld); if (intsize == 4) { *((int*)gp_ptr) = (int)size; } else { *((int64_t*)gp_ptr) = (int64_t)size; } /*bjp printf("p[%ld] (internal) size %d at location [%ld:%ld]\n", (long)pnga_nodeid(), *((int*)gp_ptr), (long)subscript[0],(long)subscript[1]); */ pnga_release_update(GP[handle].g_size_array, subscript, subscript); pnga_access_ptr(GP[handle].g_ptr_array,subscript,subscript,&gp_ptr,ld); *((armci_meminfo_t*)gp_ptr) = *((armci_meminfo_t*)(((char*)ptr)-sizeof(armci_meminfo_t))); pnga_release_update(GP[handle].g_ptr_array, subscript, subscript); } /** * Free local data element using access via the Global Pointer array. * @param[in] g_p pointer array handle * @param[in] subscript[ndim] location of element in pointer array */ #if HAVE_SYS_WEAK_ALIAS_PRAGMA # pragma weak wgp_free_local_element = pgp_free_local_element #endif void* pgp_free_local_element(Integer g_p, Integer *subscript) { armci_meminfo_t *gp_ptr; void *ptr; Integer handle, ld[GP_MAX_DIM-1], i; GP_Int buf; handle = g_p + GP_OFFSET; /* check to make sure that element is located in local block of GP array */ for (i=0; iGP[handle].hi[i]) { pnga_error("gp_free_local_element: subscript out of bounds", i); } } pnga_access_ptr(GP[handle].g_ptr_array,subscript,subscript,&gp_ptr,ld); ptr = (*gp_ptr).addr; memset((void*)gp_ptr,0,sizeof(armci_meminfo_t)); pnga_release_update(GP[handle].g_ptr_array, subscript, subscript); /* set corresponding element of size array to zero */ buf = 0; for (i=0; i #include #include "gp.h" #include "gpbase.h" #include "gp-papi.h" #if ENABLE_PROFILING # include "gp-wapi.h" #else # include "gp-wapidefs.h" #endif #ifdef USE_FAPI # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[i]=(Integer)(carr)[i];} # define COPYF2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[i]=(int)(farr)[i];} # define COPYINDEX_F2C COPYF2C #else # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i];} # define COPYINDEX_C2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i]+1;} # define COPYINDEX_F2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int)(farr)[i] -1;} #endif static Integer* gp_copy_map(int block[], int block_ndim, int map[]); void GP_Access_element(int g_p, int *subscript, void *ptr, int *size) { Integer ag_p = (Integer)g_p; Integer _gp_idx[GP_MAX_DIM]; Integer asize; int ndim = wgp_get_dimension(ag_p); COPYINDEX_C2F(subscript,_gp_idx,ndim); wgp_access_element(ag_p, _gp_idx, ptr, &asize); *size = (int)asize; } int GP_Allocate(int g_p) { Integer ag_p; ag_p = (Integer)g_p; return (int)wgp_allocate(ag_p); } void GP_Assign_local_element(int g_p, int *subscript, void *ptr, int size) { Integer ag_p = (Integer)g_p; Integer _gp_idx[GP_MAX_DIM]; Integer asize = (Integer)size; int ndim = wgp_get_dimension(ag_p); COPYINDEX_C2F(subscript,_gp_idx,ndim); wgp_assign_local_element(ag_p, _gp_idx, ptr, asize, 4); } int GP_Create_handle() { return (int)wgp_create_handle(); } void GP_Debug(int g_p) { Integer ag_p; ag_p = (Integer)g_p; wgp_debug(ag_p, 4); } int GP_Destroy(int g_p) { Integer ag_p; ag_p = (Integer)g_p; return (int)wgp_destroy(ag_p); } void GP_Distribution(int g_p, int proc, int *lo, int *hi) { Integer ag_p = (Integer)g_p; Integer p = (Integer)proc; int ndim = (int)wgp_get_dimension(ag_p); Integer _gp_lo[GP_MAX_DIM], _gp_hi[GP_MAX_DIM]; wgp_distribution(ag_p, p, _gp_lo, _gp_hi); COPYINDEX_F2C(_gp_lo, lo, ndim); COPYINDEX_F2C(_gp_hi, hi, ndim); } void GP_Free(void* ptr) { wgp_free(ptr); } void* GP_Free_local_element(int g_p, int *subscript) { Integer ag_p = (Integer)g_p; int ndim = wgp_get_dimension(ag_p); Integer _gp_idx[GP_MAX_DIM]; COPYINDEX_C2F(subscript, _gp_idx, ndim); return wgp_free_local_element(ag_p, _gp_idx); } int GP_Get_dimension(int g_p) { return wgp_get_dimension(g_p); } void GP_Gather_size(int g_p, int nv, int *subscript, int *size) { int idx, i; Integer ag_p = (Integer)g_p; Integer anv = (Integer)nv; Integer asize; Integer *asubscript; int ndim = wgp_get_dimension(ag_p); asubscript = (Integer*)malloc((int)ndim*nv*sizeof(Integer)); if (asubscript == NULL) GA_Error("Memory allocation in GP_Gather_size failed",0); /* adjust the indices for fortran interface */ for (idx=0; idx /* Routines from gpbase.c */ extern void pgp_debug(Integer g_p, Integer intsize); extern void pgp_initialize(); extern void pgp_terminate(); extern void* pgp_malloc(size_t size); extern void pgp_free(void* ptr); extern Integer pgp_create_handle(); extern void pgp_set_dimensions(Integer g_p, Integer ndim, Integer *dims, Integer intsize); extern Integer pgp_get_dimension(Integer g_p); extern void pgp_set_chunk(Integer g_p, Integer *chunk); extern void pgp_set_irreg_distr(Integer g_p, Integer *mapc, Integer *nblock); extern logical pgp_allocate(Integer g_p); extern logical pgp_destroy(Integer g_p); extern void pgp_distribution(Integer g_p, Integer proc, Integer *lo, Integer *hi); extern void pgp_assign_local_element(Integer g_p, Integer *subscript, void *ptr, Integer size, Integer intsize); extern void* pgp_free_local_element(Integer g_p, Integer *subscript); extern void pgp_memzero(Integer g_p, Integer intsize); extern void pgp_sync(); /* Routines from gponesided.c */ extern void pgp_get(Integer g_p, Integer *lo, Integer *hi, void *buf, void **buf_ptr, Integer *ld, void *buf_size, Integer *ld_sz, Integer *size, Integer isize, Integer setbuf); extern void pgp_put(Integer g_p, Integer *lo, Integer *hi, void **buf_ptr, Integer *ld, void *buf_size, Integer *ld_sz, Integer *size, Integer checksize, Integer isize); extern void pgp_get_size(Integer g_p, Integer *lo, Integer *hi, Integer *size, Integer isize); extern void pgp_access_element(Integer g_p, Integer *subscript, void *ptr, Integer *size); extern void pgp_release_element(Integer g_p, Integer *subscript); extern void pgp_release_update_element(Integer g_p, Integer *subscript); extern void pgp_gather_size(Integer g_p, Integer nv, Integer *subscript, Integer *size, Integer intsize); extern void pgp_gather(Integer g_p, Integer nv, Integer *subscript, void *buf, void **buf_ptr, void *buf_size, Integer *size, Integer intsize, Integer setbuf); extern void pgp_scatter(Integer g_p, Integer nv, Integer *subscript, void **buf_ptr, void *buf_size, Integer *size, Integer checksize, Integer intsize); #endif /* GPPAPI_H */ ga-5-4/ga++/0000755000175000017500000000000012662210515010545 5ustar mbambaga-5-4/ga++/testing/0000755000175000017500000000000012662210515012222 5ustar mbambaga-5-4/ga++/testing/mtest.cc0000644000175000017500000010657612662210515013704 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include using namespace std; #include "ga++.h" #define GA_DATA_TYPE MT_F_REAL #define N 4 /* dimension of matrices */ #define MAXDIM GA_MAX_DIM #define OP_SHIFT_DIAGONAL 1 #define OP_SET_DIAGONAL 2 #define OP_ADD_DIAGONAL 3 #define OP_GET_DIAGONAL 4 #define OP_NORM1 5 #define OP_NORM_INFINITY 6 #define OP_MEDIAN 7 #define OP_MEDIAN_PATCH 8 #define OP_SCALE_ROWS 9 #define OP_SCALE_COLS 10 #define GA_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define GA_MIN(a,b) (((a) <= (b)) ? (a) : (b)) # define THRESH 1e-5 #define MISMATCHED(x,y) GA_ABS((x)-(y))>=THRESH void test_scale_cols (GA::GlobalArray *g_a, GA::GlobalArray *g_v) { int index[MAXDIM]; void *min, *max; int imin, imax; float fmin, fmax; long lmin, lmax; double dmin, dmax; DoubleComplex dcmin, dcmax; void *alpha, *beta; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc = { 1.0, 0.0 }, bdc = { -1.0, 0.0}; GA::GlobalArray * g_b, *g_c; int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval = { -2.0, 0.0 }; void *val2; int ival2 = 4; double dval2 = 4.0; float fval2 = 4.0; long lval2 = 4; DoubleComplex dcval2 = { 4.0, 0.0 }; int type, ndim, dims[MAXDIM]; int vtype, vndim, vdims[MAXDIM]; g_a->inquire (&type, &ndim, dims); g_v->inquire (&vtype, &vndim, vdims); switch (type) { case C_INT: alpha = (void *)&ai; beta = (void *)&bi; break; case C_DCPL: alpha = (void *)&adc; beta = (void *)&bdc; break; case C_DBL: alpha = (void *)&ad; beta =(void *) &bd; break; case C_FLOAT: alpha =(void *) ⁡ beta = (void *)&bf; break; case C_LONG: alpha = (void *)&al; beta = (void *)&bl; break; default: GA::SERVICES.error ((char *)"test_scale_cols:wrong data type.", type); } switch (type) { case C_INT: val = (void *)&ival; val2 = (void *)&ival2; break; case C_DCPL: val = (void *)&dcval; val2 = (void *)&dcval2; break; case C_DBL: val = (void *)&dval; val2 = (void *)&dval2; break; case C_FLOAT: val = (void *)&fval; val2 = (void *)&fval2; break; case C_LONG: val = (void *)&lval; val2 = (void *)&lval2; break; default: GA::SERVICES.error ((char *)"test_scale_cols:wrong data type.", type); } if (me == 0) printf ("Testing GA_Scale_cols..."); g_a->fill(val); g_v->fill(val); g_a->scaleCols (g_v); /*the result is the same same as g_b filled with val2 */ g_b = GA::SERVICES.createGA (g_a, (char *)"B"); g_c = GA::SERVICES.createGA (g_a, (char *)"C"); g_b->fill(val2); g_c->add(alpha, g_a, beta, g_b); switch (type) { case C_INT: max = (void *)&imax; min = (void *)&imin; break; case C_DCPL: max = (void *)&dcmax; min = (void *)&dcmin; break; case C_DBL: max = (void *)&dmax; min =(void *) &dmin; break; case C_FLOAT: max = (void *)&fmax; min = (void *)&fmin; break; case C_LONG: max = (void *)&lmax; min = (void *)&lmin; break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } g_c->selectElem ((char *)"max", max, index); g_c->selectElem ((char *)"min", min, index); switch (type) { double r, m; case C_INT: if (me == 0) { if (MISMATCHED (imax, imin) || (imax != 0) || (imin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: r = dcmax.real - dcmin.real; m = dcmax.imag - dcmin.imag; if (me == 0) { if (MISMATCHED (dcmax.real, dcmin.real) || (dcmax.real != 0.0) || (dcmin.real != 0.0) || MISMATCHED (dcmax.imag, dcmin.imag) || (dcmax.imag != 0.0) || (dcmin.imag != 0.0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: if (me == 0) { if (MISMATCHED (dmax, dmin) || (dmax != 0) || (dmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: if (me == 0) { if (MISMATCHED (fmax, fmin) || (fmax != 0) || (fmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: if (me == 0) { if (MISMATCHED (lmax, lmin) || (lmax != 0) || (lmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } } void test_scale_rows (GA::GlobalArray *g_a, GA::GlobalArray *g_v) { int index[MAXDIM]; void *min, *max; int imin, imax; float fmin, fmax; long lmin, lmax; double dmin, dmax; DoubleComplex dcmin, dcmax; void *alpha, *beta; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc = { 1.0, 0.0 }; DoubleComplex bdc = {-1.0, 0.0 }; GA::GlobalArray *g_b, *g_c; int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval = { -2.0, 0.0 }; void *val2; int ival2 = 4; double dval2 = 4.0; float fval2 = 4.0; long lval2 = 4; DoubleComplex dcval2 = { 4.0, 0.0 }; int type, ndim, dims[MAXDIM]; int vtype, vndim, vdims[MAXDIM]; g_a->inquire (&type, &ndim, dims); g_v->inquire (&vtype, &vndim, vdims); switch (type) { case C_INT: alpha = (void *)&ai; beta = (void *)&bi; break; case C_DCPL: alpha = (void *)&adc; beta = (void *)&bdc; break; case C_DBL: alpha = (void *)&ad; beta =(void *) &bd; break; case C_FLOAT: alpha = (void *)⁡ beta = (void *)&bf; break; case C_LONG: alpha = (void *)&al; beta = (void *)&bl; break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } switch (type) { case C_INT: val = (void *)&ival; val2 = (void *)&ival2; break; case C_DCPL: val = (void *)&dcval; val2 = (void *)&dcval2; break; case C_DBL: val = (void *)&dval; val2 = (void *)&dval2; break; case C_FLOAT: val =(void *) &fval; val2 = (void *)&fval2; break; case C_LONG: val = (void *)&lval; val2 = (void *)&lval2; break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } if (me == 0) printf ("Testing GA_Scale_rows..."); g_a->fill (val); g_v->fill (val); g_a->scaleRows (g_v); /*the result is the same same as g_b filled with val2 */ g_b = GA::SERVICES.createGA (g_a, (char *)"B"); g_c = GA::SERVICES.createGA (g_a, (char *)"C"); g_b->fill (val2); g_c->add (alpha, g_a, beta, g_b); switch (type) { case C_INT: max = (void *)&imax; min = (void *)&imin; break; case C_DCPL: max = (void *)&dcmax; min = (void *)&dcmin; break; case C_DBL: max = (void *)&dmax; min = (void *)&dmin; break; case C_FLOAT: max = (void *)&fmax; min = (void *)&fmin; break; case C_LONG: max = (void *)&lmax; min =(void *) &lmin; break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } g_c->selectElem ((char *)"max", max, index); g_c->selectElem ((char *)"min", min, index); switch (type) { double r, m; case C_INT: if (me == 0) { if (MISMATCHED (imax, imin) || (imax != 0) || (imin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: r = dcmax.real - dcmin.real; m = dcmax.imag - dcmin.imag; if (me == 0) { if (MISMATCHED (dcmax.real, dcmin.real) || (dcmax.real != 0.0) || (dcmin.real != 0.0) || MISMATCHED (dcmax.imag, dcmin.imag) || (dcmax.imag != 0.0) || (dcmin.imag != 0.0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: if (me == 0) { if (MISMATCHED (dmax, dmin) || (dmax != 0) || (dmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: if (me == 0) { if (MISMATCHED (fmax, fmin) || (fmax != 0) || (fmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: if (me == 0) { if (MISMATCHED (lmax, lmin) || (lmax != 0) || (lmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_scale_rows:wrong data type.", type); } } void test_median_patch (GA::GlobalArray * g_a, int *alo, int *ahi, GA::GlobalArray * g_b, int *blo, int *bhi, GA::GlobalArray * g_c, int *clo, int *chi, GA::GlobalArray * g_m, int *mlo, int *mhi) { GA::GlobalArray * g_e; int index[MAXDIM]; void *min, *max; int imin, imax; float fmin, fmax; long lmin, lmax; double dmin, dmax; DoubleComplex dcmin, dcmax; void *alpha, *beta; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc = { 1.0, 0.0 }; DoubleComplex bdc = {-1.0, 0.0 }; void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; void *val2; int ival2 = 6; double dval2 = 6.0; float fval2 = 6.0; long lval2 = 6; DoubleComplex dcval2; void *val3; int ival3 = 4; double dval3 = 4.0; float fval3 = 4.0; long lval3 = 4; DoubleComplex dcval3; int me = GA_Nodeid (); int type, ndim, dims[MAXDIM]; g_a->inquire (&type, &ndim, dims); switch (type) { case C_INT: alpha = (void *)&ai; beta =(void *) &bi; break; case C_DCPL: alpha =(void *) &adc; beta = (void *)&bdc; break; case C_DBL: alpha = (void *)&ad; beta = (void *)&bd; break; case C_FLOAT: alpha = (void *)⁡ beta = (void *)&bf; break; case C_LONG: alpha = (void *)&al; beta = (void *)&bl; break; default: GA::SERVICES.error ((char *)"test_median:wrong data type.", type); } dcval.real = -2.0; dcval.imag = -0.0; dcval2.real = 6.0; dcval2.imag = 0.0; dcval3.real = 4.0; dcval3.imag = 0.0; switch (type) { case C_INT: val = (void *)&ival; val2 = (void *)&ival2; val3 = (void *)&ival3; break; case C_DCPL: val = (void *)&dcval; val2 = (void *)&dcval2; val3 = (void *)&dcval3; break; case C_DBL: val = (void *)&dval; val2 = (void *)&dval2; val3 = (void *)&dval3; break; case C_FLOAT: val = (void *)&fval; val2 = (void *)&fval2; val3 = (void *)&fval3; break; case C_LONG: val = (void *)&lval; val2 = (void *)&lval2; val3 = (void *)&lval3; break; default: GA::SERVICES.error ((char *)"test_median:test_median:wrong data type.", type); } if (me == 0) printf ("Testing GA_Median_patch..."); g_a->zero (); g_b->zero (); g_c->zero (); g_m->zero (); g_a->fillPatch (alo, ahi, val); g_b->fillPatch (blo, bhi, val2); g_c->fillPatch (alo, bhi, val3); g_m->medianPatch (g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi, mlo, mhi); /* The result array should be g_c due to the value I chose: val3 is the median of the three values val, val2, and val3 */ /* g_e = g_c - g_m */ g_e = GA::SERVICES.createGA(g_a, (char *)"E"); g_e->zero (); g_e->addPatch (alpha, g_c, clo, chi, beta, g_m, mlo, mhi, alo, ahi); switch (type) { case C_INT: max = (void *)&imax; min = (void *)&imin; break; case C_DCPL: max = (void *)&dcmax; min = (void *)&dcmin; break; case C_DBL: max = (void *)&dmax; min = (void *)&dmin; break; case C_FLOAT: max = (void *)&fmax; min = (void *)&fmin; break; case C_LONG: max = (void *)&lmax; min = (void *)&lmin; break; default: GA_Error ((char *)"test_median:wrong data type.", type); } g_e->selectElem ((char *)"max", max, index); g_e->selectElem ((char *)"min", min, index); switch (type) { double r, m; case C_INT: if (me == 0) { if (MISMATCHED (imax, imin) || (imax != 0) || (imin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: r = dcmax.real - dcmin.real; m = dcmax.imag - dcmin.imag; if (me == 0) { if (MISMATCHED (dcmax.real, dcmin.real) || (dcmax.real != 0.0) || (dcmin.real != 0.0) || MISMATCHED (dcmax.imag, dcmin.imag) || (dcmax.imag != 0.0) || (dcmin.imag != 0.0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: if (me == 0) { if (MISMATCHED (dmax, dmin) || (dmax != 0) || (dmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: if (me == 0) { if (MISMATCHED (fmax, fmin) || (fmax != 0) || (fmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: if (me == 0) { if (MISMATCHED (lmax, lmin) || (lmax != 0) || (lmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_median:wrong data type.", type); } } void test_median (GA::GlobalArray * g_a, GA::GlobalArray * g_b, GA::GlobalArray * g_c, GA::GlobalArray * g_m) { GA::GlobalArray *g_e; int index[MAXDIM]; void *min, *max; int imin, imax; float fmin, fmax; long lmin, lmax; double dmin, dmax; DoubleComplex dcmin, dcmax; void *alpha, *beta; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc = { 1.0, 0.0 }; DoubleComplex bdc = {-1.0, 0.0 }; void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; void *val2; int ival2 = 6; double dval2 = 6.0; float fval2 = 6.0; long lval2 = 6; DoubleComplex dcval2; void *val3; int ival3 = 4; double dval3 = 4.0; float fval3 = 4.0; long lval3 = 4; DoubleComplex dcval3; int me = GA_Nodeid (); int type, ndim, dims[MAXDIM]; g_a->inquire (&type, &ndim, dims); switch (type) { case C_INT: alpha = (void *)&ai; beta = (void *)&bi; break; case C_DCPL: alpha = (void *)&adc; beta =(void *) &bdc; break; case C_DBL: alpha = (void *)&ad; beta = (void *)&bd; break; case C_FLOAT: alpha =(void *) ⁡ beta = (void *)&bf; break; case C_LONG: alpha = (void *)&al; beta = (void *)&bl; break; default: GA::SERVICES.error ((char *)"test_median:wrong data type.", type); } dcval.real = -2.0; dcval.imag = -0.0; dcval2.real = 6.0; dcval2.imag = 0.0; dcval3.real = 4.0; dcval3.imag = 0.0; switch (type) { case C_INT: val = (void *)&ival; val2 =(void *) &ival2; val3 = (void *)&ival3; break; case C_DCPL: val = (void *)&dcval; val2 =(void *) &dcval2; val3 =(void *) &dcval3; break; case C_DBL: val = (void *)&dval; val2 = (void *)&dval2; val3 = (void *)&dval3; break; case C_FLOAT: val = (void *)&fval; val2 = (void *)&fval2; val3 = (void *)&fval3; break; case C_LONG: val = (void *)&lval; val2 = (void *)&lval2; val3 = (void *)&lval3; break; default: GA_Error ((char *)"test_median:test_median:wrong data type.", type); } if (me == 0) printf ("Testing GA_Median..."); g_a->zero(); g_b->zero(); g_c->zero(); g_m->zero(); g_a->fill (val); g_b->fill (val2); g_c->fill (val3); g_m->median (g_a, g_b, g_c); /* The result array should be g_c due to the value I chose: val3 is the median of the three values val, val2, and val3 */ /* g_e = g_c - g_m */ g_e = GA::SERVICES.createGA (g_a, (char *)"E"); g_e->add (alpha, g_c, beta, g_m); switch (type) { case C_INT: max =(void *) &imax; min = (void *)&imin; break; case C_DCPL: max =(void *) &dcmax; min = (void *)&dcmin; break; case C_DBL: max = (void *)&dmax; min = (void *)&dmin; break; case C_FLOAT: max = (void *)&fmax; min = (void *)&fmin; break; case C_LONG: max = (void *)&lmax; min = (void *)&lmin; break; default: GA::SERVICES.error ((char *)"test_median:wrong data type.", type); } g_e->selectElem ((char *)"max", max, index); g_e->selectElem ((char *)"min", min, index); switch (type) { double r, m; case C_INT: if (me == 0) { if (MISMATCHED (imax, imin) || (imax != 0) || (imin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: r = dcmax.real - dcmin.real; m = dcmax.imag - dcmin.imag; if (me == 0) { if (MISMATCHED (dcmax.real, dcmin.real) || (dcmax.real != 0.0) || (dcmin.real != 0.0) || MISMATCHED (dcmax.imag, dcmin.imag) || (dcmax.imag != 0.0) || (dcmin.imag != 0.0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: if (me == 0) { if (MISMATCHED (dmax, dmin) || (dmax != 0) || (dmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: if (me == 0) { if (MISMATCHED (fmax, fmin) || (fmax != 0) || (fmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: if (me == 0) { if (MISMATCHED (lmax, lmin) || (lmax != 0) || (lmin != 0)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_median:wrong data type.", type); } } void test_norm_infinity (GA::GlobalArray * g_a) { void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; double norm_infinity = -1.0, result = -1.0; int me = GA_Nodeid (); int type, ndim, dims[MAXDIM]; g_a->inquire (&type, &ndim, dims); dcval.real = -2.0; dcval.imag = -0.0; switch (type) { case C_INT: val = (void *)&ival; break; case C_DCPL: val = (void *)&dcval; break; case C_DBL: val = (void *)&dval; break; case C_FLOAT: val =(void *) &fval; break; case C_LONG: val = (void *)&lval; break; default: GA::SERVICES.error ((char *)"test_norm_infinity:wrong data type.", type); } if (me == 0) printf ("Testing GA_Norm_infinity..."); g_a->fill (val); g_a->normInfinity (&norm_infinity); // GA_Print(g_a); //printf("norm_infinity = %lf\n",norm_infinity); switch (type) { case C_INT: result = (double) GA_ABS (ival); break; case C_LONG: result = (double) GA_ABS (lval); break; case C_FLOAT: result = (double) GA_ABS (fval); break; case C_DBL: result = GA_ABS (dval); break; case C_DCPL: result = sqrt (dcval.real * dcval.real + dcval.imag * dcval.imag); break; default: GA::SERVICES.error ((char *)"test_norm_infinity: wrong data type.\n", type); } result = result * dims[0]; if (me == 0) { if (MISMATCHED (result, norm_infinity)) printf ("not ok.\n"); else printf ("ok.\n"); } } void test_norm1 (GA::GlobalArray * g_a) { void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; double norm1 = 0.0, result = -1.0; int me = GA_Nodeid (); int type, ndim, dims[MAXDIM]; g_a->inquire (&type, &ndim, dims); dcval.real = -2.0; dcval.imag = -0.0; switch (type) { case C_INT: val = (void *)&ival; break; case C_DCPL: val =(void *) &dcval; break; case C_DBL: val = (void *)&dval; break; case C_FLOAT: val = (void *)&fval; break; case C_LONG: val = (void *)&lval; break; default: GA::SERVICES.error ((char *)"test_norm1:wrong data type.", type); } if (me == 0) printf ("Testing GA_Norm1..."); g_a->fill (val); g_a->norm1 (&norm1); // GA_Print(g_a); //printf("norm1=%lf\n", norm1); switch (type) { case C_INT: result = (double) GA_ABS (ival); break; case C_LONG: result = (double) GA_ABS (lval); break; case C_FLOAT: result = (double) GA_ABS (fval); break; case C_DBL: result = GA_ABS (dval); break; case C_DCPL: result = sqrt (dcval.real * dcval.real + dcval.imag * dcval.imag); break; default: GA::SERVICES.error ((char *)"test_norm1: wrong data type.\n", type); } result = result * dims[1]; if (me == 0) { if (MISMATCHED (result, norm1)) printf ("not ok.\n"); else printf ("ok.\n"); } } void test_get_diagonal (GA::GlobalArray * g_a, GA::GlobalArray * g_v) { int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; int idot, iresult, ldot, lresult; double fdot, ddot, fresult, dresult; DoubleComplex zdot, zresult; int type, ndim, dims[MAXDIM]; int vtype, vndim, vdims[MAXDIM]; g_a->inquire (&type, &ndim, dims); g_v->inquire (&vtype, &vndim, vdims); dcval.real = -2.0; dcval.imag = -0.0; switch (type) { case C_INT: val = (void *)&ival; break; case C_DCPL: val = (void *)&dcval; break; case C_DBL: val = (void *)&dval; break; case C_FLOAT: val =(void *) &fval; break; case C_LONG: val =(void *) &lval; break; default: GA::SERVICES.error ((char *)"test_get_diagonal:wrong data type.", type); } if (me == 0) printf ("Testing GA_Get_diagonal..."); g_v->zero (); g_a->fill (val); g_v->getDiagonal (g_a); switch (type) { case C_INT: idot = vdims[0] * ival * ival; iresult = g_v->idot (g_v); if (me == 0) { if (MISMATCHED (idot, iresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: ldot = ((long) vdims[0]) * lval * lval; lresult = g_v->ldot (g_v); if (me == 0) { if (MISMATCHED (ldot, lresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: fdot = ((float) vdims[0]) * fval * fval; fresult = g_v->fdot (g_v); if (me == 0) { if (MISMATCHED (fdot, fresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: ddot = ((double) vdims[0]) * dval * dval; dresult = g_v->ddot (g_v); if (me == 0) { if (MISMATCHED (ddot, dresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: zdot.real = ((double) vdims[0]) * (dcval.real * dcval.real - dcval.imag * dcval.imag); zdot.imag = ((double) vdims[0]) * (2.0 * dcval.real * dcval.imag); zresult = g_v->zdot (g_v); if (me == 0) { if (MISMATCHED (zdot.real, zresult.real) || MISMATCHED (zdot.imag, zresult.imag)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_get_diagonal:wrong data type:", type); } } void test_add_diagonal (GA::GlobalArray * g_a, GA::GlobalArray * g_v) { int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; int idot, iresult, ldot, lresult; double fdot, ddot, fresult, dresult; DoubleComplex zdot, zresult; int type, ndim, dims[MAXDIM]; int vtype, vndim, vdims[MAXDIM]; g_a->inquire (&type, &ndim, dims); dcval.real = -2.0; dcval.imag = -0.0; g_v->inquire (&vtype, &vndim, vdims); switch (type) { case C_INT: val =(void *) &ival; break; case C_DCPL: val = (void *)&dcval; break; case C_DBL: val =(void *) &dval; break; case C_FLOAT: val =(void *) &fval; break; case C_LONG: val = (void *)&lval; break; default: GA::SERVICES.error ((char *)"test_add_diagonal:wrong data type.", type); } if (me == 0) printf ("Testing GA_Add_diagonal..."); g_a->zero (); g_v->fill (val); g_a->setDiagonal (g_v); /*reassign value to val */ ival = 3; dval = 3.0; fval = 3.0; lval = 3; dcval.real = 3.0; dcval.imag = -0.0; /*refile the global array g_v */ g_v->fill (val); /*Add g_v to the diagonal of g_a */ g_a->addDiagonal (g_v); /*after this line, the g_a should only have 1 on the diagonal and zeros every where else */ switch (type) { case C_INT: idot = vdims[0]; iresult = g_a->idot (g_a); if (me == 0) { if (MISMATCHED (idot, iresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: ldot = ((long) vdims[0]); lresult = g_a->ldot (g_a); if (me == 0) { if (MISMATCHED (ldot, lresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: fdot = ((float) vdims[0]); fresult = g_a->fdot (g_a); if (me == 0) { if (MISMATCHED (fdot, fresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: ddot = (double) vdims[0]; dresult = g_a->ddot (g_a); if (me == 0) { if (MISMATCHED (ddot, dresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: zdot.real = ((double) vdims[0]); zdot.imag = 0.0; zresult = g_a->zdot (g_a); if (me == 0) { if (MISMATCHED (zdot.real, zresult.real) || MISMATCHED (zdot.imag, zresult.imag)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_add_diagonal:wrong data type:", type); } } void test_set_diagonal (GA::GlobalArray * g_a, GA::GlobalArray * g_v) { int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; int idot, iresult, ldot, lresult; double fdot, ddot, fresult, dresult; DoubleComplex zdot, zresult; int type, ndim, dims[MAXDIM]; int vtype, vndim, vdims[MAXDIM]; g_a->inquire (&type, &ndim, dims); g_v->inquire (&vtype, &vndim, vdims); dcval.real = -2.0; dcval.imag = -0.0; switch (type) { case C_INT: val = (void *)&ival; break; case C_DCPL: val = (void *)&dcval; break; case C_DBL: val = (void *)&dval; break; case C_FLOAT: val = (void *)&fval; break; case C_LONG: val =(void *) &lval; break; default: GA::SERVICES.error ((char *)"test_set_diagonal:wrong data type.", type); } if (me == 0) printf ("Testing GA_Set_diagonal..."); g_a->zero (); g_v->fill (val); g_a->setDiagonal (g_v); switch (type) { case C_INT: idot = vdims[0] * ival * ival; iresult = g_a->idot (g_a); if (me == 0) { if (MISMATCHED (idot, iresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: ldot = ((long) vdims[0]) * lval * lval; lresult = g_a->ldot (g_a); if (me == 0) { if (MISMATCHED (ldot, lresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: fdot = ((float) vdims[0]) * fval * fval; fresult = g_a->fdot (g_a); if (me == 0) { if (MISMATCHED (fdot, fresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: ddot = ((double) vdims[0]) * dval * dval; dresult = g_a->ddot (g_a); if (me == 0) { if (MISMATCHED (ddot, dresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: zdot.real = ((double) vdims[0]) * (dcval.real * dcval.real - dcval.imag * dcval.imag); zdot.imag = ((double) dims[0]) * (2.0 * dcval.real * dcval.imag); zresult = g_a->zdot (g_a); if (me == 0) { if (MISMATCHED (zdot.real, zresult.real) || MISMATCHED (zdot.imag, zresult.imag)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_set_diagonal:wrong data type:", type); } } void test_shift_diagonal (GA::GlobalArray *g_a) { int me = GA_Nodeid (); void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; int idot, iresult, ldot, lresult; double fdot, ddot, fresult, dresult; DoubleComplex zdot, zresult; int type, ndim, dims[MAXDIM]; int dim; /*the length of the diagonal */ g_a->inquire (&type, &ndim, dims); dim = GA_MIN (dims[0], dims[1]); dcval.real = -2.0; dcval.imag = -0.0; switch (type) { case C_INT: val = (void *)&ival; break; case C_DCPL: val = (void *)&dcval; break; case C_DBL: val = (void *)&dval; break; case C_FLOAT: val =(void *) &fval; break; case C_LONG: val =(void *) &lval; break; default: GA::SERVICES.error ((char *)"test_shift_diagonal:wrong data type.", type); } if (me == 0) printf ("Testing GA_Shift_diagonal..."); g_a->zero (); g_a->shiftDiagonal (val); switch (type) { case C_INT: idot = dim * ival * ival; iresult = g_a->idot (g_a); if (me == 0) { if (MISMATCHED (idot, iresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_LONG: ldot = ((long) dim) * lval * lval; lresult = g_a->ldot (g_a); if (me == 0) { if (MISMATCHED (ldot, lresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_FLOAT: fdot = ((float) dim) * fval * fval; fresult = g_a->fdot (g_a); if (me == 0) { if (MISMATCHED (fdot, fresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DBL: ddot = ((double) dim) * dval * dval; dresult = g_a->ddot (g_a); if (me == 0) { if (MISMATCHED (ddot, dresult)) printf ("not ok.\n"); else printf ("ok.\n"); } break; case C_DCPL: zdot.real = ((double) dim) * (dcval.real * dcval.real - dcval.imag * dcval.imag); zdot.imag = ((double) dim) * (2.0 * dcval.real * dcval.imag); zresult = g_a->zdot (g_a); if (me == 0) { if (MISMATCHED (zdot.real, zresult.real) || MISMATCHED (zdot.imag, zresult.imag)) printf ("not ok.\n"); else printf ("ok.\n"); } break; default: GA::SERVICES.error ((char *)"test_shift_diagonal:wrong data type: ", type); } } void do_work (int type, int op) { GA::GlobalArray *g_a, *g_b, *g_c, *g_m, *g_v; int n = N; int dims[2] = { N, /*N columns */ N + 2 /*N+2 rows */ }; int vdim; int lo[2], hi[2]; lo[0] = 1; hi[0] = dims[0] - 1; lo[1] = 1; hi[1] = dims[1] - 1; switch (op) { case OP_SHIFT_DIAGONAL: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); test_shift_diagonal (g_a); g_a->destroy(); break; case OP_SET_DIAGONAL: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*find out the diagonal length of the matrix A */ vdim = GA_MIN (dims[0], dims[1]); g_v = GA::SERVICES.createGA (type, 1, &vdim, (char *)"V", NULL); test_set_diagonal (g_a, g_v); g_a->destroy (); g_v->destroy (); break; case OP_ADD_DIAGONAL: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*find out the diagonal length of the matrix A */ vdim = GA_MIN (dims[0], dims[1]); g_v = GA::SERVICES.createGA (type, 1, &vdim, (char *)"V", NULL); test_add_diagonal (g_a, g_v); g_a->destroy (); g_v->destroy (); break; case OP_GET_DIAGONAL: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*find out the diagonal length of the matrix A */ vdim = GA_MIN (dims[0], dims[1]); g_v = GA::SERVICES.createGA (type, 1, &vdim, (char *)"V", NULL); test_get_diagonal (g_a, g_v); g_a->destroy (); g_v->destroy (); break; case OP_NORM1: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); if (!g_a) GA_Error ((char *)"create failed: A", n); test_norm1 (g_a); g_a->destroy (); break; case OP_NORM_INFINITY: g_a = GA::SERVICES.createGA (type, 2, dims,(char *) "A", NULL); test_norm_infinity (g_a); g_a->destroy (); break; case OP_MEDIAN: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*duplicate g_a */ g_b = GA::SERVICES.createGA (g_a, (char *)"B"); g_c = GA::SERVICES.createGA (g_a, (char *)"C"); #if 0 //test g_m is different from g_a, g_b, amd g_c g_m = GA::SERVICES.createGA (g_a, (char *)"M"); test_median (g_a, g_b, g_c, g_m); #else //test g_m = g_c test_median (g_a, g_b, g_c, g_a); #endif g_a->destroy (); g_b->destroy (); g_c->destroy (); #if 0 //test g_m is different from g_a, g_b, g_c g_m->destroy (); #endif break; case OP_MEDIAN_PATCH: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*duplicate g_a */ g_b = GA::SERVICES.createGA (g_a, (char *)"B"); g_c = GA::SERVICES.createGA (g_a, (char *)"C"); g_m = GA::SERVICES.createGA (g_a, (char *)"M"); test_median_patch (g_a, lo, hi, g_b, lo, hi, g_c, lo, hi, g_m, lo, hi); g_a->destroy (); g_b->destroy (); g_c->destroy (); g_m->destroy (); break; case OP_SCALE_ROWS: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*find out the diagonal length of the matrix A */ vdim = dims[1]; g_v = GA::SERVICES.createGA (type, 1, &vdim, (char *)"V", NULL); test_scale_rows (g_a, g_v); g_a->destroy (); g_v->destroy (); break; case OP_SCALE_COLS: g_a = GA::SERVICES.createGA (type, 2, dims, (char *)"A", NULL); /*find out the diagonal length of the matrix A */ vdim = dims[0]; g_v = GA::SERVICES.createGA (type, 1, &vdim, (char *)"V", NULL); test_scale_cols (g_a, g_v); g_a->destroy (); g_v->destroy (); break; default: GA::SERVICES.error ((char *)"test_function: wrong operation.", op); } } int main(int argc, char *argv[]) { int me, nproc; int heap = 200000, stack = 200000; int op; GA::Initialize(argc, argv, heap, stack, GA_DATA_TYPE, 0); me=GA_Nodeid(); nproc=GA_Nnodes(); if(!me) cout << "Using " << nproc << " processes\n"; for (op = 1; op < 11; op++) { if(me == 0) printf ("\n\n"); if (me == 0) printf ("type = C_INT \t "); do_work (C_INT, op); if (me == 0) printf ("type = C_LONG \t "); do_work (C_LONG, op); if (me == 0) printf ("type = C_FLOAT \t "); do_work (C_FLOAT, op); if (me == 0) printf ("type = C_DBL \t "); do_work (C_DBL, op); if (me == 0) printf ("type = C_DCPL \t "); do_work (C_DCPL, op); } if(!me) cout << "Terminating\n"; GA::Terminate(); } ga-5-4/ga++/testing/testmult.cc0000644000175000017500000001201312662210515014407 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include /* utilities for GA test programs */ #include "testutil.h" #if HAVE_MATH_H # include #endif #define N 256 /* first dimension */ #define BASE 0 #define PERMUTE_ #define GA_DATA_TYPE MT_C_FLOAT #define GA_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define TOLERANCE 0.000001 #ifdef MSG_COMMS_MPI #include #define CLOCK_ MPI_Wtime #else #include "tcgmsg.h" #define CLOCK_ tcg_time #endif DoublePrecision gTime=0.0, gStart; void test(int data_type, int ndim) { int me=GA_Nodeid(); GA::GlobalArray *g_a, *g_b, *g_c, *g_A, *g_B, *g_C; int dims[GA_MAX_DIM]={N,N,2,2,2,1,1}; int lo[GA_MAX_DIM]={1,1,1,1,1,0,0}; int hi[GA_MAX_DIM]={N-2,N-2,1,1,1,0,0}; int clo[2], chi[2], m, n, k; double value1_dbl = 2.0, value2_dbl = 2.0; double alpha_dbl = 1.0, beta_dbl = 0.0; float value1_flt = 2.0, value2_flt = 2.0; float alpha_flt = 1.0, beta_flt = 0.0; DoubleComplex value1_dcpl = {2.0, 2.0}, value2_dcpl = {2.0, 2.0}; DoubleComplex alpha_dcpl = {1.0, 0.0} , beta_dcpl = {0.0, 0.0}; void *value1, *value2, *alpha, *beta; char name_a[] = "array A"; char name_b[] = "array B"; char name_c[] = "array C"; char name_a_[] = "array A_"; char name_b_[] = "array B_"; char name_c_[] = "array C_"; switch (data_type) { case C_FLOAT: alpha = (void *)&alpha_flt; beta = (void *)&beta_flt; value1 = (void *)&value1_flt; value2 = (void *)&value2_flt; if(me==0) printf("Single Precision: Testing GA_Sgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; case C_DBL: alpha = (void *)&alpha_dbl; beta = (void *)&beta_dbl; value1 = (void *)&value1_dbl; value2 = (void *)&value2_dbl; if(me==0) printf("Double Precision: Testing GA_Dgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; case C_DCPL: alpha = (void *)&alpha_dcpl; beta = (void *)&beta_dcpl; value1 = (void *)&value1_dcpl; value2 = (void *)&value2_dcpl; if(me==0) printf("Double Complex: Testing GA_Zgemm,NGA_Matmul_patch for %d-Dimension", ndim); break; default: GA::SERVICES.error("wrong data type", data_type); } g_a = GA::SERVICES.createGA(data_type, ndim, dims, name_a, NULL); g_b = GA::SERVICES.createGA(g_a, name_b); g_c = GA::SERVICES.createGA(g_a, name_c); g_a->fill(value1); g_b->fill( value2); g_c->zero(); /** g_c = g_a * g_b */ g_c->matmulPatch('N', 'N', alpha, beta, g_a, lo, hi, g_b, lo, hi, lo, hi); g_a->destroy(); g_b->destroy(); /** * Verifying g_c: * 1. Create g_A(=g_a) and g_B(=g_b) * 2. g_C = g_A*g_B; (Using Gemm routines) * 3. g_A = g_c; (copy the 2-d patch og g_c into g_A) * 4. g_C = g_A - g_C; (Using add() routine by making beta=-1.0) * 5. If all the elements in g_C is zero, implies SUCCESS. */ dims[0] = dims[1] = m = n = k = N-2; g_A = GA::SERVICES.createGA(data_type, 2, dims, name_a_, NULL); g_B = GA::SERVICES.createGA(g_A, name_b_); g_C = GA::SERVICES.createGA(g_A, name_c_); g_A->fill(value1); g_B->fill(value2); g_C->zero(); gStart = CLOCK_(); switch (data_type) { case C_FLOAT: g_C->sgemm('N', 'N', m, n, k, alpha_flt, g_A, g_B, beta_flt); beta_flt = -1.0; break; case C_DBL: g_C->dgemm('N', 'N', m, n, k, alpha_dbl, g_A, g_B, beta_dbl); beta_dbl = -1.0; break; case C_DCPL: g_C->zgemm('N', 'N', m, n, k, alpha_dcpl, g_A, g_B, beta_dcpl); beta_dcpl.real = -1.0; break; default: GA::SERVICES.error("wrong data type", data_type); } gTime += CLOCK_()-gStart; g_B->destroy(); clo[0] = clo[1] = 0; chi[0] = chi[1] = N-3; g_A->copyPatch('N', g_c, lo, hi, clo, chi) ; g_C->add(alpha, g_A, beta, g_C); switch (data_type) { case C_FLOAT: value1_flt = g_C->fdot(g_C); if(value1_flt != 0.0) GA::SERVICES.error("GA_Sgemm, NGA_Matmul_patch Failed", 0); break; case C_DBL: value1_dbl = g_C->ddot(g_C); if(value1_dbl != 0.0) GA::SERVICES.error("GA_Dgemm, NGA_Matmul_patch Failed", 0); break; case C_DCPL: value1_dcpl = g_C->zdot(g_C); if(value1_dcpl.real != 0.0 || value1_dcpl.imag != 0.0) GA::SERVICES.error("GA_Zgemm, NGA_Matmul_patch Failed", 0); break; default: GA::SERVICES.error("wrong data type", data_type); } if(me==0) printf("....OK\n"); g_A->destroy(); g_c->destroy(); g_C->destroy(); } void do_work() { int i; int me = GA_Nodeid(); for(i=2; i<=GA_MAX_DIM; i++) { test(C_FLOAT, i); test(C_DBL, i); test(C_DCPL, i); if(me == 0) printf("\n\n"); GA::SERVICES.sync(); } } int main(int argc, char **argv) { Integer heap=9000000, stack=9000000; int me; DoublePrecision time; GA::Initialize(argc, argv, heap, stack, GA_DATA_TYPE, 0); me=GA_Nodeid(); time = CLOCK_(); do_work(); #ifdef TIME printf("%d Total Time = %lf\n", me, CLOCK_()-time); printf("%d GEMM Total Time = %lf\n", me, gTime); #endif if(me==0)printf("\nSuccessfull\n\n"); GA::Terminate(); return 0; } ga-5-4/ga++/testing/testutil.h0000644000175000017500000000201512662210515014246 0ustar mbamba#define add_range_ F77_FUNC_(add_range,ADD_RANGE) #define compare_patches_ F77_FUNC_(compare_patches,COMPARE_PATCHES) #define copy_range_ F77_FUNC_(copy_range,COPY_RANGE) #define dot_range_ F77_FUNC_(dot_range,DOT_RANGE) #define init_array_ F77_FUNC_(init_array,INIT_ARRAY) #define print_range_ F77_FUNC_(print_range,PRINT_RANGE) #define scale_patch_ F77_FUNC_(scale_patch,SCALE_PATCH) #define util_mdtob_ F77_FUNC_(util_mdtob,UTIL_MDTOB) #define util_mitob_ F77_FUNC_(util_mitob,UTIL_MITOB) #define util_timer_ F77_FUNC_(util_timer,UTIL_TIMER) #ifdef __cplusplus extern "C" { #endif extern void get_range( int ndim, int dims[], int lo[], int hi[]); extern void new_range(int ndim, int dims[], int lo[], int hi[], int new_lo[], int new_hi[]); extern void print_range(char *pre,int ndim, int lo[], int hi[], char* post); extern void print_subscript(char *pre,int ndim, int subscript[], char* post); extern void print_distribution(int g_a); #ifdef __cplusplus } #endif ga-5-4/ga++/testing/elempatch.cc0000644000175000017500000002320512662210515014475 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include using namespace std; #include "ga++.h" #define N 10 // First dimension #define NDIM 4 // Number of dimensions #define BASE 0 #define PERMUTE_ #define GA_DATA_TYPE MT_F_REAL #define MAXDIM GA_MAX_DIM #define C_DBL MT_C_DBL #define C_INT MT_C_INT #define C_FLOAT MT_C_FLOAT #define C_DCPL MT_C_DCPL #define C_LONG MT_C_LONGINT #define C_SCPL MT_C_SCPL #define GA_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define GA_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define THRESH 1e-5 #define MISMATCHED(x,y) GA_ABS((x)-(y))>=THRESH #define OP_ELEM_MULT 0 #define OP_ELEM_DIV 1 #define OP_ELEM_MAX 2 #define OP_ELEM_MIN 3 #define OP_ABS 4 #define OP_ADD_CONST 5 #define OP_RECIP 6 #define MY_TYPE 2002 /* Integer _ga_lo[MAXDIM], _ga_hi[MAXDIM], _ga_work[MAXDIM];*/ # define COPYINDEX_C2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i]+1;} int test_fun (int type, int dim, int OP) { GA::GlobalArray *g_a, *g_b, *g_c, *g_d, *g_e; int me = GA_Nodeid (); int i; int dims[MAXDIM]; int lo[MAXDIM], hi[MAXDIM]; int index[MAXDIM]; void *val; int ival = -2; double dval = -2.0; float fval = -2.0; long lval = -2; DoubleComplex dcval; void *val2; int ival2 = -3; double dval2 = -3.0; float fval2 = -3.0; long lval2 = -3; DoubleComplex dcval2; int ok = 1; int result; void *min, *max; float fmin, fmax; long lmin, lmax; double dmin, dmax; DoubleComplex dcmin, dcmax; void *alpha, *beta; int ai = 1, bi = -1; long al = 1, bl = -1; float af = 1.0, bf = -1.0; double ad = 1.0, bd = -1.0; DoubleComplex adc, bdc; char name_A[] = "A"; char name_B[] = "B"; char name_C[] = "C"; char name_D[] = "D"; char name_E[] = "E"; char name_max[] = "max"; char name_min[] = "min"; adc.real = 1.0; adc.imag = 0.0; bdc.real = -1.0; bdc.imag = 0.0; dcval.real = -sin (3.0); dcval.imag = -cos (3.0); dcval2.real = 2 * sin (3.0); dcval2.imag = 2 * cos (3.0); for (i = 0; i < dim; i++) dims[i] = N; for (i = 0; i < dim; i++) { lo[i] = 0; hi[i] = N - 1; } g_a = GA::SERVICES.createGA (type, dim, dims, name_A, NULL); g_b = GA::SERVICES.createGA (g_a, name_B); g_c = GA::SERVICES.createGA (g_a, name_C); g_d = GA::SERVICES.createGA (g_a, name_D); g_e = GA::SERVICES.createGA (g_a, name_E); /*initialize with zero */ g_a->zero (); g_b->zero (); g_c->zero (); g_d->zero (); g_e->zero (); switch (type) { case C_INT: val = (void *)&ival; val2 = (void *)&ival2; break; case C_DCPL: val = (void *)&dcval; val2 = (void *)&dcval2; break; case C_DBL: val = (void *)&dval; val2 = (void *)&dval2; break; case C_FLOAT: val = (void *)&fval; val2 = (void *)&fval2; break; case C_LONG: val = (void *)&lval; val2 = (void *)&lval2; break; default: GA::SERVICES.error ("wrong data type.", type); } g_a->fillPatch (lo, hi, val); switch (OP) { double tmp, tmp2; DoubleComplex dctemp; case OP_ABS: if (me == 0) printf ("Testing GA_Abs_value..."); g_a->absValuePatch (lo, hi); ival = GA_ABS (ival); dval = GA_ABS (dval); fval = GA_ABS (fval); lval = GA_ABS (lval); dcval.real = dcval.real * dcval.real + dcval.imag * dcval.imag; dcval.imag = 0.0; g_d->fillPatch (lo, hi, val); break; case OP_ADD_CONST: if (me == 0) printf ("Testing GA_Add_const..."); g_a->addConstantPatch (lo, hi, val2); ival = ival + ival2; dval = dval + dval2; fval = fval + fval2; lval = lval + lval2; dcval.real = dcval.real + dcval2.real; dcval.imag = dcval.imag + dcval2.imag; g_d->fillPatch (lo, hi, val); break; case OP_RECIP: if (me == 0) printf ("Testing GA_Recip..."); g_a->recipPatch (lo, hi); ival = 1 / ival; dval = 1.0 / dval; fval = 1.0 / fval; lval = 1 / lval; tmp = dcval.real * dcval.real + dcval.imag * dcval.imag; dcval.real = dcval.real / tmp; dcval.imag = -dcval.imag / tmp; g_d->fillPatch (lo, hi, val); break; case OP_ELEM_MULT: if (me == 0) printf ("Testin GA_Elem_multiply..."); g_b->fillPatch (lo, hi, val); #if 0 //g_c is different from g_a or g_b g_c->elemMultiplyPatch (g_a, lo, hi, g_b, lo, hi, lo, hi); #else //g_c is g_b g_b->elemMultiplyPatch (g_a, lo, hi, g_b, lo, hi, lo, hi); #endif ival = ival * ival2; dval = dval * dval2; fval = fval * fval2; lval = lval * lval2; dctemp.real = dcval.real * dcval2.real - dcval.imag * dcval2.imag; dctemp.imag = dcval.real * dcval2.imag + dcval2.real * dcval.imag; dcval = dctemp; g_d->fillPatch (lo, hi, val); break; case OP_ELEM_DIV: if (me == 0) printf ("Testin GA_Elem_divide..."); g_b->fillPatch (lo, hi, val2); g_c->elemDividePatch (g_a, lo, hi, g_b, lo, hi, lo, hi); ival = ival / ival2; dval = dval / dval2; fval = fval / fval2; lval = lval / lval2; tmp = dcval2.real * dcval2.real + dcval2.imag * dcval2.imag; dctemp.real = (dcval.real * dcval2.real + dcval.imag * dcval2.imag) / tmp; dctemp.imag = (-dcval.real * dcval2.imag + dcval2.real * dcval.imag) / tmp; dcval = dctemp; g_d->fillPatch (lo, hi, val); break; case OP_ELEM_MAX: if (me == 0) printf ("Testin GA_Elem_maximum..."); g_b->fillPatch (lo, hi, val2); g_c->elemMaximumPatch (g_a, lo, hi, g_b, lo, hi, lo, hi); ival = GA_MAX (ival, ival2); dval = GA_MAX (dval, dval2); fval = GA_MAX (fval, fval2); lval = GA_MAX (lval, lval2); tmp = dcval.real * dcval.real + dcval.imag * dcval.imag; tmp2 = dcval2.real * dcval2.real + dcval2.imag * dcval2.imag; if (tmp2 > tmp) dcval = dcval2; g_d->fillPatch (lo, hi, val); break; case OP_ELEM_MIN: if (me == 0) printf ("Testin GA_Elem_minimum..."); g_b->fillPatch (lo, hi, val2); g_c->elemMinimumPatch (g_a, lo, hi, g_b, lo, hi, lo, hi); ival = GA_MIN (ival, ival2); dval = GA_MIN (dval, dval2); fval = GA_MIN (fval, fval2); lval = GA_MIN (lval, lval2); tmp = dcval.real * dcval.real + dcval.imag * dcval.imag; tmp2 = dcval2.real * dcval2.real + dcval2.imag * dcval2.imag; if (tmp2 < tmp) dcval = dcval2; g_d->fillPatch (lo, hi, val); break; default: GA::SERVICES.error ("test_function: wrong operation.", OP); } switch (type) { case C_INT: alpha = (void *)&ai; beta = (void *)&bi; break; case C_DCPL: alpha = (void *)&adc; beta = (void *)&bdc; break; case C_DBL: alpha = (void *)&ad; beta = (void *)&bd; break; case C_FLOAT: alpha = (void *)⁡ beta =(void *) &bf; break; case C_LONG: alpha = (void *)&al; beta = (void *)&bl; break; default: GA::SERVICES.error ("wrong data type.", type); } if (OP < 4) g_e->addPatch (alpha, g_c, lo, hi, beta, g_d, lo, hi, lo, hi); else g_e->addPatch (alpha, g_a, lo, hi, beta, g_d, lo, hi, lo, hi); switch (type) { case C_INT: max = (void *)&lmax; min = (void *)&lmin; break; case C_DCPL: max = (void *)&dcmax; min = (void *)&dcmin; break; case C_DBL: max = (void *)&dmax; min = (void *)&dmin; break; case C_FLOAT: max = (void *)&fmax; min = (void *)&fmin; break; case C_LONG: max = (void *)&lmax; min = (void *)&lmin; break; default: GA::SERVICES.error ("wrong data type.", type); } g_e->selectElem (name_max, max, index); g_e->selectElem (name_min, min, index); switch (type) { double r, im; case C_INT: result = lmax - lmin; break; case C_DCPL: r = dcmax.real - dcmin.real; im = dcmax.imag - dcmin.imag; result = (int) (GA_ABS (r) + GA_ABS (im)); break; case C_DBL: result = (int) (dmax - dmin); break; case C_FLOAT: result = (int) (fmax - fmin); break; case C_LONG: result = (int) (lmax - lmin); break; default: GA::SERVICES.error ("wrong data type.", type); } if (me == 0) { if (MISMATCHED (result, 0)) printf ("is not ok\n"); else printf ("is ok.\n"); } /* g_a->printPatch(lo, hi, 1); g_d->printPatch(lo, hi, 1); g_a->printPatch(lo, hi, 1); */ g_a->destroy (); g_b->destroy (); g_c->destroy (); g_d->destroy (); g_e->destroy (); return ok; } int main(int argc, char *argv[]) { int me, nproc; int heap = 200000, stack = 200000; int d, op, ok = 1; GA::Initialize(argc, argv, heap, stack, GA_DATA_TYPE, 0); me=GA_Nodeid(); nproc=GA_Nnodes(); cout << "Rank = " << me << " : Size = " << nproc << "\n"; cout << "After Initialize()\n"; for (op = 0; op < 7; op++) { for (d = 1; d < 4; d++) { if (me == 0) printf ("\n\ndim =%d\n\n", d); if (me == 0) printf ("data type: int\t\t"); ok = test_fun (C_INT, d, op); if (me == 0) printf ("data type: double\t"); ok = test_fun (C_DBL, d, op); if (me == 0) printf ("data type: float\t"); ok = test_fun (C_FLOAT, d, op); if (me == 0) printf ("data type: long\t\t"); ok = test_fun (C_LONG, d, op); if (me == 0) printf ("data type: complex\t"); test_fun (C_DCPL, d, op); } } if(!me) cout << "Terminating\n"; GA::Terminate(); } ga-5-4/ga++/testing/testc.cc0000644000175000017500000000474212662210515013662 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include using namespace std; #include "ga++.h" #define N 5 #define GA_DATA_TYPE MT_F_REAL /* using std::cout; using std::printf; using std::sin; using std::endl; */ int main(int argc, char *argv[]) { int ONE=1; /* useful constants */ int n=N, type=MT_F_DBL; int me, nproc; int i, row; int dims[2]={N,N}; int lo[2], hi[2]; /* Note: on all current platforms DoublePrecision == double */ double buf[N], err, alpha, beta; int heap = 200000; int stack = 200000; GA::Initialize(argc, argv, heap, stack, GA_DATA_TYPE, 0); me = GA_Nodeid(); nproc = GA_Nnodes(); if(me==0)printf("Size: %d: Creating matrix A\n", nproc); GA::GlobalArray *g_a = GA::SERVICES.createGA(type, 2, dims, (char *)"A", NULL); if(me==0)printf("OK\n"); if(me==0)printf("Creating matrix B\n"); /* create matrix B so that it has dims and distribution of A*/ GA::GlobalArray *g_b = GA::SERVICES.createGA(g_a, (char *)"B"); if(me==0)printf("OK\n"); g_a->zero(); /* zero the matrix */ if(me==0)printf("Initializing matrix A\n"); /* fill in matrix A with random values in range 0.. 1 */ lo[1]=0; hi[1]=n-1; for(row=me; rowput(lo, hi, buf, &n); } // g_a->print(); if(me==0)printf("Symmetrizing matrix A\n"); g_a->symmetrize(); /* symmetrize the matrix A = 0.5*(A+A') */ /* check if A is symmetric */ if(me==0)printf("Checking if matrix A is symmetric\n"); g_a->transpose(g_b); /* B=A' */ alpha=1.; beta=-1.; g_b->add(&alpha, g_a, &beta, g_b); /* B= A - B */ err= g_b->ddot(g_b); if(me==0)printf("Error=%f\n",(double)err); if(me==0)printf("\nChecking atomic accumulate \n"); g_a->zero(); /* zero the matrix */ for(i=0; iacc(lo, hi, buf, &ONE, &alpha ); GA::SERVICES.sync(); if(me==0){ /* node 0 is checking the result */ g_a->get(lo, hi, buf,&ONE); for(i=0; idestroy(); g_b->destroy(); if(me==0) cout << "Terminating...\n"; GA::Terminate(); } ga-5-4/ga++/testing/ntestc.cc0000644000175000017500000001400212662210515014026 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include using namespace std; #include "testutil.h" #include "ga++.h" #define N 10 // First dimension #define NDIM 4 // Number of dimensions #define BASE 0 #define PERMUTE_ #define GA_DATA_TYPE MT_F_REAL void fillPatch(double *ptr, int dim[], int ld[], int ndim, double val) { int i, j, stride=1; switch (ndim){ case 0: GA_Error((char *)"fill_patch: error",ndim); case 1: for(i=0;i handle()); /* print info about array we got */ g_a->inquire(&type, &ndim, adims); if(me==0)printf("After Inquire\n"); g_a->printDistribution(); GA::SERVICES.sync(); /* duplicate array A with ga_create irreg rather than ga_duplicate * -- want to show distribution control * -- with ga_duplicate it would be g_b=GA_Duplicate(g_a,name) */ if(me==0)printf("\nReconstructing distribution description for A\n"); /* get memory for arrays describing distribution */ proclist = (int*)malloc(nproc*sizeof(int)); if(!proclist)GA_Error((char *)"malloc failed for proclist",0); regions = (patch_t*)malloc(nproc*sizeof(patch_t)); if(!regions)GA_Error((char *)"malloc failed for regions",0); map = (int*)malloc((nproc+ndim)*sizeof(int)); /* ubound= nproc+mdim */ if(!map)GA_Error((char *)"malloc failed for map",0); /* first find out how array g_a is distributed */ for(i=0;ilocateRegion(lo, hi, (int*)regions, proclist); if(proc<1) GA_Error((char *)"error in NGA_Locate_region",proc); /* determine blocking for each dimension */ for(i=0;iadims[d] ){ map[offset] = regions[i].lo[d]; offset++; block[d]++; adims[d]= regions[i].hi[d]; } if(me==0){ printf("Distribution map contains %d elements\n",offset); print_subscript((char *)"number of blocks for each dimension", ndim,block,(char *)"\n"); print_subscript((char *)"distribution map",offset,map,(char *)"\n\n"); fflush(stdout); } if(me==0)printf("Creating array B applying distribution of A\n"); # ifdef USE_DUPLICATE GA::GlobalArray *g_b = GA::SERVICES.createGA(g_a, "array B"); # else GA::GlobalArray *g_b = GA::SERVICES.createGA(MT_F_DBL, NDIM, dims, (char *)"array B", block, map); # endif if(!g_b) GA_Error((char *)"create failed: B",0); if(me==0)printf("OK\n\n"); free(proclist); free(regions); free(map); g_b->printDistribution(); GA::SERVICES.sync(); if(me==0){ printf("\nCompare distributions of A and B\n"); if(g_a->compareDistr(g_b)) printf("Failure: distributions NOT identical\n"); else printf("Success: distributions identical\n"); fflush(stdout); } if(me==0){ printf("\nAccessing local elements of A: set them to the owner process id\n"); fflush(stdout); } GA::SERVICES.sync(); g_a->distribution(me, lo, hi); if(hi[0]>=0){/* -1 means no elements stored on this processor */ double *ptr; int locdim[NDIM]; g_a->access(lo, hi, &ptr, ld); for(i=0;i=0){ char msg[100]; sprintf(msg,(char *)"%d: leading dimensions",me); print_subscript(msg,ndim-1,ld,(char *)"\n"); fflush(stdout); } GA::SERVICES.sync(); } GA::SERVICES.sync(); if(me==0)printf("\nRandomly checking the update using ga_get on array sections\n"); GA::SERVICES.sync(); /* show ga_get working and verify array updates * every process does N random gets * for simplicity get only a single row at a time */ srand(me); /* different seed for every process */ hi[ndim-1]=adims[ndim-1] -1 + BASE; for(i=1;iget(lo, hi, buf, ld); /* check values */ for(i=0;ilocate(lo); if((double)p != buf[i]) { char msg[100]; sprintf(msg,(char *)"%d: wrong value: %d != %f a",me, p, buf[i]); print_subscript(msg,ndim,lo,(char *)"\n"); GA_Error((char *)"Error - bye",i); } lo[ndim-1]++; } } free(buf); GA::SERVICES.sync(); if(me==0)printf("OK\n"); g_a->destroy(); g_b->destroy(); if(!me) cout << "Terminating\n"; GA::Terminate(); } ga-5-4/ga++/testing/util.c0000644000175000017500000002574012662210515013353 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_ASSERT_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #ifdef MSG_COMMS_MPI # include #else # include #endif #include "ga.h" #include "macdecls.h" #include "testutil.h" #include "globalp.h" /*#define MAXDIM 10*/ #define BASE 100 /***************************** macros ************************/ #define COPY(src, dst, bytes) memcpy((dst),(src),(bytes)) #define GA_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define GA_MIN(a,b) (((a) <= (b)) ? (a) : (b)) /*#define GA_ABS(a) (((a) <0) ? -(a) : (a))*/ /*\ generate random range for a section of multidimensional array \*/ void get_range( int ndim, int dims[], int lo[], int hi[]) { int dim; for(dim=0; dim 0)? rand()%range : lo[dim]; new_lo[dim] = toss; new_hi[dim] = toss + diff -1; assert(new_hi[dim] < dims[dim]); assert(diff == (new_hi[dim] -new_lo[dim]+1)); } } /*\ print range of n-dimensional array with two strings before and after \*/ void print_range(char *pre,int ndim, int lo[], int hi[], char* post) { int i; printf("%s[",pre); for(i=0;i # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = NO # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvances is that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans.ttf # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES ga-5-4/ga++/src/0000755000175000017500000000000012662210515011334 5ustar mbambaga-5-4/ga++/src/ga++.h0000644000175000017500000000333112662210515012222 0ustar mbamba/** * @file ga++.h * * @author Manoj Kumar Krishnan, PNNL. * @author Jeff Daily, PNNL. */ /** * @mainpage * * @author Manoj Kumar Krishnan, PNNL. * @author Jeff Daily, PNNL. * * The GA Toolkit * * The Global Arrays (GA) toolkit provides an efficient and portable * “shared-memory” programming interface for distributed-memory computers. * Each process in a MIMD parallel program can asynchronously access logical * blocks of physically distributed dense multi-dimensional arrays, without * need for explicit cooperation by other processes. Unlike other * shared-memory environments, the GA model exposes to the programmer the * non-uniform memory access (NUMA) characteristics of the high performance * computers and acknowledges that access to a remote portion of the shared * data is slower than to the local portion. The locality information for the * shared data is available, and a direct access to the local portions of * shared data is provided. * * Global Arrays have been designed to complement rather than substitute for * the message-passing programming model. The programmer is free to use both * the shared-memory and message-passing paradigms in the same program, and to * take advantage of existing message-passing software libraries. Global * Arrays are compatible with the Message Passing Interface (MPI). * * The Global Arrays toolkit has been in the public domain since 1994. It has * been actively supported and employed in several large codes since then. */ #ifndef _GAPP_H #define _GAPP_H #include "ga.h" #include "macdecls.h" #define GANbhdl ga_nbhdl_t #include "init_term.h" #include "services.h" #include "PGroup.h" #include "GlobalArray.h" #include "GAServices.h" #endif // _GAPP_H ga-5-4/ga++/src/PGroup.h0000644000175000017500000001652012662210515012725 0ustar mbamba#ifndef _PGROUP_H #define _PGROUP_H namespace GA { /** * PGroup class description TODO. */ class PGroup { public: /** * This constructor creates a processor group. * * It must be invoked by all processors in the current default processor * group. The list of processors use the indexing scheme of the default * processor group. If the default processor group is the world group, then * these indices are the usual processor indices. This function returns a * process group handler that can be used to reference this group by other * functions. * * This is a collective operation on the default processor group. * * @param[in] plist [size] list of processor IDs in group * @param[in] size number of processors in group * */ PGroup(int *plist, int size); /** * PGroup destructor. */ ~PGroup(); /* access the data */ /** @return the array handle */ int handle() const { return mPHandle; } /* Process Group Operations - static */ /** * This function will return a handle to the default processor group, * which can then be used to create a global array using one of the * create_*_config or setPGroup calls. * * This is a local operation. * * @return the new PGroup */ static PGroup* getDefault(); /** * This function will return a handle to the mirrored processor group, * which can then be used to create a global array using one of the * GA create_*_config or setPgroup calls. * * This is a local operation. * * @return the new PGroup */ static PGroup* getMirror(); /** * This function will return a handle to the world processor group, * which can then be used to create a global array using one of the * GA create_*_config or GA_Set_pgroup calls. * * This is a local operation. * * @return the new PGroup */ static PGroup* getWorld(); /** * This function can be used to reset the default processor group on a * collection of processors. * * All processors in the group referenced by p_handle must make a call to * this function. Any standard global array call that is made after * resetting the default processor group will be restricted to processors in * that group. Global arrays that are created after resetting the default * processor group will only be defined on that group and global operations * such as sync or igop will be restricted to processors in that group. The * pgroupSetDefault call can be used to rapidly convert large applications, * written with GA, into routines that run on processor groups. * * The default processor group can be overridden by using GA calls that * require an explicit group handle as one of the arguments. * * This is a collective operation on the group represented by the handle * p_handle. * * @param[in] p_handle processor group handle */ static void setDefault(PGroup* p_handle); /* Process Group Operations */ /** * Broadcast data from processor specified by root to all other * processors in this processor group. * * The length of the message in bytes is specified by lenbuf. The initial and * broadcasted data can be found in the buffer specified by the pointer * buf. * * This is a collective operation on the processor group. * * @param[in,out] buf pointer to buffer containing data * @param[in] lenbuf length of data (in bytes) * @param[in] root processor sending message */ void brdcst(void* buf, int lenbuf, int root); /** * The pgroup gop 'sums' all elements in buf[n] across all processors in the * group using the commutative operation specified by the character string op. * * buf[n] is a double precision array present on each processor in the * processor group. The result is broadcast to all processor in this group. * Allowed strings are "+", "*", "max", "min", "absmax", "absmin". The use of * lowerecase for operators is necessary. * * This is a collective operation on the processor group. * * @param[in,out] buf buffer containing data * @param[in] n number of elements in x * @param[in] op operation to be performed */ void gop(double *buf, int n, char* op); /** * The gop 'sums' all elements in buf[n] across all processors in the group * using the commutative operation specified by the character string op. * * buf[n] is an integer(int) array present on each processor in the * processor group. The result is broadcast to all processor in this group. * Allowed strings are "+", "*", "max", "min", "absmax", "absmin". The use of * lowerecase for operators is necessary. * * This is a collective operation on the processor group. * * @param[in,out] buf buffer containing data * @param[in] n number of elements in x * @param[in] op operation to be performed */ void gop(int *buf, int n, char* op); /** * The gop 'sums' all elements in buf[n] across all processors in the group * using the commutative operation specified by the character string op. * * buf[n] is an integer(long) array present on each processor in the * processor group. The result is broadcast to all processor in this group. * Allowed strings are "+", "*", "max", "min", "absmax", "absmin". The use of * lowerecase for operators is necessary. * * This is a collective operation on the processor group. * * @param[in,out] buf buffer containing data * @param[in] n number of elements in x * @param[in] op operation to be performed */ void gop(long *buf, int n, char* op); /** * The gop 'sums' all elements in buf[n] across all processors in the group * using the commutative operation specified by the character string op. * * buf[n] is a float array present on each processor in the * processor group. The result is broadcast to all processor in this group. * Allowed strings are "+", "*", "max", "min", "absmax", "absmin". The use of * lowerecase for operators is necessary. * * This is a collective operation on the processor group. * * @param[in,out] buf buffer containing data * @param[in] n number of elements in x * @param[in] op operation to be performed */ void gop(float *buf, int n, char* op); /** * This function returns the relative index of the processor in the * processor group specified by p_handle. * * This index will generally differ from the absolute processor index * returned by GA_Nodeid if the processor group is not the world group. * * This is a local operation. * * @return relative index of the processor in the group given by p_handle */ int nodeid(); /** * This function returns the number of processors contained in the * group specified by p_handle. * * This is a local local operation. * * @return number of processors contained in the group given by p_handle */ int nodes(); /** * This operation executes a synchronization group across the * processors in the processor group specified by p_handle. * * Nodes outside this group are unaffected. * * This is a collective operation on the processor group. */ void sync(); private: int mPHandle; /*<< process group handle */ static PGroup *pgMirror; static PGroup *pgDefault; static PGroup *pgWorld; PGroup(void); }; } #endif /* _PGROUP_H */ ga-5-4/ga++/src/init_term.cc0000644000175000017500000000161212662210515013635 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "mp3.h" #include "ga++.h" void GA::Initialize(int argc, char *argv[], size_t limit) { MP_INIT(argc, argv); // GA Initialization if(limit == 0) GA_Initialize(); else GA_Initialize_ltd(limit); } void GA::Initialize(int argc, char *argv[], unsigned long heapSize, unsigned long stackSize, int type, size_t limit) { MP_INIT(argc, argv); // GA Initialization if(limit == 0) GA_Initialize(); else GA_Initialize_ltd(limit); //if(GA_Uses_ma()) { int nProcs = GA_Nnodes(); // Initialize memory allocator heapSize /= ((unsigned long) nProcs); stackSize /= ((unsigned long) nProcs); if(!MA_init(type, stackSize, heapSize)) GA_Error((char *)"MA_init failed",stackSize+heapSize); // } } void GA::Terminate() { /* Terminate GA */ GA_Terminate(); MP_FINALIZE(); } ga-5-4/ga++/src/GAServices.cc0000644000175000017500000001123212662210515013635 0ustar mbamba/** * @file GAServices.cc * @author Manoj Kumar Krishnan, PNNL. */ #if HAVE_CONFIG_H # include "config.h" #endif #include "ga++.h" GA::GAServices::GAServices() { } GA::GAServices::~GAServices() { } GA::GlobalArray * GA::GAServices::createGA(int type, int ndim, int dims[], char *arrayname, int chunk[]) { GA::GlobalArray * GA = new GA::GlobalArray(type, ndim, dims, arrayname, chunk); return GA; } GA::GlobalArray * GA::GAServices::createGA(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]) { GA::GlobalArray * GA = new GA::GlobalArray(type, ndim, dims, arrayname, block, maps); return GA; } GA::GlobalArray * GA::GAServices::createGA(const GA::GlobalArray *g_b, char *arrayname) { GA::GlobalArray * GA = new GA::GlobalArray(*g_b, arrayname); return GA; } GA::GlobalArray * GA::GAServices::createGA(const GA::GlobalArray &g_b) { GA::GlobalArray * GA = new GA::GlobalArray(g_b); return GA; } GA::GlobalArray * GA::GAServices::createGA() { GA::GlobalArray * GA = new GA::GlobalArray(); return GA; } GA::GlobalArray * GA::GAServices::createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int chunk[]) { /* last argument is a dummy argument, just to increase the count of the number of arguments, inorder to avoid conflict in # of args */ GA::GlobalArray * GA = new GA::GlobalArray(type, ndim, dims, width, array_name, chunk, 'g'); return GA; } GA::GlobalArray * GA::GAServices::createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int map[], int nblock[]) { GA::GlobalArray * GA = new GA::GlobalArray(type, ndim, dims, width, array_name, map, nblock, 'g'); return GA; } int GA::GAServices::getDebug() { return GA_Get_debug(); } void GA::GAServices::brdcst(void *buf, int lenbuf, int root) { GA_Brdcst(buf, lenbuf, root); } int GA::GAServices::clusterNnodes() { return GA_Cluster_nnodes(); } int GA::GAServices::clusterNodeid() { return GA_Cluster_nodeid(); } int GA::GAServices::clusterProcNodeid(int iproc) { return GA_Cluster_proc_nodeid(iproc); } int GA::GAServices::clusterNprocs(int inode) { return GA_Cluster_nprocs(inode) ; } int GA::GAServices::clusterProcid(int inode, int iproc) { return GA_Cluster_procid(inode, iproc); } int GA::GAServices::createMutexes(int number) { return GA_Create_mutexes(number); } int GA::GAServices::deregisterType(int type) { return NGA_Deregister_type(type); } int GA::GAServices::destroyMutexes() { return GA_Destroy_mutexes(); } void GA::GAServices::dgop(double x[], int n, char *op) { GA_Dgop(x, n, op); } int GA::GAServices::duplicate(int g_a, char* array_name) { return GA_Duplicate(g_a, array_name); } void GA::GAServices::error(const char *message, int code) { GA_Error((char *)message, code); } void GA::GAServices::fence() { GA_Fence(); } void GA::GAServices::gop(int x[], int n, char *op) { GA_Igop(x, n, op); } void GA::GAServices::gop(long x[], int n, char *op) { GA_Lgop(x, n, op); } void GA::GAServices::gop(float x[], int n, char *op) { GA_Fgop(x, n, op); } void GA::GAServices::gop(double x[], int n, char *op) { GA_Dgop(x, n, op); } void GA::GAServices::igop(int x[], int n, char *op) { GA_Igop(x, n, op); } void GA::GAServices::initFence() { GA_Init_fence(); } size_t GA::GAServices::inquireMemory() { return GA_Inquire_memory(); } void GA::GAServices::lgop(long x[], int n, char *op) { GA_Lgop(x, n, op); } void GA::GAServices::lock(int mutex) { GA_Lock(mutex); } void GA::GAServices::maskSync(int first, int last) { GA_Mask_sync(first, last); } int GA::GAServices::memoryAvailable() { return GA_Memory_avail(); } int GA::GAServices::memoryLimited() { return GA_Memory_limited(); } void GA::GAServices::nbWait(GANbhdl *nbhandle) { NGA_NbWait(nbhandle); } int GA::GAServices::nodeid() { return GA_Nodeid(); } int GA::GAServices::nodes() { return GA_Nnodes(); } void GA::GAServices::printStats() { GA_Print_stats(); } int GA::GAServices::registerType(size_t size) { return NGA_Register_type(size); } void GA::GAServices::setDebug(int dbg) { return GA_Set_debug(dbg); } void GA::GAServices::setMemoryLimit(size_t limit) { GA_Set_memory_limit(limit); } void GA::GAServices::summarize(int verbose) { GA_Summarize(verbose); } void GA::GAServices::sync() { GA_Sync(); } void GA::GAServices::unlock(int mutex) { GA_Unlock(mutex); } int GA::GAServices::usesMA() { return GA_Uses_ma(); } int GA::GAServices::usesFAPI() { return GA_Uses_fapi(); } double GA::GAServices::wtime() { return GA_Wtime(); } GA::GAServices GA::SERVICES; ga-5-4/ga++/src/GAServices.h0000644000175000017500000006206112662210515013505 0ustar mbamba#ifndef _GA_SERVICES_H #define _GA_SERVICES_H namespace GA { class GlobalArray; /** * Global Arrays Services class. * * @author Manoj Kumar Krishnan, PNNL. * @deprecated Please use the same functions found within the GA namespace. * * Collecting the global information: who am I, and how many processors * are being used. Initialize the communication library (either MPI or * TCSMSG) and Global array. Allocate momory to be used by GA by calling MA * and create global arrays. */ class GAServices { public: /** * Null-constructor. The component won't really be 'alive' * much at all until after setServices is called on it. */ GAServices(); /** Destructor. */ ~GAServices(); /** * Creates an ndim-dimensional array using the regular distribution model * and returns integer handle representing the array. * * The array can be distributed evenly or not. The control over the * distribution is accomplished by specifying chunk (block) size for all or * some of array dimensions. * * For example, for a 2-dimensional array, setting chunk[0]=dim[0] gives * distribution by vertical strips (chunk[0]*dims[0]); * setting chunk[1]=dim[1] gives distribution by horizontal strips * (chunk[1]*dims[1]). Actual chunks will be modified so that they are at * least the size of the minimum and each process has either zero or one * chunk. Specifying chunk[i] as <1 will cause that dimension to be * distributed evenly. * * As a convenience, when chunk is specified as NULL, the entire array is * distributed evenly. * * This is a collective operation. * * @param[in] type data type(MT_F_DBL,MT_F_INT,MT_F_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims[ndim] array of dimensions * @param[in] arrayname a unique character string * @param[in] chunk[ndim] array of chunks, each element specifies * minimum size that given dimensions should be * chunked up into * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(int type, int ndim, int dims[], char *arrayname, int chunk[]); /** * Creates an array by following the user-specified distribution and * returns integer handle representing the array. * * The distribution is specified as a Cartesian product of distributions * for each dimension. The array indices start at 0. For example, the * following figure demonstrates distribution of a 2-dimensional array 8x10 * on 6 (or more) processors. nblock[2]={3,2}, the size of map array is s=5 * and array map contains the following elements map={0,2,6, 0, 5}. The * distribution is nonuniform because, P1 and P4 get 20 elements each and * processors P0,P2,P3, and P5 only 10 elements each. * * * * * * *
5 5
P0 P3 2
P1 P4 4
P2 P5 2
* * This is a collective operation. * * @param[in] arrayname a unique character string * @param[in] type MA data type (MT_F_DBL,MT_F_INT,MT_F_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims array of dimension values * @param[in] block [ndim] no. of blocks each dimension is divided into * @param[in] maps [s] starting index for for each block; * the size s is a sum all elements of nblock array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] arrayname a character string * @param[in] g_b integer handle for reference array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(const GlobalArray *g_b, char *arrayname); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] g_b integer handle for reference array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(const GlobalArray &g_b); /** * Creates a 10x10 global array of type "double"(default). * * This is a collective operation. * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(); /** * Creates an ndim-dimensional array with a layer of ghost cells around * the visible data on each processor using the regular distribution * model and returns an integer handle representing the array. * The array can be distributed evenly or not evenly. The control over * the distribution is accomplished by specifying chunk (block) size for * all or some of the array dimensions. For example, for a 2-dimensional * array, setting chunk(1)=dim(1) gives distribution by vertical strips * (chunk(1)*dims(1)); setting chunk(2)=dim(2) gives distribution by * horizontal strips (chunk(2)*dims(2)). Actual chunks will be modified * so that they are at least the size of the minimum and each process * has either zero or one chunk. Specifying chunk(i) as <1 will cause * that dimension (i-th) to be distributed evenly. The width of the * ghost cell layer in each dimension is specified using the array * width(). The local data of the global array residing on each * processor will have a layer width[n] ghosts cells wide on either * side of the visible data along the dimension n. * * This is a collective operation. * * @param[in] array_name a unique character string * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] chunk [ndim] array of chunks, each element specifies * minimum size that given dimensions should be * chunked up into * * @returns pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int chunk[]); /** * Creates an array with ghost cells by following the user-specified * distribution and returns integer handle representing the array. * The distribution is specified as a Cartesian product of distributions * for each dimension. For example, the following figure demonstrates * distribution of a 2-dimensional array 8x10 on 6 (or more) processors. * nblock(2)={3,2}, the size of map array is s=5 and array map contains * the following elements map={1,3,7, 1, 6}. The distribution is * nonuniform because, P1 and P4 get 20 elements each and processors * P0,P2,P3, and P5 only 10 elements each. * * * * * * *
5 5
P0 P3 2
P1 P4 4
P2 P5 2
* * The array width[] is used to control the width of the ghost cell * boundary around the visible data on each processor. The local data * of the global array residing on each processor will have a layer * width[n] ghosts cells wide on either side of the visible data along * the dimension n. * * This is a collective operation. * * @param[in] array_name a unique character string * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] nblock [ndim] no. of blocks each dimension is divided into * @param[in] map [s] starting index for for each block; * the size s is a sum of all elements of nblock array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int map[], int nblock[]); /** * Broadcast from process root to all other processes a message of * length lenbuf. This is operation is provided only for convenience * purposes: it is available regardless of the message-passing library * that GA is running with. * * This is a collective operation. * * @param[in] lenbuf length of buffer * @param[in,out] buf [lenbuf] data * @param[in] root root process */ void brdcst(void *buf, int lenbuf, int root); /** * Returns the current value of the internal debug flag. * * This is a local operation. * * @return 0 if the debug flag is false, 1 if it is true. */ int getDebug(); /** * This functions returns the total number of nodes that the program is * running on. * * On SMP architectures, this will be less than or equal to the total * number of processors. * * This is a local operation. * * @return the number of nodes the program is running on */ int clusterNnodes(); /** * This function returns the node ID of the process. * * On SMP architectures with more than one processor per node, several * processes may return the same node id. * * This is a local operation. * * @return the node ID of the process */ int clusterNodeid(); /** * This function returns the cluster node ID of the specified process. * * On SMP architectures with more than one processor per node, several * processes may return the same node id. * * This is a local operation. * * @return the cluster node ID of the specified process */ int clusterProcNodeid(int iproc); /** * This function returns the number of processors available on node inode. * * This is a local operation. * * @param[in] inode * * @return the number of processors available on the given node */ int clusterNprocs(int inode); /** * This function returns the processor id associated with node inode and * the local processor id iproc. * * If node inode has N processors, then the value of iproc lies between * 0 and N-1. * * This is a local operation. * * @param[in] inode * @param[in] iproc * * @return the processor ID associated with the given node and local processor * ID */ int clusterProcid(int inode, int iproc); /** * Creates a set containing the number of mutexes. * * Mutex is a simple synchronization object used to protect Critical * Sections. Only one set of mutexes can exist at a time. Array of mutexes * can be created and destroyed as many times as needed. * Mutexes are numbered: 0, ..., number -1. * * This is a collective operation. * * @param[in] number of mutexes in mutex array * * @return 0 if the operation succeeded or 1 when failed. */ int createMutexes(int number); /** * Remove a user defined data type from GA * * @param[in] type - user defined data type * * @return 0 is operation is successful * -2 if type not registered * -1 if type reserved */ int deregisterType(int type); /** * Destroys the set of mutexes created with ga_create_mutexes. * * This is a collective operation. * * @return 0 if the operation succeeded or 1 when failed. */ int destroyMutexes(); /** * Double Global OPeration. * * X(1:N) is a vector present on each process. DGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void dgop(double x[], int n, char *op); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] array_name a character string * @param[in] g_a integer handle for reference array * * @return array handle; a non-zero array handle means the call was succesful. */ int duplicate(int g_a, char* array_name); /** * To be called in case of an error. * * Print an error message and an integer value that represents error code. * Releases some system resources. * This is the required way of aborting the program execution. * * This operation is local. * * @param[in] message string to print * @param[in] code code to print */ void error(const char *message, int code); /** * Blocks the calling process until all the data transfers corresponding to * GA operations called after ga_init_fence complete. * * For example, since ga_put might return before the data reaches the final * destination, ga_init_fence and ga_fence allow process to wait until the * data tranfer is fully completed: * * @code * ga_init_fence(); * ga_put(g_a, ...); * ga_fence(); * @endcode * * ga_fence must be called after ga_init_fence. A barrier, ga_sync, assures * completion of all data transfers and implicitly cancels all outstanding * ga_init_fence calls. ga_init_fence and ga_fence must be used in pairs, * multiple calls to ga_fence require the same number of corresponding * ga_init_fence calls. ga_init_fence/ga_fence pairs can be nested. * * ga_fence works for multiple GA operations. For example: * * @code * ga_init_fence(); * ga_put(g_a, ...); * ga_scatter(g_a, ...); * ga_put(g_b, ...); * ga_fence(); * @endcode * * The calling process will be blocked until data movements initiated by * two calls to ga_put and one ga_scatter complete. */ void fence(); /** * Integer Global OPeration. * * The integer version of ga_dgop described above, also include the bitwise OR * operation. This is operation is provided only for convenience purposes: it * is available regardless of the message-passing library that GA is running * with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(int x[], int n, char *op); /** * Long Global OPeration. * * X(1:N) is a vector present on each process. LGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(long x[], int n, char *op); /** * Float Global OPeration. * * X(1:N) is a vector present on each process. FGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(float x[], int n, char *op); /** * Double Global OPeration. * * X(1:N) is a vector present on each process. DGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(double x[], int n, char *op); /** * Integer Global OPeration. * * The integer (more precisely long) version of ga_dgop described above, * also include the bitwise OR operation. * This is operation is provided only for convenience purposes: it is * available regardless of the message-passing library that GA is running * with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void igop(int x[], int n, char *op); /** * Initializes tracing of completion status of data movement operations. * * This operation is local. */ void initFence(); /** * Returns amount of memory (in bytes) used in the allocated global * arrays on the calling processor. * * This operation is local. * * @return amount of memory (in bytes) used in the allocated global arrays on * the calling processor */ size_t inquireMemory(); /** * Long Global OPeration. * * X(1:N) is a vector present on each process. LGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void lgop(long x[], int n, char *op); /** * Locks a mutex object identified by the mutex number. It is a fatal * error for a process to attempt to lock a mutex which was already * locked by this process. * * @param[in] mutex object id */ void lock(int mutex); /** * Mask the intrinsic sync operations during collective calls. * * GA Collective calls has Sync calls at the begining and ending of * of the call. Sometimes there may be some redundacy in sync calls, which * can be avoided by masking the sync operations. * * Setting the parameters as zero will mask (disable) the call. Any non-zero * value will enable the call. Initially these params are set to non-zero * value. * * @param[in] first masks the sync at the begining of the collective call. * @param[in] last masks the sync at the end of the collective call. */ void maskSync(int first, int last); /** * If GA_uses_ma returns true, then GA_Memory_avail returns the * lesser of the amount available under the GA limit and the amount * available from MA (according to ma_inquire_avail operation). * If no GA limit has been set, it returns what MA says is available. * If ( ! GA_Uses_ma() && ! GA_Memory_limited() ) returns < 0, indicating * that the bound on currently available memory cannot be determined. * * This operation is local. * * @return amount of memory (in bytes) left for allocation of new * global arrays on the calling processor. * */ int memoryAvailable() ; /** * Indicates if limit is set on memory usage in Global Arrays on the * calling processor. * * This operation is local. * * @return 1 means "yes", "0" means "no". */ int memoryLimited(); /** * Force completion of a nonblocking operation locally. * * Waiting on a nonblocking put or an accumulate operation assures that data * was injected into the network and the user buffer can be now be reused. * Completing a get operation assures data has arrived into the user memory * and is ready for use. Wait operation ensures only local completion. Unlike * their blocking counterparts, the nonblocking operations are not ordered * with respect to the destination. Performance being one reason, the other * reason is that by ensuring ordering we incur additional and possibly * unnecessary overhead on applications that do not require their operations * to be ordered. For cases where ordering is necessary, it can be done by * calling a fence operation. The fence operation is provided to the user to * confirm remote completion if needed. * * This is a local operation. * * @param[in] nbhandle nonblocking handle */ void nbWait(GANbhdl *nbhandle); /** * Returns the GA process id (0, ..., ga_Nnodes()-1) of the requesting * compute process. * * This operation is local. * * @return the GA process ID of the requesting process */ int nodeid(); /** * Returns the number of the GA compute (user) processes. * * This operation is local. * * @return the number of GA processes */ int nodes(); /** * Print statistical information on GA use. * * This non-collective (MIMD) operation prints information about: * - number of calls to * - create * - duplicate * - destroy * - get * - put * - scatter * - gather * - read_and_inc operations * - total amount of data moved in the primitive operations * - amount of data moved in the primitive operations to logicaly remote * locations * - maximum memory consumption in global arrays * - number of requests serviced in the interrupt-driven implementations * by the calling process. * * This operation is local. */ void printStats(); /** * Add a user defined data type to GA * * @param[in] size - size (in bytes) of user defined data type * * @return handle for new data type */ int registerType(size_t size); /** * This function sets an internal flag in the GA library to either true or * false. * * The value of this flag can be recovered at any time using the * getDebug function. The flag is set to false when the the GA library * is initialized. This can be useful in a number of debugging situations, * especially when examining the behavior of routines that are called in * multiple locations in a code. * * This is a local operation. * * @param[in] dbg value to set internal flag */ void setDebug(int dbg); /** * Sets the amount of memory to be used (in bytes) per process. * * This is a local operation. * * @param[in] limit the amount of memory in bytes per process */ void setMemoryLimit(size_t limit); /** * Prints info about allocated arrays. * * @param[in] verbose if true print distribution info */ void summarize(int verbose); /** * Synchronize processes (a barrier) and ensure that all GA operations * completed. * * This is a collective operation. */ void sync(); /** * Unlocks a mutex object identified by the mutex number. * * It is a fatal error for a process to attempt to unlock a mutex which has * not been locked by this process. * * @param[in] mutex object id */ void unlock(int mutex); /** * Returns whether memory comes from internal or external allocator. * * This operation is local. * * @return "1" if memory comes from MA; * "0" if memory comes from another source e.g. System V shared memory */ int usesMA(); /** * Returns whether GA is using Fortran indexing. * * @return "1" if uses fortran API, else returns "0" */ int usesFAPI(); /** * This function return a wall (or elapsed) time on the calling processor. * * Returns time in seconds representing elapsed wall-clock time * since an arbitrary time in the past. Example: * * @code * double starttime, endtime; * starttime = GA::SERVICES.wtime(); * // {{.... code snippet to be timed ....}} * endtime = GA::SERVICES.wtime(); * printf("Time taken = %lf seconds\n", endtime-starttime); * @endcode * * This is a local operation. * * @note This function is only available in release 4.1 or greater. */ double wtime(); }; extern GAServices SERVICES; } #endif /* _GA_SERVICES_H */ ga-5-4/ga++/src/GlobalArray.cc0000644000175000017500000011547312662210515014055 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "ga++.h" #define GA_DATA_TYPE C_DBL #define INVALID_HANDLE -1000 static int sTmpVar = 0; /** * Constructors and Destructor of GlobalArray */ GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname, int chunk[]) { mHandle = NGA_Create(type, ndim, dims, arrayname, chunk); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname, int chunk[], GA::PGroup * p_handle) { mHandle = NGA_Create_config(type, ndim, dims, arrayname, chunk, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t chunk[]) { mHandle = NGA_Create64(type, ndim, dims, arrayname, chunk); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t chunk[], GA::PGroup * p_handle) { mHandle = NGA_Create_config64(type, ndim, dims, arrayname, chunk, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]) { mHandle = NGA_Create_irreg(type, ndim, dims, arrayname, block, maps); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], char *arrayname, int block[], int maps[], GA::PGroup * p_handle) { mHandle = NGA_Create_irreg_config(type, ndim, dims, arrayname, block, maps, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t block[], int64_t maps[]) { mHandle = NGA_Create_irreg64(type, ndim, dims, arrayname, block, maps); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t block[], int64_t maps[], GA::PGroup * p_handle) { mHandle = NGA_Create_irreg_config64(type, ndim, dims, arrayname, block, maps, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int chunk[], char ghosts) { mHandle = NGA_Create_ghosts(type, ndim, dims, width, arrayname, chunk); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t chunk[], char ghosts) { mHandle = NGA_Create_ghosts64(type, ndim, dims, width, arrayname, chunk); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int chunk[], GA::PGroup * p_handle, char ghosts) { mHandle = NGA_Create_ghosts_config(type, ndim, dims, width, arrayname, chunk, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t chunk[], GA::PGroup * p_handle, char ghosts) { mHandle = NGA_Create_ghosts_config64(type, ndim, dims, width, arrayname, chunk, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int block[], int maps[], char ghosts) { mHandle = NGA_Create_ghosts_irreg(type, ndim, dims, width, arrayname, block, maps); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t block[], int64_t maps[], char ghosts) { mHandle = NGA_Create_ghosts_irreg64(type, ndim, dims, width, arrayname, block, maps); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int block[], int maps[], GA::PGroup * p_handle, char ghosts) { mHandle = NGA_Create_ghosts_irreg_config(type, ndim, dims, width, arrayname, block, maps, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t block[], int64_t maps[], GA::PGroup * p_handle, char ghosts) { mHandle = NGA_Create_ghosts_irreg_config64(type, ndim, dims, width, arrayname, block, maps, p_handle->handle()); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(const GA::GlobalArray &g_a, char *arrayname) { mHandle = GA_Duplicate(g_a.mHandle, arrayname); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::GlobalArray(const GA::GlobalArray &g_a) { char temp_name[20]; sprintf(temp_name, "tmpGA%d", sTmpVar++); mHandle = GA_Duplicate(g_a.mHandle, temp_name); if(!mHandle) GA_Error((char *)" GA creation failed",0); GA_Copy(g_a.mHandle, mHandle); } GA::GlobalArray::GlobalArray() { mHandle = GA_Create_handle(); if(!mHandle) GA_Error((char *)" GA creation failed",0); } GA::GlobalArray::~GlobalArray() { GA_Destroy(mHandle); mHandle = INVALID_HANDLE; } /********************************************************************* * Member functions of GA::GlobalArray * *********************************************************************/ void GA::GlobalArray::acc(int lo[], int hi[], void *buf, int ld[], void *alpha) const { NGA_Acc(mHandle, lo, hi, buf, ld, alpha); } void GA::GlobalArray::acc(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], void *alpha) const { NGA_Acc64(mHandle, lo, hi, buf, ld, alpha); } void GA::GlobalArray::access(int lo[], int hi[], void *ptr, int ld[]) const { NGA_Access(mHandle, lo, hi, ptr, ld); } void GA::GlobalArray::access(int64_t lo[], int64_t hi[], void *ptr, int64_t ld[]) const { NGA_Access64(mHandle, lo, hi, ptr, ld); } void GA::GlobalArray::accessBlock(int idx, void *ptr, int ld[]) const { NGA_Access_block(mHandle, idx, ptr, ld); } void GA::GlobalArray::accessBlock(int64_t idx, void *ptr, int64_t ld[]) const { NGA_Access_block64(mHandle, idx, ptr, ld); } void GA::GlobalArray::accessBlockGrid(int index[], void *ptr, int ld[]) const { NGA_Access_block_grid(mHandle, index, ptr, ld); } void GA::GlobalArray::accessBlockGrid(int64_t index[], void *ptr, int64_t ld[]) const { NGA_Access_block_grid64(mHandle, index, ptr, ld); } void GA::GlobalArray::accessBlockSegment(int proc, void *ptr, int *len) const { NGA_Access_block_segment(mHandle, proc, ptr, len); } void GA::GlobalArray::accessBlockSegment(int proc, void *ptr, int64_t *len) const { NGA_Access_block_segment64(mHandle, proc, ptr, len); } void GA::GlobalArray::accessGhosts(int dims[], void *ptr, int ld[]) const { NGA_Access_ghosts(mHandle, dims, ptr, ld); } void GA::GlobalArray::accessGhosts(int64_t dims[], void *ptr, int64_t ld[]) const { NGA_Access_ghosts64(mHandle, dims, ptr, ld); } void GA::GlobalArray::accessGhostElement(void *ptr, int subscript[], int ld[]) const { NGA_Access_ghost_element(mHandle, ptr, subscript, ld); } void GA::GlobalArray::accessGhostElement(void *ptr, int64_t subscript[], int64_t ld[]) const { NGA_Access_ghost_element64(mHandle, ptr, subscript, ld); } void GA::GlobalArray::add(void *alpha, const GA::GlobalArray * g_a, void *beta, const GA::GlobalArray * g_b) const { GA_Add(alpha, g_a->mHandle, beta, g_b->mHandle, mHandle); } void GA::GlobalArray::addPatch (void *alpha, const GA::GlobalArray * g_a, int alo[], int ahi[], void *beta, const GA::GlobalArray * g_b, int blo[], int bhi[], int clo[], int chi[]) const { NGA_Add_patch(alpha, g_a->mHandle, alo, ahi, beta, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::addPatch (void *alpha, const GA::GlobalArray * g_a, int64_t alo[], int64_t ahi[], void *beta, const GA::GlobalArray * g_b, int64_t blo[], int64_t bhi[], int64_t clo[], int64_t chi[]) const { NGA_Add_patch64(alpha, g_a->mHandle, alo, ahi, beta, g_b->mHandle, blo, bhi, mHandle, clo, chi); } int GA::GlobalArray::allocate() const { return GA_Allocate(mHandle); } void GA::GlobalArray::allocGatscatBuf(int nelems) const { NGA_Alloc_gatscat_buf(nelems); } void GA::GlobalArray::checkHandle(char* string) const { GA_Check_handle(mHandle, string); } int GA::GlobalArray::compareDistr(const GA::GlobalArray *g_a) const { return GA_Compare_distr(mHandle, g_a->mHandle); } void GA::GlobalArray::copy(const GA::GlobalArray *g_a) const { GA_Copy(g_a->mHandle, mHandle); } void GA::GlobalArray::copyPatch(char trans, const GA::GlobalArray* ga, int alo[], int ahi[], int blo[], int bhi[]) const { NGA_Copy_patch(trans, ga->mHandle, alo, ahi, mHandle, blo, bhi); } void GA::GlobalArray::copyPatch(char trans, const GA::GlobalArray* ga, int64_t alo[], int64_t ahi[], int64_t blo[], int64_t bhi[]) const { NGA_Copy_patch64(trans, ga->mHandle, alo, ahi, mHandle, blo, bhi); } double GA::GlobalArray::ddot(const GA::GlobalArray * g_a) const { return GA_Ddot(mHandle, g_a->mHandle); } double GA::GlobalArray::ddotPatch(char ta, int alo[], int ahi[], const GA::GlobalArray * g_a, char tb, int blo[], int bhi[]) const { return NGA_Ddot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } double GA::GlobalArray::ddotPatch(char ta, int64_t alo[], int64_t ahi[], const GA::GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const { return NGA_Ddot_patch64(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } void GA::GlobalArray::destroy() { GA_Destroy(mHandle); mHandle = INVALID_HANDLE; } void GA::GlobalArray::dgemm(char ta, char tb, int m, int n, int k, double alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, double beta) const { GA_Dgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } void GA::GlobalArray::dgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, double alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, double beta) const { GA_Dgemm64(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } void GA::GlobalArray::diag(const GA::GlobalArray *g_s, GA::GlobalArray *g_v, void *eval) const { GA_Diag(mHandle, g_s->mHandle, g_v->mHandle, eval); } void GA::GlobalArray::diagReuse(int control, const GA::GlobalArray *g_s, GA::GlobalArray *g_v, void *eval) const { GA_Diag_reuse(control, mHandle, g_s->mHandle, g_v->mHandle, eval); } void GA::GlobalArray::diagStd(GlobalArray *g_v, void *eval) const { GA_Diag_std(mHandle, g_v->mHandle, eval); } void GA::GlobalArray::diagSeq(const GA::GlobalArray * g_s, const GA::GlobalArray * g_v, void *eval) const { GA_Diag_seq(mHandle, g_s->mHandle, g_v->mHandle, eval); } void GA::GlobalArray::diagStdSeq(const GA::GlobalArray * g_v, void *eval) const { GA_Diag_std_seq(mHandle, g_v->mHandle, eval); } void GA::GlobalArray::distribution(int me, int* lo, int* hi) const { NGA_Distribution(mHandle, me, lo, hi); } void GA::GlobalArray::distribution(int me, int64_t* lo, int64_t* hi) const { NGA_Distribution64(mHandle, me, lo, hi); } float GA::GlobalArray::fdot(const GA::GlobalArray * g_a) const { return GA_Fdot(mHandle, g_a->mHandle); } float GA::GlobalArray::fdotPatch(char t_a, int alo[], int ahi[], const GA::GlobalArray * g_b, char t_b, int blo[], int bhi[]) const { return NGA_Fdot_patch(mHandle, t_a, alo, ahi, g_b->mHandle, t_b, blo, bhi); } float GA::GlobalArray::fdotPatch(char t_a, int64_t alo[], int64_t ahi[], const GA::GlobalArray * g_b, char t_b, int64_t blo[], int64_t bhi[]) const { return NGA_Fdot_patch64(mHandle, t_a, alo, ahi, g_b->mHandle, t_b, blo, bhi); } void GA::GlobalArray::fill(void *value) const { GA_Fill(mHandle, value); } void GA::GlobalArray::fillPatch (int lo[], int hi[], void *val) const { NGA_Fill_patch(mHandle, lo, hi, val); } void GA::GlobalArray::fillPatch (int64_t lo[], int64_t hi[], void *val) const { NGA_Fill_patch64(mHandle, lo, hi, val); } void GA::GlobalArray::freeGatscatBuf() { NGA_Free_gatscat_buf(); } void GA::GlobalArray::gather(void *v, int * subsarray[], int n) const { NGA_Gather(mHandle, v, subsarray, n); } void GA::GlobalArray::gather(void *v, int64_t * subsarray[], int64_t n) const { NGA_Gather64(mHandle, v, subsarray, n); } void GA::GlobalArray::get(int lo[], int hi[], void *buf, int ld[]) const { NGA_Get(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::get(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const { NGA_Get64(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::getBlockInfo(int num_blocks[], int block_dims[]) { GA_Get_block_info(mHandle, num_blocks, block_dims); } int GA::GlobalArray::hasGhosts() const { return GA_Has_ghosts(mHandle); } int GA::GlobalArray::idot(const GA::GlobalArray * g_a) const { return GA_Idot(mHandle, g_a->mHandle); } long GA::GlobalArray::idotPatch(char ta, int alo[], int ahi[], const GA::GlobalArray * g_a, char tb, int blo[], int bhi[]) const { return NGA_Idot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } long GA::GlobalArray::idotPatch(char ta, int64_t alo[], int64_t ahi[], const GA::GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const { return NGA_Idot_patch64(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } void GA::GlobalArray::inquire(int *type, int *ndim, int dims[]) const { NGA_Inquire(mHandle, type, ndim, dims); } void GA::GlobalArray::inquire(int *type, int *ndim, int64_t dims[]) const { NGA_Inquire64(mHandle, type, ndim, dims); } char* GA::GlobalArray::inquireName() const { return GA_Inquire_name(mHandle); } long GA::GlobalArray::ldot(const GA::GlobalArray * g_a) const { return GA_Ldot(mHandle, g_a->mHandle); } long GA::GlobalArray::ldotPatch(char ta, int alo[], int ahi[], const GA::GlobalArray * g_a, char tb, int blo[], int bhi[]) const { return NGA_Ldot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } long GA::GlobalArray::ldotPatch(char ta, int64_t alo[], int64_t ahi[], const GA::GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const { return NGA_Ldot_patch64(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } int GA::GlobalArray::lltSolve(const GA::GlobalArray * g_a) const { return GA_Llt_solve(g_a->mHandle, mHandle); } int GA::GlobalArray::locate(int subscript[]) const { return NGA_Locate(mHandle, subscript); } int GA::GlobalArray::locate(int64_t subscript[]) const { return NGA_Locate64(mHandle, subscript); } int GA::GlobalArray::locateRegion(int lo[], int hi[], int map[], int procs[]) const { return NGA_Locate_region(mHandle, lo, hi, map, procs); } int GA::GlobalArray::locateRegion(int64_t lo[], int64_t hi[], int64_t map[], int procs[]) const { return NGA_Locate_region64(mHandle, lo, hi, map, procs); } void GA::GlobalArray::luSolve(char trans, const GA::GlobalArray * g_a) const { GA_Lu_solve(trans, g_a->mHandle, mHandle); } void GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha, void *beta, const GA::GlobalArray *g_a, int ailo, int aihi, int ajlo, int ajhi, const GA::GlobalArray *g_b, int bilo, int bihi, int bjlo, int bjhi, int cilo, int cihi, int cjlo, int cjhi) const { GA_Matmul_patch(transa, transb, alpha, beta, g_a->mHandle, ailo, aihi, ajlo, ajhi, g_b->mHandle, bilo, bihi, bjlo, bjhi, mHandle, cilo, cihi, cjlo, cjhi); } void GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha, void *beta, const GA::GlobalArray *g_a, int64_t ailo, int64_t aihi, int64_t ajlo, int64_t ajhi, const GA::GlobalArray *g_b, int64_t bilo, int64_t bihi, int64_t bjlo, int64_t bjhi, int64_t cilo, int64_t cihi, int64_t cjlo, int64_t cjhi) const { GA_Matmul_patch64(transa, transb, alpha, beta, g_a->mHandle, ailo, aihi, ajlo, ajhi, g_b->mHandle, bilo, bihi, bjlo, bjhi, mHandle, cilo, cihi, cjlo, cjhi); } void GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha, void *beta, const GA::GlobalArray *g_a, int *alo, int *ahi, const GA::GlobalArray *g_b, int *blo, int *bhi, int *clo, int *chi) const { NGA_Matmul_patch(transa, transb, alpha, beta, g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::matmulPatch(char transa, char transb, void* alpha, void *beta, const GA::GlobalArray *g_a, int64_t *alo, int64_t *ahi, const GA::GlobalArray *g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const { NGA_Matmul_patch64(transa, transb, alpha, beta, g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::mergeDistrPatch(int alo[], int ahi[], GlobalArray *g_b, int blo[], int bhi[]) { NGA_Merge_distr_patch(mHandle, alo, ahi, g_b->mHandle, blo, bhi); } void GA::GlobalArray::mergeDistrPatch(int64_t alo[], int64_t ahi[], GlobalArray *g_b, int64_t blo[], int64_t bhi[]) { NGA_Merge_distr_patch64(mHandle, alo, ahi, g_b->mHandle, blo, bhi); } int GA::GlobalArray::isMirrored() { return GA_Is_mirrored(mHandle); } void GA::GlobalArray::mergeMirrored() { GA_Merge_mirrored(mHandle); } void GA::GlobalArray::nbAcc(int lo[], int hi[], void *buf, int ld[], void *alpha, GANbhdl *nbhandle) { NGA_NbAcc(mHandle, lo, hi, buf, ld, alpha, nbhandle); } void GA::GlobalArray::nbAcc(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], void *alpha, GANbhdl *nbhandle) { NGA_NbAcc64(mHandle, lo, hi, buf, ld, alpha, nbhandle); } void GA::GlobalArray::nbGet(int lo[], int hi[], void *buf, int ld[], GANbhdl *nbhandle) { NGA_NbGet(mHandle, lo, hi, buf, ld, nbhandle); } void GA::GlobalArray::nbGet(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], GANbhdl *nbhandle) { NGA_NbGet64(mHandle, lo, hi, buf, ld, nbhandle); } void GA::GlobalArray::nbGetGhostDir(int mask[], GANbhdl *nbhandle) { NGA_NbGet_ghost_dir(mHandle, mask, nbhandle); } void GA::GlobalArray::nbGetGhostDir(int64_t mask[], GANbhdl *nbhandle) { NGA_NbGet_ghost_dir64(mHandle, mask, nbhandle); } void GA::GlobalArray::nblock(int numblock[]) const { GA_Nblock(mHandle, numblock); } void GA::GlobalArray::nbPut(int lo[], int hi[], void *buf, int ld[], GANbhdl *nbhandle) { NGA_NbPut(mHandle, lo, hi, buf, ld, nbhandle); } void GA::GlobalArray::nbPut(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], GANbhdl *nbhandle) { NGA_NbPut64(mHandle, lo, hi, buf, ld, nbhandle); } int GA::GlobalArray::ndim() const { return GA_Ndim(mHandle); } void GA::GlobalArray::pack(const GA::GlobalArray *g_dest, const GA::GlobalArray *g_mask, int lo, int hi, int *icount) const { GA_Pack(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, icount); } void GA::GlobalArray::pack(const GA::GlobalArray *g_dest, const GA::GlobalArray *g_mask, int64_t lo, int64_t hi, int64_t *icount) const { GA_Pack64(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, icount); } void GA::GlobalArray::patchEnum(int lo, int hi, void *start, void *inc) { GA_Patch_enum(mHandle, lo, hi, start, inc); } void GA::GlobalArray::patchEnum(int64_t lo, int64_t hi, void *start, void *inc) { GA_Patch_enum64(mHandle, lo, hi, start, inc); } void GA::GlobalArray::periodicAcc(int lo[], int hi[], void* buf, int ld[], void* alpha) const { NGA_Periodic_acc(mHandle, lo, hi, buf, ld, alpha); } void GA::GlobalArray::periodicAcc(int64_t lo[], int64_t hi[], void* buf, int64_t ld[], void* alpha) const { NGA_Periodic_acc64(mHandle, lo, hi, buf, ld, alpha); } void GA::GlobalArray::periodicGet(int lo[], int hi[], void* buf, int ld[]) const { NGA_Periodic_get(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::periodicGet(int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) const { NGA_Periodic_get64(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::periodicPut(int lo[], int hi[], void* buf, int ld[]) const { NGA_Periodic_put(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::periodicPut(int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) const { NGA_Periodic_put64(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::print() const { GA_Print(mHandle); } void GA::GlobalArray::printDistribution() const { GA_Print_distribution(mHandle); } void GA::GlobalArray::printFile(FILE *file) const { GA_Print_file(file, mHandle); } void GA::GlobalArray::printPatch(int* lo, int* hi, int pretty) const { NGA_Print_patch(mHandle, lo, hi, pretty); } void GA::GlobalArray::printPatch(int64_t* lo, int64_t* hi, int pretty) const { NGA_Print_patch64(mHandle, lo, hi, pretty); } void GA::GlobalArray::procTopology(int proc, int coord[]) const { NGA_Proc_topology(mHandle, proc, coord); } void GA::GlobalArray::put(int lo[], int hi[], void *buf, int ld[]) const { NGA_Put(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::put(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const { NGA_Put64(mHandle, lo, hi, buf, ld); } long GA::GlobalArray::readInc(int subscript[], long inc) const { return NGA_Read_inc(mHandle, subscript, inc); } long GA::GlobalArray::readInc(int64_t subscript[], long inc) const { return NGA_Read_inc64(mHandle, subscript, inc); } void GA::GlobalArray::release(int lo[], int hi[]) const { NGA_Release(mHandle, lo, hi); } void GA::GlobalArray::release(int64_t lo[], int64_t hi[]) const { NGA_Release64(mHandle, lo, hi); } void GA::GlobalArray::releaseBlock(int idx) const { NGA_Release_block(mHandle, idx); } void GA::GlobalArray::releaseBlockGrid(int index[]) const { NGA_Release_block_grid(mHandle, index); } void GA::GlobalArray::releaseBlockSegment(int proc) const { NGA_Release_block_segment(mHandle, proc); } void GA::GlobalArray::releaseGhosts() const { NGA_Release_ghosts(mHandle); } void GA::GlobalArray::releaseGhostElement(int subscript[]) const { NGA_Release_ghost_element(mHandle, subscript); } void GA::GlobalArray::releaseGhostElement(int64_t subscript[]) const { NGA_Release_ghost_element64(mHandle, subscript); } void GA::GlobalArray::releaseUpdate(int lo[], int hi[]) const { NGA_Release_update(mHandle, lo, hi); } void GA::GlobalArray::releaseUpdate(int64_t lo[], int64_t hi[]) const { NGA_Release_update64(mHandle, lo, hi); } void GA::GlobalArray::releaseUpdateBlock(int idx) const { NGA_Release_update_block(mHandle, idx); } void GA::GlobalArray::releaseUpdateBlockGrid(int index[]) const { NGA_Release_update_block_grid(mHandle, index); } void GA::GlobalArray::releaseUpdateBlockSegment(int idx) const { NGA_Release_update_block_segment(mHandle, idx); } void GA::GlobalArray::releaseUpdateGhosts() const { NGA_Release_update_ghosts(mHandle); } void GA::GlobalArray::releaseUpdateGhostElement(int subscript[]) const { NGA_Release_update_ghost_element(mHandle, subscript); } void GA::GlobalArray::releaseUpdateGhostElement(int64_t subscript[]) const { NGA_Release_update_ghost_element64(mHandle, subscript); } void GA::GlobalArray::scale(void *value) const { GA_Scale(mHandle, value); } void GA::GlobalArray::scalePatch (int lo[], int hi[], void *val) const { NGA_Scale_patch(mHandle, lo, hi, val); } void GA::GlobalArray::scalePatch (int64_t lo[], int64_t hi[], void *val) const { NGA_Scale_patch64(mHandle, lo, hi, val); } void GA::GlobalArray::scanAdd(const GA::GlobalArray *g_dest, const GlobalArray *g_mask, int lo, int hi, int excl) const { GA_Scan_add(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, excl); } void GA::GlobalArray::scanAdd(const GA::GlobalArray *g_dest, const GlobalArray *g_mask, int64_t lo, int64_t hi, int excl) const { GA_Scan_add64(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, excl); } void GA::GlobalArray::scanCopy(const GA::GlobalArray *g_dest, const GA::GlobalArray *g_mask, int lo, int hi) const { GA_Scan_copy(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi); } void GA::GlobalArray::scanCopy(const GA::GlobalArray *g_dest, const GA::GlobalArray *g_mask, int64_t lo, int64_t hi) const { GA_Scan_copy64(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi); } void GA::GlobalArray::scatter(void *v, int *subsarray[], int n) const { NGA_Scatter(mHandle, v, subsarray, n); } void GA::GlobalArray::scatter(void *v, int64_t *subsarray[], int64_t n) const { NGA_Scatter64(mHandle, v, subsarray, n); } void GA::GlobalArray::scatterAcc(void *v, int *subsarray[], int n, void *alpha) const { NGA_Scatter_acc(mHandle, v, subsarray, n, alpha); } void GA::GlobalArray::scatterAcc(void *v, int64_t *subsarray[], int64_t n, void *alpha) const { NGA_Scatter_acc64(mHandle, v, subsarray, n, alpha); } void GA::GlobalArray::selectElem(char *op, void* val, int index[]) const { NGA_Select_elem(mHandle, op, val, index); } void GA::GlobalArray::selectElem(char *op, void* val, int64_t index[]) const { NGA_Select_elem64(mHandle, op, val, index); } void GA::GlobalArray::setArrayName(char *name) const { GA_Set_array_name(mHandle, name); } void GA::GlobalArray::setBlockCyclic(int dims[]) const { GA_Set_block_cyclic(mHandle, dims); } void GA::GlobalArray::setBlockCyclicProcGrid(int dims[], int proc_grid[]) const{ GA_Set_block_cyclic_proc_grid(mHandle, dims, proc_grid); } void GA::GlobalArray::setChunk(int chunk[]) const { GA_Set_chunk(mHandle, chunk); } void GA::GlobalArray::setChunk(int64_t chunk[]) const { GA_Set_chunk64(mHandle, chunk); } void GA::GlobalArray::setData(int ndim, int dims[], int type) const { GA_Set_data(mHandle, ndim, dims, type); } void GA::GlobalArray::setData(int ndim, int64_t dims[], int type) const { GA_Set_data64(mHandle, ndim, dims, type); } void GA::GlobalArray::setGhosts(int width[]) const { GA_Set_ghosts(mHandle, width); } void GA::GlobalArray::setGhosts(int64_t width[]) const { GA_Set_ghosts64(mHandle, width); } void GA::GlobalArray::setIrregDistr(int mapc[], int nblock[]) const { GA_Set_irreg_distr(mHandle, mapc, nblock); } void GA::GlobalArray::setIrregDistr(int64_t mapc[], int64_t nblock[]) const { GA_Set_irreg_distr64(mHandle, mapc, nblock); } void GA::GlobalArray::setRestricted(int list[], int nprocs) const { GA_Set_restricted(mHandle, list, nprocs); } void GA::GlobalArray::setRestrictedRange(int lo_proc, int hi_proc) const { GA_Set_restricted_range(mHandle, lo_proc, hi_proc); } void GA::GlobalArray::setPGroup(GA::PGroup *pHandle) const { GA_Set_pgroup(mHandle, pHandle->handle()); } void GA::GlobalArray::sgemm(char ta, char tb, int m, int n, int k, float alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, float beta) const { GA_Sgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } void GA::GlobalArray::sgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, float alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, float beta) const { GA_Sgemm64(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } int GA::GlobalArray::solve(const GA::GlobalArray * g_a) const { return GA_Solve(g_a->mHandle, mHandle); } int GA::GlobalArray::spdInvert() const { return GA_Spd_invert(mHandle); } void GA::GlobalArray::stridedAcc(int lo[], int hi[], int skip[], void*buf, int ld[], void *alpha) const { NGA_Strided_acc(mHandle, lo, hi, skip, buf, ld, alpha); } void GA::GlobalArray::stridedAcc(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[], void *alpha) const { NGA_Strided_acc64(mHandle, lo, hi, skip, buf, ld, alpha); } void GA::GlobalArray::stridedGet(int lo[], int hi[], int skip[], void*buf, int ld[]) const { NGA_Strided_get(mHandle, lo, hi, skip, buf, ld); } void GA::GlobalArray::stridedGet(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[]) const { NGA_Strided_get64(mHandle, lo, hi, skip, buf, ld); } void GA::GlobalArray::stridedPut(int lo[], int hi[], int skip[], void*buf, int ld[]) const { NGA_Strided_put(mHandle, lo, hi, skip, buf, ld); } void GA::GlobalArray::stridedPut(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[]) const { NGA_Strided_put64(mHandle, lo, hi, skip, buf, ld); } void GA::GlobalArray::summarize(int verbose) const { GA_Summarize(verbose); } void GA::GlobalArray::symmetrize() const { GA_Symmetrize(mHandle); } int GA::GlobalArray::totalBlocks() const { return GA_Total_blocks(mHandle); } void GA::GlobalArray::transpose(const GA::GlobalArray * g_a) const { GA_Transpose(mHandle, g_a->mHandle); } void GA::GlobalArray::unpack(GlobalArray *g_dest, GlobalArray *g_mask, int lo, int hi, int *icount) const { GA_Unpack(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, icount); } void GA::GlobalArray::unpack(GlobalArray *g_dest, GlobalArray *g_mask, int64_t lo, int64_t hi, int64_t *icount) const { GA_Unpack64(mHandle, g_dest->mHandle, g_mask->mHandle, lo, hi, icount); } void GA::GlobalArray::updateGhosts() const { GA_Update_ghosts(mHandle); } void GA::GlobalArray::updateGhostsNb(GANbhdl *nbhandle) const{ NGA_Update_ghosts_nb(mHandle, nbhandle); } int GA::GlobalArray::updateGhostDir(int dimension, int idir, int cflag) const { return NGA_Update_ghost_dir(mHandle, dimension, idir, cflag); } void GA::GlobalArray::getGhostBlock(int lo[], int hi[], void *buf, int ld[]) const { NGA_Get_ghost_block(mHandle, lo, hi, buf, ld); } void GA::GlobalArray::getGhostBlock(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const { NGA_Get_ghost_block64(mHandle, lo, hi, buf, ld); } DoubleComplex GA::GlobalArray::zdot(const GA::GlobalArray * g_a) const { return GA_Zdot(mHandle, g_a->mHandle); } DoubleComplex GA::GlobalArray::zdotPatch(char ta, int alo[], int ahi[], const GA::GlobalArray * g_a, char tb, int blo[], int bhi[]) const { return NGA_Zdot_patch(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } DoubleComplex GA::GlobalArray::zdotPatch(char ta, int64_t alo[], int64_t ahi[], const GA::GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const { return NGA_Zdot_patch64(mHandle, ta, alo, ahi, g_a->mHandle, tb, blo, bhi); } void GA::GlobalArray::zero() const { GA_Zero(mHandle); } void GA::GlobalArray::zeroPatch (int lo[], int hi[]) const { NGA_Zero_patch(mHandle, lo, hi); } void GA::GlobalArray::zeroPatch (int64_t lo[], int64_t hi[]) const { NGA_Zero_patch64(mHandle, lo, hi); } void GA::GlobalArray::zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, DoubleComplex beta) const { GA_Zgemm(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } void GA::GlobalArray::zgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, DoubleComplex alpha, const GA::GlobalArray *g_a, const GA::GlobalArray *g_b, DoubleComplex beta) const { GA_Zgemm64(ta, tb, m, n, k, alpha, g_a->mHandle, g_b->mHandle, beta, mHandle); } /* recent additions */ void GA::GlobalArray::absValue() const { GA_Abs_value(mHandle); } void GA::GlobalArray::addConstant(void* alpha) const { GA_Add_constant(mHandle, alpha); } void GA::GlobalArray::recip() const { GA_Recip(mHandle); } void GA::GlobalArray::elemMultiply(const GA::GlobalArray * g_a, const GA::GlobalArray * g_b) const { GA_Elem_multiply(g_a->mHandle, g_b->mHandle, mHandle); } void GA::GlobalArray::elemDivide(const GA::GlobalArray * g_a, const GA::GlobalArray * g_b) const { GA_Elem_divide(g_a->mHandle, g_b->mHandle, mHandle); } void GA::GlobalArray::elemMaximum(const GA::GlobalArray * g_a, const GA::GlobalArray * g_b) const { GA_Elem_maximum(g_a->mHandle, g_b->mHandle, mHandle); } void GA::GlobalArray::elemMinimum(const GA::GlobalArray * g_a, const GA::GlobalArray * g_b) const { GA_Elem_minimum(g_a->mHandle, g_b->mHandle, mHandle); } void GA::GlobalArray::absValuePatch(int *lo, int *hi) const { GA_Abs_value_patch(mHandle, lo, hi); } void GA::GlobalArray::absValuePatch(int64_t *lo, int64_t *hi) const { GA_Abs_value_patch64(mHandle, lo, hi); } void GA::GlobalArray::addConstantPatch(int *lo,int *hi, void *alpha) const { GA_Add_constant_patch(mHandle, lo, hi, alpha); } void GA::GlobalArray::addConstantPatch(int64_t *lo,int64_t *hi, void *alpha) const { GA_Add_constant_patch64(mHandle, lo, hi, alpha); } void GA::GlobalArray::recipPatch(int *lo, int *hi) const { GA_Recip_patch(mHandle, lo, hi); } void GA::GlobalArray::recipPatch(int64_t *lo, int64_t *hi) const { GA_Recip_patch64(mHandle, lo, hi); } void GA::GlobalArray::stepMax(const GA::GlobalArray * g_a, double *step) const {// CHECK all Step Max functions GA_Step_max(mHandle, g_a->mHandle, step); } void GA::GlobalArray::stepMaxPatch(int *alo, int *ahi, const GA::GlobalArray * g_b, int *blo, int *bhi, double *step) const { GA_Step_max_patch(mHandle, alo, ahi, g_b->mHandle, blo, bhi, step); } void GA::GlobalArray::stepMaxPatch(int64_t *alo, int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo, int64_t *bhi, double *step) const { GA_Step_max_patch64(mHandle, alo, ahi, g_b->mHandle, blo, bhi, step); } void GA::GlobalArray::elemMultiplyPatch(const GA::GlobalArray * g_a, int *alo,int *ahi, const GA::GlobalArray * g_b, int *blo,int *bhi, int *clo,int *chi) const { GA_Elem_multiply_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemMultiplyPatch(const GA::GlobalArray * g_a, int64_t *alo,int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo,int64_t *bhi, int64_t *clo,int64_t *chi) const { GA_Elem_multiply_patch64(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemDividePatch(const GA::GlobalArray * g_a,int *alo,int *ahi, const GA::GlobalArray * g_b,int *blo,int *bhi, int *clo,int *chi) const { GA_Elem_divide_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemDividePatch(const GA::GlobalArray * g_a,int64_t *alo, int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const { GA_Elem_divide_patch64(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemMaximumPatch(const GA::GlobalArray * g_a, int *alo,int *ahi, const GA::GlobalArray * g_b, int *blo,int *bhi, int *clo,int *chi) const { GA_Elem_maximum_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemMaximumPatch(const GA::GlobalArray * g_a, int64_t *alo, int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const { GA_Elem_maximum_patch64(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemMinimumPatch(const GA::GlobalArray * g_a, int *alo,int *ahi, const GA::GlobalArray * g_b, int *blo,int *bhi, int *clo,int *chi) const { GA_Elem_minimum_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } void GA::GlobalArray::elemMinimumPatch(const GA::GlobalArray * g_a, int64_t *alo, int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const { GA_Elem_minimum_patch64(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, mHandle, clo, chi); } /*Added by Limin for matrix operations*/ void GA::GlobalArray::shiftDiagonal(void *c) const { GA_Shift_diagonal(mHandle, c); } void GA::GlobalArray::setDiagonal(const GA::GlobalArray * g_v) const { GA_Set_diagonal(mHandle, g_v->mHandle); } void GA::GlobalArray::zeroDiagonal() const { GA_Zero_diagonal(mHandle); } void GA::GlobalArray::addDiagonal(const GA::GlobalArray * g_v) const { GA_Add_diagonal(mHandle, g_v->mHandle); } void GA::GlobalArray::getDiagonal(const GA::GlobalArray * g_a) const { GA_Get_diag(g_a->mHandle, mHandle); } void GA::GlobalArray::scaleRows(const GA::GlobalArray * g_v) const { GA_Scale_rows(mHandle, g_v->mHandle); } void GA::GlobalArray::scaleCols(const GA::GlobalArray * g_v) const { GA_Scale_cols(mHandle, g_v->mHandle); } void GA::GlobalArray::norm1(double *nm) const { GA_Norm1(mHandle, nm); } void GA::GlobalArray::normInfinity(double *nm) const { GA_Norm_infinity(mHandle, nm); } void GA::GlobalArray::median(const GA::GlobalArray * g_a, const GA::GlobalArray * g_b, const GA::GlobalArray * g_c) const { GA_Median(g_a->mHandle, g_b->mHandle, g_c->mHandle, mHandle); } void GA::GlobalArray::medianPatch(const GA::GlobalArray * g_a, int *alo, int *ahi, const GA::GlobalArray * g_b, int *blo, int *bhi, const GA::GlobalArray * g_c, int *clo, int *chi, int *mlo, int *mhi) const { GA_Median_patch(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, g_c->mHandle, clo, chi, mHandle, mlo, mhi); } void GA::GlobalArray::medianPatch(const GA::GlobalArray * g_a, int64_t *alo, int64_t *ahi, const GA::GlobalArray * g_b, int64_t *blo, int64_t *bhi, const GA::GlobalArray * g_c, int64_t *clo, int64_t *chi, int64_t *mlo, int64_t *mhi) const { GA_Median_patch64(g_a->mHandle, alo, ahi, g_b->mHandle, blo, bhi, g_c->mHandle, clo, chi, mHandle, mlo, mhi); } ga-5-4/ga++/src/PGroup.cc0000644000175000017500000000353612662210515013066 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "ga++.h" GA::PGroup* GA::PGroup::pgMirror = NULL; GA::PGroup* GA::PGroup::pgDefault = NULL; GA::PGroup* GA::PGroup::pgWorld = NULL; /** * Private -- never called. */ GA::PGroup::PGroup(void) { } /** * Constructors and Destructor of PGroup */ GA::PGroup::PGroup(int *plist, int size) { mPHandle = GA_Pgroup_create(plist, size); } GA::PGroup::~PGroup() { GA_Pgroup_destroy(mPHandle); } /** * Pgroup Methods */ GA::PGroup* GA::PGroup::getDefault() { if(pgDefault == NULL) { pgDefault = new PGroup(); pgDefault->mPHandle = GA_Pgroup_get_default(); } return pgDefault; } GA::PGroup* GA::PGroup::getMirror() { if(pgMirror == NULL) { pgMirror = new PGroup(); pgMirror->mPHandle = GA_Pgroup_get_mirror(); } return pgMirror; } GA::PGroup* GA::PGroup::getWorld() { if(pgWorld == NULL) { pgWorld = new PGroup(); pgWorld->mPHandle = GA_Pgroup_get_world(); } return pgWorld; } void GA::PGroup::setDefault(GA::PGroup* p_handle) { pgDefault->mPHandle = p_handle->mPHandle; } void GA::PGroup::brdcst(void* buf, int lenbuf, int root) { GA_Pgroup_brdcst(mPHandle, buf, lenbuf, root); } void GA::PGroup::gop(double *buf, int n, char* op) { GA_Pgroup_dgop(mPHandle, buf, n, op); } void GA::PGroup::gop(long *buf, int n, char* op) { GA_Pgroup_lgop(mPHandle, buf, n, op); } void GA::PGroup::gop(int *buf, int n, char* op) { GA_Pgroup_igop(mPHandle, buf, n, op); } void GA::PGroup::gop(float *buf, int n, char* op) { GA_Pgroup_fgop(mPHandle, buf, n, op); } int GA::PGroup::nodeid() { return GA_Pgroup_nodeid(mPHandle); } int GA::PGroup::nodes() { return GA_Pgroup_nnodes(mPHandle); } void GA::PGroup::sync() { GA_Pgroup_sync(mPHandle); } ga-5-4/ga++/src/services.cc0000644000175000017500000000727312662210515013477 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "ga++.h" GA::GlobalArray * GA::createGA(int type, int ndim, int dims[], char *arrayname, int chunk[]) { return new GA::GlobalArray(type, ndim, dims, arrayname, chunk); } GA::GlobalArray * GA::createGA(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]) { return new GA::GlobalArray(type, ndim, dims, arrayname, block, maps); } GA::GlobalArray * GA::createGA(const GA::GlobalArray *g_b, char *arrayname) { return new GA::GlobalArray(*g_b, arrayname); } GA::GlobalArray * GA::createGA(const GA::GlobalArray &g_b) { return new GA::GlobalArray(g_b); } GA::GlobalArray * GA::createGA() { return new GA::GlobalArray(); } GA::GlobalArray * GA::createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int chunk[]) { /* last argument is a dummy argument, just to increase the count of the number of arguments, inorder to avoid conflict in # of args */ return new GA::GlobalArray(type, ndim, dims, width, array_name, chunk, 'g'); } GA::GlobalArray * GA::createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int map[], int nblock[]) { return new GA::GlobalArray(type, ndim, dims, width, array_name, map, nblock, 'g'); } int GA::getDebug() { return GA_Get_debug(); } void GA::brdcst(void *buf, int lenbuf, int root) { GA_Brdcst(buf, lenbuf, root); } int GA::clusterNnodes() { return GA_Cluster_nnodes(); } int GA::clusterNodeid() { return GA_Cluster_nodeid(); } int GA::clusterProcNodeid(int iproc) { return GA_Cluster_proc_nodeid(iproc); } int GA::clusterNprocs(int inode) { return GA_Cluster_nprocs(inode); } int GA::clusterProcid(int inode, int iproc) { return GA_Cluster_procid(inode, iproc); } int GA::createMutexes(int number) { return GA_Create_mutexes(number); } int GA::deregisterType(int size) { return NGA_Deregister_type(size); } int GA::destroyMutexes() { return GA_Destroy_mutexes(); } void GA::dgop(double x[], int n, char *op) { GA_Dgop(x, n, op); } int GA::duplicate(int g_a, char* array_name) { return GA_Duplicate(g_a, array_name); } void GA::error(const char *message, int code) { GA_Error((char *)message, code); } void GA::fence() { GA_Fence(); } void GA::gop(int x[], int n, char *op) { GA_Igop(x, n, op); } void GA::gop(long x[], int n, char *op) { GA_Lgop(x, n, op); } void GA::gop(float x[], int n, char *op) { GA_Fgop(x, n, op); } void GA::gop(double x[], int n, char *op) { GA_Dgop(x, n, op); } void GA::igop(int x[], int n, char *op) { GA_Igop(x, n, op); } void GA::initFence() { GA_Init_fence(); } size_t GA::inquireMemory() { return GA_Inquire_memory(); } void GA::lgop(long x[], int n, char *op) { GA_Lgop(x, n, op); } void GA::lock(int mutex) { GA_Lock(mutex); } void GA::maskSync(int first, int last) { GA_Mask_sync(first, last); } int GA::memoryAvailable() { return GA_Memory_avail(); } int GA::memoryLimited() { return GA_Memory_limited(); } void GA::nbWait(GANbhdl *nbhandle) { NGA_NbWait(nbhandle); } int GA::nodeid() { return GA_Nodeid(); } int GA::nodes() { return GA_Nnodes(); } void GA::printStats() { GA_Print_stats(); } int GA::registerType(size_t size) { return NGA_Register_type(size); } void GA::setDebug(int dbg) { return GA_Set_debug(dbg); } void GA::setMemoryLimit(size_t limit) { GA_Set_memory_limit(limit); } void GA::summarize(int verbose) { GA_Summarize(verbose); } void GA::sync() { GA_Sync(); } void GA::unlock(int mutex) { GA_Unlock(mutex); } int GA::usesMA() { return GA_Uses_ma(); } int GA::usesFAPI() { return GA_Uses_fapi(); } double GA::wtime() { return GA_Wtime(); } ga-5-4/ga++/src/init_term.h0000644000175000017500000000404312662210515013500 0ustar mbamba/** * @file init_term.h * * Ga Initialize and Terminate calls. */ #ifndef _INITTERM_H #define _INITTERM_H namespace GA { /** * Initialize Global Arrays. * Allocate and initialize internal data structures in Global Arrays. * The limit is per process: it is the amount of memory that the given * processor can contribute to collective allocation of global arrays. * It does not include temporary storage that GA might be allocating (and * releasing) during execution of a particular operation. * limit < 0 means "allow unlimited memory usage" in which case this * operation is equivalent to GA_initialize. This is a collective operation. * @param argc,argv - command line argument lists. * @param limit - amount of memory in bytes per process [input] */ void Initialize(int argc, char *argv[], size_t limit = 0); /** *Initialize Global Arrays. * Allocate and initialize internal data structures in Global Arrays. * The limit is per process: it is the amount of memory that the given * processor can contribute to collective allocation of global arrays. * It does not include temporary storage that GA might be allocating (and * releasing) during execution of a particular operation. * limit < 0 means "allow unlimited memory usage" in which case this * operation is equivalent to GA_initialize. This is a collective operation. * @param argc,argv - command line argument lists. * @param limit - amount of memory in bytes per process [input] * @param heapSize, stackSize - all of the dynamically allocated local memory * @param type - data type. * in GA comes from its companion library, the Memory Allocator (MA) library. * MA allocates and manages local memory using stack and heap disciplines. * [refer section 3.2 of GA USer manual for more info] */ void Initialize(int argc, char *argv[], unsigned long heapSize, unsigned long stackSize, int type, size_t limit = 0); /** * Delete all active arrays and destroy internal data structures. * This is a collective operation. */ void Terminate(); } #endif /* _INITTERM_H */ ga-5-4/ga++/src/overload.cc0000644000175000017500000000460612662210515013464 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "ga++.h" #ifdef FALSE #undef FALSE #endif #ifdef TRUE #undef TRUE #endif #define FALSE 0 #define TRUE 1 /** * More operator overloading stuff (a lot!!) to come. */ GA::GlobalArray& GA::GlobalArray::operator=(const GA::GlobalArray &g_a) { if(this != &g_a) { GA_Destroy(mHandle); mHandle = GA_Duplicate(g_a.mHandle, g_a.inquireName()); if(!mHandle) GA_Error((char *)" GA creation failed",0); GA_Copy(g_a.mHandle, mHandle); } return *this; } int GA::GlobalArray::operator==(const GA::GlobalArray &g_a) const { long isEqual = TRUE; int i, type1, type2, ndim1, ndim2, dims1[GA_MAX_DIM], dims2[GA_MAX_DIM]; int alo[GA_MAX_DIM], ahi[GA_MAX_DIM], blo[GA_MAX_DIM], bhi[GA_MAX_DIM]; NGA_Inquire(mHandle, &type1, &ndim1, dims1); NGA_Inquire(g_a.mHandle, &type2, &ndim2, dims2); if(type1 != type2) isEqual = FALSE; // check type if(GA_Compare_distr(mHandle, g_a.mHandle)) isEqual = FALSE; NGA_Distribution(mHandle, GA_Nodeid(), alo, ahi); NGA_Distribution(g_a.mHandle, GA_Nodeid(), blo, bhi); if(ahi[0] != bhi[0]) isEqual = FALSE; // check process owns data? if(ahi[0] >= 0) { // true => process owns data void *ptr1 = NULL, *ptr2 = NULL; int ld1[GA_MAX_DIM]; int ld2[GA_MAX_DIM]; int num = 0; NGA_Access(mHandle, alo, ahi, &ptr1, ld1); NGA_Access(g_a.mHandle, blo, bhi, &ptr2, ld2); // number of elements I own. for(i=0; i * 5 5 * P0 P3 2 * P1 P4 4 * P2 P5 2 * * * This is a collective operation. * * @param[in] arrayname a unique character string * @param[in] type MA data type (MT_F_DBL,MT_F_INT,MT_F_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims array of dimension values * @param[in] block [ndim] no. of blocks each dimension is divided into * @param[in] maps [s] starting index for for each block; * the size s is a sum all elements of nblock array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] arrayname a character string * @param[in] g_b integer handle for reference array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(const GlobalArray *g_b, char *arrayname); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] g_b integer handle for reference array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(const GlobalArray &g_b); /** * Creates a 10x10 global array of type "double"(default). * * This is a collective operation. * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA(); /** * Creates an ndim-dimensional array with a layer of ghost cells around * the visible data on each processor using the regular distribution * model and returns an integer handle representing the array. * The array can be distributed evenly or not evenly. The control over * the distribution is accomplished by specifying chunk (block) size for * all or some of the array dimensions. For example, for a 2-dimensional * array, setting chunk(1)=dim(1) gives distribution by vertical strips * (chunk(1)*dims(1)); setting chunk(2)=dim(2) gives distribution by * horizontal strips (chunk(2)*dims(2)). Actual chunks will be modified * so that they are at least the size of the minimum and each process * has either zero or one chunk. Specifying chunk(i) as <1 will cause * that dimension (i-th) to be distributed evenly. The width of the * ghost cell layer in each dimension is specified using the array * width(). The local data of the global array residing on each * processor will have a layer width[n] ghosts cells wide on either * side of the visible data along the dimension n. * * This is a collective operation. * * @param[in] array_name a unique character string * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] chunk [ndim] array of chunks, each element specifies * minimum size that given dimensions should be * chunked up into * * @returns pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int chunk[]); /** * Creates an array with ghost cells by following the user-specified * distribution and returns integer handle representing the array. * The distribution is specified as a Cartesian product of distributions * for each dimension. For example, the following figure demonstrates * distribution of a 2-dimensional array 8x10 on 6 (or more) processors. * nblock(2)={3,2}, the size of map array is s=5 and array map contains * the following elements map={1,3,7, 1, 6}. The distribution is * nonuniform because, P1 and P4 get 20 elements each and processors * P0,P2,P3, and P5 only 10 elements each. * * * * * * *
5 5
P0 P3 2
P1 P4 4
P2 P5 2
* * The array width[] is used to control the width of the ghost cell * boundary around the visible data on each processor. The local data * of the global array residing on each processor will have a layer * width[n] ghosts cells wide on either side of the visible data along * the dimension n. * * This is a collective operation. * * @param[in] array_name a unique character string * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] nblock [ndim] no. of blocks each dimension is divided into * @param[in] map [s] starting index for for each block; * the size s is a sum of all elements of nblock array * * @return pointer to GlobalArray object created; NULL if it fails */ GlobalArray * createGA_Ghosts(int type, int ndim, int dims[], int width[], char *array_name, int map[], int nblock[]); /** * Broadcast from process root to all other processes a message of * length lenbuf. This is operation is provided only for convenience * purposes: it is available regardless of the message-passing library * that GA is running with. * * This is a collective operation. * * @param[in] lenbuf length of buffer * @param[in,out] buf [lenbuf] data * @param[in] root root process */ void brdcst(void *buf, int lenbuf, int root); /** * Returns the current value of the internal debug flag. * * This is a local operation. * * @return 0 if the debug flag is false, 1 if it is true. */ int getDebug(); /** * This functions returns the total number of nodes that the program is * running on. * * On SMP architectures, this will be less than or equal to the total * number of processors. * * This is a local operation. * * @return the number of nodes the program is running on */ int clusterNnodes(); /** * This function returns the node ID of the process. * * On SMP architectures with more than one processor per node, several * processes may return the same node id. * * This is a local operation. * * @return the node ID of the process */ int clusterNodeid(); /** * This function returns the cluster node ID of the specified process. * * On SMP architectures with more than one processor per node, several * processes may return the same node id. * * This is a local operation. * * @return the cluster node ID of the specified process */ int clusterProcNodeid(int iproc); /** * This function returns the number of processors available on node inode. * * This is a local operation. * * @param[in] inode * * @return the number of processors available on the given node */ int clusterNprocs(int inode); /** * This function returns the processor id associated with node inode and * the local processor id iproc. * * If node inode has N processors, then the value of iproc lies between * 0 and N-1. * * This is a local operation. * * @param[in] inode * @param[in] iproc * * @return the processor ID associated with the given node and local processor * ID */ int clusterProcid(int inode, int iproc); /** * Creates a set containing the number of mutexes. * * Mutex is a simple synchronization object used to protect Critical * Sections. Only one set of mutexes can exist at a time. Array of mutexes * can be created and destroyed as many times as needed. * Mutexes are numbered: 0, ..., number -1. * * This is a collective operation. * * @param[in] number of mutexes in mutex array * * @return 0 if the opereation succeeded or 1 when failed. */ int createMutexes(int number); /** * Remove a user defined data type from GA * * @param[in] type - user defined data type * * @return 0 is operation is successful * -2 if type not registered * -1 if type reserved */ int deregisterType(int type); /** * Destroys the set of mutexes created with ga_create_mutexes. * * This is a collective operation. * * @return 0 if the operation succeeded or 1 when failed. */ int destroyMutexes(); /** * Double Global OPeration. * * X(1:N) is a vector present on each process. DGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void dgop(double x[], int n, char *op); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] array_name a character string * @param[in] g_a integer handle for reference array * * @return array handle; a non-zero array handle means the call was succesful. */ int duplicate(int g_a, char* array_name); /** * To be called in case of an error. * * Print an error message and an integer value that represents error code. * Releases some system resources. * This is the required way of aborting the program execution. * * This operation is local. * * @param[in] message string to print * @param[in] code code to print */ void error(const char *message, int code); /** * Blocks the calling process until all the data transfers corresponding to * GA operations called after ga_init_fence complete. * * For example, since ga_put might return before the data reaches the final * destination, ga_init_fence and ga_fence allow process to wait until the * data tranfer is fully completed: * * @code * ga_init_fence(); * ga_put(g_a, ...); * ga_fence(); * @endcode * * ga_fence must be called after ga_init_fence. A barrier, ga_sync, assures * completion of all data transfers and implicitly cancels all outstanding * ga_init_fence calls. ga_init_fence and ga_fence must be used in pairs, * multiple calls to ga_fence require the same number of corresponding * ga_init_fence calls. ga_init_fence/ga_fence pairs can be nested. * * ga_fence works for multiple GA operations. For example: * * @code * ga_init_fence(); * ga_put(g_a, ...); * ga_scatter(g_a, ...); * ga_put(g_b, ...); * ga_fence(); * @endcode * * The calling process will be blocked until data movements initiated by * two calls to ga_put and one ga_scatter complete. */ void fence(); /** * Integer Global OPeration. * * The integer version of ga_dgop described above, also include the bitwise OR * operation. This is operation is provided only for convenience purposes: it * is available regardless of the message-passing library that GA is running * with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(int x[], int n, char *op); /** * Long Global OPeration. * * X(1:N) is a vector present on each process. LGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(long x[], int n, char *op); /** * Float Global OPeration. * * X(1:N) is a vector present on each process. FGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(float x[], int n, char *op); /** * Double Global OPeration. * * X(1:N) is a vector present on each process. DGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void gop(double x[], int n, char *op); /** * Integer Global OPeration. * * The integer (more precisely long) version of ga_dgop described above, * also include the bitwise OR operation. * This is operation is provided only for convenience purposes: it is * available regardless of the message-passing library that GA is running * with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void igop(int x[], int n, char *op); /** * Initializes tracing of completion status of data movement operations. * * This operation is local. */ void initFence(); /** * Returns amount of memory (in bytes) used in the allocated global * arrays on the calling processor. * * This operation is local. * * @return amount of memory (in bytes) used in the allocated global arrays on * the calling processor */ size_t inquireMemory(); /** * Long Global OPeration. * * X(1:N) is a vector present on each process. LGOP 'sums' elements of * X accross all nodes using the commutative operator OP. The result is * broadcast to all nodes. Supported operations include '+', '*', 'max', * 'min', 'absmax', 'absmin'. The use of lowerecase for operators is * necessary. This is operation is provided only for convenience purposes: * it is available regardless of the message-passing library that GA is * running with. * * This is a collective operation. * * @param[in] n number of elements * @param[in,out] x [n] array of elements * @param[in] op operator */ void lgop(long x[], int n, char *op); /** * Locks a mutex object identified by the mutex number. It is a fatal * error for a process to attempt to lock a mutex which was already * locked by this process. * * @param[in] mutex object id */ void lock(int mutex); /** * Mask the intrinsic sync operations during collective calls. * * GA Collective calls has Sync calls at the begining and ending of * of the call. Sometimes there may be some redundacy in sync calls, which * can be avoided by masking the sync operations. * * Setting the parameters as zero will mask (disable) the call. Any non-zero * value will enable the call. Initially these params are set to non-zero * value. * * @param[in] first masks the sync at the begining of the collective call. * @param[in] last masks the sync at the end of the collective call. */ void maskSync(int first, int last); /** * If GA_uses_ma returns true, then GA_Memory_avail returns the * lesser of the amount available under the GA limit and the amount * available from MA (according to ma_inquire_avail operation). * If no GA limit has been set, it returns what MA says is available. * If ( ! GA_Uses_ma() && ! GA_Memory_limited() ) returns < 0, indicating * that the bound on currently available memory cannot be determined. * * This operation is local. * * @return amount of memory (in bytes) left for allocation of new * global arrays on the calling processor. * */ int memoryAvailable() ; /** * Indicates if limit is set on memory usage in Global Arrays on the * calling processor. * * This operation is local. * * @return 1 means "yes", "0" means "no". */ int memoryLimited(); /** * Force completion of a nonblocking operation locally. * * Waiting on a nonblocking put or an accumulate operation assures that data * was injected into the network and the user buffer can be now be reused. * Completing a get operation assures data has arrived into the user memory * and is ready for use. Wait operation ensures only local completion. Unlike * their blocking counterparts, the nonblocking operations are not ordered * with respect to the destination. Performance being one reason, the other * reason is that by ensuring ordering we incur additional and possibly * unnecessary overhead on applications that do not require their operations * to be ordered. For cases where ordering is necessary, it can be done by * calling a fence operation. The fence operation is provided to the user to * confirm remote completion if needed. * * This is a local operation. * * @param[in] nbhandle nonblocking handle */ void nbWait(GANbhdl *nbhandle); /** * Returns the GA process id (0, ..., ga_Nnodes()-1) of the requesting * compute process. * * This operation is local. * * @return the GA process ID of the requesting process */ int nodeid(); /** * Returns the number of the GA compute (user) processes. * * This operation is local. * * @return the number of GA processes */ int nodes(); /** * Print statistical information on GA use. * * This non-collective (MIMD) operation prints information about: * - number of calls to * - create * - duplicate * - destroy * - get * - put * - scatter * - gather * - read_and_inc operations * - total amount of data moved in the primitive operations * - amount of data moved in the primitive operations to logicaly remote * locations * - maximum memory consumption in global arrays * - number of requests serviced in the interrupt-driven implementations * by the calling process. * * This operation is local. */ void printStats(); /** * Add a user defined data type to GA * * @param[in] size - size (in bytes) of user defined data type * * @return handle for new data type */ int registerType(size_t size); /** * This function sets an internal flag in the GA library to either true or * false. * * The value of this flag can be recovered at any time using the * getDebug function. The flag is set to false when the the GA library * is initialized. This can be useful in a number of debugging situations, * especially when examining the behavior of routines that are called in * multiple locations in a code. * * This is a local operation. * * @param[in] dbg value to set internal flag */ void setDebug(int dbg); /** * Sets the amount of memory to be used (in bytes) per process. * * This is a local operation. * * @param[in] limit the amount of memory in bytes per process */ void setMemoryLimit(size_t limit); /** * Prints info about allocated arrays. * * @param[in] verbose if true print distribution info */ void summarize(int verbose); /** * Synchronize processes (a barrier) and ensure that all GA operations * completed. * * This is a collective operation. */ void sync(); /** * Unlocks a mutex object identified by the mutex number. * * It is a fatal error for a process to attempt to unlock a mutex which has * not been locked by this process. * * @param[in] mutex object id */ void unlock(int mutex); /** * Returns whether memory comes from internal or external allocator. * * This operation is local. * * @return "1" if memory comes from MA; * "0" if memory comes from another source e.g. System V shared memory */ int usesMA(); /** * Returns whether GA is using Fortran indexing. * * @return "1" if uses fortran API, else returns "0" */ int usesFAPI(); /** * This function return a wall (or elapsed) time on the calling processor. * * Returns time in seconds representing elapsed wall-clock time * since an arbitrary time in the past. Example: * * @code * double starttime, endtime; * starttime = GA::wtime(); * // {{.... code snippet to be timed ....}} * endtime = GA::wtime(); * printf("Time taken = %lf seconds\n", endtime-starttime); * @endcode * * This is a local operation. * * @note This function is only available in release 4.1 or greater. */ double wtime(); } #endif /* _SERVICES_H */ ga-5-4/ga++/src/GlobalArray.h0000644000175000017500000031056012662210515013711 0ustar mbamba#ifndef _GLOBALARRAY_H #define _GLOBALARRAY_H namespace GA { class PGroup; /** * This is the GlobalArray class. */ class GlobalArray { public: /** * Creates an ndim-dimensional array using the regular distribution * model and returns integer handle representing the array. * The array can be distributed evenly or not. The control over the * distribution is accomplished by specifying chunk (block) size for all or * some of array dimensions. * For example, for a 2-dimensional array, setting chunk[0]=dim[0] gives * distribution by vertical strips (chunk[0]*dims[0]); * setting chunk[1]=dim[1] gives distribution by horizontal strips * (chunk[1]*dims[1]). Actual chunks will be modified so that they are at * least the size of the minimum and each process has either zero or one * chunk. Specifying chunk[i] as <1 will cause that dimension to be * distributed evenly. * As a convenience, when chunk is specified as NULL, the entire array is * distributed evenly. * This is a collective operation. * @param[in] type data type(MT_F_DBL,MT_F_INT,MT_F_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] arrayname a unique character string * @param[in] chunk [ndim] array of chunks, each element specifies * minimum size that given dimensions should be chunked * up into */ GlobalArray(int type, int ndim, int dims[], char *arrayname, int chunk[]); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[]) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int dims[], char *arrayname, int chunk[], PGroup* p_handle); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[]) */ GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t chunk[]); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[]) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t chunk[], PGroup* p_handle); /** * Creates an array by following the user-specified distribution. * * The distribution is specified as a Cartesian product of distributions * for each dimension. The array indices start at 0. For example, the * following figure demonstrates distribution of a 2-dimensional array 8x10 * on 6 (or more) processors. nblock[2]={3,2}, the size of map array is s=5 * and array map contains the following elements map={0,2,6, 0, 5}. The * distribution is nonuniform because, P1 and P4 get 20 elements each and * processors P0,P2,P3, and P5 only 10 elements each. * * * * * * *
5 5
P0 P3 2
P1 P4 4
P2 P5 2
* * This is a collective operation. * * @param[in] type MA data type (MT_F_DBL,MT_F_INT,MT_F_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims array of dimension values * @param[in] arrayname a unique character string * @param[in] block [ndim] no. of blocks each dimension is divided into * @param[in] maps [s] starting index for for each block; * the size s is a sum all elements of nblock array */ GlobalArray(int type, int ndim, int dims[], char *arrayname, int block[], int maps[]); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[],int[]) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int dims[], char *arrayname, int block[], int maps[], PGroup* p_handle); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[],int[]) */ GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t block[], int64_t maps[]); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],char*,int[],int[]) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int64_t dims[], char *arrayname, int64_t block[], int64_t maps[], PGroup* p_handle); /** * Creates an ndim-dimensional array with a layer of ghost cells around * the visible data on each processor using the regular distribution model. * * The array can be distributed evenly or not evenly. The control over * the distribution is accomplished by specifying chunk (block) size for * all or some of the array dimensions. For example, for a 2-dimensional * array, setting chunk(1)=dim(1) gives distribution by vertical strips * (chunk(1)*dims(1)); setting chunk(2)=dim(2) gives distribution by * horizontal strips (chunk(2)*dims(2)). Actual chunks will be modified * so that they are at least the size of the minimum and each process * has either zero or one chunk. Specifying chunk(i) as <1 will cause * that dimension (i-th) to be distributed evenly. The width of the * ghost cell layer in each dimension is specified using the array * width(). The local data of the global array residing on each * processor will have a layer width[n] ghosts cells wide on either * side of the visible data along the dimension n. * * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] arrayname a unique character string * @param[in] chunk [ndim] array of chunks, each element specifies * minimum size that given dimensions should be * chunked up into * @param[in] ghosts this is a dummy parameter: added to increase the * number of arguments, inorder to avoid the conflicts * among constructors. (ghosts = 'g' or 'G') */ GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int chunk[], char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],char) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int chunk[], PGroup* p_handle, char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],char) */ GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t chunk[], char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],char) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t chunk[], PGroup* p_handle, char ghosts); /** * Creates an array with ghost cells by following the user-specified * distribution. * * The distribution is specified as a Cartesian product of distributions * for each dimension. For example, the following figure demonstrates * distribution of a 2-dimensional array 8x10 on 6 (or more) processors. * nblock(2)={3,2}, the size of map array is s=5 and array map contains * the following elements map={1,3,7, 1, 6}. The distribution is * nonuniform because, P1 and P4 get 20 elements each and processors * P0,P2,P3, and P5 only 10 elements each. * * * * * * *
5 5
P0 P3 2
P1 P4 4
P2 P5 2
* * The array width[] is used to control the width of the ghost cell * boundary around the visible data on each processor. The local data * of the global array residing on each processor will have a layer * width[n] ghosts cells wide on either side of the visible data along * the dimension n. This is a collective operation. * * @param[in] type data type (MT_DBL,MT_INT,MT_DCPL) * @param[in] ndim number of array dimensions * @param[in] dims [ndim] array of dimensions * @param[in] width [ndim] array of ghost cell widths * @param[in] arrayname a unique character string * @param[in] block [ndim] no. of blocks each dimension is divided into * @param[in] maps [s] starting index for for each block; * the size s is a sum of all elements of nblock array * @param[in] ghosts this is a dummy parameter: added to increase the * number of arguments, inorder to avoid the conflicts * among constructors. (ghosts = 'g' or 'G') */ GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int block[], int maps[], char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],int[],char) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int dims[], int width[], char *arrayname, int block[], int maps[], PGroup* p_handle, char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],int[],char) */ GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t block[], int64_t maps[], char ghosts); /** * @copydoc GlobalArray::GlobalArray(int,int,int[],int[],char*,int[],int[],char) * @param[in] p_handle processor group handle */ GlobalArray(int type, int ndim, int64_t dims[], int64_t width[], char *arrayname, int64_t block[], int64_t maps[], PGroup* p_handle, char ghosts); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] arrayname a character string * @param[in] g_a integer handle for reference array */ GlobalArray(const GlobalArray &g_a, char *arrayname); /** * Creates a new array by applying all the properties of another existing * array. * * This is a collective operation. * * @param[in] g_a integer handle for reference array */ GlobalArray(const GlobalArray &g_a); /** * Creates a new array with no existing attributes. * * @note All attributes must subsequently be set using the "set" methods. * * This is a collective operation. */ GlobalArray(); /** Destructor */ ~GlobalArray(); /* access the data */ /** @return the array handle */ int handle() const { return mHandle; } /* Global Array operations */ /** * Combines data from local array buffer with data in the global array * section. * * @note The local array is assumed to be have the same number of dimensions * as the global array. * * global array section (lo[],hi[]) += *alpha * buffer * * This is a one-sided and atomic operation. * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section * @param[in] buf pointer to the local buffer array * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array * @param[in] alpha scale factor (double/DoubleComplex/long *) */ void acc(int lo[], int hi[], void *buf, int ld[], void *alpha) const; /** * @copydoc GlobalArray::acc(int[],int[],void*,int[],void*)const */ void acc(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], void *alpha) const; /** * Provides access to the specified patch of a global array. * * Returns array of leading dimensions ld and a pointer to the first element * in the patch. This routine allows to access directly, in place * elements in the local section of a global array. It useful for * writing new GA operations. A call to ga_access normally follows a * previous call to ga_distribution that returns coordinates of the * patch associated with a processor. You need to make sure that the * coordinates of the patch are valid (test values returned from * ga_distribution). * * Each call to ga_access has to be followed by a call to either * ga_release or ga_release_update. You can access in this fashion only * local data. Since the data is shared with other processes, you need * to consider issues of mutual exclusion. This operation is local. * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section * @param[out] ptr points to location of first element in patch * @param[out] ld [ndim-1] leading dimensions for the pacth elements */ void access(int lo[], int hi[], void *ptr, int ld[]) const; /** * @copydoc GlobalArray::access(int[],int[],void*,int[])const */ void access(int64_t lo[], int64_t hi[], void *ptr, int64_t ld[]) const; /** * Provides access to the specified block of a global array that is using * simple block-cyclic data distribution. Returns array of leading * dimensions ld and a pointer to the first element in the patch. This * routine allows user to access directly, in-place * elements in the * local section of a global array. It useful for writing new GA * operations. A call to ga_access normally follows a previous call to * ga_distribution that returns coordinates of the patch associated with * a processor. You need to make sure that the coordinates of the patch * are valid (test values returned from * ga_distribution). * * Each call to ga_access_block has to be followed by a call to either * ga_release_block or ga_release_block_update. You can access in this * fashion only local data. Since the data is shared with other processes, * you need to consider issues of mutual exclusion. This operation is * local. * * @param[in] idx index of block * @param[out] ptr points to location of first element in patch * @param[out] ld [ndim-1] leading dimensions for the pacth elements */ void accessBlock(int idx, void *ptr, int ld[]) const; /** * @copydoc GlobalArray::accessBlock(int,void*,int[])const */ void accessBlock(int64_t idx, void *ptr, int64_t ld[]) const; /** * Provides access to the specified block of a global array that is using * SCALAPACK type block-cyclic data distribution. Returns array of leading * dimensions ld and a pointer to the first element in the patch. This * routine allows user to access directly, in-place * elements in the * local section of a global array. It useful for writing new GA * operations. A call to ga_access_block normally follows a previous call to * ga_distribution that returns coordinates of the patch associated with * a processor. You need to make sure that the coordinates of the patch * are valid (test values returned from * ga_distribution). * * Each call to ga_access_block_grid has to be followed by a call to either * ga_release_block_grid or ga_release_block_grid_update. You can access in * this fashion only local data. Since the data is shared with other * processes, you need to consider issues of mutual exclusion. This * operation is local. * * @param[in] index [ndim] indices of block in processor grid * @param[out] ptr points to location of first element in patch * @param[out] ld [ndim-1] leading dimensions for the pacth elements */ void accessBlockGrid(int index[], void *ptr, int ld[]) const; /** * @copydoc GlobalArray::accessBlockGrid(int[],void*,int[])const */ void accessBlockGrid(int64_t index[], void *ptr, int64_t ld[]) const; /** * Provides access to the local data of a global array that is using * either the simple or SCALAPACK type block-cyclic data distribution. * Returns the length of the local data block and a pointer to the first * element. This routine allows user to access directly, in-place * elements in the local section of a global array. It useful for writing * new GA operations. * * Each call to ga_access_segment has to be followed by a call to either * ga_release_segment or ga_release_segmentupdate. You can access in * this fashion only local data. Since the data is shared with other * processes, you need to consider issues of mutual exclusion. This * operation is local. * * @param[in] index processor ID * @param[out] ptr points to location of first element * @param[out] len length of locally held data */ void accessBlockSegment(int index, void *ptr, int *len) const; /** * @copydoc GlobalArray::accessBlockSegment(int,void*,int*)const */ void accessBlockSegment(int index, void *ptr, int64_t *len) const; /** * Provides access to the local patch of the global array. Returns * leading dimension ld and and pointer for the data. This routine * will provide access to the ghost cell data residing on each processor. * Calls to accessGhosts should normally follow a call to * distribution that returns coordinates of the visible data patch * associated with a processor. You need to make sure that the coordinates * of the patch are valid (test values returned from distribution). * * You can only access local data. * This is a local operation. * * @param[out] dims [ndim] array of dimensions of local patch, * including ghost cells * @param[out] ptr returns an index corresponding to the origin the global * array patch held locally on the processor * @param[out] ld [ndim-1] physical dimensions of the local array patch, * including ghost cells */ void accessGhosts(int dims[], void *ptr, int ld[]) const; /** * @copydoc GlobalArray::accessGhosts(int[],void*,int[])const */ void accessGhosts(int64_t dims[], void *ptr, int64_t ld[]) const; /** * This function can be used to return a pointer to any data element * in the locally held portion of the global array and can be used to * directly access ghost cell data. The array subscript refers to the * local index of the element relative to the origin of the local * patch (which is assumed to be indexed by (0,0,...)). * * This is a local operation. * * @param[out] ptr index pointing to location of element * indexed by subscript[] * @param[in] subscript [ndim] array of integers that index desired element * @param[out] ld [ndim-1] array of strides for local data patch. * These include ghost cell widths. */ void accessGhostElement(void *ptr, int subscript[], int ld[]) const; /** * @copydoc GlobalArray::accessGhostElement(void*,int[],int[])const */ void accessGhostElement(void *ptr, int64_t subscript[], int64_t ld[]) const; /** * The arrays are aded together elemet-wise: * [for example: g_c.add(...,g_a, .., g_b);] * c = alpha * a + beta * b * The result c may replace one of he input arrays(a/b). * This is a collective operation. * * @param[in] alpha scale factor * @param[in] g_a array * @param[in] beta scale factor * @param[in] g_b array */ void add(void *alpha, const GlobalArray * g_a, void *beta, const GlobalArray * g_b) const; /** * Patches of arrays (which must have the same number of elements) are * added together element-wise. * c[ ][ ] = alpha * a[ ][ ] + beta * b[ ][ ]. * * This is a collective operation. * * @param[in] alpha scale factor * @param[in] g_a global array * @param[in] alo patch of g_a * @param[in] ahi patch of g_a * @param[in] beta scale factor * @param[in] g_b global array * @param[in] blo patch of g_b * @param[in] bhi patch of g_b * @param[in] clo patch of this GlobalArray * @param[in] chi patch of this GlobalArray */ void addPatch(void *alpha, const GlobalArray * g_a, int alo[], int ahi[], void *beta, const GlobalArray * g_b, int blo[], int bhi[], int clo[], int chi[]) const; /** * @copydoc GlobalArray::addPatch(void*,const GlobalArray*,int[],int[],void*,const GlobalArray*,int[],int[],int[],int[])const */ void addPatch( void *alpha, const GlobalArray * g_a, int64_t alo[], int64_t ahi[], void *beta, const GlobalArray * g_b, int64_t blo[], int64_t bhi[], int64_t clo[], int64_t chi[]) const; /** * Allocate internal memory etc. to create a global array * * @return TODO */ int allocate() const; /** * This function can be used to preallocate internal buffers that are used by * the gather, scatter and scatter accumulate calls. This avoids repeated * memory allocations in these calls that can reduce performance. The value of * nelems should be set to the maximum number of elements that will be moved * in any single call. * * This is a local operation. * * @param[in] nelems The maximum number of elements that will be moved in * any gather, scatter, scatter-accumulate call */ void allocGatscatBuf(int nelems) const; /** * Check that the global array handle g_a is valid ... if not call * ga_error with the string provided and some more info. * * This operation is local. * * @param[in] string message */ void checkHandle(char* string) const; /** * Compares distributions of two global arrays. * * This is a collective operation. * * @param[in] g_a GlobalArray to compare * * @return 0 if distributions are identical and 1 when they are not. */ int compareDistr(const GlobalArray *g_a) const; /** * Copies elements in array represented by g_a into the array * represented by g_b [say for example: g_b.copy(g_a);]. * The arrays must be the same type, shape, and identically aligned. * * This is a collective operation. * * @param[in] g_a GlobalArray to copy */ void copy(const GlobalArray *g_a) const; /** * Copies elements in a patch of one array (ga) into another one (say for * example:gb.copyPatch(...,ga,....); ). * * The patches of arrays may be of different shapes but must have the same * number of elements. Patches must be nonoverlapping (if gb=ga). * * trans = 'N' or 'n' means that the transpose operator should not be * applied. trans = 'T' or 't' means that transpose operator should be * applied. This is a collective operation. * * @param[in] trans see above * @param[in] ga global array * @param[in] alo ga patch coordinates * @param[in] ahi ga patch coordinates * @param[in] blo this GlobalArray's patch coordinates * @param[in] bhi this GlobalArray's patch coordinates */ void copyPatch(char trans, const GlobalArray* ga, int alo[], int ahi[], int blo[], int bhi[]) const; /** * @copydoc GlobalArray::copyPatch(char,const GlobalArray*,int[],int[],int[],int[])const */ void copyPatch( char trans, const GlobalArray* ga, int64_t alo[], int64_t ahi[], int64_t blo[], int64_t bhi[]) const; /** * Computes element-wise dot product of the two arrays which must be of * the same types and same number of elements. * return value = SUM_ij a(i,j)*b(i,j) * * This is a collective operation. * * @param[in] g_a GlobalArray operand */ double ddot(const GlobalArray * g_a) const; /** * Computes the element-wise dot product of the two (possibly transposed) * patches which must be of the same type and have the same number of * elements. * * @param[in] ta transpose flags * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] g_a global array * @param[in] tb transpose flags * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates */ double ddotPatch(char ta, int alo[], int ahi[], const GlobalArray * g_a, char tb, int blo[], int bhi[]) const; /** * @copydoc GlobalArray::ddotPatch(char,int[],int[],const GlobalArray*,char,int[],int[]const */ double ddotPatch( char ta, int64_t alo[], int64_t ahi[], const GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const; /** * Deallocates the array and frees any associated resources. */ void destroy(); /** * Performs one of the matrix-matrix operations: * [say: g_c.dgemm(..., g_a, g_b,..);] * * C := alpha*op( A )*op( B ) + beta*C, \n * where op( X ) is one of \n * op( X ) = X or op( X ) = X', \n * alpha and beta are scalars, and A, B and C are matrices, with op( A ) * an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. * On entry, transa specifies the form of op( A ) to be used in the * matrix multiplication as follows:\n * ta = 'N' or 'n', op( A ) = A. \n * ta = 'T' or 't', op( A ) = A'. \n * * This is a collective operation. * * @param[in] ta transpose operators * @param[in] tb transpose operators * @param[in] m number of rows of op(A) and of matrix C * @param[in] n number of columns of op(B) and of matrix C * @param[in] k number of columns of op(A) and rows of matrix op(B) * @param[in] alpha scale factors * @param[in] g_a input arrays * @param[in] g_b input arrays * @param[in] beta scale factors */ void dgemm(char ta, char tb, int m, int n, int k, double alpha, const GlobalArray *g_a, const GlobalArray *g_b,double beta) const; /** * @copydoc GlobalArray::dgemm(char,char,int,int,int,double,const GlobalArray*,const GlobalArray*,double)const */ void dgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, double alpha, const GlobalArray *g_a, const GlobalArray *g_b,double beta) const; /** * Solve the generalized eigen-value problem returning all eigen-vectors * and values in ascending order. The input matrices are not overwritten * or destroyed. * * This is a collective operation. * * @param[in] g_s Metric * @param[out] g_v Global matrix to return evecs * @param[out] eval Local array to return evals * */ void diag(const GlobalArray *g_s, GlobalArray *g_v, void *eval) const; /** * Solve the generalized eigen-value problem returning all eigen-vectors * and values in ascending order. Recommended for REPEATED calls if g_s * is unchanged. Values of the control flag: * * value action/purpose * * 0 indicates first call to the eigensolver * * >0 consecutive calls (reuses factored g_s) * * <0 only erases factorized g_s; g_v and eval unchanged * (should be called after previous use if another * eigenproblem, i.e., different g_a and g_s, is to * be solved) * * The input matrices are not destroyed. * * This is a collective operation. * * @param[in] control Control flag * @param[in] g_s Metric * @param[out] g_v Global matrix to return evecs * @param[out] eval Local array to return evals */ void diagReuse(int control, const GlobalArray *g_s, GlobalArray *g_v, void *eval) const; /** * Solve the standard (non-generalized) eigenvalue problem returning * all eigenvectors and values in the ascending order. The input matrix * is neither overwritten nor destroyed. * * This is a collective operation. * * @param[out] g_v Global matrix to return evecs * @param[out] eval Local array to return evals */ void diagStd(GlobalArray *g_v, void *eval) const; /** * TODO */ void diagSeq(const GlobalArray * g_s, const GlobalArray * g_v, void *eval) const; /** * TODO */ void diagStdSeq(const GlobalArray * g_v, void *eval) const; /** * If no array elements are owned by process 'me', the range is returned * as lo[]=-1 and hi[]=-2 for all dimensions. * * The operation is local. * * @param[in] me process number * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section */ void distribution(int me, int* lo, int* hi) const; /** * @copydoc GlobalArray::distribution(int,int*,int*)const */ void distribution(int me, int64_t* lo, int64_t* hi) const; /** * TODO */ float fdot(const GlobalArray * g_a) const; /** * TODO */ float fdotPatch( char t_a, int alo[], int ahi[], const GlobalArray * g_b, char t_b, int blo[], int bhi[]) const; /** * @copydoc GlobalArray::fdotPatch(char,int[],int[],const GlobalArray*,char,int[],int[])const */ float fdotPatch( char t_a, int64_t alo[], int64_t ahi[], const GlobalArray * g_b, char t_b, int64_t blo[], int64_t bhi[]) const; /** * Assign a single value to all elements in the array. * * This is a collective operation. * * @param[in] value pointer to the value of appropriate type * (double/DoubleComplex/long) that matches array type. */ void fill(void *value) const; /** * Fill the patch with value of 'val' * * This is a collective operation. * * @param[in] lo patch of this GlobalArray * @param[in] hi patch of this GlobalArray * @param[in] val value to fill * */ void fillPatch (int lo[], int hi[], void *val) const; /** * @copydoc GlobalArray::fillPatch(int[],int[],void*)const */ void fillPatch (int64_t lo[], int64_t hi[], void *val) const; /** * This function can be used to free preallocate internal buffers that were * set using the allocGatscatBuf call. * * This is a local operation. */ void freeGatscatBuf(); /** * Gathers array elements from a global array into a local array. * The contents of the input arrays (v, subscrArray) are preserved, * but their contents might be (consistently) shuffled on return. * * @code * for(k=0; k<= n; k++){ * v[k] = a[subsArray[k][0]][subsArray[k][1]][subsArray[k][2]]...; * } * @endcode * * This is a one-sided operation. * * @param[in] n number of elements * @param[in] v [n] array containing values * @param[in] subsarray [n][ndim] array of subscripts for each element */ void gather(void *v, int * subsarray[], int n) const; /** * @copydoc GlobalArray::gather(void*,int*[],int)const */ void gather(void *v, int64_t * subsarray[], int64_t n) const; /** * Copies data from global array section to the local array buffer. The * local array is assumed to be have the same number of dimensions as the * global array. Any detected inconsitencies/errors in the input arguments * are fatal. * * Example: For ga_get operation transfering data from the [10:14,0:4] * section of 2-dimensional 15x10 global array into local buffer 5x10 * array we have: lo={10,0}, hi={14,4}, ld={10} * * One-side operation. * * @param[in] lo [ndim] array of starting indices for global array section * @param[in] hi [ndim] array of ending indices for global array section * @param[out] buf pointer to the local buffer array where the data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void get(int lo[], int hi[], void *buf, int ld[]) const; /** * @copydoc GlobalArray::get(int[],int[],void*,int[])const */ void get(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const; /** * The function retrieves the number of blocks along each coordinate dimension * and the dimensions of the individual blocks for a global array with a * block-cyclic data distribution. * * This is a local operation. * * @param[out] num_blocks [ndim] array containing number of blocks along each * coordinate direction * @param[out] block_dims [ndim] array containing block dimensions */ void getBlockInfo(int num_blocks[], int block_dims[]); /** * This function returns 1 if the global array has some dimensions for * which the ghost cell width is greater than zero, it returns 0 otherwise. * * This is a local operation. * * @return 1 if this GlobalArray has some dimensions for which teh ghost * cell width is greater than zero; 0 otherwise */ int hasGhosts() const; /** * Computes element-wise dot product of the two arrays which must be of * the same types and same number of elements. * * This is a collective operation. * * @param[in] g_a GlobalArray * @return value = SUM_ij a(i,j)*b(i,j) */ int idot(const GlobalArray * g_a) const; /** * Computes the element-wise dot product of the two (possibly transposed) * patches which must be of the same type and have the same number of * elements. * * @param[in] ta transpose flags * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] g_a global array * @param[in] tb transpose flags * @param[in] blo this GlobalArray's patch coordinates * @param[in] bhi this GlobalArray's patch coordinates */ long idotPatch( char ta, int alo[], int ahi[], const GlobalArray * g_a, char tb, int blo[], int bhi[]) const; /** * @copydoc GlobalArray::idotPatch(char,int[],int[],const GlobalArray*,char,int[],int[])const */ long idotPatch( char ta, int64_t alo[], int64_t ahi[], const GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const; /** * Returns data type and dimensions of the array. * * This operation is local. * * @param[out] type data type * @param[out] ndim number of dimensions * @param[out] dims array of dimensions */ void inquire(int *type, int *ndim, int dims[]) const; /** * @copydoc GlobalArray::inquire(int*,int*,int[])const */ void inquire(int *type, int *ndim, int64_t dims[]) const; /** * Returns the name of an array represented by the handle g_a. * * This operation is local. * * @return copy of the name of this GlobalArray */ char* inquireName() const; /** * Computes element-wise dot product of the two arrays which must be of * the same types and same number of elements. * * * This is a collective operation. * * @param[in] g_a array handle * * @return value = SUM_ij a(i,j)*b(i,j) */ long ldot(const GlobalArray * g_a) const; /** * Computes the element-wise dot product of the two (possibly transposed) * patches which must be of the same type and have the same number of * elements. * * @param[in] ta transpose flags * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] g_a global array * @param[in] tb transpose flags * @param[in] blo this GlobalArray's patch coordinates * @param[in] bhi this GlobalArray's patch coordinates */ long ldotPatch( char ta, int alo[], int ahi[], const GlobalArray * g_a, char tb, int blo[], int bhi[]) const; /** * @copydoc GlobalArray::ldotPatch(char,int[],int[],const GlobalArray*,char,int[],int[])const */ long ldotPatch( char ta, int64_t alo[], int64_t ahi[], const GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const; /** * Solves a system of linear equations * * A * X = B * * using the Cholesky factorization of an NxN double precision symmetric * positive definite matrix A (epresented by handle g_a). On successful * exit B will contain the solution X. * * This is a collective operation. * * @param[in] g_a coefficient matrix * * @return = 0 : successful exit\n * > 0 : the leading minor of this order is not positive * definite and the factorization could not be completed */ int lltSolve(const GlobalArray * g_a) const; /** * Return in owner the GA compute process id that 'owns' the data. If any * element of subscript[] is out of bounds "-1" is returned. * * This operation is local. * * @param[in] subscript [ndim] element subscript * * @return ID of compute process which owns the data */ int locate(int subscript[]) const; /** * @copydoc GlobalArray::locate(int[])const */ int locate(int64_t subscript[]) const; /** * Return the list of the GA processes id that 'own' the data. Parts of the * specified patch might be actually 'owned' by several processes. If lo/hi * are out of bounds "0" is returned, otherwise return value is equal to the * number of processes that hold the data. This operation is local. * * map[i][0:ndim-1] - lo[i] * * map[i][ndim:2*ndim-1] - hi[i] * * procs[i] - processor id that owns data in patch * lo[i]:hi[i] * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section * @param[out] map [][2*ndim] array with mapping information * @param[out] procs [nproc] list of processes that own a part of selection * * @return 0 if lo/hi are out of bounds, otherwise the number of processes * holding data */ int locateRegion(int lo[], int hi[], int map[], int procs[]) const; /** * @copydoc GlobalArray::locateRegion(int[],int[],int[],int[])const */ int locateRegion(int64_t lo[], int64_t hi[], int64_t map[], int procs[]) const; /** * Solve the system of linear equations op(A)X = B based on the LU * factorization. * * op(A) = A or A' depending on the parameter trans: * * trans = 'N' or 'n' means that the transpose operator should not * be applied. * * trans = 'T' or 't' means that the transpose operator should be applied. * * Matrix A is a general real matrix. Matrix B contains possibly multiple * rhs vectors. The array associated with the handle g_b is overwritten * by the solution matrix X. * This is a collective operation. * * @param[in] trans transpose or not transpose * @param[in] g_a coefficient matrix */ void luSolve(char trans, const GlobalArray * g_a) const; /** * ga_matmul_patch is a patch version of ga_dgemm: * * C[cilo:cihi,cjlo:cjhi] := alpha* AA[ailo:aihi,ajlo:ajhi] * * BB[bilo:bihi,bjlo:bjhi] ) + * beta*C[cilo:cihi,cjlo:cjhi], * * where AA = op(A), BB = op(B), and op( X ) is one of * op( X ) = X or op( X ) = X', * * Valid values for transpose arguments: 'n', 'N', 't', 'T'. It works * for both double and DoubleComplex data tape. * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] ailo patch of g_a * @param[in] aihi patch of g_a * @param[in] ajlo patch of g_a * @param[in] ajhi patch of g_a * @param[in] bilo patch of g_b * @param[in] bihi patch of g_b * @param[in] bjlo patch of g_b * @param[in] bjhi patch of g_b * @param[in] cilo patch of g_c * @param[in] cihi patch of g_c * @param[in] cjlo patch of g_c * @param[in] cjhi patch of g_c * @param[in] alpha scale factors * @param[in] beta scale factors * @param[in] transa transpose operators * @param[in] transb transpose operators */ void matmulPatch(char transa, char transb, void* alpha, void *beta, const GlobalArray *g_a, int ailo, int aihi, int ajlo, int ajhi, const GlobalArray *g_b, int bilo, int bihi, int bjlo, int bjhi, int cilo, int cihi, int cjlo, int cjhi) const; /** * @copydoc GlobalArray::matmulPatch(char,char,void*,void*,const GlobalArray*,int,int,int,int,const GlobalArray*,int,int,int,int,int,int,int,int)const */ void matmulPatch(char transa, char transb, void* alpha, void *beta, const GlobalArray *g_a, int64_t ailo, int64_t aihi, int64_t ajlo, int64_t ajhi, const GlobalArray *g_b, int64_t bilo, int64_t bihi, int64_t bjlo, int64_t bjhi, int64_t cilo, int64_t cihi, int64_t cjlo, int64_t cjhi) const; /** * nga_matmul_patch is a n-dimensional patch version of ga_dgemm: * * C[clo[]:chi[]] := alpha* AA[alo[]:ahi[]] * * BB[blo[]:bhi[]]) + * beta*C[clo[]:chi[]], * * where AA = op(A), BB = op(B), and op( X ) is one of * op( X ) = X or op( X ) = X', * * Valid values for transpose arguments: 'n', 'N', 't', 'T'. It works * for both double and DoubleComplex data tape. * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] alo array of patch of g_a * @param[in] ahi array of patch of g_a * @param[in] blo array of patch of g_b * @param[in] bhi array of patch of g_b * @param[in] clo array of patch of g_c * @param[in] chi array of patch of g_c * @param[in] alpha scale factors * @param[in] beta scale factors * @param[in] transa transpose operators * @param[in] transb transpose operators */ void matmulPatch(char transa, char transb, void* alpha, void *beta, const GlobalArray *g_a, int *alo, int *ahi, const GlobalArray *g_b, int *blo, int *bhi, int *clo, int *chi) const; /** * @copydoc GlobalArray::matmulPatch(char,char,void*,void*,const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void matmulPatch(char transa, char transb, void* alpha, void *beta, const GlobalArray *g_a, int64_t *alo, int64_t *ahi, const GlobalArray *g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const; /** * This function merges all values in a patch of a mirrored array into * a patch in another global array g_b. * * This is a collective operation. * * @param[in] alo [ndim] patch indices of mirrored array * @param[in] ahi [ndim] patch indices of mirrored array * @param[in] blo [ndim] patch indices of result array * @param[in] bhi [ndim] patch indices of result array * @param[out] g_a global array containing result */ void mergeDistrPatch(int alo[], int ahi[], GlobalArray *g_a, int blo[], int bhi[]); /** * @copydoc GlobalArray::mergeDistrPatch(int[],int[],GlobalArray*,int[],int[]) */ void mergeDistrPatch(int64_t alo[], int64_t ahi[], GlobalArray *g_a, int64_t blo[], int64_t bhi[]); /** * This function returns 0 if a global array is not mirrored and 1 if it is. */ int isMirrored(); /** * This function adds together all copies of a mirrored array so that all * copies are the same. * * This is a collective operation. */ void mergeMirrored(); /** * Non-blocking accumalate operation. This is function performs an * accumulate operation and returns a nblocking handle. Completion of the * operation can be forced by calling the nbwait method on the handle. * * This is a onesided operation. * * @param[in] lo [ndim] patch coordinates of block * @param[in] hi [ndim] patch coordinates of block * @param[in] buf local buffer containing data * @param[in] ld [ndim-1] array of strides for local data * @param[in] alpha multiplier for data before adding to existing results * @param[out] nbhandle nonblocking handle */ void nbAcc(int lo[], int hi[], void *buf, int ld[], void *alpha, GANbhdl *nbhandle); /** * @copydoc GlobalArray::nbAcc(int[],int[],void*,int[],void*,GANbhdl*) */ void nbAcc(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], void *alpha, GANbhdl *nbhandle); /** * Non-blocking get operation. This is function gets a data block from a * global array, copies it into a local buffer, and returns a nonblocking * handle. Completion of the operation can be forced by calling the nbwait * method on the handle. * * This is a onesided operation. * * @param[in] lo [ndim] patch coordinates of block * @param[in] hi [ndim] patch coordinates of block * @param[in] buf local buffer to receive data * @param[in] ld [ndim-1] array of strides for local data * @param[out] nbhandle nonblocking handle */ void nbGet(int lo[], int hi[], void *buf, int ld[], GANbhdl *nbhandle); /** * @copydoc GlobalArray::nbGet(int[],int[],void*,int[],GANbhdl*) */ void nbGet(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], GANbhdl *nbhandle); /** * Non-blocking update operation for arrays with ghost cells. Ghost cells * along the coordinates specified in the mask array are updated with * non-blocking get calls. The mask array must contain either 0's or 1's. * * This is a onesided operation. * * @param[in] mask [ndim] array with flags for directions that are * to be updated * @param[out] nbhandle nonblocking handle */ void nbGetGhostDir(int mask[], GANbhdl *nbhandle); /** * @copydoc GlobalArray::nbGetGhostDir(int[],GANbhdl*) */ void nbGetGhostDir(int64_t mask[], GANbhdl *nbhandle); /** * Given a distribution of an array represented by the handle g_a, * returns the number of partitions of each array dimension. * * This operation is local. * * @param[out] nblock [ndim] number of partitions for each dimension */ void nblock(int nblock[]) const; /** * Non-blocking put operation. This is function puts a data block from a * local array, copies it into a global array, and returns a nonblocking * handle. Completion of the operation can be forced by calling the nbwait * method on the handle. * * This is a onesided operation. * * @param[in] lo [ndim] patch coordinates of block * @param[in] hi [ndim] patch coordinates of block * @param[in] buf local buffer that supplies data * @param[in] ld [ndim-1] array of strides for local data * @param[out] nbhandle nonblocking handle */ void nbPut(int lo[], int hi[], void *buf, int ld[], GANbhdl *nbhandle); /** * @copydoc GlobalArray::nbPut(int[],int[],void*,int[],GANbhdl*) */ void nbPut(int64_t lo[], int64_t hi[], void *buf, int64_t ld[], GANbhdl *nbhandle); /** * Returns the number of dimensions in this GlobalArray. * * This operation is local. * * @return number of dimensions aka rank */ int ndim() const; /** * The pack subroutine is designed to compress the values in the source vector * g_src into a smaller destination array g_dest based on the values in an * integer mask array g_mask. The values lo and hi denote the range of * elements that should be compressed and icount is a variable that on output * lists the number of values placed in the compressed array. This operation * is the complement of the ga_unpack operation. An example is shown below * * g_src->pack(g_dest, g_mask, 1, n, icount) * g_mask: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 * g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 * g_dest: 1 7 9 12 15 16 * icount: 6 * * The calling array is the source array. * * This is a collective operation. * * @param[out] g_dest destination array * @param[in] g_mask mask array * @param[in] lo coordinate interval to pack * @param[in] hi coordinate interval to pack * @param[out] icount number of packed elements */ void pack(const GlobalArray *g_dest, const GlobalArray *g_mask, int lo, int hi, int *icount) const; /** * @copydoc GlobalArray::pack(const GlobalArray*,const GlobalArray*,int,int,int*)const */ void pack(const GlobalArray *g_dest, const GlobalArray *g_mask, int64_t lo, int64_t hi, int64_t *icount) const; /** * This subroutine enumerates the values of an array between elements lo and * hi starting with the value istart and incrementing each subsequent value by * inc. This operation is only applicable to 1-dimensional arrays. An example * of its use is shown below: * * call g_a->patch_enum(g_a, 1, n, 7, 2) * g_a: 7 9 11 13 15 17 19 21 23 ... * * This is a collective operation. * * @param[in] lo coordinate interval to enumerate * @param[in] hi coordinate interval to enumerate * @param[in] istart starting value of enumeration * @param[in] inc increment value */ void patchEnum(int lo, int hi, void *istart, void *inc); /** * @copydoc GlobalArray::patchEnum(int,int,int,int) */ void patchEnum(int64_t lo, int64_t hi, void *start, void *inc); /** * Same as nga_acc except the indices can extend beyond the array * boundary/dimensions in which case the library wraps them around. * * This is a one-sided and atomic operation. * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section * @param[in] buf pointer to the local buffer array * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array * @param[in] alpha double/DoubleComplex/long scale factor */ void periodicAcc(int lo[], int hi[], void* buf, int ld[], void* alpha) const; /** * @copydoc GlobalArray::periodicAcc(int[],int[],void*,int[],void*)const */ void periodicAcc(int64_t lo[], int64_t hi[], void* buf, int64_t ld[], void* alpha) const; /** * Same as nga_get except the indices can extend beyond the array * boundary/dimensions in which case the library wraps them around. * * This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for global array section * @param[in] hi [ndim] array of ending indices for global array section * @param[out] buf pointer to the local buffer array where the data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void periodicGet(int lo[], int hi[], void* buf, int ld[]) const; /** * @copydoc GlobalArray::periodicGet(int[],int[],void*,int[])const */ void periodicGet(int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) const; /** * Same as nga_put except the indices can extend beyond the array * boundary/dimensions in which case the library wraps them around. * * This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for global array section * @param[in] hi [ndim] array of ending indices for global array section * @param[in] buf pointer to the local buffer array where the data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void periodicPut(int lo[], int hi[], void* buf, int ld[]) const; /** * @copydoc GlobalArray::periodicPut(int[],int[],void*,int[])const */ void periodicPut(int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) const; /** * Prints an entire array to the standard output. * * This is a collective operation. */ void print() const ; /** * Prints the array distribution. * * This is a collective operation. */ void printDistribution() const ; /** * Prints the array distribution to a file. * * This is a collective operation. */ void printFile(FILE *file) const; /** * Prints a patch of g_a array to the standard output. If pretty has the * value 0 then output is printed in a dense fashion. If pretty has the * value 1 then output is formatted and rows/columns labeled. * This is a collective operation. * * @param[in] lo coordinates of the patch * @param[in] hi coordinates of the patch * @param[in] pretty formatting flag */ void printPatch(int* lo, int* hi, int pretty) const; /** * @copydoc GlobalArray::printPatch(int*,int*,int)const */ void printPatch(int64_t* lo, int64_t* hi, int pretty) const; /** * Based on the distribution of an array associated with handle g_a, * determines coordinates of the specified processor in the virtual * processor grid corresponding to the distribution of array g_a. The * numbering starts from 0. The values of -1 means that the processor * doesn't 'own' any section of array represented by g_a. * * This operation is local. * * @param[in] proc process id * @param[out] coord [ndim] coordinates in processor grid * */ void procTopology(int proc, int coord[]) const; /*void procTopology(int proc, int *prow, int *pcol);*/ /** * Copies data from local array buffer to the global array section . The * local array is assumed to be have the same number of dimensions as the * global array. Any detected inconsitencies/errors in input arguments are * fatal. This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for global array section * @param[in] hi [ndim] array of ending indices for global array section * @param[in] buf pointer to the local buffer array where the data is * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array * @param[in] buf buffer array */ void put(int lo[], int hi[], void *buf, int ld[]) const; /** * @copydoc GlobalArray::put(int[],int[],void*,int[])const */ void put(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const; /** * Atomically read and increment an element in an integer array. * * *BEGIN CRITICAL SECTION* * * old_value = a(subscript) * * a(subscript) += inc * * *END CRITICAL SECTION* * * return old_value * * This is a one-sided and atomic operation. * * @param[in] subscript [ndim] subscript array for the referenced element * @param[in] inc how much to increment by * @return the incremented value */ long readInc(int subscript[], long inc) const; /** * @copydoc GlobalArray::readInc(int[],long)const */ long readInc(int64_t subscript[], long inc) const; /** * Releases access to a global array when the data was read only. * Your code should look like: * * @code * g_a->distribution(myproc, lo,hi); * g_a->access(lo, hi, &ptr, ld); * // * g_a->release(lo, hi); * @endcode * * @note see restrictions specified for ga_access. * * This operation is local. * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section */ void release(int lo[], int hi[]) const; /** * @copydoc GlobalArray::release(int[],int[])const */ void release(int64_t lo[], int64_t hi[]) const; /** * Releases access to the block of data specified by the integer * index when data was accessed as read only. This is only applicable to * block-cyclic data distributions created using the simple block-cyclic * distribution. * * This is a local operation. * * @param[in] index block index */ void releaseBlock(int index) const; /** * Releases access to the block of data specified by the subscript * array when data was accessed as read only. This is only applicable to * block-cyclic data distributions created using the SCALAPACK data * distribution. * * This is a local operation. * * @param[in] index [ndim] indices of block in array */ void releaseBlockGrid(int index[]) const; /** * Releases access to the block of locally held data for a block-cyclic * array, when data was accessed as read-only. This is a local operation. * * @param[in] proc process ID/rank */ void releaseBlockSegment(int proc) const; /** * Releases access to the data. It must be used if the data was accessed * for writing. NOTE: see restrictions specified for ga_access. * * This operation is local. * * @param[in] lo [ndim] array of starting indices for array section * @param[in] hi [ndim] array of ending indices for array section */ void releaseUpdate(int lo[], int hi[]) const; /** * @copydoc GlobalArray::releaseUpdate(int[],int[])const */ void releaseUpdate(int64_t lo[], int64_t hi[]) const; /** * Releases access to the block of data specified by the integer index when * data was accessed in read-write mode. This is only applicable to * block-cyclic data distributions created using the simple block-cyclic * distribution. * * This is a local operation. * * @param[in] index block index */ void releaseUpdateBlock(int index) const; /** * Releases access to the block of data specified by the subscript * array when data was accessed in read-write mode. This is only applicable * to block-cyclic data distributions created using the SCALAPACK data * distribution. * * This is a local operation. * * @param[in] index [ndim] indices of block in array */ void releaseUpdateBlockGrid(int index[]) const; /** * Releases access to the block of locally held data for a block-cyclic * array, when data was accessed in read-write mode. * * This is a local operation. * * @param[in] proc process ID/rank */ void releaseUpdateBlockSegment(int proc) const; /** * Releases access to a global array containing ghost cells when the data was * read only. * Your code should look like: * * @code * g_a->accessGhosts(dims, &ptr, ld) * // * g_a->releasGhosts(); * @endcode * * This operation is local. * */ void releaseGhosts() const; /** * Releases access to a global array containing ghost cells when the data was * accessed in read-write mode. * * This operation is local. * */ void releaseUpdateGhosts() const; /** * Releases access to a global array containing ghost cells when the data was * read only. * Your code should look like: * * @code * g_a->accessGhostElement(&ptr, subscript, ld) * // * g_a->releaseGhostElement(subscript); * @endcode * * This operation is local. * @param[in] indices of element * */ void releaseGhostElement(int subscript[]) const; /** * @copydoc GlobalArray::releaseGhostElement(int subscript[]) const */ void releaseGhostElement(int64_t subscript[]) const; /** * Releases access to a global array containing ghost cells when the data was * accessed in read-write mode. * * This operation is local. * @param[in] indices of element * */ void releaseUpdateGhostElement(int subscript[]) const; /** * @copydoc GlobalArray::releaseUpdateGhostElement(int subscript[]) const */ void releaseUpdateGhostElement(int64_t subscript[]) const; /** * Scales an array by the constant s. Note that the library is unable * to detect errors when the pointed value is of different type than * the array. * * This is a collective operation. * * @param[in] value pointer to the value of appropriate type */ void scale(void *value) const; /** * Scale an array by the factor 'val'. * * This is a collective operation. * * @param[in] lo patch of g_a * @param[in] hi patch of g_a * @param[in] val scale factor */ void scalePatch (int lo[], int hi[], void *val) const; /** * @copydoc GlobalArray::scalePatch(int[],int[],void*)const */ void scalePatch (int64_t lo[], int64_t hi[], void *val) const; /** * This operation will add successive elements in a source vector g_src * and put the results in a destination vector g_dest. The addition will * restart based on the values of the integer mask vector g_mask. The scan * is performed within the range specified by the integer values lo and * hi. Note that this operation can only be applied to 1-dimensional * arrays. The excl flag determines whether the sum starts with the value * in the source vector corresponding to the location of a 1 in the mask * vector (excl=0) or whether the first value is set equal to 0 * (excl=1). Some examples of this operation are given below. * * g_src->scanAdd(g_dest, g_mask, 1, n, 0); * g_mask: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 * g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 * g_dest: 1 3 6 10 16 21 7 15 9 19 30 12 25 39 15 16 33 * * g_src->scanAdd(g_dest, g_mask, 1, n, 1); * g_mask: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 * g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 * g_dest: 0 1 3 6 10 15 0 7 0 9 19 0 12 25 0 0 16 * * This is a collective operation. * * @param[out] g_dest handle for destination array * @param[in] g_mask handle for integer array representing mask * @param[in] lo low and high values of range on which operation * is performed * @param[in] hi low and high values of range on which operation * is performed * @param[in] excl value to signify if masked values are included in in add */ void scanAdd(const GlobalArray *g_dest, const GlobalArray *g_mask, int lo, int hi, int excl) const; /** * @copydoc GlobalArray::scanAdd(const GlobalArray*,const GlobalArray*,int,int,int)const */ void scanAdd(const GlobalArray *g_dest, const GlobalArray *g_mask, int64_t lo, int64_t hi, int excl) const; /** * This subroutine does a segmented scan-copy of values in the * source array g_src into a destination array g_dest with segments * defined by values in the integer mask array g_mask. The scan-copy * operation is only applied to the range between the lo and hi * indices. This operation is restriced to 1-dimensional arrays. The * resulting destination array will consist of segments of consecutive * elements with the same value. An example is shown below * * g_src->scanCopy(g_dest, g_mask, 1, n); * g_mask: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 * g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 * g_dest: 1 1 1 1 1 1 7 7 9 9 9 12 12 12 15 16 16 * * This is a collective operation. * * @param[out] g_dest handle for destination array * @param[in] g_mask handle for integer array representing mask * @param[in] lo low and high values of range on which operation * is performed * @param[in] hi low and high values of range on which operation * is performed */ void scanCopy(const GlobalArray *g_dest, const GlobalArray *g_mask, int lo, int hi) const; /** * @copydoc GlobalArray::scanCopy(const GlobalArray*,const GlobalArray*,int,int)const */ void scanCopy(const GlobalArray *g_dest, const GlobalArray *g_mask, int64_t lo, int64_t hi) const; /** * Scatters array elements into a global array. The contents of the input * arrays (v,subscrArray) are preserved, but their contents might be * (consistently) shuffled on return. * * @code * for(k=0; k<= n; k++) { * a[subsArray[k][0]][subsArray[k][1]][subsArray[k][2]]... = v[k]; * } * @endcode * * This is a one-sided operation. * * @param[in] n number of elements * @param[in] v [n] array containing values * @param[in] subsarray [n][ndim] array of subscripts for each element */ void scatter(void *v, int *subsarray[], int n) const; /** * @copydoc GlobalArray::scatter(void*,int*[],int)const */ void scatter(void *v, int64_t *subsarray[], int64_t n) const; /** * Adds element a local array to array elements into a global array after * multiplying by alpha. The contents of the input arrays (v,subscrArray) * are preserved, but their contents might be (consistently) shuffled on * return. * * @code * for(k=0; k<= n; k++) { * a[subsArray[k][0]][subsArray[k][1]][subsArray[k][2]]... = v[k]; * } * @endcode * * This is a one-sided operation. * * @param[in] n number of elements * @param[in] v [n] array containing values * @param[in] subsarray [n][ndim] array of subscripts for each element * @param[in] alpha scale factor */ void scatterAcc(void *v, int *subsarray[], int n, void *alpha) const; /** * @copydoc GlobalArray::scatterAcc(void*,int*[],int,void*)const */ void scatterAcc(void *v, int64_t *subsarray[], int64_t n, void *alpha) const; /** * Returns the value and index for an element that is selected by the * specified operator in a global array corresponding to g_a handle. * * This is a collective operation. * * @param[in] op operator {"min","max"} * @param[out] val address where value should be stored * @param[out] index [ndim] array index for the selected element */ void selectElem(char *op, void* val, int index[]) const; /** * @copydoc GlobalArray::selectElem(char*,void*,int[])const */ void selectElem(char *op, void* val, int64_t index[]) const; /** * This function can be used to assign a unique character * string name to a global array handle that was obtained * using the createHandle function. * * This is a collective operation. * * @param[in] name array name */ void setArrayName(char *name) const; /** * This subroutine is used to create a global array with a simple * block-cyclic data distribution. The array is broken up into blocks of * size dims and each block is numbered sequentially using a column major * indexing scheme. The blocks are then assigned in a simple round-robin * fashion to processors. This is illustrated in the figure below for an * array containing 25 blocks distributed on 4 processors. Blocks at the * edge of the array may be smaller than the block size specified in * dims. In the example below, blocks 4,9,14,19,20,21,22,23, and 24 might * be smaller thatn the remaining blocks. Most global array operations * are insensitive to whether or not a block-cyclic data distribution is * used, although performance may be slower in some cases if the global * array is using a block-cyclic data distribution. Individual data * blocks can be accessesed using the block-cyclic access functions. * * This is a collective operation. * * @param[in] dims array of block dimensions */ void setBlockCyclic(int dims[]) const; /** * This subroutine is used to create a global array with a * SCALAPACK-type block cyclic data distribution. The user specifies * the dimensions of the processor grid in the array proc_grid. The * product of the processor grid dimensions must equal the number of * total number of processors and the number of dimensions in the * processor grid must be the same as the number of dimensions in the * global array. The data blocks are mapped onto the processor grid * in a cyclic manner along each of the processor grid axes. This is * illustrated below for an array consisting of 25 data blocks * disributed on 6 processors. The 6 processors are configured in a 3 * by 2 processor grid. Blocks at the edge of the array may be * smaller than the block size specified in dims. Most global array * operations are insensitive to whether or not a block-cyclic data * distribution is used, although performance may be slower in some * cases if the global array is using a block-cyclic data * distribution. Individual data blocks can be accessesed using the * block-cyclic access functions. * * This is a collective operation. * * @param[in] dims array of block dimensions * @param[in] proc_grid processor grid dimensions */ void setBlockCyclicProcGrid(int dims[], int proc_grid[]) const; /** * This function is used to set the chunk array for a global array handle * that was obtained using the createHandle function. The chunk array * is used to determine the minimum number of array elements assigned to * each processor along each coordinate direction. * * This is a collective operation. * * @param[in] chunk array of chunk widths */ void setChunk(int chunk[]) const; /** * @copydoc GlobalArray::setChunk(int[])const */ void setChunk(int64_t chunk[]) const; /** * This function can be used to set the array dimension, the coordinate * dimensions, and the data type assigned to a global array handle obtained * using the GA_Create_handle function. * * This is a collective operation. * * @param[in] ndim dimension of global array * @param[in] dims dimensions of global array * @param[in] type data type of global array */ void setData(int ndim, int dims[], int type) const; /** * @copydoc GlobalArray::setData(int,int[],int)const */ void setData(int ndim, int64_t dims[], int type) const; /** * This function can be used to set the ghost cell widths for a global * array handle that was obtained using the createHandle function. The * ghosts cells widths indicate how many ghost cells are used to pad the * locally held array data along each dimension. The padding can be set * independently for each coordinate dimension. * * This is a collective operation. * * @param[in] width [ndim] array of ghost cell widths */ void setGhosts(int width[]) const; /** * @copydoc GlobalArray::setGhosts(int[])const */ void setGhosts(int64_t width[]) const; /** * This function can be used to partition the array data among the * individual processors for a global array handle obtained using the * GA_Create_handle function. * * The distribution is specified as a Cartesian product of distributions * for each dimension. For example, the following figure demonstrates * distribution of a 2-dimensional array 8x10 on 6 (or more) * processors. nblock(2)={3, 2}, the size of mapc array is s=5 and array * mapc contains the following elements mapc={1, 3, 7, 1, 6}. The * distribution is nonuniform because, P1 and P4 get 20 elements each and * processors P0,P2,P3, and P5 only 10 elements each. * * The array width() is used to control the width of the ghost cell * boundary around the visible data on each processor. The local data of * the global array residing on each processor will have a layer width(n) * ghosts cells wide on either side of the visible data along the dimension * n. * * This is a collective operation. * * @param[in] mapc [s] starting index for each block; the size * s is the sum of all elements of the array nblock * @param[in] nblock [ndim] number of blocks that each dimension is * divided into */ void setIrregDistr(int mapc[], int nblock[]) const; /** * @copydoc GlobalArray::setIrregDistr(int mapc[], int nblock[]) const */ void setIrregDistr(int64_t mapc[], int64_t nblock[]) const; /** * This function can be used to set the processor configuration assigned to * a global array handle that was obtained using the * createHandle function. It can be used to create mirrored arrays by * using the mirrored array processor configuration in this function * call. It can also be used to create an array on a processor group by * using a processor group handle in this call. * * This is a collective operation. * * @param[in] pHandle processor group handle */ void setPGroup(PGroup *pHandle) const; /** * This function is used to restrict the number of processors in a global * array that actually contain data. It can also be used to rearrange the * layout of data on a processor from the default distribution. Only the * processes listed in list[] will actually contain data, the remaining * processes will be able to see the data in the global array but they will * not contain any of the global array data locally. * * @param[in] list list of processors that should contain data * @param[in] nprocs number of processors in list * */ void setRestricted(int list[], int nprocs) const; /** * This function is used to restrict the number of processors in a global * array that actually contain data. Only the processors in the range * [lo_proc:hi_proc] (inclusive) will actually contain data, the remaining * processes will be able to see the data in the global array but they will * not contain any of the global array data locally. * * @param[in] lo_proc low end of processor range * @param[in] hi_proc high end of processor range */ void setRestrictedRange(int lo_proc, int hi_proc) const; /** * Performs one of the matrix-matrix operations: * * C := alpha*op( A )*op( B ) + beta*C, * where op( X ) is one of * op( X ) = X or op( X ) = X', * alpha and beta are scalars, and A, B and C are matrices, with op( A ) * an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. * On entry, transa specifies the form of op( A ) to be used in the * matrix multiplication as follows: * * ta = 'N' or 'n', op( A ) = A. * * ta = 'T' or 't', op( A ) = A'. * * This is a collective operation. * * @param[in] g_a handles to input arrays * @param[in] g_b handles to input arrays * @param[in] ta transpose operators * @param[in] tb transpose operators * @param[in] m number of rows of op(A) and of matrix C * @param[in] n number of columns of op(B) and of matrix C * @param[in] k number of columns of op(A) and rows of matrix op(B) * @param[in] alpha scale factors * @param[in] beta scale factors * */ void sgemm(char ta, char tb, int m, int n, int k, float alpha, const GlobalArray *g_a, const GlobalArray *g_b, float beta) const; /** * @copydoc GlobalArray::sgemm(char,char,int,int,int,float,const GlobalArray*,const GlobalArray*,float)const */ void sgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, float alpha, const GlobalArray *g_a, const GlobalArray *g_b, float beta) const; /** * Solves a system of linear equations * A * X = B * It first will call the Cholesky factorization routine and, if * sucessfully, will solve the system with the Cholesky solver. If * Cholesky will be not be able to factorize A, then it will call the * LU factorization routine and will solve the system with forward/backward * substitution. On exit B will contain the solution X. * * This is a collective operation. * * @param[in] g_a coefficient matrix * * @return = 0 : Cholesky factoriztion was succesful\n * > 0 : the leading minor of this order * is not positive definite, Cholesky factorization * could not be completed and LU factoriztion was used */ int solve(const GlobalArray * g_a) const; /** * It computes the inverse of a double precision using the Cholesky * factorization of a NxN double precision symmetric positive definite * matrix A stored in the global array represented by g_a. On successful * exit, A will contain the inverse. * * This is a collective operation. * * @return = 0 : successful exit\n * > 0 : the leading minor of this order is not positive * definite and the factorization could not be completed\n * < 0 : it returns the index i of the (i,i) * element of the factor L/U that is zero and * the inverse could not be computed */ int spdInvert() const; /** * This operation is the same as "acc", except that the values * corresponding to dimension n in buf are accumulated to every skip[n] * values of the global array. * * This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for glob array section * @param[in] hi [ndim] array of ending indices for global array section * @param[in] skip [ndim] array of strides for each dimension * @param[in] buf pointer to local buffer array where data goes * @param[in] ld [ndim-1] rray specifying leading * dimensions/strides/extents for buffer array * @param[in] alpha double/DoublComplex/long scale factor */ void stridedAcc(int lo[], int hi[], int skip[], void*buf, int ld[], void *alpha) const; /** * @copydoc GlobalArray::stridedAcc(int[],int[],int[],void*,int[],void*)const */ void stridedAcc(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[], void *alpha) const; /** * This operation is the same as "get", except that the values * corresponding to dimension n in buf are accumulated to every skip[n] * values of the global array. * * This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for glob array section * @param[in] hi [ndim] array of ending indices for global array section * @param[in] skip [ndim] array of strides for each dimension * @param[out] buf pointer to local buffer array where data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void stridedGet(int lo[], int hi[], int skip[], void*buf, int ld[]) const; /** * @copydoc GlobalArray::stridedGet(int[],int[],int[],void*,int[])const */ void stridedGet(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[]) const; /** * This operation is the same as "put", except that the values * corresponding to dimension n in buf are accumulated to every skip[n] * values of the global array. * * This is a one-sided operation. * * @param[in] lo [ndim] array of starting indices for glob array section * @param[in] hi [ndim] array of ending indices for global array section * @param[in] skip [ndim] array of strides for each dimension * @param[in] buf pointer to local buffer array where data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void stridedPut(int lo[], int hi[], int skip[], void*buf, int ld[]) const; /** * "long" interface for stridedPut */ void stridedPut(int64_t lo[], int64_t hi[], int64_t skip[], void*buf, int64_t ld[]) const; /** * Prints info about allocated arrays. * * @param[in] verbose If true print distribution info */ void summarize(int verbose) const; /** * Symmmetrizes matrix A with handle A:=.5 * (A+A'). * * This is a collective operation */ void symmetrize() const; /** * This function returns the total number of blocks contained in a global * array with a block-cyclic data distribution. * * This is a local operation. * * @return number of blocks contained in this block-cyclic distribution */ int totalBlocks() const; /** * Transposes a matrix: B = A', where A and B are represented by * handles g_a and g_b [say, g_b.transpose(g_a);]. * * This is a collective operation. * * @param[in] g_a GlobalArray to transpose and assign to this GlobalArray */ void transpose(const GlobalArray * g_a) const; /** * The unpack subroutine is designed to expand the values in the source * vector g_src into a larger destination array g_dest based on the values * in an integer mask array g_mask. The values lo and hi denote the range * of elements that should be compressed and icount is a variable that on * output lists the number of values placed in the uncompressed array. This * operation is the complement of the pack operation. An example is * shown below * * g_src->unpack(g_dest, g_mask, 1, n, &icount); * g_src: 1 7 9 12 15 16 * g_mask: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 * g_dest: 1 0 0 0 0 0 7 0 9 0 0 12 0 0 15 16 0 * icount: 6 * * This is a collective operation. * * @param[out] g_dest handle for destination array * @param[in] g_mask handle for integer array representing mask * @param[in] lo low value of range on which operation is performed * @param[in] hi high value of range on which operation is performed * @param[out] icount number of values in uncompressed array */ void unpack(GlobalArray *g_dest, GlobalArray *g_mask, int lo, int hi, int *icount) const; /** * @copydoc GlobalArray::unpack(GlobalArray*,GlobalArray*,int,int,int*)const */ void unpack(GlobalArray *g_dest, GlobalArray *g_mask, int64_t lo, int64_t hi, int64_t *icount) const; /** * This call updates the ghost cell regions on each processor with the * corresponding neighbor data from other processors. The operation assumes * that all data is wrapped around using periodic boundary data so that * ghost cell data that goes beyound an array boundary is wrapped around to * the other end of the array. The updateGhosts call contains two * sync calls before and after the actual update operation. For some * applications these calls may be unecessary, if so they can be removed * using the maskSync subroutine. * * This is a collective operation. */ void updateGhosts() const; /** * This operation is similar to the standard updateGhosts operation except * that it returns a non-blocking handle after initiating the call. Completion * of the operation can be guaranteed by call call the NbWait function on the * handle. Data in the local buffers is then ready for use. * * This is a collective operation. */ void updateGhostsNb(GANbhdl *nbhandle) const; /** * This function can be used to update the ghost cells along individual * directions. It is designed for algorithms that can overlap updates * with computation. The variable dimension indicates which coordinate * direction is to be updated (e.g. dimension = 1 would correspond to the * y axis in a two or three dimensional system), the variable idir can take * the values +/-1 and indicates whether the side that is to be updated lies * in the positive or negative direction, and cflag indicates whether or not * the corners on the side being updated are to be included in the update. * The following calls would be equivalent to a call to updateGhosts * for a 2-dimensional system: * * status = g_a->updateGhostDir(0,-1,1);\n * status = g_a->updateGhostDir(0,1,1);\n * status = g_a->updateGhostDir(1,-1,0);\n * status = g_a->updateGhostDir(1,1,0);\n * * The variable cflag is set equal to 1 (or non-zero) in the first two * calls so that the corner ghost cells are update, it is set equal to 0 in * the second two calls to avoid redundant updates of the corners. Note * that updating the ghosts cells using several independent calls to the * nga_update_ghost_dir functions is generally not as efficient as using * updateGhosts unless the individual calls can be effectively overlapped * with computation. * * This is a collective operation. * * @param[in] dimension array dimension that is to be updated * @param[in] idir direction of update (+/- 1) * @param[in] cflag flag (0/1) to include corners in update */ int updateGhostDir(int dimension, int idir, int cflag) const; /** * This operation is designed to extract ghost cell data from a global array * and copy it to a local array. If the request can be satisfied using * completely local data, then a local copy will be used. Otherwise, the * method calls periodicGet. The request can be satisfied locally if * lo is greater than or equal to the lower bound of data held on the * processor minus the ghost cell width and hi is less than or equal to the * upper bound of data held on the processor plus the ghost cell width. Cell * indices using the global address space should be used for lo and hi. These * may exceed the global array dimensions. * * @param[in] lo [ndim] array of starting indices for global array section * @param[in] hi [ndim] array of ending indices for global array section * @param[out] buf pointer to the local buffer array where the data goes * @param[in] ld [ndim-1] array specifying leading * dimensions/strides/extents for buffer array */ void getGhostBlock(int lo[], int hi[], void *buf, int ld[]) const; /** * @copydoc GlobalArray::getGhostBlock(int[],int[],void*,int[])const */ void getGhostBlock(int64_t lo[], int64_t hi[], void *buf, int64_t ld[]) const; /** * Computes element-wise dot product of the two arrays which must be of * the same types and same number of elements. * * This is a collective operation. * * @param[in] g_a array handle * * @return value = SUM_ij a(i,j)*b(i,j) */ DoubleComplex zdot(const GlobalArray * g_a) const; /** * Computes the element-wise dot product of the two (possibly transposed) * patches which must be of the same type and have the same number of * elements. * * @param[in] ta transpose flags * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] g_a global array * @param[in] tb transpose flags * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @return value */ DoubleComplex zdotPatch(char ta, int alo[], int ahi[], const GlobalArray * g_a, char tb, int blo[], int bhi[]) const; /** * @copydoc GlobalArray::zdotPatch(char,int[],int[],const GlobalArray*,char,int[],int[])const */ DoubleComplex zdotPatch(char ta, int64_t alo[], int64_t ahi[], const GlobalArray * g_a, char tb, int64_t blo[], int64_t bhi[]) const; /** * Sets value of all elements in the array to zero. * * This is a collective operation. */ void zero() const; /** * Set all the elements in the patch to zero. * This is a collective operation. * * @param[in] lo * @param[in] hi */ void zeroPatch (int lo[], int hi[]) const; /** * @copydoc GlobalArray::zeroPatch(int[],int[])const */ void zeroPatch (int64_t lo[], int64_t hi[]) const; /** * Performs one of the matrix-matrix operations: * C := alpha*op( A )*op( B ) + beta*C, * where op( X ) is one of * op( X ) = X or op( X ) = X', * alpha and beta are scalars, and A, B and C are matrices, with op( A ) * an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. * On entry, transa specifies the form of op( A ) to be used in the * matrix multiplication as follows: * * ta = 'N' or 'n', op( A ) = A. * * ta = 'T' or 't', op( A ) = A'. * * * This is a collective operation. * * @param[in] g_a handles to input arrays * @param[in] g_b handles to input arrays * @param[in] ta transpose operators * @param[in] tb transpose operators * @param[in] m number of rows of op(A) and of matrix C * @param[in] n number of columns of op(B) and of matrix C * @param[in] k number of columns of op(A) and rows of matrix op(B) * @param[in] alpha scale factors * @param[in] beta scale factors */ void zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, const GlobalArray *g_a, const GlobalArray *g_b, DoubleComplex beta) const; /** * @copydoc GlobalArray::zgemm(char,char,int,int,int,DoubleComplex,const GlobalArray*,const GlobalArray*,DoubleComplex)const */ void zgemm(char ta, char tb, int64_t m, int64_t n, int64_t k, DoubleComplex alpha, const GlobalArray *g_a, const GlobalArray *g_b, DoubleComplex beta) const; /* New additional functionalities from Limin. */ /** * Take element-wise absolute value of the array. * * This is a collective operation. */ void absValue() const; /** * Take element-wise absolute value of the patch. * * This is a collective operation. * * @param[in] lo patch coordinates * @param[in] hi patch coordinates */ void absValuePatch(int *lo, int *hi) const; /** * @copydoc GlobalArray::absValuePatch(int*,int*)const */ void absValuePatch(int64_t *lo, int64_t *hi) const; /** * Add the constant pointed by alpha to each element of the array. * * This is a collective operation. * * @param[in] alpha double/complex/int/long/float */ void addConstant(void* alpha) const; /** * Add the constant pointed by alpha to each element of the patch. * * This is a collective operation. * * @param[in] lo g_a patch coordinates * @param[in] hi g_a patch coordinates * @param[in] alpha double/complex/int/long/float */ void addConstantPatch(int *lo, int *hi, void *alpha) const; /** * @copydoc GlobalArray::addConstantPatch(int*,int*,void*)const */ void addConstantPatch(int64_t *lo, int64_t *hi, void *alpha) const; /** * Take element-wise reciprocal of the array. * * This is a collective operation. */ void recip() const; /** * Take element-wise reciprocal of the patch. * * This is a collective operation. * * @param[in] lo patch coordinates * @param[in] hi patch coordinates */ void recipPatch(int *lo, int *hi) const; /** * @copydoc GlobalArray::recipPatch(int*,int*)const */ void recipPatch(int64_t *lo, int64_t *hi) const; /** * Computes the element-wise product of the two arrays * which must be of the same types and same number of * elements. For two-dimensional arrays, * * c(i, j) = a(i,j)*b(i,j) * * The result (c) may replace one of the input arrays (a/b). * This is a collective operation. * * @param[in] g_a GlobalArray * @param[in] g_b GlobalArray */ void elemMultiply(const GlobalArray * g_a, const GlobalArray * g_b) const; /** * Computes the element-wise product of the two patches * which must be of the same types and same number of * elements. For two-dimensional arrays, * * c(i, j) = a(i,j)*b(i,j) * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @param[in] clo g_c patch coordinates * @param[in] chi g_c patch coordinates */ void elemMultiplyPatch(const GlobalArray * g_a,int *alo,int *ahi, const GlobalArray * g_b,int *blo,int *bhi, int *clo,int *chi) const; /** * @copydoc GlobalArray::elemMultiplyPatch(const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void elemMultiplyPatch(const GlobalArray * g_a,int64_t *alo,int64_t *ahi, const GlobalArray * g_b,int64_t *blo,int64_t *bhi, int64_t *clo,int64_t *chi) const; /** * Computes the element-wise quotient of the two arrays * which must be of the same types and same number of * elements. For two-dimensional arrays, * * c(i, j) = a(i,j)/b(i,j) * * The result (c) may replace one of the input arrays (a/b). If one of * the elements of array g_b is zero, the quotient for the element of g_c * will be set to GA_NEGATIVE_INFINITY. * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array */ void elemDivide(const GlobalArray * g_a, const GlobalArray * g_b) const; /** * Computes the element-wise quotient of the two patches * which must be of the same types and same number of * elements. For two-dimensional arrays, * * c(i, j) = a(i,j)/b(i,j) * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @param[in] clo g_c patch coordinates * @param[in] chi g_c patch coordinates */ void elemDividePatch(const GlobalArray * g_a,int *alo,int *ahi, const GlobalArray * g_b,int *blo,int *bhi, int *clo,int *chi) const; /** * @copydoc GlobalArray::elemDividePatch(const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void elemDividePatch(const GlobalArray * g_a,int64_t *alo,int64_t *ahi, const GlobalArray * g_b,int64_t *blo,int64_t *bhi, int64_t *clo,int64_t *chi) const; /** * Computes the element-wise maximum of the two arrays * which must be of the same types and same number of * elements. For two dimensional arrays, * * c(i, j) = max{a(i,j), b(i,j)} * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array */ void elemMaximum(const GlobalArray * g_a, const GlobalArray * g_b) const; /** * Computes the element-wise maximum of the two patches * which must be of the same types and same number of * elements. For two-dimensional of noncomplex arrays, * * c(i, j) = max{a(i,j), b(i,j)} * * If the data type is complex, then * c(i, j).real = max{ |a(i,j)|, |b(i,j)|} while c(i,j).image = 0. * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @param[in] clo g_c patch coordinates * @param[in] chi g_c patch coordinates */ void elemMaximumPatch(const GlobalArray * g_a,int *alo,int *ahi, const GlobalArray * g_b,int *blo,int *bhi, int *clo,int *chi) const; /** * @copydoc GlobalArray::elemMaximumPatch(const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void elemMaximumPatch(const GlobalArray * g_a,int64_t *alo,int64_t *ahi, const GlobalArray * g_b,int64_t *blo,int64_t *bhi, int64_t *clo,int64_t *chi) const; /** * Computes the element-wise minimum of the two arrays * which must be of the same types and same number of * elements. For two dimensional arrays, * * c(i, j) = min{a(i,j), b(i,j)} * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array */ void elemMinimum(const GlobalArray * g_a, const GlobalArray * g_b) const; /** * Computes the element-wise minimum of the two patches * which must be of the same types and same number of * elements. For two-dimensional of noncomplex arrays, * * c(i, j) = min{a(i,j), b(i,j)} * * If the data type is complex, then * c(i, j).real = min{ |a(i,j)|, |b(i,j)|} while c(i,j).image = 0. * * The result (c) may replace one of the input arrays (a/b). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @param[in] clo g_c patch coordinates * @param[in] chi g_c patch coordinates */ void elemMinimumPatch(const GlobalArray * g_a,int *alo,int *ahi, const GlobalArray * g_b,int *blo,int *bhi, int *clo,int *chi) const; /** * @copydoc GlobalArray::elemMinimumPatch(const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void elemMinimumPatch(const GlobalArray * g_a, int64_t *alo, int64_t *ahi, const GlobalArray * g_b, int64_t *blo, int64_t *bhi, int64_t *clo, int64_t *chi) const; /** * Calculates the largest multiple of a vector g_b that can be added * to this vector g_a while keeping each element of this vector * nonnegative. * * This is a collective operation. * * @param[in] g_b global array where g_b is the step direction. * @param[out] step the maximum step */ void stepMax(const GlobalArray * g_b, double *step) const; /** * @copydoc GlobalArray::stepMax(const GlobalArray*,double*)const * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates */ void stepMaxPatch(int *alo, int *ahi, const GlobalArray * g_b, int *blo, int *bhi, double *step) const; /** * @copydoc GlobalArray::stepMaxPatch(int*,int*,const GlobalArray*,int*,int*,double*)const */ void stepMaxPatch(int64_t *alo, int64_t *ahi, const GlobalArray * g_b, int64_t *blo, int64_t *bhi, double *step) const; /** Matrix Operations */ /** * Adds this constant to the diagonal elements of the matrix. * * This is a collective operation. * * @param[in] c double/complex/int/long/float constant to add */ void shiftDiagonal(void *c) const; /** * Sets the diagonal elements of this matrix g_a with the elements of the * vector g_v. * * This is a collective operation. * * @param[in] g_v global array */ void setDiagonal(const GlobalArray * g_v) const; /** * Sets the diagonal elements of this matrix g_a with zeros. * * This is a collective operation. */ void zeroDiagonal() const; /** * Adds the elements of the vector g_v to the diagonal of this matrix g_a. * * This is a collective operation. * * @param[in] g_v global array */ void addDiagonal(const GlobalArray * g_v) const; /** * Inserts the diagonal elements of this matrix g_a into the vector g_v. * * This is a collective operation. * * @param[in] g_a global array */ void getDiagonal(const GlobalArray * g_a) const; /** * Scales the rows of this matrix g_a using the vector g_v. * * This is a collective operation. * * @param[in] g_v global array */ void scaleRows(const GlobalArray * g_v) const; /** * Scales the columns of this matrix g_a using the vector g_v. * * This is a collective operation. * * @param[in] g_v global array */ void scaleCols(const GlobalArray * g_v) const; /** * Computes the 1-norm of the matrix or vector g_a. * * This is a collective operation. * * @param[in] nm matrix/vector 1-norm value */ void norm1(double *nm) const; /** * Computes the 1-norm of the matrix or vector g_a. * * This is a collective operation. * * @param[in] nm - matrix/vector 1-norm value */ void normInfinity(double *nm) const; /** * Computes the componentwise Median of three arrays g_a, g_b, and g_c, and * stores the result in this array g_m. The result (m) may replace one of * the input arrays (a/b/c). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] g_c global array */ void median(const GlobalArray * g_a, const GlobalArray * g_b, const GlobalArray * g_c) const; /** * Computes the componentwise Median of three patches g_a, g_b, and g_c, and * stores the result in this patch g_m. The result (m) may replace one of * the input patches (a/b/c). * * This is a collective operation. * * @param[in] g_a global array * @param[in] g_b global array * @param[in] g_c global array * @param[in] alo g_a patch coordinates * @param[in] ahi g_a patch coordinates * @param[in] blo g_b patch coordinates * @param[in] bhi g_b patch coordinates * @param[in] clo g_c patch coordinates * @param[in] chi g_c patch coordinates * @param[in] mlo g_m patch coordinates * @param[in] mhi g_m patch coordinates */ void medianPatch(const GlobalArray * g_a, int *alo, int *ahi, const GlobalArray * g_b, int *blo, int *bhi, const GlobalArray * g_c, int *clo, int *chi, int *mlo, int *mhi) const; /** * @copydoc GlobalArray::medianPatch(const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,const GlobalArray*,int*,int*,int*,int*)const */ void medianPatch(const GlobalArray * g_a, int64_t *alo, int64_t *ahi, const GlobalArray * g_b, int64_t *blo, int64_t *bhi, const GlobalArray * g_c, int64_t *clo, int64_t *chi, int64_t *mlo, int64_t *mhi) const; GlobalArray& operator=(const GlobalArray &g_a); int operator==(const GlobalArray &g_a) const; int operator!=(const GlobalArray &g_a) const; private: int mHandle; /**<< g_a handle */ }; } #endif /* _GLOBALARRAY_H */ ga-5-4/ga++/README0000644000175000017500000000732712662210515011436 0ustar mbambaGA++: C++ Bindings for Global Arrays ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Overview ======== GA++ provides a C++ interface to global arrays (GA) libraries. This is the second beta release. Here is the doxygen documentation of GA++: http://www.emsl.pnl.gov/docs/global/ga++/index.html The GA C++ bindings are a layer built directly on top of the GA C bindings. GA++ provides new names for the C bindings of GA functions (For example, GA_Add_patch() is renamed as addPatch()). GA++ classes ============ GA++ declares a GA namespace. Within this namespace is the GlobalArray class and various "service" functions. For backwards compatibility, the GAServices class and its GA::SERVICES singleton is preserved within the GA namespace, however we recommend using the same functions found within the GA namespace. Although namespace is part of ANSI C++ standard, not all C++ compilers support namespaces. The configure script will automatically detect whether namespaces are supported. In the rare case where namespaces are not supported, you will not be able to use the GA++ interface:: namespace GA { class GAServices; class GlobalArray; }; The current implementation has no derived classes (no (virtual) inheritance), templates or exception handling. Eventually, more object oriented functionalities will be added, and standard library facilities will be used without affecting the performance. Initialization and Termination ============================== GA namespace has the following functions for initialization and termination of Global Arrays:: GA::Initialize(): Initialize Global Arrays, allocates and initializes internal data structures in Global Arrays. This is a collective operation. GA::Terminate(): Delete all active arrays and destroy internal data structures. This is a collective operation. namespace GA { void Initialize(int argc, char *argv[], size_t limit = 0); void Initialize(int argc, char *argv[], unsigned long heapSize, unsigned long stackSize, int type, size_t limit = 0); void Terminate(); }; Example: #include #include "ga++.h" int main(int argc, char **argv) { GA::Initialize(argc, argv, 0); cout << "Hello World\n"; GA::Terminate(); } GAServices ========== NOTE: The GAServices class is deprecated in favor of using the same functions directly within the GA namespace. GAServices class has member functions that does all the global operations (non-array operations) like Process Information (number of processes, process id, ..), Inter-process Synchronization (sync, lock, broadcast, reduce,..), etc,. SERVICES Object =============== NOTE: The SERVICES object is deprecated. See GAServices above. GA namespace has a global singleton "SERVICES" object (of type "GAServices"), which can be used to invoke the non-array operations. To call the functions (for example, sync()), we invoke them on this SERVICES object (for example, GA::SERVICES.sync()). As this object is in the global address space, the functions can be invoked from anywhere inside the program (provided the ga++.h is included in that file/program). Global Array ============ GlobalArray class has member functions that do: * Array operations, * One-sided(get/put), * Collective array operations, * Utility operations , etc,. Note: In order to build GA++, configure must be run with --enable-cxx:: configure --enable-cxx Testing ======= If the GA++ interface is enabled, the GA++ test programs located in ga++/testing will automatically be built and run as part of the GA test suite. See the top-level README for details. ga-5-4/NOTES0000644000175000017500000002121312662210375010646 0ustar mbambaBRIEF TOUBLESHOOTING NOTES ~~~~~~~~~~~~~~~~~~~~~~~~~~ NON-PLATFORM SPECIFIC PROBLEMS ============================== 1. Your make is not GNU make. Symptoms: Make: makefile: Must be a separator on line 2. Stop. Fix: use GNU make. To verify if make is a GNU make, type make -v. The output should look like:: % make -v GNU Make version 3.74, by Richard Stallman and Roland McGrath. Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. Limited IPC resources on shared memory machines Symptoms: GA programs fail in initialization when trying to allocate semaphores or shared memory. Fix: Most often semaphore/shared memory IDs are used by processes that terminated and left them unallocated. Run UNIX commands "ipcs" and then "ipcrm" to remove any IDs that belong to your dead processes or contact your sys admin for help. Related: On some platforms, insufficient amount of swap space might cause shmget/shmat fail. In this case, either swap space has to be increased or constant _SHMMAX in file global/src/shmem.c decreased. The current values of _SHMMAX might be too optimistic. For example, on the PNNL IBM laptops running Linux, kernel was rebuilt to allow 24 MB of shared memory. PLATFORM SPECIFIC PROBLEMS ========================== PLEASE NOTE: ------------ For up-to-date information regarding platform specific problems, go to Global Arrays support page: http://www.emsl.pnl.gov/docs/global/support.html Systems with QSnet interconnects -------------------------------- Due to a bug in elan library (old versions between and including 1.3 and 1.4.1), programs using the elan library can crash when transmiting 4-byte C Floats. Please contact Quadrics support for further information about this problem. Since ARMCI uses the elan library on the QSnet interconnect, this elan library bug can cause a problem if your system is using the above mentioned version of the elan library. This problem does not occur with the new 1.4.2 version of the elan library. Linux ----- The release 3.1 of GA supports Intel (x86), PowerPC, Alpha, and Sparc Ultra processors. A kernel patch helps to cut down latency in the TCP/IP socket based communication on the Linux clusters connected with Ethernet networks. We strongly recommend people who use Global Arrays extensively in this environment to apply the patch to avoid communication performance problems. The Linux kernel has traditionally fairly small limit for the shared memory segment size (SHMMAX). In kernels 2.2.x it is 32MB on Intel, 16MB on Sun Ultra, and 4MB on Alpha processors. There are two ways to increase this limit: * rebuild the kernel after changing SHMMAX in /usr/src/linux/include/asm-i386/shmparam.h, for example, setting SHMMAX as 0x8000000 (128MB) * a system admin can increase the limit without rebuilding the kernel, for example: echo "134217728" >/proc/sys/kernel/shmmax More info on this subject: * http://ps-ax.com/shared-mem.html and on the Linux SMP discussion list. * Setting very large values of SHMMAX is not recommended. In particular, it should not be bigger than the swap space or even the amount of physical memory in the system. For most applications, 128-256MB values should work fine. Issues related to Myrinet : * On Linux/x86 clusters with Myrinet, the release of GM 1.4 leads to hangs in ARMCI and GA. This problem has been solved in GM 1.4.1pre6 which is available on the Myricom ftp site. Versions 1.2, 1.3, 1.4pre48 of GM do not have that problem. * With MPICH/GM versions >1.2.3, the GM version 1.4.1pre14 or higher must be used. IBM SP ------ POE environment variable settings for the parallel environment PSSP 3.1 (Troutbeck): Global Arrays applications like any other LAPI-based codes must define MP_MSG_API=lapior MP_MSG_API=mpi,lapi(when using GA and MPI) The LAPI-based implementation of GA cannot be used on the very old (made 5-7 years ago) SP-2 systems because LAPI does not support the TB2 switch used in these models. If in doubt which switch you got use odmget command: odmget -q name=css0 CuDv Under AIX 4.3.1 and later one must set environment variable AIXTHREAD_SCOPE=S to assure correct operation of LAPI (IBM should do it in PSSP by default). under AIX 4.3.3 and later an additional environment variable is required RT_GRQ=ON to restore the original thread scheduling LAPI relies upon. SGI --- In older versions of GA (<3.1) there is a possibility of conflict between the SGI implementation of MPI (but not others, MPICH for example) and ARMCI in their use of the SGI specific interprocessor communication facility called arena.The release 3.1 does not use arenas to avoid the problem. If processors are oversubscribed (you are using more processes than processors), the SGI spin locks used for synchronization in GA are a very bad idea. In such a case Sys V semaphores work much better. Sun --- Solaris by default provides only 1MB limit for the largest shared memory segment. You need to increase this value to do any useful work with GA. For example to make SHMMAX= 2GB, add either of the lines to /etc/system:: set shmsys:shminfo_shmmax=0x80000000 /* hexidecimal */ set shmsys:shminfo_shmmax=2147483648 /* decimal */ After rebooting, you should be able to take advantage of the increased shared memory limits. For more info, please refer to the article in SunWorld: http://www.itworld.com/Comp/2378/UnixInsider/ Also see Note below. Compaq/DEC ---------- Tru64 is another example of an OS with a pityfully small size of the shared memory region limit. Here are instruction on how to modify shared memory max segment size to 256MB on the Tru64 UNIX Version 4.0F: 1. create a file called /etc/sysconfig.shmmax cat > /etc/sysconfig.shmmax << EOF ipc: shm-max = 268435456 EOF You can check if the file created is OK by typing: /sbin/sysconfigdb -l -t /etc/sysconfig.shmmax 2. Modify kernel values: sysconfigdb -a -f /etc/sysconfig.shmmax ipc 3. Reboot 4. To check new values: /sbin/sysconfig -q ipc|egrep shm-max For more info: http://www.tru64unix.compaq.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQ0R3GTE/CHLMTSXX.HTM Also see Note below. HP-UX ----- In most HP-UX/11 installations, the default limit for the largest shared memory segment is 64MB. A system administrator should be able to easily increment this value to better suit the applications needs: 1. Start sam (HP System Administration Manager). 2. Go to Kernel Configuration, select Configurable Parameters. Click on the shmmax entry on the list. 3. From Actions menu select Modify Configurable Parameter. Click on the radio button Specify New Formula/Value and fill in a desired value for SHMMAX in the hexadecimal format e.g., 0X8000000 (128MB). 4. Finally, select Process New Kernel from the Actions menu. It will apply the new value of SHHMAX into the kernel after rebooting the system. The C compiler (commercial version) under HP-UX 10.2 performs incorrect address calculations for shared memory references. GNU gcc works fine. This problem manifests itself in global/testing/test.x failing. If it happens, GA has to recompiled with gcc. Fujitsu VX/VPP -------------- The code will not complile because of the missing header file. This file references MPlib library, a trade secret of Fujitsu. The GA/ARMCI binaries can be obtained from nobes@fecit.com. Cray systems ------------- J90 and SV1 - MPI related issues ................................ * Only MPI message-passing library is supported (TCGMSG-MPI also). * Must use "mpirun -nt" rather than "mpirun -np" command to run GA based codes. * The Cray MPI_Abort implementation is broken(hangs). GA aborts using _exit(). * MPI_Initialized() is also broken - we cannot detect if some other library already initialized MPI. FreeBSD ------- To increase the shared memory segments on FreeBSD the following two sysctl's should be added to the startup scripts (e.g. /etc/rc.local): sysctl -w kern.ipc.shmmax=67108864 sysctl -w kern.ipc.shmall=16384 the first sysctl allocates 64Mbytes of memory, the second does the same thing in 4k pages (4k * 16384 = 64M), you must set both sysctl. Note on SHMMAX: --------------- Setting very large values of SHMMAX is not recommended. In particular, it should not be bigger than the swap space or even the amount of physical memory in the system. For most applications, 128-256MB values should work fine. ga-5-4/doc/0000755000175000017500000000000012662210474010601 5ustar mbambaga-5-4/doc/ga/0000755000175000017500000000000012662210474011170 5ustar mbambaga-5-4/doc/ga/Doxyfile0000644000175000017500000014525412662210474012711 0ustar mbamba# Doxyfile 1.4.7 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Global Arrays # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 5.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = YES # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_FOR_FORTRAN = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../../global/src # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.c *.h *.f *.fh # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO ga-5-4/doc/ga/ga_c_api.pdf0000644000175000017500000107246012662210474013417 0ustar mbamba%PDF-1.3 %쏢 5 0 obj <> stream x\4Ļ@+u[HT'KZ@J-I͝3ޞv.3س?սyJhpi8Κ+,tAlZj?x[sxuǫuAvߕ;7kKho˲7UtJN7`xnwBC,^}wBz,.*­~+r۬NuW8Ǻh%/Sbw5)A+Z1pa|?HO' d?XO NԙFt|UZUJ>o%z᭦0jJMu@|dÃW/\ )_E)TgįEPKgyx5:֙Gc(KOWuz*GЫFz }ûm+77 k>ڀk'<$J:噍)OxG%"rRfB q2f<$Kr*O"0YA6M×q3޼,IY|v|8x={C?#|@;ba )?c3 H)NuIۀ6j1We7n>[jAWSڍYFMg03}#z [$MHO-65iQMej^T|aiyo6TRС #Hlz p' 97-:M,o/>ңf*tRBFcT|tCnG?#073K17v9OnE`*S |=oP$gwӚ=ڙA?<1jۉS61󣶚m mNکeNM{h\kCl@k4Гh0[<0` X@keV6CO ,aJMc(ip<+D瀕TBSx7[[,NFfK? x8\+<<ϰ幻0b][`+F1v_'>6)tP ɤT)@y5a&NMr+v>i1TAyJ#p0?PNUpX\|jTsOPuL, dAzĨ {)ftQ9ɩdT֊0'o I!Kwgl-`)9܆q1BoS!"gSNA"*Ֆ<,8%>SiKz|δP\P#ur:ɞ=k{Pnc .T8 HB%}Z:. /EKF}#逃A *r{ΈM4©_ RRWe˙xC&xA0 7?a5rhϓfcCNI6v+NzcJ)u83dN##.7n2Kj ԒA\TLvv3(ܥܾ}K_IYaa;҈0 a!%,F[Ym0*} 80(*>h g(qk< 4sd9`϶/i!"Id)8{0$aq_Ran~X?A9!,%:G=J(sm٧<bO==,5%Ν 5wV:eAMͅB)_@vRfW3)>8qc9hj/bvH/@iK͗sUSdz߹OURksYSʨh(9*CA,UEMAjyW~檼W u8]JwH97\ڝ&KAk0Lg5%[frՔ sؠ >.NRG6"3hiC"LMby`i{N @MJ]SGIrQ]$!+rr {Ќ_̋PI)<(g@*jFDMu[ BQ'$(xM"NSq7 @Qc(`UłsEI}(FPp6YO8Y,N'!88I%#[UwX0YAb eɥ|oh-@WVq ]UR;$p >@-M/; Ms1QO^~#9zendstream endobj 6 0 obj 2313 endobj 74 0 obj <> stream x\[4Ľ@-FoE Lu$^Vhj+ DZ۪ ;$v<ߌ4l k{:ctՓЬ4/8kw??ǫUs t_5~i9J]?qQյ׮Ҷ_:ku f̓xbX6fx*ݷZl϶rշëwNŧHw~C^x4oEn/߱.viIŇAU& {A+Z1pˇCkߢ?jeZ' d?x-ʟ8i2? :$ ,dīùr'}Jҿ_Fè+wiI8#[8)_E)Tįc ob۱F~`QOQ< Gk(gKҧqd*/GЧFz mÛm+76 kǑs&>ÏXI6{.oǫ?OV)lLyk*=y2K61Y$Q_P |#^ pdDr(zh:ކm'AH2ߣ * ԍUު<C otk(_:#8G(7 O}a74)q*n}WjnEam6ILS'UIÌb)4_ExjC bmȢ <$Ġg2N52K 4%;)*7P-ءmXUy( `-.fq 0!Ja)!liY AYܶ4rݗ&.4śQ?-:iz@`D R?Tsf~~f&`#9XAUx<-J\ōyL(]LH5JXéJRAԻS2bo)Bi7wJBX1H[i[ųK}qB`k+ejhqR&Qxs4{5.x'mN_%uVP"@A0f91pt5 z qͨw|Ƞ@;Ӕ>qĖ?c.u4eoǡY, n!;5$eH6Tftrcpul `X2qn ScG-bDzIV 9q3^癠"x;-1#aT%oK>̠%U Px[ƗCEJ){H<`8Nr9:ՕU)#t_a5&$3p˳3vd:"ހz-A-}Vs٤k65>`AMI&;gc:dzH8p@d\p5 ++Bmsf7ԡ$|2Z>OGw͆(0>S#s#MBt=!ũS鳨̲v8#4s<<ϔg82U왤8@ϴ>&&!5;+GP8Q7$z4Xt'`y`S9%P3[t ;Pr? ܁,|8хsSYVN|P&Q⸮*CۑAMJe ÉR9U} ׌*y|=8_UWacAR6UlDnv꾃k91Ȫl.E-8E8R@嚂T\v0̕(m_;P.UeD(噍am@ gxB*VUCjb\>׮T΅L,Olme&ؠڸԴ(f,0eDܢv+4)Ե{&#<%:^.t(ФdUm}澰.Sx c,=sendstream endobj 75 0 obj 2382 endobj 84 0 obj <> stream x[o5Ļ@$injm>REKZJ wwhd^?~3ߌwg/'}tZ==:La8 7C?ӟGqut v.ƒ2ni%ज़U2?Ql!x)xn~%6Wcbi&l/]zhz#S#ɳ8.iD⫆Z|;ҲZ\/7 XǑ05FBĺ5/ rᘩ4{AVwDPtXkvVN-l# @rz[cp%\K ~A$jT3T@Οfcu\%p-vdϒ}FޠQRh3 VZg%s rA+H{IuwDN`{Mv3R+ N`]^z~^胧?\9-}T) rQԄm!#j~j u mY JĴ6f)> J?B~8LۮGwd*(bh 1"u ʩҒ0H| *M䔁)7*[(m(JQ)tW9"ZvZR a>6,>[smO{m ( JBiRRP@I~^7yM/!6(o,@zH~)L 3 ) 5n\7LkڡG !^j) [{ob dendstream endobj 85 0 obj 1900 endobj 101 0 obj <> stream xi7 sع*>f4Fo$qBL!aI8pb$p>B0:5jF;vߚWrV+j-ͪ>`Um_==,yuo:r?)k3);zíf]=9=pŪk3\wnJt:<=2kʬtfS-*zm:! v vz %nۮIg[ d_1 c a7Mg[ 9jVyc nN `@7AWJqUt_4<=ڪ旉ʑ~觀Mi7 ݢkWAx N VPFIf~Bh8Ϯr&o+ PoM@[J߆t%Uo/_vM#M4_ɘE/ 2 A ߅簫De_Iy*;n":Hh Z 3DS b^I@t4ڮ@(069BΗcKu*l?+Jr:3 c ~0j0&&v}ɷF0hbS2-Xr2Rs-F*l$`C[8KkHͨqblv]x{"4@ȠH+:Z7IE[ոE HB_[g߁A/| hķ"v v:,~_ߺZ?ؘ jϡ!|W)F80 7,dkcoudr,ƻZ мȶ39 aUl|HD~sojz.Qgyx.Œ}Y7ˉ`ALMB :Kk:FzE,C\]SXED$.Bs?0P̔m~iq>őJeF#R>G6A~di,&2>7˃h,yV4$·Ui2q񓓅:;gF҇sEȁbMV7Y/yDgurj9Jw: i̅2ZYPtBF#kS{X`f6;Tv'2K, ;Y^!f\`$/cMOc`4*G1DqtW2jCY9=`ҖD1݅lB(ts һ3[oBRLY+3-T9{") 퐃jdM ;eOmE/}WdùJN Sn_1$aFMUJ!g*$CfnRIop0$ zQôkrIUy}1z^|%r=/?.ʃaL~g#V dW]}XyB6 H26 2[`*_ t97hNYXs/!`eRo3\pHk٤ ȹPfZ=FOEq,smDdK:Xiꆺ4 bbVO.#Rm3Mv4jZΚйv H`2ء&7F{pvbA=dKIP)j I>Mc[;0bME8(P%uo^F3TДmำ)ږP 'J 96sfx$HafۇckOǭi ʼnfp֖#6A%-f vjyZգ)]A8kR6-#6 ^]BTTuֳu4}'"E(7 o7r\g\eOzk0ލXݣ7l+o\Nv'ݮ@[ p_nJm:,|aH_bx -MpU%*BC .hjeB(#UA(g?Kƿ^ŋnp܏ǐ`>L~,kFƑ$Es ܦ|Ow4n Jwr[nϱdqPdU:Ԋw-heus\bb`H9s7a + &az!]9J_-fޓ#_KkΤ=1ҩnXWvѩnٴSxTjT3wAo}> 駁jFf Dk ofˁLrsˁsMFʋ@UŒ=Dy%  }Ÿ{~"q$Y*;>dW E%P '7ea8v4-\:j!IdĬZ/v|m\Gôov xiちir%y^+đw)蕜Y͉YPDZ ,ze3`KMnʈSkwպ>8.M+?#LHIєfI#q}Sl޶[K#oѷvgi?]+w΂'ӪCgG8#s!l.$OuK6Ԃb-]3Ÿ;_Xԯe@M5^嘕Al504Ӵ yuQ_ dzcJmU?ڒ}rOpB4#<И){t~Gy^y-M EUݜF٢GI-:MN4QPO'DP߬0gu3sH m?* endstream endobj 102 0 obj 3974 endobj 184 0 obj <> stream x%5Y9 8&\t:]eh$аuaYֽP4Fc@Y|ߏN}~N9瞽ww {-?ɝ٭w~l;eBe;/U<;;75NL_?}X;۳[d,>5qB[U&-mnyջ*#m?8ٜmkLqYrS*2[ T xe U0UuJL@'Ι~I,z2aW\+vQS(Lq(RD @s:S2sݢ[#  f|:Z*FX!3sj [M2yxs*[m T֌y] וS[<'p42eg_hh &=miYEzz3'={7x(ZOĆx(*0fhIs44)b3Eu 'Wj 8zl{qowVR۱\j)׆G۴SYFa6zB2{٩hy8 gg%v^1Z-ơ`p(}\Ab {[+e p_ΌddrK'cಈi-q 6ڣgg`pil&U> 1Eg%EbvfCܯ`9N:ԹhWsɩ nwSMsFcdպ=+\h3`̔[uhUyLhK&FzI@Q1]" jtkOZ^f8p-dSNnB*Q㢄k5E996ANHFib87yn UT΋BQZBW?I+`Tߴ6XlS" * юe.cm#4*iXǎH¨u&=,hyAըvK tEX92уd^!tX"Hu}(fEtgШY&_G-RZs3 z`y04ueFMnJ9"G&kUHۨMtU4\ѥC^@FmKHGUBjjTљD؅QW|޺y!lx S7Ψ1aQCD, ⨪0͝ɤ8 "bk"L'Jq5*'Piw$ ?ac7k!d]bmV)`8(4 /m ֵvoL ٻXfis8ƣ_,N/T+xka],vPQZ.Vysqtb.Z$ ۋ^)JB5Q+t˰t.6⏀]}#5n"'Dc*F/[B+S6!boƤ @_0@IDhRYXTFsiEْmgπAO8tR߹F|ɚ<6=Fp#A5h#9E<ñN 481TYbo!}g N˧|C᷀ʮc*Ns+ O.[ID.MG&2(]"`M*'*?ͣ,qv(Vel1$vsd6@%-t*7Cv% M-t c;rRS<j>G z zq@=ۚk.t ~cAD 7vZ4Ck*]st5N( =9ShcDN|53ZΝ&oVaeB+DE-KPȹΉ$׳^!9Vρ@, bs~ACptgb*nP_G̊IB$Ϛq Rzkjܩ͗:JAԤAF49G"m@43ٻqRb0F4RU)KfBY >Co$D6"0)D.-S7*5P͠3㡪&(Qζ}):e:Ht q/y2. 'qKg G5#50X,ϓ\#IM8C,a᜗z JxgJl S.61X6Jґ[`G>ۆsNM (P)gM#Y1Lj 0(J-ӂ.:PqDaWO*wS{KL aIPgs&Gy0O_C\m{w;)5=鐩mL6=35GWݓ1xNTz 72ì/@kPOŘJa7D &%Qܮ`xR9 `D $.>3d&у1cF3JDA6&V p@`OQw4Sd1DXEӞ+0t3s9$ӦUGݬtT >=)@:3.L^] i  ųXBY8ԥc{r-T5l!WD52Um,zIdD|N+5f\&WBkg7]2P4H|2ղrEhh_b@|IsS ȭry1G2bN# I2/p=|Hp9=20&8'"!BBQ_H;dVZ{e K-Pk['wrn?.|-[%!"%owF_wGVepio|ۋQE k[KlH `,u)~C|=șڄQ:GݧJ?S7˥AAp!.i=ʫzR0dN]Os{Ea nl.^NFI7^I}=׋`k0,01k|$y2oiߔ|#;G>tvKNR']ek˓` ֋wq{4qC"jcC,z٥gf2u8GǶӗ1fN*:fjcx?IgT,wKl \8]Ű Bs?ɒJp&(\=~ _hp N* )i > stream x=&GUMr(Y@tOϣ&2)6%@Xe6J(" U >P>@9=}Μo޹߽w>}<9s(t'RM:MY-_m1yw Oovλq? ]?Sמ>ht/MUlo^rͮq]].BߗVU盗]nߵ*齙giRߵ-th5UWl$[йamoVES]ޘ6r`fcprmoc}*1`}oDNhU5LzU0+*Z?ZkpES%C8TXA/{y~B W65B kU un" rՑy?Y?<v4UDRyonE\R\ *BnNo&XT^[POчwciʴf )JC0FXigbaؗS~S?mSqЇLK_=(d00)Əï |WZ"ԡY{:JV_|+Pi}D߆mrP T0Ajia[FaEOB]azPwiK#PUam14DMXykFŪS},r GqހǷ Y^=؇AL+mP%t!# ]Qdgѕ܂aCsSxClg6SH-´vͰVw`_+2qEG U׮MFFf],:"}_% lExIF^$aiBK-I91< v lqrQY] 1~6Ƅd/6LMZ`yvhy^AmK^a_ :Zh ?7S_M+TS9<@tew?23,)V^-ç$bw `ٸŗQ0wy[|/O߇+ѩMI:B@!ynhE*&Zvr^sG7H*Hpob^B98[2aS/9|{MJƠMO$=`Cmi"w2G"x_~;-.b8RSza{Ɠ9ihˌMO[H`V`bcfHjTP_X)+m=Q ;brAlQ9s8t Dvu7%g)WR&G׈K܊+QmEʾQRFYN`pOϥGңihYJTDv*34# T^TN7jKIte1aݬ !9w~mGIEGvՄngL]~pR2a/6o R1]2!+"7n$GDF)HaSs6#RY&=?)gM.Y^2;oS-}ؔ6k:l#3S3<Ʈ9;^p;N5;-b-U{gUvh< _Mz80F2%jT <+`)M΍6)ˢ^ptaOܥjT1@ SN] ̆ wz,<C͓ZrBX#s&ҖpQ M~\zm"0MvSr2-4 R:R\#dNBDxZ_R5:Jm16t˖etMPyߡg y6-?}Z}%Oݓp-ȦD @3uJ.ē:==\m-Hm1G*ė+^U5\uxƎrW#8a&;\z'\/)Y1$wa` n&]Sl'*iWwS8~&Iȷ9W@L.Y:#$oW:\>0Q&!;jF))pd =ZiL.MSg;pӟWO\.LN#TTsNͿ#">59dUg"x>'ԏ]5N4j6cq؁KEE)I-W|ۛ<l5o aMs\¦15֌G-r缔˞ZAf /Z[OVmGùrIc&3!Br6!pdMN!- ZٲņP1bsv9"Il&ڈvi+I=GS p7Gg [ՙ(YAA}x؎hUĐS2ҁ@Q.:T-w⮑T 1hw$F~HM Ky Mopl,Q%jQyefYee'0`v̡QLCr"w(҃H8AC ;) o\2υKs>B km:s.nڻFN]#7X:5'jSik_/4)eSwP%J\PGU 6ZpetZ3u?Mpv7=ߘ Ϳ#k{躁@D?&g'a#+ JAo@۠`\i1e5`gg IBABj@Ar~OTadHo@1P~ŷ #2L0;kd'P0\´Jzǂ,ǡ !оF k 9DX|zb2 `wĀPL8Se1kiaϢb[4s̶~V.@1ۀsэǾ9(e]4dde 8Wj?(?MgX\̳d3Hӝ@vhϮ H/8Hk%:J|2 ;8%K!S0:wuvKbЂCEs"ū/krNTl0iث%TPeb|e-FERb)?MeuNpub9&W"ո/"A UL|lٍ TbLyqz A vA}12g Xmf-0BRqo쩚 O' \~ fDTt6ɫ9<|A6&3\ K8ڛW#]@Z44b  ~WMUkO (F\O3ʶr]PY.F`yRŧIZY#\_R /J/J9FqsۑLK mlHnr[L!h,5 nTWOyLm w\x&? ޷[| ~@a; zpo KUFQɳHZ9g"eN(bv*XT.λO9ܻJ٧L'>Px޻ȕ1H O HeJ~Y>/Uͣa8hMhl*5[ɜǮkDy7*ؠ<~ }e| c'hUwlzL/G,N2nJ[l(k:kR%h1R1=|iRDuߞB(g= ꓠ%=L84skh_W;4`/-YA΃$wdea!D/Og;r&E ~Zľe ˑw@;xz0'gˣ8XL^x;hH7)YK=||/ k+ a1?D'quZY(h3]ߦ/ !I m$'%mKY +تڎ .L.Â0B 6ބ?%̼JC\tv & imӍ_M]oi߇ޘ }A|q\|FM|92H*)6?DS~r4v?MD 2$G.Ҍe-Tn uNRħ%+KgWl˓upv {}o,+Y@_B^<OE|UO5ffW7E_Jfdt*eG!K0'g|"syA:-iSg[Ww",Aw@hrG.A:$> stream x]dEh rrVխ0 C4 e~b51&*_P场uׯ p @) m^:J "3]c[Mf 03#3GWy07ڨ|5h*8Ҩ[E 9A0 t+ثB uơݜf38tǎ3<ӄH) ܆ukS @$ ڸ -뀒ѸD:4FdHTr~q. r,(+ t%{8RLDA.ѿ K2K,3{eE%3cJ@á,P@&IǼ8bJ s͙Io:97&7v*ЖI-I#~YŒtg=0Ez7Deo;xJCyFw%2Oh6$MP@io\Mb#A qaǹDSAM $ Fr_ۯ W< %']=[AZO ċ^=]ӾLM,C[a,|'GK r။? WrvԢ :b;۽  `S. wl՝7O:ZU@~X ZxzuFC&ca =0L a{,z]ZܼhOnuӵ"ՐV|8 ,=S}9XO70VX:&m`hOcke eX*`Z\!s}߇@>M)b"%VL5hK~`]ލ?hMb8-j!>LM:` ϣxwl}VsؤJ@IbRI+ Tw4 bFx= gA&o^dw {JuBφN'Q@*ӄk:JLh׺i}D@ z$YdRLg:dtyJu 301<AL3HC2`4 COٛh{ƒmpr$WώF)F[_!xԡy`v3lehyd_DKz7( &eQSͶ A'nx-2 4aW~:qx1ui| {bd<><8 ~? {8!/ܠo#ao < Aɜ؇:e'iB2ˎS) .h|pf;!fDxAU2Cۦ .S0YB;Ygy1 .&;>홺̳_>ͨ,iceO@@S״'a$29'z`oC%1q#c̐!Y( %흋``3)R^F~xF;hgҽ١^?݀6,#9i:s̉7YSHܖVɂ3gk@Q@Yb3b-fIb9t@; i{K\S|g(h 0)5o=DZa-dm{DBݶ?5ope/nlxI=勮3:dœ.ɅQZY? $yT n29LO+"S3a ޘﱾpr}a}z_,8[=p͚e{v|6{08|ʖ|Ab}sdc(@ ?&DZ+~2[L;J]~[qV\/V;deBSb~ŢZeehqL pϰGXL{b}aWv9x:pa#c^",ޯz̲o PB2B]fRAk(ח [RA0B]/trDbrm`eVUN3Fxej%We…eVo|use R!p2Ό"YV`cM LvY $ Qw!c~@jWZ kr*r܏I$uٮ4memmm 6,O&p٤9.3}4_ Iu7=*+BC@G;H) 5Z?YX$O,vI.]kgDeu{ºԋ%ٺ(IYkaSK*兤0)$yVARre|qپkkJt ;RߟbXkzW1) {>;Eeu*52G83Lrbsi{Fx%,nV*bз?Ư%|9 |M{AS}`> stream xEUP ~(K >>f?PĀԋh(-V['CbJ@o *Q,q윳~[4{Μ93sf,*;'3Q6ISӊ<;*E6=N,[ܗZر#gգg߱-ۋoΊlλ4?ȦR,l׽oVi YPdKa  2sl\7BYp^b~K@9)=e%U Лm&|ʖrJMJXA% ZY/hmo7į*J (,B i{#sT04 BȤv*[y' i :;=*u_/6Y]CI?@Swx\Ita\ꔣ)Lt |RQ. +Aq(΂4p_k->ᕣ\kA-&%e> "PdH LwB86V9=EVڏvoJ xO+KNm1A{;ZWYٙ_ {໠~[V 5Qa~mգh5R"4 oߪm&UQؒ68bR#ZMQetGs \x$1#iC7#"P%L9LSM\E*ףm|a֔7=Sf2Ӣeo$M@[ oTXKgY#jD%v$F XDl$>Ĺ"jWTjYnQԣDQdGcN#tR}2JtҐQ6ًShC% ּ ;o"Bge Xˢb!VdlWak+RxdhuXRŠE*V8h3KE,B 9*a2HiaZ~ԮԾ(TTf&a"I5̓Fv'㐁nPNW^q( 󃚸BhG͸\m.Ёr&yzύ57!'&;hҟ9 {9+a7WEKv zI)Lht]BY;pKaϖOB1j9Ѷ"١}Aq_F]y_%zECPq)rO÷a۫LV_ Tb TOP= (W.a>{\VN?i&SD , ?c;#[$?GAr~" 6m~ iaiF20s=C0OQu65sH\#p8| ^ P: C}ƺ0By dYh f I3+v|`\T5 ::h[:,I:T4e s{QOn&UleT6rMҲ$6âⰏ(y1¼Sӑ,(6QabPa{P LG2UŽ}F6P,ӳDΟlEJm),SSthۃ^o辕7A$' $r/2E9B=͈ ~[vbaoXP6Qx8OCuVS(-{+;EŴG3LjaĀo"哛'c$NUw8nxD<rׇC{I{*>d9֥i%Qx="%:hXQ4'sV|WL j\ $JNSF4 ,nxLR5w(i WPR ;oI~]'m͡M{h >pJ/=Hf| LM,FR_JQ,StūՁpŸBrA!8wR %0M n.+py"n$t[GW;mD"@8z & fr О]Ef\5vJN'NP>GTF\kv DO@ wE'EL}0&X˴-ːE-Mb9NY!حZ"MX\fjn-DlR9OQp7s\q˨ W1iZ&3SvE>򼹃9̸")(1ThxW? g7 Gꦹ>J[?F8RΥud }D|zRh``b]">{ōJLJnN2:q2!y{YgF<_{ 6+ ]]e{^I!e[ vh.1 !ՍOPş"$ߣt~:H(0)`W8O;:Nا?#[W_%]cN/xdG^I7R{-[?"K_o3P$S0+^E]EՁǙL1x v?(Lb^#cE 5>fߞ7OϥNI/Fd3RbW^P|Y1|xTdle]*L?Sih#w.IK;T@C ]cN*-|@|.s#U^~/f]Mm$wl6-+@0Nl 08 /qٛ[<.V~f(X3aa956'RdlOdqr.Rj>=X8*R"wP&o3kio`wvI+J7* mqaB$4Jʹ?*ZYvY@:{ݭ+vXK8cf7cSTg ;`+4B F *ݤl q 窡tڙeWe  LW_7yxrҺu#TMb%d[`N}c!%ؗX)l8ʍ( 9kpDe {G乘<ѓnYƳaWJi``V/~Iہ+v#ycAIf(iL!Fț/T_ gztV=zV,: *#N-{r:|mBHxyyP7-,d]֣)}fѿ:j3:h2߭K+sSs?tۃW)" dsQ3h~mF|*%UʹkWG~]PܰBqY p3s8Cn?q|&ߒ[&;xu2Uj=QgFG|&Acendstream endobj 253 0 obj 4552 endobj 261 0 obj <> stream x]G$X#‘'ć/7b b1~/ HD 8$ HğEU=]=;o])y}UWUkr7XU&Om.ߞܜpUWՖKwM]]Hҿmk+7Vu9e3 .nU'7'O=]j?6ڊ YmnM6NT[6_I:_hc*J;c dFPq h៚gEK@c@E8F4)fy0˯U0Ώ+L XVZ #_htm:'g`=^7W g&Թ]|9З>Ko-"H8+ )QI6 &;2/ m9iy2_Fhƌ@R-d;鑓8VX9$"^_Zx.s]!ۀ~=pgx̯Q;P[e] E5KsyPuTSޱQUq74(|ۏvUݕ8~/'|5gȴfV8UG@؂[ :1LX8З,k:zrԫ;X<#kw#ASFt{WKt^H4m%._U[Tbb6pۍal(&ƥ=5 K<POD=2HiWw*AIw8ps`{#;Zw/1<6А"'ёm*cH# !H.cO-F" +t3`X(0h~&C8MY0Y =svLCVT9'. ʩOAHB#(OӮ1#f6۫=WsùC0pGaWfBSkQx8E^7ײ,'PځnZ]D0':+t%rqv(d8hJ8+@\SEz-ݰ@J/_s_tea'RϮ4R]E.s13Zu#9kY|mխJjS$jeiSm.$^K+iO6zr=9S^_0:)ɦ-6>K WP#sﱏRQbJ͏,<F.u+3>FpG k85 Tڈ)gLV%s^W*{IDA/xGEʜZLY8H[`xX1W\)<wJjb/=x“Fkwf.6 bH| dg}ܡ<-.kr7LƊG=%Zѱjd=>~3)^? I R?k'aTjFȿ0H|a5VTfM6N +=4 [y4%ij:Dا٬÷so .q|6L_j7ւY% Cg QƐ ױ쓑hAtqS6}Lܫ!sC^h9$F!}Lhxx;%h[^o +|f֞O9o{vS oYU'a+$fd39 28AnN3QCnȝ.8\i̧D ; dTN'CL ʂL@i7|'kj9Ŭm}1!ӆ{:|p6t/\C~i2]dDV!- q O@Ӷ?)|R-ERK=Cߛxeս\O}g~HQŃՃ~/l|>"t+!o"*mȞ{'#u45t,px5k雅هPP,wtbPRHE/L#endstream endobj 262 0 obj 3864 endobj 267 0 obj <> stream x]Gs "|l'A! ezz-qlC 1 cmxB Q"d' ?y(gvwv6,%W=U}7|_d|8{bѨ[ɳ١I"Ϯ꺥?fWgggv/Qw0;{0{LdWf8PJfe_ggM^=vl^Xl]t¶& X+AUNځrhPtݎKlW6 vm.UQtG $K,u.T&oK!QYcB"mq XC/t|Ҏ[g*_l|kx:;St_?mgY#J?[OS/8MxMy )JoOa3dGpEeђ< Cq.Ag@WrS9rdZPo iIA>-e)e~6AT$U"Zh=0{V1TX^kf~B+Ӫ*l'V,kªVJ|qv勚_[ݯ o<mZ-4mv-;+ơ*r蓃á~[Y1l6sgF p* @jl{ByWTm}33Bp"FmN7ViOI:ZFm2E"QHQ*vL4Xs)* 2*"/.Gw570T^B%'Co @U9!=XŮ?ھf$7*UAkⓍ5~ <Hs*\+e oP|Pnșe\W<qvHq˪ 5zt, y Bٳo t*|ie)p 坖3:!u`|S˦[OA| pfKb ?EZk-R- hv,up3]([$ նLjZb#9g1ܪ#rE ohL~ kE ?CcdO#oySrwƽ:/XxYtI=dHI#q.v9akM]q#ֆն!(>@e$I˘9/Qn3+q)p {D^6EKE&岅K]eˀ="PnO)vm[yPQUbzJ@n){)@$ڔN2Ig\X>DyF"FV؎S3DۧzJ-ك$5ЀHe闈QPW8iFp[0 rYN"ћJ2{}@N *b<{R$ךڎML+`AQu0^ W1 2*| 0UJb:zb!WyZ mlIVŊ<=%҂9p ]MK}cDP_{%ov+ÌC룿C5$GZnqIڦm!7&9"zkQ:Y9LVDW(eϡX*@|1jg]&X_7uBc^bZzWkUzZ$2ng FU#@cNL+pN ـ-sZ|Jq.vBwƫҥfyCS}VEF<5H:ÞsEֽQ0Z`=q`و8\9®dS'ԧ\&bUC8el.V|̂3 ǞwAM7Y5lW|]/} `<N ?Yb2#JH<~O dT-aSm#Uxs pfC: Bޥ:|s`~ %U3Y֌de]/}hzƥB%[*|jĸ=Efd0]lWܧ}ϽJ,]ւM9E`n6OSXҨzQT*|;8nX6}axA­W!~4@qj-P ^'O]sPkUAIW{|tk pѹtޅ7laijB+* 5F/F&8?]Z`29 wDk8اjͪM+KfPNV&#'m`u:tҼ1Zz-R.rPQy5JhTPI;+CB^Z3M,A(0!(9L M@O.N>>}vۭZص-췢G4,=p!Oť_j2Ӳ{~0-8*O: -U[M_W(Bީ o*QvC&#}Z~uyQh[}W5;(7RjZ#+L oخFy.S"ҹx8ŕU*=Z=AoP%VVѲ^-O0 Zo r5=4tmv@@I[~h,l+Cq@Q#32~`հruZD0/c IbwxgvZ`Y܌Wufj#B;YcNq>1QtL?]@RF\UuqQ}d_ {Nٍ4*4U#4ѹz8s">ԝjx70x)SEʪ5o%-a91kSJ/&]?ySLͯZ?:W:?O7WҮ~]؎ٯ^YW}"3[!YuTƇ|C5Gtyk޴'YEo <'$T0޳kendstream endobj 268 0 obj 3731 endobj 277 0 obj <> stream x]e5Ո 30I&wwwMuEhЁG ĉԘH|01$Q&Xj=̝{$puvruMk_} c˻w{6Km^6)^}nҮ-9gu)wbj]_qO5=wx'>+Tk:7 kV:oѼq[ll߸5Q4&8}6i ڱ{k!t-EBIeӻLfTEbšm^DڦvLz.փ BVF/dV: Ȅ{ۇ:nv1h#G'^8.μ0Yӻr>jo|.t qV0Ze#>ZA|K''NtrCm D%q4N x13Tr}/!r멪S6[F 9#ee!GwJ_NИX3ԒC%=z˻|k̟Cϴ:$` ׍niƘcVuy `H@^j!P=3. ͳ?P6!ӊI )6}4.lL}'pߕIkk0TK22"{5 Z Fka-F?q8^ O`JM0:&abշ)xGQ@<>(E %QƜ0,r%QƜ0qƜ0ā%&aQR{y]؀ K(cNjQ9 G(cNZQ K8cNj|@N N}0(*d%5)*)J0-ˆ2faE-ˆ2faE0-3f'd-4yw|<Ԣh  K(#[ 2*(ZeD0u+a8F0,E 0qn- >q h ͌2A/GEkU/W^] OQDh6*\K2&ڵd%!v-Ie6ɵdi)HKN0#ʘM10p#`[e̦jvQ0-3fSL= >q E&aTM1}'IC(' u h F1h5 ˨h F1h- (hF1h5 >q h LI %u u hF1h5 (hF1h- ( h F1h5 >q h60٠R{yP`X`D3ðLa8`D3VpL#`X`3r`p<@]Qg;FP $u3;j E %Ql-Y2*(Ze֒0ql-YO)Ziu3vZEkIDXKAZϋ 3g|OZ ҋN\un>c3 Qz|43 ނ]}bWa  |7;r*p(!0s"Hdb0B}ii#,cbY? I$5\I.ť%[ד%.KrWKkx)uAJU:ܵ 4HiKsigK]Ad%KկٸJ癕o}3=J[JsV3y: Tv # l<v\IҀwP7N5Rh|$;|g촲70uhbR%G[t e==@/h5L 5{"< &Z97jLRM}%;"QT'YoG>ƝjD\SyB9_yf~4;2NOZ)A9 ?G[ Ʌ/2K65s"O /%nC@iYj~%:ӤFAx*PX?(yRvҞ;~rM;:a@Ƌ~ z-#mX6|P)` ϝxio>7T- z, P*HGfǯ@+- W|#㚍H@cލWm;8'G ($q𮓯@Ъ'^߄_YZV|۴]A~ 9~oAD R%Wmj?Ðj*WP߼ i L d N2m8_衩\ikKW0|cN;C R;S8~Ff# y_L04RNу({m1Xj|>OuQt!E 'u {a%6@Gb0ve\yQM<( %*e:T%T GAP/B5q]N3%#51$}AY/=,5pRAݏ0Ƴ?, \y_Ƙkà C)G~eJpctq%2W0 &~Ad5Li=|ˋ\1NRtfnn醻 cDl.֋Ew|r`kr4|q3PXAL-ǝ"=q8X8Exs/.haCE 4kṦ 8;.Xd%ǤËL\6AaLcme кǬ0O0Dr66;3oUZؚPlQZ~b Ⱦ12z1oljSޝ 34}-Uͷx ԑKcyjkQ(]"9̹!%6Tg͸}Rc=ѢDQԸb"6QE:DoEۊ )$ lBG<ɴN1MQ.a`RIwˎQ-5[j~:F^vx DGm:?И6$kz@J5CBO]yY4%+EiW]Ǡ[=X޹NGk2Yh m_15bRgxh78#RP+3QrP)9ɗkBQT[;)eam#a(QC}*YȮ4>ߏ<0ةw?^vyo!6Np.c[`M'cxIcQ}*D'`՗>Ѿb)lj4׸Pjḅ꫖(~>)RSߍg#0c"l; Y_DÑ;  B -sCohߍy麞6~> stream x]%EUqWQ&23=3 ]PxAy |#D_~Tt<ι}d}zW5|rm=΅3Q59WDݑ'd+~EAre;ᶂyVJC-D$Z$æԔP ^ɼPY~pf0叚roclZam142Ǖ ` %%ҵqۮVUM1\'Lj:LkETr#(OS/wt#pܾ,aR>%)7JO-BGIK74EKZ1J -7Qm=}%ו+GQ-ny^RA^U22~&A$ڠZh=UNƱ\jx3RhјVUQ>n,#?4i@̚mUJ=SP~(T_U6NC]5*hWïP撧*hWï hi!kx3wˬ*A=Z& Z럆1\\"Cv}H"A/-?w`c[>c]]yX`!ծUZ_K/R@m}گ[A]ÔaMGxe+򪨻5%P>8u 4ǠohQR(e()% - :l3.2Re )Ҕہ~/e(6 e`RE+UƐ,TBCe57Zn@=]h2}7H NA9Ԣn:WֲZ#l8ZP D3{)dQAM`O $)|5&qs9PĦ< ˣUU@s ёpe5ZR =45kf8Yh6$Q34yٔ  CMFt G)`L6nĉ[F#+pUj Z0!/'j?!pέZTƝ"P\ᓑotC"D$(ӪJND$3G@m!QƸMMpD!Hx#yl%&$<1]*X ˶l`lB}_njhI.mR5yA79۵L%n;blƉ~ B)2aXi'cȺ8\SiQP/ <:,<[(gC˙IQK(]-5.1l8=n."_Q,ڎ}hn\fk%uEs%#x>nw]P'%CnTպ{| ? Hto"WҖDu:::7ʮ*K*MVVxU&JO"`~ p̈9R5KCUR5fOYOyE"ؚ.ROFQJ9h;E%΍"j茖e~yJ65:NdXVZ]X3{6a#!AGWbQoDK+)ւ%_eD:Dz6zQSU}"תDkm(`)pE%8ey̯].0z߬fwƅ (k *}WqIӰnocp h pۏ%3#0!4{%'H0YoVSjW[MSRp0zb}N,j|[7vJj)kcIl|MWhF- }UfX9|T-K$_#r44/#Bg^H;?uکuG$Z?6}`i5aDZ!kfwVyǀ*0KyГ ?Kz:GDNGrb+Mzʋݛv[yByXyƖhwlZZ7p,xܬJ ]YJTI6s/:JGDkǨs FN*s,N8竃E^cHDy·d@zp(*'s ^*x9{dD|hlA`EM&K,| K_4o.@p!˳]{&0z 1top6y;'YiǮ&^7n`iCK"K"$@{%BԵ@:<kh@B7&\˶O|fIޔhaq ޶=G}mk1^ؑ+8|#8?o&5{#TA W LEHA@V~CNꨟn@9{Er/9 Ne7CsJyAdceg$ixbsJf\zuQ8U?gjȷꘚ R;o7:Rns^JhdHn&U `;wa mgILQQn.mJՃ*5mF(N*dG)֞Y6(1%%wsZR~pxA)2~pw5Aó`k!Tprs7P[؁+]4HGe2N%gU5JEvQ (F!t_C;0"ή|.U  =,۠ŌR OBJ;_d9"7 ~cm}, &ۨ0 dBhd;bl͛B7G^ ~}~ov_,ƍ"zk}d.ŰN<]Q6a4-YQr7x`f^eAb9j,9?tJC5c&XwM{Nt*\X[MhہN[IDx3[Ca[g6ٷQk]R31=ܤ\IµPp\(f'JjXD+=bP40R\t)b,II9ɦmtEZwe x\p&'=|50 voauy_js%sn{ͱpl s|*hL`b룫%p EBs샯}x'܆}n"ҮBRo (.Wc &<K Mɜƍ!QWCp yW磌$A-İPJV~E.S%\K_2"`CKEIȢHn|n9ti$w.;]q[*)Ʀ vB'%hEAJMo3쵘jqPh~)Duq /H:m n^U%6J9WͯXS(r=n!Nuk`mn' *t@?}jLC18ԱHGd-_0pJ2*c@r|wv\0e,$h;:M!ydQJݠso}2ft;dfaR Ō# a,6s1b0wO~~TY[Ѷpۭ(AQMLD'AO:*AezAh%O9)܊ZMVʬT3 J՛<*-|QJ*e>TpgFb*{bKe&0iP5p_𤡌`3)U9Y[Op]r%rMt!-PXbJQG-EOr>=9 +3VX r(7O+T$w]m'3j%*gqeCͿU bJ풳˜mS+AZv|A+Y Fɺˤ- sV"0a(kIoPHH&Hp"w~,7/Cޡe zzxje'D'q-)~04.AP-j'D-{MÔ(m:Q᪥,h8{{A~є"!yr5XcX/ L {6);>I<8ҟXzk8ՓH8m"zCGbܓ$7bͬ ~2-(w*mHPȪ|€ W. U˧8scUג%n ՂNl/#Wq):`]ReS-X|k'8fgUVM6Zks[j&ԶXY*TFޖ"Uٍjcendstream endobj 286 0 obj 4917 endobj 298 0 obj <> stream x]ۯ7tAB/ihACAv/$ @[ QH^Oۤ}AP E\$OH|>?;;{(R{{>w?{.*Jqor,_\mY0.=P,4'<19S<;}?<{{ʼnɝNjؽ4NP3Y|{;>ݧ&,vQ[dŔ!SB]l5/\㶶.ܳ0%SlYWï2G%]Bv&l'-F$23*Dȳ%BFy,%z=@h"ڧj1m β/8q=x4G!4QG@Eʍx)q5t䨖- E+hDƟn q*J8L)͌CƇo056ğJ?V3B"éTcWIAV|xʹ`$ɤIۡ6ؒ‡r΂Ӂi  3 hʻM26iYh,0QEŴYFדK[ B3z*awx#cݾC"g\ojAGG2*b)TI٥8B-/Ks@Z[6L-{ip$%]c撱QCV3)1۶]庐5#B"M2O[Lg GD' Ui i& 8̄Dٞ=|U 4b9/zuΊJFqxc'ogpo&P:sPvQzxtsaY̤SUG^VGĹdԳ4s$^$ՔzEU!37 a2'T6YT]I0B+ 8sᝄτ޹\g4H7w}q+xDrJRiɿUQyML"bLg>Tt-eCCByR;ʬ?SLLK.N |drs yJE2"lUg/a-}ss lHFK/ kcv7/B(LuYyNr@sY:;L@ p^!Rzz֜*ވ'TI[ek}ōhUN?̞eu9eDdCdyR3VMe%N`qEŚ(vd""/ 6}e C}ֆZtafVW%WyIJij=PUvo=_Ǿ~y;,ԙoh?[|׮ ըZA$S6ѢNV ݮCa-~MSڲ(xT<$}}YU'îL< bWiӟG=z6إx >:=(C!IR1#bkNǸ)CNSjpU65fPY8l%pCȶ ur '&6umU%E7l=}i1F|&U"*KV]_sQ^?Pͽ}XUC_1,V6Ց;mE'B%f]L]~ΰ&;mqM+yI$U>)\|ڋ߷hOoѱ Ap E0Āz{hQ+ajsF!! !n!>D>@J6DPDӿ2-_G9HuA̾!X~W*nh?_e`c[ qsPtkᩄ?MG_wCfq_!BMmjܲ۶bhZZG1viz7% _@q(ӯaO( |f|! T (NFkiѡ7Vg%!`T6rW˧n>y*Y jZ#)FVvX 3:7N:t/TbVy="$V$N!(,lC`u GP-W DS{8n(P\?n~(Y Ôg1hS7%#m5Vr[_1/mrdxvT.qֆ_ShhÄZB%i{6\U{!YmOc^# `;BskAŰQcd.S|ȸƲqx-_ޢlH-k nζi+==3aac_i&%oꃾPwbrWycAJC6nc̀XX]j&621ޮi 7,bAOq1rl^3Y3dzc[$Kā~/ ?,w\D-M 4ğf*=ô\t8-sXi67b#!6wܞ5IX-MGZ]HxU58I"Lu|1p4C-7 u(P+kT@V?n^$'ҏlr^vFCԲ+Z\ b& }Ƿv]8ޣUuW{@ ?<K!qV7P{Xy- 8^}h . (eZלg7H~[`mԕT+reK|f| M"\DJwd_~ha}a7u fuw#^%U^>y /uc[|-p+qyJ^#M˄L(A4xE[ccUO6+sw_ir׸rT?&eڳrs&{T?BQ)w۠/ :#R_%}n88v%KqARZrfQhŷxtD6%屿"CK@M3DknFڏh<){ ^U4af" o |$mbqYɇ iPg1&e^̽4KK2e@CEBdAJ=_X|̂=t-IR3^ԡrM2uoS~iGZǻ-b`ͿZ^Fendstream endobj 299 0 obj 4757 endobj 307 0 obj <> stream xɒGA#e0AXF0K1 $l@8@Q\~Z2+UmF3քzU][R=7vš/o?'ڮH4x\)eo? ͍QX94uխov kp߱!L7lm{緮mN[/{ >AkeQĹPfxȃT@X΀.APj{f,UvVmnAT GxǪe]cⓏg F~(d9Ҟ˟9b(O PTXW5cWHçarxH&jͲDZ*R凐Y/x%^V BK'>FdcnNCYGAq(Μ ? gCDmW:q{9dWyz̅"r\`zÉWundk3ogӤ,0)Y?0^~8k bcei++_pj9h}|d^6v\m>ڴ 0=2<:``TiT9i`ax m|!dۮ. az8"۵-b,W g w{v!MPI=IT)xEinmUBČcФ "X$4@qwb<D7Y0γ`#Edn5Ii-p*B ʈAŠͨb;X`k*jN$QI: gby%=e0PC><M(0CYZ#Tqd7_ 2ⶃbq4CM@5.$'9ktaZ{+Ǿ"s2S 1M3Ɔes$?C)z6P]Cx9KuhہėHřP݇1GNXsTTB/bLưn[xCsJ1:]kVӹҮ{c6 oeW ɦ;OsU݋wp2o%MEKtaO mo}1LLoTv F51Q[Xd__"wu(:Y\emTE"Pᠪ%Y凕37GaIј뫉drYZ [D,xwP;z9[WK4H޽ּUv'iyiNދn_ZӮc&b&ѻ=$ _ ?f!E KStFI¦(Oyq\=YFн/x;>9^ tBNU^[E`ى u#aK5ABdX1IcI a)/ԟ'dDѭ/.Ep&Q-Û͉0; %Eۄqӌl1(hʸjٸ1$|3q-r:ge-_cJMzn(:Z2;F&GLM"6CwU|K4Y"f< ҾNB|;Cyk|vKW|84I;f^X{[!ludMͬ-H1QmL}ʝ6q]ҦNFXD[+ z{~㼠c3d:;@"%}fUUi2w&{(Ѵ%,+HT'w0tTJ(ZWxYѣm ɥ h=L\Od$pZZчzbkqXюT~Cw-.2](jR׍UTݡ1 ~-t#qܿdmE<*v K[t`lv|/SloWEԂ-bBOCQY݉1G5=*^R_K\4SPaӡrveՙb/{~2]w)(WYr;ҡVⶢNj@ϽQEc)| NlGe|"!ۓEr_Z$=b2-T%7ڞ6b*(" [|~fǵ>3gv;. t+hyE~P;я+z^<T.B=MtMu(l|.؟M\1TEOʝ q֗?ލ}?jI` <%^Llk{%ɃxvϿxendstream endobj 308 0 obj 3140 endobj 316 0 obj <> stream x\[G&60 H9H3uU<$v Me8^'DP$ Pc_9u{gv{ǻhe˞3u;:ճS V잋ʋhK]mOuum]kgfOVg~C; ῧs{Xyyۅ\js{v}wo^5+mxvOj=y‘F[247*P }?訶\pj뭾+}OTCG~^Ҩ>J䦚AvY ߨыʸFC+21GiW\լt㠙-p4RLzvL;=-F1W"I? POA@}Q|83~U]5,Jĩ ߉ 8I|(w>֠, NNT"23d& OP99i>{ȍhk>QZ*U|Γ:^%U 2ǡejo҃,O|_5zwY1gg&[eXlxs6ؘ&eFN1-܆q` US:S򗭿 >|d2.ir϶;R C<÷{ke<@m#WIy![UxBSBTf;W!=Mi_󴮀:xlC|3/|w 9c{Ft#ڳC-yr pk DPOb{߶ᅨ!>i7ai] XU!䗰۱f߇o1bƤzQNU֒Ғ/Zo,ha:LD^/ѦS-{ńݪ2t 48d4⅒Zl,e5+mFک6%}IĐ r2'?616R$2x۷| Bqjh+pzxzR02"@0]BN!&[dY%WR 'd6"iϾ^Q#LbBh1ؽ \C?뻮wplRb6 S]B{wуX kxFvM4+ {4_ Yf.]#>\k+v/LJ8SK$u*a4(,␚(@-S %PWKv5l.;%36 9CAx:Gcq>i.#5n]y;.wekx; Kװ1q&jC56w=ke iΞރA)]yI[c9ɩt#wGSlE&{g 1Ut^@8Xi,ÈrXn'rodᆢA@ 6i8w{|whbY>QhZUc kpmglx,HXd1eEV'!+Lm7 Gao տƗccW|ȟ2·πn޽6Տm#ڮ7K ܳ$^"mۄ_yGlӚrH\$@(=(٢rt&d?&ѓ3HØeB,!npɪՅse@rUX|y ˨XQB,c@+?%?O_w06JL [RETv/vd71΂‹&lmsv sգ> stream x][Gc0A:F! ͤNb.B1vd{!?+S]g{v׻kZ~9SSUo;U`U+[/ kg;3KSmWuusTC_7g/Ξg~5; ϕG+V-pݹ{!Lh*!ZnzǖgJfًs/pbceUT[5^EnX/ڒdP2uHoуN| ^ F&)og&[eqVK%iRfn v+#0Tխή~k>Q24wu϶^&]E]U("Wza@ *tCb - Ǔs9Q!]U7YhEpJЅJE DgKÜfy0'/((LZaЋt\$*I72.T.Np/YdWo;c&6πW9:M*slywjzڙ8Z* & ]Z Z/Y(kWbKҩckEH。Sc'62(hb tUb~槩xR:=Ysig}2ep'?Pg7/nsxEW:ry/Y͖30F5fkG; ;qWc@nVQ*a{e0pj9dԝb:h_)c_:-~2]լ ;BZB>qŕeh7]fi]F\ƪVU9q@IwIXH@n 5~`6H*c$1\LL`mÄ?=ɭ7'`hJyO6Tx]Y qn9s%rR!d bia@鉖rj(%a=qPaF on|@a w=Cg4},̥_Z#>Ԭ%]3νEqW%' ;)9Ph7&d/֥L^d \_Zw&oO^ܛQ C㟬C׆UwH?Źˆ2\ilWo˄\;3۵RCʻξٞJ@Hmsڣex +`8ǏC7Z5RݮjS1e[ǍBSq|SAòp$*>ej@֕PV-UѪe+< jaw!FѪkʪ_\Z?nCw=8ZOphnn8N);~h'gPiduFG~a"O$dDO$d~#N Hؒ]'y F']w4& |"O$]S<;&D2H(NdzB%)fLB=(6 {F&*hFn$ytf )eXyYFV*i%t+_N%ZlӢvW.\^+"~NO57xkhUH(׌T ?]J՝Prs?Kc>oǡqr=6C#Yo =7qq9=OyLKI#B`OȷyT.H[_o3z G@NJ_r!/4XYc EOvPendstream endobj 325 0 obj 3177 endobj 335 0 obj <> stream x][Gk@cxH3KW "q\0#MK J@@/D]Ω]3=޹즴=gԹU9tdr_ߟ 9;" ,.~↏-KPBrZ|.Αki`8gFFσZǦr|h*YR[ 2)r*}AN '6` -GɷDRDZ\f>Jt1Ma;73cAG;3U&Jޘ׊aCiw_(\4oYm><@Cf-˗˼rW!;GnPTmvJ֑x#6Jx*5=z+H$8`Sm~\ysЌ۶Qepkv{] "vv{UHq5/ώ(Yt9c9#_x95^߷\BC@<t#!_芭* FYPr zF&LN%RX1@!QAݧ%QQYrxgA .庾 zW1`oxٹF4ܚ2l%#t܄y\JԳmbB/Ly {Bn 1nykS37 "P3}svvB7}ޛ>99V ;_󧦗ReÈ׍46?F;1C]օo; Ƨ\(xƉQE/>/Çd`Y8+Iz{Grc)R5J\˜ш@ \+D +:"HFlKf91*շ|?*Zrd+j^ܚ8p}c>M;yCAM }[ |ۗL9I,({érf}?[[ҦK.1XAӠi^}^(V`t6dePv[Afyi2L.q^,b@.]s.kH] ˔M{oU7YRka@T "IBkV`X-jZ/l~B ^lB mvL:h8 wFA zA({m*j݋^lЇ0[#|>3 Mzϥv깑1NO?f#ч#ު,*x'!,a!H03'& E( i|l(Ȥu:ʘnHuZjHǘcnzfKY=P:[KWq(T굔>%B8ڪLyځ:5XXw1gCveN%mg9b{敜鵲Rq [{-< Vm#iWY2%Hdy4;CZ PIh:[C=k6|hVx؞[h팓}˳@Kȭ3K?} ovMY".ٶ6ݿ/@.7; tr1/49~4Ru7w}_B( o+"4&/ KQΔDf"#Z9I;ʼ &!cK1WĩwP^sǠ*tR ~H8Wdy-)AO[ 97OkD/[e0VM2a{DgLD6SENX5:~^Qg$xv3Z%|s"5ckt"A.">A."HnO@.LI+dcI1S}n֤){ k&6#XU)bª9]);c_k_Ne> iy,O9ؖ#: l_!? \F F^k:bUMȁ~յn>b-[nގw`Z΄^:dNcapJA~;eܚۙE'D!5nHtiڳ٘_&sDNG6,+UA-svA%6]GF_SP2K,щKsF| z䬦A^ǥoϧ%*]l+p.2 A9dZ=. l4Y79d H H f"N2h")U#%0R#%0FJ`FJ`Ţ+E0!0BҒO=Qh5֛_m XAy؅/Ę\TOgzjIERΫ$5w MCTۘH,O8Z|X-Fo(KYsս8{rqR/E/ #{fDXlQ~dh<\ }cF4[Q4Ēk~CGu V KaL\R@ne]^+@5DB@*qb|1!^p+6!> stream x]ۏ&E4*",m|C׭p[Y5.AXd/<4 ĻhĘ5_|ɻVWS]o ̙sSU~S}(YQ6wg!(<1;7UYp]6,ΔMgw\_^wzigv+vv]u{#.H;̮ȑsGkZ[SRQoh(SvVC*U/qUY荮J/yK Uԛ\U]O!y]E/Q =]B'*Y[J d7om~[C l $d1Ӎjrd*ϐ@l Jʸt4d\S k)Nmfni{ 6sļr[p]Dˆ ltS%<36Zkvү'" rLYX~$jiw:;249jѠHvV sɅx۾ 8:͐ij֬J+Cͱkv#ĮN=W4yh':¿"q v\j$VҁI"!L\烬V Lȥ=1yE+mgNyM O3Ѧ/G?m֡D6~_P|7sf@) &8^Ǜx;oHo 2}a7C I }LABWyJL͗䶫.C "B&ScN BҮMf:%_Hc*ZQz f% Xʲ")Ke`)m( H`yltSY]Xɯ s| hp2=nZ:X߈2Fzi/Xef0j)y `b u)ʀ &n8W42_l(#+jmCR)J G bM &nH^-7mO vsݹOѲ/P Vue A05vKkѧ> H'ɌuO{-٘ HzQV#/vͬiB{j["=Խ@>֕:> b[zLX8J>5Z.͊ʚ<$jA{g0Y\Ѓk7$Rx&Le]?(4 nYcꛑ r9A./$zis:"Gdk|ȄM֟C|J($_(W=s2*Hk&ϵPXyN?}`_z v$"5iߚdsW:i//>dx{P*  d9{'ّ;j ̰oWtp5 迻bp$Oʐycuovq]uBrO.X.?~L$s;*l<$|$yz_9v6͜ki3vQc2kjdZ-<$Pzr$HrOby~eZ- x(xb~I]D<҃;yl8׳ vO,>X'8aMN;cM6QNR-u>g䴂;jsDf|fBy}QÌ(a8aEendstream endobj 342 0 obj 4155 endobj 356 0 obj <> stream x]&5UPwՠ c霞ި}R`'^|e^2Quumm;~ޕg{f_T7wzVxy}wh惘ŃWxW/]}7&V4oN~fm}6}%yE:ܞ{tiJp ^-%hښJ_>Y7tݸ]0ӼfHB5-?avȱ-y!ےj84Պ=[7aۺCzV۟2_'P΀wɗ^ 9r D4O3EPӼ^C#} g@& w`)9dgRo+5OYj*"qs$Jʐ(M8, AD *">rqߍ=&[V7gPxNc,jovJ!V:2.AkG]۟ ţRA[ $}!?Bݭu ru0,~dQcNꫭs<vb &HF#׃0%aNL뇞M3Wts4ċO:2w_j XZ7뫘_TƮ#8gf|q=L aj&ԕhx4IFydY{ iBT8 1=8ՙE:aGʼ==sj px3+ Uv:JDnZԵL3T`f՞rkĔg2S`r g]Iz ~Zn6.n}17# "t9k +KZGл\q<P/h*b{-vVNQ0[\tŢ# .'SU(moc1п;GH r{{L`mE㻼0Ň$zzaB\[*y^,pI:riڠp863@@UUlq-yR $w=vx5]i|MzńL8cpmp[rr -}ʑv[lg6!AHٓvЬӥңTP6.ɑ('>ðjb_n|o}`h=ry1J[( +Ҟ{4^\~2&|qNDDY}CLP)*WhTƿ:l㲱S /}H~"ekq bQ x/Ng-no2v~ k ^[MщKҔ1(ul,R2 ́KbʨLՌZwDbіP0sπjF/3R<'80Rkz)SvK䮘  #6WW!N#7G 5< K:3f F9Ad|#!DQct Nsb(jN乘+R,p ǞLZItNe8M Q8I:p)NIF&cgzdFK?˔%عN~䄅r jq\愥t!ٔsE4+#ؠ\յ>JdCOb8`Jca ȑ,ta2MmxR!{eY =- Z͠D.!VX:G>=yFHj}pjt Kӂ I$FmZmggā1Ef/mha%"Y}zlYrk'tyE\sGX;4Q\omz)B%0,-^Rj额RUzxJeZTGnk׋V8n 5yOEuOc?@Yu!UN"'lo܀3-[J$_ TPg 뻜G`X`hf|X=R9[T0y=^i#؜IvXye{j ے;7\Uߡ~NrORN:J/\3 {I$J0|0.MQ6 JRۼ'CDMMk߫7rQ=?&a.[)SW7c^t~zíwWl\fŘ(JY;l#t"/kcՆt*ގ'xcKP}LCIΒiSZkIF:u"f U,q=0/fi坮,,Й!+)E\2PQ5y"zurH}U$D Y1e+B0:i}h\򍁇$dsLPRa ;>`hөeNGG8m:+A]1NflRBGQ `u'\ ΢Or4`$TJG3otomRhUS5![e;-5m:|2˿S1mjs1zs169H;Gb#1ڭ}$mU)+H>{v+r~sKd#oVߛ@ɾT3^;IM꩓xOK:tk%l2|Wޜ6N/^n:^U; 饓'|:V,TưU}ej"/2,C?c:k*-Uc" (@ic^$kmSw7`:TyLg:_endstream endobj 357 0 obj 5148 endobj 363 0 obj <> stream x][eEQ{hD>241\a@ H :r # 5 hI4"@|D}x eڵҧOwkzMVZUj״۬iK.'_Mn.M2ͳ:I諹p]mܙvGÚ'&8!!U;myzƍɭW7SS#cCl"P*Xa] <,T=ѻBG-{x9K =iD$I5S1ȮꖨIC0U Kye1_L] O[#d i/((H1\̫a午\UT+õP9RyJO_F5fYW"ug 8=7]8+X:g/݂&h !=ˬ#=y#(噓r- jQUn[nI/ɒ g viSS2_Ep<}5A9bEޙ<ۛHS a*% 6pXvNu'>X=Jfb׮m>+] x-gf4ftC*rx-jy[6K7?giD02ivQi *X^Z߇-'0Y?!0(c#%3]}BWr[Oi+;N1φYTd7 %VvF9q[̏PX8a}TbM#)*^|TGiz _LgM"X3 BT+t=h>ҁ_Bc/^ W/|Ga0 nRy#Ҟʈ?-譭,+X]Fr2L9q& 8b0o Yԣ݀y(YEwLs{CLZ *':e6YO7(s^iK\ˠ+/lW"[[S/,S0|qi t֑"T:Hp;߾7Cdڡ>WV*ri V[AONb ZZf&q(3At9`ͳMmpSU+uKime*t݀6 *Uɺ2 ۆ!+^_sd+rGܚ4qyw2o&I mїոҙkbiغ(xpJ'vpf4T(D<%:Ek :1@ͼ  f Jm#N~H (p2 u:~jbMYx& q'<8N_gA¨Te#1)FPd7y{B}ݚ^sHF~{`&&Ø8Eʹř8:U>M4DU:E:[i*I4Q*R9x(N]WqN`[hhHVΖu+,d!i{EtǝD~*IKxXchPy8؍O7A-2^H5`tnҸL &KW{ Vg@@aB<ʶW8c3oSlREi\U&w LXQZ; oaqgAUR沯sI@v`QKؕEPmȮiV(LWdeas֕@2UbFݤka܀M[θ+N140H/(f0)nP [$N*;y0XEQ?-IWaVБZ"ʉڗcߘlZB"-#˿zӕ2OjQUƎlTnAzvHCn=T5MFKOj NkGC tWj8*I|n6F9GiF:I>㝚szЌN?ENjMI=+*֪.P޻@bh "ެ=gZ1:d X"f\Q\?Q=)ձz؞Ѽ~^%{nh Lχ^|_0ZxH RTǃ"L)͠%y g܌t}jօlCFۯъmh+߃4J^W]qQF}ы-AqTOl}5Y,P1'Y zSCmG2 0_gx1$h_QKXUq,-3Cb {a}G'o<{ }At|@5„aEȓn %*A|+pN_fg6Dڄɠ;_Fe8UUEWL{=l0@a <vA<|i4_pD|#Txu=Эp${UW'_Ǵ# Lh-ɇhh=kR?=-.p2|*u5*E6foė++I$g?BҍV&[ݍ6}e~ C^9N?ay%.pe6W ؓL*n5/E ^ 2q![Xr4w75'z"9q?92/#R{)z@}b 7G=GCa<@sP n}RrTs'rTX/7\C?q^2֭Z/>&5~u0LF[8=E6y]8ρs1+d13W奯#x5/'FsG~;x˓|_5>0>>~&u7>>>r'յy,nNO?5侺Jsw=A_3?T,f>u}̣ͣ~#dcWsŴxh2]f'gJĶҟ<~g9:zsfv: snjWns}d$ڝZ(hh:jt֙VnG8_ZS q8!ux5藠\};\?=T8-: a31"ƺMRSeEuO0 ;G\b2n[W/endstream endobj 364 0 obj 4050 endobj 373 0 obj <> stream xێ\Gp`@@%11$LN& fa#mw=}άwv[~Twuݺݦۓ'.2%w'&ۆrlOmsk"N?&7&/5;G4|sP!3wuyjkē iMpݩT7 3lmOߗnNnJ[LRV;4o<eA u!ځ-(:J9B-`?<]qt} U G-Hu3e `AKwR҉JB=)x*Z5q̰',p6B;!L[=z-ҍFx1?2 BmiGW4S(g`>k!n>,[U5DX % 0~lrǣ/qsOy1ЙYKdX&:8)4?{ӥ|EWUT9ag$Si\Faf,(DGU:ЙE/lMcNx'Lk o`87(D0>hgb!kUdsǓk_1B _(͋ێANyh-%sפ xGo<0<byV,j΂@ 0v<BaV@!*0oeN- BX41;LHoD9y4cL?>l)xj>*K//B*\'4M@"x6GØ4 c)gScr t ,s8§x0,CwQ=ILuNxX"=Sƻ7puH %| t^kxK$r pC(#2=[s*=e+7)8z=_,\d#aُniya;ce[<.%cG]UՄ+sI"L$[jIS47nk/Q>Ivd'Pt# ZMwqJ!mA3ۻg;w;s!&aW2M肘O؛΂^S"h*64?2]T p(.!N{|,^Gy3=R3Z7:d=Fd)O>w˓+΋ă{\ ]Q R(1c'²`BgvGtit9FuiҪ.$aFbXYG9y ( Y_WWn}V/޼%7搪qP7rKkx(tcbvrHй?-.Yb3 !,L 5֍,ϛ%5# 7x 8i敮}6d)UْHy*|F6-EEY!3Y`t4wr6`]Dőn|O/'bkn>T|H 8k 0u?"BH{0UqZ|)Pʉ,S5? ~WJ?E\kG!e)&%IiBm5\r-KO?ʞ?$3:m6W)~n#UDW| 44W;>{m$]uY7:=QCU=ۈf>O|$;ԧk"xIiCp"k!jb!j!j!j!ֹs)|"u5 } >LGmp1ݓFݟ׎M &Z::oXch;$,}:$*0๾Ŀo|>x{NZbmPd^$*WEo@!{J =t7ЩCkGQKA"r(hdyK4̫a\/S9HkǼР+aIZ..4QGtTerCK b`ߣZ-kn ́og^鋟f0^'g_ Eͽ2|hy_(S 921t#; yxPÏN$?<<5yxkA5yCoZNh,Ж' /,-(f{W6"Iyd3+5~5Xy"iU y!(|H'Ott`ڀlS~{e)ԇ]Jg۲iBendstream endobj 374 0 obj 2959 endobj 379 0 obj <> stream x][\Gl$@ v 1뾜6$lq"kvOH!!'xyP^ ~}s۝:G~[ݺN= ;3sF#Y#ZO>RϾ󣧚0Wssn?wGGgnx}ui-vK5;[i@f,yԓ82634MZeSn 1O]y=a"A]%J42XNeW%:dt34*h ra؊L}SFG#@ iǨިHq4AT'HW5W(}9R'<պO4jͳd*JaPY{>N_8+0@OE[g@>CaSd\"2d& OP9k! F;R/@:sL{IT9`g" E.s\~x3ՠ簅EowvGm\cʅ7QIim[Sp[~x࢝ V=jZ_77]}ؠ=qٸr'M]d"=NJ唀'H/w`u[N7ihyPE%4 GԂ8H\:ᷪrPX @j5s%vZձ| 7М̏9fUWuz.TsBMo.+I6]@o b]D˨_2e6 !P| ӵl?6+'a~OS B2-OU \$ `07xHqnk0)g/11KB qLm:|˸y~ 7bYR#Z^!v:3h@67#= $"f~Hc^3거߹zWTr4 cQ][B=%:U,ZA4~l BP+:8l9Xvf"EVx6|62f͆ c-?WhdN6EPxYX,X$qOtVd fݿ \Ft-E2. Jk<G)`ye &Vq {HقdjQLDy5zן@ԝ*g`Ldujvu 'iŝPS (\~<Źk6׸mr2NBlTS"}(ړtsVcS yx[=w})d*<tڞDݙ(]M z:%X*TrjBl]+%6C#V%f(N%XF>s)SDYyh'roA8_#tDox*]ܛ3Y$|DE_oЇvʚWbXފ:*Jފ :-Am2t}H6\c;iPaRnYR\ D6VkNF@.zjV qo 17NڥZ,אC-3(C]D=4VZ 7I4v@c4]L؅L0e6G{p {6QVnsAwWOoŔ_]nָT}Vs ڷ-2q hs-_nl,om0#SNgw-,t6Z*+K17Zn6[ŪȧtĊpj]bif)#Jf~4}:\/s.?.?.m>. \~̷N\^iFS ׆̞hz1̙zar-=|Eg*CBtT[릹Ź_r֗EeW36*ob' f\7-(Np}#' 6UXߏ^snjLAww"}(8S?Ag8CEVgݗKڴ]h Fm4+bL5P55;lS(Ya`'1Nn8d֏@d{vib{6=;7={!{endstream endobj 380 0 obj 3231 endobj 387 0 obj <> stream xMG 8@lb 8W÷Y'ؐ`8ƻxp$ _ p!G#=U=S==3}owMHVQ^ؘF[Wݡh }8tP4=4m*>?yy>kWpםc5jMژ57+θ"&ӅT, quAϔPQ`^jVV,1)ԛH;@NrT++%Np V )OTl>[Ka#)¼ifUWt =[favY\ ! aS{_#Dg 3hm36Ig0/"F|w Cs.v~ i'>(cYW`Q#!?sz]zz`:6ڣEu8R5e2!w_Ii@#@(LENR1Aʏ<_'Y`5`aLHLU n煙X 39FC|=lt-ll|?qo o,NW0M= F@ro'7Qh sMļWnWwQy8kZfŝ::4Jm׆@6Pmon5]AR2fp`P6IcPtWFƞ2cɮCX#kbTHlIvr.<^)$ NP=xzމdp1Gqh7SkP$=C8b["7qT1KL"ums`kqlxlS5: ܌NN_tհ@˹ޒla*eMu ٔ1ZXm$D;vnQu7̴n].@IM(=00uͳ#z t(0-q=1`=UԏdamNU ήJ\v9U\@B>wz!!^1Yp!wBtvl罒N>ņ~AFCgڑƅ/KU|-Ȯ?SFybr#M*(&2IJgd3pg`vHgYL!_# ]Ig* Ore16&N@` 25J2aA`BO՜g>zף=K<, 01 k=c1 n ={;fhzva`;^%o=L(qG~~,kB w܉V I?毤tjfE|b[U͉}X gUל ɥƒil,3w_fIbQNsxT'?S8t]d̘ʪtݡ;GO=aY?4mE`MSVr[FR^7Kqfw {ɲѱY}%xjzjS^qDrޤWSjgzoh Y0-qbQ(X>qEӇqr; *[M dU['3>/\Ikx^SɄ$LBSMתlpJ9&m϶J;"L~+IlA3 }lDܭ-OօY^%bkՒK@ݦZ.+/^:JKh4'~~\ңS,jZlɼ[_ߗANAHb&!OT@= w =y<-yBPƗ2PyKEz)*Oo'j*KatW=5@DfMB`5rh[zC/@8^pլ]xendstream endobj 388 0 obj 4028 endobj 399 0 obj <> stream x]ۯ&EE?2&>wMQ@eAt]=+1QF-Ѩ$j|'R3w&_MtWWWWfb;-k\^\\6\ 2o ,88x}5}~\:za7skqǝ k^KCn6Bf`q>nmFɛ%՞Ƒ͡Y6zKhMOua6'<:p+K5tB&SBQin5;9Rt:><}C4e]UoO=qхar3PSq-h oGa[|FefIO@Cy^NV2{.kpRuaa3\݀Uha W7AN<@xUft8?8<@xy`y1* J42;?L\ `67c9B=k-!rȓ ?C1(Tl| D׀u>=qYi;s3M+J{@YŻ L||Iɺ;G{ 5I :"\)f%\6S$T;n]An5Ċ MRӞZךR[B%r-#4qf,\ ^dgrZMtjj)j[**ᘕ%v,Bu2vH1'=f&{qRlGx(l U] wOW)H_Q(@sp?$엁TT0~he 4GU~ Di8ñ_^Dtq @"SOBG/Zq2g$GxaCðՁدS9~N Q }+^q;p_T.ޠk>`IBxȦt 'hr"݃*b(.c_ A`y+S]BRNX"}@[/b@Ur1kvqAwz]Ni ؤAhG7}ze6 8n2+aT zy|C?k B+SEb +d*j$4{L=,Cn|C!Q84H#> i4J"o@aCۻ8w `+# UρA^ĎDK' Ŀ@36R2Hxay()[k0=2搃E964;"pk}F}:g ,LzyƪAV&Ӽؾ^JM2s<{9Wet*k*>GYl8 Z2_d<H 3 l»`2T# C~aB8x'.mAݻ~tI?@m+yGKuĻ6B&q]#oS8wx oRKyP-a$"{xb#?-䫀,ꨮ!8ζC~꣦P ZtLSnϪHRߥ4n:7Q$*$ݘtREpap[vOpK"ZECOeɗ`xf>~w^D/L (Ϣ+c8/2ajks4@Ibh>HR #!^5&!qň!X X<{3ɡm`H(׸/7W8cA a'A'T\r|LfnvS:[@ѯ< 6jl o0fPǎcwT;&/h] Y@98? 8ĺ#/9?!7#Qk=|e^H >:Tyzm3:Y_5n'T;'lCz&@\sXQ$mbe&z+oMm"ñָ?),9m(fDڻ 0{/[MkIZ\xi/enY^118i|9՚܇IѪ=~|]v ƥhr5=z]!-6Q2|T@z$xr8=zO;_' ҽHtQ0'Y\9C4 Am#XR55S 58՗>4FT\M;B]bB=wi>-H6^rgu4: xTr l%?U#w%(I<3rWN]ǷVc~d6N+ Y!d-#+Y|M$ vFaA#]9cϭg̀O,Aqۆ[>OK~!/q˜brE,.c4aG0CYi;3FN |ߌ6щ SK1űDxpNqVOhӾu%跗V W|xR_' +^w*J 4>3r]0fK36WG8[BQgN Vr:/wva(dȖ>'6ǥkpm̥\uzRfR0{+!{g`%#+8ituNgzx:W%Rg/ȍhyN]3+[Q6~dZ;<v,B}ku*gV \iҒts Mؙ `Pԑow$cs%>gJɖT3u:եyႠ->6> stream x]%5UVٕ+%*+b[Z5t$o`+΢G!He_8'NsgvjjM|tfb˺bywSW^]/D*.U럔ᬺhMWV{ zpyynRWB.jgwGsuʎxW[܃gCG}1*2mUku`cs:"GĠ=46-@Jvr]mAr=e-an_ 4\!3xaT̖O9X`ojO h9q19 BW"m-ɺopwAҾkpgj j|/N~sGy" |sLK@CtFZL4s9itvDi@CQr{9gA3HW"颈t]`zXKWCg+Io!MckysX&e[:q{Jimg/ʫ:J&94) C4ï4Hz< 0DC9|h7_ס3Ë4@ fpMjۥ"toxXU>A̯˿NE[Mxu>چ'R`KUu1; iK4%*O{+m nhx*>~]5kUs3߁/q_F&*C#ܨ)<i)߄ $t`v0;dBo ^A Co;eA}X0 f$_2,rMլz V-T"{wPH3(Ȩ/@#WS@B돢h/>8{ǏLnyxppd0y3ORpQ< p=밬!rm>R5ra {8j~%(DnA&@^uo:%#8UJ., *eKdf"@ۑ[ak< :ިShwa2qE "(vg`ݩsTq9cOCQ`Lu}:By,GurOH&"g4D~t,΅(c:P̦=lQoy} yʒ[D3dH3d:Bo\ń:oÚ&~; #@HBn e>Cr㆔[" - YM7碜77ƇD%;q5a.L2n> sXQt- #,z2ryxtq-Ky!A9M:r5(ef\fP.b3 ]+oBKrHYt%o@c;#k{7ax3T,.Y1M `+FKYk]X H{<3Tc*UwC%~Y5=MRU-^1M̴ʐ̲>dQ1j(o37onns3\A&e-AVBE O.֔uYjB1&iݬo %md%nӹPii?:OX[^(l%TqW-Y&g.Ov8YH3jD&<=b(*"-zd+L*:E ;zO,P4HK^bl`h6 (ԅŃ|I "yX(U7eImf%݄-8"Ge<y̴bw3Tll՜[7 l-Z'Ūf6ye$P\Sז}-oҧKI|0jk媡\~1t CݺBRxJaXTJ& . 8K n|OY!hT9ڕϦ7Q@g#Iy6Di?ؤRtgA_ĔhM/T9wp+8Ϋogujɽ`]#l|lY,;X9A[8Ymt#9Y[77Mr ;Ϊǯ+ڝ!G0I)^,c )!Rd"dnTMeĴYpm1dC)Q ʤ AY;%tdisu֯a0ol&x}8ScMID 3iT1 Zf贫xO pס:zԭ|(Βy"@'ph{tUtךh<>6ng >Tߋŏ B^4Ea^;&ktzʓGw . $ T诃ܱw?|8G("oܫS>?'GBzo`sU;D̀cpHlg[z';D&"!3.tPZ@ ˛ܖ@e%@Wa1aT7䐕17QohcnwDK>-.G+Nkై&YbR:%Mc[ ʕ|W@*/64);H6t-k ypx.rSH|wV% ysBl>G4G{)rT7I=i3wG [-y !%0,!Vsw7s${|{U+XYn(hv Te=F zjXrc&C2FM+bRV4C5(\g4gpL6d%{ی~++  "@Qux4fiP%%׵s7兪RY%XgjPw}tO8VhI7>֝~dQ,cnl;7e2S7P@fZ4X%+]1*}&nK)WN:e˾L,WM QX=aw:T>i")7.7Yc ҇_SX9ο \TX12qoz Ln7n _#SpS:$߹C&LXca\#c6tc8&q,5:hI7D;ڗ4|Ur"V|/ihV-mFUߧ KlʕW zYz^ޝ936E츘ÛVK.  25 OB K04a5jd%ShIrɜU4185~khM=1~ěyn"7 Qw >9߰uf'eZ)ᩳO’> qkC+i}^.vl;k`g}%єӰ9yi,ɧ=J @D>PNe@\I- $O ER>!4 fBԃCPR<>:H,%HgR"a^hjURLf^!'qHLZ:4iLbavîV`t+a'šfn?)1zkG{~siA''k|ƽQ?G`?z&=)]0~cI&r6#"V< _]%sD[y`Gj E([%/ONyiywBeWAF Xć&-,DNs0ޭ Uei q E# `Gy񦿒Z|hD:]_~\f@Q%fc{H/u%nP>۵<t9oNߝdJiR$p>ɗkLUz5l&;ム(["Xͅw2LJ)bbdx":u hti) )cbd&Xņ*@r+YMwh3P,{~A688|p'w}s_ϵ[.guy0xnyl,[Ɵ7dq^ 9ԞMrv9Bv&u5ACOWs+·? +'t >NÛйM&p/>Tb V֌ ,xOR Qm99[= #,9=SddDnh3k)ovһS@l[2)#.;4bO^:z;K?UzfGdr&;(t+U6ŅHwLt)$|MƞᒃJoݳJ~miCάYь򐳁1ze]N}9`=%(Tn*#Rzʸ xĤH|wVWg+d] v/=w{ m?Lbxmg{550gz7iٔ8aෑPAL3آ2 .d>C}{U썯QBѿ~AЏҚ$dz׌Sr~ЭX ɦL4Au7\ xn?׮endstream endobj 416 0 obj 3684 endobj 422 0 obj <> stream x]KG\ 814E@WW`;6 obd;2ر1⡄D) V<~!!~KH:=;c;#[{nUW:ϯNVj~ݚBrY]xzvu&RW[6.͔jgc:|vgqv:9HŪ3w>m6J Umn{݇7/Κ3mzOj=ydh~oU[EQXɃTweqjhm:uُKU[}W]@HVs1ȮjJX۩kQA_*Y (/๪tm }owbғi' w(@1T` U\֝9Pq}-~UW Kq߅{nb rPhSa*ԓ£0!2ax6]ed$ á! _5=iխEYR (r*E}AA '>b-GiLeXlxs6ؘ&eFN1m8q` UcXc5G}:F乤9|y><"0C9|+yZ C<÷ t]x7oxmӓx7÷-C <÷oHVϢ-]NM.3K!KRlWߢQG #VI8&<"8"2GctȻ `6拷颢r<`TU3K4zhI&}2#Ӻ6cQf B5 YDA$`m*@ mb (#,QQ3{% YaPU0C{+vdz)4  Lo2Dy/JV?沑e~þ a*+VTg͊۞e6C75zv#,à f(!l@s<*2$ƌ0<%q & FY.%̨lJ%#9]OIۤq Fr:o{^ $}U+ri L=`q{i7\t~F-Rg )%iliv!MSRgٽJS7//YsUà1cPScL? [i+%Ѳo{W6Y)x酥P`c<ڹPWS= J"!Y)5ڬƣ3XƠG6Pں!V}X JvWK}̘W=%#y;E$K0* ; ʯeiȦ@ETIزApE@zw p?bPjn8ِvOXÁG8!?E l*4g)"RcK6vvrlVӽxݚ$f$Z Ob SO f5};z3 <'a@aa;Y\$Y^ vlX䯄)>0ϩSr6,afUA_򴮀21`2h u f;e:oGڄ?gLeq%X+Ȝ 2/#C* F;Ex<@b:H_n նqÈZd/NB:ql:kViK4x/V{Z1sڴi/M6-ݰd=NiU`rl uҐ֓6M]]w+%!̤ ہn&n6_|WCXp7!M@~VF_("|  顦JhL>ʵ6qSE2R9t~(X W`0Lg{t_Ttli>͡~IP%| t3#HaF֫]k67U!\M~ 0Q#GD ̩dUsUv ?2^de54Vx#F7 8pkX[=]s~kkB-`ݶV>p${o,Nq}܍Sq-nb@jVi7.Z~ V[+x%vZjD$o!Pn;(<݁,֛8gPiuDB5s~BG2TN4) _S%5:v Owg%e0#VYߪbeų`Hazm&cge9Lg-OjӮ!E,Dt/W@3nC3>SrD#ma ﮆ^x8B=էܻ*2(Hן G4O/`&i9M'Md0_{_[8IXȊSvx \}ezk^Evy<ԑ|V,+JtΥUؑa% oh;}J.ӊD~pZ\Y&^~܏ Q4ȟ뒣m.U'ܒqqJhb7Y t k= 𤫲Ei̠Ђ^k( \[[FܒWqu iRg ͣ0{:~(]!1?*hƣf 8NT{ t& PE'<\^Ċe.<%H81ͯ8?O T( nXR$vCuDP㣻aR',UDsdWt7@^ Soc,$3*8? kJHO4-ftTcjG+S;LXz75;Y+ @w&YW]RHYI{`U8F [YHӊO.eeS/k.SRl]5k-fk61 E]\endstream endobj 423 0 obj 3515 endobj 428 0 obj <> stream xKEPm 5A뫪BF(x F6F0 .a.Υ[]8:}}y,O뼫u/6kZ?09umӓѵ 9mD)C?OL<9 s5 .=fa3w}r궆5&F=LnO:Ӹ4fxv`l~]hM^ZECk * ]]YaZ4}2KUЛCW݈Ń4S12 t6h;{)4*h 2؊HCZ54()$zfrwq"r~UνJpxOBx༝s )\‡ >~d6.korepFFyX\\nGgM4q_A {|@$8-('5Gb;K'?1A#j3<,#F6wH#*lƩ? G& 뎄q\aa].L8! Hh p; ``-;>vnlE/ yxThDYרa5~ݒAWSƅQ$e|啑+a W> MSdk+.kQhG!|sfH4NO䚚bo ",cqQAK j"u*: * j*AYKqIm8cիav;-`0(d΃G] Y,ޔd3G![fB\$3e;g@UWզ׾T:fOTP#4I9~8ݙv؝& )j`Q6p78$UqUZͰemdHnVTδㅼҶ{ڦm8BL Tw*A - EoY)W!I#mrxrdv.X46?{0Ž tMGJw ;{Nl3&pR2֔0BQQ@$7 M1swh"l^vcgYs"Ν _]*~x544uxp,tv71X/i[+vkGZ+2! X5{N V0b!K-pb#zZAwI .S|`2Q|tq{L8ZX'&'A1(y,vͨ7pX'+;Ǖ?ġh6 2rRr>[+53-]>`D #HhD?yuc0U\WJ2}Ї79{fxw /FІHTzf`G( 0:Y(N;0zNjAZ"W 6m ~4%*V\!d$I}j`¶W7ׁK}T08Zƫ+ \Ƞ{ZLivneTƂ䘋7Idz 46sE8g{%c~* Esh BUA2Qfjc}1]W-L|(Y+'_$fo1&TXx+ ݺ~N'♌ܜHaD!<[ųk|"Iv!4b-j)VE$ BըV6 =u+I6ԉ,}r-PLjɦ6 Ov80yKUmfr^$b3e@Xf~0*iݠP"f6l9/P\S!0nŏ[|M5tbZ3,t~@E\=^TDM%Py$a"x'S@?z:\SH::yĒg@hE5ajU}(SoY]RU"YdF$QJAh)zb+:PW21#a?u{:/ f{ʲ+! SvT6bKPWⲆ8Zb|T#[uyWojaLjcVml6GMTzvJu sF po<\ .!9S>ㆋfjYҡ`] j۪!X-IjjZ)7V(+Щ13+V|;<[9|Q2-#-TmRÌ#i./K*U>]K s/rAS|9×Fmf23 yzON҇0'WnXW=^endstream endobj 429 0 obj 3859 endobj 440 0 obj <> stream xMG%@C ަ?gbBX6" H@r\ 'tWWt뙷ymd*JJ?˳{kU]|fvuQV')Q]KfTWfzõ ??/WvgWjŒvJ;ڽ<5}zִi=7fցa0\Wz*}-l^[%t`>r"6: ?$D UўdjHtA :t!@RDG2R )БsKxև8"E7 :s&,)ΌEIL0i3܏,ƝЪBx,dr¥ p Qpd'w aݩB,+qpW0[Ua[-c[8!au;ŒNDu Œ(>8*Ɛozb62iq͎;ͽuז^_"U;Z 8WT׾2Ϫ;d N( 9*& g4j~)wL-#mZ0bHAg<hQb7M8FcT((YYd3!% ʭ ܖ<ΝD~7}&rr+^MvmZ0\^dM{fׇ 4O ct\=:OA BM:mb cIHx??&ԥ|xc`13`^bdӾfi xrؤy~sV"LgC4+CPͳ cķՇ`s'bb<_xȖ~hZ?}N|A)3yN[Ⳅ"m ZS#% ˨.x6Lދ2gE$k^VL<`^7'@U2B+N%ߋ܇#)S Q420F:ˋ\D' 2kȉ° U -tplc % Jh?G?jFYPfHmh s;\̨O܅H]xV_bIV)Kw$%FC)jn3^lذ)'CnFҙ!2 ,)$ͺ]SW~.;sanzFUCkKY"sqIf=9q).ǛCys ̊1 Lڪ pd I-  ! +ra6YHQaacA.' ~}'*qcIʔ+(bAG}`/=Rɯqq("">.)Lg9ΞWD[#qG sȄ٪vq Vс.Lg}gbYc"~Q|HEJP  ?Iۏ#28,L?)3W"N%T_Zb%\p&ٻ1uQ?DQ1!͊*icKտQ"/ m#3lqBZՠGT-hpH! ciTP3:nbS 7QQ_Pc'MUFXJJ-zIнciw+LŸYC\~} &:ΏЅy9NEb\XJⲵnPaԞEwG Cja/4Cݼ[ y^Kl[m)0o[ ܶƙ:N7@a^@LWELNJ.ee)͂w__6H;A0$.֍Xg%2u t&6HX Dba?4̐Cj AQstvG=q=]l\h@ľz_E i/ ntsކ5Nٶm[vqKضm[㶭qָmk\IָiqZ|mbkXwk\fi G7M5nrmEN=au֤Rdgʝ=ۖ4)l,-oXۛDVcnhRJmۭnvd-KNlMZnF-ڔF)ʚuT4Q߻[ϑuti>*V7޻By6Ҥlc*Z< }_V|Þi1ضR,Gɼj2I aҌdA6¼?)klobyE ۮs|t+ɗ~.O[FAk(y9/endstream endobj 441 0 obj 3100 endobj 446 0 obj <> stream xKGLp`@ $C@u-8į@l ;r+rNv BJDB\@~B qArGU]=};3dOMճVˬautrc6jT]qVSkx]]Igѓ:0|Xbga3wa:2:rb;v,˲ZY=Ϯ\)]ٕV.xy5@Z047*@w֦ } *=߁@;}W'@gyIT}wm&v ոEW:k{;%42"Am'XTmn؎pGhGa,E1Pc7'@ qC/dxՄy>X%{$l_󫶕bTM*,,r?@(Sa2ԃMwdQfA3'3'͇ 4ڲ)-QT>A6^%%~8d(C˔)M`qڢzGONٿ0ZZ>ʆ[cu;E VYXIa  /.ʫؠ%qIVu>8֖q>&÷zPem;ZF?fv|fCa9f+]U  $#+ 3EYfQBܢ/#`Bw}+x&&"fAGbx2VP\ /bEp 6Uà &Wsv(qrZgd(\97Pj~G3|q͡EA@,@c+U 9JVݎw*Y_Ù WYύKɋm{GJDW5"}ZTC#wdCBm=ToÎ#7 "eD6^šC<^o,0l_\x>s/%r@ظ˺c ?6`9ysORZ҂Guieᘩ txIӪĆa3 3m8bųl&M'Hk"="AH?$=Y׀ 8UmQt a@XB<[RIP&,d( fx2|jhΦdxsZT?C֮,Wj4X4.>U/c7:bQ($.9\A--6^YgrBߒnyvlQͪxqw3+Ӿ`V+X| !W*ixA Wb'|[v؜tCs/).Neu#/Vz(V\7@Ch1}U^$ . cKR{? K0vJ(bGH%/:V`EDҔ])eXi̽X:9^J ¤DoI|!5Q]f=x~@|^vD0>ES){(xvR?Ŋ貐2ySZbٶ[d*hѼws;B7\|R;jTOIip &1rorhQ V&O#Hr3\~e.XW0S 7a˃6DxC$Se;K(MA > P=Rd ? c!SꌻcsH)%fu_}ûai0Jvy`.gz7?T%2Nr ?% bƁ(/=w7=[|/e2ýX(QyRNF)߸DC@(uoM:X%W(dbPbNdoZ-){- dk\iOl/"nN_ :boTpб (raeY9b16x]aş%5NC*几\,PRUކG@V̨~#v<źC3D59 JɄorwa&RpAӳj`>drk:dȼӼ-9C"[7>tsv5S]|P 3D/. :U*E `Q*SUuendstream endobj 447 0 obj 3475 endobj 455 0 obj <> stream x۲\EUD-TͰHĻ&Z`$IŜh胠ZeQŃO>PؗzrfN愩pfM{ɋRkۆKOmss듗[WsYpۅaɧ\SAnf!g98<nLmI?_f*^ i"LCnSMYH[E ,>ď-8Kt\X@(:N,Α9EefNš8ss6e!OV;QU+t6/)sNe<-E,s~7p#jPCrB&ϻ)Zܛw4) LJn Cl6-)n:Wq@{KfnqPV*pm1s000|WǁvnUp2:̰,``-FR.k>@wj4W\HViJɭ?X]4:!T'SjBͤC_D@?:' {G"KE.=TrkI!*Pڹ.U:641 !i9*d"wS&7 Ӛ4`-|p>,ec} ~𛉻 `sN͹,{;22 a\7qEr0P]i!8N=ܒs#vLS_A!?Lgk1^s@Od?0} ̱A/&k.k/_gYΗ q7Ow 8."Yu*gx53|pmۄyP~E -BAnsja6*C:$Jt0 cnd PMΓV?Id'9(.)N٠uFy3F(!ξZ t~@"?G)Zi$"Ep2`L-p-~geh^K Wf'XBޖZ&̼XW=pb]Dh. >LxUMxhVlz8?e"f(6]6(L} (?3e-8j^cJpGmX%K< $(U`Z2ȋKBi/ YʋixUhS>GT>+䯊õ|09)=F6Zۙ r .r/:UpȻ; Y.aҦux2 ̢h릥I҅AE v+*Vzys:kpR;| S"QC5?ڴ(kyˈ_:I랍gkQ4{k8w \!JW^ŏo"Tp#Nxq^hil v;I)-`x +4IS0!{L߷xc,Q _N@!s#_HXBO*+WVʊf<cm@5^OHrÆ ݾ0`]) 8v?Rmþ,:geAhŲ^ZHжJU? endstream endobj 456 0 obj 2970 endobj 461 0 obj <> stream xێG!KZ4㮪7$YP6`cGkX' P"G<%滪J亚^tY7@=(ѓʸBC+" )gTT*Ca206Ȣ4 mP3'3'Op4ڊO xը*JyI; q(b E۾ WCgݛ|;4FZ;VKkO)5<֦5MN܆q7Z;k+mJ[֗:h%qIsxj|8n8@C)q è:ŁcCg[Ђq>e> ZpJLyG ǩ;V$Y GYv񞯗e&amMDSlEKGIf:N~[kEZ^I]Y{XUxd~u2vn@: Vv-l/OК mP{ |;?kv{9ـw)v) s?0xa*_ WCX@PI`)AU52^(q.422 PW}ȤqAS& `[Na;}IÄ1{*> 8 Ic|ٕtpQC9 Aiędt*0/'YlF\B)˝3X!\&HV5*YcssDSėjH.(_ݦ"SXA2FeD.ɛ!hg5 ,`)ѽb*smVsq>jƵڀ. h ;1n"l",4| }AYkxse"e0Zb=Z $z\fx cXraˎ(:(bp4qwsPt݇A&O,t>KU2\+J5Vbִ𠝡f De/ϓ%:R,#XWj> UqgQ75&h(u;,oV\jjT@:QI?@e*OjE2x3+ @BB9<8 "$tӲZtU s ]pE3A^ϯncF˟d/m0IKeGFoEWX룺 [U5^߄H?QJ}Eӓ퉙Fxt1+=d{ zA*OŃҋZwx8H/ϕ0(Km^ =ҧRTq o.ė"{5?uN9Q9%@ J%^Qo )2޵.WވpnA~דWQVZI8dNӥ$WfrJ[+:hJ#f+gmQO%F[#U8y|m4]4(4åְJszQ'^ϕpmCI:10Y\>d7 7z!)^6ZM A]e|\յgcj=/~jz62K%KS! V e|E%[ 2Z2!'cO7*":aarƂgvMk)K[Sl d盁3|3G}3xs3fS{=>^vendstream endobj 462 0 obj 3305 endobj 468 0 obj <> stream xێG5 !!6 ͺ.oY(vXk$$Oy~ٮgo{95;dÚ3w>tl}3;{^I؝^߃s>@,EѮ ~AF6L{pÁGOGY\~F?T^aj~ā\7n^@~AO* Q G:<}L7 F >iO9b(̇Q <훹hH'= ax8S~WH,ť &Mxi?<T^Xz306:MVzY&+((ř'(ͶJ[ZTzЊ[%܋ SyXBR B ʡ3^ښ=c΄k{ǾX&Dtov!6>o' m_6?Et؇L%W[`-/c8,÷zu {`` m@Qc0R$͂=Ygul̾_d-L0Q+H2"HM:4Z_F4} ;0㾷3ll4Qnس,5^جMtdvU=AD>-yBB2_@֫[&9L+0 h~Lw ,",ӑn8qg-Q~A1k:"{QΎ7"[c"u(Wâ'z,\<ӻEl8BH9XUvv[1}>y .a%a 7j8[ȍQh܍E ] Do4L}ѿmJ#lebFmqh%s5lEb[V%Mȑ [V2i!D4CjjˎdCJV1Ҟ'MSSKܔHɊ|;Q5K1ErDg } nC|!Ir4\(D`s\TaQdh| 3KҀOQ;j>l ț%ӊzf~$@K}(S!"Hn 5v!!UL^It۞Sd/*8UU0dCiF)i+(^1W'*D%]0Bl/9fUw+QT,]$qrli-*>V _=o!@({ЩO;|XI!seoH )4-IJtF]L{diҥdOSqyiVX:Ϯ ^Q YM(8VDY~qB3Exm}JXl}ՍYIs&,kZin!jH:j4x3Ӑ>j1Ӕj#:RLɳ*] yQ=2Տќe1ɻ QaRI:!NoD/4;&q|t70_w\A?y:H'm*6䨚Xt+JJ_VVۮTQ-eR#Բdx}8W9-oLzrXCFMW c gYׯ꬛ʬvb_vzKlgTߜu->u%5pb]IúJP] XJkdoN<++sx!IF>},JAVsѩ>7,/ն{})4kFy_1{X D“;`B铤6&GHߪZA;uVKfU\"Z~ԇXmZOʟ,<^c9Cm\Є*{HE-NHsn13Yf?WhPH!N{+nM:+wm;{K< &yP.Np:je|˯ƦLG)0IM[5qϹk򐧻(Ù3e!G놅t$b.񼖤vzDAF.i[dZJ˓K<_8rj>4vf)RCG7 li3Xt{y&G|§[{*O2o8"v&,_Zk/c'T1C(}oڙ:ΖL]{ %岒($4h,"op yB_UܧM՘۬`KPIRTC5u1Cr"0+/Vf%eU2G*\L ciZ> stream xIG 0 `qL[sWUv !;1LĒ >pA, w8 $qA^MoyS]U^~[UƪW6&'/6ZU^ܚUWF-) 쟸1yntus֪.UX ]٨άONX~uN횩D&Co2iCo <vՕbDZ*#x3<'p4LBoCx FGJ̐ʭC,v"^5ح[K9A4l3EG&8j &ɓ֤ٱZ:?Jq6i2 <,ܚW/9Ez'Տ8y5>~dk^k8~|8ը"0ЇCw8~+xe`pVtq@o3ɰ^ӕ6}^J0u`"~/]Q8 q:PPt6(Hg+un@CTh$a-n?&0U Q܈ЩNʶWvbJùuʌׁ!Q]hM%u`rJYn<ڍ%0 yx<-d ;!!XHފD3տK+jg{HM6_]DGqN TdYSZ$S1IL6[)kMx{^0'ݵ X *®8_Ovֽ!%&{\B゠E[AN7UZ/!f&MF..'#c23z,ʇc>Ia !QB@x_c.4FElM_FyQto )Xٿ"aޥWxa*Nb܅*Z'ŠP[tqa DnvR!~ǗMWv2*4h AXW~,,6qw9JQ@яGGa $ޅ6a[wZӁA|6 r H%5~=4h0!,Z&riȆ`1hQOf_1.^e9|& A^2H1g g ~ږJU |i  _:ѶsU MI2}fZnAGtӰ~6[? P|ˉbH:,(_t'vz1 θ3p* %bȃTh E6ɵ* hlw9**Դ̪s)ҜH4J/FÁv/]xKb$,eNy 5zKȻD1r&I$>B,ˢPzwzÈ"!Ta 'h l6Իʩ ,$' Mpno1 &B,^IݾbSfx'ɏf_)bO{VC_+<)̈́uDڻ~'v&tjܔ@k?|?Yw(fZniteӔWqo{P6/ʌi_dKZRVJ5`ͅ\_!sgjsQ~ZKO׽Vd2sqb)"JZ;Sn#Z wh/d8 FqI&η0p\$l9 e#7°ޏY~O+f&9•ߊTYbbY:$/ުrfkz%[+9.|> stream x\K\G&DGx؉EbzR6c' fŎ1vd<&3A$ C$GB!_`%+``Uߩ[nϫf1}^U|f * KōWF[#]BtV֨,qkU\7,Ư3,֯hqAjShZ뛣')JFO7֠| C)6i%,ˆ$QC Wrtn)ϗ W#H{A\9+l C(:ҽ,Oj9Ģko؟iKDi[ӌI)Dnt7F;Zl(b{_(j:!JFfmv桬+ CA $ G3ֶ/fEԏ[-gc՘>=`bqYʪ~I.ηG\>2fZքB#mj#p<Z8S! ==e}4~*'ikVֹ&~J0iC/q{}(Z%OeYVVM%ic4~C|u+OA_tͤW1XC H)Ho[|b ~4MMKN "aƬEUK$oRF*\;˳o24G5|ʼn\Rfl$"-v/Y.F;?-k¨ԻQ>?9i{_:SD {@xo#fǖyOVς-y\\VHz+]WJBMib8ѥCdaҶNY-/B1 XDbF!#TWRP?ODkpc(>(g2{xf*u!zj)eq"ᅪ7{Zu/ vC:7aíd ?%4B4K&x^h΅~qچ}E?:ghVD 9=L$ ;Ln&o˅o8B3fz6-69݂n&+5E7v}g|kZۣ*ڃ[eej'2|F+gUT%겞ah/Ȑ; *o'D ܞ2e…^a\ F=x-f_ǦAYV0l7N 1.ҰA ȵO')-νցlk=^X}/QaF4XzǢ"~^cdY?wBC2LRA1LxOJNS2&mO:GN/OhU~ѱ02$ ҃[AI(nZ0dfu"A%uy~15w*QhLS<+`O8qskVhUrƽڰ 1&SVe~NsPp˜ y>Uk*Y5}r:vVdĦuA*X+~M_V9ZqG ke.7Xz)]5.zJ9^6-}t7GEݵH>>e>JdY N˘=]tue+5ǂOX$ѱ0q,bڹjV^cû^) ^=6W}"/a'g Nw'ycendstream endobj 482 0 obj 2741 endobj 487 0 obj <> stream x\͏eE{a@ 4y[us34A$>gDnc"Fcdb0DMرgʕ;{ԫG^=N:[U;pքs:vΨ Ұdh#,}=b,<ع%υg6;5za;qZ9Qlk{Wˑϴ")XDD dj16KbkR߯im$7t=͑Q_CF%v5M),3Uvߍ R0(bjEn i ;fқ@3c?"t2߄\ǤoިDq4M||˦75|:'@I⬆ij;Viߍ7 `F(z `(Ltp: cy%,~! 7jTI];6:]Rl@dRFid/=4:-,5z쌤S>5ʧZiRDeIS> a5}ut_O,˚-][售 dnNoWtm$ozY2L7[TeY2L7)vӇ>&+&m,}OŨ/8:ӱ]Ĺ]z@,҆ɟN8 @^`O` /sEosA?WͿsa~&.B6E) 軠,a3ߢ ci{Q-ŽMlR͛Qɔ>. OCA"BHDr;UH"B< Ff*u}3`g 4O b4OW_pL N`׶ଆe!U Kk+`^l,ttK9|"[-"Q j pL{bY0 +Q1H7wB hb* Ot%Pܱm"fK'k[d+_pn"*& js%EU(5xf1՞U\$FX|*A$W\Cli]HK"&H'"1xǰ~u@{ 0K?!vz/Bt䛷BT$Ά m:}`h@LUA1JGPQ.ړS\ {Nʰd`s[G5{Ye38l  ̺2xs裸,]0oӏ7PlP}Hv?|D&.3 ; c?t u+vfl1(UUfeֶ~r|8z]u`eq# m3c5"rlDޯX rOIm_*s[Fi gU`  ZPzKggUbg\Hy :π89^,̀]C@wCFϛ Ha$0n)K93m^qJc'H5מ{#}P#}N Z!b@Mo's?8 "DsET~ `w44 + %Rt݀ɺ_R3<.W岭r?_6hnS%jj;y/$w!ᤧ!&bbQj-&OW [+dGp^ ~V!h!E6(\ hZ٥ca:4Dg+@ed9m]9׃i(dqW/f=n , l7t*( β K$kOMxWwŸ n/@8&QɢU_w׵S33'Ԋ(u-m RvqVgPϱy!:36Kwx\RjMQףp|<_wr:XLÉD)p8^|D"D{8^݉娞hseh+N KXVc jJN&_WBXe J`񧰕֐5't{ n8 upB5lFkH"3៭7&߰7l | ny}r8m?endstream endobj 488 0 obj 2561 endobj 493 0 obj <> stream x]͏GO l! 81 4鏙;A%aGCdB!rIN "r 9/ H3=Zɞ_UTն(?;;~ZuqL5U!)vݕieU8k˯/~2{ZU~ڦ֑[Y.UvUzu沛5 RPxGJ[j.jXcUHC,VbeRNe]0'Q3%:ZhvPB3k~כ)A|eZY(?σn޺(u&>=ϺUMшh* ?6anpFy)”^A(ŅX"`YX6#p8ϒ5}ɭh0-*w$D B`CeJ\FQ<BM,zjg4ͺ0gڪ]JBuBN!mwo݅0mMqم/^Q25uζ?عQla6 [97 C<7$mdZ ydj]l~4zI?x\Gtj*MyJ+soiI;TGTꐥ zdEnw[ns$2hx"_NҶ3l܃8܉yK{j#y]3!7i dU<> 7iFk&|Hώ+3]tpG[aRr`\j'LmGiD#l {.;4~c=[g#z .Uטo.9iZ?mM hoH!,YB*) kU:Bސ\/uX  Grd@]GJ.eHxicTߘJiZe&Ķܙ&L`G˂&qGnPaOZ,AvbEO?&;RK~ o6\2SeUT5s](&iMK''hz o]J ݟuT׏mp'_#9g#>ary{Vۥ+9Yr)SJb(Wa:{N1UJR/)4]=IZ0=+}|NY%xWow0XHffV0ƝaWKkmP*9m8\'NL9&, GU>Y͔hvexc MI`n cח$N(5J j?j8Oi)M8 7&TB1M*ݬ:MK< 7&,[-R[Lȹ _l&|oo]ӷ.[) T ӷ.ӷ. [fVTٞ*LO[Z9zbbiK{>:~6 G^,KYTSK.o~¿Wonᖻtl+[^3uطC>+Vi[{s4f 7fOkq?@XN'EԷi}5:8N `*ց`/eXgA)Bd D&Ll{@Mt^,CƢGendstream endobj 494 0 obj 2779 endobj 500 0 obj <> stream x[&EUV(vaI|@Tu ]uawe//F Q4P 17-rNu{c:麝{:ۭmV5xmqlxuB⭮'񦺺g ?Wu!xq3wZuzgqU;nM%mY\[/[E~Ae]o]Y#~Zo_F+9JBgmoF T5Z;H YJd* 0|'?68х~T0:Af: cS,̐<Cqd!JDiWyZq{9[`d(CT("!XjP&ٝowvFZXֶ;E ҃v!VZ*Zc_U7%cr؇K&V7l{ 5[q!Zx0rsx+1SpXno)l0Xj/2p]aot\tEe籂B'x 7YқfXO|O)`sp\`PB_ ϭcnӉu{!?;`ɢ{+)w4L,YɆW+ AQk2/p۳WXq'Ǎt.w͕eT}EF=*^֬S2fNٵ1Ex-uQwk4Г4Qj+F:TZ,|~zfըPdPe@^$KH Q3ai`fzwbuWH>Q0mo;ȅ3v+UR|{ca<_"] >$hm]ia ߁ݺn= ()"j$- V;o%N t+E,;4gl6vwkrWRѩ?9$1}i tzӓ.c%˨ R߻_c\>Au̪SW< VdY0œMi({2/r:*M`={KE?@ /,^`c N90s>J~4!aI= aa޹#ZG8Tzfr2 egO>ƱfBo>H3EB<ƒP/(!ulA,t w1CvRqR8t%ChFp5،lO0#SP)߁>=QLy"AŀeڎE1; 2IDZ>= fd6K˫:LFOƺقF/IL.J4xBEտppUtsV$Wb>u7"K*\H^ QEVjH$Y[r(c)!Ϗ'eɎy2ywϫ^Ԭg|&D)y{e.0?>y M{8B5LJ*GUX_EEiDbdZԙHG6(2Ssps)CiЦ )S=sp)g7%Eu8uH$uld)Õ S4/4kg˄(9/2 ɷ(?nNNg^\֞ըIoa{z6! . evkL41$CyЁmBfı(()m5 bX; {{TzpgL"_=XY` ;æYiGO2VBsqŹU:f,C3l-(:y!To.h/DI4Ǥ2b^!:6 EyNoLgm@z=WD۔aTR):ǃjK=M;?yXz 9}h=*5N3*Kٽβ=獞ǚf\8~:T}9+=-uޗJEu[w f.a$:"8o㧫 w3SXک!KkLu!..R+ž+mhhp+Xxc XIr}zS'ި,A9: H%QKyLE]d9> NcOd J \6=D/kf&L1KEq9=`C(_GlHԑ)VmkXjПPoc>^4D%A(4aݗ3 !WӾ 79LyoCF6Qfse(e%ز~R B'%64RA1yf9RS9p I%if[cNO{?0޳fMf`ٸ|f?R,Z-\v ."l"FGC/Sn.n], \3U;LO| jp hy Vw8fJJ=hYB=:ztdG_/ZX c=Q?ЉɋUï(??endstream endobj 501 0 obj 2970 endobj 506 0 obj <> stream x\Y\G&$CAH,PDV@ ؉bP&Nf";( R@l/'W~ UgOmFsOթTU*Mw''ƋONte؅OSxwb?Nޞ{%>G]R$~?wũI! ;f^h3b;y3OϯLZ/HKR.ȾF upT ܉1h*APC/.܊i[Nh$IT/T4lp `TUD.+H9M8xj OD7Қ{3% _& et#z>hAJr0'R|Z15MeH=)="D+ Q:B $u~_9q @gKAy(Sh 1J=RIz$y&N$"rgw jx| nWx/vJ]Y2(?%cNj|u: zXÐMOuжH!9t^10dS fuʏtТTPm;…?Oez1|h'.UAfl8gZ3(MB )D$27'Ⱥ֤?ē"MɗS4ypw3'ucX琱(sל^~+{B<ΐL#N:eaެρˁ`j:W +i+II(㊚$ޠaTbY P%rQ; RbJEK(EPGltbP!ӓX3\: A^=N[XkOt`}={ˡ?s 5&u]rIk6y ӕ" @O#W7*FpPHK>!@=vXLmF%AJZ\AXv+%42945r%Ɓf5/eq=poa8YxFgPt;c"eO@ƸwicQtGiv.;u&uM>F•)cx\CM'y7vwm>ە m逖LkL,ue;fTӨU1:+qh(O"`iō<<=7eM]X4Ksv m=jd_}/}rEYXHmpW_sN_`h'D9B<2lU-mɿS"][q۠Ċ:,ya,)(ɳb7,p]u ڃ7+gJu~yXw`cb1zuqtB;ʍư6kamaf7ægT=V aWBfpNs-O#DPUTN C3ۂ}I+ۂu*<3 l<\#3Qy#*S5jXq oMuid &t`xV & &]: wZ7K_,Y +ЯAC| Z"yxiGT1%w-[ 2i$ߤRoY)+!ŤcI.y^Q/6Ń%?ms6m '27}RnTk6}vli']x 蘒C~zFIQ9-oۙ,)ЇGܴCQv䟉YX^!y$YL7<;IA R 52Dendstream endobj 507 0 obj 2366 endobj 515 0 obj <> stream xMG KDGBlb$icz A/(eHg p@(o)>2 K qDOwUTOϼ}vښmWF.*oGb(uVH)C3z}r*.^?tTx{u83:u΍;nB۪=/*Sv^=E1|v`@أ"@y,³![xpGGy$QOcЕ7<]T@B^vaSlWy ,,2 b:hfF5,q4B'ABfcӨq4A^ȊB:tU1.Ycx2<*ݳUoTgP lj/sOKgP> CaIۖȱ qpʳ [p+7ڙO |1t/xЙ[uI+ q(r6l#8ĀjP&wݿQicLVpŴLPpv. ZTu+sэ85U}9Fָ:YJ`-<.:f< xïbyC5l0" xWw)6[S f;g0 by 3]aC 7- Im.a >zۢ GV Y"0ؿqu쒗!w ݃k @ay£/"g*LG&baT{: 5t 1 \p b_Z 1tA<̼l\+!gF]Q'Y:ņSl|Ʊye"*xEPo:[eq3}lLCP3u |vf%Z+͖A@h'A_>Lt콰?r&~ Bi:AE8FQOGu2!. M.r̖D.)=>g?V${QObD6EpjZc!]BAF[4ov'HѺ[jJRXH"<]=ivYhXŝ$zLS9^ѓV _؜5UZ8 w6YJh8XcD˨cd KR ^ĥUš_U1L.X׷D/N7= m\m5>G-r'A\Ľ/M6g eҐq'QA߃d.{gVdb* D oԦz <ƾW_@ FF s ]=/b&o7S[ Z4`/|PUU _".Q$pʐJnˆBXlyUH0ѫ[AˎNYu҉K[D\&=C4ClztVq3̥.Dޱۙ41 CZԢE9%[] a5L%RgNʥ\?3&I~Gvɶ;%ض=lkIpF'T?qUP-Eg* "LZ%6C~ eٸˁ&k)X >vSamg˥(iTSPNX3OK&h>1,He}g8[smٝ'$=O5Wu:xi*R%gjO|T`qj"R:G^I 7M*VͽiHi&t9;*q/)z~Rl1HHW05CKtLPMB;NB L0ٟBȜ-:zi_~d&m]gPJK"HW\$W[-u8U6ǶJ1])'ֿZY, ¬dkf.Fxib݆7nۉh9,'$6f1ݸqM!vf.q6wT7G+ut.:7ףՓ]؜oNӣ*e\elЇԼ\^7; Gy^ g쥰+|^ 93F5>cw@Q ,D<8Uu:49 iC9>-P䀣`e0ͨf[ L=>Kp$\TL\WDoRMSub'}# cgTIU#%J>Pe+F@IaBvՔ4` <m;j Ǭ6ІEi&k65V)^ul4e(\Ǵ%@`Pr.k!Uz;,wX7:,r_Vx<!CyA؁ ߞDD_\Dc\}@LzBpD&D"u^x{EpEҶҚ\ M.t2LܾdM0&Xc D2~;m Z[VTK̓o\n+[5mzvU}CuFӒnU%ް*f~i7tMӰߋi6~EWbdn endstream endobj 516 0 obj 3253 endobj 523 0 obj <> stream x˲7ab:HѬv$o8;ع!aސ@(* {W TGFyܹSYZݚ]/ukr*UqDT(e]ld4x~ⅉU\8ܺnp7Vqfsrtkwju3Ӆ3UlnM6oL*]6bZ:um@N, ˵}ځT tu{".FU>׵.oRSKKtx|5*htF}+  'b)jA2S3XXhtCma! 5e!<:J*^!B5tXnֺxJT#C[:#p VO6幗F$ NL'al̑!k p(%5 F}"7|ځFu$ K* Xdh"RD̿ BJ04Z:ЉFܜ"N=/`^;p  I{Cc~ sef6@/`tyxTF$W>$X4OdQdVhe1Eq ® Fq f CdWK.)/KK` `nW5+``"v*Yd+*ZPqCf{a{bM@ mN| ޘ"9muCZ%MX1GL̀FI*dBE m7a`Z8lX[~z ] L(!BL芭&bKI@M|Q2N.'e\Sm$R(jf%{%SN6׼վQ/h{ko65A*X?e1kjUF)c@ g*+<'^$Ux,;$>D\ "I9gOttQ;m_2C)EǬPYVbrYeX :&eB52!9\dQ pG հ~e8mo/kשL#7Kq@,r狘ɜ-W ëeah ^x e댚[$ >l,B<0/1i=? :EʙD4E]W jM+PH14(8*xgv&[Q>K \pFp+ A,?ЈW`fU(0Px @brНXC!deRQ$1 ǘ^x5B{igY $$LDQ4pb;d;bg_,7En'7Mt?0#h)gLp[p!\0+[/:.Ƕ M*ڮOr?DY8Y,f-d)-e6G^a1d6i whv^%*'ya(ɛ7ĭ0gX[~Xd3A$k8;{(HD0Uگ6nV:um~ <6kq%bg kvZ1 3 [=qƩij طD8hUMp%:Bt,r/w F(m9ɡȵ=D]# YZƓ4v `ty`;$6A0Gvˬkvfk&{CӠWwY؎Z-S #RԐ2- ugӄŤ/KȮH T4k.z8eud^X:;, BHD5}"]TT_a`V9r0yqAв*MM7o$含ڃZ_ #-85UJ1)Ǯj9>5U^)\tC'}9*pUnWqTB%vY;6;g먇FFin:BŕHSža+\?q K(Hzŵ"wϨ )QWp%,,W>3<2,i`W(X髹$ơPݳm-}I9zl9qȆKձ,Mh9nb9 2\[$?P=FAՆx(D _d QWR~OiȢ TX4Ù`% Ut/r59 Ey_v]viZqC.6oslv}L-Igr$r f /Yu9I9nw:8DOqM!ym~!2RĂdV} {H%ɒi!QU7:@de44tߡ,?4zr/DLEm/80WUx*kzvB'eV(nIJ1Ix)c&ʆ`&;TpgvWф!>f' :;yeǡ(5tb40tM:[<@=نiX& rIU׉CˈN=~B3v'+> stream xێ$7A!$C@I.ː C `hYP-!|-9.g{)ۧ]/Vy*ځ5`i݋PK<8v0hIeD("1 (Y[HCa1nO,Dqid ajv|ʮ+)/; xA6j< U R?MLtaN Brs-P ~FdanHF)Aq(Y9~ll-:ëDUy҂Z2%eXZe(:_? LwB8U*QCrHɷ oc|uiG}{c0F>hob!d4ŃW'U`^2 oW[h* 0? Q^4`amRͲ8@[Uo@'sR) t kۙJشv"d=B?,C˳|[ע>@#\nojs (.Q"tL}/ZTtV }̻n)Ki#=* *80d ކ0 PH>ISm23~.ZC"L")© 4N)$v11 +Q햄 .$BGkӪACB\!6 YT.)jQKf^^fՒ95W-4m5 vNee +ָ]Mto#ÿij_n|ӻV}oj8|4}ʝ /Bɼ`Ǜ~ I䋘 OC%a!r(hwԁ$ywQaם@ k@TkoGV10p897] $ȞF> ZK J`J]AB`zpy 'Y{#DRH$,03NH( Q!@֏Y(+,Acʐ'oH 둪=  "{q5}2sϑ'AT vP 'W,#'^':[y ~Q ,vPj mT嫠LpI},Gd)w.3{xfշǵ3`~͌PG0RK%R8;w'w|0~ |ޔZw8_َ4=Gg[^>yT/5ȅ`F!M+xiV…HMUFUyC rWBˠ-h\v:YMW]_ \Yu.gog9[h{fl-_lrGEXF:o,ڬ_O,'P@4+qٗSu/eXT9 `UbL5z@Z wϺ1ޝ9:j5Gv[UIϜV;yA ˵ߣFێŘ3)FBHXne_e61uGwxO Vf;;Ө%E6NynW\ )4/zT8=tP~rO?2Wb1wKra4q)C"v89t^~wIcTOWe`2s`g+GM?V] ކ%iJ6+4S#_*BՔ=s.߮Y^I__a^j֦9uRg#QȺI(Q)tczOjc# t$tØpIu~9O.Tej1a׫ F,k*ݱ|z !$kQK7MEAhm"])+wcFE״Xt%1XG`iTKxeZR}ҩS"iKy|LTԍn،׵Ӕx0sŪ˖ìlW/j*b|2ꦜWod["K݁fQqNwdK &,) ͬz.TZ7]̠%#/[:} _5NvAW_zW( bKY5]f^~a͙vB76#*s7Xl`5g&,s?X`IϜ.d?Xt[{?Rڎ~ &q}ZSdx;٧Oh2/`EDy]ZOl]ZKKkCSޘArVnʍZCQ6):f\̭ZU+j ץ37su<]>s֧Ŕ>қmӪXݧQܧeܧ} &^ŚWUV+s[UnʭZUk~8jVܪ̹UBjf!#O)S=+5uEɅJוX6tB}}])X}]׵.{lendstream endobj 530 0 obj 3286 endobj 535 0 obj <> stream xٮG\Id63x!s < $@D Q, ;Tt̙GSgk[EŊLN]P.>5UYpY;SyYܘ(W'/7'n353 +;ɩ Vl_SAz)R}qj 'O@^L7,vòGܨ( 8pӂJãGYcnF?>]%ѺySLE/FmnATkDя"RP-r L Pb-=?Fxf>4BWSYa}B[lx8@a-_&t~/`0| s8[M%yDc˖X'4[&z,\8md&$1}xƻYBpؚ\n1oJW e-o DHfnb`v?yy!fԸ'8(l0!?2$K;C  yްTVfe9 `T F[3&a'Q LE"*c*tùoABafsխ'I`kJ Q3H,A̅>=B(-Cf| [R{qwT }xkTeB.Պ8%$T B2/}f+=UЄЉlk$j`GeK-]6i.V[üTتc_ VChپJY#s3ب_xPnƕp?c]LnN*4[@it|Mߩ <~`T^*/R%"ća7(:(r~$/6L;( %.@;@e~"ye;bNj .]n }BˀuMm3s@:2ʼ2t~LQvX?l0o⾃&b.6܋ -hׄ]yVSAc8CRhTSm۫Zmq)JOd #M)T_/˰A;ޕB7A=t,sx7B/,a3` M߂| ey6^N;DAhUV&z-eݲ)@o?*ѻ2lQ`P"5Et :XdNwΉD8ArpN e]oM݆H{{aoԹo֜NX&k"orDPe4ױ..gɆc1J)Ā`8b#-c׷SlAo%&=>/cX{hПbmu8:H-CzUZ*/O\AbTq)@I;)"F8Q UOeA CCP[PqÜ{RD|Uy[MߝW?ڣz*QH{¢ gYZlb*ɲYU,h0D#]b^g%S⃆5irag`UNrDB%({:6_Y&',m6bKf,g%j.Ղ$: {եa_uSZSy¨{~1jwsDHFdY1g*ÇFMzt/8u6L%0׮ W3lMYz8 ?Mpue(zEW5 [9 UBOj i?OZ%H3\ZD3 Ͱp$DlHEti~T\7 aS7Kqvٓ:uOQ M}{”p )%U{ҎuO=aJ87HXa!蟾 .؀ŔlR i2m'1H{yǤ2, 3J08=fv[/Ew'h<O"g|]1Gv5_lm}T%?ȲѻcA*rw-b×u@S1agfZ;or<߸lQPaQa^c+#J,Kn)ᵭlx8_"-A 1AF(7(I]EIf*O3\/KeB%'v6cbB99w_JuG-D$!\ zrtR/}OPG}LnC[cT}@/ I>(FcbUB.R Lrrc}4͎onHun]aF|T*{nkJendstream endobj 536 0 obj 3584 endobj 543 0 obj <> stream xˎ\GLHHB ΃`z|u%~0$ Q9l`,b ^`ǒԭS]=ݾ3m_dzw:ug7YU3JkhK]mO - JG#Ĥ YcG}odN A2ayU5u'x4|:!YZ< L%T#wx!pV B K+P>CadGalJEd&P99i~ lh+>QZ*U|҃V:^%eXP2H}A'>G_5jW6詭WDeX{sX&eNm:q7z;+-saTW_\664%qIsmSeq>fo%=^)uڏTiU=EMmf<P.=gKSQuˆ2BS Q#T(8&:UɆhgUb!hk>?{KG< ۟l dHOdE?K-i_gpުG 㖉# qh˒f0(`j@tqwdT~\%86&QMXQr+O̡q 1a>ў7h2ȤS.f}e[hy\yR:Eq*5I,0GlSiB'~3B;oJ[q{D)B%no/^hfeN+L0)i<(9Z|b(j(hʸe!f덅۫Ɂǎ"$l#>3,B&x_5a87؅R$zB.ݓb95Ng`vgM5l i1 k g<wg=M"9(@:$و;` ~Z_hWe^e` N;sѳQ_"E^F@u@dr|Lܔ=vm'7 uGq>Z>f OA\ p v XWs@~ 8.*.&MEq-.E!W!ܚ[I&v@$bR^Pq膽gnӴ~W]S w_Υj`yQW_Sa6{2-.z, tua`[q?_#>':zS$|CD @?]7?T:AT#'^"ށ-272&D ̍Dz*dZd(w"6q@hN16A;dD 'fuL3Ps.NOqX4. 9mj˽UAQj3i%vΘp@0:; ӄK̛-{Z5![ARy='4>Dp IHuwzz-Yv tiN9C-SG2&ZxsEcYI;sLȬ,Dfnh-9eřɒDYK5Ǽc`|/#QE[mOL}IodE;Ɇ̍ryvjr8.sS2>֓dq2_=R9@:@i5OiV5p / TlYbt< { YTLåfSx~]6[h\ pnY %rfH[DL7k:Tԓ8 hI4([;F#gb9u<\JLRbR$JDtt KD2?΋$̚qiݧ"^% A`OpQH%X"NaHD5D__C[M$ӑuM2ƉN$LF|J&Qb9յ)V%ɄdS+z f†Jkղ.i#AxG[=b+y:@rgFQ;!z(=M6$09WBl_}7wEN N%Kj Ս><뼂0p/Qhiy D/ZNDQ4l.9gKl[Em54KW"D.^˱y?4hEP!^ u%7\40my Rf~:Lѱo JLO'{MMg C$`q8"5=;^h{ɉS,v^yEb2Qvb订 rQg@+Hpb>&w ;/c5fF?6ME Y_e)͂$mJR7$G o*Do cLfL?s*]Bpa'cT56-pG9SAh7tƭ N"lu}# !=tܟrcnoiT2h++TY1oZJ@1bkIJeNٵ{5.MJmJ z]Mw".К в Q3yE="/=e+V=y^~17'B1Z5V]"}ghT6!2[V70ENҡ:Hҁ/qwNq,:"2 z+ڨN6]2,K:%ְh,Ks tt,#n,Kj,0e|cߥo,2x)r?chendstream endobj 544 0 obj 3527 endobj 549 0 obj <> stream x[%EQP0rs鞙pٕT~]<`BHLIo?jW-ggnd%OOTUWUWUWTkVjosRٗv.TuYp{SxY\ܑw~HŽ8w|S{=;w]bwe>TZE%ֲ۹C_}nn ݧw6yyinnQGloUg?jZ.Xk'LS*x(}NTB3/yIu})*iXUIpe;Vn/N U"P4%JL:J0Mb6o YhCGGHb7ɖEW+Qv /OîuҴ~VaڟomToFs;8n!p(B ya/m0^tYHZ24oơ0s2sv!hW^*U>gz<-)qNdE(R"hx_Pmgvw.%+Vo棬V~qz-v-r,U0:{;Nyvpmͦv|M֚=ּbT+͙]dۿIs4sZԲZDԵ0UtPNjp,b^t0PuQP@P*3E긧 hV ʿfo\eՔ t;u73@1݃{B0޵˰`i$$鳏yqսXZxn}9M)";J"EB>gI񒑵},ƽ~14 B6H=X0*KzX%5(4 vB.y:0iPyce5k6$.eO$%kBYU= &sTUI%y׼h$_+$;h8A;`g!c]`9ro 3 ;TR%n~[k"M;+=]# ȭh\9o_C_>Â!R* /[Vu@\1mR!.wSODKܤW!I\~ƋW1kFQWFc`ʉ`?B\ Tl1r"7j.ƆΟr z}⣳hC#pJ'{_ZWB࠳")j {p H :@$`e›V}KWC-OE۩16&)>ਜfo7Sde!|ݡI@aet'%FU%27Gu~YzsMh;MO庱EHJ;H1Wȅߔ:\qt+/U')#d6F5jtX %mdj!ohxq56m7M E6;q'HV!B[av gZ꺂[zŷ<Lz CxĶIe0>xȦpΟgId @U5t>b`jhKb xCN`907C*ǰ\-U x+וumJJJ-0Kknc4ѽntR: 5AY˵iRscdjе߆F(?F(MX-gz<34Ibs/QNR"QW&m9dc`2:xD6 ŀy2EUx}f>9֏궧}rl!}Z_ppO'N&Eu#12eSKN^i,~cD0}4 bFΕֆژAmxD} p}Ծ;鳏*y }b#kZB71[gch~q,nTԠWTZ⣎JȚͰܨK4OlBѭ;`r^9#-V59nf_=CmF5m`Lٰl$:'~ǽ P[&N&NExꁃd!C뾌f22~Onj؜ żbO=\ sKۺshel6p/mD'\(GOp Nq fEm%~-{4U6w@Y蚤9oIQ94˓|jVEs9 yCq3u` f_G`dË jiR_`"Ϟ2JCG'=`GSuБx2H.Xqa)Unx?gI]s_p4;<0%vA : bwX.6<|&Q^!A^=r?!dBIRB ݜ u$b8I34R(.YNy䎤00*G7$E“nb_ j潲-w40}ඵ連AnZ 2 >aYcKǥd> GesS;Љ?;UeI8A'!) ۑ;A(KmWo51)Rߖ6Y4kuUpgIS^K:88ϑge~2B|}d,۶kn)} o.(_`&|M-\r`M#sڮhXʒoC8T%`%u ZdžŠaiE1tygyŤR*VLǿ@XnVmQ)Zhl UAMY@ݹvEW|}eH0;uŃኈe@+:nl$u vɨ :r`NBH@^(O7gϗȖ%5 0确}}V=ީL\ε/$CK>tx˰/7r\)kJpK2Z!͂KlOZFIHisY _vD۝>(kLơIw R f7=# b{v:rQN^ȳ75^KH}Fҏ!4%qo} `*Kc~Y @Ci6)Rʬ33b;{r*un8xa YGP.{K1`m"LKwfb~IÕ'N\|=V$@R*5)Uex6.è'cl"4z&+%@KYdNbD$0#aHɦ,e2dGD"[LչuZO g.fgUU򽦕Q/vMxst^O\w%6tpRϠȞF[eRŠu~qnVVs5VS.\YS`7eS4;=Oa.|1O;n垘A)肦VLV,f=#@c#Df@ӀPʐTaD(F6Ԧ)JͺdܥqR *rlMIQze{MNPٰϭAj{ Цa0rDڲՄk͕/O<=d,2T7KO޹F1Aڱ26Hyg5<4SتzO;jgWi~GG#RXџPeU0؆&/Ŏ0g#L^J #tYNyP!هA >}U  8dӛ6WaD?v qhsu-Z+ۏxl,d`L >k\C 6F֗E&Lc 6-M;}:&rg5U)}&Q1-endstream endobj 550 0 obj 4729 endobj 558 0 obj <> stream x]$EUV\d4jĠf.]U첀шKP1? E?0>>;|8NuuL߹a;vUUS}X{(?KUϽ:;Uuq`-/gR6icŕxAsz~OgwWbwn~Tuؓ|fřj gfw]gA^̹O5>Oµ}ZUƂ' ([hzm@ t< ئuQ9M1ѕ͈ƍ]z>NQtO˒ErPf{fW!&,a! 6ttTmqCfsZ^TnSv\YE1^n@Bx}k]( U t'qYYS> ʔ ^tt3(3'#?:To;**Wq jv<-)qNfwE,CTu[ cƉgF D?w8vڼh&DF16*e;F*^jym-&[ɠ_VhqzYBp@K?KW5_W{(P Lch*[ cy67]VЩKղ뀙>Fz ` %ׁ/Bo[4 L"0Ze_0esgVyUk ޑ۷9~]sv~4Y,)p#$ sx5\lYWJ+Që*wbtNPF߲pCKW\/% '_o"Ȱhz|/Z 7Й9-+gj;tO~hKA8Հ8K `6P &]STݢ{ L4!@&ge<C*Ko!!>OGrY;U;G54Ycک+o! ❐U0?Y0MppTm.UDE%x EB}Z!"dQ??/$5(pq ؇N9r~߄PҷLQGQj7lN+`MĝНޠk7`aqskvnVîܽm*7,.~m.$JDn)݁! [- OnHa? B "aD2j W-9 hF\(: }z,2c1/}):<y6)(£:< d$"2|B_EcnhW.4@$Ctr.PkDD]kD} Fw /^LO« J ")Ⴗ*ڶ$8 䐀Gcieв b#mfqÏ*Jٹ7ӘRVû,[RQ4mAd6`TɒyvtGRwa~>)c7 W ]0gW{diބsKU 6-W4l%SD&G^|V~T+cY{^P4^4{wls!4bB:ضUd4,GU_P={c/jҕ4y!XmroT =lȧvN٪ŴUIFЉDx=XP;6N#N2) Gv9on {=ǿKKmgPMUfZjCef/4'*3Q@*pq%وTsSv Kg 5)HEsxT!/ +O ٢9֐1&K߻ dG?5Tɓzw*o&w,*dciw6 UF;*$%HDǕ 'Q&O|h,o[HK:MF`RMˍ@bftF--D+A`PѮk`/%e1#D'h Zbȫyu8Iz> 2wG;/d tB5^?eJ4;I|'+B_ֵ^FBo0x?14ڌqܬw֡g\om|:n>࿐;nwYY_n]eWa{t-nxfw&o8S^n@]Ns`w:uNyw:ulӸFX+2N3QsVDQ.clA|/օFW ,]I" ]I>)>}fR\ɫuېR>P?S3fk*j]>mQVRZ ޫ@cJ:z_'9+y/"U@r۲4uq t䚫ZlnJ7Cw߳ h''6ъ7zUz쯛qaꬓ#Lw̹Y'3!9q7uJ> stream xIG8 $^rH@3(!$8ǟs8"dq GPD ,Bĝ?#gjy^Mu|d^z]U=cU/O=#US`ҴuŅ/ex]]HoU=iqe; {sUڻ 8Et,A(:V0 Nؔ"2d&OP99i> 6h+TFU߃V*^%eq 2ǡe*&!X*P:{/ac 4!2wn CQ%5ǭZ L%i o8@Cx  blqYaWJY7޾<:Rwg< TPq[P~X ϝ0޴MD- VD8qx*h=\ f)rq̿`.t 8@1'CFRit'ho7yʞtrxOTڻSwCG, JC^'PvOɧJ;CgEk**l5,2FXSĽ$ M,|XoIo=FNST tdFelGۺܛliVJoc{JgnD&kA[fv*%AXV&n?C*B7KrLR]w@d$T |36X12):.yqtO $։zfΖerjK;bCf[\謖C!=yK/)VWֵnG˼d Pn?^.υN:KS^ȋ'Q,&8͐+b0Ǖ^Ő fVuךsY1Ri^O,H_J[Mי03W{^[ |MzsCm:MMf&+<<ǻdn0~!f@dhH ׯIƲP[Pk8c=I$1]FKikX6[64zD΄\]IsGDFr .:Τ{AP>ӒnцPPQ@ >  عx}xrIo\Xx7 P$[z{*=LJW:K[Rj0^+h~h/A#foպO%Vڇ TήGLB!DVgn]ib`JeC/E++y$SƌVgơȒ1PL*UV U]S1v󍖩HDS֘T”sCL@oeԷ_ǂr +COwk\.5.c ׮ոZX2ָD 5.cXҫYc X2ָ5.'$c˜k\ve) `.m$X2b_ݙ/Ll+1G_Sh(xd>5w3},91Knбtd,zوw^kX2E/cX2,kcXrE/Cу+bo+bBXzi6Ĭg)q//?YDYM!hiz ^;_" ]ɗ+LRc\DpZI/<1.)IX2֟՟p%#(xdz,XÕl"uZߓhvTeŏŕ?2V?(BrmƊTpf ŊθtEHGD"0ۛ~8n!UJ5x~{QW{lwSxhgҙ#3~l K0tX'?H(S2rjckGD>wX1I~/[PVj2qDZІ"#29YŷZI@E YE~1x{gG髽c%=Ű!OTRwIÞ ohS7Uz(6]X>bq Gendstream endobj 572 0 obj 3458 endobj 578 0 obj <> stream x=˲-IUt8bhs4}٧+*+DgaD4 !s :op'\++ת{Ft6iivSsӵӁwC RMp)Nꗗ6d[37.S3'2Ch+4}mܜ2xk(c?ih׃O˱Kky, f4YW}*ǯⵏy|Cy ZSq?,| =&=}Wl&4?CܑǯA?^*ΫEPK{I7`K,Cwa!9u :;?}zua֓;OxwuW<-'0!N':ҧ>~&Dz ;MlnQSxZ?Ckrf8xSNpK^!du:6g=WHl]pOg/ .@ZZ %89gpe?"t_r`EYDv9V6,TN04_| d@aOW"Zy;Y!"-39p5ڞ| GĹ4 bb1%H 6 Qr'ߐa.UMGJin~<9QvrS$DCˈd2#}n 4fr*s6 ¨z[H3jc'c#VCkB$ wd\\}s(W6@-`叅#*C\eO8Ű  `:o)mX{ā4⹾Hޟr>T?W  ET #|wfx Ļo&pr܂t`-ɶ/maWata,PS$a m;vvNJ Yg:.MI.d__}N aLLm99c79`t{6Ivx53u^g/n KBci^4-s)vU ݢGT>#IPWƶuE1<]%Iig#礉@l2zY M iμ b՜Mqmۓ%{!yQ\φ(zI;KZZPHCpЌ>!K`Fz&&ZZA>(*9]&x@Ked.+)L? @ƖD*gA*fPI?*MG PA Z1ˢ&8R`) 7CfԘ?Fg,<5с[~>_gx'~jv3 钠߉3Z[ͧvˈ^NAb)ra fbpk|*- Ebd976[b"XNZ2H"ҡ`].c 5ѧE-[ w#!vg?s'h϶`5_u^iFJ"yMn\?;Zm'=y'\qĦº6{L:##;fKI,bQ( 5籠7ڹd'cמH{L< <7&Z2+—٭3\DE_\@VXa^ oh>:3k:%1g:IbCTF=9tgEN|&݄b0WTc% _a0bDY&/8q5ByvSi(x% 4Njd?! GlsgaZ+'Q2mQ3p_p=#QT&i2xC ˢl;}8X9g#x4LG%:D)1Rvq9sa:/dP[Yn8]5E>@:fR` Oȷj=g0M]O@NdBRhig 4w'0Yr0^--zot1e?^#^,MӲ#}~!bUaE ]iR$~GZy].&jP&<kROrXMIqQrpC]AЬ KԴli78.Nx̪/195m]CM9#(˸&aN0-Fq79h<]fD^_HmW /9x0I[R&źuc gD/E#{Pg#gc#Z^IXȮњ s}RIETM2p 5)y$HĪY9||\IVqP,FAapn=S4rWt, .Ebۮbb=:H[GgmY3^_qkKcg}Y75?? |lkrOG,L/E7DN;q P!eךiL+Nn1,y$(<#[5ZJA)UI o*MȘYJOބX3!ӏÉ$ʒFgErQ(rS^_:+$ dF푪c$?G~1T\{,+Ib?y)BH Hk-g GĈê,Tp@4 \lq$<]ZP Z !VjGϭ gD2f$6cUz6IzH <$-` QqofmLk^32-c;fz B5XˡJ*ԋH++oe; e4P~ ,%3f++ʯ;5C4&eJ͏"y,hM;Z1u >`dMܳ~Fl M)\XlLeV#%.;yL[b#*$ uI$2#kH!mnx2!k> ;VwLD*9ܨiz,2ѹZLS~$AXO2'*iQ3}wuxKWVptszÜKyG`uao[v *%Cry#J)r 5\bvR6*js);zIm@%䎛Feݩ# JafSbT" -H^rˍKO~f 8.fj#e=/ʹ_OQ59zOji֋r_M0nBTXK&5p/DD;n.=؝`:^jZXKoԨ{/DApOK +z;<Mk<KBqX+^GH/qtnfo'_efD=Azm,,nn>XeF6 IK&ŜED!jyh=a5 А!(Mk\_vVxhCtZR..˶eBC5 `\]B$E0#ke 7˜`XU̷ x\TʹD]PZXazjaf{Yy F3hYkMM? kwK”]F'd zz򯇵!lD~~nʋ{;j(. `.|V3%a^0ΜOd;Ԋ%i,ٿ7it\qND[vcz\߇?GRBxx"ɘg/DQ6mÒ9e,Ѳ+<@@$[/ JI} n&bHc<@Dg rIl! Ro.pueɨG,m[*l}I,'R_EfJ~s&894"oΕ[gh8t9с{YtňǟOaG_I\L ^؞^Sx#ۇAq,5qm)4Z%>n%lX &cSEDžri8{xr, BY'3pQQhqPESfF#ה;jwZ, hgP21G="i$?aV9kB6 \ OkDeVEip~/jY殉^PYPmKхajBUKnD6 rk gДDDѕbhc8ʕ#3t@(ȈY0(vkq8a[ pa\5y'1^V(*ペ~nݢT@ƒZ$1gJ]Ċ$ח[:B5[D5bJT%F5VG*5P?rendstream endobj 579 0 obj 5504 endobj 4 0 obj <> /Contents 5 0 R >> endobj 73 0 obj <> /Contents 74 0 R >> endobj 83 0 obj <> /Contents 84 0 R >> endobj 100 0 obj <> /Contents 101 0 R >> endobj 183 0 obj <> /Contents 184 0 R >> endobj 223 0 obj <> /Contents 224 0 R >> endobj 244 0 obj <> /Contents 245 0 R >> endobj 251 0 obj <> /Contents 252 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 266 0 obj <> /Contents 267 0 R >> endobj 276 0 obj <> /Contents 277 0 R >> endobj 284 0 obj <> /Contents 285 0 R >> endobj 297 0 obj <> /Contents 298 0 R >> endobj 306 0 obj <> /Contents 307 0 R >> endobj 315 0 obj <> /Contents 316 0 R >> endobj 323 0 obj <> /Contents 324 0 R >> endobj 334 0 obj <> /Contents 335 0 R >> endobj 340 0 obj <> /Contents 341 0 R >> endobj 355 0 obj <> /Contents 356 0 R >> endobj 362 0 obj <> /Contents 363 0 R >> endobj 372 0 obj <> /Contents 373 0 R >> endobj 378 0 obj <> /Contents 379 0 R >> endobj 386 0 obj <> /Contents 387 0 R >> endobj 398 0 obj <> /Contents 399 0 R >> endobj 408 0 obj <> /Contents 409 0 R >> endobj 414 0 obj <> /Contents 415 0 R >> endobj 421 0 obj <> /Contents 422 0 R >> endobj 427 0 obj <> /Contents 428 0 R >> endobj 439 0 obj <> /Contents 440 0 R >> endobj 445 0 obj <> /Contents 446 0 R >> endobj 454 0 obj <> /Contents 455 0 R >> endobj 460 0 obj <> /Contents 461 0 R >> endobj 467 0 obj <> /Contents 468 0 R >> endobj 473 0 obj <> /Contents 474 0 R >> endobj 480 0 obj <> /Contents 481 0 R >> endobj 486 0 obj <> /Contents 487 0 R >> endobj 492 0 obj <> /Contents 493 0 R >> endobj 499 0 obj <> /Contents 500 0 R >> endobj 505 0 obj <> /Contents 506 0 R >> endobj 514 0 obj <> /Contents 515 0 R >> endobj 522 0 obj <> /Contents 523 0 R >> endobj 528 0 obj <> /Contents 529 0 R >> endobj 534 0 obj <> /Contents 535 0 R >> endobj 542 0 obj <> /Contents 543 0 R >> endobj 548 0 obj <> /Contents 549 0 R >> endobj 557 0 obj <> /Contents 558 0 R >> endobj 570 0 obj <> /Contents 571 0 R >> endobj 577 0 obj <> /Contents 578 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 73 0 R 83 0 R 100 0 R 183 0 R 223 0 R 244 0 R 251 0 R 260 0 R 266 0 R 276 0 R 284 0 R 297 0 R 306 0 R 315 0 R 323 0 R 334 0 R 340 0 R 355 0 R 362 0 R 372 0 R 378 0 R 386 0 R 398 0 R 408 0 R 414 0 R 421 0 R 427 0 R 439 0 R 445 0 R 454 0 R 460 0 R 467 0 R 473 0 R 480 0 R 486 0 R 492 0 R 499 0 R 505 0 R 514 0 R 522 0 R 528 0 R 534 0 R 542 0 R 548 0 R 557 0 R 570 0 R 577 0 R ] /Count 48 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 11 0 obj <>stream 0 0 0 0 64 70 d1 64 0 0 70 0 0 cm BI /IM true /W 64 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0eD EI endstream endobj 12 0 obj <>stream 0 0 0 0 57 52 d1 57 0 0 52 0 0 cm BI /IM true /W 57 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3d2I>OY8 z_A EI endstream endobj 13 0 obj <>stream 0 0 0 0 49 54 d1 49 0 0 54 0 0 cm BI /IM true /W 49 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.xOA ޗ?ޓ?|@ed?_Km-av!ma0d6|@ EI endstream endobj 14 0 obj <>stream 0 0 0 0 47 74 d1 47 0 0 74 0 0 cm BI /IM true /W 47 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@h2@x 7O]?w_57 k d09c8p>@0{{r_^.a.+X0F@@@ EI endstream endobj 15 0 obj <>stream 0 0 0 0 37 72 d1 37 0 0 72 0 0 cm BI /IM true /W 37 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}|>x EI endstream endobj 16 0 obj <>stream 0 0 0 0 90 70 d1 90 0 0 70 0 0 cm BI /IM true /W 90 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ON p  OOW@w]  EI endstream endobj 17 0 obj <>stream 0 0 0 0 51 54 d1 51 0 0 54 0 0 cm BI /IM true /W 51 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0̐.OC:I}'MWo~#v=>Ay *Xv]ip.+0a`8 EI endstream endobj 18 0 obj <>stream 0 0 0 0 43 52 d1 43 0 0 52 0 0 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Rp10:p&h EI endstream endobj 19 0 obj <>stream 0 0 0 0 46 72 d1 46 0 0 72 0 0 cm BI /IM true /W 46 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID 2}o5{{}Pv]iv0 %aa`d@ EI endstream endobj 20 0 obj <>stream 0 0 0 0 49 74 d1 49 0 0 74 0 0 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l^ oAoo&վook_zm/vKa+kk ,0Y  EI endstream endobj 21 0 obj <>stream 0 0 0 0 49 74 d1 49 0 0 74 0 0 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@1"!| A~~~ 8?A'AzOׯK:_K0Kb CD EI endstream endobj 22 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/IT&oo? EI endstream endobj 23 0 obj <>stream 0 0 0 0 14 44 d1 14 0 0 44 0 0 cm BI /IM true /W 14 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &qO^~/|rj[ EI endstream endobj 24 0 obj <>stream 0 0 0 0 57 70 d1 57 0 0 70 0 0 cm BI /IM true /W 57 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID aMD' oA8>~^+qPA@@ EI endstream endobj 25 0 obj <>stream 0 0 0 0 67 70 d1 67 0 0 70 0 0 cm BI /IM true /W 67 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID %!KA@8pBq 'o~oo/~}/K𗄼 N"(PRR` EI endstream endobj 26 0 obj <>stream 0 0 0 -73 57 0 d1 57 0 0 73 0 -73 cm BI /IM true /W 57 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID *j)8l']4 axk   EI endstream endobj 27 0 obj <>stream 0 0 0 0 36 68 d1 36 0 0 68 0 0 cm BI /IM true /W 36 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AI==?A>IkG&  EI endstream endobj 28 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID $7&~E?A>7~7Wzkv4J&VRjAd>  EI endstream endobj 29 0 obj <>stream 0 0 0 0 33 79 d1 33 0 0 79 0 0 cm BI /IM true /W 33 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3?߿߿߿߿߿߿߿߿  EI endstream endobj 30 0 obj <>stream 0 0 0 0 80 50 d1 80 0 0 50 0 0 cm BI /IM true /W 80 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &zN^{ޯ_Wz}^{^ߵo^ߵoħDgk@ EI endstream endobj 31 0 obj <>stream 0 0 0 0 13 14 d1 13 0 0 14 0 0 cm BI /IM true /W 13 /H 14 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w&ma EI endstream endobj 32 0 obj <>stream 0 0 0 0 86 52 d1 86 0 0 52 0 0 cm BI /IM true /W 86 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID *Ȩ/QIA8l4z^D=Nt[O )50@@@ EI endstream endobj 33 0 obj <>stream 0 0 0 0 40 54 d1 40 0 0 54 0 0 cm BI /IM true /W 40 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &༊_,w!ppO5 k `K,, -. Ud6Xj0 ,' EI endstream endobj 34 0 obj <>stream 0 0 0 0 26 73 d1 26 0 0 73 0 0 cm BI /IM true /W 26 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5_ EI endstream endobj 35 0 obj <>stream 0 0 0 0 57 52 d1 57 0 0 52 0 0 cm BI /IM true /W 57 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID *j)8l'] rt8k}2  EI endstream endobj 36 0 obj <>stream 0 0 0 0 55 74 d1 55 0 0 74 0 0 cm BI /IM true /W 55 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A8er x'0o D~AI?MWvv]^a[v]!k G@ EI endstream endobj 37 0 obj <>stream 0 0 0 0 49 54 d1 49 0 0 54 0 0 cm BI /IM true /W 49 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4H.OD1^ &z_z_m߶ - lVXaal@ EI endstream endobj 38 0 obj <>stream 0 0 0 0 55 50 d1 55 0 0 50 0 0 cm BI /IM true /W 55 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\W{?׽/ׯ~^}zׯ^}zޗq)Ñ EI endstream endobj 39 0 obj <>stream 0 0 0 0 55 75 d1 55 0 0 75 0 0 cm BI /IM true /W 55 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Af=XAO>OGAZ?OO_j .{^׆0^@ EI endstream endobj 40 0 obj <>stream 0 0 0 0 46 54 d1 46 0 0 54 0 0 cm BI /IM true /W 46 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &]>=C ނoIҿ}/"F5_C v] c ,0Y  EI endstream endobj 41 0 obj <>stream 0 0 0 0 55 75 d1 55 0 0 75 0 0 cm BI /IM true /W 55 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f Hek)MD }?W~}ivkKW{^^^C@ EI endstream endobj 42 0 obj <>stream 0 0 0 0 48 5 d1 48 0 0 5 0 0 cm BI /IM true /W 48 /H 5 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 43 0 obj <>stream 0 0 0 0 26 71 d1 26 0 0 71 0 0 cm BI /IM true /W 26 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5_&ȿ EI endstream endobj 44 0 obj <>stream 0 0 0 0 52 50 d1 52 0 0 50 0 0 cm BI /IM true /W 52 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &s!m-Km-Km-+kk~={D7W7^>q5@ EI endstream endobj 46 0 obj <>stream 0 0 0 -60 41 2 d1 41 0 0 62 0 -60 cm BI /IM true /W 41 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &bAp@N M}tuq_axav= - ! EI endstream endobj 47 0 obj <>stream 0 0 0 0 46 59 d1 46 0 0 59 0 0 cm BI /IM true /W 46 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 Rj]ckfK޻w>~ EI endstream endobj 48 0 obj <>stream 0 0 0 15 40 19 d1 40 0 0 4 0 15 cm BI /IM true /W 40 /H 4 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 49 0 obj <>stream 0 0 0 0 39 59 d1 39 0 0 59 0 0 cm BI /IM true /W 39 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID )}t,*T;;{kȩUPR EI endstream endobj 50 0 obj <>stream 0 0 0 0 38 62 d1 38 0 0 62 0 0 cm BI /IM true /W 38 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"E=}7o }|-, B|, KAh- 0Wrj?av^.ǿ C EI endstream endobj 51 0 obj <>stream 0 0 0 -59 44 0 d1 44 0 0 59 0 -59 cm BI /IM true /W 44 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ޿z^W7ޓ|@ EI endstream endobj 52 0 obj <>stream 0 0 0 0 37 59 d1 37 0 0 59 0 0 cm BI /IM true /W 37 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID h EI endstream endobj 53 0 obj <>stream 0 0 0 0 38 61 d1 38 0 0 61 0 0 cm BI /IM true /W 38 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &bBՄzz]=| ~ EI endstream endobj 54 0 obj <>stream 0 0 0 0 37 59 d1 37 0 0 59 0 0 cm BI /IM true /W 37 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID hO@@ EI endstream endobj 55 0 obj <>stream 0 0 0 -59 38 0 d1 38 0 0 59 0 -59 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 gp#8xo}\.ȩ㪨PR0  EI endstream endobj 56 0 obj <>stream 0 0 0 0 46 59 d1 46 0 0 59 0 0 cm BI /IM true /W 46 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7  EI endstream endobj 57 0 obj <>stream 0 0 0 0 37 62 d1 37 0 0 62 0 0 cm BI /IM true /W 37 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Yh&KU~ mv5 ! EI endstream endobj 58 0 obj <>stream 0 0 0 0 38 59 d1 38 0 0 59 0 0 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 4  EI endstream endobj 59 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A"A4=====OO}?߿___k~]ح k , EI endstream endobj 60 0 obj <>stream 0 0 0 0 43 59 d1 43 0 0 59 0 0 cm BI /IM true /W 43 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4KKKKKKtK[J+ꦉ EI endstream endobj 61 0 obj <>stream 0 0 0 0 44 59 d1 44 0 0 59 0 0 cm BI /IM true /W 44 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4___ֽkֽkZX\Xp怏kEUT(R  EI endstream endobj 62 0 obj <>stream 0 0 0 0 34 59 d1 34 0 0 59 0 0 cm BI /IM true /W 34 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID MA ?Ip EI endstream endobj 63 0 obj <>stream 0 0 0 0 39 59 d1 39 0 0 59 0 0 cm BI /IM true /W 39 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID pW߿_Z륮YT*)` EI endstream endobj 64 0 obj <>stream 0 0 0 0 42 59 d1 42 0 0 59 0 0 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 DO7IMoSOp EI endstream endobj 65 0 obj <>stream 0 0 0 0 38 59 d1 38 0 0 59 0 0 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 453_K___}}|@ EI endstream endobj 66 0 obj <>stream 0 0 0 0 46 59 d1 46 0 0 59 0 0 cm BI /IM true /W 46 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3>?[o}o}oI}+o&n EI endstream endobj 67 0 obj <>stream 0 0 0 0 35 59 d1 35 0 0 59 0 0 cm BI /IM true /W 35 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 #w恕  EI endstream endobj 68 0 obj <>stream 0 0 0 0 48 59 d1 48 0 0 59 0 0 cm BI /IM true /W 48 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' 5M.-Kn^m}-_޻Km~z?=>h>z_MW}7z_p EI endstream endobj 69 0 obj <>stream 0 0 0 0 40 59 d1 40 0 0 59 0 0 cm BI /IM true /W 40 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID N v߽߽߽߽  EI endstream endobj 70 0 obj <>stream 0 0 0 0 40 71 d1 40 0 0 71 0 0 cm BI /IM true /W 40 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ZzOO]#L'XOOOOOD17޿Oc5__߶av+k  EI endstream endobj 71 0 obj <> endobj 72 0 obj <> endobj 76 0 obj <>endobj 77 0 obj <>stream 0 0 0 -61 19 11 d1 19 0 0 72 0 -61 cm BI /IM true /W 19 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_Z___j{@ EI endstream endobj 78 0 obj <>stream 0 0 0 -61 19 11 d1 19 0 0 72 0 -61 cm BI /IM true /W 19 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 To߽߿߿__^KK  EI endstream endobj 79 0 obj <>stream 0 0 0 0 49 59 d1 49 0 0 59 0 0 cm BI /IM true /W 49 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID & WY_W_]޾ EI endstream endobj 80 0 obj <>stream 0 0 0 -59 34 0 d1 34 0 0 59 0 -59 cm BI /IM true /W 34 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &%??MnGA) EI endstream endobj 81 0 obj <> endobj 82 0 obj <> endobj 86 0 obj <>endobj 87 0 obj <>stream 0 0 0 -60 37 0 d1 37 0 0 60 0 -60 cm BI /IM true /W 37 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID MQ8e[oooooooo}߽{^ .a.>k ,Yx EI endstream endobj 88 0 obj <>stream 0 0 0 0 37 63 d1 37 0 0 63 0 0 cm BI /IM true /W 37 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"BOGEtOW}aqK\0 EI endstream endobj 89 0 obj <>stream 0 0 0 0 37 61 d1 37 0 0 61 0 0 cm BI /IM true /W 37 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID a1? EI endstream endobj 90 0 obj <>stream 0 0 0 0 36 57 d1 36 0 0 57 0 0 cm BI /IM true /W 36 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &F\]k#j EI endstream endobj 91 0 obj <>stream 0 0 0 0 38 47 d1 38 0 0 47 0 0 cm BI /IM true /W 38 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &bCO==>t zO}?د~5k~Kح0€ EI endstream endobj 92 0 obj <>stream 0 0 0 0 35 45 d1 35 0 0 45 0 0 cm BI /IM true /W 35 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3?ok EI endstream endobj 93 0 obj <>stream 0 0 0 0 37 47 d1 37 0 0 47 0 0 cm BI /IM true /W 37 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Dd>OGK{~ܚS3gxkK ]l,Y @ EI endstream endobj 94 0 obj <>stream 0 0 0 0 35 62 d1 35 0 0 62 0 0 cm BI /IM true /W 35 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID & Zֿ'K_ EI endstream endobj 95 0 obj <>stream 0 0 0 0 44 44 d1 44 0 0 44 0 0 cm BI /IM true /W 44 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID (jmim^im[iml}mmo4ޓޕޓzMޓzMޯ EI endstream endobj 96 0 obj <>stream 0 0 0 0 37 62 d1 37 0 0 62 0 0 cm BI /IM true /W 37 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 ==8΂MO_~+aT-0( EI endstream endobj 97 0 obj <>stream 0 0 0 0 33 47 d1 33 0 0 47 0 0 cm BI /IM true /W 33 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &y4 qpۙpA<& W20]Z#3 W_y &ᅃ EI endstream endobj 98 0 obj <> endobj 99 0 obj <> endobj 103 0 obj <>endobj 105 0 obj <>stream 0 0 0 -90 89 2 d1 89 0 0 92 0 -90 cm BI /IM true /W 89 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KDXC4< z)CA=z].K_]_>A kU O׿uv^mv 0 .xaa  dX6Hi*@ EI endstream endobj 106 0 obj <>stream 0 0 0 0 96 88 d1 96 0 0 88 0 0 cm BI /IM true /W 96 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID )/j2pU*ĺ_[ul}~rp1_׺m~^{uK/߯߯߭߭ EI endstream endobj 107 0 obj <>stream 0 0 0 17 60 29 d1 60 0 0 12 0 17 cm BI /IM true /W 60 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 108 0 obj <>stream 0 0 0 -88 46 0 d1 46 0 0 88 0 -88 cm BI /IM true /W 46 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J$P7  EI endstream endobj 109 0 obj <>stream 0 0 0 0 100 88 d1 100 0 0 88 0 0 cm BI /IM true /W 100 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID #@k ]uuMB______}}}}FK_/K_/K//K/KK!4k_ EI endstream endobj 110 0 obj <>stream 0 0 0 0 88 88 d1 88 0 0 88 0 0 cm BI /IM true /W 88 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &jQ4 ) EI endstream endobj 111 0 obj <>stream 0 0 0 0 77 88 d1 77 0 0 88 0 0 cm BI /IM true /W 77 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &yP 6H4  EI endstream endobj 112 0 obj <>stream 0 0 0 0 80 88 d1 80 0 0 88 0 0 cm BI /IM true /W 80 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID ړT5{{{{{{~߷| EI endstream endobj 113 0 obj <>stream 0 0 0 0 81 88 d1 81 0 0 88 0 0 cm BI /IM true /W 81 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &yP ޟʀo!O8 EI endstream endobj 115 0 obj <>stream 0 0 0 -44 43 0 d1 43 0 0 44 0 -44 cm BI /IM true /W 43 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &޿޿|zW7~zWM EI endstream endobj 116 0 obj <>stream 0 0 0 0 42 47 d1 42 0 0 47 0 0 cm BI /IM true /W 42 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g}pA|] O}?cMWߺk\{[Xa@@ EI endstream endobj 117 0 obj <>stream 0 0 0 0 41 66 d1 41 0 0 66 0 0 cm BI /IM true /W 41 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID Pr??8 EI endstream endobj 118 0 obj <>stream 0 0 0 0 40 63 d1 40 0 0 63 0 0 cm BI /IM true /W 40 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &BuΧO&[aqȅ  EI endstream endobj 119 0 obj <>stream 0 0 0 -60 41 2 d1 41 0 0 62 0 -60 cm BI /IM true /W 41 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &bAz@zzu}sX ȣ!kUl^m{^]Xaah@ EI endstream endobj 120 0 obj <>stream 0 0 0 0 46 59 d1 46 0 0 59 0 0 cm BI /IM true /W 46 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID !y5_ukk__;k{__@ EI endstream endobj 121 0 obj <>stream 0 0 0 11 49 19 d1 49 0 0 8 0 11 cm BI /IM true /W 49 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 122 0 obj <>stream 0 0 0 -59 36 0 d1 36 0 0 59 0 -59 cm BI /IM true /W 36 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 9 ?  EI endstream endobj 123 0 obj <>stream 0 0 0 0 36 45 d1 36 0 0 45 0 0 cm BI /IM true /W 36 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID !_PkړP ( EI endstream endobj 124 0 obj <>stream 0 0 0 0 38 57 d1 38 0 0 57 0 0 cm BI /IM true /W 38 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k_uޢ?j EI endstream endobj 125 0 obj <>stream 0 0 0 0 41 47 d1 41 0 0 47 0 0 cm BI /IM true /W 41 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D3>Z滄?ɪ~ʋcc׃^Cad=p EI endstream endobj 126 0 obj <>stream 0 0 0 0 40 61 d1 40 0 0 61 0 0 cm BI /IM true /W 40 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ZF]u@ EI endstream endobj 127 0 obj <>stream 0 0 0 0 37 44 d1 37 0 0 44 0 0 cm BI /IM true /W 37 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID A5Ooooooooo  EI endstream endobj 128 0 obj <>stream 0 0 0 0 42 47 d1 42 0 0 47 0 0 cm BI /IM true /W 42 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1 0@뮺ȋP'> UKk @ EI endstream endobj 129 0 obj <>stream 0 0 0 -61 23 11 d1 23 0 0 72 0 -61 cm BI /IM true /W 23 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &KK__/MS߿߿߿߽߽o~@ EI endstream endobj 130 0 obj <>stream 0 0 0 0 22 72 d1 22 0 0 72 0 0 cm BI /IM true /W 22 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID '5O߽߿߿KKz׭z EI endstream endobj 131 0 obj <>stream 0 0 0 0 72 70 d1 72 0 0 70 0 0 cm BI /IM true /W 72 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID %ɩ@i_i[s_io__i߱_oP EI endstream endobj 132 0 obj <>stream 0 0 0 0 45 50 d1 45 0 0 50 0 0 cm BI /IM true /W 45 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5D.kooooo~߷}@ EI endstream endobj 133 0 obj <>stream 0 0 0 -72 65 2 d1 65 0 0 74 0 -72 cm BI /IM true /W 65 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Hx@S@t=z믮_2@ɪ _]^mva])ج0X`d 4"  EI endstream endobj 134 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &旄oo{?׿{B}z߾~_׫}z^z_׭~^y!qDq EI endstream endobj 135 0 obj <>stream 0 0 0 0 95 88 d1 95 0 0 88 0 0 cm BI /IM true /W 95 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID )Avj ÇMB߆ ~߿߿~__//_K/ xK^A# )LH` EI endstream endobj 136 0 obj <>stream 0 0 0 -45 36 2 d1 36 0 0 47 0 -45 cm BI /IM true /W 36 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^F#2L'p/|.?,AEx\%]h.B\AAUd3ɪF~?  EI endstream endobj 137 0 obj <>stream 0 0 0 0 43 45 d1 43 0 0 45 0 0 cm BI /IM true /W 43 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID '"rkk4D?Ԛ0 EI endstream endobj 138 0 obj <>stream 0 0 0 0 41 45 d1 41 0 0 45 0 0 cm BI /IM true /W 41 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID >!iG\J}'jMB&@ EI endstream endobj 139 0 obj <>stream 0 0 0 0 35 46 d1 35 0 0 46 0 0 cm BI /IM true /W 35 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ˥uH>  EI endstream endobj 140 0 obj <>stream 0 0 0 0 35 61 d1 35 0 0 61 0 0 cm BI /IM true /W 35 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5f>t{@ EI endstream endobj 141 0 obj <>stream 0 0 0 0 40 47 d1 40 0 0 47 0 0 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/ ]tk!?AQ5F`mil0V @ EI endstream endobj 142 0 obj <>stream 0 0 0 0 32 45 d1 32 0 0 45 0 0 cm BI /IM true /W 32 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3(jPefk{Rj  EI endstream endobj 143 0 obj <>stream 0 0 0 0 42 61 d1 42 0 0 61 0 0 cm BI /IM true /W 42 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &8f!}߿^?i߿W߿W޿z7U6  EI endstream endobj 144 0 obj <>stream 0 0 0 -61 37 2 d1 37 0 0 63 0 -61 cm BI /IM true /W 37 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A^A8S: =7O^׿}ַ߭JULX`  EI endstream endobj 145 0 obj <>stream 0 0 0 0 35 47 d1 35 0 0 47 0 0 cm BI /IM true /W 35 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Y:ִjC ='zׯ??m c a EI endstream endobj 146 0 obj <>stream 0 0 0 -61 17 11 d1 17 0 0 72 0 -61 cm BI /IM true /W 17 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID f' EI endstream endobj 147 0 obj <>stream 0 0 0 -61 18 11 d1 18 0 0 72 0 -61 cm BI /IM true /W 18 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID MD? EI endstream endobj 148 0 obj <>stream 0 0 0 -73 39 0 d1 39 0 0 73 0 -73 cm BI /IM true /W 39 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?ɨxME' !qkaxk ` EI endstream endobj 149 0 obj <>stream 0 0 0 -70 28 0 d1 28 0 0 70 0 -70 cm BI /IM true /W 28 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5O# EI endstream endobj 150 0 obj <>stream 0 0 0 -73 24 15 d1 24 0 0 88 0 -73 cm BI /IM true /W 24 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID & XZւ׭/ׯ׭^?MW}}{@ EI endstream endobj 151 0 obj <>stream 0 0 0 -73 24 15 d1 24 0 0 88 0 -73 cm BI /IM true /W 24 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0w&=o߿_K^҈UP@@ EI endstream endobj 152 0 obj <>stream 0 0 0 -72 46 -27 d1 46 0 0 45 0 -72 cm BI /IM true /W 46 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3=>A>xMM`aXaaXaax 3xKa,0ÓTX}X|q׿ EI endstream endobj 153 0 obj <>stream 0 0 0 -56 61 -4 d1 61 0 0 52 0 -56 cm BI /IM true /W 61 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`XX,, X @@`  Ap<<<x```axx<  EI endstream endobj 154 0 obj <>stream 0 0 0 -70 26 -43 d1 26 0 0 27 0 -70 cm BI /IM true /W 26 /H 27 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 @ EI endstream endobj 155 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!? xAA~A}'~''U]]ov׵aVk`e EI endstream endobj 156 0 obj <>stream 0 0 0 -88 83 0 d1 83 0 0 88 0 -88 cm BI /IM true /W 83 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID *A5 T'?g}@W ~߿^z^Jb(PR@ EI endstream endobj 157 0 obj <>stream 0 0 0 0 96 88 d1 96 0 0 88 0 0 cm BI /IM true /W 96 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID __Zj '///////___KKK%\W `0||~o___K^J18PNA EI endstream endobj 158 0 obj <>stream 0 0 0 0 95 92 d1 95 0 0 92 0 0 cm BI /IM true /W 95 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FPC0_< xDG@ސaސoII_Jo_V_ɪ_w[[um[a-`,5   !  EI endstream endobj 159 0 obj <>stream 0 0 0 0 99 90 d1 99 0 0 90 0 0 cm BI /IM true /W 99 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DdXxA?@lAOM?__>8 EI endstream endobj 160 0 obj <>stream 0 0 0 -90 85 2 d1 85 0 0 92 0 -90 cm BI /IM true /W 85 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &FdXC4WxALxDoA}&'ҿ}/VԂ_5_ mmwo]]]l.aa  dL4Hi*@ EI endstream endobj 161 0 obj <>stream 0 0 0 -59 39 0 d1 39 0 0 59 0 -59 cm BI /IM true /W 39 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID $_@pp|' K,uUB EI endstream endobj 162 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0yL }'A./ uS>cԚw]dB.D5 EI endstream endobj 163 0 obj <>stream 0 0 0 0 34 45 d1 34 0 0 45 0 0 cm BI /IM true /W 34 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID $ޡaA1!oxrj@@ EI endstream endobj 164 0 obj <>stream 0 0 0 0 36 46 d1 36 0 0 46 0 0 cm BI /IM true /W 36 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &LyA:}t@ EI endstream endobj 165 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID !_ȑ#==8Nﮭo}WR[XjMC8( EI endstream endobj 166 0 obj <>stream 0 0 0 -45 36 2 d1 36 0 0 47 0 -45 cm BI /IM true /W 36 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &y:ֵ}p=|Wܚ[av{X0P EI endstream endobj 167 0 obj <>stream 0 0 0 -60 40 -22 d1 40 0 0 38 0 -60 cm BI /IM true /W 40 /H 38 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/>B|<.}𘌚aXaaxAN0-X}X|q EI endstream endobj 168 0 obj <>stream 0 0 0 -15 17 12 d1 17 0 0 27 0 -15 cm BI /IM true /W 17 /H 27 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4ɪ{@ EI endstream endobj 169 0 obj <>stream 0 0 0 0 34 44 d1 34 0 0 44 0 0 cm BI /IM true /W 34 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID Toooooooooo(K EI endstream endobj 170 0 obj <>stream 0 0 0 -45 37 18 d1 37 0 0 63 0 -45 cm BI /IM true /W 37 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^MG|>? }>}>ֈoA='5_kmv\wk "j  EI endstream endobj 171 0 obj <>stream 0 0 0 -11 19 13 d1 19 0 0 24 0 -11 cm BI /IM true /W 19 /H 24 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Jz.<7{߀ EI endstream endobj 172 0 obj <>stream 0 0 0 0 57 73 d1 57 0 0 73 0 0 cm BI /IM true /W 57 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/Ȕ!KK//KKK^׿~߆~߷~ߐE@ EI endstream endobj 173 0 obj <>stream 0 0 0 0 73 92 d1 73 0 0 92 0 0 cm BI /IM true /W 73 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` Wk L 6>oM__޿k idJ` X%K Aiu\r2X(FAAB]jm{] `}ʐHd x2L H4@ EI endstream endobj 174 0 obj <>stream 0 0 0 0 88 88 d1 88 0 0 88 0 0 cm BI /IM true /W 88 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kQzzOz7zWޕ^zOzW}>^zWzMq"  EI endstream endobj 175 0 obj <>stream 0 0 0 0 44 61 d1 44 0 0 61 0 0 cm BI /IM true /W 44 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &30}}~^O^^C__WoK~'S EI endstream endobj 176 0 obj <>stream 0 0 0 -61 36 0 d1 36 0 0 61 0 -61 cm BI /IM true /W 36 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID !}_Pk  EI endstream endobj 177 0 obj <>stream 0 0 0 -61 35 0 d1 35 0 0 61 0 -61 cm BI /IM true /W 35 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3?okX EI endstream endobj 178 0 obj <>stream 0 0 0 0 79 88 d1 79 0 0 88 0 0 cm BI /IM true /W 79 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID *@5 T) tc  EI endstream endobj 179 0 obj <>stream 0 0 0 0 37 61 d1 37 0 0 61 0 0 cm BI /IM true /W 37 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &IP5 EI endstream endobj 180 0 obj <>stream 0 0 0 -72 51 2 d1 51 0 0 74 0 -72 cm BI /IM true /W 51 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$:K8#7^}?Ԛgֵ Y 0KXAhH(r0(. *W^Arc&k x`5 @C! EI endstream endobj 181 0 obj <> endobj 182 0 obj <> endobj 186 0 obj <>endobj 187 0 obj <>stream 0 0 0 -59 40 0 d1 40 0 0 59 0 -59 cm BI /IM true /W 40 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID ( }_]_X__ EI endstream endobj 188 0 obj <>stream 0 0 0 -60 38 2 d1 38 0 0 62 0 -60 cm BI /IM true /W 38 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Y+-kZ)A_&[ .K`d4  EI endstream endobj 189 0 obj <>stream 0 0 0 -61 21 11 d1 21 0 0 72 0 -61 cm BI /IM true /W 21 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID ( . EI endstream endobj 190 0 obj <>stream 0 0 0 0 21 72 d1 21 0 0 72 0 0 cm BI /IM true /W 21 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &? EI endstream endobj 191 0 obj <>stream 0 0 0 0 41 61 d1 41 0 0 61 0 0 cm BI /IM true /W 41 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID !/]/].Ҿ+꺻 =@ EI endstream endobj 192 0 obj <>stream 0 0 0 -26 22 -18 d1 22 0 0 8 0 -26 cm BI /IM true /W 22 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 193 0 obj <>stream 0 0 0 0 37 62 d1 37 0 0 62 0 0 cm BI /IM true /W 37 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ACr@Ooalw k``@ EI endstream endobj 194 0 obj <>stream 0 0 0 -12 15 12 d1 15 0 0 24 0 -12 cm BI /IM true /W 15 /H 24 /BPC 1 /D[1 0] /F/CCF /DP<> ID >+U߿~  EI endstream endobj 195 0 obj <>stream 0 0 0 0 38 61 d1 38 0 0 61 0 0 cm BI /IM true /W 38 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 K].K^n= EI endstream endobj 196 0 obj <>stream 0 0 0 0 42 44 d1 42 0 0 44 0 0 cm BI /IM true /W 42 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@b޿[~[}o߫}+@ EI endstream endobj 197 0 obj <>stream 0 0 0 -72 63 2 d1 63 0 0 74 0 -72 cm BI /IM true /W 63 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N W. ޓ7Oޗ~/ k=׿ow׵]]a B  $ EI endstream endobj 198 0 obj <>stream 0 0 0 -30 25 -22 d1 25 0 0 8 0 -30 cm BI /IM true /W 25 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 199 0 obj <>stream 0 0 0 -70 58 0 d1 58 0 0 70 0 -70 cm BI /IM true /W 58 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID aMD' AG' _@ EI endstream endobj 200 0 obj <>stream 0 0 0 -73 23 13 d1 23 0 0 86 0 -73 cm BI /IM true /W 23 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID ! EI endstream endobj 201 0 obj <>stream 0 0 0 -73 23 13 d1 23 0 0 86 0 -73 cm BI /IM true /W 23 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID   EI endstream endobj 202 0 obj <>stream 0 0 0 -44 61 -16 d1 61 0 0 28 0 -44 cm BI /IM true /W 61 /H 28 /BPC 1 /D[1 0] /F/CCF /DP<> ID PZɐo  EI endstream endobj 203 0 obj <>stream 0 0 0 -42 20 13 d1 20 0 0 55 0 -42 cm BI /IM true /W 20 /H 55 /BPC 1 /D[1 0] /F/CCF /DP<> ID &zz.<7{ zz EI endstream endobj 204 0 obj <>stream 0 0 0 -70 76 2 d1 76 0 0 72 0 -70 cm BI /IM true /W 76 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &X|J0j&___}}~C__///////_//////댆Z}` EI endstream endobj 205 0 obj <>stream 0 0 0 0 73 72 d1 73 0 0 72 0 0 cm BI /IM true /W 73 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H0D 6B ==z5ȣ>8@ EI endstream endobj 206 0 obj <>stream 0 0 0 0 57 70 d1 57 0 0 70 0 0 cm BI /IM true /W 57 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5O!kFo  EI endstream endobj 207 0 obj <>stream 0 0 0 -70 70 0 d1 70 0 0 70 0 -70 cm BI /IM true /W 70 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID @MD'@///////////_KKDB8~߇o_|%y/U @ EI endstream endobj 208 0 obj <>stream 0 0 0 -82 94 0 d1 94 0 0 82 0 -82 cm BI /IM true /W 94 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID aj ]uP______ __~__~__~_~~_____}}}}}A kZ@ EI endstream endobj 209 0 obj <>stream 0 0 0 0 83 86 d1 83 0 0 86 0 0 cm BI /IM true /W 83 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &SdHC,=I@ zOA=./]z_!?Y5jokk `v I=  E@@@ EI endstream endobj 210 0 obj <>stream 0 0 0 0 90 82 d1 90 0 0 82 0 0 cm BI /IM true /W 90 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID *&NE@K.o]߯٠]v׮^kz]_~~~@@ EI endstream endobj 211 0 obj <>stream 0 0 0 15 56 27 d1 56 0 0 12 0 15 cm BI /IM true /W 56 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 212 0 obj <>stream 0 0 0 -84 80 2 d1 80 0 0 86 0 -84 cm BI /IM true /W 80 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j  < x z* oAoI~Wҿ}+Zj'~k]aH' { ,)"@DZl EI endstream endobj 213 0 obj <>stream 0 0 0 0 89 82 d1 89 0 0 82 0 0 cm BI /IM true /W 89 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID %F P/___K}/ y } ? oK𗄼7xADUB+  EI endstream endobj 214 0 obj <>stream 0 0 0 0 75 82 d1 75 0 0 82 0 0 cm BI /IM true /W 75 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID MBr 4 _6O?lҟ@ EI endstream endobj 215 0 obj <>stream 0 0 0 0 82 82 d1 82 0 0 82 0 0 cm BI /IM true /W 82 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3)? EI endstream endobj 216 0 obj <>stream 0 0 0 0 89 86 d1 89 0 0 86 0 0 cm BI /IM true /W 89 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k I, P A&oI/V_Jo_Kw_Km{Km-[ % ؅  A^A EI endstream endobj 217 0 obj <>stream 0 0 0 0 74 82 d1 74 0 0 82 0 0 cm BI /IM true /W 74 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID !_  t EI endstream endobj 218 0 obj <>stream 0 0 0 0 43 82 d1 43 0 0 82 0 0 cm BI /IM true /W 43 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID MBaHo EI endstream endobj 219 0 obj <>stream 0 0 0 0 103 88 d1 103 0 0 88 0 0 cm BI /IM true /W 103 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J!A EI endstream endobj 220 0 obj <>stream 0 0 0 -44 49 0 d1 49 0 0 44 0 -44 cm BI /IM true /W 49 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!HfޮWz?_q} EI endstream endobj 221 0 obj <> endobj 222 0 obj <> endobj 226 0 obj <>endobj 227 0 obj <>stream 0 0 0 -44 49 0 d1 49 0 0 44 0 -44 cm BI /IM true /W 49 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ÚkϬk~{z7w??  EI endstream endobj 228 0 obj <>stream 0 0 0 -57 61 -3 d1 61 0 0 54 0 -57 cm BI /IM true /W 61 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`XX,   ,,(ÃT  <<<0x0px<p EI endstream endobj 229 0 obj <>stream 0 0 0 -72 47 0 d1 47 0 0 72 0 -72 cm BI /IM true /W 47 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j EI endstream endobj 230 0 obj <>stream 0 0 0 0 96 82 d1 96 0 0 82 0 0 cm BI /IM true /W 96 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID %?5AQ $ EI endstream endobj 231 0 obj <>stream 0 0 0 0 68 86 d1 68 0 0 86 0 0 cm BI /IM true /W 68 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ #  7 _M}/X𵄰\ )(,h.X\% K\.A"DH((U L~:MUm}vmv^]!a}%a@bCA<]  EI endstream endobj 232 0 obj <>stream 0 0 0 -61 40 2 d1 40 0 0 63 0 -61 cm BI /IM true /W 40 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &b@$8==8NxM^__WZk %UԆXac@ EI endstream endobj 233 0 obj <>stream 0 0 0 -12 10 0 d1 10 0 0 12 0 -12 cm BI /IM true /W 10 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 234 0 obj <>stream 0 0 0 -42 15 12 d1 15 0 0 54 0 -42 cm BI /IM true /W 15 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID >+U߿~!_g EI endstream endobj 235 0 obj <>stream 0 0 0 -72 49 2 d1 49 0 0 74 0 -72 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &39|< Gz77}?j[ivim[ X xA7z7ޓ7Ok~vim`mmaH EI endstream endobj 237 0 obj <>stream 0 0 0 -53 52 0 d1 52 0 0 53 0 -53 cm BI /IM true /W 52 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID $d[k][km[kmmmo_z}맢B}7ޓ}7ޓ~ޗޓ~ޗޓ~ EI endstream endobj 238 0 obj <>stream 0 0 0 -72 50 2 d1 50 0 0 74 0 -72 cm BI /IM true /W 50 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4H.zxA#A}&o_on(iC (Aa5V߿߲C>}k߶k`v=a`Ȁ) EI endstream endobj 239 0 obj <>stream 0 0 0 -73 38 16 d1 38 0 0 89 0 -73 cm BI /IM true /W 38 /H 89 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\-k\%X%eWɨ QXkp EI endstream endobj 240 0 obj <>stream 0 0 0 -73 38 16 d1 38 0 0 89 0 -73 cm BI /IM true /W 38 /H 89 /BPC 1 /D[1 0] /F/CCF /DP<> ID ( P7N~{_8xXZ %ֽ_륓Q¨( EI endstream endobj 241 0 obj <>stream 0 0 0 -70 46 2 d1 46 0 0 72 0 -70 cm BI /IM true /W 46 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p! `ÝB8AAznnoP~a:iw] q\.\:4 EI endstream endobj 242 0 obj <> endobj 243 0 obj <> endobj 247 0 obj <>endobj 248 0 obj <>stream 0 0 0 -70 47 0 d1 47 0 0 70 0 -70 cm BI /IM true /W 47 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M.e~ EI endstream endobj 249 0 obj <> endobj 250 0 obj <> endobj 254 0 obj <>endobj 255 0 obj <>stream 0 0 0 -70 99 0 d1 99 0 0 70 0 -70 cm BI /IM true /W 99 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`M]?[OP}[Ko/K/'}_w_븑CA} EI endstream endobj 256 0 obj <>stream 0 0 0 0 123 88 d1 123 0 0 88 0 0 cm BI /IM true /W 123 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID #@5 h/eU_MW7__MWWS~~Pouw]@ EI endstream endobj 257 0 obj <>stream 0 0 0 -60 39 2 d1 39 0 0 62 0 -60 cm BI /IM true /W 39 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"ww܆.<xV,/pKX\% @( ,as@ EI endstream endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <>endobj 264 0 obj <> endobj 265 0 obj <> endobj 269 0 obj <>endobj 270 0 obj <>stream 0 0 0 0 103 88 d1 103 0 0 88 0 0 cm BI /IM true /W 103 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID kZדP@4!:^z^z^ץz^z^}z^z^]u]u*o߷?o7 ~o~߰oۉȐ  EI endstream endobj 271 0 obj <>stream 0 0 0 -88 90 0 d1 90 0 0 88 0 -88 cm BI /IM true /W 90 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID ; h;8.8pMBoo//_K𗄼^F/.7>T x7oK^ y^"B w` EI endstream endobj 272 0 obj <>stream 0 0 0 0 31 93 d1 31 0 0 93 0 0 cm BI /IM true /W 31 /H 93 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ղ!nPAI!z[P EI endstream endobj 273 0 obj <>stream 0 0 0 -70 60 0 d1 60 0 0 70 0 -70 cm BI /IM true /W 60 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID % 8rj!8;*߇/ y+#\.o~߿߿_z^$ET(PP EI endstream endobj 274 0 obj <> endobj 275 0 obj <> endobj 279 0 obj <>endobj 280 0 obj <>stream 0 0 0 0 69 70 d1 69 0 0 70 0 0 cm BI /IM true /W 69 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ijz^z^z^z^z^z^u]u]to0oo~o7?oF@ EI endstream endobj 281 0 obj <>stream 0 0 0 -72 69 2 d1 69 0 0 74 0 -72 cm BI /IM true /W 69 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N xF^@MIoKJ}d~_zۮvm.m- lK 0+ ,0f  EI endstream endobj 282 0 obj <> endobj 283 0 obj <> endobj 287 0 obj <>endobj 288 0 obj <>stream 0 0 0 -59 40 2 d1 40 0 0 61 0 -59 cm BI /IM true /W 40 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A"B=====?^j/>stream 0 0 0 -46 42 -4 d1 42 0 0 42 0 -46 cm BI /IM true /W 42 /H 42 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1%Xo` EI endstream endobj 290 0 obj <>stream 0 0 0 -59 40 8 d1 40 0 0 67 0 -59 cm BI /IM true /W 40 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4j EI endstream endobj 291 0 obj <>stream 0 0 0 -60 38 2 d1 38 0 0 62 0 -60 cm BI /IM true /W 38 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &bCz}A>}&}oV6J}?z5M/m~]v0Kkkk ,53  EI endstream endobj 292 0 obj <>stream 0 0 0 -61 61 0 d1 61 0 0 61 0 -61 cm BI /IM true /W 61 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f$P7MC(2@ EI endstream endobj 293 0 obj <>stream 0 0 0 -37 42 -13 d1 42 0 0 24 0 -37 cm BI /IM true /W 42 /H 24 /BPC 1 /D[1 0] /F/CCF /DP<> ID &+  EI endstream endobj 294 0 obj <>stream 0 0 0 -59 38 0 d1 38 0 0 59 0 -59 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID $ EI endstream endobj 295 0 obj <> endobj 296 0 obj <> endobj 300 0 obj <>endobj 301 0 obj <>stream 0 0 0 0 66 70 d1 66 0 0 70 0 0 cm BI /IM true /W 66 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID & OOCOJս+oI+ҾI+ҿxA EI endstream endobj 302 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@cĤ  EI endstream endobj 303 0 obj <>stream 0 0 0 -59 40 0 d1 40 0 0 59 0 -59 cm BI /IM true /W 40 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID !pw |7߽_-uYEuUU   EI endstream endobj 304 0 obj <> endobj 305 0 obj <> endobj 309 0 obj <>endobj 310 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID ( ??@ EI endstream endobj 311 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID C*{S EI endstream endobj 312 0 obj <>stream 0 0 0 -59 37 0 d1 37 0 0 59 0 -59 cm BI /IM true /W 37 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID $) E@ EI endstream endobj 313 0 obj <> endobj 314 0 obj <> endobj 318 0 obj <>endobj 319 0 obj <>stream 0 0 0 0 24 78 d1 24 0 0 78 0 0 cm BI /IM true /W 24 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID :;;}  EI endstream endobj 320 0 obj <>stream 0 0 0 -60 36 -22 d1 36 0 0 38 0 -60 cm BI /IM true /W 36 /H 38 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!_OOxMMPxK < V ,0A< (GxAa[,5? EI endstream endobj 321 0 obj <> endobj 322 0 obj <> endobj 326 0 obj <>endobj 327 0 obj <>stream 0 0 0 -70 58 0 d1 58 0 0 70 0 -70 cm BI /IM true /W 58 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5W 87i?  EI endstream endobj 328 0 obj <>stream 0 0 0 -48 25 0 d1 25 0 0 48 0 -48 cm BI /IM true /W 25 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!?} EI endstream endobj 329 0 obj <>stream 0 0 0 0 31 48 d1 31 0 0 48 0 0 cm BI /IM true /W 31 /H 48 /BPC 1 /D[1 0] /F/CCF /DP<> ID &:\98zn~ɨ8.-xip.+ͥ!~? EI endstream endobj 330 0 obj <>stream 0 0 0 -59 39 2 d1 39 0 0 61 0 -59 cm BI /IM true /W 39 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"WQ.u0AnܚGtwK6\ e EI endstream endobj 331 0 obj <>stream 0 0 0 0 33 49 d1 33 0 0 49 0 0 cm BI /IM true /W 33 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &J =zW~__5_׺uKuivج5a@@ EI endstream endobj 332 0 obj <> endobj 333 0 obj <> endobj 337 0 obj <>endobj 338 0 obj <> endobj 339 0 obj <> endobj 343 0 obj <>endobj 344 0 obj <>stream 0 0 0 -73 32 0 d1 32 0 0 73 0 -73 cm BI /IM true /W 32 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID / EI endstream endobj 345 0 obj <>stream 0 0 0 0 58 54 d1 58 0 0 54 0 0 cm BI /IM true /W 58 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ < Fo@ޓ77?5_[im[Xam``d N  EI endstream endobj 346 0 obj <>stream 0 0 0 -73 27 13 d1 27 0 0 86 0 -73 cm BI /IM true /W 27 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID k R EI endstream endobj 347 0 obj <>stream 0 0 0 -73 28 13 d1 28 0 0 86 0 -73 cm BI /IM true /W 28 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID MB EI endstream endobj 348 0 obj <>stream 0 0 0 -47 61 -14 d1 61 0 0 33 0 -47 cm BI /IM true /W 61 /H 33 /BPC 1 /D[1 0] /F/CCF /DP<> ID d EI endstream endobj 349 0 obj <>stream 0 0 0 -72 59 2 d1 59 0 0 74 0 -72 cm BI /IM true /W 59 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &` HhzxOFޓ~ޕz__ɪu[]a0@ EI endstream endobj 350 0 obj <>stream 0 0 0 -73 66 0 d1 66 0 0 73 0 -73 cm BI /IM true /W 66 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_Y0\־׵xaxay EI endstream endobj 351 0 obj <>stream 0 0 0 0 32 73 d1 32 0 0 73 0 0 cm BI /IM true /W 32 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID /?5}==={} EI endstream endobj 352 0 obj <>stream 0 0 0 -33 30 -19 d1 30 0 0 14 0 -33 cm BI /IM true /W 30 /H 14 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 353 0 obj <> endobj 354 0 obj <> endobj 358 0 obj <>endobj 359 0 obj <>stream 0 0 0 0 44 44 d1 44 0 0 44 0 0 cm BI /IM true /W 44 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID :5&vu[kommozҽ[[o EI endstream endobj 360 0 obj <> endobj 361 0 obj <> endobj 365 0 obj <>endobj 366 0 obj <>stream 0 0 0 -59 44 0 d1 44 0 0 59 0 -59 cm BI /IM true /W 44 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID $_____J+wouGUP l EI endstream endobj 367 0 obj <>stream 0 0 0 -60 46 2 d1 46 0 0 62 0 -60 cm BI /IM true /W 46 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A1!HKOβ /H5kIN4{:zOzO&__i{i}Xkz/~9ᅃ'  EI endstream endobj 368 0 obj <>stream 0 0 0 -45 42 -6 d1 42 0 0 39 0 -45 cm BI /IM true /W 42 /H 39 /BPC 1 /D[1 0] /F/CCF /DP<> ID &a`, X XA`aPPPpprk <<0x0< EI endstream endobj 369 0 obj <>stream 0 0 0 -45 42 -6 d1 42 0 0 39 0 -45 cm BI /IM true /W 42 /H 39 /BPC 1 /D[1 0] /F/CCF /DP<> ID 8Ã&<<0`ax,,X@A`a AB  EI endstream endobj 370 0 obj <> endobj 371 0 obj <> endobj 375 0 obj <>endobj 376 0 obj <> endobj 377 0 obj <> endobj 381 0 obj <>endobj 382 0 obj <>stream 0 0 0 -61 32 13 d1 32 0 0 74 0 -61 cm BI /IM true /W 32 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID & \<.a(Ww&}5 EI endstream endobj 383 0 obj <>stream 0 0 0 -61 32 13 d1 32 0 0 74 0 -61 cm BI /IM true /W 32 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID !prj>}Z Z]_k,UUA@@ EI endstream endobj 384 0 obj <> endobj 385 0 obj <> endobj 389 0 obj <>endobj 390 0 obj <>stream 0 0 0 -59 37 0 d1 37 0 0 59 0 -59 cm BI /IM true /W 37 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0/O`_, EI endstream endobj 391 0 obj <>stream 0 0 0 -59 37 0 d1 37 0 0 59 0 -59 cm BI /IM true /W 37 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0/ EI endstream endobj 392 0 obj <>stream 0 0 0 -70 8 -43 d1 8 0 0 27 0 -70 cm BI /IM true /W 8 /H 27 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 393 0 obj <>stream 0 0 0 -42 10 0 d1 10 0 0 42 0 -42 cm BI /IM true /W 10 /H 42 /BPC 1 /D[1 0] /F/CCF /DP<> ID j7 EI endstream endobj 394 0 obj <>stream 0 0 0 0 95 112 d1 95 0 0 112 0 0 cm BI /IM true /W 95 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &x`\.]u]]yV( d5 x AaH7 7zMWz^ޗWMW_ۭ״m- l4!aX0X0Y 5yN EI endstream endobj 395 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1#O__zTzl5{" .D3 EI endstream endobj 396 0 obj <> endobj 397 0 obj <> endobj 401 0 obj <>endobj 402 0 obj <>stream 0 0 0 0 96 88 d1 96 0 0 88 0 0 cm BI /IM true /W 96 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &uʵ[}oV[}o[[}o[}o~[տ}n$L2@ EI endstream endobj 403 0 obj <>stream 0 0 0 -70 13 2 d1 13 0 0 72 0 -70 cm BI /IM true /W 13 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w&ma@ EI endstream endobj 404 0 obj <>stream 0 0 0 -72 75 2 d1 75 0 0 74 0 -72 cm BI /IM true /W 75 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܜ6)XA5NZ VkIҮK}?4tޓ^\O__i{ m׺^^{C.ׯ7?_^v.Ǿ`d`iHeR  EI endstream endobj 405 0 obj <>stream 0 0 0 0 72 70 d1 72 0 0 70 0 0 cm BI /IM true /W 72 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N ?O^HO+I+&_[ҿ[ooJF\7  EI endstream endobj 406 0 obj <> endobj 407 0 obj <> endobj 411 0 obj <>endobj 412 0 obj <> endobj 413 0 obj <> endobj 417 0 obj <>endobj 418 0 obj <>stream 0 0 0 0 93 88 d1 93 0 0 88 0 0 cm BI /IM true /W 93 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &  Y-m-n-ۯKmv봷]-m-Kbk߭-tKtOtHzMޓ}^Mzz^ޗzMޓq" EI endstream endobj 419 0 obj <> endobj 420 0 obj <> endobj 424 0 obj <>endobj 425 0 obj <> endobj 426 0 obj <> endobj 430 0 obj <>endobj 431 0 obj <>stream 0 0 0 -70 68 0 d1 68 0 0 70 0 -70 cm BI /IM true /W 68 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID *QL;un[im[um[inomk֖W}>Oz^ޗ}7MĈT_  EI endstream endobj 432 0 obj <>stream 0 0 0 -59 8 -36 d1 8 0 0 23 0 -59 cm BI /IM true /W 8 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 434 0 obj <>stream 0 0 0 -52 65 0 d1 65 0 0 52 0 -52 cm BI /IM true /W 65 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID #W5)׿ᄸk]0j@ EI endstream endobj 435 0 obj <>stream 0 0 0 0 42 68 d1 42 0 0 68 0 0 cm BI /IM true /W 42 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &<A!>?M!Lje81 EI endstream endobj 436 0 obj <>stream 0 0 0 0 29 83 d1 29 0 0 83 0 0 cm BI /IM true /W 29 /H 83 /BPC 1 /D[1 0] /F/CCF /DP<> ID )ƒww&!k  EI endstream endobj 437 0 obj <> endobj 438 0 obj <> endobj 442 0 obj <>endobj 443 0 obj <> endobj 444 0 obj <> endobj 448 0 obj <>endobj 449 0 obj <>stream 0 0 0 0 72 82 d1 72 0 0 82 0 0 cm BI /IM true /W 72 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID MBr 6  EI endstream endobj 450 0 obj <>stream 0 0 0 -82 77 0 d1 77 0 0 82 0 -82 cm BI /IM true /W 77 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID ! >q$| ?}/K/#%PBn  EI endstream endobj 451 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID a>߿kar1UPAܐ߿KbAI0\@ EI endstream endobj 452 0 obj <> endobj 453 0 obj <> endobj 457 0 obj <>endobj 458 0 obj <> endobj 459 0 obj <> endobj 463 0 obj <>endobj 464 0 obj <>stream 0 0 0 -56 61 -4 d1 61 0 0 52 0 -56 cm BI /IM true /W 61 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID .`ÓT<<<x```a<X,,,X X X@A``aPPPA@@ EI endstream endobj 465 0 obj <> endobj 466 0 obj <
> endobj 470 0 obj <>endobj 471 0 obj <> endobj 472 0 obj <
> endobj 476 0 obj <>endobj 477 0 obj <>stream 0 0 0 0 22 23 d1 22 0 0 23 0 0 cm BI /IM true /W 22 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID >/ EI endstream endobj 478 0 obj <> endobj 479 0 obj <> endobj 483 0 obj <>endobj 484 0 obj <> endobj 485 0 obj <> endobj 489 0 obj <>endobj 490 0 obj <> endobj 491 0 obj <> endobj 495 0 obj <>endobj 496 0 obj <>stream 0 0 0 -74 8 23 d1 8 0 0 97 0 -74 cm BI /IM true /W 8 /H 97 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 497 0 obj <> endobj 498 0 obj <> endobj 502 0 obj <>endobj 503 0 obj <> endobj 504 0 obj <> endobj 508 0 obj <>endobj 509 0 obj <>stream 0 0 0 0 138 88 d1 138 0 0 88 0 0 cm BI /IM true /W 138 /H 88 /BPC 1 /D[1 0] /F/CCF /DP<> ID &j cXiSt]~WOt]~]?B~ޛ}+zo龵_Jޛ}+uo}oҿ?KKoK鸑0Q  EI endstream endobj 510 0 obj <>stream 0 0 0 -90 58 0 d1 58 0 0 90 0 -90 cm BI /IM true /W 58 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID &(&  EI endstream endobj 511 0 obj <>stream 0 0 0 -59 38 0 d1 38 0 0 59 0 -59 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID  族! EI endstream endobj 512 0 obj <> endobj 513 0 obj <> endobj 517 0 obj <>endobj 518 0 obj <>stream 0 0 0 -90 65 0 d1 65 0 0 90 0 -90 cm BI /IM true /W 65 /H 90 /BPC 1 /D[1 0] /F/CCF /DP<> ID MVAoooo I7{xa={$>/ַ߭VPҰ05 -Ȃ et@ EI endstream endobj 519 0 obj <>stream 0 0 0 -60 38 0 d1 38 0 0 60 0 -60 cm BI /IM true /W 38 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID Eu!X5 EI endstream endobj 520 0 obj <> endobj 521 0 obj <> endobj 525 0 obj <>endobj 526 0 obj <> endobj 527 0 obj <> endobj 531 0 obj <>endobj 532 0 obj <> endobj 533 0 obj <> endobj 537 0 obj <>endobj 538 0 obj <>stream 0 0 0 -82 115 0 d1 115 0 0 82 0 -82 cm BI /IM true /W 115 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID aɨS0<7 }??___W____\l]  EI endstream endobj 539 0 obj <>stream 0 0 0 0 88 82 d1 88 0 0 82 0 0 cm BI /IM true /W 88 /H 82 /BPC 1 /D[1 0] /F/CCF /DP<> ID +R08p!0 ~߿_~~}/K/7xADB V EI endstream endobj 540 0 obj <> endobj 541 0 obj <> endobj 545 0 obj <>endobj 546 0 obj <> endobj 547 0 obj <> endobj 551 0 obj <>endobj 552 0 obj <>stream 0 0 0 0 49 59 d1 49 0 0 59 0 0 cm BI /IM true /W 49 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$$}әz߿_~? EI endstream endobj 553 0 obj <>stream 0 0 0 -56 46 0 d1 46 0 0 56 0 -56 cm BI /IM true /W 46 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P8A>oO׮ 5mpaa0`X <z`Ba8uk&a-0 EI endstream endobj 554 0 obj <>stream 0 0 0 -59 40 8 d1 40 0 0 67 0 -59 cm BI /IM true /W 40 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ֿ__kֿ___ֿ___ֿ___ֽkP EI endstream endobj 555 0 obj <> endobj 556 0 obj <> endobj 560 0 obj <>endobj 561 0 obj <>stream 0 0 0 -59 38 0 d1 38 0 0 59 0 -59 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID & EI endstream endobj 562 0 obj <>stream 0 0 0 -60 39 2 d1 39 0 0 62 0 -60 cm BI /IM true /W 39 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &E}ϊ -Op@}}cׯ~]Ka[[[Xaa EI endstream endobj 563 0 obj <>stream 0 0 0 0 38 62 d1 38 0 0 62 0 0 cm BI /IM true /W 38 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &aHfrqς<&?Za,|W\.|>_pkHFC  EI endstream endobj 564 0 obj <>stream 0 0 0 0 37 61 d1 37 0 0 61 0 0 cm BI /IM true /W 37 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &< qN#n߿~K4/ 뮺pC` EI endstream endobj 565 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`_5sAI~~߿~~߿Ǿ@ EI endstream endobj 566 0 obj <>stream 0 0 0 -60 38 2 d1 38 0 0 62 0 -60 cm BI /IM true /W 38 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A^C =={ Wޗqֶ҆ S40`Uo@ v=  ( EI endstream endobj 567 0 obj <>stream 0 0 0 -60 39 2 d1 39 0 0 62 0 -60 cm BI /IM true /W 39 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"BՂ$OuU^^a-Xauz:o7Oav %Y<@ EI endstream endobj 568 0 obj <> endobj 569 0 obj <> endobj 573 0 obj <>endobj 574 0 obj <>stream 0 0 0 0 93 84 d1 93 0 0 84 0 0 cm BI /IM true /W 93 /H 84 /BPC 1 /D[1 0] /F/CCF /DP<> ID &SPC0[<z===_&|'oվ}+[ȃ>8 EI endstream endobj 575 0 obj <> endobj 576 0 obj <> endobj 580 0 obj <>endobj 581 0 obj <>stream 0 0 0 0 116 105 d1 116 0 0 105 0 0 cm BI /IM true /W 116 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID "@&[o~][@4-z/Kt-K.{Kuد~ EI endstream endobj 582 0 obj <>stream 0 0 0 0 93 112 d1 93 0 0 112 0 0 cm BI /IM true /W 93 /H 112 /BPC 1 /D[1 0] /F/CCF /DP<> ID &k)# OZ"y O}>_&kjxk׃2  EI endstream endobj 583 0 obj <>stream 0 0 0 0 48 110 d1 48 0 0 110 0 0 cm BI /IM true /W 48 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID P_'L xOOOO{~kkk ,P EI endstream endobj 584 0 obj <>stream 0 0 0 0 63 100 d1 63 0 0 100 0 0 cm BI /IM true /W 63 /H 100 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A$Aވ } ߿^eq?)&_ EI endstream endobj 585 0 obj <>stream 0 0 0 0 86 79 d1 86 0 0 79 0 0 cm BI /IM true /W 86 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ATXx@zoDGzM7ޓ}7zj_m~zKa- ,,,X EI endstream endobj 586 0 obj <>stream 0 0 0 0 98 77 d1 98 0 0 77 0 0 cm BI /IM true /W 98 /H 77 /BPC 1 /D[1 0] /F/CCF /DP<> ID &I0.Ii\5%㺉&[[[Xaa5PYz EI endstream endobj 587 0 obj <>stream 0 0 0 0 85 79 d1 85 0 0 79 0 0 cm BI /IM true /W 85 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID & d+>Ow0F~xU(/c22 F?ƽkK q]p`!fA\p EI endstream endobj 588 0 obj <>stream 0 0 0 0 48 110 d1 48 0 0 110 0 0 cm BI /IM true /W 48 /H 110 /BPC 1 /D[1 0] /F/CCF /DP<> ID P_ EI endstream endobj 589 0 obj <>stream 0 0 0 -105 97 0 d1 97 0 0 105 0 -105 cm BI /IM true /W 97 /H 105 /BPC 1 /D[1 0] /F/CCF /DP<> ID P~L@GɀCm@ EI endstream endobj 590 0 obj <>stream 0 0 0 0 87 75 d1 87 0 0 75 0 0 cm BI /IM true /W 87 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID #BɨR0@ntۭ.m-mwK߭KK_=={OoJ&ҽ&$\d EI endstream endobj 591 0 obj <>stream 0 0 0 0 92 107 d1 92 0 0 107 0 0 cm BI /IM true /W 92 /H 107 /BPC 1 /D[1 0] /F/CCF /DP<> ID !`MB`Q"? (}?M7__߿]^ %]EH-,P EI endstream endobj 592 0 obj <>stream 0 0 0 0 70 79 d1 70 0 0 79 0 0 cm BI /IM true /W 70 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0)NMK)f!ûapԚ 9.@LpKKK\ 2H4P#a izd~m}v׆`v= S $@ EI endstream endobj 593 0 obj <>stream 0 0 0 0 77 70 d1 77 0 0 70 0 0 cm BI /IM true /W 77 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID g5#0"׺ۯ^unvk٘hׯu^zׯu^[~P EI endstream endobj 594 0 obj <>stream 0 0 0 0 50 52 d1 50 0 0 52 0 0 cm BI /IM true /W 50 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?E~k55 ,@ EI endstream endobj 595 0 obj <>stream 0 0 0 0 62 75 d1 62 0 0 75 0 0 cm BI /IM true /W 62 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h+ Ӌ5& Kxiq5{ _? EI endstream endobj 596 0 obj <>stream 0 0 0 0 65 52 d1 65 0 0 52 0 0 cm BI /IM true /W 65 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &5$2j>O*C }!  EI endstream endobj 597 0 obj <>stream 0 0 0 0 54 54 d1 54 0 0 54 0 0 cm BI /IM true /W 54 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &6H0<'BoD@G7O_ƣjvKl%[Xk ,0` ) EI endstream endobj 598 0 obj <>stream 0 0 0 0 47 54 d1 47 0 0 54 0 0 cm BI /IM true /W 47 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g)ܧnu}&c A\ kˆPPR4\",zY5U{]c}dhpd y EI endstream endobj 599 0 obj <>stream 0 0 0 0 45 73 d1 45 0 0 73 0 0 cm BI /IM true /W 45 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &#QMaA^[kmqdA EI endstream endobj 600 0 obj <>stream 0 0 0 -72 71 2 d1 71 0 0 74 0 -72 cm BI /IM true /W 71 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H D$ x@8@ zOKץ_? FUw]mw]]a  aA EI endstream endobj 601 0 obj <>stream 0 0 0 0 62 72 d1 62 0 0 72 0 0 cm BI /IM true /W 62 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID #`Q[ O%_4/W_]kK*T%“Pi ! EI endstream endobj 602 0 obj <>stream 0 0 0 0 58 54 d1 58 0 0 54 0 0 cm BI /IM true /W 58 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &a"U%p r5_߲|>5k,rc^ q]u EI endstream endobj 603 0 obj <>stream 0 0 0 0 62 75 d1 62 0 0 75 0 0 cm BI /IM true /W 62 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &41^eOD"$ǂ"~K5_]ovk h ? EI endstream endobj 604 0 obj <>stream 0 0 0 -70 36 9 d1 36 0 0 79 0 -70 cm BI /IM true /W 36 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID ({߿߿߿߿߿߿߿߿߿߿ EI endstream endobj 605 0 obj <>stream 0 0 0 -52 52 2 d1 52 0 0 54 0 -52 cm BI /IM true /W 52 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ < !7 G7^]ɪA@]mxkc  ^ EI endstream endobj 606 0 obj <>stream 0 0 0 0 61 50 d1 61 0 0 50 0 0 cm BI /IM true /W 61 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID & +޿t}oo_~[}oȀ EI endstream endobj 607 0 obj <>stream 0 0 0 0 97 52 d1 97 0 0 52 0 0 cm BI /IM true /W 97 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID l_55 q״\0 ĈCҭ m5 MAad5>stream 0 0 0 0 66 73 d1 66 0 0 73 0 0 cm BI /IM true /W 66 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID #GMFkz_^z^]]uׯko7~o8O EI endstream endobj 609 0 obj <>stream 0 0 0 0 62 74 d1 62 0 0 74 0 0 cm BI /IM true /W 62 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$^DɔwþoM}?߿ ~]A?O~߿av?[%\0ai5 EI endstream endobj 610 0 obj <>stream 0 0 0 -70 62 0 d1 62 0 0 70 0 -70 cm BI /IM true /W 62 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 0? EI endstream endobj 611 0 obj <>stream 0 0 0 -70 37 0 d1 37 0 0 70 0 -70 cm BI /IM true /W 37 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID F L EI endstream endobj 612 0 obj <>stream 0 0 0 0 61 72 d1 61 0 0 72 0 0 cm BI /IM true /W 61 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &D}oo~_^?_??b}>?OzOW?WwG EI endstream endobj 613 0 obj <>stream 0 0 0 -70 74 0 d1 74 0 0 70 0 -70 cm BI /IM true /W 74 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Q PO' OČ  EI endstream endobj 614 0 obj <>stream 0 0 0 -70 98 0 d1 98 0 0 70 0 -70 cm BI /IM true /W 98 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID *Sf`!O??_Io&o[I_VcF~ EI endstream endobj 615 0 obj <>stream 0 0 0 -70 79 2 d1 79 0 0 72 0 -70 cm BI /IM true /W 79 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &C yXAT: _M___E#@ EI endstream endobj 616 0 obj <>stream 0 0 0 -70 83 0 d1 83 0 0 70 0 -70 cm BI /IM true /W 83 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID "Q#02`B, EI endstream endobj 617 0 obj <>stream 0 0 0 0 66 70 d1 66 0 0 70 0 0 cm BI /IM true /W 66 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID %QCp_`~/ ^Y @ EI endstream endobj 618 0 obj <>stream 0 0 0 -70 80 0 d1 80 0 0 70 0 -70 cm BI /IM true /W 80 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID *%]uQ______}}}}U____~__~__|W_____}}}}}Vk EI endstream endobj 619 0 obj <> endobj 620 0 obj <> endobj 621 0 obj <>stream x]n0D KJCYPC\08$O/^֞~yY~\?RK}[Fr;qkN/PF|FNcK6ysS鿡T3dW:]!fcv+l]S)Bd!r)R]! +D]3NY {kC' 8!`|6 8!`f'RF 8!`Lf'Of'-MBR`&VGFV!oBg>U*yUSƫ`UP*yk;DZ V%` VZ( V%owB`U&ZjyT:mU=_ EUk  u: q 7 PBF !7 b@.PQkt^ZF665F8 .deX;v7*e7ž{mƇ=ZfnU 5h endstream endobj 622 0 obj 529 endobj 433 0 obj <>/FontMatrix[1 0 0 1 0 0]/FontBBox[0 0 1000 1000]/FirstChar 0/LastChar 64/Widths[ 727 462 602 703 752 602 838 602 337 1123 696 602 696 602 1107 867 602 602 602 602 602 602 602 602 602 602 872 776 699 380 462 667 727 648 380 762 596 699 563 776 527 699 727 636 563 430 854 699 648 699 365 609 581 1058 693 699 703 468 581 872 1107 872 945 752 914] /Subtype/Type3>> endobj 623 0 obj <>stream xeKn7 OdyI1tE,m8ɢ  >ϧ_~ӟ?{ic}.JGh#kmRi,SC{-8%oKwX]\˺rF,~X*^׈e]de˪,׈eM׈es5b~Xau=^9au]XzSXz}%VCS)qXz"KNթ+cu=XzCXz3VCoթL:N\c=$^Ɇջ6ͥ1sE'jLlIn@5&kLŽuϖ^ ;ֽZw{{_}/Y]֟r endstream endobj 624 0 obj 1522 endobj 10 0 obj <>/FontMatrix[1 0 0 1 0 0]/FontBBox[0 -17 1000 1000]/FirstChar 0/LastChar 255/Widths[ 667 644 644 636 636 1024 1024 1024 636 636 636 636 337 337 802 644 644 644 337 856 318 948 948 948 948 948 948 565 565 560 560 500 500 500 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 854 776 500 468 914 744 703 730 762 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 527 527 527 867 602 602 602 602 602 602 602 602 602 602 602 602 370 370 390 390 500 838 460 640 752 831 871 872 796 602 602 602 602 602 602 602 602 602 602 318 606 722 714 602 602 602 710 602 685 602 602 602 602 602 602 602 602 602 602 765 338 694 390 390 838 337 875 843 664 753 914 854 776 500 796 831 762 744 871 710 468 945 602 602 838 696 945 722 602 602 602 636 592 636 636 636 636 636 1028 1107 602 869 845 310 735 747 747 602 602 602 602 838 602 602 660 602 602 602 602 602 602 602 730 636 636 636 636 380 667 473 473 838 696 727 380 415 602 602 602 602 602 602 602 602 602 275 602 871 602 776 402 890 722 776 712 602] /Subtype/Type3>> endobj 236 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-182 -235 1287 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 625 0 obj <> endobj 8 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-182 -235 1287 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 626 0 obj <> endobj 114 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-18 -235 606 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 627 0 obj <> endobj 45 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-4 -235 606 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 628 0 obj <> endobj 104 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-185 -235 1361 939]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 629 0 obj <> endobj 9 0 obj <> endobj 2 0 obj <>endobj xref 0 630 0000000000 65535 f 0000188272 00000 n 0000279308 00000 n 0000187838 00000 n 0000179612 00000 n 0000000015 00000 n 0000002398 00000 n 0000188320 00000 n 0000276003 00000 n 0000278071 00000 n 0000271166 00000 n 0000188361 00000 n 0000188573 00000 n 0000188799 00000 n 0000189042 00000 n 0000189305 00000 n 0000189520 00000 n 0000189793 00000 n 0000190042 00000 n 0000190254 00000 n 0000190498 00000 n 0000190748 00000 n 0000191011 00000 n 0000191247 00000 n 0000191445 00000 n 0000191679 00000 n 0000191930 00000 n 0000192166 00000 n 0000192387 00000 n 0000192636 00000 n 0000192856 00000 n 0000193109 00000 n 0000193288 00000 n 0000193539 00000 n 0000193782 00000 n 0000193985 00000 n 0000194209 00000 n 0000194478 00000 n 0000194717 00000 n 0000194941 00000 n 0000195195 00000 n 0000195436 00000 n 0000195685 00000 n 0000195849 00000 n 0000196056 00000 n 0000277036 00000 n 0000196288 00000 n 0000196533 00000 n 0000196759 00000 n 0000196926 00000 n 0000197143 00000 n 0000197392 00000 n 0000197621 00000 n 0000197804 00000 n 0000198015 00000 n 0000198203 00000 n 0000198413 00000 n 0000198613 00000 n 0000198838 00000 n 0000199029 00000 n 0000199264 00000 n 0000199484 00000 n 0000199703 00000 n 0000199900 00000 n 0000200114 00000 n 0000200327 00000 n 0000200535 00000 n 0000200758 00000 n 0000200947 00000 n 0000201189 00000 n 0000201398 00000 n 0000201643 00000 n 0000201673 00000 n 0000179780 00000 n 0000002418 00000 n 0000004872 00000 n 0000201723 00000 n 0000201765 00000 n 0000201982 00000 n 0000202199 00000 n 0000202439 00000 n 0000202646 00000 n 0000202678 00000 n 0000179950 00000 n 0000004893 00000 n 0000006865 00000 n 0000202708 00000 n 0000202750 00000 n 0000202976 00000 n 0000203204 00000 n 0000203405 00000 n 0000203610 00000 n 0000203833 00000 n 0000204031 00000 n 0000204258 00000 n 0000204461 00000 n 0000204687 00000 n 0000204905 00000 n 0000205134 00000 n 0000205166 00000 n 0000180120 00000 n 0000006886 00000 n 0000010934 00000 n 0000205196 00000 n 0000277648 00000 n 0000205239 00000 n 0000205534 00000 n 0000205793 00000 n 0000205964 00000 n 0000206179 00000 n 0000206458 00000 n 0000206681 00000 n 0000206899 00000 n 0000207145 00000 n 0000276606 00000 n 0000207378 00000 n 0000207594 00000 n 0000207819 00000 n 0000208022 00000 n 0000208245 00000 n 0000208485 00000 n 0000208707 00000 n 0000208875 00000 n 0000209073 00000 n 0000209267 00000 n 0000209471 00000 n 0000209698 00000 n 0000209901 00000 n 0000210102 00000 n 0000210325 00000 n 0000210546 00000 n 0000210761 00000 n 0000211006 00000 n 0000211223 00000 n 0000211497 00000 n 0000211746 00000 n 0000212019 00000 n 0000212256 00000 n 0000212464 00000 n 0000212673 00000 n 0000212875 00000 n 0000213085 00000 n 0000213313 00000 n 0000213508 00000 n 0000213738 00000 n 0000213960 00000 n 0000214178 00000 n 0000214370 00000 n 0000214568 00000 n 0000214797 00000 n 0000215005 00000 n 0000215236 00000 n 0000215468 00000 n 0000215724 00000 n 0000215974 00000 n 0000216158 00000 n 0000216410 00000 n 0000216665 00000 n 0000216941 00000 n 0000217233 00000 n 0000217500 00000 n 0000217792 00000 n 0000218000 00000 n 0000218238 00000 n 0000218431 00000 n 0000218629 00000 n 0000218843 00000 n 0000219062 00000 n 0000219302 00000 n 0000219490 00000 n 0000219693 00000 n 0000219941 00000 n 0000220135 00000 n 0000220377 00000 n 0000220696 00000 n 0000220949 00000 n 0000221176 00000 n 0000221376 00000 n 0000221580 00000 n 0000221809 00000 n 0000222016 00000 n 0000222294 00000 n 0000222329 00000 n 0000180294 00000 n 0000010956 00000 n 0000015421 00000 n 0000222386 00000 n 0000222429 00000 n 0000222637 00000 n 0000222869 00000 n 0000223060 00000 n 0000223253 00000 n 0000223462 00000 n 0000223633 00000 n 0000223859 00000 n 0000224046 00000 n 0000224260 00000 n 0000224477 00000 n 0000224748 00000 n 0000224919 00000 n 0000225142 00000 n 0000225338 00000 n 0000225541 00000 n 0000225723 00000 n 0000225932 00000 n 0000226198 00000 n 0000226450 00000 n 0000226660 00000 n 0000226914 00000 n 0000227186 00000 n 0000227472 00000 n 0000227726 00000 n 0000227897 00000 n 0000228184 00000 n 0000228449 00000 n 0000228679 00000 n 0000228899 00000 n 0000229186 00000 n 0000229413 00000 n 0000229623 00000 n 0000229869 00000 n 0000230094 00000 n 0000230129 00000 n 0000180468 00000 n 0000015443 00000 n 0000020893 00000 n 0000230160 00000 n 0000230203 00000 n 0000230433 00000 n 0000230681 00000 n 0000230902 00000 n 0000231140 00000 n 0000231450 00000 n 0000231668 00000 n 0000231840 00000 n 0000232042 00000 n 0000275774 00000 n 0000232319 00000 n 0000232562 00000 n 0000232834 00000 n 0000233075 00000 n 0000233315 00000 n 0000233562 00000 n 0000233597 00000 n 0000180642 00000 n 0000020915 00000 n 0000025102 00000 n 0000233641 00000 n 0000233684 00000 n 0000233907 00000 n 0000233942 00000 n 0000180816 00000 n 0000025124 00000 n 0000029750 00000 n 0000233973 00000 n 0000234016 00000 n 0000234305 00000 n 0000234601 00000 n 0000234844 00000 n 0000234879 00000 n 0000180990 00000 n 0000029772 00000 n 0000033710 00000 n 0000234910 00000 n 0000234953 00000 n 0000234988 00000 n 0000181156 00000 n 0000033732 00000 n 0000037537 00000 n 0000235019 00000 n 0000235062 00000 n 0000235343 00000 n 0000235628 00000 n 0000235856 00000 n 0000236112 00000 n 0000236147 00000 n 0000181330 00000 n 0000037559 00000 n 0000042314 00000 n 0000236178 00000 n 0000236221 00000 n 0000236479 00000 n 0000236754 00000 n 0000236789 00000 n 0000181504 00000 n 0000042336 00000 n 0000047327 00000 n 0000236820 00000 n 0000236863 00000 n 0000237075 00000 n 0000237276 00000 n 0000237498 00000 n 0000237743 00000 n 0000237954 00000 n 0000238136 00000 n 0000238330 00000 n 0000238365 00000 n 0000181678 00000 n 0000047349 00000 n 0000052180 00000 n 0000238396 00000 n 0000238439 00000 n 0000238678 00000 n 0000238881 00000 n 0000239094 00000 n 0000239129 00000 n 0000181852 00000 n 0000052202 00000 n 0000055416 00000 n 0000239160 00000 n 0000239203 00000 n 0000239410 00000 n 0000239623 00000 n 0000239815 00000 n 0000239850 00000 n 0000182026 00000 n 0000055438 00000 n 0000058886 00000 n 0000239881 00000 n 0000239924 00000 n 0000240133 00000 n 0000240372 00000 n 0000240407 00000 n 0000182200 00000 n 0000058908 00000 n 0000062159 00000 n 0000240438 00000 n 0000240481 00000 n 0000240706 00000 n 0000240910 00000 n 0000241131 00000 n 0000241367 00000 n 0000241589 00000 n 0000241624 00000 n 0000182374 00000 n 0000062181 00000 n 0000065708 00000 n 0000241655 00000 n 0000241698 00000 n 0000241733 00000 n 0000182540 00000 n 0000065730 00000 n 0000069959 00000 n 0000241764 00000 n 0000241807 00000 n 0000242014 00000 n 0000242254 00000 n 0000242449 00000 n 0000242652 00000 n 0000242835 00000 n 0000243091 00000 n 0000243328 00000 n 0000243540 00000 n 0000243714 00000 n 0000243749 00000 n 0000182714 00000 n 0000069981 00000 n 0000075203 00000 n 0000243780 00000 n 0000243823 00000 n 0000244043 00000 n 0000244078 00000 n 0000182888 00000 n 0000075225 00000 n 0000079349 00000 n 0000244109 00000 n 0000244152 00000 n 0000244370 00000 n 0000244630 00000 n 0000244858 00000 n 0000245085 00000 n 0000245120 00000 n 0000183062 00000 n 0000079371 00000 n 0000082404 00000 n 0000245151 00000 n 0000245194 00000 n 0000245229 00000 n 0000183228 00000 n 0000082426 00000 n 0000085731 00000 n 0000245260 00000 n 0000245303 00000 n 0000245531 00000 n 0000245758 00000 n 0000245793 00000 n 0000183402 00000 n 0000085753 00000 n 0000089855 00000 n 0000245824 00000 n 0000245867 00000 n 0000246058 00000 n 0000246244 00000 n 0000246416 00000 n 0000246598 00000 n 0000246920 00000 n 0000247144 00000 n 0000247179 00000 n 0000183576 00000 n 0000089877 00000 n 0000093572 00000 n 0000247210 00000 n 0000247253 00000 n 0000247517 00000 n 0000247728 00000 n 0000248030 00000 n 0000248277 00000 n 0000248312 00000 n 0000183750 00000 n 0000093594 00000 n 0000097648 00000 n 0000248343 00000 n 0000248386 00000 n 0000248421 00000 n 0000183916 00000 n 0000097670 00000 n 0000101428 00000 n 0000248452 00000 n 0000248495 00000 n 0000248773 00000 n 0000248808 00000 n 0000184090 00000 n 0000101450 00000 n 0000105039 00000 n 0000248839 00000 n 0000248882 00000 n 0000248917 00000 n 0000184256 00000 n 0000105061 00000 n 0000108994 00000 n 0000248948 00000 n 0000248991 00000 n 0000249253 00000 n 0000268273 00000 n 0000249424 00000 n 0000249650 00000 n 0000249875 00000 n 0000250087 00000 n 0000250122 00000 n 0000184430 00000 n 0000109016 00000 n 0000112190 00000 n 0000250163 00000 n 0000250206 00000 n 0000250241 00000 n 0000184596 00000 n 0000112212 00000 n 0000115761 00000 n 0000250272 00000 n 0000250315 00000 n 0000250531 00000 n 0000250781 00000 n 0000250999 00000 n 0000251034 00000 n 0000184770 00000 n 0000115783 00000 n 0000118827 00000 n 0000251075 00000 n 0000251118 00000 n 0000251153 00000 n 0000184936 00000 n 0000118849 00000 n 0000122228 00000 n 0000251184 00000 n 0000251227 00000 n 0000251477 00000 n 0000251512 00000 n 0000185110 00000 n 0000122250 00000 n 0000125694 00000 n 0000251553 00000 n 0000251596 00000 n 0000251631 00000 n 0000185276 00000 n 0000125716 00000 n 0000129457 00000 n 0000251672 00000 n 0000251715 00000 n 0000251892 00000 n 0000251927 00000 n 0000185450 00000 n 0000129479 00000 n 0000132294 00000 n 0000251968 00000 n 0000252011 00000 n 0000252046 00000 n 0000185616 00000 n 0000132316 00000 n 0000134951 00000 n 0000252077 00000 n 0000252120 00000 n 0000252155 00000 n 0000185782 00000 n 0000134973 00000 n 0000137826 00000 n 0000252186 00000 n 0000252229 00000 n 0000252409 00000 n 0000252444 00000 n 0000185956 00000 n 0000137848 00000 n 0000140892 00000 n 0000252485 00000 n 0000252528 00000 n 0000252563 00000 n 0000186122 00000 n 0000140914 00000 n 0000143354 00000 n 0000252604 00000 n 0000252647 00000 n 0000252958 00000 n 0000253188 00000 n 0000253395 00000 n 0000253430 00000 n 0000186296 00000 n 0000143376 00000 n 0000146703 00000 n 0000253471 00000 n 0000253514 00000 n 0000253776 00000 n 0000254000 00000 n 0000254035 00000 n 0000186470 00000 n 0000146725 00000 n 0000150420 00000 n 0000254076 00000 n 0000254119 00000 n 0000254154 00000 n 0000186636 00000 n 0000150442 00000 n 0000153802 00000 n 0000254195 00000 n 0000254238 00000 n 0000254273 00000 n 0000186802 00000 n 0000153824 00000 n 0000157482 00000 n 0000254304 00000 n 0000254347 00000 n 0000254640 00000 n 0000254903 00000 n 0000254938 00000 n 0000186976 00000 n 0000157504 00000 n 0000161105 00000 n 0000254979 00000 n 0000255022 00000 n 0000255057 00000 n 0000187142 00000 n 0000161127 00000 n 0000165930 00000 n 0000255098 00000 n 0000255141 00000 n 0000255376 00000 n 0000255642 00000 n 0000255864 00000 n 0000255899 00000 n 0000187316 00000 n 0000165952 00000 n 0000170436 00000 n 0000255940 00000 n 0000255983 00000 n 0000256195 00000 n 0000256446 00000 n 0000256684 00000 n 0000256909 00000 n 0000257134 00000 n 0000257380 00000 n 0000257635 00000 n 0000257670 00000 n 0000187490 00000 n 0000170458 00000 n 0000173990 00000 n 0000257711 00000 n 0000257754 00000 n 0000258017 00000 n 0000258052 00000 n 0000187664 00000 n 0000174012 00000 n 0000179590 00000 n 0000258093 00000 n 0000258136 00000 n 0000258419 00000 n 0000258710 00000 n 0000258948 00000 n 0000259198 00000 n 0000259472 00000 n 0000259718 00000 n 0000260000 00000 n 0000260224 00000 n 0000260474 00000 n 0000260731 00000 n 0000261014 00000 n 0000261302 00000 n 0000261544 00000 n 0000261759 00000 n 0000262006 00000 n 0000262231 00000 n 0000262471 00000 n 0000262720 00000 n 0000262946 00000 n 0000263218 00000 n 0000263466 00000 n 0000263712 00000 n 0000263966 00000 n 0000264190 00000 n 0000264438 00000 n 0000264662 00000 n 0000264914 00000 n 0000265153 00000 n 0000265423 00000 n 0000265636 00000 n 0000265843 00000 n 0000266091 00000 n 0000266324 00000 n 0000266595 00000 n 0000266849 00000 n 0000267081 00000 n 0000267316 00000 n 0000267574 00000 n 0000267609 00000 n 0000267650 00000 n 0000268252 00000 n 0000269549 00000 n 0000271144 00000 n 0000275949 00000 n 0000276176 00000 n 0000276779 00000 n 0000277207 00000 n 0000277823 00000 n trailer << /Size 630 /Root 1 0 R /Info 2 0 R /ID [(Һibiܥz)(Һibiܥz)] >> startxref 279419 %%EOF ga-5-4/doc/ga/ga_doc.pdf0000644000175000017500000361301412662210474013107 0ustar mbamba%PDF-1.3 % 1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>stream xctem6۶mWRmgǶmWlvŶmGݧ{}O\sJƶ1['zfD¶ ; 9F H `L$0"ba!b!sw075s"RQT/?"Dt47!>l6NcE% @dbn א'U! ͍̍6j"[o?"#[cBsdvBБȀ`dp3â#8X;:~L lsdKdncdlt}9~KXm휈ʋNfNv4fٚ|K9o,`N6DNo-!7pv41/VGoo_qYK_R郹#ʄۦӷmSsDĖvs8+AT ƶ6VDFY[QϪ@Vk_#K9C9[YX7/"#H:|w`bnQ `,oddFdb`=m'gfw)Y|O69 _snɿS^~GIH֍ȓ{YXq|[df )c`F#"'M3JN6߫? s{gw,L\le5q_KpDC/`ki_X' [+u&>-mݘHg:5:lX?܂ q5] `nkQn$wAM0ϓz1^^ʲ;_E! Fq5 ם:ˆF^Cg :|eY+sW#HKP<:ς`%QJN8by6me_+]_;*O}/]Au6M_mƦlwT1<3 l.!y")(\1+7=\'nVNYڭD1$UEIXC VCmPYBu]_ ^6xj`:B<6=p5Xy s6n!t>TL~e ZzseB\o|Ugۀ/\ t "wҊ?8'N4Bf)#nYW dk8c*(R je{ Fzow$`EQ#"RXנmEvK@ c,϶1{X6TC\Fon-5ZE2EÉ', 테T@Q|]DiU  XLX;ADjN<(U='@Ogj| ܂2q|1)CEi"tS%I?bT-q e@h1di!V`sk"5$@ 61$@`θHh} 4n,,#&¨6PW٨xAoDgD$!.VkdxWziu_d׌9OMBޫ8d8Sq7`$ DG㵒IR XoDꩋh Χ6Hn(:mYZJk:Ȃ"D;߷ˑqS_5$LEgsʂ 7'o?Zl锒ۚ-Dè[G/ >Oj⪣bj\4z {RP=O%Qo_x061gwH{k1=pfsU[ݠ97k8 bt jC'.0%3/B޲;a[cr ) T9pd&Ra (= 'i= ,\)s{RI$FiB93y-%ckALґ$ZJ{3ex2V'(}g#63LdEךMmAufV>(2yu^Rn[89Y P >*?TWVwP pWC{Ym`q̵ kޔ;;44"`HKW x7*#/g7zC`|izB`"n(5`hyNMq\pIV\Y_ѥtjbg˔c*KXЈ93(f[+B{RF38wF=@KKBmà3Z(hKwQ* s<&kGb0ѹGB ]qoyŖPcju2ي-W0HSdVc׮B]7H&31d/EU. k0j_@sېWSbeJ3Ww# {I<_-(uő6F<;r- _?40vu+ dyn+M49DJ"Q%BVP5u6`k$'0nF4 fAf>f(` )h7eX2RU{NN8?կHwc :|/ ʷ9&57ĊU>".H"J}0xpN=[7p>1{h{4_C XiIEyпYd+ o=` =KQӨ:8wo`=r`'JTF|PSCXeoΎS{'͛$g@W&9JYSgdLɒf:s%_DII 5-z3;ќB]Qח1,r~ q}=n#/P$zv+| Hѯ,x}h,Ork"-dJz0ْL┹ %jg!2608>v`N9uӹR[ID|k.k~6tX;Ej&jʡ q!U^7^*P%nPJM1)…PcC+DaioE@ϵԏsd~y:ކ+TszQSKC&Uf:rȾOښB!f*x]毞FwJwƭe[3Е:Yg ! r抏YٿSeș܍}Eyi/8P3M@Wemp-.1q1r-,"xcow5%ǭ T?$а6\O*?w؃.FYL RoD GgdmuD-!F{(\k?qIx "d72Ed+ :{|GzYV޲ЗvOpl©>DwjxPUKر]ȣPPڿ܀mx6EkF*)g'9B@7Aq]bp!@LG(oK~wƸ)u/%>t!ijp9v+ [Aa+dą I$QtK '98we8J"~ꆸhqϦu!!L@Mߧ tUpQsG=_]h1|{0 qZWO9~ 0N|<z=) V}&qřwtPdh䴖xM22 `2,NeguXp#6PI[U )l[ouos1:* qTe S)Mth)wL+dyJUoSwP|zcvkW&Va4*Fʶиm$YɌۻT'=MlOmxuy[6Zi߉`$m&{i F* zn`Q%eS5RoGzTb1p 5juG vq6ѐ A HNщO^(#-IF?;ٸj#&Ccl.oŞ(:ɷ5@ru56 e7&Jдϭٵz4=<ֿT~>/UACGpp OθTK<7qz8gܼ4nK#s pRS{Oxq1ʘQ+n+ܥ0+zcT=_C;]#ch"5mʱS$%}O2 >3[B7Fއbcirs0#B^CI'x/ R33RG;vWԃtmg 遥MGɰ<'&QG>nlDT}A,!\p9eeW׾B$ ܌kjHz-3[CI.caw vnJS+iw"VݲXkL+|6\HZh%PtLvjy5Y1rV-qM!l+u2t8If;Mp3J3@;Om7]쎱Q2&wsj+_&8 H+к,hx|1NB D)x'{OSdn]h1;F6PP3u Y3 rn>:ŷS?k)+BeJ$z"Ѫ6thp:*Tg^qx5УS bMOԡr8؅ewN&'F)`džXo6!L҉quh;+ͧcĈ(*(1LKܺV(Τup \6Q׉4itН?=)nc`}a ΅ !o %_h/ra=h)zk_Lb= Z@#a_18^XNEI@*oOjO^IƪXv~E`Ts$[+(PMmAϱSHJ"+(o~#I/|JIE qr~pJڡfEՂl2#vg*S? f! xT և `i1UuPZb% 8B})߭ݻ;4p='ٵmW0? w泺P3]hC4hNksIP4 ڔ^~VOmrj_l`yn  f甇o֖IkzK>-b".'u`ң.3<#A\Ӑ{3\+Q*UCm<&%$Ɂk8+>"C-j푍I uҪq!o;f\q: .SI$#sq@HԇHRЇ_F%EVsڔl-'z)G JeSIirVRXU3TmL@ymSg %E7_?0f򧥴@.{~a]!ą;Ot+2;CS-b )'l 6Yv` HtX=~^A9H,ǩM|MӤ|hkV>~ESuJLZh=~nk[f=4!oVdh2z V7=zšv05"I+sm;EGro` 8E'' HuPXzS%opk}/R@(1=ĪT꧒Wo&7Dquz|OpStG"e;A"ԃrR)uuz,Y{elw+י0$JZ=V&Ͷ4U't a#g+/5h,_ULW˜]Cӓ?Z!k-fiu>lqx' SX>PkZE#<_~EWr {@ $9h\|<锩j"‚}BUXwEN=^0#!%=Z(sVJLc̹ړ~L6Ъ{} na#fKkۨE :+%[ q-;]33Iu ^~cdZ(<ʼC>cL@C8tŽ^JH1δE#5&E[7\Y}g'yh Iި{Hhb3u,4 Tg!-Uխ%HaBliSm3kvOꨏೳuM#ئ#dl^Ngl+LUEKg\o} fM9KF"[(ȿ/ oEDj-o.:c=@Ky@~֠~\XU%aJ[{u4BbNܣR^!0\}yYi| [V'S+svջ<')[p|g[\Hot9!; F{$, .8uw vBυ;vuK6}⍐*Dv57{9/hSc% @H6.jky@պ 'di.*1nHL.2f_>I r'U2CӇ;;g1 Sy4$x*q$2zJd_= ZHw~e¥X[m\eՋt3K%5*BS>{AܵupٝȪL_=潳.[i!iURѶ%ȧNd.i‘U\~qKc0I5YRA2:`+O/lAaQehܦsڸ,|T_B~9΋F(BD?fP/F/ M< c0RiPu { ǀ0BςoU*)?ˈO/gT#"[Q ^_c|af[7W1*=!RHz`j]ҌyY?FADg6Ձ4YQ]xo,6䀘1/[slRڕ}͎9,&^H-JdW ~cs ev'i& R'~ hr ya/( 顷awSj_ A#zL%78 o% ujX2aG <᯻jQAĹ2>Jk ~&?0ڼ/p򛔗M s$OZOk8f`nT6 OE}Vb'h֗DFA޵ӑ] W&Gb)  /TT,JvF-4?f ̋c*ggH\n1BD"AG=nB7a8K[ 5Q3Rv[<ϟX|ҳ.{@bR M̲/˓,^ fX&aN̮=\+V`qrڟH*idHm5 `0c.~yM*a[s;HK/}HcؚLς泬Ӵ{Oy~CcA:DF5iٝ`k/p=l׺U|4~iddt㊫*XhCפz"ІRIa EJTKm: 64PV4 Y1gp+6v_M }ޝv1$ ]_e= D=hK^k*q4Ĺ}JǞ}ׄD""v1s`pY(@bC)\P4XPt3χvj_#yf>;I)#xP(& ՑSQ!wWUIYw]n"UX.]i "s}K$3 KYv{;G+t7=ht8eJRXRw?2fdpKx%^e/l:e- ].b~0ɯEpNM~2n9x 3ԄguM/PE@Y|CU~uJl. DjH? gphQ^k>~5!Ln,kOlQA^@|1a؜4=gjFd: }Ǫf6: {]lڂ2l KTt և+c=M*+"tn&Ae&/v\ y5QE:Q˯x5 ڣL&NM5^Zג{}ȥZ"^c6g⢒:abH2><](9RM5}2{y0Bu#u}V'* QYidBUhC$XL0"X{L6^-U5QG|~r\c* d LRJvtA- q/1L?끡:(~Ws!ڂ\9& cXiۮ8+ɷ<@hlW9™Q!IeU0fXgџ_koˀ`okCPEi6H# &-b-x%2&z[؍  n"\HsqOka Ip#BNjo[ S4\86ׯ0m@5y~ ɮq'I1旻LO`wcoKʆf`0d *y8ٵ/Y1$t^!jLM(+bVYȅ|Ђ4 h|R\T[Ԡ$Nz>{d &]1|^"W%e2O&Ҩ澦f}XSMI_ S2U S@ Rxa#' Q?j¦PAQ\Kw/8U- zy'QDhj7rr^; 뉤$hk}<#X~c0B(0"RU& E| |R8Q-Qoc^LT[vG̗5*^b&=8a4fTT#yPO4Fy#WR> 2Pg7?nVp_f;T݌0a{If#BG -+b5^,ylT̋YtxY(#'|l!Kk ?QIJ]Kx]5j F' Ҁ+Ag't,;0=S&1N?E{8"3wnY`gkuvm1 Gz{D;A (V;aJ-c-3yɫ Nx" o&B43B Y*Y,G} &TH&#`>!aC?{I?áE< ۲ 7M 2znOעÖa+mת(De? G,a9x 3SV:.?K*4J@l1oClݭ,+pGhy#!Ugp|pAOANj0p6!lR8ӓlv}ˈnԘieT_$4bC3#:H4  VRLID 5D&͘900[`Ya*fzn*]<(v_iv9xJ읜UoJ~ʋ#W}1d<&iԀ/<(g c5;OuQ&wSc>"?uAOݽ]"YSq1]^LqJh#Q^!I~I.1kmP@Nu jG'V,6T-9E>?P@(n,\ Or HވIS:G`l ;):c".fʳI9F(hCT6}ٮ~(H˂ލiyݴn&4P;̏ lq:ਡ]LR1sS[l^?i֔ %toB{|* giu s2aI3;-Ԝ/9oV؄HH (<7I+DO3E:Էv] ?/@ @rKV|ՎHq#Y 60G5Po/9mʵV~*Ϡʠ =F?%Yed.|&"+]@hTzc3w4Z&g{Qu0bwlPZ}M}Q2i5?A\O=mVŝ\8W+29 =/V-'EDE@.]><˄_TBE❏[=ਯVBqYm-jvfА\2)B²gB̑Cޗ5 ٰP=X͛oL.&4~8#4سUU|hTy۩XЃӨ@FFra rd;sU5@ʿ[0$y(Pд`pKGLEg |8d>vo2Ors2D:)K&wZG>v@9Qj=PejŮo Qyw]}p,cܥ[|O\Afk/HO,8{d6n4 /z57:&"Nv< H$aȀ37]Eb[ێ-J wâie8Þ+Z]EJl2"`B:C-be.)7@h ]K{2kBϤ7sE|.B6lHOYc٧S/jFoKpCmvVsEi  ndy z#x 1vyNWD#;JڀbXayEC/T%=C9C)Z<'I +5S͉V1L!|U^ 㚇1H Py6ӿj$%܏ei,# Ɣ J~%$ .u,946=C2Uk^'S=.XB!2<ܰ{EMb)]ف=(O0eCzr.'79%j%PRAsIL#T1cБ/d 6ggT|N֋me2ۛTXG5XT** )¡$&ҬԨثe*fR[:*{W NpuhvS;&>5)zg>iZz%D"ZjPK['dq?zSB9=F;;1H E/1ppbN:^!kd s%)q?Jgy&L5h/'`XE;TNJEy<⺛lw 䍦{vo:7ix+_a1tm[2&צ8H ?lޤ&55LjM&Q Ń,{44D ijz$-{c%tK,nI0rgZ9!dAD8! fz˖1=DHNy*|-Х8/4cvS&[w @b?'CC= *A|P"GZM7A.*E{t~0oyO.B]ZͥG LpiֿY\P[z6mz70J[OZtg^ʌ4Pʻ>o5@Ni 2yW$$\5c1^p+@t2GPṮQU<'Mv>CtRɰA$Lt[/t- `i_> ֥~@z;G/syeRn_yG9wq-(T8Rp9t^Am" ]J*G[T-9O=;-K7#" Akd7,TL.!lR#-϶_f+^.HRQ ^&N9gvK*h @EQ3&aF6G~0>Hμ#Gl? &ƜzJZG-?UTa# ꮟ&nk}(Ջb-`Ui׆KV.K+DJ2 t6QFĎ@-w4w'Ԡ.NE٨}E`GWS|Xf#ק~'wt>s&m% )":;D;5qDj=`>\**ag,/ B&rƵn(:,TiL%)&}f0u懡D"WI{D#BkP9(5E^-~?/_ZEk˱텚Ep6?\HX<۲8qh;Ќ@׿SYnWL xa3lOum2z+Zc VA`[ 52]sW#GC(Ԁ{(1Lc[ɉ!H }m"WXYXMB!70w༈О'#y^<54wn8"|i6-練GXOעJzP!yz=7f︶G*Ĩx$YT*^ZÑKfޯoV /po.HYjeω/2/Vy#F,T{њtjOU`ă۫/(ʹ;=ƨ<̳SJlh8G >ZMK7y'J ^m_ОyQMdz<5\4pM8vZ-ADRDe"apK;_{DMgďƨ6ZisiUWQN+I38iF ĸRpm62=8M,!-,`[„z_8$?OesAeUU(˰ tr{HKYK8o4r{\|@ܶ(Nx/꽷'y+P鷧"_$:]+~3gq0#=O9HE(FKFOIϓ28 vА0Rþ L3ev)J6S!Nw#*vRBUbg65$a' AW* lj0lZP{˿)"܀d sirͲM~tP.i'єdjxrጱ5ܼ\N93?Vڭ.A[ oM\) {[-#LE=NfڸˈYF- |yMih2}V_iofVab!u~@?_,%)T*=|Pӎꭽ]D*aPzF9ݟㅲ 4͐>rC 3C]&r ƵLOnEgE%/ ݄-p[h-AQ  2Arv:ݼXh6/NC=ҟC UE%&`u){ӷ?xѾS;qQ@n3VD4SpN }ɾVF2&AAqѯ!W u {GD n*}p ξئXu<^Hk`B7]$ʫQMfƖ)JeyTCf P +"gob%7g$T{_] 9 ы[!i!"PD6i0)"[9XK rCR` "bVˏQOO:eJEG^km\)w}E%P^yBz~WSR_#Y@7glBStE]U X2{NƓXtF1dT#-ܻ+6>4;q36FL۩3^Bԩ}2g} (G1Tep"݋}a35줩w_`ذmxcGX| .1D0XN Oq*lTD8`J4{u2NpUfcu"ݙ^&]p4jE'G[#I=Fg뗨שs 7QdϽ.\Lq6NLCai#ݹ*ޞ99 n]<$ʻ2RW{ ,0.WOۜVlN_`+Gj1 x.A{63dt&3|_xF j+@'8o0&HY!/jX,'xwѸtjܔ_%f@,_%_?["V1$+uu3E)b[H9?y$[G1nWHN˕g#O. =)(-@ U#M=|ǧfr )ЗVqw*ܴsѺ5W"]P!4IG؆PvۮD?3o-a]~(O3[Ȣkbޖ/RV]eNmP WIfR'vۃp#!\r{.@z&(_k/dINX'W7X˜o2kȵVJi RXiRphe$ңt!Y'(Dצ >1rQrM&-̌e-`b0=XQBn;d2lM܃'qw 6US"/H{}$f3z;Hb20꿩j&P95g3 0E$5D&46iZ;6DUtsR+%,ӑ'33g[j\SYgkq2ZMZuN4?EkdT5"u*fdIJ~Ԛe.Xsvk}`IZaa4⦞YuLc"'rp?osJ^@R}eduK!?v=R^ɲQN2=ɰS4<η1OR ov.zF@/n}X-9 'ay7ܵyQ!hm&‹䤚l5n]tбסdt혔=A.aMNC{o<-9 F=-pVvwc&F䋸27쎁'>O#n'A;2IG`OV ?8WvICd§-MHb6 H]4PᑐhW(2yorqG<؎Sݽ:=X7񚋃:_eZ8hN#,u4J΍jU/c?v9 s3[A!fb?[9)0+&/Ï#YaqqEIv6ST ]Mra7f94R ٜ\۪f7޺J9 QjCPҖTrz1vb71P=12Up2 [ۦs69L~vbK@/XGTkv0ATNZt!/fO\28p4u؁˒O]u.\/xm\˽X'?ds-_DlQA_I1tvFv3x,_ױ>|þ*^z &Y!ENxd.}߳@"4z5gvƒzNMh0O9\42EF)xߕZENc]q1צR f;@ &Fˀ^9KŅ?H̷IC.vÜ6P 4$~]GgQOv<&mI$jW^,&;[O` +gS 0q,>‡ GXM ͮ K;񪸐ζ4g*ؼSXD<rT8g ӏY8sz{^(R XCvVҧZ_,#!<g0y|anh6$6NZprfY{,XNR錐0ZM>C :I.ļ&:roq>M-ͧSYR>vluSXbbdbkp؀m2$+tzg+EgX@O*/1$/l{hQr%,5nẉj|2BviSvVaPQEK/l`U56#Q{d(tCq^N87Of"̎nA_4IY3z݇.wl̸a0S"s!$ 38Sxb`Y,\у@pi.Q CP)łǍݒ寴BNbrOH$UuUj+%G1Ӯ\"˜nY-=}s광 [ X|no]cf"MF %) ybTH30@w>S39Mٛ5mG0"Ʀ`VHݭ{}j!ӖϦ܁RIYJ /fɛHlU,? 3cgjѷf- cwkX vluHr,?ԜTkmt;Cص9BHII]sNZ}0bD{N 9!G|?sxgn%cއݚqW4-MHziO4 < .>&1%h2d~-8% Pء'˨2`c8u{e~j }ӿ>HGQW61 ICc_B\W)ٛrl1#\I1&4VF  3%Ɠ2ڕVPTgEfaŎJO_32*qk,0Hڳ?- #hI\:.!\r6F*)th'):AOXܑpG?5ļ_0 b۬_XXWQ߱iܶV!ʲ{/AU8C^4.5.4H.kL*(NbK`k_u11 -ӲsOË"р>פDԖ ļ(F?Ε =CUC7_|AǨtԟX_f*e &e& Zd[F)?d}* zpq/,o=f,0zH!+']a]( Zc7BNVݦ{ElŽ3vL\beeP`ry7+ $+ PKuIQr!x4|moP%$M}tZl>/d݊gז]`r2Ih>>,3I8P1<..9E Ջ}zC9^` ]KKVvn.pp{p! $8?(ǩ?]Lk|7&U#O =5g䑐vh79:m.]T^5o%mgܜ>t?)JE#;e,gA`?% }6mVt[+Vc r9F$VVeސ%DGAH22cpW;TW}1 DXypax ZNo9$DDf>zY!fR4͐4yޏ4H YB?fl=6(D~OkR,t+:k ,Q=CAAkD-# PL iݪ4LcV28JCI=emV5rY3k[5'.ԐJҳ&AT.DwЇ)g݇Xux' /zܱ/l{ pа,h0 $A:M}P)0vd6%sZ])Q'ks4؎8J ItÓ6jTہSW^6;I&L*qXHE?׷M2Qx]X)[bHkbQ9pvJC&bdi <<x(ձC1fH|`LCF?S;6(noZn/4EIZ6_]hTeJG8JTw.@'QX*f%Hh5՘dB$̐?D\'als3NJŻ/+0'^`dq:3G/fR[HBsnGie['P^̧>`g*d/vΎ*PẀqn} pή(֭"x[_@ɃM8u=OўLiY%b_䨵KE}B:-QAr͒*EF5}1rm =pB/]ՂT{_z[pNk y 2*OqC䲇,Z|xGch-K0bY<0~_TK,<%T @n;U %Hよq8Y+M+W20L>n_ ڇ$x\\2jHk%Vc<5C&mq/߽s(T2lPM.t FT|_v#f8M%:)O(}ĎTSK%Er9Ծم"@ 'QB=n!!o`D:L>2z}9ʋqsI28ʩCl}lal$Y8pفO]mQRi3YFAq;kGh3t]^Nl %;Ǖe{j=ǓPBO_7T2F T5ঘ6Iga$Ѡv ؖg7_g-˫$P-ЋMνH@\7tRo&AAJ G'[ѽ huXsD(rt\l^Ei0J5 KvE8Yo$;rGDn BdDG)F 髽*8R:%x"Q;;,a7 En;_@9U|ERO[?_Qu+IXz% Gete>$g1g=w}:,LV4nXaQ]4ơu'1'9%L# H-;uz] ]{z?Ixe 0 Ù~ݺ'=Რ;3.mJagFJ$%nլNOipPDxOF Y\`}%Nx^öI@Z\#[k,i`C3څ|():wV5*D١9f#EcJwIl?WY})G.5xAk@@uyeC DCoo"KnE[OStM`(0^5)ѸG (KxGwmE`COzѓw`UϩVN #t(Q Ğ>9tna% G̢{-+rɠ|<nn(n4D$_=KLS?V!wlcGFp?U.Sz_}.,;{LVLkFm˞p#׿\]efzay2x `4Rկyx.$:_=9Tg؝hoΡGJI]: >6 p i;9ώCU29 s|S@.EJS?Q0}]wW.OwӐMUfXpµO l]1w| +JC.:M ,˾RfSsAUPk;R|cȍ0"`g/F#Z=Oqԕ ŷ猌 ɔ@&=4<\dwa P$9A dK,ZÏFGg(^y 9=E\KT7ݦ"| K>n9%7՗C9B=G#_#!t8qs-HhY"cq?'ԛ\]Nk dPӮ_({OC 'ʠ>C&UD&}c ՠS^f#=#k5EC9r F, ^˛GœmcS:ގC-MI` '~u?\f1Sx%wCϧ%-yL/^% G:!;Aê?bEFh9Fe-þLuCD3{5AjE?5@PCB9j(q,Z' 5/P&!u)O/xlY'_%=sG35aoQ=,Jp3_@HHs2Gb;%OvEJݞ$ȥx>IQ,=m;9gIh>\r{viBAXu2H^'f" [3)nF<ܭϝ l~?7?WPrrwj,Bi3Zim%ԡỏ;.3}<9`<~Z:W Јt2aSfhybnЉ{ %Z3~%g9ԑ#`c(a켿@D'a퀟"QL[!1ۧ넫-bOXb*xLY,{e ݥ_f>d(ڨ^w6:iy ]!0B/yIbnF{v\hCbQ9_-qRď)NL F^'Q~uZb}XtRz(n}Y湷Ye#i3LDlx ׁz8p6SMhJbzJy q˦Gg*!dl$ow'wPKc%J],^+xx(>l8N'>>H*bB5,,7{ Ni/мPB kM )mm .pzN>6fe?Kd@^&ܞ kv71t SwfI G# SpCj":zKNo:rNcfb!ثJ֓R+?q@+X ZĻ: Q\>>›Z(Qӷ zc/?qRON4gGQG3TX(tK!{jQKˏNBը~9]," qSB rXF:͌ݶkƃk@&Rjul1yO&P罨&δdJ߰Y[qL2]N:s獭,0$bK Dx2ۧ{߭#u7dp$*zVS3F~^Xqg"\A>g(1r#ܼo%/#6.8VGl9iW$% 3n]*fEE#ۋ&n%gF xY6OmA2Ǽ+瑷qܛ7&`}X7S· Rﹲ'|x&$5yDʼnfas쟀,Lc:B3M*HxS ${NR/9" }AMoRՋ4Yy++ &^t.|IÍ<ٹb tZp\ Q"?xP*._vXBhhmY$ dcl{ e y{>g\~6}g^Ԁ $(@ϥsQ^o2lIZ3 mzVEkY51_eέoA0g /5f+E7dO@K*p05$~ǁQ$We$ #̈́y,D0ت =ح  ލ@Z~lݳvܲ7k@:u:8,H`r uZ~f8m4VMSw&@c{b۞_l۶m۶db۶mۘ`?^lW}4f1[~+<|:YV3bNjxv`fR|i.CZ %I&5cޡ]W4Ī'B&fF '&-]\ ޣk7*RUp_)EQVW ͅN2#pӊ%find\ym&%Қx-x6J~+$:Q!Hd^?rk# fdJ:}! Н1-`$޶dHZNm F0h$)ekO|z5KfeUgONU^g RaVl,\CjN4=NPpx(U9V&Wt:S*0ȵB˘A{ήIGȁ&+uZNp'Lx8 ?=6Qbdד;W 5XiF淊M' 97nMpifB z}g4y?wG*-S'dlkA#8U@#a$$*:}D/{|Y㶶LNoPz҂4fSCos6a1.L4phGi~"0'^ =pcq 9QMӶ},g+O6Ơ4} N>6oչ?=ޒWV$׻&Cc`Hilr\ɋL>l}9? CeyY08Q2..IA)h<-?k0P6_edlX orFz"J0~8o1p=a |* /'MxN,>:e>( u!1wV)鳫6JΗKe#k:H:֘ ڴ.ze.wW͈87 ӴPxnyZg-K\YcLVda~@ Ȓ&GBɾɩDF1USyowqR+PS|r3Ea׆7^Sm5-hGI|}[N#sⳔ H pY9z?s8^ 9_׵O#O vXHD8!X]0Y'b!W~(κgb|)Ua?C0F!uo̮maA8}&ʵ7\[OG= "!&`nJ$~j8>)[v葢L}XqzԖ`Zd$eLjR(W>WE.*w7w?O@ yc=mz"DIZ&He#z aX E#*gtBnR!yQ\_ez[WB%x?8GQQO5LZ^?~tPȻ9*;wrm?k֐k:/ ʕiWkӮ{a~j\&)OJT3kHp]We k PRj /S듼lQ*'6p\ <1z FA*FY/tia &;*TU]#Xی>7%&$/!ksz~\^3-X^F;L":hA#4[R⃔He!x- ~TReӉF6* {[Qf{N75V+I6kBSqw' L:&dUCh%l q/-HۅؾvW^ Emg`kR[+*=gMe O3+_9/HQP7ZۣF$0*U]dA9&+OEEZ(]qґņ Hb ^,8ATe0"v>{Z?ny'|:y=D`sU W'dP߸k y9B+9tz@=9_ˑCSwwq-1KI9Zo=KR̢ ?>nŋ*gFTí׈P2• Vgjk+?qo >Ji k \=eJ'@% k/`pF=0xk3=cerN;ȦAXًKH/LaU#$NH׾k؟fG5Tn>$Fz1A{C_ѾY'x)N~J*0ueB?=|2n!zv^{Iwfjq$c/>f)`*P.ZldkYB{׼03n&Ný(6M B=`0,9b5؃86yNzζjCa$`3^| QrϞ9<( Fa%m:y7lnzĎD r+WֆHm]*,EaFۂXƶgX xΏ)rE)Q=`Iĥ&vQu&?RI<Ŗ%.,ڠG2m%Mzlo!8yx|63o*JfϨ7 Dy*֏J m3YW T!&ʷb0J±S?*hj|E6_!WS1ǃrc}d7<l׊?'x" i+J7EDэ,㞎MY[,I:En{ m=cq'`Gf۪>5YR;l<^s5Ri԰S9OcNvӮXyt8fjS؋3(fs͆BA Zd;_0.ˌW:@$m\L=D|@sV x!yIc NP pni9ˈ+oQURBW0s`f9[jNbW*FjzL6333ϳ^8Õ.0”">Xؓ1L~AGk޻>O~gtZ t}+4u@><yEYYZOF&tB$]vWޣ ڟهΝAoE': ɍ5RK gƣ[DO1`s3>h^.x]gzkyprR|hKz_R bx9n!jM~6V#F~6i"}HGױ[>Ʀ55hk0C64XgA}*\<[W-#BHd 5h}mi AqH;_]`tV(g|p[ >hتAsJ'haR1a:6nG8#\~)Xh-'cBhM ?!C ,)8" -$!лNpq6 Ea'PǾYLW!zD_/amU1+yfe}P9S;=M DX>yg:MmYk9\'eA>YDԊOc7hed Ջb}90 i5y|rQ`yq2(ŕHQXGn}z Iǹ#tKɾa쫽'|y T|1]s$I&C]ӿq,ap>2 0WqvT(vh"𪁲6gXjo+CH_:gOp"ERX[.`,^>k6K?]C(]4-ƥ|̘y(9?%hמ4qw0'vTj=ƒ}%]9_=J m2[80x(T n N[}`Ye*ӕYdR4sJ?(+?E 0*uK9̨AMwxබ:-VxT^=x=u',,t@bD`Xk,GLm al sRb0{ 8mH$K l']Yj''ZwǔT l&5{ۀt=2X24cĪBl+wFIL,I: 3W/iZY"TʸgN:K(wB!,wF\o Rd%y!5gwNԨ^sd6nOѝtY9(EgG$B(l 9Ƙ!g)3#SXV^Lq_0VzEsxpNP>[ 9 G.k2#e,ptrv? iafG=b]猐A4ƀS,f!5n|S.UܰmFQinC mȵ͎0s%b%vO*\P < |+%dAG:0s}LVY9TI WG^j7x5=K8\LBmQͲ n` aͥUGEx`6= .J ]p5C`C+1[L72*DrI3=Yzu|R)7Q3!@rTwvFȂΨqu[,J\>'fTm qNx/I JrD2mr(z GC1Ȗw2cz\[r?ς5mM0YJ3Y-<+=P$B PUczM*AMQz(U ]bJH5,+W}V~!7ê $N؀ϪÏ6M:g֞k` )ܚ[z+ڪK'(qA=^7 `] 3:!Y۸v,PbRJ*`sdx>[6LT-Avu~)aCޝjԌc  T 7<ԛ: A .ӑB' t kn-DlsqL B1rgDcJ׍G6ߤwKmFk,`4Okh֭ZeMb1u5U|EStwYϬ(M tJ0wkN5dK?%Xn@:dZj)wٸAd;кCI9>!COA}4]:[/xbf[L=Ec1ⳅ9.-j R[Ҁs8߸! v0<@z"Sk8ȷLe^4{{#;EAҝ uˌ2g-Z|"6iɠђ"ҝHq̘?>e/ W;)rn|hwsٜ) kVw87SƆ!^?m_Q{55KvYOl ?fb3Φ, !N®pQ9Ŧb%z )A ^o48>̈́7+b8Fu&sdXȏ"DYIp‡,$&z00ĤZqwő] vͼ,6bL^]QzyArQ n5 rv))e:Qe1H!®caonIZl"̰ VsֿJ=H#Z2Iuu| SKBd/MMKt됔&}Ԏ9BFl_6lB'e1դKqW/@ tEs}) %h%+v9 N/*ۼa->&M3 > {BPȊA0+^kITbX&{ԭ,ov#J Vꬿ޴J:aP-[h϶du]H|!rtQjC}=KFK~h"DxqÝJU y//{>F rfht2XM]ހ<-vE$r2:"뫠*LJfWpzU蠤çKX'܇pj0&0 /<";g,h8U+L*v2lk+;Ci˄9udNH96=oQ>?}w1ZCj$`i Ms>H?Q$62+sk˗ŖrrA7uǍ\U_‰Yk/ӎ*xO%G9v/D!̂xNzz7#)tVq7=?%~2!DoZp^~S6&20ST]ٞz%QDPHcM/xlִW7&@YkΉ(pYk]L.+\&][W~TRK~2ump@qDxi RbUQWGAA(堸.?OegmnZhu͆9};@OS{bo_͹?m9Ƙri97ˊ'#lOǫsn*ߕieJU4G? .D@:v_a0*2B-%V9dA. tv>a}ffSg4g~XOkuNE_ک,U>-O-Nu.\D]cb}(Ϥ},Nð+|`1Va|jciH(M&MSk1Stn==(ՠ,Nv18"05$$~^'(w`;^<ُ}45ЅV cͼ!N^IÑd5 eNOPwaq\BcpL U0,uC\}`DESR: jvx.5j0NשJcVgYM^;YۓoE_RhCD ?QyYqb_ uILݮ?d'Xx3}%Ysw_FҌ0AJ4`+v8=d i&en0W9ٹۑVi+ݲv,!Wג;-m¹ S ᖯ7.~׿& ?O?~xt0#JkYF2qWV O^oEm@ә-vGQPubZȚ3Q&cVp+kb'\Otc'Ӭ žZaM9LC%F8RUآ`il-#clCʗ/f_%$uCR-Kx2|fN)ks/207 %o˧ʖ $M?,!Iw*@@Uj&aQ=S]o)ނ ¶OzCj^Xݎ~9zzf#`>*#Ѓ_ν(G;^ 1P ATDHʡ' ;FP$(W|$=1Pʯ$Pfbɹ"\wyԖ/MLkM:n4ez9ق{-TaëXwVJM̈dL}>G̔[{~2jM ݢS tcTD!d4+ժs<Wdw0Lٗ^ i@Iq?*C w`"Uef$ RX6$P3J&6sՃ$Vժ'jlNTsq|pr-#rƮun_n<[Hpzr|qhAa}29|U>Cв(0o_90[ȔG1p*Pꯟv$xh|(ctɨ*x>D]ɓ\ƣXjL[UJ(#3zhn '3k%VzZ4`ɺVl"Jr 4Y^qqqu_Zj|0T`M:K3!,P2hp##jВNe鮳輋J7rsUH?eg)#GT kCf=lbէw~V\e4N Sv$L֢^-ZN lSF\4>ǍcԙJÞpР I=L;'KZv=t=l“, pw-6im T@;l498 ( p?VQh+'v~ds\8:U8rQSb3fE*+ cA:D u+NCVW>#ӱsDYeK_g%'hv62'aŘ.OΈSuMH 06R ={,m:?kB;c?!E)|!Ǯ]9d+V-ܵhS̏˹ӳf1(i夃>d*ȏ2 Z B>"l7ï[ovjRy?~U]*M'V/MX3b.۸9љ" B3u5AsvX!R7U4yR j*ڭ L ` !*@ 9FGHU~f1jy#Ab.k Jqȴ l8,tFD2cLTE=y6p`~#mR?0Z;Bz-QHETJ*ɉ͒iƲ4d~k"p|@{s1 xR ʚ%Ys`e(!;D8AC= \d%o< 671u_4ubJƑ*W4 u?^A~}@n 48"B*D&oXD k7JY5Ja#f".HFޠ& YB ޼6C%Ifi?md%SFTc*B@AAA_XI Qp]nwJZOg1+&1.AemT2w4N]52ۈ Z/c]!IfɅ-@ liNUҥ#G=6u֦ <Qㆼ8qɩx<BN}\i c@WǘB$PAӗsH!bbm@'֙bl#Npu1ܘ=Dt&<퇶4wY>/4Mž)߂祘$Q\Vz4^^Af-J@Enw/]V5okTv+rqfJr]4.(qZu:wk -o݀Z0􏎫8A\HrG)<3<̍J[0]*R"(|;~7ρ@e`͗YG$[%{i؅Lmht"ܬզ49 M,ɸ3dF#J!j[=<"DW~=rhΑ3l$'DOc;иJQ& >ym#OYwt$KȯGC;io}-Ry`uzf'ϚnJ AHHa{^y1|xx ^R'dj!ZTt}li:P(OϰWL/5w?xcUϣ$̞*"ٖok}_eC|8D̼JY\|ˤݩѸșQi^$l+Vڜ@apo=%$8Ӓ{M+ڡȥnսB`&7?GƊwءdAm}Zt/sDɥxLaTS]xbб =QH!%`xo#kGg;G+zIendstream endobj 4 0 obj<>endobj 5 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 6 0 obj<>stream xc@/회m{2&^٭lM5a&]mdO}c(ITEL FV&>ЙQ IDsōA@>& 4Xyyy(?u=,,AuMZzz#0Χ=upڃ>!U@0e4R )=jbke 2ڻi΀O??0}:!08M>Հ@X G`p6}7u5ǁOg?A>%>y`J. Sg+GӪ 4c p04s0u'X|rAV.0̬\m=?m9:[ W+{ 0v6||b_O@.@[s&VOOVtfs:+A4 f393*3NJ?P_q{kdiwſ_ux3rٸy\<nV? g+g, 7u0gUAf? +'Wgl,\e>Gv-4E8_4a{ZJ'ˊ(k-aaSbSĵ ' zf#kaGL.->|dyhGYahA&U]O`` ]-S;Gu&yNrvҴ5A43;~aFN>ln~q" - |or*\+d<ɦ)f F?iTUp?:C# #%A! bd#E/ d.t9}he)eLP}[-kV{eKARhq%Rˊ~d!20VyײU*KG(K_gLW~{vfxw ыv+\52 VO{'3O3$z8g89VW]s񠟖aSh20?|]Gkn)%G0QpN-Q|:Ӝ-?,+hi!!;sX>rIy % eo#.>=BFl&f73T-~ SZT [cQ;uF⒑z:EB.1#>+hep֪/20q!eXI@DWftZDx:@)n:ݽDP/cϺM]+8AT48%㑠\ļ hlBz 3YACʃ K$y2_qD߯' CYGۍ H\ntwqNK+qM(# 00LKtpǕ_+)脆Fh%y2u#/*f.oK8P>AZ[~|y|.m q3`at Ӟ~HlbGȜnC ݥMG%cHS[OApH&h([dg>%̓ԇ*p1G3u7|foi"eS};T:GzQJ̓MYaךh&Ed8 M)#ȋbՇ-fYhQh8/ڭt=cIsygdxGj}Ep݀R~h'_iC#7+ȪT*fueE!ʣ&cAh^5(.P)1}<ܯmɋg]]  C*ɽL'ԥi~nq:?4 ԘmIb"R- 2=QܨnNT -p;KF(D&a>8~~Yl3Xʧ=ϜtOG@iZ;g~C= s5ؕ͌ Fp):.ju 8p,c[%iOy Z,hf^ai|ܤh`%{%ZAf#d+Qjk!d3sAڐmk_z a[йթ( Y;V 㽼]!S$P]_/6p8{/߇\ E P= T#`=BCK"}{ԫIv[vxPOkD>L$zLi{Tt6,!*R$H&o;j07#{| 9Xskp.} Ǹr2Y lHRoϵX`uA7Ea-^Z(ݐ[v5 & ݕ%$, ) 6lۗj(t׋Y='Pz^ybFWD $'`hJz]d>ʱ\# P8Q7t% /R*Ħ7\G=B$))*큭d~_݇H+kACgG"$:􍳸r{2P@mHrۗYYmKk,N/z|nb,kA3k@1htSWc1B֛n+VlK<`CGVמ1«1*-PDcT8x 㖱$ܘPJ:nc{.ӐK}̹>ԏs@Kz FìvAu.2y"oOp٭1qi7lo2hD望a6tSa0H̜r)%7w®}椮L=]ѥ&8vp(v9$Rz.i&N6 06WצTq խCxu@6aŌk$nT,A~B d:1X7/UA0 _F7#^Ap`f^W/y+S PQ >#cc$O Qj4¡'4/Q9fY= /KSO귄Q&Dd`QިաnrwD:%V Xk,˴R (E^V;#{=9\"FB谠kdb!|KY^R$˗H XTj\y'/  %]pqntdyOU`y{KP)n4EOS[VOmoFk(Na86|-LR %H)zOP Rj3[YJ,^e50;:{yU)0h,cYVҼxuZ@Zī~ %"ݰҾj$uZm]Dì"}`MN?YJ0#<փ2^&AV,0j6'iw, =m;~8οm|@> ѵz2JiA;J>Äz2?z;Cmj<#uVi!AM C!'^Kۍ+y`o0p76V {p@N|DNZte|0 ؓ'ȱ#kj 9[gW|oWMMlKfÂB&}]ϱ ̀ Lz2ogB )k8ʮ:U3 ӯrt&mh>q>ڤjqJ5/X.NZDv2Lթ] 2r`^ר,yxȟ f(jRDbZl w9#4M@'3At\_CV'R`\c{ Zka$RpL\xyʢبLF aUvmhSFk@O ptq4Uxs=DcHm$ȜQ)fx Ae)^:mZE45'S;H3)T^gV5xt]m!"B5hII#kBVY:,6&_fcWšx8r+,5\D3W7\fQJ?s%C8jv~'DnK n6L[%H 2*&Bif%+BWt2Sc AU ,j[0j?šj0K(+;( >ԈFK4Mvtm2%mfF9lpH Q>N)q >ip _g2a_:Zlj| 58MaϊÒ/E )x2N8Ma,}F2܁JxRm>yāo}f;:nP/U|}dٯ .+ߴSHY =L;Z%>/eJG(@'!V] )/00Un3"Pxl.3$yމg ]d&U 4]J+/oAMq9E-o|\Ocr/4 ?@X` ڃ7IT)}/L!WF1|rLMf:LZJOֹ4TУr9!1yme|&Mmĵsbg=jTLeu+]f@b,xmQ_W;^=I8Yg+e6a\eC;%4V@݌4/G>U{m+'tCS]`&ڤ&Ym5zlړL(U)!`N)Bo/1ū{EUݓS8轢] >=yIgvdck$ EH ,^ՆJ4QpK/Wt|э&jOi(I[%yhBVV{Q[>8-EBxLR 87f#$d xqmRj~7l~I߅tceoT8hC[ڌu8d%0_tXU~c 0P8Ǒ^Ͼf#nA88JM: y6P-3N 6#Sk7=eRSPQ| %݊l;Ru3>ژBp/|jY;OT]៮ T!S`5#ʺUH -h)#ۓ.3l?s/!M.*2,RO,n_zQ ',pIA&yA5o&%M`4\׈Z27썹sF(Ԩz֮->M֥C9Z""@qD}k##{=8 Y]qAnQc3D3?Zjhdfv|Q)'lH<'!hVVJIv}%iޏwd\IFJ3ש%)L-W<%|cfDQQɐAaw28~;DOC"lpz ϷV[^C :mLmҩlgL+,G s3P_ [8ԛ c&%\"wnWw}y<-%[.G|-.3T)VyӉdF #Kgw6z1*0>ҵ85QB4 "G5[[?mԀ:tԝ/u"sULm/G/7 Q{yBMJKY^8ybX6Bv,켽`Ki` wAmhSDaqCy&OO| '3j ˺& y9ۜrbyYavlg*Љ  r$,/qXc+' n?:TDEar@0=7_αwDWANgn-6 o#"oG坅glqhz%Ӻ'76fgx8籧/G%JcZX('pAWb)d8~O4kO=Ф;7,]ebv@o Q3_{h)K(fTD{SC6D 4-Ob:6|sQ<):4 [ #mү#67 :PqA \rPV[tD`CϼҦ0.vMS)]m gwjqnIF &&Ľ= E֐fX0kK儓9fT⫇>Yj xkl]Y2 olv+f tAhԉfF4>U3Ge\?7l{]Ǜg4*6Ml [@_ˍ6 0[*&쟗+;ETZ/>:u:AϺW Z;--V̈7jݰ[`Cy\qu9&x~{@:(łZvs'vnaur#~vESqu߇[R!|>7pn3vza< dg(I841:GY~#ˑ>rJUުZ>5n%vѹr+D:jZz*PY14H7xi}U֙4¼mQyn nllC:IsC/@3[}{]9b&}@LJ26/2||XY k-OLlJbM玆Q=Ӂ<.,=pƩ1f¾tNArؔT67g 4uFF_Z9#]IݬoAC5)ȗ 8s[?~:W범 M$0;Ny}UkZNg NЍ߮zImuRZ6bh3j{_D+ 19vhŀnѽ(@&bs.g7Y0$`uikbO>P{*QfϾf tڄ+clD1ܗT?C|{x%aZ9eTqWK@w ,}+*3.;ݚd.g}diX%GoσIN hY5@iuh,)C0YVv\ /^IӪ0 DŽے֪.CwU&{Oݪ Ͱ|,@ɊP4uy做N<"W_?`dۤg8Hс16#f%_@|R@)@3~$&:7(C凄WQ4s#썏 $1^`@c/)z@Xg\Im!9LEڂ^ 1DCZ|<7#32H%wW~G__J~7$[lr?lEeؿhA3{cz\>~Q*p,L6 F=p(ìʁ Z ~8xIte~8 ~KSre҉[5u;'rVz0Ps˯eF)WrkvzX(+]H ^!ewScjF&4X4ρ_t Hf pFlCL'?Y_Q7Ϟ45jf3cZ/7G.XGX:3g%?Ko]H{>`|_xĠHFdBk@sgXܚ$̈uoAIz>#g@o8*,- >35SK01> 7ύ qHmBe7ep;.nxa Ƌe&Hsd8< [A(h(dNwc>b䎛&Je܄C@KoQDa&.B=AH_ uWzfx,}UWUyZ#=l:B붢5/WuaX$vIh]!6]~D\^]*nszFlQVZ"ٌ§s?Rƅu.x8;H)T-YvCm)%d Š5,yףMJv5+I 7->M܅?)cԣNVC?_5E^ 6v|M.c'@ >`h kTd`M޹UCjDytjX%]LnGvʒkΡH*BfOlzUa _"HRWpmuvtG# Il,n["5Q<aQ#RT61o+ xާY`5>iPB*o1lnp:}3C(#?uMMhQ/;G -u^}׽h~1[unb fKmMt͉w B''.ԓ[$#i]]2E\ -ߢ<\umşYG<#jJ g/-!_d Ҙϸ@eY` _97ΚY@Vz<~:ljA;#νbIC | .hӖ?a6@9Y>ӏ4K{D{eގmOsr@U~D-;ajoUߋ s/^4Ѕ^/?M qF!iNgd,A ¯s :xAPv7Ka$iJg?R9 `M_} a)֢.t"o_M0لJd 6ZoܳDAryr"+s$f"#eKKs r^џkau}Ÿ |n-BN%-͡[ͯRoOo~Fpw TU˸a`*l5)P.)H+c?wHOǯ2|Ut;^}P#lUy`Ea_vأ{WsF$H0;q!yN 6? kG9w-x{sѯha'PWI9[. qĈڇ'}rq+W4{\{znsfE]LycYt3#+ i9MM}w[3xɤ8ck+ui$K{t`r}0/mi8!٢,اOFXg'TpǪwMmnP̘?@xkKqj@ekLލhocPIl `&K\a\XF L-˅w=ƴV&{rʭ؆8ϙs$՚Y1Tk5&;y@D>5n|%[E‹7aZ܎ؕQFJNyKIWypX-EAűҡj**h%BΥ5L"0:tlh$\A%IYٛ?+AyN$~$EUOnbx1-:_y"FWٸCY}K) 'J= u#WKd֗Tzt1{15j2IiaFH'+E\~dSI!;667oX?h-vQ1~mNy1H`KT8.~˯5 u=.DԩW#ʽlB$"b!΃B sLB, 0 oVkdYsy^L/!:1䯌A,,bp:(Fȃ.IX39fhTyi4A:d_V'kEy\8>[/>ȁoEn*=~~,j,7 IѢtZ5I ogçEY /) 7!8I1CY2!ßn3"Y@+9Hh Т˂o_NW׋*`Ч-͙W?i;$i;I Bb͍7[m؍rt %"~s'wp͔v|9ÀLvNUbhNw%+Gl)38r*m@evJ;׺si[ޚ $XW{fu;ߋO0 [-s?dԪՕɡ&U8>TRLh9Q|-*i'_~ntA/{`Q_#S.B.:ܖ83?JaÞ~ȴgBҵ+JJ"G-_9rʛJw6G ={ NCD<ӇQD$묕p4$yq#g?- ۀ8\wZ܆ HIR9Ts| P.ޮRR nvُ[/饨SGJ5J*d: dUYg]wu}ՈKw]K⽑^itzj--+eoj^<{Bhk~u>녻zhvMm@vV89jDŽa]]s0O&H٫b$&ɗ'v+/hr$pWOrko\ejb'ɜ no}`*)KÄ6zj԰?95FsB#~Ptvm4.[ņ؉9-tK8D,˶ 7`.=G2rma!S`c)JC1Kd>dKOp}R%@XTa8O, Ɖbe\9+BL_y,p<^Wp֬޼2P{xtI3/#T?J34necS-65t`lGÈ4ld,P5Jmώ!T3ע: G&&ru-9b?װʻS[6|QrPd+-,vTsQ?DiH<\c,nj wofWL9E/Fҥ(oza(m'G4`^Ѐ'NƱ?Ƿ2L{:I[aph9PO7NѨ4l'AdKd*|H}T?Q^Rv][oY|um^@?_Vzb%-B w;G"TЧ~ݨ҆sbF.G~aςSU8GPYp![& f219w~*AZ߬c Ĝ"}Ω 0˱k.E܀A۶A:ӿP]z)r&xm;1a p8k1E,K9soR! urTԼlY+Gpu_3}Jΐ0 [8v0uw^yot4f{~N񃩑\*A؞Koe<;17UNΞgalaӆ,Pw')⟻8`s-N .Oy&l W6AzDf0k3Tc@|3͡ǿ*4;R*tPnG-Yb:}s(W܊ʥǦeQlQ3|t?3"T"$yL0B7I"q۱S1`cB!*]y DZvr Q VDogH^PA.5D$"5{*𐬧9UQSUEm4_4s-XLW3'P3 }!؏x-[%PYjqf^!"P+m֎̭XjFM )ы @j6ōxOTQc Đg"p1X~>$ő{ߠrp*ْ__xƨvb+N:gaogNjϨ,Gɸ2jMhI#UhTEsmNaشzC˖4zG`l6 `]R!}%RT|=svy-ƠdžX46Iw%n$STMΓDD}ֻ_Ľ cB :hjMc=;[.? 䲔x|VOD<ߣ@(;|I0°mSR, $Y< WO}AnlPn C!d'z %Is%ICQM~ H4(q)Oy;˼"=,Q7:4F,fDz%clEC`$ͭje| Q"۾xFD嶾ez%xow)Aw/[MYB? gTww P=|.,ӹWy'#vqנyZڰŷEWy{׀.tu]5UqM?k'(.I^ew^d}QoSL$ $?NVFds-R"Zb:vEvsE᫆8$/K7o. c2M efՙ?j N];jfPGZzVξbexhS,Un6;=;Jj׊x7R&aLurW | hY2& 0>hE41/<@ÿ6gS\F˚5Rc0v(~ѽ@Xo,'|;!$."YrGA#x rs7*}m}S= 9ɢ|kK A`n )a*0&mU1WS |);yׁ"~b3GrQc.눣r']6͕قhkttz 9|z4:A%PRM$ǜFJ%?2o,zb5ps|{tP(Z[ 4 aRp'P S6i3nE]U,f BON=nk<yzv"E -'W;zل٬#s$S4ua0ۗWr"g.u>c֍uy |FB r3^5Jv܉bC5K} [1q-B\1RO%FưkwwRRSAOۑ.Wm}ȡe(9ݏTVS>A+S2Nm]>ˍL_-t>(">1 /%Nd{xu~m]LG;Wr%?gT5{a54wa@wYzU`N@ /3~;?o!˔ XC'Zκ9Qc8 +^SjF(uQIqs&L~ D:Ty )$!fG.uRJa]! 3[Lg `(U `| fT].(5>ĄH9oLҔ=zQ}ɾO+ -VK&ښbkl؁Ʒ}nyפ~5?-YEg11ϛB#8w?\7#;ӘˈۀQhGɘzMe4E} ~(\[(;>'Acy& irR"0U6ܱ ƒTu+^dƶM#ZX|-OJФSe Fidl.Iv#EnJAfS_u,úݫD”JDioi0'WÜe}ΊGm]f )`2;kp[U~L}I1m.J'И3Lxt a@}tTMڞӥ\MY4rw!|{mѪO ,%`{UDEZr27%Qoq\r(⁘"ͻL':PBึ(O(=WIF۳;uWThM sڏC:اHm%rF| =,B"[M>0t#,A*}Zڋ ~eՋFoFf?4(NcB%VLBg]Zu/$y>פDӟb.:T -N`'S8pvBn\kcs{m8DJw \;SREayXAfPi1`o>s (,_q[%i*y? /^q atwf ] @&NU5{^MT; _FSA8rKG,Vխk]@Oet0N[(Z~4.6F\=V9OP`NFq %z vD 9̩c,…իM -΍{IѢ(uz;TN+aFA{h:܏Ay0՗eJGKj3;+v~D~RAZd+1Ɛ'E lM,B7G4DN9G( hL'IaŞ>w 5vm:YlT]NX^&;~_^H<~8Epxł7\kC€W4!x!xyZ!0gYشuPt"-x.{e׼xҧEQżvvsȳSB^&وrnoQV92&{4P7tPJOzyF~QRXb wMR_=?JQpg#+t\_0^kg_j"n>ҵ9_b.RH7LeH `y񹘿1w-˸"SsؑO,0a'J2;ť-,8ӶK AyoPlw8l0aBMjF2 f\H@i/ke%&; #uֈ!}]PBsDef0AS<9[Z2!~ "'Iu1v(ms]=8mQ3n\`_-|ȑ8wJE±t$Y97*) p<ʿf8G>>55a7lRZb HFP䡥ʷT Y0ig)MG  }(zLNλEh{ fo5Z]wGysN9"Vuo}y(خN(K(Qԫ +GGK:”bm<,%RAh8iC_3In/ k}±٣yjfN aU jJ|nFoN̟FFKQHU1tya/AWU3dbm)Ie$7Y_ҧRB9V +2y(U(|`2>p$?V9%擒l;Qn_TE)ŹpA[iXlU_tj&vOcZud\w=%:ҥ D.涂~oqDzh2H5eӣav/p d~{&eua\|(>#SX:9)M{GR1Mњ=a>r.EQQ}_< Ŗ˝@.h̽9kkk9oإq%>#"=Ԯb2&4yCRץs:XO :^-4@wZݐAY&թm 7g*B Oq Ca;'Xo@Qa6:%C>0#{$`wdӆ%D?>x_ V* P.`ٮ"{|IZy}Ee3X۵O&<Ɨ8tSfotI.ROCaLğYB4>ShKwry/ PQ8FӨGA5cu m-c:\kUUpymoOuDՉLWCwN4(t͌-5YYqIě`Z\Q켳 ?M+@vwuõ{5C{ikl; #ќ4,'naLJ)|zQ]ɇ@Zpҩ= bnna_c 7Ro{բOYlł;Rj߸jf,T ϫ#8v\u~C $QF)NS^jubGZ/A.D9)k-JB0w>MХ;dWbX]:1UUd. b J8*m%J]Tg,Vt5m!MDK*mm^b[,̣fxÝ}Jlؕ77Iå1 ƢzAМqYC{jl3ÍCsZ&L:,تE9$=6<8d).~wv+?v kbuNѲq5 bKzϲ+RM>X[J=^P,?Od\vKr6) 1HT7_hm.a+0. HO&W٨D)gQk}kX>tɢF#ΤMw.*ʻ\łC sXkxF*. D5 %tH2ErvQ+H_Q^[vvXPhleb@5;pYGj;j;`jmx&j-swm^ϛCVjSa;RO*j._Ѣ%"Wh@Mչ=DA8_ JY)jBf[n`(JDǛGe'KT}QwL6Dwu5]^T1Ky%+x"W7!ȫ&+M66eOYӎLNdWc ,,!vnSGwpx=ř"aK؉|j84cѭa~NV <&5N!BjGgEs >;d89kz̭hjAb\gJZ҈A;o;Y{Kn1~P ό[5/N4V?$iqRUOD`U=YxfǬf羕ҹi1i|@iާKaWu26?14>8?k&R"V I?];pf3E&?gx9Mqac3r/i=B8c D:m|da5 ҂'sd8K߾XYpRH:8_=l#1vp+#5{rqEMA) =XPɒ+Y WDG`n'tcR$-K߰}n]bINWú)U:/[n3\2ZN3gmuv7VPq|ϓߖ-rZcns\)~1& /8ib!MQ /0 *=FG(F#kzI<=פ;b*֌6ԔzǭĔD:J ™du1KԪWVA{~xz!)j!5 ȟ*lm?Z[3[h{@0@?mTE Mf=xcLȀM@,]z0񅇡~@p5KlfبhD %zJP63xɋLB.tvSfgڧvTq㍜֛ݴp7L(=KB)u*:Fui?o@d$ͣ4Gf\UBN:m0I+;Q6wlDٔ{Ũbǚ&iEÄ-}yAbST}00{Œ `kW`/ɜ8Rxs$nN ^ї&ᴭ{>R1xM=C@SRHrSp)j_fxF̿!mBCVto -fI4/d:ha@'eRQF՝ݑsjZC/%D쁣t vwBkMG{Ff )oo'S[4j-e-$xjɘrnfbD4pnVrKꁿvBcZV`RmW0'kkow4gNX՘\ښ 6]^^^eVj9)iת{x)!׈[*[Q$̘NN%7Vp exё=O/PJNa_fV3׀Ov@5.o?V ;ARBikE8~u ji7lCR9Y-r>h2q^r.\a!*ql鉔ᴵhYzQ23m6Mxf' 0LeP5Ο 3}.PqZ! jAi2Ɨ.pf%`~&qni+foRqx@w -H6\WSCR ^l,xh}cןw!M<Yg3ubnlL#z.#2>e أdS<쨶{Far K?Z>wqK{C_wy-moB$E°Q 5#Y1b2 4p{h.Zvҽ}X@>u_薪u";LFkЉAnk"1E0$[QdힴCB c?k҅))EgX<'!AJ\1O׫osRyS6 4Nh$ Cfjato1TJ!/b0d]b5oid:蒌-pu\kE5 z1mL6kN D\v*Mg b ރAhTHhA)):?'u)J'rAW,"S+ }KM&h_K&_)C3.U``tܢ\6=>a9%Yض +JvbILm)_ܜzqa?9(Xb:XjC(JQR{!ܥB.:wۨnd ~]ȐaY|pcenZhod!be'X\r.G=B qRCiQwLqCTJ+t!ryP.*9Lq;\x[fMe 1?5($`LυV8QOڝ豱wW{dHFX ۔N')5~*UBhK5-~7Ў_PHAeQvAS&O* "%93QvzٮU[`vEdE]7HZ_U醃戢@SiaڃZ*٨'P9hPXtbnI{-b5IM?j7V>#CMGO51F_xI~[f{)1͖VC#Zs3u&_K22"z OgQqNhQ# 'ziiLDZ䵒:ji=ٱ\؈d^~&oNRQdB/Wb y]D "b:Z#56Npml5}P?HJSXX}~nc2k..$1:#6c}wU%N?pqSl% 1 AIPnֵpeW1h{xMʰĦ,%)VG1w0de}"^o,bGqȴdw"ɴ -`^h_nJdBNy-Bғ 22)  z+K.a}K(r4rc[ J'/:o5;l\p}at@HbbZ{y!A.N1{ O1R2]Mңlg3'̷_Q2$&ZLsV!}ށbSO!x!xyu3X#zNioPIOA_2ˬo56j\~h(Ǡ^G*C?MiV8Cm]GeX_upq̖idrP*v?SHP{jM1K# bܠ 6oujjQsJ!e2# fǻnN #ѷ×X9Uw4΀uA4eئ\xs`wQRjsSKje}α_y3yzJ+eQ%}4VE0y dz !6Hg9Yqf0;VVx,%X^*3kKUocrŏIf,h`o`~q=.7T;mڵ]gF'2J2\R fpYɢu{j%Iu8 Tfd#& ‰βr bwrg=ઝJ2WDvaxRatO|Uf]O YBIY5 wbdJChT(D nB*9'ĽcgEМKO6/,iE½~ZxL^qPP[A+2 qSDr>P޿OLdJsb&*fro2Hh`d1nu_ڇ9knXxL mǙ*FƜjhs &|I9iqN7bQ2h;O^M+x _w2֪pȓK wz|LUi7VXa;+".hG%p \.̗\U^Rp0^Sy0|dOH]oM$!RsFٖ\[%b7æI, j02\3#etF_$SnD@Mv'  f*[^?bO|j7yK2/dZD]2zi&:÷i^JXFYVشoyvd6q:aՎ5]/a]5'}' 4D™5׏qG22zcv5 a#[*V2|.dymAidF p9_j0y~_d 7fr_,Vq-Ԁ8,1~&fH7HhI e m6(;4~zH2@N0דN.o׮h_nzDd<>f\A2ȑjcha6&Q]HM! >`PI5ΘxeFn 0(R ]O@pV.Pav@_ǿ ;_'u $6;rUj]}bO,Z-|eSq8L6TE ȺKqnvz/BBa*!2a]GlDk`crTwl].5ˑCkn!|`<:S>c&џ eGZ q] 6:HLqfRYs[R)%"%ZӭBGe,/CDzO5-[0]_r)Oe` 1Qܨn5k@~(v!j Ȋu,QPXݤďײwO_7OcZZf[>5MTNS<5Dʣ:YހF$ a5^I[VP2z,bD}DbuVe 0sh*uB8`t B7Q\"l?{_+32'9v+%Gns^v),AYw=̗&r>+̸̿ӉO! r(l>N`OWl&Դo8*bkY:ZET,#r \8jִе6R^0Vs$!XUhNS&h,i1]Ւ69F)Ҟ 2=ӃN!d,ȗғa%<&}e/`ZI-ܬ+N^sdu a6&J3E9;{ΎeķL90jՍ66)GG q`o$y)6rUg}VI_"u:8|iI{!\lyW&L} LYs"[&Jgj=p ΁eF%| 呔pų0$9P7k/P'Ea]{jDԹ*i 3v*n̝X+XiJ]z4? 0<LEǶSfrG]geV`i![Шl5wn:`5:z_ dǷՁ[[%HI/E;wL:EC/Rv5GNN0pCS)Lnx&{V!dX˨!ٸr]˳2-<)JaD`u4z{7}Xj#Ɇ \ݢ[t%Syk#nM_>KxՀ+ a4ߖ.Ż.K% *@oEK',r;-UsO>S4 OYʷ'Okۻv.Vy ZT$3rweD`Qw;a!_ %øhΞ31H"Lfj[!kۣkkX8g.zk& SَedRʬәXꉜY2ܺ  pG: U1ܐr*&";~LE@  R#:PB[WO>e? ̓Hc҄^Pq㘞( V/yZkaYm }?aO5D%I{m՟>IEoᵈITL` +eLD¼1g#z&(Sl}B;`Do1 jEB tmiRзo6؊gI7K 8 iBu!A m]f4D@"u(T'z=[fv%R3p@eͷI.M#[Cª 93H/ű6Be )zkP0^hhz[KUPR5J{H#~t!l8*jx-Wdc)$h|Gq\rE;rxb+ kc'7<2)-w꠵;[fXcOLUѧ#p0M*OOc[{]ZDh2]%áyݠ؈aC enrMKTo7FgMұL " iމFK8az:$RY4V1ljȓ0[06܎+b^|[RҜ:D`D_;-I5MF,IFa,$&D@ \h A.u:Vn|0=_3qֺ|:N#ա#}Jp0TdVtiG"elCr=P 旋󋺥rf |&T)lea{8:?IV'FM& ODNtҐ;&B0}|6`f#&`_n|YE?]lE :7+@e ~ R ڱL)eD,__19Dnk%(W:f U_g~_sfQA Dā£odr\(%`8GŦK/پќ]d|."{H6zmrdYFL`/x0P(,DEPUXK'~m P`srj=fW;R)6K X{ =QrHhn3|0>Sb@&K*4dpo&lIj"? 借\k+W{ ĶG.Q@L99ا=}?vP YT6@Ѡ}Q4 h|+ͥiLÒ0(>Ipۏ.D7*g5"-,xC1-@_G+DŽڅhˡ W(`¥H -n T8\04yY՞s.yx_VB$ִTC Ҍ7uٕ^O&zCz>@q5>%FMSp`JBd24V&㈖3PF)1INj~-%[i'aؽ7L%|N.t`"I0e{ͪ^3@܆.?f3@\aVguY08^/ڙ p"DvzažeSΖm  &^ݫT @EH]OKR|iU+f4`^L׸_fdD~Yh$,N$ =No1d9Ed:PIV;$jRz*>5MF$9ꐤܬx7 0` yV,ofGH$DpkǫD(fy丘'UxI3 +lZ-NF)LJz0W2wpTL}T n=_#+`}w(zL%pnj+hWdj>u&=*,-}/Z~v l(l1ՈP"~^k_d!æ ?,W?9է*GQ sh&AqLz5_SؿJTXNw0cT`JVB{LuUo <<~qZ0ϡZ+/c3<7{qT}tz`=, eCl:9ye 4r b!hK'UQI1-&,x|Ӟ؄u)pk9FAӢ#r`!n(%5$lxj⎉h#omU.Ң3keZ54;GXF  ȊпODIaB4NQ)L)[FȲmttM;}}—.پBRrفj=Fҳluv}V %q""OPRAH`٪zC.6zRE_U~m7!I^A$->Λ:Sz=|][d]Xuv;wj&̌e[n}ȝr pINf49͈1QD|޻?L5|.@Q9I͆ %ҏE͖2rK Qyf]ʓy2ͳm3߾ޛp{^~ $#{x´ Еgƫz9T^eBʽI(n?rX^MP}[P{~ay$ds6Wc 6(2 .u w'Uڧ-]:9HiM.{Q cyy(ϓLA 6Z v4w& %@6hmMS5DUwnA;sa2}=Z ]3S5FT.9WKl1[fH3.Qh>9*.3Z]šb \`ni}ɪH?OFG6 ?DM̾tH `vPw]ra,ή ^S~0S0hlݕxDMRTۢ&(УCYc[oJcdRuлm lxBk˔D|QJH影8W|Cф{巶as@:oJc-a%pš<&WJM&V\:S >#w7 `@JYn!1N \c3oryV d"觐Tp $ذsšELvؠ%UyW[d UH2e }6N/cihNiVM^.\{j^wW2Ť˜;0Q8cTEǍo_rSBa3FnpM1b:boD^OYRi|h4;0l_.1.Y]7a_p 2]酕eJMY6!´m_) yYdD FJD\* .jg ke"~;P$XY構!yFÞwa>\gGckO J3e /2ZAK`gƗ8`=k"v@G]7CU+_'*'Bcdvw׾59ke8ݑ!2G3>[eQ3..o_*l{[`ۚa8CתZ2Xv.'BA;-)_~ҝj^36Gwz(Njɀ ?.›ڻu-~RF@87C4 iʮ$kVu/@`xWJ.7Sw"VU[ FEV\Sf}+7<̽u{Sη[rKV(F-= ݇0wFOkLn` M ŗP>?`~ΉR +ْT^Ӯ/ǯБSeea%\Tԇ.N1Ib8GbMWX{a ߆@e\]8J&)۹MVw#&g{ﺩ=6Eh](:|t`ܯ8 z[yxVaS8"φRpæJZIef١^Gj\&Ih\ӭ'pkp@{XijdDIN^\gʔ]b{&ޯd@:Mm)S+h|i ĩ;{̃xR%WHK .9jzt%(ٳ!wMGٽu,=#q]|ƁH?&0W4kyWbf=/l( K@+-8+#J 7OXILe` ?֐+B'掎@2]p.3DACAn$ځsfNLAkL T7?\WYLi!x 5R$~ZXH)3:$] :}rkJ>|N ;}p=s_-.d.Y:}mdկPt)l7,>;:0\ăj7ZR86gq>_8 | \ۑ,,ˠ !{'47'aދR# HiYz"~M^ 7ECB<nX/3;BYKFGv Mv5\bprA|ű/cmVmv I_pZ)ʱޖ"ȣw6#E5b %cND8dD+ )i֏t>h)I:[LˑhUR6H*FԚhɆP9{}JK|5-^O[~G&##(۩+5Y#P aG<R)B8un}f{eQZpގAws Sу7zO*@@z:F[ 9Z h&Yχ6(޼Salr%+>@s9GOLާiE( T,yҸOH5bsoh(p`~m$ƕ/&V>_Vu?i'3sxF$ۥ#jC3S8a-Ms5OR@A4ssSBd8Q97t a&WK62 R+Rݘ ^)~5cP+83zSFmz>٩͵u)Q@?Xԕ:bHAM?Ƽed&,WϬhLYY0kXBj Z62[yTJ/7"aƖyϺ@) jͺL*J KniRI,'5ÙhS.‡X'9T쭷:Ȥ(})WQ$mW|4 b`*\#OζyQL KosS!LF*P ~0%iiRXրb fv,8H]z 4 ?Z~0^oaަ}Sŭ6rR4h #l# .ћ=L?J<?.t0\YѝVI-aafbՒ TJnع밵4T@XZ)ORh_6 kT3nele6<`MǺ'ք V)Ji|%J.yǺt@v#$CMNEi'EP^D@9"*m^HuPϫ֑3]1x7GVɺ֙!UHz-_o̒Ukhi?ϥ ~wLޠvbՀ 7@(!dװN . hQ֫Y47:J%F8DD)f &@!q(֖a-_(hK\:5Sq, N]C{Ϟ$ #^nYl α|kW؇[{rǛ'+4ꘗ2eZ.s*eOq/TcGP+Es٧zZ"7su]ꥻw\tiWˈeA:LjK9yI37܇EZ ۘxzv 'v48^SlbL WB7NՕ*!Z%Y\0kOhJn GO<uLǛ.MJB:7R7m{R,2>& ĵC #*aKh!!U(wQ8y3tKd. +qVaKH5[)ቷ#jQ7|F‰^,0I]" W2B%,t$?V .9t܊J%T}RǸi?5Y ;v.JU #14T_樛 W F q1 / f=PR7Ֆp!ڥ9ﴪJW| MItgᘀԧpt|NX#zt ENL,k=VWqPTn͝x-_?Q6-A-/%x59Sr`E/օIҢ}[Suj@5q"'W_VfYņy FcQ7 F @te>=B\#X ,+ʂV3˾CZqI6 xo] <%]Oq`߁%iQm&I4;egwOJ-GQ&CJatۧ/ ._w/@q0}k͖xYJ^qϜOSWZ3KbKSKPga#;s0Ǭid,:TRC90 YwY`%I^űi@1͒!uBhG*D)Ԍ=Efș 9)1)CP^eo8y$h]kּm*ٱ%+ȕ% [qFy'T7\v-Wp5MdVS18ĩ ?Uq0>b-^tnp N`bPpMɚߨ bBR.`6xYTM_#[.WN 7 Ɗ0TTFu ʋU,PR^ ?ǵ #r)>y #C&[Hb~`1Su2SxՙXA6dDn( *',u|!^fT$d҄h8LW{9}S7Զw>SMU@P{-A}'fE;1Dܓ6@ih;PP(ħRjoÔ˵g÷(R"G$y8&fBɊUgi%˷5'+fd*"fsAkokbҡUL(e폼H褉_t$KᘫD.-!9-qr(^p%9xs `}L9xkuɢp{b+v]  3~ҍ іS$Gh5[7H P|(R>X*t@TG>U 5؈rv$L%*#JTy=v0A! %1Lʶ>}?#)e@11Fc];y|3mTb%ƒ[aJHk) ~Qz°k1w^dG5=al)ô%YJ .z HRb n=BԉM1Goó@S.yJcX:]0e@쮧r~{e8Ff%o9z;*'-ų3~7nA.Z j5Q\ׯD9S=5Qojŷ 1^h}$ЁV_I/K.$~r0ڬA'=5*1ōڙ5lS[[Uy'#C>H3:S幧uNG}0<-Ş\Ks&@>XԒV ]z!7~ %mFvoW?f-XY'x悤ЈQekhz.0eI%{o*~ ڃM{tTGO$(vp  İvT1GMR^(N}gy, cd__s5䷍-wc`$b|HAkUC)><.$z.I>t ˺i1=25[J>D;x10| Wmx*gRZUKp$w?m;k閦=ڳwt Χя粖I|؀QІiL0: S PZgT Tm7z|s?T29]K)!oq~Id5GLsK-?pixBwAXMɌڬvgt|T dUV7h}Mpbfa[w~5$(-usLW_"]8uQg5Zci. ,)C$qwi.`-r,@iGsߒ &`4 I2.-@N\Vlwrm@htϢ~2-M$V8>57#K!YװMIzMB j)Ӊ_|CxpڎJ$4mjث/EXAZN.NJ+cG2`Ύ$boPw߭ Va]wAp$Z%KkЩt8Q/rNFz'̨h8d[AC>T,nmck&ȿ{J7jKVɏ3*=ܤ3+3 2%N$:Ӯ{SQicH] MkU7 E9T;ߧBSzN&AOV{Ƈp~E#NX"}{r-"bj.8LӐi7u[Lnnf8X@SQQyGqHy!FEw\\0v(TQE̝K`Ȟ8jQ) ٪0 )J _USF_y זY{窚$w4jGP2!6K~FoM޲F`b/hriF;yp@x{^;շf44P[_wLDzW5D)&R .6&^/O& !agEv7`w_ Xĥ3}ǯb)ͮcjm +rP8ҌAʚcy 4259՞P._,$ c ~ "U ^pyH8!0EXc sg|(jPI9-~šQ"y%an,=ލdpR{땭dSj;gs E[૔}n3ZUҬ-}j֑ɿ SqJ̻zg`[؊@-D7:˯PB>1CAݮFZ/; nJVڊE x_NEPR߼Y+(yS0 _KJ^1 V Jjk3֋9ʹVc$i.O4el.ҳhcTq4 `n=T(wG@‰hxn_uxNR.(":J!!.yhdp6 eaKo_vk956~=HhAf*'G#R)σW )Ño_֍a#y+'ЇTݻ~-9 ,FX'C?,V2_^ސ ب[9a"܂NXɴ)<_a:lEFG+Vvqm8Uo93a ?lRY,&z+.'M!L vSkmo-u6IH*!}?@w #8!6ޑ~>ι/?[ "/e&Z{r MҜp8~l60#| /9gnA5SUHVM8|-et"\E?esQǝP8S/U5<(BNa&RC3$$x*d'6i5gX3|1) Q?fRM# 1ߢ.$z@hZH?&t)OA=r<1!n} foLzK- V%dkjTjJh[-Em5` zh+8:(GA|A/ v 9| C&q3E0V͜lT=4RLBR7@)M`*bF:6,}`/(|Bα s~Ɏ$nq?cX%Og]8g#E?~ٕ?Lf(rf C V^bC}8E_CtFςNBQzSfZ H3[Ajzu$Hf\x΄?ǵHY.i"0FĤ6&@{ yk|0m.]Eieh,6/p!FfoyY\9mKi[6:>D֪#|HkUFUfi=#v)E2Ҵn2AsU&l\ Q o?:'sr{QKi)5]RrOv3ű݉:ߴ{W 87}W_”ʧlC 9uަwRmdZ>!kÃNi . < l$4 gv_]C~ὢ/'/?Gln~ 3t 論t؛ﯢUe%P\>' UH Z wAWR^c^^Aa/|̥a(y98]n7АD}m8o?aR/BZxu]eM錝k3 sW>vclv&G<}cX)@/ YT`{;Lik:|ܔy.!i(%:ܯTU?yptKYxRRٺk8\KX[^&*Yѣ. kunf}(E86?J\I U@u9?3o`‰:/QAs *b#bmk%eP#TorH;, `aZ*p>'s+V)++//ąmCd%dtN*%X~jppi|`vۼs,NA38&3G8 cuREj\ QHk/+~EqD`n|J j)J20Fdt[J F)XZp-=)ŷ0KZUDK}}H_ cVу$ UyO}pȉWW +;W%E)7FSZ*xL|DNMgmMIvԅZdVEZ闡xJߌ6>-h-ϷN$.D2 ,kMց Wڴ~3T:WT$y UJ(B-I_EG+_uXl\_ =,r"V 5խky<G:p$9zXʶW9SE@| G7tVp5qac?ٰK ̒eTm|?âHUjzΆO~k ]: BUhG5F R.K밨QvcY$(yj)컱`Iaig YqvNҥgs}Pw-XR^ՉD!l|[3;<_cL'q'VXla2LA.U{%qSUֵ7W X\w ]Qbm *wЊ %g n' =ܽՇ^7lB#L.Acub c :;Goשz>qMUطzBYSKte[k l(7DWG\,rZ{w41T4QrMf۱23v8'?\ =dxq-$fwF&Zy8 :`H\TD>.)*:#/|J(詶U~01j,=W" 0~|' %Ee5zJ.*h5âP ƞ?'MF_}4I3@'Qд,xH0&sMt&oA{ہ,.m>U!d9f60Z*eyfzI$ @Sk}ƕ_Ls}a 勉-ԵM!ŇM3ܶ*Τi,P*ۜ*O3qHr-:PXs["֡(NsϧYrGbp_D26ГlF(zՋҒZTY|jpwqMW \T_E]]P4Ljs8HVUl+8/_1uc=\H,;F>q7]Ss2\حk3tj̖fB:?!l۴ŨEX bԔAlR.e2?eѮ/6Q-GQ%?r#ثf` kPJͼN..QL  ~@Y&΃tws Ԭ)!4ƪr< 9WeΪHGVISIt.xhxAdh!!&9|߈Q%j&Cd 4`SlɱoеLLÀΚJ#c2LJcx_ }=f숌6b ڑ O,ȴ-X " TBŒ'u׏Z:! ‘g IwyQ@rW*#rP`zHU-Hb&q8M^yv9Ʃ0uJ<{v,(:3W:o_XfzRzc^ےKIOqY;[]gcSDZm+oH[36zWZcxh0.+OpՐui(9o\Y('As,V9ϵllVҖ^J9VdZ]Ϋٲm/ ٲUBRŪ&I%݀Kx\{d-8^C߼+KŮEX4B"Z-I9J?u,Ĕwdl*M ր[BhLl|T7.Z;Avs! mQ߷=7cXm?iB|zC:i"4bǖk5 mIyp*h`MأZ@U֖gNsFZ`4'u凵H^&FY8bV9}e_=061pt1pYendstream endobj 7 0 obj<>endobj 8 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 9 0 obj<>stream xcxd}?cb۶m۶c;ضyffwv_w^T]5?T]UJv&vδt ?Bv.&r.&o"+ )O1@`!Vp03wP(QRS7r5,ld&v6&&LL&S kBLV fbkh` w madbdB 0s|9l-I͉;'[ `0s4ue6bh-a6&odha */,q:8 343r߶ 1u6u8&c '{ko-G@p413p46qr6mwgҶ`dbmJ۷- ?"akj`d\MU f;c;[k) wg]5+ _iR.u5 4O5E3kɖp6n[o4edIX`j`8Z[ؚ|/p[:S60'Llǀ Bo ߶da߇hLvv#aє1pvph1100'aFWr65"(wL ,e Oa}욘DC/`lXd hi^X&(u&Q?- 1 rnt̍y!}s vr3ٸ^vA닚zS_+fL Q׻ ݁5 q;bn!'i.@I!Vq-ǃ2JΨ*tWֆ'F %:xM2% ih_~s]3&髊< * ))=^߂);kAoEnĻ @RƪA^E\zC<ߏFnc/*[AT?Jp/{A̋Lǻ8Y8꠽4л4ˀI)/C/&ŸigdGµOj\l2$E@{G;@cv⽡R_R"*-@ H˅3 |YE0lp ąH&]Zd@VxPľ=ߔ4jfimWZ"U~{alk}JH1hԭaBGQYj121/P~,|=-o4&IR'5|ݱ$=4￞?TD od3F=hQ;p JtL5a(ZVt5CcP&jz9k0Eh[EL#;I.a؁trca> EjL[aFZ]}@ UyJR%xֆ?ӧ+a||loX6̦gֿS/ Q+1hB8 Jq{އ$1-2.{l#!fjxfGd&RᚄpZm W=F"2 !rJF]l3N֌F᯵{"<[#V/O;t/T6{J.w/PgI647@%SBN؞{RXqZ)<O=?oR"#`cb $aOhG+k&PԣT"N旣})99ƴN&/%WB ?.^$L-uk*th6"bs/rU:EZN>x~[oWtrݬ@l,r|SpTxl/6ciP?ǼC6(d?tJLjQ(]NYui/D΄i{NΈ"YE{Cϑ 5j]ہkgoVVJ(xن;!]tXw-\wZrJضݮ\ 0pe%/*·"[BihCQ Ib4!O* +iV#裡Y1[q(KޙR-.q}F7hK/䉝Usˮ,¬#›_ڸ 80m&XxER62;SdT29xab(sKryֱǘz91j8]̖‹dU7WZۭnG{K9}Rн6YvP0̙z E'f"8jD_}P`,e9;NH>'u|GmZ Rƿ:ZH>',W@#һZSk%} `Guov iV/̿,aJB7 MPCe]՗:kZ.e9 !GVMVfyx>ԏ扇 @Țޕ&iZTt_+ANE<(.hH(3Dǥt8sY`-ϡ%(Ab兜a/i}_6^ 3N5xTO u@$R> Ղ~1Rϡ7evS|zZ1~p?Zc|_+ m@vjЙvz-!ho:׎!`}|LL*ߩǠaH40rK1Twz䰔giA{9uBW0<4P0 ]\ Oͧg$g=eH7Pak)fc39T! В9-a[NQqMCۢ3,Xd=O &~ElomSUoAHg*mĪ:Ԡ 'r`C՞P{uCXkNGoI;6:y040ˇPޫѯvi—M(h^ZC^>(% '._dGsDE@>8smX>IKăAkJh0Sk$73|k7 .HOdE;Wȫ}maDϦ\ȭ:9Erco6YY쥥`!䲄: rm6kWVBkBF..k[fF?!kk)$0xs315ƞ]]n{S٘x4},'s2Y.o6Iim'(iU]9~RÙ{`dn UY{wpw 4UvRj\79 Js2Xdn̾q%{[*;-JoG c!M2ͫ`Sqgd6Y8_犱O2TSj w{ƶN!V ]1HMKEȪStxeRÈFRθUT>JuQzyNPpϨuH"N܆!l wwT,M.kO_"ϩr;%]Ժ !Lϵ->[r|P Ճˠ 4.)o C('K똪8*K"$A'pYhZFvՊ3Z;w[EBҤl˶!a^=rWO]#̬^W{9W14"M [zqO SBs#;9ؚ ٤ܻNeq}!|H:TdJrg˕Κ錦?^/ sht|nFV̪ nʿpz#jTb-p &g:_гɩ ]䫷nyf+8mb<_7o %yFyߡ@{ \1GAjvaޒH`")cf#wf%nl% ML4zl{ ^Y7Ln.3,n=_-&^D+H~ٟ-h: "[}a0yā3Sh|>nzýCLnlUwt۷w c CZ'bLT M q N>p48䗣c ?|f*$+t}@>,: W5Oi"s (S.i'o:#JqMqJRygQˌov M`7)9 3֭4L"-jG#⇾0vLAM7ͺq"Nrǝ qȂgn%ޏ?j&t\㬧XIf6h±?$kH@ϐ X2` f+U-)pg?-6iQG}4Oigɳ }$-b:aoKmr#HlY+(}DцxbT'۲*I[;/xFG9Zwp%v$4镋K=F3[*gY̖19 . ;uT+}Ef 0UX&]*J9qC$ %:o[>] ]b)YR]O[6o>ϝP^2Cb{ljhmJ&0{+ݺZ0ܲPֳF>wӽ44!Di,Bʋޚ  m.@31^ }wӥl!>MrS0UK>̃fHZ&`,ITU:*жvGJa:vf,c@h c ~ ;zR+NJ X;]-AO)O@J<"2'N0# Ƽs, `[\ƈLBWiG!S)d@[|zeoPc.Ds*ҳh1GOEvE !BM/3k$-poRX,\Ey<.}!6 ~o~nX1ŘJ%/ݾme!V >zrE#\?JtN0 U.eA{LFJq꧃wg7XT薽p<{d{m߾06$f DzpeqCH`;J n*O޺c 4CKCE$# >ƪĨC=_SL8֧9.tw$TVf4VAr6 1K5Ct,{m.?f &Kg ,s2ƉO>6z^&G,غ٤BeFG.͸tZu#KX(p$P*}0Ϩ8pVƒ.Q+Rt5Qw= Vpֺã>rARJM-BhSsF8&6#5 8bbqY^0d]ixͻ%,sDA` ~jy\1<鲪)=NuyYx$J>Mim+4G_Up+!8r%Gמuz]%7(2;f%"~&vMsW>!-_ L/*7LLB)|iR"]g&O7Q87C1jVv l#H L_FJ$)5e֨ uWF{KRVm@6#+Lo & o;?m.F:S 8&=]%$HK<+⋕Q25*tk W Ǧȍ"U.M62'c[ W1ۚ\; nJex&a[P}w2stk~#%zT!':Fs~U k|0b>FݲP٤k$ ͬPZs6kJn:E%ٸ )_ L!?^\NSDhEzd %Q3x~"vqRO ub-AxD-jJ[Q4E z/Z)::)$VL=卞KafrdT8o|\d9lNw1?*Uh8;BŇLmE\B6;:1]MXߙ6@. c$p^-dvL[\(ж1&P&.Mi#?z~Kk/p*QѾ} oeqs*`n4UMXLg·닙&!ML}W\Tur]`n,m UE q>윣УKzH{eY6* ~*1k๿fds"A  aե7Jj~J\ 䤒$N麨F5_[HTv"448L<6jNА"0~!M^"։aQ7Y,%PmA{ʝ}-ug}}'E6GUڝp#/?W͍j޶}Gr(UY5, øx,z¼e 4w!9xd ?zch7y0do Km#B#o ]_zS瘀KsJK!UNN1\DjRܥR'Qn4{ i#b42eGmr}*yJ|4o-pFj U5 ;ՓrvH˘?psD>Rxnh^i6%=(LEVUS?qD;7eXg9+m*j%n7kE˖T(v"<#p "8ڙ_鬍iXJͣT5! x~Ț8`_ǹݿmQ7mre˴(8P;ȫ Z/0h/8,W˕OjD,Kh;=/m[rHZcO}RQ@XwXԟxd] xCˆc[9]Yq3nX Ši4T&J=Tvڠq) {|A' !=cpa#jPNxKIޅ=ͶIRv3 V2xj@l̥Kk_BYvi/W5Enj&Rk~lӽl[`eG"Lj۩ /^;,}v CxwՒ"! AIslD{ےR~574:4mΉF&,FJ&ZgہκTؤRWwgܬ#-SgϢ[U&t:fG"/GKӟFR; /*Vq1 04\qܔ%+Q+* #^q~_/ e]/kmeV3XKۏ%qá&ܺ>>2#3?sYW%N*Txdߜ1﵊ul\\^Wf+>րO W ds򞌡ez']afB*az-/]0tP?J}$f!y< u_IZ5~S)31eJ VG,vԥ%rUkO;Ƅ٩݇]W⅝fx<>:PuZ}5?̾xSxv.9gnrpK'l2R6-ѝ(j4tQCOkMUP/Ǥ W31[[ I%86p=~Ű3*⌮0y>+KI/vgK V^::2A[K_=M&N xiq 8RSS(K"DL? آ(I@eZ89OHY "{1&~502XKyDZD썁(Y*2VAQř2kh 6L"<.^1cGqۦ/`SP)9:LJt I~ʄ n93e2x1 7b cC9%% Kux'¿'"mkB;7*xSiy;Ei* yх<7Yyv۠;ݍ~@٠K{9e%[Vd}j_}-8E);_7{,Y3%X|sɨ7bUj: &Y5h0g3Zb-ܝԺ97Ya7[(I؄$Bbj$7 :aj{&IـT|ECZ\Yj*4r=4qdN>9 !=O s}Lb1LyQL*h}8M{ϰތY:ɶ+reP15鰲DjYΒP\;[,urx40w%s q5A1~ay  Q(7mKQj0`*E*$ED'-_7S(A 6dV%ѺY'rë45KU]"~dqU05WaCU v[*oҬX1vDJ؊s({* E%"IuguBK(ÇB[7N@B.dMdq?[bU05;:A-sBpj0~)=Ōs/>2bi"iJ" "~j y!LI ;A 6Vx|ޢ/&jN)Ύqm_i~o|8#"^!i+X e=w!}|&kꏻ^1OzAȠO0 [^C?"ISC& H`νU#O~ěLx!נupQ:bA?IegtY9.my!^;oQ=v_R^Xb=x[t窃qNJ\ M'_!Z}q$0sdaRZҵ{ 9~f7ј&``W)M˦JbdC4aSi( kRm*ژZ_ ?[YD+2sx%"Q[,$SsVAt84jD"7Qeⶱf*ϱj.}{.mAڔJ6dFGycb-ǻ> rx\u;_iMJ/m {8}*"pe&y |XsяSK7UC(O$tA](QpQdR&K2"FӃmvY揭v |'FmXµ¸QAt3 8glvV.ǥkOy!ZEl\LYkX uJq#tPI:*% b9]38eFE+7 9tV lJ pY2aY{`lx厥P뱹GpB~cS҅@.u- qs?e:3hgW9m^3~wXcO"(y4,j ؎g̟z#fWE*lY8*Z+岐V}V\,6Zv;GB[kp<-=D]^+2lX&i ,!E%+  T9M;-;h LGN_ݿC'dCudjWz|IA0f!ɜYej-6:zDמcka ֬)%{iaONL%ǧnUh /f8S9-ID0B"::cT]sTᶙ|1J2ujh9wY.8ÓMӶ+It'X6~єXt֠ iW.D]LiV?tb@)[ tw-L^QZ>۔a/DX n ߡd1ɩ bkN&mhU՚ cR|딘a26-3H#laxeBdrq1 ,<̽Y%ymvi#<b֕7-m0妒Z bkT~Knp;*TAʕؐ!ӽS*&V &6bugPamo:v;O'~}0-̟EM[ŲroOur(,_*G2 D$Z%`2X!W2 9R2UxzGmV^6 Gt̋tRDtOv:+뒟YZE~e rF-!hRycPf\l[`bJ+|% GY "+ڮT =Rda^SK5ؠ)&mk?M%c0`JĢA[SZ0UmSF &rcG<iTd ΒŒrWYlq z\v Hҝzq:|a#r$u[SRP4MY/Uw`5,vt0ZX;=?pSP6ty2@X\;$wd=-N Rt5U:DߦLz/m^'zBRQNgA򏴼 K2Mn &3:#3)Ç8C\Tӽȣ&nev*^0!`j`Muu9;iPV)@^SY]m5zNW٨x- f_bq[~zAdv]8+N!Jrhp4v]|`  n'u\/-HĝaZ9LPggįHm&H ;݋ޘ ((O*ydY!D{"A. 6ߠW@% =c59xJՍI?JLuALUgد;Z N\Y)m3Č&WPu>osu1aPP[Lg}NoQyQjyD۞%V'/(1 ##ZFzsу2LbأrjBvƃ)M"`B${k-٥CU?M"3[ѣpfΦ%oluyB'd\JA% ,ѵ~EԈo|n"QRS0d}pUzy֙P_!jDs :Pt{H>_URy uC[mNa1JRIIݜt /=adN:)& ]Bj? lnwWtI(L;SHN̪\Ub5@gQnF'~ac۸?zjf3OPJkN\.?/u!EpHj,C&:$eZMe)WTl C"׌>6P40OMLa `#CѨ3SW5gEck|9J4f_D˖] hKjT)9 >6bTL8i-V&pzai 8SQ'sT9ys ;knR{*\to'N \ Ǝ:Kᛎh LJ^[oPEK@O& C$K,~?\ +~Hz4>:ŗJ!K5n$ |+yKsH5n]Mc~UyTBfIJugv/98Ԍ )[CEBu4i}[K: ]0QEҎr1fW3#b<:o3:BŇqizwemYol-ƞKD41Izx>n8 ސW4=z#9gRC5ͺ{иA>ȃ#u ]Pe@TPLw(?Xk=ve\:Jj"Nqh(.G?N}w $Ę O0w3U u#̧ '*:!Kx:Eʁ"nFO8_۝/-!QЬ~9w)r4 ? 9#=ll^E$/op๶ J 6䋓㓋¶yFHӧTLl9P1ӡ/p@}ie( qOy$C?9cۚ.?{(s;J8ұyP+^`I!1{ש'!"uk!A:r'm:aoGHݝ 3uCXÚ"3ȗ S'Lʯ|ea5kݢ6-(:yERm1NyA@}%N:o!yes6JQ5UG_!TIh;M3*fm*?k}{ b+b=~ 2.mPmS/OŁhmӆgLFG 7 FffY &'7WW.!8GDqBaRit:TcS}#̨Yɛ|npXX*Nꔵ( *b6lu&mt8(l@~]J8pX,{d +b鮳ʅ2?ڝ1 &f0DNh\FU#f,.t<5=Q@;;ty.C@#k.\gp^;|z`T_OкCfn{9>ԟq#d=aR~C ch?wO5c ?\@~-%gZ_`r"³%+S}+'C)Bu{:ɴGp=8!R ;)[wkD(c %Н& M! .y(-ױw*pi yn7QΊXInYZz3K[@X`5=.cl:Rka I`&XgΔd,YOvAÇ?n7WW' o@C7,{`i:rͷ2(AҼ}9&=ԮLᦆ ,H1$5f.h9q4St^O֥us# Sgx k %{?A,}N/۳k:>D&F*4WOAgYgm*f+rm/@%3.R3 la5/lowAB_JxVI,QarYe=svZMZKaZj^DhIMW5x3! Pj tc0Ț/C{/=zػ%LSv^2&/cdA0s5fc┄Fb;Lů@$1Kܤx| iމ- =7Rhu.nV9Tf0tUSOROjrd~5;9$t㤈eVD1f)hUZHRjX@fd #xi Mp!2'IXע `(!ZNR}̺ycS[fTMD9޸t?ö*Y稒8rQQ>š'ǝ7D:PM̾.9;ܣ݂0Wf utlZwu\ލ*KTXƙ4cs&=< S.2 ̣X5[ $(x|GӀwnkQ8 680{׿\dNSydG,S>2VCn9]wǦ׈#wAi6W؀|^f}5fGnL"0'h)QP. )=PXfkZ#-hcv͆<2CHQ:|禑 f p6+ώ { ó`^I1XFDm~:?L2`gX,U:@+L;$[Ru{e^h6ȬkE0^.MSu(-oȏU)4mӽqqvWg5$uu Th;pײ;+9z.>Vat~@ 2S?[^?0'x7f|e@Mkj6cPk8G mʃ.JnteRL'<$am wJi4vV4L`e"Gk(_'ddFMPm$s*Jhvr>nG`Eel@xs31@՚Әh ª! &ц7h2x{_TE=C!'`/%"IT_`$0N4s/1H8&մ- N9Ȏ16 㴗G4sqG&s $a^+ 37wblՃd;#yܖdjF](Px- d'CHQzZ~cukz~$Fp,n-[^1 -Jve|yd$Mv ᮐ˝KG^ձ29LjηYzu#;,axT_<kACbp+ЖcGu9 \4^ ׾wxLVR+uN$ZA[ +ll v/PS\IC`]:0Zt{oZ%] ")kV^,\_z`DDsaw/e4:U+q&U4( YdDSB#r ϓwMBZ0c-J-с:I1Vu<ʽI|gp:ݶϖ0ݍm1K4;ս^Xo0iY&vKT TRRQ0 o|Zځ G2i( jޅ0 ؤ]'G >9jftj 8-)|愳p|"0Cٹ*aɂjE-0\TԼ ?RèhIuW>a"5JOV!32\ h1xuUcN r5E48ڳQ#iuMs54(YeaBip-lKy+C*$H*XӪwC$hJ*O x{s$wWeNH.Ko1 H1$hY̵F~w*xehxvl ğc'C쾝Z<}/#b ./iۙ&pf Х 3FJ1ӥcU-Uh=6%t翊{M|lqkא<BTaQS1nq CYidr^ n{Ӎ2^jlK^x3)EQę}bF=U#\[i 쫂'> qM@>;{TIFnA Es9%peDSoIh՘ܖniGd/$%kY* 1{i@G8jEPOTQߚAԺ_L‗O ,ȉXpxL7̈ (}A<,Dq] l"њRNx cBw^F=374ZBPCqƾQ3QyNgc7cʛ^s:JF缗HlO37%J>=<,GbY̋ܩ2EbBk0)b\e=傈N:4'jC8Ns=99GCDP8lEdHGS7s^BяRW+{FZX&6\mq bKЅvn{Wu~2!;0,y~o0I]|m2 XIzfrIy3 \ ZZvKA&=`NS {kIbE۾jc—W1(hf P[`"'O%B5ǔKütY.ٺ&5S1PZ8m9S]`aav>WDo)лn z<<''c6РVgMJB"9nu fdMً`hpٿ=֍Р:mRTEᐳwk,hL)VPz;pZZs5<{V4eB?fN$U9P^v؁Nc}Woy'#D%ZN5gv2?E?"(.G'9}EgqaI?YFh/ܤ-9ߕI9,Ygd.f?bZ ~ P]u6IG~@*ϟgBb]%.ۗF/+Y̜ܴشQa~VC/ rF^# OReT6] /y}#= 8Oji\7>8$|m'Iw9}4T.Fxd4dTE\ }h\B]XCtƆxʖ`.1{R)>(uda솢 B:AUCePF- [ [N }jv"j:;h%MgΎ'fBjOS >(doD~"YkGu== }Ӎ} *2߿>0>X"2_qۼ.hR$Ge{4dJ< r͂< ;;vh{BOI7o2=Xo1]}*C Ι7l)SCU/B,%8ޣ4țTwiqΉhv}c΢IgL$́mS?:&ql~jU /]v vup ;<(v(;ցVQz1@<>,̓MLV"4 VK4H-] nR*+ݍ9~2~'HHB .$ | ',k;7 0ZGiU]:)-(9X ay'C|qmeevIjŞt^eo-F`M_A+7*'^eYW\JX993Bq|Ry5HȅOltdWN^RulO-Ns$ tbWAJuƾ,CpB镩c{d-h.~h1$_a3Z Ş7N_̒ _  c^2+x!)헼Z kh;.쨵@~WF,{$ҺQRpc_GObwww>'/+,Ҁ.w2&Hڠ$T0_tnSoa Jv$&c1D?SJ_tnN}](LZ`SΪ`k%#^xe*L.>kYhlonRv)LeM,vAGFymk86?  '7I1>P-Vk) HCr*vd6wg9ZX!MOO{<tȕހy10V!3Y44ҤlDC3ԌivsD@ u5vlTKuU#tm_/H!.K.7ZthѰ'iJ?QN4n?̫Lt?٭28wqZeM566>3C&s fD.*Sq}x11Mzp|!T~ѷ텾?K jx߈19tENY4 Kdc&֣Y;}k~&5 ,SȌVWG$ahOJyzO TjG*`i:d,L ~@3X%,jؠ׭)+8Sv}:xZkw%ꅖP5_RfGb#R:e%Os qhqJ6; ݧ<; l>FHzM=y g׷ZIh>SG^[G-4"UX:)qc{ ֖CغQ嫚XU傫EE)9)[zІZcw4Vb}G]WT(|DeA&6YPvKiP<5Ek"|UĬP63?dk@=)0.2K+X j{ ] p\CEd=HrX~tO+B]%,Yb+]qP1 m)n3kubUSLJG?ܱo X4ptr n4E5ynj0AiBh;U0$-Y.m3%RN{oeB6G=3^&yoReO{;OMԐ4 p0>*dL) q;Ր8> 1M(G.E{`dpP80]a"j3g2Ͱ%Ts6Hoܜ(Mǡ7"yA:/6 ztm*ՙEeȔ,K!f(fi -wVOqآ܍FDsUz(}hR8wx&n/̆ d]{ M \ ڀ"qePk0+x89D%&2$\~܎ A2bkNkc9*cy `1ڵxћ4QQ${MſnHmEH/"û.[.|2K9-My:OicJ{n-Z4>LȜGVᘅ& (%:k{F!,z:$iqX'O*B~,FP 0H Par K⻮؈('>i AFgFZXXZݡw*0 }1[ ~NFm6KA&' /TɘF"rp HN2*WCG^u/9Ē)d4* )]l6JFh>őVfhݰwnȠfb&.lg2Y67sѡj*eQ˨vgLjg42M|ƛUSrkΰ*ږKu3 wܓF -8wXutMd{ n7:XB6wD5UHQQo klٗڑY{pyL[Gzoh<֑Nk;uY90sCIe lT/ɹ65mJnkǪeT6Q INdtM sKR:^Q NB>~6˩@BϔNKRz'iĔL筁B4#53۵jRSO{zԮܭs8@M?yeEYȋfA>#'b-̏6 譵R,K*;sj>/u \ ^L2v3P)𵨸UxKieWWq-WC@ 2T}ȹ.wbUa,aKזsO( ?^|֯CԔ ȱۮqޱVD$OD|vrTd麇|IJ"=Mӓ4T}S H C9/`Zy9אeL[yq.DxG=E}Jzi6b\Bf5?r/<NuScxk;P9 v<(o7I \ʚ @]a-1S0nM|ŚhG{?*v;芴kEr0RWĐ|ǔ'ؽk}*x#Ԣ0"(*zdָ.qû";0@b#L˫?#Ϥs^&9~&&)ڄߣ~ݧn0.RsU`ܑu퍞 vEޭ̋YnˮG2Hflrr/T1C)Iqx+`  ő W:|IHu{iKOyR̀$c NQa9ہL"_v cHnfSFl)$3|HDQcRWýjHIp3ZHD"I@Cm`I] gAgJư"fkE2I Jh7zpU߹t8g peeQsBߡI $]1mj^lk oGd4?ڭ -R,՚!Wˆ{J[ Z,g fENIn8],mu)F}isn_q9. @辙9/$yVi7TIKl?HuaTL>(A{!,^}g"[7*-k:1MQʣ Pu$Ш|]]s6 LCÓ/tq@x "më3|HMt91~Z'U2 trN؁fFLBQ$iDQ,?HQ>QY?%=8-j؈ ywSe=9q̟T "[xrb_{3>&d֡4d?1xJ1'-<-Wz&RY1v 0\ːIO12cRDV$jו \@a0@<1hdƕ}Оj&\rzs+ZAjeckq[+M1_Bt+$F !ڿ,7Tx5/6u8_NP1'N$`Byd|rD\v.HQBY^pIjCK|:喇{dT..?ɜ4تEZ UFK8k*"9&Km[tir|5-w0c9$v@![t\Ti ?q S:g+)edC|2 +F܂C!l/#.+TrR3Vij_Ur"{YѽJ Mюa< vM dELܞ^;}4eCI* %'oNpǬ]lC)y 9$ʇ';Wח/Pf|$#nטZ^ƙ׷ӎ.?4'+W'oGT 4d+p77c:!a帛OV~74͹7rFĆN%&e)@to!ߐSeHHM0ӸNGK$3FÓS@nGJOۂI++<:Tmj5E@P羃C8܊)+z?,35!/7z'#u 6.(n;iN)@6ʵ4䌍Ax1^.KDٛ3T4 5fNr#3}— [ j=d}n8ݥ0{6--)7 .Y'tX\SHqز]IpUWރ$(ml>Gp0]d8@ XMY5<pn#f"&Y؆?tO;兺 BLu~>M'?5PC5/ukDj!&Q˿=6ruL\bvHFI/ W̃tȺNJVp$sJE_|aJGŽh l[K_uǟ%WyzHQZB; TߙRi,VX1KZu$r\b~`[ i۴Dz:6?ΧJ.6mp ]|te_rh73Llz)r%{؛Jvwhx@0·Lm[z$48&QX"Ea,u%jV$X k~v)替:b{9|T`S籉k8z.-uJ7>IG,6r'3V?>`ss:CEA=T pD:#=y8iuXn\!aG'@$\y {jx{#h_anFım&JK%K7[jA/3hH‹fLrV0h5CH19` }U6U~?Q:LW$R62RV?k +{ xѠYή,O~3,v c EUƫКˆcY?[uZJIKB sG(N#L$!w۽Wd9Eq{ɉP5x4N,V,cRsX?UE-nOL"^ed7 dcޗc$ ->JEb'7 8#~dJspw"_^b\r|`/f:zl*GϗԻ2ZE:'l'99 0@KCLO-]7t؄ a m*~ڂ kқ/`%E|(<n˛WRV9Z> ӏ8$U38V)!!wElG7j=[4 gSMEe&ўTI+框 -eNg&[DÆ}mHE;[.Д܇i%}3btD7MFWg(adhzserVJ<"uEIZ1+avKsH<|0ot$@Q /9ukD2TtA[8#P{]Fat㛥#,~qkNv:"&7#{z)LҸ 2mac$7|I.@Q!@x*t~5틱9A -3:Dùa0da PX7}hox go޷(r܉&P9؂GFF³:a2jd8_$v`c-+>/Gr]oP lK]ljjǜD4^Phc:?B%4Y64? `5cV꽁%?c= <`\21%qt#KCc%Lc۶m۶;ѱqm۶ms0YLO-ju=#vS!@"6"C}B|uˇ{ǃo~h?^nqE4fn^ Rz񾵹l۳&#O `_tjXaekA>=/;KtKb`M1'# 07.H= |W^u!էd']Yr2 5t$ӟLZao7>q:2ӋEr珓?msΉYHtUۆ7$gmgfOFR<]X?tLJ5n+Y?G)_\-9TqtQ U2rކ^T2 Wyo~?josa# 5܅[9 +H0{tNhs,2_è(5YyB0|:"Q[/SZ^.A$ME*^ԅA$CL\zȶ%=nl+Ϥ`U Xds`*\j[{,ò2!Wic~!)/s=>+V(L]Nb@1]h1x *D:EpX~5 A',/?݂j0@d7]QqґTZǘrͨ +)>(#ݑ}1N<_h*ey^{NpѶU6UMW5뺐ƚ™$5wpVcKQ`ս[cyEMeZmr({l/^`/{b_J&ȶ:6Q*kݥ ߲am+wql50a>y"[o>lZN&Uc*[%"(чaΒ+~ q66pã+O*5]<J?۰a *]!Yjlk)Zb+U71uZH|tTc.e[2.tcc=h:nNH?{Ũ0Ir}Wv^j8NXt.͌ }ŻE) KڼBًHg hcG1Zem!)D(pQxŚ[ܔu*$bO}t籸c%†LLX͘Jt[Rr0rN +U(Bjfu5rP$EO{G`EDѹ_u-oó׳Yw!Y{ Py>(ST#/5W 3;@~Y\bmZ𲟿[kaQjaA*{]S&2q?u`c=MHȎE()bgᙍaN9Fbv.*ҧƽrR,Y㣂[Z[s=o\dʝQdbਝҤМD,x)10X+>q^nl.=/2*-l:5WaԂ@k҉{9b-:K+h>~0G 5MSڂgS;&Hr65A9!}pMdTqG|RBY1N:c[5Ɉҫ0LLKb-lQzF"0&@㚖XYIǁpCf xlBW ~RH Agd*R?p}&rwDҜ'-DA3b j@!~p؆ doŇH⬶7cŭ_U%&%`(G\e&϶bF3@\b ; 7bU-ۢI XN; d|7izjNjKv”rU ?QtŦV!=x@60CvKOuIf:Y/m|K7vw%ۨZәlx/KY ѐub۔l<`K\_S%s?-z^%Ww,kAvv)>!i"<s6ZT8 ^Jˣ=is/x  ppP( :S_Zz /T9\LO^<wRdqQ5=dH2*K}SrOjU/3bo=2lʮK?kaM.]BB /ᶫhn/"ClXBcBB!=6^A/ڀgHlZ]R*FL8BJb%&ǹpLwnyY.Zm}Xm6kz=IIX\f}= OZuA9F?k ΪòvTvpNV $I2P' -Jʹ"g6za:raԵQ8z?\vV Ӷ'P֊=aSǞC9`@8}o0=qa $"bp\՛ ܚH0\VŦ`pZ{>}3[1ەF~a~x@5ŧW0˧kl/:Qew^`f  3k1N-r$0H2ԾH1J96͍}EC9wz+DU8cH>k^u} zyRʦY:iEQjТAj?eYߎ`rIe >k] ]%=/':dUqLMQp#0b/f-5D!gLG*[X9vT]tQaeD l=6cUH'J- 6Zbي7)_y7AqFBȇEy;z1Ž~zBoaA;V ; q4Y/??z2[^rtE,u6&7B yE9.TX׷΄ڳ?S1ËUvݛ5`JhK\3#S/i 'RM/ ͫHJګP߯"‚ 0 wP"oMeo-m~bcҾ ;Z5حZS X)W#(GKPVU`]L5IZ],;"[|gW*Xd@neDܓf# V8 "dg9k j3 a[6Ơ8!+ T{du{_U t^薔rS"դ)X0'y Фk>϶^moPao(4 ~xc[pg_@;Z* ܥ[-1c@fS>DO;NA jR."[a f1мu T# DV ,}]U6Ɨ}9rz$3lI?U4IS/@Eͬ`@+bSGF[%vhn)>-{'7Na6/DhÍnIsGowF:Ʈxh){ iJ_HzAKl['> D9'aH=N0nqӨ6IHY`qhy?DtrXWzd{ӿd^mt3X(MMካT+c}F  jgUZp/"S. &aޭ00m=?`Ͱr_ F v\0`H׬uq`?gUDevV4UM [ݪ@QZauyV}5NvUJ*CXC9js}5`89,$pmA3.;ro $"Ko~w7Jۺ ^J{A+ޛ~69G+xQH8l k섻76VD2}˾N z[0HCj>IHF8o0!)KpST==}s1ax}gl#I2cIViƞ޽UPˁ\h0c'@iJgp~uJ(**9+h2de`dSݛG [fEK'X/#pi}Rz9lX?チeĝ=MG!abi(PnTR'Yihr+=YYNo9s+Cs.pttIdjGj"1u1R\Bgf*ָw!R kE-u,Sܤ^"Kw"')ٷ{OTR^y~*gPMda@3Pqe?=J2;ŷeT ̴̒6ԆIt{ |~, rfM^AtM%p8 c/؆,/L ԗяdpX+EFږN)$-"d5z)0\%*TLhD/̷,ԈP\ųF`Dž\yȥ AT `:T5#uŏwܾ~FTl#YB6Lu*6Oʄr9 I~_^CU1ZᩪIDI;7y;}Ml䇢=΃p"CrQP[ݒTWnTcu?&ٺFvH6„(PhJL#BOQ@VT7j&}'3L:\ގ[Pkմw 7e*׾&$S® _ .D5NIH(BFeeQɶ@&O/'FRQQv!Ȥ/l@"7ܲΌ"[)͇9:-%XT콙:9jʴ,E~}0ʄRt OM3_ڏ$+I+G8A7Mp;Rg2kO B쯝81xc;FRY^EJóh:O #HMڙRPů>:NS2q=6ɡyy!+/hLKN7M<{bc8OE8TE^kb~EAID[5 EJwԥbܝ= /86`Ϸ z q¯҅C0Eqٱ'0tuٳ e RS|#$߿u sٜoStk:]MTzRz8  Hr,(ec=9#c%TINP9=3à$wL(y'?ӖӯtphMQT*"ļPA T8k6؊U(oҬ/77JmE#5|e+">L0X'J)TUw0 ᷚ),wGէVp%/+h[}+Y3M+}66A}\ BVTϩL; R_R|0Z&6@LvWHEu= /b|Ż^ed=nF'S}x.M6;H7 :n n"%&1Hh>j 4cƢJ9J6?EIk7UV:'鳕u&o0)3Y~i:{ZtBXTBh+b꣝-o#,l68ED)>U-|>TL5}S)J?LQ>]w~ ‡QvU?) R$'UVb8@{a"\DӍ3)U :NM) Q3qC9M޿|h x 1skY3HRE˜_#}[TRDvq3YQ~"Stݮȵ#JefCNZ鱅M1K;6~8L{P~h[:9W[ۄn45Z>`ɘ^CBmǍ~&g ; ak$^9w}Y4 Տ'0O;-.ȜF r8Er(&{jw|z"xR.k33SvfM/?ˈ5am+}>!Nu=YU 4а j%$m,am#%pو6۬EF&S'NHiNI3s#,Ԥsu卾4,xh >^WNЋ hɰi?\Dɛx%欗fBOuʉyDucc6;}; =-&[͖YEC@\} Sr/Bi'<"4BPuh2M\iw>>U% L;q)/.ew I YQrP2m1zj]g*[VsBap|%1[#dkCJ'EL&wuBF ~6]IQI%8lBU(_i ʱFc)F/< | M6Cz yGށ(И>[^(4du8Kw- G_ }[0+lZ4ijF-8qR+N9KQz,{ѬJ! a,g X/oS;²endstream endobj 10 0 obj<>endobj 11 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]endobj 12 0 obj<>stream xsp_/ul;;m۶cvl;mcuNN:sTM՝Z>ދTEQR:X199:> ⮖ )Ȓmi4Xyyy)Nޮ@kFSM(̼vP}<,흜,ANJꖖ% ho WVѕUH+i--]M*f@s͒` $s;9Z ͍ Q7)fenlts<nkWSGg@N?|ҭ>S )SqrAO*Rdc Ƕ pp2w'X|rA@G70XݜM?m9冻<`ZZZ[}|b_N_>AnVLl6A4t wyX+A4 N K+xf%'g4gUf#)oyRJ r:?Ŵ-h,M];,E? g~@7) dn25-,]큎c-`deӰ9~N,KGſgߗL|0HӛVt\qGQL `daOx8_ @*\^HYX?1n F⟙W:Z|.E]-e%>ece-swWU=r--,cM 6YdɣF)KVPV~ ozs!z-=*M+QFeaW?M}]z~@@Ȋ2L*l6_%v@`,tHcp_W>r6|tcD`:_~8D 94ndpfQdZ?uLB5Dv-+%eXeT$F1q1Mlj&%$w.BƯ fmg0MUU \z֝^1'[>ܲxJ2, הG Mx2HLK{eyq/=G9@:Ӕ9gAk }vf9|O>Aj;ֺXmpf!43$Fq͗C6b(ZLtϬ&3f8limQO@!>\7`lzk;t  aG4*%HXqD~,rW|p+E4&]t~QEi/}@qN mW"c/Gz(}(&D򁟥%Ĥ4$%rOQuC60Nz̯ʙ)(/kWϔ '~p]9cB%; 3> \d=$>KZM B:ϖ|H$6yϲVi:&W:@ށwU ҩvm͆F׸x~S} O Xسm@D,l)i~Z7jg!@,c ZѷӐ>}+*%Nc5| 瘔snb-CQ,|^W&흟7jdiY_mjoNGluhޣo 6t,I0,y r~ς&cS__lh͋\G<%3ݹضZWtu'[ubUy7S(6`>EXRlf\P9?JJ  kJbVQ|/9[ި)D#_#E'Hc,BJ&`=wHdZ},۽S߆#mS&$KP VrV oDǯ- nZp#vT}dɄvPt\2s͖B,@SZ|M_z 4a+A*]c/<-JX<.Íٯyl@;H I>:UIMHcf<]K;e R&KBp Tm]q,g@h aM~ŀ{I#nY<˽265ɓ!$tD#%ٷR٩v<" evj Lah٨Bikq╳SS~A#$^r8zF\'!򄷨猼Dq5l-lw@-9QL߇ybc!O~Z(]bF0H=,Hw (\t'I2׌Yc O CJ w;nnC1~ݾm`hx ҉?韄.^X:2\.L{uiz#BK=&VgJi|*= 3oɞUã'vlx{ _INDCJ?KDO~ûc Aφp#j0osemT; K7IlvJ&tQqNnVg# X*ͭBCG߻t"s5V%/qrS֣ţ@~Yj#'M^8^jdHluw'!TtT)zLS|s!xXM~,])Kuݿ+DI`Hr? -H_$Uf97Ef:-lhBޭFە񊇛yGWlיy(0Zʪ@t%OF\.i2c\Ƚ)8G UG?T)&N*BjG-'HPnYكin;f@v57fM#.+=m 4E?<7ܧ@yGO0@͑a[ֱqͽjζ&TY_ ,@@}c;SĢVAU]iP)38Ma?<0 -8FsQN YmLiB߻'1[̒8>LdEB<%ĊD .%GPcK`@Mx;wB;N.V)G:m{Jgya762G{@]C{ij8 2F%js0V4;Ja,%(J9l=&qK7b/ I"t (>HE V2Ww4N*dO!4a*.˱kUMذV2h[_59:EK>c@F;v3(:,, vc R 3G[oɇVq-5z3k#Wiy*/dbjصsBq1rE;RE߉Ff'L%&8Hu(Qrd֥nWu_?wmcbiJN)lL*bwr&s=T}\7t.ZeA"4$u|ICum84f98 wIcJb):CM}{ &?,o o{>'^F?)a=UڨAEJ/ƅAO1ğ5֍L~g1Q<@qbYIr A4ZCI4P#;k]x=#H_%uZa6`;e R80Ud<5)f^4]щ|k0ƵoAz#G|(*bz*sZX!̇m[qG~🎼BY_A^;HW9rz,+2P=f6e w}`ķ'˯(`6?L<7Ty xd Z\Ӯ-  Cː #]jCX'Bϊtd):uHK!Dy_`\jk'*wOiw8ߏMcx-tp2޿7 HK& D=Jrx-*oZAcDŽHQ뤎R"`.jѩ4ɏ*_ *vGy5a̻B^D0(M {£1oK7'ZQT~W K=!jRuU¥GHs3kӃ¾B׎)6]nQNǙ#ʹ.+jԵ5Z_8N",;<Uxs 3-[4VRzOj9S9P@FDKzm8(ay,ACoMQ%ɂ V{Ck M"H4s=)dUzg}io7(D5*#j? 1H˰0:ȹc STZf9,Ɏp6rFqDC%ˌ{/q׵]dV](WƜ>o/kaɵYүAmHǦ}p%B{{X~ƽ/by28&_ı6 04Xx3GGPU B 3G_B?)'W0Qp^3nSy"*b?o9  HְZƒ}w,ǷfeO_4Z.kTk2U?;"H"gJ }Z{;UHNDʓ&1;{i3v.51Vy*K7;[N=&9[̇0v<>`?֟ -vX{@9b3},yd'{yKVUXż:8cQcql  2YR\'Vhi>r\Т)_8c-k^yWhՁ)ۯҁ1!F+6Wz|5O HRKwb ZȞOV_<*. W6P׬K$%MكzG^x}44"ԭ]8-9b܁gv֪ydXˢ<Y]ƖESD93 .IRIfj+Ly~n`Ƴ(w#x0UbՀf _G6 U;#qtӕ٧7_]4S&W8C{;=ph2[R>ꖰ7C_CJne5߬+Aq-T}gB&*nF tPC0?bvY9R bd>&Fv~љ)UOd53Ch0H`,}=d>g{W(iq!/Q ùZX؅qUz 賖_p$ǦQS?ޕ`'6y'^.(eQ;"jnyٞkfܛvΕ3Hޥgi,4de׍U~U#Wt<o:B턲ɚ/uw+n0$Q~) vF0|cby-YXFwz77S^kLlI\vʹ%W,E~t'dD*}tAB-oC=8%ԩ/8i ob#'Aܑh^5䄑2y~TO-C3*ᶸG`<%5Ġ2¶K.b f(~2TYkAcjV1 C8+ , Rx̣ "|zI%{ISRC;wRuBI٦*J~nՐ:~#4FMÛE}.l5@2gM6z^WOoi>`N*y%'s].g%%&(c/,F@53-I,Χ^ίRbsZ] gK ?iLq(?g*1V Y1坠cvߚ8<}n;93#DWm3/ k6OIMP!E=G=PͨL)1d5/E]cO+:TyuovĂ/)Qu'8bdʿ?B "3zU7(cPJ\}6PaI QC;&jAG3ay}P:s;bB%(z> Ϙc%޲h S09j?l6\duc [lcp%7>ghm4{C]X)-@<544O]g-:.ym!910cKܠ  ?B.'GpCi(lq{XGX{W]##[=gdw99gg"wTx_LYߕ/y!aίcX+R!6u@0h8{kqa)?yԑ砉ks S~Y~q:;vVV%j]Usbemr}x얍2}$VF%ټ ֖壞b6Bp= ^_NB2RGռyVE|6{k{c1ix65;{<Hӥ]*N1U~)YA%CN ] i1\hTqqeMvpM R=f7xet$K')iw {c5z]t41-$?afE_S|OhqBg &WY]RJcHJ:Fťq >CעwUU9%9#З*Oĺ3F|SB>i`:gRr8*/ ׿:4Â(= J{e )v(e0/䦢TEiMfij%ؗ"+ ]sd!A0 DRaX jZ|[ >1&oѰ 1eև 9)>\\^a/7~c}R[N3W#ԙ0C@prAnRyBY4[ъ~V ;T55_Otu‹$Zɸbbyd.#6R]O8o>;n^+Hջq!'ir?L>@1ͼDlC.tmcKڎH2уj ܟulwr|~?S3Ќ:[,ĿK IPCe&w2Ûv]~B-zggE2k'qK;lܽk{ kT:{rd;k?'/^4/TpziGEǞnEZ0 z >\uq=e=&%bW-fldjoI***ξ QV He+MEAC-d&=i*@7 9iTǚ"WB$2יqAT!J#wavQPfd[$'"-9O~!l[f_pME,cŏ;\|(!R(*.#/5ƐI#-ju1\ퟓw͉-Njp\Bt *ZX|GTh@AY9$w|i_gG;TY4$SWT Ĵ @v$~fWqCਏXMdوӥ!=fI/{9:'AucDij:HCLL.R*gږ7@(Ư`:W 5:RE9(x/>1q/M෩nz#%1%-qֹ:ns9hVS,~9=q}ZWE9{YݭJ|-ECPU$(P$GX{pd͕iƿ^3wPm]8nwNOA{~i EYF\mP/; dJ cl_b& ڴriu9rs0oمZe7Vh1ڙSg|l|Ş6dJC?-CS+ltf<x.m|xmh Κ2q~$0-[ccNږ!D ިp6V0 .{a( YxGn iNjAݯۻ=s$iv.82 4Ҳ ~5ȯbҪ* #񊤽"Gq3 #5gs(,^tĵqF0Iǃ R=NX2pi]('|7;P>$d\V/ǢC7C8̟! St$R3d?#' 4;؀:NQ/`Ԋ$$0`+ P}NВb]3:h/n4*CݝDmtd/yl @"*<pV?9b[-k'NvX\0w4ܪx ^>G-_ޭ@Xv\ "IbbS2Cٮ|b=OMpng6-uubHueP_>QE Sr?2ՍܫQ]8OYbdEH ߦw*!QhdOo}GN$puPx˶طwC̨]EZ?x5a\9^?paҘO':}1~O@0$^kngdeTxg)+2"c2_!X`E5A7Oc0)6VkΤ;SO +Kl0E<-bm\TRq;R9\iW)@W}mTcC /e-m9T4NrKM5M Bg~88_M)6{~_)t DD7#Q/Om  q%2kLZ<$u3;TsS1^x@ͺv^ ~jn?=FL*u^Ms1l; w1p].M&NZtq ЂaD.(T]+J#n>u}?EX`]hjn?%I57{jڟ\k{O;->mYZ.8&hE(*~Ytz9qD Q8UKPd$8ǎS4 8d`˜ezYL F9"Ylv< CFtJtxHt MTMaId\_ڍ\b^-Y@3Ekhb X3>X]\"9-GY0:a, Q/CI,z'>Wf٘K'*h A]7jXʍ*H&WBITV&93恻S>5&銍F;9G,t}l}+K-AB lSɨiwZaZXH7_cP*.m)$nRټ8tfMi>jj!ϛZL!4ay <ؚi9"qbd3$SQ]U>(22 Uee>Kэ%)<cAR}.nI-o *0M>s[XmaR`t^T́r]B̋L])ziAwg?nWDiԾR9^̕((4l>jA#';$Ў2ebwd25S"hrWn%"`<ْ Nnvi9ʁ]Ey룤H}QA]8@sxabnhRb(UKJ QdX֙%X-%}JugsnMOpÏ ƒ$F~~?bke8ײͶSV6hY/Ux1,;'qQ8̷W2 Ω:>[-G݈C%jR~Ga'3ΜByϴ,F51 *VW3w?(Q [Cr4GzFJEXun煡ƈ&nŘO4t?NP qK.yrfK@H*-1ϯqZmv{e8s.ߢ^cGq"3|< [odxHNyYL樿xM}et=RbId){{,[Ko)={B EVU790HhdP,@}Eez%&+v-^K.r&G@ %8ZJf\a0پpJbeB~ vsA@j1$֭T]_=ܩYUFćNMqƀd^gqc#zͮWMELU$8X KyĶMʆ*bq$n zM2pgy{*,׻A9= s@MV$]D0I UbZK޷`AWkp5w|g-FinP˂/?| P{'> X% `&x0|5䳉-K1P)+ bb$|P갻3,̋>IiqWH5m*j[ #0c1r|Ѡ߿[Sѳȯꎨ0ĕPIH޽m-e]3/nz:(]A-z ̇Z;!&5W /y;s.|ILku.2Bk<}wLB-7HN8)H m[գrQF>q^" F[ʋSHZ?4n(DY'Sljh OvO{x7 5ϋdQ"%Up4VWo~r'.+UtFn GHfHɇOW HSݵ't6Nc&m0?_sSV/ǺGAÜ![N,+g \"-DT7I;\m3RY.'[ۗC,p.r- '݆IMo 8{f5D1Bh‹(hGeޞ4OCaFQܧ%B.5;A~T"M 8wSP{u+v\CG!$5L0@'9@5 Ohnx$1N5/%2}84Pkr! $`F%W/Oˍp84YS ꩘"sզj}] JepC!g2`JNhCrp5[L~ QZb}&<{ļr7 qtd@!k!?ke\MCJ\HUmw"A)0 -č`k_c~^mIdI ;vCp `"/p3w!@_H6 ~:dҧD}3B>_V{2)3z@v 2}Xԅ=fh,91NrpfvkEq=m5*8)|kyuG{<;=3@_qphR NN3=p b^Li_ G=;#5rRdT9ѳI D&ՄkOd+G@?Wn4@}Z#3NEBg=T~/1ܢE$<}'J0e0m#n{3_:AfAlhHK!L9ĪGEBq@, .;/ oz {`V32`f+{S[1ϩ$SC+AvNߓ$Y+hHamJ3Z=9ݶOO 6k r ^xr\U`roMAH"IŏDr*?#>UЁgz{#gbᶜ+A]e8zLYtOj϶ Ѹ癣vjpu??1c)f\?bqI???pdhc1M%~#/GEfD u;5rQV]({SńC"NcmHqkt}w/>[.Km㢿lbPM(Yu4k`NB1؉RCAܲ[[}b}dѕmiɻ`u;[l~mˎ{)GJ-m.t+Ւ?1QKCџ!KȠP_*@տ9L~A0ޭ()h8YWt\ D [=`+juld毬tzuGW& .ʢ΁Z lSYgIMU (jf]Ԅ2)o1:Τ?kk"_W Th3W\˸BBş2(#kˤm>AbOk}$f8JLg庥i&-U7Y=X&shozX'2( '/璄Z~\!ׅVN۾csj|8 5"(#٩ j QB9]4O Xj6놈NC 9]x_B7)VWq3m\=?y(kzx4YGO2k29MX^N?? ) @^n)aq(3L1ሹxAJʆZJ~C&"\r"sG )IVkZ-*UHѷ{N垃yA3TߵQO3З GlC-.$rs"3>ɏ)g6ӄUAB)z?7ScGҍws ӱF!@nt[+JP\' 8/od;bG]GL 5%z!Lj@& +?gcaf n|lL* ^#({DMx';z[7ں:^Wc&gU|X4\^~qݶV#yKÏ3J|4]Igdg\!"/ۢgR!so!YGAis_8T޺U"70m@*}x\W$ 0 !+P%9Iyd+CcLBk-j^ w{$T D}M=U7X Ÿ#@UO˽N.8ǡםT}vt0.#ѮMԕIO ύt'iok%hI.3aS@WX|ƺ; Ի@ FVebAGP_3jKhCӊW%L2q!0SY(K_U/Kks`6 tשY6{CbFo2FtXN} OłБt 1I,Ǣ|bKP]gӪ^qš𭶌|i0i Kt,Vhy%+ϫe'Wc1[Ag0,֙a %H%674bхM/Y( )(p@ˑ~VnAr}4."Ttf"Ѹ̱.+@[lm)""mX/jvLϩiV\PS9b}D_[ÃMiŷ OWɮ#E޼}3Tj*>|Bt5׼ȫ=(zw(ED]j8q*[>qFӹmg,yV8uSUf)0Bԟ\*rbJ+g[.$Ɩ z3F[g4/S[Z}vi5|˳ۍו])d:wʲ(W@kE57[{|78m89֋; W3}Ejad@RfR<Þi(7A#po Tp°΍d3ulYǐo='E6eM%uz'_E;iT-KE0_gfB Ls㣚I/?J&:zW!zZm~ -*~آ\b{g_>x'fjUIF`!JČX m}qk <Ȓ*V぀ME'%YUTGq=ШeKw¦[ut\F`QIS\^L%!Dt3OsgO56>*K3$mcr9FQKu*(ᛖܙa*֚jF@3sf Ds8dqwf5Az6.*H``^9Χ؃!-jc(R | ˙qǹ3QVvHH~c[@#"\{_Qm~l~6k+yFP! +CeD/0Zr4 TmN4=djN1ĎR>\j(QiT{3-t*d UHCf˝dC4w L\n֠ *^6YAX~S0¾5VҗO N5'%[V*oO~="Fkʚ5y*!! m*Z(=`سaM@I̹vGJ0X#xb؆PӋ.77o>@`ЕrXibA5_,RPy}v K4^Qu QTlke0uХa,a^)Jo=뽋*/H~z rJw>RQ<ܕ{XPۑEq^ҫhc+RO=uƭW&KN BD )iMZӌ #E8]cWꥀd#gk'Hvst_LY#3 g067 $іev:(Gu99*)0êub]Y"MU{܈v2?v! ,~PlQ98:2);fg}_s&fnQpbCQl3/i 3CDa;=Xk"πyui#RjDhUoX~JsSX<6R ˜0.(n1p`O[TN4M/\]I*87z&3] 0`x\U`/ij0H Tw>ayME_,Bn] Y0 h+_pA=0MS5~WNɤdϴBqZ,eW8 Dl?s5ǹQ䷾_jN G̉GAK(p3 eT/0W>a=]ϏH;yu ρ搂q /5l9: YC_Q3"*= a>;NFzZ-1daPc~JD_e XԵ75:oZwzyd2+H.6P oL["'_Yig1g{~x[Xń;IX7O.:~*vP]M yj> ӑp~S)"( K8J6>e{Ml Z"l ]ná 2oV(Զk4rS=3Ԑ2WB\zn[Upi .^Bq6=I¨[i1O‘)I;5:]fY'{(RMfn>KpP=TZj L/5s?$"BO>k؃hp\a7H3EʆRWW%%ߊʦɌm#oۍ*7jPMcbɤ%ێȔ@d!sxo9j[ !+1 `` J0|Z~=5.%gig*gz3_W)8Ɨbf3 '[tZn='4Gs6C\b@ߚ?%]'n^Gx9dsT6}ORLv3}ۚ'tml nBl룔*$"y'MVq>M| w0cuX%9ph8j,R9ĆtO+x+QnIC͟J *ILQ6M-n[7[~ Ū64сC9r` 'ϸG1 _\\O?a>hwϝ#D^b=nk엍%|jSd<ߐx$5 n_{qt(jY/> NGJ6v0G 3X#d^K8dXY8ȸ$Iv΁@bb1&D6D]Y1o!ue)4 [_%RcIN % ']8KhEGJ_uڅo:߈,ÃYc0|q&p2vBe_Fԕ*O֊ /9f4=dXtUlcG[Fv]c85M-ģy`Uj HQZB9Wy2-g%SS~C߄WrYge/@EWۉP܃` K HAN@BߵT:N*@Ѵ 4h(NsQاvMD6%¹8:~"Gcffoo#|;u@b*"8W ג ‹ [BxtcSY۾s^;[seo+U5цW5p#ߟ[~4P-)=˸30StxSmB. u4I.9E ia3c¨{X/@Ո5mG }bpodnezmG^Mfz$iQ#HmV]8@Mfj .ըl0QNyVh2+8?.hG[ClGzÞ9IdR8c=T 9[xer̖t9x܃‚*p, |7XڊCxm}3|e!NA_g?C[]n=`4rzQIT#zX6LcF`qya4$^ͷjK(A܍{>R{iW-*|UMcʀIO `U8|SMXn~ɦWj,2e<vj ޯuqe Uo`)'7|Li *>1H}T&m)(a\p<=8ҠoLvJ1Y2o?45 VLn az/%xItU%`_;@6 l&ۺް@O4ޘ8נb QBLг,Ibjo}zz|=vj#@rq!_o+q4D?b/RQz">? oBDsT/&B^^'n`H?b.߾Nر{zk2P& ȫt f]zii}StaIɆVHJR-fՅ15^j &.ʔa&OQZD6<7ܘ?36P o~㛑\:+\wMJ+j:@bk%BSu]ɜ8 II9;nkW"mL L\=>{2(HjYyVBVఈ{u"/Yn|\]_j%&aolܘQH64Ӳ_F_.8l((Im22cFV0z~ݳUn?\1FJj~XF:d 7$VL\M~#0d>)r6IAKk}8湊Z,ھp^Q_H| &DyQY>JMr7>>W$D9Nٮ6V=]I$$$B}Ĥ1ܾ(E|$^:z ϖu}[׈zhk'Fx>ùdhŨʃl{&c[mW5&0WU;`{? V(#W+1`W7d4^϶:[eQBq;GFR5?Ӓ85Dȧ;C" R0x"0u)i+ix\`fvDN]EWс2[$ 48(3QOmn_Lhmd Kb^9hK([t*W$37}p˱A$7>,"WnX3^XGòMIϊISNș9R&02ݢ*(ϒwT́xԩo03Ht;P)$*tz>x 4~O[AEDz0SIz3㪅U͛\\Ԣ7[`0:(JC7v`a +ΐ*4W~ucV&;8HHJjGT*ipBWldlrEʃMO;}[A] *c`a~m?@.iY~WP07mF6V2" yd1NT7s3ssvzJ15;L52Tz!oi CzOSZgJ\GtuCĊ;${,?cAh]-r8|ae:̒j˷xvAxvx,RQH>;sK¹KQ7Y^jNQIT1& BbQ[߳`cm+W+V~$oe…lB$S_ulqɵw_~!8 "@,5I~VSvrB_xAA@B+&۫nc↠ScYU$GEy7@ ݐөA(5bJO zYh6(L VäEn~plM9OKo^{x(0=>5Sd7wR j Da1Kи^YeηOG#݈B3SH'ҭ3Rq~&tG$4nHFm`b03S 2Z%X/0"jzdɿ0~rX}=\nf@ǖ<05Ugaf|( PjF,-P[7b=݅\jEmoH)'0N:-22PصWYg_G;υ L74MQ:[c w 9A X6JdB ~1~'0KM%pN?iIER0#&-(v` $) m=wKg>ŖlSZ; 'bձ =!ɓY/((Kؑkk_l { (^3:!7swa>oK-j@\AٽkEy3SkGLI(6Msi-h9@e΂i{+{fu&Ti{ФTN{7t⋫Y],ftJ[m vx\_6fƎX5з^-=JS J~fʶʒ"81/t:/J_$?;"9<12 h+h*) ;"\$%߁BvY-~uG[mwʜgu3gu@v{4;0.E-V#dpyگ>f-[+he[<+ r~ϝ_ȇ _SՈK9,WT}<)zRIk*8h$ (H EƗwwrV)GrK$lba()ܫujW%Wy?k#V8n%5Y ,0dCt. )ǯm[;/Wb[M{-w%g(sBK N#SET^2DE0 % 5mH5|5lWq,[ YU7R0M"=/+cYMފm-ߐMj[˖cxѐ=\P uiʁ4-z(i$Hș02M X.[†WgzA؋˫ qf^r+vDE6osKZCpnuTFM☤L5%.NoO\m'l9DU}g@gtyjl Zhp=+cX o3浉 uɃ<%gAfA"#oK;2`ezX_˛&tw8#gf<,*[{vfX\ۢԦ~lHGER -Y'ݰ'xL6*- 40Q+~J^8'wռBwOʎ_KGR_S7nmJpI@qz9_@)2ϋWg!md4]q뗉 q'\Qȑ\6?uln2f( !6d3/Vv8F/ Cd!3ZCF ǫBr*!RCȻ*z{j]YL ȫ=v"!rv.6G*Kᮋ[KVr }%dqiqq+Fib+|䱏_dHIvtD=U.mm?,LˆZ6tU3 b2M=kqni޷Q{ݔӕ9.%zFWS-6x_\"|=`ř}G727HX(eI3r\90h^^O=Y?BVdtǨuKXvK3bKϟ Egܜ&<]zpGl"F)g@U}3X&d<1%Ė.9q{0 ]KтA V9 R+G[ $z)EF8ʘ(Wh.꾶R;k]tp OmG$/ R+aeeiX_!%Ee폵ݓA7L9B.* ,ι]j=z¢f1DVNy4:4Ni7uOa9̝d0J!>aMFz-ߜFZyYa7~]7Pc2ť(AojkC4G |})&|art~`Ęo)vP78VjY5 Oncss,dhP+ 9!L3;d1[c7W W-̳-?[8d [ N7; - AL[ULBMrN݉8l#0\f%Ү=Dݳe O}pj'/2 v &{'=̪kۺ!w(nSǛs&tWU"^afu*:/=YFAԘ#jwΉDUꟇzR'R5dHi`6y-StJˋ4B6J Q?uڝ40uc5'5*g'GٵD#g={dgJ7 yW6(v}"pCsoSo2o?BSaxxbaIK\G{K P]efrt!$loX8e5#^YH  &{;g&7XRl&hj@/)\D PE@axg/IXeUi+M8{D-O1|wtokQٜ-Fm'aq@? л snhTmEHmە4T"4< F8;٢~VCYT}Ap.mu[EOr< P]q\cPc:eQ[h"<Tlgd~5ò<@.ui†LC Y NXo2 b$r>oj 溢NϤHT$h̭s{V6+nM%O#V#Mƕ#M)|l[,[./ciaѠȓ*, tsҠ1,Ƌu< jx~;$|7yxd3uiDy.}R9Md2+4ngߩ(vi8mnmBOz@S@3U7~q`IWC6 ]C y d)q g'?1!DYI/Xz27x;ܗEV_E]ȍ8t$O~%56?ùťqN,|-+NU1"QMSk=(zX])FYΩP0Q ^đ;UgB)%h /kSO+ntG&mu\-i^ Z-  eI(+幁4yX%oDS w%'OP- Wр^AsVޡU eS]p-`Ҥ6wHٖe\vԈ^;qq)ݟʵ3W ,ZFBqA>xol^Dfc{v{ 6t2r0ˆpRͧV=k PEkF&O+hEiӹ"G~ h>lBpJD /gZʗ^)X#HNh}± !*J֢C"D2;nj+2-qv܀g֠$MT2΢/R#,sGw|7 ŞRǵY4ȹl;W0ɴ\spc ʋKS%)XERPꄩ+u#-4)odv#saGZ?5 ,5W3`9\i)Ebڐ(,tLqBndD`oP+Dn$tCQAb.pQʂB%H+j6 {BaOMh^̷i]~˄Dᅍ RCm]sXʈ&,,&-gsq҇>ĵ쒷8o_"!Ŕ)BD~[[U6+=J]M'_Cb=,J<<_^} BM&6wj3cF1v{A#APe"y*KV0t5X)2'ڡc;5~%?^!3Г`(}(6L`T7e S=UJ/Hy]o$`q[~dhf GUd+?_J w7Ͼ°cZ'K࡯K)$GB{WTScpҶ!y"{C9<Ȼ=8ɀّwBW} aLh{F #]~8ҡ_$ʐV\> /,iZ}*"9ƔEEt QHJ脥7&;dZsZbq9g{-R): ydia-~6:S# 3͝Ib,En`U$P@ 0 |e׫32*zbldkR+һTq?2.$Ή9 Wptg.Pq_/ =$nϢ~o- -،6߈-;-f:3{ .Ku2aU 8:hxU p dY F}(ͨE` VB֘ yŐ{&UGj9=ZxE M`D'1:9 t]9a˾W(Is :!:WUDPZmAUf=;zǨa4x25\HBO K^pрԗq}TeT\Xv$2)`X1K=GxcC¾tX0?y ē_Ar|)]Cc4$M[Z(n u*2ٺzdnȲlMnEMXq}5}C_zP~c ^| #)(]տCzYeŦP Cٿ%m1bdk X4Zs^"Av̷P& $WL}:>#zhJWd+cDvhHXVG\RסP CcD3~$«FM.\t8+y_+ZCDIaA + apM[w#-ҚdDI qL_mN]L:-|O%c>9T.:03y(-( fb 1*98cɕ14)BR]%ލ7 #_\ '?MRUr̜t{;!$%n;d79I~ȲMA-$8AWN\QFvK%Nޖ!zP "uk3kbh&.0`Wdzly*dq4128L$niaOD|Tj9EpQGk!-fJ1?ԙ/ ݴz[n@w IZnԇ `--Ynv7T_$5) ٗ&zu>)2'&ӟj0vmAluJ5 2o9il mZj#j|gW&rRuU9 x9SUW)Сh@J%rӳe «a+NjcrīX۔>HЮ [@4w6Uz+ ӫgFpWOz#o '͛mc>5:B~M15eL2~U'(%L8B"OniH^C`X_da~jvֽ S\3)Pf`\-i pBDP̬=,ͺ|Z93bƆu[v(R'lX`*nHK|MbIgЇ=_'ї^ m9 .V@0zXR|rIAb`rE%+ܸx^MFk564N,xb9̲Ahs4"ֳp/h%DQG+"_A,۠b#v6m߾/=ag6d"A.0'QwjYXMy5a(QLÝzO0O"ŏMXe"C4j?^k6^+pǶ&V Vv7Dђp ރ߃ j2d:[ifXT_.*Tmr(]x!Nvmss ˯/j6$#E',n4x5ڳ]!,%=HaLlK}\]ı sQ)7ˈ`Qe FCs|ρL+5nSY9 ^&Iwi|>RGL5>R)j66,w2>&~Є{@Ҩ?XG *M{Xhk0 7r+T|FEƺ@HvA}P$F% 0%8;2 ]-v$Šܐ3r+L}B0ՎRta4ܔ'injSԾM#6*µ?)svw{!Rlʋ7Š8!҇G I7IlصLX= 0˘讙oo1뒘#ReX  aa8l\X#zYJ<3_QYslR>qDY`MkSd*\z \f|[lVe ;^V2_@8Z8a+e^)Mg+_nI&ݯ0{'jYXt"'9Y9/Dv])l,kLЉ҈Y:Y|hC2?x)?d5UvnU+KH !=y[nBPeUa+'X&Bya";FGd.Mv /!gvY(gŠ{i9ʽ/r f|?0^u>xdfb&j (fXn6D|=Qr~+3A2ؚJ6)~vbؚkMubBZ\l6䉀Tu-o7 Jve.4e`@|EpmB^o+XYSjGY_K '.x۠ 2+ċ |QuG7oٌK?\`Q_6=(O> 2 zb#F4 aho /iL嚃SR:͢Hy4U J|u3AozWBVB)q֤)&O z2E :4cAp]b0e6̨iv|RFK?/פs57KbElEexOQ)rd)FM?hkmE}gId~ܐX.2U05 <t&&bxG ܥK+#Zӹ(̧5X+fFSW@G<5%fK?ɟ[/\}'IamE1'u˚D\%,!<`iW)8!?t9_?K#0p0d%T5e<ꢂY;t?2#t-yQ>RcN| V 08b) =ߘQǥqHZU?rz;_Op g:=DI·*%޶1E'ɻ-Uq/kF>ݝh,gE)k_q;eԽ8VR눏m07lV`JH]ꀩAR`nct W4T wO! 0/ +5"3q $@.v:2I _,5rU'P7K>Jg@A1e"e]!+[jmBPBeNޥo\?}aH_6ӭh=̳ cJ~<_z7O8)8UFV,xkZMP5 %"6YH6 >ox @>EYt$X,cTeFh5wET?UvAQ|Q 2Z>nk#9Y2/yԲ4Hk+ Fzd0-,;iv~j}ӷ`ug7(^r5"]QZ[HT&C7U䯴8j }NCKi4ݽ z"m{/Xl"X8$bN0 '1ߦ;7W@W##`q"3R0 : 7#>tKA} 7 k=r,HS]e8/vm%snr1'?y RE,n>y _gob5%i`~ ~C]Y̡{E 鼀3{Es'B$V3x[]Fe@5lyZכT{w_T=8v#Iʽ]&_uuapǏM0ͿEJ&Mé?Հ|o c-Xᴲ p[:RbPAZA~}CwMKtpQ,tPg@z%;& F1@Vwڼ @?lj5[վ jr1Ҫ_s^ǔ5<jtETuE#6Uxժ8h)eKM>endobj 14 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 600 444 444 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 500 500 500 500 200 500 333 760 276 500 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500]endobj 15 0 obj<>stream xct]&vvlv*cVmRmuCU ڎL#lEnV&\=^ BXfM\ a$,9e/ߠ08cy'T.s~cLa0f=(IvN_}tή8À{232)묑-eŭ)&58}~"Y1`vNjWxa}vϡl֯܈y2:{[R+e}S?]Hl_!M?t ЂVf E3Ģ/rŚ,,qű5:AXfoO\ <}q'1bN1M"tKv&K F'>HUg@P`9bU |Y|q >':o u*2*N8*t.ZƆ'B^{X ۳.%4s~Fں!DgEa5ug\qi^WX45$j?ƕ^ ًALbyi*qEc^AߚaqF2ǑA}U|o&P]5 Lj Nba bWĪBW(6`F13mwK$X>&)޷]t[@3/G"et:,;8Zf4tnLDz +}ލT9tyh7,m{ Ϝ:vA#;vz|bFGW;UTM.*E>Ndğ\xƥ1 YiXz6rs|jQMi]f|,JAɇ(Z^AEH"*8cacDn#'4].uvy{e=:Hxs!=qth茵bD~=}THbѰOS S`-!oZz6m0K M`6\\m{ z/~ŁwT;dr?ũ Agi0&gPe(C^ &M3`<>!_ ߖZr? ޾0k(T!6MQXVYۄ z8`>N]*%k1hQ RCnس.֝^y 4`+-Q"VEFɖca LD{?mG!ѽJTHf C5Ck ^T.kz{Z֩;Bum0Ogb6Y1Tk8|Ǝh^{TGQO M.tĶJ7y XkxX;Tˮ]H%uO3!1@/!\giROt/"G@[YK,]WROeם;2@zO! ?}&5M !G% ٠8bqB"l8 ГbT:=S2{!Ӳ?Z7lU3lR>-*^xa?!e=z;{vEN@}%).j+-)GGa߉%4 ic )_*ZoJ29t'FcKEy*WՃ$kj!L!M+$)j ]u:XqV Ex,i9oodbJ  >]4bP $ׄbZe<5A~;G/ ∳ROϳ WgȒϯ.P s1/x1)/Ųmh?St )ObCihMMo6V}4U`؇[v&$ 7KxjR4M1%[.eh36mA 0[no{ƨ!.<+ܫsx88zj{H3GaCA'fe]qOMx5RD6agyU48W˹bopBhlM3~D-LXԩ1y_p.NU vxuteyA&p2&uerkD5!CY6u? lf" QfgJ4W6'k)r<“fMVʋW/eZ(4\ml\n{/ #ѡ8z{$, Pֱy% n 9Ez `rGBiM.JIؐTEK7ߔfVl1.e촕2P6FRV=ubMIOqזq:M޿_G _ջж3΋3 TB4Jm! 4MծF=KXʟн|[SՄl~.1f^~@ vcWeK R30=4܌E˯05JH>Q)P";q*| ' IGc~+"]HҮm3D}Oݭ N&N,KK=7Ba@~*6"N tE:ʶ<\-ږLzZ!ޙRTD~VB@ Π]= M?24'9ըmq'h-fN84&vk..xE+q1 ݙł-4SAΥsޝibZř2H^ڦ?A7q08mDVnVJO'8C7ng&l13CBN%gS )~9`I1oYspί\]5+YG%EOby9e0i,}9h}4„ɀ`z90sTI2yI.xk ΩdP@K\ng=dnҴ8jTDX> P\$!>#nCc}|G=bJ6"zzgAS/'k}i'TeZ7c9bxwv,: 4 pؚ5^gxI`=bM:}܅Gylimgbh9<r=a3W~NdaCbxW \PH-}3au87Gw nG,[B3Ν 0NsJϚq><30Hĺ#0ѷMo1Cc"XmvHLFD*SnT 2g vϸSWUg0[Q{Am 3J0>Kq@Uvɜ't@M 3X^=c" R/^hݞ&̊Y )x=Xy  WTN{Uf ы1mU4Tp*T[M6˟VEГ頡QH E'oWY*-636p.!x^ѧh9K ͘x߄k/w|nHH>PFI-T IYxu wS^FrPVån0*wU@Ead& V_3 >Gzlw TGC2#5Z!\Y+e#V Ӌt]]ܰ5?U\A>,_ 7B!%Yj 5{ Dnjf{VZ]CdP)Pԥ|Ĝ._ 3O~[ KIm'-'r E}y"ﺬiWь+|[~N՝@;’n TpT:J]k˝v |gVccD2TtbaSe^@eĨn3LFs53dZ:j'{?3(ӀA:Vd/ 3:Qm*hT&8;9-{hl9YM C`>6d~dgST}D\5'qDdep)&vhQ ]r8%Vl <"ݣ <ֽ]I)o 2hHmѵ1k/~!>x6:ܷFc\>=¦,p?0m"ҌB]غoݥU@)֘F7!l_)#+Np6 ѩVWUHC2<4l;,u(>BP\$& {ys\0s H])b3ԁeĈDh5Qc!˦=|R(53. n)Hx A:GGNX7uT[^GP9 <Ddc;b3R $&reswB!m t9Ny (N3Aϥa)M睴l^x _yxYK isUMMEG#8KV9+@ݩ͛ec\H ɨ2Ss z"hH˒\#U -tCLPb_\P*qU -$7^KXVx?x\Sr jޭ!垙A4ڛvg )\wCSL$(ZW2+U\[ZC>-\rCyV!d3%ŞgJjj"2 1`^],Yuݹ"TH&۷ۛY #Yj[ =ܗz8ͻv[u(WfIqz2R0M"8jPsa[Y6'Fוּu?ckia{I9jXkyVz>㰰L&CnAey4#gA݉?ptScE'b5T$DƂPDEpFwU&/8`𾕬kzvr 'IݕB("Qҋ@T&֨ChnD*eXG9]@Kɖϱ%'gk̼gp/"\iMNh 瓡J I; &ɠѦ јFUe; fE(/+F$А[:Y$|i%w'='7cZ-߈-o5X7qkL1 ^k`ٷoF܁~sm:pU Rä[؇[>JS }J2iY N\daZV^z;٩3FT( U(btqnb0;M-;ν$R|qqN[\dGr h;eMǀzViy( h dE|Np~?6X>TɒȔTW{W'G"1¬]GqWSpsC=]3-bfԶ 2kHBmr:j4R"8ɐ8s8Nu]MJ\X쎝&<+T\JYSf h`9y5WFyBڥZz++5؇nw٬mv/S #N~I$xbm؀WH\2qN&0*;Su"\aiLl:@*+@@&z [ۚ]Z$xdưetWGԩ@\k4yNņI][p눁I63 ˁ>Z7 O dhLτ*9׵;=47n9w+9;)aO6-;~R#[$w1f2/ />L FT#oGw&ujێg_\^=Jw'oAQBRUI\eK"-NsuNj{1 !G<\%Y\|)k%PhoN^k餀,SV+>lO49glx7dѹ1>7ڡUe!'$f!/!/ۦif Wq`4,ScSPmmt㑣1 vGAnˍIh7Oy}u E2^rerC- )c2*MXM<4m'4ÆmcǔRs[&/y-^Mt ʙYgik+HFݧ1c'=y 4MDdIL8Bx;S1#iofQ 2{55TvDҐprnnSç [Ֆr|RHq{דȳU }dR.VK_ySq-4Ve.M-ϢlJZv@EQD`h&=|뇋8~vwK9$m67\aH* ' lf>] l 6£Ŏ! G+iXz>{?a5ǣ>_Bڲ3/]#1=#JD~:HMx7d F2o[O| eؼ") !98ܛ5d\ ϩn$ąT); .MyZǎ=Ra.K܉O~۱uoB%tL JȂ$U7>A00HzLB90T>+1)ǡfMYr?M*@tX)C Rc@ϳֹ ͆o+.v j ˇ4q(Lǵ@@T*o5Z4%ޭOڋG :L & Ts ,[Mض@xΫ*L}P񇮏+V5q0{Zśѝ2 Ԥ\Q{mߢiw}NeQUGnwtL 6*Ot`WSETV 7D؊Ifۼ̡0e»7&#RS Iy . ;ǿ?@(AMFˉbP.@-p \O).), k3MÃŵ?m7ve^6/1dZKpu^WhEAFq.qX#Q?*{Z;|i" U9q=xQ '[TduYTjꅮNZFҍpOSH_|g6~a2w2pN<Ћ%‰%(e|.鶭0̙HR^#r|٨S4@X,׸|8llqSprfyN& F}@ڷEQ%/a=&>~?2;b%0(D.@İ U`xy27] o||%r]6AhՏ'*rЁyf1p4!U,` "Km/fPP]2sSCٹ|IҧNe,A~J+ 䆄ZJMp/ol'ݫ48='o+@,W q@| j&EXG-0ؼu#% V%'PcuWT!H h 6B&q r'Ed~&; |&tGNSbWJ|Tp4Cn#c,aD)s@O{{ zI`Q8&}{$K-W@زjf]w84%1t}{DXC=lZ1lĿ~a.<:ќ|,_ _QR DemP+=ʑ&J`Z$r\f"qOK H[a8 ؍m<,g˝jXMjt+f/_ݏO9Ah~+sն{/Z?nJP*YxZ=c}2bbrp0r9kG7X>סamkaB:spG/L-ɺV1CGzW[R욂ԣEFt!-wjݖFwgC`G){rAFV͊mD-#ng|{KfšO]9DAC>L]M&]SD9"?gj>FhI C~0e~~G,6bI߀ gjnpơ`QH  JF0c䙜rG3t Yo#qMaEy)&OKJo#DOfgrQ5KfP %-RTx,CޒUyt:Wpl) qPz}[@ט7=ǒmWeizOIn\e L)e0&$W 熋m p.2xχAݖ(,eBYI\}!H?_fDW^QI16 ד2`T"L/Nqnv'yԉS\B .UF|le51c9V"ٔT>Jl͙$*q]GD ӻ4sM%]`~FBskDoGf#Ip/ ~n0~svXB(CLZiRazϸne9MOd\Sa/PJPѪ(MHD8r'о$%l)B3Ox?`8Qx77vNW WP^IX;{5hMGV6'x&D|$`Y3pZ^\<;/FrT 8I)r ۩f(*vc'v_ Gr1ST=Dw;sIS#p:bڨF9GBX]a?0WvAp}`ȱ:`ĺt&/jKXI< Et4R/vA}ʫIEƷo~ c DA²<.[ʇsa' 薥}}&+!9Dz% W) <0l9"ޟE%萅ᾥ7鲖 .aSrCvsϻV2$01f˻Lcg*߅IRA+o!6㷴ޘ#{M=ݱΙ5W!wzgj9Ǣ`E54W&YzqpL+E $6C+yMlJ&\$7UWϹ€?tݓeKX֝d+z yqƇix_(l|f_#lXF]r咋M D) { G;@Ŀw1[vhdrN!Te簫y]P8;=c`Ţ?&N+}yyLO9up3w3"SY}"f5W'fȞ凌yZ(EiL8V'[} Qv+~KvRlMz3]o!L9BW8~\ 塪TDxt=dȽ|4HOi9"KB,?ꬼV$Kl%+9N͒27b媐\VP:=Z*eձR>CJg[= \U7[,7a:9,Vl/.ljolH08b/:*C@QF SO}F[8?.2k\L#Ѫ2y?4_ QJUNB0d{x۴Ԓ6TOBE4l#4Tv5~pQpuX()7K.dRp{@0ڕNIt + {`oÐ389EQX$U5N:8ొK]5Mќ;IUYjəȽ EA/9ag!séHh#,)9'n">\u06(ΟQO2{ax \e1`K!s ̩`):;vq ?ApURKs lF8,ik?42Ri9?*b !ft~7L1WsoWcI0??j[(aa:r:/ս-g5XTwU讒{-~Y' *aAk31`ѝo2a_*`#0ǞKMw uᠳsA}4_7; .,W\i" ]#q~^Eu_x@ͬ3 |-t iĬSxC}ѤmEbJŵq|(iEe"G c4`B{-I;ߩ+,,uJw|+ۮtS]I Bvǿˎ{#X/#Ԥ_TGJ߄W˥l1mqʳO:5t>&z׷U,49gARˢfJ;"id8nZʒe\ƧQX ]@&^." F,J.$!9H#7Ɔgݥu^n_&;@{{#^-v Pg9RiMkDRn$`dK<`О_w] r61c8Lln6ĨlX/bGb$Zofql":b(]?Q>WtwNT@MQDҼq` zz_銜?c /mt2OсoCV}ҒH% HMڰ*uv4;$-83o[_q]\|XFQRf-L*i/~}#ՊM\K^M'0[?x9nsȯ 4,Ai@R<2f/hN8Vb x az"OuCP^E X<PE˙ޛ4 d*bT2vYsX0(^hIavu]10_\ $3~[f*l'ËCTNtj S)l"o5Hc[$=K{ɾ.zc>HꦁxϠ:55 c}E!^^OQe!׼bҾJdqeF2Q#$x- l1StVr"h5[J<ئgzܣIali0V񛬤ciάNJwfNS*ݬHrVf-`)-\ 0>[{$D8:4 ~R!dL$ w,OrsOz92\C/ n:>y0/5WPb{:n-ۼ1zṪQ Vp ݞ6 ^6 ۔sp]!YDzw}\ ȏw},W=MLx ɑڧ+6h 49/QDIJr9굱Lj2Ff vNGA)x=nNØA&Ԃ4{9`܈jƩIf]&UpshUXwDwqˍrk2[r'=Od]\ie*`> "d¶hn-Z[F}KCs6LN,1JskgU[SxzK E~Xl-3$UwDQϛ_nSS=Pԃ{'K1}ƪđe\pl.[|@5pAmФ-| 6s4+h_} ]%f+'+޼2aM0կDl5"p;q/ur~[k$rֶ֣ZJX3*f5 Ӣ]؊Rgpj!pD&8~2&x߱l,8G$_މ tGk^WJ_ u,҉ko<|^=N_~6q;r>ū{9qYˆ뮼iPMPqv9NZTo}k5"sp{<;e.7k;C ~ъZ>H)a(i~S9ǁG+i#'|Bj[^M3*kհ" cm3P&Yƾi[>NҺ|sY@(\21tErY+M$ ˽oh”˭_,@8dLMKq\a]QsNK`f))EKS:E {id$AI2Mv 3YרZ=ǘ'k&.V?hV".L VAA&<7K$5 2% VBKˊpyPCXӴ( "8,Lem.0N?IP88ӹ1az֦H#KJma~wvP {ZZWx쬚SS,޳D6MawC) <&r}ATy\qe1k:(VsEjm}9PmɧÚeu"$r⋲()FvI`JN7߳Ym0X˜K̀K>f[ .,cpxO-3KeB<,Qze]}jGeSY)8S5QygN}~ 8XoY8WpϹ{NlU>Xrg X 8XZ>相0"o) ?s&ڐgN{ӝ&Q>ϓDHiQfd6>Ry/m`;yf!~ }`]i88ϒ?8Iᕞܧ L:5#ȔUǩOƪEpZ[XS{+QquV@&d]]dN[l cȃD/Ï3ڐӃV``֩e-\ i=s:i()+@kxx#N\l8cLM#sX 𬲟H$|T'WQn,6[7k /IVWw=Ht'&GaNJK⅂%&mrkeP,>'} 5.sda;>^d"OM4·%3nUޯ6uY7\T݈!'=Ið2&" ) 5838G3Y6$y^ëI lh nNo Sz?7C4V5HãySx<0}LgIxgk T*vN7 /˯jw?4$/!]:=y{L2}PMG/FLƷp 0W>C:LGuA<֌= w.К*O,Lt] h)u"3`MjY0H Ռ<6faOLM(([=gПP^- {>^7Wǚҥ+E\HؿXx)/RR 1;*!%)bnB7Q0)Ie&GI~ͺ>L= _8@oa ywzdbh.I_ߛ?}"83ƭ /ƳstBsBK}`}db®A;6ƅSe_9J=j%mދ >4| ',6A :av;!}2 aIg7WWO_|+Ι^\\_7E(2pn֍!{3r#d PNgA`xi $e߸S'pɻҽ:}<d:,ȳVgë֌9qT}kuk"RyOsZ^]U/*BoΟfI | @LrF[ίVݙ3QR8VUDrda?k^y$d0Ҳ@2kԠNę6™ŏ lN 8ׄgϗ&%͑SKFOؐ\,O#:.ʍg 8c>з!|5ēc؀x%43X\Z%ct% olW6H}t6';uSWŵ 7'rAֲ,d [ۙ7l^mBj_7as|De eS1.rؤ v5#q&Xh1's=ry7 Ǐ"vSY&{=QjEpcl'X]}њ(÷hNw ]m-f)n[Tk YSoVD'q]9NV{_Nش6h jzXWU ?|Ќ V"JluU\{`3;lR/ӊW ت^\í峡#CB ÕK𳷪eds1w.xa=]C2S# i0-LICʼtY+;2Y1^Wtō{ >{P KIwJӀ?p?]&8Z"0g6Gn*fbϓ--%>e]돻`r(p\Qk&6jdwDӎK dחSb7ӼZ ARd'1>bMODPѩ؆q@Rf6"k_*\b^)o 곓 |FF@\:1#.>RAJ \YkG.u^-R@*0 wތAdcVT%W5"eI)N7# 9;\~4z1.̬ y'ڢ &˱l>WuЄq%#"~-Q4*F:Me-fn<, un<޴!Q-ps$ 8ZA7bX;{@Sa)hFa^ ňxʳTtB.0<)0w H\gAq9!H)*T+Chi,e] XY"Rÿ  }Ar5vnBTQGLRfٳU&YMV$\~]Ј^4MXxV[\), ~ͣ:f?0;=-nFU;i!Ǟ|3!B[N G/Pt^FĖ 8/M+qq&8p{UoolkD&D-wH'z5cBHt&r5=&]o[RpZt6PO2qg+M.VHn-ؼr+B ;dtJ48tć f%ӆ,|qW&ux1^$%v!`6 Ӊ+QNKrv\zN'f(Oͧay58F d]qJ(U(ϊDH̘NJބ~ca(x)x8J4lt94g6v ?eloU5;JIR \l;%H~oղҋ)5%}!D#tD/%&':MJT|,~A,İ0L.`7Q͉)Y >CʗT?E b17Ȧ<wwZ<2aXC]1̇wt23&ٝ^ǐ) " t&k7ޢ<ԇ;1Ѷ@bqU*G@Ch,pZF3_O-M]esrV굛vEbU<%NNa+ )CHXK=Yε.&|><Z#axO3)ygG4p٧|/X¥%@]nv i]` Ә"g-L0.W6S۪„>9>%)F+"F}ʄ[Iu1wM_Ys z&T<&AXc+&Z 8yRQxA<b։r(uO_:bf)al̪QW?')^I ƥׯi `<{aͮ;Џ1otϹq l+{WyDHN>N4Rhqepm.V i=r!Re}lA>@🹹Tq*C wQPh\|̕c%ߌx1Cw`>kD{7nJYu9DU@RFx_)KYǏo#"%}*_}aSBM=(sRy)9;^ FQGMΝSjj yRd,wsKHJb}JEHG}=c {;9 Պ8y=ƅJP'y=&~v*Qn< `y%{Rp}LƄƜw+lQ#b0F&(?&=E LM Q~Xb u2p$s3* P Z ȿy *O6tmل(Y{Ӷ鷔Xj vv$)?36vDk: PsVHiԳC̱!DYg+kkCeu/ x*{PI^m*a$I3XS^p=ALl0Whd(q#%˓CrK "TRyNP8G.`E{BCp|'6gʘA}ΦCGLzϏbҙ;4J~抚ŵ r6l B5bCBo::`= _"}7UPCA;3V:5 oe" MȝLEr,9NW;,($)pxQ.ĺ4hM;03UVNά#uϨN[|.J#Խt^$mWj2&x@O7Tu%Ѻo["ہC?M(Od}B iꨝ>#(=H^B1g3^Jri].}iۍ#f5R[=:nN8n \S% Qa}q-<gBO4a2P=RXE8P{z+WS`CIZrS_>"6U`6٠ b)89۵* ގ(FB۝Q~EK|JRN[9(] )长:" ZahcX%l7Y. OsƊdQ>VI߀˵:α*!kԶh &T B/O)8H^;پn|ܯ#FIkoX;h!y$qN^'Xhnf`W!uiyZuC[Nz::9҇΂ÓQE= &'Y¤@'Zes0XmI|`Ub0 WM)TYS &qƯ#:]^ZZwk9*wqsΫ"bD'gZE.fzFbi_=;AEQ&oH 7V|J2~ЀM#$:ٝECj"th8wTA-r8.ʏ/ {0GqɊ;ĤO^]CXm,k&L+uƄܳg-5PV>i\lA?N&,U4w-v$3&hZ2-{Ll9k?w@+E!Mf. 1)2x.jyhgr Emchp~NTTЬ^%zH7x;f`CuClt'qg(/CPq= 4#1S1<`5Wna!(zIg]?lJB>J`1T6^o!{Nx;i׳G yuu'A$Zlsr@$ ^“7XD,n6ΤʹTwRCtvMm@Rsu8 <:٢, oVk{ƔU01U4ъ}&;>.i%mk eyjM goqpvҾMo$ =k<>p + 1%">JV.,R,WAR/^6q/@ aVަqqOs /z-s:z1>I,O:OW1g?xr HN(ОR++4]^mUj3JԂ +]M'XX+oRD6.@zuC>J3oԱάf;5Xʭ)~)ǩ&9uK DŽz km#/79!uAʢ9˛` uj#w.vƷL`|r *@ ڎ=y&V C]']?A|vW~F~# uyu2](q"]O. [φɻe9q~Z|i'vG3C;̠wR&TeZ<(l8!ˠLؠ~%} 2A$q QLh"50W.L*3Kʕ;6w>PV=㎵4ȚC gyg}Adhll7^O]`~|ǎ-}6ᵫdV5ZE%QYpGڃɀK1q˓gB=i7'dH=KY"Mjqhr̿3.I?gU8ު$\e3IbrHxH҄4T)JY'LS܍jSmvs~cmYwosm+ (7V?- SN[gC>S%9ɚcRP"?Bw51~'k sOD86%iC:3s$¾`@kܙ ?d3B [}JrSs Kc$~4jݝZr1@'nşu9[s*jic.ʢ'3s8zns?Iy 99;j~B0|N֛ 4bE26 lvV ADI.PȮm۠X! l4ͬO|}<Sw[rՖ4{,_$S~:6*Fߚioͣc& RK`zG.Y9̈ϔ:dbR/`וPvb! ]=Eq`o:} |QMד &&fBI$ TnHѱNyJC|%B57/ F3\S9x0\7I SK/F[=1%ZX?N{g<NuHzK ~OdY e<%Mۙ(׵% H@ CڷtN<-j@S?ɮ~-C~VKޞ}\t\@V8ʼnWE*խBh01&,5#L͹ Z'OQGj 2  B9X< SRU%BẄ́]'Z! p4+C,D&ǶxvWf?> "梹=Йz"!䂚d`Y6;ҙ7|6[Rsz3Ƅ3#T? L+w<ܱr(ͦurXz֗h"p9}sŐt9a_T!m_7J%aqbj9 gKt^2rJfyfa.:bU' 2lLm"SqEXr@胷Wo{P`=6;MӍ-y*T?Bg"hZO$dcޜK>mYU8[#c˙O}@1\*#2U(YvrUww9d&c1Gɂ0%$ KP($=.=KĖ\T>Ptp/yJy2Ѽ2@^' -Ugsl:<'O᧝L0rmJepuA͉øw/nP ~ob1T :9ֆ4W'3Y#.F?^w WU*=Fxy#_rHJ>/fx9/bv)MeSlxՇеs<i}9!E4&K+!4ę[%[\np 30]+uMpG$"Cɞ5)@1f4^- 9;AhO9 Cte%ȥPWMxMA`c#50{e-;+luC(yE'YG[,_a[J\K!cV}@tù9b3Ӝ1ii8U5>z,ָ 7H\ISf 76X["$,_Z5J;o29|ׅ4OڠhEB7ܳӳ 9C=N4 {oz z-iz)Ҕ1 `ҔGҧox?[+׏YR=9TFUHϴ 5ԑow?-XjTov9~D9gf,Ǭ1=;}U'N` Ѳ̿޹!޴= w3ܝ$ &ogV$DIXc9`ȇmzu?N9pMc2 JA?y^﬒dQx%aVD9$'gB6aiϺoMdՖW pG˿s)Jy a`Kϻ-JXRK}9JǞKlG]$9&w"`#ek9bQTocɤ fVe~b!x =A tW?iO\셰-6DKIG-|Jq`̹ GâW)3к_M* zdEqFX;i /Eg:B4/HşQW&g<<)_)ezb~]: 2,(&J*B+T`~]v53:6~X:M0RK4;O꛽%6wWkul=EV U)YP9&]% d#Pe&lXH,'1J :e[%huJx* akCn4be6񏅽0u4M`'l0E9y$ 0l|jI;VT[LMpcƧ/aWͿ2-ց$^g ηzmJ9ƹeQ2SHe&0SDj,Z /dž52VsѵV7WmpƖaK kί?V K Ίp:"+4 zQ;~ 1+r<}%eSUU&CwΝ|›^N^,/!loHTd;]y݅R]H~Ũt*<7k&cKT-錜"=UMTf~NY~dVybDW|ڱ>Odhl xοAK۠Z? ᄚ=b/SQ|)B c _`]\hBI6}`n-T8^R;x WBd#$xJՆAPfwUvglHw7%C!~wџQj|>śhJ HihQy P,1dmukSG7bh'{YTWLe3ǒ9Cw҉A4mjNwPlxjR ;?`}jb LPR{ϐ;d"e%նӄ M?ͪg5 Իu^U[ħq(ÿl[%cӘQ?.aqf%D **3cN֏@F1FmjEvHP>d7%㫏)r ^9*Tt"WHʾ~N&;C0Q1x<2nd=<~5\C@Q%j>up9jiǘ vccf_/H-+__ +Os2ͨXE@nV }A~7/{c.XIh;ɼ`y,/:Y(,[8-p]>[ŁSh^/ߏgDNGI |!G~w/,7|Y@g=g׾(uT `ddt>'a-4mjYK9;:qBf{ jgyakLnu0"\-L!"|t[ӡ,vXt< Hg-͔D;߳,[7Rwɬ925gWu3 " ;=:^;$X &D1ͮ#%GS ,+DF$ҭ!"x$YP,4k0( {D+KJe17R~y!C=c *MV2`-N-2)Us*{X_` xn r1dZ-0l%)?Md"6زx0e-="zK:)u'9_[s̯x=<:,- *WBXnkPbn&XfӽhP}ڍ%mKm=ųC(?ԗX`p+)@Ml+e(Il9e&6ii`(9#U}4ݨ?Ƚ|]ܞ93ZhDz'Hٻ- uA ȜװdJ[e☩9!nX#l,VFXYFAY 4Hb0^M8e''R葇Vxk,յbkýhz~`B k|ʋxe׷Ω&%EUZi!D0mN5;z*(%.?UήFt3us/eoٟ' 8LѿzI;!L#WHC-ba* ꘥#mpD9FI*MY]\S~v BxH0 Tʎ ^b]9T 15L,F  Lqeh4Rr|W>P4E2`i6RoB0IJ?ϣ=cN0[_4C?7ɗP1Z LF-j&3Ai >KȂcc1ULfQ1 [ܿ:aV3(s zhMXi= ʥ!à˞lͽFH*-Ԗ}nжkH;OND!ML ͪN`U{4mG2Zc94j=g|.qso\R UJY462мJsn*#M$9A [2F]n^p u5x˜Ya>7z{1u2tg(^>cdD!n.b×M.,t"huks0THcfōcY4,z Y*MA?8+ 9fl$c90f2҇]~r%uBTMZ]DQU\s?'5E 6ArO9}g1Vr;9X%B7zm+NvPifۍmVCJX|K et:;gvmϒޘ)Xk2JVI:Uj8fQkj,GRw.kc ]L{8UξDS()ѵӲB7k)˦_?ܛp 7mRv'hU2B`:kU12{n|'٬ {#gLO%.C["(GB z,bJSW%5`vbjhLc^.Ďh-]?SZƳ!fVQD "1O􀯃7QަewŸa=Y9`"_J{:R6ml~I~d <stj ;8NM݇Uf{7ёZ`7 -yҠO: $]sY7e3e h{Ѣxt܋-I͍s2hەwU)?ՋNAPE1GpU#YخܨIttxz|-|ݕlp$$z$}М6m&%\_u y^=PֶzmdR[*K %'r#JW C2 ;dRCl `m`وwWj*ӎ2:WT б߹T J'weN@HTa3rq|!h^(CFȲృS~3黼㷖hx{z#3~ͻ^WA\mjeFf!VCwz|eqs8KC? ?+Ū*:;z:#=g!oJ}ɟZIPA Iޙ_BS3ą/)s |bƝ!kQM c +!/)G6w ZP%[Ti_15E/GdI9BfOWHNKj5C۾Ktrp齱O+OOS^K̬TQgW_܀I=$r56%Dqř1P,,w 6 MGН43U%b4ȥ>U] +}$|71Tnjp{ĪJ(7Qc(aoozo:9lAlk #{e2p׾J\d#o/\SۅϲOp4ԫ LMa"','9q؎B\w/6ׅ1w<ֹPV4 'eʍhG̰AD4QϾMj@vA|vC' '|R~EV_vO {ٗ䓊w][7KxvAGGᖆ uhp 0qoEJS10 Ki땴&)ʆ5$N }oQtǥ5NYӐE5DfC6L >S95f!Q2h& -SzW|g _5̒ʑ䶊TSlIQZK)(g|C '%D 8a5p~3eT5b>RAIQY2H+81/<m"N*WTOHOqm>|Ld>f{jj9p*su?mKs{ۚy;sS  A) >Jp&w~M#3ũ'zr ><~$bB0^%IL\X>Do2= }>?0m{x%h>b-=G_3(Nַ˲-l/c3aߜO@$XՌ`<XJ:u%l9\7L2_0h?|25q(9D: w/^Bּچ ݉QS յX?`NXˀl_{u2y )`|gbVIęRrY2ur#AݒHry_uK&.E^lРӢgV~X'eQ&0idZ,RzAh J}?#95@c}%(g:[4=9eYNѨCAKr9ҠJib<~3S2Q-ZH _G7 m 6eO"=cjȰo]!?3_)O>dmľ39wTTWxyT~Pm?w\3?`y3‰Gs X  2#CZSd5HQDWq<zcVkȜgkm&Cpbh x@@85 x4(@Hծ] ^#?#e}!?. ̦yp&,)rX=K,*?;(Ѣԧ$4]7,t?w^_ Iv`ݓZ7z:? ~LoȜˍUSs|@hnyEOR_ EĜȶM^)`Wؘ{?6&&a8r(.^q MX)4qW)ebq}TW]q9BHnG UW4?v+̂Y \CMTj!yBK7>V0Tלto_lسL q^!01d-iFj TeMc#&x{EN Yn5)1|oRK+=X hEZ# M]+(̞2.(wt;eqYfɩ2" TJ u㳅 PBV_M@cWrf:+wI,ԒQ]: %U b4蒯-`G!mTӳ6+rc3|MD UԊ' \wƉ+vVbx`LIendstream endobj 16 0 obj<>endobj 17 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 555 500 500 1000 833 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 500 500 500 500 220 500 333 747 300 500 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 500 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500]endobj 18 0 obj<>stream xcte].b{Ŷm[;+mJ*m۪>yo:wXGGksINJ/ljo sgf`Y]l,M_v8rrQ' 4M,,fnnn8r J]E(=linZmlv._׊@ 0D$T IjO,r&@;g 5 Eg03'4g/'FgttvZ,NFv._gb3q5ǁ/~88I~]M,\_V$?-{/IS{ /3E6F_,冫y@p9`9_>X8mYl|6cJL:' f02]@eXR?K,cZF5]*FvϘCbg(33-%,=J.&3# T3:X_KS4j+Y@;V4ȿ\g(}u_?6h{9,L_]g,lVoѕ7rq01011_;#ngboOٙ~M-]b_Ѳ0qr˖אP ?@8v0y2_G7{ҰX~2FȵleK8g!҈sOZMC= 3azE!A7u-Z^@<_BNdY[ ˮ Co%ll@;m Lv4:Zz~谑ST>ֽb,.@t5!lPl ʛl!'/L\4O.ٴY,36/kal!3[{+ʗf d5_д%u;orwosǩM'),сef&)WD5+O*oTxV63b*њ.ND}^xn3|唼BoUm ߴ{_^C?rjN('y5gTFUS~R7*jzmF` q=V8EēnsEbǽ'Ru¾ͷχ˵QĕDJԅ&A75O0a# {gG=F>Y8 u1T${әՐT)qCL<Ɣ[11u9yGårՙt>x7Un/ߛfZBi;R>~%LڮcmKA(?*B>FLheIIg,jWT}ΞDkw3Ěͣ O!q~3Wƅ nA׃CG3/Qd pCcqv&9IM+9&z4&T6,,`⮘ eoӨ2=T/^Op?ii@ULVjz0!&JI4&Wn@U*؛]jK_Ciu8S~cKyW@Ҫ(I#"މطbw D"]UMe^eCl]]}jz"hK&#NW\&{uuF[ EPJ*ebxW] GHREH7I}_iϡv҆ʋ͑@E C;3צvm^'&UOaa¨o;t7`]ЕYIWUv:@]vϥ\XeB" BF݆5%_QT?M3`R'~O,RS{}hmI:M5<#0V: +/ow%%`b2/}OvM ooT~,ҩlbɄ(m/(S#gOy%uUeRjS$9hWTj{}A;^e|tE1)Y{+bF**B9$\~TyS ia5Z9!A,Ł_xF0nkPܻٵֆ02 e^ /ة1ūV&A ~5l@ɷ,}\pM54v(!9`)g:n)W߄`)nD ڥ!ׂTTެYg@g;CZ׊rWΑq^kzVZvdSn`I4X[i)C6d~ϼUѺ ^[TOuۺ N,"o%l9QQ eo )tUS2 b3!~b`5IN-^\d('Kt7ނ;|!npmY]lmL@NBa%NԿ`rh^QmwfDs[b$u17y*|qSo}Ma~nhp!0qC?^HY%{0St1oar nK'OX`:oQ2BoaZk nqoS߸>;v]WcsaEF+ܘ-Ms߮53\v*8Ý q2a7/⋔6cρ6EK&][(KW<_9GA~m |7SJ87Wڛ4HFgWƷW@z*1|6Klĭ\6m6 `A(0vhCB. 5 p#?L}DFf-@[`R zG[ˍO|MċVY/VmP^vry ܿgg *:vZ1w,ͼGBx@sxeA/eF 65Wp|wpNsڼ\b*b[e1~kD2*J#F2 8ܞ)jr^C1XDBxC8QI`M v[ZCS?N??]LAxzT[| [w7="$ Ie08"dI2RM ڶ(/ eqPe@W$, 'l@{K? 찥}z$.'CK &خ`<}+=Ǹ99f*T;'deVKDo?fS93c( /Ӗ/7EbSGrAُ:'!GaǟC8f|ˑmilr.Z (B5K΅9#S'үv ʾgo6h<ʞm)  {@VM'W _cI$p + NRwWfrԨK$$1\ IV~ }rTqo[>gP>Fp׸M@~m_sSH8 ~K@`_oRIRzgh<2/p((n=\i|RLozOq3w\fGvěԠЗWTb ,"eW`C#,, 0ʡ*M0KV'QR?PwHuCĘ#%X 2qfrޗylE2GC=z>~,vܿ)XyH݊˔E&c1c,H(!YZŐ}֝^n9(߂;x`?IR !QxS@FS{WI\C_^#U=|w,esR3fMK=Flp).ą0p& ", Uؐd YPE«ySM=]h֖DeĂf*pp>[w&QJcMhxq]I붶"2S9!HȉTv=l3F_(h-%@59HOWbƜߌ(HH&a-iI`2.I\?M6+ٝiO(͗I]&А/3=z Z>BpRH 3XI[' K$V-; ^PK\[_j<|2@h(Ѷ<M="""k?8(96`5 f?_7(;cmWl)Vy\/(h[kYH#viN y|_jBw^$ ]kʌ)a`V q`Kɀ}tp:/53`jxD\x*v--xbAv9C;ժjC f1U|Pcg/=c=E l#W[ٿׅ̙M2K7gI!;آK.& u&4TK֛Ci+Ec0Ӹ<j\x Ey>;Cl͑KEdvQoimh*bB]VD5ƎI{]eMy4($4Os:{{I8I[rBd3>HPDٌմ u:<Ȉb(6=f%QRK4dKgQ4] W!3c$lw YV}+M<SZbp ut~Ĺ46 &_,E҃jR gbrF[ٵЬ},c;NJʯ"#dB%7?8(;5e&njʥGR r)&fHހ?o>]rK6f7UMg)F:-1ǎT2`X"5o"~Qhxoj#Y'ZRk3ΟU;Q WӐF|FwZOnry lɝB?(Jo_!v8"ϐ[Yymv-j wx{݁)Tv GlR9.,cy؜eō^$BEk'PYa`7`<0?8=Rsw,Ycѿ84ow4YXy0V'߼T͒]{"fnUwTW-X~[SMTTD4MBfB]&Id) Gd_=4DѪ3->zrc6IR|g״,YR+E} =.f[*ţG~! 1sE\CDNyޥaatl0%w`=\hC4aЍCM&:P(]%HM4sb115hU zdoCVY!%님CCwQT T ScN$݄=3=1 @rmoq;. fRaå֘g+*[_[8Uq\r25mYډ;szA5B*>r*qϥ-̶/ T}~H=_/oDR$CGls|/ "Pj pfpCWS]Tt>*ސnKki='ME9@ K(۞:5HlPi-XJ["MI;w9䅳{W&j&VԼ!&W[X`No188ݡ3QGm2ߋݧ1U)ʋ| !y}Y< l`_ {U^ A~O/JQω9DJf KLhaɪy=QvF[Hq4fs֓*F`X-WK ͽ㛴;TI^۰jh!.:vT<_ Mj݃%ʍ{qG57z  L tj.7^WQ&ʹ<J_{36}S.ۻ=rI*j*&J|N㝨qPl#$'\xTHҴGXmQa3#t/;[c䞂#Z)n!4׾08Ce&Ͳ +:aڅk[B[I_>d'NgYNf؋M&đpDI*SZ>?ZlOUc+lRahMMUoT/q2E⃖;VNrQh6)-gŤ7is=l!>k#"w=^thi5 ~2?XѨHGſZm9ނHA€`ZruFUc Sv-f U2|Tzj@S`̦n/]'yP똍?\k~pяɣl7 q"@ {sA pֆa:֯jԼV*f잢47L3AH ¢Ī$~0\ܮUPj'(hhwq_o =I-%)%"}i=U)=1,AɇazI/#S[X5 (D>9(ʛz%0] ,|.H*lM7譚x]Z]jL9=5Ν"M7~N B,Z)ģ)?"Wp< KfY'<;o,jf 9ID͏8Epjvi;!L+`, dw9g^N3 {Rg3xGz2SmglnIG&g q̢O;ObH+d!0ŏ|:H˲ŞLws߈DQC]xE }A,wUM-L.$@_m-F |:RÊP=.)C"MP_ZZ=(q% OKy rf>@uw2ۣ*}HB0QC1SsLZF0/WJ$C/fcʙ|JW |?]\V]\TNHJFZNҊAwh($)U|%O'ٙ,ܕdM!bcp7daEuHBu)Z i]ڧRW4PoH_̆Axnb{w9a>LFvn%xTJ#5wd򹘓7}oKT,?ڛڰea%49-3|m._N#{Y6YdVD_`>$Yhbxqvp/IPMkۜ{,t>wbY /`al8 7?#;^beύ$JV{)qA"C:gi+A,mEW]hĺ;b%=hXpѱ RĀ%X7MqA6{3_xs"4Fn4:pĆm&J*K:CKCel@sZjHeU yi ]O Xtd@fOw>˜=\Juʚ~V $ҿeRw|R_;5BpUrri~=[g$*n L1/ >yÂ>/;4G{mA[V4C(LK*68|LnHfCS҃W; 2mPFM=Q‚rmzWۂHGffy&ࠣJMw$vJ-$~p$ JCݙ(A",=DO)j:HA?7)ɍWeONݶ;Nf]tEܘ8q UU4 JX5+$] 70cmgM? E^._kn5̣Cݱy)@4M%_785̣\14|V >tOM 7x[Ë }z -ZE)CtYX(cPB6tXU:R j?A3ߕ*5L;%ѧ7"E;p/'dRȒ;FqwG͡F,zRJhg={Vn(ӮWH˦U-YU 0g5vc?fP;\_o1Ia0P_oV3X Q8smR ev^\O'f]b j9uu !lwEbS/45J8^yCl7΁XY٥ϒ !R6(7.ü{n=WI U)O 8g,r"AW仞oVdDrL&#u<Ґ-Xǂfn4JGO-G>s,Du?ɶxfx,^$^SmLfo ͤ ٕb}B,.EC]k!q SER. -|2;$BuRIa( (d}&?rK5iR yq,@0aO`'RN_=]3ѝ^Eկ}]qW3O io[F+Υwkb\KI8Aޭ?[h.~ >9@=C6/𶐁s{`87y=bogq f#K~^*.D/bC-'C.)j\ae{5|]B)B/ ㈋d34x72 jۓ)h>e61#sESmrvCi5 >G d~)v "J ƞQ%%0@9V JPnziDY `PN;9Юr:|-s4aF%8^dO#rVV1dKzoOy6"I8B1$ qBUF.B ɩoq_+D~tvpGNFVH]w)pfO$G|; 8\eC^Vxm+B`Z(ʐH܂.7Wfg,-P' ʼ7QG5ڸwsP`Ztei{+kVds7aܖGr)/#;;B 鬠*Uٽ};?Z8B-V5£e]j7MB|c#ZWVф?сW4MgrGx{{N;1:A4bDfv>x-DAsT*cLym?*or_y%(ARy,3'‰3!\O7'M^&e}y65MNzFg;X&Ծ:ΡDo)Cw҉ݘLÞC*LIb+r(]Mꘈ%_Mg 5o" ^,BKM 3^h]x~+gLظ׭.?zH!OSr⍯ρ,F2[ R&κ\EX#P^֬Xe6qƍ#t/:_l,r*G@Cqβ(BU{qG]\k.[n'HO$ɲt}E}'bXPp i4 &JCji:Q rاk,v:l%C>!RZU=!]6v_ѧF!mD7Z~>zlX~$.okPfaNb2-t8̆g~/ 5QKu'Zr5(NhZyWW y!fd32f}{ VX=_e2%)鲭t>L>]ZžZD8C#,O_)ki3owc<(au꤫<"0 AI;M>zsA$ʕoRAeCʄ߹q RE>I44&@*zkBhWQB=GΠ"f_dJCy)iz{^4m?D"/oC[鶇Hn[T_Z(4mn6L)BwQ 4@Z5[\8߉= ъfmO;i8\.Z_@sqnz$UC=Fiz(4ĥ`D6qSHv-%J$ $ܧZ/tHu {gUܹ%L`m%@I:bϼS݊zy!k?i5PZQޅIw/~;T(zp&vO K1;I:.4,ˏEo5QKCV埛GC X7pG{B_s] e><<_q?BcMrT{i}鄪6Qwľi~Z\qi`.GY0(R!oySHR9Y.njwȴ|c+Ʊ&1*!]vƜPݾ^¹(RpEL2/,Cp`a[6E2B[,gN沱_&'){͐)ɾ IU'KIpvtARP)%We8C]#D9jIp MRN)©oVf <0施b\y5ZiBpeEYnA9l\k!$ؕH#4ãP\:l̮`&ײ Ib " r@K6ۦi Xn%Yk+u]z'%{ziiSH툈'/1MN`.-smVlB4ɾ). /s^eى_\L?Xf 8gzM0^)AKkQ!E\SW*ѦSY)VmKv4Z *S(d*\b"!(PI+*^(;T5`Dsa!^J7UbZiBJe7afqiKVY(l`#8O;k-omÏ۽re  RQgǐV4Zrq66(P"<(n$P7ڠsmoB-h9k$pR*fR|_ƜkdVz;[ `BMga"ۂ4ۢNJ$ijD; =kWXho?&;6weiIЍ%ZsSMڄ0Ykmq-|2j%v=PM-%Q.ϡ};ꎧş;H }N+ N:L$_s<m yDEM=ʻnb-l4im`T}ϥofބΐE/5>!B E!  UKizNTl5wzޓhLjqw>\G]7x0#JUD;_!(9Qwu՞~r4YmŸ676./zߧlj*r˒&7~w?5'3}$aWpcD QVhbQU֫Otv 1[`3"k2$P@wkTkMG)rh !c[!/:fK.B;'NT"ɤkBxpHĉ(BHcOh}5W70mDea+] ?ׇi Z^%荟)dr:Z /p[QMDP x77hucߝ63ٿO'jJX5FHWQ. p'CAJBrIV Zόjc8c aYU&{V1p8KZe( ~\}(-2O^M;vx˶XQ&0+rUw<|ci NqG_i Hd c9*٣j, `~OaTO"phfg(&b[`F)̚ML?P$zzH.=E[ Zols59:Ӈu@pGdIC}xMv&D~T,nPI{6^ JO{VW"w|m{8S)LhYXv78i᲻ʰ#i?8TCaJ3 ䷓X_g 2t?z5LK<7`c"Jr 딡/R $ˀ\(1M&NGfkNEM?#3G2>5RTР KwDJ}qSe)p$aB-x2cix!H˨HJ.cL%{bw8 IW [*r7U`^R)!T[㇥ %ݓnUE | {#SL;4}u-$Xm*'L\i^4/n6%kAf7[ዷ'nr3qf0͕n5y.p!Fbw.݃"l%&CC٨̀/V'}3a xAS/יh Yj \}c[<댒s7쌆>OFU~T;L,K.+2BQOCL#!Ң5J}[1]O Gl#zZ9`%WIȓQrj4qauu 怴6]JBF* #v/!j-+b$E6FUcUS}ΨaMQ-ؐ7AGjX:Cuqql 7Gp!ꋍ!ǡep,dOtSI19*!v$`߯LtdZ jiC8C~.>,e8d5Q?::οOAn)rєs8-(W/GHBgqexr`\ )Il~KP- Ilѱ٧ŎsK=k =CZ?JZҞwt;hC7W<{JvW-YWSL[6?p6vJގWe@t| nB=uNT0-,p3|'R\ c]})iVC5W*]z$ڱoДT60)ҫN4[_X&?p[8IO>O|=%U,e{\̂\$q[CEKN'f :%?nm0=]i:jTqk#\CnXhVx'pwF[">:atDV^ {Œi)lapTlɾ JEW,FC]ԌZ߰X%YJ[,U 4ppnZ)UT85eܲ`"m7LRLI#j]ADž|hr-bQ3L%Iu51}Z3іl+WMW, +Rj.$f@I 'Eٵ>G%{`Cj05Ӻ`I(Z,D66'/sKD>Yi R0^[FEޯr)NHkYЩn֜;w.15Y5nkkL`XAp^+"r\7I:f N1YZQi׷ UƆ,%*0 F2WE&ͳf)Z mt{;RcyY J * 0euPDX͚8ϪLCۏigW^M-pOU tanJ.uYjH_ݵaDA]wKxbo6ʲ`ˮ8N8ezYcF6h{@r&z c06A:{` ;fq$٥~-j{q-h 4Ȍf1-6h…lm5ȟx0Trpxk ?x(wcnE$_YO92ډӰ1ZT(m\,- $:jUg^Br~џ+RvIBѶPm7,Kʆ'OOg[׷ȍF Y~ F)T<رF,hhVi$ӪJ֒ .4/<4 Wk!B0ۮ&GmHʳ{dcx {>;az6^ȹ}9jB4x Qn%Th={谔⮚xQ*-UI#!`K[5?a5hc@@`0 mr'^hK@LL&GyYb21* kZnD]x>1eƵg( HS/Po,G 2Stnd]"kxF?s%dѹK~d:csO9M~1dsnkղF_KyLb-H7!Q&X#WI3&;$S!]Q6 @*gi7V!{Y l K> ?O@ibk8>'pDYm'Y]pu:3hH|zlsb5hϣEa(UQ58V;lӤ=AK[y&(Z M3yv¯jˁL3vO#]I(`)"aZ(czjM*l"ȪF3?]lC[Z;{ OOc(t! J粐65ubsPw&B~Ÿ#m5҈U$rICLtJB&gR+`r9]|Ji*ո fH yb1vAtԪ=G#Lf0qM_^X" B<>n` ONMt fztVOꧨrwD,}-Mx5s|St0>!xr4Kٵ rbwTur9V쎮YEcCG ObZo:7{ô q;\8_1v ~҃:pp͎ ^Mv$\?t(,Azca_Sv@A[Y = uxȫ"e:dͅE) \69LY"FDV5[)ӑ-yt ~*q&L&~Z8z \C=y ddȟEq*ckN?Ն8-00s8m().yf#x|,Ф`˫H MDcFk؝Pwv$1+3n~T־A]q!`*hkS%A&nٵ${;)+G@e`N9 Oa&뗑fK$ _8o5NIB 51EF J*\ rT:HJ'6i-<Ǟc 좛W7L v3m| K$,`fD0(IN @uu<"&86VyO 8;LRIgk5x$PnlP#QWQp=1v2Y:%I s640 .ERUDDDښB?D't||X\;Ȼˬ3P%KfBv+7ʔ93Zf ^\{+F:&;}yO*}FJqګIi縀G0zYƕܯ_\j{+0k)2$zSq1c@JwG{4P77>k4X 1ϙG4>]yVm9F8j6a; VCOAXuOᄹbXuҒy կxywQk N? 7SaQHhrG Tt[Ch[%[Λ)um#|Mi)d8 8t&Vv.Z©m.I@tGsʯ (1tOWu Y [6\5I Q[A_6B7VԵR^L|fbU?7=pm#N c׊}h޹uF);Kf\dHi$Eٱ^ƿ'՛}  @|:\tTWA{iUkpRJ+ȡaq>5YMk 6E9o-st$[M2fHRos&,)7 40t_JgNHd͊@ r CB/f㥑*tGwB1TNsTѐŁbt%s#IΉ?$d `)[aHgx-`D{~U meME ؅4=mSW񯅅m# XTa ya.:6ڌ^Cؕ@q #,YȆrA$TVDg(!Ԩ8߅ ȈzTa~/f1*X(U<1W$oc2?;u2Y en bPa(#_-cc*݀&ۡQx(AӔ( !,Uk ]j>,b4@&aVؼx Kv/v>eةt`R4$WE Ջ<92Y֎Vd[^̺5 Agttl Na`T=syѪѫZc dL''uHbO,>au͆qF BOpQn~w:OH}i`؏zƢ !)}ΑI) c${Ļ.0scv1o/#s, y-b`LK4X e!cmbss' f6KK?á{\.ڻ ݹ=A,+嚻gQM- 0G}(=g}Ɠ<<*zҐ. Y*3gl.GLȿ<6S}k̀Ālgib5~>I@Tt& mW@%)dpoZQk.'#~+ảogBVMie{W{z[Uf)N#`BWK88 qzaVy(6*Gq,ݰT >P3F\ybcu)T;u[J=ݹ1݈ȷK!c<aB1V;ґ4S<++˕:'qchCNßZM'Pb 1ܻ%jP$#\HCBa 7҅Ցc^?j) /-*u+x(Fb%z^!]5fl,77gvcyMUξlɳsH*$-OBmfAcɞWeG% ū"C6tj-IȎ 1'o_I%[G|[Lq.$ZI EOTgk2P1[OrVf'˖Y%+]a S>Ш=t#%5GC­]ǡ;q[v /܎n\D^RLhO:IO̱-9i_e5*E[h))*dV]|B&&XסٗVxU"]>wZ꒿7_eA_^xS @EI^ ZLMD9te@drbJX:B9'X(_V:Jamw_K'wK(@ރ93 4#`Ƃn*M,l8l}m_D wrvގ^ &`70AC/Qes8&/EdU&8uu]ܹNgu3g=Ozb!ؑϓ_1QIL!d^5'~1t>RUN-I kS[wDw/ƒ"YƕWhdxXCDкb8#PF"۫gGe'`[,w.^vtq2;yYۦ"z;r.0'icBKPóʶ4UG%NF.n$`J]%^hx겝ae+!OwQu7#s.AY/Uoe`K[ Hz kkF~qHu ZG| k ifjE[(m>8P>|m#֣f6_o]4 s!Z/BRӷeqOk'VaE"I i}q2Qݮƌ68.rlqCA&۞Eevswmyff|8gWdU즊1Zpq'Qbv.7k jť~ ],-28Yw$:亊cG{6B"$yi=dAFΒSO}H`5CFTZ3|ڍ*,2 ᠈5+c*/:?ݖgs.x˔368bYyQ3>PQɲex0 BB_r+߸ҴYTLUtc`~\{yDC6_wBM(ߨ/:AX[DQNn%#$Mp; CLUSvQd_-QZϝg6ͅ*ݖRYJo[2 aq E`vW=[F )l/S)rҒ-G}# FTL9"#_?VcRw?0Ĝ d\tCޞnC詏0_uCxs+R '^"4D0GdLSlfNh w^s ڻ+վ]k(6pDJ{ !/> raj@-/#q~/dQ4orkɏPA}b&zN2S#͝! )jSAe*܍P ;2Peo|HRdnk 'xVǫBZ+nBVYQo0ܥ 1g􉺽Ex0'"ZM(u>~h^c;=pkG&%*;%ԕfwNhdž7mRW92shUxvU{ saB۷!)SO}&4͙~;Y X}eLS4zfF`nN8g//8>@^Wl)ž6qi E#MruUռ!K&X,jНS=C3ŻUG~ͲOgF?RAʍ ז%CA7!‹l#ubksZ^9QPO!fwg[PB8=)}a~F6ޯ,dOR(,ZJ?!΋P`ۜ(*z)<,kmd`Ef9[7eA ?yB3 SH)~۴,\g&)Y8O$z+[ig/f7{0~kAz?y@AaGEu%^KH|:KQ݈t}QvFjd t3&@ ٤:IVZ_"sV(aOP"VgڞD˾1{N1[쇕p!- {Yh,պf'yU=^X.#r{mj5L]ӷ5|m𡵞aMfL)ݷŐ\6do-3]%"tqsh՚hWw 4u@sĽ0jlthA8s묋@bo>wK}߭)~债)^};!ӎ EWq͂=eE>]MC2oq |Tsb!`-|K־}T ;>%6qA@3c=|6mrh7>go3aL7 Lːpz`Pw(b[4]* _q:T©|;z= 7E4G@x@rć3p ˡ!.qÞqyd ԻtSX 7ƮPvٱ-S$rymu[Gj+m{ұ$0KBobad|"'?|aa@[S7!3( Ƕm۶m۶m۶mޱm۶=?lv^T}|/u rE:~A΢TMP[! j%/B!XW[W7l5/qˮ?y#Blv@qWFOû Ȓ$i+ (/͎ ٤%~seui5h]2SlB34Ɓb`BkME o02B^GN~qls02 ]߻V%2`+0w+,=e/CqR;abɫC\ |R@Gds Eggw3t0/#vbG> ƱΧhtrRe9wz'e]pUnWm1a_c+E#'ydؽ62 ){b4FC&_xhh]C,D9K!|l@nU6jV=Sl [KAJJn&>|2M FT_`EtE6=ja֧/B#9=%nI=?V],A>b/x/V#p#WJ$GtzSFJ9|RJd<-yAW >!FzJiz_EοlȇZ~Ɣ' L$3|4h&iW}4*ta=ș1jg)&_ӑr׶ZhI@[qQ<2zUJc@xp _ѫ2yKmino%+͉׿E@'9cǀdYѨ/1NW*N1׬ª7Iyy ܱ >z@0~[B,6x Gux2uBreypU]`##lόcHt)% /#~=YʎHaXPAqgnx`rh{w[@{Q=&`6^0DzbE%MVPENo)Ћ 359R&h$oo\S#aǬ%Ʊ;\)]f-K'3D t\£xncSЌhf7Ug/⼣-_bś#tzFE.TȨ ۇMQgirX`ZcL@7Ɖ.wOYBGNeeF"GG]8u[Ṳϩ[k9|̋D k^Sإr?G`"r: +m=T6"J!Q烗G5@1qVm_5nP9d{ߥh=I3p#UFtPi|/l=#R]ߙBAPhaGI~57y ?J}Ge[-iGjWcb(M@>bV;Kjt~O;uV`!_3}ұ]}3#J$Y"&\ +𘁶҄a_l!B*5]eX #^Uh[=!9 ͯ",Hʻͽ9е,D_=A`/t>(aׁ݉k1*yN tR dG z|2-aK')\lj(5 Gog)ZgJNdP p._G20''=,SқRp"q=evA53/{1ѨK,W\^YViD]MJ۬D7{T/XcGWl1ܷ;+E>K(ǯ+/wg[qA{W\hY |sLU`]y9}ֹB)(V`i st  8 #0k:*Eէ?wU\C4"19Rp]Zt$Ha NG65+6r! ȫxۥzGǒ^x"[y_66b=uriF"V=]x.:` +-2DVR8ɳ+ c%VS+|d8E'wZE;1%8YQ~Ɠ}'OmtR%cQ cyB=bֹ@]bd|iG#8TVV-lߛ<8:Ƴ>EVk{|MGѯd bŇW*x\ٍj{ 9`IczQ>5gO] aK;7ŎV#LQd2PV -(vڧb@GSp&eC ~gh06ܶ&A‰yL$BsѬ b>kK,&YZMH9t2XK!QBƫSGGpmGQjWcM"c3ֽyO[ޖ!Fp&zWmN+gf2i-{$,GW5߮;0fG'9@lh*{͉i[wZ/ie2j>KH.)}1?~54 N/l6Ts/f@;̓߰'/0N.=Nf }G~A<.ɠ6x" #rrOz _9Kre4nzOnxg>+;Kr]uGlIQ'{-wstI"#t$td6) fH֨h/lɺqF]bĺ|ߌ! (jWdT.A"a$LJ=t$d߼OzaZ.cwM4*}f2:PӾ'*(rOX,Nɓ|:X_YnVnk.a$Wt=%+sAGD࿀-d#.m Hx,­<8s3sXoCTC+/c\5$cټVolH%c鐁%[1Sn.Orn0P耘UcشlG,jAI. H2_se+݀n~,%&ߵz*OICmc`oZd'hs`l>ɕ#os.K 9NCG MH O&f=_` mX8JFwA[:M6hPĈ/GPn[%Jgpf*/:]x>8xn4PNpU40rd;T#!>!fM_KbRI SNQ2LP+ȣxÍC58d r)Y;b?:] ,K!QS͛#.|ck1 =S|1՛31Qɨ5$0Cj=;+RM1N\zO#Gi>6Aڎ!Z2ae6v3}@gLFn1s-M|;pR~*ºf3CeE<(9H F侲a8ݻ0rM;VM )2 yy '|exTav5 ~Q"֗_\QE9Y2QC5CMT7YїH"ќe'l}~.aWǥ *;lj٘)#dpfYhCC1}ܧj#wh9l3z<Koq3qk Xm;~aȲ5(^7 v иhŧ qSrm4~n= RܼhJ@Yø!mv%nA&e"^l9k'E-ͷWM1C5q/鬢 oެNKiR4 o+C+QM  {fӑԷ.E ۜ/ykWck1kv;@HlɋtT+OfSW\&F|ؒM΁0`8Gd50ٮꀎČ7L=㙘6^KA4Y{STF)S*L_X}qB~a>_JӽQ{ITO@[D+ W -fJTY>o \ŃvkokƺťRbr҉Im4?j\(U/*T-BE}Pu*麜0Ҩwpz{z".A>_褑+}pJ}RtMLFSVQVFת;C.3 /E)|' x?DAeJp̏&TC"NUYX{ !1V.lƖq[Z$RbcC1 Burr~ٽ΁G#)n%A?\]L2 iTHQLi)AvVh_x; Մ.f5j#dTV"z9lL'Ō̗`CAYIfSEO6(6D9ܢs!EqR1ϸP\qSl5Ժ|P'K~]eoX{nTd?*WI4E(KYUEoObhýrW⅀ Jl]G]!MGQz36_X춓?&7Vg1b%ϫ"ov<Өq^\52SM؎M] eBZ~vٽ6YeԽ ]>{T7S)5vOt-KJ"ͳǔ$e{-ʌqm̡a.ubCg +rDޘT3;eOyڞ j OiN,aAVJF^忇rHP|3Vcs9j ڶ 6y!-mURK͋INhëNAloލ֫NF'9କ(G2MWN3h?E@2pБ9]򺷦3}2ʂVNW 'F}\ )A V=^v`Y),&$/l*O s0#7{*dʅw)'Vg~_L-faNM]c0ss*s& 4I)P-?L!zﱔT^T#sݽ9ݐ9tڻQT@R2_d6Ċ-\}F9$yi"lDY\3K*[R$=tQ>z̘E7d 4i<:J`O[Y쪑l;,ˁVPM$^9ìpwTTg;Y,Xǝ:N( G5(R ;&qAv"fRui*!gM`]ߵOJ.k$kJ܎ *\uF'ŹMa{[pݰYT7P~z8cѥv`' (#iO g} d<i/ogEϚ &jߎ; } pFK`s;@9!$j'jLxGƚBik=/ƒ;\# J|dMۗOQҌHXE3 _?t+\mYtv]7"+KEaI(˴u/n."?$gl 6ޗ?Io4"qC}v]{ _}C;ɠiGXv+JgX7vA-TV$lo ˕G(YjzvPa3 !5$S822!S@ʈ~ +?`.Ʊό^/ԯFUnD zhPv|o!_Ih_ ҦeDcxnJU+eLϸlP6-Io bkS`U(5qI?>x"kBL7 VwBomP'p>W\[%7²:.} N{,Æ/hā! Nto=혙ȕqna'@gEOT+jIRUB&V:3 yp|~gIЛ98"LKRWao5q9ɝWZ{V>*HLRKz~@TR񺶕KVGJ ~PP={o:Ҋ|sh.|U%鉢͝ix7sfCtCtH *֢s;s?X؜1_w9 n4` 9؂V40R4iX !/' RIN6yF+XʹR[F|%dZ"\#|j!.%Gew,?#qe7`_.^WzӲÇa /!K{zL5Yehkhg4t@nN>\ ZF}%F:5XXdhJ )h1-(0fG?jҔ 2IQ^ЀCn -}0߬d>H Q'ᔂiHC`VDŽV_wXYI'Vn#I~W#ax@|aKþc-. [倆19tj{hHa0Z1"<HZZWUaZ63ъ{HJKrm!#69}m&$.?Ye W%W ۿ}F%c5߉4lIG~?]B*/_Op73B~홀V/vnPsByp e8[P@LsDZz ĞgSxvPF[#nbA{ % 26"qd:LMmJr^#J,m\z-d &9΍ PBȐ%p `AΕC9p_h:)xFpw5(s פAvsm潵\zGNH|DJS}eJZeqqD<ꑰ# eUML#eGA_esX+ ^ TV㽯O ˁ_mL \m q8endstream endobj 19 0 obj<>endobj 20 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 420 500 500 833 778 214 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 600 556 556 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 389 500 500 500 500 275 500 333 760 276 500 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 500 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444]endobj 21 0 obj<>stream xeTdͲ-Sk^Hи;4 o#o~w~T3"C*)HTDL ,̼5+; )KGA! 4vr7v4fq)GsprtPh-|YXY(܁v@{/kCU j [bJ2 Rj)ull Pr3,rV@{ %g0u7h._A.@S/3)=lg rX8ۻ~`eojfO_r<~8:;|})9:[9*K;NWKc|X}_;L?0_ZWc+{+K0̬\m|9:[+ 7+{ 0v6||a>?yzcGG[Y;k`5gcaiN7w0[n:wDO|al`o01)8~%@WeFZJR+,j'Wa*vxo? lMo ,boE ,lD+I+O%աf@g[+{/`8ڛNgD7ARiW5/G ?5?X:x|X3xx8<~ 17vu2323+#ao`ۛ} VNn@2˗S210 4;]1*짿}ݴ 帴.HS0H{^ 5n伝cJ4xqz;ӴQvnH7Ra\AdXvWuPr~1'u_1@U92^i#D&۞VQ[6|:puE3k_; DWD 2.MЮCgneeXDR!%Smӎd6DA5n`t9%T?k7df."ŘG|>D~ &um`7q m󞏗R#M9O,@X 7o W`w(%ۺ3l"(4Grd\AeuVd%ĘoMC/])q]OKrP6}# {SwF0砘ߺ.ݚMҤƈnrѱ@oIfȕykZT;^%( 6SN Fs}>Z Qm[49~pQNzC0IL&Ó̈́#[UMdks6~jVivS̺vcNѻx?BǦnY⯪Zg2-,%E7Oh@)=;FWei  )f5Cĕ{N< $bQo 픂{+"J|vOi%G*{aIմ8pDl?ڔ|b(8oO֤kcA ՄRpts=M#5WrmEO,`7Cp{9wӽ CvIYPek.pҬ.{&3 'AAxvS"Q4K٤n0oG( ̳{j1odXlOb9\>)=BsanDAd'Px#E N)KCe PJ<N=Ry)< ަ}9vMXp.x 2FF]*jR@\UgYA X]@{cיWu99ָq.Z̮ED'HysdVV]ڪRo~ά+6[*_,9깹Lސމyr83PIS8cy5O33\1DUi3g?Mek+gd*m|3bb-㗧]+J'=\UGN 0&BS9TϥQ9_U',Hr)}L+TFb;- DG;Ҿqe꼴fT;G^7τQ~z@.c N[GD5۾J36+׉bh߫nj׊h:ez,UHBQĉa5Tf݂;λo kk_ȁK#e.FI Lnn#9T]аؔh(QyO4Pr*+'X`COQ-|تh; Xr$ΝCn/ kenZV|'F#T8$=#E)5# 6zT`3 [RR$-6FH4i{'a) Iq8l;_9ږ]#(&YΆJȆYaf6,T;e.nj> '}KǕ*"کytlC_p,FUiB7xi|ӴLr NӡCz MKY.ニ>ïa nn GCNS $Mrzpmȇ7<ĩ68x }}W@pq#F wIhVKOTFSkpTڞ 4|ѦdM!La/NS}9=S&ԄJ] NyH1C!!'Yږ#]׃$/H &I8njn6isvrHeAZU}jcﮗT @ '[bh&j녈]ŇW;IĻ[6g޻p{ B>~FA9hޚr~nȍOTwp >ֹת [틊 }gWrG@uQvhư:Q2īAi{fJ._ӣ8k<>7ֲH08&QaR d݉SmY&/Jd ]s;LkkXI"qJ2d7ua'S[X1흼~_,ޅ04*w4}[/`4*tGG ~p"{1ɏ"'B4Kea] {wO?;x$.P)[L|O2϶-{B|Ģ:Be;1 TV7 v?r֓-L#s=fk':| <1N~om|Uchԟ^{njKUeJph 4(KcWĨ+9D6-ho4\wRRmyҷڰ͚YڳBt,*ؚ! mEHx1Cqd:S??tX䴩z/tVrR|mw R=)f[w]]#"g)'.ZYg׹7:O<<̵)#M 9]AyFY?.LIǻyb|Y$AÚs vs`]GheK7=5jx7_&;FR6e[vA.S/ai%=hӂ i tLrA^cG;FMLPBk:?o-ȷ9aOPwUL s"P&du'PkU+ ,.vODt}JʲP|.b`mI^Hz$3e[?ňXȽBF$!ل2y{TC $+fV>!0M::kc5گg9<͝:?qSS WI9 >?09*e;I L^9ݥ :yδ6𗌝:%E}|mo:,?j?YNҼp*#<waP=n6PZw}t$J7Jھ5o .Wֶk73 evoYpBp(f]Ǥ,GJ >zuG;5OEAhy8х)"6`:yB!\t(7E;>b͘DT}cDА\T$~Cn]UtU_^1x|Tr̘D\>)X:ƍ5>cZXK#yR|6븿Ą]=B]! nb9 sT}ׯx4T޾{[s `Ux@p ZETy[gN-2 /.5𴇾NuZVYx9n$E<}LRu$F[Y +t@b,|qټb04#uO~?)Gn?]Oն oWDNƈuL>9*0gCu!ʭb1KAPuv\ FKun}/f-^¸'N c:.'r701Sv'+R]iE#P3tZΚB6E'Qs w;g,?|Rd?3t WjT,LD8WޟVy}V^;8wH TX#OcDӲ(&q҅4VF4y E}}f#NnE83,zjzɊ7#4VU9yb[l-D KYE4Wt_s|%eiPUd-gn>lӓ5YPf&a%[\m^iM w\Ƙc ![l${)| ~' tkmO; ^GZrHmu`z3|9 -'WG@@o'P*ȣ4 {@-|+>K܌2dM N!\?z"=޴tD=mb 鎗{@m50!aXP˦Jg ƙ(MaUĊs:C61 Kzۧz@!۔6ll&5uXoV)<`U5 (ƒ,z)դg:M(* 5fGRORCdZV;ƩVO OF󗷩sg rKY+=K? Nٮl*x[g~ֹ\̼d 㺟ݏ_i-|^3C%:Hzǽ@ⳊvIPDfOt޲*lr|lDɆI$1Kԝ\3x)X^Wz9 Q[]uv Ӎ8p '{(_|\ߗ3ewXlҙJbw}U|=0G;!%ߧI'{eM #e cT{j4Q4 dj`ҫCAYwü j{m>PmAN`ٻaMo8h Dš^֒ĚG^ v.с+W R= ǖBE_vlShmInC\ٗrq3ZOWʜ`ϐ;t"=OCPh=NNx%=R$ZL{-LbBgw[P&;N$m1@ʓVX*}ƹ/ %07'_/^eJrFF#]4K4#+V'T/Zav-Pw{BnjF* bΉaޘt٬C4PH͜;#xw`(q)mHJsC2̆4vhHbn"PdL'8&9q˘(s^W;綟_|0$cnRbH djkG:xc6C v zɿb ^XN+zn[-cƒf~c8d\?6' _F ^avN^b!l`+ktJ9BoXf w eg!d^EqZ}X땜=Q@rVަŲ9fɯj3upfP/~6#\!?YQ|Uդ8[UWod5tmFw i͙j%ݕL?ˇLJQtMwlSڦh%"f bv@NGݷDbeVC!j(Sifol^(Ϝz D_qc6~dO!B `҇޹pxTI-KXתBA6@NA2 t7F)ai;BDihN&Mwy*jcgkhA'Y:Y$#Պjp 1/Ns .FLjpkA6GAWʶK9/,rLOȹŰ(06iA66%/Q7*N6)-NiZct6meWIl(A5菍g|ބV@jML>> SF?rGǾ<^.@AkhU2|N~k@k0ܭfs[DyjTt$9z>tc %b-E 0 :0Ty}Hvibeoj:%VLa&\n#ֹZ-gq<=Upes9FJ;g) XaCO4Fm^1y ^orH%=`'Gacy,'y_l(zp("R*ra(Ba# ۝ltssx%*d(0~G;*8#q`EcdV\)/"]S|T HԻ6kdWl4b:|γVFjLK#4'>bGdHGc; LUC`p Zpf4 E4P2LԸF0:m,wޥ[[g{ڼ ;4'Vaݨfxt\h@P#s ˏԾ +BZ2 swaWhXq]ôkͱ6~M=N 92(=ntۼ?{lhG?.>2 Ҧ:,Z)YpӀ_\SնN. 1N+b#;x>fPf<%hMیag1wT_NUv ;%N[ Ov4|Co : -\U7`Ur }d[vKW^g H?ˣxIP&!-n%0!;S~t8wɳ=1=R~[ 1ZJyQǣK? RWi Kk∣}^n*K4.Fӌ{B^ w D9k${uSlz:kYjl~B4K0ZjGAӓ% KJ~2C ٌ:Qb&橕'ɡvsq}-nKn F]BjNe]g?>;Xc&4 չM.t0* ~SdQ,15F蓐řY<*(mrgRg*¾I3$#@BBA~?/&;YNкY)TKezՔ4o `FWí]Sf^mVL(y&R:Dڥòf~ G,%Ya֢30 5xA5CEg[TŔ-Kj=GDRp.mޢW.[N61?'S%*Y#P(q*Æ6!YPY*:gJOWd[PVFg<ڸa؃S?L)Ka?EklN1;"Vn>&a]T,&5wmTxK/P!.D;D,;A+zf+;6ea*ܚ+K#Swm~sd3nV]ݔΊfF[Mȍ8vhSXD)Ћ|e2g L5 *q⫙~VLRW4 xaðeXQW6M󴎋i冑 GQô׭Rjd뉇^K/H:g|K4"D?SUsJrtՋ oggMj.8bT{%nWZ]QnL!<63]ܾ)Rwd ,{͟㽾Y3].dc!r|;|-HĜ$B:jXSg8\H׷lBX}GpX50rL VV5efb0Z C'YPw%iㅕ~>y(YYG-qJ3- C-z ѤֈO0<$cEbs͉w_H6uLt+٪mI1`Z*+1XȅBo?$󣏔g'[ %8@V5Avy#lVrզF@4et# $OsљfNj_]T^TG3[zfW'b I ktBQ+.@#$.aKܹ@oCV4҅] ++b-N(]'l}:q"aavz@uʵ+{XɄ̃p+ !݊𘚬LU~+Ge<}f]k|^x0m"\O4Eg TqxZ]k_!}|'^Wל0L.Hśl^_pV4a'umL`@zoV> 5ZFZ’]rR^oq@nIW{oERKt;T׉D`~FZZ\mp8[$*oF_TQUCL=Np C}2H~Y-9]'PMMـcc ٠^y{$?p"6`U]5HɈ']i&2Yg%'~NyJ.piMB"89 Ѿbf(o}=uO,ѐd&ޟd|]Tnԝ3.|U"nѷQbyZUMY--{C5U ()Xyc'm\3@@ >ШÉ_b:V큻?b k#uixF0bTݍaHq B0'ZSDx]!&"RZVˡwN)/F Ǘ%9nY*(c[)g|q9rU_.  Rsq=IfPd"f^^2ro@O P䭇1ֆ{VAR~(2C'>}a"YTZk l\*vk&0 "A19)7 i.JY4^M3J 1VM< `s39nbɊXABАlBMhuϏ,GX=XR].7pE :oU4 8d ۂq݅rjJm Tx-- Qsp4:^ khqwPy?+̝z f\KG1~GTԪXp^deSW.9ۦDytėKјLcfJ{ZAf_2E+3 kkRKklxr-|7Þ sAP%jTA`:d&+gUFO8Np.TA"ļaEH`ZԦH_$ϑ9].!6Pcp5jgm]hh(jAU_o[$_E% r&.r}œ! m yQXzRL3`0Wˌ,{zNB^pʕJUSh_ENX0k?ZAЃ5K)K}!2ʛ+tu,9xsTn?P(DDˋs)skN@3t_ o1j>aBkEMF!`'-3; 6AokTk[%);vP6g6,ǣ-?MXA& }hCβUM?_*юCYnĄxGɔyk-e;2ҏPx) %0k~!ű Lg\?@,Sᮩ34A|M?;YՓ"t܉ ɵd#hkb"A}(uߒn$K59%u[hH ?_wa 7$5B3x yL&QP?aABڧ<7`na3ZԥCxq [B_ʃk&F$Oջya"Vwͣ~`8֛\ ԶXgʆ_& aqh'rhpAIXn'X&β>*M;gF5lA|I%pW%oODteDYXI7?ˢث UGul~WCwX2˲jx Ak]2z7XWNJ…QfP7*3ȽuвW )wpSm]7 hAF D:ıM!A}y.sR}vKl U1Yzf_X{)B*]'=:Mg)Y|X 7 ^!0Ϊq'W.c0Wx+^#SIa2sq"˨][[qeVprKj[&Ӓޏ_Y N@Jtүp!=lX~.iZ`gtmtvaN[&. ? \&XƆ՝viJ_|doY,kob ̂M PtRSvF68ȹu?Xi\WxW(9\{b,9,ݡyHM9'QV~R Z#뵊! |4#W.׫s(]#ynmlZAR#M~sDL0QtV.(`{%KWpᙗVN;iڲcgPOrѡcw:dV,LLf6/;\?Ksc.7<*CM܅zJoiпABAk͌ f02=R@+/sF >).Yj~@"!*cxXsQL(׿P *Z+a1*IHL62c=m5Qp{LP**ʘ@zƵtXH)YsԈpGe`zRŒ-&Rû ȇae6Kwvj2JCf jT#(?՟IhΉY7#X=\0q約YSg  Sg[H'('ڧ G{2RYXsbA1lKxYr!gT?(V92Z1u[CM +ʗH$dR]OS4B4>QkR;87_՘+Tݡ! ^HUG] =hx.8pPEOYg;! "%DHҢjX6wÏCO$zb,fTJ'bj|5Kv1+0 6pz⣁, hpmɞ_RߠEvXw/TeJ:t\'u+ Ub!a)bVrȽ +hpBr#Hh hUvn_/郰3ߧ~:v WCF0AlN+rQhx0uLŸK@u2>CWQ*юxQhc,h6*NQ, &HlcmFBKӯFRR.ˉf.f9KamK-wh*"jqHy6 ̀-JyT\$HjUq$Q&"bshrA{0EwßR' / ɱ< {S4W;ǿ2 hzft3%|/̐[ v򏟏^0!QN@xSBXcp+^1X2b< bl 4{Kf,k;Id,8L`WuEϙܢ]g%#Pyٲ[1fhMg'A^ϙw\kxߤQcMIjKL.~k˂|'ҹiMRNe٬Id5ftR8I/u&G{G1i.%ʷ/ftf-M;nldk tvr&)6"(Tk8j*Pw&C),f`æ-,aoԫ/nX։~`|".+H!f2E..X`c1-(.6[l5NEǸrglXK)~̛FDG@sᤘ<(dT(J/ E=eE+2P7 {^8/l!bT B{ğhEPSLV&|rs/:OgLʆA*ʍtң&iZnXVh@`BQ kK\ ;_)nA-qtVjat :>j``ȠL`#%@W\ID"8k@fUw3BWb"j03&Gx,aZa׵#NT@,P吝yKQM>-ìS1BeeyX"]1{h= )wS<45mf]߫_ϼe;+EhM*hCQ=r7Rn ~τyT[8-ubfü͵^ ~D{8>s_$y`\I- 7F&wI K?rkrBl8xż fru%A-Ir'b<%XzbMjZC~O*.@LtkI8'&RFF{i?32-c6o8"'Co;kay,7u%,{M!DFR\ ]F nU)3 .so}g%~,MKrȭ2'm N{ B=XB}zh#hvt̙%YYLiAZW $-LtUE.ѯXFqBޗ UM*)Hiy|)0W;RzXmӻ\GJ+ݨX<%A lV$#`~10υo&НɳGRX~4 BE(b+P4 T\LX^@˓ JSj`2 kZ+]ldAŷ;] =T@!+,@ӿi+(D^KA0J*Dtgxv{ 2͞׏9옟W7㻂I>@cǟ^=d֭21aZOMqJ~,WLlQ>>P~1*Eռ!HA戔/BNx^@o- E):|c{]D}'*E<<z6 1*@/įېo\]av2AbixeR0uİЂ1Rmlaγ2Nu6 jlV]VH  q^o1U+PM;j\Ҡ̝Z28iB *fG;%#Zk7ڟ▆El|зB1/=F->٢" Mt隨,u$%k4 ?:kRzX$<#B<3u&t)-ZJ( hGʖ$sP0`XYQTks&qđHѻsfr4C .^: *|?irN[wǾ 9uIҷhmNse*J+`'܉Et+ɹ %tի$>;(>[:dqs7+\s*Jω-NGOw!=d_/i 6*Jp[ϟG}6GU:z6kՠcIT`By~ @Y !~Ljt=is 0qpz7ρ)6Cn x %7!^!sHr-ݪtmB7=ރb3>4l7KBL2 K 7Wy&HB陣;=˿(Rg.nP^sfk0n|7i0IA{m4tK\\(9`1׈5t[.$'낖Qwj)gfF&[F_>P`o)6-ї&BGRPBYsCS X5ϐS/RzK8+l!!r۔(re-UM>MHȞVOAqY1iκ)o:E(n 4_we5M*Nb. ] AYƏaC#1L@<_+,M+[q/)+&`LgB*}tMK qa6C0]U8]<d;Xg^O3Uk/nb_?#j]}AmQH i$$PD>bǯ9fBR)˿i}8Ʋ}#!;$cP(Pf^iMEW m,]0EmD*oΣ9MW:pYNjrf\0[QO]е &G5T&+pV2U/ 8ŢtX&hXӋŋ8Ht2@YQO@>L" #hBKRde!Cn|VB{D&rLUaT50ՒUUٱp6 9ސұ΃F q!aa,2 fcZ{#ʄʵT MW; "%ʝÿC 6@aua!Jtg=ƻ)iC5ۥ{[3[\&EսeMo oA{.{Hx^:4&-mjĽ.U`_8J{,}~@gd?𨸺OpL\#sys Fsl:;#c0T_hnĢ:z LA 1N6ZE|)iϾ55p]T1d1w1ћ=P(\1:^}jMsȰ #;PZ%$buL> 5V+?rzf%|(P[!X9(qO?A݄#6vAu}\(C_Fbا5 ]!]KcĞx5GXyڣn{+P3i%hPQ,-Y;a#aV .$Ut`>s8Zo0< m(_dHhlVѱLKоDJ 3Ŕե"8X9ST/LJKN$|~o9ǒ~G/R\OWfe`Be,}C? Sr#93k{π o++ΰ﬍{Nߴ5υHl{&py='ױkӂCr>r eȬ3PhCxM=|K5j[g!hʤ"I~l:pwn!HeL/2vv" 3sOj~ѯx%)'%*hS}tƽD6j\-3Ncr891Pl(?E9q#؍h2q\ԯ DE<@Js,HUC8Nb&Y}=4qk[oGl$aЭɢ_o_7X! {{cER_ Eg'm\0#B Cb~BA Z〰xU^:!KVe2dl[xMM2ăf؊Nr0.xR\a@AmpzB0($xZC^?}}\mSXX09Aٝ^?YQ:H|3Y BD!ưͯjn\g[SO:-ohBG91B\0=3;\XbA4#Cv3T4=m !h'|l 0ؤB=zs'U_"':Pydp2[)3?{$C=h䖾MfYJ`뗺D5 տ!P\X/F=T7Z{+AC@&fli!&s3@ei}uqc$eUWw^=eWOWfrg;`bZ I1"gy)t{mBq;zbѦnj4XR H\pW}Z$H/q/q!{0N:ŝS, R5孧:J{%P*j8P1B_y&&1+ ]9N!cpEХmJ[,v~BѰ옠VS~eMW!Nɒq5"'8g;Vj[H-t7ף ` {F!,(Oժ&$c_P Q?}$AJ {(b\.MBmʹ>i'Y{'|,ՔfҒkPF-e"6\Oc]@(0OwǞ!_Hc6]`GBzğsgS7?.9RMe@H9Y߂)ë:,!b FAxC"7(jI g0髚D^Lt*Trg9s*F}(խ\1u!J7A ~T},@DOG#of 犜]1,{4AVk_S \e?]L=bdUaș<* Mqvi_NДERnpkGEȑEY(rI'DH]*[ڥDF해ł&~kQ JDq\S Gd]rܽ-6$eDYPDa)76)JFr]^*+ʐ4/3x_df7-\H̃czJKAjɥJ& y\y2m!dVi1k25OghN˴ֹlHz &DMUt /= 2a?olCx!=D,&ே˲"]/{d _="5)$@oM=n'Nؤ[-cExJeʗ4 ??paT21JsOYAA V,*|F0-g&c}G.MPH>Ԁ4>KgA`SܣEAIGiu2#;wM&N',өH؄H;daTsK8|VS$ Gwpb=f R o)# OjI:$aR3?ӓYmY $4f}S{]9|@phJoпXXOֵ+]Щ\pHbOTfƨ_VqaR6 -wo_fvA.d3 1̳IS{hYC,uG0GGU7зDٳpcfH"t\ 'M/GOGܳKV[Mp,3 %LRCGSV lj<-i"ni`CcՎ5췳ٕ!Vy\vt *jl])7GaOKD34\Ϝ*wY+.I_:WLQHZ;呹wyaocw ҥhCa;w}><6F6 lga(< p P%K?r_+9XbO"zʫCJ'%{+xXx _Ve3Ʈ9%I<(: 39Im+:I 2cVB_qɆZ$궱&ܝ^Ԇw>A2ZƒS3uHB9ÚV#W.FB-#P'&ʺ66=etnӹ0_™q%s`g̈́j ̤\?S7\ɡK,rӷ)IΡ_˱gTYTHl'Э[<]q=nTw* Д >WUu8 "Z@_^!XD/_v&6YG]Rh*BHas'lO0 |8M S ;3|l ̗a=y]L%MhڅWcjGuϒQslJqKt[[xD>؊3aKyD#!0=c%h D| F #}T(mzrdIxU0jLEfV%,-e~g>.{T*=[cHxěaI! Ú2Y+F q?"X K r釋AF?Ǚ} O;\(!cVo2 0,dϭ$+MShʌWq?x3*f:Jjl>E0]FG ,DFg 3*C%Ilj V7/vz[ qr-|Yy~OZ-"$/B]D@\d.>ثRRGW]3h~Oh_}5tuJ Qd ɱia (,lz#&GZ>O$^ZuXQ,Le[iv<{AZl Y "\2w[puR(f/e/H\Ҕ6 v`t,M%9co  ,TGWb]H[9 􈬖mHtye3h+VER!X%"g[B @NGsf$e%Ud7(!ã~JoO+ PUc}shLw } [B;!P#;Abϥ%Y s߁ս<<1&m+,gv91zGryn:h<<؊aIaj3J4~s?K'2PҐ+`֩&=vά]lj#X}2Vz\}|Zjo !A–:- eY}kg~{9EȁWK+8T\÷t2;FBKH?#BFb'~K:Yh 37eu3e14S8_~Y'e hw" ,$ z[Fe x\/mfC u ҡz :uzV42+W5GCiX8(MeHϕ'u]&t&]TeHMkhAeI1a*~M,b4Sm3␹+.lQ0< `IfTcMA*բkH^)q+l*jM pH$SbMnKa #=~th绖md K8¥_fa@(z'nKl *Sfˠ.]db= 'lt'5^N L6SТb(%t~$^;Ćnxjdmd89+KVY )zR_Sح WhϬ,@mdQ KzSM6ojJhak繅z ,jwQ3c+ru7Vو_HEUws,;LN[}#gv"PY,[ە/ n|B%xd nE3ɫGX?8 y@5vT!fKԣjO$^ѕmC?#k,)vf]hAN*"1U~ɕ:5x;<$piguHtMdx.M;a@v#aYpQT}B&QB185p҆%1=~쟧@ -(*kXX%eE#u9Q 9*)Oy=qMZiwf `>A 0^y9 pɔ+-H8B9Qiؼ9C~OMbPvGi!vXg9usBb1%z< ,/yd+ $S q-ExЗFXUbvS"SZ) fn&,آƊMR>ڬ(1)һW4\k, CTjw.ʁX%Mw.RT@C|AX˽J4]`dt馊PLg.η|_o{k&5@ET]وGT'cfK?l2 ed]l^ E4|+KV7`Uk0S<6W,`-6FnITiywJ!}(4Jj?#a0ר mwo,mm2F,p9GeŤ͡3j0x*V=^˄9+-9Ӧ @rb0@7q1@;)PIw[` w2艮*4!x"rMh8B7WV>divI&m3!PyDMä\%\z!s1>N9^SyO|H#Vr(jVNpG&ܨ# $6 oE׿Ɗ`i ple*Ӧ!vC=9Ȧ f*Z^ Xddt~騑ؾ3I~8Rqerѭ8kfx^l?$@XR6 ݕǢΝhL ;G;@HTOrLGpgt>'޾9z9MJ_~ȟҎ@)HYeՓ!m/E=⦩]vmLKՄi\~.1Wx e\D9_ziCr>ƣN"YC s.ny,+sc{>&@-bKߎ#Yng'ίA'75oZ0~>3S||MC?ff?/H[L$L!{+fKxmeD }@Ё"p{3a,׾"V 8U~K+/h{J-AG鱺^@QVaW 2 ޹TF9 s{"R#Cwqu$rW+DV!Rmw O1{4VFaT9rIV47-JQe矍xs+w$D/]gz!9 Ѭ11닣cR/=7h$$oB$bpR|k 3uRj? ykWΔL$^0[w#[+6B! aeFWaFa-S'#bc1 Gx۴,H F<!A1]U+9tI\q,ϟ>gbߜz*l4uP$ 2bkPHH#l깻MJݞ{#`3Vu[X$PNCc$I,ikg~v\7.ɧ.7e9e6@;Qµ}⯤j>nc?c 8 EpeO X _»wϹɥO,6/!lF H<,I;UO>zʒ#W>8ݳM.S*1ʑqÄ]8D [?nL w(Y#j,8&[/hd-码vQd 'SL2׀Qܿh4NA<'=e{@'גw.#a#u`%뺶 ͍yaIJ~;0?5xNVbV+P*?z+0`3ԎC { &n Lީ㹴Uυ8 -ÇXpoČ \GV2Z/WјIzӤJz${A pj]}>6!qB3;4Aݺ%bGyR@HQdwڟD_2)~0M)+l(JeH[SZ՟o7:=[{W¸_>m~ 56G+8Y^EwSZNP}N 說] DSa8zD!'d|ص{ 3 *j<7@ tŰ,;\=Ώ5ţ  r'" 𬘿rȶe@`%T#}B}mƙTzC+yq]6[PIO:%x?@>ȸ:[aMKTDj4 0_!';g YNuMD >aLGmp]|]^$n=&u_p"Ho}%=PŶa/;J|!W j[F*Т{(in2c5[vRR3mD1GfRF:#k(`2 :خYlOi F_01amQ'P?hL[v]siٿ!>YEIZ1QF?cHp44'Z"+PzL7S@g"F&%m4I3aV/@ U07=TIיaO(w^ FF<\p$HSfoZջmN wߑQa:c9zoӵ GJL3|tA/ʄSo\UÌ^OSs o#tRrF0QsU)BGiAe9x !~{YxuJx6$'!s"=~232WT aq'`MZ!27">lJ_u.|" lZ7k ](oTiEZbU9!w_Jx%C<_ja}b;%_rhpI- b=׿YUK(40r'D=-VDP|ͫg_%C L#:_nL~hdI ]NGƻ޷97v^[J] hdzٰ 3R7iOФBGM!™يy.TǟKO3t( oN ܲΊe ,S~?<w>O'w"{nswRS_moPoԔ7M-\AisGP pO%/jм=T~_l PBiWx&QoM9{||RB_2LBq?ېmC]T(f`/h$3ErJroB=7lu8x@E6|}RhwyY3a-bP(/TrZwhF«+2dw":mT"%֌*9c{&|lܸDrELq \[p٨r_Lیwo.lJbr_=֑A29Tt7)m?Sژ) lLrnKsJ N5?~kr)iro&h0&¦4ѾqVff8ZV{'ć#d\Go;$Κ 5)rM,]Z.N3t?IG8B\F~ dEsDs8wJI`pN#"\J2$ 6v4|= g i.;gyhV9c5NRt(U)d R7( 9,>@?YR΁vX:Fze!uʈ~g2O=>XmlXKY6ǶA:N[Ace1k{V ۺL-l'EGs*}S>lҧLc/=u*ٻI "/޸ S?^R'VTM[S0=*2-Ts#)yDV!h1RdE3q nu>CB'Ux&eVTdD"ߏFr*Tn4hz0+7Hv+ET>sadX>Y=@>3!6_CcbBeA]F*c={ ZKo-[:H[IAuTvR$Iwv*1.ȡzip{H)+'Nxr ͮ~qbӟ|X.}ǥtChVU+)#i)52Cɗ$^7~N dJ%xYȹ)C s^+׳9|!:ˢ ]T9x'=J; ;(7u7g>6;vGX݆/:$A֬>oG'=ʥ|Dn=,-n!?5d '˃HVmtH\la{QS˙;BF>kPR" |9HR4$[fOꁘCw%@mcD۶mNvǶm$_Onw jV>٣HQIe(Z=D/RtBdzO)Yb[S>|QUpuqpgPE]nF$&Sr$5\W%$xJj2NX#h02C;BV߸Lbu񝈻rR fgNDӓ>kP)}ʜ:|;-IPU9%ewގa o8Ӣ:ɘqV/re:*G>Aƻƫ^agt{`&(pAOw}啼`0Glۓ}eoH/PLp'P1'lfspvc4trN*Cɺf;LYcɲj~s6 ^)I2f(|@RHְT<ϥ/KB> z2 pMqXVSL7kg̕e e5U@v_:?lsXXYQStt%Pӹ&u<3B߳qVd&]]&y231v QHBpC(s&H@}{U{1gGхpB]\$T۷X>p>Uh+@kf %[CJ>+FA ex~~+U>Y~ ,1B5 J.&V45.^ޟ6Av ο؍KͳiߞVVe:5(ᑦ ߿}R<{MJ v|T/C5oIWSqu$xy`*M ^˄M 1<vTMv%g,c5P<4-̎ `gdyY |˽?e ";4e>Au( V>.Ϳ\ewK(׿㮕_ @=oODXSn^mueS'z=׃q( %9o%_kR|O V;,?o~Ay~fykZ'[|+ Ǹ~AH _';M2:cІ s;`(տh#UpoFZ^u4@0iݙK_`ɖ2ERSjKb^K0Eɸ'+NChth|n"¦B6 03u8ټ!nŢxД*l WA*J m)2]I i>T]~4oZO/>s<)ͱհcrEeViof8y`>8E ǀEn~=xf0e#qQXSĔtErD}Kn9\猑ϵPÔoAAWg恬d3.޿օXa L1&ŘJ̃+l@ʓ^>I+߰D tqIaݐd 5Tr.y;xͪ-W-8LL>e|nia S[cLSY0')YH٪ /d-TVl2u(R@ٳ. 5}+vgOmW3_hLo0krx5)rH!3W u.Xaa@GVþKg~'Y9&D4zAQ)lzm=Unj@R^$R3SeTIA7dm&pEB(1ҌKét">杯ݥ_s2P* u%tbc\Qnq+xXح—8_z}6\v(#NW{!@Vj^ h9; jkN^!|N Νϟ0 D~&ʥM:bjz?+W ^]bh}0=fT&Hp^ҿ?)G;cK:$,;dׅSo?pO2ߣhG窸o9p )v=2' QXG[=R͘l '_8t>H :v.fܢzjȸFO8՟SGx?ؒ h P+6fŬT7׎أ_[/uyf(!^k*~jj& #%#0a3ITqn+lJZfƞ$AM~gG,qQEVvI],k @2JDiaSl7V:+t7Wa-W mӐ * g0^*N lĽ4iMSY=CBR|9AV@V9WN({aJ7ĀZ05̗1fӵ~{(ԯ>iCB"&n lS\Y݅^C!;Ť+fxK}u4UO=wKYw}$xS?@J5^ΉI[()EEcPuE~7 pKX?\(v=nC'жe%ˁ-eI %\1իDžTk2%i^w`x $ґO*b(JVP0a1[?QK"L>1Z%}a%O|pʐ$$9Nb#{4#nڣuu;w+oF77`HcJ/,%+v3cy< Q}ί_7]H&~BǑJm@aqQޗ#R_[ǝ$Cg֨qY | Ew<5:Aٍ6NO5tVRtODžκKiQv@w-wi˙?@"I1orY/N !# j[3z$x,}Zo\(47*IHExƗ-A/ZU:}oLzo/d-X-al|hYZqUBo (9A#|=x_AUsC;7J-ģrO|eclp?2Yl[v+CGDds5T=?z'?ңHDIHiC{pcj/x3UWGP*Ba<9ѷ ~{>P-o|lxzi z;@ChVXBh\R-XP<֪V6<ǡg-{)Q ea۪GOBV61\tC0|i` BHjebRyi+^ԠhJì~ǜψI;n Yò7՛4"x8X|Vժqz]8c:d CӋh>g%x .' n..Œ%jg$O2#̸/ jĭ ேOQi K2ZoJ, e| gNdc D+gYSg/eI6OKi^cHa!79˩k v/J'p.}a"w=mFrˏb;6pz$r0sF43j}`H8QU|[҉\k<]߃^bҔ[DBd=\}o!(s7:>C7SB>8Jw!#Cl;J<˙S.0_~Y3F*z"\;V`t#=6tc"GT#WY@Zg! L 66isԔ5|L$Wڳ: g2&YQ&GkBŒR=EiK~(?T+r=gfk9 Bg2=e7Pt?kw;]tN/-8.=ͯr 1rdbFTt!w AWv:c9 Մf(:wyO)C E$=ŗS9g.QڰvHl<%N:Xn*.L)v4=u NJIɮ"0r?4W!*^cXt,{6J83i{aŚ]^t@C^ '1{VF+@_ꨈ$ ,tUCZcs' 䶭ݾU!s{.a%.hU%B@X3`o柫yY?wgc+OژH짥&\8 ~]'[+si,*(vA5ASTb^@dp AbyQ K_~ lp;k|ցțY ;eW}`G/\[aʑeEsCjpndAS@4ԋuRk5-EP@ 9tF4R;\Se})8f2fd[XxVӕ*n9|'ϢtA\>770i(Vx=j_Yyv:mҦ6^TK>7laC'w-1VdH(Z(';2͢CkLHqy&s)E3\ x:L2U=ʎa2yu1gx385Prh0D=/6wWիxf+Ӊ!la hU7siWsofoce7䢤YQU"$2i%۟ة]戾1Ѐn$ߥ B˅ܮ3ZV5;5djϭaQ®uJUfkzL:`Ar &n~7.Xv3c3 x\60 :9pyC $ ^(Yfk[z."%t.I;}@DB LgL13Q?$0ab0v &T68' Ԏ}9}vz?AmU ͦi_9އhE$Z8?2|p()mtCU|r'qSU,dɑQ.d>)^Yݣ {a7OQBn\)MAIiݙQS. TT`;ո-K]*ȶ._kSqr t= (!4c[C//C:1M])F FA[loo iSoyQIgAF2?4GkI|i|oRjo!\MW_O)26,Wm$hүYܛsYx!׫lE f b _'i:*|-vKW2=xmv5 ieE8<}[7>c/n$y EܐjD kߓ##{~>cFg ;ς{{fZŊg'ŖU#F{3E13~̍;"bD#n6Ў,k+v+/)GIsjF`8}}tI"5Q5Hƽ2y%;~55;(QJ >fսuiaoIdIaŰrPԬ %ص69jܕʵ e͎m dd+Y]'eɶI/\ٷV¶Xv]^GC[!n|[j)@+_rC0`q]KaOucce\ YkfGVjx4"#:n/;y؂:1X.: 6t;._#Ѻ`)Jv МLl;Vx[?MYg볹+F, Obа_ cX̋umC[i(űͷ_YR BU-R`kKecۂ4C.LGcqK7'a~ sB?0 G]< \!MѴS'R7I)Nr}\,op>.jdbVah}ɚu%Mu7fL4ʠliڌZxQITK>1}RFwZ#uK, CGVFqv~iؑ,zQWHWOzC$/-lFMC00ĽP? )BV޳Ƅn&ok(ckΥ0] iMEG_k!X 5UXI;}VK([rF6G5IF>rT"cw[^ƛZ \@+IE:GFڑ"kvQߊ?yZ8zKEy>bĮ:!7\T|@ CX `!c2~B.+j)";V?Û^!Sy^*nVG;5)[*Ay'dwK{Le)C_<ݿ<'Go2[T/UA5o ]hBp]=9o5X%ˉ|pP:%\5.# :MT qoG:j}@'O˗`/  :ܬgk{hXǕUs ]μ) Pg+~#$܂cv1DEYWJ3e@<]}r~g5W hGKX`OAI*b-ysA[gɦi9\i@m2zpW,R;r%=opʚ>7/7y|Z~@G`=VՁ/eUtL #Rbt!$y G֞mxH#;C5sI2to*P!U*×osZSe:65%ڳ&%M<-tG]pzxpJJ_oeg*IژXc~KS(|zHpMF`2nE}lkl ;b6t̡ĻVit02,[ZEDFc eeqɝO0b ~$|3*5)7tW{)n~nv>۳i'KV*3~{F3JgiA2WB&9grfv"9.|XU7 EMKW!'~ݟXDwU4 u|_}OikGيybTr@_2ͼ|5P^gwQ$C_kL_n,ƼdռXQu-cY D4+lp<6X*Oj},bgZEVWr8_0 Xz!Iu[v>ߍB=\- (4Gwo1A͚|l/iuiu*;5`!sXhsS2^#э>\臘_lE ]0$H.B|. I5R/kK! Z{}WJR&JұrE C>endobj 23 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 389 555 500 500 833 778 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389 348 220 348 570 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 389 500 500 500 500 220 500 333 747 266 500 606 606 747 333 400 570 300 300 333 576 500 250 333 300 300 500 750 750 750 500 667 667 667 667 667 667 944 667 667 667 667 667 389 389 389 389 722 722 722 722 722 722 722 570 722 722 722 722 722 611 611 500 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 444 500 444]endobj 24 0 obj<>stream xcpm7vvlv:mtl۶tl;ۙs0ufaW]oymɈLL\6n.Ɔ+ )7@ jj `f0qqqD<,-\JT44MG`oMgKs;XQba 01+hJI(%TvN6W#Kc) M03'4go'gSco5ScSXS'[Kg3`dh{?|; d-aSwvq6vtp|[U..vf;%M]7?0\CK;g7`d 0tv1 d/7\-Z77?8Q l[∭x^3LFX[ӛa A/-}rM3!:ya!wUCM@OF,;jOxM1?4g /\\hKTK m! ~ic猝B-ݍy2)]~yapv7hp28ýGY%|9})bjWXS)%Otz1^m%]c }N^k=d/n)'@H@&1H&$h dV}1hܭVOk@}r!r˳xɽgU6)̍Ac%=Vu S˂9}Aa /~+Z雀\!mcz)kFˮ[Ogܪ79P8ׂr+"I10+IHZ? MPv嬤w;!ϥt^"uJ@WimU>RR`\e]0Kˀ?J|*f z)҂љq@y]-LJlSB'ĆŽj9aϸPD0w3ƦK)=i]^TNʥ)7B%QbpuY#)'#MeNI!Z eBCH1݂O8D%[\hVș=)"bB{rTPOS۪썋C5AUé`#9cI2 &ߗl>5JM*x\U ZM.4,;zlS"s1O2)چ'&<]B(yh멂ogXyK'F @!tpkJ JS' n#x…K@gxSn$f(^&d(dz3 4-f( <{_o2G<:WmJy?ȍ(p!7˻ˡx xŊmLpS|N0C+#Ґ`3c&k:l*'.tl<:;|VwNUCP!ĩ |.#G!7GKF6#w񽲁tclWZz1ZJp]$ ʭ/Rss +o}|fzʨ s #+O׆RS}# ҡ1Gy\oT0di9a/uŚϗ-A$< {Uv5hqp.€ I.+e@Y#M|BJړ\Hr/"Or:ͳ`ج,^fn3K_1^*˻6(t/#9`7?t*׭(QmF_EYnùq6=_Sw<V8ߙ9;Avѡ8$x(xBct}*|Ẅ́HbR,E"&U[~þKS:dޚ K#ɍ뒽mKޤgM5ٿ+=è}x: 8TJGdIErf"p"8o[%bNU'к&?3k,_5*W%Z U2y/N5Ks5KE|1 ofőtgDa`~wP"HۏSLچO'L?l`m+h\Ao#<*Csx{^M;@vI~ci+Uo'&Lh`*ߍ-ɜ$Yhߟ ^J5:Bxڨr3'^@ ^sa556W&鞎[:kTD?֖L3' .aaG9^1{x7%\ NnV$g~/oA 6T쵋H qSr"O_A !2UNbn j(ӓ608փX"seJr s;Nf -u=G[̒@5U{2 Dal ߒ$)gp[2ܵ:Jݺ&4G GnUV LfMxWB~݂97?E|M T3 E׹/maٌ zK=aPcB1,BЛ΁g?H~˚ؒji2Xqjنړ,"WFO:D8;Cktzڄ~eM倔{!h5i] Jl^{lـ.~/3ιwڛDU$c1Oɼ8j#` ޓc@˹MN\f1(3Oj7{6(lOL )-T>sp /<׷9z }B? 'վ΀Q)@Ֆdu@[6#pHPgbN^prWLXF[ XEv-^O8=fjj>S :w?(vx Y\\^ d`޶/s%x8?I4Hv8\Prhx-2'f[FʓIl[K)ܶpK|$Bi,n)Z)3׿Ti!FzM4՘yO v& zz /1>)AX'Dh Ųڛ xv+|\ ͅMt3E^ѣQFS}| u|\H& Y_[wECw]\IJ4&v8E KgWEtiHt 9j{! 5O*jb]Ef).~e`nH^X V &sʼ3ALý"|Eid L.R y_$K%N C4sl Ƚr_EDU2·=W61K[K9S T"FO`ǣq6+`UH1}..=!^ǺqMK ocEecI ӗ|LXB P\~9~wKAM780xrb;`LtfOJϮF Nu4N8 `a숸y FVT_ ,~4PIrAoIrzH+LV%K3vu\E8n۰:Yr8-M,g9{Ͱb~t1;hi݆.,COL խ5XIZsq %)ow@PS5~a{L@jo܉@s7g__7^/_l@0bTAA[\q>q51Qb-\_Fn\G̮ 68:XP̍؟18מC*S[qQ>=4TuF&Ӄ#ü5f_V m@nbzȦ$'~qеJ\S[fׅ+uH?Y @H_f :(lN9h ; ;hޞ㓋y?qo?{xah9CZʕ=H)$<0*kK'*k WY)IZ84i N.1!Q_Bf{b5/I(ӕ&aU :cէ5mYa cq}#*m}߆2C\ |?ތi{1sȟǵRqC3L⋻SʆCG5U(>Ɠ\iZ1 UGȼp$ൈ YfY]7zxXu gäI/_Bi.ܫ)A7ޮ~ᯨEm#yZ͓ 3:\Z^=khڃz'#ةsIȥzFNm׾QJb-k`B7vBH=sc9` gt;oK0FAY~(p2wVpנ8rS/|AYGyO=|qU$͌7M*'?iÂ./#21yu.('"i-6[ *,WHi ?iIgљJ!T \fjܭY,Agĩ^WhCuՋatd/A:nXmvM:~f6G1:u_$ ,˞*1yhƣ;<7&.4Вn`X0tί?r;޳m67>$x1Rg3\u̧߅;c3`ҁKHH8^v`xUY|K,Vڱ] 2&%HLD:b爈mmfr{=zw8M~)+HiqnރͺYǐ9])L'\<5XUo5/E̬Kwx6Z86h֓dW{[MwaA5Y5s?~~Otea@S.Biv k%HޭNGUb[sX]akVE^+蠺85`^ۊŵK7BْO#>I)q_;^=򰣉vD/BhFB輶2e –%TVфg޼L!wB҉j.+m諣`zsr U-sr jNp7 ͓u7 J*]HQ:ӯ?}bNCgϪSÕGUͽ[03ldc2scZ2W7oAn *~51i}( BWC-_&OPXL)`6QJt9v"U%L$R~^{8J%ʧ5aqeP/Q 8koGYv Z]IA1dmcTgͰ@O OP1vc`BLPȉ/L hlR1(yɳy4x^!kdG6OL`#]^e8 ނ5m1=!jFA7) ;}" XY9-xhڨopzH/tF38NI _ -ye^:*_.ܒ$?Д\XZyYX1~ =у"4n1ļ/՚Y:=zZ1aY*D(=bVp+t;\ohnE`}A$eB&j4!U/(S& @${M7WΤnړԁEU+?R #KwUor^ye$Prl%Խ)t:0*7s++Im-7kL|(E/ElV_g/0O-N AK[d(#X gELRߐ޶|cy bJ=*VUo!g2[qꖔ+NZ!{@@ǻbQߪloޛP_/oiK.M.4R:D1L9Rh^/=w?qޛ !klvڶ4@ ,[ih>BOxôֶ@R_E5=<^L2BC>ur5pMs<%<}*}oR%/RRv`Z_N#(7p(F;D9_ڊZp;+Lzd!1?J,XsHՃqHFT,;~4ܘ/n0%Y# =ȳ .Sj & p'B5̈́=33jrU/R9j~U"e~{@-_ND--a+:,OjXcx"D+K/;x/ՖKݡf(KZAu> AvfbU6A}GqJj. j\X^ƼG?㢙MqoWoj]G@>)0Bs*JmHbٻF> `A%mqŒ` 6jTSk^" I-!U}3) 09^k8)f3ms79žKz$ܐS|r"4_Tu$vQ',D}Ca Ή<ʷB&Ǿw&t>­"t yvyb"3{_>Ly^9;6]/Gvʕբ|o(*Kz^R1DB, vn`(~`Q'([}Ǥ?a ď܈!~ (^tdV%tSbx{r8T7ۉmߩK=4F x*Z,1ɖ˝/׏E;4\Xs>~yɾƄh ԖDP-OȀݤ-4U6:x 鸏x9^K䩪9 2*:aORxB$:miN'"Ӳ@f2wV!pIc6v4 S=>D/޵׮+ Zr~-?o@5bT|hgj/NHd-&o#P +aSip1۾|m9B v/q5}ܼ&$C4GCCYM&uقÊNs g E&}v䭾*_$r%Q&Ě$ ]!#t9Rgzϐ&8Ձ`n`J*uT9ߘ8-W$mK8h_#)yl"4YTIiwn3ى@)k7ktHE\_֘UQfD0 9uvd$+E<% 1e8 eQx6iݽd%(YHr4a'l"WMF2q*E< Gv;.ɛjTp5ʐ<}vr/ M PY-ЎZ-N`k̖wu@sf6Cq)UߧH;ܵ<;KsD**~BP-x?l'UQ8p4="wyGz^SPrBBR F_jx6>mTzfˆ%ԩrEs U$o9p,!gdcjLMw!-{wTEڰn#-q_JMHlÎRfv~.&Ǭ~j$͠Bo ĉtV3Qk@6KkU.1\ ˘k!TȍCD7܈vm#;c/7i?TΊ>8:rJXpL]LySR\a( tKLl7ϝp[|e fЏ]#^!32Br3{e!(QȘX燌*$ ZqKQ#}z1 \m*9CS>D%QIX? R@^+2 FL'w0Ѓ\A\|e1Ѹ_Fq޳h%`[uq'G k:m+Zj,-H ϭA63Ԫ\ʯ ^-Y~9b@!Z:(ToAͿinrP18-`0( D G<张v9?%e\8..|?ݯAˋ"w4FmyMO+BIe~lAڒ%W?~>vjɴ{b`9Q!#"&n<}DEr0Vp|cBy0ߴ̮{k<">烶EV7Z;,-\<}8[ph2kEmnz4-q Ĕaa-*jmuEI#9߷LwG2/D.Vs}+53qY1&UAD1 n`z yꛨ%lEEЪ=SZaB4͎"ShkL=]Xukiqd Q?(R9FtyӭH]Tg 絟*w{64A \Me`AdD\mylc#UAa|*n(,HG/KGP ]bZ25K/8Ht2 >?3jR%o4lJ},\{MBb9>pth]7,'fZʅvI-+}2 פaj[lk{ '(~}Iv͗g дd&rE7Q7.Y5◑=Ifnol)zB?-0T^N@罶ܐnN[3:\ȓ5zi vr-ޖ OdIFRi[pTɵ5U$ÏqF4Ph|(nڃ^(3YפfeSI'++ɾήS h. j'0Hs>گY߻Pa[#\־"ݽp ¿ d &Y_#C{qD"@}ѿE 4,:׏ƬM%`KC/]7R uVau O&Fc,bU `()]'k (-}? rm? mN>>@0 tP[A"V;zuM9" [PgsN+9k%F\mP|A!"\fWv5$-go2b0 Q~Ipᐰ5\RdqZ|ᖀ0 q`X;C(KPr 7"zcHK_pշt\'[?Ɠ@ō!$d}l-2c,qF8ٝ~M@͝' vC>gAh+LV ̩?sZ3rGNv΅C=Qvc!$" I?o]n{g%*Tݵa"Ihɳ *{nA6߿ 5Gc%?l`dt=L&gdaJˬO? 8* h-gh&fF)FZWm*jXÑ)cq͚Zj9LɪV(ļ ӤpFo@Vjz=d|6g Z4:q7RZ#& . T}ֻ_lP_<*4IC5*mw(r,QThk2"T?Vk3o0il5 *h:*+R`BdT١ٽO h!O\x:۴+CO/ݵN6AoHS+_/I׶aT49tw${MjKB\W//K8R [qOk#>>'o&,6h~JݩnD[/ O_pBV XDx殭"XɛC/сla^V_#|AV.af|LmXOk.n*JƑk jL !1VLMNXኅ 57.Njy6;#ANqm/9T.]i/ϴ8T?"%sO/fӣWBvq81ܣ]6CIr M9 Q,&J1~J^9_UFx :=]Bx5 r쾕 ({X$IֳpɃ:կڝqSQ9sue*^ J3T_`W_;(@UV zե%iYR#;s܏`[{f,'sU1/% gP2tTDhܟ M@m*8æ3 5,|L67sn+yg 3*~~d5QlRzI+~?D8Qa#-^dwG3h> /9زm!C+#<Bnȧì^c; f\`L"DG3+'j \Χi(bYlv,Ƌ@n4IHM=1Z-HNayq^>饪"B`?_arH1ؐ"b] D qp-1j#-a&1uU8v= /uٹh䚹 +eփ|zW˄y@/֭E Z ,7:޵r0f~*:3<}.h/٦@qőP{2|TV$,;j/,l+l3Gt]/sm kC" pt?GFf0$ muJмzҭJj0bƊ\Y q2wg9@ƿxBeCw=T;I+p I  YX5p`v/L@0Wm"zB.;Wxu)TT{G}c~ 8%)ɓ,KY]k̴q86}i ǁSS)%\?wIFnuzcX.S׮#9>I1p$wWe6[_e̼.$23M}L$SӮ"6b >ɦYw7H᥎|QdNS.r`Jw\Eix !۲ZfA).L3DaPc:)Q km+.ʮ阉&gZb.~3=^Di Zʄ"0tro++S}wc cWlvܻϤV/e‰ A=Kn7+@!!RB'Fm:!CB=lZZƒt0:f @c,90-];~<*& H? UI'OSv Aff`2U*jߨ]Fx(F#'F8 A; 0S3ȱ@'7?s|&TN\RfU mȯ+,,UT []a,Dv棺<ƈ3M(UfC߸Jl IkѨX]Rap|Պ-۠3y;rC\:@W͔lpWNM#M#[_K#+F%i{/&كEUAB>T^yv4eyBO~&Mr:EI[Q-3Y,ؾo /pN nh ?늺T?oj9}!j,Q29k^'vsQ^[Ӌ.dJzoUı>Z l:΀eT=~ny.xL\6 (.y??='A욾. â43S]Cxۙ.{{)ow*}eSG=vkd/Ʈ{ӔD}zԿ(šW{[\q*?Ň4a6+B>SLJizpQ< T9)vr-# $MZH%;zaa%yj?+]4(.&<岯 (~Dq>Hduij|%T+QGvLew[mQ:uy][]@aŰ n i(% .3( -1ZGm.+XP3mKg?zR-z"V|_f\v*Bf69 ;{k覊1v+p',m4ߺ`M f)o0^0A' zU-岙{IӮb(ԅ\mR9Tz({\eޯ>W3XsV~g*[EʈzP}ũNH>*x4̚\2tuRX:\-b5 %׼"Оze}q6g3nEDqIM {yPB=lF2Ƒ_~GICVn8Y[;"zDdoaAq˭$g~`=fZ"HH;4k4cL t8LfYc@G/t;w&ib).gUXJ1!~2Q`^y EZd=뭵cQmj(,W 3w}QpTmLY۟2e-05t,bm+{S(RA9t^1&Ng.`Gcη7Mӽ,j"g46}?ɸx~_CPtNK݌H뱄K]mXn7{2NniУHUc%ry0(?=XR5nN9 _$LxqS횒A-I84K6N[r^X!9Q|赚ʃR3@ ȇT2Va'(+?Lu.r7/(CPԏ=o_[]dOS3>o mA KR#9TPf7]-^TMߙ_*v;u.Z03E MƧ4}ڧ)~>v<ؗF3]AZ*m\6L1]]⮾tT7a"x4劌73b.d7ΏU/͵tؘl 8W'OVDgdнV9@B^C!yt):Vc-®&~d˺IzP\v14(D8`=u2Yi0ѫ2jX#=̄q Aq%yE9@\6餋犅̠Tȫ{_dЌPm bft2-Ma!SKH76 Ĭ-4,TK& 2Z_΋ CDL??M!7;o\o0Ldd Ny f )M8_2[Ȼ짐 34L1o! Pg{GD4L2>Ol1Oр?dTiGk2%SLX7P-hchB=F:bƓCeh8|cPwQD7 WC^޻x@`TQt}ЄKY!;jrKod0R.`4|JK5Oeikm{,;BU, Yl j|i h:xln8O3_Q Uʋv "^>O :7]=]S\5繍נp`,;vy[TZbU'Ӑ,+#1&6;- VTv^4HaQB1jzF˩rD { bM+TO|?AݗpZLJE* G&6t4UnbfjtYOuQ6ٹp';\2ikm(C?7d`T&  Nf9e{>X4xpxt-VHH`Il8  QJf'vc9YdpUE@YGa/,m:W% (5O|rkxb6E1OdЬa(Lǣ4Rʛ<͞s1c;Z$3i[Aޢ 7*΁Mς?k'0:_m"0@ڧM]N(̣Jџ[\7T|:C|n+uFgC"6swW0.ϹrR  q wBd;b­*~+D7*Z/C,'^' +[xaQn;|*S(3 dWVZB+ T2M=g"uت1NXVkƩN/ź\1HYҦB0mAcTzM D|n KH!E_<_"!RTe3xbtݸ V=x.)A6Ow(Û?/<&$ d/Ȯ[Y;oqy`K 1&=`NS {MC~1KF*^!\P^AkA ၴ,7{vRN*WݾVVUœ+ }npj1ts>3|v_6Ft-9V\{R#z7Rs5?@sTUI;7&WPs*E$7syvs0o}<gHmI3G%ʼB t5|;#)*!{ﮛSnSXz < K\~_h*2xdd`2.ل*WGw :" :ϏJBb`?{šuvZqS&\`ӻkfXbK,Xrׁ-RY~Z}-hGd*S4^;7ap|Cۓf.d;dkjkE}`a:ၮ I3PCmeU*Ovj_ ~;u0)cnKr9wxWOx(<~}a րRE贆.{T b1s%OR#J7~0{5m?">O# U|0R#8krw+z qfPR!i6-B!n|)׻zyG)km3 {뼞qra^8h⹿@nKWopUEU'Pj2:vB {U{XfYqs&Uĩf{v(/cMݒt w*MQۻbܶYC4ϔ6@L윰)DئPÔUYcͅmg~ȧxsygBȔ. Q̵<n0j{Y0a?:ƕ'J9 .KTxuOq[tؐYգ'G2aHKl"${yzF_۸]~DdsWOJn+g EA7{yU#, >+'&Յp¹}oUlMhwU}C*svR8>MY6ζpo8g6qx 6feһLmz'\_z1$XB,<`N?⸣1:VO:M;ʼnǼ~=ɗ[<6əoF%Sc>€V砄g/0"lwx> {BwCkԣ>S$Vh0)[r 6)Io;'wz6%` P}V`mֹZuMj򚺺/U%ôFWF=>?e}P3In9ZG s.]1)M\я%>+TEw/gF%cDTL Dj>_SqW!%-thsN`|FĿr{ Tg|U!`5=mQΚko;^D3V'^70<W^GfFVGڑp5Gs$R:1*t%ʐVu.qC|%+E|qLU :d,O[Kof̣=CP,!#FXqxz\<3B/͉3vqRٶ-D@w0TR miBRW0x6/#YX! %yrR/-ִh`T-DB",G6V~{­0ݺŵ^%(,}W;~W*GjY [4Q&MSHB d)m4_>Vgs` ):q|x詮D[L~ ê}A==|kelХߎ/fؼ;hm'D?R.hP/ZJ-+ C1.jad/S͡V)pQ\V&@@c2$ᚠVc\7^غMjd]ڱV(,Ukug# X1f?w}F3N)7J2Q0$ VV7͝C1V'P@KzEE˅8rUBʁ %w _QHw/Y!<_ܡڑ//.)ZxX]}ئ7c 9?'hD/] lV[R\EQ3 ǁ>υ<¾ݤ.a%,nf K1䮏Bu=u*:>$w8.,gؓ2.D^a?ˎx^8&GÝ[~871hHv@"\6A=r|UIp/^k)y8S- Ȝo{$C>]l }i3NYJށ|01b:Ɲ=?{捴8_W>$.leGqlE-]_(+#ĐFC mpa[Y~I2F;8)tKތ9c 4:_ ZfY9:?g\" ^8<7YJf*l|ZyGaS/dZU_4^G3? GҦI-֐:E~<,]ZUnM}I*e2E0fg[MuosS40b (Ѝ,iÈ0-C&ԝ(@ q` FU\jtNMĦrcQ]2 z0S:/߆0UXiB<7(Z=vĎYmP R( V=` GQDv.Kfq=A0?ׅVVO1Τ5E9u5.2tu\3LpM1c+˩:'o4l=.@d5`]ZZc7dmԷ7nbJi,+{ٵLq+~ϫkZYߴ6KN-ʞW~ɆC~ j2Ɉi)E! wԍ CiVȺ?sr_uw$n3L;@VE `r~jIn|w: ` iK{%Jø0E}1:5^{bTUv:C}VRYJlÿ́sJQ OEjz{Zx"lj58PE93vZhi:l=B2ceO2P0%M^nRc!&np]h\Evg uw/F##C[eE$dPVRJ4UD &KTt3˲IRj!u踯 = d?i@bDB'8?*UͰNPvYX8jMb.P܆&wJL), LKϙ݅Py5yQEr׆ijر) CT)nױzY۵754f?lDB7z4)龻BpF<쵻[r Fr j# C75&U |=z4 )NKCM/c<~Q8eZS`[8 BWj`hfK^ďz¡a DLou JPA-UJ`+aEȵKln@3ָ,kH` [Ԡf"AoeytExxFz_G{xQr?/b1lloJwf ihkYiCOG̾˭pn#6Q! Z/~j,ĶB`WwzM>k̰@EdpV崙Xk*Zw6DH0Cw A^ zd$/_9SL]9!ifP(/Ɖ\(ƺbf@qO6TzVXX:ÊPNPm }(ʢQ,aIX^P9 ٢63n$Pwz>#B$nd3*]|rB64ъ(A=i>`DzvWc<,A̩cɰײwOigKp70P}6% ,k_c`ڽwֈxc4mmiH(VPL ^8gmy]J5tr qi$}2ućzZ csϭZ^XԦ;Tat|Ddx/5cA#zw5 #ɮstytsvmLf5}|xűfǹ.\$ 7א: )"uugxpfb(:kN/IXhL5Gf1-z9Y Vs mpCUOlzg{Q9SN8;u|Y/*@όgJ!3v-#c Eʖi:e%X9dm?%#(18xtWm&)ڿSq{Ue{ZF冰Lz`߉mw½"[T>{! /MZ[.$roS5I\dH>'î/c{NUt?%8&!ݼޓrMcܼY(h@:|ߐ's韉ZT-xCޟ)eqozBi.cynu:c1Wn_  ; hûmD,T[:S$;VK2J01Aewt6|MASHHn[eLh~;6LpDO60%'@ <`G/eIg^%NdmF=.Hw,yQ8+q/;4P)ABt„]ڪhhADh][`b-Vϳ^ݏLdԹHP )P k^r{_FQ"nyStĞ_` FhnWAD31S XGQwn#]R5hqTmB(ڑv|Q@9͋D9\:yV[-,K .2ӁaȱUPOU$8|aæ񮔉*/P:!nI0CxY3J!^m(7Q׀ N&= #LX"%qUi MctiR{'NuQ&ŽyV)§xge/nnwMI``r+"l 7nKiJS#Q:Ej,.}ѧ*5HL 2{jMgsirHvaq[y!nnkslLtV6494ZZىFKR+rĥf.e:R|>K^h^>ѫ=9pv#5ԟq=Kg}%HWbb)'*!r W1+Ja]Sa"ȼ!C ~ 7+a p;xݴ#/#]^Ax݇We*J!OG;B @scħs6><| uig%/d܊{1kݡ ( a#K^ҜF%jx(lG+CH#ɑ%7.νw&~w+ )w"Ww:'5cc c'_G&5$E # $q;5=ψ?g;r{eLɹv_r vD,g Kxyq[+T`~EF?8=jq.ofh@wKx 7UI-12-} !CiSъW3Q"_"Z:D#~zܔ:FfO(ՏHI>ǽ0ĭmd42T)` Uv,hSZF``]8MQҟ V,reopl`}ėYs,5L*c6! huW\ ?'N'?LVXRW tQ4n8enϡaf8AcP AY5<0ON6c >]Y8 4Ԡ8B Um,0fP1 aYi;:A_2 ٮFӕXmZ6iR؅p?AO_2ŜLflڀëbI>AE,S̏0)юs'ZDaz肹ygͽ!dr*Z<ݥ !Ջ`qWnZ B5\|l5$9)2\ 6d9J?$i^(:UnPđ;l-L92  =&=aOeDa\6R} N"but4VPI\w'"DV6ԽOaWY*sb"jVP}$dQ3$Qa-EÆf#J9<}T4|e ?gxkN. rqʩKa2K?JЯv*1hS.:^wAܑ"[T¦Xː#dUyȏn9^sA#lk,Q\iRb7^/h36ƴX}6Cci{(0"^ɄfɊ`f"4/!F԰D1#fO;-^yF5k)ūfW;s a%+P#@$yݤ=Qs:jU `B8vݭ U;(U0%1ɀA2D74Rx ZA"#'HA kByeYV 41-TIG -s<q'狼ygWjA9+xZ fW2kHJ砙{\Bb\qHOδS%aݗ[!fD-"93=s(Zy % "Nn$DI}FOi'opGf;~MUDte5&(p_+aY]%v$Z0yވ%>BR2TpeS0j'g2 o\4-sX^MR[D̬yÓs\8gFҔo_u=S}c FfI6wZiXLMz)>Y9K&{NO"sݹۮ уJ0+`p/P<"@u֝7Ǜb[ dۦ-F1חMh/85HWbPc#c&MuM)6 LũC\iH)Hq+֧YcUT1M5>; vh/5i1 b{KE<\c{>zWcQ<}  dp&9Pig=ܭ-EN=ìJS:|!X:pǨ^suڏ^bu}Ѹ1̫6Bv-!2I:Fz?){@)ƋDZ[C7Ues`̣b[z `s6nfr/y9R,&%3=phdyA%uufOG<"[\?5/U ?$ =]?zĉQHh:#+Un!+VcMO| L)[*&i){C CCy$oYqGQ0L2\j$#"m1ј9A bw"`pe!h=par;95O3E<ʟOrQSo  sH}f6Og'JDL>%}DkG}fM?SfD. /"K=bP,%.V;+.8Zoz!']=KDԣR(' }\|^~Z9ut*p\'=<,*{x{ I(#!QfZ -=qxs͡ѡG,? gkĆŷKRGAXok.5|QlV.1ݿAd lΩ#;Ja E&:@شu G0䧖ek]챲;f&t#6B TIAiu)`Ŗ\]*hVYOB\W8<· EĄ8&:^b0u8ָJƀO80MtyuMg}& 8#Ǿ+X+ XIѽHBȀkx x!YJu Ѝލ˚!sFmp>L88%nW Dғ,@XULQbͪ4->)OY1gm?4Ԏd]\[A{ +bd0(m_~EgibK%9Ag@i[RS1hTJYHnx4O]ߚ,mpI_Dc=M˟8Q/&#N5H߿QsT6UWYV<;Sb]UEOL,g(ȋ8 ~)(Hmնp&)e5 jH޹dV%$sciDm@R2Vl˾>ܠ˙"GaƞeZBmIiPc7aΥ7b?Vi ARb$cQr6њi䥑q Θ;0u%x&`[01> p r[YyK?Xj178ߑ泦BߖzLwAL5jf5"mC:!)> 6!FJ'q@M¦Ϙo$Y$) v4#%eq"u08[H\OgeɐRe_}Oxf5M~Llu./)]Ek\h)Vo uOLOɔBTVvJ$'HOÕ:3Qm "m=7+.Q=S08ȓ{w˒幨q}.؞,o;F̾4eN&TՖ!ifv; _pN6@"dre 7->_+hnZz22WJB0_=l5)6j&3]+ m soEHb-R9}2lLt~ssR~RYy"h^io^QXLkȂv|nuNv|s%t"ijU=`3:< Jhn<1Z=8Adt!gbA#_Jpݰ8Eb[ADW ؀Y7MϪY:.1dRnm|YF ILK|׎V_JenJحIԏ/YPg &+&G܏ ><W0>śl?2Dkl1: }bbS\5BH5kH[VC}7`A@o%ї,0 ?P? ŘFPd؎K$em - mdX̬E5KqHmmq E?7ϋ}{} J{{NR?DWXDcSGZhV Z:18o/%#8{R1cR#n*:! ]q=ܣVRX kYpvkuwZF.-;cHx?v;ߥNAf^RjKC2Q7@d3e 3)?Dm"~+dqE8J8~*X/7KF ZqN7kUz8js@I_.gBQٟv&keo s BB9yGV\ŵ!$ִpyY_^CDh%oQ_'Wtr?Z*ttm;+՗rB"H/TB׏?ZGq0z&r5Ǧƽu'v,u i CXB>$unrXMu2J R:QH]ɖu+egNaF! `) (8erǫ)1 wY+ֶ(M}j+S9K6Wp&K-F>=eGfYZ=I9QllUC/u{h{f}O9/YAsb>LK63M-)7AQ5`>֙N]}(:"rW0O J\:n9o kud OhbpI8B_jo"~P@'t[D*܉}U" l5Ԍ68¿4j :p{{ Sƌ3@+ Iո~]L,~ v\ GU[%o>Ow Q/_orDDO_/ GFGS@n:endstream endobj 25 0 obj<>endobj 26 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 600 333 333 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 556 556 556 556 260 556 333 737 370 556 584 584 737 333 606 584 351 351 333 556 537 278 333 351 365 556 869 869 869 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 666 666 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 584 611 556 556 556 556 500 555 500]endobj 27 0 obj<>stream xc|e]/[b۶ݱb۶mttlv:V8y}|:wFHQN(ngLD Z- M_46822G34&...823R: Sy'뤓-k :> ́S k @DAQSJ^@)!  .FY c `j"ٚXBNC=h`tprZ,f_9pX[+_J$lx_휜-_VEOgsCl;Y|v_&v.K?jΆNg`X8[z|Rfh/7\,lZ#K?89[{ݿ g')=Mc/fp 􉔭?&.s:+A ՗&v)WOwU#){{d)yw.6_ __?r6&B@)gï5F&,-܁&SC믱]hma ax*V_` hkoTg?_VYˡP.g{Yaa;w kY\\>;R9+gh _!kojlLzegC[//Ί PJ/[._/,J s@w1ܟe> L~mm adǥSlFǭXg[?7C\844[ڱBt DC҃ĝoު`w4FS+O?>7<4-.A4 m"Qm-y6(lβ|$6nwE^a.%9mWeX|Uj~bhvPBL/gu%>Meà exMy^f 0!>ZW*`سq3%a xJ?H]0(3.Q$6͋ZKc:c9'ITՉ~ DoyhaW1W u\JG]{P,H~13:gz\OJh6R|W0i,kyE,(7np0="Nxsz?=GޞZܳ~u=2j~$q$XiQKn-_W٭' OxE+-(+¡T8 [=$vvwXK4/x1ڋCo-gp`}_F0h{|K(&E ~d)RHN##i;#ȫ)^0-BlۧgIA"ag{םTـ0m+[FAm)y"Yj9`?:^w;C+MA_WBsRxn oI0V ͹PFy ]FS*^%Z1L:1L~DĞ|%9IJq Or)ioOv|&j-f.@!nhf虿̣ۀeYB8Jxwx|Tb«ӕ:v?]3w_cܹl&dA\RXiF(VH0`?T3q)ڏ;gY|Iyv/:ǹw,6rWx>%BNjOǠ7Oa7U̲la e/\GLuw /$g[`C;YAϪ2v4ex bMSKDoT+8.`9'l@%ZH-ܯ2L7j7lZr(kʦx{b^` 0,:MPi/T9K%Yg;E8(SiQ2Z@Vfv5FQǪR'R[Ƿaeq,_fRC}hYgKѷs{⥛,`lqR)aB^VƝ=ZQO3hI#kH`kD3;?Syvy L'8 ENhK"z'Ēf{O!Dw01 Uk̺1ۛnJT',w s CH;4fptX6aIH;.7% Ӈ4߀W{k/ONn\?r'M>N01=~DŧUm $t]ūe'.hfqxCuylt$T";$h|sZC"wSS"R<pߴ(^گq72!d{n936tqK:M&7la8hkǁX*1r-{j(Sa:8#\;By\$EyXEsT[úHQD<XLq !:&D/F*@)|!˾Πltz Otq\po p6o'B}_KPc"8(Z)'&?O eO֛s~JPKgmIp/f2G]fTU2mUrۅ$տ P>7lٱkTVM';S5 2c@/#q0.O=1X6Dfۘz\aS_E _|>a{-" * eUgB:H4y8r.vgҼq7o.k 8/C)NGS1|rX#|̦]&. $gnߩsxc qyeL*#j{Wp|DFw M1}\.å%U]?4sIЖ4 m>TգY7è$3/ֹ:;_|U՜$}-6!NnodU4JE+,5U\Jtjz+囯'O.^< _G0RAg(q[EG\ˬ"1[^jc)TF̭,NN}X(7vt,dE`a,}n_iiICfuln1ұ(h(Ρ5șv, aMr[QmePѳL)M⊿$` UuaA.jb9-ѭ4LS0 ܢfBnk|c&RAr9om*SL4(%+aory,>[[ln)Ӥ/`kRh7M@jnMUzskn]75 z/` Sh"A@4B7tAV4Y-ԡTp*-T㖪Ls#ʡ }z]7zʷ"N ҕXH%81M[VÛ~W0AlpGJ5,GNo`{XCLa,TRƴPݱd=|-`xo o ]j[ӵ(%+ IT/,)'[F{){.qѾjD؄ԌcMl{<BU i1֍u) 4h sA/8tL 9:۸yE1Y;K;POvF % 1I9 ?;^ Hx2 F]xRZd+'&c8Kފ)"cT@JADm/IirY P:*əF9-9z )8uL>gP?gj^3dke[6vjIݰҴV& CMNwl߽aDkT,&>uawf}ҔQdU%*HH C ؞N-zb/pe蹱S] ʣ%!d{U8j&jD笤#t'G| \?6-pTL8˟usL%%I& ,]O^ͱ%:ռu7An˫ݩusLBPhXUY9vqtڪ33JI-A!u'0!@5Ja UaR *N#-rCZ;l;o ,Wjzٗ)KiL\ cz";5ฺU;֎# BZd(9dAtK'h8cTG^F?XC RsO |b{dXۈJsM/7TA6 O]g픕 #ѵ32v(Ec)OEYŸ"Gm}3eϑt)i/Sq y<F+ܔvw7)L%miƇɻRB3LG (O:HX[mBޝ(vu 1_R]ZcˡM])AA%T {6.ONԽxO'r@W p:?IFRg9Gֱ vDr >nPcHv#|JaPk EaAA6oyV=lnUN3'-.mL 얽Vj":M&g.u*F6wIK[)h1" CVHG &pԟȺDB$\3A}ZbYg|Fm%ۀ͋8YU|F#}$Q9t0 Yhqu.-m/$1DwN_ŲԦG+YH;JL0)ВNX?H/OHQU|w,|Ñ=Sf`x}͏&n oܮ|TI|*isv+7UB-eK܉7 )G &^T- a-2aDhl(C@iZƜnƇ:NY/R뗑y6Ԣ*û?4&la= s(,﬍R3Ƒ|2H=˴l3+{ $/.h- X;.*uchĈTQg6ѬGo`ȇFO@V9Йw8(zy1eZN:|ZObSpJrȴ6IVQ 룤E|j!A#N4HQ5ןbA2J~KblqPMUo8_uTOc !ugnPDRЎزvZm׺X_aѱOd*MR=Sh*ܑd눳D-5bH_aDbo3jFYTa/L= ^Z݁-t'Xsr R뮅D~)(u8ů!wzT Ez**R ,*&v7kz D$"T9t c ٤eNۚiȞHg ZiᢼT6؈_LYߛڡ]%H_ rN]&qϛF=23k+›JZ+V-Iwh(ҁرya)2ZEEfV[ЇPkk\5S4j.P'Sn9Ck 3}%BE]gs|X>JQӀr=76ӌ(.HTÌy-{+m)^9utӪ= 4N |/4(5/lZ2l(L^ZغDFtcN>o`Zh[`kg-j9QZY֏a1n(Ǫ]&=#ykϯ'E#|΁}~)nwj'#Kԥ|~fYIq *y,H]k4An$i4os̡γպ P ѷ2 Ⱦ/^30z?4?i-X}/t R~AC'㣫$*ō v_ohwDgPQd.!X0f7w=9H3 ĹKNU}=7)U m#)=[=jq_$c]T QgqfN@-& Tt@EvS . %UCg uww۞x h.SoC3=9N3gCQ{'qt`H]KX'M pmb},Ě6ӨPڊ99IL?(bRL%')m(4[$cmWbEơ2@ޫ`+=πI>$F꼨Y̻3  O^t.BE2o=n.F6*CsV1#(HDLIԁ{{&JE@`*fkTjoUqsv&Y&tb{u*bܙL^slC-u^zЩqW1ib+g= JRr%/'#Z$gEKjAaGR2 ٚj܆DR5=Ihؔ9ߡh1ǃ8BEdP3={}g)$I/ M$Md!p#G*(gj(X,?F8&ql}E$rfņup2:.䮭W-ɿLJgVuEr*65_AqƩc!*?JCh5Mm @'}$],$v weSzWlbrsZg*jzYڽ ԄoQDqzYlJEýI#wNdN ˯[P"@1,?6b8FgOȣ!DVO4Ρ*t$ &^ :mĎ*1n?ZBGnM0IXNѯ—J*! {@F? &• _xV{^":j$1-,B3Aj_O Nńmyhag'Qz5\Bo8֤&,[6OVN1uAwl?X:9t#{> `O-zsnu9Af@یLDD^I\ Y=3̪ wr5e1Aw\\/a#1Nf܂{.f5kTہ n s)RGX*ioG YW9l=Eݧ؎02¼[Xǯf'"8vgpEYkҶf$ ʃt@vKI8);7#oh0 GM=QScp2r"g\*l-Lw'TĐmYؤowmE0qV#/)cC\CHmmf-?G'֓L@x)i~L('yXc 9!zo)o K141VXp^"? ˯do(iW!_FF+ Wtts~3 n6n -%/hbDD]J-쇅kiWR^Ҍ&.[r˜&:\/Fّ-p}{LցTDS[;xm ^Ӈnh zABh (CVvrc& n#O}&wXfg]xGNYy*V4p$D|POq)hg2!#b7Ȉ{I_2_b$ڲ3 hHP9X@ۢ a7Co+Q3=bff1%E=D?JܦK[UՔLw&"h +P1Kښuc %mV:@]8'4_@)yo,Slx1t\A% y$Fښ 6|~)mp䓒 Z- SK\}kɦ{{gsIq߼(%z=T|qҳ쉌[.P|?m:HIsh>w7,W ٩e4F"^0!!m-X܍.^y/thJwNvkR>b]6*(XwvOb6x$ sۊg[`!t3lH`1Ѝ@ʗ<"vci ky6m '4mɾ6/1{ڶ*"̊e&B/ eu;D=yQrkƁ=!rѸh ޒf3N@H8DfSQlR"r, yPeC]ڭ\ݔ]4\hh3;M?cIZik8Q̏5.!%)R# 6$M8>)`yn1xuŇ`B|G]Q aCvu(XD原dw"jǡ_h34(LGзb]j_C֩\X#\,I<'zeFppJ"+b;xG& MPՒ~M$:.O_߂h(]Qg`AU076fWQJnYj~|Aiy}n*a2d>R硖|=v)Y\ٽҋY&HWA7 r K7T1Y0yP2 c.;^휏ޗ,Ӕ(&ĕҙ EdgvLxiB9j]APTRO.9)pٴQZ+  =w}c w0gĸ/xbkԛL`W+bU. ksk{B^2is *(Hp#G`k,S]L̘ml,Af"-C|42EbPuBM\ґ}T8q}1Bi"&_PG/-v5+ɚZ6:^e6E϶klt32Q3qS^ 1ZA!k"ژu$Ys}.OaAXD)R $@ۿX1WmPsw㘤Wa Vu Ϊ2Nz5Yɗ{Mp.ɴoѾOXٶ@\/[z_-NhpoIs[LQY"Fӊs[ _CܒHZ2gR af3vDOnEv -iEQr3sZu2A,mr43e#Uz39h}# u2 Lpڄs@`^apl)!I* ?g1HL I{@C5@c%k"{FHQJĦ&. !L{X\a>1eE[z:\kCjT.l6SVI M m05YRqp8p#8ߦs}=q.M6cATa+E*bu2ˋcҁ.>|GdCÑK4:" E1:d:'چ!i>Xp zղv+2lzSMFoɋF@AZ"eذrI$|K4-Ћ%&T ¥U鄑W=$0m~ \m$;)akܠ<\' _9f jŎDQ>9>`5JD# |Q=xb$Aqmf qCG}F&[IcڜCAGNW Io7KP=գn|,v}{?YyjIQ\(2%'Z,,\6:݇xOeۦ!aVYƔ'˗øf!uJzİfBtn2tvx^n#kx.4(1#0&B( bBvFT(]"sDҺA$QNC}g]eCL܏tk>lGŎ} j,7_\|{q4LW_A!IKMIXk@-,u^ diBԊ3h0 #*\o7CL4yT';YhEYvJנ}.H])p#HG#A1PkIG9E9m6oʮy͊\?n8=_O̎7~œ Ju!N!֨ e7Jxʹ9V)eڬVIXMqjAna3,FS-CyQ c*YGR@7LE}wARNHb+mS^q{Ej6{,/ؾbźnxm]ZQn%?f=vtİB*zF4luN''}v4hf9Fۯ:ouFN84Ζ `91TM듼 }qvlTm1Qs֮$Q`6.SfBUꎟenC%6v{Ϫu}[(Dՠo4#5bnO-Z'V[2{Nڟ>Lw6Ը)_|")KSZ.|ɿ-!00TB*n8~[ $;,8 "'kN.Nsyd[b]9Ew0o,i^3 #P&:ˆ7CLcQ. %t٭Km'u"IHztq#|.[n5HûHaABp&>Bei/* BCd|>ӘLg'!A/*{ *7.ܚ6絀 X zatc{*A:ο RlꋫZc3]WQ$f˹#fL 5|Oݹbb6 d߉BjM M1o|+TӞ{M JĂN#xIcy|tz'+[~7;.X"(ASU`% hNLXɨf \*!gM QԀT{:!gKЙ'/osNS e>&7c)]^_!t~thjZnBsT?}K}qgŊSx7׃6( HR0E9:tEGST OE Y>.:T<ĒȧnqF>.M<3t6X#̞U?< cN$vd-j@%(Gw׋B" 7[g{|sM_vF` \7H.-_7J+rwn#<#';WMMAMgc=;ڣ8wUlnFhɥUÉ467~|Zd>\6 N$UGuSg+ރ#*sm+Zk}8ⱽMڕ =KiBF/RM˩ߙ;x>7D=,qt1(ѧݝush}57X LDUv`,x:UJIyf-&J}#NP?wU{ra@ZJ.!gJ184I:Y>tb(` TjuA95zyW> tC W$٘RgblY{-CO뤟UƑ7Nz%:Zަ@߂X2{w l3F7蠋wi!oxt^3kVцK1Jm6F)[ ~OagԼ鶚YVr1} ,'>՟`mBajǁeS!ΫBw+3*$7kd*5^aXs"vBDs,[M󶳘4e~@_B:q}Tp|GhМ$mH7oG꜎(OaGX-=}M^\ +hbu{N垃V1(љqzWB&xrneb4QNU6 {ϻ&BspJj\ 7Š^͚)tzVsC?^ q9cV ɞxQ@rV׌ʴ}x##?9 ǁ@9^hJX9@6$Pf)>]M! iYU 8>M 6?+e?%+`:fKF\_pyK{9/h=iyBT\;6^F`BC"ϒWoOGxj,{CXf8ğVAB2B}[B=˗vDF>\-4ϯ n[|Q.-VM3# O9 g- Ѽm^u_%~ 8eR3;ġ2a_<,ߟȿK/e 3{ỡk3jaJoSJ y4/tHӿK?W ]=7\%ꐬ8>D[}pgCc"_4b+TA662<v]t)ޡP rW<eUX,ߋ.t{8CI,wKyO7h1Kk@oAm%;Cٰ/쎠 )^_!O`]wP(U@ ڳN]%Ãk.A)cٍ,@՜޿V`(bﲎVjTK|41kHFcs?m>ǼNN)r08HPcNWQ(YLG` bqM$AͿ7,@ϩ-~|1dv;ٝp3?'OCQS`Sbq=OPlCF9\nNi5W%Q#Պ +M]<&([g݈LPzZ7ouzxI pOV`ճVb 0i &=d&Ƀ7 G9 =M oګ5dvݒL-c-%S&dk\D\ӆWa|*p-Bíϛ¯K 4T{UM`e.)2n1ydV_n/&7d34|:瑮5͉$Y65⍪ZzĄkXxN쉥IMLTd`"d%s!**_g%.巁1mWP\@ŘRR8!2`٦O/5řV{ Lgl>ka1gbej^ExW|ьqq9aɶdf$ wkzss,>ole2](@n:!BG(JTZӏb3R48dB֛)k2XCqLf}1G0hI MǺl-q#W:i30r')h|\D׭LA8gSA)sےIG9_6B'tz4=,| ~."HY| sH-dH]E"DkJ?|QA0&ýToVpJgVh! X\W{':kC K9;m4aQHWo?ⲯs al:)vUILx74mtVGf1PeIAeW[ g +,KϤ+ JߙV#֗% f?!Ph8<ٴl<-Wlݑ<6ap= daVQ_[l?Amv~KƢXs[e#p a11N]RJTedgzkPwևwmA@㌚iY}/qbkd6ݹOn4,Hs$QDc _g]_hiP_К&%@BehE|`_D)gdoY(Ѣw&{c7#K+ kWAuӐ02g?C !.=yJ[Wb48ߓQHizS,ImϪ\i92x"Jo> Pz Cd, ,f8>õ|1m8)zp5{ :K0Tց=D3%i5c) zKKT'V*y37a&'F&W] #}VK2N] e#B?#2]BEd-ƈyHŷdX:֡}i#a-4w-W'kmY"j8ʭTnLꖉ+%#vnu 'K`1;O2Ϥ.R4 |jГ s<s%x^ՖꑀL 9c^؝ACn>x㬣ӹsub$5l鱤Ojuu S*kfE ^DY`+.26@}n:1Hf2d6ANn7\nc,(ZPaCod Pʯ|9L>U0ٶ"Η]{ǒ Gt?JL^oye^C{}Ae]n.SDGy ȭ1Tk Sta[|,g lɻbb9)H}/",߅O&?O"eR3.KS`{ T ̭17*nl',__W.xMCpCḆEjݳ@;>PWNUL<'&>lƣHOJXY@m'LUdxsdu Ft FQI;OoPSHaB{T0To ˵,]}xd{.f]Ď+Z 3c-DM;TdgF߱a|?yaW?Vz1x_*kEL"^H).jJnLos?L%-rɣ'?jWVI/tߚ؅[ Lc-H+#)#fcljۜ &aR=ԠWwH9u|S҇ڵ$نHzbPLg)޲=?{ok0m9vxqߤ/x>(u$u.Vnnecm82:TY]*mXnۋ ~&*i@AN^8+EM hhтg 1%!VD+u&Sײ%NN2շW͊2B>ʢyҩ<{h"dNJ9}՛ɩmK*[m{ő!Ki80Oxd;;UM/Ck<7&gqz[o220R=hv@|e+&xOkU:_h&[>`N_q׉#UԸ%t o$3y,>\q5 ,U:ڌs_~!u5!KPZW k3G`E ƥ8J@`7 Ԡ1 3@)/@xÀ 2pF6aunClT_4пMlT4o+4n@.0黁iݳ!h|bS瑑 B_z]ES ,ފsTM ėFpu&J`hf+ ٿ0`Tb5CuƌY"Gc؊grMݰ[=]χ'C,Et ~Ъ99/'D6wjB3]fHN\Ú&- ܠm^+%T)hI8?wɩiDEBC*h󸏵𛞢>:%&_Z#TyL@!U錷 @Mޠe҄)°&٘ysS(NоQ_>&NVd04󔇺*"-OPbsM!ȰDޮ<=7P!w{m&G^.u͙j, nQ]1&g mpn_1h%jK_Zv+ (E5+ŔlyKʐgܮZ%v9afoΜ+h7|gnrH4:vX)5s͗O$5UJZ]Pmws->()8 fV\Xls'%8z-<2ѧMԖ⫿nlbE:1~qR\lii-.{tƳMk[TA.+цzI5ޞ-_=Hq/ @ =zkf0XuLT"AەXO| fg"O^U?\jvȖ׹ I8)[%=]tǎ)H})I$㬸'?b'XE M'+9LauGX~4lMK;YZGjpѹ2f8Pl7/ufK `]̬vU#OZY=tIV'HK.hfzk.k=D ɼǖln |n +D՚:&]㕰dCg h13vZ{+ٷB@D6.NSPunCQHb58L5DT.YjNK,N$C!,i}c ,)PyC)^+Qm ۜ{eQm#$?9wTo7duT=e meBiLvm9Ni+ڱW |X]>`Oj0Z& /?L>;i3[lまYjVE~_DSj_ϗ~I!m~ψ)Zqxf $RK2M9Hmus`QSw,ɲ<4Lxd,/GfYI17C)a &lk /ފpLB֎?) j73poCɻ) ag䘾m.UYܮ]U~#sSF~t22ET!(F wTZ -,T w~vKtvJ=9S2u;y=lWy*L}CO)Ӛ" h6k@p@!+_?ih+3J$$9aLJ:zt0=7?UlMmP(J9"uT'Cj PLG:aBD} *5 :t.m3vَ]*Em FP]%|):?ħiC Ow-!#f5CYk3Ջ`yOv>WBQ*{|RC Z'I隥+ك6b2i+}*? hF^FCRcݒd3ܬu\77qP%ːņaK8ғXm m ~ Z_5vl\ 65B`xb3{u3 E_Hr/nRjнG! žLCQi3 @rXQ_`F7Rzҋ `:ō,'{b3GUa "Pk:zv%v(*X"iXK%C;lƷ(:܂,qӈGWk0;WsžOC*dzڔ!֔рg);ʼ6Ϛw=ci 4#"9+41P",o^ɱ.w:HlQIdGn<[7ͪkyܒ0?<Y&5[.ẹ*~]C~p&Nrs5eo{mN\<ll⼣w?rwSdm!! K;Y,B<e okK3;_+ioχ1OrTWuLÍ9a@X%H31+V @PDW;wP0&53%Ot-275EL4C~;s.,5b7@f  $Y)k֚RpGji|Z(n}Ă.Tb|Qzeo(G|fs6=S布XJG08%:iwL:čR]}~AiH^SG>UT;^GQ #kq!!b'‘hB3䃏ui%[2Q=waab?7M^ W,Bsxi}+ 7#ȑK">MIRY#tu&'fXAۓj-L+{b+;:9:~֕6G袺v~ӼTB/;ɮVIքycto#n _!LED%UC0MO/00٫VǸar.{co W3(8&]ثstq,܈c5 }g(`|bLHq;ĊY Dn(|œgF!ـz뮁ΩX K;mD?-Wc4ղ@%`D6݌ߣDKvFv^6v&xS]/-#l#N\WN *@Yg|Hȴ eO%,… ^>K81?pN-Wò {le#2Vk (1gxj {s (\C1aem~=җ;>}DO"2T[JO ޑ " >y .=h0ҹ*"5؀Ar_ḀD=eϪ-NADe;q4~!6QcyfeO{;OMw-=r؋+J嵄KE3}R0Р9K6k[y7E2NQN/iy7tًa<).^3X2zX0iΥhukWlNb~*LpRImGs- |ۘ>@jtf]&TۥNЊ-#u`s i(6zBhT B؁ P^YY|һNa*DlY)N9kX74!f V@`8$#"ťGFիv괜jcJ(b㠾)#b+;B-]ϖDƏ#L.zk߮RCR_Yȝ޵*4ǿ钛VXoz=gZZn$#B'ǀ۲\/'ff?7#̣BNB5PB"zM C\ ?yw Lilͧ[CLȮד7=~X$G|fw씏\Y3cV GPA'R= =1}DL8x?b2^$G (ZҤrH*mہ#)4F,+_*VD?ANCuVBES$ n$XAԫ;1J@ia΂|:b_R'V 1*s9[ʥ eZ([vr7?LTF׶v!7Ԍc^432Ȝu?5yD -f`ҤrT?Y1\n^QFXg )pՄER Bο( "8CGӚ:픑4-Zrs9xG |E?LsB3,HH.aп>roXl>b΢nڤ~8X尲+tM%|MPĆ< {e&˚Q(P8O+G(+IγlKwKy ".|. &_zj2дuЬ; fw1 ʢnY7ĂI;ӿ#ԇq>Rjh<-&VQ£$.vc=|X4t>iG܇ ߪ֘b2O5>>ZNE圷bMl<n7Q41ֶ3*'͇u-l_Q|d[!W}7vZ6|$$djQSVj8Kx O2U,|Uҍ f%0Cn 89^.eߦeU m<_ t-s5{XXlہoSMY)y%?edVwJf4)fo̙qWaB}BўcHND PI3Vi?>U6%'7îf}#|&4Lb Jhxԡ]3c>a٣C X'!wE"żonctOK,K>lc]?X+)L Q0P\"!Le+ɑ{ [uEqTk1ѱ?e?އ~^s!Fk N8&~V9n7P:|t;Q 44=aOnCޖe?ۏ1;2 oMf3ceqEf ABFi!Y꣐\XlѨ]~H|]x [۴6c ӝc[Oba1\=MH: ׃XxnQsE^&3*4+Տ-w&XsA~%)U(#,LG2@%o[3v AFnWV*AgXώ&9]ޢȈ'CQ5xhdz80t )f8>x+k|jrh"4bA H/l5nSX'] |캪N!Yl7**(hŅC`cm5$ڒ/X,@pk19iy~L$qP˟3~B}UtAQzCh>sq8Dq 8m.iҖ3.^y <$>]DI +*La-՗wXiȆ;{գ_txrϹ+YΈ/1svYv Rߩ(OAg$nTOj5̦wi^,A.5 G;KN?/D#_[y2B sϭ"6NWPm|J^ΒR$gS+4=2 [)Iv /*nEB&L$v5Z&>^Svu1-4&3NֹUcE@W/<.zdQi2\12mϒt 5eթU,(ՆzofYևI#iDImoSVӒj@MSdbbV} fPIs\'/>V0|q`(j»F'DW6`13-#MBȅ9jv_}W ^Oֈ?hnu+֡】βrRUKvT~.b~g_鱪;6ȍ^ pwstf76ukd ]6lTM +R5ϛSo @D_j{լMgz2.u#}WNXVM8=D#Kq}sjk_(S'\yGߴ 9y $ȗ, cO w8ኔܜLŔBBݯ:3[՚ƙ6]_;압b p- ^'V _bHӁ|A]J<`S.xG VRs8ygpV.Ơ_C< 'b}Y]endstream endobj 28 0 obj<>endobj 29 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 600 500 500 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 333 556 556 556 556 280 556 333 737 370 556 584 584 737 333 606 584 351 351 333 611 556 278 333 351 365 556 869 869 869 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 584 611 611 611 611 611 556 611 556]endobj 30 0 obj<>stream xw4]6GQ]F/!`h5%D]D QD[{{{gks/jhsI[- p {hwOLL29 ɚ#!@:He<P[$HWK F# @a6J!m! k$PPI]Ī R s \ l k8@p 70 A<,!NW.Nuq~A]@6sbBAPn ℀#LtD@ `V Yp"m͑Ws@7n [:B`H U4\@H`, +'07  ؘ# ..@ Uv~zNNކ/(`͍ b\-eruAJ0>tl0`~ 0UH䯐jp`p΃pXX)0e_EzYz_\?a`p-'(2G =A JlA<08`rrEzAܫqq2&`p4_2k\-v Y}@5 x%&1w.;RjiK&1  @`9uw4GZ P;:cFF(7D˵'w;o i?pW@^ A5 P"@ _1T#~ ;!W 8B ȿÄgkk* ߠή_i \/_w k-w , :!aƵ WY@.w-0Z ~ Z'\iF' U5wf~~H4ZnPs51DZ+G V"XӈHu+Q>t \p ϣDsK{}) @ߕ?ܯ~`9B j^2s` p1p|1D>Y^ 0/@ꏂd 0rE5h\ ^*0/h? zY+ `K @SY`{`󯢾q`:6V^`0Wt@;&64]7?j @V+`>U5Z}u,|J8\|fkDO4 1J㮤O5 >AaPӕY;S5VFaq jSB^ Ɓȿ48- J~2g!>[ݯRC+(]5?;*X\ w3O^ +_ %pr#}+8+\?ֿ<6+kN+z8.0Aс];1thB@}n`*zѕrupAmQE"JkDN"+U*y-0?_;,]mpׇRb3a¹CyDjd$i)Sgp|:`Z%@̤G93btVLlQ^rp̘E-2O[Ks=ۡNpTuoِC 7"|9<},L >T [?l=E“-FntA`ۇ'#˔O #$4[(Fa$˱n}8+xɕLrYi ~Fߓ"ASPSB!O߰S=sK\NM+3Ւq6ӯC`hdmDd*C.r"3%TpT'eA\1:R{TK~VF!# jUho?JJW?>}}*z@4K)v:,~͊ +b!ew F}ِ%NEbG@W]R52͑.xvx2^lf Xำom> y6'1߃$f.RnqYy\4GߔAĪ-yX0ZZ?irRNs e9 :nl~qc3bs^md(=@pCiꡀʅO,JݤA~3iYbL8~gCX*pѨQa8tʽmm\A$-Z,*fոQEn[{%XfЂon K;ʁV̳<*8M1.ub/ 0O|^˧pyW&XQ֔%3$~fؚ\-}pk,O[ˍ`1-<:RϪ*RXapL UQ Jחiռ J_Oң6F9c0zC~鎜EˆCR8fcq.QZF|zo,j{{.TYoQh}]{&&mK 2oM(||Zo:LZm\A=6/,@u#ޘ?wg,@~C8HxmUi|xP6#:yz<\޶ pLð!,+tw.bGN bAIP4 |irJtn {35VQ._"n&/5b[JV-u&5h 0"Syؘt="h#ȥΦ7pm@Yv{:GLprJ1\:t`fOP 70GuxB 'o6FNH)ʹ1}Ls_\#f0}=be*hkg~]_~ԙ~D\5w|‘AbN|#62ES~uN3+DYnS],,Qg?~axצ{*62}Cl.чc? c.ubi uޣz3PYݍ%l˥em 7D;o)9~ޞqsMO):z@1:ٴUF.S=jCY2QX/tJQi"MR1.jRդ_:5Tmt d>ݣ۩DB1vdX~g WxOD͸(^&1&;O1h{ZpM:ۆLW ^FH݄!]~]6ЌשZxo+]}6.BOnMIBzO|XOMr"[{Zk|icGkҝɉ{/@ Ui ͚;ѕHOaTÖ?Q7ك빤(٤ {dkIOub']vjifoⲎ!VY.7QCW1G4<`;bFnD"SIQ{SyaRJ_3F?mzmeĘ'HleN2EnsQӝE,E#YS1j(g٧M?erdDxxBmmtB~ ^qr1$A|BY#1%vBu;a߽ϥ6ֺHaTp3A)Z}4Ru4r`ltf1Eak<^~5hQB^Xrmjmp)N5XyGAJQ5vipTz/~t{o%bՎLme_S(bم߱xoA1$+9n۽Bö^[J7#)89ܳ=y-2BIBGԫ]& Kޛ{~v_h䋃 : w^eyxM1is6^ k!ik|AlQ|DmxOg+޲P\zLr4|D'Ė@CAm7]TSYѐ$]P>VbaweRF8Vܢ+KIȌ֙KeIcyumS_i݌%:c?]AbW{X/ΘF £n »'虺UhBR`y|ɐ /Ʒz5DŽj'ϰۼֽ]x{*=*Ƕ´ZP=%<LwNLVF{ȵ }Qs M9t~T`ٰbd;P _G.tL^bnbϲdQyV ߃Zn8Sq( &ILt}.?E ~?7^n=Mhg قwѠ7O;d k-#QKK:δ00QիP)|[|cqzz=ڴv1Xő͐Uh\6LrcDkg}{ol) É'đcWT:Q/SN|"9?y_B-UewHuYy'1w_vBB#.FΗ^'ZDq3t,]XU>yCP*4:ˢnq˵}Z 0B=pqVhxA1dѴ>F͓|kyG YÍ`̳ŕxYAێj?ֵ=Hl6:lI4볺|G#f įhs kϯY[Q>H*˱G^4ym=^iy=-jV\T})ز `X۹lDe-dGY0QQQp]RL$t9g'ݓ,GڌI8ߏK-7seTMze@i^-6h#qSV2^G1~Jjz BM(, +\N°I1lM~ scѻ1ɜ4?|Ydז0n:0)7yM,ضfCm CDɣ?LIOߘL:EPKizela}/]ɦ.IHAb?fJ ~`kJ5&2Ĭ Q1-shMh:Vv=4|XSm+}M?σqÍfwN6h* sE_l &15֬2|_hZA ,>yN8>?+C=BGyYչf GJBUdO"Y\nm(z4f绞i}!b(fɑHZ zTQ;ۉe˃*6;xcTzt_rmGzĖSp.!,o(&;./.zLla>\ˤs#V/m9()cD+}BfM]^{>k 0cF^}Cg5q6s,Zۉ鋜@hd4+ŧ1瘋<Ӛ^x9BZ**-HCAC|)ĝ}yR-687Dc>?(%mq_>Վ)~ Y9Fe$m]-.tC<i>6.h6P~,"f񥝏] A3#V(YP)~׌,F8&F2STx0&q GR3|hVݯf>i+ =/E%vu|5U^~$R=j"BT-jUxKHǏPܗfFfiL0Xz.qXj[e8 SO;|ٖ~lon @u)*l-9e=[E$KѤU "cE13c( `aJ)JBn.Bk4/q3t]9+8~{w4Fm:M%GK;tp|^`ɰ+F2ih|ԚY֊LȍWO6Cx}e ܙ 8adg[ʰ=vԱYe' `޶_f-/)&&w0e2VvP_ U7u#Z|A:||v߲x0WSy]RCr;c!4)4iR![dIxQo0HdyU6-ޮF.oLkVĄ*h]1ޢ] wcsbI5I,'7٦?GfE>\[úoJu_kT2ɷLHkM6K DE6px%YPPjbSyz QbnB[IFOs(ǝ|(Zf"}TLB1΅*Ot΀"Jq^co鹊נ70>zƎyGv3H땚'dqo>čN 3$yOm8S'0#K ҌgqD W$` \s[G8m0ӢjÉwV_gkNi&Z'm (M]b,}4vv6dMmG"V-}Gge>k@Ra᩵j_y`]S4]Ym߫sQ>ʔIӫbڲJ9PAK4c HibZb%(VJ3[|BL5}ˮHXh__}3mWh"-,4P۾x&.Q8@pFkۢ!sb=U2OGZC#zL=6|,ogV{0kmGGz5B0Ji<7|7fG+(=z>1av:QHC7*rX+;"D6HC𐓊8!$  WC(c6NOWhXu"P؅8>$-/yz?Vʠs'IVX{1)~OTʕ9yt# sڲK?ښl&.`4mO0+"Lu_7UmleR&f v^|&e5Eix@&u% UDW0d0gB|4&si|rV;y=pb)a|/_}E8FGgynx+G(f[фxK6{\aU Tm'Нd 7+[.x$g&頯`Dmgę|װ 3rxjٹp pWs 4NO\ v!97) V+ڡ{R0wkoo+-׻w<2rlU5{EnC5e)ҪP6? #gλqdcd2xIS 5>d0=pZ_wڅ&5DYLfF$kr\ U4WlJΩ[Mc%9_} 4 Rl;,zq*9r(Ӯ[ _HғA4F|׮c(vGo4޷Ч޻ܾdܮfmz!lg*1BSI,ٜ&akvڇZaw//OM-6oKeہYG%J`A~8ӗonyb0ˮvn1GyWvz"jCU9KtYs"s,h*%m+&Uo6Y[:\,o Zoa>-y@7P HA.'[%فLc۴n;|ͬwl;UMV>=M{$b&t]G1`&xv*\l"[wǃ=nG0E*壬k$_lpVɻzw^{r'g8sO˪ j+ <=HVz!`Zoq[AY?6@d4>خ6_]$Z?nMWi#z$ZfC_A34|Edi Kx%F,PWf|a i^8gMVۧ1Gc/3;o_*iFpw YP[^?!Wy5Qj͍Ozoݭkr-=%Y~ +m;h֖3v~ʯ QoeCD\%ޞCxխ\B# .W&bJŃHU$I(⌢ ߝjB HSLML}ov͔xD7: 8zbNb, `0׆ǯaPF?+iuw::S } 9RDvw+x.~;\g<cᬬ'Z"MҦuL49QC6璩Gur1нR!\p(>w r |u}/= }pq~Aʷ: W71Ӑ;wٸ gNo4nO~4Ki̺z\ըXUuyma(-0O7yKExG!cmx֚LED[_u EKHSO':Ձ_*k}撝d`SZzݓ Eq[65W%|A+.;Cuw0Rݺ,<`Wkp)J$y_>RT@=bUѢi)E1\|" >S=9swe1˓:!u LXt$Lo-;^̾T<I |*G)*^Ӎ|X5$jv{|>1exVSNjʈ\EoQ%-l 3 l"͂.51IAsT4_,G/h3! VI2 L#t3yO;}. 7Cd$_g\_d) QW˓nwǣ?Ӽ^Vy-]O> Vӷ&ydꓙ uO- ;ޞ$~޵[}CP4:T᱇Sֳ/.C/Nkĥ1G0>RN}{k l>' Yq |a..}ilއ%_X7L eC՞c5͔.`(, gҗE]y7nz̥ bU2Y&L/XFf>Cz;Eòw9,0m'M20e U2JV-|cij02^zɍT34nJ FCI(Oh(~% t1Ýo։XhL+Gu-V?U}|Ι '[r6jKRSP|ICgS_1-HDn&VD(V;iB}bT{wt2_̠n &47EީNϾ+bf[Sc":xج|[$l-'4zZ[m y.⅄o{e[y*Sj槮IC_*6;uo9>|QKozPx;us!i(o:ueL.VKx*|ڦ%d-W'6.ôQf:r hd#Zu:h?6*>Y9^-6:_6{MM=+ - Lێ&aЧy0+6mJ`oxla^81N:6__K \?yZq=,A]'n㦌\쮸<8Nd.^,S6w&i¶SM2= m` Ӆ٩46DĄ$ӄgu_:($)X[…ua~>xҘP,|tT؄Ri(aޮli<̍qu5Ӳ|Ϝ;Ga!C15`rT.7kJ_хƄxU`XOj']zRvSpPrYpGϑn3jZB2_Ǟӹ3L-Q%Ƃ@\[{#{P$<nM"!݉X4iECU ~? W:17yYKcQqO̚!Dr/Oh[NLnVIooJٸx2;D9uvB+Ġ@ hrťK XVPNvF>85,˻QRжG7 sa1qHf~YͲ߇($Fe6IGTf8eBtQ =B)s'NUgʋ=?f{^TpaXVƖ}{]1?C/_-rӎ*OԬ&09oZqyZmrCTJ N'iʼƣbk %U&V o?7A= -ßΠΜcg.֌ fiat %ay|WgMa0WT:?feM-_eƄ:zTe ֈ;< D"I$()љҿN1TV)Bog2GߞH ^ ȡxc_fKg _se#{bK7I7uBk*;1cO`죲Tzc8 IG F3A#ŹM%UƢfw6_Z,-r3ɩXl3#G_5Q1Ln´zbIйtj.H a"vG8mB,-4MD;sOrZ|/g; {p7oJs>diSM6`y0}kӻ8º3,/b.աb,DG,۬OٸqzΧ;7gp_VBKw=ޮ @W:xjGJyj+ӹDdBEFZ)5eBIe}A,ς%MK3 ,s~$ߛs;a>67' ~;.%ȟ71Lx-?\/6q?.߄`h~N߶Qf "w,iu-.I*iFD.# h5hX@Hz!O "~;7ȶby+WI>2C$t}e<1] cz7qzZZ? _)8 G=$iRâЗrmUf"aMaRºW&o0US-=!9T2~ӥ B,4l׍3WbR\ۆ?NqĨ߲  e!S>mVyG/1iv мK[Ѱ} cKIƢ ϫJL/ƈg9sר_*>PJvpNjrQ̮()[(*x MZ촘i2h< FǾ%ѯtf{?n{X\F9c'lߧ=΂wfmV%guMAwꭁEnWފ.Ydm%Hel<3O aV; E8E.8Rщ 3̮h>Kص*zSTXޥqJ("-bbib a`ְ {)٨s\u][Kܪ;엢AΌ-)&޲sT3/fb` )tkc`@ Nsb " $ OT5 ( h3~[K~e--Y[-~;[κihT᜹cmRj| :gg%^O"7N>'IS gR[s3mCtt[K]m}z ~#c1?'4fm|?HӪEe& l:bY/2+J#XC*z#sVM E"<~e—?t,1g+e57Egh"׿_a ~`晇C(3}FfI9sC\f5?boW֨Ub$!k=TFsrY8)U€y8ִxdΏst3j IS ΞiX;_(~`'lcMѮ.*g$&Q8]{4\>Cd`WOnG쪀aXmǫȰriڲvYGIvqpjtЖw+52#o|H3-Y,qMXuc5nhYmmԣ"wDZ0Z(RWbLE#f]ṳtxT3;L(8"''bJ#\rk3S>Vlúrݜ>n*F.,weaLvjY )~u0yz##(Bq|, aK Ld`Tۼ|xMq]FJz#ʈڔԁ{Hic\PHz&U`8[J-r^ǴX=b粸K}#xzt$8%jfžupKpCbhAⲨۮ0K)1oۏ1di7$?+޿ N\~v+ȯDR~}AbFBꙟB E||m[1)&GSQKgϥ}ʷB{.i  mGj+(rYL/mm873 83OL-r;2<.fhJ+T-\G6IC$g; {Svi݇}8.}&~ZD-(3|7[ؘ(Iyy3C#g<_k%Ƨ(Xu^ZH́/!-!F|t\Kg߯yv^2ځУ75"tձ2+ 5o *.IHҊM,Jj#3g'̾Uڬp~Bv!K7j1qg7>E= ?C. ˶m۶m۶m۶vٶm6WUpOI:dQZA ?Z'Mmʌ[#6NF cX栔+".ufR͊}q>i_z,aICM~QpP\CY8ʲdL LDPS Ftn2F@k#iƟ^-h@_?MMT^_v2 yk(mBYeJb6b$f7TcQꞱl0f c! J}YB&ں0s+%CܽbհBی3fDl u E"vuǒdwmzޡ')YPyd7y<6IbrLkF BM4E+a)5WgGO7¿2k'ݴ.iSQ*X7 ր4Tø?mCtBz}4-Ff?O-'Tݏ&r]{k ysZD J5<0d{sCKd1BIx%?YȨ -V&X[z{ܯ6"@r7%9`՟$5="hq9mNft`0B^-w׬1 芍#%Dq1=RN&yk@:71\E^g66Sh D~`D_)V5[(S8ǣisf$'Zԍ;hv&qfZL' :M3D)%·7&$vpͺ/7]1nLܻ2B vyC ͉m&Νm] 失 sAy*bĸr>].P }xU{1ȟRTXgazUYO #ʾ+M@e8!IOa=pg:9[zO=[U%K9x~]6^ԏqH^]&s10Z##ʬ"Dg΄F,]`P'N.4|Cs6kͺ#j-k}M;/j@S_:j/.~D,47s#g١Lbe}6$rGR%Hy]lvM]:q#m fû W.cRk ۃ"cN;cp7y{}G,&:Ɉ¸g|ݪ {`~&:/P1BEWRZJIt^Cƅ Lsa<i'ʣ:Zm],ͧFJ"Y*Xc΂v~Qf9η,P *Xªz;EV8.𥖟]*Is3p cF_ԛGϥVI.: ZPCIC_ Z?ؖQr $탞r譡sfJ}h]*gnD Z"NrGw\J~`@PkfCpD&+RW1?NyyO_W Z4XN7!j#RR7&Zpʸ}̔^jpęLF(*Ծ/UMO,^@esChuG(Yl 2)YsBŭDHJQZf1lO}y1* ;?lh昕ݮ"#UM>+@=<ۖdh%:ն˃Κ腗A EU#-cwkz ko{ͱf()FpDt_$k]E9:<mjQaד)4v3c|U ڽ^LZU_n[_=ΆJ:Z7칚>1L2}Qq.Oոs' 3ɭc!fQW-vB3f ?d:YFnagzkר*xd9aDB{t{J4z 2& { YSZ4psN$>o_]I/{6xm\78Wi3l9HH6 y>d?F!+7˹=u&T!ǰbƩ2@\a A L*H[2\uE5+:rqƠXy 2r+3ۮ"ܙ 3­_*QeߌUk10V-]}:XX+k{}vvMMnuM!ɚyUW3$[ǚx,A8h<[-ERɮ!·kF5@y_`v<+ਗj!ұ8T q|RμipߚxY׏S]B_2ЃA&?kۥ8 ;@JȺ%_.5^.vʰ fR3^@īZ;:~Q5Vw\^UV.F%.܇@3j;X Ʌ0uSrL)2G#XU=QUT.DԷ7,`r`h19ms*h\u"C#j۱hsZƐ9=<6 _gM|bcQ Sihf/8njm"e\M.vAsnMjv_-h) $m,\^q`<4d>>COLC+{pY# R9 RcGG藝"b 3A/pGE yQ%/ F5_"P/tW " , j;$%QQ0l*N lκ{Ij]Tu3@,wkH b82t$~eKV.ZBqY@)Ge~Ep8C###mQ {Bw~B&y^nowч]sy"n_Ubn&q ?(jƪol>QYr.C/U4\}k ŔvE0 d(pQZO{9w.IiwQ>2'Obf|_O>t ȗ1@}Ta7+,6L6Vs{R$XYONWJAὬ0F4t4?0gZsm\'v .[V1~M prXDn)]DV}MI - MyO@~O3~ :dPףnGL_^.+ U*9֨,_SF"G"ѩȸpC7:XqTDjK"%^X8:xSka5fĈO?_ ViA=hL:(q V,ο0:]\ N7~ dQ,qOcΕ޳hhs\ы6{MvyA%`f>h1k 'YgAρʀY79Sk `8I Bp @Tv'1Aѣ{ I,a)M퀓ݑƑꁷfAUe+lڄ!;ƨl}7rƼ)`\ܖ0)/SdӠx׶:v~״-g{1mP0+8Ouٴl '(< ZUrRT]ht}VaGq<@ H'3X]U D]cuw\j~HEh$ PQpZ4gq?5{ހVJi{:{pYAi%Ú)))Ce(Ml %`>CEf(}˗utmg_DQmmkkSKÕ"i KZ-?)U5 :16 |p)챻vN9:®v?Tj:jO_NÖʟMrwADDQ^!*Nb{U0q>'_-^]4ZҊ0s(҃޸lKXKe?# wD\D.4%HP@a-eWFv|'5:JWeׯxd͇q~ea~K9{xGp#>^Ɔ0V|̄ W U⺘ƨ6/Ӫq9)|9YGt+v(Zh!`:+DYƿc0M a0Frv:n:97wE1^||%,C6_)v/O^i MFА:pW DW}ޭ;#fy:s+m_* ڝ޺ 02O!r!r|1sJXi2R)wI'SlyfyowLCb1tW q#K8r T6=Ie 2Q%3yF[gjܭED [ޯ: vtmd#_H,{dfrer sG5dD`Sdp zgld  F M5j&jyZUd4ݻ`cK̸(8?,VFU ;0s-V l)8:$;e 8~A}DNᨮ&+?+.f>[`BGU5KX|c4“e:z9i=U(+ֻJ*ˉr`nWaϯ{Z!~1:Yv-8'6[% qXv})X_lH%YE".aSTHTZn{< ?aq ?)bQ]*lߕg/X~m!`=}bkuE^J2AIpe=Pѿb^F T 6hLU[2q7 @PJյC{yt&AOMfOMZ10LA6g/FB;yx#wYܘޝ1Onwz\g60KJZ`u>*]ӷ>! `S=Wџ?EwgEYXJq9h2!3sXBO#-=p@NMt.@KK4 Ӥ^GM~9jE"?Bs$0#A1_Ox8nqWb_J#Ž{o'4'YpdY f-hmiW4E+noJ8v Н!^8Oê4t z/Ar6ȨWбt)+4nd\r!^,Dnak𒽜f@1}]=amجPÖ7J8މp'QX =̺eys`c(8@p,L\zЊODCcr(lvѵɼm+5SU5iCCgڧz-ϕ(&'BR@(s&PNR`߄STW!lz7=MOAg~%5<k)?3v4wӇoe߃\sAl[)bA酄ǓܠTiG~&+N:mUz"rԄe=H{5Xm3%uȐnlkxo=^cJW\E6cJHc2+'y=Nyr]\9RZ, ccwpA㮌 d CM7N2ဲIbATAo0YJ=%p2ή\P /n)ysOjhn{#!W5iږ2"?Fc!$Ŭ=v8: ޡ P< Vbwbm(H {i[%'xtī&"VzChAS{(=*+8eIl Gk#%k~@M"xsP.5w #7l(ruiI#R|.p# :9>ZrݝN~N5 3jq6A`CoQ[1_Eռ1{ ^-K;dXa H^A6Eԛ8llH6Pg4uЇr@yf.kϋ 36"B6fKC4WߩK&Jg#>t=ffF*L h߈vDCϖu:yWc%vLsL9B}ࡠ9;٭sP|K@75*@(cReN a(?^ g@SN![G1I*GpR/D4CyZ=p7 ܎B.eR*8[e;6g \bUİAf~@7$EH| rؤLL!Qc>mq>x,^rkZ < =xX+I9P"pMEԳaqc蔂ɣ&SL# ڻ@MF\{)Y\ϊbujx{x#Sّ;5tʞYeM#9EI9CU*xH;A(/l %~OKsfcz Fʾgc٥dgɊ"u#LBq blnj{&/ % Imxax5TӴ4,OwchsԂ Nڐ5NEIύ)2/_{i4b(6 ,1D(ר!p+0}й~wzD=bLOXO'7JN|CV"9(/K~$SP  OOWN"KSf<jfy*)dϒ>Otf[><yhVX)9 J` cy!`Yc C0DŽEKv`~ƣ>WΙ/\y(gg5mL/ Srm3S39\ApǨγbmOxn0k<:߲d`j=o,vfĕhpt|1܅>8\Ëtmi͈!~ʜWm:qӛHg0rA+HCO{sTj U7lZ^Wnr=af\V1*@v50۹[uL3> d>mC$Hg,WAtzk.<](nqDOb}au):zCRu}ү"-Fdmʔw̹Cl'f4Gu[weH&oEP17?3iobMGvk.90_!6XQےR_hd/n,x\O0g,y!3S5XvSL8劖(Ql]c"ɍ9ѽ +v.KL)Ya'9퍼/]q=dd e5/On+ uW:6i {V:]U Ը(5FAdk8zU;LwH^pʳ@|tT?t'bk=I3@ٍZA|mMw)s B<^9)a}>pon9(@)uv5WeWhQDrpwO2Ʉ$vGĽ-)SwW[Fa]$CtT>;Gq-,P>:U"e=*7ðJ'}7r7{O NTg]_(uEu\tPLX#ѓc[g'#&l{Wb?+`AoI:Z١-]5jÈ?O$"|% gh]'׵S6'L덢4nYu5T%>t)Zet2Km}GZvTh0މebbg⊮`@IVpߌV077U+UWDp{ D2N`ì Sõ F1U9755+o=kGl+Q&&~N)٬t0lWVFvJ&)y&1Ox;`b&;7gtg#0Iq}a|>4uڝdiUr\hj%ޚ2cزOgx^~ }|B55sH^ wwABQS8=!m*" /I%cQYԩHNRNz9n)9Js>it!w>\XQalcK>\OxVٓń߁ ,m2fʭtmqQo!*IdRʧ=tg0akwa=PF (r <R[PLnc 3'!\}>{;!CO"`1h9>:2U[|exжo֐g Ge_1J =$7&.u;4Bxߞvw,;W${Iq "ހUG;h9 -,#vY}~@ڄt]s~  $:tc&8V_;"Qg8Ͷll$ "^'%F|Kwiqi $XQBUmf:kQe; +D6Rݏq*u]yd " Z'Yτq(rЈ$DOj{횿 /os( F'!x7]/84UՒAFRl]V;{=V¯&%{m29`rYFg Z30` =}Em!,2 p4 `Z|T)T%.큔M Y`C6#tL^VXEOiq^a;*y r%$H$&l-eBJk;>8>K;Vf2\[K߼5<`4P<Ũ£LZ _3WBz%bvȒܯ11H5<&I2ڣë?5Y!AK^ťdKׯ4*i_71 C$-ep^L/*'Wֈt1 ;*On- E?))/ qM%u`gp %/lWiXt a>U;N Bwuq5TޝA⻯.FL%D8Ja(@#rzZ~K̠ny%QE >EY+8ÓG &n`qT`N]a6k7YO}{S-A6/^JF¤{x`OIoҙg+]M j`R~$,R=iLb={zi0Vzev/рG|・~;[ *[Rkx}pi5Hecw|X{e("1NIYDfFpHxJ+)N̨/1J@ZJE0T5Z {l!$\N0"zz {͒DŽvLCs(K`PVjCwyNfvsh7#=,1t b;μ_n[{fj SX6˔UB$znqO\ZPtz8`u2)yWk!g6:J3s>ϞF}I2ys[#\+ctV錗0 Jօ ze'ʸ^ȟlƱ{~(s*JQ/*oqz[C L9S'S ϕNl?Nt@YAB'P`8` 6ӑ|L ˘dު3Kr(Ô5 0~[<e0vvL̦d$.{lu 6WI<=Kmca_2`ymg[aoaendstream endobj 31 0 obj<>endobj 32 0 obj[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 250 333 713 500 549 833 778 439 333 333 500 549 250 549 250 278 500 500 500 500 500 500 500 500 500 500 278 278 549 549 549 444 549 722 667 722 612 611 763 603 722 333 631 722 686 889 722 722 768 741 556 592 611 690 439 768 645 795 611 333 863 333 658 500 500 631 549 549 494 439 521 411 603 329 603 549 549 576 521 549 549 521 549 603 439 576 713 686 493 686 494 480 200 480 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 762 620 247 549 167 713 500 753 753 753 753 1042 987 603 987 603 400 549 411 549 549 713 494 460 549 549 549 549 1000 603 1000 658 823 686 795 987 768 768 823 768 768 713 713 713 713 713 713 713 768 713 790 790 890 823 549 250 713 603 603 1042 987 603 987 603 494 329 790 790 786 713 384 384 384 384 384 384 494 494 494 494 600 329 274 686 686 686 384 384 384 384 384 384 494 494 494 600]endobj 33 0 obj<>endobj 34 0 obj<>endobj 35 0 obj<>endobj 36 0 obj<>endobj 37 0 obj<>endobj 38 0 obj<>endobj 39 0 obj<>endobj 40 0 obj<>endobj 41 0 obj<>endobj 42 0 obj<>endobj 43 0 obj<>stream xetUYe{]I!B}g  W"↻kyuU\+ ḇKzf>io4E (07+07M(0KhTh\h9q-4ɛlqiƎ13e_鑲k.}~hO},@CՇbRĤJH;X2ON<1533)8Rxn[Kn/]lewヤbފ +V.8V'n9YLݎ]皾,nWrBۡm/tDōӕ7V:Vq uw.6ܫhWauۃkoW/>_jt. "!%!,C榱 ctJS8Kns+Ktq~FdF-׋C[n&/#Ns_q|cb6Ѥ+wly\RʢV>d Afw4y4=u܄p4fxy4j)}nʌnMu@C VҘ/s 4|dLIg:Ď>p:Oה);*d:#Ѱb8 ܴZHx&uRF-']VVK0+\SWpSB1Kܔo-_?䦸`MI4-N+C&I[6Ҍ6$ JĢoJSϓӡJoqdDN1ySdbNnvQC|+~坾a-Ho+珟n츣M'QJs;)6bj" Ctҫ?HbS7[nr|'7Ed5On#?>0e1[V~wL[i+ 2?k;e岊#FE^Msv$M uR?+|.Y5/OE4E_Ѥ\. B AUк+ lRD:{AOήt{I=(LSto;{10I*'6XTKIC uvZ֡lvK=nJ3nv`KCaAn!lea7u#;iKt "7ʹ $p[qk<jEGÔoM}& s.MZ1()zJ$ލ.XŤ&.EPorz+]Yx4T c5ۉwڨ:B|+EHrW)CId$(2d Xdg)ȂlmxwWb“ K,02M?ӪN>vR+R |PPҸN914.$>&1y9zyFl4ӨTSUzAz6k'lch{q[I4𻑼|5oET}?1ߞ|07)ҟch%>ƊTU+p 2Nu㚢"(f GvceƉn8w7%n[nNI&)Tpq.E~:߈MEnv7nxY)24zIZ4DXfI֎pKQ6N5^KD{&m7|„@ J_nvjdw&Y\BR.~ɯN0HE;N! + Ѣ]4]g#O2ي{ʼn[XDZFc_}24pJ9j`SSb',-:2zڟ|g]~O7Y]z>#dn!K[$VXH@Mə%TyT 1tۘ4նUxW=a P-R=-9QcA I9 \FjN2C>27Ɵ2r#y9nJ|OnsLba :)W7kO3U R|+4M70~I\El:2NW2hv*yMu(3L;dí8tu(ȓ)YK7?ߴ[+eT$H@fw(SvhF 8M4X2agidOԾb[uQۓ/J}{ʧ3NEGe$&G5S3?kح_m'eG7KHNi -:O'Ax#Ứrn aQ6[ S7mhUXŮ3L'T 1"TR\V3o2Kj ;:Dc+/|7n-l$LD^h<p2ٚ&ZƮW;ӡ]u&Өզjl)28 '3̵n˟ )nIljYڣuo.L-kXKvT[R Wd6$mҎ6@MsiB*KP<hw3~g[ b !O-|d+|q,y|MIƗͯ>-m~uߞyx?f TUBX=&q_{4È45 MRf[E *Tk Z1<g˄KodOk]{0hIF,2MhH⌈59C40<4-hԍb4Fb I;*A䒸jZgNXˏ?O+2 ]Gg1 ޸0$Ip\M:Fig憓 /O]}H^y<+n!xeRƪTzL~,'0*:d$[G [5@i,4q?=sպ|A覧bR _ @ ,bM 8DfJvDZMa[r@[ ݆j*id\zo˭Ɖ[n~P (nIܬg2azIig?pZT]Iuw.><_sUII˒7|=:>}Ciz}繧. ^R7|NxOԕJܑhfy0:0q^V V3[rl-7K1]ngB''ejEn@?ˌ\,nefK$x<-0PHő"ϓЙT+7;jts ,[N X˰ c7 b63C~f Y6%+(.qyǗ^n|Z`#! BDE "w6ĭ6;P願NNDo4JWFѴ²u"rGo`ECu!q8^Jf&ZpM4b cpGOWoUkED|`?z%(E99y 8Mjދ0,^ Av1ѨbpS" hIL7NB~iۜf3cؙ]fp)w~.@+D)SN=33윂)o.^te;V~^zgyK{*ذ2`ec5_|ꖓ(ju}-.vRKNT8]ylWo޾Pwbý{-ZV=ƛo?m^xqSCc6y9k.yne{.+ms:kǩG/~ _uePBc/OZ7eibЅSҾ,m}u'ZkwN:a %Ҏ̐) 0xҌSOdUg %nKlzͺ皾>|7Q)n4O@7x~dWP̏lf=-B-"J':He-+ENL&LqkDbI{ш1J܈lZٖE_!]):sx4L (hWiZ?;ՇjGRtiYҖM&L\_|,&lAMJF1S j ӑt 8s([>[$l[HUat x|-@M1 }\PR>nFJȊًT!DEdh2A8=Vh\Jƶa-;2ى8Qشʼn^v4f:IvmBӹフM L` ҭb.ʹk?5*m~Y}mA)z>VL;vz+7_DŽ5z3 }g,)aKw]GōBSOv^3tRLVx\W Ȩ+ʡlZ5#'0SlrB1j".蒴lO[_8eHyWF^9tNnU&+ Vi{+Jޔ5=9Ws3taoCgr>E;hMV?2>o ]DZ^VeB4<W&i,~ˤB xҹ\su&B H_HF͗Tȃwrccg˒v:R99T@Xx &!BOHhtR\,,M]4ه:ui[_pдnХkuƍ6s˲*ZPo8dt܁\='ZNYýK`:i,퀅z!+ Sz*\ ^&ċ ZK2>d8Ǯ:x_y-aVnt}f/4 _NnQtInSBeD:%a\A@`LOzP䡞+ / /@w>u!CGp;}Ha>%sSs O2YUeeBl:V|˛gן/=҆{h_MKo8xLpϙzaxl3_@>y3UĚ|hPaЖ:Vp0 ]2DBR U)ݐ4# R ;yReLpk\F'|Ć =H,7 &$c8j-b22;"F}V-8@"V 77S'pٲ7ǯ܍nP3ϡVCOM>1cms\i֕<4"ZrxM>\뒺;N-CXG wN`Muubzd3Z҈MX{>)Q#*E xҽy_]hx\Rsg_Q@#ކ^?,tu* (1BIeu JGB̷aɰ_oGZf"n=5H2~ _{X|Q E u2{N(Rl #{ ïj]b֊5[+iGgjp.jyxiyҚsL߭]dM ڡkPp2j&n2 ^4yn ݐUva(бN`&>Ʒ6äBn&Kx (nܴTo`2u_7j7>/o{3wGO׿iM!cb=1eƸA^FcBRfY$o`# [^]hsw@3~M؄iN4 Z0.y}BƱ׶^zI~і|_V;}-w0o3q6bsQ 6_ņ:3u\]/;5~ymB1UgZQ/<:>;|۪ pߏ֟5|ףV7m\IN0|ًϋ攼8k?3~6Gx脥WDDnfZBp*"s#yVvӵl;.m69Y,~X UiK7TE󿬸ՙ'0oO^-,-/02}yTBzDxOFpQ`cO_y\q׃W_nx{?rK[_w(bq4j|^R|7% ܣSx2e>dQ>UIiD<ȵs OCv,5;kε|sT מzѷe)bqS ޘjG/ Y L=Ce,i~SzWikt.WN5zu|ȥ^3b:{_i~)*jxvB&DM-6 ^le{}sޜY|CWnD6kv^}k?hH/ 4YiJ^yrmѵoh^n~Y~CKP|uGyd_a "ǰcyrՅMD*x`o 771'&glxCnfYcڲ}} \1iP/6jkʘer:PLJ/^lyr5kx\~㻽WD,²m167x/ŵ_HM\\+_z6|aRUfVl91vQiZ!ub"6Y4=c?s0:mVUfM~Y7>r[*KUT-<نA HžMzNHgS.Y*nDx'gY مOKGL^6M1-z5i8gUb~F@GM*!1p3ma2PJ޽:tpCȁĎ2V}­9C&D2yIvs57_ n>t壼腦-XK-//)Bϑ9_JIZ9sm#z }J_ME;NԿ=E Αu]\b=-p`4٪  X,Fu̠RtvmUx6V,kL틢E}}M3t7?#o47~{so_5-Mm0ptBf3}SSQ*xkQSȹg6O۫ tjٶ-df|i& O5<0>l}Pf>=\.x[b݃,f r0uoϫo}O_7?u\z oV]l~1k=#9Znґ޳ё '%y:9G>:D9t7T=x_Dt@}`3H9 7Hnv7n&f-;PltѲeZ4!bsLƁ-ߞiۉ yDX }g鏟 MO1?ܷޘp<+{\5b!z4gBۊƇŕ7o}TBiѨ .rBW9?UB,qa2td@LJ59 _#ōIdCD˜#o?렉W\awcϾ6} @ VjzVlC9Cg(~ǧo sԈwtS5^1)B:Lfekȍ}l:$[;n,) sT₺D|7M朒ցE&Kܜ*:=M<Ɏ^GU8#(Ljv]8h1E-!.%lX<4EwC<\vC6GOC>!=)_g1ITWv骻8u$nKDy' w 0ņGޟUA]皱gQ5Ξu<:,\b:|Aɭ{y3v/^n~P=AZvoCoB#{$~-C忈`Z҉)(G i)j|lJgj+g[Eu]y1c31`GI݅)w3->V\Ei'D-{|X1C# p7W&hD ,F96v(o9/#uY/trǹk?`/j-f^s6LYp5^3R{4](ыyZ5Z*'B\4м(m6PSCKBLⲨ~7<)"c(]0.ac9OB ^i))-By?nA)ϵ}K#tXAFN ][ 3^@ :~<]:b ƄcphCzۇKMJ.ՇLϵ` F5 ~ԁFU;)6pfgK֬ς d8QMٺyTvJnc?ui>F}2*]M{yiKpM\}s dFgۿ,6@Rݍ (ko^M'ĂcO wS*Y衶}^Cl~|Nb0L{c:v?Q,uz%,'Jk3vPsOz}dOCfDH9G1k=C=!,Qu@]\ue|\D C& ;/7<5>>›9Xզ5[a-GJ\eh;*;v+6 ,҅`tL~NwMX柎G 77RY4Ei ԶU@ #|Ij}fMKkn6"UZc*SZ ,MяXƱe+҃oU0y.S{I2ze]SM{pM9l 5q??F:|7 ~Kr7lWGˎcPuAG>/ xh򪭳6nfg,*nU5p7yd6>M%wwo4sv d<+5(FjY,1 TQЊTBD͵SeU[)߸*wOU+G+U*M?miGNQ"urp8K$k@ˠNq2Ý'qHl56|^nI;O b4eh4e@%M/{j&E$jNIrE/;b*RGkZ^VOkB}mAzѹj>rIߥv>f-L#}ԳWUT0WgQևxN/6܇>X§76<(0_ b6E{W\FM8""[ !ō;'r2jlk"^?!r]qSc\ic41Uc%]4 tRb7rbgt0e/5TC! d8=9PUe3fzn;7>?Yi-B-ý4?S$k>tl2TÓXe<:>zS-tRƆۏ4ިiV[H뒦ט"qkzT3!„|N 3商K`cD3:`w[*MK~ gLtr0MɄu1cb4be{ X3{nQ hŻ_^i~^TqU=*i{{ĭ]((i1)'BcgiS2]C֐"4I=l\2zM J>( (n4 ^2+zFST5 -)sFڑGIذIxE< -1n;Jjna=̆N.ꅳeW;Ɩ ta)":`nG킸%[0Q;_&`HwsͯQȚ1>lHL\Qc.ڶ<θ>TUwL9_{+>8پ֑8ݨsJAc bL"RS6RÇ8e+>jڢuf&/̞`3RwPҶZI7+7#-˲2#W2njҧ&(H?tAx!pV-t[pl]xš9y"BWɢ2 W,YdxH(Z<: 9gzN&!̋6`moM>w8cIśDGӗm eeEӳ59h4Mԣ5ȫh%S6~cd1h4k7Ta²"6\cT Er&ud;-qA 7?(j(pq&.j_QCٙ˭WZ sϋe9ڸl;/3 b=ψwbً_C"2g6扯1DÓ6>8\4q 3ADŽz%-n7JNqWs7&Dm?XJ!#ܦԮY Xl}c^lSZ19i(+'2̭(. 7Rr*nQN᮴#]^:H! n-mͭCM h[ 欒 XxhBr9G*Z\jId{96հHˡs3!>$-"`u@i$TX̾p;!tv18],9Zt֊5:Y9rEJ ,obmJHm27C#_J,)Kj&̵߉ZMe:s"}I-۠aH[jFN'\ƞ vɴAɩbyT OS-5\f=ijv4kcF@ n 2P6ePU ĕL(߅Q@ᦂV 77O55 /n*%ԟ'8(4G=QgU[o1<1h_Yl2.8ٓsÍyW@aU2j}˒֧_ݳB~˺qz5q~"̕4)DI"z甤E>2:x:9,2܏$ ,~Wn$*m^UWYwk*S̖kg. w H$'γYEåm)+B\U#7E2~\^+JG[[oBd2c}\ ~3oc?6tispKV~ˍw7-Ʒ/_Q'f \UY2rMܲ~GD1ua%v(ܦ`Ed)mX2QEv؁)vi[0}ͶP\E{2tBzEPLo舅ō~< }f:>5v[ԓJOYͷG.S=g)Y{n?Sq3_Zo)Vq;H 7?X^(.K@fwX2zC;Jdz팓W(g'bk0*Ү?_]{q-ocx4ϴldЖκ6DLpsz)kGt -:[w8`l㗯[OO|{yc5uW4?NF,.i=*6aa.aJR~!aD'$cLHJncUk#).!t#\lh@v#0H6 ^׾4EįR\|IaWlg 6ncv416x{Ǜi_jZ>$3#M|{X6hLԐ1N19Yr3fL \YvQ<Pv;ytB_\jO-U)^ =M}b7"oY.o+}goBWB{).!^_O@c8`t<3Ar$&,gg(pT[" gF,oo0YSu=']V\5 Yb,øxVӋeI Q2}]ToO rg})PC).y:~6R ܚ6YPއ$jBP6-Bx.׍X'ŪYƑơKu}fH& g4` gE:"|a1 V}tLjc#XL ¤ecTDbOʣECaeƑk VR3~۱z7bN>a.j:{cg*Brȏ0rLo,iT&g '=mT}ㇹO9} *rk:(0;ul 鰣mĀё1x0Zo(ZZ, AY*爵ІLdF~x SUjUp_Sަ=BD.Ah~ S~A죾z:˚E`@ 0YǦAS^3DҽL5j*s@/l cYy3PZR'6Vj簾d,-&jO#Z;*h% oU('^}GN1L /1o?vKag)JDqMTBNqG_-8d͈ksI`h}?3٨CI7E1Z`f4N5 _eJ՗ϳH`Ch#Gcw% V1 .% ,NT6.hf˛R c&?[#p5p&y083`*OH (v܌Sgk_@ q h =;0T3b6VhU& q;W/:)Jq)}-6 ^?@|@a@"4T$516sXQ'pUB;Mea Z]?( [6Y,PBh sT**to/4^=8cB?Aj0'э 9;˂tC7p0lcr "\C9&[/H:b,'m4ՊW&i)i߀ھF-W[W>Ea?j2b@&0d03E.6֡o6n2(펆E+0Zhn zOp+%J($eQIh4l0b 0|/cJЕ<2w0=;1$9FS<  I S VHH@\.9&P@X XM:K$;q<]eM(T`1a+ 5A,uy:ބi,1g4z,4_I*<NقQЉNMI1gN)?94Y"j"i1\7A~pK&oP;hk qKr( p,r<7htX^b$C$4]yR\!+&gMX{ d(DMk/2n(8aӖDכeƁ<@;uS(#yvD[a y.@ M%Q#m7%JF͒Lx_ZxMa]넥b4F.S;%#I&NH 1S0ALfbC|hӷ|e (s \iXmdm͚*ts~`ςKC4;dMټ)]%Da™:Mzp'ȇ 7!7 d8jBMY%}g<~2x;XT0Os\"#:  ƐUBa@Z(*S'#@5,&;E{?%H?,(2HI/#'WHVr.+Ԑeԗ)%zh,ryc6DL cq5Ҩ`i| _+A! ]Rۑp)M(vuᵺ<5Lz+:,UŇt|24;-&1MXnֈE*=N,HHWT)k : tJ_%O&'Pҹ2DF2zKx\1u_tT 2AȾ ]aUoOt-u0U[(8u0{)xwDnD"y:i `ƇloNR`ҍ(aj ͮ|p$pq n ŠJòjQ֤s$gTO-dM**.DƜ~: *HHPЏX3{h pGT OIĔ,G_8= T匱 @%4I+wHpU"VˈT@t4}2W>M[xMc0翰{h:<#uh7CfUeIg(A@ӏ-{h) }յG8%YHR6*8´'n#: yw^ `IH؍4]Xs,hPX*1HAJCa=H$o*baE\:DGRTϗzKwf7TG?CQၕ@Y3S a1/~<i5mg%BèLluZ2gCpLI (nԋad/N,gVdf+sN=UGΒ Úh<vfSQ=|+HEt@F+Vb0չMԉ32q[0:JG4451>Ge֍g08a@v` ?J(X!VLIX#4/1XE:bd"^X8i⚝7 \XP-g ghM!R p7GEY]{D$0 &/U@pSn<7El7FxYll'.@y.Lx7HjY$X'G+I),~0tVe jUX QW~PM۬:&f"WԘWI&D뜐Hswe | Pݸ)雛dT2uR {V2Iʋ|\J8ф^C~iwù_ 4:d9[#L|o 9%(^mՄx#I/N4K#tV^N7}Cu,:^8:$#w/OA[^:":ZF S9' *T*@,2tLQRĈA2:EHÔeNJlC3O*H.vS8L4cǘ2s/H5oݾ ['pɾeB]q r!C1GbR%IZ{,yI'durFygM)<7s­K.Q;w_Snoņ+sWxW)Lݎ]皾,nWrBۡm/S1Dōӕ7VbJʊ^s^EӽʖU^\{aͷ}~/o<|͹@+Fwcipj]'A\I]:w>H[ w.ru}5?k2J]7Tdoehu P.G4K׋w_M$x?~y3**u&** "!a a1YDYEVٗ,[Uݝ!7ʹNuuuխO'ɭ{Lc ~&Nl`aS< +(҄Kb5Z+kȐ!I =κ}tW)+Ay{{Qc#&G&G'g@&fU333*JVk؏v>sd2S713!BDWeI$ ubbe~Ds2U|6lx\ 8څ8kLs]_{pSWw+kxyz/B46"7U Mг]?K8,>< ^"чIy!O"Gb7''´ yl'ggAm< ;J 9:%霽yd \!˙ @ٗKH1uWq`B#M:JqgrO, C?: A 89O , hvg!?ʛDd[z֡x`fQ.X}\ }?:z&1dЪ ;$s83ZaS_Űqv:1%|ۊײވxC?b9ZE!Nߐa(F*s N4,{גyM9=?6a51e8`4΍hlyEM- DCG Da/X5`C20~?{ m+0_ B>79 \F30fg"133gٱ\BZðQϓ\"DB }Z{H=Yk[%vctPPAtG,%_Z}aD(x*i"OS@ aBD_ou2cC_&5z(-R&P\lIf*Ha/!̊)<²/Βi9N>^xfTS )/6<9Tez=FBs:J5ۂa7NG#"@R›ķ`] d"Yv1#s 0+ gqzbVo%me?-`{"Q.R ѓ,NK|T#Er^ {t's|'C֡u ?[ raPL#AV;8r~(c~(?rC9Pr64P.Ed=rcry~(<~(EYP~(  4#?VҮңCC2vtVӪ?~Zn"O S@:vy2=-wü/7v˛u1YyÚ),@p1A![ ϙg+3-͡ ^,F΢\#vFP\\ES2w~_f-\fabN>!jc:gߔl=Es;|AB/e{'H<|%WoމǯM][o+U}x!zBa@,,*G*%/r_$=}\PK7Ӌ:|Sٔ_\X\Y]kY]Uoblhx~oខÓ#S2465<13:~(ojVA@aR("ALNlU2kr7mD+Ħ@VGqY)7!&=`ySvCy;M Pp[iț^7o>2͆e={Ӏ70oT6`Ǽ9x`Kͮ!9 ff›KͅT(E`"Lk~9IeK^u[~M{˷u$^'$^^yEvev𦧤`6o&aެ@Ǜof37[نowc{Ǜ̾ ̛O ixsVwiJP( PlJFUwKm? ۉLNV:D~ZSΒgZv؛Nˉ=]#{xjaߴӏR-<ߴ ̰{i9{iM›>벢>Rx ^Uxj7 o4+j(j&Z&F›= 톼tq>NNO7IdN'/+=M)E` ^03c/7oDYG|o#6bmiJQMb:ǮwAiҟ\cw^}A_=}&K3I'y:m`ÝgB.a?vgo"q›AIEf =bM {M|#&GN w/j[ovm9?47fBE"@3@2`"r@*ZljcjV.f}zFǸmND8\󱿸J\{Q]vr!CL`7ǯ&YVI7v7So;ݹKJwQGdgc館i΍@[򢐔2(*iVUjYvUJދ{O_/}PT,,}kCyZRPV\VԾhx7[zz7ufKgoN98:84:alx񉩉I,SS&1S`SiJP( Uhf6=ljе-nYoyg G-[E;E;v:9|Kľs_ϋFvv丧WOŵK___x盉.Aw]CR.^wExG μ!Q>-I KF+J/_,yP*Ug>O̮HzR)ϩHͩH˭ȫV( _eg=yV[^U󺎊vj:jt4t7w}& z08;4at`pᑱѱ N`i.8on>M)E`Q!ۖ㗷wt m'=~}N+?[x쳾^[Anr}Lѳ! 9vqN^ 7$4w DNQ~ .nH\b/ݒz$xM _D)ũⴠ[1EH",!S%J%? "}Pȗ)'ef?xZ/WVdVfW?)ySZSPQWXY_R𬦩-uͯZk_77t6kijj{mwﻞ޾1GKsbX$V/??Ex=R\BQY"qTw+(R(@9)H G0i`:vd4j)I^Z qС⧤>E"+ wDvr pش"@P$T*ě$ID&9D吃%[̈́N0q8ьj ]V_pB 4 <̰\R-F'3`j(GW"fˡz R$=oL|A8ԁ%t _7i;E"h F?WUe3 jLyS6st)&E"@P(E"@"oxbendstream endobj 44 0 obj<>stream xph>ٛn@HBܥ5.DB ! IH 3n`ؽ_nk:!t|=|d'2N&% 1ㄍY$!x1F#8$BO` DB8a3M"HOa 2RYTXhqZ=gEM5;c+n"BO1J 5jII014F&/5M,%Pa`22DRU\+3E)ĶQ ()&=w9lli 1LQj쳘IaI*-S.*Zp)'fBp00iBd ~?GW(Y[-FUO3aD^󫔳Su& SS:IS0ܔj2q&/3 II-}? *n #,dCSw?00U6ה4)m(w9F1&٤ H0b22q\3Uݳ1|؁U!ƒ8 !wH@+G5"r i5즁C:<5=q+W9Qѝ]7l^,b$ah?K`S9Ω;WXҳB頏H%Z4$+9g[Xu7~.N^r㐆YK~gu.?#nqD5le3C\W#g9?w =7G"@2AAȿ)cĩ 2!N;H /n;8.80z9t4SGsQ ǍzE@ǫ]# vz),rbh▪m~Ie}GhZBD0qsxAjoCzSbx8Sa >J,/%Y4K3uF鶑; *niWu_)0*Q o~gdA4+:B?qmO^轡ȥC2:+bcoo'fxᕰN^eG]ҪF<DUsm)/nʾp ^.L(^i0\xIѻdt I;E)JWq U-;U\24]ӫ#x+?KۗEm3(])ڳFĚŠ[#NO 95UK#pӶ;mg]0 !&=m_QX.%q5I^iHxi)l#/mN-}퓷!F8j!\Qj\tie5 QS56!4L= XSt+,}G>Z*VfN`}bwAUCDApZmpw:34 ;){bcz䭚i<Ќ =m3g\]c"s\bGk;GKPbEh 1,|ak /-I8 exuSۆxxiy7>Mt*~16WJmq#0~#.2vwtO,W꺦빧Xd1|ݓ.fTw&Սέ,='.?l똸ycZ&B\ê$)hBU*O TF'Y]vn)/s)˨orɣ+O.=iw||/|0sdW꾵skxǕsG.-N~6<756:zuo>+UBɂWi钾SLDfI<ψgwisix*{vL6N-MxА[SP/c{uSz#c6; u@L>Xz: 4IʾS&V>>9}g|r?9+J0+,(C"GoV?Ǐ?է?wʩn>_1쇻^“ .n1EE.}^|{Goܺ,expjgwx䧉S\z6 =mlRS=7uBmҶ c+#4횜w@s)HЄ3za#68 GLOlȣնܒ5|8hHs0!B@10%nU^ݽxg=~W?zuܚ>2ۈbׄjrZru]zUܟQ~ocjmtaIxbiҨ}^'6rQto䲞k+0pW3X_:UݷP~{.<-i?s)~::XQbg3ȹH#Fi" u׈j+­ˎXs5'hJ0lcə],=zq٫g?>|rw^|ӫ_^u]񈯱S!;ҀkbK%qe]]2Bʂ.\[~Fޱ7:[?v|H72죋CH4 ΕwOtMwH鵎*UK8I9^/CXs'ta( W.J,qn9[%8Y=rC .F06BI[yt;眘wi< A (ZgQ 2Z, 8p@T\L.} 'q(g?⿼C)Un)\R}I5bШY22_}rɳ;GN/=߷W3>2<0s 00ZFo]c#(u,(a"}|zޫwa4K̽,7u&*RjPN6 -A9-2q%' Q|mlsxg⎚U #/5V[8Xz~c/@q8q6⏞|IÏ/ZlbkS`:&5:&794[Fxy%U$]E'nv/E]TWqTIT4.h3=>~mmm75Ofξ0P)(l웶v(Ɣb򍼒U wq<~ڝTUЂ<Jhm/=6vp/?W硤6 P}jXz5vIbjG4 \ \lNsKJ(ɛ$UߩsfL Q̊Ŷ}72kz۳d$€^ Ȩ ̬KDOR_J[X>zwj.Ɉml-|U)Q&s}GRA07(O@5ֵ7o#lgPs q ح'n AgSkwY{&VUuS4,TDyE(;'G6$㐖i yX%n =*4[c119T}3:ިМPp TX_Wu_ZTKTӣ~)^wr Zu(fMZYeDͅG ٘1cR`_]xB+V.GJ|pnzyWo{vТٮ-#M|0Gq 9I؄=< } 4ܲUTOZ%JG9'ekltK.n|=˫)bfDmLi/º.m;-h#T}tFp!fPIX%#TS]>v5lETYxc橂*G,B%䖟j.kR3=;qgtUF?1%oj@H !vih H5x%QTR5t`]m*N;r!\71 x iĖ-FEbGfV&@ix;>a1o/ðC?{ sL"1MN'D"kM#azha`A`oWYU׬3rI'-d-b^_s{6ʦpʍṆUdkPĜ ɬarbs,mR2l}^R_=%]1=Onۧƈ2#?yh|ERcҏhѹ}ӫ Vg/=x4mjϯFԈӰrKm#fPiEz`UR+ tr=s4\2UO٦g`j}TҏKC7 zeu4*-L/:mpXF t=&'NY;KaT98xce潁+cwA_l46>|N?PG * ,73"!%jfx=RF 4/G&oz&UAZiz-ې꺧˚GzbBRKCAZGIWSxAi';+;JAus{^a :gTAO#0O6[}XKŝsWWٱŇwVfzOy-s! :hJP -?wgWG[>}u1F/uH'6Qܹ6m-9%shK/5%Bw f89Xl=ծH_v)9;n l}6a/=F3i0 t-ׁFN}{O޺tpëSᕣZngD敧M9C59tT=jq<#Lxw\Z1Q|i SK/n(xPz_b[x3GO*X`ΈbFC]Mۿ-ad {-1^Q/+|z"گ-CnX휼H#s=Wo@nf杀tfo?yƭcS]rੱI=3q LG%B ˻{瞠yydFڍެv ?9hy-qIrn}Cѵ02\v~-r37{—0 ">s{  SsϵE]*Kyށ%jk;0K>6Oze,y̪Ȣv-v9á'u*I!fAN FV``~Et>4NchwC^0Rܹls J)K(" 埐?БkRam| 6>o 7CmSW=s/]%׻D a5;>iUA L.$َ"&ч"˽ C,βȱm䑡C7P԰>ay#Pc GAk8XFwd[:eMq偫+[prwrE]^R.>8Wةctր omeo`Z.eu#quZGJߛlAwyT)"mNm"PvN>+Я̬qy;/ò0J([&J%L2@(=$yw^/0u?-kαɢ yucwpZxE%# c#RZˇdT(nZ p똹qS6 1 DLQ 0S,X&n]+hh4X|i 35BtnmxVePjo9n.[:[<5G=4v2qVcث9 ,\s+.N.#gI> W,°9b: VNe~s: "npk8"xdS x< 86.v !YC0uL0,pKҷ'Ciaf(NPۧgQ=2#ӷ{WJ/ĄM{{&+.gT$T%T&qg$ƛ{D|̜vr{Iʨ*Zn(5,k1Vj C s[C7s*Ee܌FC7ؽ 2SȾ$`I8<3O OD.VaٟKCym0P(;0}Άгosݷ ]_50_~gׇN"V/ m22+R.fV6O5JsLӱ(p94r Hj9'>#W%ԩqq8`)VgF}諾{aEy}k~ \HGD&("BFY1SP-2m'~qAETc҇=@w@ϊ,߼0<|&WuOO7.V dbF{IRGL?e[[p!)$$((8;.?)mU+z\A2!B،i燐K;N*W1o*Ja8\RPu鴪Sz6{kcT@d _KN7ڜsɧ3SۧtqDa9`&Tac7J;˺nwzy`KUtmumc(x]GRႦyuM[kZVyDdq{E1zKl`e_Ղ'=Q8mL:&T[K`ē:xŎ*hKk95@q4o!NccF:/,2O7 S 1JyPaF4_quVw._OM6`K+E#9 =5gې+kȭmV "cn?/<Tubaa[s0t3.knK4鏼Ws.bs2H΅QHơ+g2k{3kУVٞV֊@';:,di`Rl*x4I(=RHi= 9mSy= wDk٪e`cfP|"t{cgbJqч(q1t-qi^9kNX".FF0LѲ+lv, #!?E\$ 3RNEhnEbj932`'^ݝVՕRс!ҖĒ.5B:4< 8^PgKhshfSgtGnMEdqTm;aE*&L_sd/\IE=cxv%\22@nSXY2hj[P-mcCJ]G m 4w<Σq.DR 3O7 e6!6 ~I/[smh2?U\{]҇ 4Aw `cwkZ& JSTZR%cO H AmTCNJQr;hɥK6QU]ԣ Fi\`beo|ikF3 5y,Q"rsֆfU1C!} h7Qu"{f 7s  Vlcn|蟷|Qwa[>c㯷/ Ӭ֞TO*niu]4Ѵ,Vߎv2MFI+?CDvI+YwZ[JZ[A`Pc%g/CcJڢ[.G^ƌv-@fׅdeT) 77;Ur ж~q`JSTA3N*FMVC_l}iy}[ 9/6񣃅O9>]O:?mFރg(ƎW}YLE Y@Fga푟`&M1f= mjCY˂f\j^,J g ˿ ڡ9d'$>S!UXX]9h]G&R:1ffϨD=T EQ? f/Tȭ_|Cn[xn )rℶcks7ίn|1ܷ'ꨆf3Oj|Do~Kc856 )2#uISаԞiSM?nٮf0)_VCDм&HPy t2GN*8'fܢs]"b18S!B/1j59h @km&!L9A6,{~8/6jFC7(>0dkL {Ez0653OV Nj.a;?Nn')wZim~6u\q.k?8IXvn=3 !_c{3YlCXz:FJf ׿Y~`A⻥y#7@+~Ӈg F7H _xb{jYK% j pwTv"Q7 iXEVc*}Dc 5òC2mS0 yFBƁ5 XC7;#}#4m$:?lG voȪ$&1)MD~PFwB1`*z~!4 ,0nG8 mg3WPl Ն%VUN !"[/q|ǟ6]1 #lE? 87STHj:mae =tܪFkk ;<`jN G 2EO5?}mk;uk6(G-D6slزc5ۥ8fkyr.5OA9 YíO` !5B 7BT,qz6(Vg֢i;GײO<@?˭OEō§dfMn!L."4tkjkZ6ѬGvG0(P(j%.! 6p?:ü|g8ے =GP1\,xBw9NN()=KePhq:`ݬKE%D%6Pxlظc8Ƿ" sX'̱^%,YQcM!k7K}d#'8v-DZ^N%"\jlС@5_ ,6BuQ4v(9IMv' g*gۉh)-LXg"FUrҷ Dwv +d647 pIXΒ_CQWbhzc2]¿ᗛ?[ѷX<跮mq>Ydz0zY4t1Oӷl;f QD>,@E,3X1f4ڭ^s>?zj qlXϷvuoewo^C8cfn8f|cײd.y {IߧB ðC9)Dhtdf!j*V.~N0X؜4)eyƞSIQ",8E&xw!Hn 62nߺo[aթa)tM0-m _Q?]/IwVFM\V ^)rA]cΫ׉a%IOq}m6_Hp$Alz`*-? No!~#57rl!Wk6*%oOLۤ8vy'`שw+|G}S]2lN7& ؑ>{qLROemW٣@$.e%,EM Rw4p43q 8hꚻZFSY0ԘֈelUiMC+9ǔ |]@7Ӎ\|r#4F] pw֒gHXex°ˆ\{Mzp+:. &wR)~ R-a)haa±]ai1l-AF$a96|-[v|'uc7t\caq^ ?NY .@gAI+# W$`n$0Kd >egAj4fXRMH.cMRA-#ȃ mѝ0*1:&`lٚ t֑E,K=W-~\SE"y6%pwl! nl`iPlt:C'IRw/j#$R%^p47ڗdNY 3"9u;dRBEYV!ֻXzoP,fwXwu` MT{A GM ְ^6lCqriXjDx'ư,`.i6xahݏOǗeUq@@FHDNUWSrTwC9\i G-UpԨ^54̚59Ję~AZo~$Og?𥈴:Qcfb'w$UڊG+n a'=~Fi))"ƈc_Il$l5.$;MDى< ԙ&,h:RQ\%Fz)QhO!m|PV[+ϱ׋q|'wX/Ȃ bDBBm9 > 7?[m_fXuΈ āwZevTu^Se=ǩ;r2P(Hݫ nKKC'l7B1K ~;d̹diGu@bk8F t&X}#G KG{:&1xLQGȩ2gNk5@sEdI`F87 T "Ҫ-P2n)gQpH1"W(YS~EP^D  p|u58ֱd(I(5l |߅/K >Z_h1"p!~6&ۏ\c;O߽4T]z8+PqH(X#qzsonK?Z +}=0#Fi XܑjW4=•!X ǹ}ێSOQN[BtN@̦L@MJ+\=^b5*!a4aN5:qE RHCP < gfhIqͭϬ;HxdN8=bp^z6^[IoD?Vb(Ț86 !ԇI&6hDYW{cAv+o}M_fi$TS|Te%,Y˞^Xp"U%y08tf*,6P6NZhpjcg]foy}&pf QBx_$IŽ`Q^0]uxOE [_ʴtsE]skpl֭#v!uQy%5I\O(}]$d5M4/un|pI}jBHq8q|_ 8?u&(7"lF`YdL@Y@ ؇قo2 &&˖G9 J}(y쵐 A8 pq7{a_]ĉ%'z2vNF3*R}zQQdI C{&ڹaFJUH!XYdWvGz/"@,m&/ίd!-4HZ<~m`==A9]3TKgXr(;M]?W;ةPU wE-*~VQ-[wÅG=nKp<|?O m^o.]/vubpODn DolyGwx}gk[6|K?81͌/Æjvt`u@4=  ۾;CWQ ^bcPe%״'Uteo۟h7]*#y)(~`/lR iik1rQ;b㥙}GYؤdtݶʶXGJqnӎ#Z'aQyl^B<&n]v\؅ǚ?w_};_^1 6^ɪޑӁg?{'udmZpOevk>44[Zuj72ѻ\Z#yEe<yw)gWNMcj#U^YѰqaI4Rݗ\ݿdGE=!F/(Ce PI|(_ؚ@] 2DjKVlbYG۠,஄CNY&8p= 0quQn#v_aͦV4 i;;\߂%Ǯ[+6 :8?wΦoG<6}έyAt Or8yMKRykƦA܏&'+'bOJESZeuxܕTڐR֜Vgu~!imwچGbhς-ԇPOEF-5m#"]K2گ슮i:'Š, X >b`KX-s" #L[c`mL{A5PC،={U\o>pγZuΧ:}ʭVmy~i00=ΧFr[7v0uNfv0/y1幬8wq*'2̨;Eqb,r4>8vJ,;x*wϩԚkؿ9/ȑ ]r#@|=Fn.h wPWEa~؈l}5X윳Q80^+t7 g".+Y/pgݶue$qT^@9Dj`k}+04znqi뺊;_;|>1p6ɚ='r\d棧+3ֵ:S>>`kPf/ 7r~rrp%HAK-.ơmKw>S`;/z7P|Y"JxL4/) ,y7P$k+ȼ9y˙ Tg$i셅EPI.*Ch jd&4mp_ȷM<+iج%58qyXGU̸V, FasEgkb* %1CXJ4 1ᶈn\BDymdUS2X#:LØyG´b!Ṿ<&(#E6UXC^#*i[C~`0/DOh4KqSi_-A{T I\&Sz M<-uPmQ',B.ieDe#c$[`!; eFg!-#-פjGԽRA 5{#0y9knLLEΔ;ܖrb(kZJAŠl&jxǂ򫨋(~ :[]Wv^[gIq䵭YMg0=7 _-ͥg ha7⟊/>XC|ZM"Ef:L:KYnlj9׭lvPU.3)#$&VM-llQu1|/eYQG>FqŞ =?6&,؆uyӡu_\|(gr/c 1Q{_2w]Į!tp|J˅ES % :&-icki,Z:V΢$cT蠘P tWkAYnEСXn87@ÜXygE%E;Wوi=jہ[(l""OLj2u7PK%EOA>48C "6¨dQO"m,_z_P ˫M-ThM8W(윶Zq' Jb= zuKAh\v %X ! L۱/@G$I_!V쌍dGΥHkmX4e,hbm~5 |,HɼL10mPvٗeIB;Sόu,dc=_1ta˨XFa(0¡^C9n>¨aБb'emG)ҞhRi Er{~1+hMSÐcl>ܖn#B mms1&Ċ;x @|:e#>l,/X箟lWw{1xP ̩LҁHaT@PR9m\*j_)lcVPq1b!>XIk^ "Oj At*|,9#љNA2!ҞP5 `51r{3^D{13qQV*opgϥU O}5^P(W6I̤aDV[t*W m2:sY]7IKZ/|8C\ϢXA},A œR,>"Pib7I+kז+CnVYbԎ3@J/\mef(OɸfH'մ;H4J׶E.t!*٩V"*U u̕ت >4@ӴrjO`O.G*<}qsc@8 Rka(W SU#9 6n`DYrdw'6/B=ƎwfH2f`r6 BO"霴@0,pw@ыJ*N ծsu2Ĝ!hz+#P&BS ~ҠM x9\Fgũlj$f43eҤڹuG^?EG  ! (0>@AZȢ.E Mn*F#-7pk;*:l bRy8^=$}YeX*J1IzQؾ6X4*QՂ]tjӉ<7Lg<:L<1$47MT^l yO'|՟# Pﵬsl~0C DGg.b-`r3p[4A,"L-Y0k8:p'43fiYB 3OU9 xLź-bό'Wphnh 7W>'۹Mg8TƷ_鿖 u翖@-Ӝ5d nS1d)6źq [=߭q@kƢ @i%U#jZљKZ.Mm]}cnS:}Oܰ,@a wݳn`-]Rk#~ct/ĩ &'1C͞J0Va]ODʂpS6STy ds!sFsbMmӥ>qdův9s,^S|r#*r;)kĭ{ vmſ]^+Wbj׼q.'@'VYj*Aӽ7>Yח~±kDOu+r,-wp76"$wzOg߭x7N Pi734K}:E/[iߞ-#,}mJ6IXw,rU~D_RHqvc$NEGVgn#n]dgz:k !4z( @Gք[dY9GГcpb}3ʎ+ӶI+~>쏐't8rN.ZzZ:+/ػ9vTD"y{aֺݴ"n{z}3բЍBINo"wu:[@X3voV~nwwmff]ltၵf[hm,v/tÐ ul@횖 }oŊ[bt{37.vܔGhsW5 _wx+DojT;e>stream xsv1Xb`8L G10  endstream endobj 46 0 obj<]/Filter/FlateDecode/Width 28/Height 11/BitsPerComponent 2/Length 76 >>stream x[ Z5uՒLPaK$Eݖ @I"$S0ԑ-liVch۪USCW  xendstream endobj 47 0 obj<]/Filter/FlateDecode/Width 715/Height 279/BitsPerComponent 4/Length 5191 >>stream x흽nJGr` ,m|- Nҗ 's|_tWW7 t10LP /4h~k .pNy{^v{أSރuý Ge=p/;=Q{)A`:Ny{^v{أSރuý Ge=p/;=Q{)A`:Zߏgf>.wq+&?~/Rr7Rn[l՟r5DVl96ʭ֌sMjjH٪OsΨr5ehU(7[3P3lnMl՟nU vk2e^o9ke`V5P6X([0ObMl՟kުy >ߞs)h>#e\V96% |N9M)o5_SylSrp׺ ޳TOnRo9K&uiRf_Y@䚷DB5E ~ˤ Q&=Fu}=,Y(%"DsiQ՟k*#e(eLl5}=,Y(snEe)`2ꃗ9dԢ?'׼UN9MN989&8%8rNoӮc)?Sރue ^0)lca'c2_ԓ;Ħ` 6X@M,Fw2n2I΋%DireI(YSQE9+ty?M7D7)dSћr~d ('7e β3t3Ppu:<ߴyY|Y8-aPĦr2OaG6 +_D9F#e˙.D/ ..X2B~3PWRe'ߧwz"ELfD y6@.68*`WIZe9PҲ=m^1 E 63sPFH?"HQU?DqrG#BW/ H~B!e-@UǮ*I)P(35m8N9& (RFa\4N#2v4Ҏ)#  jmk#"ј!Aw0UcvVDtx/k+ey:UenM1Ҁ5k QVz)eZEFʌ9N7#~|}]7gW1-8eYqL?)'9Pg%_X)cb 0Ve{z~aOP9VʈN0LYrF- %hW7x /p{|q9CB^I=NRF3)r$ysʀ𢣑6}_`p5DbMb f@B"/O Tt5VD |>|Kre9AL{I?8K8fSK|L<k e1 ,Gó $ NG-x(/)'cUm>B[͔9PC+kQJУV&/e< 9 ;GqaxVF,t%!;S˴8VB 4fp(RCH<2 p#ʉmGy9|JBOPv+K;!N9j㛲ڔ)>.72ƧU?B7M-k. "YbHpRpJ$9wc>*e9b&S5q@ ,T]m[rm2ckG1krq)~f'^/(KK0)k22tRTPP聽L1kz0V],Gy֩.rLp֝fQ B٪*uQ~bIu2j};\(Jyn1'fM2oCeaD͞fpBM2$} MjG uYfU1+j%) ^jA3y9.LRe`\2Sw\՟2k5E ˜*1eN Pjng(-2kuƽ>!A$[A?hƠA2\R^xS?]IXrWR(52}ʣǺrro 9i(=irߥX_ǀ.B&RU{PΨi#q9Q{q#`ro2.ҥ%tRT6a)69_Z47Oz78ED_lsQܜHY<'jdͤOW*V8_*vIUTW8$p/ZPKl_wA`kZEo̷".NV28Z,RmꋖD8:N˒Z׆ؿ~eŦFlܩu*p@cR"R9cp%ߐ4RFZgN9Tw+Đ*/~SV2 E_4F^2(HRƇhm2xŇ:Bl),;J?@YE;o ,;MB~t|dʍO}#5S_22*8l:`~x]f^7{ ݈ ƼwF&v`IxX 7Seb?6vkU/1XrWPBǦnMl<2>\f Z)I ^_FҾ8D٪[} %w|QPŚH٪!e4,O<%xW˿!qlկJye> ^F4`>xGwU_4/ORR NY.Ura[Mr2ɽ\VzӪ/ƽ,ƭ.bś/D}e'qq/Xx~=i\Rޤ'0 |5iamq/3V?K 45N씛hey hf<iznsqXJOгlzB-핀vN-a2H/N`,/=A1Q^02H~R3!?ɁC "$\R5ZaeSXaǫE885$;NcZ&)賔H (5Kʸ_Hb[z)Kj#dgFm3R@51Qb 5)׬^D%J32[rN96Y0rf3媕r2s͓[T G{^V|iwVv/ ѓ527j,\?)ƧU {{Uu8ec)oV)+POaSbOC.cs/IZ,^ѭmMʧw\թ|<8Fס=USQNkOW<wMgZigS8$PA}֫TP%uSYNy'SOf:12<4deGGiG绗G |3d deϊf@;Y+ gWg p+@]SE)qvNy U8YD+ gWg p+@]SE)qvNy\lLJr|b~o r\R8S5MNyHlܩ]̪S:4S^pe](s_Fc /׾wY)W(x)gCqo=u eNy-'e|H^^3R^:2cջ ^_FveDd_]]/Filter/FlateDecode/Width 498/Height 239/BitsPerComponent 1/Length 1610 >>stream x훿E-8GԒiH2 !DpV -d֧ .BwvWTa<%kg~_UuǁC^0[o(P-*i)qwkw޴*N9 F;>8|R_ϫ׽}?ubmU4%~b|}cx;.Z8}aU>\4o _YvK;PR/NqCU4CR+n ~tA/x Cu/k&e:x+>^O'm]_0.'_{-.xG m7g]=*(棴ץkݤga.^W-iz&eb7b/>iyqO.T-QLsҭ'^{5 !7>xz<\A <^֗(Gn'=sgEu])ž~{ymӏ3d:QoG%]s8t8Cl{lۏ}=q6^}=f1>+ltyF"8C6NO1_>\4o 8E8j .ք=6lnL,onW$9qGeAk|:۸zqUwq5=rݐg=\wnYau+gj}(G&NhK+=b` K݃, ޭ|.FeW:si6.pk[y%yX ^2ʑ5dvpI,6O<}Lg#O_2[<.≧/)^dwC >Gy#?Ex/ܲJ#~γi6o\%UǨbܞRҽ\!Hs+.y!HW-gv ώ;8!_)}D0/ Y!8a nDhXg+!H76jd4u-.wߺxCHendstream endobj 49 0 obj<]/Filter/FlateDecode/Width 498/Height 239/BitsPerComponent 1/Length 1498 >>stream x훿nG P02 )\461 "J)]Rpa@J> cD(|svn$AB&g~..pu "iξ#/2m.m rp9TÅ#jG1(k_ EྋCYl+WL6X)߇8\< 3:>L~ȻoQmfc~Cv͗C^ϧtGm e9T{4gq]CϮ[DZ#& ' 3S硱J%>7-'-';酓@-cm\r;eu2&/MKg?u'.)QU[id^|q}vR \m&rj/qV_s 2u\Mi&vCZ8orJ$樜=LdW;mTJ+Ti_JPx/F%Nέ؟^,bu&q^rG4~E.x);e9ov)˼@aryYeh9D} eJz36FN8Y< Ջ9BivxVR_.m8Gu7¥xK.e9pR''W'.ށU0>stream x0 EC%҉[ȍ#eA9xۓ rZN[I<4jVǚTbKLx_B>k!Ǝ|D^_jւD&ieK#y,ݵey`.?a%s_XgfeH>w4{X{|u//OZ'U|˄(5{޽_55;ߧAs}|jy);+hM+p6{6W!CKں`͚G1em /OMx"^1? /O$+gcx|쩼^BJwendstream endobj 51 0 obj<]/Filter/FlateDecode/Width 604/Height 183/BitsPerComponent 1/Length 322 >>stream x0 EC%҉[ȍ#eA9xۓ rZN[I<4jVǚTbKLx_B>k!Ǝ|D^_jւD&ieK#y,ݵey`.?a%s_XgfeH>w4{X{|u//OZ'U|˄(5{޽_55;ߧAs}|jy);+hM+p6{6W!CKں`͚G1em /OMx"^1? /O$+gcx|쩼^BJwendstream endobj 52 0 obj<>stream x 0 E#1, `H6]/Filter/FlateDecode/Width 628/Height 183/BitsPerComponent 1/Length 322 >>stream x 0 E#1, `H6>stream x풱 0E 5kCقJfPP2)03P8nY~,ۘ[ ݝOZA+Kg=-g"fveWWG9U5#'ʇ1MpgndFXP^4,tHv@Ҁd@H'````````endstream endobj 55 0 obj<]/Filter/FlateDecode/Width 270/Height 166/BitsPerComponent 1/Length 263 >>stream xPWo@3֣B5 KG(BS;z#ݽ?l!@s_w©Ay7V4Qendstream endobj 56 0 obj<>stream xAkAŞA9ЛKm)5W=sPד$͓vEi"cOdwM#%F)sfݝ@7{oy _x\&E3x 5=^#?pp4pJb91x78j+25#[kwe{Hu=2wއN޵j_{vBll~M6UִoijGvSm׳Qw Pf?[Ϻ՗Wϗ=FU9i Z =g4eYh&͈4`Á@h 4@h 4@h 4>_!K>V̏2P-/gC>gtU?Ά0HeUgT S](hݳ9@tӥY֜EA PLs5:׍z;9>C_E }'`e;<ڄ 'G̃FXħdLšhQoOK_"R۽G Zi{ɮ>Ȩ%"2NBZB"--멜կBgM;&kendstream endobj 57 0 obj<]/Filter/FlateDecode/Width 338/Height 228/BitsPerComponent 1/Length 774 >>stream xkA  zC^jKz衞B(:{D"9zݢ4"cOvM#P#u9Lf0A!dޛ헗ow`YQ 49 c4  { !L#>Qpn4^;p52A9k9odhowj٦6]BV|(k~`vMo+F9 j/B]+87/;w_>=MVe> XFaYbB|C|aCaꈏ(uYL}Nz|0#CdC M*r@9P(:b7DfDU:Rφr@9P(Lrc(Yk4@^n--pYpv^؅4zzݴ/TqyAZ_yT3l\pZ휽i/U-~)OБ؀z9endstream endobj 58 0 obj<>stream x=K@/ -&.E"CۡbHqc>nBTƀ/"tOr{̋rs=ks)Gv[JMxcA rULŽe#D'iЖ.Q4@h 4@h 4@c Aendstream endobj 59 0 obj<]/Filter/FlateDecode/Width 337/Height 168/BitsPerComponent 1/Length 787 >>stream x혿kA/`'&K; F--DR(26B8wXR b!(c=f7^r"9؛Oo|vrD[yHzRHŸ>QoŃDbU: g2$Gu 3hBԮuDa'LtO9s~xᇏ3OBky*@*[|#=z3ܗ%F&rFϯn%mk4 aGgh3>l Tsqm[-λI4/?}VYJFTuHwvJ;fG"h(>U`|F2 |E,ct|A  Dłgvf0 :?N@b \f rh)f!kʼnjWA)*ւf,5@2ÂđAy*fڢ1)9iGAUxQhZ@*:Pbo+*1Vq(1R1GjFU/FUT+9}r-+r2[H@@G H =fo_TU$jQ;}I*cOвk[  yWKl?`kw&aqmBW7ӯlme,xA6ڼY:@ͨSH Y퓫B:W6 cUn&~ s1jT 'uMؓGrն<<`WmQ0LmvdٿX S.VnwQ?."endstream endobj 60 0 obj<>stream x1KPǭЭPC~?NbDC "]R:T_7)󒜗'\tݏ# IEДa܍ *:v'!8T"| }0USV\U1TՏocT *8-C_oV~5:wG pqA.E]n(n%] ]uF3zZ?3Ϧ.e·#!unVݳA/.kfo<ےZrN~JGbP.\魪@IX aƼ&wB毨NILؚoB'S%_?5ȶ2@ d 2@ d 2@_ũendstream endobj 61 0 obj<]/Filter/FlateDecode/Width 337/Height 168/BitsPerComponent 1/Length 1020 >>stream x혱kq[HBtȟPp))Rl(&H.J) Jpn(W)r/qZz˻O^w&Dŷ #~OQ^/rִ܁ ,m.@]0Z*!6ҁuP%;@N` tNz@(?aBY+Z{6'dU15cVi 4 pRE8D}a;?w Lä8gࣵf6Eھo _ k5^[gUڶ,kKCSV uQUQІ-X(+ڂ_43GǎVdUZnmQdfEHЗHkkuk#h6^\u )RQqendstream endobj 62 0 obj<>stream x10Q ]/Filter/FlateDecode/Width 289/Height 125/BitsPerComponent 4/Length 529 >>stream x]r i B/b1$MJxGI lގs;anG@K>stream x}Ti5Nָ q$x! ,HB\'=@;XU{{{?:T]]z= !0A7G  lM>4LNC<r!^<^0>c b.9 b.1y!x< 9@ l5q 9<ǢX,7 V-X!oΗ-jc3L\8y0'.. wpOuHd`<]w<DǰKPo7?׍O"4FB7BZ r NH!ۃ& QL1a pAfL9OⲆ?4 hi DyA =4BehPÁăȣ1$ %WZUנfd?#hCHDOb!#t0p`ߧ!# !#A!4xTaiH'&,O3' dcp]̞&?=0x, 7 " ^@S%682 (5pya_@ rcI3Aaa?㥿?oO;p;4O(+7jŏc7P]Af < IX^:Ca}vW7>dCgà s C̡A@`TfzAnP3o1CrXs|v\7DB #83jc  B(h@7pt?sߋb 65H}TK!&$BGM?{9 # I@C<07uCX<6a{9ޞֶ^}yֺ mVbpL.1@g]]S- ] m-M--M]m^>"j@zFm1: 4oę* 0&$9diD~:H޿s߉5}Cl mHC 6chC jG\ILz.m0 a0}xv]^g8<&snonwnv0uJ[Mv~|PLgt0X=L0=&vz]]S5>yӆ/[kZۙݝ}ށ~@Ib;ÅP%&~W+4x4r XNzFA;^ȽGbbx'G'GMrwqV Z$ހ cnbĒ ̈4>/A-br{X]uu/veY7Jng9Pp`ٽǟ]iKCǚo>r^ͭooy~ËT{㛛u:>7C#TǴ ,߾*g~5? P@3$Ȑ<_ ?ηh3n'푿s߅䑏Y;ׁ@ ŷc3R#LAxMg {Ggwvvw6~}|Ņ×fIZ蘼!ygU#iqsy[='>{Ӈo{֛+_=U:lnʄʞ=8ŗfzGXRX!QZ9|RԌD}lW| g8 |tr `TH4PN?\!؀$&iMw  ^Y A|Q!$Hxˈ`º83&w4y .慔O^b9O/iRhx~<\'+M\wD3n\}ߒpP3a@$@C H {5@œIz/%؊?ATH@v1zYΎ/ou귲ؓ1KUϙ.gp/JHBMi]jJJZsœ$o|icw[@0b@B xuۘvMoev447t6}kzc}{]cw3' z;&,B).xwȖtr]oyɼS ++.̝"|Q*N˙$''?:Ԭx]RFY ]?C=oJSO,'m&GgFzɃkj477tuL&͢dL J@0r>J߆PVd}CcRg`mm <~6Cg;휮VfS}ǧo~yGf[  K,Vj7Ʒ1j oٜnfOGgsc/O?xP^S̓n~pacO- msz Pwyq67ȣu39-||VIĕe|N5;L"óEf U?՚g\w|5Y`w56n?Zk-onz U͔/(&oͿĄUyq뗷/6t~iiuuӛY+־SD[UX_<3+ 8\ea[>lAj d& r=ÌVFǖgz^`xΚ&V7q@]A/89=7<yJߵ\}??qxXޞֺw o>wW^_,K3(spd Rޒ1n.⩾ʻ]BhV(SJq5C6S\K+MO0ϛA]YFu^?MͧMk߽kzzVS+ gơ|pހ1jL`p𣀷`6712kkhQN"Cx`厄A~V7ӷSZAڽ/Op\=i𡽱`hؑ3C͟ BH7_=7W Z+.gnFyEO~>~QW7u w.]:Q3S&]$S`wB!V("i( #SFA[4F5V(JIN*$S>E1ob8M'=X:i#)gJ=q߼o|q6?SYwցf?Tbxd˔[2 \FPW>yzvg{:II.+ r!__:K^־3}ҖϪصRnUnMG}SoGa Nkʿ80 kX\ȅ T/~{}vQմ_oDs~l|j-Ϩ]z*e祢+ ~=}Sn_?Լz/>{/;uws"zԭkT9Ǥt龙F L.0>6 ÓL2*YkXRTU +ffdJfzgx揗/_:2o6mnuKNfRQxp/wTvO}yu~knh8@ d sY=Hlh\ͧ_?ՋǏ)/p؛'m[X d"J  ymo}s~Uv5'e1a*_'Ok|Igr8 .R!0ϒ=cWuSuCI雧@hNf]muobzQ2F{ďyۉ񦤍v q vWbgҚiU^;Yq;Nݾ~ޕO}Iz%Y'cN)&fηSmQF԰޲]mB4VUv) C F;V>Ϗ`Y,Q@Dx*9vG nC* bG=JҢylYVrWX4YU}>w{<'^m]ua5C $-?חN>|aFQTP{c#=~^~jljieO 3WӈI}ˏ|x=O=w*W6f,QA0^ 6?gLmFh$1[x́jq.bF(~:p) !lu86:c۫5^?8z{bt֪qpreeIuMRJ񷗏jvzUĺGS%\*ɸZ#-bO';zYq vbR6(P-Y4L'xC5Ѫq"h(ݚ(^_0P T$&j'h+o-g)k!nȿ~G?ɢTB.];(C7^qLJV jvKUX[4676upޡFp7KWE1;vWԂ)OΝ|v/>7}iCIofֵգW=T}@$ ҧ[ƸR,vP#ljz 3=*v9vU^ܺ͛ϵ _dpY 6p)8be#XC7H~W9„C|`lB?ldIy*vJ@t&hqdet*tO2>2Ÿr~&>_2_ݲ e }tܩYNJI62&bFDrryv:Efپ&U_^-?.=^֞'O?3^V>Lxs׼_y_{v!v/4%go|݇ׯ?y-г=ǗܬH?r'd*ۨ$Y+(GS}LtRЉ_Jso=_ഷta3!D -A ;%L` (t bSv t5BlD6ޯ3}@g dHA@!pE=~^/D@z>FU#@i14@4rTN~;DNDc쿆QnU Iob!B|~#WFo>8mbtHJEI(6F4n[mmP5 ErNFvfdi6QzTQp4<1Bq|i4T{4$x{X{GqX#H](=h]0 `%,ڡ"tbEh Zڋ<ڪ eYKTP|(F:HXA|BQ4G-TP!juK\8WCݻֺ5_>jʸSQ f[cul4j'eU+Rn9t{[OxxsNM 9觉sr'x)GͨM[,4c/ݾ:#ʡ窞8E svv7Pl\_R@~AM س|*O|2KJ.9'o*_BWrj, 1KFN^nn&rqJYJ ? 2nl}!3#MpN2]=]ݭ Mk?߮=uZI-;gXZBB_UHn~ʭߎݺvS9vrGj?W-ʙ*AGSK8`9WJow@ʸu ٻo\S4sdK\XeX:丩%9*Ƹ(Ǐ tS Ջc䢠թ;oTfto7U)cMIVM)Tƕ~{ћ/Z:ZZm 9lY4 sHϠQF32m€N֒s\f-޲!QSxt~#4"1$XVozrcH3[ذS#id:aИ@F t!O_1NUCClV+Kǧo_{zĽ/=KvԨs"֟ ϶iV1øbadÒ +`ˁ&个Z讼ׅg/k/ABRFFƱ&d T {t{j:h;@iZI.* N1vrѶraҁ[4z5E   HȄKIJҗ 5Jut0vMuTUUz亩帩M2əd1(yYdP^!Sݶ*f7T:h3No=ܦlŦGV.4.o= UqLv y&.RӜ5VȻ|k }- ܵ]%*E4"k;ͽ69VV*6*Yv**N*T\C`s6-( YW?qב󕹿|p__ mu qgAZ/cR/wP_H@5$搽SH -#8*~xݦΰ0!-7W]3B+y<@H$_fb7;'Ap15̿C f;p!7,&ZɁƮ:_ęC;+"W+_fb%\IBm:Uؤ6sV@jJ:9IG =!Z Ekh*TEBRGѺ L)121Rqr,UMUIQ3 2 ciWuRSF!:l+^]tUhN# SP+4p0CPJBrzM \O\O= Ҝ4mbUA3nKST-F<)@*0GMBdR#..۝LWR)(Ȣ2h h=!Ṯeh2byERh(AW Зܥ/KO(\?L f1"Mb(VE)i+Rc bC$v[)٩3oiid{K,]scVN,aÅ w?}~Q3Hg ؃ҞT5YdS3Ru!WcF@f$%H0IԯFH!%`"cAr$ *@܀Hs5e@#kcްApĎv7%l7}@@'9؄kHjgWϟK_;#zmZ =|ʗM=f5ӎ,E+`R2 ofZFqDIvElKl ,܌z?׬da~NFjt@ QB;)(@o@`pDdtlTvuMJB`,F @NAt@3ɇ"4@0h!"~BMh+(PCPu`T[L;7l!c P+j^qava-wWiGή^ Ul&Ov5f4pNJ~^I%~Gf;^zbIx()sdI$ FZmD 1ʒ *E˅R$imӒڪ)|q4OI#wa&|N1Ro_]z/:Zw$+kAv$B`7Ph/Hp_ `,Y pfLc| 8 5`"zo~xsH zŃSdtӈD2WxGgj"^$@?yEb&  l\4 č8p\(` $օlHшCܪÄ԰iDZ~jWZ7v6v{1= &؀0POeM^fu1ؽL.y MF<@2'@>8퀟-{'\ .h 'EZcB/b/R?CSiSmNL;0ɶϪۢdxՓj-M,S(e͗f-P@`Xt*L4wj*h닄GJW$V)D3p@`ǃy")rsd݅DSٹflvs/7y/֦6 Jm@'ӈ4tqg - pP>gA,зDL9= tH#d Џ" ,! A5Ѕ4ET4һ[z{DꛚkZ[ &G^چo--<~wnCGw||K͇\)P3շM$hc݌pKcʃ, B(x#[夈X?3pʑa,U䤒b'"9롐.&"*S, f+b+bb0l!f!’b&b)n#`&Ǘd#f$f,goۚi& YKff$YK[$$d3ܔhVr-⬨)4DcC-l7PiUNMqEj*EU0^"-HZ+-&kD3Q Vت)jj%b%h.y8:p ijVG87wQµĶ!%%k o"jISvP̴v@h{\s).4[ttn#~DK$D+3d+t[dsh"(J &XHCX?B,&HIt^d\;9O%<3 3uvj+joIUi>EfEn>Ucuo7_|]S1zY=D$%B 6 /E"9 8~b r ɣCOT@W7d9P18>mǷCtJlgBz&>blzoPe6{ZA˻5/?Uym)Sg?!qI^YK~+-i^ڳٱ2Om_Q/~YN 5A jBǛ,=ӯAwcU4^?ys=^s=N 2pd A*#˷x@]x}t^wg+I9ilm閇}9˃dc!M/V9P2H ,K\;jR 87M0IKWLqP(3K[x\0xf\dDnc)p$@Bo~dIF~9^&9fyV{hŞN|&[N+O?K7Im|lFJ|D!~0e.ff%$%Q(N/^o<X&JEi(\N̍rj ^j4*}5׆щFfa|d:@GW'U%J*X4PԠpceB,㌅<4+,{% vC`%boedcڟmav-5%B$q"0|'`O2h*4&̰XC`T)&j_N^{w^?`ك˩Ǣ&ޗ`{Gwxb7ttvu{M;*a tt4wt}zCFY1oV[EI.Gvk`IEEYQNzJ5L*@ B4Q.SdUmAdQh7Cj/j/ÞJ^G}OMR?;U렷 ĝ+)fxf1̫42!0QjM M( 8]"Z+6m(DY$ZG:X1\)B4A?ޔ.QFϏ|8RvA b^+g ?&@>" g@[atw7gCz,YLxe%=ޡC(Be7.$'3Ä`Ӌ78QaN/`ǝNOo>rׯk=hyUsm-u7~hy[%ٻKN$%L2[E.VBdB!~r~4_ap@mWNVYpv.CիԎ)=6^ S L?<AOFi؁Jʎ*Kl5P 4fib ?z]zޖڮVhFomf˽M/Ѓ: 2Zm-Vh<bwmN!Eoif44~z˛ۗfg,dD}4ڠ%`L߂FqbұV* =0SH X[$7 WȉV+ٽQUA]/w~n{o_<{G*?DՃSOϟtJ׫nj/{?~ W@]_ __BO)Jk'i~XC+0]"l"U6c Ŝ鶧6ͬXW̷to VO^@ =Rfڥ̰Nn>:sMTDoj\\o $G+Ř&[kfeiyd}hM^7,GdkJ|h 48sCA(ȍ0 ˤ7A\`q!7 宴괸/ou5|w ^4F(,[,%(P]y&~xDE·Fm 2Q 8{84Z|j:'jV*z)y)Q mGScaT>g4cL3JbZf~h$Q^QU }^e>Z~:fYg{dɦ% } /BMsVKtPb%(YJULb6>Tn͵AN_A$DM,JS,F_:[2yD R;lw$x AبvF*D*G(l* ʣMڂAq`x94JE{ ɷIҗK3)u0`[+chTjcxQ+5ʽ`6phJೊ6? CvDD)ezseG˶}$nIڭސw6i;iyһ#yos)xseU=s˼pּUφ~~fn'=-hJﵑ뤘 l5h.T Sy\>^T;놉~9"CgO̟dn=_ / 4wGK][5p,@zrlUV/H\.8GyL*@_QHSJSS"1O[Wt&;7M .n? xKB>vN?A1i a(A [ ,H4"#J!O}}]6g/޼gָqiz:)F2ɺRiJ*/s`^lL..|OԪ,9D[@'Ҝael![C:R5iZ:n=*xVzֺo[Oα:|i&'ӯj^q~6+ FKpO`G|ĜPƖDt׬Fghv(mo`2¡&B(X 2gB4%#c d$DIA:(MaqU^GN9:UzڧhI==zaf]CpF#5Ri eef9qP}-DŃEH(Tt$i2 ",bDuQt9udf0k%*zIg;p]"%|~Z'$CBh'E(X?"K?m5d^GB'B'+p7ۃ)2r~OU0TifkC=9SLUϕ#)X^0N #Tv+l6PlZL QV? Ij0BCAR1_Pw?PR?|r~U"+l*0 lJoWި%U0Yg|l 5ZRK~Y,sT2U*A gj2gaFCyH^G"p5qh _.J(Hrhe ͂4QHldnn)z|ڸhPRr#aslp- B@~P⪿St"={vrE4G}nNJZXmۗ=A+G_rw:S{ S^{mmXPẀN OjH$ԀM8W@dsxC"Wa# o\ \jÔ}s4k%N%2.՞ VKW{H;'wdQ?NM;=IT˳U8=IU:^:&ojQDAb\qэbT#4C2%F).? P M Eb/f x| tɓ 1Ew#Q*@E6HMeU5PEi+Ev &)kE7KHo!!/)"FR@I{@Y]g˔;$d:C(*#45FǸ .m8;.q^$T;/|cu 4g91D0N._:@~bǮ>Z/\)ʯ`xo|kGU)c"ܮ[tNi/.≒)Qݫn4񲜩teb*4]Y!7.1QL:BwZ60]af[hD'j4c*m zT;hw8L NK5:vko0HHP3ߛ7Q{KtsŚ݅]e# xZ5S9h\L .](=Xvj+5~vM>תdy&SAyR e&K3%Jh`{y>Y쬬}TIOi>A>I>͞'ip[fwpEUCnH@37O%cQt0W` '-(=Z%}|+_R /"mگj-G-R \zV# yn``q0p/|wi]hEpfIBzq%1> <  t=y6y#rde{v,c,Vؗ ߶_#V#y8" }U+'Vm4sUV]ccOw>KܫB[W#^WM|D'ri}F8Yby;/ُŇtlm>q5gJ]]>RiЉEҙ\a:WxhK-W=zs4FkU_A_}HIWK+r 4bnR>)HqVooux_Ax,1^TB>VGmcple!ݹj♁7! 4_z;OsiWO04t="3h{"־;dZ–=l43.up/1)frIa_gd2PCs%ȰϽ*:x>EREl*T8V~*pU/Ņ,5Jnp].יO^:rv@wv[ 4,ҧm F61joqvz{<=e.xpȆܣe$[g*; 5c9=@QjsIUoDryS(J'd@8rj\B eSM'0>r,~<|辫SWf>T;~W?+/ je9yo߸J54D=;>3^w1:xd}+sJÅቢ\Yd,  M'VN,t<}hbE:r <c9BS˔[>=SbcvJEɍǥ0O%ʍvyS7G3D>y^8y]ѫR0,8NHv$W =߱\coTQ6e|Y6sVF]w枰ïz\(F{CeWh |0&\tZ:f]; tGN,$El>WpưϡE#KG)NT<:LqrUGV\&YXTM<\_ZH鋨ƭc$*]==k&>Тz-d@7 :a"(ٗ:Q"C kL'YeBJ*5!҈N, E (l|R.|2An<, (@SPJ7!-r y*.nrpu5yWvV 19I0OHA|V-@Vlo`0_s6xA}0Ovh(NrTf˴hLaņ ǪjNZ8peljeO\smO>OOΝ;EXug+ ãȊ6vy5_;_?ܯzGn_L.0ÅCž?(gpROT '!Ątz,_6/+?CM{.0.5@eL' |S%ѱXGWc7|/ɵQ=~ ud8=RưưRPoE#,1%]aIOT1' ap" (7YBOD4u6gWVPj3Y6k9=kCM%P. T*:>z"nΡ`8wvU,!M qaP5ULB'+R]m}>s E̖sUa)XgBza=?؇ }VzNôKmgrry-7ݟ([ [Ñzd̒Ӥﳘ1knd2W1Nd"aO|oϯ_jG|WN_Z?Z/ Q씯L6)YIOH e8i LĔx!R7%I_CӶ5m.~ZT^?(o)J7HMRPj$5 q}WTfJfXۧ'i |"R+?2Č  ࢊr2& L޽ˊqP|<ۉ҃dOG;b"ڧ;ivv;d kuk݆fBU#HdOcs8 D Uo5!4 Fc¾|BTB:׎T;u7&O(yv/];:owahWAd 4CN.pM|Z!BJ6xC\{gTWσ C'{ ȡuz%}Ȁ cqhԖ ɧ~ɬ}cZV<ïU 덴3$;2jL8AE'|:0I %л%Kw죯`^NR ?oGwu9F_u.p蘽;o}^?ϟZwؚ aj6%M$4X%@^+@>Z<9H @#"}MЙpgs]eޙBTE=d@I`Խ>غg։ksB\ܳ4N!j$%i jiw1&/1 ',*^YoT7@,@6L: Ö kl̪lq9jjFqJBmjM:|,MwxJrF5DW_VGWYX]J Vd?dh]%cHE 2}a6D `QldFpxC P54zkksFfhh i<"'HP^@$-̤\+]Km y|l r۾ྊW 0;$'#HOӪF˝a+GPGE+D*|HGԼHUp†?BnH"v( {B,wEUo W"d &jA TZ  eR{w:3??O{m re)PۢٗxO}KOu zu]y!ktQiԡ꾠0~@$8 gһʋXRup.((L G޴3Sȱ>VDxe&fQտ5'stGVzÇVO^|ڼ9*˷,=zETiHdB"W{\*~^889XdlCe>uK]"4v\ٔhG=!}m7!lC&ͥc*Ƿ ֟$uKv-طrᾕ fWd+ 'uwB=9\uG.W}9ѕ9}n]D/ms+qDS;ᐳ.8q~gǫ>یR@_/DLDo ?#Hvt r&/.*4Ǜrqd5;duzaNءjBC p )LeD㇗$-NrCFᕙoY;`8o6r~x9|OFkKf,=ʣ OFNwvFf*ӕيh&ٝuD]Pn|pªK..LfR4;žs 4Q,#@юw̷;F39q瑌l0WJiqWkwk+E);uEѥP}Q3jIq 6N]sY(ϐ.u>S3o">\gA}]OuУ錙P0b6rxYТ\izwIfpbϢœՋ;3%t?4*NO *BuG#b|l-#Wyn4o]:N٫*E:‰('A<ͬѡjzpǷ/?#鈋a 79SZt`KwW̔drܗΈ#w2Ca:){/@vYyQ(٭ȓ'8 ŨK?6>ՠjyQ/~Ύ4y}NT}ۊCå]XڃƭNƥ4njPK@KWWIy@;I";}ax&]ir]>:N~&SN+"ߐ]LE#+³>P{xE᱅|]]AZcUgKx=ɂ e2ab, VYPf2gWUz̑Ǯ(=`ECsN\Yx|uhϽ }hB}uQxf,ìٌkRFP5ۭvcӴͪ_Z`_+%3w2lc,"ZOzs^ٞо({'VZ21[UL02y:Ox?& S%|Ap(eޞ¹=UFfnj oZt77k0KW+jT}$0mr5IJ$Ƞ;|ҡneC9"f>tW]^ppqz"Ī|t`n;uZt(%5:%A*9nG: hQ!Xḇ5uZJjyϝ?*|\ lĨD:%ӷΝ&/<]#vty9ψ5䌽n X+FvYVNYcq4zd< .k\o0)qd~f7JjSWvUE{Aq.6͠USQlm "UKnLU(zm($z"y|QˋO4^wpQY^vc-/[\ f} //<ySW, Pj܄uOJۢ k&a&n!իkS]%1ályeWT\ZwQ>ಢC+*"y([vTf*-e|G:5TH36M {w0*uL-=>OC4a]}VU MK1'FKY=_ԭY;o?;ꋨBdk6b%@…~kwn%٘H#*S4NQq+ sڝ. $]&+mqHa5_mjџQJjM2B$f<-GYrluIaj8اjX3&qGapbS`N%N4LSHa›XpO H|'<.|W|r))!jiXb- ŏ C2IrS{ċܖGkz^|lmS虩q\1cKL0͡!lҭ$2%pִ݄~=s9 CaXaS=.gżt%n2GGE2~Y\ޯUʊBJ9Ub(֍dbF a8 ?~c3nIֈg08 ]Fl 1 fbMJƶ ְg煃 ܷtWٵ|ɿ{gοqk6WC[bY("w9o^z_/>ֱw,d I\P~b(G %G?UU3j*y"FV5 .#2Y F2@w 48&Ȯ%Ik⦎$ޑbgR疷q< ldcMm )gFJwi7(^j\ﴁ'o;Dv0lػ@v,#0Z,p#08y= v灚e ?Йp6MMq)PRP졗d̘[%n+ܲG{_Q2_!?Q冿̻Hz̫}M뗏..ֆpD/Pt# 0 C\dl'A#wA; '@KwoYãBZQmW߂RmyG>p5q sg5#qϟ@J4Z!OٵcdEz6Q:D e“ed`A(nT]d[f#{EMa}ҨׯvPb5D?SΙRqzE!ʜEc d F(=8C_IT۞r *.tUZ] 9榔=mgX0vЈ;GlAA!#Vy@%ߠW>W> !!<[zՃJ n /-'^uF3~|\lp7!\ AIGTW"G6ZPPB oC_tYijA5GU-qeG=dQUnvts4MIMGԕ"@:J$ž6ǀu\~di9b$7a(fE ArjWjyYt4OJn n 1IWBI3[/Am~]/ޱBhm;ez{Ռlcf(A1Th80i^݆;>Y9wP^8/pGNm#cjU%eb;tZUP-r拪]1@-30Hz+B൐Yܳ0g߲ƒW2Lm:8R ڕ%>$i2|:s8rEv$\M1OcȻfOA~~L^aؤ1Pk@a]5AT{GSAq!wVgm3f@.kGnl{ʷ$"vO~gH>UC4ϯ؞gݜwVw(N86,Z$ISOXi蔂}IW\x>5.ǥ"} ,2W* ِik|tUd ʗVl?a!~YxHh@% A Оb!0o .܅(qEE9 Txے#M{R#k-::ZY+ 2UbVO/ۭ ZFɤ0h<`To)I]lF/KWC8A.J'y#z(r1lcE^1'Pp6s$cg})SGDP}A1m~?;e:8f>Q ;8;u+Տ~tWa|a.q/~!܄yRAy?bޮ#/uԄ q6"HSA؀vv4ppMyeaꝅސj8mRc#,9yU6]aWiXG '=gMhHXZzbM*goBMd |^~\|ŐI'S+5&t%y 9 9BB@nt;0u~_]}má,\㖭JuBzqvU2ʂ{Su~J@u(u̔brI>E!O]#DY؇F*!} |kkzS"F$89Αq#SeQ7ˇVU\V~xOaj8N&>A0r1h&nYO\.H3M6@3f6|mܵDb68eR M&FzYBM[[m~VrWv$̃y.~#ۮw >@GZfd( KU/Mv)EZx]K3<cH nRit)b,n7Kn܂K1,qo/} ; QAOdžbf~MsQq׉1FJ\%25nuOS;[C|273MC.˥=ˢ{c1>x_%lxG3]wC e |WIdc^h]=Ow[/00r`yqEvꎘʽ^x'w\wun e6qoF >+l@ xE$b 1(նND Βy#~)hBcSD2xyfM)K[Qkn18:)lfLL-4hyVzĮE`yz⁁td0EMn&m"46dw*wUmwۭ7ؤ !!"R!M>qM(:lnL OBw~:R~͢^ov) gt\Β$ С(ΥqLxi| ӛpF&=@ ~R7d"+v\UJA2Ģ%1s8+SpZW~6p8uNYSZM_@/$2k-cMM$uHP"y;^*f*1f|Vާ%"li rBCI/ᔏEMPFGFrU*x)MD4= \ #UOv엍?8?}1Jpz }Ln"hw9` րP< O7$0YO'*א:)Ro [?/kTQ^_RUQUJ-MUGƪRcP!:]JlիkzuZ]+m4)X;y+QK*<٠bҔ x,ZwIsper_2 y3/2 : rhtT229-N5vmO^*"@d$bo&[s7 -9D.;m zL1koWʄł3* faeFy{+ ܒ4'Nl^޶0޹83h|A޼}A ܭtjylI) `;lBtD_>bz(V-[6L]pYzhMJ v-Ź(ˈuu:btZ(o#Azx ,(p<<$wN]E $L(ʕqrrʹb~fpmv29֒ypu#exO~4)dFۊ6c+2@S3X;4e9J? D,^VY|+vĭ"y r."n0?J<"FFMMIΞxN[< nv+ళMv+-,L玖 =&vj^{΃C3ԇ}zBfhRG҈>F1Lx_ϳ?1:6癒j lUXt2a(PC~SQ}yB)N^umTɯE{EɢuX[:|pp0 xΡk('K/ $^чj(vq G)$ "/ѐh*JB QQ!JPϝ&&a,ȶJ5 &t3iHVݗ  V 9>j{҉!v5FaVXBnXlX[rhf>s_7geB h+uW"[!j m$TY7Ƙ[,ufK3d#/dMnY j8w"'Te|ҽeũdh6G②Tb / )f^ w!­)k;,@.m ܦ:*ć4I,5pO+L)5bBe[/+[d'%b#>RgdvN>~ӴcߩޡyQުb'dIvן/P@I0M'QhhxJFsT8Tb,'5;"~DwpDd Ь3K!0pڃ)T]Ay484A˰Цw mCθY[+S|F"D)=%p]!n} e++]RoK; th:_Y4])&o:X &IE<ٮgZgWP[#!B 25ۤ;SݣS1-^߃ιh)ظfGnq`lb |04;H7J5k) q+"eΪjnԨd6I!).#CVM5')y'r#ӬL4~E|xqEiIx@jr(/אmk;UN&~`{rq\v8e8oU<JvrJ"ťQĽ3b `ocƤE2K/eb?_&J7o]djE%3otף^SgpE8Г uړtF2-GV˾ck6+Eo4f!򶐦=@Nj8>qZQ8eG':-A Zghtzd@"وyX!ݭRj1c@{ۓ8jλ 6n#ն%l!ozore@:.k{u}8ܚ 4Eq?LptnO75@ 0m03슁/':o" ~> 莋^mKEZDgLAM5j{֚t&^}''Z[e]՟rJo m:eY kklzzOXoj9d%iIC9"`IxPo `HoX Y}@a'xfDo)8R44#N`|:+\&0[4R:9nY ܫ?UJUv8l#HGb= :WbW=v{vd_&>_:RN4QDp˥[|yÑ1r@0՝c,ueԦj,2aeQ JDX~_zI^oѧe] j3gտj{[ϒE#+5ecH[0,1! dnd 2bU-ȭ7XPZxtŴ4fdF,Ĕ`J0G(< E @PQxn=n@j @QAOyA{A%/PpnXzK#rd8;m1g+Q۸z;pwN/u~k^8}WO\| ޚU¡_?޿F/nHAbv}(_SUJ)iq!1IYlbS>RPbt1]emu(Z~FNܠ3l7*hJ.,ӱKȹH&,Ww-w޳=:L^|[vsSXU%OZI}N&X.Q,X(H#:(ξʜ%=%y7(LDYqs“ၘAJbR*` .Hf_9dSdl.@ϖͳ$ j z"t5Ԉ&TDN&^jp8̟$[n7[jFN-ݍOނG沫G_:M(:Pb` ({?hcEf )ڲ 5̬վ?!h"FBx)Qcu<쑶d,~]!EC4rL{vv)D`*zC^.=Z}yw, BAS QTn[ܲb/'~Ͼ?}Gn{pk§M膈FtO]|/Ob߻oL /==q浝o~קO\|W_;]8x9ʉ~^b]BwLG]!ٮ^|jo?~̫#^7_:38sׯx+Xn)|y=WC>TD5"l%8&)xHd퓯?uu9% gclk>>?cy)92~iZdFXJ$B\(7 K %\c[W?r_8=x _O&GXwFXUHstj$*[2f"ztY; -r별X4uN5DMN]̣ϢyMZlanA/CAI|˂)@=ȥh@H];Fb.KUoFɳ^KX ږst5&VPJֹ!w19#ZTiYXwpA8-TolHU *iZC&`:t6+օ,Wb.|͟z~O7D{fG]8t_ᕑ3gΝyՉxqgv bd7OyUڌ= NΜ| Իg^u_p_m>"y'y_U[}>v8ռ띺"tB",%Cۖob}?~>~:{>sӇ{c7 i0vٯ=TB$ D"JrE'tX n6K:eh+o(HSKzV>\[1_pkx,]S̬OQG&Hi BC&z)fBhPsm>@T:uY "Ŧ@|Д̅HF f$[ eMj6(I o#n ٜ_.7S99cXN[~fCY eEC+<Ν? 76lRݫzQNW׼?$|ª1]~/<ӧO\0u5> Q?{g޽+y};uw$N\gW#`r=e%Ih"J՛m PDN"Yp |R@x@RLUj#~3 G>ەn)m>,7 k|[+SWd͋G^՞*]|ԅ{Ν}ՙ3L}m97}//|nr ݫC_{N>W^+o}_u]:w^_._Xg]xV̞.ٶLsJT.D0*o"$S.jFaG>7&e 8vu[Ȳɩ"b>kc[֮5Ɵs/{o&V_>̹9v;=˓g_tE%r˓SŨvW擏0V$}p>kv9ud`<9=3ma皉gID`5֘[ N) vɃ6p4jjά cdTjjfeƖZ N=_rETv@V֥T,2hsFH^gְ_xg^pD/yJs e"6^if20(:W_>p@Rh<%V t:̈́=a9f,]t~'-ߖ^{;K/I(Ճ)Ѽq.~ܫ/ֵ1޽66(ZcDNbY[Y&+ "gL(v) }H+]cnռG%HcXH}آ4k&t~fyl5O,'῔#o~Ttg=‰ط壷,)sâm=,54"dM,~rmd. 'ƻZșDcA/:@+K˔1 ;/B&&,g>H8ځǑ#`A*֨2[T^dGCxȑq <`b/4΋xFGbQWSZ Gʠ\\?fceJ=<N4*prJ V..۞÷C N\ػ|}'c2-r8I /Pƿ -_V&'M䬉]q*?E]/,JQ9נeƲzrPW+ "y9+Apxi4Qgh0-ő&m~ܼ9X mz/y緭'v{D?A&\}" GqܬZRya<2]Qʁ-Ӂy0@#gQPsw A(Q6%aUE@"Y-W8:U{:V[C!iG@G2~, P r"-(B`R @0:Q; A-- ,5eC!  +6#fq?Bds2I{|f!1a9"D膘9WV&0cA, e.*"dQ'ڃY3 WrVnS$, WoLFm1Pz9`0q I*t7S'3y-OxAs"iPhj33$B6g''Mz>}} @sD,L:NrfW@ @t¸Yy";w%64k ؂8U{ gϊi :eWP ㌿ 2{"K9ïGߖ<2j{pa ̔f) XuICu8Z9m64O5;M}C?|^^p?+0Ytm ]Ӵ | mŴ }X}:B"Zu55)',7"3,]ܗG#|jT ]$uCΓ%$re6b HPDK[Bx~JS`'"#*B]"q_w7EGUb:aNUa4%G tE<4BrP;xS hN_1vp]LHdJ=λ-ڻ#79;>]\ 1h/9')#ַ-jLDWhH C$V@fM&B?3 Q|gZoC,¶:E9h$vw 1y||DoM<kY#@2Fc;p=|1/KiPOE W<@I?*߲r_u=N?@"fq3ÿ5ԐPXW81鷷z漯8& W$D)tS86[BҪVmt/)fr-x*ty0QyyL7I;W6DEkƏ[$ip^q=u<3G,!uR% ByZ@ܣ[mA_Y>чM&c0?TSYJi}*zZ 5&ӏJѰj!;/+'@:9ڵk2bP"jBhThk_s_K_[T@ob赴H  R9!ņO ~8%*΍ȉRQD2%*S9f2fиXsmK-=W+7xuF$L6 "1XwDhb*8ݔԵFՐ XtB!cر,1Ƨ> <@@Bݛ#Z^unMaxxդ.uh:'B}-.frT_\y=9վC@ ~UJTNvハϪDQcIE9FeСh BG A#7rNʷqv7_s+ڣ/ާ3 hsK$u *.E\IQ_vd[Ž?O[ H9$ pTƪ9h(:əYw֗h cwFr[[YM̺z/s=J_ nZte͑ɱ/VՑm18u~Ty_ag.xG$ˣ+cbCBf}M*:Mz*'g +ۚ5ΜmфTKk)d;Xf}?VXcҗu&}%&_j7#6gV2RٙI#õ@אHXIk>y&r9s0(EGMmE5f$F#9h7-<_)/Ļk%ɯ:EW$}$^[,Q =Jr_\9u-@ 3#ÝO ³2#ձU1-)ፉuqAQ~vB [Jix#o+z}Ѕ{|Ԃ휶2ZO&cԢj7Yָ`ԘT4Tő 'f*A7Oꨅ ]tӌi_&h535]-_%\)M4G1zCMb?CF칁R_*!gS;׻;9;1 ;V3=)#2i-wPgg)1 gAzf-&P GU-x)_bxy/M}K,~QT qd JZ4"4 ( 41^*y>D͔*Em .7+]xɲ XIo-+y...39-SF5T (p½WY[2U%LXRC gR[=   J̜bZ-U~b:^`) ,xdۿ"vӨB z@, L {n>˲'dm`16Z/?~P:2?ַ-mdf4ס XoM\{hnE# O  5m 5T2htJpHKۼFTZqj0V1HN\yH 1L?BcO؟ex~c !u؛~ɝ8&!X("0^U}v `&,kɮ-3X#R;TO5Xkkik\~۬ko&k\ͱ?o4 >yPPt]\@\ݘhM`  >#C[(\_PbE>^-=k|u:w)zT&5[eE\70qg? &q^Pw>͡=#` 3ᢂjM` D! |^rnҩRJz.Ha 1ܲrtHe")GUb"Q L %vTcI$U+뗻ni_֣0ɹ<յ"ŭ$D>%^ۈ5ܽ7Ƭ DQSZBS㿂7(0K8Sjs!EݐN1rXV ˾̟nMh41;ӥ5Pi}i=m2l:T  FHb{ĭw`X4Zo%isRo^jSؤ7S r-Nw̘;H-Ch_˙L(t adlt(WZ?+Ǐs֍~JI;n7G 9YyZ7;'HXMUQKug RDe0˨W+l+r&>2S(.5gyʼnâ.Ml.EkD $AijSbgة0#h.ݔy;0P"a<}IH̩T{p9nl$Zï k0PQc^xy <:k|YWg`wLH)lÆN`iK"'…d;܈Ղ.^!w0*k'>L^"sa5uaM1i΍|y (sb$et@WpA<j j@!ق/#L<ȑS#.嘿r CF"ɉE*l?g'5I,3޵KӞRq @J~\|EH?)gV3yWyl9%QΩ0[Y؝k领xn^D5 O"n*|^BoG┇ (t:ӏn띘lj[4KfnbV[I3Iv}y~E69Kr6Zv3wH r“ f_?kh6i@41 Ad!L7!^Q鍡iN "1L-Lp 5 /8QH$(@bS ]w}}dUMyߕ`1*%j$xu(%ƹ؂Я z$S <38р\r!Vٗpazݐ%RDetWA`sgO|O"*6{e{-g? ς.k ]_r{Zuotݻٞlל`ۚhMd[̜xag;σ%Fؑܓҕ"/*0<^\@ e tirDάR%Si.@)vqA6ݞ v{FWFĬ bEff jf9qjJhOilxfs4͊xUQkn5Br(wqM-fE")ijn]$QT=a0dFH/sa2$6#Chh##Ԡ{CgLYɛ?ϟG+]|NjA\c]uYu1F XHiC%QrU UU,ٹ0VZB_",/?;?7W1wZ^ЉtXNP5F#זhJIpzd7D9u'ygIaŕxi,=o85/{H R=0Άя0GP@ c_|)xBP*#xFY+a`$FaX+gS53jՂ`Ũ 4$HjWȫVʪ\ʓQeUo}rxuJdNl蹘J^Xs?[Rrε~:Mr#rpHe xǁtJzrb`-V}+R)dVk<9Ց(Jw$9Q?=;)NpW$5~"rW~53oRʘUBm>;qӰn0|5 XG/ۯ<7a֏<}lܾuSJ0Tӕ1UeЃu9,<'noD CH s-[\vwV9+RIv=1]Qu6@Pvu"?ZM J; f\ '0nNTLU(s̆z̉vk7f?u^'?x;t1LFg@zރwޝsRnwJiwI->t*MޟRw{aZ+Ӧ ,).Pcu-jۧijɩ~r3k/%J]3l+6yHh[  Afiv@ڪwVI0.W7_tgzF5 51@۫Q@oXuIn=7miMoD0 {Vw$QnԆVOKJgCAޣoku1cy{YHWgD g.t_: ڀŐ%fbZUA;BvX0xpl 0<"d(q!TD `@ј+SШAqLW=ɣj'UD+ V5$E͐6]t{4qԵ_jH'<>ewɗYnwHݠyA~&ziw693{mp ]<.ka5Eppx 8ǒ.=MЖ# w J(P"ej6jrwm.zb jjgB%T$02\2=9mthGlOqG&A8mfásg/c-"塜<Y9|D q*h+LqYh!SyLh8_ -4(3XyU82LwSe)ʈ kq];0K<%onB(=p L1G,H5fG]{g`()11|^hK\zq(dpt"c#FBHy mM\" m_U `PwgmaаvЩjL'CB>`Ie&VV ]۳ƫ{7@;9kwj҃nT8e!qђ}Av{?~3Sk~BpS94Qnn;/Q n\چ=N{0ȠocSc,W0V}; _t8cH"?M\$|@`GTY pGj K)0/[RM~ tanvYyf~)xz&~9e#P sPY>20ay@F>wl^ӽ<#&H~eC? DR- cWDRd-媮5gwxn+U-iDQy G- & 5T:qVpMzZ):|0%щ{ֹ~G_5jg:u7B8hB-Up>`{W<kP ֨тa *WX0fϯ8mWXw[ fjƲfCj_=sZK~!cij*G͚7& -vpUXg7졑 D7tog]qkMvnJty6&qk U:CryDސo>*3':ͳ3OkmNFK#bpu`r^k+"D%aI某ģPmf#m;LY\bpoCV Yօ @D0Q!8؜lZn{z7Mf&4Vs*70|9ę9 գ~QpcdD4O3CL޾nхg6V$PaD:H$)Ir̝V̮ JBej+~OH" @\,)_+?OpT~@b+hܑy@.ڢp +"Xe[Fu^;;25#TM%݌懑o$۟N?\"aD <ةޫY{̣ӏu[_7h}1 8YnSGޫ}Hq:,_˄dQr0FeW}Ek ' x9q!qbZPtS}ڃjc<L\Togsy ]\l[ɈPvzAN 4KN׎55 vu=f~jϒ̯Xɬ%5Pw*ژ4W %6*!i^?@3a-s&'{Bz+R p&%qΝm[}*&V7L|CrU%!ף|Jl䌜z#4I @,\?,n#j6\J7bDs6!dѠn~2C>u&>+|-ͷ1 Xx8LBp Td9_gsCEá'k5qMPkK7& +Y9^S`CA!q?֏[_6/%RH>f֕NZz)^ƪ]%+Ie02p#BI @d;:~pg //Tvu3PC%hS %1J@jQ"*bu&(I*ŠtJSKE1ơ7=?a7˒Q-PIZ 5 5'D)12?8g3= =W NU^v~3/^o2KU6cv05!#,$*Fp|P C,~`Ȕjt]{,5('D#ԼbbN' 6yp2:'zh#4LlW8n2[49.PFm~lXtIhsFGjОn[D;>pHխAhN蒯(K|KrSR_ŶVa'v>,qhl^ؼħӠ16SN0h0TE7}_ds|?"_bw L!e#W""IO]o~ ڽg|!!i[M.l/0ccU~87b]&J֖ٱ̫5ɵ)^\+qƪ7ūoQ xu%y)5 Hk Aea.|%'<1%$RUryX=)$gmX*Jƚ Q~0_y2eY0'Gw_+:+yB<@V?eբJ" wq>uc=@4A1ahiG Κ@dx8B,zi~)>9*hQخw$2w lO[WDGk7s񻑾I˫S_6D;K'ЀB4zNx<dnuH&<$>U12M ScG!På!5 )h3TfKڦF-5@c4 ߚSc++Ec_6Xƺt@;SPCI?Pc(jK@\a8rlF7"Ԏ(HbP&&o:b9W! ?jsqqLN^hT.46t\Łmׅwϳ62/6p4ŻOQ EںFz {`yv&L4,ax%,@'uօ71t+w8(FNDP+㗆 :Aq|Y4` F98) 4G{vem٢PCMc|i C_^pޗ@U8yӈ]ڂ?vƝ+WIe ˪P;a<8FKomzm[M7_]՛,|5N) vī%yt],Lh`QRZH6ш4Xш5߼6}vlna~ӂXkm@׬IkiJ`4KNIv⇯F?%*'tCAP@kԎ T0*՜jZ{l =m˼JBE6fSʾԗ_,="mwgj^Wxsu-k"^cm)0 w]&=f-]_D2@OrPu>Eݺzwvפ'ip[l]7H|/?{@fY(&UIB laNQNI⎕u5ʫo )ꪘkۖ%L'U@i]TD\c̙HK8`8v47*Ae5 lhOeQ`os$K_VY=1(Gb3׻G:vuz`uXTLØ{0Va0}p^U4]ƭTB9mk8žvD7":;C ׷F\_3U%ƪ wjH߸`D"-G#;Iū s",%G s)` 0G dd9IRr"̤-R>zGM&S3B ?RPgX <'!;Yj`:1i?y_t5\8v_QHYa(?ׇoP~ DUAN?x-yH%KъE 5ۍ+";/\4GHkH~L2ZIĕASy1" u Ґo5j~R( &t84z7ᡋO,3W 57}a2հ2ǫGX['>.4nv݇:$1Nv YYZY8__r.o򯦾Wo ߆h&]5VҾ.o@]jY,X̩5کySe8&yUf0*#o6ج:eM bv+ЉR [}mx|MV[Jm"SֹB 8KR.5c$,؋}5ꢝW87,sϾ0O2ؤkt Q(de(5rf[ _]Z숒/"W7 U(ˍ8HDRw!5XL &r>KHJ h>| MA03~3J|TnFD[]O\cPNJEdPqҽ)^Y7"AMkצ8U9_j*TZHYZb`#q9i V%9m˕ͪ}7!]u1V6D)Zjd~2v+pj"PxkfnKJjC|\C߈G9zBh A|'WmSAݦ(8z1 $I7Da*n#,_hѦGlW=+Ơ?C^jȪBԼhlplB;CC17ٰ1qgE$x"\oFE0+y,+l tD/:ZTOǂgJ^5̽Sgh%tG \=Rcnf9״{~xl7kP[Ոp"U:8VY'.? pO|j`Ꝇ?|s`@C"iobh< -3xi>aikx[0i|^:F _6DJj+kܽ9Ӂ;][gGo'ssLY$M /Ϯ2U, c]_W-gF+V*Z׹0iy6žB̆H/B]R v*Q'0 VŊ~蝶z~6ħoRݛYK۳'cߴt&Gx7)4|s 8VWE{C3 4goUl_!( cMkJjIr}@(PT5|PV2_\?# iSe2XTPPX \# F3$ shT.|J ToYBr3͟MCOGs%DuK$ep @Z$50I"h7JY~4}XE"_F7@Oo wl58_XҀ㕞wHa;GbF?Vu!L P0*?*_y lceLX!<ʦ6Smr9Axfd@#qQ R `09zaj̣|y^y I}7+ۋMTgX$rBk` ʅ(e_CV'nʯ- ,| 4S9]pL!u-CKBĕm|gzR=9Dl HIK i{5'%֧Wf`iy cv:bX$v/^_._h.+/Xz/}lF@,P 0Y\څh9jxBqEĈd"J:.u5Η_bI8nw k廇]i25îgh)@J@-~x39m ٠̡{m@iw~zL[PjӴBhʮUOO8etOU $N)@I[@ NF3× `;\cRr %h1Jp$g~Qq+amB?6JBys m6$S8-ƗD v}YшJX} MS_S=9" ;E%s|>!h*K9PīeD+- O9$j=ydD0 Bv 8j9̫^t58C|au) Y`g+t4Scֱ{7r6J1 2Uv0D\`Q?9F!jpG^Ӏ+[x5-7/7n]wa_ǺK/o/^\Զʿiw=dbŮ=KB%RWel`A(Z;25 >hL|;64b;O.$x;TbzbуgO;9X.cg7c>m\>t%s_1NܫՃ k"۫_ӛuZ0Dk77{ [fugzZɈL󛏻ηn.ZՅ;_\o_պDwyu@j ˽l6}}{,֮*,]Q@ZGa,yc^ZBqp'Hf>2pn]S#5HڇCH C4߷]G[uWv@',LA}"Ǧj-cca1{co;ho& lR^eo@ PMn:*%PsS%kX3iZ.0RLRN~E# "|/ԍJ.$=$L|l̹W|3H HK\b=2F|Yœ'CP^@2Ƴd;:e3>P ,I)鈘{X+d22SmR(XbgK'sŪ Zb~=C#uTȾƓi`iYs.K=HQvN(l*(%DW(?~'mtiwjjz]~O"ы|DJB%EnC75p[e.~ Ck? F5;æ:1YN94DO*}4 MNivY&G^v G3͎={,:,/>ҠX5wau賑=ya`ZC +9.pqťEm a/m־=R74nX5Qh]J0}ay!LElk%*Ŭm7? ф&dx޲lz ~Wt.w~nZfrpuZ[’= 2tkϯM+djS>whT {'Ì@=rf8@5iy7)\Z |;`.hY*PK[P[ħ<ڷt!?B!94=PU0߫tZ1ζqR? 򳥑ׁ3 N-%p^ 'ܼs>|k^cal 5PA7c=wJMtOaVF-z* YcAf 7;dN! ԥ`LK*"koO- TʁyA4cCYYs K+7֧;儩"ܳB]҃iT?DCvk <ӽ]r=U kd/ūi t!dGdTK 8$md[ޖX$Ҍ{w2 $w&45hg/@4q5  Jyfulٽ_ҁq]#5INIugixG̀{ t4`<KL쑒U>_Fx.HUNxiw +xx Lo_{qmKU~+j< Bl. Q(5!y:u톔͡bVm[_}9kw^Rͧ/_$_2_)K'_*X f^K\1Y%؀-W~sϽy#53Hbh4[7lO5/b'bܙG Ϡ鿿⃆rl3VB"Xxڅgu(6VxZJ0.K,+#&^Bjͳ]ƀ3{>N\'/֞tZNqjBR8Y&!.}տ=\N4nxmh_;g7KV-d Đ2<˕А`iJL}vɮl-0{9E$jpVOHЉ46K@Vo|;.ȸI\ne S%P+-[홮".Y6\ *>er ,_ 4_m^wJv7s4EA^/\'EHka4LX/$S&& 8#uxR6X()z!&)1ۼpdDe I')5apR퟊~J9b5>FPi0(CB2;xs!0S9 Щ2ңy- 3.f:IH;ƫގ:IsZIje}~oGƦG'@}QjP3;E֙Tf*6FM?|åpDx)+$pTFR8=J#=7-V.t,^Zձܳu̍5  ˈ68{n}&jlt0ZPūbCQ%k287iXWȽzG*UV *_۶^e;z-V[ vpywj}KMk}k5U 룵j7_|4eqb揚;j0Orݳ&HVuSi\}ukoINHVd$3IE0GƫpͽV`Ycu(_G, PB_ׅ]YlK Y-Z,z r=ޥysb K]ʣceۅu>-/7_eY[ǿo Z[ch{aK Vz7\ؕ""BJ6ix+L5 2N u5f8dzvgqkX'/o^ 9P, q]T\]^Aq[|φEbi^?8̅zIZ7Ku2T!]^BȩJzw#JG>wpPSԊ ؝2J7n[%aovmc@CvƩ[ոίaoRq{2m\(e:|HH)JB$ݩ4@^C@QbO+]'Um 2C%c",ٵ,'@aejIéƃ>7j铀k1YϿR33?a] 6_uԤG=%t=Ξd帳R- AS;KG^l_&"5Ň$yb=*}ދx V&ǫg bg3遒X?>=^Ϊ#COnZ:GL df@Pٴو`8NL4en'nM_ZL]Io?ʶ>㇈3tY'at+>~*JԲT^̀*eAA1"0Gd*'C ")TR!QUFC\xHl{vFʦx9?zr(/3\|ԍ8܋vNc9irmKt nn?Ǐ w0Tsĉ6jrROMv´jncu]Bm}?W$p}ɅH_&`*5P,N`5S_YbҋH;_G>5]꩷\V # +\ɣTF>qB$R!L)󆿴 0}VζЇ7.0p9TwYeS|4=m\=2s]+!Ao p: TnR[vG{Søȥtk󎀁:j>VY]XдZѺ^ {EE= pa2_VnSS8~RŮ9DRa־ڴpqwBE-B[ _o\ձx5M+%MEU 9NNrOb+w[ :DޞZ2cfrU=!k>?C>?s 7eDvΞ-S](x$ ^)XmvU"fLZ!*|0 ف!]Tj?mm+Z6DyUW;Ww]Vx8@OR2|h  ׈ T=j=|ґ&Du|3gcFPl 5/ЀR /J)ҵnke"كC /Nan#6?L]sK2uSkBH> jCM0E}tVwfVZmp*q@GQVsWSֶ {-@PSK@'@g˖96/UC}co[sj߶>5k.HH:\Tl!f!vF$X:XM! 3Hnnx/]A3}HxzؗRqAd~]?=55SEVK9gTEBj kS6RlcO[ [M.j\İTIgQ)9s 4{&BP۷x'y%;]?#Z+'㜎yއ".J ~ nr,TbX S?ٟ'-}/V?J /fD7hA#Nm0B8=M1!R܈sHcI(,/zkq3k:;b1!ǨGug N_Ĺ?mOWs^&Bc X\=`LF@%18kE.<>{+m 8r@5#YHMCXᘋhoG9)XyZqu4p:U;Cd˕<*=q^ɥ&]ƪǟ}l~p?>:6=j3Ws^|+j,R4TqcA 1`4O~u]h//::45( A.8ڐ!pd CX) *rVb !|DRUYY>XwqOQ_=טcJTg7 >4M6O7 h،pWf?ؠ `rl9[.v?}ؿB$jh;. >e?*!(jQ68@'Gnvٞsd!3I+ vvNQD Ujn" ?_']){郮C>Ιٽ;cˉkSMbň."m0+}Z>%e O;؀ z9i d,%XW[?Ww fMMG+F1ğxf΀ω7^@l@A˙j *NgׂlPW'ɛĕWMWi™jFPߖy!%F/WWgpB[n@yxp3@ 9D%Bx;x, mIx?y'1q(̌99@o5xι,r"6ʦ'/OՍO\P"RJ17~k4j,uVe}YFϔ 3\8+y6#@,6b0~?G0ɶeRFݕ?zwDT׆=s"Q˙9ZiFbCvoTd zfQDNd.e ʨdmҠsf;1GBLg ' MJS+'_+,J >k绔y(6*:ۿdpL92z hӾFQM0ffy烢[Q*x߃Wǩkk+r|]{$~ž}\9b9fO81RQAg=s=mS)g39Q$q.Ԏt]*%6q/,4xf4>]sdwaO1a}_֎}\2Bn| E _$n 7 soǤos}DbQoek tuOwZ,]V;/!^#:v{R7?\:4)#:vZ 00ecuO q FaB^U:fYHb` 'h%YM`7I8ܻ3V9P p|q:uJ.|Ȳ<äwek^.YzU=Oapq殏.M:꼅X-zѧ{rrوyv|tvz zgAAL=_ 69G?|#&a%YIppʒ]TɕrpXggSEI]D}_V>5]$OOs=tȚ}Xac?\:2.kmXG2p~at Ͳ:&Ȩ|0n:b3W3mHkhBC4iHDe\"MDvI^9f\r.=>9|e15z̅DdY` D+~l{ǸEI8Hqbf"n|AmZ,ipl( D^`: [z硓\̑'׆z[:C̃xfj巺։MNC+ͧ|a<:mݣ#3/̷zQj`MFG סAbxQ-]U.^a1~6(_-]83?֗3N&8kj4G16R]$'KMtr8<)> [mn"zsč$R.сƁ:>Vn7b7b0JYsm`Gq;8³t12KE9ͱ,lpp!$/3]u*e.i*A7RʉU|9zA1=cJ` I)WBCo7WG8ՁN4zL˃=5ՠ%hir4d99>,a`玂bbQ bft뀶a79 8L`M5ϛs\ى"j nMrL. xq. ;ls$ퟋ[|q ,Nu*ˡ<+#H柔3?6uj՘MPjzK:)ʟ@`Y,]*cAn`6'p bj,SP P 6'83bN\?ҝx ~0OIx5ϕ*rg(aŲh,z~:˦b^S1mmsCsx C+ؒ` Lܱ>z=7J xVVsJ+u:Z;{(`at=D Vڊ%y@n7Q$Vz{kAEi| ҈}$GTODꈼ/(0tA懥[as,Oݵm(5cCXÇE6@&Nַ{(?*.9uSEmScɐҒ6| nO;i%B0[e:{C(wFoi#`7T|2z䀻57ao$|Cg(RP @wK ar=BAscz}s嬿(rbq$JD) iB N9'XR).i"T?Lv'Y4w*OڼW?s-32mK Dc?O]0RSfvzRӗ?:YXu7˷Z,BRvSa06'xOQ5P`UalBGf. 11 ?# P"bM0f[`Y1G^7wt ^2܉JFCӍ3Xnn$5?.C4ĿR5S$,f] 8g*hi &H}Hհݘ@⤴8\>;ܮ};F͗怚&dvǟnYDT^ 9A_s711CAo3Hͳ =`mj z7|9.T(4%0>fJT$^?'c`^$ IqyN R.@"̉Pд/KpĹ^̣3i1ɛKW4H8}/C]fštZڭw>oؓ;EpD`$JIRlEixx\.ǰ֌[,܆8%MOe)BY23oΜ "z!S*J泰pJw'¤B)ݭݷGebaq͑BB"StD"_\GZkδ -LQy12%!‘0uE 4ۙ_#KQ㥬:VzU4< :|y(N KM!EpgX)`(0;37"L2c\b)s~fC7Aa A03O~ؘR \z,Kʰg Y6(P<٢qA|yM-e`1Fx6FzՅiPdPaq:Ʋҩ5^;=ÒshOg7GM-q*&+&KcuMM7BaKk5͇L(,]P)6e+t$yNT\wB<LI՗*vwysSOH|62 7F0bn>]$R;Zb|d)yh*)lN\n/ч $M3v>$Z9TѴ@W: yBȩP+s`r^+_ODVjH}$d| /bwWMwq^$Np(5d‹R3@%J1L f${%~yjsF{AC&/&ov#͑.^LbԜx C;æ[ qLH73qz^#`?my!Pus&AnlgD9r`cHv,/Y!8RIhFϲk4dFC҇`@EZ^YY^PPNnўX%δSZ! qtUuqe# %9>r([$?N1}e;q ]B%3_NʑPIn&x[~eщB6":_/ >!H "֞͝1vX0IpE"@/et#{؝6pc\{ŀH  B:#| ]zyM,B9_NtҖ8iC{z#S@ ngv nx Wh-+άy9B:UZѨ#Ku;ATE <)VWN8vyJqWƳymnE,=}Cj#$w\g;2]̮TI)""SIM_6Hz$}5ATb>R؆/ `MN7nw?3]j!#Jͤu޿;|Qyկo4V_U^Qs,8 L9T-x.&$2DHu!!~b#6Hu(sY$8)'O)8!߯Ee\<`r{f12L d,8CMs޵p.z 6} !!@pwBu]uu/! B}˙ٙKm]KO}>Wj!y}$ H 54\g`ţʱZl!oQ+;)GH6nbelR^i)u_Р \?$h BW~h(Tg妻ߕ&.(-A3D!UÕ? C! rۡFdv%ag 㾣TR3:T3 v:槼!gJֻ{Fbo"Iz/w]`׳jh@`FdCQnNrA?: )W~=BKGh5*|,!9=BoݶfkMiЗ5l{bpW&)`. ~Վԥ-ؤ "?t;L׺rrJS]/%v/ jݶ0ۮxPߩ)ȵ#̫3bvDvLJu'vƅ4G54Ex`YlU³*b1mt6ףjN-qFңtɇ DןN/&g}QWVzkL]sZ~K*3㬯}9;f:~°5% va"×z!``![}ƌ `! .욑{ sM>~RwWJERgOwW"8t\(:7۵_ܾxhR) 3jC$JbN51|wAG락O<@`.=qc^0NJA?A c5uvC^@@㪛!u yqs4^1ir/v4 Z$Rx"q,PqR(5J 'tF8{`i)GquT.{ ]F~\ڵҥ+ɩ5ѱc ҚkBaTfgUtaw9ٯiHn%0PADH`(Zƴ0kS1=р SVP4FfzE'GfmN,nf7;S`;SF\F!@.:):4 &(l^e橧6iAr9*v߻up=mzh֣C .f1.B]{  4)o?K (klOvBW^]>n$jzY79vD:#=]\[];~c=Z!)  TBUh*PP^@ ^B!˴k3a h**]➷9kv_Y0r{r"؆$LxPVq`ׅxGHzw"8Č aQ+i/\:Zr)5ʚx!>M^ EAi p4B<ý##}p5xՆEp}9Su:a-]CCMY!|\ZiUA(/P-iT |hcjHnŁ\9>gc )0os]3a/XgPٶ&o#!+JWz]GDKqoǮd׮$^[[sAZvkyx`Ɂ1lrkO¢(m]jWE%xBAdC47e31'cGJCK|Gf++p0z[zjTwnKcK (FZ_0]0تè/"AlT Bj,p6 .RJ?{8sgZd~@6p(BR%fLʗIJ'(5BO:2ƽSyKܩ3ObVK !9H1g"c,:ɌZlAP#Ч4J0YR`S k*ͩTv ĸOG6A{%{ԤxDnyӶn}%J`{Yx3F>́@[9x=!TNw7@DyOcLX 0[Ge CQyJͤApQ=~S6~(םgew<ҧD֧/ׯ*YˍԆ(^JBR3JPԐa!Wr0NU {lcO/o<@JҰӀ" _3X:iv45Q=I]Hl8 fS5dē;ѿ,إ(Խ$.pF鑕n?}XVV1؎g ]͕~+mOG뭳Rm3j!Z#1y=gv^ CECB]n?sDV99> Z/Eaw@X"S#J )^e}hU-'o.;gr*/}x)J-(|֫}qy[; _{bԏx0 VU]]הx1>b\H~3ϖpRn vn u kvipDXb αh6X[yvzIp-3 4C*T+kagNJ& Ǝ  fIZ5:#WJdw|ۚ*<io82N XHDk " VvEA@l,%ZZa5 rN2e1]#"9͗ގw8oOԽU*ĝ#QAW 9'j;ꑷzğU~wr ATɮǟɟ4xʢ EW2۠"^Eh!< YmDkF:Dkh{|@CELUm`ì0 !v6WscD=Ǯ+yCE[m VYSi}]<>ԩnF)oX pqL时cBV?~{Vv]M,,+Ȩa㤕nKeAxf\zis1#uLQ yF#M @0R Q]9p?珋Te %y/K_10T1uHSV;^(|rQu[=_OK4ac*Aƒ~< m(U]O#f`7muOXtZᬷ1|]ZbP{[ L@.v;Bw7ˬ/)œ?#ߧw%|B<],/pw>⌅6zZWWx\pY>8"y8!v@3< T ?`-"M6YgXZ@mu{ӳt{\9?rqsXBM tƨc EJiٸ\>*(.ru{X5bCz DRZx X8^Oo ;x].ulkx9y:y6:9 oP1XQ~"JzIXFv"@ -`^"1#omr"8TTɏ SOzG>t4T.S7(#9@_,> `;ɑg@sE)m,!Hk2/; fj&S,(:SRU?ox6]UPO4JS=8k lw̽/(HmWW*5Ҳ=M_'4v:H[ ް[H;QbAtHUF8_?'j@tnD΀(G[/{m>k~^琫nf;6YLG @r?~d]Ԍ`o owD-3kA]F2$4f~hyسc %o6(RO. )'&T.nL=g]3u,hGYL,L sm3 7QT\λc)T6{d3~HU?^<4Q&'@}ITd7M{bubJޒҸ:/sBL i:T6pp<${J=>dut5@dp m>d̉:ge?jU̎bbz7T0魍tW8\AUl禍TAB!E&(5UM"X#8fͦzTo Q$!\ЄU^<ś>?dž1P7cRt+T؏\ܣF dk}Y,< /KZ;AblMrŤ5D[;s'*|vJs*Ɛrϛ͇"i ŵQ=d|N$vujWƢγKw P.;{|hzZ&܇Jp7⻙U:dyhbzNg9"H0o1 wҴ"i55 W9jLK3Br jN-f)Ȼ@1;.!~BK q1^F]scO~}S(HAW R'f oZҶt?6-uo`zgmh{jtak!)2xaՎ[4"#Q8&4A ? ,M4˦\Nk3ӛts.I!fq pv* `qcrc½6'琝>=xp==NҲitV!619Mɉ6lg k8Crnɥg?4 y3;&k%X%e-RE tP\S4+@+׉g!r1+-u0*s1g%\jwsK ˹fNFjv-Z׸[pڕ9e|n~ӥv-ő!D@8иa ;6ʭ u ] P] E!|8^0"Zo/Vhft0@Ă U^[eۘD!=hd }X%xZY&K=\>鹨x8SSp\7ϳ@ *t?߽Zp679.%ֆ ]%$ZׄӫȎ&: Bٹt/sP\q2u͇:-tRZ(ݵ:ifx݋//F0J2oE Mڗ*G~f|;ƥ_#$^V -~%ߟugŲ6Ö3g%0RqU4Ba^iWmgTdwvf@ tb96PB?`xdϮ\Wuk*6>"7 CU:49&f~FBI*0mcݖއCm8ҋ)W]vӑwܻk^NӉZ14jtcZP旗9\ZnO2Zdqi g kQBd ? [{mS!hev>ݸqί`fO 9NcdR'ښ┶7wOsL,Qa4w0>@Xo `a fPj?/ͭ#;1ꪔm3'?B3sbx\Asuh yt'ɉs<0n@뗪Rtio嘕/\{.LV3 ~6oFus00W=[93\TI;pQAI_Cemϥ=ʷq*] sRsjqn6=(fK!iw3(9 Rky])H$yG$r^nKy'0MaH ay\|IsSh( )d:ODpVվ}Mc`nw.CX7}K\[bصfpFSQ'G[wx la`8'/&YÍ-wCgŲA 2[}ՎΆ.&X]65V5K~g{uR8Y\˞'gZށuDlk"QE#ԅ$rw$\]:凕ԀHǍNB9T4J5:Kɉ>_?OTOH |µ DTD "ړ.]Iat-2Ҳ3Ťf Jq#̛ڳ? I{_1Rj&gM/SY)q>&dTD,jK0Xw檍o<r[00B0]I@ŢRHx7o ;5{~hZҜնz< L/$DQMe$ηစm>e|Rcw fz ÕfuLPqvXjQqT~\-b̨b;j9f?bKބYqqaIi3x YTU몁{(5u"S"3l#;K ,&CSeiz47;/7v$ط;4 YtlcEA'Ԡ5ݍ>~J;H¤{j%pT`ofriuÔe,l Q3a̴ f(t7] Z`8,GTj=$]m~OC݀ 8 oʎfS (RqzZVl{v%z L.hPRD!TUkoieGa6kBo߃.|9 VB G2[JR' [@,5<sa6z3LಓƆZeCXq d{jgU`ѹk?=ev57ы\<֑"A9'Γ^^ȑ>&LAm=̯/6i|9޼3LWLB`__]]i^{Cs}C0oV![@S/@!Rhk>#x)tAth֎Zg/pfk8Z[?H7;>N$ 5xA/ׄJ1~%o[ .F;:'Mj!B6Y28Pm$!h{A;ݽڈVpҜtιd |ʃ&X/[is}5jf7V.7b[FߣFjʏ?V0&D&k"(!'c EJM9p8rX@ 歈mFPKwp]ルgM\!AFs" `]>UApfZ!BUEI K~ލHp=`kّ;_q}VcS=;I̎_b$T) S{̭%tqӟFK##VI< _Vl Ҏ"NH h͇xS@$ςrFE(5m?8~ģUnJNVגmZcu1&I̦dfUiS=2ړ!Z,opV ,2ރeiczzi{th0>̷AK7G>p-:ڑ4?2'/2. /53_j R{vR\&~_3 %jo^۸+^u^,vCk~}icZ80/gHȸbɜk+mo~}KW9UnRe< @ȭD"u5fHU+a`.~.u@&Tϙe_όuBj wGZNPҴhNlhZ(RPLYZoW"blpl{E1Z:oB_ tGBlj/O-|uΡmґw"jBzU1-(wuiQ]a[e_F)Һ/suu^ulZt}]iSҋ?x?Z~;'uF2kYpY0Y@ 4"R;)jXmKO$Dj3JLs7ߔm{ɛW@Yrրԃ-xև}%Ɔ- ]ڗڗEBDhX^šq~$Zw1 SQԚƾ%Um{FUS>M*,#M0<F9 >dƕm2ЬiRqc6ڄ)57#Ă01oAes8dM&B[QyI6T#r"怬}1߻tuCZ$Z5Id=3SyceXR?,/A=+;|RR?L* &,dzDWv /ePSSipHt}VjQfp5]00Yˀ/6P` :nƙ BNRbNAEyY&&--V^ZT0!EKqSbb_CP>6ӓʑxO|¢KΦvnXuT$@\pP;A]m=;k7 ?N6dL~nؙnևM{1  N +_}+"g 翕Rm4ftyrZW+}Cr?@&TҀj'Z&FK׵%)N%QM cz~-Ma7z]^ܱЦ1'QǼ69Rԙ?~X&yܥRu`LsC%J MHy> /vtN:@bCUE@ȷiKCe2FHߤY.>l=3<*{pύK37rD4:7%QgkaSS2m&reoʤfM{Vί=)w|W.8XfDHr<M]byZՀ cGͫbr%9-@GP}ةagX sέv}R`RhzcYk5K 70 7|=dL`D'bN;g3NeRYKe6 E,z8LZyE L{+C-%&PaPx!ɵg粂Uq|oka{=Åp4DH=;4|%kGQ~iPA3S)j397ȬZXv }dW3'彃ӡNT:"1罠02Y*]'*HXT0AD< pIUF}hJ q T@DL،emG0N?nYZ`{!С$б,ع&Ƴ:;=w]~z*%Hc'ava8`#U az4xV'0hf`苫(p-۶Pf{r׀ p#BT\,`՞1@xeqOS˨r'ڃrj/ ^HI!$_I v../ 9tdw.35>]%~y֯HJ3;39RF& f('ƧDG_k;Oٚ=٦G &uC~PABQLʹ 52u{]WRjVvٵ^P^(˫!7SO]?V]9FCM$RYή{k{c'79ማ.&Z3UZ;r,Vh1I4̱W?k]/hB!7jATbahpu``Rog@n9dGFsдݹ~0Ю.ߕse &\1(v* |MN&L]7^ 6m.$N!0\^Aj^\PodS!o5JRL!p44{Ph58JE^B/QK+^M-6ݢcT2cކaN'f˨-pł9NC 0c8e=dgoh:D,"S$b& xD#r+MvdàrPR^@-'~>v4pPRhJ <D5\kQR*p9Ϟ HF5]DvRwґhlT>X7PAIzd+`w!f%_q0\MـҌ>'1GOp^rO|d5OeӭpwU <) x+l|QoWu.J(.]@' FFjm&w~Њ4J"(#¹YxHj"|:8IB)ov-WJˤA>dh)Ub2`\ٍxmƀ(ڮPF'9'yuMq/7W]_qmwK8({\ws?tBoy)~~v5x8*Tsfc1DgO~z*ZB73YI噝Π`P1jR:ԟ_5e f%8ƈ -Ӱ_\e\g#ݻnroj::78@Q'4HJ_Pp38*u2=aK8?cu2h/Vx&:e~S<=МgX=`}ԇ]jA geK&EGoJbÚRqn2~4knr?4K bhm_WGr]s̳hYEYbÌ0xyI22ڪ*ԪUn$m >Q} " ds1aLKL<mV&'3*KZQQ[ _5K 5q7c3],Vbxץ-!ف9IjGOeАNb?KKXޖH?2 1U[i\kVoSo:Se^iY,*-qʎeFkB܅u Vv8[vbYٲN1Nؚs r9s>t7vT?.S$Gi+"$p)$e6SR /P)8h2QWE3H,j;~MCܵˬD[|׸.mڑzeOmuI) go$Y B 9wXIG2,W-poq`֖|d 8; zao}O7anhn^+![F)Z ,YMg}{_KT*%ANY [`L ՓoMm~2&P-ޏ0\t>C}M(p8/5x&uk釨"}Ӽ 2ܵLs]2h c'9˃5Iǃ/- w ?0gcŘE 7n04:!8!hC]漢z>>+w qwwO@)$.@p)m:Ԩ BHB܅:ssg%99g_o8 # TBxY~l$6 mÝ0xHq SZ&^-^.+rzSCFש r*7jZ#t*:cXwXtvo;ܾױ{c2UÍkt QL&-VASu,.)ח!J"i2rI7̳]SSQgTyR!\eEq`&b"~"v|R./GNýloy5  @0sczzs}Rk:#K#4r4 Ma:LT9![~*F# ֭g%-N@aQQ%刺V, sp3WHRƥ5r{] ȻAJmF7SKlStM$>$Ȟ$Ɲ$U/Rݟn t!0 7y6v/dRv] Ԭ](Htnfߊ㏛".NJ;x`m{A'Eآs,_ ~, !c`翗>Ξ^ȟ\NY, mWj7u.̟-UnKPo#tK岿 G&=1[Up~lb5-0~0=۬!?XZkFԚ>櫊d3SbMG'`G ۧeRC ] |x yvxF5m@ً+uȄj) _WǙvAP5I@8{a/ sRu^$^9!.0N6tp|9I69=*0ޣ,_Uy$>Awٳ"lz , +ZI9_f%C !P9tم:0#6$*$N0XY.B{4h`NlT%F1aZCA0@}麈kvn0ir (|8 > Em cl  򧕤vvq!ś( Ӄ;JRʅ?PS}@m勧''_.//-5hiռb0Cqp 8<w̻vYR*l0%u`975kxx5yԹ8Ժ7ϷTpųUQ Q&Hujt v2N* 2V`3^},4.-lԣ#vhxћ ď^~ IK4|܉*@g],.Wy ͹#F\APEwD ~S!ꬖSQ 3$EGG.\oX#+V}{o=Mw˃ǃ8]նkHb۽C-:~z݁Junڕ:tK,k /r'{Z t 6+>g.ED[zFSg f _=O.؀BMK"t[BYߓF\G.J)ϙ . yq%$TsC?ȵ(-\C>'rNɑ2ǁxjugOJ^w0?Te! 9'IZC14b4 "& ޴hECCYbct {Tn @N|AcYX7nq^l.sN+퉡_!}OވWnKpvSUs`k8d-f{!Acn-IZ;27аDcᔋe 6 [x>3_w/k#(>+jU0x~NM$]O&g 6=ޣ9cdcZbtDϘ3k,lr-modߪVFkaMM7}~/}ļ4d%#o-Nv&G8EBq mdA 6;.(I&!"_ -LWc]7t›WU{`;h@/#1R9Jc5 TCz]2I'(y 'Ar&HɒP-MT4) {YWyՂX!W(a.fnphzz}=Fm5QYflTIIgx2[rJG3V^ 5an.^gzmH2׸$~ؔ瘥HNU4΢ĊX KhmK&UK87WͿgeY|ѹ Rs1 ?y1 >fWDzc܋ʹeK㥯W[ /iob&XמTDW\Z!N=/ञqQtNl.IC>EZV z鮦Gy-hR3f ʼnd3`rE8]|틗yp@} mݏT; j}4F[u[4tD[{`{[eTk^c\kSn/ /JGB+Z"VoXwఓt:n/6@X(mio4\,` pYXKU**U5@/h[d%.s<Ͼ@،yW{#*^AkzCn$)L90glkp(wtUp+w U R,u)t.sn t*+t+;`'A߿zvewE3鯡-Qԋfan?ny>P$ڤ, AXU.wqvc.I\ؼލ39Q[|Y6G3}릓;ٗ${4 mԋb@s~`x]YqHo펷+53CUb5+bu^EvJgM`.@,X"\:Ry"E%V*Xh(^ryg I?b7TtYEa^dFA`:z'ķ[^~UL7~y{//ۋ˥ UL*/ Xj2C"#J ::',qCpo!j #RSYi:5^fg.wٟ>Ț~R염󩐖eDl~mhqǂDóA \[<& F"ج.T:uﮈ\%Z,c[$U\-W^\&P%\-V!Z[]E"Ne@aJ7I%-~|;v*FiB4@7*4W lC)4x.ffo0/o!i E\|I$وt[4;K[E rٌ*͏canjN}Pi|Iۭ RI"=W9R  /?Hl-(1sw-dHkG gZ3J'O>-vOl+tnmBrwYM}U6L .C R%U!X ~gMrJ\:-K?(FJ`0Vfr 4-V6[IAGa)F|'O(qr.T{ qaS|:OgE:$˄O]a=ӓԼ#ٙzpH$yvi7,譂:}^NiaLrI++߉:q9qA3#u%]rA L8OY=By8^BmAa1FmI9!K;Rx "X ٷϋIeIV=)pX8.<%mGHV76f_|>p6&fk9 ! R&Nvm~mJ ́rx#ȷɷ+tF)ĩ $nӼM?Q?^/AcU{cկlڡ?U{0Q{h8(D/_~ʟYE͟{UjqSz~UA'PEr]ƞauL;cih]j`> E5}-ĴIF:\~{.{iRpߋO_O56nc7h'cs7z\wM2Trׂe^[\gTSt\GjOfWr{\WLo@*@ʕxa,7E(UEj+k+j=I4zY߬| '0_;r>@u!q#Pc,ۃO;>f{Dq{/+tQN$sMDaO]e)Yo's;ʢ?D[%1[N_`om0Oﻟ4p\aMo1ݾ36[3ZlKOirahd3"56uNJMZ0)nrRh0qO[[WG]V]f8A}z]Ru΢9&UWG1C_:HOn]wЬ$N=Y IG墕x);Yy/R.K- ;g"|xP/b(TxaD}%ڃt tؐaDLHɵ"6$ߎ9SH?:c)p E$ϖ۳;sR[*"&A-L!|[jo@WyuwNzɢ9-G)/WW9]8ʼ lJr%kȋ9* 8`*A0$1aDӥV4^/aG˖b@ %$ S^)]]O˪_ۧ̿}hBF˙1h ?I QJ$C~k(5-~I67PoOoݛ<{'#d#N8[[bFkWvb5ϫs%{IdrisjpY]4ge{"\,m(ϡBJ{) `wkt?,y.MPqQQ&I5I!op%O)[.d"7aٰ]EcsRv5gcEt}RdőaqR ݸErPmW_V8+|̉=7L&;P*G:M9r^ ;C;9O3< hnW-_lOu)w(c+%*w WF+R'ȎZ-Ďo!E$ςْFO?FOs|# 4 yR 4' 4v_|3[2f{;)^߼w~ *=v̲d/—oauɐ ND2pvҌ=9oA;w;b#X/hF_C[LEL7'r'xe!'ueDCeDa.KdMjI%+zXRsRe r* Vk 4W?1LT q di4|n䐫LﺓGՉNt_@lM`2tb>:mq#(5t7% _7>bAw]_o~?GA ,E\m$%ixs6&)$Ŏ=ŕ3͋$R(UKI+I%3a5 Hib y!ƙU.쎗ZixLIX'ܐX .1f/0,ShɞkžK.ӗ=j w:hZXe(gIR$ \ %9fDkj>L.c6ěQ#D1Ӎ%)0z/A][VDl [RŠ"sRaC=;-׃;*ӔZ(B ǐ@69؏a D$=;9F*tK{RiJ$&JRKlL=c6Ȳʲɰ,//\V H|ʼn1Ym OLORR 2LݔG` 4Zz,f6Vf&_޺]^6n^2U" aрgtXh5e=e;zÕokڮu{jwoI\-~#Fzĕp&WVG'op_xP{]c6p%ކ_&d< j}5J ,5 `;AHYw,/+ x5LO]ʦm*tZCz"µZԫ䊝% $K\uLTӬr|9rjxTqBS< 6hu( I |` TY{E!EM@iĵq*X%~anlrx>j+Xr5R]\ eqwNXS'@YM77n68AGWC˰+w˺O7N}eV7lg&8ߊ/Ő+OD(d9U Ҥ„TXctdչqu՟?]{>ⷽe]31?_o;rrȘ]q=XXZ ;4Kɷ*4HT8~H1CSB 39m2/np؞x ؒNUM^"ׂ7ךЖ#6D$πJu88r4H PY%ν2,( @c늍)8 ྂ 3Wm"7"xY}~+|~|}|>}Hf][i/\ U(M6L-N:"sSS4yD5e HkʗuzUHC] R(WlĂոIS'P/XG̉)9guZ=|ѭQ d(LM; Fiebjqzzeym'HG;jf 3իũ߿-.Ѧvӂh,I#T%5d>Kd-\%Vlօуœœ݇tx._V?G``N}hA@@JMr" 0"~Af%^%K)z/t0}5,wE.^i5Rٱz@^ĄԠC R)d7!`nBrǫZ:`ûQA;/sgϑFL M8mIitaoŤa(p/HA Lm۪LU<-'Fus;Tb7Lw~4 uxJ*]V,e+v)rɵdH㐙T}=V w_ _-OJ WWH_-O5hdh-=og [%)5%&5F<ՆFFn8}@(V>QR,*&He~M@|`@>Zm||D l>/"Ra*ajaAݾ H!it×dȕ͞ *Eب Ӱ[ XȺ!:g5i: TE$%5t3NZJ(X9nvpGcip:%G$HEm~7|4ld|(fsbzl,a0@1ʫOg菾[o&Y\ Tl ShS V RT PT RB EH1rd$M/u=Zf,E&JM<2eCD"$oߊQIϽx&wkB9L?f%Qϑ}Uft/Rd[NɁD٫ ԯūE˶Hw)GhD &li:䦄 gk'bSԉq3P`)ZMgF fo_szns; 2SWj~X^;qW#Ćb+߉S u{qBw$^ rs3^?A.V夛R?(6D fr0(EJ,:#=h޶1ܼNlUnir اmpR!5|/ :Wy5W499;U!.+R/ ^.7g%.ݼ,fڄLoVO;:G U*s3\q%>L)|;Zn8qcG݋Vw-֠:H 6!Zdn-^9\>5^zG;%5);Zvh$-lz4A7R#H_S`f_P$[MۮݻS3x_jj;)%;!%Ti_qGy[z( pKt޿`4E)bǕG?-~/Q^xbD\ Cz(J77qwhߊU+#ZFH٫aR!@&{{`~?aZ(GrHqdv &Ck-[ZܽD{b;NSU l3(Sc^FMML.ҦĒ~DPYiج<ŧ7>߽mKoZX;H+X `I:Rhkg%mjߵhTB"CEFH%‰Tz7^ 5B:P3៳`@ Rnՠ̎`ֱ- %D6Ɂ#壯r`xRyɝ3'V"5ΉUQUS**\i/Xh/$q^,H؁ to*ZA" dtRc7t5(5+z-3UYvPf2/kwkp%><>hih1|7ℯŊ F t^ES.Qmpz UB1m$۔b8D(]ϯkXڱ ]frFOO}^Z%]+\) f'r\;.ȯ7;pF!fMl:"NB2^k' XSYЊ駥ϊV~ȯLROs>ƞёӋË͋N&:W߈s3^J@__O gpxgz'aw 2N \Z6T?#ŧ:Ub[[lxm81e;r^;bgάj7хɕ.)pocSYq"8y.O__[]EMK[›ڗ!@```pNDeJgEhu;PjfƠb>vwH$q.l9$ۜ›.PƦ)n5@"L8nxI8K,R3WɌ5zWVHVo( brvrzqzy y 5yջ׸V;85p68knqǞك.Af/Iv,7Q6,)N7PAqcpzԃ>[3ꢔ9&_^Gôu煋ܱGqZh'*f]q%{|/3Q6wkGoYdַF_9?:eoNvzI^jPzji?n%?*iAA+''&̋ʶdi$-O^[X|UEֳg9S{ Cfy58(?cj!i:Crd:4ox.=ܤ!aPhmБhkDJ:}{hr+l>}Y#kVNkoĊߊ.x#L`(BBqb$0ࣃ#ذhdplsnWbQcQo%#!\kUe^]Y f-)w&5՞(82$P̏笝B>{?eE2@3TJ_RP^L5gr[.4mFGwW?Tt3#D#vAh;$Rvԃ{-R2q)"B E_ B#~=Jp t`~;Aj⻽9|خx49.ln1lR]k{9>0E["|a;̬.t`{G>ƌ33(5}WD<Ʃ܍չck棚EtWˆߖ.veumK KBl>@3Qp6KM%fٶ 絟p.eI{\fc8ip-T/XlH L *` W%| g<\0[r#|:@13ϑrŒ5l.orSyLtG'm;dٻp'u?|QG[e==o!Gw'wG)n_ AVk:}1}qZ=Q]J}7v^Iܦ4+ĒZk"# | UA'$珲!AZoA֛ƕ\͛owwTz";8wbs(N䇻ہ\K܍e(\~{q*bo )]Wv3Dj`kr}8|ѣ Uvx+2=8Rqbwv)ۦsUi~kGggۧLdNN1MLG6$`r%L?b)U6ڱ}^?neۜqڝ:݄U] *3&ۏ9WÛ;>zGmRlz q/FF0k#nNjߊ+s+Fׇ^to4^{ce+8E:x"^mZwg5ofD ?J RiE6vٚ3՞'_H ܸJ\xs,r,2` C u@8,0#FlGkފ3 սa<fx+-z}yW!┉K|U3qjrWQghWGh ĆZEfxR#E?]ܧruLW3-"m5k9E $.9kxw?cR|2^>EH(bk/efdz+o+ӥS|‰l/¶g̭NY_s'IURE\f]FA5I!ɰ +R,>p+^?l`TRa|K5ƀ=Q8j-6M@ 6 ȘBB_+3% )ީ){ t t.EaU$$DKC܁5t6;$MΝ޽&*I:-?iue[kd !QycV:Z?+ix=?3?<{K-HZr/3F3 ƪ릗':u<U1 qݑJԬxX܊k׳-?T[6,cR(c-Aզ$YI\Le֨w n e8(ʇGߔ >FHMh@{{o>__+w{xߌU.B x8 `f@cB23 zL!\H)BkR,Է5DM%!H  $ۅ|(mƯ}I%Gl4\kNVNO2Ӎ̯%YnĕH*Qy_tya|6|%i0u Q}w!)cɖɔ;b5iFj^TFoSZj'hc40HZ՛jc\_gi&~3T,@挫|ĸn{|`fvizjC,`+ LX^| DKZ쯖q$ ,HGl$ }4İ4Qf4')ؾJ3Q\lXUrǐXJU:)%'9h3Q!-}0;>*lBJTFN`΋gO:ZyUnl:bvIOYAb:ֲڢBXdW=S 9gF5ψ;fW̗Z~̓S:241ic-b!هF+gq]PB7~~/I̗:[>$qL3s0H(5\@ w\'E0ۏ䷘HɁhwG`|8M/&Mϡ  ^G-I+6> W|W7boPVS4kp]f-"[=U}dfxstβ١ d6x@pl˦9 K[+̣|&O5/})p$}5::%-[+9"/L5~O3y$nj׮RoTSiWuݒodxCI?d; Ȯabp-15?vا۽M(f[W#doDc5 =:"^A@dqfA) M`q)).;GؖUh [)0ʀ1be&S.U-WT^R$cU{*{h3(>/G\=3WP $/R2%[V+wRl SWC7B;9_E2 '*g2A([(تV8jm5^ʥhIhKJ Ђ{ ]m:^ע0*zeV_ cS+wP$NrlwG H)T-TX=ƗZ @Vlu D4jCmG\ e ;9Sִ) - -5J 'q/û2]ɛolл{ ^:`Fvp[|Np?׹ aԄaI1!ШPC4-~ll3"ӓ[Yfeu^= 坶?|7? y8j`fYX2e> @VSj*( z=&_L{#,}dS $ ع|?_誝א=4u: X6nI#VݫCо1-o7}@Qm\*oD+ <omS3y3rܠA; OΔԠ!%Cg 4 r&S J/M@|L8dX|j5U(:E>/g 9fPfIdx.YB%ȥN?3 R*5+b_bD15H*e{r!+rҞdU&"OvvZfEv I!'75sH`rWX~whg^(5BJ)Z.J1A\EWs='vZUKWǸ $~Kc,u!\2@|AY%@p}<#7RX!ėKJ+o^4:Z4>Z)kԈҧXKp2TIQzckHfW)]+1 ѪV0MB-HK醁i0lLl\LFo`,Lݎ,]e-3]2(k4/بJfR_gi фC!%)^ˑ}0'T 69Mhb|K }K%ql:݈I3lTHQO.jС?i H 5+RdG6$ۑTpwR5$nO W&{`-M_"AZ(Oң;–&)9)$uC F:Mo 8칩q>3UJkqK(r̶X,$͞e!v f2 eairH %> MaK$!B4[%+ Thabe1#[+]%ᨹ2D+ߎT{SC%f090z6t ɉiV\ɡdBGxt_LZ(LsS϶ʃ]&k8>[hUc) O|ot#T9 \} b[r{jW'BW9D=rԱ6Hn۫篓6.ʧ./LbLAN =HPUX9GBCCT3UC{OB$RhM緙޽|:G'F"0]RIS^˅O>.E 6\͉"L9\|儇6驊c,P@pC…IO2X\JA]z9`g:L!*.tbH*ݪ;}tnԽщ*t0se |kz5dU!9`v8^wRv'qw^.*VUʝ"}r@S&7t$glprtjjfnaqy9KZ&+L"oA#?UOy&#$(#4Ut+n*盭jZ:BVrtȪ bUɗIzjbGmOD;*g[*f[%CK2v:vrmtdB.ZHg >:mE;jqGJN(D"G^>6,V,of% j նL$O+iZ^j]yH ra볯|3\4=ַu Es_+awڃlF:JxvI51olsm 2n\  26xiܿG'\JqOEseuEW!=^7ZSHxaolmH[eo}^p>>ww޻~i ?}p=p}",k>N}kICᕝ.1h9?%.GeZx@,v$_˞}UJ7 7YTD E~O'X1Sml"#l^2Ηuyvg?-Q=hIU}{[rE۸1'U~bC<@}]2As2۸;/aj=cí3sg'ufw\$Fq&ol6xJ(AӺCgkm~c0G]UYyyVVy"b;Z/@~}NSᨄs7ΨkAZ(H(ns Aݰ) 'NP~11.>ԗ8Y4o'="6@ hӶ0z>\u`W-S r,UJ8F@=J͵۫{-VDXAg^K)Rc-fMMXW6\,F[q7I!.έ7\*øs,:3 ֌\/[x>944r~tǣ_j-@ɉ޾Uxd{C6Rgid)}L*N1J(::&2(8a]@p"6{q˾vf #y4BA_ߺ4{v^n;rȂ7ysW59Q.CӾs nOj6'诚{]#EkYfyJyB|V?νU^=o?WP#\X,aRrX-j jfk)t#R'j-f=Ӷ1u`v) GI3a7J$fGMB Oj0XGµiy56'bLr4eO{c@hF,\]Wz1X)]1وȗڲEI 2.n v)-%3 9962eD'XĚ eg[ai1`ݘ<43hioөfM#ք)z`H__{LX%JԜ]UC.VȌ],b׹pͭrQCKnSnc^C.@:@.~bóB3s&봥}HC?C6?Q57QU2iL_r Ƥivl,4rz& lBG27^;$V#\6aٶtKl[98)`\\\T*U`WFjDEi7Fj5h SoVkԪW-PAz&&={x)~Do 7=Wj&s㾥ed ,2K/K2{°{{/?kANlW&ȅDq9G1VHvni/F+ˁ묛fyR+T Yoi6 &9<@,`=f$WvBNI:mb$;rPj@$K C2" \ƺj}SG5׿?rWp:TǓJ)(j|?WR^9GТ/-2K-8Lb#gΙYg@dk7&#gˢ3)pdXZj;;kf;);)'S,ՑsZ:.T8fvDǒ'@vz}zfI`4H#s_iLG-dMV,h~Ѫ275Eos#_cPÖ- HCzRW1#1ȇv|]c%t,>(/YR<9GTPk 7JY`Bv埉w)\?-ii7^{^1?59*ojBz Aqy?!bhd^l)Ӯ6v!p3řt;<. .(E=;c6R=fyT!:`Vֆ7ph:H-38U9747l\+@1@*ӕUR-.M90Hϡz,ga);à Y5 <9 o *4< |2"ʒ.w5[S6@O ٹgI~*g,d̕D۞I^ WXj6D nH$I$K!= .Z'5~$[CPd2:,$pUMuD녺 1#LzяS1!(0C;sNr'dSzqwZmr' ~G>+bF,ʅݨ5y/?ⴜcvsvzfv.FE&yF6:g5OUsdqOyKvHx4L㴡Iy /duV<g84^t)t6 'ݟ/gmrC[?}4ǟֺ䬓d{L!笱 {kq(.&i oƏ t3>ҡh zOL:lp8oz<ޙ:(sQ϶3<ǃtLt\v9yGjH5ŌSX#d#}d X6y)<-ġMF7K?V?o5-DА8S tT z-0Y(΢4 nNP9PmfH; ?ь(Կh&˶.`g@’$cK=CO_?D_=ˆlBy>L~|@F*5ާA($.jڷ#O$ d2B*݄jKY| 9BvSh5jH)Rh­\%%NY6k vL`:[3T!{Cf4/i+CJuO{wnA?L@'Alass]/ƨ8]Z+Ȯ5d+NkIEp,(M/N6I$Y- tԢ .mC6hՈ3V'!KZC0?釅t2uZ&wЅ)oDW\>=7GvZ}GMca,G$kdhp$b%# Ċ"A@Bc"R"1'>eW(6?X0(CgL_(J"&3rZ{7hI2cTQpAad++x31B\ߴA84n# cu+riz5;nqorv7{P ZN&d2 ĺ1 W]Mm#jh$p ̢Y3+.ΐ Dχ8h,+( **G1 v$TDum-s6LtW#[|:f隙Ɓ1BĤFzZ# ? ;ϕn(UvmjgǬ YX!o{ zs~:7ƞFqY_ h`[5-M4WT`a P5\_gQ$J$NlGĬ1ܺ4eQfCMN;A_KOmՑ 1]%O~itxjfrvfT f}p %nqGNK_ȒԜ{H1aACjJ-*ID*ʭUWޢgĽ 2;kbt(}6+t7@欁JM::qz$٦D֪79b!Or6Ȁ3 T6N7aj46xxrYjsjQ9$-R̈)7Z>9X0,kk1|#u0@ $ Px/ue2X,Y7QPkCa:HW?(Pڦ,_S}EؓW)EUvmCz 猍p$$Z" |*%%KϿB G𲃑)vU^\ɪMɑ]d$M6ȓ |-|MqMSi #tp&@:S e,-6Gi} Բ顗ܔjKDKosٯ@娵n=\5Erf+Inp/g^{gF<_=wP7D?\9;Z+Q;\ᬱ8fR鶊vJxqK6J lG#EuxA^l%2nH>a(C߼M<ٱ⠶$ZMj1JO^8Iw(K->>}󷯿..aͿX@ ֙_j :=/@;Cf |__q*BDKӏV~ϫ*[UVˆI~柍 kdQ7੄·M(mF>87y9Zk//;r[|&苻ȁ©aœV RgoTCPҡX3P7b|zRLhp*-]|Y)fW靷V>iKwx1?^eyv%NJyʮLzʃX(kBD$?y]KC6B;"2YE$t#;L铲xas$擛 =mad35C DOR3a4rhPTa޼ - ȽK)l.l8t5xJQZ! +yVxTzk} j.K;˂L+Ln%碩% L^ŬӪۺ"4LK/r_Q[u{M[Msm*H`ö&aP.ttD[z껭-qS|":fQah ̕`h).ԙC2էfz8dZ$ppuqhPC:z9ZTwHRKZYi%sՓtXyB|Sv ;X#@)UG9D(iCx#SZ$ʚ$3PBA3#tP?!J+X0 EJŕx`X 1:>X & Mس! < W8*ǔ\;z^锹DY aea ?͛n\elbrSfHeq$ĐCBo<'~|堏!+#FuԎ및iSW٣MM>R8*5.\g:ȴP75Y3: eL`j1dOg/!yT?΅wCqDJfn%uaÇOT讬H@3\CJA܄uE[? Oޫ{2?ص8E쳲݉`,4?X DsSYg9R;ɓפVT]BvvYÙT4ѽlTDAxX1ed]4j]*:;7:79  jKc|\t<pr:I(+`M6Ct< C WRB+CB#4 V6\(5P?e^t0LW__hbw?4vHT:|{^_If/ni{aBV.ElxM!#Um[ݗ[ݍFd3 \VvB3w+m,"Nx}v/@n혁18$+&FKRo CSgJay &T#혱6yP承Fn5 Q TOR7!QdO571 pe Y*ӌNRW[xV_=xQ-&0{1b^x3Huj^bb 4,j0Ia9pdn3cW[@ڿL#@ ([9xQ%vpYycES5D}tCE8WX!eW*M6Tӣ!1%-ce@/:aY._b#OlK4sT+9@U/I@mM=J\Ա2E`iN K6V)yb6¡]Գh.7RE Br'ts`"I^!(`EbDN_~^ p/{~eFo\s;id 5X*9R+Zz'F'fFG^T͓),֬qk6jp2k1hp׫r, dq냴4j}ky044 a777̫_GCKC_^@t ~!w|~hG Ŏz6m):幰s99^z5٩v)֪jNWm:24.w2UN5ēLF86G]5 Ld Me M$J-dk̕ ץd À8X׻ 30ݠNp.+q69^PG?|쏒[9(\[b^؂oW`+3ʶ៴28ۏ X?Àl/jQs0yCu = DE^R梊UZQꭾTKU<se3$O![G[ s8ٶ&)3z-ju3=MeW2ۆɺ]'~kH/6YB LǠ ;"]gHfE `auy:7A5啻j勤rE (x {}^'~ Z  (0yk.03>>7j ro DJN^?җ[⥗뮓ŽhhvR霩|9+ٌl"pJtcbb'yIU9+vje}͋mF`fҩ7+{T0 }e>Z/X?+afeMѢcvzl ge1]+ HٰwKGo 4<Ȇ؈},$NR;#-^Ӱ;ߵ4y  iwնy"\st#vW%@-QyH},f +zpa,QiǕ p"c܎ﲿoUɠcMVk,^N^ea֧8:ә{}|*x壶x+mX_b9ē:sr]ZA}9)kh̦pÑVp!urO N:eMBDB#+d֬nҽϮ}mE5j~n>XU%NEV:"bSBt3 tF7ϔʓ= zy$IsdwXL@G]_C~ĉ]!TRovz}֪xBx]`gjƫS\`f!jhYK5>T!L.D-JiҼʤ1TXdZd^dQ$*(I3cՊ_a|&fZP/$xpsd̫"`@ "tLB7w#ʴ'L_U(WV݊mj#sSMUQmL2t` &XjЗ_Sm:~?;7yx_6?Z nZs?{|&{+ݒdyM-]@J,k$ xoE',Ip^!AvIR}>)WoŶMKSQM^ZW=κ]ކ#Dcl:7Vǘq,w sF+FƦ*1_`pn*Z:[A^cBAH ݌ ]3h<;efpy2ư4cWek/)|g}}uuӣ0Ժ刋( !.N]:9v~UY-/0C[tG ;~efKyUXZPg^$b!1 }ގc~nЁaaܡCOsL|̦߫AA -2,8xGwӲ>t23= ˃w3& TGz&@19l@90&* 9;'OOiv5YTlUļ{Ka qHOclBSRs +&W !ZBDk"鏯]XrlYggk=j@oHO›NY6 VƬbh`9$H"OKWa'P8xkHaلmIr;?U- +pi"dUDk71!k'd?̾,y{Kl =Mͱ_tո :{l;C,;L9;M^2/85TRůpαP*f(+AO51jm|,d' 29<³/TS󎆑_1#ZԓBGW̢,>}8ǝg{V(4G|'0utSRM5 5ҭFΦ ...!.m6uB7TbZlRf^^botIʰTn*9Ćs 9mM^7X끹HBhSZjgʰPjGXf> 6D7cބf-rґFYPtA'xρPc\n~꥾ק v': N4L͵-̵Qdiž{uϦ7NymO;A;ρeyMX.$:@&dX)~nf633u[Gon䘿n_vӋ^ܳzM{$q%n C,ΰ$%z:c<ԎCmsӝ3p5 HLb+^Fv]|jƠ&6XC("/3W߫:5$O6$fPP 乩U馚I'{g1=>s $S}-0 +Lfsl 5NqYV9|'R GAYyiO`vav: W yl^ ;O>.ǜ=ozьFW؀ܻ${Ų!l6! pe{~ !l߇|d!޹o9|"+(M^214Y "+NT y:Py:F64a0Y8lYCyp:rԪcPɂP Hw. %;b sYegY//?ӚU+-ttJHK3/arAE "]& a(9KKǴ B?b'WC4*^;Uy!Zˡຑ73GUrޯ9ޘ:wc64HbC?ۄ u&ir:wys޵SOؐմ8 Ju050yOel0P`]}2ikt Z'u%/=‘a+c7[\U;x2|3g@L@pf >`-L }T8}'| \ٲ(tG.VHa=[3Wo|ձ-jjidh >;y?T+!r>"rUί.׽4hPU kUlT$znUL[[O\bR iTSoϏ|t@S$Šm0}@NgRh (yT-_1\jzf.Ϊ}]'NuEPojY'}Z^}0|K'л7]~*ih_vW :5t {jב5!/?v1bM\<2[gu(Z}`p+ #LGQb٥ .E z8 ? FQ7{nQS9ڐSCLJ}?>yytK5= _V_Ya;p+B |;=ОmO4 n7c45 q֎H]{u?р1bM 7-T`C_۳3Nq b&'o[ꁰM/¿[zEm2ycbK&(kޅ+ p^݈b j3ڂ$l*0Tarh02kp NRڥZu!<d{>ս427t;]>{0}Y0&*P1n MO}ލOR=aĔcf(YԳl>ŤV0@-"EC!K.όʄ|V:ʢ6Ј+ VlVeֹnA.`nE>VTA+FyCS˛ϗ\;ؕ(C:h2{c*\<ՋݦϾ;~wPSse *\{0Z\]~q+ǿDd8r"˷ocRQ~7kߝc =xvϩ7T/&CV6dKQ$I-\+ U6Pc_=䬢X+ԻuE7:p@KzPGQ8C CMklrbfO<{ɚO|?;w3ӽ'gt|1 #Ӊ6y/ݽ?wƾ8ttihU|=GVh[9K]G!sz}:p?FJz6\ث[:D~~eأo>2/ $O.qM,p%qëM85[qppىuxP@<dt {hT'CCk3<ݿQ~,vM76 ۏJGO2]'JTEB!`lJ9c;]c<{/t2߾.q-"_d}iUkDD{7}Դ%5>LK>)g[$KJe}LLSpAmgf Ky'KXp՛ByQҎ(`M!bj.(C@ d˞evxןO=hxﲈuv /S78yn& 85mu}s~B ͫwn^9s㟾JciGs  y`r)Ouhh .+l*K@ϗ (%0/Plav8ـt<}ŶyDA?^U^'Jvb땼o?$2ڗ^~g>&/GN:y*$P2.#GQ)dR^{p_K_Cm壺5j'pWB-&A[Q$<: ;U>'gE$E[MџXShGL0Z[Xܜs.sAc&jlABX*+Gvo}֓^`_wڋ;9ujSg/5ܘq!ܧ]h_s-ռ,fhqdܠEu(?$* 㿜ؚw @x6jJRNM>Z O} f[=+9D:rk%` .ْ +m1E|=O >{ p|d.!HLKhdo>ey1֩~EA44~}Uw3a+/o\hJ5k#ۂ[*Np IH(~#6dxpȝB #= (qoA}Г1"jgSc3Y{8@n R[h@-B 7 R'c*Y ZtIq(SP2gسذwqratv(Yћ(틗D|h~0E'T.uZa/R'?aF־e!;B룼o]wg0CQ |f45027!y ko\Avˏ#Uyi $аI@c1w(dܝ2~Z\kY^Z g`W(5J#@l­!ŔBrxbn]o7` 1X½8EC>].x:(z@o# (!q IzjӮG#XV"ZĦX/|c'C>1x] @\U΃qs!y~\W=npd&S9IT~"*ª`~e#5Ҳ vDXOJ"T)xeM VhQâaUgYU µty4@2j?;7c}G}X~VvꯝLHݹ\~ql(pїIp/?+up߸ϱ?ڸ;]1>`? {(΂znoHzI=bsb%)jJD(HA^IUi"动J9UTDT y:6Q u=k w:v`I(nUxԈ3]YIoVgDb^#e9nUj=1XKicK/Σ^^F:v!ƫ+Xod杕Wba]yīgug*à}}om„̒<=o02T(f .%m(h[v"W1!)(ul#G < %|+P2wȘ;DL!@+ʥJN-.p^Z 'L,h;#qPF(wWYG+zw #³?=űn:?3IZ[ڹPNH?n@@#a =~ 9̥f I%A@>zVȁCsiW ߻(yk'~f@ V7m/022UnrDۣVPZc@:] dbu5xx`[rBDDv03flI[%iҍ^`(q Eɤy[r;Б:E=8H7^\{E:K}s iTAs7IUW8z#qPkQlRZ:yB\*Vu-FN]SU4zENݮy@F- y"Z a|RCo4l=3'F@yTB۽;f; H7O b|/Ac>hw< :X3`ui[1/8z@/H[ōQ`7[Mf.C<f{Pm"Vy0U}lB+$? :}>ɿLRkL4}a2 {u݁zT<4UnCc% e{;ٝJ}s,suX~[#"$C`M 5BîrrkH A KTFZ#TI  oK6"IP J}N/9&ݡ0Ng3 cD0G)&*y18Th{΁ECK`ne#.c+G G)h?.%`כg.M_} XJYE0„zm]"7W ΍+S~zw34P0#5@C @MYMLSg59e6!SW,RZFժMN]eV(`b4ZٰmA.x0LjԘWbxhn<|0@ǡ\e&u$m.r>4}tc1ߞG}1%1JB9(x[ o[_t<}~sAKSƷ.ڽԍ"&-66q?UZzhį f^'n˛J)* \%y7Fզ٩VwK9T8Y@5[&M>SO^ţ?it6{4\p*= SCwO /G?G uo0pLJA ! WW+Tn.Y~ TUo.K2rRPvy:Q֘J5$k"%>NQϰJ'SdUa[@-ݧh9h78wp|S&4QTiU%^999в~e>zPy2VCT fw",51J| d$Zeh= 5ޞ~|й/.{}f/.M9{CSϞi;s ݀ޔ=pWn]3M/#N |;s=ь5jgXj(+GLpZ{"ȡ꧓Z+}EJ#IyE Ih@,T PoeU9^CPcU9&vQj`jLhU DJ52^S'6hzA[b"Y )< }F3[2(ƓELjG=`+-þ*R٥!S)\TTamH 0PF@_e v @2*ņ}YoGҞ !r] Lji Zdb@ŨF^]nf[2̢9LU\*I6BZ ՠ5(EuR~\Ш# ϋ^"c)ؕj^V0Y1"Z?lspTD+MLQJOOON&I/mT9y䅙'fMA[ myk$fBv`Z@%ow']w''Rj$iq\Vު5 <)\+ZJ-QKEb63F,:$LfR*O堈ɦv2t2rԶ}BIP73jĒʅݰdWL$S8niMj)(> fE͙OOte8wgv߸1t>B_XtEHq԰l![DJz |{j̭^MYTfNK\Sև)BU!2?'7_0Cyo:hu 1ѵ>75_mӨzBgؔvnwt(J5EL$=zCECpx|o"&.qs|2_gfnJށR8@ō+GFϑaU[~HaZFJ.z?˜`WR,&v+"RE#ya"b$vd!z0s%t>}3x^4R=0  vT ,OHw9yH$`%XeZ|w_ $Mӄa3 6B*]g/7=?<APLMJ$DE I6d$1 >UԹ"LÇTg5.uG+̈wB[a7yQA1{N>8gqlujPV>;45/a/^*^[`/oɜ?}ǝgN//u_ eb]_ B8\EΠvp\9PQ1WNǦ؃ 3eJ &s 7B:[|H(Qr O:?[SS٥S7گ>pʙB:}Bop1-^9e/|~ wtMHڨ >`4"T܀-)S2 X=|8)dxlc'O}#wN{ݟozic YCg"ͽWnBЍkhdg zמ=V!tK<`ݧ4ƀ_kz$}Qj !وPb<I!myCc<8l7ʄ3$ddqp"WzFs ΅QةvuDGm v>6sb)ҧԗ]Wǁ0 (ҧ/ ?w4^ɸ^^P(qCdwQp*HI8paCzPMvzDfg_=1' p<C.cȍ^!Ey IJ,pf;OލP{r*v.\'7K:tɋoW?$EQ&+Lt" yv (­*7x @عJNKyB5 7i;c)AS1@t3 y?T`Zj$@;FMk}աPQveb5H#(H6"S8ӷ  fɔ7lҟR+Ԇd_NTbg Ot=m(#{L`k_~/?-KTuwI,Vsr")$ϕ27BDLmDtR1?()diÿn #4ǀ f(m".0FXvh N=c FH :w(4QF5vOpۿ|X  BX(CCT\ZX Nkt"RKB$tbfqNġ?oQUT;#h:b4R5Vu[gB!TaHr :aQaoQlWUrP UKUVoi[@ij'`Rr/*;Y9PUPEuP,0DEAs\\beUmp6@%ۭ?0' 9DGBR5@VLE#\d`TnAsG5)P+2Hu5ZK]"I\WyTAn|'vG; f5n[c~s6|[E OY: o]lCLwtG&!nJh`t(׊kW-،a눰B"䂐*2H`vOm@(pP{O}fvPjz5 5h]w4tlnO_us(; " |lM1ULIIi F-t{AU(DR'>X +TjVy]ʮ* F%B/ {w'Ʌp2# ֛FӶhf=cr父%Q+?Yy{gG?/|?dm4Z8N$qrB<݊  (qQTBDρyc&*/H*fOIyr~ۅ._ܞ;/R|3yel\(^lUB3 Z ?XnO_*kٳU ]J-ɡ v[Clca#!3ehSfQeC@JN#%Dq CpcmI2~K'Pԛ]Y2MX\-XSng JДA nqqp nyțECs)j|aX0Z1X_Tk w5_0]F|o߃_FA]Z+t^:Y`eOh#1a.HwO$A:7A6C[m!]VDka懌]wMӟT =S5:] DbC 04gHJ+tJIJ'FZQgVh:&P6:uz]YSIҷӀdUM=Juhaߝzpi Jɼ$Hj[2URЪ?k~b𩨒Du~$Bݐh79WP6:̍vG]grE): ޗ~aU}G.\РAۄD\?W,(IK4̦v$V%r U"Pk1'{\-^]K)HQa}IO.V>^i02Y.66!!M6YMIHfiJ[}`%N]׈z苋, J"!TWGg`T rB*S(4 *5<RRTp`~.#DO&߯RGSPB>an4E["Q q[±,P3J ' `x֞$݋"/%p@kq0P~z$?m>ta3tFBP"ѯLCQ% V(#k2PcwڿW/߽s4㛦 o'IܹPqg/??wYZx^$&elAA *FkvaCPC&)lG=T Z./4a폴Wh:2P)6\1D_|)З dUDeuK]8FWoxQԁiZ<oD:gY6'GoYzoha},]HU  G#.0X"!}]4Ͳ<@"m|Č?!ʶ=t/qj:Ízt!JbAJ x9:&r1_H=nNt݇yQ7T~5_ mF.K`vQcy EX1ۇ[,1{oy$1E8BiF( ,dIAʵssBU|PxxɯO9? $д@_`d&!CG1&N!Z;`B@$ K'|> C #="`U"5(mpj; g`$ G:TKѴ@`̻`#Zסkl z8h:HF#yUTڕUMA^SڭQ1OZe3W:Lv=T*{FF Ӈ;9"6 I^AJmbP8!{I{t6@:A:XT$x&&B3EqP<Gz,kt)CZ P'&i;" ħ&GF::&&!C>\$pI냬m! {Zzh64 x`lfQR`3`}k8'hdYgwk)>ڕX%j,oŷanP_q^|"H=/Fy^2`*vAPC5G9%X;CS! M:+O7&f#7UP޻z5Hqr: g;S;+cx5F^Tļ=uy>_|0 sFSŚX̅6SCYiuE5%8)lr_5U a߂BY d@_D$SE|# N :PP z)50ՀO4Q|}'e3(}[]Խ]jR{-:Ⱥb?Ou"cΥeW#&Ĝ Xz&%w)D1v*JIVyf}Vⴖ->gC-!#)=.=np[<&@.H)zQ&ba)$_9g&Lde6.J6Id;zifX8=ZVe4;$Nag`UN h\Z@2\6i{J#0 ;ߺ>u}2J)vdBUg9&cÞ8meЖ֔Dos)ƆB@s pBP/5 C2<>998- //lStuTH1f盩j_Ϸ窍mNj-I!-r^" :jqX`?A ;vt% 8p~3 F&l}P16;d\/SOO_+.L͝"3ݙt>gAL>t\:}ħkwή\ެ^0<_BYgo07ku1s >4E&blа  ZrjJ j <(C`VyFj+Hu.KӌZݎBS""W{qf50V(Wct-`)(ր@jUV*op pl%krBqD,ռ*妫Z26 `wH8n ˆB7:yZ% '4J\؍@}L RIRp 3&-#4 n 4,H+v]JX/ d "Mp,pPBT d2˒+@@>X XN,g0_s*Ǻqۡk:zcADC?RN)3]DG")da$fn1UtUn3&0|WllcvpfM#ڡKpX֊%-2V)Btb 9/o-<ghU>b# ! Y]l N \VNKTL-r=yW!]~ 9th"͍"nQ+;#- 6tτ3LJǎLlߺ-ȳN,mY<& Rf)y1>!TŃt 3vK,ɡmv 1ow>|>$pf33Yٜu Z&s,n>!qV`ef^âۂâP3?/UlsdfQF:TXnK XBKY\+_ϗFR=n172x6滖Ĭ9B:bˣ+-&. bm1ˌ: 4xѦj$@.= UBtS/%Pw_~ޙsg/BR=ܺy19ߡ!?sֶ*O05լ[w4|_^y{%i -BB*"U)65BH[jAYbA#p xPa;@;V4L@z\*P%oȗ*%:x e iaS{Y둴EjLxJfPt(=m}v|? MAF ^е"tBU*v2YFab!H`~l T6 2ɵNa\bЊ'[. 0JZ;Ч&&& #nuj+"HU#mlD Ǚw`q0}E/H̓ y Y.8K"S(rY*IbYj<`mC>2*,"Q涒q*mtMMdfeV >^:5*0QTIȠm`!oL7G,|+[օq^*8/%KRa LM pM|nWZm"rpzbXT] DGP!/D<|*4TZ.ٛ>;'s7( z6Fc&ܸqԵS'O?mo?wD](.(y:ȃ mڎ }M ,ۡl`Uo:}Z H}$LW3 P(EV0A| "@ M=,;dJezͤ$N*4vlH/!H PBXPQwuuuu]]ײ6DEj4k}AB}s~e[`; meN[Ϸtŕ;sKYkawIл<"Ub (mZn7VѪ9 9p\/zP %[ý ,JN=3f(1)2rBM#Srb "E||Lz5U46"JT@MB|Y6ߩD=G˹J(Ơ$r|<ϣM5ʽ&8e6F" ( ^s˲c_ϵY9&INM[B2\?[הgLr-r@82BpE[2γhi`5# xS">/j``[Trz>mEq-1 WRm |LJ;Y"9@qr |Vie%#.Q*QLUENqeNiö$!*[.c4̳ki@ph]6霪wCMX;G ZHj T(Uq1,ZB%}z#fu˒\ׯw;tf5G#\h(d,@c"u7 gr~p(ۣ"Q40(}3"πL##s$V.eH8PuТ9}ԅg._AfN5!ԵC@A4$B _8ŕc_L~ah]sfDsq^mfJ]VjuZ"$yMkJRA]8yMnYҧ Xh6ꂱ+::O<HQmQEVAS1E"A x*9ve&ZhnJ#+?}wAƶM9"& աAU@Eך1|KXs p GN|jk )yA…lrமLAdp2UY4M$] (*\W(vF}2(8feOR,< -)6A䦸YInhC1 tǩ:(Ľc3wdm ';@BObjLJA? hqa7?s]dQ+eG+x| Zh&m7D@_-@,*Ґa[7&j (caga׻G@cvJ}ZAt0@z#8 98Qg"@y8TboC :QA_"|*twvp`mwfJbtVfeLgsO3纺!=} "Z'?ٯo©&ԮkKB앓_w7֯^{ unBS4x:3kI">% tćXrYy싓'w5r2T23>M2>aPcH$:`E%p31Dmn2bN azβd/>|@95>驼.LH)zd]L~ܨ$buc(!,HR 6q|⃨dauÄ8` Q1P,Y\ O@%`^쇥k!=*+PG0sYV`͏bIF#vGuz:NSE (Jnc- zLuO4e?̳hl0'&?C. )7Yk el r .|gI> 9ŐSj>k<6&*3pd-~0Jǧ.ݴ4\9">T x WI|ŇG9p|x g*"|"C'2"D@r]`?qP˅@haK]|PxQ0!>is]VݔF$Qp s[K2a\֤ @,HY* 2429׋+C:5p{X p:Y$Qza~Xzǹ{sb?fp?qZbU r׉h ٲu9Ӡ>߾7^laսLoth5ӢYRPLC84LW4V0M_<+DљħPsYu N8~1t %R \Kޢuĕ?8G֔uRDZO쮨~ EţV#L*4C)l|U{9.@kaŵElu8 y!T.s+ "x,9h+`oa\UY|c+,v[ΰ/$gaj``ǚ BAX +lLz=IM:i(s-\/ADZhGKR6\1OhT1:$h9q&ƨq"F?zg6! yE],w-><݈mp 0T"2@)x ?Ϫd"ߏϢdCY@-IB)@)CFZ0-`]4""βcD9MEkRj?Ռ8޲cGe f J7m+{퍏~ uPZn`"hyx=SV" 6# EGtQ0ssoƒH:5"dFB4ϲ*+W2n7V^ O1uUFluv,ʠ ݆Yd< 96XtB0d)w[%Xƙ!n˄  u#n2d@roFjr2 }*"&јUM+8LfX˒1=@ːT9WLJU ګL5o?Ӎ)tYgM.NmSDXÑ hjD5+;Z rsX gf4Um?>Z|gZBKnA9QN@8#A=G(LQ 㨍m+Rˑ=ge(Ԭ6@?YXZ E j2l,T*>vhV>Tg[~Һg_`7@cA㎣PN,`9+~~\sM3) AmhrKe vQP_aȰ. R6~ 6'" 5yH'i{ ,=-Va7iF$;m-v/~/Ր]+B~&\ň$d$Bs!@ UM%:'}gշ^^kW_'퓷oj!wy`&HU ZʫQ+P0;@@Hp|FCu7Ip_J&8L|@L#t@/jC"(G <BGN=ˤ]q`?1]4gq")#ꉘUI8W9pL.L1c%Cُ)8HT2ǦdDZE5I3}9e5{gO).]$b۟-|5Մy()흗cknJ|ąiԖ{biTfPTuU z⃨7)cwHUaQ"O!> op3kI&E v+)HK~XVU;Pq#Udeur.IW_jٜ0 )/(X`ɩE\6 P#\|8xrNŌi^ڴ._t9TIU |`삽.z"G؟}U3둰06/*Y3:_Ad1.4R&j53 wɟh;uWH8"gR g& ;BljXBo,ww\j@9\G;c^Ú%kz'liP u#^!҇A!3X#&܄DG G!0y_Z~.: E+ FnweEVt/% }DiEbM>2 nTQ#d~b+e-ų 6B Qms x^>o*xtE29H+/lD9hrD7eoB%w xCCG1 o0NJSC/i7bL,Ƨc Sp[+‰  Cs=>I z->tͅIMkT*"Z<=aoD{3ICz:|C@4**,zez5Fܙ+r6҈Lqs^aZfn s5*^\;M 7 jTO#:l-8{b<|^{Üث{}?߸ShᑊmûζLBmmc*ROhG,J4ӳBeQUBhX}ߜ(9`?(Ar@@8I@ZQ~l:Ξ:G :ՄI৮j©Fk&LPjpm.R/wùqʹݟ南ެ[]f$ XX]`ˉE/:rl+bhϱGI:(aj qSn_0MsD?CUhYbfQYm+9zw:0Qy%r?;!Vo0&-JwU  W1 3;%. 闺 > NĨ 7$mO}g gxI`ԡCXZz|vK? k>~X^L|v nOZ+dg~dNR}oKڜ!J|,Š DjYbj6;lº (Eշc@VcAG8rfxq@&HR[X8r^ g]x dYmz AkJ+qoO k@ 6<0> DɾY;m d=$vtKv:4R5z%홲8( kM4PI8_R+l 캆RM:&f&dZBmϬ兙sID$O$bk{OC:. kU@RE-s5!8!cNU!ېmِm\|.ssߞ=z{g~oO,_eBQKZ+H<$F\܋6x1 K5ٹ^Llc4+ȉlt$V"7\óy.J3l͏[iiʱlI' osX'/pmw<04gg֞ 8s6y9,Žy ; -Y%'4'nNB]](us =6mɍӿK%PNT*7K˰vIyN% /0g|P| qD-Ipve Oggϖ^] AZ|O{CI5[vH%E1Zjښ3 Fv".l.$8ũEprN&-#9 B6*z)xAl7P?ք 7\:4u9Ԍc7d?ޭz;o* &~ԃ#s^o`sgckO ]'muQʚikKz&Wze:Wf{`zJ8( ͙-Yx3v,($ıH68  ڹd$& t>,G4fzdh1jTAvF>"J&F")#K$)SF%'>6򆽫jm(::2 W5" J8hP?E? P]fT|Ivw8W]+ɡb?ןł C05e^јk0:"eJDƫY&kgCfEΰGR(V k ۤ6m,7wS SogW p[}r\r[{%n,0Ժ0>>'+KR0J4⌀t91ufe,޶?=,拏z7W-yM ]rLC!8&FoDs W+L|օ< ?L|&ԇC-⳩4 >8p ac` "\,0b$Y_#& )ΤuR9ej|-vik47fb0.쐒Քkm.d8nofsy9M-%L V'c;Vs)A%d;e4I?JQЗ5Ѐ91-[uBM-ݤnHw GiF5BՄ>&?SԤ~T⢾5Ǿ\1 (& 15j'C/H[g};k蘙< !溜gܟ1Oծ|Ξ&Ϝ>sLT "\DW,BEOlHajjDMM·Fd. 6hT(2^;})wo]wL~[p>*pCrd)TYto`POPuEA}H6GgU.Sﹽ4gۀ}hvqD]:^ΰrJs+EhSoL"監&1!(qD Q<?-S X % QI(ft[ M:Q d(Rgm%:)*߂yG)rNoΒM=ݜnwビ pMw݊ϪP|BFu I|KD|Pe!> |+0rG4=$&t Qnyx-*Zϧ]dU,4*!,挮PEɢXL|d'm3" gg] {ǮeCc#-56?,GBs.s떄C}.E0aJBc?|fqa  z\~tC 7F $cЪbS [p`BRb"x:C1I|p?U yPBxk E (~Gp- ֣k!Q;dҬkAUKD v$Nfl=Ċ7LmrV 7>@{V=h6#_^!,6L8/a EA{82B'/J}mbGt J&tz>\ 4}rF!%0쇩eu?q`x};[xEYLj~qI{qmnxţqmcm1JGT}codzb/(qƪ%o>~rh ַ Cw3ǔhTCiS r$MtjBI}?Dy[gK$Ϝ9?nNAvrmuy>hl‡̢ l4&Vs-MƍMXq t`srL `(\&uG+! tP׌E8VףrYS  +`t 5ɇvS1ݱGRbb]U.XcB{?jW`hh?hvK[hOw֚ؓݰ V v.Ǿ6 #R$L| !j|$>D||{ 忌-l.-U R M# u@kWpsFaYc3Q|Y  ^F4V{4>B[栴<1!M>MmSacMIaZ0HR Dw~EL+9%\L=`?q&V4aT!_ aibU򣜓{omVPܜl];+c|1ǥxoiVNpg=9Ԙ>ŌxMQBy64P_DdXdk(.v3t}ǽnDlzjLEsдYSI4J I{7~akOn+Ͻoேdk Csݝ])Bhb%8 BST5jB@dW u˵T#ɵ&\0!]#1VT;"Fm3]_~]w"DŽ@".Ͱ1$.a.OTqjT&,ž:SWX{O}]^t=fIb&aCY,ŐQRJQݣv  ʨ 8t1pH>05MŖm}yH;Ȼ{cOu d-s08{Rz&`"h͊tɢfeBŅih®Ǎ@sfZT3ML78[ҦPabuZs~d X>>G>8G:~gOtG:w<zT  g=BIsT($I&MGC|]T{;`!Ok8w?jHvR\l$ -O. 0Vd9w7ĿԹoAb >=dyOB=Mƿ0mkv|۞|,]Cj䚴H^W#R):|EJQ45ڍ&ƭDջ}5n]'vu!ɵg[E٠,&UaTVɈM*ʱ4 1UٲҪ oL}fd>bھ>pE4}Y3 f9tRgXTT$'EETúmx`m;?Lon -5 ʭO I~z7 ̛z6ЬJF4Q֤i8a"-7Gn͆@C}z7*=CZ1ddu]e-<QesJ, ȷ<5X mq GgTMX>$jHҤI$QӣPnPIl(MHuH42Zn՜/qg!TR_}hp+"W%*5K+JGK%Pjrzfě&ic˂ 5V SҽTM Rz߲r:mj˳Ͼiܟ~wl)óꆤVxƭm)2,,IROqFbi~;PAT4\/IC=,|ߠU3{y7l]8q'GfX5 ??[o-_~Si:p9l:yᢀ1b}zs뵯Léj(gD$ jt"g+Z>/WM?>'cbFc[ʛb Ch&H;(P=\U[71pӁ ?0DrOI}TO=Sjؐ!.P-nVsR3},[[R_&YY'kHlH5nI7oN3mN3nN34%jR[]d\b 1 t1%ƨ }d^Z+.KPG<5jEP Tm rM1W:K]D7[? k,uyڼBb9Υٮ%& [M:h}T(A!Su= j PyjrPHã/rGI~}[ uۋs՛{dus9OyM6E§XSnHݑjޜjh pc.KDxi@S1'`\ېd\qiPUZ)z j24Ѿ^i*t!bdUueoQcqg[vU-ٚ- x /*Mkׯ땏q-cb",鶥c:w\Gc#&[fE&h>3׀7WI+˅Yh!"^B'heдIҐd(='R6T>  C)My]#\d6o4>6geGD0"QGh{z@̞=UK -Mi҆m sdu늍[6s5qM5U UM2 \ q\IN=)Th@}DbuBRbVpc=;3!>DkXYB-3NR<џ7-ņ/6Vl.{#|!>T%=5ƾzfwr˦W7ls%& ǏHIK5DOpjE1ʎin`RӀUUyΥee==!nc=ܪEOV]?u‚QіEoNqQ1*Ζ#ǯwNцŮN@_h|sG?|+'yW^^x%c3c|jj4H'GQVsGkgnW~R?M1 ICRSYgSoo|K>k?oS?9w$ \>͖ő $ ?L5kDFh\:r++;:5ܬǥ!7N3?˷-w4xFs7ꟽQ̘#en^־=G9 3odOvM>OSy{릾M}=;'o$ k-FRq}̸7jQ{Tݪ۔*"nGS:f$QfP`%|lԂH~&0#CXb/-`0Ks} s7ISIz95b*0vC[NwaMwDmִ"U:+fcnOl>[ e88Ǹzf}@Rޱ[z7䩛r Tz1Wo,uliuIC^FpTKxtGtJkըߨVܪE96:.1fQ-nQW X.{C~/}g>__|o/> Sw>w|C@}ǧ>=otsO̞[7[4牱#eޞGTk}0];98?ߵ_j`FyqTHsT?ƈ! .+7|_|Co^lr+Ǯ\jpbW;%0'Wgߣ0ѨK54a$H3,΀"\tɓO򎲹UH1T-ͱ,I0n3n*6oyzQXdyVnJ62y@<ͲexUE- F.I*"VdW)jhC,TuY< a|ljԍGB։)6SrPsp vqX$ v%` &T|n\d\`±:(q) ?3*͹ώ5(}@`۠i;fI:(y`ꖁi26O_STg{ @*bʃ=:j2uYN;۞:8Nj7Zv緸;hM# SHr@wA$F+ԃearٍj%iM1 tJ߬GOeԝg>ޝx_~/>?v7_[38G?'9|ѣ'Ouji?y';st˱SL:vvv}_}|ǿW~/8W3[_M˷,8^7ه'knMU)nʆZdC#IGݴl_=g?WG>:tcߴMW_ï#gOm yRfw;6lp((9Lm8\6q3*>}H۩ێq⣮w+{mϷ_r͹7?PaCyRw[]l|`1#mބH|},oC9Qו+]tD~HkSNJ&&;@k©vpajSWN?o^Z{YiM3o`/80$i@>uZ ˳l婖^D0bTG]]|xX(cm DT@ 'tu#paA A4DoS7Ǎn^=.3|gmWlce aΝ#{ow඄Hzꖸ,[vf=jqwE ;z&b$7 vze{VKA}R66n_7eжm,5jzhr,Y^D C3 cn.,4'"$^d)8R<fzS8tMv sDSzg[}c]>>c>xǴ$T䥅=foHm,[o~_9|\ۑ֖.TΟji=׊2.ӺyŖSgϞ>wL;b/ w :N;z엧}Wg>voזCo=^? [gskVBo{8A7׻g_~w<_}ّ/Ovv4B(m'>š}^{׿G[{b.> 4x-Deˤ+߶}{D']8x/N8{㧾WOW?߿zcO(bSj8J4~}g΂>[XB>݁y…nrЖ}. La^|9zU9C1tIO:mN;|?;o>~VlLgmAL7ۋL,d|8 uI/8QkxQ{ :-Q2,b\Ԯ*eP855Z,BthۊӞ.x' 4LOSl'%'ҵ-=iaʋ]׮*66`ik/*zij%H-B%ST3#+0ptm3צ].'$oIQ1. 53m_^-ٱm3nvoVƃS'HrLvK2+reE⊔}_ۿ|^]_+_{B79'mBwf5qJk'Uj=o]|<@n/Bsg[ZZOu;}ㇾǾxO;xvcBW_r:;g~Z[Nhηwsg fgδm=uS-GQ/䩣"#q  TE2L!` BH\jj#Ν9x7_;GZ?} oٲenן{Cq*;*M#D iXo?.Q\3W?_O,4Wj/> ừ"KJO?`7 ۮezܤDhQ1O p}iKCU_fErB)݄2>[$˷aY_hk3qjĴ6'!-EexCs n+#T楸y:?쉽ǬY/IuEu#^w]b#2E?|];VSD=Z1F$K5cq\^Pz50аJސ`9yH Oޅv-ȌLYW̤ <<M<`Zf^XmεyJM]U`Ggm)?ڐk4Y|rx z^RW^Oo~7>|/]5iHHi^v^>66}Qa2)vY42޻{YŇ{Wϟ;}ʷ|{qpg8+ Q p5/Co/a{]Gw "<9`W=w_9%鯿f:s mh,uyȤ2?꬐Q2_Ay3m]g;ϷuoG@IQd]wW?1 k l ;η^h;qxm_ro>x7~CVl9i#]gZUgD;HgS *.}'~b1~CyX01=90(!LfKϲ*Te@ʎ}"Y !υjs#zGɞ){ȔO I߻Ĺؾ~`psC3DSu5(S М KߐLqh{T"Fj[t2xl*sހ:' L̸  eݜS)e&JѬiJޔDKb-+16 KӯSA=Ml[=îlM4F=f~ܦ卝`6m.M#O7& T('L?2oҷOynd#3ܐ0XWq:Y6[KFe^us&|C S's|OG>ɏwU-}H% V*D3LulVu?|73pڸ3T5rKbޅnL0fy#J8"rNjh"йGt΃ts<1yoi9z!WG I P@ģEb ~߿~wA%+@(Ѳjl9vO~'?18%ǨLpu-,E4Q^'W-4v);rД] l.rC߿4-ldGFiS*ްoI-R&}qб0վ,dzlúb:X=b@XTeԦk߰4A T oʚ4z3VU <&]FTS} <^SzCvsq@K7?пO!B7P/_Hͽ ٪5A*);Ri4&Jږ?qLJ֣mG/>q\Mq7>waQ][PaP& 5K4+Q$&Q13DcK@)0P}fF7yr6gNg^﬽ʻ˥9];aEl8~.i߮W?jiDԶ`Z/J&M E;&5~u'4Koa@cY@ I@Cܣx,mhꄸ|X}ᷱI|r1 6Xc=0u/P Xȇr4BD#4J> @ֈ &zTO6^&_xu!AϏ0}9vO;bPCEO"Z_)Sw:uĂd=xElqRn?0vJ.>>FrtQ/N`e !gb-Z"1lzAv8'˛B "A#Y눵)źeL±}_p !HѮYwvvv_ 6fqX- Vʍr:ZuqysdΞ[coGʭ͑ɏvR3wF;-vFY틳{?QbyF#MڏQ $vh ·z,nLȷ1kog*@* pcUv Kn%r@oBs~,8t%%w>׮T FuC>z%Ц%յ N纥{M8%Pe#NO\GS +$-w@ s2k1<܉ېb;a-9SjT4;]GjqyZ"44EM zm%\ Gp(Z.d %l^pA mI~_lX3xY1{긭 owޔd{~:fʹ~_nu(%zw;ΈAܾd)Q 򗈟_"dmǪ[q .;YU {.ENToi6C6if64㳉xs,esor 8 nifLNN Mɞ[S<6;ggY ^ima&zernk8&n6̏5og+jG;f̶YmlNcOp['p.I@QF$D|xLޗ+!hS7X",`f>w'8Mp߆(eEv]KܿtrXEC#y{.|Ӽ - 7XAΟUh.hV16 UJaØxi0LLt3M'@t 6=ah \{F *6 y@t`I[QPk"tfv"A f&G`@&_8 P0.}3II!=~7շRTǢW>`\,6jMCyU맏~vzȌd-%y[``!*'vm}V'g$duΎ̎^c:\$p'zr$_fNnF C.h5DMf "5[aӖ2D1O(jcD Wm_$`W֖8qw4iMK\:. uX&_.Yf0xe8qk"W-8TfQ:/54q ɌgaM^-UV2\[a)NՖ.;YPIژ`oq},*uf*BH셛MC37->ܬ&r(h\,3X)3B ʆ ۩bV\_ޭk 4mNN}C5F`w-/Qt_?EGGzt^ -RZal}T5R ^xȮ=£ yG ~ѵl:j#yl>ǿxe2Z"2(c"b729󿟺S g(KC 0}Kf2MvKv3@2g [SnxcݰjNĀMɲwzM>8ち{v˩E-5jkM=[ǭ&_VXOd֬콢כQAMNj_2#cXl7^,e 1ûy*ʉrE2'Tduso\)*)$d '0A3GFAbb]rOp3U657Tk4^IK*a2M` >jr-4 $y 5_C QI$U@[pCl 1OSkžXc5`GNWRXћgǙK/Jx0'C 83B'ӫb1Ц={.O}pS_yK 5`c ԰98QյZdk>ҩ3}GqCn)7ԘdH.!$ kS` 0Ҋ<{@PhnV撚b?,0t2HL؃q!^x ٚh=f`K uՐ-9 ^r,N8OۏqOp*8J8cAB$'h5_0Sj:]bD8t;m4`'7Ul8œ{Յ!chʆu`āۑӄ?(\˄,h$\pu0:s\?7TN],- p fT⑎{:w3&1Cf8 !/3V43ԭ3N|zv5Y žōhF "j%fpeLH}u#doAX.ݹk7\=x}Jp^>l>1"[9#K9X"ܽ~ttmbp:ή9\8(9k2\*6BRb12+#P&0M a.4oF\(dDsI\/ BA#Ă6'R<-mFp 2ðH7SyXrQ>c}&ϋv[#x[Z>AkDyPlr:zgFvo֮>ng&297ƘKNr-  -cio2!i…}ŅM.w87 ?ٞ8W7d⣽uM$o1tNccF!~'~pkȝ}vO79xJjʿ\z,YJc _)kY;Q7@o /1䭏[k/|v0wʈeCR%xzt\z A.м oDzE{?$ g8+18gDwEr}<M{yڏ*$5_7Nq'~:;]O`ECRFD&B3%Xg,۵ƚS?:..le/حwʐX.2]"2}VhUd d0L3tO7߽خ?|Ǐ9 (VNoo:okVl9&_Ñ|s >Uwr0cƒ<_h0yIB?k0bY5[.`77Bf9$X|bGޕᄐw֐_~ÐmąZֿo#+PK%G׿Ճg/o55e4U+_~ᆬ(7~Wj߻YTpr{߮rOe.}%΁CBSM8v"uY"*0#E[¥~APP-ў\DH]L:7~ŋߊ*/[ŝۊjH7R GyXp͊;V\W^XUpnДV\]VڤB͊[+{˯l>|ںA }9"}s&ykX.j['ivtEA^6B_݂E ː#SQuU%Jme㺚RTxwF}vV&] &X-K1U0n.,OGo_*W!^ IVR[ՂrVDX ;f$T4AU[(xmj45 Xe፪xiIüƄ-amѾX~ut^iowPѱ}[ n*+FZ8 hmPd k3 '@)Y `449ԴU]P?]n=I ZI`!U⣐aBY|R M!REAM(( QIs͘TUW>((,zXPp3|r|玱]EE  *|=6S/g1!RoIˤ}ak-.[Q3&R5E+K**5^߉: ,cQ6JKn9lޑ\<ȍdHȚ=G0Il24&7j< f@]we)X(sq=Êh.ڠ]{^k td!/BjxaBl"iP갉) &2D&Mt!.'FSuA7o=:zNՁ={r?^hF=~"q'7QD:k舏vY\ӈ,[B?+;/ qj}ikb3:ޱ#5kMŠ?ܻe ~O63ofHb2t)A=#! a&uu`2B ϡF! jkPcH,t$>12־K.#Il0 &TD!Q|S05B+88 Q4zknPTw L ui (wGQHMp|w?~ro/ܱnXPz:PfМPE(:)hPjjqU6wĝ4iZՏ5Eׯ|W2%*bК=7&x|7֣r?~JX&gX#YnjtWߗtPC)|ȣe=ԴPfyb9BgR7ZE iy |VJڌޒ+~+[Z]-.V*  raX UAy Q5L fU?P3 ? EV*ʯzk1, WS^gajSYA= uz|aw;Լd\}7F3Z%tĊ*,/{n)wE"܀6a:Nz-D @`QKSCSjim4* UXu 1 (O5:4+#/ZuxDo/!I]}ŽBZ~ϱڞoN5*1C8t@HI=yU}Lgs<[{=S/ `a U ~CQ{3هr0D҇95PPFZA L:æJvapǐ"b0Aw!{;4[D,WI:x LJwS]W(oTVݽvǯ곋ULK xPOPE ;B]׌r]Gߑ/hkowh"1:Cv)Sf"aJ#* @#4%^!UBL@ZP a Jd",Ew>b{G'D:K,͘0oPcӋP蹼2μ':bXPA {H {╊2Rְ΃?ˉ9O t3#_ n~TCi<3/phLta,dh :jxD"Cn4"O"͉<Y44(Rv`Hn F1`s103 m^m$ 5 Zӡ7@ߊ#5IV?`L+ڀsQy=4as#CN ?x_O[kmx{24^7T>stream xA0 ;r0gf ( Kx(c˒J@gP-ٟR: 8D_7]/1du8\wF*Ū0ųaO5`Le%XFü5i܍*owza *;>yiխ&ǎ@Ձ9IFA csyuJlFnM+:VY `:X]ؚW.ہu> b*iPtL%P\u>V u]m+(r|PFt4 V`8:;a 5r?`us^;v3UbFa \[/hϋ<=7[Fг es`:ʰ|||?3 yj?u$;g&?[;6} x[C…J %b?]/Filter/FlateDecode/Width 528/Height 327/BitsPerComponent 4/Length 3528 >>stream x훽$ ۹BGԋ r/&sd]j} 6Љ~#(DXUCnEQRWV .N D;/Qi祵7G!Ԯ(4qjWk[ vRN8O8Ü/t;d7qb'`CJ0{)?/x?KS3mC;/<r~ݾ 3ry) \ O8ÌSM*+d``Osƅhwڢ# i4 |JP qdqqH X>4~OKfZa^{?PңlPH8*Y 0hr\2rlqBs^yiJIDҳb&%QL,84#,,,R) ;,,R) ;,,R) ;,,R) ;,,R)P8r艝jEҳc1zM(TC %^ڏndSu-aHiIϑJsK6=CIAD{'Wr0T%C)Ī1('cCG,,,R) ;鍻KoJO8tX>4'翄Ђ,B>;BҼzJPK6URUA.Ġ$4gLK6P%X+ڻsHRB%RC:TSY~?9i.=z&=HXn컥RȒA^)58Dǒ3>:<㴡y|,\=zɦRJ٪1(ލLݱI=z&s*RC!Hδ0 v=;R_Hӡ$ HδzCUK^:B8x28{Awpi'0!3]b&%QH!ZyLgLK6PB 8x"8{#|fj4꿇b&%Q4%piܱI=z&s*R9c[}Tw#W%u9T}H%}wlyiOrQWj"I٥c1zM(TC{yE{W*C]rPR>٣ I! 9mYrճwb&%QH!TL䡤R}*GAB-0ēsH饔O/j@iIHz/ ճGA%شzұIZ}ֹVB٢i/5j 8qw ;׳R(X ^q8}8aN`F +LI ~{yr?Ǧ6 R/aI`"-t/>fJL vs6X/f*zrs|q B7"9XaU# h@S酖 D a;MaP$0F9(\bB .ZH3܇.\ӝbIqPCsr'PI4 Ut2F#`0[x*: _r~z ;`%bD? 0 Σb@Օ #D7qQ~/(FPF8V,\9!ba8,ZЅa|x㡈p8||H 8d2v¤;C-JaqS1 _C!ޱm8/ުMlTXȏLeH9Ӏ2pxFHCJòIGL܍14tF!E06&@p}<,X>;c{409'+?_$)U@>oc?򯁃8Ȫ;Ì-WkR6 ?xGQ‰?/PpaАEX[)\JusmonYwpF4X9.2rsx#|WF_*o|y" - ;bH8>sR=%]x1 '-RRWHEȇg+TxZY uj@VCC{ȇ4ruCr<;J2Žwa sX'y+!~Æ'pȁoݟCJ59 l>;<?߿A4k;_RgJMs@i>,]{qe‰ے.?F9!(R~_V-fcOC,GQ&|L=R%3;ѳn[0l  ZDh 5;Pk<HhAvb'&+%r`"(-ʒbJ=2cLiV{*fE:!endstream endobj 67 0 obj<]/Filter/FlateDecode/Width 633/Height 333/BitsPerComponent 2/Length 5914 >>stream xniO F9 x`ne.ɈL`WpAs6^E]ɢHy{dwf)S;zb!ϱlѪ o?vހyXR?iɝ3Ysֱ*3=!_S/!3veW[>s:0z^w5k%O^fmƓm` ͤm/ETxud2 Q˺7OEUQ(2I#ޖ4t_{xҏ36$m~o2Ѓh4"~Ժ8lj07p.9/T_oZS2/0>^x-CHtS6%oK.{m!d\g.lWN!>WxǸL<䀧TZfǮ.95Zn]-}W֕4?LᕉB8qr#Kfװ`R!=ܶi{tWb~hZYxE.^Zeչ: ?}o$jUKsnLm]CvV%=Yj^C|pfI h҅k_u+t]Gxe}clas@.1xK+ xj^{4;/kKe3A=Z*MoZO/fuE=w&.,fË mx.hY=1gsYO`Tٹaw Hr3IxYַb6Y3ùcqhǃ[-xJӵ89b/rpKk[^iwĜœ3bo&#Ux]C7N9ZO{W"k=n׵8Y鴴VֻCk9s7hy Z蛚+ڌBeqpqރԃ֌W3]SНpG|Tb<`b p&~r-7s}8/d|WBsi*{%93 :W/o?- ֚ O So#F*gxAs ջ\OWS& 1xҷ .-T\4mLzsҷ컆z5AaqijM5u}nh@ oN `q@<9F4IGAI<oI(6̕hdЉÓ{/ۓ/pY9o{z؉gҴhvkQ޺ ؉;X3 vbw5O. oWyx8t3)yx cM{ YQZj|w.seqxjq0x#9sMd2ɓ|"]鏃G[sy眧w; 3Mo c]VX<:<>|Ydj/[3zq0Qg{0q"$|@rGuoj}<ۚ9A\h|ϸ֭{w{șH?wO㹮ReX1EY7%nM=H򱻟sxwJBoΙ <:F` O`MYGQ÷05е̑_FϨ-b~ȘO&t\g0FœI<"EQg8oh#6<$QC{2 >Kl=w ^)<;@px'w6zfqI|oxO̓8h zryj~?׊}m3ʹ~:װh!W(,Aڌ n^ )<=5N&[0o:£y6l:3Ѩŝx|JxCAD ;w`<9n]B9U]q m#,í6E8w?25~g55xᆀ^/pn΄J57K7[V}/v'7h7 l^<}u.'t; B%ot[ovC:znϻ\aed]xr3 -gOm`ӦM tO᷊E$2L2sG^`j!߯N` "4zilӒ\(N^N4Fe{kv\kpivWP^} {A@.Rowm|pFNIh3$)+nI`xݽ-A7G%8uxFv&,} ^} ?̅ԹܩkxNF^,OOMDy7fVfx;I K~|钲86P|E#?D19'ޞqO짨G>j#A"^$tƹ[$X\BUaf#pל^ʌ:{8uAdX >m7r+ @LS/c쨁诚x[BD7VG_Z]֡ ߶Ƚk|5 bW(y:ҁ*Yx%H R `B\m BQu,B| 0N|6FOyzF d I^G~iBn݊gՄRu^ȁUh//sBhȇӶuj~A/z:*;DOEz$t)VzbOx2mY?Nv޾ςJM.m|5rc&б z-vaaY?p+㥐sؑ.E=>٭r9'8? ^J.$ ^ƹмDc.Ou\G>g559hTӱ >L A+P /vp}L 0592O䭦U8s/m?*t k9:pTscQț01 ^fk g[('O~R>Zv: F ,'@wݙ!έEGYv_կ/][$YoY"8? 2_%'J_E󦦈DXi1-/!NZYq)F-/_c7C{83kvH5s5ݗ:4-6 ɛDC&@"ӾMN0 ϛ37 ޝh2FЂ3*߿lJĻ5BQ"kJx8ҍj^nRC4JklxQYx 㹩a=/nժǿA*822V(GksQc<)eKy +d3d9}]F]w랮jJRxes}v#gûDѐ;fֽT6Z!d]!~M\RRZ VcA㽱dWf[*ou*uEj6ގeB7kr۹td][ݡ0$H-̎LT92qrjhqVw? [-^|֩4u^2{Tn\h! +g~xZŞH<0g=+k2Ne.3:B<\ӈ=icEᡲR x}viK!ćyw W52 e sH#8RbL.Swwiѵ KΨKu4hx&1ODt1z1;JeCg:uev,:sq6[^UǗZDX(::UXHoo_?.^?m:Nd=j~\BO5;u[Hۥ[nƹ> f¹Ų=~H`=(o@ u*%qyS}?$}S+"ŕ4 ^[Plo!ga:??ꫯ^^ibAEcJc r *M0LaS k^\P10zQ7A8u*{J97 >ȾIvI+c? QBqZϽ،ǘ멳[Ʋax{xaxrԁ,XSg^~b5#u69iՃйi(-S@vsas?|,PƎk9./,[O>b]/Filter/FlateDecode/Width 192/Height 194/BitsPerComponent 1/Length 890 >>stream x1O@2dAݍP['#:0v`Hi!K]БH V%ZFrTHxʪ>[%f@ R)ytz{9m@\̹bm21s2`[&I ?pw.П?qA|qE_q]4"7O8\CRۗ4vGZ(#.K*O1I-}7MkЖ.V=dZ;.S>kn@!c'ʏ:^`\P^NugיLr Ӌic9h_9wnM{{m(KBpmN(|x r;s̨>~}$ҿޏy e$ E߉Vݸ~]R YkYcB6y&x8u}~?0ỎUW5w W/~[xJzQ"$U9/$Wq^dgԉψ~˯Qp_8Uy?r:άsGwזO$'9o_~Lr| 9}-༤Dǿ8|2nÎZ5/&z-rCoBc~d\v~^gemNoWendstream endobj 69 0 obj<]/Filter/FlateDecode/Width 519/Height 226/BitsPerComponent 1/Length 2778 >>stream x1qTLm #\qiÅp po@ȫՉ.FRoHJEbD߼y3y#5+Yuk8^ٹn.p\bѤgpX`CPXo\K|ϑ›p?É4\b--w[_@n-ܢ 0kM.0vkG;D!\)R8]\z} }/~Kt&8Ì ۷kokxVkm/V!\gY/! dl?W,K'5WK;7riR|~jNm Ӛ W#w71`9 ;[4{/3\NUmWuX>[9wwq?c>b@Lua0$'#a@={xq-K}d u={xzD)辣3Yza@GzfWKF^ƂIz5 R-<Д;Yxn[mM7(sk;# 8ҺL*t rM4a+ 8s 4u)Jb<<7Jk,ӛ({j0>hX 0Xh @յ`5qP >@}.q^Āy?ӄy"[Y]pBAXt1`&*i vY_uΫ^XP>X?〖|M{4n=Jy@޺^Ɣ ̉c j)ΉkĵΐQuE?-`t5=t w"$X,@*ّFa93B i',țYV"Pu#LVX5IQH'3S504u5]`UWPgy$#@Zĵ\NO2@M[d!`3FtCn)nbN\&K@zYT|W74= xz~OOZZ FLʢGM 7/SU*.5 xz V @)Q?@l [9Q bR?r4&&ThZ[*Ǽ^Y]#^r+1>Y P3X kyr0gCW*Uz)&Go5 D\1[PW󁨳|[7a cJԙ3V;3D?N 9Nyߪ3D\qG2u7Ro!T'ъfuMiN~Hg:%rg>ж }s eڥtL973!wOyF\063v* ;с*m9/E9we$N?[q_Kŵ҄r]q-DŝY=+&:Ǐ TXu^|W q]ā M⹨sΉ3:y-U,@O`o8!Z4f `Ǽ&wfr 隩3|HykμJ+ÊquubQEXZHVXF:;rRE yJ1w"Qdu^sG' bL]c7Wtv 0t2͹&OAX@:c_yv' Itge )dez'B^ee#P||`c,K/l`3i738zAq(gmVgA@q maJ#uAMkA^W|BqJӗ o}5Ĝp4aWeH<&_⏲Q& >v)dL-UzLTw!Sb^p$()֞ш!mM&@zɝ[pVպQrgܭP.| {$˭gvżVvZZT=4[WN c(.f= - (sڔ7,&=ޔ=/9(s xnjU([Jֆ&d9+!7 bW+y#EuN(%޺wEX̝ECl%wz/ΰ?,.D`,rlT砇8pkp"@0.y+V&UF{ȝ`B$ĚO9KD7,t4&T 'Zt"P;?^ {~h~Tiddu-DO`M)y QgקsĂ'Μ;7 x߈Ï' ƪJ|&$%8A6wٱ0`"ڸ= q+ܵ0tv.XJoE:\܄a]@u:$smM\`sTE$(5Uv,qpk'r F`endstream endobj 70 0 obj<]/Filter/FlateDecode/Width 497/Height 226/BitsPerComponent 1/Length 1228 >>stream x홱n0SdG3t,P@! t@ AZ :ttPA <Ȇd^J#<E ϿHSD#>F @XDuBרg5M3{)j .s_)'ZWE]k@?5+E(:l? W@?w@w{B^랷<Yw=vNuj k y+k 5@G¥B5?ƓຜDH l6 ye JHiB0PiBiB(f(%5^55f. 5Mf.j|SkRmkjqj uW0"cƱR1;l|̰1W 0ǙNN HtUim/pAi)`a-p a|p a'?1i*\7G/u3OIM$n+.k}5p;يL[ڌ5ѻ]74,f7M`z[opWƫsB\GV:$cmOLy|uƌM4fX6lyfrĸh&ܮSB,qiX7!։VuZI20 OZ!aKf9Dflsx ["eHNeb8༆m 8g5lױQ8k<őedN끣k_wΏu =6nXKyG_"=v;*}YEν1}հܛF5iX7iX7NhѰg%}@ʹ,37զaEI8<1զaeIo' .3#ZmV.KzE)B낛_l^s̭a%u ^sh J|p{R>cnpġ5(Ϩ<.~vձһx¦z{ʰsXdX<"sXH@3f ayںװ&8\}x k{8a~52|:O}6$ ?FsXy4=T9ss:Vb. k#a7#a!W{5l6^sXa?7Fk̰&vo{2a~]gqJأgv_̺endstream endobj 71 0 obj<]/Filter/FlateDecode/Width 483/Height 196/BitsPerComponent 1/Length 1615 >>stream xoDۮD@B_,N=*u8J=Јh_P{ ME@(mȥ7MO,uNv:E'Ό3}ox~2.Q9\{su]||aL}w J9Da)p]ySP~6 >dN}bL1[4zGS 8@oJLIaK3keYl}YIyRXv ]n~g'^aD~:њ=|P=\=ܤna. oyQK' itbЌM9R^x$s;aXni`=|g7)ˡQAb$YM^+i0VmFimz! `jw!((^UOj"fzʥZsJΟV.cl_|:_9-.V9q#y]?7x[TAb~hDITtӘ0|Pq|Fl͉MOuk<~w)l21N ʬf_x>W>J@ZG{O vk'o\9x_=,mS4gb_x8nvwo}~}i_~jn;,LXaAz۝p~ۓ&Kd<)9\%J~;:=­fK S kxÍ+{$J]/Filter/FlateDecode/Width 187/Height 187/BitsPerComponent 2/Length 716 >>stream xXAn@ 7>= zg}p`WffErEJ[!n#Nj5&w З~ : ^BB254OFoqu8'r щGH'BӛHoHg T^s^3cP sԲBT$AH('ڱp,j\"CT2՞wݸg e}H5A3 =ObR{_{hԔٷ;OowGoEH_J-IA:y̦bVB_(SWp\ Joqp|u51hnb|RNNq2D#}Q5z\O'>tKE俧v?:N yePQ SHw$K=endstream endobj 73 0 obj<>endobj 74 0 obj<>endobj 75 0 obj<>endobj 76 0 obj<>endobj 77 0 obj<>endobj 78 0 obj<>endobj 79 0 obj<>endobj 80 0 obj<>endobj 81 0 obj<>endobj 82 0 obj<>endobj 83 0 obj<>endobj 84 0 obj<>endobj 85 0 obj<>endobj 86 0 obj<>endobj 87 0 obj<>endobj 88 0 obj<>endobj 89 0 obj<>endobj 90 0 obj<>endobj 91 0 obj<>endobj 92 0 obj<>endobj 93 0 obj<>endobj 94 0 obj<>endobj 95 0 obj<>endobj 96 0 obj<>endobj 97 0 obj<>endobj 98 0 obj<>endobj 99 0 obj<>endobj 100 0 obj<>endobj 101 0 obj<>endobj 102 0 obj[74 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R]endobj 103 0 obj<>endobj 104 0 obj<>endobj 105 0 obj<>endobj 106 0 obj<>endobj 107 0 obj<>endobj 108 0 obj<>endobj 109 0 obj<>endobj 110 0 obj<>endobj 111 0 obj<>endobj 112 0 obj<>endobj 113 0 obj<>endobj 114 0 obj<>endobj 115 0 obj<>endobj 116 0 obj<>endobj 117 0 obj<>endobj 118 0 obj<>endobj 119 0 obj<>endobj 120 0 obj<>endobj 121 0 obj<>endobj 122 0 obj<>endobj 123 0 obj<>endobj 124 0 obj<>endobj 125 0 obj<>endobj 126 0 obj<>endobj 127 0 obj<>endobj 128 0 obj<>endobj 129 0 obj[103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R]endobj 130 0 obj<>endobj 131 0 obj<>endobj 132 0 obj<>endobj 133 0 obj<>endobj 134 0 obj<>endobj 135 0 obj<>endobj 136 0 obj[130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R]endobj 137 0 obj<>endobj 138 0 obj<>endobj 139 0 obj<>endobj 140 0 obj<>endobj 141 0 obj[138 0 R 140 0 R]endobj 142 0 obj<>endobj 143 0 obj<>endobj 144 0 obj<>endobj 145 0 obj[143 0 R 144 0 R]endobj 146 0 obj<>endobj 147 0 obj<>endobj 148 0 obj<>endobj 149 0 obj<>endobj 150 0 obj[147 0 R 149 0 R]endobj 151 0 obj<>endobj 152 0 obj<>endobj 153 0 obj[152 0 R]endobj 154 0 obj<>endobj 155 0 obj[154 0 R]endobj 156 0 obj<>endobj 157 0 obj<>endobj 158 0 obj<>endobj 159 0 obj<>endobj 160 0 obj<>endobj 161 0 obj<>endobj 162 0 obj<>endobj 163 0 obj<>endobj 164 0 obj<>endobj 165 0 obj<>endobj 166 0 obj<>endobj 167 0 obj<>endobj 168 0 obj<>endobj 169 0 obj<>endobj 170 0 obj[157 0 R 159 0 R 161 0 R 163 0 R 165 0 R 167 0 R 169 0 R]endobj 171 0 obj<>endobj 172 0 obj<>endobj 173 0 obj<>endobj 174 0 obj<>endobj 175 0 obj<>endobj 176 0 obj<>endobj 177 0 obj<>endobj 178 0 obj<>endobj 179 0 obj<>endobj 180 0 obj<>endobj 181 0 obj<>endobj 182 0 obj<>endobj 183 0 obj[172 0 R 174 0 R 176 0 R 178 0 R 180 0 R 182 0 R]endobj 184 0 obj<>endobj 185 0 obj<>endobj 186 0 obj<>endobj 187 0 obj<>endobj 188 0 obj<>endobj 189 0 obj<>endobj 190 0 obj<>endobj 191 0 obj<>endobj 192 0 obj<>endobj 193 0 obj<>endobj 194 0 obj<>endobj 195 0 obj<>endobj 196 0 obj<>endobj 197 0 obj<>endobj 198 0 obj<>endobj 199 0 obj<>endobj 200 0 obj<>endobj 201 0 obj<>endobj 202 0 obj<>endobj 203 0 obj<>endobj 204 0 obj<>endobj 205 0 obj<>endobj 206 0 obj[185 0 R 187 0 R 189 0 R 191 0 R 193 0 R 195 0 R 197 0 R 199 0 R 201 0 R 203 0 R 205 0 R]endobj 207 0 obj<>endobj 208 0 obj<>endobj 209 0 obj<>endobj 210 0 obj<>endobj 211 0 obj<>endobj 212 0 obj<>endobj 213 0 obj<>endobj 214 0 obj<>endobj 215 0 obj[208 0 R 210 0 R 212 0 R 214 0 R]endobj 216 0 obj<>endobj 217 0 obj<>endobj 218 0 obj<>endobj 219 0 obj<>endobj 220 0 obj[217 0 R 219 0 R]endobj 221 0 obj<>endobj 222 0 obj<>endobj 223 0 obj<>endobj 224 0 obj<>endobj 225 0 obj<>endobj 226 0 obj<>endobj 227 0 obj<>endobj 228 0 obj<>endobj 229 0 obj[222 0 R 224 0 R 226 0 R 228 0 R]endobj 230 0 obj<>endobj 231 0 obj<>endobj 232 0 obj<>endobj 233 0 obj<>endobj 234 0 obj<>endobj 235 0 obj<>endobj 236 0 obj<>endobj 237 0 obj<>endobj 238 0 obj<>endobj 239 0 obj<>endobj 240 0 obj<>endobj 241 0 obj<>endobj 242 0 obj<>endobj 243 0 obj<>endobj 244 0 obj<>endobj 245 0 obj<>endobj 246 0 obj<>endobj 247 0 obj<>endobj 248 0 obj<>endobj 249 0 obj<>endobj 250 0 obj[231 0 R 233 0 R 235 0 R 237 0 R 239 0 R 241 0 R 243 0 R 245 0 R 247 0 R 249 0 R]endobj 251 0 obj<>endobj 252 0 obj<>endobj 253 0 obj<>endobj 254 0 obj<>endobj 255 0 obj<>endobj 256 0 obj<>endobj 257 0 obj<>endobj 258 0 obj<>endobj 259 0 obj<>endobj 260 0 obj<>endobj 261 0 obj<>endobj 262 0 obj<>endobj 263 0 obj[252 0 R 254 0 R 256 0 R 258 0 R 260 0 R 262 0 R]endobj 264 0 obj<>endobj 265 0 obj<>endobj 266 0 obj<>endobj 267 0 obj<>endobj 268 0 obj<>endobj 269 0 obj<>endobj 270 0 obj[265 0 R 267 0 R 269 0 R]endobj 271 0 obj<>endobj 272 0 obj<>endobj 273 0 obj<>endobj 274 0 obj<>endobj 275 0 obj<>endobj 276 0 obj<>endobj 277 0 obj<>endobj 278 0 obj<>endobj 279 0 obj[272 0 R 274 0 R 276 0 R 278 0 R]endobj 280 0 obj<>endobj 281 0 obj<>endobj 282 0 obj<>endobj 283 0 obj<>endobj 284 0 obj<>endobj 285 0 obj<>endobj 286 0 obj<>endobj 287 0 obj<>endobj 288 0 obj[281 0 R 283 0 R 285 0 R 287 0 R]endobj 289 0 obj<>endobj 290 0 obj<>endobj 291 0 obj<>endobj 292 0 obj<>endobj 293 0 obj<>endobj 294 0 obj<>endobj 295 0 obj<>endobj 296 0 obj<>endobj 297 0 obj<>endobj 298 0 obj<>endobj 299 0 obj<>endobj 300 0 obj<>endobj 301 0 obj<>endobj 302 0 obj<>endobj 303 0 obj<>endobj 304 0 obj<>endobj 305 0 obj[290 0 R 292 0 R 294 0 R 296 0 R 298 0 R 300 0 R 302 0 R 304 0 R]endobj 306 0 obj<>endobj 307 0 obj<>endobj 308 0 obj<>endobj 309 0 obj<>endobj 310 0 obj<>endobj 311 0 obj<>endobj 312 0 obj<>endobj 313 0 obj<>endobj 314 0 obj[307 0 R 309 0 R 311 0 R 313 0 R]endobj 315 0 obj<>endobj 316 0 obj<>endobj 317 0 obj<>endobj 318 0 obj<>endobj 319 0 obj<>endobj 320 0 obj<>endobj 321 0 obj<>endobj 322 0 obj<>endobj 323 0 obj[316 0 R 318 0 R 320 0 R 322 0 R]endobj 324 0 obj<>endobj 325 0 obj<>endobj 326 0 obj<>endobj 327 0 obj<>endobj 328 0 obj<>endobj 329 0 obj<>endobj 330 0 obj[325 0 R 327 0 R 329 0 R]endobj 331 0 obj<>endobj 332 0 obj<>endobj 333 0 obj<>endobj 334 0 obj<>endobj 335 0 obj<>endobj 336 0 obj<>endobj 337 0 obj[332 0 R 334 0 R 336 0 R]endobj 338 0 obj<>endobj 339 0 obj<>endobj 340 0 obj<>endobj 341 0 obj<>endobj 342 0 obj<>endobj 343 0 obj<>endobj 344 0 obj[339 0 R 341 0 R 343 0 R]endobj 345 0 obj<>endobj 346 0 obj<>endobj 347 0 obj<>endobj 348 0 obj<>endobj 349 0 obj<>endobj 350 0 obj<>endobj 351 0 obj<>endobj 352 0 obj<>endobj 353 0 obj<>endobj 354 0 obj<>endobj 355 0 obj<>endobj 356 0 obj<>endobj 357 0 obj<>endobj 358 0 obj<>endobj 359 0 obj<>endobj 360 0 obj<>endobj 361 0 obj<>endobj 362 0 obj<>endobj 363 0 obj[346 0 R 348 0 R 350 0 R 352 0 R 354 0 R 356 0 R 358 0 R 360 0 R 362 0 R]endobj 364 0 obj<>endobj 365 0 obj<>endobj 366 0 obj<>endobj 367 0 obj<>endobj 368 0 obj<>endobj 369 0 obj<>endobj 370 0 obj<>endobj 371 0 obj<>endobj 372 0 obj<>endobj 373 0 obj<>endobj 374 0 obj<>endobj 375 0 obj<>endobj 376 0 obj<>endobj 377 0 obj<>endobj 378 0 obj[365 0 R 367 0 R 369 0 R 371 0 R 373 0 R 375 0 R 377 0 R]endobj 379 0 obj<>endobj 380 0 obj<>endobj 381 0 obj<>endobj 382 0 obj<>endobj 383 0 obj<>endobj 384 0 obj<>endobj 385 0 obj[380 0 R 382 0 R 384 0 R]endobj 386 0 obj<>endobj 387 0 obj<>endobj 388 0 obj<>endobj 389 0 obj<>endobj 390 0 obj<>endobj 391 0 obj<>endobj 392 0 obj<>endobj 393 0 obj<>endobj 394 0 obj<>endobj 395 0 obj<>endobj 396 0 obj<>endobj 397 0 obj<>endobj 398 0 obj<>endobj 399 0 obj<>endobj 400 0 obj<>endobj 401 0 obj<>endobj 402 0 obj<>endobj 403 0 obj<>endobj 404 0 obj[387 0 R 389 0 R 391 0 R 393 0 R 395 0 R 397 0 R 399 0 R 401 0 R 403 0 R]endobj 405 0 obj<>endobj 406 0 obj<>endobj 407 0 obj<>endobj 408 0 obj<>endobj 409 0 obj<>endobj 410 0 obj<>endobj 411 0 obj<>endobj 412 0 obj<>endobj 413 0 obj<>endobj 414 0 obj<>endobj 415 0 obj<>endobj 416 0 obj<>endobj 417 0 obj[406 0 R 408 0 R 410 0 R 412 0 R 414 0 R 416 0 R]endobj 418 0 obj<>endobj 419 0 obj<>endobj 420 0 obj[419 0 R]endobj 421 0 obj<>endobj 422 0 obj<>endobj 423 0 obj<>endobj 424 0 obj<>endobj 425 0 obj[422 0 R 424 0 R]endobj 426 0 obj<>endobj 427 0 obj<>endobj 428 0 obj<>endobj 429 0 obj<>endobj 430 0 obj<>endobj 431 0 obj<>endobj 432 0 obj<>endobj 433 0 obj<>endobj 434 0 obj<>endobj 435 0 obj<>endobj 436 0 obj[427 0 R 429 0 R 431 0 R 433 0 R 435 0 R]endobj 437 0 obj<>endobj 438 0 obj<>endobj 439 0 obj<>endobj 440 0 obj<>endobj 441 0 obj<>endobj 442 0 obj<>endobj 443 0 obj<>endobj 444 0 obj<>endobj 445 0 obj<>endobj 446 0 obj<>endobj 447 0 obj<>endobj 448 0 obj<>endobj 449 0 obj<>endobj 450 0 obj<>endobj 451 0 obj<>endobj 452 0 obj<>endobj 453 0 obj<>endobj 454 0 obj<>endobj 455 0 obj<>endobj 456 0 obj<>endobj 457 0 obj<>endobj 458 0 obj<>endobj 459 0 obj<>endobj 460 0 obj<>endobj 461 0 obj[438 0 R 440 0 R 442 0 R 444 0 R 446 0 R 448 0 R 450 0 R 452 0 R 454 0 R 456 0 R 458 0 R 460 0 R]endobj 462 0 obj<>endobj 463 0 obj<>endobj 464 0 obj<>endobj 465 0 obj<>endobj 466 0 obj<>endobj 467 0 obj<>endobj 468 0 obj<>endobj 469 0 obj<>endobj 470 0 obj[463 0 R 465 0 R 467 0 R 469 0 R]endobj 471 0 obj<>endobj 472 0 obj<>endobj 473 0 obj<>endobj 474 0 obj<>endobj 475 0 obj<>endobj 476 0 obj<>endobj 477 0 obj[472 0 R 474 0 R 476 0 R]endobj 478 0 obj<>endobj 479 0 obj<>endobj 480 0 obj<>endobj 481 0 obj<>endobj 482 0 obj<>endobj 483 0 obj<>endobj 484 0 obj<>endobj 485 0 obj<>endobj 486 0 obj<>endobj 487 0 obj<>endobj 488 0 obj<>endobj 489 0 obj<>endobj 490 0 obj<>endobj 491 0 obj<>endobj 492 0 obj<>endobj 493 0 obj<>endobj 494 0 obj<>endobj 495 0 obj<>endobj 496 0 obj<>endobj 497 0 obj<>endobj 498 0 obj<>endobj 499 0 obj<>endobj 500 0 obj<>endobj 501 0 obj<>endobj 502 0 obj[479 0 R 481 0 R 483 0 R 485 0 R 487 0 R 489 0 R 491 0 R 493 0 R 495 0 R 497 0 R 499 0 R 501 0 R]endobj 503 0 obj<>endobj 504 0 obj<>endobj 505 0 obj<>endobj 506 0 obj<>endobj 507 0 obj<>endobj 508 0 obj<>endobj 509 0 obj[504 0 R 506 0 R 508 0 R]endobj 510 0 obj<>endobj 511 0 obj<>endobj 512 0 obj<>endobj 513 0 obj<>endobj 514 0 obj<>endobj 515 0 obj<>endobj 516 0 obj[511 0 R 513 0 R 515 0 R]endobj 517 0 obj<>endobj 518 0 obj<>endobj 519 0 obj<>endobj 520 0 obj<>endobj 521 0 obj<>endobj 522 0 obj<>endobj 523 0 obj<>endobj 524 0 obj<>endobj 525 0 obj<>endobj 526 0 obj<>endobj 527 0 obj<>endobj 528 0 obj<>endobj 529 0 obj<>endobj 530 0 obj<>endobj 531 0 obj<>endobj 532 0 obj<>endobj 533 0 obj<>endobj 534 0 obj<>endobj 535 0 obj<>endobj 536 0 obj<>endobj 537 0 obj<>endobj 538 0 obj<>endobj 539 0 obj<>endobj 540 0 obj<>endobj 541 0 obj<>endobj 542 0 obj<>endobj 543 0 obj<>endobj 544 0 obj<>endobj 545 0 obj[518 0 R 520 0 R 522 0 R 524 0 R 526 0 R 528 0 R 530 0 R 532 0 R 534 0 R 536 0 R 538 0 R 540 0 R 542 0 R 544 0 R]endobj 546 0 obj<>endobj 547 0 obj<>endobj 548 0 obj<>endobj 549 0 obj<>endobj 550 0 obj<>endobj 551 0 obj<>endobj 552 0 obj<>endobj 553 0 obj<>endobj 554 0 obj[547 0 R 549 0 R 551 0 R 553 0 R]endobj 555 0 obj<>endobj 556 0 obj<>endobj 557 0 obj<>endobj 558 0 obj<>endobj 559 0 obj<>endobj 560 0 obj<>endobj 561 0 obj[556 0 R 558 0 R 560 0 R]endobj 562 0 obj<>endobj 563 0 obj<>endobj 564 0 obj<>endobj 565 0 obj<>endobj 566 0 obj<>endobj 567 0 obj<>endobj 568 0 obj<>endobj 569 0 obj<>endobj 570 0 obj<>endobj 571 0 obj<>endobj 572 0 obj<>endobj 573 0 obj<>endobj 574 0 obj<>endobj 575 0 obj<>endobj 576 0 obj<>endobj 577 0 obj<>endobj 578 0 obj<>endobj 579 0 obj<>endobj 580 0 obj<>endobj 581 0 obj<>endobj 582 0 obj[563 0 R 565 0 R 567 0 R 569 0 R 571 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R]endobj 583 0 obj<>endobj 584 0 obj<>endobj 585 0 obj<>endobj 586 0 obj<>endobj 587 0 obj<>endobj 588 0 obj<>endobj 589 0 obj<>endobj 590 0 obj<>endobj 591 0 obj<>endobj 592 0 obj<>endobj 593 0 obj<>endobj 594 0 obj<>endobj 595 0 obj<>endobj 596 0 obj<>endobj 597 0 obj<>endobj 598 0 obj<>endobj 599 0 obj<>endobj 600 0 obj<>endobj 601 0 obj<>endobj 602 0 obj<>endobj 603 0 obj<>endobj 604 0 obj<>endobj 605 0 obj[584 0 R 586 0 R 588 0 R 590 0 R 592 0 R 594 0 R 596 0 R 598 0 R 600 0 R 602 0 R 604 0 R]endobj 606 0 obj<>endobj 607 0 obj<>endobj 608 0 obj<>endobj 609 0 obj<>endobj 610 0 obj<>endobj 611 0 obj<>endobj 612 0 obj<>endobj 613 0 obj<>endobj 614 0 obj<>endobj 615 0 obj<>endobj 616 0 obj<>endobj 617 0 obj<>endobj 618 0 obj<>endobj 619 0 obj<>endobj 620 0 obj<>endobj 621 0 obj<>endobj 622 0 obj<>endobj 623 0 obj<>endobj 624 0 obj<>endobj 625 0 obj<>endobj 626 0 obj<>endobj 627 0 obj<>endobj 628 0 obj<>endobj 629 0 obj<>endobj 630 0 obj<>endobj 631 0 obj<>endobj 632 0 obj[607 0 R 609 0 R 611 0 R 613 0 R 615 0 R 617 0 R 619 0 R 621 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R]endobj 633 0 obj<>endobj 634 0 obj<>endobj 635 0 obj<>endobj 636 0 obj<>endobj 637 0 obj<>endobj 638 0 obj<>endobj 639 0 obj<>endobj 640 0 obj<>endobj 641 0 obj<>endobj 642 0 obj<>endobj 643 0 obj<>endobj 644 0 obj<>endobj 645 0 obj[634 0 R 636 0 R 638 0 R 640 0 R 642 0 R 644 0 R]endobj 646 0 obj<>endobj 647 0 obj<>endobj 648 0 obj<>endobj 649 0 obj<>endobj 650 0 obj<>endobj 651 0 obj<>endobj 652 0 obj<>endobj 653 0 obj<>endobj 654 0 obj<>endobj 655 0 obj<>endobj 656 0 obj<>endobj 657 0 obj<>endobj 658 0 obj[647 0 R 649 0 R 651 0 R 653 0 R 655 0 R 657 0 R]endobj 659 0 obj<>endobj 660 0 obj<>endobj 661 0 obj<>endobj 662 0 obj<>endobj 663 0 obj<>endobj 664 0 obj<>endobj 665 0 obj<>endobj 666 0 obj<>endobj 667 0 obj<>endobj 668 0 obj<>endobj 669 0 obj<>endobj 670 0 obj<>endobj 671 0 obj[660 0 R 662 0 R 664 0 R 666 0 R 668 0 R 670 0 R]endobj 672 0 obj<>endobj 673 0 obj<>endobj 674 0 obj<>endobj 675 0 obj<>endobj 676 0 obj<>endobj 677 0 obj<>endobj 678 0 obj<>endobj 679 0 obj<>endobj 680 0 obj<>endobj 681 0 obj<>endobj 682 0 obj<>endobj 683 0 obj<>endobj 684 0 obj<>endobj 685 0 obj<>endobj 686 0 obj<>endobj 687 0 obj<>endobj 688 0 obj<>endobj 689 0 obj<>endobj 690 0 obj<>endobj 691 0 obj<>endobj 692 0 obj<>endobj 693 0 obj<>endobj 694 0 obj<>endobj 695 0 obj<>endobj 696 0 obj<>endobj 697 0 obj<>endobj 698 0 obj<>endobj 699 0 obj<>endobj 700 0 obj<>endobj 701 0 obj<>endobj 702 0 obj[673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 695 0 R 697 0 R 699 0 R 701 0 R]endobj 703 0 obj<>endobj 704 0 obj<>endobj 705 0 obj<>endobj 706 0 obj<>endobj 707 0 obj<>endobj 708 0 obj<>endobj 709 0 obj<>endobj 710 0 obj<>endobj 711 0 obj<>endobj 712 0 obj<>endobj 713 0 obj<>endobj 714 0 obj<>endobj 715 0 obj<>endobj 716 0 obj<>endobj 717 0 obj<>endobj 718 0 obj<>endobj 719 0 obj<>endobj 720 0 obj<>endobj 721 0 obj<>endobj 722 0 obj<>endobj 723 0 obj<>endobj 724 0 obj<>endobj 725 0 obj<>endobj 726 0 obj<>endobj 727 0 obj<>endobj 728 0 obj<>endobj 729 0 obj<>endobj 730 0 obj<>endobj 731 0 obj<>endobj 732 0 obj<>endobj 733 0 obj[704 0 R 706 0 R 708 0 R 710 0 R 712 0 R 714 0 R 716 0 R 718 0 R 720 0 R 722 0 R 724 0 R 726 0 R 728 0 R 730 0 R 732 0 R]endobj 734 0 obj<>endobj 735 0 obj<>endobj 736 0 obj<>endobj 737 0 obj<>endobj 738 0 obj<>endobj 739 0 obj<>endobj 740 0 obj<>endobj 741 0 obj<>endobj 742 0 obj<>endobj 743 0 obj<>endobj 744 0 obj<>endobj 745 0 obj<>endobj 746 0 obj<>endobj 747 0 obj<>endobj 748 0 obj<>endobj 749 0 obj<>endobj 750 0 obj<>endobj 751 0 obj<>endobj 752 0 obj<>endobj 753 0 obj<>endobj 754 0 obj<>endobj 755 0 obj<>endobj 756 0 obj<>endobj 757 0 obj<>endobj 758 0 obj[735 0 R 737 0 R 739 0 R 741 0 R 743 0 R 745 0 R 747 0 R 749 0 R 751 0 R 753 0 R 755 0 R 757 0 R]endobj 759 0 obj<>endobj 760 0 obj<>endobj 761 0 obj<>endobj 762 0 obj<>endobj 763 0 obj<>endobj 764 0 obj<>endobj 765 0 obj<>endobj 766 0 obj<>endobj 767 0 obj<>endobj 768 0 obj<>endobj 769 0 obj[760 0 R 762 0 R 764 0 R 766 0 R 768 0 R]endobj 770 0 obj<>endobj 771 0 obj<>endobj 772 0 obj<>endobj 773 0 obj<>endobj 774 0 obj<>endobj 775 0 obj<>endobj 776 0 obj<>endobj 777 0 obj<>endobj 778 0 obj<>endobj 779 0 obj<>endobj 780 0 obj<>endobj 781 0 obj<>endobj 782 0 obj<>endobj 783 0 obj<>endobj 784 0 obj<>endobj 785 0 obj<>endobj 786 0 obj<>endobj 787 0 obj<>endobj 788 0 obj<>endobj 789 0 obj<>endobj 790 0 obj<>endobj 791 0 obj<>endobj 792 0 obj<>endobj 793 0 obj<>endobj 794 0 obj[771 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 783 0 R 785 0 R 787 0 R 789 0 R 791 0 R 793 0 R]endobj 795 0 obj<>endobj 796 0 obj<>endobj 797 0 obj<>endobj 798 0 obj<>endobj 799 0 obj<>endobj 800 0 obj<>endobj 801 0 obj<>endobj 802 0 obj<>endobj 803 0 obj<>endobj 804 0 obj<>endobj 805 0 obj<>endobj 806 0 obj<>endobj 807 0 obj<>endobj 808 0 obj<>endobj 809 0 obj[796 0 R 798 0 R 800 0 R 802 0 R 804 0 R 806 0 R 808 0 R]endobj 810 0 obj<>endobj 811 0 obj<>endobj 812 0 obj<>endobj 813 0 obj<>endobj 814 0 obj<>endobj 815 0 obj<>endobj 816 0 obj<>endobj 817 0 obj<>endobj 818 0 obj<>endobj 819 0 obj<>endobj 820 0 obj<>endobj 821 0 obj<>endobj 822 0 obj<>endobj 823 0 obj<>endobj 824 0 obj<>endobj 825 0 obj<>endobj 826 0 obj<>endobj 827 0 obj<>endobj 828 0 obj<>endobj 829 0 obj<>endobj 830 0 obj<>endobj 831 0 obj<>endobj 832 0 obj[811 0 R 813 0 R 815 0 R 817 0 R 819 0 R 821 0 R 823 0 R 825 0 R 827 0 R 829 0 R 831 0 R]endobj 833 0 obj<>endobj 834 0 obj<>endobj 835 0 obj<>endobj 836 0 obj<>endobj 837 0 obj<>endobj 838 0 obj<>endobj 839 0 obj[834 0 R 836 0 R 838 0 R]endobj 840 0 obj<>endobj 841 0 obj<>endobj 842 0 obj<>endobj 843 0 obj<>endobj 844 0 obj<>endobj 845 0 obj<>endobj 846 0 obj<>endobj 847 0 obj<>endobj 848 0 obj<>endobj 849 0 obj<>endobj 850 0 obj<>endobj 851 0 obj<>endobj 852 0 obj<>endobj 853 0 obj<>endobj 854 0 obj<>endobj 855 0 obj<>endobj 856 0 obj[841 0 R 843 0 R 845 0 R 847 0 R 849 0 R 851 0 R 853 0 R 855 0 R]endobj 857 0 obj<>endobj 858 0 obj<>endobj 859 0 obj<>endobj 860 0 obj<>endobj 861 0 obj<>endobj 862 0 obj<>endobj 863 0 obj<>endobj 864 0 obj<>endobj 865 0 obj<>endobj 866 0 obj<>endobj 867 0 obj<>endobj 868 0 obj<>endobj 869 0 obj<>endobj 870 0 obj<>endobj 871 0 obj<>endobj 872 0 obj<>endobj 873 0 obj<>endobj 874 0 obj<>endobj 875 0 obj<>endobj 876 0 obj<>endobj 877 0 obj<>endobj 878 0 obj<>endobj 879 0 obj<>endobj 880 0 obj<>endobj 881 0 obj[858 0 R 860 0 R 862 0 R 864 0 R 866 0 R 868 0 R 870 0 R 872 0 R 874 0 R 876 0 R 878 0 R 880 0 R]endobj 882 0 obj<>endobj 883 0 obj<>endobj 884 0 obj<>endobj 885 0 obj<>endobj 886 0 obj<>endobj 887 0 obj<>endobj 888 0 obj<>endobj 889 0 obj<>endobj 890 0 obj<>endobj 891 0 obj<>endobj 892 0 obj<>endobj 893 0 obj<>endobj 894 0 obj<>endobj 895 0 obj<>endobj 896 0 obj<>endobj 897 0 obj<>endobj 898 0 obj<>endobj 899 0 obj<>endobj 900 0 obj<>endobj 901 0 obj<>endobj 902 0 obj[883 0 R 885 0 R 887 0 R 889 0 R 891 0 R 893 0 R 895 0 R 897 0 R 899 0 R 901 0 R]endobj 903 0 obj<>endobj 904 0 obj<>endobj 905 0 obj<>endobj 906 0 obj<>endobj 907 0 obj<>endobj 908 0 obj<>endobj 909 0 obj<>endobj 910 0 obj<>endobj 911 0 obj<>endobj 912 0 obj<>endobj 913 0 obj<>endobj 914 0 obj<>endobj 915 0 obj<>endobj 916 0 obj<>endobj 917 0 obj<>endobj 918 0 obj<>endobj 919 0 obj<>endobj 920 0 obj<>endobj 921 0 obj[904 0 R 906 0 R 908 0 R 910 0 R 912 0 R 914 0 R 916 0 R 918 0 R 920 0 R]endobj 922 0 obj<>endobj 923 0 obj<>endobj 924 0 obj<>endobj 925 0 obj<>endobj 926 0 obj<>endobj 927 0 obj<>endobj 928 0 obj<>endobj 929 0 obj<>endobj 930 0 obj<>endobj 931 0 obj<>endobj 932 0 obj<>endobj 933 0 obj<>endobj 934 0 obj[923 0 R 925 0 R 927 0 R 929 0 R 931 0 R 933 0 R]endobj 935 0 obj<>endobj 936 0 obj<>endobj 937 0 obj<>endobj 938 0 obj<>endobj 939 0 obj<>endobj 940 0 obj<>endobj 941 0 obj<>endobj 942 0 obj<>endobj 943 0 obj<>endobj 944 0 obj<>endobj 945 0 obj<>endobj 946 0 obj<>endobj 947 0 obj[936 0 R 938 0 R 940 0 R 942 0 R 944 0 R 946 0 R]endobj 948 0 obj<>endobj 949 0 obj<>endobj 950 0 obj<>endobj 951 0 obj<>endobj 952 0 obj<>endobj 953 0 obj<>endobj 954 0 obj<>endobj 955 0 obj<>endobj 956 0 obj[949 0 R 951 0 R 953 0 R 955 0 R]endobj 957 0 obj<>endobj 958 0 obj<>endobj 959 0 obj<>endobj 960 0 obj<>endobj 961 0 obj<>endobj 962 0 obj<>endobj 963 0 obj<>endobj 964 0 obj<>endobj 965 0 obj<>endobj 966 0 obj<>endobj 967 0 obj<>endobj 968 0 obj<>endobj 969 0 obj<>endobj 970 0 obj<>endobj 971 0 obj<>endobj 972 0 obj<>endobj 973 0 obj<>endobj 974 0 obj<>endobj 975 0 obj<>endobj 976 0 obj<>endobj 977 0 obj[958 0 R 960 0 R 962 0 R 964 0 R 966 0 R 968 0 R 970 0 R 972 0 R 974 0 R 976 0 R]endobj 978 0 obj<>endobj 979 0 obj<>endobj 980 0 obj<>endobj 981 0 obj<>endobj 982 0 obj<>endobj 983 0 obj<>endobj 984 0 obj<>endobj 985 0 obj<>endobj 986 0 obj<>endobj 987 0 obj<>endobj 988 0 obj<>endobj 989 0 obj<>endobj 990 0 obj<>endobj 991 0 obj<>endobj 992 0 obj<>endobj 993 0 obj<>endobj 994 0 obj<>endobj 995 0 obj<>endobj 996 0 obj[979 0 R 981 0 R 983 0 R 985 0 R 987 0 R 989 0 R 991 0 R 993 0 R 995 0 R]endobj 997 0 obj<>endobj 998 0 obj<>endobj 999 0 obj<>endobj 1000 0 obj<>endobj 1001 0 obj<>endobj 1002 0 obj<>endobj 1003 0 obj<>endobj 1004 0 obj<>endobj 1005 0 obj<>endobj 1006 0 obj<>endobj 1007 0 obj<>endobj 1008 0 obj<>endobj 1009 0 obj<>endobj 1010 0 obj<>endobj 1011 0 obj<>endobj 1012 0 obj<>endobj 1013 0 obj<>endobj 1014 0 obj<>endobj 1015 0 obj<>endobj 1016 0 obj<>endobj 1017 0 obj[998 0 R 1000 0 R 1002 0 R 1004 0 R 1006 0 R 1008 0 R 1010 0 R 1012 0 R 1014 0 R 1016 0 R]endobj 1018 0 obj<>endobj 1019 0 obj<>endobj 1020 0 obj<>endobj 1021 0 obj<>endobj 1022 0 obj<>endobj 1023 0 obj<>endobj 1024 0 obj<>endobj 1025 0 obj<>endobj 1026 0 obj<>endobj 1027 0 obj<>endobj 1028 0 obj<>endobj 1029 0 obj<>endobj 1030 0 obj<>endobj 1031 0 obj<>endobj 1032 0 obj<>endobj 1033 0 obj<>endobj 1034 0 obj<>endobj 1035 0 obj<>endobj 1036 0 obj[1019 0 R 1021 0 R 1023 0 R 1025 0 R 1027 0 R 1029 0 R 1031 0 R 1033 0 R 1035 0 R]endobj 1037 0 obj<>endobj 1038 0 obj<>endobj 1039 0 obj<>endobj 1040 0 obj<>endobj 1041 0 obj<>endobj 1042 0 obj<>endobj 1043 0 obj<>endobj 1044 0 obj<>endobj 1045 0 obj<>endobj 1046 0 obj<>endobj 1047 0 obj<>endobj 1048 0 obj<>endobj 1049 0 obj[1038 0 R 1040 0 R 1042 0 R 1044 0 R 1046 0 R 1048 0 R]endobj 1050 0 obj<>endobj 1051 0 obj<>endobj 1052 0 obj[1051 0 R]endobj 1053 0 obj<>endobj 1054 0 obj<>endobj 1055 0 obj<>endobj 1056 0 obj<>endobj 1057 0 obj<>endobj 1058 0 obj<>endobj 1059 0 obj<>endobj 1060 0 obj<>endobj 1061 0 obj[1054 0 R 1056 0 R 1058 0 R 1060 0 R]endobj 1062 0 obj<>endobj 1063 0 obj<>endobj 1064 0 obj<>endobj 1065 0 obj<>endobj 1066 0 obj<>endobj 1067 0 obj<>endobj 1068 0 obj<>endobj 1069 0 obj<>endobj 1070 0 obj<>endobj 1071 0 obj<>endobj 1072 0 obj<>endobj 1073 0 obj<>endobj 1074 0 obj<>endobj 1075 0 obj<>endobj 1076 0 obj<>endobj 1077 0 obj<>endobj 1078 0 obj[1063 0 R 1065 0 R 1067 0 R 1069 0 R 1071 0 R 1073 0 R 1075 0 R 1077 0 R]endobj 1079 0 obj<>endobj 1080 0 obj<>endobj 1081 0 obj<>endobj 1082 0 obj<>endobj 1083 0 obj<>endobj 1084 0 obj<>endobj 1085 0 obj<>endobj 1086 0 obj<>endobj 1087 0 obj<>endobj 1088 0 obj<>endobj 1089 0 obj<>endobj 1090 0 obj<>endobj 1091 0 obj[1080 0 R 1082 0 R 1084 0 R 1086 0 R 1088 0 R 1090 0 R]endobj 1092 0 obj<>endobj 1093 0 obj<>endobj 1094 0 obj<>endobj 1095 0 obj<>endobj 1096 0 obj<>endobj 1097 0 obj<>endobj 1098 0 obj<>endobj 1099 0 obj<>endobj 1100 0 obj<>endobj 1101 0 obj<>endobj 1102 0 obj<>endobj 1103 0 obj<>endobj 1104 0 obj<>endobj 1105 0 obj<>endobj 1106 0 obj<>endobj 1107 0 obj<>endobj 1108 0 obj<>endobj 1109 0 obj<>endobj 1110 0 obj<>endobj 1111 0 obj<>endobj 1112 0 obj[1093 0 R 1095 0 R 1097 0 R 1099 0 R 1101 0 R 1103 0 R 1105 0 R 1107 0 R 1109 0 R 1111 0 R]endobj 1113 0 obj<>endobj 1114 0 obj<>endobj 1115 0 obj<>endobj 1116 0 obj<>endobj 1117 0 obj<>endobj 1118 0 obj<>endobj 1119 0 obj<>endobj 1120 0 obj<>endobj 1121 0 obj<>endobj 1122 0 obj<>endobj 1123 0 obj<>endobj 1124 0 obj<>endobj 1125 0 obj<>endobj 1126 0 obj<>endobj 1127 0 obj<>endobj 1128 0 obj<>endobj 1129 0 obj<>endobj 1130 0 obj<>endobj 1131 0 obj[1114 0 R 1116 0 R 1118 0 R 1120 0 R 1122 0 R 1124 0 R 1126 0 R 1128 0 R 1130 0 R]endobj 1132 0 obj<>endobj 1133 0 obj<>endobj 1134 0 obj<>endobj 1135 0 obj<>endobj 1136 0 obj<>endobj 1137 0 obj<>endobj 1138 0 obj<>endobj 1139 0 obj<>endobj 1140 0 obj<>endobj 1141 0 obj<>endobj 1142 0 obj<>endobj 1143 0 obj<>endobj 1144 0 obj<>endobj 1145 0 obj<>endobj 1146 0 obj<>endobj 1147 0 obj<>endobj 1148 0 obj<>endobj 1149 0 obj<>endobj 1150 0 obj<>endobj 1151 0 obj<>endobj 1152 0 obj<>endobj 1153 0 obj<>endobj 1154 0 obj<>endobj 1155 0 obj<>endobj 1156 0 obj<>endobj 1157 0 obj<>endobj 1158 0 obj<>endobj 1159 0 obj<>endobj 1160 0 obj<>endobj 1161 0 obj<>endobj 1162 0 obj<>endobj 1163 0 obj<>endobj 1164 0 obj<>endobj 1165 0 obj<>endobj 1166 0 obj<>endobj 1167 0 obj<>endobj 1168 0 obj<>endobj 1169 0 obj<>endobj 1170 0 obj<>endobj 1171 0 obj<>endobj 1172 0 obj<>endobj 1173 0 obj<>endobj 1174 0 obj<>endobj 1175 0 obj<>endobj 1176 0 obj<>endobj 1177 0 obj<>endobj 1178 0 obj<>endobj 1179 0 obj<>endobj 1180 0 obj<>endobj 1181 0 obj<>endobj 1182 0 obj<>endobj 1183 0 obj<>endobj 1184 0 obj<>endobj 1185 0 obj<>endobj 1186 0 obj<>endobj 1187 0 obj<>endobj 1188 0 obj<>endobj 1189 0 obj<>endobj 1190 0 obj<>endobj 1191 0 obj<>endobj 1192 0 obj<>endobj 1193 0 obj<>endobj 1194 0 obj<>endobj 1195 0 obj<>endobj 1196 0 obj<>endobj 1197 0 obj<>endobj 1198 0 obj<>endobj 1199 0 obj<>endobj 1200 0 obj<>endobj 1201 0 obj<>endobj 1202 0 obj<>endobj 1203 0 obj<>endobj 1204 0 obj<>endobj 1205 0 obj<>endobj 1206 0 obj<>endobj 1207 0 obj<>endobj 1208 0 obj<>endobj 1209 0 obj<>endobj 1210 0 obj<>endobj 1211 0 obj<>endobj 1212 0 obj<>endobj 1213 0 obj<>endobj 1214 0 obj<>endobj 1215 0 obj<>endobj 1216 0 obj<>endobj 1217 0 obj<>endobj 1218 0 obj<>endobj 1219 0 obj<>endobj 1220 0 obj<>endobj 1221 0 obj<>endobj 1222 0 obj<>endobj 1223 0 obj<>endobj 1224 0 obj<>endobj 1225 0 obj<>endobj 1226 0 obj<>endobj 1227 0 obj<>endobj 1228 0 obj<>endobj 1229 0 obj<>endobj 1230 0 obj<>endobj 1231 0 obj<>endobj 1232 0 obj<>endobj 1233 0 obj<>endobj 1234 0 obj<>endobj 1235 0 obj<>endobj 1236 0 obj<>endobj 1237 0 obj<>endobj 1238 0 obj<>endobj 1239 0 obj<>endobj 1240 0 obj<>endobj 1241 0 obj<>endobj 1242 0 obj<>endobj 1243 0 obj<>/XObject<>>>>>endobj 1244 0 obj<>stream x=N0~9R؎c+($&u~Q=Nh97Wh -N\a.0FiY.vd 8JD ?:h 8BM)׷C_E{f1+3ŵoE~zIwҩMozL.xkLB etC ߌ#1sU;.I@Aendstream endobj 1245 0 obj<>/XObject<<>>>>/Annots 102 0 R>>endobj 1246 0 obj<>stream xZےE }߯7 N_ VYS<;$BznP<%sܠymKBho-Q- E3]fLF>bCL|3M,>c뮟R _.Cd Ǟmr_p..ar.k/]v$.뵭0Kk%i6Y^Os>>^`%f/M{#wb^XBNad-6bqeV:Gu1GҠi~Z z|OS(/r96m\qDLN|&JSn6"dk{NrDakDNШs1+N ~{8{g֛UpÓMŸ,\8汍'PPLiqt]?z=7 i8U:w۱/o.ۋ'׆tjWgGŋS$˛ֶWc?=#v0FqE¯n7W[JtMwf9ȂVҝߓWl}y[·3x\4\ؕ jbS?&뎴Ig j゚ +"؀uO?]HtN@ĝλj!g8{ϐ[{i[r}_JBV!զ_#Gk%_զK)~_r'<+endstream endobj 1247 0 obj<>/XObject<<>>>>/Annots 129 0 R>>endobj 1248 0 obj<>stream xZn6}W1(7ۈ1Y^˶U*o_339Roq\I%De"Zm89Dyn,Di\ Md(7"81/OT 9&>4QMy ˸V.&bʿ^g-s xa=D&2!S2FDY*0$J<(7QUa v%`@2XLPDOAJABAЄTOM 9P;B[F& OYζ(JXن#PIjӸZ:XI!xVĚ,c8c,m'5X8)X"UlXR\j ADLF;yRcZb['daXf5[bB:-͓ߴ܀ >P r8lQp m&S"6sEܲ b!KRcHX m(Z@LDA'5&zVĦ%e:dm'5ؚb!X9YKFҬ,F^ f8ds<)ja14MA 8ikB5TbfKCiIY`\*#E7p +8⨔u \YG\-0w,E `HVl44*)bgR*сb3*)U?RI e^8OT,Y0qdٖM6!#,yA@u4QA$ y8vSI}Fm8 (\Lvc CLRhd+ڕ0Uc5,px0ZrJ-2Me 7I\Z66o~k_XM]")d ݼcz}m8z_<^%#mWCjv]TJxJ:%QCʒĨ(_}1t6 ?O{ˮF-LA܇YMY0+ AF tP+ٹm 錴߅뷋*jEJG8I1~nW͂V )y04HS`+QaҊI4 ;CvjzV'n3ƿ$,Lȟ(Z256ea8K]By?yOѵAIxmfr~JI! LJzü^6 ~^pE{YNoJB+ɷ J2"Ʈ!\hy \pz!w ;1yu9fv$%OGlV;>MY#+_5C3ۜ;̲0n^LOȺ)js<0W+y֝nZ|ޜ-Mh'3_%p18%jVЎ5^_\% f{ka<{┹IԬ*\|\%ذSsSIM0.OE$ cӭk﫰1*ٕK8N $^dܶl9#n s3ϏCAr-nEq3}{e }sjv$S4bmيO:i@=IvNt{OPa1FLJr.ǧ|L4R IRhg4YSUw)wK"{s>S|ґCwص_ij zEj3fI5ldl/E3\{TS,#OKӒxr.}xh~qe5`LUב dbendstream endobj 1249 0 obj<>/XObject<<>>>>/Annots 136 0 R>>endobj 1250 0 obj<>stream x͕n0EY OekFEQ>@eC,%"a"3 A? N`{\42V#~5<,yo錥(Zԣ`/Gs3(KGp`/(5L53\BSMn%JIxӢQ\=)L55m&96.jlZt'#VL!b`i/S_T$nU&q}%U/mcu_=FhE5؂]^<%{XM_6SgqT~]NKgnөx&dk1ug0~ f4:KtD !JA'&eZ#`? :vS uKʢCLI.KyR u)F[4=[jbە\>/XObject<<>>>>>>endobj 1252 0 obj<>stream xmVr8+t+-)'viwS:/LL̯ٚVZ5SQ;nglGZ?vwqsG[άh[,ew)vbs>r]Zެ8:oi]g[>- COދsiwA9#TRx%Rg l>xQUH٣VFҖ".=s +ZSr!u^Mą!#nQcz~hKœvxWMPjC@Q]"y*\I " W!(3z2B)ft: 9me FDVuh`SvO \b]S`BtxTA-~ AGJ=BլJ:TP n{\^KúDW]fp:Y,nfiTX@k-$x& mJemR:z֝{#5jBdK2|Ch6zYi@;pUmTr|/R!wOW a'IeZ";t0yt0ì>= rzqI x.uD5̫=H[E&h:wU4t3mCGgŮb*\^æ@Xu H"Z#>/XObject<<>>>>>>endobj 1254 0 obj<>stream xWn8+l'nMvZln(R%}3l.آ8޼y3q3~洼{*Y1×_aGqjQ,h]ɩ?hJz\wʚtf<:/V 9Z5m典WAWƇ#VG]̸vηhӘbRm)W{G!#!*}Zh&y5p>P7&=AA*ˮJ=mF@ eg*q.[tJ%RفI sHoi7<~0Ή+Qo_u#/9Hr=VSQ䯒tvoBPk:|5)(t,1*&tyUDLﻪڣB nwF36.2X)tؓh*]M;g+YGIS;*:NE;PikR *./ƠvAKLcg OKẋUӠBP;SrjЊZ4K[ФLLl;&iTn< ؄=QdB0/;*tRk J},r hN`sTJ/D-I[[DpUΚ4,cMd`f%_HPb5=L$Rp3'˅NۓU@fWIt8A# ]:7BR0܁S| Hi2!(Ey!W9^> dJX0 lovlK[P?U7l0W ƈ5hȂS.jzc"7):4@No_FcBP^xOT/qGXGV׀|L?޲.L~iO148xr}>1,#+/d pFh3teHeU18eB&{škPt^ұ`؏PO;h@;wLj[Joh) t$whݘj>7s5r iW"ﰷ0Y EtTϴ Nt$ppWz!Y&l xf=ԯJT=c"O9W/t} m[AhtET-rOV/S\&;ӯJ7dv 8P$PFGSK%$ AAOnnf6Ʋ5NSqr,NS #݋zLk,vhc3yzW7A d@9ZN.r G2p%p\}\,b&5oy γw:%kdxa=ioY4- ϛhj'endstream endobj 1255 0 obj<>/XObject<>>>>>endobj 1256 0 obj<>stream xuUMo8W zrX,%YpoP"Jo(U-'1?f޼f>/XObject<<>>>>>>endobj 1258 0 obj<>stream xVKsF+e #`yF6O9$+.#hgFvz[[nU2i{R/+h6qIiJ}ڬy<4SVA7"DNQNmXx \AU $Ka0_Fd=pM||ǛI{R!e DP7Ek'i (30=jiM~':֑$UZpL?TM2L-%tcƢi*-I C0зe$*(Hߡkeh0ц,0ىZͱhugLS&ʝ=@RogtAp*t%200_*9Nq(TJDUj i *y4 4S15 e +З8*husMQ" }BqV*fz,PS_ZT~?lCư-[;!9]%>k@xpyj$Șguamg50$]c@mkɷuM7, Gendstream endobj 1259 0 obj<>/XObject<<>>>>>>endobj 1260 0 obj<>stream xn0 ~ SVرcW=0̽ȴUh"1[x88CK Qו ZTIs6:Q:O)gТ98ӕLڐg3d0J|ջk0h9ir>Vl\<9:f}Empoq)k5ȶanyOن{9hg4Ia.FTm ySlS5H~x4F[ZܮBmuM:{endstream endobj 1261 0 obj<>/XObject<<>>>>/Annots 141 0 R>>endobj 1262 0 obj<>stream xWr6}W2#AUT:#;։UIqP$d3% *`zI3Ş={Dž`jC]LWNo)xAc3G:^<.؁,=6)lVKueBQy^$sxKH+3~01:SNMH;5cnkH=!] N,- hLyrŀh1H4.V?`]ǘp*/Ck+56f7_`K.ٔ ]vd\۬Bi)0!5$1k2.` e&3N;45Y3uβG\Gp;rA*P\6 TLyiB2H1uh!N`H1ECSxjʝ h@fC.h1H4.V?`]ǘ& p*/b|3Ñ-^8ifd7u4|.*ɟpY'i cXyNo(sfWs x =.|6r`3)){XD90n'TYڅD"$/acH(JDN'0hp# Ry,r<` )KCEP ^R ۂQ2QV-"zIY="뎱& d]FO>yIF|l8;y(e?W# 8B%#<ޤX-pkzl2^=ZCXC<'nIUe*^&+P,+dShrS>Һc(~/+-DI9ݗ!~ З Kb]Ծ !'y>U Ssd:Ѯ/K|]$yɋW^(ZS$žTd?1Oa`dnX;8q/0A. 6Hyş޴]J jCX̗ۇCʋֆs_T8@W\T$EG?9B'W7< k=XH՗([صg6 77jޑ2lv 8Ƕ-eRn9v>E6Xh} _$ 7) =$lkߥ?Pxl5LA/oאnM"R#0Jbȝ2ߑ8'?Gk$*(9@x69a4=U[̱g'{K؞#DZl"6}::"TmqO/c6rmا;ѕfo\Qg>GfI|qGUZUx%IyQ]q5dH҇F4*L6cIg)U8ϰԩU &,[_/yendstream endobj 1263 0 obj<>/XObject<<>>>>>>endobj 1264 0 obj<>stream xYOH_1ˉ8SGr`**!U&1*]ۡ忿M=^Ȏ{3v0 N`=c\}T`:Og2 qmJ&)~TKHxU$MtP26|$,$84#lC:Q8&nNE!q|v42I\rm/u.E0wOfLd8F̅qә\!q|vz8ƛC/aPR.Ԕ6Y`2NɌ) Lj4~: 1N>AL$s<\rl/dI"U;'ӦH2#B8Ft.8t>;i=|D~LrM^j&cPa蘭̘"p1Ogr8ơ٩y?U.E* )jL-RAl.~2m$1b.4cN" qC糓gsE( !ݔ6Y`2NɌ) Hi#t&Ac:Ğ\rl/E0wOfLd8F̅qә\!q|vzS% @ʅ& L 6I?1E11Ogr8ơI>" 5e{M-BAl.~2c 1b.4c"qCSGD>& 5e{I&KL 6I?6E11Os8ơI"'+>0\tSd"T;'32#墧qә\!q|vz83s, @ʅ& L 6I?1E11Ogr8ơIмht'GBaHPSd"T;'32#B8FL.8teoO'=@Lb|[5ac|&h P1oME80\!M~)T=jH(H*_Bڲ[1Z heIDn>}.ӟ!DD?;5vNosH5j6<u}s$SKe7"V1#%Y7fWVнt}4»>[jIږMǬJx8:E~ĕq~0S0L*Q9_fsW qZ>]R3LM"uzn]ߌ M*{H+.N揁h˂z۽x=QIhlh7Xu_J ,--.((4l>/XObject<<>>>>/Annots 145 0 R>>endobj 1266 0 obj<>stream xXrH}WS!q:.j $Āf[$~ w6ݧ{ri#&WCg˷+w2t\gCǧ)U|ga:w>N)yxXǁiSA,~JpY8m+K"s\F]g \vQ^k W6BøL@@+?E 8X9sYxa=^, r'Q. VW_W/1_b|-@ЅIH*e|a߾-oV\n?->{|Rf( Ee6-]np/fRWF2&C6shԺDV%j# u?o?Aߗ?yæ}ZU w HTxj/X..Vk6C~tqI]6^3Q\j>Dڢ ;3Mz<7LH?,9?7w;kSv.PH]7]ߺyr稴.z TtvkGE+p Jw ݰ's\#E 27]w({hf Jw%ӡUE -tL? h%'l* {2Gj,2 HC6(O2Q}QGR! s" apApȫ$U<=&Ȉ|ϠOwzιOwiI/(aV#[l0=D<3`@p&Ԡሪij}augG?hg#=K6 Lދ wx8p}/KFA4 ߮^ |endstream endobj 1267 0 obj<>/XObject<<>>>>/Annots 150 0 R>>endobj 1268 0 obj<>stream xW]OF}W\$l$c>,K!j'{ƝG\W+UDQ]@k0K |ޤuЉ`J4?DZr~ܭ>{<\=!a%tqr|bYOM\"4*c+e"kUSm K]&Yf6g!-zjfm>e[EqK!yNIM9skliGjFp_c qs"PB}8ZŽB犞 QJHU)QHz`@pl-[@7#Rb,r:9Ẕ&G~~xH_q`?16^K3ˁGDlG|+, H3s_Ռ>ԝS>[ݛ>ˍUu -u$قs2M:'T JiBaTyY.&!ą2A秞p+CMpQh:vr }[5$޹Zm&e cT0anK9c{1=Y O7V[_0_4Y#܎/^Sj^Օq')DY8) +…s0',,x7gendstream endobj 1269 0 obj<>/XObject<<>>>>/Annots 153 0 R>>endobj 1270 0 obj<>stream xV]o6|{:y?^[q# ^\܋-Q2JQRwI(i,;;;;ܟ| `69}}[FS825n3Hxָ GdxxiGR)|C&X&#Ȼw'(ŐH) )ǐ8eYbOuf$ԩobo;>vA0"CbX~ywحGv+5BGᑗ{X-ph*.pM^J}p SɡHk0 I0dHBj}* 1;0K GL#U~T?'U\?W5 (feZKu8M4g≒YZ0Z0d^Ҩ;7H^1R4ST |NV%SKFoPnX[.Zҡ DڛGTFm:F{)Xdh4F(߽Oqye;U.pn]mak.u%}Sf3 M֎\\3ގ}\Н`F/ܑ:9j":38JĈA)DckE#0Qwd-!Bhs gr`f݌kqэ7s|[,)PAS(0QX^hZ*L$uHx81D_0U~$`dhf8SACK8kԖ+!wHB)T$j9WGj^!})?2,ֹ9e·8sQuFhbc$:7BdUa4zP 1D@}@U 2i!e22X ]R>wjZ= B6mc'C=q*S9h]`'|Vhv97=(X4^n=BcɴdToiy`>ɯx/lWj( /䌽tY} 3)~Ã\Zp/mt9p$]XR9%X3dupmp\fip)pN*߬M-,oJ?Auզ--atUMC_Gvj7NH`2yϬ[WlF`1ox6&i]5v4]zendstream endobj 1271 0 obj<>/XObject<<>>>>/Annots 155 0 R>>endobj 1272 0 obj<>stream xV]o8}ﯸ}YQQilA}۝$d'xHlva^ $s=:o$Yށp>?<4'A*)^gF2G.m⤣^?nOn`dhiS]Nwk&`6U /ܬ!:?@;QbHFV_!xhhP^9(*jMazC @{2 - خXE,.^aCps;_.:,.jJ~PejQ>F \nЊt7_vU4º8TXD֠ PNv؃C:d-$+Y)82Fg@*ETm!/~vMmMm S%Ԝ,M/L|ct>W.f"=ah` 4~hL:?V&atzu%^3r:G1݌8 )7 ap4On˾؞N6K֌nݥȚcu;cƩX#x&RdRp c~>yg CEp5H?nC{m@*SQFv7>Om)lm|Bׂendstream endobj 1273 0 obj<>/XObject<<>>>>>>endobj 1274 0 obj<>stream xV]oF}ϯD況D!mHq 3M;@dj%;sϝg-jE6u.(nf?ƨKE ҿ//;%ަIQ\O2"*d,MJRlLR%XxX4&u*ΣΚ:aktq2zC6O Ѭ]֩?t2;;5ٛTvίEL~J_6FʃP+y" qba)b66>G4% Jl$b2`T%RgC{oߠZ͚R)%j^ mIqn{4A  r[8̜Iʑ69%hIH(WW/i]#q'3"jk+7 hI8_K=a=GzjdkpңsYse"_yF%E33糭絖Z(F/ԲQ>\1"M(^ DG1}T N_EThΧY«݉wsNS+b,Ob~g-vek>9 qnhhRiLlxf!rF_ ' 9$T!Ctd&2\8wTN}c3}V5}ۍn5^fFGW ݳa׫Y'fqxTCq[ D΋%t`?@"X)TДygA.jԙ=fH)ף5ZA5%\]b4þ O3߁OélTn  KRdAQBrZArs2j;1W̱~JޏK;-zꍲFgR%xߏsC,K¦ rҋ#O0򕕐.NB u u~J'xe iOU D<2avp j ,>]YE .?MnނR㖽g9?=z{jRkڀejؖjn6,@HN\hKeSo7 G _"|G{`{8hVt:USڇ>G1N^U`Pm*Aozaų;i}Hi`:zb ]Ay֘9uE\6~;XXendstream endobj 1275 0 obj<>/XObject<<>>>>>>endobj 1276 0 obj<>stream xVmoFίH`H@jKQ E~w];361NڻD읗g晗@ a40^oNw7h !;M[^'ߢ61l"k3M}a:c;柎;y^=,FC%LFI.?/iK,LU& ()BVdJ34G󱉺 Eq2Bƕwp{?& & mS{İ4G h @ JE¾pYKDП/uHL-dSep{LusR16 0}6iWڨKQyp7CVYܭwa`Wf28ı)ѳ,kKS@Lri%s.1Pm 4:y^|Yֿ;-S|V[Kh[Aξr0F( Jt1HvX_ {{ae0okoLu9 ?L-CjP8KJm sTg0UGqu SduAi8W&odfu:јJrcR0(8Ҷ*,o3{!vpԆ$Ԏ Ա1u=x1t5 K)1a>5Uʨ.%rY:S2 lY5v b4B,Ьz_=뀆 H[Q!VP ۹vLH~-ԐU}C[G>1:!T8K M& <;^]l56e*]hbPF89s˰у (wé͒`CEZpRCO#NR&7pR LpVW%O0W]_nxcZf??R;ҪľX N2@P3{a;BEA4[QЊ,y0XܩtUn<[+ۆ?M=taY/f.V]c#~1*zfkoJ8X"0 &7 4윀hɒ &x:uI%ɥ7Ot endstream endobj 1277 0 obj<>/XObject<<>>>>>>endobj 1278 0 obj<>stream xmVr8}W000!<$RNfEF< lCC-tnAzixD'dӃ^˽Pw >Mrz4 2=&- ^Ҽ!=#*Թf%>Z"y^O.ΟzvJ[%QaXċ-vB\<[;{ ϻWKKa(gJ-+XRLby}nї'_23r-3 *c 'L"%hmF.j$U1Awo+e.\'RLQRx%}+)g!UnCBUya~.@º t%JKiU킘N84OsrSxKn念s`˵sv>y[L su?+S+=SگŬ%,梗XR|x#H:*IB__YCPǾgf2Q 6١N _ixBqvͩ& =t@v-]M:0wbGڨ"#}uKv(6+84r!?Vc*/чqQEoC{6t BJ9Zy5vMk>QbȗYG^hD T6~D`JjQqBJ-㓊-B-꣺E LQj5%1j[\vw"vm.x'F^ʿҷp.Oamo ϓۈ뚞fO٤L pwup)UpW9R1})_Y.O<àX-M;W,3)xi4=Cz3#endstream endobj 1279 0 obj<>/XObject<<>>>>>>endobj 1280 0 obj<>stream xV]o8|ϯXlv~$-pJBK͋Dd[f)ɖE,^h-.jNq~>S<>&4Q"f9oo(J|̔8x/\e%[Q!)UL/xJ:gLh]BRU&,d.u)Je4~! KJKF]Li< /C š*QJLܬMv GWw&YƸ^i]-H_FRjMN}DRi@eJҦ"ԕMk,)*4Ē;efSTұ-P:1{G7eH^QRAq^oT ѱ}dq{RhPƾ.Y Io[ִpjHx BxY͵ґSApt2sawR+4d'JMe;@bhahX4ʟN_yi8 ,s'zxz4²TV܄}#;f !ZU*$&< q^iP/Nsh>EN5,ŋo+v^ϹITZ: D;j`bHAɎH^E ڗ7;c ##!B~KZ"cP!գˎ8kmpV#Ar8OcY/kZ ̹q6oe@ 3`2V>r oؕjGΓ><)S9fT X6̅~ [P^eR 0yH_.{d5 A`!;ю.pq~Pxg͏BkQr͠?,rG}Lژvt$gb+u `:U2*'}kD0[*/区rhߏދ{&f7xG;uP*xzK|k;!6--=$+߀9g LX?%k圃?(ƅp>/XObject<<>>>>>>endobj 1282 0 obj<>stream xMoH#A2-3JPVnvB.݆ݞn; ~j vH㮯ުދi1M攖_W\h2[ⳤd!p2<ؾwhx;8ufX.'B(Ea_)e Ykk(/Sn{EkrvdIZDd6}TgB XgnZݰ;+.HB*2HV*=iOEh2E?qIliX,s16yB /i0yѫd">Y@)2 ٜ/tzetI2է@_ ϽmY]Z{YSn!uYF{$ JJuSTui~a-TmVKjCr Ǡ1QPE'>?ЗkR? 0d dvR.jʒk m7P'7h6ӒE:`lzB"*yJ趥whQ7V9V,u_XN9O: v9?ʶRyP#c'<Ƙ(~/8w6% ) Xt$@!JUZw8MdTj3j\q66Q;, OFtPt3Kw/K$#GDy ٽB 4oo & IX2 r:@76IaOFbC܋EaSўc7砢Ot؎t%@.:ݕ~7U2͕ jX 8oKJ9DFnxbBd"p ];,'OO(idI h?[vLE2_Wٜoֽz>endstream endobj 1283 0 obj<>/XObject<<>>>>>>endobj 1284 0 obj<>stream xmTr0{Ċ:viN/#Yr%yO-S`<}$ #P5Tym_68֒l.FHhcIZabU^}aޖ;gNy,o!& GG%`5~P)hCK=bюgv|z%yr74>w(oRyNFl*vj$sXX̗,W!w squR~>:>٩ ;<\t,VWB$bm?Eendstream endobj 1285 0 obj<>/XObject<<>>>>>>endobj 1286 0 obj<>stream xV]S6}ϯ0 I }K f:$[Jr\Ɇm2pq9hL|B"k_jWE~g.hULsbtТD֐0VOWOKSl@ XG[u9%5OV$V#$&($^Uv$jaZ#zڊpoo3.傲4QF |8pN>X|xPB'\ e,ye/qklPz<0U"S*Ak hUբ#U頪*ng]6R1ڝBg.Vt~3rQ(~X'c69Uj8cE)mn+[`˄ٽ>EmF? (GV`M_*a60q 㱈5I'#Zm62M 8zW wi ϻo&} Fce;=c)eUR@ n+]kB랇`@Gpz I3}ÌBBeBŤE&c?.Tį %HCҘ 'Q'!0[MK p BW+c ͮ@6cHEɳx<| 8>Y\h5W%.S< AKH٢fBS*bFճ7e033!tؕԦv(aEфu쵿B0gDÌAímj=:n?r Rɜ(£ᮅT ԛ@|`"hSV +N=vhcB$BW:kz6^r53k@aɠk,\!Bc}nx'mjszk*ãi *~'^;kB?H8`i<ȉЦuCInHCoq̮Q\?2\ ;H,^LDS0&z`m=W]d k :pDG'KzE׈[O֧E;O; Ȕ pm`)=p  =n x-l/z9O[Sn1~P=b$<ũ8Ca{d}3]Gr YBl l5'+חם(_mBDL&#R="RGsEfKWf`?ᾝ&r6b_/l85^pW_GSfendstream endobj 1287 0 obj<>/XObject<<>>>>>>endobj 1288 0 obj<>stream xuWMo7WQd+ܛZ$nFA{0PfInI + |I̛]i_sZ=լnO74foWmxfFr9H{Fx̞ju <K[IʨD Y')02"?lt~Wr边/ "7ξJҮ5ePx7Qx,j_8>0IUeGAr2DĦ[;P7Cťk# Α)s{'tAp{{Td^]1/$zuЉT.˝A_! Ijz C{n=O}AGLE0 G) d'yK'<%hb N<L*D>ejIM牱 z[ j=hS0Vu_ZNu^U0%^+hh+>O"?Qc/*Dh_e+W 1*nPX#c x,!֨27I+E`hg@`:CErHW2(drDJKc|ᚲ.dD#"n?Pg`gy¾umSoub @fwjU/2bQ,C(I &Pb(+~lns{_endstream endobj 1289 0 obj<>/XObject<<>>>>>>endobj 1290 0 obj<>stream xWMo8Wb5NY4 t[([TI*mh66?f޼fbF3 S\bn+E;^V(VZzR!"DV@ŨVZ#/0&q1jy2V scQ:֊}(L30,pL),,;TV4# ![=/-7׽YUm=U{<|y6-b eI6ɪ7iwVy/5|1F('H,bEt-fԓ~NqEO5  Eߚy{!(l@ $"=`PK:"dtj؂S:.Py ʑ6L\:GK""G c'WjbL sal$x Z TdTց8G ljUf8v>-NAV~|ӆh\+sU{ +Bwx\/Yd"Z Dl១hf`ZNxCɁQʰ~i P>EeYb-5RcgPKy51IõtU)O7l4?kK|0S[9O# a 1 )#'9~(M`I^&`Z/q4`Kk+|t~<9fWQ&뇗61&Ym'ϓ`5\ReLzE#l>xM᡹cʖþИA8ia:~\rx./RŪk⯋c-endstream endobj 1291 0 obj<>/XObject<<>>>>/Annots 170 0 R>>endobj 1292 0 obj<>stream xVmo6_q&V-[K}H~ZhDj${m{I{=wR738u,(eɌjLW}$P3v"wt3;fYX`yw'@S\Nlw'NUoz;Ӱ:NKx~؍+}:Ӗ]FiJ ^̒rJ"P1U>l[ ˇ ZƚXW{r[Vii-Α MV[I΋3F䒔#quVj 2b`LtW^钄.߬0 F3MTKpX42V^J}0̒E gpu |"ARz8.%3}cph]Id (gG㈯#̱ VFY'tZill<-eb{ch-k82XP['8`kŞ ExZKwD$ 6$mZ3Ho\2:P|\l!.SN[?XoE̊c] ` dȵkk8O$[^ƽ 9' xẇ`./_A ̯(sҫWX<`O^pͳd>[`Iʗ_ ~-^endstream endobj 1293 0 obj<>/XObject<<>>>>/Annots 183 0 R>>endobj 1294 0 obj<>stream xVn6}WLV,I6m\ LlEKQ~}ϐ,;4PBqgs+~ci0DzQoxGS ѐ4'_2zjqσLqujaDzox2tcHQ7[M,pj'oO|{8Onj1-RNu4GـkmI[8RrJdp䔖Dd7tu5'oZA27˯u; 1#W"uҞmt[Ii'ω~H`CUyU|t\9xFy:+|t* VZjcLiy}/A\n+&W>+7OҾD):# 1 ybJ+6rMn qMeOҟSe Gfu|`֔mCZ JgPX vI~W Q&Ḛ*@@B2k"_ico% AŨ|]p31l/|Q)-S҂%MhtpA6`,gXz7?JdYd>߷juiI? 2LZ ۿw'i2_ vܸEQD?}Ajրu|J{V.#{ sH!Z{Gy:/"+%YJީ5)٨:褂)"C&ݙ*1vg0)mOhSVLb_`D3,vD9bn z9C͎#џmCeBA;%OSC@(9=4H$A#KL.R8-Ghgz6n n:>y-*]#dgVsIu NI/d*x 1ռP3j(,˷۟[pPZrO5YnM\ 0\ qYW5+|]p4{tQ\T|@M~UӏoWj#|bN4KzG:݄~Kqq1XPNz`Ox}V[~k bendstream endobj 1295 0 obj<>/XObject<<>>>>/Annots 206 0 R>>endobj 1296 0 obj<>stream xVK8+H&'TTeÞB&t0x!$[Im[R{\ $x!$Eu\\9>D ?t|(@Y=H]I7pK+E/>Q:zq`Fz[$[(utňu($]Nw9fOzxJ]< 1*ɯ)rًN£.l~0_c8tF#)yҟo5L1(DL ̾,rӞue@R.נj)sa(F'NAL&JX=4z_&$%%iacJZbF@עPW7Ya̢_V=Rx-N^U,d '[e9+w?~x6y͇,x|j$19< 'kQ~Ԥ3oFkHM P3c^TԉQM0saՍVӪh:E s<0 hct|jC?JMpow2D~1z`]a|(OCcsl?,UWtI?5/<g+khFCϛv?}Jmڷ*՛5+[/$ћ Q߽iXۙ݋]d3}mYj6ABȫ'4wvY.d%1 絃nO p'L'o`~B|Vyiy:ʃAnb(;c-r[$~/Ab?/`ީ/TW9wYGa䎾q#߉hUzr{ c*endstream endobj 1297 0 obj<>/XObject<>>>/Annots 215 0 R>>endobj 1298 0 obj<>stream xUM8+rb66_s#Ⰷ$l!F-9< I PTQe~֏NLc )SVv"aiىg1KiٔJN"6>}G#|%4 4|h9,B4Igl&C&1T싧36@QL4}_ߢ69 zf wYWdٻ[Dԏ6DK/_{~|T=ђWBg߿|`cCF;Ҋ89QVw6]HISȷk9UHɆ^{ )Q=Zh ?:0R\f8硜?n{?n{ DSc A4xJ@p+Ɵ!\"xgad&/>i!Z_[Ps,soѷ`wf\7+ؿxa0$Л٬VoȊS ~vJR٘ uF:K(B2IaفE;Zg=Уw+A\| enioto8%on[h=fD^\(7,Qv64;YSRZ PgPV7tP 5qGޜEVcAST]nVI]7( ",\U%jSi+9xjL ^JDC5vDm0lw>/XObject<>>>/Annots 220 0 R>>endobj 1300 0 obj<>stream xVMs6WQH(ʒݛ֮M'z3H$$dIYd:=#zo߾]$c,)YSVOjuvIaAzMB80>z, 6w ,)IxcVѧI,&7ֆ0{^rglp1mZ-Mm(-hM$4 keBk)Y)g7䫨JRJjYF4֋B:!5f23][7^}:Y鄸~ϝx{6$Zo?|ݑ5F}ќyj68?~N>Nlendstream endobj 1301 0 obj<>/XObject<>>>/Annots 229 0 R>>endobj 1302 0 obj<>stream xVr8+hO$$7|Jœ ! h jadWr,6zyE_f!>9\-GQ!L^HY0ۭjx?y4Fd+i)Zi{AR9X^]^. ju6VT!1&QB[C8Xپ{Cp^11cJOqS_>~;IbJmC-R=>;z2N>/XObject<>>>>>endobj 1304 0 obj<>stream xVn6+.f6VeIE YhXȢ_sIʲ5Al&sշrJ7ΧYz44􋡯ϛ~ˋӜ&amd83M~d, ڗf+J֊3/h_)We ERxAR;oT5(IΔ9>mi4Yϲ)ネښ\9)xz[*|,Cʍզړ7]*%! fvbyaϩY6!ɐkG+X6tʹ4\\,Bg+Pa2EM ) rH_*^Fo!IrL'J"("昈ʽ>*2gWtAU>w~Dg|+QKF2t,%Oypi텶k<EB٣pS ~4( =})xSU:2=JFx<0C"g*pR䷰% ąO23z CDMMF&gZ$=` o?[!rhG#z~W:7Mj7_$][uԦzᝨ^?{gtth?;qR# #U.D(]q3%Sj5\^T;osJ 8N`2`$ocR0ЧL^.kjVwD'5FPb !U~( ^^^"Q ߹rS }Oœ!iώt밟KoE} p47܅O@>fw A͞۝kqbgRd42x'0\'N8 qO5Y.jGiݯ1:h樽0Z<[.V0{._viYendstream endobj 1305 0 obj<>/XObject<<>>>>/Annots 250 0 R>>endobj 1306 0 obj<>stream xVMo6Wѻd. ~ %ZV#YRj}C*ID93o"1%" Bvau)jb $m"+ތp8t![ SM=v$X6I7>l_MIqy_MqC6^g~52 qÖd%bD>w]T&(^o`MhW+$axB(Rz+KɿD5/gX*NV;Q]h{`n"ULe!#!}Dؕ %j~WDM#M?ztƔ~1I|^&p݌P̃/w@?NZt΅V }m@'3BN;kRts! r1O+lMF]$91eWʺ"WԽj< uy9o5Yݢ z5XOpMmVtwLJ< l/D7NL{endstream endobj 1307 0 obj<>/XObject<<>>>>/Annots 263 0 R>>endobj 1308 0 obj<>stream xVMs6 WZÖ|LML7-3ZdtH}J=L&<|x߳BA-%~|}QĐ l,YLhwWMavoe~w!I"ۍ`j}8Xw+](J"_ϻiO !J,x&]j].*7ּX tdE!g 8 /*0-EyVN5J(ejTjsc6A?gKX16uW̙ j,q7(Pv3:0 ޙ5Y}1X ENESLL8ˏ>G`w:Z~/L8! $}[xmz2n_'zaL}C.F'Q ɴ<߁+[їn^jUcHL~1݋u="CkgbAw78xfQVƅ4©ՀrlX<^Ea|# ?pfO8=h,8p `89Ͱn 9Z7d>/XObject<<>>>>/Annots 270 0 R>>endobj 1310 0 obj<>stream x͎0>/XObject<<>>>>/Annots 279 0 R>>endobj 1312 0 obj<>stream xVMs6WJ#"E}''}jҦDBP@-KϤ36I.vQH3h$͂\-xD+2#XpBY1+#=cʼn`n.Ln{guveYy9uhhsd!˭2Z{[Yt :xrC+3=sm٧OpFEr-(_-(a5\ȾYќu̫] Q0糫7^}o(vBYfmxP)dR2:B%R'iSfb Cghq>Cw";cKI'atcrB.e2Գ A_:D3UDȲTTTA ,f4 ,YUG]W|F %󱆴ie頎:K#" (IlO5|z =3gDZyL sA̵y!IUOcxܽBs]u]0K*i$]kZ6C\X3x˘YT|%,Q`:PiIH ۔A#h# Nme%yC5g(]*<F".F"6J Xti͠O.;vVQ1R|f|G: 1σx:Մ m^1mvN(X.Ds%!,sy½s%CtrcWsϨ:e+͙4[rN|_{m"sltLjә7*DUi:QTQ!]-:tDz||/l}h\)sQT*)=:h5)^+_l jL˓Lcg+5d`rV6W*cҫ_IO6 TE;K:4!nJyP%fNٺW䶢SNOoæ7hj"yt=7©enc *$N#LJ'Hm'tT{oTI:~FO,H*fW~:@6=;6x?Zty*wOȂ1*l!ӟ֟mQ =|Mf/M|_{}۷pw{{noO .^]d]YPrߢP4mjkQ74p;014cdu'_;y5oI8\l ϋ`Iv3Y;Sd~6?FX;1ꪅ9wG폯ۖs-b~x$WqZ`2߶?G mendstream endobj 1313 0 obj<>/XObject<<>>>>/Annots 288 0 R>>endobj 1314 0 obj<>stream xWKo6W̭JVDYEvEuOE@[@'(;CJx 77!LؔKnҙB,! #?jV|hq$e?Ȯt:fI'emӀt튤ZF!w 'Jd;`  il-`;bsQLZ'Jc |ʉV:)zbJFS+a9S"?>%a? [`Ɖg?Oaٞ `2YHU\Pk^ך?:G k3|ZdP+kaDU[jCRAmP^\-FL.3ϰ>ly gdDRr\ P/aF/KĬB smA)`(1J+dJr((҈աFMIEb31Ϧ-W(ʆJ*!xS-2װ/+  JC+ډR7Am1ŒAL{nBpo+ff5nZaԫ6˪/+W׷M N]]LO֩n<֮`j/ZϺ&(+mtk.# KWȮ ! ˡ B"wL&+nvm { ߉zQ!c:&VW=gA:|) 'g %.^_t?Jf=vʓHDjRެ귶L܆Td?2sobqgYHvuZq KYpǘO _ً>ӞGCF8l67K4YdK]:)Zfę[K7ȍa>,  7PTr-4Qg7f݅8͟J8_?O,8qSkPwObq^w,( o;.e8qcl1[īȱX O,8} OB@N8 {X`4m79z8^ʯ06f/cizw| ^Z/xs C L\fI>=MqKb?@! gAc]EvS/hvg̶ 0q =GR`Ynxup KS?MasҎˡnF{F~\iH-G sendstream endobj 1315 0 obj<>/XObject<<>>>>/Annots 305 0 R>>endobj 1316 0 obj<>stream xWMo6W̭ʮXt{hhH*J 8&AӢ&!3ÙǙ7?G>*l4~Ӏ¹(ix^ әW5]h-in]ljj-:X\fl9X 쯭N[uvWh>!呮6O6s ՌgFQթ$T2CIPQW YJ*M*T%bQ }S(+*JIcYUI+Y%SFXOf4q16x8&P)R5%K9u,xzE EA{߄u(UHv ##P8c"%Qⴻ`[oEN2{I8ISXO2=1>/XObject<<>>>>/Annots 314 0 R>>endobj 1318 0 obj<>stream xUM6+6l0 TIU䄩)-LdT*=ݒmlMUURu9`ρ/8+oߣ#zvO MVߧz wĠhճՋu3#+7 D420[82 C6{δ֩-dp|hj2u$hǥ3e\wCb,2}ʇ6o^(SsM6>q<d5b}@mX̓tTO`wt,VyYTL\z? 1c7^[9j-n 킻2.׿~ʏXEc8jZFzi@W6ew<=CpoDwecчspګ/=qٸ2+ܭp98zp=7}qx=+j-6"|?ִ,r?sy >/XObject<<>>>>/Annots 323 0 R>>endobj 1320 0 obj<>stream xVKsF+h<,TIf (l$5H$pRӣ7R**,c{ 8x \_m3 ;EO81H.Cx]`jc.aQ^E |aQT.F2* !៞4}zjZ7-f*cO]_) nvn6vrLOi. ʡ)C\nf X0rk19܀c~[M`phR[thp|وAwe۬LC_&'PHAN:6^F^)CoBA\[JoeAO|D)ⰎQ ~¿}KȲm[`q0{JtQRnIW@tiwKUWdaƱ(kkX( cDi崇::1)R<җ{n)}?&K1u R8BX]O7PՏp"Bj~J HPu4@B\[rB9E)f$2&2dq_%F*ޘ lLt,Tz/-G\WFpx YԪ/r-_@53^8')s,FY5 ilB%V`s093Й\Nk54BЯTR^H%OL_ 8QeiVdabƕUr^cArDvzxgpRPM3Hwq /+*{Z%U>/XObject<>>>>>endobj 1322 0 obj<>stream x}Tn@|+Jp`lc'oDyԴT÷gswg x{,^X9}-śo8]j8rsendstream endobj 1323 0 obj<>/XObject<>>>>>endobj 1324 0 obj<>stream xUK0W1$ěU*u 86Ĭ4˿߱E٪]5(#y2@Bl.nto @u\8AuM5UW.k5\|/ GHB#Z ?7Ana9 AF@s#n›/W (]YP6\>O%sxގC(u*%ܙ,v/_ /ڥm7#ږxٌ-Dx]z:@NI9IL~:=nR!D~Ts'ӊL{:RuUD8Ir}@7F3T`Є:}*RդJn zh<:2㬀aJt|}&x A{eRIĆHq ƃkKS%;_A8{`kLDH&Bh7~ 3[;OB=9g1_&#ằBFiɪ+zz?0 szendstream endobj 1327 0 obj<>/XObject<>>>/Annots 337 0 R>>endobj 1328 0 obj<>stream xUKo0 W讎bg!떠 횝"pl9X-GJvҸ-ZPh>?nxE`3Cuo;qXH<$]v#WmW>&JQ%EU eY;4g!~\6}.jH&ɏ*~FM!X7 n6ON3̟</sY5U\jSF=ud䥀rzҬmsgnV$*[|I>2zAO@<<ߋ٪Ϯ ($`w[@ J kF:=Az{1SOV/fBrFN"PWš+_Cqo]^*iQ$oX>/XObject<<>>>>>>endobj 1330 0 obj<>stream xUMo@+H$06P)R+{"9ldR7҂lAv{>tSn)zf*㋌&7 RW |FQ8},ITLwU9Y4܄M̐B[C*uH*7FCj[iQ6o7*^iMeZ pNY2.πxQ&e|3茒K,&Z3V_(ILUvLGЈBH$O-YYW*L (gBFe У˔y:L!3Tk|c iRJ'vM{f9\v0^rBЖ<lcBYw/,=* 4?ZZ-3NN2ȴ'ahz˜OKC-48șڝUЩi 37$mTպ zOv~6$=! ݓ45u-[Yh?(endstream endobj 1331 0 obj<>/XObject<>>>/Annots 344 0 R>>endobj 1332 0 obj<>stream xUoF~\؎tm}:hحv$BPT7}ÏA! d8g8c NR*|~@A a8)Kѓaʾtf #JCY쉭,1_lzDo1^C GO&X@zm$R"ZUs-Y #;ѩjmH2QcYDmZ)st  2e}-:WFn*UMU ~ZnGxys";7,u*{906%, 3BkCՕs׼m6qx(+nӐvR8TӢuAc;50F"nNdމ!j5DY y tȇ4])W?hD9b{J`_wWIvZ}kHM.fcp}fZqLmrr%<ҽt7|ﯯ_ &]v &|~1t?pZ)F{V$aGG@7Nw*'fC%mU#[CTfo+sHmA=(b)Ajt{$Q7f/OԮl6t*K'B+R-^//֪4BƊiLI$AAX{L:5 ˋk=ãhv?/LYdP6N@@n:^zG<ҧ{POás^,]w8K}X̃cVR{FHS^t|7M-0J{ǴҏێZ/2i[LχB| mp endstream endobj 1333 0 obj<>/XObject<>>>>>endobj 1334 0 obj<>stream xRn0{ á6U UhTQxvO??loӶ\bY<61RO8+CZ"_E41.讁OY3>`¼t~=܂r"{y:TRIɟx I7ӪdJv(ˢs&sM) (3)tFKP)7>< R(]D->V }=Z\¹&muI A~,VVusw٢۪m7|)\KDPx<"u֡u&=BZ`k(TY1vMH$8N+FRcc$endstream endobj 1335 0 obj<>/XObject<<>>>>>>endobj 1336 0 obj<>stream x엿OGlj(.ٓ\XV*HE)("Ǣ &e'LyH.=exc!Utgo;o0?NIA{w}~{qc q}ѺXv^#nL &q{'_5؈d|,c旍x-! 1~q߁s+7Kg̹b.{[e TC)H_HU0gTql" SO{ o04)@8yt #<*k'38;BG902AG]Rypf`q*V5"dv`ND`#22so+RZ8/LpVTIP|ç럀}PMxJIc6yO"81Z# !őRAQ::ÈeN"d;,Q5ތ>o-RGOۮjDQ U5>KC0۳QG2[ቂQ<].wzTͧo$P Q^s|S@ Nv\18T4n٫{4g~ gpq{7"*z^zTn-*.ꠒּK\GD]2@_s+xAj⏥x@HȼRCL5:v:x{,p4y%o\f#Iun{3J5Wƹ}\]7Z\X:ʨxB֛9t(Wx{|w-# 1 2hu&N._osҦ =:j !ۂC&hDr}Y65^Qy!Cl Of>no{'3n<2woN%{5xobk`{JHP@0NfQx-}DL--ڵ$Z 9"ШHաv (y-*r1R1sm |Z'7TWg9?|'sx-%/r Uێ6}߯G|ټ%E(-/ DJ˺!%FY/5sR,ǝV8Pۉ5wz|݉m>/v[\npO kZ~%vkis&)'ƿ;~EV|}މC۳Ey=*,,c;Q)UE-jeɪF$]m,iaT3αU& +ԵV!m|YlףSߢA0ܱ Z\AYmhtXR6 jU\`!:C5نMue5}CP-˧TQ_!f3d4V:gK噉(IͶkT0m1ݭLs5\gA,1'>TA%!QNMZ+3b{LzmߜQ%ik#oY^$*>:J2Ԍ WFX3=^㤨Sڅ h!Ut cTUu0=d#IQLh (F?)֦ꥍN'ᾩMvX :\Ь砘 N&9FumrI*u-:s CO6,\ʜʦ(#Bٛ^@E4F'$h])A:B=|^KTMˎaO=0Rz nX\ |BTwĺprX9p~c!ڵZD]#å }Wجi-?+y[|`>lFBIJ'ꦉ!/yK%O9y \gBH;GcfX M!@/i↑cț0cb&bfN,+2??涿jM(8/vq|Bw|9v)>?\endstream endobj 1337 0 obj<>/XObject<<>>>>/Annots 363 0 R>>endobj 1338 0 obj<>stream xVnH+("ŝѳ!F2@h-pqnRi0c4t-%?b|A/cvLK*9'AeVDiM[oOxlr؎Z*;g\'Kg 7M/^KpL^跖]i׋p j?׍+6 -'wR?֓ l{r(\ S]TjP&SxR*NIWTKVCjs3%}I*x)VLQo֏,GEle(R!v4 YT,ot=6S<][VysT,xҮґ;oBZRV3K&=/.HYdØԕ>/XObject<<>>>>/Annots 378 0 R>>endobj 1340 0 obj<>stream xUY0~W^qll-]5<5AՇ*2GZ/lIR~vRj `3>c@fCm KEgX  Ȑ15gU]|:O?yFciqVjQgB/ ]ޞ5oZ p[ oN&n2mM&uzOfq`z<4<Ctkqk3^Zp?ؓGİ;̳Qv>/XObject<<>>>>/Annots 385 0 R>>endobj 1342 0 obj<>stream xVn6}Ẉ3,ɗ4[Zmܷ#lv%%4w˦];93 $0+l'&2i",bxjq9? 14t\Myu9?tv %mMMB,9l*)M~ڽ5%:])?mܮ3Hb.LJ!ƼtUU"A)AgTѢCNŀj7Ka%"OB)ߪi d&Bw:ǟE$2wX Ƃ+h5FBD|foe;d'9 ҪNepXr5/L<Ӥq}֨K5Ev7F٣sNmMqrZKLoC֌qd},!A$HkZiԮ#["_l/?94 w5a҂tTEX.2c}xEn.%p4pL__d|ewz{Dh\VñK "C?y&ł~gЁ`D?n&MDmendstream endobj 1343 0 obj<>/XObject<<>>>>/Annots 404 0 R>>endobj 1344 0 obj<>stream xVMs0+Vg0CҖLgCzc&#lJmJrZ}W 6m@Xݕm@ ?Y 1 #ev@&$L a5HƭTDi84qX['m7Y['9mJ+ILr丹6|dB7qӒq"4G\/fSZ%Ni#sNI(٠60:r(VXCY7ghu7s- mUk +  h)LF0/]"L*?vc,Tr ZR>L%wucG:0!!!2xXp/. ^?{>/p=SO`z:mk;.j x}Zs f@3r-MP(F +;7)]D#^ݑJ`s#>PQ>{`A!a-S>MiwS]}5/G,l b%qǰH7m~w#B ?I^I~7 w~ꋗ<ނ8ș"KtꝀ\> /0|q;k~ltES/֏s 9T7xY>_F5['f}Ë l(p,Φڰ 'ipʭlܞI=b@dLhj'Gܞ]*m8SBq.mY/64ح=>iC{7Z!RzŅ' ^Upm\~6 2:DWP:( J ZlX2xWѶ1`@/O=Pw>l#|Dǚ(m%8JѝwT4C: hbӐn#Uh͒, qzhdO]endstream endobj 1345 0 obj<>/XObject<<>>>>/Annots 417 0 R>>endobj 1346 0 obj<>stream xUM0+涠mLѪzh7!!6vvK}Naa rxoy~@BBy7(HCH ݪQmf9e7Em O+Ei>Byf]ݷc j%" !$OlAQ9>OItӈZc=F>xj6|! Fx=YO|e)k bJI8c@йc͛.rmۺ`2 dd6tAzaJq۰pȅbG%K54,n[QC(*) T51ҝYrKkX(EO LQåЏr U=爥<kf#ӑ#K&65alFOi1! X$@@ X_z^Rںz/gn]M8I8ipĹx_>~$0endstream endobj 1347 0 obj<>/XObject<<>>>>/Annots 420 0 R>>endobj 1348 0 obj<>stream xVr0{$3 0΄L=dƖ$үlcC&0`kW}^z@< Ҽ7fc|s~Oo oӄECcј5rnɭ^nZ,`:)2@MXn0(| ˵Ob ˴ORq-ʶya< Q!J%] naō :QG[[a!>Njzd>a0EԖ3\ٍ0ZDJ1bL' gIJҟiѕ \;@3'1y;B݈Bn'\*LAXX&XL-*Ԩ,'%kVb6;Qs8a`Y~s*>JKm  w,۝#\a">knF*4g^ջ~E@7:B9D@#XWԡC}?PRs7G'>{<G+%[9hl4-0HMC~AHh?)_MD>`2>$#RB9:$؟:;k*m$ZUUZD}Z)9ǩF*OCk8Ipڡ2Dl Fk *N_! /: 4;h%"P*TLMr<ǍJ u~lNFwԝ:G@oڜ*m50UnS(g~w6;GxÏ`ׁ..X:]T}[ G<40/u!b6KS UWPa,Da<5 !g W99-{z՚endstream endobj 1349 0 obj<>/XObject<<>>>>/Annots 425 0 R>>endobj 1350 0 obj<>stream xR]O0}WGI\O>0,1a0[6ÿEfmҤ=|ܛ; l#PJy>31X8-cN+}C[;,zA ŪW,6 !òI /G_p׳wiTFi]Dzmsw/ߖ LƼt?m&4V[.u!uM8ƞWTvסrN8()ۋ+Ġd2^gX&ib$lp<$<'1Ȓڧyp>1uendstream endobj 1351 0 obj<>/XObject<<>>>>/Annots 436 0 R>>endobj 1352 0 obj<>stream xVn6}ẈuKoy.E(PhidKZJM8ŹsGL7eTLIϣb&pl[i:ʦs|6;Ī[ vn^1x#giu>X*~\vpsaSSOJWsT6x!ˠGҠAY6n Ȳ:_9Ev+u:qIUuk(:(ϑ%G} vֆ=2*(4jKO5@ *Mn5jE;YBbL+Ud<"TucG:3e} M f4&^^wQWg"#RFc7@cgHLK .fi{#2;R*#+O>O[?GWa'G{┯74Be'9YG;%jO{s_,u1KW[ߔe!UYD{endstream endobj 1353 0 obj<>/XObject<<>>>>/Annots 461 0 R>>endobj 1354 0 obj<>stream xVKs6 W}X+e;lf顇vKf X&U3qL@J<* zI癈O~D{Yb-FW+ʋI'ڕh#bQˆlv-I]10-t[YA2=d.ʁH\TĨNbmzαҨk,eDѳxT_'dP-KTMnA_ԃ:Mao޽=;@g`NT릑OWWR9>H}}z^TM>Z Rkh VqYZsYH}afmPu|PJA.[ A*[01k1 :kKSz4m#{3~Lj Kӵe[IVcqk3c1 5?.R]nŤm EsU'/*}Z8ф5u+\LׅZՐJ=([k8a 6jAL*˺Dz݃!0PxO@:e4e] B5C cy0]94'09R>*|4.;(?_ωbs2/ G;2syTLJq2c݉3SpSSh["PغaCu6 }t\(T54M ? 3d[NG+)-",3Y.lqleΏ5b)kMcTsװo_'F\ՋYSͤz>p8W~ 2,Ϙ/uy~ ^ /8|Fq!"~u. KMI< koMa2 %hf_Iq'endstream endobj 1355 0 obj<>/XObject<>>>/Annots 470 0 R>>endobj 1356 0 obj<>stream xT_o0S#UIHo];6i[TBNlO&NoC E[Gf%PF327/oB2"0"q˜_& %Cu妟i0N1&t )%!lN2gdq\9<& LbDVgC(! Prr:y1&9oQe[05>U#_ "'-9o˵S7ưrٷub]kهÕ+3]#r&(+㼖t+ n`ȳ* P ~' 0Aj. h{ڀ7|antE-XiV4XA7-zaFPb'N&:xW|Hm+mPJ3侺鯻doZ`g a\mDjr!SbUC˿}^:Do6>/XObject<<>>>>/Annots 477 0 R>>endobj 1358 0 obj<>stream xWMoFW z%Y]CUPQ`ȕ R_7-1)~{3fv)4Q덒޴z|NF$OEoRZzLh -bkkUYʔ:*GuJSմٺPQ"*ݐٛVk1߽ 3__+\v7Λj 0`n}0)sKh{Zx;mf87 p=lMύeZ]N˾N6ɉїEP:+8< ƒr!Bwˋu€8_1{U:ЋaJ stj{1L9Wa` Dv邩^/YAPqd pٺP1J V@<[e*hZAUmlV9$+b^׮(܁ecO (!wȇǷG)*IfQW#ͲyT`ŏo;S}( Ow=]O@AWdMQ k;G{8jmelH#Ԟu F벐pfxc+S¬V*pP>S ke SAٵѫCs5sOD`Kqŀ`af?t2ԼjXz6 ? :кJvI*ta?GE3lLϺ=`2x ,jTAz\?Of⦳Z6Cw57eQ<,/F܏bZ._g!_'(y lͻȋG*H6v2i]qry}<]O9FJRsPgq /Χ|v$Xr5W,zoz &iendstream endobj 1359 0 obj<>/XObject<<>>>>/Annots 502 0 R>>endobj 1360 0 obj<>stream xWMs6WI$%ݜmڨӃр$ I%Q}w~U;N2Sk$.i䃇?f1w#ȏ#׃(N JܰmIYMgZ37&A2:gZYueX]PTkfUyl0kP`yBʵBwl ^)WG ~,Ǡ &-Z0L]'wѝRl~X/,)z V]`p<6Rw ͛ ]^,̘ z,TŮ3ȱp7 YF~<RcSi9Zy@ӐĖwL)g q6 e& ǣΙS6=r:Dv'%8L֏'nZ=+OpJ940ͣ\^z>>Zql#Eté+FH噸\06& l+McBqv'RSE6՛%tQh3I)>) C%: C:CFxZ/񢭧?8Ej_橫endstream endobj 1361 0 obj<>/XObject<>>>>>endobj 1362 0 obj<>stream xTMo0W1]V{06mUMdf7~@*ǝ݁:B-=jdHDQ f_)ayA@V!:ft}Ȋy!{4Hhd|9ms@YTçQ\89m*Eϰ-d4LXOb/.l`fPs(aP J1aw}:K= \_ TqW2m] &AJ%*ʜRԎ\ mѮP0<]a,h:3A> ` dOP]^ɂiVhn{n(*t/5rT.o%U7zQEM{2aL"Wj;t9I+T&/F^Yۢcq(΍==ɽIk8JƚF1<j3Ny :) hoyV*+89/<>tT Ou 8oІUafG:WoKa8+"Dũ؃33MOaϲ}F,F޶at!)kJ|Fx=(FFt IH`$Smm␰HI@Ȗh*%Ioi Yv&=u#endstream endobj 1363 0 obj<>/XObject<>>>/Annots 509 0 R>>endobj 1364 0 obj<>stream xUmo0ί.!!}`/*m1K$;2l^ڨ:N|>{9I9#Ü\$ltT>YW$#]Gg8S33Td,t8;. pq&f~fpqAlP)̪{8/jX4֯\A#Wk@-5x˵`̽4J ˥;\\" m{@]pCa/ ipݬJ(c@1 0Hs^"+@:p+^NcYc*%0]Wj/Jm7%B{wboHiX~cUQ0m^(+G8X=؄$/\|]-tXڊ#u%K lO6ak6vKYH+* vR0RLDz5wB)Ԃ[Ds_K9e{̜+L͓(+j"G $e$\WPOGUM57mP;GB`66a:3 {ܗ+l !,iH5.+= Uev2l,{MnC4.nzqWM̭i< (F$U=X0>i^ޝ^woOFVW)w8݁V@56D_`ETITdd(zDxp< I6be :>/XObject<<>>>>/Annots 516 0 R>>endobj 1366 0 obj<>stream xVnF}W73D2y(tU>0HbE{ )JCqڀs h#Po?p( r 3X?eGo>q_|~j?!1Of:S )hl״J !bO$$8>[ݻCF< 1(TH_%o%)Y;>tWQ, $Xd2@TH V [*f+r'Ҳ/8 -OZ䒊}IEd&sY:͡ 1'~Nh_1KmL'z-, HR(IuRh[NwaDK#It};ϫ"ma3`' e&N̘gGP JVlB+~3 E a~C|A|Q#y9GkCg&|{ڎej޿gk}VF"[_,Zy!_91&_E30d[r  FO7~ =syĽlz^=nRhDG3tKV.݃GK47sykʦ28٪ a쯺ZEG|qjUAxX2o7/F]Baa';F}Ύ mGv۱V[WhG6%Htp}>9Y65%Mpq igWFRT3vr}C/Bo6/N:ԫB8]{ 5Im*g I̲ɶIfxC/~o[fKE =l^\:-"{u&젪.-R S8qu7R0ӡ?xYOfkStI{1A0,=Y#اl##e>/XObject<<>>>>/Annots 545 0 R>>endobj 1368 0 obj<>stream xVߏ8~篘R趬*{9Lb UibJ_3v!\VJ |3yf#61pHw#۲q<?tvĶ5R_GoVe7iYpA[#[-ue!!iu0VK\F߾.Z/Xw2==h~VidѺ&_o#uc GK2j:%C~)_30RG|E$%~H:8ONt1Hx~XqBõ!Ix6?xmXQMYT岄 _T/͒?fzy`($#G'U!`_40٫aR'a(_pb$  Yny#UHra~4|L\N%xǾDy}j@a ' Ol\/UO)TBG7Zʮg3SI!erqzHi`,ugL:tEϭӘ=צE oYO#E.>C+#"}wϨ?xy1;9LB;>` F*]^YaS1Y~JFh endstream endobj 1369 0 obj<>/XObject<<>>>>/Annots 554 0 R>>endobj 1370 0 obj<>stream xVn6}Ẉk+ڢi(HU{|E6FJ33s ~1-4[,h/xG ͢)4YF-?Z|=['ъ`M 9/ގ즉^·ycw~2ՎǴ""ZgIC""دL0a<] M:d^[ڂm(nk$}j?pI4e9c0axo+_ XH :lQdvIS?E^fbD'cCycb6κF䝝?1`mԒ`1ԑUS cRνcXX,UgDwim,q0ϧP{3Jv*Np4dDimWvX MNjym*Ғ°z)qYdPRL*TtL#iK }eF JO*l quQr̈6 @+J)y%A[!=kv5iG'ehH<“v, S/_&@wxمEDcc)BrqǶKW}oϤ](^;U7P: X QSϽ.sDQ59vZ L*$(ңgj,WRj Q1СuC{[y}8}R['yPq]y]v2W/ )^Ŋh4RV[~G=請-q_]pY㢶lvQG:2q;a7J W5Q]SI%`G PvOogendstream endobj 1371 0 obj<>/XObject<<>>>>/Annots 561 0 R>>endobj 1372 0 obj<>stream xVmo0ίo$HӨ&^RHqΆPRڕr9nuöl|R /׳\ kp=Z=nUݮ)lIt.yq%OpF]b AJ4K7(C)Jdlfj]h5kBڠ64_2䊵52tz &ʷ-hϒTиJp; 5bCbԆH#F1҈"NM@_Y]T>[{p9_?Z1 jUZEkw5`8L&F$3#Lg5Q&UQ̶4F4ijhPJ9lKcd}N.H7 Y:=)^QyQ=Y;z1 jSelt\.\ԅչ7DB-f[0PR}*[hi :PQ| -NLanWzXqncϚi&j}&,[!\KIطp]"Y1r^cU I`K X%/2}3&gw 'INРh4Y;OX(KA$yRO9tdsq&S$a.F 0eȹMdX#9>/XObject<<>>>>/Annots 582 0 R>>endobj 1374 0 obj<>stream xWn@}+plo4zq_Dhm0265FJ57 6EM{ pL`68}|5Lk:XVWa̲5^H1|i`1$s.*i7lVi @k溸Lч[$sA-#JڮLwj]Fkb&6jՋVJ;fM2%)]T1 rmeMduf\ysk4.89L<FzFK %y8 3xZ'A $S1&i>^<=4cц?"N1#7A?M>:ŏONYp%c*t!,0V&^ wr2\ɸ7 ], ПTʣ²1U׀S%" SA]S܀/ LL ⢱ᅑG? )qdV f062 )%gG i nxQ !I  !e q?֤.Jcpn{) $F|ISߌ._~7S_,?z=:.?2HU%DKv t(R'K E5Qjxɾ%id~K P Mq42L\wW@|]UH"V-&tK6^EI(2qkO21iendstream endobj 1375 0 obj<>/XObject<<>>>>/Annots 605 0 R>>endobj 1376 0 obj<>stream xVrF }WQq$\OvMվ͒\ݥc}]${ 8gׅ.zP4 q/"BsRh c'^.:,ubr90  (-򦙃^fI"gP+Eb,7p\3z6j9645Dz%k=U QEG 0,)0ȉ0xAhyH"9*y!RelJC b G~3 D!OǯݻpX1Ҵ)CtQqꆺC% c/Kz׼V.7XY -vE5F }B#F7b_I_ݎKPZ|\U XA'Ah $%kU)2u=O͕:绝(b ,9Sh¶~ o:lXj3T"!@8Sϡ$ɳ7і^r;p:芵օb)hW`-gV;ޗ5Xj-Z'ҝ% @(P%=l$C1N0"|xD/3L{l01MR Xؖj{.̎_1,/vs'bNpsΓt"FrV_҄^\`5pf2t9ަa?E 刄@Y^F@p嘐Kx!?m~t?OVzi ѧH;]-o,_5k+cU!ϒg~UʲyxY^˲4Y#Ҡv9^D8+iuXOX6ibpխ̼Vbrts2rVV&xxIiQ8ah{S,U(`-Tz X'nv?a:Iڋ#(ɇ4.endstream endobj 1377 0 obj<>/XObject<<>>>>/Annots 632 0 R>>endobj 1378 0 obj<>stream xVKo8WImEhI4Hr*՞ J* w$Nnȏ}qay3=g݄"<'ɒ5pnjD4s'"!*eE-rkEq-FΔfyK#=8] U3N^<њѦH i($S'"IWyl~}~\VBjy* =sd$'I5Jl8 3-8q=f/XZ6v,EĆ5;t,#Aa/Ml1ɬD2qסavde; &~EPIiմ HyfƙUL}с4b]-r  &U-8ǝKw1DQ-uZ["G NvFb|9 j먪=u 8᳋Z*p]G  w),ƣ3, aYV7xGc~)~Jީ9zG>p5ML;I$P;BP- x?v+jҜ[y/iwظ9O3^xu{q`J9I'M .endstream endobj 1379 0 obj<>/XObject<<>>>>/Annots 645 0 R>>endobj 1380 0 obj<>stream xVYo@~W#$1RzRYYj_ߙBTkAÿQKcԟ/aƆn9*,MfZ[,%Z>MUdRUua8QXH8PR߫;h&kCht"]]wZs>K߆$$L/Gi,xxޢ A,a&?u;MK˓mTtJg1yoPQUms)2"eodi} J][..6(GڞH<^2b/`2t~OCvhDPZ;XqP *o AP@!*6B&]F꘮=4F j`!1S&$ȤqzU1Vh!: |F}]7Ay^yUTTSFCFHhnUkjv5tb(04w=5W>Q[5RpS|7ip1Qm3s ف6$$m-oJendstream endobj 1381 0 obj<>/XObject<<>>>>/Annots 658 0 R>>endobj 1382 0 obj<>stream xVYo0 ~cڮo;m;0dǍ]H}-}1a D~H7N:E8\AbIw驌JdٖE[u߲4êk|UP|U5%J9M( a{5DbI,<+ *ALN˂eĪrp`4҃_2]/Ga?ahmbLXg,bc@Z1rdw Y#E88Y1)MŊNl\˄6ʶIz gwi*`2 å>/XObject<<>>>>/Annots 671 0 R>>endobj 1384 0 obj<>stream xVKO@W1IE8T=%YdS{]@E, CA}|c m8˴p|?Lӂ`O&渖1-k8vMh\<ΦXjV^!h; u6&R JJa N2_,YB5FkJ}M!ڧ.)|ogNE=!%dendstream endobj 1385 0 obj<>/XObject<<>>>>/Annots 702 0 R>>endobj 1386 0 obj<>stream xŖMS0{ Ke;7BZK'3cS[?b& L0ɰ^i>J?G \cr,#qIu6@ LJ509ncp=.9=Aac NXbN@acuq73;Xj`zI^ۙ ֲq| o@^cuq9 ZE"\l3Luk>ۖJƍENS_ 21,f5T_ES ί|` [ 8 I p8SPzkX>Ke[8&+7dU57$aɠ I㫲ҕ,7Hr *7:C\w٭^\BLseFF}v?Y ݬ`̀38;Ҕe#?FTcWa 0SqiZ#eYZbʺ4Zn_plE^Q=|8ȁps[1*C4Mӭ`MG$nA+ 3~PK]VpTUn[>mh76+-h%EA^+tvޢ]ikmii=Ch{ճog؜{ȫ6GwNv,fƋOEC0.=*jF,ċjAp#:ԯJgYldNE&hҞǬƻڽ>zCŏFG2}xendstream endobj 1387 0 obj<>/XObject<<>>>>/Annots 733 0 R>>endobj 1388 0 obj<>stream xWn@ +xtQni=@fˊBK%iP)PԐ|C9`㿀Cl'@-rw28"t,H)\EZ/ħ DZc %+=ےҮl˥B`JCiC`>KƮD7R)Fx%kh4i ^i+V>gإ<87Kl:hBJ(KƮO[JZA'ڒAVvEtQi?EHCdEW=N,hn!WeT8~> f37PlH`udZOd>>N[ Fb 2noZ4{z?9:+g:;*|vfRpk2E oZJ`{>(q֐JQ@i0o<&qSVd!]Ӹ̐)݃QxI) J „ DS[PXx ^lQV-:l,l-,:/yIlgY;,P^ V%zQmpm2M*Ś\$ӴOysٰJ!Iԭ9>u ;473O.>SlnP9쿉۫ql7%@@ ;쳲SslWxnf&^c)h:;O$iiBbgT50Yahadc{{@ }K 쇽PgcFD$NVy T÷:F0 g,1#!txE;\!=_!Cendstream endobj 1389 0 obj<>/XObject<<>>>>/Annots 758 0 R>>endobj 1390 0 obj<>stream xWYsH~W#& F[ R M$%:X߯gmW蟑E&-#03u3 B& |z*#4<Gt]f*&E\M17t,Q6{j=#Li:n`,xj_ЯA&IMim*br:yh8PԠײިmM)ށfDs~X 6'?gN#ˢ7T$-bUZSn/<[UfD g\mDqSy4RZOiZT駙]c+bZ0UBPnޯn-Dؼ@_4/UT`RQdo/URFeheHKwx"}nj-u-~]]iUeӢwЄ ~ת&oG:B^晊X DUʲ5tcQ ZJRC'U{&e !aq@Vu.oqbAў */llrI'ڸ,X2Z^胳uG3Py6ܬ )xyͦ==0'4Wrjʃֹ=yr۟k|6y 9m{;ȣ.{N$GdD |7H$X4A? ~HʄR,m)Q>mYLDmk\r@w)V=v<]!g;W~]ۯٻr?'PF{pʇ^Ycloi\m75ٿRWV]suQ]ম A>kf#Edzi7{t7ΉmD]5{Lи5n E/YnY ȚnEى%g{ oNGL1p#c `s?gNM9͐uendstream endobj 1391 0 obj<>/XObject<<>>>>/Annots 769 0 R>>endobj 1392 0 obj<>stream xVMs6Wq,F/N!3i2Hb  R}ԇƮ=n A,v߾^L4Ih8 ~0hDS(aRtכ΢$oшtОt+ ~AMb +D)ܦi4-MJqLMl6yf2yvA+庼K%y+P$~b&E1:Cd6/~}#jStVPkIl? \2WZf钊L0c1Dd Z /$%l!/7լHP#3o,㆑ MKI"e~70)񈠇u GRnJ]ٚ~b}Je!|(SҺziMK- sQmEv{E-ݲŢi_4MxmbT}fu5gjyV%Օ.@N[nq}Pu&KZU |u{:,-{of%AÂ1^G/mB:87 uχ ?s}-_<[6kȕ*&P;Cat5_(\ZfuRlnf/Od1ߵv%2BYX;J,{Nɦm+%ضzGr[:\MrB ]մI,-?# EZn#R(0pAp(.Jᖮ;aZ@i}YRCR\H[Q> 88ڙq%q'|:H OPO:I{&t3a.*2- BGJѽ6H*V]KvPKLHզ!=ĝ"dep*He @áXZ``(mah1 4aJOJZ:c-n'1J'锇Dz夥OBB@2+>tFObvۼGANendstream endobj 1393 0 obj<>/XObject<<>>>>/Annots 794 0 R>>endobj 1394 0 obj<>stream xWmo8ίoGoK@>յRVH$lvh_c; $m괻tgf ;?8M|Ku'^aaya)p 7Az#9k#`gS+YE毨}<(`)'iwdQab$ BG֯줃6*NZ9%-9jm6aavgt,8 GXSfVɔ`<,atJH- ?Yh㚮fÊ,wt]-934`>=K;eo8ǚG`r ŭH BrVz8=qM&׹X|*%O&eA¯UT&1api$X t"qJ$1Q&MWúxS4 ~NQzp!cܳ<^S\=d$B] O1ơHTVΜEjP^7#qdL2E 9790K [٧C yOdz$ɝTTiL>0݂xp MpMwy5زɇ&'1ÒUĴg{A𕿭~&И&`;agx ACuG`U6+Hs(&Ú fAxu/(~3V҄)~ZB1vR14 ACG0ﮱ z`lY~X?j^T2Y7,]'k(h%6ӊhG,;5wW TKq*t~D%Q416WqOAHR"mM4G4% pjĖkQc;X+ʩ$9Hћ~;ݯq G%ms76 /<Gڦ7e <*W`F}?YR vVU!C>^<^^z?6^n0!Ufnqp+2KE1#+jmG^<oqh>Xpendstream endobj 1395 0 obj<>/XObject<<>>>>/Annots 809 0 R>>endobj 1396 0 obj<>stream xVMs6WQI,Z>(Tձ=94um DB4PHeMܙ{F$`v]݊҄zCʪV7ᎿPF U[ FԏQxK ~k<aUf{#SQ2R,'[Nzi40:M`ٟFGay3#uz)OqL1 GǡKӬjrҒ{4V^\楤JT g+ Y~BdN]8^ǻ?Lj]Gi>w4oMUIR[ZR.VNn19=G[z.Jƈ   ;Av1:G5UIkrxQeɋt6Q3穓 A`q0嗻ǰfwkț_Aa6=S5һІ.ל;D TZQ!Ranh? TK悥L4G@w%U-KY J ]QRXOJ4|/q)2% -K(ҏL+BbJ6\rң-D]m2*vDw]fF$8;ї!F4HKek')]䧢+WUe { v5ߵg7\iA$P>}x@>/XObject<<>>>>/Annots 832 0 R>>endobj 1398 0 obj<>stream xW[s~Z(Q79Of'Vϊ\[ʲeŶ9m2c qȩ9M4S\>9z{lJ8SCA{<dMx|Z"%,#X0T쯡bM NY8HDvR i*slř6MQy_ýjr592m`AᘿlhgtMd%TI<٦2 hl3T8Mehӳ1ij?> )`Y%u3Eg"aʭ8%"|#@}=^ [L]j{3Ĥ6 -F71?Nc} xU_~)iN5 i^:Ӽ$G,u%»M4VJ=VFC.WV/W_T伽zr|LE79F66"0r߹s̋o }6+dw22Ѫ9GN_3}54F!vt2nKus.*0ِfӀـ5W{c/% V  @(c#ƳvS/tPn#mr }w;gkd+mA_x,pn0 p{rP|sHf;Cy%5KK# )v`)VcAn`kwnm;0ޑ3%]`X&g4b1J~I;7R%:11vcb$;,& [MWt.j g@B|0}V` "L``FN+Jc{(*[a-5^'˹}2XTQ¡MDָ o1q{# "t&oмpM*v̩-(7<vUeF2q3O{N`<|{gȴ!P1ON8TE ,R z3%C -| CU>̊BzF.Ue9ٲw0M]\?vPΐwOS,In/w'endstream endobj 1399 0 obj<>/XObject<<>>>>/Annots 839 0 R>>endobj 1400 0 obj<>stream xUn0+ "ٲ,MNAF(PKR6ܯ.-?M6`]l"b v!܏xLa&A -Lq+ tr$x% W4tկC6|p}CAV!y  !+B9n`whVsB+Xk+%s B++ʁu2"7@W7#%T.E+]Ndig3K4^7HEeUR,Ac` a:UPQ0n(jo@7"qX}+ L6]ntrٗgjxm6o{֝O:k-},-Jy~8@0f"!VTG_ܫŷ*wc2 57{`b [ԨԎS0Á)ҖAאhԄ*94̢yW(7䖣ܷ6uE8舖]^Nk=A`m9}oWLZ,4NR#9RP c򔒣I6xtVB24Rf=8vz_7ɳ0c\=a? 840K Ng04 SE{4꘤,%ݦE69Z9%MS>n)QELly,Dendstream endobj 1401 0 obj<>/XObject<<>>>>/Annots 856 0 R>>endobj 1402 0 obj<>stream xVn6}W:]Y͒[ -u6h^ITI:v@vD9sxfM|χ$0xo/`Ρ Qt i6\";Yߛj/p} b.i>/XObject<<>>>>/Annots 881 0 R>>endobj 1404 0 obj<>stream xWmoHί o؆o\rD']~*UkȱI3^l驧DBe3=b҇vŞA8 8vV*/M\'dK,6HH}Ð|YiCIPx,,u01# &roR9}|!ivF؍EQFi6cMlx3RO>Y owIcLEo?%1p' kTK Dy'Dq:v19}nendstream endobj 1405 0 obj<>/XObject<<>>>>/Annots 902 0 R>>endobj 1406 0 obj<>stream xWS6~p/x\L{3枎bXԱR!oWv()SjY@4 )S>xuvLFK]Sx9QFֳ1bv4FS~ȳ ʨ1fhke${ É+~$A= 5fHf'S!##aX;`5f#GE=2o'X퐂h:_^F4O$'p\_ 0^I'vq`йEY]]M+Gmݖ&הԢЙVN/DZ.eK;ol"/אfRӥ~z8laM#DGk2^|m%%I!RG| ,K]z k\swX;G%E+@]ijZtIvΩhZ%d@mTYIp9*y:p"kTejEL98%\ce̹&BgGM- CeiD^cV2tQ<;͹U*zj.u%3֛҃5% !LIwEuqw^Y\z^3 JuFq3THFk"med8&=3HR #ӊFz}Ӌ3M uP /!wi7hyVIE9;u9<X KҖ)! !{lludreUɜvVg06kT{ Kթ<9.එ-M[Kw]Hæ,줥?r&{dd/kG?p; f} 9?hޥh7ǷsYEYS.N/*ySnd9$mV56_H2>\>d|`S\e B0T4) ䷇V[QB'#|μ]ň9\~W90v z% lMjċa2ˇNկ?7endstream endobj 1407 0 obj<>/XObject<<>>>>/Annots 921 0 R>>endobj 1408 0 obj<>stream xVK6 W&e;[ Ŷ뢗Vul)+ٓο/)IAF("ԧ#!3XF/ FaJn,H *ajX8%S[̃vCDܮ;9NV֟6֟쥫(BUV$;geDKnEEkQD{j-\TqV$Eh!-mޢg ` #<_-:4wf㋬O0pcZjew韣nNK |6:½:jSqiD' Og p60V@ [54V@vH[̂>-q,E B=IU%T:Ga'}BaAWϝ6B r*ˉ׀4pMzϺ3EӺJ"T߸^Q<SLAuY Eѣ Wp@,:R2i Hm@SJ25֨iS2 cjQ`(ҹ~?{3| Ď{f7^޿e~Ibl6/3d>#(lL,k5`v;i\D(+f7kľYZj2)չiePe?.Ef^#ep>x@eZ\*r8>rk l(rWbfCYB}W\%ͯ=LȻp$S7( bix{ a!!]w #qyrkE847.W:vǿxu. ZBZ}cJ}=o"dl'FW>V-XRPܤ殶dc WxQ"b+rh!Gz>+L d~oُ >t.,='$=ۭ:]o+ANv$Zo_ž"SLGULbך~ qendstream endobj 1409 0 obj<>/XObject<>>>/Annots 934 0 R>>endobj 1410 0 obj<>stream xŕO0W|n#{CBn~g'Cik(|pH#cul=w<c$q`tAk4|;qjaƽU&ᱳ)iLވl[;($NS"QtOnv!t}[){h>Ȗԇ$x 僔qjm# .RZ4Vُ`4O6hLɊAXOZa٪-ȅB@(mFTO RK(]Hf-H2FiaZ(+!ĐT! kucpq\Z{ hzb[EiֺJ6oŻXH(o${شcMcoז (ԊFa%jo-NGN{T6Osܮ;:Fǒh6weo[]5i Aэ> bpsyauȜIY^OeU9T+B|hI0~"Qe![2nO*ѻ:F{ȁxBYֆ#>(?S=.|FT=σ烆[-~CكdEMQo3OMd8XQx^ybeRAB!i8uxڗ3>IG`: endstream endobj 1411 0 obj<>/XObject<<>>>>/Annots 947 0 R>>endobj 1412 0 obj<>stream xUQo0~W#ŵ@XU= 2o!$PjfEcke'Sev5eQG{1t3>#5rXYy^\اom%hS[1=ř%BUY@ހQȴ^t;NQe8 r0串vv}sK*,@_K{7n vQno~S@x+zѡ` Jf;+(̞E0XX?FG]@]FXihhU uPuLWj }]'[Y2"#O+Vsn!ZmQx)R'_ׇ;ad!)QY=ViT LZQSն{1Bz[OoamE?˲E{`EL0~?؋EGqiDУte>endstream endobj 1413 0 obj<>/XObject<>>>/Annots 956 0 R>>endobj 1414 0 obj<>stream xTr0+h&EXr! ^a-:d~}WM줓0Yv}:9FecJͱvjBc>,>m5+q`2 mif7J\kY+urm'13kFo7F!hn9mPȥTZia.&h~uv8UU}Y/ S|aحbK Wgr>o֛}޲pePSK#%k JX.+pmغvP m{zYE@pJ1*Fm#R*J%^vpx({?VT,3ț\ah2>MytVendstream endobj 1415 0 obj<>/XObject<<>>>>/Annots 977 0 R>>endobj 1416 0 obj<>stream xVn8}ẈVn&(F}1`p!)%u3[6&$̙9(?!3(QׇQ~iϠ(V Ga4%;7F:Yc?8F0RyoR|4vZ6$h"j0H,Cx6 j; 7s7YdzQ\:du#kⲴz  r0f~PT常d %CD$1d=0hx(ҭf3F!t`aB|lF=2Q/˫a{x!q7n`W-W;{pw\?kRe+ˤy@^*YC QmAm`d jc!aoY^A7-lVתd䂶JZYm3;ipxJ-D~}WU;J/Nj9  jL NSR5;- d((1^3ApO#>ʫvlˁvpy ە'yr\^`W 㖪ţN3Xn a4B,0R%dISz/BjI)] Iml6:|Ȩ??†3c1'jEűX:JP-SpH fհa*^_R痆O>۳6tϑ\mg'Ύ)` oU. _ dVhD˫hWm|L>OYʊ BXNQ堉!a^m{ߋ2|dř1!{f|ҨHQW]'obUL p^}7h'(Kj:8OC12]נo6]c\" @3Qt'%hlxӤbΰtʆ+?Aj0e"g1W1g%uendstream endobj 1417 0 obj<>/XObject<<>>>>/Annots 996 0 R>>endobj 1418 0 obj<>stream xVQs6~Wۑd ޸dL[I6~lcI6"߷߮h_F3SI& iN3*cY|ɉ͘7Wd8;yMZ )CDpu:jW'$YInձ#U\VA]u,YjW~ |CQ OjG+F:|L29u_IU*^ܬ؞/{OUvVő.7 eJrs湂+e^6 :sx\`Pn,`iϋ8=c z/h'S>H$ī+%9^7rKbȎsKWKNeћ)Y7#(Df|6ܵ>j1^/^F?g%5! gj f7ez`endstream endobj 1419 0 obj<>/XObject<<>>>>/Annots 1017 0 R>>endobj 1420 0 obj<>stream xVn0+,E-M렇&]S]$;*,ʡڜN4 `h8ޣt;b?/9+׋bۅ m pǎk Zoj%^lSE/c:Y*zV"o0zmfcFM樳^>z|lԙ2.â0]xCQwaF[ ) L `N=ԃEJsv`h c]cAƺ!-x^J%00B%U}-Z"\ֹ̖͊e Ҽ8GO6mQ(aM2jm[}8~Z=aAwW)\^>˅~86G3>|,Bꏟ{ݏ:?9fՋb[^화~6~m9rX%-3UK&+NrM \>.R۪4"U^joM.0ߺjFE4|z/Z1PfMX8V/'Vr1jkYY2,bE%ߔoXyaGW4I0,hxHEV\l~4ywg 1߲qyԕ]<">MDŽoϲgn`'˻>/XObject<<>>>>/Annots 1036 0 R>>endobj 1422 0 obj<>stream xVM6+Ԃ37CCN!E [6E$Y$3S&3UVw?u߽|4 i<$/ן^0 &7‰e iMJHc|tYҍ"vn[#vtǞo]k9 kokuànT:R<O7t;+au:/4"BH M'%")( 0#3q@Gqn C rq0G:/2ғ:%phD) t[6L(@ȍl^2iƏ7 w"V{acY Q9L*;-b{69 a&]jf@OBR t* m>Fk"+Ǧ+Y+k"%%ť^"2/41fl3H -maÕOFyX9$0h{-lL~mϐ="H #WjHoN}seW\roHнd[u7)pd.G"X#vv.b$O\DSNP5ȰmmH2'XL+2߁?(*U=( ) VJ6J^t ďpOp98KXlY%X` ⺵g^\7M8ՔmWFen 7@4saęwBE:iE Ɇ2..I. DlG>)Iu()YP]7̖oÛ8ȡ|a{M;^YY4n nnnYљ_?=}+ڈ+ţ_ #jtݢ>dUuׯ͊Ѳ!r0yQ<xM2z{h] eE2a0s{6Ǒhyi"Dj} c.endstream endobj 1423 0 obj<>/XObject<<>>>>/Annots 1049 0 R>>endobj 1424 0 obj<>stream xTM0W̑6!UUՒVB&1I$ Uwl6BB hy"@䁿\ŕ׵EB Dž<࿉XxaaN $!N0F0q6TDAV5d׋L$ xHQ|E8(I| ׅ,Bzgr >uǠ[9- {qɞLC.GRY1{zu z#冉C3o&Q*[km{ }+4<=+ AKPI둚Y=AN;1`u_1ρ xa;&3@G k<:*v~CyۊvE6*=*΀Yj:?;,T iW[{@K@[SQYHg س`)R8/&LeZjIIK=W6վgʝ(bNҺӨヅ/g{iMZ~Z3 $^G Q6 MT6guS(pE/?nőY_?+endstream endobj 1425 0 obj<>/XObject<>>>/Annots 1052 0 R>>endobj 1426 0 obj<>stream xTMs0+ޑ ApsRBs(M{cȖ#}dCZv[}[/?LC&7><Sd Q3>Ix! QׯoK?%F3woֽv:4`&1 1cHsWه4/`<*A^*X Yߥ?zXDB[nO&Q_L9;E0 '$YeZ#ϙxyeӌphy n܁;Eggp `U5% 5\V z":p~aL=DX+AfށIaJ),'rw1"?AL@ˌ8YՖK~PTDGm}Se=>/XObject<<>>>>>>endobj 1428 0 obj<>stream xUn@}+F ki%>TqՇBzۮwzMB{g$mU3;93QhBM赠נ3&3=w ~4%8x)c`a<ЀZ(#x\$4K1ywyROVO%luCsʂcŬ "K 0DR2AB,Sr,1R6wT({GT* 7䖒ݠTqw :VH SV*2S f4N-ٌ*6LeGX t^uZ&v⣉QY{F3-u8|G=[|R83dHFGݝc]Mr JA֩x38RHnYF\LmjC<#A 0Dީ#4 iB۾?Jd˪sBDV%{G,ivR.__N`E9{kqK# sr **sE)5y5BU]?RͿZPS1Wsx!ip!4YYEoDR&bo~3NUdpWo<n]\@=gmd>oN gLw@kۄZ1X/=*tO6L\Pz>REҕ_XN-endstream endobj 1429 0 obj<>/XObject<<>>>>>>endobj 1430 0 obj<>stream xTr0;`b D3I&N䋐(%*R:J!3fى`ΐ rkiB]9:.(l tJf1d;?ϯ3+!i^Ϟ;C1)t4YpNI {hJ@XI 5Pj5vBIP(n%~qXjIKP[{RɐjM-sއR| S3 WJW΅U+}nf ࡚dP*\]jE FM`aG5 ir*Ѵvg귄bI+nq%m68]PoW[s6% ܫnٿֿx')8V\ɼEm\sAy+DJb(aIE <ۻr'0MhǫJXS#Ѣж#q9'퉸(`UT^7MH# G휵Ҍ=ZE^] Xf vJ|p TRmm 5а32B񍣄LԲ.'--a$$N&ÙW1*-ɡFQ.]$&4 -m ޜԅendstream endobj 1431 0 obj<>/XObject<>>>>>endobj 1432 0 obj<>stream x]TMs0W`-&39dL8"$jA$9ݕ% 3}oGQ?,k-@fYj7j5eSz?yZ,3L&kְAX| s,^a#s6bCAIwnȉ3[63LL Zx$UQzV E y. mTm8@h.icR*w)m{ >/XObject<<>>>>/Annots 1061 0 R>>endobj 1434 0 obj<>stream xWnF}WKi]-oN}pcEM]ew)EY^,3ESܝ9g_Φ4)f4:$u6ϒ ͖dA.SIg2b|?|pTNS-O _'v= tq9^^]&sZg1 z=m3R*^ :K#՞:‰MɕÖrXW;2%o=fT`go֟&t>#u6jP̑؏p<)#/.G66FQr QN=Ug |FwD)JTbLlGIR*ड TiSQZr)*VqP-um6^8 AlL:v]Қ}uS8 ůF%8uP<Uޫ1 sq & ,j% F: VLjAYۛa#^ץǎTqF@8D=9%ǔ _B$U+%h QуGj1~4P,ހ6Ϡ>IZ˳Kh h@SVfg!#m(SA[`逻hv>6[Є!qET44Pڹ-l݁]k$(۳BJ?w AEc}@Щۦ ESei( կo1LIC leR#h#U!J!}%P"!>n3GmӛxCTd"``2uFBE7'E2,v$Ik|+cz8F 0:pO_! ,{6Tµ0Šh^܋gTLWcF AH-'n42 !*##ZBkP~(JgK艠=VhEy ѴA~][v&="sR\b[fL)Z#-~Gc}q8s+FgTDB~.z@dh rn9$5bx&kQJʭ^t]o)[}qwIYJo:,Řlz j(k9 _E<=e5`!d#J@jw4iGOwW?oO^Cnn|94U}XƢFλ82m{tz]#e,8N\dɵԱVֶ1e(C3Ų5Q>}!2lXOaj-\8{ϪU%ĸr?HMB߃2*%j,p|5n1PӽX ٟgV7Bendstream endobj 1435 0 obj<>/XObject<<>>>>/Annots 1078 0 R>>endobj 1436 0 obj<>stream xVMs6WQH4$RiI벧(HHDB A%[e{2V5owm9xr̛,{>) /vџ&!)#;{Њnx;q );; r0ˑZa{1n E nwvATitHޮAaq&ik7_2HW 4H_. ʶ bQVXX}ۋ~.b5}TV6;ޫэ,Vc~[Յ3|>Mf7t^]Tz#WW{s}6i8pʐ9n}lU-j3 F mIwԖr]n -INDhcօ4el9V-E[f5ɖYlOc8|ɂcΘD^TՅN-vlB>/XObject<<>>>>>>endobj 1438 0 obj<>stream x}VMs6WљIevԇ6@ Do$z-]-h/vMmw5/8~>?ni݁yqw!|tsN;yT!8O_k߫dy[,7Yogb^,oZ >جڮVŸ08ΙWFsRlJ\Gȶ:h qȹJ9"/R9iK_ش tpƸE#>. RXJm@NB\;)3Bҩ@šʃhMDFy3|%nS]`FXQ5N5Åkiku O}|m+RM{g4I IxE)|-'KH.q؍RsU 5-F,5GqE\,lrrޔ^>9D{` `-"q#8$ RrVM VI3dW"ğ; :D-_U@Q(IIb(C/(CTMAJFƭGv6`ʔLaJꃖ2&I\8_Ջ,;q^KyըV3t60+It])iڬS_*罰 ğ`Ew; >"LH6k~:Vgm'__k6={E>V1ymӌiQkt(#webwsmrFg 1QߏFKR'clRAW`f}3FGZu!I9ȼQVf9ɡ.K 3KJ\@59!:3a$F 8Pi( F178BxA =)x:bCbI~ܬ}o! Xz.(>r.o9G!w 1QXtzQxڈ=zYA=~"uZX&i2c;iAGL+3춪 OۺSr֝=@qݽ M?MtMsx3J6u*sOeH eb] 1M,c,m 6id;:B -cC]$_?G=wy ]O}ʛe}zbwsXXLyItbh-.{ M68ቖ7ङ`GlX=?n$^\'byWlW,=)G_oƅ]s?g4tendstream endobj 1439 0 obj<>/XObject<>>>>>endobj 1440 0 obj<>stream xuUMo6W؊o6Ebf`AIV"~Σd9V #gmQߌ Znh&oH /OɚVbuO~?L$EV, ׻M/PƚԴ v3r8p䮺8[Nn( <.񬰒tު˒!P)O"Ԟ*kB<4ϖ`~(-({SňաDڔEܸOu8wQl[YC9cG%:DJ`HU袰t2nv҂eLf/(VQ/(p֕ R%ɷ FS\h"Ys.m-ږ7 *T\rrL#5Ou.ٮ8"YtzQU7u放YU)l+ )S3J#[K>>o_lU~3n'zzi֋$2(a-g6!AaWmk,or/R..]_?+FȘ´W*t!ew w.z~?ZGskDcojC|a 1}'3v]L[Bn6BS1>Nq:BC1)^pW4t1.5L~.Kƒ`maq6~pv!O#ʯ@Xx0Ά68؅ (AO;onҠU1ggǗT2lz˄x6Tǧ>n.3[k ψ Πo!ڴf?[$-/XE8o|QZVໃycV(em.#(nn/,٭6<(οdRہ6su&}{W*nvݯy endstream endobj 1441 0 obj<>/XObject<<>>>>/Annots 1091 0 R>>endobj 1442 0 obj<>stream xUn0+1}- m90hUȢKRIۯ )۲tACrޛqug>fy|HRE Y2ZϦ6F9&QRH% [(AK3W ڛH,istLs h"ؓ=" ,4,rڔ2@b71 6fdMy^lm [ƾ$XmK|(+/o4J;}Q~]&a yF, tn2H?ވF(X}eZC×;D,tC,.^` YfrCxYzV_9tz2`1$dAAi5TJE F8씬R\[TdoxSFj,]J@1 .JÇGY Qo c(%̠z םXϢv3endstream endobj 1443 0 obj<>/XObject<<>>>>/Annots 1112 0 R>>endobj 1444 0 obj<>stream xUK8 Wjvgbuo$*l)dο_RJlNФ>JWq)d[hU2]9K r Ksx|a*m/MƣhZ*!h㤄}Qm~Q@ǽ5H<w:8$´1+]uopΟj'b%i^ьr ~AGwnFz eoA>p>/XObject<<>>>>/Annots 1131 0 R>>endobj 1446 0 obj<>stream xVn6}ẈP.-ڮ %VKZ!ݽ$9@̜RsaAd1$M2qsȂ Ht$GFo_y=4"A@N8r Ar:{" x=4&A@N^$|dzhcSVeHxg.vEü<.Ͱ 7 bc>KRw,>3Cx!8-|7n1g$+7P'x@Сl9V@YBYm3 ATBCE `$sfpLC#h1Wk@/[a+yR <Z}W a%xxe2m5p&lh+ZqZULk2]*>fqK5k52gV%PCnMvʵB:_`wRX ;\@ыJы~ iĶ,>vVf@XX+0Jv=g%HC$[B|I-Ϗ dqyx c$ YaREB-[O G8zQ=mg߹OĎlKǗF%${_J\z;͎3aJJo2%Ԥj\d$Uul,/ŗ{%S<˯or8rkjnu |/O޸J7\s._+3A٪4 i _Y?Q?_'1~ O (f#U pC[3D$@qysSZ u4L1Q1Իy_PpaR@NXaq; uvR?L"|'~(ȍ[YgT[/V1nNUJ "GRXoS@GqpXD 8* jцI$*O gN>/XObject<<>>>>>>endobj 1448 0 obj<>stream x=0>ō8P[A ur0} `*L|{A/%`bZ!Pٖb RjHx'PUѺx_`>endobj 1450 0 obj<>endobj 1451 0 obj<>endobj 1452 0 obj<>endobj 1453 0 obj<>endobj 1454 0 obj<>endobj 1455 0 obj<>endobj 1456 0 obj<>endobj 1457 0 obj<>endobj 1458 0 obj<>endobj 1459 0 obj<>endobj 1460 0 obj<>endobj 1461 0 obj<>endobj 1462 0 obj<>endobj 1463 0 obj<>endobj 1464 0 obj<>endobj 1465 0 obj<>endobj 1466 0 obj<>endobj 1467 0 obj<>endobj 1468 0 obj<>endobj 1469 0 obj<>endobj 1470 0 obj<>endobj 1471 0 obj<>endobj 1472 0 obj<>endobj 1473 0 obj<>endobj 1474 0 obj<>endobj 1475 0 obj<>endobj 1476 0 obj<>endobj 1477 0 obj<>endobj 1478 0 obj<>endobj 1479 0 obj<>endobj 1480 0 obj<>endobj 1481 0 obj<>endobj 1482 0 obj<>endobj 1483 0 obj<>endobj 1484 0 obj<>endobj 1485 0 obj<>endobj 1486 0 obj<>endobj 1487 0 obj<>endobj 1488 0 obj<>endobj 1489 0 obj<>endobj 1490 0 obj<>endobj 1491 0 obj<>endobj 1492 0 obj<>endobj 1493 0 obj<>endobj 1494 0 obj<>endobj 1495 0 obj<>endobj 1496 0 obj<>endobj 1497 0 obj<>endobj 1498 0 obj<>endobj 1499 0 obj<>endobj 1500 0 obj<>endobj 1501 0 obj<>endobj 1502 0 obj<>endobj 1503 0 obj<>endobj 1504 0 obj<>endobj 1505 0 obj<>endobj 1506 0 obj<>endobj 1507 0 obj<>endobj 1508 0 obj<>1<>4<>9<>21<>34<>49<>54<>79<>91<>94<>97<>]>>>>endobj xref 0 1509 0000000000 65535 f 0000000015 00000 n 0000000371 00000 n 0000001723 00000 n 0000046348 00000 n 0000046528 00000 n 0000047567 00000 n 0000096922 00000 n 0000097107 00000 n 0000098146 00000 n 0000141413 00000 n 0000141604 00000 n 0000142644 00000 n 0000187522 00000 n 0000187710 00000 n 0000188750 00000 n 0000232333 00000 n 0000232520 00000 n 0000233563 00000 n 0000277870 00000 n 0000278061 00000 n 0000279101 00000 n 0000322611 00000 n 0000322805 00000 n 0000323845 00000 n 0000358739 00000 n 0000358925 00000 n 0000359967 00000 n 0000394790 00000 n 0000394981 00000 n 0000396022 00000 n 0000426411 00000 n 0000426594 00000 n 0000427638 00000 n 0000427772 00000 n 0000427911 00000 n 0000428055 00000 n 0000428195 00000 n 0000428334 00000 n 0000428475 00000 n 0000428620 00000 n 0000428758 00000 n 0000428901 00000 n 0000429021 00000 n 0000456863 00000 n 0000483912 00000 n 0000484136 00000 n 0000484415 00000 n 0000489835 00000 n 0000491632 00000 n 0000493317 00000 n 0000493816 00000 n 0000494337 00000 n 0000494836 00000 n 0000495357 00000 n 0000495729 00000 n 0000496191 00000 n 0000496987 00000 n 0000497960 00000 n 0000498507 00000 n 0000499493 00000 n 0000500045 00000 n 0000501264 00000 n 0000501644 00000 n 0000502390 00000 n 0000694918 00000 n 0000696323 00000 n 0000700117 00000 n 0000706230 00000 n 0000707307 00000 n 0000710272 00000 n 0000711687 00000 n 0000713489 00000 n 0000714404 00000 n 0000714440 00000 n 0000714525 00000 n 0000714565 00000 n 0000714650 00000 n 0000714752 00000 n 0000714855 00000 n 0000714958 00000 n 0000715061 00000 n 0000715164 00000 n 0000715266 00000 n 0000715369 00000 n 0000715472 00000 n 0000715575 00000 n 0000715678 00000 n 0000715781 00000 n 0000715883 00000 n 0000715986 00000 n 0000716089 00000 n 0000716192 00000 n 0000716295 00000 n 0000716398 00000 n 0000716501 00000 n 0000716604 00000 n 0000716706 00000 n 0000716809 00000 n 0000716912 00000 n 0000717015 00000 n 0000717119 00000 n 0000717223 00000 n 0000717431 00000 n 0000717534 00000 n 0000717638 00000 n 0000717742 00000 n 0000717846 00000 n 0000717949 00000 n 0000718053 00000 n 0000718157 00000 n 0000718261 00000 n 0000718365 00000 n 0000718469 00000 n 0000718573 00000 n 0000718676 00000 n 0000718780 00000 n 0000718884 00000 n 0000718988 00000 n 0000719092 00000 n 0000719196 00000 n 0000719299 00000 n 0000719403 00000 n 0000719507 00000 n 0000719611 00000 n 0000719715 00000 n 0000719819 00000 n 0000719922 00000 n 0000720026 00000 n 0000720130 00000 n 0000720355 00000 n 0000720458 00000 n 0000720562 00000 n 0000720666 00000 n 0000720770 00000 n 0000720874 00000 n 0000720978 00000 n 0000721043 00000 n 0000721123 00000 n 0000721210 00000 n 0000721255 00000 n 0000721342 00000 n 0000721375 00000 n 0000721449 00000 n 0000721536 00000 n 0000721640 00000 n 0000721673 00000 n 0000721755 00000 n 0000721842 00000 n 0000721917 00000 n 0000722004 00000 n 0000722037 00000 n 0000722094 00000 n 0000722181 00000 n 0000722206 00000 n 0000722308 00000 n 0000722333 00000 n 0000722426 00000 n 0000722513 00000 n 0000722609 00000 n 0000722696 00000 n 0000722784 00000 n 0000722871 00000 n 0000722968 00000 n 0000723055 00000 n 0000723155 00000 n 0000723242 00000 n 0000723330 00000 n 0000723417 00000 n 0000723505 00000 n 0000723592 00000 n 0000723665 00000 n 0000723764 00000 n 0000723851 00000 n 0000723953 00000 n 0000724040 00000 n 0000724137 00000 n 0000724224 00000 n 0000724316 00000 n 0000724403 00000 n 0000724499 00000 n 0000724586 00000 n 0000724674 00000 n 0000724761 00000 n 0000724826 00000 n 0000724914 00000 n 0000725001 00000 n 0000725092 00000 n 0000725179 00000 n 0000725276 00000 n 0000725363 00000 n 0000725452 00000 n 0000725539 00000 n 0000725628 00000 n 0000725715 00000 n 0000725807 00000 n 0000725894 00000 n 0000725990 00000 n 0000726077 00000 n 0000726172 00000 n 0000726259 00000 n 0000726354 00000 n 0000726441 00000 n 0000726539 00000 n 0000726626 00000 n 0000726722 00000 n 0000726809 00000 n 0000726914 00000 n 0000727006 00000 n 0000727093 00000 n 0000727188 00000 n 0000727275 00000 n 0000727372 00000 n 0000727459 00000 n 0000727555 00000 n 0000727642 00000 n 0000727691 00000 n 0000727787 00000 n 0000727874 00000 n 0000727974 00000 n 0000728061 00000 n 0000728094 00000 n 0000728190 00000 n 0000728277 00000 n 0000728379 00000 n 0000728466 00000 n 0000728572 00000 n 0000728659 00000 n 0000728755 00000 n 0000728842 00000 n 0000728891 00000 n 0000728942 00000 n 0000729029 00000 n 0000729079 00000 n 0000729166 00000 n 0000729212 00000 n 0000729299 00000 n 0000729344 00000 n 0000729431 00000 n 0000729483 00000 n 0000729570 00000 n 0000729621 00000 n 0000729708 00000 n 0000729755 00000 n 0000729842 00000 n 0000729888 00000 n 0000729975 00000 n 0000730028 00000 n 0000730115 00000 n 0000730167 00000 n 0000730254 00000 n 0000730351 00000 n 0000730399 00000 n 0000730486 00000 n 0000730533 00000 n 0000730620 00000 n 0000730667 00000 n 0000730754 00000 n 0000730801 00000 n 0000730888 00000 n 0000730933 00000 n 0000731020 00000 n 0000731065 00000 n 0000731152 00000 n 0000731217 00000 n 0000731307 00000 n 0000731394 00000 n 0000731487 00000 n 0000731574 00000 n 0000731672 00000 n 0000731759 00000 n 0000731800 00000 n 0000731886 00000 n 0000731973 00000 n 0000732059 00000 n 0000732146 00000 n 0000732235 00000 n 0000732322 00000 n 0000732420 00000 n 0000732507 00000 n 0000732556 00000 n 0000732642 00000 n 0000732729 00000 n 0000732815 00000 n 0000732902 00000 n 0000732991 00000 n 0000733078 00000 n 0000733176 00000 n 0000733263 00000 n 0000733312 00000 n 0000733398 00000 n 0000733485 00000 n 0000733571 00000 n 0000733658 00000 n 0000733747 00000 n 0000733834 00000 n 0000733931 00000 n 0000734018 00000 n 0000734109 00000 n 0000734196 00000 n 0000734287 00000 n 0000734374 00000 n 0000734468 00000 n 0000734555 00000 n 0000734653 00000 n 0000734740 00000 n 0000734821 00000 n 0000734911 00000 n 0000734998 00000 n 0000735088 00000 n 0000735175 00000 n 0000735268 00000 n 0000735355 00000 n 0000735453 00000 n 0000735540 00000 n 0000735589 00000 n 0000735678 00000 n 0000735765 00000 n 0000735854 00000 n 0000735941 00000 n 0000736033 00000 n 0000736120 00000 n 0000736218 00000 n 0000736305 00000 n 0000736354 00000 n 0000736449 00000 n 0000736536 00000 n 0000736634 00000 n 0000736721 00000 n 0000736819 00000 n 0000736906 00000 n 0000736947 00000 n 0000737042 00000 n 0000737129 00000 n 0000737227 00000 n 0000737314 00000 n 0000737412 00000 n 0000737499 00000 n 0000737540 00000 n 0000737635 00000 n 0000737722 00000 n 0000737820 00000 n 0000737907 00000 n 0000738005 00000 n 0000738092 00000 n 0000738133 00000 n 0000738222 00000 n 0000738309 00000 n 0000738398 00000 n 0000738485 00000 n 0000738574 00000 n 0000738661 00000 n 0000738751 00000 n 0000738838 00000 n 0000738926 00000 n 0000739013 00000 n 0000739101 00000 n 0000739188 00000 n 0000739276 00000 n 0000739363 00000 n 0000739452 00000 n 0000739539 00000 n 0000739630 00000 n 0000739717 00000 n 0000739806 00000 n 0000739897 00000 n 0000739984 00000 n 0000740075 00000 n 0000740162 00000 n 0000740254 00000 n 0000740341 00000 n 0000740439 00000 n 0000740526 00000 n 0000740624 00000 n 0000740711 00000 n 0000740809 00000 n 0000740896 00000 n 0000740988 00000 n 0000741075 00000 n 0000741148 00000 n 0000741243 00000 n 0000741330 00000 n 0000741430 00000 n 0000741517 00000 n 0000741614 00000 n 0000741701 00000 n 0000741742 00000 n 0000741838 00000 n 0000741925 00000 n 0000742026 00000 n 0000742113 00000 n 0000742210 00000 n 0000742297 00000 n 0000742384 00000 n 0000742471 00000 n 0000742560 00000 n 0000742647 00000 n 0000742737 00000 n 0000742824 00000 n 0000742916 00000 n 0000743003 00000 n 0000743100 00000 n 0000743187 00000 n 0000743284 00000 n 0000743371 00000 n 0000743460 00000 n 0000743553 00000 n 0000743640 00000 n 0000743736 00000 n 0000743823 00000 n 0000743920 00000 n 0000744007 00000 n 0000744095 00000 n 0000744182 00000 n 0000744273 00000 n 0000744360 00000 n 0000744457 00000 n 0000744544 00000 n 0000744609 00000 n 0000744696 00000 n 0000744783 00000 n 0000744808 00000 n 0000744898 00000 n 0000744985 00000 n 0000745082 00000 n 0000745169 00000 n 0000745202 00000 n 0000745289 00000 n 0000745376 00000 n 0000745466 00000 n 0000745553 00000 n 0000745651 00000 n 0000745738 00000 n 0000745825 00000 n 0000745912 00000 n 0000746002 00000 n 0000746089 00000 n 0000746146 00000 n 0000746244 00000 n 0000746331 00000 n 0000746419 00000 n 0000746506 00000 n 0000746597 00000 n 0000746684 00000 n 0000746782 00000 n 0000746869 00000 n 0000746956 00000 n 0000747043 00000 n 0000747133 00000 n 0000747220 00000 n 0000747318 00000 n 0000747405 00000 n 0000747492 00000 n 0000747579 00000 n 0000747669 00000 n 0000747756 00000 n 0000747854 00000 n 0000747941 00000 n 0000748037 00000 n 0000748124 00000 n 0000748223 00000 n 0000748310 00000 n 0000748423 00000 n 0000748521 00000 n 0000748608 00000 n 0000748707 00000 n 0000748794 00000 n 0000748897 00000 n 0000748984 00000 n 0000749082 00000 n 0000749169 00000 n 0000749218 00000 n 0000749311 00000 n 0000749398 00000 n 0000749494 00000 n 0000749581 00000 n 0000749679 00000 n 0000749766 00000 n 0000749807 00000 n 0000749900 00000 n 0000749987 00000 n 0000750080 00000 n 0000750167 00000 n 0000750263 00000 n 0000750350 00000 n 0000750448 00000 n 0000750535 00000 n 0000750629 00000 n 0000750716 00000 n 0000750810 00000 n 0000750897 00000 n 0000750994 00000 n 0000751081 00000 n 0000751179 00000 n 0000751266 00000 n 0000751359 00000 n 0000751446 00000 n 0000751539 00000 n 0000751626 00000 n 0000751722 00000 n 0000751809 00000 n 0000751907 00000 n 0000751994 00000 n 0000752107 00000 n 0000752193 00000 n 0000752280 00000 n 0000752369 00000 n 0000752456 00000 n 0000752554 00000 n 0000752641 00000 n 0000752682 00000 n 0000752770 00000 n 0000752857 00000 n 0000752948 00000 n 0000753035 00000 n 0000753133 00000 n 0000753220 00000 n 0000753261 00000 n 0000753348 00000 n 0000753435 00000 n 0000753522 00000 n 0000753609 00000 n 0000753698 00000 n 0000753785 00000 n 0000753874 00000 n 0000753961 00000 n 0000754050 00000 n 0000754137 00000 n 0000754235 00000 n 0000754322 00000 n 0000754420 00000 n 0000754507 00000 n 0000754605 00000 n 0000754692 00000 n 0000754785 00000 n 0000754872 00000 n 0000754968 00000 n 0000755055 00000 n 0000755153 00000 n 0000755240 00000 n 0000755332 00000 n 0000755419 00000 n 0000755514 00000 n 0000755601 00000 n 0000755699 00000 n 0000755786 00000 n 0000755915 00000 n 0000756007 00000 n 0000756094 00000 n 0000756186 00000 n 0000756273 00000 n 0000756368 00000 n 0000756455 00000 n 0000756553 00000 n 0000756640 00000 n 0000756689 00000 n 0000756784 00000 n 0000756871 00000 n 0000756969 00000 n 0000757056 00000 n 0000757154 00000 n 0000757241 00000 n 0000757282 00000 n 0000757375 00000 n 0000757462 00000 n 0000757555 00000 n 0000757642 00000 n 0000757735 00000 n 0000757822 00000 n 0000757915 00000 n 0000758002 00000 n 0000758097 00000 n 0000758184 00000 n 0000758279 00000 n 0000758366 00000 n 0000758461 00000 n 0000758548 00000 n 0000758646 00000 n 0000758733 00000 n 0000758831 00000 n 0000758918 00000 n 0000759016 00000 n 0000759103 00000 n 0000759200 00000 n 0000759292 00000 n 0000759379 00000 n 0000759474 00000 n 0000759561 00000 n 0000759659 00000 n 0000759746 00000 n 0000759844 00000 n 0000759931 00000 n 0000760032 00000 n 0000760119 00000 n 0000760217 00000 n 0000760304 00000 n 0000760399 00000 n 0000760486 00000 n 0000760584 00000 n 0000760671 00000 n 0000760769 00000 n 0000760856 00000 n 0000760957 00000 n 0000761044 00000 n 0000761148 00000 n 0000761235 00000 n 0000761340 00000 n 0000761438 00000 n 0000761525 00000 n 0000761613 00000 n 0000761700 00000 n 0000761791 00000 n 0000761878 00000 n 0000761976 00000 n 0000762063 00000 n 0000762157 00000 n 0000762244 00000 n 0000762341 00000 n 0000762428 00000 n 0000762526 00000 n 0000762613 00000 n 0000762709 00000 n 0000762796 00000 n 0000762895 00000 n 0000762982 00000 n 0000763080 00000 n 0000763167 00000 n 0000763269 00000 n 0000763356 00000 n 0000763461 00000 n 0000763548 00000 n 0000763646 00000 n 0000763733 00000 n 0000763854 00000 n 0000763948 00000 n 0000764035 00000 n 0000764132 00000 n 0000764219 00000 n 0000764317 00000 n 0000764404 00000 n 0000764504 00000 n 0000764591 00000 n 0000764694 00000 n 0000764781 00000 n 0000764879 00000 n 0000764966 00000 n 0000765031 00000 n 0000765126 00000 n 0000765213 00000 n 0000765311 00000 n 0000765398 00000 n 0000765496 00000 n 0000765583 00000 n 0000765684 00000 n 0000765771 00000 n 0000765875 00000 n 0000765962 00000 n 0000766060 00000 n 0000766147 00000 n 0000766212 00000 n 0000766307 00000 n 0000766394 00000 n 0000766492 00000 n 0000766579 00000 n 0000766677 00000 n 0000766764 00000 n 0000766865 00000 n 0000766952 00000 n 0000767056 00000 n 0000767143 00000 n 0000767241 00000 n 0000767328 00000 n 0000767393 00000 n 0000767490 00000 n 0000767577 00000 n 0000767677 00000 n 0000767764 00000 n 0000767862 00000 n 0000767949 00000 n 0000768044 00000 n 0000768131 00000 n 0000768229 00000 n 0000768316 00000 n 0000768414 00000 n 0000768501 00000 n 0000768597 00000 n 0000768684 00000 n 0000768783 00000 n 0000768870 00000 n 0000768968 00000 n 0000769055 00000 n 0000769150 00000 n 0000769237 00000 n 0000769335 00000 n 0000769422 00000 n 0000769520 00000 n 0000769607 00000 n 0000769698 00000 n 0000769785 00000 n 0000769879 00000 n 0000769966 00000 n 0000770064 00000 n 0000770151 00000 n 0000770288 00000 n 0000770381 00000 n 0000770468 00000 n 0000770564 00000 n 0000770651 00000 n 0000770750 00000 n 0000770837 00000 n 0000770930 00000 n 0000771017 00000 n 0000771113 00000 n 0000771200 00000 n 0000771299 00000 n 0000771386 00000 n 0000771474 00000 n 0000771561 00000 n 0000771652 00000 n 0000771739 00000 n 0000771838 00000 n 0000771925 00000 n 0000772021 00000 n 0000772108 00000 n 0000772207 00000 n 0000772294 00000 n 0000772393 00000 n 0000772480 00000 n 0000772569 00000 n 0000772656 00000 n 0000772748 00000 n 0000772835 00000 n 0000772934 00000 n 0000773021 00000 n 0000773158 00000 n 0000773253 00000 n 0000773340 00000 n 0000773438 00000 n 0000773525 00000 n 0000773624 00000 n 0000773711 00000 n 0000773802 00000 n 0000773889 00000 n 0000773983 00000 n 0000774070 00000 n 0000774168 00000 n 0000774255 00000 n 0000774347 00000 n 0000774434 00000 n 0000774529 00000 n 0000774616 00000 n 0000774714 00000 n 0000774801 00000 n 0000774898 00000 n 0000774985 00000 n 0000775085 00000 n 0000775172 00000 n 0000775266 00000 n 0000775353 00000 n 0000775466 00000 n 0000775564 00000 n 0000775651 00000 n 0000775749 00000 n 0000775836 00000 n 0000775937 00000 n 0000776024 00000 n 0000776122 00000 n 0000776209 00000 n 0000776283 00000 n 0000776369 00000 n 0000776426 00000 n 0000776514 00000 n 0000776601 00000 n 0000776692 00000 n 0000776779 00000 n 0000776877 00000 n 0000776964 00000 n 0000777056 00000 n 0000777143 00000 n 0000777238 00000 n 0000777325 00000 n 0000777423 00000 n 0000777510 00000 n 0000777601 00000 n 0000777688 00000 n 0000777782 00000 n 0000777869 00000 n 0000777967 00000 n 0000778054 00000 n 0000778147 00000 n 0000778234 00000 n 0000778330 00000 n 0000778417 00000 n 0000778515 00000 n 0000778602 00000 n 0000778715 00000 n 0000778770 00000 n 0000778856 00000 n 0000778943 00000 n 0000779030 00000 n 0000779120 00000 n 0000779207 00000 n 0000779305 00000 n 0000779392 00000 n 0000779485 00000 n 0000779572 00000 n 0000779668 00000 n 0000779755 00000 n 0000779853 00000 n 0000779940 00000 n 0000780013 00000 n 0000780104 00000 n 0000780191 00000 n 0000780285 00000 n 0000780372 00000 n 0000780470 00000 n 0000780557 00000 n 0000780621 00000 n 0000780707 00000 n 0000780758 00000 n 0000780845 00000 n 0000780896 00000 n 0000780982 00000 n 0000781060 00000 n 0000781146 00000 n 0000781217 00000 n 0000781303 00000 n 0000781355 00000 n 0000781442 00000 n 0000781494 00000 n 0000781580 00000 n 0000781660 00000 n 0000781747 00000 n 0000781852 00000 n 0000781944 00000 n 0000782031 00000 n 0000782126 00000 n 0000782213 00000 n 0000782310 00000 n 0000782397 00000 n 0000782438 00000 n 0000782527 00000 n 0000782614 00000 n 0000782703 00000 n 0000782790 00000 n 0000782882 00000 n 0000782969 00000 n 0000783067 00000 n 0000783154 00000 n 0000783250 00000 n 0000783337 00000 n 0000783433 00000 n 0000783520 00000 n 0000783619 00000 n 0000783706 00000 n 0000783804 00000 n 0000783891 00000 n 0000783972 00000 n 0000784065 00000 n 0000784152 00000 n 0000784245 00000 n 0000784332 00000 n 0000784428 00000 n 0000784515 00000 n 0000784613 00000 n 0000784700 00000 n 0000784789 00000 n 0000784876 00000 n 0000784965 00000 n 0000785052 00000 n 0000785144 00000 n 0000785231 00000 n 0000785329 00000 n 0000785416 00000 n 0000785506 00000 n 0000785593 00000 n 0000785683 00000 n 0000785770 00000 n 0000785863 00000 n 0000785950 00000 n 0000786048 00000 n 0000786135 00000 n 0000786248 00000 n 0000786345 00000 n 0000786432 00000 n 0000786529 00000 n 0000786616 00000 n 0000786716 00000 n 0000786803 00000 n 0000786901 00000 n 0000786988 00000 n 0000787084 00000 n 0000787171 00000 n 0000787270 00000 n 0000787357 00000 n 0000787455 00000 n 0000787542 00000 n 0000787638 00000 n 0000787725 00000 n 0000787825 00000 n 0000787912 00000 n 0000788010 00000 n 0000788097 00000 n 0000788194 00000 n 0000788283 00000 n 0000788370 00000 n 0000788462 00000 n 0000788549 00000 n 0000788646 00000 n 0000788733 00000 n 0000788822 00000 n 0000788909 00000 n 0000789001 00000 n 0000789088 00000 n 0000789185 00000 n 0000789272 00000 n 0000789368 00000 n 0000789455 00000 n 0000789554 00000 n 0000789641 00000 n 0000789739 00000 n 0000789826 00000 n 0000789915 00000 n 0000790012 00000 n 0000790099 00000 n 0000790199 00000 n 0000790286 00000 n 0000790383 00000 n 0000790470 00000 n 0000790567 00000 n 0000790654 00000 n 0000790754 00000 n 0000790841 00000 n 0000790938 00000 n 0000791025 00000 n 0000791090 00000 n 0000791187 00000 n 0000791274 00000 n 0000791374 00000 n 0000791461 00000 n 0000791558 00000 n 0000791645 00000 n 0000791742 00000 n 0000791829 00000 n 0000791929 00000 n 0000792016 00000 n 0000792113 00000 n 0000792200 00000 n 0000792265 00000 n 0000792347 00000 n 0000792434 00000 n 0000792531 00000 n 0000792618 00000 n 0000792718 00000 n 0000792805 00000 n 0000792902 00000 n 0000792989 00000 n 0000793038 00000 n 0000793133 00000 n 0000793220 00000 n 0000793318 00000 n 0000793405 00000 n 0000793502 00000 n 0000793589 00000 n 0000793671 00000 n 0000793757 00000 n 0000793847 00000 n 0000793934 00000 n 0000794027 00000 n 0000794114 00000 n 0000794211 00000 n 0000794298 00000 n 0000794395 00000 n 0000794482 00000 n 0000794582 00000 n 0000794669 00000 n 0000794766 00000 n 0000794853 00000 n 0000794950 00000 n 0000795039 00000 n 0000795126 00000 n 0000795218 00000 n 0000795305 00000 n 0000795401 00000 n 0000795488 00000 n 0000795575 00000 n 0000795662 00000 n 0000795749 00000 n 0000795836 00000 n 0000795926 00000 n 0000796013 00000 n 0000796103 00000 n 0000796190 00000 n 0000796287 00000 n 0000796374 00000 n 0000796471 00000 n 0000796558 00000 n 0000796647 00000 n 0000796737 00000 n 0000796824 00000 n 0000796914 00000 n 0000797002 00000 n 0000797096 00000 n 0000797185 00000 n 0000797284 00000 n 0000797373 00000 n 0000797469 00000 n 0000797558 00000 n 0000797657 00000 n 0000797746 00000 n 0000797845 00000 n 0000797934 00000 n 0000798023 00000 n 0000798112 00000 n 0000798204 00000 n 0000798293 00000 n 0000798392 00000 n 0000798481 00000 n 0000798588 00000 n 0000798683 00000 n 0000798772 00000 n 0000798870 00000 n 0000798959 00000 n 0000799058 00000 n 0000799147 00000 n 0000799242 00000 n 0000799331 00000 n 0000799429 00000 n 0000799518 00000 n 0000799616 00000 n 0000799705 00000 n 0000799807 00000 n 0000799896 00000 n 0000800001 00000 n 0000800090 00000 n 0000800189 00000 n 0000800278 00000 n 0000800377 00000 n 0000800470 00000 n 0000800559 00000 n 0000800655 00000 n 0000800744 00000 n 0000800842 00000 n 0000800931 00000 n 0000801027 00000 n 0000801116 00000 n 0000801215 00000 n 0000801304 00000 n 0000801403 00000 n 0000801492 00000 n 0000801564 00000 n 0000801648 00000 n 0000801736 00000 n 0000801763 00000 n 0000801864 00000 n 0000801953 00000 n 0000802057 00000 n 0000802146 00000 n 0000802245 00000 n 0000802334 00000 n 0000802432 00000 n 0000802521 00000 n 0000802575 00000 n 0000802676 00000 n 0000802765 00000 n 0000802864 00000 n 0000802953 00000 n 0000803054 00000 n 0000803143 00000 n 0000803247 00000 n 0000803336 00000 n 0000803435 00000 n 0000803524 00000 n 0000803619 00000 n 0000803708 00000 n 0000803806 00000 n 0000803895 00000 n 0000803994 00000 n 0000804083 00000 n 0000804173 00000 n 0000804270 00000 n 0000804359 00000 n 0000804459 00000 n 0000804548 00000 n 0000804642 00000 n 0000804731 00000 n 0000804828 00000 n 0000804917 00000 n 0000805019 00000 n 0000805108 00000 n 0000805213 00000 n 0000805302 00000 n 0000805374 00000 n 0000805471 00000 n 0000805560 00000 n 0000805660 00000 n 0000805749 00000 n 0000805846 00000 n 0000805935 00000 n 0000806035 00000 n 0000806124 00000 n 0000806226 00000 n 0000806315 00000 n 0000806420 00000 n 0000806509 00000 n 0000806610 00000 n 0000806699 00000 n 0000806803 00000 n 0000806892 00000 n 0000806992 00000 n 0000807081 00000 n 0000807184 00000 n 0000807273 00000 n 0000807381 00000 n 0000807476 00000 n 0000807565 00000 n 0000807662 00000 n 0000807751 00000 n 0000807846 00000 n 0000807935 00000 n 0000808030 00000 n 0000808119 00000 n 0000808214 00000 n 0000808303 00000 n 0000808401 00000 n 0000808490 00000 n 0000808588 00000 n 0000808677 00000 n 0000808775 00000 n 0000808864 00000 n 0000808962 00000 n 0000809051 00000 n 0000809150 00000 n 0000809186 00000 n 0000809222 00000 n 0000811137 00000 n 0000811182 00000 n 0000811227 00000 n 0000811272 00000 n 0000811317 00000 n 0000811362 00000 n 0000811407 00000 n 0000811452 00000 n 0000811497 00000 n 0000811542 00000 n 0000811587 00000 n 0000811632 00000 n 0000811677 00000 n 0000811722 00000 n 0000811767 00000 n 0000811812 00000 n 0000811857 00000 n 0000811902 00000 n 0000811947 00000 n 0000811992 00000 n 0000812037 00000 n 0000812082 00000 n 0000812127 00000 n 0000812172 00000 n 0000812217 00000 n 0000812262 00000 n 0000812307 00000 n 0000812352 00000 n 0000812397 00000 n 0000812442 00000 n 0000812487 00000 n 0000812532 00000 n 0000812577 00000 n 0000812622 00000 n 0000812667 00000 n 0000812712 00000 n 0000812757 00000 n 0000812802 00000 n 0000812847 00000 n 0000812892 00000 n 0000812937 00000 n 0000812982 00000 n 0000813027 00000 n 0000813072 00000 n 0000813117 00000 n 0000813162 00000 n 0000813207 00000 n 0000813252 00000 n 0000813297 00000 n 0000813342 00000 n 0000813387 00000 n 0000813432 00000 n 0000813477 00000 n 0000813522 00000 n 0000813567 00000 n 0000813612 00000 n 0000813657 00000 n 0000813702 00000 n 0000813747 00000 n 0000813792 00000 n 0000813837 00000 n 0000813882 00000 n 0000813927 00000 n 0000813972 00000 n 0000814017 00000 n 0000814062 00000 n 0000814107 00000 n 0000814152 00000 n 0000814197 00000 n 0000814242 00000 n 0000814287 00000 n 0000814332 00000 n 0000814377 00000 n 0000814422 00000 n 0000814467 00000 n 0000814512 00000 n 0000814557 00000 n 0000814602 00000 n 0000814647 00000 n 0000814692 00000 n 0000814737 00000 n 0000814782 00000 n 0000814827 00000 n 0000814872 00000 n 0000814917 00000 n 0000814962 00000 n 0000815007 00000 n 0000815052 00000 n 0000815097 00000 n 0000815142 00000 n 0000815187 00000 n 0000815232 00000 n 0000815277 00000 n 0000815322 00000 n 0000815367 00000 n 0000815412 00000 n 0000815457 00000 n 0000815502 00000 n 0000815547 00000 n 0000815592 00000 n 0000815637 00000 n 0000815682 00000 n 0000815727 00000 n 0000815772 00000 n 0000815817 00000 n 0000815862 00000 n 0000815907 00000 n 0000815952 00000 n 0000816928 00000 n 0000817131 00000 n 0000817413 00000 n 0000817609 00000 n 0000819771 00000 n 0000819967 00000 n 0000822130 00000 n 0000822326 00000 n 0000823017 00000 n 0000823188 00000 n 0000824556 00000 n 0000824758 00000 n 0000826381 00000 n 0000826604 00000 n 0000827544 00000 n 0000827736 00000 n 0000828808 00000 n 0000828980 00000 n 0000829519 00000 n 0000829736 00000 n 0000831368 00000 n 0000831539 00000 n 0000833397 00000 n 0000833603 00000 n 0000835614 00000 n 0000835831 00000 n 0000837413 00000 n 0000837640 00000 n 0000838943 00000 n 0000839170 00000 n 0000840307 00000 n 0000840509 00000 n 0000841830 00000 n 0000842011 00000 n 0000843199 00000 n 0000843390 00000 n 0000844736 00000 n 0000844938 00000 n 0000846295 00000 n 0000846497 00000 n 0000847591 00000 n 0000847772 00000 n 0000848471 00000 n 0000848663 00000 n 0000850078 00000 n 0000850259 00000 n 0000851773 00000 n 0000851975 00000 n 0000853621 00000 n 0000853837 00000 n 0000855180 00000 n 0000855406 00000 n 0000856614 00000 n 0000856820 00000 n 0000857824 00000 n 0000858062 00000 n 0000859088 00000 n 0000859326 00000 n 0000860579 00000 n 0000860807 00000 n 0000861788 00000 n 0000861991 00000 n 0000863223 00000 n 0000863409 00000 n 0000864502 00000 n 0000864708 00000 n 0000865820 00000 n 0000866016 00000 n 0000866557 00000 n 0000866773 00000 n 0000868290 00000 n 0000868496 00000 n 0000869825 00000 n 0000870051 00000 n 0000871373 00000 n 0000871589 00000 n 0000872591 00000 n 0000872797 00000 n 0000873980 00000 n 0000874203 00000 n 0000874920 00000 n 0000875123 00000 n 0000875885 00000 n 0000876134 00000 n 0000877069 00000 n 0000877307 00000 n 0000878153 00000 n 0000878334 00000 n 0000879186 00000 n 0000879424 00000 n 0000880357 00000 n 0000880570 00000 n 0000881037 00000 n 0000881259 00000 n 0000883459 00000 n 0000883665 00000 n 0000884661 00000 n 0000884857 00000 n 0000885435 00000 n 0000885651 00000 n 0000886707 00000 n 0000886913 00000 n 0000887893 00000 n 0000888109 00000 n 0000888946 00000 n 0000889162 00000 n 0000890106 00000 n 0000890302 00000 n 0000890715 00000 n 0000890942 00000 n 0000892088 00000 n 0000892294 00000 n 0000893328 00000 n 0000893567 00000 n 0000894377 00000 n 0000894583 00000 n 0000896071 00000 n 0000896277 00000 n 0000897402 00000 n 0000897615 00000 n 0000898400 00000 n 0000898648 00000 n 0000899560 00000 n 0000899766 00000 n 0000901011 00000 n 0000901217 00000 n 0000902286 00000 n 0000902502 00000 n 0000903658 00000 n 0000903874 00000 n 0000904843 00000 n 0000905039 00000 n 0000905835 00000 n 0000906041 00000 n 0000907117 00000 n 0000907303 00000 n 0000908324 00000 n 0000908510 00000 n 0000909431 00000 n 0000909617 00000 n 0000910464 00000 n 0000910650 00000 n 0000911545 00000 n 0000911731 00000 n 0000912581 00000 n 0000912767 00000 n 0000913711 00000 n 0000913897 00000 n 0000914972 00000 n 0000915168 00000 n 0000916274 00000 n 0000916480 00000 n 0000917711 00000 n 0000917927 00000 n 0000919121 00000 n 0000919327 00000 n 0000921190 00000 n 0000921386 00000 n 0000922232 00000 n 0000922438 00000 n 0000923549 00000 n 0000923745 00000 n 0000924837 00000 n 0000925033 00000 n 0000926429 00000 n 0000926645 00000 n 0000927751 00000 n 0000927989 00000 n 0000928753 00000 n 0000928959 00000 n 0000929816 00000 n 0000930054 00000 n 0000930886 00000 n 0000931092 00000 n 0000932182 00000 n 0000932408 00000 n 0000933584 00000 n 0000933791 00000 n 0000934734 00000 n 0000934942 00000 n 0000936057 00000 n 0000936264 00000 n 0000936937 00000 n 0000937166 00000 n 0000937949 00000 n 0000938140 00000 n 0000939009 00000 n 0000939201 00000 n 0000939993 00000 n 0000940206 00000 n 0000940958 00000 n 0000941175 00000 n 0000942752 00000 n 0000942949 00000 n 0000943906 00000 n 0000944087 00000 n 0000945480 00000 n 0000945683 00000 n 0000946689 00000 n 0000946886 00000 n 0000947751 00000 n 0000947948 00000 n 0000948848 00000 n 0000949045 00000 n 0000950115 00000 n 0000950276 00000 n 0000950505 00000 n 0000950564 00000 n 0000950667 00000 n 0000950821 00000 n 0000950944 00000 n 0000951054 00000 n 0000951176 00000 n 0000951289 00000 n 0000951472 00000 n 0000951619 00000 n 0000951731 00000 n 0000951855 00000 n 0000951970 00000 n 0000952079 00000 n 0000952250 00000 n 0000952379 00000 n 0000952486 00000 n 0000952607 00000 n 0000952722 00000 n 0000952845 00000 n 0000952969 00000 n 0000953076 00000 n 0000953252 00000 n 0000953374 00000 n 0000953498 00000 n 0000953616 00000 n 0000953739 00000 n 0000953852 00000 n 0000954022 00000 n 0000954151 00000 n 0000954247 00000 n 0000954342 00000 n 0000954510 00000 n 0000954646 00000 n 0000954750 00000 n 0000954868 00000 n 0000954997 00000 n 0000955144 00000 n 0000955282 00000 n 0000955441 00000 n 0000955575 00000 n 0000955686 00000 n 0000955809 00000 n 0000955968 00000 n 0000956064 00000 n 0000956239 00000 n 0000956362 00000 n 0000956465 00000 n 0000956601 00000 n 0000956717 00000 n 0000956821 00000 n 0000956975 00000 n 0000957098 00000 n 0000957200 00000 n 0000957340 00000 n 0000957463 00000 n 0000957573 00000 n 0000957699 00000 n 0000957821 00000 n 0000957944 00000 n trailer <]>> startxref 958347 %%EOF ga-5-4/doc/armci/0000755000175000017500000000000012662210475011675 5ustar mbambaga-5-4/doc/armci/www/0000755000175000017500000000000012662210474012520 5ustar mbambaga-5-4/doc/armci/www/armci_doc.htm0000644000175000017500000025062112662210474015160 0ustar mbamba ARMCI - Aggregate Remote Memory Copy Interface
Initialization & Termination
Put/Get (vector)
PutGet (strided)
Put/Get (contiguous)
Accumulate (vector)
Accumulate (strided)
Accumulate (contig.)
Register Ops
Fence / Wait / Barrier
Aggregation
Atomic / Sync
Memory Mgmt.
Collective Ops
Configuration Info

ARMCI - Programming Interfaces

ARMCI programming interfaces are explained below. This is an up-to-date document that containing all the supporting ARMCI APIs. There is also a document describing the ARMCI design (API corresponding to release 1.0 only) is available in the  PDF  format.

Header file
The interfaces are prototyped in the "armci.h" header file.
 

1 Initialization and Termination

int ARMCI_Init()
PURPOSE:     Initializes the ARMCI. This function must be called before any ARMCI functions.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Finalize()
PURPOSE:     Finalizes the ARMCI. This function must be called after using ARMCI functions.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

void ARMCI_Cleanup()
PURPOSE: Releases any system resources (like System V shmem ids) that
ARMCI can be holding. It is intended to be used before terminating a program
(e.g., by calling MPI_Abort) in case of an error.

void ARMCI_Error(char *message, int code)
Purpose: Combines the functionality of ARMCI_Cleanup and MPI_Abort, and it prints (to the stdout and stderr) a user specified message followed by an integer code.
ARGUMENTS:   
message           - Message to print out
code              - Error code

2 Copy operations using the generalized I/O vector format

int ARMCI_PutV(armci_giov_t *dsrc_arr, int arr_len, int proc)
PURPOSE: Generalized  I/O vector operation that transfers data from the local memory of calling process (source) to the memory of a remote process (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;
ARGUMENTS:
       dsrc_arr - Array of data (type of armci_giov_t) to be put to remote process.
       arr_len  - Number of elements in the dsrc_arr.
       proc     - Remote process ID (destination).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbPutV(armci_giov_t *dsrc_arr,int arr_len,int proc,armci_hdl_t* handle)
PURPOSE: Generalized Non-Blocking I/O vector operation that transfers data from the local memory of the calling process (source) to the memory of a remote process (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;
ARGUMENTS:
       dsrc_arr - Array of data (type of armci_giov_t) to be put to remote process.
       arr_len  - Number of elements in the dsrc_arr.
       proc     - Remote process ID (destination).
       handle   - Pointer to a desciptor associated with a particular non-blocking transfer. 
                  Passing of a NULL value for this arg makes this function do an implicit 
                  handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_GetV(armci_giov_t *dsrc_arr,int arr_len,int proc)
 PURPOSE: Generalized  I/O vector blocking operation that transfers data from the remote process memory (source) to the calling process local memory (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;
ARGUMENTS:
       dsrc_arr - Array of data (type of armci_giov_t) to get from remote process.
       arr_len  - Number of elements in the dsrc_arr.
       proc     - Remote process ID (source).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbGetV(armci_giov_t *dsrc_arr,int arr_len,int proc,armci_hdl_t* handle)
PURPOSE: Generalized Non-blocking I/O vector operation that transfers data from the remote process memory (source) to the callingprocess local memory (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;
ARGUMENTS:

       dsrc_arr - Array of data (type of armci_giov_t) to get from remote process.
       arr_len  - Number of elements in the dsrc_arr.
       proc     - Remote process ID (source).
       handle   - Pointer to a desciptor associated with a particular non-blocking transfer. 
                  Passing of a NULL value for this arg makes this function do an implicit 
                  handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).
_____________________________________________________________________________

3 Copy operations using the strided format


int ARMCI_PutS(void* src_ptr, int src_stride_ar[], void* dst_ptr, int dst_stride_ar[],
               int count[], int stride_levels, int proc)
PURPOSE: Blocking strided  operation that transfers data from the local memory of calling process (source) to the memory of a remote process (destination).
ARGUMENTS:
       src_ptr        - Source starting address of the data block to put.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to put data.
       dst_stride_ar  - Destination array of stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (destination).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbPutS(void* src_ptr, int src_stride_ar[], void* dst_ptr, int dst_stride_ar[],
                 int count[], int stride_levels, int proc,armci_hdl_t* handle)
PURPOSE: Non-blocking strided  operation that transfer data from the local memory of calling process (source) to the memory of a remote process (destination).
ARGUMENTS:
       src_ptr        - Source starting address of the data block to put.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to put data.
       dst_stride_ar  - Destination array of stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (destination).
       handle         - Pointer to a desciptor associated with a particular non-blocking transfer. 
                        Passing of a NULL value for this arg makes this function do an implicit 
                        handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_GetS(void *src_ptr c_ptr, int src_stride_ar[], void* dst_ptr,
               int dst_stride_ar[], int count[], int stride_levels, int proc)
PURPOSE: Blocking strided operation that transfers data from the remote process memory (source) to the calling process  local memory (destination).
ARGUMENTS:
src_ptr        - Source starting address of the data block to get.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to get data.
       dst_stride_arr - Destination array of stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (source).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbGetS(void *src_ptr c_ptr, int src_stride_ar[], void* dst_ptr, int dst_stride_ar[],
                 int count[], int stride_levels, int proc, armci_hdl_t* handle)
PURPOSE: Non-blocking strided operation that transfers data from the remote process memory (source) to the calling process  local memory (destination).
     ARGUMENTS:
src_ptr        - Source starting address of the data block to get.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to get data.
       dst_stride_arr - Destination array of stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (source).
       handle         - Pointer to a desciptor associated with a particular non-blocking transfer. 
                        Passing of a NULL value for this arg makes this function do an implicit 
                        handle non-blocking transfer.
RETURN VALUE:
zero        - Successful.
       other value - Error code (described in the release notes).
_____________________________________________________________________________

4 Copy operations for contiguous data

int ARMCI_Put(void* src, void* dst, int bytes, int proc)
PURPOSE: Blocking transfer of contiguous data from the local process  memory (source) to remote process memory (destination).
ARGUMENTS:
       src     - Source starting address of the data block to put.
       dst     - Destination starting address to put data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbPut(void* src, void* dst, int bytes, int proc, armci_hdl_t* handle)
PURPOSE: Non-blocking transfer of contiguous data from the local process  memory (source) to remote process memory (destination).
ARGUMENTS:
       src     - Source starting address of the data block to put.
       dst     - Destination starting address to put data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).
       handle  - Pointer to a desciptor associated with a particular non-blocking transfer. 
                 Passing of a NULL value for this arg makes this function do an implicit 
                 handle non-blocking transfer.

RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Get(src, dst, bytes, proc)
PURPOSE: Blocking transfer of contiguous data from the remote process  memory (source) to the calling process memory (destination).
ARGUMENTS:
       src     - Source starting address of the data block to put.
       dst     - Destination starting address to put data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).

RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbGet(src, dst, bytes, proc, armci_hdl_t* handle)
PURPOSE: Non-blocking transfer of contiguous data from the remote process  memory (source) to the calling process memory (destination).
ARGUMENTS:
       src     - Source starting address of the data block to put.
       dst     - Destination starting address to put data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).
       handle  - Pointer to a desciptor associated with a particular non-blocking transfer. 
                 Passing of a NULL value for this arg makes this function do an implicit 
                 handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).
__________________________________________________________________________

5 Accumulate operation using the generalized I/O vector format

Accumulate operation performs atomic scaled reduction, i.e.,  remote += scale*local

int ARMCI_AccV(int datatype, void *scale, armci_giov_t *dsrc_arr, int arr_len, int proc, 
               armci_hdl_t* handle)

PURPOSE: Blocking generalized I/O vector operation that atomically updates the memory of
         a remote process (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;

ARGUMENTS:
       datatype  - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale     - Scale for the data (dest = dest + scale * src).
       dsrc_arr  - Array of data (type of armci_giov_t) to be accumulated to the remote process.
       arr_len   - Number of elements in the dsrc_arr.
       proc      - Remote process ID.
       handle    - Pointer to a desciptor associated with a particular non-blocking transfer. 
                   Passing of a NULL value for this arg makes this function do an implicit 
                   handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbAccV(int datatype, void *scale, armci_giov_t *dsrc_arr, int arr_len, int proc,
armci_hdl_t* handle)
PURPOSE: Non-blocking generalized  I/O vector operation that atomically  updates the memory of a remote process (destination).
DATA TYPE:
       typedef struct {
         void **src_ptr_ar;  - Source starting addresses of each data segment.
         void **dst_ptr_ar;  - Destination starting addresses of each data segment.
         int bytes;         - The length of each segment in bytes.
         int ptr_ar_len;    - Number of data segment.
       }armci_giov_t;
ARGUMENTS:
       datatype  - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale     - Scale for the data (dest = dest + scale * src).
       dsrc_arr  - Array of data (type of armci_giov_t) to be accumulated to the remote process.
       arr_len   - Number of elements in the dsrc_arr.
       proc      - Remote process ID.
       handle    - Pointer to a desciptor associated with a particular non-blocking transfer. 
                   Passing of a NULL value for this arg makes this function do an implicit 
                   handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).
_____________________________________________________________________________

6 Accumulate operation using the strided format

int ARMCI_AccS(int datatype, void *scale, void* src_ptr,int src_stride_ar[], void* dst_ptr, 
                 int dst_stride_ar[], int count[],  int stride_levels, int proc)
PURPOSE: Blocking strided operation that atomicaly updates the memory of a remote process (destination).
ARGUMENTS:
       datatype       - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale          - Scale for the data (dest = dest + scale * src).
       src_ptr        - Source starting address of the data block to put.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to put data.
       dst_stride_arr - Destination array stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (destination).
RETURN VALUE:
       zero           - Successful.
       other value    - Error code (described in the release notes).

int ARMCI_NbAccS(int datatype, void *scale, void* src_ptr,int src_stride_ar[],
                  void* dst_ptr, int dst_stride_ar[], int count[],  int stride_levels,
                  int proc, armci_hdl_t* handle)
PURPOSE: Non-blocking strided operation that atomicaly updates the memory of a remote process (destination).
ARGUMENTS:
       datatype       - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale          - Scale for the data (dest = dest + scale * src).
       src_ptr        - Source starting address of the data block to put.
       src_stride_arr - Source array of stride distances in bytes.
       dst_ptr        - Destination starting address to put data.
       dst_stride_arr - Destination array stride distances in bytes.
       count          - Block size in each dimension. count[0] should be the
                        number of bytes of contiguous data in leading dimension.
       stride_levels  - The level of strides.
       proc           - Remote process ID (destination).
       handle         - Pointer to a desciptor associated with a particular non-blocking transfer. 
                        Passing of a NULL value for this arg makes this function do an implicit 
                        handle non-blocking transfer.
RETURN VALUE:
       zero           - Successful.
       other value    - Error code (described in the release notes).

7 Accumulate operation using contiguous format

int ARMCI_Acc(int datatype, void *scale, void* src, void* dst, int bytes, int proc)
PURPOSE: Blocking operation that atomicaly updates the memory of a remote process (destination).

ARGUMENTS:
       datatype - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale   - Scale for the data (dest = dest + scale * src).
       src     - Source starting address of the data to transfer.
       dst     - Destination starting address to add incoming data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbAcc(int datatype, void *scale, void* src, void* dst, int bytes, int proc,
                armci_hdl_t* handle)

PURPOSE: Bon-blocking operation that atomicaly updates the memory of a remote process (destination).
ARGUMENTS:
       datatype - Supported data types are:
                        ARMCI_ACC_INT -> int, ARMCI_ACC_LNG -> long,
                        ARMCI_ACC_FLT -> float, ARMCI_ACC_DBL-> double,
                        ARMCI_ACC_CPL -> complex, ARMCI_ACC_DCPL -> double complex.
       scale   - Scale for the data (dest = dest + scale * src).
       src     - Source starting address of the data to transfer.
       dst     - Destination starting address to add incoming data.
       bytes   - amount of data to transfer in bytes.
       proc    - Remote process ID (destination).
       handle   - Pointer to a desciptor associated with a particular non-blocking transfer. 
                  Passing of a NULL value for this arg makes this function do an implicit 
                  handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).
 _____________________________________________________________________________

8 Register Originated Data Transfer Operations

int ARMCI_PutValueXXX(DATATYPE src, void* dst, int proc)
PURPOSE: Transfer of a value stored in a register  of a local process to remote process memory (destination).   XXX can be "Long"/"Int"/"Double"/"Float"
ARGUMENTS:
DATA TYPE    - long, int, float, double according to XXX in the function name
       src   - Value in a register to put.
       dst   - Destination starting address to put data.
       proc  - Remote process ID (destination).
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_NbPutValueXXX(DATATYPE src, void* dst, int proc, armci_hdl_t* handle)
PURPOSE: Non-blocking transfer of a value stored in a register of a local process to remote process memory (destination).  XXX can be "Long"/"Int"/"Double"/"Float"
ARGUMENTS:
DATA TYPE:  - long, int, float, double according to XXX in the function name
      src   - Value in a register to put.
      dst   - Destination starting address to put data.
      proc  - Remote process ID (destination).
      handle - Pointer to a desciptor associated with a particular non-blocking transfer. 
                Passing of a NULL value for this arg makes this function do an implicit 
                handle non-blocking transfer.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

DATATYPE ARMCI_GetValueXXX(void *src, int proc)
PURPOSE: Transfer of a value stored in a register  of a process (source).   XXX can be "Long"/"Int"/"Double"/"Float"
ARGUMENTS:
DATATYPE    - long, int, float, double according to XXX in the function name
       src   - Source starting address.
       proc  - Remote process ID (source).
RETURN VALUE:
       the value (of type DATATYPE) is returned.
_____________________________________________________________________________

9 Completion of Outstanding Operations

int ARMCI_Fence(int proc)
PURPOSE: Blocks the calling process until all blocking put or accumulate operations
issued to the specified remote process complete at the destination.
ARGUMENTS:
    proc    - Remote process ID.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_AllFence()
PURPOSE: Blocks the calling process until all the outstanding blocking put or accumulate
operations complete remotely regardless of the destination processor.

ARGUMENTS: none


int ARMCI_Wait(armci_hdl_t* handle)
PURPOSE: A common function to be used  to wait for non-blocking ARMCI operations with explicit handle.
ARGUMENTS:
handle - Pointer to a desciptor associated with a particular non-blocking transfer. 
            A value of NULL for the pointer is erroneous. A value other then NULL would 
            make this routine act as a wait for an explicit non-blocking request with 
            the handle pointed to by reqid.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Test(armci_hdl_t* handle)
PURPOSE: A function to be used as check completion status of  non-blocking ARMCI operations with explicit handle.
ARGUMENTS:
handle - Pointer to a desciptor associated with a particular non-blocking transfer.
            A value of NULL for the pointer is erroneous. A value other then NULL would 
            make this routine act as a wait for an explicit non-blocking request with 
            the handle pointed to by reqid.
RETURN VALUE:
       zero        - Completed
       1           - In progress
       other value - Error code (described in the release notes).

int ARMCI_WaitProc(int proc)
PURPOSE: Wait for all outstanding non-blocking operations with implicit handles to a particular process to finish.
ARGUMENTS:
       proc - proc for which all the outstanding non-blocking operations have to be completed.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_WaitAll()
PURPOSE: Wait for all outstanding non-blocking operations with implicit handles to finish.
ARGUMENTS: none
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Barrier()

PURPOSE: Synchronize processors and memory. This operation combines functionality of
        MPI_Barrier and ARMCI_AllFence.
ARGUMENTS: none
RETURN VALUE: none
_____________________________________________________________________________

10 Aggregated Data Transfer Operations

ARMCI_SET_AGGREGATE_HANDLE (armci_hdl_t* handle)
handle - Pointer to a desciptor associated with a particular non-blocking transfer.
PURPOSE: Mark a handle as aggregate. This will allow ARMCI to combine nonblocking operations that use that particular handle and process them as a single operation. In the initial implementation only contiguous puts or gets could use aggregate handle. Specifying the same handle for a mix of put anmd get calls is not allowed i.e., only multiple put or only multiple get calls can use the same handle.

ARMCI_UNSET_AGGREGATE_HANDLE (armci_hdl_t* handle)

handle - Pointer to a desciptor associated with a particular non-blocking transfer.
PURPOSE: Clears a handle that has been marked as aggregate.

11 Atomic and Synchronization Operations

int ARMCI_Rmw(int op, void *ploc, void *prem, int value, proc)
PURPOSE: Combines atomically the specified integer  value with the corresponding integer value (int or long) at the remote memory location and returns the original value found at that location.
ARGUMENTS: 
    op    - Available operations are:
            ARMCI_FETCH_AND_ADD -> int
            ARMCI_FETCH_AND_ADD_LONG -> long
            ARMCI_SWAP -> int
            ARMCI_SWAP_LONG ->long
   ploc   - Pointer to the local memory.
   prem   - Pointer to the remote memory.
   value  - Value to be added to the remote memory.
   proc   - Remote process ID.

int ARMCI_Create_mutexes(int count)
PURPOSE: Collective operation to create sets of mutexes on individual processes.
Each process specifies the number of mutexes associated with that
process. The total number of mutexes allocate will be a sum of the
values specified on each process.
ARGUMENTS:
  count    - number of mutexes allocated on calling process
             count=0 means that no mutexes will be associated with that process.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Destroy_mutexes(void)
PURPOSE: Collective operation to destroy mutex sets allocated by ARMCI_Create_mutexes.
ARGUMENTS:  none
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

void ARMCI_Lock(int mutex, int proc)
PURPOSE: Acquire the specified mutex on the specified process on behalf of the calling process.
ARGUMENTS:
 mutex    - Mutex number (0..count-1)
  proc    - Remote process ID

void ARMCI_Unlock(int mutex, int proc)
PURPOSE: Releas the specified mutex on the specified process on behalf of the calling process. The mutex must have been acquired with ARMCI_Lock.
ARGUMENTS:
    mutex    - Mutex number (0..count-1)
    proc     - Remote process ID

12 Memory Management

int ARMCI_Malloc(void* ptr[], armci_size_t bytes)
PURPOSE: Collective operation to allocate memory that can be used in the context
of ARMCI copy operations.

ARGUMENTS:
  ptr    - Pointer array. Each pointer points to the allocated memory of one process.
bytes    - The size of allocated memory in bytes.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

void* ARMCI_Malloc_local(armci_size_t bytes)
PURPOSE: Operation (noncollective) to allocate local memory. This memory can only be accessed locally. However, using this memory in ARMCI operations can improve performance on some systems. For example, on Myrinet or Infiniband, the memory is registered and therefore suitable for the native RDMA communication.
ARGUMENTS:
bytes    - The size of allocated memory in bytes.
RETURN VALUE:
       NULL pointer - Failure.
       other value - address of newly allocated memory.

int ARMCI_Free(void *address)
PURPOSE: Collective operation to free memory which was allocated by ARMCI_Malloc.
ARGUMENTS:
  address    - pointer to the allocated memory.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

int ARMCI_Free_local(void *address)
PURPOSE: Non-collective operation to free memory which was allocated by ARMCI_Malloc_local.
ARGUMENTS:
  address    - pointer to the allocated memory.
RETURN VALUE:
       zero        - Successful.
       other value - Error code (described in the release notes).

13 Collective Operations

These operations can be used as an alternative to the collective operations in a message-passing library ARMCI is running with. The programmer can use either.

void armci_msg_brdcst(void* buffer, int len, int root)
PURPOSE: broadcast data from process "root" to everybody else.
ARGUMENTS:
buffer - data to broadcast/receive
len - size of the data
root - rank of the sending process
RETURN VALUE: none

void armci_msg_gop2(void *x, int n, int type, char* op)
PURPOSE: allreduce operation for int, long, float, double corresponding to XXX is "i"/"l","f","d" 
ARGUMENTS:
x - data
n - number of elements
type - data type, one of: ARMCI_INT/ARMCI_LONG/ARMCI_FLOAT/ARMCI_DOUBLE
op - operator, one of: "+","-","*","min","max","abs"
RETURN VALUE: none

void armci_msg_barrier(void)
PURPOSE: synchronize all processors
ARGUMENTS: none
RETURN VALUE: none

void armci_msg_reduce(void *x, int n, char* op, int type, int root)
PURPOSE: reduce operation
ARGUMENTS:
x - data
len - size of the data
type - data type, one of: ARMCI_INT/ARMCI_LONG/ARMCI_FLOAT/ARMCI_DOUBLE
op - operator, one of: "+","-","*","min","max","abs"
RETURN VALUE: none

14 System Configuration

These operations can be used to determine configuration of the system the application  is running on.
The system configuration is described in terms of locality domains. For example on clusters with SMP nodes, SMP node is one of two locality domains for a process. The ARMCI header file predefines ARMCI_DOMAIN_SMP for querying configuration information on clusters composed of computer nodes with shared memory.

int armci_domain_nprocs(armci_domain_t domain, int id)
PURPOSE: return number of processes/tasks in locality domain represented by id. 
ARGUMENTS:
domain - domain name
id - identifier of a node within the locality domain, value < 0 means my node
RETURN VALUE:
< 0 - error
other value - number of processes/tasks (0, ..., armci_domain_count(domain)-1)

int armci_domain_count(armci_domain_t domain)
PURPOSE: return number of nodes in specified locality domain. 
ARGUMENTS:
domain - domain name
RETURN VALUE:
< 0 - error
other value - number of nodes

int armci_domain_id(armci_domain_t domain, int glob_proc_id)

PURPOSE: return ID of locality domain of specified process
ARGUMENTS:
domain - domain name
id - process/task id
RETURN VALUE
< 0 - error
other value - process/task id

int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id)
PURPOSE: Returns global process/task id based on its id in a given locality domain node
ARGUMENTS:
  domain - domain name
  id - identifier of a node within the locality domain, value < 0 means my node
RETURN VALUE:
  < 0 - error
  other value - process/task id
int armci_domain_my_id(armci_domain_t domain)
PURPOSE: Returns id node in specified domain the calling process/task belongs to
ARGUMENTS:
domain - domain name
id - identifier of a node within the locality domain, value < 0 means my node
RETURN VALUE: id of domain


ga-5-4/doc/armci/armci_doc.pdf0000644000175000017500000026700412662210475014321 0ustar mbamba%PDF-1.2 % 2 0 obj << /D [1 0 R /XYZ null 766 null] >> endobj 3 0 obj << /D [1 0 R /XYZ null 53 null] >> endobj 4 0 obj << /D [1 0 R /XYZ null 727 null] >> endobj 5 0 obj << /D [1 0 R /XYZ null 700 null] >> endobj 6 0 obj << /D [1 0 R /XYZ null 684 null] >> endobj 7 0 obj << /D [1 0 R /XYZ null 668 null] >> endobj 8 0 obj << /D [1 0 R /XYZ null 652 null] >> endobj 9 0 obj << /D [1 0 R /XYZ null 638 null] >> endobj 10 0 obj << /D [1 0 R /XYZ null 609 null] >> endobj 11 0 obj << /D [1 0 R /XYZ null 588 null] >> endobj 12 0 obj << /D [1 0 R /XYZ null 308 null] >> endobj 13 0 obj << /CreationDate (D:191001102164319) /Producer (\376\377\000A\000c\000r\000o\000b\000a\000t\000 \000D\000i\000s\000t\000i\000l\000l\000e\000r\000 \0003\000.\0000\0002) /Title (Untitled Document) /Creator (FrameMaker 5.5P4f) >> endobj 14 0 obj << /D [1 0 R /XYZ null null null] >> endobj 15 0 obj << /D [1 0 R /XYZ null null null] >> endobj 16 0 obj << /I << /Title (A) >> /F 17 0 R >> endobj 18 0 obj << /Length 4648 /Filter /FlateDecode >> stream HWK#X4ߏy7Hb#I.zȖX"קjJq `ĮLJׯ)1yؾ~DMib,΢2Y5y8~aoٝׯ$|sJSEM*qTUJL,Kk?3ᦎsQan4ʂ%$*a\y 8؅0#j3c)D=dn ƉyT  ΢0I8SYtQĹz4aMFg~5N&']pӈD$LC7aLHWY3k:?*SJe ܕqZҜ/LI*W2:TvbңI #cK`RX|WϾ8 4ʈΛUĤވJ%9Æi@ǖ؆){]O`OcX쟜@NMO`@ÃyTJ1VkzSSQܘI&jq鿅 , X>%òmc vs(4EU&* kęnUT7OEXhBA`qEy}wO .Q8lȧ#^HQ$V&;[4 sPӏ"_ Ln}Ӣ^ o/x>7*zޝ٩" sǐk?8VMDcZi?:s K6r&2ܑ#$є\)5\* c;?7bH5j9WYf;[6%I6~w͙)#rU''+/48P'06V).$=/?HG\-ʞIkEy ׀ZE'G%Eͷ8.hvbi1ȣ *E=vceՅ,[._89`nY%9:<^ DKBy7RRվsr\DȆ_kP"ˇx ~ؙ (pq"#Qr"sT9|b (x݋vw⤂%"x/VN^0(iT}EfxReOad J ZQҰT$9ᰄ5Q!JO}T-{-@qwo2/fhyt*W}k!GEeݿV JꯒQoy<1Z1CX[HfKjY+ճ^ i{Q\l( 愌v-#r=G/ pDi5GwWw/rH IRESamؿbTEU|8;L=-RÈJ7.Z#ꊰM0*i) yQ64sMU>6)L[5;jOᇭ$s8RI ]Qގ#l0hb(gl 8]𳸣 cζ C!,ćGrWtvA?zsǀ';󂇫Õ؝(X0:&Ta֞eYOœhd(K $V޸N~:{TulϷ: RK{upyc|2C悱{ab>WeKو=Pj 2Y_S։: rTΟl;ٵ7~u)c=Q]d0P(}`xfܵ_˜+7} hDDcu<@RjulQe }׹V`/P)IAP=LuloQ}Tz©b_zhh'GNȋX9";hv >?疱뗲Sf{.nk7RaGCz+U0<'&MG|Ihl-W}bZ}MAe:-(CҚ7?ũ12קhrv߸-ZH0&c?GxD<>g3;7S]AgFIsߖ}C7TJh) M'X|yDLvSndXy`”JPK4-X-GHE#u;aK/4A?G0RZzQMNRK 6F@r̍0&zTȍo0B ʚϋD +OmSev kCa~ͭFUH "j KH]sr-Ƞ3UwPG3hWb/}AoWϴ[*^/V | \Ӻ\?3D~ez"<]dSYv8`A: OK;DRs"U `Dm'%)3EȚ Rgı s(-{[.~=XH{\ǧu ȩr2<ϯwabs--br*į\;߲}G[:?99%od @BS^i1&*pZdAd0M J{܉i}x/H}b2tyA(:}-pi'pϧ^ r*ٛc*ۤ0)P^vA*HWu%eWpp9`GvXA2nL6;]UB 쮯aNZ]-“IN% +P-"Y*2J ,ZۆewqVma S2Fa|wjHlNz:|2g8͘3W/:*S؁pEkx'pD\q*&'(}aݜn i ڥ7S);n/gz:꺓!ӄ"n?\0Gvnс75no]:lq# cn:ot<5K cmBQ21{lM2^16-ՎBjg2o:EnFM NJ"4ME?ݸYhG9mVacB }W6Ao]Ee2p[MX4CN1k75^4QZ4J`ybi$6֬ګeYiV-m8K\u E׾mޖDָO;6_rmx(^tk =d~S>DWS%  endstream endobj 19 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 26 0 obj << /D [25 0 R /XYZ null 730 null] >> endobj 27 0 obj << /D [25 0 R /XYZ null 580 null] >> endobj 28 0 obj << /D [25 0 R /XYZ null 339 null] >> endobj 29 0 obj << /D [25 0 R /XYZ null 279 null] >> endobj 30 0 obj << /D [25 0 R /XYZ null 211 null] >> endobj 31 0 obj << /D [25 0 R /XYZ null 193 null] >> endobj 32 0 obj << /D [25 0 R /XYZ null 146 null] >> endobj 33 0 obj << /D [25 0 R /XYZ null null null] >> endobj 35 0 obj << /Length 4997 /Filter /FlateDecode >> stream HWKoF0bćHq&Y0Ƙ12CjICKoU}ՒI~|ϗ~96yٽWFen'2VIWQY/b?ꥒIIeiZ|-ļ2)vAq\ȍ!\GE~/_C]k[ʊZM| ޸+QO݁5erg;T^ Oy}>:g>*/tØ] 3d[~=Jr[sT=R8tc#삍1386ud0-U#Gidjb{U (9zTOࠣBIkî峸zsЪEґBw&}3 PB6SGk蓰>GPɍ8|$rL:5;AZdCjWgyT!c%ZpgdwH>Pp|r$PH\lxQ5䚱(l \%V =ƃWj%Fݽ_ f1HJdmnzY9-XK BౝmB*h1WΊsw|! x (72 @ {*R2FWc BityLrFfHsP'xc}Z՗:Y/҃(Ia%<+ЖqFG=P.VbW;߷ Tj] ~$/78/ipwYGdWf]8ackJ2N057LQ H+-5ssʗ^̰7'a"=mɌ[VF%?̀A40:@W~/]ohp2 ٫ #nhb9Vt%7&ʯ G>#PLv_$C 7U,Ԃq߽}q DNGJ&JHʲk1A^+w4_MeĀ%H2y9Bf/T1RXj!JW=wLZ"WwTtuH!ʥ /?̡S/ "Jz#۹P- ` {[ac4g:F|EރQ\2VrJswpu6`duf?w?D IʸJug>P ^Gw -?QO k͖~J*FV\v9uz3 )-[Ď-`qaBr-{"ݪDn{ן44O5 -JO8QRh,ZK(Mh"6f%;bSZmՁl)reZэvdm朡6O}봁hn&Dxi+@7V zmF{'iz9 }vcpKTb9LDBX$cHj[Vg4T,ZrO4VUsϗZ>"@ cˑL80[A}*J)0GSQ*qkc:xg3T-hŮ|[/đSm?U8rC(m%m 0`\dVFY/K;4VUHV1C t.@?! >H{ERꪄr{ ^eS6 ==Є\P ůVhiq\Xt_0A.5i޽?3=侃bZl蛡Z`cIjHޖ;АPi-*tv~!Vj›ݠd -G@%nTčJ΂TjBoݠաW*cWصo"0k,hOKADi~!_݇wrve>8݃7_{N5olU:UIKǸ`MW޻Ժ{jw]k9nv!tNߥ{܇=>m?/o YfڮaڛWk̹*tFEN-YC%rFTpмֻo红%kݔ9+"i1kŋ w +?Z/Eunf#+noX7$XT!4ko>ӻo9(U:  R)Rt@cEN8mX-I1}IYZ[\3ϵEO<<(Y3nC$?Kn%SU*[j}>*0z?J.*X}_k_9*i/;Gasp"1'Kp %t I5~-ȣ0zq–3[ 4r6)Ev[Aa S\h;5[O$,np\d4dӣ|pW 9B=X˵~^4*q7gUքʒ[.9EOG\E{} l!8<~;p*9P!(5q8 ]Q>dD'PfD~jǩk+ogӘeo)6b0S[q4*f%} Ib.8IR7ʾ:ȽN,Q4J7*@W` */AqѐυGﴟmq}^,N]ndoG6D\T~O(u9/ïF0\5 endstream endobj 36 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 38 0 obj << /D [37 0 R /XYZ null 524 null] >> endobj 39 0 obj << /D [37 0 R /XYZ null 511 null] >> endobj 40 0 obj << /D [37 0 R /XYZ null 498 null] >> endobj 41 0 obj << /D [37 0 R /XYZ null 486 null] >> endobj 42 0 obj << /D [37 0 R /XYZ null 473 null] >> endobj 43 0 obj << /D [37 0 R /XYZ null 461 null] >> endobj 44 0 obj << /D [37 0 R /XYZ null 442 null] >> endobj 45 0 obj << /D [37 0 R /XYZ null 405 null] >> endobj 46 0 obj << /D [37 0 R /XYZ null 387 null] >> endobj 47 0 obj << /D [37 0 R /XYZ null 344 null] >> endobj 48 0 obj << /D [37 0 R /XYZ null 587 null] >> endobj 49 0 obj << /D [37 0 R /XYZ null 91 null] >> endobj 50 0 obj << /D [37 0 R /XYZ null null null] >> endobj 34 0 obj << /P 25 0 R /R [63 63 549 729] /V 17 0 R /N 51 0 R >> endobj 52 0 obj << /Length 6752 /Filter /FlateDecode >> stream HWێܸ}7ࣴp)bdׁ . [ݣ/ Q*cbթSUԟn^z2ٿ~ؘW|9~Uϕ9<͖U~UQ;/bkn~EYZO7ۺfy{|g|Gey7MQentg~k"dSiAf!p{|xwt!{~-50{kk\0zuywypTV ͑ t\`;d/k! !G̯֍=vH3R tDI{=4Uk+fi:t7 ~{hf@!(kۙMrW^A KC[ ѕ[PkN4p?Q7ug=F਺2ɀiKNjXsfAxef/ zP̉R#s|8"5Ѯip/r HWphp`:⵶ Tx&H r &/Uꭼ#(2\ v^8z"=v89c)"/W&G^1-ɲO.H<tzb ( h'p"?PfBmԷS(ՙt5 F7Ɩɰq(#YĕKSέן.E'A|- 2x:MDîx"U-v# T+3?73Z :͑4@w 4 X#X4EPW1>RHE6:Sh1\`m:R)]OicX|\h}/| b 녭>uf]FaFcYئ.ʨNi + ;ۘv݂d4g·ᯅ Bj n!64$ jT*-,r@ǂxHJbYD'.% (Ax]@k`9$s.@W@)cK;GD⣲3%^z#DatDaS]BT4uE%lɞVX13@tʱ }PѢNdCVD˜b4: X*j9 pU[KNӀg 9XVnnJN3V@-$+ 5#cit"4iJ,E[`q/N|,:P)|t+n(T@ZֳQ=3%*QNXr"qlN[d)/ `֗HEKL:ehwymEsPqB\/At;l5KQ@NêJe-@OA}^9>+ e$)'C P-sbu*5%m9 ej}lSk $ǜE$h`ǹ1ttkO*ϽpUb XuKX% ڱEA8Et"K!,2瑔^dUp۴-.5_ݚ_^o^zolHomU[d<hxm|ٸƟoWƝޜ^e/l[˭qy~ڮڵfy]o]aj;$ޚCN*;#WGNLqZYZF|fG@o '\@T{M!?ΫG܆ ?;lc!X۽pJA}H>RRU6X`J({,èyx8r>]͎7˩o1giFy=݈Zm0!r4/K JZMTM0Di^a#y4&RH ǢEȽ ǫ1@J~?bٮ{Ag@ܳчtJG7r3]{Ҕ]d7Ȥ\pPnw͟ڽwm'v% I hfmwL qI+xÝ H:H@jta$ը԰`3Ӹ4 !5 1qd= V4#bz&Fצhg!8)QH0;NwuDj x_/ J)P3=ġD};rM]Q27({l;%XJ+efV&Nt p!x$h=tv,2kl[T*Vπ&>.VRA9=[iҷZԬX.ڒBLqz_*$wɳ}ێQ<ދq*^Ql1|LjbbA^ޫJa @R%e}YDmQxhJ;$Œ|Mz,mNI!o*ɅtЀGCT  PFKECCSTPY[)Y1Syem܏S3IP8(A0CDQy!GR)hyh`@KK}+4 ӌ=2H$*PXifbU&m (j9/389:Ub.zW<9.z h"-ҫZM`|(Х{8 ]w7HR&0BhߪW]Q7I@k;݅Md^FmK7E9Ͳ Awʑ9CM@S5.HvbqvaT1ΙE̠+1 96ɧM ьlgdQoCpflf02PPk%A-0 otۦ# μ-) s9Vx f`ul Kwm(!k9C':AC2f &g7oP[$CjJV1#S@# %@WAJIytmٗif`! 88АxWzH-45c,dbGI6;0yC؍7;l;eCT9v0[ki )3vKH??ƇbN;l;U$ȉnqт6W1i%I#jk h<1 %1jZ(#'<]%`rgBGgݟ/$"wfJhSƂl 8 1~ fZRǶ]Q8%) %`ggEhd~~hqҙdr߹zyybx ɧ/Cri{<'6pq{lv~]~ۍ|oOt!}OUW|J|vLe W~ǟ'&ʾWtDDřZגWK2˒][r@k0.|ry'c |__rWU61]пo_pE ?/0_cdƚ~b,|7G+#ZOq8ۅ+|fJMʹ](hmhtwXGY˪CV;/a~?1, ON ȌMzwU%;ӨNK2ܥs[X;43R+K<2<}xY>x]ҏ7V٨۠ =uR QVhoBM'dVPUї>TyJeP*ml!uh&—b6NiB !cr!]V;߶cv U/۳{^T2”M!M|[/Nu!aٮo3l@״YB$cf hZ,P [1,0Nig Xa.$.vyxc@!K'~HNW5 E۩Q D̖=d#]l&9rPNwI 3KOc Q#.A,b@y9%sfm"Y$ eƥ08i5k4CJ6Nw!$۳0x@/ v E4ofimf$U)к@ś 3&@9T!b*M Į[nö]]1 $:E$T [E*:PtTzъLen?B!O c[JOϫ47PUumTvtXs6: |v:OUr/OrjYY'{ 6IC!yZF@讒ݸaz/.Zlz͡f&,-%ERl MqyG&+*ݹ"r,(e"8C6LlTe4ZW fGlYCi\DUl#A0Vd29KO:nTLB+fwLawu7VʼnhQ4ev> ӬKO̘Q G֦RV}B.sN2e E)@`{0ҋhlf/\lbC(]%\^,ŖFô[a* !ѐt );,((t 0}ZFMl K8 (A8_y 햋3\, !uXPBcUV?! Uֵ` 1(PrF+^m'x .m]mQac\@TҨ׼:_Xae~ R2p|nR>B,9P`HG"iOz@2UeJ` 9 n8 FN*/dd #\@ŷQbA@ sJZFxՂp46d40c% F4lݔLvR#C;pA@bRyRWx=3108}`!kLdEA7Q~BIPֈL /Z` wx ңXEʤ(rlcZBz&[ =-=#Z6rJ$P8*G$HsJUlpp`&/iM6z#UXGJ- g>FFl5rGd@"2Yz/Wx3X1T35cދ z~{?g!@ŗn"m^{gt;0 7TD^?~顽ox7sݵ~Kg|MIyB3;;9)ۓ3=O. R{"]Q{ -écOor.?6\J</rN=zpml 64 PRy:xE]t.Ɛ9J˲sU endstream endobj 53 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 56 0 obj << /D [55 0 R /XYZ null 497 null] >> endobj 57 0 obj << /D [55 0 R /XYZ null 484 null] >> endobj 58 0 obj << /D [55 0 R /XYZ null 471 null] >> endobj 59 0 obj << /D [55 0 R /XYZ null 459 null] >> endobj 60 0 obj << /D [55 0 R /XYZ null 446 null] >> endobj 61 0 obj << /D [55 0 R /XYZ null 434 null] >> endobj 62 0 obj << /D [55 0 R /XYZ null 415 null] >> endobj 63 0 obj << /D [55 0 R /XYZ null 379 null] >> endobj 64 0 obj << /D [55 0 R /XYZ null 350 null] >> endobj 65 0 obj << /D [55 0 R /XYZ null 307 null] >> endobj 66 0 obj << /D [55 0 R /XYZ null 270 null] >> endobj 67 0 obj << /D [55 0 R /XYZ null 251 null] >> endobj 68 0 obj << /D [55 0 R /XYZ null 155 null] >> endobj 69 0 obj << /D [55 0 R /XYZ null 137 null] >> endobj 70 0 obj << /D [55 0 R /XYZ null 121 null] >> endobj 71 0 obj << /D [55 0 R /XYZ null 104 null] >> endobj 72 0 obj << /D [55 0 R /XYZ null 563 null] >> endobj 73 0 obj << /D [55 0 R /XYZ null null null] >> endobj 51 0 obj << /P 37 0 R /R [63 63 549 729] /V 34 0 R /N 74 0 R >> endobj 75 0 obj << /Length 9368 /Filter /FlateDecode >> stream HW[۸~LmEu>%iRشE>,-G->n9qגּj}T>\$S. LϟjŪ݀UE=cJE2ASq$I_6(&;׮٨C_d>"6D')7Q6Q cljou;_D ; ̟ m׺tֳMWC4KHZ ;X-ݙ@7uy{!(Pއ6P ->WB2 r*>kd>qEj/J|(VX- ?V(2MEwbIieB4BW_>n 1x4\$gK(}mu EEg@-+9{?F( ,&bT r<)F%hu[n_Ne>.i%4oF1#[wՊL1@]Ԁ ?7`HJVnzsxb }Y-}3n'NL‰U)OL4H6 -1q-9xCy#P]-A+ pCsFt*C(MI &iCpH*1E06%+Yz~[4^a+t6@hi/BYI=c;aǦ-xtd:5w "VP7SomRYoSo|PU,r EqzՇ#7WBw7Eex%`d?GڧJ1^пكA}im1([CpU.ҺMaB#\{lgraڊG`K9et-uH ujd1Qu@O[ D1>)$:ޥcdy q=(0KQ |=.ѱ}RI~ݻr/>rj+~za8*H0V]֏(|Rkv\:'8RCX:_5m+d(0O6R)u{ J,:(̏Rm)_F*Y:oo.Λ̖lxڿ iNb{6.=Lpg>ߺ 2+7ۃl۱,*чPM%bPZ,`Rq/9穦\MuTq5+b:l],0/:Tp@Y1sID&I& *b?g1d""󱣄}e u]@~bȷz!Q}G׈q2ʂЎLHq|b}3b xLЖ{4r0/śaZ5ڞol#^"`XQjor1DR+bGpEl߾d@αЉ(TW.-y0.@͆~A%cs%\n'"l=_:˜T}4ԍeL2h]0+ 3+c1.$AmQ#̶G8κʹǬTqd'bqrY+$))ȇ硎;ߓ4AsHJ@Zm+s Dd8!N$*FpiW [`A\E,İ5 3 o1 |偅 v@l18GphOF*RofC 5D"k6JnV $+IG{ !CϻicG61obaB6eAh;jA;<ћ xw@7 F;T4XG-70;Xjo),zE$ɇsc9@5ƌ >>2]Ou50׽Rf O6GT UaSm,u75<[l. ?^PmWAaV^C) %ޱ®Ԧ#ѯQ:RzߍIv)ۏ*6!TbUDY1(3}BLZP)cW9Pjl͟}҂FXyuc بQt%ӍB9ND)/7aQV/JZ'ۄ OiԖ$. _X+/I]Q3G2OW6 H1iq_U;/_+M";+z3 ̭W*eBkOfAB%,'P6=^0Q)%5D0`7Ixɶ tlGZz8n݀C®aI8_thg%3*v},=+]4(EG2&GEƯgj lp( ɋmN=p <.޳[h*CD'*X9½PO~f)~] G2 }L>FG'Hcr;n\9/4dm|kSis:a&=y;ߑ9wO.46B۞'l}`ek1QƱ90w; DO _0y8Ԓq 02 刄L *zt&"X*2̞fPhB'Fʄቄ4 Fe\Ą=a\;HP8K zE!0H&H jr㈺Lj@ &D*cI Aָ\23nBDLZB*#0s"\W畟vfMcZ7 %P{-;)4o)PC%N\VFI+^ꐮaoF *Kf#XS1|9($fk?muGh2I5[m4;tWZQ%O&]$)5q[ \ &=]oke-xݚ~ڬ6_ˈ-J~hsvu+N8n),]wt3# bCO=#;a<#ѧ#_M nXg4:< 6`%V%8;ww +q!a8٦LD8- (+LIB*fFKe=xQuhjO&mfa'c[!Z81yU#0[8}ϯi,,{|8_`،,>b.(Ek&r1fu .Q~H0~Nl`{f3q{Y ztrr}`< V#$<칪oMd 4q0[r.x:]"Oq;F*-37#mA -\ Nxezi5kªgnx#E[I Pr م[OwQ9=5gȒ{:W&e) $4Rl?=~U>[A+ 0.,ak2]QSkUA%xe>V>a&=y;ߑwD/']&zxf-;$ma`S Y $ȼ Iٳ&HENI) [p kp N!!8ٲv*Ztmc ěB4noXwS<euS@Ԟ5RQQkF ,53Vѷ?3u.ݷ?1Hd<2X |ny כ{#l#3 WBB%Hc&#ǵZ8hZʦattb$I`iՅ+ gYrYYzy iV; +E *=a"uVP 5Y9)HAILZm"ZBzLCFXaVRl[Yw6.@oدx@OUfK` v#o[yc/- Xd֤Y2_\Rו| a;."r4܀!Ay; :N4HJt[sPj/l"jbl˚`R+8ay1ow EQg~e`+1Kc\$жgl> ۱&\TCBO 7߅opH$憯dqw*ScUA?Ǖ|4xZ( ͧ|7|R~ %QUQ =$烞Ax͋k5{\x ǿz /EZqzԖ=.J0 -{q7s0jWb\{́C uaZTT3\U h"q H˂A4e7GyPUpeC{# ;LAmGj1[p WS f)WˈSu~꬧l\S]H@Y EA4u] w8rs`NGUZ uPUP0]灠<͟`M*dK ۃAO:Εds[Btl}R0ikN< w;2fȻ*Tya(l rSD$\yL9a6)m:E{0L88{Үz'RX8 hŊBIQiU=GVbUaў_V=qXjl} #jX.ڷpH>隡^_\%ib^פ W4.zĚ"Sns8{#)HYyZM*F -Rm0osć:<o;vLϼ^ۣR"2/q6)wJz$[Inc [$= am"1.Q1hKlSv)pm-\s9\d/<;*^x ʄ\sxIGs8`{q`f3 z\osHcLU>.0Hsxp%}|H܀0~%) p,0Q(%x5IQ +R@{y. D <Y!`81K@@sxCbi(ᲁ}{0MމW ,_i\0wa*tjhh|j^OxIHU8X TnP%`2q0 Vzfye 0$yP}|VF3 {A^ /Z2c\yG] =uerZ"m5N) X7njRb da2٤Iinty͔nOVDn8 =kY9f޸ |ixbYpD]Lpr+z \(>#\:c:&b}9懽|>1-s+%ITx/gH&֒ 2#5ymkb,vz#@)\8%>pJ\K4ro/J^6M߽MU{7oXc| HSēĐ{"Z sx71t0E7.TtRܴ.wcTK 3p/gHπh Ȑ% Z+q#m4@M%_K j#^ow8^Oln;|hyEp[ֆmL?Bɵk`6/ꀄ*ケ8׀3 iewV s 5ғWei"B <5ǁ< pwzu -|Μ7g}YI"H RxPߠex=+.ru$Ċ,,' P ys r1[_0ǀd'㫖L2عJC6 G=l}-"oJnלw^2 .2̝tCI+Uh,ӹ`͑O&3k =/=ײ\snjR;MĸˁLJ@/ݣ+wQ!a%+]G}$/qkV<4pU 0 .\lH9,O]DW&OrdCb-ِؐ,."`^޶Q1y#pu_\ jco1,iB0jqy 8^OXx4w6oC9nMc Ac!K:ȱb%Xc!=c\l>߽k6{;FjRd/kّG\58^ln+MPg^-,Ǫ+cV`nϧ+͂2 >^2x˹"4rJlhHtdH9Go-ۈ:-Vs4`~`$.0HJ"d!M jJev"!;SD[ޕ&]o\E7y0Ow+0^*QgN,yk]6pYO0 ` `l.ݯsI .byoT8yJ#)1:H >[cW 7#P x#m{7[mR܇]>&|T壎S-iص jEW͍~{ΏegP/yWsF=gWP9C-[eQVpRosIHpKZ>#ҋ[9!=}0)'o[h LPbA U])%9ݣZxfiy/9^mn'D'5IA5LI!7zR ֓ڽYlmZ2Gڃ¸pF/+|/ӈP7L$%OKkgu3IO =NI7͑8nO4]^=Zxzeoin*gb,-/X{е{+QMRnkmz*uʜ/mּF+y#’m=\q^G[Pacu˭vϝ.B|?ZRx:i]Kixs+Y^+6ϿK,Zg Th$`.3 nZhSedb|2 8^Ya$TUs @= GOdEggG;4n>rp8tO /sQxUxpfs8n.el,о~;RܗP;wò_hn/3%,Wo\]ve- 7- ny^YIPɛT%vV kE-j˛ɐJ(oKy":`x4x}\>yEʕ&R*/Kd^ʡ*txrm, ;j㔈 G^N7mѬ3a˃aN 6 2Sl[IC%l0a-&aǐaa@YQ cQx?RHX*#j&:ɛӂKόöd`~%B0DKoe0 =@!=_y-ڥ SۡC6%"4$'E.GGz\K7"pj4eɵy86SgbdK`K愓!5H4T ZY* 0s7o? uĺ3í1G(S96@ۘm3(gkid!-'%oRHm'kMO!zz "0k-YK7"pj$LQ ɷy86XW,l l)w2A"*s|*h.c0z3-} ax;|Gkx;<'3>H/z3nH endstream endobj 76 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /Pattern << /P1 77 0 R /P2 78 0 R /P3 79 0 R >> /ExtGState << /GS1 23 0 R >> /ColorSpace << /CS1 80 0 R >> >> endobj 80 0 obj [/Pattern /DeviceRGB ] endobj 82 0 obj << /D [81 0 R /XYZ null 730 null] >> endobj 83 0 obj << /D [81 0 R /XYZ null 714 null] >> endobj 84 0 obj << /D [81 0 R /XYZ null 698 null] >> endobj 85 0 obj << /D [81 0 R /XYZ null 683 null] >> endobj 86 0 obj << /D [81 0 R /XYZ null 667 null] >> endobj 87 0 obj << /D [81 0 R /XYZ null 651 null] >> endobj 88 0 obj << /D [81 0 R /XYZ null 636 null] >> endobj 89 0 obj << /D [81 0 R /XYZ null 620 null] >> endobj 90 0 obj << /D [81 0 R /XYZ null 594 null] >> endobj 91 0 obj << /D [81 0 R /XYZ null 575 null] >> endobj 92 0 obj << /D [81 0 R /XYZ null 550 null] >> endobj 93 0 obj << /D [81 0 R /XYZ null 470 null] >> endobj 94 0 obj << /D [81 0 R /XYZ null 445 null] >> endobj 95 0 obj << /D [81 0 R /XYZ null 312 null] >> endobj 96 0 obj << /D [81 0 R /XYZ null 179 null] >> endobj 97 0 obj << /D [81 0 R /XYZ null 136 null] >> endobj 98 0 obj << /D [81 0 R /XYZ null 111 null] >> endobj 99 0 obj << /D [81 0 R /XYZ null null null] >> endobj 74 0 obj << /P 55 0 R /R [63 63 549 729] /V 51 0 R /N 100 0 R >> endobj 101 0 obj << /Length 4597 /Filter /FlateDecode >> stream HW[o6~fu}pم!k豚Tԙ=7jd o|lQoU%. 岸*rMïF\-΢()I k92NL'ĦtL+C*VJ.Dk=us{7TFS6O{}d|xO FvsϵV}D<.Ѣ ]GW>ԥ yA49pEl0$ e^Adهvvk[w9F3 !0;߫^w]DBN I0]ͭVa yTɁ.T fEcPBٖۚCa&On?>tȲr(IT7'4ɪ*+AqwhVC.2il1JRXx &wr:iP(S0U-qV/pjbg_Hܢd՟_P4Eh!u!!.^ )"%NFAʟ .41c}N Q[*I'.,hpHg܌oB־"ċĕqؐ;qjӓ/m7z,g}|WuGa>,Ƞj:gg~GVq戙j&q◟ %hRu=Nl1I\ -Y'ꖔ2-1Bf Iu : n1Rz+|flictMbM }$b.D,N4=Wzm`y6Iٴj Mu^=_*0LѶN`:"$$ fk!3a[\T⁖^.T_ge[$IKx(Rs Ebþp$l"0ܠ/1|Aa :t07@IJf%fd0mF(ϝ;Ce 'Ucw(R\N5mM%9F L R/5;㧣5aX]PG@7!%$0W84%B-VEiOP}x@u"5#lX9PC ѦӶ,d<9$u ftEV-Gw^K*5vX,f %AqBՒsxtj != (!_,ZGTm Vڈ-+j'DsZnj(, O.l.c g2^3Ai 12 oh-fVd?8Y!ܗ3yY84t{\ 6|}do s;ڐI,($ꍤm1݆I 1~j%BFߋ>6OHgp3 QSjDJVЩy} W ]Yu? !l*Dĕ|@,4͓)O)&`+{VNh8@`8Îv]; Ր+Dﯹϩ< ?~ "cOyab1acME)& .}}%Hm tRn, jAk4us^<"qVtܦrR=& 9.JBoj㢀$ii,Y /*7XKb}ݶW+l+ٰ[[dy6~tθ )Xk8iSBCtMzZХbŒJFyFJ 9"&!LE3R&I2GU=>t6rg̶"b:GO KY[Y٣ q X]qf.m#lh!5Ć|ZEGؼ~đ<*V§ir=Dص.*p;]2 r$ןAƙ"M0r~|1X AElրz`pngVorVꌟ$?9CJ^y= GLgI6_{_y~[A%A @q'D nad]B\N%͖8_2qVpe<>4w^$ lÉ><0V7DAfs'A-/;vn,GBH_䙙Qm$rj8H:=t,TGפ CD""bũ\5+3Az@<뙄P00?Ϻlur\9\E٨5Q(P( "\dQAjxkJW'%t7}"&")3iot˸4Z:fI6hy#/xAz3S̈́܄ITasy3otf8<Kd'Z729 ͖[1bA\~*Oֱ\Z v$K1 N&p)B pE9es4z FOr ߵվ/Wz9'3'Ojom\%eo, kNlKaP <+JKEz՚sD)%6W9E%}v)e=ֲ ݩ,sd;V fp U<& >J~: f=ה#x+d_/!"!jD_>QX* q G\S͝r6ZZK \#pLKR钝?e2NNdYP)7pʯ sģܩ,_?˿&z endstream endobj 102 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 104 0 obj << /D [103 0 R /XYZ null 729 null] >> endobj 105 0 obj << /D [103 0 R /XYZ null 711 null] >> endobj 106 0 obj << /D [103 0 R /XYZ null 609 null] >> endobj 107 0 obj << /D [103 0 R /XYZ null 591 null] >> endobj 108 0 obj << /D [103 0 R /XYZ null 399 null] >> endobj 109 0 obj << /D [103 0 R /XYZ null 377 null] >> endobj 110 0 obj << /D [103 0 R /XYZ null 364 null] >> endobj 111 0 obj << /D [103 0 R /XYZ null 352 null] >> endobj 112 0 obj << /D [103 0 R /XYZ null 340 null] >> endobj 113 0 obj << /D [103 0 R /XYZ null 328 null] >> endobj 114 0 obj << /D [103 0 R /XYZ null 316 null] >> endobj 115 0 obj << /D [103 0 R /XYZ null 298 null] >> endobj 116 0 obj << /D [103 0 R /XYZ null 280 null] >> endobj 117 0 obj << /D [103 0 R /XYZ null 268 null] >> endobj 118 0 obj << /D [103 0 R /XYZ null 244 null] >> endobj 119 0 obj << /D [103 0 R /XYZ null 232 null] >> endobj 120 0 obj << /D [103 0 R /XYZ null 221 null] >> endobj 121 0 obj << /D [103 0 R /XYZ null 210 null] >> endobj 122 0 obj << /D [103 0 R /XYZ null 199 null] >> endobj 123 0 obj << /D [103 0 R /XYZ null 188 null] >> endobj 124 0 obj << /D [103 0 R /XYZ null 176 null] >> endobj 125 0 obj << /D [103 0 R /XYZ null 165 null] >> endobj 126 0 obj << /D [103 0 R /XYZ null 153 null] >> endobj 127 0 obj << /D [103 0 R /XYZ null 140 null] >> endobj 128 0 obj << /D [103 0 R /XYZ null 128 null] >> endobj 129 0 obj << /D [103 0 R /XYZ null 116 null] >> endobj 130 0 obj << /D [103 0 R /XYZ null 104 null] >> endobj 131 0 obj << /D [103 0 R /XYZ null 92 null] >> endobj 132 0 obj << /D [103 0 R /XYZ null null null] >> endobj 100 0 obj << /P 81 0 R /R [63 63 549 729] /V 74 0 R /N 133 0 R >> endobj 134 0 obj << /Length 4470 /Filter /FlateDecode >> stream HW]ۺ}GU(q6] ]7BkӶYRe9/ʲ7(Xp8Μ9(UqT&i*Pχb5vPM&+KqR+N̑~)U#~7FǣV>2&7~l"t߿C๮bS\8ɱʸ{8)εT6Lo\% rp[S8C4wpJ4IEiũUڏ .yeat'V%|Vn"ʹGB{Ꮪo<"g2}T"oh؀^&56u6ڱ*ˮGuy̆-g^'pV'D/7HP&E:?Q1(՞tpa |M{V5- i,gz^,U`@ Bm<LMo$G[ş ePq[p5&m@nk.; 14z g%M1"qc,y3dm~}'vZԀ ЗbR{ 00(: Pv$Z,1FNdtLdlSIeȗj6"%I!.N/!R!V2@,BJB=A̻ u#!2.AHwðԫWzf!S5)EW䇀'.Z$A GG/,wkQ=|7f:<7_H azlrϋ$ /o FcFFwG$3W 0DjnZY:|wqB&T(> s9 9n7#Q gz't=&v{RHmd \!Ѓ]?D_zɋ۬AW!> XT=[H9Iu'RCzĮC3wFK!SB,[j QɱJ#-A 1W.v,eb~?<~ !6tAJMLv\oL p&T!n :vrǠ8*H, v{$1UW`طeE9AIOd^!}sWP-dJ?`I! yqJJ&! 7/ D['8b?%O8rҡCQ SO,#%C=Rh1#>:uitET^*CJhq`5iȊB f]7" @xNP04tm7]` ws.6 /` P "Si 0Y4$fu\$]i#F^x=x{Yg 4EHF^x ͖jfOzxOO_:3ІZ_+Sу*Bd&.XNrvJ^Tjj{NdSN6ǰ`pFT\ -"x`pH uHзڒ\!cBҾ嬛T l<9 J7rn'2TAd^.&f/u4MeK\sVg0{/#NP&x?.s2 HfI>9r?@ŚP**Ze3yz  f ?re=>,(uMvV82D" 'z."Nc.CK+IQ@ qrͥח;L֙gx9 wWO07V5ĦᡡH(Ro<#[1^ϴ&}Ʀ@@N!׿~HEQ[6,{>@2Q~;DGŅR\< hnB}W׮Mg=gPYîĠu\7qă)B^ψKpW},?0f(PIBfC-4Od+z^-}ly'V[2&c)D /hbV(-) P86]/TJ^|".2jez._5Cf˙e4{cI.IJ=R8ٸ(r΍kj`5!H{Itnp[ͷ( 󑏝(YksЮz4x LK;oZKj&|(cM aRCpJDam ÈSM 0Ki0|7,`Ib%NYsqp +QU8TZ]#V􏆨qR|m{=JA-kS$/I=0hUH@ E{̊>lM-73;J"DgQ p_7N?x܎Sr'e(qT zΔ] k^*菕' g?P܈bf~~/=>5#ő:viQRk :\8^gྚL5}WOP ϾXǞD k {Bbw>ĔU`sDIj0gK>ZLZ8 >'4s!}mƌLBUxtkN4ʔ) tz:ds+Lhti.' Ƌ$r}Jwtv!c=ATրݎqKv=D\[ژ5!YLt ­Z̐J9^ev=-I3c"8'͇ʾyZFCJ6(9y|\J &#?mf~~|ú NmُX6? DRCDeHD=QfgS:kZj0*67܉Yec/lF1,ͺ0Pr,yk}LkBŸ`3LXZٰpʱ1AHA q P2H ;+I[ƈaee;jiʍl%HJ92W E 13GdBS6an nxV,{+:ބ0] 4|]%9"CBx'aY*hފ%FG5`؀zl_|{ v6\o' ˨+9G&fn"frM2z<'["uΆkVdyoRNrp!Gz5/'SKħli.{ikd՟/I{)'F;c- >4 {Wƃ$KH[%HzlޣY{WѤk;ۆm> $_xf@R>@hq]0|iy&~Q[q3sMܤ2'<)c:HƍdX ӰH$ }K%z-C׷ 'IQ$!pJR8sἛD"xEv4NI.V13֗tQ~"ex#CMo2@Oӟo. endstream endobj 135 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 137 0 obj << /D [136 0 R /XYZ null 730 null] >> endobj 138 0 obj << /D [136 0 R /XYZ null 718 null] >> endobj 139 0 obj << /D [136 0 R /XYZ null 706 null] >> endobj 140 0 obj << /D [136 0 R /XYZ null 694 null] >> endobj 141 0 obj << /D [136 0 R /XYZ null 681 null] >> endobj 142 0 obj << /D [136 0 R /XYZ null 657 null] >> endobj 143 0 obj << /D [136 0 R /XYZ null 646 null] >> endobj 144 0 obj << /D [136 0 R /XYZ null 635 null] >> endobj 145 0 obj << /D [136 0 R /XYZ null 623 null] >> endobj 146 0 obj << /D [136 0 R /XYZ null 612 null] >> endobj 147 0 obj << /D [136 0 R /XYZ null 601 null] >> endobj 148 0 obj << /D [136 0 R /XYZ null 590 null] >> endobj 149 0 obj << /D [136 0 R /XYZ null 578 null] >> endobj 150 0 obj << /D [136 0 R /XYZ null 566 null] >> endobj 151 0 obj << /D [136 0 R /XYZ null 554 null] >> endobj 152 0 obj << /D [136 0 R /XYZ null 541 null] >> endobj 153 0 obj << /D [136 0 R /XYZ null 529 null] >> endobj 154 0 obj << /D [136 0 R /XYZ null 517 null] >> endobj 155 0 obj << /D [136 0 R /XYZ null 505 null] >> endobj 156 0 obj << /D [136 0 R /XYZ null 493 null] >> endobj 157 0 obj << /D [136 0 R /XYZ null 475 null] >> endobj 158 0 obj << /D [136 0 R /XYZ null 456 null] >> endobj 159 0 obj << /D [136 0 R /XYZ null 432 null] >> endobj 160 0 obj << /D [136 0 R /XYZ null 408 null] >> endobj 161 0 obj << /D [136 0 R /XYZ null 396 null] >> endobj 162 0 obj << /D [136 0 R /XYZ null 384 null] >> endobj 163 0 obj << /D [136 0 R /XYZ null 371 null] >> endobj 164 0 obj << /D [136 0 R /XYZ null 359 null] >> endobj 165 0 obj << /D [136 0 R /XYZ null 347 null] >> endobj 166 0 obj << /D [136 0 R /XYZ null 323 null] >> endobj 167 0 obj << /D [136 0 R /XYZ null 311 null] >> endobj 168 0 obj << /D [136 0 R /XYZ null 299 null] >> endobj 169 0 obj << /D [136 0 R /XYZ null 286 null] >> endobj 170 0 obj << /D [136 0 R /XYZ null 274 null] >> endobj 171 0 obj << /D [136 0 R /XYZ null 262 null] >> endobj 172 0 obj << /D [136 0 R /XYZ null 250 null] >> endobj 173 0 obj << /D [136 0 R /XYZ null 238 null] >> endobj 174 0 obj << /D [136 0 R /XYZ null 214 null] >> endobj 175 0 obj << /D [136 0 R /XYZ null 189 null] >> endobj 176 0 obj << /D [136 0 R /XYZ null 177 null] >> endobj 177 0 obj << /D [136 0 R /XYZ null 165 null] >> endobj 178 0 obj << /D [136 0 R /XYZ null 153 null] >> endobj 179 0 obj << /D [136 0 R /XYZ null 141 null] >> endobj 180 0 obj << /D [136 0 R /XYZ null 128 null] >> endobj 181 0 obj << /D [136 0 R /XYZ null 104 null] >> endobj 182 0 obj << /D [136 0 R /XYZ null 92 null] >> endobj 183 0 obj << /D [136 0 R /XYZ null null null] >> endobj 133 0 obj << /P 103 0 R /R [63 63 549 729] /V 100 0 R /N 184 0 R >> endobj 185 0 obj << /Length 3828 /Filter /FlateDecode >> stream HWn8}Qn3Ox&Nc^%nɫV{ ߷.dK€[dԩ__M %_2ODS2O|U `5KW^+i,TRGQ$DY 5MB+UY-ouW]V5<- 6<Ե%?̿o},Z99#Ml-nq-'T2 H̔ Uoe|_7~.3g~] =[$9O d#lʔoh*+@޲g3zӻ/x6ev'3]mæcы+u ^t*BW8vLpW^oH6nKܒ 9jcvC]in}ѷb{}mAbO8Q#fwYܿf} .wёsiې\cHX˦gaʴ 19шU$bRG\0a8%Aٟa@38?A(O@(109,@;S\v7Ʈ 8̼qZj @uܭ.y\L!Qɫ#o":_bM]Hs^x̵>V/ VA萖{T >nxޅK xYG)n=h09p}GqJJx&eBRc AybaS%beHJdEZj28T+lEAޜ?/pH u.fDK"Yd%yl~k_pī@R ![EaZ?f[#/W[6+1Xٝ!*=Ap6!lxdk6;Vcn9J ֞Z?.As=}.DcyK2zOduI$Ue9Vwv-s:̾M4.bp e2 N/l)xr \OX.6m/V<%ga;d˴Ҋ e,̰JL+Ԁ&d> r7Z4-XC/t]JD{Lt, kVK+(/S#[̺G"AB/@*f +$k~BR^ $eBC扟7ӳi8IhNo0+{ӈ;P#B:;RȻ|;4v${ylLbVXq=p#4KCĚ6EJ XwM@*{Iѣw<(ǣ'p-{$ u 8 J6djMEL9i9bcWLf*p| % rm}YCPV)%G!j;|eBQ\ѩf$Um5<A?Zyl=ǓFlQst8%e y+4e+dr'Q= !vT30~yab_ b F\6nM^! ~Xn: I.qYN/+CTVblJ$sΏ9fy6T|Ox-HXn̉-?ַ_"jt\oâ%{ߐIl3oқ6UvoiSU9ThT-K#g)fl,j x׻ٙ<y߿\VT#ͱ1DdݑMKav9+^>J +%hB>tYOrscXf^s>q4X#=~R؃mϱ0^z-א0?NV159k;@Nbny輌r6iUf]>t:9ִx4ʉc=B=moPͷv˒ bȑRdZ8( D 8($NQL UD:29)%\ +(zGQ8 $CT75Y.&J \%Fky&2:Ѣe{+$jWG?ۓJq(du:"H), tP~ ~e)rM%\lO8*ygg>ƧpD OtKt\:]E%+ )S gͻgOvL2%7tt#ha)fQx6 (C wo%_s Y;WlEO/`6Cd]N#`m]Km52x9gPu'J9Hk`L.pO3C>%\_v6GpJ> /ExtGState << /GS1 23 0 R >> >> endobj 188 0 obj << /D [187 0 R /XYZ null 730 null] >> endobj 189 0 obj << /D [187 0 R /XYZ null 718 null] >> endobj 190 0 obj << /D [187 0 R /XYZ null 706 null] >> endobj 191 0 obj << /D [187 0 R /XYZ null 694 null] >> endobj 192 0 obj << /D [187 0 R /XYZ null 675 null] >> endobj 193 0 obj << /D [187 0 R /XYZ null 657 null] >> endobj 194 0 obj << /D [187 0 R /XYZ null 645 null] >> endobj 195 0 obj << /D [187 0 R /XYZ null 621 null] >> endobj 196 0 obj << /D [187 0 R /XYZ null 609 null] >> endobj 197 0 obj << /D [187 0 R /XYZ null 596 null] >> endobj 198 0 obj << /D [187 0 R /XYZ null 584 null] >> endobj 199 0 obj << /D [187 0 R /XYZ null 572 null] >> endobj 200 0 obj << /D [187 0 R /XYZ null 560 null] >> endobj 201 0 obj << /D [187 0 R /XYZ null 548 null] >> endobj 202 0 obj << /D [187 0 R /XYZ null 536 null] >> endobj 203 0 obj << /D [187 0 R /XYZ null 524 null] >> endobj 204 0 obj << /D [187 0 R /XYZ null 511 null] >> endobj 205 0 obj << /D [187 0 R /XYZ null 499 null] >> endobj 206 0 obj << /D [187 0 R /XYZ null 475 null] >> endobj 207 0 obj << /D [187 0 R /XYZ null 463 null] >> endobj 208 0 obj << /D [187 0 R /XYZ null 451 null] >> endobj 209 0 obj << /D [187 0 R /XYZ null 438 null] >> endobj 210 0 obj << /D [187 0 R /XYZ null 426 null] >> endobj 211 0 obj << /D [187 0 R /XYZ null 414 null] >> endobj 212 0 obj << /D [187 0 R /XYZ null 402 null] >> endobj 213 0 obj << /D [187 0 R /XYZ null 390 null] >> endobj 214 0 obj << /D [187 0 R /XYZ null 378 null] >> endobj 215 0 obj << /D [187 0 R /XYZ null 359 null] >> endobj 216 0 obj << /D [187 0 R /XYZ null 341 null] >> endobj 217 0 obj << /D [187 0 R /XYZ null 317 null] >> endobj 218 0 obj << /D [187 0 R /XYZ null 293 null] >> endobj 219 0 obj << /D [187 0 R /XYZ null 281 null] >> endobj 220 0 obj << /D [187 0 R /XYZ null 270 null] >> endobj 221 0 obj << /D [187 0 R /XYZ null 259 null] >> endobj 222 0 obj << /D [187 0 R /XYZ null 248 null] >> endobj 223 0 obj << /D [187 0 R /XYZ null 237 null] >> endobj 224 0 obj << /D [187 0 R /XYZ null 225 null] >> endobj 225 0 obj << /D [187 0 R /XYZ null 214 null] >> endobj 226 0 obj << /D [187 0 R /XYZ null 201 null] >> endobj 227 0 obj << /D [187 0 R /XYZ null 189 null] >> endobj 228 0 obj << /D [187 0 R /XYZ null 177 null] >> endobj 229 0 obj << /D [187 0 R /XYZ null 165 null] >> endobj 230 0 obj << /D [187 0 R /XYZ null 153 null] >> endobj 231 0 obj << /D [187 0 R /XYZ null 141 null] >> endobj 232 0 obj << /D [187 0 R /XYZ null 116 null] >> endobj 233 0 obj << /D [187 0 R /XYZ null 104 null] >> endobj 234 0 obj << /D [187 0 R /XYZ null 92 null] >> endobj 235 0 obj << /D [187 0 R /XYZ null null null] >> endobj 184 0 obj << /P 136 0 R /R [63 63 549 729] /V 133 0 R /N 236 0 R >> endobj 237 0 obj << /Length 2996 /Filter /FlateDecode >> stream HWm۸ t%-9$!1%[,uk[,n33-y{rAXSp8|Ͼ(r?OT<ȏS~@M!Q5} GϼLA"i`r? d~`X !A~>F'~zԃ7\`Sß0ۚ-6+G>HYLyu/cyݦ% ^# tB}܌FZ0QN Co3OXd9`X8Us_D~Dh7(:x3.. |ՕQ5WQ7LQ=+eM͖1UR-Ɖh=0p@ b*6,xgW:A{WϼՃaoI{u!XΰJU-ZMHLp"Hj{ ,qԆg!mBoLQD4R%ݹ?[6û7?oHysх ut/ԪF7zѣBAajoZWٞ6oGrJ= F]oclAvL5x1"a6pCpM&5U uDqg܏ \_(Q|ח#\$p%_;D!5U1q/3ABr4,Pu\X)&\6\30>^r]i,Z1uoN1mFWAFyxG%֋w f)z9"kFqêPXXࣨϷz1F;-B6@~Mw( E&ȶ#N-16Sk)UsRqRT1O m T:7k 뛕蔓(ZQvDDEsw 7Tڒu,*\Z(uIDfv::K Zwv^ra^qPV5ŕ,{,LppzQz3jԿDu(D2qjj_8ݚnk s/{sކ &qL 2J]D:YH׮kj"Qb$唫j7ޔ"-yy|&!_آчxwʞ#pp_3J!̽y:'!>+TA'視%8 ;Y&8f!#C?; f]׺w |;۱M]b:8C SG NŶ͟yN,Fj]G۩zy6H޵=8[oq._s5f$,7hA-ږn|DAy=u7 WH d'~ Ⱥؾ)XX 㥆$A7[c$6OauxSp*{ټx皡ǃtwŕ̻6 lH`Ga61rE+dNy?TAf\gDžf~wje]ꈞMxRsVUrz%%ZHݰ1ݫ :fo QS{R9Ab\FM P~\ `QtiJ'w\qiunQ+iKVnj*uWb4%7/rL{RR@&} 6Zd?$ 0> /ExtGState << /GS1 23 0 R >> >> endobj 240 0 obj << /D [239 0 R /XYZ null 730 null] >> endobj 241 0 obj << /D [239 0 R /XYZ null 718 null] >> endobj 242 0 obj << /D [239 0 R /XYZ null 706 null] >> endobj 243 0 obj << /D [239 0 R /XYZ null 694 null] >> endobj 244 0 obj << /D [239 0 R /XYZ null 682 null] >> endobj 245 0 obj << /D [239 0 R /XYZ null 670 null] >> endobj 246 0 obj << /D [239 0 R /XYZ null 652 null] >> endobj 247 0 obj << /D [239 0 R /XYZ null 634 null] >> endobj 248 0 obj << /D [239 0 R /XYZ null 598 null] >> endobj 249 0 obj << /D [239 0 R /XYZ null 574 null] >> endobj 250 0 obj << /D [239 0 R /XYZ null 562 null] >> endobj 251 0 obj << /D [239 0 R /XYZ null 550 null] >> endobj 252 0 obj << /D [239 0 R /XYZ null 538 null] >> endobj 253 0 obj << /D [239 0 R /XYZ null 526 null] >> endobj 254 0 obj << /D [239 0 R /XYZ null 513 null] >> endobj 255 0 obj << /D [239 0 R /XYZ null 501 null] >> endobj 256 0 obj << /D [239 0 R /XYZ null 489 null] >> endobj 257 0 obj << /D [239 0 R /XYZ null 477 null] >> endobj 258 0 obj << /D [239 0 R /XYZ null 465 null] >> endobj 259 0 obj << /D [239 0 R /XYZ null 453 null] >> endobj 260 0 obj << /D [239 0 R /XYZ null 429 null] >> endobj 261 0 obj << /D [239 0 R /XYZ null 417 null] >> endobj 262 0 obj << /D [239 0 R /XYZ null 405 null] >> endobj 263 0 obj << /D [239 0 R /XYZ null 393 null] >> endobj 264 0 obj << /D [239 0 R /XYZ null 381 null] >> endobj 265 0 obj << /D [239 0 R /XYZ null 369 null] >> endobj 266 0 obj << /D [239 0 R /XYZ null 351 null] >> endobj 267 0 obj << /D [239 0 R /XYZ null 333 null] >> endobj 268 0 obj << /D [239 0 R /XYZ null 321 null] >> endobj 269 0 obj << /D [239 0 R /XYZ null 297 null] >> endobj 270 0 obj << /D [239 0 R /XYZ null 285 null] >> endobj 271 0 obj << /D [239 0 R /XYZ null 273 null] >> endobj 272 0 obj << /D [239 0 R /XYZ null 261 null] >> endobj 273 0 obj << /D [239 0 R /XYZ null 249 null] >> endobj 274 0 obj << /D [239 0 R /XYZ null 237 null] >> endobj 275 0 obj << /D [239 0 R /XYZ null 224 null] >> endobj 276 0 obj << /D [239 0 R /XYZ null 212 null] >> endobj 277 0 obj << /D [239 0 R /XYZ null 200 null] >> endobj 278 0 obj << /D [239 0 R /XYZ null 188 null] >> endobj 279 0 obj << /D [239 0 R /XYZ null 176 null] >> endobj 280 0 obj << /D [239 0 R /XYZ null 158 null] >> endobj 281 0 obj << /D [239 0 R /XYZ null 140 null] >> endobj 282 0 obj << /D [239 0 R /XYZ null 128 null] >> endobj 283 0 obj << /D [239 0 R /XYZ null 104 null] >> endobj 284 0 obj << /D [239 0 R /XYZ null 92 null] >> endobj 285 0 obj << /D [239 0 R /XYZ null null null] >> endobj 236 0 obj << /P 187 0 R /R [63 63 549 729] /V 184 0 R /N 286 0 R >> endobj 287 0 obj << /Length 3522 /Filter /FlateDecode >> stream HW[o:~/G*눺plmO"ӎve+I΅|imi"pofލ^J_~ "?DE&Fׯ1߿*1[ר_77 ȏCw-Iɡ 4c0ŏ CAN܃lͳ tx/DKSz"8,>wPc2m0%:?",jKAw D^xy_p,P`st1s{v*Jaɇ9g"9,_$X!~Y@D]rP@ l^cw՝Πvy!yC@{dWbGm ¶%ĹicG+I$XIȸ̨4BNj&2 T#,YF6q45Xu6 #,{I׆K9nўiLj[AƘ|GVWӶI]΢[&٣W@bT&VЕCv<0Pڷ:k 8eV'tO0uos( P[%y"Z;EuU'OPabb^5@1 lJ4k-'n~ۚt/Yiң*ȷɺBRSusQ*;* d \hDtkj .ga1eROא3N7d Xq dc@!8P` 5P2j3}dc^"e.Ytk/ ~6(`*P/ w92Gjbqz;ZuٵH^rk/k^H*/h1 O*6 a8GAf_KhL=g^ͥiX-Ț/$E KQ Y+B,k"v9% 1Nn{0K<i7vL4I#W[#g:F=\T1V aQanwn ʲb쁒hJQ[)WoiM!U WEo^xH< }ᾨ{"skc݋hxTAR ilö Y(pCRTn2 _#v'?8Fuqyq$gnTg7X/} OrصKw.6!b"ڋ͋M+vzY,\,|jKʍMhiT0$sn~H?څ:J{zG?"m$$`9ؕX-GM"m~lim8x<Z#,Q3 ×>Wmw_oqݵ /ÃrӞɇD[=ކ߾S>PB?0U7&|:H>-?ݟG!@5CtNGZW#!O RE=}{:j12).#.~OM9(cGnuwj2ev84C(&a-]b+B[)uZ.`USw>WN WA*y6q P2%sD9`>ЬjΑ0xG$F-P5;K@&h$ ѥҪn,Sg5ڐ8s7[-Dj%MIZQd+0ͥ<K%y3@ot[,|*J + 喭-òcZ\ނMr^YIXR[R_;wU1\W(rSN=-+)BAo%fzѶ,_ XnL?.!dnGuP3k S=W46~%EUDCګa(#mWMQ3-4@#k4v!&D'a h)H 4/%Q k}i7$^I@eF*<#uH-;-IB63;5vOEV, Ru+qi5s^iZ7IC+ JwlNd#oU endstream endobj 288 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 290 0 obj << /D [289 0 R /XYZ null 730 null] >> endobj 291 0 obj << /D [289 0 R /XYZ null 718 null] >> endobj 292 0 obj << /D [289 0 R /XYZ null 688 null] >> endobj 293 0 obj << /D [289 0 R /XYZ null 670 null] >> endobj 294 0 obj << /D [289 0 R /XYZ null 658 null] >> endobj 295 0 obj << /D [289 0 R /XYZ null 622 null] >> endobj 296 0 obj << /D [289 0 R /XYZ null 610 null] >> endobj 297 0 obj << /D [289 0 R /XYZ null 598 null] >> endobj 298 0 obj << /D [289 0 R /XYZ null 586 null] >> endobj 299 0 obj << /D [289 0 R /XYZ null 574 null] >> endobj 300 0 obj << /D [289 0 R /XYZ null 562 null] >> endobj 301 0 obj << /D [289 0 R /XYZ null 550 null] >> endobj 302 0 obj << /D [289 0 R /XYZ null 538 null] >> endobj 303 0 obj << /D [289 0 R /XYZ null 526 null] >> endobj 304 0 obj << /D [289 0 R /XYZ null 513 null] >> endobj 305 0 obj << /D [289 0 R /XYZ null 501 null] >> endobj 306 0 obj << /D [289 0 R /XYZ null 489 null] >> endobj 307 0 obj << /D [289 0 R /XYZ null 477 null] >> endobj 308 0 obj << /D [289 0 R /XYZ null 465 null] >> endobj 309 0 obj << /D [289 0 R /XYZ null 453 null] >> endobj 310 0 obj << /D [289 0 R /XYZ null 441 null] >> endobj 311 0 obj << /D [289 0 R /XYZ null 429 null] >> endobj 312 0 obj << /D [289 0 R /XYZ null 417 null] >> endobj 313 0 obj << /D [289 0 R /XYZ null 405 null] >> endobj 314 0 obj << /D [289 0 R /XYZ null 393 null] >> endobj 315 0 obj << /D [289 0 R /XYZ null 381 null] >> endobj 316 0 obj << /D [289 0 R /XYZ null 369 null] >> endobj 317 0 obj << /D [289 0 R /XYZ null 345 null] >> endobj 318 0 obj << /D [289 0 R /XYZ null 333 null] >> endobj 319 0 obj << /D [289 0 R /XYZ null 321 null] >> endobj 320 0 obj << /D [289 0 R /XYZ null 303 null] >> endobj 321 0 obj << /D [289 0 R /XYZ null 285 null] >> endobj 322 0 obj << /D [289 0 R /XYZ null 273 null] >> endobj 323 0 obj << /D [289 0 R /XYZ null 249 null] >> endobj 324 0 obj << /D [289 0 R /XYZ null 237 null] >> endobj 325 0 obj << /D [289 0 R /XYZ null 225 null] >> endobj 326 0 obj << /D [289 0 R /XYZ null 212 null] >> endobj 327 0 obj << /D [289 0 R /XYZ null 200 null] >> endobj 328 0 obj << /D [289 0 R /XYZ null 188 null] >> endobj 329 0 obj << /D [289 0 R /XYZ null 176 null] >> endobj 330 0 obj << /D [289 0 R /XYZ null 164 null] >> endobj 331 0 obj << /D [289 0 R /XYZ null 152 null] >> endobj 332 0 obj << /D [289 0 R /XYZ null 140 null] >> endobj 333 0 obj << /D [289 0 R /XYZ null 128 null] >> endobj 334 0 obj << /D [289 0 R /XYZ null 116 null] >> endobj 335 0 obj << /D [289 0 R /XYZ null 104 null] >> endobj 336 0 obj << /D [289 0 R /XYZ null 92 null] >> endobj 337 0 obj << /D [289 0 R /XYZ null null null] >> endobj 286 0 obj << /P 239 0 R /R [63 63 549 729] /V 236 0 R /N 338 0 R >> endobj 339 0 obj << /Length 2891 /Filter /FlateDecode >> stream HWmoF a?.#rR>y9PEEѶ߼쒢$[n.ERH3x쇷J(z,DG:TAh6AP\>(q[XϟIz*#,"ɂP#yCӎP,?( ^x"YߨQ[*T _JQHG˃Lvϖ^KHV?:ez:H8;I a`L;8*T$s?y~$./[/ ,=b*|p=)7$Rзk[p~) HúEmbpC{ko>t=eA`1:QGv y(h;)a\ 1G.˲DS{Mߵ*qx0s|Ȥr@Dk1[Vr,A gUpXy*k+0Jڥ}:~yN |Mh[+k 2zu8Ơ lXϏ= "~`r;`PJYtD7lo}tI@%P≔RJ`Fp-"ЇP觥=MSg*ƫ=RCf7TVv _ ^~wdF'9' 1փdQ aahE١0+/CAWD+Cb2d o acc%&Z\|?JDA6Ʈ޷@@Cy[fLJ`@:oŲk@_J {)WHwekP3>ALtU]ěvА\p_ v&QG*;_Om^}Mω{J_hy¼UlE_@rjVF❞@؞Rkеa:9afAy$5I!tdy86&j\z8</gJ]nYV7 Xx$Y+$Ԁ=K8yMgt,qx@ba9;4EFIu:!0T6 bآnKʠ/DܥRU5(gb;f.a;J1#lj  I*hcMJQO+|a|`+ J#H{ko#1HPXe⛖)syOLek0!)zXf %HEg 2'/Q.Gm24Ev54=@qr [_ ,m֬aȼ%+ox~i~MLW/d;o{o7Vv (l MQN0qncz>rgsqgTv-Jt)=Ls񧍀'zK6x[h{/ɧ(olO޲! qm n]7!eĶdsAXug&(LG9gS3Mt h]6jƯe1#PaK]>sei1c9o09BE;!?WC4zǿ@M5VG#Hf b`O @4 s++ؚfUF Ql19mƤ V>^U*fp!l#M;XqP8y:Lm*.EZuU}]+&cjP*h WqLVqQf1c)b%ݬC$TR* YfI?T*0W 3BzcXUaFEl kx( &|,(*Y4V- jĿP02v*HoV =`A*(H䀥sA)5Ԁ!FFAU[_(ս䔾3{ endstream endobj 340 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F3 22 0 R /F4 54 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 342 0 obj << /D [341 0 R /XYZ null 730 null] >> endobj 343 0 obj << /D [341 0 R /XYZ null 712 null] >> endobj 344 0 obj << /D [341 0 R /XYZ null 700 null] >> endobj 345 0 obj << /D [341 0 R /XYZ null 676 null] >> endobj 346 0 obj << /D [341 0 R /XYZ null 664 null] >> endobj 347 0 obj << /D [341 0 R /XYZ null 652 null] >> endobj 348 0 obj << /D [341 0 R /XYZ null 628 null] >> endobj 349 0 obj << /D [341 0 R /XYZ null 616 null] >> endobj 350 0 obj << /D [341 0 R /XYZ null 604 null] >> endobj 351 0 obj << /D [341 0 R /XYZ null 579 null] >> endobj 352 0 obj << /D [341 0 R /XYZ null 557 null] >> endobj 353 0 obj << /D [341 0 R /XYZ null 539 null] >> endobj 354 0 obj << /D [341 0 R /XYZ null 497 null] >> endobj 355 0 obj << /D [341 0 R /XYZ null 479 null] >> endobj 356 0 obj << /D [341 0 R /XYZ null 461 null] >> endobj 357 0 obj << /D [341 0 R /XYZ null 431 null] >> endobj 358 0 obj << /D [341 0 R /XYZ null 413 null] >> endobj 359 0 obj << /D [341 0 R /XYZ null null null] >> endobj 360 0 obj << /D [341 0 R /XYZ null null null] >> endobj 338 0 obj << /P 289 0 R /R [63 63 549 729] /V 286 0 R /N 361 0 R >> endobj 370 0 obj << /Length 3140 /Filter /FlateDecode >> stream HWKs8"D>@x<=ѬoM%q#J6~EQd*~~xx~F8??˃? *͂X SE|G<0/~0.UU4 sW.V6Wk?vn*L)( ec*q>L]OnƊOޓE"gxewY2~ Æ&^uq*\̆ȘW Ei9S,D^Ob*__dyDʊ',^3Dzо~"եA{o ^zw}_ 4paTY4!j⋬3" ^7&"ׄ b0M&p_5O+sGYb1In^1rcA"89=F0s5s"h ,رA༤F &%_)iهFj#<"R88Z+4Z9Xx9Q+dLhE Dpx!ÉFG4E_U&pX ^9MМP@Sgh@Cxzw6mן{q VrGlnLHtxҪnH!07G:OU]Q 1?~v<xMеݓW.NbQM@^d0B١\yy phfsp(JNu hUS ~B sBWC:UR('!;CRFQ GG@x C29{U(M0Yv1B"j)"{2֪RpB ^E蠥^0p\`x5in~&bT=QL`m=zF`<&H}C`<&=恙R@l q*BT1zjM5? >j|zPu{׾rrSC4}ntޢ"⇰ ds&y +AS9ec';*Uo?]=vMY1>zg^x?&'5wjءPSB_ lQ--dBj#mAݲz8ڎ7mョc5DR7x}ءX gIy4jfFe1hcZd)c;;P J'uf߿c 78}5 ԣHջ-8Vj0j%yM1r(6E{ߥ;mT,+\d^"xC3W$$ EYQѕKn2wgulb|:Q1/:>z9b7"X\bG Ov4a^ N^BӛтY{<ƑcSL4z9MؑOrtDo]=TS}L[ =ju4"dMirn-A:̻cQE +>ɖ?+Iw@'O4b%0Jذ-9sk5+ >Yt=++:rZqd(8Maz^sШGVRK߀rv DhٮqĝӄtǢp@@k48yKFu+3 _͋Y\w1dnhLR˞FN˩&s\cE DS ]jJo`aN]0@"Sfȅ qBPbI<)7&o%A&N-xHf~utp\eG` 1?y}B /ĺ'#{,d{;AKJ b<4$gvIT-Rhunv|(ɪZ3 Ě )Hcw)4J};Ց}t 󇬚Bu)eWe*FZdwQ3K@OH;lj節HݚCB^k.hI ٫`eDjf)k. |VR|xY(X _p4'Mp1o .ևb;S!RoAgIDTu/IC#=4.N.65T_vhY ٟ l9]&ȰN.asQ%|Ŋt&pw.ThKѝ g\R-бuZ+$'yȹ9&YZ$Ve376aPp{̈3yCYqIFg,?N-̤$FI,6JVi5r:5!k*J4K͹3BB@k OhnKJ.x!<6 u2AU. ;ĉTmj;\<<۬icoGA[b!`%nã{j^,8u*-(Z+DjCe ƟV=ϗq=FT&'*oA4W6Ǟ\!i4SyשeTԷK޵zP(op[$DDNڶ6 (:%ڑ4ը9TR*h (Bg+Wmhݱ77? endstream endobj 371 0 obj << /ProcSet [/PDF /Text ] /Font << /F1 20 0 R /F2 21 0 R /F3 22 0 R /F4 54 0 R /F5 372 0 R >> /ExtGState << /GS1 23 0 R >> >> endobj 375 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 77 0 obj << /Type /Pattern /PatternType 1 /Resources 375 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 102 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(00¼\@偼\a endstream endobj 376 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 78 0 obj << /Type /Pattern /PatternType 1 /Resources 376 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 99 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(C/+Py /@E7 endstream endobj 377 0 obj << /ProcSet [/PDF /ImageB ] /ExtGState << /GS1 23 0 R >> >> endobj 79 0 obj << /Type /Pattern /PatternType 1 /Resources 377 0 R /Matrix [0.96 0 0 -0.96 9.45 773.85] /PaintType 1 /TilingType 1 /BBox [0 0 1 1] /XStep 1 /YStep 1 /Length 104 /Filter /FlateDecode >> stream H2T0¢t^.}`Cb^..P4+ AB^.C0GD*$r9y+XI0`=}JJFx(|o?< d endstream endobj 378 0 obj << /Type /Halftone /HalftoneType 1 /HalftoneName (Default) /Frequency 60 /Angle 45 /SpotFunction /Round >> endobj 23 0 obj << /Type /ExtGState /SA false /OP false /HT /Default >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Times-Roman >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold >> endobj 22 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Times-Italic >> endobj 54 0 obj << /Type /Font /Subtype /Type1 /Name /F4 /BaseFont /Courier >> endobj 372 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /Encoding 379 0 R /BaseFont /Times-Roman >> endobj 379 0 obj << /Type /Encoding /Differences [ 0/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis /ring/cedilla/hungarumlaut/ogonek/caron/dotlessi/fi/fl /Lslash/lslash/Zcaron/zcaron/minus 39/quotesingle 96/grave 130/quotesinglbase /florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron /guilsinglleft/OE 145/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash /emdash/tilde/trademark/scaron/guilsinglright/oe 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright/ordfeminine 172/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu 183/periodcentered/cedilla /onesuperior/ordmasculine 188/onequarter/onehalf/threequarters 192/Agrave/Aacute/Acircumflex /Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex /Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve /Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute /Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex /atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex /edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve /oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute /ucircumflex/udieresis/yacute/thorn/ydieresis ] >> endobj 1 0 obj << /Type /Page /Parent 24 0 R /Resources 19 0 R /Contents 18 0 R /CropBox [0 0 612 791] /B [17 0 R] >> endobj 25 0 obj << /Type /Page /Parent 24 0 R /Resources 36 0 R /Contents 35 0 R /CropBox [0 0 612 791] /B [34 0 R] >> endobj 37 0 obj << /Type /Page /Parent 24 0 R /Resources 53 0 R /Contents 52 0 R /CropBox [0 0 612 791] /B [51 0 R] >> endobj 55 0 obj << /Type /Page /Parent 24 0 R /Resources 76 0 R /Contents 75 0 R /CropBox [0 0 612 791] /B [74 0 R] >> endobj 81 0 obj << /Type /Page /Parent 24 0 R /Resources 102 0 R /Contents 101 0 R /CropBox [0 0 612 791] /B [100 0 R] >> endobj 103 0 obj << /Type /Page /Parent 24 0 R /Resources 135 0 R /Contents 134 0 R /CropBox [0 0 612 791] /B [133 0 R] >> endobj 136 0 obj << /Type /Page /Parent 24 0 R /Resources 186 0 R /Contents 185 0 R /CropBox [0 0 612 791] /B [184 0 R] >> endobj 187 0 obj << /Type /Page /Parent 24 0 R /Resources 238 0 R /Contents 237 0 R /CropBox [0 0 612 791] /B [236 0 R] >> endobj 239 0 obj << /Type /Page /Parent 24 0 R /Resources 288 0 R /Contents 287 0 R /CropBox [0 0 612 791] /B [286 0 R] >> endobj 289 0 obj << /Type /Page /Parent 24 0 R /Resources 340 0 R /Contents 339 0 R /CropBox [0 0 612 791] /B [338 0 R] >> endobj 341 0 obj << /Type /Page /Parent 374 0 R /Resources 371 0 R /Contents 370 0 R /CropBox [0 0 612 791] /B [361 0 R] >> endobj 24 0 obj << /Type /Pages /Kids [1 0 R 25 0 R 37 0 R 55 0 R 81 0 R 103 0 R 136 0 R 187 0 R 239 0 R 289 0 R] /Count 10 /Parent 373 0 R >> endobj 374 0 obj << /Type /Pages /Kids [341 0 R] /Count 1 /Parent 373 0 R >> endobj 373 0 obj << /Type /Pages /Kids [24 0 R 374 0 R ] /Count 11 /MediaBox [0 0 612 792] >> endobj 380 0 obj << /Count 8 /First 362 0 R /Last 362 0 R >> endobj 362 0 obj << /Title (ARMCI: A Portable Aggregate Remote Memory Copy Interface) /Dest [1 0 R /XYZ null 737 null] /Parent 380 0 R /First 363 0 R /Last 369 0 R /Count 7 >> endobj 363 0 obj << /Title (Motivation and Background) /Dest [1 0 R /XYZ null 617 null] /Parent 362 0 R /Next 364 0 R >> endobj 364 0 obj << /Title (ARMCI Data Structures) /Dest [25 0 R /XYZ null 219 null] /Parent 362 0 R /Prev 363 0 R /Next 365 0 R >> endobj 365 0 obj << /Title (ARMCI Operations) /Dest [81 0 R /XYZ null 602 null] /Parent 362 0 R /Prev 364 0 R /Next 369 0 R /First 366 0 R /Last 368 0 R /Count 3 >> endobj 366 0 obj << /Title (Progress and ordering) /Dest [103 0 R /XYZ null 737 null] /Parent 365 0 R /Next 367 0 R >> endobj 367 0 obj << /Title (Memory allocation) /Dest [103 0 R /XYZ null 617 null] /Parent 365 0 R /Prev 366 0 R /Next 368 0 R >> endobj 368 0 obj << /Title (List of Operations) /Dest [103 0 R /XYZ null 406 null] /Parent 365 0 R /Prev 367 0 R >> endobj 369 0 obj << /Title (References) /Dest [341 0 R /XYZ null 587 null] /Parent 362 0 R /Prev 365 0 R >> endobj 361 0 obj << /P 341 0 R /R [63 63 549 729] /V 338 0 R /N 17 0 R >> endobj 17 0 obj << /T 16 0 R /P 1 0 R /R [63 63 549 729] /V 361 0 R /N 34 0 R >> endobj 381 0 obj [ 16 0 R ] endobj 382 0 obj << /Limits [(F) (G1000493)] /Names [(F) 15 0 R (G1000018) 174 0 R (G1000019) 175 0 R (G1000020) 176 0 R (G1000021) 177 0 R (G1000022) 178 0 R (G1000023) 179 0 R (G1000024) 180 0 R (G1000038) 217 0 R (G1000039) 218 0 R (G1000040) 219 0 R (G1000041) 220 0 R (G1000042) 221 0 R (G1000043) 222 0 R (G1000044) 223 0 R (G1000045) 224 0 R (G1000046) 225 0 R (G1000047) 226 0 R (G1000048) 232 0 R (G1000049) 233 0 R (G1000054) 227 0 R (G1000055) 228 0 R (G1000056) 229 0 R (G1000059) 231 0 R (G1000066) 230 0 R (G1000073) 234 0 R (G1000084) 182 0 R (G1000085) 188 0 R (G1000097) 167 0 R (G1000098) 168 0 R (G1000106) 152 0 R (G1000115) 128 0 R (G1000116) 129 0 R (G1000128) 248 0 R (G1000136) 249 0 R (G1000137) 250 0 R (G1000138) 251 0 R (G1000139) 252 0 R (G1000140) 253 0 R (G1000141) 254 0 R (G1000145) 262 0 R (G1000189) 255 0 R (G1000190) 256 0 R (G1000191) 257 0 R (G1000192) 258 0 R (G1000193) 259 0 R (G1000194) 261 0 R (G1000216) 260 0 R (G1000225) 181 0 R (G1000232) 166 0 R (G1000239) 344 0 R (G1000288) 323 0 R (G1000289) 324 0 R (G1000290) 325 0 R (G1000300) 322 0 R (G1000345) 346 0 R (G1000382) 347 0 R (G1000425) 348 0 R (G1000426) 349 0 R (G1000427) 350 0 R (G1000448) 331 0 R (G1000449) 332 0 R (G1000450) 333 0 R (G1000493) 291 0 R] >> endobj 383 0 obj << /Limits [(G1000504) (G1000923)] /Names [(G1000504) 281 0 R (G1000506) 290 0 R (G1000510) 282 0 R (G1000511) 283 0 R (G1000512) 284 0 R (G1000543) 279 0 R (G1000560) 268 0 R (G1000561) 269 0 R (G1000562) 270 0 R (G1000571) 271 0 R (G1000572) 272 0 R (G1000575) 275 0 R (G1000579) 276 0 R (G1000583) 277 0 R (G1000590) 278 0 R (G1000687) 70 0 R (G1000688) 112 0 R (G1000689) 139 0 R (G1000690) 137 0 R (G1000692) 156 0 R (G1000693) 171 0 R (G1000694) 172 0 R (G1000695) 191 0 R (G1000696) 242 0 R (G1000697) 265 0 R (G1000789) 215 0 R (G1000801) 204 0 R (G1000806) 203 0 R (G1000814) 193 0 R (G1000815) 194 0 R (G1000823) 195 0 R (G1000824) 196 0 R (G1000826) 197 0 R (G1000827) 198 0 R (G1000830) 199 0 R (G1000831) 200 0 R (G1000851) 214 0 R (G1000853) 205 0 R (G1000854) 206 0 R (G1000855) 207 0 R (G1000856) 208 0 R (G1000857) 209 0 R (G1000858) 210 0 R (G1000859) 211 0 R (G1000860) 212 0 R (G1000861) 213 0 R (G1000864) 345 0 R (G1000875) 201 0 R (G1000876) 202 0 R (G1000880) 240 0 R (G1000881) 241 0 R (G1000885) 130 0 R (G1000886) 131 0 R (G1000894) 153 0 R (G1000902) 154 0 R (G1000903) 155 0 R (G1000907) 169 0 R (G1000908) 170 0 R (G1000912) 189 0 R (G1000913) 190 0 R (G1000917) 263 0 R (G1000918) 264 0 R (G1000921) 329 0 R (G1000923) 327 0 R] >> endobj 384 0 obj << /Limits [(G1000924) (G997567)] /Names [(G1000924) 328 0 R (G1000936) 326 0 R (G1000943) 334 0 R (G1000944) 335 0 R (G1000945) 336 0 R (G1000961) 245 0 R (G1000981) 244 0 R (G1000990) 7 0 R (G1001002) 5 0 R (G1001005) 9 0 R (G1001022) 273 0 R (G1001023) 274 0 R (G1001046) 92 0 R (G1001056) 93 0 R (G1001064) 94 0 R (G1001067) 97 0 R (G1001075) 98 0 R (G1001098) 320 0 R (G1001104) 293 0 R (G1001107) 296 0 R (G1001108) 297 0 R (G1001109) 298 0 R (G1001110) 299 0 R (G1001111) 300 0 R (G1001126) 294 0 R (G1001127) 295 0 R (G1001134) 302 0 R (G1001135) 303 0 R (G1001136) 304 0 R (G1001139) 301 0 R (G1001145) 305 0 R (G1001146) 306 0 R (G1001147) 307 0 R (G1001153) 309 0 R (G1001154) 310 0 R (G1001155) 311 0 R (G1001162) 308 0 R (G1001180) 312 0 R (G1001181) 313 0 R (G1001193) 315 0 R (G1001194) 316 0 R (G1001195) 317 0 R (G1001196) 318 0 R (G1001197) 319 0 R (G1001205) 314 0 R (G997335) 3 0 R (G997338) 2 0 R (G997347) 4 0 R (G997358) 12 0 R (G997360) 28 0 R (G997371) 30 0 R (G997372) 31 0 R (G997378) 32 0 R (G997382) 38 0 R (G997383) 39 0 R (G997384) 40 0 R (G997385) 41 0 R (G997386) 42 0 R (G997387) 43 0 R (G997388) 47 0 R (G997390) 56 0 R (G997391) 57 0 R (G997394) 61 0 R (G997567) 59 0 R] >> endobj 385 0 obj << /Limits [(G997568) (G999785)] /Names [(G997568) 60 0 R (G997571) 62 0 R (G997581) 64 0 R (G997603) 157 0 R (G997604) 280 0 R (G997639) 115 0 R (G997658) 158 0 R (G997663) 192 0 R (G997665) 173 0 R (G997672) 140 0 R (G997679) 116 0 R (G997689) 105 0 R (G997698) 292 0 R (G997702) 321 0 R (G997703) 330 0 R (G997704) 107 0 R (G997712) 109 0 R (G997713) 110 0 R (G997714) 113 0 R (G997823) 48 0 R (G997952) 49 0 R (G997963) 8 0 R (G997984) 106 0 R (G997988) 108 0 R (G998097) 6 0 R (G998684) 67 0 R (G998823) 72 0 R (G998824) 90 0 R (G998865) 10 0 R (G998866) 11 0 R (G998964) 58 0 R (G999004) 343 0 R (G999010) 342 0 R (G999023) 65 0 R (G999024) 66 0 R (G999033) 44 0 R (G999039) 63 0 R (G999055) 45 0 R (G999056) 46 0 R (G999098) 91 0 R (G999101) 104 0 R (G999157) 247 0 R (G999215) 95 0 R (G999218) 351 0 R (G999268) 266 0 R (G999271) 246 0 R (G999281) 216 0 R (G999282) 243 0 R (G999296) 267 0 R (G999324) 26 0 R (G999328) 352 0 R (G999329) 29 0 R (G999352) 27 0 R (G999365) 355 0 R (G999412) 353 0 R (G999415) 354 0 R (G999422) 356 0 R (G999437) 357 0 R (G999450) 358 0 R (G999568) 96 0 R (G999780) 68 0 R (G999781) 69 0 R (G999782) 71 0 R (G999785) 82 0 R] >> endobj 386 0 obj << /Limits [(G999786) (P.9)] /Names [(G999786) 83 0 R (G999787) 84 0 R (G999788) 85 0 R (G999789) 86 0 R (G999793) 88 0 R (G999794) 89 0 R (G999798) 87 0 R (G999824) 111 0 R (G999827) 114 0 R (G999851) 149 0 R (G999869) 117 0 R (G999870) 125 0 R (G999871) 126 0 R (G999872) 138 0 R (G999878) 127 0 R (G999883) 118 0 R (G999891) 124 0 R (G999896) 119 0 R (G999897) 120 0 R (G999902) 121 0 R (G999908) 122 0 R (G999914) 123 0 R (G999922) 141 0 R (G999923) 142 0 R (G999924) 143 0 R (G999925) 144 0 R (G999926) 145 0 R (G999927) 146 0 R (G999928) 147 0 R (G999929) 148 0 R (G999935) 150 0 R (G999936) 151 0 R (G999957) 159 0 R (G999965) 160 0 R (G999966) 161 0 R (G999967) 162 0 R (G999977) 163 0 R (G999981) 164 0 R (G999985) 165 0 R (L) 360 0 R (P.1) 14 0 R (P.10) 337 0 R (P.11) 359 0 R (P.2) 33 0 R (P.3) 50 0 R (P.4) 73 0 R (P.5) 99 0 R (P.6) 132 0 R (P.7) 183 0 R (P.8) 235 0 R (P.9) 285 0 R] >> endobj 387 0 obj << /Kids [382 0 R 383 0 R 384 0 R 385 0 R 386 0 R] >> endobj 388 0 obj << /Dests 387 0 R >> endobj 389 0 obj << /Type /Catalog /Pages 373 0 R /Outlines 380 0 R /Threads 381 0 R /Names 388 0 R /OpenAction [1 0 R /XYZ null null null] /PageMode /UseOutlines >> endobj xref 0 390 0000000000 65535 f 0000076306 00000 n 0000000017 00000 n 0000000073 00000 n 0000000128 00000 n 0000000184 00000 n 0000000240 00000 n 0000000296 00000 n 0000000352 00000 n 0000000408 00000 n 0000000464 00000 n 0000000521 00000 n 0000000578 00000 n 0000000635 00000 n 0000000886 00000 n 0000000944 00000 n 0000001002 00000 n 0000079378 00000 n 0000001062 00000 n 0000005791 00000 n 0000074551 00000 n 0000074642 00000 n 0000074736 00000 n 0000074471 00000 n 0000077752 00000 n 0000076434 00000 n 0000005923 00000 n 0000005981 00000 n 0000006039 00000 n 0000006097 00000 n 0000006155 00000 n 0000006213 00000 n 0000006271 00000 n 0000006329 00000 n 0000012352 00000 n 0000006388 00000 n 0000011466 00000 n 0000076563 00000 n 0000011598 00000 n 0000011656 00000 n 0000011714 00000 n 0000011772 00000 n 0000011830 00000 n 0000011888 00000 n 0000011946 00000 n 0000012004 00000 n 0000012062 00000 n 0000012120 00000 n 0000012178 00000 n 0000012236 00000 n 0000012293 00000 n 0000020441 00000 n 0000012431 00000 n 0000019264 00000 n 0000074828 00000 n 0000076692 00000 n 0000019396 00000 n 0000019454 00000 n 0000019512 00000 n 0000019570 00000 n 0000019628 00000 n 0000019686 00000 n 0000019744 00000 n 0000019802 00000 n 0000019860 00000 n 0000019918 00000 n 0000019976 00000 n 0000020034 00000 n 0000020092 00000 n 0000020150 00000 n 0000020208 00000 n 0000020266 00000 n 0000020324 00000 n 0000020382 00000 n 0000031274 00000 n 0000020520 00000 n 0000029969 00000 n 0000073155 00000 n 0000073578 00000 n 0000073997 00000 n 0000030187 00000 n 0000076821 00000 n 0000030229 00000 n 0000030287 00000 n 0000030345 00000 n 0000030403 00000 n 0000030461 00000 n 0000030519 00000 n 0000030577 00000 n 0000030635 00000 n 0000030693 00000 n 0000030751 00000 n 0000030809 00000 n 0000030867 00000 n 0000030925 00000 n 0000030983 00000 n 0000031041 00000 n 0000031099 00000 n 0000031157 00000 n 0000031215 00000 n 0000037918 00000 n 0000031354 00000 n 0000036033 00000 n 0000076953 00000 n 0000036178 00000 n 0000036238 00000 n 0000036298 00000 n 0000036358 00000 n 0000036418 00000 n 0000036478 00000 n 0000036538 00000 n 0000036598 00000 n 0000036658 00000 n 0000036718 00000 n 0000036778 00000 n 0000036838 00000 n 0000036898 00000 n 0000036958 00000 n 0000037018 00000 n 0000037078 00000 n 0000037138 00000 n 0000037198 00000 n 0000037258 00000 n 0000037318 00000 n 0000037378 00000 n 0000037438 00000 n 0000037498 00000 n 0000037558 00000 n 0000037618 00000 n 0000037678 00000 n 0000037738 00000 n 0000037798 00000 n 0000037857 00000 n 0000045516 00000 n 0000037999 00000 n 0000042551 00000 n 0000077086 00000 n 0000042696 00000 n 0000042756 00000 n 0000042816 00000 n 0000042876 00000 n 0000042936 00000 n 0000042996 00000 n 0000043056 00000 n 0000043116 00000 n 0000043176 00000 n 0000043236 00000 n 0000043296 00000 n 0000043356 00000 n 0000043416 00000 n 0000043476 00000 n 0000043536 00000 n 0000043596 00000 n 0000043656 00000 n 0000043716 00000 n 0000043776 00000 n 0000043836 00000 n 0000043896 00000 n 0000043956 00000 n 0000044016 00000 n 0000044076 00000 n 0000044136 00000 n 0000044196 00000 n 0000044256 00000 n 0000044316 00000 n 0000044376 00000 n 0000044436 00000 n 0000044496 00000 n 0000044556 00000 n 0000044616 00000 n 0000044676 00000 n 0000044736 00000 n 0000044796 00000 n 0000044856 00000 n 0000044916 00000 n 0000044976 00000 n 0000045036 00000 n 0000045096 00000 n 0000045156 00000 n 0000045216 00000 n 0000045276 00000 n 0000045336 00000 n 0000045396 00000 n 0000045455 00000 n 0000052522 00000 n 0000045599 00000 n 0000049509 00000 n 0000077219 00000 n 0000049642 00000 n 0000049702 00000 n 0000049762 00000 n 0000049822 00000 n 0000049882 00000 n 0000049942 00000 n 0000050002 00000 n 0000050062 00000 n 0000050122 00000 n 0000050182 00000 n 0000050242 00000 n 0000050302 00000 n 0000050362 00000 n 0000050422 00000 n 0000050482 00000 n 0000050542 00000 n 0000050602 00000 n 0000050662 00000 n 0000050722 00000 n 0000050782 00000 n 0000050842 00000 n 0000050902 00000 n 0000050962 00000 n 0000051022 00000 n 0000051082 00000 n 0000051142 00000 n 0000051202 00000 n 0000051262 00000 n 0000051322 00000 n 0000051382 00000 n 0000051442 00000 n 0000051502 00000 n 0000051562 00000 n 0000051622 00000 n 0000051682 00000 n 0000051742 00000 n 0000051802 00000 n 0000051862 00000 n 0000051922 00000 n 0000051982 00000 n 0000052042 00000 n 0000052102 00000 n 0000052162 00000 n 0000052222 00000 n 0000052282 00000 n 0000052342 00000 n 0000052402 00000 n 0000052461 00000 n 0000058576 00000 n 0000052605 00000 n 0000055683 00000 n 0000077352 00000 n 0000055816 00000 n 0000055876 00000 n 0000055936 00000 n 0000055996 00000 n 0000056056 00000 n 0000056116 00000 n 0000056176 00000 n 0000056236 00000 n 0000056296 00000 n 0000056356 00000 n 0000056416 00000 n 0000056476 00000 n 0000056536 00000 n 0000056596 00000 n 0000056656 00000 n 0000056716 00000 n 0000056776 00000 n 0000056836 00000 n 0000056896 00000 n 0000056956 00000 n 0000057016 00000 n 0000057076 00000 n 0000057136 00000 n 0000057196 00000 n 0000057256 00000 n 0000057316 00000 n 0000057376 00000 n 0000057436 00000 n 0000057496 00000 n 0000057556 00000 n 0000057616 00000 n 0000057676 00000 n 0000057736 00000 n 0000057796 00000 n 0000057856 00000 n 0000057916 00000 n 0000057976 00000 n 0000058036 00000 n 0000058096 00000 n 0000058156 00000 n 0000058216 00000 n 0000058276 00000 n 0000058336 00000 n 0000058396 00000 n 0000058456 00000 n 0000058515 00000 n 0000065276 00000 n 0000058659 00000 n 0000062263 00000 n 0000077485 00000 n 0000062396 00000 n 0000062456 00000 n 0000062516 00000 n 0000062576 00000 n 0000062636 00000 n 0000062696 00000 n 0000062756 00000 n 0000062816 00000 n 0000062876 00000 n 0000062936 00000 n 0000062996 00000 n 0000063056 00000 n 0000063116 00000 n 0000063176 00000 n 0000063236 00000 n 0000063296 00000 n 0000063356 00000 n 0000063416 00000 n 0000063476 00000 n 0000063536 00000 n 0000063596 00000 n 0000063656 00000 n 0000063716 00000 n 0000063776 00000 n 0000063836 00000 n 0000063896 00000 n 0000063956 00000 n 0000064016 00000 n 0000064076 00000 n 0000064136 00000 n 0000064196 00000 n 0000064256 00000 n 0000064316 00000 n 0000064376 00000 n 0000064436 00000 n 0000064496 00000 n 0000064556 00000 n 0000064616 00000 n 0000064676 00000 n 0000064736 00000 n 0000064796 00000 n 0000064856 00000 n 0000064916 00000 n 0000064976 00000 n 0000065036 00000 n 0000065096 00000 n 0000065156 00000 n 0000065215 00000 n 0000069607 00000 n 0000065359 00000 n 0000068332 00000 n 0000077618 00000 n 0000068465 00000 n 0000068525 00000 n 0000068585 00000 n 0000068645 00000 n 0000068705 00000 n 0000068765 00000 n 0000068825 00000 n 0000068885 00000 n 0000068945 00000 n 0000069005 00000 n 0000069065 00000 n 0000069125 00000 n 0000069185 00000 n 0000069245 00000 n 0000069305 00000 n 0000069365 00000 n 0000069425 00000 n 0000069485 00000 n 0000069546 00000 n 0000079296 00000 n 0000078158 00000 n 0000078344 00000 n 0000078473 00000 n 0000078614 00000 n 0000078791 00000 n 0000078918 00000 n 0000079056 00000 n 0000079180 00000 n 0000069690 00000 n 0000072912 00000 n 0000074915 00000 n 0000077988 00000 n 0000077903 00000 n 0000073070 00000 n 0000073493 00000 n 0000073912 00000 n 0000074337 00000 n 0000075026 00000 n 0000078090 00000 n 0000079468 00000 n 0000079499 00000 n 0000080777 00000 n 0000082069 00000 n 0000083309 00000 n 0000084505 00000 n 0000085433 00000 n 0000085509 00000 n 0000085552 00000 n trailer << /Size 390 /Root 389 0 R /Info 13 0 R /ID [] >> startxref 85729 %%EOF ga-5-4/doc/armci/armci_overview.pdf0000644000175000017500000035615112662210475015424 0ustar mbamba%PDF-1.2 %쏢 5 0 obj <> stream x=k&EuCs4bdH w=/DXYdٕvy,Y<!j$!AY4F\1QWRQJ,ĔgUJYtsg{}`LO>O…(?wAA`qiWO\3 n [{D7ugyxZ I^.A`qAVK {h0f>Ht@I =jYꪙH1PyZ[4kţy暪&Wb=qA>}zapїBK,5qV@KwQ^7/UDZ#` r oO+V f29Ÿi0daZÛazsbY>}jd1T:.[G^+"^Na~Z N|+ z hx\rdB5V|E4DhZ1lF24{7mGRMc#jX0CKQR,MюR#X'llnDcTXgcC>w?~'}vY#<7?8a~޴p1~_X{?|[[|O٣Wzo.?g0:/䣯8SrQ7|;q޿%Dܻo y郷? \va&}GWyĞ-]g8s M"eyL@S3b=ag߽7>s;=u/,CNEv+@IJ.H˅DۀGK: A$ HPoqȂ,s03+>s 8-FRj8ہ։%8gANèǂo.>~3 8^QA,v(iXGJ$ΆHliZ Rjd㢆5W IX,YXլjX3cǩ+I`KkqPpq XnD6؈4>{0Fd1E'R 1\ÐAðIQ80,ʅ8\b+ kE% E U8BxfK6lMp3U 00tJfh@0i|qeY6r& ExM7 U)x`9).i-, 3f MRK%OjBi7Ԅ~b5}iߩw<Kqw?ps~kvoƿ}dc;c iYfa=u-( WV_ s;fI‘]dMOaV3;bYjçhl˿%Bd韪 y& ]|e4RIZ'Z.''ryEy^B_=SHEO˽F> k瑭'9[ ˹ܙ?xj^m 1{cMI96 i Kj"*xoBc;Tah\\ۈ5IGj:E'_߻a]LԊradFdY|1B EWa,j+rфzr$IÄ|pzxzNnB} DUVR\('vLgo"rB4-1CL-tOz&-K| U\Z\9<(ZER4LIOuxQ6ĘՓ p_ˍ1sS:#Ec[+;D7ҞJoX#gFL`z3N"Z;+l[:(8SXrM -:6C'M4'Ky"nQOCo)go$3 /I1%iM$Ax)K(IxI /)1 TgdhS򍹜xoQ}Mp ,imA*K;O1IlBH[h0~4㗁'cDh㭦x#l4(҇aSe"t%$65|]k]˔c4l&>J-lX8) AiUdV.T+Ay ћh29zFu(QqTbqpqtA=lڂ*&H*LVR My`1)2֮5"Z/{>_ZI#FΑsYA#q!f 6!bx5ƔM:L2.G%rt#=#Qw*XFhꛖciN@_NI ϵĐk%d;ւL},ub/3Y7'y1REԒn^šCQtP}gF;MO]h|YG?Z2 JFَ WlTBh7 ƍ)cLdj-m h|ш|u?d&uJ|&PӔr VgTM!mH.9UX.LV'\*65xJ$V>Z;`mйm((.´څ>[lA}w;VDDY`'q84k\QLP qz^pM| 7#t *5hīH;(g,`R%9I]h1TdUj9SY{!5˨oөu ;*Hk 6BK٣MSkNy~9en+o)E[C&+9>-/i]Zq~'/E'h;C\YWis)<%{?RgT7X{AXwҥ0"aϥ.\r2uU\|1ז@tTrRiekV.đ?OIzнd]BSLTpIq%[r\_ 3;\'BݙAe;#֣FѤ,.{E˷%0;owpiXg@Ůgcd(yہU`0apS֬"v I @:Ni5BuaEz_G^X\U7wm*nkEݴyBVUݦnۀIjs$ƱQk ֛X\ > 1)kM^o.왦8ټ ǑaecY;j68EGʨu4!aªCGCFYQeԕ]27 OǙU- n Q[=5QAi1<&Augl-Xt~|gNK4m#vL@1Ir8">>xI#'DڳH diT e $@ )En}{g{1ĕrjq%B6n:d. b+/s F^cЭ}GE&pĦ3s1~bIO&O&T8(c㌜.d4m)Z(3KRs4r!VsIK}bmt%6wGߌĜ%kX 3aZ[C}sU%5ɗ]TKx.GWWBzq%az6U1i*`i^A4Tee\^EmQs5FHʲ%QzYuKzdVnѦ|enWak9VP?LLCSWh1+u'{o*7⎪Ud8oxLZLԡҪ}.-N- YaꀣÄX''s5tNq%y$Aܧ/: UfC<1Ry=r9 .JP^bR( $iࠢTC/PGkD3-&i:E7' bhX^3V&AL h9b#TNmbA-DJ}c#*far |jBYH9H̬>o7)Eo)H?9qy<d\`yk6mPң]Z+m]nNW؛Ԁ⮮|42IԪU7z4FɉQ.9AX:6s(n;=u@ ;<8,.<)gmըaʣdq\6GX=WK-G fv#jKM;*z |/ZK07WlOJˁQkQjBԟQ0mZ׍%şt>1c|݉>Vc}&5L9)S%LLZx;lG*q0 I9}}4RA= vL ] ׻*y0B47KJU*1ٵvGטD!Ggq8hg ܙk)}o/l,Ildw' /e|fO(I6k{)rtGpތ'[Su^!ܯOMjk³rF9YWě7#"lW z}|dʜ5nB)3G~'4Kf?uzEKIϋ/܆_|Q0F#)it҅x) hq-:/1J*l%`ٻHA`+j)\;@P)%Ӷ&Tj V?i}5=ҳ\nW o_oJf]1R,Mzuе3r^ :B uE Ki]Ōʈꖛ Y[bzw _ҫLeg6o9 5#:^ul9Zh>dPW&J.r٢t-)r7sdg#gVaM g< %-9=rY?tF^O}'Oo5P 4:lؘo jeytc3EnK;,"(]l~_-qj\f!> stream x_uUjz%8qK.R@̜*g ! !d(6b,)#{L!ŵU| c_p+E*or Ge.\(}Ng q%ݿW^ݧ+w/Om?=4=oO|WWO){_o=~t_z?|>-ozCvuZ~'vOُ~Ss]~s߿>*c_UԹ?x.v[Z}swް(fδ-,?_\߻y1|zϡkҾ~Dft2lne[5k4_eןcM{tMP U.ymj?◶x罣yaoۻ>5??_}yz}o~~ʻM_u/ BΨ?lk^7kov~݌a7e駀^{?~n!-+헷!of7vIl}ڜk[Xp"ېׯ/WXyLΛ~DI._3Z[-d>_oiwyg/˻ ~kU{+?Īs'!P]擑~{n9?,Yτ~qP۽!}a- XeK/W1`EKcWGxGO4dA{&37ζ=W7۫)oH'2"Εj7׻* G,8F.~>Dlnl\`{ICǕ߳~ TA'< xLcH!1  7?FH`r͝{oi *nv+_W77f$Nq3aR.Xm۟6s6"bp&s}2<ꞾIYAlr-sa]~#5{o7{_iI9@ׁ< <#c@Z 1uvF:!@fwQ .IܷB)9O\x`(E 4js=1$N.νuO[PC*~/:m6.j^nmg:\S)dcf!1,G E FMAVTḷ @z>% Oܬ{\x s|fCX8NےK>_LA|fztGH`˘=J;#{uٲt$gW2^r/%[cEWk048pyTIC?Lz Wy~dá^Rq;.K;2L0 啅@??Xd^OW-8>u~?/=g篾|jW|_W꫟YL7|p};gx3~nՂw-bd4OoU{FJr]^{}Y_yW}߷5iT>e82>e9"_X(ᗩ oPT?^胢,zEL>(r }PTenCIc_?c@gmeco[{_ck;rR+vHJMui?ړnY<}vn_u[rboL(ѹ 5ٴ90Bx>r_'ڻu"j F!%~Ku}{^r!I\R&W59Ӂ\RK%M2(Ў(yK8zrΡ63 7p yLV[Fxu9~"_+{KI; \ s+P腯;Q0|^Br7,I, hT)`oLra)>ү:m"gP@W.5u"ߍb)#ptIe_ҙ8i$G1)YeLz*U,;ё?U]E&^׆GN}AS쮝ȳ sW: JFMg:&fv֜{\|!u"/fHmHG ~ɖ}ld/M&viem4z!`v@2љ'Qt ͵&~ 1w[:r25?u292Yvh= ljZ\~nݦZw{zh1 tT>AhDaco+pRkevPgf6Gʡ$#uƟ(bv_gKkIsP_Ptj-ġ!G/YxHұp$Ej۫f֤v5NA'X9/Ɏ\QB9$ta\7QeNMCeze +~z4_{(jV(2+qڨe树ړsuedNTLxҺj9rf4yIxMHfr>UQe(ORd*OR2يx д϶ˤYgP? ,F~\}{HmTl;ojkI28~M>*5i/o>i*WUԏfz`;XI.y4ֹ%xWOcjߠUN Z=UYߠU۠ Z= tbl*꧜p[5w`'!߶k@ (V-/tmm򤗮lgRi 1sMVu7Y#G\NɆ'۪zݺ1rsͤklue+ZqV̈k;NF l SunW;R?w\9fN5*񎭞[=+[Mdj'xǶ r;j9* Ke,~q*zdqYu\ڷV3>}2wg5FW&ٻvd(*mawVS?e0(A$2ڝ-Y랱$랉י\UwgMu>+H~5:QOߪ3K~dP*5u"#6^HJ+Ȩ?CF8A=]hP͙/q9S{@^!Y%{qߣ{qJ޶ֻfrkU3N` 'NdwPcRg6 ܒv~ Q=tu}KG*( 2jmM7LimM ǹ~Gշ7 :O٘&;`⌿)!mL7[:WQen_jUOl3㑊k |λL6 #ѐx$ۆ](vFN@'s Y4?~RY#oQF-p9|~z_g *n|n]c/nog8{Fo=Rg|d|l_޳O|(zenszoz׃زs=-@CI+ד_|5p|=W:۳^/~h0|(pe [Çp )`|0|(pe )F%~6 A[_'p;B"Ut;nJR{fwrz;P?;ʼn}wr~{͜r]t]gܾǽtB7m`̂o˃k{7{[gO>Мy]1 hn'rղ6nTm\tZEuW5;ӿ t#|js>=rG;:ho*9(]0]e>v> azgE}p"l P'r}TQhnIC\Ԯ.d#iL ˅*wiH|LSֲW2d#Jע}V3Uɻ$ڞ♢̙!В %Mͭj_,/#[ŝ✺\ys;$ͩ%U6LW6|U~z͢|t@'ǝ:]ˌ¾iu|l%a<C,Ɍy;`vȶg8v$P8oM| ;{b@j)'!!";Գc*NءPː wQ&.Ιf~1֋*SwOOSOS!v-iE0B:ڐkIHȑ""8p΅gʆsi#Ϲs.59ޜ7t|LLV5{ΥJg XqN/*[ KK\bui+LApc<\ƣբ1Y^('ogB<񞜞=Z1a]ʭui٫iɩx(G M=\Pmx.Yf:QPpTx3C} #svKH! v-x{. DfOi٭ )]w+i0Lj;y_>  $3_L WƵk .qOn K,pe _-aQW}^胢 _Be9|7pC}jKZ+ Gon&%^wonT|ۑ(|Pi{r gvffmoϕt/~c")3s~9FXX헾D~-Objs5.539LI׶Xux-JvWɼ7cs+=㙤s:>WA,4@iKz'D?%Ldcj4$ڍq߈㠇\;>z)h7x^F/͢Yd1^PYbG/0zq(zAA:7A1sB_ 1}I_5/ef>XGhalrNƑd2KQ^b-E]n4oҾ|kIK ٸ>Aד=W gP{ ^nyI.Pzʫ-^(,C/V[z% uW٢.jh7̷ \> Pgbi|(b.ϕ>r{m+$ncvݰkd-_h BɪnD6bNC]Go 1U%hUn_yf#i|doVLȬvGxI vay#Ǿy z`V^P}p뤉AIf^w^Aq^ǵ|uXy++븅`wvg{L[LjL׍3{du s^řzy]yrd%^%yy^za孼LbXIΠ _+M~z~uW\mzݣM폿6GaY=i3i^VZte%KE$eu^첂-*@Lby|aFNfO9f̹6O9e^2X2ө9V~㺧4~ߒ_+澑O>rux pzc\>$1 vaJcfô0jǨV퀒by31 Ӊac8z/2yYm 4X9zh놖U W';Up< XYp< ϭk:$z^Lpl+G EW Wأ2kP~"=1owg%ay"'{lDz??H/D{=ćrRp eHɓ Mn!>Ȑ'dvܓx,cX}cĠ-Y2PHb}`($C;7 с7o(}{1~PA&Q ,1.]rG+sLS>Ɓec2Я! V8 ֍cq?ҍ d <Y0IJFfHb_`W4S.w 7-i3| ђA.^2k]vQL7x>RiP*!tH=L.zzeRv̦"I 3+!.`Tv);_vi_b.PYمw\vj .\풲 dSvQ+([ԕ]4 ە]ە] ;6_/&LPm8*s8-MU5J'xa9n*n\]p}5A yaQ𼒾,# \xD^xTI.%p-.l`^3E^6²qو<WGO\Da3V3s]<θꈂ>A:f[tb;آӠ\owXaTX0T%u17xE1{FU2" KԪ*"Yp˷UEߡK"j6UE}UDע*h0߾*.9F9s0 fsQꅮ,Zһ!́Lzqb~!q'8%F~yug>gL2ܨ1r8(54vC=G}{O&d 3|cJUoN L-q4qC1KjNj˵ɡn5 9T.;.j̒y3 Ii%((9'Is{&/V y0y:Jezg0k}KJ 䀅$EZ%2˴I2lj9FɁX@,V yaVɁm$9(9}Gr%=XQrP?ރE%=XUrxi쒃ֱb%I$p^LrlGE%r4J"I^Gu/ˉ;z󃳟#݃pkHIM+IRћLj\{I VARHǒ쒚F:f7ұHeZ%5͍ts̒rln.mFcXΕNW#?G \~J}R=r/,$6pxHoh R A , ;0p@f;82qp= pk|2;T;ܙ nx6Xr 2rfr᫴%<`>JzPô{"Gb4:=GC"OT_oj-59H\oRZ [ kr]KlMFIuIcoJ2TFj~^hx>zLz%MYYE 7I(XY" 1FE2EQ1dVD9wQ8zQH" w" iTD9NRDcUD.֤]F5 ψF/iwƅT\S"h:NWnhɐruo1s$&YٌBv#ntgmQk⮧9|F\QZK3w-m(H|6k_ziw~="ߺ G 6cd2|xBf҉7Xvb:I#ґTG0+1FՑ2#jwP]uD 3wAv;(Ӫ:q=Ǭ:"˿UG䞑VG`Pȍ#BŠ1_ck#mq-w9k zXza^tZ I H(+xcskYoIשzg z 2o{'9QI'bJIApX>( O9L*5/J8E Xqz$3N^ l8=GNEqzr4"I8=+N] .# pzTL8=۸A@ #@N#BWPp"W:Y`V8V#O*gVUFTвU szMcs殃ܵ;dgBcAgsJj^ ^zz\4U/ =ݮ|W YeZ'64*aa`ʟU OXYWqp,*DU$*VPQBf+(Ү apiUP {Y{NR.#Jչ"Hza!|M|<٘- QXb q^| BG䠠Dz ۷K .JPH#Ӷ.P^i=" Q'N:9bYƅ@ !Ou$9(@\荸CgbNZ  CKKIuAGȤT2󥤞{}x $ⱏ⿌K25kƯ;y%Ѓ w T)kmGTk{r ];s\%JYf_t#9`~`tgLA|xi/=g{vE8l?&+PFICvf:yqLg^-ӈW+H$9"e6e82"Ѳ2hI9eIٌh=D-cj(mL~_B99;< DPZDpO[z\UyPԿ*3ipUiE=UÞcF=ZIW~џPN CC9;W:5r wNAIfPw B(ծ T?~ґ8gQ-j#={`+8s8*]KAOC s~r df~e-<oACZ!،a{\5͇Y>mP2ɇܞ$–j|(χ k7!(\w !hwIygH?fC9zʪ]dse.v4S7%BIvMu'CkJMA#q|:Ґ dXIłL2y3 ɰ2,c @.BFV8 bfXvL2,*Ö}aվM % y^\wQz;lxF8(^A+3 X{x%?ZCo:^aa&w>^aV=L2mqxE4^lUJn,.^)mbaFJ}oW{XUR$o6 |orwx%ūzgf8z+(,^qWPQ8WfxWezHd띉WPM}Hx@.^AFJ8 ^a+M*^}X]RcaFJގE+z;iTV,^)Gz;d띉WPM}Hx@.^AFJ8 ^a+M*^}P]ҬCaFJE+z;itJގ7W A%ūzgf8z+(,^qWPQ8WfxWezUVoy3 Wi+((^I+l|x]i[ū2kFd넟RM>kǶ||)tӰ[mToܱE ڢca\F#(Uݑ *HeaGӌVuGL|FnĒngFvw L(VS|e˿4elmyÂLcPM}OXe~r46Ii>}%~?ULJ|#s|Wc/-)x0atA)$*Lo`Ao;65aOxuO>UbT 3_PRG#PRwYPRq(y0E J`(;JZj/Us ڳ$LQP},ROע bZ#&vղXղ:;RG\%*F00[0[8zp w9e܂o[Q;-X{+Rw4C nlp Wv$6kDr}\O 9ANP9qKd:('[g+/DNd$Sȟp9Oٽ"Fx:D*P٧~tBez ]8х;]х\4!]ȿKEC]pJ%Bv\@H?]hkoD x@R# c}*z G#\S +wY\S q@߶Î)FzL@/3?SW M6' DEepunrJ^(}$iMbBlog L{8ƪ-ڛXn-b,dc:GoFvKZ+(sO|b-b>K|"b>{e|10ig$B1t. R U^3irnu]a \+]?2`q}LZr9496p` `>Jg 3l@@A+vj2<`~a`V@la| u6,t,Hg;.wpq,L68s>PY L8,qm07qko>]$q~*ÝP8j9'IV "N(iUwB aPB{8:*ݲTD:;~" }f҄q5>irct.q>APY L$qryڧ -wo%;|{ucS8D^{އ؏=99cO\| 2rcRcV9L|v 9αLc9J2˱9? Bf9;\2rqk#H_o>.G(l)Ycu:c-?7Zn>Zg J'|U.jIwH heZe@ e@E2`2EQ( vn\3q m:{{@Ś|&a:ϧU L\'q4AifNy|<>I:":nOs*ו}ε@A6^q ,=A p<ZŻxF~-%Ic(e/yģyG'ixfxgCWGzo<4nxYkrNrZ8)ƶׂ׏9pN~<\w~\c\v]3PHIN܉?l9w"k}pHE$ RvUj"Um4Ȍ@"2+ "`M!Z "))D y3 H iA$("I'HVIyD<33 f4!R%{$3~ @$UkDQ'HXwKą )Dº[A2UDߪĂt|]oUTZǻ䗛|ڬJe$ ړspQ}{%yMG*Ҋ pP8NJ8*PyffVQ(͌ hSJT@f Ʒ2+׊ NBmHp8F5ezP]@A:0#x,!|ifM/t eٌ V@Btd3h7K,|Ga >)JK)<ݠh%O$OZW\Nj0wɢf#aOȢ~# 3heZEF8l{3Wyf&ʒŪpbF8XNCf嚑EF8XEF8YThk>Nܯ9n?3KlU>*dBW:'t Uv ]tUv*UptU:]հhirK*dCW3C*yUt] GWL#*qb[UU`FW%O*NlVtUV22t0 ]UYVtUuJC0 ]ź[2 #9;0]3&U> ]l*+LHW L*l1U<]յ>6v#G`O5/ =MԿ0ϥM40ʴ`ۛD lJ#W.GIfx ʗ'遪_гOdVF'U/YߊN_,PN^,@dyK:vxw( w\P*l JŝRAARJ.TPR)Q*e9J.(tcfmXop>'w9emH'ݶڶQuNfGyfi;g?2牷1Nt*9gdIm'~D$'I1Nbrbݭ(gS(t"W9D(h.N' PKyu1T/h$N(kH(kəbÔ\~ScrXT+=8zWzpeQ8`QUPuϢ^<3ۭXyNJE_IRy6z% fƢ$e{ϢT$!Ї%R@V,J~%I3+]I(:w4 KR_2ԦQiswbV= *2mPqTJ:ϊJ9 8T*tRcJUǡZP **յ~s)1,jS[JX:j}ċwkQ}Kq[$`i5Ujt-jXRJγR5`~Z-{Xڢu7j-jXw3XТ18' R}px${w9QAE̬z~>2 +i]AW(J'VUyt<33C*㡫ybJ8tt]+9+#j!yu\BWt-28 2]:u|#W8d\ fw5W<#8`GAFжΎ ړ].5uTv+imOs40#ΈҌ3BV4Gތ3rq hNvF$4j;l4j;lgT}ŠOruI$TuNf|RyfI|p#>uezdӋI $WOBAR>.PO*Ie9>^Ba˹r(hB866Ltr0 3ӘhB<6xP L#'qa[Ax̓/A<!,7avOA˴x B zP5癙Ѧk:Oj6:j6 ^!]c4M!VShS%Azg f8z@<( qxPē8N 8Wyff9xUC<p#<Ur$O!fTm?d"9~ sRuxez!ޠn%Azg f8z@<( qxPē8N 8Wyff9xUC<p#<Ur$O!fTm?d"9~ sRuxez@x5-Tm?d"SmB|NgԞxti#rDwaA&;s@a6Ԁ5gE Q(ӈH'V@y5<33KS*㩁ybj@85tO li5}'.k0I;:pJ+s I8 9G'n!>܃cH)IcK_⍽N>[\\fj rmծm%ڥ,Hv)h7<`J>N'8\'8 ;%w9r eKފ\:D3r<3ȥybrI8tO.+9' ΓZCh&g`rY\KK>%geZKZcF.z'w3 %S\>7)ΓK]yr.3F3<- #i;Iz]IC붿/?Jki#(dC2WϞ|dΰU:?,v}qx}xU miE NJ`i_Qy6}F!t4g(ϐfK Y,3HlEg U3؄$pT(r>PL SL#*qb[TUq0hs S82a*M3ڟ&DTcBLU7e{3)z33ML)o$0⧼ug[UJC0UPL SL#*qb[TUq0hs S82a*2PjOORG5k'gq~5P }@k\Zr45Ii QuGkj9NǴxZ#scDk4ӚJi󤴦:iM-؁25"'@P Zu5ez9 $rZ/Fz'?GvnqLJ rmծm%ڥLv1 Q& J橡@9̡/]Cw)f,fD1eOQLvY(ӊbbۛQLvZ33BŬ.+sbVmtbVmUp@1jUeUgDO-7;zH&~_zO{@+'No/|ϟ=pHCZjhBKmHh(dFCz4-\ Ii U\`n wb W BA6d2ِAd GL#2(q b[AUmFug39OL 1"`%dPyR2Xk d y@kQAwfbcFR٠=!gHjyzvi%$J2#lcTv I$Uv*ΑT9mI]r 29z^ l(G:=֊rP8NJG訪Lt0639ڈʜ'QMtx:<)5fl:ZvĮ|<Ė@bCc 1 m#"P>wbCa6Ć" 6w9 eAl b:صgfFc]y<Ė9O 1ؚ!v%[yR]kbkصg`]bE'Al.L!6+]fCUAlvG(b;Bv۠ʴتf[ݱhS+;ʜ'U5gU@Z!vvGU2 b; >bk;bcϘAlvAJ2@l(bs>P L#-qbc[AlUqhs 82!6cC^J2@l(bs>P L#-qbc[AlUqhs 82!6c>jPlwŒ ~#i L+mok9̌6by]Qy6]QyĮ?bWmwT!= Ac!f#b >b O 11\Bl3VL%AlvG(b;Bv۠ʴتf[ݱhS+;ʜ'U5gU@Z!vvGU2 b; >bk;bcϘAlvǖyu=ĆJǾ<%;z~~<^[1km_?o Gl8GҊ#pPG8N88Pyff<Usp#<#Tr'88Pv<8jNqAyb!G#`ez9BcEZ> -@Z$;mHH 쨐v)iAHfO1fDZ{Ob(ӊcۛZ33wiS,sT)tT)Vp@Zk'-U{UgDO3bS\'xҢS!iQ)>cFZz/f@IfwBZ )ij(Ȇ9CZ0`"-H iDZ$l{+ҢH dGZm? i]?R}<~p%m PYPUBovAUCoTk*W4nT>Q]ڢ*O{};K%?|4q (ᗩ~0|.cÇp q䢩tPTƽtPT?^胢,z&~i(iyw8 n %NJQFt/6׵ _wn;Eqjy3:mOTɪorϖB9%bgSrOi?uESB-(Z:s;1<^k RUA g]˒l=0ܐ\+j}C)8O)By.s % Iw/$r]__xYJ[ӵ_LcQ!*(ۖC9T|}3>S;M(i$--^}| 9iqIdz' "UǾCتm1F^[5G:!M&I bdMhR)hc <}j;fSzg(r o`yG%-~yt?x\ȓlW3:<7c+x7ˆ2c:W$Im^#+~^ՎدC%4l~sp2r+-?8?+~áo)$̞0S߂| N[lyo)귺PUoH,!64b֛R&5Bs( 4 =.Ʀ,r o }PT?^胢,ELyl# 8d\=~M2<е O_{>}c}kϿ O_ Kqsk_o-=5OoJtr>-y~⭯>ܓ򶷾߼߇~W[cs ͸uyZ󋷟)Ϯon{wֿa4m4lbv{7B_^hOUrwٍo(^ذ̿??>n>j=,Yut_[];᰽C NZOOΣkդJx7Eߎn/lls:׈Om/B~Azǖu󲞧݉{ny"-;)%+<ƶ'YߢY32vl[Altwouc濹_;Y/:^s7FjWaMهo?eLb~_-UmZ)Y7wO/Ѩ^}#e·d"o~3Qٻ(<>rKv}@4o>qGy.Щ} kVm[a ~{.7|([Bg`.xcj~5w^9ko7Eo#%1 e&;]%妙P'z!WIe{}`A =ιG1,(}* KE{Op^EVsp͉bs3q.%aoѻXqP9Y\^Dw~ޫ.HŢ`LDH~0k$/82Ѧ [5Zgʎi_]6=%XާMN#A.!En'e,u1X\e[1>"'a/x?eD΂˝{MĄ7̈z 7NB~|nGd2Ak/](MJf_'+Mt+%mU0J#DD>4L(WL"bxC=z^I@Ը\U,ac|_(ܪq.OF3Tw%I&{%G$UlWwJ%ƫ0%S;+kURgKsan٠r)wM﫛u\&o$k>_44-ra~ԛQtӘ/.oI-n<'{\(?nlD ,u1Rpf`) "jȂEAQ[Sm}GnB=*(KDs҅"_}e49.Pj!\I&* ;C䩉^u`QkWBJ]ߖ𳰧gٶ%~ {Beā JtK*RYlؘϒC];0zB+esVVQ1SQǹ~BU6+ -}D/xjltu5>8=*/)}xU a31ZwcpI d\i.H&>3\0Y>nv7*(w~n[t1릻om >(ӠӂRr^Ƙ* .s,?_NT칣bS6ifh3 ˆqܧ;VtWmquf![\Q9=i?_po[]UEmeNDHZC:htm݃9K:v_w08h`=jsc\_8c8mxrwLjmRdGt%]JƭRۍ/C};Cf\]v!,zg19ĕGl:8yФ~ft 빿~_ȳu8ӊG/įN̯I$;ɼ'T63Km."T#mYGȋ*>/T <8~v|a8G-'ݙ֤5XK|K1"c]k;Xjpq]\ 7BT&H~ށxeWqqk=ou B$u= LJC) Zb˯6IpJ=n.{ͯm} E|섨7cQS\Ws9'x<%/FlQ77hw?ޠ}>|xjeNKR<4Q&Mk$E_%.Pg'&Z$eQOb\'-'d3{%|[o(y̱!A!ϾE١7)ЧF+Um:Kcm 3 4{ %qČl/qµ/zb`jU*6Q EK,$-kWք'\p>8 _ڏb&2&f*yYcPC=Z_DA@SlNUH;|6w|1יH$5"@[_Ɏ]l4bL!o?vd+oQfWFHHh__hP7~Е/{8NkU"|1%hlQJ`l<~ǹNW6r+{!it"icWKi7ƗZc*NΑrgX)G3T"m-2Ez=2~YB.WNRaQj_Q7_m?fƴ{ $6=m?jR3rh|߭Cbx~0 ࣈ~w8}KpA+3mf> /Contents 5 0 R >> endobj 211 0 obj <> /Contents 212 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 211 0 R ] /Count 2 >> endobj 1 0 obj <> endobj 10 0 obj <>stream 0 0 0 0 64 70 d1 64 0 0 70 0 0 cm BI /IM true /W 64 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A0eD EI endstream endobj 11 0 obj <>stream 0 0 0 0 57 52 d1 57 0 0 52 0 0 cm BI /IM true /W 57 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3d2I>OY8 z_A EI endstream endobj 12 0 obj <>stream 0 0 0 0 49 54 d1 49 0 0 54 0 0 cm BI /IM true /W 49 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3.xOA ޗ?ޓ?|@ed?_Km-av!ma0d6|@ EI endstream endobj 13 0 obj <>stream 0 0 0 0 47 74 d1 47 0 0 74 0 0 cm BI /IM true /W 47 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@h2@x 7O]?w_57 k d09c8p>@0{{r_^.a.+X0F@@@ EI endstream endobj 14 0 obj <>stream 0 0 0 0 37 72 d1 37 0 0 72 0 0 cm BI /IM true /W 37 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &}|>x EI endstream endobj 15 0 obj <>stream 0 0 0 0 90 70 d1 90 0 0 70 0 0 cm BI /IM true /W 90 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID & ON p  OOW@w]  EI endstream endobj 16 0 obj <>stream 0 0 0 0 51 54 d1 51 0 0 54 0 0 cm BI /IM true /W 51 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0̐.OC:I}'MWo~#v=>Ay *Xv]ip.+0a`8 EI endstream endobj 17 0 obj <>stream 0 0 0 0 43 52 d1 43 0 0 52 0 0 cm BI /IM true /W 43 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Rp10:p&h EI endstream endobj 18 0 obj <>stream 0 0 0 0 46 72 d1 46 0 0 72 0 0 cm BI /IM true /W 46 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID 2}o5{{}Pv]iv0 %aa`d@ EI endstream endobj 19 0 obj <>stream 0 0 0 0 49 74 d1 49 0 0 74 0 0 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l^ oAoo&վook_zm/vKa+kk ,0Y  EI endstream endobj 20 0 obj <>stream 0 0 0 0 49 74 d1 49 0 0 74 0 0 cm BI /IM true /W 49 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@1"!| A~~~ 8?A'AzOׯK:_K0Kb CD EI endstream endobj 21 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/IT&oo? EI endstream endobj 22 0 obj <>stream 0 0 0 0 14 44 d1 14 0 0 44 0 0 cm BI /IM true /W 14 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &qO^~/|rj[ EI endstream endobj 23 0 obj <>stream 0 0 0 0 47 70 d1 47 0 0 70 0 0 cm BI /IM true /W 47 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &M.e~ EI endstream endobj 24 0 obj <>stream 0 0 0 0 46 72 d1 46 0 0 72 0 0 cm BI /IM true /W 46 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p! `ÝB8AAznnoP~a:iw] q\.\:4 EI endstream endobj 25 0 obj <>stream 0 0 0 0 57 70 d1 57 0 0 70 0 0 cm BI /IM true /W 57 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID aMD' oA8>~^+qPA@@ EI endstream endobj 26 0 obj <>stream 0 0 0 0 67 70 d1 67 0 0 70 0 0 cm BI /IM true /W 67 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID %!KA@8pBq 'o~oo/~}/K𗄼 N"(PRR` EI endstream endobj 27 0 obj <>stream 0 0 0 -73 57 0 d1 57 0 0 73 0 -73 cm BI /IM true /W 57 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID *j)8l']4 axk   EI endstream endobj 28 0 obj <>stream 0 0 0 0 36 68 d1 36 0 0 68 0 0 cm BI /IM true /W 36 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &AI==?A>IkG&  EI endstream endobj 29 0 obj <>stream 0 0 0 0 55 72 d1 55 0 0 72 0 0 cm BI /IM true /W 55 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID $7&~E?A>7~7Wzkv4J&VRjAd>  EI endstream endobj 30 0 obj <>stream 0 0 0 0 33 79 d1 33 0 0 79 0 0 cm BI /IM true /W 33 /H 79 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3?߿߿߿߿߿߿߿߿  EI endstream endobj 31 0 obj <>stream 0 0 0 0 80 50 d1 80 0 0 50 0 0 cm BI /IM true /W 80 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &zN^{ޯ_Wz}^{^ߵo^ߵoħDgk@ EI endstream endobj 32 0 obj <>stream 0 0 0 0 13 14 d1 13 0 0 14 0 0 cm BI /IM true /W 13 /H 14 /BPC 1 /D[1 0] /F/CCF /DP<> ID &w&ma EI endstream endobj 33 0 obj <>stream 0 0 0 0 86 52 d1 86 0 0 52 0 0 cm BI /IM true /W 86 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID *Ȩ/QIA8l4z^D=Nt[O )50@@@ EI endstream endobj 34 0 obj <>stream 0 0 0 0 40 54 d1 40 0 0 54 0 0 cm BI /IM true /W 40 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &༊_,w!ppO5 k `K,, -. Ud6Xj0 ,' EI endstream endobj 35 0 obj <>stream 0 0 0 0 26 73 d1 26 0 0 73 0 0 cm BI /IM true /W 26 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5_ EI endstream endobj 36 0 obj <>stream 0 0 0 0 57 52 d1 57 0 0 52 0 0 cm BI /IM true /W 57 /H 52 /BPC 1 /D[1 0] /F/CCF /DP<> ID *j)8l'] rt8k}2  EI endstream endobj 37 0 obj <>stream 0 0 0 0 55 74 d1 55 0 0 74 0 0 cm BI /IM true /W 55 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A8er x'0o D~AI?MWvv]^a[v]!k G@ EI endstream endobj 38 0 obj <>stream 0 0 0 0 49 54 d1 49 0 0 54 0 0 cm BI /IM true /W 49 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4H.OD1^ &z_z_m߶ - lVXaal@ EI endstream endobj 39 0 obj <>stream 0 0 0 0 55 50 d1 55 0 0 50 0 0 cm BI /IM true /W 55 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\W{?׽/ׯ~^}zׯ^}zޗq)Ñ EI endstream endobj 40 0 obj <>stream 0 0 0 0 55 75 d1 55 0 0 75 0 0 cm BI /IM true /W 55 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Af=XAO>OGAZ?OO_j .{^׆0^@ EI endstream endobj 41 0 obj <>stream 0 0 0 0 46 54 d1 46 0 0 54 0 0 cm BI /IM true /W 46 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID &]>=C ނoIҿ}/"F5_C v] c ,0Y  EI endstream endobj 42 0 obj <>stream 0 0 0 0 39 73 d1 39 0 0 73 0 0 cm BI /IM true /W 39 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID A?ɨxME' !qkaxk ` EI endstream endobj 43 0 obj <>stream 0 0 0 0 26 71 d1 26 0 0 71 0 0 cm BI /IM true /W 26 /H 71 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5_&ȿ EI endstream endobj 44 0 obj <>stream 0 0 0 0 55 75 d1 55 0 0 75 0 0 cm BI /IM true /W 55 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f Hek)MD }?W~}ivkKW{^^^C@ EI endstream endobj 49 0 obj <>stream 0 0 0 -47 43 0 d1 43 0 0 47 0 -47 cm BI /IM true /W 43 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID !!  EI endstream endobj 50 0 obj <>stream 0 0 0 0 40 37 d1 40 0 0 37 0 0 cm BI /IM true /W 40 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@H xAz|]߿OSMS_^^= k ,( EI endstream endobj 51 0 obj <>stream 0 0 0 0 57 36 d1 57 0 0 36 0 0 cm BI /IM true /W 57 /H 36 /BPC 1 /D[1 0] /F/CCF /DP<> ID $!vpaDWԍ!&k € EI endstream endobj 52 0 obj <>stream 0 0 0 0 39 37 d1 39 0 0 37 0 0 cm BI /IM true /W 39 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID & \.BDzjo.]kkaa  EI endstream endobj 53 0 obj <>stream 0 0 0 -48 40 1 d1 40 0 0 49 0 -48 cm BI /IM true /W 40 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pD%<' ZֹzCO_&av\0[{D@ EI endstream endobj 54 0 obj <>stream 0 0 0 0 37 37 d1 37 0 0 37 0 0 cm BI /IM true /W 37 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$0tCӧɪ~F>; A|W]p*x EI endstream endobj 55 0 obj <>stream 0 0 0 0 38 50 d1 38 0 0 50 0 0 cm BI /IM true /W 38 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID $W@OM?+X꺒X` EI endstream endobj 56 0 obj <>stream 0 0 0 0 38 50 d1 38 0 0 50 0 0 cm BI /IM true /W 38 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A8BDON.﹨jҵ!-5  EI endstream endobj 57 0 obj <>stream 0 0 0 0 12 49 d1 12 0 0 49 0 0 cm BI /IM true /W 12 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID j@ EI endstream endobj 58 0 obj <>stream 0 0 0 0 12 49 d1 12 0 0 49 0 0 cm BI /IM true /W 12 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 59 0 obj <>stream 0 0 0 0 30 45 d1 30 0 0 45 0 0 cm BI /IM true /W 30 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &V_kC G ? EI endstream endobj 60 0 obj <>stream 0 0 0 0 33 37 d1 33 0 0 37 0 0 cm BI /IM true /W 33 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S(C`XK!djK].BaM@ 6,">MW5  EI endstream endobj 61 0 obj <>stream 0 0 0 -47 40 0 d1 40 0 0 47 0 -47 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID !_:Dû1x>.HDu]T(PP EI endstream endobj 62 0 obj <>stream 0 0 0 0 27 36 d1 27 0 0 36 0 0 cm BI /IM true /W 27 /H 36 /BPC 1 /D[1 0] /F/CCF /DP<> ID $?} (H[À EI endstream endobj 63 0 obj <>stream 0 0 0 0 28 49 d1 28 0 0 49 0 0 cm BI /IM true /W 28 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &H G /{ q EI endstream endobj 64 0 obj <>stream 0 0 0 0 36 36 d1 36 0 0 36 0 0 cm BI /IM true /W 36 /H 36 /BPC 1 /D[1 0] /F/CCF /DP<> ID $^5 ma0 EI endstream endobj 65 0 obj <>stream 0 0 0 0 32 37 d1 32 0 0 37 0 0 cm BI /IM true /W 32 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@kZֵBh ޣ5^l0 xx3 EI endstream endobj 66 0 obj <>stream 0 0 0 -47 45 0 d1 45 0 0 47 0 -47 cm BI /IM true /W 45 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pw0o}uX\QUBPRL3 EI endstream endobj 67 0 obj <>stream 0 0 0 0 37 37 d1 37 0 0 37 0 0 cm BI /IM true /W 37 /H 37 /BPC 1 /D[1 0] /F/CCF /DP<> ID &0pC🾜} EI endstream endobj 68 0 obj <>stream 0 0 0 0 55 36 d1 55 0 0 36 0 0 cm BI /IM true /W 55 /H 36 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ħ^_}&lS_@ EI endstream endobj 69 0 obj <>stream 0 0 0 0 39 50 d1 39 0 0 50 0 0 cm BI /IM true /W 39 /H 50 /BPC 1 /D[1 0] /F/CCF /DP<> ID & AEuu-'}}wm;ȅ\0  EI endstream endobj 70 0 obj <>stream 0 0 0 -48 38 1 d1 38 0 0 49 0 -48 cm BI /IM true /W 38 /H 49 /BPC 1 /D[1 0] /F/CCF /DP<> ID &dS0M`Zd0BpZZZ 8 h &2ᐃ@@ EI endstream endobj 71 0 obj <>stream 0 0 0 -90 91 2 d1 91 0 0 92 0 -90 cm BI /IM true /W 91 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID &S@d< O=======?77} ^M}??5Tw^{va- ,,,Z@@ EI endstream endobj 72 0 obj <>stream 0 0 0 0 76 66 d1 76 0 0 66 0 0 cm BI /IM true /W 76 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Uzz%վ'Iվ_[}o߫ҿ/&/W EI endstream endobj 73 0 obj <>stream 0 0 0 0 71 70 d1 71 0 0 70 0 0 cm BI /IM true /W 71 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Syy DH@]u_ xD6U@A?Azwau&mkkkkXaa@>stream 0 0 0 0 49 68 d1 49 0 0 68 0 0 cm BI /IM true /W 49 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID /}ݨ`PAxrjY y@ EI endstream endobj 75 0 obj <>stream 0 0 0 0 22 92 d1 22 0 0 92 0 0 cm BI /IM true /W 22 /H 92 /BPC 1 /D[1 0] /F/CCF /DP<> ID ɨ7  EI endstream endobj 76 0 obj <>stream 0 0 0 0 103 66 d1 103 0 0 66 0 0 cm BI /IM true /W 103 /H 66 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P bi!}y/o[nkVj_j?ڵ@ EI endstream endobj 78 0 obj <>stream 0 0 0 -59 55 0 d1 55 0 0 59 0 -59 cm BI /IM true /W 55 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' 95Z~_zxhio[wmVoo@ EI endstream endobj 79 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΀0xAfAA_o߿!h' >OIWT]㽕kkk EI endstream endobj 80 0 obj <>stream 0 0 0 0 26 45 d1 26 0 0 45 0 0 cm BI /IM true /W 26 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3?}(k{ÓP^  EI endstream endobj 81 0 obj <>stream 0 0 0 0 41 47 d1 41 0 0 47 0 0 cm BI /IM true /W 41 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/!" 뮊?A+~hk0mmma0` EI endstream endobj 82 0 obj <>stream 0 0 0 0 38 47 d1 38 0 0 47 0 0 cm BI /IM true /W 38 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &d2s}>-_~d@xxyW ?h^ %뭬Y @ EI endstream endobj 83 0 obj <>stream 0 0 0 0 28 57 d1 28 0 0 57 0 0 cm BI /IM true /W 28 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID &΂怔D~ML1  EI endstream endobj 84 0 obj <>stream 0 0 0 -59 47 0 d1 47 0 0 59 0 -59 cm BI /IM true /W 47 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 /////KK kûa׭uYdUUB*@ EI endstream endobj 85 0 obj <>stream 0 0 0 0 65 45 d1 65 0 0 45 0 0 cm BI /IM true /W 65 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 aZ}wPXaacbk[A4jMC EI endstream endobj 86 0 obj <>stream 0 0 0 0 41 47 d1 41 0 0 47 0 0 cm BI /IM true /W 41 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &gMpA< j^H O^j_0u EI endstream endobj 87 0 obj <>stream 0 0 0 -59 55 0 d1 55 0 0 59 0 -59 cm BI /IM true /W 55 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 _N7&7&7&1?@ EI endstream endobj 88 0 obj <>stream 0 0 0 0 43 61 d1 43 0 0 61 0 0 cm BI /IM true /W 43 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &30!Q^^^}zޗz_ׯ~ޗz_خ EI endstream endobj 89 0 obj <>stream 0 0 0 -60 48 2 d1 48 0 0 62 0 -60 cm BI /IM true /W 48 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &lП==:Ѩ.A >_&am[kaa AA EI endstream endobj 90 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3񑇂Ay ׷_Wk}aa[XjMC EI endstream endobj 91 0 obj <>stream 0 0 0 -59 9 0 d1 9 0 0 59 0 -59 cm BI /IM true /W 9 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 92 0 obj <>stream 0 0 0 0 37 45 d1 37 0 0 45 0 0 cm BI /IM true /W 37 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 եk %Lk l)5€ EI endstream endobj 93 0 obj <>stream 0 0 0 0 29 61 d1 29 0 0 61 0 0 cm BI /IM true /W 29 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &3 #Qt- EI endstream endobj 94 0 obj <>stream 0 0 0 0 36 47 d1 36 0 0 47 0 0 cm BI /IM true /W 36 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &yAִkCz+Tl c  @ EI endstream endobj 95 0 obj <>stream 0 0 0 -61 19 11 d1 19 0 0 72 0 -61 cm BI /IM true /W 19 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ֺ____jw EI endstream endobj 96 0 obj <>stream 0 0 0 -61 19 11 d1 19 0 0 72 0 -61 cm BI /IM true /W 19 /H 72 /BPC 1 /D[1 0] /F/CCF /DP<> ID >ɪ___@ EI endstream endobj 97 0 obj <>stream 0 0 0 -61 8 0 d1 8 0 0 61 0 -61 cm BI /IM true /W 8 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID j/ EI endstream endobj 98 0 obj <>stream 0 0 0 0 34 47 d1 34 0 0 47 0 0 cm BI /IM true /W 34 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &y$;a8Z OK a-Z#*!  ( EI endstream endobj 99 0 obj <>stream 0 0 0 -44 60 0 d1 60 0 0 44 0 -44 cm BI /IM true /W 60 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Ip~~^f__~~_){= EI endstream endobj 100 0 obj <>stream 0 0 0 0 40 63 d1 40 0 0 63 0 0 cm BI /IM true /W 40 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &! ::&}>q_ɪ_om U]  EI endstream endobj 101 0 obj <>stream 0 0 0 0 8 61 d1 8 0 0 61 0 0 cm BI /IM true /W 8 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 102 0 obj <>stream 0 0 0 0 40 63 d1 40 0 0 63 0 0 cm BI /IM true /W 40 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &1!l=)7OO^_ֿkխW3Kama0X EI endstream endobj 103 0 obj <>stream 0 0 0 -61 37 0 d1 37 0 0 61 0 -61 cm BI /IM true /W 37 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 եk %Lk l,X EI endstream endobj 104 0 obj <>stream 0 0 0 -26 22 -18 d1 22 0 0 8 0 -26 cm BI /IM true /W 22 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 105 0 obj <>stream 0 0 0 0 38 46 d1 38 0 0 46 0 0 cm BI /IM true /W 38 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &DdO}|tH}?u  EI endstream endobj 106 0 obj <>stream 0 0 0 -10 9 0 d1 9 0 0 10 0 -10 cm BI /IM true /W 9 /H 10 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 107 0 obj <>stream 0 0 0 -59 8 -36 d1 8 0 0 23 0 -59 cm BI /IM true /W 8 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 108 0 obj <>stream 0 0 0 0 17 78 d1 17 0 0 78 0 0 cm BI /IM true /W 17 /H 78 /BPC 1 /D[1 0] /F/CCF /DP<> ID 48w}ɩ~A_'@ EI endstream endobj 109 0 obj <>stream 0 0 0 -42 9 0 d1 9 0 0 42 0 -42 cm BI /IM true /W 9 /H 42 /BPC 1 /D[1 0] /F/CCF /DP<> ID ɨ恿  EI endstream endobj 110 0 obj <>stream 0 0 0 0 40 61 d1 40 0 0 61 0 0 cm BI /IM true /W 40 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 Z KKKKKKKKKKKKKK iEUU]Ù{xo EI endstream endobj 111 0 obj <>stream 0 0 0 0 43 44 d1 43 0 0 44 0 0 cm BI /IM true /W 43 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@/{zޗzޗzޗ~ޗ  EI endstream endobj 112 0 obj <>stream 0 0 0 0 36 44 d1 36 0 0 44 0 0 cm BI /IM true /W 36 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID 2{{{{{{{{{(S EI endstream endobj 113 0 obj <>stream 0 0 0 -59 39 0 d1 39 0 0 59 0 -59 cm BI /IM true /W 39 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4'p+`<7/ "xT  EI endstream endobj 114 0 obj <>stream 0 0 0 -60 52 2 d1 52 0 0 62 0 -60 cm BI /IM true /W 52 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &p4HhӣP&@KK__?6w l/kl/ .{Xa`d  EI endstream endobj 115 0 obj <>stream 0 0 0 -10 12 10 d1 12 0 0 20 0 -10 cm BI /IM true /W 12 /H 20 /BPC 1 /D[1 0] /F/CCF /DP<> ID <[MWo EI endstream endobj 116 0 obj <>stream 0 0 0 0 51 59 d1 51 0 0 59 0 0 cm BI /IM true /W 51 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &6  EI endstream endobj 117 0 obj <>stream 0 0 0 0 43 44 d1 43 0 0 44 0 0 cm BI /IM true /W 43 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID 'j]mkmkm_]ޞ|zWޓzWޓzWޓz\@ EI endstream endobj 118 0 obj <>stream 0 0 0 -59 49 0 d1 49 0 0 59 0 -59 cm BI /IM true /W 49 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID "û;w\%BEUUBwsPN\ U p EI endstream endobj 119 0 obj <>stream 0 0 0 0 15 61 d1 15 0 0 61 0 0 cm BI /IM true /W 15 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 120 0 obj <>stream 0 0 0 0 49 47 d1 49 0 0 47 0 0 cm BI /IM true /W 49 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &7 @׽>D]}&⽿5M/_د ,@ EI endstream endobj 121 0 obj <>stream 0 0 0 0 40 47 d1 40 0 0 47 0 0 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &y`5 ֵk =G_rj- { k  EI endstream endobj 122 0 obj <>stream 0 0 0 0 49 61 d1 49 0 0 61 0 0 cm BI /IM true /W 49 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID :4KKKJ*uOoooooooooa EI endstream endobj 123 0 obj <>stream 0 0 0 0 15 61 d1 15 0 0 61 0 0 cm BI /IM true /W 15 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID j:@ EI endstream endobj 124 0 obj <>stream 0 0 0 0 45 45 d1 45 0 0 45 0 0 cm BI /IM true /W 45 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID :?چ +RRj @@ EI endstream endobj 125 0 obj <>stream 0 0 0 0 48 63 d1 48 0 0 63 0 0 cm BI /IM true /W 48 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &73@}4 Ou}r0|'~?.;UAA EI endstream endobj 126 0 obj <>stream 0 0 0 -45 45 2 d1 45 0 0 47 0 -45 cm BI /IM true /W 45 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &2D2z~e8=&?! !Ĥ5X\^N_]pQ EI endstream endobj 127 0 obj <>stream 0 0 0 0 48 63 d1 48 0 0 63 0 0 cm BI /IM true /W 48 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ːaOZ~:־N/OI+y5O뿭 ckkap@ EI endstream endobj 128 0 obj <>stream 0 0 0 -59 53 0 d1 53 0 0 59 0 -59 cm BI /IM true /W 53 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID :}}}}k־K/_______Z EI endstream endobj 129 0 obj <>stream 0 0 0 -29 25 -17 d1 25 0 0 12 0 -29 cm BI /IM true /W 25 /H 12 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 130 0 obj <>stream 0 0 0 -61 48 2 d1 48 0 0 63 0 -61 cm BI /IM true /W 48 /H 63 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`oa=}"tMki}0uNmmma?@ EI endstream endobj 131 0 obj <>stream 0 0 0 -59 56 0 d1 56 0 0 59 0 -59 cm BI /IM true /W 56 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID "@ppo}K`cQ]UBPH7$@ EI endstream endobj 132 0 obj <>stream 0 0 0 0 36 57 d1 36 0 0 57 0 0 cm BI /IM true /W 36 /H 57 /BPC 1 /D[1 0] /F/CCF /DP<> ID & &jޢ?5#c@ EI endstream endobj 133 0 obj <>stream 0 0 0 -59 55 0 d1 55 0 0 59 0 -59 cm BI /IM true /W 55 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &?Ho EI endstream endobj 134 0 obj <>stream 0 0 0 0 34 45 d1 34 0 0 45 0 0 cm BI /IM true /W 34 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID :waAUMAD@ EI endstream endobj 135 0 obj <>stream 0 0 0 0 40 47 d1 40 0 0 47 0 0 cm BI /IM true /W 40 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"F8\;N @rĊ7 at()P @*(Xd"#} ,O EI endstream endobj 136 0 obj <>stream 0 0 0 0 35 61 d1 35 0 0 61 0 0 cm BI /IM true /W 35 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID &:%j3'{À EI endstream endobj 137 0 obj <>stream 0 0 0 0 48 47 d1 48 0 0 47 0 0 cm BI /IM true /W 48 /H 47 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h\F xAב15MW^`\{[[[[[XaacX EI endstream endobj 138 0 obj <>stream 0 0 0 -60 61 2 d1 61 0 0 62 0 -60 cm BI /IM true /W 61 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &l3$6OO?P"ҿ}&?_Km.]+ ,,  EI endstream endobj 139 0 obj <>stream 0 0 0 0 48 62 d1 48 0 0 62 0 0 cm BI /IM true /W 48 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID :_$dza]܈M7QU: EI endstream endobj 140 0 obj <>stream 0 0 0 0 40 62 d1 40 0 0 62 0 0 cm BI /IM true /W 40 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &COOIzu}&[ .;Vav0D5 EI endstream endobj 141 0 obj <>stream 0 0 0 -59 23 -36 d1 23 0 0 23 0 -59 cm BI /IM true /W 23 /H 23 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3 EI endstream endobj 142 0 obj <>stream 0 0 0 -59 45 0 d1 45 0 0 59 0 -59 cm BI /IM true /W 45 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4_____F_]}u_]}uK믮 EI endstream endobj 143 0 obj <>stream 0 0 0 0 46 61 d1 46 0 0 61 0 0 cm BI /IM true /W 46 /H 61 /BPC 1 /D[1 0] /F/CCF /DP<> ID <@zOOG@7 EI endstream endobj 144 0 obj <>stream 0 0 0 0 38 59 d1 38 0 0 59 0 0 cm BI /IM true /W 38 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID h EI endstream endobj 145 0 obj <>stream 0 0 0 -60 42 2 d1 42 0 0 62 0 -60 cm BI /IM true /W 42 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &"ɤCFn <'K]pK!>ApOZ Ah06Q `.2C ]AǾ EI endstream endobj 146 0 obj <>stream 0 0 0 0 42 6 d1 42 0 0 6 0 0 cm BI /IM true /W 42 /H 6 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 147 0 obj <>stream 0 0 0 0 55 59 d1 55 0 0 59 0 0 cm BI /IM true /W 55 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &ܠ{׿׿拯~OzO}zO}zO}zO}qX EI endstream endobj 148 0 obj <>stream 0 0 0 -59 27 8 d1 27 0 0 67 0 -59 cm BI /IM true /W 27 /H 67 /BPC 1 /D[1 0] /F/CCF /DP<> ID >ɪ@ EI endstream endobj 150 0 obj <>stream 0 0 0 -70 56 0 d1 56 0 0 70 0 -70 cm BI /IM true /W 56 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID :Vw[uu~[[@ EI endstream endobj 151 0 obj <>stream 0 0 0 0 52 70 d1 52 0 0 70 0 0 cm BI /IM true /W 52 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID :uZZZZ_X,UuWwws^Kɫ몪 F` EI endstream endobj 152 0 obj <>stream 0 0 0 0 50 70 d1 50 0 0 70 0 0 cm BI /IM true /W 50 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID $No? EI endstream endobj 153 0 obj <>stream 0 0 0 0 44 74 d1 44 0 0 74 0 0 cm BI /IM true /W 44 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\$q xAk\ =>Nj{ mv a{<@ EI endstream endobj 154 0 obj <>stream 0 0 0 0 42 70 d1 42 0 0 70 0 0 cm BI /IM true /W 42 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5: @ EI endstream endobj 155 0 obj <>stream 0 0 0 13 58 23 d1 58 0 0 10 0 13 cm BI /IM true /W 58 /H 10 /BPC 1 /D[1 0] /F/CCF /DP<> ID @ EI endstream endobj 156 0 obj <>stream 0 0 0 0 48 70 d1 48 0 0 70 0 0 cm BI /IM true /W 48 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID !}(Z___X__ EI endstream endobj 157 0 obj <>stream 0 0 0 0 50 70 d1 50 0 0 70 0 0 cm BI /IM true /W 50 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$ EI endstream endobj 158 0 obj <>stream 0 0 0 -70 46 0 d1 46 0 0 70 0 -70 cm BI /IM true /W 46 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID :u@ EI endstream endobj 159 0 obj <>stream 0 0 0 0 48 70 d1 48 0 0 70 0 0 cm BI /IM true /W 48 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID )`88pG>{Z\N+ Ip EI endstream endobj 160 0 obj <>stream 0 0 0 0 44 70 d1 44 0 0 70 0 0 cm BI /IM true /W 44 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3@ EI endstream endobj 161 0 obj <>stream 0 0 0 0 45 70 d1 45 0 0 70 0 0 cm BI /IM true /W 45 /H 70 /BPC 1 /D[1 0] /F/CCF /DP<> ID ?]u  EI endstream endobj 163 0 obj <>stream 0 0 0 -73 23 13 d1 23 0 0 86 0 -73 cm BI /IM true /W 23 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &^K^_/ׯ~~} EI endstream endobj 164 0 obj <>stream 0 0 0 -54 44 2 d1 44 0 0 56 0 -54 cm BI /IM true /W 44 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`BU >:D0:u߾ci,k O]u , EI endstream endobj 165 0 obj <>stream 0 0 0 0 39 54 d1 39 0 0 54 0 0 cm BI /IM true /W 39 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID ' }݅jPFNk )5  EI endstream endobj 166 0 obj <>stream 0 0 0 0 49 54 d1 49 0 0 54 0 0 cm BI /IM true /W 49 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 3h[O҈I3Vi& EI endstream endobj 167 0 obj <>stream 0 0 0 0 41 56 d1 41 0 0 56 0 0 cm BI /IM true /W 41 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &,0 Z">uA zA_j{am[EE<0`@@ EI endstream endobj 168 0 obj <>stream 0 0 0 0 44 73 d1 44 0 0 73 0 0 cm BI /IM true /W 44 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID MApc   EI endstream endobj 169 0 obj <>stream 0 0 0 18 48 23 d1 48 0 0 5 0 18 cm BI /IM true /W 48 /H 5 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 170 0 obj <>stream 0 0 0 -73 41 0 d1 41 0 0 73 0 -73 cm BI /IM true /W 41 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4KJX0SEkk a0X@ EI endstream endobj 171 0 obj <>stream 0 0 0 0 44 75 d1 44 0 0 75 0 0 cm BI /IM true /W 44 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g (> F OO=}?k_]`e"papaq EI endstream endobj 172 0 obj <>stream 0 0 0 0 42 74 d1 42 0 0 74 0 0 cm BI /IM true /W 42 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &_ Z$z EI endstream endobj 173 0 obj <>stream 0 0 0 -68 43 0 d1 43 0 0 68 0 -68 cm BI /IM true /W 43 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &/sP| Q4 EI endstream endobj 174 0 obj <>stream 0 0 0 -72 44 -27 d1 44 0 0 45 0 -72 cm BI /IM true /W 44 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID &g 裏<'<&Mpz a" ,0 ,05K p k5 EI endstream endobj 175 0 obj <>stream 0 0 0 -54 41 0 d1 41 0 0 54 0 -54 cm BI /IM true /W 41 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4KJX0SEkk a5@@ EI endstream endobj 176 0 obj <>stream 0 0 0 0 44 75 d1 44 0 0 75 0 0 cm BI /IM true /W 44 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!f=r]9L 7O^{^_oJҵ EsD k  EI endstream endobj 177 0 obj <>stream 0 0 0 0 48 56 d1 48 0 0 56 0 0 cm BI /IM true /W 48 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`F z "?:>?>.K+ɪ' .׺^av %mml,5 @ EI endstream endobj 178 0 obj <>stream 0 0 0 -73 22 13 d1 22 0 0 86 0 -73 cm BI /IM true /W 22 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4ɪu___ֽkֽkֽkW EI endstream endobj 179 0 obj <>stream 0 0 0 -59 75 0 d1 75 0 0 59 0 -59 cm BI /IM true /W 75 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &PHkkkEޗޗޗ׮׿׮׿׮׿^׿^׿^[^  EI endstream endobj 180 0 obj <>stream 0 0 0 -59 43 0 d1 43 0 0 59 0 -59 cm BI /IM true /W 43 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID #Aû~:xU xo}]t 2*B` EI endstream endobj 181 0 obj <>stream 0 0 0 -59 35 0 d1 35 0 0 59 0 -59 cm BI /IM true /W 35 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 #w恕  EI endstream endobj 182 0 obj <>stream 0 0 0 0 55 62 d1 55 0 0 62 0 0 cm BI /IM true /W 55 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`^xA=PA&&;wW5_wm.m-avKb   EI endstream endobj 183 0 obj <>stream 0 0 0 -72 61 2 d1 61 0 0 74 0 -72 cm BI /IM true /W 61 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &P He(:ֵk1A IzU߿o\0`@ˎx{  ,XLZ  EI endstream endobj 184 0 obj <>stream 0 0 0 0 58 56 d1 58 0 0 56 0 0 cm BI /IM true /W 58 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &\ < =>BAO߿OSjMV{vKk    EI endstream endobj 185 0 obj <>stream 0 0 0 0 54 56 d1 54 0 0 56 0 0 cm BI /IM true /W 54 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &!+ =ӧjH/xx<^ %>뮸Yo  EI endstream endobj 186 0 obj <>stream 0 0 0 0 17 73 d1 17 0 0 73 0 0 cm BI /IM true /W 17 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 187 0 obj <>stream 0 0 0 0 57 56 d1 57 0 0 56 0 0 cm BI /IM true /W 57 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`6HgQ#bA<.]]tI`AG)gVja.]k}0T@ EI endstream endobj 188 0 obj <>stream 0 0 0 0 49 56 d1 49 0 0 56 0 0 cm BI /IM true /W 49 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &A 3By1<}> @Ԃ `\% @.@N Uɪ`}8 BH`d@ EI endstream endobj 189 0 obj <>stream 0 0 0 0 47 56 d1 47 0 0 56 0 0 cm BI /IM true /W 47 /H 56 /BPC 1 /D[1 0] /F/CCF /DP<> ID &`

:5O a[  r@ EI endstream endobj 190 0 obj <>stream 0 0 0 0 17 73 d1 17 0 0 73 0 0 cm BI /IM true /W 17 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5?Xo EI endstream endobj 191 0 obj <>stream 0 0 0 0 53 54 d1 53 0 0 54 0 0 cm BI /IM true /W 53 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5{P([ If EI endstream endobj 192 0 obj <>stream 0 0 0 0 57 75 d1 57 0 0 75 0 0 cm BI /IM true /W 57 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &N $)< |>>h >? M1AOZ/ ק+^MUwk{#Kk a EI endstream endobj 193 0 obj <>stream 0 0 0 0 86 54 d1 86 0 0 54 0 0 cm BI /IM true /W 86 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID )riVX0TIk 5 MC0 ` EI endstream endobj 194 0 obj <>stream 0 0 0 -73 29 13 d1 29 0 0 86 0 -73 cm BI /IM true /W 29 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID &kֽk_ZZ&{  EI endstream endobj 195 0 obj <>stream 0 0 0 -68 43 0 d1 43 0 0 68 0 -68 cm BI /IM true /W 43 /H 68 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Bu&D5#R EI endstream endobj 196 0 obj <>stream 0 0 0 0 40 54 d1 40 0 0 54 0 0 cm BI /IM true /W 40 /H 54 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5OZ3  EI endstream endobj 197 0 obj <>stream 0 0 0 0 57 75 d1 57 0 0 75 0 0 cm BI /IM true /W 57 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &4c\2I>}r }}}~&w\0?{[] p  EI endstream endobj 198 0 obj <>stream 0 0 0 0 60 74 d1 60 0 0 74 0 0 cm BI /IM true /W 60 /H 74 /BPC 1 /D[1 0] /F/CCF /DP<> ID &Sao^??׿׽޿Ozzׯ}>ޓz_7 EI endstream endobj 199 0 obj <>stream 0 0 0 -73 42 0 d1 42 0 0 73 0 -73 cm BI /IM true /W 42 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID &xJ#MD5P/{@ EI endstream endobj 200 0 obj <>stream 0 0 0 -73 57 2 d1 57 0 0 75 0 -73 cm BI /IM true /W 57 /H 75 /BPC 1 /D[1 0] /F/CCF /DP<> ID &f2zzzzqw}7~뿯kik a ,,  EI endstream endobj 201 0 obj <>stream 0 0 0 0 83 53 d1 83 0 0 53 0 0 cm BI /IM true /W 83 /H 53 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@.DUU_ѭ_'_'_'ZZ{: EI endstream endobj 202 0 obj <>stream 0 0 0 0 53 73 d1 53 0 0 73 0 0 cm BI /IM true /W 53 /H 73 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5{P([ `c EI endstream endobj 203 0 obj <>stream 0 0 0 -73 29 13 d1 29 0 0 86 0 -73 cm BI /IM true /W 29 /H 86 /BPC 1 /D[1 0] /F/CCF /DP<> ID :5O~o߿KKz/ׯ.^ EI endstream endobj 204 0 obj <>stream 0 0 0 -59 39 0 d1 39 0 0 59 0 -59 cm BI /IM true /W 39 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID h o@h@ EI endstream endobj 205 0 obj <>stream 0 0 0 -59 36 0 d1 36 0 0 59 0 -59 cm BI /IM true /W 36 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &=??MnE  EI endstream endobj 206 0 obj <>stream 0 0 0 0 50 44 d1 50 0 0 44 0 0 cm BI /IM true /W 50 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5Rj[vmv[[]ozzԟzO}7zM^<@ EI endstream endobj 207 0 obj <>stream 0 0 0 -60 38 0 d1 38 0 0 60 0 -60 cm BI /IM true /W 38 /H 60 /BPC 1 /D[1 0] /F/CCF /DP<> ID MQ@e[oooooooooo}o: xa.Hu[X0ad EI endstream endobj 208 0 obj <>stream 0 0 0 0 72 45 d1 72 0 0 45 0 0 cm BI /IM true /W 72 /H 45 /BPC 1 /D[1 0] /F/CCF /DP<> ID :A?nkXJTi4aI(P EI endstream endobj 209 0 obj <> endobj 47 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? ZjΈup_񮂊5s'L5#5.yGrOZ2F!5u:rLbHIqV4gm_Yܕb } YeVRR0AzNuD9>eV.ؕPΡFݎ;kw/ )cSQt#h$Is5}Va~Boh!ϱq0 | gu*>cy|:]Iz~{~ˌwqһ +Cӆy[|4mbֺi*hH"nXʏúLRyc ֚"ơQBSYI= {KY<1,«I!6ħ__sףg?94f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3Fj<њ4f 3FiI3Q4gTy4ggTy4ggTy4ggTy4ggTy4ggTy4ggTy4ggTy4ggTy4ggTy4g5is@Kբ((=ͺ3x Ί(;4Lzo5zC1[Sɢw  )hQ@fK9l"(EPsMP4M@3zq]sy袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y袀 z~:3y3y7~:(7~:3{3{7~:(7~:3{3{7~:(7~:3{3{7~:(7~:3{3{7~:(7~:3{3{7~:(7߯Όz袀 z߯Ί( endstream endobj 46 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?5M4s/?V])6_j4nb}Ā DmNƅtk<2|ە߇r?T}ѱv=l9S״|p.?GZjwfިIorjޘ(Oj￳.%DS3 94Ev4ܜbwoiA%snFIaEmgYՒ2]$uGʭhLn72սt16JGi:U <拷P](eH&[wWvʗ2fş1OJ.QӴ{m2YZz$eգE'JV ]5sq{{"25}1;H&*2W9JK[k-ıear5r߾v#5\_0MK䷽+[?$#׎9玵cg;噉'j@q׷9 ~ma cjޱFj?k.Wpې{'9@ʡuPghC`L]>eqrWRpi\ "O+zҒڤ1ۮihu, tJ[:9QK| mͣ=َ< yEzcP&k7&,32כrl 8;k0B;Ri5=BN6K3F00>j(>qimmwr^Y.Z HNI8ֆ4 \*Y\; Rd ('oZ9[k?hh! wrHnzqگYOV c]]ܳr ]vpsUE@r,W&eVi+Oѭ^5-mY75!ޘu4Q ɷTl?9Hۜsg sU|Isv(o%XYc տAƶh*XdiRahj>>}*=2{9e7(jߌsh' ww$Zq1Qp_RFaMi}& o#$̦F.ۗxF3kp9[Cy{4Nm)(~xR kNS.#($3sZZկ 1 %C? \1H滎+XG/z ;xB@TVG56V2^aϽ G=F~-m/aM:A&1r#p3ں:) nftT1-KEd^ֆh;Kl0,3!y{h\i~ #xTۃRyMynPk|xv#2A7!(z<R[3]Xs ݞp@99*X(,jN> 05RZy h7FT uo6 1PW:g WGE4G$_hܑO$_h*1N[{߷x-{ٴy1DŽ#ȹoLv(rS$H'^|]TqwR=]z!"].K(OSE>ar.&giuM /} ĐA4f+am-Ա _9YY . 1=>K|)iWlrp8;w$r@$qj[aqq>_4#?c.Sn..n^=A$^<\|ǰ?hJET*ĶfA=s@gџcLϰ>€cF}3>Œ ~}4 3(4g3(ϰџcLϰ>€cF}3>Œ ~}4 3(4g3(ϰџcLϰ>€cF}3>Œ ~}4 3@fw4`AJt?M!"4mVQWt8 HOxMFrHxյ?=S{Ndޥ-^D>,Cﵯ tЯ (Fգ/x y#ƌKhz*Aב<}i=H !#A^GbvIRg/RcJv.O)>q<#q~q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W?(W?>q<#>q<#W&(72zO/?p83hϱ3hϱ3hϱ3hϱ3hϱ3hϱ3hϱ3hϱ3hϱ3hϱ3hP3E endstream endobj 45 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( (9N'@Qf(>f(>f(>f(>f(>f(>f(>f(>f(>f(>f(>f(>:QEqKERdd((uzE-Q@l$j 2p=P#כXirmRms.VM]w#kS).H> endobj 215 0 obj <>stream 0 0 0 -59 46 0 d1 46 0 0 59 0 -59 cm BI /IM true /W 46 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 4 h EI endstream endobj 219 0 obj <>stream 0 0 0 -60 41 2 d1 41 0 0 62 0 -60 cm BI /IM true /W 41 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID & D 7zWV %SDZ0/!] Ǿ}` EI endstream endobj 220 0 obj <>stream 0 0 0 0 44 59 d1 44 0 0 59 0 0 cm BI /IM true /W 44 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID &h/A?oo  EI endstream endobj 221 0 obj <>stream 0 0 0 -59 53 0 d1 53 0 0 59 0 -59 cm BI /IM true /W 53 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5^^^׬%(w#{5q]uUP  EI endstream endobj 222 0 obj <>stream 0 0 0 -59 62 0 d1 62 0 0 59 0 -59 cm BI /IM true /W 62 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID 5E5Z޽{]jmk][~q[ EI endstream endobj 223 0 obj <>stream 0 0 0 0 45 46 d1 45 0 0 46 0 0 cm BI /IM true /W 45 /H 46 /BPC 1 /D[1 0] /F/CCF /DP<> ID &2D=a>_S: EI endstream endobj 224 0 obj <>stream 0 0 0 0 51 62 d1 51 0 0 62 0 0 cm BI /IM true /W 51 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &$Vj >}C1z:/ׯz}>W~z_}7  EI endstream endobj 225 0 obj <>stream 0 0 0 11 40 19 d1 40 0 0 8 0 11 cm BI /IM true /W 40 /H 8 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 226 0 obj <>stream 0 0 0 -44 70 0 d1 70 0 0 44 0 -44 cm BI /IM true /W 70 /H 44 /BPC 1 /D[1 0] /F/CCF /DP<> ID &@~oo~ ^}k}ko_o_[` EI endstream endobj 227 0 obj <>stream 0 0 0 -59 50 0 d1 50 0 0 59 0 -59 cm BI /IM true /W 50 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID Aû!\7{-p |*B0TP EI endstream endobj 228 0 obj <>stream 0 0 0 -59 66 0 d1 66 0 0 59 0 -59 cm BI /IM true /W 66 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID :}}}~_u߮Ӏ EI endstream endobj 229 0 obj <>stream 0 0 0 -59 42 0 d1 42 0 0 59 0 -59 cm BI /IM true /W 42 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID Pe EI endstream endobj 230 0 obj <>stream 0 0 0 0 51 62 d1 51 0 0 62 0 0 cm BI /IM true /W 51 /H 62 /BPC 1 /D[1 0] /F/CCF /DP<> ID &pn#R< ZֵʲAzUu C ,0dD@@ EI endstream endobj 231 0 obj <>stream 0 0 0 0 16 59 d1 16 0 0 59 0 0 cm BI /IM true /W 16 /H 59 /BPC 1 /D[1 0] /F/CCF /DP<> ID  EI endstream endobj 232 0 obj <> endobj 218 0 obj <>/Length 2471>>stream x]=lsq.Bj,XXXI*NXXMXE@ 8.$ HAt!nȂ" 0DbLWH lBW 7ovfnwwYW,ٝ;[! aQSn|D2]y)O=__NCdd[{Y(:5(-=YE&-`X͖|F)I2x  9= X Ȗ%" WBɺ|#ğ%ERʩ,ZM4.+PUFy4RԢ)H] ֤}M: 7R(Q< L׼23a็멿i&W3IxG$y (%.RTG& q%Do-E4(Z _ᤋq:ݒlw?C?wա%0Jr+џp>@>e9aR'0{()CP'TV/?Kłmbd# @;}Jpp)%^gh.zWodC)t\x"q(tAh w!M)/oBg )W R^ɜr I7NK>l*=@v5xbO1xf"J9h ?]X)dK_'wF9oIҭF v+.AMʄ|=;F7s)oAF>%(q]#,%\:%Ecç5JIGJHQB|JIKZĔ2-'7ae8EK5-=TݻJ v+]H8#qMb,Š,wCGBP> W>!]&1`E`C#A oI!AԜR~%pQKU~ݣ&nm<ذ81hw)?i\ 7x[ ]K4ݩ%2g0$JgrL y[G e %>s+OL m_ucG}R@jJ 6Jrkq l?3rU)y`*> => >e-G}JQ ̕V@,sb>6. R)ʉ#m) I^7)GR q10Jȭ`S}DG-ٙ0R 3y[TR)U 8[َ7lmqp00$Q5mUJ+rrH*S6ٰqߡS iT)jjmpuC4jlXgZdPM"v=\g)Ζ[4)eliNH*ebJ録prӍ(Rhn1{,e'@R8b@Oi Hrn[.=^2ĸJ:!}{_MiϘxoE _OfR O*B)snW&hF Py4DUPJfff9Gt'ORōu޷ l?SNPCӖuW(26b1aQni\w׏K7!e[sܫ2J(Jg3JCҡtpFP:8t(Q:(J] endstream endobj 217 0 obj <>/Length 4375>>stream x]1lGSSHTD TY8S$QadaRaVq9:6`+B.B.. p6 0 fvvfܥv%+V]oasL2- +-9ImBU-JMnװW^h \Ի| F'lkV'9o2\T{tqhr`)ye畑0h70c=+.1\>r)_`Uv)Am-|-M=~5gV8Xߪí 4B.GQ"UQWUEx- *< 5xM}F#ĕÄR@|)[ (xZȒ@(g;6b ZEUI 0 w-:K&_ag2`JM`$S:/HuW R I<~SfL <+YvsĦ Z5"2߬\ji/7# (ɾSR)`c͞? jX嶪:|oGOk*22uJ@̵s.&/$ĩ.5&'A>?Ah)w|szTbsM.Mj@nR6*SF@r@PVTUD^Acܔl3UM.a|ꥪ\ُ:|z+l ?b)s{āW,R# I0h'z]ńk%J d)Oata~hE Fc?HXK-g22q ,թ砤պf)7xǔOÃĦ3n(S8ֆߙ|SeƶS޿ \GR# IY -!'#9mB<(jl#{>~o0L)sʭ8$xxSF> 23|-c1u X;~JKgzJ]+w|HNC,= 3wC)Z]"U5 FT|L/Xqˣ T *>kdq- DJձHT~ɂ)s r-}9 #rÔ-!Sn+o~jpּUQ8L9S'Q8BfIHFc0L$ |#vs^vU.CDMu]BL_ұC*wEN c:VLYC[LI [PkcTgùq9eG8BQa-Y4OjŔ uz>˨-{g5H#uls}/^B8LɆN0'1ǔo7[qIp Q1gJql[YM)ű堓|]SNJklJǬNpdN33W⟊<%Az}S`0R1eny$1er8aSyF23¨Sz>#i,`)1g8g^gB駒$)gÑ7/<}݀4#K6 Qڡ 2ZBߪ_a@A斎li[]&{UڪW3 ~8ͅq kBbF>R0KQ听(I8.fv mIiTNVcVŔ3=T񘍷LfmnŐd(ZUn?h1Sd4,s1e!LL(ըۘOـyk5tb _CCɔq-]n[Sf#_`QƄv}ە-?>JC9p M{cl $@Sv4f?Ŕfe"LozC_$/&E `Bas3*ےіzog6b`o9HKc27Ͻ cJ6į6H;yGѡB&m07bJ8\oIf-^F tIegG̜P oY8U9*:!ų [L KqĔ[YȌgQYEnj~dJe2͏(Q!n79 Vl-x!d36w2y"}ר2T2la\ľ9eਂCB& Q>Yg uq8kZ胇LImi+;8Žleܢ^ViczKNxq<19e?y%O2SnWx(͌@R(,KVo˔M7B7m-F6 lj+crJV~L]D󙶷N`zG}vʅ@gۖꜵUfvm=gv)Оe[X%,8E)ÂdJS=<% XLoM!X;/SB^VL]A[b+M~ 8[wl[ⲗLs$$)>)'Uz)t/d E'!j٬ WZ\n>saBocf{A-`A2Ae'a#$6[P6l5SNan gӓ*u=-#79E'[Z%)tnEG%5:f79#E)6#D9Jt+{):b̔;*_F |Yy8a7`u)QtȰGK (dgVg0&c{/ o肫M~$n X7O2SŔ-͝Yq"Ջ yߙegL3ؘ.'Cc?ղ:㸲{@o1n endstream endobj 216 0 obj <>/Length 2695>>stream x]!p(` $`H@' S\UD b`9UvUdp> JUU]uv HD68-NٙٙMR<c027Rx@H)C ew !7DFOwP67.SGGN@TK90LPTf x9Xv_$:ٚn= +F ?bM٠TR қ(Yw.FBM #BB=W9@,۩x&$4WS@M ĩA3f?uTX J9EJ1|z~Dk%S~4r0Gx ލ%pF+.ڣi(R.!h5:tޢ_|@ Y {d-*+o:QJ{p~ k~y4:@|O2,Эe74SY"DA)G67?] %餴5O6/φgAPR1&)ͭL%1h'r_1VY$`7>?kO}$eb['lqIЧ㓲1x ) =aN~dRHY|#n[.pDPQra~Ɣʳ1VDSd$=׽l]a0>)kLu)%~"G r~Ou)l lLj: 3HĐk󺢕g}MAېax|-ϯg \-zj]jv nVoTvB.RrڮA*pbĶN44ES~BRɏBd2Ԏ'~~qs7>h JyB9`Lu45yvm|Nx94.đW[pc#=7*~Bۜ"eMD'bC)6PJވ~M+SL^T}N-S7v- pUlJ!Mʹ%7>h bxudRɹlX58'W JY2Uխ]{IBhFi];A]H;/2{uW}xe>g_.`1nAo}uUaPo* WJж#v1(H XU2_ӌWhiƫ=fAdv; ]!GZf̆¤RTMR>EN\ZBKꕣKɥ@-w"(e(L 씜+FiBQm`ߢ\5q˄)g6BPrQ+j+RF߆%A)KBaRmXI\$MeU[06HGߍ:2-1uV^wlÑ ߮0K(&r48KP $RB!t;8R(c+BURA~,bZ\*K&vR&;LkBr|̮RFDG=|]3g1AJj%d/=a)=x> endobj 234 0 obj <>stream x]1n0 EwB70eQ \%Cd >/FontMatrix[1 0 0 1 0 0]/FontBBox[0 -11 1000 1000]/FirstChar 0/LastChar 13/Widths[ 752 636 636 770 774 712 652 500 924 770 995 637 734 372] /Subtype/Type3>> endobj 236 0 obj <>stream x]Kn9D}Bm6 \ my1 exR]EeFfӗ_~=nz\km}?k{cmݟcr_?Yc+١v29J!ex/aXeȄM´ _2d,C3ːF¶ _%ː< $ܖ!㳄2d<|,C&A`MEBZf VKwj jɛe_ VK^KVK$ٰ`͒: VK޴JVKwjɛ2X-y%oNՒ7`M#oX:Q_#ol8:D.7Xy+Z}VW5T`u&ǁmZdD)Y_؇61Q3p15ssQ5{'-7Fʹ{zF.VO OY2V5u~= Vi6>/FontMatrix[1 0 0 1 0 0]/FontBBox[0 -18 1000 1000]/FirstChar 0/LastChar 191/Widths[ 667 644 644 636 636 636 636 636 636 636 636 636 337 636 636 636 802 644 644 644 337 856 318 318 513 320 320 320 320 565 640 640 640 320 640 837 687 1042 678 734 675 716 716 343 343 478 595 733 493 435 712 593 830 712 924 716 720 850 652 678 493 343 924 684 635 411 615 613 392 695 974 612 863 592 698 635 295 634 352 550 390 390 278 521 818 635 278 635 634 361 634 318 275 278 337 579 592 525 603 775 318 611 592 762 343 687 593 665 343 712 716 675 716 837 415 716 830 478 682 493 595 435 678 850 716 635 460 748 732 557 635 500 684 337 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 989 686 575 787 734 687 675 343 678 595 593 343 712 716 1042 457 478 493 716 652 435 716 924 712 457 632 636 645 636 1042] /Subtype/Type3>> endobj 7 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-182 -235 1287 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 238 0 obj <> endobj 149 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-18 -235 606 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 239 0 obj <> endobj 48 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-198 -235 1417 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 240 0 obj <> endobj 162 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-4 -235 606 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 241 0 obj <> endobj 77 0 obj <>/FontMatrix[0.001 0 0 0.001 0 0]/FontBBox[-182 -235 1287 928]/FirstChar 0/LastChar 0/Widths[ 0] /Subtype/Type3>> endobj 242 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 243 0000000000 65535 f 0000044617 00000 n 0000116865 00000 n 0000044550 00000 n 0000044194 00000 n 0000000015 00000 n 0000007689 00000 n 0000114192 00000 n 0000115952 00000 n 0000110750 00000 n 0000044665 00000 n 0000044877 00000 n 0000045103 00000 n 0000045346 00000 n 0000045609 00000 n 0000045824 00000 n 0000046097 00000 n 0000046346 00000 n 0000046558 00000 n 0000046802 00000 n 0000047052 00000 n 0000047315 00000 n 0000047551 00000 n 0000047749 00000 n 0000047968 00000 n 0000048211 00000 n 0000048445 00000 n 0000048696 00000 n 0000048932 00000 n 0000049153 00000 n 0000049402 00000 n 0000049622 00000 n 0000049875 00000 n 0000050054 00000 n 0000050305 00000 n 0000050548 00000 n 0000050751 00000 n 0000050975 00000 n 0000051244 00000 n 0000051483 00000 n 0000051707 00000 n 0000051961 00000 n 0000052202 00000 n 0000052427 00000 n 0000052634 00000 n 0000093345 00000 n 0000089104 00000 n 0000086650 00000 n 0000114834 00000 n 0000052883 00000 n 0000053072 00000 n 0000053284 00000 n 0000053489 00000 n 0000053703 00000 n 0000053925 00000 n 0000054138 00000 n 0000054341 00000 n 0000054545 00000 n 0000054722 00000 n 0000054895 00000 n 0000055093 00000 n 0000055311 00000 n 0000055511 00000 n 0000055694 00000 n 0000055896 00000 n 0000056085 00000 n 0000056287 00000 n 0000056495 00000 n 0000056689 00000 n 0000056907 00000 n 0000057120 00000 n 0000057356 00000 n 0000057647 00000 n 0000057884 00000 n 0000058144 00000 n 0000058345 00000 n 0000058529 00000 n 0000115497 00000 n 0000058797 00000 n 0000059030 00000 n 0000059272 00000 n 0000059460 00000 n 0000059687 00000 n 0000059916 00000 n 0000060121 00000 n 0000060343 00000 n 0000060564 00000 n 0000060791 00000 n 0000061018 00000 n 0000061248 00000 n 0000061489 00000 n 0000061710 00000 n 0000061883 00000 n 0000062081 00000 n 0000062291 00000 n 0000062507 00000 n 0000062725 00000 n 0000062943 00000 n 0000063121 00000 n 0000063352 00000 n 0000063592 00000 n 0000063823 00000 n 0000063994 00000 n 0000064216 00000 n 0000064420 00000 n 0000064591 00000 n 0000064796 00000 n 0000064964 00000 n 0000065135 00000 n 0000065341 00000 n 0000065519 00000 n 0000065737 00000 n 0000065954 00000 n 0000066157 00000 n 0000066369 00000 n 0000066620 00000 n 0000066804 00000 n 0000067006 00000 n 0000067233 00000 n 0000067451 00000 n 0000067626 00000 n 0000067852 00000 n 0000068070 00000 n 0000068282 00000 n 0000068462 00000 n 0000068660 00000 n 0000068904 00000 n 0000069134 00000 n 0000069360 00000 n 0000069570 00000 n 0000069744 00000 n 0000069966 00000 n 0000070188 00000 n 0000070394 00000 n 0000070597 00000 n 0000070787 00000 n 0000071017 00000 n 0000071226 00000 n 0000071454 00000 n 0000071708 00000 n 0000071926 00000 n 0000072157 00000 n 0000072339 00000 n 0000072556 00000 n 0000072773 00000 n 0000072957 00000 n 0000073214 00000 n 0000073379 00000 n 0000073613 00000 n 0000114576 00000 n 0000073829 00000 n 0000074065 00000 n 0000074288 00000 n 0000074502 00000 n 0000074735 00000 n 0000074935 00000 n 0000075106 00000 n 0000075317 00000 n 0000075522 00000 n 0000075720 00000 n 0000075938 00000 n 0000076124 00000 n 0000115202 00000 n 0000076314 00000 n 0000076543 00000 n 0000076787 00000 n 0000076985 00000 n 0000077204 00000 n 0000077432 00000 n 0000077639 00000 n 0000077807 00000 n 0000078018 00000 n 0000078258 00000 n 0000078469 00000 n 0000078686 00000 n 0000078941 00000 n 0000079149 00000 n 0000079380 00000 n 0000079620 00000 n 0000079846 00000 n 0000080113 00000 n 0000080336 00000 n 0000080529 00000 n 0000080780 00000 n 0000081037 00000 n 0000081272 00000 n 0000081510 00000 n 0000081687 00000 n 0000081926 00000 n 0000082178 00000 n 0000082405 00000 n 0000082587 00000 n 0000082791 00000 n 0000083049 00000 n 0000083278 00000 n 0000083503 00000 n 0000083718 00000 n 0000083913 00000 n 0000084150 00000 n 0000084391 00000 n 0000084610 00000 n 0000084843 00000 n 0000085089 00000 n 0000085296 00000 n 0000085524 00000 n 0000085716 00000 n 0000085925 00000 n 0000086148 00000 n 0000086376 00000 n 0000086595 00000 n 0000095387 00000 n 0000044370 00000 n 0000007709 00000 n 0000044171 00000 n 0000109053 00000 n 0000095474 00000 n 0000105793 00000 n 0000101216 00000 n 0000098543 00000 n 0000095670 00000 n 0000095920 00000 n 0000096143 00000 n 0000096363 00000 n 0000096591 00000 n 0000096793 00000 n 0000097027 00000 n 0000097195 00000 n 0000097431 00000 n 0000097658 00000 n 0000097878 00000 n 0000098064 00000 n 0000098307 00000 n 0000098482 00000 n 0000108690 00000 n 0000108730 00000 n 0000109032 00000 n 0000109460 00000 n 0000110728 00000 n 0000114365 00000 n 0000114749 00000 n 0000115008 00000 n 0000115374 00000 n 0000115671 00000 n trailer << /Size 243 /Root 1 0 R /Info 2 0 R /ID [(挪pz`Yl9} `o)(挪pz`Yl9} `o)] >> startxref 116976 %%EOF ga-5-4/doc/pario/0000755000175000017500000000000012662210474011713 5ustar mbambaga-5-4/doc/style0000644000175000017500000005131312662210474011667 0ustar mbamba############################################################################## # This is the Artistic Style (astyle) options file used by Global Arrays. ############################################################################## # # The command line options have precedence. If there is a conflict between # a command line option and an option in the default options file, the # command line option will be used. # # Lines within this options file that begin with '#' are considered # line-comments. # # astyle looks for this file in the following locations (in order): # 1. the file indicated by the --options= command line option; # 2. the file and directory indicated by the environment variable # ARTISTIC_STYLE_OPTIONS (if it exists); # 3. the file named .astylerc in the directory pointed to by the HOME # environment variable (e.g. "$HOME/.astylerc" on Linux); # 4. the file named astylerc in the directory pointed to by the # USERPROFILE environment variable (e.g. "%USERPROFILE%\astylerc" on # Windows). # ############################################################################## ### Global Arrays Style Options ############################################## ############################################################################## # --indent=spaces=2 --brackets=linux --indent-classes --indent-switches --indent-namespaces --indent-col1-comments --max-instatement-indent=40 --pad-oper --pad-header --unpad-paren --break-closing-brackets --add-brackets --convert-tabs --align-pointer=name # ############################################################################## ### Tab and Bracket Options ################################################## ############################################################################## # ## default indent option ## If no indentation option is set, the default option of 4 spaces will be ## used (e.g. -s4 --indent=spaces=4). # # ---------------------------------------------------------------------------- # --indent=spaces / --indent=spaces=# / -s# # Indent using # spaces per indent (e.g. -s6 --indent=spaces=6). # must be # between 2 and 20. Not specifying # will result in a default of 4 spaces per # indent. # # ---------------------------------------------------------------------------- # --indent=tab / --indent=tab=# / -t / -t# # Indent using tab characters. Treat each tab as # spaces # (e.g. -t6 / --indent=tab=6). # must be between 2 and 20. If no # is set, # treats tabs as 4 spaces. # # ---------------------------------------------------------------------------- # --indent=force-tab / --indent=force-tab=# / -T / -T# # Indent using tab characters. Treat each tab as # spaces # (e.g. -T6 / --indent=force-tab=6). Uses tabs as indents where ‑‑indent=tab # prefers to use spaces, such as inside multi-line statements. # must be # between 2 and 20. If no # is set, treats tabs as 4 spaces. # # ---------------------------------------------------------------------------- ## default brackets option ## If no brackets option is set, the brackets will not be changed. # # ---------------------------------------------------------------------------- # --brackets=break / -b # Break brackets from their pre-block statements ( e.g. Allman / ANSI style ). # # void Foo(bool isFoo) # { # if (isFoo) # { # bar(); # } # else # { # anotherBar(); # } # } # # ---------------------------------------------------------------------------- # --brackets=attach / -a # Attach brackets to their pre-block statements ( e.g. Java style ). # # void Foo(bool isFoo) { # if (isFoo) { # bar(); # } else { # anotherBar(); # } # } # # ---------------------------------------------------------------------------- # --brackets=linux / -l # Break brackets from namespace, class, and function definitions, but attach # brackets to statements within a function ( e.g. K&R / Linux style ). # # With C++ files brackets are attached for function definitions within a class # (inline class functions). The brackets are also attached for arrays, structs, # enums, and other top level objects that are not classes or functions. This # option is effective for C/C++ files only. # # void Foo(bool isFoo) # { # if (isFoo) { # bar(); # } else { # anotherBar; # } # } # # ---------------------------------------------------------------------------- # --brackets=stroustrup / -u # Break brackets from function definitions only. Attach brackets to # namespaces, classes, and statements within a function ( e.g. Stroustrup # style ). # # With C++ files brackets are attached for function definitions within a class # (inline class functions). The brackets are also attached for arrays, structs, # enums, and other top level objects that are not classes or functions. This # option is effective for C/C++ files only. # # void Foo(bool isFoo) # { # if (isFoo) { # bar(); # } else { # anotherBar; # } # } # # ---------------------------------------------------------------------------- # --brackets=horstmann / -g # Break brackets from their pre-block statements but allow run-in statements # on the same line as an opening bracket ( e.g. Horstmann style ). # # void Foo(bool isFoo) # { if (isFoo()) # { bar1(); # bar2(); # } # else # { anotherBar(); # } # } # ############################################################################## ### Indentation Options ###################################################### ############################################################################## # # --indent-classes / -C # Indent 'class' and 'struct' blocks so that the blocks 'public:', # 'protected:' and 'private:' are indented. The struct blocks are indented # only if an access modifier is declared somewhere in the struct. The entire # block is indented. This option is effective for C++ files only. # # class Foo # { # public: # Foo(); # virtual ~Foo(); # }; # # becomes: # # class Foo # { # public: # Foo(); # virtual ~Foo(); # }; # # ---------------------------------------------------------------------------- # --indent-switches / -S # Indent 'switch' blocks so that the 'case X:' statements are indented in the # switch block. The entire case block is indented. # # switch (foo) # { # case 1: # a += 1; # break; # # case 2: # { # a += 2; # break; # } # } # # becomes: # # switch (foo) # { # case 1: # a += 1; # break; # # case 2: # { # a += 2; # break; # } # } # # ---------------------------------------------------------------------------- # --indent-cases / -K # Indent 'case X:' blocks from the 'case X:' headers. Case statements not # enclosed in blocks are NOT indented. # # switch (foo) # { # case 1: # a += 1; # break; # # case 2: # { # a += 2; # break; # } # } # # becomes: # # switch (foo) # { # case 1: # a += 1; # break; # # case 2: # { # a += 2; # break; # } # } # # ---------------------------------------------------------------------------- # --indent-brackets / -B # Add extra indentation to brackets. This is the option used for Whitesmith # and Banner style formatting/indenting. If both ‑‑indent‑brackets and # ‑‑indent‑blocks are used the result will be ‑‑indent‑blocks. This option # will be ignored if used with a predefined style. # # if (isFoo) # { # bar(); # } # else # anotherBar(); # # becomes: # # if (isFoo) # { # bar(); # } # else # anotherBar(); # # ---------------------------------------------------------------------------- # --indent-blocks / -G # Add extra indentation to blocks within a function. The opening bracket for # namespaces, classes, and functions is not indented. This is the option used # for GNU style formatting/indenting. This option will be ignored if used with # a predefined style. # # if (isFoo) # { # bar(); # } # else # anotherBar(); # # becomes: # # if (isFoo) # { # bar(); # } # else # anotherBar(); # # ---------------------------------------------------------------------------- # --indent-namespaces / -N # Add extra indentation to namespace blocks. This option has no effect on Java # files. # # namespace foospace # { # class Foo # { # public: # Foo(); # virtual ~Foo(); # }; # } # # becomes: # # namespace foospace # { # class Foo # { # public: # Foo(); # virtual ~Foo(); # }; # } # # ---------------------------------------------------------------------------- # --indent-labels / -L # Add extra indentation to labels so they appear 1 indent less than the # current indentation, rather than being flushed to the left (the default). # # void Foo() { # while (isFoo) { # if (isFoo) # goto error; # ... # error: # ... # } # } # # becomes (with indented 'error:'): # # void Foo() { # while (isFoo) { # if (isFoo) # goto error; # ... # error: # ... # } # } # # ---------------------------------------------------------------------------- # --indent-preprocessor / -w # Indent multi-line preprocessor definitions ending with a backslash. Should # be used with --convert-tabs for proper results. Does a pretty good job, but # can not perform miracles in obfuscated preprocessor definitions. Without # this option the preprocessor statements remain unchanged. # # #define Is_Bar(arg,a,b) \ # (Is_Foo((arg), (a)) \ # || Is_Foo((arg), (b))) # # becomes: # # #define Is_Bar(arg,a,b) \ # (Is_Foo((arg), (a)) \ # || Is_Foo((arg), (b))) # # ---------------------------------------------------------------------------- # --indent-col1-comments / -Y # Indent C++ comments beginning in column one. By default C++ comments # beginning in column one are not indented. This option will allow the # comments to be indented with the code. # # void Foo()\n" # { # // comment # if (isFoo) # bar(); # } # # becomes: # # void Foo()\n" # { # // comment # if (isFoo) # bar(); # } # # ---------------------------------------------------------------------------- # --max-instatement-indent=# / -M# # Indent a maximum of # spaces in a continuous statement, relative to the # previous line (e.g. ‑‑max‑instatement‑indent=40). # must be less than 80. If # no # is set, the default value of 40 will be used. A maximum of less than # two indent lengths will be ignored. # # fooArray[] = { red, # green, # blue }; # # fooFunction(barArg1, # barArg2, # barArg3); # # becomes (with larger value): # # fooArray[] = { red, # green, # blue }; # # fooFunction(barArg1, # barArg2, # barArg3); # # ---------------------------------------------------------------------------- # --min-conditional-indent=# / -m# # Set the minimal indent that is added when a header is built of # multiple-lines. This indent makes helps to easily separate the header from # the command statements that follow. The value for # must be less than 40. # The default setting for this option is twice the current indent # (e.g. --min-conditional-indent=8). # # // default setting makes this non-bracketed code clear # if (a < b # || c > d) # foo++; # # // but creates an exaggerated indent in this bracketed code # if (a < b # || c > d) # { # foo++; # } # # becomes (when setting --min-conditional-indent=0): # # // setting makes this non-bracketed code less clear # if (a < b # || c > d) # foo++; # # // but makes this bracketed code clearer # if (a < b # || c > d) # { # foo++; # } # ############################################################################## ### Padding Options ########################################################## ############################################################################## # # --break-blocks / -f # Pad empty lines around header blocks (e.g. 'if', 'for', 'while'...). # # isFoo = true; # if (isFoo) { # bar(); # } else { # anotherBar(); # } # isBar = false; # # becomes: # # isFoo = true; # # if (isFoo) { # bar(); # } else { # anotherBar(); # } # # isBar = false; # # ---------------------------------------------------------------------------- # --break-blocks=all / -F # Pad empty lines around header blocks (e.g. 'if', 'for', 'while'...). Treat # closing header blocks (e.g. 'else', 'catch') as stand-alone blocks. # # isFoo = true; # if (isFoo) { # bar(); # } else { # anotherBar(); # } # isBar = false; # # becomes: # # isFoo = true; # # if (isFoo) { # bar(); # # } else { # anotherBar(); # } # # isBar = false; # # ---------------------------------------------------------------------------- # --pad-oper / -p # Insert space padding around operators. Operators inside block parens [] are # not padded. Any end of line comments will remain in the original column, if # possible. Note that there is no option to unpad. Once padded, they stay # padded. # # if (foo==2) # a=bar((b-c)*a,*d--); # # becomes: # # if (foo == 2) # a = bar((b - c) * a, * d--); # # ---------------------------------------------------------------------------- # --pad-paren / -P # Insert space padding around parenthesis on both the outside and the inside. # Any end of line comments will remain in the original column, if possible. # # if (isFoo(a, b)) # bar(a, b); # # becomes: # # if ( isFoo ( a, b ) ) # bar ( a, b ); # # ---------------------------------------------------------------------------- # --pad-paren-out / -d # Insert space padding around parenthesis on the outside only. Any end of line # comments will remain in the original column, if possible. This can be used # with unpad-paren below to remove unwanted spaces. # # if (isFoo(a, b)) # bar(a, b); # # becomes: # # if (isFoo (a, b) ) # bar (a, b); # # ---------------------------------------------------------------------------- # --pad-paren-in / -D # Insert space padding around parenthesis on the inside only. Any end of line # comments will remain in the original column, if possible. This can be used # with unpad-paren below to remove unwanted spaces. # # if (isFoo(a, b)) # bar(a, b); # # becomes: # # if ( isFoo( a, b ) ) # bar( a, b ); # # ---------------------------------------------------------------------------- # --pad-header / -H # Insert space padding after paren headers only (e.g. 'if', 'for', 'while'...). # Any end of line comments will remain in the original column, if possible. # This can be used with unpad-paren to remove unwanted spaces. # # if(isFoo(a, b)) # bar(a, b); # # becomes: # # if (isFoo(a, b)) # bar(a, b); # # ---------------------------------------------------------------------------- # --unpad-paren / -U # Remove extra space padding around parenthesis on the inside and outside. # Any end of line comments will remain in the original column, if possible. # This option can be used in combination with the paren padding options # pad‑paren, pad‑paren‑out, pad‑paren‑in, and pad‑header above. Only padding # that has not been requested by other options will be removed. # # For example, if a source has parens padded on both the inside and outside, # and you want inside only. You need to use unpad-paren to remove the outside # padding, and pad‑paren‑in to retain the inside padding. Using only # pad‑paren‑in would not remove the outside padding. # # if ( isFoo( a, b ) ) # bar ( a, b ); # # becomes (with no padding option requested): # # if (isFoo(a, b)) # bar(a, b); # # ---------------------------------------------------------------------------- # --delete-empty-lines / -x # Delete empty lines within a function or method. Empty lines outside of # functions or methods are NOT deleted. If used with break-blocks or # break-blocks=all it will delete all lines EXCEPT the lines added by the # break-blocks options. # # void Foo() # { # # foo1 = 1; # # foo2 = 2; # # } # # becomes: # # void Foo() # { # foo1 = 1; # foo2 = 2; # } # # ---------------------------------------------------------------------------- # --fill-empty-lines / -E # Fill empty lines with the white space of the previous line. # ############################################################################## ### Formatting Options ####################################################### ############################################################################## # # --break-closing-brackets / -y # When used with --brackets=attach, --brackets=linux, or --brackets=stroustrup, # this breaks closing headers (e.g. 'else', 'catch', ...) from their # immediately preceding closing brackets. Closing header brackets are always # broken with broken brackets, horstmann brackets, indented blocks, and # indented brackets. # # void Foo(bool isFoo) { # if (isFoo) { # bar(); # } else { # anotherBar(); # } # } # # becomes (with a broken 'else'): # # void Foo(bool isFoo) { # if (isFoo) { # bar(); # } # else { # anotherBar(); # } # } # # ---------------------------------------------------------------------------- # --break-elseifs / -e # Break "else if" header combinations into separate lines. This option has no # effect if keep-one-line-statements is used, the "else if" statements will # remain as they are. # # If this option is NOT used, "else if" header combinations will be placed on # a single line. # # if (isFoo) { # bar(); # } # else if (isFoo1()) { # bar1(); # } # else if (isFoo2()) } # bar2; # } # # becomes: # # if (isFoo) { # bar(); # } # else # if (isFoo1()) { # bar1(); # } # else # if (isFoo2()) { # bar2(); # } # # ---------------------------------------------------------------------------- # --add-brackets / -j # Add brackets to unbracketed one line conditional statements (e.g. 'if', # 'for', 'while'...). The statement must be on a single line. The brackets # will be added according to the currently requested predefined style or # bracket type. If no style or bracket type is requested the brackets will be # attached. If --add-one-line-brackets is also used the result will be one # line brackets. # # if (isFoo) # isFoo = false; # # becomes: # # if (isFoo) { # isFoo = false; # } # # ---------------------------------------------------------------------------- # --add-one-line-brackets / -J # Add one line brackets to unbracketed one line conditional statements (e.g. # 'if', 'for', 'while'...). The statement must be on a single line. The option # implies --keep-one-line-blocks and will not break the one line blocks. # # if (isFoo) # isFoo = false; # # becomes: # # if (isFoo) # { isFoo = false; } # # ---------------------------------------------------------------------------- # --keep-one-line-blocks / -O # Don't break one-line blocks. # # if (isFoo) # { isFoo = false; cout << isFoo << endl; } # # remains unchanged. # # ---------------------------------------------------------------------------- # --keep-one-line-statements / -o # Don't break complex statements and multiple statements residing on a single # line. # # if (isFoo) # { # isFoo = false; cout << isFoo << endl; # } # # remains unchanged. # # if (isFoo) DoBar(); # # remains unchanged. # # ---------------------------------------------------------------------------- # --convert-tabs / -c # Converts tabs into spaces in the non-indentation part of the line. The # number of spaces inserted will maintain the spacing of the tab. The current # setting for spaces per tab is used. It may not produce the expected results # if convert-tabs is used when changing spaces per tab. Tabs are not replaced # in quotes. # # ---------------------------------------------------------------------------- # --align-pointer=type / -k1 # --align-pointer=middle / -k2 # --align-pointer=name / -k3 # Attach a pointer or reference operator (* or &) to either the variable type # (left) or variable name (right), or place it between the type and name. The # spacing between the type and name will be preserved, if possible. This # option is effective for C/C++ files only. # # char *foo1; # # becomes (with align-pointer=type): # # char* foo1; # # char* foo2; # # becomes (with align-pointer=middle): # # char * foo2; # # char& foo3; # # becomes (with align-pointer=name): # # char &foo3; # # ---------------------------------------------------------------------------- # --mode=c # --mode=cs # --mode=java # Indent a C/C++, C#, or Java file. The option is usually set from the file # extension for each file. You can override the setting with this entry. It # will be used for all files regardless of the file extension. It allows the # formatter to identify language specific syntax such as C++ classes, # templates, and keywords. # ga-5-4/pario/0000755000175000017500000000000012662210477011151 5ustar mbambaga-5-4/pario/dra/0000755000175000017500000000000012662210477011717 5ustar mbambaga-5-4/pario/dra/dra.h0000644000175000017500000000524112662210477012640 0ustar mbamba/******************* header file for Disk Arrays *****************/ #ifndef _DRA_H_ #define _DRA_H_ #include "chemio.h" #include "typesf2c.h" typedef long dra_size_t; #define DRA_RW ELIO_RW #define DRA_R ELIO_R #define DRA_W ELIO_W #define DRA_REQ_INVALID -333 #ifdef __cplusplus extern "C" { #endif /* C-interface prototypes */ extern int NDRA_Create( int type, int ndim, dra_size_t dims[], char *name, char* filename, int mode, dra_size_t reqdims[], int *d_a); extern int NDRA_Inquire( int d_a, int *type, int *ndim, dra_size_t dims[], char *name, char* filename); extern int NDRA_Write( int g_a, int d_a, int *request); extern int NDRA_Read( int g_a, int d_a, int *request); extern int NDRA_Write_section(logical transp, int g_a, int glo[], int ghi[], int d_a, dra_size_t dlo[], dra_size_t dhi[], int *request); extern int NDRA_Read_section( logical transp, int g_a, int glo[], int ghi[], int d_a, dra_size_t dlo[], dra_size_t dhi[], int *request); extern int DRA_Init( int max_arrays, double max_array_size, double total_disk_space, double max_memory); extern int DRA_Terminate(); extern int DRA_Open( char* filename, int mode, int *d_a); extern int DRA_Probe( int request, int *compl_status); extern void DRA_Set_debug( logical flag); extern void DRA_Print_internals( int d_a); extern void DRA_Set_default_config( int numfiles, int numioprocs); extern int DRA_Wait( int request); extern int DRA_Delete( int d_a); extern int DRA_Close( int d_a); extern void DRA_Flick(); #ifdef __cplusplus } #endif #endif /* _DRA_H_ */ ga-5-4/pario/dra/drap.h0000644000175000017500000002127612662210477013026 0ustar mbamba/*********************** "private" include file for DRA *****************/ #if HAVE_STRING_H # include #endif #include "gacommon.h" #include "draf2c.h" #include "elio.h" #include "macdecls.h" #define MAXDIM GA_MAX_DIM #ifdef FALSE #undef FALSE #endif #ifdef TRUE #undef TRUE #endif #define FALSE (logical) 0 #define TRUE (logical) 1 /************************* common constants **********************************/ #define DRA_OFFSET 5000 /**< DRA handle offset */ #define DRA_BRD_TYPE 30000 /**< msg type for DRA broadcast */ #define DRA_GOP_TYPE 30001 /**< msg type for DRA sum */ #define DRA_MAX_NAME 72 /**< max length of array name */ #define DRA_MAX_FNAME 248 /**< max length of metafile name */ /************************* common data structures **************************/ typedef struct { /**< stores basic DRA info */ Integer ndim; /**< dimension of array */ Integer dims[MAXDIM]; /**< array dimensions */ Integer chunk[MAXDIM]; /**< data layout chunking */ Integer layout; /**< date layout type */ int type; /**< data type */ int mode; /**< file/array access permissions */ char name[DRA_MAX_NAME+8]; /**< array name */ char fname[DRA_MAX_FNAME+8]; /**< metafile name */ Integer actv; /**< is array active ? */ Integer indep; /**< shared/independent files ? */ Fd_t fd; /**< ELIO meta-file descriptor */ Integer numfiles; /**< # files on open file system */ Integer ioprocs; /**< number of IO procs per node */ } disk_array_t; #define MAX_ALGN 1 /**< max # aligned subsections */ #define MAX_UNLG (2*(MAXDIM-1)) /**< max # unaligned subsections */ typedef struct { /**< object describing DRA/GA section */ Integer handle; Integer ndim; Integer lo[MAXDIM]; Integer hi[MAXDIM]; } section_t; typedef struct { /**< structure stores arguments for callback f */ int op; int transp; Integer ld[MAXDIM]; section_t gs_a; section_t ds_a; section_t ds_chunk; } args_t; typedef struct { /**< stores info associated with DRA request */ Integer d_a; /**< disk array handle */ int num_pending; /**< number of pending asynch. I/O ops */ Integer list_algn[MAX_ALGN][2*MAXDIM]; /**< coordinates of aligned subsection */ Integer list_unlgn[MAX_UNLG][2*MAXDIM]; /**< coordinates of unaligned subsections*/ Integer list_cover[MAX_UNLG][2*MAXDIM]; /**< coordinates of "cover" subsections */ int nu; int na; int call_id; /**< id of this request */ } request_t; typedef struct { char *buf; int op; io_request_t io_req; Integer ga_movhdl; args_t args; int align; int callback; } buf_info; extern disk_array_t *DRA; extern logical dra_debug_flag; /**************************** common macros ********************************/ #define PARIO_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define PARIO_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define dai_error pnga_error extern int dai_read_param(char* filename, Integer d_a); extern void dai_write_param(char* filename, Integer d_a); extern void dai_delete_param(char* filename, Integer d_a); extern int dai_file_config(char* filename); extern logical dai_section_intersect(section_t sref, section_t* sadj); extern int drai_get_num_serv(void); /* internal fortran calls */ extern Integer drai_create(Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a); extern Integer ndrai_create(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *d_a); extern Integer drai_open(char *filename, Integer *mode, Integer *d_a); extern Integer drai_inquire(Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename); extern Integer ndrai_inquire(Integer *d_a, Integer *type, Integer *ndim, Integer dims[],char *name,char *filename); extern Integer ndrai_create_config(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a); /* external fortran calls */ #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS extern Integer FATR dra_create_(Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a, int nlen, int flen); extern Integer FATR ndra_create_(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *d_a, int nlen, int flen); extern Integer FATR dra_open_(char *filename, Integer *mode, Integer *d_a, int flen); extern Integer FATR dra_inquire_(Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, int nlen, int flen); extern Integer FATR ndra_inquire_(Integer *d_a, Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, int nlen, int flen); extern Integer ndra_create_config_(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a, int nlen, int flen); #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ extern Integer FATR dra_create_(Integer *type, Integer *dim1, Integer *dim2, char *name, int nlen, char *filename, int flen, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a); extern Integer FATR ndra_create_(Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen, Integer *mode, Integer reqdims[], Integer *d_a); extern Integer FATR dra_open_(char *filename, int flen, Integer *mode, Integer *d_a); extern Integer FATR dra_inquire_(Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, int nlen, char *filename, int flen); extern Integer FATR ndra_inquire_(Integer *d_a, Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen); extern Integer ndra_create_config_(Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a); #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ extern Integer FATR dra_terminate_(); extern Integer FATR dra_init_( Integer *max_arrays, /* input */ DoublePrecision *max_array_size, /* input */ DoublePrecision *tot_disk_space, /* input */ DoublePrecision *max_memory); /* input */ extern Integer FATR dra_probe_( Integer *request, /*input*/ Integer *status); /*output*/ extern Integer FATR ndra_write_( Integer *g_a, /*input:GA handle*/ Integer *d_a, /*input:DRA handle*/ Integer *request); /*output: handle to async oper.*/ extern Integer FATR ndra_write_section_( logical *transp, /*input:transpose operator*/ Integer *g_a, /*input:GA handle*/ Integer glo[], /*input*/ Integer ghi[], /*input*/ Integer *d_a, /*input:DRA handle*/ Integer dlo[], /*input*/ Integer dhi[], /*input*/ Integer *request); /*output: async. request id*/ extern Integer FATR ndra_read_(Integer* g_a, Integer* d_a, Integer* request); extern Integer FATR ndra_read_section_( logical *transp, /*input:transpose operator*/ Integer *g_a, /*input:GA handle*/ Integer glo[], /*input*/ Integer ghi[], /*input*/ Integer *d_a, /*input:DRA handle*/ Integer dlo[], /*input*/ Integer dhi[], /*input*/ Integer *request); /*output: request id*/ extern void FATR dra_print_internals_(Integer *d_a); extern void FATR dra_set_debug_(logical *flag); extern void FATR dra_set_default_config_(Integer *numfiles, Integer *numioprocs); extern Integer FATR dra_delete_(Integer* d_a); extern Integer FATR dra_close_(Integer* d_a); extern void dra_flick_(); extern Integer FATR dra_wait_(Integer* request); ga-5-4/pario/dra/fortran.c0000644000175000017500000001073712662210477013546 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*************************** fortran DRA interface **************************/ #include "dra.h" #include "drap.h" #include "draf2c.h" #include "farg.h" #include "typesf2c.h" #include "ga-papi.h" #include "global.h" static char cname[DRA_MAX_NAME+1], cfilename[DRA_MAX_FNAME+1]; Integer FATR dra_create_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a, int nlen, int flen #else Integer *type, Integer *dim1, Integer *dim2, char *name, int nlen, char *filename, int flen, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a #endif ) { ga_f2cstring(name, nlen, cname, DRA_MAX_NAME); ga_f2cstring(filename, flen, cfilename, DRA_MAX_FNAME); return drai_create(type, dim1, dim2, cname, cfilename, mode, reqdim1, reqdim2,d_a); } Integer FATR ndra_create_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *d_a, int nlen, int flen #else Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen, Integer *mode, Integer reqdims[], Integer *d_a #endif ) { ga_f2cstring(name, nlen, cname, DRA_MAX_NAME); ga_f2cstring(filename, flen, cfilename, DRA_MAX_FNAME); return ndrai_create(type, ndim, dims, cname, cfilename, mode, reqdims, d_a); } Integer FATR dra_open_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *filename, Integer *mode, Integer *d_a, int flen #else char *filename, int flen, Integer *mode, Integer *d_a #endif ) { ga_f2cstring(filename, flen, cfilename, DRA_MAX_FNAME); return drai_open(cfilename, mode, d_a); } Integer FATR dra_inquire_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, int nlen, int flen #else Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, int nlen, char *filename, int flen #endif ) { Integer stat = drai_inquire(d_a, type, dim1, dim2, cname, cfilename); *type = pnga_type_c2f(*type); ga_c2fstring(cname, name, nlen); ga_c2fstring(cfilename, filename, flen); return stat; } Integer FATR ndra_inquire_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *d_a, Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, int nlen, int flen #else Integer *d_a, Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen #endif ) { Integer stat = ndrai_inquire(d_a, type, ndim, dims, cname, cfilename); *type = pnga_type_c2f(*type); ga_c2fstring(cname, name, nlen); ga_c2fstring(cfilename, filename, flen); return stat; } Integer ndra_create_config_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a, int nlen, int flen #else Integer *type, Integer *ndim, Integer dims[], char *name, int nlen, char *filename, int flen, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a #endif ) { ga_f2cstring(name, nlen, cname, DRA_MAX_NAME); ga_f2cstring(filename, flen, cfilename, DRA_MAX_FNAME); return ndrai_create_config(type, ndim, dims, cname, cfilename, mode, reqdims, numfiles, numioprocs, d_a); } ga-5-4/pario/dra/Notes.doc0000644000175000017500000000235312662210477013501 0ustar mbamba Disk Resident Arrays Implementation Notes Assumptions: . ANSI C compiler is not required; . interface to C programs is minimal (most users program in Fortran) . low level I/O operations defined in ELIO library . upper layer knows if they are called collectively or not C Interface: . C programs must use Integer and DoublePrecision data types, defined in "global.h" (GA package) for both the GA and DRA, and include file "dra.h"; . all arguments passed by address; . names of DRA operations have capitalized DRA prefix i.e., C version of Fortran dra_init is DRA_init. Note that the names are converted by cpp as specified in "dra.h" so that in most cases, C and Fortran programs call the same function. Internal convention is that there is a separate Fortran wrapper to a DRA operation iff it has a character string argument(s). Implementation Status: . prototyping used for DRA functions if ANSI C compiler available . indexing arguments are currently implemented as integers . reshaping and transposing in dra_[write,read]_section not implemented yet Problems to Resolve: . do we need explicit dra_flush or we should handle it implicitly after each write when file is create in 'read+write' in mode ? ga-5-4/pario/dra/perf.F0000644000175000017500000002103212662210477012760 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c FNAME - filename for test program c c Only use the INTEGER4_TEST if you are compiling c with USE_INTEGER4 and you are using an F90 c fortran compiler c c#define INTEGER4_TEST c #define BASE_NAME 'da.try' #define BASE_NAME1 'da1.try' #ifdef HPIODIR # define FNAME HPIODIR//BASE_NAME # define FNAME1 HPIODIR//BASE_NAME1 #else # define FNAME BASE_NAME # define FNAME1 BASE_NAME1 #endif program io #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer status, me integer max_arrays integer stack, heap double precision max_sz, max_disk, max_mem data max_arrays, max_sz, max_disk, max_mem /10,1d8,1d10, 1d6/ #if defined(IBM)|| defined(CRAY_T3E) data stack, heap /9000000, 4000000/ #else data stack, heap /1200000, 800000/ #endif c #include "mp3.fh" call ga_initialize() if(.not. ga_uses_ma())then stack = 10000 heap = 10000 endif c if(ma_init(MT_F_DBL, stack, heap) ) then me = ga_nodeid() if(dra_init(max_arrays, max_sz, max_disk, max_mem).ne.0)then call ga_error('dra_init failed: ',0) endif if (me.eq.0) print *,' ' if(me.eq.0)print *, 'TESTING PERFORMANCE OF DISK ARRAYS' if (me.eq.0) print *,' ' call test_io_dbl() status = dra_terminate() call ga_terminate() else print *,'ma_init failed' endif if(me.eq.0)print *, 'all done ...' call MP_FINALIZE() end subroutine test_io_dbl implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" #include "mp3def.fh" integer n,m parameter (n=5000) parameter (m = 2*n) double precision err, tt0, tt1, mbytes integer g_a, g_b, d_a, d_b double precision drand integer i,j, req, loop integer dilo,dihi,djlo,djhi integer gilo,gihi,gjlo,gjhi integer ielem, jelem integer me, nproc integer index, ld integer iran logical status integer util_mdtob external drand external util_mdtob intrinsic int, dble #ifdef INTEGER4_TEST double precision, allocatable :: buffer(:,:) #endif iran(i) = int(drand(0)*dble(i-1)) + 1 c loop = 30 req = -1 nproc = ga_nnodes() me = ga_nodeid() c if (me.eq.0) print *, 'creating global arrays ',n,' x',n if (me.eq.0)call ffflush(6) call ga_sync() if(.not. ga_create(MT_DBL, n, n, 'a', 1, 1, g_a)) & call ga_error('ga_create failed: a', 0) if(.not. ga_create(MT_DBL, n, n, 'b', 1, 1, g_b)) & call ga_error('ga_create failed: b', 0) if (me.eq.0) print *,'done ' if (me.eq.0)call ffflush(6) c c initialize g_a, g_b with random values c ... use ga_access to avoid allocating local buffers for ga_put c call ga_sync() call ga_distribution(g_a, me, gilo,gihi,gjlo,gjhi) #ifdef INTEGER4_TEST allocate(buffer(gihi-gilo+1,gjhi-gjlo+1)) ld = gihi-gilo+1 call ga_get(g_a, gilo, gihi, gjlo, gjhi, buffer, ld) call fill_random(buffer, gihi-gilo+1, gjhi-gjlo+1, ld) call ga_put(g_a, gilo, gihi, gjlo, gjhi, buffer, ld) deallocate(buffer) #else call ga_access(g_a, gilo,gihi,gjlo,gjhi, index, ld) call fill_random(DBL_MB(index), gihi-gilo+1, gjhi-gjlo+1, ld) #endif call ga_sync() * if (me.eq.0) print *,'done ' * if (me.eq.0)call ffflush(6) c call ga_zero(g_b) c c c....................................................................... if (me.eq.0) print *, 'creating disk array ',n,' x',n if (me.eq.0)call ffflush(6) if(dra_create(MT_DBL, n, n, 'A', FNAME, & DRA_RW, n, n, d_a).ne.0) $ CALL ga_error('dra_create failed: ',0) c if(me.eq.0) print *, 'alligned blocking write' if (me.eq.0)call ffflush(6) tt0 = MP_TIMER() if(dra_write(g_a, d_a, req).ne.0) $ CALL ga_error('dra_write failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 mbytes = 1e-6*util_mdtob(n*n) if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif c if(dra_close(d_a).ne.0) & call ga_error('dra_close(d_a) failed: ',d_a) tt1 = MP_TIMER() -tt0 if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif c if (me.eq.0) print *,' ' if (me.eq.0) print *,'disk array closed ' if (me.eq.0)call ffflush(6) c....................................................................... c c if (me.eq.0) print *, 'creating disk array ',m,' x',m if (me.eq.0)call ffflush(6) if(dra_create(MT_DBL, m, m, 'B', FNAME1, & DRA_RW, n, n, d_b).ne.0) $ CALL ga_error('dra_create failed: ',0) c if(me.eq.0) print *, 'non alligned blocking write' if (me.eq.0)call ffflush(6) c gilo =1 gjlo =1 gihi =n gjhi =n tt0 = MP_TIMER() if(dra_write_section(.false., g_a, gilo, gihi, gjlo, gjhi, & d_b, gilo+1, gihi+1, gjlo+1, gjhi+1, req).ne.0) & call ga_error('dra_write_section failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 mbytes = 1e-6*util_mdtob(n*n) if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif c if(dra_close(d_b).ne.0) & call ga_error('dra_close(d_b) failed: ',d_b) tt1 = MP_TIMER() -tt0 if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif c if (me.eq.0) print *,' ' if (me.eq.0) print *,'disk array closed ' if (me.eq.0)call ffflush(6) c....................................................................... c c if (me.eq.0) print *,' ' if (me.eq.0) print *,'opening disk array' if(dra_open(FNAME, DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) if(me.eq.0) print *, 'alligned blocking read' if (me.eq.0)call ffflush(6) tt0 = MP_TIMER() if(dra_read(g_b, d_a, req).ne.0) $ CALL ga_error('dra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif call ga_dadd(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'BTW, we have error =', err, & ' for dra_read' c call ga_print(g_b) else if (me.eq.0) print *,'OK' endif if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) c....................................................................... c if (me.eq.0) print *,' ' if (me.eq.0) print *,'opening disk array' if(dra_open(FNAME1,DRA_R, d_b).ne.0) & call ga_error('dra_open failed',0) if(me.eq.0) print *, 'non alligned blocking read' if (me.eq.0)call ffflush(6) gilo =1 gjlo =1 gihi =n gjhi =n tt0 = MP_TIMER() if(dra_read_section(.false., g_b, gilo, gihi, gjlo, gjhi, & d_b, gilo+1, gihi+1, gjlo+1, gjhi+1, req).ne.0) & call ga_error('dra_read_section failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 if (me.eq.0)then write(6,100)mbytes,tt1,mbytes/tt1 endif call ga_dadd(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'BTW, we have error =', err, + ' for dra_read_section' else if (me.eq.0) print *,'OK' endif if(dra_delete(d_b).ne.0) & call ga_error('dra_delete failed',0) c....................................................................... status = ga_destroy(g_a) status = ga_destroy(g_b) 100 format(g11.2,' MB time=',g11.2,' rate=',g11.3,'MB/s') end subroutine swap(a,b) integer a, b, temp temp = a a = b b = temp end subroutine init_char(str, len, char) character*(*) str character*1 char integer i do i = 1, len -1 str(i:i+1) = char enddo end subroutine fill_random(a, n,m, ld) integer ld, n,m double precision a(ld,*), drand, seed integer i,j external drand c do j=1,m seed = drand(j) do i=1,n a(i,j)=seed*i enddo enddo end ga-5-4/pario/dra/perf3.F0000644000175000017500000002275312662210477013056 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c FNAME - filename for test program c #define BASE_NAME '/scratch/da.try' #define BASE_NAME1 '/scratch/da1.try' #ifdef HPIODIR # define FNAME HPIODIR//BASE_NAME # define FNAME1 HPIODIR//BASE_NAME1 #else # define FNAME BASE_NAME # define FNAME1 BASE_NAME1 #endif c#define MULTFILES 1 #ifdef SOLARIS # if MULTFILES # define USEMULTFILES 1 # endif #else # define USEMULTFILES 1 #endif program io #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer status, me integer max_arrays integer stack, heap double precision max_sz, max_disk, max_mem data max_arrays, max_sz, max_disk, max_mem /10,1d8,1d10, 1d6/ #if defined(IBM)|| defined(CRAY_T3E) data stack, heap /70000000, 4000000/ #else data stack, heap /1200000, 800000/ #endif c #include "mp3.fh" call ga_initialize() if(.not. ga_uses_ma())then stack = 100000 heap = 100000 endif c if(ma_init(MT_F_DBL, stack, heap) ) then me = ga_nodeid() if(dra_init(max_arrays, max_sz, max_disk, max_mem).ne.0)then call ga_error('dra_init failed: ',0) endif if (me.eq.0) print *,' ' if(me.eq.0)print *, 'TESTING PERFORMANCE OF DISK ARRAYS' if (me.eq.0) print *,' ' call test_io_dbl() status = dra_terminate() call ga_terminate() else print *,'ma_init failed' endif if(me.eq.0)print *, 'all done ...' call MP_FINALIZE() end subroutine test_io_dbl implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" #include "mp3def.fh" integer n,m,ndim parameter (n=250, ndim=3) parameter (m = 2*n) double precision err, tt0, tt1, mbytes, rmax, ravg integer g_a, g_b, d_a, d_b double precision drand integer i, req, loop integer dlo(ndim),dhi(ndim),glo(ndim),ghi(ndim) integer dims(ndim),reqdims(ndim) integer me, nproc integer index, ld(ndim), chunk(ndim) integer iran #if USEMULTFILES integer ilen character*80 filename, filename1 #endif integer util_mdtob logical status external drand external util_mdtob intrinsic int, dble iran(i) = int(drand(0)*dble(i-1)) + 1 c loop = 30 req = -1 nproc = ga_nnodes() me = ga_nodeid() c if (me.eq.0) print *, 'Creating global arrays ',n,' x',n,' x',n if (me.eq.0)call ffflush(6) call ga_sync() do i = 1, ndim dims(i) = n chunk(i) = 1 end do if(.not. nga_create(MT_DBL, ndim, dims, 'a', chunk, g_a)) & call ga_error('nga_create failed: a', 0) if(.not. nga_create(MT_DBL, ndim, dims, 'b', chunk, g_b)) & call ga_error('nga_create failed: b', 0) if (me.eq.0) print *,'done ' if (me.eq.0)call ffflush(6) c c initialize g_a, g_b with random values c ... use ga_access to avoid allocating local buffers for ga_put c call ga_sync() call nga_distribution(g_a, me, glo, ghi) call nga_access(g_a, glo, ghi, index, ld) call fill_random(DBL_MB(index), glo, ghi, ld(1), ld(2)) call ga_sync() * if (me.eq.0) print *,'done ' * if (me.eq.0)call ffflush(6) c call ga_zero(g_b) c c c....................................................................... if (me.eq.0) print *, 'creating disk array ',n,' x',n,' x',n if (me.eq.0)call ffflush(6) do i = 1, ndim reqdims(i) = n end do #if USEMULTFILES ilen = len(FNAME) filename(1:ilen) = FNAME write(filename(ilen+1:ilen+1),200) me 200 format(i1) if(ndra_create(MT_DBL, ndim, dims, 'A', & filename, & DRA_RW, reqdims, d_a).ne.0) $ CALL ga_error('ndra_create failed: ',0) #else if(ndra_create(MT_DBL, ndim, dims, 'A', & FNAME, & DRA_RW, reqdims, d_a).ne.0) $ CALL ga_error('ndra_create failed: ',0) #endif c if(me.eq.0) print *, 'alligned blocking write' if (me.eq.0)call ffflush(6) tt0 = MP_TIMER() if(ndra_write(g_a, d_a,req).ne.0) $ CALL ga_error('ndra_write failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') mbytes = 1e-6*util_mdtob(n*n*n) if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif c if(dra_close(d_a).ne.0)call ga_error('dra_close failed: ',d_a) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif c if (me.eq.0) print *,' ' if (me.eq.0) print *,'disk array closed ' if (me.eq.0)call ffflush(6) c....................................................................... c c if (me.eq.0) print *, 'creating disk array ',m,' x',m,' x',m if (me.eq.0)call ffflush(6) do i = 1, ndim dims(i) = m reqdims(i) = n end do #ifdef USEMULTFILES ilen = len(FNAME1) filename1(1:ilen) = FNAME1 write(filename1(ilen+1:ilen+1),200) me if(ndra_create(MT_DBL, ndim, dims, 'B', & filename1, & DRA_RW, reqdims, d_b).ne.0) $ CALL ga_error('ndra_create failed: ',0) #else if(ndra_create(MT_DBL, ndim, dims, 'B', & FNAME1, & DRA_RW, reqdims, d_b).ne.0) $ CALL ga_error('ndra_create failed: ',0) #endif c if(me.eq.0) print *, 'non alligned blocking write' if (me.eq.0)call ffflush(6) c do i = 1, ndim glo(i) = 1 ghi(i) = n dlo(i) = 2 dhi(i) = n+1 end do tt0 = MP_TIMER() if(ndra_write_section(.false., g_a, glo, ghi, & d_b, dlo, dhi, req).ne.0) & call ga_error('ndra_write_section failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') mbytes = 1e-6*util_mdtob(n*n*n) if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif c if(dra_close(d_b).ne.0)call ga_error('dra_close failed: ',d_b) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') mbytes = 1e-6*util_mdtob(n*n*n) if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif c if (me.eq.0) print *,' ' if (me.eq.0) print *,'disk array closed ' if (me.eq.0)call ffflush(6) c....................................................................... c c if (me.eq.0) print *,' ' if (me.eq.0) print *,'opening disk array' #ifdef USEMULTFILES if(dra_open(filename, & DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) #else if(dra_open(FNAME, & DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) #endif if(me.eq.0) print *, 'alligned blocking read' if (me.eq.0)call ffflush(6) tt0 = MP_TIMER() if(ndra_read(g_b, d_a, req).ne.0) $ CALL ga_error('ndra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif call ga_dadd(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'BTW, we have error =', err cbjp call ga_print(g_b) else if (me.eq.0) print *,'OK' endif if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) c....................................................................... c if (me.eq.0) print *,' ' if (me.eq.0) print *,'opening disk array' #ifdef USEMULTFILES if(dra_open(filename1, & DRA_R, d_b).ne.0) & call ga_error('dra_open failed',0) #else if(dra_open(FNAME1, & DRA_R, d_b).ne.0) & call ga_error('dra_open failed',0) #endif if(me.eq.0) print *, 'non alligned blocking read' if (me.eq.0)call ffflush(6) tt0 = MP_TIMER() if(ndra_read_section(.false., g_b, glo, ghi, & d_b, dlo, dhi, req).ne.0) & call ga_error('ndra_read_section failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) tt1 = MP_TIMER() -tt0 rmax = tt1 call ga_dgop(1,rmax,1,'max') if (me.eq.0)then write(6,100)mbytes,rmax,mbytes/rmax endif call ga_dadd(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'BTW, we have error =', err else if (me.eq.0) print *,'OK' endif if(dra_delete(d_b).ne.0) & call ga_error('dra_delete failed',0) c....................................................................... status = ga_destroy(g_a) status = ga_destroy(g_b) 100 format(g11.2,' MB time=',g11.2,' rate=',g11.3,'MB/s') end subroutine fill_random(a, lo, hi, ld1, ld2) parameter (ndim = 3) integer lo(ndim), hi(ndim), ld1, ld2 double precision a(ld1,ld2,*), drand, seed1, seed2 integer i,j,k external drand c do k=1, hi(3)-lo(3) + 1 seed1 = drand(k) do j = 1, hi(2) - lo(2) + 1 seed2 = seed1*j do i = 1, hi(1) - lo(1) + 1 a(i,j,k)=seed2*i end do enddo enddo end ga-5-4/pario/dra/test.F0000644000175000017500000002654712662210477013023 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c FNAME - filename for test program c #define BASE_NAME 'dra.file' #ifdef HPIODIR # define FNAME HPIODIR//BASE_NAME #else # define FNAME BASE_NAME #endif program io #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer status, me integer max_arrays integer stack, heap double precision max_sz, max_disk, max_mem data max_arrays, max_sz, max_disk, max_mem /10,1d8,1d10, 1d6/ data stack, heap /80000, 80000/ c #include "mp3.fh" if(ma_init(MT_F_DBL, stack, heap) ) then call ga_initialize() me = ga_nodeid() if(dra_init(max_arrays, max_sz, max_disk, max_mem).ne.0)then call ga_error('dra_init failed: ',0) endif if (me.eq.0) print*,' ' if(me.eq.0)print *, 'TESTING INTEGERS' if (me.eq.0) print*,' ' call test_io_int() if (me.eq.0) print*,' ' if(me.eq.0)print *, 'TESTING DOUBLES' if (me.eq.0) print*,' ' call test_io_dbl() status = dra_terminate() call ga_terminate() else print *,'ma_init failed' endif c if(me.eq.0)print *, 'all done ...' call MP_FINALIZE() end subroutine test_io_int implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer n,m parameter (n = 100) parameter (m = 2*n) integer a(n,n) integer g_a, g_b, d_a integer i,j, req, err, dim1, dim2, type integer me, nproc logical status character*1 filename(200) character*80 name c nproc = ga_nnodes() me = ga_nodeid() call init_char(name,100, ' ') call init_char(filename,200, ' ') c c a() is a local copy of what the l array should start as c do j = 1, n do i = 1, n a(i,j) = i-1 + (j-1)*n enddo enddo c if (me.eq.0) print *, 'Creating global arrays' call ga_sync() if(.not. ga_create(MT_INT, n, n, 'a', 1, 1, g_a)) & call ga_error('ga_create failed: a', 0) if(.not. ga_create(MT_INT, n, n, 'b', 1, 1, g_b)) & call ga_error('ga_create failed: b', 0) c * call ga_zero(g_a) * call ga_zero(g_b) c do j = 1+me, n, nproc call ga_put(g_a, 1, n, j, j, a(1, j), n) enddo c if(me.eq.0) print *, 'Creating Disk Array ',n,' x',n if(dra_create(MT_INT, n, n, 'array A', & FNAME, & DRA_RW, n, 1, d_a).ne.0) $ CALL ga_error('dra_create failed: ',0) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Writing Global Array to Disk Array' if(dra_write(g_a, d_a,req).ne.0) $ CALL ga_error('dra_write failed:',0) if(dra_wait(req).ne.0)call ga_error('dra_wait failed: ' ,req) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' if(me.eq.0) print *, 'Closing Disk Array' if(dra_close(d_a).ne.0)call ga_error('dra_close failed: ',d_a) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Opening Existing Disk Array' if(dra_open(FNAME ,DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) c if(dra_inquire(d_a, type, dim1, dim2, name, filename).ne.0) & call ga_error('dra_inquire failed',0) if(dim1.ne.n) call ga_error('dim1 error',dim1) if(dim2.ne.n) call ga_error('dim2 error',dim2) if(type.ne.MT_INT) call ga_error('type error',type) if(me.eq.0) print *, 'array name read from disk is:',name call ga_sync() if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking dra_read' c call dra_set_mode(1) if(dra_read(g_b, d_a, req).ne.0) $ CALL ga_error('dra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c c error checking: (g_a - g_b)^2 c c call ga_print(g_a) c call ga_print(g_b) call ga_add(1, g_a, -1, g_b, g_b) err = ga_idot(g_b, g_b) c if(err.ne.0 )then if( me.eq.0) call ga_error('failed', err) else if (me.eq.0) print *,'OK' endif if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking dra_delete' if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' status = ga_destroy(g_a) status = ga_destroy(g_b) end subroutine test_io_dbl implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer n,m parameter (n = 100) parameter (m = 2*n) double precision a(n,n), err integer g_a, g_b, d_a double precision drand integer i,j, req, loop integer dilo,dihi,djlo,djhi integer gilo,gihi,gjlo,gjhi integer ielem, jelem integer me, nproc integer iran logical status external drand intrinsic int, dble iran(i) = int(drand(0)*dble(i-1)) + 1 c loop = 30 nproc = ga_nnodes() me = ga_nodeid() c c a() is a local copy of what the l array should start as c do j = 1, n do i = 1, n a(i,j) = dble(i-1 + (j-1)*n) enddo enddo c call ga_sync() if(.not. ga_create(MT_DBL, n, n, 'a', 1, 1, g_a)) & call ga_error('ga_create failed: a', 0) if(.not. ga_create(MT_DBL, n, n, 'b', 1, 1, g_b)) & call ga_error('ga_create failed: b', 0) c call ga_zero(g_a) call ga_zero(g_b) c do j = 1+me, n, nproc call ga_put(g_a, 1, n, j, j, a(1, j), n) enddo c if (me.eq.0) print*, 'Creating Disk Array ',n,' x',n if(dra_create(MT_DBL, n, n, 'A', & FNAME, & DRA_RW, n, 3, d_a).ne.0) $ CALL ga_error('dra_create failed: ',0) c if(me.eq.0) print *, 'Writing Global Array to Disk Array' if(dra_write(g_a, d_a,req).ne.0) $ CALL ga_error('dra_write failed:',0) if (me.eq.0) print*,' ' if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c if(dra_close(d_a).ne.0)call ga_error('dra_close failed: ',d_a) c if(me.eq.0) print *, 'Checking dra_read' if(dra_open(FNAME,DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) if(dra_read(g_b, d_a, req).ne.0) $ CALL ga_error('dra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c c error checking: (g_a - g_b)^2 c c call ga_print(g_a) c call ga_print(g_b) call ga_add(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'error =', err else if (me.eq.0) print *,'OK' endif if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking dra_read_section' c call ga_zero(g_b) do j = 1, loop dilo = iran(n) dihi = iran(n) djlo = iran(n) djhi = iran(n) c if(dilo.gt.dihi) call swap(dilo,dihi) if(djlo.gt.djhi) call swap(djlo,djhi) ielem = dihi - dilo +1 jelem = djhi - djlo +1 c gilo = iran(n-ielem)+1 gjlo = iran(n-jelem)+1 gihi = gilo+ielem-1 gjhi = gjlo+jelem-1 c if(me.eq.0) then write(6,100) gilo,gihi,gjlo,gjhi,dilo,dihi,djlo,djhi 100 format(1x,'reading global[',2(i4,':',i4), & '] from disk[',2(i4,':',i4),']') call ffflush(6) endif c * call ga_print(g_b,1) if(dra_read_section(.false., g_b, gilo, gihi, gjlo, gjhi, & d_a, dilo, dihi, djlo, djhi, req).ne.0) & call ga_error('dra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) * call ga_print(g_b,1) * call ga_print_patch(g_a, dilo, dihi, djlo, djhi,1) * call ga_print_patch(g_b, gilo, gihi, gjlo, gjhi,1) c call ga_add_patch(1d0, g_a, dilo, dihi, djlo, djhi, & -1d0, g_b, gilo, gihi, gjlo, gjhi, & g_b, gilo, gihi, gjlo, gjhi) err = ga_ddot_patch(g_b,'n', gilo, gihi, gjlo, gjhi, & g_b,'n', gilo, gihi, gjlo, gjhi) if(err.ne.0 .and. me.eq.0)then print *,'error =', err call ga_error('failed',0) endif enddo if (me.eq.0) print*,' OK' if (me.eq.0) print*,' ' if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) c c*** now d_a is 4 times larger than g_a c if (me.eq.0) print*, 'Creating New Disk Array ',m,' x',m if(dra_create(MT_DBL, m, m, 'A', & FNAME, & DRA_RW, n, 2, d_a).ne.0) $ CALL ga_error('dra_create failed: ',0) if (me.eq.0) print*,' OK' if (me.eq.0) print*,' ' c c c call ga_print(g_a) c call ga_zero(g_b) if (me.eq.0) print*,'Testing dra_write_section' do j = 1, loop gilo = iran(n) gihi = iran(n) gjlo = iran(n) gjhi = iran(n) c if(gilo.gt.gihi) call swap(gilo,gihi) if(gjlo.gt.gjhi) call swap(gjlo,gjhi) ielem = gihi - gilo +1 jelem = gjhi - gjlo +1 c dilo = iran(m-ielem)+1 djlo = iran(m-jelem)+1 dihi = dilo+ielem-1 djhi = djlo+jelem-1 c if(me.eq.0) then write(6,200) gilo,gihi,gjlo,gjhi,dilo,dihi,djlo,djhi 200 format(1x,'writing global[',2(i4,':',i4), & '] to disk[',2(i4,':',i4),']') call ffflush(6) endif c c call dra_set_mode(0) if(dra_write_section(.false., g_a, gilo, gihi, gjlo, gjhi, & d_a, dilo, dihi, djlo, djhi, req).ne.0) & call ga_error('dra_write failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) c c*** dra_read was tested already and we use it for testing dra_write_section c c call dra_set_mode(1) if(dra_read_section(.false., g_b, gilo, gihi, gjlo, gjhi, & d_a, dilo, dihi, djlo, djhi, req).ne.0) & call ga_error('dra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) c call ga_add_patch(1d0, g_a, gilo, gihi, gjlo, gjhi, & -1d0, g_b, gilo, gihi, gjlo, gjhi, & g_b, gilo, gihi, gjlo, gjhi) err = ga_ddot_patch(g_b,'n', gilo, gihi, gjlo, gjhi, & g_b,'n', gilo, gihi, gjlo, gjhi) if(err.ne.0d0 )then call ga_print_patch(g_a, gilo, gihi,gjlo,gjhi,1) call ga_print_patch(g_b, gilo, gihi,gjlo,gjhi,1) endif if(err.ne.0d0 .and. me.eq.0)then print *,'error =', err call ga_error('error in dra_write_section',0) endif enddo if (me.eq.0) print*,' OK' c if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) status = ga_destroy(g_a) status = ga_destroy(g_b) end subroutine swap(a,b) integer a, b, temp temp = a a = b b = temp end subroutine init_char(str, len, char) integer len, i #if defined(CRAY_T3D) || defined(CRAY_T3E) character*1 str(len) #else character*(*) str #endif character*1 char do i = 1, len -1 str(i:i+1) = char enddo end ga-5-4/pario/dra/ntest.F0000644000175000017500000003031412662210477013164 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c FNAME - filename for test program c #define BASE_NAME 'dra.file' #ifdef HPIODIR # define FNAME HPIODIR//BASE_NAME #else # define FNAME BASE_NAME #endif program io #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer status, me integer max_arrays integer stack, heap double precision max_sz, max_disk, max_mem data max_arrays, max_sz, max_disk, max_mem /10,1d8,1d10, 1d6/ data stack, heap /80000, 80000/ c #include "mp3.fh" if(ma_init(MT_F_DBL, stack, heap) ) then call ga_initialize() me = ga_nodeid() if(dra_init(max_arrays, max_sz, max_disk, max_mem).ne.0)then call ga_error('dra_init failed: ',0) endif if (me.eq.0) print*,' ' if(me.eq.0)print *, 'TESTING INTEGERS' if (me.eq.0) print*,' ' call test_io_int() if (me.eq.0) print*,' ' if(me.eq.0)print *, 'TESTING DOUBLES' if (me.eq.0) print*,' ' call test_io_dbl() status = dra_terminate() call ga_terminate() else print *,'ma_init failed' endif c if(me.eq.0)print *, 'all done ...' call MP_FINALIZE() end subroutine test_io_int implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer n,m parameter (n = 20) parameter (m = 2*n) integer a(n,n,n) integer g_a, g_b, d_a integer i,j,k, err, type integer me, nproc, dims(3), req(3), ndim integer chunk(3), lo(3), hi(3), ld(3) logical status character*1 filename(200) character*80 name c nproc = ga_nnodes() me = ga_nodeid() call init_char(name,100, ' ') call init_char(filename,200, ' ') c c a() is a local copy of what the l array should start as c do k = 1, n do j = 1, n do i = 1, n a(i,j,k) = i-1 + (j-1)*n + (k-1)*n*n enddo enddo enddo c if (me.eq.0) print *, 'Creating global arrays' call ga_sync() do i = 1, 3 dims(i) = n chunk(i) = 1 ld(i) = n end do if(.not. nga_create(MT_INT, 3, dims, 'a', chunk, g_a)) & call ga_error('nga_create failed: a', 0) if(.not. nga_create(MT_INT, 3, dims, 'b', chunk, g_b)) & call ga_error('nga_create failed: b', 0) c * call nga_zero(g_a) * call nga_zero(g_b) c write(6,*) 'Imediately before nga_put' do j = 1+me, n, nproc lo(1) = 1 lo(2) = 1 lo(3) = j hi(1) = n hi(2) = n hi(3) = j call nga_put(g_a, lo, hi, a(1,1,j), ld) enddo c if(me.eq.0) print *, 'Creating Disk Array ',n,' x',n,' x',n dims(1) = n dims(2) = n dims(3) = n req(1) = n req(2) = n req(3) = 1 ndim = 3 if(ndra_create(MT_INT, ndim, dims, 'array A', & FNAME, & DRA_RW, req, d_a).ne.0) $ CALL ga_error('ndra_create failed: ',0) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Writing Global Array to Disk Array' if(ndra_write(g_a, d_a,req).ne.0) $ CALL ga_error('ndra_write failed:',0) if(dra_wait(req).ne.0)call ga_error('dra_wait failed: ' ,req) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' if(me.eq.0) print *, 'Closing Disk Array' if(dra_close(d_a).ne.0)call ga_error('dra_close failed: ',d_a) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Opening Existing Disk Array' if(dra_open(FNAME ,DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) c if(ndra_inquire(d_a, type, ndim, dims, name, filename).ne.0) & call ga_error('ndra_inquire failed',0) if(dims(1).ne.n) call ga_error('dim1 error',dims(1)) if(dims(2).ne.n) call ga_error('dim2 error',dims(2)) if(dims(3).ne.n) call ga_error('dim3 error',dims(3)) if(type.ne.MT_INT) call ga_error('type error',type) if(me.eq.0) print *, 'array name read from disk is:',name call ga_sync() if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking ndra_read' c call dra_set_mode(1) write(6,*) 'About to perform ndra_read' if(ndra_read(g_b, d_a, req).ne.0) $ CALL ga_error('ndra_read failed:',0) write(6,*) 'Finished performing ndra_read' call ffflush(6) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c c error checking: (g_a - g_b)^2 c c call ga_print(g_a) c call ga_print(g_b) call ga_add(1, g_a, -1, g_b, g_b) err = ga_idot(g_b, g_b) c if(err.ne.0 )then if( me.eq.0) call ga_error('failed', err) else if (me.eq.0) print *,'OK' endif if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking dra_delete' if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) if (me.eq.0) print *,'OK' if (me.eq.0) print*,' ' status = ga_destroy(g_a) status = ga_destroy(g_b) end subroutine test_io_dbl implicit none #include "mafdecls.fh" #include "global.fh" #include "dra.fh" integer n,m parameter (n = 20) parameter (m = 2*n) double precision a(n,n,n), err integer g_a, g_b, d_a double precision drand integer i,j,k, loop integer dlo(3),dhi(3) integer glo(3),ghi(3) integer elem integer me, nproc integer iran, ndim, dims(3), req(3), chunk(3), ld(3) logical status external drand intrinsic int, dble iran(i) = int(drand(0)*dble(i-1)) + 1 c loop = 30 nproc = ga_nnodes() me = ga_nodeid() c c a() is a local copy of what the l array should start as c do k = 1, n do j = 1, n do i = 1, n a(i,j,k) = dble(i-1 + (j-1)*n + (k-1)*n*n) enddo enddo end do c call ga_sync() ndim = 3 do i = 1, ndim dims(i) = n chunk(i) = 1 ld(i) = n end do write(6,*) 'Creating global arrays' write(6,*) if(.not. nga_create(MT_DBL, ndim, dims, 'a', chunk, g_a)) & call ga_error('ga_create failed: a', 0) if(.not. nga_create(MT_DBL, ndim, dims, 'b', chunk, g_b)) & call ga_error('ga_create failed: b', 0) c write(6,*) 'Zeroing global arrays' write(6,*) call ga_zero(g_a) call ga_zero(g_b) c do j = 1+me, n, nproc dlo(1) = 1 dlo(2) = 1 dlo(3) = j dhi(1) = n dhi(2) = n dhi(3) = j call nga_put(g_a, dlo, dhi, a(1, 1, j), ld) enddo c if (me.eq.0) print*, 'Creating Disk Array ',n,' x',n,' x',n req(1) = n req(2) = n req(3) = 3 if(ndra_create(MT_DBL, ndim, dims, 'A', & FNAME, & DRA_RW, req, d_a).ne.0) $ CALL ga_error('ndra_create failed: ',0) c if(me.eq.0) print *, 'Writing Global Array to Disk Array' if(ndra_write(g_a, d_a,req).ne.0) $ CALL ga_error('ndra_write failed:',0) if (me.eq.0) print*,' ' if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c if(dra_close(d_a).ne.0)call ga_error('dra_close failed: ',d_a) c if(me.eq.0) print *, 'Checking ndra_read' if(dra_open(FNAME,DRA_R, d_a).ne.0) & call ga_error('dra_open failed',0) if(ndra_read(g_b, d_a, req).ne.0) $ CALL ga_error('ndra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed: ' ,req) c c error checking: (g_a - g_b)^2 c c call ga_print(g_a) c call ga_print(g_b) call ga_add(1d0, g_a, -1d0, g_b, g_b) err = ga_ddot(g_b, g_b) if(err.ne.0) then if (me.eq.0) print *,'error =', err else if (me.eq.0) print *,'OK' endif if (me.eq.0) print*,' ' c if(me.eq.0) print *, 'Checking ndra_read_section' c call ga_zero(g_b) do j = 1, loop do i = 1, ndim dlo(i) = iran(n) dhi(i) = iran(n) if (dlo(i).gt.dhi(i)) call swap(dlo(i),dhi(i)) elem = dhi(i) - dlo(i) + 1 glo(i) = iran(n-elem) + 1 ghi(i) = glo(i) + elem - 1 end do c if(me.eq.0) then write(6,100) (glo(i),ghi(i),i=1,3),(dlo(i),dhi(i),i=1,3) 100 format(1x,'reading global[',3(i4,':',i4), & '] from disk[',3(i4,':',i4),']') call ffflush(6) endif c * call ga_print(g_b,1) if(ndra_read_section(.false., g_b, glo, ghi, & d_a, dlo, dhi, req).ne.0) & call ga_error('ndra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) * call ga_print(g_b,1) * call ga_print_patch(g_a, dilo, dihi, djlo, djhi,1) * call ga_print_patch(g_b, gilo, gihi, gjlo, gjhi,1) c call nga_add_patch(1d0, g_a, dlo, dhi, -1d0, g_b, glo, ghi, & g_b, glo, ghi) err = nga_ddot_patch(g_b,'n', glo, ghi, g_b,'n', glo, ghi) if(err.ne.0 .and. me.eq.0)then print *,'error =', err call ga_error('failed',0) endif enddo if (me.eq.0) print*,' OK' if (me.eq.0) print*,' ' if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) c c*** now d_a is 4 times larger than g_a c if (me.eq.0) print*, 'Creating New Disk Array ',m,' x',m,' x',m dims(1) = m dims(2) = m dims(3) = m req(1) = n req(2) = n req(3) = 2 if(ndra_create(MT_DBL, ndim, dims, 'A', & FNAME, & DRA_RW, req, d_a).ne.0) $ CALL ga_error('dra_create failed: ',0) if (me.eq.0) print*,' OK' if (me.eq.0) print*,' ' c c c call ga_print(g_a) c call ga_zero(g_b) if (me.eq.0) print*,'Testing ndra_write_section' do j = 1, loop do i = 1, ndim glo(i) = iran(n) if(glo(i).gt.ghi(i)) call swap(glo(i),ghi(i)) elem = ghi(i) - glo(i) +1 dlo(i) = iran(m-elem)+1 dhi(i) = dlo(i)+elem-1 end do c if(me.eq.0) then write(6,200) (glo(i),ghi(i),i=1,3),(dlo(i),dhi(i),i=1,3) 200 format(1x,'writing global[',3(i4,':',i4), & '] to disk[',3(i4,':',i4),']') call ffflush(6) endif c c call dra_set_mode(0) c if(dra_write_section(.false., g_a, gilo, gihi, gjlo, gjhi, c & d_a, dilo, dihi, djlo, djhi, req).ne.0) if(ndra_write_section(.false., g_a, glo, ghi, & d_a, dlo, dhi, req).ne.0) & call ga_error('dra_write failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) c c*** dra_read was tested already and we use it for testing ndra_write_section c c call dra_set_mode(1) if(ndra_read_section(.false., g_b, glo, ghi, & d_a, dlo, dhi, req).ne.0) & call ga_error('ndra_read failed:',0) if(dra_wait(req).ne.0) call ga_error('dra_wait failed:',req) c call nga_add_patch(1d0, g_a, glo, ghi, -1d0, g_b, glo, ghi, & g_b, glo, ghi) err = nga_ddot_patch(g_b,'n', glo, ghi, g_b,'n', glo, ghi) cbjp if(err.ne.0d0 )then cbjp call ga_print_patch(g_a, gilo, gihi,gjlo,gjhi,1) cbjp call ga_print_patch(g_b, gilo, gihi,gjlo,gjhi,1) cbjp endif if(err.ne.0d0 .and. me.eq.0)then print *,'error =', err call ga_error('error in ndra_write_section',0) endif enddo if (me.eq.0) print*,' OK' c if(dra_delete(d_a).ne.0) & call ga_error('dra_delete failed',0) status = ga_destroy(g_a) status = ga_destroy(g_b) end subroutine swap(a,b) integer a, b, temp temp = a a = b b = temp end subroutine init_char(str, len, char) integer len, i #if defined(CRAY_T3D) || defined(CRAY_T3E) character*1 str(len) #else character*(*) str #endif character*1 char do i = 1, len -1 str(i:i+1) = char enddo end ga-5-4/pario/dra/ntestc.c0000644000175000017500000003032212662210477013363 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #define BASE_NAME "dra.file" #ifdef HPIODIR # define FNAME HPIODIR/*BASE_NAME*/ #else # define FNAME BASE_NAME #endif #define NDIM 3 #define SIZE 20 #define NSIZE 8000 #define LSIZE 216000 #define TRUE (logical)1 #define FALSE (logical)0 #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 #include "dra.h" #include "ga.h" #include "macdecls.h" #include "mp3.h" #define MAXDIM GA_MAX_DIM #define COPY_INT_DRAT(src,dst) {\ int i; \ for (i=0; i dhi[i]) swap(&dlo[i],&dhi[i]); elem = dhi[i] - dlo[i] + 1; glo[i] = iran(n-elem,&idum); ghi[i] = glo[i] + elem - 1; } if (me == 0) { printf(" read global["); printf("%4d:%4d",glo[0],ghi[0]); for (i=1; i ghi[i]) swap(&glo[i],&ghi[i]); elem = ghi[i] - glo[i] +1; dlo[i] = iran(m-elem,&idum); dhi[i] = dlo[i]+elem-1; } if (me == 0) { printf(" writing global["); printf("%4d:%4d",glo[0],ghi[0]); for (i=1; i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #include "buffers.h" #include "dra.h" #include "draf2c.h" #include "drap.h" #include "global.h" #include "ga-papi.h" #include "macdecls.h" #define WALLTIME 0 #if WALLTIME # include "walltime.c" #endif /************************** constants ****************************************/ #define DRA_FAIL (Integer)1 #define COLUMN 1 #define ROW 0 #define ON 1 #define OFF 0 #define ILO 0 #define IHI 1 #define JLO 2 #define JHI 3 #define DRA_OP_WRITE 777 #define DRA_OP_READ 888 #define PROBE 111 #define WAIT 222 #define MAX_REQ 5 /** message type/tag used by DRA */ #define DRA_TYPE_GSM 32760 - 6 #define DRA_TYPE_GOP 32760 - 7 #define INFINITE_NUM_PROCS 8094 #define CLIENT_TO_SERVER 2 /* #define DRA_DBLE_BUFFER */ #if defined(SP1)|| defined(SP) || defined(LAPI) # define DRA_NUM_IOPROCS 8 #else # define DRA_NUM_IOPROCS 1 #endif #ifndef DRA_NUM_FILE_MGR # define DRA_NUM_FILE_MGR DRA_NUM_IOPROCS #endif #define DRA_BUF_SIZE BUF_SIZE #define DEF_MAX_ARRAYS 16 #define DRA_MAX_ARRAYS 1024 #define EPS_SEARCH 100 #define LOAD 1 #define STORE 2 #define TRANS 1 #define NOTRANS 0 /*#define DEBUG 1*/ /*#define CLEAR_BUF 1*/ /***************************** Global Data ***********************************/ /** Default number of IO procs */ Integer _dra_io_procs; /** Default number of files to use on open file systems */ Integer _dra_number_of_files; /** array of struct for basic info about DRA arrays*/ disk_array_t *DRA; buf_context_t buf_ctxt; /**< buffer context handle */ int nbuf = 4; /**< number of buffers to be used */ Integer _max_disk_array; /**< max number of disk arrays open at a time */ logical dra_debug_flag; /**< globally defined debug parameter */ request_t Requests[MAX_REQ]; int num_pending_requests=0; Integer _dra_turn=0; int Dra_num_serv=DRA_NUM_IOPROCS; /****************************** Macros ***************************************/ #define dai_sizeofM(_type) MA_sizeof(_type, 1, MT_C_CHAR) #define dai_check_typeM(_type) if (_type != C_DBL && _type != C_INT \ && _type != C_LONG && _type != C_DCPL && _type != C_FLOAT && _type != C_SCPL) \ dai_error("invalid type ",_type) #define dai_check_handleM(_handle, msg) \ {\ if((_handle+DRA_OFFSET)>=_max_disk_array || (_handle+DRA_OFFSET)<0) \ {fprintf(stderr,"%s, %ld --",msg, (long)_max_disk_array);\ dai_error("invalid DRA handle",_handle);} \ if( DRA[(_handle+DRA_OFFSET)].actv == 0) \ {fprintf(stderr,"%s:",msg);\ dai_error("disk array not active",_handle);} \ } #define dai_check_rangeM(_lo, _hi, _dim, _err_msg) \ if(_lo < (Integer)1 || _lo > _dim ||_hi < _lo || _hi > _dim) \ dai_error(_err_msg, _dim) #define ga_get_sectM(sect, _buf, _ld)\ pnga_get(sect.handle, sect.lo, sect.hi, _buf, &_ld) #define ga_put_sectM(sect, _buf, _ld)\ pnga_put(sect.handle, sect.lo, sect.hi, _buf, &_ld) #define fill_sectionM(sect, _hndl, _ilo, _ihi, _jlo, _jhi) \ { \ sect.handle = _hndl;\ sect.ndim = 2; \ sect.lo[0] = _ilo;\ sect.hi[0] = _ihi;\ sect.lo[1] = _jlo;\ sect.hi[1] = _jhi;\ } #define sect_to_blockM(ds_a, CR)\ {\ Integer hndl = (ds_a).handle+DRA_OFFSET;\ Integer br = ((ds_a).lo[0]-1)/DRA[hndl].chunk[0];\ Integer bc = ((ds_a).lo[1]-1)/DRA[hndl].chunk[1];\ Integer R = (DRA[hndl].dims[0] + DRA[hndl].chunk[0] -1)/DRA[hndl].chunk[0];\ *(CR) = bc * R + br;\ } #define block_to_sectM(ds_a, CR)\ {\ Integer hndl = (ds_a)->handle+DRA_OFFSET;\ Integer R = (DRA[hndl].dims[0] + DRA[hndl].chunk[0]-1)/DRA[hndl].chunk[0];\ Integer br = (CR)%R;\ Integer bc = ((CR) - br)/R;\ (ds_a)-> lo[0]= br * DRA[hndl].chunk[0] +1;\ (ds_a)-> lo[1]= bc * DRA[hndl].chunk[1] +1;\ (ds_a)-> hi[0]= (ds_a)->lo[0] + DRA[hndl].chunk[0];\ (ds_a)-> hi[1]= (ds_a)->lo[1] + DRA[hndl].chunk[1];\ if( (ds_a)->hi[0] > DRA[hndl].dims[0]) (ds_a)->hi[0] = DRA[hndl].dims[0];\ if( (ds_a)->hi[1] > DRA[hndl].dims[1]) (ds_a)->hi[1] = DRA[hndl].dims[1];\ } #define INDEPFILES(x) (DRA[(x)+DRA_OFFSET].indep) #define ITERATOR_2D(i,j, base, ds_chunk)\ for(j = ds_chunk.lo[1], base=0, jj=0; j<= ds_chunk.hi[1]; j++,jj++)\ for(i = ds_chunk.lo[0], ii=0; i<= ds_chunk.hi[0]; i++,ii++,base++) #define COPY_SCATTER(ADDR_BASE, TYPE, ds_chunk)\ ITERATOR_2D(i,j, base, ds_chunk) \ ADDR_BASE[base+vindex] = ((TYPE*)buffer)[ldb*jj + ii] #define COPY_GATHER(ADDR_BASE, TYPE, ds_chunk)\ for(i=0; i< nelem; i++){\ Integer ldc = ds_chunk.hi[0] - ds_chunk.lo[0]+1;\ base = INT_MB[pindex+i]; jj = base/ldc; ii = base%ldc;\ ((TYPE*)buffer)[ldb*jj + ii] = ADDR_BASE[i+vindex];\ } #define COPY_TYPE(OPERATION, MATYPE, ds_chunk)\ switch(MATYPE){\ case C_DBL: COPY_ ## OPERATION(DBL_MB,double,ds_chunk);break;\ case C_INT: COPY_ ## OPERATION(INT_MB,int,ds_chunk);break;\ case C_DCPL: COPY_ ## OPERATION(DCPL_MB,DoubleComplex,ds_chunk);break;\ case C_SCPL: COPY_ ## OPERATION(SCPL_MB,SingleComplex,ds_chunk);break;\ case C_FLOAT: COPY_ ## OPERATION(FLT_MB,float,ds_chunk);\ } #define nsect_to_blockM(ds_a, CR) \ { \ Integer hndl = (ds_a).handle+DRA_OFFSET;\ Integer _i, _ndim = DRA[hndl].ndim; \ Integer _R, _b; \ *(CR) = 0; \ _R = 0; \ for (_i=_ndim-1; _i >= 0; _i--) { \ _b = ((ds_a).lo[_i]-1)/DRA[hndl].chunk[_i]; \ _R = (DRA[hndl].dims[_i]+DRA[hndl].chunk[_i]-1)/DRA[hndl].chunk[_i];\ *(CR) = *(CR) * _R + _b; \ } \ } #define dai_dest_indices_1d_M(index, id, jd, ilod, jlod, ldd) \ { \ Integer _index_;\ _index_ = (is)-(ilos);\ *(id) = (_index_)%(ldd) + (ilod);\ *(jd) = (_index_)/(ldd) + (jlod);\ } #define dai_dest_indicesM(is, js, ilos, jlos, lds, id, jd, ilod, jlod, ldd)\ { \ Integer _index_;\ _index_ = (lds)*((js)-(jlos)) + (is)-(ilos);\ *(id) = (_index_)%(ldd) + (ilod);\ *(jd) = (_index_)/(ldd) + (jlod);\ } #define nga_get_sectM(sect, _buf, _ld, hdl)\ if (hdl != NULL)\ pnga_nbget(sect.handle, sect.lo, sect.hi, _buf, _ld, hdl);\ else\ pnga_get(sect.handle, sect.lo, sect.hi, _buf, _ld); #define nga_put_sectM(sect, _buf, _ld, hdl)\ if (hdl != NULL)\ pnga_nbput(sect.handle, sect.lo, sect.hi, _buf, _ld, hdl);\ else\ pnga_put(sect.handle, sect.lo, sect.hi, _buf, _ld); #define ndai_dest_indicesM(ds_chunk, ds_a, gs_chunk, gs_a) \ {\ Integer _i; \ Integer _ndim = ds_a.ndim; \ for (_i=0; _i<_ndim; _i++) { \ gs_chunk.lo[_i] = gs_a.lo[_i] + ds_chunk.lo[_i]- ds_a.lo[_i]; \ gs_chunk.hi[_i] = gs_a.lo[_i] + ds_chunk.hi[_i]- ds_a.lo[_i]; \ } \ } #define ndai_trnsp_dest_indicesM(ds_chunk, ds_a, gs_chunk, gs_a) \ {\ Integer _i; \ Integer _ndim = ds_a.ndim; \ for (_i=0; _i<_ndim; _i++) { \ gs_chunk.lo[_ndim-1-_i] = gs_a.lo[_ndim-1-_i] \ + ds_chunk.lo[_i]- ds_a.lo[_i]; \ gs_chunk.hi[_ndim-1-_i] = gs_a.lo[_ndim-1-_i] \ + ds_chunk.hi[_i]- ds_a.lo[_i]; \ } \ } /** Simple sort using straight insertion */ #define block_sortM(_ndim, _block_orig, _block_map) \ {\ Integer _i,_j,_it,_bt; \ Integer _block_tmp[MAXDIM]; \ for (_i=0; _i < (_ndim); _i++) { \ _block_map[_i] = _i; \ _block_tmp[_i] = _block_orig[_i]; \ } \ for (_j=(_ndim)-2; _j >= 0; _j--) { \ _i = _j + 1; \ _bt = _block_tmp[_j]; \ _it = _block_map[_j]; \ while (_i < (_ndim) && _bt < _block_tmp[_i]) { \ _block_tmp[_i-1] = _block_tmp[_i]; \ _block_map[_i-1] = _block_map[_i]; \ _i++; \ }\ _block_tmp[_i-1] = _bt; \ _block_map[_i-1] = _it; \ }\ } #define nfill_sectionM(sect, _hndl, _ndim, _lo, _hi) \ { \ Integer _i; \ sect.handle = _hndl; \ sect.ndim = _ndim; \ for (_i=0; _i<_ndim; _i++) { \ sect.lo[_i] = _lo[_i]; \ sect.hi[_i] = _hi[_i]; \ } \ } #define nblock_to_sectM(ds_a, _CR) \ {\ Integer _i, _b[MAXDIM], _C = (_CR); \ Integer _hndl = (ds_a)->handle+DRA_OFFSET; \ Integer _R = (DRA[_hndl].dims[0]+DRA[_hndl].chunk[0]-1)/DRA[_hndl].chunk[0]; \ (ds_a)->ndim = DRA[_hndl].ndim; \ _b[0] = _C%_R; \ for (_i=1; _ilo[_i] = _b[_i]*DRA[_hndl].chunk[_i] + 1; \ (ds_a)->hi[_i] = (ds_a)->lo[_i] + DRA[_hndl].chunk[_i] - 1; \ if ((ds_a)->hi[_i] > DRA[_hndl].dims[_i]) \ (ds_a)->hi[_i] = DRA[_hndl].dims[_i]; \ } \ } #define nblock_to_indicesM(_index,_ndim,_block_dims,_CC) \ { \ Integer _i, _C=(_CC); \ _index[0] = _C%_block_dims[0]; \ for (_i=1; _i<(_ndim); _i++) { \ _C = (_C - _index[_i-1])/_block_dims[_i-1]; \ _index[_i] = _C%_block_dims[_i]; \ } \ } #define ndai_check_rangeM(_lo, _hi, _ndim, _dims, _err_msg) \ { \ int _range_ok = 1, _i; \ for (_i=0; _i < (_ndim); _i++) { \ if (_lo[_i] < 1 || _lo[_i] > _dims[_i] || _hi[_i] < _lo[_i] \ || _hi[_i] > _dims[_i] ) _range_ok = 0; \ } \ if(!_range_ok) dai_error(_err_msg, _dim); \ } char dummy_fname[DRA_MAX_FNAME]; /*****************************************************************************/ /** * determines if write operation to a disk array is allowed */ int dai_write_allowed(Integer d_a) { Integer handle = d_a+DRA_OFFSET; if(DRA[handle].mode == DRA_W || DRA[handle].mode == DRA_RW) return 1; else return 0; } /** * determines if read operation from a disk array is allowed */ int dai_read_allowed(Integer d_a) { Integer handle = d_a+DRA_OFFSET; if(DRA[handle].mode == DRA_R || DRA[handle].mode == DRA_RW) return 1; else return 0; } /** * number of processes that could perform I/O */ Integer dai_io_procs(Integer d_a) { Integer handle = d_a+DRA_OFFSET; Integer num; /* this one of many possibilities -- depends on the system */ /* #ifdef _CRAYMPP num = DRA_NUM_IOPROCS; #else num = (INDEPFILES(d_a)) ? INFINITE_NUM_PROCS: DRA_NUM_IOPROCS; #endif */ if (INDEPFILES(d_a)) { num = pnga_cluster_nnodes(); } else { num = DRA[handle].ioprocs; } return( PARIO_MIN( pnga_nnodes(), num)); } /** * Translation of DRA create/opening modes to ELIO create/open * mode. DRA modes map directly to ELIO modes, except that write-only * DRAs are backed by read-write ELIO files. */ int dai_elio_mode(int dra_mode) { int emode = dra_mode; /* dra modes map to elio mode*/ if(dra_mode == DRA_W) { /*except W, which translate to read-write files*/ emode = ELIO_RW; } return emode; } /** * rank of calling process in group of processes that could perform I/O * a negative value means that this process doesn't do I/O */ Integer dai_io_nodeid(Integer d_a) { Integer handle = d_a+DRA_OFFSET; Integer me = pnga_nodeid(); Integer pid, id, nid, nnodes,nprocs; Integer nodeid = pnga_cluster_nodeid(); Integer zero = 0; /* again, one of many possibilities: * if proc id beyond I/O procs number, negate it */ if (INDEPFILES(d_a)) { if(me == pnga_cluster_procid(nodeid, zero)) me = nodeid; else me = -1; } else { if (DRA[handle].ioprocs == 1) { if (me == 0) return me; else return -1; } else { nnodes = pnga_cluster_nnodes(); nprocs = pnga_cluster_nprocs(nodeid); pid = me % nprocs; nid = (me - pid)/nprocs; id = pid * nnodes + nid; if (id < DRA[handle].ioprocs) return id; else return -1; } } /* if (me >= dai_io_procs(d_a)) me = -me;*/ return (me); } /** * determines if I/O process participates in file management (create/delete) */ Integer dai_io_manage(Integer d_a) { Integer me = dai_io_nodeid(d_a); if(me >= 0 ) return (1); else return (0); } /** * select one master process for each file associated with d_a */ Integer dai_file_master(Integer d_a) { Integer handle = d_a+DRA_OFFSET; if(dai_io_nodeid(d_a)<0)return 0; /* for indep files each I/O process has its own file * for shared file 0 is the master */ if(INDEPFILES(d_a) || DRA[handle].numfiles > 1 || dai_io_nodeid(d_a) == 0 ) return 1; else return 0; } void dai_callback(int op, int transp, section_t gs_a, section_t ds_a, section_t ds_chunk, Integer ld[], char *buf, Integer req) { int i; buf_info *bi; bi = (buf_info*) buf; if (bi->callback==ON) dai_error("DRA: callback not cleared for a buffer",0); bi->callback = ON; bi->args.op = op; bi->args.transp = transp; bi->args.gs_a = gs_a; bi->args.ds_a = ds_a; bi->args.ds_chunk = ds_chunk; for (i=0; iargs.ld[i] = ld[i]; } /** * function to release buffers by completing the transfers * this function will be passed on as a parameter to a buffer management layer */ void wait_buf(char *buf); /** * INITIALIZE DISK ARRAY DATA STRUCTURES * * @param max_arrays[in] * @param max_array_size[in] * @param tot_disk_space[in] * @param max_memory[in] */ Integer FATR dra_init_( Integer *max_arrays, DoublePrecision *max_array_size, DoublePrecision *tot_disk_space, DoublePrecision *max_memory) { int i, buf_size; pnga_sync(); if(*max_arrays<-1 || *max_arrays> DRA_MAX_ARRAYS) dai_error("dra_init: incorrect max number of arrays",*max_arrays); _max_disk_array = (*max_arrays==-1) ? DEF_MAX_ARRAYS: *max_arrays; Dra_num_serv = drai_get_num_serv(); DRA = (disk_array_t*)malloc(sizeof(disk_array_t)* (int)*max_arrays); if(!DRA) dai_error("dra_init: memory alocation failed\n",0); for(i=0; i<_max_disk_array ; i++)DRA[i].actv=0; for(i=0; i PARIO_MIN(1,trial-EPS_SEARCH); bt--){ eps1 = prod%bt; if(eps1 < eps0){ /* better solution found */ b0 = bt; eps0 = eps1; } } *a = prod/b0; *b = b0; } /** * compute chunk parameters for layout of arrays on the disk * ---- a very simple algorithm to be refined later ---- * @param elem_size[in] Size of stored data * @param block1[in] Estimated size of request in dimension 1 * @param block2[in] Estimated size of request in dimension 2 * @param dim1[in] Size of DRA in dimension 1 * @param dim2[in] Size of DRA in dimension 2 * @param chunk1[out] Data block size in dimension 1? * @param chunk2[out] Data block size in dimension 2? */ void dai_chunking(Integer elem_size, Integer block1, Integer block2, Integer dim1, Integer dim2, Integer *chunk1, Integer *chunk2) { Integer patch_size; *chunk1 = *chunk2 =0; if(block1 <= 0 && block2 <= 0){ *chunk1 = dim1; *chunk2 = dim2; }else if(block1 <= 0){ *chunk2 = block2; *chunk1 = PARIO_MAX(1, DRA_BUF_SIZE/(elem_size* (*chunk2))); }else if(block2 <= 0){ *chunk1 = block1; *chunk2 = PARIO_MAX(1, DRA_BUF_SIZE/(elem_size* (*chunk1))); }else{ *chunk1 = block1; *chunk2 = block2; } /* need to correct chunk size to fit chunk1 x chunk2 request in buffer*/ patch_size = (*chunk1)* (*chunk2)*elem_size; if (patch_size > ((Integer)DRA_BUF_SIZE)){ if( *chunk1 == 1) *chunk2 = DRA_BUF_SIZE/elem_size; else if( *chunk2 == 1) *chunk1 = DRA_BUF_SIZE/elem_size; else { double ratio = ((double)patch_size)/((double)DRA_BUF_SIZE); /* smaller chunk to be scaled first */ if(*chunk1 < *chunk2){ dai_correct_chunking(chunk2,chunk1,DRA_BUF_SIZE/elem_size,ratio); }else{ dai_correct_chunking(chunk1,chunk2,DRA_BUF_SIZE/elem_size,ratio); } } } #ifdef DEBUG printf("\n%d:CREATE chunk=(%d,%d) elem_size=%d req=(%d,%d) buf=%d\n", pnga_nodeid(),*chunk1, *chunk2, elem_size, block1, block2, DRA_DBL_BUF_SIZE); fflush(stdout); #endif } /** * get a new handle for disk array */ Integer dai_get_handle(void) { Integer dra_handle =-1, candidate = 0; do{ if(!DRA[candidate].actv){ dra_handle=candidate; DRA[candidate].actv =1; } candidate++; }while(candidate < _max_disk_array && dra_handle == -1); return(dra_handle); } /** * release handle -- makes array inactive */ void dai_release_handle(Integer *handle) { DRA[*handle+DRA_OFFSET].actv =0; *handle = 0; } /** * find offset in file for (ilo,ihi) element */ void dai_file_location(section_t ds_a, Off_t* offset) { Integer row_blocks, handle=ds_a.handle+DRA_OFFSET, offelem, cur_ld, part_chunk1; if((ds_a.lo[0]-1)%DRA[handle].chunk[0]) dai_error("dai_file_location: not alligned ??",ds_a.lo[0]); row_blocks = (ds_a.lo[0]-1)/DRA[handle].chunk[0];/* # row blocks from top*/ part_chunk1 = DRA[handle].dims[0]%DRA[handle].chunk[0];/*dim1 in part block*/ cur_ld = (row_blocks == DRA[handle].dims[0] / DRA[handle].chunk[0]) ? part_chunk1: DRA[handle].chunk[0]; /* compute offset (in elements) */ if(INDEPFILES(ds_a.handle) || DRA[handle].numfiles > 1) { Integer CR, R; Integer i, num_part_block = 0; Integer ioprocs=dai_io_procs(ds_a.handle); Integer iome = dai_io_nodeid(ds_a.handle); sect_to_blockM(ds_a, &CR); R = (DRA[handle].dims[0] + DRA[handle].chunk[0]-1)/DRA[handle].chunk[0]; for(i = R -1; i< CR; i+=R) if(i%ioprocs == iome)num_part_block++; if(!part_chunk1) part_chunk1=DRA[handle].chunk[0]; offelem = ((CR/ioprocs - num_part_block)*DRA[handle].chunk[0] + num_part_block * part_chunk1 ) * DRA[handle].chunk[1]; /* add offset within block */ offelem += ((ds_a.lo[1]-1) %DRA[handle].chunk[1])*cur_ld; } else { offelem = row_blocks * DRA[handle].dims[1] * DRA[handle].chunk[0]; offelem += (ds_a.lo[1]-1)*cur_ld; } *offset = offelem* dai_sizeofM(DRA[handle].type); } /** * write aligned block of data from memory buffer to d_a */ void dai_put( section_t ds_a, void *buf, Integer ld, io_request_t *id) { Integer handle = ds_a.handle + DRA_OFFSET, elem; Off_t offset; Size_t bytes; /* find location in a file where data should be written */ dai_file_location(ds_a, &offset); if((ds_a.hi[0] - ds_a.lo[0] + 1) != ld) dai_error("dai_put: bad ld",ld); /* since everything is aligned, write data to disk */ elem = (ds_a.hi[0] - ds_a.lo[0] + 1) * (ds_a.hi[1] - ds_a.lo[1] + 1); bytes= (Size_t) elem * dai_sizeofM(DRA[handle].type); if( ELIO_OK != elio_awrite(DRA[handle].fd, offset, buf, bytes, id )) dai_error("dai_put failed", ds_a.handle); } /** * write zero at EOF */ void dai_zero_eof(Integer d_a) { Integer handle = d_a+DRA_OFFSET, nelem; char byte; Off_t offset; byte = (char)0; if(INDEPFILES(d_a) || DRA[handle].numfiles > 1) { Integer CR=0, i=0, nblocks=0; section_t ds_a; /* number of processors that do io */ Integer ioprocs=dai_io_procs(d_a); /* node id of current process (if it does io) */ Integer iome = dai_io_nodeid(d_a); /* total number of blocks in the disk resident array */ nblocks = ((DRA[handle].dims[0] + DRA[handle].chunk[0]-1)/DRA[handle].chunk[0]) * ((DRA[handle].dims[1] + DRA[handle].chunk[1]-1)/DRA[handle].chunk[1]); fill_sectionM(ds_a, d_a, 0, 0, 0, 0); /* search for the last block for each I/O processor */ for(i = 0; i 1) { sprintf(dummy_fname,"%s.%ld",DRA[handle].fname,(long)dai_io_nodeid(*d_a)); DRA[handle].fd = elio_open(dummy_fname,emode, ELIO_PRIVATE); }else{ DRA[handle].fd = elio_open(DRA[handle].fname,emode, ELIO_SHARED); } if(DRA[handle].fd ==NULL)dai_error("dra_open failed (null)", pnga_nodeid()); if(DRA[handle].fd->fd ==-1)dai_error("dra_open failed (-1)", pnga_nodeid()); } #ifdef DEBUG printf("\n%d:OPEN chunking=(%d,%d) type=%d buf=%d\n", pnga_nodeid(),DRA[handle].chunk[0], DRA[handle].chunk[1], DRA[handle].type, DRA_DBL_BUF_SIZE); fflush(stdout); #endif pnga_sync(); /* printf("FILE OPENED!!\n"); */ return(ELIO_OK); } /** * CLOSE AN ARRAY AND SAVE IT ON THE DISK */ Integer FATR dra_close_(Integer* d_a) /* input:DRA handle*/ { Integer handle = *d_a+DRA_OFFSET; int rc; pnga_sync(); dai_check_handleM(*d_a, "dra_close"); if(dai_io_manage(*d_a)) if(ELIO_OK != (rc=elio_close(DRA[handle].fd))) dai_error("dra_close: close failed",rc); dai_release_handle(d_a); pnga_sync(); return(ELIO_OK); } /** * decompose [ilo:ihi, jlo:jhi] into aligned and unaligned DRA subsections * * * section [ilo:ihi, jlo:jhi] is decomposed into a number of * 'aligned' and 'unaligned' (on chunk1/chunk2 bounday) subsections * depending on the layout of the 2D array on the disk; * * 'cover' subsections correspond to 'unaligned' subsections and * extend them to aligned on chunk1/chunk2 boundaries; * * disk I/O will be actually performed on 'aligned' and * 'cover' instead of 'unaligned' subsections */ void dai_decomp_section( section_t ds_a, Integer aligned[][2*MAXDIM], int *na, Integer cover[][2*MAXDIM], Integer unaligned[][2*MAXDIM], int *nu) { Integer a=0, u=0, handle = ds_a.handle+DRA_OFFSET, off, chunk_units, algn_flag; aligned[a][ ILO ] = ds_a.lo[0]; aligned[a][ IHI ] = ds_a.hi[0]; aligned[a][ JLO ] = ds_a.lo[1]; aligned[a][ JHI ] = ds_a.hi[1]; switch (DRA[handle].layout){ case COLUMN : /* need to check row alignment only */ algn_flag = ON; /* has at least one aligned subsection */ /* top of section */ off = (ds_a.lo[0] -1) % DRA[handle].chunk[0]; if(off){ if(MAX_UNLG<= u) dai_error("dai_decomp_sect:insufficient nu",u); chunk_units = (ds_a.lo[0] -1) / DRA[handle].chunk[0]; cover[u][ ILO ] = chunk_units*DRA[handle].chunk[0] + 1; cover[u][ IHI ] = PARIO_MIN(cover[u][ ILO ] + DRA[handle].chunk[0]-1, DRA[handle].dims[0]); unaligned[u][ ILO ] = ds_a.lo[0]; unaligned[u][ IHI ] = PARIO_MIN(ds_a.hi[0],cover[u][ IHI ]); unaligned[u][ JLO ] = cover[u][ JLO ] = ds_a.lo[1]; unaligned[u][ JHI ] = cover[u][ JHI ] = ds_a.hi[1]; if(cover[u][ IHI ] < ds_a.hi[0]){ /* cover subsection ends above ihi */ if(MAX_ALGN<=a) dai_error("dai_decomp_sect: na too small",a); aligned[a][ ILO ] = cover[u][ IHI ]+1; }else{ /* cover subsection includes ihi */ algn_flag = OFF; } u++; } /* bottom of section */ off = ds_a.hi[0] % DRA[handle].chunk[0]; if(off && (ds_a.hi[0] != DRA[handle].dims[0]) && (algn_flag == ON)){ if(MAX_UNLG<=u) dai_error("dai_decomp_sect:insufficient nu",u); chunk_units = ds_a.hi[0] / DRA[handle].chunk[0]; cover[u][ ILO ] = chunk_units*DRA[handle].chunk[0] + 1; cover[u][ IHI ] = PARIO_MIN(cover[u][ ILO ] + DRA[handle].chunk[0]-1, DRA[handle].dims[0]); unaligned[u][ ILO ] = cover[u][ ILO ]; unaligned[u][ IHI ] = ds_a.hi[0]; unaligned[u][ JLO ] = cover[u][ JLO ] = ds_a.lo[1]; unaligned[u][ JHI ] = cover[u][ JHI ] = ds_a.hi[1]; aligned[a][ IHI ] = PARIO_MAX(1,unaligned[u][ ILO ]-1); algn_flag=(DRA[handle].chunk[0] == DRA[handle].dims[0])?OFF:ON; u++; } *nu = (int)u; if(aligned[0][ IHI ]-aligned[0][ ILO ] < 0) algn_flag= OFF; *na = (algn_flag== OFF)? 0: 1; break; case ROW : /* we need to check column alignment only */ default: dai_error("dai_decomp_sect: ROW layout not yet implemented", DRA[handle].layout); } } /** * given current (i,j) compute (ni, nj) - next loop index * o - outermost loop, i- innermost loop * iinc increment for i * oinc increment for o */ int dai_next2d(Integer* i, Integer imin, Integer imax, Integer iinc, Integer* o, Integer omin, Integer omax, Integer oinc) { int retval; if (*o == 0 || *i == 0) { /* to handle initial out-of range indices */ *o = omin; *i = imin; } else { *i = *i + iinc; } if (*i > imax) { *i = imin; *o += oinc; } retval = (*o <= omax); return retval; } /** * compute next chunk of array to process */ int dai_next_chunk(Integer req, Integer* list, section_t* ds_chunk) { Integer handle = ds_chunk->handle+DRA_OFFSET; int retval; if(INDEPFILES(ds_chunk->handle) || DRA[handle].numfiles > 1) if(ds_chunk->lo[1] && DRA[handle].chunk[1]>1) ds_chunk->lo[1] -= (ds_chunk->lo[1] -1) % DRA[handle].chunk[1]; retval = dai_next2d(&ds_chunk->lo[0], list[ ILO ], list[ IHI ], DRA[handle].chunk[0], &ds_chunk->lo[1], list[ JLO ], list[ JHI ], DRA[handle].chunk[1]); if(!retval) return(retval); ds_chunk->hi[0] = PARIO_MIN(list[ IHI ], ds_chunk->lo[0] + DRA[handle].chunk[0] -1); ds_chunk->hi[1] = PARIO_MIN(list[ JHI ], ds_chunk->lo[1] + DRA[handle].chunk[1] -1); if(INDEPFILES(ds_chunk->handle) || DRA[handle].numfiles > 1) { Integer jhi_temp = ds_chunk->lo[1] + DRA[handle].chunk[1] -1; jhi_temp -= jhi_temp % DRA[handle].chunk[1]; ds_chunk->hi[1] = PARIO_MIN(ds_chunk->hi[1], jhi_temp); /*this line was absent from older version on bonnie that worked */ if(ds_chunk->lo[1] < list[ JLO ]) ds_chunk->lo[1] = list[ JLO ]; } return 1; } int dai_myturn(section_t ds_chunk) { /* Integer handle = ds_chunk.handle+DRA_OFFSET; */ Integer ioprocs = dai_io_procs(ds_chunk.handle); Integer iome = dai_io_nodeid(ds_chunk.handle); /* if(INDEPFILES(ds_chunk.handle) || DRA[handle].numfiles > 1){ */ /* compute cardinal number for the current chunk */ nsect_to_blockM(ds_chunk, &_dra_turn); /* }else{ _dra_turn++; } */ return ((_dra_turn%ioprocs) == iome); } /** * print routine for debugging purposes only (double) */ void dai_print_buf(double *buf, Integer ld, Integer rows, Integer cols) { int i,j; printf("\n ld=%ld rows=%ld cols=%ld\n",(long)ld,(long)rows,(long)cols); for (i=0; i 1) { itmp = i; index[1] = itmp%ldg[1]; for (j=2; j 1) { itmp = i; index[1] = itmp%ldg[1]; for (j=2; jcallback==OFF) return; bi->callback = OFF; arg = &(bi->args); /* bail if there is no valid global array handle */ if (arg->gs_a.handle == 0) return; buffer = (char*) (buf + sizeof(buf_info)); if (caller == WAIT) {/* call blocking nga_move() */ nga_move(arg->op, arg->transp, arg->gs_a, arg->ds_a, arg->ds_chunk, buffer, arg->ld, NULL); free_buf(&buf_ctxt, buf); } else if (caller == PROBE) /* call non-blocking nga_move() */ nga_move(arg->op, arg->transp, arg->gs_a, arg->ds_a, arg->ds_chunk, buffer, arg->ld, &(bi->ga_movhdl)); } /** * wait until buffer space associated with request is avilable */ void dai_wait(Integer req0) { /* Integer req; int ibuf; */ /* wait for all requests to complete on buffer Requests[req].ibuf */ /* ibuf = Requests[req0].ibuf; for(req=0; reqop; io_req = &(bi->io_req); ga_movhdl = &(bi->ga_movhdl); if (op_code == DRA_OP_WRITE) { /* last op is a disk write */ if(elio_probe(io_req, &stat) != ELIO_OK) { ret = DRA_FAIL; k = 0; break; } if (stat != ELIO_DONE) { k = 0; } else { free_buf(&buf_ctxt, bufs[i]); } } else if (op_code == DRA_OP_READ) { /* last op depends on aligned or unaligned transfer */ if (bi->align == 0) { /* unaligned read */ /* last op is a ga move */ if (pnga_nbtest(ga_movhdl) == 0) { /* ga op not complete */ k = 0; } else { /* ga op complete, free this buf */ free_buf(&buf_ctxt, bufs[i]); } } else { /* if aligned read, last op is a disk read */ if(elio_probe(io_req, &stat) != ELIO_OK) { ret = DRA_FAIL; k = 0; break; } if (stat != ELIO_DONE) k = 0; else { /* disk read done, initiate/test ga move */ /* callback=OFF means ga move done/being done */ if (bi->callback == OFF && pnga_nbtest(ga_movhdl) == 0) k = 0; else if (bi->callback == OFF && pnga_nbtest(ga_movhdl) ==1) { free_buf(&buf_ctxt, bufs[i]); } else if (bi->callback == ON) {/* need to call callback */ k = 0; cb[i] = 1; /* mark for a ga move */ } } } } } done = (Integer) k; /* determine global status */ pnga_gop(pnga_type_f2c(MT_F_INT), &done, (Integer)1, op); if(done){ *status = ELIO_DONE; Requests[*request].num_pending = 0; } else { *status = 0; for (i = 0; i < n_buf; i++) if (cb[i]) dai_exec_callback(bufs[i], PROBE); } if (ret == DRA_FAIL) *status = 0; /* basically value of status is irrelevant/undetermined in this case */ return ((Integer) ret); } /** * Returns control to DRA for a VERY short time to improve progress */ void dra_flick_() { Integer req, stat; for (req = 0; req < MAX_REQ; req++) { if (Requests[req].num_pending) { dra_probe_(&req, &stat); } } } /** * INQUIRE PARAMETERS OF EXISTING DISK ARRAY * @param d_a[in] DRA handle * @param type[out] * @param dim1[out] * @param dim2[out] * @param name[out] * @param filename[out] */ Integer drai_inquire(Integer *d_a, Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename) { Integer handle=*d_a+DRA_OFFSET; dai_check_handleM(*d_a,"dra_inquire"); *type = (Integer)DRA[handle].type; *dim1 = DRA[handle].dims[0]; *dim2 = DRA[handle].dims[1]; strcpy(name, DRA[handle].name); strcpy(filename, DRA[handle].fname); return(ELIO_OK); } /** * DELETE DISK ARRAY -- relevant file(s) gone * * @param d_a[in] DRA handle */ Integer FATR dra_delete_(Integer* d_a) { Integer handle = *d_a+DRA_OFFSET; int rc; pnga_sync(); dai_check_handleM(*d_a,"dra_delete"); dai_delete_param(DRA[handle].fname,*d_a); if(dai_io_manage(*d_a)) if(ELIO_OK != (rc=elio_close(DRA[handle].fd))) dai_error("dra_close: close failed",rc); if(dai_file_master(*d_a)) { if(INDEPFILES(*d_a) || DRA[handle].numfiles > 1){ sprintf(dummy_fname,"%s.%ld",DRA[handle].fname,(long)dai_io_nodeid(*d_a)); elio_delete(dummy_fname); } else { elio_delete(DRA[handle].fname); } } dai_release_handle(d_a); pnga_sync(); return(ELIO_OK); } /** * TERMINATE DRA DRATA STRUCTURES */ Integer FATR dra_terminate_() { free(DRA); buf_terminate(&buf_ctxt); pnga_sync(); return(ELIO_OK); } /** * compute chunk parameters for layout of arrays on the disk * ---- a very simple algorithm to be refined later ---- * * @param elem_size[in] Size of individual data element in bytes * @param ndim[in] Dimension of DRA * @param block_orig[in] Estimated size of request in each coordinate * direction. If size is unknown then use -1. * @param dims[in] Size of DRA in each coordinate direction * @param chunk[out] Size of data block size (in elements) in each * coordinate direction */ void ndai_chunking(Integer elem_size, Integer ndim, Integer block_orig[], Integer dims[], Integer chunk[]) { long patch_size, tmp_patch; Integer i, j, block[MAXDIM], block_map[MAXDIM]; double ratio; logical full_buf, some_neg, overfull_buf; /* copy block_orig so that original guesses are not destroyed */ for (i=0; i dims[i]) block[i] = dims[i]; } /* do additional adjustments to see if initial guesses are near some perfect factors of DRA dimensions */ for (i=0; i 0 && block[i] 0) patch_size *= (long)block[i]; else some_neg = TRUE; } if (patch_size*((long)elem_size) > ((long)DRA_BUF_SIZE)) overfull_buf = TRUE; /* map dimension sizes from highest to lowest */ block_sortM(ndim, dims, block_map); /* IO buffer is not full and there are some unspecied chunk dimensions. Set unspecified dimensions equal to block dimensions until buffer is filled. */ if (!full_buf && !overfull_buf && some_neg) { for (i=ndim-1; i>=0; i--) { if (block[block_map[i]] < 0) { tmp_patch = patch_size * ((long)dims[block_map[i]]); if (tmp_patch*elem_size < ((long)DRA_BUF_SIZE)) { patch_size *= (long)dims[block_map[i]]; block[block_map[i]] = dims[block_map[i]]; } else { block[block_map[i]] = (Integer)(DRA_BUF_SIZE/(patch_size*((long)elem_size))); patch_size *= ((long)block[block_map[i]]); full_buf = TRUE; } } } } /* copy block array to chunk array */ for (i=0; i 0) chunk[i] = block[i]; else chunk[i] = 1; } /* If patch overfills buffer, scale patch down until it fits */ if (overfull_buf) { ratio = ((double)DRA_BUF_SIZE) / ((double)(patch_size*((long)elem_size))); ratio = pow(ratio,1.0/((double)ndim)); patch_size = 1; for (i=0; i ((long)DRA_BUF_SIZE)) { /* map chunks from highest to lowest */ block_sortM(ndim, chunk, block_map); for (i=0; i < ndim; i++) { while (chunk[block_map[i]] > 1 && ((long)elem_size)*patch_size > ((long)DRA_BUF_SIZE)) { patch_size /= ((long)chunk[block_map[i]]); chunk[block_map[i]]--; patch_size *= ((long)chunk[block_map[i]]); } } } } /** * find offset in file for (lo,hi) element */ void ndai_file_location(section_t ds_a, Off_t* offset) { Integer handle=ds_a.handle+DRA_OFFSET, ndim, i, j; Integer blocks[MAXDIM], part_chunk[MAXDIM], cur_ld[MAXDIM]; long par_block[MAXDIM]; long offelem=0; ndim = DRA[handle].ndim; for (i=0; i 1) { Integer CR, block_dims[MAXDIM]; Integer index[MAXDIM]; long nelem; Integer i, j; Integer ioprocs = dai_io_procs(ds_a.handle); Integer iome = dai_io_nodeid(ds_a.handle); /* Find index of current block and find number of chunks in each dimension of DRA */ nsect_to_blockM(ds_a, &CR); for (i=0; i= 0) { offelem = 0; for (i=iome; i 1) { Integer CR=0, i=0, nblocks=0; section_t ds_a; /* number of processors that do io */ Integer ioprocs=dai_io_procs(d_a); /* node id of current process (if it does io) */ Integer iome = dai_io_nodeid(d_a); /* total number of blocks in the disk resident array */ nblocks = 1; for (i=0; i 0) { numfiles = numioprocs; } else { numfiles = pnga_cluster_nnodes(); } } if (numioprocs < 1) { numioprocs = numfiles; } *number_of_files = numfiles; *io_procs = numioprocs; if (*number_of_files > pnga_nnodes()) { if (pnga_nodeid() == 0) { printf("WARNING: Number of files requested exceeds number of\n"); printf("processors. Value is reset to number of processors: %ld\n", (long)pnga_nnodes()); } *number_of_files = pnga_nnodes(); } if (*io_procs > 1 && *number_of_files > 1) { if (*io_procs != *number_of_files) { if (pnga_nodeid() == 0) { printf("WARNING: Number of IO processors is not equal to the\n"); printf("number of files requested. Number of IO processors\n"); printf("is reset to number of files: %ld\n",(long)*number_of_files); } *io_procs = *number_of_files; } } if (*number_of_files == 1) { if (*io_procs > pnga_nnodes()) { if (pnga_nodeid() == 0) { printf("WARNING: Number of requested IO processors\n"); printf("exceeds number of available processors. Number of IO\n"); printf("processors reset to the number of available processors %ld\n", (long)pnga_nnodes()); } *io_procs = pnga_nnodes(); } } if (*number_of_files > *io_procs) { if (pnga_nodeid() == 0) { printf("WARNING: Number of files is greater than\n"); printf("number of IO processors. Number of files reset to number of\n"); printf("IO processors: %ld",(long)*io_procs); } *number_of_files = *io_procs; } } /** * CREATE AN N-DIMENSIONAL DISK ARRAY WITH USER SPECIFIED IO CONFIGURATION * * @param type[in] * @param ndim[in] dimension of DRA * @param dims[in] dimensions of DRA * @param name[in] * @param filename[in] * @param mode[in] * @param reqdims[in] dimension of typical request * @param numfiles[in] number of files for DRA * @param numioprocs[in] number of IO procs to use * @param d_a[out] DRA handle */ Integer ndrai_create_config(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *numfiles, Integer *numioprocs, Integer *d_a) { Integer handle, elem_size, ctype, i; int emode; /* convert Fortran to C data type */ ctype = pnga_type_f2c(*type); pnga_sync(); /* if we have an error here, it is fatal */ dai_check_typeM(ctype); for (i=0; i<*ndim; i++) if (dims[i] <=0) dai_error("ndra_create: disk array dimension invalid ", dims[i]); if(strlen(filename)>DRA_MAX_FNAME) dai_error("ndra_create: filename too long", DRA_MAX_FNAME); /*** Get next free DRA handle ***/ if( (handle = dai_get_handle()) == -1) dai_error("ndra_create: too many disk arrays ", _max_disk_array); *d_a = handle - DRA_OFFSET; /*translate DRA mode into ELIO mode*/ emode = dai_elio_mode((int)*mode); /* Determine array configuration */ dai_set_config(*numfiles, *numioprocs, &DRA[handle].numfiles, &DRA[handle].ioprocs); /* determine disk array decomposition */ elem_size = dai_sizeofM(ctype); ndai_chunking( elem_size, *ndim, reqdims, dims, DRA[handle].chunk); /* determine layout -- by row or column */ DRA[handle].layout = COLUMN; /* complete initialization */ for (i=0; i<*ndim; i++) DRA[handle].dims[i] = dims[i]; DRA[handle].ndim = *ndim; DRA[handle].type = ctype; DRA[handle].mode = (int)*mode; strncpy (DRA[handle].fname, filename, DRA_MAX_FNAME); strncpy(DRA[handle].name, name, DRA_MAX_NAME ); dai_write_param(DRA[handle].fname, *d_a); /* create param file */ DRA[handle].indep = dai_file_config(filename); /*check file configuration*/ /* create file */ if(dai_io_manage(*d_a)){ if (INDEPFILES(*d_a) || DRA[handle].numfiles > 1) { sprintf(dummy_fname,"%s.%ld",DRA[handle].fname,(long)dai_io_nodeid(*d_a)); DRA[handle].fd = elio_open(dummy_fname,emode, ELIO_PRIVATE); } else{ DRA[handle].fd = elio_open(DRA[handle].fname,emode, ELIO_SHARED); } if(DRA[handle].fd==NULL)dai_error("ndra_create:failed to open file",0); if(DRA[handle].fd->fd==-1)dai_error("ndra_create:failed to open file",-1); } /* * Need to zero the last element in the array on the disk so that * we never read beyond EOF. * * For multiple component files will stamp every one of them. * */ pnga_sync(); if(dai_file_master(*d_a) && dai_write_allowed(*d_a)) ndai_zero_eof(*d_a); pnga_sync(); return(ELIO_OK); } /** * CREATE AN N-DIMENSIONAL DISK ARRAY * * @param type[in] * @param ndim[in] dimension of DRA * @param dims[][in] dimensions of DRA * @param name[in] * @param filename[in] * @param mode[in] * @param reqdims[in] dimension of typical request * @param d_a[out] DRA handle */ Integer ndrai_create(Integer *type, Integer *ndim, Integer dims[], char *name, char *filename, Integer *mode, Integer reqdims[], Integer *d_a) { Integer ret; Integer files = _dra_number_of_files; Integer procs = _dra_io_procs; ret = ndrai_create_config(type, ndim, dims, name, filename, mode, reqdims, &files, &procs, d_a); return ret; } /** * CREATE A 2-D DISK ARRAY * * @param type[in] * @param dim1[in] * @param dim2[in] * @param name[in] * @param filename[in] * @param mode[in] * @param reqdim1[in] dim1 of typical request * @param reqdim2[in] dim2 of typical request * @param d_a[out] DRA handle */ Integer drai_create(Integer *type, Integer *dim1, Integer *dim2, char *name, char *filename, Integer *mode, Integer *reqdim1, Integer *reqdim2, Integer *d_a) { Integer ndim = 2; Integer dims[2], reqdims[2]; dims[0] = *dim1; dims[1] = *dim2; reqdims[0] = *reqdim1; reqdims[1] = *reqdim2; return ndrai_create(type, &ndim, dims, name, filename, mode, reqdims, d_a); #if 0 Integer handle, elem_size, ctype; int emode; /* convert Fortran to C data type */ ctype = pnga_type_f2c(*type); pnga_sync(); /* if we have an error here, it is fatal */ dai_check_typeM(ctype); if( *dim1 <= 0 ) dai_error("dra_create: disk array dimension1 invalid ", *dim1); else if( *dim2 <= 0) dai_error("dra_create: disk array dimension2 invalid ", *dim2); if(strlen(filename)>DRA_MAX_FNAME) dai_error("dra_create: filename too long", DRA_MAX_FNAME); /* Get next free DRA handle */ if( (handle = dai_get_handle()) == -1) dai_error("dai_create: too many disk arrays ", _max_disk_array); *d_a = handle - DRA_OFFSET; /*translate DRA mode into ELIO mode*/ emode = dai_elio_mode((int)*mode); /* determine disk array decomposition */ elem_size = dai_sizeofM(ctype); dai_chunking( elem_size, *reqdim1, *reqdim2, *dim1, *dim2, &DRA[handle].chunk[0], &DRA[handle].chunk[1]); /* determine layout -- by row or column */ DRA[handle].layout = COLUMN; /* complete initialization */ DRA[handle].dims[0] = *dim1; DRA[handle].dims[1] = *dim2; DRA[handle].ndim = 2; DRA[handle].type = ctype; DRA[handle].mode = (int)*mode; strncpy (DRA[handle].fname, filename, DRA_MAX_FNAME); strncpy(DRA[handle].name, name, DRA_MAX_NAME ); DRA[handle].ioprocs = _dra_io_procs; DRA[handle].numfiles = _dra_number_of_files; dai_write_param(DRA[handle].fname, *d_a); DRA[handle].indep = dai_file_config(filename); /* create file */ if(dai_io_manage(*d_a)){ if (INDEPFILES(*d_a) || DRA[handle].numfiles > 1) { sprintf(dummy_fname,"%s.%ld",DRA[handle].fname,(long)dai_io_nodeid(*d_a)); DRA[handle].fd = elio_open(dummy_fname,emode, ELIO_PRIVATE); } else { DRA[handle].fd = elio_open(DRA[handle].fname,emode, ELIO_SHARED); } if(DRA[handle].fd==NULL)dai_error("dra_create:failed to open file",0); if(DRA[handle].fd->fd==-1)dai_error("dra_create:failed to open file",0); } pnga_sync(); if(dai_file_master(*d_a) && dai_write_allowed(*d_a)) dai_zero_eof(*d_a); pnga_sync(); return(ELIO_OK); #endif } /** * write N-dimensional aligned block of data from memory buffer to d_a * * @param ds_a[in] section of DRA written to disk * @param buf[in] pointer to io buffer * @param ld[in] array of strides * @param id */ void ndai_put(section_t ds_a, void *buf, Integer ld[], io_request_t *id) { Integer handle = ds_a.handle + DRA_OFFSET, elem, i; Integer ndim = ds_a.ndim; Off_t offset; Size_t bytes; #if WALLTIME double ss0,tt0,tt1; #endif /* find location in a file where data should be written */ ndai_file_location(ds_a, &offset); for (i=0; i DRA[handle].dims[i]) cover_hi[i] = DRA[handle].dims[i]; } } /* Find coordinates of aligned chunk (if there is one) */ j = 0; check = 1; for (i=0; i= ds_a.hi[idir]) check = 0; } else { check = 1; } /* handle cover over upper end of patch */ if (off_hi[idir] != 0 && check == 1) { for (i=0, j=0; i cover[2*i+1]) { if (ihandle+DRA_OFFSET; int retval, ndim = DRA[handle].ndim, i; /* If we are writing out to multiple files then we need to consider chunk boundaries along last dimension */ /* if(INDEPFILES(ds_chunk->handle) || DRA[handle].numfiles > 1) */ if(ds_chunk->lo[ndim-1] && DRA[handle].chunk[ndim-1]>1) ds_chunk->lo[ndim-1] -= (ds_chunk->lo[ndim-1] -1) % DRA[handle].chunk[ndim-1]; /* ds_chunk->lo is getting set in this call. list contains the the lower and upper indices of the cover section. */ retval = ndai_next(ds_chunk->lo, list, DRA[handle].chunk, ndim); /* printf("Request %d\n",req); for (i=0; ilo[i], i, list[2*i], i, list[2*i+1]); } */ if(!retval) { return(retval); } for (i=0; ihi[i] = PARIO_MIN(list[2*i+1], ds_chunk->lo[i]+DRA[handle].chunk[i]-1); } /* Again, if we are writing out to multiple files then we need to consider chunk boundaries along last dimension */ /* if(INDEPFILES(ds_chunk->handle) || DRA[handle].numfiles > 1) { */ if (1) { Integer nlo; Integer hi_temp = ds_chunk->lo[ndim-1] + DRA[handle].chunk[ndim-1] -1; hi_temp -= hi_temp % DRA[handle].chunk[ndim-1]; ds_chunk->hi[ndim-1] = PARIO_MIN(ds_chunk->hi[ndim-1], hi_temp); /*this line was absent from older version on bonnie that worked */ nlo = 2*(ndim-1); if(ds_chunk->lo[ndim-1] < list[nlo]) ds_chunk->lo[ndim-1] = list[nlo]; } /* for (i=0; ihi[i]); } */ return 1; } /** * function to complete an operation and release the buffer associated * with a buffer id */ void wait_buf(char *buf) { Integer *ga_movhdl; io_request_t *io_req; int op_code; /* int buf_id = nbuf; */ buf_info *bi; if (buf == NULL) return; bi = (buf_info*) buf; op_code = bi->op; io_req = &(bi->io_req); ga_movhdl = &(bi->ga_movhdl); /*if (buf_id >= nbuf) { printf("Wait_buf Error: No operation is associated with this buffer\n"); return; }*/ switch(op_code) { case DRA_OP_WRITE: elio_wait(io_req); break; case DRA_OP_READ: if (bi->align == 0) pnga_nbwait(ga_movhdl); else { elio_wait(io_req); dai_exec_callback(buf, WAIT); } break; default: return; } #ifdef BUF_DEBUG printf("Released a buffer\n"); #endif } /** * Write or Read Unaligned Subsections to/from disk: * always read an aligned extension of a section from disk to local buffer then * for read : copy requested data from buffer to global array; * for write: overwrite part of buffer with data from g_a and write * complete buffer to disk * * @param opcode[in] signal for read or write * @param transp[in] should data be transposed * @param ds_a[in] section of DRA that is to be read from or written to * @param gs_a[in] section of GA that is to be read from or written to * @param req[in] request number */ void ndai_transfer_unlgn( int opcode, int transp, section_t ds_a, section_t gs_a, Integer req) { Integer chunk_ld[MAXDIM], next, offset, i, j; int type = DRA[ds_a.handle+DRA_OFFSET].type; Integer ndim = DRA[ds_a.handle+DRA_OFFSET].ndim; section_t ds_chunk, ds_unlg; char *buf, *buffer; Integer *ga_movhdl; io_request_t *io_req; buf_info *bi; ds_chunk = ds_unlg = ds_a; if (dra_debug_flag && 0) { for (i=0; iio_req); ga_movhdl = &(bi->ga_movhdl); bi->align = 0; buf = (char*) (buf + sizeof(buf_info)); ndai_get(ds_chunk, buf, chunk_ld, io_req); elio_wait(io_req); /* determine location in the buffer where GA data should be */ offset = ds_unlg.lo[ndim-1]-ds_chunk.lo[ndim-1]; for (i=ndim-2; i>=0; i--) { offset = offset*chunk_ld[i]; offset += ds_unlg.lo[i] - ds_chunk.lo[i]; } buffer = (char*)buf; buffer += offset * dai_sizeofM(type); switch (opcode){ case DRA_OP_WRITE: bi->op = DRA_OP_WRITE; /* overwrite a part of buffer with data from g_a */ nga_move(LOAD, transp, gs_a, ds_a, ds_unlg, buffer, chunk_ld, ga_movhdl); pnga_nbwait(ga_movhdl); /* write ENTIRE updated buffer back to disk */ ndai_put(ds_chunk, buf, chunk_ld, io_req); break; case DRA_OP_READ: bi->op = DRA_OP_READ; /* copy requested data from buffer to g_a */ nga_move(STORE, transp, gs_a, ds_a, ds_unlg, buffer, chunk_ld, ga_movhdl); break; default: dai_error("dai_transfer_unlg: invalid opcode",(Integer)opcode); } # ifdef DEBUG fprintf(stderr,"%d transf unlg g[%d:%d,%d:%d]-d[%d:%d,%d:%d]\n", dai_io_nodeid(), gs_chunk.lo[0], gs_chunk.hi[0], gs_chunk.lo[1], gs_chunk.hi[1], ds_unlg.lo[0], ds_unlg.hi[0], ds_unlg.lo[1], ds_unlg.hi[1]); # endif } } } /* returning from this function leaving some outstanding operations, so that dra_read()/write() can be non-blocking to some extent. we will have to call dra_wait() to make sure these operations are complete. */ } /** * write or read aligned subsections to disk */ void ndai_transfer_algn( int opcode, int transp, section_t ds_a, section_t gs_a, Integer req) { Integer next, chunk_ld[MAXDIM], ndim = ds_a.ndim; Integer i; section_t ds_chunk = ds_a; char *buf, *buffer; Integer *ga_movhdl; io_request_t *io_req; buf_info *bi; for(next = 0; next < Requests[req].na; next++){ for (i=0; iio_req); ga_movhdl = &(bi->ga_movhdl); bi->align = 1; bi->callback = OFF; buffer = buf; buf = buf + sizeof(buf_info); switch (opcode){ case DRA_OP_WRITE: bi->op = DRA_OP_WRITE; /* copy data from g_a to DRA buffer */ nga_move(LOAD, transp, gs_a, ds_a, ds_chunk, buf, chunk_ld, ga_movhdl); pnga_nbwait(ga_movhdl); /* copy data from DRA buffer to disk */ ndai_put(ds_chunk, buf, chunk_ld, io_req); break; case DRA_OP_READ: bi->op = DRA_OP_READ; /* copy data from disk to DRA buffer */ ndai_get(ds_chunk, buf, chunk_ld, io_req); /* copy data from DRA buffer to g_a */ /* nga_move(STORE, transp, gs_a, ds_a, ds_chunk, buf, chunk_ld, ga_movhdl); */ dai_callback(STORE, transp, gs_a, ds_a, ds_chunk, chunk_ld, buffer, req); break; default: dai_error("dai_transfer_algn: invalid opcode",(Integer)opcode); } # ifdef DEBUG fprintf(stderr,"%d transf algn g[%d:%d,%d:%d]-d[%d:%d,%d:%d]\n", dai_io_nodeid(), gs_chunk.lo[0], gs_chunk.hi[0], gs_chunk.lo[1], gs_chunk.hi[1], ds_chunk.lo[0], ds_chunk.hi[0], ds_chunk.lo[1], ds_chunk.hi[1]); # endif } } } /* returning from this function leaving some outstanding operations, so that dra_read()/write() can be non-blocking to some extent. we will have to call dra_wait() to make sure these operations are complete. */ } /** * WRITE SECTION g_a[glo:ghi] TO d_a[dlo:dhi] * * @param transp[in] transpose operator * @param g_a[in] GA handle * @param glo[in] * @param ghi[in] * @param d_a[in] DRA handle * @param dlo[in] * @param dhi[in] * @param request[out] async. request id */ Integer FATR ndra_write_section_(logical *transp, Integer *g_a, Integer glo[], Integer ghi[], Integer *d_a, Integer dlo[], Integer dhi[], Integer *request) { Integer gdims[MAXDIM], gtype, handle=*d_a+DRA_OFFSET; Integer i, gelem, delem, ndim; section_t d_sect, g_sect; pnga_sync(); /* usual argument/type/range checking stuff */ dai_check_handleM(*d_a,"ndra_write_sect"); pnga_inquire(*g_a, >ype, &ndim, gdims); if(!dai_write_allowed(*d_a))dai_error("ndra_write_sect: write not allowed",*d_a); if(DRA[handle].type != (int)gtype)dai_error("ndra_write_sect: type mismatch",gtype); if(DRA[handle].ndim != ndim)dai_error("ndra_write_sect: dimension mismatch", ndim); for (i=0; i #endif #include "global.h" #include "macommon.h" #define ga_idot_ F77_FUNC_(ga_idot,GA_IDOT) #define DRA_TYPE_GSM 32760 - 6 /** * Integer version of ga_ddot */ Integer ga_idot_(Integer *g_a, Integer *g_b) { Integer atype, adim1, adim2, btype, bdim1, bdim2, ald, bld; Integer ailo,aihi, ajlo, ajhi, bilo, bihi, bjlo, bjhi; register Integer i,j; Integer me, sum; Integer index_a, index_b; pnga_sync(); me = ga_nodeid_(); ga_check_handle(g_a, "ga_idot"); ga_check_handle(g_b, "ga_idot"); ga_inquire_(g_a, &atype, &adim1, &adim2); ga_inquire_(g_b, &btype, &bdim1, &bdim2); if(atype != btype || atype != MT_F_INT) ga_error("ga_idot: types not correct", 0L); if (adim1!=bdim1 || adim2 != bdim2) ga_error("ga_idot: arrays not conformant", 0L); if (DBL_MB == (DoublePrecision*)0 || INT_MB == (Integer*)0) ga_error("ga_idot: null pointer for base array",0L); ga_distribution_(g_a, &me, &ailo, &aihi, &ajlo, &ajhi); ga_distribution_(g_b, &me, &bilo, &bihi, &bjlo, &bjhi); if (ailo!=bilo || aihi != bihi || ajlo!=bjlo || ajhi != bjhi){ /* fprintf(stderr,"\nme =%d: %d-%d %d-%d vs %d-%d %d-%d dim:%dx%d\n",me, ailo,aihi, ajlo, ajhi, bilo, bihi, bjlo, bjhi,adim1,adim2); */ ga_error("ga_idot: distributions not identical",0L); } sum = 0.; if ( aihi>0 && ajhi>0 ){ ga_access_(g_a, &ailo, &aihi, &ajlo, &ajhi, &index_a, &ald); if(g_a == g_b){ index_b = index_a; bld =ald; }else ga_access_(g_b, &bilo, &bihi, &bjlo, &bjhi, &index_b, &bld); index_a --; /* Fortran to C correction of starting address */ index_b --; /* Fortran to C correction of starting address */ /* compute "local" contribution to the dot product */ for(j=0; j #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #define FNAME "/scratch/da.try" #define FNAME_ALT "/tmp/da.try" #define FNAME1 "/scratch/da1.try" #define FNAME1_ALT "/tmp/da1.try" #define FNAME2 "/scratch/da2.try" #define FNAME2_ALT "/tmp/da2.try" #include "dra.h" #include "ga.h" #include "macdecls.h" #include "mp3.h" #ifndef MAXDIM # define MAXDIM GA_MAX_DIM #endif #ifndef TRUE # define TRUE (Logical)1 #endif #ifndef FALSE # define FALSE (Logical)0 #endif /* If USER_CONFIG set to: * 0: Use default configuration * 1: Number of files is 1, number of I/O procs equals * the number of nodes * 2: Number of files and number of I/O procs equals * the number of nodes * 3: Number of files and number of I/O procs equals 1 * These configurations only apply if files are not located * on local scratch disk. For local scratch, system defaults * to 1 I/O proc per node and 1 file per node. Note that * USER_CONFIG=1 will only work if system has parallel I/O. * * Memory and Disk Usage: * The aggregate memory required to run this test is approximately * 2*SIZE**NDIM*sizeof(double) bytes. The amount of disk space * required is approximately 1+2**NDIM times this amount. */ #define USER_CONFIG 0 #define TEST_TRANSPOSE 0 #define NDIM 3 #define SIZE 250 /* #define NDIM 2 #define SIZE 4000 #define NDIM 1 #define SIZE 16000000 */ #define SWITCH 0 /*#define MAXDIM 7*/ /*#define TRUE (logical)1*/ /*#define FALSE (logical)0*/ #define MULTFILES 0 #ifdef SOLARIS # if MULTFILES # define USEMULTFILES 1 # endif #else # define USEMULTFILES 0 #endif #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 void filename_check(char *result, const char *fname, const char *fname_alt) { FILE *fd; strcpy(result, fname); if (! (fd = fopen(result, "w"))) { strcpy(result, fname_alt); if (! (fd = fopen(result, "w"))) { GA_Error("Could not open file", 0); } } fclose(fd); } float ran0(long *idum) { long k; float ans; *idum ^= MASK; k=(*idum)/IQ; *idum = IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } void fill_random(double *a, int isize) { long *idum; long i, j; j = 38282; idum = &j; a[0] = (double)ran0(idum); for (i=0; i<(long)isize; i++) { a[i] = (double)(10000.0*ran0(idum)); } } void test_io_dbl() { int ndim = NDIM; double err, tt0, tt1, mbytes; int g_a, g_b, d_a, d_b; #if TEST_TRANSPOSE int g_c, g_d, d_c; #endif int i, req, loop; dra_size_t dlo[MAXDIM],dhi[MAXDIM]; dra_size_t n, m; dra_size_t ddims[MAXDIM], reqdims[MAXDIM]; int glo[MAXDIM],ghi[MAXDIM]; int dims[MAXDIM]; int me, nproc, isize, numfiles, nioprocs; double plus, minus; double *index; int ld[MAXDIM], chunk[MAXDIM]; #if USEMULTFILES int ilen; #endif char filename[80], filename1[80]; n = SIZE; m = 2*SIZE; loop = 30; req = -1; nproc = GA_Nnodes(); me = GA_Nodeid(); nioprocs = GA_Cluster_nnodes(); numfiles = nioprocs; if (me == 0) { printf("Creating temporary global arrays %ld",(long)n); for (i=1; i #endif #if HAVE_STDLIB_H # include #endif #include "dra.h" #include "draf2c.h" #include "drap.h" #include "global.h" #include "ga-papi.h" static Integer _da_lo[MAXDIM], _da_hi[MAXDIM]; static Integer _da_dims[MAXDIM]; static Integer _da_reqdims[MAXDIM]; static Integer _ga_lo[MAXDIM], _ga_hi[MAXDIM]; #ifdef USE_FAPI # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[i]=(Integer)(carr)[i];} # define COPYF2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[i]=(int)(farr)[i];} # define COPYF2C_DRA(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[i]=(dra_size_t)(farr)[i];} #else # define COPYC2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i];} # define COPYF2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int)(farr)[i];} # define COPYF2C_DRA(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(dra_size_t)(farr)[i];} #define BASE_0 #endif #define COPY(CAST,src,dst,n) {\ int i; for(i=0; i< (n); i++)(dst)[i]=(CAST)(src)[i];} #ifdef BASE_0 # define COPYINDEX_C2F(carr, farr, n){\ int i; for(i=0; i< (n); i++)(farr)[n-i-1]=(Integer)(carr)[i]+1;} # define COPYINDEX_F2C(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(int)(farr)[i] -1;} # define COPYINDEX_F2C_DRA(farr, carr, n){\ int i; for(i=0; i< (n); i++)(carr)[n-i-1]=(dra_size_t)(farr)[i] -1;} #else # define COPYINDEX_F2C COPYF2C # define COPYINDEX_F2C_DRA COPYF2C_DRA # define COPYINDEX_C2F COPYC2F #endif int DRA_uses_fapi(void) { #ifdef USE_FAPI return 1; #else return 0; #endif } int NDRA_Create(int type, int ndim, dra_size_t dims[], char *name, char* filename, int mode, dra_size_t reqdims[], int *d_a) { Integer ttype, nndim, dd_a, mmode; logical st; if (ndim>MAXDIM) return 0; COPYC2F(dims, _da_dims, ndim); COPYC2F(reqdims, _da_reqdims, ndim); ttype = (Integer)type; nndim = (Integer)ndim; mmode = (Integer)mode; st = ndrai_create(&ttype, &nndim, _da_dims, name, filename, &mmode, _da_reqdims, &dd_a); *d_a = (int)dd_a; if(st==TRUE) return 1; else return 0; } int NDRA_Create_config(int type, int ndim, dra_size_t dims[], char *name, char* filename, int mode, dra_size_t reqdims[], int numfiles, int ioprocs, int *d_a) { Integer ttype, nndim, dd_a, mmode; Integer nnumfiles, iioprocs; logical st; if (ndim>MAXDIM) return 0; COPYC2F(dims, _da_dims, ndim); COPYC2F(reqdims, _da_reqdims, ndim); ttype = (Integer)type; nndim = (Integer)ndim; mmode = (Integer)mode; nnumfiles = (Integer)numfiles; iioprocs = (Integer)ioprocs; st = ndrai_create_config(&ttype, &nndim, _da_dims, name, filename, &mmode, _da_reqdims, &nnumfiles, &iioprocs, &dd_a); *d_a = (int)dd_a; if(st==TRUE) return 1; else return 0; } int NDRA_Inquire(int d_a, int *type, int *ndim, dra_size_t dims[], char *name, char* filename) { Integer dd_a, ttype, nndim, status; dd_a = (Integer)d_a; status = ndrai_inquire(&dd_a, &ttype, &nndim, _da_dims, name, filename); COPYF2C_DRA(_da_dims, dims, nndim); *type = (int)ttype; *ndim = (int)nndim; return (int)status; } int NDRA_Write(int g_a, int d_a, int *request) { Integer status, gg_a, dd_a, rrequest; gg_a = (Integer)g_a; dd_a = (Integer)d_a; rrequest = (Integer)*request; status = ndra_write_(&gg_a, &dd_a, &rrequest); *request = (int)rrequest; return (int)status; } int NDRA_Read(int g_a, int d_a, int *request) { Integer status, gg_a, dd_a, rrequest; gg_a = (Integer)g_a; dd_a = (Integer)d_a; rrequest = (Integer)*request; status = ndra_read_(&gg_a, &dd_a, &rrequest); *request = (int)rrequest; return (int)status; } int NDRA_Write_section(logical transp, int g_a, int glo[], int ghi[], int d_a, dra_size_t dlo[], dra_size_t dhi[], int *request) { Integer status; Integer ttransp, gg_a, dd_a, rrequest; Integer ndim; ttransp = (Integer)transp; gg_a = (Integer)g_a; ndim = pnga_ndim(gg_a); dd_a = (Integer)d_a; rrequest = (Integer)*request; COPYINDEX_C2F(glo, _ga_lo, ndim); COPYINDEX_C2F(ghi, _ga_hi, ndim); COPYINDEX_C2F(dlo, _da_lo, ndim); COPYINDEX_C2F(dhi, _da_hi, ndim); status = ndra_write_section_(&ttransp, &gg_a, _ga_lo, _ga_hi, &dd_a, _da_lo, _da_hi, &rrequest); *request = (int)rrequest; return (int)status; } int NDRA_Read_section(logical transp, int g_a, int glo[], int ghi[], int d_a, dra_size_t dlo[], dra_size_t dhi[], int *request) { Integer status; Integer ttransp, gg_a, dd_a, rrequest; Integer ndim; ttransp = (Integer)transp; gg_a = (Integer)g_a; ndim = pnga_ndim(gg_a); dd_a = (Integer)d_a; rrequest = (Integer)*request; COPYINDEX_C2F(glo, _ga_lo, ndim); COPYINDEX_C2F(ghi, _ga_hi, ndim); COPYINDEX_C2F(dlo, _da_lo, ndim); COPYINDEX_C2F(dhi, _da_hi, ndim); status = ndra_read_section_(&ttransp, &gg_a, _ga_lo, _ga_hi, &dd_a, _da_lo, _da_hi, &rrequest); *request = (int)rrequest; return (int)status; } int DRA_Init(int max_arrays, double max_array_size, double total_disk_space, double max_memory) { Integer mmax_arrays, status; DoublePrecision mmax_array_size, ttotal_disk_space, mmax_memory; mmax_arrays = (Integer)max_arrays; mmax_array_size = (DoublePrecision)max_array_size; ttotal_disk_space = (DoublePrecision)total_disk_space; mmax_memory = (DoublePrecision)max_memory; status = dra_init_(&mmax_arrays, &mmax_array_size, &ttotal_disk_space, &mmax_memory); return (int)status; } int DRA_Terminate() { Integer status; status = dra_terminate_(); return (int)status; } int DRA_Open(char* filename, int mode, int *d_a) { Integer mmode, dd_a, status; mmode = (Integer)mode; status = drai_open(filename, &mmode, &dd_a); *d_a = (int)dd_a; return (int)status; } int DRA_Probe(int request, int *compl_status) { Integer rrequest, ccompl_status, status; rrequest = (Integer)request; status = dra_probe_(&rrequest, &ccompl_status); *compl_status = (int)ccompl_status; return (int)status; } void DRA_Set_debug(logical flag) { dra_set_debug_(&flag); return; } void DRA_Print_internals(int d_a) { Integer dd_a; dd_a = (Integer)d_a; dra_print_internals_(&dd_a); return; } void DRA_Set_default_config(int numfiles, int numioprocs) { Integer nfiles, nprocs; nfiles = (Integer)numfiles; nprocs = (Integer)numioprocs; dra_set_default_config_(&nfiles, &nprocs); return; } int DRA_Wait(int request) { Integer rrequest, status; rrequest = (Integer)request; status = dra_wait_(&rrequest); return (int)status; } int DRA_Delete(int d_a) { Integer dd_a, status; dd_a = (Integer)d_a; status = dra_delete_(&dd_a); return (int)status; } int DRA_Close(int d_a) { Integer dd_a, status; dd_a = (Integer)d_a; status = dra_close_(&dd_a); return (int)status; } void DRA_Flick() { dra_flick_(); } ga-5-4/pario/dra/env.c0000644000175000017500000000112612662210477012653 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * $Id: env.c,v 1.1 1997-12-07 11:14:18 d3e129 Exp $ */ #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #define MAX_NUM_SERV 64 /** * get number of I/O servers from optional environmental variable DRA_NUM_SERV */ int drai_get_num_serv() { int val=-1; char *str; str = getenv("DRA_NUM_SERV"); if(str==NULL)val = 0; else{ val = atoi(str); if(val<1 || val >MAX_NUM_SERV)val =0; } return val; } ga-5-4/pario/dra/disk.param.c0000644000175000017500000001526112662210477014121 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * store and retrieve metadata/parameters for disk resident array * -- at present time, we use separate file for metadata */ #if HAVE_STDIO_H # include #endif #if HAVE_UNISTD_H # include #endif #include "drap.h" #include "ga-papi.h" #define MAX_HD_NAME_LEN 512 #define HD_NAME_EXT_LEN 10 #define HDLEN 80 #define HD_EXT ".info" /** * check file configuration: shared or independent files are used * we'll verify if every process can access DRA metafile * if yes, then we have shared file, otherwise independent files */ int dai_file_config(char* filename) { char param_filename[MAX_HD_NAME_LEN]; Integer len; char sum='+'; Integer me=pnga_nodeid(); Integer nproc = pnga_nnodes(); Integer status; stat_t info; if(nproc==1) return 0; /* build param file name */ len = strlen(filename); if(len+HD_NAME_EXT_LEN >= MAX_HD_NAME_LEN) dai_error("dai_file_config: filename too long:",len); strcpy(param_filename,filename); strcat(param_filename,HD_EXT); /* printf("checking file: %s\n",param_filename);fflush(stdout);*/ status = (Integer) elio_stat(param_filename, &info); /* processor 0 created the file => it must be able to stat it */ if(me==0 && status!= ELIO_OK) dai_error("dai_file_config: no access from 0",status); status = (status==ELIO_OK) ? 1 : 0; /* normalize status */ /* combine status accross all processors */ pnga_gop(pnga_type_f2c(MT_F_INT), &status, 1, &sum); /* 1 - only 0 can access the file => independent files * nproc - all can access it => shared file * otherwise - same processors can access it => something is wrong!!! */ if(status == 1) return(1); else if(status == nproc) return 0; #ifdef NO_SMP_NODES else dai_error("dai_file_config: confusing file configuration",status); #endif return 1; } /** * Retrive metadata for a disk array from the disk */ int dai_read_param(char* filename,Integer d_a) { FILE *fd; char param_filename[MAX_HD_NAME_LEN]; Integer len, i, ndim; Integer me=pnga_nodeid(); Integer brd_type=DRA_BRD_TYPE, orig, dra_hndl=d_a+DRA_OFFSET; long input; int rc=0; char dummy[HDLEN]; pnga_sync(); if(!me){ /* only process 0 reads metafile */ /* build param file name */ len = strlen(filename); if(len+HD_NAME_EXT_LEN >= MAX_HD_NAME_LEN) dai_error("dai_read_param: filename too long:",len); strcpy(param_filename,filename); strcat(param_filename,HD_EXT); if((fd=fopen(param_filename,"r"))){ if(!fscanf(fd,"%ld", &input)) dai_error("dai_read_param:ndim",0); DRA[dra_hndl].ndim = (Integer) input; ndim = (Integer) input; for (i=0; i= MAX_HD_NAME_LEN) dai_error("dai_write_param: filename too long:",len); strcpy(param_filename,filename); strcat(param_filename,HD_EXT); if(! (fd = fopen(param_filename,"w")) ) { char message[MAX_HD_NAME_LEN*2]; strcpy(message,"dai_write_param:open failed :: "); strcpy(message,param_filename); dai_error(message,0); } if(!fprintf(fd,"%ld ",(long)DRA[dra_hndl].ndim)) dai_error("dai_write_param:ndim",0); for (i=0; i= MAX_HD_NAME_LEN) dai_error("dai_read_param: filename too long:",len); strcpy(param_filename,filename); strcat(param_filename,HD_EXT); if(unlink(param_filename)) dai_error("dai_delete_param failed",d_a); } } ga-5-4/pario/dra/rate.c0000644000175000017500000002242512662210477013023 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #define FNAME "/scratch/da.try" #define FNAME_ALT "/tmp/da.try" #include "dra.h" #include "eaf.h" #include "ga.h" #include "macdecls.h" #include "mp3.h" #ifndef MAXDIM # define MAXDIM GA_MAX_DIM #endif #ifndef TRUE # define TRUE (Logical)1 #endif #ifndef FALSE # define FALSE (Logical)0 #endif /* If USER_CONFIG set to: * 0: Use default configuration * 1: Number of files is 1, number of I/O procs equals * the number of nodes * 2: Number of files and number of I/O procs equals * the number of nodes * 3: Number of files and number of I/O procs equals 1 * These configurations only apply if files are not located * on local scratch disk. For local scratch, system defaults * to 1 I/O proc per node and 1 file per node. Note that * USER_CONFIG=1 will only work if system has parallel I/O. * * Memory and Disk Usage: * The aggregate memory required to run this test is approximately * 2*SIZE**NDIM*sizeof(double) bytes. The amount of disk space * required is approximately NFACTOR**NDIM times this amount. */ #define USER_CONFIG 0 #define NDIM 3 #define SIZE 250 #define NFACTOR 7 /* #define NDIM 2 #define SIZE 4000 #define NFACTOR 3 #define NDIM 1 #define SIZE 12500000 #define NFACTOR 640 */ /*#define MAXDIM 7*/ /*#define TRUE (logical)1*/ /*#define FALSE (logical)0*/ #define MULTFILES 0 #ifdef SOLARIS # if MULTFILES # define USEMULTFILES 1 # endif #else # define USEMULTFILES 0 #endif #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 float ran0(long *idum) { long k; float ans; *idum ^= MASK; k=(*idum)/IQ; *idum = IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } void fill_random(double *a, int isize) { long *idum; long i, j; j = 38282; idum = &j; a[0] = (double)ran0(idum); for (i=0; i<(long)isize; i++) { a[i] = (double)(10000.0*ran0(idum)); } } void test_io_dbl() { int n, ndim = NDIM; double err, tt0, tt1, mbytes; int g_a, g_b, d_a; int i, itmp, j, req, loop; int glo[MAXDIM],ghi[MAXDIM]; dra_size_t dlo[MAXDIM],dhi[MAXDIM]; dra_size_t ddims[MAXDIM],reqdims[MAXDIM]; dra_size_t m; int index[MAXDIM], dims[MAXDIM]; int me, nproc, isize; double *ptr; double plus, minus; int ld[MAXDIM], chunk[MAXDIM]; char filename[80]; FILE *fd; n = SIZE; m = ((dra_size_t)NFACTOR)*((dra_size_t)SIZE); loop = 1; for (i=0; i #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRINGS_H # include #endif #include "buffers.h" /*#define STATBUF 1 */ /* set if static buffers will be used */ /*#define DEBUG 1 */ #define MAX_CTXT 5 int ctxt_count = 0; /** buffer management initialization routine */ void buffer_init( buf_context_t *ctxt, int nbuf, int buf_size, void (*fptr)(char*)) { int i; long diff; if (nbuf < 1 || nbuf > MAXBUF) { printf("Too many (or too few) buffers requested, using default number (%d) of buffers", DEFBUF); nbuf = DEFBUF; } /* create a context */ ctxt->ctxt_id = ctxt_count++; if (ctxt->ctxt_id > MAX_CTXT) { printf("Max number of contexts reached!\n"); return; } ctxt->nbuf = nbuf; ctxt->size = buf_size; ctxt->buf = (_buffer_t *)malloc(sizeof(_buffer_t) * nbuf); ctxt->fptr = fptr; #ifdef STATBUF double buffers[MAXBUF][DBL_BUF_SIZE]; for (i = 0; i < nbuf; i++) { ctxt->buf[i].buffer = (char *) buffers[i]; bzero(buffers[i], sizeof(buffers[i])); } #else /* STATBUF */ /* get buffer memory */ for (i = 0; i < nbuf; i++) { ctxt->buf[i].buffer = (char*) malloc((buf_size + ALIGN-1) *sizeof(double)); if (ctxt->buf[i].buffer == NULL) { printf("Could not allocate memory for buffers!\n"); return; } bzero(ctxt->buf[i].buffer, sizeof(ctxt->buf[i].buffer)); /* align buffer address */ diff = ((long)(ctxt->buf[i].buffer)) % (sizeof(double)*ALIGN); if(diff) { ctxt->buf[i].align_off = (int) (sizeof(double)*ALIGN - diff); } else { ctxt->buf[i].align_off = (int) 0; } ctxt->buf[i].buffer += ctxt->buf[i].align_off; } #endif /* STATBUF */ for (i = 0; i < nbuf; i++) { ctxt->buf[i].active = 0; ctxt->buf[i].group_id = 0; } #ifdef DEBUG printf("Created a context\n\n"); #endif } /** internal function to return empty buffer handle */ int get_buf_hdl(buf_context_t *ctxt) { int i; for (i = 0; i < ctxt->nbuf; i++) { if (ctxt->buf[i].active == 0) { ctxt->buf[i].active = 1; return i; } } return -1; } char* get_buf(buf_context_t *ctxt, int call_id) { int hdl; char *buf; hdl = get_buf_hdl(ctxt); if (hdl == -1) { int cur_buf; /* no buffer is available, wait for the oldest buffer to become free */ cur_buf = (ctxt->last_buf + 1) % ctxt->nbuf; /* free this buffer by calling the callback function provided by the application */ ctxt->fptr(ctxt->buf[cur_buf].buffer); hdl = cur_buf; } buf = ctxt->buf[hdl].buffer; ctxt->buf[hdl].buf_hdl = hdl; ctxt->buf[hdl].call_id = call_id; ctxt->buf[hdl].active = 1; ctxt->last_buf = hdl; #ifdef DEBUG printf("Giving a buffer with internal handle: %d\n", hdl); #endif return (buf); } /** function to free a buffer */ void free_buf(buf_context_t *ctxt, char *buf) { int i; for (i = 0; i < ctxt->nbuf; i++) { if (ctxt->buf[i].buffer == buf) { ctxt->buf[i].active = 0; break; } } } /** function to complete an entire call */ void buf_complete_call(buf_context_t *ctxt, int call_id) { int i; #ifdef DEBUG printf("Completing call with call id: %d\n", call_id); #endif for (i = 0; i < ctxt->nbuf; i++) { if (ctxt->buf[i].call_id == call_id && ctxt->buf[i].active == 1) { /* force completion by calling user function */ ctxt->fptr(ctxt->buf[i].buffer); ctxt->buf[i].active = 0; } } } /** function to return the call_id associated with a particular buffer */ int buf_get_call_id(buf_context_t *ctxt, char *buf) { int i; for (i = 0; i < ctxt->nbuf; i++) if (ctxt->buf[i].buffer == buf) return(ctxt->buf[i].call_id); printf("Buf_man error: Cannot find call_id for this buffer\n"); return -1; } /** * Function to return an array of buffers associated with a call_id * the last two parameters are output */ int get_bufs_of_call_id( buf_context_t *ctxt, int call_id, int *n_buf, char *bufs[]) { int i, count = 0; for (i = 0; i < ctxt->nbuf; i++) if (ctxt->buf[i].call_id == call_id) { bufs[count++] = ctxt->buf[i].buffer; } *n_buf = count; if (*n_buf == 0) { #ifdef DEBUG printf("Buf_man: No active buffer found for call_id %d\n", call_id); #endif return -1; /* no buffer found */ } return 0; /* success */ } /** terminates an application context */ void buf_terminate(buf_context_t *ctxt) { #ifndef STATBUF int i; for (i = 0; i < ctxt->nbuf; i++) { ctxt->buf[i].buffer -= ctxt->buf[i].align_off; free(ctxt->buf[i].buffer); } #endif free(ctxt->buf); ctxt_count--; /* this context can be reallocated */ } ga-5-4/pario/dra/bign.c0000644000175000017500000002067712662210477013016 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_MATH_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #include "dra.h" #include "ga.h" #include "macdecls.h" #include "mp3.h" #define FNAME "/scratch/da.try" #define FNAME_ALT "/tmp/da.try" #define NDIM 3 #define SIZE 300 #define NFAC 3 /* #define NDIM 3 #define SIZE 1800 #define NDIM 2 #define SIZE 4000 #define NDIM 1 #define SIZE 16000000 */ #ifndef MAXDIM # define MAXDIM GA_MAX_DIM #endif #ifndef TRUE # define TRUE (Logical)1 #endif #ifndef FALSE # define FALSE (Logical)0 #endif #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define MASK 123459876 float ran0(long *idum) { long k; float ans; *idum ^= MASK; k=(*idum)/IQ; *idum = IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; ans=AM*(*idum); *idum ^= MASK; return ans; } void fill_random(double *a, int isize) { long *idum; long i, j; j = 38282; idum = &j; a[0] = (double)ran0(idum); for (i=0; i<(long)isize; i++) { a[i] = (double)(10000.0*ran0(idum)); } } void array_int_to_dra_size_t(int *in, dra_size_t *out, size_t size) { size_t i; for (i=0; i= nfac || icoord[j] < 0) printf("Invalid icoord[%d]: %d\n",j,icoord[j]); for (j=1; j= nfac || icoord[j] < 0) printf("Invalid icoord[%d]: %d\n",j,icoord[j]); } for (j=0; j= nfac || icoord[j] < 0) printf("Invalid icoord[%d]: %d\n",j,icoord[j]); for (j=1; j= nfac || icoord[j] < 0) printf("Invalid icoord[%d]: %d\n",j,icoord[j]); } for (j=0; j #include "macommon.h" #include "global.h" #include "dra.h" #include "drap.h" #define LEN 10 int main(int argc, char **argv) { int from, to, type; Integer idata[LEN]; #if 0 int fd; #endif Integer i, ii, imax, offset, status; DoublePrecision ddata[LEN]; if(argc < 2){ printf("program prints data from a binary file to screen\n"); printf("usage: dbg_read.x \n"); printf("type: 1 - integer 2 - double \n -range of elements (0, ...)\n"); return(1); } type = atoi(argv[2]); from = atoi(argv[3]); to = atoi(argv[4]); if(from < 0 || to < from) {printf("range error\n"); return 1;} #if 0 if(!(fd = dra_el_open(argv[1],DRA_R))){printf("not found\n"); return 1;} #else /* TODO This must be an old test program using an old API... * consider removing this program. */ return 1; #endif switch (type){ case 1: for(i=from; i<= to; i+= LEN){ imax = PARIO_MIN(i+LEN-1,to); offset = sizeof(Integer)*i; #if 0 status=dra_el_read(idata, sizeof(Integer), imax -i+1, fd, offset); #else status = 1; #endif if(!status)printf("error read failed\n"); for(ii=0;ii= (b)) ? (a) : (b)) #define PARIO_MIN(a,b) (((a) <= (b)) ? (a) : (b)) /** * check if two patches are conforming (dimensions are divisible) */ logical dai_patches_conforming( Integer* ailo, Integer* aihi, Integer* ajlo, Integer* ajhi, Integer* bilo, Integer* bihi, Integer* bjlo, Integer* bjhi) { Integer mismatch; Integer adim1, bdim1, adim2, bdim2; adim1 = *aihi - *ailo +1; adim2 = *ajhi - *ajlo +1; bdim1 = *bihi - *bilo +1; bdim2 = *bjhi - *bjlo +1; mismatch = (adim1ndim) isconsistent = FALSE; /* check consistency of patch coordinates */ if (isconsistent) { for (i=0; ihi[i] < sadj->lo[i]) isconsistent = FALSE; } } /* check to see if there is an intersection */ if (isconsistent) { for (i=0; ilo[i]) isconsistent = FALSE; if (sadj->hi[i] < sref.lo[i]) isconsistent = FALSE; } } /* if there is an intersection then return it in sadj */ if (isconsistent) { for (i=0; ilo[i] = PARIO_MAX(sref.lo[i],sadj->lo[i]); sadj->hi[i] = PARIO_MIN(sref.hi[i],sadj->hi[i]); } } return (isconsistent); } ga-5-4/pario/dra/dbg_write.c0000644000175000017500000000361612662210477014037 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "macommon.h" #include "global.h" #include "dra.h" #include "drap.h" #define LEN 10 int main(int argc, char **argv) { int from, to, type; Integer idata[LEN]; #if 0 int fd; #endif Integer i, ii, imax, offset, status; DoublePrecision ddata[LEN]; if(argc < 2){ printf("program writes test data to a binary file\n"); printf("usage: dbg_write.x \n"); printf("type: 1 - integer 2 - double \n -range of elements (0, ...)\n"); return(1); } type = atoi(argv[2]); from = atoi(argv[3]); to = atoi(argv[4]); if(from < 0 || to < from) {printf("range error\n"); return 1;} #if 0 if(!(fd = dra_el_open(argv[1],DRA_W))){printf("not found\n"); return 1;} #else /* TODO This must be an old test program using an old API... * consider removing this program. */ return 1; #endif switch (type){ case 1: for(i=from; i<= to; i+= LEN){ imax = PARIO_MIN(i+LEN-1,to); offset = sizeof(Integer)*i; for(ii=0;ii 3.68) to build this software. To build test program, from the top-level type: make pario/dra/test.x Documentation is located in disk_arrays.doc and implementation notes in Notes.doc. Bug report, comments, questions: hpctools@pnl.gov ga-5-4/pario/dra/DRA.doc0000644000175000017500000002725012662210477013022 0ustar mbamba DISK RESIDENT ARRAYS PRELIMINARY DOCUMENTATION Jarek Nieplocha, 05.10.95 Disk Resident Arrays extend Global Arrays NUMA programming model with disk I/O operations. Either whole or sections of global arrays can be transferred between GA memory and the disk. At present time, all operations are declared to be collective. This simplifies implementation on machines where only some processors are connected to I/O devices. Except where stated otherwise, all operations are synchronous (blocking) which means that control is returned to the calling process only after the requested operation completes. All operations return error code. Return values: 0 - OK >0 - failure A program that uses Disk Resident Arrays should look like: program foo #include "mafdecls.h" #include "global.fh" #include "dra.fh" c call pbeginf() ! initialize TCGMSG if(.not. ma_init(...)) ERROR ! initialize MA call ga_initialize() ! initialize Global Arrays if(dra_init(....).ne.0) ERROR ! initialize Disk Arrays c do work if(dra_terminate().ne.0)ERROR ! destroy DRA internal data structures call ga_terminate ! terminate Global Arrays call pend() ! terminate TCGMSG end List of DRA operations: status = dra_init(max_arrays, max_array_size, total_disk_space, max_memory) integer max_arrays [input] double precision max_array_size [input] double precision total_disk_space [input] double precision max_memory [input] discussion: Initializes disk resident array I/O subsystem. "max_array_size", "total_disk_space" and "max_memory" are given in bytes. "max_memory" specifies how much local memory per processor the application is willing to provide to the DRA I/O subsystem for buffering. The value of "-1" for any of input arguments means: "don't care", "don't know", or "use defaults" status = dra_terminate() discussion: Close all open disk resident arrays and shut down DRA I/O subsystem. status = dra_create(type, dim1, dim2, name, filename, mode,rdim1,rdim2,d_a) integer type [input] ! MA type identifier integer dim1 [input] integer dim2 [input] character*(*) name [input] character*(*) filename [input] integer mode [input] integer rdim1 [input] integer rdim2 [input] integer d_a [output] ! DRA handle discussion: Creates new disk resident array with specified dimensions and "type". String "filename" specifies name of an abstract meta-file that will store the data on the disk. The meta-file might be implemented as multiple disk files that will contain parts of the disk resident array. The component files will have names derived from the string "filename" according to some established scheme(s). Only one DRA object can be stored in DRA meta-file identified by "filename". DRA objects persist on the disk after calling dra_close(). dra_delete() should be used instead of dra_close() to delete disk array and associated meta-file on the disk. A set of UNIX commands that understand "filename" identifier will be provided to copy, rename, move, change access attributes, and delete DRA meta-files. String "name" can be used for more informative (longer)names. Disk array is implicitly initialized to "0". Access permissions (read, write, read&write) are set in "mode". These are set using defined in DRA.fh (Fortran) and DRA.h (C) preprocessor constants: DRA_R, DRA_W, DRA_RW. The pair [rdim1, rdim2] specifies dimensions of a "typical" request. The value of "-1" for either of them means "unspecified". The layout of the data on the disk(s) is determined based on the values of these arguments. Performance of the DRA operations will depend on the dimensions (section shape) of the requests. If data layout is optimized for "column-like" sections, performance of DRA operations for "row-like" sections might be seriously degraded. This is analogous to the effect of wrong loop order yielding frequent cache misses on RISC processors in the example below. double precision a(1000, 1000) do i = 1, 1000 do j = 1, 1000 a(i,j) = dfloat(i+j) enddo enddo instead of do j = 1, 1000 do i = 1, 1000 a(i,j) = dfloat(i+j) enddo enddo status = dra_open(filename, mode, d_a) character*(*) filename [input] integer mode [input] integer d_a [output] ! DRA handle discussion: Open and assign DRA handle to disk resident array stored in DRA meta-file "filename". Disk arrays that are created with 'dra_create' and saved by calling 'dra_close' can be later opened and accessed by the same or different application. Attributes of disk resident array can be found by calling 'dra_inquire'. status = dra_write(g_a, d_a, request) integer g_a [input] ! GA handle integer d_a [input] ! DRA handle integer request [output] ! request id discussion: Write asynchronously specified global array to specified disk resident array. Dimensions and type of g_a and d_a must match. If dimensions don't match, 'dra_write_section' should be used instead. The operation is by definition asynchronous but it might be implemented as synchronous i.e., it would return only when I/O is done. "request" can be used to 'dra_probe' or 'dra_wait' for completion. status = dra_write_section(transp, g_a, gilo, gihi, gjlo, gjhi, d_a, dilo, dihi, djlo, djhi, request) logical transp [input] ! transpose operator integer g_a [input] ! GA handle integer d_a [input] ! DRA handle integer gilo [input] integer gihi [input] integer gjlo [input] integer gjhi [input] integer dilo [input] integer dihi [input] integer djlo [input] integer djhi [input] integer request [output] ! request id discussion: Write asynchronously specified global array section to specified disk resident array section: OP(g_a[ gilo:gihi, gjlo:gjhi]) --> d_a[ dilo:dihi, djlo:djhi] where OP is the transpose operator (.true./.false.). Return error if the two section's types or sizes mismatch. See 'dra_write' specs for discussion of "request". Note: Section reshaping and transpose operation not implemented yet. status = dra_read(g_a, d_a, request) integer g_a [input] ! GA handle integer d_a [input] ! DRA handle integer request [output] ! request id discussion: Read asynchronously specified global array from specified disk resident array. Dimensions and type of g_a and d_a must match. If dimensions don't match, 'dra_read_section' could be used instead. See 'dra_write' specs for discussion of "request". status = dra_read_section(transp, g_a, gilo, gihi, gjlo, gjhi, d_a, dilo, dihi, djlo, djhi, request) logical transp [input] ! transpose operator integer g_a [input] ! GA handle integer d_a [input] ! DRA handle integer gilo [input] integer gihi [input] integer gjlo [input] integer gjhi [input] integer dilo [input] integer dihi [input] integer djlo [input] integer djhi [input] integer request [output] ! request id discussion: Read asynchronously specified global array section from specified disk resident array section: OP(d_a[ dilo:dihi, djlo:djhi]) --> g_a[ gilo:gihi, gjlo:gjhi] where OP is the transpose operator (.true./.false.). See 'dra_write' specs for discussion of "request". Note: Section reshaping and transpose operation not implemented yet. status = dra_probe(request, compl_status) integer request [input] ! request id integer compl_status [output] ! completion status discussion: Tests for completion of 'dra_write/read' or 'dra_write/read_section' operation which set the value passed in "request" argument. compl_status = 0 the operation has been completed compl_status <> 0 not done yet status = dra_wait(request) integer request [input] ! request id discussion: Blocks until completion of 'dra_write/read' or 'dra_write/read_section' operation which set the value passed in "request" argument. status = dra_inquire(d_a, type, dim1, dim2, name, filename) integer d_a [input] ! DRA handle integer type [output] integer dim1 [output] integer dim2 [output] character*(*) name [output] character*(*) filename [output] discussion: Return dimensions, "type", "name" of disk resident array, and "filename" of DRA meta-file associated with "d_a" handle. status = dra_delete(d_a) integer d_a [input] ! DRA handle discussion: Delete a disk resident array associated with "d_a" handle. Invalidate handle. The corresponding DRA meta-file is destroyed. status = dra_close(d_a) integer d_a [input] ! DRA handle discussion: Close DRA meta-file associated with "d_a" handle and deallocate data structures corresponding to this disk array. Invalidate "d_a" handle. The array on the disk is persistent. subroutine dra_flick() discussion: Returns control to DRA for a VERY short time to improve progress of pending asynchronous operations. ga-5-4/pario/dra/util.c0000644000175000017500000000115512662210477013042 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include "ga.h" #include "typesf2c.h" /* Return the no. of bytes that n doubles occupy */ #define util_mdtob_ F77_FUNC_(util_mdtob,UTIL_MDTOB) Integer FATR util_mdtob_(Integer *n) { if (*n < 0) GA_Error("util_MDTOB_: negative argument",*n); return (Integer) (*n * sizeof(double)); } /* Return the no. of bytes that n ints=Integers occupy */ #define util_mitob_ F77_FUNC_(util_mitob,UTIL_MITOB) Integer FATR util_mitob_(Integer *n) { if (*n < 0) GA_Error("util_MITOB_: negative argument",*n); return (Integer) (*n * sizeof(Integer)); } ga-5-4/pario/dra/dra2arviz.c0000644000175000017500000000574112662210477013776 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "dra.h" #include "ga.h" #include "macommon.h" #include "macdecls.h" #include "mp3.h" #define ERROR(msg,code){printf("ERROR:%s\n",(msg)); fflush(stdout); exit(1);} #define BUFSIZE 8000000 int main(int argc, char **argv) { int heap=400000, stack=400000; int me, nproc; int max_arrays=2; double max_sz=1e8, max_disk=2e8, max_mem=1e6; int d_a, mode=DRA_R; int g_a,rows,cols; char name[1024], fname[1024]; logical transp=0; int reqid; int i,ilo,ihi,jlo,jhi,type,ndim,glo[2],ghi[2],gld[1],gdims[2]; dra_size_t dlo[2],dhi[2],ddims[2]; size_t size, nitems; void *ptr; if(argc!=6){ printf("Usage: dra2arviz \n"); printf(" dra_filename is the meta-file name for disk resident array\n"); printf(" [ilo:ihi, jlo:jhi] array section to read\n\n\n"); return(1); } MP_INIT(argc,argv); MP_MYID(&me); MP_PROCS(&nproc); heap /= nproc; stack /= nproc; if(! MA_init((Integer)MT_F_DBL, stack, heap)) GA_Error("MA_init failed",stack+heap); /* initialize memory allocator*/ GA_Initialize(); /* initialize GA */ if(nproc != 1)ERROR("Error: does not run in parallel",nproc); if(DRA_Init(max_arrays, max_sz, max_disk, max_mem)) ERROR("initialization failed",0); if(DRA_Open(argv[1], mode, &d_a)) ERROR("dra_open failed",0); ilo = atoi(argv[2]); ihi = atoi(argv[3]); jlo = atoi(argv[4]); jhi = atoi(argv[5]); dlo[0] = ilo; dlo[1] = jlo; dhi[0] = ihi; dhi[1] = jhi; rows = ihi - ilo +1; cols = jhi - jlo +1; glo[0] = 0; glo[1] = 0; ghi[0] = rows-1; ghi[1] = cols-1; gdims[0] = rows; gdims[1] = cols; if(NDRA_Inquire(d_a, &type, &ndim, ddims, name, fname)) ERROR("dra_inquire failed",0); switch (type) { case MT_F_INT: size = sizeof(Integer); break; case MT_F_DBL: size = sizeof(DoublePrecision); break; case MT_F_DCPL: size = sizeof(DoubleComplex); break; default: ERROR("type not supported",type); } g_a = NGA_Create(type, 2, gdims, "temp", NULL); if(NDRA_Read_section(transp, g_a, glo, ghi, d_a, dlo, dhi, &reqid)) ERROR("dra_read_section failed",0); if(DRA_Wait(reqid)) ERROR("dra_wait failed",0); NGA_Access(g_a, glo, ghi, &ptr, gld); if(gld[0] != rows) ERROR("ld != rows",gld[0]); fwrite("OK\n",1,3,stdout); nitems = (size_t)rows; /* write data by columns */ for(i=0; i #include #define ELIO_UFS 0 /* Unix filesystem type */ #define ELIO_PFS 1 /* PFS Intel parallel filesystem type */ #define ELIO_PIOFS 2 /* IBM SP parallel filesystem type */ #define ELIO_PENDING_ERR -44 /* error code for failing elio_(g)open */ #define ELIO_SHARED 77 #define ELIO_PRIVATE 88 /*********************** type definitions for ELIO interface *****************/ typedef long Size_t; /* size of I/O request type */ typedef double Off_t; /* size of offset type - double = 56 bit integer*/ typedef struct { int fd; /* OS handle */ int fs; /* ??? */ int mode; /* ??? */ int type; /* ??? */ char *name; /* Name of physical file */ int extent; /* Counts extents of logical files */ struct fd_struct *next; /* Next extent */ } fd_struct; /* file descriptor type definition */ typedef fd_struct* Fd_t; #if defined(IBM) || defined(SOLARIS) || defined(HPUX) typedef unsigned long long avail_t; #else typedef unsigned long avail_t; #endif typedef struct{ int fs; avail_t avail; } stat_t; typedef long io_request_t; /* asynchronous I/O request type */ /********************** prototypes for elio functions ***********************/ extern Size_t elio_read(Fd_t fd, Off_t offset, void *buf, Size_t bytes); extern int elio_aread(Fd_t fd, Off_t offset, void *buf, Size_t bytes, io_request_t *req_id); extern Size_t elio_write(Fd_t fd, Off_t offset, const void *buf, Size_t bytes); extern int elio_awrite(Fd_t fd, Off_t offset, const void *buf, Size_t bytes, io_request_t *req_id); extern int elio_wait(io_request_t *id); extern int elio_probe(io_request_t *id, int* status); extern int elio_delete(const char *filename); extern Fd_t elio_open(const char *fname, int type, int mode); extern int elio_close(Fd_t fd); extern int elio_stat(char *fname, stat_t *statinfo); extern int elio_dirname(const char *fname, char *statinfo, int len); extern int elio_truncate(Fd_t fd, Off_t length); extern int elio_length(Fd_t fd, Off_t *length); extern void elio_errmsg(int code, char *msg); extern int elio_fsync(Fd_t fd); ga-5-4/pario/elio/stat.c0000644000175000017500000001021312662210477013215 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Id: stat.c,v 1.20.10.3 2007-08-30 18:19:44 manoj Exp $ */ #include "eliop.h" #include "chemio.h" #if defined(CRAY) && defined(__crayx1) #undef CRAY #endif #define DEBUG_ 0 /** * determines directory path for a given file */ int elio_dirname(const char *fname, char *dirname, int len) { size_t flen = strlen(fname); if(len<=((int)flen)) ELIO_ERROR(LONGFAIL,flen); #ifdef WIN32 while(fname[flen] != '/' && fname[flen] != '\\' && flen >0 ) flen--; #else while(fname[flen] != '/' && flen >0 ) flen--; #endif if(flen==0)strcpy(dirname,"."); else {strncpy(dirname, fname, flen); dirname[flen]=(char)0;} return(ELIO_OK); } #ifdef WIN32 #include #include /** * determine drive name given the file path name */ char* elio_drivename(const char* fname) { static char path[_MAX_PATH]; static char drive[_MAX_DRIVE]; if( _fullpath(path,fname,_MAX_PATH) == NULL) return NULL; _splitpath(path, drive, NULL, NULL, NULL); return(drive); } void get_avail_space(int dev, avail_t *avail, int* bsize) { static char drive[4]="A:\\"; int sectors, cfree, ctotal; drive[0]= dev + 'A'; GetDiskFreeSpace(drive, §ors, bsize, &cfree, &ctotal); *avail = sectors*(avail_t)cfree; } #endif /* WIN32 */ /** * Stat a file (or path) to determine it's filesystem info */ int elio_stat(char *fname, stat_t *statinfo) { struct stat ufs_stat; int bsize; struct STATVFS ufs_statfs; PABLO_start(PABLO_elio_stat); if(stat(fname, &ufs_stat) != 0) ELIO_ERROR(STATFAIL, 1); # if defined(PIOFS) /* fprintf(stderr,"filesystem %d\n",ufs_stat.st_vfstype);*/ /* according to /etc/vfs, "9" means piofs */ if(ufs_stat.st_vfstype == 9) statinfo->fs = ELIO_PIOFS; else # endif statinfo->fs = ELIO_UFS; /* only regular or directory files are OK */ if(!S_ISREG(ufs_stat.st_mode) && !S_ISDIR(ufs_stat.st_mode)) ELIO_ERROR(TYPEFAIL, 1); # if defined(CRAY) || defined(NEC) if(statfs(fname, &ufs_statfs, sizeof(ufs_statfs), 0) != 0) # elif defined (CATAMOUNT) statinfo->avail =2*1024*1024*128; return(ELIO_OK); # else if(STATVFS(fname, &ufs_statfs) != 0) # endif ELIO_ERROR(STATFAIL,1); # if defined(WIN32) get_avail_space(ufs_statfs.st_dev, &(statinfo->avail), &bsize); # else /* get number of available blocks */ # if defined(CRAY) || defined(NEC) /* f_bfree == f_bavail -- naming changes */ # ifdef CRAY if(ufs_statfs.f_secnfree != 0) /* check for secondary partition */ statinfo->avail = (avail_t) ufs_statfs.f_secnfree; else # endif statinfo->avail = (avail_t) ufs_statfs.f_bfree; # else statinfo->avail = (avail_t) ufs_statfs.f_bavail; # endif # ifdef NO_F_FRSIZE /* on some older systems it was f_bsize */ bsize = (int) ufs_statfs.f_bsize; # else /* get block size, fail if bszie is still 0 */ bsize = (int) ufs_statfs.f_frsize; if(bsize==0)bsize =(int) ufs_statfs.f_bsize; if(bsize==0) ELIO_ERROR(STATFAIL, 1); if(DEBUG_) printf("stat: f_frsize=%d f_bsize=%d bsize=%d free blocks=%ld\n", (int) ufs_statfs.f_frsize,(int) ufs_statfs.f_bsize, bsize, statinfo->avail ); # endif # endif /* translate number of available blocks into kilobytes */ switch (bsize) { case 512: statinfo->avail /=2; break; case 1024: break; case 2048: statinfo->avail *=2; break; case 4096: statinfo->avail *=4; break; case 8192: statinfo->avail *=8; break; case 16384: statinfo->avail *=16; break; case 32768: statinfo->avail *=32; break; default: { double avail; double factor = ((double)bsize)/1024.0; avail = factor * (double)statinfo->avail; statinfo->avail = (avail_t) avail; } } PABLO_end(PABLO_elio_stat); return(ELIO_OK); } ga-5-4/pario/elio/elio.c0000644000175000017500000006453412662210477013211 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file **********************************************************************\ ELementary I/O (ELIO) disk operations for parallel I/O libraries Authors: Jarek Nieplocha (PNNL) and Jace Mogill (ANL) * * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #ifdef USE_LUSTRE #include /* for O_LOV_DELAY_CREATE, LL_IOC_LOV_SETSTRIPE */ #include /* for struct lov_mds_md, LOV_MAGIC */ #include /* for ioctl */ #endif #include "eliop.h" #include "../sf/coms.h" #if defined(CRAY) && defined(__crayx1) #undef CRAY #endif #if defined(AIX) || defined(DECOSF) || defined(SGITFP) || defined(SGI64) || defined(SGI_N32) || defined(CRAY) || defined(LINUXAIO) /* systems with Asynchronous I/O */ #else # ifndef NOAIO # define NOAIO # endif #endif /****************** Internal Constants and Parameters **********************/ #define MAX_AIO_REQ 4 #define NULL_AIO -123456 #define FOPEN_MODE 0644 #define MAX_ATTEMPTS 10 #ifndef NOAIO # define AIO 1 #endif #ifdef FFIO # define WRITE ffwrite # define WRITEA ffwritea # define READ ffread # define READA ffreada # define CLOSE ffclose # define SEEK ffseek # define OPEN ffopens # define DEFARG FULL #else # define WRITE write # define WRITEA writea # define READ read # define READA reada # define CLOSE close # define SEEK lseek # define OPEN open # define DEFARG 0 #endif #ifdef WIN32 #define ELIO_FSYNC _commit #else #include #define ELIO_FSYNC fsync #endif /* structure to emulate control block in Posix AIO */ #if defined (CRAY) # if defined(FFIO) typedef struct { struct ffsw stat; int filedes; }io_status_t; # else # include typedef struct { struct iosw stat; int filedes; }io_status_t; # endif io_status_t cb_fout[MAX_AIO_REQ]; io_status_t *cb_fout_arr[MAX_AIO_REQ]; #elif defined(AIO) # include # if defined(AIX) # define INPROGRESS EINPROG # else # define INPROGRESS EINPROGRESS # endif struct aiocb cb_fout[MAX_AIO_REQ]; #ifndef AIX const #endif struct aiocb *cb_fout_arr[MAX_AIO_REQ]; #endif #ifndef INPROGRESS # define INPROGRESS 1 #endif static long aio_req[MAX_AIO_REQ]; /* array for AIO requests */ static int first_elio_init = 1; /* intialization status */ int _elio_Errors_Fatal=0; /* sets mode of handling errors */ /****************************** Internal Macros *****************************/ #if defined(AIO) # define AIO_LOOKUP(aio_i) {\ aio_i = 0;\ while(aio_req[aio_i] != NULL_AIO && aio_i < MAX_AIO_REQ) aio_i++;\ } #else # define AIO_LOOKUP(aio_i) aio_i = MAX_AIO_REQ #endif #define SYNC_EMULATE(op) *req_id = ELIO_DONE; \ if((stat= elio_ ## op (fd, offset, buf, bytes)) != bytes ){ \ ELIO_ERROR(stat,0); \ }else \ stat = 0; #ifndef MIN #define PARIO_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #endif /* * Offsets bigger than ABSURDLY_LARGE generate a SEEKFAIL. * The maximum no. of extents permitted for a file is MAX_EXTENT. */ #if defined(_LARGE_FILES) || defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE) || _FILE_OFFSET_BITS+0 == 64 || SIZEOF_VOIDP == 8 # define LARGE_FILES #endif #define MAX_EXTENT 127 #ifdef LARGE_FILES #define ABSURDLY_LARGE 1e14 #else #define ABSURDLY_LARGE (MAX_EXTENT*2147483648.0) #endif /*****************************************************************************/ static Off_t elio_max_file_size(Fd_t fd) /* * Return the maximum size permitted for this PHYSICAL file. * Presently not file dependent. */ { #ifdef LARGE_FILES return ABSURDLY_LARGE; #else return (2047.0*1024.0*1024.0); /* 2 GB - 1 MB */ #endif } static Fd_t elio_get_next_extent(Fd_t fd) /* * Return a pointer to the file descriptor that forms * the next extent of this file. If the extension file * does not exist then it is opened. If the open fails * then the usual error condition of elio_open is returned. */ { Fd_t next_fd = (Fd_t) fd->next; if (!next_fd) { /* Eventually need to replace this with user controllable naming * and combine with similar logic in delete routine. */ char fname[ELIO_FILENAME_MAX]; int len; if (fd->extent >= MAX_EXTENT) return 0; strcpy(fname, fd->name); len = strlen(fname); if (fd->extent) len -= 4; sprintf(fname+len,"x%3.3d",fd->extent+1); /*printf("Opening extent %d with name '%s'\n",fd->extent+1,fname);*/ if ((next_fd = elio_open(fname, fd->type, fd->mode))) { next_fd->extent = fd->extent + 1; fd->next = (struct fd_struct *) next_fd; } } return next_fd; } void elio_errors_fatal(int onoff) { _elio_Errors_Fatal = onoff; } /*\ Blocking Write * - returns number of bytes written or error code (<0) if failed \*/ Size_t elio_write(Fd_t fd, Off_t doffset, const void* buf, Size_t bytes) { off_t offset; Size_t stat, bytes_to_write = bytes; Size_t nextbytes; if (doffset >= ABSURDLY_LARGE) ELIO_ERROR(SEEKFAIL,0); /* Follow the linked list of extents down until we hit the file that contains the offset */ if (doffset >= elio_max_file_size(fd)) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); doffset -= elio_max_file_size(fd); return elio_write(next_fd, doffset, buf, bytes); } /* Figure out if the write continues onto the next extent */ offset = (off_t) doffset; nextbytes = 0; if ((doffset+bytes_to_write) >= elio_max_file_size(fd)) { nextbytes = bytes_to_write; bytes_to_write = (Size_t) (elio_max_file_size(fd)-doffset); nextbytes -= bytes_to_write; } /*printf("TRYING TO WRITE AT doffset=%f offset=%lu bw=%lu nb=%lu\n", doffset, offset, bytes_to_write, nextbytes);*/ /* Write to this extent */ #ifdef PABLO int pablo_code = PABLO_elio_write; PABLO_start( pablo_code ); #endif if(offset != SEEK(fd->fd,offset,SEEK_SET)) ELIO_ERROR(SEEKFAIL,0); while (bytes_to_write) { stat = WRITE(fd->fd, buf, bytes_to_write); if ((stat == -1) && ((errno == EINTR) || (errno == EAGAIN))) { ; /* interrupted write should be restarted */ } else if (stat > 0) { bytes_to_write -= stat; buf = stat + (char*)buf; /*advance pointer by # bytes written*/ } else { ELIO_ERROR(WRITFAIL, stat); } } /* Only get here if all has gone OK */ #ifdef PABLO PABLO_end(pablo_code); #endif /* Write to next extent(s) ... relies on incrementing of buf */ if (nextbytes) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); stat = elio_write(next_fd, (Off_t) 0, buf, nextbytes); if (stat != nextbytes) ELIO_ERROR(WRITFAIL, stat); } return bytes; } int elio_set_cb(Fd_t fd, Off_t doffset, int reqn, void *buf, Size_t bytes) { #if defined(AIO) off_t offset = (off_t) doffset; # if defined(CRAY) if(offset != SEEK(fd->fd, offset, SEEK_SET))return (SEEKFAIL); cb_fout_arr[reqn] = cb_fout+reqn; cb_fout[reqn].filedes = fd->fd; # else cb_fout[reqn].aio_offset = offset; cb_fout_arr[reqn] = cb_fout+reqn; cb_fout[reqn].aio_buf = buf; cb_fout[reqn].aio_nbytes = bytes; # if defined(AIX) cb_fout[reqn].aio_whence = SEEK_SET; # else cb_fout[reqn].aio_sigevent.sigev_notify = SIGEV_NONE; cb_fout[reqn].aio_fildes = fd->fd; # endif # endif #endif return ELIO_OK; } /*\ Asynchronous Write: returns 0 if succeded or err code if failed \*/ int elio_awrite(Fd_t fd, Off_t doffset, const void* buf, Size_t bytes, io_request_t * req_id) { off_t offset; Size_t stat; #ifdef AIO int aio_i; #endif if (doffset >= ABSURDLY_LARGE) ELIO_ERROR(SEEKFAIL,0); /* Follow the linked list of extents down until we hit the file that contains the offset */ if (doffset >= elio_max_file_size(fd)) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); doffset -= elio_max_file_size(fd); return elio_awrite(next_fd, doffset, buf, bytes, req_id); } /* Figure out if the write continues onto the next extent * ... if so then force the entire request to be done synchronously * so that we don't have to manage multiple async requests */ if ((doffset+((Off_t) bytes)) >= elio_max_file_size(fd)) { *req_id = ELIO_DONE; if (elio_write(fd, doffset, buf, bytes) != bytes) return -1; else return 0; } offset = (off_t) doffset; #ifdef PABLO int pablo_code = PABLO_elio_awrite; PABLO_start( pablo_code ); #endif *req_id = ELIO_DONE; #ifdef AIO AIO_LOOKUP(aio_i); /* blocking io when request table is full */ if(aio_i >= MAX_AIO_REQ){ # if defined(DEBUG) && defined(ASYNC) fprintf(stderr, "elio_awrite: Warning- asynch overflow\n"); # endif SYNC_EMULATE(write); } else { int rc; *req_id = (io_request_t) aio_i; if((rc=elio_set_cb(fd, offset, aio_i, (void*) buf, bytes))) ELIO_ERROR(rc,0); # if defined(CRAY) rc = WRITEA(fd->fd, (char*)buf, bytes, &cb_fout[aio_i].stat, DEFARG); stat = (rc < 0)? -1 : 0; # elif defined(AIX) # if !defined(AIX52) && !defined(_AIO_AIX_SOURCE) stat = aio_write(fd->fd, cb_fout + aio_i); # endif # else stat = aio_write(cb_fout+aio_i); # endif aio_req[aio_i] = *req_id; } #else /* call blocking write when AIO not available */ SYNC_EMULATE(write); #endif if(stat ==-1) ELIO_ERROR(AWRITFAIL, 0); #ifdef PABLO PABLO_end(pablo_code); #endif return((int)stat); } /*\ Truncate the file at the specified length. \*/ int elio_truncate(Fd_t fd, Off_t dlength) { off_t length = (off_t) dlength; #ifdef WIN32 # define ftruncate _chsize #endif #ifdef PABLO int pablo_code = PABLO_elio_truncate; PABLO_start( pablo_code ); #endif if(dlength >= elio_max_file_size(fd)){ Fd_t next_fd = elio_get_next_extent(fd); dlength -= elio_max_file_size(fd); # if defined(DEBUG) printf(stderr," calling ftruncate with length = %f \n", dlength); #endif return elio_truncate(next_fd, dlength); } (void) SEEK(fd->fd, 0L, SEEK_SET); if (ftruncate(fd->fd, length)) return TRUNFAIL; else { return ELIO_OK; } #ifdef PABLO PABLO_end(pablo_code); #endif } /*\ Return in length the length of the file \*/ int elio_length(Fd_t fd, Off_t *dlength) { off_t length; int status; /* Add up the lengths of any extents */ if (fd->next) { status = elio_length((Fd_t) fd->next, dlength); *dlength += elio_max_file_size(fd); return status; } else { #ifdef PABLO int pablo_code = PABLO_elio_length; PABLO_start( pablo_code ); #endif if ((length = SEEK(fd->fd, (off_t) 0, SEEK_END)) != -1) status = ELIO_OK; else status = SEEKFAIL; #ifdef PABLO PABLO_end(pablo_code); #endif *dlength = (Off_t) length; return status; } } /*\ Blocking Read * - returns number of bytes read or error code (<0) if failed \*/ Size_t elio_read(Fd_t fd, Off_t doffset, void* buf, Size_t bytes) { off_t offset; Size_t stat, bytes_to_read = bytes; Size_t nextbytes; int attempt=0; if (doffset >= ABSURDLY_LARGE) ELIO_ERROR(SEEKFAIL,0); /* Follow the linked list of extents down until we hit the file that contains the offset */ if (doffset >= elio_max_file_size(fd)) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); doffset -= elio_max_file_size(fd); return elio_read(next_fd, doffset, buf, bytes); } /* Figure out if the read continues onto the next extent */ offset = (off_t) doffset; nextbytes = 0; if ((doffset+bytes_to_read) >= elio_max_file_size(fd)) { nextbytes = bytes_to_read; bytes_to_read = (Size_t) (elio_max_file_size(fd)-doffset); nextbytes -= bytes_to_read; } /* Read from this physical file */ #ifdef PABLO int pablo_code = PABLO_elio_read; PABLO_start( pablo_code ); #endif if(offset != SEEK(fd->fd,offset,SEEK_SET)) ELIO_ERROR(SEEKFAIL,0); while (bytes_to_read) { stat = READ(fd->fd, buf, bytes_to_read); if(stat==0){ ELIO_ERROR(EOFFAIL, stat); } else if ((stat == -1) && ((errno == EINTR) || (errno == EAGAIN))) { ; /* interrupted read should be restarted */ } else if (stat > 0) { bytes_to_read -= stat; buf = stat + (char*)buf; /*advance pointer by # bytes read*/ } else { ELIO_ERROR(READFAIL, stat); } attempt++; } /* Only get here if all went OK */ #ifdef PABLO PABLO_end(pablo_code); #endif /* Read from next extent(s) ... relies on incrementing of buf */ if (nextbytes) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); stat = elio_read(next_fd, (Off_t) 0, buf, nextbytes); if (stat != nextbytes) ELIO_ERROR(READFAIL, stat); } return bytes; } /*\ Asynchronous Read: returns 0 if succeded or -1 if failed \*/ int elio_aread(Fd_t fd, Off_t doffset, void* buf, Size_t bytes, io_request_t * req_id) { off_t offset = (off_t) doffset; Size_t stat; #ifdef AIO int aio_i; #endif #ifdef CRAY int rc; #endif if (doffset >= ABSURDLY_LARGE) ELIO_ERROR(SEEKFAIL,0); /* Follow the linked list of extents down until we hit the file that contains the offset */ if (doffset >= elio_max_file_size(fd)) { Fd_t next_fd = elio_get_next_extent(fd); if (!next_fd) ELIO_ERROR(OPENFAIL,0); doffset -= elio_max_file_size(fd); return elio_aread(next_fd, doffset, buf, bytes, req_id); } /* Figure out if the read continues onto the next extent * ... if so then force the entire request to be done synchronously * so that we don't have to manage multiple async requests */ if ((doffset+((Off_t) bytes)) >= elio_max_file_size(fd)) { *req_id = ELIO_DONE; if (elio_read(fd, doffset, buf, bytes) != bytes) return -1; else return 0; } offset = (off_t) doffset; #ifdef PABLO int pablo_code = PABLO_elio_aread; PABLO_start( pablo_code ); #endif *req_id = ELIO_DONE; #ifdef AIO AIO_LOOKUP(aio_i); /* blocking io when request table is full */ if(aio_i >= MAX_AIO_REQ){ # if defined(DEBUG) fprintf(stderr, "elio_read: Warning- asynch overflow\n"); # endif SYNC_EMULATE(read); } else { *req_id = (io_request_t) aio_i; if((stat=elio_set_cb(fd, offset, aio_i, (void*) buf, bytes))) ELIO_ERROR((int)stat,0); # if defined(CRAY) rc = READA(fd->fd, buf, bytes, &cb_fout[aio_i].stat, DEFARG); stat = (rc < 0)? -1 : 0; # elif defined(AIX) #if !defined(AIX52) && !defined(_AIO_AIX_SOURCE) stat = aio_read(fd->fd, cb_fout+aio_i); #endif # else stat = aio_read(cb_fout+aio_i); # endif aio_req[aio_i] = *req_id; } #else /* call blocking write when AIO not available */ SYNC_EMULATE(read); #endif if(stat ==-1) ELIO_ERROR(AWRITFAIL, 0); #ifdef PABLO PABLO_end(pablo_code); #endif return((int)stat); } /*\ Wait for asynchronous I/O operation to complete. Invalidate id. \*/ int elio_wait(io_request_t *req_id) { int aio_i=0; int rc; rc=0; /* just to remove the compiler warning */ #ifdef PABLO int pablo_code = PABLO_elio_wait; PABLO_start( pablo_code ); #endif if(*req_id != ELIO_DONE ) { # ifdef AIO # if defined(CRAY) # if defined(FFIO) { struct ffsw dumstat, *prdstat=&(cb_fout[*req_id].stat); fffcntl(cb_fout[*req_id].filedes, FC_RECALL, prdstat, &dumstat); if (FFSTAT(*prdstat) == FFERR) ELIO_ERROR(SUSPFAIL,0); } # else { struct iosw *statlist[1]; statlist[0] = &(cb_fout[*req_id].stat); recall(cb_fout[*req_id].filedes, 1, statlist); } # endif # elif defined(AIX) # if !defined(AIX52) && !defined(_AIO_AIX_SOURCE) do { /* I/O can be interrupted on SP through rcvncall ! */ rc =(int)aio_suspend(1, cb_fout_arr+(int)*req_id); } while(rc == -1 && errno == EINTR); # endif # else if((int)aio_suspend((const struct aiocb *const*)(cb_fout_arr+(int)*req_id), 1, NULL) != 0) rc =-1; # endif if(rc ==-1) ELIO_ERROR(SUSPFAIL,0); # if defined(DECOSF) /* on DEC aio_return is required to clean internal data structures */ if(aio_return(cb_fout+(int)*req_id) == -1) ELIO_ERROR(RETUFAIL,0); # endif #endif while(aio_req[aio_i] != *req_id && aio_i < MAX_AIO_REQ) aio_i++; if(aio_i >= MAX_AIO_REQ) ELIO_ERROR(HANDFAIL, aio_i); aio_req[aio_i] = NULL_AIO; *req_id = ELIO_DONE; } #ifdef PABLO PABLO_end(pablo_code); #endif return ELIO_OK; } /*\ Check if asynchronous I/O operation completed. If yes, invalidate id. \*/ int elio_probe(io_request_t *req_id, int* status) { int errval=-1; int aio_i = 0; #ifdef PABLO int pablo_code = PABLO_elio_probe; PABLO_start( pablo_code ); #endif if(*req_id == ELIO_DONE){ *status = ELIO_DONE; } else { #ifdef AIO # if defined(CRAY) # if defined(FFIO) { struct ffsw dumstat, *prdstat=&(cb_fout[*req_id].stat); fffcntl(cb_fout[*req_id].filedes, FC_ASPOLL, prdstat, &dumstat); errval = (FFSTAT(*prdstat) == 0) ? INPROGRESS: 0; } # else errval = ( IO_DONE(cb_fout[*req_id].stat) == 0)? INPROGRESS: 0; # endif # elif defined(AIX) errval = aio_error(cb_fout[(int)*req_id].aio_handle); # else errval = aio_error(cb_fout+(int)*req_id); # endif #endif switch (errval) { case 0: while(aio_req[aio_i] != *req_id && aio_i < MAX_AIO_REQ) aio_i++; if(aio_i >= MAX_AIO_REQ) ELIO_ERROR(HANDFAIL, aio_i); *req_id = ELIO_DONE; *status = ELIO_DONE; aio_req[aio_i] = NULL_AIO; break; case INPROGRESS: *status = ELIO_PENDING; break; default: return PROBFAIL; } } #ifdef PABLO PABLO_end(pablo_code); #endif return ELIO_OK; } #if defined(CRAY) && defined(FFIO) static int cray_part_info(char *dirname,long *pparts,long *sparts) { struct statfs stats; long temp,count=0; if(statfs(dirname, &stats, sizeof(struct statfs), 0) == -1) return -1; temp = stats.f_priparts; while(temp != 0){ count++; temp <<= 1; } *pparts = count; if(stats.f_secparts != 0){ temp = (stats.f_secparts << count); count = 0; while(temp != 0){ count++; temp <<= 1; } *sparts = count; } return ELIO_OK; } #endif /*\ Noncollective File Open \*/ Fd_t elio_open(const char* fname, int type, int mode) { Fd_t fd=NULL; stat_t statinfo; int ptype=0, rc; char dirname[ELIO_FILENAME_MAX]; /* Create a file for writing to in lustre with a specified pagesize and stripe. pagesize = 1048576; lustre_stripe_count = 32; are good choices. */ #ifdef USE_LUSTRE struct lov_mds_md stripecfg; int lustre_file; int lustre_stripe_count; int pagesize; pagesize = 1048576; lustre_stripe_count = 32; #endif #ifdef PABLO int pablo_code = PABLO_elio_open; PABLO_start( pablo_code ); #endif if(first_elio_init) elio_init(); switch(type){ case ELIO_W: ptype = O_CREAT | O_TRUNC | O_WRONLY; break; case ELIO_R: ptype = O_RDONLY; break; case ELIO_RW: ptype = O_CREAT | O_RDWR; break; default: ELIO_ERROR_NULL(MODEFAIL, type); } #if defined(WIN32) || defined(CYGNUS) ptype |= O_BINARY; #endif if((fd = (Fd_t ) malloc(sizeof(fd_struct)) ) == NULL) ELIO_ERROR_NULL(ALOCFAIL, 0); if( (rc = elio_dirname(fname, dirname, ELIO_FILENAME_MAX)) != ELIO_OK) { free(fd); ELIO_ERROR_NULL(rc, 0); } if( (rc = elio_stat(dirname, &statinfo)) != ELIO_OK) { free(fd); ELIO_ERROR_NULL(rc, 0); } fd->fs = statinfo.fs; fd->mode = mode; fd->type = type; fd->extent = 0; fd->next = NULL; #ifdef USE_LUSTRE lustre_file = (strncmp(fname,"/dtemp",6) == 0) && (access(fname, F_OK) != 0) && (ME() == 0); if (lustre_file) { ptype = ptype | O_LOV_DELAY_CREATE ; } #endif #if defined(CRAY) && defined(FFIO) { struct ffsw ffstat; long pparts, sparts, cbits, cblocks; extern long _MPP_MY_PE; char *ffio_str="cache:256"; /* intern I/O buffer/cache 256*4096 bytes */ /* JN: we do not want read-ahead write-behind*/ if(cray_part_info(dirname,&pparts,&sparts) != ELIO_OK){ free(fd); ELIO_ERROR_NULL(STATFAIL, 0); } ptype |= ( O_BIG | O_PLACE | O_RAW ); cbits = (sparts != 0) ? 1 : 0; if( sparts != 0) { /* stripe is set so we only select secondary partitions with cbits */ if(mode == ELIO_SHARED){ cbits = ~((~0L)<fd = OPEN(fname, ptype, FOPEN_MODE, cbits, cblocks, &ffstat, NULL); else fd->fd = OPEN(fname, ptype, FOPEN_MODE, 0L , 0 , &ffstat, ffio_str); } #else fd->fd = OPEN(fname, ptype, FOPEN_MODE ); #endif if( (int)fd->fd == -1) { free(fd); ELIO_ERROR_NULL(OPENFAIL, 0); } fd->name = strdup(fname); #ifdef USE_LUSTRE if (lustre_file) { stripecfg.lmm_magic = LOV_MAGIC; stripecfg.lmm_pattern = 0; /* Only available option for now. */ stripecfg.lmm_stripe_size = pagesize; /* Stripe size in bytes. */ stripecfg.lmm_stripe_count = lustre_stripe_count; if (ioctl((int)fd->fd, LL_IOC_LOV_SETSTRIPE, &stripecfg) < 0) { fprintf(stderr, "fp_create_out_filefp: Error: unable to stripe %s file.\n" "error was %s\n", fname,strerror(errno)); fflush(stderr); free(fd); ELIO_ERROR_NULL(OPENFAIL, 0); } } /* end if (luster_file) (is in /dtemp) */ #endif #ifdef PABLO PABLO_end(pablo_code); #endif return(fd); } /*\ Close File \*/ int elio_close(Fd_t fd) { int status = ELIO_OK; #ifdef PABLO pablo_code = PABLO_elio_close; PABLO_start( pablo_code ); #endif if (fd->next) status = elio_close((Fd_t) fd->next); /*printf("Closing extent %d name %s\n", fd->extent, fd->name);*/ if(CLOSE(fd->fd)==-1 || (status != ELIO_OK)) ELIO_ERROR(CLOSFAIL, 0); free(fd->name); free(fd); #ifdef PABLO PABLO_end(pablo_code); #endif return ELIO_OK; } /*\ Close File \*/ int elio_fsync(Fd_t fd) { int status = ELIO_OK; #ifdef ELIO_FSYNC if (fd->next) status = elio_fsync((Fd_t) fd->next); /* printf("syncing extent %d name %s\n", fd->extent, fd->name); */ /* if(ELIO_FSYNC(fd->fd)==-1 || (status != ELIO_OK)) */ #ifndef WIN32 #if !defined(__INTERIX) #ifdef CATAMOUNT status = fsync((Fd_t) fd->next); #else sync(); #endif #endif #endif if(ELIO_FSYNC(fd->fd)==-1 ) ELIO_ERROR(FSYNCFAIL, 0); #endif return ELIO_OK; } /*\ Delete File \*/ int elio_delete(const char* filename) { int rc; if (access(filename, F_OK) != 0) /* Succeed if the file does not exist */ return ELIO_OK; #ifdef PABLO int pablo_code = PABLO_elio_delete; PABLO_start( pablo_code ); #endif rc = unlink(filename); /* Remeber the first rc ... now delete possible extents until one fails */ { int extent; for (extent=1; extentOK"); return; } else if(code == ELIO_PENDING_ERR) code = elio_pending_error; if(codeOFFSET+ERRLEN) *msg=(char)0; else (void) strcpy(msg, errtable[-OFFSET + code]); } int elio_pending_error=UNKNFAIL; char *errtable[ERRLEN] ={ ">Unable to Seek", ">Write Failed", ">Asynchronous Write Failed", ">Read Failed", ">Asynchronous Read Failed", ">Suspend Failed", ">I/O Request Handle not in Table", ">Incorrect File Mode", ">Unable to Determine Directory", ">Stat For Specified File or Directory Failed", ">Open Failed", ">Unable To Allocate Internal Data Structure", ">Unsupported Feature", ">Unlink Failed", ">Close Failed", ">Operation Interrupted Too Many Times", ">AIO Return Failed", ">Name String too Long", ">Unable to Determine Filesystem Type", ">Numeric Conversion Error", ">Incorrect Filesystem/Device Type", ">Error in Probe", ">Unable to Truncate", ">End of File", ">Fsync Failed", ""}; ga-5-4/pario/elio/eliop.h0000644000175000017500000000720512662210477013366 0ustar mbamba#ifndef ELIOP_H #define ELIOP_H #ifdef WIN32 #include #ifndef __MINGW32__ #include "winutil.h" #endif #define F_OK 00 #endif #include #include #include #include #include #include "typesf2c.h" #define PRINT_AND_ABORT(msg, val) GA_Error(msg, (int)val) #ifndef GLOBAL_H extern void GA_Error(char*, int); #endif #if (defined(SP) || defined(SP1)) #define PIOFS 1 #endif #if (defined(CRAY) && !defined(__crayx1)) || defined(NEC) # include # define STATVFS statfs #elif defined(__FreeBSD__) || defined(MACX) # include # include # define STATVFS statfs # define NO_F_FRSIZE #elif defined(WIN32) # define STATVFS _stat # define S_ISDIR(mode) ((mode&S_IFMT) == S_IFDIR) # define S_ISREG(mode) ((mode&S_IFMT) == S_IFREG) #elif defined(CYGNUS) || defined(LINUX) || defined(CYGWIN) || defined(BGL) || defined(BGP) || defined(BGQ) || defined(HPUX) # include # define STATVFS statfs # define NO_F_FRSIZE #else # include # define STATVFS statvfs #endif #ifdef WIN32 #include #else #include #endif #include #if (defined(CRAY) && defined(FFIO)) # include # include # include #endif #include "elio.h" #include "pablo.h" extern int _elio_Errors_Fatal; extern void elio_init(void); extern int elio_pending_error; #if !defined(PRINT_AND_ABORT) # if defined(SUN) && !defined(SOLARIS) extern int fprintf(); extern void fflush(); # endif # define PRINT_AND_ABORT(msg, val){\ fprintf(stderr, "ELIO fatal error: %s %ld\n", msg, val);\ fprintf(stdout, "ELIO fatal error: %s %ld\n", msg, val);\ fflush(stdout);\ exit(val);\ } #endif /**************************** Error Macro ******************************/ /* ELIO defines error macro called in case of error * the macro can also use user-provided error routine PRINT_AND_ABORT * defined as macro to do some cleanup in the application before * aborting * The requirement is that PRINT_AND_ABORT is defined before * including ELIO header file - this file */ #define ELIO_ERROR_NULL(code, val){\ PABLO_end(pablo_code);\ if(! _elio_Errors_Fatal){\ elio_pending_error= code;\ return NULL;\ }\ if( _elio_Errors_Fatal)\ PRINT_AND_ABORT(errtable[code-OFFSET], val);\ } #define ELIO_ERROR(code, val) { \ PABLO_end(pablo_code);\ if(! _elio_Errors_Fatal) return(code);\ else PRINT_AND_ABORT(errtable[code-OFFSET], val);\ } /* error codes and messages */ #define ERRLEN 26 #define OFFSET (-2000) #define SEEKFAIL (OFFSET + 0) #define WRITFAIL (OFFSET + 1) #define AWRITFAIL (OFFSET + 2) #define READFAIL (OFFSET + 3) #define AREADFAIL (OFFSET + 4) #define SUSPFAIL (OFFSET + 5) #define HANDFAIL (OFFSET + 6) #define MODEFAIL (OFFSET + 7) #define DIRFAIL (OFFSET + 8) #define STATFAIL (OFFSET + 9) #define OPENFAIL (OFFSET + 10) #define ALOCFAIL (OFFSET + 11) #define UNSUPFAIL (OFFSET + 12) #define DELFAIL (OFFSET + 13) #define CLOSFAIL (OFFSET + 14) #define INTRFAIL (OFFSET + 15) #define RETUFAIL (OFFSET + 16) #define LONGFAIL (OFFSET + 17) #define FTYPFAIL (OFFSET + 18) #define CONVFAIL (OFFSET + 19) #define TYPEFAIL (OFFSET + 20) #define PROBFAIL (OFFSET + 21) #define TRUNFAIL (OFFSET + 22) #define EOFFAIL (OFFSET + 23) #define FSYNCFAIL (OFFSET + 24) #define UNKNFAIL (OFFSET + 25) extern char *errtable[ERRLEN]; #define ELIO_FILENAME_MAX 1024 #define SDIRS_INIT_SIZE 1024 #endif ga-5-4/pario/elio/pablo.h0000644000175000017500000000171412662210477013352 0ustar mbamba/* Header file for PABLO instrumentation */ #if defined(PABLO) # define IOTRACE # include "IOTrace.h" #endif /* Pablo profiler definitions */ # define PABLO_elio_write 710000 # define PABLO_elio_awrite 710001 # define PABLO_elio_read 710002 # define PABLO_elio_aread 710003 # define PABLO_elio_wait 710004 # define PABLO_elio_probe 710005 # define PABLO_elio_stat 710006 # define PABLO_elio_open 710007 # define PABLO_elio_close 710009 # define PABLO_elio_set_cb 710010 # define PABLO_elio_delete 710011 # define PABLO_elio_truncate 710012 # define PABLO_elio_length 710014 #if defined(PABLO) # define PABLO_init initIOTrace # define PABLO_start(_id) startTimeEvent( _id ) # define PABLO_end(_id) endTimeEvent( _id ) # define PABLO_terminate {endIOTrace(); endTracing();} #else # define PABLO_init # define PABLO_start(_id) # define PABLO_end( _id ) # define PABLO_terminate #endif ga-5-4/pario/elio/chemio.h0000644000175000017500000000062512662210477013521 0ustar mbamba#if !defined(CHEMIO_H) #define CHEMIO_H #define ELIO_RW -1 #define ELIO_W -2 #define ELIO_R -3 #define ELIO_DONE -1 #define ELIO_PENDING 1 #define ELIO_OK 0 #define CHEMIO_RW ELIO_RW #define CHEMIO_W ELIO_W #define CHEMIO_R ELIO_R #define CHEMIO_DONE ELIO_DONE #define CHEMIO_PENDING ELIO_PENDING #define CHEMIO_OK ELIO_OK #endif ga-5-4/pario/doc/0000755000175000017500000000000012662210476011715 5ustar mbambaga-5-4/pario/doc/SFapi.html0000644000175000017500000000063612662210476013612 0ustar mbamba Shared Files Library <BODY> Viewing this page requires a browser capable of displaying frames. </BODY> ga-5-4/pario/doc/dra_ops.html0000644000175000017500000005706712662210476014251 0ustar mbamba Disk Resident Arrays Operations

Disk Resident Arrays

Disk Resident Arrays (DRA) extend the Global Arrays (GA) programming model to disk. The library encapsulates the details of data layout, addressing and I/O transfer in disk arrays objects. Disk resident arrays resemble global arrays except that they reside on the disk instead of the main memory. The main features of this model are:
  • Data can be transfered (copied) between disk and global memory.
  • I/O operations have nonblocking interface to allow overlapping of I/O with computations.
  • All I/O operations are collective.
  • Either whole or sections of global arrays can be transferred between GA memory and the disk.
  • Reshaping and transpose operation are allowed during the transfer.
  • Disk resident arrays might be temporary or persistent (saved after program termination and available in next runs).
  • Persistent disk arrays can be accessed by any program executing on arbitrary number of processors.
  • Distribution and internal data layout on the disk is optimized for large data transfer.
  • Hints provided by the user are utilized to guide optimization of the library performance for the specific I/O patterns.
DRA can take advantage of a shared file system of a collection of independent filesystems accessible from individual computing nodes.

dra_init

status = dra_init(max_arrays, max_array_size, total_disk_space, max_memory)
         integer max_arrays [input]
         double precision max_array_size [input]
         double precision total_disk_space [input]
         double precision max_memory [input]
Initializes Disk Resident Array I/O subsystem.

max_array_size , total_disk_space and max_memory are given in bytes.

max_memory specifies how much local memory per processor the application is willing to provide to the DRA I/O subsystem for buffering.

The value of -1 for any of input arguments means: "don't care ", "don't know" , or "use defaults ".


dra_terminate

  status=dra_terminate()
Close all open disk resident arrays and shut down DRA I/O subsystem.


dra_create

     status = dra_create(type, dim1, dim2, name, filename, mode,rdim1,rdim2,d_a)
              integer type                      [input]   ! MA type identifier
              integer dim1                      [input]
              integer dim2                      [input]
              character*(*) name                [input]
              character*(*) filename            [input]
              integer mode                      [input]
              integer rdim1                     [input] 
              integer rdim2                     [input]
              integer d_a                       [output]  ! DRA handle
Creates a new disk resident array with specified dimensions and data type (represented by MA type handle).

The string filename specifies name of an abstract meta-file that will store the data on the disk. The meta-file might be implemented as multiple files that will contain parts of the disk resident array. The component files will have names derived from the string filename according to some established scheme(s). Only one DRA object can be stored in DRA meta-file identified by filename .

DRA objects persist on the disk after calling dra_close. dra_delete should be used instead of dra_close to delete disk array and associated meta-file on the disk.

String name can be used for more informative (longer)names.

The data in disk resident array is implicitly initialized to 0 .

Access permissions (read, write, read& write) are set in mode . These are set using defined in the header files DRA.fh (Fortran) and DRA.h (C) preprocessor constants: DRA_R, DRA_W, DRA_RW.

The pair [rdim1, rdim2] specifies dimensions of a typical request. The value of -1 for either of them means "unspecified". The layout of the data on the disk(s) is determined based on the values of these arguments. Performance of the DRA operations depends on the dimensions (section shape) of the requests. If data layout is optimized for column-like sections, performance of DRA operations for row-like sections might be seriously degraded. This is analogous to the effect of wrong loop ordering iyielding frequent cache misses in the following example .

              double precision a(1000, 1000)
              do i = 1, 1000
                 do j = 1, 1000
                    a(i,j) = dfloat(i+j)
                 enddo
              enddo

instead of
              do j = 1, 1000
                 do i = 1, 1000
                    a(i,j) = dfloat(i+j) 
                 enddo
              enddo

dra_open

    status = dra_open(filename, mode, d_a)
              character*(*) filename            [input]
              integer mode                      [input]
              integer d_a                       [output]  ! DRA handle
Open and assign DRA handle to disk resident array stored in DRA meta-file filename. Disk resident arrays that are created with dra_create and saved by calling dra_close can be later opened and accessed by the same or different application.

Attributes of the disk resident array can be found by calling dra_inquire.


dra_write

     status = dra_write(g_a, d_a, request)
              integer g_a                       [input]  ! GA handle
              integer d_a                       [input]  ! DRA handle
              integer request                   [output] ! request id
Write asynchronously specified global array to specified disk resident array.

The dimensions and type of arrays represented by handles g_a and d_a must match. If dimensions don't match, dra_write_section should be used instead.

The operation is by definition asynchronous but it might be implemented as synchronous i.e., it would return only when the I/O is completed.

request can be used to dra_probe or dra_wait for completion of the associated operation.


dra_write_section

     status = dra_write_section(transp, g_a, gilo, gihi, gjlo, gjhi, 
                                        d_a, dilo, dihi, djlo, djhi, request)
              logical transp                    [input] ! transpose operator 
              integer g_a                       [input] ! GA handle 
              integer d_a                       [input] ! DRA handle 
              integer gilo                      [input] 
              integer gihi                      [input] 
              integer gjlo                      [input] 
              integer gjhi                      [input] 
              integer dilo                      [input] 
              integer dihi                      [input] 
              integer djlo                      [input] 
              integer djhi                      [input] 
              integer request                   [output] ! request id
Write asynchronously specified global array section to specified disk resident array section:
                OP(g_a[ gilo:gihi, gjlo:gjhi]) -->  d_a[ dilo:dihi, djlo:djhi]
where OP is the transpose operator (.true./.false.). Return error if the two section's types or sizes mismatch. See dra_write specs for discussion of request .


dra_read

     status = dra_read(g_a, d_a, request)
              integer g_a                       [input]  ! GA handle
              integer d_a                       [input]  ! DRA handle
              integer request                   [output] ! request id
Read asynchronously the specified global array from the specified disk resident array.

Dimensions and type of arrays referred to by handles g_a and d_a must match. If dimensions don't match, dra_read_section could be used instead.

See dra_write specs for discussion of request .


dra_read_section

     status = dra_read_section(transp, g_a, gilo, gihi, gjlo, gjhi,
                                       d_a, dilo, dihi, djlo, djhi, request)
              logical transp                    [input] ! transpose operator
              integer g_a                       [input] ! GA handle
              integer d_a                       [input] ! DRA handle
              integer gilo                      [input]
              integer gihi                      [input]
              integer gjlo                      [input]
              integer gjhi                      [input]
              integer dilo                      [input]
              integer dihi                      [input]
              integer djlo                      [input]
              integer djhi                      [input]
              integer request                   [output] ! request id
Read asynchronously specified global array section from specified disk resident array section:
                OP(d_a[ dilo:dihi, djlo:djhi]) -->  g_a[ gilo:gihi, gjlo:gjhi]
where OP is the transpose operator (.true./.false.).

See dra_write specs for discussion of request .


dra_probe

     status = dra_probe(request, compl_status)
              integer request                   [input]  ! request id
              integer compl_status              [output] ! completion status
Tests for completion of dra_write/read or dra_write/read_section operation which set the value passed in request argument.

compl_status .eq. 0 means the operation has been completed.

compl_status .ne. 0 means "not done yet ".


dra_wait

     status = dra_wait(request)
              integer request                   [input]  ! request id
Blocks until completion of dra_write/read or dra_write/read_section operation which set the value passed in request argument.


dra_inquire

     status = dra_inquire(d_a, type, dim1, dim2, name, filename)
              integer d_a                       [input]  ! DRA handle
              integer type                      [output]
              integer dim1                      [output]
              integer dim2                      [output]
              character*(*) name                [output]
              character*(*) filename            [output]
Return dimensions, type , name of disk resident array, and filename of DRA meta-file associated with d_a handle.


dra_delete

     status = dra_delete(d_a)
              integer d_a                       [input]  ! DRA handle
Delete a disk resident array associated with d_a handle. Invalidate handle. The corresponding DRA meta-file is destroyed.


dra_close

     status = dra_close(d_a)
              integer d_a                       [input]  ! DRA handle
Close DRA meta-file associated with d_a handle and deallocate data structures corresponding to this disk array. Invalidate d_a handle. The array on the disk is persistent.


dra_flick

     subroutine dra_flick()
Returns control to DRA for a VERY short time to improve progress of pending asynchronous operations. ga-5-4/pario/doc/dra_index.html0000644000175000017500000000343012662210476014540 0ustar mbamba GA Index
DRA_CLOSE
DRA_CREATE
DRA_DELETE
DRA_FLICK
DRA_INIT
DRA_INQUIRE
DRA_OPEN
DRA_PROBE
DRA_READ
DRA_READ_SECTION
DRA_TERMINATE
DRA_WAIT
DRA_WRITE
DRA_WRITE_SECTION
ga-5-4/pario/doc/api_eaf.html0000644000175000017500000002306312662210476014173 0ustar mbamba

Exclusive Access File Library

An exclusive access file is a file which is generated and/or read by a single process of a distributed parallel application. Files are not shared between different processes. The  library is an abstract high-performance file system which provides a common interface for a variety of architecture specific parallel storage systems.  The library also makes available features like asynchronous input and output to Fortran.  EAF's syntax is similar to the standard Unix C file operations, differences indicate new semantics or extended features available through EAF.

EAF_Open

Description:

    Open a file.
Prototype:
    integer EAF_Open(fname, type, fh)
      character *(*) fname
      integer type
      integer fd
Parameters:
    fname
      Character string of a globally unique filename (path may be fully qualified)
    type
      Read write permissions. Legal values are EAF_W, EAF_R, and EAF_RW
    fh
      File descriptor (handle).
Returns:
    0 or error code

EAF_Write

Description:

    Synchronously write to the file specified by the file handle
Prototype:
    integer EAF_Write(fh, offset, buf, bytes)
      integer fh
      double offset
      _______ buf
      double bytes
Parameters:
    fh
      File Handle offset Absolute offset, in bytes, to start writing at
    buf
      Scalar or array of data
    bytes
      Size of buffer in bytes
Returns:
    0 or error code if an error occured

EAF_AWrite

Description:

    Asynchronously write to the file specified by the file handle, and return a handle to the asynchronous operation.

    If there are more than MAX_AIO_REQ asynchronous requests (reading and/or writing) pending, the operation is handled in a synchronous fashion and returns a CHEMIO_DONE handle.

    On architectures where asynchronous I/O operations are not supported, all requests are handled synchronously, returning a CHEMIO_DONE handle.

Prototype:
    integer EAF_AWrite(fh, offset, buf, bytes, req_id)
      integer fh
      double offset
      _______
          buf
      double bytes
      integer req_id
Parameters:
    fh
      File Handle
    offset
      Absolute offset, in bytes, to start writing at
    buf
      Scalar or array of data
    bytes
      Size of buffer, in bytes
    req_id
      Handle of asynchronous operation
Returns:
    0 or error code if an error occured

EAF_Read

Description:

    Synchronously read from the file specified by the file handle
Prototype:
    integer EAF_Read(fh, offset, buf, bytes)
      integer fh
      double offset
      _______
          buf
      double bytes
      integer req_id
Parameters:
    fh
      File Handle
    offset
      Absolute offset, in bytes, to start writing at
    buf
      Scalar or array of data
    bytes
      Size of buffer, in bytes
    Returns:
      0, or error code if an error occured

EAF_ARead

Description:

    Asynchronously read from the file specified by the file handle, and return a handle to the asynchronous operation.

    If there are more than MAX_AIO_REQ asynchronous requests (reading and/or writing) pending, the operation is handled in a synchronous fashion and returns a EAF_DONE handle.

    On architectures where asynchronous I/O operations are not supported, all requests are handled synchronously, returning a EAF_DONE handle.

Prototype:
    integer EAF_ARead(fh, offset, buf,bytes, req_id)
      integer fh
      double offset
      _______
          buf
      double bytes
      integer req_id
Parameters:
    fh
      File Handle
    offset
      Absolute offset, in bytes, to start reading from
    buf
      Scalar or array of data
    bytes
      Size of buffer, in bytes
    req_id
      Handle of asynchronous operation
Returns:
    0 if succeeded, or error code if an error occured

EAF_Probe

Description:

    Determine if an asynchronous request has completed or is pending.
Prototype:
    integer EAF_Probe(id, status)
      integer id
      integer status
Parameters:
    id
      Handle of asynchronous request
    status Pending or completed status argument
Returns:
    0 if probe succeeded, else returns error code .

    status returns 0 if the asynchronous operation is complete, or 1 otherwise.

    If the asynchronous request is complete, id is invalidated.


EAF_Wait

Description:

    Wait for the completion of the asynchronous request associated with id
Prototype:
    integer EAF_Wait(id)
      integer id
Parameters:
    id
      Handle of asynchronous request
Returns:
    0 if EAF is able to wait for completion, else returns error code.

    id is invalidated.


EAF_Close

Description:

    Close a file
Prototype:
    integer EAF_Close(fh)
      integer fh
Parameters:
    fh
      File Handle
Returns:
    0 if the file was closed, else returns error code.

EAF_Delete

Description:

    Delete a file
Prototype:
    integer EAF_Delete(fname)
      character*(*) fname
Parameters:
    fname
      File name
Returns:
    0 if the file was deleted, else returns error code.

EAF_Length

Description:

    Determine the length of a file
Prototype:
    double EAF_Length(fh)
      integer fh
Parameters:
    fh
      File Handle
Returns:
    file length in bytes

EAF_Eof

Description:

    Determines if the enod of file was reached
Prototype:
    logical EAF_Eof(ierr)
      integer ierr
Parameters:
    ierr
      error code
Returns:
    true if the end of file was reached, else returns false.

    ierr=0 means success, otherwise an error.


EAF_Truncate

Description:

    Truncate a file at specified offset
Prototype:
    integer EAF_Close(fh, offset)
      integer fh
      double offset
Parameters:
    fh
      File Handle
    offset
      offset in bytes
Returns:
    0 if the file was truncated, else returns error code.

EAF_Stat

Description:

    Determine available disk space and type for a filesystem
Prototype:
    integer EAF_Stat(fname, avail, fstype)
      character*(*) fname
      integer avail
      integer fstype
Parameters:
    fname
      File/directory name
    avail
      amount of available disk space in kilobytes
    fstype
      filesystem type (Unix/PIOFS/PFS/...)
Returns:
    0 if success, else returns error code.

EAF_Errmsg

Description:

    Prints to stdout an error message associated with error code
Prototype:
    subroutine EAF_Errmsg(ierr)
      integer ierr
Parameters:
    ierr
      error code returned from other EAF routines
Returns:
    nothing
ga-5-4/pario/doc/list.html0000644000175000017500000000142712662210476013562 0ustar mbamba Untitled Document

Shared Files Library

sf_create

sf_destroy

sf_read

sf_wait

sf_waitall

sf_write

 

 

 

  ga-5-4/pario/doc/DRAapi.html0000644000175000017500000000073012662210476013703 0ustar mbamba Disk Resident Arrays Operations <body> Viewing this page requires browser capable of displaying frames </body> ga-5-4/pario/doc/index.html0000644000175000017500000000117212662210476013713 0ustar mbamba Documentation List There are three parallel I/O models supported:

Disk Residend Arrays
Shared Files
Exclusive Access Files ga-5-4/pario/doc/commands_eaf.html0000644000175000017500000000276112662210476015225 0ustar mbamba

Commands
EAF_Open
EAF_Write
EAF_AWrite
EAF_Read
EAF_ARead
EAF_Probe
EAF_Wait
EAF_Close
EAF_Length
EAF_Delete
EAF_Eof
EAF_Errmsg
EAF_Stat
EAF_Truncate

Permissions
EAF_RW
EAF_W
EAF_R
ga-5-4/pario/doc/EAFapi.html0000644000175000017500000000071512662210476013673 0ustar mbamba EAF Programmers Interface <BODY> Viewing this page requires a browser capable of displaying frames. </BODY> ga-5-4/pario/doc/sf.html0000644000175000017500000001566412662210476013227 0ustar mbamba sf gowno

Shared Files Library

The Shared Files (SF) library implements logically-shared temporary files for parallel SPMD (single-program-multiple-data) applications. Any process can read and write at arbitrary location in a file independently of other processes. Shared files must be created and destroyed collectively. To optimize performance of the library, user can provide hints on:

  • soft limit, and
  • hard limit for the file size.

The SF read and write operations are asynchronous/nonblocking and require a wait operation to complete.

Due to the FORTRAN data type limitations, in order to facilitate access to files >2GB the file size, request size and offset arguments use double precision data types.

All SF routines return an error code. The "0" value means success, other values correspond to error codes.


sf_create

integer sf_create(fname, size_hard_limit, size_soft_limit, req_size, handle)
        fname            -- meta-file name
        size_hard_limit  -- max file size in bytes not to be exceeded (a hint)
        size_soft_limit  -- estimated file size (a hint)
        req_size         -- size of  a typical request (a hint)
        handle           -- returned handle to the created file

Creates shared file using name and path specified in fname as a template.
req_size specifies size of a typical request (-1. means "don't know").

Creates shared file using name and path specified in fname as a template.
req_size specifies size of a typical request (-1. means "don't know").

It is a collective operation.


sf_write

 

integer sf_write(handle, offset, bytes, buffer, request_id)
        handle           -- file handle returned from sf_create   [in]
        offset           -- location in file (from the beginning)
                            where data should be written to       [in]
        buffer           -- local array to put the data           [in]
        bytes            -- number of bytes to read               [in]
        request_id       -- id identifying asynchronous operation [out]

Asynchronous write operation. Writes number of bytes to the file identified by handle at location offset.Operation is guaranteed to be complete when sf_wait called with request_id argument returns.


sf_read

integer sf_read(handle, offset, bytes, buffer, request_id)
        handle           -- file handle returned from sf_create   [in]
        offset           -- location in file (from the beginning)
                            where data should be read from        [in]
        buffer           -- local array to put the data           [in]
        bytes            -- number of bytes to read               [in]
        request_id       -- id identifying asynchronous operation [out]

Asynchronous read operation. Reads number of bytes to the file identified by handle at location offset.Operation is guaranteed to be complete when sf_wait called with request_id argument returns.


sf_wait

integer sf_wait(request_id)
        request_id       -- id identifying asynchronous operation [in/out]

Blocks the calling process until I/O operation associated with request_id completes.
Invalidates request_id.
 
 



sf_waitall

integer sf_waitall(list, num)
        list(num)        -- array of ids for asynchronous operations [in/out]
        num              -- number of entries in list                [in]

Blocks the calling process until all of the num I/O operations associated with ids
specified in list complete. Invalidates (modifies) ids on the list.


sf_destroy

integer sf_destroy(handle)
        handle           -- file handle returned from sf_create      [in]

Destroys the shared file associated with handle. It is a collective operation. ga-5-4/pario/makefile.h0000644000175000017500000000466412662210476013110 0ustar mbamba OSNAME = $(shell uname | awk '{ print $1}') #under AIX, AIX52 is defined to use POSIX API in AIX 5.2.0.0 or greater ifeq ($(OSNAME),AIX) LIB_DEFINES += $(shell /usr/bin/oslevel | awk -F. \ '{ if ($$1 > 5 || ($$1 == 5 && $$2 > 1))\ print "-DAIX52" }') #lsdev -C -l aio0 #aio0 Defined Asynchronous I/O (Legacy) ifdef USE_OLDAIO USE_OLDAIO=Y else USE_OLDAIO= $(shell /usr/sbin/lsdev -C -l aio0 2>&1|grep Lega|awk ' /Legacy/ {print "Y"}') endif ifeq ($(USE_OLDAIO),Y) LIB_DEFINES += -D_AIO_AIX_SOURCE endif endif #under AIX, there can be problems with AIO and large files ifdef LARGE_FILES ifeq ($(OSNAME),AIX) LIB_DEFINES += $(shell /usr/bin/oslevel | awk -F. \ '{ if ($$1 > 4 || ($$1 == 4 && $$2 > 1))\ print "-D_LARGE_FILES -D_LARGE_FILE_API" }') # asynchronous I/O with large files supported starting with 4.2.1 # However, there is a bug in IBM libs on PNNL system that prevents us # from using AIO under 4.2.1 :-) # AIO_LARGE_FILES = $(shell /usr/bin/oslevel | awk -F. \ '{ if ($$1 == 4 && $$2 == 2 && $$3 <= 0 ) \ print "NO"}') endif ifeq ($(TARGET), SOLARIS) LIB_DEFINES += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 CC += $(shell getconf LFS_CFLAGS) endif # # LINUX: kernel 2.4 is needed # ifeq ($(TARGET), LINUX) LIB_DEFINES += -D_LARGEFILE64_SOURCE LIB_DEFINES += $(shell getconf LFS_CFLAGS) endif ifeq ($(TARGET), BGL) LIB_DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE endif ifeq ($(TARGET), BGP) LIB_DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE endif ifeq ($(TARGET), BGQ) LIB_DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE endif # # HP targets tested on HPUX 11.0 # ifeq ($(TARGET), HPUX) LIB_DEFINES += -D_LARGEFILE64_SOURCE LIB_DEFINES += $(shell getconf XBS5_ILP32_OFFBIG_CFLAGS) endif ifeq ($(TARGET), HPUX64) LIB_DEFINES += -D_LARGEFILE64_SOURCE LIB_DEFINES += $(shell getconf XBS5_LP64_OFF64_CFLAGS) endif LIB_DEFINES += -DLARGE_FILES endif ifdef LIB_TARGETS # HPIODIR is used as a filename prefix in test programs ifdef HPIODIR LIB_DEFINES += -DHPIODIR=\'$(HPIODIR)/\' endif ifeq ($(TARGET), DECOSF) LOC_LIBS += -laio -lpthreads endif endif ifdef USE_LINUXAIO LIB_DEFINES += -DLINUXAIO COMM_LIBS += -lrt endif ga-5-4/pario/eaf/0000755000175000017500000000000012662210477011704 5ustar mbambaga-5-4/pario/eaf/test.F0000644000175000017500000002523012662210477012774 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif #define IO_TEST_SZ (1024*1024/8) #define IO_NUM_FILES 4 #define MAX_ITER 4 #define DMAP(x) dble(IO_TEST_SZ*((x-1)*eaf_util_szint())) #define MAX_FILE_SZ 48.0d9 #define BASE_NAME 'EAFfile' #ifdef HPIODIR # define FNAME HPIODIR//BASE_NAME #else # define FNAME BASE_NAME #endif program eaftest c c call test1 c call test2 c call test3 call test4 c print *,' ' print *,'All tests completed' end subroutine test2 implicit none #include "eaf.fh" c integer buf(IO_TEST_SZ, MAX_ITER), buf2(IO_TEST_SZ) character fname*200 integer fnum, iter integer i, nap real dummy integer fd(IO_NUM_FILES) integer buf_sz integer aio(IO_NUM_FILES, MAX_ITER) integer stat2 c buf_sz = (IO_TEST_SZ*eaf_util_szint()) c write(6,*) write(6,*) ' TEST 2 ... asynchronous read/write of multiple files' write(6,*) ' ----------------------------------------------------' write(6,*) c 10 format (A,'.', I1) c do fnum = 1, IO_NUM_FILES write (fname, 10) FNAME, fnum c call testerr(eaf_open(fname, eaf_rw, fd(fnum))) c print *,'testing EAF_AWrite', ' file= ',fname do iter = 1, MAX_ITER do i = 1, IO_TEST_SZ buf(i,iter) = i + fnum + (iter*10000) enddo call testerr(eaf_awrite(fd(fnum), $ DMAP(iter), $ buf(1,iter), buf_sz, aio(fnum, iter))) write(0,*) 'Submitted EAF_AWriteF fnum=', fnum, $ ' iter=',iter, ' aio=',aio(fnum, iter) enddo enddo do fnum = 1, IO_NUM_FILES do iter = 1, MAX_ITER write(0,*) 'Waiting to close fnum=', fnum, $ ' iter=',iter call testerr(eaf_wait(fd(fnum), aio(fnum, iter))) enddo call eaf_print_stats(fd(fnum)) call testerr(eaf_close(fd(fnum))) enddo c................................. print *,'testing EAF_ARead' do fnum = 1, IO_NUM_FILES write (fname, 10) FNAME, fnum call testerr(eaf_open(fname, eaf_r, fd(fnum))) do iter = 1, MAX_ITER do i = 1, IO_TEST_SZ buf(i,iter) = i + fnum + (iter*10000) enddo call testerr(eaf_aread(fd(fnum), $ DMAP(iter), $ buf2, buf_sz, $ aio(fnum,iter))) 1000 call testerr(eaf_probe(aio(fnum, iter), stat2)) write(0,999) stat2 999 format(i5,i8) if(stat2 .ne. 0) then do nap=1, 2000000 dummy = 2.0**2.0+nap enddo goto 1000 endif #ifndef __crayx1 call sleep(10) #endif write(0,*) 'Finished reading file=',fnum, $ ' fd=',fd(fnum), $ ' iter=',iter do i = 1, IO_TEST_SZ if(buf(i,iter) .ne. buf2(i)) then write(6,*) 'Bad read of file=',fnum, $ ' fd=',fd(fnum), $ ' iter=',iter,' offset=',i,' buf1=', $ buf(i,iter),' buf2=',buf2(i) stop 1 endif enddo enddo enddo c do fnum = 1, IO_NUM_FILES call eaf_print_stats(fd(fnum)) call testerr(eaf_close(fd(fnum))) write (fname, 10) FNAME, fnum call testerr(eaf_delete(fname)) enddo c end subroutine test1 implicit none #include "eaf.fh" integer buf(IO_TEST_SZ), buf2(IO_TEST_SZ) character fname*200 integer fnum, iter integer i integer fd(IO_NUM_FILES) integer buf_sz c buf_sz = (IO_TEST_SZ*eaf_util_szint()) c write(6,*) write(6,*) ' TEST 1 ... synchronous read/write of multiple files' write(6,*) ' ---------------------------------------------------' write(6,*) c do fnum = 1, IO_NUM_FILES write (fname, 10) FNAME, fnum 10 format (A,'.', I1) call testerr(eaf_open(fname, eaf_rw, fd(fnum))) print *, 'testing EAF_Write' do iter = 1, MAX_ITER do i = 1, IO_TEST_SZ buf(i) = i + fnum + (iter*10000) enddo call testerr(eaf_write(fd(fnum), $ DMAP(iter), $ buf(1), buf_sz)) enddo enddo c do fnum = 1, IO_NUM_FILES call eaf_print_stats(fd(fnum)) call testerr(eaf_close(fd(fnum))) enddo c c................................. c do fnum = 1, IO_NUM_FILES write (fname, 10) FNAME, fnum c call testerr(eaf_open(fname, eaf_r, fd(fnum))) c print *, 'testing EAF_Read' do iter = 1, MAX_ITER do i = 1, IO_TEST_SZ buf(i) = i + fnum + (iter*10000) enddo c call testerr(eaf_read(fd(fnum), $ DMAP(iter), $ buf2(1), buf_sz)) do i = 1, IO_TEST_SZ if(buf(i) .ne. buf2(i)) then write(6,*) 'Bad read of file=',fnum, $ ' iter=',iter,' offset=',i,' buf1=', $ buf(i),' buf2=',buf2(i) stop 1 endif enddo enddo enddo c do fnum = 1, IO_NUM_FILES call eaf_print_stats(fd(fnum)) call testerr(eaf_close(fd(fnum))) write (fname, 10) FNAME, fnum call testerr(eaf_delete(fname)) enddo c end subroutine testerr(code) implicit none #include "eaf.fh" integer code character*80 msg integer fstrlen external fstrlen c call eaf_errmsg(code, msg) write(6,*) ' code ', code, ' = ', msg(1:fstrlen(msg)) *** stop 1 c end integer function fstrlen(a) implicit none character*(*) a integer i intrinsic len c do i = len(a),1,-1 if (a(i:i) .ne. ' ') goto 10 enddo c 10 fstrlen = i c end subroutine test3 implicit none #include "eaf.fh" character fname*200 character*8 fstype integer avail, fd double precision length c write(6,*) write(6,*) ' TEST 3 ... misc. functions' write(6,*) ' --------------------------' write(6,*) c write (fname, 10) FNAME, 1 10 format (A,'.', I1) c call testerr(eaf_stat(fname, avail, fstype)) write(6,*) ' avail = ', avail, ' fstype = ', fstype c call testerr(eaf_open(fname, eaf_rw, fd)) call testerr(eaf_length(fd,length)) write(6,*) ' file length = ', length call testerr(eaf_truncate(fd,129.0d0)) call testerr(eaf_length(fd,length)) write(6,*) ' file length (should be 129) = ', length call testerr(eaf_close(fd)) c write(6,*) ' This delete should succeed' call testerr(eaf_delete(fname)) c call testerr(eaf_open(fname, eaf_rw, fd)) call testerr(eaf_length(fd,length)) write(6,*) ' should be zero file length = ', length call testerr(eaf_close(fd)) call testerr(eaf_delete(fname)) c end subroutine test4 implicit none #include "eaf.fh" character*200 fname character*255 fstype integer avail, fd, i, nwrite, ierr, iolen4, iolen, loop double precision length, offset, ofw double precision buf(IO_TEST_SZ) c write(6,*) write(6,*) ' TEST 4 ... fill the file system ' write(6,*) ' ------------------------------- ' write(6,*) c fname = ' ' write (fname, 10) FNAME, 1 10 format (A,'.', I1) c call testerr(eaf_stat(fname, avail, fstype)) write(6,*) ' avail = ', avail, ' fstype = ', fstype avail = 0.95*avail length = 1024*1024.0d0*avail call testerr(eaf_open(fname, eaf_rw, fd)) if(length.gt. MAX_FILE_SZ) then length = MAX_FILE_SZ write(6,*) ' trying max file length ', length,' bytes' else write(6,*) ' 95% available length ', length,' bytes' endif c ofw = 0 do offset = 0, length, (IO_TEST_SZ)*8 nwrite = nint(min(length-offset+1.0d0,(IO_TEST_SZ)*8.0d0)) call util_dfill(nwrite/8, offset, buf, 1) if (ofw .le. offset) then write(6,*) ' writing at ',offset, nwrite ofw = ofw + 100000000.0d0 endif ierr = eaf_write(fd, offset, buf, nwrite) if (ierr .ne. 0) then call testerr(ierr) call ga_error('bad write',ierr) endif enddo c call eaf_print_stats(fd) c ofw = 0 do offset = 0, length, (IO_TEST_SZ)*8 nwrite = nint(min(length-offset+1.0d0,(IO_TEST_SZ)*8.0d0)) if (ofw .le. offset) then write(6,*) ' reading at ', offset, nwrite ofw = ofw + 100000000.0d0 endif ierr = eaf_read(fd, offset, buf, nwrite) if (ierr .ne. 0) then call testerr(ierr) call ga_error('bad read',ierr) endif do i = 1, nwrite/8 if (buf(i).ne.offset) call ga_error('bad ', i) enddo enddo c call eaf_print_stats(fd) c call testerr(eaf_close(fd)) c c random read and write c buf(1) = eaf_util_random(35321) do iolen4 = 0,2 iolen = 8*1024 * (4**iolen4) ! 1024,4096,16384 doubles write(6,*) ' Random write: len=',iolen call testerr(eaf_open(fname, eaf_rw, fd)) do loop = 1, int(length/iolen)/4 offset = aint((length-iolen)*eaf_util_random(0)) ierr = eaf_write(fd, offset, buf, iolen) if (ierr .ne. 0) then call testerr(ierr) call ga_error('bad write',ierr) endif enddo call eaf_print_stats(fd) write(6,*) ' Random read : len=',iolen call testerr(eaf_open(fname, eaf_rw, fd)) do loop = 1, int(length/iolen)/4 offset = aint((length-iolen)*eaf_util_random(0)) ierr = eaf_read(fd, offset, buf, iolen) if (ierr .ne. 0) then call testerr(ierr) call ga_error('bad write',ierr) endif enddo call eaf_print_stats(fd) call testerr(eaf_close(fd)) enddo c call testerr(eaf_delete(fname)) c end subroutine util_dfill(n,val,a,ia) implicit none double precision a(*), val integer n, ia, i c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif end ga-5-4/pario/eaf/eaf.c0000644000175000017500000005156612662210477012620 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * DISCLAIMER * * This material was prepared as an account of work sponsored by an * agency of the United States Government. Neither the United States * Government nor the United States Department of Energy, nor Battelle, * nor any of their employees, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR * ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, * COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, * SOFTWARE, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT * INFRINGE PRIVATELY OWNED RIGHTS. * * * ACKNOWLEDGMENT * * This software and its documentation were produced with United States * Government support under Contract Number DE-AC06-76RLO-1830 awarded by * the United States Department of Energy. The United States Government * retains a paid-up non-exclusive, irrevocable worldwide license to * reproduce, prepare derivative works, perform publicly and display * publicly by or for the US Government, including the right to * distribute to other US Government contractors. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_LINUX_LIMITS_H # include #endif #if HAVE_LIMITS_H # include #endif #ifdef WIN32 # define PATH_MAX _MAX_PATH # define F_OK 2 #else # include #endif #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef EAF_STATS # include # include #endif #include "elio.h" #include "eaf.h" #include "eafP.h" #include "macdecls.h" #ifdef OPEN_MAX # define EAF_MAX_FILES OPEN_MAX #else # define EAF_MAX_FILES 1024 #endif static int eafhack_openfiles=0; static struct { char *fname; /**< Filename --- if non-null is active*/ Fd_t elio_fd; /**< ELIO file descriptor */ int type; /**< file type */ int nwait; /**< #waits */ int nwrite; /**< #synchronous writes */ int nread; /**< #synchronous reads */ int nawrite; /**< #asynchronous writes */ int naread; /**< #asynchronous reads */ double nb_write; /**< #synchronous bytes written */ double nb_read; /**< #synchronous bytes read */ double nb_awrite; /**< #asynchronous bytes written */ double nb_aread; /**< #asynchronous bytes read */ double t_write; /**< Wall seconds synchronous writing */ double t_read; /**< Wall seconds synchronous reading */ double t_awrite; /**< Wall seconds asynchronous writing */ double t_aread; /**< Wall seconds asynchronous reading */ double t_wait; /**< Wall seconds waiting */ long size; /**< size for MA hack */ long handle; /**< handle for MA hack */ char *pointer; /**< pointer for MA */ long openma; /**< open yes or no for MA to simulate file behavoir */ } file[EAF_MAX_FILES]; int eaf_flushbuf(int , eaf_off_t , const void *, size_t ); static int valid_fd(int fd) { return ( (fd >= 0) && (fd < EAF_MAX_FILES) && (file[fd].fname) ); } /** * Return wall_time in seconds as cheaply and as accurately as possible */ static double wall_time(void) { #ifdef EAF_STATS static int firstcall = 1; static unsigned firstsec, firstusec; double low, high; struct timeval tp; struct timezone tzp; if (firstcall) { (void) gettimeofday(&tp,&tzp); firstusec = tp.tv_usec; firstsec = tp.tv_sec; firstcall = 0; } (void) gettimeofday(&tp,&tzp); low = (double) (tp.tv_usec>>1) - (double) (firstusec>>1); high = (double) (tp.tv_sec - firstsec); return high + 1.0e-6*(low+low); #else /* EAF_STATS */ return 0.0; #endif /* EAF_STATS */ } /** * Open the named file returning the EAF file descriptor in fd. * Return 0 on success, non-zero on failure */ int EAF_Open(const char *fname, int type, int *fd) { int i=0, j=0, found=0; char *ptr; long handle, index; while ((i0) { found=1; break; } } #ifdef DEBUG printf(" JJJ %d III %d fname %s filejfname %s found %d type %d\n", j, i, fname, file[j].fname, found, type); #endif if(type > 0) { /* check if this file aka MA region labeled by fname is already open with size >=0*/ #ifdef DEBUG printf(" fname %s type %d found %d \n", fname, type, found); #endif if(found == 0 ) { file[i].size=type*1024*1024; #ifdef DEBUG printf(" fname %s type %lf alloc_get size %lf \n", fname, type, file[i].size); #endif if (!MA_alloc_get(MT_CHAR, file[i].size, fname, &handle, &index)) return EAF_ERR_OPEN; if ((i +1) > eafhack_openfiles) eafhack_openfiles++; /* MA hack: we pass type = sizeof MA alloc in megabytes */ MA_get_pointer(handle, &ptr); if (!(file[i].fname = strdup(fname))) return EAF_ERR_MEMORY; file[i].pointer=ptr; file[i].handle=handle; file[i].openma=1; }else{ #ifdef DEBUG printf(" found old fileMA %d size %ld \n", j, file[j].size); #endif /* need check if new size is <= old size*/ i=j; file[i].openma=1; } type=0; #ifdef DEBUG printf(" size %ld ptr %p \n", file[i].size, file[i].pointer); #endif }else{ if (!(file[i].fname = strdup(fname))) return EAF_ERR_MEMORY; if(type > 0) type = EAF_RW; #ifdef DEBUG printf(" opening regular %d eaf %s \n", i, fname); #endif if (!(file[i].elio_fd = elio_open(fname, type, ELIO_PRIVATE))) { free(file[i].fname); file[i].fname = 0; return ELIO_PENDING_ERR; } } file[i].nwait = file[i].nread = file[i].nwrite = file[i].naread = file[i].nawrite = 0; file[i].nb_read = file[i].nb_write = file[i].nb_aread = file[i].nb_awrite = file[i].t_read = file[i].t_write = file[i].t_wait = 0.0; file[i].type = type; *fd = i; return EAF_OK; } /** * Close the EAF file and return 0 on success, non-zero on failure */ int EAF_Close(int fd) { if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { #ifdef DEBUG printf(" maclosing %d %s \n", fd, file[fd].fname); #endif file[fd].openma=0; return 0; }else{ #ifdef DEBUG printf(" closing regular file %s fd %d \n", file[fd].fname, fd); #endif free(file[fd].fname); file[fd].fname = 0; return elio_close(file[fd].elio_fd); } } /** * Write the buffer to the file at the specified offset. * Return 0 on success, non-zero on failure */ int EAF_Write(int fd, eaf_off_t offset, const void *buf, size_t bytes) { double start = wall_time(); Size_t rc; if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { if((offset+bytes)>file[fd].size){ #if 1 printf("eaf_write failure: increase MA stack memory \n "); return EAF_ERR_WRITE; #else rc=0; printf("eaf_write: offset %ld larger than MA size %ld ptr %p \n", (long)(offset+bytes), file[fd].size, file[fd].pointer); rc=eaf_flushbuf(fd, offset, buf, bytes); printf("eaf_write: from flushbug rc %d bytes %d\n ", rc, bytes); #endif }else{ memcpy(((char*)file[fd].pointer)+(long)offset, buf, bytes); rc=bytes; } }else{ rc = elio_write(file[fd].elio_fd, (Off_t) offset, buf, (Size_t) bytes); } if (rc != ((Size_t)bytes)){ printf("eaf_write: rc ne bytes %ld bytes %ld\n ", rc, (long)bytes); if(rc < 0) return((int)rc); /* rc<0 means ELIO detected error */ else return EAF_ERR_WRITE; }else { file[fd].nwrite++; file[fd].nb_write += bytes; file[fd].t_write += wall_time() - start; return EAF_OK; } } /** * Initiate an asynchronous write of the buffer to the file at the * specified offset. Return in *req_id the ID of the request for * subsequent use in EAF_Wait/probe. The buffer may not be reused until * the operation has completed. * Return 0 on success, non-zero on failure */ int EAF_Awrite( int fd, eaf_off_t offset, const void *buf, size_t bytes, int *req_id) { double start = wall_time(); io_request_t req; int rc; if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { if(offset>file[fd].size){ rc=0; printf("eaf_awrite: offset %f larger than MA size %ld \n", offset, file[fd].size); return EAF_ERR_WRITE; }else{ memcpy(((char*)file[fd].pointer)+(long)offset, buf, bytes); rc=bytes; } }else{ rc = elio_awrite(file[fd].elio_fd, (Off_t)offset, buf, (Size_t)bytes, &req); } if(!rc){ *req_id = req; file[fd].nawrite++; file[fd].nb_awrite += bytes; } file[fd].t_awrite += wall_time() - start; return rc; } /** * Read the buffer from the specified offset in the file. * Return 0 on success, non-zero on failure */ int EAF_Read(int fd, eaf_off_t offset, void *buf, size_t bytes) { double start = wall_time(); Size_t rc; if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { if(offset>file[fd].size){ rc=0; printf("eaf_read: offset %f larger than MA size %ld \n", offset, file[fd].size); }else{ memcpy(buf, ((char*)file[fd].pointer)+(long)offset, bytes); rc=bytes; } }else{ rc = elio_read(file[fd].elio_fd, (Off_t) offset, buf, (Size_t) bytes); } if (rc != ((Size_t)bytes)){ if(rc < 0) return((int)rc); /* rc<0 means ELIO detected error */ else return EAF_ERR_READ; } else { file[fd].nread++; file[fd].nb_read += bytes; file[fd].t_read += wall_time() - start; return EAF_OK; } } /** * Initiate an asynchronous read of the buffer from the file at the * specified offset. Return in *req_id the ID of the request for * subsequent use in EAF_Wait/probe. The buffer may not be reused until * the operation has completed. * Return 0 on success, non-zero on failure */ int EAF_Aread(int fd, eaf_off_t offset, void *buf, size_t bytes, int *req_id) { double start = wall_time(); io_request_t req; int rc; if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { if(offset>file[fd].size){ rc=0; printf("eaf_aread: offset %f larger than MA size %ld \n", offset, file[fd].size); return EAF_ERR_READ; }else{ memcpy(file[fd].pointer, buf, bytes); rc=0; } }else{ rc = elio_aread(file[fd].elio_fd, (Off_t) offset, buf, (Size_t)bytes, &req); } if(!rc){ *req_id = req; file[fd].naread++; file[fd].nb_aread += bytes; } file[fd].t_aread += wall_time() - start; return rc; } /** * Wait for the I/O operation referred to by req_id to complete. * Return 0 on success, non-zero on failure */ int EAF_Wait(int fd, int req_id) { double start = wall_time(); int code; io_request_t req = req_id; if (file[fd].size > 0) { /* got nothin' to do */ }else{ code = elio_wait(&req); } file[fd].t_wait += wall_time() - start; file[fd].nwait++; return code; } /** * status returns 0 if the I/O operation reffered to by req_id * is complete, 1 otherwise. * Return 0 on success, non-zero on failure. */ int EAF_Probe(int req_id, int *status) { io_request_t req = req_id; int rc; #if 0 if (file[fd].size > 0) { /* got nothin' to do */ rc=0; }else{ rc = elio_probe(&req, status); } #else rc=0; #endif if(!rc) *status = !(*status == ELIO_DONE); return rc; } /** * Delete the named file. If the delete succeeds, or the file * does not exist, return 0. Otherwise return non-zero. */ int EAF_Delete(const char *fname) { /* if (access(fname, F_OK) == 0) if (unlink(fname)) return EAF_ERR_UNLINK; return EAF_OK; */ int j, found=0; /* get fd from fname */ for (j=0; (j< eafhack_openfiles); j++){ if(file[j].fname){ if(strcmp(file[j].fname,fname) == 0 && file[j].size >0) { found=1; break; } } } #ifdef DEBUG printf("eaf_delete: fname %s found %d \n", fname, found); if (found ==1) printf("eaf_delete: j %d filej.fname %s handle %d \n", j, file[j].fname,file[j].handle); #endif if (found > 0) { if(!MA_free_heap(file[j].handle)) { MA_summarize_allocated_blocks(); return EAF_ERR_UNLINK; } else file[j].fname= NULL; return EAF_OK; }else{ /* Now that ELIO files can have extents must call its routine to delete files */ if (elio_delete(fname) == ELIO_OK) return EAF_OK; else return EAF_ERR_UNLINK; } } /** * Return in *avail_mb and *fstype the amount of free space (in Mb) * and filesystem type (currenly UFS, PFS, or PIOFS) of the filesystem * associated with path. Path should be either a filename, or a directory * name ending in a slash (/). fslen should specify the size of the * buffer pointed to by fstype. * * Return 0 on success, non-zero on failure. */ int EAF_Stat(const char *path, long *avail_mb, char *fstype, int fslen) { char dirname[PATH_MAX]; stat_t statinfo; int rc; if ((rc = elio_dirname(path, dirname, sizeof(dirname)))) return rc; if ((rc = elio_stat(dirname, &statinfo))) return rc; if (fslen < 8) return EAF_ERR_TOO_SHORT; *avail_mb = (long)(statinfo.avail>>10); if (statinfo.fs == ELIO_UFS) strcpy(fstype, "UFS"); else if (statinfo.fs == ELIO_PFS) strcpy(fstype, "PFS"); else if (statinfo.fs == ELIO_PIOFS) strcpy(fstype, "PIOFS"); else strcpy(fstype, "UNKNOWN"); return EAF_OK; } /** * Return 0 if code corresponds to EOF, or non-zero. */ int EAF_Eof(int code) { return !(code == EAF_ERR_EOF); } /** * Return in msg (assumed to hold up to 80 characters) * a description of the error code obtained from an EAF call, * or an empty string if there is no such code */ void EAF_Errmsg(int code, char *msg) { if (code == EAF_OK) (void) strcpy(msg, "OK"); else if (code == EAF_ERR_EOF) (void) strcpy(msg, "end of file"); else if (code == EAF_ERR_MAX_OPEN) (void) strcpy(msg, "too many open files"); else if (code == EAF_ERR_MEMORY) (void) strcpy(msg, "memory allocation failed"); else if (code == EAF_ERR_OPEN) (void) strcpy(msg, "failed opening file"); else if (code == EAF_ERR_CLOSE) (void) strcpy(msg, "failed closing file"); else if (code == EAF_ERR_INVALID_FD) (void) strcpy(msg, "invalid file descriptor"); else if (code == EAF_ERR_WRITE) (void) strcpy(msg, "write failed"); else if (code == EAF_ERR_AWRITE) (void) strcpy(msg, "asynchronous write failed"); else if (code == EAF_ERR_READ) (void) strcpy(msg, "read failed"); else if (code == EAF_ERR_AREAD) (void) strcpy(msg, "asynchronous read failed"); else if (code == EAF_ERR_WAIT) (void) strcpy(msg, "wait failed"); else if (code == EAF_ERR_PROBE) (void) strcpy(msg, "probe failed"); else if (code == EAF_ERR_UNLINK) (void) strcpy(msg, "unlink failed"); else if (code == EAF_ERR_UNIMPLEMENTED) (void) strcpy(msg, "unimplemented operation"); else if (code == EAF_ERR_STAT) (void) strcpy(msg, "stat failed"); else if (code == EAF_ERR_TOO_SHORT) (void) strcpy(msg, "an argument string/buffer is too short"); else if (code == EAF_ERR_TOO_LONG) (void) strcpy(msg, "an argument string/buffer is too long"); else if (code == EAF_ERR_NONINTEGER_OFFSET) (void) strcpy(msg, "offset is not an integer"); else if (code == EAF_ERR_TRUNCATE) (void) strcpy(msg, "truncate failed"); else elio_errmsg(code, msg); } /** * Truncate the file to the specified length. * Return 0 on success, non-zero otherwise. */ int EAF_Truncate(int fd, eaf_off_t length) { #ifdef CRAY int rc; #endif if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; #ifdef CRAY /* ftruncate does not work with Cray FFIO, we need to implement it * as a sequence of generic close, truncate, open calls */ rc = elio_close(file[fd].elio_fd); if(rc) return rc; if(truncate(file[fd].fname, (off_t) length)) return EAF_ERR_TRUNCATE; if (!(file[fd].elio_fd = elio_open(file[fd].fname, file[fd].type, ELIO_PRIVATE))) { free(file[fd].fname); file[fd].fname = 0; return ELIO_PENDING_ERR; } #else if(elio_truncate(file[fd].elio_fd, (Off_t)length)) return EAF_ERR_TRUNCATE; #endif return EAF_OK; /* return elio_truncate(file[fd].elio_fd, (Off_t) length);*/ } /** * Return in length the length of the file. * Return 0 on success, nonzero on failure. */ int EAF_Length(int fd, eaf_off_t *length) { Off_t len; int rc; if (!valid_fd(fd)) return EAF_ERR_INVALID_FD; if (file[fd].size > 0) { // should be in MB??? if(file[fd].openma == 0) return EAF_ERR_INVALID_FD; len=file[fd].size; rc=0; }else{ rc = elio_length(file[fd].elio_fd, &len); } if(!rc) *length = (eaf_off_t) len; return rc; } /** * Print performance statistics for this file to standard output */ void EAF_Print_stats(int fd) { eaf_off_t len; double mbr, mbw, mbra, mbwa; if (!valid_fd(fd)) return; if (EAF_Length(fd, &len)) len = -1; printf("\n"); printf("------------------------------------------------------------\n"); #if HAVE_UNSIGNED_LONG_LONG_INT printf("EAF file %d: \"%s\" size=%llu bytes\n", fd, file[fd].fname, (unsigned long long) len); #else printf("EAF file %d: \"%s\" size=%lu bytes\n", fd, file[fd].fname, (unsigned long) len); #endif printf("------------------------------------------------------------\n"); printf(" write read awrite aread wait\n"); printf(" ----- ---- ------ ----- ----\n"); printf(" calls: %8d %8d %8d %8d %8d\n", file[fd].nwrite, file[fd].nread, file[fd].nawrite, file[fd].naread, file[fd].nwait); printf(" data(b): %.2e %.2e %.2e %.2e\n", file[fd].nb_write, file[fd].nb_read, file[fd].nb_awrite, file[fd].nb_aread); printf(" time(s): %.2e %.2e %.2e %.2e %.2e\n", file[fd].t_write, file[fd].t_read, file[fd].t_awrite, file[fd].t_aread, file[fd].t_wait); mbr = 0.0; mbw = 0.0; mbwa= 0.0; mbra= 0.0; if (file[fd].t_write > 0.0) mbw = file[fd].nb_write/(1e6*file[fd].t_write); if (file[fd].t_read > 0.0) mbr = file[fd].nb_read/(1e6*file[fd].t_read); if ((file[fd].t_wait + file[fd].t_aread) > 0.0) mbra = 1e-6*file[fd].nb_aread / (file[fd].t_wait + file[fd].t_aread); if ((file[fd].t_wait + file[fd].t_awrite) > 0.0) mbwa = 1e-6*file[fd].nb_awrite / (file[fd].t_wait + file[fd].t_awrite); /* Note that wait time does not distinguish between read/write completion so that entire wait time is counted in computing effective speed for async read & write */ if (mbwa+mbra) { printf("rate(mb/s): %.2e %.2e %.2e* %.2e*\n", mbw, mbr, mbwa, mbra); printf("------------------------------------------------------------\n"); printf("* = Effective rate. Full wait time used for read and write.\n\n"); } else { printf("rate(mb/s): %.2e %.2e\n", mbw, mbr); printf("------------------------------------------------------------\n\n"); } fflush(stdout); } int eaf_flushbuf(int fd, eaf_off_t offset, const void *buf, size_t bytes) /* once we run out of MA memory, let's open a real eaf file, flush the whole MA allocation to the file, plus the last bytes */ { int rc, fd_new; long masize, mahandle; char *mapointer, *oldfname; double start = wall_time(); /* invalidate old FD but do not deallocate MA */ masize=file[fd].size; mahandle=file[fd].handle; mapointer=file[fd].pointer; oldfname = malloc((unsigned) (strlen(file[fd].fname))); strcpy(oldfname, file[fd].fname); file[fd].fname= NULL; rc=EAF_Open(oldfname, EAF_RW, &fd_new); (void) free(oldfname); if (rc !=0 ) { printf(" flushbuf: open failure \n"); return rc; } /* flush MA */ rc = elio_write(file[fd_new].elio_fd, 0., (char*)mapointer, (Size_t) masize); /* write last bytes */ rc = elio_write(file[fd_new].elio_fd, (Off_t) file[fd].size , buf, (Size_t) bytes); if (rc != bytes){ printf(" flushbuf: write failure \n"); if(rc < 0) return((int)rc); /* rc<0 means ELIO detected error */ else return EAF_ERR_WRITE; }else { file[fd_new].nwrite++; file[fd_new].nb_write += file[fd].size; file[fd_new].nwrite++; file[fd_new].nb_write += bytes; file[fd_new].t_write += wall_time() - start; } if(!MA_free_heap(mahandle)) { MA_summarize_allocated_blocks(); return EAF_ERR_UNLINK; } /* swap fd with fd_new, is this too little?? */ fd = fd_new; return rc; } ga-5-4/pario/eaf/eaf.h0000644000175000017500000000213512662210477012611 0ustar mbamba#ifndef EAF_H #define EAF_H #if 0 /* This section used by both C and Fortran */ #endif #define EAF_RW -1 #define EAF_W -2 #define EAF_R -3 #ifndef EAF_FORTRAN /* This section used by only C */ /* This to ensure size_t is defined */ #include #include typedef double eaf_off_t; int EAF_Aread(int fd, eaf_off_t offset, void *buf, size_t bytes, int *req_id); int EAF_Awrite(int fd, eaf_off_t offset, const void *buf, size_t bytes, int *req_id); int EAF_Close(int fd); int EAF_Delete(const char *fname); int EAF_Eof(int code); void EAF_Errmsg(int code, char *msg); int EAF_Length(int fd, eaf_off_t *length); int EAF_Length(int fd, eaf_off_t *length); int EAF_Open(const char *fname, int type, int *fd); void EAF_Print_stats(int fd); int EAF_Probe(int id, int *status); int EAF_Read(int fd, eaf_off_t offset, void *buf, size_t bytes); int EAF_Stat(const char *path, long *avail_kb, char *fstype, int fslen); int EAF_Truncate(int fd, eaf_off_t length); int EAF_Wait(int fd, int id); int EAF_Write(int fd, eaf_off_t offset, const void *buf, size_t bytes); #endif #endif ga-5-4/pario/eaf/eaf.fh0000644000175000017500000000123112662210477012753 0ustar mbamba#ifndef EAF_FORTRAN #define EAF_FORTRAN #endif #include "eaf.h" integer eaf_write, eaf_awrite, eaf_read, eaf_aread integer eaf_wait, eaf_probe, eaf_close, eaf_open integer eaf_delete, eaf_stat, eaf_length, eaf_truncate logical eaf_eof integer eaf_util_szint double precision eaf_util_random external eaf_write, eaf_awrite, eaf_read, eaf_aread external eaf_wait, eaf_probe, eaf_close, eaf_open external eaf_delete, eaf_stat, eaf_length, eaf_truncate external eaf_eof external eaf_util_random,eaf_util_szint integer eaf_rw, eaf_r, eaf_w parameter (eaf_rw=EAF_RW, eaf_r=EAF_R, eaf_w=EAF_W) ga-5-4/pario/eaf/eafP.h0000644000175000017500000000161612662210477012734 0ustar mbamba#ifndef EAFP_H #define EAFP_H /* These macros are for EAF internal use only. EOF_OK must be 0. */ #define EAF_OK 0 #define EAF_ERR_EOF -10001 #define EAF_ERR_MAX_OPEN -10002 #define EAF_ERR_MEMORY -10003 #define EAF_ERR_OPEN -10004 #define EAF_ERR_CLOSE -10005 #define EAF_ERR_INVALID_FD -10006 #define EAF_ERR_WRITE -10007 #define EAF_ERR_AWRITE -10008 #define EAF_ERR_READ -10009 #define EAF_ERR_AREAD -10010 #define EAF_ERR_WAIT -10011 #define EAF_ERR_PROBE -10012 #define EAF_ERR_UNLINK -10013 #define EAF_ERR_UNIMPLEMENTED -10014 #define EAF_ERR_STAT -10015 #define EAF_ERR_TOO_SHORT -10016 #define EAF_ERR_TOO_LONG -10017 #define EAF_ERR_NONINTEGER_OFFSET -10018 #define EAF_ERR_TRUNCATE -10019 #define EAF_ERR_LENGTH -10020 #endif ga-5-4/pario/eaf/eaf.doc0000644000175000017500000001020212662210477013121 0ustar mbambaHere is the Fortran interface. Below this is the C interface with a full description of each parameter. FORTRAN interface ----------------- All functions return an integer error code with the value zero implying success, non-zero implying some error condition. Offsets are doubles and an offset with a fractional component generates an error. The include file "eaf.fh" defines all of the functions along with EAF_R, EAF_W and EAF_rw. integer function eaf_write(fd, offset, buf, bytes) integer function eaf_read (fd, offset, buf, bytes) integer function eaf_awrite(fd, offset, buf, bytes, req_id) integer function eaf_aread (fd, offset, buf, bytes, req_id) integer function eaf_wait(fd, req_id) integer function eaf_probe(req_id, status) integer function eaf_open(fname, type, fd) [type can be one of EAF_R, EAF_RW, and EAF_W] integer function eaf_close(fd) integer function eaf_delete(fname) integer function eaf_length(fd) integer function eaf_truncate(fd, offset) logical function eaf_eof(ierr) Returns true if ierr corresponds to EOF subroutine eaf_errmsg(ierr,message) Returns a string interpretation of the error code, or an empty string (Fortran all blanks, C null first character) if the error code is not recognized. integer function eaf_stat(fname, avail, fstype) subroutine eaf_print_stats(fd) C interface ----------- int eaf_open(const char *fname, int type, int *fd) /* Open the named file returning the EAF file descriptor in fd. Return 0 on success, non-zero on failure */ void eaf_print_stats(int fd) /* Print performance statistics for this file to standard output */ int eaf_close(int fd) /* Close the EAF file and return 0 on success, non-zero on failure */ int eaf_write(int fd, eaf_off_t offset, const void *buf, size_t bytes) /* Write the buffer to the file at the specified offset. Return 0 on success, non-zero on failure */ int eaf_awrite(int fd, eaf_off_t offset, const void *buf, size_t bytes, int *req_id) /* Initiate an asynchronous write of the buffer to the file at the specified offset. Return in *req_id the ID of the request for subsequent use in eaf_wait/probe. The buffer may not be reused until the operation has completed. Return 0 on success, non-zero on failure */ int eaf_read(int fd, eaf_off_t offset, void *buf, size_t bytes) /* Read the buffer from the specified offset in the file. Return 0 on success, non-zero on failure */ int eaf_aread(int fd, eaf_off_t offset, void *buf, size_t bytes, int *req_id) /* Initiate an asynchronous read of the buffer from the file at the specified offset. Return in *req_id the ID of the request for subsequent use in eaf_wait/probe. The buffer may not be reused until the operation has completed. Return 0 on success, non-zero on failure */ int eaf_wait(int fd, int req_id) /* Wait for the I/O operation referred to by req_id to complete. Return 0 on success, non-zero on failure */ int eaf_probe(int req_id, int *status) /* *status returns 0 if the I/O operation reffered to by req_id is complete, 1 otherwise. Return 0 on success, non-zero on failure. */ int eaf_delete(const char *fname) /* Delete the named file. If the delete succeeds, or the file does not exist, return 0. Otherwise return non-zero. */ int eaf_length(int fd, eaf_off_t *length) /* Return in *length the length of the given file. Reutrn 0 on success, non-zero on failure */ int eaf_stat(const char *path, int *avail_kb, char *fstype, int fslen) /* Return in *avail_kb and *fstype the amount of free space (in Kb) and filesystem type (currenly UFS, PFS, or PIOFS) of the filesystem associated with path. Path should be either a filename, or a directory name ending in a slash (/). fslen should specify the size of the buffer pointed to by fstype. Return 0 on success, non-zero on failure. */ int eaf_eof(int code) /* Return 0 if code corresponds to EOF, or non-zero. */ void eaf_errmsg(int code, char *msg) /* Return in msg (assumed to hold up to 80 characters) a description of the error code obtained from an EAF call, or an empty string if there is no such code */ ga-5-4/pario/eaf/eaf_f2c.c0000644000175000017500000001263612662210477013345 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_MATH_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif #include "eaf.h" #include "eafP.h" #include "typesf2c.h" #include "farg.h" #if defined(CRAY) && defined(__crayx1) #undef CRAY #endif #define eaf_aread_ F77_FUNC_(eaf_aread,EAF_AREAD) #define eaf_awrite_ F77_FUNC_(eaf_awrite,EAF_AWRITE) #define eaf_close_ F77_FUNC_(eaf_close,EAF_CLOSE) #define eaf_delete_ F77_FUNC_(eaf_delete,EAF_DELETE) #define eaf_eof_ F77_FUNC_(eaf_eof,EAF_EOF) #define eaf_errmsg_ F77_FUNC_(eaf_errmsg,EAF_ERRMSG) #define eaf_error_ F77_FUNC_(eaf_error,EAF_ERROR) #define eaf_length_ F77_FUNC_(eaf_length,EAF_LENGTH) #define eaf_open_ F77_FUNC_(eaf_open,EAF_OPEN) #define eaf_print_stats_ F77_FUNC_(eaf_print_stats,EAF_PRINT_STATS) #define eaf_probe_ F77_FUNC_(eaf_probe,EAF_PROBE) #define eaf_read_ F77_FUNC_(eaf_read,EAF_READ) #define eaf_stat_ F77_FUNC_(eaf_stat,EAF_STAT) #define eaf_truncate_ F77_FUNC_(eaf_truncate,EAF_TRUNCATE) #define eaf_util_random_ F77_FUNC_(eaf_util_random,EAF_UTIL_RANDOM) #define eaf_util_szint_ F77_FUNC_(eaf_util_szint,EAF_UTIL_SZINT) #define eaf_wait_ F77_FUNC_(eaf_wait,EAF_WAIT) #define eaf_write_ F77_FUNC_(eaf_write,EAF_WRITE) static int valid_offset(double offset) { return ((offset - ((double) ((eaf_off_t) offset))) == 0.0); } Integer FATR eaf_write_(Integer *fd, double *offset, const void *buf, Integer *bytes) { if (!valid_offset(*offset)) return EAF_ERR_NONINTEGER_OFFSET; return (Integer) EAF_Write((int) *fd, (eaf_off_t) *offset, buf, (size_t) *bytes); } Integer FATR eaf_awrite_(Integer *fd, double *offset, const void *buf, Integer *bytes, Integer *req_id) { int req, status; if (!valid_offset(*offset)) return EAF_ERR_NONINTEGER_OFFSET; status = EAF_Awrite((int) *fd, (eaf_off_t) *offset, buf, (size_t) *bytes, &req); *req_id = (Integer) req; return (Integer) status; } Integer FATR eaf_read_(Integer *fd, double *offset, void *buf, Integer *bytes) { if (!valid_offset(*offset)) return EAF_ERR_NONINTEGER_OFFSET; return (Integer) EAF_Read((int) *fd, (eaf_off_t) *offset, buf, (size_t) *bytes); } Integer FATR eaf_aread_(Integer *fd, double *offset, void *buf, Integer *bytes, Integer *req_id) { int req, status; if (!valid_offset(*offset)) return EAF_ERR_NONINTEGER_OFFSET; status = EAF_Aread((int) *fd, (eaf_off_t) *offset, buf, (size_t) *bytes, &req); *req_id = (Integer) req; return (Integer) status; } Integer FATR eaf_wait_(Integer *fd, Integer *id) { return (Integer) EAF_Wait((int) *fd, (int) *id); } void FATR eaf_print_stats_(Integer *fd) { EAF_Print_stats((int) *fd); } Integer FATR eaf_truncate_(Integer *fd, double *length) { return (Integer) EAF_Truncate((int) *fd, (eaf_off_t) *length); } Integer FATR eaf_probe_(Integer *id, Integer *status) { int s, code; code = EAF_Probe((int) *id, &s); *status = (Integer) s; return (Integer) code; } Integer FATR eaf_close_(Integer *fd) { return (Integer) EAF_Close((int) *fd); } Integer FATR eaf_length_(Integer *fd, double *length) { eaf_off_t len; int code; code = EAF_Length((int) *fd, &len); if (!code) *length = (double) len; return code; } logical eaf_eof_(Integer *code) { return (logical) EAF_Eof((int) *code); } Integer FATR eaf_open_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *fname, Integer *type, Integer *fd, int flen #else char *fname, int flen, Integer *type, Integer *fd #endif ) { char buf[1024]; int code, tmp; ga_f2cstring(fname, flen, buf, sizeof(buf)); /* return (Integer) EAF_ERR_TOO_LONG; TODO errcheck? */ code = EAF_Open(buf, (int) *type, &tmp); *fd = (Integer) tmp; return (Integer)code; } Integer FATR eaf_delete_(char *fname, int flen) { char buf[1024]; ga_f2cstring(fname, flen, buf, sizeof(buf)); /* return (Integer) EAF_ERR_TOO_LONG; TODO errcheck? */ return (Integer) EAF_Delete(buf); } Integer FATR eaf_stat_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *path, Integer *avail_kb, char *fstype, int pathlen, int fslen #else char *path, int pathlen, Integer *avail_kb, char *fstype, int fslen #endif ) { char pbuf[1024]; char fbuf[32]; int code; long kb; ga_f2cstring(path, pathlen, pbuf, sizeof(pbuf)); /* return (Integer) EAF_ERR_TOO_LONG; TODO errcheck? */ code = EAF_Stat(pbuf, &kb, fbuf, sizeof(fbuf)); if (!code) { ga_c2fstring(fbuf, fstype, fslen); /* return (Integer) EAF_ERR_TOO_SHORT; TODO errcheck? */ *avail_kb = (double) kb; } return code; } void FATR eaf_errmsg_(Integer *code, char *msg, int msglen) { char buf[80]; EAF_Errmsg((int) *code, buf); (void) ga_c2fstring(buf, msg, msglen); } double FATR eaf_util_random_(Integer* seed) { #ifdef NEC if(*seed) srand((unsigned) *seed); return ((double) rand())*4.6566128752458e-10; #else if(*seed) srandom((unsigned) *seed); return ((double) random())*4.6566128752458e-10; #endif } Integer FATR eaf_util_szint_() { return (Integer)sizeof(Integer); } ga-5-4/pario/pabody0000755000175000017500000000455012662210477012361 0ustar mbamba#!/usr/local/bin/perl print "Enter ascii SDDF file: "; #$file = ; $file = "pab.ascii"; open(infile,"$file") || (chop($file) && (die "can't open \"$file\": $!\n")); print "Enter output Upshot file: "; #$file = ; $file = "pab.out"; open(outfile,">$file"); print "\n"; $generic_trace_first = 0; $open_flag = 0; $close_flag = 0; $write_flag = 0; $first{'"Open"'} = 0; $first{'"Close"'} = 0; $first{'"Write"'} = 0; $first{'"Read"'} = 0; $first{'"Seek"'} = 0; while () { if (/"Generic Interval"/) { if ($generic_trace_first == 0) { $generic_trace_first = 1; print "Skipping first: ", $0, "\n"; next; }; $junk = ; $junk = ; $junk = ; $useful = ; $useful =~ /\}, (.+), (.+), (.+), (.+),/; $useful =~ /\}, ([0-9].[0-9]+), ([0-9]+), ([0-9].[0-9]+),/; # print $1," | ", $2," | ", $3," | ", $4," |\n"; $endtime = $1; $eventid = $2; $procid = $3; $duration = $4; $starttime = $endtime - $duration; $starttime = $starttime * 1000000.0; $starttime = int($starttime); # print $starttime, "\n"; $endtime = $endtime * 1000000.0; $endtime = int($endtime); # $endevent = $eventid + 1000; $endevent = $eventid + 1; print outfile $eventid, " ", $procid, " ", 0, " ", 0, " ", 0, " ", $starttime, "\n"; print outfile $endevent, " ", $procid, " ", 0, " ", 0, " ", 0, " ", $endtime, "\n"; } if (/"Open"/ || /"Close"/ || /"Write"/ || /"Read"/ || /"Seek"/) { if( $first_time{ $_ } == 0 ) { $first_time{ $_ } = 1; next; }; $junk = ; $junk = ; $junk = ; $useful = ; $useful =~ /\}, (.+), (\d+), (\d+), (.+), (\d+)/; # print $1, " ", $2, " ", $3, " ", $4, "\n"; $starttime = $1; $eventid = $2; $procid = $3; $duration = $4; $endtime = $starttime + $duration; $starttime = $starttime * 1000000.0; $starttime = int($starttime); # print $starttime, "\n"; $endtime = $endtime * 1000000.0; $endtime = int($endtime); $endevent = $eventid + 1000; print outfile $eventid, " ", $procid, " ", 0, " ", 0, " ", 0, " ", $starttime, "\n"; print outfile $endevent, " ", $procid, " ", 0, " ", 0, " ", 0, " ", $endtime, "\n"; } } close outfile; close infile; ga-5-4/pario/pablo2upshot0000755000175000017500000000302412662210476013517 0ustar mbamba#!/bin/csh -f /home/aydt/pablo/bin/SDDFconverter << CONV_END Pablo.bin a pab.ascii n CONV_END ./pabody /bin/rm -f pab.sort pab.upshot sort -n +5 pab.out > pab.sort set nevents=`wc pab.sort | awk '{print $1}'` set tfirst=`head -1 pab.sort | awk '{print $6}'` set tlast=`tail -1 pab.sort | awk '{print $6}'` cat > pab.upshot << END_HEADER -1 0 0 0 0 0 sddf -2 0 0 $nevents 0 0 -3 0 0 1 0 0 -4 0 0 1 0 0 -5 0 0 10 0 0 -6 0 0 0 0 $tfirst -7 0 0 0 0 $tlast -8 0 0 1 0 0 -11 0 0 0 0 4294967295 -13 0 700001 701001 0 0 blue: Native Open -13 0 700003 701003 0 0 blue: Native fopen -13 0 700005 701005 0 0 red: Native close -13 0 700007 701007 0 0 red: Native fclose -13 0 700009 701009 0 0 green: Native read -13 0 700011 701011 0 0 green: Native fread -13 0 700013 701013 0 0 yellow: Native lseek -13 0 700015 701015 0 0 yellow: Native fseek -13 0 700017 701017 0 0 magenta: Native write -13 0 700019 701019 0 0 magenta: Native fwrite -13 0 710000 711000 0 0 chocolate1: elio_write -13 0 710001 711001 0 0 chocolate4: elio_awrite -13 0 710002 711002 0 0 brown1: elio_read -13 0 710003 711003 0 0 brown4: elio_aread -13 0 710004 711004 0 0 LightSalmon1: elio_probe -13 0 710005 711005 0 0 LightSalmon4: elio_wait -13 0 710006 711006 0 0 coral1: elio_stat -13 0 710007 711007 0 0 coral4: elio_open -13 0 710009 711009 0 0 DeepPink1: elio_close -13 0 710010 711010 0 0 DeepPink4: elio_set_cb -13 0 710011 711011 0 0 HotPink1: elio_delete -13 0 710012 711012 0 0 HotPink4: elio_init END_HEADER cat pab.sort >> pab.upshot #/bin/rm -f pab.sort pab.out pab.ascii ga-5-4/pario/sf/0000755000175000017500000000000012662210477011561 5ustar mbambaga-5-4/pario/sf/sf_capi.c0000644000175000017500000000440112662210477013330 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_MALLOC_H # include #endif #if HAVE_STDLIB_H # include #endif #include "typesf2c.h" #include "sf.h" #include "sff2c.h" int SF_Create(char* fname, SFsize_t size_hard_limit, SFsize_t size_soft_limit, SFsize_t req_size, int *handle) { Integer s_a; int retcode = sfi_create(fname, &size_hard_limit, &size_soft_limit, &req_size, &s_a); *handle = s_a; return retcode; } int SF_Create_suffix(char* fname, SFsize_t size_hard_limit, SFsize_t size_soft_limit, SFsize_t req_size, int *handle, int suffix) { Integer s_a; Integer isuffix = suffix; int retcode = sfi_create_suffix(fname, &size_hard_limit, &size_soft_limit, &req_size, &s_a, &isuffix); *handle = s_a; return retcode; } int SF_Destroy(int handle) { Integer s_a = handle; return sf_destroy_(&s_a); } int SF_Rwtor(int handle) { Integer s_a = handle; return sf_rwtor_(&s_a); } int SF_Open(int handle) { Integer s_a = handle; return sf_open_(&s_a); } int SF_Close(int handle) { Integer s_a = handle; return sf_close_(&s_a); } int SF_Fsync(int handle) { Integer s_a = handle; return sf_fsync_(&s_a); } int SF_Write(int handle, SFsize_t offset, SFsize_t bytes, char *buffer, int *req_id) { Integer s_a = handle; Integer id; int retcode = sf_write_(&s_a, &offset, &bytes, buffer, &id); *req_id = id; return retcode; } int SF_Read(int handle, SFsize_t offset, SFsize_t bytes, char *buffer, int *req_id) { Integer s_a = handle; Integer id; int retcode = sf_read_(&s_a, &offset, &bytes, buffer, &id); *req_id = id; return retcode; } int SF_Wait(int *req_id) { Integer id = (Integer)*req_id; int retcode = sf_wait_(&id); *req_id = id; return retcode; } int SF_Waitall(int *list, int num) { Integer *copy = (Integer*)malloc(num * sizeof(Integer)); Integer inum = num; int retcode; int i; for (i=0; i #endif #include "ga.h" #include "elio.h" #include "sf.h" #include "sff2c.h" #define _max_shared_files 100 #define SF_OFFSET 3000 #define SF_FAIL (Integer)1 typedef struct{ Integer handle; Integer actv; SFsize_t soft_size; SFsize_t hard_size; Fd_t fd; char fname[200]; } SF_t; SF_t SF[_max_shared_files]; #include "coms.h" /******************** internal macros ********************************/ #define sfi_check_handleM(_handle, msg)\ {\ if(_handle+SF_OFFSET >=_max_shared_files||_handle+SF_OFFSET<0) { \ fprintf(stderr,"%s, %ld --",msg,(long) _max_shared_files); \ ERROR("invalid SF handle",(int)_handle); \ } \ if( SF[(_handle+SF_OFFSET)].actv == 0) { \ fprintf(stderr,"%s:",msg); \ ERROR("disk array not active",(int)_handle); \ } \ } /*********************************************************************/ Integer sfi_get_handle() { Integer sf_handle =-1, candidate = 0; do{ if(!SF[candidate].actv){ sf_handle=candidate; SF[candidate].actv =1; } candidate++; }while(candidate < _max_shared_files && sf_handle == -1); return(sf_handle); } void sfi_release_handle(Integer *handle) { SF[*handle+SF_OFFSET].actv =0; *handle = 0; } Integer sfi_create(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle) { Integer hndl; SYNC(); /*** Get next free SF handle ***/ if( (hndl = sfi_get_handle()) == -1) ERROR("sf_create: too many shared files ",(int)_max_shared_files); *handle = hndl - SF_OFFSET; /*generate file name(s) */ sprintf(SF[hndl].fname,"%s.%d",fname, (int)hndl); if (ME() == 0) SF[hndl].fd = elio_open(SF[hndl].fname,ELIO_RW, ELIO_SHARED); SYNC(); if (ME() != 0) SF[hndl].fd = elio_open(SF[hndl].fname,ELIO_RW, ELIO_SHARED); if(SF[hndl].fd==NULL) ERROR("sf_create: could not open file",0); if(SF[hndl].fd->fd==-1) ERROR("sf_create: descriptor -1",0); SF[hndl].soft_size = *size_soft_limit; SF[hndl].hard_size = *size_hard_limit; SYNC(); return(ELIO_OK); } /** * takes an additional input suffix which is appended to the filename instead * of the handle. This will give users complete control over the filename as it * is written to and read from disk. */ Integer sfi_create_suffix(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix) { Integer hndl; SYNC(); /*** Get next free SF handle ***/ if( (hndl = sfi_get_handle()) == -1) { ERROR("sf_create_suffix: too many shared files ", (int)_max_shared_files); } *handle = hndl - SF_OFFSET; /*generate file name(s) */ sprintf(SF[hndl].fname,"%s.%d",fname, (int) *suffix); if (ME() == 0) SF[hndl].fd = elio_open(SF[hndl].fname,ELIO_RW, ELIO_SHARED); SYNC(); if (ME() != 0) SF[hndl].fd = elio_open(SF[hndl].fname,ELIO_RW, ELIO_SHARED); if(SF[hndl].fd==NULL) ERROR("sf_create_suffix: could not open file",0); if(SF[hndl].fd->fd==-1) ERROR("sf_create_suffix: descriptor -1",0); SF[hndl].soft_size = *size_soft_limit; SF[hndl].hard_size = *size_hard_limit; SYNC(); return(ELIO_OK); } /*****************************************************************************/ Integer FATR sf_destroy_(Integer *s_a /**< [in] SF handle */) { Integer handle = *s_a+SF_OFFSET; SYNC(); sfi_check_handleM(*s_a,"sf_delete"); elio_close(SF[handle].fd); /* fix from Peter Knowles */ SYNC(); /* this sync is unnecessary under Unix */ if(ME() == 0)elio_delete(SF[handle].fname); sfi_release_handle(s_a); SYNC(); return(ELIO_OK); } /** * close rw file and open as read only */ Integer FATR sf_rwtor_(Integer *s_a /**< [in] SF handle */) { Integer handle = *s_a+SF_OFFSET; elio_close(SF[handle].fd); SF[handle].fd = elio_open(SF[handle].fname,ELIO_R, ELIO_SHARED); if(SF[handle].fd==NULL) ERROR("sf_open: could not open file",0); if(SF[handle].fd->fd==-1) ERROR("sf_open: descriptor -1",0); return(ELIO_OK); } /** * open */ Integer FATR sf_open_(Integer *s_a /**< [in] SF handle */) { Integer handle = *s_a+SF_OFFSET; SF[handle].fd = elio_open(SF[handle].fname,ELIO_RW, ELIO_SHARED); if(SF[handle].fd==NULL) ERROR("sf_open: could not open file",0); if(SF[handle].fd->fd==-1) ERROR("sf_open: descriptor -1",0); return(ELIO_OK); } /** * close */ Integer FATR sf_close_(Integer *s_a) { Integer handle = *s_a+SF_OFFSET; elio_close(SF[handle].fd); return(ELIO_OK); } /** * fsync */ Integer FATR sf_fsync_(Integer *s_a) { Integer handle = *s_a+SF_OFFSET; elio_fsync(SF[handle].fd); return(ELIO_OK); } /** * asynchronous write to shared file */ Integer FATR sf_write_(Integer *s_a, SFsize_t *offset, SFsize_t *bytes, char *buffer, Integer *req_id) { Integer handle = *s_a+SF_OFFSET; int status; io_request_t id; sfi_check_handleM(*s_a,"sf_write"); status = elio_awrite(SF[handle].fd, (Off_t)*offset, buffer, (Size_t)*bytes, &id); *req_id = (Integer)id; return((Integer)status); /* status = elio_write(SF[handle].fd, (Off_t)*offset, buffer,(Size_t)*bytes); *req_id = (Integer)ELIO_DONE; if(status != (int)*bytes) return((Integer)SF_FAIL); else return((Integer)ELIO_OK); */ } /** * asynchronous read from shared file */ Integer FATR sf_read_(Integer *s_a, SFsize_t *offset, SFsize_t *bytes, char *buffer, Integer *req_id) { Integer handle = *s_a+SF_OFFSET; int status; io_request_t id; sfi_check_handleM(*s_a,"sf_read"); status = elio_aread(SF[handle].fd, (Off_t)*offset, buffer, (Size_t)*bytes, &id); *req_id = (Integer)id; return((Integer)status); } /** * block calling process until I/O operation completes */ Integer FATR sf_wait_(Integer *req_id) { int status; io_request_t id = (io_request_t) *req_id; status = elio_wait(&id); *req_id = (Integer)id; return((Integer)status); } /** * block calling process until all I/O operations associated * with id in the list complete */ Integer FATR sf_waitall_(Integer *list, Integer *num) { int i; int status, fail=0; for(i=0;i<*num;i++){ io_request_t id = (io_request_t) list[i]; status = elio_wait(&id); if(status != ELIO_OK) fail++; list[i] = (Integer)id; } if (fail)return((Integer)SF_FAIL); else return((Integer)ELIO_OK); } /** * retrieve message associated with error code */ void sfi_errmsg(int code, char *msg) { if(code==SF_FAIL) (void) strcpy(msg, "SF operation failed"); else elio_errmsg(code, msg); } ga-5-4/pario/sf/coms.h0000644000175000017500000000032512662210477012673 0ustar mbamba/*************** interface to a parallel communication system ********/ # include "ga.h" # define SYNC GA_Sync # define NPROC GA_Nnodes # define ME GA_Nodeid # define ERROR GA_Error ga-5-4/pario/sf/sf.h0000644000175000017500000000154612662210477012350 0ustar mbamba#ifndef SF_H_ #define SF_H_ typedef double SFsize_t; #include "typesf2c.h" extern int SF_Create(char* fname, SFsize_t size_hard_limit, SFsize_t size_soft_limit, SFsize_t req_size, int *handle); extern int SF_Create_suffix(char* fname, SFsize_t size_hard_limit, SFsize_t size_soft_limit, SFsize_t req_size, int *handle, int suffix); extern int SF_Destroy(int handle); extern int SF_Rwtor(int handle); extern int SF_Open(int handle); extern int SF_Close(int handle); extern int SF_Fsync(int handle); extern int SF_Write(int handle, SFsize_t offset, SFsize_t bytes, char *buffer, int *req_id); extern int SF_Read(int handle, SFsize_t offset, SFsize_t bytes, char *buffer, int *req_id); extern int SF_Wait(int *req_id); extern int SF_Waitall(int *list, int num); extern void SF_Errmsg(int code, char *msg); #endif /* SF_H_ */ ga-5-4/pario/sf/sf_fortran.c0000644000175000017500000000312512662210477014071 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STRING_H # include #endif #include "sf.h" #include "sff2c.h" #include "farg.h" #define MAX_NAME 256 static char cname[MAX_NAME+1]; Integer FATR sf_create_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, int len #else char *fname, int len, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle #endif ) { ga_f2cstring(fname, len, cname, MAX_NAME); return sfi_create(cname, size_hard_limit, size_soft_limit, req_size, handle); } Integer FATR sf_create_suffix_( #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix, int len #else char *fname, int len, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix #endif ) { ga_f2cstring(fname, len, cname, MAX_NAME); return sfi_create_suffix(cname, size_hard_limit, size_soft_limit, req_size, handle, suffix); } /*****************************************************************************/ void FATR sf_errmsg_(Integer *code, char *msg, int msglen) { char buf[80]; sfi_errmsg((int) *code, buf); (void) ga_c2fstring(buf, msg, msglen); } ga-5-4/pario/sf/sff2c.h0000644000175000017500000000471712662210477012746 0ustar mbamba#ifndef SFF2C_H_ #define SFF2C_H_ #define sf_close_ F77_FUNC_(sf_close,SF_CLOSE) #define sf_create_ F77_FUNC_(sf_create,SF_CREATE) #define sf_create_suffix_ F77_FUNC_(sf_create_suffix,SF_CREATE_SUFFIX) #define sf_destroy_ F77_FUNC_(sf_destroy,SF_DESTROY) #define sf_errmsg_ F77_FUNC_(sf_errmsg,SF_ERRMSG) #define sf_open_ F77_FUNC_(sf_open,SF_OPEN) #define sf_read_ F77_FUNC_(sf_read,SF_READ) #define sf_rwtor_ F77_FUNC_(sf_rwtor,SF_RWTOR) #define sf_waitall_ F77_FUNC_(sf_waitall,SF_WAITALL) #define sf_wait_ F77_FUNC_(sf_wait,SF_WAIT) #define sf_write_ F77_FUNC_(sf_write,SF_WRITE) #define sf_fsync_ F77_FUNC_(sf_fsync,SF_FSYNC) extern Integer sfi_create(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle); extern Integer sfi_create_suffix(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix); extern void sfi_errmsg(int code, char *msg); extern Integer FATR sf_close_(Integer *s_a); extern Integer FATR sf_destroy_(Integer *s_a); extern Integer FATR sf_open_(Integer *s_a); extern Integer FATR sf_read_(Integer *s_a, SFsize_t *offset, SFsize_t *bytes, char *buffer, Integer *req_id); extern Integer FATR sf_rwtor_(Integer *s_a); extern Integer FATR sf_waitall_(Integer *list, Integer *num); extern Integer FATR sf_wait_(Integer *req_id); extern Integer FATR sf_write_(Integer *s_a, SFsize_t *offset, SFsize_t *bytes, char *buffer, Integer *req_id); extern Integer FATR sf_fsync_(Integer *s_a); #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS extern Integer sf_create(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, int len); extern Integer sf_create_suffix(char *fname, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix, int len); extern void sf_errmsg(Integer *code, char *msg, int len); #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ extern Integer sf_create(char *fname, int len, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle); extern Integer sf_create_suffix(char *fname, int len, SFsize_t *size_hard_limit, SFsize_t *size_soft_limit, SFsize_t *req_size, Integer *handle, Integer *suffix); extern void sf_errmsg(Integer *code, char *msg, int len); #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ #endif /* SFF2C_H_ */ ga-5-4/tcgmsg/0000755000175000017500000000000012662210373011316 5ustar mbambaga-5-4/tcgmsg/examples/0000755000175000017500000000000012662210373013134 5ustar mbambaga-5-4/tcgmsg/examples/cscf60lin.h0000644000175000017500000000330112662210373015071 0ustar mbamba/*$Id: cscf60lin.h,v 1.2 1995-02-02 23:24:04 d3g681 Exp $*/ c c include file defining common /cscf/ c c natom = no. of atoms (constant parameter) c nbfn = no. of basis functions (constant parameter) c nnbfn = nbfn*(nbfn+1)/2 (constant parameter) c nocc = no. of occupied orbitals (constant parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (natom = 4, nbfn = 60, nocc = 8, mxiter = 20) parameter (nnbfn = nbfn*(nbfn+1)/2, pi = 3.141592653589793d0) parameter (tol= 1.0d-4) parameter (tol2e=1.0d-6) c common /cscf/ $ enrep, q(natom), ax(natom), ay(natom), az(natom), $ x(nbfn), y(nbfn), z(nbfn), expnt(nbfn), rnorm(nbfn), $ iky(nbfn), icut1, icut2, icut3 c ga-5-4/tcgmsg/examples/mc.f0000644000175000017500000001241312662210373013703 0ustar mbamba program he C$Id: mc.f,v 1.2 1995-02-02 23:24:16 d3g681 Exp $ implicit double precision (a-h, o-z) include 'msgtypesf.h' parameter (maxpt=512) dimension x(6,maxpt), psix(maxpt), ex(maxpt) data esq/0.0d0/ c c Monte Carlo Test Program ... evaluates the expectation c value of the energy for a simple wavefunction for helium. c c Initalize the message passing environment c call pbeginf call evon c c process zero reads in input and then broadcasts to others c if (nodeid().eq.0) then write(6,1) 1 format(' He atom variational monte carlo '// & ' Input neq and nstep '$) c call flush(6) read(5,*) neq, nstep nstep = ( (nstep+99)/100 ) * 100 neq = ( (neq+99)/100 ) * 100 endif call brdcst(1+MSGINT, neq, mitob(1), 0) call brdcst(1+MSGINT, nstep, mitob(1), 0) c c Divide up the work ... each process does a subset of the points c or configurations ... make sure that total is indeed maxpt c nproc = nnodes() npoint = maxpt / nproc nremain = maxpt - npoint*nproc if (nodeid().lt.nremain) npoint = npoint + 1 c c Actually do the work. Routine init generates the intial points c in a 2x2x2 cube. Equilibriate for neq moves then compute averages c for nstep moves. c rjunk = timer() call init(npoint, x, psix) call mover(x, psix, ex, e, esq, npoint, neq) call mover(x, psix, ex, e, esq, npoint, nstep) c c Sum the results from all the processors c call dgop(2+MSGDBL, e, 1, '+') call dgop(3+MSGDBL, esq, 1, '+') c c Write out the results before terminating c if (nodeid().eq.0) then e = e / dble(nproc) esq = esq / dble(nproc) err = sqrt((esq-e*e) / dble(nproc*nstep/100)) used = timer() write(6,2) e, err, used, nproc 2 format(' energy =',f10.6,' +/-',f9.6,': used =',f7.2,' secs', $ ': nproc =',i3) endif c call pend call fexit c end subroutine mover(x, psix, ex, e, esq, npoint, nstep) implicit double precision (a-h, o-z) dimension x(6,npoint), psix(npoint), ex(npoint) c c move the set of points nstep times accumulating averages c for the energy and square of the energy c e = 0.0d0 esq = 0.0d0 eb = 0.0d0 do 10 istep = 1, nstep c c sample a new set of points c do 20 ipoint = 1, npoint call sample(x(1, ipoint), psix(ipoint), ex(ipoint)) 20 continue c c accumulate average(s) c do 30 ipoint = 1, npoint eb = eb + ex(ipoint) 30 continue c c block averages every 100 moves to reduce statistical correlation c if (mod(istep,100).eq.0) then eb = eb / dble(npoint*100) e = e + eb esq = esq + eb*eb eb = 0.0d0 endif 10 continue c c compute final averages c e = e / dble(nstep/100) esq = esq / dble(nstep/100) c end subroutine sample(x, psix, ex) implicit double precision (a-h, o-z) dimension x(6), xnew(6) c c sample a new point ... i.e. move current point by a c random amount and accept the move according to the c ratio of the square of the wavefunction at the new c point and the old point. c c generate trial point and info at the new point c do 10 i = 1,6 xnew(i) = x(i) + (drand48(0)-0.5d0)*0.3d0 10 continue call rvals(xnew, r1, r2, r12, r1dr2) psinew = psi(r1, r2, r12) c c accept or reject the move c prob = min((psinew / psix)**2, 1.0d0) if (prob .gt. drand48(0)) then do 20 i = 1,6 x(i) = xnew(i) 20 continue psix = psinew else call rvals(x, r1, r2, r12, r1dr2) endif ex = elocal(r1, r2, r12, r1dr2) c end subroutine rvals(x, r1, r2, r12, r1dr2) implicit double precision (a-h, o-z) dimension x(6) c c compute required distances etc. c r1 = dsqrt(x(1)**2 + x(2)**2 + x(3)**2) r2 = dsqrt(x(4)**2 + x(5)**2 + x(6)**2) r12 = dsqrt((x(1)-x(4))**2 + (x(2)-x(5))**2 + (x(3)-x(6))**2) r1dr2 = x(1)*x(4) + x(2)*x(5) + x(3)*x(6) c end double precision function psi(r1, r2, r12) implicit double precision (a-h, o-z) c c compute value of the trial wavefunction c psi = dexp(-2.0d0*(r1+r2)) * (1.0d0 + 0.5d0*r12) c end double precision function elocal(r1, r2, r12, r1dr2) implicit double precision (a-h, o-z) c c compute local energy = (H psi) / psi c f = r12*(1.0d0 + 0.5d0*r12) g = 0.5d0*r12 + r1 +r2 - r1dr2*(1.0d0/r1 + 1.0d0/r2) elocal = -4.0d0 + g / f c end subroutine init(npoint, x, psix) implicit double precision (a-h, o-z) dimension x(6,npoint), psix(npoint) c c distribute points in a 2x2x2 cube. c c in parallel version make random no. seed depend on the c process number ... for a production code should be more c sophisticated than this. c call srand48(2*nodeid()+1) c do 10 ipoint = 1,npoint do 20 i = 1,6 x(i,ipoint) = (drand48(0) - 0.5d0) * 2.0d0 20 continue call rvals(x(1,ipoint), r1, r2, r12, r1dr2) psix(ipoint) = psi(r1, r2, r12) 10 continue c end ga-5-4/tcgmsg/examples/cscf120lin.h0000644000175000017500000000330212662210373015147 0ustar mbamba/*$Id: cscf120lin.h,v 1.2 1995-02-02 23:23:55 d3g681 Exp $*/ c c include file defining common /cscf/ c c natom = no. of atoms (constant parameter) c nbfn = no. of basis functions (constant parameter) c nnbfn = nbfn*(nbfn+1)/2 (constant parameter) c nocc = no. of occupied orbitals (constant parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (natom = 8, nbfn =120, nocc =16, mxiter = 30) parameter (nnbfn = nbfn*(nbfn+1)/2, pi = 3.141592653589793d0) parameter (tol= 1.0d-4) parameter (tol2e=1.0d-6) c common /cscf/ $ enrep, q(natom), ax(natom), ay(natom), az(natom), $ x(nbfn), y(nbfn), z(nbfn), expnt(nbfn), rnorm(nbfn), $ iky(nbfn), icut1, icut2, icut3 c ga-5-4/tcgmsg/examples/timer.f0000644000175000017500000000106212662210373014422 0ustar mbamba double precision function timer() c c return the time since the last call to timer. c c must be initialized by calling once and throwing away the c value c ... use cpu time on multi-user machines c ... use elapsed time on dedicated or single user machines. c *mdc*if unix * real*4 dtime, tt(2) * timer = dble(dtime(tt)) *mdc*elseif tcgmsg C$Id: timer.f,v 1.2 1995-02-02 23:24:33 d3g681 Exp $ save mlast data mlast/0/ m = mtime() timer = dble(m - mlast) * 0.01d0 mlast = m *mdc*endif c end ga-5-4/tcgmsg/examples/daxpy.f0000644000175000017500000000227212662210373014433 0ustar mbamba subroutine daxpy(n,da,dx,incx,dy,incy) c c constant times a vector plus a vector. c uses unrolled loops for increments equal to one. c jack dongarra, linpack, 3/11/78. c C$Id: daxpy.f,v 1.2 1995-02-02 23:24:05 d3g681 Exp $ double precision dx(1),dy(1),da integer i,incx,incy,ix,iy,m,mp1,n c if(n.le.0)return if (da .eq. 0.0d0) return if(incx.eq.1.and.incy.eq.1)go to 20 c c code for unequal increments or equal increments c not equal to 1 c ix = 1 iy = 1 if(incx.lt.0)ix = (-n+1)*incx + 1 if(incy.lt.0)iy = (-n+1)*incy + 1 do 10 i = 1,n dy(iy) = dy(iy) + da*dx(ix) ix = ix + incx iy = iy + incy 10 continue return c c code for both increments equal to 1 c c c clean-up loop c 20 m = mod(n,4) if( m .eq. 0 ) go to 40 do 30 i = 1,m dy(i) = dy(i) + da*dx(i) 30 continue if( n .lt. 4 ) return 40 mp1 = m + 1 do 50 i = mp1,n,4 dy(i) = dy(i) + da*dx(i) dy(i + 1) = dy(i + 1) + da*dx(i + 1) dy(i + 2) = dy(i + 2) + da*dx(i + 2) dy(i + 3) = dy(i + 3) + da*dx(i + 3) 50 continue return end ga-5-4/tcgmsg/examples/jacobi.f0000644000175000017500000001467512662210373014547 0ustar mbamba program main C$Id: jacobi.f,v 1.2 1995-02-02 23:24:15 d3g681 Exp $ implicit double precision (a-h, o-z) dimension q(1) include 'msgtypesf.h' parameter (niter = 30, maxp = 2047) dimension jlo(0:maxp), nj(0:maxp) data iqoff, iqaddr/0, 0/ c c Simple iterative (Jacobi) linear equation solver (Ax = b) c c Initialize the message passing environment c call pbeginf c call evon c c Read in the dimension of the matrix on process 0 and c broadcast its value to everyone else c if (nodeid() .eq. 0) then write(6,1) 1 format(' Input dimension of matrix: '$) read(5,*) n endif call brdcst(1+MSGINT, n, mitob(1), 0) c c makjlo assigns a range of columns to each process. c ncolp is the number that this process is to do. c call makjlo(n, jlo, nj) ncolp = nj(nodeid()) c c allocate memory c need = n*ncolp + 2*n + 2*ncolp call getmem(need, q, iqaddr, iqoff) if (iqaddr.eq.0) call parerr(999) ia = iqoff + 1 ib = ia + n*ncolp ix = ib + ncolp is = ix + ncolp iw = is + n c c Make matrix (a), rhs vector (b) and initial guess (x) c call makabx(n, jlo(nodeid()), ncolp, q(ia), q(ib), q(ix)) c c Do niter iterations of the Jacobi algorithm. c Synchronize first for accurate timings. c call synch(13) rjunk = timer() call jacobi(n, jlo, nj, q(ia), q(ib), q(ix), q(is), q(iw), niter) used = timer() c c Print out results c rmflop = dble(niter*2*n)*dble(n) / (used*1.0d6) if (nodeid() .eq. 0) write(6,2) n, used, nnodes(), rmflop 2 format(' N=',i4,' used ',f6.2,' secs with ',i3,' processes', $ ', mflop=', f8.2) c call pend call fexit end subroutine jacobi(n, jlo, nj, a, b, x, s, work, niter) implicit double precision (a-h, o-z) dimension a(n, *), b(*), x(*), s(n), work(n), $ jlo(0:*), nj(0:*) c c Apply niter iterations of the Jacobi algorithm. c me = nodeid() do 10 iter = 1, niter c c Compute matrix vector product Ax ... this is the real work c c Do the part that we have c call mxv(a, n, x, nj(me), s) c c Now we have to add up the result over all the processors c Call dgop for simple but inefficient version. Call mxvadd c for a much more efficient version c c call dgop(2, s, n, '+') c call mxvadd(s, work, jlo, nj) c c Compute our part of the update vector and compute c the residual error (the error requires a global sum) c err = 0.0d0 do 20 j = jlo(me), jlo(me) + nj(me) - 1 jj = j - jlo(me) + 1 x(jj) = x(jj) + (b(jj)-s(j))/a(j,jj) err = err + abs((b(jj)-s(j))) 20 continue c c Write out results every now and again c if (mod(iter,10).eq.0) then call dgop(3, err, 1, '+') if (nodeid().eq.0) write(6,1) iter, err 1 format(' Iteration',i3,', Error',d9.2) endif 10 continue c end subroutine makabx(n, jlo, nj, a, b, x) implicit double precision (a-h, o-z) dimension a(n, nj), b(nj), x(nj) c jhi = jlo + nj - 1 do 10 j = jlo, jhi jj = j - jlo + 1 cvd$ novector do 20 i = 1, n a(i,jj) = dble(i+j) / dble(abs(i-j)*n+n/50+1) 20 continue b(jj) = dble(mod(j,3)) x(jj) = b(jj) / a(j,jj) 10 continue c end subroutine makjlo(n, jlo, nj) dimension jlo(0:*), nj(0:*) c ncolp = n / nnodes() next = n - (ncolp*nnodes()) jjlo = 1 do 10 iproc = 0, nnodes()-1 jlo(iproc) = jjlo jjlo = jjlo + ncolp if (iproc.lt.next) jjlo = jjlo + 1 nj(iproc) = jjlo - jlo(iproc) 10 continue c end subroutine mxvadd(s, work, jlo, nj) implicit real*8 (a-h, o-z) include 'msgtypesf.h' dimension s(*), work(*), jlo(0:*), nj(0:*) logical synch parameter (synch=.true.) c c We have in s(1:n) this process's contribution to the c matrix vector product A*x where we had nj(me) elements c of x starting at element jlo(me). Each process needs c to end up with the same elements of the full result c vector s. c c Thus we need to send to each process (ip) the elements c s(jlo(ip)+k-1), k=1,nj(ip). And we need to receive from c each process our piece of s which we add onto our result c vector. c c If communication is synchronous then we must explictly pair up c send/receive requests on this process with the matching c receive/send operations on other processes. c c There is potential for much more asynch stuff but the damned c iPSC-i860 hangs (irreproducibly) if we send off too many c unresolved asynchronous messages (how many is too much?). c me = nodeid() nproc = nnodes() nn = nproc + mod(nproc,2) c if (synch) then do 10 iter = 1, nn-1 call pairup(nn, me, iter, ip) if (ip.lt.nproc) then if (me. lt. ip) then call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 1) call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, & node, 1) else if (me.gt.ip) then call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, & node, 1) call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 1) endif call vvadd(nj(me), s(jlo(me)), work) endif 10 continue else do 20 iter = 1, nn-1 call pairup(nn, me, iter, ip) if (ip.lt.nproc) then call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 0) call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, node, 1) call vvadd(nj(me), s(jlo(me)), work) endif 20 continue call waitcom(-1) endif c end subroutine pairup(n, me, iter, ipair) c c one of many ways of generating maximally overlapped pairs c (not all that good on a hypercube though!) c if (iter.eq.1) then ipair = mod(n+1-me,n) else if (me.eq.0) then ipair = iter else if (me.eq.iter) then ipair = 0 else if (ipair.eq.0) ipair = me ipair = ipair + 2 if (ipair.ge.n) ipair = ipair + 1 - n endif end subroutine vvadd(n, a, b) implicit real*8 (a-h, o-z) dimension a(*), b(*) c do 10 i = 1,n a(i) = a(i) + b(i) 10 continue c end ga-5-4/tcgmsg/examples/blkdat15.f0000644000175000017500000000140012662210373014705 0ustar mbamba block data C$Id: blkdat15.f,v 1.2 1995-02-02 23:23:47 d3g681 Exp $ implicit double precision (a-h, o-z) include 'cscf.h' c c initalize data in common ... clumsy but avoids code to read in data c c one be atom with 15 orbitals c c have 9s functions on each center and simulate p's by having c s function at +- 1 in each of x, y, z c data ax /0.0d0/, ay /0.0d0/, az /0.0d0/, q /4.0d0/, enrep/0.0d0/ data x /9*0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0/ data y /9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0/ data z /9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0/ data expnt /1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0/ c end ga-5-4/tcgmsg/examples/scfblas.f0000644000175000017500000006072212662210373014727 0ustar mbamba SUBROUTINE DGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX, $ BETA, Y, INCY ) * .. Scalar Arguments .. C$Id: scfblas.f,v 1.2 1995-02-02 23:24:29 d3g681 Exp $ DOUBLE PRECISION ALPHA, BETA INTEGER INCX, INCY, LDA, M, N CHARACTER*1 TRANS * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), X( * ), Y( * ) * .. * * Purpose * ======= * * DGEMV performs one of the matrix-vector operations * * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, * * where alpha and beta are scalars, x and y are vectors and A is an * m by n matrix. * * Parameters * ========== * * TRANS - CHARACTER*1. * On entry, TRANS specifies the operation to be performed as * follows: * * TRANS = 'N' or 'n' y := alpha*A*x + beta*y. * * TRANS = 'T' or 't' y := alpha*A'*x + beta*y. * * TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. * * Unchanged on exit. * * M - INTEGER. * On entry, M specifies the number of rows of the matrix A. * M must be at least zero. * Unchanged on exit. * * N - INTEGER. * On entry, N specifies the number of columns of the matrix A. * N must be at least zero. * Unchanged on exit. * * ALPHA - DOUBLE PRECISION. * On entry, ALPHA specifies the scalar alpha. * Unchanged on exit. * * A - DOUBLE PRECISION array of DIMENSION ( LDA, n ). * Before entry, the leading m by n part of the array A must * contain the matrix of coefficients. * Unchanged on exit. * * LDA - INTEGER. * On entry, LDA specifies the first dimension of A as declared * in the calling (sub) program. LDA must be at least * max( 1, m ). * Unchanged on exit. * * X - DOUBLE PRECISION array of DIMENSION at least * ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' * and at least * ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. * Before entry, the incremented array X must contain the * vector x. * Unchanged on exit. * * INCX - INTEGER. * On entry, INCX specifies the increment for the elements of * X. INCX must not be zero. * Unchanged on exit. * * BETA - DOUBLE PRECISION. * On entry, BETA specifies the scalar beta. When BETA is * supplied as zero then Y need not be set on input. * Unchanged on exit. * * Y - DOUBLE PRECISION array of DIMENSION at least * ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' * and at least * ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. * Before entry with BETA non-zero, the incremented array Y * must contain the vector y. On exit, Y is overwritten by the * updated vector y. * * INCY - INTEGER. * On entry, INCY specifies the increment for the elements of * Y. INCY must not be zero. * Unchanged on exit. * * * Level 2 Blas routine. * * -- Written on 22-October-1986. * Jack Dongarra, Argonne National Lab. * Jeremy Du Croz, Nag Central Office. * Sven Hammarling, Nag Central Office. * Richard Hanson, Sandia National Labs. * * * .. Parameters .. DOUBLE PRECISION ONE , ZERO PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) * .. Local Scalars .. DOUBLE PRECISION TEMP INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. External Subroutines .. EXTERNAL XERBLA * .. Intrinsic Functions .. INTRINSIC MAX * .. * .. Executable Statements .. * * Test the input parameters. * INFO = 0 IF ( .NOT.LSAME( TRANS, 'N' ).AND. $ .NOT.LSAME( TRANS, 'T' ).AND. $ .NOT.LSAME( TRANS, 'C' ) )THEN INFO = 1 ELSE IF( M.LT.0 )THEN INFO = 2 ELSE IF( N.LT.0 )THEN INFO = 3 ELSE IF( LDA.LT.MAX( 1, M ) )THEN INFO = 6 ELSE IF( INCX.EQ.0 )THEN INFO = 8 ELSE IF( INCY.EQ.0 )THEN INFO = 11 END IF IF( INFO.NE.0 )THEN CALL XERBLA( 'DGEMV ', INFO ) RETURN END IF * * Quick return if possible. * IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR. $ ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) ) $ RETURN * * Set LENX and LENY, the lengths of the vectors x and y, and set * up the start points in X and Y. * IF( LSAME( TRANS, 'N' ) )THEN LENX = N LENY = M ELSE LENX = M LENY = N END IF IF( INCX.GT.0 )THEN KX = 1 ELSE KX = 1 - ( LENX - 1 )*INCX END IF IF( INCY.GT.0 )THEN KY = 1 ELSE KY = 1 - ( LENY - 1 )*INCY END IF * * Start the operations. In this version the elements of A are * accessed sequentially with one pass through A. * * First form y := beta*y. * IF( BETA.NE.ONE )THEN IF( INCY.EQ.1 )THEN IF( BETA.EQ.ZERO )THEN DO 10, I = 1, LENY Y( I ) = ZERO 10 CONTINUE ELSE DO 20, I = 1, LENY Y( I ) = BETA*Y( I ) 20 CONTINUE END IF ELSE IY = KY IF( BETA.EQ.ZERO )THEN DO 30, I = 1, LENY Y( IY ) = ZERO IY = IY + INCY 30 CONTINUE ELSE DO 40, I = 1, LENY Y( IY ) = BETA*Y( IY ) IY = IY + INCY 40 CONTINUE END IF END IF END IF IF( ALPHA.EQ.ZERO ) $ RETURN IF( LSAME( TRANS, 'N' ) )THEN * * Form y := alpha*A*x + y. * JX = KX IF( INCY.EQ.1 )THEN DO 60, J = 1, N IF( X( JX ).NE.ZERO )THEN TEMP = ALPHA*X( JX ) DO 50, I = 1, M Y( I ) = Y( I ) + TEMP*A( I, J ) 50 CONTINUE END IF JX = JX + INCX 60 CONTINUE ELSE DO 80, J = 1, N IF( X( JX ).NE.ZERO )THEN TEMP = ALPHA*X( JX ) IY = KY DO 70, I = 1, M Y( IY ) = Y( IY ) + TEMP*A( I, J ) IY = IY + INCY 70 CONTINUE END IF JX = JX + INCX 80 CONTINUE END IF ELSE * * Form y := alpha*A'*x + y. * JY = KY IF( INCX.EQ.1 )THEN DO 100, J = 1, N TEMP = ZERO DO 90, I = 1, M TEMP = TEMP + A( I, J )*X( I ) 90 CONTINUE Y( JY ) = Y( JY ) + ALPHA*TEMP JY = JY + INCY 100 CONTINUE ELSE DO 120, J = 1, N TEMP = ZERO IX = KX DO 110, I = 1, M TEMP = TEMP + A( I, J )*X( IX ) IX = IX + INCX 110 CONTINUE Y( JY ) = Y( JY ) + ALPHA*TEMP JY = JY + INCY 120 CONTINUE END IF END IF * RETURN * * End of DGEMV . * END *deck dblas3 *mdc*on fortran_dblas3 c * ************************************************************************ * * File of the DOUBLE PRECISION Level-3 BLAS. * ========================================== * * SUBROUTINE DGEMM ( TRANSA, TRANSB, M, N, K, * $ ALPHA, A, LDA, B, LDB, BETA, C, LDC ) * * SUBROUTINE DSYMM ( SIDE, UPLO, TRANSB, M, N, * $ ALPHA, A, LDA, B, LDB, BETA, C, LDC ) * * SUBROUTINE DSYRK ( UPLO, TRANSA, N, K, * $ ALPHA, A, LDA, BETA, C, LDC ) * * SUBROUTINE DTRMM ( SIDE, UPLO, TRANSA, DIAG, M, N, * $ A, LDA, B, LDB ) * * SUBROUTINE DTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, * $ A, LDA, B, LDB ) * * See: * * Dongarra J. J., Du Croz J. J., Duff I. and Hammarling S. * A Proposal for a set of Level 3 Basic Linear Algebra * Subprograms. Technical Memorandum No.88, Mathematics and * Computer Science Division, Argonne National Laboratory, * 9700 South Cass Avenue, Argonne, Illinois 60439. * * ************************************************************************ * SUBROUTINE DGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, $ BETA, C, LDC ) * .. Scalar Arguments .. DOUBLE PRECISION ALPHA, BETA INTEGER M, N, K, LDA, LDB, LDC CHARACTER*1 TRANSA, TRANSB * .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( LDC, * ) * .. * * Purpose * ======= * * DGEMM performs one of the matrix-matrix operations * * C := alpha*op( A )*op( B ) + beta*C, * * where op( X ) is one of * * op( X ) = X or op( X ) = X', * * alpha and beta are scalars, and A, B and C are matrices, with op( A ) * an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. * * Parameters * ========== * * TRANSA - CHARACTER*1. * On entry, TRANSA specifies the form of op( A ) to be used in * the matrix multiplication as follows: * * TRANSA = 'N' or 'n', op( A ) = A. * * TRANSA = 'T' or 't', op( A ) = A'. * * TRANSA = 'C' or 'c', op( A ) = A'. * * Unchanged on exit. * * TRANSB - CHARACTER*1. * On entry, TRANSB specifies the form of op( B ) to be used in * the matrix multiplication as follows: * * TRANSA = 'N' or 'n', op( B ) = B. * * TRANSA = 'T' or 't', op( B ) = B'. * * TRANSA = 'C' or 'c', op( B ) = B'. * * Unchanged on exit. * * M - INTEGER. * On entry, M specifies the number of rows of the matrix * op( A ) and of the matrix C. M must be at least zero. * Unchanged on exit. * * N - INTEGER. * On entry, N specifies the number of columns of the matrix * op( B ) and the number of columns of the matrix C. N must be * at least zero. * Unchanged on exit. * * K - INTEGER. * On entry, K specifies the number of columns of the matrix * op( A ) and the number of rows of the matrix op( B ). K must * be at least zero. * Unchanged on exit. * * ALPHA - DOUBLE PRECISION. * On entry, ALPHA specifies the scalar alpha. * Unchanged on exit. * * A - DOUBLE PRECISION array of DIMENSION ( LDA, ka ), where ka is * k when TRANSA = 'N' or 'n', and is m otherwise. * Before entry with TRANSA = 'N' or 'n', the leading m by k * part of the array A must contain the matrix A, otherwise * the leading k by m part of the array A must contain the * matrix A. * Unchanged on exit. * * LDA - INTEGER. * On entry, LDA specifies the first dimension of A as declared * in the calling (sub) program. When TRANSA = 'N' or 'n' then * LDA must be at least max( 1, m ), otherwise LDA must be at * least max( 1, k ). * Unchanged on exit. * * B - DOUBLE PRECISION array of DIMENSION ( LDB, kb ), where kb is * n when TRANSB = 'N' or 'n', and is k otherwise. * Before entry with TRANSB = 'N' or 'n', the leading k by n * part of the array B must contain the matrix B, otherwise * the leading n by k part of the array B must contain the * matrix B. * Unchanged on exit. * * LDB - INTEGER. * On entry, LDB specifies the first dimension of B as declared * in the calling (sub) program. When TRANSB = 'N' or 'n' then * LDB must be at least max( 1, k ), otherwise LDB must be at * least max( 1, n ). * Unchanged on exit. * * BETA - DOUBLE PRECISION. * On entry, BETA specifies the scalar beta. When BETA is * supplied as zero then C need not be set on input. * Unchanged on exit. * * C - DOUBLE PRECISION array of DIMENSION ( LDC, n ). * Before entry, the leading m by n part of the array C must * contain the matrix C, except when beta is zero, in which * case C need not be set on entry. * On exit, the array C is overwritten by the m by n matrix * ( alpha*op( A )*op( B ) + beta*C ). * * LDC - INTEGER. * On entry, LDC specifies the first dimension of C as declared * in the calling (sub) program. LDC must be at least * max( 1, m ). * Unchanged on exit. * * * Level 3 Blas routine. * * -- Written on 30-April-1987. * Sven Hammarling, Nag Central Office. * * * .. Parameters .. DOUBLE PRECISION ONE , ZERO PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) * .. Local Scalars .. INTEGER I, INFO, J, NCOLA, NROWA, NROWB LOGICAL NOTA, NOTB * .. External Functions .. LOGICAL LSAME EXTERNAL LSAME * .. External Subroutines .. EXTERNAL XERBLA, DGEMV * .. Intrinsic Functions .. INTRINSIC MAX * .. * .. Executable Statements .. * * Set NOTA and NOTB as true if A and B respectively are not * transposed, and set NROWA, NCOLA and NROWB as the number of rows * and columns of A and the number of rows of B respectively. * NOTA = LSAME( TRANSA, 'N' ) NOTB = LSAME( TRANSB, 'N' ) IF( NOTA )THEN NROWA = M NCOLA = K ELSE NROWA = K NCOLA = M END IF IF( NOTB )THEN NROWB = K ELSE NROWB = N END IF * * Test the input parameters. * INFO = 0 IF( ( .NOT.NOTA ).AND. $ ( .NOT.LSAME( TRANSA, 'T' ) ).AND. $ ( .NOT.LSAME( TRANSA, 'C' ) ) )THEN INFO = 1 ELSE IF( ( .NOT.NOTB ).AND. $ ( .NOT.LSAME( TRANSB, 'T' ) ).AND. $ ( .NOT.LSAME( TRANSB, 'C' ) ) )THEN INFO = 2 ELSE IF( M.LT.0 )THEN INFO = 3 ELSE IF( N.LT.0 )THEN INFO = 4 ELSE IF( K.LT.0 )THEN INFO = 5 ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN INFO = 8 ELSE IF( LDB.LT.MAX( 1, NROWB ) )THEN INFO = 10 ELSE IF( LDC.LT.MAX( 1, M ) )THEN INFO = 13 END IF IF( INFO.NE.0 )THEN CALL XERBLA( 'DGEMM ', INFO ) RETURN END IF * * Quick return if possible. * IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR. $ ( ( ( ALPHA.EQ.ZERO ).or.( K.EQ.0 ) ).AND.( BETA.EQ.ONE ) ) ) $ RETURN * * Start the operations. * IF( K.EQ.0 )THEN * * Form C := beta*C. * IF( BETA.EQ.ZERO )THEN DO 20, J = 1, N DO 10, I = 1, M C( I, J ) = ZERO 10 CONTINUE 20 CONTINUE ELSE DO 40, J = 1, N DO 30, I = 1, M C( I, J ) = BETA*C( I, J ) 30 CONTINUE 40 CONTINUE END IF ELSE IF( NOTB )THEN * * Form C := alpha*op( A )*B + beta*C. * DO 50, J = 1, N CALL DGEMV ( TRANSA, NROWA, NCOLA, $ ALPHA, A, LDA, B( 1, J ), 1, $ BETA, C( 1, J ), 1 ) 50 CONTINUE ELSE * * Form C := alpha*op( A )*B' + beta*C. * DO 60, J = 1, N CALL DGEMV ( TRANSA, NROWA, NCOLA, $ ALPHA, A, LDA, B( J, 1 ), LDB, $ BETA, C( 1, J ), 1 ) 60 CONTINUE END IF * RETURN * * End of DGEMM . * END LOGICAL FUNCTION LSAME ( CA, CB ) * .. Scalar Arguments .. CHARACTER*1 CA, CB * .. * * Purpose * ======= * * LSAME tests if CA is the same letter as CB regardless of case. * CB is assumed to be an upper case letter. LSAME returns .TRUE. if * CA is either the same as CB or the equivalent lower case letter. * * N.B. This version of the routine is only correct for ASCII code. * Installers must modify the routine for other character-codes. * * For EBCDIC systems the constant IOFF must be changed to -64. * For CDC systems using 6-12 bit representations, the system- * specific code in comments must be activated. * * Parameters * ========== * * CA - CHARACTER*1 * CB - CHARACTER*1 * On entry, CA and CB specify characters to be compared. * Unchanged on exit. * * * Auxiliary routine for Level 2 Blas. * * -- Written on 20-July-1986 * Richard Hanson, Sandia National Labs. * Jeremy Du Croz, Nag Central Office. * * .. Parameters .. INTEGER IOFF PARAMETER ( IOFF=32 ) * .. Intrinsic Functions .. INTRINSIC ICHAR * .. Executable Statements .. * * Test if the characters are equal * LSAME = CA .EQ. CB * * Now test for equivalence * IF ( .NOT.LSAME ) THEN LSAME = ICHAR(CA) - IOFF .EQ. ICHAR(CB) END IF * RETURN * * The following comments contain code for CDC systems using 6-12 bit * representations. * * .. Parameters .. * INTEGER ICIRFX * PARAMETER ( ICIRFX=62 ) * .. Scalar Arguments .. * CHARACTER*1 CB * .. Array Arguments .. * CHARACTER*1 CA(*) * .. Local Scalars .. * INTEGER IVAL * .. Intrinsic Functions .. * INTRINSIC ICHAR, CHAR * .. Executable Statements .. * * See if the first character in string CA equals string CB. * * LSAME = CA(1) .EQ. CB .AND. CA(1) .NE. CHAR(ICIRFX) * * IF (LSAME) RETURN * * The characters are not identical. Now check them for equivalence. * Look for the 'escape' character, circumflex, followed by the * letter. * * IVAL = ICHAR(CA(2)) * IF (IVAL.GE.ICHAR('A') .AND. IVAL.LE.ICHAR('Z')) THEN * LSAME = CA(1) .EQ. CHAR(ICIRFX) .AND. CA(2) .EQ. CB * END IF * * RETURN * * End of LSAME. * END SUBROUTINE XERBLA ( SRNAME, INFO ) * .. Scalar Arguments .. INTEGER INFO CHARACTER*6 SRNAME * .. * * Purpose * ======= * * XERBLA is an error handler for the Level 2 BLAS routines. * * It is called by the Level 2 BLAS routines if an input parameter is * invalid. * * Installers should consider modifying the STOP statement in order to * call system-specific exception-handling facilities. * * Parameters * ========== * * SRNAME - CHARACTER*6. * On entry, SRNAME specifies the name of the routine which * called XERBLA. * * INFO - INTEGER. * On entry, INFO specifies the position of the invalid * parameter in the parameter-list of the calling routine. * * * Auxiliary routine for Level 2 Blas. * * Written on 20-July-1986. * * .. Executable Statements .. * WRITE (*,99999) SRNAME, INFO * STOP * 99999 FORMAT ( ' ** On entry to ', A6, ' parameter number ', I2, $ ' had an illegal value' ) * * End of XERBLA. * END double precision function ddot(n,dx,incx,dy,incy) c c forms the dot product of two vectors. c uses unrolled loops for increments equal to one. c jack dongarra, linpack, 3/11/78. c double precision dx(1),dy(1),dtemp integer i,incx,incy,ix,iy,m,mp1,n c ddot = 0.0d0 dtemp = 0.0d0 if(n.le.0)return if(incx.eq.1.and.incy.eq.1)go to 20 c c code for unequal increments or equal increments c not equal to 1 c ix = 1 iy = 1 if(incx.lt.0)ix = (-n+1)*incx + 1 if(incy.lt.0)iy = (-n+1)*incy + 1 do 10 i = 1,n dtemp = dtemp + dx(ix)*dy(iy) ix = ix + incx iy = iy + incy 10 continue ddot = dtemp return c c code for both increments equal to 1 c c c clean-up loop c 20 m = mod(n,5) if( m .eq. 0 ) go to 40 do 30 i = 1,m dtemp = dtemp + dx(i)*dy(i) 30 continue if( n .lt. 5 ) go to 60 40 mp1 = m + 1 do 50 i = mp1,n,5 dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + * dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4) 50 continue 60 ddot = dtemp return end subroutine daxpy(n,da,dx,incx,dy,incy) c c constant times a vector plus a vector. c uses unrolled loops for increments equal to one. c jack dongarra, linpack, 3/11/78. c double precision dx(1),dy(1),da integer i,incx,incy,ix,iy,m,mp1,n c if(n.le.0)return if (da .eq. 0.0d0) return if(incx.eq.1.and.incy.eq.1)go to 20 c c code for unequal increments or equal increments c not equal to 1 c ix = 1 iy = 1 if(incx.lt.0)ix = (-n+1)*incx + 1 if(incy.lt.0)iy = (-n+1)*incy + 1 do 10 i = 1,n dy(iy) = dy(iy) + da*dx(ix) ix = ix + incx iy = iy + incy 10 continue return c c code for both increments equal to 1 c c c clean-up loop c 20 m = mod(n,4) if( m .eq. 0 ) go to 40 do 30 i = 1,m dy(i) = dy(i) + da*dx(i) 30 continue if( n .lt. 4 ) return 40 mp1 = m + 1 do 50 i = mp1,n,4 dy(i) = dy(i) + da*dx(i) dy(i + 1) = dy(i + 1) + da*dx(i + 1) dy(i + 2) = dy(i + 2) + da*dx(i + 2) dy(i + 3) = dy(i + 3) + da*dx(i + 3) 50 continue return end subroutine dscal(n,da,dx,incx) c c scales a vector by a constant. c uses unrolled loops for increment equal to one. c jack dongarra, linpack, 3/11/78. c double precision da,dx(1) integer i,incx,m,mp1,n,nincx c if(n.le.0)return if(incx.eq.1)go to 20 c c code for increment not equal to 1 c nincx = n*incx do 10 i = 1,nincx,incx dx(i) = da*dx(i) 10 continue return c c code for increment equal to 1 c c c clean-up loop c 20 m = mod(n,5) if( m .eq. 0 ) go to 40 do 30 i = 1,m dx(i) = da*dx(i) 30 continue if( n .lt. 5 ) return 40 mp1 = m + 1 do 50 i = mp1,n,5 dx(i) = da*dx(i) dx(i + 1) = da*dx(i + 1) dx(i + 2) = da*dx(i + 2) dx(i + 3) = da*dx(i + 3) dx(i + 4) = da*dx(i + 4) 50 continue return end subroutine dcopy(n,a,ia,b,ib) implicit real*8 (a-h,o-z) dimension a(ia,*), b(ib,*) c c copy a into b c do 10 i = 1,n b(1,i) = a(1,i) 10 continue c end subroutine drot(n,sx,incx,sy,incy,sc,ss) implicit real*8 (a-h,o-z) c c b l a s subprogram c description of parameters c c --input-- c n number of elements in input vector(s) c sx double precision vector with n elements c incx storage spacing between elements of sx c sy single precision vector with n elements c incy storage spacing between elements of sy c sc element of rotation matrix c ss element of rotation matrix c c --output-- c sx rotated vector sx (unchanged if n .le. 0) c sy rotated vector sy (unchanged if n .le. 0) c c multiply the 2 x 2 matrix ( sc ss) times the 2 x n matrix (sx**t) c (-ss sc) (sy**t) c where **t indicates transpose. the elements of sx are in c sx(lx+i*incx), i = 0 to n-1, where lx = 1 if incx .ge. 0, else c lx = (-incx)*n, and similarly for sy using ly and incy. dimension sx(*),sy(*) data zero,one/0.d0,1.d0/ if(n .le. 0 .or. (ss .eq. zero .and. sc .eq. one)) go to 40 if(.not. (incx .eq. incy .and. incx .gt. 0)) go to 20 c nsteps=incx*n do 10 i=1,nsteps,incx w=sx(i) z=sy(i) sx(i)=sc*w+ss*z sy(i)=-ss*w+sc*z 10 continue go to 40 c 20 continue kx=1 ky=1 c if(incx .lt. 0) kx=1-(n-1)*incx if(incy .lt. 0) ky=1-(n-1)*incy c do 30 i=1,n w=sx(kx) z=sy(ky) sx(kx)=sc*w+ss*z sy(ky)=-ss*w+sc*z kx=kx+incx ky=ky+incy 30 continue 40 continue c return end ga-5-4/tcgmsg/examples/xpix.shar0000644000175000017500000004070412662210373015010 0ustar mbamba # This is a shell archive. Remove anything before this line, then # unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # check.bitmap makefile xpix.c echo x - check.bitmap sed -e 's/^X//' > "check.bitmap" << '//E*O*F check.bitmap//' X#define check_width 8 X#define check_height 8 Xstatic char check_bits[] = { X 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x0a, 0x04}; //E*O*F check.bitmap// echo x - makefile sed -e 's/^X//' > "makefile" << '//E*O*F makefile//' X# X CFLAGS = -O4 -DSUN -dalign -I/msrc/apps/X11R5/include X XLIBS = -L/msrc/apps/X11R5/lib -lXaw -lXmu -lXt -lX11 -lXau -lXdmcp -lXext X X#SUN R4 X# XLIBS = -lXaw -lXmu -lXt -lX11 -lXau -lXdmcp -lXext -lXinput X Xxpix: xpix.o X cc $(CFLAGS) -o xpix xpix.o $(XLIBS) -lm //E*O*F makefile// echo x - xpix.c sed -e 's/^X//' > "xpix.c" << '//E*O*F xpix.c//' X#include X#include X#include X#include X X#include "check.bitmap" X X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X Xextern char *malloc(); X X/* Globals needed for display etc. */ X Xstatic Widget top_level_widget, box_widget, file_menu_button, start_button, X canvas_widget, title_widget, grid_data_widget, X scroll_widget, interval_widget, file_menu; X#define n_file_menu_entries 3 Xstatic String file_menu_entries[] = {"Tail ","Cycle ","Quit"}; Xstatic Widget file_menu_widgets[n_file_menu_entries]; Xstatic Pixmap check_mark; Xstatic Arg arg[25]; Xstatic Display *display; Xstatic Window window; Xstatic int screen, depth; Xstatic Visual *visual; Xstatic XtIntervalId timer; Xstatic XImage *image; Xstatic u_char *pict; Xstatic GC gc; Xstatic char title[80]; Xstatic char grid_data[80]; Xstatic char interval_string[10]; X Xstatic long first_time = True; /* Used to set scroll bar on first expose */ Xstatic long interval_max = 2000; Xstatic long interval = 500; /* 0.5s between exposures by default */ X Xstatic int tail_mode = False; /* By default cycle thru frames X instead of tailing a file */ X X#define TCG_MAX(a,b) (((a)>(b)) ? (a) : (b)) X#define TCG_MIN(a,b) (((a)<(b)) ? (a) : (b)) X X#define MAX_COL 64 Xstatic u_char cmap[MAX_COL]; X X Xstatic int n_grid = 0; /* The number of the current grid */ Xstatic int grid_size; /* The size of the current grid */ Xstatic int max_grid_size=-1; /* Size of the largest grid */ X X#define PICT_SIZE max_grid_size X Xstatic u_char *grid; Xstatic int working = False; X Xvoid Error(string, integer) X char *string; X int integer; X{ X (void) fflush(stdout); X (void) fprintf(stderr,"\n\nError was called.\n"); X (void) fprintf(stderr,string); X (void) fprintf(stderr," %d (%#x).\n",integer,integer); X exit(1); X} X X/*ARGSUSED*/ Xvoid FileMenuCallback(w, pane_num, data) X Widget w; X int pane_num; X caddr_t data; X{ X switch (pane_num) { X case 0: /* Tail mode */ X tail_mode = True; X XtSetArg(arg[0], XtNrightBitmap, check_mark); /* Check tail */ X XtSetValues(file_menu_widgets[0], arg, 1); X XtSetArg(arg[0], XtNrightBitmap, NULL); /* Un-check cycle */ X XtSetValues(file_menu_widgets[1], arg, 1); X break; X X case 1: /* Cycle mode */ X tail_mode = False; X XtSetArg(arg[0], XtNrightBitmap, check_mark); /* Check cycle */ X XtSetValues(file_menu_widgets[1], arg, 1); X XtSetArg(arg[0], XtNrightBitmap, NULL); /* Un-check tail */ X XtSetValues(file_menu_widgets[0], arg, 1); X break; X X case 2: /* Quit */ X exit(0); X break; X X default: X Error("Unknown menu item", pane_num); X } X} X Xint GetNextGrid(grid) X u_char *grid; X{ X int n, junk, nread; X u_char *temp; X X if (fread(&grid_size, sizeof(int), 1, stdin) != 1) { X clearerr(stdin); X X if (tail_mode) { X /* In this mode just wait for next time out and try again then */ X return False; X } X else { X /* Cycling ... retry at the front of the file */ X n_grid = 0; X fseek(stdin, 0, 0); X (void) fread(&junk, sizeof(int), 1, stdin); /* Ignore first word */ X X if (fread(&grid_size, sizeof(int), 1, stdin) != 1) { X (void) fprintf(stderr, X "GetNextGrid: Failed to read first grid size\n"); X return False; X } X } X } X X grid_size = ntohl(grid_size); /* Convert to machine format */ X X /* Have read the grid size so there must be a grid on the way */ X X n = grid_size*grid_size; X temp = grid; X X while(n) { X nread = fread(temp, 1, n, stdin); X if (!nread) { X clearerr(stdin); X sleep(1); /* Don't be too agressive */ X } X temp += nread; X n -= nread; X } X n_grid++; X return True; X} X Xvoid DrawGrid(grid) X u_char *grid; X{ X register int scale = max_grid_size/grid_size; X register int i,j,k,l,npix,index; X register u_char *from, *to, *tempk, *tempkl, value; X X from = grid; to = pict; /* For clarity and convenience */ X X if (scale > 1) { X for (i=0; iwidth, image->height); X (void) sprintf(grid_data, "Grid %d (%d x %d)", X n_grid, grid_size, grid_size); X X XtSetArg(arg[0], XtNlabel, grid_data); /* Reset the grid data */ X XtSetValues(grid_data_widget,arg,1); X XFlush(display); X} X Xvoid DisplayIntervalValue() X{ X (void) sprintf(interval_string, "%4d ms", interval); X XtSetArg(arg[0], XtNlabel, interval_string); X XtSetValues(interval_widget,arg,1); X} X X/*ARGSUSED*/ Xvoid ScrollProc(scrollbar, data, position) X Widget scrollbar; X caddr_t data; X caddr_t position; X/* X Called when the left or right buttons are used to step the X scrollbar left or right. We have the responsibility of X moving the scrollbar. X*/ X{ X Dimension length; X float fraction, shown; X X /* Get the scrollbar length and move the scroll bar */ X X XtSetArg(arg[0], XtNlength, &length); X XtGetValues(scrollbar, arg, 1); X fraction = ((int) position)/ (double) length; X X interval -= fraction*0.05*interval_max; X interval = TCG_MIN(interval, interval_max); X interval = TCG_MAX(interval, 1); X X fraction = (float) interval/ (float) interval_max; X shown = -1.0; X X DisplayIntervalValue(); X XawScrollbarSetThumb(scrollbar, fraction, shown); X} X X/*ARGSUSED*/ Xvoid JumpProc(scrollbar, data, fraction_ptr) X Widget scrollbar; X caddr_t data; X caddr_t fraction_ptr; X/* X Called when the middle button is used to drag to X the scrollbar. The scrollbar is moved for us. X*/ X{ X float fraction = *(float *) fraction_ptr; X X interval = fraction*interval_max; X interval = TCG_MIN(interval, interval_max); X interval = TCG_MAX(interval, 1); X X DisplayIntervalValue(); X} X X/*ARGSUSED*/ Xvoid Exposed(widget, data, event) X Widget widget; X caddr_t data; X XEvent *event; X{ X /* Now we are exposed we can draw ... only if we have a grid! */ X X if (first_time) { X /* Cannot seem to set this before now ? */ X ScrollProc(scroll_widget, NULL, 0); X first_time = False; X } X X if (n_grid) X DrawGrid(grid); X} X X/*ARGSUSED*/ Xvoid TimeOutCallback(data) X caddr_t data; X{ X /* If there's another grid available draw it */ X X if (GetNextGrid(grid)) X DrawGrid(grid); X X /* Always restore the call back */ X X timer = XtAddTimeOut(interval, TimeOutCallback, NULL); X X} X X/*ARGSUSED*/ Xvoid StartStop(widget, data, event) X Widget widget; X caddr_t data; X XEvent *event; X{ X /* Toggle propagation of display */ X X if (working) { X XtRemoveTimeOut(timer); X working = False; X XtSetArg(arg[0], XtNlabel, "Start"); /* Reset button label */ X XtSetValues(start_button,arg,1); X XFlush(display); X } X else { X XtSetArg(arg[0], XtNlabel, "Stop"); /* Reset button label */ X XtSetValues(start_button,arg,1); X timer = XtAddTimeOut(interval, TimeOutCallback, NULL); X working = True; X XFlush(display); X } X} X Xvoid HSVtoRGB(h, s, v, r, g, b) X double h, s, v, *r, *g, *b; X/* X hue (0-360), s&v (0-1), r&g&b (0-1) X*/ X{ X int ih; X double rh, x, y, z; X X /* Zero saturation means gray */ X X if (s < 0.0001) { X *r = v; *g = v; *b = v; X return; X } X X /* Put hue in [0,6) */ X X if (h > 359.999) X h = 0.0; X else X h = h/60.0; X X ih = h; rh = h - ih; /* Integer and fractional parts */ X X x = v*(1.0 - s); X y = v*(1.0-s*rh); X z = v*(1.0-s*(1.0-rh)); X X switch (ih) { X case 0: X *r = v; *g = z; *b = x; break; X case 1: X *r = y; *g = v; *b = x; break; X case 2: X *r = x; *g = v; *b = z; break; X case 3: X *r = x; *g = y; *b = v; break; X case 4: X *r = z; *g = x; *b = v; break; X case 5: X *r = v; *g = x; *b = y; break; X default: X Error("HLStoRGB: invalid hue", ih); X } X} X Xvoid Setcmap() X/* X Make the color map ... scheme base on linear interpolation of hsv. X*/ X{ X int i; X XColor color; X Colormap colormap; X double scale = 1.0 / ((double) (MAX_COL-1)); X double hue, saturation, value, red, green, blue; X X colormap = DefaultColormap(display, screen); X X for (i=0; i #include #ifdef PLOT #include #include FILE *plot_file; #define PLOT_VALUE 1 #define PLOT_ERROR 2 #define PLOT_RESIDUAL 3 static long plot_type = 0; /* 0 means no plot */ #endif #include "sndrcv.h" #if defined(DELTA) || defined(IPSC) #define htonl(a) (a) #endif #if !defined(AIX) && !defined(DECOSF) extern char *malloc(); #endif extern void exit(); #define TCG_MAX(a,b) (((a)>(b)) ? (a) : (b)) #define TCG_MIN(a,b) (((a)<(b)) ? (a) : (b)) #define TCG_ABS(a) (((a)>=0 ) ? (a) : -(a)) #define LO -3.1415926535 /* Phsyical dimensions */ #define HI 3.1415926535 double scale; /* Physical mesh grain */ long P, ncol_P, nrow_P; /* P = No. of processes = ncol_P * nrow_P */ long my_col_P, my_row_P; /* Co-ords of this proc. in grid of processes*/ double *buffer; /* Buffer used for exchanging rows */ long north, south, east, west; /* No. of process in that direction on process grid or -1 if no-one there */ long col_low = 0; /* Grid co-ords of top left corner */ long row_low = 0; /* Mapping from GLOBAL grid index to physical coordinates */ #define MAPCOL(I) (scale*((double) (I+col_low)) + LO) #define MAPROW(J) (scale*((double) (J+row_low)) + LO) long cs_exchange = 0; /* Timing information */ long cs_global = 0; long cs_interpolate = 0; long cs_plot = 0; long cs_total = 0; /* void ZeroGrid(grid, ncols, nrows) double **grid; long ncols, nrows; { long i,j; for (i=0; i<=ncols; i++) for (j=0; j<=nrows; j++) grid[i][j] = 0.0; } */ double Solution(x,y) double x,y; /* Model potential that defines solution and boundary conditions. This particular choice makes the discretization error quite apparent. */ { /* return cos(x)*exp(-y) + 0.1*sin(2.*x)*exp(-2.*y) + 0.1*cos(3.*x)*exp(-3.*y); */ return 0.5 * (cos(x)*exp(-y) + cos(y)*exp(-x) + 0.1*(sin(2.*x)*exp(-2.*y) + sin(2.*y)*exp(-2.*x)) + 0.1*(cos(3.*x)*exp(-3.*y) + cos(3.*y)*exp(-3.*x))); } double GridError(grid, ncols, nrows, ngrid) long ncols, nrows, ngrid; double **grid; /* Compute mean absolute error at grid points relative to the analytic solution ... error is due to either lack of convergence or discretization error. */ { long i,j, type=9, length=1; long start; double error = 0.0; for (i=1; i= 0) { SND_(&type1, (char *) grid[1], &bnrows, &west, &synch); RCV_(&type2, (char *) grid[0], &bnrows, &lenmes, &west, &nodefrom, &synch); } if (east >= 0) { SND_(&type3, (char *) grid[ncols-1], &bnrows, &east, &synch); RCV_(&type4, (char *) grid[ncols], &bnrows, &lenmes, &east, &nodefrom, &synch); } } else { if (east >= 0) { RCV_(&type1, (char *) grid[ncols], &bnrows, &lenmes, &east, &nodefrom, &synch); SND_(&type2, (char *) grid[ncols-1], &bnrows, &east, &synch); } if (west >= 0) { RCV_(&type3, (char *) grid[0], &bnrows, &lenmes, &west, &nodefrom, &synch); SND_(&type4, (char *) grid[1], &bnrows, &west, &synch); } } if (my_row_P%2) { if (north >= 0) { GATHER(1); SND_(&type5, (char *) buffer, &bncols, &north, &synch); RCV_(&type6, (char *) buffer, &bncols, &lenmes, &north, &nodefrom, &synch); SCATTER(0); } if (south >= 0) { GATHER(nrows-1); SND_(&type7, (char *) buffer, &bncols, &south, &synch); RCV_(&type8, (char *) buffer, &bncols, &lenmes, &south, &nodefrom, &synch); SCATTER(nrows); } } else { if (south >= 0) { RCV_(&type5, (char *) buffer, &bncols, &lenmes, &south, &nodefrom, &synch); SCATTER(nrows); GATHER(nrows-1); SND_(&type6, (char *) buffer, &bncols, &south, &synch); } if (north >= 0) { RCV_(&type7, (char *) buffer, &bncols, &lenmes, &north, &nodefrom, &synch); SCATTER(0); GATHER(1); SND_(&type8, (char *) buffer, &bncols, &north, &synch); } } cs_exchange += MTIME_() - start; } #ifdef PLOT void ClosePlotFile() { if (!plot_type) return; if (NODEID_() == 0) (void) fclose(plot_file); } void OpenPlotFile(maxgrid) long maxgrid; { if (!plot_type) return; if (NODEID_()) return; /* Only node 0 needs to do this */ if (!(plot_file = fopen("plot","w+"))) Error("OpenPlotFile: failed to open plot file", (long) -1); maxgrid = htonl((long) maxgrid); /* For portability */ if (fwrite((char *) &maxgrid, sizeof(int), 1, plot_file) != 1) Error("OpenPlotFile: failed to write maxgrid", (long) -1); (void) fflush(plot_file); } void InsertPlot(plot_full, ngrid, plot_grid, nrows, ncols, col_low, row_low) unsigned char *plot_full, *plot_grid; long ngrid, nrows, ncols, col_low, row_low; { long i, j; long i_lo = (col_low == 0) ? 0 : 1; long j_lo = (row_low == 0) ? 0 : 1; unsigned char *temp; /* Dink around with i_lo, j_lo so that the interior edges in the parallel case are not overwritten with incorrect values */ if (i_lo) plot_grid += nrows; for (i=i_lo; i update red then update black using new reds (gauss-seidel red-black w-relaxation). Return the mean abs. error (value of the laplacian) on the old grid. */ { double residual = 0.0; double omega = 0.94; /* Over relaxation parameter */ long i,j, type=10, length=1, jlo; double *gg, *ggm, *ggp; Exchange(grid, ncols, nrows); /* Update red */ for (i=1; i=0) && (i1<=new_ncols) && (j1>=0) && (j1<=new_nrows) ) new_grid[i1][j1] = old_grid[i][j]; } for (i=1; i<=old_ncols; i++) for (j=1; j<=old_nrows; j++) { i2 = 2*i-1+col_shift; j2 = 2*j-1+row_shift; if ( (i2>=0) && (i2<=new_ncols) && (j2>=0) && (j2<=new_nrows) ) new_grid[i2][j2] = 0.25 * (old_grid[i ][j ] + old_grid[i-1][j-1] + old_grid[i-1][j ] + old_grid[i ][j-1]); } BoundaryConditions(new_grid, new_ncols, new_nrows); Exchange(new_grid, new_ncols, new_nrows); for (i=1; i 0) ? NODEID_()-1 : -1; south = (my_row_P < (nrow_P-1)) ? NODEID_()+1 : -1; east = (my_col_P < (ncol_P-1)) ? NODEID_()+nrow_P : -1; west = (my_col_P > 0) ? NODEID_()-nrow_P : -1; ParseArguments(argc, argv, &maxgrid, &niter, &nprint, &nlevel, &thresh); ngrid1 = TCG_MAX(ncol_P,maxgrid>>(nlevel-1)); ngrid1 = TCG_MAX(nrow_P,ngrid1); /* Size of first grid */ maxgrid = ngrid1<<(nlevel-1); /* Actual size of final grid */ if (!(buffer = (double *) malloc((unsigned) (sizeof(double)*(maxgrid+1))))) Error("failed to allocate comms buffer", (long) (maxgrid+1)); #ifdef PLOT OpenPlotFile(maxgrid); #endif /* Loop from coarse to fine grids */ for (level=0; level #include #include static void catchit() { printf("!! Floating point interrupt caught !!\n"); fflush(stdout); (void) signal(SIGIOT, SIG_DFL); abort(); } void ieeetrap_() { (void) ieee_handler("set","inexact", SIGFPE_IGNORE); (void) ieee_handler("set","underflow", SIGFPE_IGNORE); (void) ieee_handler("set","invalid", SIGFPE_IGNORE); } ga-5-4/tcgmsg/examples/fexit.f.proto0000644000175000017500000000045112662210373015564 0ustar mbamba subroutine fexit IF ARDENT c Fortran returns a non-zero status unless we STOP, which c produces the irritating FORTRAN STOP message, or we c explicitly call exit call exit(0) ELSE ENDIF end IF HPUX HPUXNOEXT IBM IBMNOEXT subroutine flush(iunit) end ENDIF ga-5-4/tcgmsg/examples/blkdat240lin.f0000644000175000017500000001327312662210373015503 0ustar mbamba block data C$Id: blkdat240lin.f,v 1.2 1995-02-02 23:23:48 d3g681 Exp $ implicit double precision (a-h, o-z) include 'cscf.h' c c initalize data in common ... clumsy but avoids code to read in data c c line of sixteen be atoms 4.0 a.u. apart with 240 orbitals c c have 9s functions on each center and simulate p's by having c s function at +- 1 in each of x, y, z c data ax / 0.0d0, 4.0d0, 8.0d0, 12.0d0, $ 16.0d0, 20.0d0, 24.0d0, 28.0d0, $ 32.0d0, 36.0d0, 40.0d0, 44.0d0, $ 48.0d0, 52.0d0, 56.0d0, 60.0d0/ data ay / 16*0.0d0/ data az / 16*0.0d0/ data q /16*4.0d0/, enrep/152.3666555456/ c data x /9*0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, $ 9*4.0d0, 5.6d0, 2.4d0, 4.0d0, 4.0d0, 4.0d0, 4.0d0, $ 9*8.0d0, 9.6d0, 6.4d0, 8.0d0, 8.0d0, 8.0d0, 8.0d0, $ 9*12.0d0,13.6d0, 10.4d0,12.0d0,12.0d0,12.0d0,12.0d0, $ 9*16.0d0,17.6d0, 14.4d0,16.0d0,16.0d0,16.0d0,16.0d0, $ 9*20.0d0,21.6d0, 18.4d0,20.0d0,20.0d0,20.0d0,20.0d0, $ 9*24.0d0,25.6d0, 22.4d0,24.0d0,24.0d0,24.0d0,24.0d0, $ 9*28.0d0,29.6d0, 26.4d0,28.0d0,28.0d0,28.0d0,28.0d0, $ 9*32.0d0,33.6d0, 30.4d0,32.0d0,32.0d0,32.0d0,32.0d0, $ 9*36.0d0,37.6d0, 34.4d0,36.0d0,36.0d0,36.0d0,36.0d0, $ 9*40.0d0,41.6d0, 38.4d0,40.0d0,40.0d0,40.0d0,40.0d0, $ 9*44.0d0,45.6d0, 42.4d0,44.0d0,44.0d0,44.0d0,44.0d0, $ 9*48.0d0,49.6d0, 46.4d0,48.0d0,48.0d0,48.0d0,48.0d0, $ 9*52.0d0,53.6d0, 50.4d0,52.0d0,52.0d0,52.0d0,52.0d0, $ 9*56.0d0,57.6d0, 54.4d0,56.0d0,56.0d0,56.0d0,56.0d0, $ 9*60.0d0,61.6d0, 58.4d0,60.0d0,60.0d0,60.0d0,60.0d0/ data y /9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0/ data z /9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0/ data expnt /1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0/ end ga-5-4/tcgmsg/examples/runit0000755000175000017500000000062312662210373014224 0ustar mbamba#!/bin/csh -x foreach nproc (16 12 8 4 2 1) foreach demo (grid) echo `whoami` `hostname` $nproc $demo /tmp > ${demo}.p (time ../ipcv4.0/parallel $demo -ngrid 1024) >& ${demo}.log.${nproc} end end foreach nproc (16 12 8 4 2 1) foreach demo (mc) echo `whoami` `hostname` $nproc $demo /tmp > ${demo}.p (time ../ipcv4.0/parallel $demo) < mc.input >& ${demo}.log.${nproc} end end ga-5-4/tcgmsg/examples/cscf.h0000644000175000017500000000327412662210373014231 0ustar mbamba/*$Id: cscf.h,v 1.3 1995-02-02 23:23:54 d3g681 Exp $*/ c c include file defining common /cscf/ c c natom = no. of atoms (constant parameter) c nbfn = no. of basis functions (constant parameter) c nnbfn = nbfn*(nbfn+1)/2 (constant parameter) c nocc = no. of occupied orbitals (constant parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (natom = 1, nbfn = 15, nocc = 2, mxiter = 20) parameter (nnbfn = nbfn*(nbfn+1)/2, pi = 3.141592653589793d0) parameter (tol= 1.0d-4) parameter (tol2e=1.0d-7) c common /cscf/ $ enrep, q(natom), ax(natom), ay(natom), az(natom), $ x(nbfn), y(nbfn), z(nbfn), expnt(nbfn), rnorm(nbfn), $ iky(nbfn), icut1, icut2, icut3 c ga-5-4/tcgmsg/examples/random.c0000644000175000017500000000040212662210373014554 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: random.c,v 1.2 1995-02-02 23:24:25 d3g681 Exp $*/ double random_(seed) unsigned long *seed; { *seed = *seed *1812433253 + 12345; return (double) ((*seed & 0x7fffffff) * 4.6566128752458e-10); } ga-5-4/tcgmsg/examples/getmem.c0000644000175000017500000000155112662210373014560 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: getmem.c,v 1.2 1995-02-02 23:24:10 d3g681 Exp $*/ extern char * memalign(); #if (defined(AIX) || defined(NEXT) || defined(HPUX)) && !defined(EXTNAME) #define getmem_ getmem #endif #if defined(CRAY) || defined(ARDENT) #define getmem_ GETMEM #endif /* getmem gets n real*8 storage locations and returns its address (iaddr) and offset (ioff) within the real*8 array work so that the usable memory is (work(i+ioff),i=1,n). e.g. call getmem(n,work,iaddr,ioff) if (iaddr.eq.0) call error Mods are needed to release this later. */ void getmem_(pn,pwork,paddr,pioff) unsigned long *pn,*paddr,*pioff; double *pwork; { double *ptemp; unsigned int size = 8; ptemp = (double *) memalign(size, (unsigned) size* *pn); *paddr = (unsigned long) ptemp; *pioff = ptemp - pwork; } ga-5-4/tcgmsg/examples/Makefile.proto0000644000175000017500000001706412662210373015746 0ustar mbamba TOPDIR = TOP_LEVEL_DIRECTORY LIBDIR = $(TOPDIR)/ipcv4.0 TCGMSG = $(LIBDIR)/libtcgmsg.a INSTALL = echo "$@" is built IF CRAY #CRAY ... note that ranf is much faster than dran48 being used FC = cf77 CC = cc #older UNICOS # LIBS = -lbsd -lnet -lrpc LIBS = FFLAGS = -Zv -Wf"-dp" CFLAGS = -I$(LIBDIR) -DCRAY SCFBLAS = scfblas.o ENDIF CRAY IF SGI FC = f77 FFLAGS = -O2 CC = cc CFLAGS = -O -I$(LIBDIR) -I/usr/include/bsd -I/usr/include/sun -DSGI LIBS = -lmalloc -lbsd -lrpcsvc -lsun SCFBLAS = scfblas.o ENDIF SGI IF SGITFP #SGI IRIX ... note that need -lmalloc ... default break in Stress FC = f77 FFLAGS = -O2 -d8 -i8 CC = cc DEFINES = -DSGI -DSGITFP CFLAGS = -O $(DEFINES) LIBS = -lmalloc -lbsd -lrpcsvc SCFBLAS = scfblas.o ENDIF SGI IF KSR FC = f77 FFLAGS = -para -g -r8 CC = cc CFLAGS = -para -g -I$(LIBDIR) LIBS = -lrpc SCFBLAS = scfblas.o ENDIF KSR IF APOLLO #APOLLO GN10000 ... Apollo PRISM Domain/OS FC = f77 FFLAGS = -O CC = cc CFLAGS = -O -DAPOLLO -DCONVEX -I$(LIBDIR) \ -A nansi -A sys,bsd4.3 -A run,bsd4.3 LIBS = SCFBLAS = scfblas.o ENDIF IF CONVEX FC = fc FFLAGS = -O2 CC = cc CFLAGS = -O -DCONVEX -I$(LIBDIR) LIBS = SCFBLAS = ENDIF CONVEX IF HPUX FC = f77 CC = cc LIBS = FFLAGS = -O +ppu CFLAGS = -O -DHPUX -DEXTNAME -DPLOT -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF HPUX IF HPUXNOEXT FC = f77 CC = cc LIBS = FFLAGS = -O CFLAGS = -O -DHPUX -DPLOT -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF HPUXNOEXT IF SUN FC = f77 CC = cc LIBS = FFLAGS = -O3 -dalign -Nl99 CFLAGS = -O -dalign -DSUN -DPLOT -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF SUN IF DEC FC = f77 CC = cc LIBS = FFLAGS = -O2 CFLAGS = -O -DULTRIX -DPLOT -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF DEC IF DECOSF FC = f77 CC = cc LIBS = FFLAGS = -O -integer_size 64 -align dcommons -align records CFLAGS = -O -DDECOSF -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF DEC IF LINUX FC = f77 CC = cc LIBS = -lf2c -lipc FFLAGS = -O CFLAGS = -O -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF LINUX IF IPSC DELTA PARAGON AS = as860 FC = if77 CC = icc LIBS = -node -lkmath IF DELTA DEFINES = -DIPSC -DDELTA -DPLOT INSTALL = rcp "$@" delta1: & CFLAGS = -i860 -O $(DEFINES) -I$(LIBDIR) -Knoieee FFLAGS = -O2 -i860 -Knoieee ELSEIF PARAGON DEFINES = -DIPSC -DPARAGON -DPLOT INSTALL = echo "$@" is built CFLAGS = -nx -g -Knoieee $(DEFINES) FFLAGS = -nx -O2 -Knoieee ELSE DEFINES = -DIPSC -DPLOT INSTALL = rcp "$@" micron: & CFLAGS = -i860 -O $(DEFINES) -I$(LIBDIR) -Knoieee FFLAGS = -O2 -i860 -Knoieee ENDIF SCFBLAS = ENDIF IPSC DELTA PARAGON IF NEXT FC = f77 CC = cc FFLAGS = -g -f -N9 CFLAGS = -g -DNEXT -DEXTNAME -DPLOT -I$(LIBDIR) LIBS = SCFBLAS = scfblas.o ENDIF NEXT IF NEXTNOEXT FC = f77 CC = cc FFLAGS = -g -f CFLAGS = -g -DNEXT -DPLOT -I$(LIBDIR) LIBS = SCFBLAS = scfblas.o ENDIF NEXT IF IBM #IBM RISC 6000 ... AIX 3.1 ... -qEXTNAME # ... see the comments in the Makefile for the toolkit. FC = xlf LIBS = -lc FFLAGS = -O -g -qEXTNAME CFLAGS = -O -DPLOT -DAIX -DEXTNAME -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF IBM IF IBMNOEXT #IBM RISC 6000 ... AIX 3.1 # ... see the comments in the Makefile for the toolkit. FC = xlf LIBS = -lblas -lc FFLAGS = -O -g CFLAGS = -O -DPLOT -DAIX -I$(LIBDIR) SCFBLAS = ENDIF IBMNOEXT IF ARDENT FC = fc CC = cc LIBS = FFLAGS = -43 -O2 CFLAGS = -O2 -43 -DARDENT -DPLOT -I$(LIBDIR) SCFBLAS = scfblas.o ENDIF ARDENT IF ALLIANT ALLIANTMPP FC = fortran CC = fxc IF ALLIANT LIBS = -lalgebra -lsignal -lcommon ELSE LIBS = -lalgebra -lsignal -lcommon -lsw ENDIF FFLAGS = -g -Ogv -AS -uniproc -OM CFLAGS = -Ogv -uniproc -DALLIANT -I$(LIBDIR) SCFBLAS = ENDIF ALLIANT ###################################### # Should not need to modify below here ###################################### .SUFFIXES: .SUFFIXES: .o .f .c .s .s.o: $(AS) $*.s .f.o: $(FC) $(FFLAGS) -c $*.f .c.o: $(CC) $(CFLAGS) -c $*.c all everything: scf15 scf30 scf60 md mc jacobi grid template.p extra: scf60lin scf120lin scf240lin clean: /bin/rm -f *.o *.p core event* /bin/rm -f scf15 scf30 scf60 scf60lin scf120lin scf240lin /bin/rm -f md mc jacobi grid realclean: clean /bin/rm -f Makefile fexit.f *~ *.trace *.V demo TAGS msgtypesf.h #*# msgtypesf.h: $(LIBDIR)/msgtypesf.h cp $(LIBDIR)/msgtypesf.h . ############ #SCF example ############ # Note rather messy use of same fortran source but different # include/block data files and copy in make rule. # This screws up normal simple dependency of object on include files # and makes targets scf15/30/60 etc. unable to be made in parallel. SOBJ = $(SCFBLAS) integ.o output.o timer.o fexit.o diagon.o scf15: cscf15.h blkdat15.f scf.f $(SOBJ) cp cscf15.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat15.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) scf30: cscf30.h blkdat30.f scf.f $(SOBJ) cp cscf30.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat30.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) scf60: cscf60.h blkdat60.f scf.f $(SOBJ) cp cscf60.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat60.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) scf60lin: cscf60lin.h blkdat60lin.f scf.f $(SOBJ) cp cscf60lin.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat60lin.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) scf120lin: cscf120lin.h blkdat120lin.f scf.f $(SOBJ) cp cscf120lin.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat120lin.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) scf240lin: cscf240lin.h blkdat240lin.f scf.f $(SOBJ) cp cscf240lin.h cscf.h $(FC) $(FFLAGS) -o $@ scf.f blkdat240lin.f $(SOBJ) $(TCGMSG) $(LIBS) $(INSTALL) $(SOBJ) scf15 scf30 scf60 scf60lin scf120lin scf240lin: msgtypesf.h ########### #MD example ########### md: md.o dscal.o timer.o fexit.o $(FC) $(FFLAGS) -o $@ md.o dscal.o timer.o fexit.o \ $(TCGMSG) $(LIBS) $(INSTALL) md.o: msgtypesf.h ########### #MC example ########### mc: mc.o timer.o fexit.o $(FC) $(FFLAGS) -o $@ mc.o timer.o fexit.o $(TCGMSG) $(LIBS) $(INSTALL) mc.o: msgtypesf.h ################ # Jacobi example ################ IF CRAY JOBJ = fexit.o timer.o getmem.o ELSEIF IBMNOEXT ALLIANT JOBJ = fexit.o timer.o getmem.o mxv_dgemv.o ELSEIF IPSC DELTA JOBJ = fexit.o timer.o getmem.o mxv_daxpy1.o daxpy1.o ELSE JOBJ = fexit.o timer.o getmem.o mxv_fortran.o ENDIF jacobi: jacobi.o $(JOBJ) $(FC) $(FFLAGS) -o $@ jacobi.o $(JOBJ) $(TCGMSG) $(LIBS) $(INSTALL) jacobi.o: msgtypesf.h ############# #Grid example ############# grid: grid.o $(CC) $(CFLAGS) -o $@ grid.o $(TCGMSG) -lm $(LIBS) $(INSTALL) grid.o: $(LIBDIR)/msgtypesc.h ########### #template.p ########### template.p: echo "# This template is piped thru sed to replace" > template.p echo "# PROGRAM with the name of the program." >> template.p echo "# Add other hosts and processes as desired." >> template.p IF CRAY NEXT NEXTNOEXT echo "$$LOGNAME `hostname` 1 `pwd`/PROGRAM /tmp" >> template.p echo "$$LOGNAME `hostname` 1 `pwd`/PROGRAM /tmp" >> template.p echo "$$LOGNAME `hostname` 1 `pwd`/PROGRAM /tmp" >> template.p echo "$$LOGNAME `hostname` 1 `pwd`/PROGRAM /tmp" >> template.p ELSEIF IPSC echo '0 $$ ' PROGRAM . >> template.p ELSE echo "`whoami` `hostname` 4 `pwd`/PROGRAM /tmp" >> template.p ENDIF ga-5-4/tcgmsg/examples/blkdat120lin.f0000644000175000017500000000612612662210373015477 0ustar mbamba block data C$Id: blkdat120lin.f,v 1.2 1995-02-02 23:23:46 d3g681 Exp $ implicit double precision (a-h, o-z) include 'cscf.h' c c initalize data in common ... clumsy but avoids code to read in data c c line of eight be atoms 4.0 a.u. apart with 120 orbitals c c have 9s functions on each center and simulate p's by having c s function at +- 1 in each of x, y, z c data ax / 0.0d0, 4.0d0, 8.0d0, 12.0d0, 16.0d0, $ 20.0d0, 24.0d0, 28.0d0/ data ay / 8*0.0d0/ data az / 8*0.0d0/ data q /8*4.0d0/, enrep/54.9714285664/ c data x /9*0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, $ 9*4.0d0, 5.6d0, 2.4d0, 4.0d0, 4.0d0, 4.0d0, 4.0d0, $ 9*8.0d0, 9.6d0, 6.4d0, 8.0d0, 8.0d0, 8.0d0, 8.0d0, $ 9*12.0d0,13.6d0, 10.4d0,12.0d0,12.0d0,12.0d0,12.0d0, $ 9*16.0d0,17.6d0, 14.4d0,16.0d0,16.0d0,16.0d0,16.0d0, $ 9*20.0d0,21.6d0, 18.4d0,20.0d0,20.0d0,20.0d0,20.0d0, $ 9*24.0d0,25.6d0, 22.4d0,24.0d0,24.0d0,24.0d0,24.0d0, $ 9*28.0d0,29.6d0, 26.4d0,28.0d0,28.0d0,28.0d0,28.0d0/ data y /9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0/ data z /9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0/ data expnt /1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0/ end ga-5-4/tcgmsg/examples/cscf240lin.h0000644000175000017500000000330212662210373015152 0ustar mbamba/*$Id: cscf240lin.h,v 1.2 1995-02-02 23:23:57 d3g681 Exp $*/ c c include file defining common /cscf/ c c natom = no. of atoms (constant parameter) c nbfn = no. of basis functions (constant parameter) c nnbfn = nbfn*(nbfn+1)/2 (constant parameter) c nocc = no. of occupied orbitals (constant parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (natom =16, nbfn =240, nocc =32, mxiter = 30) parameter (nnbfn = nbfn*(nbfn+1)/2, pi = 3.141592653589793d0) parameter (tol= 0.5d-3) parameter (tol2e=1.0d-6) c common /cscf/ $ enrep, q(natom), ax(natom), ay(natom), az(natom), $ x(nbfn), y(nbfn), z(nbfn), expnt(nbfn), rnorm(nbfn), $ iky(nbfn), icut1, icut2, icut3 c ga-5-4/tcgmsg/examples/blkdat60lin.f0000644000175000017500000000352212662210373015417 0ustar mbamba block data C$Id: blkdat60lin.f,v 1.2 1995-02-02 23:23:52 d3g681 Exp $ implicit double precision (a-h, o-z) include 'cscf.h' c c initalize data in common ... clumsy but avoids code to read in data c c line of four be atoms 4.0 a.u. apart with 60 orbitals c c have 9s functions on each center and simulate p's by having c s function at +- 1 in each of x, y, z c data ax / 0.0d0, 4.0d0, 8.0d0, 12.0d0/ data ay / 0.0d0, 0.0d0, 0.0d0, 0.0d0/ data az / 0.0d0, 0.0d0, 0.0d0, 0.0d0/ data q /4*4.0d0/, enrep/17.3333333333333d0/ c data x /9*0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, $ 9*4.0d0, 5.6d0, 2.4d0, 4.0d0, 4.0d0, 4.0d0, 4.0d0, $ 9*8.0d0, 9.6d0, 6.4d0, 8.0d0, 8.0d0, 8.0d0, 8.0d0, $ 9*12.0d0,13.6d0, 10.4d0,12.0d0,12.0d0,12.0d0,12.0d0/ data y /9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0, $ 9*0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, 0.0d0, 0.0d0/ data z /9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0, $ 9*0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.6d0, -1.6d0/ data expnt /1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0, $ 1741.0d0, 262.1d0, 60.33d0, 17.62d0, 5.933d0, 2.185d0, $ 0.859, 0.1806d0, 0.05835d0, 6*0.3d0/ end ga-5-4/tcgmsg/examples/output.f0000644000175000017500000000523412662210373014647 0ustar mbamba subroutine output (z,rowlow,rowhi,collow,colhi,rowdim,coldim, $ nctl) c....................................................................... c output prints a real*8 matrix in formatted form with numbered rows c and columns. the input is as follows; c matrix(*,*).........matrix to be output c rowlow..............row number at which output is to begin c rowhi...............row number at which output is to end c collow..............column number at which output is to begin c colhi...............column number at which output is to end c rowdim..............row dimension of matrix(*,*) c coldim..............column dimension of matrix(*,*) c nctl................carriage control flag; 1 for single space c 2 for double space c 3 for triple space c the parameters that follow matrix are all of type integer*4. the c program is set up to handle 5 columns/page with a 1p5d24.15 format for c the columns. if a different number of columns is required, change c formats 1000 and 2000, and initialize kcol with the new number of c columns. c author; nelson h.f. beebe, quantum theory project, university of c florida, gainesville c....................................................................... C$Id: output.f,v 1.2 1995-02-02 23:24:22 d3g681 Exp $ implicit double precision (a-h,o-z) integer rowlow,rowhi,collow,colhi,rowdim,coldim,begin,kcol dimension z(rowdim,coldim) dimension asa(3) data column/8hcolumn /,asa/8h ,8h00000000 , 1 8h-------- /,blank/8h / data kcol/8/ data zero/0.d00/ do 11 i=rowlow,rowhi do 10 j=collow,colhi if (z(i,j).ne.zero) go to 15 10 continue 11 continue write (6,3000) 3000 format (/' zero matrix'/) go to 3 15 continue ctl = blank if ((nctl.le.3).and.(nctl.gt.0)) ctl = asa(nctl) if (rowhi.lt.rowlow) go to 3 if (colhi.lt.collow) go to 3 last = min0(colhi,collow+kcol-1) do 2 begin = collow,colhi,kcol write (6,1000) (column,i,i = begin,last) do 1 k = rowlow,rowhi do 4 i=begin,last if (z(k,i).ne.zero) go to 5 4 continue go to 1 5 write (6,2000) ctl,k,(z(k,i), i = begin,last) 1 continue last = min0(last+kcol,colhi) 2 continue 3 return * kcol = 4 * 1000 format (/1h ,16x,3(a6,i3,2x),(a6,i3)) * 2000 format (a1,3hrow,i4,2x,4f17.11) * kcol = 8 1000 format (/1h ,11x,7(a3,i3,3x),(a3,i3)) 2000 format (a1,'row',i4,1x,8f9.4) end ga-5-4/tcgmsg/examples/mxv_dgemv.f0000644000175000017500000000136112662210373015300 0ustar mbamba subroutine mxv(a,ncol,b,nrow,c) C$Id: mxv_dgemv.f,v 1.2 1995-02-02 23:24:20 d3g681 Exp $ implicit double precision (a-h, o-z) double precision a(ncol, nrow), b(nrow), c(ncol) parameter (ilen=500, jlen=60) c call dgemv('n', ncol, nrow, 1.0d0, a, ncol, b, 1, 0.0d0, c, 1) c$$$ do 10 i = 1, ncol c$$$ c(i) = 0.0d0 c$$$ 10 continue c$$$c c$$$ do 40 jlo = 1, nrow, jlen c$$$ jhi = min(jlo+jlen-1, nrow) c$$$ do 30 ilo = 1, ncol, ilen c$$$ ihi = min(ilo+ilen-1, ncol) c$$$ ndo = ihi - ilo + 1 c$$$ do 20 j = jlo, jhi c$$$ call daxpy2(ndo, b(j), a(ilo,j), c(ilo)) c$$$ 20 continue c$$$ 30 continue c$$$ 40 continue c end ga-5-4/tcgmsg/examples/README0000644000175000017500000001256612662210373014026 0ustar mbambaTCGMSG Examples =============== These example programs are realisitic (?) models of actual applications or algorithms from chemical-physics. They should make cleanly once the Makefile has been appropriately modified (which is done automatically for all supported machines). Serial and shared-memory parallel (and possibly CM and Linda) versions are also available but not included here. The programs may be run using the csh script demo in this directory The script takes a single argument which is the name of the desired demo (scf, md, mc, jacobi, grid). The script uses a template PROCGRP file (template.p) to generate the actual PROCGRP file used ... its makes a default file if one does not exist ... look in that for details. Self Consistent Field (scf) --------------------------- This SCF code is a cleaned up and much enhanced version of the one in Szabo and Ostlund. It uses distributed primitive 1s gaussian functions as a basis (thus emulating use of s,p,... functions) and computes integrals to essentially full accuracy. It is a direct SCF (integrals are computed each iteration using the Schwarz inequality for screeing). An atomic denisty is used for a starting guess. Damping and level shifting are used to aid convergence. Rather than complicate the program with code for parsing input the include file 'cscf.h' and block data file 'blkdata.f' contain all the data and thus there are three versions, one for each of the available problem sizes. The three sizes correpsond to 15 basis functions (Be), 30 basis functions (Be2) and 60 basis functions (tetrahedral Be4). [In addition to these three cases there are files for 60, 120 and 240 functions, which are not built by default (type 'make extra' for these). These are 4, 8 and 16 Be atoms, respectively, arranged in a line.] The O(N**4) step has been parallelized with the assumption that each process can hold all of the density and fock matrices which is reasonable for up to O(1000) basis functions on most workstations networks and many MIMD machines (e.g. iPSC-i860). The work is dynamically load-balanced, with tasks comprising 10 sets of integrals (ij|**) (see TWOEL() and NXTASK() in scf.f). The work of O(N**3) has not been parallelized, but has been optimized to use BLAS and a tweaked Jacobi diagonalizer with dynamic threshold selection. Molecular Dynamics (md) ----------------------- This program bounces a few thousand argon atoms around in a box with periodic boundary conditions. Pairwise interactions (Leonard-Jones) are used with a simple integration of the Newtonian equations of motion. This program is derived from the serial code of Deiter Heerman, but many modifications have been made. Prof. Frank Harris has a related FORTRAN 9X Connection Machine version. The O(N) work constructing the forces has been parallelized, as has the computation of the pair distribution function. The neighbour list is computed in parallel every 20 steps with a simple static decomposition. This then drives the parallelization of the forces computation. To make the simulation bigger increase the value of mm in the parameter statement at the top of md.f (mm=8 gives 2048 particles, mm=13 gives 8878). Each particle interacts with about 80 others, and the neighbor list is computed for about 130 neighbors to allow for movement before it is updated. Monte Carlo (mc) ---------------- This code evaluates the energy of the simplest explicitly correlated electronic wavefunction for the He atom ground state using a variational monte-carlo method without importance sampling. It is completely boringly parallel and for realistic problem sizes gives completely linear speed-ups for several hunderd processes. You have to give it the no. of moves to equilibrate the system for (neq) and the no. of moves to compute averages over (nstep). Apropriate values for a very short run are 200 and 500 respectively. Jacobi iterative linear equation solver (jacobi) ------------------------------------------------ Uses a naive jacobi iterative algorithm to solve a linear equation. This algorithm is not applicable to real linear equations (sic) and neither is it the most parallel algorithm available. The code as implemented here gets 780+ MFLOP on a 128 node iPSC-i860 ... a paltry 30% efficiency, but it is not hard to improve upon either. All the time is spent in a large matrix vector product which is statically distributed across the processes. You need to give it the matrix dimension (pick as big as will fit in memory). Solution of Laplace's equation on a 2-D grid (grid) --------------------------------------------------- Solve Laplace's eqn. on a 2-D square grid subject to b.c.s on the boundary. Use 5 point discretization of the operator and a heirarchy of grids with red/black gauss seidel w-relaxation. This is not the most efficient means of solving this equation (probably should use a fast-poisson solver) but it provides a 'real-world' example of spatial decomposition determining the parallel decomposition. It is also the only example of a full application in C that is included here. If the code is compiled with -DPLOT and run with the option '-plot XXX', where XXX is one of 'value', 'residual' or 'error', then grids are dumped at intervals to the file 'plot' (in the directory of process zero). This file may be displayed with the X11-R4/5 program xpix. Xpix is not built automatically and must be extracted and built from the shar file in this directory. ga-5-4/tcgmsg/examples/integ.f0000644000175000017500000000563512662210373014422 0ustar mbamba double precision function exprjh(x) C$Id: integ.f,v 1.2 1995-02-02 23:24:14 d3g681 Exp $ double precision x c c dumb solution to underflow problems on sun c if (x.lt.-37.0d0) then exprjh = 0.0d0 else exprjh = exp(x) endif end subroutine setfm implicit double precision (a-h,o-z) common/values/fm(2001,5),rdelta,delta,delo2 dimension t(2001),et(2001) c c initalize common block for computation of f0 by recursion down c from f200 c delta=28.0d0/2000.0d0 delo2=delta*0.5d0 rdelta=1.0d0/delta maxm=4 do 10 i=1,2001 tt=delta*dble(i-1) et(i)=exprjh(-tt) t(i)=2.0d0*tt fm(i,maxm+1)=0.0d0 10 continue do 20 i=200,maxm,-1 rr=1.0d0/dble(2*i+1) do 30 ii=1,2001 fm(ii,maxm+1)=(et(ii)+t(ii)*fm(ii,maxm+1))*rr 30 continue 20 continue do 40 i=maxm,1,-1 rr=1.0d0/dble(2*i-1) do 50 ii=1,2001 fm(ii,i)=(et(ii)+t(ii)*fm(ii,i+1))*rr 50 continue 40 continue c end subroutine f0(value, t) implicit real*8 (a-h,o-z) common/values/fm(2001,5),rdelta,delta,delo2 parameter(fac0=0.88622692545276d0, $ rhalf=0.5d0,rthird=0.3333333333333333d0,rquart=0.25d0) data t0/28.d0/ c c computes f0 to a relative accuracy of better than 4.e-13 for all t. c uses 4th order taylor expansion on grid out to t=28.0 c asymptotic expansion accurate for t greater than 28 c if(t.ge.t0) then value = fac0 / sqrt(t) else n = idint((t+delo2)*rdelta) x = delta*dble(n)-t n = n+1 value = fm(n,1)+x*(fm(n,2)+rhalf*x*(fm(n,3)+ $ rthird*x*(fm(n,4)+rquart*x*fm(n,5)))) endif c end subroutine addin(g, i, j, k, l, fock, dens, iky) implicit double precision (a-h, o-z) dimension fock(*), dens(*), iky(*) c c add (ij|kl) into the fock matrix c gg = g g2 = gg+gg g4 = g2+g2 ik = iky(i) + k il = iky(i) + l ij = iky(i) + j jk = iky(max(j,k)) + min(j,k) jl = iky(max(j,l)) + min(j,l) kl = iky(k) + l aij = g4*dens(kl)+fock(ij) fock(kl) = g4*dens(ij)+fock(kl) fock(ij) = aij gil=gg if(i.eq.k.or.j.eq.l) gg = g2 if(j.eq.k) gil = g2 ajk = fock(jk) - gil*dens(il) ail = fock(il) - gil*dens(jk) aik = fock(ik) - gg*dens(jl) fock(jl) = fock(jl) - gg*dens(ik) fock(jk) = ajk fock(il) = ail fock(ik) = aik c end subroutine dfill(n,val,a,ia) implicit real*8 (a-h,o-z) dimension a(*) c c initialise double precision array to scalar value c if (ia.eq.1) then do 10 i = 1, n a(i) = val 10 continue else do 20 i = 1,(n-1)*ia+1,ia a(i) = val 20 continue endif c end ga-5-4/tcgmsg/examples/runit.grid0000755000175000017500000000032112662210373015143 0ustar mbamba#!/bin/csh -x foreach nproc (16 12 8 4 2 1) foreach demo (grid) echo `whoami` `hostname` $nproc $demo /tmp > ${demo}.p (time ../ipcv4.0/parallel $demo -ngrid 1024) >& ${demo}.log.${nproc} end end ga-5-4/tcgmsg/examples/prtri.f0000644000175000017500000000136512662210373014450 0ustar mbamba subroutine prtri(d,n) c c ----- print out a real triangular matrix ----- c C$Id: prtri.f,v 1.2 1995-02-02 23:24:24 d3g681 Exp $ implicit double precision (a-h, o-z) dimension d(*),dd(6) iw = 6 c max = 6 imax = 0 100 imin = imax+1 imax = imax+max if (imax .gt. n) imax = n write (iw,9008) write (iw,8028) (i,i = imin,imax) do 160 j = 1,n k = 0 do 140 i = imin,imax k = k+1 m = max0(i,j)*(max0(i,j)-1)/2 + min0(i,j) dd(k) = d(m) 140 continue write (iw,8048) j,(dd(i),i = 1,k) 160 continue if (imax .lt. n) go to 100 return 9008 format(/) 8028 format(6x,6(4x,i4,4x)) 8048 format(i5,1x,6f12.6) end ga-5-4/tcgmsg/examples/mxv_daxpy1.f0000644000175000017500000000144112662210373015403 0ustar mbamba subroutine mxv(a,ncol,b,nrow,c) C$Id: mxv_daxpy1.f,v 1.2 1995-02-02 23:24:19 d3g681 Exp $ implicit double precision (a-h, o-z) dimension a(ncol, nrow), b(nrow), c(ncol) parameter (nchunk = 800) c c matrix vector product stripmined to optimize cache usage c when inner loop is replaced with a daxpy that uses pipelined c loads for a to avoid writing over c in the cache. c do 10 ilo = 1, ncol, nchunk ihi = min(ncol, ilo+nchunk-1) ndo = ihi - ilo + 1 do 20 i = ilo, ihi c(i) = 0.0d0 20 continue do 30 j = 1, nrow c do 40 i = ilo, ihi c c(i) = c(i) + a(i,j)*b(j) c40 continue call daxpy1(ndo, b(j), a(ilo, j), c(ilo)) 30 continue 10 continue c end ga-5-4/tcgmsg/examples/demo.proto0000644000175000017500000000467412662210373015160 0ustar mbamba#!/bin/csh set path = (../ipcv4.0 $path) echo " Example Message Passing Programs" echo " --------------------------------" echo "" IF IPSC if (! -e template.p) make template.p # Get cube size etc. echo -n 'Input options for parallel (default = -w -t 4 -C tcgmsg) ' set cube="$<" if ("$cube" == "") set cube = '-w -t 4 -C tcgmsg' echo " " ELSEIF DELTA # Get mesh size for the Delta echo -n 'Input desired submesh with no spaces (default = 4,4) ' set mesh="$<" if ("$mesh" == "") set mesh = "4,4" echo " " ELSE # Find/generate template PROCGRP file if (! -e template.p) then echo "$0 : template.p not found. A default using this host only will be made." echo "$0 : ... add extra hosts and processes as desired. " make template.p endif ENDIF # Check no. of arguments if ($#argv != 1) then echo "$0 : a single argument is required" echo "usage: $0 scf|md|mc|jacobi|grid" exit 1 endif # Jump to desired example set ARGS = " " switch ("$1") case "scf": goto SCF breaksw case "grid" goto GRID breaksw case "md": case "mc": case "jacobi": set PROGRAM = "$1" goto RUNIT breaksw default: echo "usage: $0 scf|md|mc|jacobi|grid" exit 1 endsw # For GRID find out how big a grid GRID: echo -n 'Input arguments for grid program ' set ARGS="$<" set PROGRAM = grid goto RUNIT # For SCF find out how many basis functions SCF: getnbfn: echo -n 'Input no. of basis functions to use (15, 30, 60) ' set nbfn="$<" if ( ("$nbfn" != 15) && ("$nbfn" != 30) && ("$nbfn" != 60) ) goto getnbfn echo "" if ($nbfn == 60) then echo 'Sixty basis functions can take a long time ... be patient' echo "" endif set PROGRAM = scf$nbfn goto RUNIT RUNIT: IF DELTA echo " " echo "Run $PROGRAM on the mesh ($mesh)" echo " " # Actually run the sucker ... assumes can use rcp and rsh to delta1 echo rcp $PROGRAM delta1: rcp $PROGRAM delta1: echo rsh delta1 mexec "-t\(${mesh}\) -f '$PROGRAM $ARGS'" rsh delta1 mexec "-t\(${mesh}\) -f '$PROGRAM $ARGS'" ELSE # Generate the actual PROCGRP file from the template and print out # summary of it sed "s/PROGRAM/$PROGRAM/" < template.p > {$PROGRAM}.p IF IPSC echo "time parallel $cube $PROGRAM" time parallel $cube $PROGRAM ELSE echo "" echo 'The following hosts/processes will be used:' echo ' ' awk 'NF==5 {printf("%25s ... %d processes\n",$2,$3)}' < {$PROGRAM}.p echo "" echo time parallel $PROGRAM $ARGS echo "" time parallel $PROGRAM $ARGS ENDIF ENDIF ga-5-4/tcgmsg/examples/trace.out0000644000175000017500000000046512662210373014770 0ustar mbamba#*********** PROGRAM STACKTRACE ************** # text address function cp func start # ------------ ----------- ---------- 0x1176840 0x81b8858 0x1175fd0 0x1174ea8 0x81b8498 0x1174900 0x119a208 0x81bdd10 0x119a000 #*************** END STACKTRACE ************** ga-5-4/tcgmsg/examples/cscf15.h0000644000175000017500000000327612662210373014401 0ustar mbamba/*$Id: cscf15.h,v 1.2 1995-02-02 23:23:56 d3g681 Exp $*/ c c include file defining common /cscf/ c c natom = no. of atoms (constant parameter) c nbfn = no. of basis functions (constant parameter) c nnbfn = nbfn*(nbfn+1)/2 (constant parameter) c nocc = no. of occupied orbitals (constant parameter) c mxiter = maximim no. of iterations(constant parameter) c tol = convergence criterion (constant parameter) c pi = a familiar constant (constant parameter) c tol2e = 2-e integral screening (constant parameter) c c the remainder is initialized in block data or in the c routine ininrm (rnorm and iky) c c enrep = nuclear repulsion energy c q(1:natom) = nuclear charge of atom c ax(1:natom) = x co-ordinate of atom c ay(1:natom) = y ... c az(1:natom) = z ... c x(1:nbfn) = x co-ordinate of basis function c y(1:nbfn) = y ... c z(1:nbfn) = z ... c expnt(1:nbfn)= exponent of gaussian c rnorm(1:nbfn)= normalization constant of gaussian c iky(1:nbfn) = iky(i) = i*(i-1)/2 to speed up fock build c icut1 = no. of successful ij 2-e screening tests c icut2 = no. of successful ijkl 2-e screening tests c icut3 = no. of 2-e integrals computed c parameter (natom = 1, nbfn = 15, nocc = 2, mxiter = 20) parameter (nnbfn = nbfn*(nbfn+1)/2, pi = 3.141592653589793d0) parameter (tol= 1.0d-4) parameter (tol2e=1.0d-7) c common /cscf/ $ enrep, q(natom), ax(natom), ay(natom), az(natom), $ x(nbfn), y(nbfn), z(nbfn), expnt(nbfn), rnorm(nbfn), $ iky(nbfn), icut1, icut2, icut3 c ga-5-4/tcgmsg/examples/md.f0000644000175000017500000003670712662210373013720 0ustar mbambac c md example program due to dieter heermann c restructured and pdf added by rjh december 1990 c c the message passing version distributes the computation c of the forces (order npart**2) over the processes, assuming c that each process has all of the co-ordinates. c A global add then gives each process all the information c needed to compute the next update. c None of the order npart work has been parallelized so that c will begin to dominate on many processors. c implicit double precision (a-h, o-z) c parameter (mm = 13, lenpdf = 256) c parameter (mm = 8, lenpdf = 256) c parameter (mm = 6, lenpdf = 256) C$Id: md.f,v 1.2 1995-02-02 23:24:18 d3g681 Exp $ parameter (mm = 4, lenpdf = 256) c parameter (mm = 3, lenpdf = 256) parameter (npart = 4*mm*mm*mm) parameter (maxint = npart*150) include 'msgtypesf.h' c dimension x(1:npart,1:3), vh(1:npart,1:3),f(1:npart,1:3), & pdf(1:lenpdf+1), times(8), inter(2,maxint) data times/8*0.0d0/ c c initalize message passing environment c call pbeginf me = nodeid() c c parameter definition (density, volume, temperature ...) c den = 0.83134d0 side = (dble(npart) / den)**0.3333333d0 tref = 0.722d0 rcoff = min(3.5d0, side/2.0d0) c islow = 1 to match the rather large original timestep islow = 4 h = 0.064d0 / islow irep = 50 istop = 400 iprint = 10 ineigh = 10 * (1 + islow/4) movemx = 800 delpdf = 0.5d0*side/lenpdf rdelp = 1.0d0 / delpdf c if (me.eq.0)write(6,1) npart,side,rcoff,tref,h,delpdf,irep,istop, & iprint,ineigh,movemx 1 format(' molecular dynamics simulation example program'/ & ' ---------------------------------------------'// & ' number of particles is ............ ',i6/ & ' side length of the box is ......... ',f13.6/ & ' cut off is ........................ ',f13.6/ & ' reduced temperature is ............ ',f13.6/ & ' basic time step is ................ ',f13.6/ & ' pdf sampling interval ............. ',f13.6/ & ' temperature scale interval ........ ',i6/ & ' stop scaling at move .............. ',i6/ & ' print interval .................... ',i6/ & ' update neighbor list every ........ ',i6, ' steps'/ & ' total no. of steps ................ ',i6) c call flush(6) c a = side / dble(mm) sideh = side * 0.5d0 hsq = h * h hsq2 = hsq * 0.5d0 npartm = npart - 1 rcoffs = rcoff * rcoff tscale = 16.0d0 / (1.0d0 * npart - 1.0d0) vaver = 1.13d0 * sqrt(tref / 24.0d0) ekinavg = 0.0d0 c c generate fcc lattice for atoms inside box c rjunk = timer() call fcc(x, npart, mm, a) times(1) = times(1) + timer() c c initialise velocites and forces (which are zero in fcc positions) c call mxwell(vh,3*npart,h,tref) call dfill(3*npart, 0.0d0, f, 1) times(2) = times(2) + timer() c c start of md. c if (me.eq.0) write(6,3) 3 format(//1x,' i ',' ke ',' pe ',' e ', & ' temp ',' pres ',' vel ',' rp'/ & 1x,' -----',' ----------',' ----------',' ----------', & ' --------',' --------',' --------',' ----') c call flush(6) c do 200 move = 1,movemx if (move.eq.1 .or. move.eq.(istop+1)) $ call dfill(lenpdf, 0.0d0, pdf, 1) c c move the particles and partially update velocities c call domove(3*npart,x,vh,f,side) times(3) = times(3) + timer() c c compute forces in the new positions and accumulate the pdf c virial and potential energy. Have to get the full forces c on each node, hence the dgop (global add). c if (mod(move-1,ineigh).eq.0) then call neigh(npart, x, side, rcoff, ninter, inter, maxint, $ pdf, rdelp, lenpdf) times(8) = times(8) + timer() endif call forces(npart, x, f, vir, epot, side, rcoff, ninter, inter) call dgop(1+MSGDBL, f, 3*npart, '+') times(4) = times(4) + timer() c c scale forces, complete update of velocites and compute k.e. c call mkekin(npart,f,vh,hsq2,hsq,ekin) ekinavg = ekinavg + ekin times(5) = times(5) + timer() c c average the velocity and temperature scale if desired c if ((move.le.istop) .and. (mod(move, irep).eq.0)) then call velavg(npart, vh, vaver, count, vel, h) sc = sqrt( tref / (tscale * ekinavg / irep) ) call dscal(3*npart, sc, vh, 1) ekinavg = 0.0d0 endif times(6) = times(6) + timer() c c printout information if desired ... have to do global c sum to get full potential energy and virial c if (mod(move, iprint) .eq. 0) then call velavg(npart, vh, vaver, count, vel, h) call dgop(2+MSGDBL, epot, 1, '+') call dgop(2+MSGDBL, vir, 1, '+') if (me.eq.0) $ call prnout(move, ekin, epot, tscale, vir, vel, count, $ npart, den) times(7) = times(7) + timer() endif c 200 continue c c print out the pdf at the end of the calculation c have first to get contribution from everyone with global add c call dgop(2+MSGDBL, pdf, lenpdf, '+') if (me.eq.0) $ call prnpdf(lenpdf, pdf, side, delpdf, npart, movemx-istop, $ ineigh) times(7) = times(7) + timer() if (me.eq.0) write(6,431) nnodes(),(times(i),i=1,8) 431 format(' nproc geom mxwell domove forces ekin velscl', & ' print neigh' & /1x,i6,8f8.2) c if (me.eq.0) call stats call pend call fexit end subroutine mxwell(vh,n3,h,tref) implicit double precision (a-h, o-z) dimension vh(1:n3) c c sample maxwell distribution at temperature tref c c alliant 3 iseed = 4711 ujunk = drand48(iseed) iseed = 0 npart = n3/3 iof1 = npart iof2 = npart*2 tscale = 16.0d0 / (1.0d0 * npart - 1.0d0) do 10 i = 1,n3,2 c c cray 2 c1 u1 = ranf() c u2 = ranf() c alliant 2 1 u1 = drand48(iseed) u2 = drand48(iseed) v1 = 2.0d0 * u1 - 1.0d0 v2 = 2.0d0 * u2 - 1.0d0 s = v1*v1 + v2*v2 if (s.ge.1.0) goto 1 c r = sqrt(-2.0d0*dlog(s)/s) vh(i) = v1 * r vh(i+1) = v2 * r 10 continue c ekin = 0.0d0 sp = 0.0d0 do 20 i = 1,npart sp = sp + vh(i) 20 continue sp = sp / npart do 21 i = 1,npart vh(i) = vh(i) - sp ekin = ekin + vh(i)*vh(i) 21 continue sp = 0.0d0 do 22 i = iof1 + 1,iof2 sp = sp + vh(i) 22 continue sp = sp / npart do 23 i = iof1 + 1,iof2 vh(i) = vh(i) - sp ekin = ekin + vh(i)*vh(i) 23 continue sp = 0.0d0 do 24 i = iof2 + 1,n3 sp = sp + vh(i) 24 continue sp = sp / npart do 25 i = iof2 + 1,n3 vh(i) = vh(i) - sp ekin = ekin + vh(i)*vh(i) 25 continue ts = tscale * ekin sc = h * sqrt(tref/ts) do 30 i = 1,n3 vh(i) = vh(i) * sc 30 continue c end subroutine domove(n3,x,vh,f,side) implicit double precision (a-h, o-z) dimension x(n3),vh(n3),f(n3) c c move particles c do 10 i = 1,n3 x(i) = x(i) + vh(i) + f(i) c periodic boundary conditions if (x(i).lt.0.0d0) x(i) = x(i) + side if (x(i).gt.side) x(i) = x(i) - side c partial velocity updates vh(i) = vh(i) + f(i) c initialise forces for next iteration f(i) = 0.0d0 10 continue c end subroutine mkekin(npart,f,vh,hsq2,hsq,ekin) implicit double precision (a-h, o-z) dimension f(1:npart,3),vh(1:npart,3) c c scale forces, update velocites and compute k.e. c sum = 0.0d0 do 10 ix = 1,3 do 20 i = 1,npart f(i,ix) = f(i,ix) * hsq2 vold = vh(i,ix) vh(i,ix) = vh(i,ix) + f(i,ix) sum = sum + vh(i,ix) * vh(i,ix) 20 continue 10 continue ekin = sum / hsq c end subroutine fcc(x, npart, mm, a) implicit double precision (a-h, o-z) dimension x(1:npart, 3) c c generate fcc lattice for atoms inside box c ijk = 0 do 10 lg = 0,1 do 11 i = 0,mm-1 do 12 j = 0,mm-1 do 13 k = 0,mm-1 ijk = ijk + 1 x(ijk,1) = i * a + lg * a * 0.5d0 x(ijk,2) = j * a + lg * a * 0.5d0 x(ijk,3) = k * a 13 continue 12 continue 11 continue 10 continue do 20 lg = 1,2 do 21 i = 0,mm-1 do 22 j = 0,mm-1 do 23 k = 0,mm-1 ijk = ijk + 1 x(ijk,1) = i * a + (2-lg) * a * 0.5d0 x(ijk,2) = j * a + (lg-1) * a * 0.5d0 x(ijk,3) = k * a + a * 0.5d0 23 continue 22 continue 21 continue 20 continue c end subroutine dfill(n,val,a,ia) implicit double precision (a-h, o-z) dimension a(*) c c initialise double precision array to scalar value c do 10 i = 1,(n-1)*ia+1,ia a(i) = val 10 continue c end subroutine prnout(move, ekin, epot, tscale, vir, vel, count, $ npart, den) implicit double precision (a-h, o-z) c c printout interesting (?) information at current timestep c ek = 24.0d0 * ekin epot = 4.0d0 * epot etot = ek + epot temp = tscale * ekin pres = den * 16.0d0 * (ekin - vir) / npart vel = vel / npart rp = (count / dble(npart)) * 100.0d0 write(6,2) move,ek,epot,etot,temp,pres,vel,rp 2 format(1x,i6,3f12.4,f10.4,f10.4,f10.4,f6.1) c call flush(6) c end subroutine velavg(npart, vh, vaver, count, vel, h) implicit double precision (a-h, o-z) dimension vh(npart, 3) c c compute average velocity c vaverh = vaver*h vel = 0.0d0 count = 0.0d0 do 10 i = 1,npart sq = sqrt(vh(i,1)**2 + vh(i,2)**2 + vh(i,3)**2) if (sq.gt.vaverh) count = count + 1.0d0 vel = vel + sq 10 continue vel = vel / h c end subroutine prnpdf(lenpdf, pdf, side, delpdf, npart, nmove, ineigh) implicit double precision (a-h, o-z) dimension pdf(lenpdf) c c final scaling and printout of the pdf c write(6,1) 1 format(/' pair distribution function written to file pdf.dat'/) open(1, file='pdf.dat', form='formatted', status='unknown', $ err=999) c coord = 0.0d0 volfac = side*side*side / (4.0d0*delpdf*delpdf*delpdf*3.141593d0) facnn = 2.0d0 / dble(npart*nmove/ineigh) facn = 1.0d0 / dble(npart) do 10 i = 1,lenpdf ri = dble(i) grfac = volfac / (ri*ri) func = pdf(i) * facnn coord = coord + func pdf(i) = func * grfac * facn write(1,2) dble(i)*delpdf,pdf(i),coord 10 continue 2 format(1x,f7.3,f13.6,4x,f9.2) close(1) return c 999 write(6,*) ' error opening pdf.dat' call parerr(999) c end subroutine neigh(npart, x, side, rcoff, ninter, inter, maxint, $ pdf, rdelp, lenpdf) implicit double precision (a-h, o-z) dimension x(npart, 3), inter(2,maxint), pdf(lenpdf) c c Form my part of the neighbour list and also compute the pair c distribution function. c c npart = no. of particles c x(,) = coords c side = side of box c rcoff = cutoff for force c ninter= returns no. of interactions c inter(,) = returns interactions c maxint = size of inter c me = nodeid() nproc = nnodes() c sideh = 0.5d0*side rcoffs = (rcoff*1.2d0)**2 ninter = 0 c c Get better work distribution by having the same c processor handle particles (i) and (npart-i) c Note that assume that npart is even. c do 270 ii = me+1, npart/2, nproc do 275 icase = 1, 2 if (icase .eq. 1) then i = ii else i = npart - ii endif xi = x(i,1) yi = x(i,2) zi = x(i,3) do 280 j = i+1,npart ij = ij + 1 xx = xi - x(j,1) yy = yi - x(j,2) zz = zi - x(j,3) if (xx .lt. -sideh) xx = xx + side if (xx .gt. sideh) xx = xx - side if (yy .lt. -sideh) yy = yy + side if (yy .gt. sideh) yy = yy - side if (zz .lt. -sideh) zz = zz + side if (zz .gt. sideh) zz = zz - side rd = xx*xx + yy*yy + zz*zz ipdf = min(sqrt(rd),sideh) * rdelp + 1 pdf(ipdf) = pdf(ipdf) + 1.0d0 if (rd .le. rcoffs) then ninter = ninter + 1 if (ninter.gt.maxint) then write(6,*) ' too many interactions ', ninter call parerr(1) endif inter(1,ninter) = i inter(2,ninter) = j endif 280 continue 275 continue 270 continue c c$$$ ij = ninter c$$$ call igop(99, ij, 1, '+') c$$$ if (me .eq. 0) then c$$$ write(6,*) ' No. of interactions per particle = ', c$$$ $ ij/npart c$$$ endif c end subroutine forces(npart, x, f, vir, epot, side, rcoff, $ ninter, inter) implicit double precision (a-h, o-z) logical oshift parameter (oshift = .true.) dimension x(npart, 3), f(npart, 3), inter(2, ninter) c c compute forces driven by the neighbour list c vir = 0.0d0 epot = 0.0d0 sideh = 0.5d0*side rcoffs = rcoff*rcoff c c for shifted potential ... set oshift true to enable c if (oshift) then rc6 = 1.0d0 / rcoff**6 rc12 = 1.0d0 / rcoff**12 ecut = rc12 - rc6 fcut = (rc12 - 0.5d0*rc6)/rcoff efcut = 12.0d0 * fcut endif c do 10 ij = 1, ninter i = inter(1,ij) j = inter(2,ij) xx = x(i,1) - x(j,1) yy = x(i,2) - x(j,2) zz = x(i,3) - x(j,3) if (xx .lt. -sideh) xx = xx + side if (xx .gt. sideh) xx = xx - side if (yy .lt. -sideh) yy = yy + side if (yy .gt. sideh) yy = yy - side if (zz .lt. -sideh) zz = zz + side if (zz .gt. sideh) zz = zz - side rd = xx*xx + yy*yy + zz*zz if (rd .le. rcoffs) then rrd = 1.0d0/rd rrd2 = rrd*rrd rrd3 = rrd2*rrd rrd4 = rrd2*rrd2 rrd6 = rrd2*rrd4 rrd7 = rrd6*rrd epot = epot + (rrd6 - rrd3) r148 = rrd7 - 0.5d0*rrd4 if (oshift) then r = sqrt(rd) epot = epot - ecut + efcut*(r-rcoff) r148 = r148 - fcut / r endif vir = vir - rd*r148 forcex = xx * r148 f(i,1) = f(i,1) + forcex f(j,1) = f(j,1) - forcex forcey = yy * r148 f(i,2) = f(i,2) + forcey f(j,2) = f(j,2) - forcey forcez = zz * r148 f(i,3) = f(i,3) + forcez f(j,3) = f(j,3) - forcez endif 10 continue c end ga-5-4/tcgmsg/tcgmsg.h0000644000175000017500000000277612662210373012767 0ustar mbamba/** @file * This header file declares the public C API to tcgmsg. */ #ifndef TCGMSG_H_ #define TCGMSG_H_ #ifdef __cplusplus extern "C" { #endif extern void tcg_alt_pbegin(); extern void tcg_brdcst(long type, void *buf, long lenbuf, long originator); extern void tcg_dgop(long type, double *x, long n, char *op); extern double tcg_drand48(); extern void tcg_error(char *msg, long code); extern void tcg_igop(long type, long *x, long n, char *op); extern void tcg_llog(); extern long tcg_mdtob(long n); extern long tcg_mdtoi(long n); extern long tcg_mitob(long n); extern long tcg_mitod(long n); extern long tcg_mtime(); extern long tcg_niceftn(long ival); extern long tcg_nnodes(); extern long tcg_nodeid(); extern long tcg_nxtval(long mproc); extern void tcg_parerr(long code); extern void tcg_pbeginf(); extern void tcg_pbegin(int argc, char **argv); extern void tcg_pbginf(); extern void tcg_pend(); extern void tcg_pfcopy(long type, long node0, char *fname); extern long tcg_probe(long type, long node); extern void tcg_rcv(long type, void *buf, long lenbuf, long *lenmes, long nodeselect, long *nodefrom, long sync); extern long tcg_ready(); extern void tcg_setdbg(long value); extern void tcg_snd(long type, void *buf, long lenbuf, long node, long sync); extern void tcg_srand48(long seed); extern void tcg_stats(); extern void tcg_synch(long type); extern double tcg_time(); extern void tcg_waitcom(long node); #ifdef __cplusplus } #endif #endif /* TCGMSG_H_ */ ga-5-4/tcgmsg/fapi.c0000644000175000017500000001337712662210372012413 0ustar mbamba/** * @file fapi.c * * Implements the Fortran interface to TCGMSG. */ #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "farg.h" #include "typesf2c.h" #include "srftoc.h" #include "sndrcv.h" #define _BRDCST_ F77_FUNC(brdcst, BRDCST) #define _DGOP_ F77_FUNC(dgop, DGOP) #define _DRAND48_ F77_FUNC(drand48, DRAND48) #define _IGOP_ F77_FUNC(igop, IGOP) #define _LLOG_ F77_FUNC(llog, LLOG) #define _MDTOB_ F77_FUNC(mdtob, MDTOB) #define _MDTOI_ F77_FUNC(mdtoi, MDTOI) #define _MITOB_ F77_FUNC(mitob, MITOB) #define _MITOD_ F77_FUNC(mitod, MITOD) #define _MTIME_ F77_FUNC(mtime, MTIME) #define _NICEFTN_ F77_FUNC(niceftn, NICEFTN) #define _NNODES_ F77_FUNC(nnodes, NNODES) #define _NODEID_ F77_FUNC(nodeid, NODEID) #define _NXTVAL_ F77_FUNC(nxtval, NXTVAL) #define _PARERR_ F77_FUNC(parerr, PARERR) #define _PBEGINF_ F77_FUNC(pbeginf, PBEGINF) #define _PBGINF_ F77_FUNC(pbginf, PBGINF) #define _PEND_ F77_FUNC(pend, PEND) #define _PFCOPY_ F77_FUNC(pfcopy, PFCOPY) #define _PFILECOPY_ F77_FUNC(pfilecopy, PFILECOPY) #define _PROBE_ F77_FUNC(probe, PROBE) #define _RCV_ F77_FUNC(rcv, RCV) #define _SETDBG_ F77_FUNC(setdbg, SETDBG) #define _SND_ F77_FUNC(snd, SND) #define _SRAND48_ F77_FUNC(srand48, SRAND48) #define _STATS_ F77_FUNC(stats, STATS) #define _SYNCH_ F77_FUNC(synch, SYNCH) #define _TCGREADY_ F77_FUNC(tcgready, TCGREADY) #define _TCGTIME_ F77_FUNC(tcgtime, TCGTIME) #define _WAITCOM_ F77_FUNC(waitcom, WAITCOM) void FATR _BRDCST_(Integer *type, void *buf, Integer *lenbuf, Integer *originator) { long atype = *type; long alenbuf = *lenbuf; long aoriginator = *originator; BRDCST_(&atype, buf, &alenbuf, &aoriginator); } void FATR _DGOP_(Integer *type, DoublePrecision *x, Integer *n, char *op, int oplen) { long atype = *type; long an = *n; double *ax; int i; ax = (double*)malloc(an * sizeof(double)); for (i=0; i #include #include "sndrcv.h" void tcg_alt_pbegin(int *argc, char **argv[]) { tcgi_pbegin(*argc, *argv); } void tcg_brdcst(long type, void *buf, long lenbuf, long originator) { long atype = type; long alenbuf = lenbuf; long aoriginator = originator; BRDCST_(&atype, buf, &alenbuf, &aoriginator); } void tcg_dgop(long type, double *x, long n, char *op) { long atype = type; long an = n; double *ax; int i; ax = (double*)malloc(n * sizeof(double)); for (i=0; i #endif #if HAVE_STRING_H # include #endif #include "farg.h" #include "sndrcv.h" #include "srftoc.h" #define LEN 255 extern int tcgi_argc; extern char **tcgi_argv; /** * Hewlett Packard Risc box, SparcWorks F77 2.* and Paragon compilers. * Have to construct the argument list by calling FORTRAN. */ void PBEGINF_() { ga_f2c_get_cmd_args(&tcgi_argc, &tcgi_argv); tcgi_pbegin(tcgi_argc, tcgi_argv); } /** * Alternative entry for those senstive to FORTRAN making reference * to 7 character external names */ void PBGINF_() { PBEGINF_(); } ga-5-4/tcgmsg/tcgmsg-mpi/checkbyte.c0000644000175000017500000000067212662210372015476 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif unsigned char CheckByte(unsigned char *c, long n) { /* unsigned char sum = (char) 0; while (n-- > 0) { sum = sum ^ *c++; } return sum; */ unsigned int sum = 0; unsigned int mask = 0xff; while (n-- > 0) { sum += (int) *c++; } sum = (sum + (sum>>8) + (sum>>16) + (sum>>24)) & mask; return (unsigned char) sum; } ga-5-4/tcgmsg/tcgmsg-mpi/niceftn.c0000644000175000017500000000046412662210372015162 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_UNISTD_H # include #endif #include "srftoc.h" /** * Wrapper around nice for FORTRAN users courtesy of Rick Kendall * ... C has the system interface. */ long NICEFTN_(long *ival) { int val = (int)(*ival); return nice(val); } ga-5-4/tcgmsg/tcgmsg-mpi/collect.c0000644000175000017500000001023112662210372015152 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "tcgmsgP.h" /* size of internal buffer for global ops */ #define DGOP_BUF_SIZE 65536 #define IGOP_BUF_SIZE 65536 /*#define IGOP_BUF_SIZE (sizeof(double)/sizeof(long))*DGOP_BUF_SIZE */ static double dgop_work[DGOP_BUF_SIZE]; /**< global ops buffer */ static long igop_work[IGOP_BUF_SIZE]; /**< global ops buffer */ /** * global operations -- integer version */ void IGOP_(long *ptype, long *x, long *pn, char *op, int oplen) { long *work = (long *) igop_work; long nleft = *pn; long buflen = TCG_MIN(nleft,IGOP_BUF_SIZE); /**< Try to get even sized buffers */ long nbuf = (nleft-1) / buflen + 1; long n; /* #ifdef ARMCI */ if(!_tcg_initialized){ PBEGINF_(); } /* #endif */ buflen = (nleft-1) / nbuf + 1; if (strncmp(op,"abs",3) == 0) { n = *pn; while(n--) { x[n] = TCG_ABS(x[n]); } } while (nleft) { int root = 0; int ierr = MPI_SUCCESS; int ndo = TCG_MIN(nleft, buflen); if (strncmp(op,"+",1) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_INT, MPI_SUM, root, TCGMSG_Comm); } else if (strncmp(op,"*",1) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_INT, MPI_PROD, root, TCGMSG_Comm); } else if (strncmp(op,"max",3) == 0 || strncmp(op,"absmax",6) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_INT, MPI_MAX, root, TCGMSG_Comm); } else if (strncmp(op,"min",3) == 0 || strncmp(op,"absmin",6) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_INT, MPI_MIN, root, TCGMSG_Comm); } else if (strncmp(op,"or",2) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_INT, MPI_BOR, root, TCGMSG_Comm); } else { Error("IGOP: unknown operation requested", (long) *pn); } tcgmsg_test_statusM("IGOP: MPI_Reduce:", ierr ); ierr = MPI_Bcast(work, ndo, TCG_INT, root, TCGMSG_Comm); tcgmsg_test_statusM("IGOP: MPI_Bcast:", ierr); n = ndo; while(n--) { x[n] = work[n]; } nleft -= ndo; x+= ndo; } } /** * global operations -- double version */ void DGOP_(long *ptype, double *x, long *pn, char *op, int oplen) { double *work= dgop_work; long nleft = *pn; long buflen = TCG_MIN(nleft,DGOP_BUF_SIZE); /**< Try to get even sized buffers */ long nbuf = (nleft-1) / buflen + 1; long n; buflen = (nleft-1) / nbuf + 1; if (strncmp(op,"abs",3) == 0) { n = *pn; while(n--) { x[n] = TCG_ABS(x[n]); } } while (nleft) { int root = 0; int ierr = MPI_SUCCESS; int ndo = TCG_MIN(nleft, buflen); if (strncmp(op,"+",1) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_DBL, MPI_SUM, root, TCGMSG_Comm); } else if (strncmp(op,"*",1) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_DBL, MPI_PROD, root, TCGMSG_Comm); } else if (strncmp(op,"max",3) == 0 || strncmp(op,"absmax",6) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_DBL, MPI_MAX, root, TCGMSG_Comm); } else if (strncmp(op,"min",3) == 0 || strncmp(op,"absmin",6) == 0) { ierr = MPI_Reduce(x, work, ndo, TCG_DBL, MPI_MIN, root, TCGMSG_Comm); } else { Error("DGOP: unknown operation requested", (long) *pn); } tcgmsg_test_statusM("DGOP: MPI_Reduce:", ierr ); ierr = MPI_Bcast(work, ndo, TCG_DBL, root, TCGMSG_Comm); tcgmsg_test_statusM("DGOP: MPI_Bcast:", ierr ); n = ndo; while(n--) { x[n] = work[n]; } nleft -= ndo; x+= ndo; } } /** * Synchronize processes */ void SYNCH_(long *type) { /* #ifdef ARMCI */ if(!_tcg_initialized){ PBEGINF_(); } /* #endif */ MPI_Barrier(TCGMSG_Comm); } /** * broadcast buffer to all other processes from process originator */ void BRDCST_(long *type, void *buf, long *lenbuf, long *originator) { /* hope that MPI int is large enough to store value in lenbuf */ int count = (int)*lenbuf, root = (int)*originator; MPI_Bcast(buf, count, MPI_CHAR, root, TCGMSG_Comm); } ga-5-4/tcgmsg/tcgmsg-mpi/drand48.c0000644000175000017500000000041312662210372014772 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include #include "sndrcv.h" double DRAND48_() { double val=((double) random() ) * 4.6566128752458e-10; return val; } void SRAND48_(long *seed) { (void) srandom(*seed); } ga-5-4/tcgmsg/tcgmsg-mpi/sizeof.c0000644000175000017500000000215312662210372015030 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * These routines use C's knowledge of the sizes of data types * to generate a portable mechanism for FORTRAN to translate * between bytes, integers and doubles. */ #include "sndrcv.h" /** * Return the no. of bytes that n doubles occupy */ long MDTOB_(long *n) { if (*n < 0) { Error("MDTOB_: negative argument",*n); } return (long) (*n * sizeof(double)); } /** * Return the minimum no. of integers which will hold n doubles. */ long MDTOI_(long *n) { if (*n < 0) { Error("MDTOI_: negative argument",*n); } return (long) ( (MDTOB_(n) + sizeof(long) - 1) / sizeof(long) ); } /** * Return the no. of bytes that n ints=longs occupy */ long MITOB_(long *n) { if (*n < 0) { Error("MITOB_: negative argument",*n); } return (long) (*n * sizeof(long)); } /** * Return the minimum no. of doubles in which we can store n longs */ long MITOD_(long *n) { if (*n < 0) { Error("MITOD_: negative argument",*n); } return (long) ( (MITOB_(n) + sizeof(double) - 1) / sizeof(double) ); } ga-5-4/tcgmsg/tcgmsg-mpi/evlog.c0000644000175000017500000002660712662210372014657 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** * Event logging routine with key driven varargs interface */ #include #include #include #include #include #include "evlog.h" #include "sndrcv.h" #define BUFLEN 262144 /**< Size allocated for buffer ... biggish */ #define MAX_EV_LEN 1000 /**< Assumed maximum size of single event record */ #define ERROR_RETURN() \ do { \ error = 1; \ return; \ } while (0) #define DUMPBUF() \ do { \ (void) fputs(buffer, file); \ (void) fflush(file); \ if (ferror(file)) { \ ERROR_RETURN(); \ } \ bufpt = buffer; \ left = BUFLEN; \ } while (0) #define RECORD(A) \ do { \ A; \ nchars = strlen(bufpt); \ bufpt += nchars; \ left -= nchars; \ } while (0) static double walltime(); /** * The format of the argument list is as follows: * * evlog([(int) key, [values, ...]], ..., EVKEY_LAST_ARG) * * Arguments are read as keys with corresponding values. Recognised keys * are defined in evlog.h and are described in detail below. * * Logging is enabled/disabled by calling evlog with one of EVKEY_ENABLE * or EVKEY_DISABLE specified. Note that EVKEY_ENABLE must be the * first key specified for it to be recognized and that all keys * in the argument list after EVKEY_DISABLE are ignored. By default * events are logged in the file events. This can be overridden with * the key EVKEY_FILENAME, which takes the filename as its value. * * The model for logging events assumed by the post-analysis routines * assumes that upon logging an event: * * a) no state chage occurs (EVKEY_EVENT). The event is just recorded. * * b) the process changes state by pushing the event onto the state stack * (EVKEY_BEGIN). * * c) the process changes state by popping an event off the state stack * (EVKEY_END). If the event or state popped off the stack does not * match the specified event then the post-analysis may get confused * but this does not interfere with the actual logging. * * EVKEY_EVENT, EVKEY_BEGIN or EVKEY_END must be the first key specified other * than a possible EVKEY_ENABLE. * * Internally an event is stored as a large character string to simplify * post-analysis. Users specify data for storage in addition to * that which is automatically stored (only the time and process) with * key, value combinations (EVKEY_STR_INT, EVKEY_STR_DBL, EVKEY_STR). * Many such key-value combinations as required may be specified. * Since the internal data format uses colons ':', double quotation * marks '"' and carriage returns users should avoid these in their * string data. * * ---------------------------- * Sample calling sequence: * * evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); * * * evlog(EVKEY_EVENT, "Finished startup code", * EVKEY_STR, "Now do some real work", * EVKEY_LAST_ARG); * * evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); * * * evlog(EVKEY_END, "Get matrix", * EVKEY_STR_INT, "Size of matrix", (int) N, * EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, * EVKEY_LAST_ARG); * * evlog(EVKEY_BEGIN, "Transform matrix", * EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, * EVKEY_LAST_ARG); * * * evlog(EVKEY_END, "Transform matrix", * EVKEY_STR_INT, "No. of iterations", (int) niters, * EVKEY_LAST_ARG); * * evlog(EVKEY_DUMP, EVKEY_DISABLE, EVKEY_LAST_ARG); * * evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", * EVKEY_DUMP, EVKEY_LAST_ARG); * * ---------------------------- * * EVKEY_LAST_ARG * Terminates list ... takes no value and must be present * * EVKEY_EVENT, (char *) event * Simply log occurence of the event * * EVKEY_BEGIN, (char *) event * Push event onto process state stack * * EVKEY_END, (char *) event * Pop event off process state stack * * EVKEY_MSG_LEN, (int) length * Value is (int) mesage length SND/RCV only * * EVKEY_MSG_TO, (int) to * Value is (int) to process id SND/RCV only * * EVKEY_MSG_FROM, (int) from * Value is (int) from process SND/RCV only * * EVKEY_MSG_TYPE, (int) type * Value is (int) message type SND/RCV only * * EVKEY_STR_INT, (char *) string, (int) data * User data value pair * * EVKEY_STR_DBL, (char *) string, (double) data * User data value pair (char *), (double) * * EVKEY_STR, (char *) string * User data value (char *) * * EVKEY_ENABLE * Enable logging * * EVKEY_DISABLE * Disable logging * * EVKEY_DUMP * Dump out the current buffer to disk * * EVKEY_FILE, (char *) filename * Use specified file to capture events. Default is "events". */ void evlog(int farg_key, ...) { static int logging=0;/**< Boolean flag for login enabled/disabled */ static int error=0; /**< Boolean flag for error detected */ static int ncall=0; /**< Need to do stuff on first entry */ static char *buffer; /**< Logging buffer ... null terminated */ static char *bufpt; /**< Pointer to next free char in buffer */ static int left; /**< Amount of free space in buffer */ static FILE *file; /**< File where events will be dumped */ static char *filename = "events"; /**< Default name of events file */ va_list ap; /**< For variable argument list */ int key; /**< Hold key being processed */ int nchars; /**< No. of chars printed by sprintf call */ char *temp; /**< Temporary copy of bufpt */ char *string; /**< Temporary */ int integer; /**< Temporary */ double dbl; /**< Temporary */ int valid; /**< Temporary */ /* If an error was detected on a previous call don't even try to do anything */ if (error) { ERROR_RETURN(); } /* First time in need to allocate the buffer, open the file etc */ if (ncall == 0) { ncall = 1; if (!(bufpt = buffer = malloc((unsigned) BUFLEN))) { ERROR_RETURN(); } left = BUFLEN; if (!(file = fopen(filename, "w"))) { ERROR_RETURN(); } } /* Parse the arguments */ temp = bufpt; /**< Save to check if anything has been logged */ valid = 0; /**< One of BEGIN, END or EVENT must preceed most keys */ va_start(ap, farg_key); key = farg_key; while (key != EVKEY_LAST_ARG) { if ( (!logging) && (key != EVKEY_ENABLE) ) { return; } switch (key) { case EVKEY_ENABLE: logging = 1; break; case EVKEY_DISABLE: logging = 0; goto done; /* break; */ case EVKEY_FILENAME: if (!(filename = strdup(va_arg(ap, char *)))) { ERROR_RETURN(); } if (!(file = freopen(filename, "w", file))) { ERROR_RETURN(); } break; case EVKEY_BEGIN: valid = 1; RECORD(sprintf(bufpt, ":BEGIN:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_END: valid = 1; RECORD(sprintf(bufpt, ":END:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_EVENT: valid = 1; RECORD(sprintf(bufpt, ":EVENT:%s", va_arg(ap, char *))); RECORD(sprintf(bufpt, ":TIME:%.2f", walltime())); break; case EVKEY_MSG_LEN: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":MSG_LEN:%d", va_arg(ap, int))); break; case EVKEY_MSG_TO: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":MSG_TO:%d", va_arg(ap, int))); break; case EVKEY_MSG_FROM: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":MSG_FROM:%d", va_arg(ap, int))); break; case EVKEY_MSG_TYPE: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":MSG_TYPE:%d", va_arg(ap, int))); break; case EVKEY_MSG_SYNC: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":MSG_SYNC:%d", va_arg(ap, int))); break; case EVKEY_STR_INT: if (!valid) { ERROR_RETURN(); } string = va_arg(ap, char *); integer = va_arg(ap, int); RECORD(sprintf(bufpt, ":STR_INT:%s:%d", string, integer)); break; case EVKEY_STR_DBL: if (!valid) { ERROR_RETURN(); } string = va_arg(ap, char *); dbl = va_arg(ap, double); RECORD(sprintf(bufpt, ":STR_DBL:%s:%g", string, dbl)); break; case EVKEY_STR: if (!valid) { ERROR_RETURN(); } RECORD(sprintf(bufpt, ":STR:%s", va_arg(ap, char *))); break; case EVKEY_DUMP: DUMPBUF(); if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } break; default: DUMPBUF(); ERROR_RETURN(); } key = va_arg(ap, int); } done: va_end(ap); /* Put a linefeed on the end of the record if something is written */ if (temp != bufpt) { RECORD(sprintf(bufpt, "\n")); temp = bufpt; } /* Should really check on every access to the buffer that there is enough space ... however just assume a very large maximum size for a single event log entry and check here */ if (left <= 0) { ERROR_RETURN(); } if (left < MAX_EV_LEN) { DUMPBUF(); } } /** * return the wall time in seconds as a double */ static double walltime() { return ((double) MTIME_()) * 0.01; } /* int main(int argc, char **argv) { int N = 19; double matrix_norm = 99.1; int niters = 5; evlog(EVKEY_ENABLE, EVKEY_FILENAME, "events.log", EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Finished startup code", EVKEY_STR, "Now do some real work", EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Get Matrix", EVKEY_LAST_ARG); evlog(EVKEY_END, "Get matrix", EVKEY_STR_INT, "Size of matrix", (int) N, EVKEY_STR_DBL, "Norm of matrix", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_BEGIN, "Transform matrix", EVKEY_STR_DBL, "Recomputed norm", (double) matrix_norm, EVKEY_LAST_ARG); evlog(EVKEY_END, "Transform matrix", EVKEY_STR_INT, "No. of iterations", (int) niters, EVKEY_LAST_ARG); evlog(EVKEY_DUMP, EVKEY_LAST_ARG); evlog(EVKEY_EVENT, "Logging is disabled ... this should not print", EVKEY_DUMP, EVKEY_LAST_ARG); return 0; } */ ga-5-4/tcgmsg/tcgmsg-mpi/llog.c0000644000175000017500000000163612662210372014473 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_TIME_H # include #endif #if HAVE_SYS_TIME_H # include #endif #include "sndrcv.h" extern void Error(); /** * close and open stdin and stdout to append to a local logfile * with the name log. in the current directory */ void LLOG_() { char name[12]; time_t t; (void) sprintf(name, "log.%03ld",NODEID_()); (void) fflush(stdout); (void) fflush(stderr); if (freopen(name, "a", stdout) == (FILE *) NULL) { Error("LLOG_: error re-opening stdout", (long) -1); } if (freopen(name, "a", stderr) == (FILE *) NULL) { Error("LLOG_: error re-opening stderr", (long) -1); } (void) time(&t); (void) printf("\n\nLog file opened : %s\n\n",ctime(&t)); (void) fflush(stdout); } ga-5-4/tcgmsg/tcgmsg-mpi/msgtypesf.h0000644000175000017500000000035712662210372015563 0ustar mbambaC C This defines bit masks that can be ORed with user types (1-32767) C to indicate the nature of the data to the message passing system C integer msgdbl, msgint, msgchr parameter (msgdbl=65536, msgint=131072, msgchr=262144) ga-5-4/tcgmsg/tcgmsg-mpi/evon.c0000644000175000017500000000401112662210372014473 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * Crude FORTRAN interface to C event logging routines. * See evlog.c for more details. * * FORTRAN character variables are so unportable that guaranteeing * that U can parse a variable length argument list is next to impossible. * * This provides very basic event logging functionality. * * CALL EVON() * enable logging. * * CALL EVOFF() * disable logging. * * CALL EVBGIN("event description") * push event onto state stack * * CALL EVEND("event description") * pop event off state stack * * CALL EVENT("event description") * log occurence of event that doesn't change state stack */ #include "evlog.h" /* These to get portable FORTRAN interface ... these routines * will not be called from C which has the superior evlog interface */ #define evon_ F77_FUNC(evon,EVON) #define evoff_ F77_FUNC(evoff,EVOFF) #define evbgin_ F77_FUNC(evbgin,EVBGIN) #define evend_ F77_FUNC(evend,EVEND) #define event_ F77_FUNC(event,EVENT) void evon_() { #ifdef EVENTLOG evlog(EVKEY_ENABLE, EVKEY_LAST_ARG); #endif } void evoff_() { #ifdef EVENTLOG evlog(EVKEY_DISABLE, EVKEY_LAST_ARG); #endif } void evbgin_(char *string, long len) { #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_BEGIN, value, EVKEY_LAST_ARG); (void) free(value); } #endif } void evend_(char *string, long len) { #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_END, value, EVKEY_LAST_ARG); (void) free(value); } #endif } void event_(char *string, long len) { #ifdef EVENTLOG char *value = malloc( (unsigned) (len+1) ); if (value) { (void) bcopy(string, value, len); value[len] = '\0'; evlog(EVKEY_EVENT, value, EVKEY_LAST_ARG); (void) free(value); } #endif } ga-5-4/tcgmsg/tcgmsg-mpi/pfilecopy.c0000644000175000017500000001032412662210372015522 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MEMORY_H # include #endif #if HAVE_STDLIB_H # include #endif extern void free(void *ptr); #include "msgtypesc.h" #include "sndrcv.h" #include "tcgmsgP.h" /** * Process node0 has a file (assumed unopened) named fname. * This file will be copied to all other processes which must * simultaneously invoke pfilecopy. Since the processes may be * using the same directory one probably ought to make sure * that each process uses a different name in the call. * * e.g. * * on node 0 pfilecopy(99, 0, 'argosin') * on node 1 pfilecopy(99, 0, 'argosin_001') * on node 2 pfilecopy(99, 0, 'argosin_002') */ void tcgi_pfilecopy(long *type, long *node0, char *filename) { char *buffer; FILE *file; long length, nread=32768, len_nread=sizeof(long); long typenr = (*type & 32767) | MSGINT; /* Force user type integer */ long typebuf =(*type & 32767) | MSGCHR; if (!(buffer = malloc((unsigned) nread))) { Error("pfilecopy: failed to allocate the I/O buffer",nread); } if (*node0 == NODEID_()) { /* I have the original file ... open and check its size */ if ((file = fopen(filename,"r")) == (FILE *) NULL) { (void) fprintf(stderr, "me=" FMT_INT ", filename = %s.\n", NODEID_(), filename); Error("pfilecopy: node0 failed to open original file", *node0); } /* Quick sanity check on the length */ (void) fseek(file, 0L, (int) 2); /* Seek to end of file */ length = ftell(file); /* Find the length of file */ (void) fseek(file, 0L, (int) 0); /* Seek to beginning of file */ if ( (length<0) || (length>1e12) ) { Error("pfilecopy: the file length is -ve or very big", length); } /* Send the file in chunks of nread bytes */ while (nread) { nread = fread(buffer, 1, (int) nread, file); BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; } } } else { /* Open the file for the duplicate */ if ((file = fopen(filename,"w+")) == (FILE *) NULL) { (void) fprintf(stderr,"me=" FMT_INT ", filename = %s.\n", NODEID_(), filename); Error("pfilecopy: failed to open duplicate file", *node0); } /* Receive data and write to file */ while (nread) { BRDCST_(&typenr, (char *) &nread, &len_nread, node0); typenr++; if (nread) { BRDCST_(&typebuf, buffer, &nread, node0); typebuf++; if (nread != (long)fwrite(buffer, 1, (int) nread, file)) { Error("pfilecopy: error data to duplicate file", nread); } } } } /* Tidy up the stuff we have been using */ (void) fflush(file); (void) fclose(file); (void) free(buffer); } /** The original C interface to PFCOPY_. */ void PFILECOPY_(long *type, long *node0, char *filename) { tcgi_pfilecopy(type, node0, filename); } /** Fortran wrapper around pfilecopy */ void PFCOPY_(long *type, long *node0, char *fname, int len) { char *filename; #ifdef DEBUG (void) printf("me=%d, type=%d, node0=%d, fname=%x, fname=%.8s, len=%d\n", NODEID_(), *type, *node0, fname, fname, len); #endif /* Strip trailing blanks off the file name */ while ((len > 0) && (fname[len-1] == ' ')) { len--; } if (len <= 0) { Error("pfcopy_: file name length is toast", (long) len); } /* Generate a NULL terminated string */ filename = malloc( (unsigned) (len+1) ); if (filename) { (void) bcopy(fname, filename, len); filename[len] = '\0'; } else { Error("PFCOPY_: failed to malloc space for filename", (long) len); } /* Now call the C routine to do the work */ tcgi_pfilecopy(type, node0, filename); (void) free(filename); } ga-5-4/tcgmsg/tcgmsg-mpi/sndrcv.h0000644000175000017500000000360612662210372015041 0ustar mbamba/** @file * This header file declares stubs and show prototypes of the * public sndrcv calls * * srftoc.h contains macros which define the names of c routines * accessible from FORTRAN and vice versa */ #ifndef SNDRCV_H_ #define SNDRCV_H_ #include "msgtypesc.h" #include "srftoc.h" #ifdef __cplusplus extern "C" { #endif extern void BRDCST_(long *type, void *buf, long *lenbuf, long *originator); extern void DGOP_(long *type, double *x, long *n, char *op, int oplen); extern double DRAND48_(); extern void IGOP_(long *type, long *x, long *n, char *op, int oplen); extern void LLOG_(); extern long MDTOB_(long *n); extern long MDTOI_(long *n); extern long MITOB_(long *n); extern long MITOD_(long *n); extern long MTIME_(); extern long NICEFTN_(long *ival); extern long NNODES_(); extern long NODEID_(); extern long NXTVAL_(long *mproc); extern void PARERR_(long *code); extern void PBEGINF_(); extern void PBGINF_(); extern void PEND_(); extern void PFCOPY_(long *type, long *node0, char *filename, int flen); extern void PFILECOPY_(long *type, long *node0, char *filename); extern long PROBE_(long *type, long *node); extern void RCV_(long *type, void *buf, long *lenbuf, long *lenmes, long *nodeselect, long *nodefrom, long *sync); extern void SETDBG_(long *value); extern void SND_(long *type, void *buf, long *lenbuf, long *node, long *sync); extern void SRAND48_(long *seed); extern void STATS_(); extern void SYNCH_(long *type); extern long TCGREADY_(); extern double TCGTIME_(); extern void WAITCOM_(long *node); /* Miscellaneous routines for internal use only? */ extern void Error(char *string, long integer); extern void MtimeReset(); extern void PrintProcInfo(); extern void RemoteConnect(long a, long b, long c); extern void tcgi_pbegin(int argc, char **argv); extern void USleep(long us); #ifdef __cplusplus } #endif #endif /* SNDRCV_H_ */ ga-5-4/tcgmsg/tcgmsg-mpi/msgtypesc.h0000644000175000017500000000043612662210372015556 0ustar mbamba/** @file * This defines bit masks that can be OR'ed with user types (1-32767) * to indicate the nature of the data to the message passing system */ #ifndef MSGTYPES_H_ #define MSGTYPES_H_ #define MSGDBL 65536 #define MSGINT 131072 #define MSGCHR 262144 #endif /* MSGTYPES_H_ */ ga-5-4/tcgmsg/tcgmsg-mpi/evlog.h0000644000175000017500000000273512662210372014660 0ustar mbamba/** @file * Define EVENT and KEY values used when calling evlog. */ #ifndef EVLOG_H_ #define EVLOG_H_ extern void evlog(int farg_key, ...); /* Values of keys in key value pairs */ #define EVKEY_LAST_ARG 0 /**< Terminates list ... takes no value */ #define EVKEY_BEGIN 1 /**< Push (char *) value onto state stack */ #define EVKEY_END 2 /**< Pop (char *) value off state stack */ #define EVKEY_EVENT 3 /**< Record (char *) value, no stack change */ #define EVKEY_MSG_LEN 4 /**< Value is (int) mesage length SND/RCV only */ #define EVKEY_MSG_TO 5 /**< Value is (int) to process id SND/RCV only */ #define EVKEY_MSG_FROM 6 /**< Value is (int) from process SND/RCV only */ #define EVKEY_MSG_TYPE 7 /**< Value is (int) message type SND/RCV only */ #define EVKEY_MSG_SYNC 8 /**< Value is (int) message sync SND/RCV only */ #define EVKEY_STR_INT 9 /**< User data value pair (char *), (int) */ #define EVKEY_STR_DBL 10 /**< User data value pair (char *), (double) */ #define EVKEY_STR 11 /**< User data value (char *) */ #define EVKEY_ENABLE 12 /**< Enable logging ... takes no value */ #define EVKEY_DISABLE 13 /**< Disable logging ... takes no value */ #define EVKEY_DUMP 14 /**< Dump out the current buffer to disk */ #define EVKEY_FILENAME 15 /**< Set the name of the events file */ #define EVENT_SND "Snd" /**< Predefined strings for internal events */ #define EVENT_RCV "Rcv" #define EVENT_PROCESS "Process" #endif /* EVLOG_H_ */ ga-5-4/tcgmsg/tcgmsg-mpi/p2p.c0000644000175000017500000000733112662210372014235 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "tcgmsgP.h" /************************ nonblocking message list ********************/ #define MAX_Q_LEN 1024 /* Maximum no. of outstanding messages */ static struct msg_q_struct{ MPI_Request request; long node; long type; long lenbuf; long snd; long from; } msg_q[MAX_Q_LEN]; static int n_in_msg_q=0; /**********************************************************************/ void SND_(long *type, void *buf, long *lenbuf, long *node, long *sync) { int ierr; int ttype = (int)*type; if (DEBUG_) { printf("SND_: node " FMT_INT " sending to " FMT_INT ", len=" FMT_INT ", type=" FMT_INT ", sync=" FMT_INT "\n", NODEID_(), *node, *lenbuf, *type, *sync); fflush(stdout); } if (*sync){ ierr = MPI_Send(buf, (int)*lenbuf, MPI_CHAR, (int)*node, ttype, TCGMSG_Comm); tcgmsg_test_statusM("SND_:", ierr); }else{ if (n_in_msg_q >= MAX_Q_LEN) { Error("SND:overflowing async Q limit", n_in_msg_q); } ierr = MPI_Isend(buf, (int)*lenbuf, MPI_CHAR,(int)*node, ttype, TCGMSG_Comm, &msg_q[n_in_msg_q].request); tcgmsg_test_statusM("nonblocking SND_:", ierr); msg_q[n_in_msg_q].node = *node; msg_q[n_in_msg_q].type = *type; msg_q[n_in_msg_q].lenbuf = *lenbuf; msg_q[n_in_msg_q].snd = 1; } } void RCV_(long *type, void *buf, long *lenbuf, long *lenmes, long *nodeselect, long *nodefrom, long *sync) { int ierr; int node, count = (int)*lenbuf; MPI_Status status; MPI_Request request; if (*nodeselect == -1) { node = MPI_ANY_SOURCE; } else { node = (int)*nodeselect; } if (DEBUG_) { printf("RCV_: node " FMT_INT " receiving from " FMT_INT ", len=" FMT_INT ", type=" FMT_INT ", sync=" FMT_INT "\n", NODEID_(), *nodeselect, *lenbuf, *type, *sync); fflush(stdout); } if(*sync==0){ if (n_in_msg_q >= MAX_Q_LEN) { Error("nonblocking RCV_: overflowing async Q limit", n_in_msg_q); } ierr = MPI_Irecv(buf, count, MPI_CHAR, node, (int)*type, TCGMSG_Comm, &request); tcgmsg_test_statusM("nonblocking RCV_:", ierr); *nodefrom = node; /* Get source node */ *lenmes = -1L; msg_q[n_in_msg_q].request = request; msg_q[n_in_msg_q].node = *nodeselect; msg_q[n_in_msg_q].type = *type; msg_q[n_in_msg_q].lenbuf = *lenbuf; msg_q[n_in_msg_q].snd = 0; n_in_msg_q++; } else { ierr = MPI_Recv(buf, count, MPI_CHAR, node, (int)*type, TCGMSG_Comm, &status); tcgmsg_test_statusM("RCV_:", ierr); ierr = MPI_Get_count(&status, MPI_CHAR, &count); tcgmsg_test_statusM("RCV:Get_count:", ierr); *nodefrom = (long)status.MPI_SOURCE; *lenmes = (long)count; } } void WAITCOM_(long *nodesel) { int ierr, i; MPI_Status status; for (i=0; i #if HAVE_STDLIB_H # include #endif #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_WINSOCK_H # include #endif #if HAVE_UNISTD_H # include #endif #define HOSTNAME_LEN 128 static char myname[HOSTNAME_LEN], rootname[HOSTNAME_LEN]; /** * return 1 if all processes are running on the same machine, 0 otherwise */ int single_cluster() { int rc,me,root=0,stat,global_stat,len; gethostname(myname, HOSTNAME_LEN-1); rc = MPI_Comm_rank(MPI_COMM_WORLD, &me); if(me==root) { rc = MPI_Bcast(myname,HOSTNAME_LEN,MPI_CHAR,root,MPI_COMM_WORLD); } else { rc = MPI_Bcast(rootname, HOSTNAME_LEN,MPI_CHAR,root,MPI_COMM_WORLD); } if(rc != MPI_SUCCESS){ fprintf(stderr,"single_cluster:MPI_Bcast failed rc=%d\n",rc); MPI_Abort(MPI_COMM_WORLD,rc); } len = strlen(myname); stat = (me==root) ? 0 : strncmp(rootname, myname, len); if(stat != 0) { stat = 1; } rc = MPI_Allreduce(&stat, &global_stat, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); if(rc != MPI_SUCCESS){ fprintf(stderr,"single_cluster:MPI_MPI_Allreduce failed rc=%d\n",rc); MPI_Abort(MPI_COMM_WORLD,rc); } if(global_stat) { return 0; } else { return 1; } } ga-5-4/tcgmsg/tcgmsg-mpi/nxtval.c0000644000175000017500000001131212662210372015042 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #include "tcgmsgP.h" #define LEN 2 long nxtval_counter=0; #define INCR 1 /**< increment for NXTVAL */ #define BUSY -1L /**< indicates somebody else updating counter*/ void NextValueServer() { long cnt = 0; /**< actual counter */ long ndone = 0; /**< no. finished for this loop */ int type = TYPE_NXTVAL; /**< message type */ long buf[LEN]; /**< buffer to get values */ long mproc; /**< no. of processes running loop */ long nval; /**< no. of values requested */ int done_list[MAX_PROCESS];/**< list of processes finished with this loop */ int lenmes, nodefrom; int node; long ntermin=0; MPI_Status status; while (1) { /* Wait for input from any node */ MPI_Recv(buf, LEN, MPI_LONG, MPI_ANY_SOURCE, type, MPI_COMM_WORLD, &status); MPI_Get_count(&status, MPI_LONG, &lenmes); nodefrom = status.MPI_SOURCE; if (lenmes != LEN) { Error("NextValueServer: lenmes != LEN", (long) lenmes); return; /* Never actually gets here as does long jump */ } mproc = buf[0]; nval = buf[1]; if (DEBUG_) { (void) printf("NVS: from=%ld, mproc=%ld, ndone=%ld\n", nodefrom, mproc, ndone); } if (mproc == 0) { /* Sending process is about to terminate. Send reply and disable * sending to him. If all processes have finished return. * * All processes block on waiting for message * from nxtval server before terminating. nxtval only lets * everyone go when all have registered termination. */ if (++ntermin == NNODES_()) { for (node=0; node 0) { /* This is what we are here for */ MPI_Send(&cnt, 1, MPI_LONG, nodefrom, type, MPI_COMM_WORLD); cnt += nval; } else if (mproc < 0) { /* This process has finished the loop. Wait until all mproc processes have finished before releasing it */ done_list[ndone++] = nodefrom; if (ndone == -mproc) { while (ndone--) { nodefrom = done_list[ndone]; MPI_Send(&cnt, 1, MPI_LONG, nodefrom, type, MPI_COMM_WORLD); } cnt = 0; ndone = 0; } } } } /** * Get next value of shared counter. * mproc > 0 ... returns requested value * mproc < 0 ... server blocks until abs(mproc) processes are queued * and returns junk * mproc = 0 ... indicates to server that I am about to terminate */ long NXTVAL_(long *mproc) { long buf[2]; MPI_Status status; int type = TYPE_NXTVAL; long local; #ifdef NXTVAL_SERVER int server = (int)NNODES_(); /**< id of server process */ #else int server = (int)NNODES_() -1; /**< id of server process */ #endif if (SR_parallel) { buf[0] = *mproc; buf[1] = INCR; if (DEBUG_) { (void) printf("%2ld: nxtval: mproc=%ld\n",NODEID_(), *mproc); (void) fflush(stdout); } #ifdef NXTVAL_SERVER MPI_Send(buf, LEN, MPI_LONG, server, type, MPI_COMM_WORLD); MPI_Recv(buf, 1, MPI_LONG, server, type, MPI_COMM_WORLD, &status); return buf[0]; #endif } else { /* Not running in parallel ... just do a simulation */ static int count = 0; if (*mproc == 1) { local = count++; } else if (*mproc == -1) { count = 0; local = 0; } else { Error("nxtval: sequential version with silly mproc ", (long) *mproc); } } return local; } /** * initialization for nxtval -- called in PBEGIN */ void install_nxtval(int *argc, char **argv[]) { int numprocs, myid; MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); #ifdef NXTVAL_SERVER /* in this mode one process is hidden from the application */ if(SR_parallel && myid == numprocs -1) { # ifndef QUIET printf("TCGMSG-MPI info: excluding one process for nxtval server\n"); fflush(stdout); # endif /* QUIET */ NextValueServer(); } #else # error Do not know how to implement nxtval ! #endif } void finalize_nxtval() { } ga-5-4/tcgmsg/tcgmsg-mpi/README0000644000175000017500000000034712662210372014250 0ustar mbambaThis is an implementation of the TCGMSG interface on top of MPI. Heteregenous platforms are currently not supported. The TCGSMG nxtval operation is implemented by using ARMCI. Questions/comments/problems: hpctools@pnl.gov ga-5-4/tcgmsg/tcgmsg-mpi/misc.c0000644000175000017500000001153712662210372014472 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include extern void exit(int status); #include "tcgmsgP.h" #include "srftoc.h" #include "armci.h" char tcgmsg_err_string[ERR_STR_LEN]; MPI_Comm TCGMSG_Comm=MPI_COMM_WORLD; int _tcg_initialized=0; long DEBUG_; int SR_parallel; int SR_single_cluster =1; int tcgi_argc=0; char **tcgi_argv=NULL; static int SR_initialized=0; extern int nxtval_installed; extern MPI_Comm armci_group_comm(ARMCI_Group *group); long TCGREADY_() { return (long)SR_initialized; } /** * number of processes */ long NNODES_() { int numprocs; MPI_Comm_size(TCGMSG_Comm, &numprocs); #ifdef NXTVAL_SERVER if(SR_parallel) { return((long)numprocs-1); } #endif return((long)numprocs); } /** * Get calling process id */ long NODEID_() { int myid; MPI_Comm_rank(TCGMSG_Comm,&myid); return((long)myid); } void Error(char *string, long code) { fprintf(stdout, FMT_INT ": %s " FMT_INT " (%#lx).\n", NODEID_(), string, code, (long unsigned int)code); fflush(stdout); fprintf(stderr, FMT_INT ": %s " FMT_INT " (%#lx).\n", NODEID_(), string, code, (long unsigned int)code); finalize_nxtval(); /* clean nxtval resources */ MPI_Abort(TCGMSG_Comm,(int)code); } /** * this is based on the MPI Forum decision that MPI_COMM_WORLD is a C constant */ void make_tcgmsg_comm() { extern int single_cluster(); #ifdef NXTVAL_SERVER if( SR_parallel ){ /* data server for a single process */ int server; MPI_Group MPI_GROUP_WORLD, tcgmsg_grp; MPI_Comm_size(MPI_COMM_WORLD, &server); server --; /* the highest numbered process will be excluded */ MPI_Comm_group(MPI_COMM_WORLD, &MPI_GROUP_WORLD); MPI_Group_excl(MPI_GROUP_WORLD, 1, &server, &tcgmsg_grp); MPI_Comm_create(MPI_COMM_WORLD, tcgmsg_grp, &TCGMSG_Comm); }else #endif { #if HAVE_ARMCI_INITIALIZED if (ARMCI_Initialized()) #else if (nxtval_installed) #endif { ARMCI_Group group; ARMCI_Group_get_world(&group); # if HAVE_ARMCI_GROUP_COMM_MEMBER TCGMSG_Comm = group.comm; # else TCGMSG_Comm = armci_group_comm(&group); # endif } else { TCGMSG_Comm = MPI_COMM_WORLD; } } } /** * Alternative initialization for C programs * used to address argv/argc manipulation in MPI */ void tcgi_alt_pbegin(int *argc, char **argv[]) { int numprocs, myid; int init=0; if(SR_initialized) { Error("TCGMSG initialized already???",-1); } else { SR_initialized=1; _tcg_initialized=1; } /* check if another library initialized MPI already */ MPI_Initialized(&init); if(!init){ /* nope */ #if defined(DCMF) || defined(MPI_MT) || defined(MPI_PT) int provided; MPI_Init_thread(argc, argv, MPI_THREAD_MULTIPLE, &provided); #else MPI_Init(argc, argv); #endif MPI_Errhandler_set(TCGMSG_Comm, MPI_ERRORS_RETURN); } MPI_Comm_size(TCGMSG_Comm, &numprocs); MPI_Comm_rank(TCGMSG_Comm, &myid); SR_parallel = numprocs > 1 ? 1 : 0; #if NEED_DELAY_TCGMSG_MPI_STARTUP /* printf("%d:ready to go\n",NODEID_()); */ /* wait until the last possible moment to call install_nxtval * it could be called by ARMCI_Init * or is called the first time nxtval is invoked (yuck) */ /*install_nxtval(argc, argv);*/ #else install_nxtval(argc, argv); /* which calls ARMCI_Init(), if needed */ #endif make_tcgmsg_comm(); MPI_Barrier(TCGMSG_Comm); } /** * Initialization for C programs */ void tcgi_pbegin(int argc, char* argv[]) { tcgi_argc = argc; tcgi_argv = argv; tcgi_alt_pbegin(&argc, &argv); } /** * shut down message-passing library */ void PEND_() { #ifdef NXTVAL_SERVER long zero=0; if( SR_parallel ) { (void) NXTVAL_(&zero); } MPI_Barrier(TCGMSG_Comm); #endif finalize_nxtval(); MPI_Finalize(); exit(0); } double TCGTIME_() { static int first_call = 1; static double first_time, last_time, cur_time; double diff; if (first_call) { first_time = MPI_Wtime(); first_call = 0; last_time = -1e-9; } cur_time = MPI_Wtime(); diff = cur_time - first_time; /* address crappy MPI_Wtime: consectutive calls must be at least 1ns apart */ if(diff - last_time < 1e-9) { diff +=1e-9; } last_time = diff; return diff; /* Add logic here for clock wrap */ } long MTIME_() { return (long) (TCGTIME_()*100.0); /* time in centiseconds */ } /** * longerface from Fortran to C error routine */ void PARERR_(long *code) { Error("User detected error in FORTRAN", *code); } void SETDBG_(long *onoff) { DEBUG_ = *onoff; } void STATS_() { printf("STATS not implemented\n"); } ga-5-4/tcgmsg/tcgmsg-mpi/nxtval-armci.c0000644000175000017500000000726712662210372016151 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #if HAVE_MALLOC_H # include #endif #include "armci.h" #include "message.h" #include "tcgmsgP.h" #define LEN 2 static long pnxtval_counter_val; static long *pnxtval_counter=&pnxtval_counter_val; int nxtval_installed=0; extern int *tcgi_argc; extern char ***tcgi_argv; #define INCR 1 /**< increment for NXTVAL */ #define BUSY -1L /**< indicates somebody else updating counter*/ #define NXTV_SERVER ((int)NNODES_() -1) static int ARMCIinitialized = 0; extern void make_tcgmsg_comm(void); /** * Get next value of shared counter. * mproc > 0 ... returns requested value * mproc < 0 ... server blocks until abs(mproc) processes are queued * and returns junk * mproc = 0 ... indicates to server that I am about to terminate */ long NXTVAL_(long *mproc) { long local; int rc; int server = NXTV_SERVER; /* id of server process */ install_nxtval(tcgi_argc, tcgi_argv); if (SR_parallel) { if (DEBUG_) { (void) printf(FMT_INT ": nxtval: mproc=" FMT_INT "\n", NODEID_(), *mproc); (void) fflush(stdout); } if (*mproc < 0) { rc=MPI_Barrier(TCGMSG_Comm); if(rc!=MPI_SUCCESS) { Error("nxtval: barrier failed",0); } /* reset the counter value to zero */ if( NODEID_() == server) { *pnxtval_counter = 0; } rc=MPI_Barrier(TCGMSG_Comm); if(rc!=MPI_SUCCESS) { Error("nxtval: barrier failed",0); } } if (*mproc > 0) { #if SIZEOF_F77_INTEGER == SIZEOF_INT int op = ARMCI_FETCH_AND_ADD; #elif SIZEOF_F77_INTEGER == SIZEOF_LONG int op = ARMCI_FETCH_AND_ADD_LONG; #else # error #endif rc = ARMCI_Rmw(op,(void*)&local,(void*)pnxtval_counter,1,server); } } else { /* Not running in parallel ... just do a simulation */ static int count = 0; if (*mproc == 1) { local = count++; } else if (*mproc == -1) { count = 0; local = 0; } else { Error("nxtval: sequential version with silly mproc ", (long) *mproc); } } return local; } /** * initialization for nxtval */ void install_nxtval(int *argc, char **argv[]) { int rc; int me = (int)NODEID_(), bytes, server; void **ptr_ar; if (nxtval_installed) { return; } nxtval_installed = 1; #if HAVE_ARMCI_INITIALIZED_FUNCTION if (!ARMCI_Initialized()) #else if (!ARMCIinitialized) #endif { ARMCI_Init_args(argc, argv); ARMCIinitialized = 1; make_tcgmsg_comm(); } me = (int)NODEID_(); ptr_ar = (void **)malloc(sizeof(void *)*(int)NNODES_()); if(!ptr_ar) { Error("malloc failed in install_nxtval", (long)NNODES_()); } server = NXTV_SERVER; if(me== server) { bytes = sizeof(long); } else { bytes =0; } rc = ARMCI_Malloc(ptr_ar,bytes); if(rc) { Error("nxtv: armci_malloc failed",rc); } pnxtval_counter = (long*) ptr_ar[server]; if(me==server) { *pnxtval_counter = (long)0; } free(ptr_ar); rc=MPI_Barrier(TCGMSG_Comm); if(rc!=MPI_SUCCESS) { Error("init_nxtval: barrier failed",0); } } void finalize_nxtval() { /* * Cannot call ARMCI functions here as ARMCI might have been terminated * by now. NOTE: finalize_nxtval is called in pend(), which is called after * GA_Terminate/ARMCI_Finalize. */ #if 0 if(NODEID_() == NXTV_SERVER)ARMCI_Free(pnxtval_counter); #endif ARMCI_Finalize(); } ga-5-4/tcgmsg/tcgmsg-mpi/tcgmsgP.h0000644000175000017500000000353112662210372015143 0ustar mbamba#ifndef TCGMSGP_H_ #define TCGMSGP_H_ #include #if HAVE_STDIO_H # include #endif #if HAVE_STRING_H # include #endif #include "sndrcv.h" #if SIZEOF_F77_INTEGER == SIZEOF_SHORT # define TCG_INT MPI_SHORT # define FMT_INT "%hd" #elif SIZEOF_F77_INTEGER == SIZEOF_INT # define TCG_INT MPI_INT # define FMT_INT "%d" #elif SIZEOF_F77_INTEGER == SIZEOF_LONG # define TCG_INT MPI_LONG # define FMT_INT "%ld" #elif SIZEOF_F77_INTEGER == SIZEOF_LONG_LONG # define TCG_INT MPI_LONG_LONG_INT # define FMT_INT "%lld" #else # error Cannot determine TCG_INT #endif #if SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_FLOAT # define TCG_DBL MPI_FLOAT # define FMT_DBL "%f" #elif SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_DOUBLE # define TCG_DBL MPI_DOUBLE # define FMT_DBL "%f" #elif SIZEOF_F77_DOUBLE_PRECISION == SIZEOF_LONG_DOUBLE # define TCG_DBL MPI_LONG_DOUBLE # define FMT_DBL "%Lf" #else # error Cannot determine TCG_DBL #endif #define MAX_PROCESS 100000 #define TYPE_NXTVAL 33333 extern MPI_Comm TCGMSG_Comm; extern int SR_parallel; extern int SR_single_cluster; extern long DEBUG_; extern int _tcg_initialized; #define TCG_MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define TCG_MIN(a,b) (((a) <= (b)) ? (a) : (b)) #define TCG_ABS(a) (((a) >= 0) ? (a) : (-(a))) #define TCG_ERR_LEN 80 #define ERR_STR_LEN TCG_ERR_LEN + MPI_MAX_ERROR_STRING extern char tcgmsg_err_string[ERR_STR_LEN]; #define tcgmsg_test_statusM(_str, _status)\ {\ if( _status != MPI_SUCCESS){\ int _tot_len, _len = TCG_MIN(ERR_STR_LEN, strlen(_str));\ strncpy(tcgmsg_err_string, _str, _len);\ MPI_Error_string( _status, tcgmsg_err_string + _len, &_tot_len);\ Error(tcgmsg_err_string, (int)_status);\ }\ } extern void finalize_nxtval(); extern void install_nxtval(int *argc, char **argv[]); #endif /* TCGMSGP_H_ */ ga-5-4/tcgmsg/tcgmsg-mpi/srftoc.h0000644000175000017500000000320212662210372015032 0ustar mbamba/** @file This header file provides definitions for c for the names of the c message passing routines accessible from FORTRAN. It need not be included directly in user c code, assuming that sndrcv.h has already. It is needed as the FORTRAN naming convention varies between machines and it is the FORTRAN interface that is portable, not the c interface. However by coding with the macro defnition names c portability is ensured. */ #ifndef SRFTOC_H_ #define SRFTOC_H_ #define BRDCST_ armci_tcgmsg_brdcst #define DGOP_ armci_tcgmsg_dgop #define DRAND48_ armci_tcgmsg_drand48 #define IGOP_ armci_tcgmsg_igop #define LLOG_ armci_tcgmsg_llog #define MDTOB_ armci_tcgmsg_mdtob #define MDTOI_ armci_tcgmsg_mdtoi #define MITOB_ armci_tcgmsg_mitob #define MITOD_ armci_tcgmsg_mitod #define MTIME_ armci_tcgmsg_mtime #define NICEFTN_ armci_tcgmsg_niceftn #define NNODES_ armci_tcgmsg_nnodes #define NODEID_ armci_tcgmsg_nodeid #define NXTVAL_ armci_tcgmsg_nxtval #define PARERR_ armci_tcgmsg_parerr #define PBEGINF_ armci_tcgmsg_pbeginf #define PBGINF_ armci_tcgmsg_pbginf #define PEND_ armci_tcgmsg_pend #define PFCOPY_ armci_tcgmsg_pfcopy #define PFILECOPY_ armci_tcgmsg_pfilecopy #define PROBE_ armci_tcgmsg_probe #define RCV_ armci_tcgmsg_rcv #define SETDBG_ armci_tcgmsg_setdbg #define SND_ armci_tcgmsg_snd #define SRAND48_ armci_tcgmsg_srand48 #define STATS_ armci_tcgmsg_stats #define SYNCH_ armci_tcgmsg_synch #define TCGREADY_ armci_tcgmsg_tcgready #define TCGTIME_ armci_tcgmsg_tcgtime #define WAITCOM_ armci_tcgmsg_waitcom #endif /* SRFTOC_H_ */ ga-5-4/tcgmsg/tests/0000755000175000017500000000000012662210372012457 5ustar mbambaga-5-4/tcgmsg/tests/nxtsrv.c0000644000175000017500000000434112662210372014171 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/nxtsrv.c,v 1.4 1995-02-24 02:17:33 d3h325 Exp $ */ #include #include "sndrcv.h" #define DEBUG_ 0 #define TYPE_NXTVAL 32767 int main() /* This runs as highest no. process(es) */ { long cnt = 0; /* actual counter */ long lencnt = sizeof cnt; /* length of cnt */ long ndone = 0; /* no. finished for this loop */ long ntermin = 0; /* no. terminated so far (pend) */ long node = -1; /* select any node */ long type = TYPE_NXTVAL; /* message type */ long buf[2]; /* buffer to get values */ long lenbuf = sizeof buf; /* length of buffer */ long mproc; /* no. of processes running loop */ long nval; /* no. of values requested */ long done_list[16384]; /* list of processes finished with this loop */ long sync = 1; /* all info goes synchronously */ long on=0; long lenmes, nodefrom; PBEGIN_(); SETDBG_(&on); while (1) { /* Wait for input from any node */ RCV_(&type, (char *) buf, &lenbuf, &lenmes, &node, &nodefrom, &sync); if (lenmes != lenbuf) Error("NextValueServer: lenmes != lenbuf", lenmes); mproc = buf[0]; nval = buf[1]; if (DEBUG_) (void) printf("NVS: from=%d, mproc=%d, ndone=%d, ntermin=%d\n", nodefrom, mproc, ndone, ntermin); if (mproc == 0) { /* Sending process is about to terminate. Send reply and disable sending to him. If all processes have finished return. */ SND_(&type, (char *) &cnt, &lencnt, &nodefrom, &sync); if (++ntermin == NNODES_()) return 0; } else if (mproc > 0) { /* This is what we are here for */ SND_(&type, (char *) &cnt, &lencnt, &nodefrom, &sync); cnt += nval; } else if (mproc < 0) { /* This process has finished the loop. Wait until all mproc processes have finished before releasing it */ done_list[ndone++] = nodefrom; if (ndone == -mproc) { while (ndone--) { nodefrom = done_list[ndone]; SND_(&type, (char *) &cnt, &lencnt, &nodefrom, &sync); } cnt = 0; ndone = 0; } } } return 0; } ga-5-4/tcgmsg/tests/testf2.F0000644000175000017500000001114012662210372013772 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit double precision (a-h,o-z) c c $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/testf.f,v 1.2 2001-05-08 17:30:39 edo Exp $ c c FORTRAN program to test message passing routines c c LOG is the FORTRAN unit number for standard output. c parameter (LOG = 6) parameter (MAXLEN = 262144 / 8) #include "msgtypesf.h" dimension buf(MAXLEN) integer ibuf(MAXLEN) character*80 fortnn character*80 fname c c Always the first thing to do is call pbeginf c call pbeginf call setdbg(0) c c who am i and how many processes c nproc = nnodes() me = nodeid() c c now try broadcasting messages from all nodes to every other node c send each process my id as a message c itype = 1 + MSGINT do 10 iproc = 0,nproc-1 itest = me call brdcst(itype, itest, mitob(1),iproc) if (iproc.ne.me) then write(LOG,1) me, itest 1 format(' me=',i3,', itest=',i3) endif 10 continue c c now try using the shared counter c mproc = nproc do 20 i = 1,40 write(LOG,*) ' process ',me,' got ',nxtval(mproc) 20 continue junk = nxtval(-mproc) c c now time sending a message round a ring c if (nproc.gt.1) then itype = 3 left = mod(me + nproc - 1, nproc) iright = mod(me + 1, nproc) c lenbuf = 1 30 if (me .eq. 0) then istart = mtime() call snd(itype, buf, lenbuf, left, 1) call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) iused = mtime() - istart if (iused.gt.0) then rate = 1.0d-4 * dble(nproc * lenbuf) / dble(iused) else rate = 0.0d0 endif write(LOG,31) lenbuf, iused, rate else call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) call snd(itype, buf, lenbuf, left, 1) endif lenbuf = lenbuf * 2 if (lenbuf .le. mdtob(MAXLEN)) goto 30 31 format(' len=',i7,' bytes, used=',i4,' cs, rate=',f10.6,' Mb/s') endif c c global sums c do i=1,MAXLEN ibuf(i) = i*me buf(i) = dble(ibuf(i)) enddo dtype=1+MSGDBL call igop(itype, ibuf, MAXLEN, "+") call dgop(dtype, buf, MAXLEN, "+") do i=1,MAXLEN iresult = i*nproc*(nproc-1)/2 if (ibuf(i).ne.iresult.or.buf(i).ne.dble(iresult)) . call error('TestGlobals: global sum failed', i) enddo if (me.eq.0) write(LOG,*) 'global sums OK' c c c Check that everyone can open, write, read and close c a binary FORTRAN file c do ii=29,45 write(fortnn,1234) ii 1234 format('fort',i2) call pfname(fortnn,fname) open(ii,file=fname,form='unformatted',status='unknown', & err=1000) enddo do ii=11,19 write(ii,err=1001) buf rewind ii read(ii,err=1002) buf close(ii,status='delete') enddo c if (me.eq.0) call stats c c Always the last thing to do is call pend c call pend c c check that everyone makes it thru after pend .. NODEID c is not actually guaranteed to work outside of pbegin/pend c section ... it may return junk. All you should do is exit c is some FORTRAN supported fashion c write(LOG,32) nodeid() 32 format(' Process ',i4,' after pend') stop c c error returns for FORTRAN I/O c 1000 call error('failed to open fortran binary file',-1) 1001 call error('failed to write fortran binary file',-1) 1002 call error('failed to read fortran binary file',-1) c end subroutine pfname(name, fname) character*(*) name, fname c c construct a unique filename by appending the process c number after the stub name c i.e. = . c c find last non-blank character in name c do 10 i = len(name),1,-1 if (name(i:i).ne.' ') goto 20 10 continue call error('pfname: name is all blanks!',i) c c check that have room to store result and then write result c 20 if (i+4.gt.len(fname)) & call error('pfname: fname too short for name.id',len(fname)) fname = name write(fname(i+1:i+4),1) nodeid() 1 format('.',i3.3) c end subroutine error(s,i) parameter (LOG = 6) character*(*) s integer i c write(LOG,1) s,i 1 format(// $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/ $ 1x,a,1x,i8/ $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/) c $ 1x,a,1x,i8/ c call parerr(i) c end ga-5-4/tcgmsg/tests/timer.f0000644000175000017500000000077512662210372013757 0ustar mbamba double precision function timer() c c return the time since the last call to timer. c c must be initialized by calling once and throwing away the c value c ... use cpu time on multi-user machines c ... use elapsed time on dedicated or single user machines. c *mdc*if unix * real*4 dtime, tt(2) * timer = dble(dtime(tt)) *mdc*elseif tcgmsg save mlast data mlast/0/ m = mtime() timer = dble(m - mlast) * 0.01d0 mlast = m *mdc*endif c end ga-5-4/tcgmsg/tests/testf3.F0000644000175000017500000001207112662210372013777 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit double precision (a-h,o-z) c c $Header: /tmp/hpctools/ga/tcgmsg-mpi/testf.F,v 1.1.12.1 2006-12-14 13:24:56 manoj Exp $ c c FORTRAN program to test message passing routines c c LOG is the FORTRAN unit number for standard output. c parameter (LOG = 6) parameter (MAXLEN = 262144 / 8) #include "msgtypesf.h" dimension buf(MAXLEN) integer ibuf(MAXLEN) character*80 fname integer IUNIT double precision tcgtime, start,used c c Always the first thing to do is call pbeginf c call pbeginf call setdbg(0) call evon c c who am i and how many processes c nproc = nnodes() me = nodeid() c c now try broadcasting messages from all nodes to every other node c send each process my id as a message c call evbgin('Hello test') itype = 1 + MSGINT do 10 iproc = 0,nproc-1 itest = me call brdcst(itype, itest, mitob(1),iproc) if (iproc.ne.me) then write(LOG,1) me, itest 1 format(' me=',i3,', itest=',i3) endif 10 continue call evend('Hello test') call evbgin('Counter test') c c now try using the shared counter c mproc = nproc do 20 i = 1,10 write(LOG,*) ' process ',me,' got ',nxtval(mproc) 20 continue junk = nxtval(-mproc) call evend('Counter test') c c now time sending a message round a ring c if (nproc.gt.1) then call evbgin('Ring test') itype = 3 left = mod(me + nproc - 1, nproc) iright = mod(me + 1, nproc) c lenbuf = 1 30 if (me .eq. 0) then start = tcgtime() call snd(itype, buf, lenbuf, left, 1) call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) used = tcgtime() - start if (used.gt.0) then c rate = 1.0d-4 * dble(nproc * lenbuf) / dble(iused) rate = 1.0d-6 * dble(nproc * lenbuf) / used else rate = 0.0d0 endif write(LOG,31) lenbuf, used, rate else call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) call snd(itype, buf, lenbuf, left, 1) endif lenbuf = lenbuf * 2 if (lenbuf .le. mdtob(MAXLEN)) goto 30 31 format(' len=',i7,'bytes, used=',f10.6,'s, rate=',f10.6,'Mb/s') call evend('Ring test') endif c c global sums c do i=1,MAXLEN ibuf(i) = i*me buf(i) = dble(ibuf(i)) enddo dtype=1+MSGDBL call igop(itype, ibuf, MAXLEN, "+") call dgop(dtype, buf, MAXLEN, "+") do i=1,MAXLEN iresult = i*nproc*(nproc-1)/2 if (ibuf(i).ne.iresult) then print *,'error',i,ibuf(i),iresult call error('TestGlobals: global sum (igop) failed', i) endif if (buf(i).ne.dble(iresult)) then print *,'error',i,buf(i),iresult call error('TestGlobals: global sum (dgop) failed', i) endif enddo if (me.eq.0) write(LOG,*) 'global sums OK' c c c Check that everyone can open, write, read and close c a binary FORTRAN file c IUNIT = 9+me call pfname('junk',fname) open(IUNIT,file=fname,form='unformatted',status='unknown', & err=1000) write(IUNIT,err=1001) buf rewind IUNIT read(IUNIT,err=1002) buf close(IUNIT,status='delete') call event('Read file OK') c if (me.eq.0) call stats c c Always the last thing to do is call pend c call pend c c check that everyone makes it thru after pend .. NODEID c is not actually guaranteed to work outside of pbegin/pend c section ... it may return junk. All you should do is exit c is some FORTRAN supported fashion c write(LOG,32) me 32 format(' Process ',i4,' after pend') stop c c error returns for FORTRAN I/O c 1000 call error('failed to open fortran binary file',-1) 1001 call error('failed to write fortran binary file',-1) 1002 call error('failed to read fortran binary file',-1) c end subroutine pfname(name, fname) character*(*) name, fname c c construct a unique filename by appending the process c number after the stub name c i.e. = . c c find last non-blank character in name c do 10 i = len(name),1,-1 if (name(i:i).ne.' ') goto 20 10 continue call error('pfname: name is all blanks!',i) c c check that have room to store result and then write result c 20 if (i+4.gt.len(fname)) & call error('pfname: fname too short for name.id',len(fname)) fname = name write(fname(i+1:i+4),1) nodeid() 1 format('.',i3.3) c end subroutine error(s,i) parameter (LOG = 6) character*(*) s integer i c write(LOG,1) s,i 1 format(// $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/ $ 1x,a,1x,i8/ $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/) c $ 1x,a,1x,i8/ c call parerr(i) c end ga-5-4/tcgmsg/tests/toplot.c0000644000175000017500000001001412662210372014140 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_LIBPLOT #if HAVE_STDIO_H # include #endif #if HAVE_CTYPE_H # include #endif extern void openpl(); extern void erase(); extern void label(); extern void line(); extern void circle(); extern void arc(); extern void move(); extern void cont(); extern void point(); extern void linemod(); extern void space(); extern void closepl(); void Error(char *string, int integer) { (void) fflush(stdout); (void) fprintf(stderr,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); (void) fprintf(stderr,"%s %d (0x%x)\n",string, integer, integer); (void) fprintf(stderr,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); (void) fflush(stderr); (void) exit(1); } static int xmin = 0; static int ymin = 0; #define SCALE(X, XMIN, XSCALE) \ 2048 + (int) (XSCALE * (DoublePrecision) ( (X) - (XMIN) ) ) /** * Crude ascii interface into UNIX binary plot file format. * * All co-ordinates are integer values. * * s xmin ymin xmax ymax ... defines user co-ordinates * * f 1 ... solid lines * f 2 ... dotted * f 3 ... shortdashed * f 4 ... longdashed * * t x y text_string_with_no_spaces_in_it ... draw text at coords x,y * * l x1 y1 x2 y2 ... draw line from (x1,y1)->(x2,y2) */ int main(int argc, char **argv) { int test, i1,i2,i3,i4,nline=0,x1,x2,y1,y2; char string[1024]; DoublePrecision scalex, scaley; openpl(); space(0, 0, 32767, 32767); /* open as large as possible */ while ( (test = getchar()) != EOF ) { if ( !isspace(test) ) { nline++; switch (test) { case 's': if (scanf("%d %d %d %d",&i1,&i2,&i3,&i4) != 4) Error("plot: scanning space arguments, line=",nline); else { xmin = i1; ymin = i2; scalex = (32767.0-4096.0) / (DoublePrecision) (i3 - i1); scaley = (32767.0-4096.0) / (DoublePrecision) (i4 - i2); } break; case 'l': if (scanf("%d %d %d %d",&i1,&i2,&i3,&i4) != 4) Error("plot: scanning line arguments, line=",nline); x1 = SCALE(i1, xmin, scalex); x2 = SCALE(i3, xmin, scalex); y1 = SCALE(i2, ymin, scaley); y2 = SCALE(i4, ymin, scaley); line(x1, y1, x2, y2); break; case 'f': if (scanf("%d",&i1) != 1) Error("plot: scanning linemode arguments",-1); switch (i1) { case 1: linemod("solid"); break; case 2: linemod("dotted"); break; case 3: linemod("shortdashed"); break; case 4: linemod("longdashed"); break; default: Error("plot: unknown linemode",i1); } break; case 't': if (scanf("%d %d %s",&i1, &i2, string) != 3) Error("plot: scanning text arguments", -1); x1 = SCALE(i1, xmin, scalex); y1 = SCALE(i2, ymin, scaley); move(x1, y1); label(string); break; default: Error("plot: unknown directive, line=",nline); break; } } } closepl(); (void) fflush(stdout); return 0; } #else /* HAVE_LIBPLOT */ #if HAVE_STDIO_H # include #endif int main(int argc, char **argv) { printf("no plot utility on this system\n"); return 0; } #endif /* HAVE_LIBPLOT */ ga-5-4/tcgmsg/tests/test.c0000644000175000017500000004563212662210372013614 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_MEMORY_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MALLOC_H # include #endif #include "evlog.h" #include "typesf2c.h" #include "msgtypesc.h" #include "tcgmsg.h" extern unsigned char CheckByte(); extern void Error(const char *, Integer); /** * Process 0 sleeps for 20 seconds and then sends each * process a message. The other processes sleep for periods * of 2 seconds and probes until it gets a message. All processes * respond to process 0 which recieves using a wildcard probe. */ static void TestProbe() { long type_syn = 32; long type_msg = 33; long type_ack = 34; long me = tcg_nodeid(); char buf; long lenbuf = sizeof buf; long sync = 1; if (me == 0) { (void) printf("Probe test ... processes should sleep for 20s only\n"); (void) printf("----------\n\n"); (void) fflush(stdout); } tcg_synch(type_syn); if (me == 0) { long nproc = tcg_nnodes(); long anyone = -1; long ngot = 0; long node; (void) sleep((unsigned) 20); for (node=1; node hi) { ran = hi; } list[i] = ran; } } /** * Stress the system by passing messages between a ranomly selected * list of nodes */ void Stress() { long me = tcg_nodeid(); long nproc = tcg_nnodes(); long type, lenbuf, node, lenmes, nodefrom, i, j, from, to; long *list_i, *list_j, *list_n; #define N_LEN 11 static long len[N_LEN] = {0,1,2,4,8,4095,4096,4097,16367,16368,16369}; char *buf1, *buf2; long n_stress, mod; long sync = 1; from = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Stress test ... randomly exchange messages\n-----------"); (void) printf("\n\nInput no. of messages: "); (void) fflush(stdout); if (scanf("%ld",&n_stress) != 1) { Error("Stress: error reading n_stress",(long) -1); } if ( (n_stress <= 0) || (n_stress > 100000) ) { n_stress = 100; } } type = 13 | MSGINT; tcg_brdcst(type, (void *) &n_stress, lenbuf, from); type++; lenbuf = n_stress * sizeof(long); #if HAVE_MEMALIGN list_i = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_i = (long *) malloc((unsigned) lenbuf); #endif if ( list_i == (long *) NULL ) { Error("Stress: failed to allocate list_i",n_stress); } #if HAVE_MEMALIGN list_j = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_j = (long *) malloc((unsigned) lenbuf); #endif if ( list_j == (long *) NULL ) { Error("Stress: failed to allocate list_j",n_stress); } #if HAVE_MEMALIGN list_n = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_n = (long *) malloc((unsigned) lenbuf); #endif if ( list_n == (long *) NULL ) { Error("Stress: failed to allocate list_n",n_stress); } if ( (buf1 = malloc((unsigned) 16376)) == (char *) NULL ) { Error("Stress: failed to allocate buf1", (long) 16376); } if ( (buf2 = malloc((unsigned) 16376)) == (char *) NULL ) { Error("Stress: failed to allocate buf2", (long) 16376); } if (me == 0) { /* Make random list of node pairs and message lengths */ RandList((long) 0, (long) (tcg_nnodes()-1), list_i, n_stress); RandList((long) 0, (long) (tcg_nnodes()-1), list_j, n_stress); RandList((long) 0, (long) (N_LEN-1), list_n, n_stress); for (i=0; i= nproc) ) { Error("Stress: from is out of range", from); } if ( (to < 0) || (to >= nproc) ) { Error("Stress: to is out of range", to); } if (from == to) { continue; } if ( (me == 0) && (j%mod == 0) ) { (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n", i, from, to, lenbuf); (void) fflush(stdout); } j++; if (from == me) { tcg_snd(type, buf1, lenbuf, to, sync); } else if (to == me) { (void) bzero(buf2, (int) lenbuf); /* Initialize the receive buffer */ buf2[lenbuf] = '+'; tcg_rcv(type, buf2, lenbuf, &lenmes, from, &nodefrom, sync); if (buf2[lenbuf] != '+') { Error("Stress: overran buffer on receive",lenbuf); } if (CheckByte((unsigned char *) buf1, lenbuf) != CheckByte((unsigned char *) buf2, lenbuf)) { Error("Stress: invalid checksum on receive",lenbuf); } if (lenmes != lenbuf) { Error("Stress: invalid message length on receive",lenbuf); } } } (void) free(buf2); (void) free(buf1); (void) free((char *) list_n); (void) free((char *) list_j); (void) free((char *) list_i); #undef N_LEN } /** Time passing a message round a ring. */ void RingTest() { long me = tcg_nodeid(); long type = 4; long left = (me + tcg_nnodes() - 1) % tcg_nnodes(); long right = (me + 1) % tcg_nnodes(); char *buf, *buf2=NULL; unsigned char sum, sum2; long lenbuf, lenmes, nodefrom; DoublePrecision start, used, rate; long max_len; long i; long sync = 1; i = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Ring test ... time network performance\n---------\n\n"); (void) printf("Input maximum message size: "); (void) fflush(stdout); if (scanf("%ld", &max_len) != 1) { Error("RingTest: error reading max_len",(long) -1); } if ( (max_len <= 0) || (max_len >= 4*1024*1024) ) { max_len = 256*1024; } } type = 4 | MSGINT; tcg_brdcst(type, (void *) &max_len, lenbuf, i); if ( (buf = malloc((unsigned) max_len)) == (char *) NULL) { Error("failed to allocate buf",max_len); } if (me == 0) { if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL) { Error("failed to allocate buf2",max_len); } for (i=0; i0)?lenbuf:1); int loop = nloops; if (me == 0) { sum = CheckByte((unsigned char *) buf, lenbuf); if (lenbuf) (void) bzero(buf2, (int) lenbuf); start = tcg_time(); while (loop--) { tcg_snd(type, buf, lenbuf, left, sync); tcg_rcv(type, buf2, lenbuf, &lenmes, right, &nodefrom, sync); } used = tcg_time() - start; sum2 = CheckByte((unsigned char *) buf2, lenbuf); sum2 = 0; if (used > 0) { rate = 1.0e-6 * (DoublePrecision) (tcg_nnodes() * lenbuf) / (DoublePrecision) used; } else { rate = 0.0; } rate = rate * nloops; printf("len=%6ld bytes, nloop=%4d, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n", lenbuf, nloops, used, rate, sum, sum2); (void) fflush(stdout); } else { while (loop--) { tcg_rcv(type, buf, lenbuf, &lenmes, right, &nodefrom, sync); tcg_snd(type, buf, lenbuf, left, sync); } } if (lenbuf) { lenbuf *= 2; } else { lenbuf = 1; } (void) fflush(stdout); } if (me == 0) { (void) free(buf2); } (void) free(buf); } /** Test receiveing a message from any node. */ void RcvAnyTest() { long me = tcg_nodeid(); long type = 337 | MSGINT; char buf[8]; long i, j, node, lenbuf, lenmes, nodefrom, receiver, n_msg; long sync = 1; lenbuf = sizeof(long); if (me == 0) { (void) printf("RCV any test ... check is working!\n-----------\n\n"); (void) printf("Input node to receive : "); (void) fflush(stdout); if (scanf("%ld", &receiver) != 1) { Error("RcvAnyTest: error reading receiver",(long) -1); } if ( (receiver < 0) || (receiver >= tcg_nnodes()) ) { receiver = tcg_nnodes()-1; } (void) printf("Input number of messages : "); (void) fflush(stdout); if (scanf("%ld", &n_msg) != 1) { Error("RcvAnyTest: error reading n_msg",(long) -1); } if ( (n_msg <= 0) || (n_msg > 10) ) { n_msg = 5; } } node = 0; tcg_brdcst(type, (void *) &receiver, lenbuf, node); type++; tcg_brdcst(type, (void *) &n_msg, lenbuf, node); type++; lenbuf = 0; type = 321; for (i=0; i= 10000) ) { n_val = 100; } } node = 0; tcg_brdcst(type, (void *) &n_val, lenbuf, node); /* Loop thru a few values to visually show it is working */ next = -1; for (i=0; i<10; i++) { if (i > next) { next = tcg_nxtval(nproc); } if (i == next) { (void) printf("node %ld got value %ld\n",me, i); (void) fflush(stdout); } } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; /* Now time it for real .. twice*/ for (ntimes=0; ntimes<2; ntimes++) { if (me == 0) { start = tcg_time(); } next = -1; ngot = 0; for (i=0; i next) { next = tcg_nxtval(nproc); } if (i == next) { ngot++; } } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; if (me == 0) { used = tcg_time() - start; rate = used / ngot; (void) printf("node 0: From %ld busy iters did %ld, used=%fs per call\n", n_val, ngot, rate); (void) fflush(stdout); } type++; tcg_synch(type); } } void ToggleDebug() { static long on = 0; long me = tcg_nodeid(); long type = 666 | MSGINT; long lenbuf = sizeof(long); long from=0; long node; if (me == 0) { (void) printf("\nInput node to debug (-1 = all) : "); (void) fflush(stdout); if (scanf("%ld", &node) != 1) { Error("ToggleDebug: error reading node",(long) -1); } } tcg_brdcst(type, (void*) &node, lenbuf, from); if ((node < 0) || (node == me)) { on = (on + 1)%2; tcg_setdbg(on); } } int main(int argc, char **argv) { long type; long lenbuf; long node, opt; #if TEST_OLD_PBEGIN tcg_pbegin(argc, argv); #else tcg_alt_pbegin(&argc, &argv); #endif (void) printf("In process %ld\n", tcg_nodeid()); (void) fflush(stdout); /* Read user input for action */ lenbuf = sizeof(long); node = 0; while (1) { (void) fflush(stdout); if (tcg_nodeid() == 0) { (void) sleep(1); } type = 999; tcg_synch(type); (void) sleep(1); if (tcg_nodeid() == 0) { again: (void) printf("\n\ 0=quit\n\ 1=Ring 5=NxtVal\n\ 2=Stress 6=Global\n\ 3=Hello 7=Debug\n\ 4=RcvAny 8=Probe\n\n\ Enter test number : "); (void) fflush(stdout); if (scanf("%ld", &opt) != 1) { Error("test: input of option failed",(long) -1); } (void) printf("\n"); (void) fflush(stdout); if ( (opt < 0) || (opt > 8) ) { goto again; } } type = 2 | MSGINT; tcg_brdcst(type, (void*) &opt, lenbuf, node); switch (opt) { case 0: if (tcg_nodeid() == 0) { tcg_stats(); } tcg_pend(); return 0; case 1: RingTest(); break; case 2: Stress(); break; case 3: Hello(); break; case 4: RcvAnyTest(); break; case 5: NextValueTest(); break; case 6: TestGlobals(); break; case 7: ToggleDebug(); break; case 8: TestProbe(); break; default: Error("test: invalid option", opt); break; } } } ga-5-4/tcgmsg/tests/parse.c0000644000175000017500000001413712662210372013743 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #define MAX_TOKEN 2048 /** * Read next token from file. Tokens are separated by the character * delimeter. * Tokens are returned as NUL terminated character strings which * almost certainly should always be freed with free() after use. * * There is an internally imposed maximum token size of MAX_TOKEN bytes. * * All errors are handled by returning a NULL pointer. */ char *ReadToken(FILE *file, char delimiter) { char *buf = malloc((unsigned) MAX_TOKEN); char *temp; int input, used=0; if (!buf) { return (char *) NULL; } temp = buf; while ( (input = getc(file)) != EOF ) { used++; if (input == delimiter) { *temp = '\0'; break; } else { *temp++ = (char) input; if (used == MAX_TOKEN) { used = 0; break; } } } /* duplicate string to minimize problems if string is not freed in calling program */ if (used) { temp = strdup(buf); } else { temp = (char *) NULL; } (void) free(buf); return temp; } int FindToken(char *token, FILE *file, char delimiter) { char *input; while (input = ReadToken(file, delimiter)) { if (strcmp(input, token) == 0) { return 1; } else { (void) free(input); } } return 0; } /** * Return the starting time and duration of the events file. */ void GetTimeSpan(FILE *file, DoublePrecision *start, DoublePrecision *duration) { char *input; DoublePrecision end; end = *start = 0.0; if (FindToken("TIME", file, ':')) { end = *start = atof(input = ReadToken(file, ':')); (void) free(input); } while (FindToken("TIME", file, ':')) { end = atof(input = ReadToken(file, ':')); (void) free(input); } *duration = end - *start; (void) fseek(file, 0L, 0); } int main(int argc, char **argv) { char filename[11]; FILE *file, *plot; char *token; char *event; DoublePrecision time, start, duration=0.0, otim, span, margin, comms, useful; int newstate, state, i, nproc, lo, hi; if (argc == 1) { lo = 0; hi = 127; } else if (argc == 3) { lo = atoi(argv[1]); hi = atoi(argv[2]); } else { (void) fprintf(stderr, "usage: %s [lo hi]\n", argv[0]); (void) fprintf(stderr, "... with no arguments parse all event files\n"); (void) fprintf(stderr, "... or with lo & hi only files in this range\n"); (void) fprintf(stderr, "... e.g. parse 16 31\n"); return 1; } /* open the file that will have the plot stuff in it */ /* change of heart here ... just write to stdout */ /* if (!(plot = fopen("plot", "w"))) { perror("failed to open plot file"); return 1; } */ plot = stdout; /* Determine how many processes there are and maximum time span */ nproc = 0; for (i=lo; i<=hi; i++) { (void) sprintf(filename, "events.%03d", nproc); if ( !(file = fopen(filename, "r")) ) { break; } GetTimeSpan(file, &start, &span); (void) fclose(file); if (span > duration) { duration = span; } nproc++; } margin = duration * 0.1; (void) fprintf(plot, "s %d %d %d %d\n",0,0, (int) ((margin*2.0+duration)*100.0), 5*nproc); /* (void) fprintf(stderr, "nproc=%d, duration=%4.2f\n", nproc, duration); */ /* Now go thru the files and actually parse the contents */ for (i=lo; i<=hi; i++) { (void) sprintf(filename, "events.%03d", i); if ( !(file = fopen(filename, "r")) ) { break; } GetTimeSpan(file, &start, &span); comms = 0.0; state = 5*(i-lo); otim = 0.0 + margin; (void) fprintf(plot, "t %d %d %d\n", 0, state, i); while ( token = ReadToken(file, ':') ) { if (strcmp(token, "BEGIN") == 0) { newstate = 5*(i-lo) + 1; } else if (strcmp(token, "END") == 0) { newstate = 5*(i-lo); } else { continue; } /* Have a BEGIN or END ... only process Snd/Rcv at moment */ event = ReadToken(file, ':'); if ((strcmp(event, "Snd") == 0) || (strcmp(event,"Rcv") == 0) || (strcmp(event,"Waitcom") == 0)) { if (FindToken("TIME", file, ':')) { time = atof(ReadToken(file, ':')) - start + margin; (void) fprintf(plot, "l %d %d %d %d\n", (int) (otim*100.0), state, (int) (time*100.0), state); (void) fprintf(plot, "l %d %d %d %d\n", (int) (time*100.0), state, (int) (time*100.0), newstate); /* Accumulate the time spent in communication */ if (newstate == (5*(i-lo))) { comms = comms + time - otim; } otim = time; state = newstate; } } else if (strcmp(event, "Process") == 0) { if (FindToken("TIME", file, ':')) { time = atof(ReadToken(file, ':')) - start + margin; (void) fprintf(plot, "l %d %d %d %d\n", (int) (otim*100.0), state, (int) (time*100.0), state); otim = time; } } } /* Assume that non-communication time is useful */ useful = 100.0 * (span - comms) / duration; (void) fprintf(plot, "t %d %d %4.1f%%\n", (int) (100.0*duration+150.0*margin), 5*(i-lo), useful); (void) fflush(plot); (void) fclose(file); } return 0; } ga-5-4/tcgmsg/tests/pvm.c0000644000175000017500000001047512662210372013434 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include #define MAX_PROC 128 #define TCGTIME_ TCGTIME double TCGTIME_(); #define ENCODING PvmDataRaw long NODEID_() { return((long) pvm_get_PE(pvm_mytid())); } long NNODES_() { return((long)pvm_gsize(0)); } /** * Error handler */ void Error(string, code) char *string; long code; { (void) fflush(stdout); (void) fflush(stderr); (void) fprintf(stderr, "%3d:%s %ld(%x)\n", NODEID_(), string, code, code); (void) perror("system message"); (void) fflush(stdout); (void) fflush(stderr); globalexit(1); } void SND_(type, buf, lenbuf, node, sync) long *type; char *buf; long *lenbuf; long *node; long *sync; { long tid=pvm_gettid("", *node); pvm_psend(tid, *type, buf, *lenbuf, PVM_BYTE); } void RCV_(type, buf, lenbuf, lenmes, nodeselect, nodefrom, sync) long *type; char *buf; long *lenbuf; long *lenmes; long *nodeselect; long *nodefrom; long *sync; { int tid=*nodeselect, tidfrom; if(tid >-1) tid=pvm_gettid("", *nodeselect); pvm_precv(tid, *type, buf, *lenbuf, PVM_BYTE, &tidfrom, 0, 0); *nodefrom = pvm_get_PE(tidfrom); } /** * Time passing a message round a ring */ void RingTest() { long me = NODEID_(); long type = 4; long left = (me + NNODES_() - 1) % NNODES_(); long right = (me + 1) % NNODES_(); char *buf, *buf2; unsigned char sum, sum2; long lenbuf, lenmes, nodefrom; double start, used, rate; long max_len; long i; long sync = 1; char *malloc(); i = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Ring test ... time network performance\n---------\n\n"); /* (void) printf("Input maximum message size: "); (void) fflush(stdout); if (scanf("%ld", &max_len) != 1) Error("RingTest: error reading max_len",(long) -1); if ( (max_len <= 0) || (max_len >= 4*1024*1024) ) max_len = 256*1024; */ } max_len = 512*1024; /* type = 4 | MSGINT;*/ /* BRDCST_(&type, (char *) &max_len, &lenbuf, &i);*/ if ( (buf = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf",max_len); if (me == 0) { if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf2",max_len); for (i=0; i 0) rate = 1.0e-6 * (double) (NNODES_() * lenbuf) / (double) used; else rate = 0.0; rate = rate * nloops; printf("len=%6ld bytes, nloop=%4ld, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n", lenbuf, nloops, used, rate, sum, sum2); (void) fflush(stdout); } else { while (loop--) { RCV_(&type, buf, &lenbuf, &lenmes, &right, &nodefrom, &sync); SND_(&type, buf, &lenbuf, &left, &sync); } } lenbuf *= 2; } if (me == 0) (void) free(buf2); (void) free(buf); } int main(int argc, char **argv) { long me, nproc; long buf[10]; long type=1, len=sizeof(buf), node, sync=1, i; me = NODEID_(); nproc = NNODES_(); /* if(me==0){ for(i=0;i<10;i++)buf[i]=i; node=1; SND_(&type, buf, &len, &node, &sync); printf("me=%d nproc = %d\n", me, nproc); fflush(stdout); }else{ node=0; RCV_(&type, buf, &len, &len, &node, &node, &sync); printf("me=%d nproc = %d\n", me, nproc); fflush(stdout); for(i=0;i<10;i++)printf("%d ",buf[i]);; } */ RingTest(); } ga-5-4/tcgmsg/tests/test2.c0000644000175000017500000004432112662210372013670 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/test.c,v 1.4 2002-01-28 19:42:04 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MEMORY_H # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_UNISTD_H # include #endif #if HAVE_MALLOC_H # include #endif #include "evlog.h" #include "msgtypesc.h" #include "typesf2c.h" #include "tcgmsg.h" extern unsigned char CheckByte(); extern void Error(const char *, Integer); /** * Process 0 sleeps for 20 seconds and then sends each * process a message. The other processes sleep for periods * of 2 seconds and probes until it gets a message. All processes * respond to process 0 which recieves using a wildcard probe. */ static void TestProbe() { long type_syn = 32; long type_msg = 33; long type_ack = 34; long me = tcg_nodeid(); char buf; long lenbuf = sizeof buf; long sync = 1; if (me == 0) { (void) printf("Probe test ... processes should sleep for 20s only\n"); (void) printf("----------\n\n"); (void) fflush(stdout); } tcg_synch(type_syn); if (me == 0) { long nproc = tcg_nnodes(); long anyone = -1; long ngot = 0; long node; (void) sleep((unsigned) 20); for (node=1; node hi) ran = hi; list[i] = ran; } } /** * Stress the system by passing messages between a ranomly selected * list of nodes */ void Stress() { long me = tcg_nodeid(); long nproc = tcg_nnodes(); long type, lenbuf, node, lenmes, nodefrom, i, j, from, to; long *list_i, *list_j, *list_n; #define N_LEN 11 static long len[N_LEN] = {0,1,2,4,8,4063,4064,4065,4072,8127,8129}; char *buf1, *buf2; long n_stress, mod; long sync = 1; from = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Stress test ... randomly exchange messages\n-----------"); (void) printf("\n\nInput no. of messages: "); (void) fflush(stdout); if (scanf("%ld",&n_stress) != 1) Error("Stress: error reading n_stress",(long) -1); if ( (n_stress <= 0) || (n_stress > 100000) ) n_stress = 100; } type = 13 | MSGINT; tcg_brdcst(type, (void *) &n_stress, lenbuf, from); type++; lenbuf = n_stress * sizeof(long); #if HAVE_MEMALIGN list_i = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_i = (long *) malloc((unsigned) lenbuf); #endif if ( list_i == (long *) NULL ) { Error("Stress: failed to allocate list_i",n_stress); } #if HAVE_MEMALIGN list_j = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_j = (long *) malloc((unsigned) lenbuf); #endif if ( list_j == (long *) NULL ) { Error("Stress: failed to allocate list_j",n_stress); } #if HAVE_MEMALIGN list_n = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_n = (long *) malloc((unsigned) lenbuf); #endif if ( list_n == (long *) NULL ) { Error("Stress: failed to allocate list_n",n_stress); } if ( (buf1 = malloc((unsigned) 16376)) == (char *) NULL ) Error("Stress: failed to allocate buf1", (long) 16376); if ( (buf2 = malloc((unsigned) 16376)) == (char *) NULL ) Error("Stress: failed to allocate buf2", (long) 16376); if (me == 0) { /* Make random list of node pairs and message lengths */ RandList((long) 0, (long) (tcg_nnodes()-1), list_i, n_stress); RandList((long) 0, (long) (tcg_nnodes()-1), list_j, n_stress); RandList((long) 0, (long) (N_LEN-1), list_n, n_stress); for (i=0; i= nproc) ) Error("Stress: from is out of range", from); if ( (to < 0) || (to >= nproc) ) Error("Stress: to is out of range", to); if (from == to) continue; if ( (me == 0) && (j%mod == 0) ) { (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n", i, from, to, lenbuf); (void) fflush(stdout); } j++; if (from == me) tcg_snd(type, buf1, lenbuf, to, sync); else if (to == me) { (void) bzero(buf2, (int) lenbuf); /* Initialize the receive buffer */ buf2[lenbuf] = '+'; tcg_rcv(type, buf2, lenbuf, &lenmes, from, &nodefrom, sync); if (buf2[lenbuf] != '+') Error("Stress: overran buffer on receive",lenbuf); if (CheckByte((unsigned char *) buf1, lenbuf) != CheckByte((unsigned char *) buf2, lenbuf)) Error("Stress: invalid checksum on receive",lenbuf); if (lenmes != lenbuf) Error("Stress: invalid message length on receive",lenbuf); } } (void) free(buf2); (void) free(buf1); (void) free((char *) list_n); (void) free((char *) list_j); (void) free((char *) list_i); } /** * Time passing a message round a ring * */ void RingTest() { long me = tcg_nodeid(); long type = 4; long left = (me + tcg_nnodes() - 1) % tcg_nnodes(); long right = (me + 1) % tcg_nnodes(); char *buf, *buf2; unsigned char sum, sum2; long lenbuf, lenmes, nodefrom; double start, used, rate; long max_len; long i; long sync = 1; i = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Ring test ... time network performance\n---------\n\n"); (void) printf("Input maximum message size: "); (void) fflush(stdout); if (scanf("%ld", &max_len) != 1) Error("RingTest: error reading max_len",(long) -1); if ( (max_len <= 0) || (max_len >= 4*1024*1024) ) max_len = 256*1024; } type = 4 | MSGINT; tcg_brdcst(type, (void *) &max_len, lenbuf, i); if ( (buf = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf",max_len); if (me == 0) { if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf2",max_len); for (i=0; i 0) rate = 1.0e-6 * (double) (tcg_nnodes() * lenbuf) / (double) used; else rate = 0.0; rate = rate * nloops; printf("len=%6ld bytes, nloop=%4d, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n", lenbuf, nloops, used, rate, sum, sum2); (void) fflush(stdout); } else { while (loop--) { tcg_rcv(type, buf, lenbuf, &lenmes, right, &nodefrom, sync); tcg_snd(type, buf, lenbuf, left, sync); } } lenbuf *= 2; } if (me == 0) (void) free(buf2); (void) free(buf); } /** * Test receiveing a message from any node */ void RcvAnyTest() { long me = tcg_nodeid(); long type = 337 | MSGINT; char buf[8]; long i, j, node, lenbuf, lenmes, nodefrom, receiver, n_msg; long sync = 1; lenbuf = sizeof(long); if (me == 0) { (void) printf("RCV any test ... check is working!\n-----------\n\n"); (void) printf("Input node to receive : "); (void) fflush(stdout); if (scanf("%ld", &receiver) != 1) Error("RcvAnyTest: error reading receiver",(long) -1); if ( (receiver < 0) || (receiver >= tcg_nnodes()) ) receiver = tcg_nnodes()-1; (void) printf("Input number of messages : "); (void) fflush(stdout); if (scanf("%ld", &n_msg) != 1) Error("RcvAnyTest: error reading n_msg",(long) -1); if ( (n_msg <= 0) || (n_msg > 10) ) n_msg = 5; } node = 0; tcg_brdcst(type, (void *) &receiver, lenbuf, node); type++; tcg_brdcst(type, (void *) &n_msg, lenbuf, node); type++; lenbuf = 0; type = 321; for (i=0; i= 10000) ) n_val = 100; } node = 0; tcg_brdcst(type, (void *) &n_val, lenbuf, node); /* Loop thru a few values to visually show it is working */ next = -1; for (i=0; i<10; i++) { if (i > next) next = tcg_nxtval(nproc); if (i == next) { (void) printf("node %ld got value %ld\n",me, i); (void) fflush(stdout); } } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; /* Now time it for real .. twice*/ for (ntimes=0; ntimes<2; ntimes++) { if (me == 0) start = tcg_time(); next = -1; ngot = 0; for (i=0; i next) next = tcg_nxtval(nproc); if (i == next) ngot++; } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; if (me == 0) { used = tcg_time() - start; if(ngot){ rate = used / ngot; (void) printf("node 0: From %ld busy iters did %ld, used=%fs per call\n", n_val, ngot, rate); }else printf("node 0: From %ld busy iters did 0\n",n_val); (void) fflush(stdout); } type++; tcg_synch(type); } } void ToggleDebug() { static long on = 0; long me = tcg_nodeid(); long type = 666 | MSGINT; long lenbuf = sizeof(long); long from=0; long node; if (me == 0) { (void) printf("\nInput node to debug (-1 = all) : "); (void) fflush(stdout); if (scanf("%ld", &node) != 1) Error("ToggleDebug: error reading node",(long) -1); } tcg_brdcst(type, (void *) &node, lenbuf, from); if ((node < 0) || (node == me)) { on = (on + 1)%2; tcg_setdbg(on); } } int main(int argc, char **argv) { long type; long lenbuf; long node, opt; tcg_alt_pbegin(&argc, &argv); (void) printf("In process %ld\n", tcg_nodeid()); (void) fflush(stdout); /* Read user input for action */ lenbuf = sizeof(long); node = 0; while (1) { (void) fflush(stdout); if (tcg_nodeid() == 0) (void) sleep(1); type = 999; tcg_synch(type); (void) sleep(1); if (tcg_nodeid() == 0) { again: (void) printf("\n\ 0=quit\n\ 1=Ring 5=NxtVal\n\ 2=Stress 6=Global\n\ 3=Hello 7=Debug\n\ 4=RcvAny 8=Probe\n\n\ Enter test number : "); (void) fflush(stdout); if (scanf("%ld", &opt) != 1) Error("test: input of option failed",(long) -1); (void) printf("\n"); (void) fflush(stdout); if ( (opt < 0) || (opt > 8) ) goto again; } type = 2 | MSGINT; tcg_brdcst(type, (void *) &opt, lenbuf, node); switch (opt) { case 0: if (tcg_nodeid() == 0) tcg_stats(); tcg_pend(); return 0; case 1: RingTest(); break; case 2: Stress(); break; case 3: Hello(); break; case 4: RcvAnyTest(); break; case 5: NextValueTest(); break; case 6: TestGlobals(); break; case 7: ToggleDebug(); break; case 8: TestProbe(); break; default: Error("test: invalid option", opt); break; } } return 0; } ga-5-4/tcgmsg/tests/jacobi.F0000644000175000017500000001465612662210372014031 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit double precision (a-h, o-z) dimension q(1) #include "msgtypesf.h" parameter (niter = 30, maxp = 2047) dimension jlo(0:maxp), nj(0:maxp) data iqoff, iqaddr/0, 0/ c c Simple iterative (Jacobi) linear equation solver (Ax = b) c c Initialize the message passing environment c call pbeginf c call evon c c Read in the dimension of the matrix on process 0 and c broadcast its value to everyone else c if (nodeid() .eq. 0) then write(6,1) 1 format(' Input dimension of matrix: '$) read(5,*) n endif call brdcst(1+MSGINT, n, mitob(1), 0) c c makjlo assigns a range of columns to each process. c ncolp is the number that this process is to do. c call makjlo(n, jlo, nj) ncolp = nj(nodeid()) c c allocate memory c need = n*ncolp + 2*n + 2*ncolp call getmem(need, q, iqaddr, iqoff) if (iqaddr.eq.0) call parerr(999) ia = iqoff + 1 ib = ia + n*ncolp ix = ib + ncolp is = ix + ncolp iw = is + n c c Make matrix (a), rhs vector (b) and initial guess (x) c call makabx(n, jlo(nodeid()), ncolp, q(ia), q(ib), q(ix)) c c Do niter iterations of the Jacobi algorithm. c Synchronize first for accurate timings. c call synch(13) rjunk = timer() call jacobi(n, jlo, nj, q(ia), q(ib), q(ix), q(is), q(iw), niter) used = timer() c c Print out results c rmflop = dble(niter*2*n)*dble(n) / (used*1.0d6) if (nodeid() .eq. 0) write(6,2) n, used, nnodes(), rmflop 2 format(' N=',i4,' used ',f6.2,' secs with ',i3,' processes', $ ', mflop=', f8.2) c call pend call fexit end subroutine jacobi(n, jlo, nj, a, b, x, s, work, niter) implicit double precision (a-h, o-z) dimension a(n, *), b(*), x(*), s(n), work(n), $ jlo(0:*), nj(0:*) c c Apply niter iterations of the Jacobi algorithm. c me = nodeid() do 10 iter = 1, niter c c Compute matrix vector product Ax ... this is the real work c c Do the part that we have c call mxv(a, n, x, nj(me), s) c c Now we have to add up the result over all the processors c Call dgop for simple but inefficient version. Call mxvadd c for a much more efficient version c c call dgop(2, s, n, '+') c call mxvadd(s, work, jlo, nj) c c Compute our part of the update vector and compute c the residual error (the error requires a global sum) c err = 0.0d0 do 20 j = jlo(me), jlo(me) + nj(me) - 1 jj = j - jlo(me) + 1 x(jj) = x(jj) + (b(jj)-s(j))/a(j,jj) err = err + abs((b(jj)-s(j))) 20 continue c c Write out results every now and again c if (mod(iter,10).eq.0) then call dgop(3, err, 1, '+') if (nodeid().eq.0) write(6,1) iter, err 1 format(' Iteration',i3,', Error',d9.2) endif 10 continue c end subroutine makabx(n, jlo, nj, a, b, x) implicit double precision (a-h, o-z) dimension a(n, nj), b(nj), x(nj) c jhi = jlo + nj - 1 do 10 j = jlo, jhi jj = j - jlo + 1 cvd$ novector do 20 i = 1, n a(i,jj) = dble(i+j) / dble(abs(i-j)*n+n/50+1) 20 continue b(jj) = dble(mod(j,3)) x(jj) = b(jj) / a(j,jj) 10 continue c end subroutine makjlo(n, jlo, nj) dimension jlo(0:*), nj(0:*) c ncolp = n / nnodes() next = n - (ncolp*nnodes()) jjlo = 1 do 10 iproc = 0, nnodes()-1 jlo(iproc) = jjlo jjlo = jjlo + ncolp if (iproc.lt.next) jjlo = jjlo + 1 nj(iproc) = jjlo - jlo(iproc) 10 continue c end subroutine mxvadd(s, work, jlo, nj) implicit real*8 (a-h, o-z) #include "msgtypesf.h" dimension s(*), work(*), jlo(0:*), nj(0:*) logical synch parameter (synch=.true.) c c We have in s(1:n) this process's contribution to the c matrix vector product A*x where we had nj(me) elements c of x starting at element jlo(me). Each process needs c to end up with the same elements of the full result c vector s. c c Thus we need to send to each process (ip) the elements c s(jlo(ip)+k-1), k=1,nj(ip). And we need to receive from c each process our piece of s which we add onto our result c vector. c c If communication is synchronous then we must explictly pair up c send/receive requests on this process with the matching c receive/send operations on other processes. c c There is potential for much more asynch stuff but the damned c iPSC-i860 hangs (irreproducibly) if we send off too many c unresolved asynchronous messages (how many is too much?). c me = nodeid() nproc = nnodes() nn = nproc + mod(nproc,2) c if (synch) then do 10 iter = 1, nn-1 call pairup(nn, me, iter, ip) if (ip.lt.nproc) then if (me. lt. ip) then call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 1) call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, & node, 1) else if (me.gt.ip) then call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, & node, 1) call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 1) endif call vvadd(nj(me), s(jlo(me)), work) endif 10 continue else do 20 iter = 1, nn-1 call pairup(nn, me, iter, ip) if (ip.lt.nproc) then call snd(3+MSGDBL, s(jlo(ip)), mdtob(nj(ip)), ip, 0) call rcv(3+MSGDBL, work, mdtob(nj(me)), lenmes, ip, node, 1) call vvadd(nj(me), s(jlo(me)), work) endif 20 continue call waitcom(-1) endif c end subroutine pairup(n, me, iter, ipair) c c one of many ways of generating maximally overlapped pairs c (not all that good on a hypercube though!) c if (iter.eq.1) then ipair = mod(n+1-me,n) else if (me.eq.0) then ipair = iter else if (me.eq.iter) then ipair = 0 else if (ipair.eq.0) ipair = me ipair = ipair + 2 if (ipair.ge.n) ipair = ipair + 1 - n endif end subroutine vvadd(n, a, b) implicit real*8 (a-h, o-z) dimension a(*), b(*) c do 10 i = 1,n a(i) = a(i) + b(i) 10 continue c end ga-5-4/tcgmsg/tests/mxv_fortran.f0000644000175000017500000000123012662210372015167 0ustar mbamba subroutine mxv(a,ncol,b,nrow,c) implicit double precision (a-h, o-z) dimension a(ncol, nrow), b(nrow), c(ncol) parameter (nchunk = 127) c c matrix vector product stripmined to optimize cache usage c when inner loop is replaced with a daxpy that uses pipelined c loads for a to avoid writing over c in the cache. c do 10 ilo = 1, ncol, nchunk ihi = min(ncol, ilo+nchunk-1) do 20 i = ilo, ihi c(i) = 0.0d0 20 continue do 30 j = 1, nrow do 40 i = ilo, ihi c(i) = c(i) + a(i,j)*b(j) 40 continue 30 continue 10 continue c end ga-5-4/tcgmsg/tests/test_asyn.c0000644000175000017500000000234212662210372014635 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #include #if HAVE_STDIO_H # include #endif int main(int argc, char **argv) { int numprocs, myid; int ierr; char req=0, ack=0; int atag=999, rtag=555, to; MPI_Status status; MPI_Request request; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); if(myid==0){ to = numprocs-1; printf("Testing nonblocking receive\n\n"); fflush(stdout); ierr = MPI_Irecv(&ack, 1, MPI_CHAR, to, atag ,MPI_COMM_WORLD, &request); printf(":after nonblocking receive\n"); fflush(stdout); ierr = MPI_Send(&req, 1, MPI_CHAR, to, rtag, MPI_COMM_WORLD); printf(":sent request\n"); fflush(stdout); ierr = MPI_Wait(&request, &status); printf(":received response\n"); fflush(stdout); printf("\nnonblocking receive is working\n"); fflush(stdout); } if(myid==numprocs-1){ to = 0; ierr = MPI_Recv(&req, 1, MPI_CHAR, to, rtag, MPI_COMM_WORLD, &status); printf("::request received\n"); fflush(stdout); ierr = MPI_Send(&ack, 1, MPI_CHAR, to, atag, MPI_COMM_WORLD); } MPI_Finalize(); return 0; } ga-5-4/tcgmsg/tests/testmap.c0000644000175000017500000000142712662210372014304 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "typesf2c.h" int ncols; int nrows; /* Given the col and row no. return the actual process no. */ #define MAP(Row,Col) (ncols*(Row) + (Col)) /* Given the node return the row no. */ #define ROW(Node) ((Node) / ncols) /* Given the node return the column no. */ #define COL(Node) ((Node) - ncols*((Node)/ncols)) int main(int argc, char **argv) { int node, type, len, me; (void) printf("Input nrows, ncols "); (void) scanf("%d %d",&nrows, &ncols); node = 0; type = 1; len = 4; for (me=0; me<(nrows*ncols); me++) { (void) printf(" me=%d row=%d col=%d map=%d\n",me, ROW(me),COL(me),MAP(ROW(me),COL(me))); } return 0; } ga-5-4/tcgmsg/tests/test3.c0000644000175000017500000004532212662210372013673 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MALLOC_H # include #endif #if HAVE_MEMORY_H # include #endif #if HAVE_UNISTD_H # include #elif HAVE_WINDOWS_H # include # define sleep(x) Sleep(1000*(x)) #endif #define MAXLENG 256*1024 #define N_LEN 11 #include "typesf2c.h" #include #include extern unsigned char CheckByte(); extern void Error(const char *, Integer); /** * Process 0 sleeps for 20 seconds and then sends each * process a message. The other processes sleep for periods * of 2 seconds and probes until it gets a message. All processes * respond to process 0 which recieves using a wildcard probe. */ static void TestProbe() { long type_syn = 32; long type_msg = 33; long type_ack = 34; long me = tcg_nodeid(); char buf; long lenbuf = sizeof buf; long sync = 1; if (me == 0) { (void) printf("Probe test ... processes should sleep for 20s only\n"); (void) printf("----------\n\n"); (void) fflush(stdout); } tcg_synch(type_syn); if (me == 0) { long nproc = tcg_nnodes(); long anyone = -1; long ngot = 0; long node; (void) sleep((unsigned) 20); for (node=1; node hi) { ran = hi; } list[i] = ran; } } /** * Stress the system by passing messages between a ranomly selected * list of nodes */ void Stress() { long me = tcg_nodeid(); long nproc = tcg_nnodes(); long type, lenbuf, node, lenmes, nodefrom, i, j, from, to; long *list_i, *list_j, *list_n; static long len[N_LEN] = {0,1,2,4,8,4095,4096,4097,16367,16368,16369}; char *buf1, *buf2; long n_stress, mod; long sync = 1; from = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Stress test ... randomly exchange messages\n---------"); (void) printf("\n\nInput no. of messages: "); (void) fflush(stdout); if (scanf("%ld",&n_stress) != 1) { Error("Stress: error reading n_stress",(long) -1); } if ( (n_stress <= 0) || (n_stress > 100000) ) { n_stress = 100; } } type = 13 | MSGINT; tcg_brdcst(type, (void *) &n_stress, lenbuf, from); type++; lenbuf = n_stress * sizeof(long); #if HAVE_MEMALIGN list_i = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_i = (long *) malloc((unsigned) lenbuf); #endif if ( list_i == (long *) NULL ) { Error("Stress: failed to allocate list_i",n_stress); } #if HAVE_MEMALIGN list_j = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_j = (long *) malloc((unsigned) lenbuf); #endif if ( list_j == (long *) NULL ) { Error("Stress: failed to allocate list_j",n_stress); } #if HAVE_MEMALIGN list_n = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_n = (long *) malloc((unsigned) lenbuf); #endif if ( list_n == (long *) NULL ) { Error("Stress: failed to allocate list_n",n_stress); } if ( (buf1 = malloc((unsigned) 16376)) == (char *) NULL ) { Error("Stress: failed to allocate buf1", (long) 16376); } if ( (buf2 = malloc((unsigned) 16376)) == (char *) NULL ) { Error("Stress: failed to allocate buf2", (long) 16376); } if (me == 0) { /* Make random list of node pairs and message lengths */ RandList((long) 0, (long) (tcg_nnodes()-1), list_i, n_stress); RandList((long) 0, (long) (tcg_nnodes()-1), list_j, n_stress); RandList((long) 0, (long) (N_LEN-1), list_n, n_stress); for (i=0; i= nproc) ) { Error("Stress: from is out of range", from); } if ( (to < 0) || (to >= nproc) ) { Error("Stress: to is out of range", to); } if (from == to) { continue; } if ( (me == 0) && (j%mod == 0) ) { (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n", i, from, to, lenbuf); (void) fflush(stdout); } j++; if (from == me) { tcg_snd(type, buf1, lenbuf, to, sync); } else if (to == me) { (void) bzero(buf2, (int) lenbuf); /* Initialize the rcv buffer */ buf2[lenbuf] = '+'; tcg_rcv(type, buf2, lenbuf, &lenmes, from, &nodefrom, sync); if (buf2[lenbuf] != '+') { Error("Stress: overran buffer on receive",lenbuf); } if (CheckByte((unsigned char *) buf1, lenbuf) != CheckByte((unsigned char *) buf2, lenbuf)) { Error("Stress: invalid checksum on receive",lenbuf); } if (lenmes != lenbuf) { Error("Stress: invalid message length on receive",lenbuf); } } } (void) free(buf2); (void) free(buf1); (void) free((char *) list_n); (void) free((char *) list_j); (void) free((char *) list_i); } /** Time passing a message round a ring */ void RingTest() { long me = tcg_nodeid(); long type = 4; long left = (me + tcg_nnodes() - 1) % tcg_nnodes(); long right = (me + 1) % tcg_nnodes(); char *buf=NULL, *buf2=NULL; unsigned char sum, sum2; long lenbuf, lenmes, nodefrom; double start, used, rate; long max_len; long i; long sync = 1; i = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Ring test ... time network performance\n---------\n\n"); (void) printf("Input maximum message size: "); (void) fflush(stdout); if (scanf("%ld", &max_len) != 1) { Error("RingTest: error reading max_len",(long) -1); } if ( (max_len <= 0) || (max_len >= 4*1024*1024) ) { max_len = 256*1024; } } type = 4 | MSGINT; tcg_brdcst(type, (void *) &max_len, lenbuf, i); if ( (buf = malloc((unsigned) max_len)) == (char *) NULL) { Error("failed to allocate buf",max_len); } if (me == 0) { if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL) { Error("failed to allocate buf2",max_len); } for (i=0; i 0) { rate = 1.0e-6 * (double) (tcg_nnodes() * lenbuf) / (double) used; } else { rate = 0.0; } rate = rate * nloops; printf("len=%ld bytes, nloop=%d, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n", lenbuf, nloops, used, rate, sum, sum2); (void) fflush(stdout); } else { while (loop--) { tcg_rcv(type, buf, lenbuf, &lenmes, right, &nodefrom, sync); tcg_snd(type, buf, lenbuf, left, sync); } } lenbuf *= 2; } if (me == 0) { (void) free(buf2); } (void) free(buf); } /** Test receiveing a message from any node */ void RcvAnyTest() { long me = tcg_nodeid(); long type = 337 | MSGINT; char buf[8]; long i, j, node, lenbuf, lenmes, nodefrom, receiver, n_msg; long sync = 1; lenbuf = sizeof(long); if (me == 0) { (void) printf("RCV any test ... check is working!\n-----------\n\n"); (void) printf("Input node to receive : "); (void) fflush(stdout); if (scanf("%ld", &receiver) != 1) { Error("RcvAnyTest: error reading receiver",(long) -1); } if ( (receiver < 0) || (receiver >= tcg_nnodes()) ) { receiver = tcg_nnodes()-1; } (void) printf("Input number of messages : "); (void) fflush(stdout); if (scanf("%ld", &n_msg) != 1) { Error("RcvAnyTest: error reading n_msg",(long) -1); } if ( (n_msg <= 0) || (n_msg > 10) ) { n_msg = 5; } } node = 0; tcg_brdcst(type, (void *) &receiver, lenbuf, node); type++; tcg_brdcst(type, (void *) &n_msg, lenbuf, node); type++; lenbuf = 0; type = 321; for (i=0; i= 10000) ) { n_val = 100; } } node = 0; tcg_brdcst(type, (void *) &n_val, lenbuf, node); /* Loop thru a few values to visually show it is working */ next = -1; for (i=0; i<10; i++) { if (i > next) { next = tcg_nxtval(nproc); } sleep(1); if (i == next) { (void) printf("node %ld got value %ld\n", me, i); (void) fflush(stdout); } } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; /* Now time it for real .. twice*/ for (ntimes=0; ntimes<2; ntimes++) { if (me == 0) { start = tcg_time(); } next = -1; ngot = 0; for (i=0; i next) { next = tcg_nxtval(nproc); } if (i == next) { ngot++; } } nproc = -nproc; next = tcg_nxtval(nproc); nproc = -nproc; if (me == 0) { used = tcg_time() - start; rate = ngot ? used / ngot: 0.; printf("node 0: From %ld busy iters did %ld, used=%lfs per call\n", n_val, ngot, rate); fflush(stdout); } type++; tcg_synch(type); } } void ToggleDebug() { static long on = 0; long me = tcg_nodeid(); long type = 666 | MSGINT; long lenbuf = sizeof(long); long from=0; long node; if (me == 0) { (void) printf("\nInput node to debug (-1 = all) : "); (void) fflush(stdout); if (scanf("%ld", &node) != 1) { Error("ToggleDebug: error reading node",(long) -1); } } tcg_brdcst(type, (void *) &node, lenbuf, from); if ((node < 0) || (node == me)) { on = (on + 1)%2; tcg_setdbg(on); } } int main(int argc, char **argv) { long type; long lenbuf; long node, opt; tcg_alt_pbegin(&argc, &argv); (void) printf("In process %ld\n", tcg_nodeid()); (void) fflush(stdout); /* Read user input for action */ lenbuf = sizeof(long); node = 0; while (1) { (void) fflush(stdout); if (tcg_nodeid() == 0) { (void) sleep(1); } type = 999; tcg_synch(type); (void) sleep(1); if (tcg_nodeid() == 0) { again: (void) printf("\n\ 0=quit\n\ 1=Ring 5=NxtVal\n\ 2=Stress 6=Global\n\ 3=Hello 7=Debug\n\ 4=RcvAny 8=Probe\n\n\ Enter test number : "); (void) fflush(stdout); if (scanf("%ld", &opt) != 1) { Error("test: input of option failed",(long) -1); } (void) printf("\n"); (void) fflush(stdout); if ( (opt < 0) || (opt > 8) ) { goto again; } } type = 2 | MSGINT; tcg_brdcst(type, (void *) &opt, lenbuf, node); switch (opt) { case 0: if (tcg_nodeid() == 0) { tcg_stats(); } tcg_pend(); return 0; case 1: RingTest(); break; case 2: Stress(); break; case 3: Hello(); break; case 4: RcvAnyTest(); break; case 5: NextValueTest(); break; case 6: TestGlobals(); break; case 7: ToggleDebug(); break; case 8: TestProbe(); break; default: Error("test: invalid option", opt); break; } } } ga-5-4/tcgmsg/tests/hpuxargs.f0000644000175000017500000000044312662210372014470 0ustar mbambac c $Header: /tmp/hpctools/ga/tcgmsg-mpi/hpuxargs.f,v 1.2 1999-06-08 21:08:29 d3h325 Exp $ c integer function hpargc() hpargc = iargc() + 1 end integer function hpargv(index, arg, maxlen) character*256 arg hpargv = igetarg(index,arg,maxlen) end ga-5-4/tcgmsg/tests/testpf.f0000644000175000017500000000042012662210372014127 0ustar mbambac $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/testpf.f,v 1.3 1995-02-24 02:18:01 d3h325 Exp $ character*60 fname call pbeginf fname = ' ' write(fname,'(a,i3.3)') '/tmp/pfcopy.test',nodeid() call pfcopy(5, 0, fname) call pend end ga-5-4/tcgmsg/tests/waitcom.f0000644000175000017500000000204512662210372014272 0ustar mbamba program main implicit none integer maxloop parameter (maxloop = 67 ) integer buf,me,nproc,loop,lenmes,node, received integer nnodes, nodeid c call pbeginf c nproc = nnodes() me = nodeid() if(nproc.lt.3)then print *,'min 3 processes required ',nproc call parerr(0) endif received =0 do loop = 1, maxloop node = Mod(loop,2)+1 if(me.eq.0) then call snd(loop, buf, 1, node, 0) endif if(me.eq.node) then received = received +1 call rcv(loop, buf, 1, lenmes, 0, node, 1) endif enddo if(me.eq.0)print *,'0: waiting for coms to node 1 to complete' call waitcom(1) if(me.eq.0)print *,'0: waiting for remaining coms to complete' call waitcom(-1) if(me.eq.0) then print *,'node=',me, maxloop,' messages sent asynchronously' else print *, 'node=',me, received,' messages received' endif c call pend end ga-5-4/tcgmsg/tests/test_arcv.f0000644000175000017500000000153712662210372014626 0ustar mbamba program async integer nodeid, nnodes integer me, proc integer req, ack, len,node, to c call pbeginf proc = nnodes() me = nodeid() print *,'proc=',proc,' node=',me if(proc.lt.2) then call pend() return endif c call setdbg(1) if(me.eq.0)then print *, 'Checking non-blocking receive' call rcv(33, req,1, len, 1, node, 1) !blocking print *, 'received request ',me call snd(34, ack,1, 1, 1) endif c if(me.eq.1)then call rcv(34, ack, 1, len, 0, node, 0)!nonblocking print *,'after nonblocking receive =',me call snd(33, req,1, 0, 0) print *,'after nonblocking send =',me call waitcom(0) print *, 'OK' endif call pend() end ga-5-4/tcgmsg/tests/testargf.f0000644000175000017500000000017312662210372014446 0ustar mbambac $Header: /tmp/hpctools/ga/tcgmsg/ipcv4.0/testargf.f,v 1.4 1995-02-24 02:17:59 d3h325 Exp $ call parg end ga-5-4/tcgmsg/tests/hello2.c0000644000175000017500000000047512662210372014016 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "tcgmsg.h" /** * Traditional first parallel program */ int main(int argc, char **argv) { tcg_pbegin(argc, argv); (void) printf("Hello from node %ld\n",tcg_nodeid()); tcg_pend(); return 0; } ga-5-4/tcgmsg/tests/xdrtest.c0000644000175000017500000000405112662210372014320 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H #include #endif #if HAVE_RPC_TYPES_H #include #endif #if HAVE_RPC_XDR_H #include #endif #if HAVE_STRING_H #include #endif static char *xdrbuf; static XDR xdrs; int main(int argc, char **argv) { long data[4]; u_int len; long *temp=data; if (argc != 2) { return 1; } xdrbuf = malloc(4096); if (strcmp(argv[1], "encode") == 0) { xdrmem_create(&xdrs, xdrbuf, 4096, XDR_ENCODE); (void) fprintf(stderr," encode xdr_setpos=%d\n", xdr_setpos(&xdrs, (u_int) 0)); (void) scanf("%ld %ld %ld %ld", data, data+1, data+2, data+3); (void) fprintf(stderr,"encode Input longs %ld, %ld, %ld, %ld\n", data[0], data[1], data[2], data[3]); len = 4; (void) fprintf(stderr,"encode xdr_array=%d\n", xdr_array(&xdrs, (char **) &temp, &len, (u_int) 4096, (u_int) sizeof(long), (xdrproc_t)xdr_long)); len = 4*4 + 4; (void) fprintf(stderr,"encode len=%lu\n", (long unsigned)len); (void) fwrite(&len, 4, 1, stdout); (void) fwrite(xdrbuf, 1, len, stdout); (void) fprintf(stderr,"encode data written\n"); return 0; } else { xdrmem_create(&xdrs, xdrbuf, 4096, XDR_DECODE); (void) fprintf(stderr," decode xdr_setpos=%d\n", xdr_setpos(&xdrs, (u_int) 0)); (void) fread(&len, 4, 1, stdin); (void) fprintf(stderr,"decode len=%lu\n", (long unsigned)len); (void) fread(xdrbuf, 1, len, stdin); (void) fprintf(stderr,"decode data read\n"); (void) fprintf(stderr,"decode xdr_array=%d\n", xdr_array(&xdrs, (char **) &temp, &len, (u_int) 4096, (u_int) sizeof(long), (xdrproc_t)xdr_long)); (void) fprintf(stderr,"decode Input longs %ld, %ld, %ld, %ld\n", data[0], data[1], data[2], data[3]); return 0; } } ga-5-4/tcgmsg/tests/fexit.f0000644000175000017500000000004112662210372013740 0ustar mbamba subroutine fexit end ga-5-4/tcgmsg/tests/test.isend.c0000644000175000017500000004753212662210372014716 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* $Header: /tmp/hpctools/ga/tcgmsg/ipcv5.0/test.isend.c,v 1.2 1994-12-30 20:56:23 d3h325 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_MEMORY_H # include #endif #include "evlog.h" #include "tcgmsg.h" extern unsigned char CheckByte(); /** * Process 0 sleeps for 20 seconds and then sends each * process a message. The other processes sleep for periods * of 2 seconds and probes until it gets a message. All processes * respond to process 0 which recieves using a wildcard probe. */ static void TestProbe() { long type_syn = 32; long type_msg = 33; long type_ack = 34; long me = NODEID_(); char buf; long lenbuf = sizeof buf; long sync = 1; if (me == 0) { (void) printf("Probe test ... processes should sleep for 20s only\n"); (void) printf("----------\n\n"); (void) fflush(stdout); } SYNCH_(&type_syn); if (me == 0) { long nproc = NNODES_(); long anyone = -1; long ngot = 0; long node; (void) sleep((unsigned) 20); for (node=1; node hi) ran = hi; list[i] = ran; } } /** * Stress the system by passing messages between a ranomly selected * list of nodes */ void Stress() { long me = NODEID_(); long nproc = NNODES_(); long type, lenbuf, node, lenmes, nodefrom, i, j, from, to; long *list_i, *list_j, *list_n; #define N_LEN 11 static long len[N_LEN] = {0,1,2,4,8,4095,4096,4097,16367,16368,16369}; char *buf1, *buf2; long n_stress, mod; long sync = 1; from = 0; lenbuf = sizeof(long); if (me == 0) { (void) printf("Stress test ... randomly exchange messages\n-----------"); (void) printf("\n\nInput no. of messages: "); (void) fflush(stdout); if (scanf("%ld",&n_stress) != 1) Error("Stress: error reading n_stress",(long) -1); if ( (n_stress <= 0) || (n_stress > 100000) ) n_stress = 100; } type = 13 | MSGINT; BRDCST_(&type, (char *) &n_stress, &lenbuf, &from); type++; lenbuf = n_stress * sizeof(long); #if HAVE_MEMALIGN list_i = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_i = (long *) malloc((unsigned) lenbuf); #endif if ( list_i == (long *) NULL ) { Error("Stress: failed to allocate list_i",n_stress); } #if HAVE_MEMALIGN list_j = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_j = (long *) malloc((unsigned) lenbuf); #endif if ( list_j == (long *) NULL ) { Error("Stress: failed to allocate list_j",n_stress); } #if HAVE_MEMALIGN list_n = (long *) memalign(sizeof(long), (unsigned) lenbuf); #else list_n = (long *) malloc((unsigned) lenbuf); #endif if ( list_n == (long *) NULL ) { Error("Stress: failed to allocate list_n",n_stress); } if ( (buf1 = malloc((unsigned) 16376)) == (char *) NULL ) Error("Stress: failed to allocate buf1", (long) 16376); if ( (buf2 = malloc((unsigned) 16376)) == (char *) NULL ) Error("Stress: failed to allocate buf2", (long) 16376); if (me == 0) { /* Make random list of node pairs and message lengths */ RandList((long) 0, (long) (NNODES_()-1), list_i, n_stress); RandList((long) 0, (long) (NNODES_()-1), list_j, n_stress); RandList((long) 0, (long) (N_LEN-1), list_n, n_stress); for (i=0; i= nproc) ) Error("Stress: from is out of range", from); if ( (to < 0) || (to >= nproc) ) Error("Stress: to is out of range", to); if (from == to) continue; if ( (me == 0) && (j%mod == 0) ) { (void) printf("Stress: test=%ld: from=%ld, to=%ld, len=%ld\n", i, from, to, lenbuf); (void) fflush(stdout); } j++; if (from == me) SND_(&type, buf1, &lenbuf, &to, &sync); else if (to == me) { (void) bzero(buf2, (int) lenbuf); /* Initialize the receive buffer */ buf2[lenbuf] = '+'; RCV_(&type, buf2, &lenbuf, &lenmes, &from, &nodefrom, &sync); if (buf2[lenbuf] != '+') Error("Stress: overran buffer on receive",lenbuf); if (CheckByte((unsigned char *) buf1, lenbuf) != CheckByte((unsigned char *) buf2, lenbuf)) Error("Stress: invalid checksum on receive",lenbuf); if (lenmes != lenbuf) Error("Stress: invalid message length on receive",lenbuf); } } (void) free(buf2); (void) free(buf1); (void) free((char *) list_n); (void) free((char *) list_j); (void) free((char *) list_i); } void IsendTest() { #define N_ISEND_MSG 5 long me = NODEID_(); long type = 4; long left = (me + NNODES_() - 1) % NNODES_(); long right = (me + 1) % NNODES_(); char *source[N_ISEND_MSG], *dest[N_ISEND_MSG]; long lenbuf, lenmes, from; long sync = 1; long max_len; long ids[N_ISEND_MSG]; long i; if (me == 0) { (void) printf("Isend test ... test async. comms\n---------\n\n"); (void) printf("Input maximum message size: "); (void) fflush(stdout); if (scanf("%ld", &max_len) != 1) Error("IsendTest: error reading max_len", (long) -1); if ( (max_len <= 0) || (max_len >= 4*1024*1024) ) max_len = 256*1024; } type = 4 | MSGINT; lenbuf = sizeof(long); i = 0; BRDCST_(&type, (char *) &max_len, &lenbuf, &i); for (i=0; i= 4*1024*1024) ) max_len = 256*1024; } type = 4 | MSGINT; BRDCST_(&type, (char *) &max_len, &lenbuf, &i); if ( (buf = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf",max_len); if (me == 0) { if ( (buf2 = malloc((unsigned) max_len)) == (char *) NULL) Error("failed to allocate buf2",max_len); for (i=0; i 0) rate = 1.0e-6 * (double) (NNODES_() * lenbuf) / (double) used; else rate = 0.0; rate = rate * nloops; printf("len=%6ld bytes, nloop=%4ld, used=%8.4f s, rate=%8.4f Mb/s (0x%x, 0x%x)\n", lenbuf, nloops, used, rate, sum, sum2); (void) fflush(stdout); } else { while (loop--) { RCV_(&type, buf, &lenbuf, &lenmes, &right, &nodefrom, &sync); SND_(&type, buf, &lenbuf, &left, &sync); } } lenbuf *= 2; } if (me == 0) (void) free(buf2); (void) free(buf); } /** * Test receiveing a message from any node */ void RcvAnyTest() { long me = NODEID_(); long type = 337 | MSGINT; char buf[8]; long i, j, node, lenbuf, lenmes, nodefrom, receiver, n_msg; long sync = 1; lenbuf = sizeof(long); if (me == 0) { (void) printf("RCV any test ... check is working!\n-----------\n\n"); (void) printf("Input node to receive : "); (void) fflush(stdout); if (scanf("%ld", &receiver) != 1) Error("RcvAnyTest: error reading receiver",(long) -1); if ( (receiver < 0) || (receiver >= NNODES_()) ) receiver = NNODES_()-1; (void) printf("Input number of messages : "); (void) fflush(stdout); if (scanf("%ld", &n_msg) != 1) Error("RcvAnyTest: error reading n_msg",(long) -1); if ( (n_msg <= 0) || (n_msg > 10) ) n_msg = 5; } node = 0; BRDCST_(&type, (char *) &receiver, &lenbuf, &node); type++; BRDCST_(&type, (char *) &n_msg, &lenbuf, &node); type++; lenbuf = 0; type = 321; for (i=0; i= 10000) ) n_val = 100; } node = 0; BRDCST_(&type, (char *) &n_val, &lenbuf, &node); /* Loop thru a few values to visually show it is working */ next = -1; for (i=0; i<10; i++) { if (i > next) next = NXTVAL_(&nproc); if (i == next) { (void) printf("node %ld got value %ld\n",me, i); (void) fflush(stdout); } } nproc = -nproc; next = NXTVAL_(&nproc); nproc = -nproc; /* Now time it for real .. twice*/ for (ntimes=0; ntimes<2; ntimes++) { if (me == 0) start = TCGTIME_(); next = -1; ngot = 0; for (i=0; i next) next = NXTVAL_(&nproc); if (i == next) ngot++; } nproc = -nproc; next = NXTVAL_(&nproc); nproc = -nproc; if (me == 0) { used = TCGTIME_() - start; if(ngot){ rate = used / ngot; (void) printf("node 0: From %ld busy iters did %ld, used=%fs per call\n", n_val, ngot, rate); }else printf("node 0: From %ld busy iters did 0\n",n_val); (void) fflush(stdout); } type++; SYNCH_(&type); } } void ToggleDebug() { static long on = 0; long me = NODEID_(); long type = 666 | MSGINT; long lenbuf = sizeof(long); long from=0; long node; if (me == 0) { (void) printf("\nInput node to debug (-1 = all) : "); (void) fflush(stdout); if (scanf("%ld", &node) != 1) Error("ToggleDebug: error reading node",(long) -1); } BRDCST_(&type, (char *) &node, &lenbuf, &from); if ((node < 0) || (node == me)) { on = (on + 1)%2; SETDBG_(&on); } } int main(int argc, char **argv) { long type; long lenbuf; long node, opt; tcg_pbegin(argc, argv); (void) printf("In process %ld\n", NODEID_()); (void) fflush(stdout); /* Read user input for action */ lenbuf = sizeof(long); node = 0; while (1) { (void) fflush(stdout); if (NODEID_() == 0) (void) sleep(1); type = 999; SYNCH_(&type); (void) sleep(1); if (NODEID_() == 0) { again: (void) printf("\n\ 0=quit\n\ 1=Ring 5=NxtVal\n\ 2=Stress 6=Global\n\ 3=Hello 7=Debug\n\ 4=RcvAny 8=Probe\n\ 9=Isend\n\n\ Enter test number : "); (void) fflush(stdout); if (scanf("%ld", &opt) != 1) Error("test: input of option failed",(long) -1); (void) printf("\n"); (void) fflush(stdout); if ( (opt < 0) || (opt > 9) ) goto again; } type = 2 | MSGINT; BRDCST_(&type, (char *) &opt, &lenbuf, &node); switch (opt) { case 0: if (NODEID_() == 0) STATS_(); PEND_(); return 0; case 1: RingTest(); break; case 2: Stress(); break; case 3: Hello(); break; case 4: RcvAnyTest(); break; case 5: NextValueTest(); break; case 6: TestGlobals(); break; case 7: ToggleDebug(); break; case 8: TestProbe(); break; case 9: IsendTest(); break; default: Error("test: invalid option", opt); break; } } } ga-5-4/tcgmsg/tests/hello.c0000644000175000017500000000047612662210372013735 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "tcgmsg.h" /** * Traditional first parallel program. */ int main(int argc, char **argv) { tcg_pbegin(argc, argv); (void) printf("Hello from node %ld\n",tcg_nodeid()); tcg_pend(); return 0; } ga-5-4/tcgmsg/tests/testf.F0000644000175000017500000001120012662210372013705 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif program main implicit double precision (a-h,o-z) c c FORTRAN program to test message passing routines c c LOG is the FORTRAN unit number for standard output. c parameter (LOG = 6) parameter (MAXLEN = 262144 ) #include "msgtypesf.h" dimension buf(MAXLEN) integer ibuf(MAXLEN) character*80 fname integer dtype c c Always the first thing to do is call pbeginf c call pbeginf call setdbg(0) call evon c c who am i and how many processes c nproc = nnodes() me = nodeid() c c now try broadcasting messages from all nodes to every other node c send each process my id as a message c call evbgin('Hello test') itype = 1 + MSGINT do 10 iproc = 0,nproc-1 itest = me call brdcst(itype, itest, mitob(1),iproc) if (iproc.ne.me) then write(LOG,1) me, itest 1 format(' me=',i3,', itest=',i3) endif 10 continue call evend('Hello test') call evbgin('Counter test') c c now try using the shared counter c mproc = nproc do 20 i = 1,10 write(LOG,*) ' process ',me,' got ',nxtval(mproc) 20 continue junk = nxtval(-mproc) call evend('Counter test') c c now time sending a message round a ring c if (nproc.gt.1) then call evbgin('Ring test') itype = 3 left = mod(me + nproc - 1, nproc) iright = mod(me + 1, nproc) c lenbuf = 1 30 if (me .eq. 0) then start = tcgtime() call snd(itype, buf, lenbuf, left, 1) call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) used = tcgtime() - start if (used.gt.0d0) then rate = 1.0d-6 * dble(nproc * lenbuf) / used else rate = 0.0d0 endif write(LOG,31) lenbuf, used, rate else call rcv(itype, buf, lenbuf, lenmes, iright, node, 1) call snd(itype, buf, lenbuf, left, 1) endif lenbuf = lenbuf * 2 if (lenbuf .le. mdtob(MAXLEN)) goto 30 31 format(' len=',i7,' bytes, used=',f8.2,' cs, rate=',f10.6,' Mb/s') call evend('Ring test') endif c c global sums c do i=1,MAXLEN ibuf(i) = i*me buf(i) = dble(ibuf(i)) enddo dtype=1+MSGDBL call igop(itype, ibuf, MAXLEN, "+") call dgop(dtype, buf, MAXLEN, "+") do i=1,MAXLEN iresult = i*nproc*(nproc-1)/2 if (ibuf(i).ne.iresult.or.buf(i).ne.dble(iresult)) . call error('TestGlobals: global sum failed', i) enddo if (me.eq.0) write(LOG,*) 'global sums OK' c c c Check that everyone can open, write, read and close c a binary FORTRAN file c call pfname('junk',fname) open(9,file=fname,form='unformatted',status='unknown', & err=1000) write(9,err=1001) buf rewind 9 read(9,err=1002) buf close(9,status='delete') call event('Read file OK') c if (me.eq.0) call stats c c Always the last thing to do is call pend c call pend c c check that everyone makes it thru after pend .. NODEID c is not actually guaranteed to work outside of pbegin/pend c section ... it may return junk. All you should do is exit c is some FORTRAN supported fashion c write(LOG,32) nodeid() 32 format(' Process ',i4,' after pend') stop c c error returns for FORTRAN I/O c 1000 call error('failed to open fortran binary file',-1) 1001 call error('failed to write fortran binary file',-1) 1002 call error('failed to read fortran binary file',-1) c end subroutine pfname(name, fname) character*(*) name, fname c c construct a unique filename by appending the process c number after the stub name c i.e. = . c c find last non-blank character in name c do 10 i = len(name),1,-1 if (name(i:i).ne.' ') goto 20 10 continue call error('pfname: name is all blanks!',i) c c check that have room to store result and then write result c 20 if (i+4.gt.len(fname)) & call error('pfname: fname too short for name.id',len(fname)) fname = name write(fname(i+1:i+4),1) nodeid() 1 format('.',i3.3) c end subroutine error(s,i) parameter (LOG = 6) character*(*) s integer i c write(LOG,1) s,i 1 format(// $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/ $ 1x,a,1x,i8/ $ ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'/) c $ 1x,a,1x,i8/ c call parerr(i) c end ga-5-4/tcgmsg/tests/brdcst_delta.c0000644000175000017500000001064412662210372015262 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif #include "sndrcv.h" /* Given the col and row no. return the actual process no. */ #define MAP(Row,Col) (ncols*(Row) + (Col)) /* Given the node return the row no. */ #define ROW(Node) ((Node) / ncols) /* Given the node return the column no. */ #define COL(Node) ((Node) - ncols*((Node)/ncols)) static Integer ncols; static Integer nrows; /** * broadcast buffer to all other processes from process originator * ... all processes call this routine specifying the same * orginating process * * Modified for grid nrows * ncols. * * Always send message to process 0. Then proceed from there. * * Algorithm ... recursively bisect the grid horizontally * and then vertically * * Need to modify to include pipelining. * * 4 x 6 grid is numbered (nrows=4, ncols=6) * * 0 1 2 3 4 5 * 6 7 8 9 10 11 * 12 13 14 15 16 17 * 18 19 20 21 22 23 */ void brdcst_delta_(Integer *type, char *buf, Integer *lenbuf, Integer *originator) { Integer me = NODEID_(); Integer mycol = COL(me); Integer myrow = ROW(me); Integer sync = 1; Integer from, id, left, middle, right, lenmes; /* First try implementation ... always send data to process 0 */ if (*originator != 0) { if (me == 0) { (void) printf("a %d receiving from %d %d\n",me,*originator); (void) fflush(stdout); RCV_(type, buf, lenbuf, &lenmes, originator, &from, &sync); } else if (me == *originator) { id = 0; (void) printf("a %d sending to %d type %d\n",me,*originator,*type); (void) fflush(stdout); SND_(type, buf, lenbuf, &id, &sync); } } /* Now broadcast from process 0 */ /* Bisect aInteger top horizonal edge of mesh */ if (myrow == 0) { (void) printf("%d myrow == 0\n",NODEID_()); left = 0; right = ncols-1; while (left != right) { middle = (left + right + 1) / 2; if (mycol == left) { id = MAP((Integer) 0,middle); (void) printf("b %d sending to %d type %d\n",me,id,*type); (void) fflush(stdout); SND_(type, buf, lenbuf, &id, &sync); } else if (mycol == middle) { id = MAP((Integer) 0,left); (void) printf("b %d receiving from %d\n",me,id); (void) fflush(stdout); RCV_(type, buf, lenbuf, &lenmes, &id, &from, &sync); } if (mycol < middle) { right = middle-1; } else { left = middle; } } } /* Bisect down vertical columns of mesh */ left = 0; right = nrows-1; while (left != right) { middle = (left + right + 1) / 2; if (myrow == left) { id = MAP(middle,mycol); (void) printf("c %d sending to %d type %d\n",me,id,*type); (void) fflush(stdout); SND_(type, buf, lenbuf, &id, &sync); } else if (myrow == middle) { id = MAP(left,mycol); (void) printf("c %d receiving from %d %d\n",me,id); (void) fflush(stdout); RCV_(type, buf, lenbuf, &lenmes, &id, &from, &sync); } if (myrow < middle) { right = middle-1; } else { left = middle; } } (void) fflush(stdout); } int main(int argc, char **argv) { Integer row, col, node, data, type, len, me; pbegin(argc, argv); LLOG_(); if (NODEID_() == 0) { (void) printf("Input nrows, ncols "); (void) scanf("%d %d",&nrows, &ncols); } node = 0; type = 1; len = 4; BRDCST_(&type, &nrows, &len, &node); BRDCST_(&type, &ncols, &len, &node); me = NODEID_(); (void) printf(" me=%d row=%d col=%d map=%d\n",me, ROW(me),COL(me),MAP(ROW(me),COL(me))); /* SETDBG_(&type); */ for (node=0; node' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. ga-5-4/gfutex/examples/0000755000175000017500000000000012662210467013156 5ustar mbambaga-5-4/gfutex/examples/scf/0000755000175000017500000000000012662210467013731 5ustar mbambaga-5-4/gfutex/examples/scf/be.inpt.160000644000175000017500000000054412662210467015443 0ustar mbamba16 4 0.000 0.000 0.000 4 4.000 0.000 0.000 4 8.000 0.000 0.000 4 12.000 0.000 0.000 4 16.000 0.000 0.000 4 20.000 0.000 0.000 4 24.000 0.000 0.000 4 28.000 0.000 0.000 4 32.000 0.000 0.000 4 36.000 0.000 0.000 4 40.000 0.000 0.000 4 44.000 0.000 0.000 4 48.000 0.000 0.000 4 52.000 0.000 0.000 4 56.000 0.000 0.000 4 60.000 0.000 0.000 ga-5-4/gfutex/examples/scf/scf.c0000644000175000017500000011374512662210467014663 0ustar mbamba/* C version of the GA SCF code */ #include #include #include #include #include #include #include "cscc.h" #include "integ.h" #include "input.h" #include "output.h" #include "oneel.h" #include "twoel.h" #include "scf.h" #include "timer.h" // #include "global.h" // #include "tcgmsg.h" #include "sum.h" //function declaration void makesz(double* schwmax); void ininrm(void); double s(int i,int j); void makden(void); int nxtask(int nproc); int verify_zero_chunk(double chunk[][ichunk]); void damp(double* fac); void prnout(int iter, double energy, double deltad, double tester); double dendif(void); double testfock(void); void shiftfock(double shift); void prnfin(double energy); void diagon(double* tester, int iter); void makeob(void); void denges(void); void setarrays(void); void closearrays(void); void makoverlap(void); void setoverlap(double *a,int* lo,int* hi, int ld1,int ld2); void print_GA_block(int g_a); void print_GA_block_ij(int g_a,int tlo); void dump_chunk(double *a,int ld1,int ld2); // double abs_double(double x); #ifdef CLOG FILE *clog = NULL; #endif double enrep, q[maxatom], ax[maxatom], ay[maxatom], az[maxatom], x[maxnbfn], y[maxnbfn], z[maxnbfn], expnt[maxnbfn], rnorm[maxnbfn]; long long int iky[maxnbfn], nocc, nbfn, nnbfn; long long int icut1,icut2,icut3,icut4; int natom; //long long int --> long double eigv[maxnbfn]; int g_counter, g_dens, g_fock, g_tfock, g_schwarz, g_work, g_ident, g_orbs; int g_tmp, g_proc; //temporay global array for storage major transformation int main(int argc, char **argv) { long long int nints, maxint; // CAUTION: int precision requirements; // nints, maxint, etc. are proportional to the number of basis functions; // to the fourth power! 216^4 is greater than the largest number; // that can be represented as a 32-bit signed interger, so 64-bit; // arithmetic is needed to count integrals when calculating more than; // 14 Be atoms with 15 basis functions each. Since integrals are counted; // over all iterations, 18 iterations with 7 atoms can result in precision; // problems. Note that the wave function could be calculated correctly; // for much larger basis sets without 64-bit ints because the required; // indexing is usually proportional to nbfn^2, which is good to 46,340; // basis functions, except that the task counter runs as (nbfn/ichunk)^4,; // so with ichunk = 10, 32-bit ints yield correct wavefunctions out to; // 2145 basis functions (maxatom=143), or 4290 (maxatom=286) with ichunk =; // 20, ...; //; // This warning applies to the Global Arrays implementation as well!; // functions of special concern are GA_igop and NGA_Read_inc.; //; #define USE_TRANSFORM 1 #define MSG_COMMS_MPI 1 int heap, stack; double tinit=0.0, tonel=0.0, ttwoel=0.0, tdiag=0.0, tdens=0.0, tprint=0.0; double eone=0.0, etwo=0.0, energy=0.0, deltad=0.0; //implicit variables in fortran int me; double frac; int iter; double scale; int nproc = 0; double rjunk; double totsec, tester; double schwmax; #ifdef CLOG char fname[50]; #endif // initalize the parallel message passing environment; #ifdef MSG_COMMS_MPI MPI_Init(&argc,&argv); #else //pbeginf(); tcg_pbeginf(); #endif GA_Initialize(); // Allocate memory; heap = 32000000; stack = 64000000; if (!MA_init(MT_DBL, stack, heap)) GA_Error("ma_init failed",-1); #if 1 GFInitialize(); #endif me = GA_Nodeid(); nproc = GA_Nnodes(); // initialize a bunch of stuff and initial density matrix; rjunk = timer(); #ifdef CLOG sprintf(fname, "clog.dat.%d", me); clog = fopen(fname, "w"); #endif // get input from file be.inpt; input(); // create and allocate global arrays; setarrays(); if (me == 0) { printf(" bytes of memory used by node 0: %lld\n\n", GA_Inquire_memory()); } ininrm(); // create initial guess for density matrix by using single atom; // densities; denges(); #if 1 GA_Print_distribution(g_schwarz); GA_Print_distribution(g_dens); #endif #if USE_TRANSFORM // make initial orthogonal orbital set for solution method using; // similarity transform; makeob(); #endif // make info for sparsity test; makesz(&schwmax); tinit = timer(); // print preliminary data before any long compute segments start; if (me == 0) printf("\n"); // ^* iterate ^*; for (iter = 0; iter < mxiter; iter++) { double s; // make the one particle contribution to the fock matrix; // and get the partial contribution to the energy; oneel(schwmax, &eone, nproc); tonel = tonel + timer(); #if 0 s = sum(g_fock); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_fock sum after oneel: %f\n", s); s = sum(g_orbs); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_orbs sum after oneel: %f\n", s); #endif // compute the two particle contributions to the fock matrix and; // get the total energy.; twoel(schwmax, &etwo, nproc); ttwoel = ttwoel + timer(); #if 0 s = sum(g_fock); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_fock sum after twoel: %f\n", s); #endif // Diagonalize the fock matrix. The diagonalizers used in this; // are actually sequential, not parallel.; diagon(&tester, iter); tdiag = tdiag + timer(); #if 0 s = sum(g_fock); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_fock sum after diagon: %f\n", s); s = sum(g_orbs); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_orbs sum after diagon: %f\n", s); #endif // make the new density matrix in g_work from orbitals in g_orbs,; // compute the norm of the change in the density matrix and; // then update the density matrix in g_dens with damping.; makden(); deltad = dendif(); if (iter == 0) scale = 0.00; else if (iter < 5) { if (nbfn > 60) scale = 0.50; else scale = 0.00; } else scale = 0.00; damp(&scale); tdens = tdens + timer(); // add up energy and print out convergence information; if (me == 0) { energy = enrep + eone + etwo; prnout(iter, energy, deltad, tester); tprint = tprint + timer(); } // if converged exit iteration loop; if (deltad < tol) goto L20; #if GA_VERSION_MAJOR >= 5 GA_Llgop(&icut4, 1, "+"); #else GA_Igop(&icut4, 1, "+"); #endif if(icut4 == 0) { // something has gone wrong--print what you know and quit.; printf("no two-electron integrals computed!\n"); goto L20; } } iter = iter - 1; if(me == 0) printf("SCF failed to converge in %d iters\n", iter); //...v....1....v....2....v....3....v....4....v....5....v....6....v....7..; //; // finished ... print out eigenvalues and occupied orbitals; //; L20: #if GA_VERSION_MAJOR >= 5 GA_Llgop(&icut1, 1, (char*) "+"); GA_Llgop(&icut2, 1, (char*) "+"); GA_Llgop(&icut3, 1, (char*) "+"); #else GA_Igop(&icut1, 1, (char*) "+"); GA_Igop(&icut2, 1, (char*) "+"); GA_Igop(&icut3, 1, (char*) "+"); #endif if (me == 0) { // print out timing information; prnfin(energy); printf(" init onel twoel diag dens print ncpu \n"); printf(" ---- ---- ----- ---- ---- ---- ---- \n"); totsec = tinit + tonel + ttwoel + tdiag + tdens + tprint; printf("%10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %d",tinit, tonel, ttwoel, tdiag, tdens,tprint,nproc); printf("\n elapsed time in seconds %10.2f\n\n",totsec); // print out information on # integrals evaluated each iteration; nints = icut1 + icut2 + icut3; frac = (double)icut3 / (double)nints; printf("No. of integrals screened or computed (all iters) \n\n"); printf("-------------------------------------\n"); printf(" failed #ij test failed #kl test #compute #total fraction\n"); printf(" ---------- ---------------- ------------- ------ --------\n"); printf("%15lld %15lld %15lld %15lld %9.6f\n", icut1, icut2, icut3, nints, frac); maxint = nbfn; maxint = pow(maxint, 4) * (iter + 1); if(nints != maxint) { printf("Inconsistent number of integrals, should be %ld\n", maxint); printf("Note: largest 32-bit int is 2,147,483,647\n"); printf("Probably due to insufficient int precision in GA.\n"); } #ifndef MSG_COMMS_MPI tcg_stats(); #endif } closearrays(); #ifdef CLOG fprintf(stderr, "Before GFFinalize()\n"); fflush(stderr); #endif #ifdef CLOG fclose(clog); #endif #if 1 GFFinalize(); #endif #ifdef CLOG fprintf(stderr, "After GFFinalize()\n"); fflush(stderr); #endif GA_Terminate(); #ifdef CLOG fprintf(stderr, "After GA_Terminate()\n"); fflush(stderr); #endif #ifdef MSG_COMMS_MPI MPI_Finalize(); #else tcg_pend(); #endif } void makesz(double *schwmax) { double work[ichunk][ichunk]; int lo[2],hi[2],i,j,iloc,jloc,ld; int dotask; int lo_c[2],hi_c[2]; //column-major inter-patch switch //implicit declared variable in fortran double gg; //schwarz(ij) = (ij|ij) for sparsity test; icut1 = 0; icut2 = 0; icut3 = 0; GA_Zero(g_schwarz); GA_Zero(g_counter); *schwmax = 0.00; dotask = next_chunk(lo, hi); ld = ichunk; while (dotask) { for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; g(&gg, i, j, i, j); work[iloc][jloc] = sqrt(gg); //work[jloc][iloc] = sqrt(gg); *schwmax = MAX((*schwmax), work[iloc][jloc]); // *schwmax = MAX((*schwmax), work[jloc][iloc]); } } // lo_c[0]=lo[1]; // lo_c[1]=lo[0]; // hi_c[0]=hi[1]; // hi_c[1]=hi[0]; NGA_Put(g_schwarz, lo, hi, work, &ld); // NGA_Put(g_schwarz,lo_c,hi_c,work,&ld); //column-major inter-patch switch dotask = next_chunk(lo, hi); } GA_Dgop(schwmax, 1, "max"); return; } void ininrm(void) { long long int maxint; //implicit declared variables in fortran int i; // write a little welcome message; maxint = nbfn; maxint = pow(maxint, 4); if (GA_Nodeid()==0) { printf(" Example Direct Self Consistent Field Program \n"); printf(" -------------------------------------------- \n\n"); printf(" no. of atoms .............. %5d\n", natom); printf(" no. of occupied orbitals .. %5ld\n", nocc); printf(" no. of basis functions .... %5ld\n", nbfn); printf(" basis functions^4 ......... %5ld\n", maxint); printf(" convergence threshold ..... %9.4f\n", tol); printf(" chunk size .................%5d\n", ichunk); } // generate normalisation coefficients for the basis functions; // and the index array iky; for (i = 0; i < nbfn; i++) { //iky[i] = i*(i-1)/2; iky[i] = (i + 1) * i / 2; } for (i = 0;i < nbfn;i++) { rnorm[i] = pow((expnt[i] * 2.00 / pi), 0.750); } // initialize common for computing f0; setfm(); } double h(int i,int j) { //vd$r novector; //vd$r noconcur; // generate the one particle hamiltonian matrix element; // over the normalized primitive 1s functions i and j; double ret; //implicit declared variables in fortran double f0val = 0.00; double sum = 0.00; double facij,expij,repij; int iat; //long iat; double xp,yp,zp,rpc2; double rab2; rab2 = (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) + (z[i]-z[j])*(z[i]-z[j]); facij = expnt[i]*expnt[j]/(expnt[i]+expnt[j]); expij = exprjh(-facij*rab2); repij = (2.00*pi/(expnt[i]+expnt[j])) * expij; // first do the nuclear attraction integrals; for (iat = 0;iat < natom;iat++) { xp = (x[i]*expnt[i] + x[j]*expnt[j])/(expnt[i]+expnt[j]); yp = (y[i]*expnt[i] + y[j]*expnt[j])/(expnt[i]+expnt[j]); zp = (z[i]*expnt[i] + z[j]*expnt[j])/(expnt[i]+expnt[j]); rpc2 = (xp-ax[iat])*(xp-ax[iat]) + (yp-ay[iat])*(yp-ay[iat]) + (zp-az[iat])*(zp-az[iat]); //; f0(&f0val, (expnt[i]+expnt[j])*rpc2); sum = sum - repij * q[iat] * f0val; } // add on the kinetic energy term; sum = sum + facij*(3.00-2.00*facij*rab2) * pow((pi/(expnt[i]+expnt[j])),1.50) * expij; // finally multiply by the normalization constants; ret = sum * rnorm[i] * rnorm[j]; return ret; } double s(int i, int j) { // generate the overlap matrix element between the normalized; // primitve gaussian 1s functions i and j; double ret; //implicit declared variables in fortran double rab2, facij; rab2 = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j]); facij = expnt[i] * expnt[j] / (expnt[i] + expnt[j]); ret = pow((pi / (expnt[i] + expnt[j])), 1.50) * exprjh(-facij * rab2) * rnorm[i] * rnorm[j]; return ret; } void makden(void) { double work[ichunk][ichunk], orbsi[maxnbfn][ichunk]; //maxnbfn double orbsj[maxnbfn][ichunk]; //maxnbfn int lo[2], hi[2], tlo[2], thi[2], i, j, iloc, jloc, ld; int dotask; //implicit declared variables in fortran double p; int k; //transform between column-major row-major // double a[ichunk][ichunk], b[ichunk][ichunk]; // int lo_c[2],hi_c[2]; // generate density matrix from orbitals in g_orbs. the first; // nocc orbitals are doubly occupied.; // GA_Zero(g_counter); // dotask = next_chunk(lo, hi); ld = ichunk; //transform g_orbs from column-major to row-major /* while (dotask) { */ /* NGA_Get(g_orbs, lo, hi, a, &ld); */ /* for (j = 0; j <= hi[1] - lo[1]; j++) { */ /* for (i = 0; i <= hi[0] - lo[0]; i++) { */ /* b[j][i] = a[i][j]; //intra-patch transfrom */ /* } */ /* } */ /* lo_c[0] = lo[1]; //inter-patch transform */ /* lo_c[1] = lo[0]; */ /* hi_c[0] = hi[1]; */ /* hi_c[1] = hi[0]; */ /* NGA_Put(g_tmp, lo_c, hi_c, b, &ld); */ /* dotask = next_chunk(lo, hi); */ /* } */ /* GA_Copy(g_tmp, g_orbs); */ // GA_Transpose(g_orbs, g_tmp); // GA_Copy(g_tmp, g_orbs); GA_Zero(g_counter); dotask = next_chunk(lo, hi); while (dotask) { ld = ichunk; tlo[0] = 0; thi[0] = nocc - 1; tlo[1] = lo[0]; thi[1] = hi[0]; NGA_Get(g_orbs, tlo, thi, orbsi, &ld); tlo[1] = lo[1]; thi[1] = hi[1]; NGA_Get(g_orbs, tlo, thi, orbsj, &ld); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0];// + 1; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1];// + 1; p = 0.0; for (k = 0; k < nocc; k++) { p = p + orbsi[k][iloc] * orbsj[k][jloc]; } work[iloc][jloc] = 2.0 * p; } } ld = ichunk; NGA_Put(g_work, lo, hi, work, &ld); dotask = next_chunk(lo, hi); } // GA_Transpose(g_orbs, g_tmp); // GA_Copy(g_tmp, g_orbs); // GA_Transpose(g_work, g_tmp); // GA_Copy(g_tmp, g_work); //transform g_orbs from row-major to column major /* ld = ichunk; */ /* GA_Zero(g_counter); */ /* dotask = next_chunk(lo, hi); */ /* while (dotask) { */ /* NGA_Get(g_orbs, lo, hi, a, &ld); */ /* for (j = 0; j <= hi[1] - lo[1]; j++) { */ /* for (i = 0; i <= hi[0] - lo[0]; i++) { */ /* b[j][i] = a[i][j]; //intra-patch transfrom */ /* } */ /* } */ /* lo_c[0] = lo[1]; //inter-patch transform */ /* lo_c[1] = lo[0]; */ /* hi_c[0] = hi[1]; */ /* hi_c[1] = hi[0]; */ /* NGA_Put(g_tmp, lo_c, hi_c, b, &ld); */ /* dotask = next_chunk(lo, hi); */ /* } */ /* GA_Copy(g_tmp, g_orbs); */ // transform g_work from row-major to column major /* ld = ichunk; */ /* GA_Zero(g_counter); */ /* dotask = next_chunk(lo, hi); */ /* while (dotask) { */ /* NGA_Get(g_work, lo, hi, a, &ld); */ /* for (j = 0; j <= hi[1] - lo[1]; j++) { */ /* for (i = 0; i <= hi[0] - lo[0]; i++) { */ /* b[j][i] = a[i][j]; //intra-patch transfrom */ /* } */ /* } */ /* lo_c[0] = lo[1]; //inter-patch transform */ /* lo_c[1] = lo[0]; */ /* hi_c[0] = hi[1]; */ /* hi_c[1] = hi[0]; */ /* NGA_Put(g_tmp, lo_c, hi_c, b, &ld); */ /* dotask = next_chunk(lo, hi); */ /* } */ /* GA_Copy(g_tmp, g_work); */ return; } int nxtask(int nproc) //not used { const int ichunk_local = 10; //in the header file, ichunk is defined as 20, so I rename it as ichunk_local static double nleft=0, icount=0; int ret = 0; //implicit declared variables in fortran int junk; // wrapper round nxtval() to increase granularity; // and thus reduce no. of requests to shared counter; #ifndef MSG_COMMS_MPI if(nproc>0) { if(nleft==0) { icount = tcg_nxtval(nproc) * ichunk_local; nleft = ichunk_local; } ret = icount; icount = icount + 1; nleft = nleft -1; } else { nleft = 0; ret = 0; junk = tcg_nxtval(nproc); } #endif // following does dumb static load balancing; //; //$$$ if(nproc>0) { //$$$ if (nleft == 0) { //$$$ icount = GA_Nodeid(); //$$$ nleft = 1; //$$$ } //$$$ nxtask = icount; //$$$ icount = icount + GA_Nnodes(); //$$$ } else { //$$$ nleft = 0; //$$$ nxtask = 0; //$$$ } return ret; } int next_chunk(int* lo,int* hi) { //const int one=1; int one = 0; int imax, ilo, jlo; //implicit declared variables in fortran int itask; int ret; itask = NGA_Read_inc(g_counter, &one, 1); imax = nbfn / ichunk; if (nbfn - ichunk * imax > 0) imax = imax + 1; if (itask < imax * imax) { ilo = itask % imax; jlo = (itask - ilo) / imax; lo[0] = ilo * ichunk; lo[1] = jlo * ichunk; hi[0] = MIN((ilo + 1) * ichunk - 1, nbfn); hi[1] = MIN((jlo + 1) * ichunk - 1, nbfn); ret = 1; } else ret = 0; return ret; } long int acquire_tasks(int numTasks) { int one = 0; long int itask; itask = NGA_Read_inc(g_counter, &one, numTasks); return itask; } // acquire_tasks int translate_task(long int itask, int *lo, int *hi, int *ilo, int *jlo, int *klo, int *llo) { long int imax; int itmp; int ret; imax = nbfn / ichunk; if (nbfn - ichunk * imax > 0) imax = imax + 1; if (itask < 0) { printf("translate_task: itask negative: %ld imax: %ld nbfn: %ld ichunk: %d\n", itask, imax, nbfn, ichunk); printf("probable GA int precision problem if imax^4 > 2^31\n"); printf("\n"); printf("translate_task\n"); exit(0); } if (itask < pow(imax, 4)) { *ilo = itask % imax; itmp = (itask - (*ilo)) / imax; *jlo = itmp % imax; itmp = (itmp - (*jlo)) / imax; *klo = itmp % imax; *llo = (itmp - (*klo)) / imax; lo[0] = (*ilo) * ichunk; lo[1] = (*jlo) * ichunk; lo[2] = (*klo) * ichunk; lo[3] = (*llo) * ichunk; hi[0] = MIN(((*ilo) + 1) * ichunk - 1, nbfn); hi[1] = MIN(((*jlo) + 1) * ichunk - 1, nbfn); hi[2] = MIN(((*klo) + 1) * ichunk -1, nbfn); hi[3] = MIN(((*llo) + 1) * ichunk - 1, nbfn); ret = 1; } else ret = 0; return ret; } // translate_task int next_4chunk(int *lo,int *hi,int* ilo,int* jlo,int* klo,int* llo, long int *pitask) { int one = 0; long int imax; long int itask; int itmp; int ret; itask = NGA_Read_inc(g_counter, &one, 1); *pitask = itask; imax = nbfn / ichunk; if (nbfn - ichunk * imax > 0) imax = imax + 1; if (itask < 0) { printf("next_4chunk: itask negative: %ld imax: %ld nbfn: %ld ichunk: %d\n", itask, imax, nbfn, ichunk); printf("probable GA int precision problem if imax^4 > 2^31\n"); printf("\n"); printf("next_4chunk\n"); exit(0); } if (itask < pow(imax, 4)) { *ilo = itask % imax; itmp = (itask - (*ilo)) / imax; *jlo = itmp % imax; itmp = (itmp - (*jlo)) / imax; *klo = itmp % imax; *llo = (itmp - (*klo)) / imax; lo[0] = (*ilo) * ichunk; lo[1] = (*jlo) * ichunk; lo[2] = (*klo) * ichunk; lo[3] = (*llo) * ichunk; hi[0] = MIN(((*ilo) + 1) * ichunk - 1, nbfn); hi[1] = MIN(((*jlo) + 1) * ichunk - 1, nbfn); hi[2] = MIN(((*klo) + 1) * ichunk -1, nbfn); hi[3] = MIN(((*llo) + 1) * ichunk - 1, nbfn); ret = 1; } else ret = 0; return ret; } void clean_chunk(double chunk[][ichunk]) { int i, j; for (i = 0; i < ichunk; i++) for (j = 0; j < ichunk; j++) chunk[i][j] = 0.0; } // clean_chunk int verify_zero_chunk(double chunk[][ichunk]) { int i, j, flag; flag = 1; for (i = 0; (i < ichunk) && flag; i++) for (j = 0; (j < ichunk) && flag; j++) if (chunk[i][j] != 0.0) { flag = 0; fprintf(stderr, "chunk[%d][%d] != 0.0, %.16f\n", i, j, chunk[i][j]); break; } return flag; } void damp(double *fac) { // create damped density matrix as a linear combination of; // old density matrix and density matrix formed from new orbitals; //implicit declared variables in fortran double ofac; ofac = 1.00 - (*fac); GA_Add(fac, g_dens, &ofac, g_work, g_dens); return; } void prnout(int iter, double energy, double deltad, double tester) { // printout results of each iteration; if (GA_Nodeid() != 0) return; printf(" iter= %3d, energy=%15.8f, deltad= %9.7f, deltaf=%9.7f\n", iter, energy, deltad, tester); return; } double dendif(void) { double xdiff; double dens_c[ichunk][ichunk],work_c[ichunk][ichunk]; int lo[2], hi[2], i, j, ld; int dotask; // int lo_c[2],hi_c[2]; //column-major inter-patch switch double ret; //implicit declared variables in fortran double denmax; // compute largest change in density matrix elements; denmax = 0.00; GA_Zero(g_counter); dotask = next_chunk(lo,hi); ld = ichunk; while(dotask) { //column-major inter-path switch // lo_c[0] = lo[1]; // lo_c[1] = lo[0]; // hi_c[0] = hi[1]; // hi_c[1] = hi[0]; NGA_Get(g_dens, lo, hi, dens_c, &ld); NGA_Get(g_work, lo, hi, work_c, &ld); //column-major inter-patch switch // NGA_Get(g_dens,lo_c,hi_c,dens_c,&ld); // NGA_Get(g_work,lo_c,hi_c,work_c,&ld); for (j = 0; j <= hi[1] - lo[1]; j++) { for (i = 0; i <= hi[0] - lo[0]; i++) { //xdiff = abs(dens_c[i][j]-work_c[i][j]); //xdiff = abs_double(dens_c[j][i]-work_c[j][i]); //column-major intra-patch switch xdiff = fabs(dens_c[i][j] - work_c[i][j]); //column-major intra-patch switch if (xdiff > denmax) denmax = xdiff; } } dotask = next_chunk(lo, hi); } GA_Dgop(&denmax, 1, "max"); ret = denmax; return ret; } double testfock(void) { double xmax, xtmp; double work[ichunk][ichunk]; int lo[2], hi[2], i, j, iloc, jloc, ld; int dotask; // int lo_c[2],hi_c[2]; //column-major inter-patch switch double ret; // compute largest change in density matrix elements; xmax = 0.00; GA_Zero(g_counter); dotask = next_chunk(lo, hi); ld = ichunk; while(dotask) { //column-major inter-patch switch // lo_c[0]=lo[1]; // lo_c[1]=lo[0]; // hi_c[0]=hi[1]; // hi_c[1]=hi[0]; NGA_Get(g_fock, lo, hi, work, &ld); // NGA_Get(g_fock, lo_c, hi_c, work, &ld);//column-major inter-patch switch for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; if (i != j) { //xtmp = abs(work[iloc][jloc]); // xtmp = abs_double(work[jloc][iloc]); //column-major intra-patch switch xtmp = fabs(work[iloc][jloc]); //column-major intra-patch switch if (xtmp > xmax) xmax = xtmp; } } } dotask = next_chunk(lo, hi); } GA_Dgop(&xmax, 1, "max"); ret = xmax; return ret; } void shiftfock(double shift) { double work[ichunk][ichunk]; int lo[2], hi[2], i, j, iloc, jloc, ld, icnt; int dotask; // int lo_c[2],hi_c[2]; //column-major inter-patch switch // compute largest change in density matrix elements; GA_Zero(g_counter); dotask = next_chunk(lo, hi); ld = ichunk; while (dotask) { //column-major inter-path switch // lo_c[0]=lo[1]; // lo_c[1]=lo[0]; // hi_c[0]=hi[1]; // hi_c[1]=hi[0]; // NGA_Get(g_fock, lo_c, hi_c, work, &ld); //column-major inter-patch switch NGA_Get(g_fock, lo, hi, work, &ld); icnt = 0; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; if ((i == j) && (i > (nocc - 1))) { work[iloc][jloc] = work[iloc][jloc] + shift; // work[jloc][iloc] = work[jloc][iloc] + shift; //column-major inter-patch switch icnt = icnt + 1; } } } if (icnt > 0) //NGA_Put(g_fock, lo_c, hi_c, work, &ld);//column-major inter-patch switch NGA_Put(g_fock, lo, hi, work, &ld); dotask = next_chunk(lo, hi); } return; } void prnfin(double energy) { double orbs[maxnbfn][maxnbfn]; int lo[2],hi[2],ld; // printout final results; if (GA_Nodeid() != 0) return; printf("\n\nfinal energy = %18.11f\n",energy); printf("\neigenvalues\n\n"); output(eigv, 0, MIN(nbfn,nocc+5), 0, 1, nbfn, 1, 1); //output(eigv, 1, MIN(nbfn,nocc+5), 1, 1, nbfn, 1, 1); return; } void g(double *value, int i, int j, int k, int l) { //implicit declared variables in fortran double f0val, rab2, rcd2, facij,fackl,exijkl,denom, fac, xp,yp,zp,xq,yq,zq,rpq2; // compute the two electon integral (ij|kl) over normalized; // primitive 1s gaussians; f0val = 0.00; rab2 = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j]); rcd2 = (x[k] - x[l]) * (x[k] - x[l]) + (y[k] - y[l]) * (y[k] - y[l]) + (z[k] - z[l]) * (z[k] - z[l]); facij = expnt[i] * expnt[j] / (expnt[i] + expnt[j]); fackl = expnt[k] * expnt[l] / (expnt[k] + expnt[l]); exijkl = exprjh(-facij * rab2 - fackl * rcd2); denom = (expnt[i] + expnt[j]) * (expnt[k] + expnt[l]) * sqrt(expnt[i] + expnt[j] + expnt[k] + expnt[l]); fac = (expnt[i] + expnt[j]) * (expnt[k] + expnt[l]) / (expnt[i] + expnt[j] + expnt[k] + expnt[l]); xp = (x[i] * expnt[i] + x[j] * expnt[j]) / (expnt[i] + expnt[j]); yp = (y[i] * expnt[i] + y[j] * expnt[j]) / (expnt[i] + expnt[j]); zp = (z[i] * expnt[i] + z[j] * expnt[j]) / (expnt[i] + expnt[j]); xq = (x[k] * expnt[k] + x[l] * expnt[l]) / (expnt[k] + expnt[l]); yq = (y[k] * expnt[k] + y[l] * expnt[l]) / (expnt[k] + expnt[l]); zq = (z[k] * expnt[k] + z[l] * expnt[l]) / (expnt[k] + expnt[l]); rpq2 = (xp - xq) * (xp - xq) + (yp - yq) * (yp - yq) + (zp - zq) * (zp - zq); f0(&f0val, fac * rpq2); *value = (2.00 * pow(pi, 2.50) / denom) * exijkl * f0val * rnorm[i] * rnorm[j] * rnorm[k] * rnorm[l]; return; } void diagon(double *tester, int iter) { // diagon(fock, orbs, evals, work, tester, iter); double r_zero, r_one, shift; //implicit declared variables in fortran int i, me; double test = -1.0, s; me = GA_Nodeid(); #if USE_TRANSFORM // use similarity transform to solve standard eigenvalue problem; // (overlap matrix has been transformed out of the problem); r_one = 1.00; r_zero = 0.00; GA_Dgemm('n', 'n', nbfn, nbfn, nbfn, r_one, g_fock, g_orbs, r_zero, g_tfock); #if 0 s = sum(g_tfock); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_tfock sum after first dgemm(): %f\n", s); #endif GA_Dgemm('t', 'n', nbfn, nbfn, nbfn, r_one, g_orbs, g_tfock, r_zero, g_fock); #if 0 s = sum(g_fock); GA_Dgop(&s, 1, "+"); if (me == 0) printf("g_fock sum after second dgemm(): %f\n", s); #endif *tester = testfock(); shift = 0.00; if ((*tester) > 0.30) { shift = 0.30; } #if 1 else { if (nbfn > 60) shift = 0.10; else shift = 0.00; } #endif //if (iter>=2 && shift!=0.00) if (iter >= 1 && shift != 0.00) { //iter 2 in Fotran is iter 1 in C shiftfock(shift); } GA_Copy(g_orbs, g_tfock); GA_Diag_std_seq(g_fock, g_work, eigv); // Back transform eigenvectors; GA_Dgemm('n', 'n', nbfn, nbfn, nbfn, r_one, g_tfock, g_work, r_zero, g_orbs); if (iter>= 1 && shift != 0.00) { //>=2 --> >=1 for (i = nocc; i < nbfn; i++) { eigv[i] = eigv[i] - shift; } } #else //; // Keep remaking overlap matrix since GA_Diag_seq does not; // guarantee that g_ident is preserved.; //; makoverlap(); GA_Diag_seq(g_fock, g_ident, g_orbs, eigv); *tester = 0.00; #endif return; } void makeob(void) { double work[ichunk][ichunk],orbs[ichunk][ichunk]; double eval[maxnbfn]; int lo[2],hi[2],ld,me,i,j,iloc,jloc; int dotask; int lo_c[2],hi_c[2]; //for column-major switch // generate set of orthonormal vectors by creating a random; // symmetric matrix and solving associated generalized eigenvalue; // problem using the correct overlap matrix.; me = GA_Nodeid(); GA_Zero(g_counter); dotask = next_chunk(lo, hi); ld = ichunk; while (dotask) { for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; work[iloc][jloc] = s(i, j); //work[jloc][iloc] = s(i,j); //column-major intra-patch switch orbs[iloc][jloc] = 0.5;//drand48(); //orbs[jloc][iloc] = 0.5; //column-major intra-patch switch } } NGA_Put(g_ident, lo, hi, work, &ld); NGA_Put(g_fock, lo, hi, orbs, &ld); // lo_c[0]=lo[1]; //lo_c[1]=lo[0]; // hi_c[0]=hi[1]; // hi_c[1]=hi[0]; // NGA_Put(g_ident,lo_c,hi_c,work,&ld); // NGA_Put(g_fock,lo_c,hi_c,orbs,&ld); dotask = next_chunk(lo, hi); } GA_Symmetrize(g_fock); GA_Diag_seq(g_fock, g_ident, g_orbs, eval); return; } void denges(void) { // Form guess density from superposition of atomic densities in the AO; // basis set ... instead of doing the atomic SCF hardwire for this; // small basis set for the Be atom.; int one, itask, lo[2], hi[2], ld; double atdens[15][15] = { {0.000002,0.000027,0.000129,0.000428,0.000950,0.001180, 0.000457,-0.000270,-0.000271,0.000004,0.000004,0.000004, 0.000004,0.000004,0.000004}, {0.000027,0.000102,0.000987, 0.003269,0.007254,0.009007,0.003492,-0.002099,-0.002108, 0.000035,0.000035,0.000035,0.000035,0.000035,0.000035}, {0.000129,0.000987,0.002381,0.015766,0.034988,0.043433, 0.016835,-0.010038,-0.010082,0.000166,0.000166,0.000166, 0.000166,0.000166,0.000166}, {0.000428,0.003269,0.015766, 0.026100,0.115858,0.144064,0.055967,-0.035878,-0.035990, 0.000584,0.000584,0.000584,0.000584,0.000584,0.000584}, {0.000950,0.007254,0.034988,0.115858,0.128586,0.320120, 0.124539,-0.083334,-0.083536,0.001346,0.001346,0.001346, 0.001346,0.001346,0.001346}, {0.001180,0.009007,0.043433, 0.144064,0.320120,0.201952,0.159935,-0.162762,-0.162267, 0.002471,0.002471,0.002471,0.002471,0.002471,0.002471}, {0.000457,0.003492,0.016835,0.055967,0.124539,0.159935, 0.032378,-0.093780,-0.093202,0.001372,0.001372,0.001372, 0.001372,0.001372,0.001372}, {-0.000270,-0.002099,-0.010038, -0.035878,-0.083334,-0.162762,-0.093780,0.334488,0.660918, -0.009090,-0.009090,-0.009090,-0.009090,-0.009090,-0.009090}, {-0.000271,-0.002108,-0.010082,-0.035990,-0.083536,-0.162267, -0.093202,0.660918,0.326482,-0.008982,-0.008982,-0.008981, -0.008981,-0.008981,-0.008982}, {0.000004,0.000035,0.000166, 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008982, 0.000062,0.000124,0.000124,0.000124,0.000124,0.000124}, {0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, 0.001372,-0.009090,-0.008982,0.000124,0.000062,0.000124, 0.000124,0.000124,0.000124}, {0.000004,0.000035,0.000166, 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, 0.000124,0.000124,0.000062,0.000124,0.000124,0.000124}, {0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, 0.001372,-0.009090,-0.008981,0.000124,0.000124,0.000124, 0.000062,0.000124,0.000124}, {0.000004,0.000035,0.000166, 0.000584,0.001346,0.002471,0.001372,-0.009090,-0.008981, 0.000124,0.000124,0.000124,0.000124,0.000062,0.000124}, {0.000004,0.000035,0.000166,0.000584,0.001346,0.002471, 0.001372,-0.009090,-0.008982,0.000124,0.000124,0.000124, 0.000124,0.000124,0.000062}}; //implicit declared variables in fortran int ioff,i,j; double atdens_f[15][15]; // Create initial guess for density matrix in global array; GA_Zero(g_dens); GA_Zero(g_counter); //one = 1; one = 0; ld = 15; // Correct for a factor of two along the diagonal; for (i = 0; i < ld; i++) { atdens[i][i] = 2.00 * atdens[i][i]; } //to get a fortran based array by switching the indices for (i = 0; i < 15; i++) { for (j = 0; j < 15; j++) { atdens_f[j][i] = atdens[i][j]; } } itask = NGA_Read_inc(g_counter, &one, 1); while(itask < natom) { ioff = itask * 15; lo[0] = ioff + 0; //1--->0 lo[1] = ioff + 0; //1--->0 hi[0] = ioff + 14;//15--->14 hi[1] = ioff + 14;//15--->14 //NGA_Put(g_dens,lo,hi,atdens,&ld); NGA_Put(g_dens, lo, hi, atdens_f, &ld); itask = NGA_Read_inc(g_counter, &one, 1); } GA_Sync(); return; } void setarrays(void) { int one, two, dims[2]; int status; int nproc; one = 1; two = 2; nproc = GA_Nnodes(); g_counter = GA_Create_handle(); GA_Set_data(g_counter,one,&one,MT_INT); status = GA_Allocate(g_counter); GA_Zero(g_counter); g_proc = GA_Create_handle(); GA_Set_data(g_proc, one, &nproc, MT_INT); status = GA_Allocate(g_proc); GA_Zero(g_proc); dims[0] = nbfn; dims[1] = nbfn; g_dens = GA_Create_handle(); GA_Set_data(g_dens, two, dims, MT_DBL); status = GA_Allocate(g_dens); GA_Zero(g_dens); g_schwarz = GA_Create_handle(); GA_Set_data(g_schwarz, two, dims, MT_DBL); status = GA_Allocate(g_schwarz); GA_Zero(g_schwarz); g_fock = GA_Create_handle(); GA_Set_data(g_fock, two, dims, MT_DBL); status = GA_Allocate(g_fock); GA_Zero(g_fock); g_tfock = GA_Create_handle(); GA_Set_data(g_tfock, two, dims, MT_DBL); status = GA_Allocate(g_tfock); GA_Zero(g_tfock); g_work = GA_Create_handle(); GA_Set_data(g_work, two, dims, MT_DBL); status = GA_Allocate(g_work); GA_Zero(g_work); g_ident = GA_Create_handle(); GA_Set_data(g_ident, two, dims, MT_DBL); status = GA_Allocate(g_ident); GA_Zero(g_ident); g_orbs = GA_Create_handle(); GA_Set_data(g_orbs, two, dims, MT_DBL); status = GA_Allocate(g_orbs); GA_Zero(g_orbs); //temporay global array for storage major transformation g_tmp = GA_Create_handle(); GA_Set_data(g_tmp, two, dims, MT_DBL); status = GA_Allocate(g_tmp); GA_Zero(g_tmp); return; } void closearrays(void) { GA_Destroy(g_counter); GA_Destroy(g_proc); GA_Destroy(g_dens); GA_Destroy(g_schwarz); GA_Destroy(g_fock); GA_Destroy(g_tfock); GA_Destroy(g_work); GA_Destroy(g_ident); GA_Destroy(g_orbs); //temporay global array for storage major transformation GA_Destroy(g_tmp); return; } void makoverlap(void) //not used due to USE_TRANSFORM { int me, lo[2], hi[2], ld[2]; int ld1, ld2; double *ptr; //int--->double me = GA_Nodeid(); NGA_Distribution(g_ident, me, lo, hi); NGA_Access(g_ident, lo, hi, &ptr, ld); ld1 = hi[0] - lo[0] + 1; ld2 = hi[1] - lo[1] + 1; setoverlap(ptr,lo,hi,ld1,ld2); NGA_Release(g_ident,lo,hi); return; } void setoverlap(double *a,int* lo,int* hi, int ld1,int ld2) //not used due to USE_TRANSFORM { int i,j,ii, jj; for (i = 0;i < ld1;i++) { ii = i + lo[0]; for (j = 0;j < ld2;j++) { jj = j + lo[1]; #if USE_TRANSFORM if (ii==jj) //a[i][j] = 1.0; a[ld2*i+j]=1.0; else //a[i][j] = 0.0; a[ld2*i+j] = 0.0; #else //a[i][j] = s[ii][jj]; a[ld1*i+j] = s[ii][jj]; #endif } } return; } void print_GA_block(int g_a) //not used { int lo[2], hi[2], ld1, ld2, ld; double *ptr; //int--->double //implicit declared variables in fortran int me; me = GA_Nodeid(); NGA_Distribution(g_a, me, lo, hi); ld1 = hi[0] - lo[0] + 1; ld2 = hi[1] - lo[1] + 1; NGA_Access(g_a, lo, hi, &ptr, &ld); dump_chunk(ptr,ld1,ld2); NGA_Release(g_a,lo,hi); return; } void print_GA_block_ij(int g_a,int tlo) //not used { int lo[2], hi[2], ld1, ld2, ld; double *ptr; //int--->double //implicit declared variables in fortran int me; me = GA_Nodeid(); NGA_Distribution(g_a, me, lo, hi); ld1 = hi[0] - lo[0] + 1; ld2 = hi[1] - lo[1] + 1; NGA_Access(g_a, &tlo, hi, &ptr, &ld); dump_chunk(ptr,ld1,ld2); NGA_Release(g_a,lo,hi); return; } void dump_chunk(double *a,int ld1,int ld2) //not used { //implicit declared variables in fortran int i,j; double trace; for (i = 0; i < MIN(10,ld1);i++) { for (j = 0; j < MIN(10,ld2); j++) { //printf("%10.4f\n",a[i][j]); printf("%10.4f\n",a[MIN(10,ld2)*i+j]); } } trace = 0.00; for (i=0;i #ifdef __cplusplus extern "C" { #endif int GFInitialize(); void GFFinalize(); void twoel(double schwmax, double *etwo, int nproc); void twoel_orig(double schwmax, double *etwo, int nproc); #ifdef __cplusplus } #endif #undef CLOG #ifdef CLOG extern FILE *clog; #endif #endif /* __TWOEL_H */ ga-5-4/gfutex/examples/scf/sum.h0000644000175000017500000000010612662210467014703 0ustar mbamba#ifndef __SUM_H #define __SUM_H extern double sum(int g_a); #endif ga-5-4/gfutex/examples/scf/sum.c0000644000175000017500000000126412662210467014704 0ustar mbamba#include #include #include #include "sum.h" double sum(int g_a) { int me, ndims, *lo, *hi, *ld; double *dat, sum; int sz, i; me = GA_Nodeid(); ndims = GA_Ndim(g_a); lo = malloc(sizeof(int) * ndims); hi = malloc(sizeof(int) * ndims); ld = malloc(sizeof(int) * ndims); NGA_Distribution(g_a, me, lo, hi); NGA_Access(g_a, lo, hi, &dat, ld); sz = 1; for (i = 0; i < ndims; i++) { sz *= ((hi[i] - lo[i]) + 1); // printf("dim: %d, lo: %d, hi: %d\n", i, lo[i], hi[i]); } sum = 0.0; for (i = 0; i < sz; i++) sum += dat[i]; NGA_Release(g_a, lo, hi); free(lo); free(hi); free(ld); return sum; } /* sum */ ga-5-4/gfutex/examples/scf/output.c0000644000175000017500000000244012662210467015435 0ustar mbamba #include #include #include "cscc.h" #include "ga.h" void output(double *z, int rowlow, int rowhi, int collow, int colhi, int rowdim, int coldim, int nctl) { static int kcol = 8; static double zero = 0.0; int i, j, k; int last, begin; for (i = rowlow; i < rowhi; i++) { /* for (j = collow; j < colhi; j++) { if (z[i,j] != zero) { goto L15; } } */ if (z[i] != zero) { goto L15; } } printf(" zero matrix \n"); goto L3; L15: if (rowhi < rowlow) { goto L3; } if (colhi < collow) { goto L3; } last = MIN(colhi, collow + kcol - 1); for (begin = collow; begin < colhi; begin += kcol) { for (i = begin; i < last; i++) { printf(" col %3d ",i); } printf("\n"); for (k = rowlow; k < rowhi; k++) { //for (i = begin; i < last; i++) //{ //if (z[k,i] != zero) if (z[k] != zero) { goto L5; } //} // goto L1; continue; L5: //for (i = begin; i < last; i++) //{ //printf("row %4d %9.4f",i,z[k,i]); printf("row %4d %9.4f", k, z[k]); //} printf("\n"); //L1: // ; } last = MIN((last + kcol), colhi); } L3: printf("\n"); return; } ga-5-4/gfutex/examples/scf/twoel.C.orig0000644000175000017500000005636012662210467016140 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cscc.h" #include "scf.h" #include "twoel.h" using namespace globalFutures; typedef double ChunkArray[ichunk][ichunk]; struct TaskStats { long int taskid; int lo[4][2], hi[4][2]; bool executed; TaskStats() : taskid(-1), executed(false) { for (int i = 0; i < 4; i++) for (int j = 0; j < 2; j++) { lo[i][j] = -1; hi[i][j] = -1; } } // TaskStats }; typedef std::list TaskStatsList; typedef tbb::enumerable_thread_specific TIAccum; typedef tbb::enumerable_thread_specific PTaskStatsList; static void TwoElThreadTask(int g_a, int ndims, int plo[], int phi[], void *arg); static void TwoElThreadOMP(int g_a, int ndims, int plo[], int phi[], void *arg); struct TwoElArgs { double schwmax; long int itasklo, itaskhi; }; #ifdef DEBUG static const int maxTasks = 1000; #endif static double traccum = 0.0; static TIAccum tiaccum(0.0); static PTaskStatsList statsList; #ifdef DEBUG static double taskTimes[maxTasks]; static tbb::tbb_thread::id taskIDs[maxTasks]; static cpu_set_t sets[maxTasks]; static pthread_t threadIDs[maxTasks]; static long int tlo[maxTasks], thi[maxTasks]; static tbb::atomic taskPos; #endif static GFHandle tehndl; static int numTasks; static tbb::atomic execTasks; static void print_task_stats(int me, int nproc, int g_a); int GFInitialize() { int ret = globalFutures::GFInitialize(); tehndl = GFRegister(TwoElThreadTask, sizeof(TwoElArgs)); #ifdef DEBUG taskPos = 0U; #endif execTasks = 0L; // traccum = new double[nsheps]; // for (int i = 0; i < nsheps; i++) // traccum[i] = 0.0; return ret; } // GFInitialize void GFFinalize() { globalFutures::GFFinalize(); } // GFFinalize void twoel_orig(double schwmax, double *etwo, int nproc) { double f_ij[ichunk][ichunk], d_kl[ichunk][ichunk]; double f_ik[ichunk][ichunk], d_jl[ichunk][ichunk]; double s_ij[ichunk][ichunk], s_kl[ichunk][ichunk]; double one; long long int ijcnt, klcnt, ijklcnt; int lo[4], hi[4], lo_ik[2], hi_ik[2], lo_jl[2], hi_jl[2]; int i, j, k, l, iloc, jloc, kloc, lloc, ich, it, jt, kt, lt; int dotask, newtask, accum; int itask; double gg; ga_nbhdl_t f0, f1; #ifdef CLOG int *procs = NULL, *map = NULL, *phist = NULL, np = 0, ip; #endif // add in the two-electron contribution to the fock matrix; #ifdef CLOG procs = (int *)malloc(sizeof(int) * nproc); phist = (int *)calloc(nproc, sizeof(int)); map = (int *)malloc(sizeof(int) * 2 * nproc); #endif one = 1.00; ijcnt = icut1; klcnt = icut2; ijklcnt = icut3; GA_Zero(g_counter); ich = ichunk; dotask = next_4chunk(lo, hi, &it, &jt, &kt, <); itask = 0; newtask = 1; accum = 0; while (dotask) { lo_ik[0] = lo[0]; lo_ik[1] = lo[2]; hi_ik[0] = hi[0]; hi_ik[1] = hi[2]; lo_jl[0] = lo[1]; lo_jl[1] = lo[3]; hi_jl[0] = hi[1]; hi_jl[1] = hi[3]; #ifdef CLOG np = GF_Locate_region(g_schwarz, lo, hi, map, procs); if (np > 1) fprintf(clog, "Attention: multi-processor tile: %d\n", np); for (ip = 0; ip < np; ip++) { fprintf(clog, "itask: %d, g_schwarz tile: %d %d %d %d, proc: %d\n", itask, lo[0], lo[1], hi[0], hi[1], procs[ip]); phist[procs[ip]]++; } #endif GF_Get(g_schwarz, lo, hi, s_ij, &ich); clean_chunk(f_ij); clean_chunk(f_ik); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; if ((s_ij[iloc][jloc] * schwmax) < tol2e) icut1 = icut1 + (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1); else { ga_nbhdl_t s, d0, d1; if (newtask) { GF_NbGet(g_schwarz, &lo[2], &hi[2], s_kl, &ich, &s); GF_NbGet(g_dens, &lo[2], &hi[2], d_kl, &ich, &d0); GF_NbGet(g_dens, lo_jl, hi_jl, d_jl, &ich, &d1); #ifdef CLOG np = GF_Locate_region(g_schwarz, &lo[2], &hi[2], map, procs); if (np > 1) fprintf(clog, "Attention: multi-processor tile: %d\n", np); for (ip = 0; ip < np; ip++) { fprintf(clog, "itask: %d, g_schwarz tile: %d %d %d %d, proc: %d\n", itask, lo[2], lo[3], hi[2], hi[3], procs[ip]); phist[procs[ip]]++; } np = GF_Locate_region(g_dens, lo_jl, hi_jl, map, procs); if (np > 1) fprintf(clog, "Attention: multi-processor tile: %d\n", np); for (ip = 0; ip < np; ip++) { fprintf(clog, "itask: %d, g_dens tile: %d %d %d %d, proc: %d\n", itask, lo_jl[0], lo_jl[1], hi_jl[0], hi_jl[1], procs[ip]); phist[procs[ip]]++; } #endif GF_NbWait(&s); } for (k = lo[2]; k <= hi[2]; k++) { kloc = k - lo[2]; for (l = lo[3]; l <= hi[3]; l++) { lloc = l - lo[3]; if (s_ij[iloc][jloc] * s_kl[kloc][lloc] < tol2e) icut2 = icut2 + 1; else { if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; } g(&gg, i, j, k, l); f_ij[iloc][jloc] = f_ij[iloc][jloc] + gg * d_kl[kloc][lloc]; f_ik[iloc][kloc] = f_ik[iloc][kloc] - 0.50 * gg * d_jl[jloc][lloc]; icut3 = icut3 + 1; accum = 1; } } } if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; } } } } if (accum) { GF_NbAcc(g_fock, lo, hi, f_ij, &ich, &one, &f0); GF_NbAcc(g_fock, lo_ik, hi_ik, f_ik, &ich, &one, &f1); } dotask = next_4chunk(lo, hi, &it, &jt, &kt, <); if (accum) { GF_NbWait(&f0); GF_NbWait(&f1); } if (dotask) { newtask = 1; accum = 0; #ifdef CLOG fprintf(clog, "\n"); #endif } itask++; } *etwo = 0.50 * contract_matrices(g_fock, g_dens); ijcnt = icut1 - ijcnt; klcnt = icut2 - klcnt; ijklcnt = icut3 - ijklcnt; icut4 = icut3; #ifdef CLOG fprintf(clog, "\n"); for (ip = 0; ip < nproc; ip++) fprintf(clog, "Proc: %d, cnt: %d\n", ip, phist[ip]); free(procs); free(phist); free(map); #endif if (icut3 > 0) return; // no integrals may be calculated if there is no work for; // this node (ichunk too big), or, something is wrong; printf("no two-electron integrals computed by node %d\n", GA_Nodeid()); printf("\n"); } // twoel_orig static tbb::atomic aicut1, aicut2, aicut3; #define DYNAMIC_TASKS 1 #define ACCURATE_TIMING 1 void twoel(double schwmax, double *etwo, int nproc) { int dotask, itask, ndim; int lo[4], hi[4], it, jt, kt, lt; long long int ijcnt, klcnt, ijklcnt; long int taskid, tidlo, tidhi, currLim, incrT, tmpi; double tr0, tr1, tr2, tr3, teaccum, tqaccum; long long int totTasks, procTasks; int me; // add in the two-electron contribution to the fock matrix; ijcnt = icut1; klcnt = icut2; ijklcnt = icut3; me = GA_Nodeid(); tmpi = ceil(static_cast(nbfn) / static_cast(ichunk)); incrT = tmpi * tmpi; totTasks = incrT * incrT; numTasks = ceil(static_cast(totTasks) / incrT); // n^2 integrals per task procTasks = ceil(static_cast(totTasks) / static_cast(nproc)); procTasks = ceil(static_cast(procTasks) / static_cast(nproc)); tidlo = me * procTasks; tidhi = (me + 1) * procTasks - 1; currLim = totTasks / incrT; #if 0 std::cout << "Proc: " << me << ", totTasks: " << totTasks << ", numTasks: " << numTasks << std::endl; std::cout << "Proc: " << me << ", procTasks: " << procTasks << ", tidlo: " << tidlo << ", tidhi: " << tidhi << std::flush << std::endl; #endif GA_Zero(g_counter); #ifdef DYNAMIC_TASKS taskid = acquire_tasks(numTasks); dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); #endif // dotask = next_4chunk(lo, hi, &it, &jt, &kt, <); itask = 0; TwoElArgs teargs; teargs.schwmax = schwmax; ndim = GA_Ndim(g_schwarz); aicut1 = icut1; aicut2 = icut2; aicut3 = icut3; teaccum = 0.0; tqaccum = 0.0; tr0 = MPI_Wtime(); // for (taskid = tidlo; taskid <= tidhi; taskid++) { #ifndef DYNAMIC_TASKS for (taskid = tidlo; taskid <= tidhi; taskid += numTasks) { #else while (dotask) { #endif teargs.itasklo = taskid; #ifndef DYNAMIC_TASKS teargs.itaskhi = std::min(taskid + numTasks - 1, tidhi); #else teargs.itaskhi = taskid + numTasks - 1; #endif #ifndef DYNAMIC_TASKS dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); #endif GFExecute(tehndl, g_schwarz, ndim, &lo[2], &hi[2], &teargs); // TwoElThreadOMP(g_schwarz, ndim, &lo[2], &hi[2], &teargs); #ifdef DYNAMIC_TASKS taskid = acquire_tasks(numTasks); dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); #endif // dotask = next_4chunk(lo, hi, &it, &jt, &kt, <); itask++; if (itask % GFMaxConcurrency() == 0) GFQuiesce(tehndl); } tr1 = MPI_Wtime(); tr2 = MPI_Wtime(); GFAllQuiesce(tehndl); tr3 = MPI_Wtime(); traccum += (tr1 - tr0) + (tr3 - tr2); teaccum += (tr1 - tr0); tqaccum += (tr3 - tr2); #if 0 printf("Proc: %d, number of tasks executed: %d, exec. time: %f, quiesce time: %f\n", me, itask, teaccum, tqaccum); fflush(stdout); #endif #ifdef CLOG fprintf(clog, "After threaded execution\n"); fflush(clog); #endif icut1 = aicut1; icut2 = aicut2; icut3 = aicut3; *etwo = 0.50 * contract_matrices(g_fock, g_dens); ijcnt = icut1 - ijcnt; klcnt = icut2 - klcnt; ijklcnt = icut3 - ijklcnt; icut4 = icut3; print_task_stats(me, nproc, g_schwarz); if (icut3 > 0) return; // no integrals may be calculated if there is no work for; // this node (ichunk too big), or, something is wrong; printf("no two-electron integrals computed by node %d\n", me); printf("\n"); } // twoel void TwoElThreadTask(int g_a, int ndims, int plo[], int phi[], void *arg) { const double one = 1.0; TwoElArgs *teargs; double gg; int i, j, k, l, iloc, jloc, kloc, lloc, ich, it, jt, kt, lt; int lo[4], hi[4], lo_ik[2], hi_ik[2], lo_jl[2], hi_jl[2]; int newtask, accum; ChunkArray *f_ij, *d_kl; ChunkArray *f_ik, *d_jl; ChunkArray *s_ij, *s_kl; ga_nbhdl_t f0, f1; unsigned int lTaskPos; long long int laicut1 = 0L, laicut2 = 0L, laicut3 = 0L; long int lexecTasks = 0L; teargs = reinterpret_cast(arg); f_ij = reinterpret_cast(new ChunkArray); d_kl = reinterpret_cast(new ChunkArray); f_ik = reinterpret_cast(new ChunkArray); d_jl = reinterpret_cast(new ChunkArray); s_ij = reinterpret_cast(new ChunkArray); s_kl = reinterpret_cast(new ChunkArray); ich = ichunk; #ifdef DEBUG lTaskPos = taskPos++; taskIDs[lTaskPos] = tbb::this_tbb_thread::get_id(); threadIDs[lTaskPos] = pthread_self(); tlo[lTaskPos] = teargs->itasklo; thi[lTaskPos] = teargs->itaskhi; #endif #if 0 pthread_getaffinity_np(threadIDs[lTaskPos], sizeof(sets[lTaskPos]), &sets[lTaskPos]); unsigned int ccnt = 0U; for (int i = 0; i < CPU_SETSIZE; i++) if (CPU_ISSET(i, &sets[lTaskPos])) ccnt++; if (ccnt > 1U) { unsigned int lcore = cores.fetch_and_add(2U); CPU_ZERO(&sets[lTaskPos]); CPU_SET(lcore, &sets[lTaskPos]); pthread_setaffinity_np(threadIDs[lTaskPos], sizeof(sets[lTaskPos]), &sets[lTaskPos]); } #endif PTaskStatsList::reference ltlist = statsList.local(); tbb::tick_count t0, t1; t0 = tbb::tick_count::now(); for (long int itask = teargs->itasklo; itask <= teargs->itaskhi; itask++) { int dotask; newtask = 1; accum = 0; dotask = translate_task(itask, lo, hi, &it, &jt, &kt, <); if (!dotask) break; lo_ik[0] = lo[0]; lo_ik[1] = lo[2]; hi_ik[0] = hi[0]; hi_ik[1] = hi[2]; lo_jl[0] = lo[1]; lo_jl[1] = lo[3]; hi_jl[0] = hi[1]; hi_jl[1] = hi[3]; ltlist.push_back(TaskStats()); TaskStats &stats = ltlist.back(); stats.taskid = itask; stats.lo[0][0] = lo[0]; stats.lo[0][1] = lo[1]; stats.hi[0][0] = hi[0]; stats.hi[0][1] = hi[1]; GF_Get(g_schwarz, lo, hi, s_ij, &ich); clean_chunk(*f_ij); clean_chunk(*f_ik); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; if (((*s_ij)[iloc][jloc] * teargs->schwmax) < tol2e) // qthread_incr(&icut1, (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1)); laicut1 += (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1); else { ga_nbhdl_t s, d0, d1; if (newtask) { GF_NbGet(g_schwarz, &lo[2], &hi[2], *s_kl, &ich, &s); GF_NbGet(g_dens, &lo[2], &hi[2], *d_kl, &ich, &d0); GF_NbGet(g_dens, lo_jl, hi_jl, *d_jl, &ich, &d1); stats.lo[1][0] = lo[2]; stats.lo[1][1] = lo[3]; stats.hi[1][0] = hi[2]; stats.hi[1][1] = hi[3]; stats.lo[2][0] = lo[2]; stats.lo[2][1] = lo[3]; stats.hi[2][0] = hi[2]; stats.hi[2][1] = hi[3]; stats.lo[3][0] = lo_jl[0]; stats.lo[3][1] = lo_jl[1]; stats.hi[3][0] = hi_jl[0]; stats.hi[3][1] = hi_jl[1]; GF_NbWait(&s); } for (k = lo[2]; k <= hi[2]; k++) { kloc = k - lo[2]; for (l = lo[3]; l <= hi[3]; l++) { lloc = l - lo[3]; if ((*s_ij)[iloc][jloc] * (*s_kl)[kloc][lloc] < tol2e) // qthread_incr(&icut2, 1); laicut2++; else { if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; stats.executed = true; lexecTasks++; } g(&gg, i, j, k, l); (*f_ij)[iloc][jloc] = (*f_ij)[iloc][jloc] + gg * (*d_kl)[kloc][lloc]; (*f_ik)[iloc][kloc] = (*f_ik)[iloc][kloc] - 0.50 * gg * (*d_jl)[jloc][lloc]; // qthread_incr(&icut3, 1); laicut3++; accum = 1; } } } if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; } } } } if (accum) { GF_NbAcc(g_fock, lo, hi, *f_ij, &ich, const_cast(&one), &f0); GF_NbAcc(g_fock, lo_ik, hi_ik, *f_ik, &ich, const_cast(&one), &f1); GF_NbWait(&f0); GF_NbWait(&f1); } } aicut1 += laicut1; aicut2 += laicut2; aicut3 += laicut3; execTasks += lexecTasks; t1 = tbb::tick_count::now(); #ifdef ACCURATE_TIMING TIAccum::reference ltiacc = tiaccum.local(); ltiacc += (t1 - t0).seconds(); #endif #ifdef DEBUG taskTimes[lTaskPos] = (t1 - t0).seconds(); #endif delete [] f_ij; delete [] d_kl; delete [] f_ik; delete [] d_jl; delete [] s_ij; delete [] s_kl; // qthread_dincr(&traccum[qthread_shep(NULL)], tr1 - tr0); } // TwoElThreadTask void TwoElThreadOMP(int g_a, int ndims, int plo[], int phi[], void *arg) { const double one = 1.0; TwoElArgs *teargs; double gg; int i, j, k, l, iloc, jloc, kloc, lloc, ich, it, jt, kt, lt; int lo[4], hi[4], lo_ik[2], hi_ik[2], lo_jl[2], hi_jl[2]; int newtask, accum; ChunkArray *f_ij, *d_kl; ChunkArray *f_ik, *d_jl; ChunkArray *s_ij, *s_kl; ga_nbhdl_t f0, f1; unsigned int lTaskPos; teargs = reinterpret_cast(arg); ich = ichunk; long long int laicut1 = 0L, laicut2 = 0L, laicut3 = 0L; long int lexecTasks = 0L; #pragma omp parallel default(none), shared(teargs, g_schwarz, g_dens, g_fock, ich, aicut1, aicut2, aicut3, tiaccum, execTasks, statsList), private(f_ij, d_kl, f_ik, d_jl, s_ij, s_kl, gg, newtask, accum, lo, hi, it, jt, kt, lt, lo_ik, hi_ik, lo_jl, hi_jl, i, j, k, l, iloc, jloc, kloc, lloc, f0, f1, laicut1, laicut2, laicut3, lexecTasks) { tbb::tick_count t0, t1; t0 = tbb::tick_count::now(); f_ij = reinterpret_cast(new ChunkArray); d_kl = reinterpret_cast(new ChunkArray); f_ik = reinterpret_cast(new ChunkArray); d_jl = reinterpret_cast(new ChunkArray); s_ij = reinterpret_cast(new ChunkArray); s_kl = reinterpret_cast(new ChunkArray); laicut1 = 0L; laicut2 = 0L; laicut3 = 0L; lexecTasks = 0L; PTaskStatsList::reference ltlist = statsList.local(); #pragma omp for schedule(guided), nowait for (long int itask = teargs->itasklo; itask <= teargs->itaskhi; itask++) { int dotask; newtask = 1; accum = 0; dotask = translate_task(itask, lo, hi, &it, &jt, &kt, <); if (!dotask) continue; lo_ik[0] = lo[0]; lo_ik[1] = lo[2]; hi_ik[0] = hi[0]; hi_ik[1] = hi[2]; lo_jl[0] = lo[1]; lo_jl[1] = lo[3]; hi_jl[0] = hi[1]; hi_jl[1] = hi[3]; ltlist.push_back(TaskStats()); TaskStats &stats = ltlist.back(); stats.taskid = itask; stats.lo[0][0] = lo[0]; stats.lo[0][1] = lo[1]; stats.hi[0][0] = hi[0]; stats.hi[0][1] = hi[1]; GF_Get(g_schwarz, lo, hi, s_ij, &ich); clean_chunk(*f_ij); clean_chunk(*f_ik); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; if (((*s_ij)[iloc][jloc] * teargs->schwmax) < tol2e) // qthread_incr(&icut1, (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1)); laicut1 += (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1); else { ga_nbhdl_t s, d0, d1; if (newtask) { GF_NbGet(g_schwarz, &lo[2], &hi[2], *s_kl, &ich, &s); GF_NbGet(g_dens, &lo[2], &hi[2], *d_kl, &ich, &d0); GF_NbGet(g_dens, lo_jl, hi_jl, *d_jl, &ich, &d1); stats.lo[1][0] = lo[2]; stats.lo[1][1] = lo[3]; stats.hi[1][0] = hi[2]; stats.hi[1][1] = hi[3]; stats.lo[2][0] = lo[2]; stats.lo[2][1] = lo[3]; stats.hi[2][0] = hi[2]; stats.hi[2][1] = hi[3]; stats.lo[3][0] = lo_jl[0]; stats.lo[3][1] = lo_jl[1]; stats.hi[3][0] = hi_jl[0]; stats.hi[3][1] = hi_jl[1]; GF_NbWait(&s); } for (k = lo[2]; k <= hi[2]; k++) { kloc = k - lo[2]; for (l = lo[3]; l <= hi[3]; l++) { lloc = l - lo[3]; if ((*s_ij)[iloc][jloc] * (*s_kl)[kloc][lloc] < tol2e) // qthread_incr(&icut2, 1); laicut2++; else { if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; lexecTasks++; stats.executed = true; } g(&gg, i, j, k, l); (*f_ij)[iloc][jloc] = (*f_ij)[iloc][jloc] + gg * (*d_kl)[kloc][lloc]; (*f_ik)[iloc][kloc] = (*f_ik)[iloc][kloc] - 0.50 * gg * (*d_jl)[jloc][lloc]; // qthread_incr(&icut3, 1); laicut3++; accum = 1; } } } if (newtask) { GF_NbWait(&d0); GF_NbWait(&d1); newtask = 0; } } } } if (accum) { GF_NbAcc(g_fock, lo, hi, *f_ij, &ich, const_cast(&one), &f0); GF_NbAcc(g_fock, lo_ik, hi_ik, *f_ik, &ich, const_cast(&one), &f1); GF_NbWait(&f0); GF_NbWait(&f1); } } delete [] f_ij; delete [] d_kl; delete [] f_ik; delete [] d_jl; delete [] s_ij; delete [] s_kl; aicut1 += laicut1; aicut2 += laicut2; aicut3 += laicut3; execTasks += lexecTasks; t1 = tbb::tick_count::now(); TIAccum::reference ltiacc = tiaccum.local(); ltiacc += (t1 - t0).seconds(); } } // TwoElThreadOMP void print_timing(int me) { #ifdef DEBUG typedef std::map ThreadMap; const int nthreads = tbb::task_scheduler_init::default_num_threads(); double accumTimes[nthreads]; ThreadMap tids; int pos = 0; for (int i = 0; i < nthreads; i++) accumTimes[i] = 0.0; for (int i = 0; i < maxTasks; i++) { bool newtid; ThreadMap::const_iterator iter = tids.find(taskIDs[i]); newtid = (iter == tids.end()); if (newtid) tids[taskIDs[i]] = pos++; } for (ThreadMap::const_iterator iter = tids.begin(); iter != tids.end(); iter++) std::cout << "Thread ID: " << iter->first << ", pos: " << iter->second << std::endl; for (int i = 0; i < maxTasks; i++) accumTimes[tids[taskIDs[i]]] += taskTimes[i]; for (int i = 0; i < nthreads; i++) std::cout << "Thread: " << i << ", time: " << accumTimes[i] << std::endl; std::cout << "Main thread ID: " << pthread_self() << std::endl; for (int i = 0; i < maxTasks; i++) { std::cout << "Task: " << i << ", pthread id: " << threadIDs[i] << ", tbb id: " << taskIDs[i] /* << ", CPU set: "; */; /* for (int j = 0; j < CPU_SETSIZE; j++) if (CPU_ISSET(j, &sets[i])) std::cout << j << " "; */ std::cout << ", tlo: " << tlo[i] << ", thi: " << thi[i]; std::cout << std::endl; } #endif if (me == 0) { printf("Time spent in twoel: %f\n", traccum); fflush(stdout); } #ifdef ACCURATE_TIMING std::ostringstream ostr; ostr << "clog.dat." << me; std::ofstream ofs(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); ofs << "icut3: " << icut3 << ", execTasks: " << execTasks << ", time: "; for (TIAccum::const_iterator iter = tiaccum.begin(); iter != tiaccum.end(); iter++) ofs << *iter << " "; ofs << std::flush << std::endl; #endif } // print_timing void print_task_stats(int me, int nproc, int g_a) { std::ostringstream ostr; ostr << "tasks.dat." << me; std::ofstream ofs(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); int *map = new int[2 * 2 * nproc]; int *procs = new int[nproc]; ofs << "Executed real tasks: " << execTasks << std::endl; #if 0 for (PTaskStatsList::const_iterator iter = statsList.begin(); iter != statsList.end(); iter++) { ofs << "List size: " << iter->size() << std::endl << std::endl; for (TaskStatsList::const_iterator iiter = iter->begin(); iiter != iter->end(); iiter++) { ofs << "task id: " << iiter->taskid << ", coords: "; for (int i = 0; i < 4; i++) { int np = GF_Locate_region(g_a, const_cast(iiter->lo[i]), const_cast(iiter->hi[i]), map, procs); for (int j = 0; j < 2; j++) ofs << "(" << iiter->lo[i][j] << ", " << iiter->hi[i][j] << ")"; ofs << ", on procs: "; for (int k = 0; k < np; k++) ofs << procs[k] << " "; ofs << std::endl; } } ofs << std::endl << std::endl; } #else int *hist = new int[nproc], *ghist = NULL; int taskcnt = 0; for (int i = 0; i < nproc; i++) hist[i] = 0; for (PTaskStatsList::const_iterator iter = statsList.begin(); iter != statsList.end(); iter++) for (TaskStatsList::const_iterator iiter = iter->begin(); iiter != iter->end(); iiter++) { for (int i = 1; i < 4; i++) { int np = GF_Locate_region(g_a, const_cast(iiter->lo[i]), const_cast(iiter->hi[i]), map, procs); for (int k = 0; k < np; k++) hist[procs[k]]++; } taskcnt++; } for (int i = 0; i < nproc; i++) ofs << "Proc: " << i << ", comms: " << hist[i] << std::endl; ofs << std::endl; ofs << "Total number of executed tasks: " << taskcnt << std::endl; ofs << std::endl << std::endl; if (me == 0) ghist = new int[nproc]; MPI_Reduce(hist, ghist, nproc, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { ofs << "Global histogram" << std::endl << std::endl; for (int i = 0; i < nproc; i++) ofs << "Proc: " << i << ", tasks: " << ghist[i] << std::endl; delete [] ghist; } delete [] hist; ofs << std::endl << std::endl; for (PTaskStatsList::const_iterator iter = statsList.begin(); iter != statsList.end(); iter++) for (TaskStatsList::const_iterator iiter = iter->begin(); iiter != iter->end(); iiter++) ofs << "Task ID: " << iiter->taskid << ", real: " << iiter->executed << std::endl; #endif delete [] map; delete [] procs; } // print_task_stats ga-5-4/gfutex/examples/scf/integ.h0000644000175000017500000000052512662210467015212 0ustar mbamba#ifdef __cplusplus extern "C" { #endif extern double exprjh(double x); extern void setfm(void); extern void f0(double* value, double t); extern void addin(double *g, int *i, int *j, int *k, int *l, double *fock, double *dens, int *iky); extern void dfill(int *n, double *val, double *a, int *ia); #ifdef __cplusplus } #endif ga-5-4/gfutex/examples/scf/scf.h0000644000175000017500000000106212662210467014654 0ustar mbamba#ifndef __SCF_H #define __SCF_H #ifdef __cplusplus extern "C" { #endif int next_4chunk(int *lo, int *hi, int *ilo, int *jlo, int *klo, int *llo, long int *pitask); void clean_chunk(double chunk[][ichunk]); void g(double *value, int i, int j, int k, int l); double contract_matrices(int g_a, int g_b); long int acquire_tasks(int numTasks); int translate_task(long int itask, int *lo, int *hi, int *ilo, int *jlo, int *klo, int *llo); int next_chunk(int *lo, int *hi); double h(int i, int j); #ifdef __cplusplus } #endif #endif /* __SCF_H */ ga-5-4/gfutex/examples/scf/be.sh0000755000175000017500000000044312662210467014657 0ustar mbamba#!/bin/sh ## Generate input file for SCF if [ $# -lt 1 ] then echo "Usage: $0 " exit 1 fi file=be.inpt /bin/rm -rf $file echo $1 >> $file echo >> $file iters=`expr $1 - 1` for i in `seq 0 $iters` do echo "4 `expr 4 "*" $i`.000 0.000 0.000" >> $file done ga-5-4/gfutex/examples/scf/input.c0000644000175000017500000000464412662210467015244 0ustar mbamba #include "ga.h" #include "cscc.h" #include #include void input(void) { //....................................................................... // Input configuration from an XYZ format file call be.inpt and set up // initial data structures. Atomic numbers from XYZ file are ignored and // an atomic number of 4 (Beryllium) is used instead. //....................................................................... int i, j; static double r; static int ifcnt; double ax_test; // initialize variables natom = 0; for (i = 0; i < maxatom; i++) { ax[i] = 0.0; ay[i] = 0.0; az[i] = 0.0; } if (GA_Nodeid() == 0) { FILE *fp; fp = fopen("be.inpt","r"); fscanf(fp,"%d",&natom); /* Read in coordinates */ for (i = 0; i < natom; i++) { fscanf(fp,"%d",&j); fscanf(fp,"%lf",&ax[i]); fscanf(fp,"%lf",&ay[i]); fscanf(fp,"%lf",&az[i]); } fclose(fp); } GA_Igop(&natom, 1, "+"); GA_Dgop(&ax[0], natom, "+"); GA_Dgop(&ay[0], natom, "+"); GA_Dgop(&az[0], natom, "+"); // Set up s-function centers and nuclear charges //ifcnt = 1; ifcnt = 0; //Fortran Array Index 1===> C Array Index 0===> for (i = 0; i < natom; i++) { q[i] = 4.0; expnt[ifcnt] = 1741.0; expnt[ifcnt + 1] = 262.1; expnt[ifcnt + 2] = 60.33; expnt[ifcnt + 3] = 17.62; expnt[ifcnt + 4] = 5.933; expnt[ifcnt + 5] = 2.185; expnt[ifcnt + 6] = 0.859; expnt[ifcnt + 7] = 0.1806; expnt[ifcnt + 8] = 0.05835; expnt[ifcnt + 9] = 0.3; expnt[ifcnt + 10] = 0.3; expnt[ifcnt + 11] = 0.3; expnt[ifcnt + 12] = 0.3; expnt[ifcnt + 13] = 0.3; expnt[ifcnt + 14] = 0.3; for (j = 0; j < 15; j++) { x[ifcnt] = ax[i]; y[ifcnt] = ay[i]; z[ifcnt] = az[i]; if (j == 9) //10-->9 index tranlation x[ifcnt] += 1.6; if (j == 10) x[ifcnt] -= 1.6; if (j == 11) y[ifcnt] += 1.6; if (j == 12) y[ifcnt] -= 1.6; if (j == 13) z[ifcnt] += 1.6; if (j == 14) z[ifcnt] -= 1.6; ifcnt++; } } // evaluate repulsion energy enrep = 0.0; for (i = 0; i < natom; i++) { for (j = i + 1; j < natom; j++) { r = sqrt((ax[i] - ax[j]) * (ax[i] - ax[j]) + (ay[i] - ay[j]) * (ay[i] - ay[j]) + (az[i] - az[j]) * (az[i] - az[j])); enrep += q[i] * q[j] / r; } } nocc = natom << 1; nbfn = natom * 15; nnbfn = nbfn * (nbfn + 1) / 2; return; } ga-5-4/gfutex/examples/scf/integ.c0000644000175000017500000000573112662210467015211 0ustar mbamba#include #include "cscc.h" #include "ga.h" double fm[2001][5]; double rdelta, delta, delo2; double exprjh(double x) { //$Id: integ.F,v 1.1 2005-03-08 23:58:03 d3g293 Exp $ double ret; // dumb solution to underflow problems on sun if (x < -37.0) { ret = 0.0; } else { ret = exp(x); } return ret; } void setfm(void) { int i, ii; double t[2001]; double et[2001], rr, tt; int MAXm; delta = 0.014; delo2 = delta * 0.5; rdelta = 1.0 / delta; //MAXm = 4; MAXm = 3; //Fortran Array Index 1==> C Array Index 0==> for (i = 0; i < 2001; i++) { tt = delta * (double)i; //i-1 ---> i et[i] = exprjh(-tt); t[i] = tt * 2.0; fm[i][MAXm + 1] = 0.0; } for (i = 199; i > MAXm; i--) { rr = 1.0 / (double)(2 * i + 1); //+1 ---> +1 for (ii = 0; ii < 2001; ii++) { fm[ii][MAXm + 1] = (et[ii] + t[ii] * fm[ii][MAXm + 1]) * rr; } } for (i = MAXm; i >= 0; i--) { rr = 1.0 / (double) (2 * i + 1); //-1 ---> +1 for (ii = 0; ii < 2001; ii++) { fm[ii][i] = (et[ii] + t[ii] * fm[ii][i+1]) * rr; } } return; } void f0(double *value, double t) { const double fac0 = 0.88622692545276; const double rhalf = 0.5; const double rthird = (1.0 / 3.0); const double rquart = 0.25; double t0 = 28.0; //fortran: data --> C: long double or double? int n; double x; // computes f0 to a relative accuracy of better than 4.e-13 for all t. // uses 4th order taylor expansion on grid out to t=28.0 // asymptotic expansion accurate for t greater than 28 if (t >= t0) *value = fac0 / sqrt(t); else { n = (int) ((t + delo2) * rdelta); x = delta * (double) n - t; //n=n+1; //c index 0, fortran index 1 *value = fm[n][0] + x * (fm[n][1] + x * rhalf * (fm[n][2] + x * rthird * (fm[n][3] + x * rquart * fm[n][4]))); } return; } void addin(double *g, int *i, int *j, int *k, int *l, double *fock, double *dens, int *iky) //seems unused { static double g2, g4, gg; static int ij, ik, il, jk, jl, kl; static double aij, aik, ajk, ail, gil; gg = *g; g2 = gg + gg; g4 = g2 + g2; ik = iky[*i] + *k; il = iky[*i] + *l; ij = iky[*i] + *j; jk = iky[MAX(*j,*k)] + MIN(*j,*k); jl = iky[MAX(*j,*l)] + MIN(*j,*l); kl = iky[*k] + *l; aij = g4 * dens[kl] + fock[ij]; fock[kl] = g4 * dens[ij] + fock[kl]; fock[ij] = aij; gil = gg; if (*i == *k || *j == *l) { gg = g2; } if (*j == *k) { gil = g2; } ajk = fock[jk] - gil * dens[il]; ail = fock[il] - gil * dens[jk]; aik = fock[ik] - gg * dens[jl]; fock[jl] -= gg * dens[ik]; fock[jk] = ajk; fock[il] = ail; fock[ik] = aik; return; } void dfill(int *n, double *val, double *a, int *ia) //seems unused { int i; if (*ia == 1) { for (i = 0; i < *n; i++) { a[i] = *val; } } else { for (i = 0; i < (*n - 1) * (*ia) + 1; i += *ia) { a[i] = *val; } } return; } ga-5-4/gfutex/examples/scf/oneel.h0000644000175000017500000000036512662210467015210 0ustar mbamba#ifndef __ONEEL_H #define __ONEEL_H #ifdef __cplusplus extern "C" { #endif void oneel(double schwmax, double *eone, int nproc); void oneel_orig(double schwmax, double *eone, int nproc); #ifdef __cplusplus } #endif #endif /* __ONEEL_H */ ga-5-4/gfutex/examples/scf/oneel.C0000644000175000017500000000154712662210467015146 0ustar mbamba#include #include "cscc.h" #include "scf.h" #include "oneel.h" void oneel(double schwmax, double *eone, int nproc) { int lo[2], hi[2], i, j, iloc, jloc, ld; double work[ichunk][ichunk],tfock[ichunk][ichunk]; int dotask; // fill in the one-electron part of the fock matrix and; // compute the one-electron energy contribution; GA_Zero(g_counter); dotask = next_chunk(lo, hi); ld = ichunk; while (dotask) { NGA_Get(g_schwarz, lo, hi, work, &ld); for (i = lo[0];i <= hi[0];i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; tfock[iloc][jloc] = 0.00; if ((work[iloc][jloc] * schwmax) > tol2e) { tfock[iloc][jloc] = h(i, j); } } } NGA_Put(g_fock, lo, hi, tfock, &ld); dotask = next_chunk(lo, hi); } *eone = 0.50 * contract_matrices(g_fock, g_dens); } // oneel ga-5-4/gfutex/examples/scf/timer.c0000644000175000017500000000207212662210467015216 0ustar mbamba#include #include double timer(void) { // return the time since the last call to timer. // must be initialized by calling once and throwing away the // value // ... use cpu time on multi-user machines // ... use elapsed time on dedicated or single user machines. // //mdc*if unix // real*4 dtime, tt(2) // timer = dble(dtime(tt)) //mdc*elseif tcgmsg //Id: timer.F,v 1.1 2005-03-08 23:58:03 d3g293 Exp $ #if 0 const double million = 1.0e6; static struct timeval tvlast; static int initted = 0; struct timeval tv; struct timezone tz; double ret, t0, t1; gettimeofday(&tv, &tz); if (!initted) { tvlast = tv; initted = 1; } t0 = tvlast.tv_sec * million + tvlast.tv_usec; t1 = tv.tv_sec * million + tvlast.tv_usec; ret = (t1 - t0) / million; tvlast = tv; return ret; #else static int initted = 0; static double pt = 0.0; double ct = 0.0, ret; if (!initted) { pt = MPI_Wtime(); initted = 1; } ct = MPI_Wtime(); ret = ct - pt; pt = ct; return ret; #endif } ga-5-4/gfutex/examples/scf/input.h0000644000175000017500000000013612662210467015241 0ustar mbamba#ifdef __cplusplus extern "C" { #endif extern void input(void); #ifdef __cplusplus } #endif ga-5-4/gfutex/examples/scf/timer.h0000644000175000017500000000014112662210467015216 0ustar mbamba#ifdef __cplusplus extern "C" { #endif extern double timer(void); #ifdef __cplusplus } #endif ga-5-4/gfutex/examples/scf/cscc.h0000644000175000017500000000172612662210467015023 0ustar mbamba#ifndef __CSCC_H #define __CSCC_H #include #ifdef __cplusplus extern "C" { #endif #define maxatom 384 #define maxnbfn 15 * maxatom #define mxiter 30 #define maxnnbfn maxnbfn * (maxnbfn + 1) / 2 #define pi 3.141592653589793 #define tol 0.006 #define tol2e 0.000001 //#define MAX(a,b) GA_MAX(a,b) //#define MIN(a,b) GA_MIN(a,b) #define MAX(a,b) (((a) >= (b)) ? (a) : (b)) #define MIN(a,b) (((a) <= (b)) ? (a) : (b)) extern double enrep, q[maxatom], ax[maxatom], ay[maxatom], az[maxatom], x[maxnbfn], y[maxnbfn], z[maxnbfn], expnt[maxnbfn], rnorm[maxnbfn]; extern long long int iky[maxnbfn], nocc, nbfn, nnbfn; extern long long int icut1,icut2,icut3,icut4; extern int natom; //long long int --> long #define ichunk 40 extern double eigv[maxnbfn]; extern int g_counter, g_dens, g_fock, g_tfock, g_schwarz, g_work, g_ident, g_orbs; extern int g_tmp, g_proc; //temporay global array for storage major transformation #ifdef __cplusplus } #endif #endif /* __CSCC_H */ ga-5-4/gfutex/examples/scf/README0000644000175000017500000000315512662210467014615 0ustar mbambaThis is a converted version of the scf test code in the tcgmsg directory that solves the Hartree-Fock equations for a cluster of beryllium atoms. The main modifications are that this code is uses distributed data instead of replicated data and is based on the GA function calls instead of TCGMSG. The input is a simple XYZ format file of the form 1 Number of beryllium atoms 2 Blank line 3 4 x y z 4 4 x y z . . . Other parameters that control convergence etc. can be found in the cscf.h file. The two-electron Fock build does not make use of the 8-fold symmetry of the two-electron integrals. The default diagonalization routine makes use of a similarity transform so that only a standard eigenvalue problem needs to be solved. A direct solution using a generalized eigenvalue solver can be had by setting the USE_TRANSFORM compiler directive to 0 in the top of the scf.F file. A larger system containing 16 atoms has also been included in this directory. To run the larger problem, just copy the file be16.inpt to be.inpt and run the code. ------------------------------------------------------------------------------- d3y186: (1). C version file list 1.cscc.h 2.input.h 3.input.c 4.integ.h 5.integ.c 6.output.h 7.output.c 8.timer.h 9.timer.c 10.scf.c (2). remove all .F files after checking out from SVN (3). change the path for GA in the Makefile (4). use the command "module load pgi/10.6" to load pgcc use the command "module load mpi/mvapich/1.1/pgi" to load mpi (5). You can compile your GA in Trinity by "gmake TARGET=LINUX64 USE_MPI=y ARMCI_NETWORK=OPENIB CC=pgcc FC=pgf90 LIBMPI="-lmpich -libumad" 2>&1 | tee make.log" ga-5-4/gfutex/examples/scf/twoel.C0000644000175000017500000007016512662210467015200 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cscc.h" #include "scf.h" #include "twoel.h" using namespace globalFutures; namespace globalFutures { extern std::ofstream ofs; } static const int MaxTasks = 1000; static const int MaxExecTasks = 10; typedef double ChunkArray[ichunk][ichunk]; struct LocalBuffers { ChunkArray tf_ij, td_kl, tf_ik, td_jl, ts_ij, ts_kl; }; struct MapProcs { int *map, *procs; MapProcs() : map(NULL), procs(NULL) { }; ~MapProcs() { if (map) delete [] map; if (procs) delete [] procs; }; }; typedef tbb::enumerable_thread_specific TIAccum; typedef tbb::enumerable_thread_specific TLocalBuffers; typedef tbb::enumerable_thread_specific TMapProcs; struct RTaskData { int ntasks; long int tasks[MaxTasks]; RTaskData() : ntasks(0) { }; }; typedef std::map RTaskMap; typedef tbb::enumerable_thread_specific TRTaskMap; static void TwoElTaskExecute(int g_a, int ndims, int plo[], int phi[], void *arg); static void TwoElTaskCheck(int g_a, int ndims, int plo[], int phi[], void *arg); static void TwoElTaskSecondCheck(int g_a, int ndims, int plo[], int phi[], void *arg); static void TwoElTaskSend(int g_a, int ndims, int plo[], int phi[], void *arg); static void TwoElTaskRedist(int g_a, int ndims, int plo[], int phi[], void *arg); struct TwoElExecuteArgs { double schwmax; int ntasks; long int tasks[MaxExecTasks]; }; struct TwoElCheckArgs { double schwmax; long int taskid; int lo[4], hi[4]; }; struct TwoElSecondCheckArgs { int ntasks; long int tasks[MaxTasks]; TwoElSecondCheckArgs() : ntasks(0) { }; }; struct TwoElSendArgs { double schwmax; int ntasks; long int tasks[MaxTasks]; }; struct TwoElComputeArgs { double schwmax; }; struct TwoElTaskRedistArgs { int ntasks; long int tasks[MaxTasks]; }; struct RedistSched { int dst; int ntasks; }; typedef std::vector RedistPlan; typedef tbb::concurrent_queue TaskQueue; typedef tbb::concurrent_hash_map TaskFilter; static TIAccum tiaccum(0.0); static TLocalBuffers localBuffs; static TMapProcs mapProcs; static TRTaskMap ttmap; static int nprocs, nid, me; static GFHandle te_hndl, tch_hndl, t2ch_hndl, ts_hndl, trd_hndl; static tbb::atomic execTasks; static tbb::atomic aicut1, aicut2, aicut3; static bool filter_done = false; static TaskQueue *taskQueue = NULL, *ftaskQueue = NULL; static TaskFilter tfilter; static bool is_task_local(int g_a, int *lo, int *hi, int me, int *map, int *procs); static void add_rtask_and_send(RTaskMap &tmap, long int taskid, int dst, double schwmax); static void flush_rtasks(RTaskMap &tmap, double schwmax); static void flush_sctasks(); static void print_task_stats(int me); static void redistribute_work(int me, RedistPlan &redistPlan); static void send_redist_futures(int me, RedistPlan &redistPlan); static void execute_tasks(int me, double schwmax); static void execute_tasks_nf(int me, double schwmax); int GFInitialize() { int ret = globalFutures::GFInitialize(); te_hndl = GFRegister(TwoElTaskExecute, sizeof(TwoElExecuteArgs)); tch_hndl = GFRegister(TwoElTaskCheck, sizeof(TwoElCheckArgs)); t2ch_hndl = GFRegister(TwoElTaskSecondCheck, sizeof(TwoElSecondCheckArgs)); ts_hndl = GFRegister(TwoElTaskSend, sizeof(TwoElSendArgs)); trd_hndl = GFRegister(TwoElTaskRedist, sizeof(TwoElTaskRedistArgs)); execTasks = 0L; return ret; } // GFInitialize void GFFinalize() { if (taskQueue) delete taskQueue; if (ftaskQueue) delete ftaskQueue; globalFutures::GFFinalize(); } // GFFinalize void twoel_orig(double schwmax, double *etwo, int nproc) { double f_ij[ichunk][ichunk], d_kl[ichunk][ichunk]; double f_ik[ichunk][ichunk], d_jl[ichunk][ichunk]; double s_ij[ichunk][ichunk], s_kl[ichunk][ichunk]; double one; long long int ijcnt, klcnt, ijklcnt; int lo[4], hi[4], lo_ik[2], hi_ik[2], lo_jl[2], hi_jl[2]; int i, j, k, l, iloc, jloc, kloc, lloc, ich, it, jt, kt, lt; int dotask, newtask, accum; long int itask, taskcnt = 0L; int ctask; double gg; ga_nbhdl_t f0, f1; // add in the two-electron contribution to the fock matrix; one = 1.00; ijcnt = icut1; klcnt = icut2; ijklcnt = icut3; ich = ichunk; me = GA_Nodeid(); if (!ftaskQueue || ftaskQueue->empty()) { double t0, t1; assert(!taskQueue); t0 = MPI_Wtime(); taskQueue = new TaskQueue; taskcnt = 0L; GA_Zero(g_counter); dotask = next_4chunk(lo, hi, &it, &jt, &kt, <, &itask); ctask = 0; newtask = 1; accum = 0; while (dotask) { lo_ik[0] = lo[0]; lo_ik[1] = lo[2]; hi_ik[0] = hi[0]; hi_ik[1] = hi[2]; lo_jl[0] = lo[1]; lo_jl[1] = lo[3]; hi_jl[0] = hi[1]; hi_jl[1] = hi[3]; taskcnt++; GF_CachedGet(g_schwarz, lo, hi, s_ij, &ich); clean_chunk(f_ij); clean_chunk(f_ik); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; if ((s_ij[iloc][jloc] * schwmax) < tol2e) icut1 = icut1 + (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1); else { ga_nbhdl_t s, d0, d1; if (newtask) { GF_CachedNbGet(g_schwarz, &lo[2], &hi[2], s_kl, &ich, &s); GF_CachedNbGet(g_dens, &lo[2], &hi[2], d_kl, &ich, &d0); GF_CachedNbGet(g_dens, lo_jl, hi_jl, d_jl, &ich, &d1); GF_CachedNbWait(&s); } for (k = lo[2]; k <= hi[2]; k++) { kloc = k - lo[2]; for (l = lo[3]; l <= hi[3]; l++) { lloc = l - lo[3]; if (s_ij[iloc][jloc] * s_kl[kloc][lloc] < tol2e) icut2 = icut2 + 1; else { if (newtask) { GF_CachedNbWait(&d0); GF_CachedNbWait(&d1); newtask = 0; execTasks++; } g(&gg, i, j, k, l); f_ij[iloc][jloc] = f_ij[iloc][jloc] + gg * d_kl[kloc][lloc]; f_ik[iloc][kloc] = f_ik[iloc][kloc] - 0.50 * gg * d_jl[jloc][lloc]; icut3 = icut3 + 1; accum = 1; } } } if (newtask) { GF_CachedNbWait(&d0); GF_CachedNbWait(&d1); newtask = 0; } } } } if (accum) { // GF_NbAcc(g_fock, lo, hi, f_ij, &ich, &one, &f0); GF_CachedAcc(g_fock, lo, hi, f_ij, &ich, &one); // GF_NbAcc(g_fock, lo_ik, hi_ik, f_ik, &ich, &one, &f1); GF_CachedAcc(g_fock, lo_ik, hi_ik, f_ik, &ich, &one); taskQueue->push(itask); } dotask = next_4chunk(lo, hi, &it, &jt, &kt, <, &itask); if (accum) { // GF_NbWait(&f0); // GF_NbWait(&f1); } if (dotask) { newtask = 1; accum = 0; } ctask++; } ftaskQueue = new TaskQueue(*taskQueue); delete taskQueue; taskQueue = NULL; t1 = MPI_Wtime(); TIAccum::reference ltiacc = tiaccum.local(); ltiacc += (t1 - t0); } else { assert(!taskQueue); taskQueue = new TaskQueue(*ftaskQueue); aicut1 = icut1; aicut2 = icut2; aicut3 = icut3; execute_tasks_nf(me, schwmax); // Actual execution of enqueued tasks delete taskQueue; taskQueue = NULL; icut1 = aicut1; icut2 = aicut2; icut3 = aicut3; } #if 1 std::ostringstream ostr; ostr << "tasks.dat." << me; std::ofstream ofsl(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); ofsl << "Number of tasks inspected: " << taskcnt << std::endl; ofsl << "Executed real tasks: " << execTasks << std::endl << std::endl; for (TIAccum::const_iterator iter = tiaccum.begin(); iter != tiaccum.end(); iter++) ofsl << *iter << " "; ofsl << std::endl << std::endl; tiaccum.clear(); execTasks = 0L; #endif // Flush Fock matrix accumulate cache GF_CacheAccFlush(g_fock); *etwo = 0.50 * contract_matrices(g_fock, g_dens); ijcnt = icut1 - ijcnt; klcnt = icut2 - klcnt; ijklcnt = icut3 - ijklcnt; icut4 = icut3; GF_CacheReadOnlyEmpty(g_dens); if (icut3 > 0) return; // no integrals may be calculated if there is no work for; // this node (ichunk too big), or, something is wrong; printf("no two-electron integrals computed by node %d\n", me); printf("\n"); } // twoel_orig void twoel(double schwmax, double *etwo, int nproc) { int dotask, itask, ndim; int lo[4], hi[4], it, jt, kt, lt; long long int ijcnt, klcnt, ijklcnt; long int taskid, tidlo, tidhi, currLim, incrT, tmpi; double tr0, tr1, tr2, tr3, teaccum, tqaccum, tgaccum, traccum; double tg0, tg1, te0, te1, teqaccum; long long int totTasks, procTasks, ppos; // add in the two-electron contribution to the fock matrix; ijcnt = icut1; klcnt = icut2; ijklcnt = icut3; me = GA_Nodeid(); nid = GA_Cluster_nodeid(); #if 0 if (!ofs.is_open()) { std::ostringstream ostr; ostr << "diags.dat." << me; ofs.open(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); } #endif nprocs = nproc; tmpi = ceil(static_cast(nbfn) / static_cast(ichunk)); incrT = tmpi * tmpi; totTasks = incrT * incrT; procTasks = ceil(static_cast(totTasks) / static_cast(nproc)); tidlo = me * procTasks; tidhi = (me + 1) * procTasks - 1; int *map = new int[2 * 2 * nproc]; int *procs = new int[nproc]; RTaskMap tmap; itask = 0; TwoElCheckArgs tcargs; tcargs.schwmax = schwmax; ndim = GA_Ndim(g_schwarz); aicut1 = icut1; aicut2 = icut2; aicut3 = icut3; teaccum = 0.0; tqaccum = 0.0; tgaccum = 0.0; traccum = 0.0; teqaccum = 0.0; execTasks = 0L; if (!ftaskQueue || ftaskQueue->empty()) { assert(!taskQueue); taskQueue = new TaskQueue; tr0 = MPI_Wtime(); for (taskid = tidlo; taskid <= tidhi; taskid++) { dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); tcargs.taskid = taskid; bool is_local = is_task_local(g_schwarz, lo, hi, me, map, procs); if (dotask && is_local) { memcpy(tcargs.lo, lo, sizeof(lo)); memcpy(tcargs.hi, hi, sizeof(hi)); GFExecute(tch_hndl, g_schwarz, ndim, lo, hi, &tcargs); } else if (dotask && !is_local) add_rtask_and_send(tmap, taskid, procs[0], schwmax); itask++; } flush_rtasks(tmap, schwmax); tr1 = MPI_Wtime(); tr2 = MPI_Wtime(); GFAllQuiesce(); flush_sctasks(); GFAllQuiesce(); tr3 = MPI_Wtime(); traccum += (tr1 - tr0); tqaccum += (tr3 - tr2); RedistPlan plan; tg0 = MPI_Wtime(); redistribute_work(me, plan); send_redist_futures(me, plan); GFAllQuiesce(); tg1 = MPI_Wtime(); tgaccum += (tg1 - tg0); #if 1 size_t qsz = taskQueue->unsafe_size(); size_t *rqsz = new size_t[nproc]; memset(rqsz, 0, sizeof(size_t) * nproc); MPI_Allgather(&qsz, 1, MPI_UNSIGNED_LONG, rqsz, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); if (me == 0) { for (int i = 0; i < nproc; i++) std::cout << "rqsz[" << i << "]: " << rqsz[i] << std::endl; std::cout << std::flush; } delete [] rqsz; #endif ftaskQueue = new TaskQueue(*taskQueue); } else { assert(!taskQueue); taskQueue = new TaskQueue(*ftaskQueue); } te0 = MPI_Wtime(); execute_tasks(me, schwmax); // Actual execution of enqueued tasks te1 = MPI_Wtime(); tr2 = MPI_Wtime(); GFAllQuiesce(); filter_done = true; tr3 = MPI_Wtime(); teaccum += (te1 - te0); teqaccum += (tr3 - tr2); #if 1 std::ostringstream ostr; ostr << "tasks.dat." << me; std::ofstream ofsl(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); ofsl << "Number of tasks inspected: " << itask << ", exec. time: " << teaccum << ", exec. quiesce time: " << teqaccum << ", check time: " << traccum << ", check quiesce time: " << tqaccum << ", redistribution time: " << tgaccum << std::endl; ofsl << "Executed real tasks: " << execTasks << std::endl << std::endl; for (TIAccum::const_iterator iter = tiaccum.begin(); iter != tiaccum.end(); iter++) ofsl << *iter << " "; ofsl << std::endl << std::endl; tiaccum.clear(); #endif icut1 = aicut1; icut2 = aicut2; icut3 = aicut3; #if 0 ofsl << "Cache hits g_schwarz: " << GF_CacheGetHits(g_schwarz) << ", misses: " << GF_CacheGetMisses(g_schwarz) << std::endl; ofsl << "Cache hits g_dens: " << GF_CacheGetHits(g_dens) << ", misses: " << GF_CacheGetMisses(g_dens) << std::endl; ofsl << "Cache hits g_fock: " << GF_CacheGetHits(g_fock) << ", misses: " << GF_CacheGetMisses(g_fock) << std::endl; #endif tr0 = MPI_Wtime(); // Flush Fock matrix accumulate cache GF_CacheAccFlush(g_fock); tr1 = MPI_Wtime(); ofsl << "Acc cache flush time: " << (tr1 - tr0) << std::endl << std::endl; *etwo = 0.50 * contract_matrices(g_fock, g_dens); ijcnt = icut1 - ijcnt; klcnt = icut2 - klcnt; ijklcnt = icut3 - ijklcnt; icut4 = icut3; #if 0 print_task_stats(me); #endif delete [] map; delete [] procs; delete taskQueue; taskQueue = NULL; GF_CacheReadOnlyEmpty(g_dens); if (icut3 > 0) return; // no integrals may be calculated if there is no work for; // this node (ichunk too big), or, something is wrong; printf("no two-electron integrals computed by node %d\n", me); printf("\n"); } // twoel void TwoElTaskExecute(int g_a, int ndims, int plo[], int phi[], void *arg) { const double one = 1.0; TwoElExecuteArgs *teargs; double gg; int i, j, k, l, iloc, jloc, kloc, lloc, ich, it, jt, kt, lt; int lo[4], hi[4], lo_ik[2], hi_ik[2], lo_jl[2], hi_jl[2]; int newtask, accum; ChunkArray *f_ij, *d_kl; ChunkArray *f_ik, *d_jl; ChunkArray *s_ij, *s_kl; ga_nbhdl_t f0, f1; unsigned int lTaskPos; long long int laicut1 = 0L, laicut2 = 0L, laicut3 = 0L; long int lexecTasks = 0L; teargs = reinterpret_cast(arg); TLocalBuffers::reference ltbuffs = localBuffs.local(); f_ij = <buffs.tf_ij; d_kl = <buffs.td_kl; f_ik = <buffs.tf_ik; d_jl = <buffs.td_jl; s_ij = <buffs.ts_ij; s_kl = <buffs.ts_kl; ich = ichunk; tbb::tick_count t0, t1; t0 = tbb::tick_count::now(); for (int pos = 0; pos < teargs->ntasks; pos++) { int dotask; long int taskid = teargs->tasks[pos]; ga_nbhdl_t s; if (filter_done) { TaskFilter::const_accessor cacc; bool found = tfilter.find(cacc, taskid); if (!found) continue; } newtask = 1; accum = 0; dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); assert(dotask); lo_ik[0] = lo[0]; lo_ik[1] = lo[2]; hi_ik[0] = hi[0]; hi_ik[1] = hi[2]; lo_jl[0] = lo[1]; lo_jl[1] = lo[3]; hi_jl[0] = hi[1]; hi_jl[1] = hi[3]; GF_CachedGet(g_schwarz, lo, hi, *s_ij, &ich); GF_CachedNbGet(g_schwarz, &lo[2], &hi[2], *s_kl, &ich, &s); clean_chunk(*f_ij); clean_chunk(*f_ik); for (i = lo[0]; i <= hi[0]; i++) { iloc = i - lo[0]; for (j = lo[1]; j <= hi[1]; j++) { jloc = j - lo[1]; if (((*s_ij)[iloc][jloc] * teargs->schwmax) < tol2e) laicut1 += (hi[2] - lo[2] + 1) * (hi[3] - lo[3] + 1); else { ga_nbhdl_t d0, d1; if (newtask) { GF_CachedNbGet(g_dens, &lo[2], &hi[2], *d_kl, &ich, &d0); GF_CachedNbGet(g_dens, lo_jl, hi_jl, *d_jl, &ich, &d1); GF_CachedNbWait(&s); } for (k = lo[2]; k <= hi[2]; k++) { kloc = k - lo[2]; for (l = lo[3]; l <= hi[3]; l++) { lloc = l - lo[3]; if ((*s_ij)[iloc][jloc] * (*s_kl)[kloc][lloc] < tol2e) laicut2++; else { if (newtask) { GF_CachedNbWait(&d0); GF_CachedNbWait(&d1); newtask = 0; lexecTasks++; } g(&gg, i, j, k, l); (*f_ij)[iloc][jloc] = (*f_ij)[iloc][jloc] + gg * (*d_kl)[kloc][lloc]; (*f_ik)[iloc][kloc] = (*f_ik)[iloc][kloc] - 0.50 * gg * (*d_jl)[jloc][lloc]; laicut3++; accum = 1; } } } if (newtask) { GF_CachedNbWait(&d0); GF_CachedNbWait(&d1); newtask = 0; } } } } if (accum) { // GF_NbAcc(g_fock, lo, hi, *f_ij, &ich, const_cast(&one), &f0); // GF_NbAcc(g_fock, lo_ik, hi_ik, *f_ik, &ich, const_cast(&one), &f1); GF_CachedAcc(g_fock, lo, hi, *f_ij, &ich, const_cast(&one)); GF_CachedAcc(g_fock, lo_ik, hi_ik, *f_ik, &ich, const_cast(&one)); // GF_NbWait(&f0); // GF_NbWait(&f1); if (!filter_done) { TaskFilter::const_accessor cacc; tfilter.insert(cacc, taskid); } } } aicut1 += laicut1; aicut2 += laicut2; aicut3 += laicut3; execTasks += lexecTasks; t1 = tbb::tick_count::now(); TIAccum::reference ltiacc = tiaccum.local(); ltiacc += (t1 - t0).seconds(); } // TwoElTaskExecute void TwoElTaskCheck(int g_a, int ndims, int plo[], int phi[], void *arg) { TwoElCheckArgs *tcargs = reinterpret_cast(arg); bool rte = false; ChunkArray *s_ij; double *rs_ij, *ors_ij; int ich = ichunk; int accs0; int *map, *procs; bool hget0 = false; TLocalBuffers::reference ltbuffs = localBuffs.local(); TMapProcs::reference ltmapProcs = mapProcs.local(); if (!ltmapProcs.map) ltmapProcs.map = new int[2 * 2 * nprocs]; if (!ltmapProcs.procs) ltmapProcs.procs = new int[nprocs]; map = ltmapProcs.map; procs = ltmapProcs.procs; int np = GF_Locate_region(g_schwarz, tcargs->lo, tcargs->hi, map, procs); if (np > 1 || procs[0] != me) hget0 = true; if (hget0) { s_ij = <buffs.ts_ij; GF_CachedGet(g_schwarz, tcargs->lo, tcargs->hi, *s_ij, &ich); rs_ij = &(*s_ij)[0][0]; ors_ij = rs_ij; accs0 = ich; } else { GF_Access(g_schwarz, tcargs->lo, tcargs->hi, &rs_ij, &accs0); ors_ij = rs_ij; } for (int il = tcargs->lo[0]; il <= tcargs->hi[0] && !rte; il++) { int iloc = il - tcargs->lo[0]; rs_ij = (ors_ij + iloc * accs0); for (int jl = tcargs->lo[1]; jl <= tcargs->hi[1] && !rte; jl++) { int jloc = jl - tcargs->lo[1]; if ((*rs_ij * tcargs->schwmax) >= tol2e) rte = true; rs_ij++; } } if (rte) { #if 1 TRTaskMap::reference lttmap = ttmap.local(); np = GF_Locate_region(g_schwarz, &tcargs->lo[2], &tcargs->hi[2], map, procs); RTaskData &tdata = lttmap[procs[0]]; tdata.tasks[tdata.ntasks] = tcargs->taskid; tdata.ntasks++; if (tdata.ntasks == MaxTasks) { TwoElSecondCheckArgs tscargs; tscargs.ntasks = tdata.ntasks; memcpy(tscargs.tasks, tdata.tasks, sizeof(tdata.tasks[0]) * tdata.ntasks); GFExecute(t2ch_hndl, g_proc, 1, &procs[0], &procs[0], &tscargs); tdata.ntasks = 0; } #else taskQueue->push(tcargs->taskid); #endif } if (!hget0) GF_Release(g_schwarz, tcargs->lo, tcargs->hi); } // TwoElTaskCheck void TwoElTaskSecondCheck(int g_a, int ndims, int plo[], int phi[], void *arg) { TwoElSecondCheckArgs *tscargs = reinterpret_cast(arg); ChunkArray *s_kl; double *rs_kl, *ors_kl; int lo[4], hi[4], it, jt, kt, lt; long int taskid; int accs1; int ich = ichunk; int *map, *procs; TLocalBuffers::reference ltbuffs = localBuffs.local(); TMapProcs::reference ltmapProcs = mapProcs.local(); if (!ltmapProcs.map) ltmapProcs.map = new int[2 * 2 * nprocs]; if (!ltmapProcs.procs) ltmapProcs.procs = new int[nprocs]; map = ltmapProcs.map; procs = ltmapProcs.procs; for (int i = 0; i < tscargs->ntasks; i++) { bool rti = false; bool hget1 = false; taskid = tscargs->tasks[i]; bool dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); int np = GF_Locate_region(g_schwarz, &lo[2], &hi[2], map, procs); if (np > 1 || procs[0] != me) hget1 = true; if (hget1) { s_kl = <buffs.ts_kl; GF_CachedGet(g_schwarz, &lo[2], &hi[2], *s_kl, &ich); rs_kl = &(*s_kl)[0][0]; ors_kl = rs_kl; accs1 = ich; } else { GF_Access(g_schwarz, &lo[2], &hi[2], &rs_kl, &accs1); ors_kl = rs_kl; } for (int kl = lo[2]; kl <= hi[2] && !rti; kl++) { int kloc = kl - lo[2]; rs_kl = (ors_kl + kloc * accs1); for (int ll = lo[3]; ll <= hi[3] && !rti; ll++) { int lloc = ll - lo[3]; if (fabs(*rs_kl) >= tol2e) rti = true; rs_kl++; } } if (rti) taskQueue->push(taskid); if (!hget1) GF_Release(g_schwarz, &lo[2], &hi[2]); } } // TwoElTaskSecondCheck void TwoElTaskSend(int g_a, int ndims, int plo[], int phi[], void *arg) { TwoElSendArgs *tsargs = reinterpret_cast(arg); int lo[4], hi[4], it, jt, kt, lt, ndim; bool dotask; long int taskid; TwoElCheckArgs tcargs; tcargs.schwmax = tsargs->schwmax; ndim = GF_Ndim(g_schwarz); for (int i = 0; i < tsargs->ntasks; i++) { taskid = tsargs->tasks[i]; dotask = translate_task(taskid, lo, hi, &it, &jt, &kt, <); tcargs.taskid = taskid; memcpy(tcargs.lo, lo, sizeof(lo)); memcpy(tcargs.hi, hi, sizeof(hi)); GFExecute(tch_hndl, g_schwarz, ndim, lo, hi, &tcargs); } } // TwoElTaskSend void TwoElTaskRedist(int g_a, int ndims, int plo[], int phi[], void *arg) { TwoElTaskRedistArgs *trargs = reinterpret_cast(arg); const int ntasks = trargs->ntasks; for (int i = 0; i < ntasks; i++) taskQueue->push(trargs->tasks[i]); } // TwoElTaskRedist void print_task_stats(int me) { std::ostringstream ostr; ostr << "tasks.dat." << me; std::ofstream ofs(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); ofs << "Executed real tasks: " << execTasks << std::endl << std::endl; for (TIAccum::const_iterator iter = tiaccum.begin(); iter != tiaccum.end(); iter++) ofs << *iter << " "; ofs << std::endl << std::endl; } // print_task_stats bool is_task_local(int g_a, int *lo, int *hi, int me, int *map, int *procs) { int np = GF_Locate_region(g_a, lo, hi, map, procs); return (procs[0] == me); } // is_task_local void add_rtask_and_send(RTaskMap &tmap, long int taskid, int dst, double schwmax) { RTaskData &tdata = tmap[dst]; tdata.tasks[tdata.ntasks] = taskid; tdata.ntasks++; if (tdata.ntasks == MaxTasks) { TwoElSendArgs tsargs; tsargs.schwmax = schwmax; memcpy(tsargs.tasks, tdata.tasks, sizeof(tdata.tasks[0]) * tdata.ntasks); tsargs.ntasks = tdata.ntasks; GFExecute(ts_hndl, g_proc, 1, &dst, &dst, &tsargs); tdata.ntasks = 0; } } // add_rtask_and_send void flush_rtasks(RTaskMap &tmap, double schwmax) { TwoElSendArgs tsargs; tsargs.schwmax = schwmax; for (RTaskMap::iterator iter = tmap.begin(); iter != tmap.end(); iter++) { int dst = iter->first; memcpy(tsargs.tasks, iter->second.tasks, sizeof(iter->second.tasks[0]) * iter->second.ntasks); tsargs.ntasks = iter->second.ntasks; GFExecute(ts_hndl, g_proc, 1, &dst, &dst, &tsargs); iter->second.ntasks = 0; } } // flush_rtasks void flush_sctasks() { TwoElSecondCheckArgs tscargs; for (TRTaskMap::const_iterator iter = ttmap.begin(); iter != ttmap.end(); iter++) for (RTaskMap::const_iterator iiter = iter->begin(); iiter != iter->end(); iiter++) { int dst = iiter->first; memcpy(tscargs.tasks, iiter->second.tasks, sizeof(iiter->second.tasks[0]) * iiter->second.ntasks); tscargs.ntasks = iiter->second.ntasks; GFExecute(t2ch_hndl, g_proc, 1, &dst, &dst, &tscargs); } ttmap.clear(); } // flush_sctasks void redistribute_work(int me, RedistPlan &redistPlan) { size_t qsz = taskQueue->unsafe_size(); size_t *rqsz = new size_t[nprocs] /*, *crqsz = new size_t[nprocs] */; memset(rqsz, 0, sizeof(size_t) * nprocs); MPI_Allgather(&qsz, 1, MPI_UNSIGNED_LONG, rqsz, 1, MPI_UNSIGNED_LONG, MPI_COMM_WORLD); #if 1 if (me == 0) { for (int i = 0; i < nprocs; i++) std::cout << "rqsz[" << i << "]: " << rqsz[i] << std::endl; std::cout << std::flush; } #endif size_t tqsz = 0U, avgt, cavgt; for (int i = 0; i < nprocs; i++) tqsz += rqsz[i]; // Integer floor avgt = tqsz / nprocs; cavgt = (tqsz + nprocs - 1) / nprocs; #if 1 if (me == 0) { std::cout << "avgt: " << avgt << ", cavgt: " << cavgt << std::flush << std::endl; std::cout << "tqsz: " << tqsz << std::endl; for (int i = 0; i < nprocs; i++) if (rqsz[i] > avgt) std::cout << "over avgt: " << i << ", " << rqsz[i] - avgt << std::endl; } #endif // memcpy(crqsz, rqsz, sizeof(size_t) * nprocs); if (rqsz[me] < avgt) goto lend; for (int lme = 0; lme < nprocs; lme++) { for (int i = 0; i < nprocs; i++) { size_t tdd; if (i == me || i == lme) continue; if (rqsz[me] <= cavgt) break; if (rqsz[lme] <= cavgt) break; if (rqsz[i] < cavgt) { tdd = std::min(rqsz[lme] - cavgt, cavgt - rqsz[i]); if (tdd > 0) { rqsz[lme] -= tdd; rqsz[i] += tdd; } if (me == lme && tdd > 0) { RedistSched sch; sch.dst = i; sch.ntasks = tdd; redistPlan.push_back(sch); } } } } lend: #if 0 int *irqsz = new int[nprocs], *rrqsz = new int[nprocs]; memset(irqsz, 0, sizeof(int) * nprocs); memset(rrqsz, 0, sizeof(int) * nprocs); for (RedistPlan::const_iterator iter = redistPlan.begin(); iter != redistPlan.end(); iter++) { irqsz[me] -= iter->ntasks; irqsz[iter->dst] += iter->ntasks; } MPI_Reduce(irqsz, rrqsz, nprocs, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { for (int i = 0; i < nprocs; i++) crqsz[i] += rrqsz[i]; } delete [] rrqsz; delete [] irqsz; std::ostringstream ostr; ostr << "tasks.dat." << me; std::ofstream ofs(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); if (me == 0) { size_t sqsz = 0U; for (int i = 0; i < nprocs; i++) { sqsz += crqsz[i]; ofs << "crqsz[" << i << "]: " << crqsz[i] << std::endl; } ofs << "Total tasks: " << sqsz << std::endl; ofs << std::endl << std::endl; } for (RedistPlan::const_iterator iter = redistPlan.begin(); iter != redistPlan.end(); iter++) ofs << "Send: " << iter->ntasks << ", to proc: " << iter->dst << std::endl; #endif delete [] rqsz; // delete [] crqsz; } // redistribute_work void send_redist_futures(int me, RedistPlan &redistPlan) { for (RedistPlan::iterator iter = redistPlan.begin(); iter != redistPlan.end(); iter++) { long int taskid; bool popped; int outer = (iter->ntasks + MaxTasks - 1) / MaxTasks; int lastBatch = iter->ntasks - (outer - 1) * MaxTasks; if (lastBatch < 0) lastBatch = iter->ntasks; for (int nit = 0; nit < outer; nit++) { TwoElTaskRedistArgs trargs; int pos = 0; int tasksToPop = (nit == (outer - 1)) ? lastBatch : MaxTasks; trargs.ntasks = tasksToPop; for (int i = 0; i < tasksToPop; i++) { popped = taskQueue->try_pop(taskid); assert(popped); trargs.tasks[pos] = taskid; pos++; } GFExecute(trd_hndl, g_proc, 1, &iter->dst, &iter->dst, &trargs); } } } // send_redist_futures void execute_tasks(int me, double schwmax) { long int taskid; bool popped; int qsz = taskQueue->unsafe_size(); int outer = (qsz + MaxExecTasks - 1) / MaxExecTasks; int lastBatch = qsz - (outer - 1) * MaxExecTasks; if (lastBatch < 0) lastBatch = qsz; for (int nit = 0; nit < outer; nit++) { TwoElExecuteArgs teargs; int pos = 0; int tasksToPop = (nit == (outer - 1)) ? lastBatch : MaxExecTasks; teargs.schwmax = schwmax; teargs.ntasks = tasksToPop; for (int i = 0; i < tasksToPop; i++) { popped = taskQueue->try_pop(taskid); assert(popped); teargs.tasks[pos] = taskid; pos++; } GFExecute(te_hndl, g_proc, 1, &me, &me, &teargs); } } // execute_tasks void execute_tasks_nf(int me, double schwmax) { long int taskid; bool popped; int qsz = taskQueue->unsafe_size(); int outer = (qsz + MaxExecTasks - 1) / MaxExecTasks; int lastBatch = qsz - (outer - 1) * MaxExecTasks; if (lastBatch < 0) lastBatch = qsz; for (int nit = 0; nit < outer; nit++) { TwoElExecuteArgs teargs; int pos = 0; int tasksToPop = (nit == (outer - 1)) ? lastBatch : MaxExecTasks; teargs.schwmax = schwmax; teargs.ntasks = tasksToPop; for (int i = 0; i < tasksToPop; i++) { popped = taskQueue->try_pop(taskid); assert(popped); teargs.tasks[pos] = taskid; pos++; } TwoElTaskExecute(g_proc, 1, &me, &me, &teargs); } } // execute_tasks_nf ga-5-4/gfutex/examples/scf/be.inpt0000644000175000017500000001335712662210467015224 0ustar mbamba256 4 0.000 0.000 0.000 4 4.000 0.000 0.000 4 8.000 0.000 0.000 4 12.000 0.000 0.000 4 16.000 0.000 0.000 4 20.000 0.000 0.000 4 24.000 0.000 0.000 4 28.000 0.000 0.000 4 32.000 0.000 0.000 4 36.000 0.000 0.000 4 40.000 0.000 0.000 4 44.000 0.000 0.000 4 48.000 0.000 0.000 4 52.000 0.000 0.000 4 56.000 0.000 0.000 4 60.000 0.000 0.000 4 64.000 0.000 0.000 4 68.000 0.000 0.000 4 72.000 0.000 0.000 4 76.000 0.000 0.000 4 80.000 0.000 0.000 4 84.000 0.000 0.000 4 88.000 0.000 0.000 4 92.000 0.000 0.000 4 96.000 0.000 0.000 4 100.000 0.000 0.000 4 104.000 0.000 0.000 4 108.000 0.000 0.000 4 112.000 0.000 0.000 4 116.000 0.000 0.000 4 120.000 0.000 0.000 4 124.000 0.000 0.000 4 128.000 0.000 0.000 4 132.000 0.000 0.000 4 136.000 0.000 0.000 4 140.000 0.000 0.000 4 144.000 0.000 0.000 4 148.000 0.000 0.000 4 152.000 0.000 0.000 4 156.000 0.000 0.000 4 160.000 0.000 0.000 4 164.000 0.000 0.000 4 168.000 0.000 0.000 4 172.000 0.000 0.000 4 176.000 0.000 0.000 4 180.000 0.000 0.000 4 184.000 0.000 0.000 4 188.000 0.000 0.000 4 192.000 0.000 0.000 4 196.000 0.000 0.000 4 200.000 0.000 0.000 4 204.000 0.000 0.000 4 208.000 0.000 0.000 4 212.000 0.000 0.000 4 216.000 0.000 0.000 4 220.000 0.000 0.000 4 224.000 0.000 0.000 4 228.000 0.000 0.000 4 232.000 0.000 0.000 4 236.000 0.000 0.000 4 240.000 0.000 0.000 4 244.000 0.000 0.000 4 248.000 0.000 0.000 4 252.000 0.000 0.000 4 256.000 0.000 0.000 4 260.000 0.000 0.000 4 264.000 0.000 0.000 4 268.000 0.000 0.000 4 272.000 0.000 0.000 4 276.000 0.000 0.000 4 280.000 0.000 0.000 4 284.000 0.000 0.000 4 288.000 0.000 0.000 4 292.000 0.000 0.000 4 296.000 0.000 0.000 4 300.000 0.000 0.000 4 304.000 0.000 0.000 4 308.000 0.000 0.000 4 312.000 0.000 0.000 4 316.000 0.000 0.000 4 320.000 0.000 0.000 4 324.000 0.000 0.000 4 328.000 0.000 0.000 4 332.000 0.000 0.000 4 336.000 0.000 0.000 4 340.000 0.000 0.000 4 344.000 0.000 0.000 4 348.000 0.000 0.000 4 352.000 0.000 0.000 4 356.000 0.000 0.000 4 360.000 0.000 0.000 4 364.000 0.000 0.000 4 368.000 0.000 0.000 4 372.000 0.000 0.000 4 376.000 0.000 0.000 4 380.000 0.000 0.000 4 384.000 0.000 0.000 4 388.000 0.000 0.000 4 392.000 0.000 0.000 4 396.000 0.000 0.000 4 400.000 0.000 0.000 4 404.000 0.000 0.000 4 408.000 0.000 0.000 4 412.000 0.000 0.000 4 416.000 0.000 0.000 4 420.000 0.000 0.000 4 424.000 0.000 0.000 4 428.000 0.000 0.000 4 432.000 0.000 0.000 4 436.000 0.000 0.000 4 440.000 0.000 0.000 4 444.000 0.000 0.000 4 448.000 0.000 0.000 4 452.000 0.000 0.000 4 456.000 0.000 0.000 4 460.000 0.000 0.000 4 464.000 0.000 0.000 4 468.000 0.000 0.000 4 472.000 0.000 0.000 4 476.000 0.000 0.000 4 480.000 0.000 0.000 4 484.000 0.000 0.000 4 488.000 0.000 0.000 4 492.000 0.000 0.000 4 496.000 0.000 0.000 4 500.000 0.000 0.000 4 504.000 0.000 0.000 4 508.000 0.000 0.000 4 512.000 0.000 0.000 4 516.000 0.000 0.000 4 520.000 0.000 0.000 4 524.000 0.000 0.000 4 528.000 0.000 0.000 4 532.000 0.000 0.000 4 536.000 0.000 0.000 4 540.000 0.000 0.000 4 544.000 0.000 0.000 4 548.000 0.000 0.000 4 552.000 0.000 0.000 4 556.000 0.000 0.000 4 560.000 0.000 0.000 4 564.000 0.000 0.000 4 568.000 0.000 0.000 4 572.000 0.000 0.000 4 576.000 0.000 0.000 4 580.000 0.000 0.000 4 584.000 0.000 0.000 4 588.000 0.000 0.000 4 592.000 0.000 0.000 4 596.000 0.000 0.000 4 600.000 0.000 0.000 4 604.000 0.000 0.000 4 608.000 0.000 0.000 4 612.000 0.000 0.000 4 616.000 0.000 0.000 4 620.000 0.000 0.000 4 624.000 0.000 0.000 4 628.000 0.000 0.000 4 632.000 0.000 0.000 4 636.000 0.000 0.000 4 640.000 0.000 0.000 4 644.000 0.000 0.000 4 648.000 0.000 0.000 4 652.000 0.000 0.000 4 656.000 0.000 0.000 4 660.000 0.000 0.000 4 664.000 0.000 0.000 4 668.000 0.000 0.000 4 672.000 0.000 0.000 4 676.000 0.000 0.000 4 680.000 0.000 0.000 4 684.000 0.000 0.000 4 688.000 0.000 0.000 4 692.000 0.000 0.000 4 696.000 0.000 0.000 4 700.000 0.000 0.000 4 704.000 0.000 0.000 4 708.000 0.000 0.000 4 712.000 0.000 0.000 4 716.000 0.000 0.000 4 720.000 0.000 0.000 4 724.000 0.000 0.000 4 728.000 0.000 0.000 4 732.000 0.000 0.000 4 736.000 0.000 0.000 4 740.000 0.000 0.000 4 744.000 0.000 0.000 4 748.000 0.000 0.000 4 752.000 0.000 0.000 4 756.000 0.000 0.000 4 760.000 0.000 0.000 4 764.000 0.000 0.000 4 768.000 0.000 0.000 4 772.000 0.000 0.000 4 776.000 0.000 0.000 4 780.000 0.000 0.000 4 784.000 0.000 0.000 4 788.000 0.000 0.000 4 792.000 0.000 0.000 4 796.000 0.000 0.000 4 800.000 0.000 0.000 4 804.000 0.000 0.000 4 808.000 0.000 0.000 4 812.000 0.000 0.000 4 816.000 0.000 0.000 4 820.000 0.000 0.000 4 824.000 0.000 0.000 4 828.000 0.000 0.000 4 832.000 0.000 0.000 4 836.000 0.000 0.000 4 840.000 0.000 0.000 4 844.000 0.000 0.000 4 848.000 0.000 0.000 4 852.000 0.000 0.000 4 856.000 0.000 0.000 4 860.000 0.000 0.000 4 864.000 0.000 0.000 4 868.000 0.000 0.000 4 872.000 0.000 0.000 4 876.000 0.000 0.000 4 880.000 0.000 0.000 4 884.000 0.000 0.000 4 888.000 0.000 0.000 4 892.000 0.000 0.000 4 896.000 0.000 0.000 4 900.000 0.000 0.000 4 904.000 0.000 0.000 4 908.000 0.000 0.000 4 912.000 0.000 0.000 4 916.000 0.000 0.000 4 920.000 0.000 0.000 4 924.000 0.000 0.000 4 928.000 0.000 0.000 4 932.000 0.000 0.000 4 936.000 0.000 0.000 4 940.000 0.000 0.000 4 944.000 0.000 0.000 4 948.000 0.000 0.000 4 952.000 0.000 0.000 4 956.000 0.000 0.000 4 960.000 0.000 0.000 4 964.000 0.000 0.000 4 968.000 0.000 0.000 4 972.000 0.000 0.000 4 976.000 0.000 0.000 4 980.000 0.000 0.000 4 984.000 0.000 0.000 4 988.000 0.000 0.000 4 992.000 0.000 0.000 4 996.000 0.000 0.000 4 1000.000 0.000 0.000 4 1004.000 0.000 0.000 4 1008.000 0.000 0.000 4 1012.000 0.000 0.000 4 1016.000 0.000 0.000 4 1020.000 0.000 0.000 ga-5-4/gfutex/examples/scf/output.h0000644000175000017500000000027312662210467015444 0ustar mbamba#ifdef __cplusplus extern "C" { #endif extern void output(double *z, int rowlow, int rowhi, int collow, int colhi, int rowdim, int coldim, int nctl); #ifdef __cplusplus } #endif ga-5-4/gfutex/test/0000755000175000017500000000000012662210462012312 5ustar mbambaga-5-4/gfutex/test/test_gfutex.C0000644000175000017500000000634412662210462014766 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gfutex.h" using namespace tbb; using namespace globalFutures; typedef enumerable_thread_specific TInfo; static void GFTest(int g_a, int ndims, int lo[], int hi[], void *arg); static const int numTimes = 2000; static int g_a; static GFHandle gfhndl; static atomic sum; static int esum = 0; static int *procs_contr = NULL; static TInfo tinfo(0); struct gftestarg { int val; int src; }; int main(int argc, char *argv[]) { int me, nproc; int firstNLP; double t0, t1, t2, t3; MPI_Init(&argc, &argv); GA_Initialize(); GFInitialize(); me = GA_Nodeid(); nproc = GA_Nnodes(); procs_contr = new int[nproc]; for (int i = 0; i < nproc; i++) procs_contr[i] = 0; firstNLP = nproc / GA_Cluster_nnodes(); if (me == 0) { std::cout << "Number of procs: " << nproc << std::endl; std::cout << "Number of nodes: " << GA_Cluster_nnodes() << std::endl; std::cout << "Number of procs per node: " << firstNLP << std::endl; } MPI_Barrier(MPI_COMM_WORLD); #if 0 for (int i = 0; i < nproc; i++) { if (me == i) std:: cout << "Proc: " << me << ", nodeid: " << GA_Cluster_nodeid() << std::flush << std::endl; MPI_Barrier(MPI_COMM_WORLD); } #endif sum = 0; for (int i = 0; i < nproc; i++) esum += (i + 1); int dims[] = { 1000, 1000 }; int lo[] = { 10, 10 }, hi[] = { 10, 10 }; g_a = NGA_Create(MT_DBL, 2, dims, "A", NULL); GA_Print_distribution(g_a); gfhndl = GFRegister(GFTest, sizeof(gftestarg)); gftestarg gfa; gfa.val = me + 1; gfa.src = me; #if 1 t0 = MPI_Wtime(); if (me >= 0) for (int i = 0; i < numTimes; i++) GFExecute(gfhndl, g_a, 2, lo, hi, &gfa); t1 = MPI_Wtime(); MPI_Barrier(MPI_COMM_WORLD); t2 = MPI_Wtime(); GFAllQuiesce(gfhndl); t3 = MPI_Wtime(); if (sum != 0) { std::cout << "Proc: " << me << ", sum: " << std::fixed << sum << ", expected sum: " << numTimes * esum << std::flush << std::endl; std::cout << "Proc: " << me << ", exec. time: " << t1 - t0 << ", quiesce time: " << t3 - t2 << std::flush << std::endl; } #endif #if 0 std::cout << "Proc: " << me << ", added: " << std::fixed << numTimes * gfa.val << std::flush << std::endl; #endif if (sum != 0) for (int i = 0; i < nproc; i++) std::cout << "Proc: " << me << ", procs_contr[" << std::dec << i << "]: " << procs_contr[i] << std::flush << std::endl; std::cout << std::endl; for (TInfo::const_iterator iter = tinfo.begin(); iter != tinfo.end(); iter++) std::cout << *iter << " "; std::cout << std::endl; MPI_Barrier(MPI_COMM_WORLD); GA_Destroy(g_a); GFFinalize(); GA_Terminate(); MPI_Finalize(); delete [] procs_contr; return 0; } // main void GFTest(int g_a, int ndims, int lo[], int hi[], void *arg) { gftestarg *gfa = static_cast(arg); sum += gfa->val; procs_contr[gfa->src] = 1; TInfo::reference ltinfo = tinfo.local(); ltinfo++; } // GFTest ga-5-4/gfutex/config.h.in0000644000175000017500000001401612662210463013361 0ustar mbamba/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 on BlueGene/L systems */ #undef BGL /* Define to 1 on BlueGene/P systems */ #undef BGP /* Define to 1 on Cray XT systems using Catamount */ #undef CATAMOUNT /* Define to 1 on Cray SV1 systems */ #undef CRAY_SV1 /* Define to 1 on Cray SV2 systems */ #undef CRAY_SV2 /* Define to 1 on Cray T3E systems */ #undef CRAY_T3E /* Define to 1 on Cray XT systems */ #undef CRAY_XT /* Define to 1 on Cray YMP systems */ #undef CRAY_YMP /* Define to 1 on Cygnus systems */ #undef CYGNUS /* Define to 1 on Cygwin systems */ #undef CYGWIN /* Define to 1 on DEC OSF */ #undef DECOSF /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP64 /* define if the Boost library is available */ #undef HAVE_BOOST /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* set to 1 if we have the indicated package */ #undef HAVE_GA /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_OMP_H /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* set to 1 if we have the indicated package */ #undef HAVE_TBB /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 on hitachi systems */ #undef HITACHI /* Define to 1 on HP-UX systems */ #undef HPUX /* Define to 1 on 64bit HP-UX systems */ #undef HPUX64 /* Define to 1 on IBM SP systems */ #undef IBM /* Define to 1 on 64bit IBM SP systems */ #undef IBM64 /* Define to 1 on ??? systems */ #undef INTERIX /* Define to 1 on IBM systems with LAPI */ #undef LAPI /* Define to 1 on 64bit IBM systems with LAPI */ #undef LAPI64 /* Define to 1 on generic Linux systems */ #undef LINUX /* Define to 1 on generic 64bit Linux systems */ #undef LINUX64 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 on OSX systems */ #undef MACX /* Define to 1 on 64bit OSX systems */ #undef MACX64 /* Use MPI for messaging */ #undef MSG_COMMS_MPI /* Use TCGMSG for messaging */ #undef MSG_COMMS_TCGMSG /* Use TCGMSG (ipcv4.0) for messaging */ #undef MSG_COMMS_TCGMSG4 /* Use TCGMSG (ipcv5.0) for messaing */ #undef MSG_COMMS_TCGMSG5 /* Define to 1 if assertions should be disabled. */ #undef NDEBUG /* Define to 1 on NEC systems */ #undef NEC /* Define to 1 on 64bit NEC systems */ #undef NEC64 /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 on ??? systems */ #undef SGI /* Define to 1 on ??? systems */ #undef SGITFP /* Define to 1 on ??? systems */ #undef SGI_N32 /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of `float', as computed by sizeof. */ #undef SIZEOF_FLOAT /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long double', as computed by sizeof. */ #undef SIZEOF_LONG_DOUBLE /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* Define to 1 on Solaris systems */ #undef SOLARIS /* Define to 1 on 64bit Solaris systems */ #undef SOLARIS64 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if we want this system to use SYSV shared memory */ #undef SYSV /* deprecated, use MSG_COMMS_TCGMSG */ #undef TCGMSG /* Version number of package */ #undef VERSION /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `unsigned int' if does not define. */ #undef size_t ga-5-4/gfutex/tools/0000755000175000017500000000000012662210463012474 5ustar mbambaga-5-4/gfutex/tools/clean_ipcs.sh0000755000175000017500000000025012662210463015130 0ustar mbamba#!/bin/bash for d in `ipcs -q | awk '{ print $2 }' | grep "[0-9]"` do ipcrm -q $d done for d in `ipcs -m | awk '{ print $2 }' | grep "[0-9]"` do ipcrm -m $d done ga-5-4/gfutex/Makefile.in0000644000175000017500000010502112662210466013403 0ustar mbamba# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test/test_gfutex$(EXEEXT) examples/scf/scf$(EXEEXT) subdir = . DIST_COMMON = $(am__configure_deps) $(include_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(top_srcdir)/configure INSTALL \ build-aux/config.guess build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/ltmain.sh build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../m4/ax_boost_base.m4 \ $(top_srcdir)/../m4/ga.m4 $(top_srcdir)/../m4/ga_ar.m4 \ $(top_srcdir)/../m4/ga_arg_parse.m4 \ $(top_srcdir)/../m4/ga_boost.m4 \ $(top_srcdir)/../m4/ga_check_header.m4 \ $(top_srcdir)/../m4/ga_check_package.m4 \ $(top_srcdir)/../m4/ga_cross_compiling.m4 \ $(top_srcdir)/../m4/ga_mpi_test_disable.m4 \ $(top_srcdir)/../m4/ga_mpi_unwrap.m4 \ $(top_srcdir)/../m4/ga_mpicc.m4 \ $(top_srcdir)/../m4/ga_mpicc_test.m4 \ $(top_srcdir)/../m4/ga_mpicxx.m4 \ $(top_srcdir)/../m4/ga_mpicxx_test.m4 \ $(top_srcdir)/../m4/ga_msg_comms.m4 \ $(top_srcdir)/../m4/ga_target.m4 $(top_srcdir)/../m4/ga_tbb.m4 \ $(top_srcdir)/../m4/ga_with_help.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/lt_obsolete.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libgfutex_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libgfutex_la_OBJECTS = src/gf_cache.lo src/gfutex.lo libgfutex_la_OBJECTS = $(am_libgfutex_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am_examples_scf_scf_OBJECTS = examples/scf/input.$(OBJEXT) \ examples/scf/integ.$(OBJEXT) examples/scf/oneel.$(OBJEXT) \ examples/scf/output.$(OBJEXT) examples/scf/scf.$(OBJEXT) \ examples/scf/sum.$(OBJEXT) examples/scf/timer.$(OBJEXT) \ examples/scf/twoel.$(OBJEXT) examples_scf_scf_OBJECTS = $(am_examples_scf_scf_OBJECTS) examples_scf_scf_LDADD = $(LDADD) am__DEPENDENCIES_1 = examples_scf_scf_DEPENDENCIES = libgfutex.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_test_test_gfutex_OBJECTS = test/test_gfutex.$(OBJEXT) test_test_gfutex_OBJECTS = $(am_test_test_gfutex_OBJECTS) test_test_gfutex_LDADD = $(LDADD) test_test_gfutex_DEPENDENCIES = libgfutex.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libgfutex_la_SOURCES) $(examples_scf_scf_SOURCES) \ $(test_test_gfutex_SOURCES) DIST_SOURCES = $(libgfutex_la_SOURCES) $(examples_scf_scf_SOURCES) \ $(test_test_gfutex_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_LDFLAGS = @BOOST_LDFLAGS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GA_CONFIG = @GA_CONFIG@ GA_CPPFLAGS = @GA_CPPFLAGS@ GA_FLIBS = @GA_FLIBS@ GA_LDFLAGS = @GA_LDFLAGS@ GA_LIBS = @GA_LIBS@ GA_MP_CPPFLAGS = @GA_MP_CPPFLAGS@ GA_MP_LDFLAGS = @GA_MP_LDFLAGS@ GA_MP_LIBS = @GA_MP_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TBB_CPPFLAGS = @TBB_CPPFLAGS@ TBB_LDFLAGS = @TBB_LDFLAGS@ TBB_LIBS = @TBB_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 -I ../m4 EXTRA_DIST = AM_FFLAGS = AM_CFLAGS = AM_CXXFLAGS = AM_CPPFLAGS = -I$(top_srcdir)/src $(TBB_CPPFLAGS) $(BOOST_CPPFLAGS) \ $(GA_CPPFLAGS) $(GA_MP_CPPFLAGS) LDADD = libgfutex.la $(TBB_LIBS) $(GA_LIBS) $(GA_MP_LIBS) $(GA_FLIBS) AM_LDFLAGS = $(TBB_LDFLAGS) $(GA_LDFLAGS) $(GA_MP_LDFLAGS) $(GA_FLIBS) include_HEADERS = src/gfutex.h lib_LTLIBRARIES = libgfutex.la libgfutex_la_SOURCES = src/gf_cache.C src/gfutex.C test_test_gfutex_SOURCES = test/test_gfutex.C examples_scf_scf_SOURCES = examples/scf/cscc.h examples/scf/input.c \ examples/scf/input.h examples/scf/integ.c examples/scf/integ.h \ examples/scf/oneel.C examples/scf/oneel.h \ examples/scf/output.c examples/scf/output.h examples/scf/scf.c \ examples/scf/scf.h examples/scf/sum.c examples/scf/sum.h \ examples/scf/timer.c examples/scf/timer.h examples/scf/twoel.C \ examples/scf/twoel.h all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .C .c .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/gf_cache.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/gfutex.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) libgfutex.la: $(libgfutex_la_OBJECTS) $(libgfutex_la_DEPENDENCIES) $(EXTRA_libgfutex_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) -rpath $(libdir) $(libgfutex_la_OBJECTS) $(libgfutex_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list examples/scf/$(am__dirstamp): @$(MKDIR_P) examples/scf @: > examples/scf/$(am__dirstamp) examples/scf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) examples/scf/$(DEPDIR) @: > examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/input.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/integ.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/oneel.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/output.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/scf.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/sum.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/timer.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/twoel.$(OBJEXT): examples/scf/$(am__dirstamp) \ examples/scf/$(DEPDIR)/$(am__dirstamp) examples/scf/scf$(EXEEXT): $(examples_scf_scf_OBJECTS) $(examples_scf_scf_DEPENDENCIES) $(EXTRA_examples_scf_scf_DEPENDENCIES) examples/scf/$(am__dirstamp) @rm -f examples/scf/scf$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(examples_scf_scf_OBJECTS) $(examples_scf_scf_LDADD) $(LIBS) test/$(am__dirstamp): @$(MKDIR_P) test @: > test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test/$(DEPDIR) @: > test/$(DEPDIR)/$(am__dirstamp) test/test_gfutex.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) test/test_gfutex$(EXEEXT): $(test_test_gfutex_OBJECTS) $(test_test_gfutex_DEPENDENCIES) $(EXTRA_test_test_gfutex_DEPENDENCIES) test/$(am__dirstamp) @rm -f test/test_gfutex$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(test_test_gfutex_OBJECTS) $(test_test_gfutex_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f examples/scf/input.$(OBJEXT) -rm -f examples/scf/integ.$(OBJEXT) -rm -f examples/scf/oneel.$(OBJEXT) -rm -f examples/scf/output.$(OBJEXT) -rm -f examples/scf/scf.$(OBJEXT) -rm -f examples/scf/sum.$(OBJEXT) -rm -f examples/scf/timer.$(OBJEXT) -rm -f examples/scf/twoel.$(OBJEXT) -rm -f src/gf_cache.$(OBJEXT) -rm -f src/gf_cache.lo -rm -f src/gfutex.$(OBJEXT) -rm -f src/gfutex.lo -rm -f test/test_gfutex.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/integ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/oneel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/output.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/scf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/sum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@examples/scf/$(DEPDIR)/twoel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gf_cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/gfutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/test_gfutex.Po@am__quote@ .C.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .C.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .C.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf examples/scf/.libs examples/scf/_libs -rm -rf src/.libs src/_libs -rm -rf test/.libs test/_libs distclean-libtool: -rm -f libtool config.lt install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f examples/scf/$(DEPDIR)/$(am__dirstamp) -rm -f examples/scf/$(am__dirstamp) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f test/$(DEPDIR)/$(am__dirstamp) -rm -f test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf examples/scf/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf examples/scf/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: all check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool ctags dist dist-all dist-bzip2 dist-gzip \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-includeHEADERS \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-includeHEADERS uninstall-libLTLIBRARIES .PHONY: checkprogs checkprogs: $(check_PROGRAMS) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ga-5-4/gfutex/build-aux/0000755000175000017500000000000012662210467013232 5ustar mbambaga-5-4/gfutex/build-aux/config.guess0000755000175000017500000012367212662210467015565 0ustar mbamba#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-11-04' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/gfutex/build-aux/missing0000755000175000017500000002415212662210467014635 0ustar mbamba#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/gfutex/build-aux/depcomp0000755000175000017500000005064312662210467014617 0ustar mbamba#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # 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, 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, see . # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/gfutex/build-aux/config.sub0000755000175000017500000010622312662210467015221 0ustar mbamba#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-12-03' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/gfutex/build-aux/ltmain.sh0000644000175000017500000105154412662210467015064 0ustar mbamba # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -mkl*|-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 ga-5-4/gfutex/build-aux/install-sh0000755000175000017500000003325612662210467015247 0ustar mbamba#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/gfutex/Makefile.am0000644000175000017500000000332412662210467013376 0ustar mbambaACLOCAL_AMFLAGS = -I m4 -I ../m4 EXTRA_DIST = AM_FFLAGS = AM_CFLAGS = AM_CXXFLAGS = AM_CPPFLAGS = AM_CPPFLAGS += -I$(top_srcdir)/src AM_CPPFLAGS += $(TBB_CPPFLAGS) AM_CPPFLAGS += $(BOOST_CPPFLAGS) AM_CPPFLAGS += $(GA_CPPFLAGS) AM_CPPFLAGS += $(GA_MP_CPPFLAGS) LDADD = LDADD += libgfutex.la LDADD += $(TBB_LIBS) LDADD += $(GA_LIBS) LDADD += $(GA_MP_LIBS) LDADD += $(GA_FLIBS) AM_LDFLAGS = AM_LDFLAGS += $(TBB_LDFLAGS) AM_LDFLAGS += $(GA_LDFLAGS) AM_LDFLAGS += $(GA_MP_LDFLAGS) AM_LDFLAGS += $(GA_FLIBS) include_HEADERS = include_HEADERS += src/gfutex.h lib_LTLIBRARIES = lib_LTLIBRARIES += libgfutex.la libgfutex_la_SOURCES = libgfutex_la_SOURCES += src/gf_cache.C libgfutex_la_SOURCES += src/gfutex.C .PHONY: checkprogs checkprogs: $(check_PROGRAMS) check_PROGRAMS = check_PROGRAMS += test/test_gfutex check_PROGRAMS += examples/scf/scf test_test_gfutex_SOURCES = test/test_gfutex.C examples_scf_scf_SOURCES = examples_scf_scf_SOURCES += examples/scf/cscc.h examples_scf_scf_SOURCES += examples/scf/input.c examples_scf_scf_SOURCES += examples/scf/input.h examples_scf_scf_SOURCES += examples/scf/integ.c examples_scf_scf_SOURCES += examples/scf/integ.h examples_scf_scf_SOURCES += examples/scf/oneel.C examples_scf_scf_SOURCES += examples/scf/oneel.h examples_scf_scf_SOURCES += examples/scf/output.c examples_scf_scf_SOURCES += examples/scf/output.h examples_scf_scf_SOURCES += examples/scf/scf.c examples_scf_scf_SOURCES += examples/scf/scf.h examples_scf_scf_SOURCES += examples/scf/sum.c examples_scf_scf_SOURCES += examples/scf/sum.h examples_scf_scf_SOURCES += examples/scf/timer.c examples_scf_scf_SOURCES += examples/scf/timer.h examples_scf_scf_SOURCES += examples/scf/twoel.C examples_scf_scf_SOURCES += examples/scf/twoel.h ga-5-4/gfutex/src/0000755000175000017500000000000012662210466012126 5ustar mbambaga-5-4/gfutex/src/gfutex_internal.h0000644000175000017500000000653412662210466015505 0ustar mbamba#ifndef __GFUTEX_INTERNAL_H #define __GFUTEX_INTERNAL_H #include #include #include #include #include #include #include #include #include using namespace tbb; using namespace boost::interprocess; namespace globalFutures_implementation { extern int nproc, me; extern int nodeme; } namespace globalFutures { struct GPCArgsExec { int g_a; int ndims; int src; int offs; // Remote location to indicate completion of the execution char dat[]; }; struct gfutmsglen { int len; }; struct gfutmsgsnd { char dat[]; }; struct gfutmsgrcv { GFHandle func; // Coming from GPC header GPCArgsExec gpcArgs; // Embedded structure with the rest of the data }; struct ExecutorArgs { RemoteFuncProto func; int shep; GPCArgsExec gpcArgs; }; class MsgqException : public std::exception { private: int errnum; public: MsgqException(int oerrnum) : errnum(oerrnum) { } virtual const char *what() const throw() { return strerror(errnum); } }; class GFutException : public std::exception { private: const std::string str; public: GFutException(const std::string ostr) : str(ostr) { } virtual ~GFutException() throw() { } virtual const char *what() const throw() { return str.c_str(); } }; class RemoteFunction { public: RemoteFunction(RemoteFuncProto ofunc, const size_t oargSz, const size_t oretSz = 0U) : argSz(oargSz), retSz(oretSz), parentTask(NULL), func(ofunc) { } virtual ~RemoteFunction(); virtual void execute(void *buf, size_t bufSz); void finalizeThreads(const bool terminate = true); size_t getArgSz() const { return argSz; } size_t getRetSz() const { return retSz; } RemoteFuncProto getRealFunc() { return func; } task *getParentTask() const { return parentTask; } void setParentTask(task *oParentTask) { parentTask = oParentTask; } void lockParent() { rlock.acquire(mutex); } void unlockParent() { rlock.release(); } protected: typedef queuing_mutex ParentMutex; const size_t argSz; const size_t retSz; task *parentTask; RemoteFuncProto func; ParentMutex mutex; ParentMutex::scoped_lock rlock; }; struct QueueData { message_queue *queue; std::string qname; named_mutex *mutex; std::string mname; QueueData() : queue(NULL), mutex(NULL) { }; QueueData(const QueueData &othis) : queue(othis.queue), qname(othis.qname), mutex(othis.mutex), mname(othis.mname) { }; ~QueueData() { }; }; typedef std::vector FuncArray; typedef queuing_mutex GAMutex; typedef queuing_mutex RetMutex; typedef concurrent_hash_map DirectMap; typedef std::map ProcIdMap; typedef std::vector NodeQueues; struct GFutTask : public task { private: void *rarg; static void msgq_executor(void *arg); public: GFutTask() : rarg(NULL) { } GFutTask(void *orarg) : rarg(orarg) { } explicit GFutTask(const GFutTask &othis) : rarg(othis.rarg) { } ~GFutTask() { if (rarg) delete rarg; } task *execute() { msgq_executor(rarg); return NULL; }; }; } #endif // __GFUTEX_INTERNAL_H ga-5-4/gfutex/src/gf_cache.C0000644000175000017500000003552612662210466013764 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include "gfutex.h" #include "gfutex_internal.h" #include "gf_cache_internal.h" #undef CACHE_STATS namespace globalFutures { using namespace globalFutures_implementation; typedef tbb::enumerable_thread_specific TSum; static GACache cache; static GACacheNBOps nbops; #ifdef CACHE_STATS static GACacheStats cacheStats; #endif template void accumulate(T *cbuf, const T *buf, size_t nelems); static bool is_slice_local(int g_a, int lo[], int hi[]); static size_t type_size(int type); static size_t slice_size(int g_a, int lo[], int hi[]); static bool get_accessor(int g_a, int lo[], int hi[], int ld[], GAInstanceCacheMap::const_accessor &acc); static void get_accessor(int g_a, int lo[], int hi[], int ld[], GAInstanceCacheMap::accessor &acc); static bool try_read_cache(int g_a, int lo[], int hi[], int ld[], void *buf); static void local_accumulate(int g_a, size_t sz, void *cbuf, const void *buf, const void *alpha); static void typed_accumulate(int type, void *cbuf, const void *buf, size_t nelems, const void *alpha); static void create_one(int type, void *alpha); static void dump_cache(std::ofstream &ofs, const int line); std::ofstream ofs; void GF_CachedGet(int g_a, int lo[], int hi[], void *buf, int ld[]) { #if 0 if (!ofs.is_open()) { std::ostringstream ostr; ostr << "diags.dat." << me; ofs.open(ostr.str().c_str(), std::ios_base::out | std::ios_base::app); } #endif if (is_slice_local(g_a, lo, hi)) { GF_Get(g_a, lo, hi, buf, ld); return; } // Optimistic cache search, assume the slice is there... bool incache = try_read_cache(g_a, lo, hi, ld, buf); if (incache) return; GAInstanceCacheMap::accessor inst_mod_acc; get_accessor(g_a, lo, hi, ld, inst_mod_acc); char *&dat = inst_mod_acc->second.getData(); size_t &sz = inst_mod_acc->second.getSize(); size_t ssz = slice_size(g_a, lo, hi); if (!dat) { dat = new char[ssz]; sz = ssz; GF_Get(g_a, lo, hi, buf, ld); memcpy(dat, buf, ssz); } else { assert(dat && (sz == ssz)); memcpy(buf, dat, sz); } } // GF_CachedGet void GF_CachedAcc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha) { if (is_slice_local(g_a, lo, hi)) { GF_Acc(g_a, lo, hi, buf, ld, alpha); return; } // Optimistic cache search, assume the slice is there... GAInstanceCacheMap::accessor inst_mod_acc; get_accessor(g_a, lo, hi, ld, inst_mod_acc); char *&dat = inst_mod_acc->second.getData(); size_t &sz = inst_mod_acc->second.getSize(); if (!dat) { size_t ssz = slice_size(g_a, lo, hi); dat = new char[ssz]; sz = ssz; memset(dat, 0, ssz); } else assert(dat && (sz == slice_size(g_a, lo, hi))); local_accumulate(g_a, sz, dat, buf, alpha); } // GF_CachedAcc void GF_CachedNbGet(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle) { try { bool is_local = is_slice_local(g_a, lo, hi); bool incache = try_read_cache(g_a, lo, hi, ld, buf); GACacheNBOps::const_accessor cacc; bool found = nbops.find(cacc, nbhandle); if (found) { // ofs << "Non-blocking operation found in cache: " << __LINE__ << std::flush << std::endl; throw GFutException("Non-blocking operation should not be in the cache!"); } GASliceNBInfo nbinfo(g_a, lo, hi, buf, ld, is_local, incache); GACacheNBOps::accessor acc; bool ins = nbops.insert(acc, nbhandle); if (!ins) { // ofs << "Non-blocking operation found in cache: " << __LINE__ << std::flush << std::endl; throw GFutException("Non-blocking operation should not be in the cache!"); } // ofs << "Inserted nbop in cache: " << nbhandle << ", is_local: " << is_local << // ", incache: " << incache << std::flush << std::endl; acc->second = nbinfo; if (!incache || is_local) GF_NbGet(g_a, lo, hi, buf, ld, nbhandle); } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GF_CachedNbGet void GF_CachedNbWait(ga_nbhdl_t *nbhandle) { try { GACacheNBOps::const_accessor acc; bool found = nbops.find(acc, nbhandle); if (!found) { // ofs << "Problems with nbop: " << nbhandle << std::flush << std::endl; throw GFutException("Non-blocking operation should be in the cache!"); } bool is_local = acc->second.get_local(); bool incache = acc->second.get_incache(); if (is_local || !incache) GF_NbWait(nbhandle); if (!is_local && !incache) { size_t ssz = slice_size(acc->second.get_g_a(), acc->second.get_lo(), acc->second.get_hi()); GAInstanceCacheMap::accessor inst_acc; get_accessor(acc->second.get_g_a(), acc->second.get_lo(), acc->second.get_hi(), acc->second.get_ld(), inst_acc); char *&dat = inst_acc->second.getData(); size_t &sz = inst_acc->second.getSize(); if (!dat) { dat = new char[ssz]; sz = ssz; memcpy(dat, acc->second.get_buf(), ssz); } else assert(dat && (sz == slice_size(acc->second.get_g_a(), acc->second.get_lo(), acc->second.get_hi()))); } nbops.erase(acc); // Erase record of non-blocking operation } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GF_CachedNbWait void GF_CacheReadOnlyEmpty(int g_a) { GACache::accessor mod_acc; bool found = cache.find(mod_acc, g_a); if (found) { #ifdef CACHE_STATS GACacheStats::accessor sacc; #endif mod_acc->second.cmap.clear(); // Erase all cache entries for GA instance g_a #ifdef CACHE_STATS cacheStats.find(sacc, g_a); sacc->second.hits = 0U; sacc->second.misses = 0U; #endif } } // GF_CacheReadOnlyEmpty void GF_CacheReadWriteFlush(int g_a) { GACache::accessor acc; bool found = cache.find(acc, g_a); if (!found) return; #ifdef CACHE_STATS GACacheStats::accessor sacc; #endif size_t sz = acc->second.cmap.size(); ga_nbhdl_t *hdls = new ga_nbhdl_t[sz]; int pos = 0; for (GAInstanceCacheMap::const_iterator iter = acc->second.cmap.begin(); iter != acc->second.cmap.end(); iter++) { GF_NbPut(g_a, iter->first.get_lo(), iter->first.get_hi(), iter->second.getData(), iter->first.get_ld(), &hdls[pos]); pos++; } for (size_t i = 0U; i < sz; i++) GF_NbWait(&hdls[pos]); acc->second.cmap.clear(); #ifdef CACHE_STATS cacheStats.find(sacc, g_a); sacc->second.hits = 0U; sacc->second.misses = 0U; #endif delete [] hdls; } // GF_CacheReadWriteFlush void GF_CacheAccFlush(int g_a) { GACache::accessor acc; bool found = cache.find(acc, g_a); if (!found) return; int dims[GA_MAX_DIM]; int ndim, type; GF_Inquire(g_a, &type, &ndim, dims); char *alpha = new char[type_size(type)]; #ifdef CACHE_STATS GACacheStats::accessor sacc; #endif size_t sz = acc->second.cmap.size(); ga_nbhdl_t *hdls = new ga_nbhdl_t[sz]; int pos = 0; create_one(type, alpha); for (GAInstanceCacheMap::const_iterator iter = acc->second.cmap.begin(); iter != acc->second.cmap.end(); iter++) { GF_NbAcc(g_a, iter->first.get_lo(), iter->first.get_hi(), iter->second.getData(), iter->first.get_ld(), alpha, &hdls[pos]); pos++; } for (size_t i = 0U; i < sz; i++) GF_NbWait(&hdls[pos]); acc->second.cmap.clear(); #ifdef CACHE_STATS cacheStats.find(sacc, g_a); sacc->second.hits = 0U; sacc->second.misses = 0U; #endif delete [] alpha; delete [] hdls; } // GF_CacheAccFlush unsigned int GF_CacheGetMisses(int g_a) { #ifdef CACHE_STATS GACacheStats::const_accessor acc; bool found = cacheStats.find(acc, g_a); if (found) return acc->second.misses; #endif return 0U; } // GF_CacheGetMisses unsigned int GF_CacheGetHits(int g_a) { #ifdef CACHE_STATS GACacheStats::const_accessor acc; bool found = cacheStats.find(acc, g_a); if (found) return acc->second.hits; #endif return 0U; } // GF_CacheGetHits bool is_slice_local(int g_a, int lo[], int hi[]) { int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; bool ret = false; int np = GF_Locate_region(g_a, lo, hi, map, procs); if (np == 1 && procs[0] == me) ret = true; delete [] map; delete [] procs; return ret; } // is_slice_local size_t type_size(int type) { size_t tsz; switch (type) { case C_CHAR: tsz = sizeof(char); break; case C_DBL: tsz = sizeof(double); break; case C_DCPL: tsz = sizeof(MA_DoubleComplex); break; case C_FLOAT: tsz = sizeof(float); break; case C_INT: tsz = sizeof(int); break; case C_LDBL: tsz = sizeof(MA_LongDouble); break; case C_LDCPL: tsz = sizeof(MA_LongDoubleComplex); break; case C_LONGLONG: tsz = sizeof(long long int); break; case C_LONG: tsz = sizeof(long int); break; case C_SCPL: tsz = sizeof(MA_SingleComplex); break; default: std::cerr << "Proc: " << me << ", GA data type not found! " << type << std::endl; exit(EXIT_FAILURE); } return tsz; } // type_size size_t slice_size(int g_a, int lo[], int hi[]) { int dims[GA_MAX_DIM]; int ndim, type; size_t sz; GF_Inquire(g_a, &type, &ndim, dims); sz = type_size(type); for (int i = 0; i < ndim; i++) sz *= (hi[i] - lo[i] + 1); return sz; } // slice_size bool get_accessor(int g_a, int lo[], int hi[], int ld[], GAInstanceCacheMap::const_accessor &acc) { GACache::const_accessor accessor; cache.insert(accessor, g_a); GASliceKey slkey(g_a, lo, hi, ld); bool slice_found = accessor->second.cmap.find(acc, slkey); accessor.release(); #ifdef CACHE_STATS GACacheStats::accessor sacc; cacheStats.insert(sacc, g_a); if (slice_found) sacc->second.hits++; else sacc->second.misses++; #endif return slice_found; } // get_accessor void get_accessor(int g_a, int lo[], int hi[], int ld[], GAInstanceCacheMap::accessor &acc) { GACache::accessor mod_acc; cache.insert(mod_acc, g_a); GASliceKey slkey(g_a, lo, hi, ld); bool ins = mod_acc->second.cmap.insert(acc, slkey); mod_acc.release(); #ifdef CACHE_STATS GACacheStats::accessor sacc; cacheStats.insert(sacc, g_a); if (ins) sacc->second.misses++; else sacc->second.hits++; #endif } // get_accessor bool try_read_cache(int g_a, int lo[], int hi[], int ld[], void *buf) { GAInstanceCacheMap::const_accessor inst_acc; bool slice_found = get_accessor(g_a, lo, hi, ld, inst_acc); if (slice_found) { size_t sz = inst_acc->second.getSize(); memcpy(buf, inst_acc->second.getData(), sz); } return slice_found; } // try_read_cache template void accumulate(T *cbuf, const T *buf, size_t nelems, const T *alpha) { for (size_t i = 0; i < nelems; i++) cbuf[i] += (*alpha * buf[i]); } // accumulate void local_accumulate(int g_a, size_t sz, void *cbuf, const void *buf, const void *alpha) { int dims[GA_MAX_DIM]; int ndim, type; size_t nelems; GF_Inquire(g_a, &type, &ndim, dims); nelems = sz / type_size(type); typed_accumulate(type, cbuf, buf, nelems, alpha); } // local_accumulate void typed_accumulate(int type, void *cbuf, const void *buf, size_t nelems, const void *alpha) { switch (type) { case C_CHAR: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; case C_DBL: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; case C_FLOAT: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; case C_INT: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; case C_LONGLONG: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; case C_LONG: accumulate(static_cast(cbuf), static_cast(buf), nelems, static_cast(alpha)); break; default: std::cerr << "Proc: " << me << ", unsupported type for cached accumulate: " << type << std::endl; exit(EXIT_FAILURE); } } // typed_accumulate void create_one(int type, void *alpha) { char one[sizeof(long long int)]; memset(one, 0, sizeof(one)); switch (type) { case C_CHAR: one[0] = 1; memcpy(alpha, one, sizeof(char)); break; case C_DBL: *(reinterpret_cast(one)) = 1.0; memcpy(alpha, one, sizeof(double)); break; case C_FLOAT: *(reinterpret_cast(one)) = 1.0f; memcpy(alpha, one, sizeof(float)); break; case C_INT: *(reinterpret_cast(one)) = 1; memcpy(alpha, one, sizeof(int)); break; case C_LONGLONG: *(reinterpret_cast(one)) = 1L; memcpy(alpha, one, sizeof(long long int)); break; case C_LONG: *(reinterpret_cast(one)) = 1L; memcpy(alpha, one, sizeof(long int)); break; default: std::cerr << "Proc: " << me << ", unsupported type for cached accumulate: " << type << std::endl; exit(EXIT_FAILURE); } } // create_one void dump_cache(std::ofstream &ofs, const int line) { for (GACache::const_iterator iter = cache.begin(); iter != cache.end(); iter++) { int ndim = GF_Ndim(iter->first); ofs << line << " slices for g_a: " << iter->first << ", number: " << iter->second.cmap.size() << std::endl << std::endl; for (GAInstanceCacheMap::const_iterator iiter = iter->second.cmap.begin(); iiter != iter->second.cmap.end(); iiter++) { ofs << "g_a: << " << iiter->first.get_g_a() << ", lo: "; for (int i = 0; i < ndim - 1; i++) ofs << iiter->first.get_lo()[i] << " "; ofs << iiter->first.get_lo()[ndim - 1] << ", hi: "; for (int i = 0; i < ndim - 1; i++) ofs << iiter->first.get_hi()[i] << " "; ofs << iiter->first.get_hi()[ndim - 1] << ", sz: " << iiter->second.getSize(); ofs << ", dat: " << std::hex << static_cast(iiter->second.getData()) << std::dec; ofs << std::endl; } } ofs << std::flush; } // dump_cache } ga-5-4/gfutex/src/gf_cache_internal.h0000644000175000017500000001406312662210466015716 0ustar mbamba#ifndef __GF_CACHE_INTERNAL_H #define __GF_CACHE_INTERNAL_H #include #include #include #include #include #include "gfutex.h" namespace globalFutures { extern std::ofstream ofs; } namespace globalFutures_implementation { using namespace tbb; using namespace globalFutures; class GASliceKey { protected: int g_a; int *lo; int *hi; int *ld; public: GASliceKey() : g_a(0), lo(NULL), hi(NULL), ld(NULL) { }; GASliceKey(const int og_a, const int *olo, const int *ohi, const int *old); GASliceKey(const GASliceKey &othis); ~GASliceKey(); int get_g_a() const { return g_a; }; int *get_lo() const { return lo; }; int *get_hi() const { return hi; }; int *get_ld() const { return ld; }; friend class GASliceKeyCompare; }; class GASliceCache { protected: char *data; size_t sz; public: GASliceCache() : data(NULL), sz(0U) { }; GASliceCache(const GASliceCache &othis); ~GASliceCache(); char *&getData() { return data; }; char *getData() const { return data; }; size_t getSize() const { return sz; }; size_t &getSize() { return sz; }; }; class GASliceKeyCompare { public: GASliceKeyCompare() { }; GASliceKeyCompare(const GASliceKeyCompare &othis) { }; ~GASliceKeyCompare() { }; bool equal(const GASliceKey &k, const GASliceKey &j) const; size_t hash(const GASliceKey &k) const; }; class GASliceNBInfo { protected: int g_a; int *lo; int *hi; void *buf; int *ld; bool local; bool incache; public: GASliceNBInfo() : g_a(0), lo(NULL), hi(NULL), buf(NULL), ld(NULL), local(false), incache(false) { }; GASliceNBInfo(int og_a, int *olo, int *ohi, void *obuf, int *old, bool olocal, bool oincache); GASliceNBInfo(const GASliceNBInfo &othis) : g_a(0), lo(NULL), hi(NULL), buf(NULL), ld(NULL), local(false), incache(false) { *this = othis; }; ~GASliceNBInfo(); GASliceNBInfo &operator = (const GASliceNBInfo &othis); int get_g_a() const { return g_a; }; int *get_lo() const { return lo; }; int *get_hi() const { return hi; }; void *get_buf() const { return buf; }; int *get_ld() const { return ld; }; bool get_local() const { return local; }; bool get_incache() const { return incache; }; }; typedef concurrent_hash_map GAInstanceCacheMap; struct GAInstanceCache { GAInstanceCacheMap cmap; GAInstanceCache() { }; GAInstanceCache(const GAInstanceCache &othis) : cmap(othis.cmap) { }; }; struct GAInstanceStats { unsigned int hits; unsigned int misses; GAInstanceStats() : hits(0U), misses(0U) { }; }; typedef concurrent_hash_map GACache; typedef concurrent_hash_map GACacheNBOps; typedef concurrent_hash_map GACacheStats; inline GASliceKey::GASliceKey(const int og_a, const int *olo, const int *ohi, const int *old) : g_a(og_a) { int ndim = GF_Ndim(g_a); lo = new int[ndim]; hi = new int[ndim]; ld = new int[ndim - 1]; for (int i = 0; i < ndim; i++) { lo[i] = olo[i]; hi[i] = ohi[i]; } for (int i = 0; i < ndim - 1; i++) ld[i] = old[i]; } // GASliceKey inline GASliceKey::GASliceKey(const GASliceKey &othis) : g_a(othis.g_a) { int ndim = GF_Ndim(g_a); lo = new int[ndim]; hi = new int[ndim]; ld = new int[ndim - 1]; for (int i = 0; i < ndim; i++) { lo[i] = othis.lo[i]; hi[i] = othis.hi[i]; } for (int i = 0; i < ndim - 1; i++) ld[i] = othis.ld[i]; } // GASliceKey inline GASliceKey::~GASliceKey() { if (lo) delete [] lo; if (hi) delete [] hi; if (ld) delete [] ld; } // ~GASliceKey inline GASliceCache::GASliceCache(const GASliceCache &othis) : data(NULL), sz(othis.sz) { if (sz > 0) { data = new char[sz]; memcpy(data, othis.data, sz); } } // GASliceCache inline GASliceCache::~GASliceCache() { if (data) delete [] data; } // ~GASliceCache inline bool GASliceKeyCompare::equal(const GASliceKey &k, const GASliceKey &j) const { if (k.g_a != j.g_a) return false; int ndim = GF_Ndim(k.g_a); for (int i = 0; i < ndim; i++) { if (k.lo[i] != j.lo[i]) return false; if (k.hi[i] != j.hi[i]) return false; } return true; } // equal inline size_t GASliceKeyCompare::hash(const GASliceKey &k) const { int ndim = GF_Ndim(k.g_a); size_t curr = tbb_hasher(k.g_a); for (int i = 0; i < ndim; i++) curr ^= (tbb_hasher(k.lo[i]) ^ tbb_hasher(k.hi[i])); return curr; } // hash inline GASliceNBInfo::GASliceNBInfo(int og_a, int *olo, int *ohi, void *obuf, int *old, bool olocal, bool oincache) : g_a(og_a), buf(obuf), local(olocal), incache(oincache) { assert(NGA_Valid_handle(g_a)); int ndim = GF_Ndim(g_a); lo = new int[ndim]; hi = new int[ndim]; ld = new int[ndim - 1]; for (int i = 0; i < ndim; i++) { lo[i] = olo[i]; hi[i] = ohi[i]; } for (int i = 0; i < ndim - 1; i++) ld[i] = old[i]; } // GASliceNBInfo inline GASliceNBInfo::~GASliceNBInfo() { if (lo) delete [] lo; if (hi) delete [] hi; if (ld) delete [] ld; } // ~GASliceNBInfo inline GASliceNBInfo &GASliceNBInfo::operator = (const GASliceNBInfo &othis) { g_a = othis.g_a; buf = othis.buf; local = othis.local; incache = othis.incache; if (lo) delete [] lo; if (hi) delete [] hi; if (ld) delete ld; lo = NULL; hi = NULL; ld = NULL; if (NGA_Valid_handle(g_a)) { int ndim = GF_Ndim(g_a); lo = new int[ndim]; hi = new int[ndim]; ld = new int[ndim - 1]; for (int i = 0; i < ndim; i++) { lo[i] = othis.lo[i]; hi[i] = othis.hi[i]; } for (int i = 0; i < ndim - 1; i++) ld[i] = othis.ld[i]; } return *this; } // operator = } #endif // __GF_CACHE_INTERNAL_H ga-5-4/gfutex/src/gfutex.C0000644000175000017500000006200312662210466013535 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gfutex.h" #include "gfutex_internal.h" namespace globalFutures_implementation { int nproc, me; int nodeme; } namespace globalFutures { using namespace globalFutures_implementation; typedef int (*Gpc_Func)(); static const char *const msgq_name = "futures_queue"; static const char *const tbb_nthreads = "TBB_NTHREADS"; static const int maxCnt = INT_MAX / 100; static const int maxRets = 10000000; static const int msgqMaxNumMsgs = 51200; static const int msgqMaxMsgSz = 8192; static const unsigned int complete = 1U; static const unsigned int incomplete = 0U; static int msgLenOff; static int msgDatOff; static message_queue *msgq = NULL; static NodeQueues msgqs; static ProcIdMap pmap; static int nthreads; static int hgpced, hgpcxd; static atomic listen; static GAMutex inGA; // Is any thread in the GA library? static FuncArray funcArray; static unsigned int *pretid_cnt; static char tmpdirname[] = "gfutex_XXXXXX"; static MPI_Comm pcomm; static unsigned int volatile **retptrs; static unsigned int currRetPos; static RetMutex currRetLock; static DirectMap directActivity; static task_scheduler_init *tsched = NULL; static atomic pbcnt, execnt, msgscnt, msgrcnt; static void send_gpc(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg, bool enqueue); static int gpc_enqueue_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); static int gpc_execute_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); static void msgq_listener(); static void wait_remote(GFHandle hndl, int np, int procs[], unsigned int rdata[]); static void process_execmsg(); static int put_value_long(unsigned int val, int offs, int target); static void print_debug_info(); int GFInitialize() { char *retdir, *snthreads; int lendir; MPI_Comm_dup(MPI_COMM_WORLD, &pcomm); // Duplicate MPI_COMM_WORLD for compatibility me = GA_Nodeid(); nproc = GA_Nnodes(); snthreads = getenv(tbb_nthreads); if (snthreads) nthreads = atoi(snthreads) + 1; else nthreads = task_scheduler_init::default_num_threads(); if (me == 0) std::cerr << "Number of TBB threads to use: " << nthreads << std::endl; int nnds = GA_Cluster_nnodes(); if (nnds > 1) tsched = new task_scheduler_init(task_scheduler_init::deferred); else tsched = new task_scheduler_init(nthreads); hgpced = ARMCI_Gpc_register(reinterpret_cast(gpc_enqueue_dispatcher)); hgpcxd = ARMCI_Gpc_register(reinterpret_cast(gpc_execute_dispatcher)); retptrs = new unsigned int volatile *[nproc]; ARMCI_Malloc(reinterpret_cast(const_cast(retptrs)), sizeof(unsigned int) * maxRets); int nid = GA_Cluster_nodeid(); int nodenproc = GA_Cluster_nprocs(nid); for (int i = 0; i < maxRets; i++) retptrs[me][i] = incomplete; for (int i = 0; i < nodenproc; i++) if (me == GA_Cluster_procid(nid, i)) { nodeme = i; break; } try { std::ostringstream ostr; std::string qname; if (nodeme == 0) { for (int i = 0; i < nodenproc; i++) { int rpid = GA_Cluster_procid(nid, i); ostr << msgq_name << rpid; qname = ostr.str(); message_queue::remove(qname.c_str()); message_queue *nqueue = new message_queue(create_only, qname.c_str(), msgqMaxNumMsgs, msgqMaxMsgSz); QueueData qdata; qdata.queue = nqueue; qdata.qname = qname; qdata.mname = qname + "_mutex"; named_mutex::remove(qdata.mname.c_str()); qdata.mutex = new named_mutex(create_only, qdata.mname.c_str()); msgqs.push_back(qdata); ostr.str(""); pmap[rpid] = i; } msgq = msgqs.at(0).queue; MPI_Barrier(pcomm); } else { MPI_Barrier(pcomm); for (int i = 0; i < nodenproc; i++) { int rpid = GA_Cluster_procid(nid, i); ostr << msgq_name << rpid; qname = ostr.str(); message_queue *nqueue = new message_queue(open_only, qname.c_str()); QueueData qdata; qdata.queue = nqueue; qdata.qname = qname; qdata.mname = qname + "_mutex"; qdata.mutex = new named_mutex(open_only, qdata.mname.c_str()); msgqs.push_back(qdata); if (rpid == me) msgq = nqueue; ostr.str(""); pmap[rpid] = i; } } } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } msgLenOff = 1; msgDatOff = nproc + 1; listen = 1U; currRetPos = 0U; pbcnt = 0U; execnt = 0U; msgscnt = 0U; msgrcnt = 0U; MPI_Barrier(pcomm); return 1; } // GFInitialize void GFFinalize() { int retc; MPI_Barrier(pcomm); try { for (FuncArray::iterator iter = funcArray.begin(); iter != funcArray.end(); iter++) { RemoteFunction *func = *iter; if (func) func->finalizeThreads(); } listen = 0U; assert(tsched); delete tsched; for (NodeQueues::iterator iter = msgqs.begin(); iter != msgqs.end(); iter++) { message_queue *q = iter->queue; named_mutex *m = iter->mutex; assert(q); delete q; assert(m); delete m; if (nodeme == 0) { message_queue::remove(iter->qname.c_str()); named_mutex::remove(iter->mname.c_str()); } iter->queue = NULL; iter->mutex = NULL; } } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } MPI_Barrier(pcomm); for (FuncArray::iterator iter = funcArray.begin(); iter != funcArray.end(); iter++) { RemoteFunction *func = *iter; if (func) delete func; } ARMCI_Free(const_cast(retptrs[me])); delete [] retptrs; MPI_Barrier(pcomm); MPI_Comm_free(&pcomm); } // GFFinalize GFHandle GFRegister(RemoteFuncProto func, const size_t argSz, const size_t retSz) { if (argSz > msgqMaxMsgSz) { std::cerr << "GFRegister: Argument size exceeds maximum allowed!, argSz: " << argSz << ", max. allowed: " << msgqMaxMsgSz << std::endl; exit(EXIT_FAILURE); } RemoteFunction *ptr = new RemoteFunction(func, argSz, retSz); funcArray.push_back(ptr); // Elements are owned by the array now MPI_Barrier(pcomm); return funcArray.size() - 1; } // GFRegister void send_gpc(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg, bool enqueue) { try { int *plo, *phi; void *parg; int np; int hgpc; RemoteFunction *ptr = funcArray.at(hndl); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; size_t tlen = sizeof(GPCArgsExec) + sizeof(lo[0]) * ndims + sizeof(hi[0]) * ndims + ptr->getArgSz(); char *sndBuf = new char[tlen]; GPCArgsExec *gpcArgs = reinterpret_cast(sndBuf); bool direct; if (enqueue) hgpc = hgpced; else hgpc = hgpcxd; plo = reinterpret_cast(gpcArgs->dat); phi = plo + ndims; parg = phi + ndims; gpcArgs->g_a = g_a; gpcArgs->ndims = ndims; gpcArgs->src = me; direct = (task::self().parent() == NULL); memcpy(plo, lo, sizeof(lo[0]) * ndims); memcpy(phi, hi, sizeof(hi[0]) * ndims); memcpy(parg, arg, ptr->getArgSz()); np = GF_Locate_region(g_a, lo, hi, map, procs); unsigned int *rdata = new unsigned int[np]; for (int i = 0; i < np; i++) { GAMutex::scoped_lock glock; RetMutex::scoped_lock rlock; unsigned int retPos; unsigned int retDat; rlock.acquire(currRetLock); // Lock position counter retPos = currRetPos++; if (currRetPos == maxRets) currRetPos = 0U; rlock.release(); // Unlock position counter if (retptrs[me][retPos] == complete) { std::cerr << "Error executing GPC for process: " << i << ", from process: " << me << ", too many concurrent GPCs ?" << std::endl; std::cerr << "directActivity.size(): " << directActivity.size() << std::endl; exit(EXIT_FAILURE); } gpcArgs->offs = retPos; // Address to indicate completion rdata[i] = retPos; { DirectMap::accessor a; directActivity.insert(a, retPos); a->second = direct; } glock.acquire(inGA); ARMCI_Gpc_exec(hgpc, procs[i], &hndl, sizeof(hndl), gpcArgs, tlen, NULL, 0, &retDat, sizeof(retDat), NULL); glock.release(); } delete [] rdata; delete [] map; delete [] procs; delete [] sndBuf; } catch (const std::out_of_range &excp) { std::cerr << "Proc: " << me << ", function not registered: " << hndl << ", line:" << __LINE__ << ", " << excp.what() << std::endl; std::cerr << "funcArray.size(): " << funcArray.size() << std::endl; exit(EXIT_FAILURE); } } // send_gpc void GFEnqueue(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg) { send_gpc(hndl, g_a, ndims, lo, hi, arg, true); } // GFEnqueue void GFExecute(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg) { send_gpc(hndl, g_a, ndims, lo, hi, arg, false); } // GFExecute int GFMaxConcurrency() { return maxRets; } // GFMaxConcurrency void GFQuiesce(GFHandle hndl) { try { if (task::self().parent() != NULL) throw GFutException("GFQuiesce() must be called only from the main process!"); bool allquiet; // Now wait for all activities spawned on other processes to complete do { allquiet = true; for (DirectMap::const_iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (iter->second && retptrs[me][pos] != complete) allquiet = false; } } while(!allquiet); // All directly spawned activities are quiesced for this process for (DirectMap::iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (iter->second) { assert(retptrs[me][pos] == complete); retptrs[me][pos] = incomplete; directActivity.erase(pos); } } } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GFQuiesce void GFAllQuiesce(GFHandle hndl) { try { if (task::self().parent() != NULL) throw GFutException("GFQuiesce() must be called only from the main process!"); RemoteFunction *ptr = funcArray.at(hndl); int compcnt; int totcnt; int passcnt = 0; int maxRefCnt = 0; #if 0 tbb::tick_count t0, t1; double taccum = 0.0, caccum = 0.0, waccum = 0.0, raccum = 0.0; #endif // Now wait for all activities spawned locally & on other processes to complete #if 0 t0 = tbb::tick_count::now(); #endif do { compcnt = 0; totcnt = 0; #if 0 tbb::tick_count t2, t3; t2 = tbb::tick_count::now(); #endif for (DirectMap::const_iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (/* iter->second && */ retptrs[me][pos] != complete) compcnt++; } msgq_listener(); #if 0 t3 = tbb::tick_count::now(); caccum += (t3 - t2).seconds(); #endif task *parentTask = ptr->getParentTask(); int refCnt = -1; if (!parentTask) goto reduction; #if 0 t2 = tbb::tick_count::now(); #endif refCnt = parentTask->ref_count(); if (refCnt > maxRefCnt) maxRefCnt = refCnt; if (refCnt > 0) { ptr->lockParent(); parentTask->wait_for_all(); parentTask->destroy(*parentTask); parentTask = new (task::allocate_root()) empty_task; parentTask->set_ref_count(1); ptr->setParentTask(parentTask); ptr->unlockParent(); } #if 0 t3 = tbb::tick_count::now(); waccum += (t3 - t2).seconds(); #endif reduction: #if 0 if (passcnt % 1000000 == 0 && me == 0) { std::cout << "Proc: " << me << ", passcnt: " << passcnt << ", refCnt: " << refCnt << ", compcnt: " << compcnt << std::flush << std::endl; print_debug_info(); std::cout << "Proc: " << me << ", directActivity.size(): " << directActivity.size() << std::flush << std::endl; } #endif #if 0 t2 = tbb::tick_count::now(); #endif MPI_Allreduce(&compcnt, &totcnt, 1, MPI_INT, MPI_SUM, pcomm); #if 0 t3 = tbb::tick_count::now(); raccum += (t3 - t2).seconds(); #endif passcnt++; } while (totcnt > 0 /* && passcnt < maxCnt */); #if 0 t1 = tbb::tick_count::now(); taccum += (t1 - t0).seconds(); #endif MPI_Barrier(pcomm); #if 0 if (me == 0) { for (int i = 0; i < directActivity.size(); i++) std::cout << "Proc: " << me << ", retptrs[" << me << "][" << i << "]: " << (void *)&retptrs[me][i] << std::flush << std::endl; std::cout << "Proc: " << me << ", final passcnt: " << passcnt << ", maxRefCnt: " << maxRefCnt << ", compcnt: " << compcnt << ", totcnt: " << totcnt << std::flush << std::endl; print_debug_info(); std::cout << "Proc: " << me << ", final directActivity.size(): " << directActivity.size() << std::flush << std::endl; } #endif #if 0 std::cout << "Proc: " << me << ", time spent checking: " << std::fixed << taccum << ", passcnt: " << passcnt << std::endl; std::cout << "Proc: " << me << ", time spent in loop: " << caccum << ", time spent waiting for tasks: " << waccum << ", time spent in reduction: " << raccum << std::flush << std::endl; #endif // All spawned activities are quiesced for (DirectMap::iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (retptrs[me][pos] != complete) { std::cerr << "Proc: " << me << ", activity: " << pos << ", should be complete!" << std::flush << std::endl; std::cerr << "Proc: " << me << ", pos: " << pos << ", retptrs: " << retptrs[me][pos] << ", direct: " << iter->second << std::flush << std::endl; } retptrs[me][pos] = incomplete; } directActivity.clear(); // All indirectly spawned activities are quiesced at this point // Safe to call GA without lock MPI_Barrier(pcomm); } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GFAllQuiesce void GFAllQuiesce() { for (GFHandle hndl = 0U; hndl < funcArray.size(); hndl++) GFAllQuiesce(hndl); } // GFAllQuiesce void GF_Access(int g_a, int lo[], int hi[], void *ptr, int ld[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Access(g_a, lo, hi, ptr, ld); lock.release(); } // GF_Access void GF_Release(int g_a, int lo[], int hi[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Release(g_a, lo, hi); lock.release(); } // GF_Release void GF_Get(int g_a, int lo[], int hi[], void *buf, int ld[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Get(g_a, lo, hi, buf, ld); lock.release(); } // GF_Get int GF_Locate_region(int g_a, int lo[], int hi[], int map[], int procs[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); lock.release(); return np; } // GF_Locate_region void GF_Distribution(int g_a, int iproc, int lo[], int hi[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Distribution(g_a, iproc, lo, hi); lock.release(); } // GF_Distribution void GF_Acc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Acc(g_a, lo, hi, buf, ld, alpha); lock.release(); } // GFAcc void GF_NbAcc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha, ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_NbAcc(g_a, lo, hi, buf, ld, alpha, nbhandle); lock.release(); } // GF_NbAcc void GF_NbGet(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_NbGet(g_a, lo, hi, buf, ld, nbhandle); lock.release(); } // GF_NbGet void GF_NbPut(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_NbPut(g_a, lo, hi, buf, ld, nbhandle); lock.release(); } // GF_NbPut void GF_NbWait(ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_NbWait(nbhandle); lock.release(); } // GF_NbWait int GF_Ndim(int g_a) { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Ndim(g_a); lock.release(); return ret; } // GF_Ndim int GF_Cluster_nodeid() { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Cluster_nodeid(); lock.release(); return ret; } // GF_Cluster_nodeid int GF_Cluster_proc_nodeid(int proc) { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Cluster_proc_nodeid(proc); lock.release(); return ret; } // GF_Cluster_proc_nodeid void GF_Inquire(int g_a, int *type, int *ndim, int dims[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Inquire(g_a, type, ndim, dims); lock.release(); } // GF_Inquire // Internal member functions RemoteFunction::~RemoteFunction() { } // ~RemoteFunction void RemoteFunction::execute(void *buf, size_t bufSz) { // Very careful allocation char *rbuf = new char[bufSz + sizeof(ExecutorArgs) - sizeof(GPCArgsExec)]; // Will be deleted as the user or library checks for completion ExecutorArgs *rargs = reinterpret_cast(rbuf); rargs->func = func; memcpy(&rargs->gpcArgs, buf, bufSz); if (!tsched->is_active()) tsched->initialize(nthreads); if (!parentTask) { lockParent(); if (!parentTask) { parentTask = new (task::allocate_root()) empty_task; parentTask->set_ref_count(1); } unlockParent(); } GFutTask *rec = new (parentTask->allocate_child()) GFutTask(rbuf); parentTask->increment_ref_count(); pbcnt++; #if 1 task::enqueue(*rec); #else parentTask->spawn(*rec); #endif } // execute void RemoteFunction::finalizeThreads(const bool terminate) { if (!parentTask) return; if (parentTask->ref_count() > 0) parentTask->wait_for_all(); // Wait for all child tasks to finish parentTask->destroy(*parentTask); parentTask = NULL; } // finalizeThreads // Static function definitions int gpc_enqueue_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { try { gfutmsglen msglen; char *alc = new char[sizeof(gfutmsgsnd) + hlen + dlen]; gfutmsgsnd *msgbuf = reinterpret_cast(alc); msglen.len = hlen + dlen; memcpy(msgbuf->dat, hdr, hlen); memcpy(msgbuf->dat + hlen, data, dlen); ProcIdMap::const_iterator iter = pmap.find(to); if (iter == pmap.end()) throw std::out_of_range("key not found in pmap!"); QueueData &qdata = msgqs.at(iter->second); message_queue *mqueue = qdata.queue; assert(mqueue); scoped_lock lock(*qdata.mutex); bool ret = mqueue->try_send(&msglen, sizeof(msglen), to); if (!ret) throw GFutException("Message queue is full for process!"); ret = mqueue->try_send(msgbuf, hlen + dlen, to); if (!ret) throw GFutException("Message queue is full for process!"); lock.unlock(); msgscnt++; delete [] alc; } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } catch (const std::out_of_range &excp) { std::cerr << excp.what() << ": " << __LINE__ << std::endl; std::cerr << "Proc: " << me << ", to: " << to << ", pmap[to]: " << pmap[to] << std::endl; std::cerr << "Proc: " << me << ", msgqs.size(): " << msgqs.size() << std::endl; exit(EXIT_FAILURE); } return GPC_DONE; } // gpc_enqueue_dispatcher int gpc_execute_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { try { GFHandle hndl; hndl = *(reinterpret_cast(hdr)); RemoteFunction *func = funcArray.at(hndl); func->execute(data, dlen); } catch (const std::out_of_range &excp) { std::cerr << excp.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } return GPC_DONE; } // gpc_execute_dispatcher void msgq_listener() { unsigned int cont_listen; int cnt = 0; do { try { process_execmsg(); cont_listen = listen; cnt++; } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; std::cerr << ex.get_native_error() << ", " << ex.get_error_code(); std::cerr << ", " << size_error << std::endl; exit(EXIT_FAILURE); } } while ((msgq->get_num_msg() > 0) /* && (cnt < maxCnt) */); } // msgq_listener void GFutTask::msgq_executor(void *arg) { ExecutorArgs *earg; int *lo, *hi; void *rarg; earg = reinterpret_cast(arg); lo = reinterpret_cast(earg->gpcArgs.dat); hi = lo + earg->gpcArgs.ndims; rarg = hi + earg->gpcArgs.ndims; earg->func(earg->gpcArgs.g_a, earg->gpcArgs.ndims, lo, hi, rarg); put_value_long(complete, earg->gpcArgs.offs, earg->gpcArgs.src); execnt++; } // msgq_executor void wait_remote(GFHandle hndl, int np, int procs[], unsigned int rdata[]) { bool *status = new bool[np]; bool flag; int cnt = 0; for (int i = 0; i < np; i++) status[i] = false; do { flag = true; for (int i = 0; i < np; i++) { int pos = rdata[i]; if (!status[i]) status[i] = (retptrs[me][pos] == complete); this_tbb_thread::yield(); flag = (flag && status[i]); } cnt++; } while (!flag && cnt < maxCnt); delete [] status; if (cnt >= maxCnt) throw GFutException("wait_remote() exceeded iteration count, response did not arrive"); } // wait_remote void process_execmsg() { gfutmsglen msglen; size_t rsz = 0U; unsigned int prio = 0U; bool ret = msgq->try_receive(&msglen, msgqMaxMsgSz, rsz, prio); if (ret) { assert(rsz == sizeof(msglen)); char *alc = new char[sizeof(gfutmsgsnd) + msglen.len]; // Length of function type is // included in the overall message length gfutmsgrcv *msgbuf = reinterpret_cast(alc); bool oret; do { oret = msgq->try_receive(msgbuf, msgqMaxMsgSz, rsz, prio); } while (!oret); assert(rsz == msglen.len); msgrcnt++; RemoteFunction *func = funcArray.at(msgbuf->func); func->execute(&msgbuf->gpcArgs, rsz - sizeof(msgbuf->func)); delete [] alc; } } // process_execmsg int put_value_long(unsigned int val, int offs, int target) { GAMutex::scoped_lock lock; int ret = 0; lock.acquire(inGA); ret = ARMCI_PutValueInt(val, const_cast(&retptrs[target][offs]), target); ARMCI_Fence(target); lock.release(); return ret; } // put_value_long void print_debug_info() { std::cout << "pbcnt: " << pbcnt << ", execnt: " << execnt << std::flush << std::endl; std::cout << "msgscnt: " << msgscnt << ", msgrcnt: " << msgrcnt << std::endl; std::cout << "number of messages in queue: " << msgq->get_num_msg() << std::endl; std::cout << "listen: " << listen << std::flush << std::endl; } // print_debug_info } ga-5-4/gfutex/src/gfutex.h0000644000175000017500000000443212662210466013604 0ustar mbamba#ifndef __GFUTEX_H #define __GFUTEX_H #include namespace globalFutures { typedef void (*RemoteFuncProto) (int g_a, int ndims, int lo[], int hi[], void *arg); typedef size_t GFHandle; int GFInitialize(); void GFFinalize(); GFHandle GFRegister(RemoteFuncProto func, const size_t argSz, const size_t retSz = 0U); void GFEnqueue(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg); void GFEnqueue(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *iarg, void **&oarg); void GFExecute(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg); void GFExecute(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *iarg, void **&oarg); int GFMaxConcurrency(); void GFQuiesce(); void GFAllQuiesce(); void GFQuiesce(GFHandle hndl); void GFAllQuiesce(GFHandle hndl); // Overloaded GA functions for thread-safety void GF_Access(int g_a, int lo[], int hi[], void *ptr, int ld[]); void GF_Release(int g_a, int lo[], int hi[]); void GF_Get(int g_a, int lo[], int hi[], void *buf, int ld[]); int GF_Locate_region(int g_a, int lo[], int hi[], int map[], int procs[]); void GF_Distribution(int g_a, int iproc, int lo[], int hi[]); void GF_Acc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha); void GF_NbAcc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha, ga_nbhdl_t *nbhandle); void GF_NbGet(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle); void GF_NbPut(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle); void GF_NbWait(ga_nbhdl_t *nbhandle); int GF_Ndim(int g_a); int GF_Cluster_nodeid(); int GF_Cluster_proc_nodeid(int proc); void GF_Inquire(int g_a, int *type, int *ndim, int dims[]); // Caching functions for remote data void GF_CachedGet(int g_a, int lo[], int hi[], void *buf, int ld[]); void GF_CachedAcc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha); void GF_CachedNbGet(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle); void GF_CachedNbWait(ga_nbhdl_t *nbhandle); void GF_CacheReadOnlyEmpty(int g_a); void GF_CacheReadWriteFlush(int g_a); void GF_CacheAccFlush(int g_a); unsigned int GF_CacheGetMisses(int g_a); unsigned int GF_CacheGetHits(int g_a); } #endif // __GFUTEX_H ga-5-4/gfutex/src/micro_gf.C0000644000175000017500000000376012662210466014025 0ustar mbamba#include #include #include #include #include #include #include #include #include "gfutex.h" using namespace globalFutures; static void GFTest(int g_a, int ndims, int lo[], int hi[], void *arg); static const int numTimes = 20000; static int g_proc; static GFHandle gfhndl; struct gftestarg { }; int main(int argc, char *argv[]) { int me, nproc; double t0, t1, t2, t3; MPI_Init(&argc, &argv); GA_Initialize(); GFInitialize(); me = GA_Nodeid(); nproc = GA_Nnodes(); if (me == 0) { std::cout << "Number of procs: " << nproc << std::endl; std::cout << "Number of nodes: " << GA_Cluster_nnodes() << std::endl; } MPI_Barrier(MPI_COMM_WORLD); int dims[] = { nproc }; int lo[] = { nproc - 1 }, hi[] = { nproc - 1 }; g_proc = NGA_Create(MT_INT, 1, dims, "procs", NULL); GA_Print_distribution(g_proc); gfhndl = GFRegister(GFTest, sizeof(gftestarg)); gftestarg gfa; t0 = MPI_Wtime(); if (me == 0) for (int i = 0; i < numTimes; i++) GFEnqueue(gfhndl, g_proc, 1, lo, hi, &gfa); t1 = MPI_Wtime(); MPI_Barrier(MPI_COMM_WORLD); t2 = MPI_Wtime(); GFAllQuiesce(gfhndl); t3 = MPI_Wtime(); std::cout << "Proc: " << me << ", enqueue exec. time: " << t1 - t0 << ", quiesce time: " << t3 - t2 << std::flush << std::endl; MPI_Barrier(MPI_COMM_WORLD); t0 = MPI_Wtime(); if (me == 0) for (int i = 0; i < numTimes; i++) GFExecute(gfhndl, g_proc, 1, lo, hi, &gfa); t1 = MPI_Wtime(); MPI_Barrier(MPI_COMM_WORLD); t2 = MPI_Wtime(); GFAllQuiesce(gfhndl); t3 = MPI_Wtime(); std::cout << "Proc: " << me << ", execute exec. time: " << t1 - t0 << ", quiesce time: " << t3 - t2 << std::flush << std::endl; MPI_Barrier(MPI_COMM_WORLD); GA_Destroy(g_proc); GFFinalize(); GA_Terminate(); MPI_Finalize(); return 0; } // main void GFTest(int g_a, int ndims, int lo[], int hi[], void *arg) { gftestarg *gfa = static_cast(arg); } // GFTest ga-5-4/gfutex/src/gfutex_instr_comm.C0000644000175000017500000006674012662210466016003 0ustar mbamba#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gfutex.h" #include "gfutex_internal.h" namespace globalFutures_implementation { int nproc, me; int nodeme; } namespace globalFutures { using namespace globalFutures_implementation; typedef int (*Gpc_Func)(); struct CommInfo { int target; int g_a; tbb_thread::id tid; }; typedef std::list ProcList; static const char *const msgq_name = "futures_queue"; static const char *const tbb_nthreads = "TBB_NTHREADS"; static const int maxCnt = INT_MAX / 100; static const int maxRets = 10000000; static const int msgqMaxNumMsgs = 51200; static const int msgqMaxMsgSz = 8192; static const unsigned int complete = 1U; static const unsigned int incomplete = 0U; static int msgLenOff; static int msgDatOff; static message_queue *msgq = NULL; static NodeQueues msgqs; static ProcIdMap pmap; static int nthreads; static int hgpced, hgpcxd; static atomic listen; static GAMutex inGA; // Is any thread in the GA library? static FuncArray funcArray; static unsigned int *pretid_cnt; static char tmpdirname[] = "gfutex_XXXXXX"; static MPI_Comm pcomm; static unsigned int volatile **retptrs; static unsigned int currRetPos; static RetMutex currRetLock; static DirectMap directActivity; static task_scheduler_init *tsched = NULL; static atomic pbcnt, execnt, msgscnt, msgrcnt; static ProcList procList; static void send_gpc(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg, bool enqueue); static int gpc_enqueue_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); static int gpc_execute_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype); static void msgq_listener(); static void wait_remote(GFHandle hndl, int np, int procs[], unsigned int rdata[]); static void process_execmsg(); static int put_value_long(unsigned int val, int offs, int target); static void print_debug_info(); int GFInitialize() { char *retdir, *snthreads; int lendir; MPI_Comm_dup(MPI_COMM_WORLD, &pcomm); // Duplicate MPI_COMM_WORLD for compatibility me = GA_Nodeid(); nproc = GA_Nnodes(); snthreads = getenv(tbb_nthreads); if (snthreads) nthreads = atoi(snthreads) + 1; else nthreads = task_scheduler_init::default_num_threads(); if (me == 0) std::cerr << "Number of TBB threads to use: " << nthreads << std::endl; int nnds = GA_Cluster_nnodes(); if (nnds > 1) tsched = new task_scheduler_init(task_scheduler_init::deferred); else tsched = new task_scheduler_init(nthreads); hgpced = ARMCI_Gpc_register(reinterpret_cast(gpc_enqueue_dispatcher)); hgpcxd = ARMCI_Gpc_register(reinterpret_cast(gpc_execute_dispatcher)); retptrs = new unsigned int volatile *[nproc]; ARMCI_Malloc(reinterpret_cast(const_cast(retptrs)), sizeof(unsigned int) * maxRets); int nid = GA_Cluster_nodeid(); int nodenproc = GA_Cluster_nprocs(nid); for (int i = 0; i < maxRets; i++) retptrs[me][i] = incomplete; for (int i = 0; i < nodenproc; i++) if (me == GA_Cluster_procid(nid, i)) { nodeme = i; break; } try { std::ostringstream ostr; std::string qname; if (nodeme == 0) { for (int i = 0; i < nodenproc; i++) { int rpid = GA_Cluster_procid(nid, i); ostr << msgq_name << rpid; qname = ostr.str(); message_queue::remove(qname.c_str()); message_queue *nqueue = new message_queue(create_only, qname.c_str(), msgqMaxNumMsgs, msgqMaxMsgSz); QueueData qdata; qdata.queue = nqueue; qdata.qname = qname; qdata.mname = qname + "_mutex"; named_mutex::remove(qdata.mname.c_str()); qdata.mutex = new named_mutex(create_only, qdata.mname.c_str()); msgqs.push_back(qdata); ostr.str(""); pmap[rpid] = i; } msgq = msgqs.at(0).queue; MPI_Barrier(pcomm); } else { MPI_Barrier(pcomm); for (int i = 0; i < nodenproc; i++) { int rpid = GA_Cluster_procid(nid, i); ostr << msgq_name << rpid; qname = ostr.str(); message_queue *nqueue = new message_queue(open_only, qname.c_str()); QueueData qdata; qdata.queue = nqueue; qdata.qname = qname; qdata.mname = qname + "_mutex"; qdata.mutex = new named_mutex(open_only, qdata.mname.c_str()); msgqs.push_back(qdata); if (rpid == me) msgq = nqueue; ostr.str(""); pmap[rpid] = i; } } } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } msgLenOff = 1; msgDatOff = nproc + 1; listen = 1U; currRetPos = 0U; pbcnt = 0U; execnt = 0U; msgscnt = 0U; msgrcnt = 0U; MPI_Barrier(pcomm); return 1; } // GFInitialize void GFFinalize() { int retc; std::ostringstream ostr; std::string fname; ostr << "comms.dat." << me; fname = ostr.str(); std::ofstream ofs(fname.c_str()); for (ProcList::const_iterator iter = procList.begin(); iter != procList.end(); iter++) ofs << iter->target << ", " << iter->g_a << ", " << iter->tid << std::endl; ofs.close(); MPI_Barrier(pcomm); try { for (FuncArray::iterator iter = funcArray.begin(); iter != funcArray.end(); iter++) { RemoteFunction *func = *iter; if (func) func->finalizeThreads(); } listen = 0U; assert(tsched); delete tsched; for (NodeQueues::iterator iter = msgqs.begin(); iter != msgqs.end(); iter++) { message_queue *q = iter->queue; named_mutex *m = iter->mutex; assert(q); delete q; assert(m); delete m; if (nodeme == 0) { message_queue::remove(iter->qname.c_str()); named_mutex::remove(iter->mname.c_str()); } iter->queue = NULL; iter->mutex = NULL; } } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } MPI_Barrier(pcomm); for (FuncArray::iterator iter = funcArray.begin(); iter != funcArray.end(); iter++) { RemoteFunction *func = *iter; if (func) delete func; } ARMCI_Free(const_cast(retptrs[me])); delete [] retptrs; MPI_Barrier(pcomm); MPI_Comm_free(&pcomm); } // GFFinalize GFHandle GFRegister(RemoteFuncProto func, const size_t argSz, const size_t retSz) { if (argSz > msgqMaxMsgSz) { std::cerr << "GFRegister: Argument size exceeds maximum allowed!, argSz: " << argSz << ", max. allowed: " << msgqMaxMsgSz << std::endl; exit(EXIT_FAILURE); } RemoteFunction *ptr = new RemoteFunction(func, argSz, retSz); funcArray.push_back(ptr); // Elements are owned by the array now MPI_Barrier(pcomm); return funcArray.size() - 1; } // GFRegister void send_gpc(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg, bool enqueue) { try { int *plo, *phi; void *parg; int np; int hgpc; RemoteFunction *ptr = funcArray.at(hndl); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; size_t tlen = sizeof(GPCArgsExec) + sizeof(lo[0]) * ndims + sizeof(hi[0]) * ndims + ptr->getArgSz(); char *sndBuf = new char[tlen]; GPCArgsExec *gpcArgs = reinterpret_cast(sndBuf); bool direct; if (enqueue) hgpc = hgpced; else hgpc = hgpcxd; plo = reinterpret_cast(gpcArgs->dat); phi = plo + ndims; parg = phi + ndims; gpcArgs->g_a = g_a; gpcArgs->ndims = ndims; gpcArgs->src = me; direct = (task::self().parent() == NULL); memcpy(plo, lo, sizeof(lo[0]) * ndims); memcpy(phi, hi, sizeof(hi[0]) * ndims); memcpy(parg, arg, ptr->getArgSz()); np = GF_Locate_region(g_a, lo, hi, map, procs); unsigned int *rdata = new unsigned int[np]; for (int i = 0; i < np; i++) { GAMutex::scoped_lock glock; RetMutex::scoped_lock rlock; unsigned int retPos; unsigned int retDat; rlock.acquire(currRetLock); // Lock position counter retPos = currRetPos++; if (currRetPos == maxRets) currRetPos = 0U; rlock.release(); // Unlock position counter if (retptrs[me][retPos] == complete) { std::cerr << "Error executing GPC for process: " << i << ", from process: " << me << ", too many concurrent GPCs ?" << std::endl; std::cerr << "directActivity.size(): " << directActivity.size() << std::endl; exit(EXIT_FAILURE); } gpcArgs->offs = retPos; // Address to indicate completion rdata[i] = retPos; { DirectMap::accessor a; directActivity.insert(a, retPos); a->second = direct; } glock.acquire(inGA); ARMCI_Gpc_exec(hgpc, procs[i], &hndl, sizeof(hndl), gpcArgs, tlen, NULL, 0, &retDat, sizeof(retDat), NULL); glock.release(); } delete [] rdata; delete [] map; delete [] procs; delete [] sndBuf; } catch (const std::out_of_range &excp) { std::cerr << "Proc: " << me << ", function not registered: " << hndl << ", line:" << __LINE__ << ", " << excp.what() << std::endl; std::cerr << "funcArray.size(): " << funcArray.size() << std::endl; exit(EXIT_FAILURE); } } // send_gpc void GFEnqueue(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg) { send_gpc(hndl, g_a, ndims, lo, hi, arg, true); } // GFEnqueue void GFExecute(GFHandle hndl, int g_a, int ndims, int lo[], int hi[], void *arg) { send_gpc(hndl, g_a, ndims, lo, hi, arg, false); } // GFExecute int GFMaxConcurrency() { return maxRets; } // GFMaxConcurrency void GFQuiesce(GFHandle hndl) { try { if (task::self().parent() != NULL) throw GFutException("GFQuiesce() must be called only from the main process!"); bool allquiet; // Now wait for all activities spawned on other processes to complete do { allquiet = true; for (DirectMap::const_iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (iter->second && retptrs[me][pos] != complete) allquiet = false; } } while(!allquiet); // All directly spawned activities are quiesced for this process for (DirectMap::iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (iter->second) { assert(retptrs[me][pos] == complete); retptrs[me][pos] = incomplete; directActivity.erase(pos); } } } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GFQuiesce void GFAllQuiesce(GFHandle hndl) { try { if (task::self().parent() != NULL) throw GFutException("GFQuiesce() must be called only from the main process!"); RemoteFunction *ptr = funcArray.at(hndl); int compcnt; int totcnt; int passcnt = 0; int maxRefCnt = 0; #if 0 tbb::tick_count t0, t1; double taccum = 0.0, caccum = 0.0, waccum = 0.0, raccum = 0.0; #endif // Now wait for all activities spawned locally & on other processes to complete #if 0 t0 = tbb::tick_count::now(); #endif do { compcnt = 0; totcnt = 0; #if 0 tbb::tick_count t2, t3; t2 = tbb::tick_count::now(); #endif for (DirectMap::const_iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (/* iter->second && */ retptrs[me][pos] != complete) compcnt++; } msgq_listener(); #if 0 t3 = tbb::tick_count::now(); caccum += (t3 - t2).seconds(); #endif task *parentTask = ptr->getParentTask(); int refCnt = -1; if (!parentTask) goto reduction; #if 0 t2 = tbb::tick_count::now(); #endif refCnt = parentTask->ref_count(); if (refCnt > maxRefCnt) maxRefCnt = refCnt; if (refCnt > 0) { ptr->lockParent(); parentTask->wait_for_all(); parentTask->destroy(*parentTask); parentTask = new (task::allocate_root()) empty_task; parentTask->set_ref_count(1); ptr->setParentTask(parentTask); ptr->unlockParent(); } #if 0 t3 = tbb::tick_count::now(); waccum += (t3 - t2).seconds(); #endif reduction: #if 0 if (passcnt % 1000000 == 0 && me == 0) { std::cout << "Proc: " << me << ", passcnt: " << passcnt << ", refCnt: " << refCnt << ", compcnt: " << compcnt << std::flush << std::endl; print_debug_info(); std::cout << "Proc: " << me << ", directActivity.size(): " << directActivity.size() << std::flush << std::endl; } #endif #if 0 t2 = tbb::tick_count::now(); #endif MPI_Allreduce(&compcnt, &totcnt, 1, MPI_INT, MPI_SUM, pcomm); #if 0 t3 = tbb::tick_count::now(); raccum += (t3 - t2).seconds(); #endif passcnt++; } while (totcnt > 0 /* && passcnt < maxCnt */); #if 0 t1 = tbb::tick_count::now(); taccum += (t1 - t0).seconds(); #endif MPI_Barrier(pcomm); #if 0 if (me == 0) { for (int i = 0; i < directActivity.size(); i++) std::cout << "Proc: " << me << ", retptrs[" << me << "][" << i << "]: " << (void *)&retptrs[me][i] << std::flush << std::endl; std::cout << "Proc: " << me << ", final passcnt: " << passcnt << ", maxRefCnt: " << maxRefCnt << ", compcnt: " << compcnt << ", totcnt: " << totcnt << std::flush << std::endl; print_debug_info(); std::cout << "Proc: " << me << ", final directActivity.size(): " << directActivity.size() << std::flush << std::endl; } #endif #if 0 std::cout << "Proc: " << me << ", time spent checking: " << std::fixed << taccum << ", passcnt: " << passcnt << std::endl; std::cout << "Proc: " << me << ", time spent in loop: " << caccum << ", time spent waiting for tasks: " << waccum << ", time spent in reduction: " << raccum << std::flush << std::endl; #endif // All spawned activities are quiesced for (DirectMap::iterator iter = directActivity.begin(); iter != directActivity.end(); iter++) { unsigned int pos = iter->first; if (retptrs[me][pos] != complete) { std::cerr << "Proc: " << me << ", activity: " << pos << ", should be complete!" << std::flush << std::endl; std::cerr << "Proc: " << me << ", pos: " << pos << ", retptrs: " << retptrs[me][pos] << ", direct: " << iter->second << std::flush << std::endl; } retptrs[me][pos] = incomplete; } directActivity.clear(); // All indirectly spawned activities are quiesced at this point // Safe to call GA without lock MPI_Barrier(pcomm); } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } } // GFAllQuiesce void GFAllQuiesce() { for (GFHandle hndl = 0U; hndl < funcArray.size(); hndl++) GFAllQuiesce(hndl); } // GFAllQuiesce void GF_Access(int g_a, int lo[], int hi[], void *ptr, int ld[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Access(g_a, lo, hi, ptr, ld); lock.release(); } // GF_Access void GF_Release(int g_a, int lo[], int hi[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Release(g_a, lo, hi); lock.release(); } // GF_Release void GF_Get(int g_a, int lo[], int hi[], void *buf, int ld[]) { GAMutex::scoped_lock lock; int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); for (int i = 0; i < np; i++) { CommInfo cinfo; cinfo.target = procs[i]; cinfo.g_a = g_a; cinfo.tid = this_tbb_thread::get_id(); procList.push_back(cinfo); } ::NGA_Get(g_a, lo, hi, buf, ld); lock.release(); delete [] procs; delete [] map; } // GF_Get int GF_Locate_region(int g_a, int lo[], int hi[], int map[], int procs[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); lock.release(); return np; } // GF_Locate_region void GF_Distribution(int g_a, int iproc, int lo[], int hi[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Distribution(g_a, iproc, lo, hi); lock.release(); } // GF_Distribution void GF_Acc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha) { GAMutex::scoped_lock lock; int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); for (int i = 0; i < np; i++) { CommInfo cinfo; cinfo.target = procs[i]; cinfo.g_a = g_a; cinfo.tid = this_tbb_thread::get_id(); procList.push_back(cinfo); } ::NGA_Acc(g_a, lo, hi, buf, ld, alpha); lock.release(); delete [] procs; delete [] map; } // GFAcc void GF_NbAcc(int g_a, int lo[], int hi[], void *buf, int ld[], void *alpha, ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); for (int i = 0; i < np; i++) { CommInfo cinfo; cinfo.target = procs[i]; cinfo.g_a = g_a; cinfo.tid = this_tbb_thread::get_id(); procList.push_back(cinfo); } ::NGA_NbAcc(g_a, lo, hi, buf, ld, alpha, nbhandle); lock.release(); delete [] procs; delete [] map; } // GF_NbAcc void GF_NbGet(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); for (int i = 0; i < np; i++) { CommInfo cinfo; cinfo.target = procs[i]; cinfo.g_a = g_a; cinfo.tid = this_tbb_thread::get_id(); procList.push_back(cinfo); } ::NGA_NbGet(g_a, lo, hi, buf, ld, nbhandle); lock.release(); delete [] procs; delete [] map; } // GF_NbGet void GF_NbPut(int g_a, int lo[], int hi[], void *buf, int ld[], ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; int ndims = GF_Ndim(g_a); int *map = new int[2 * ndims * nproc]; int *procs = new int[nproc]; lock.acquire(inGA); int np = ::NGA_Locate_region(g_a, lo, hi, map, procs); for (int i = 0; i < np; i++) { CommInfo cinfo; cinfo.target = procs[i]; cinfo.g_a = g_a; cinfo.tid = this_tbb_thread::get_id(); procList.push_back(cinfo); } ::NGA_NbPut(g_a, lo, hi, buf, ld, nbhandle); lock.release(); delete [] procs; delete [] map; } // GF_NbPut void GF_NbWait(ga_nbhdl_t *nbhandle) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_NbWait(nbhandle); lock.release(); } // GF_NbWait int GF_Ndim(int g_a) { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Ndim(g_a); lock.release(); return ret; } // GF_Ndim int GF_Cluster_nodeid() { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Cluster_nodeid(); lock.release(); return ret; } // GF_Cluster_nodeid int GF_Cluster_proc_nodeid(int proc) { GAMutex::scoped_lock lock; lock.acquire(inGA); int ret = ::GA_Cluster_proc_nodeid(proc); lock.release(); return ret; } // GF_Cluster_proc_nodeid void GF_Inquire(int g_a, int *type, int *ndim, int dims[]) { GAMutex::scoped_lock lock; lock.acquire(inGA); ::NGA_Inquire(g_a, type, ndim, dims); lock.release(); } // GF_Inquire // Internal member functions RemoteFunction::~RemoteFunction() { } // ~RemoteFunction void RemoteFunction::execute(void *buf, size_t bufSz) { // Very careful allocation char *rbuf = new char[bufSz + sizeof(ExecutorArgs) - sizeof(GPCArgsExec)]; // Will be deleted as the user or library checks for completion ExecutorArgs *rargs = reinterpret_cast(rbuf); rargs->func = func; memcpy(&rargs->gpcArgs, buf, bufSz); if (!tsched->is_active()) tsched->initialize(nthreads); if (!parentTask) { lockParent(); if (!parentTask) { parentTask = new (task::allocate_root()) empty_task; parentTask->set_ref_count(1); } unlockParent(); } GFutTask *rec = new (parentTask->allocate_child()) GFutTask(rbuf); parentTask->increment_ref_count(); pbcnt++; #if 1 task::enqueue(*rec); #else parentTask->spawn(*rec); #endif } // execute void RemoteFunction::finalizeThreads(const bool terminate) { if (!parentTask) return; if (parentTask->ref_count() > 0) parentTask->wait_for_all(); // Wait for all child tasks to finish parentTask->destroy(*parentTask); parentTask = NULL; } // finalizeThreads // Static function definitions int gpc_enqueue_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { try { gfutmsglen msglen; char *alc = new char[sizeof(gfutmsgsnd) + hlen + dlen]; gfutmsgsnd *msgbuf = reinterpret_cast(alc); msglen.len = hlen + dlen; memcpy(msgbuf->dat, hdr, hlen); memcpy(msgbuf->dat + hlen, data, dlen); ProcIdMap::const_iterator iter = pmap.find(to); if (iter == pmap.end()) throw std::out_of_range("key not found in pmap!"); QueueData &qdata = msgqs.at(iter->second); message_queue *mqueue = qdata.queue; assert(mqueue); scoped_lock lock(*qdata.mutex); bool ret = mqueue->try_send(&msglen, sizeof(msglen), to); if (!ret) throw GFutException("Message queue is full for process!"); ret = mqueue->try_send(msgbuf, hlen + dlen, to); if (!ret) throw GFutException("Message queue is full for process!"); lock.unlock(); msgscnt++; delete [] alc; } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const GFutException &excp) { std::cerr << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } catch (const std::out_of_range &excp) { std::cerr << excp.what() << ": " << __LINE__ << std::endl; std::cerr << "Proc: " << me << ", to: " << to << ", pmap[to]: " << pmap[to] << std::endl; std::cerr << "Proc: " << me << ", msgqs.size(): " << msgqs.size() << std::endl; exit(EXIT_FAILURE); } return GPC_DONE; } // gpc_enqueue_dispatcher int gpc_execute_dispatcher(int to, int from, void *hdr, int hlen, void *data, int dlen, void *rhdr, int rhlen, int *rhsize, void *rdata, int rdlen, int *rdsize, int rtype) { try { GFHandle hndl; hndl = *(reinterpret_cast(hdr)); RemoteFunction *func = funcArray.at(hndl); func->execute(data, dlen); } catch (const std::out_of_range &excp) { std::cerr << excp.what() << ": " << __LINE__ << std::endl; exit(EXIT_FAILURE); } return GPC_DONE; } // gpc_execute_dispatcher void msgq_listener() { unsigned int cont_listen; int cnt = 0; do { try { process_execmsg(); cont_listen = listen; cnt++; } catch (const MsgqException &excp) { std::cerr << __LINE__ << " " << excp.what() << std::endl; exit(EXIT_FAILURE); } catch (const std::out_of_range &excp) { std::cerr << "Function not registered: " << __LINE__ << excp.what() << std::endl; exit(EXIT_FAILURE); } catch(interprocess_exception &ex){ std::cerr << ex.what() << ": " << __LINE__ << std::endl; std::cerr << ex.get_native_error() << ", " << ex.get_error_code(); std::cerr << ", " << size_error << std::endl; exit(EXIT_FAILURE); } } while ((msgq->get_num_msg() > 0) /* && (cnt < maxCnt) */); } // msgq_listener void GFutTask::msgq_executor(void *arg) { ExecutorArgs *earg; int *lo, *hi; void *rarg; earg = reinterpret_cast(arg); lo = reinterpret_cast(earg->gpcArgs.dat); hi = lo + earg->gpcArgs.ndims; rarg = hi + earg->gpcArgs.ndims; earg->func(earg->gpcArgs.g_a, earg->gpcArgs.ndims, lo, hi, rarg); put_value_long(complete, earg->gpcArgs.offs, earg->gpcArgs.src); execnt++; } // msgq_executor void wait_remote(GFHandle hndl, int np, int procs[], unsigned int rdata[]) { bool *status = new bool[np]; bool flag; int cnt = 0; for (int i = 0; i < np; i++) status[i] = false; do { flag = true; for (int i = 0; i < np; i++) { int pos = rdata[i]; if (!status[i]) status[i] = (retptrs[me][pos] == complete); this_tbb_thread::yield(); flag = (flag && status[i]); } cnt++; } while (!flag && cnt < maxCnt); delete [] status; if (cnt >= maxCnt) throw GFutException("wait_remote() exceeded iteration count, response did not arrive"); } // wait_remote void process_execmsg() { gfutmsglen msglen; size_t rsz = 0U; unsigned int prio = 0U; bool ret = msgq->try_receive(&msglen, msgqMaxMsgSz, rsz, prio); if (ret) { assert(rsz == sizeof(msglen)); char *alc = new char[sizeof(gfutmsgsnd) + msglen.len]; // Length of function type is // included in the overall message length gfutmsgrcv *msgbuf = reinterpret_cast(alc); bool oret; do { oret = msgq->try_receive(msgbuf, msgqMaxMsgSz, rsz, prio); } while (!oret); assert(rsz == msglen.len); msgrcnt++; RemoteFunction *func = funcArray.at(msgbuf->func); func->execute(&msgbuf->gpcArgs, rsz - sizeof(msgbuf->func)); delete [] alc; } } // process_execmsg int put_value_long(unsigned int val, int offs, int target) { GAMutex::scoped_lock lock; int ret = 0; lock.acquire(inGA); ret = ARMCI_PutValueInt(val, const_cast(&retptrs[target][offs]), target); ARMCI_Fence(target); lock.release(); return ret; } // put_value_long void print_debug_info() { std::cout << "pbcnt: " << pbcnt << ", execnt: " << execnt << std::flush << std::endl; std::cout << "msgscnt: " << msgscnt << ", msgrcnt: " << msgrcnt << std::endl; std::cout << "number of messages in queue: " << msgq->get_num_msg() << std::endl; std::cout << "listen: " << listen << std::flush << std::endl; } // print_debug_info } ga-5-4/gfutex/configure0000755000175000017500000245127212662210466013263 0ustar mbamba#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Global Futures 0.1. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and hpctools@pnnl.gov $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Global Futures' PACKAGE_TARNAME='gfutex' PACKAGE_VERSION='0.1' PACKAGE_STRING='Global Futures 0.1' PACKAGE_BUGREPORT='hpctools@pnnl.gov' PACKAGE_URL='' ac_unique_file="src/gfutex.C" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL ac_ct_AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL RANLIB AR_FLAGS AR GA_FLIBS GA_LIBS GA_LDFLAGS GA_CPPFLAGS GA_CONFIG LIBOBJS BOOST_LDFLAGS BOOST_CPPFLAGS TBB_LIBS TBB_LDFLAGS TBB_CPPFLAGS CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX MPICXX EGREP GREP CPP PERL am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MPICC GA_MP_CPPFLAGS GA_MP_LDFLAGS GA_MP_LIBS MSG_COMMS_TCGMSG5_FALSE MSG_COMMS_TCGMSG5_TRUE MSG_COMMS_TCGMSG4_FALSE MSG_COMMS_TCGMSG4_TRUE MSG_COMMS_MPI_FALSE MSG_COMMS_MPI_TRUE GFUTEX_STANDALONE_FALSE GFUTEX_STANDALONE_TRUE MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM CROSS_COMPILING_FALSE CROSS_COMPILING_TRUE SOLARIS_FALSE SOLARIS_TRUE SGITFP_FALSE SGITFP_TRUE SGI_N32_FALSE SGI_N32_TRUE SGI_FALSE SGI_TRUE NEC_FALSE NEC_TRUE MACX_FALSE MACX_TRUE LINUX_FALSE LINUX_TRUE LAPI_FALSE LAPI_TRUE INTERIX_FALSE INTERIX_TRUE IBM_FALSE IBM_TRUE HPUX_FALSE HPUX_TRUE HITACHI_FALSE HITACHI_TRUE FUJITSU_VPP_FALSE FUJITSU_VPP_TRUE DECOSF_FALSE DECOSF_TRUE CYGWIN_FALSE CYGWIN_TRUE CYGNUS_FALSE CYGNUS_TRUE CRAY_YMP_FALSE CRAY_YMP_TRUE CRAY_XT_FALSE CRAY_XT_TRUE CRAY_T3E_FALSE CRAY_T3E_TRUE CRAY_SV2_FALSE CRAY_SV2_TRUE CRAY_SV1_FALSE CRAY_SV1_TRUE CATAMOUNT_FALSE CATAMOUNT_TRUE BGP_FALSE BGP_TRUE BGL_FALSE BGL_TRUE host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode with_PACKAGE with_mpi enable_mpi_tests enable_dependency_tracking enable_assert with_tbb with_boost with_boost_libdir with_ga enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias MPICC CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP MPICXX CXX CXXFLAGS CCC CXXCPP AR AR_FLAGS RANLIB' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Global Futures 0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gfutex] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Global Futures 0.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-mpi-tests disable MPI linker tests --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-assert turn off assertions --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-PACKAGE[=ARG] for most of the external software packages, ARG can be one or more whitespace-separated directories, linker or preprocessor directives; for example, --with-PACKAGE="/path/to/PACKAGE -lmylib -I/mydir" --with-mpi[=ARG] select MPI as the messaging library (default); leave ARG blank to use MPI compiler wrappers --with-tbb[=ARG] specify location of tbb install and/or other flags --with-boost[=ARG] use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) [ARG=yes] --with-boost-libdir=LIB_DIR Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located. --with-ga[=ARG] specify location of ga install and/or other flags --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: MPICC MPI C compiler CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor MPICXX MPI C++ compiler CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor AR archiver used by libtool (default: ar) AR_FLAGS archiver flags used by libtool (default: cru) RANLIB generates index to archive (default: ranlib) Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Global Futures configure 0.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------- ## ## Report this to hpctools@pnnl.gov ## ## -------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES # ---------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_cxx_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------- ## ## Report this to hpctools@pnnl.gov ## ## -------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES # --------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_cxx_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_type # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Global Futures $as_me 0.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers config.h" ############################################################################### # Must occur before automake init ############################################################################### # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # AH_TEMPLATE for all known TARGETs { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TARGET base (64bit-ness checked later)" >&5 $as_echo_n "checking for TARGET base (64bit-ness checked later)... " >&6; } if ${ga_cv_target_base+:} false; then : $as_echo_n "(cached) " >&6 else ga_cv_target_base=UNKNOWN if test "x$ga_cv_target_base" = xUNKNOWN; then : if test -f /bgsys/drivers/ppcfloor/arch/include/common/bgp_personality.h; then : ga_cv_target_base=BGP fi fi if test "x$ga_cv_target_base" = xUNKNOWN; then : if test -d /bgl/BlueLight/ppcfloor/bglsys/include; then : ga_cv_target_base=BGL fi fi if test "x$ga_cv_target_base" = xUNKNOWN; then : case $host in #( *bgl*) : ga_cv_target_base=BGL ;; #( *bgp*) : ga_cv_target_base=BGP ;; #( #[TODO], [ga_cv_target_base=CATAMOUNT], #[TODO], [ga_cv_target_base=CRAY_XT], *cygwin*) : ga_cv_target_base=CYGWIN ;; #( *fujitsu*) : ga_cv_target_base=FUJITSU_VPP ;; #( *hpux*) : ga_cv_target_base=HPUX ;; #( *ibm*) : ga_cv_target_base=IBM ;; #( #[TODO], [ga_cv_target_base=LAPI], *linux*) : ga_cv_target_base=LINUX ;; #( *darwin*) : ga_cv_target_base=MACX ;; #( *apple*) : ga_cv_target_base=MACX ;; #( *superux*) : ga_cv_target_base=NEC ;; #( *solaris*) : ga_cv_target_base=SOLARIS ;; #( *) : ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_target_base" >&5 $as_echo "$ga_cv_target_base" >&6; } cat >>confdefs.h <<_ACEOF #define $ga_cv_target_base 1 _ACEOF # A horrible hack that should go away somehow... { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we think this system is what we call SYSV" >&5 $as_echo_n "checking whether we think this system is what we call SYSV... " >&6; } if ${ga_cv_sysv+:} false; then : $as_echo_n "(cached) " >&6 else case $ga_cv_target_base in #( SUN|SOLARIS|SGI|SGI_N32|SGITFP|HPUX|IBM|DECOSF|LINUX|INTERIX|NEC|LAPI) : ga_cv_sysv=yes ;; #( *) : ga_cv_sysv=no ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_sysv" >&5 $as_echo "$ga_cv_sysv" >&6; } if test x$ga_cv_sysv = xyes; then : $as_echo "#define SYSV 1" >>confdefs.h fi # Hopefully these will never be used and we can remove them soon. if test "$ga_cv_target_base" = BGL; then BGL_TRUE= BGL_FALSE='#' else BGL_TRUE='#' BGL_FALSE= fi if test "$ga_cv_target_base" = BGP; then BGP_TRUE= BGP_FALSE='#' else BGP_TRUE='#' BGP_FALSE= fi if test "$ga_cv_target_base" = CATAMOUNT; then CATAMOUNT_TRUE= CATAMOUNT_FALSE='#' else CATAMOUNT_TRUE='#' CATAMOUNT_FALSE= fi if test "$ga_cv_target_base" = CRAY_SV1; then CRAY_SV1_TRUE= CRAY_SV1_FALSE='#' else CRAY_SV1_TRUE='#' CRAY_SV1_FALSE= fi if test "$ga_cv_target_base" = CRAY_SV2; then CRAY_SV2_TRUE= CRAY_SV2_FALSE='#' else CRAY_SV2_TRUE='#' CRAY_SV2_FALSE= fi if test "$ga_cv_target_base" = CRAY_T3E; then CRAY_T3E_TRUE= CRAY_T3E_FALSE='#' else CRAY_T3E_TRUE='#' CRAY_T3E_FALSE= fi if test "$ga_cv_target_base" = CRAY_XT; then CRAY_XT_TRUE= CRAY_XT_FALSE='#' else CRAY_XT_TRUE='#' CRAY_XT_FALSE= fi if test "$ga_cv_target_base" = CRAY_YMP; then CRAY_YMP_TRUE= CRAY_YMP_FALSE='#' else CRAY_YMP_TRUE='#' CRAY_YMP_FALSE= fi if test "$ga_cv_target_base" = CYGNUS; then CYGNUS_TRUE= CYGNUS_FALSE='#' else CYGNUS_TRUE='#' CYGNUS_FALSE= fi if test "$ga_cv_target_base" = CYGWIN; then CYGWIN_TRUE= CYGWIN_FALSE='#' else CYGWIN_TRUE='#' CYGWIN_FALSE= fi if test "$ga_cv_target_base" = DECOSF; then DECOSF_TRUE= DECOSF_FALSE='#' else DECOSF_TRUE='#' DECOSF_FALSE= fi if test "$ga_cv_target_base" = FUJITSU_VPP; then FUJITSU_VPP_TRUE= FUJITSU_VPP_FALSE='#' else FUJITSU_VPP_TRUE='#' FUJITSU_VPP_FALSE= fi if test "$ga_cv_target_base" = HITACHI; then HITACHI_TRUE= HITACHI_FALSE='#' else HITACHI_TRUE='#' HITACHI_FALSE= fi if test "$ga_cv_target_base" = HPUX; then HPUX_TRUE= HPUX_FALSE='#' else HPUX_TRUE='#' HPUX_FALSE= fi if test "$ga_cv_target_base" = IBM; then IBM_TRUE= IBM_FALSE='#' else IBM_TRUE='#' IBM_FALSE= fi if test "$ga_cv_target_base" = INTERIX; then INTERIX_TRUE= INTERIX_FALSE='#' else INTERIX_TRUE='#' INTERIX_FALSE= fi if test "$ga_cv_target_base" = LAPI; then LAPI_TRUE= LAPI_FALSE='#' else LAPI_TRUE='#' LAPI_FALSE= fi if test "$ga_cv_target_base" = LINUX; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi if test "$ga_cv_target_base" = MACX; then MACX_TRUE= MACX_FALSE='#' else MACX_TRUE='#' MACX_FALSE= fi if test "$ga_cv_target_base" = NEC; then NEC_TRUE= NEC_FALSE='#' else NEC_TRUE='#' NEC_FALSE= fi if test "$ga_cv_target_base" = SGI; then SGI_TRUE= SGI_FALSE='#' else SGI_TRUE='#' SGI_FALSE= fi if test "$ga_cv_target_base" = SGI_N32; then SGI_N32_TRUE= SGI_N32_FALSE='#' else SGI_N32_TRUE='#' SGI_N32_FALSE= fi if test "$ga_cv_target_base" = SGITFP; then SGITFP_TRUE= SGITFP_FALSE='#' else SGITFP_TRUE='#' SGITFP_FALSE= fi if test "$ga_cv_target_base" = SOLARIS; then SOLARIS_TRUE= SOLARIS_FALSE='#' else SOLARIS_TRUE='#' SOLARIS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if ${ga_cv_cross_compiling+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$ga_cv_target_base" = xBGP; then : cross_compiling=yes fi ga_cv_cross_compiling=$cross_compiling fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cross_compiling" >&5 $as_echo "$ga_cv_cross_compiling" >&6; } if test "x$cross_compiling" = xyes; then CROSS_COMPILING_TRUE= CROSS_COMPILING_FALSE='#' else CROSS_COMPILING_TRUE='#' CROSS_COMPILING_FALSE= fi ############################################################################### ## Init automake ################################################################################ am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gfutex' VERSION='0.1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ## Don't emit "rebuild rules" for configure, Makefile.ins, etc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE ############################################################################### # Misc. information and package setup. ############################################################################### # Check whether --with-PACKAGE was given. if test "${with_PACKAGE+set}" = set; then : withval=$with_PACKAGE; fi GFUTEX_TOP_BUILDDIR="`pwd`" cd "$srcdir" GFUTEX_TOP_SRCDIR="`pwd`" cd "$GFUTEX_TOP_BUILDDIR" if test "$GFUTEX_TOP_BUILDDIR" != "GFUTEX_TOP_SRCDIR"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Detected VPATH build" >&5 $as_echo "$as_me: Detected VPATH build" >&6;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gfutex is built outside of GA" >&5 $as_echo_n "checking whether gfutex is built outside of GA... " >&6; } if ${gfutex_cv_standalone+:} false; then : $as_echo_n "(cached) " >&6 else if test -f "$GFUTEX_TOP_BUILDDIR/../armci/config.status"; then : gfutex_cv_standalone=no else gfutex_cv_standalone=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gfutex_cv_standalone" >&5 $as_echo "$gfutex_cv_standalone" >&6; } if test x$gfutex_cv_standalone = xyes; then GFUTEX_STANDALONE_TRUE= GFUTEX_STANDALONE_FALSE='#' else GFUTEX_STANDALONE_TRUE='#' GFUTEX_STANDALONE_FALSE= fi # If MPI is desired we use the MPI compiler wrappers instead of the standard # compilers. # GA_MP_* vars might exist in environment, but they are really internal. # Reset them. GA_MP_LIBS= GA_MP_LDFLAGS= GA_MP_CPPFLAGS= # Check whether --with-mpi was given. if test "${with_mpi+set}" = set; then : withval=$with_mpi; else with_mpi=yes fi with_mpi_need_parse=no case $with_mpi in #( yes) : with_mpi_wrappers=yes; ga_msg_comms=MPI ;; #( no) : case $ga_cv_target_base in #( MACX|LAPI|CYGNUS|CYGWIN|INTERIX) : ga_msg_comms=TCGMSG5 ;; #( *) : ga_msg_comms=TCGMSG ;; esac ;; #( *) : with_mpi_need_parse=yes; ga_msg_comms=MPI ;; #( *) : ;; esac if test "x$ga_msg_comms" = xMPI; then MSG_COMMS_MPI_TRUE= MSG_COMMS_MPI_FALSE='#' else MSG_COMMS_MPI_TRUE='#' MSG_COMMS_MPI_FALSE= fi if test "x$ga_msg_comms" = xTCGMSG; then MSG_COMMS_TCGMSG4_TRUE= MSG_COMMS_TCGMSG4_FALSE='#' else MSG_COMMS_TCGMSG4_TRUE='#' MSG_COMMS_TCGMSG4_FALSE= fi if test "x$ga_msg_comms" = xTCGMSG5; then MSG_COMMS_TCGMSG5_TRUE= MSG_COMMS_TCGMSG5_FALSE='#' else MSG_COMMS_TCGMSG5_TRUE='#' MSG_COMMS_TCGMSG5_FALSE= fi case $ga_msg_comms in #( MPI) : $as_echo "#define MSG_COMMS_MPI 1" >>confdefs.h ;; #( TCGMSG) : $as_echo "#define MSG_COMMS_TCGMSG4 1" >>confdefs.h $as_echo "#define MSG_COMMS_TCGMSG 1" >>confdefs.h $as_echo "#define TCGMSG 1" >>confdefs.h ;; #( TCGMSG5) : $as_echo "#define MSG_COMMS_TCGMSG5 1" >>confdefs.h $as_echo "#define MSG_COMMS_TCGMSG 1" >>confdefs.h $as_echo "#define TCGMSG 1" >>confdefs.h ;; #( *) : ;; esac # F77 and C++ are always enabled for gfutex enable_f77=yes enable_cxx=yes # Check whether --enable-mpi-tests was given. if test "${enable_mpi_tests+set}" = set; then : enableval=$enable_mpi_tests; else enable_mpi_tests=yes fi ############################################################################### # C compiler ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: C compiler" >&5 $as_echo "$as_me: C compiler" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} tascel_save_CFLAGS="$CFLAGS" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi case $ga_cv_target_base in #( BGP) : ga_mpicc_pref=mpixlc_r; ga_cc_pref=bgxlc_r ;; #( *) : ;; esac # In the case of using MPI wrappers, set CC=MPICC since CC will override # absolutely everything in our list of compilers. # Save CC, just in case. if test x$with_mpi_wrappers = xyes; then : if test "x$CC" != "x$MPICC"; then : ga_orig_CC="$CC" fi case x$CC:x$MPICC in #( x:x) : ;; #( x:x*) : CC="$MPICC" ;; #( x*:x) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired but CC is set while MPICC is unset." >&5 $as_echo "$as_me: WARNING: MPI compilers desired but CC is set while MPICC is unset." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CC will be ignored during compiler selection, but will be" >&5 $as_echo "$as_me: WARNING: CC will be ignored during compiler selection, but will be" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&5 $as_echo "$as_me: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: meant to set MPICC instead of or in addition to CC?" >&5 $as_echo "$as_me: WARNING: meant to set MPICC instead of or in addition to CC?" >&2;} CC= ;; #( x*:x*) : if test "x$CC" != "x$MPICC"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired, MPICC and CC are set, and MPICC!=CC." >&5 $as_echo "$as_me: WARNING: MPI compilers desired, MPICC and CC are set, and MPICC!=CC." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Choosing MPICC as main compiler." >&5 $as_echo "$as_me: WARNING: Choosing MPICC as main compiler." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CC will be assumed as the unwrapped MPI compiler." >&5 $as_echo "$as_me: WARNING: CC will be assumed as the unwrapped MPI compiler." >&2;} fi ga_cv_mpic_naked="$CC" CC="$MPICC" ;; #( *) : as_fn_error $? "CC/MPICC case failure" "$LINENO" 5 ;; esac fi ga_cc="bgxlc_r bgxlc xlc_r xlc pgcc pathcc icc sxcc fcc opencc suncc craycc gcc cc ecc cl ccc" ga_mpicc="mpicc mpixlc_r mpixlc hcc mpxlc_r mpxlc sxmpicc mpifcc mpgcc mpcc cmpicc cc" if test x$with_mpi_wrappers = xyes; then : CC_TO_TEST="$ga_mpicc_pref $ga_mpicc" else CC_TO_TEST="$ga_cc_pref $ga_cc" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CC_TO_TEST do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in $CC_TO_TEST do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi CFLAGS="$tascel_save_CFLAGS" if test x$with_mpi_wrappers = xyes; then : # Find perl. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Create inside.pl. rm -f inside.pl cat >inside.pl <<"EOF" #!/usr/bin/perl use strict; use warnings; my $numargs = $#ARGV + 1; if ($numargs != 2) { print "Usage: wrapped.txt naked.txt\n"; exit 1; } # Read each input file as a string (rather than a list). local $/=undef; open WRAPPED, "$ARGV[0]" or die "Could not open wrapped text file: $!"; my $wrapped_lines = ; close WRAPPED; open NAKED, "$ARGV[1]" or die "Could not open naked text file: $!"; my $naked_lines = ; close NAKED; # Replace newlines, + from wrapped and naked lines. $wrapped_lines =~ tr/\n+/ /; $naked_lines =~ tr/\n+/ /; # Remove whitespace from beginning of wrapped and naked lines. $wrapped_lines =~ s/^\s+//; $naked_lines =~ s/^\s+//; # Remove whitespace from end of wrapped and naked lines. $wrapped_lines =~ s/\s+$//; $naked_lines =~ s/\s+$//; # If either wrapped_lines or naked_lines are empty, this is an error. # It is assumed that the particular version string which created the input # files should generate SOMETHING. unless ($wrapped_lines) { exit 1; } unless ($naked_lines) { exit 1; } # Cray compilers append a timestamp into their version string. Remove it. if ($wrapped_lines =~ /\QCray\E/) { $wrapped_lines = substr $wrapped_lines, 0, -28; $naked_lines = substr $naked_lines, 0, -28; } # Can the naked lines be found within the wrapped lines? if ($wrapped_lines =~ /\Q$naked_lines\E/) { #print "Found as substring\n"; exit 0; } # Are the naked lines exactly the same as the wrapped lines? elsif ($wrapped_lines eq $naked_lines) { #print "Found equal\n"; exit 0; } else { #print "Not found\n"; exit 1; } EOF inside="$PERL inside.pl" wrapped="$CC" case $wrapped in #( *_r) : compilers="bgxlc_r xlc_r" ;; #( *) : compilers="bgxlc xlc pgcc pathcc icc sxcc fcc opencc suncc craycc gcc ecc cl ccc cc" ;; #( *) : ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for base $wrapped compiler" >&5 $as_echo_n "checking for base $wrapped compiler... " >&6; } if ${ga_cv_mpic_naked+:} false; then : $as_echo_n "(cached) " >&6 else base="`$wrapped -show 2>/dev/null | sed 's/[ ].*$//' | head -1`" ga_save_CC="$CC" CC="$base" # if -m32 or -m64 is present in the -show params, or separately, add it unwrapped_args="`$wrapped -show 2>/dev/null`" extra_arg="" for arg in $unwrapped_args $wrapped do case $arg in #( *-m32*) : extra_arg="-m32" ;; #( *-m64*) : extra_arg="-m64" ;; #( *) : ;; esac done if test "x$extra_arg" != x; then : base="$base $extra_arg" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ga_cv_mpic_naked="$base" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CC="$ga_save_CC" versions="--version -v -V -qversion" found_wrapped_version=0 # Try separating stdout and stderr. Only compare stdout. if test "x$ga_cv_mpic_naked" = x; then : # prepend any CC/CXX/F77 the user may have specified compilers="$ga_orig_CC $compilers" echo "only comparing stdout" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err naked.txt naked.err if $wrapped $version 1>mpi.txt 2>mpi.err; then : found_wrapped_version=1 for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpic_naked" != x; then : break fi done fi # Perhaps none of the MPI compilers had a zero exit status (this is bad). # In this case we have to do a brute force match regardless of exit status. if test "x$found_wrapped_version" = x0; then : if test "x$ga_cv_mpic_naked" = x; then : echo "no zero exit status found for MPI compilers" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpic_naked" != x; then : break fi done fi fi # Try by combining stdout/err into one file. if test "x$ga_cv_mpic_naked" = x; then : echo "try combining stdout and stderr into one file" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt naked.txt if $wrapped $version 1>mpi.txt 2>&1; then : for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>&1; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpic_naked" != x; then : break fi done fi # If we got this far, then it's likely that the MPI compiler had a zero exit # status when it shouldn't have for one version flag, but later had a non-zero # exit status for a flag it shouldn't have. One false positive hid a false # negative. In this case, brute force compare all MPI compiler output against # all compiler output. if test "x$ga_cv_mpic_naked" = x; then : echo "we have a very badly behaving MPI compiler" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpic_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpic_naked" != x; then : break fi done fi rm -f mpi.txt mpi.err naked.txt naked.err fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_mpic_naked" >&5 $as_echo "$ga_cv_mpic_naked" >&6; } if test "x$ga_cv_mpic_naked" = x; then : as_fn_error $? "Could not determine the C compiler wrapped by MPI" "$LINENO" 5 else if test "x$ga_orig_CC" != x && test "x$ga_orig_CC" != "x$ga_cv_mpic_naked"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unwrapped $wrapped ($ga_cv_mpic_naked) does not match user-specified $ga_orig_CC" >&5 $as_echo "$as_me: WARNING: unwrapped $wrapped ($ga_cv_mpic_naked) does not match user-specified $ga_orig_CC" >&2;} fi fi rm -f inside.pl else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_mpi ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( -L*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -WL*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -Wl*) : GA_MP_LDFLAGS="$GA_MP_LDFLAGS $arg" ;; #( -I*) : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS $arg" ;; #( *.a) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *.so) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *lib) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi ;; #( -mkl*) : GA_MP_LIBS="$GA_MP_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : GA_MP_LDFLAGS="$GA_MP_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : GA_MP_CPPFLAGS="$GA_MP_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_mpi not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_mpi not parsed" >&2;} fi done fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a simple C MPI program compiles" >&5 $as_echo_n "checking whether a simple C MPI program compiles... " >&6; } if ${ga_cv_c_mpi_test_compile+:} false; then : $as_echo_n "(cached) " >&6 else ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" if ac_fn_c_try_compile "$LINENO"; then : ga_cv_c_mpi_test_compile=yes else ga_cv_c_mpi_test_compile=no fi rm -f core conftest.err conftest.$ac_objext CPPFLAGS="$ga_save_CPPFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_c_mpi_test_compile" >&5 $as_echo "$ga_cv_c_mpi_test_compile" >&6; } rm -f conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "x$ga_cv_c_mpi_test_compile" = xno; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "could not compile simple C MPI program See \`config.log' for more details" "$LINENO" 5; } fi # Hack to append .x to executables. EXEEXT=.x$EXEEXT if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_target64_sizeof_voidp" ""; then : fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TARGET 64bit-ness" >&5 $as_echo_n "checking for TARGET 64bit-ness... " >&6; } if ${ga_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test x$ga_target64_sizeof_voidp = x8; then : ga_cv_target=${ga_cv_target_base}64 else ga_cv_target=$ga_cv_target_base fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_target" >&5 $as_echo "$ga_cv_target" >&6; } cat >>confdefs.h <<_ACEOF #define $ga_cv_target 1 _ACEOF # Checks for C libraries. # Checks for C header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable assertions" >&5 $as_echo_n "checking whether to enable assertions... " >&6; } # Check whether --enable-assert was given. if test "${enable_assert+set}" = set; then : enableval=$enable_assert; ac_enable_assert=$enableval if test "x$enableval" = xno; then : $as_echo "#define NDEBUG 1" >>confdefs.h elif test "x$enableval" != xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert" >&5 $as_echo "$as_me: WARNING: invalid argument supplied to --enable-assert" >&2;} ac_enable_assert=yes fi else ac_enable_assert=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_enable_assert" >&5 $as_echo "$ac_enable_assert" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in limits.h math.h omp.h pthread.h sched.h stdint.h stdio.h stdlib.h string.h sys/time.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 0 _ACEOF fi done # Checks for C typedefs, structures, and compiler characteristics. # Checks for C library functions. ############################################################################### # C++ compiler ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: C++ compiler" >&5 $as_echo "$as_me: C++ compiler" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu gfutex_save_CXXFLAGS="$CXXFLAGS" case $ga_cv_target_base in #( BGP) : ga_mpicxx_pref=mpixlcxx_r; ga_cxx_pref=bgxlC_r ;; #( *) : ;; esac # In the case of using MPI wrappers, set CXX=MPICXX since CXX will override # absolutely everything in our list of compilers. if test x$with_mpi_wrappers = xyes; then : if test "x$CXX" != "x$MPICXX"; then : ga_orig_CXX="$CXX" fi case x$CXX:x$MPICXX in #( x:x) : ;; #( x:x*) : CXX="$MPICXX" ;; #( x*:x) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired but CXX is set while MPICXX is unset." >&5 $as_echo "$as_me: WARNING: MPI compilers desired but CXX is set while MPICXX is unset." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CXX will be ignored during compiler selection, but will be" >&5 $as_echo "$as_me: WARNING: CXX will be ignored during compiler selection, but will be" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&5 $as_echo "$as_me: WARNING: tested first during MPI compiler unwrapping. Perhaps you" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: meant to set MPICXX instead of or in addition to CXX?" >&5 $as_echo "$as_me: WARNING: meant to set MPICXX instead of or in addition to CXX?" >&2;} CXX= ;; #( x*:x*) : if test "x$CXX" != "x$MPICXX"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI compilers desired, MPICXX and CXX are set, and MPICXX!=CXX." >&5 $as_echo "$as_me: WARNING: MPI compilers desired, MPICXX and CXX are set, and MPICXX!=CXX." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Choosing MPICXX as main compiler." >&5 $as_echo "$as_me: WARNING: Choosing MPICXX as main compiler." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CXX will be assumed as the unwrapped MPI compiler." >&5 $as_echo "$as_me: WARNING: CXX will be assumed as the unwrapped MPI compiler." >&2;} fi ga_cv_mpicxx_naked="$CXX" CXX="$MPICXX" ;; #( *) : as_fn_error $? "CXX/MPICXX case failure" "$LINENO" 5 ;; esac fi ga_cxx="icpc pgCC pathCC sxc++ xlC_r xlC bgxlC_r bgxlC openCC sunCC crayc++ g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC" ga_mpicxx="mpic++ mpicxx mpiCC sxmpic++ hcp mpxlC_r mpxlC mpixlcxx_r mpixlcxx mpg++ mpc++ mpCC cmpic++ mpiFCC CC" if test x$with_mpi_wrappers = xyes; then : CXX_TO_TEST="$ga_mpicxx_pref $ga_mpicxx" else CXX_TO_TEST="$ga_cxx_pref $ga_cxx" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in $CXX_TO_TEST do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CXX_TO_TEST do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi CXXFLAGS="$gfutex_save_CXXFLAGS" if test x$with_mpi_wrappers = xyes; then : # Find perl. # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Create inside.pl. rm -f inside.pl cat >inside.pl <<"EOF" #!/usr/bin/perl use strict; use warnings; my $numargs = $#ARGV + 1; if ($numargs != 2) { print "Usage: wrapped.txt naked.txt\n"; exit 1; } # Read each input file as a string (rather than a list). local $/=undef; open WRAPPED, "$ARGV[0]" or die "Could not open wrapped text file: $!"; my $wrapped_lines = ; close WRAPPED; open NAKED, "$ARGV[1]" or die "Could not open naked text file: $!"; my $naked_lines = ; close NAKED; # Replace newlines, + from wrapped and naked lines. $wrapped_lines =~ tr/\n+/ /; $naked_lines =~ tr/\n+/ /; # Remove whitespace from beginning of wrapped and naked lines. $wrapped_lines =~ s/^\s+//; $naked_lines =~ s/^\s+//; # Remove whitespace from end of wrapped and naked lines. $wrapped_lines =~ s/\s+$//; $naked_lines =~ s/\s+$//; # If either wrapped_lines or naked_lines are empty, this is an error. # It is assumed that the particular version string which created the input # files should generate SOMETHING. unless ($wrapped_lines) { exit 1; } unless ($naked_lines) { exit 1; } # Cray compilers append a timestamp into their version string. Remove it. if ($wrapped_lines =~ /\QCray\E/) { $wrapped_lines = substr $wrapped_lines, 0, -28; $naked_lines = substr $naked_lines, 0, -28; } # Can the naked lines be found within the wrapped lines? if ($wrapped_lines =~ /\Q$naked_lines\E/) { #print "Found as substring\n"; exit 0; } # Are the naked lines exactly the same as the wrapped lines? elsif ($wrapped_lines eq $naked_lines) { #print "Found equal\n"; exit 0; } else { #print "Not found\n"; exit 1; } EOF inside="$PERL inside.pl" wrapped="$CXX" case $wrapped in #( *_r) : compilers="bgxlC_r xlC_r" ;; #( *) : compilers="icpc pgCC pathCC sxc++ xlC bgxlC openCC sunCC crayc++ g++ c++ gpp aCC cxx cc++ cl.exe FCC KCC RCC CC" ;; #( *) : ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for base $wrapped compiler" >&5 $as_echo_n "checking for base $wrapped compiler... " >&6; } if ${ga_cv_mpicxx_naked+:} false; then : $as_echo_n "(cached) " >&6 else base="`$wrapped -show 2>/dev/null | sed 's/[ ].*$//' | head -1`" ga_save_CXX="$CXX" CXX="$base" # if -m32 or -m64 is present in the -show params, or separately, add it unwrapped_args="`$wrapped -show 2>/dev/null`" extra_arg="" for arg in $unwrapped_args $wrapped do case $arg in #( *-m32*) : extra_arg="-m32" ;; #( *-m64*) : extra_arg="-m64" ;; #( *) : ;; esac done if test "x$extra_arg" != x; then : base="$base $extra_arg" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_mpicxx_naked="$base" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXX="$ga_save_CXX" versions="--version -v -V -qversion" found_wrapped_version=0 # Try separating stdout and stderr. Only compare stdout. if test "x$ga_cv_mpicxx_naked" = x; then : # prepend any CC/CXX/F77 the user may have specified compilers="$ga_orig_CXX $compilers" echo "only comparing stdout" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err naked.txt naked.err if $wrapped $version 1>mpi.txt 2>mpi.err; then : found_wrapped_version=1 for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi # Perhaps none of the MPI compilers had a zero exit status (this is bad). # In this case we have to do a brute force match regardless of exit status. if test "x$found_wrapped_version" = x0; then : if test "x$ga_cv_mpicxx_naked" = x; then : echo "no zero exit status found for MPI compilers" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi fi # Try by combining stdout/err into one file. if test "x$ga_cv_mpicxx_naked" = x; then : echo "try combining stdout and stderr into one file" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt naked.txt if $wrapped $version 1>mpi.txt 2>&1; then : for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : if $naked_compiler $version 1>naked.txt 2>&1; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done else echo "$wrapped $version failed, skipping" >&5 fi if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi # If we got this far, then it's likely that the MPI compiler had a zero exit # status when it shouldn't have for one version flag, but later had a non-zero # exit status for a flag it shouldn't have. One false positive hid a false # negative. In this case, brute force compare all MPI compiler output against # all compiler output. if test "x$ga_cv_mpicxx_naked" = x; then : echo "we have a very badly behaving MPI compiler" >&5 for version in $versions do echo "trying version=$version" >&5 rm -f mpi.txt mpi.err $wrapped $version 1>mpi.txt 2>mpi.err for naked_compiler in $compilers do if test "x$naked_compiler" != "x$wrapped"; then : rm -f naked.txt naked.err if $naked_compiler $version 1>naked.txt 2>naked.err; then : if $inside mpi.txt naked.txt >/dev/null; then : ga_cv_mpicxx_naked=$naked_compiler; break else echo "inside.pl $wrapped $naked_compiler failed, skipping" >&5 fi else echo "$naked_compiler $version failed, skipping" >&5 fi fi done if test "x$ga_cv_mpicxx_naked" != x; then : break fi done fi rm -f mpi.txt mpi.err naked.txt naked.err fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_mpicxx_naked" >&5 $as_echo "$ga_cv_mpicxx_naked" >&6; } if test "x$ga_cv_mpicxx_naked" = x; then : as_fn_error $? "Could not determine the C++ compiler wrapped by MPI" "$LINENO" 5 else if test "x$ga_orig_CXX" != x && test "x$ga_orig_CXX" != "x$ga_cv_mpicxx_naked"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unwrapped $wrapped ($ga_cv_mpicxx_naked) does not match user-specified $ga_orig_CXX" >&5 $as_echo "$as_me: WARNING: unwrapped $wrapped ($ga_cv_mpicxx_naked) does not match user-specified $ga_orig_CXX" >&2;} fi fi rm -f inside.pl fi if test "x$with_mpi" != xno; then : ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a simple C++ MPI program works" >&5 $as_echo_n "checking whether a simple C++ MPI program works... " >&6; } if ${ga_cv_cxx_mpi_test+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=yes else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext # That didn't work, so now let's try with our GA_MP_* flags. if test "x$ga_cv_cxx_mpi_test" = xno; then : ga_save_LIBS="$LIBS"; LIBS="$LIBS $GA_MP_LIBS" ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=yes else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" fi # That didn't work, so now let's try with our GA_MP_* flags and various libs. if test "x$ga_cv_cxx_mpi_test" = xno; then : for lib in -lmpi -lmpich; do ga_save_LIBS="$LIBS"; LIBS="$LIBS $GA_MP_LIBS $lib" ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_MP_CPPFLAGS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_MP_LDFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int myargc; char **myargv; MPI_Init(&myargc, &myargv); MPI_Finalize(); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ga_cv_cxx_mpi_test=$lib; break else ga_cv_cxx_mpi_test=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" done LIBS="$ga_save_LIBS" CPPFLAGS="$ga_save_CPPFLAGS" LDFLAGS="$ga_save_LDFLAGS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_cxx_mpi_test" >&5 $as_echo "$ga_cv_cxx_mpi_test" >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu case $ga_cv_cxx_mpi_test in #( yes) : ;; #( no) : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "could not link simple C++ MPI program See \`config.log' for more details" "$LINENO" 5; } ;; #( *) : GA_MP_LIBS="$ga_cv_cxx_mpi_test" ;; #( *) : ;; esac fi # Checks for libraries. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu tbb_ok=no # has the user set TBBROOT or tbb_root? if test "x$TBBROOT" != x || test "x$tbb_root" != x; then : rm -f the_makefile rm -f result.txt rm -f out.txt cat >the_makefile <<"EOF" ifdef TBBROOT tbb_root=$(TBBROOT) endif include $(tbb_root)/build/common.inc result.txt: @echo "$(work_dir)" > result.txt EOF if gmake -f the_makefile &> out.txt; then : tbb_work_dir=`cat result.txt`; tbb_ok=yes else cat out.txt >&5 fi if test "x$tbb_work_dir" != x; then : TBB_LDFLAGS="-L${tbb_work_dir}_release" fi if test "x$TBBROOT" != x; then : TBB_CPPFLAGS="-I$TBBROOT/include" elif test "x$tbb_root" != x; then : TBB_CPPFLAGS="-I$tbb_root/include" fi TBB_LIBS="-ltbb" rm -f the_makefile rm -f result.txt rm -f out.txt fi if test "x$tbb_ok" = xno; then : TBB_LIBS= TBB_LDFLAGS= TBB_CPPFLAGS= # Check whether --with-tbb was given. if test "${with_tbb+set}" = set; then : withval=$with_tbb; else with_tbb=yes fi case $with_tbb in #( yes) : ;; #( no) : ;; #( *) : if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_tbb ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : TBB_LIBS="$TBB_LIBS $arg" ;; #( -L*) : TBB_LDFLAGS="$TBB_LDFLAGS $arg" ;; #( -WL*) : TBB_LDFLAGS="$TBB_LDFLAGS $arg" ;; #( -Wl*) : TBB_LDFLAGS="$TBB_LDFLAGS $arg" ;; #( -I*) : TBB_CPPFLAGS="$TBB_CPPFLAGS $arg" ;; #( *.a) : TBB_LIBS="$TBB_LIBS $arg" ;; #( *.so) : TBB_LIBS="$TBB_LIBS $arg" ;; #( *lib) : if test -d $arg; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi ;; #( -mkl*) : TBB_LIBS="$TBB_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : TBB_LDFLAGS="$TBB_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : TBB_CPPFLAGS="$TBB_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_tbb not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_tbb not parsed" >&2;} fi done ;; esac # Check for header. ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $TBB_CPPFLAGS" ac_fn_cxx_check_header_mongrel "$LINENO" "tbb/tbb.h" "ac_cv_header_tbb_tbb_h" "$ac_includes_default" if test "x$ac_cv_header_tbb_tbb_h" = xyes; then : else as_fn_error $? "could not locate Intel Thread Building Blocks" "$LINENO" 5 fi CPPFLAGS="$ga_save_CPPFLAGS" # Check for library. ga_save_LIBS="$LIBS"; LIBS="$TBB_LIBS $LIBS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $TBB_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing TBB_runtime_interface_version" >&5 $as_echo_n "checking for library containing TBB_runtime_interface_version... " >&6; } if ${ac_cv_search_TBB_runtime_interface_version+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TBB_runtime_interface_version (); int main () { return TBB_runtime_interface_version (); ; return 0; } _ACEOF for ac_lib in '' tbb; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_TBB_runtime_interface_version=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_TBB_runtime_interface_version+:} false; then : break fi done if ${ac_cv_search_TBB_runtime_interface_version+:} false; then : else ac_cv_search_TBB_runtime_interface_version=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_TBB_runtime_interface_version" >&5 $as_echo "$ac_cv_search_TBB_runtime_interface_version" >&6; } ac_res=$ac_cv_search_TBB_runtime_interface_version if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBS="$ga_save_LIBS" LDFLAGS="$ga_save_LDFLAGS" if test "x$ac_cv_search_TBB_runtime_interface_version" != xno; then : tbb_ok=yes $as_echo "#define HAVE_TBB 1" >>confdefs.h else as_fn_error $? "could not locate Intel Thread Building Blocks" "$LINENO" 5 fi fi # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ac_boost_path="" else want_boost="yes" ac_boost_path="$withval" fi else want_boost="yes" fi # Check whether --with-boost-libdir was given. if test "${with_boost_libdir+set}" = set; then : withval=$with_boost_libdir; if test -d "$withval" then ac_boost_lib_path="$withval" else as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 fi else ac_boost_lib_path="" fi if test "x$want_boost" = "xyes"; then boost_lib_version_req=1.35.0 boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([0-9]*\.[0-9]*\)'` boost_lib_version_req_major=`expr $boost_lib_version_req : '\([0-9]*\)'` boost_lib_version_req_minor=`expr $boost_lib_version_req : '[0-9]*\.\([0-9]*\)'` boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` if test "x$boost_lib_version_req_sub_minor" = "x" ; then boost_lib_version_req_sub_minor="0" fi WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5 $as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; } succeeded=no libsubdirs="lib" ax_arch=`uname -m` if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64; then libsubdirs="lib64 lib lib64" fi if test "$ac_boost_path" != ""; then BOOST_CPPFLAGS="-I$ac_boost_path/include" for ac_boost_path_tmp in $libsubdirs; do if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" break fi done elif test "$cross_compiling" != yes; then for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then for libsubdir in $libsubdirs ; do if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done fi if test "$ac_boost_lib_path" != ""; then BOOST_LDFLAGS="-L$ac_boost_lib_path" fi CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "x$succeeded" != "xyes"; then _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done fi else if test "$cross_compiling" != yes; then for ac_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp best_path=$ac_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5 $as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;} BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi if test "$succeeded" != "yes" ; then if test "$_version" = "0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 $as_echo "$as_me: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5 $as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;} fi # execute ACTION-IF-NOT-FOUND (if present): boost_ok=no else $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): boost_ok=yes fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # could not find boost install # try $ac_boost_path or $BOOST_ROOT as CPPFLAG if test "x$boost_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-installed and non-staged boost headers" >&5 $as_echo_n "checking for non-installed and non-staged boost headers... " >&6; } if ${ga_cv_boost_headers+:} false; then : $as_echo_n "(cached) " >&6 else gfutex_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I$ac_boost_path" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ga_cv_boost_headers="$ac_boost_path" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$gfutex_save_CPPFLAGS" if test "x$ga_cv_boost_headers" = x; then : gfutex_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS -I$BOOST_ROOT" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ga_cv_boost_headers="$BOOST_ROOT" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$gfutex_save_CPPFLAGS" fi if test "x$ga_cv_boost_headers" = x; then : ga_cv_boost_headers="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_boost_headers" >&5 $as_echo "$ga_cv_boost_headers" >&6; } if test "x$ga_cv_boost_headers" = xno; then : as_fn_error $? "could not locate boost headers" "$LINENO" 5 else BOOST_CPPFLAGS="-I$ga_cv_boost_headers" fi fi # Checks for C++ header files. # Checks for C++ typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_cxx_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_cxx_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # Checks for C++ type sizes. # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 $as_echo_n "checking size of void*... " >&6; } if ${ac_cv_sizeof_voidp+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : else if test "$ac_cv_type_voidp" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void*) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_voidp=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 $as_echo "$ac_cv_sizeof_voidp" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOIDP $ac_cv_sizeof_voidp _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 $as_echo_n "checking size of char... " >&6; } if ${ac_cv_sizeof_char+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : else if test "$ac_cv_type_char" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (char) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_char=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 $as_echo "$ac_cv_sizeof_char" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_CHAR $ac_cv_sizeof_char _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : else if test "$ac_cv_type_short" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 $as_echo "$ac_cv_sizeof_short" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SHORT $ac_cv_sizeof_short _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : else if test "$ac_cv_type_int" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 $as_echo "$ac_cv_sizeof_int" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_INT $ac_cv_sizeof_int _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 $as_echo "$ac_cv_sizeof_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG $ac_cv_sizeof_long _ACEOF if test x$ac_cv_type_long_long_int = xyes; then : # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : else if test "$ac_cv_type_long_long" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 $as_echo "$ac_cv_sizeof_long_long" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long _ACEOF fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : else if test "$ac_cv_type_float" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 $as_echo "$ac_cv_sizeof_float" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_FLOAT $ac_cv_sizeof_float _ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : else if test "$ac_cv_type_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 $as_echo "$ac_cv_sizeof_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_DOUBLE $ac_cv_sizeof_double _ACEOF if test x$ac_cv_type_long_double = xyes; then : # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } if ${ac_cv_sizeof_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : else if test "$ac_cv_type_long_double" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long double) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5 $as_echo "$ac_cv_sizeof_long_double" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double _ACEOF fi # Checks for C++ library functions. for ac_header in stdlib.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_func in gettimeofday memset pow sqrt strerror do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ############################################################################### # Look for Global Arrays ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this package is part of GA distribution" >&5 $as_echo_n "checking whether this package is part of GA distribution... " >&6; } if ${ga_cv_libga_la_found+:} false; then : $as_echo_n "(cached) " >&6 else if test -f "../libga.la"; then : ga_cv_libga_la_found=yes else ga_cv_libga_la_found=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga_cv_libga_la_found" >&5 $as_echo "$ga_cv_libga_la_found" >&6; } if test "x$ga_cv_libga_la_found" = xyes; then : GA_LIBS="../libga.la" GA_CPPFLAGS="-I$srcdir/../global/src -I../global/src -I$srcdir/../ma -I../ma -I../gaf2c -I../armci/gaf2c -I$srcdir/../armci/src/include" GA_FLIBS=`echo '@FLIBS@' | ../config.status --file=-` else ga_save_PATH="$PATH" if test -d $with_ga; then : PATH="$with_ga:$PATH" fi if test -d $with_ga/bin; then : PATH="$with_ga/bin:$PATH" fi # Extract the first word of "ga-config", so it can be a program name with args. set dummy ga-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GA_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GA_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GA_CONFIG="$GA_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GA_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GA_CONFIG=$ac_cv_path_GA_CONFIG if test -n "$GA_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GA_CONFIG" >&5 $as_echo "$GA_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi PATH="$ga_save_PATH" if test "x$GA_CONFIG" != x; then : GA_CPPFLAGS=`$GA_CONFIG --cppflags` GA_LDFLAGS=`$GA_CONFIG --ldflags` GA_LIBS=`$GA_CONFIG --libs` GA_FLIBS=`$GA_CONFIG --flibs` else GA_LIBS= GA_LDFLAGS= GA_CPPFLAGS= # Check whether --with-ga was given. if test "${with_ga+set}" = set; then : withval=$with_ga; else with_ga=yes fi case $with_ga in #( yes) : ;; #( no) : ;; #( *) : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_ga ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : GA_LIBS="$GA_LIBS $arg" ;; #( -L*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -WL*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -Wl*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -I*) : GA_CPPFLAGS="$GA_CPPFLAGS $arg" ;; #( *.a) : GA_LIBS="$GA_LIBS $arg" ;; #( *.so) : GA_LIBS="$GA_LIBS $arg" ;; #( *lib) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( -mkl*) : GA_LIBS="$GA_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi done ;; esac # Check for header. ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_CPPFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "ga.h" "ac_cv_header_ga_h" "$ac_includes_default" if test "x$ac_cv_header_ga_h" = xyes; then : else { ac_cv_search_GA_Initialize=; unset ac_cv_search_GA_Initialize;} GA_LIBS= GA_LDFLAGS= GA_CPPFLAGS= # Check whether --with-ga was given. if test "${with_ga+set}" = set; then : withval=$with_ga; else with_ga=yes fi case $with_ga in #( yes) : ;; #( no) : ;; #( *) : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_ga ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : GA_LIBS="$GA_LIBS $arg" ;; #( -L*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -WL*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -Wl*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -I*) : GA_CPPFLAGS="$GA_CPPFLAGS $arg" ;; #( *.a) : GA_LIBS="$GA_LIBS $arg" ;; #( *.so) : GA_LIBS="$GA_LIBS $arg" ;; #( *lib) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( -mkl*) : GA_LIBS="$GA_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi done ;; esac # Check for header. ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_CPPFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "ga.h" "ac_cv_header_ga_h" "$ac_includes_default" if test "x$ac_cv_header_ga_h" = xyes; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Could not locate Global Arrays 5.x nor 4.x See \`config.log' for more details" "$LINENO" 5; } fi CPPFLAGS="$ga_save_CPPFLAGS" # Check for library. ga_save_LIBS="$LIBS"; LIBS="$GA_LIBS $LIBS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing GA_Initialize" >&5 $as_echo_n "checking for library containing GA_Initialize... " >&6; } if ${ac_cv_search_GA_Initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char GA_Initialize (); int main () { return GA_Initialize (); ; return 0; } _ACEOF for ac_lib in '' global; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lma -larmci -llinalg $FLIBS $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_GA_Initialize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_GA_Initialize+:} false; then : break fi done if ${ac_cv_search_GA_Initialize+:} false; then : else ac_cv_search_GA_Initialize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_GA_Initialize" >&5 $as_echo "$ac_cv_search_GA_Initialize" >&6; } ac_res=$ac_cv_search_GA_Initialize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBS="$ga_save_LIBS" LDFLAGS="$ga_save_LDFLAGS" if test "x$ac_cv_search_GA_Initialize" != xno; then : GA_LIBS="-lglobal -lma -larmci -llinalg" $as_echo "#define HAVE_GA 1" >>confdefs.h else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Could not locate Global Arrays 5.x nor 4.x See \`config.log' for more details" "$LINENO" 5; } fi fi CPPFLAGS="$ga_save_CPPFLAGS" # Check for library. ga_save_LIBS="$LIBS"; LIBS="$GA_LIBS $LIBS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing GA_Initialize" >&5 $as_echo_n "checking for library containing GA_Initialize... " >&6; } if ${ac_cv_search_GA_Initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char GA_Initialize (); int main () { return GA_Initialize (); ; return 0; } _ACEOF for ac_lib in '' ga; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $FLIBS $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_GA_Initialize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_GA_Initialize+:} false; then : break fi done if ${ac_cv_search_GA_Initialize+:} false; then : else ac_cv_search_GA_Initialize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_GA_Initialize" >&5 $as_echo "$ac_cv_search_GA_Initialize" >&6; } ac_res=$ac_cv_search_GA_Initialize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBS="$ga_save_LIBS" LDFLAGS="$ga_save_LDFLAGS" if test "x$ac_cv_search_GA_Initialize" != xno; then : GA_LIBS="-lga" $as_echo "#define HAVE_GA 1" >>confdefs.h else { ac_cv_search_GA_Initialize=; unset ac_cv_search_GA_Initialize;} GA_LIBS= GA_LDFLAGS= GA_CPPFLAGS= # Check whether --with-ga was given. if test "${with_ga+set}" = set; then : withval=$with_ga; else with_ga=yes fi case $with_ga in #( yes) : ;; #( no) : ;; #( *) : if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ga_arg_parse_sizeof_voidp" ""; then : fi for arg in $with_ga ; do case $arg in #( yes) : ;; #( no) : ;; #( -l*) : GA_LIBS="$GA_LIBS $arg" ;; #( -L*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -WL*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -Wl*) : GA_LDFLAGS="$GA_LDFLAGS $arg" ;; #( -I*) : GA_CPPFLAGS="$GA_CPPFLAGS $arg" ;; #( *.a) : GA_LIBS="$GA_LIBS $arg" ;; #( *.so) : GA_LIBS="$GA_LIBS $arg" ;; #( *lib) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *lib64/) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( *include64/) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi ;; #( -mkl*) : GA_LIBS="$GA_LIBS $arg" ;; #( *) : ga_arg_parse_ok=no ;; esac # $arg didn't fit the most common cases # check for subdirectories e.g. lib,include if test "x$ga_arg_parse_ok" = xno; then : if test "x$ga_arg_parse_sizeof_voidp" = x8; then : if test -d $arg/lib64; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib64"; ga_arg_parse_ok=yes elif test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include64; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include64"; ga_arg_parse_ok=yes elif test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi else if test -d $arg/lib; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg/lib"; ga_arg_parse_ok=yes fi if test -d $arg/include; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg/include"; ga_arg_parse_ok=yes fi fi fi # $arg still unknown, look for "lib" and "include" anywhere... if test "x$ga_arg_parse_ok" = xno; then : case $arg in #( *lib*) : if test -d $arg; then : GA_LDFLAGS="$GA_LDFLAGS -L$arg"; ga_arg_parse_ok=yes fi ;; #( *include*) : if test -d $arg; then : GA_CPPFLAGS="$GA_CPPFLAGS -I$arg"; ga_arg_parse_ok=yes fi ;; #( *) : ;; esac fi # warn user that $arg fell through if test "x$ga_arg_parse_ok" = xno; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $arg of with_ga not parsed" >&5 $as_echo "$as_me: WARNING: $arg of with_ga not parsed" >&2;} fi done ;; esac # Check for header. ga_save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $GA_CPPFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "ga.h" "ac_cv_header_ga_h" "$ac_includes_default" if test "x$ac_cv_header_ga_h" = xyes; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Could not locate Global Arrays 5.x nor 4.x See \`config.log' for more details" "$LINENO" 5; } fi CPPFLAGS="$ga_save_CPPFLAGS" # Check for library. ga_save_LIBS="$LIBS"; LIBS="$GA_LIBS $LIBS" ga_save_LDFLAGS="$LDFLAGS"; LDFLAGS="$LDFLAGS $GA_LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing GA_Initialize" >&5 $as_echo_n "checking for library containing GA_Initialize... " >&6; } if ${ac_cv_search_GA_Initialize+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char GA_Initialize (); int main () { return GA_Initialize (); ; return 0; } _ACEOF for ac_lib in '' global; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lma -larmci -llinalg $FLIBS $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_GA_Initialize=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_GA_Initialize+:} false; then : break fi done if ${ac_cv_search_GA_Initialize+:} false; then : else ac_cv_search_GA_Initialize=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_GA_Initialize" >&5 $as_echo "$ac_cv_search_GA_Initialize" >&6; } ac_res=$ac_cv_search_GA_Initialize if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi LIBS="$ga_save_LIBS" LDFLAGS="$ga_save_LDFLAGS" if test "x$ac_cv_search_GA_Initialize" != xno; then : GA_LIBS="-lglobal -lma -larmci -llinalg" $as_echo "#define HAVE_GA 1" >>confdefs.h else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Could not locate Global Arrays 5.x nor 4.x See \`config.log' for more details" "$LINENO" 5; } fi fi fi fi ############################################################################### # Libtool setup -- no compiler/linker tests after this ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: Libtool setup" >&5 $as_echo "$as_me: Libtool setup" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} # temporarily restore unwrapped compilers # this works around a bug where libtool sadly relies on matching compiler # names in order to determine features (Fortran only, I think) # libtool doesn't recognize MPI compiler names, nor should it if test x$with_mpi_wrappers = xyes; then : ga_mpi_unwrap_push_save_CC="$CC" ga_mpi_unwrap_push_save_CXX="$CXX" ga_mpi_unwrap_push_save_F77="$F77" ga_mpi_unwrap_push_save_FC="$FC" if test "x$ga_cv_mpic_naked" != x; then : CC="$ga_cv_mpic_naked" fi if test "x$ga_cv_mpicxx_naked" != x; then : CXX="$ga_cv_mpicxx_naked" fi if test "x$ga_cv_mpif77_naked" != x; then : F77="$ga_cv_mpif77_naked" fi if test "x$ga_cv_mpifc_naked" != x; then : FC="$ga_cv_mpifc_naked" fi fi if test "x$AR" = x; then : case $ga_cv_target in #( NEC|NEC64) : AR=sxar ;; #( *) : ;; esac fi if test "x$RANLIB" = x; then : case $ga_cv_target in #( NEC|NEC64) : RANLIB=true ;; #( *) : ;; esac fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=no fi enable_dlopen=no enable_win32_dll=no # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # and now that that's over, put the MPI compilers back # also, the above hack incorrectly sets the base compiler as the linker if test x$with_mpi_wrappers = xyes; then : CC="$ga_mpi_unwrap_push_save_CC" CXX="$ga_mpi_unwrap_push_save_CXX" F77="$ga_mpi_unwrap_push_save_F77" FC="$ga_mpi_unwrap_push_save_FC" compiler="$CC" LTCC="$CC" lt_save_CC="$CC" compiler_DEFAULT="$CC" compiler_CXX="$CXX" compiler_F77="$F77" fi ############################################################################### # The End ############################################################################### ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${BGL_TRUE}" && test -z "${BGL_FALSE}"; then as_fn_error $? "conditional \"BGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BGP_TRUE}" && test -z "${BGP_FALSE}"; then as_fn_error $? "conditional \"BGP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CATAMOUNT_TRUE}" && test -z "${CATAMOUNT_FALSE}"; then as_fn_error $? "conditional \"CATAMOUNT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_SV1_TRUE}" && test -z "${CRAY_SV1_FALSE}"; then as_fn_error $? "conditional \"CRAY_SV1\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_SV2_TRUE}" && test -z "${CRAY_SV2_FALSE}"; then as_fn_error $? "conditional \"CRAY_SV2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_T3E_TRUE}" && test -z "${CRAY_T3E_FALSE}"; then as_fn_error $? "conditional \"CRAY_T3E\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_XT_TRUE}" && test -z "${CRAY_XT_FALSE}"; then as_fn_error $? "conditional \"CRAY_XT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CRAY_YMP_TRUE}" && test -z "${CRAY_YMP_FALSE}"; then as_fn_error $? "conditional \"CRAY_YMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CYGNUS_TRUE}" && test -z "${CYGNUS_FALSE}"; then as_fn_error $? "conditional \"CYGNUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CYGWIN_TRUE}" && test -z "${CYGWIN_FALSE}"; then as_fn_error $? "conditional \"CYGWIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DECOSF_TRUE}" && test -z "${DECOSF_FALSE}"; then as_fn_error $? "conditional \"DECOSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FUJITSU_VPP_TRUE}" && test -z "${FUJITSU_VPP_FALSE}"; then as_fn_error $? "conditional \"FUJITSU_VPP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HITACHI_TRUE}" && test -z "${HITACHI_FALSE}"; then as_fn_error $? "conditional \"HITACHI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HPUX_TRUE}" && test -z "${HPUX_FALSE}"; then as_fn_error $? "conditional \"HPUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IBM_TRUE}" && test -z "${IBM_FALSE}"; then as_fn_error $? "conditional \"IBM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${INTERIX_TRUE}" && test -z "${INTERIX_FALSE}"; then as_fn_error $? "conditional \"INTERIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LAPI_TRUE}" && test -z "${LAPI_FALSE}"; then as_fn_error $? "conditional \"LAPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MACX_TRUE}" && test -z "${MACX_FALSE}"; then as_fn_error $? "conditional \"MACX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEC_TRUE}" && test -z "${NEC_FALSE}"; then as_fn_error $? "conditional \"NEC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGI_TRUE}" && test -z "${SGI_FALSE}"; then as_fn_error $? "conditional \"SGI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGI_N32_TRUE}" && test -z "${SGI_N32_FALSE}"; then as_fn_error $? "conditional \"SGI_N32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SGITFP_TRUE}" && test -z "${SGITFP_FALSE}"; then as_fn_error $? "conditional \"SGITFP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SOLARIS_TRUE}" && test -z "${SOLARIS_FALSE}"; then as_fn_error $? "conditional \"SOLARIS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then as_fn_error $? "conditional \"CROSS_COMPILING\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GFUTEX_STANDALONE_TRUE}" && test -z "${GFUTEX_STANDALONE_FALSE}"; then as_fn_error $? "conditional \"GFUTEX_STANDALONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_MPI_TRUE}" && test -z "${MSG_COMMS_MPI_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_TCGMSG4_TRUE}" && test -z "${MSG_COMMS_TCGMSG4_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_TCGMSG4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MSG_COMMS_TCGMSG5_TRUE}" && test -z "${MSG_COMMS_TCGMSG5_FALSE}"; then as_fn_error $? "conditional \"MSG_COMMS_TCGMSG5\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Global Futures $as_me 0.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Global Futures config.status 0.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # Report on what we found. { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: **************************************************************" >&5 $as_echo "$as_me: **************************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: $PACKAGE_NAME configured as follows:" >&5 $as_echo "$as_me: $PACKAGE_NAME configured as follows:" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: **************************************************************" >&5 $as_echo "$as_me: **************************************************************" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_LIBS=$GA_MP_LIBS" >&5 $as_echo "$as_me: GA_MP_LIBS=$GA_MP_LIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_LDFLAGS=$GA_MP_LDFLAGS" >&5 $as_echo "$as_me: GA_MP_LDFLAGS=$GA_MP_LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS" >&5 $as_echo "$as_me: GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CC=$CC" >&5 $as_echo "$as_me: CC=$CC" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CFLAGS=$CFLAGS" >&5 $as_echo "$as_me: CFLAGS=$CFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CXX=$CXX" >&5 $as_echo "$as_me: CXX=$CXX" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CXXFLAGS=$CXXFLAGS" >&5 $as_echo "$as_me: CXXFLAGS=$CXXFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CPP=$CPP" >&5 $as_echo "$as_me: CPP=$CPP" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: CPPFLAGS=$CPPFLAGS" >&5 $as_echo "$as_me: CPPFLAGS=$CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: LDFLAGS=$LDFLAGS" >&5 $as_echo "$as_me: LDFLAGS=$LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: LIBS=$LIBS" >&5 $as_echo "$as_me: LIBS=$LIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: AR=$AR" >&5 $as_echo "$as_me: AR=$AR" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: AR_FLAGS=$AR_FLAGS" >&5 $as_echo "$as_me: AR_FLAGS=$AR_FLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_CPPFLAGS=$GA_CPPFLAGS" >&5 $as_echo "$as_me: GA_CPPFLAGS=$GA_CPPFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_LDFLAGS=$GA_LDFLAGS" >&5 $as_echo "$as_me: GA_LDFLAGS=$GA_LDFLAGS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: GA_LIBS=$GA_LIBS $GA_FLIBS" >&5 $as_echo "$as_me: GA_LIBS=$GA_LIBS $GA_FLIBS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: DEFS=$DEFS" >&5 $as_echo "$as_me: DEFS=$DEFS" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: SHELL=$SHELL" >&5 $as_echo "$as_me: SHELL=$SHELL" >&6;} { $as_echo "$as_me:${as_lineno-$LINENO}: " >&5 $as_echo "$as_me: " >&6;} ga-5-4/gfutex/configure.ac0000644000175000017500000001416312662210466013632 0ustar mbamba# Process this file with autoconf to produce a configure script. ############################################################################### ## Init autoconf ################################################################################ AC_PREREQ([2.68]) AC_INIT([Global Futures], [0.1], [hpctools@pnnl.gov], [gfutex]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/gfutex.C]) ############################################################################### # Must occur before automake init ############################################################################### GA_TARGET GA_CROSS_COMPILING ############################################################################### ## Init automake ################################################################################ AM_INIT_AUTOMAKE([color-tests foreign parallel-tests silent-rules subdir-objects]) ## Don't emit "rebuild rules" for configure, Makefile.ins, etc. AM_MAINTAINER_MODE ############################################################################### # Misc. information and package setup. ############################################################################### GA_WITH_HELP GFUTEX_TOP_BUILDDIR="`pwd`" cd "$srcdir" GFUTEX_TOP_SRCDIR="`pwd`" cd "$GFUTEX_TOP_BUILDDIR" AS_IF([test "$GFUTEX_TOP_BUILDDIR" != "GFUTEX_TOP_SRCDIR"], [AC_MSG_NOTICE([Detected VPATH build])]) AC_CACHE_CHECK([whether gfutex is built outside of GA], [gfutex_cv_standalone], [AS_IF([test -f "$GFUTEX_TOP_BUILDDIR/../armci/config.status"], [gfutex_cv_standalone=no], [gfutex_cv_standalone=yes])]) AM_CONDITIONAL([GFUTEX_STANDALONE], [test x$gfutex_cv_standalone = xyes]) # If MPI is desired we use the MPI compiler wrappers instead of the standard # compilers. GA_MSG_COMMS([no-tcgmsg]) # F77 and C++ are always enabled for gfutex enable_f77=yes enable_cxx=yes GA_DISABLE_MPI_TESTS ############################################################################### # C compiler ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([C compiler]) AC_MSG_NOTICE tascel_save_CFLAGS="$CFLAGS" GA_PROG_MPICC CFLAGS="$tascel_save_CFLAGS" AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP], [GA_ARG_PARSE([with_mpi], [GA_MP_LIBS], [GA_MP_LDFLAGS], [GA_MP_CPPFLAGS])]) GA_MPICC_TEST_COMPILE # Hack to append .x to executables. AC_SUBST([EXEEXT], [.x$EXEEXT]) GA_TARGET64 # Checks for C libraries. # Checks for C header files. AC_HEADER_ASSERT GA_CHECK_HEADERS([limits.h math.h omp.h pthread.h sched.h stdint.h stdio.h stdlib.h string.h sys/time.h unistd.h]) # Checks for C typedefs, structures, and compiler characteristics. # Checks for C library functions. ############################################################################### # C++ compiler ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([C++ compiler]) AC_MSG_NOTICE AC_LANG_PUSH([C++]) gfutex_save_CXXFLAGS="$CXXFLAGS" GA_PROG_MPICXX CXXFLAGS="$gfutex_save_CXXFLAGS" AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP]) GA_MPICXX_TEST # Checks for libraries. GA_TBB GA_BOOST # Checks for C++ header files. # Checks for C++ typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_SIZE_T # Checks for C++ type sizes. AC_CHECK_SIZEOF([void*]) AC_CHECK_SIZEOF([char]) AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AC_CHECK_SIZEOF([long]) AS_IF([test x$ac_cv_type_long_long_int = xyes], [AC_CHECK_SIZEOF([long long])]) AC_CHECK_SIZEOF([float]) AC_CHECK_SIZEOF([double]) AS_IF([test x$ac_cv_type_long_double = xyes], [AC_CHECK_SIZEOF([long double])]) # Checks for C++ library functions. AC_FUNC_MALLOC AC_CHECK_FUNCS([gettimeofday memset pow sqrt strerror]) AC_LANG_POP([C++]) ############################################################################### # Look for Global Arrays ############################################################################### GA_REQUIRE ############################################################################### # Libtool setup -- no compiler/linker tests after this ############################################################################### AC_MSG_NOTICE AC_MSG_NOTICE([Libtool setup]) AC_MSG_NOTICE # temporarily restore unwrapped compilers # this works around a bug where libtool sadly relies on matching compiler # names in order to determine features (Fortran only, I think) # libtool doesn't recognize MPI compiler names, nor should it AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP_PUSH]) GA_AR LT_INIT([disable-shared]) # and now that that's over, put the MPI compilers back # also, the above hack incorrectly sets the base compiler as the linker AS_IF([test x$with_mpi_wrappers = xyes], [GA_MPI_UNWRAP_POP compiler="$CC" LTCC="$CC" lt_save_CC="$CC" compiler_DEFAULT="$CC" compiler_CXX="$CXX" compiler_F77="$F77"]) ############################################################################### # The End ############################################################################### AC_CONFIG_FILES([Makefile]) AC_OUTPUT # Report on what we found. AC_MSG_NOTICE([]) AC_MSG_NOTICE([**************************************************************]) AC_MSG_NOTICE([ $PACKAGE_NAME configured as follows:]) AC_MSG_NOTICE([**************************************************************]) AC_MSG_NOTICE([]) AC_MSG_NOTICE([ GA_MP_LIBS=$GA_MP_LIBS]) AC_MSG_NOTICE([ GA_MP_LDFLAGS=$GA_MP_LDFLAGS]) AC_MSG_NOTICE([GA_MP_CPPFLAGS=$GA_MP_CPPFLAGS]) AC_MSG_NOTICE([ CC=$CC]) AC_MSG_NOTICE([ CFLAGS=$CFLAGS]) AC_MSG_NOTICE([ CXX=$CXX]) AC_MSG_NOTICE([ CXXFLAGS=$CXXFLAGS]) AC_MSG_NOTICE([ CPP=$CPP]) AC_MSG_NOTICE([ CPPFLAGS=$CPPFLAGS]) AC_MSG_NOTICE([ LDFLAGS=$LDFLAGS]) AC_MSG_NOTICE([ LIBS=$LIBS]) AC_MSG_NOTICE([ AR=$AR]) AC_MSG_NOTICE([ AR_FLAGS=$AR_FLAGS]) AC_MSG_NOTICE([ GA_CPPFLAGS=$GA_CPPFLAGS]) AC_MSG_NOTICE([ GA_LDFLAGS=$GA_LDFLAGS]) AC_MSG_NOTICE([ GA_LIBS=$GA_LIBS $GA_FLIBS]) AC_MSG_NOTICE([ DEFS=$DEFS]) AC_MSG_NOTICE([ SHELL=$SHELL]) AC_MSG_NOTICE([]) ga-5-4/gfutex/m4/0000755000175000017500000000000012662210463011654 5ustar mbambaga-5-4/gfutex/m4/lt_obsolete.m40000644000175000017500000001375612662210463014445 0ustar mbamba# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) ga-5-4/gfutex/m4/ltsugar.m40000644000175000017500000001042412662210463013600 0ustar mbamba# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) ga-5-4/gfutex/m4/libtool.m40000644000175000017500000105721612662210463013576 0ustar mbamba# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS ga-5-4/gfutex/m4/ltoptions.m40000644000175000017500000003007312662210463014154 0ustar mbamba# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) ga-5-4/gfutex/m4/ltversion.m40000644000175000017500000000126212662210463014144 0ustar mbamba# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) ga-5-4/gfutex/aclocal.m40000644000175000017500000011454512662210467013212 0ustar mbamba# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2009, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # (`yes' being less verbose, `no' or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([../m4/ax_boost_base.m4]) m4_include([../m4/ga.m4]) m4_include([../m4/ga_ar.m4]) m4_include([../m4/ga_arg_parse.m4]) m4_include([../m4/ga_boost.m4]) m4_include([../m4/ga_check_header.m4]) m4_include([../m4/ga_check_package.m4]) m4_include([../m4/ga_cross_compiling.m4]) m4_include([../m4/ga_mpi_test_disable.m4]) m4_include([../m4/ga_mpi_unwrap.m4]) m4_include([../m4/ga_mpicc.m4]) m4_include([../m4/ga_mpicc_test.m4]) m4_include([../m4/ga_mpicxx.m4]) m4_include([../m4/ga_mpicxx_test.m4]) m4_include([../m4/ga_msg_comms.m4]) m4_include([../m4/ga_target.m4]) m4_include([../m4/ga_tbb.m4]) m4_include([../m4/ga_with_help.m4]) m4_include([m4/libtool.m4]) m4_include([m4/lt_obsolete.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) ga-5-4/ma/0000755000175000017500000000000012662210435010426 5ustar mbambaga-5-4/ma/table.h0000644000175000017500000000132112662210435011663 0ustar mbamba/** @file * Private header file containing symbolic constants and type declarations * for the table module. * * This file should only be included by internal C files. */ #ifndef _table_h #define _table_h #include "matypes.h" /** ** constants **/ /* invalid handle */ #define TABLE_HANDLE_NONE (Integer)(-1) /** ** types **/ /* type of data in each table entry */ typedef char * TableData; /** ** function types **/ extern Integer ma_table_allocate(TableData data); extern void ma_table_deallocate(Integer handle); extern TableData ma_table_lookup(Integer handle); extern Integer ma_table_lookup_assoc(TableData data); extern Boolean ma_table_verify(Integer handle, char *caller); #endif /* _table_h */ ga-5-4/ma/testc.c0000644000175000017500000002774412662210435011732 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * $Id: testc.c,v 1.5 1999-05-27 16:31:16 d3h325 Exp $ */ /* * Test harness for portable dynamic memory allocator. */ #include "macdecls.h" #include "string-util.h" #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif /** ** constants **/ #define NUM_COMMANDS (int)(sizeof(commands) / sizeof(char *)) /** ** types **/ typedef enum { C_MA_alloc_get = 0, C_MA_allocate_heap, C_MA_chop_stack, C_MA_free_heap, C_MA_get_index, C_MA_get_next_memhandle, C_MA_get_pointer, C_MA_init, C_MA_init_memhandle_iterator, C_MA_inquire_avail, C_MA_inquire_heap, C_MA_inquire_stack, C_MA_pop_stack, C_MA_print_stats, C_MA_push_get, C_MA_push_stack, C_MA_set_auto_verify, C_MA_set_error_print, C_MA_set_hard_fail, C_MA_sizeof, C_MA_sizeof_overhead, C_MA_summarize_allocated_blocks, C_MA_verify_allocator_stuff, C_bye, C_exit, C_help, C_quit, C_questionmark } Command; /** ** variables **/ static char *commands[] = { "MA_alloc_get", "MA_allocate_heap", "MA_chop_stack", "MA_free_heap", "MA_get_index", "MA_get_next_memhandle", "MA_get_pointer", "MA_init", "MA_init_memhandle_iterator", "MA_inquire_avail", "MA_inquire_heap", "MA_inquire_stack", "MA_pop_stack", "MA_print_stats", "MA_push_get", "MA_push_stack", "MA_set_auto_verify", "MA_set_error_print", "MA_set_hard_fail", "MA_sizeof", "MA_sizeof_overhead", "MA_summarize_allocated_blocks", "MA_verify_allocator_stuff", "bye", "exit", "help", "quit", "?" }; static char *help[] = { "MA_alloc_get(datatype, nelem, name, memhandle, index)", "MA_allocate_heap(datatype, nelem, name, memhandle)", "MA_chop_stack(memhandle)", "MA_free_heap(memhandle)", "MA_get_index(memhandle, index)", "MA_get_next_memhandle(ithandle, memhandle)", "MA_get_pointer(memhandle, pointer)", "MA_init(datatype, nominal_stack, nominal_heap)", "MA_init_memhandle_iterator(ithandle)", "MA_inquire_avail(datatype)", "MA_inquire_heap(datatype)", "MA_inquire_stack(datatype)", "MA_pop_stack(memhandle)", "MA_print_stats()", "MA_push_get(datatype, nelem, name, memhandle, index)", "MA_push_stack(datatype, nelem, name, memhandle)", "MA_set_auto_verify(value)", "MA_set_error_print(value)", "MA_set_hard_fail(value)", "MA_sizeof(datatype1, nelem1, datatype2)", "MA_sizeof_overhead(datatype)", "MA_summarize_allocated_blocks()", "MA_verify_allocator_stuff()", "bye", "exit", "help", "quit", "?" }; /** ** public routines **/ /* ------------------------------------------------------------------------- */ /* * Interactive interface to MA routines. */ /* ------------------------------------------------------------------------- */ int main(argc, argv) int argc; char *argv[]; { char s[81]; /* string buffer */ int c; /* index of command */ int ii1; /* in int buffer */ int ii2; /* in int buffer */ int ii3; /* in int buffer */ Integer oi1; /* out int buffer */ MA_AccessIndex oi2; /* out int buffer */ Pointer op; /* out Pointer buffer */ int value; /* return value buffer */ while (1) { printf("testc> "); if (scanf("%80s", s) != 1) { printf("*** Input read failed; exiting.\n"); exit(1); } c = str_match(s, commands, NUM_COMMANDS); if (c == SM_MANY) { printf("*** '%s' is ambiguous\n", s); continue; } else if (c == SM_NONE) { printf("*** Unrecognized command '%s'\n", s); continue; } switch ((Command)c) { case C_MA_alloc_get: if (scanf("%d %d %80s", &ii1, &ii2, s) != 3) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_alloc_get(ii1, ii2, s, &oi1, &oi2); printf("%s=%d memhandle=%ld index=%ld\n", commands[c], value, (long)oi1, (long)oi2); } break; case C_MA_allocate_heap: if (scanf("%d %d %80s", &ii1, &ii2, s) != 3) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_allocate_heap(ii1, ii2, s, &oi1); printf("%s=%d memhandle=%ld\n", commands[c], value, (long)oi1); } break; case C_MA_chop_stack: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_chop_stack(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_free_heap: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_free_heap(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_get_index: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_get_index(ii1, &oi2); printf("%s=%d index=%ld\n", commands[c], value, (long)oi2); } break; case C_MA_get_next_memhandle: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { Integer tmp = ii1; value = MA_get_next_memhandle(&tmp, &oi1); printf("%s=%d ithandle=%ld memhandle=%ld\n", commands[c], value, (long)tmp, (long)oi1); } break; case C_MA_get_pointer: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_get_pointer(ii1, &op); printf("%s=%d pointer=%lu\n", commands[c], value, (unsigned long)op); } break; case C_MA_init: if (scanf("%d %d %d", &ii1, &ii2, &ii3) != 3) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_init(ii1, ii2, ii3); printf("%s=%d\n", commands[c], value); } break; case C_MA_init_memhandle_iterator: value = MA_init_memhandle_iterator(&oi1); printf("%s=%d ithandle=%ld\n", commands[c], value, (long)oi1); break; case C_MA_inquire_avail: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { oi1 = MA_inquire_avail(ii1); printf("%s=%ld\n", commands[c], (long)oi1); } break; case C_MA_inquire_heap: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { oi1 = MA_inquire_heap(ii1); printf("%s=%ld\n", commands[c], (long)oi1); } break; case C_MA_inquire_stack: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { oi1 = MA_inquire_stack(ii1); printf("%s=%ld\n", commands[c], (long)oi1); } break; case C_MA_pop_stack: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_pop_stack(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_print_stats: MA_print_stats(1); break; case C_MA_push_get: if (scanf("%d %d %80s", &ii1, &ii2, s) != 3) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_push_get(ii1, ii2, s, &oi1, &oi2); printf("%s=%d memhandle=%ld index=%ld\n", commands[c], value, (long)oi1, (long)oi2); } break; case C_MA_push_stack: if (scanf("%d %d %80s", &ii1, &ii2, s) != 3) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_push_stack(ii1, ii2, s, &oi1); printf("%s=%d memhandle=%ld\n", commands[c], value, (long)oi1); } break; case C_MA_set_auto_verify: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_set_auto_verify(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_set_error_print: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_set_error_print(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_set_hard_fail: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { value = MA_set_hard_fail(ii1); printf("%s=%d\n", commands[c], value); } break; case C_MA_sizeof: if (scanf("%d %d %d", &ii1, &ii2, &ii3) != 3) printf("*** Input read failed for %s\n", commands[c]); else { oi1 = MA_sizeof(ii1, ii2, ii3); printf("%s=%ld\n", commands[c], (long)oi1); } break; case C_MA_sizeof_overhead: if (scanf("%d", &ii1) != 1) printf("*** Input read failed for %s\n", commands[c]); else { oi1 = MA_sizeof_overhead(ii1); printf("%s=%ld\n", commands[c], (long)oi1); } break; case C_MA_summarize_allocated_blocks: MA_summarize_allocated_blocks(); break; case C_MA_verify_allocator_stuff: value = MA_verify_allocator_stuff(); printf("%s=%d\n", commands[c], value); break; case C_bye: /* fall through */ case C_exit: /* fall through */ case C_quit: exit(0); case C_help: /* fall through */ case C_questionmark: for (ii1 = 0; ii1 < NUM_COMMANDS; ii1++) printf(" %s\n", help[ii1]); break; default: printf("*** Unrecognized case '%d' in switch\n", c); } } return 0; } ga-5-4/ma/MA.tex0000644000175000017500000000555312662210435011455 0ustar mbamba\documentstyle[11pt,twocolumn]{article} % vertical parameters \setlength{\topmargin}{0in} \setlength{\headheight}{0in} \setlength{\headsep}{0in} \setlength{\topskip}{0in} \setlength{\textheight}{8.5in} \setlength{\footheight}{10pt} \setlength{\footskip}{0.5in} % horizontal parameters \setlength{\textwidth}{6.5in} \setlength{\oddsidemargin}{0in} \setlength{\evensidemargin}{0in} \setlength{\marginparwidth}{0in} \setlength{\parindent}{0in} \begin{document} MA is a library of routines that comprises a dynamic memory allocator for use by C, FORTRAN, or mixed-language applications. C applications can benefit from using MA instead of the ordinary malloc() and free() routines because of the extra features MA provides: both heap and stack memory management disciplines, debugging and verification support, usage statistics, and quantitative memory availability information. FORTRAN applications can take advantage of the same features, and may in fact require a library such as MA because dynamic memory allocation is not supported by all versions of the language. MA is designed to be portable across a variety of platforms. The following platforms are currently supported: \begin{itemize} \item Cray Y-MP C90 \item Cray T3D \item DEC Alpha \item HP 9000/700 \item IBM RS/6000 \item Intel DELTA \item Intel iPSC/860 \item Intel Paragon \item KSR1 \item SGI \item SGI Power Challenge \item SPARC \end{itemize} The implementation of MA uses the following memory layout: \begin{quote} segment = heap\_region stack\_region \\ region = block block block \ldots \\ block = AD gap1 guard1 client\_space guard2 gap2 \end{quote} A segment of memory is obtained from the OS upon initialization. The low end of the segment is managed as a heap; the heap region grows from low addresses to high addresses. The high end of the segment is managed as a stack; the stack region grows from high addresses to low addresses. Each region consists of a series of contiguous blocks, one per allocation request, and possibly some unused space. Blocks in the heap region are either in use by the client (allocated and not yet deallocated) or not in use by the client (allocated and already deallocated). A block on the rightmost end of the heap region becomes part of the unused space upon deallocation. Blocks in the stack region are always in use by the client, because when a stack block is deallocated, it becomes part of the unused space. A block consists of the client space, i.e., the range of memory available for use by the application; guard words adjacent to each end of the client space to help detect improper memory access by the client; bookkeeping info (in an ``allocation descriptor,'' AD); and two gaps, each zero or more bytes long, to satisfy alignment constraints (specifically, to ensure that AD and client\_space are aligned properly). A set of man pages for the MA routines is available. \end{document} ga-5-4/ma/table.c0000644000175000017500000001743212662210435011670 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * $Id: table.c,v 1.6 2000-10-13 23:18:18 d3h325 Exp $ */ /* * Dynamic table module. * * Each table entry consists of an external data item and internal state. * The size of the table is automatically increased if there isn't room * to add another entry. The client can allocate, deallocate, verify * entries, and perform both handle-->data and data-->handle lookup. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "error.h" #include "memcpy.h" #include "scope.h" #include "table.h" /** ** constants **/ /* default # of initial table entries */ #define DEFAULT_TABLE_ENTRIES 32 /** ** types **/ /* state of a TableEntry */ typedef enum { TES_Unused = 0, /* never used */ TES_Allocated, /* currently in use */ TES_Deallocated /* formerly in use */ } TableEntryState; /* table entry consists of data and state */ typedef struct _TableEntry { TableData data; /* in this entry */ TableEntryState state; /* of this entry */ } TableEntry; /* table is an array of table entries */ typedef TableEntry * Table; /** ** variables **/ /* currently only one table is managed */ private Table ma_table = NULL; private Integer ma_table_capacity = 0; private Integer ma_table_entries = 0; private Integer ma_table_next_slot = 0; /** ** public routines for internal use only **/ /* ------------------------------------------------------------------------- */ /* * Allocate a table slot, store the given data into it, and return a handle * by which the slot may be referenced. If a slot cannot be allocated, * return TABLE_HANDLE_NONE. */ /* ------------------------------------------------------------------------- */ public Integer ma_table_allocate(data) TableData data; /* to store */ { Table new_ma_table; Integer new_ma_table_capacity; unsigned new_ma_table_size; Integer i; Integer slots_examined; /* expand the table if necessary */ if (ma_table_entries >= ma_table_capacity) { /* increase table capacity */ if (ma_table_capacity == 0) /* set the initial capacity */ new_ma_table_capacity = DEFAULT_TABLE_ENTRIES; else /* double the current capacity */ new_ma_table_capacity = 2 * ma_table_capacity; /* allocate space for new table */ new_ma_table_size = (unsigned)(new_ma_table_capacity * sizeof(TableEntry)); if ((new_ma_table = (Table)bytealloc(new_ma_table_size)) == (Table)NULL) { (void)sprintf(ma_ebuf, "could not allocate %u bytes for ma_table", new_ma_table_size); ma_error(EL_Nonfatal, ET_Internal, "ma_table_allocate", ma_ebuf); return TABLE_HANDLE_NONE; } /* copy and free old table */ if (ma_table_capacity > 0) { bytecopy(ma_table, new_ma_table, (ma_table_capacity * sizeof(TableEntry))); bytefree(ma_table); } /* initialize new part of new table */ for (i = new_ma_table_capacity-1; i >= ma_table_capacity; i--) new_ma_table[i].state = TES_Unused; /* remember the new table */ ma_table = new_ma_table; ma_table_next_slot = ma_table_capacity; ma_table_capacity = new_ma_table_capacity; } /* perform a linear circular search to find the next available slot */ for (slots_examined = 0, i = ma_table_next_slot; slots_examined < ma_table_capacity; slots_examined++, i = (i+1) % ma_table_capacity) { if (ma_table[i].state != TES_Allocated) { /* store the data */ ma_table[i].data = data; ma_table[i].state = TES_Allocated; /* increment ma_table_entries */ ma_table_entries++; /* advance ma_table_next_slot */ ma_table_next_slot = (i+1) % ma_table_capacity; /* return the handle */ return i; } } /* if we get here, something is wrong */ (void)sprintf(ma_ebuf, "no ma_table slot available, %ld/%ld slots used", (long)ma_table_entries, (long)ma_table_capacity); ma_error(EL_Nonfatal, ET_Internal, "ma_table_allocate", ma_ebuf); return TABLE_HANDLE_NONE; } /* ------------------------------------------------------------------------- */ /* * Deallocate the table slot corresponding to the given handle, * which should have been verified previously (e.g., via ma_table_verify()). * If handle is invalid, print an error message. */ /* ------------------------------------------------------------------------- */ public void ma_table_deallocate(handle) Integer handle; /* to deallocate */ { if (ma_table_verify(handle, "ma_table_deallocate")) { /* deallocate the slot */ ma_table[handle].state = TES_Deallocated; /* decrement ma_table_entries */ ma_table_entries--; } } /* ------------------------------------------------------------------------- */ /* * Return the data in the table slot corresponding to the given handle, * which should have been verified previously (e.g., via ma_table_verify()). * If handle is invalid, print an error message and return NULL. */ /* ------------------------------------------------------------------------- */ public TableData ma_table_lookup(handle) Integer handle; /* to lookup */ { if (ma_table_verify(handle, "ma_table_lookup")) /* success */ return ma_table[handle].data; else /* failure */ return (TableData)NULL; } /* ------------------------------------------------------------------------- */ /* * Return the handle for the table slot containing the given data (i.e., * perform an associative or inverted lookup), or TABLE_HANDLE_NONE if * no currently allocated table slot contains the given data. * * If more than one table slot contains the given data, the one whose * handle is returned is undefined (i.e., implementation dependent). */ /* ------------------------------------------------------------------------- */ public Integer ma_table_lookup_assoc(data) TableData data; /* to lookup */ { Integer i; /* perform a linear search from the first table slot */ for (i = 0; i < ma_table_capacity; i++) if ((ma_table[i].state == TES_Allocated) && (ma_table[i].data == data)) /* success */ return i; /* failure */ return TABLE_HANDLE_NONE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if the given handle corresponds to a valid table slot * (one that is currently allocated), else return MA_FALSE and print an * error message. */ /* ------------------------------------------------------------------------- */ public Boolean ma_table_verify(handle, caller) Integer handle; /* to verify */ char *caller; /* name of calling routine */ { Boolean badhandle; /* is handle invalid? */ badhandle = MA_FALSE; /* if handle is invalid, construct an error message */ if ((handle < 0) || (handle >= ma_table_capacity) || (ma_table[handle].state == TES_Unused)) { (void)sprintf(ma_ebuf, "handle %ld is not valid", (long)handle); badhandle = MA_TRUE; } else if (ma_table[handle].state == TES_Deallocated) { (void)sprintf(ma_ebuf, "handle %ld already deallocated", (long)handle); badhandle = MA_TRUE; } if (badhandle) { /* invalid handle */ ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } else /* valid handle */ return MA_TRUE; } ga-5-4/ma/maf2c.fh0000644000175000017500000000512712662210435011742 0ustar mbamba#ifndef _maf2c_fh #define _maf2c_fh c c $Id: maf2c.fh,v 1.6 2002-09-14 05:40:30 d3g001 Exp $ c c c Private header file containing FORTRAN type declarations for the c C wrapper routines. c c This file should only be included by internal FORTRAN files. c c c The guard ends here instead of at the end of the file because we c need the declarations (stuff below) to be defined each time this file c is included by a FORTRAN file. c #endif /* _maf2c_fh */ c c function types c integer f2c_alloc_get integer f2c_allocate_heap integer f2c_chop_stack integer f2c_free_heap integer f2c_free_heap_piece integer f2c_get_index integer f2c_get_next_memhandle integer f2c_get_numalign integer f2c_inform_base integer f2c_init integer f2c_initialized integer f2c_init_memhandle_iterator integer f2c_inquire_avail integer f2c_inquire_heap integer f2c_inquire_heap_check_stack integer f2c_inquire_heap_no_partition integer f2c_inquire_stack integer f2c_inquire_stack_check_heap integer f2c_inquire_stack_no_partition integer f2c_pop_stack c void f2c_print_stats integer f2c_push_get integer f2c_push_stack integer f2c_set_auto_verify integer f2c_set_error_print integer f2c_set_hard_fail integer f2c_set_numalign integer f2c_sizeof integer f2c_sizeof_overhead c void f2c_summarize_allocated_blocks c void f2c_trace integer f2c_verify_allocator_stuff external f2c_alloc_get external f2c_allocate_heap external f2c_chop_stack external f2c_free_heap external f2c_free_heap_piece external f2c_get_index external f2c_get_next_memhandle external f2c_get_numalign external f2c_inform_base external f2c_init external f2c_initialized external f2c_init_memhandle_iterator external f2c_inquire_avail external f2c_inquire_heap external f2c_inquire_heap_check_stack external f2c_inquire_heap_no_partition external f2c_inquire_stack external f2c_inquire_stack_check_heap external f2c_inquire_stack_no_partition external f2c_pop_stack external f2c_print_stats external f2c_push_get external f2c_push_stack external f2c_set_auto_verify external f2c_set_error_print external f2c_set_hard_fail external f2c_set_numalign external f2c_sizeof external f2c_sizeof_overhead external f2c_summarize_allocated_blocks external f2c_trace external f2c_verify_allocator_stuff ga-5-4/ma/f2c.c0000644000175000017500000001667412662210435011262 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * C wrapper routines. In general, f2c_foo_ is called by FORTRAN routine * MA_foo, performs any necessary argument munging, then calls C routine * MA_foo. */ #include "farg.h" #include "typesf2c.h" #include "ma.h" #include "scope.h" #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS public Boolean FATR f2c_alloc_get_(datatype, nelem, name, memhandle, index, namesize) Integer *datatype; Integer *nelem; char *name; Integer *memhandle; MA_AccessIndex *index; int namesize; /* implicitly passed by FORTRAN */ #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ public Boolean FATR f2c_alloc_get_(datatype, nelem, name, namesize, memhandle, index) Integer *datatype; Integer *nelem; char *name; int namesize; /* implicitly passed by FORTRAN */ Integer *memhandle; MA_AccessIndex *index; #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ { Boolean value; char buf[MA_NAMESIZE]; /* ensure that name is NUL-terminated */ ga_f2cstring(name, namesize, buf, (Integer)sizeof(buf)); value = MA_alloc_get(*datatype, *nelem, buf, memhandle, index); /* FORTRAN array indexing is 1-based, so increment index */ (*index)++; return value; } #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS public Boolean FATR f2c_allocate_heap_(datatype, nelem, name, memhandle, namesize) Integer *datatype; Integer *nelem; char *name; Integer *memhandle; int namesize; /* implicitly passed by FORTRAN */ #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ public Boolean FATR f2c_allocate_heap_(datatype, nelem, name, namesize, memhandle) Integer *datatype; Integer *nelem; char *name; int namesize; /* implicitly passed by FORTRAN */ Integer *memhandle; #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ { char buf[MA_NAMESIZE]; /* ensure that name is NUL-terminated */ ga_f2cstring(name, namesize, buf, (Integer)sizeof(buf)); return MA_allocate_heap(*datatype, *nelem, buf, memhandle); } public Boolean FATR f2c_chop_stack_(memhandle) Integer *memhandle; { return MA_chop_stack(*memhandle); } public Boolean FATR f2c_free_heap_(memhandle) Integer *memhandle; { return MA_free_heap(*memhandle); } public Boolean FATR f2c_free_heap_piece_(memhandle, nelem) Integer *memhandle; Integer *nelem; { return MA_free_heap_piece(*memhandle, *nelem); } public Boolean FATR f2c_get_index_(memhandle, index) Integer *memhandle; MA_AccessIndex *index; { Boolean value = MA_get_index(*memhandle, index); /* FORTRAN array indexing is 1-based, so increment index */ (*index)++; return value; } public Boolean FATR f2c_get_next_memhandle_(ithandle, memhandle) Integer *ithandle; Integer *memhandle; { return MA_get_next_memhandle(ithandle, memhandle); } public Boolean FATR f2c_get_numalign_(value) Integer *value; { return MA_get_numalign(value); } public Boolean FATR f2c_inform_base_(datatype, address1, address2) Integer *datatype; Pointer address1; Pointer address2; { return MAi_inform_base(*datatype, address1, address2); } public Boolean FATR f2c_init_(datatype, nominal_stack, nominal_heap) Integer *datatype; Integer *nominal_stack; Integer *nominal_heap; { return MA_init(*datatype, *nominal_stack, *nominal_heap); } public Boolean FATR f2c_initialized_() { return MA_initialized(); } public Boolean FATR f2c_init_memhandle_iterator_(ithandle) Integer *ithandle; { return MA_init_memhandle_iterator(ithandle); } public Integer FATR f2c_inquire_avail_(datatype) Integer *datatype; { return MA_inquire_avail(*datatype); } public Integer FATR f2c_inquire_heap_(datatype) Integer *datatype; { return MA_inquire_heap(*datatype); } public Integer FATR f2c_inquire_heap_check_stack_(datatype) Integer *datatype; { return MA_inquire_heap_check_stack(*datatype); } public Integer FATR f2c_inquire_heap_no_partition_(datatype) Integer *datatype; { return MA_inquire_heap_no_partition(*datatype); } public Integer FATR f2c_inquire_stack_(datatype) Integer *datatype; { return MA_inquire_stack(*datatype); } public Integer FATR f2c_inquire_stack_check_heap_(datatype) Integer *datatype; { return MA_inquire_stack_check_heap(*datatype); } public Integer FATR f2c_inquire_stack_no_partition_(datatype) Integer *datatype; { return MA_inquire_stack_no_partition(*datatype); } public Boolean FATR f2c_pop_stack_(memhandle) Integer *memhandle; { return MA_pop_stack(*memhandle); } public void FATR f2c_print_stats_(printroutines) Boolean *printroutines; { MA_print_stats(*printroutines); } #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS public Boolean FATR f2c_push_get_(datatype, nelem, name, memhandle, index, namesize) Integer *datatype; Integer *nelem; char *name; Integer *memhandle; MA_AccessIndex *index; int namesize; /* implicitly passed by FORTRAN */ #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ public Boolean FATR f2c_push_get_(datatype, nelem, name, namesize, memhandle, index) Integer *datatype; Integer *nelem; char *name; int namesize; /* implicitly passed by FORTRAN */ Integer *memhandle; MA_AccessIndex *index; #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ { Boolean value; char buf[MA_NAMESIZE]; /* ensure that name is NUL-terminated */ ga_f2cstring(name, namesize, buf, (Integer)sizeof(buf)); value = MA_push_get(*datatype, *nelem, buf, memhandle, index); /* FORTRAN array indexing is 1-based, so increment index */ (*index)++; return value; } #ifdef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS public Boolean FATR f2c_push_stack_(datatype, nelem, name, memhandle, namesize) Integer *datatype; Integer *nelem; char *name; Integer *memhandle; int namesize; /* implicitly passed by FORTRAN */ #else /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ public Boolean FATR f2c_push_stack_(datatype, nelem, name, namesize, memhandle) Integer *datatype; Integer *nelem; char *name; int namesize; Integer *memhandle; #endif /* F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS */ { char buf[MA_NAMESIZE]; /* ensure that name is NUL-terminated */ ga_f2cstring(name, namesize, buf, (Integer)sizeof(buf)); return MA_push_stack(*datatype, *nelem, buf, memhandle); } public Boolean FATR f2c_set_auto_verify_(value) Integer *value; { return MA_set_auto_verify((Boolean)*value); } public Boolean FATR f2c_set_error_print_(value) Integer *value; { return MA_set_error_print((Boolean)*value); } public Boolean FATR f2c_set_hard_fail_(value) Integer *value; { return MA_set_hard_fail((Boolean)*value); } public Boolean FATR f2c_set_numalign_(value) Integer *value; { return MA_set_numalign(*value); } public Integer FATR f2c_sizeof_(datatype1, nelem1, datatype2) Integer *datatype1; Integer *nelem1; Integer *datatype2; { return MA_sizeof(*datatype1, *nelem1, *datatype2); } public Integer FATR f2c_sizeof_overhead_(datatype) Integer *datatype; { return MA_sizeof_overhead(*datatype); } public void FATR f2c_summarize_allocated_blocks_() { /* FORTRAN indices are 1-based */ MAi_summarize_allocated_blocks(1); } public void FATR f2c_trace_(value) Integer *value; { MA_trace((Boolean)*value); } public Boolean FATR f2c_verify_allocator_stuff_() { return MA_verify_allocator_stuff(); } ga-5-4/ma/scope.h0000644000175000017500000000050112662210435011704 0ustar mbamba/** @file * Private header file containing symbolic constants for internal C routines. * * This file should only be included by internal C files. */ #ifndef _scope_h #define _scope_h /** ** constants **/ /* pseudo reserved words for scope control */ #define private static #define public #endif /* _scope_h */ ga-5-4/ma/macdecls.h0000644000175000017500000001277412662210435012365 0ustar mbamba/** @file * Public header file for a portable dynamic memory allocator. * * This file may be included by internal and external C files. */ #ifndef _macdecls_h #define _macdecls_h #ifdef __cplusplus extern "C" { #endif #include "macommon.h" #include "matypes.h" /** ** constants **/ /* datatypes */ #define MT_CHAR MT_C_CHAR /**< char */ #define MT_INT MT_C_INT /**< int */ #define MT_LONGINT MT_C_LONGINT /**< long int */ #define MT_LONGLONG MT_C_LONGLONG /**< long long */ #define MT_REAL MT_C_FLOAT /**< float */ #define MT_DBL MT_C_DBL /**< double */ #define MT_LDBL MT_C_LDBL /**< long double */ #define MT_SCPL MT_C_SCPL /**< single precision complex */ #define MT_DCPL MT_C_DCPL /**< double precision complex */ #define MT_LDCPL MT_C_LDCPL /**< long double precision complex */ #define MT_C_FIRST MT_CHAR /**< first type */ #define MT_C_LAST MT_LDCPL /**< last type */ /** ** function types **/ extern Boolean MA_alloc_get( Integer datatype, /**< of elements in this block */ Integer nelem, /**< # of elements in this block */ const char *name, /**< assigned to this block by client */ Integer *memhandle, /**< RETURN: handle for this block */ MA_AccessIndex *index /**< RETURN: index for this block */ ); extern Boolean MA_allocate_heap( Integer datatype, /**< of elements in this block */ Integer nelem, /**< # of elements in this block */ const char *name, /**< assigned to this block by client */ Integer *memhandle /**< RETURN: handle for this block */ ); extern Boolean MA_chop_stack(Integer memhandle); extern Boolean MA_free_heap(Integer memhandle); extern Boolean MA_free_heap_piece( Integer memhandle, /**< the block to deallocate a piece of */ Integer nelem /**< # of elements to deallocate */); extern Boolean MA_get_index( Integer memhandle, /**< block to get index for */ MA_AccessIndex *index /**< RETURN: base index */); extern Pointer MA_get_mbase(Integer datatype); /**< to get base address of */ extern Boolean MA_get_next_memhandle( Integer *ithandle, /**< handle for this iterator */ Integer *memhandle /**< RETURN: handle for the next block */); extern Boolean MA_get_numalign(Integer *value); extern Boolean MA_get_pointer( Integer memhandle, /**< block to get pointer for */ void *pointer /**< JN: void** = void* */ ); extern Boolean MA_init( Integer datatype, /**< for computing storage requirement */ Integer nominal_stack, /**< # of datatype elements desired for stack */ Integer nominal_heap /**< # of datatype elements desired for heap */); extern Boolean MA_initialized(); extern Boolean MA_init_memhandle_iterator( Integer *ithandle); extern Integer MA_inquire_avail(Integer datatype); extern Integer MA_inquire_heap(Integer datatype); extern Integer MA_inquire_heap_check_stack(Integer datatype); extern Integer MA_inquire_heap_no_partition(Integer datatype); extern Integer MA_inquire_stack(Integer datatype); extern Integer MA_inquire_stack_check_heap(Integer datatype); extern Integer MA_inquire_stack_no_partition(Integer datatype); extern Boolean MA_pop_stack(Integer memhandle); extern void MA_print_stats(Boolean printroutines); extern Boolean MA_push_get( Integer datatype, /**< of elements in this block */ Integer nelem, /**< # of elements in this block */ const char *name, /**< assigned to this block by client */ Integer *memhandle, /**< RETURN: handle for this block */ MA_AccessIndex *index /**< RETURN: index for this block */); extern Boolean MA_push_stack( Integer datatype, /**< of elements in this block */ Integer nelem, /**< # of elements in this block */ const char *name, /**< assigned to this block by client */ Integer *memhandle /**< RETURN: handle for this block */); extern Boolean MA_set_auto_verify(Boolean value /* to set flag to */); extern Boolean MA_set_error_print(Boolean value /* to set flag to */); extern Boolean MA_set_hard_fail( Boolean value /* to set flag to */); extern Boolean MA_set_numalign(Integer value); extern Integer MA_sizeof( Integer datatype1, /**< of source elements */ Integer nelem1, /**< # of source elements */ Integer datatype2 /**< of target elements */); extern Integer MA_sizeof_overhead(Integer datatype); extern void MA_summarize_allocated_blocks(); extern void MA_trace(Boolean value); extern Boolean MA_verify_allocator_stuff(); extern void MA_set_error_callback(void(*func)()); extern void ma_set_error_callback(); /** ** variables **/ /* base arrays for the C datatypes */ extern char ma_cb_char[]; /**< MT_C_CHAR */ extern int ma_cb_int[]; /**< MT_C_INT */ extern long ma_cb_long[]; /**< MT_C_LONGINT */ extern long long ma_cb_longlong[]; /**< MT_C_LONGLONG */ extern float ma_cb_float[]; /**< MT_C_FLOAT */ extern double ma_cb_dbl[]; /**< MT_C_DBL */ extern MA_LongDouble ma_cb_ldbl[]; /**< MT_C_LDBL */ extern MA_SingleComplex ma_cb_scpl[]; /**< MT_C_SCPL */ extern MA_DoubleComplex ma_cb_dcpl[]; /**< MT_C_DCPL */ extern MA_LongDoubleComplex ma_cb_ldcpl[]; /**< MT_C_LDCPL */ #ifdef __cplusplus } #endif #endif /* _macdecls_h */ ga-5-4/ma/test-coalesce.c0000644000175000017500000000333412662210435013330 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * $Id: test-coalesce.c,v 1.4 2002-09-14 05:40:30 d3g001 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "macdecls.h" #define MAXHANDLES 10 int main(int argc, char **argv) { Integer bytes_heap; Integer bytes_stack; int howmany; Boolean ok; Integer handle[MAXHANDLES]; MA_AccessIndex index[MAXHANDLES]; /* set sizes of heap and stack */ bytes_heap = 1024; bytes_stack = 0; /* initialize */ ok = MA_init(MT_CHAR, bytes_stack, bytes_heap); if (!ok) { (void)fprintf(stderr, "MA_init failed; punting\n"); exit(1); } howmany = MA_inquire_heap(MT_INT); (void)printf("MA_inquire_heap(MT_INT) = %d\n", howmany); printf("# Allocating 4 memory segments\n"); MA_alloc_get(MT_INT, howmany/5, "heap0", &handle[0], &index[0]); MA_alloc_get(MT_INT, howmany/5, "heap1", &handle[1], &index[1]); MA_alloc_get(MT_INT, howmany/5, "heap2", &handle[2], &index[2]); MA_alloc_get(MT_INT, howmany/5, "heap3", &handle[3], &index[3]); printf("# Deleting 2 non-adjacent memory segments\n"); MA_free_heap(handle[0]); MA_free_heap(handle[2]); printf("# Attempting to allocate memory segment -- should fail\n"); MA_alloc_get(MT_INT, howmany/4, "heap4", &handle[4], &index[4]); printf("# Freeing some memory and trying again -- should succeed\n"); MA_free_heap(handle[1]); MA_alloc_get(MT_INT, howmany/4, "heap4", &handle[4], &index[4]); printf("# Printing stats for allocated blocks -- should be two active\n"); MA_summarize_allocated_blocks(); return 0; } ga-5-4/ma/error.c0000644000175000017500000000360412662210435011726 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /** @file * Error handling module. */ #include #include #include "error.h" #include "scope.h" /** default # of initial table entries */ #define MA_EBUF_SIZE 1024 /** buffer for error messages */ public char ma_ebuf[MA_EBUF_SIZE]; /** print error messages for nonfatal errors? */ public Boolean ma_error_print = MA_TRUE; /** terminate execution upon any error? */ public Boolean ma_hard_fail = MA_FALSE; void (*ma_func_terminate)() = 0; void MA_set_error_callback(void (*func)()) { ma_func_terminate = func; } /** * Depending on the given arguments and certain global parameters, * possibly print a message to stderr and/or terminate the program. * * @param elevel severity of error * @param etype category of error * @param func name of routine in which error was found * @param emsg msg describing error */ public void ma_error(ErrorLevel elevel, ErrorType etype, char *func, char *emsg) { /* print a message? */ if ((elevel == EL_Fatal) || ma_hard_fail || ma_error_print) { char *s1; /* internal or not */ char *s2; /* class of error */ /* set s1 */ if (etype == ET_Internal) { s1 = "internal "; } else { s1 = ""; } /* set s2 */ if (elevel == EL_Fatal) { s2 = "fatal error"; } else if (ma_hard_fail) { s2 = "hard failure"; } else { s2 = "error"; } /* print the message */ (void)fflush(stdout); (void)fflush(stderr); (void)fprintf(stderr, "MA %s%s: %s: %s\n", s1, s2, func, emsg); (void)fflush(stderr); } /* terminate execution? */ if ((elevel == EL_Fatal) || ma_hard_fail) { if(ma_func_terminate) { ma_func_terminate("MA aborting",0); } else { exit(1); } } } ga-5-4/ma/mafdecls.fh.in0000644000175000017500000001163112662210435013132 0ustar mbamba#ifndef _mafdecls_fh #define _mafdecls_fh ! ! $Id: mafdecls.fh,v 1.11 2002-09-14 05:40:30 d3g001 Exp $ ! ! ! Public header file for a portable dynamic memory allocator. ! ! This file may be included by internal and external FORTRAN files. ! #include "macommon.h" ! ! The guard ends here instead of at the end of the file because we only ! need the cpp constants (stuff above) defined once per FORTRAN file, ! but need the declarations (stuff below) to be defined each time this ! file is included in a FORTRAN file. ! #endif ! ! constants ! ! type declarations for datatype constants integer MT_BYTE ! byte integer MT_INT ! integer integer MT_LOG ! logical integer MT_REAL ! real integer MT_DBL ! double precision integer MT_SCPL ! single precision complex integer MT_DCPL ! double precision complex integer MT_F_FIRST ! first type integer MT_F_LAST ! last type ! parameter declarations for datatype constants parameter (MT_BYTE = MT_F_BYTE) parameter (MT_INT = MT_F_INT) parameter (MT_LOG = MT_F_LOG) parameter (MT_REAL = MT_F_REAL) parameter (MT_DBL = MT_F_DBL) parameter (MT_SCPL = MT_F_SCPL) parameter (MT_DCPL = MT_F_DCPL) parameter (MT_F_FIRST = MT_BYTE) parameter (MT_F_LAST = MT_DCPL) ! ! function types ! #ifndef MAF_INTERNAL logical MA_alloc_get logical MA_allocate_heap logical MA_chop_stack logical MA_free_heap logical MA_free_heap_piece logical MA_get_index logical MA_get_next_memhandle logical MA_get_numalign logical MA_init logical MA_initialized logical MA_init_memhandle_iterator integer MA_inquire_avail integer MA_inquire_heap integer MA_inquire_heap_check_stack integer MA_inquire_heap_no_partition integer MA_inquire_stack integer MA_inquire_stack_check_heap integer MA_inquire_stack_no_partition logical MA_pop_stack ! subroutine MA_print_stats logical MA_push_get logical MA_push_stack logical MA_set_auto_verify logical MA_set_error_print logical MA_set_hard_fail logical MA_set_numalign integer MA_sizeof integer MA_sizeof_overhead ! subroutine MA_summarize_allocated_blocks ! subroutine MA_trace logical MA_verify_allocator_stuff external MA_alloc_get external MA_allocate_heap external MA_chop_stack external MA_free_heap external MA_free_heap_piece external MA_get_index external MA_get_next_memhandle external MA_get_numalign external MA_init external MA_initialized external MA_init_memhandle_iterator external MA_inquire_avail external MA_inquire_heap external MA_inquire_heap_check_stack external MA_inquire_heap_no_partition external MA_inquire_stack external MA_inquire_stack_check_heap external MA_inquire_stack_no_partition external MA_pop_stack external MA_print_stats external MA_push_get external MA_push_stack external MA_set_auto_verify external MA_set_error_print external MA_set_hard_fail external MA_set_numalign external MA_sizeof external MA_sizeof_overhead external MA_summarize_allocated_blocks external MA_trace external MA_verify_allocator_stuff #endif ! ! variables ! #ifdef HPUX # define HP_SHARED_COMMON_ #endif ! common blocks #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_byte #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_byte/ #endif common /mbc_byte/ byte_mb(2) character*1 byte_mb #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_int #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_int/ #endif common /mbc_int/ int_mb(2) integer int_mb #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_log/ #endif common /mbc_log/ log_mb(2) logical log_mb #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_real #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_real/ #endif common /mbc_real/ real_mb(2) real real_mb #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_dbl #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_dbl/ #endif common /mbc_dbl/ dbl_mb(2) double precision dbl_mb #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_scpl #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_scpl/ #endif common /mbc_scpl/ scpl_mb(2) complex scpl_mb #ifdef INTEL_64ALIGN !DIR$ ATTRIBUTES ALIGN : 64 :: mbc_dcpl #endif #ifdef HP_SHARED_COMMON *$HP$ shared_common /mbc_dcpl/ #endif common /mbc_dcpl/ dcpl_mb(2) double complex dcpl_mb #define MA_ACCESS_INDEX_TYPE @MA_ACCESS_INDEX_TYPE@ #define MAPOINTER @MA_ACCESS_INDEX_TYPE@ ga-5-4/ma/error.h0000644000175000017500000000167212662210435011736 0ustar mbamba/** @file * Private header file containing symbolic constants and type declarations * for the error handling module. * * This file should only be included by internal C files. */ #ifndef _error_h #define _error_h #include "macdecls.h" /** ** types **/ /* severity levels of errors */ typedef enum { EL_Fatal, /* unrecoverable */ EL_Nonfatal /* recoverable */ } ErrorLevel; /* categories of errors */ typedef enum { ET_External, /* anticipated, client-level problem */ ET_Internal /* unanticipated problem internal to MA */ } ErrorType; /** ** function types **/ extern void ma_error(ErrorLevel elevel, ErrorType etype, char *func, char *emsg); /** ** variables **/ /* buffer for error messages */ extern char ma_ebuf[]; /* print error messages for nonfatal errors? */ extern Boolean ma_error_print; /* terminate execution upon any error? */ extern Boolean ma_hard_fail; #endif /* _error_h */ ga-5-4/ma/ma.h0000644000175000017500000000656212662210435011205 0ustar mbamba/** @file * Private header file containing symbolic constants and type declarations * for internal C routines. * * This file should only be included by internal C files. */ #ifndef _ma_h #define _ma_h #include "macdecls.h" /** ** function types **/ extern Boolean MAi_inform_base(Integer datatype, Pointer address1, Pointer address2); extern void MAi_summarize_allocated_blocks(int index_base); #define f2c_alloc_get_ F77_FUNC_(f2c_alloc_get,F2C_ALLOC_GET) #define f2c_allocate_heap_ F77_FUNC_(f2c_allocate_heap,F2C_ALLOCATE_HEAP) #define f2c_chop_stack_ F77_FUNC_(f2c_chop_stack,F2C_CHOP_STACK) #define f2c_free_heap_ F77_FUNC_(f2c_free_heap,F2C_FREE_HEAP) #define f2c_free_heap_piece_ F77_FUNC_(f2c_free_heap_piece,F2C_FREE_HEAP_PIECE) #define f2c_get_index_ F77_FUNC_(f2c_get_index,F2C_GET_INDEX) #define f2c_get_next_memhandle_ F77_FUNC_(f2c_get_next_memhandle,F2C_GET_NEXT_MEMHANDLE) #define f2c_get_numalign_ F77_FUNC_(f2c_get_numalign,F2C_GET_NUMALIGN) #define f2c_inform_base_ F77_FUNC_(f2c_inform_base,F2C_INFORM_BASE) #define f2c_inform_base_fcd_ F77_FUNC_(f2c_inform_base_fcd,F2C_INFORM_BASE_FCD) #define f2c_init_ F77_FUNC_(f2c_init,F2C_INIT) #define f2c_init_memhandle_iterator_ F77_FUNC_(f2c_init_memhandle_iterator,F2C_INIT_MEMHANDLE_ITERATOR) #define f2c_initialized_ F77_FUNC_(f2c_initialized,F2C_INITIALIZED) #define f2c_inquire_avail_ F77_FUNC_(f2c_inquire_avail,F2C_INQUIRE_AVAIL) #define f2c_inquire_heap_ F77_FUNC_(f2c_inquire_heap,F2C_INQUIRE_HEAP) #define f2c_inquire_stack_ F77_FUNC_(f2c_inquire_stack,F2C_INQUIRE_STACK) #define f2c_inquire_heap_check_stack_ F77_FUNC_(f2c_inquire_heap_check_stack,F2C_INQUIRE_HEAP_CHECK_STACK) #define f2c_inquire_heap_no_partition_ F77_FUNC_(f2c_inquire_heap_no_partition,F2C_INQUIRE_HEAP_NO_PARTITION) #define f2c_inquire_stack_check_heap_ F77_FUNC_(f2c_inquire_stack_check_heap,F2C_INQUIRE_STACK_CHECK_HEAP) #define f2c_inquire_stack_no_partition_ F77_FUNC_(f2c_inquire_stack_no_partition,F2C_INQUIRE_STACK_NO_PARTITION) #define f2c_pop_stack_ F77_FUNC_(f2c_pop_stack,F2C_POP_STACK) #define f2c_print_stats_ F77_FUNC_(f2c_print_stats,F2C_PRINT_STATS) #define f2c_push_get_ F77_FUNC_(f2c_push_get,F2C_PUSH_GET) #define f2c_push_stack_ F77_FUNC_(f2c_push_stack,F2C_PUSH_STACK) #define f2c_set_auto_verify_ F77_FUNC_(f2c_set_auto_verify,F2C_SET_AUTO_VERIFY) #define f2c_set_error_print_ F77_FUNC_(f2c_set_error_print,F2C_SET_ERROR_PRINT) #define f2c_set_hard_fail_ F77_FUNC_(f2c_set_hard_fail,F2C_SET_HARD_FAIL) #define f2c_set_numalign_ F77_FUNC_(f2c_set_numalign,F2C_SET_NUMALIGN) #define f2c_sizeof_ F77_FUNC_(f2c_sizeof,F2C_SIZEOF) #define f2c_sizeof_overhead_ F77_FUNC_(f2c_sizeof_overhead,F2C_SIZEOF_OVERHEAD) #define f2c_summarize_allocated_blocks_ F77_FUNC_(f2c_summarize_allocated_blocks,F2C_SUMMARIZE_ALLOCATED_BLOCKS) #define f2c_trace_ F77_FUNC_(f2c_trace,F2C_TRACE) #define f2c_verify_allocator_stuff_ F77_FUNC_(f2c_verify_allocator_stuff,F2C_VERIFY_ALLOCATOR_STUFF) #define ma_set_sizes_ F77_FUNC_(ma_set_sizes,MA_SET_SIZES) #endif /* _ma_h */ ga-5-4/ma/macommon.h0000644000175000017500000000166712662210435012417 0ustar mbamba#ifndef _macommon_h #define _macommon_h #define MA_FALSE 0 #define MA_TRUE 1 #define MA_DEFAULT_SPACE (-1) #define MA_NAMESIZE 32 #define MT_BASE 1000 #define MT_C_CHAR (MT_BASE + 0) #define MT_C_INT (MT_BASE + 1) #define MT_C_LONGINT (MT_BASE + 2) #define MT_C_FLOAT (MT_BASE + 3) #define MT_C_DBL (MT_BASE + 4) #define MT_C_LDBL (MT_BASE + 5) #define MT_C_SCPL (MT_BASE + 6) #define MT_C_DCPL (MT_BASE + 7) #define MT_C_LDCPL (MT_BASE + 8) #define MT_F_BYTE (MT_BASE + 9) #define MT_F_INT (MT_BASE + 10) #define MT_F_LOG (MT_BASE + 11) #define MT_F_REAL (MT_BASE + 12) #define MT_F_DBL (MT_BASE + 13) #define MT_F_SCPL (MT_BASE + 14) #define MT_F_DCPL (MT_BASE + 15) #define MT_C_LONGLONG (MT_BASE + 16) #define MT_FIRST MT_C_CHAR #define MT_LAST MT_C_LONGLONG #define MT_NUMTYPES (MT_LAST - MT_FIRST + 1) #endif /* _macommon_h */ ga-5-4/ma/man/0000755000175000017500000000000012662210435011201 5ustar mbambaga-5-4/ma/man/man3/0000755000175000017500000000000012662210435012037 5ustar mbambaga-5-4/ma/man/man3/MA.30000644000175000017500000001420712662210435012424 0ustar mbamba.TH MA 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA - introduction to the MA dynamic memory allocator .SH DESCRIPTION MA is a library of routines that comprises a dynamic memory allocator for use by C, FORTRAN, or mixed-language applications. C applications can benefit from using MA instead of the ordinary malloc() and free() routines because of the extra features MA provides: both heap and stack memory management disciplines, debugging and verification support, usage statistics, and quantitative memory availability information. FORTRAN applications can take advantage of the same features, and may in fact require a library such as MA because dynamic memory allocation is not supported by all versions of the language. MA is designed to be portable across a variety of platforms. The following platforms are currently supported: .in +0.5i .nf alpha_osf13 DEC Alpha, DEC OSF/1 V1.3 alpha_osf13_i8 DEC Alpha, DEC OSF/1 V1.3, f77 -i8 crayc90_7c_dp Cray Y-MP C90, UNICOS 7.C, cf77 -Wf-dp crayt3d_802_dp Cray T3D, UNICOS 8.0.2, cf77 -Wf-dp delta_pgi40 Intel DELTA, NX/M R1.5 (cross-compiled by PGI 4.0) hp700_ux90 HP 9000/700, HP-UX 9.0, gcc ipsc_pgi40 Intel iPSC/860, NX/M R1.4 (cross-compiled by PGI 4.0) ksr1_1141 KSR1, KSR OS R1.1.4.1 ksr1_1141_i4 KSR1, KSR OS R1.1.4.1, f77 -i4 ksr1_1141_i4r8 KSR1, KSR OS R1.1.4.1, f77 -i4 -r8 ksr1_1141_r8 KSR1, KSR OS R1.1.4.1, f77 -r8 paragon_osf12 Intel Paragon, OSF/1 R1.2 rs_aix32 IBM RS/6000, AIX 3.2 sgi_405f SGI, IRIX 4.0.5F sgi_5111 SGI, IRIX 5.1.1.1 sgi_60 SGI Power Challenge, IRIX 6.0 sgi_60_i8 SGI Power Challenge, IRIX 6.0, f77 -i8 sun4m_412 Sun SPARC, SunOS 4.1.x sun4x_55 Sun SPARC, SunOS 5.5.x .fi .in .SH IMPLEMENTATION Memory layout: .in +0.5i .nf segment = heap_region stack_region region = block block block ... block = AD gap1 guard1 client_space guard2 gap2 .fi .in A segment of memory is obtained from the OS upon initialization. The low end of the segment is managed as a heap; the heap region grows from low addresses to high addresses. The high end of the segment is managed as a stack; the stack region grows from high addresses to low addresses. Each region consists of a series of contiguous blocks, one per allocation request, and possibly some unused space. Blocks in the heap region are either in use by the client (allocated and not yet deallocated) or not in use by the client (allocated and already deallocated). A block on the rightmost end of the heap region becomes part of the unused space upon deallocation. Blocks in the stack region are always in use by the client, because when a stack block is deallocated, it becomes part of the unused space. A block consists of the client space, i.e., the range of memory available for use by the application; guard words adjacent to each end of the client space to help detect improper memory access by the client; bookkeeping info (in an "allocation descriptor," AD); and two gaps, each zero or more bytes long, to satisfy alignment constraints (specifically, to ensure that AD and client_space are aligned properly). .SH "LIST OF ROUTINES" All MA routines are shown below, grouped by category and listed alphabetically within each category. Initialization .in +0.5i .nf MA_init() MA_initialized() MA_sizeof() MA_sizeof_overhead() .fi .in Allocation .in +0.5i .nf MA_alloc_get() MA_allocate_heap() MA_get_index() MA_get_pointer() MA_inquire_avail() MA_inquire_heap() MA_inquire_stack() MA_push_get() MA_push_stack() .fi .in Deallocation .in +0.5i .nf MA_chop_stack() MA_free_heap() MA_pop_stack() .fi .in Debugging .in +0.5i .nf MA_set_auto_verify() MA_set_error_print() MA_set_hard_fail() MA_summarize_allocated_blocks() MA_verify_allocator_stuff() .fi .in Iteration Over Allocated Blocks .in +0.5i .nf MA_get_next_memhandle() MA_init_memhandle_iterator() .fi .in Statistics .in +0.5i .nf MA_print_stats() .fi .in .SH TYPES There are three MA-specific types in the public C interface to MA: Integer, Boolean, and Pointer. They are accessible by including macdecls.h. Integer is defined in such a way that sizeof(Integer) is equal to the number of bytes in a FORTRAN integer, which varies according to compiler options and platform. Boolean is equivalent to Integer, and Pointer is equivalent to char *. .SH ERRORS Errors considered fatal by MA result in program termination. Errors considered nonfatal by MA cause the MA routine to return an error value to the caller. For most boolean functions, false is returned upon failure and true is returned upon success. (The boolean functions for which the return value means something other than success or failure are MA_set_auto_verify(), MA_set_error_print(), and MA_set_hard_fail().) Integer functions return zero upon failure; depending on the function, zero may or may not be distinguishable as an exceptional value. An application can force MA to treat all errors as fatal via MA_set_hard_fail(). If a fatal error occurs, an error message is printed on the standard error (stderr). By default, error messages are also printed for nonfatal errors. An application can force MA to print or not print error messages for nonfatal errors via MA_set_error_print(). .SH FILES To access required MA definitions, C applications should include macdecls.h and FORTRAN applications should include mafdecls.fh. .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA_alloc_get(3), MA_allocate_heap(3), MA_chop_stack(3), MA_free_heap(3), MA_get_index(3), MA_get_next_memhandle(3), MA_get_pointer(3), MA_init(3), MA_initialized(3), MA_init_memhandle_iterator(3), MA_inquire_avail(3), MA_inquire_heap(3), MA_inquire_stack(3), MA_pop_stack(3), MA_print_stats(3), MA_push_get(3), MA_push_stack(3), MA_set_auto_verify(3), MA_set_error_print(3), MA_set_hard_fail(3), MA_sizeof(3), MA_sizeof_overhead(3), MA_summarize_allocated_blocks(3), MA_verify_allocator_stuff(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_pop_stack.30000644000175000017500000000420312662210435014462 0ustar mbamba.TH MA_POP_STACK 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_pop_stack - deallocate a stack block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_pop_stack(memhandle) Integer memhandle; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_pop_stack(memhandle) integer memhandle .fi .SH DESCRIPTION MA_pop_stack() deallocates the stack block corresponding to the handle .I memhandle (which was returned by MA_push_get() or MA_push_stack() when the block was allocated), which must be at the top of the stack (i.e., the stack block most recently allocated). .\" .SH USAGE .SH DIAGNOSTICS invalid memhandle: %d .in +0.5i .I memhandle is not a valid handle. .in invalid checksum for memhandle %d (name: '%s') .in +0.5i The block's computed checksum does not match its stored checksum. This indicates that the block has been corrupted by having its internal state overwritten. .in invalid guard(s) for memhandle %d (name: '%s') .in +0.5i This indicates that the block has been corrupted by being overwritten at one or both ends. The likely cause of this is an application indexing bug. .in memhandle %d (name: '%s') not in stack .in +0.5i The block is not currently allocated in the stack. .in memhandle %d (name: '%s') not top of stack .in +0.5i The block is currently allocated in the stack, but is not at the top of the stack. .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_push_get(3), MA_push_stack(3), MA_inquire_avail(3), MA_inquire_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_inquire_stack.30000644000175000017500000000266412662210435015351 0ustar mbamba.TH MA_INQUIRE_STACK 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_inquire_stack - find out how much free space is available in the stack region .SH "C SYNOPSIS" .nf #include "macdecls.h" Integer MA_inquire_stack(datatype) Integer datatype; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" integer function MA_inquire_stack(datatype) integer datatype .fi .SH DESCRIPTION MA_inquire_stack() returns the maximum number of elements of type .I datatype that can currently be allocated in the stack, in a single allocation request, with respect to the partition defined at initialization. .\" .SH USAGE .SH DIAGNOSTICS MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in .SH "RETURN VALUE" C: The number of elements, as described above. .br FORTRAN: The number of elements, as described above. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_inquire_avail(3), MA_inquire_heap(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_sizeof.30000644000175000017500000000520512662210435014001 0ustar mbamba.TH MA_SIZEOF 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_sizeof - compute sizes of data types .SH "C SYNOPSIS" .nf #include "macdecls.h" Integer MA_sizeof(datatype1, nelem1, datatype2) Integer datatype1; /* read-only */ Integer nelem1; /* read-only */ Integer datatype2; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" integer function MA_sizeof(datatype1, nelem1, datatype2) integer datatype1 integer nelem1 integer datatype2 .fi .SH DESCRIPTION MA_sizeof() returns the number of elements of type .I datatype2 required to contain .I nelem1 elements of type .IR datatype1 . .SH USAGE The following FORTRAN code illustrates the use of MA_sizeof() by computing the space required for 100 integers in 5 allocations in the heap, 200 logicals in 4 allocations in the heap, 300 reals in 3 allocations in the stack, and 400 doubles in 2 allocations in the stack. .nf #include "mafdecls.fh" logical ok integer heap_bytes_data integer heap_bytes_overhead integer heap_bytes_total integer stack_bytes_data integer stack_bytes_overhead integer stack_bytes_total heap_bytes_data = MA_sizeof(MT_INT, 100, MT_BYTE) + MA_sizeof(MT_LOG, 200, MT_BYTE) heap_bytes_overhead = (5 + 4) * MA_sizeof_overhead(MT_BYTE) heap_bytes_total = heap_bytes_data + heap_bytes_overhead stack_bytes_data = MA_sizeof(MT_REAL, 300, MT_BYTE) + MA_sizeof(MT_DBL, 400, MT_BYTE) stack_bytes_overhead = (3 + 2) * MA_sizeof_overhead(MT_BYTE) stack_bytes_total = stack_bytes_data + stack_bytes_overhead ok = MA_init(MT_BYTE, stack_bytes_total, heap_bytes_total) .fi .SH DIAGNOSTICS unable to set sizes of FORTRAN datatypes .in +0.5i This indicates either that the internal state of MA is corrupted or that there is a problem in the C-FORTRAN linkage. .in invalid datatype: %d .in +0.5i .I datatype1 and .I datatype2 must be one of those listed in macdecls.h or mafdecls.fh. .in invalid nelem: %d .in +0.5i .I nelem1 must be greater than or equal to zero. .in .SH "RETURN VALUE" C: The number of elements, as described above. .br FORTRAN: The number of elements, as described above. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_sizeof_overhead(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_init.30000644000175000017500000000720312662210435013445 0ustar mbamba.TH MA_INITIALIZE 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_init - initialize the memory allocator .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_init(datatype, nominal_stack, nominal_heap) Integer datatype; /* read-only */ Integer nominal_stack; /* read-only */ Integer nominal_heap; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_init(datatype, nominal_stack, nominal_heap) integer datatype integer nominal_stack integer nominal_heap .fi .SH DESCRIPTION MA_init() initializes the memory allocator by requesting from the operating system a single segment of memory that is used to satisfy allocations for both the heap and the stack. The memory segment is large enough to hold .I nominal_heap elements of type .I datatype in the heap and .I nominal_stack elements of type .I datatype in the stack, plus the overhead for two allocations (one heap and one stack); if more than two allocations will exist concurrently, overhead may be computed using MA_sizeof_overhead() and factored into .I nominal_heap and .IR nominal_stack . If .I nominal_heap is less than zero, a default total size for the heap is used. If .I nominal_stack is less than zero, a default total size for the stack is used. MA_init() must be called before any other MA routine is called, except MA_set_auto_verify(), MA_set_error_print(), MA_set_hard_fail(), MA_sizeof(), or MA_sizeof_overhead(). .SH USAGE The following FORTRAN code illustrates the use of MA_init() by computing the space required for 100 integers in 5 allocations in the heap, 200 logicals in 4 allocations in the heap, 300 reals in 3 allocations in the stack, and 400 doubles in 2 allocations in the stack. .nf #include "mafdecls.fh" logical ok integer heap_bytes_data integer heap_bytes_overhead integer heap_bytes_total integer stack_bytes_data integer stack_bytes_overhead integer stack_bytes_total heap_bytes_data = MA_sizeof(MT_INT, 100, MT_BYTE) + MA_sizeof(MT_LOG, 200, MT_BYTE) heap_bytes_overhead = (5 + 4) * MA_sizeof_overhead(MT_BYTE) heap_bytes_total = heap_bytes_data + heap_bytes_overhead stack_bytes_data = MA_sizeof(MT_REAL, 300, MT_BYTE) + MA_sizeof(MT_DBL, 400, MT_BYTE) stack_bytes_overhead = (3 + 2) * MA_sizeof_overhead(MT_BYTE) stack_bytes_total = stack_bytes_data + stack_bytes_overhead ok = MA_init(MT_BYTE, stack_bytes_total, heap_bytes_total) .fi .SH DIAGNOSTICS unable to set sizes of FORTRAN datatypes .in +0.5i This indicates either that the internal state of MA is corrupted or that there is a problem in the C-FORTRAN linkage. .in MA already initialized .in +0.5i MA_init() may not be called after it has returned successfully. .in invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in could not allocate %d bytes .in +0.5i The request for memory to the operating system failed. Recovery may be attempted by calling MA_init() again and requesting less memory. .in .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_initialized(3), MA_sizeof(3), MA_sizeof_overhead(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_chop_stack.30000644000175000017500000000400612662210435014616 0ustar mbamba.TH MA_CHOP_STACK 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_chop_stack - deallocate a stack block and all stack blocks allocated after it .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_chop_stack(memhandle) Integer memhandle; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_chop_stack(memhandle) integer memhandle .fi .SH DESCRIPTION MA_chop_stack() deallocates the stack block corresponding to the handle .I memhandle (which was returned by MA_push_get() or MA_push_stack() when the block was allocated) and all stack blocks allocated after it. .\" .SH USAGE .SH DIAGNOSTICS invalid memhandle: %d .in +0.5i .I memhandle is not a valid handle. .in invalid checksum for memhandle %d (name: '%s') .in +0.5i The block's computed checksum does not match its stored checksum. This indicates that the block has been corrupted by having its internal state overwritten. .in invalid guard(s) for memhandle %d (name: '%s') .in +0.5i This indicates that the block has been corrupted by being overwritten at one or both ends. The likely cause of this is an application indexing bug. .in memhandle %d (name: '%s') not in stack .in +0.5i The block is not currently allocated in the stack. .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_inquire_avail(3), MA_inquire_stack(3), MA_pop_stack(3), MA_push_get(3), MA_push_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_inquire_heap.30000644000175000017500000000265612662210435015162 0ustar mbamba.TH MA_INQUIRE_HEAP 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_inquire_heap - find out how much free space is available in the heap region .SH "C SYNOPSIS" .nf #include "macdecls.h" Integer MA_inquire_heap(datatype) Integer datatype; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" integer function MA_inquire_heap(datatype) integer datatype .fi .SH DESCRIPTION MA_inquire_heap() returns the maximum number of elements of type .I datatype that can currently be allocated in the heap, in a single allocation request, with respect to the partition defined at initialization. .\" .SH USAGE .SH DIAGNOSTICS MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in .SH "RETURN VALUE" C: The number of elements, as described above. .br FORTRAN: The number of elements, as described above. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_inquire_avail(3), MA_inquire_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_get_next_memhandle.30000644000175000017500000000357712662210435016343 0ustar mbamba.TH MA_GET_NEXT_MEMHANDLE 3 "20 February 1997" "MA Release 1.8" " " .SH NAME MA_get_next_memhandle - get the handle for the next block in the scan of currently allocated blocks .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_get_next_memhandle(ithandle, memhandle) Integer *ithandle; /* read-write */ Integer *memhandle; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_get_next_memhandle(ithandle, memhandle) integer ithandle integer memhandle .fi .SH DESCRIPTION MA_get_next_memhandle() returns in .I memhandle the handle for the next block in the scan of currently allocated blocks corresponding to the iterator handle .I ithandle (which was returned by MA_init_memhandle_iterator() when the scan was initialized). .SH USAGE The following FORTRAN code illustrates the use of MA_get_next_memhandle() by looping over all currently allocated blocks. .nf #include "mafdecls.fh" logical ok integer ihandle integer mhandle ok = MA_init_memhandle_iterator(ihandle) if (ok) then ok = MA_get_next_memhandle(ihandle, mhandle) 10 if (ok) then ... process mhandle ok = MA_get_next_memhandle(ihandle, mhandle) goto 10 endif endif .fi .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .SH NOTES This routine is not yet implemented. .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_init_memhandle_iterator(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_set_auto_verify.30000644000175000017500000000271212662210435015711 0ustar mbamba.TH MA_SET_AUTO_VERIFY 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_set_auto_verify - set the ma_auto_verify flag .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_set_auto_verify(value) Boolean value; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_set_auto_verify(value) logical value .fi .SH DESCRIPTION MA_set_auto_verify() sets the ma_auto_verify flag to .I value and returns the flag's previous value. If the ma_auto_verify flag is true, then MA_verify_allocator_stuff() is called upon invocation by every other public MA routine except: .in +0.5i .nf MA_initialized() MA_set_auto_verify() MA_set_error_print() MA_set_hard_fail() .fi .in The ma_auto_verify flag is initially false. .\" .SH USAGE .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: The previous value of the ma_auto_verify flag (MA_TRUE or MA_FALSE). .br FORTRAN: The previous value of the ma_auto_verify flag (.true. or .false.). .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_set_error_print(3), MA_set_hard_fail(3), MA_verify_allocator_stuff(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_alloc_get.30000644000175000017500000000611412662210435014433 0ustar mbamba.TH MA_ALLOC_GET 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_alloc_get - allocate a heap block and get the corresponding base index .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_alloc_get(datatype, nelem, name, memhandle, index) Integer datatype; /* read-only */ Integer nelem; /* read-only */ char *name; /* read-only */ Integer *memhandle; /* write-only */ Integer *index; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_alloc_get(datatype, nelem, name, memhandle, index) integer datatype integer nelem character*(*) name integer memhandle integer index .fi .SH DESCRIPTION MA_alloc_get() is a convenience function that combines MA_allocate_heap() and MA_get_index(). MA_alloc_get() allocates a heap block large enough to hold .I nelem elements of type .I datatype and associates .I name with the block for debugging purposes. A handle for the block is returned in .I memhandle and the base index for the type-specific data array that is appropriate for the block is returned in .IR index . .SH USAGE The following FORTRAN code illustrates the use of MA_alloc_get() by allocating a block of 5 integers on the heap and then storing values into the integers. .nf #include "mafdecls.fh" logical ok integer mhandle integer index integer i ok = MA_alloc_get(MT_INT, 5, 'heap int block', mhandle, index) if (ok) then do 10 i = 0, 4 int_mb(index + i) = 0 10 continue endif .fi .SH DIAGNOSTICS block '%s', MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in block '%s', invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in block '%s', invalid nelem: %d .in +0.5i .I nelem must be greater than zero. .in block '%s', not enough space to allocate %d bytes .in +0.5i Recovery may be attempted by deallocating unneeded blocks and resubmitting the request, or the application may be rewritten to request more memory initially in the call to MA_init(). .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .SH NOTES Type-specific data arrays are not yet available in C, so employ pointers instead of indices by using MA_allocate_heap() and MA_get_pointer() instead of MA_alloc_get(). .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_allocate_heap(3), MA_free_heap(3), MA_get_index(3), MA_get_pointer(3), MA_inquire_avail(3), MA_inquire_heap(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_init_memhandle_iterator.30000644000175000017500000000322112662210435017364 0ustar mbamba.TH MA_INITIALIZE_MEMHANDLE_ITERATOR 3 "20 February 1997" "MA Release 1.8" " " .SH NAME MA_init_memhandle_iterator - initialize a scan of currently allocated blocks .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_init_memhandle_iterator(ithandle) Integer *ithandle; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_init_memhandle_iterator(ithandle) integer ithandle .fi .SH DESCRIPTION MA_init_memhandle_iterator() returns in .I ithandle the iterator handle for a scan of currently allocated blocks. .SH USAGE The following FORTRAN code illustrates the use of MA_init_memhandle_iterator() by looping over all currently allocated blocks. .nf #include "mafdecls.fh" logical ok integer ihandle integer mhandle ok = MA_init_memhandle_iterator(ihandle) if (ok) then ok = MA_get_next_memhandle(ihandle, mhandle) 10 if (ok) then ... process mhandle ok = MA_get_next_memhandle(ihandle, mhandle) goto 10 endif endif .fi .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .SH NOTES This routine is not yet implemented. .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_get_next_memhandle(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_set_error_print.30000644000175000017500000000255612662210435015730 0ustar mbamba.TH MA_SET_ERROR_PRINT 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_set_error_print - set the ma_error_print flag .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_set_error_print(value) Boolean value; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_set_error_print(value) logical value .fi .SH DESCRIPTION MA_set_error_print() sets the ma_error_print flag to .I value and returns the flag's previous value. If the ma_error_print flag is true, then nonfatal errors cause messages to be printed on the standard error (stderr), else they do not. (Fatal errors always generate messages.) The ma_error_print flag is initially true. .\" .SH USAGE .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: The previous value of the ma_error_print flag (MA_TRUE or MA_FALSE). .br FORTRAN: The previous value of the ma_error_print flag (.true. or .false.). .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_set_auto_verify(3), MA_set_hard_fail(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_verify_allocator_stuff.30000644000175000017500000000414112662210435017253 0ustar mbamba.TH MA_VERIFY_ALLOCATOR_STUFF 3 "20 February 1997" "MA Release 1.8" " " .SH NAME MA_verify_allocator_stuff - sanity check the internal state of MA .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_verify_allocator_stuff() .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_verify_allocator_stuff() .fi .SH DESCRIPTION MA_verify_allocator_stuff() checks each block currently allocated on the heap or the stack for checksum and guard errors. For each error found, a message is printed on the standard output (stdout). If any errors are found, a summary message is printed on the standard error (stderr), else nothing is printed. .\" .SH USAGE .SH DIAGNOSTICS unavailable; recompile MA with -DVERIFY .in +0.5i To use this routine, MA must be compiled with cpp option -DVERIFY. .in %s block '%s', handle %d, address 0x%lx: .in +0.5i The following diagnostics are each prefixed by this information, which identifies the corrupted block. .in current checksum %lu != stored checksum %lu .in +0.5i This indicates that the block has been corrupted by having its internal state overwritten. .in current left signature %u != proper left signature %u .in +0.5i This indicates that the block has been corrupted by being overwritten at the left end. The likely cause of this is an application indexing bug. .in current right signature %u != proper right signature %u .in +0.5i This indicates that the block has been corrupted by being overwritten at the right end. The likely cause of this is an application indexing bug. .in .SH "RETURN VALUE" C: MA_TRUE upon success (no errors), MA_FALSE upon failure (errors). .br FORTRAN: .true. upon success (no errors), .false. upon failure (errors). .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_set_auto_verify(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_set_hard_fail.30000644000175000017500000000246712662210435015275 0ustar mbamba.TH MA_SET_HARD_FAIL 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_set_hard_fail - set the ma_hard_fail flag .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_set_hard_fail(value) Boolean value; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_set_hard_fail(value) logical value .fi .SH DESCRIPTION MA_set_hard_fail() sets the ma_hard_fail flag to .I value and returns the flag's previous value. If the ma_hard_fail flag is true, then any error detected by MA (including those normally considered nonfatal) causes program termination. The ma_hard_fail flag is initially false. .\" .SH USAGE .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: The previous value of the ma_hard_fail flag (MA_TRUE or MA_FALSE). .br FORTRAN: The previous value of the ma_hard_fail flag (.true. or .false.). .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_set_auto_verify(3), MA_set_error_print(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_push_stack.30000644000175000017500000000410212662210435014641 0ustar mbamba.TH MA_PUSH_STACK 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_push_stack - allocate a stack block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_push_stack(datatype, nelem, name, memhandle) Integer datatype; /* read-only */ Integer nelem; /* read-only */ char *name; /* read-only */ Integer *memhandle; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_push_stack(datatype, nelem, name, memhandle) integer datatype integer nelem character*(*) name integer memhandle .fi .SH DESCRIPTION MA_push_stack() allocates a stack block large enough to hold .I nelem elements of type .I datatype and associates .I name with the block for debugging purposes. A handle for the block is returned in .IR memhandle . .\" .SH USAGE .SH DIAGNOSTICS block '%s', MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in block '%s', invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in block '%s', invalid nelem: %d .in +0.5i .I nelem must be greater than zero. .in block '%s', not enough space to allocate %d bytes .in +0.5i Recovery may be attempted by deallocating unneeded blocks and resubmitting the request, or the application may be rewritten to request more memory initially in the call to MA_init(). .in .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_chop_stack(3), MA_get_index(3), MA_get_pointer(3), MA_inquire_avail(3), MA_inquire_stack(3), MA_pop_stack(3), MA_push_get(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_inquire_avail.30000644000175000017500000000312412662210435015330 0ustar mbamba.TH MA_INQUIRE_AVAIL 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_inquire_avail - find out how much free space is available between the heap and stack regions .SH "C SYNOPSIS" .nf #include "macdecls.h" Integer MA_inquire_avail(datatype) Integer datatype; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" integer function MA_inquire_avail(datatype) integer datatype .fi .SH DESCRIPTION MA_inquire_avail() returns the maximum number of elements of type .I datatype that can currently be allocated in the space between the heap and stack, in a single allocation request, ignoring the partition defined at initialization. Note that this might not be the largest piece of memory available; the heap may contain deallocated blocks that are larger. .\" .SH USAGE .SH DIAGNOSTICS MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in .SH "RETURN VALUE" C: The number of elements, as described above. .br FORTRAN: The number of elements, as described above. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_inquire_heap(3), MA_inquire_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_free_heap.30000644000175000017500000000364312662210435014424 0ustar mbamba.TH MA_FREE_HEAP 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_free_heap - deallocate a heap block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_free_heap(memhandle) Integer memhandle; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_free_heap(memhandle) integer memhandle .fi .SH DESCRIPTION MA_free_heap() deallocates the heap block corresponding to the handle .I memhandle (which was returned by MA_alloc_get() or MA_allocate_heap() when the block was allocated). .\" .SH USAGE .SH DIAGNOSTICS invalid memhandle: %d .in +0.5i .I memhandle is not a valid handle. .in invalid checksum for memhandle %d (name: '%s') .in +0.5i The block's computed checksum does not match its stored checksum. This indicates that the block has been corrupted by having its internal state overwritten. .in invalid guard(s) for memhandle %d (name: '%s') .in +0.5i This indicates that the block has been corrupted by being overwritten at one or both ends. The likely cause of this is an application indexing bug. .in memhandle %d (name: '%s') not in heap .in +0.5i The block is not currently allocated in the heap. .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_alloc_get(3), MA_allocate_heap(3), MA_inquire_avail(3), MA_inquire_heap(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_get_pointer.30000644000175000017500000000476512662210435015033 0ustar mbamba.TH MA_GET_POINTER 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_get_pointer - get the base pointer for a block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_get_pointer(memhandle, pointer) Integer memhandle; /* read-only */ Pointer *pointer; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" Not available. .SH DESCRIPTION MA_get_pointer() returns in .I pointer the base pointer for the block corresponding to the handle .I memhandle (which was returned by MA_allocate_heap() or MA_push_stack() when the block was allocated). .SH USAGE The following C code illustrates the use of MA_get_pointer() by allocating a block of 5 integers on the heap and then storing values into the integers. .nf #include "macdecls.h" Boolean ok; Integer mhandle; Pointer pointer; int i; ok = MA_allocate_heap(MT_INT, 5, "heap int block", &mhandle); if (ok) { ok = MA_get_pointer(mhandle, &pointer); if (ok) for (i = 0; i < 5; i++) *((int *)pointer + i) = 0; } .fi .SH DIAGNOSTICS invalid memhandle: %d .in +0.5i .I memhandle is not a valid handle. .in invalid checksum for memhandle %d (name: '%s') .in +0.5i The block's computed checksum does not match its stored checksum. This indicates that the block has been corrupted by having its internal state overwritten. .in invalid guard(s) for memhandle %d (name: '%s') .in +0.5i This indicates that the block has been corrupted by being overwritten at one or both ends. The likely cause of this is an application indexing bug. .in memhandle %d (name: '%s') not in heap or stack .in +0.5i The block is not currently allocated in the heap or the stack. .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: Not available. .SH NOTES MA_get_pointer() is not available in FORTRAN, because FORTRAN does not support pointers. .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_alloc_get(3), MA_allocate_heap(3), MA_get_index(3), MA_push_get(3), MA_push_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_print_stats.30000644000175000017500000000220212662210435015046 0ustar mbamba.TH MA_PRINT_STATS 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_print_stats - print MA usage statistics on the standard output (stdout) .SH "C SYNOPSIS" .nf #include "macdecls.h" void MA_print_stats() .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" subroutine MA_print_stats .fi .SH DESCRIPTION MA_print_stats() prints MA allocation statistics (current and maximum number of blocks and total bytes for heap and stack) and calls per MA routine on the standard output (stdout). .\" .SH USAGE .SH DIAGNOSTICS unavailable; recompile MA with -DSTATS .in +0.5i To use this routine, MA must be compiled with cpp option -DSTATS. .in .SH "RETURN VALUE" C: None. .br FORTRAN: None. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_summarize_allocated_blocks(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_push_get.30000644000175000017500000000612112662210435014316 0ustar mbamba.TH MA_PUSH_GET 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_push_get - allocate a stack block and get the corresponding base index .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_push_get(datatype, nelem, name, memhandle, index) Integer datatype; /* read-only */ Integer nelem; /* read-only */ char *name; /* read-only */ Integer *memhandle; /* write-only */ Integer *index; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_push_get(datatype, nelem, name, memhandle, index) integer datatype integer nelem character*(*) name integer memhandle integer index .fi .SH DESCRIPTION MA_push_get() is a convenience function that combines MA_push_stack() and MA_get_index(). MA_push_get() allocates a stack block large enough to hold .I nelem elements of type .I datatype and associates .I name with the block for debugging purposes. A handle for the block is returned in .I memhandle and the base index for the type-specific data array that is appropriate for the block is returned in .IR index . .SH USAGE The following FORTRAN code illustrates the use of MA_push_get() by allocating a block of 5 integers on the stack and then storing values into the integers. .nf #include "mafdecls.fh" logical ok integer mhandle integer index integer i ok = MA_push_get(MT_INT, 5, 'stack int block', mhandle, index) if (ok) then do 10 i = 0, 4 int_mb(index + i) = 0 10 continue endif .fi .SH DIAGNOSTICS block '%s', MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in block '%s', invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in block '%s', invalid nelem: %d .in +0.5i .I nelem must be greater than zero. .in block '%s', not enough space to allocate %d bytes .in +0.5i Recovery may be attempted by deallocating unneeded blocks and resubmitting the request, or the application may be rewritten to request more memory initially in the call to MA_init(). .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .SH NOTES Type-specific data arrays are not yet available in C, so employ pointers instead of indices by using MA_push_stack() and MA_get_pointer() instead of MA_push_get(). .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_chop_stack(3), MA_get_index(3), MA_get_pointer(3), MA_inquire_avail(3), MA_inquire_stack(3), MA_pop_stack(3), MA_push_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_sizeof_overhead.30000644000175000017500000000464612662210435015666 0ustar mbamba.TH MA_SIZEOF_OVERHEAD 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_sizeof_overhead - compute size of block overhead .SH "C SYNOPSIS" .nf #include "macdecls.h" Integer MA_sizeof_overhead(datatype) Integer datatype; /* read-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" integer function MA_sizeof_overhead(datatype) integer datatype .fi .SH DESCRIPTION MA_sizeof_overhead() returns the number of elements of type .I datatype required to contain the worst case number of bytes of overhead for any block. .SH USAGE The following FORTRAN code illustrates the use of MA_sizeof_overhead() by computing the space required for 100 integers in 5 allocations in the heap, 200 logicals in 4 allocations in the heap, 300 reals in 3 allocations in the stack, and 400 doubles in 2 allocations in the stack. .nf #include "mafdecls.fh" logical ok integer heap_bytes_data integer heap_bytes_overhead integer heap_bytes_total integer stack_bytes_data integer stack_bytes_overhead integer stack_bytes_total heap_bytes_data = MA_sizeof(MT_INT, 100, MT_BYTE) + MA_sizeof(MT_LOG, 200, MT_BYTE) heap_bytes_overhead = (5 + 4) * MA_sizeof_overhead(MT_BYTE) heap_bytes_total = heap_bytes_data + heap_bytes_overhead stack_bytes_data = MA_sizeof(MT_REAL, 300, MT_BYTE) + MA_sizeof(MT_DBL, 400, MT_BYTE) stack_bytes_overhead = (3 + 2) * MA_sizeof_overhead(MT_BYTE) stack_bytes_total = stack_bytes_data + stack_bytes_overhead ok = MA_init(MT_BYTE, stack_bytes_total, heap_bytes_total) .fi .SH DIAGNOSTICS unable to set sizes of FORTRAN datatypes .in +0.5i This indicates either that the internal state of MA is corrupted or that there is a problem in the C-FORTRAN linkage. .in invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in .SH "RETURN VALUE" C: The number of elements, as described above. .br FORTRAN: The number of elements, as described above. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_sizeof(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_get_index.30000644000175000017500000000536512662210435014457 0ustar mbamba.TH MA_GET_INDEX 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_get_index - get the base index for a block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_get_index(memhandle, index) Integer memhandle; /* read-only */ Integer *index; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_get_index(memhandle, index) integer memhandle integer index .fi .SH DESCRIPTION MA_get_index() returns in .I index the base index for the type-specific data array that is appropriate for the block corresponding to the handle .I memhandle (which was returned by MA_allocate_heap() or MA_push_stack() when the block was allocated). .SH USAGE The following FORTRAN code illustrates the use of MA_get_index() by allocating a block of 5 integers on the heap and then storing values into the integers. .nf #include "mafdecls.fh" logical ok integer mhandle integer index integer i ok = MA_allocate_heap(MT_INT, 5, 'heap int block', mhandle) if (ok) then ok = MA_get_index(mhandle, index) if (ok) then do 10 i = 0, 4 int_mb(index + i) = 0 10 continue endif endif .fi .SH DIAGNOSTICS invalid memhandle: %d .in +0.5i .I memhandle is not a valid handle. .in invalid checksum for memhandle %d (name: '%s') .in +0.5i The block's computed checksum does not match its stored checksum. This indicates that the block has been corrupted by having its internal state overwritten. .in invalid guard(s) for memhandle %d (name: '%s') .in +0.5i This indicates that the block has been corrupted by being overwritten at one or both ends. The likely cause of this is an application indexing bug. .in memhandle %d (name: '%s') not in heap or stack .in +0.5i The block is not currently allocated in the heap or the stack. .in Other diagnostics are possible. If seen, they indicate corruption of the internal state of MA, caused by bugs in either MA or the application. .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .SH NOTES Type-specific data arrays are not yet available in C, so employ pointers instead of indices by using MA_get_pointer() instead of MA_get_index(). .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_alloc_get(3), MA_allocate_heap(3), MA_get_pointer(3), MA_push_get(3), MA_push_stack(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_allocate_heap.30000644000175000017500000000407512662210435015267 0ustar mbamba.TH MA_ALLOCATE_HEAP 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_allocate_heap - allocate a heap block .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_allocate_heap(datatype, nelem, name, memhandle) Integer datatype; /* read-only */ Integer nelem; /* read-only */ char *name; /* read-only */ Integer *memhandle; /* write-only */ .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_allocate_heap(datatype, nelem, name, memhandle) integer datatype integer nelem character*(*) name integer memhandle .fi .SH DESCRIPTION MA_allocate_heap() allocates a heap block large enough to hold .I nelem elements of type .I datatype and associates .I name with the block for debugging purposes. A handle for the block is returned in .IR memhandle . .\" .SH USAGE .SH DIAGNOSTICS block '%s', MA not yet initialized .in +0.5i MA_init() must be called before this routine is called. .in block '%s', invalid datatype: %d .in +0.5i .I datatype must be one of those listed in macdecls.h or mafdecls.fh. .in block '%s', invalid nelem: %d .in +0.5i .I nelem must be greater than zero. .in block '%s', not enough space to allocate %d bytes .in +0.5i Recovery may be attempted by deallocating unneeded blocks and resubmitting the request, or the application may be rewritten to request more memory initially in the call to MA_init(). .in .SH "RETURN VALUE" C: MA_TRUE upon success, MA_FALSE upon failure. .br FORTRAN: .true. upon success, .false. upon failure. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_alloc_get(3), MA_free_heap(3), MA_get_index(3), MA_get_pointer(3), MA_inquire_avail(3), MA_inquire_heap(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_summarize_allocated_blocks.30000644000175000017500000000411312662210435020060 0ustar mbamba.TH MA_SUMMARIZE_ALLOCATED_BLOCKS 3 "20 February 1997" "MA Release 1.8" " " .SH NAME MA_summarize_allocated_blocks - print information about currently allocated blocks on the standard output (stdout) .SH "C SYNOPSIS" .nf #include "macdecls.h" void MA_summarize_allocated_blocks() .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" subroutine MA_summarize_allocated_blocks .fi .SH DESCRIPTION MA_summarize_allocated_blocks() prints the following information on the standard output (stdout) for each block currently allocated on the heap or the stack. address .in +0.5i The location in memory of (i.e., pointer to) the block. .in handle .in +0.5i The memhandle by which the block is referenced (returned when the block was allocated). .in name .in +0.5i The name of the block (specified when the block was allocated). .in type of elements .in +0.5i The type of data elements stored in the block (specified when the block was allocated). .in number of elements .in +0.5i The number of data elements stored in the block (specified when the block was allocated). .in address of client space .in +0.5i The location in memory of (i.e., pointer to) the data elements. This is the value returned by MA_get_pointer(). .in index for client space .in +0.5i The base index for the appropriate type-specific data array. This is the value returned by MA_get_index(). .in total number of bytes .in +0.5i The total number of bytes, including overhead, in the block. .in .\" .SH USAGE .SH DIAGNOSTICS invalid index_base: %d .in +0.5i This indicates either that the internal state of MA is corrupted or that there is a problem in the C-FORTRAN linkage. .in .SH "RETURN VALUE" C: None. .br FORTRAN: None. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_print_stats(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/man3/MA_initialized.30000644000175000017500000000204712662210435015010 0ustar mbamba.TH MA_INITIALIZED 3 "20 February 1997" "MA Release 1.8" "MA LIBRARY ROUTINES" .SH NAME MA_initialized - find out if MA has been successfully initialized .SH "C SYNOPSIS" .nf #include "macdecls.h" Boolean MA_initialized() .fi .SH "FORTRAN SYNOPSIS" .nf #include "mafdecls.fh" logical function MA_initialized() .fi .SH DESCRIPTION MA_initialized() returns true if MA_init() has been called successfully, otherwise it returns false. .\" .SH USAGE .\" .SH DIAGNOSTICS .SH "RETURN VALUE" C: MA_TRUE if MA has been successfully initialized, MA_FALSE otherwise. .br FORTRAN: .true. if MA has been successfully initialized, .false. otherwise. .\" .SH NOTES .SH FILES .nf Include files: /msrc/proj/hpctools/ma/release/current/include Library: /msrc/proj/hpctools/ma/release/current/lib/\fIplatform\fR/libma.a Man pages: /msrc/proj/hpctools/ma/release/current/man/man3 Source code: /msrc/proj/hpctools/ma/release/current/tar/ma\fIrelease\fR.tar .fi .SH "SEE ALSO" .na MA(3), MA_init(3) .ad .SH AUTHOR Gregory S. Thomas, Pacific Northwest National Laboratory ga-5-4/ma/man/whatis0000644000175000017500000000321212662210435012421 0ustar mbambaMA (3) - introduction to the MA dynamic memory allocator MA_alloc_get (3) - allocate a heap block and get the corresponding base index MA_allocate_heap (3) - allocate a heap block MA_chop_stack (3) - deallocate a stack block and all stack blocks allocated after it MA_free_heap (3) - deallocate a heap block MA_get_index (3) - get the base index for a block MA_get_next_memhandle (3) - get the handle for the next block in the scan of currently allocated blocks MA_get_pointer (3) - get the base pointer for a block MA_init (3) - initialize the memory allocator MA_initialized (3) - find out if MA has been successfully initialized MA_init_memhandle_iterator (3) - initialize a scan of currently allocated blocks MA_inquire_avail (3) - find out how much free space is available between the heap and stack regions MA_inquire_heap (3) - find out how much free space is available in the heap region MA_inquire_stack (3) - find out how much free space is available in the stack region MA_pop_stack (3) - deallocate a stack block MA_print_stats (3) - print MA usage statistics on the standard output (stdout) MA_push_get (3) - allocate a stack block and get the corresponding base index MA_push_stack (3) - allocate a stack block MA_set_auto_verify (3) - set the ma_auto_verify flag MA_set_error_print (3) - set the ma_error_print flag MA_set_hard_fail (3) - set the ma_hard_fail flag MA_sizeof (3) - compute sizes of data types MA_sizeof_overhead (3) - compute size of block overhead MA_summarize_allocated_blocks (3) - print information about currently allocated blocks on the standard output (stdout) MA_verify_allocator_stuff (3) - sanity check the internal state of MA ga-5-4/ma/test-inquire.c0000644000175000017500000000601612662210435013226 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * $Id: test-inquire.c,v 1.1 2002-09-14 05:40:30 d3g001 Exp $ */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #include "macdecls.h" #define MAXHANDLES 10 static void print_inquire(); int main(int argc, char **argv) { Integer units_heap; Integer units_stack; Boolean ok; Integer handle[MAXHANDLES]; MA_AccessIndex index[MAXHANDLES]; /* set sizes of heap and stack */ units_heap = 50000; units_stack = 20000; /* initialize */ ok = MA_init(MT_DBL, units_stack, units_heap); if (!ok) { (void)fprintf(stderr, "MA_init failed; punting\n"); exit(1); } printf("# initialized heap = %ld, stack = %ld\n", (long)units_heap, (long)units_stack); printf("# should see roughly the following values:\n"); printf("# MA_inquire_heap(MT_DBL) = 50K\n"); printf("# MA_inquire_heap_check_stack(MT_DBL) = 50K\n"); printf("# MA_inquire_heap_no_partition(MT_DBL) = 70K\n"); printf("# MA_inquire_stack(MT_DBL) = 20K\n"); printf("# MA_inquire_stack_check_heap(MT_DBL) = 20K\n"); printf("# MA_inquire_stack_no_partition(MT_DBL) = 70K\n"); print_inquire(); printf("# allocate 2 heap (10K, 20K), 1 stack (35K)\n"); MA_alloc_get(MT_DBL, 10000, "heap0", &handle[0], &index[0]); MA_alloc_get(MT_DBL, 20000, "heap1", &handle[1], &index[1]); MA_push_get(MT_DBL, 35000, "stack0", &handle[2], &index[2]); printf("# free 1 heap (10K)\n"); MA_free_heap(handle[0]); printf("# should see roughly the following values:\n"); printf("# MA_inquire_heap(MT_DBL) = 20K\n"); printf("# MA_inquire_heap_check_stack(MT_DBL) = 10K\n"); printf("# MA_inquire_heap_no_partition(MT_DBL) = 10K\n"); printf("# MA_inquire_stack(MT_DBL) = 0\n"); printf("# MA_inquire_stack_check_heap(MT_DBL) = 0\n"); printf("# MA_inquire_stack_no_partition(MT_DBL) = 5K\n"); print_inquire(); return 0; } void print_inquire() { int howmany; (void)printf("--------------------------------------------------------\n"); howmany = MA_inquire_heap(MT_DBL); (void)printf("MA_inquire_heap(MT_DBL) = %d\n", howmany); howmany = MA_inquire_heap_check_stack(MT_DBL); (void)printf("MA_inquire_heap_check_stack(MT_DBL) = %d\n", howmany); howmany = MA_inquire_heap_no_partition(MT_DBL); (void)printf("MA_inquire_heap_no_partition(MT_DBL) = %d\n", howmany); howmany = MA_inquire_stack(MT_DBL); (void)printf("MA_inquire_stack(MT_DBL) = %d\n", howmany); howmany = MA_inquire_stack_check_heap(MT_DBL); (void)printf("MA_inquire_stack_check_heap(MT_DBL) = %d\n", howmany); howmany = MA_inquire_stack_no_partition(MT_DBL); (void)printf("MA_inquire_stack_no_partition(MT_DBL) = %d\n", howmany); (void)printf("--------------------------------------------------------\n"); } ga-5-4/ma/maf.F0000644000175000017500000003541612662210435011311 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c $Id: maf.F,v 1.14 2003-07-10 19:19:28 d3h325 Exp $ c c c FORTRAN routines for a portable dynamic memory allocator. c #define MAF_INTERNAL cc cc private routines cc c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function ma_set_sizes () implicit none #include "maf2c.fh" #include "mafdecls.fh" ma_set_sizes = 0 if (f2c_inform_base(MT_BYTE, byte_mb(1), byte_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_INT, int_mb(1), int_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_LOG, log_mb(1), log_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_REAL, real_mb(1), real_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_DBL, dbl_mb(1), dbl_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_SCPL, scpl_mb(1), scpl_mb(2)) .eq. $ MA_FALSE) return if (f2c_inform_base(MT_DCPL, dcpl_mb(1), dcpl_mb(2)) .eq. $ MA_FALSE) return ma_set_sizes = 1 return end cc cc public routines cc c In general, each routine simply calls its corresponding f2c_ C c wrapper routine, which performs any necessary argument munging c and then calls the corresponding C routine. c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_alloc_get (datatype, nelem, name, memhandle, $ index) implicit none #include "mafdecls.fh" integer datatype integer nelem character*(*) name integer memhandle MA_ACCESS_INDEX_TYPE index #include "maf2c.fh" if (f2c_alloc_get(datatype, nelem, name, memhandle, index) .eq. $ MA_TRUE) then MA_alloc_get = .true. else MA_alloc_get = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_allocate_heap (datatype, nelem, name, $ memhandle) implicit none integer datatype integer nelem character*(*) name integer memhandle #include "maf2c.fh" if (f2c_allocate_heap(datatype, nelem, name, memhandle) .eq. $ MA_TRUE) then MA_allocate_heap = .true. else MA_allocate_heap = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_chop_stack (memhandle) implicit none integer memhandle #include "maf2c.fh" if (f2c_chop_stack(memhandle) .eq. MA_TRUE) then MA_chop_stack = .true. else MA_chop_stack = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_free_heap (memhandle) implicit none integer memhandle #include "maf2c.fh" if (f2c_free_heap(memhandle) .eq. MA_TRUE) then MA_free_heap = .true. else MA_free_heap = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_free_heap_piece (memhandle, nelem) implicit none integer memhandle integer nelem #include "maf2c.fh" if (f2c_free_heap_piece(memhandle, nelem) .eq. MA_TRUE) then MA_free_heap_piece = .true. else MA_free_heap_piece = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_get_index (memhandle, index) implicit none #include "mafdecls.fh" integer memhandle MA_ACCESS_INDEX_TYPE index #include "maf2c.fh" if (f2c_get_index(memhandle, index) .eq. MA_TRUE) then MA_get_index = .true. else MA_get_index = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_get_next_memhandle (ithandle, memhandle) implicit none integer ithandle integer memhandle #include "maf2c.fh" if (f2c_get_next_memhandle(ithandle, memhandle) .eq. MA_TRUE) $ then MA_get_next_memhandle = .true. else MA_get_next_memhandle = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_get_numalign (numalign) implicit none integer numalign #include "maf2c.fh" MA_get_numalign = (f2c_get_numalign(numalign) .eq. MA_TRUE) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_init (datatype, stack, heap) implicit none integer datatype integer stack integer heap #include "maf2c.fh" if (f2c_init(datatype, stack, heap) .eq. MA_TRUE) then MA_init = .true. else MA_init = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_initialized () implicit none #include "maf2c.fh" if (f2c_initialized() .eq. MA_TRUE) then MA_initialized = .true. else MA_initialized = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_init_memhandle_iterator (ithandle) implicit none integer ithandle #include "maf2c.fh" if (f2c_init_memhandle_iterator(ithandle) .eq. MA_TRUE) $ then MA_init_memhandle_iterator = .true. else MA_init_memhandle_iterator = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_avail (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_avail = f2c_inquire_avail(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_heap (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_heap = f2c_inquire_heap(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_heap_check_stack (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_heap_check_stack = $ f2c_inquire_heap_check_stack(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_heap_no_partition (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_heap_no_partition = $ f2c_inquire_heap_no_partition(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_stack (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_stack = f2c_inquire_stack(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_stack_check_heap (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_stack_check_heap = $ f2c_inquire_stack_check_heap(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_inquire_stack_no_partition (datatype) implicit none integer datatype #include "maf2c.fh" MA_inquire_stack_no_partition = $ f2c_inquire_stack_no_partition(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_pop_stack (memhandle) implicit none integer memhandle #include "maf2c.fh" if (f2c_pop_stack(memhandle) .eq. MA_TRUE) then MA_pop_stack = .true. else MA_pop_stack = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c subroutine MA_print_stats(printroutines) implicit none logical printroutines #include "maf2c.fh" if (printroutines) then call f2c_print_stats(1) else call f2c_print_stats(0) endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_push_get (datatype, nelem, name, memhandle, $ index) implicit none #include "mafdecls.fh" integer datatype integer nelem character*(*) name integer memhandle MA_ACCESS_INDEX_TYPE index #include "maf2c.fh" if (f2c_push_get(datatype, nelem, name, memhandle, index) .eq. $ MA_TRUE) then MA_push_get = .true. else MA_push_get = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_push_stack (datatype, nelem, name, $ memhandle) implicit none integer datatype integer nelem character*(*) name integer memhandle #include "maf2c.fh" if (f2c_push_stack(datatype, nelem, name, memhandle) .eq. $ MA_TRUE) then MA_push_stack = .true. else MA_push_stack = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_set_auto_verify (value) implicit none logical value integer ivalue #include "maf2c.fh" if (value) then ivalue = MA_TRUE else ivalue = MA_FALSE endif if (f2c_set_auto_verify(ivalue) .eq. MA_TRUE) then MA_set_auto_verify = .true. else MA_set_auto_verify = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_set_error_print (value) implicit none logical value integer ivalue #include "maf2c.fh" if (value) then ivalue = MA_TRUE else ivalue = MA_FALSE endif if (f2c_set_error_print(ivalue) .eq. MA_TRUE) then MA_set_error_print = .true. else MA_set_error_print = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_set_hard_fail (value) implicit none logical value integer ivalue #include "maf2c.fh" if (value) then ivalue = MA_TRUE else ivalue = MA_FALSE endif if (f2c_set_hard_fail(ivalue) .eq. MA_TRUE) then MA_set_hard_fail = .true. else MA_set_hard_fail = .false. endif return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_set_numalign (numalign) implicit none integer numalign #include "maf2c.fh" MA_set_numalign = (f2c_set_numalign(numalign) .eq. MA_TRUE) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_sizeof (datatype1, nelem1, datatype2) implicit none integer datatype1 integer nelem1 integer datatype2 #include "maf2c.fh" MA_sizeof = f2c_sizeof(datatype1, nelem1, datatype2) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c integer function MA_sizeof_overhead (datatype) implicit none integer datatype #include "maf2c.fh" MA_sizeof_overhead = f2c_sizeof_overhead(datatype) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c subroutine MA_summarize_allocated_blocks implicit none #include "maf2c.fh" call f2c_summarize_allocated_blocks() return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c subroutine ma_trace(value) implicit none integer value #include "maf2c.fh" call f2c_trace(value) return end c --------------------------------------------------------------- c c --------------------------------------------------------------- c logical function MA_verify_allocator_stuff () implicit none #include "maf2c.fh" if (f2c_verify_allocator_stuff() .eq. MA_TRUE) then MA_verify_allocator_stuff = .true. else MA_verify_allocator_stuff = .false. endif return end #undef MAF_INTERNAL ga-5-4/ma/ma.c0000644000175000017500000032643312662210435011202 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /* * Portable dynamic memory allocator. */ #if HAVE_STDIO_H # include #endif #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #if HAVE_MALLOC_H # include #endif #include "error.h" #include "farg.h" #include "ma.h" #include "memcpy.h" #include "scope.h" #include "table.h" #ifdef ENABLE_ARMCI_MEM_OPTION extern void* ARMCI_Malloc_local(long bytes); #endif /* * Memory layout: * * segment = heap_region stack_region * region = block block block ... * block = AD gap1 guard1 client_space guard2 gap2 * * A segment of memory is obtained from the OS upon initialization. * The low end of the segment is managed as a heap; the heap region * grows from low addresses to high addresses. The high end of the * segment is managed as a stack; the stack region grows from high * addresses to low addresses. * * Each region consists of a series of contiguous blocks, one per * allocation request, and possibly some unused space. Blocks in * the heap region are either in use by the client (allocated and * not yet deallocated) or not in use by the client (allocated and * already deallocated). A block on the rightmost end of the heap * region becomes part of the unused space upon deallocation. * Blocks in the stack region are always in use by the client, * because when a stack block is deallocated, it becomes part of * the unused space. * * A block consists of the client space, i.e., the range of memory * available for use by the application; guard words adjacent to * each end of the client space to help detect improper memory access * by the client; bookkeeping info (in an "allocation descriptor," * AD); and two gaps, each zero or more bytes long, to satisfy * alignment constraints (specifically, to ensure that AD and * client_space are aligned properly). */ /** ** constants **/ /* return value for returns that should never execute */ #define DONTCARE (Integer)0 /* default total # of bytes */ #define DEFAULT_TOTAL_HEAP 524288 /* 2^19 */ #define DEFAULT_TOTAL_STACK 524288 /* 2^19 */ /* estimate of max # of outstanding allocation requests */ #define DEFAULT_REQUESTS_HEAP 1 #define DEFAULT_REQUESTS_STACK 1 /* bytes per address */ #define BPA 1 /* per-allocation storage overhead, excluding alignment gaps */ #define BLOCK_OVERHEAD_FIXED (sizeof(AD) + (2 * sizeof(Guard))) /* block lengths are integral multiples of this */ /* * Note that for machines such as the KSR on which sizeof(pointer) * and sizeof(long) are different than sizeof(int), alignment issues * can be tricky. For example, the fields of a struct (e.g., * client_space of AD) can be improperly aligned if the struct is * dynamically placed (by MA) in such a way that the first field is * properly aligned but sizes of subsequent fields accumulate to cause * a later field to be misaligned. By defining the unit of alignment * to be the biggest of the integer and pointer types, part of the * problem is solved, but the sum of sizes of preceding fields can * still potentially cause difficulty. */ #if defined(BGP) || defined(BGQ) #define ALIGNMENT 32 #else #define ALIGNMENT sizeof(long) #endif /* min size of block split and placed on free list */ #define MINBLOCKSIZE mai_round((long)(ALIGNMENT + BLOCK_OVERHEAD_FIXED), \ (ulongi)ALIGNMENT) /* signatures for guard words */ #define GUARD1 (Guard)0xaaaaaaaa /* start signature */ #define GUARD2 (Guard)0x55555555 /* stop signature */ /** ** types **/ typedef unsigned int Guard; /* for detection of memory trashing */ typedef unsigned long ulongi; /* for brevity */ /* allocation request for a block */ typedef struct _AR { Integer datatype; /* of elements */ Integer nelem; /* # of elements */ } AR; /* allocation descriptor for a block */ typedef struct _AD { Integer datatype; /* of elements */ Integer nelem; /* # of elements */ char name[MA_NAMESIZE]; /* given by client */ Pointer client_space; /* start of client space */ ulongi nbytes; /* total # of bytes */ struct _AD *next; /* AD in linked list */ ulongi checksum; /* of AD */ } AD; /* block location for mh2ad */ typedef enum { BL_HeapOrStack, BL_Heap, BL_Stack, BL_StackTop } BlockLocation; /** ** function types **/ private Boolean ad_big_enough(AD *ad, Pointer ar); private Boolean ad_eq(AD *ad, Pointer ad_target); private Boolean ad_gt(AD *ad, Pointer ad_target); private Boolean ad_le(AD *ad, Pointer ad_target); private Boolean ad_lt(AD *ad, Pointer ad_target); private void ad_print(AD *ad, char *block_type); private void balloc_after(AR *ar, Pointer address, Pointer *client_space, ulongi *nbytes); private void balloc_before(AR *ar, Pointer address, Pointer *client_space, ulongi *nbytes); private void block_free_heap(AD *ad); private AD *block_split(AD *ad, ulongi bytes_needed, Boolean insert_free); private ulongi checksum(AD *ad); #ifdef DEBUG private void debug_ad_print(AD *ad); #endif /* DEBUG */ private Boolean guard_check(AD *ad); private void guard_set(AD *ad); private void list_coalesce(AD *list); private AD *list_delete(AD *ad, AD **list); private int list_delete_many(AD **list, Boolean (*pred)(), Pointer closure, void (*action)()); private AD *list_delete_one(AD **list, Boolean (*pred)(), Pointer closure); private void list_insert(AD *ad, AD **list); private void list_insert_ordered(AD *ad, AD **list, Boolean (*pred)()); private Boolean list_member(AD *ad, AD *list); private int list_print(AD *list, char *block_type, int index_base); private void list_verify(AD *list, char *block_type, char *preamble, int *blocks, int *bad_blocks, int *bad_checksums, int *bad_lguards, int *bad_rguards); private Integer ma_max_heap_frag_nelem(Integer datatype, Integer min_nelem); private Integer ma_nelem(Pointer address, ulongi length, Integer datatype); private void ma_preinitialize(char *caller); private Boolean mh2ad(Integer memhandle, AD **adout, BlockLocation location, char *caller); private void mh_free(AD *ad); private long mai_round(long value, ulongi unit); private void str_ncopy(char *to, char *from, int maxchars); /* foreign routines */ extern Integer ma_set_sizes_(); /* from the MA FORTRAN interface */ /** ** variables **/ /* base addresses of the datatypes */ private Pointer ma_base[] = { (Pointer)ma_cb_char, /* MT_C_CHAR */ (Pointer)ma_cb_int, /* MT_C_INT */ (Pointer)ma_cb_long, /* MT_C_LONGINT */ (Pointer)ma_cb_float, /* MT_C_FLOAT */ (Pointer)ma_cb_dbl, /* MT_C_DBL */ (Pointer)ma_cb_ldbl, /* MT_C_LDBL */ (Pointer)ma_cb_scpl, /* MT_C_SCPL */ (Pointer)ma_cb_dcpl, /* MT_C_DCPL */ (Pointer)ma_cb_ldcpl, /* MT_C_LDCPL */ 0, /* MT_F_BYTE */ 0, /* MT_F_INT */ 0, /* MT_F_LOG */ 0, /* MT_F_REAL */ 0, /* MT_F_DBL */ 0, /* MT_F_SCPL */ 0, /* MT_F_DCPL */ (Pointer)ma_cb_longlong /* MT_C_LONGLONG */ }; /* names of the datatypes */ private char *ma_datatype[] = { "char", "int", "long int", "float", "double", "long double", "single precision complex", "double precision complex", "long double precision complex", "byte", "integer", "logical", "real", "double precision", "single precision complex", "double precision complex", "long long" }; /* numbers of bytes in the datatypes */ private int ma_sizeof[] = { sizeof(char), /* MT_C_CHAR */ sizeof(int), /* MT_C_INT */ sizeof(long int), /* MT_C_LONGINT */ sizeof(float), /* MT_C_FLOAT */ sizeof(double), /* MT_C_DBL */ sizeof(MA_LongDouble), /* MT_C_LDBL */ sizeof(MA_SingleComplex), /* MT_C_SCPL */ sizeof(MA_DoubleComplex), /* MT_C_DCPL */ sizeof(MA_LongDoubleComplex), /* MT_C_LDCPL */ 0, /* MT_F_BYTE */ 0, /* MT_F_INT */ 0, /* MT_F_LOG */ 0, /* MT_F_REAL */ 0, /* MT_F_DBL */ 0, /* MT_F_SCPL */ 0, /* MT_F_DCPL */ sizeof(long long) /* MT_C_LONGLONG */ }; /* * Initially, ma_hp points to the start of the segment, and ma_sp * points to the first address past the end of the segment. The * start of the segment is always pointed to by ma_segment, and * the first address past the end of the segment is always pointed * to by ma_eos. The (unenforced) boundary between the heap region * and the stack region, defined at initialization, is always pointed * to by ma_partition. * * ................................................ * ^ ^ ^ * ma_segment, ma_hp ma_partition ma_eos, ma_sp * * Later, ma_hp points to the first address past the end of the * rightmost heap block, and ma_sp points to the leftmost stack block. * * hhhhhhhhhhhhhhhh.....................sssssssssss * ^ ^ ^ ^ ^ * ma_segment ma_hp ma_partition ma_sp ma_eos */ private Pointer ma_segment; /* memory from OS */ private Pointer ma_partition; /* boundary between heap and stack */ private Pointer ma_eos; /* end of segment */ private Pointer ma_hp; /* heap pointer */ private Pointer ma_sp; /* stack pointer */ private AD *ma_hfree; /* free list for heap */ private AD *ma_hused; /* used list for heap */ private AD *ma_sused; /* used list for stack */ /* toggled when ma_preinitialize succeeds */ private Boolean ma_preinitialized = MA_FALSE; /* toggled when MA_init succeeds */ private Boolean ma_initialized = MA_FALSE; /* invoke MA_verify_allocator_stuff in each public routine? */ private Boolean ma_auto_verify = MA_FALSE; /* print push/pop/alloc/free? */ private Boolean ma_trace = MA_FALSE; /* base arrays for the C datatypes */ public char ma_cb_char[2]; /* MT_C_CHAR */ public int ma_cb_int[2]; /* MT_C_INT */ public long ma_cb_long[2]; /* MT_C_LONGINT */ public long long ma_cb_longlong[2];/* MT_C_LONGLONG */ public float ma_cb_float[2]; /* MT_C_FLOAT */ public double ma_cb_dbl[2]; /* MT_C_DBL */ public MA_LongDouble ma_cb_ldbl[2]; /* MT_C_LDBL */ public MA_SingleComplex ma_cb_scpl[2]; /* MT_C_SCPL */ public MA_DoubleComplex ma_cb_dcpl[2]; /* MT_C_DCPL */ public MA_LongDoubleComplex ma_cb_ldcpl[2]; /* MT_C_LDCPL */ /* requested power-of-two alignment */ private Integer ma_numalign = 0; /** ** macros **/ /* minimum of two values */ #ifdef min #undef min #endif #define min(a, b) (((b) < (a)) ? (b) : (a)) /* maximum of two values */ #ifdef max #undef max #endif #define max(a, b) (((b) > (a)) ? (b) : (a)) /* proper word ending corresponding to n */ #define plural(n) (((n) == 1) ? "" : "s") /* convert between internal and external datatype values */ #define mt_import(d) ((d) - MT_BASE) #define mt_export(d) ((d) + MT_BASE) /* return nonzero if d is a valid (external) datatype */ #define mt_valid(d) (((d) >= MT_FIRST) && ((d) <= MT_LAST)) /* convert between pointer (address) and equivalent byte address */ #define p2b(p) ((ulongi)(p) * BPA) #define b2p(b) ((Pointer)((b) / BPA)) /* return nonzero if a is a potentially valid address */ #define reasonable_address(a) (((a) >= ma_segment) && ((a) < ma_eos)) /* worst case bytes of overhead for any block of elements of datatype d */ #define max_block_overhead(d) \ (BLOCK_OVERHEAD_FIXED + (ma_sizeof[d] - 1) + (ALIGNMENT - 1)) /* compute 0-based index for client_space from AD */ #define client_space_index(ad) \ ((MA_AccessIndex)((long)((ad)->client_space - ma_base[(ad)->datatype]) / \ ma_sizeof[(ad)->datatype])) /* compute address of guard from AD */ #define guard1(ad) ((Pointer)((ad)->client_space - sizeof(Guard))) #define guard2(ad) ((Pointer)((ad)->client_space \ + ((ad)->nelem * ma_sizeof[(ad)->datatype]))) /* * When reading or writing guard values, it is necessary to do an * explicit byte copy to avoid bus errors caused by guards that * are not suitably aligned. */ /* copy from guard to value */ #define guard_read(guard, value) bytecopy((guard), (value), sizeof(Guard)) /* copy from value to guard */ #define guard_write(guard, value) bytecopy((value), (guard), sizeof(Guard)) /** ** statistics stuff **/ #ifdef STATS /* the number of routines for which calls are counted */ #define NUMROUTINES ((int)FID_MA_verify_allocator_stuff + 1) /* function identifiers */ typedef enum { FID_MA_alloc_get = 0, FID_MA_allocate_heap, FID_MA_chop_stack, FID_MA_free_heap, FID_MA_free_heap_piece, FID_MA_get_index, FID_MA_get_mbase, FID_MA_get_next_memhandle, FID_MA_get_numalign, FID_MA_get_pointer, FID_MA_init, FID_MA_initialized, FID_MA_init_memhandle_iterator, FID_MA_inquire_avail, FID_MA_inquire_heap, FID_MA_inquire_heap_check_stack, FID_MA_inquire_heap_no_partition, FID_MA_inquire_stack, FID_MA_inquire_stack_check_heap, FID_MA_inquire_stack_no_partition, FID_MA_pop_stack, FID_MA_print_stats, FID_MA_push_get, FID_MA_push_stack, FID_MA_set_auto_verify, FID_MA_set_error_print, FID_MA_set_hard_fail, FID_MA_set_numalign, FID_MA_sizeof, FID_MA_sizeof_overhead, FID_MA_summarize_allocated_blocks, FID_MA_trace, FID_MA_verify_allocator_stuff } FID; /* MA usage statistics */ typedef struct { ulongi hblocks; /* current # of heap blocks */ ulongi hblocks_max; /* max # of heap blocks */ ulongi hbytes; /* current # of heap bytes */ ulongi hbytes_max; /* max # of heap bytes */ ulongi sblocks; /* current # of stack blocks */ ulongi sblocks_max; /* max # of stack blocks */ ulongi sbytes; /* current # of stack bytes */ ulongi sbytes_max; /* max # of stack bytes */ ulongi calls[NUMROUTINES];/* # of calls to each routine */ } Stats; /* names of the routines */ private char *ma_routines[] = { "MA_alloc_get", "MA_allocate_heap", "MA_chop_stack", "MA_free_heap", "MA_free_heap_piece", "MA_get_index", "MA_get_mbase", "MA_get_next_memhandle", "MA_get_numalign", "MA_get_pointer", "MA_init", "MA_initialized", "MA_init_memhandle_iterator", "MA_inquire_avail", "MA_inquire_heap", "MA_inquire_heap_check_stack", "MA_inquire_heap_no_partition", "MA_inquire_stack", "MA_inquire_stack_check_heap", "MA_inquire_stack_no_partition", "MA_pop_stack", "MA_print_stats", "MA_push_get", "MA_push_stack", "MA_set_auto_verify", "MA_set_error_print", "MA_set_hard_fail", "MA_set_numalign", "MA_sizeof", "MA_sizeof_overhead", "MA_summarize_allocated_blocks", "MA_trace", "MA_verify_allocator_stuff" }; /* MA usage statistics */ private Stats ma_stats; #endif /* STATS */ /** ** private routines **/ /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad can satisfy ar, else return MA_FALSE. * If ad can satisfy ar, set its client_space and nbytes fields * after performing any splitting. */ /* ------------------------------------------------------------------------- */ private Boolean ad_big_enough(ad, ar) AD *ad; /* the AD to test */ Pointer ar; /* allocation request */ { Pointer client_space; /* location of client_space */ ulongi nbytes; /* length of block for ar */ /* perform trial allocation to determine size */ balloc_after((AR *)ar, (Pointer)ad, &client_space, &nbytes); if (nbytes <= ad->nbytes) { /* ad is big enough; split block if necessary */ (void)block_split(ad, nbytes, MA_TRUE); /* set fields appropriately */ ad->client_space = client_space; /* success */ return MA_TRUE; } else /* ad is not big enough */ return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad == ad_target, else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean ad_eq(ad, ad_target) AD *ad; /* the AD to test */ Pointer ad_target; /* the AD to match */ { return (ad == (AD *)ad_target) ? MA_TRUE : MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad > ad_target, else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean ad_gt(ad, ad_target) AD *ad; /* the AD to test */ Pointer ad_target; /* the AD to match */ { return (ad > (AD *)ad_target) ? MA_TRUE : MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad <= ad_target, else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean ad_le(ad, ad_target) AD *ad; /* the AD to test */ Pointer ad_target; /* the AD to match */ { return (ad <= (AD *)ad_target) ? MA_TRUE : MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad < ad_target, else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean ad_lt(ad, ad_target) AD *ad; /* the AD to test */ Pointer ad_target; /* the AD to match */ { return (ad < (AD *)ad_target) ? MA_TRUE : MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Print identifying information about the given AD to stdout. */ /* ------------------------------------------------------------------------- */ private void ad_print(ad, block_type) AD *ad; /* to print */ char *block_type; /* for output */ { Integer memhandle; /* memhandle for AD */ /* convert AD to memhandle */ memhandle = ma_table_lookup_assoc((TableData)ad); /* print to stdout */ (void)printf("%s block '%s', handle ", block_type, ad->name); if (memhandle == TABLE_HANDLE_NONE) (void)printf("unknown"); else (void)printf("%ld", (long)memhandle); (void)printf(", address 0x%lx", (long)ad); } /* ------------------------------------------------------------------------- */ /* * Allocate a block suitable for ar starting at address. No fields of * the new block are modified. */ /* ------------------------------------------------------------------------- */ private void balloc_after(ar, address, client_space, nbytes) AR *ar; /* allocation request */ Pointer address; /* to allocate after */ Pointer *client_space; /* RETURN: location of client_space */ ulongi *nbytes; /* RETURN: length of block */ { Integer datatype; /* of elements in this block */ ulongi L_client_space; /* length of client_space */ Pointer A_client_space; /* address of client_space */ int L_gap1; /* length of gap1 */ int L_gap2; /* length of gap2 */ ulongi B_address; /* byte equivalent of address */ ulongi B_base; /* byte equivalent of ma_base[datatype] */ ulongi B_client_space; /* byte equivalent of A_client_space */ datatype = ar->datatype; B_address = p2b(address); B_base = p2b(ma_base[datatype]); /* * To ensure that client_space is properly aligned: * * (A(client_space) - ma_base[datatype]) % ma_sizeof[datatype] == 0 * * where * * A(client_space) == address + L(AD) + L(gap1) + L(guard1) */ L_client_space = ar->nelem * ma_sizeof[datatype]; L_gap1 = ((long)B_base - (long)B_address - (long)sizeof(AD) - (long)sizeof(Guard)) % (long)ma_sizeof[datatype]; if (L_gap1 < 0) L_gap1 += ma_sizeof[datatype]; B_client_space = B_address + sizeof(AD) + L_gap1 + sizeof(Guard); A_client_space = b2p(B_client_space); B_client_space = p2b(A_client_space); /* * To align client space according to overall alignment of absolute * address on user requested 2^ma_numalign boundary. * Note that if the base arrays are not aligned accordingly then * this alignement request is not satisfiable and will be quietly * ignored. */ if (ma_numalign > 0) { unsigned long mask = (1<datatype; B_address = p2b(address); B_base = p2b(ma_base[datatype]); /* * To ensure that client_space is properly aligned: * * (A(client_space) - ma_base[datatype]) % ma_sizeof[datatype] == 0 * * where * * A(client_space) == address - L(gap2) - L(guard2) - L(client_space) */ L_client_space = ar->nelem * ma_sizeof[datatype]; L_gap2 = (B_address - sizeof(Guard) - L_client_space - B_base) % ma_sizeof[datatype]; if (L_gap2 < 0) L_gap2 += ma_sizeof[datatype]; B_client_space = B_address - L_gap2 - sizeof(Guard) - L_client_space; A_client_space = b2p(B_client_space); B_client_space = p2b(A_client_space); /* * To align client space according to overall alignment of absolute * address on user requested 2^ma_numalign boundary. * Note that if the base arrays are not aligned accordingly then * this alignement request is not satisfiable and will be quietly * ignored. */ if (ma_numalign > 0) { unsigned long mask = (1<next) { if (ad2 > max_ad) max_ad = ad2; } if (max_ad) { /* at least 1 block is in use */ /* set ma_hp to first address past end of max_ad */ ma_hp = (Pointer)max_ad + max_ad->nbytes; /* delete any free list blocks that are no longer in heap region */ (void)list_delete_many( &ma_hfree, ad_gt, (Pointer)max_ad, (void (*)())NULL); /* if ad is in the heap region, add it to free list */ if (ad < max_ad) { list_insert_ordered(ad, &ma_hfree, ad_lt); list_coalesce(ma_hfree); } } else { /* no blocks are in use */ /* set ma_hp to start of segment */ ma_hp = ma_segment; /* clear the free list */ ma_hfree = (AD *)NULL; } } /* ------------------------------------------------------------------------- */ /* * If ad is sufficiently bigger than bytes_needed bytes, create a new * block from the remainder, optionally insert it in the free list, * and set the lengths of both blocks. * * Return a pointer to the new block (NULL if not created). */ /* ------------------------------------------------------------------------- */ private AD *block_split(ad, bytes_needed, insert_free) AD *ad; /* the AD to split */ ulongi bytes_needed; /* from ad */ Boolean insert_free; /* insert in free list? */ { ulongi bytes_extra; /* in ad */ AD *ad2; /* the new AD */ /* caller ensures that ad->nbytes >= bytes_needed */ bytes_extra = ad->nbytes - bytes_needed; if (bytes_extra >= ((ulongi)MINBLOCKSIZE)) { /* create a new block */ ad2 = (AD *)((Pointer)ad + bytes_needed); /* set the length of ad2 */ ad2->nbytes = bytes_extra; if (insert_free) { /* insert ad2 into free list */ list_insert_ordered(ad2, &ma_hfree, ad_lt); } /* set the length of ad */ ad->nbytes = bytes_needed; return ad2; } else { /* * If 0 <= bytes_extra < MINBLOCKSIZE then there are too few * extra bytes to form a new block. In this case, we simply * do nothing; ad will retain its original length (which is * either perfect or slightly too big), and the entire block * will be reclaimed upon deallocation, preventing any * memory leakage. */ return (AD *)NULL; } } /* ------------------------------------------------------------------------- */ /* * Compute and return a checksum for ad. Include all fields except name, * next, and checksum. */ /* ------------------------------------------------------------------------- */ private ulongi checksum(ad) AD *ad; /* the AD to compute checksum for */ { return (ulongi)( ad->datatype + ad->nelem + (ulongi)ad->client_space + ad->nbytes); } /* ------------------------------------------------------------------------- */ /* * Print to stderr the addresses of the fields of the given ad. */ /* ------------------------------------------------------------------------- */ #ifdef DEBUG private void debug_ad_print(ad) AD *ad; /* the AD to print */ { #define NUMADFIELDS 7 char *fn[NUMADFIELDS]; /* field names */ long fa[NUMADFIELDS]; /* field addresses */ int i; /* loop index */ long address; /* other addresses */ /* set field names */ fn[0] = "datatype"; fn[1] = "nelem"; fn[2] = "name"; fn[3] = "client_space"; fn[4] = "nbytes"; fn[5] = "next"; fn[6] = "checksum"; /* set field addresses */ fa[0] = (long)(&(ad->datatype)); fa[1] = (long)(&(ad->nelem)); fa[2] = (long)(&(ad->name)); fa[3] = (long)(&(ad->client_space)); fa[4] = (long)(&(ad->nbytes)); fa[5] = (long)(&(ad->next)); fa[6] = (long)(&(ad->checksum)); /* print AD fields to stderr */ (void)fprintf(stderr, "debug_ad_print:\n"); for (i = 0; i < NUMADFIELDS; i++) (void)fprintf(stderr, "\t0x%lx mod4,8,16=%d,%d,%-2d ad->%s\n", fa[i], fa[i] % 4, fa[i] % 8, fa[i] % 16, fn[i]); /* print other addresses to stderr */ address = (long)guard1(ad); (void)fprintf(stderr, "\t0x%lx mod4,8,16=%d,%d,%-2d guard1\n", address, address % 4, address % 8, address % 16); address = (long)ad->client_space; (void)fprintf(stderr, "\t0x%lx mod4,8,16=%d,%d,%-2d client_space\n", address, address % 4, address % 8, address % 16); address = (long)guard2(ad); (void)fprintf(stderr, "\t0x%lx mod4,8,16=%d,%d,%-2d guard2\n", address, address % 4, address % 8, address % 16); (void)fflush(stderr); } #endif /* DEBUG */ /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if the guards associated with ad contain valid signatures, * else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean guard_check(ad) AD *ad; /* the AD to check guards for */ { Guard signature; /* value to be read */ Pointer guard; /* address to read from */ guard = guard1(ad); guard_read(guard, &signature); if (signature != GUARD1) return MA_FALSE; guard = guard2(ad); guard_read(guard, &signature); if (signature != GUARD2) return MA_FALSE; /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Write signatures into the guards associated with ad. */ /* ------------------------------------------------------------------------- */ private void guard_set(ad) AD *ad; /* the AD to set guards for */ { Guard signature; /* value to be written */ Pointer guard; /* address to write to */ signature = GUARD1; guard = guard1(ad); guard_write(guard, &signature); signature = GUARD2; guard = guard2(ad); guard_write(guard, &signature); } /* ------------------------------------------------------------------------- */ /* * Coalesce list by merging any adjacent elements that are contiguous. * The list is assumed to be ordered by increasing addresses, i.e., * addressOf(element i) < addressOf(element i+1). */ /* ------------------------------------------------------------------------- */ private void list_coalesce(list) AD *list; /* the list to coalesce */ { AD *ad1; /* lead traversal pointer */ AD *ad2; /* trailing traversal pointer */ for (ad2 = list; ad2;) { /* compute first address beyond ad2 */ ad1 = (AD *)((Pointer)ad2 + ad2->nbytes); /* are ad2 and ad1 contiguous? */ if (ad1 == ad2->next) { /* yes; merge ad1 into ad2 */ ad2->nbytes += ad1->nbytes; ad2->next = ad1->next; } else { /* no; advance ad2 */ ad2 = ad2->next; } } } /* ------------------------------------------------------------------------- */ /* * Delete and return the first occurrence of ad from list. If ad is not * a member of list, return NULL. */ /* ------------------------------------------------------------------------- */ private AD *list_delete(ad, list) AD *ad; /* the AD to delete */ AD **list; /* the list to delete from */ { return list_delete_one(list, ad_eq, (Pointer)ad); } /* ------------------------------------------------------------------------- */ /* * Apply pred (with closure) to each element of list. Delete each element * that satisfies pred, after applying action to the element (if action is * not NULL). Return the number of elements deleted. */ /* ------------------------------------------------------------------------- */ private int list_delete_many(list, pred, closure, action) AD **list; /* the list to search */ Boolean (*pred)(); /* predicate */ Pointer closure; /* for pred */ void (*action)(); /* to apply before deletion */ { AD *ad1; /* lead traversal pointer */ AD *ad2; /* trailing traversal pointer */ int ndeleted = 0; /* # of elements deleted from list */ for (ad2 = (AD *)NULL, ad1 = *list; ad1; ad1 = ad1->next) { /* does ad1 match? */ if ((*pred)(ad1, closure)) { /* yes; apply action, then delete ad1 from list */ if (action != (void (*)())NULL) (*action)(ad1); if (ad2) { /* ad1 is second or later element */ ad2->next = ad1->next; } else { /* ad1 is first element */ *list = ad1->next; } ndeleted++; } else { /* no; ad1 survives, so scoot ad2 along */ ad2 = ad1; } } /* return the # of elements deleted from list */ return ndeleted; } /* ------------------------------------------------------------------------- */ /* * Apply pred (with closure) to each element of list. Delete and return * the first element that satisfies pred. If no element satisfies pred, * return NULL. */ /* ------------------------------------------------------------------------- */ private AD *list_delete_one(list, pred, closure) AD **list; /* the list to search */ Boolean (*pred)(); /* predicate */ Pointer closure; /* for pred */ { AD *ad1; /* lead traversal pointer */ AD *ad2; /* trailing traversal pointer */ for (ad2 = (AD *)NULL, ad1 = *list; ad1; ad2 = ad1, ad1 = ad1->next) { /* does ad1 match? */ if ((*pred)(ad1, closure)) { /* yes; delete ad1 from list */ if (ad2) { /* ad1 is second or later element */ ad2->next = ad1->next; } else { /* ad1 is first element */ *list = ad1->next; } /* success */ return ad1; } } /* failure */ return (AD *)NULL; } /* ------------------------------------------------------------------------- */ /* * Insert ad into list. */ /* ------------------------------------------------------------------------- */ private void list_insert(ad, list) AD *ad; /* the AD to insert */ AD **list; /* the list to insert into */ { /* push ad onto list */ ad->next = *list; *list = ad; } /* ------------------------------------------------------------------------- */ /* * Insert ad into list, immediately before the first element e * for which pred(ad, e) returns true. If there is no such element, * insert ad after the last element of list. */ /* ------------------------------------------------------------------------- */ private void list_insert_ordered(ad, list, pred) AD *ad; /* the AD to insert */ AD **list; /* the list to insert into */ Boolean (*pred)(); /* predicate */ { AD *ad1; /* lead traversal pointer */ AD *ad2; /* trailing traversal pointer */ if (*list == (AD *)NULL) { /* empty list */ ad->next = (AD *)NULL; *list = ad; return; } /* list has at least one element */ for (ad2 = (AD *)NULL, ad1 = *list; ad1; ad2 = ad1, ad1 = ad1->next) { /* does ad1 match? */ if ((*pred)(ad, ad1)) { /* yes; insert ad before ad1 */ if (ad2) { /* ad1 is second or later element */ ad2->next = ad; } else { /* ad1 is first element */ *list = ad; } ad->next = ad1; /* success */ return; } } /* append ad to list */ ad2->next = ad; ad->next = (AD *)NULL; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if ad is a member of list, else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean list_member(ad, list) AD *ad; /* the AD to search for */ AD *list; /* the list to search */ { AD *ad1; /* traversal pointer */ for (ad1 = list; ad1; ad1 = ad1->next) if (ad1 == ad) /* ad is a member of list */ return MA_TRUE; /* ad is not a member of list */ return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Print information to stdout about each block on list. Return the * number of blocks on list. */ /* ------------------------------------------------------------------------- */ private int list_print(list, block_type, index_base) AD *list; /* to print */ char *block_type; /* for output */ int index_base; /* 0 (C) or 1 (FORTRAN) */ { AD *ad; /* traversal pointer */ int nblocks; /* # of blocks on list */ /* print each block on list */ for (ad = list, nblocks = 0; ad; ad = ad->next, nblocks++) { /* print to stdout */ ad_print(ad, block_type); (void)printf(":\n"); (void)printf("\ttype of elements:\t\t%s\n", ma_datatype[ad->datatype]); (void)printf("\tnumber of elements:\t\t%ld\n", (long)ad->nelem); (void)printf("\taddress of client space:\t0x%lx\n", (long)ad->client_space); (void)printf("\tindex for client space:\t\t%ld\n", (long)(client_space_index(ad) + index_base)); (void)printf("\ttotal number of bytes:\t\t%lu\n", ad->nbytes); } /* return the number of blocks on list */ return nblocks; } /* ------------------------------------------------------------------------- */ /* * Check each block on list for checksum and guard errors. For each error * found, print a message to stdout. Return counts of the various errors * in the bad_ parameters. */ /* ------------------------------------------------------------------------- */ private void list_verify(list, block_type, preamble, blocks, bad_blocks, bad_checksums, bad_lguards, bad_rguards) AD *list; /* to verify */ char *block_type; /* for error messages */ char *preamble; /* printed before first error message */ int *blocks; /* RETURN: # of blocks */ int *bad_blocks; /* RETURN: # of blocks having errors */ int *bad_checksums; /* RETURN: # of blocks having bad checksum */ int *bad_lguards; /* RETURN: # of blocks having bad guard1 */ int *bad_rguards; /* RETURN: # of blocks having bad guard2 */ { AD *ad; /* traversal pointer */ Boolean first_bad_block;/* first bad block found? */ Boolean bad_block; /* problem in current block? */ Guard signature; /* value to be read */ Pointer guard; /* address to read from */ /* initialize */ *blocks = 0; *bad_blocks = 0; *bad_checksums = 0; *bad_lguards = 0; *bad_rguards = 0; first_bad_block = MA_TRUE; /* check each block on list */ for (ad = list; ad; ad = ad->next) { (*blocks)++; bad_block = MA_FALSE; /* check for checksum error */ if (checksum(ad) != ad->checksum) { /* print preamble if necessary */ if (first_bad_block && (preamble != (char *)NULL)) { (void)printf(preamble); first_bad_block = MA_FALSE; } /* print error message to stdout */ ad_print(ad, block_type); (void)printf(":\n\t"); (void)printf("current checksum %lu != stored checksum %lu\n", checksum(ad), ad->checksum); /* do bookkeeping */ (*bad_checksums)++; bad_block = MA_TRUE; } /* check for bad guard1 */ guard = guard1(ad); guard_read(guard, &signature); if (signature != GUARD1) { /* print preamble if necessary */ if (first_bad_block && (preamble != (char *)NULL)) { (void)printf(preamble); first_bad_block = MA_FALSE; } /* print error message to stdout */ ad_print(ad, block_type); (void)printf(":\n\t"); (void)printf( "current left signature %u != proper left signature %u\n", signature, GUARD1); /* do bookkeeping */ (*bad_lguards)++; bad_block = MA_TRUE; } /* check for bad guard2 */ guard = guard2(ad); guard_read(guard, &signature); if (signature != GUARD2) { /* print preamble if necessary */ if (first_bad_block && (preamble != (char *)NULL)) { (void)printf(preamble); first_bad_block = MA_FALSE; } /* print error message to stdout */ ad_print(ad, block_type); (void)printf(":\n\t"); (void)printf( "current right signature %u != proper right signature %u\n", signature, GUARD2); /* do bookkeeping */ (*bad_rguards)++; bad_block = MA_TRUE; } /* if any errors, bump bad block count */ if (bad_block) (*bad_blocks)++; } } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently be * accomodated in a heap fragment (a block on the heap free list) entirely * within the heap region, or 0 if this number is less than min_nelem. */ /* ------------------------------------------------------------------------- */ private Integer ma_max_heap_frag_nelem(datatype, min_nelem) Integer datatype; /* of elements */ Integer min_nelem; /* for fragment to be considered */ { ulongi min_bytes; /* for fragment to be considered */ AD *ad; /* traversal pointer */ ulongi nbytes; /* in current fragment */ Integer nelem; /* in current fragment */ Integer max_nelem; /* result */ /* set the threshold */ min_bytes = (min_nelem * ma_sizeof[datatype]) + BLOCK_OVERHEAD_FIXED; /* search the heap free list */ max_nelem = 0; for (ad = ma_hfree; ad; ad = ad->next) { /* * There are 3 cases to consider: * * (a) fragment is outside heap region * (b) fragment straddles partition between heap and stack regions * (c) fragment is inside heap region */ if ((Pointer)ad >= ma_partition) { /* case (a): reject */ continue; } else if (((Pointer)ad + ad->nbytes) >= ma_partition) { /* case (b): truncate fragment at partition */ nbytes = (ulongi)(ma_partition - (Pointer)ad); } else { /* case (c): accept */ nbytes = ad->nbytes; } if (nbytes >= min_bytes) { nelem = ma_nelem((Pointer)ad, nbytes, datatype); max_nelem = max(max_nelem, nelem); } } /* return the result */ return max_nelem; } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be accomodated in length bytes starting at address. */ /* ------------------------------------------------------------------------- */ private Integer ma_nelem(address, length, datatype) Pointer address; /* location of hypothetical block */ ulongi length; /* length of hypothetical block */ Integer datatype; /* of elements in hypothetical block */ { AR ar; /* allocation request */ Pointer client_space; /* location of client_space */ ulongi nbytes; /* length of block for ar */ if (length <= BLOCK_OVERHEAD_FIXED) /* no point in computing anything */ return (Integer)0; /* compute initial request */ ar.datatype = datatype; ar.nelem = (length - BLOCK_OVERHEAD_FIXED) / ma_sizeof[datatype]; /* make requests until one succeeds or we give up */ while (ar.nelem > 0) { /* perform trial allocation to determine size */ balloc_after(&ar, address, &client_space, &nbytes); if (nbytes > length) /* not enough space for ar.nelem elements */ ar.nelem--; else /* enough space for ar.nelem elements */ break; } /* return the result */ return ar.nelem; } /* ------------------------------------------------------------------------- */ /* * Perform operations necessary to allow certain functions to be invoked * before MA_init is called. */ /* ------------------------------------------------------------------------- */ private void ma_preinitialize(caller) char *caller; /* name of calling routine */ { if (ma_preinitialized) return; /* call a FORTRAN routine to set bases and sizes of FORTRAN datatypes */ if (ma_set_sizes_() == 0) { (void)sprintf(ma_ebuf, "unable to set sizes of FORTRAN datatypes"); ma_error(EL_Fatal, ET_Internal, caller, ma_ebuf); return; } /* success */ ma_preinitialized = MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * If memhandle is valid according to location, return the corresponding AD * in adout and return MA_TRUE, else print an error message and return * MA_FALSE. */ /* ------------------------------------------------------------------------- */ private Boolean mh2ad(memhandle, adout, location, caller) Integer memhandle; /* the handle to verify and convert */ AD **adout; /* RETURN: AD corresponding to memhandle */ BlockLocation location; /* where AD must reside */ char *caller; /* name of calling routine */ { AD *ad; Boolean check_checksum = MA_TRUE; Boolean check_guards = MA_TRUE; Boolean check_heap = MA_FALSE; Boolean check_stack = MA_FALSE; Boolean check_stacktop = MA_FALSE; Boolean check_heapandstack = MA_FALSE; switch (location) { case BL_HeapOrStack: check_heapandstack = MA_TRUE; break; case BL_Heap: check_heap = MA_TRUE; break; case BL_Stack: check_stack = MA_TRUE; break; case BL_StackTop: check_stacktop = MA_TRUE; break; default: (void)sprintf(ma_ebuf, "invalid location: %d", (int)location); ma_error(EL_Nonfatal, ET_Internal, "mh2ad", ma_ebuf); return MA_FALSE; } /* convert memhandle to AD */ if (!ma_table_verify(memhandle, caller)) return MA_FALSE; else ad = (AD *)ma_table_lookup(memhandle); /* attempt to avoid crashes due to corrupt addresses */ if (!reasonable_address((Pointer)ad)) { (void)sprintf(ma_ebuf, "invalid block address (0x%lx) for memhandle %ld", (long)ad, (long)memhandle); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } if (check_checksum) { if (checksum(ad) != ad->checksum) { (void)sprintf(ma_ebuf, "invalid checksum for memhandle %ld (name: '%s')", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } if (check_guards) { if (!guard_check(ad)) { (void)sprintf(ma_ebuf, "invalid guard(s) for memhandle %ld (name: '%s')", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } if (check_heap) { if (!list_member(ad, ma_hused)) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not in heap", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } else if (check_stack) { if (!list_member(ad, ma_sused)) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not in stack", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } else if (check_stacktop) { /* is it in the stack? */ if (!list_member(ad, ma_sused)) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not in stack", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } /* is it on top of the stack? */ if ((Pointer)ad != ma_sp) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not top of stack", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } else if (check_heapandstack) { if ((!list_member(ad, ma_hused)) && (!list_member(ad, ma_sused))) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not in heap or stack", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_External, caller, ma_ebuf); return MA_FALSE; } } /* ad is valid */ *adout = ad; return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Free the memhandle corresponding to the given AD. */ /* ------------------------------------------------------------------------- */ private void mh_free(ad) AD *ad; /* the AD whose memhandle to free */ { Integer memhandle; /* memhandle for AD */ /* convert AD to memhandle */ if ((memhandle = ma_table_lookup_assoc((TableData)ad)) == TABLE_HANDLE_NONE) { (void)sprintf(ma_ebuf, "cannot find memhandle for block address 0x%lx", (long)ad); ma_error(EL_Nonfatal, ET_Internal, "mh_free", ma_ebuf); } else /* free memhandle */ ma_table_deallocate(memhandle); } /* ------------------------------------------------------------------------- */ /* * Return the first multiple of unit which is >= value. */ /* ------------------------------------------------------------------------- */ private long mai_round(value, unit) long value; /* to round */ ulongi unit; /* to round to */ { /* voodoo ... */ unit--; value += unit; value &= ~(long)unit; return value; } /* ------------------------------------------------------------------------- */ /* * Copy at most maxchars-1 non-NUL chars from from to to; NUL-terminate to. */ /* ------------------------------------------------------------------------- */ private void str_ncopy(to, from, maxchars) char *to; /* space to copy to */ char *from; /* space to copy from */ int maxchars; /* max # of chars (including NUL) copied */ { if (from == (char *)NULL) { to[0] = '\0'; return; } /* copy up to maxchars chars */ (void)strncpy(to, from, maxchars); /* ensure to is NUL-terminated */ to[maxchars-1] = '\0'; } /** ** public routines for internal use only **/ /* ------------------------------------------------------------------------- */ /* * Set the base address and size of the given datatype. */ /* ------------------------------------------------------------------------- */ public Boolean MAi_inform_base(datatype, address1, address2) Integer datatype; /* to set size of */ Pointer address1; /* of datatype element base */ Pointer address2; /* of an adjacent datatype element */ { /* verify uninitialization */ if (ma_initialized) { (void)sprintf(ma_ebuf, "MA already initialized"); ma_error(EL_Nonfatal, ET_Internal, "MAi_inform_base", ma_ebuf); return MA_FALSE; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Nonfatal, ET_Internal, "MAi_inform_base", ma_ebuf); return MA_FALSE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* set the base address of datatype */ ma_base[datatype] = address1; /* set the size of datatype */ ma_sizeof[datatype] = (int)(address2 - address1); /* success */ return MA_TRUE; } #if NOFORT Integer ma_set_sizes_() { MAi_inform_base(MT_F_BYTE, &ma_cb_char[0], &ma_cb_char[1]); MAi_inform_base(MT_F_INT, &ma_cb_int[0], &ma_cb_int[1]); MAi_inform_base(MT_F_LOG, &ma_cb_int[0], &ma_cb_int[1]); MAi_inform_base(MT_F_REAL, &ma_cb_float[0], &ma_cb_float[1]); MAi_inform_base(MT_F_DBL, &ma_cb_dbl[0], &ma_cb_dbl[1]); MAi_inform_base(MT_F_SCPL, &ma_cb_scpl[0], &ma_cb_scpl[1]); MAi_inform_base(MT_F_DCPL, &ma_cb_dcpl[0], &ma_cb_dcpl[1]); return 1; } #endif /* ------------------------------------------------------------------------- */ /* * Print debugging information about all blocks currently in use * on the heap or the stack. */ /* ------------------------------------------------------------------------- */ public void MAi_summarize_allocated_blocks(index_base) int index_base; /* 0 (C) or 1 (FORTRAN) */ { int heap_blocks; /* # of blocks on heap used list */ int stack_blocks; /* # of blocks on stack used list */ #ifdef STATS ma_stats.calls[(int)FID_MA_summarize_allocated_blocks]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return; #endif /* VERIFY */ /* verify index_base */ if ((index_base != 0) && (index_base != 1)) { (void)sprintf(ma_ebuf, "invalid index_base: %d", index_base); ma_error(EL_Nonfatal, ET_Internal, "MAi_summarize_allocated_blocks", ma_ebuf); return; } (void)printf("MA_summarize_allocated_blocks: starting scan ...\n"); /* print blocks on the heap used list */ heap_blocks = list_print(ma_hused, "heap", index_base); /* print blocks on the stack used list */ stack_blocks = list_print(ma_sused, "stack", index_base); (void)printf("MA_summarize_allocated_blocks: scan completed: "); (void)printf("%d heap block%s, %d stack block%s\n", heap_blocks, plural(heap_blocks), stack_blocks, plural(stack_blocks)); } /** ** public routines **/ /* ------------------------------------------------------------------------- */ /* * Convenience function that combines MA_allocate_heap and MA_get_index. */ /* ------------------------------------------------------------------------- */ public Boolean MA_alloc_get( Integer datatype, /* of elements in this block */ Integer nelem, /* # of elements in this block */ const char *name, /* assigned to this block by client */ Integer *memhandle, /* RETURN: handle for this block */ MA_AccessIndex *index /* RETURN: index for this block */ ) { #ifdef STATS ma_stats.calls[(int)FID_MA_alloc_get]++; #endif /* STATS */ if (MA_allocate_heap(datatype, nelem, name, memhandle)) /* MA_allocate_heap succeeded; try MA_get_index */ return MA_get_index(*memhandle, index); else /* MA_allocate_heap failed */ return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Allocate a heap block big enough to hold nelem elements * of the given datatype. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_allocate_heap( Integer datatype, /* of elements in this block */ Integer nelem, /* # of elements in this block */ const char *name, /* assigned to this block by client */ Integer *memhandle /* RETURN: handle for this block */ ) { AR ar; /* allocation request */ AD *ad; /* AD for newly allocated block */ Pointer client_space; /* location of client_space */ ulongi nbytes; /* length of block for ar */ Pointer new_hp; /* new ma_hp */ #ifdef STATS ma_stats.calls[(int)FID_MA_allocate_heap]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ if (ma_trace) (void)printf("MA: allocating '%s' (%d)\n", name, (int)nelem); /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "block '%s', MA not yet initialized", name); ma_error(EL_Nonfatal, ET_External, "MA_allocate_heap", ma_ebuf); return MA_FALSE; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "block '%s', invalid datatype: %ld", name, (long)datatype); ma_error(EL_Nonfatal, ET_External, "MA_allocate_heap", ma_ebuf); return MA_FALSE; } /* verify nelem */ if (nelem < 0) { (void)sprintf(ma_ebuf, "block '%s', invalid nelem: %ld", name, (long)nelem); ma_error(EL_Nonfatal, ET_External, "MA_allocate_heap", ma_ebuf); return MA_FALSE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * attempt to allocate space */ ar.datatype = datatype; ar.nelem = nelem; /* search the free list */ ad = list_delete_one(&ma_hfree, ad_big_enough, (Pointer)&ar); /* if search of free list failed, try expanding heap region */ if (ad == (AD *)NULL) { /* perform trial allocation to determine size */ balloc_after(&ar, ma_hp, &client_space, &nbytes); new_hp = ma_hp + nbytes; if (new_hp > ma_sp) { (void)sprintf(ma_ebuf, "block '%s', not enough space to allocate %lu bytes", name, nbytes); ma_error(EL_Nonfatal, ET_External, "MA_allocate_heap", ma_ebuf); return MA_FALSE; } else { /* heap region expanded successfully */ ad = (AD *)ma_hp; /* set fields appropriately */ ad->client_space = client_space; ad->nbytes = nbytes; } } /* * space has been allocated */ /* initialize the AD */ ad->datatype = datatype; ad->nelem = nelem; str_ncopy(ad->name, (char*)name, MA_NAMESIZE); /* ad->client_space is already set */ /* ad->nbytes is already set */ list_insert(ad, &ma_hused); ad->checksum = checksum(ad); /* set the guards */ guard_set(ad); #ifdef DEBUG debug_ad_print(ad); #endif /* DEBUG */ /* update ma_hp if necessary */ new_hp = (Pointer)ad + ad->nbytes; if (new_hp > ma_hp) { ma_hp = new_hp; } #ifdef STATS ma_stats.hblocks++; ma_stats.hblocks_max = max(ma_stats.hblocks, ma_stats.hblocks_max); ma_stats.hbytes += ad->nbytes; ma_stats.hbytes_max = max(ma_stats.hbytes, ma_stats.hbytes_max); #endif /* STATS */ /* convert AD to memhandle */ if ((*memhandle = ma_table_allocate((TableData)ad)) == TABLE_HANDLE_NONE) /* failure */ return MA_FALSE; else /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Deallocate the given stack block and all stack blocks allocated * after it. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_chop_stack(Integer memhandle)/*the block to deallocate up to*/ { AD *ad; /* AD for memhandle */ #ifdef STATS ma_stats.calls[(int)FID_MA_chop_stack]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (!mh2ad(memhandle, &ad, BL_Stack, "MA_chop_stack")) return MA_FALSE; /* delete block and all blocks above it from used list */ #ifdef STATS ma_stats.sblocks -= list_delete_many(&ma_sused, ad_le, (Pointer)ad, mh_free); #else (void)list_delete_many(&ma_sused, ad_le, (Pointer)ad, mh_free); #endif /* STATS */ /* pop block and all blocks above it from stack */ #ifdef STATS ma_stats.sbytes -= (((Pointer)ad + ad->nbytes) - ma_sp); #endif /* STATS */ ma_sp = (Pointer)ad + ad->nbytes; /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Deallocate the given heap block. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_free_heap(Integer memhandle) /* the block to deallocate */ { AD *ad; /* AD for memhandle */ #ifdef STATS ma_stats.calls[(int)FID_MA_free_heap]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (!mh2ad(memhandle, &ad, BL_Heap, "MA_free_heap")) return MA_FALSE; if (ma_trace) (void)printf("MA: freeing '%s'\n", ad->name); /* delete block from used list */ if (list_delete(ad, &ma_hused) != ad) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not on heap used list", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_Internal, "MA_free_heap", ma_ebuf); return MA_FALSE; } #ifdef STATS ma_stats.hblocks--; ma_stats.hbytes -= ad->nbytes; #endif /* STATS */ /* reclaim the deallocated block */ block_free_heap(ad); /* free memhandle */ ma_table_deallocate(memhandle); /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Deallocate nelem elements from the given heap block. * * The nelem elements (of the datatype specified when the heap block * was allocated) to be deallocated are assumed to be at the rightmost * (i.e., higher addresses) edge of the heap block. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_free_heap_piece( Integer memhandle, /* the block to deallocate a piece of */ Integer nelem /* # of elements to deallocate */) { AD *ad; /* AD for memhandle */ AD *ad_reclaim; /* AD for data returned */ AR ar; /* AR for data kept */ Pointer client_space; /* location of client_space */ ulongi nbytes; /* length of block for data kept */ #ifdef STATS ma_stats.calls[(int)FID_MA_free_heap_piece]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (!mh2ad(memhandle, &ad, BL_Heap, "MA_free_heap_piece")) return MA_FALSE; /* verify nelem */ if (nelem < 0) { (void)sprintf(ma_ebuf, "block '%s', invalid nelem: %ld", ad->name, (long)nelem); ma_error(EL_Nonfatal, ET_External, "MA_free_heap_piece", ma_ebuf); return MA_FALSE; } else if (nelem >= ad->nelem) { /* deallocate the whole block */ return MA_free_heap(memhandle); } if (ma_trace) (void)printf("MA: freeing %ld elements of '%s'\n", (long)nelem, ad->name); /* set AR for data to keep */ ar.datatype = ad->datatype; ar.nelem = ad->nelem - nelem; /* perform trial allocation to determine size */ balloc_after(&ar, (Pointer)ad, &client_space, &nbytes); if (nbytes < ad->nbytes) { /* ad has extra space; split block if possible */ ad_reclaim = block_split(ad, nbytes, (Boolean)MA_FALSE); if (ad_reclaim) { #ifdef STATS ma_stats.hbytes -= ad_reclaim->nbytes; #endif /* STATS */ /* reclaim the deallocated (new) block */ block_free_heap(ad_reclaim); } } /* update surviving block */ ad->nelem = ar.nelem; ad->checksum = checksum(ad); /* set the guards */ guard_set(ad); #ifdef DEBUG debug_ad_print(ad); #endif /* DEBUG */ /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Get the base index for the given block. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_get_index( Integer memhandle, /* block to get index for */ MA_AccessIndex *index /* RETURN: base index */) { AD *ad; /* AD for memhandle */ #ifdef STATS ma_stats.calls[(int)FID_MA_get_index]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (mh2ad(memhandle, &ad, BL_HeapOrStack, "MA_get_index")) { /* compute index */ *index = client_space_index(ad); /* success */ return MA_TRUE; } else { /* failure */ return MA_FALSE; } } /* ------------------------------------------------------------------------- */ /* * Return the base address of the given datatype. */ /* ------------------------------------------------------------------------- */ public Pointer MA_get_mbase(Integer datatype) /* to get base address of */ { #ifdef STATS ma_stats.calls[(int)FID_MA_get_mbase]++; #endif /* STATS */ /* preinitialize if necessary */ ma_preinitialize("MA_get_mbase"); /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_get_mbase", ma_ebuf); return NULL; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); return ma_base[datatype]; } /* ------------------------------------------------------------------------- */ /* * Get the handle for the next block in the scan of currently allocated * blocks. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_get_next_memhandle( Integer *ithandle, /* handle for this iterator */ Integer *memhandle /* RETURN: handle for the next block */) { #ifdef STATS ma_stats.calls[(int)FID_MA_get_next_memhandle]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* not yet implemented */ (void)sprintf(ma_ebuf, "not yet implemented"); ma_error(EL_Nonfatal, ET_External, "MA_get_next_memhandle", ma_ebuf); return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Get the requested alignment. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_get_numalign(Integer *value) /* RETURN: requested alignment */ { #ifdef STATS ma_stats.calls[(int)FID_MA_get_numalign]++; #endif /* STATS */ *value = ma_numalign; return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Get the base pointer for the given block. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ /* JN converted to void* to avoid calling hassles */ public Boolean MA_get_pointer( Integer memhandle, /* block to get pointer for */ void *pointer /* RETURN: base pointer */) { AD *ad; /* AD for memhandle */ #ifdef STATS ma_stats.calls[(int)FID_MA_get_pointer]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (mh2ad(memhandle, &ad, BL_HeapOrStack, "MA_get_pointer")) { /* compute pointer */ #if 0 *pointer = ad->client_space; #endif *(char**)pointer = ad->client_space; /* success */ return MA_TRUE; } else { /* failure */ return MA_FALSE; } } /* ------------------------------------------------------------------------- */ /* * Initialize the memory allocator. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_init( Integer datatype, /* for computing storage requirement */ Integer nominal_stack, /* # of datatype elements desired for stack */ Integer nominal_heap /* # of datatype elements desired for heap */) { ulongi heap_bytes; /* # of bytes for heap */ ulongi stack_bytes; /* # of bytes for stack */ ulongi total_bytes; /* total # of bytes */ #ifdef STATS ma_stats.calls[(int)FID_MA_init]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* preinitialize if necessary */ ma_preinitialize("MA_init"); /* verify uninitialization */ if (ma_initialized) { (void)sprintf(ma_ebuf, "MA already initialized"); ma_error(EL_Nonfatal, ET_External, "MA_init", ma_ebuf); return MA_FALSE; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Nonfatal, ET_External, "MA_init", ma_ebuf); return MA_FALSE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* compute # of bytes in heap */ if (nominal_heap < 0) { heap_bytes = DEFAULT_TOTAL_HEAP; } else { heap_bytes = (nominal_heap * ma_sizeof[datatype]) + (DEFAULT_REQUESTS_HEAP * max_block_overhead(datatype)); } heap_bytes = (unsigned long)mai_round((long)heap_bytes, (ulongi)ALIGNMENT); /* compute # of bytes in stack */ if (nominal_stack < 0) { stack_bytes = DEFAULT_TOTAL_STACK; } else { stack_bytes = (nominal_stack * ma_sizeof[datatype]) + (DEFAULT_REQUESTS_STACK * max_block_overhead(datatype)); } stack_bytes = (unsigned long)mai_round((long)stack_bytes, (ulongi)ALIGNMENT); /* segment consists of heap and stack */ total_bytes = heap_bytes + stack_bytes; #ifdef NOUSE_MMAP /* disable memory mapped malloc */ mallopt(M_MMAP_MAX, 0); mallopt(M_TRIM_THRESHOLD, -1); #endif /* allocate the segment of memory */ #ifdef ENABLE_ARMCI_MEM_OPTION if(getenv("MA_USE_ARMCI_MEM")) { ma_segment = (Pointer)ARMCI_Malloc_local(total_bytes); } else #endif ma_segment = (Pointer)bytealloc(total_bytes); if (ma_segment == (Pointer)NULL) { (void)sprintf(ma_ebuf, "could not allocate %lu bytes", total_bytes); ma_error(EL_Nonfatal, ET_External, "MA_init", ma_ebuf); return MA_FALSE; } /* * initialize management stuff */ /* partition is at (first address past) end of heap */ ma_partition = ma_segment + heap_bytes; /* compute (first address past) end of segment */ ma_eos = ma_segment + total_bytes; /* ma_hp initially points at start of segment */ ma_hp = ma_segment; /* ma_sp initially points at end of segment */ ma_sp = ma_eos; /* lists are all initially empty */ ma_hfree = (AD *)NULL; ma_hused = (AD *)NULL; ma_sused = (AD *)NULL; /* we are now initialized */ ma_initialized = MA_TRUE; /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Return MA_TRUE if MA_init has been called successfully, * else return MA_FALSE. */ /* ------------------------------------------------------------------------- */ public Boolean MA_initialized() { #ifdef STATS ma_stats.calls[(int)FID_MA_initialized]++; #endif /* STATS */ return ma_initialized; } /* ------------------------------------------------------------------------- */ /* * Initialize a scan of currently allocated blocks. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_init_memhandle_iterator( Integer *ithandle) { #ifdef STATS ma_stats.calls[(int)FID_MA_init_memhandle_iterator]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* not yet implemented */ (void)sprintf(ma_ebuf, "not yet implemented"); ma_error(EL_Nonfatal, ET_External, "MA_init_memhandle_iterator", ma_ebuf); return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the space between the heap and the stack, in a single * allocation request, ignoring the partition defined at initialization. * * Note that this might not be the largest piece of memory available; * the heap may contain deallocated blocks that are larger. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_avail(Integer datatype) { long gap_length; /* # of bytes between heap and stack */ Integer nelem_gap; /* max elements containable in gap */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_avail]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_avail", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_avail", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between heap and stack */ gap_length = (long)(ma_sp - ma_hp); if (gap_length > 0) nelem_gap = ma_nelem(ma_hp, (ulongi)gap_length, datatype); else nelem_gap = 0; /* success */ return nelem_gap; } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the heap, in a single allocation request, * honoring the partition defined at initialization. * * This routine does not check the stack. Therefore, if the stack * has overgrown the partition, the answer returned by this routine * might be incorrect, i.e., there might be less memory available * than this routine indicates. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_heap(Integer datatype) { long gap_length; /* # of bytes between heap and partition */ Integer nelem_gap; /* max elements containable in gap */ Integer nelem_frag; /* max elements containable in any frag */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_heap]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_heap", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_heap", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between heap and partition */ gap_length = (long)(ma_partition - ma_hp); if (gap_length > 0) nelem_gap = ma_nelem(ma_hp, (ulongi)gap_length, datatype); else nelem_gap = 0; /* try heap fragments */ nelem_frag = ma_max_heap_frag_nelem(datatype, nelem_gap); /* success */ return max(nelem_gap, nelem_frag); } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the heap, in a single allocation request, * honoring the partition defined at initialization. * * This routine does check the stack. Therefore, whether or not the stack * has overgrown the partition, the answer returned by this routine * will be correct, i.e., there will be at least the memory available * that this routine indicates. * * Note that this might not be the largest piece of memory available; * the space between the heap and the stack may be larger. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_heap_check_stack(Integer datatype) { long gap_length; /* # of bytes between heap and partition */ Integer nelem_gap; /* max elements containable in gap */ Integer nelem_frag; /* max elements containable in any frag */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_heap_check_stack]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_heap_check_stack", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_heap_check_stack", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between heap and partition or heap and stack */ gap_length = min((long)(ma_partition - ma_hp), (long)(ma_sp - ma_hp)); if (gap_length > 0) nelem_gap = ma_nelem(ma_hp, (ulongi)gap_length, datatype); else nelem_gap = 0; /* try heap fragments */ nelem_frag = ma_max_heap_frag_nelem(datatype, nelem_gap); /* success */ return max(nelem_gap, nelem_frag); } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the heap, in a single allocation request, * ignoring the partition defined at initialization. * * This routine does check the stack. Therefore, whether or not the stack * has overgrown the partition, the answer returned by this routine * will be correct, i.e., there will be at least the memory available * that this routine indicates. * * Note that this will be the largest piece of memory available. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_heap_no_partition(Integer datatype) { long gap_length; /* # of bytes between heap and partition */ Integer nelem_gap; /* max elements containable in gap */ Integer nelem_frag; /* max elements containable in any frag */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_heap_no_partition]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_heap_no_partition", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_heap_no_partition", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between heap and stack */ gap_length = (long)(ma_sp - ma_hp); if (gap_length > 0) nelem_gap = ma_nelem(ma_hp, (ulongi)gap_length, datatype); else nelem_gap = 0; /* try heap fragments */ nelem_frag = ma_max_heap_frag_nelem(datatype, nelem_gap); /* success */ return max(nelem_gap, nelem_frag); } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the stack, in a single allocation request, * honoring the partition defined at initialization. * * This routine does not check the heap. Therefore, if the heap * has overgrown the partition, the answer returned by this routine * might be incorrect, i.e., there might be less memory available * than this routine indicates. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_stack(Integer datatype) { long gap_length; /* # of bytes between partition and stack */ Integer nelem_gap; /* max elements containable in gap */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_stack]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_stack", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_stack", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between partition and stack */ gap_length = (long)(ma_sp - ma_partition); if (gap_length > 0) nelem_gap = ma_nelem(ma_partition, (ulongi)gap_length, datatype); else nelem_gap = 0; /* success */ return nelem_gap; } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the stack, in a single allocation request, * honoring the partition defined at initialization. * * This routine does check the heap. Therefore, whether or not the heap * has overgrown the partition, the answer returned by this routine * will be correct, i.e., there will be at least the memory available * that this routine indicates. * * Note that this might not be the largest piece of memory available; * the space between the heap and the stack may be larger. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_stack_check_heap(Integer datatype) { long gap_length; /* # of bytes between partition and stack */ Integer nelem_gap; /* max elements containable in gap */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_stack_check_heap]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_stack_check_heap", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_stack_check_heap", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between partition and stack or heap and stack */ gap_length = min((long)(ma_sp - ma_partition), (long)(ma_sp - ma_hp)); if (gap_length > 0) nelem_gap = ma_nelem(ma_partition, (ulongi)gap_length, datatype); else nelem_gap = 0; /* success */ return nelem_gap; } /* ------------------------------------------------------------------------- */ /* * Return the maximum number of datatype elements that can currently * be allocated in the stack, in a single allocation request, * ignoring the partition defined at initialization. * * This routine does check the heap. Therefore, whether or not the heap * has overgrown the partition, the answer returned by this routine * will be correct, i.e., there will be at least the memory available * that this routine indicates. * * Note that this might not be the largest piece of memory available; * the heap may contain deallocated blocks that are larger. * * This routine is equivalent to MA_inquire_avail. */ /* ------------------------------------------------------------------------- */ public Integer MA_inquire_stack_no_partition(Integer datatype) { long gap_length; /* # of bytes between heap and partition */ Integer nelem_gap; /* max elements containable in gap */ #ifdef STATS ma_stats.calls[(int)FID_MA_inquire_stack_no_partition]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "MA not yet initialized"); ma_error(EL_Nonfatal, ET_External, "MA_inquire_stack_no_partition", ma_ebuf); return (Integer)0; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_inquire_stack_no_partition", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * compute the # of elements for which space is available */ /* try space between heap and stack */ gap_length = (long)(ma_sp - ma_hp); if (gap_length > 0) nelem_gap = ma_nelem(ma_hp, (ulongi)gap_length, datatype); else nelem_gap = 0; /* success */ return nelem_gap; } /* ------------------------------------------------------------------------- */ /* * Deallocate the given stack block, which must be the one most recently * allocated. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_pop_stack(Integer memhandle) /* the block to deallocate */ { AD *ad; /* AD for memhandle */ #ifdef STATS ma_stats.calls[(int)FID_MA_pop_stack]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ /* verify memhandle and convert to AD */ if (!mh2ad(memhandle, &ad, BL_StackTop, "MA_pop_stack")) return MA_FALSE; if (ma_trace) (void)printf("MA: popping '%s'\n", ad->name); /* delete block from used list */ if (list_delete(ad, &ma_sused) != ad) { (void)sprintf(ma_ebuf, "memhandle %ld (name: '%s') not on stack used list", (long)memhandle, ad->name); ma_error(EL_Nonfatal, ET_Internal, "MA_pop_stack", ma_ebuf); return MA_FALSE; } /* pop block from stack */ ma_sp += ad->nbytes; #ifdef STATS ma_stats.sblocks--; ma_stats.sbytes -= ad->nbytes; #endif /* STATS */ /* free memhandle */ ma_table_deallocate(memhandle); /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Print usage statistics. */ /* ------------------------------------------------------------------------- */ public void MA_print_stats(Boolean printroutines) { #ifdef STATS int i; /* loop index */ #ifdef STATS ma_stats.calls[(int)FID_MA_print_stats]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return; #endif /* VERIFY */ (void)printf("MA usage statistics:\n"); (void)printf("\n\tallocation statistics:\n"); (void)printf("\t\t\t\t\t heap\t stack\n"); (void)printf("\t\t\t\t\t ----\t -----\n"); (void)printf("\tcurrent number of blocks\t%10lu\t%10lu\n", ma_stats.hblocks, ma_stats.sblocks); (void)printf("\tmaximum number of blocks\t%10lu\t%10lu\n", ma_stats.hblocks_max, ma_stats.sblocks_max); (void)printf("\tcurrent total bytes\t\t%10lu\t%10lu\n", ma_stats.hbytes, ma_stats.sbytes); (void)printf("\tmaximum total bytes\t\t%10lu\t%10lu\n", ma_stats.hbytes_max, ma_stats.sbytes_max); (void)printf("\tmaximum total K-bytes\t\t%10lu\t%10lu\n", ((ma_stats.hbytes_max+999)/1000), ((ma_stats.sbytes_max+999)/1000)); (void)printf("\tmaximum total M-bytes\t\t%10lu\t%10lu\n", ((ma_stats.hbytes_max+999999)/1000000), ((ma_stats.sbytes_max+999999)/1000000)); if (printroutines) { (void)printf("\n\tcalls per routine:\n"); for (i = 0; i < NUMROUTINES; i++) (void)printf("\t\t%10lu %s\n", ma_stats.calls[i], ma_routines[i]); } #else (void)sprintf(ma_ebuf, "unavailable; recompile MA with -DSTATS"); ma_error(EL_Nonfatal, ET_External, "MA_print_stats", ma_ebuf); #endif /* STATS */ } /* ------------------------------------------------------------------------- */ /* * Convenience function that combines MA_push_stack and MA_get_index. */ /* ------------------------------------------------------------------------- */ public Boolean MA_push_get( Integer datatype, /* of elements in this block */ Integer nelem, /* # of elements in this block */ const char *name, /* assigned to this block by client */ Integer *memhandle, /* RETURN: handle for this block */ MA_AccessIndex *index /* RETURN: index for this block */) { #ifdef STATS ma_stats.calls[(int)FID_MA_push_get]++; #endif /* STATS */ if (MA_push_stack(datatype, nelem, name, memhandle)) /* MA_push_stack succeeded; try MA_get_index */ return MA_get_index(*memhandle, index); else /* MA_push_stack failed */ return MA_FALSE; } /* ------------------------------------------------------------------------- */ /* * Allocate a stack block big enough to hold nelem elements * of the given datatype. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_push_stack( Integer datatype, /* of elements in this block */ Integer nelem, /* # of elements in this block */ const char *name, /* assigned to this block by client */ Integer *memhandle /* RETURN: handle for this block */) { AR ar; /* allocation request */ AD *ad; /* AD for newly allocated block */ Pointer client_space; /* location of client_space */ ulongi nbytes; /* length of block for ar */ Pointer new_sp; /* new ma_sp */ #ifdef STATS ma_stats.calls[(int)FID_MA_push_stack]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return MA_FALSE; #endif /* VERIFY */ if (ma_trace) (void)printf("MA: pushing '%s' (%d)\n", name, (int)nelem); /* verify initialization */ if (!ma_initialized) { (void)sprintf(ma_ebuf, "block '%s', MA not yet initialized", name); ma_error(EL_Nonfatal, ET_External, "MA_push_stack", ma_ebuf); return MA_FALSE; } /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "block '%s', invalid datatype: %ld", name, (long)datatype); ma_error(EL_Nonfatal, ET_External, "MA_push_stack", ma_ebuf); return MA_FALSE; } /* verify nelem */ if (nelem < 0) { (void)sprintf(ma_ebuf, "block '%s', invalid nelem: %ld", name, (long)nelem); ma_error(EL_Nonfatal, ET_External, "MA_push_stack", ma_ebuf); return MA_FALSE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* * attempt to allocate space */ ar.datatype = datatype; ar.nelem = nelem; balloc_before(&ar, ma_sp, &client_space, &nbytes); new_sp = ma_sp - nbytes; /* if (new_sp < ma_hp) */ if (((ulongi)(ma_sp - ma_hp)) < nbytes) { (void)sprintf(ma_ebuf, "block '%s', not enough space to allocate %lu bytes", name, nbytes); ma_error(EL_Nonfatal, ET_External, "MA_push_stack", ma_ebuf); return MA_FALSE; } else { ad = (AD *)new_sp; } /* * space has been allocated */ /* initialize the AD */ ad->datatype = datatype; ad->nelem = nelem; str_ncopy(ad->name, (char*)name, MA_NAMESIZE); ad->client_space = client_space; ad->nbytes = nbytes; list_insert(ad, &ma_sused); ad->checksum = checksum(ad); /* set the guards */ guard_set(ad); #ifdef DEBUG debug_ad_print(ad); #endif /* DEBUG */ /* update ma_sp */ ma_sp = new_sp; #ifdef STATS ma_stats.sblocks++; ma_stats.sblocks_max = max(ma_stats.sblocks, ma_stats.sblocks_max); ma_stats.sbytes += ad->nbytes; ma_stats.sbytes_max = max(ma_stats.sbytes, ma_stats.sbytes_max); #endif /* STATS */ /* convert AD to memhandle */ if ((*memhandle = ma_table_allocate((TableData)ad)) == TABLE_HANDLE_NONE) /* failure */ return MA_FALSE; else /* success */ return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Set the ma_auto_verify flag to value and return its previous value. */ /* ------------------------------------------------------------------------- */ public Boolean MA_set_auto_verify(Boolean value /* to set flag to */) { Boolean old_value; /* of flag */ #ifdef STATS ma_stats.calls[(int)FID_MA_set_auto_verify]++; #endif /* STATS */ old_value = ma_auto_verify; ma_auto_verify = value; return old_value; } /* ------------------------------------------------------------------------- */ /* * Set the ma_error_print flag to value and return its previous value. */ /* ------------------------------------------------------------------------- */ public Boolean MA_set_error_print(Boolean value /* to set flag to */) { Boolean old_value; /* of flag */ #ifdef STATS ma_stats.calls[(int)FID_MA_set_error_print]++; #endif /* STATS */ old_value = ma_error_print; ma_error_print = value; return old_value; } /* ------------------------------------------------------------------------- */ /* * Set the ma_hard_fail flag to value and return its previous value. */ /* ------------------------------------------------------------------------- */ public Boolean MA_set_hard_fail( Boolean value /* to set flag to */) { Boolean old_value; /* of flag */ #ifdef STATS ma_stats.calls[(int)FID_MA_set_hard_fail]++; #endif /* STATS */ old_value = ma_hard_fail; ma_hard_fail = value; return old_value; } /* ------------------------------------------------------------------------- */ /* * Set the requested alignment. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_set_numalign(Integer value) { #ifdef STATS ma_stats.calls[(int)FID_MA_set_numalign]++; #endif /* STATS */ if ((value < 0) || (value > 30)) { (void)sprintf(ma_ebuf, "invalid alignment: %ld", (long)value); ma_error(EL_Nonfatal, ET_External, "MA_set_numalign", ma_ebuf); return MA_FALSE; } ma_numalign = value; return MA_TRUE; } /* ------------------------------------------------------------------------- */ /* * Return the number of elements of datatype2 required to contain * nelem1 elements of datatype1. */ /* ------------------------------------------------------------------------- */ public Integer MA_sizeof( Integer datatype1, /* of source elements */ Integer nelem1, /* # of source elements */ Integer datatype2 /* of target elements */) { ulongi source_bytes; /* nelem1 * ma_sizeof[datatype1] */ int ceiling; /* 1 iff ceiling alters result */ #ifdef STATS ma_stats.calls[(int)FID_MA_sizeof]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* preinitialize if necessary */ ma_preinitialize("MA_sizeof"); /* verify datatype1 */ if (!mt_valid(datatype1)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype1); ma_error(EL_Fatal, ET_External, "MA_sizeof", ma_ebuf); return DONTCARE; } /* verify nelem1 */ if (nelem1 < 0) { (void)sprintf(ma_ebuf, "invalid nelem: %ld", (long)nelem1); ma_error(EL_Fatal, ET_External, "MA_sizeof", ma_ebuf); return DONTCARE; } /* verify datatype2 */ if (!mt_valid(datatype2)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype2); ma_error(EL_Fatal, ET_External, "MA_sizeof", ma_ebuf); return DONTCARE; } /* convert datatype1 to internal (index-suitable) value */ datatype1 = mt_import(datatype1); /* convert datatype2 to internal (index-suitable) value */ datatype2 = mt_import(datatype2); /* compute and return the result */ source_bytes = nelem1 * ma_sizeof[datatype1]; ceiling = (source_bytes % ma_sizeof[datatype2]) ? 1 : 0; return (Integer)((source_bytes / ma_sizeof[datatype2]) + ceiling); } /* ------------------------------------------------------------------------- */ /* * Return the number of elements of datatype required to contain * the worst case number of bytes of overhead for any block. */ /* ------------------------------------------------------------------------- */ public Integer MA_sizeof_overhead(Integer datatype) { int overhead_bytes; /* max bytes of overhead for any block */ int ceiling; /* 1 iff ceiling alters result */ int max_sizeof; /* max over i of ma_sizeof[i] */ int biggest_datatype=0; /* corresponds to max_sizeof */ int i; /* loop index */ #ifdef STATS ma_stats.calls[(int)FID_MA_sizeof_overhead]++; #endif /* STATS */ #ifdef VERIFY if (ma_auto_verify && !MA_verify_allocator_stuff()) return DONTCARE; #endif /* VERIFY */ /* preinitialize if necessary */ ma_preinitialize("MA_sizeof_overhead"); /* verify datatype */ if (!mt_valid(datatype)) { (void)sprintf(ma_ebuf, "invalid datatype: %ld", (long)datatype); ma_error(EL_Fatal, ET_External, "MA_sizeof_overhead", ma_ebuf); return DONTCARE; } /* convert datatype to internal (index-suitable) value */ datatype = mt_import(datatype); /* compute and return the result */ for (max_sizeof = 0, i = 0; i < MT_NUMTYPES; i++) if (ma_sizeof[i] > max_sizeof) { max_sizeof = ma_sizeof[i]; biggest_datatype = i; } overhead_bytes = max_block_overhead(biggest_datatype); ceiling = (overhead_bytes % ma_sizeof[datatype]) ? 1 : 0; return (Integer)((overhead_bytes / ma_sizeof[datatype]) + ceiling); } /* ------------------------------------------------------------------------- */ /* * Print debugging information about all blocks currently in use * on the heap or the stack. */ /* ------------------------------------------------------------------------- */ public void MA_summarize_allocated_blocks() { /* C indices are 0-based */ MAi_summarize_allocated_blocks(0); } /* ------------------------------------------------------------------------- */ /* * Control tracing of allocation and deallocation operations. */ /* ------------------------------------------------------------------------- */ public void MA_trace(Boolean value) { ma_trace = value; } /* ------------------------------------------------------------------------- */ /* * Sanity check the internal state of MA and print the results. * * Return MA_TRUE upon success, or MA_FALSE upon failure. */ /* ------------------------------------------------------------------------- */ public Boolean MA_verify_allocator_stuff() { #ifdef VERIFY char *preamble; /* printed before block error messages */ int heap_blocks; int bad_heap_blocks; int bad_heap_checksums; int bad_heap_lguards; int bad_heap_rguards; int stack_blocks; int bad_stack_blocks; int bad_stack_checksums; int bad_stack_lguards; int bad_stack_rguards; #ifdef STATS ma_stats.calls[(int)FID_MA_verify_allocator_stuff]++; #endif /* STATS */ preamble = "MA_verify_allocator_stuff: starting scan ...\n"; /* check each block on the heap used list */ list_verify(ma_hused, "heap", preamble, &heap_blocks, &bad_heap_blocks, &bad_heap_checksums, &bad_heap_lguards, &bad_heap_rguards); if (bad_heap_blocks > 0) /* only print preamble once */ preamble = (char *)NULL; /* check each block on the stack used list */ list_verify(ma_sused, "stack", preamble, &stack_blocks, &bad_stack_blocks, &bad_stack_checksums, &bad_stack_lguards, &bad_stack_rguards); if ((bad_heap_blocks > 0) || (bad_stack_blocks > 0)) { Boolean old_ma_error_print; /* print postamble */ (void)printf("MA_verify_allocator_stuff: scan completed\n"); /* construct a summary of the results */ (void)sprintf(ma_ebuf, "\n\t\t\t\theap\tstack\n\t\t\t\t----\t-----\n\tchecksum errors\t\t%4d\t%5d\n\tleft signature errors\t%4d\t%5d\n\tright signature errors\t%4d\t%5d\n\ttotal bad blocks\t%4d\t%5d\n\ttotal blocks\t\t%4d\t%5d", bad_heap_checksums, bad_stack_checksums, bad_heap_lguards, bad_stack_lguards, bad_heap_rguards, bad_stack_rguards, bad_heap_blocks, bad_stack_blocks, heap_blocks, stack_blocks); /* print the summary on stderr */ old_ma_error_print = ma_error_print; ma_error_print = MA_TRUE; ma_error(EL_Nonfatal, ET_External, "MA_verify_allocator_stuff", ma_ebuf); ma_error_print = old_ma_error_print; /* problems were found */ return MA_FALSE; } else /* no problems found */ return MA_TRUE; #else #ifdef STATS ma_stats.calls[(int)FID_MA_verify_allocator_stuff]++; #endif /* STATS */ (void)sprintf(ma_ebuf, "unavailable; recompile MA with -DVERIFY"); ma_error(EL_Nonfatal, ET_External, "MA_verify_allocator_stuff", ma_ebuf); return MA_FALSE; #endif /* VERIFY */ } ga-5-4/ma/matypes.h.in0000644000175000017500000000147612662210435012676 0ustar mbamba/** @file * Private header file containing C type definitions. * * This file should only be included directly by internal C * header files (e.g., macdecls.h). It may be included indirectly * by external C files that include the appropriate header * file (e.g., macdecls.h). */ #ifndef _MATYPES_H #define _MATYPES_H /** ** types **/ #include "typesf2c.h" typedef Integer Boolean; /* MA_TRUE or MA_FALSE */ typedef char * Pointer; /* generic pointer */ /* not all C compilers support long double */ typedef @MA_LONG_DOUBLE@ MA_LongDouble; /* no C compilers support complex types */ typedef struct {float dummy[2];} MA_SingleComplex; typedef struct {double dummy[2];} MA_DoubleComplex; typedef struct {double dummy[4];} MA_LongDoubleComplex; typedef @MA_ACCESS_INDEX_TYPE_C@ MA_AccessIndex; #endif /* _matypes_h */ ga-5-4/ma/string-util.c0000644000175000017500000000713312662210435013057 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif /*$Id: string-util.c,v 1.2 1995-02-02 23:18:32 d3g681 Exp $*/ /* * string-util.c */ /* * : * * The standard string functions (strcat, strcmp, strcpy, strlen, etc.) * dereference their pointer arguments without first checking to see if * the arguments are NULL (0). On some machines (e.g., the VAX) this is * harmless, but on others (e.g., the DECstation 3100) it causes a * segmentation fault. * * The string utilities defined here provide functionality similar to that * of their standard counterparts, but they are careful not to dereference * arguments which are NULL. * * : * * A string is of type "pointer to char" (char *); a string is terminated * by a byte whose value is 0 (a null character). The term "Nstring" will * be used to mean "NULL string" (pointer value of 0); "Zstring" will be * used to mean "zero-length string" (nonzero pointer value, but no nonzero * bytes pointed to). is concerned with Nstrings. */ #if HAVE_STDLIB_H # include #endif #if HAVE_STRING_H # include #endif #include "string-util.h" /** ** public routines **/ /* ------------------------------------------------------------------------- */ /* * Return the length of (i.e., number of nonzero bytes in) the given string. */ /* ------------------------------------------------------------------------- */ unsigned int str_len(s) char *s; /* string */ { int length = 0; /* see */ if (!s) { /* length of Nstring is 0 */ return(0); } while (*s++) { length++; } return(length); } /* ------------------------------------------------------------------------- */ /* * Return the index of the string in slist for which s is a match; s "matches" * a string t in slist if (a) s and t are equal, or (b) s is a prefix of t but * is not a prefix of any other string in slist. * * If s matches no string in slist, return SM_NONE. If s matches more than * one string in slist, return SM_MANY. * * Restriction: slist can contain no Nstrings. */ /* ------------------------------------------------------------------------- */ int str_match(s, slist, n) char *s; /* string to match */ char *slist[]; /* list of strings to search */ unsigned int n; /* # of strings in slist */ { size_t i; /* loop index */ size_t length; /* of s */ int match; /* index of string in slist matched by s */ /* see */ if (!s) { return(SM_NONE); } /* we know s is not an Nstring */ length = strlen(s); match = -1; for (i = 0; i < n; i++) { /* s, slist[i] are not Nstrings */ if (!strncmp(s, slist[i], length)) { /* s is at least a prefix */ if (length == strlen(slist[i])) { /* exact match */ return(i); } /* now we know s is a proper prefix */ if (match < 0) { /* first match we've seen */ match = i; } else { /* s is a proper prefix of more than one string in slist */ return(SM_MANY); } } } if (match < 0) { /* s is not a prefix of any string in slist */ return(SM_NONE); } else { /* s is a proper prefix of exactly one string in slist */ return(match); } } ga-5-4/ma/string-util.h0000644000175000017500000000057112662210435013063 0ustar mbamba/** @file * Private header file for string utilities. * * This file should only be included by internal C files. */ #ifndef _string_util_h #define _string_util_h /** ** constants **/ /* str_match return values */ #define SM_NONE (-1) #define SM_MANY (-2) /** ** function types **/ extern unsigned int str_len(); extern int str_match(); #endif /* _string_util_h */ ga-5-4/ma/memcpy.h0000644000175000017500000000201412662210435012066 0ustar mbamba/** @file * Private header file containing symbolic constants, type declarations, * and macro definitions for OS memory routines, to provide a level of * abstraction between them and routines that use them. * * This file should only be included by internal C files. */ #ifndef _memcpy_h #define _memcpy_h /** ** constants **/ /* ensure that NULL is defined */ #ifndef NULL #define NULL 0 #endif /** ** macros **/ /* allocate bytes */ #define bytealloc(nbytes) malloc((unsigned long)(nbytes)) /* deallocate bytes */ #define bytefree(pointer) (void)free((char *)(pointer)) #if HAVE_STRING_H # include #else # ifndef HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr (), *strrchr (); # ifndef HAVE_MEMCPY # define memcpy(d, s, n) bcopy ((s), (d), (n)) # define memmove(d, s, n) bcopy ((s), (d), (n)) # endif #endif #define bytecopy(from,to,nbytes) \ ((void)memcpy((char *)(to), (char *)(from), (int)(nbytes))) #endif /* _memcpy_h */ ga-5-4/ma/testf.F0000644000175000017500000004314612662210435011672 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif c c $Id: testf.F,v 1.6 1997-02-26 20:39:23 d3h325 Exp $ c c c Exercise the MA routines. c program testf implicit none #include "mafdecls.fh" character char1 character*2 char2 character char5(5) integer handle1 integer handle2 integer handle3 integer handle4 integer i integer ihandle1 MA_ACCESS_INDEX_TYPE index1 MA_ACCESS_INDEX_TYPE index2 logical value c ok write (*,*) 'start testing MA_set_error_print ...' value = MA_set_error_print(.true.) write (*,*) 'should see an MA error message here ...' value = MA_pop_stack(-1) value = MA_set_error_print(.false.) if (value) then write (*,*) 'should not see an MA error message here ...' value = MA_pop_stack(-1) else write (*,*) '... failure; return value is wrong' endif write (*,*) 'stop testing MA_set_error_print' write (*,*) ' ' value = MA_set_error_print(.true.) c ok write (*,*) 'should be 9 values ...' write (*,*) '1. MA_sizeof(MT_BYTE, 1, MT_BYTE) = ', $ MA_sizeof(MT_BYTE, 1, MT_BYTE) write (*,*) '2. MA_sizeof(MT_INT, 1, MT_BYTE) = ', $ MA_sizeof(MT_INT, 1, MT_BYTE) write (*,*) '3. MA_sizeof(MT_LOG, 1, MT_BYTE) = ', $ MA_sizeof(MT_LOG, 1, MT_BYTE) write (*,*) '4. MA_sizeof(MT_REAL, 1, MT_BYTE) = ', $ MA_sizeof(MT_REAL, 1, MT_BYTE) write (*,*) '5. MA_sizeof(MT_DBL, 1, MT_BYTE) = ', $ MA_sizeof(MT_DBL, 1, MT_BYTE) write (*,*) '6. MA_sizeof(MT_SCPL, 1, MT_BYTE) = ', $ MA_sizeof(MT_SCPL, 1, MT_BYTE) write (*,*) '7. MA_sizeof(MT_DCPL, 1, MT_BYTE) = ', $ MA_sizeof(MT_DCPL, 1, MT_BYTE) write (*,*) '8. MA_sizeof(MT_BYTE, 3, MT_DBL) = ', $ MA_sizeof(MT_BYTE, 3, MT_DBL) write (*,*) '9. MA_sizeof(MT_BYTE, 33, MT_DBL) = ', $ MA_sizeof(MT_BYTE, 33, MT_DBL) write (*,*) ' ' c ok write (*,*) 'should be 2 values ...' write (*,*) '1. MA_sizeof_overhead(MT_BYTE) = ', $ MA_sizeof_overhead(MT_BYTE) write (*,*) '2. MA_sizeof_overhead(MT_INT) = ', $ MA_sizeof_overhead(MT_INT) write (*,*) ' ' c fail write (*,*) 'should fail (not init) ...' value = MA_push_stack(MT_DBL, 10, 'stack1', handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok value = MA_initialized() if (value) then write (*,*) 'MA_initialized returns true (failure)' else write (*,*) 'MA_initialized returns false (success)' endif write (*,*) ' ' c fail write (*,*) 'should fail (bad datatype) ...' value = MA_init(-1, 10, 10) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_init(MT_DBL, 1000, 1000) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok value = MA_initialized() if (value) then write (*,*) 'MA_initialized returns true (success)' else write (*,*) 'MA_initialized returns false (failure)' endif write (*,*) ' ' c ok write (*,*) 'should be 1 value ...' write (*,*) '1. MA_sizeof_overhead(MT_BYTE) = ', $ MA_sizeof_overhead(MT_BYTE) write (*,*) ' ' c fail write (*,*) 'should fail (bad handle) ...' handle1 = 0 value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (bad handle) ...' handle1 = 37 value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (bad handle) ...' handle1 = 10000 value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (bad handle) ...' value = MA_get_index(handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'start testing MA_chop_stack ...' value = MA_push_stack(MT_BYTE, 1, 'stack1', handle1) value = MA_push_stack(MT_BYTE, 2, 'stack2', handle2) value = MA_push_stack(MT_BYTE, 3, 'stack3', handle3) value = MA_push_stack(MT_BYTE, 4, 'stack4', handle4) write (*,*) 'should be 4 blocks on stack ...' call MA_summarize_allocated_blocks write (*,*) 'should succeed ...' value = MA_chop_stack(handle4) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should be 3 blocks on stack ...' call MA_summarize_allocated_blocks write (*,*) 'should fail (not in stack) ...' value = MA_chop_stack(handle4) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should succeed ...' value = MA_chop_stack(handle2) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should be 1 block on stack ...' call MA_summarize_allocated_blocks write (*,*) 'should succeed ...' value = MA_chop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should be 0 blocks ...' call MA_summarize_allocated_blocks value = MA_push_stack(MT_BYTE, 1, 'stack1', handle1) do 10 i = 1, 33 value = MA_push_stack(MT_BYTE, 1, 'stackn', handle2) 10 continue value = MA_chop_stack(handle1) write (*,*) 'stop testing MA_chop_stack' write (*,*) ' ' c ok write (*,*) 'start testing 0-length stack allocations ...' value = MA_push_get(MT_INT, 1, 'stack1', handle1, index1) value = MA_push_get(MT_INT, 0, 'stack2', handle2, index2) value = MA_push_stack(MT_BYTE, 0, 'stack3', handle3) value = MA_push_stack(MT_BYTE, 4, 'stack4', handle4) int_mb(index1) = 123 int_mb(index2) = 0 write (*,*) 'should fail (bad right sig on stack2) ...' value = MA_verify_allocator_stuff() if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should succeed ...' value = MA_chop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'stop testing 0-length stack allocations ...' write (*,*) ' ' c ok write (*,*) 'start testing 0-length heap allocations ...' value = MA_alloc_get(MT_INT, 1, 'heap1', handle1, index1) value = MA_alloc_get(MT_INT, 0, 'heap2', handle2, index2) value = MA_allocate_heap(MT_BYTE, 0, 'heap3', handle3) value = MA_allocate_heap(MT_BYTE, 4, 'heap4', handle4) int_mb(index1) = 123 value = MA_free_heap(handle4) value = MA_free_heap(handle3) value = MA_free_heap(handle2) value = MA_free_heap(handle1) write (*,*) 'should be 0 blocks ...' call MA_summarize_allocated_blocks write (*,*) 'stop testing 0-length heap allocations ...' write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_push_stack(MT_DBL, 10, 'stack1', handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should succeed ...' value = MA_get_index(handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif dbl_mb(index1) = 19.82 dbl_mb(index1 + 9) = dbl_mb(index1) - 19 write (*,*) 'should be 19.82 and 0.82 ...' write (*,*) 'dbl_mb(', index1, ') = ', dbl_mb(index1) write (*,*) 'dbl_mb(', index1 + 9, ') = ', dbl_mb(index1 + 9) write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_allocate_heap(MT_INT, 10, 'heap1', handle2) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (not in heap) ...' value = MA_free_heap(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (not in stack) ...' value = MA_pop_stack(handle2) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_push_stack(MT_BYTE, 5, 'stack2', handle3) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should see something here ...' call MA_summarize_allocated_blocks write (*,*) ' ' c fail write (*,*) 'should fail (not top of stack) ...' value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_pop_stack(handle3) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_get_index(handle2, index2) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif int_mb(index2) = 1963 int_mb(index2 + 9) = int_mb(index2) - 1900 write (*,*) 'should be 1963 and 63 ...' write (*,*) 'int_mb(', index2, ') = ', int_mb(index2) write (*,*) 'int_mb(', index2 + 9, ') = ', int_mb(index2 + 9) write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_allocate_heap(MT_REAL, 1, 'heap2', handle3) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'start testing MA_verify_allocator_stuff ...' write (*,*) 'should see nothing here ...' value = MA_verify_allocator_stuff() write (*,*) 'should succeed ...' if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'stop testing MA_verify_allocator_stuff' write (*,*) ' ' c fail write (*,*) 'should fail (bad right guard) ...' int_mb(index2 + 10) = 0 value = MA_free_heap(handle2) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_set_auto_verify(.true.) value = MA_set_auto_verify(.true.) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'start testing MA_set_auto_verify ...' write (*,*) 'should see something here ...' value = MA_set_auto_verify(.true.) value = MA_free_heap(handle2) write (*,*) 'should fail (bad right guard) ...' if (value) then write (*,*) '... success' else write (*,*) '... failure' endif value = MA_set_auto_verify(.false.) write (*,*) 'stop testing MA_set_auto_verify' write (*,*) ' ' c fail write (*,*) 'start testing MA_verify_allocator_stuff ...' write (*,*) 'should see something here ...' value = MA_verify_allocator_stuff() write (*,*) 'should fail (bad right guard) ...' if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'stop testing MA_verify_allocator_stuff' write (*,*) ' ' c ok write (*,*) 'should be 3 values ...' write (*,*) '1. MA_inquire_avail(MT_DBL) = ', $ MA_inquire_avail(MT_DBL) write (*,*) '2. MA_inquire_avail(MT_BYTE) = ', $ MA_inquire_avail(MT_BYTE) write (*,*) '3. MA_inquire_avail(MT_DCPL) = ', $ MA_inquire_avail(MT_DCPL) write (*,*) ' ' c fail write (*,*) 'should be 3 values ...' write (*,*) '1. MA_inquire_heap(MT_DBL) = ', $ MA_inquire_heap(MT_DBL) write (*,*) '2. MA_inquire_heap(MT_BYTE) = ', $ MA_inquire_heap(MT_BYTE) write (*,*) '3. MA_inquire_heap(MT_DCPL) = ', $ MA_inquire_heap(MT_DCPL) write (*,*) ' ' c fail write (*,*) 'should be 3 values ...' write (*,*) '1. MA_inquire_stack(MT_DBL) = ', $ MA_inquire_stack(MT_DBL) write (*,*) '2. MA_inquire_stack(MT_BYTE) = ', $ MA_inquire_stack(MT_BYTE) write (*,*) '3. MA_inquire_stack(MT_DCPL) = ', $ MA_inquire_stack(MT_DCPL) write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_alloc_get(MT_INT, 1, 'heap3', handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif int_mb(index1) = 1982 write (*,*) 'should be 1982 ...' write (*,*) 'int_mb(', index1, ') = ', int_mb(index1) write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_free_heap(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'start testing byte arrays ...' write (*,*) 'should succeed ...' value = MA_push_get(MT_BYTE, 5, 'stack3', handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif char5(1) = 'z' char5(2) = 'y' char5(3) = 'x' char5(4) = 'w' char5(5) = 'v' do 20 i = 0, 4 byte_mb(index1 + i) = char5(i + 1) 20 continue write (*,*) 'should be zyxwv ...' do 30 i = 0, 4 char1 = byte_mb(index1+i) write (*,*) 'byte_mb(', index1+i, ') = ', char1 30 continue write (*,*) 'should succeed ...' value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'should succeed ...' i = 1 char2 = 'ab' value = MA_alloc_get(MT_BYTE, i * 2, 'heap4', handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif byte_mb(index1) = char2(1:1) byte_mb(index1 + 1) = char2(2:2) write (*,*) 'should be ab ...' do 40 i = 0, 1 char1 = byte_mb(index1+i) write (*,*) 'byte_mb(', index1+i, ') = ', char1 40 continue write (*,*) 'should succeed ...' value = MA_free_heap(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) 'stop testing byte arrays ...' write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_push_get(MT_INT, 1, 'stack3', handle1, index1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif int_mb(index1) = 5 write (*,*) 'should be 5 ...' write (*,*) 'int_mb(', index1, ') = ', int_mb(index1) write (*,*) ' ' c ok write (*,*) 'should succeed ...' value = MA_pop_stack(handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'start testing MA_print_stats ...' call MA_print_stats(.true.) write (*,*) 'stop testing MA_print_stats' write (*,*) ' ' c fail write (*,*) 'should fail (not implemented) ...' value = MA_init_memhandle_iterator(ihandle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c fail write (*,*) 'should fail (not implemented) ...' value = MA_get_next_memhandle(ihandle1, handle1) if (value) then write (*,*) '... success' else write (*,*) '... failure' endif write (*,*) ' ' c ok write (*,*) 'start testing MA_set_hard_fail ...' value = MA_set_hard_fail(.false.) write (*,*) 'should see a (nonfatal) MA error message here ...' value = MA_pop_stack(-1) value = MA_set_hard_fail(.true.) value = MA_set_hard_fail(.true.) if (value) then write (*,*) 'should see a (hard failure)', $ ' MA error message here ...' value = MA_pop_stack(-1) else write (*,*) '... failure; return value is wrong' endif write (*,*) 'stop testing MA_set_hard_fail' end ga-5-4/config.h.in0000644000175000017500000004640612662210452012065 0ustar mbamba/* config.h.in. Generated from configure.ac by autoheader. */ /* TODO */ #undef ACC_SMP /* TODO */ #undef ALLOC_MUNMAP /* TODO */ #undef ALLOW_PIN /* Defined when using DCMF */ #undef ARMCIX /* Define to 1 on BlueGene/L systems */ #undef BGL /* TODO */ #undef BGML /* Define to 1 on BlueGene/P systems */ #undef BGP /* Define to sizeof(INTEGER) used to compile BLAS */ #undef BLAS_SIZE /* Define to 1 on Cray XT systems using Catamount */ #undef CATAMOUNT /* TODO */ #undef CLUSTER /* TODO */ #undef CRAY_SHMEM /* Define to 1 on Cray SV1 systems */ #undef CRAY_SV1 /* Define to 1 on Cray SV2 systems */ #undef CRAY_SV2 /* Define to 1 on Cray T3E systems */ #undef CRAY_T3E /* for Gemini */ #undef CRAY_UGNI /* TODO */ #undef CRAY_XT /* Define to 1 on Cray YMP systems */ #undef CRAY_YMP /* Define to 1 on Cygnus systems */ #undef CYGNUS /* Define to 1 on Cygwin systems */ #undef CYGWIN /* TODO */ #undef DATA_SERVER /* Defined when using DCMF */ #undef DCMF /* Define to 1 on DEC OSF */ #undef DECOSF /* TODO */ #undef DOELAN4 /* ELPA is using 8-byte integers */ #undef ELPA_I8 /* enables ARMCI in MA */ #undef ENABLE_ARMCI_MEM_OPTION /* Define if checkpointing is enabled */ #undef ENABLE_CHECKPOINT /* Define to 1 if EISPACK is enabled */ #undef ENABLE_EISPACK /* Define to 1 if using Fortran */ #undef ENABLE_F77 /* Define to 1 if PeIGS is enabled */ #undef ENABLE_PEIGS /* set to 1 if profiling is enabled */ #undef ENABLE_PROFILING /* Define if tracing is enabled */ #undef ENABLE_TRACE /* whether the hidden string length comes after all other args */ #undef F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS /* define to 1 if Fortran-callable srand48 does not conflict with system def */ #undef F2C_SRAND48_OK /* Define to dummy `main' function (if any) required to link to the Fortran libraries. */ #undef F77_DUMMY_MAIN /* Name of F77 flush routine */ #undef F77_FLUSH /* Define to a macro mangling the given C identifier (in lower and upper case), which must not contain underscores, for linking with Fortran. */ #undef F77_FUNC /* As F77_FUNC, but for C identifiers containing underscores. */ #undef F77_FUNC_ /* Name of routine e.g. getarg, pxfgetarg */ #undef F77_GETARG /* Arguments to getarg e.g. i,s or i,s,l,ier */ #undef F77_GETARG_ARGS /* Declaration of routine e.g. external GETARG */ #undef F77_GETARG_DECL /* Name of routine e.g. iargc, ipxfargc */ #undef F77_IARGC /* Define if F77 and FC dummy `main' functions are identical. */ #undef FC_DUMMY_MAIN_EQ_F77 /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP /* Define to 1 on fujitsu systems */ #undef FUJITSU_VPP64 /* CPP symbol for function name, if available */ #undef FUNCTION_NAME /* Module command when using Fortran 90 compiler e.g. use f90_unix */ #undef FXX_MODULE /* for Gemini */ #undef GEMINI /* TODO */ #undef GM /* set to 1 if ARMCI has armci_group_comm function */ #undef HAVE_ARMCI_GROUP_COMM /* set to 1 if ARMCI has ARMCI_Group.comm member */ #undef HAVE_ARMCI_GROUP_COMM_MEMBER /* set to 1 if ARMCI has ARMCI_Initialized function */ #undef HAVE_ARMCI_INITIALIZED /* set to 1 if ARMCI has armci_msg_finalize function */ #undef HAVE_ARMCI_MSG_FINALIZE /* set to 1 if ARMCI has armci_msg_init function */ #undef HAVE_ARMCI_MSG_INIT /* set to 1 if ARMCI has armci_notify function */ #undef HAVE_ARMCI_NOTIFY /* set to 1 if ARMCI has armci_stride_info_init function */ #undef HAVE_ARMCI_STRIDE_INFO_INIT /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `bcopy' function, 0 if you don't */ #undef HAVE_BCOPY /* Define to 1 if using external BLAS library */ #undef HAVE_BLAS /* Define to 1 if you have the `bzero' function, 0 if you don't */ #undef HAVE_BZERO /* Define to 1 if you have the `create_shared_region' function, 0 if you don't */ #undef HAVE_CREATE_SHARED_REGION /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `dtime' function. */ #undef HAVE_DTIME /* Define to 1 if you have ELPA library. */ #undef HAVE_ELPA /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_ERRNO_H /* Define to 1 if you have the `etime' function. */ #undef HAVE_ETIME /* whether F77 flush routine is available */ #undef HAVE_F77_FLUSH /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_FFIO_H /* Define to 1 if you have the 'floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `ftruncate' function, 0 if you don't */ #undef HAVE_FTRUNCATE /* Define to 1 if you have the `gethostbyname' function, 0 if you don't */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function, 0 if you don't */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getpagesize' function, 0 if you don't */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the `gettimeofday' function, 0 if you don't */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the 'hypot' function. */ #undef HAVE_HYPOT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if using external LAPACK library */ #undef HAVE_LAPACK /* Defined if plot library is available */ #undef HAVE_LIBPLOT /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_LINUX_LIMITS_H /* Define to 1 if the system has the type `long double'. */ #undef HAVE_LONG_DOUBLE /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_MATH_H /* Define to 1 if you have the `memalign' function, 0 if you don't */ #undef HAVE_MEMALIGN /* Define to 1 if you have the `memcpy' function, 0 if you don't */ #undef HAVE_MEMCPY /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function, 0 if you don't */ #undef HAVE_MEMSET /* Define to 1 if you have a working `mmap' system call. */ #undef HAVE_MMAP /* Define to 1 if you have the 'modf' function. */ #undef HAVE_MODF /* Define to 1 if you have the `munmap' function, 0 if you don't */ #undef HAVE_MUNMAP /* define if the compiler implements namespaces */ #undef HAVE_NAMESPACES /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* set to 1 if libonesided has onesided_fadd (added in v1.6) */ #undef HAVE_ONESIDED_FADD /* set to 1 if libonesided has onesided_mem_htflush (added in v1.5) */ #undef HAVE_ONESIDED_MEM_HTFLUSH /* Define to 1 if you have the `pause' function, 0 if you don't */ #undef HAVE_PAUSE /* whether the ScaLAPACK library implements pdsyevr */ #undef HAVE_PDSYEVR /* Define to 1 if you have the `posix_memalign' function, 0 if you don't */ #undef HAVE_POSIX_MEMALIGN /* Define to 1 if you have the 'pow' function. */ #undef HAVE_POW /* define to 1 if the C compiler has a program name global varaible */ #undef HAVE_PROGNAME /* Define to 1 if you have the `putenv' function, 0 if you don't */ #undef HAVE_PUTENV /* Define to 1 if you have ScaLAPACK library. */ #undef HAVE_SCALAPACK /* Define to 1 if you have the `select' function, 0 if you don't */ #undef HAVE_SELECT /* Define to 1 if you have the `setenv' function, 0 if you don't */ #undef HAVE_SETENV /* Define to 1 if you have the `shared_malloc' function, 0 if you don't */ #undef HAVE_SHARED_MALLOC /* Define to 1 if you have the `shmalloc' function, 0 if you don't */ #undef HAVE_SHMALLOC /* Define to 1 if you have the `socket' function, 0 if you don't */ #undef HAVE_SOCKET /* Define to 1 if you have the 'sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the `srand' function, 0 if you don't */ #undef HAVE_SRAND /* Define to 1 if you have the `srandom' function, 0 if you don't */ #undef HAVE_SRANDOM /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function, 0 if you don't */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function, 0 if you don't */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function, 0 if you don't */ #undef HAVE_STRERROR /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function, 0 if you don't */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function, 0 if you don't */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_FSID_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_FSTYP_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_IOSW_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_IPC_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_MMAN_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_SEM_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_SHM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_STATFS_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_SYS_VFS_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define this if weak aliases may be created with #pragma weak */ #undef HAVE_SYS_WEAK_ALIAS_PRAGMA /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_TIME_H /* define if sys/sem.h has union semun */ #undef HAVE_UNION_SEMUN /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the header file, 0 if you don't */ #undef HAVE_WINDOWS_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Define to 1 on hitachi systems */ #undef HITACHI /* Define to 1 on HP-UX systems */ #undef HPUX /* Define to 1 on 64bit HP-UX systems */ #undef HPUX64 /* Define to 1 on IBM SP systems */ #undef IBM /* Define to 1 on 64bit IBM SP systems */ #undef IBM64 /* Define to 1 on ??? systems */ #undef INTERIX /* TODO */ #undef LAPI /* Define to 1 on 64bit IBM systems with LAPI */ #undef LAPI64 /* TODO */ #undef LAPI_RDMA /* for Gemini */ #undef LIBONESIDED /* Define to 1 on generic Linux systems */ #undef LINUX /* Define to 1 on generic 64bit Linux systems */ #undef LINUX64 /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 on OSX systems */ #undef MACX /* Define to 1 on 64bit OSX systems */ #undef MACX64 /* TODO */ #undef MELLANOX /* TODO */ #undef MPI_MT /* TODO */ #undef MPI_PT /* TODO */ #undef MPI_SPAWN /* Use MPI for messaging */ #undef MSG_COMMS_MPI /* Use TCGMSG for messaging */ #undef MSG_COMMS_TCGMSG /* Use TCGMSG (ipcv4.0) for messaging */ #undef MSG_COMMS_TCGMSG4 /* Use TCGMSG (ipcv5.0) for messaing */ #undef MSG_COMMS_TCGMSG5 /* TODO */ #undef MULTI_CTX /* Define to 1 if assertions should be disabled. */ #undef NDEBUG /* Define to 1 on NEC systems */ #undef NEC /* Define to 1 on 64bit NEC systems */ #undef NEC64 /* whether to wait until the last moment to call ARMCI_Init() in TCGMSG-MPI */ #undef NEED_DELAY_TCGMSG_MPI_STARTUP /* Define to 1 if not using Fortran */ #undef NOFORT /* this was defined unconditionally when using LAPI for tcgmsg 5 */ #undef NOTIFY_SENDER /* Set some mallopt options */ #undef NOUSE_MMAP /* Disables use of shared memory */ #undef NO_SHM /* TODO */ #undef OPENIB /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* TODO */ #undef PEND_BUFS /* TODO */ #undef PORTALS /* TODO */ #undef POSIX_THREADS /* define to the name of the program name global variable */ #undef PROGNAME /* TODO */ #undef PTHREADS /* TODO */ #undef QUADRICS /* TODO */ #undef REPORT_SHMMAX /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* ScaLAPACK is using 8-byte integers */ #undef SCALAPACK_I8 /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* TODO */ #undef SERVER_THREAD /* Define to 1 on ??? systems */ #undef SGI /* Define to 1 on ??? systems */ #undef SGITFP /* Define to 1 on ??? systems */ #undef SGI_N32 /* The size of `char', as computed by sizeof. */ #undef SIZEOF_CHAR /* The size of `double', as computed by sizeof. */ #undef SIZEOF_DOUBLE /* The size of 'DOUBLE PRECISION' as computed by C's sizeof. */ #undef SIZEOF_F77_DOUBLE_PRECISION /* The size of 'INTEGER' as computed by C's sizeof. */ #undef SIZEOF_F77_INTEGER /* The size of 'REAL' as computed by C's sizeof. */ #undef SIZEOF_F77_REAL /* The size of `float', as computed by sizeof. */ #undef SIZEOF_FLOAT /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG /* The size of `long double', as computed by sizeof. */ #undef SIZEOF_LONG_DOUBLE /* The size of `long long', as computed by sizeof. */ #undef SIZEOF_LONG_LONG /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* The size of `void*', as computed by sizeof. */ #undef SIZEOF_VOIDP /* TODO */ #undef SOCKETS /* Define to 1 on Solaris systems */ #undef SOLARIS /* Define to 1 on 64bit Solaris systems */ #undef SOLARIS64 /* TODO */ #undef SPAWN_CRAY_XT /* This is always defined. Dunno why. */ #undef STATS /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Defined if we want this system to use SYSV shared memory */ #undef SYSV /* deprecated, use MSG_COMMS_TCGMSG */ #undef TCGMSG /* turn on thread safety */ #undef THREAD_SAFE /* TODO */ #undef USE_MALLOC /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* TODO */ #undef VAPI /* This is always defined. Dunno why. */ #undef VERIFY /* Version number of package */ #undef VERSION /* TODO */ #undef VIA /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* TODO */ #undef _REENTRANT /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as `fork' if `vfork' does not work. */ #undef vfork /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile ga-5-4/gaf2c/0000755000175000017500000000000012662210372011013 5ustar mbambaga-5-4/gaf2c/farg.F0000644000175000017500000000053412662210372012043 0ustar mbamba#if HAVE_CONFIG_H # include "config.fh" #endif integer function f2c_iargc() FXX_MODULE f2c_iargc = F77_IARGC() + 1 return end subroutine f2c_getarg( i, s ) FXX_MODULE integer i, l, ier character *(*) s F77_GETARG_DECL call F77_GETARG(F77_GETARG_ARGS) return end ga-5-4/gaf2c/gaf2c.c0000644000175000017500000000632312662210372012145 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STRING_H # include #endif #if HAVE_STDIO_H # include #endif #include "farg.h" #include "message.h" /** * Converts C strings to Fortran strings. * * @param cstring C buffer * @param fstring Fortran string * @param flength length of fstring */ void ga_c2fstring(char *cstring, char *fstring, int flength) { int clength = strlen(cstring); /* remove terminal \n character if any */ if(cstring[clength] == '\n') { clength--; } /* Truncate C string into Fortran string */ if (clength > flength) { clength = (int)flength; } /* Copy characters over */ flength -= clength; while (clength--) { *fstring++ = *cstring++; } /* Now terminate with blanks */ while (flength--) { *fstring++ = ' '; } } /** * Converts Fortran strings to C strings. * * Strip trailing blanks from fstring and copy it to cstring, * truncating if necessary to fit in cstring, and ensuring that * cstring is NUL-terminated. * * @param fstring Fortran string * @param flength length of fstring * @param cstring C buffer * @param clength max length (including NUL) of cstring */ void ga_f2cstring(char *fstring, int flength, char *cstring, int clength) { /* remove trailing blanks from fstring */ while (flength-- && fstring[flength] == ' ') ; /* the postdecrement above went one too far */ flength++; /* truncate fstring to cstring size */ if (flength >= clength) { flength = clength - 1; } /* ensure that cstring is NUL-terminated */ cstring[flength] = '\0'; /* copy fstring to cstring */ while (flength--) { cstring[flength] = fstring[flength]; } } void ga_f2c_get_cmd_args(int *argc, char ***argv) { Integer i=0; int iargc=F2C_IARGC(); char **iargv=NULL; if (iargc > F2C_GETARG_ARGV_MAX) { printf("ga_f2c_get_cmd_args: too many cmd line args"); armci_msg_abort(1); } iargv = (char**)malloc(sizeof(char*)*F2C_GETARG_ARGV_MAX); if (!iargv) { printf("ga_f2c_get_cmd_args: malloc iargv failed"); armci_msg_abort(1); } for (i=0; i #endif #include "typesf2c.h" #ifdef CRAY_YMP /** on YMP/J90 need to use thread safe version of rand */ static double ran(unsigned int flag) { static unsigned long seed = 76521; if(flag != 0) { seed = flag; } seed = seed *1812433253 + 12345; return ((double) (seed & 0x7fffffff)) * 4.6566128752458e-10; } #endif static DoublePrecision gai_drand_(Integer *flag) { #ifdef CRAY_YMP return ran((unsigned int)*flag); #else if (*flag) srandom((unsigned) *flag); return ((DoublePrecision) random()) * 4.6566128752458e-10; #endif } #define drand_ F77_FUNC(drand,DRAND) DoublePrecision drand_(Integer *flag) { return (gai_drand_(flag)); } ga-5-4/gaf2c/testarg.c0000644000175000017500000000117312662210372012632 0ustar mbamba#if HAVE_CONFIG_H # include "config.h" #endif #if HAVE_STDIO_H # include #endif /** @file * This checks the functioning of the include file gaf2cp.h. */ #include "farg.h" #include "typesf2c.h" #define ARGLIMIT 256 #define PARG_ F77_FUNC(parg,PARG) void PARG_() { Integer i; Integer limit = F2C_IARGC(); printf("argc=%d\n", (int)limit); for (i=0; i > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include "ga-papi.h" #include "typesf2c.h" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # now process the functions for name in sorted(functions): func = functions[name] maybe_return = '' if 'void' not in func.return_type: maybe_return = 'return ' func = functions[name] wnga_name = name.replace('pnga_','wnga_') print ''' %s { %s%s; } ''' % (func.get_signature(wnga_name), maybe_return, func.get_call()) ga-5-4/tools/fapi_header_gen.py0000755000175000017500000000737212662210462014637 0ustar mbamba#!/usr/bin/env python '''Generate the fapi.c source from the ga-papi.h header.''' import sys def get_signatures(header): # first, gather all function signatures from ga-papi.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: wapigen.py > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include "ga-papi.h" #include "typesf2c.h" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # now process the functions for name in sorted(functions): func = functions[name] maybe_return = '' if 'void' not in func.return_type: maybe_return = 'return ' func = functions[name] wnga_name = name.replace('pnga_','wnga_') print ''' %s { %s%s; } ''' % (func.get_signature(wnga_name), maybe_return, func.get_call()) ga-5-4/tools/ga-config.in0000644000175000017500000002305312662210462013356 0ustar mbamba#! /bin/sh # Generated from ga-config.in.m4sh by GNU Autoconf 2.69. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested="" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes break 2 fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset ## -------------------- ## ## Main body of script. ## ## -------------------- ## f77="@F77@" cc="@CC@" cppflags="@SCALAPACK_CPPFLAGS@ @LAPACK_CPPFLAGS@ @BLAS_CPPFLAGS@ @GA_MP_CPPFLAGS@ @ARMCI_NETWORK_CPPFLAGS@ -I@prefix@/include" cflags="@GA_COPT@" fflags="@GA_FOPT@ @FFLAG_INT@" fint="@FFLAG_INT@" ldflags="@SCALAPACK_LDFLAGS@ @LAPACK_LDFLAGS@ @BLAS_LDFLAGS@ @GA_MP_LDFLAGS@ @ARMCI_NETWORK_LDFLAGS@ -L@prefix@/lib" libs="-lga @SCALAPACK_LIBS@ @LAPACK_LIBS@ @BLAS_LIBS@ -larmci @GA_MP_LIBS@ @ARMCI_NETWORK_LIBS@" flibs="@FLIBS@" enable_f77_true="@ENABLE_F77_TRUE@" version="@PACKAGE_VERSION@" if test "x$enable_f77_true" = x; then : enable_f77=yes else enable_f77=no fi usage="Usage: ga-config [OPTIONS]... With the exception of --version and --help, all other options can be combined or run exclusively. Output is echoed to stdout. Options: --f77 --cc --cppflags --cflags --fflags --fint --ldflags --libs --flibs --enable-f77 --version --help " result= while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\(^=*\)='` ac_optarg=`expr "X$1" : 'X^=*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\(^=*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -help | --help | --hel | --he | -h ) $as_echo "$usage"; exit ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$version"; exit ;; -f77 | --f77) result="$result $f77" ;; -cc | --cc ) result="$result $cc" ;; -cppflags | --cppflags ) result="$result $cppflags" ;; -cflags | --cflags ) result="$result $cflags" ;; -fflags | --fflags ) result="$result $fflags" ;; -ldflags | --ldflags ) result="$result $ldflags" ;; -libs | --libs ) result="$result $libs" ;; -flibs | --flibs ) result="$result $flibs" ;; -fint | --fint ) result="$result $fint" ;; -enable-f77 | --enable-f77 ) result="$result $enable_f77" ;; # This is an error. *) $as_echo "unrecognized option: \`$1' Try \`$0 --help' for more information."; exit ;; esac shift done $as_echo "$result" | sed 's/ */ /g;s/" /"/g;s/ "/"/g;s/^ *//;s/ *$//' ga-5-4/tools/wapigen_trace.py0000755000175000017500000004143712662210462014367 0ustar mbamba#!/usr/bin/env python '''Generate the wapi_trace.c source from the ga-papi.h header.''' import sys def get_signatures(header): # first, gather all function signatures from ga-papi.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures format_from_type = { "char": "%c", "int": "%d", "long": "%ld", "long long": "%lld", "float": "%f", "double": "%lf", "Integer": "%ld", "logical": "%ld", } intp_names = [ 'lo', 'alo', 'blo', 'clo', 'hi', 'ahi', 'bhi', 'chi', 'subscript', 'dims', 'ld', 'width', 'chunk', 'map', 'block', ] class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() self.intp = ((self.pointer == 1 or self.array) and self.type == 'Integer' and self.name in intp_names) def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def args_have_nv(self): for arg in self.args: if arg.name == 'nv' and not arg.pointer: return True return False def args_have_ga(self): for arg in self.args: if arg.name == 'g_a' and not arg.pointer: return True return False def args_have_alpha(self): for arg in self.args: if arg.name == 'alpha': return True return False def args_have_beta(self): for arg in self.args: if arg.name == 'beta': return True return False def args_have_ndim(self): for arg in self.args: if 'ndim' in arg.name and not arg.pointer: return True return False def get_ndim_name(self): if 'set_irreg' in self.name: return 'pnga_set_data_last_ndim' else: for arg in self.args: if 'ndim' in arg.name and not arg.pointer: return arg.name return '_ndim' def args_have_intp(self): for arg in self.args: if arg.intp: return True return False def get_tracer_body(self): slot = 0 tracer = '' if self.args_have_intp() and 'set_irreg' not in self.name: if not self.args_have_ndim() and self.args_have_ga(): tracer += ' int _ndim = pnga_ndim(g_a);\n' if self.args_have_alpha(): tracer += ' Integer _atype;\n' if self.args_have_beta(): tracer += ' Integer _btype;\n' if self.args_have_alpha(): tracer += ' pnga_inquire_type(g_a, &_atype);\n' if self.args_have_beta(): tracer += ' pnga_inquire_type(g_b, &_btype);\n' if 'void' not in func.return_type: tracer += ' %s retval;\n' % self.return_type pf,slot = self.get_tracer_printf(False,slot) tracer += ' %s;\n' % pf tracer += ' ' if 'void' not in func.return_type: tracer += 'retval = ' tracer += '%s;\n' % self.get_call() pf,slot = self.get_tracer_printf(True,slot) tracer += ' %s;\n' % pf if 'void' not in func.return_type: tracer += ' return retval;\n' return tracer def get_tracer_printf(self, end, slot): tracer = 'fprintf(fptrace, "%lf,' if end: tracer += '/' tracer += self.name + ',' if self.args: tracer += '(' for arg in self.args: if arg.pointer == 1 and 'char' in arg.type: tracer += '%s;' elif arg.name == 'alpha' or arg.name == 'beta': tracer += '%s;' elif arg.intp: tracer += '%s;' elif arg.pointer or arg.array: tracer += '%p;' else: tracer += '%s;' % format_from_type[arg.type] tracer = tracer[:-1] tracer += ')' tracer += '\\n",MPI_Wtime()-first_wtime' if self.args: for arg in self.args: if arg.intp: #if self.args_have_nv(): # tracer += ',expand_intp(%s*nv,%s,%d)' % ( # self.get_ndim_name(), arg.name, slot) if 'map' in arg.name and 'locate_region' not in self.name: tracer += ',expand_intp(sum_intp(%s,block),%s,%d)' % ( self.get_ndim_name(), arg.name, slot) elif 'ld' in arg.name: tracer += ',expand_intp(%s-1,%s,%d)' % ( self.get_ndim_name(), arg.name, slot) else: tracer += ',expand_intp(%s,%s,%d)' % ( self.get_ndim_name(), arg.name, slot) slot += 1 elif 'alpha' in arg.name: tracer += ',expand_voidp(_atype,alpha,%d)' % slot slot += 1 elif 'beta' in arg.name: tracer += ',expand_voidp(_btype,beta,%d)' % slot slot += 1 else: tracer += ',%s' % arg.name tracer += ')' return tracer,slot def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: wapigen_trace.py > ' sys.exit(len(sys.argv)) # print headers and other static stuff print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include #include #include #include "ga-papi.h" #include "typesf2c.h" FILE *fptrace=NULL; double first_wtime; int me, nproc; MPI_Comm comm; #if HAVE_PROGNAME extern const char * PROGNAME; #endif #define LOHI_BUFSIZE 200 #define LOHI_SLOTS 20 static char **lohi_bufs; static int pnga_set_data_last_ndim=-1; static Integer sum_intp(int ndim, Integer *lohi) { Integer sum=0; assert(ndim>=0); if (NULL != lohi) { int i; for (i=0; i= 0 && slot < LOHI_SLOTS); str = lohi_bufs[slot]; current_str = str; if (NULL == value) { size_written = sprintf(current_str, "NULL"); total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } else { switch (type) { case C_INT: size_written = sprintf(current_str, "%d", *((int*)value)); break; case C_LONG: size_written = sprintf(current_str, "%ld", *((long*)value)); break; case C_LONGLONG:size_written = sprintf(current_str, "%lld", *((long long*)value)); break; case C_FLOAT: size_written = sprintf(current_str, "%f", *((float*)value)); break; case C_DBL: size_written = sprintf(current_str, "%lf", *((double*)value)); break; case C_SCPL: size_written = sprintf(current_str, "%f#%f", ((SingleComplex*)value)->real, ((SingleComplex*)value)->imag); break; case C_DCPL: size_written = sprintf(current_str, "%lf#%lf", ((DoubleComplex*)value)->real, ((DoubleComplex*)value)->imag); break; } total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } return str; } static char* expand_intp(int ndim, Integer *lohi, int slot) { char *str=NULL, *current_str=NULL; int i; int size_written; int total_written = 0; assert(ndim>=0); assert(slot >= 0 && slot < LOHI_SLOTS); str = lohi_bufs[slot]; current_str = str; if (NULL == lohi) { size_written = sprintf(current_str, "{NULL}"); total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } else if (0 == ndim) { size_written = sprintf(current_str, "{}"); total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } else { size_written = sprintf(current_str, "{%ld", lohi[0]); total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; for (i=1; i 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } size_written = sprintf(current_str, "}\\0"); total_written += size_written; assert(size_written > 0); assert(total_written < LOHI_BUFSIZE); current_str += size_written; } return str; } static void init_lohi_bufs() { int i; lohi_bufs = (char**)malloc(sizeof(char*)*LOHI_SLOTS); for (i=0; i) { if (/pnga_/) { chomp; s/^.*pnga_(.*)\(.*$/\1/; $big = uc $_; print "#define ga_${_}_ F77_FUNC_(ga_$_, GA_$big)\n"; print "#define ga_c${_}_ F77_FUNC_(ga_c$_,GA_C$big)\n"; print "#define ga_d${_}_ F77_FUNC_(ga_d$_,GA_D$big)\n"; print "#define ga_i${_}_ F77_FUNC_(ga_i$_,GA_I$big)\n"; print "#define ga_s${_}_ F77_FUNC_(ga_s$_,GA_S$big)\n"; print "#define ga_z${_}_ F77_FUNC_(ga_z$_,GA_Z$big)\n"; print "#define nga_${_}_ F77_FUNC_(nga_$_, NGA_$big)\n"; print "#define nga_c${_}_ F77_FUNC_(nga_c$_,NGA_C$big)\n"; print "#define nga_d${_}_ F77_FUNC_(nga_d$_,NGA_D$big)\n"; print "#define nga_i${_}_ F77_FUNC_(nga_i$_,NGA_I$big)\n"; print "#define nga_s${_}_ F77_FUNC_(nga_s$_,NGA_S$big)\n"; print "#define nga_z${_}_ F77_FUNC_(nga_z$_,NGA_Z$big)\n"; } } print "/* the missing functions are either complex type or strangely named */\n"; print "\n"; print "#define gai_cdot_patch_ F77_FUNC_(gai_cdot_patch,GAI_CDOT_PATCH)\n"; print "#define gai_zdot_patch_ F77_FUNC_(gai_zdot_patch,GAI_ZDOT_PATCH)\n"; print "#define ngai_cdot_patch_ F77_FUNC_(ngai_cdot_patch,NGAI_CDOT_PATCH)\n"; print "#define ngai_zdot_patch_ F77_FUNC_(ngai_zdot_patch,NGAI_ZDOT_PATCH)\n"; print "\n"; print "#define ga_cscal_patch_ F77_FUNC_(ga_cscal_patch,GA_CSCAL_PATCH)\n"; print "#define ga_dscal_patch_ F77_FUNC_(ga_dscal_patch,GA_DSCAL_PATCH)\n"; print "#define ga_iscal_patch_ F77_FUNC_(ga_iscal_patch,GA_ISCAL_PATCH)\n"; print "#define ga_sscal_patch_ F77_FUNC_(ga_sscal_patch,GA_SSCAL_PATCH)\n"; print "#define ga_zscal_patch_ F77_FUNC_(ga_zscal_patch,GA_ZSCAL_PATCH)\n"; print "\n"; print "#define ga_cscal_ F77_FUNC_(ga_cscal,GA_CSCAL)\n"; print "#define ga_dscal_ F77_FUNC_(ga_dscal,GA_DSCAL)\n"; print "#define ga_iscal_ F77_FUNC_(ga_iscal,GA_ISCAL)\n"; print "#define ga_sscal_ F77_FUNC_(ga_sscal,GA_SSCAL)\n"; print "#define ga_zscal_ F77_FUNC_(ga_zscal,GA_ZSCAL)\n"; print "\n"; print "#define gai_cdot_ F77_FUNC_(gai_cdot,GAI_CDOT)\n"; print "#define gai_zdot_ F77_FUNC_(gai_zdot,GAI_ZDOT)\n"; print "#define ngai_cdot_ F77_FUNC_(ngai_cdot,NGAI_CDOT)\n"; print "#define ngai_zdot_ F77_FUNC_(ngai_zdot,NGAI_ZDOT)\n"; print "\n"; print "#define ga_cgemm_ F77_FUNC_(ga_cgemm,GA_CGEMM)\n"; print "#define ga_dgemm_ F77_FUNC_(ga_dgemm,GA_DGEMM)\n"; print "#define ga_sgemm_ F77_FUNC_(ga_sgemm,GA_SGEMM)\n"; print "#define ga_zgemm_ F77_FUNC_(ga_zgemm,GA_ZGEMM)\n"; print "\n"; print "#define nga_periodic_get_ F77_FUNC_(nga_periodic_get,NGA_PERIODIC_GET)\n"; print "#define nga_periodic_put_ F77_FUNC_(nga_periodic_put,NGA_PERIODIC_PUT)\n"; print "#define nga_periodic_acc_ F77_FUNC_(nga_periodic_acc,NGA_PERIODIC_ACC)\n"; print "\n"; print "#define ga_access_ F77_FUNC_(ga_access,GA_ACCESS)\n"; print "#define nga_access_ F77_FUNC_(nga_access,NGA_ACCESS)\n"; print "#define nga_access_block_ F77_FUNC_(nga_access_block,NGA_ACCESS_BLOCK)\n"; print "#define nga_access_block_grid_ F77_FUNC_(nga_access_block_grid,NGA_ACCESS_BLOCK_GRID)\n"; print "#define nga_access_block_segment_ F77_FUNC_(nga_access_block_segment,NGA_ACCESS_BLOCK_SEGMENT)\n"; print "\n"; print "#define ga_pgroup_cgop_ F77_FUNC_(ga_pgroup_cgop,GA_PGROUP_CGOP)\n"; print "#define ga_pgroup_dgop_ F77_FUNC_(ga_pgroup_dgop,GA_PGROUP_DGOP)\n"; print "#define ga_pgroup_igop_ F77_FUNC_(ga_pgroup_igop,GA_PGROUP_IGOP)\n"; print "#define ga_pgroup_sgop_ F77_FUNC_(ga_pgroup_sgop,GA_PGROUP_SGOP)\n"; print "#define ga_pgroup_zgop_ F77_FUNC_(ga_pgroup_zgop,GA_PGROUP_ZGOP)\n"; print "\n"; print "#define nga_pgroup_cgop_ F77_FUNC_(nga_pgroup_cgop,NGA_PGROUP_CGOP)\n"; print "#define nga_pgroup_dgop_ F77_FUNC_(nga_pgroup_dgop,NGA_PGROUP_DGOP)\n"; print "#define nga_pgroup_igop_ F77_FUNC_(nga_pgroup_igop,NGA_PGROUP_IGOP)\n"; print "#define nga_pgroup_sgop_ F77_FUNC_(nga_pgroup_sgop,NGA_PGROUP_SGOP)\n"; print "#define nga_pgroup_zgop_ F77_FUNC_(nga_pgroup_zgop,NGA_PGROUP_ZGOP)\n"; ga-5-4/tools/gpwapigen.py0000755000175000017500000000740012662210462013530 0ustar mbamba#!/usr/bin/env python '''Generate the gp-wapi.c source from the gp-papi.h header.''' import sys def get_signatures(header): # first, gather all function signatures from gp-papi.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: gpwapigen.py > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include "gp-papi.h" #include "typesf2c.h" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # now process the functions for name in sorted(functions): func = functions[name] maybe_return = '' if 'void' not in func.return_type: maybe_return = 'return ' func = functions[name] wnga_name = name.replace('pgp_','wgp_') print ''' %s { %s%s; } ''' % (func.get_signature(wnga_name), maybe_return, func.get_call()) ga-5-4/tools/wapigen_timers.py0000755000175000017500000001523712662210462014573 0ustar mbamba#!/usr/bin/env python '''Generate the wapi_times.c source from the ga-papi.h header.''' import sys def get_signatures(header): # first, gather all function signatures from ga-papi.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: wapigen_counts.py > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include #include "ga-papi.h" #include "typesf2c.h" static MPI_Comm comm; static int me; static int nproc; static double global_start = 0; static double global_stop = 0; ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # for each function, generate a static count for name in sorted(functions): print 'static long count_%s = 0;' % name print '' # for each function, generate a static time for name in sorted(functions): print 'static double time_%s = 0;' % name print '' # now process the functions for name in sorted(functions): func = functions[name] if 'terminate' in name: continue if 'initialize' in name and 'initialized' not in name: continue func = functions[name] wnga_name = name.replace('pnga_','wnga_') if 'void' not in func.return_type: print ''' %s { %s return_value; double local_start, local_stop; ++count_%s; local_start = MPI_Wtime(); return_value = %s; local_stop = MPI_Wtime(); time_%s += local_stop - local_start; return return_value; } ''' % (func.get_signature(wnga_name), func.return_type, name, func.get_call(), name) else: print ''' %s { double local_start, local_stop; ++count_%s; local_start = MPI_Wtime(); %s; local_stop = MPI_Wtime(); time_%s += local_stop - local_start; } ''' % (func.get_signature(wnga_name), name, func.get_call(), name) # prepare to output the initialize function name = 'pnga_initialize' wnga_name = name.replace('pnga_','wnga_') func = functions[name] # output the initialize function print '''%s { ++count_pnga_initialize; global_start = MPI_Wtime(); %s; MPI_Comm_dup(GA_MPI_Comm(), &comm); MPI_Comm_rank(comm, &me); MPI_Comm_size(comm, &nproc); } ''' % (func.get_signature(wnga_name), func.get_call()) # prepare to output the initialize_ltd function name = 'pnga_initialize_ltd' wnga_name = name.replace('pnga_','wnga_') func = functions[name] # output the initialize_ltd function print '''%s { ++count_pnga_initialize_ltd; global_start = MPI_Wtime(); %s; MPI_Comm_dup(GA_MPI_Comm(), &comm); MPI_Comm_rank(comm, &me); MPI_Comm_size(comm, &nproc); } ''' % (func.get_signature(wnga_name), func.get_call()) # prepare to output the terminate function name = 'pnga_terminate' wnga_name = name.replace('pnga_','wnga_') func = functions[name] the_code = '' # establish 'the_code' to use in the body of terminate # it's printing the count of each function if it was called at least once the_code += ''' double recvbuf = 0.0; ''' for name in sorted(functions): the_code += ''' MPI_Reduce(&time_%s, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, comm); if (me == 0) { printf("%s,%%ld,%%lf\\n", count_%s, recvbuf); } ''' % (name, name, name) # output the terminate function print '''%s { ++count_pnga_terminate; %s; global_stop = MPI_Wtime(); /* don't dump info if terminate more than once */ if (1 == count_pnga_terminate) { %s if (me == 0) { printf("global_stop-global_start,0,%%lf\\n", global_stop-global_start); } } MPI_Comm_free(&comm); } ''' % (func.get_signature(wnga_name), func.get_call(), the_code) ga-5-4/tools/ga-wapi.c0000644000175000017500000046215312662210462012675 0ustar mbamba #if HAVE_CONFIG_H # include "config.h" #endif #include #include "ga-papi.h" #include "typesf2c.h" static int me; static int nproc; static long count_pnga_abs_value = 0; static long count_pnga_abs_value_patch = 0; static long count_pnga_acc = 0; static long count_pnga_access_block_grid_idx = 0; static long count_pnga_access_block_grid_ptr = 0; static long count_pnga_access_block_idx = 0; static long count_pnga_access_block_ptr = 0; static long count_pnga_access_block_segment_idx = 0; static long count_pnga_access_block_segment_ptr = 0; static long count_pnga_access_ghost_element = 0; static long count_pnga_access_ghost_element_ptr = 0; static long count_pnga_access_ghost_ptr = 0; static long count_pnga_access_ghosts = 0; static long count_pnga_access_idx = 0; static long count_pnga_access_ptr = 0; static long count_pnga_add = 0; static long count_pnga_add_constant = 0; static long count_pnga_add_constant_patch = 0; static long count_pnga_add_diagonal = 0; static long count_pnga_add_patch = 0; static long count_pnga_allocate = 0; static long count_pnga_bin_index = 0; static long count_pnga_bin_sorter = 0; static long count_pnga_brdcst = 0; static long count_pnga_check_handle = 0; static long count_pnga_cluster_nnodes = 0; static long count_pnga_cluster_nodeid = 0; static long count_pnga_cluster_nprocs = 0; static long count_pnga_cluster_proc_nodeid = 0; static long count_pnga_cluster_procid = 0; static long count_pnga_comp_patch = 0; static long count_pnga_compare_distr = 0; static long count_pnga_copy = 0; static long count_pnga_copy_patch = 0; static long count_pnga_copy_patch_dp = 0; static long count_pnga_create = 0; static long count_pnga_create_bin_range = 0; static long count_pnga_create_config = 0; static long count_pnga_create_ghosts = 0; static long count_pnga_create_ghosts_config = 0; static long count_pnga_create_ghosts_irreg = 0; static long count_pnga_create_ghosts_irreg_config = 0; static long count_pnga_create_handle = 0; static long count_pnga_create_irreg = 0; static long count_pnga_create_irreg_config = 0; static long count_pnga_create_mutexes = 0; static long count_pnga_ddot_patch_dp = 0; static long count_pnga_deregister_type = 0; static long count_pnga_destroy = 0; static long count_pnga_destroy_mutexes = 0; static long count_pnga_diag = 0; static long count_pnga_diag_reuse = 0; static long count_pnga_diag_seq = 0; static long count_pnga_diag_std = 0; static long count_pnga_diag_std_seq = 0; static long count_pnga_distribution = 0; static long count_pnga_dot = 0; static long count_pnga_dot_patch = 0; static long count_pnga_duplicate = 0; static long count_pnga_elem_divide = 0; static long count_pnga_elem_divide_patch = 0; static long count_pnga_elem_maximum = 0; static long count_pnga_elem_maximum_patch = 0; static long count_pnga_elem_minimum = 0; static long count_pnga_elem_minimum_patch = 0; static long count_pnga_elem_multiply = 0; static long count_pnga_elem_multiply_patch = 0; static long count_pnga_elem_step_divide_patch = 0; static long count_pnga_elem_stepb_divide_patch = 0; static long count_pnga_error = 0; static long count_pnga_fence = 0; static long count_pnga_fill = 0; static long count_pnga_fill_patch = 0; static long count_pnga_gather = 0; static long count_pnga_gather2d = 0; static long count_pnga_get = 0; static long count_pnga_get_block_info = 0; static long count_pnga_get_debug = 0; static long count_pnga_get_diag = 0; static long count_pnga_get_dimension = 0; static long count_pnga_get_field = 0; static long count_pnga_get_ghost_block = 0; static long count_pnga_get_pgroup = 0; static long count_pnga_get_pgroup_size = 0; static long count_pnga_get_proc_grid = 0; static long count_pnga_get_proc_index = 0; static long count_pnga_ghost_barrier = 0; static long count_pnga_gop = 0; static long count_pnga_has_ghosts = 0; static long count_pnga_init_fence = 0; static long count_pnga_initialize = 0; static long count_pnga_initialize_ltd = 0; static long count_pnga_inquire = 0; static long count_pnga_inquire_memory = 0; static long count_pnga_inquire_name = 0; static long count_pnga_inquire_type = 0; static long count_pnga_is_mirrored = 0; static long count_pnga_list_nodeid = 0; static long count_pnga_llt_solve = 0; static long count_pnga_locate = 0; static long count_pnga_locate_nnodes = 0; static long count_pnga_locate_num_blocks = 0; static long count_pnga_locate_region = 0; static long count_pnga_lock = 0; static long count_pnga_lu_solve = 0; static long count_pnga_lu_solve_alt = 0; static long count_pnga_lu_solve_seq = 0; static long count_pnga_mask_sync = 0; static long count_pnga_matmul = 0; static long count_pnga_matmul_mirrored = 0; static long count_pnga_matmul_patch = 0; static long count_pnga_median = 0; static long count_pnga_median_patch = 0; static long count_pnga_memory_avail = 0; static long count_pnga_memory_avail_type = 0; static long count_pnga_memory_limited = 0; static long count_pnga_merge_distr_patch = 0; static long count_pnga_merge_mirrored = 0; static long count_pnga_msg_brdcst = 0; static long count_pnga_msg_pgroup_sync = 0; static long count_pnga_msg_sync = 0; static long count_pnga_nbacc = 0; static long count_pnga_nbget = 0; static long count_pnga_nbget_field = 0; static long count_pnga_nbget_ghost_dir = 0; static long count_pnga_nblock = 0; static long count_pnga_nbput = 0; static long count_pnga_nbput_field = 0; static long count_pnga_nbtest = 0; static long count_pnga_nbwait = 0; static long count_pnga_ndim = 0; static long count_pnga_nnodes = 0; static long count_pnga_nodeid = 0; static long count_pnga_norm1 = 0; static long count_pnga_norm_infinity = 0; static long count_pnga_pack = 0; static long count_pnga_patch_enum = 0; static long count_pnga_patch_intersect = 0; static long count_pnga_periodic = 0; static long count_pnga_pgroup_absolute_id = 0; static long count_pnga_pgroup_brdcst = 0; static long count_pnga_pgroup_create = 0; static long count_pnga_pgroup_destroy = 0; static long count_pnga_pgroup_get_default = 0; static long count_pnga_pgroup_get_mirror = 0; static long count_pnga_pgroup_get_world = 0; static long count_pnga_pgroup_gop = 0; static long count_pnga_pgroup_nnodes = 0; static long count_pnga_pgroup_nodeid = 0; static long count_pnga_pgroup_set_default = 0; static long count_pnga_pgroup_split = 0; static long count_pnga_pgroup_split_irreg = 0; static long count_pnga_pgroup_sync = 0; static long count_pnga_print = 0; static long count_pnga_print_distribution = 0; static long count_pnga_print_file = 0; static long count_pnga_print_patch = 0; static long count_pnga_print_patch2d = 0; static long count_pnga_print_patch_file = 0; static long count_pnga_print_patch_file2d = 0; static long count_pnga_print_stats = 0; static long count_pnga_proc_topology = 0; static long count_pnga_put = 0; static long count_pnga_put_field = 0; static long count_pnga_randomize = 0; static long count_pnga_read_inc = 0; static long count_pnga_recip = 0; static long count_pnga_recip_patch = 0; static long count_pnga_register_type = 0; static long count_pnga_release = 0; static long count_pnga_release_block = 0; static long count_pnga_release_block_grid = 0; static long count_pnga_release_block_segment = 0; static long count_pnga_release_ghost_element = 0; static long count_pnga_release_ghosts = 0; static long count_pnga_release_update = 0; static long count_pnga_release_update_block = 0; static long count_pnga_release_update_block_grid = 0; static long count_pnga_release_update_block_segment = 0; static long count_pnga_release_update_ghost_element = 0; static long count_pnga_release_update_ghosts = 0; static long count_pnga_scale = 0; static long count_pnga_scale_cols = 0; static long count_pnga_scale_patch = 0; static long count_pnga_scale_rows = 0; static long count_pnga_scan_add = 0; static long count_pnga_scan_copy = 0; static long count_pnga_scatter = 0; static long count_pnga_scatter2d = 0; static long count_pnga_scatter_acc = 0; static long count_pnga_scatter_acc2d = 0; static long count_pnga_select_elem = 0; static long count_pnga_set_array_name = 0; static long count_pnga_set_block_cyclic = 0; static long count_pnga_set_block_cyclic_proc_grid = 0; static long count_pnga_set_chunk = 0; static long count_pnga_set_data = 0; static long count_pnga_set_debug = 0; static long count_pnga_set_diagonal = 0; static long count_pnga_set_ghost_corner_flag = 0; static long count_pnga_set_ghost_info = 0; static long count_pnga_set_ghosts = 0; static long count_pnga_set_irreg_distr = 0; static long count_pnga_set_irreg_flag = 0; static long count_pnga_set_memory_limit = 0; static long count_pnga_set_pgroup = 0; static long count_pnga_set_restricted = 0; static long count_pnga_set_restricted_range = 0; static long count_pnga_set_update4_info = 0; static long count_pnga_set_update5_info = 0; static long count_pnga_shift_diagonal = 0; static long count_pnga_solve = 0; static long count_pnga_spd_invert = 0; static long count_pnga_step_bound_info = 0; static long count_pnga_step_bound_info_patch = 0; static long count_pnga_step_mask_patch = 0; static long count_pnga_step_max = 0; static long count_pnga_step_max_patch = 0; static long count_pnga_strided_acc = 0; static long count_pnga_strided_get = 0; static long count_pnga_strided_put = 0; static long count_pnga_summarize = 0; static long count_pnga_symmetrize = 0; static long count_pnga_sync = 0; static long count_pnga_terminate = 0; static long count_pnga_timer = 0; static long count_pnga_total_blocks = 0; static long count_pnga_transpose = 0; static long count_pnga_type_c2f = 0; static long count_pnga_type_f2c = 0; static long count_pnga_unlock = 0; static long count_pnga_unpack = 0; static long count_pnga_update1_ghosts = 0; static long count_pnga_update2_ghosts = 0; static long count_pnga_update3_ghosts = 0; static long count_pnga_update44_ghosts = 0; static long count_pnga_update4_ghosts = 0; static long count_pnga_update55_ghosts = 0; static long count_pnga_update5_ghosts = 0; static long count_pnga_update6_ghosts = 0; static long count_pnga_update7_ghosts = 0; static long count_pnga_update_ghost_dir = 0; static long count_pnga_update_ghosts = 0; static long count_pnga_uses_ma = 0; static long count_pnga_uses_proc_grid = 0; static long count_pnga_valid_handle = 0; static long count_pnga_verify_handle = 0; static long count_pnga_wtime = 0; static long count_pnga_zero = 0; static long count_pnga_zero_diagonal = 0; static long count_pnga_zero_patch = 0; static double time_pnga_abs_value = 0; static double time_pnga_abs_value_patch = 0; static double time_pnga_acc = 0; static double time_pnga_access_block_grid_idx = 0; static double time_pnga_access_block_grid_ptr = 0; static double time_pnga_access_block_idx = 0; static double time_pnga_access_block_ptr = 0; static double time_pnga_access_block_segment_idx = 0; static double time_pnga_access_block_segment_ptr = 0; static double time_pnga_access_ghost_element = 0; static double time_pnga_access_ghost_element_ptr = 0; static double time_pnga_access_ghost_ptr = 0; static double time_pnga_access_ghosts = 0; static double time_pnga_access_idx = 0; static double time_pnga_access_ptr = 0; static double time_pnga_add = 0; static double time_pnga_add_constant = 0; static double time_pnga_add_constant_patch = 0; static double time_pnga_add_diagonal = 0; static double time_pnga_add_patch = 0; static double time_pnga_allocate = 0; static double time_pnga_bin_index = 0; static double time_pnga_bin_sorter = 0; static double time_pnga_brdcst = 0; static double time_pnga_check_handle = 0; static double time_pnga_cluster_nnodes = 0; static double time_pnga_cluster_nodeid = 0; static double time_pnga_cluster_nprocs = 0; static double time_pnga_cluster_proc_nodeid = 0; static double time_pnga_cluster_procid = 0; static double time_pnga_comp_patch = 0; static double time_pnga_compare_distr = 0; static double time_pnga_copy = 0; static double time_pnga_copy_patch = 0; static double time_pnga_copy_patch_dp = 0; static double time_pnga_create = 0; static double time_pnga_create_bin_range = 0; static double time_pnga_create_config = 0; static double time_pnga_create_ghosts = 0; static double time_pnga_create_ghosts_config = 0; static double time_pnga_create_ghosts_irreg = 0; static double time_pnga_create_ghosts_irreg_config = 0; static double time_pnga_create_handle = 0; static double time_pnga_create_irreg = 0; static double time_pnga_create_irreg_config = 0; static double time_pnga_create_mutexes = 0; static double time_pnga_ddot_patch_dp = 0; static double time_pnga_deregister_type = 0; static double time_pnga_destroy = 0; static double time_pnga_destroy_mutexes = 0; static double time_pnga_diag = 0; static double time_pnga_diag_reuse = 0; static double time_pnga_diag_seq = 0; static double time_pnga_diag_std = 0; static double time_pnga_diag_std_seq = 0; static double time_pnga_distribution = 0; static double time_pnga_dot = 0; static double time_pnga_dot_patch = 0; static double time_pnga_duplicate = 0; static double time_pnga_elem_divide = 0; static double time_pnga_elem_divide_patch = 0; static double time_pnga_elem_maximum = 0; static double time_pnga_elem_maximum_patch = 0; static double time_pnga_elem_minimum = 0; static double time_pnga_elem_minimum_patch = 0; static double time_pnga_elem_multiply = 0; static double time_pnga_elem_multiply_patch = 0; static double time_pnga_elem_step_divide_patch = 0; static double time_pnga_elem_stepb_divide_patch = 0; static double time_pnga_error = 0; static double time_pnga_fence = 0; static double time_pnga_fill = 0; static double time_pnga_fill_patch = 0; static double time_pnga_gather = 0; static double time_pnga_gather2d = 0; static double time_pnga_get = 0; static double time_pnga_get_block_info = 0; static double time_pnga_get_debug = 0; static double time_pnga_get_diag = 0; static double time_pnga_get_dimension = 0; static double time_pnga_get_field = 0; static double time_pnga_get_ghost_block = 0; static double time_pnga_get_pgroup = 0; static double time_pnga_get_pgroup_size = 0; static double time_pnga_get_proc_grid = 0; static double time_pnga_get_proc_index = 0; static double time_pnga_ghost_barrier = 0; static double time_pnga_gop = 0; static double time_pnga_has_ghosts = 0; static double time_pnga_init_fence = 0; static double time_pnga_initialize = 0; static double time_pnga_initialize_ltd = 0; static double time_pnga_inquire = 0; static double time_pnga_inquire_memory = 0; static double time_pnga_inquire_name = 0; static double time_pnga_inquire_type = 0; static double time_pnga_is_mirrored = 0; static double time_pnga_list_nodeid = 0; static double time_pnga_llt_solve = 0; static double time_pnga_locate = 0; static double time_pnga_locate_nnodes = 0; static double time_pnga_locate_num_blocks = 0; static double time_pnga_locate_region = 0; static double time_pnga_lock = 0; static double time_pnga_lu_solve = 0; static double time_pnga_lu_solve_alt = 0; static double time_pnga_lu_solve_seq = 0; static double time_pnga_mask_sync = 0; static double time_pnga_matmul = 0; static double time_pnga_matmul_mirrored = 0; static double time_pnga_matmul_patch = 0; static double time_pnga_median = 0; static double time_pnga_median_patch = 0; static double time_pnga_memory_avail = 0; static double time_pnga_memory_avail_type = 0; static double time_pnga_memory_limited = 0; static double time_pnga_merge_distr_patch = 0; static double time_pnga_merge_mirrored = 0; static double time_pnga_msg_brdcst = 0; static double time_pnga_msg_pgroup_sync = 0; static double time_pnga_msg_sync = 0; static double time_pnga_nbacc = 0; static double time_pnga_nbget = 0; static double time_pnga_nbget_field = 0; static double time_pnga_nbget_ghost_dir = 0; static double time_pnga_nblock = 0; static double time_pnga_nbput = 0; static double time_pnga_nbput_field = 0; static double time_pnga_nbtest = 0; static double time_pnga_nbwait = 0; static double time_pnga_ndim = 0; static double time_pnga_nnodes = 0; static double time_pnga_nodeid = 0; static double time_pnga_norm1 = 0; static double time_pnga_norm_infinity = 0; static double time_pnga_pack = 0; static double time_pnga_patch_enum = 0; static double time_pnga_patch_intersect = 0; static double time_pnga_periodic = 0; static double time_pnga_pgroup_absolute_id = 0; static double time_pnga_pgroup_brdcst = 0; static double time_pnga_pgroup_create = 0; static double time_pnga_pgroup_destroy = 0; static double time_pnga_pgroup_get_default = 0; static double time_pnga_pgroup_get_mirror = 0; static double time_pnga_pgroup_get_world = 0; static double time_pnga_pgroup_gop = 0; static double time_pnga_pgroup_nnodes = 0; static double time_pnga_pgroup_nodeid = 0; static double time_pnga_pgroup_set_default = 0; static double time_pnga_pgroup_split = 0; static double time_pnga_pgroup_split_irreg = 0; static double time_pnga_pgroup_sync = 0; static double time_pnga_print = 0; static double time_pnga_print_distribution = 0; static double time_pnga_print_file = 0; static double time_pnga_print_patch = 0; static double time_pnga_print_patch2d = 0; static double time_pnga_print_patch_file = 0; static double time_pnga_print_patch_file2d = 0; static double time_pnga_print_stats = 0; static double time_pnga_proc_topology = 0; static double time_pnga_put = 0; static double time_pnga_put_field = 0; static double time_pnga_randomize = 0; static double time_pnga_read_inc = 0; static double time_pnga_recip = 0; static double time_pnga_recip_patch = 0; static double time_pnga_register_type = 0; static double time_pnga_release = 0; static double time_pnga_release_block = 0; static double time_pnga_release_block_grid = 0; static double time_pnga_release_block_segment = 0; static double time_pnga_release_ghost_element = 0; static double time_pnga_release_ghosts = 0; static double time_pnga_release_update = 0; static double time_pnga_release_update_block = 0; static double time_pnga_release_update_block_grid = 0; static double time_pnga_release_update_block_segment = 0; static double time_pnga_release_update_ghost_element = 0; static double time_pnga_release_update_ghosts = 0; static double time_pnga_scale = 0; static double time_pnga_scale_cols = 0; static double time_pnga_scale_patch = 0; static double time_pnga_scale_rows = 0; static double time_pnga_scan_add = 0; static double time_pnga_scan_copy = 0; static double time_pnga_scatter = 0; static double time_pnga_scatter2d = 0; static double time_pnga_scatter_acc = 0; static double time_pnga_scatter_acc2d = 0; static double time_pnga_select_elem = 0; static double time_pnga_set_array_name = 0; static double time_pnga_set_block_cyclic = 0; static double time_pnga_set_block_cyclic_proc_grid = 0; static double time_pnga_set_chunk = 0; static double time_pnga_set_data = 0; static double time_pnga_set_debug = 0; static double time_pnga_set_diagonal = 0; static double time_pnga_set_ghost_corner_flag = 0; static double time_pnga_set_ghost_info = 0; static double time_pnga_set_ghosts = 0; static double time_pnga_set_irreg_distr = 0; static double time_pnga_set_irreg_flag = 0; static double time_pnga_set_memory_limit = 0; static double time_pnga_set_pgroup = 0; static double time_pnga_set_restricted = 0; static double time_pnga_set_restricted_range = 0; static double time_pnga_set_update4_info = 0; static double time_pnga_set_update5_info = 0; static double time_pnga_shift_diagonal = 0; static double time_pnga_solve = 0; static double time_pnga_spd_invert = 0; static double time_pnga_step_bound_info = 0; static double time_pnga_step_bound_info_patch = 0; static double time_pnga_step_mask_patch = 0; static double time_pnga_step_max = 0; static double time_pnga_step_max_patch = 0; static double time_pnga_strided_acc = 0; static double time_pnga_strided_get = 0; static double time_pnga_strided_put = 0; static double time_pnga_summarize = 0; static double time_pnga_symmetrize = 0; static double time_pnga_sync = 0; static double time_pnga_terminate = 0; static double time_pnga_timer = 0; static double time_pnga_total_blocks = 0; static double time_pnga_transpose = 0; static double time_pnga_type_c2f = 0; static double time_pnga_type_f2c = 0; static double time_pnga_unlock = 0; static double time_pnga_unpack = 0; static double time_pnga_update1_ghosts = 0; static double time_pnga_update2_ghosts = 0; static double time_pnga_update3_ghosts = 0; static double time_pnga_update44_ghosts = 0; static double time_pnga_update4_ghosts = 0; static double time_pnga_update55_ghosts = 0; static double time_pnga_update5_ghosts = 0; static double time_pnga_update6_ghosts = 0; static double time_pnga_update7_ghosts = 0; static double time_pnga_update_ghost_dir = 0; static double time_pnga_update_ghosts = 0; static double time_pnga_uses_ma = 0; static double time_pnga_uses_proc_grid = 0; static double time_pnga_valid_handle = 0; static double time_pnga_verify_handle = 0; static double time_pnga_wtime = 0; static double time_pnga_zero = 0; static double time_pnga_zero_diagonal = 0; static double time_pnga_zero_patch = 0; void wnga_abs_value(Integer g_a) { double local_start, local_stop; ++count_pnga_abs_value; local_start = MPI_Wtime(); pnga_abs_value(g_a); local_stop = MPI_Wtime(); time_pnga_abs_value += local_stop - local_start; } void wnga_abs_value_patch(Integer g_a, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_abs_value_patch; local_start = MPI_Wtime(); pnga_abs_value_patch(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_abs_value_patch += local_stop - local_start; } void wnga_acc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha) { double local_start, local_stop; ++count_pnga_acc; local_start = MPI_Wtime(); pnga_acc(g_a, lo, hi, buf, ld, alpha); local_stop = MPI_Wtime(); time_pnga_acc += local_stop - local_start; } void wnga_access_block_grid_idx(Integer g_a, Integer *subscript, AccessIndex *index, Integer *ld) { double local_start, local_stop; ++count_pnga_access_block_grid_idx; local_start = MPI_Wtime(); pnga_access_block_grid_idx(g_a, subscript, index, ld); local_stop = MPI_Wtime(); time_pnga_access_block_grid_idx += local_stop - local_start; } void wnga_access_block_grid_ptr(Integer g_a, Integer *index, void *ptr, Integer *ld) { double local_start, local_stop; ++count_pnga_access_block_grid_ptr; local_start = MPI_Wtime(); pnga_access_block_grid_ptr(g_a, index, ptr, ld); local_stop = MPI_Wtime(); time_pnga_access_block_grid_ptr += local_stop - local_start; } void wnga_access_block_idx(Integer g_a, Integer idx, AccessIndex *index, Integer *ld) { double local_start, local_stop; ++count_pnga_access_block_idx; local_start = MPI_Wtime(); pnga_access_block_idx(g_a, idx, index, ld); local_stop = MPI_Wtime(); time_pnga_access_block_idx += local_stop - local_start; } void wnga_access_block_ptr(Integer g_a, Integer idx, void *ptr, Integer *ld) { double local_start, local_stop; ++count_pnga_access_block_ptr; local_start = MPI_Wtime(); pnga_access_block_ptr(g_a, idx, ptr, ld); local_stop = MPI_Wtime(); time_pnga_access_block_ptr += local_stop - local_start; } void wnga_access_block_segment_idx(Integer g_a, Integer proc, AccessIndex *index, Integer *len) { double local_start, local_stop; ++count_pnga_access_block_segment_idx; local_start = MPI_Wtime(); pnga_access_block_segment_idx(g_a, proc, index, len); local_stop = MPI_Wtime(); time_pnga_access_block_segment_idx += local_stop - local_start; } void wnga_access_block_segment_ptr(Integer g_a, Integer proc, void *ptr, Integer *len) { double local_start, local_stop; ++count_pnga_access_block_segment_ptr; local_start = MPI_Wtime(); pnga_access_block_segment_ptr(g_a, proc, ptr, len); local_stop = MPI_Wtime(); time_pnga_access_block_segment_ptr += local_stop - local_start; } void wnga_access_ghost_element(Integer g_a, AccessIndex *index, Integer subscript[], Integer ld[]) { double local_start, local_stop; ++count_pnga_access_ghost_element; local_start = MPI_Wtime(); pnga_access_ghost_element(g_a, index, subscript, ld); local_stop = MPI_Wtime(); time_pnga_access_ghost_element += local_stop - local_start; } void wnga_access_ghost_element_ptr(Integer g_a, void *ptr, Integer subscript[], Integer ld[]) { double local_start, local_stop; ++count_pnga_access_ghost_element_ptr; local_start = MPI_Wtime(); pnga_access_ghost_element_ptr(g_a, ptr, subscript, ld); local_stop = MPI_Wtime(); time_pnga_access_ghost_element_ptr += local_stop - local_start; } void wnga_access_ghost_ptr(Integer g_a, Integer dims[], void *ptr, Integer ld[]) { double local_start, local_stop; ++count_pnga_access_ghost_ptr; local_start = MPI_Wtime(); pnga_access_ghost_ptr(g_a, dims, ptr, ld); local_stop = MPI_Wtime(); time_pnga_access_ghost_ptr += local_stop - local_start; } void wnga_access_ghosts(Integer g_a, Integer dims[], AccessIndex *index, Integer ld[]) { double local_start, local_stop; ++count_pnga_access_ghosts; local_start = MPI_Wtime(); pnga_access_ghosts(g_a, dims, index, ld); local_stop = MPI_Wtime(); time_pnga_access_ghosts += local_stop - local_start; } void wnga_access_idx(Integer g_a, Integer *lo, Integer *hi, AccessIndex *index, Integer *ld) { double local_start, local_stop; ++count_pnga_access_idx; local_start = MPI_Wtime(); pnga_access_idx(g_a, lo, hi, index, ld); local_stop = MPI_Wtime(); time_pnga_access_idx += local_stop - local_start; } void wnga_access_ptr(Integer g_a, Integer *lo, Integer *hi, void *ptr, Integer *ld) { double local_start, local_stop; ++count_pnga_access_ptr; local_start = MPI_Wtime(); pnga_access_ptr(g_a, lo, hi, ptr, ld); local_stop = MPI_Wtime(); time_pnga_access_ptr += local_stop - local_start; } void wnga_add(void *alpha, Integer g_a, void *beta, Integer g_b, Integer g_c) { double local_start, local_stop; ++count_pnga_add; local_start = MPI_Wtime(); pnga_add(alpha, g_a, beta, g_b, g_c); local_stop = MPI_Wtime(); time_pnga_add += local_stop - local_start; } void wnga_add_constant(Integer g_a, void *alpha) { double local_start, local_stop; ++count_pnga_add_constant; local_start = MPI_Wtime(); pnga_add_constant(g_a, alpha); local_stop = MPI_Wtime(); time_pnga_add_constant += local_stop - local_start; } void wnga_add_constant_patch(Integer g_a, Integer *lo, Integer *hi, void *alpha) { double local_start, local_stop; ++count_pnga_add_constant_patch; local_start = MPI_Wtime(); pnga_add_constant_patch(g_a, lo, hi, alpha); local_stop = MPI_Wtime(); time_pnga_add_constant_patch += local_stop - local_start; } void wnga_add_diagonal(Integer g_a, Integer g_v) { double local_start, local_stop; ++count_pnga_add_diagonal; local_start = MPI_Wtime(); pnga_add_diagonal(g_a, g_v); local_stop = MPI_Wtime(); time_pnga_add_diagonal += local_stop - local_start; } void wnga_add_patch(void *alpha, Integer g_a, Integer *alo, Integer *ahi, void *beta, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_add_patch; local_start = MPI_Wtime(); pnga_add_patch(alpha, g_a, alo, ahi, beta, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_add_patch += local_stop - local_start; } logical wnga_allocate(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_allocate; local_start = MPI_Wtime(); return_value = pnga_allocate(g_a); local_stop = MPI_Wtime(); time_pnga_allocate += local_stop - local_start; return return_value; } void wnga_bin_index(Integer g_bin, Integer g_cnt, Integer g_off, Integer *values, Integer *subs, Integer n, Integer sortit) { double local_start, local_stop; ++count_pnga_bin_index; local_start = MPI_Wtime(); pnga_bin_index(g_bin, g_cnt, g_off, values, subs, n, sortit); local_stop = MPI_Wtime(); time_pnga_bin_index += local_stop - local_start; } void wnga_bin_sorter(Integer g_bin, Integer g_cnt, Integer g_off) { double local_start, local_stop; ++count_pnga_bin_sorter; local_start = MPI_Wtime(); pnga_bin_sorter(g_bin, g_cnt, g_off); local_stop = MPI_Wtime(); time_pnga_bin_sorter += local_stop - local_start; } void wnga_brdcst(Integer type, void *buf, Integer len, Integer originator) { double local_start, local_stop; ++count_pnga_brdcst; local_start = MPI_Wtime(); pnga_brdcst(type, buf, len, originator); local_stop = MPI_Wtime(); time_pnga_brdcst += local_stop - local_start; } void wnga_check_handle(Integer g_a, char *string) { double local_start, local_stop; ++count_pnga_check_handle; local_start = MPI_Wtime(); pnga_check_handle(g_a, string); local_stop = MPI_Wtime(); time_pnga_check_handle += local_stop - local_start; } Integer wnga_cluster_nnodes() { Integer return_value; double local_start, local_stop; ++count_pnga_cluster_nnodes; local_start = MPI_Wtime(); return_value = pnga_cluster_nnodes(); local_stop = MPI_Wtime(); time_pnga_cluster_nnodes += local_stop - local_start; return return_value; } Integer wnga_cluster_nodeid() { Integer return_value; double local_start, local_stop; ++count_pnga_cluster_nodeid; local_start = MPI_Wtime(); return_value = pnga_cluster_nodeid(); local_stop = MPI_Wtime(); time_pnga_cluster_nodeid += local_stop - local_start; return return_value; } Integer wnga_cluster_nprocs(Integer node) { Integer return_value; double local_start, local_stop; ++count_pnga_cluster_nprocs; local_start = MPI_Wtime(); return_value = pnga_cluster_nprocs(node); local_stop = MPI_Wtime(); time_pnga_cluster_nprocs += local_stop - local_start; return return_value; } Integer wnga_cluster_proc_nodeid(Integer proc) { Integer return_value; double local_start, local_stop; ++count_pnga_cluster_proc_nodeid; local_start = MPI_Wtime(); return_value = pnga_cluster_proc_nodeid(proc); local_stop = MPI_Wtime(); time_pnga_cluster_proc_nodeid += local_stop - local_start; return return_value; } Integer wnga_cluster_procid(Integer node, Integer loc_proc_id) { Integer return_value; double local_start, local_stop; ++count_pnga_cluster_procid; local_start = MPI_Wtime(); return_value = pnga_cluster_procid(node, loc_proc_id); local_stop = MPI_Wtime(); time_pnga_cluster_procid += local_stop - local_start; return return_value; } logical wnga_comp_patch(Integer andim, Integer *alo, Integer *ahi, Integer bndim, Integer *blo, Integer *bhi) { logical return_value; double local_start, local_stop; ++count_pnga_comp_patch; local_start = MPI_Wtime(); return_value = pnga_comp_patch(andim, alo, ahi, bndim, blo, bhi); local_stop = MPI_Wtime(); time_pnga_comp_patch += local_stop - local_start; return return_value; } logical wnga_compare_distr(Integer g_a, Integer g_b) { logical return_value; double local_start, local_stop; ++count_pnga_compare_distr; local_start = MPI_Wtime(); return_value = pnga_compare_distr(g_a, g_b); local_stop = MPI_Wtime(); time_pnga_compare_distr += local_stop - local_start; return return_value; } void wnga_copy(Integer g_a, Integer g_b) { double local_start, local_stop; ++count_pnga_copy; local_start = MPI_Wtime(); pnga_copy(g_a, g_b); local_stop = MPI_Wtime(); time_pnga_copy += local_stop - local_start; } void wnga_copy_patch(char *trans, Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi) { double local_start, local_stop; ++count_pnga_copy_patch; local_start = MPI_Wtime(); pnga_copy_patch(trans, g_a, alo, ahi, g_b, blo, bhi); local_stop = MPI_Wtime(); time_pnga_copy_patch += local_stop - local_start; } void wnga_copy_patch_dp(char *t_a, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi) { double local_start, local_stop; ++count_pnga_copy_patch_dp; local_start = MPI_Wtime(); pnga_copy_patch_dp(t_a, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi); local_stop = MPI_Wtime(); time_pnga_copy_patch_dp += local_stop - local_start; } logical wnga_create(Integer type, Integer ndim, Integer *dims, char *name, Integer *chunk, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create; local_start = MPI_Wtime(); return_value = pnga_create(type, ndim, dims, name, chunk, g_a); local_stop = MPI_Wtime(); time_pnga_create += local_stop - local_start; return return_value; } logical wnga_create_bin_range(Integer g_bin, Integer g_cnt, Integer g_off, Integer *g_range) { logical return_value; double local_start, local_stop; ++count_pnga_create_bin_range; local_start = MPI_Wtime(); return_value = pnga_create_bin_range(g_bin, g_cnt, g_off, g_range); local_stop = MPI_Wtime(); time_pnga_create_bin_range += local_stop - local_start; return return_value; } logical wnga_create_config(Integer type, Integer ndim, Integer *dims, char *name, Integer *chunk, Integer p_handle, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_config; local_start = MPI_Wtime(); return_value = pnga_create_config(type, ndim, dims, name, chunk, p_handle, g_a); local_stop = MPI_Wtime(); time_pnga_create_config += local_stop - local_start; return return_value; } logical wnga_create_ghosts(Integer type, Integer ndim, Integer *dims, Integer *width, char *name, Integer *chunk, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_ghosts; local_start = MPI_Wtime(); return_value = pnga_create_ghosts(type, ndim, dims, width, name, chunk, g_a); local_stop = MPI_Wtime(); time_pnga_create_ghosts += local_stop - local_start; return return_value; } logical wnga_create_ghosts_config(Integer type, Integer ndim, Integer *dims, Integer *width, char *name, Integer *chunk, Integer p_handle, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_ghosts_config; local_start = MPI_Wtime(); return_value = pnga_create_ghosts_config(type, ndim, dims, width, name, chunk, p_handle, g_a); local_stop = MPI_Wtime(); time_pnga_create_ghosts_config += local_stop - local_start; return return_value; } logical wnga_create_ghosts_irreg(Integer type, Integer ndim, Integer *dims, Integer *width, char *name, Integer *map, Integer *block, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_ghosts_irreg; local_start = MPI_Wtime(); return_value = pnga_create_ghosts_irreg(type, ndim, dims, width, name, map, block, g_a); local_stop = MPI_Wtime(); time_pnga_create_ghosts_irreg += local_stop - local_start; return return_value; } logical wnga_create_ghosts_irreg_config(Integer type, Integer ndim, Integer *dims, Integer *width, char *name, Integer *map, Integer *block, Integer p_handle, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_ghosts_irreg_config; local_start = MPI_Wtime(); return_value = pnga_create_ghosts_irreg_config(type, ndim, dims, width, name, map, block, p_handle, g_a); local_stop = MPI_Wtime(); time_pnga_create_ghosts_irreg_config += local_stop - local_start; return return_value; } Integer wnga_create_handle() { Integer return_value; double local_start, local_stop; ++count_pnga_create_handle; local_start = MPI_Wtime(); return_value = pnga_create_handle(); local_stop = MPI_Wtime(); time_pnga_create_handle += local_stop - local_start; return return_value; } logical wnga_create_irreg(Integer type, Integer ndim, Integer *dims, char *name, Integer *map, Integer *block, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_irreg; local_start = MPI_Wtime(); return_value = pnga_create_irreg(type, ndim, dims, name, map, block, g_a); local_stop = MPI_Wtime(); time_pnga_create_irreg += local_stop - local_start; return return_value; } logical wnga_create_irreg_config(Integer type, Integer ndim, Integer *dims, char *name, Integer *map, Integer *block, Integer p_handle, Integer *g_a) { logical return_value; double local_start, local_stop; ++count_pnga_create_irreg_config; local_start = MPI_Wtime(); return_value = pnga_create_irreg_config(type, ndim, dims, name, map, block, p_handle, g_a); local_stop = MPI_Wtime(); time_pnga_create_irreg_config += local_stop - local_start; return return_value; } logical wnga_create_mutexes(Integer num) { logical return_value; double local_start, local_stop; ++count_pnga_create_mutexes; local_start = MPI_Wtime(); return_value = pnga_create_mutexes(num); local_stop = MPI_Wtime(); time_pnga_create_mutexes += local_stop - local_start; return return_value; } DoublePrecision wnga_ddot_patch_dp(Integer g_a, char *t_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, char *t_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi) { DoublePrecision return_value; double local_start, local_stop; ++count_pnga_ddot_patch_dp; local_start = MPI_Wtime(); return_value = pnga_ddot_patch_dp(g_a, t_a, ailo, aihi, ajlo, ajhi, g_b, t_b, bilo, bihi, bjlo, bjhi); local_stop = MPI_Wtime(); time_pnga_ddot_patch_dp += local_stop - local_start; return return_value; } int wnga_deregister_type(int type) { int return_value; double local_start, local_stop; ++count_pnga_deregister_type; local_start = MPI_Wtime(); return_value = pnga_deregister_type(type); local_stop = MPI_Wtime(); time_pnga_deregister_type += local_stop - local_start; return return_value; } logical wnga_destroy(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_destroy; local_start = MPI_Wtime(); return_value = pnga_destroy(g_a); local_stop = MPI_Wtime(); time_pnga_destroy += local_stop - local_start; return return_value; } logical wnga_destroy_mutexes() { logical return_value; double local_start, local_stop; ++count_pnga_destroy_mutexes; local_start = MPI_Wtime(); return_value = pnga_destroy_mutexes(); local_stop = MPI_Wtime(); time_pnga_destroy_mutexes += local_stop - local_start; return return_value; } void wnga_diag(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { double local_start, local_stop; ++count_pnga_diag; local_start = MPI_Wtime(); pnga_diag(g_a, g_s, g_v, eval); local_stop = MPI_Wtime(); time_pnga_diag += local_stop - local_start; } void wnga_diag_reuse(Integer reuse, Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { double local_start, local_stop; ++count_pnga_diag_reuse; local_start = MPI_Wtime(); pnga_diag_reuse(reuse, g_a, g_s, g_v, eval); local_stop = MPI_Wtime(); time_pnga_diag_reuse += local_stop - local_start; } void wnga_diag_seq(Integer g_a, Integer g_s, Integer g_v, DoublePrecision *eval) { double local_start, local_stop; ++count_pnga_diag_seq; local_start = MPI_Wtime(); pnga_diag_seq(g_a, g_s, g_v, eval); local_stop = MPI_Wtime(); time_pnga_diag_seq += local_stop - local_start; } void wnga_diag_std(Integer g_a, Integer g_v, DoublePrecision *eval) { double local_start, local_stop; ++count_pnga_diag_std; local_start = MPI_Wtime(); pnga_diag_std(g_a, g_v, eval); local_stop = MPI_Wtime(); time_pnga_diag_std += local_stop - local_start; } void wnga_diag_std_seq(Integer g_a, Integer g_v, DoublePrecision *eval) { double local_start, local_stop; ++count_pnga_diag_std_seq; local_start = MPI_Wtime(); pnga_diag_std_seq(g_a, g_v, eval); local_stop = MPI_Wtime(); time_pnga_diag_std_seq += local_stop - local_start; } void wnga_distribution(Integer g_a, Integer proc, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_distribution; local_start = MPI_Wtime(); pnga_distribution(g_a, proc, lo, hi); local_stop = MPI_Wtime(); time_pnga_distribution += local_stop - local_start; } void wnga_dot(int type, Integer g_a, Integer g_b, void *value) { double local_start, local_stop; ++count_pnga_dot; local_start = MPI_Wtime(); pnga_dot(type, g_a, g_b, value); local_stop = MPI_Wtime(); time_pnga_dot += local_stop - local_start; } void wnga_dot_patch(Integer g_a, char *t_a, Integer *alo, Integer *ahi, Integer g_b, char *t_b, Integer *blo, Integer *bhi, void *retval) { double local_start, local_stop; ++count_pnga_dot_patch; local_start = MPI_Wtime(); pnga_dot_patch(g_a, t_a, alo, ahi, g_b, t_b, blo, bhi, retval); local_stop = MPI_Wtime(); time_pnga_dot_patch += local_stop - local_start; } logical wnga_duplicate(Integer g_a, Integer *g_b, char *array_name) { logical return_value; double local_start, local_stop; ++count_pnga_duplicate; local_start = MPI_Wtime(); return_value = pnga_duplicate(g_a, g_b, array_name); local_stop = MPI_Wtime(); time_pnga_duplicate += local_stop - local_start; return return_value; } void wnga_elem_divide(Integer g_a, Integer g_b, Integer g_c) { double local_start, local_stop; ++count_pnga_elem_divide; local_start = MPI_Wtime(); pnga_elem_divide(g_a, g_b, g_c); local_stop = MPI_Wtime(); time_pnga_elem_divide += local_stop - local_start; } void wnga_elem_divide_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_divide_patch; local_start = MPI_Wtime(); pnga_elem_divide_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_divide_patch += local_stop - local_start; } void wnga_elem_maximum(Integer g_a, Integer g_b, Integer g_c) { double local_start, local_stop; ++count_pnga_elem_maximum; local_start = MPI_Wtime(); pnga_elem_maximum(g_a, g_b, g_c); local_stop = MPI_Wtime(); time_pnga_elem_maximum += local_stop - local_start; } void wnga_elem_maximum_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_maximum_patch; local_start = MPI_Wtime(); pnga_elem_maximum_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_maximum_patch += local_stop - local_start; } void wnga_elem_minimum(Integer g_a, Integer g_b, Integer g_c) { double local_start, local_stop; ++count_pnga_elem_minimum; local_start = MPI_Wtime(); pnga_elem_minimum(g_a, g_b, g_c); local_stop = MPI_Wtime(); time_pnga_elem_minimum += local_stop - local_start; } void wnga_elem_minimum_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_minimum_patch; local_start = MPI_Wtime(); pnga_elem_minimum_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_minimum_patch += local_stop - local_start; } void wnga_elem_multiply(Integer g_a, Integer g_b, Integer g_c) { double local_start, local_stop; ++count_pnga_elem_multiply; local_start = MPI_Wtime(); pnga_elem_multiply(g_a, g_b, g_c); local_stop = MPI_Wtime(); time_pnga_elem_multiply += local_stop - local_start; } void wnga_elem_multiply_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_multiply_patch; local_start = MPI_Wtime(); pnga_elem_multiply_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_multiply_patch += local_stop - local_start; } void wnga_elem_step_divide_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_step_divide_patch; local_start = MPI_Wtime(); pnga_elem_step_divide_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_step_divide_patch += local_stop - local_start; } void wnga_elem_stepb_divide_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_elem_stepb_divide_patch; local_start = MPI_Wtime(); pnga_elem_stepb_divide_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_elem_stepb_divide_patch += local_stop - local_start; } void wnga_error(char *string, Integer icode) { double local_start, local_stop; ++count_pnga_error; local_start = MPI_Wtime(); pnga_error(string, icode); local_stop = MPI_Wtime(); time_pnga_error += local_stop - local_start; } void wnga_fence() { double local_start, local_stop; ++count_pnga_fence; local_start = MPI_Wtime(); pnga_fence(); local_stop = MPI_Wtime(); time_pnga_fence += local_stop - local_start; } void wnga_fill(Integer g_a, void *val) { double local_start, local_stop; ++count_pnga_fill; local_start = MPI_Wtime(); pnga_fill(g_a, val); local_stop = MPI_Wtime(); time_pnga_fill += local_stop - local_start; } void wnga_fill_patch(Integer g_a, Integer *lo, Integer *hi, void *val) { double local_start, local_stop; ++count_pnga_fill_patch; local_start = MPI_Wtime(); pnga_fill_patch(g_a, lo, hi, val); local_stop = MPI_Wtime(); time_pnga_fill_patch += local_stop - local_start; } void wnga_gather(Integer g_a, void *v, Integer subscript[], Integer nv) { double local_start, local_stop; ++count_pnga_gather; local_start = MPI_Wtime(); pnga_gather(g_a, v, subscript, nv); local_stop = MPI_Wtime(); time_pnga_gather += local_stop - local_start; } void wnga_gather2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv) { double local_start, local_stop; ++count_pnga_gather2d; local_start = MPI_Wtime(); pnga_gather2d(g_a, v, i, j, nv); local_stop = MPI_Wtime(); time_pnga_gather2d += local_stop - local_start; } void wnga_get(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_get; local_start = MPI_Wtime(); pnga_get(g_a, lo, hi, buf, ld); local_stop = MPI_Wtime(); time_pnga_get += local_stop - local_start; } void wnga_get_block_info(Integer g_a, Integer *num_blocks, Integer *block_dims) { double local_start, local_stop; ++count_pnga_get_block_info; local_start = MPI_Wtime(); pnga_get_block_info(g_a, num_blocks, block_dims); local_stop = MPI_Wtime(); time_pnga_get_block_info += local_stop - local_start; } logical wnga_get_debug() { logical return_value; double local_start, local_stop; ++count_pnga_get_debug; local_start = MPI_Wtime(); return_value = pnga_get_debug(); local_stop = MPI_Wtime(); time_pnga_get_debug += local_stop - local_start; return return_value; } void wnga_get_diag(Integer g_a, Integer g_v) { double local_start, local_stop; ++count_pnga_get_diag; local_start = MPI_Wtime(); pnga_get_diag(g_a, g_v); local_stop = MPI_Wtime(); time_pnga_get_diag += local_stop - local_start; } Integer wnga_get_dimension(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_get_dimension; local_start = MPI_Wtime(); return_value = pnga_get_dimension(g_a); local_stop = MPI_Wtime(); time_pnga_get_dimension += local_stop - local_start; return return_value; } void wnga_get_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_get_field; local_start = MPI_Wtime(); pnga_get_field(g_a, lo, hi, foff, fsize, buf, ld); local_stop = MPI_Wtime(); time_pnga_get_field += local_stop - local_start; } void wnga_get_ghost_block(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_get_ghost_block; local_start = MPI_Wtime(); pnga_get_ghost_block(g_a, lo, hi, buf, ld); local_stop = MPI_Wtime(); time_pnga_get_ghost_block += local_stop - local_start; } Integer wnga_get_pgroup(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_get_pgroup; local_start = MPI_Wtime(); return_value = pnga_get_pgroup(g_a); local_stop = MPI_Wtime(); time_pnga_get_pgroup += local_stop - local_start; return return_value; } Integer wnga_get_pgroup_size(Integer grp_id) { Integer return_value; double local_start, local_stop; ++count_pnga_get_pgroup_size; local_start = MPI_Wtime(); return_value = pnga_get_pgroup_size(grp_id); local_stop = MPI_Wtime(); time_pnga_get_pgroup_size += local_stop - local_start; return return_value; } void wnga_get_proc_grid(Integer g_a, Integer *dims) { double local_start, local_stop; ++count_pnga_get_proc_grid; local_start = MPI_Wtime(); pnga_get_proc_grid(g_a, dims); local_stop = MPI_Wtime(); time_pnga_get_proc_grid += local_stop - local_start; } void wnga_get_proc_index(Integer g_a, Integer iproc, Integer *index) { double local_start, local_stop; ++count_pnga_get_proc_index; local_start = MPI_Wtime(); pnga_get_proc_index(g_a, iproc, index); local_stop = MPI_Wtime(); time_pnga_get_proc_index += local_stop - local_start; } void wnga_ghost_barrier() { double local_start, local_stop; ++count_pnga_ghost_barrier; local_start = MPI_Wtime(); pnga_ghost_barrier(); local_stop = MPI_Wtime(); time_pnga_ghost_barrier += local_stop - local_start; } void wnga_gop(Integer type, void *x, Integer n, char *op) { double local_start, local_stop; ++count_pnga_gop; local_start = MPI_Wtime(); pnga_gop(type, x, n, op); local_stop = MPI_Wtime(); time_pnga_gop += local_stop - local_start; } logical wnga_has_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_has_ghosts; local_start = MPI_Wtime(); return_value = pnga_has_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_has_ghosts += local_stop - local_start; return return_value; } void wnga_init_fence() { double local_start, local_stop; ++count_pnga_init_fence; local_start = MPI_Wtime(); pnga_init_fence(); local_stop = MPI_Wtime(); time_pnga_init_fence += local_stop - local_start; } void wnga_inquire(Integer g_a, Integer *type, Integer *ndim, Integer *dims) { double local_start, local_stop; ++count_pnga_inquire; local_start = MPI_Wtime(); pnga_inquire(g_a, type, ndim, dims); local_stop = MPI_Wtime(); time_pnga_inquire += local_stop - local_start; } Integer wnga_inquire_memory() { Integer return_value; double local_start, local_stop; ++count_pnga_inquire_memory; local_start = MPI_Wtime(); return_value = pnga_inquire_memory(); local_stop = MPI_Wtime(); time_pnga_inquire_memory += local_stop - local_start; return return_value; } void wnga_inquire_name(Integer g_a, char **array_name) { double local_start, local_stop; ++count_pnga_inquire_name; local_start = MPI_Wtime(); pnga_inquire_name(g_a, array_name); local_stop = MPI_Wtime(); time_pnga_inquire_name += local_stop - local_start; } void wnga_inquire_type(Integer g_a, Integer *type) { double local_start, local_stop; ++count_pnga_inquire_type; local_start = MPI_Wtime(); pnga_inquire_type(g_a, type); local_stop = MPI_Wtime(); time_pnga_inquire_type += local_stop - local_start; } logical wnga_is_mirrored(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_is_mirrored; local_start = MPI_Wtime(); return_value = pnga_is_mirrored(g_a); local_stop = MPI_Wtime(); time_pnga_is_mirrored += local_stop - local_start; return return_value; } void wnga_list_nodeid(Integer *list, Integer nprocs) { double local_start, local_stop; ++count_pnga_list_nodeid; local_start = MPI_Wtime(); pnga_list_nodeid(list, nprocs); local_stop = MPI_Wtime(); time_pnga_list_nodeid += local_stop - local_start; } Integer wnga_llt_solve(Integer g_a, Integer g_b) { Integer return_value; double local_start, local_stop; ++count_pnga_llt_solve; local_start = MPI_Wtime(); return_value = pnga_llt_solve(g_a, g_b); local_stop = MPI_Wtime(); time_pnga_llt_solve += local_stop - local_start; return return_value; } logical wnga_locate(Integer g_a, Integer *subscript, Integer *owner) { logical return_value; double local_start, local_stop; ++count_pnga_locate; local_start = MPI_Wtime(); return_value = pnga_locate(g_a, subscript, owner); local_stop = MPI_Wtime(); time_pnga_locate += local_stop - local_start; return return_value; } logical wnga_locate_nnodes(Integer g_a, Integer *lo, Integer *hi, Integer *np) { logical return_value; double local_start, local_stop; ++count_pnga_locate_nnodes; local_start = MPI_Wtime(); return_value = pnga_locate_nnodes(g_a, lo, hi, np); local_stop = MPI_Wtime(); time_pnga_locate_nnodes += local_stop - local_start; return return_value; } Integer wnga_locate_num_blocks(Integer g_a, Integer *lo, Integer *hi) { Integer return_value; double local_start, local_stop; ++count_pnga_locate_num_blocks; local_start = MPI_Wtime(); return_value = pnga_locate_num_blocks(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_locate_num_blocks += local_stop - local_start; return return_value; } logical wnga_locate_region(Integer g_a, Integer *lo, Integer *hi, Integer *map, Integer *proclist, Integer *np) { logical return_value; double local_start, local_stop; ++count_pnga_locate_region; local_start = MPI_Wtime(); return_value = pnga_locate_region(g_a, lo, hi, map, proclist, np); local_stop = MPI_Wtime(); time_pnga_locate_region += local_stop - local_start; return return_value; } void wnga_lock(Integer mutex) { double local_start, local_stop; ++count_pnga_lock; local_start = MPI_Wtime(); pnga_lock(mutex); local_stop = MPI_Wtime(); time_pnga_lock += local_stop - local_start; } void wnga_lu_solve(char *tran, Integer g_a, Integer g_b) { double local_start, local_stop; ++count_pnga_lu_solve; local_start = MPI_Wtime(); pnga_lu_solve(tran, g_a, g_b); local_stop = MPI_Wtime(); time_pnga_lu_solve += local_stop - local_start; } void wnga_lu_solve_alt(Integer tran, Integer g_a, Integer g_b) { double local_start, local_stop; ++count_pnga_lu_solve_alt; local_start = MPI_Wtime(); pnga_lu_solve_alt(tran, g_a, g_b); local_stop = MPI_Wtime(); time_pnga_lu_solve_alt += local_stop - local_start; } void wnga_lu_solve_seq(char *trans, Integer g_a, Integer g_b) { double local_start, local_stop; ++count_pnga_lu_solve_seq; local_start = MPI_Wtime(); pnga_lu_solve_seq(trans, g_a, g_b); local_stop = MPI_Wtime(); time_pnga_lu_solve_seq += local_stop - local_start; } void wnga_mask_sync(Integer begin, Integer end) { double local_start, local_stop; ++count_pnga_mask_sync; local_start = MPI_Wtime(); pnga_mask_sync(begin, end); local_stop = MPI_Wtime(); time_pnga_mask_sync += local_stop - local_start; } void wnga_matmul(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi, Integer g_c, Integer cilo, Integer cihi, Integer cjlo, Integer cjhi) { double local_start, local_stop; ++count_pnga_matmul; local_start = MPI_Wtime(); pnga_matmul(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); local_stop = MPI_Wtime(); time_pnga_matmul += local_stop - local_start; } void wnga_matmul_mirrored(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer ailo, Integer aihi, Integer ajlo, Integer ajhi, Integer g_b, Integer bilo, Integer bihi, Integer bjlo, Integer bjhi, Integer g_c, Integer cilo, Integer cihi, Integer cjlo, Integer cjhi) { double local_start, local_stop; ++count_pnga_matmul_mirrored; local_start = MPI_Wtime(); pnga_matmul_mirrored(transa, transb, alpha, beta, g_a, ailo, aihi, ajlo, ajhi, g_b, bilo, bihi, bjlo, bjhi, g_c, cilo, cihi, cjlo, cjhi); local_stop = MPI_Wtime(); time_pnga_matmul_mirrored += local_stop - local_start; } void wnga_matmul_patch(char *transa, char *transb, void *alpha, void *beta, Integer g_a, Integer alo[], Integer ahi[], Integer g_b, Integer blo[], Integer bhi[], Integer g_c, Integer clo[], Integer chi[]) { double local_start, local_stop; ++count_pnga_matmul_patch; local_start = MPI_Wtime(); pnga_matmul_patch(transa, transb, alpha, beta, g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_matmul_patch += local_stop - local_start; } void wnga_median(Integer g_a, Integer g_b, Integer g_c, Integer g_m) { double local_start, local_stop; ++count_pnga_median; local_start = MPI_Wtime(); pnga_median(g_a, g_b, g_c, g_m); local_stop = MPI_Wtime(); time_pnga_median += local_stop - local_start; } void wnga_median_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi, Integer g_m, Integer *mlo, Integer *mhi) { double local_start, local_stop; ++count_pnga_median_patch; local_start = MPI_Wtime(); pnga_median_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi, g_m, mlo, mhi); local_stop = MPI_Wtime(); time_pnga_median_patch += local_stop - local_start; } Integer wnga_memory_avail() { Integer return_value; double local_start, local_stop; ++count_pnga_memory_avail; local_start = MPI_Wtime(); return_value = pnga_memory_avail(); local_stop = MPI_Wtime(); time_pnga_memory_avail += local_stop - local_start; return return_value; } Integer wnga_memory_avail_type(Integer datatype) { Integer return_value; double local_start, local_stop; ++count_pnga_memory_avail_type; local_start = MPI_Wtime(); return_value = pnga_memory_avail_type(datatype); local_stop = MPI_Wtime(); time_pnga_memory_avail_type += local_stop - local_start; return return_value; } logical wnga_memory_limited() { logical return_value; double local_start, local_stop; ++count_pnga_memory_limited; local_start = MPI_Wtime(); return_value = pnga_memory_limited(); local_stop = MPI_Wtime(); time_pnga_memory_limited += local_stop - local_start; return return_value; } void wnga_merge_distr_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi) { double local_start, local_stop; ++count_pnga_merge_distr_patch; local_start = MPI_Wtime(); pnga_merge_distr_patch(g_a, alo, ahi, g_b, blo, bhi); local_stop = MPI_Wtime(); time_pnga_merge_distr_patch += local_stop - local_start; } void wnga_merge_mirrored(Integer g_a) { double local_start, local_stop; ++count_pnga_merge_mirrored; local_start = MPI_Wtime(); pnga_merge_mirrored(g_a); local_stop = MPI_Wtime(); time_pnga_merge_mirrored += local_stop - local_start; } void wnga_msg_brdcst(Integer type, void *buffer, Integer len, Integer root) { double local_start, local_stop; ++count_pnga_msg_brdcst; local_start = MPI_Wtime(); pnga_msg_brdcst(type, buffer, len, root); local_stop = MPI_Wtime(); time_pnga_msg_brdcst += local_stop - local_start; } void wnga_msg_pgroup_sync(Integer grp_id) { double local_start, local_stop; ++count_pnga_msg_pgroup_sync; local_start = MPI_Wtime(); pnga_msg_pgroup_sync(grp_id); local_stop = MPI_Wtime(); time_pnga_msg_pgroup_sync += local_stop - local_start; } void wnga_msg_sync() { double local_start, local_stop; ++count_pnga_msg_sync; local_start = MPI_Wtime(); pnga_msg_sync(); local_stop = MPI_Wtime(); time_pnga_msg_sync += local_stop - local_start; } void wnga_nbacc(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer *nbhndl) { double local_start, local_stop; ++count_pnga_nbacc; local_start = MPI_Wtime(); pnga_nbacc(g_a, lo, hi, buf, ld, alpha, nbhndl); local_stop = MPI_Wtime(); time_pnga_nbacc += local_stop - local_start; } void wnga_nbget(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbget; local_start = MPI_Wtime(); pnga_nbget(g_a, lo, hi, buf, ld, nbhandle); local_stop = MPI_Wtime(); time_pnga_nbget += local_stop - local_start; } void wnga_nbget_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld, Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbget_field; local_start = MPI_Wtime(); pnga_nbget_field(g_a, lo, hi, foff, fsize, buf, ld, nbhandle); local_stop = MPI_Wtime(); time_pnga_nbget_field += local_stop - local_start; } void wnga_nbget_ghost_dir(Integer g_a, Integer *mask, Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbget_ghost_dir; local_start = MPI_Wtime(); pnga_nbget_ghost_dir(g_a, mask, nbhandle); local_stop = MPI_Wtime(); time_pnga_nbget_ghost_dir += local_stop - local_start; } void wnga_nblock(Integer g_a, Integer *nblock) { double local_start, local_stop; ++count_pnga_nblock; local_start = MPI_Wtime(); pnga_nblock(g_a, nblock); local_stop = MPI_Wtime(); time_pnga_nblock += local_stop - local_start; } void wnga_nbput(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbput; local_start = MPI_Wtime(); pnga_nbput(g_a, lo, hi, buf, ld, nbhandle); local_stop = MPI_Wtime(); time_pnga_nbput += local_stop - local_start; } void wnga_nbput_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld, Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbput_field; local_start = MPI_Wtime(); pnga_nbput_field(g_a, lo, hi, foff, fsize, buf, ld, nbhandle); local_stop = MPI_Wtime(); time_pnga_nbput_field += local_stop - local_start; } Integer wnga_nbtest(Integer *nbhandle) { Integer return_value; double local_start, local_stop; ++count_pnga_nbtest; local_start = MPI_Wtime(); return_value = pnga_nbtest(nbhandle); local_stop = MPI_Wtime(); time_pnga_nbtest += local_stop - local_start; return return_value; } void wnga_nbwait(Integer *nbhandle) { double local_start, local_stop; ++count_pnga_nbwait; local_start = MPI_Wtime(); pnga_nbwait(nbhandle); local_stop = MPI_Wtime(); time_pnga_nbwait += local_stop - local_start; } Integer wnga_ndim(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_ndim; local_start = MPI_Wtime(); return_value = pnga_ndim(g_a); local_stop = MPI_Wtime(); time_pnga_ndim += local_stop - local_start; return return_value; } Integer wnga_nnodes() { Integer return_value; double local_start, local_stop; ++count_pnga_nnodes; local_start = MPI_Wtime(); return_value = pnga_nnodes(); local_stop = MPI_Wtime(); time_pnga_nnodes += local_stop - local_start; return return_value; } Integer wnga_nodeid() { Integer return_value; double local_start, local_stop; ++count_pnga_nodeid; local_start = MPI_Wtime(); return_value = pnga_nodeid(); local_stop = MPI_Wtime(); time_pnga_nodeid += local_stop - local_start; return return_value; } void wnga_norm1(Integer g_a, double *nm) { double local_start, local_stop; ++count_pnga_norm1; local_start = MPI_Wtime(); pnga_norm1(g_a, nm); local_stop = MPI_Wtime(); time_pnga_norm1 += local_stop - local_start; } void wnga_norm_infinity(Integer g_a, double *nm) { double local_start, local_stop; ++count_pnga_norm_infinity; local_start = MPI_Wtime(); pnga_norm_infinity(g_a, nm); local_stop = MPI_Wtime(); time_pnga_norm_infinity += local_stop - local_start; } void wnga_pack(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer *icount) { double local_start, local_stop; ++count_pnga_pack; local_start = MPI_Wtime(); pnga_pack(g_a, g_b, g_sbit, lo, hi, icount); local_stop = MPI_Wtime(); time_pnga_pack += local_stop - local_start; } void wnga_patch_enum(Integer g_a, Integer lo, Integer hi, void *start, void *stride) { double local_start, local_stop; ++count_pnga_patch_enum; local_start = MPI_Wtime(); pnga_patch_enum(g_a, lo, hi, start, stride); local_stop = MPI_Wtime(); time_pnga_patch_enum += local_stop - local_start; } logical wnga_patch_intersect(Integer *lo, Integer *hi, Integer *lop, Integer *hip, Integer ndim) { logical return_value; double local_start, local_stop; ++count_pnga_patch_intersect; local_start = MPI_Wtime(); return_value = pnga_patch_intersect(lo, hi, lop, hip, ndim); local_stop = MPI_Wtime(); time_pnga_patch_intersect += local_stop - local_start; return return_value; } void wnga_periodic(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld, void *alpha, Integer op_code) { double local_start, local_stop; ++count_pnga_periodic; local_start = MPI_Wtime(); pnga_periodic(g_a, lo, hi, buf, ld, alpha, op_code); local_stop = MPI_Wtime(); time_pnga_periodic += local_stop - local_start; } Integer wnga_pgroup_absolute_id(Integer grp, Integer pid) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_absolute_id; local_start = MPI_Wtime(); return_value = pnga_pgroup_absolute_id(grp, pid); local_stop = MPI_Wtime(); time_pnga_pgroup_absolute_id += local_stop - local_start; return return_value; } void wnga_pgroup_brdcst(Integer grp_id, Integer type, void *buf, Integer len, Integer originator) { double local_start, local_stop; ++count_pnga_pgroup_brdcst; local_start = MPI_Wtime(); pnga_pgroup_brdcst(grp_id, type, buf, len, originator); local_stop = MPI_Wtime(); time_pnga_pgroup_brdcst += local_stop - local_start; } Integer wnga_pgroup_create(Integer *list, Integer count) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_create; local_start = MPI_Wtime(); return_value = pnga_pgroup_create(list, count); local_stop = MPI_Wtime(); time_pnga_pgroup_create += local_stop - local_start; return return_value; } logical wnga_pgroup_destroy(Integer grp) { logical return_value; double local_start, local_stop; ++count_pnga_pgroup_destroy; local_start = MPI_Wtime(); return_value = pnga_pgroup_destroy(grp); local_stop = MPI_Wtime(); time_pnga_pgroup_destroy += local_stop - local_start; return return_value; } Integer wnga_pgroup_get_default() { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_get_default; local_start = MPI_Wtime(); return_value = pnga_pgroup_get_default(); local_stop = MPI_Wtime(); time_pnga_pgroup_get_default += local_stop - local_start; return return_value; } Integer wnga_pgroup_get_mirror() { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_get_mirror; local_start = MPI_Wtime(); return_value = pnga_pgroup_get_mirror(); local_stop = MPI_Wtime(); time_pnga_pgroup_get_mirror += local_stop - local_start; return return_value; } Integer wnga_pgroup_get_world() { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_get_world; local_start = MPI_Wtime(); return_value = pnga_pgroup_get_world(); local_stop = MPI_Wtime(); time_pnga_pgroup_get_world += local_stop - local_start; return return_value; } void wnga_pgroup_gop(Integer p_grp, Integer type, void *x, Integer n, char *op) { double local_start, local_stop; ++count_pnga_pgroup_gop; local_start = MPI_Wtime(); pnga_pgroup_gop(p_grp, type, x, n, op); local_stop = MPI_Wtime(); time_pnga_pgroup_gop += local_stop - local_start; } Integer wnga_pgroup_nnodes(Integer grp) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_nnodes; local_start = MPI_Wtime(); return_value = pnga_pgroup_nnodes(grp); local_stop = MPI_Wtime(); time_pnga_pgroup_nnodes += local_stop - local_start; return return_value; } Integer wnga_pgroup_nodeid(Integer grp) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_nodeid; local_start = MPI_Wtime(); return_value = pnga_pgroup_nodeid(grp); local_stop = MPI_Wtime(); time_pnga_pgroup_nodeid += local_stop - local_start; return return_value; } void wnga_pgroup_set_default(Integer grp) { double local_start, local_stop; ++count_pnga_pgroup_set_default; local_start = MPI_Wtime(); pnga_pgroup_set_default(grp); local_stop = MPI_Wtime(); time_pnga_pgroup_set_default += local_stop - local_start; } Integer wnga_pgroup_split(Integer grp, Integer grp_num) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_split; local_start = MPI_Wtime(); return_value = pnga_pgroup_split(grp, grp_num); local_stop = MPI_Wtime(); time_pnga_pgroup_split += local_stop - local_start; return return_value; } Integer wnga_pgroup_split_irreg(Integer grp, Integer mycolor) { Integer return_value; double local_start, local_stop; ++count_pnga_pgroup_split_irreg; local_start = MPI_Wtime(); return_value = pnga_pgroup_split_irreg(grp, mycolor); local_stop = MPI_Wtime(); time_pnga_pgroup_split_irreg += local_stop - local_start; return return_value; } void wnga_pgroup_sync(Integer grp_id) { double local_start, local_stop; ++count_pnga_pgroup_sync; local_start = MPI_Wtime(); pnga_pgroup_sync(grp_id); local_stop = MPI_Wtime(); time_pnga_pgroup_sync += local_stop - local_start; } void wnga_print(Integer g_a) { double local_start, local_stop; ++count_pnga_print; local_start = MPI_Wtime(); pnga_print(g_a); local_stop = MPI_Wtime(); time_pnga_print += local_stop - local_start; } void wnga_print_distribution(int fstyle, Integer g_a) { double local_start, local_stop; ++count_pnga_print_distribution; local_start = MPI_Wtime(); pnga_print_distribution(fstyle, g_a); local_stop = MPI_Wtime(); time_pnga_print_distribution += local_stop - local_start; } void wnga_print_file(FILE *file, Integer g_a) { double local_start, local_stop; ++count_pnga_print_file; local_start = MPI_Wtime(); pnga_print_file(file, g_a); local_stop = MPI_Wtime(); time_pnga_print_file += local_stop - local_start; } void wnga_print_patch(Integer g_a, Integer *lo, Integer *hi, Integer pretty) { double local_start, local_stop; ++count_pnga_print_patch; local_start = MPI_Wtime(); pnga_print_patch(g_a, lo, hi, pretty); local_stop = MPI_Wtime(); time_pnga_print_patch += local_stop - local_start; } void wnga_print_patch2d(Integer g_a, Integer ilo, Integer ihi, Integer jlo, Integer jhi, Integer pretty) { double local_start, local_stop; ++count_pnga_print_patch2d; local_start = MPI_Wtime(); pnga_print_patch2d(g_a, ilo, ihi, jlo, jhi, pretty); local_stop = MPI_Wtime(); time_pnga_print_patch2d += local_stop - local_start; } void wnga_print_patch_file(FILE *file, Integer g_a, Integer *lo, Integer *hi, Integer pretty) { double local_start, local_stop; ++count_pnga_print_patch_file; local_start = MPI_Wtime(); pnga_print_patch_file(file, g_a, lo, hi, pretty); local_stop = MPI_Wtime(); time_pnga_print_patch_file += local_stop - local_start; } void wnga_print_patch_file2d(FILE *file, Integer g_a, Integer ilo, Integer ihi, Integer jlo, Integer jhi, Integer pretty) { double local_start, local_stop; ++count_pnga_print_patch_file2d; local_start = MPI_Wtime(); pnga_print_patch_file2d(file, g_a, ilo, ihi, jlo, jhi, pretty); local_stop = MPI_Wtime(); time_pnga_print_patch_file2d += local_stop - local_start; } void wnga_print_stats() { double local_start, local_stop; ++count_pnga_print_stats; local_start = MPI_Wtime(); pnga_print_stats(); local_stop = MPI_Wtime(); time_pnga_print_stats += local_stop - local_start; } void wnga_proc_topology(Integer g_a, Integer proc, Integer *subscript) { double local_start, local_stop; ++count_pnga_proc_topology; local_start = MPI_Wtime(); pnga_proc_topology(g_a, proc, subscript); local_stop = MPI_Wtime(); time_pnga_proc_topology += local_stop - local_start; } void wnga_put(Integer g_a, Integer *lo, Integer *hi, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_put; local_start = MPI_Wtime(); pnga_put(g_a, lo, hi, buf, ld); local_stop = MPI_Wtime(); time_pnga_put += local_stop - local_start; } void wnga_put_field(Integer g_a, Integer *lo, Integer *hi, Integer foff, Integer fsize, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_put_field; local_start = MPI_Wtime(); pnga_put_field(g_a, lo, hi, foff, fsize, buf, ld); local_stop = MPI_Wtime(); time_pnga_put_field += local_stop - local_start; } void wnga_randomize(Integer g_a, void *val) { double local_start, local_stop; ++count_pnga_randomize; local_start = MPI_Wtime(); pnga_randomize(g_a, val); local_stop = MPI_Wtime(); time_pnga_randomize += local_stop - local_start; } Integer wnga_read_inc(Integer g_a, Integer *subscript, Integer inc) { Integer return_value; double local_start, local_stop; ++count_pnga_read_inc; local_start = MPI_Wtime(); return_value = pnga_read_inc(g_a, subscript, inc); local_stop = MPI_Wtime(); time_pnga_read_inc += local_stop - local_start; return return_value; } void wnga_recip(Integer g_a) { double local_start, local_stop; ++count_pnga_recip; local_start = MPI_Wtime(); pnga_recip(g_a); local_stop = MPI_Wtime(); time_pnga_recip += local_stop - local_start; } void wnga_recip_patch(Integer g_a, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_recip_patch; local_start = MPI_Wtime(); pnga_recip_patch(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_recip_patch += local_stop - local_start; } int wnga_register_type(size_t size) { int return_value; double local_start, local_stop; ++count_pnga_register_type; local_start = MPI_Wtime(); return_value = pnga_register_type(size); local_stop = MPI_Wtime(); time_pnga_register_type += local_stop - local_start; return return_value; } void wnga_release(Integer g_a, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_release; local_start = MPI_Wtime(); pnga_release(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_release += local_stop - local_start; } void wnga_release_block(Integer g_a, Integer iblock) { double local_start, local_stop; ++count_pnga_release_block; local_start = MPI_Wtime(); pnga_release_block(g_a, iblock); local_stop = MPI_Wtime(); time_pnga_release_block += local_stop - local_start; } void wnga_release_block_grid(Integer g_a, Integer *index) { double local_start, local_stop; ++count_pnga_release_block_grid; local_start = MPI_Wtime(); pnga_release_block_grid(g_a, index); local_stop = MPI_Wtime(); time_pnga_release_block_grid += local_stop - local_start; } void wnga_release_block_segment(Integer g_a, Integer iproc) { double local_start, local_stop; ++count_pnga_release_block_segment; local_start = MPI_Wtime(); pnga_release_block_segment(g_a, iproc); local_stop = MPI_Wtime(); time_pnga_release_block_segment += local_stop - local_start; } void wnga_release_ghost_element(Integer g_a, Integer subscript[]) { double local_start, local_stop; ++count_pnga_release_ghost_element; local_start = MPI_Wtime(); pnga_release_ghost_element(g_a, subscript); local_stop = MPI_Wtime(); time_pnga_release_ghost_element += local_stop - local_start; } void wnga_release_ghosts(Integer g_a) { double local_start, local_stop; ++count_pnga_release_ghosts; local_start = MPI_Wtime(); pnga_release_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_release_ghosts += local_stop - local_start; } void wnga_release_update(Integer g_a, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_release_update; local_start = MPI_Wtime(); pnga_release_update(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_release_update += local_stop - local_start; } void wnga_release_update_block(Integer g_a, Integer iblock) { double local_start, local_stop; ++count_pnga_release_update_block; local_start = MPI_Wtime(); pnga_release_update_block(g_a, iblock); local_stop = MPI_Wtime(); time_pnga_release_update_block += local_stop - local_start; } void wnga_release_update_block_grid(Integer g_a, Integer *index) { double local_start, local_stop; ++count_pnga_release_update_block_grid; local_start = MPI_Wtime(); pnga_release_update_block_grid(g_a, index); local_stop = MPI_Wtime(); time_pnga_release_update_block_grid += local_stop - local_start; } void wnga_release_update_block_segment(Integer g_a, Integer iproc) { double local_start, local_stop; ++count_pnga_release_update_block_segment; local_start = MPI_Wtime(); pnga_release_update_block_segment(g_a, iproc); local_stop = MPI_Wtime(); time_pnga_release_update_block_segment += local_stop - local_start; } void wnga_release_update_ghost_element(Integer g_a, Integer subscript[]) { double local_start, local_stop; ++count_pnga_release_update_ghost_element; local_start = MPI_Wtime(); pnga_release_update_ghost_element(g_a, subscript); local_stop = MPI_Wtime(); time_pnga_release_update_ghost_element += local_stop - local_start; } void wnga_release_update_ghosts(Integer g_a) { double local_start, local_stop; ++count_pnga_release_update_ghosts; local_start = MPI_Wtime(); pnga_release_update_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_release_update_ghosts += local_stop - local_start; } void wnga_scale(Integer g_a, void *alpha) { double local_start, local_stop; ++count_pnga_scale; local_start = MPI_Wtime(); pnga_scale(g_a, alpha); local_stop = MPI_Wtime(); time_pnga_scale += local_stop - local_start; } void wnga_scale_cols(Integer g_a, Integer g_v) { double local_start, local_stop; ++count_pnga_scale_cols; local_start = MPI_Wtime(); pnga_scale_cols(g_a, g_v); local_stop = MPI_Wtime(); time_pnga_scale_cols += local_stop - local_start; } void wnga_scale_patch(Integer g_a, Integer *lo, Integer *hi, void *alpha) { double local_start, local_stop; ++count_pnga_scale_patch; local_start = MPI_Wtime(); pnga_scale_patch(g_a, lo, hi, alpha); local_stop = MPI_Wtime(); time_pnga_scale_patch += local_stop - local_start; } void wnga_scale_rows(Integer g_a, Integer g_v) { double local_start, local_stop; ++count_pnga_scale_rows; local_start = MPI_Wtime(); pnga_scale_rows(g_a, g_v); local_stop = MPI_Wtime(); time_pnga_scale_rows += local_stop - local_start; } void wnga_scan_add(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer excl) { double local_start, local_stop; ++count_pnga_scan_add; local_start = MPI_Wtime(); pnga_scan_add(g_a, g_b, g_sbit, lo, hi, excl); local_stop = MPI_Wtime(); time_pnga_scan_add += local_stop - local_start; } void wnga_scan_copy(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi) { double local_start, local_stop; ++count_pnga_scan_copy; local_start = MPI_Wtime(); pnga_scan_copy(g_a, g_b, g_sbit, lo, hi); local_stop = MPI_Wtime(); time_pnga_scan_copy += local_stop - local_start; } void wnga_scatter(Integer g_a, void *v, Integer *subscript, Integer nv) { double local_start, local_stop; ++count_pnga_scatter; local_start = MPI_Wtime(); pnga_scatter(g_a, v, subscript, nv); local_stop = MPI_Wtime(); time_pnga_scatter += local_stop - local_start; } void wnga_scatter2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv) { double local_start, local_stop; ++count_pnga_scatter2d; local_start = MPI_Wtime(); pnga_scatter2d(g_a, v, i, j, nv); local_stop = MPI_Wtime(); time_pnga_scatter2d += local_stop - local_start; } void wnga_scatter_acc(Integer g_a, void *v, Integer subscript[], Integer nv, void *alpha) { double local_start, local_stop; ++count_pnga_scatter_acc; local_start = MPI_Wtime(); pnga_scatter_acc(g_a, v, subscript, nv, alpha); local_stop = MPI_Wtime(); time_pnga_scatter_acc += local_stop - local_start; } void wnga_scatter_acc2d(Integer g_a, void *v, Integer *i, Integer *j, Integer nv, void *alpha) { double local_start, local_stop; ++count_pnga_scatter_acc2d; local_start = MPI_Wtime(); pnga_scatter_acc2d(g_a, v, i, j, nv, alpha); local_stop = MPI_Wtime(); time_pnga_scatter_acc2d += local_stop - local_start; } void wnga_select_elem(Integer g_a, char *op, void *val, Integer *subscript) { double local_start, local_stop; ++count_pnga_select_elem; local_start = MPI_Wtime(); pnga_select_elem(g_a, op, val, subscript); local_stop = MPI_Wtime(); time_pnga_select_elem += local_stop - local_start; } void wnga_set_array_name(Integer g_a, char *array_name) { double local_start, local_stop; ++count_pnga_set_array_name; local_start = MPI_Wtime(); pnga_set_array_name(g_a, array_name); local_stop = MPI_Wtime(); time_pnga_set_array_name += local_stop - local_start; } void wnga_set_block_cyclic(Integer g_a, Integer *dims) { double local_start, local_stop; ++count_pnga_set_block_cyclic; local_start = MPI_Wtime(); pnga_set_block_cyclic(g_a, dims); local_stop = MPI_Wtime(); time_pnga_set_block_cyclic += local_stop - local_start; } void wnga_set_block_cyclic_proc_grid(Integer g_a, Integer *dims, Integer *proc_grid) { double local_start, local_stop; ++count_pnga_set_block_cyclic_proc_grid; local_start = MPI_Wtime(); pnga_set_block_cyclic_proc_grid(g_a, dims, proc_grid); local_stop = MPI_Wtime(); time_pnga_set_block_cyclic_proc_grid += local_stop - local_start; } void wnga_set_chunk(Integer g_a, Integer *chunk) { double local_start, local_stop; ++count_pnga_set_chunk; local_start = MPI_Wtime(); pnga_set_chunk(g_a, chunk); local_stop = MPI_Wtime(); time_pnga_set_chunk += local_stop - local_start; } void wnga_set_data(Integer g_a, Integer ndim, Integer *dims, Integer type) { double local_start, local_stop; ++count_pnga_set_data; local_start = MPI_Wtime(); pnga_set_data(g_a, ndim, dims, type); local_stop = MPI_Wtime(); time_pnga_set_data += local_stop - local_start; } void wnga_set_debug(logical flag) { double local_start, local_stop; ++count_pnga_set_debug; local_start = MPI_Wtime(); pnga_set_debug(flag); local_stop = MPI_Wtime(); time_pnga_set_debug += local_stop - local_start; } void wnga_set_diagonal(Integer g_a, Integer g_v) { double local_start, local_stop; ++count_pnga_set_diagonal; local_start = MPI_Wtime(); pnga_set_diagonal(g_a, g_v); local_stop = MPI_Wtime(); time_pnga_set_diagonal += local_stop - local_start; } void wnga_set_ghost_corner_flag(Integer g_a, logical flag) { double local_start, local_stop; ++count_pnga_set_ghost_corner_flag; local_start = MPI_Wtime(); pnga_set_ghost_corner_flag(g_a, flag); local_stop = MPI_Wtime(); time_pnga_set_ghost_corner_flag += local_stop - local_start; } logical wnga_set_ghost_info(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_set_ghost_info; local_start = MPI_Wtime(); return_value = pnga_set_ghost_info(g_a); local_stop = MPI_Wtime(); time_pnga_set_ghost_info += local_stop - local_start; return return_value; } void wnga_set_ghosts(Integer g_a, Integer *width) { double local_start, local_stop; ++count_pnga_set_ghosts; local_start = MPI_Wtime(); pnga_set_ghosts(g_a, width); local_stop = MPI_Wtime(); time_pnga_set_ghosts += local_stop - local_start; } void wnga_set_irreg_distr(Integer g_a, Integer *map, Integer *block) { double local_start, local_stop; ++count_pnga_set_irreg_distr; local_start = MPI_Wtime(); pnga_set_irreg_distr(g_a, map, block); local_stop = MPI_Wtime(); time_pnga_set_irreg_distr += local_stop - local_start; } void wnga_set_irreg_flag(Integer g_a, logical flag) { double local_start, local_stop; ++count_pnga_set_irreg_flag; local_start = MPI_Wtime(); pnga_set_irreg_flag(g_a, flag); local_stop = MPI_Wtime(); time_pnga_set_irreg_flag += local_stop - local_start; } void wnga_set_memory_limit(Integer mem_limit) { double local_start, local_stop; ++count_pnga_set_memory_limit; local_start = MPI_Wtime(); pnga_set_memory_limit(mem_limit); local_stop = MPI_Wtime(); time_pnga_set_memory_limit += local_stop - local_start; } void wnga_set_pgroup(Integer g_a, Integer p_handle) { double local_start, local_stop; ++count_pnga_set_pgroup; local_start = MPI_Wtime(); pnga_set_pgroup(g_a, p_handle); local_stop = MPI_Wtime(); time_pnga_set_pgroup += local_stop - local_start; } void wnga_set_restricted(Integer g_a, Integer *list, Integer size) { double local_start, local_stop; ++count_pnga_set_restricted; local_start = MPI_Wtime(); pnga_set_restricted(g_a, list, size); local_stop = MPI_Wtime(); time_pnga_set_restricted += local_stop - local_start; } void wnga_set_restricted_range(Integer g_a, Integer lo_proc, Integer hi_proc) { double local_start, local_stop; ++count_pnga_set_restricted_range; local_start = MPI_Wtime(); pnga_set_restricted_range(g_a, lo_proc, hi_proc); local_stop = MPI_Wtime(); time_pnga_set_restricted_range += local_stop - local_start; } logical wnga_set_update4_info(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_set_update4_info; local_start = MPI_Wtime(); return_value = pnga_set_update4_info(g_a); local_stop = MPI_Wtime(); time_pnga_set_update4_info += local_stop - local_start; return return_value; } logical wnga_set_update5_info(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_set_update5_info; local_start = MPI_Wtime(); return_value = pnga_set_update5_info(g_a); local_stop = MPI_Wtime(); time_pnga_set_update5_info += local_stop - local_start; return return_value; } void wnga_shift_diagonal(Integer g_a, void *c) { double local_start, local_stop; ++count_pnga_shift_diagonal; local_start = MPI_Wtime(); pnga_shift_diagonal(g_a, c); local_stop = MPI_Wtime(); time_pnga_shift_diagonal += local_stop - local_start; } Integer wnga_solve(Integer g_a, Integer g_b) { Integer return_value; double local_start, local_stop; ++count_pnga_solve; local_start = MPI_Wtime(); return_value = pnga_solve(g_a, g_b); local_stop = MPI_Wtime(); time_pnga_solve += local_stop - local_start; return return_value; } Integer wnga_spd_invert(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_spd_invert; local_start = MPI_Wtime(); return_value = pnga_spd_invert(g_a); local_stop = MPI_Wtime(); time_pnga_spd_invert += local_stop - local_start; return return_value; } void wnga_step_bound_info(Integer g_xx, Integer g_vv, Integer g_xxll, Integer g_xxuu, void *boundmin, void *wolfemin, void *boundmax) { double local_start, local_stop; ++count_pnga_step_bound_info; local_start = MPI_Wtime(); pnga_step_bound_info(g_xx, g_vv, g_xxll, g_xxuu, boundmin, wolfemin, boundmax); local_stop = MPI_Wtime(); time_pnga_step_bound_info += local_stop - local_start; } void wnga_step_bound_info_patch(Integer g_xx, Integer *xxlo, Integer *xxhi, Integer g_vv, Integer *vvlo, Integer *vvhi, Integer g_xxll, Integer *xxlllo, Integer *xxllhi, Integer g_xxuu, Integer *xxuulo, Integer *xxuuhi, void *boundmin, void *wolfemin, void *boundmax) { double local_start, local_stop; ++count_pnga_step_bound_info_patch; local_start = MPI_Wtime(); pnga_step_bound_info_patch(g_xx, xxlo, xxhi, g_vv, vvlo, vvhi, g_xxll, xxlllo, xxllhi, g_xxuu, xxuulo, xxuuhi, boundmin, wolfemin, boundmax); local_stop = MPI_Wtime(); time_pnga_step_bound_info_patch += local_stop - local_start; } void wnga_step_mask_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, Integer g_c, Integer *clo, Integer *chi) { double local_start, local_stop; ++count_pnga_step_mask_patch; local_start = MPI_Wtime(); pnga_step_mask_patch(g_a, alo, ahi, g_b, blo, bhi, g_c, clo, chi); local_stop = MPI_Wtime(); time_pnga_step_mask_patch += local_stop - local_start; } void wnga_step_max(Integer g_a, Integer g_b, void *retval) { double local_start, local_stop; ++count_pnga_step_max; local_start = MPI_Wtime(); pnga_step_max(g_a, g_b, retval); local_stop = MPI_Wtime(); time_pnga_step_max += local_stop - local_start; } void wnga_step_max_patch(Integer g_a, Integer *alo, Integer *ahi, Integer g_b, Integer *blo, Integer *bhi, void *result) { double local_start, local_stop; ++count_pnga_step_max_patch; local_start = MPI_Wtime(); pnga_step_max_patch(g_a, alo, ahi, g_b, blo, bhi, result); local_stop = MPI_Wtime(); time_pnga_step_max_patch += local_stop - local_start; } void wnga_strided_acc(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld, void *alpha) { double local_start, local_stop; ++count_pnga_strided_acc; local_start = MPI_Wtime(); pnga_strided_acc(g_a, lo, hi, skip, buf, ld, alpha); local_stop = MPI_Wtime(); time_pnga_strided_acc += local_stop - local_start; } void wnga_strided_get(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_strided_get; local_start = MPI_Wtime(); pnga_strided_get(g_a, lo, hi, skip, buf, ld); local_stop = MPI_Wtime(); time_pnga_strided_get += local_stop - local_start; } void wnga_strided_put(Integer g_a, Integer *lo, Integer *hi, Integer *skip, void *buf, Integer *ld) { double local_start, local_stop; ++count_pnga_strided_put; local_start = MPI_Wtime(); pnga_strided_put(g_a, lo, hi, skip, buf, ld); local_stop = MPI_Wtime(); time_pnga_strided_put += local_stop - local_start; } void wnga_summarize(Integer verbose) { double local_start, local_stop; ++count_pnga_summarize; local_start = MPI_Wtime(); pnga_summarize(verbose); local_stop = MPI_Wtime(); time_pnga_summarize += local_stop - local_start; } void wnga_symmetrize(Integer g_a) { double local_start, local_stop; ++count_pnga_symmetrize; local_start = MPI_Wtime(); pnga_symmetrize(g_a); local_stop = MPI_Wtime(); time_pnga_symmetrize += local_stop - local_start; } void wnga_sync() { double local_start, local_stop; ++count_pnga_sync; local_start = MPI_Wtime(); pnga_sync(); local_stop = MPI_Wtime(); time_pnga_sync += local_stop - local_start; } double wnga_timer() { double return_value; double local_start, local_stop; ++count_pnga_timer; local_start = MPI_Wtime(); return_value = pnga_timer(); local_stop = MPI_Wtime(); time_pnga_timer += local_stop - local_start; return return_value; } Integer wnga_total_blocks(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_total_blocks; local_start = MPI_Wtime(); return_value = pnga_total_blocks(g_a); local_stop = MPI_Wtime(); time_pnga_total_blocks += local_stop - local_start; return return_value; } void wnga_transpose(Integer g_a, Integer g_b) { double local_start, local_stop; ++count_pnga_transpose; local_start = MPI_Wtime(); pnga_transpose(g_a, g_b); local_stop = MPI_Wtime(); time_pnga_transpose += local_stop - local_start; } Integer wnga_type_c2f(Integer type) { Integer return_value; double local_start, local_stop; ++count_pnga_type_c2f; local_start = MPI_Wtime(); return_value = pnga_type_c2f(type); local_stop = MPI_Wtime(); time_pnga_type_c2f += local_stop - local_start; return return_value; } Integer wnga_type_f2c(Integer type) { Integer return_value; double local_start, local_stop; ++count_pnga_type_f2c; local_start = MPI_Wtime(); return_value = pnga_type_f2c(type); local_stop = MPI_Wtime(); time_pnga_type_f2c += local_stop - local_start; return return_value; } void wnga_unlock(Integer mutex) { double local_start, local_stop; ++count_pnga_unlock; local_start = MPI_Wtime(); pnga_unlock(mutex); local_stop = MPI_Wtime(); time_pnga_unlock += local_stop - local_start; } void wnga_unpack(Integer g_a, Integer g_b, Integer g_sbit, Integer lo, Integer hi, Integer *icount) { double local_start, local_stop; ++count_pnga_unpack; local_start = MPI_Wtime(); pnga_unpack(g_a, g_b, g_sbit, lo, hi, icount); local_stop = MPI_Wtime(); time_pnga_unpack += local_stop - local_start; } void wnga_update1_ghosts(Integer g_a) { double local_start, local_stop; ++count_pnga_update1_ghosts; local_start = MPI_Wtime(); pnga_update1_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update1_ghosts += local_stop - local_start; } logical wnga_update2_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update2_ghosts; local_start = MPI_Wtime(); return_value = pnga_update2_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update2_ghosts += local_stop - local_start; return return_value; } logical wnga_update3_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update3_ghosts; local_start = MPI_Wtime(); return_value = pnga_update3_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update3_ghosts += local_stop - local_start; return return_value; } logical wnga_update44_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update44_ghosts; local_start = MPI_Wtime(); return_value = pnga_update44_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update44_ghosts += local_stop - local_start; return return_value; } logical wnga_update4_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update4_ghosts; local_start = MPI_Wtime(); return_value = pnga_update4_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update4_ghosts += local_stop - local_start; return return_value; } logical wnga_update55_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update55_ghosts; local_start = MPI_Wtime(); return_value = pnga_update55_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update55_ghosts += local_stop - local_start; return return_value; } logical wnga_update5_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update5_ghosts; local_start = MPI_Wtime(); return_value = pnga_update5_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update5_ghosts += local_stop - local_start; return return_value; } logical wnga_update6_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update6_ghosts; local_start = MPI_Wtime(); return_value = pnga_update6_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update6_ghosts += local_stop - local_start; return return_value; } logical wnga_update7_ghosts(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_update7_ghosts; local_start = MPI_Wtime(); return_value = pnga_update7_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update7_ghosts += local_stop - local_start; return return_value; } logical wnga_update_ghost_dir(Integer g_a, Integer pdim, Integer pdir, logical pflag) { logical return_value; double local_start, local_stop; ++count_pnga_update_ghost_dir; local_start = MPI_Wtime(); return_value = pnga_update_ghost_dir(g_a, pdim, pdir, pflag); local_stop = MPI_Wtime(); time_pnga_update_ghost_dir += local_stop - local_start; return return_value; } void wnga_update_ghosts(Integer g_a) { double local_start, local_stop; ++count_pnga_update_ghosts; local_start = MPI_Wtime(); pnga_update_ghosts(g_a); local_stop = MPI_Wtime(); time_pnga_update_ghosts += local_stop - local_start; } logical wnga_uses_ma() { logical return_value; double local_start, local_stop; ++count_pnga_uses_ma; local_start = MPI_Wtime(); return_value = pnga_uses_ma(); local_stop = MPI_Wtime(); time_pnga_uses_ma += local_stop - local_start; return return_value; } logical wnga_uses_proc_grid(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_uses_proc_grid; local_start = MPI_Wtime(); return_value = pnga_uses_proc_grid(g_a); local_stop = MPI_Wtime(); time_pnga_uses_proc_grid += local_stop - local_start; return return_value; } logical wnga_valid_handle(Integer g_a) { logical return_value; double local_start, local_stop; ++count_pnga_valid_handle; local_start = MPI_Wtime(); return_value = pnga_valid_handle(g_a); local_stop = MPI_Wtime(); time_pnga_valid_handle += local_stop - local_start; return return_value; } Integer wnga_verify_handle(Integer g_a) { Integer return_value; double local_start, local_stop; ++count_pnga_verify_handle; local_start = MPI_Wtime(); return_value = pnga_verify_handle(g_a); local_stop = MPI_Wtime(); time_pnga_verify_handle += local_stop - local_start; return return_value; } DoublePrecision wnga_wtime() { DoublePrecision return_value; double local_start, local_stop; ++count_pnga_wtime; local_start = MPI_Wtime(); return_value = pnga_wtime(); local_stop = MPI_Wtime(); time_pnga_wtime += local_stop - local_start; return return_value; } void wnga_zero(Integer g_a) { double local_start, local_stop; ++count_pnga_zero; local_start = MPI_Wtime(); pnga_zero(g_a); local_stop = MPI_Wtime(); time_pnga_zero += local_stop - local_start; } void wnga_zero_diagonal(Integer g_a) { double local_start, local_stop; ++count_pnga_zero_diagonal; local_start = MPI_Wtime(); pnga_zero_diagonal(g_a); local_stop = MPI_Wtime(); time_pnga_zero_diagonal += local_stop - local_start; } void wnga_zero_patch(Integer g_a, Integer *lo, Integer *hi) { double local_start, local_stop; ++count_pnga_zero_patch; local_start = MPI_Wtime(); pnga_zero_patch(g_a, lo, hi); local_stop = MPI_Wtime(); time_pnga_zero_patch += local_stop - local_start; } void wnga_initialize() { ++count_pnga_initialize; pnga_initialize(); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); } void wnga_initialize_ltd(Integer limit) { ++count_pnga_initialize_ltd; pnga_initialize_ltd(limit); MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); } void wnga_terminate() { ++count_pnga_terminate; pnga_terminate(); /* don't dump info if terminate more than once */ if (1 == count_pnga_terminate) { double recvbuf = 0.0; MPI_Reduce(&time_pnga_abs_value, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_abs_value,%ld,%lf\n", count_pnga_abs_value, recvbuf); } MPI_Reduce(&time_pnga_abs_value_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_abs_value_patch,%ld,%lf\n", count_pnga_abs_value_patch, recvbuf); } MPI_Reduce(&time_pnga_acc, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_acc,%ld,%lf\n", count_pnga_acc, recvbuf); } MPI_Reduce(&time_pnga_access_block_grid_idx, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_grid_idx,%ld,%lf\n", count_pnga_access_block_grid_idx, recvbuf); } MPI_Reduce(&time_pnga_access_block_grid_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_grid_ptr,%ld,%lf\n", count_pnga_access_block_grid_ptr, recvbuf); } MPI_Reduce(&time_pnga_access_block_idx, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_idx,%ld,%lf\n", count_pnga_access_block_idx, recvbuf); } MPI_Reduce(&time_pnga_access_block_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_ptr,%ld,%lf\n", count_pnga_access_block_ptr, recvbuf); } MPI_Reduce(&time_pnga_access_block_segment_idx, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_segment_idx,%ld,%lf\n", count_pnga_access_block_segment_idx, recvbuf); } MPI_Reduce(&time_pnga_access_block_segment_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_block_segment_ptr,%ld,%lf\n", count_pnga_access_block_segment_ptr, recvbuf); } MPI_Reduce(&time_pnga_access_ghost_element, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_ghost_element,%ld,%lf\n", count_pnga_access_ghost_element, recvbuf); } MPI_Reduce(&time_pnga_access_ghost_element_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_ghost_element_ptr,%ld,%lf\n", count_pnga_access_ghost_element_ptr, recvbuf); } MPI_Reduce(&time_pnga_access_ghost_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_ghost_ptr,%ld,%lf\n", count_pnga_access_ghost_ptr, recvbuf); } MPI_Reduce(&time_pnga_access_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_ghosts,%ld,%lf\n", count_pnga_access_ghosts, recvbuf); } MPI_Reduce(&time_pnga_access_idx, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_idx,%ld,%lf\n", count_pnga_access_idx, recvbuf); } MPI_Reduce(&time_pnga_access_ptr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_access_ptr,%ld,%lf\n", count_pnga_access_ptr, recvbuf); } MPI_Reduce(&time_pnga_add, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_add,%ld,%lf\n", count_pnga_add, recvbuf); } MPI_Reduce(&time_pnga_add_constant, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_add_constant,%ld,%lf\n", count_pnga_add_constant, recvbuf); } MPI_Reduce(&time_pnga_add_constant_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_add_constant_patch,%ld,%lf\n", count_pnga_add_constant_patch, recvbuf); } MPI_Reduce(&time_pnga_add_diagonal, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_add_diagonal,%ld,%lf\n", count_pnga_add_diagonal, recvbuf); } MPI_Reduce(&time_pnga_add_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_add_patch,%ld,%lf\n", count_pnga_add_patch, recvbuf); } MPI_Reduce(&time_pnga_allocate, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_allocate,%ld,%lf\n", count_pnga_allocate, recvbuf); } MPI_Reduce(&time_pnga_bin_index, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_bin_index,%ld,%lf\n", count_pnga_bin_index, recvbuf); } MPI_Reduce(&time_pnga_bin_sorter, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_bin_sorter,%ld,%lf\n", count_pnga_bin_sorter, recvbuf); } MPI_Reduce(&time_pnga_brdcst, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_brdcst,%ld,%lf\n", count_pnga_brdcst, recvbuf); } MPI_Reduce(&time_pnga_check_handle, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_check_handle,%ld,%lf\n", count_pnga_check_handle, recvbuf); } MPI_Reduce(&time_pnga_cluster_nnodes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_cluster_nnodes,%ld,%lf\n", count_pnga_cluster_nnodes, recvbuf); } MPI_Reduce(&time_pnga_cluster_nodeid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_cluster_nodeid,%ld,%lf\n", count_pnga_cluster_nodeid, recvbuf); } MPI_Reduce(&time_pnga_cluster_nprocs, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_cluster_nprocs,%ld,%lf\n", count_pnga_cluster_nprocs, recvbuf); } MPI_Reduce(&time_pnga_cluster_proc_nodeid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_cluster_proc_nodeid,%ld,%lf\n", count_pnga_cluster_proc_nodeid, recvbuf); } MPI_Reduce(&time_pnga_cluster_procid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_cluster_procid,%ld,%lf\n", count_pnga_cluster_procid, recvbuf); } MPI_Reduce(&time_pnga_comp_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_comp_patch,%ld,%lf\n", count_pnga_comp_patch, recvbuf); } MPI_Reduce(&time_pnga_compare_distr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_compare_distr,%ld,%lf\n", count_pnga_compare_distr, recvbuf); } MPI_Reduce(&time_pnga_copy, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_copy,%ld,%lf\n", count_pnga_copy, recvbuf); } MPI_Reduce(&time_pnga_copy_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_copy_patch,%ld,%lf\n", count_pnga_copy_patch, recvbuf); } MPI_Reduce(&time_pnga_copy_patch_dp, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_copy_patch_dp,%ld,%lf\n", count_pnga_copy_patch_dp, recvbuf); } MPI_Reduce(&time_pnga_create, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create,%ld,%lf\n", count_pnga_create, recvbuf); } MPI_Reduce(&time_pnga_create_bin_range, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_bin_range,%ld,%lf\n", count_pnga_create_bin_range, recvbuf); } MPI_Reduce(&time_pnga_create_config, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_config,%ld,%lf\n", count_pnga_create_config, recvbuf); } MPI_Reduce(&time_pnga_create_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_ghosts,%ld,%lf\n", count_pnga_create_ghosts, recvbuf); } MPI_Reduce(&time_pnga_create_ghosts_config, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_ghosts_config,%ld,%lf\n", count_pnga_create_ghosts_config, recvbuf); } MPI_Reduce(&time_pnga_create_ghosts_irreg, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_ghosts_irreg,%ld,%lf\n", count_pnga_create_ghosts_irreg, recvbuf); } MPI_Reduce(&time_pnga_create_ghosts_irreg_config, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_ghosts_irreg_config,%ld,%lf\n", count_pnga_create_ghosts_irreg_config, recvbuf); } MPI_Reduce(&time_pnga_create_handle, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_handle,%ld,%lf\n", count_pnga_create_handle, recvbuf); } MPI_Reduce(&time_pnga_create_irreg, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_irreg,%ld,%lf\n", count_pnga_create_irreg, recvbuf); } MPI_Reduce(&time_pnga_create_irreg_config, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_irreg_config,%ld,%lf\n", count_pnga_create_irreg_config, recvbuf); } MPI_Reduce(&time_pnga_create_mutexes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_create_mutexes,%ld,%lf\n", count_pnga_create_mutexes, recvbuf); } MPI_Reduce(&time_pnga_ddot_patch_dp, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_ddot_patch_dp,%ld,%lf\n", count_pnga_ddot_patch_dp, recvbuf); } MPI_Reduce(&time_pnga_deregister_type, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_deregister_type,%ld,%lf\n", count_pnga_deregister_type, recvbuf); } MPI_Reduce(&time_pnga_destroy, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_destroy,%ld,%lf\n", count_pnga_destroy, recvbuf); } MPI_Reduce(&time_pnga_destroy_mutexes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_destroy_mutexes,%ld,%lf\n", count_pnga_destroy_mutexes, recvbuf); } MPI_Reduce(&time_pnga_diag, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_diag,%ld,%lf\n", count_pnga_diag, recvbuf); } MPI_Reduce(&time_pnga_diag_reuse, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_diag_reuse,%ld,%lf\n", count_pnga_diag_reuse, recvbuf); } MPI_Reduce(&time_pnga_diag_seq, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_diag_seq,%ld,%lf\n", count_pnga_diag_seq, recvbuf); } MPI_Reduce(&time_pnga_diag_std, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_diag_std,%ld,%lf\n", count_pnga_diag_std, recvbuf); } MPI_Reduce(&time_pnga_diag_std_seq, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_diag_std_seq,%ld,%lf\n", count_pnga_diag_std_seq, recvbuf); } MPI_Reduce(&time_pnga_distribution, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_distribution,%ld,%lf\n", count_pnga_distribution, recvbuf); } MPI_Reduce(&time_pnga_dot, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_dot,%ld,%lf\n", count_pnga_dot, recvbuf); } MPI_Reduce(&time_pnga_dot_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_dot_patch,%ld,%lf\n", count_pnga_dot_patch, recvbuf); } MPI_Reduce(&time_pnga_duplicate, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_duplicate,%ld,%lf\n", count_pnga_duplicate, recvbuf); } MPI_Reduce(&time_pnga_elem_divide, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_divide,%ld,%lf\n", count_pnga_elem_divide, recvbuf); } MPI_Reduce(&time_pnga_elem_divide_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_divide_patch,%ld,%lf\n", count_pnga_elem_divide_patch, recvbuf); } MPI_Reduce(&time_pnga_elem_maximum, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_maximum,%ld,%lf\n", count_pnga_elem_maximum, recvbuf); } MPI_Reduce(&time_pnga_elem_maximum_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_maximum_patch,%ld,%lf\n", count_pnga_elem_maximum_patch, recvbuf); } MPI_Reduce(&time_pnga_elem_minimum, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_minimum,%ld,%lf\n", count_pnga_elem_minimum, recvbuf); } MPI_Reduce(&time_pnga_elem_minimum_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_minimum_patch,%ld,%lf\n", count_pnga_elem_minimum_patch, recvbuf); } MPI_Reduce(&time_pnga_elem_multiply, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_multiply,%ld,%lf\n", count_pnga_elem_multiply, recvbuf); } MPI_Reduce(&time_pnga_elem_multiply_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_multiply_patch,%ld,%lf\n", count_pnga_elem_multiply_patch, recvbuf); } MPI_Reduce(&time_pnga_elem_step_divide_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_step_divide_patch,%ld,%lf\n", count_pnga_elem_step_divide_patch, recvbuf); } MPI_Reduce(&time_pnga_elem_stepb_divide_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_elem_stepb_divide_patch,%ld,%lf\n", count_pnga_elem_stepb_divide_patch, recvbuf); } MPI_Reduce(&time_pnga_error, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_error,%ld,%lf\n", count_pnga_error, recvbuf); } MPI_Reduce(&time_pnga_fence, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_fence,%ld,%lf\n", count_pnga_fence, recvbuf); } MPI_Reduce(&time_pnga_fill, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_fill,%ld,%lf\n", count_pnga_fill, recvbuf); } MPI_Reduce(&time_pnga_fill_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_fill_patch,%ld,%lf\n", count_pnga_fill_patch, recvbuf); } MPI_Reduce(&time_pnga_gather, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_gather,%ld,%lf\n", count_pnga_gather, recvbuf); } MPI_Reduce(&time_pnga_gather2d, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_gather2d,%ld,%lf\n", count_pnga_gather2d, recvbuf); } MPI_Reduce(&time_pnga_get, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get,%ld,%lf\n", count_pnga_get, recvbuf); } MPI_Reduce(&time_pnga_get_block_info, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_block_info,%ld,%lf\n", count_pnga_get_block_info, recvbuf); } MPI_Reduce(&time_pnga_get_debug, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_debug,%ld,%lf\n", count_pnga_get_debug, recvbuf); } MPI_Reduce(&time_pnga_get_diag, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_diag,%ld,%lf\n", count_pnga_get_diag, recvbuf); } MPI_Reduce(&time_pnga_get_dimension, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_dimension,%ld,%lf\n", count_pnga_get_dimension, recvbuf); } MPI_Reduce(&time_pnga_get_field, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_field,%ld,%lf\n", count_pnga_get_field, recvbuf); } MPI_Reduce(&time_pnga_get_ghost_block, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_ghost_block,%ld,%lf\n", count_pnga_get_ghost_block, recvbuf); } MPI_Reduce(&time_pnga_get_pgroup, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_pgroup,%ld,%lf\n", count_pnga_get_pgroup, recvbuf); } MPI_Reduce(&time_pnga_get_pgroup_size, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_pgroup_size,%ld,%lf\n", count_pnga_get_pgroup_size, recvbuf); } MPI_Reduce(&time_pnga_get_proc_grid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_proc_grid,%ld,%lf\n", count_pnga_get_proc_grid, recvbuf); } MPI_Reduce(&time_pnga_get_proc_index, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_get_proc_index,%ld,%lf\n", count_pnga_get_proc_index, recvbuf); } MPI_Reduce(&time_pnga_ghost_barrier, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_ghost_barrier,%ld,%lf\n", count_pnga_ghost_barrier, recvbuf); } MPI_Reduce(&time_pnga_gop, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_gop,%ld,%lf\n", count_pnga_gop, recvbuf); } MPI_Reduce(&time_pnga_has_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_has_ghosts,%ld,%lf\n", count_pnga_has_ghosts, recvbuf); } MPI_Reduce(&time_pnga_init_fence, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_init_fence,%ld,%lf\n", count_pnga_init_fence, recvbuf); } MPI_Reduce(&time_pnga_initialize, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_initialize,%ld,%lf\n", count_pnga_initialize, recvbuf); } MPI_Reduce(&time_pnga_initialize_ltd, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_initialize_ltd,%ld,%lf\n", count_pnga_initialize_ltd, recvbuf); } MPI_Reduce(&time_pnga_inquire, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_inquire,%ld,%lf\n", count_pnga_inquire, recvbuf); } MPI_Reduce(&time_pnga_inquire_memory, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_inquire_memory,%ld,%lf\n", count_pnga_inquire_memory, recvbuf); } MPI_Reduce(&time_pnga_inquire_name, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_inquire_name,%ld,%lf\n", count_pnga_inquire_name, recvbuf); } MPI_Reduce(&time_pnga_inquire_type, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_inquire_type,%ld,%lf\n", count_pnga_inquire_type, recvbuf); } MPI_Reduce(&time_pnga_is_mirrored, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_is_mirrored,%ld,%lf\n", count_pnga_is_mirrored, recvbuf); } MPI_Reduce(&time_pnga_list_nodeid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_list_nodeid,%ld,%lf\n", count_pnga_list_nodeid, recvbuf); } MPI_Reduce(&time_pnga_llt_solve, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_llt_solve,%ld,%lf\n", count_pnga_llt_solve, recvbuf); } MPI_Reduce(&time_pnga_locate, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_locate,%ld,%lf\n", count_pnga_locate, recvbuf); } MPI_Reduce(&time_pnga_locate_nnodes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_locate_nnodes,%ld,%lf\n", count_pnga_locate_nnodes, recvbuf); } MPI_Reduce(&time_pnga_locate_num_blocks, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_locate_num_blocks,%ld,%lf\n", count_pnga_locate_num_blocks, recvbuf); } MPI_Reduce(&time_pnga_locate_region, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_locate_region,%ld,%lf\n", count_pnga_locate_region, recvbuf); } MPI_Reduce(&time_pnga_lock, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_lock,%ld,%lf\n", count_pnga_lock, recvbuf); } MPI_Reduce(&time_pnga_lu_solve, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_lu_solve,%ld,%lf\n", count_pnga_lu_solve, recvbuf); } MPI_Reduce(&time_pnga_lu_solve_alt, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_lu_solve_alt,%ld,%lf\n", count_pnga_lu_solve_alt, recvbuf); } MPI_Reduce(&time_pnga_lu_solve_seq, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_lu_solve_seq,%ld,%lf\n", count_pnga_lu_solve_seq, recvbuf); } MPI_Reduce(&time_pnga_mask_sync, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_mask_sync,%ld,%lf\n", count_pnga_mask_sync, recvbuf); } MPI_Reduce(&time_pnga_matmul, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_matmul,%ld,%lf\n", count_pnga_matmul, recvbuf); } MPI_Reduce(&time_pnga_matmul_mirrored, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_matmul_mirrored,%ld,%lf\n", count_pnga_matmul_mirrored, recvbuf); } MPI_Reduce(&time_pnga_matmul_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_matmul_patch,%ld,%lf\n", count_pnga_matmul_patch, recvbuf); } MPI_Reduce(&time_pnga_median, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_median,%ld,%lf\n", count_pnga_median, recvbuf); } MPI_Reduce(&time_pnga_median_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_median_patch,%ld,%lf\n", count_pnga_median_patch, recvbuf); } MPI_Reduce(&time_pnga_memory_avail, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_memory_avail,%ld,%lf\n", count_pnga_memory_avail, recvbuf); } MPI_Reduce(&time_pnga_memory_avail_type, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_memory_avail_type,%ld,%lf\n", count_pnga_memory_avail_type, recvbuf); } MPI_Reduce(&time_pnga_memory_limited, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_memory_limited,%ld,%lf\n", count_pnga_memory_limited, recvbuf); } MPI_Reduce(&time_pnga_merge_distr_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_merge_distr_patch,%ld,%lf\n", count_pnga_merge_distr_patch, recvbuf); } MPI_Reduce(&time_pnga_merge_mirrored, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_merge_mirrored,%ld,%lf\n", count_pnga_merge_mirrored, recvbuf); } MPI_Reduce(&time_pnga_msg_brdcst, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_msg_brdcst,%ld,%lf\n", count_pnga_msg_brdcst, recvbuf); } MPI_Reduce(&time_pnga_msg_pgroup_sync, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_msg_pgroup_sync,%ld,%lf\n", count_pnga_msg_pgroup_sync, recvbuf); } MPI_Reduce(&time_pnga_msg_sync, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_msg_sync,%ld,%lf\n", count_pnga_msg_sync, recvbuf); } MPI_Reduce(&time_pnga_nbacc, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbacc,%ld,%lf\n", count_pnga_nbacc, recvbuf); } MPI_Reduce(&time_pnga_nbget, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbget,%ld,%lf\n", count_pnga_nbget, recvbuf); } MPI_Reduce(&time_pnga_nbget_field, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbget_field,%ld,%lf\n", count_pnga_nbget_field, recvbuf); } MPI_Reduce(&time_pnga_nbget_ghost_dir, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbget_ghost_dir,%ld,%lf\n", count_pnga_nbget_ghost_dir, recvbuf); } MPI_Reduce(&time_pnga_nblock, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nblock,%ld,%lf\n", count_pnga_nblock, recvbuf); } MPI_Reduce(&time_pnga_nbput, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbput,%ld,%lf\n", count_pnga_nbput, recvbuf); } MPI_Reduce(&time_pnga_nbput_field, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbput_field,%ld,%lf\n", count_pnga_nbput_field, recvbuf); } MPI_Reduce(&time_pnga_nbtest, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbtest,%ld,%lf\n", count_pnga_nbtest, recvbuf); } MPI_Reduce(&time_pnga_nbwait, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nbwait,%ld,%lf\n", count_pnga_nbwait, recvbuf); } MPI_Reduce(&time_pnga_ndim, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_ndim,%ld,%lf\n", count_pnga_ndim, recvbuf); } MPI_Reduce(&time_pnga_nnodes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nnodes,%ld,%lf\n", count_pnga_nnodes, recvbuf); } MPI_Reduce(&time_pnga_nodeid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_nodeid,%ld,%lf\n", count_pnga_nodeid, recvbuf); } MPI_Reduce(&time_pnga_norm1, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_norm1,%ld,%lf\n", count_pnga_norm1, recvbuf); } MPI_Reduce(&time_pnga_norm_infinity, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_norm_infinity,%ld,%lf\n", count_pnga_norm_infinity, recvbuf); } MPI_Reduce(&time_pnga_pack, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pack,%ld,%lf\n", count_pnga_pack, recvbuf); } MPI_Reduce(&time_pnga_patch_enum, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_patch_enum,%ld,%lf\n", count_pnga_patch_enum, recvbuf); } MPI_Reduce(&time_pnga_patch_intersect, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_patch_intersect,%ld,%lf\n", count_pnga_patch_intersect, recvbuf); } MPI_Reduce(&time_pnga_periodic, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_periodic,%ld,%lf\n", count_pnga_periodic, recvbuf); } MPI_Reduce(&time_pnga_pgroup_absolute_id, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_absolute_id,%ld,%lf\n", count_pnga_pgroup_absolute_id, recvbuf); } MPI_Reduce(&time_pnga_pgroup_brdcst, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_brdcst,%ld,%lf\n", count_pnga_pgroup_brdcst, recvbuf); } MPI_Reduce(&time_pnga_pgroup_create, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_create,%ld,%lf\n", count_pnga_pgroup_create, recvbuf); } MPI_Reduce(&time_pnga_pgroup_destroy, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_destroy,%ld,%lf\n", count_pnga_pgroup_destroy, recvbuf); } MPI_Reduce(&time_pnga_pgroup_get_default, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_get_default,%ld,%lf\n", count_pnga_pgroup_get_default, recvbuf); } MPI_Reduce(&time_pnga_pgroup_get_mirror, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_get_mirror,%ld,%lf\n", count_pnga_pgroup_get_mirror, recvbuf); } MPI_Reduce(&time_pnga_pgroup_get_world, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_get_world,%ld,%lf\n", count_pnga_pgroup_get_world, recvbuf); } MPI_Reduce(&time_pnga_pgroup_gop, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_gop,%ld,%lf\n", count_pnga_pgroup_gop, recvbuf); } MPI_Reduce(&time_pnga_pgroup_nnodes, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_nnodes,%ld,%lf\n", count_pnga_pgroup_nnodes, recvbuf); } MPI_Reduce(&time_pnga_pgroup_nodeid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_nodeid,%ld,%lf\n", count_pnga_pgroup_nodeid, recvbuf); } MPI_Reduce(&time_pnga_pgroup_set_default, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_set_default,%ld,%lf\n", count_pnga_pgroup_set_default, recvbuf); } MPI_Reduce(&time_pnga_pgroup_split, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_split,%ld,%lf\n", count_pnga_pgroup_split, recvbuf); } MPI_Reduce(&time_pnga_pgroup_split_irreg, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_split_irreg,%ld,%lf\n", count_pnga_pgroup_split_irreg, recvbuf); } MPI_Reduce(&time_pnga_pgroup_sync, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_pgroup_sync,%ld,%lf\n", count_pnga_pgroup_sync, recvbuf); } MPI_Reduce(&time_pnga_print, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print,%ld,%lf\n", count_pnga_print, recvbuf); } MPI_Reduce(&time_pnga_print_distribution, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_distribution,%ld,%lf\n", count_pnga_print_distribution, recvbuf); } MPI_Reduce(&time_pnga_print_file, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_file,%ld,%lf\n", count_pnga_print_file, recvbuf); } MPI_Reduce(&time_pnga_print_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_patch,%ld,%lf\n", count_pnga_print_patch, recvbuf); } MPI_Reduce(&time_pnga_print_patch2d, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_patch2d,%ld,%lf\n", count_pnga_print_patch2d, recvbuf); } MPI_Reduce(&time_pnga_print_patch_file, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_patch_file,%ld,%lf\n", count_pnga_print_patch_file, recvbuf); } MPI_Reduce(&time_pnga_print_patch_file2d, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_patch_file2d,%ld,%lf\n", count_pnga_print_patch_file2d, recvbuf); } MPI_Reduce(&time_pnga_print_stats, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_print_stats,%ld,%lf\n", count_pnga_print_stats, recvbuf); } MPI_Reduce(&time_pnga_proc_topology, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_proc_topology,%ld,%lf\n", count_pnga_proc_topology, recvbuf); } MPI_Reduce(&time_pnga_put, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_put,%ld,%lf\n", count_pnga_put, recvbuf); } MPI_Reduce(&time_pnga_put_field, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_put_field,%ld,%lf\n", count_pnga_put_field, recvbuf); } MPI_Reduce(&time_pnga_randomize, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_randomize,%ld,%lf\n", count_pnga_randomize, recvbuf); } MPI_Reduce(&time_pnga_read_inc, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_read_inc,%ld,%lf\n", count_pnga_read_inc, recvbuf); } MPI_Reduce(&time_pnga_recip, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_recip,%ld,%lf\n", count_pnga_recip, recvbuf); } MPI_Reduce(&time_pnga_recip_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_recip_patch,%ld,%lf\n", count_pnga_recip_patch, recvbuf); } MPI_Reduce(&time_pnga_register_type, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_register_type,%ld,%lf\n", count_pnga_register_type, recvbuf); } MPI_Reduce(&time_pnga_release, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release,%ld,%lf\n", count_pnga_release, recvbuf); } MPI_Reduce(&time_pnga_release_block, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_block,%ld,%lf\n", count_pnga_release_block, recvbuf); } MPI_Reduce(&time_pnga_release_block_grid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_block_grid,%ld,%lf\n", count_pnga_release_block_grid, recvbuf); } MPI_Reduce(&time_pnga_release_block_segment, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_block_segment,%ld,%lf\n", count_pnga_release_block_segment, recvbuf); } MPI_Reduce(&time_pnga_release_ghost_element, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_ghost_element,%ld,%lf\n", count_pnga_release_ghost_element, recvbuf); } MPI_Reduce(&time_pnga_release_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_ghosts,%ld,%lf\n", count_pnga_release_ghosts, recvbuf); } MPI_Reduce(&time_pnga_release_update, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update,%ld,%lf\n", count_pnga_release_update, recvbuf); } MPI_Reduce(&time_pnga_release_update_block, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update_block,%ld,%lf\n", count_pnga_release_update_block, recvbuf); } MPI_Reduce(&time_pnga_release_update_block_grid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update_block_grid,%ld,%lf\n", count_pnga_release_update_block_grid, recvbuf); } MPI_Reduce(&time_pnga_release_update_block_segment, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update_block_segment,%ld,%lf\n", count_pnga_release_update_block_segment, recvbuf); } MPI_Reduce(&time_pnga_release_update_ghost_element, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update_ghost_element,%ld,%lf\n", count_pnga_release_update_ghost_element, recvbuf); } MPI_Reduce(&time_pnga_release_update_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_release_update_ghosts,%ld,%lf\n", count_pnga_release_update_ghosts, recvbuf); } MPI_Reduce(&time_pnga_scale, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scale,%ld,%lf\n", count_pnga_scale, recvbuf); } MPI_Reduce(&time_pnga_scale_cols, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scale_cols,%ld,%lf\n", count_pnga_scale_cols, recvbuf); } MPI_Reduce(&time_pnga_scale_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scale_patch,%ld,%lf\n", count_pnga_scale_patch, recvbuf); } MPI_Reduce(&time_pnga_scale_rows, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scale_rows,%ld,%lf\n", count_pnga_scale_rows, recvbuf); } MPI_Reduce(&time_pnga_scan_add, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scan_add,%ld,%lf\n", count_pnga_scan_add, recvbuf); } MPI_Reduce(&time_pnga_scan_copy, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scan_copy,%ld,%lf\n", count_pnga_scan_copy, recvbuf); } MPI_Reduce(&time_pnga_scatter, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scatter,%ld,%lf\n", count_pnga_scatter, recvbuf); } MPI_Reduce(&time_pnga_scatter2d, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scatter2d,%ld,%lf\n", count_pnga_scatter2d, recvbuf); } MPI_Reduce(&time_pnga_scatter_acc, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scatter_acc,%ld,%lf\n", count_pnga_scatter_acc, recvbuf); } MPI_Reduce(&time_pnga_scatter_acc2d, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_scatter_acc2d,%ld,%lf\n", count_pnga_scatter_acc2d, recvbuf); } MPI_Reduce(&time_pnga_select_elem, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_select_elem,%ld,%lf\n", count_pnga_select_elem, recvbuf); } MPI_Reduce(&time_pnga_set_array_name, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_array_name,%ld,%lf\n", count_pnga_set_array_name, recvbuf); } MPI_Reduce(&time_pnga_set_block_cyclic, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_block_cyclic,%ld,%lf\n", count_pnga_set_block_cyclic, recvbuf); } MPI_Reduce(&time_pnga_set_block_cyclic_proc_grid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_block_cyclic_proc_grid,%ld,%lf\n", count_pnga_set_block_cyclic_proc_grid, recvbuf); } MPI_Reduce(&time_pnga_set_chunk, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_chunk,%ld,%lf\n", count_pnga_set_chunk, recvbuf); } MPI_Reduce(&time_pnga_set_data, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_data,%ld,%lf\n", count_pnga_set_data, recvbuf); } MPI_Reduce(&time_pnga_set_debug, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_debug,%ld,%lf\n", count_pnga_set_debug, recvbuf); } MPI_Reduce(&time_pnga_set_diagonal, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_diagonal,%ld,%lf\n", count_pnga_set_diagonal, recvbuf); } MPI_Reduce(&time_pnga_set_ghost_corner_flag, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_ghost_corner_flag,%ld,%lf\n", count_pnga_set_ghost_corner_flag, recvbuf); } MPI_Reduce(&time_pnga_set_ghost_info, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_ghost_info,%ld,%lf\n", count_pnga_set_ghost_info, recvbuf); } MPI_Reduce(&time_pnga_set_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_ghosts,%ld,%lf\n", count_pnga_set_ghosts, recvbuf); } MPI_Reduce(&time_pnga_set_irreg_distr, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_irreg_distr,%ld,%lf\n", count_pnga_set_irreg_distr, recvbuf); } MPI_Reduce(&time_pnga_set_irreg_flag, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_irreg_flag,%ld,%lf\n", count_pnga_set_irreg_flag, recvbuf); } MPI_Reduce(&time_pnga_set_memory_limit, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_memory_limit,%ld,%lf\n", count_pnga_set_memory_limit, recvbuf); } MPI_Reduce(&time_pnga_set_pgroup, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_pgroup,%ld,%lf\n", count_pnga_set_pgroup, recvbuf); } MPI_Reduce(&time_pnga_set_restricted, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_restricted,%ld,%lf\n", count_pnga_set_restricted, recvbuf); } MPI_Reduce(&time_pnga_set_restricted_range, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_restricted_range,%ld,%lf\n", count_pnga_set_restricted_range, recvbuf); } MPI_Reduce(&time_pnga_set_update4_info, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_update4_info,%ld,%lf\n", count_pnga_set_update4_info, recvbuf); } MPI_Reduce(&time_pnga_set_update5_info, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_set_update5_info,%ld,%lf\n", count_pnga_set_update5_info, recvbuf); } MPI_Reduce(&time_pnga_shift_diagonal, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_shift_diagonal,%ld,%lf\n", count_pnga_shift_diagonal, recvbuf); } MPI_Reduce(&time_pnga_solve, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_solve,%ld,%lf\n", count_pnga_solve, recvbuf); } MPI_Reduce(&time_pnga_spd_invert, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_spd_invert,%ld,%lf\n", count_pnga_spd_invert, recvbuf); } MPI_Reduce(&time_pnga_step_bound_info, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_step_bound_info,%ld,%lf\n", count_pnga_step_bound_info, recvbuf); } MPI_Reduce(&time_pnga_step_bound_info_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_step_bound_info_patch,%ld,%lf\n", count_pnga_step_bound_info_patch, recvbuf); } MPI_Reduce(&time_pnga_step_mask_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_step_mask_patch,%ld,%lf\n", count_pnga_step_mask_patch, recvbuf); } MPI_Reduce(&time_pnga_step_max, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_step_max,%ld,%lf\n", count_pnga_step_max, recvbuf); } MPI_Reduce(&time_pnga_step_max_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_step_max_patch,%ld,%lf\n", count_pnga_step_max_patch, recvbuf); } MPI_Reduce(&time_pnga_strided_acc, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_strided_acc,%ld,%lf\n", count_pnga_strided_acc, recvbuf); } MPI_Reduce(&time_pnga_strided_get, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_strided_get,%ld,%lf\n", count_pnga_strided_get, recvbuf); } MPI_Reduce(&time_pnga_strided_put, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_strided_put,%ld,%lf\n", count_pnga_strided_put, recvbuf); } MPI_Reduce(&time_pnga_summarize, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_summarize,%ld,%lf\n", count_pnga_summarize, recvbuf); } MPI_Reduce(&time_pnga_symmetrize, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_symmetrize,%ld,%lf\n", count_pnga_symmetrize, recvbuf); } MPI_Reduce(&time_pnga_sync, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_sync,%ld,%lf\n", count_pnga_sync, recvbuf); } MPI_Reduce(&time_pnga_terminate, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_terminate,%ld,%lf\n", count_pnga_terminate, recvbuf); } MPI_Reduce(&time_pnga_timer, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_timer,%ld,%lf\n", count_pnga_timer, recvbuf); } MPI_Reduce(&time_pnga_total_blocks, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_total_blocks,%ld,%lf\n", count_pnga_total_blocks, recvbuf); } MPI_Reduce(&time_pnga_transpose, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_transpose,%ld,%lf\n", count_pnga_transpose, recvbuf); } MPI_Reduce(&time_pnga_type_c2f, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_type_c2f,%ld,%lf\n", count_pnga_type_c2f, recvbuf); } MPI_Reduce(&time_pnga_type_f2c, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_type_f2c,%ld,%lf\n", count_pnga_type_f2c, recvbuf); } MPI_Reduce(&time_pnga_unlock, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_unlock,%ld,%lf\n", count_pnga_unlock, recvbuf); } MPI_Reduce(&time_pnga_unpack, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_unpack,%ld,%lf\n", count_pnga_unpack, recvbuf); } MPI_Reduce(&time_pnga_update1_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update1_ghosts,%ld,%lf\n", count_pnga_update1_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update2_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update2_ghosts,%ld,%lf\n", count_pnga_update2_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update3_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update3_ghosts,%ld,%lf\n", count_pnga_update3_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update44_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update44_ghosts,%ld,%lf\n", count_pnga_update44_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update4_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update4_ghosts,%ld,%lf\n", count_pnga_update4_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update55_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update55_ghosts,%ld,%lf\n", count_pnga_update55_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update5_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update5_ghosts,%ld,%lf\n", count_pnga_update5_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update6_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update6_ghosts,%ld,%lf\n", count_pnga_update6_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update7_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update7_ghosts,%ld,%lf\n", count_pnga_update7_ghosts, recvbuf); } MPI_Reduce(&time_pnga_update_ghost_dir, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update_ghost_dir,%ld,%lf\n", count_pnga_update_ghost_dir, recvbuf); } MPI_Reduce(&time_pnga_update_ghosts, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_update_ghosts,%ld,%lf\n", count_pnga_update_ghosts, recvbuf); } MPI_Reduce(&time_pnga_uses_ma, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_uses_ma,%ld,%lf\n", count_pnga_uses_ma, recvbuf); } MPI_Reduce(&time_pnga_uses_proc_grid, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_uses_proc_grid,%ld,%lf\n", count_pnga_uses_proc_grid, recvbuf); } MPI_Reduce(&time_pnga_valid_handle, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_valid_handle,%ld,%lf\n", count_pnga_valid_handle, recvbuf); } MPI_Reduce(&time_pnga_verify_handle, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_verify_handle,%ld,%lf\n", count_pnga_verify_handle, recvbuf); } MPI_Reduce(&time_pnga_wtime, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_wtime,%ld,%lf\n", count_pnga_wtime, recvbuf); } MPI_Reduce(&time_pnga_zero, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_zero,%ld,%lf\n", count_pnga_zero, recvbuf); } MPI_Reduce(&time_pnga_zero_diagonal, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_zero_diagonal,%ld,%lf\n", count_pnga_zero_diagonal, recvbuf); } MPI_Reduce(&time_pnga_zero_patch, &recvbuf, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (me == 0) { printf("pnga_zero_patch,%ld,%lf\n", count_pnga_zero_patch, recvbuf); } } } ga-5-4/tools/ga-config.in.m4sh0000644000175000017500000000434512662210462014233 0ustar mbambadnl run "autom4te -l m4sh ga-config.in.m4sh > ga-config.in" AS_INIT f77="@F77@" cc="@CC@" cppflags="@SCALAPACK_CPPFLAGS@ @LAPACK_CPPFLAGS@ @BLAS_CPPFLAGS@ @GA_MP_CPPFLAGS@ @ARMCI_NETWORK_CPPFLAGS@ -I@prefix@/include" cflags="@GA_COPT@" fflags="@GA_FOPT@ @FFLAG_INT@" fint="@FFLAG_INT@" ldflags="@SCALAPACK_LDFLAGS@ @LAPACK_LDFLAGS@ @BLAS_LDFLAGS@ @GA_MP_LDFLAGS@ @ARMCI_NETWORK_LDFLAGS@ -L@prefix@/lib" libs="-lga @SCALAPACK_LIBS@ @LAPACK_LIBS@ @BLAS_LIBS@ -larmci @GA_MP_LIBS@ @ARMCI_NETWORK_LIBS@" flibs="@FLIBS@" enable_f77_true="@ENABLE_F77_TRUE@" version="@PACKAGE_VERSION@" AS_IF([test "x$enable_f77_true" = x], [enable_f77=yes], [enable_f77=no]) [usage="Usage: ga-config [OPTIONS]... With the exception of --version and --help, all other options can be combined or run exclusively. Output is echoed to stdout. Options: --f77 --cc --cppflags --cflags --fflags --fint --ldflags --libs --flibs --enable-f77 --version --help "] result= while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -help | --help | --hel | --he | -h ) AS_ECHO(["$usage"]); exit ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) AS_ECHO(["$version"]); exit ;; -f77 | --f77) result="$result $f77" ;; -cc | --cc ) result="$result $cc" ;; -cppflags | --cppflags ) result="$result $cppflags" ;; -cflags | --cflags ) result="$result $cflags" ;; -fflags | --fflags ) result="$result $fflags" ;; -ldflags | --ldflags ) result="$result $ldflags" ;; -libs | --libs ) result="$result $libs" ;; -flibs | --flibs ) result="$result $flibs" ;; -fint | --fint ) result="$result $fint" ;; -enable-f77 | --enable-f77 ) result="$result $enable_f77" ;; # This is an error. *) AS_ECHO(["unrecognized option: \`$1' Try \`$0 --help' for more information."]); exit ;; esac shift done AS_ECHO(["$result"]) | sed 's/ [ ]*/ /g;s/" /"/g;s/ "/"/g;s/^ [ ]*//;s/ [ ]*$//' ga-5-4/tools/wapigen_counts.py0000755000175000017500000001130112662210462014567 0ustar mbamba#!/usr/bin/env python '''Generate the wapi_counts.c source from the ga-papi.h header.''' import sys def get_signatures(header): # first, gather all function signatures from ga-papi.h aka argv[1] accumulating = False signatures = [] current_signature = '' EXTERN = 'extern' SEMICOLON = ';' for line in open(header): line = line.strip() # remove whitespace before and after line if not line: continue # skip blank lines if EXTERN in line and SEMICOLON in line: signatures.append(line) elif EXTERN in line: current_signature = line accumulating = True elif SEMICOLON in line and accumulating: current_signature += line signatures.append(current_signature) accumulating = False elif accumulating: current_signature += line return signatures class FunctionArgument(object): def __init__(self, signature): self.pointer = signature.count('*') self.array = '[' in signature signature = signature.replace('*','').strip() signature = signature.replace('[','').strip() signature = signature.replace(']','').strip() self.type,self.name = signature.split() def __str__(self): ret = self.type[:] ret += ' ' for p in range(self.pointer): ret += '*' ret += self.name if self.array: ret += '[]' return ret class Function(object): def __init__(self, signature): signature = signature.replace('extern','').strip() self.return_type,signature = signature.split(None,1) self.return_type = self.return_type.strip() signature = signature.strip() self.name,signature = signature.split('(',1) self.name = self.name.strip() signature = signature.replace(')','').strip() signature = signature.replace(';','').strip() self.args = [] if signature: for arg in signature.split(','): self.args.append(FunctionArgument(arg.strip())) def get_call(self, name=None): sig = '' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += arg.name sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def get_signature(self, name=None): sig = self.return_type[:] sig += ' ' if not name: sig += self.name else: sig += name sig += '(' if self.args: for arg in self.args: sig += str(arg) sig += ', ' sig = sig[:-2] # remove last ', ' sig += ')' return sig def __str__(self): return self.get_signature() if __name__ == '__main__': if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: wapigen_counts.py > ' sys.exit(len(sys.argv)) # print headers print ''' #if HAVE_CONFIG_H # include "config.h" #endif #include "ga-papi.h" #include "typesf2c.h" ''' functions = {} # parse signatures into the Function class for sig in get_signatures(sys.argv[1]): function = Function(sig) functions[function.name] = function # for each function, generate a static count for name in sorted(functions): print 'static long count_%s = 0;' % name print '' # now process the functions for name in sorted(functions): func = functions[name] if 'terminate' in name: continue maybe_return = '' if 'void' not in func.return_type: maybe_return = 'return ' func = functions[name] wnga_name = name.replace('pnga_','wnga_') print ''' %s { ++count_%s; %s%s; } ''' % (func.get_signature(wnga_name), name, maybe_return, func.get_call()) # prepare to output the terminate function name = 'pnga_terminate' wnga_name = name.replace('pnga_','wnga_') func = functions[name] the_code = '' # establish 'the_code' to use in the body of terminate # it's printing the count of each function if it was called at least once for name in sorted(functions): the_code += ''' if (count_%s) { printf("%s %%ld\\n", count_%s); } ''' % (name, name, name) # output the terminate function print '''%s { ++count_pnga_terminate; %s; /* don't dump info if terminate more than once */ if (1 == count_pnga_terminate) { %s } } ''' % (func.get_signature(wnga_name), func.get_call(), the_code) ga-5-4/tools/gp-wapi.c0000644000175000017500000000307012662210462012701 0ustar mbamba #if HAVE_CONFIG_H # include "config.h" #endif #include "gp-papi.h" #include "typesf2c.h" logical wgp_allocate(Integer g_p) { return pgp_allocate(g_p); } void wgp_assign_local_element(Integer g_p, Integer *subscript, void *ptr, Integer size) { pgp_assign_local_element(g_p, subscript, ptr, size); } Integer wgp_create_handle() { return pgp_create_handle(); } void wgp_debug(Integer g_p) { pgp_debug(g_p); } logical wgp_destroy(Integer g_p) { return pgp_destroy(g_p); } void wgp_distribution(Integer g_p, Integer proc, Integer *lo, Integer *hi) { pgp_distribution(g_p, proc, lo, hi); } void wgp_free(void *ptr) { pgp_free(ptr); } void* wgp_free_local_element(Integer g_p, Integer *subscript) { pgp_free_local_element(g_p, subscript); } void wgp_get(Integer g_p, Integer *lo, Integer *hi, void *buf, void **buf_ptr, Integer *ld, void *buf_size, Integer *ld_sz, Integer *size, Integer isize) { pgp_get(g_p, lo, hi, buf, buf_ptr, ld, buf_size, ld_sz, size, isize); } Integer wgp_get_dimension(Integer g_p) { return pgp_get_dimension(g_p); } void wgp_get_size(Integer g_p, Integer *lo, Integer *hi, Integer *size, Integer isize) { pgp_get_size(g_p, lo, hi, size, isize); } void wgp_initialize() { pgp_initialize(); } void* wgp_malloc(size_t size) { pgp_malloc(size); } void wgp_set_chunk(Integer g_p, Integer *chunk) { pgp_set_chunk(g_p, chunk); } void wgp_set_dimensions(Integer g_p, Integer ndim, Integer *dims) { pgp_set_dimensions(g_p, ndim, dims); } void wgp_terminate() { pgp_terminate(); } ga-5-4/benchmarks/0000755000175000017500000000000012662210514012144 5ustar mbambaga-5-4/benchmarks/README.first0000644000175000017500000000153512662210514014156 0ustar mbamba============ README.first ============ What is this for? ----------------- This directory is meant to stage some of our test programs into a gzipped tarball meant for benchmark testing on various platforms. Our tests depend on certain header files, preprocessor directives, and additional test-related functions which aren't available from a standard installation of GA. The files here are meant to fill that void. See the README for details about the contained files. Note that the README will describe these files as well as files which have not yet been staged. How to Generate the Benchmarks Tarball -------------------------------------- Simply run "make". The default make target will create a "ga-benchmarks" directory, copy various test sources as well as the sources found here, and remove the default staging make target from the copied Makefile. ga-5-4/benchmarks/config.h0000644000175000017500000000021512662210514013560 0ustar mbamba#define HAVE_STDIO_H 1 #define HAVE_STDLIB_H 1 #define HAVE_ASSERT_H 1 #define HAVE_UNISTD_H 1 #define HAVE_MATH_H 1 #define MSG_COMMS_MPI 1 ga-5-4/benchmarks/config.fh0000644000175000017500000000001612662210514013725 0ustar mbamba#define MPI 1 ga-5-4/benchmarks/Makefile0000644000175000017500000000425612662210514013613 0ustar mbamba GA_CONFIG := # e.g. /path/to/ga/install/bin/ga-config ifneq ($(GA_CONFIG),) CPPFLAGS := $(shell $(GA_CONFIG) --cppflags) FFLAGS := $(shell $(GA_CONFIG) --fflags) CFLAGS := $(shell $(GA_CONFIG) --cflags) LIBS := $(shell $(GA_CONFIG) --libs) FLIBS := $(shell $(GA_CONFIG) --flibs) LDFLAGS := $(shell $(GA_CONFIG) --ldflags) CC := $(shell $(GA_CONFIG) --cc) F77 := $(shell $(GA_CONFIG) --f77) endif dist: rm -rf ga-benchmarks mkdir ga-benchmarks cp -f ../global/testing/mp3.h ./ga-benchmarks/mp3.h cp -f ../global/testing/mp3.fh ./ga-benchmarks/mp3.fh cp -f ../global/testing/ga_shift.F ./ga-benchmarks/ga_shift.F cp -f ../global/testing/perf.F ./ga-benchmarks/ga_ptp.F cp -f ../global/testing/perf2.c ./ga-benchmarks/ga_perf.c cp -f ../armci/testing/perf.c ./ga-benchmarks/armci_perf.c cp -f ./Makefile ./ga-benchmarks/Makefile cp -f ./config.h ./ga-benchmarks/config.h cp -f ./config.fh ./ga-benchmarks/config.fh cp -f ./util.c ./ga-benchmarks/util.c cp -f ./testutil.fh ./ga-benchmarks/testutil.fh cp -f ./README ./ga-benchmarks/README sed -i '13,31d' ./ga-benchmarks/Makefile rm -f ga-benchmarks.tgz tar -czf ga-benchmarks.tgz ./ga-benchmarks .SUFFIXES: benchmarks: ga_shift.x ga_ptp.x ga_perf.x armci_perf.x ga_shift.x: ga_shift.o util.o $(F77) -o $@ $^ $(LDFLAGS) $(LIBS) ga_shift.o: ga_shift.F mp3.fh config.fh $(F77) -o $@ -c $< -DHAVE_CONFIG_H -I. $(CPPFLAGS) $(FFLAGS) ga_ptp.x: ga_ptp.o util.o $(F77) -o $@ $^ $(LDFLAGS) $(LIBS) ga_ptp.o: ga_ptp.F mp3.fh config.fh $(F77) -o $@ -c $< -DHAVE_CONFIG_H -I. $(CPPFLAGS) $(FFLAGS) ga_perf.x: ga_perf.o util.o $(CC) -o $@ $^ $(LDFLAGS) $(LIBS) $(FLIBS) ga_perf.o: ga_perf.c mp3.h config.h $(CC) -o $@ -c $< -DHAVE_CONFIG_H -I. $(CPPFLAGS) $(CFLAGS) armci_perf.x: armci_perf.o util.o $(CC) -o $@ $^ $(LDFLAGS) $(LIBS) $(FLIBS) armci_perf.o: armci_perf.c mp3.h config.h $(CC) -o $@ -c $< -DHAVE_CONFIG_H -I. $(CPPFLAGS) $(CFLAGS) util.o: util.c $(CC) -o $@ -c $< -DHAVE_CONFIG_H -I. $(CPPFLAGS) $(CFLAGS) config.h: config.fh: mp3.h: mp3.fh: clean: rm -f *.x *.o ga-5-4/benchmarks/README0000644000175000017500000000315012662210514013023 0ustar mbamba============================================= README for Global Arrays and ARMCI Benchmarks ============================================= How to Build the Benchmarks --------------------------- The Makefile assumes you have installed GA 5-1 or later which also installs the "ga-config" helper script. This script contains the various linker, compiler, and preprocessor flags used to build GA. You must specify the path to ga-config or else edit the Makefile to add the necessary flags manually. For example:: make GA_CONFIG=/path/to/ga/install/bin/ga-config make CPPFLAGS=-I/path/to/ga/install/include LDFLAGS=-L/path/to/ga/install/lib LIBS=-lga It is *much* easier to use the installed ga-config script! Directory Contents ------------------ -armci_perf.c ARMCI benchmark where proc 0 sequentially communicates with the other 1..P procs -config.fh a few necessary preprocessor symbols for Fortran -config.h a few necessary preprocessor symbols for C -ga_perf.c GA benchmark demonstrating the overhead added by the GA layer compared to the "armci_perf.c" benchmark -ga_ptp.F GA benchmark where all procs communicate -ga_shift.F GA benchmark using a shift algorithm -LICENSE legal information about these files -Makefile makefile for building these benchmarks -mp3.fh message passing init and termination symbols for Fortran -mp3.h message passing init and termination symbols for C -README this file -testutil.fh contains a few Fortran declarations for extra functions How to Run the Benchmarks ------------------------- TODO ga-5-4/benchmarks/util.c0000644000175000017500000000355712662210514013277 0ustar mbamba#include #include #include "ga.h" #include "typesf2c.h" #define F77_SET_MA_USE_ARMCI_MEM(name) \ void name() \ { \ int retval; \ if((retval=setenv("MA_USE_ARMCI_MEM", "YES", 1)) != 0) \ GA_Error("setenv failed: insufficient space in the environment",1); \ } F77_SET_MA_USE_ARMCI_MEM(set_ma_use_armci_mem) F77_SET_MA_USE_ARMCI_MEM(set_ma_use_armci_mem_) F77_SET_MA_USE_ARMCI_MEM(set_ma_use_armci_mem__) F77_SET_MA_USE_ARMCI_MEM(SET_MA_USE_ARMCI_MEM) F77_SET_MA_USE_ARMCI_MEM(SET_MA_USE_ARMCI_MEM_) F77_SET_MA_USE_ARMCI_MEM(SET_MA_USE_ARMCI_MEM__) #define F77_UTIL_MDTOB(name) \ Integer name(Integer *n) \ { \ if (*n < 0) \ GA_Error("util_MDTOB_: negative argument",*n); \ return (Integer) (*n * sizeof(DoublePrecision)); \ } F77_UTIL_MDTOB(util_mdtob) F77_UTIL_MDTOB(util_mdtob_) F77_UTIL_MDTOB(util_mdtob__) F77_UTIL_MDTOB(UTIL_MDTOB) F77_UTIL_MDTOB(UTIL_MDTOB_) F77_UTIL_MDTOB(UTIL_MDTOB__) #define F77_UTIL_TIMER(name) \ double name() \ { \ return GA_Wtime(); \ } F77_UTIL_TIMER(util_timer) F77_UTIL_TIMER(util_timer_) F77_UTIL_TIMER(util_timer__) F77_UTIL_TIMER(UTIL_TIMER) F77_UTIL_TIMER(UTIL_TIMER_) F77_UTIL_TIMER(UTIL_TIMER__) #define F77_FLUSH(name) \ void name(Integer *unit) \ { \ fflush(stdout); \ fflush(stderr); \ } F77_FLUSH(ffflush) F77_FLUSH(ffflush_) F77_FLUSH(ffflush__) F77_FLUSH(FFFLUSH) F77_FLUSH(FFFLUSH_) F77_FLUSH(FFFLUSH__) ga-5-4/benchmarks/testutil.fh0000644000175000017500000000015712662210514014343 0ustar mbamba double precision util_timer integer util_mdtob external util_timer external util_mdtob ga-5-4/COPYRIGHT0000644000175000017500000000614312662210476011335 0ustar mbambaCopyright (c) 2006, Battelle Memorial Institute All rights reserved. 1. Battelle Memorial Institute (hereinafter Battelle) hereby grants permission to any person or entity lawfully obtaining a copy of this software and associated documentation files (hereinafter "the Software") to redistribute and use the Software in source and binary forms, with or without modification. Such person or entity may use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and may permit others to do so, subject to the following conditions: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Other than as used herein, neither the name Battelle Memorial Institute or Battelle may be used in any form whatsoever without the express written consent of Battelle. 2. 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 BATTELLE 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. 3. The Software was produced by BMI under Contract No. DE-AC05-76RL01830 with the Department of Energy. For five (5) years from February 23, 2006, the Government is granted for itself and others acting on its behalf a nonexclusive, paid-up, irrevocable worldwide license in this data to reproduce, prepare derivative works, and perform publicly and display publicly, by or on behalf of the Government. There is provision for the possible extension of the term of this license. Subsequent to that period or any extension granted, the Government is granted for itself and others acting on its behalf a nonexclusive, paid-up, irrevocable worldwide license in this data to reproduce, prepare derivative works, distribute copies to the public, perform publicly and display publicly, and to permit others to do so. The specific term of the license can be identified by inquiry made to Battelle or DOE. Neither the United States nor the United States Department of Energy, nor any of their employees, makes any warranty, express or implied, or assumes any legal liability or responsibility for the accuracy, completeness or usefulness of any data, apparatus, product or process disclosed, or represents that its use would not infringe privately owned rights. Open Source License (0102) ga-5-4/Makefile.in0000644000175000017500000203624712662210372012114 0ustar mbamba# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ############################################################################## # Makefile.am for Global Arrays. # # Rationale: # This Makefile.am follows many of the suggestions outlined in the paper # "Recursive Make Considered Harmful". We do not use automake's # 'include' feature (instead preferring a single, large Makefile.am). # We do recurse into the armci directory, but since armci is a stand-alone # package this is the correct behavior. # # Additional targets: # Besides the traditional make targets supplied by automake, we have added the # "checkprogs" target to build example programs and test programs. # # Notes: # In general, each subdirectory has a corresponding section within this # Makefile.am with the notable exception being the many examples getting # rolled up into the global/examples section. # VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = $(am__EXEEXT_1) global/trace/adjust$(EXEEXT) \ global/trace/collisions$(EXEEXT) check_PROGRAMS = ma/testc$(EXEEXT) ma/test-coalesce$(EXEEXT) \ ma/test-inquire$(EXEEXT) $(am__EXEEXT_2) \ global/testing/big$(EXEEXT) global/testing/elempatch$(EXEEXT) \ global/testing/gatscat$(EXEEXT) global/testing/getmem$(EXEEXT) \ global/testing/mtest$(EXEEXT) \ global/testing/mulmatpatchc$(EXEEXT) \ global/testing/normc$(EXEEXT) global/testing/ntestc$(EXEEXT) \ global/testing/ntestfc$(EXEEXT) global/testing/packc$(EXEEXT) \ global/testing/patch_enumc$(EXEEXT) \ global/testing/perf2$(EXEEXT) global/testing/print$(EXEEXT) \ global/testing/scan_addc$(EXEEXT) \ global/testing/scan_copyc$(EXEEXT) \ global/testing/testc$(EXEEXT) \ global/testing/testmatmultc$(EXEEXT) \ global/testing/testmult$(EXEEXT) \ global/testing/testmultrect$(EXEEXT) \ global/testing/unpackc$(EXEEXT) $(am__EXEEXT_3) \ $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \ $(am__EXEEXT_10) \ global/examples/lennard-jones/lennard$(EXEEXT) \ $(am__EXEEXT_11) pario/dra/bign$(EXEEXT) \ pario/dra/dbg_read$(EXEEXT) pario/dra/dbg_write$(EXEEXT) \ pario/dra/dra2arviz$(EXEEXT) pario/dra/ntestc$(EXEEXT) \ pario/dra/perfn$(EXEEXT) pario/dra/rate$(EXEEXT) \ $(am__EXEEXT_12) $(am__EXEEXT_13) $(am__EXEEXT_14) \ $(am__EXEEXT_15) $(am__EXEEXT_16) $(am__EXEEXT_17) @ENABLE_F77_TRUE@am__append_1 = $(FLD_NOMAIN) ############################################################################## # LinAlg/lapack+blas # # Since we gave all linalg routines a gal_ prefix, we can unconditionally # compile our internal linalg routines. # @ENABLE_F77_TRUE@am__append_2 = ma/maf.F \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_cgemm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_daxpy.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dcabs1.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dcopy.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ddot.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgemm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgemv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dger.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetf2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetrf.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetrs.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_disnan.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlacpy.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlae2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaev2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaisnan.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlamch.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlanst.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlansy.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlapy2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarfb.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarf.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarfg.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarft.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlartg.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlascl.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaset.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlasr.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlasrt.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlassq.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaswp.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlatrd.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dnrm2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorg2l.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorg2r.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgql.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgqr.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgtr.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dpotf2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dpotrf.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dscal.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsteqr.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsterf.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dswap.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyev.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygs2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygst.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsymm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsymv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyr2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyr2k.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyrk.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsytd2.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsytrd.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrmm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrmv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrsm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrsv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_idamax.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ieeeck.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iladlc.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iladlr.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ilaenv.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iparmq.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_lsame.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_sgemm.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_xerbla.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_zaxpy.f \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_zgemm.f @ENABLE_F77_TRUE@am__append_3 = ma/testf @ENABLE_F77_TRUE@am__append_4 = ma/testf$(EXEEXT) @ENABLE_F77_TRUE@am__append_5 = ma/testf$(EXEEXT) ############################################################################## # tools # # The following to support tracing, profiling, etc. # @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__append_6 = libwapi.la @ENABLE_GPARRAYS_TRUE@@ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__append_7 = tools/gp-wapi.c @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__append_8 = tools/ga-wapi.c @ENABLE_GPARRAYS_TRUE@@ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__append_9 = tools/gp-wapi.c @ENABLE_GPARRAYS_TRUE@am__append_10 = tools/gpwapigen.py @ENABLE_F77_TRUE@am__append_11 = global/src/complex.F \ @ENABLE_F77_TRUE@ global/src/ga_diag_seq.F global/src/rsg.F @CRAY_XT_NETWORKS_TRUE@@ENABLE_F77_TRUE@am__append_12 = global/src/ga_dgemmf.F @ENABLE_F77_TRUE@@ENABLE_PEIGS_TRUE@am__append_13 = global/src/ga_diag.F @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@am__append_14 = global/src/scalapack.F @ENABLE_CHECKPOINT_TRUE@am__append_15 = global/src/ga_ckpt.c @MSG_COMMS_MPI_TRUE@am__append_16 = global/src/ga-mpi.h \ @MSG_COMMS_MPI_TRUE@ global/src/ga-mpi.fh @ENABLE_F77_TRUE@am__append_17 = global/testing/bin \ @ENABLE_F77_TRUE@ global/testing/blktest global/testing/d2test \ @ENABLE_F77_TRUE@ global/testing/g2test global/testing/g3test \ @ENABLE_F77_TRUE@ global/testing/ga_lu global/testing/ga_shift \ @ENABLE_F77_TRUE@ global/testing/ghosts global/testing/jacobi \ @ENABLE_F77_TRUE@ global/testing/mir_perf2 \ @ENABLE_F77_TRUE@ global/testing/mmatrix \ @ENABLE_F77_TRUE@ global/testing/mulmatpatch \ @ENABLE_F77_TRUE@ global/testing/nb2test global/testing/ndim \ @ENABLE_F77_TRUE@ global/testing/patch global/testing/patch2 \ @ENABLE_F77_TRUE@ global/testing/patch_enumf \ @ENABLE_F77_TRUE@ global/testing/perfmod global/testing/perform \ @ENABLE_F77_TRUE@ global/testing/perf \ @ENABLE_F77_TRUE@ global/testing/pg2testmatmult \ @ENABLE_F77_TRUE@ global/testing/pg2test \ @ENABLE_F77_TRUE@ global/testing/pgtestmatmult \ @ENABLE_F77_TRUE@ global/testing/pgtest global/testing/random \ @ENABLE_F77_TRUE@ global/testing/scan \ @ENABLE_F77_TRUE@ global/testing/simple_groups \ @ENABLE_F77_TRUE@ global/testing/sparse \ @ENABLE_F77_TRUE@ global/testing/sprsmatmult \ @ENABLE_F77_TRUE@ global/testing/stride global/testing/testeig \ @ENABLE_F77_TRUE@ global/testing/testmatmult \ @ENABLE_F77_TRUE@ global/testing/testsolve global/testing/test \ @ENABLE_F77_TRUE@ global/testing/test_mirrored \ @ENABLE_F77_TRUE@ global/testing/types_test \ @ENABLE_F77_TRUE@ global/testing/field_test @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@am__append_18 = global/testing/testspd @ENABLE_F77_TRUE@@MSG_COMMS_MPI_TRUE@am__append_19 = global/testing/simple_groups_comm @ENABLE_F77_FALSE@@HAVE_LAPACK_TRUE@am__append_20 = global/testing/ga_lu @MSG_COMMS_MPI_TRUE@am__append_21 = global/testing/ga-mpi \ @MSG_COMMS_MPI_TRUE@ global/testing/lock \ @MSG_COMMS_MPI_TRUE@ global/testing/simple_groups_commc @SYSV_TRUE@am__append_22 = global/testing/ipc_clean # TODO somehow unit tests depend on MPI -- need to fix @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@am__append_23 = global/testing/unit-tests/ga_abs_value \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_acc \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_constant \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_constantpatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_diagonal \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_patch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copypatch2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copypatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create1 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_handle \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_destroy \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_dgop \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_dot \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_duplicate \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_divide \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_dividepatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_maximum \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_maximumpatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_minimum \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_minimumpatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_multiply \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_multiplypatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fill \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fillpatch1 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fillpatch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get_blockinfo \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get_diagonal \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_igop2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_igop \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_inquire \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_intialize \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_lgop \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_median \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_ndim2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_ndim \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_nnodes \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_nodeid \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create4 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create5 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_destroy2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_destroy \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_nnodes_nodeid \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_setdefault \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_put2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_put \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_cols \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_patch \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_rows \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scatter \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_data \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_diagonal \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_restricted \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_solve \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_sync \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose3 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zero \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zerodiagonal \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zeropatch2 \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zeropatch #GLOBAL_PARALLEL_TESTS += global/testing/d2test$(EXEEXT) # needs input file #GLOBAL_PARALLEL_TESTS += global/testing/pg2testmatmult$(EXEEXT) # needs 8 procs exactly #GLOBAL_PARALLEL_TESTS += global/testing/pgtestmatmult$(EXEEXT) # needs 8 procs exactly #GLOBAL_PARALLEL_TESTS += global/testing/random$(EXEEXT) # takes too long @ENABLE_F77_TRUE@am__append_24 = global/testing/bin$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/blktest$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/g2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/g3test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ga_lu$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ga_shift$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ghosts$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/jacobi$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mir_perf2$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mmatrix$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mulmatpatch$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/nb2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ndim$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch2$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch_enumf$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perfmod$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perform$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perf$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perf2$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pg2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pgtest$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/scan$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/simple_groups$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/sparse$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/sprsmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/stride$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testeig$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testsolve$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/test$(EXEEXT) @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@am__append_25 = global/testing/testspd$(EXEEXT) @ENABLE_F77_TRUE@@MSG_COMMS_MPI_TRUE@am__append_26 = global/testing/simple_groups_comm$(EXEEXT) @ENABLE_F77_FALSE@@HAVE_LAPACK_TRUE@am__append_27 = global/testing/ga_lu$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__append_28 = global/testing/ga-mpi$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ global/testing/lock$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ global/testing/simple_groups_commc$(EXEEXT) @HAVE_M4_TRUE@am__append_29 = $(GLOBAL_TESTING_M4_DEPS) \ @HAVE_M4_TRUE@ global/testing/README @HAVE_M4_TRUE@am__append_30 = global/testing/nga-onesided.F \ @HAVE_M4_TRUE@ global/testing/nga-patch.F \ @HAVE_M4_TRUE@ global/testing/nga-periodic.F \ @HAVE_M4_TRUE@ global/testing/nga-scatter.F \ @HAVE_M4_TRUE@ global/testing/nga-util.F \ @HAVE_M4_TRUE@ global/testing/ngatest.F @ENABLE_F77_TRUE@@HAVE_M4_TRUE@am__append_31 = \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-onesided \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-patch \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-periodic \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-scatter \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-util \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/ngatest @ENABLE_F77_TRUE@@HAVE_M4_TRUE@am__append_32 = global/testing/nga-onesided$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-patch$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-periodic$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-scatter$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-scatter$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-util$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/ngatest$(EXEEXT) @ENABLE_F77_TRUE@am__append_33 = global/testing/ffflush.F \ @ENABLE_F77_TRUE@ global/testing/testblas.F @ENABLE_F77_TRUE@am__append_34 = global/examples/boltzmann/boltz \ @ENABLE_F77_TRUE@ global/examples/conjugate_gradient/ga_cg \ @ENABLE_F77_TRUE@ global/examples/md_cluster/grp_sim \ @ENABLE_F77_TRUE@ global/examples/scf/scf pario/dra/big \ @ENABLE_F77_TRUE@ pario/dra/dra_mxm pario/dra/ntest \ @ENABLE_F77_TRUE@ pario/dra/perf pario/dra/perf2 \ @ENABLE_F77_TRUE@ pario/dra/perf3 pario/dra/test \ @ENABLE_F77_TRUE@ pario/dra/test_mxm pario/dra/time_mxm \ @ENABLE_F77_TRUE@ pario/eaf/test pario/sf/test @ENABLE_F77_TRUE@am__append_35 = global/examples/boltzmann/boltz$(EXEEXT) ############################################################################## # global/X # @ENABLE_XREGION_TRUE@@NO_X_FALSE@am__append_36 = global/X/xregion ############################################################################## # ga++/src # @CXX_BINDINGS_TRUE@am__append_37 = libga++.la @CXX_BINDINGS_TRUE@am__append_38 = ga++/src/ga++.h \ @CXX_BINDINGS_TRUE@ ga++/src/GAServices.h \ @CXX_BINDINGS_TRUE@ ga++/src/GlobalArray.h ga++/src/init_term.h \ @CXX_BINDINGS_TRUE@ ga++/src/PGroup.h ga++/src/services.h @CXX_BINDINGS_TRUE@am__append_39 = -I$(top_srcdir)/ga++/src ############################################################################## # ga++/testing # @CXX_BINDINGS_TRUE@am__append_40 = ga++/testing/elempatch \ @CXX_BINDINGS_TRUE@ ga++/testing/mtest ga++/testing/ntestc \ @CXX_BINDINGS_TRUE@ ga++/testing/testc ga++/testing/testmult @ENABLE_GPARRAYS_TRUE@am__append_41 = gparrays/src/gp-wapi.h \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gp-wapidefs.h @ENABLE_GPARRAYS_TRUE@am__append_42 = gparrays/src/gp-wapi.h \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gp-wapidefs.h @ENABLE_GPARRAYS_TRUE@am__append_43 = gparrays/src/gpbase.c \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gpbase.h \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gpcapi.c \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gpfapi.c \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gponesided.c \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gp-papi.h @ENABLE_GPARRAYS_TRUE@am__append_44 = gparrays/src/gp-wapidefs.h @ENABLE_GPARRAYS_TRUE@am__append_45 = gparrays/src/gp.h \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gp-papi.h @ENABLE_GPARRAYS_TRUE@am__append_46 = gparrays/src/gp-wapi.h @ENABLE_F77_TRUE@@ENABLE_GPARRAYS_TRUE@am__append_47 = gparrays/testing/test @ENABLE_GPARRAYS_TRUE@am__append_48 = gparrays/testing/testc \ @ENABLE_GPARRAYS_TRUE@ gparrays/testing/transpose @ENABLE_GPARRAYS_TRUE@am__append_49 = \ @ENABLE_GPARRAYS_TRUE@ -I$(top_build_prefix)gparrays/src \ @ENABLE_GPARRAYS_TRUE@ -I$(top_srcdir)/gparrays/src @ENABLE_F77_TRUE@am__append_50 = gaf2c/farg.F @ENABLE_F77_TRUE@am__append_51 = gaf2c/testarg @ENABLE_F77_TRUE@am__append_52 = gaf2c/testarg$(EXEEXT) ############################################################################## # tcgmsg/tcgmsg-mpi # @MSG_COMMS_MPI_TRUE@am__append_53 = tcgmsg/tcgmsg-mpi/checkbyte.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/clustercheck.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/collect.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/drand48.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/evlog.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/evlog.h \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/evon.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/llog.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/misc.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/niceftn.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/nxtval-armci.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/p2p.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/pbeginf.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/pfilecopy.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/sizeof.c \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/sndrcv.h \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/srftoc.h \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/tcgmsgP.h @MSG_COMMS_MPI_TRUE@am__append_54 = -I$(top_srcdir)/tcgmsg/tcgmsg-mpi @MSG_COMMS_MPI_TRUE@am__append_55 = tcgmsg/tests/test_asyn \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tests/test @ENABLE_F77_TRUE@@MSG_COMMS_MPI_TRUE@am__append_56 = tcgmsg/tests/testf ############################################################################## # armci # if TCGMSG is coming from ARMCI @ARMCI_NETWORK_ARMCI_FALSE@@MSG_COMMS_TCGMSG4_TRUE@am__append_57 = -I$(top_srcdir)/armci/tcgmsg @ARMCI_NETWORK_ARMCI_FALSE@@MSG_COMMS_TCGMSG5_TRUE@am__append_58 = -I$(top_srcdir)/armci/tcgmsg @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_PORTALS_TRUE@am__append_59 = -I$(top_srcdir)/armci/src-portals \ @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_PORTALS_TRUE@ -I$(top_srcdir)/armci/tcgmsg @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_60 = -I$(top_srcdir)/armci/src-gemini \ @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_GEMINI_TRUE@@ARMCI_NETWORK_PORTALS_FALSE@ -I$(top_srcdir)/armci/tcgmsg @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@am__append_61 = -I$(top_srcdir)/armci/src/include \ @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_NETWORK_GEMINI_FALSE@@ARMCI_NETWORK_PORTALS_FALSE@ -I$(top_srcdir)/armci/tcgmsg @ARMCI_NETWORK_ARMCI_TRUE@am__append_62 = $(ARMCI_NETWORK_LIBS) \ @ARMCI_NETWORK_ARMCI_TRUE@ $(GA_MP_LIBS) @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_TRUE@am__append_63 = comex/libarmci.la @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_FALSE@am__append_64 = armci/libarmci.la @ARMCI_NETWORK_ARMCI_FALSE@am__append_65 = $(GA_MP_LIBS) \ @ARMCI_NETWORK_ARMCI_FALSE@ $(ARMCI_NETWORK_LIBS) TESTS = $(am__EXEEXT_19) $(am__EXEEXT_20) XFAIL_TESTS = $(am__EXEEXT_21) $(am__EXEEXT_22) subdir = . DIST_COMMON = README $(am__configure_deps) $(am__include_HEADERS_DIST) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in $(top_srcdir)/configure \ $(top_srcdir)/gaf2c/farg.h.in \ $(top_srcdir)/gaf2c/typesf2c.h.in \ $(top_srcdir)/global/src/global.fh.in \ $(top_srcdir)/ma/mafdecls.fh.in $(top_srcdir)/ma/matypes.h.in \ $(top_srcdir)/tools/ga-config.in INSTALL NEWS \ build-aux/config.guess build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/ltmain.sh build-aux/missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/armci_setup.m4 \ $(top_srcdir)/m4/ax_sys_weak_alias.m4 \ $(top_srcdir)/m4/ga_ar.m4 $(top_srcdir)/m4/ga_arg_parse.m4 \ $(top_srcdir)/m4/ga_armci_network.m4 $(top_srcdir)/m4/ga_as.m4 \ $(top_srcdir)/m4/ga_blas.m4 \ $(top_srcdir)/m4/ga_c_match_types.m4 \ $(top_srcdir)/m4/ga_c_opt.m4 $(top_srcdir)/m4/ga_check_func.m4 \ $(top_srcdir)/m4/ga_check_header.m4 \ $(top_srcdir)/m4/ga_check_libplot.m4 \ $(top_srcdir)/m4/ga_compiler_vendor.m4 \ $(top_srcdir)/m4/ga_cross_compiling.m4 \ $(top_srcdir)/m4/ga_cxx.m4 \ $(top_srcdir)/m4/ga_cxx_namespaces.m4 \ $(top_srcdir)/m4/ga_cxx_opt.m4 $(top_srcdir)/m4/ga_elpa.m4 \ $(top_srcdir)/m4/ga_enable_checkpoint.m4 \ $(top_srcdir)/m4/ga_enable_eispack.m4 \ $(top_srcdir)/m4/ga_enable_opt.m4 \ $(top_srcdir)/m4/ga_enable_peigs.m4 \ $(top_srcdir)/m4/ga_enable_profile.m4 \ $(top_srcdir)/m4/ga_enable_trace.m4 \ $(top_srcdir)/m4/ga_enable_unit.m4 \ $(top_srcdir)/m4/ga_f2c_cmdargs.m4 \ $(top_srcdir)/m4/ga_f2c_match_types.m4 \ $(top_srcdir)/m4/ga_f2c_nomain.m4 \ $(top_srcdir)/m4/ga_f2c_rand.m4 \ $(top_srcdir)/m4/ga_f2c_string.m4 \ $(top_srcdir)/m4/ga_f77_check_sizeof.m4 \ $(top_srcdir)/m4/ga_f77_cpp_symbols.m4 \ $(top_srcdir)/m4/ga_f77_disable.m4 \ $(top_srcdir)/m4/ga_f77_fixed.m4 \ $(top_srcdir)/m4/ga_f77_flush.m4 \ $(top_srcdir)/m4/ga_f77_integer_size.m4 \ $(top_srcdir)/m4/ga_f77_ld_override.m4 \ $(top_srcdir)/m4/ga_f77_library_ldflags.m4 \ $(top_srcdir)/m4/ga_f77_mismatch_type.m4 \ $(top_srcdir)/m4/ga_f77_opt.m4 \ $(top_srcdir)/m4/ga_f77_underscore.m4 \ $(top_srcdir)/m4/ga_function.m4 \ $(top_srcdir)/m4/ga_gnu_loop_opt.m4 \ $(top_srcdir)/m4/ga_lapack.m4 \ $(top_srcdir)/m4/ga_mpi_test_disable.m4 \ $(top_srcdir)/m4/ga_mpi_unwrap.m4 $(top_srcdir)/m4/ga_mpicc.m4 \ $(top_srcdir)/m4/ga_mpicc_test.m4 \ $(top_srcdir)/m4/ga_mpicxx.m4 \ $(top_srcdir)/m4/ga_mpicxx_test.m4 \ $(top_srcdir)/m4/ga_mpif77.m4 \ $(top_srcdir)/m4/ga_mpif77_test.m4 \ $(top_srcdir)/m4/ga_msg_comms.m4 \ $(top_srcdir)/m4/ga_progname.m4 \ $(top_srcdir)/m4/ga_scalapack.m4 \ $(top_srcdir)/m4/ga_suppress_msg.m4 \ $(top_srcdir)/m4/ga_sys_weak_alias.m4 \ $(top_srcdir)/m4/ga_target.m4 \ $(top_srcdir)/m4/ga_thread_safe.m4 \ $(top_srcdir)/m4/ga_union_semun.m4 \ $(top_srcdir)/m4/ga_warn_flags.m4 \ $(top_srcdir)/m4/ga_with_help.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/lt_obsolete.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/ma_enable_armci_mem.m4 \ $(top_srcdir)/m4/ma_long_double.m4 \ $(top_srcdir)/m4/ma_stats.m4 $(top_srcdir)/m4/ma_verify.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gaf2c/farg.h gaf2c/typesf2c.h \ global/src/global.fh ma/mafdecls.fh ma/matypes.h \ tools/ga-config CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libga___la_LIBADD = am__libga___la_SOURCES_DIST = ga++/src/GAServices.cc \ ga++/src/GlobalArray.cc ga++/src/PGroup.cc \ ga++/src/init_term.cc ga++/src/overload.cc \ ga++/src/services.cc am__dirstamp = $(am__leading_dot)dirstamp @CXX_BINDINGS_TRUE@am_libga___la_OBJECTS = ga++/src/GAServices.lo \ @CXX_BINDINGS_TRUE@ ga++/src/GlobalArray.lo ga++/src/PGroup.lo \ @CXX_BINDINGS_TRUE@ ga++/src/init_term.lo ga++/src/overload.lo \ @CXX_BINDINGS_TRUE@ ga++/src/services.lo libga___la_OBJECTS = $(am_libga___la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent @CXX_BINDINGS_TRUE@am_libga___la_rpath = -rpath $(libdir) am__DEPENDENCIES_1 = @ARMCI_NETWORK_ARMCI_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) \ @ARMCI_NETWORK_ARMCI_TRUE@ $(am__DEPENDENCIES_1) @ARMCI_NETWORK_ARMCI_FALSE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) \ @ARMCI_NETWORK_ARMCI_FALSE@ $(am__DEPENDENCIES_1) libga_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__append_63) $(am__append_64) \ $(am__DEPENDENCIES_3) am__libga_la_SOURCES_DIST = compat/random.c ma/error.c ma/f2c.c \ ma/ma.c ma/ma.h ma/memcpy.h ma/string-util.c ma/table.c \ ma/maf.F LinAlg/lapack+blas/gal_cgemm.f \ LinAlg/lapack+blas/gal_daxpy.f LinAlg/lapack+blas/gal_dcabs1.f \ LinAlg/lapack+blas/gal_dcopy.f LinAlg/lapack+blas/gal_ddot.f \ LinAlg/lapack+blas/gal_dgemm.f LinAlg/lapack+blas/gal_dgemv.f \ LinAlg/lapack+blas/gal_dger.f LinAlg/lapack+blas/gal_dgetf2.f \ LinAlg/lapack+blas/gal_dgetrf.f \ LinAlg/lapack+blas/gal_dgetrs.f \ LinAlg/lapack+blas/gal_disnan.f \ LinAlg/lapack+blas/gal_dlacpy.f LinAlg/lapack+blas/gal_dlae2.f \ LinAlg/lapack+blas/gal_dlaev2.f \ LinAlg/lapack+blas/gal_dlaisnan.f \ LinAlg/lapack+blas/gal_dlamch.f \ LinAlg/lapack+blas/gal_dlanst.f \ LinAlg/lapack+blas/gal_dlansy.f \ LinAlg/lapack+blas/gal_dlapy2.f \ LinAlg/lapack+blas/gal_dlarfb.f LinAlg/lapack+blas/gal_dlarf.f \ LinAlg/lapack+blas/gal_dlarfg.f \ LinAlg/lapack+blas/gal_dlarft.f \ LinAlg/lapack+blas/gal_dlartg.f \ LinAlg/lapack+blas/gal_dlascl.f \ LinAlg/lapack+blas/gal_dlaset.f LinAlg/lapack+blas/gal_dlasr.f \ LinAlg/lapack+blas/gal_dlasrt.f \ LinAlg/lapack+blas/gal_dlassq.f \ LinAlg/lapack+blas/gal_dlaswp.f \ LinAlg/lapack+blas/gal_dlatrd.f LinAlg/lapack+blas/gal_dnrm2.f \ LinAlg/lapack+blas/gal_dorg2l.f \ LinAlg/lapack+blas/gal_dorg2r.f \ LinAlg/lapack+blas/gal_dorgql.f \ LinAlg/lapack+blas/gal_dorgqr.f \ LinAlg/lapack+blas/gal_dorgtr.f \ LinAlg/lapack+blas/gal_dpotf2.f \ LinAlg/lapack+blas/gal_dpotrf.f LinAlg/lapack+blas/gal_dscal.f \ LinAlg/lapack+blas/gal_dsteqr.f \ LinAlg/lapack+blas/gal_dsterf.f LinAlg/lapack+blas/gal_dswap.f \ LinAlg/lapack+blas/gal_dsyev.f LinAlg/lapack+blas/gal_dsygs2.f \ LinAlg/lapack+blas/gal_dsygst.f LinAlg/lapack+blas/gal_dsygv.f \ LinAlg/lapack+blas/gal_dsymm.f LinAlg/lapack+blas/gal_dsymv.f \ LinAlg/lapack+blas/gal_dsyr2.f LinAlg/lapack+blas/gal_dsyr2k.f \ LinAlg/lapack+blas/gal_dsyrk.f LinAlg/lapack+blas/gal_dsytd2.f \ LinAlg/lapack+blas/gal_dsytrd.f LinAlg/lapack+blas/gal_dtrmm.f \ LinAlg/lapack+blas/gal_dtrmv.f LinAlg/lapack+blas/gal_dtrsm.f \ LinAlg/lapack+blas/gal_dtrsv.f LinAlg/lapack+blas/gal_idamax.f \ LinAlg/lapack+blas/gal_ieeeck.f \ LinAlg/lapack+blas/gal_iladlc.f \ LinAlg/lapack+blas/gal_iladlr.f \ LinAlg/lapack+blas/gal_ilaenv.f \ LinAlg/lapack+blas/gal_iparmq.f LinAlg/lapack+blas/gal_lsame.f \ LinAlg/lapack+blas/gal_sgemm.f LinAlg/lapack+blas/gal_xerbla.f \ LinAlg/lapack+blas/gal_zaxpy.f LinAlg/lapack+blas/gal_zgemm.f \ LinAlg/lapack+blas/xgemm.c LinAlg/lapack+blas/xgemm.h \ LinAlg/lapack+blas/galinalg.h LinAlg/lapack+blas/galinalg.fh \ global/src/abstract_ops.h global/src/base.c global/src/base.h \ global/src/capi.c global/src/cnames.h global/src/collect.c \ global/src/datatypes.c global/src/decomp.c global/src/diag.fh \ global/src/DP.c global/src/elem_alg.c global/src/fapi.c \ global/src/ga_ckpt.h global/src/gaconfig.h \ global/src/ga_diag_seqc.c global/src/ga_malloc.c \ global/src/ga_profile.h global/src/ga_solve_seq.c \ global/src/ga_symmetr.c global/src/ga_trace.c \ global/src/ghosts.c global/src/global.h \ global/src/global.nalg.c global/src/global.npatch.c \ global/src/global.periodic.c global/src/globalp.h \ global/src/global.util.c global/src/hsort.scat.c \ global/src/matmul.c global/src/matmul.h global/src/matrix.c \ global/src/nbutil.c global/src/onesided.c \ global/src/peigstubs.c global/src/scalapack.fh \ global/src/sclstubs.c global/src/select.c global/src/sparse.c \ global/src/types.xh global/src/types2.xh global/src/complex.F \ global/src/ga_diag_seq.F global/src/rsg.F \ global/src/ga_dgemmf.F global/src/ga_diag.F \ global/src/scalapack.F global/src/ga_ckpt.c \ pario/dra/buffers.c pario/dra/buffers.h pario/dra/capi.c \ pario/dra/disk.arrays.c pario/dra/disk.param.c \ pario/dra/draf2c.h pario/dra/drap.h pario/dra/env.c \ pario/dra/fortran.c pario/dra/patch.util.c pario/eaf/eaf.c \ pario/eaf/eaf_f2c.c pario/eaf/eafP.h pario/elio/elio.c \ pario/elio/eliop.h pario/elio/pablo.h pario/elio/stat.c \ pario/sf/sf_capi.c pario/sf/sff2c.h pario/sf/sf_fortran.c \ pario/sf/shared.files.c gparrays/src/gpbase.c \ gparrays/src/gpbase.h gparrays/src/gpcapi.c \ gparrays/src/gpfapi.c gparrays/src/gponesided.c \ gparrays/src/gp-papi.h gaf2c/gaf2c.c gaf2c/drand.c \ gaf2c/farg.F tcgmsg/capi.c tcgmsg/fapi.c \ tcgmsg/tcgmsg-mpi/checkbyte.c tcgmsg/tcgmsg-mpi/clustercheck.c \ tcgmsg/tcgmsg-mpi/collect.c tcgmsg/tcgmsg-mpi/drand48.c \ tcgmsg/tcgmsg-mpi/evlog.c tcgmsg/tcgmsg-mpi/evlog.h \ tcgmsg/tcgmsg-mpi/evon.c tcgmsg/tcgmsg-mpi/llog.c \ tcgmsg/tcgmsg-mpi/misc.c tcgmsg/tcgmsg-mpi/niceftn.c \ tcgmsg/tcgmsg-mpi/nxtval-armci.c tcgmsg/tcgmsg-mpi/p2p.c \ tcgmsg/tcgmsg-mpi/pbeginf.c tcgmsg/tcgmsg-mpi/pfilecopy.c \ tcgmsg/tcgmsg-mpi/sizeof.c tcgmsg/tcgmsg-mpi/sndrcv.h \ tcgmsg/tcgmsg-mpi/srftoc.h tcgmsg/tcgmsg-mpi/tcgmsgP.h @ENABLE_F77_TRUE@am__objects_1 = ma/maf.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_cgemm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_daxpy.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dcabs1.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dcopy.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ddot.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgemm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgemv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dger.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetf2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetrf.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dgetrs.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_disnan.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlacpy.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlae2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaev2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaisnan.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlamch.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlanst.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlansy.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlapy2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarfb.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarf.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarfg.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlarft.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlartg.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlascl.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaset.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlasr.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlasrt.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlassq.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlaswp.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dlatrd.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dnrm2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorg2l.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorg2r.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgql.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgqr.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dorgtr.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dpotf2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dpotrf.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dscal.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsteqr.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsterf.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dswap.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyev.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygs2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygst.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsygv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsymm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsymv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyr2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyr2k.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsyrk.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsytd2.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dsytrd.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrmm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrmv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrsm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_dtrsv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_idamax.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ieeeck.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iladlc.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iladlr.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_ilaenv.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_iparmq.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_lsame.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_sgemm.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_xerbla.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_zaxpy.lo \ @ENABLE_F77_TRUE@ LinAlg/lapack+blas/gal_zgemm.lo @ENABLE_F77_TRUE@am__objects_2 = global/src/complex.lo \ @ENABLE_F77_TRUE@ global/src/ga_diag_seq.lo global/src/rsg.lo @CRAY_XT_NETWORKS_TRUE@@ENABLE_F77_TRUE@am__objects_3 = global/src/ga_dgemmf.lo @ENABLE_F77_TRUE@@ENABLE_PEIGS_TRUE@am__objects_4 = \ @ENABLE_F77_TRUE@@ENABLE_PEIGS_TRUE@ global/src/ga_diag.lo @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@am__objects_5 = \ @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@ global/src/scalapack.lo @ENABLE_CHECKPOINT_TRUE@am__objects_6 = global/src/ga_ckpt.lo @ENABLE_GPARRAYS_TRUE@am__objects_7 = gparrays/src/gpbase.lo \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gpcapi.lo \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gpfapi.lo \ @ENABLE_GPARRAYS_TRUE@ gparrays/src/gponesided.lo @ENABLE_F77_TRUE@am__objects_8 = gaf2c/farg.lo @MSG_COMMS_MPI_TRUE@am__objects_9 = tcgmsg/tcgmsg-mpi/checkbyte.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/clustercheck.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/collect.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/drand48.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/evlog.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/evon.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/llog.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/misc.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/niceftn.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/nxtval-armci.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/p2p.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/pbeginf.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/pfilecopy.lo \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tcgmsg-mpi/sizeof.lo am_libga_la_OBJECTS = compat/random.lo ma/error.lo ma/f2c.lo ma/ma.lo \ ma/string-util.lo ma/table.lo $(am__objects_1) \ LinAlg/lapack+blas/xgemm.lo global/src/base.lo \ global/src/capi.lo global/src/collect.lo \ global/src/datatypes.lo global/src/decomp.lo global/src/DP.lo \ global/src/elem_alg.lo global/src/fapi.lo \ global/src/ga_diag_seqc.lo global/src/ga_malloc.lo \ global/src/ga_solve_seq.lo global/src/ga_symmetr.lo \ global/src/ga_trace.lo global/src/ghosts.lo \ global/src/global.nalg.lo global/src/global.npatch.lo \ global/src/global.periodic.lo global/src/global.util.lo \ global/src/hsort.scat.lo global/src/matmul.lo \ global/src/matrix.lo global/src/nbutil.lo \ global/src/onesided.lo global/src/peigstubs.lo \ global/src/sclstubs.lo global/src/select.lo \ global/src/sparse.lo $(am__objects_2) $(am__objects_3) \ $(am__objects_4) $(am__objects_5) $(am__objects_6) \ pario/dra/buffers.lo pario/dra/capi.lo \ pario/dra/disk.arrays.lo pario/dra/disk.param.lo \ pario/dra/env.lo pario/dra/fortran.lo pario/dra/patch.util.lo \ pario/eaf/eaf.lo pario/eaf/eaf_f2c.lo pario/elio/elio.lo \ pario/elio/stat.lo pario/sf/sf_capi.lo pario/sf/sf_fortran.lo \ pario/sf/shared.files.lo $(am__objects_7) gaf2c/gaf2c.lo \ gaf2c/drand.lo $(am__objects_8) tcgmsg/capi.lo tcgmsg/fapi.lo \ $(am__objects_9) @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__objects_10 = tools/ga-wapi.lo @ENABLE_GPARRAYS_TRUE@@ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_FALSE@am__objects_11 = tools/gp-wapi.lo am__objects_12 = nodist_libga_la_OBJECTS = $(am__objects_10) $(am__objects_11) \ $(am__objects_12) libga_la_OBJECTS = $(am_libga_la_OBJECTS) $(nodist_libga_la_OBJECTS) libwapi_la_LIBADD = am__libwapi_la_SOURCES_DIST = tools/ga-wapi.c tools/gp-wapi.c @ENABLE_GPARRAYS_TRUE@@ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am__objects_13 = tools/gp-wapi.lo @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am_libwapi_la_OBJECTS = tools/ga-wapi.lo \ @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@ $(am__objects_13) libwapi_la_OBJECTS = $(am_libwapi_la_OBJECTS) @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@am_libwapi_la_rpath = -rpath \ @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@ $(libdir) @ENABLE_XREGION_TRUE@@NO_X_FALSE@am__EXEEXT_1 = \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/xregion$(EXEEXT) @ENABLE_F77_TRUE@am__EXEEXT_2 = ma/testf$(EXEEXT) @ENABLE_F77_TRUE@am__EXEEXT_3 = global/testing/bin$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/blktest$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/d2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/g2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/g3test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ga_lu$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ga_shift$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ghosts$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/jacobi$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mir_perf2$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mmatrix$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/mulmatpatch$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/nb2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/ndim$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch2$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/patch_enumf$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perfmod$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perform$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/perf$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pg2testmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pg2test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pgtestmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/pgtest$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/random$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/scan$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/simple_groups$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/sparse$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/sprsmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/stride$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testeig$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testmatmult$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/testsolve$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/test_mirrored$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/types_test$(EXEEXT) \ @ENABLE_F77_TRUE@ global/testing/field_test$(EXEEXT) @ENABLE_F77_TRUE@@HAVE_SCALAPACK_TRUE@am__EXEEXT_4 = global/testing/testspd$(EXEEXT) @ENABLE_F77_TRUE@@MSG_COMMS_MPI_TRUE@am__EXEEXT_5 = global/testing/simple_groups_comm$(EXEEXT) @ENABLE_F77_FALSE@@HAVE_LAPACK_TRUE@am__EXEEXT_6 = global/testing/ga_lu$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__EXEEXT_7 = global/testing/ga-mpi$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ global/testing/lock$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ global/testing/simple_groups_commc$(EXEEXT) @SYSV_TRUE@am__EXEEXT_8 = global/testing/ipc_clean$(EXEEXT) @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@am__EXEEXT_9 = global/testing/unit-tests/ga_abs_value$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_acc$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_constant$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_constantpatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_diagonal$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_add_patch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copy$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copypatch2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_copypatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create1$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_handle$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_create_irreg$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_destroy$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_dgop$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_dot$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_duplicate$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_divide$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_dividepatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_maximum$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_maximumpatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_minimum$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_minimumpatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_multiply$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_elem_multiplypatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fill$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fillpatch1$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_fillpatch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_gather$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get_blockinfo$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_get_diagonal$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_igop2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_igop$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_inquire$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_intialize$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_lgop$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_median$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_ndim2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_ndim$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_nnodes$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_nodeid$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create4$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create5$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_create$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_destroy2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_destroy$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_nnodes_nodeid$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_pgroup_setdefault$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_put2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_put$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_cols$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_patch$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scale_rows$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_scatter$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_data$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_diagonal$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_set_restricted$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_solve$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_sync$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose3$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_transpose$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zero$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zerodiagonal$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zeropatch2$(EXEEXT) \ @ENABLE_UNIT_TESTS_TRUE@@MSG_COMMS_MPI_TRUE@ global/testing/unit-tests/ga_zeropatch$(EXEEXT) @ENABLE_F77_TRUE@@HAVE_M4_TRUE@am__EXEEXT_10 = global/testing/nga-onesided$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-patch$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-periodic$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-scatter$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/nga-util$(EXEEXT) \ @ENABLE_F77_TRUE@@HAVE_M4_TRUE@ global/testing/ngatest$(EXEEXT) @ENABLE_F77_TRUE@am__EXEEXT_11 = \ @ENABLE_F77_TRUE@ global/examples/boltzmann/boltz$(EXEEXT) \ @ENABLE_F77_TRUE@ global/examples/conjugate_gradient/ga_cg$(EXEEXT) \ @ENABLE_F77_TRUE@ global/examples/md_cluster/grp_sim$(EXEEXT) \ @ENABLE_F77_TRUE@ global/examples/scf/scf$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/big$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/dra_mxm$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/ntest$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/perf$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/perf2$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/perf3$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/test$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/test_mxm$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/dra/time_mxm$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/eaf/test$(EXEEXT) \ @ENABLE_F77_TRUE@ pario/sf/test$(EXEEXT) @CXX_BINDINGS_TRUE@am__EXEEXT_12 = ga++/testing/elempatch$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/mtest$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/ntestc$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/testc$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/testmult$(EXEEXT) @ENABLE_F77_TRUE@@ENABLE_GPARRAYS_TRUE@am__EXEEXT_13 = gparrays/testing/test$(EXEEXT) @ENABLE_GPARRAYS_TRUE@am__EXEEXT_14 = gparrays/testing/testc$(EXEEXT) \ @ENABLE_GPARRAYS_TRUE@ gparrays/testing/transpose$(EXEEXT) @ENABLE_F77_TRUE@am__EXEEXT_15 = gaf2c/testarg$(EXEEXT) @MSG_COMMS_MPI_TRUE@am__EXEEXT_16 = tcgmsg/tests/test_asyn$(EXEEXT) \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tests/test$(EXEEXT) @ENABLE_F77_TRUE@@MSG_COMMS_MPI_TRUE@am__EXEEXT_17 = tcgmsg/tests/testf$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) LIBOBJDIR = compat/ am__ga___testing_elempatch_SOURCES_DIST = ga++/testing/elempatch.cc @CXX_BINDINGS_TRUE@am_ga___testing_elempatch_OBJECTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/elempatch.$(OBJEXT) ga___testing_elempatch_OBJECTS = $(am_ga___testing_elempatch_OBJECTS) am__DEPENDENCIES_4 = $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) @ENABLE_F77_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) @CXX_BINDINGS_TRUE@ga___testing_elempatch_DEPENDENCIES = libga++.la \ @CXX_BINDINGS_TRUE@ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) ga___testing_elempatch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(ga___testing_elempatch_LDFLAGS) \ $(LDFLAGS) -o $@ am__ga___testing_mtest_SOURCES_DIST = ga++/testing/mtest.cc @CXX_BINDINGS_TRUE@am_ga___testing_mtest_OBJECTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/mtest.$(OBJEXT) ga___testing_mtest_OBJECTS = $(am_ga___testing_mtest_OBJECTS) @CXX_BINDINGS_TRUE@ga___testing_mtest_DEPENDENCIES = libga++.la \ @CXX_BINDINGS_TRUE@ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) ga___testing_mtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(ga___testing_mtest_LDFLAGS) \ $(LDFLAGS) -o $@ am__ga___testing_ntestc_SOURCES_DIST = ga++/testing/ntestc.cc \ ga++/testing/util.c @CXX_BINDINGS_TRUE@am_ga___testing_ntestc_OBJECTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/ntestc.$(OBJEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/util.$(OBJEXT) ga___testing_ntestc_OBJECTS = $(am_ga___testing_ntestc_OBJECTS) @CXX_BINDINGS_TRUE@ga___testing_ntestc_DEPENDENCIES = libga++.la \ @CXX_BINDINGS_TRUE@ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) ga___testing_ntestc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(ga___testing_ntestc_LDFLAGS) \ $(LDFLAGS) -o $@ am__ga___testing_testc_SOURCES_DIST = ga++/testing/testc.cc @CXX_BINDINGS_TRUE@am_ga___testing_testc_OBJECTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/testc.$(OBJEXT) ga___testing_testc_OBJECTS = $(am_ga___testing_testc_OBJECTS) @CXX_BINDINGS_TRUE@ga___testing_testc_DEPENDENCIES = libga++.la \ @CXX_BINDINGS_TRUE@ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) ga___testing_testc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(ga___testing_testc_LDFLAGS) \ $(LDFLAGS) -o $@ am__ga___testing_testmult_SOURCES_DIST = ga++/testing/testmult.cc @CXX_BINDINGS_TRUE@am_ga___testing_testmult_OBJECTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/testmult.$(OBJEXT) ga___testing_testmult_OBJECTS = $(am_ga___testing_testmult_OBJECTS) @CXX_BINDINGS_TRUE@ga___testing_testmult_DEPENDENCIES = libga++.la \ @CXX_BINDINGS_TRUE@ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) ga___testing_testmult_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(ga___testing_testmult_LDFLAGS) \ $(LDFLAGS) -o $@ am_gaf2c_testarg_OBJECTS = gaf2c/testarg.$(OBJEXT) \ gaf2c/testargf.$(OBJEXT) gaf2c_testarg_OBJECTS = $(am_gaf2c_testarg_OBJECTS) gaf2c_testarg_LDADD = $(LDADD) gaf2c_testarg_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) gaf2c_testarg_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(gaf2c_testarg_LDFLAGS) $(LDFLAGS) -o \ $@ am__global_X_xregion_SOURCES_DIST = global/X/xregion_colormap.c \ global/X/xregion_dialog.c global/X/xregion_display.c \ global/X/xregion_fileio.c global/X/xregion_main.c \ global/X/xregion_overview.c global/X/xregion_pixregion.c \ global/X/xregion_scrollbars.c global/X/xregion_util.c \ global/X/xregion_view.c global/X/xregion_xcmap.c @ENABLE_XREGION_TRUE@@NO_X_FALSE@am_global_X_xregion_OBJECTS = global/X/global_X_xregion-xregion_colormap.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_dialog.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_display.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_fileio.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_main.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_overview.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_pixregion.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_scrollbars.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_util.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_view.$(OBJEXT) \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@ global/X/global_X_xregion-xregion_xcmap.$(OBJEXT) global_X_xregion_OBJECTS = $(am_global_X_xregion_OBJECTS) global_X_xregion_DEPENDENCIES = global_X_xregion_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(global_X_xregion_LDFLAGS) $(LDFLAGS) \ -o $@ am_global_examples_boltzmann_boltz_OBJECTS = global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-equil.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-main.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-properties.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-setup.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.$(OBJEXT) \ global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.$(OBJEXT) global_examples_boltzmann_boltz_OBJECTS = \ $(am_global_examples_boltzmann_boltz_OBJECTS) global_examples_boltzmann_boltz_LDADD = $(LDADD) global_examples_boltzmann_boltz_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_examples_boltzmann_boltz_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) \ $(global_examples_boltzmann_boltz_LDFLAGS) $(LDFLAGS) -o $@ am_global_examples_conjugate_gradient_ga_cg_OBJECTS = \ global/examples/conjugate_gradient/computeloops.$(OBJEXT) \ global/examples/conjugate_gradient/ga_cg.$(OBJEXT) \ global/examples/conjugate_gradient/matvecmul.$(OBJEXT) \ global/examples/conjugate_gradient/read_input.$(OBJEXT) global_examples_conjugate_gradient_ga_cg_OBJECTS = \ $(am_global_examples_conjugate_gradient_ga_cg_OBJECTS) global_examples_conjugate_gradient_ga_cg_LDADD = $(LDADD) global_examples_conjugate_gradient_ga_cg_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_examples_lennard_jones_lennard_OBJECTS = \ global/examples/lennard-jones/lennard.$(OBJEXT) global_examples_lennard_jones_lennard_OBJECTS = \ $(am_global_examples_lennard_jones_lennard_OBJECTS) global_examples_lennard_jones_lennard_LDADD = $(LDADD) global_examples_lennard_jones_lennard_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_examples_md_cluster_grp_sim_OBJECTS = \ global/examples/md_cluster/cell_list.$(OBJEXT) \ global/examples/md_cluster/cl_sim.$(OBJEXT) \ global/examples/md_cluster/cluster.$(OBJEXT) \ global/examples/md_cluster/estats.$(OBJEXT) \ global/examples/md_cluster/factor.$(OBJEXT) \ global/examples/md_cluster/force.$(OBJEXT) \ global/examples/md_cluster/gather.$(OBJEXT) \ global/examples/md_cluster/grp_sim.$(OBJEXT) \ global/examples/md_cluster/hash.$(OBJEXT) \ global/examples/md_cluster/heapsort.$(OBJEXT) \ global/examples/md_cluster/kin.$(OBJEXT) \ global/examples/md_cluster/mdinit.$(OBJEXT) \ global/examples/md_cluster/mdout.$(OBJEXT) \ global/examples/md_cluster/mdstep.$(OBJEXT) \ global/examples/md_cluster/newcfg.$(OBJEXT) \ global/examples/md_cluster/nextc.$(OBJEXT) \ global/examples/md_cluster/pairs.$(OBJEXT) \ global/examples/md_cluster/ran3.$(OBJEXT) \ global/examples/md_cluster/rdpar.$(OBJEXT) \ global/examples/md_cluster/scatter.$(OBJEXT) \ global/examples/md_cluster/shuffle.$(OBJEXT) \ global/examples/md_cluster/sort.$(OBJEXT) \ global/examples/md_cluster/tstats.$(OBJEXT) \ global/examples/md_cluster/update.$(OBJEXT) global_examples_md_cluster_grp_sim_OBJECTS = \ $(am_global_examples_md_cluster_grp_sim_OBJECTS) global_examples_md_cluster_grp_sim_LDADD = $(LDADD) global_examples_md_cluster_grp_sim_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_examples_md_cluster_grp_sim_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=F77 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ $(global_examples_md_cluster_grp_sim_LDFLAGS) $(LDFLAGS) -o $@ am_global_examples_scf_scf_OBJECTS = \ global/examples/scf/input.$(OBJEXT) \ global/examples/scf/integ.$(OBJEXT) \ global/examples/scf/output.$(OBJEXT) \ global/examples/scf/scf.$(OBJEXT) \ global/examples/scf/timer.$(OBJEXT) global_examples_scf_scf_OBJECTS = \ $(am_global_examples_scf_scf_OBJECTS) global_examples_scf_scf_LDADD = $(LDADD) global_examples_scf_scf_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_examples_scf_scf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_examples_scf_scf_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_big_SOURCES_DIST = global/testing/big.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F @ENABLE_F77_TRUE@am__objects_14 = global/testing/ffflush.$(OBJEXT) \ @ENABLE_F77_TRUE@ global/testing/testblas.$(OBJEXT) am__objects_15 = global/testing/util.$(OBJEXT) $(am__objects_14) am_global_testing_big_OBJECTS = global/testing/big.$(OBJEXT) \ $(am__objects_15) global_testing_big_OBJECTS = $(am_global_testing_big_OBJECTS) global_testing_big_LDADD = $(LDADD) global_testing_big_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_bin_SOURCES_DIST = global/testing/bin.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_bin_OBJECTS = global/testing/bin.$(OBJEXT) \ $(am__objects_15) global_testing_bin_OBJECTS = $(am_global_testing_bin_OBJECTS) global_testing_bin_LDADD = $(LDADD) global_testing_bin_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_bin_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_bin_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_blktest_SOURCES_DIST = global/testing/blktest.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_blktest_OBJECTS = global/testing/blktest.$(OBJEXT) \ $(am__objects_15) global_testing_blktest_OBJECTS = $(am_global_testing_blktest_OBJECTS) global_testing_blktest_LDADD = $(LDADD) global_testing_blktest_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_blktest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_blktest_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_d2test_SOURCES_DIST = global/testing/d2test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_d2test_OBJECTS = global/testing/d2test.$(OBJEXT) \ $(am__objects_15) global_testing_d2test_OBJECTS = $(am_global_testing_d2test_OBJECTS) global_testing_d2test_LDADD = $(LDADD) global_testing_d2test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_d2test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_d2test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_elempatch_SOURCES_DIST = \ global/testing/elempatch.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_elempatch_OBJECTS = \ global/testing/elempatch.$(OBJEXT) $(am__objects_15) global_testing_elempatch_OBJECTS = \ $(am_global_testing_elempatch_OBJECTS) global_testing_elempatch_LDADD = $(LDADD) global_testing_elempatch_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_field_test_SOURCES_DIST = \ global/testing/field-test.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_field_test_OBJECTS = \ global/testing/field-test.$(OBJEXT) $(am__objects_15) global_testing_field_test_OBJECTS = \ $(am_global_testing_field_test_OBJECTS) global_testing_field_test_LDADD = $(LDADD) global_testing_field_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_field_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_field_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_g2test_SOURCES_DIST = global/testing/g2test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_g2test_OBJECTS = global/testing/g2test.$(OBJEXT) \ $(am__objects_15) global_testing_g2test_OBJECTS = $(am_global_testing_g2test_OBJECTS) global_testing_g2test_LDADD = $(LDADD) global_testing_g2test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_g2test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_g2test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_g3test_SOURCES_DIST = global/testing/g3test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_g3test_OBJECTS = global/testing/g3test.$(OBJEXT) \ $(am__objects_15) global_testing_g3test_OBJECTS = $(am_global_testing_g3test_OBJECTS) global_testing_g3test_LDADD = $(LDADD) global_testing_g3test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_g3test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_g3test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_ga_mpi_SOURCES_DIST = global/testing/ga-mpi.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ga_mpi_OBJECTS = global/testing/ga-mpi.$(OBJEXT) \ $(am__objects_15) global_testing_ga_mpi_OBJECTS = $(am_global_testing_ga_mpi_OBJECTS) global_testing_ga_mpi_LDADD = $(LDADD) global_testing_ga_mpi_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_ga_lu_SOURCES_DIST = global/testing/ga_lu.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ga_lu_OBJECTS = global/testing/ga_lu.$(OBJEXT) \ $(am__objects_15) global_testing_ga_lu_OBJECTS = $(am_global_testing_ga_lu_OBJECTS) global_testing_ga_lu_LDADD = $(LDADD) global_testing_ga_lu_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_ga_shift_SOURCES_DIST = global/testing/ga_shift.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ga_shift_OBJECTS = \ global/testing/ga_shift.$(OBJEXT) $(am__objects_15) global_testing_ga_shift_OBJECTS = \ $(am_global_testing_ga_shift_OBJECTS) global_testing_ga_shift_LDADD = $(LDADD) global_testing_ga_shift_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_ga_shift_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_ga_shift_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_gatscat_SOURCES_DIST = global/testing/gatscat.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_gatscat_OBJECTS = global/testing/gatscat.$(OBJEXT) \ $(am__objects_15) global_testing_gatscat_OBJECTS = $(am_global_testing_gatscat_OBJECTS) global_testing_gatscat_LDADD = $(LDADD) global_testing_gatscat_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_getmem_SOURCES_DIST = global/testing/getmem.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_getmem_OBJECTS = global/testing/getmem.$(OBJEXT) \ $(am__objects_15) global_testing_getmem_OBJECTS = $(am_global_testing_getmem_OBJECTS) global_testing_getmem_LDADD = $(LDADD) global_testing_getmem_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_ghosts_SOURCES_DIST = global/testing/ghosts.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ghosts_OBJECTS = global/testing/ghosts.$(OBJEXT) \ $(am__objects_15) global_testing_ghosts_OBJECTS = $(am_global_testing_ghosts_OBJECTS) global_testing_ghosts_LDADD = $(LDADD) global_testing_ghosts_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_ghosts_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_ghosts_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_ipc_clean_SOURCES_DIST = \ global/testing/ipc.clean.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_ipc_clean_OBJECTS = \ global/testing/ipc.clean.$(OBJEXT) $(am__objects_15) global_testing_ipc_clean_OBJECTS = \ $(am_global_testing_ipc_clean_OBJECTS) global_testing_ipc_clean_LDADD = $(LDADD) global_testing_ipc_clean_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_jacobi_SOURCES_DIST = global/testing/jacobi.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_jacobi_OBJECTS = global/testing/jacobi.$(OBJEXT) \ $(am__objects_15) global_testing_jacobi_OBJECTS = $(am_global_testing_jacobi_OBJECTS) global_testing_jacobi_LDADD = $(LDADD) global_testing_jacobi_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_jacobi_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_jacobi_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_lock_SOURCES_DIST = global/testing/lock.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_lock_OBJECTS = global/testing/lock.$(OBJEXT) \ $(am__objects_15) global_testing_lock_OBJECTS = $(am_global_testing_lock_OBJECTS) global_testing_lock_LDADD = $(LDADD) global_testing_lock_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_mir_perf2_SOURCES_DIST = \ global/testing/mir_perf2.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_mir_perf2_OBJECTS = \ global/testing/mir_perf2.$(OBJEXT) $(am__objects_15) global_testing_mir_perf2_OBJECTS = \ $(am_global_testing_mir_perf2_OBJECTS) global_testing_mir_perf2_LDADD = $(LDADD) global_testing_mir_perf2_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_mir_perf2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_mir_perf2_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_mmatrix_SOURCES_DIST = global/testing/mmatrix.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_mmatrix_OBJECTS = global/testing/mmatrix.$(OBJEXT) \ $(am__objects_15) global_testing_mmatrix_OBJECTS = $(am_global_testing_mmatrix_OBJECTS) global_testing_mmatrix_LDADD = $(LDADD) global_testing_mmatrix_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_mmatrix_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_mmatrix_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_mtest_SOURCES_DIST = global/testing/mtest.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_mtest_OBJECTS = global/testing/mtest.$(OBJEXT) \ $(am__objects_15) global_testing_mtest_OBJECTS = $(am_global_testing_mtest_OBJECTS) global_testing_mtest_LDADD = $(LDADD) global_testing_mtest_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_mulmatpatch_SOURCES_DIST = \ global/testing/mulmatpatch.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_mulmatpatch_OBJECTS = \ global/testing/mulmatpatch.$(OBJEXT) $(am__objects_15) global_testing_mulmatpatch_OBJECTS = \ $(am_global_testing_mulmatpatch_OBJECTS) global_testing_mulmatpatch_LDADD = $(LDADD) global_testing_mulmatpatch_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_mulmatpatch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_mulmatpatch_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_mulmatpatchc_SOURCES_DIST = \ global/testing/mulmatpatchc.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_mulmatpatchc_OBJECTS = \ global/testing/mulmatpatchc.$(OBJEXT) $(am__objects_15) global_testing_mulmatpatchc_OBJECTS = \ $(am_global_testing_mulmatpatchc_OBJECTS) global_testing_mulmatpatchc_LDADD = $(LDADD) global_testing_mulmatpatchc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_nb2test_SOURCES_DIST = global/testing/nb2test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_nb2test_OBJECTS = global/testing/nb2test.$(OBJEXT) \ $(am__objects_15) global_testing_nb2test_OBJECTS = $(am_global_testing_nb2test_OBJECTS) global_testing_nb2test_LDADD = $(LDADD) global_testing_nb2test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nb2test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nb2test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_ndim_SOURCES_DIST = global/testing/ndim.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ndim_OBJECTS = global/testing/ndim.$(OBJEXT) \ $(am__objects_15) global_testing_ndim_OBJECTS = $(am_global_testing_ndim_OBJECTS) global_testing_ndim_LDADD = $(LDADD) global_testing_ndim_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_ndim_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_ndim_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_nga_onesided_OBJECTS = \ global/testing/nga-onesided.$(OBJEXT) $(am__objects_15) global_testing_nga_onesided_OBJECTS = \ $(nodist_global_testing_nga_onesided_OBJECTS) global_testing_nga_onesided_LDADD = $(LDADD) global_testing_nga_onesided_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nga_onesided_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nga_onesided_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_nga_patch_OBJECTS = \ global/testing/nga-patch.$(OBJEXT) $(am__objects_15) global_testing_nga_patch_OBJECTS = \ $(nodist_global_testing_nga_patch_OBJECTS) global_testing_nga_patch_LDADD = $(LDADD) global_testing_nga_patch_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nga_patch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nga_patch_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_nga_periodic_OBJECTS = \ global/testing/nga-periodic.$(OBJEXT) $(am__objects_15) global_testing_nga_periodic_OBJECTS = \ $(nodist_global_testing_nga_periodic_OBJECTS) global_testing_nga_periodic_LDADD = $(LDADD) global_testing_nga_periodic_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nga_periodic_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nga_periodic_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_nga_scatter_OBJECTS = \ global/testing/nga-scatter.$(OBJEXT) $(am__objects_15) global_testing_nga_scatter_OBJECTS = \ $(nodist_global_testing_nga_scatter_OBJECTS) global_testing_nga_scatter_LDADD = $(LDADD) global_testing_nga_scatter_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nga_scatter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nga_scatter_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_nga_util_OBJECTS = \ global/testing/nga-util.$(OBJEXT) $(am__objects_15) global_testing_nga_util_OBJECTS = \ $(nodist_global_testing_nga_util_OBJECTS) global_testing_nga_util_LDADD = $(LDADD) global_testing_nga_util_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_nga_util_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_nga_util_LDFLAGS) \ $(LDFLAGS) -o $@ nodist_global_testing_ngatest_OBJECTS = \ global/testing/ngatest.$(OBJEXT) $(am__objects_15) global_testing_ngatest_OBJECTS = \ $(nodist_global_testing_ngatest_OBJECTS) global_testing_ngatest_LDADD = $(LDADD) global_testing_ngatest_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_ngatest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_ngatest_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_normc_SOURCES_DIST = global/testing/normc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_normc_OBJECTS = global/testing/normc.$(OBJEXT) \ $(am__objects_15) global_testing_normc_OBJECTS = $(am_global_testing_normc_OBJECTS) global_testing_normc_LDADD = $(LDADD) global_testing_normc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_ntestc_SOURCES_DIST = global/testing/ntestc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ntestc_OBJECTS = global/testing/ntestc.$(OBJEXT) \ $(am__objects_15) global_testing_ntestc_OBJECTS = $(am_global_testing_ntestc_OBJECTS) global_testing_ntestc_LDADD = $(LDADD) global_testing_ntestc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_ntestfc_SOURCES_DIST = global/testing/ntestfc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_ntestfc_OBJECTS = global/testing/ntestfc.$(OBJEXT) \ $(am__objects_15) global_testing_ntestfc_OBJECTS = $(am_global_testing_ntestfc_OBJECTS) global_testing_ntestfc_LDADD = $(LDADD) global_testing_ntestfc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_packc_SOURCES_DIST = global/testing/packc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_packc_OBJECTS = global/testing/packc.$(OBJEXT) \ $(am__objects_15) global_testing_packc_OBJECTS = $(am_global_testing_packc_OBJECTS) global_testing_packc_LDADD = $(LDADD) global_testing_packc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_patch_SOURCES_DIST = global/testing/patch.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_patch_OBJECTS = global/testing/patch.$(OBJEXT) \ $(am__objects_15) global_testing_patch_OBJECTS = $(am_global_testing_patch_OBJECTS) global_testing_patch_LDADD = $(LDADD) global_testing_patch_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_patch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_patch_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_patch2_SOURCES_DIST = global/testing/patch2.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_patch2_OBJECTS = global/testing/patch2.$(OBJEXT) \ $(am__objects_15) global_testing_patch2_OBJECTS = $(am_global_testing_patch2_OBJECTS) global_testing_patch2_LDADD = $(LDADD) global_testing_patch2_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_patch2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_patch2_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_patch_enumc_SOURCES_DIST = \ global/testing/patch_enumc.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_patch_enumc_OBJECTS = \ global/testing/patch_enumc.$(OBJEXT) $(am__objects_15) global_testing_patch_enumc_OBJECTS = \ $(am_global_testing_patch_enumc_OBJECTS) global_testing_patch_enumc_LDADD = $(LDADD) global_testing_patch_enumc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_patch_enumf_SOURCES_DIST = \ global/testing/patch_enumf.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_patch_enumf_OBJECTS = \ global/testing/patch_enumf.$(OBJEXT) $(am__objects_15) global_testing_patch_enumf_OBJECTS = \ $(am_global_testing_patch_enumf_OBJECTS) global_testing_patch_enumf_LDADD = $(LDADD) global_testing_patch_enumf_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_patch_enumf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_patch_enumf_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_perf_SOURCES_DIST = global/testing/perf.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_perf_OBJECTS = global/testing/perf.$(OBJEXT) \ $(am__objects_15) global_testing_perf_OBJECTS = $(am_global_testing_perf_OBJECTS) global_testing_perf_LDADD = $(LDADD) global_testing_perf_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_perf_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_perf2_SOURCES_DIST = global/testing/perf2.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_perf2_OBJECTS = global/testing/perf2.$(OBJEXT) \ $(am__objects_15) global_testing_perf2_OBJECTS = $(am_global_testing_perf2_OBJECTS) global_testing_perf2_LDADD = $(LDADD) global_testing_perf2_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_perfmod_SOURCES_DIST = global/testing/perfmod.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_perfmod_OBJECTS = global/testing/perfmod.$(OBJEXT) \ $(am__objects_15) global_testing_perfmod_OBJECTS = $(am_global_testing_perfmod_OBJECTS) global_testing_perfmod_LDADD = $(LDADD) global_testing_perfmod_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_perfmod_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_perfmod_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_perform_SOURCES_DIST = global/testing/perform.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_perform_OBJECTS = global/testing/perform.$(OBJEXT) \ $(am__objects_15) global_testing_perform_OBJECTS = $(am_global_testing_perform_OBJECTS) global_testing_perform_LDADD = $(LDADD) global_testing_perform_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_perform_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_perform_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_pg2test_SOURCES_DIST = global/testing/pg2test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_pg2test_OBJECTS = global/testing/pg2test.$(OBJEXT) \ $(am__objects_15) global_testing_pg2test_OBJECTS = $(am_global_testing_pg2test_OBJECTS) global_testing_pg2test_LDADD = $(LDADD) global_testing_pg2test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_pg2test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_pg2test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_pg2testmatmult_SOURCES_DIST = \ global/testing/pg2testmatmult.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_pg2testmatmult_OBJECTS = \ global/testing/pg2testmatmult.$(OBJEXT) $(am__objects_15) global_testing_pg2testmatmult_OBJECTS = \ $(am_global_testing_pg2testmatmult_OBJECTS) global_testing_pg2testmatmult_LDADD = $(LDADD) global_testing_pg2testmatmult_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_pg2testmatmult_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) \ $(global_testing_pg2testmatmult_LDFLAGS) $(LDFLAGS) -o $@ am__global_testing_pgtest_SOURCES_DIST = global/testing/pgtest.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_pgtest_OBJECTS = global/testing/pgtest.$(OBJEXT) \ $(am__objects_15) global_testing_pgtest_OBJECTS = $(am_global_testing_pgtest_OBJECTS) global_testing_pgtest_LDADD = $(LDADD) global_testing_pgtest_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_pgtest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_pgtest_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_pgtestmatmult_SOURCES_DIST = \ global/testing/pgtestmatmult.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_pgtestmatmult_OBJECTS = \ global/testing/pgtestmatmult.$(OBJEXT) $(am__objects_15) global_testing_pgtestmatmult_OBJECTS = \ $(am_global_testing_pgtestmatmult_OBJECTS) global_testing_pgtestmatmult_LDADD = $(LDADD) global_testing_pgtestmatmult_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_pgtestmatmult_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_pgtestmatmult_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_print_SOURCES_DIST = global/testing/print.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_print_OBJECTS = global/testing/print.$(OBJEXT) \ $(am__objects_15) global_testing_print_OBJECTS = $(am_global_testing_print_OBJECTS) global_testing_print_LDADD = $(LDADD) global_testing_print_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_random_SOURCES_DIST = global/testing/random.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_random_OBJECTS = global/testing/random.$(OBJEXT) \ $(am__objects_15) global_testing_random_OBJECTS = $(am_global_testing_random_OBJECTS) global_testing_random_LDADD = $(LDADD) global_testing_random_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_random_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_random_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_scan_SOURCES_DIST = global/testing/scan.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_scan_OBJECTS = global/testing/scan.$(OBJEXT) \ $(am__objects_15) global_testing_scan_OBJECTS = $(am_global_testing_scan_OBJECTS) global_testing_scan_LDADD = $(LDADD) global_testing_scan_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_scan_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_scan_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_scan_addc_SOURCES_DIST = \ global/testing/scan_addc.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_scan_addc_OBJECTS = \ global/testing/scan_addc.$(OBJEXT) $(am__objects_15) global_testing_scan_addc_OBJECTS = \ $(am_global_testing_scan_addc_OBJECTS) global_testing_scan_addc_LDADD = $(LDADD) global_testing_scan_addc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_scan_copyc_SOURCES_DIST = \ global/testing/scan_copyc.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_scan_copyc_OBJECTS = \ global/testing/scan_copyc.$(OBJEXT) $(am__objects_15) global_testing_scan_copyc_OBJECTS = \ $(am_global_testing_scan_copyc_OBJECTS) global_testing_scan_copyc_LDADD = $(LDADD) global_testing_scan_copyc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_simple_groups_SOURCES_DIST = \ global/testing/simple_groups.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_simple_groups_OBJECTS = \ global/testing/simple_groups.$(OBJEXT) $(am__objects_15) global_testing_simple_groups_OBJECTS = \ $(am_global_testing_simple_groups_OBJECTS) global_testing_simple_groups_LDADD = $(LDADD) global_testing_simple_groups_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_simple_groups_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_simple_groups_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_simple_groups_comm_SOURCES_DIST = \ global/testing/simple_groups_comm.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_simple_groups_comm_OBJECTS = \ global/testing/simple_groups_comm.$(OBJEXT) $(am__objects_15) global_testing_simple_groups_comm_OBJECTS = \ $(am_global_testing_simple_groups_comm_OBJECTS) global_testing_simple_groups_comm_LDADD = $(LDADD) global_testing_simple_groups_comm_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_simple_groups_comm_LINK = $(LIBTOOL) $(AM_V_lt) \ --tag=F77 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ $(global_testing_simple_groups_comm_LDFLAGS) $(LDFLAGS) -o $@ am__global_testing_simple_groups_commc_SOURCES_DIST = \ global/testing/simple_groups_commc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_simple_groups_commc_OBJECTS = \ global/testing/simple_groups_commc.$(OBJEXT) $(am__objects_15) global_testing_simple_groups_commc_OBJECTS = \ $(am_global_testing_simple_groups_commc_OBJECTS) global_testing_simple_groups_commc_LDADD = $(LDADD) global_testing_simple_groups_commc_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_sparse_SOURCES_DIST = global/testing/sparse.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_sparse_OBJECTS = global/testing/sparse.$(OBJEXT) \ $(am__objects_15) global_testing_sparse_OBJECTS = $(am_global_testing_sparse_OBJECTS) global_testing_sparse_LDADD = $(LDADD) global_testing_sparse_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_sparse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_sparse_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_sprsmatmult_SOURCES_DIST = \ global/testing/sprsmatmult.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_sprsmatmult_OBJECTS = \ global/testing/sprsmatmult.$(OBJEXT) $(am__objects_15) global_testing_sprsmatmult_OBJECTS = \ $(am_global_testing_sprsmatmult_OBJECTS) global_testing_sprsmatmult_LDADD = $(LDADD) global_testing_sprsmatmult_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_sprsmatmult_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_sprsmatmult_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_stride_SOURCES_DIST = global/testing/stride.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_stride_OBJECTS = global/testing/stride.$(OBJEXT) \ $(am__objects_15) global_testing_stride_OBJECTS = $(am_global_testing_stride_OBJECTS) global_testing_stride_LDADD = $(LDADD) global_testing_stride_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_stride_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_stride_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_test_SOURCES_DIST = global/testing/test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_test_OBJECTS = global/testing/test.$(OBJEXT) \ $(am__objects_15) global_testing_test_OBJECTS = $(am_global_testing_test_OBJECTS) global_testing_test_LDADD = $(LDADD) global_testing_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_test_mirrored_SOURCES_DIST = global/testing/test.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F @ENABLE_F77_TRUE@am__objects_16 = global/testing/global_testing_test_mirrored-ffflush.$(OBJEXT) \ @ENABLE_F77_TRUE@ global/testing/global_testing_test_mirrored-testblas.$(OBJEXT) am__objects_17 = \ global/testing/global_testing_test_mirrored-util.$(OBJEXT) \ $(am__objects_16) am_global_testing_test_mirrored_OBJECTS = \ global/testing/global_testing_test_mirrored-test.$(OBJEXT) \ $(am__objects_17) global_testing_test_mirrored_OBJECTS = \ $(am_global_testing_test_mirrored_OBJECTS) global_testing_test_mirrored_LDADD = $(LDADD) global_testing_test_mirrored_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_test_mirrored_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_test_mirrored_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_testc_SOURCES_DIST = global/testing/testc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_testc_OBJECTS = global/testing/testc.$(OBJEXT) \ $(am__objects_15) global_testing_testc_OBJECTS = $(am_global_testing_testc_OBJECTS) global_testing_testc_LDADD = $(LDADD) global_testing_testc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_testeig_SOURCES_DIST = global/testing/testeig.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_testeig_OBJECTS = global/testing/testeig.$(OBJEXT) \ $(am__objects_15) global_testing_testeig_OBJECTS = $(am_global_testing_testeig_OBJECTS) global_testing_testeig_LDADD = $(LDADD) global_testing_testeig_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_testeig_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_testeig_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_testmatmult_SOURCES_DIST = \ global/testing/testmatmult.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_testmatmult_OBJECTS = \ global/testing/testmatmult.$(OBJEXT) $(am__objects_15) global_testing_testmatmult_OBJECTS = \ $(am_global_testing_testmatmult_OBJECTS) global_testing_testmatmult_LDADD = $(LDADD) global_testing_testmatmult_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_testmatmult_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_testmatmult_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_testmatmultc_SOURCES_DIST = \ global/testing/testmatmultc.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_testmatmultc_OBJECTS = \ global/testing/testmatmultc.$(OBJEXT) $(am__objects_15) global_testing_testmatmultc_OBJECTS = \ $(am_global_testing_testmatmultc_OBJECTS) global_testing_testmatmultc_LDADD = $(LDADD) global_testing_testmatmultc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_testmult_SOURCES_DIST = global/testing/testmult.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_testmult_OBJECTS = \ global/testing/testmult.$(OBJEXT) $(am__objects_15) global_testing_testmult_OBJECTS = \ $(am_global_testing_testmult_OBJECTS) global_testing_testmult_LDADD = $(LDADD) global_testing_testmult_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_testmultrect_SOURCES_DIST = \ global/testing/testmultrect.c global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_testmultrect_OBJECTS = \ global/testing/testmultrect.$(OBJEXT) $(am__objects_15) global_testing_testmultrect_OBJECTS = \ $(am_global_testing_testmultrect_OBJECTS) global_testing_testmultrect_LDADD = $(LDADD) global_testing_testmultrect_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_testsolve_SOURCES_DIST = \ global/testing/testsolve.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_testsolve_OBJECTS = \ global/testing/testsolve.$(OBJEXT) $(am__objects_15) global_testing_testsolve_OBJECTS = \ $(am_global_testing_testsolve_OBJECTS) global_testing_testsolve_LDADD = $(LDADD) global_testing_testsolve_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_testsolve_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_testsolve_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_testspd_SOURCES_DIST = global/testing/testspd.F \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_testspd_OBJECTS = global/testing/testspd.$(OBJEXT) \ $(am__objects_15) global_testing_testspd_OBJECTS = $(am_global_testing_testspd_OBJECTS) global_testing_testspd_LDADD = $(LDADD) global_testing_testspd_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_testspd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_testspd_LDFLAGS) \ $(LDFLAGS) -o $@ am__global_testing_types_test_SOURCES_DIST = \ global/testing/types-test.F global/testing/testutil.fh \ global/testing/testutil.h global/testing/util.c \ global/testing/ffflush.F global/testing/testblas.F am_global_testing_types_test_OBJECTS = \ global/testing/types-test.$(OBJEXT) $(am__objects_15) global_testing_types_test_OBJECTS = \ $(am_global_testing_types_test_OBJECTS) global_testing_types_test_LDADD = $(LDADD) global_testing_types_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) global_testing_types_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(global_testing_types_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__objects_18 = global/testing/unit-tests/mock.$(OBJEXT) am_global_testing_unit_tests_ga_abs_value_OBJECTS = \ global/testing/unit-tests/ga_abs_value.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_abs_value_OBJECTS = \ $(am_global_testing_unit_tests_ga_abs_value_OBJECTS) global_testing_unit_tests_ga_abs_value_LDADD = $(LDADD) global_testing_unit_tests_ga_abs_value_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_acc_OBJECTS = \ global/testing/unit-tests/ga_acc.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_acc_OBJECTS = \ $(am_global_testing_unit_tests_ga_acc_OBJECTS) global_testing_unit_tests_ga_acc_LDADD = $(LDADD) global_testing_unit_tests_ga_acc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_add_OBJECTS = \ global/testing/unit-tests/ga_add.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_add_OBJECTS = \ $(am_global_testing_unit_tests_ga_add_OBJECTS) global_testing_unit_tests_ga_add_LDADD = $(LDADD) global_testing_unit_tests_ga_add_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_add_constant_OBJECTS = \ global/testing/unit-tests/ga_add_constant.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_add_constant_OBJECTS = \ $(am_global_testing_unit_tests_ga_add_constant_OBJECTS) global_testing_unit_tests_ga_add_constant_LDADD = $(LDADD) global_testing_unit_tests_ga_add_constant_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_add_constantpatch_OBJECTS = \ global/testing/unit-tests/ga_add_constantpatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_add_constantpatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_add_constantpatch_OBJECTS) global_testing_unit_tests_ga_add_constantpatch_LDADD = $(LDADD) global_testing_unit_tests_ga_add_constantpatch_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_add_diagonal_OBJECTS = \ global/testing/unit-tests/ga_add_diagonal.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_add_diagonal_OBJECTS = \ $(am_global_testing_unit_tests_ga_add_diagonal_OBJECTS) global_testing_unit_tests_ga_add_diagonal_LDADD = $(LDADD) global_testing_unit_tests_ga_add_diagonal_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_add_patch_OBJECTS = \ global/testing/unit-tests/ga_add_patch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_add_patch_OBJECTS = \ $(am_global_testing_unit_tests_ga_add_patch_OBJECTS) global_testing_unit_tests_ga_add_patch_LDADD = $(LDADD) global_testing_unit_tests_ga_add_patch_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_copy_OBJECTS = \ global/testing/unit-tests/ga_copy.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_copy_OBJECTS = \ $(am_global_testing_unit_tests_ga_copy_OBJECTS) global_testing_unit_tests_ga_copy_LDADD = $(LDADD) global_testing_unit_tests_ga_copy_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_copy2_OBJECTS = \ global/testing/unit-tests/ga_copy2.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_copy2_OBJECTS = \ $(am_global_testing_unit_tests_ga_copy2_OBJECTS) global_testing_unit_tests_ga_copy2_LDADD = $(LDADD) global_testing_unit_tests_ga_copy2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_copy3_OBJECTS = \ global/testing/unit-tests/ga_copy3.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_copy3_OBJECTS = \ $(am_global_testing_unit_tests_ga_copy3_OBJECTS) global_testing_unit_tests_ga_copy3_LDADD = $(LDADD) global_testing_unit_tests_ga_copy3_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_copypatch_OBJECTS = \ global/testing/unit-tests/ga_copypatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_copypatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_copypatch_OBJECTS) global_testing_unit_tests_ga_copypatch_LDADD = $(LDADD) global_testing_unit_tests_ga_copypatch_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_copypatch2_OBJECTS = \ global/testing/unit-tests/ga_copypatch2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_copypatch2_OBJECTS = \ $(am_global_testing_unit_tests_ga_copypatch2_OBJECTS) global_testing_unit_tests_ga_copypatch2_LDADD = $(LDADD) global_testing_unit_tests_ga_copypatch2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create_OBJECTS = \ global/testing/unit-tests/ga_create.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create_OBJECTS = \ $(am_global_testing_unit_tests_ga_create_OBJECTS) global_testing_unit_tests_ga_create_LDADD = $(LDADD) global_testing_unit_tests_ga_create_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create1_OBJECTS = \ global/testing/unit-tests/ga_create1.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create1_OBJECTS = \ $(am_global_testing_unit_tests_ga_create1_OBJECTS) global_testing_unit_tests_ga_create1_LDADD = $(LDADD) global_testing_unit_tests_ga_create1_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create2_OBJECTS = \ global/testing/unit-tests/ga_create2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create2_OBJECTS = \ $(am_global_testing_unit_tests_ga_create2_OBJECTS) global_testing_unit_tests_ga_create2_LDADD = $(LDADD) global_testing_unit_tests_ga_create2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create3_OBJECTS = \ global/testing/unit-tests/ga_create3.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create3_OBJECTS = \ $(am_global_testing_unit_tests_ga_create3_OBJECTS) global_testing_unit_tests_ga_create3_LDADD = $(LDADD) global_testing_unit_tests_ga_create3_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create_handle_OBJECTS = \ global/testing/unit-tests/ga_create_handle.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create_handle_OBJECTS = \ $(am_global_testing_unit_tests_ga_create_handle_OBJECTS) global_testing_unit_tests_ga_create_handle_LDADD = $(LDADD) global_testing_unit_tests_ga_create_handle_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create_irreg_OBJECTS = \ global/testing/unit-tests/ga_create_irreg.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create_irreg_OBJECTS = \ $(am_global_testing_unit_tests_ga_create_irreg_OBJECTS) global_testing_unit_tests_ga_create_irreg_LDADD = $(LDADD) global_testing_unit_tests_ga_create_irreg_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create_irreg2_OBJECTS = \ global/testing/unit-tests/ga_create_irreg2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create_irreg2_OBJECTS = \ $(am_global_testing_unit_tests_ga_create_irreg2_OBJECTS) global_testing_unit_tests_ga_create_irreg2_LDADD = $(LDADD) global_testing_unit_tests_ga_create_irreg2_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_create_irreg3_OBJECTS = \ global/testing/unit-tests/ga_create_irreg3.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_create_irreg3_OBJECTS = \ $(am_global_testing_unit_tests_ga_create_irreg3_OBJECTS) global_testing_unit_tests_ga_create_irreg3_LDADD = $(LDADD) global_testing_unit_tests_ga_create_irreg3_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_destroy_OBJECTS = \ global/testing/unit-tests/ga_destroy.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_destroy_OBJECTS = \ $(am_global_testing_unit_tests_ga_destroy_OBJECTS) global_testing_unit_tests_ga_destroy_LDADD = $(LDADD) global_testing_unit_tests_ga_destroy_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_dgop_OBJECTS = \ global/testing/unit-tests/ga_dgop.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_dgop_OBJECTS = \ $(am_global_testing_unit_tests_ga_dgop_OBJECTS) global_testing_unit_tests_ga_dgop_LDADD = $(LDADD) global_testing_unit_tests_ga_dgop_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_dot_OBJECTS = \ global/testing/unit-tests/ga_dot.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_dot_OBJECTS = \ $(am_global_testing_unit_tests_ga_dot_OBJECTS) global_testing_unit_tests_ga_dot_LDADD = $(LDADD) global_testing_unit_tests_ga_dot_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_duplicate_OBJECTS = \ global/testing/unit-tests/ga_duplicate.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_duplicate_OBJECTS = \ $(am_global_testing_unit_tests_ga_duplicate_OBJECTS) global_testing_unit_tests_ga_duplicate_LDADD = $(LDADD) global_testing_unit_tests_ga_duplicate_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_divide_OBJECTS = \ global/testing/unit-tests/ga_elem_divide.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_divide_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_divide_OBJECTS) global_testing_unit_tests_ga_elem_divide_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_divide_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_dividepatch_OBJECTS = \ global/testing/unit-tests/ga_elem_dividepatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_dividepatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_dividepatch_OBJECTS) global_testing_unit_tests_ga_elem_dividepatch_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_dividepatch_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_maximum_OBJECTS = \ global/testing/unit-tests/ga_elem_maximum.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_maximum_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_maximum_OBJECTS) global_testing_unit_tests_ga_elem_maximum_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_maximum_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_maximumpatch_OBJECTS = \ global/testing/unit-tests/ga_elem_maximumpatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_maximumpatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_maximumpatch_OBJECTS) global_testing_unit_tests_ga_elem_maximumpatch_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_maximumpatch_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_minimum_OBJECTS = \ global/testing/unit-tests/ga_elem_minimum.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_minimum_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_minimum_OBJECTS) global_testing_unit_tests_ga_elem_minimum_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_minimum_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_minimumpatch_OBJECTS = \ global/testing/unit-tests/ga_elem_minimumpatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_minimumpatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_minimumpatch_OBJECTS) global_testing_unit_tests_ga_elem_minimumpatch_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_minimumpatch_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_multiply_OBJECTS = \ global/testing/unit-tests/ga_elem_multiply.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_multiply_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_multiply_OBJECTS) global_testing_unit_tests_ga_elem_multiply_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_multiply_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_elem_multiplypatch_OBJECTS = \ global/testing/unit-tests/ga_elem_multiplypatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_elem_multiplypatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_elem_multiplypatch_OBJECTS) global_testing_unit_tests_ga_elem_multiplypatch_LDADD = $(LDADD) global_testing_unit_tests_ga_elem_multiplypatch_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_fill_OBJECTS = \ global/testing/unit-tests/ga_fill.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_fill_OBJECTS = \ $(am_global_testing_unit_tests_ga_fill_OBJECTS) global_testing_unit_tests_ga_fill_LDADD = $(LDADD) global_testing_unit_tests_ga_fill_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_fillpatch_OBJECTS = \ global/testing/unit-tests/ga_fillpatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_fillpatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_fillpatch_OBJECTS) global_testing_unit_tests_ga_fillpatch_LDADD = $(LDADD) global_testing_unit_tests_ga_fillpatch_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_fillpatch1_OBJECTS = \ global/testing/unit-tests/ga_fillpatch1.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_fillpatch1_OBJECTS = \ $(am_global_testing_unit_tests_ga_fillpatch1_OBJECTS) global_testing_unit_tests_ga_fillpatch1_LDADD = $(LDADD) global_testing_unit_tests_ga_fillpatch1_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_gather_OBJECTS = \ global/testing/unit-tests/ga_gather.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_gather_OBJECTS = \ $(am_global_testing_unit_tests_ga_gather_OBJECTS) global_testing_unit_tests_ga_gather_LDADD = $(LDADD) global_testing_unit_tests_ga_gather_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_gather2_OBJECTS = \ global/testing/unit-tests/ga_gather2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_gather2_OBJECTS = \ $(am_global_testing_unit_tests_ga_gather2_OBJECTS) global_testing_unit_tests_ga_gather2_LDADD = $(LDADD) global_testing_unit_tests_ga_gather2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_gather3_OBJECTS = \ global/testing/unit-tests/ga_gather3.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_gather3_OBJECTS = \ $(am_global_testing_unit_tests_ga_gather3_OBJECTS) global_testing_unit_tests_ga_gather3_LDADD = $(LDADD) global_testing_unit_tests_ga_gather3_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_get_OBJECTS = \ global/testing/unit-tests/ga_get.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_get_OBJECTS = \ $(am_global_testing_unit_tests_ga_get_OBJECTS) global_testing_unit_tests_ga_get_LDADD = $(LDADD) global_testing_unit_tests_ga_get_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_get_blockinfo_OBJECTS = \ global/testing/unit-tests/ga_get_blockinfo.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_get_blockinfo_OBJECTS = \ $(am_global_testing_unit_tests_ga_get_blockinfo_OBJECTS) global_testing_unit_tests_ga_get_blockinfo_LDADD = $(LDADD) global_testing_unit_tests_ga_get_blockinfo_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_get_diagonal_OBJECTS = \ global/testing/unit-tests/ga_get_diagonal.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_get_diagonal_OBJECTS = \ $(am_global_testing_unit_tests_ga_get_diagonal_OBJECTS) global_testing_unit_tests_ga_get_diagonal_LDADD = $(LDADD) global_testing_unit_tests_ga_get_diagonal_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_igop_OBJECTS = \ global/testing/unit-tests/ga_igop.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_igop_OBJECTS = \ $(am_global_testing_unit_tests_ga_igop_OBJECTS) global_testing_unit_tests_ga_igop_LDADD = $(LDADD) global_testing_unit_tests_ga_igop_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_igop2_OBJECTS = \ global/testing/unit-tests/ga_igop2.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_igop2_OBJECTS = \ $(am_global_testing_unit_tests_ga_igop2_OBJECTS) global_testing_unit_tests_ga_igop2_LDADD = $(LDADD) global_testing_unit_tests_ga_igop2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_inquire_OBJECTS = \ global/testing/unit-tests/ga_inquire.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_inquire_OBJECTS = \ $(am_global_testing_unit_tests_ga_inquire_OBJECTS) global_testing_unit_tests_ga_inquire_LDADD = $(LDADD) global_testing_unit_tests_ga_inquire_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_intialize_OBJECTS = \ global/testing/unit-tests/ga_intialize.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_intialize_OBJECTS = \ $(am_global_testing_unit_tests_ga_intialize_OBJECTS) global_testing_unit_tests_ga_intialize_LDADD = $(LDADD) global_testing_unit_tests_ga_intialize_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_lgop_OBJECTS = \ global/testing/unit-tests/ga_lgop.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_lgop_OBJECTS = \ $(am_global_testing_unit_tests_ga_lgop_OBJECTS) global_testing_unit_tests_ga_lgop_LDADD = $(LDADD) global_testing_unit_tests_ga_lgop_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_median_OBJECTS = \ global/testing/unit-tests/ga_median.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_median_OBJECTS = \ $(am_global_testing_unit_tests_ga_median_OBJECTS) global_testing_unit_tests_ga_median_LDADD = $(LDADD) global_testing_unit_tests_ga_median_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_ndim_OBJECTS = \ global/testing/unit-tests/ga_ndim.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_ndim_OBJECTS = \ $(am_global_testing_unit_tests_ga_ndim_OBJECTS) global_testing_unit_tests_ga_ndim_LDADD = $(LDADD) global_testing_unit_tests_ga_ndim_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_ndim2_OBJECTS = \ global/testing/unit-tests/ga_ndim2.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_ndim2_OBJECTS = \ $(am_global_testing_unit_tests_ga_ndim2_OBJECTS) global_testing_unit_tests_ga_ndim2_LDADD = $(LDADD) global_testing_unit_tests_ga_ndim2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_nnodes_OBJECTS = \ global/testing/unit-tests/ga_nnodes.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_nnodes_OBJECTS = \ $(am_global_testing_unit_tests_ga_nnodes_OBJECTS) global_testing_unit_tests_ga_nnodes_LDADD = $(LDADD) global_testing_unit_tests_ga_nnodes_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_nodeid_OBJECTS = \ global/testing/unit-tests/ga_nodeid.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_nodeid_OBJECTS = \ $(am_global_testing_unit_tests_ga_nodeid_OBJECTS) global_testing_unit_tests_ga_nodeid_LDADD = $(LDADD) global_testing_unit_tests_ga_nodeid_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_create_OBJECTS = \ global/testing/unit-tests/ga_pgroup_create.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_create_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_create_OBJECTS) global_testing_unit_tests_ga_pgroup_create_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_create_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_create2_OBJECTS = \ global/testing/unit-tests/ga_pgroup_create2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_create2_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_create2_OBJECTS) global_testing_unit_tests_ga_pgroup_create2_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_create2_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_create3_OBJECTS = \ global/testing/unit-tests/ga_pgroup_create3.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_create3_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_create3_OBJECTS) global_testing_unit_tests_ga_pgroup_create3_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_create3_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_create4_OBJECTS = \ global/testing/unit-tests/ga_pgroup_create4.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_create4_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_create4_OBJECTS) global_testing_unit_tests_ga_pgroup_create4_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_create4_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_create5_OBJECTS = \ global/testing/unit-tests/ga_pgroup_create5.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_create5_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_create5_OBJECTS) global_testing_unit_tests_ga_pgroup_create5_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_create5_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_destroy_OBJECTS = \ global/testing/unit-tests/ga_pgroup_destroy.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_destroy_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_destroy_OBJECTS) global_testing_unit_tests_ga_pgroup_destroy_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_destroy_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_destroy2_OBJECTS = \ global/testing/unit-tests/ga_pgroup_destroy2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_destroy2_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_destroy2_OBJECTS) global_testing_unit_tests_ga_pgroup_destroy2_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_destroy2_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_nnodes_nodeid_OBJECTS = \ global/testing/unit-tests/ga_pgroup_nnodes_nodeid.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_nnodes_nodeid_OBJECTS = $(am_global_testing_unit_tests_ga_pgroup_nnodes_nodeid_OBJECTS) global_testing_unit_tests_ga_pgroup_nnodes_nodeid_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_nnodes_nodeid_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_pgroup_setdefault_OBJECTS = \ global/testing/unit-tests/ga_pgroup_setdefault.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_pgroup_setdefault_OBJECTS = \ $(am_global_testing_unit_tests_ga_pgroup_setdefault_OBJECTS) global_testing_unit_tests_ga_pgroup_setdefault_LDADD = $(LDADD) global_testing_unit_tests_ga_pgroup_setdefault_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_put_OBJECTS = \ global/testing/unit-tests/ga_put.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_put_OBJECTS = \ $(am_global_testing_unit_tests_ga_put_OBJECTS) global_testing_unit_tests_ga_put_LDADD = $(LDADD) global_testing_unit_tests_ga_put_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_put2_OBJECTS = \ global/testing/unit-tests/ga_put2.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_put2_OBJECTS = \ $(am_global_testing_unit_tests_ga_put2_OBJECTS) global_testing_unit_tests_ga_put2_LDADD = $(LDADD) global_testing_unit_tests_ga_put2_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scale_OBJECTS = \ global/testing/unit-tests/ga_scale.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_scale_OBJECTS = \ $(am_global_testing_unit_tests_ga_scale_OBJECTS) global_testing_unit_tests_ga_scale_LDADD = $(LDADD) global_testing_unit_tests_ga_scale_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scale2_OBJECTS = \ global/testing/unit-tests/ga_scale2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_scale2_OBJECTS = \ $(am_global_testing_unit_tests_ga_scale2_OBJECTS) global_testing_unit_tests_ga_scale2_LDADD = $(LDADD) global_testing_unit_tests_ga_scale2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scale_cols_OBJECTS = \ global/testing/unit-tests/ga_scale_cols.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_scale_cols_OBJECTS = \ $(am_global_testing_unit_tests_ga_scale_cols_OBJECTS) global_testing_unit_tests_ga_scale_cols_LDADD = $(LDADD) global_testing_unit_tests_ga_scale_cols_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scale_patch_OBJECTS = \ global/testing/unit-tests/ga_scale_patch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_scale_patch_OBJECTS = \ $(am_global_testing_unit_tests_ga_scale_patch_OBJECTS) global_testing_unit_tests_ga_scale_patch_LDADD = $(LDADD) global_testing_unit_tests_ga_scale_patch_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scale_rows_OBJECTS = \ global/testing/unit-tests/ga_scale_rows.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_scale_rows_OBJECTS = \ $(am_global_testing_unit_tests_ga_scale_rows_OBJECTS) global_testing_unit_tests_ga_scale_rows_LDADD = $(LDADD) global_testing_unit_tests_ga_scale_rows_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_scatter_OBJECTS = \ global/testing/unit-tests/ga_scatter.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_scatter_OBJECTS = \ $(am_global_testing_unit_tests_ga_scatter_OBJECTS) global_testing_unit_tests_ga_scatter_LDADD = $(LDADD) global_testing_unit_tests_ga_scatter_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_set_data_OBJECTS = \ global/testing/unit-tests/ga_set_data.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_set_data_OBJECTS = \ $(am_global_testing_unit_tests_ga_set_data_OBJECTS) global_testing_unit_tests_ga_set_data_LDADD = $(LDADD) global_testing_unit_tests_ga_set_data_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_set_diagonal_OBJECTS = \ global/testing/unit-tests/ga_set_diagonal.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_set_diagonal_OBJECTS = \ $(am_global_testing_unit_tests_ga_set_diagonal_OBJECTS) global_testing_unit_tests_ga_set_diagonal_LDADD = $(LDADD) global_testing_unit_tests_ga_set_diagonal_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_set_restricted_OBJECTS = \ global/testing/unit-tests/ga_set_restricted.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_set_restricted_OBJECTS = \ $(am_global_testing_unit_tests_ga_set_restricted_OBJECTS) global_testing_unit_tests_ga_set_restricted_LDADD = $(LDADD) global_testing_unit_tests_ga_set_restricted_DEPENDENCIES = \ $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_solve_OBJECTS = \ global/testing/unit-tests/ga_solve.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_solve_OBJECTS = \ $(am_global_testing_unit_tests_ga_solve_OBJECTS) global_testing_unit_tests_ga_solve_LDADD = $(LDADD) global_testing_unit_tests_ga_solve_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_sync_OBJECTS = \ global/testing/unit-tests/ga_sync.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_sync_OBJECTS = \ $(am_global_testing_unit_tests_ga_sync_OBJECTS) global_testing_unit_tests_ga_sync_LDADD = $(LDADD) global_testing_unit_tests_ga_sync_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_transpose_OBJECTS = \ global/testing/unit-tests/ga_transpose.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_transpose_OBJECTS = \ $(am_global_testing_unit_tests_ga_transpose_OBJECTS) global_testing_unit_tests_ga_transpose_LDADD = $(LDADD) global_testing_unit_tests_ga_transpose_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_transpose2_OBJECTS = \ global/testing/unit-tests/ga_transpose2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_transpose2_OBJECTS = \ $(am_global_testing_unit_tests_ga_transpose2_OBJECTS) global_testing_unit_tests_ga_transpose2_LDADD = $(LDADD) global_testing_unit_tests_ga_transpose2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_transpose3_OBJECTS = \ global/testing/unit-tests/ga_transpose3.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_transpose3_OBJECTS = \ $(am_global_testing_unit_tests_ga_transpose3_OBJECTS) global_testing_unit_tests_ga_transpose3_LDADD = $(LDADD) global_testing_unit_tests_ga_transpose3_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_zero_OBJECTS = \ global/testing/unit-tests/ga_zero.$(OBJEXT) $(am__objects_18) global_testing_unit_tests_ga_zero_OBJECTS = \ $(am_global_testing_unit_tests_ga_zero_OBJECTS) global_testing_unit_tests_ga_zero_LDADD = $(LDADD) global_testing_unit_tests_ga_zero_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_zerodiagonal_OBJECTS = \ global/testing/unit-tests/ga_zerodiagonal.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_zerodiagonal_OBJECTS = \ $(am_global_testing_unit_tests_ga_zerodiagonal_OBJECTS) global_testing_unit_tests_ga_zerodiagonal_LDADD = $(LDADD) global_testing_unit_tests_ga_zerodiagonal_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_zeropatch_OBJECTS = \ global/testing/unit-tests/ga_zeropatch.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_zeropatch_OBJECTS = \ $(am_global_testing_unit_tests_ga_zeropatch_OBJECTS) global_testing_unit_tests_ga_zeropatch_LDADD = $(LDADD) global_testing_unit_tests_ga_zeropatch_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_testing_unit_tests_ga_zeropatch2_OBJECTS = \ global/testing/unit-tests/ga_zeropatch2.$(OBJEXT) \ $(am__objects_18) global_testing_unit_tests_ga_zeropatch2_OBJECTS = \ $(am_global_testing_unit_tests_ga_zeropatch2_OBJECTS) global_testing_unit_tests_ga_zeropatch2_LDADD = $(LDADD) global_testing_unit_tests_ga_zeropatch2_DEPENDENCIES = $(LTLIBOBJS) \ libga.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__global_testing_unpackc_SOURCES_DIST = global/testing/unpackc.c \ global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c global/testing/ffflush.F \ global/testing/testblas.F am_global_testing_unpackc_OBJECTS = global/testing/unpackc.$(OBJEXT) \ $(am__objects_15) global_testing_unpackc_OBJECTS = $(am_global_testing_unpackc_OBJECTS) global_testing_unpackc_LDADD = $(LDADD) global_testing_unpackc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_global_trace_adjust_OBJECTS = global/trace/adjust.$(OBJEXT) global_trace_adjust_OBJECTS = $(am_global_trace_adjust_OBJECTS) global_trace_adjust_DEPENDENCIES = global_trace_adjust_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(global_trace_adjust_LDFLAGS) \ $(LDFLAGS) -o $@ am_global_trace_collisions_OBJECTS = \ global/trace/collisions.$(OBJEXT) global_trace_collisions_OBJECTS = \ $(am_global_trace_collisions_OBJECTS) global_trace_collisions_DEPENDENCIES = global_trace_collisions_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(global_trace_collisions_LDFLAGS) \ $(LDFLAGS) -o $@ am__gparrays_testing_test_SOURCES_DIST = gparrays/testing/test.F @ENABLE_GPARRAYS_TRUE@am_gparrays_testing_test_OBJECTS = \ @ENABLE_GPARRAYS_TRUE@ gparrays/testing/test.$(OBJEXT) gparrays_testing_test_OBJECTS = $(am_gparrays_testing_test_OBJECTS) gparrays_testing_test_LDADD = $(LDADD) gparrays_testing_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) gparrays_testing_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(gparrays_testing_test_LDFLAGS) \ $(LDFLAGS) -o $@ am__gparrays_testing_testc_SOURCES_DIST = gparrays/testing/testc.c @ENABLE_GPARRAYS_TRUE@am_gparrays_testing_testc_OBJECTS = \ @ENABLE_GPARRAYS_TRUE@ gparrays/testing/testc.$(OBJEXT) gparrays_testing_testc_OBJECTS = $(am_gparrays_testing_testc_OBJECTS) gparrays_testing_testc_LDADD = $(LDADD) gparrays_testing_testc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__gparrays_testing_transpose_SOURCES_DIST = \ gparrays/testing/transpose.c @ENABLE_GPARRAYS_TRUE@am_gparrays_testing_transpose_OBJECTS = \ @ENABLE_GPARRAYS_TRUE@ gparrays/testing/transpose.$(OBJEXT) gparrays_testing_transpose_OBJECTS = \ $(am_gparrays_testing_transpose_OBJECTS) gparrays_testing_transpose_LDADD = $(LDADD) gparrays_testing_transpose_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_ma_test_coalesce_OBJECTS = ma/test-coalesce.$(OBJEXT) ma_test_coalesce_OBJECTS = $(am_ma_test_coalesce_OBJECTS) ma_test_coalesce_LDADD = $(LDADD) ma_test_coalesce_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_ma_test_inquire_OBJECTS = ma/test-inquire.$(OBJEXT) ma_test_inquire_OBJECTS = $(am_ma_test_inquire_OBJECTS) ma_test_inquire_LDADD = $(LDADD) ma_test_inquire_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_ma_testc_OBJECTS = ma/testc.$(OBJEXT) ma_testc_OBJECTS = $(am_ma_testc_OBJECTS) ma_testc_LDADD = $(LDADD) ma_testc_DEPENDENCIES = $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_ma_testf_OBJECTS = ma/testf.$(OBJEXT) ma_testf_OBJECTS = $(am_ma_testf_OBJECTS) ma_testf_LDADD = $(LDADD) ma_testf_DEPENDENCIES = $(LTLIBOBJS) libga.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) ma_testf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(F77LD) $(AM_FFLAGS) $(FFLAGS) \ $(ma_testf_LDFLAGS) $(LDFLAGS) -o $@ am__objects_19 = pario/dra/ffflush.$(OBJEXT) pario/dra/util.$(OBJEXT) am_pario_dra_big_OBJECTS = pario/dra/big.$(OBJEXT) $(am__objects_19) pario_dra_big_OBJECTS = $(am_pario_dra_big_OBJECTS) pario_dra_big_LDADD = $(LDADD) pario_dra_big_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_big_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_big_LDFLAGS) $(LDFLAGS) -o \ $@ am_pario_dra_bign_OBJECTS = pario/dra/bign.$(OBJEXT) pario_dra_bign_OBJECTS = $(am_pario_dra_bign_OBJECTS) pario_dra_bign_LDADD = $(LDADD) pario_dra_bign_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_dbg_read_OBJECTS = pario/dra/dbg_read.$(OBJEXT) pario_dra_dbg_read_OBJECTS = $(am_pario_dra_dbg_read_OBJECTS) pario_dra_dbg_read_LDADD = $(LDADD) pario_dra_dbg_read_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_dbg_write_OBJECTS = pario/dra/dbg_write.$(OBJEXT) pario_dra_dbg_write_OBJECTS = $(am_pario_dra_dbg_write_OBJECTS) pario_dra_dbg_write_LDADD = $(LDADD) pario_dra_dbg_write_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_dra2arviz_OBJECTS = pario/dra/dra2arviz.$(OBJEXT) pario_dra_dra2arviz_OBJECTS = $(am_pario_dra_dra2arviz_OBJECTS) pario_dra_dra2arviz_LDADD = $(LDADD) pario_dra_dra2arviz_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_dra_mxm_OBJECTS = pario/dra/dra_mxm.$(OBJEXT) \ $(am__objects_19) pario_dra_dra_mxm_OBJECTS = $(am_pario_dra_dra_mxm_OBJECTS) pario_dra_dra_mxm_LDADD = $(LDADD) pario_dra_dra_mxm_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_dra_mxm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_dra_mxm_LDFLAGS) $(LDFLAGS) \ -o $@ am_pario_dra_ntest_OBJECTS = pario/dra/ntest.$(OBJEXT) \ $(am__objects_19) pario_dra_ntest_OBJECTS = $(am_pario_dra_ntest_OBJECTS) pario_dra_ntest_LDADD = $(LDADD) pario_dra_ntest_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_ntest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_ntest_LDFLAGS) $(LDFLAGS) \ -o $@ am_pario_dra_ntestc_OBJECTS = pario/dra/ntestc.$(OBJEXT) pario_dra_ntestc_OBJECTS = $(am_pario_dra_ntestc_OBJECTS) pario_dra_ntestc_LDADD = $(LDADD) pario_dra_ntestc_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_perf_OBJECTS = pario/dra/perf.$(OBJEXT) $(am__objects_19) pario_dra_perf_OBJECTS = $(am_pario_dra_perf_OBJECTS) pario_dra_perf_LDADD = $(LDADD) pario_dra_perf_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_perf_LDFLAGS) $(LDFLAGS) -o \ $@ am_pario_dra_perf2_OBJECTS = pario/dra/perf2.$(OBJEXT) \ $(am__objects_19) pario_dra_perf2_OBJECTS = $(am_pario_dra_perf2_OBJECTS) pario_dra_perf2_LDADD = $(LDADD) pario_dra_perf2_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_perf2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_perf2_LDFLAGS) $(LDFLAGS) \ -o $@ am_pario_dra_perf3_OBJECTS = pario/dra/perf3.$(OBJEXT) \ $(am__objects_19) pario_dra_perf3_OBJECTS = $(am_pario_dra_perf3_OBJECTS) pario_dra_perf3_LDADD = $(LDADD) pario_dra_perf3_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_perf3_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_perf3_LDFLAGS) $(LDFLAGS) \ -o $@ am_pario_dra_perfn_OBJECTS = pario/dra/perfn.$(OBJEXT) pario_dra_perfn_OBJECTS = $(am_pario_dra_perfn_OBJECTS) pario_dra_perfn_LDADD = $(LDADD) pario_dra_perfn_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_rate_OBJECTS = pario/dra/rate.$(OBJEXT) pario_dra_rate_OBJECTS = $(am_pario_dra_rate_OBJECTS) pario_dra_rate_LDADD = $(LDADD) pario_dra_rate_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_pario_dra_test_OBJECTS = pario/dra/test.$(OBJEXT) $(am__objects_19) pario_dra_test_OBJECTS = $(am_pario_dra_test_OBJECTS) pario_dra_test_LDADD = $(LDADD) pario_dra_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_test_LDFLAGS) $(LDFLAGS) -o \ $@ am_pario_dra_test_mxm_OBJECTS = pario/dra/test_mxm.$(OBJEXT) \ $(am__objects_19) pario_dra_test_mxm_OBJECTS = $(am_pario_dra_test_mxm_OBJECTS) pario_dra_test_mxm_LDADD = $(LDADD) pario_dra_test_mxm_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_test_mxm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_test_mxm_LDFLAGS) \ $(LDFLAGS) -o $@ am_pario_dra_time_mxm_OBJECTS = pario/dra/time_mxm.$(OBJEXT) \ $(am__objects_19) pario_dra_time_mxm_OBJECTS = $(am_pario_dra_time_mxm_OBJECTS) pario_dra_time_mxm_LDADD = $(LDADD) pario_dra_time_mxm_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_dra_time_mxm_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_dra_time_mxm_LDFLAGS) \ $(LDFLAGS) -o $@ am_pario_eaf_test_OBJECTS = pario/eaf/test.$(OBJEXT) $(am__objects_19) pario_eaf_test_OBJECTS = $(am_pario_eaf_test_OBJECTS) pario_eaf_test_LDADD = $(LDADD) pario_eaf_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_eaf_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_eaf_test_LDFLAGS) $(LDFLAGS) -o \ $@ am_pario_sf_test_OBJECTS = pario/sf/test.$(OBJEXT) $(am__objects_19) pario_sf_test_OBJECTS = $(am_pario_sf_test_OBJECTS) pario_sf_test_LDADD = $(LDADD) pario_sf_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) pario_sf_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(pario_sf_test_LDFLAGS) $(LDFLAGS) -o \ $@ am__tcgmsg_tests_test_SOURCES_DIST = tcgmsg/tests/test.c @MSG_COMMS_MPI_TRUE@am_tcgmsg_tests_test_OBJECTS = \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tests/test.$(OBJEXT) tcgmsg_tests_test_OBJECTS = $(am_tcgmsg_tests_test_OBJECTS) tcgmsg_tests_test_LDADD = $(LDADD) tcgmsg_tests_test_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__tcgmsg_tests_test_asyn_SOURCES_DIST = tcgmsg/tests/test_asyn.c @MSG_COMMS_MPI_TRUE@am_tcgmsg_tests_test_asyn_OBJECTS = \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tests/test_asyn.$(OBJEXT) tcgmsg_tests_test_asyn_OBJECTS = $(am_tcgmsg_tests_test_asyn_OBJECTS) tcgmsg_tests_test_asyn_LDADD = $(LDADD) tcgmsg_tests_test_asyn_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__tcgmsg_tests_testf_SOURCES_DIST = tcgmsg/tests/testf.F @MSG_COMMS_MPI_TRUE@am_tcgmsg_tests_testf_OBJECTS = \ @MSG_COMMS_MPI_TRUE@ tcgmsg/tests/testf.$(OBJEXT) tcgmsg_tests_testf_OBJECTS = $(am_tcgmsg_tests_testf_OBJECTS) tcgmsg_tests_testf_LDADD = $(LDADD) tcgmsg_tests_testf_DEPENDENCIES = $(LTLIBOBJS) libga.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) tcgmsg_tests_testf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=F77 \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(F77LD) \ $(AM_FFLAGS) $(FFLAGS) $(tcgmsg_tests_testf_LDFLAGS) \ $(LDFLAGS) -o $@ SCRIPTS = $(bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f PPF77COMPILE = $(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) LTPPF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(F77) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_FFLAGS) $(FFLAGS) AM_V_PPF77 = $(am__v_PPF77_@AM_V@) am__v_PPF77_ = $(am__v_PPF77_@AM_DEFAULT_V@) am__v_PPF77_0 = @echo " PPF77 " $@; AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ F77LD = $(F77) AM_V_F77LD = $(am__v_F77LD_@AM_V@) am__v_F77LD_ = $(am__v_F77LD_@AM_DEFAULT_V@) COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; F77COMPILE = $(F77) $(AM_FFLAGS) $(FFLAGS) LTF77COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=F77 $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(F77) $(AM_FFLAGS) $(FFLAGS) AM_V_F77 = $(am__v_F77_@AM_V@) am__v_F77_ = $(am__v_F77_@AM_DEFAULT_V@) am__v_F77_0 = @echo " F77 " $@; AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libga___la_SOURCES) $(libga_la_SOURCES) \ $(nodist_libga_la_SOURCES) $(libwapi_la_SOURCES) \ $(ga___testing_elempatch_SOURCES) \ $(ga___testing_mtest_SOURCES) $(ga___testing_ntestc_SOURCES) \ $(ga___testing_testc_SOURCES) $(ga___testing_testmult_SOURCES) \ $(gaf2c_testarg_SOURCES) $(global_X_xregion_SOURCES) \ $(global_examples_boltzmann_boltz_SOURCES) \ $(global_examples_conjugate_gradient_ga_cg_SOURCES) \ $(global_examples_lennard_jones_lennard_SOURCES) \ $(nodist_EXTRA_global_examples_lennard_jones_lennard_SOURCES) \ $(global_examples_md_cluster_grp_sim_SOURCES) \ $(global_examples_scf_scf_SOURCES) \ $(global_testing_big_SOURCES) \ $(nodist_EXTRA_global_testing_big_SOURCES) \ $(global_testing_bin_SOURCES) \ $(global_testing_blktest_SOURCES) \ $(global_testing_d2test_SOURCES) \ $(global_testing_elempatch_SOURCES) \ $(nodist_EXTRA_global_testing_elempatch_SOURCES) \ $(global_testing_field_test_SOURCES) \ $(global_testing_g2test_SOURCES) \ $(global_testing_g3test_SOURCES) \ $(global_testing_ga_mpi_SOURCES) \ $(nodist_EXTRA_global_testing_ga_mpi_SOURCES) \ $(global_testing_ga_lu_SOURCES) \ $(nodist_EXTRA_global_testing_ga_lu_SOURCES) \ $(global_testing_ga_shift_SOURCES) \ $(global_testing_gatscat_SOURCES) \ $(nodist_EXTRA_global_testing_gatscat_SOURCES) \ $(global_testing_getmem_SOURCES) \ $(nodist_EXTRA_global_testing_getmem_SOURCES) \ $(global_testing_ghosts_SOURCES) \ $(global_testing_ipc_clean_SOURCES) \ $(nodist_EXTRA_global_testing_ipc_clean_SOURCES) \ $(global_testing_jacobi_SOURCES) \ $(global_testing_lock_SOURCES) \ $(nodist_EXTRA_global_testing_lock_SOURCES) \ $(global_testing_mir_perf2_SOURCES) \ $(global_testing_mmatrix_SOURCES) \ $(global_testing_mtest_SOURCES) \ $(nodist_EXTRA_global_testing_mtest_SOURCES) \ $(global_testing_mulmatpatch_SOURCES) \ $(global_testing_mulmatpatchc_SOURCES) \ $(nodist_EXTRA_global_testing_mulmatpatchc_SOURCES) \ $(global_testing_nb2test_SOURCES) \ $(global_testing_ndim_SOURCES) \ $(nodist_global_testing_nga_onesided_SOURCES) \ $(nodist_global_testing_nga_patch_SOURCES) \ $(nodist_global_testing_nga_periodic_SOURCES) \ $(nodist_global_testing_nga_scatter_SOURCES) \ $(nodist_global_testing_nga_util_SOURCES) \ $(nodist_global_testing_ngatest_SOURCES) \ $(global_testing_normc_SOURCES) \ $(nodist_EXTRA_global_testing_normc_SOURCES) \ $(global_testing_ntestc_SOURCES) \ $(nodist_EXTRA_global_testing_ntestc_SOURCES) \ $(global_testing_ntestfc_SOURCES) \ $(nodist_EXTRA_global_testing_ntestfc_SOURCES) \ $(global_testing_packc_SOURCES) \ $(nodist_EXTRA_global_testing_packc_SOURCES) \ $(global_testing_patch_SOURCES) \ $(global_testing_patch2_SOURCES) \ $(global_testing_patch_enumc_SOURCES) \ $(nodist_EXTRA_global_testing_patch_enumc_SOURCES) \ $(global_testing_patch_enumf_SOURCES) \ $(global_testing_perf_SOURCES) $(global_testing_perf2_SOURCES) \ $(nodist_EXTRA_global_testing_perf2_SOURCES) \ $(global_testing_perfmod_SOURCES) \ $(global_testing_perform_SOURCES) \ $(global_testing_pg2test_SOURCES) \ $(global_testing_pg2testmatmult_SOURCES) \ $(global_testing_pgtest_SOURCES) \ $(global_testing_pgtestmatmult_SOURCES) \ $(global_testing_print_SOURCES) \ $(nodist_EXTRA_global_testing_print_SOURCES) \ $(global_testing_random_SOURCES) \ $(global_testing_scan_SOURCES) \ $(global_testing_scan_addc_SOURCES) \ $(nodist_EXTRA_global_testing_scan_addc_SOURCES) \ $(global_testing_scan_copyc_SOURCES) \ $(nodist_EXTRA_global_testing_scan_copyc_SOURCES) \ $(global_testing_simple_groups_SOURCES) \ $(global_testing_simple_groups_comm_SOURCES) \ $(global_testing_simple_groups_commc_SOURCES) \ $(nodist_EXTRA_global_testing_simple_groups_commc_SOURCES) \ $(global_testing_sparse_SOURCES) \ $(global_testing_sprsmatmult_SOURCES) \ $(global_testing_stride_SOURCES) \ $(global_testing_test_SOURCES) \ $(global_testing_test_mirrored_SOURCES) \ $(global_testing_testc_SOURCES) \ $(nodist_EXTRA_global_testing_testc_SOURCES) \ $(global_testing_testeig_SOURCES) \ $(global_testing_testmatmult_SOURCES) \ $(global_testing_testmatmultc_SOURCES) \ $(nodist_EXTRA_global_testing_testmatmultc_SOURCES) \ $(global_testing_testmult_SOURCES) \ $(nodist_EXTRA_global_testing_testmult_SOURCES) \ $(global_testing_testmultrect_SOURCES) \ $(nodist_EXTRA_global_testing_testmultrect_SOURCES) \ $(global_testing_testsolve_SOURCES) \ $(global_testing_testspd_SOURCES) \ $(global_testing_types_test_SOURCES) \ $(global_testing_unit_tests_ga_abs_value_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_abs_value_SOURCES) \ $(global_testing_unit_tests_ga_acc_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_acc_SOURCES) \ $(global_testing_unit_tests_ga_add_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_add_SOURCES) \ $(global_testing_unit_tests_ga_add_constant_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_add_constant_SOURCES) \ $(global_testing_unit_tests_ga_add_constantpatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_add_constantpatch_SOURCES) \ $(global_testing_unit_tests_ga_add_diagonal_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_add_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_add_patch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_add_patch_SOURCES) \ $(global_testing_unit_tests_ga_copy_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_copy_SOURCES) \ $(global_testing_unit_tests_ga_copy2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_copy2_SOURCES) \ $(global_testing_unit_tests_ga_copy3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_copy3_SOURCES) \ $(global_testing_unit_tests_ga_copypatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_copypatch_SOURCES) \ $(global_testing_unit_tests_ga_copypatch2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_copypatch2_SOURCES) \ $(global_testing_unit_tests_ga_create_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create_SOURCES) \ $(global_testing_unit_tests_ga_create1_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create1_SOURCES) \ $(global_testing_unit_tests_ga_create2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create2_SOURCES) \ $(global_testing_unit_tests_ga_create3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create3_SOURCES) \ $(global_testing_unit_tests_ga_create_handle_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create_handle_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create_irreg_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create_irreg2_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_create_irreg3_SOURCES) \ $(global_testing_unit_tests_ga_destroy_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_destroy_SOURCES) \ $(global_testing_unit_tests_ga_dgop_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_dgop_SOURCES) \ $(global_testing_unit_tests_ga_dot_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_dot_SOURCES) \ $(global_testing_unit_tests_ga_duplicate_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_duplicate_SOURCES) \ $(global_testing_unit_tests_ga_elem_divide_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_divide_SOURCES) \ $(global_testing_unit_tests_ga_elem_dividepatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_dividepatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_maximum_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_maximum_SOURCES) \ $(global_testing_unit_tests_ga_elem_maximumpatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_maximumpatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_minimum_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_minimum_SOURCES) \ $(global_testing_unit_tests_ga_elem_minimumpatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_minimumpatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_multiply_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_multiply_SOURCES) \ $(global_testing_unit_tests_ga_elem_multiplypatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_elem_multiplypatch_SOURCES) \ $(global_testing_unit_tests_ga_fill_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_fill_SOURCES) \ $(global_testing_unit_tests_ga_fillpatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_fillpatch_SOURCES) \ $(global_testing_unit_tests_ga_fillpatch1_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_fillpatch1_SOURCES) \ $(global_testing_unit_tests_ga_gather_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_gather_SOURCES) \ $(global_testing_unit_tests_ga_gather2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_gather2_SOURCES) \ $(global_testing_unit_tests_ga_gather3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_gather3_SOURCES) \ $(global_testing_unit_tests_ga_get_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_get_SOURCES) \ $(global_testing_unit_tests_ga_get_blockinfo_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_get_blockinfo_SOURCES) \ $(global_testing_unit_tests_ga_get_diagonal_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_get_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_igop_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_igop_SOURCES) \ $(global_testing_unit_tests_ga_igop2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_igop2_SOURCES) \ $(global_testing_unit_tests_ga_inquire_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_inquire_SOURCES) \ $(global_testing_unit_tests_ga_intialize_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_intialize_SOURCES) \ $(global_testing_unit_tests_ga_lgop_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_lgop_SOURCES) \ $(global_testing_unit_tests_ga_median_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_median_SOURCES) \ $(global_testing_unit_tests_ga_ndim_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_ndim_SOURCES) \ $(global_testing_unit_tests_ga_ndim2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_ndim2_SOURCES) \ $(global_testing_unit_tests_ga_nnodes_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_nnodes_SOURCES) \ $(global_testing_unit_tests_ga_nodeid_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_nodeid_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create2_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create3_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create4_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create4_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create5_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create5_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_destroy_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_destroy_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_destroy2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_destroy2_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_nnodes_nodeid_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_setdefault_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_pgroup_setdefault_SOURCES) \ $(global_testing_unit_tests_ga_put_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_put_SOURCES) \ $(global_testing_unit_tests_ga_put2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_put2_SOURCES) \ $(global_testing_unit_tests_ga_scale_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scale_SOURCES) \ $(global_testing_unit_tests_ga_scale2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scale2_SOURCES) \ $(global_testing_unit_tests_ga_scale_cols_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scale_cols_SOURCES) \ $(global_testing_unit_tests_ga_scale_patch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scale_patch_SOURCES) \ $(global_testing_unit_tests_ga_scale_rows_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scale_rows_SOURCES) \ $(global_testing_unit_tests_ga_scatter_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_scatter_SOURCES) \ $(global_testing_unit_tests_ga_set_data_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_set_data_SOURCES) \ $(global_testing_unit_tests_ga_set_diagonal_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_set_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_set_restricted_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_set_restricted_SOURCES) \ $(global_testing_unit_tests_ga_solve_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_solve_SOURCES) \ $(global_testing_unit_tests_ga_sync_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_sync_SOURCES) \ $(global_testing_unit_tests_ga_transpose_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_transpose_SOURCES) \ $(global_testing_unit_tests_ga_transpose2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_transpose2_SOURCES) \ $(global_testing_unit_tests_ga_transpose3_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_transpose3_SOURCES) \ $(global_testing_unit_tests_ga_zero_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_zero_SOURCES) \ $(global_testing_unit_tests_ga_zerodiagonal_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_zerodiagonal_SOURCES) \ $(global_testing_unit_tests_ga_zeropatch_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_zeropatch_SOURCES) \ $(global_testing_unit_tests_ga_zeropatch2_SOURCES) \ $(nodist_EXTRA_global_testing_unit_tests_ga_zeropatch2_SOURCES) \ $(global_testing_unpackc_SOURCES) \ $(nodist_EXTRA_global_testing_unpackc_SOURCES) \ $(global_trace_adjust_SOURCES) \ $(global_trace_collisions_SOURCES) \ $(gparrays_testing_test_SOURCES) \ $(gparrays_testing_testc_SOURCES) \ $(nodist_EXTRA_gparrays_testing_testc_SOURCES) \ $(gparrays_testing_transpose_SOURCES) \ $(nodist_EXTRA_gparrays_testing_transpose_SOURCES) \ $(ma_test_coalesce_SOURCES) \ $(nodist_EXTRA_ma_test_coalesce_SOURCES) \ $(ma_test_inquire_SOURCES) \ $(nodist_EXTRA_ma_test_inquire_SOURCES) $(ma_testc_SOURCES) \ $(nodist_EXTRA_ma_testc_SOURCES) $(ma_testf_SOURCES) \ $(pario_dra_big_SOURCES) $(pario_dra_bign_SOURCES) \ $(nodist_EXTRA_pario_dra_bign_SOURCES) \ $(pario_dra_dbg_read_SOURCES) \ $(nodist_EXTRA_pario_dra_dbg_read_SOURCES) \ $(pario_dra_dbg_write_SOURCES) \ $(nodist_EXTRA_pario_dra_dbg_write_SOURCES) \ $(pario_dra_dra2arviz_SOURCES) \ $(nodist_EXTRA_pario_dra_dra2arviz_SOURCES) \ $(pario_dra_dra_mxm_SOURCES) $(pario_dra_ntest_SOURCES) \ $(pario_dra_ntestc_SOURCES) \ $(nodist_EXTRA_pario_dra_ntestc_SOURCES) \ $(pario_dra_perf_SOURCES) $(pario_dra_perf2_SOURCES) \ $(pario_dra_perf3_SOURCES) $(pario_dra_perfn_SOURCES) \ $(nodist_EXTRA_pario_dra_perfn_SOURCES) \ $(pario_dra_rate_SOURCES) \ $(nodist_EXTRA_pario_dra_rate_SOURCES) \ $(pario_dra_test_SOURCES) $(pario_dra_test_mxm_SOURCES) \ $(pario_dra_time_mxm_SOURCES) $(pario_eaf_test_SOURCES) \ $(pario_sf_test_SOURCES) $(tcgmsg_tests_test_SOURCES) \ $(nodist_EXTRA_tcgmsg_tests_test_SOURCES) \ $(tcgmsg_tests_test_asyn_SOURCES) \ $(nodist_EXTRA_tcgmsg_tests_test_asyn_SOURCES) \ $(tcgmsg_tests_testf_SOURCES) DIST_SOURCES = $(am__libga___la_SOURCES_DIST) \ $(am__libga_la_SOURCES_DIST) $(am__libwapi_la_SOURCES_DIST) \ $(am__ga___testing_elempatch_SOURCES_DIST) \ $(am__ga___testing_mtest_SOURCES_DIST) \ $(am__ga___testing_ntestc_SOURCES_DIST) \ $(am__ga___testing_testc_SOURCES_DIST) \ $(am__ga___testing_testmult_SOURCES_DIST) \ $(gaf2c_testarg_SOURCES) $(am__global_X_xregion_SOURCES_DIST) \ $(global_examples_boltzmann_boltz_SOURCES) \ $(global_examples_conjugate_gradient_ga_cg_SOURCES) \ $(global_examples_lennard_jones_lennard_SOURCES) \ $(global_examples_md_cluster_grp_sim_SOURCES) \ $(global_examples_scf_scf_SOURCES) \ $(am__global_testing_big_SOURCES_DIST) \ $(am__global_testing_bin_SOURCES_DIST) \ $(am__global_testing_blktest_SOURCES_DIST) \ $(am__global_testing_d2test_SOURCES_DIST) \ $(am__global_testing_elempatch_SOURCES_DIST) \ $(am__global_testing_field_test_SOURCES_DIST) \ $(am__global_testing_g2test_SOURCES_DIST) \ $(am__global_testing_g3test_SOURCES_DIST) \ $(am__global_testing_ga_mpi_SOURCES_DIST) \ $(am__global_testing_ga_lu_SOURCES_DIST) \ $(am__global_testing_ga_shift_SOURCES_DIST) \ $(am__global_testing_gatscat_SOURCES_DIST) \ $(am__global_testing_getmem_SOURCES_DIST) \ $(am__global_testing_ghosts_SOURCES_DIST) \ $(am__global_testing_ipc_clean_SOURCES_DIST) \ $(am__global_testing_jacobi_SOURCES_DIST) \ $(am__global_testing_lock_SOURCES_DIST) \ $(am__global_testing_mir_perf2_SOURCES_DIST) \ $(am__global_testing_mmatrix_SOURCES_DIST) \ $(am__global_testing_mtest_SOURCES_DIST) \ $(am__global_testing_mulmatpatch_SOURCES_DIST) \ $(am__global_testing_mulmatpatchc_SOURCES_DIST) \ $(am__global_testing_nb2test_SOURCES_DIST) \ $(am__global_testing_ndim_SOURCES_DIST) \ $(am__global_testing_normc_SOURCES_DIST) \ $(am__global_testing_ntestc_SOURCES_DIST) \ $(am__global_testing_ntestfc_SOURCES_DIST) \ $(am__global_testing_packc_SOURCES_DIST) \ $(am__global_testing_patch_SOURCES_DIST) \ $(am__global_testing_patch2_SOURCES_DIST) \ $(am__global_testing_patch_enumc_SOURCES_DIST) \ $(am__global_testing_patch_enumf_SOURCES_DIST) \ $(am__global_testing_perf_SOURCES_DIST) \ $(am__global_testing_perf2_SOURCES_DIST) \ $(am__global_testing_perfmod_SOURCES_DIST) \ $(am__global_testing_perform_SOURCES_DIST) \ $(am__global_testing_pg2test_SOURCES_DIST) \ $(am__global_testing_pg2testmatmult_SOURCES_DIST) \ $(am__global_testing_pgtest_SOURCES_DIST) \ $(am__global_testing_pgtestmatmult_SOURCES_DIST) \ $(am__global_testing_print_SOURCES_DIST) \ $(am__global_testing_random_SOURCES_DIST) \ $(am__global_testing_scan_SOURCES_DIST) \ $(am__global_testing_scan_addc_SOURCES_DIST) \ $(am__global_testing_scan_copyc_SOURCES_DIST) \ $(am__global_testing_simple_groups_SOURCES_DIST) \ $(am__global_testing_simple_groups_comm_SOURCES_DIST) \ $(am__global_testing_simple_groups_commc_SOURCES_DIST) \ $(am__global_testing_sparse_SOURCES_DIST) \ $(am__global_testing_sprsmatmult_SOURCES_DIST) \ $(am__global_testing_stride_SOURCES_DIST) \ $(am__global_testing_test_SOURCES_DIST) \ $(am__global_testing_test_mirrored_SOURCES_DIST) \ $(am__global_testing_testc_SOURCES_DIST) \ $(am__global_testing_testeig_SOURCES_DIST) \ $(am__global_testing_testmatmult_SOURCES_DIST) \ $(am__global_testing_testmatmultc_SOURCES_DIST) \ $(am__global_testing_testmult_SOURCES_DIST) \ $(am__global_testing_testmultrect_SOURCES_DIST) \ $(am__global_testing_testsolve_SOURCES_DIST) \ $(am__global_testing_testspd_SOURCES_DIST) \ $(am__global_testing_types_test_SOURCES_DIST) \ $(global_testing_unit_tests_ga_abs_value_SOURCES) \ $(global_testing_unit_tests_ga_acc_SOURCES) \ $(global_testing_unit_tests_ga_add_SOURCES) \ $(global_testing_unit_tests_ga_add_constant_SOURCES) \ $(global_testing_unit_tests_ga_add_constantpatch_SOURCES) \ $(global_testing_unit_tests_ga_add_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_add_patch_SOURCES) \ $(global_testing_unit_tests_ga_copy_SOURCES) \ $(global_testing_unit_tests_ga_copy2_SOURCES) \ $(global_testing_unit_tests_ga_copy3_SOURCES) \ $(global_testing_unit_tests_ga_copypatch_SOURCES) \ $(global_testing_unit_tests_ga_copypatch2_SOURCES) \ $(global_testing_unit_tests_ga_create_SOURCES) \ $(global_testing_unit_tests_ga_create1_SOURCES) \ $(global_testing_unit_tests_ga_create2_SOURCES) \ $(global_testing_unit_tests_ga_create3_SOURCES) \ $(global_testing_unit_tests_ga_create_handle_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg2_SOURCES) \ $(global_testing_unit_tests_ga_create_irreg3_SOURCES) \ $(global_testing_unit_tests_ga_destroy_SOURCES) \ $(global_testing_unit_tests_ga_dgop_SOURCES) \ $(global_testing_unit_tests_ga_dot_SOURCES) \ $(global_testing_unit_tests_ga_duplicate_SOURCES) \ $(global_testing_unit_tests_ga_elem_divide_SOURCES) \ $(global_testing_unit_tests_ga_elem_dividepatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_maximum_SOURCES) \ $(global_testing_unit_tests_ga_elem_maximumpatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_minimum_SOURCES) \ $(global_testing_unit_tests_ga_elem_minimumpatch_SOURCES) \ $(global_testing_unit_tests_ga_elem_multiply_SOURCES) \ $(global_testing_unit_tests_ga_elem_multiplypatch_SOURCES) \ $(global_testing_unit_tests_ga_fill_SOURCES) \ $(global_testing_unit_tests_ga_fillpatch_SOURCES) \ $(global_testing_unit_tests_ga_fillpatch1_SOURCES) \ $(global_testing_unit_tests_ga_gather_SOURCES) \ $(global_testing_unit_tests_ga_gather2_SOURCES) \ $(global_testing_unit_tests_ga_gather3_SOURCES) \ $(global_testing_unit_tests_ga_get_SOURCES) \ $(global_testing_unit_tests_ga_get_blockinfo_SOURCES) \ $(global_testing_unit_tests_ga_get_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_igop_SOURCES) \ $(global_testing_unit_tests_ga_igop2_SOURCES) \ $(global_testing_unit_tests_ga_inquire_SOURCES) \ $(global_testing_unit_tests_ga_intialize_SOURCES) \ $(global_testing_unit_tests_ga_lgop_SOURCES) \ $(global_testing_unit_tests_ga_median_SOURCES) \ $(global_testing_unit_tests_ga_ndim_SOURCES) \ $(global_testing_unit_tests_ga_ndim2_SOURCES) \ $(global_testing_unit_tests_ga_nnodes_SOURCES) \ $(global_testing_unit_tests_ga_nodeid_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create2_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create3_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create4_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_create5_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_destroy_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_destroy2_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_SOURCES) \ $(global_testing_unit_tests_ga_pgroup_setdefault_SOURCES) \ $(global_testing_unit_tests_ga_put_SOURCES) \ $(global_testing_unit_tests_ga_put2_SOURCES) \ $(global_testing_unit_tests_ga_scale_SOURCES) \ $(global_testing_unit_tests_ga_scale2_SOURCES) \ $(global_testing_unit_tests_ga_scale_cols_SOURCES) \ $(global_testing_unit_tests_ga_scale_patch_SOURCES) \ $(global_testing_unit_tests_ga_scale_rows_SOURCES) \ $(global_testing_unit_tests_ga_scatter_SOURCES) \ $(global_testing_unit_tests_ga_set_data_SOURCES) \ $(global_testing_unit_tests_ga_set_diagonal_SOURCES) \ $(global_testing_unit_tests_ga_set_restricted_SOURCES) \ $(global_testing_unit_tests_ga_solve_SOURCES) \ $(global_testing_unit_tests_ga_sync_SOURCES) \ $(global_testing_unit_tests_ga_transpose_SOURCES) \ $(global_testing_unit_tests_ga_transpose2_SOURCES) \ $(global_testing_unit_tests_ga_transpose3_SOURCES) \ $(global_testing_unit_tests_ga_zero_SOURCES) \ $(global_testing_unit_tests_ga_zerodiagonal_SOURCES) \ $(global_testing_unit_tests_ga_zeropatch_SOURCES) \ $(global_testing_unit_tests_ga_zeropatch2_SOURCES) \ $(am__global_testing_unpackc_SOURCES_DIST) \ $(global_trace_adjust_SOURCES) \ $(global_trace_collisions_SOURCES) \ $(am__gparrays_testing_test_SOURCES_DIST) \ $(am__gparrays_testing_testc_SOURCES_DIST) \ $(am__gparrays_testing_transpose_SOURCES_DIST) \ $(ma_test_coalesce_SOURCES) $(ma_test_inquire_SOURCES) \ $(ma_testc_SOURCES) $(ma_testf_SOURCES) \ $(pario_dra_big_SOURCES) $(pario_dra_bign_SOURCES) \ $(pario_dra_dbg_read_SOURCES) $(pario_dra_dbg_write_SOURCES) \ $(pario_dra_dra2arviz_SOURCES) $(pario_dra_dra_mxm_SOURCES) \ $(pario_dra_ntest_SOURCES) $(pario_dra_ntestc_SOURCES) \ $(pario_dra_perf_SOURCES) $(pario_dra_perf2_SOURCES) \ $(pario_dra_perf3_SOURCES) $(pario_dra_perfn_SOURCES) \ $(pario_dra_rate_SOURCES) $(pario_dra_test_SOURCES) \ $(pario_dra_test_mxm_SOURCES) $(pario_dra_time_mxm_SOURCES) \ $(pario_eaf_test_SOURCES) $(pario_sf_test_SOURCES) \ $(am__tcgmsg_tests_test_SOURCES_DIST) \ $(am__tcgmsg_tests_test_asyn_SOURCES_DIST) \ $(am__tcgmsg_tests_testf_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__include_HEADERS_DIST = ma/error.h ma/macdecls.h ma/macommon.h \ ma/maf2c.fh ma/mafdecls.fh ma/matypes.h ma/scope.h \ ma/string-util.h ma/table.h global/src/gacommon.h \ global/src/ga.h global/src/global.fh global/src/ga-papi.h \ global/src/ga-mpi.h global/src/ga-mpi.fh pario/dra/dra.fh \ pario/dra/dra.h pario/eaf/eaf.fh pario/eaf/eaf.h \ pario/elio/chemio.h pario/elio/elio.h pario/sf/coms.h \ pario/sf/sf.fh pario/sf/sf.h ga++/src/ga++.h \ ga++/src/GAServices.h ga++/src/GlobalArray.h \ ga++/src/init_term.h ga++/src/PGroup.h ga++/src/services.h \ gparrays/src/gp.h gparrays/src/gp-papi.h gaf2c/typesf2c.h \ gaf2c/farg.h tcgmsg/tcgmsg.fh tcgmsg/tcgmsg.h \ tcgmsg/tcgmsg-mpi/msgtypesc.h tcgmsg/tcgmsg-mpi/msgtypesf.h HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ check recheck check-html recheck-html distdir dist dist-all \ distcheck ETAGS = etags CTAGS = ctags # If stdout is a non-dumb tty, use colors. If test -t is not supported, # then this fails; a conservative approach. Of course do not redirect # stdout here, just stderr. am__tty_colors = \ red=; grn=; lgn=; blu=; std=; \ test "X$(AM_COLOR_TESTS)" != Xno \ && test "X$$TERM" != Xdumb \ && { test "X$(AM_COLOR_TESTS)" = Xalways || test -t 1 2>/dev/null; } \ && { \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ std=''; \ } # Restructured Text title and section. am__rst_title = sed 's/.*/ & /;h;s/./=/g;p;x;p;g;p;s/.*//' am__rst_section = sed 'p;s/./=/g;p;g' # Put stdin (possibly several lines separated by ". ") in a box. # Prefix each line by 'col' and terminate each with 'std', for coloring. # Multi line coloring is problematic with "less -R", so we really need # to color each line individually. am__text_box = $(AWK) '{ \ n = split($$0, lines, "\\. "); max = 0; \ for (i = 1; i <= n; ++i) \ if (max < length(lines[i])) \ max = length(lines[i]); \ for (i = 0; i < max; ++i) \ line = line "="; \ print col line std; \ for (i = 1; i <= n; ++i) \ if (lines[i]) \ print col lines[i] std; \ print col line std; \ }' # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log, and passes # TESTS_ENVIRONMENT. Save and restore TERM around use of # TESTS_ENVIRONMENT, in case that unsets it. am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ srcdir=$(srcdir); export srcdir; \ rm -f $@-t; \ am__trap='rm -f '\''$(abs_builddir)/$@-t'\''; (exit $$st); exit $$st'; \ trap "st=129; $$am__trap" 1; trap "st=130; $$am__trap" 2; \ trap "st=141; $$am__trap" 13; trap "st=143; $$am__trap" 15; \ am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`; \ test "x$$am__odir" = x. || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; __SAVED_TERM=$$TERM; \ $(TESTS_ENVIRONMENT) # To be appended to the command running the test. Handle the stdout # and stderr redirection, and catch the exit status. am__check_post = \ >$@-t 2>&1; \ estatus=$$?; \ if test -n '$(DISABLE_HARD_ERRORS)' \ && test $$estatus -eq 99; then \ estatus=1; \ fi; \ TERM=$$__SAVED_TERM; export TERM; \ $(am__tty_colors); \ xfailed=PASS; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ xfailed=XFAIL;; \ esac; \ case $$estatus.$$xfailed in \ 0.XFAIL) col=$$red; res=XPASS;; \ 0.*) col=$$grn; res=PASS ;; \ 77.*) col=$$blu; res=SKIP ;; \ 99.*) col=$$red; res=FAIL ;; \ *.XFAIL) col=$$lgn; res=XFAIL;; \ *.*) col=$$red; res=FAIL ;; \ esac; \ echo "$${col}$$res$${std}: $$f"; \ echo "$$res: $$f (exit: $$estatus)" | \ $(am__rst_section) >$@; \ cat $@-t >>$@; \ rm -f $@-t RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_HTML = $(TEST_SUITE_LOG:.log=.html) am__EXEEXT_18 = am__EXEEXT_19 = $(MA_SERIAL_TESTS) $(am__EXEEXT_18) $(am__EXEEXT_18) am__EXEEXT_20 = $(am__EXEEXT_18) $(GLOBAL_PARALLEL_TESTS) \ $(CXX_PARALLEL_TESTS) am__EXEEXT_21 = $(MA_SERIAL_TESTS_XFAIL) $(am__EXEEXT_18) \ $(am__EXEEXT_18) am__EXEEXT_22 = $(am__EXEEXT_18) $(am__EXEEXT_18) $(am__EXEEXT_18) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) TEST_LOGS_TMP = $(TEST_LOGS:.log=.log-t) DIST_SUBDIRS = comex armci . DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ARMCI_NETWORK_CPPFLAGS = @ARMCI_NETWORK_CPPFLAGS@ ARMCI_NETWORK_LDFLAGS = @ARMCI_NETWORK_LDFLAGS@ ARMCI_NETWORK_LIBS = @ARMCI_NETWORK_LIBS@ ARMCI_SRC_DIR = @ARMCI_SRC_DIR@ AR_FLAGS = @AR_FLAGS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BLAS_CPPFLAGS = @BLAS_CPPFLAGS@ BLAS_LDFLAGS = @BLAS_LDFLAGS@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCAS = @CCAS@ CCASDEPMODE = @CCASDEPMODE@ CCASFLAGS = @CCASFLAGS@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CFLAG_NO_LOOP_OPT = @CFLAG_NO_LOOP_OPT@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ C_POINTER_AS_INTEGER = @C_POINTER_AS_INTEGER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ELPA_CPPFLAGS = @ELPA_CPPFLAGS@ ELPA_LDFLAGS = @ELPA_LDFLAGS@ ELPA_LIBS = @ELPA_LIBS@ EXEEXT = @EXEEXT@ F2C_DOUBLE_PRECISION_C_TYPE = @F2C_DOUBLE_PRECISION_C_TYPE@ F2C_GETARG = @F2C_GETARG@ F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS = @F2C_HIDDEN_STRING_LENGTH_AFTER_ARGS@ F2C_IARGC = @F2C_IARGC@ F2C_INTEGER_C_TYPE = @F2C_INTEGER_C_TYPE@ F2C_REAL_C_TYPE = @F2C_REAL_C_TYPE@ F77 = @F77@ F77LINK = @F77LINK@ FFLAGS = @FFLAGS@ FFLAG_INT = @FFLAG_INT@ FFLAG_NO_LOOP_OPT = @FFLAG_NO_LOOP_OPT@ FGREP = @FGREP@ FLD_NOMAIN = @FLD_NOMAIN@ FLIBS = @FLIBS@ GA_ACCESS_INDEX_TYPE = @GA_ACCESS_INDEX_TYPE@ GA_COPT = @GA_COPT@ GA_CXXOPT = @GA_CXXOPT@ GA_CXX_WARN = @GA_CXX_WARN@ GA_C_WARN = @GA_C_WARN@ GA_FOPT = @GA_FOPT@ GA_F_WARN = @GA_F_WARN@ GA_MP_CPPFLAGS = @GA_MP_CPPFLAGS@ GA_MP_LDFLAGS = @GA_MP_LDFLAGS@ GA_MP_LIBS = @GA_MP_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LAPACK_CPPFLAGS = @LAPACK_CPPFLAGS@ LAPACK_LDFLAGS = @LAPACK_LDFLAGS@ LAPACK_LIBS = @LAPACK_LIBS@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ M4 = @M4@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MA_ACCESS_INDEX_TYPE = @MA_ACCESS_INDEX_TYPE@ MA_ACCESS_INDEX_TYPE_C = @MA_ACCESS_INDEX_TYPE_C@ MA_LONG_DOUBLE = @MA_LONG_DOUBLE@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICXX = @MPICXX@ MPIEXEC = @MPIEXEC@ MPIF77 = @MPIF77@ NM = @NM@ NMEDIT = @NMEDIT@ NPROCS = @NPROCS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PLOTLIB = @PLOTLIB@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SCALAPACK_CPPFLAGS = @SCALAPACK_CPPFLAGS@ SCALAPACK_LDFLAGS = @SCALAPACK_LDFLAGS@ SCALAPACK_LIBS = @SCALAPACK_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TCGEXEC = @TCGEXEC@ THREAD_LIBRARY = @THREAD_LIBRARY@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CPPFLAGS = @X_CPPFLAGS@ X_LDFLAGS = @X_LDFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ am__v_F77LD_0 = @am__v_F77LD_0@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # The usual aclocal nonsense to get include paths right. ACLOCAL_AMFLAGS = -I m4 # All public headers, installed programs, test programs, and example programs # are listed in these variables. Appended to throughout. These are the # automake variables used. include_HEADERS = ma/error.h ma/macdecls.h ma/macommon.h ma/maf2c.fh \ ma/mafdecls.fh ma/matypes.h ma/scope.h ma/string-util.h \ ma/table.h global/src/gacommon.h global/src/ga.h \ global/src/global.fh global/src/ga-papi.h $(am__append_16) \ pario/dra/dra.fh pario/dra/dra.h pario/eaf/eaf.fh \ pario/eaf/eaf.h pario/elio/chemio.h pario/elio/elio.h \ pario/sf/coms.h pario/sf/sf.fh pario/sf/sf.h $(am__append_38) \ $(am__append_45) gaf2c/typesf2c.h gaf2c/farg.h \ tcgmsg/tcgmsg.fh tcgmsg/tcgmsg.h tcgmsg/tcgmsg-mpi/msgtypesc.h \ tcgmsg/tcgmsg-mpi/msgtypesf.h nodist_include_HEADERS = global/src/ga-wapi.h $(am__append_46) bin_SCRIPTS = tools/ga-config check_LTLIBRARIES = lib_LTLIBRARIES = libga.la $(am__append_6) $(am__append_37) ############################################################################## # compat # # Although the compat directory houses replacements for missing or erroneous # standard C functions and such sources are conditionally compiled based on # results from configure tests, without the "random" implementation the # m4-generated tests always fail for scatter and copy_patch. ############################################################################## # ma # ############################################################################## # pario # ############################################################################## # gaf2c # ############################################################################## # tcgmsg # libga_la_SOURCES = compat/random.c ma/error.c ma/f2c.c ma/ma.c ma/ma.h \ ma/memcpy.h ma/string-util.c ma/table.c $(am__append_2) \ LinAlg/lapack+blas/xgemm.c LinAlg/lapack+blas/xgemm.h \ LinAlg/lapack+blas/galinalg.h LinAlg/lapack+blas/galinalg.fh \ global/src/abstract_ops.h global/src/base.c global/src/base.h \ global/src/capi.c global/src/cnames.h global/src/collect.c \ global/src/datatypes.c global/src/decomp.c global/src/diag.fh \ global/src/DP.c global/src/elem_alg.c global/src/fapi.c \ global/src/ga_ckpt.h global/src/gaconfig.h \ global/src/ga_diag_seqc.c global/src/ga_malloc.c \ global/src/ga_profile.h global/src/ga_solve_seq.c \ global/src/ga_symmetr.c global/src/ga_trace.c \ global/src/ghosts.c global/src/global.h \ global/src/global.nalg.c global/src/global.npatch.c \ global/src/global.periodic.c global/src/globalp.h \ global/src/global.util.c global/src/hsort.scat.c \ global/src/matmul.c global/src/matmul.h global/src/matrix.c \ global/src/nbutil.c global/src/onesided.c \ global/src/peigstubs.c global/src/scalapack.fh \ global/src/sclstubs.c global/src/select.c global/src/sparse.c \ global/src/types.xh global/src/types2.xh $(am__append_11) \ $(am__append_12) $(am__append_13) $(am__append_14) \ $(am__append_15) pario/dra/buffers.c pario/dra/buffers.h \ pario/dra/capi.c pario/dra/disk.arrays.c \ pario/dra/disk.param.c pario/dra/draf2c.h pario/dra/drap.h \ pario/dra/env.c pario/dra/fortran.c pario/dra/patch.util.c \ pario/eaf/eaf.c pario/eaf/eaf_f2c.c pario/eaf/eafP.h \ pario/elio/elio.c pario/elio/eliop.h pario/elio/pablo.h \ pario/elio/stat.c pario/sf/sf_capi.c pario/sf/sff2c.h \ pario/sf/sf_fortran.c pario/sf/shared.files.c $(am__append_43) \ gaf2c/gaf2c.c gaf2c/drand.c $(am__append_50) tcgmsg/capi.c \ tcgmsg/fapi.c $(am__append_53) # As of ga-5-2 libarmci is no longer rolled up into libga. libga_la_LIBADD = $(ELPA_LIBS) $(SCALAPACK_LIBS) $(LAPACK_LIBS) \ $(BLAS_LIBS) $(am__append_62) $(am__append_63) \ $(am__append_64) $(am__append_65) nodist_libga_la_SOURCES = config.fh $(am__append_8) $(am__append_9) \ global/src/ga-wapidefs.h $(am__append_44) ############################################################################## # global # ############################################################################## # global/doc # ############################################################################## # tcgmsg/examples # # NOTE: While we don't build the tcgmsg examples, we include everything in the # distribution anyway. # ############################################################################## # tascel # The tascel directory is not automatically configured nor added to SUBDIRS. # However, it is still distributed with GA. ############################################################################## # gfutex # The gfutex directory is not automatically configured nor added to SUBDIRS. # However, it is still distributed with GA. EXTRA_DIST = README LinAlg/lapack+blas/README global/README \ $(am__append_10) tools/wapigen.py tools/wapigen_counts.py \ tools/wapigen_trace.py $(am__append_29) \ global/examples/boltzmann/README \ global/examples/lennard-jones/README \ global/examples/md_cluster/atom.inp \ global/examples/scf/be16.inpt global/examples/scf/be.inpt \ global/examples/scf/ft-scf.F global/examples/scf/README \ global/X/README global/trace/README global/trace/test.f \ global/doc/README global/doc/Supercomputing94.pdf \ global/doc/user.pdf pario/dra/dbg_read.c pario/dra/dbg_write.c \ pario/dra/dra2arviz.c pario/dra/global.unsup.c \ pario/dra/README ga++/README tcgmsg/examples/blkdat120lin.f \ tcgmsg/examples/blkdat15.f tcgmsg/examples/blkdat240lin.f \ tcgmsg/examples/blkdat30.f tcgmsg/examples/blkdat60.f \ tcgmsg/examples/blkdat60lin.f tcgmsg/examples/cscf120lin.h \ tcgmsg/examples/cscf15.h tcgmsg/examples/cscf240lin.h \ tcgmsg/examples/cscf30.h tcgmsg/examples/cscf60.h \ tcgmsg/examples/cscf60lin.h tcgmsg/examples/cscf.h \ tcgmsg/examples/daxpy1.s tcgmsg/examples/daxpy.f \ tcgmsg/examples/ddot.f tcgmsg/examples/demo.proto \ tcgmsg/examples/diagon.f tcgmsg/examples/dscal.f \ tcgmsg/examples/fexit.f.proto tcgmsg/examples/getmem.c \ tcgmsg/examples/grid.c tcgmsg/examples/ieeetrap.c \ tcgmsg/examples/integ.f tcgmsg/examples/jacobi.f \ tcgmsg/examples/Makefile.proto tcgmsg/examples/mc.f \ tcgmsg/examples/mc.input tcgmsg/examples/md.f \ tcgmsg/examples/mxv_daxpy1.f tcgmsg/examples/mxv_dgemv.f \ tcgmsg/examples/mxv_fortran.f tcgmsg/examples/output.f \ tcgmsg/examples/prtri.f tcgmsg/examples/random.c \ tcgmsg/examples/README tcgmsg/examples/runit \ tcgmsg/examples/runit.grid tcgmsg/examples/scfblas.f \ tcgmsg/examples/scf.f tcgmsg/examples/timer.f \ tcgmsg/examples/trace.out tcgmsg/examples/xpix.shar \ tcgmsg/tcgmsg-mpi/README tascel gfutex ############################################################################## # config # # The config.h file is automatically generated from config.h.in at configure # time. However, it contains symbols which certain Fortran compilers do not # understand. Therefore, we create a config.fh file which is Fortran-specific # and works with all Fortran compilers. # BUILT_SOURCES = config.fh global/src/ga-wapi.h \ global/src/ga-wapidefs.h $(am__append_41) MOSTLYCLEANFILES = CLEANFILES = $(bin_SCRIPTS) config.fh global/src/ga-wapi.h \ global/src/ga-wapidefs.h $(am__append_30) $(am__append_42) DISTCLEANFILES = MAINTAINERCLEANFILES = AM_FFLAGS = $(GA_FOPT) $(GA_F_WARN) $(FFLAG_INT) $(FFLAG_NO_LOOP_OPT) AM_CFLAGS = $(GA_COPT) $(GA_C_WARN) $(CFLAG_NO_LOOP_OPT) AM_CXXFLAGS = $(GA_CXXOPT) $(GA_CXX_WARN) ############################################################################## # global/testing # AM_CPPFLAGS = $(ELPA_CPPFLAGS) $(SCALAPACK_CPPFLAGS) \ $(LAPACK_CPPFLAGS) $(BLAS_CPPFLAGS) $(GA_MP_CPPFLAGS) \ $(ARMCI_NETWORK_CPPFLAGS) -I$(top_build_prefix)ma \ -I$(top_srcdir)/ma -I$(top_srcdir)/LinAlg/lapack+blas \ -I$(top_build_prefix)global/src -I$(top_srcdir)/global/src \ -I$(top_srcdir)/global/testing -I$(top_srcdir)/pario/dra \ -I$(top_srcdir)/pario/eaf -I$(top_srcdir)/pario/elio \ -I$(top_srcdir)/pario/sf $(am__append_39) $(am__append_49) \ -I$(top_build_prefix)gaf2c -I$(top_srcdir)/gaf2c \ -I$(top_srcdir)/tcgmsg $(am__append_54) $(am__append_57) \ $(am__append_58) $(am__append_59) $(am__append_60) \ $(am__append_61) AM_LDFLAGS = $(ELPA_LDFLAGS) $(SCALAPACK_LDFLAGS) $(LAPACK_LDFLAGS) \ $(BLAS_LDFLAGS) $(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) \ $(am__append_1) FLDFLAGS = $(ELPA_LDFLAGS) $(SCALAPACK_LDFLAGS) $(LAPACK_LDFLAGS) \ $(BLAS_LDFLAGS) $(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) LDADD = $(LTLIBOBJS) libga.la $(ELPA_LIBS) $(SCALAPACK_LIBS) \ $(LAPACK_LIBS) $(BLAS_LIBS) $(GA_MP_LIBS) \ $(ARMCI_NETWORK_LIBS) # Certain trickery when turning Fortran support on or off. @ENABLE_F77_TRUE@MAYBE_DUMMY_F_LINK = dummy.f @ENABLE_F77_TRUE@MAYBE_FLIBS = $(FLIBS) ############################################################################## # compiler and linker flags # # Important for external tools wanting to know how to link to GA. This # functionality caries over from the pre-autotools GA build. SED_NORMALIZE_WHITESPACE = $(SED) 's/ [ ]*/ /g;s/" /"/g;s/ "/"/g' #MA_SERIAL_TESTS += ma/testc$(EXEEXT) # iteractive prompt MA_SERIAL_TESTS = ma/test-coalesce$(EXEEXT) ma/test-inquire$(EXEEXT) \ $(am__append_4) MA_SERIAL_TESTS_XFAIL = $(am__append_5) MA_PARALLEL_TESTS = MA_PARALLEL_TESTS_XFAIL = MA_TESTS = $(MA_SERIAL_TESTS) $(MA_PARALLEL_TESTS) MA_TESTS_XFAIL = $(MA_SERIAL_TESTS_XFAIL) $(MA_PARALLEL_TESTS_XFAIL) ma_testf_SOURCES = ma/testf.F ma_testc_SOURCES = ma/testc.c ma_test_coalesce_SOURCES = ma/test-coalesce.c ma_test_inquire_SOURCES = ma/test-inquire.c ma_testf_LDFLAGS = $(FLDFLAGS) nodist_EXTRA_ma_testc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_ma_test_coalesce_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_ma_test_inquire_SOURCES = $(MAYBE_DUMMY_F_LINK) @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@libwapi_la_SOURCES = tools/ga-wapi.c \ @ENABLE_PROFILING_TRUE@@HAVE_SYS_WEAK_ALIAS_PRAGMA_TRUE@ $(am__append_7) ############################################################################## # global/src # PAPI_H = $(top_srcdir)/global/src/ga-papi.h GLOBAL_SERIAL_TESTS = GLOBAL_SERIAL_TESTS_XFAIL = #GLOBAL_PARALLEL_TESTS += global/testing/big$(EXEEXT) # needs lots of memory #GLOBAL_PARALLEL_TESTS += global/testing/gatscat$(EXEEXT) # broken GLOBAL_PARALLEL_TESTS = global/testing/elempatch$(EXEEXT) \ global/testing/getmem$(EXEEXT) global/testing/mtest$(EXEEXT) \ global/testing/mulmatpatchc$(EXEEXT) \ global/testing/normc$(EXEEXT) global/testing/ntestc$(EXEEXT) \ global/testing/ntestfc$(EXEEXT) global/testing/packc$(EXEEXT) \ global/testing/patch_enumc$(EXEEXT) \ global/testing/print$(EXEEXT) \ global/testing/scan_addc$(EXEEXT) \ global/testing/scan_copyc$(EXEEXT) \ global/testing/testc$(EXEEXT) \ global/testing/testmatmultc$(EXEEXT) \ global/testing/testmult$(EXEEXT) \ global/testing/testmultrect$(EXEEXT) \ global/testing/unpackc$(EXEEXT) $(am__append_24) \ $(am__append_25) $(am__append_26) $(am__append_27) \ $(am__append_28) $(am__append_32) \ global/examples/lennard-jones/lennard$(EXEEXT) \ $(am__append_35) GLOBAL_PARALLEL_TESTS_XFAIL = GLOBAL_TESTS = $(GLOBAL_SERIAL_TESTS) $(GLOBAL_PARALLEL_TESTS) GLOBAL_TESTS_XFAIL = $(GLOBAL_SERIAL_TESTS_XFAIL) $(GLOBAL_PARALLEL_TESTS_XFAIL) #GLOBAL_PARALLEL_TESTS += global/testing/ipc_clean$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_abs_value$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_acc$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_add$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_add_constant$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_add_constantpatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_add_diagonal$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_add_patch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_copy2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_copy3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_copy$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_copypatch2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_copypatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create1$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create_handle$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create_irreg2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create_irreg3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_create_irreg$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_destroy$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_dgop$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_dot$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_duplicate$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_divide$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_dividepatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_maximum$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_maximumpatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_minimum$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_minimumpatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_multiply$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_elem_multiplypatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_fill$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_fillpatch1$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_fillpatch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_gather2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_gather3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_gather$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_get_blockinfo$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_get$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_get_diagonal$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_igop2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_igop$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_inquire$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_intialize$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_lgop$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_median$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_ndim2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_ndim$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_nnodes$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_nodeid$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_create2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_create3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_create4$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_create5$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_create$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_destroy2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_destroy$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_nnodes_nodeid$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_pgroup_setdefault$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_put2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_put$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scale2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scale$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scale_cols$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scale_patch$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scale_rows$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_scatter$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_set_data$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_set_diagonal$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_set_restricted$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_solve$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_sync$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_transpose2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_transpose3$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_transpose$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_zero$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_zerodiagonal$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_zeropatch2$(EXEEXT) #GLOBAL_PARALLEL_TESTS += global/testing/unit-tests/ga_zeropatch$(EXEEXT) @HAVE_M4_TRUE@GLOBAL_TESTING_M4_DEPS = \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_GA_FILL.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_main.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_ACC.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_ADD_PATCH.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_COPY_PATCH.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_DOT_PATCH.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_FILL_PATCH.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_GATHER.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_GET.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_PERIODIC_ACC.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_PERIODIC_GET.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_PERIODIC_PUT.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_PUT.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_SCALE_PATCH.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_SCATTER_ACC.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_NGA_SCATTER.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_util_comm.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ndim_util.src \ @HAVE_M4_TRUE@ global/testing/ngatest_src/ngatest.def \ @HAVE_M4_TRUE@ global/testing/nga-onesided.m4 \ @HAVE_M4_TRUE@ global/testing/nga-patch.m4 \ @HAVE_M4_TRUE@ global/testing/nga-periodic.m4 \ @HAVE_M4_TRUE@ global/testing/nga-scatter.m4 \ @HAVE_M4_TRUE@ global/testing/ngatest.m4 \ @HAVE_M4_TRUE@ global/testing/nga-util.m4 gtsrc = global/testing/testutil.fh global/testing/testutil.h \ global/testing/util.c $(am__append_33) global_testing_big_SOURCES = global/testing/big.c $(gtsrc) global_testing_bin_SOURCES = global/testing/bin.F $(gtsrc) global_testing_blktest_SOURCES = global/testing/blktest.F $(gtsrc) global_testing_d2test_SOURCES = global/testing/d2test.F $(gtsrc) global_testing_elempatch_SOURCES = global/testing/elempatch.c $(gtsrc) global_testing_field_test_SOURCES = global/testing/field-test.F $(gtsrc) global_testing_g2test_SOURCES = global/testing/g2test.F $(gtsrc) global_testing_g3test_SOURCES = global/testing/g3test.F $(gtsrc) global_testing_ga_lu_SOURCES = global/testing/ga_lu.c $(gtsrc) global_testing_ga_mpi_SOURCES = global/testing/ga-mpi.c $(gtsrc) global_testing_ga_shift_SOURCES = global/testing/ga_shift.F $(gtsrc) global_testing_gatscat_SOURCES = global/testing/gatscat.c $(gtsrc) global_testing_getmem_SOURCES = global/testing/getmem.c $(gtsrc) global_testing_ghosts_SOURCES = global/testing/ghosts.F $(gtsrc) global_testing_ipc_clean_SOURCES = global/testing/ipc.clean.c $(gtsrc) global_testing_jacobi_SOURCES = global/testing/jacobi.F $(gtsrc) global_testing_lock_SOURCES = global/testing/lock.c $(gtsrc) global_testing_mir_perf2_SOURCES = global/testing/mir_perf2.F $(gtsrc) global_testing_mmatrix_SOURCES = global/testing/mmatrix.F $(gtsrc) global_testing_mtest_SOURCES = global/testing/mtest.c $(gtsrc) global_testing_mulmatpatch_SOURCES = global/testing/mulmatpatch.F $(gtsrc) global_testing_mulmatpatchc_SOURCES = global/testing/mulmatpatchc.c $(gtsrc) global_testing_nb2test_SOURCES = global/testing/nb2test.F $(gtsrc) global_testing_ndim_SOURCES = global/testing/ndim.F $(gtsrc) global_testing_normc_SOURCES = global/testing/normc.c $(gtsrc) global_testing_ntestc_SOURCES = global/testing/ntestc.c $(gtsrc) global_testing_ntestfc_SOURCES = global/testing/ntestfc.c $(gtsrc) global_testing_packc_SOURCES = global/testing/packc.c $(gtsrc) global_testing_patch_SOURCES = global/testing/patch.F $(gtsrc) global_testing_patch2_SOURCES = global/testing/patch2.F $(gtsrc) global_testing_patch_enumc_SOURCES = global/testing/patch_enumc.c $(gtsrc) global_testing_patch_enumf_SOURCES = global/testing/patch_enumf.F $(gtsrc) global_testing_perf_SOURCES = global/testing/perf.F $(gtsrc) global_testing_perf2_SOURCES = global/testing/perf2.c $(gtsrc) global_testing_perfmod_SOURCES = global/testing/perfmod.F $(gtsrc) global_testing_perform_SOURCES = global/testing/perform.F $(gtsrc) global_testing_pg2test_SOURCES = global/testing/pg2test.F $(gtsrc) global_testing_pg2testmatmult_SOURCES = global/testing/pg2testmatmult.F $(gtsrc) global_testing_pgtest_SOURCES = global/testing/pgtest.F $(gtsrc) global_testing_pgtestmatmult_SOURCES = global/testing/pgtestmatmult.F $(gtsrc) global_testing_print_SOURCES = global/testing/print.c $(gtsrc) global_testing_random_SOURCES = global/testing/random.F $(gtsrc) global_testing_scan_SOURCES = global/testing/scan.F $(gtsrc) global_testing_scan_addc_SOURCES = global/testing/scan_addc.c $(gtsrc) global_testing_scan_copyc_SOURCES = global/testing/scan_copyc.c $(gtsrc) global_testing_simple_groups_SOURCES = global/testing/simple_groups.F $(gtsrc) global_testing_simple_groups_comm_SOURCES = global/testing/simple_groups_comm.F $(gtsrc) global_testing_simple_groups_commc_SOURCES = global/testing/simple_groups_commc.c $(gtsrc) global_testing_sparse_SOURCES = global/testing/sparse.F $(gtsrc) global_testing_sprsmatmult_SOURCES = global/testing/sprsmatmult.F $(gtsrc) global_testing_stride_SOURCES = global/testing/stride.F $(gtsrc) global_testing_test_SOURCES = global/testing/test.F $(gtsrc) global_testing_test_mirrored_SOURCES = global/testing/test.F $(gtsrc) global_testing_testc_SOURCES = global/testing/testc.c $(gtsrc) global_testing_testeig_SOURCES = global/testing/testeig.F $(gtsrc) global_testing_testmatmult_SOURCES = global/testing/testmatmult.F $(gtsrc) global_testing_testmatmultc_SOURCES = global/testing/testmatmultc.c $(gtsrc) global_testing_testmult_SOURCES = global/testing/testmult.c $(gtsrc) global_testing_testmultrect_SOURCES = global/testing/testmultrect.c $(gtsrc) global_testing_testsolve_SOURCES = global/testing/testsolve.F $(gtsrc) global_testing_testspd_SOURCES = global/testing/testspd.F $(gtsrc) global_testing_types_test_SOURCES = global/testing/types-test.F $(gtsrc) global_testing_unpackc_SOURCES = global/testing/unpackc.c $(gtsrc) nodist_global_testing_nga_onesided_SOURCES = global/testing/nga-onesided.F $(gtsrc) nodist_global_testing_nga_patch_SOURCES = global/testing/nga-patch.F $(gtsrc) nodist_global_testing_nga_periodic_SOURCES = global/testing/nga-periodic.F $(gtsrc) nodist_global_testing_nga_scatter_SOURCES = global/testing/nga-scatter.F $(gtsrc) nodist_global_testing_nga_util_SOURCES = global/testing/nga-util.F $(gtsrc) nodist_global_testing_ngatest_SOURCES = global/testing/ngatest.F $(gtsrc) UNIT_TEST_EXTRA_SRC = global/testing/unit-tests/mock.c \ global/testing/unit-tests/mock.h global_testing_unit_tests_ga_abs_value_SOURCES = global/testing/unit-tests/ga_abs_value.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_acc_SOURCES = global/testing/unit-tests/ga_acc.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_add_SOURCES = global/testing/unit-tests/ga_add.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_add_constant_SOURCES = global/testing/unit-tests/ga_add_constant.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_add_constantpatch_SOURCES = global/testing/unit-tests/ga_add_constantpatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_add_diagonal_SOURCES = global/testing/unit-tests/ga_add_diagonal.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_add_patch_SOURCES = global/testing/unit-tests/ga_add_patch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_copy2_SOURCES = global/testing/unit-tests/ga_copy2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_copy3_SOURCES = global/testing/unit-tests/ga_copy3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_copy_SOURCES = global/testing/unit-tests/ga_copy.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_copypatch2_SOURCES = global/testing/unit-tests/ga_copypatch2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_copypatch_SOURCES = global/testing/unit-tests/ga_copypatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create1_SOURCES = global/testing/unit-tests/ga_create1.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create2_SOURCES = global/testing/unit-tests/ga_create2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create3_SOURCES = global/testing/unit-tests/ga_create3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create_SOURCES = global/testing/unit-tests/ga_create.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create_handle_SOURCES = global/testing/unit-tests/ga_create_handle.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create_irreg2_SOURCES = global/testing/unit-tests/ga_create_irreg2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create_irreg3_SOURCES = global/testing/unit-tests/ga_create_irreg3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_create_irreg_SOURCES = global/testing/unit-tests/ga_create_irreg.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_destroy_SOURCES = global/testing/unit-tests/ga_destroy.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_dgop_SOURCES = global/testing/unit-tests/ga_dgop.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_dot_SOURCES = global/testing/unit-tests/ga_dot.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_duplicate_SOURCES = global/testing/unit-tests/ga_duplicate.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_divide_SOURCES = global/testing/unit-tests/ga_elem_divide.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_dividepatch_SOURCES = global/testing/unit-tests/ga_elem_dividepatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_maximum_SOURCES = global/testing/unit-tests/ga_elem_maximum.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_maximumpatch_SOURCES = global/testing/unit-tests/ga_elem_maximumpatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_minimum_SOURCES = global/testing/unit-tests/ga_elem_minimum.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_minimumpatch_SOURCES = global/testing/unit-tests/ga_elem_minimumpatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_multiply_SOURCES = global/testing/unit-tests/ga_elem_multiply.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_elem_multiplypatch_SOURCES = global/testing/unit-tests/ga_elem_multiplypatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_fill_SOURCES = global/testing/unit-tests/ga_fill.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_fillpatch1_SOURCES = global/testing/unit-tests/ga_fillpatch1.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_fillpatch_SOURCES = global/testing/unit-tests/ga_fillpatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_gather2_SOURCES = global/testing/unit-tests/ga_gather2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_gather3_SOURCES = global/testing/unit-tests/ga_gather3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_gather_SOURCES = global/testing/unit-tests/ga_gather.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_get_blockinfo_SOURCES = global/testing/unit-tests/ga_get_blockinfo.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_get_SOURCES = global/testing/unit-tests/ga_get.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_get_diagonal_SOURCES = global/testing/unit-tests/ga_get_diagonal.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_igop2_SOURCES = global/testing/unit-tests/ga_igop2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_igop_SOURCES = global/testing/unit-tests/ga_igop.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_inquire_SOURCES = global/testing/unit-tests/ga_inquire.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_intialize_SOURCES = global/testing/unit-tests/ga_intialize.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_lgop_SOURCES = global/testing/unit-tests/ga_lgop.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_median_SOURCES = global/testing/unit-tests/ga_median.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_ndim2_SOURCES = global/testing/unit-tests/ga_ndim2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_ndim_SOURCES = global/testing/unit-tests/ga_ndim.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_nnodes_SOURCES = global/testing/unit-tests/ga_nnodes.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_nodeid_SOURCES = global/testing/unit-tests/ga_nodeid.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_create2_SOURCES = global/testing/unit-tests/ga_pgroup_create2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_create3_SOURCES = global/testing/unit-tests/ga_pgroup_create3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_create4_SOURCES = global/testing/unit-tests/ga_pgroup_create4.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_create5_SOURCES = global/testing/unit-tests/ga_pgroup_create5.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_create_SOURCES = global/testing/unit-tests/ga_pgroup_create.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_destroy2_SOURCES = global/testing/unit-tests/ga_pgroup_destroy2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_destroy_SOURCES = global/testing/unit-tests/ga_pgroup_destroy.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_nnodes_nodeid_SOURCES = global/testing/unit-tests/ga_pgroup_nnodes_nodeid.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_pgroup_setdefault_SOURCES = global/testing/unit-tests/ga_pgroup_setdefault.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_put2_SOURCES = global/testing/unit-tests/ga_put2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_put_SOURCES = global/testing/unit-tests/ga_put.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scale2_SOURCES = global/testing/unit-tests/ga_scale2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scale_SOURCES = global/testing/unit-tests/ga_scale.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scale_cols_SOURCES = global/testing/unit-tests/ga_scale_cols.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scale_patch_SOURCES = global/testing/unit-tests/ga_scale_patch.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scale_rows_SOURCES = global/testing/unit-tests/ga_scale_rows.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_scatter_SOURCES = global/testing/unit-tests/ga_scatter.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_set_data_SOURCES = global/testing/unit-tests/ga_set_data.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_set_diagonal_SOURCES = global/testing/unit-tests/ga_set_diagonal.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_set_restricted_SOURCES = global/testing/unit-tests/ga_set_restricted.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_solve_SOURCES = global/testing/unit-tests/ga_solve.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_sync_SOURCES = global/testing/unit-tests/ga_sync.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_transpose2_SOURCES = global/testing/unit-tests/ga_transpose2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_transpose3_SOURCES = global/testing/unit-tests/ga_transpose3.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_transpose_SOURCES = global/testing/unit-tests/ga_transpose.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_zero_SOURCES = global/testing/unit-tests/ga_zero.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_zerodiagonal_SOURCES = global/testing/unit-tests/ga_zerodiagonal.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_zeropatch2_SOURCES = global/testing/unit-tests/ga_zeropatch2.c $(UNIT_TEST_EXTRA_SRC) global_testing_unit_tests_ga_zeropatch_SOURCES = global/testing/unit-tests/ga_zeropatch.c $(UNIT_TEST_EXTRA_SRC) global_testing_bin_LDFLAGS = $(FLDFLAGS) global_testing_blktest_LDFLAGS = $(FLDFLAGS) global_testing_d2test_LDFLAGS = $(FLDFLAGS) global_testing_field_test_LDFLAGS = $(FLDFLAGS) global_testing_g2test_LDFLAGS = $(FLDFLAGS) global_testing_g3test_LDFLAGS = $(FLDFLAGS) global_testing_ga_shift_LDFLAGS = $(FLDFLAGS) global_testing_ghosts_LDFLAGS = $(FLDFLAGS) global_testing_jacobi_LDFLAGS = $(FLDFLAGS) global_testing_mir_perf2_LDFLAGS = $(FLDFLAGS) global_testing_mmatrix_LDFLAGS = $(FLDFLAGS) global_testing_mulmatpatch_LDFLAGS = $(FLDFLAGS) global_testing_nb2test_LDFLAGS = $(FLDFLAGS) global_testing_ndim_LDFLAGS = $(FLDFLAGS) global_testing_nga_onesided_LDFLAGS = $(FLDFLAGS) global_testing_nga_patch_LDFLAGS = $(FLDFLAGS) global_testing_nga_periodic_LDFLAGS = $(FLDFLAGS) global_testing_nga_scatter_LDFLAGS = $(FLDFLAGS) global_testing_ngatest_LDFLAGS = $(FLDFLAGS) global_testing_nga_util_LDFLAGS = $(FLDFLAGS) global_testing_patch_enumf_LDFLAGS = $(FLDFLAGS) global_testing_patch_LDFLAGS = $(FLDFLAGS) global_testing_patch2_LDFLAGS = $(FLDFLAGS) global_testing_perf_LDFLAGS = $(FLDFLAGS) global_testing_perfmod_LDFLAGS = $(FLDFLAGS) global_testing_perform_LDFLAGS = $(FLDFLAGS) global_testing_pg2test_LDFLAGS = $(FLDFLAGS) global_testing_pg2testmatmult_LDFLAGS = $(FLDFLAGS) global_testing_pgtest_LDFLAGS = $(FLDFLAGS) global_testing_pgtestmatmult_LDFLAGS = $(FLDFLAGS) global_testing_random_LDFLAGS = $(FLDFLAGS) global_testing_scan_LDFLAGS = $(FLDFLAGS) global_testing_simple_groups_LDFLAGS = $(FLDFLAGS) global_testing_simple_groups_comm_LDFLAGS = $(FLDFLAGS) global_testing_sparse_LDFLAGS = $(FLDFLAGS) global_testing_sprsmatmult_LDFLAGS = $(FLDFLAGS) global_testing_stride_LDFLAGS = $(FLDFLAGS) global_testing_testeig_LDFLAGS = $(FLDFLAGS) global_testing_test_LDFLAGS = $(FLDFLAGS) global_testing_test_mirrored_LDFLAGS = $(FLDFLAGS) global_testing_testmatmult_LDFLAGS = $(FLDFLAGS) global_testing_testsolve_LDFLAGS = $(FLDFLAGS) global_testing_testspd_LDFLAGS = $(FLDFLAGS) global_testing_types_test_LDFLAGS = $(FLDFLAGS) nodist_EXTRA_global_testing_big_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_elempatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_ga_lu_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_ga_mpi_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_gatscat_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_getmem_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_ipc_clean_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_lock_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_mtest_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_mulmatpatchc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_normc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_ntestc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_ntestfc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_packc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_patch_enumc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_perf2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_print_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_scan_addc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_scan_copyc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_simple_groups_commc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_testc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_testmatmultc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_testmult_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_testmultrect_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unpackc_SOURCES = $(MAYBE_DUMMY_F_LINK) global_testing_test_mirrored_CPPFLAGS = $(AM_CPPFLAGS) -DMIRROR=1 nodist_EXTRA_global_testing_unit_tests_ga_abs_value_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_acc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_add_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_add_constant_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_add_constantpatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_add_diagonal_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_add_patch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_copy2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_copy3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_copy_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_copypatch2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_copypatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create1_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create_handle_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create_irreg2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create_irreg3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_create_irreg_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_destroy_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_dgop_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_dot_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_duplicate_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_divide_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_dividepatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_maximum_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_maximumpatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_minimum_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_minimumpatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_multiply_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_elem_multiplypatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_fill_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_fillpatch1_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_fillpatch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_gather2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_gather3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_gather_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_get_blockinfo_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_get_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_get_diagonal_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_igop2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_igop_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_inquire_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_intialize_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_lgop_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_median_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_ndim2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_ndim_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_nnodes_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_nodeid_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create4_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create5_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_create_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_destroy2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_destroy_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_nnodes_nodeid_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_pgroup_setdefault_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_put2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_put_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scale2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scale_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scale_cols_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scale_patch_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scale_rows_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_scatter_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_set_data_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_set_diagonal_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_set_restricted_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_solve_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_sync_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_transpose2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_transpose3_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_transpose_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_zero_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_zerodiagonal_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_zeropatch2_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_global_testing_unit_tests_ga_zeropatch_SOURCES = $(MAYBE_DUMMY_F_LINK) #GLOBAL_PARALLEL_TESTS += global/examples/conjugate_gradient/ga_cg$(EXEEXT) # needs input #GLOBAL_PARALLEL_TESTS += global/examples/md_cluster/grp_sim$(EXEEXT) # needs input #GLOBAL_PARALLEL_TESTS += global/examples/scf/scf$(EXEEXT) # needs input global_examples_boltzmann_boltz_SOURCES = \ global/examples/boltzmann/boltzmann.F \ global/examples/boltzmann/common \ global/examples/boltzmann/equil.F \ global/examples/boltzmann/get_patch.F \ global/examples/boltzmann/initpar.F \ global/examples/boltzmann/main.F \ global/examples/boltzmann/printdat.F \ global/examples/boltzmann/properties.F \ global/examples/boltzmann/setup.F \ global/examples/boltzmann/timestep.F \ global/examples/boltzmann/vorticity.F global_examples_boltzmann_boltz_LDFLAGS = $(FLDFLAGS) global_examples_boltzmann_boltz_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/global/examples/boltzmann global_examples_conjugate_gradient_ga_cg_SOURCES = \ global/examples/conjugate_gradient/computeloops.F \ global/examples/conjugate_gradient/finclude.h \ global/examples/conjugate_gradient/ga_cg.c \ global/examples/conjugate_gradient/matvecmul.c \ global/examples/conjugate_gradient/read_input.c global_examples_lennard_jones_lennard_SOURCES = \ global/examples/lennard-jones/lennard.c nodist_EXTRA_global_examples_lennard_jones_lennard_SOURCES = $(MAYBE_DUMMY_F_LINK) global_examples_md_cluster_grp_sim_SOURCES = \ global/examples/md_cluster/cell_list.F \ global/examples/md_cluster/cl_sim.F \ global/examples/md_cluster/cluster.F \ global/examples/md_cluster/common.fh \ global/examples/md_cluster/estats.F \ global/examples/md_cluster/factor.F \ global/examples/md_cluster/force.F \ global/examples/md_cluster/gather.F \ global/examples/md_cluster/grp_sim.F \ global/examples/md_cluster/hash.F \ global/examples/md_cluster/heapsort.F \ global/examples/md_cluster/kin.F \ global/examples/md_cluster/mdinit.F \ global/examples/md_cluster/mdout.F \ global/examples/md_cluster/mdstep.F \ global/examples/md_cluster/newcfg.F \ global/examples/md_cluster/nextc.F \ global/examples/md_cluster/pairs.F \ global/examples/md_cluster/ran3.F \ global/examples/md_cluster/rdpar.F \ global/examples/md_cluster/scatter.F \ global/examples/md_cluster/shuffle.F \ global/examples/md_cluster/sort.F \ global/examples/md_cluster/tstats.F \ global/examples/md_cluster/update.F global_examples_md_cluster_grp_sim_LDFLAGS = $(FLDFLAGS) global_examples_scf_scf_SOURCES = \ global/examples/scf/cscf.h \ global/examples/scf/input.F \ global/examples/scf/integ.F \ global/examples/scf/output.F \ global/examples/scf/scf.F \ global/examples/scf/timer.F global_examples_scf_scf_LDFLAGS = $(FLDFLAGS) @ENABLE_XREGION_TRUE@@NO_X_FALSE@global_X_xregion_SOURCES = \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_colormap.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_dialog.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_display.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_fileio.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_main.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_overview.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_pixregion.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_scrollbars.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_util.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_view.c \ @ENABLE_XREGION_TRUE@@NO_X_FALSE@global/X/xregion_xcmap.c @ENABLE_XREGION_TRUE@@NO_X_FALSE@global_X_xregion_CPPFLAGS = $(X_CPPFLAGS) @ENABLE_XREGION_TRUE@@NO_X_FALSE@global_X_xregion_LDFLAGS = $(X_LDFLAGS) @ENABLE_XREGION_TRUE@@NO_X_FALSE@global_X_xregion_LDADD = -lXaw -lXmu -lXt -lX11 -lXau -lXdmcp -lXext global_trace_adjust_SOURCES = global/trace/adjust.c global_trace_adjust_LDFLAGS = global_trace_adjust_LDADD = global_trace_collisions_SOURCES = global/trace/collisions.c global_trace_collisions_LDFLAGS = global_trace_collisions_LDADD = PARIO_SERIAL_TESTS = PARIO_SERIAL_TESTS_XFAIL = #PARIO_PARALLEL_TESTS += pario/dra/dbg_read$(EXEEXT) # barely compiles, wrong test #PARIO_PARALLEL_TESTS += pario/dra/dbg_write$(EXEEXT) # barely compiles, wrong test #PARIO_PARALLEL_TESTS += pario/dra/dra2arviz$(EXEEXT) # not a test? PARIO_PARALLEL_TESTS = pario/dra/bign$(EXEEXT) \ pario/dra/ntestc$(EXEEXT) pario/dra/perfn$(EXEEXT) \ pario/dra/rate$(EXEEXT) PARIO_PARALLEL_TESTS_XFAIL = PARIO_TESTS = $(PARIO_SERIAL_TESTS) $(PARIO_PARALLEL_TESTS) PARIO_TESTS_XFAIL = $(PARIO_SERIAL_TESTS_XFAIL) $(PARIO_PARALLEL_TESTS_XFAIL) dtsrc = pario/dra/ffflush.F pario/dra/util.c pario_dra_big_SOURCES = pario/dra/big.F $(dtsrc) pario_dra_bign_SOURCES = pario/dra/bign.c pario_dra_dbg_read_SOURCES = pario/dra/dbg_read.c pario_dra_dbg_write_SOURCES = pario/dra/dbg_write.c pario_dra_dra2arviz_SOURCES = pario/dra/dra2arviz.c pario_dra_dra_mxm_SOURCES = pario/dra/dra_mxm.F $(dtsrc) pario_dra_ntest_SOURCES = pario/dra/ntest.F $(dtsrc) pario_dra_ntestc_SOURCES = pario/dra/ntestc.c pario_dra_perf_SOURCES = pario/dra/perf.F $(dtsrc) pario_dra_perf2_SOURCES = pario/dra/perf2.F $(dtsrc) pario_dra_perf3_SOURCES = pario/dra/perf3.F $(dtsrc) pario_dra_perfn_SOURCES = pario/dra/perfn.c pario_dra_rate_SOURCES = pario/dra/rate.c pario_dra_test_SOURCES = pario/dra/test.F $(dtsrc) pario_dra_test_mxm_SOURCES = pario/dra/test_mxm.F $(dtsrc) pario_dra_time_mxm_SOURCES = pario/dra/time_mxm.F $(dtsrc) pario_eaf_test_SOURCES = pario/eaf/test.F $(dtsrc) pario_sf_test_SOURCES = pario/sf/test.F $(dtsrc) nodist_EXTRA_pario_dra_bign_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_dbg_read_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_dbg_write_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_dra2arviz_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_ntestc_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_perfn_SOURCES = $(MAYBE_DUMMY_F_LINK) nodist_EXTRA_pario_dra_rate_SOURCES = $(MAYBE_DUMMY_F_LINK) pario_dra_big_LDFLAGS = $(FLDFLAGS) pario_dra_dra_mxm_LDFLAGS = $(FLDFLAGS) pario_dra_ntest_LDFLAGS = $(FLDFLAGS) pario_dra_perf_LDFLAGS = $(FLDFLAGS) pario_dra_perf2_LDFLAGS = $(FLDFLAGS) pario_dra_perf3_LDFLAGS = $(FLDFLAGS) pario_dra_test_LDFLAGS = $(FLDFLAGS) pario_dra_test_mxm_LDFLAGS = $(FLDFLAGS) pario_dra_time_mxm_LDFLAGS = $(FLDFLAGS) pario_eaf_test_LDFLAGS = $(FLDFLAGS) pario_sf_test_LDFLAGS = $(FLDFLAGS) @CXX_BINDINGS_TRUE@libga___la_SOURCES = ga++/src/GAServices.cc \ @CXX_BINDINGS_TRUE@ ga++/src/GlobalArray.cc ga++/src/PGroup.cc \ @CXX_BINDINGS_TRUE@ ga++/src/init_term.cc ga++/src/overload.cc \ @CXX_BINDINGS_TRUE@ ga++/src/services.cc @CXX_BINDINGS_TRUE@CXX_SERIAL_TESTS = @CXX_BINDINGS_TRUE@CXX_SERIAL_TESTS_XFAIL = @CXX_BINDINGS_TRUE@CXX_PARALLEL_TESTS = \ @CXX_BINDINGS_TRUE@ ga++/testing/elempatch$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/mtest$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/ntestc$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/testc$(EXEEXT) \ @CXX_BINDINGS_TRUE@ ga++/testing/testmult$(EXEEXT) @CXX_BINDINGS_TRUE@CXX_PARALLEL_TESTS_XFAIL = @CXX_BINDINGS_TRUE@CXX_TESTS = $(CXX_SERIAL_TESTS) $(CXX_PARALLEL_TESTS) @CXX_BINDINGS_TRUE@CXX_TESTS_XFAIL = $(CXX_SERIAL_TESTS_XFAIL) $(CXX_PARALLEL_TESTS_XFAIL) @CXX_BINDINGS_TRUE@ga___testing_elempatch_SOURCES = ga++/testing/elempatch.cc @CXX_BINDINGS_TRUE@ga___testing_mtest_SOURCES = ga++/testing/mtest.cc @CXX_BINDINGS_TRUE@ga___testing_ntestc_SOURCES = ga++/testing/ntestc.cc \ @CXX_BINDINGS_TRUE@ ga++/testing/util.c @CXX_BINDINGS_TRUE@ga___testing_testc_SOURCES = ga++/testing/testc.cc @CXX_BINDINGS_TRUE@ga___testing_testmult_SOURCES = ga++/testing/testmult.cc @CXX_BINDINGS_TRUE@ga___testing_elempatch_LDADD = libga++.la $(LDADD) $(MAYBE_FLIBS) @CXX_BINDINGS_TRUE@ga___testing_mtest_LDADD = libga++.la $(LDADD) $(MAYBE_FLIBS) @CXX_BINDINGS_TRUE@ga___testing_ntestc_LDADD = libga++.la $(LDADD) $(MAYBE_FLIBS) @CXX_BINDINGS_TRUE@ga___testing_testc_LDADD = libga++.la $(LDADD) $(MAYBE_FLIBS) @CXX_BINDINGS_TRUE@ga___testing_testmult_LDADD = libga++.la $(LDADD) $(MAYBE_FLIBS) @CXX_BINDINGS_TRUE@ga___testing_elempatch_LDFLAGS = $(FLDFLAGS) @CXX_BINDINGS_TRUE@ga___testing_mtest_LDFLAGS = $(FLDFLAGS) @CXX_BINDINGS_TRUE@ga___testing_ntestc_LDFLAGS = $(FLDFLAGS) @CXX_BINDINGS_TRUE@ga___testing_testc_LDFLAGS = $(FLDFLAGS) @CXX_BINDINGS_TRUE@ga___testing_testmult_LDFLAGS = $(FLDFLAGS) ############################################################################## # gparrays # @ENABLE_GPARRAYS_TRUE@GPPAPI_H = $(top_srcdir)/gparrays/src/gp-papi.h @ENABLE_GPARRAYS_TRUE@gparrays_testing_test_SOURCES = gparrays/testing/test.F @ENABLE_GPARRAYS_TRUE@gparrays_testing_testc_SOURCES = gparrays/testing/testc.c @ENABLE_GPARRAYS_TRUE@gparrays_testing_transpose_SOURCES = gparrays/testing/transpose.c @ENABLE_GPARRAYS_TRUE@nodist_EXTRA_gparrays_testing_testc_SOURCES = $(MAYBE_DUMMY_F_LINK) @ENABLE_GPARRAYS_TRUE@nodist_EXTRA_gparrays_testing_transpose_SOURCES = $(MAYBE_DUMMY_F_LINK) @ENABLE_GPARRAYS_TRUE@gparrays_testing_test_LDFLAGS = $(FLDFLAGS) GAF2C_SERIAL_TESTS = $(am__append_52) GAF2C_SERIAL_TESTS_XFAIL = GAF2C_PARALLEL_TESTS = GAF2C_PARALLEL_TESTS_XFAIL = GAF2C_TESTS = $(GAF2C_SERIAL_TESTS) $(GAF2C_PARALLEL_TESTS) GAF2C_TESTS_XFAIL = $(GAF2C_SERIAL_TESTS_XFAIL) $(GAF2C_PARALLEL_TESTS_XFAIL) gaf2c_testarg_SOURCES = gaf2c/testarg.c gaf2c/testargf.f gaf2c_testarg_LDFLAGS = $(FLDFLAGS) #TCGMSG_PARALLEL_TESTS += tcgmsg/tests/test_asyn$(EXEEXT) # useless test #TCGMSG_PARALLEL_TESTS += tcgmsg/tests/test$(EXEEXT) # requires user input #if ENABLE_F77 #TCGMSG_PARALLEL_TESTS += tcgmsg/tests/testf$(EXEEXT) #endif @MSG_COMMS_MPI_TRUE@tcgmsg_tests_test_asyn_SOURCES = tcgmsg/tests/test_asyn.c @MSG_COMMS_MPI_TRUE@tcgmsg_tests_testf_SOURCES = tcgmsg/tests/testf.F @MSG_COMMS_MPI_TRUE@tcgmsg_tests_test_SOURCES = tcgmsg/tests/test.c @MSG_COMMS_MPI_TRUE@tcgmsg_tests_testf_LDFLAGS = $(FLDFLAGS) @MSG_COMMS_MPI_TRUE@nodist_EXTRA_tcgmsg_tests_test_asyn_SOURCES = $(MAYBE_DUMMY_F_LINK) @MSG_COMMS_MPI_TRUE@nodist_EXTRA_tcgmsg_tests_test_SOURCES = $(MAYBE_DUMMY_F_LINK) ############################################################################## # armci @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_TRUE@MAYBE_COMEX = comex @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_FALSE@MAYBE_ARMCI = armci SUBDIRS = $(MAYBE_COMEX) $(MAYBE_ARMCI) . GA_RECURSIVE_TARGETS = checkprogs-recursive # END COPY # support verbose/silent make rules for additional programs # m4 M4_V = $(M4__v_$(V)) M4__v_ = $(M4__v_$(AM_DEFAULT_VERBOSITY)) M4__v_0 = @echo " M4 " $@; # sed SED_V = $(SED__v_$(V)) SED__v_ = $(SED__v_$(AM_DEFAULT_VERBOSITY)) SED__v_0 = @echo " SED " $@; # python PYTHON_V = $(PYTHON__v_$(V)) PYTHON__v_ = $(PYTHON__v_$(AM_DEFAULT_VERBOSITY)) PYTHON__v_0 = @echo " PYTHON" $@; # cp CP = cp CP_V = $(CP__v_$(V)) CP__v_ = $(CP__v_$(AM_DEFAULT_VERBOSITY)) CP__v_0 = @echo " CP " $@; @MSG_COMMS_TCGMSG4_TRUE@MAYBE_PFILES = pfiles ############################################################################## # test suite # # Tests were broken up into groups depending on the piece of the distribution # which they tested. # # Some tests were commented out either because they required an input file or # they were failing for unknown reasons and we didn't want to further debug. # Some tests were based on old versions of GA which no longer applied but we # kept anyway (see pario). # # We leave pario tests out of the main set of tests because not all systems # can handle the disk requirements. # SERIAL_TESTS = $(MA_SERIAL_TESTS) $(GLOBAL_SERIAL_TESTS) \ $(CXX_SERIAL_TESTS) SERIAL_TESTS_XFAIL = $(MA_SERIAL_TESTS_XFAIL) \ $(GLOBAL_SERIAL_TESTS_XFAIL) $(CXX_SERIAL_TESTS_XFAIL) PARALLEL_TESTS = $(MA_PARALLEL_TESTS) $(GLOBAL_PARALLEL_TESTS) \ $(CXX_PARALLEL_TESTS) PARALLEL_TESTS_XFAIL = $(MA_PARALLEL_TESTS_XFAIL) \ $(GLOBAL_PARALLEL_TESTS_XFAIL) $(CXX_PARALLEL_TESTS_XFAIL) @CROSS_COMPILING_FALSE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@LOG_COMPILER = \ @CROSS_COMPILING_FALSE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@maybe_mpiexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else if echo "$(MPIEXEC)" | $(GREP) "%NP%" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; else echo "$(MPIEXEC)"; fi; fi`; eval $$maybe_mpiexec @MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_TRUE@LOG_COMPILER = tst="$$dir$$f -np $(NPROCS)"; eval @MSG_COMMS_TCGMSG4_TRUE@LOG_COMPILER = \ @MSG_COMMS_TCGMSG4_TRUE@maybe_tcgexec=`if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo ""; else echo "$(TCGEXEC)"; fi`; eval $$maybe_tcgexec @CROSS_COMPILING_TRUE@@MSG_COMMS_TCGMSG4_FALSE@@MSG_COMMS_TCGMSG5_FALSE@maybe_mpiexec = `if echo "$(SERIAL_TESTS)" | $(GREP) "$$p" > /dev/null; then echo "$(MPIEXEC)" | $(SED) 's/%NP%/1/'; else echo "$(MPIEXEC)" | $(SED) 's/%NP%/$(NPROCS)/'; fi`; eval $$maybe_mpiexec all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .F .c .cc .f .html .lo .log .m4 .o .obj .test .test$(EXEEXT) am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 gaf2c/farg.h: $(top_builddir)/config.status $(top_srcdir)/gaf2c/farg.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ gaf2c/typesf2c.h: $(top_builddir)/config.status $(top_srcdir)/gaf2c/typesf2c.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ global/src/global.fh: $(top_builddir)/config.status $(top_srcdir)/global/src/global.fh.in cd $(top_builddir) && $(SHELL) ./config.status $@ ma/mafdecls.fh: $(top_builddir)/config.status $(top_srcdir)/ma/mafdecls.fh.in cd $(top_builddir) && $(SHELL) ./config.status $@ ma/matypes.h: $(top_builddir)/config.status $(top_srcdir)/ma/matypes.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ tools/ga-config: $(top_builddir)/config.status $(top_srcdir)/tools/ga-config.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-checkLTLIBRARIES: -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) @list='$(check_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done ga++/src/$(am__dirstamp): @$(MKDIR_P) ga++/src @: > ga++/src/$(am__dirstamp) ga++/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ga++/src/$(DEPDIR) @: > ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/GAServices.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/GlobalArray.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/PGroup.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/init_term.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/overload.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) ga++/src/services.lo: ga++/src/$(am__dirstamp) \ ga++/src/$(DEPDIR)/$(am__dirstamp) libga++.la: $(libga___la_OBJECTS) $(libga___la_DEPENDENCIES) $(EXTRA_libga___la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(am_libga___la_rpath) $(libga___la_OBJECTS) $(libga___la_LIBADD) $(LIBS) compat/$(am__dirstamp): @$(MKDIR_P) compat @: > compat/$(am__dirstamp) compat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) compat/$(DEPDIR) @: > compat/$(DEPDIR)/$(am__dirstamp) compat/random.lo: compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) ma/$(am__dirstamp): @$(MKDIR_P) ma @: > ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ma/$(DEPDIR) @: > ma/$(DEPDIR)/$(am__dirstamp) ma/error.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/f2c.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/ma.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/string-util.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/table.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/maf.lo: ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/$(am__dirstamp): @$(MKDIR_P) LinAlg/lapack+blas @: > LinAlg/lapack+blas/$(am__dirstamp) LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) LinAlg/lapack+blas/$(DEPDIR) @: > LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_cgemm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_daxpy.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dcabs1.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dcopy.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_ddot.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dgemm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dgemv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dger.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dgetf2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dgetrf.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dgetrs.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_disnan.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlacpy.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlae2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlaev2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlaisnan.lo: \ LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlamch.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlanst.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlansy.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlapy2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlarfb.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlarf.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlarfg.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlarft.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlartg.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlascl.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlaset.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlasr.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlasrt.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlassq.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlaswp.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dlatrd.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dnrm2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dorg2l.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dorg2r.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dorgql.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dorgqr.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dorgtr.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dpotf2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dpotrf.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dscal.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsteqr.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsterf.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dswap.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsyev.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsygs2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsygst.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsygv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsymm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsymv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsyr2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsyr2k.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsyrk.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsytd2.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dsytrd.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dtrmm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dtrmv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dtrsm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_dtrsv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_idamax.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_ieeeck.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_iladlc.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_iladlr.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_ilaenv.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_iparmq.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_lsame.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_sgemm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_xerbla.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_zaxpy.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/gal_zgemm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) LinAlg/lapack+blas/xgemm.lo: LinAlg/lapack+blas/$(am__dirstamp) \ LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) global/src/$(am__dirstamp): @$(MKDIR_P) global/src @: > global/src/$(am__dirstamp) global/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/src/$(DEPDIR) @: > global/src/$(DEPDIR)/$(am__dirstamp) global/src/base.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/capi.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/collect.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/datatypes.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/decomp.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/DP.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/elem_alg.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/fapi.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_diag_seqc.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_malloc.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_solve_seq.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_symmetr.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_trace.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ghosts.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/global.nalg.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/global.npatch.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/global.periodic.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/global.util.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/hsort.scat.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/matmul.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/matrix.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/nbutil.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/onesided.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/peigstubs.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/sclstubs.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/select.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/sparse.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/complex.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_diag_seq.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/rsg.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_dgemmf.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_diag.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/scalapack.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) global/src/ga_ckpt.lo: global/src/$(am__dirstamp) \ global/src/$(DEPDIR)/$(am__dirstamp) pario/dra/$(am__dirstamp): @$(MKDIR_P) pario/dra @: > pario/dra/$(am__dirstamp) pario/dra/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pario/dra/$(DEPDIR) @: > pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/buffers.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/capi.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/disk.arrays.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/disk.param.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/env.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/fortran.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/patch.util.lo: pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/eaf/$(am__dirstamp): @$(MKDIR_P) pario/eaf @: > pario/eaf/$(am__dirstamp) pario/eaf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pario/eaf/$(DEPDIR) @: > pario/eaf/$(DEPDIR)/$(am__dirstamp) pario/eaf/eaf.lo: pario/eaf/$(am__dirstamp) \ pario/eaf/$(DEPDIR)/$(am__dirstamp) pario/eaf/eaf_f2c.lo: pario/eaf/$(am__dirstamp) \ pario/eaf/$(DEPDIR)/$(am__dirstamp) pario/elio/$(am__dirstamp): @$(MKDIR_P) pario/elio @: > pario/elio/$(am__dirstamp) pario/elio/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pario/elio/$(DEPDIR) @: > pario/elio/$(DEPDIR)/$(am__dirstamp) pario/elio/elio.lo: pario/elio/$(am__dirstamp) \ pario/elio/$(DEPDIR)/$(am__dirstamp) pario/elio/stat.lo: pario/elio/$(am__dirstamp) \ pario/elio/$(DEPDIR)/$(am__dirstamp) pario/sf/$(am__dirstamp): @$(MKDIR_P) pario/sf @: > pario/sf/$(am__dirstamp) pario/sf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) pario/sf/$(DEPDIR) @: > pario/sf/$(DEPDIR)/$(am__dirstamp) pario/sf/sf_capi.lo: pario/sf/$(am__dirstamp) \ pario/sf/$(DEPDIR)/$(am__dirstamp) pario/sf/sf_fortran.lo: pario/sf/$(am__dirstamp) \ pario/sf/$(DEPDIR)/$(am__dirstamp) pario/sf/shared.files.lo: pario/sf/$(am__dirstamp) \ pario/sf/$(DEPDIR)/$(am__dirstamp) gparrays/src/$(am__dirstamp): @$(MKDIR_P) gparrays/src @: > gparrays/src/$(am__dirstamp) gparrays/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gparrays/src/$(DEPDIR) @: > gparrays/src/$(DEPDIR)/$(am__dirstamp) gparrays/src/gpbase.lo: gparrays/src/$(am__dirstamp) \ gparrays/src/$(DEPDIR)/$(am__dirstamp) gparrays/src/gpcapi.lo: gparrays/src/$(am__dirstamp) \ gparrays/src/$(DEPDIR)/$(am__dirstamp) gparrays/src/gpfapi.lo: gparrays/src/$(am__dirstamp) \ gparrays/src/$(DEPDIR)/$(am__dirstamp) gparrays/src/gponesided.lo: gparrays/src/$(am__dirstamp) \ gparrays/src/$(DEPDIR)/$(am__dirstamp) gaf2c/$(am__dirstamp): @$(MKDIR_P) gaf2c @: > gaf2c/$(am__dirstamp) gaf2c/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gaf2c/$(DEPDIR) @: > gaf2c/$(DEPDIR)/$(am__dirstamp) gaf2c/gaf2c.lo: gaf2c/$(am__dirstamp) gaf2c/$(DEPDIR)/$(am__dirstamp) gaf2c/drand.lo: gaf2c/$(am__dirstamp) gaf2c/$(DEPDIR)/$(am__dirstamp) gaf2c/farg.lo: gaf2c/$(am__dirstamp) gaf2c/$(DEPDIR)/$(am__dirstamp) tcgmsg/$(am__dirstamp): @$(MKDIR_P) tcgmsg @: > tcgmsg/$(am__dirstamp) tcgmsg/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tcgmsg/$(DEPDIR) @: > tcgmsg/$(DEPDIR)/$(am__dirstamp) tcgmsg/capi.lo: tcgmsg/$(am__dirstamp) \ tcgmsg/$(DEPDIR)/$(am__dirstamp) tcgmsg/fapi.lo: tcgmsg/$(am__dirstamp) \ tcgmsg/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/$(am__dirstamp): @$(MKDIR_P) tcgmsg/tcgmsg-mpi @: > tcgmsg/tcgmsg-mpi/$(am__dirstamp) tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tcgmsg/tcgmsg-mpi/$(DEPDIR) @: > tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/checkbyte.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/clustercheck.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/collect.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/drand48.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/evlog.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/evon.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/llog.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/misc.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/niceftn.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/nxtval-armci.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/p2p.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/pbeginf.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/pfilecopy.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tcgmsg/tcgmsg-mpi/sizeof.lo: tcgmsg/tcgmsg-mpi/$(am__dirstamp) \ tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) tools/$(am__dirstamp): @$(MKDIR_P) tools @: > tools/$(am__dirstamp) tools/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tools/$(DEPDIR) @: > tools/$(DEPDIR)/$(am__dirstamp) tools/ga-wapi.lo: tools/$(am__dirstamp) \ tools/$(DEPDIR)/$(am__dirstamp) tools/gp-wapi.lo: tools/$(am__dirstamp) \ tools/$(DEPDIR)/$(am__dirstamp) libga.la: $(libga_la_OBJECTS) $(libga_la_DEPENDENCIES) $(EXTRA_libga_la_DEPENDENCIES) $(AM_V_F77LD)$(F77LINK) -rpath $(libdir) $(libga_la_OBJECTS) $(libga_la_LIBADD) $(LIBS) libwapi.la: $(libwapi_la_OBJECTS) $(libwapi_la_DEPENDENCIES) $(EXTRA_libwapi_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libwapi_la_rpath) $(libwapi_la_OBJECTS) $(libwapi_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ga++/testing/$(am__dirstamp): @$(MKDIR_P) ga++/testing @: > ga++/testing/$(am__dirstamp) ga++/testing/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ga++/testing/$(DEPDIR) @: > ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/elempatch.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/elempatch$(EXEEXT): $(ga___testing_elempatch_OBJECTS) $(ga___testing_elempatch_DEPENDENCIES) $(EXTRA_ga___testing_elempatch_DEPENDENCIES) ga++/testing/$(am__dirstamp) @rm -f ga++/testing/elempatch$(EXEEXT) $(AM_V_CXXLD)$(ga___testing_elempatch_LINK) $(ga___testing_elempatch_OBJECTS) $(ga___testing_elempatch_LDADD) $(LIBS) ga++/testing/mtest.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/mtest$(EXEEXT): $(ga___testing_mtest_OBJECTS) $(ga___testing_mtest_DEPENDENCIES) $(EXTRA_ga___testing_mtest_DEPENDENCIES) ga++/testing/$(am__dirstamp) @rm -f ga++/testing/mtest$(EXEEXT) $(AM_V_CXXLD)$(ga___testing_mtest_LINK) $(ga___testing_mtest_OBJECTS) $(ga___testing_mtest_LDADD) $(LIBS) ga++/testing/ntestc.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/util.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/ntestc$(EXEEXT): $(ga___testing_ntestc_OBJECTS) $(ga___testing_ntestc_DEPENDENCIES) $(EXTRA_ga___testing_ntestc_DEPENDENCIES) ga++/testing/$(am__dirstamp) @rm -f ga++/testing/ntestc$(EXEEXT) $(AM_V_CXXLD)$(ga___testing_ntestc_LINK) $(ga___testing_ntestc_OBJECTS) $(ga___testing_ntestc_LDADD) $(LIBS) ga++/testing/testc.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/testc$(EXEEXT): $(ga___testing_testc_OBJECTS) $(ga___testing_testc_DEPENDENCIES) $(EXTRA_ga___testing_testc_DEPENDENCIES) ga++/testing/$(am__dirstamp) @rm -f ga++/testing/testc$(EXEEXT) $(AM_V_CXXLD)$(ga___testing_testc_LINK) $(ga___testing_testc_OBJECTS) $(ga___testing_testc_LDADD) $(LIBS) ga++/testing/testmult.$(OBJEXT): ga++/testing/$(am__dirstamp) \ ga++/testing/$(DEPDIR)/$(am__dirstamp) ga++/testing/testmult$(EXEEXT): $(ga___testing_testmult_OBJECTS) $(ga___testing_testmult_DEPENDENCIES) $(EXTRA_ga___testing_testmult_DEPENDENCIES) ga++/testing/$(am__dirstamp) @rm -f ga++/testing/testmult$(EXEEXT) $(AM_V_CXXLD)$(ga___testing_testmult_LINK) $(ga___testing_testmult_OBJECTS) $(ga___testing_testmult_LDADD) $(LIBS) gaf2c/testarg.$(OBJEXT): gaf2c/$(am__dirstamp) \ gaf2c/$(DEPDIR)/$(am__dirstamp) gaf2c/testargf.$(OBJEXT): gaf2c/$(am__dirstamp) \ gaf2c/$(DEPDIR)/$(am__dirstamp) gaf2c/testarg$(EXEEXT): $(gaf2c_testarg_OBJECTS) $(gaf2c_testarg_DEPENDENCIES) $(EXTRA_gaf2c_testarg_DEPENDENCIES) gaf2c/$(am__dirstamp) @rm -f gaf2c/testarg$(EXEEXT) $(AM_V_F77LD)$(gaf2c_testarg_LINK) $(gaf2c_testarg_OBJECTS) $(gaf2c_testarg_LDADD) $(LIBS) global/X/$(am__dirstamp): @$(MKDIR_P) global/X @: > global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/X/$(DEPDIR) @: > global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_colormap.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_dialog.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_display.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_fileio.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_main.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_overview.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_pixregion.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_scrollbars.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_util.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_view.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/global_X_xregion-xregion_xcmap.$(OBJEXT): \ global/X/$(am__dirstamp) global/X/$(DEPDIR)/$(am__dirstamp) global/X/xregion$(EXEEXT): $(global_X_xregion_OBJECTS) $(global_X_xregion_DEPENDENCIES) $(EXTRA_global_X_xregion_DEPENDENCIES) global/X/$(am__dirstamp) @rm -f global/X/xregion$(EXEEXT) $(AM_V_CCLD)$(global_X_xregion_LINK) $(global_X_xregion_OBJECTS) $(global_X_xregion_LDADD) $(LIBS) global/examples/boltzmann/$(am__dirstamp): @$(MKDIR_P) global/examples/boltzmann @: > global/examples/boltzmann/$(am__dirstamp) global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/examples/boltzmann/$(DEPDIR) @: > global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-equil.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-main.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-properties.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-setup.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.$(OBJEXT): \ global/examples/boltzmann/$(am__dirstamp) \ global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) global/examples/boltzmann/boltz$(EXEEXT): $(global_examples_boltzmann_boltz_OBJECTS) $(global_examples_boltzmann_boltz_DEPENDENCIES) $(EXTRA_global_examples_boltzmann_boltz_DEPENDENCIES) global/examples/boltzmann/$(am__dirstamp) @rm -f global/examples/boltzmann/boltz$(EXEEXT) $(AM_V_F77LD)$(global_examples_boltzmann_boltz_LINK) $(global_examples_boltzmann_boltz_OBJECTS) $(global_examples_boltzmann_boltz_LDADD) $(LIBS) global/examples/conjugate_gradient/$(am__dirstamp): @$(MKDIR_P) global/examples/conjugate_gradient @: > global/examples/conjugate_gradient/$(am__dirstamp) global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/examples/conjugate_gradient/$(DEPDIR) @: > global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) global/examples/conjugate_gradient/computeloops.$(OBJEXT): \ global/examples/conjugate_gradient/$(am__dirstamp) \ global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) global/examples/conjugate_gradient/ga_cg.$(OBJEXT): \ global/examples/conjugate_gradient/$(am__dirstamp) \ global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) global/examples/conjugate_gradient/matvecmul.$(OBJEXT): \ global/examples/conjugate_gradient/$(am__dirstamp) \ global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) global/examples/conjugate_gradient/read_input.$(OBJEXT): \ global/examples/conjugate_gradient/$(am__dirstamp) \ global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) global/examples/conjugate_gradient/ga_cg$(EXEEXT): $(global_examples_conjugate_gradient_ga_cg_OBJECTS) $(global_examples_conjugate_gradient_ga_cg_DEPENDENCIES) $(EXTRA_global_examples_conjugate_gradient_ga_cg_DEPENDENCIES) global/examples/conjugate_gradient/$(am__dirstamp) @rm -f global/examples/conjugate_gradient/ga_cg$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_examples_conjugate_gradient_ga_cg_OBJECTS) $(global_examples_conjugate_gradient_ga_cg_LDADD) $(LIBS) global/examples/lennard-jones/$(am__dirstamp): @$(MKDIR_P) global/examples/lennard-jones @: > global/examples/lennard-jones/$(am__dirstamp) global/examples/lennard-jones/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/examples/lennard-jones/$(DEPDIR) @: > global/examples/lennard-jones/$(DEPDIR)/$(am__dirstamp) global/examples/lennard-jones/lennard.$(OBJEXT): \ global/examples/lennard-jones/$(am__dirstamp) \ global/examples/lennard-jones/$(DEPDIR)/$(am__dirstamp) global/examples/lennard-jones/lennard$(EXEEXT): $(global_examples_lennard_jones_lennard_OBJECTS) $(global_examples_lennard_jones_lennard_DEPENDENCIES) $(EXTRA_global_examples_lennard_jones_lennard_DEPENDENCIES) global/examples/lennard-jones/$(am__dirstamp) @rm -f global/examples/lennard-jones/lennard$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_examples_lennard_jones_lennard_OBJECTS) $(global_examples_lennard_jones_lennard_LDADD) $(LIBS) global/examples/md_cluster/$(am__dirstamp): @$(MKDIR_P) global/examples/md_cluster @: > global/examples/md_cluster/$(am__dirstamp) global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/examples/md_cluster/$(DEPDIR) @: > global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/cell_list.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/cl_sim.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/cluster.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/estats.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/factor.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/force.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/gather.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/grp_sim.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/hash.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/heapsort.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/kin.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/mdinit.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/mdout.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/mdstep.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/newcfg.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/nextc.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/pairs.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/ran3.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/rdpar.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/scatter.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/shuffle.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/sort.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/tstats.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/update.$(OBJEXT): \ global/examples/md_cluster/$(am__dirstamp) \ global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) global/examples/md_cluster/grp_sim$(EXEEXT): $(global_examples_md_cluster_grp_sim_OBJECTS) $(global_examples_md_cluster_grp_sim_DEPENDENCIES) $(EXTRA_global_examples_md_cluster_grp_sim_DEPENDENCIES) global/examples/md_cluster/$(am__dirstamp) @rm -f global/examples/md_cluster/grp_sim$(EXEEXT) $(AM_V_F77LD)$(global_examples_md_cluster_grp_sim_LINK) $(global_examples_md_cluster_grp_sim_OBJECTS) $(global_examples_md_cluster_grp_sim_LDADD) $(LIBS) global/examples/scf/$(am__dirstamp): @$(MKDIR_P) global/examples/scf @: > global/examples/scf/$(am__dirstamp) global/examples/scf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/examples/scf/$(DEPDIR) @: > global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/input.$(OBJEXT): \ global/examples/scf/$(am__dirstamp) \ global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/integ.$(OBJEXT): \ global/examples/scf/$(am__dirstamp) \ global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/output.$(OBJEXT): \ global/examples/scf/$(am__dirstamp) \ global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/scf.$(OBJEXT): \ global/examples/scf/$(am__dirstamp) \ global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/timer.$(OBJEXT): \ global/examples/scf/$(am__dirstamp) \ global/examples/scf/$(DEPDIR)/$(am__dirstamp) global/examples/scf/scf$(EXEEXT): $(global_examples_scf_scf_OBJECTS) $(global_examples_scf_scf_DEPENDENCIES) $(EXTRA_global_examples_scf_scf_DEPENDENCIES) global/examples/scf/$(am__dirstamp) @rm -f global/examples/scf/scf$(EXEEXT) $(AM_V_F77LD)$(global_examples_scf_scf_LINK) $(global_examples_scf_scf_OBJECTS) $(global_examples_scf_scf_LDADD) $(LIBS) global/testing/$(am__dirstamp): @$(MKDIR_P) global/testing @: > global/testing/$(am__dirstamp) global/testing/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/testing/$(DEPDIR) @: > global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/big.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/util.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ffflush.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testblas.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/big$(EXEEXT): $(global_testing_big_OBJECTS) $(global_testing_big_DEPENDENCIES) $(EXTRA_global_testing_big_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/big$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_big_OBJECTS) $(global_testing_big_LDADD) $(LIBS) global/testing/bin.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/bin$(EXEEXT): $(global_testing_bin_OBJECTS) $(global_testing_bin_DEPENDENCIES) $(EXTRA_global_testing_bin_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/bin$(EXEEXT) $(AM_V_F77LD)$(global_testing_bin_LINK) $(global_testing_bin_OBJECTS) $(global_testing_bin_LDADD) $(LIBS) global/testing/blktest.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/blktest$(EXEEXT): $(global_testing_blktest_OBJECTS) $(global_testing_blktest_DEPENDENCIES) $(EXTRA_global_testing_blktest_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/blktest$(EXEEXT) $(AM_V_F77LD)$(global_testing_blktest_LINK) $(global_testing_blktest_OBJECTS) $(global_testing_blktest_LDADD) $(LIBS) global/testing/d2test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/d2test$(EXEEXT): $(global_testing_d2test_OBJECTS) $(global_testing_d2test_DEPENDENCIES) $(EXTRA_global_testing_d2test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/d2test$(EXEEXT) $(AM_V_F77LD)$(global_testing_d2test_LINK) $(global_testing_d2test_OBJECTS) $(global_testing_d2test_LDADD) $(LIBS) global/testing/elempatch.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/elempatch$(EXEEXT): $(global_testing_elempatch_OBJECTS) $(global_testing_elempatch_DEPENDENCIES) $(EXTRA_global_testing_elempatch_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/elempatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_elempatch_OBJECTS) $(global_testing_elempatch_LDADD) $(LIBS) global/testing/field-test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/field_test$(EXEEXT): $(global_testing_field_test_OBJECTS) $(global_testing_field_test_DEPENDENCIES) $(EXTRA_global_testing_field_test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/field_test$(EXEEXT) $(AM_V_F77LD)$(global_testing_field_test_LINK) $(global_testing_field_test_OBJECTS) $(global_testing_field_test_LDADD) $(LIBS) global/testing/g2test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/g2test$(EXEEXT): $(global_testing_g2test_OBJECTS) $(global_testing_g2test_DEPENDENCIES) $(EXTRA_global_testing_g2test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/g2test$(EXEEXT) $(AM_V_F77LD)$(global_testing_g2test_LINK) $(global_testing_g2test_OBJECTS) $(global_testing_g2test_LDADD) $(LIBS) global/testing/g3test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/g3test$(EXEEXT): $(global_testing_g3test_OBJECTS) $(global_testing_g3test_DEPENDENCIES) $(EXTRA_global_testing_g3test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/g3test$(EXEEXT) $(AM_V_F77LD)$(global_testing_g3test_LINK) $(global_testing_g3test_OBJECTS) $(global_testing_g3test_LDADD) $(LIBS) global/testing/ga-mpi.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ga-mpi$(EXEEXT): $(global_testing_ga_mpi_OBJECTS) $(global_testing_ga_mpi_DEPENDENCIES) $(EXTRA_global_testing_ga_mpi_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ga-mpi$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_ga_mpi_OBJECTS) $(global_testing_ga_mpi_LDADD) $(LIBS) global/testing/ga_lu.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ga_lu$(EXEEXT): $(global_testing_ga_lu_OBJECTS) $(global_testing_ga_lu_DEPENDENCIES) $(EXTRA_global_testing_ga_lu_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ga_lu$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_ga_lu_OBJECTS) $(global_testing_ga_lu_LDADD) $(LIBS) global/testing/ga_shift.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ga_shift$(EXEEXT): $(global_testing_ga_shift_OBJECTS) $(global_testing_ga_shift_DEPENDENCIES) $(EXTRA_global_testing_ga_shift_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ga_shift$(EXEEXT) $(AM_V_F77LD)$(global_testing_ga_shift_LINK) $(global_testing_ga_shift_OBJECTS) $(global_testing_ga_shift_LDADD) $(LIBS) global/testing/gatscat.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/gatscat$(EXEEXT): $(global_testing_gatscat_OBJECTS) $(global_testing_gatscat_DEPENDENCIES) $(EXTRA_global_testing_gatscat_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/gatscat$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_gatscat_OBJECTS) $(global_testing_gatscat_LDADD) $(LIBS) global/testing/getmem.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/getmem$(EXEEXT): $(global_testing_getmem_OBJECTS) $(global_testing_getmem_DEPENDENCIES) $(EXTRA_global_testing_getmem_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/getmem$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_getmem_OBJECTS) $(global_testing_getmem_LDADD) $(LIBS) global/testing/ghosts.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ghosts$(EXEEXT): $(global_testing_ghosts_OBJECTS) $(global_testing_ghosts_DEPENDENCIES) $(EXTRA_global_testing_ghosts_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ghosts$(EXEEXT) $(AM_V_F77LD)$(global_testing_ghosts_LINK) $(global_testing_ghosts_OBJECTS) $(global_testing_ghosts_LDADD) $(LIBS) global/testing/ipc.clean.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ipc_clean$(EXEEXT): $(global_testing_ipc_clean_OBJECTS) $(global_testing_ipc_clean_DEPENDENCIES) $(EXTRA_global_testing_ipc_clean_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ipc_clean$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_ipc_clean_OBJECTS) $(global_testing_ipc_clean_LDADD) $(LIBS) global/testing/jacobi.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/jacobi$(EXEEXT): $(global_testing_jacobi_OBJECTS) $(global_testing_jacobi_DEPENDENCIES) $(EXTRA_global_testing_jacobi_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/jacobi$(EXEEXT) $(AM_V_F77LD)$(global_testing_jacobi_LINK) $(global_testing_jacobi_OBJECTS) $(global_testing_jacobi_LDADD) $(LIBS) global/testing/lock.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/lock$(EXEEXT): $(global_testing_lock_OBJECTS) $(global_testing_lock_DEPENDENCIES) $(EXTRA_global_testing_lock_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/lock$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_lock_OBJECTS) $(global_testing_lock_LDADD) $(LIBS) global/testing/mir_perf2.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/mir_perf2$(EXEEXT): $(global_testing_mir_perf2_OBJECTS) $(global_testing_mir_perf2_DEPENDENCIES) $(EXTRA_global_testing_mir_perf2_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/mir_perf2$(EXEEXT) $(AM_V_F77LD)$(global_testing_mir_perf2_LINK) $(global_testing_mir_perf2_OBJECTS) $(global_testing_mir_perf2_LDADD) $(LIBS) global/testing/mmatrix.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/mmatrix$(EXEEXT): $(global_testing_mmatrix_OBJECTS) $(global_testing_mmatrix_DEPENDENCIES) $(EXTRA_global_testing_mmatrix_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/mmatrix$(EXEEXT) $(AM_V_F77LD)$(global_testing_mmatrix_LINK) $(global_testing_mmatrix_OBJECTS) $(global_testing_mmatrix_LDADD) $(LIBS) global/testing/mtest.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/mtest$(EXEEXT): $(global_testing_mtest_OBJECTS) $(global_testing_mtest_DEPENDENCIES) $(EXTRA_global_testing_mtest_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/mtest$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_mtest_OBJECTS) $(global_testing_mtest_LDADD) $(LIBS) global/testing/mulmatpatch.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/mulmatpatch$(EXEEXT): $(global_testing_mulmatpatch_OBJECTS) $(global_testing_mulmatpatch_DEPENDENCIES) $(EXTRA_global_testing_mulmatpatch_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/mulmatpatch$(EXEEXT) $(AM_V_F77LD)$(global_testing_mulmatpatch_LINK) $(global_testing_mulmatpatch_OBJECTS) $(global_testing_mulmatpatch_LDADD) $(LIBS) global/testing/mulmatpatchc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/mulmatpatchc$(EXEEXT): $(global_testing_mulmatpatchc_OBJECTS) $(global_testing_mulmatpatchc_DEPENDENCIES) $(EXTRA_global_testing_mulmatpatchc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/mulmatpatchc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_mulmatpatchc_OBJECTS) $(global_testing_mulmatpatchc_LDADD) $(LIBS) global/testing/nb2test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nb2test$(EXEEXT): $(global_testing_nb2test_OBJECTS) $(global_testing_nb2test_DEPENDENCIES) $(EXTRA_global_testing_nb2test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nb2test$(EXEEXT) $(AM_V_F77LD)$(global_testing_nb2test_LINK) $(global_testing_nb2test_OBJECTS) $(global_testing_nb2test_LDADD) $(LIBS) global/testing/ndim.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ndim$(EXEEXT): $(global_testing_ndim_OBJECTS) $(global_testing_ndim_DEPENDENCIES) $(EXTRA_global_testing_ndim_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ndim$(EXEEXT) $(AM_V_F77LD)$(global_testing_ndim_LINK) $(global_testing_ndim_OBJECTS) $(global_testing_ndim_LDADD) $(LIBS) global/testing/nga-onesided.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nga-onesided$(EXEEXT): $(global_testing_nga_onesided_OBJECTS) $(global_testing_nga_onesided_DEPENDENCIES) $(EXTRA_global_testing_nga_onesided_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nga-onesided$(EXEEXT) $(AM_V_F77LD)$(global_testing_nga_onesided_LINK) $(global_testing_nga_onesided_OBJECTS) $(global_testing_nga_onesided_LDADD) $(LIBS) global/testing/nga-patch.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nga-patch$(EXEEXT): $(global_testing_nga_patch_OBJECTS) $(global_testing_nga_patch_DEPENDENCIES) $(EXTRA_global_testing_nga_patch_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nga-patch$(EXEEXT) $(AM_V_F77LD)$(global_testing_nga_patch_LINK) $(global_testing_nga_patch_OBJECTS) $(global_testing_nga_patch_LDADD) $(LIBS) global/testing/nga-periodic.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nga-periodic$(EXEEXT): $(global_testing_nga_periodic_OBJECTS) $(global_testing_nga_periodic_DEPENDENCIES) $(EXTRA_global_testing_nga_periodic_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nga-periodic$(EXEEXT) $(AM_V_F77LD)$(global_testing_nga_periodic_LINK) $(global_testing_nga_periodic_OBJECTS) $(global_testing_nga_periodic_LDADD) $(LIBS) global/testing/nga-scatter.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nga-scatter$(EXEEXT): $(global_testing_nga_scatter_OBJECTS) $(global_testing_nga_scatter_DEPENDENCIES) $(EXTRA_global_testing_nga_scatter_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nga-scatter$(EXEEXT) $(AM_V_F77LD)$(global_testing_nga_scatter_LINK) $(global_testing_nga_scatter_OBJECTS) $(global_testing_nga_scatter_LDADD) $(LIBS) global/testing/nga-util.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/nga-util$(EXEEXT): $(global_testing_nga_util_OBJECTS) $(global_testing_nga_util_DEPENDENCIES) $(EXTRA_global_testing_nga_util_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/nga-util$(EXEEXT) $(AM_V_F77LD)$(global_testing_nga_util_LINK) $(global_testing_nga_util_OBJECTS) $(global_testing_nga_util_LDADD) $(LIBS) global/testing/ngatest.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ngatest$(EXEEXT): $(global_testing_ngatest_OBJECTS) $(global_testing_ngatest_DEPENDENCIES) $(EXTRA_global_testing_ngatest_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ngatest$(EXEEXT) $(AM_V_F77LD)$(global_testing_ngatest_LINK) $(global_testing_ngatest_OBJECTS) $(global_testing_ngatest_LDADD) $(LIBS) global/testing/normc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/normc$(EXEEXT): $(global_testing_normc_OBJECTS) $(global_testing_normc_DEPENDENCIES) $(EXTRA_global_testing_normc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/normc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_normc_OBJECTS) $(global_testing_normc_LDADD) $(LIBS) global/testing/ntestc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ntestc$(EXEEXT): $(global_testing_ntestc_OBJECTS) $(global_testing_ntestc_DEPENDENCIES) $(EXTRA_global_testing_ntestc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ntestc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_ntestc_OBJECTS) $(global_testing_ntestc_LDADD) $(LIBS) global/testing/ntestfc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/ntestfc$(EXEEXT): $(global_testing_ntestfc_OBJECTS) $(global_testing_ntestfc_DEPENDENCIES) $(EXTRA_global_testing_ntestfc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/ntestfc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_ntestfc_OBJECTS) $(global_testing_ntestfc_LDADD) $(LIBS) global/testing/packc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/packc$(EXEEXT): $(global_testing_packc_OBJECTS) $(global_testing_packc_DEPENDENCIES) $(EXTRA_global_testing_packc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/packc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_packc_OBJECTS) $(global_testing_packc_LDADD) $(LIBS) global/testing/patch.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/patch$(EXEEXT): $(global_testing_patch_OBJECTS) $(global_testing_patch_DEPENDENCIES) $(EXTRA_global_testing_patch_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/patch$(EXEEXT) $(AM_V_F77LD)$(global_testing_patch_LINK) $(global_testing_patch_OBJECTS) $(global_testing_patch_LDADD) $(LIBS) global/testing/patch2.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/patch2$(EXEEXT): $(global_testing_patch2_OBJECTS) $(global_testing_patch2_DEPENDENCIES) $(EXTRA_global_testing_patch2_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/patch2$(EXEEXT) $(AM_V_F77LD)$(global_testing_patch2_LINK) $(global_testing_patch2_OBJECTS) $(global_testing_patch2_LDADD) $(LIBS) global/testing/patch_enumc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/patch_enumc$(EXEEXT): $(global_testing_patch_enumc_OBJECTS) $(global_testing_patch_enumc_DEPENDENCIES) $(EXTRA_global_testing_patch_enumc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/patch_enumc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_patch_enumc_OBJECTS) $(global_testing_patch_enumc_LDADD) $(LIBS) global/testing/patch_enumf.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/patch_enumf$(EXEEXT): $(global_testing_patch_enumf_OBJECTS) $(global_testing_patch_enumf_DEPENDENCIES) $(EXTRA_global_testing_patch_enumf_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/patch_enumf$(EXEEXT) $(AM_V_F77LD)$(global_testing_patch_enumf_LINK) $(global_testing_patch_enumf_OBJECTS) $(global_testing_patch_enumf_LDADD) $(LIBS) global/testing/perf.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/perf$(EXEEXT): $(global_testing_perf_OBJECTS) $(global_testing_perf_DEPENDENCIES) $(EXTRA_global_testing_perf_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/perf$(EXEEXT) $(AM_V_F77LD)$(global_testing_perf_LINK) $(global_testing_perf_OBJECTS) $(global_testing_perf_LDADD) $(LIBS) global/testing/perf2.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/perf2$(EXEEXT): $(global_testing_perf2_OBJECTS) $(global_testing_perf2_DEPENDENCIES) $(EXTRA_global_testing_perf2_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/perf2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_perf2_OBJECTS) $(global_testing_perf2_LDADD) $(LIBS) global/testing/perfmod.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/perfmod$(EXEEXT): $(global_testing_perfmod_OBJECTS) $(global_testing_perfmod_DEPENDENCIES) $(EXTRA_global_testing_perfmod_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/perfmod$(EXEEXT) $(AM_V_F77LD)$(global_testing_perfmod_LINK) $(global_testing_perfmod_OBJECTS) $(global_testing_perfmod_LDADD) $(LIBS) global/testing/perform.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/perform$(EXEEXT): $(global_testing_perform_OBJECTS) $(global_testing_perform_DEPENDENCIES) $(EXTRA_global_testing_perform_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/perform$(EXEEXT) $(AM_V_F77LD)$(global_testing_perform_LINK) $(global_testing_perform_OBJECTS) $(global_testing_perform_LDADD) $(LIBS) global/testing/pg2test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/pg2test$(EXEEXT): $(global_testing_pg2test_OBJECTS) $(global_testing_pg2test_DEPENDENCIES) $(EXTRA_global_testing_pg2test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/pg2test$(EXEEXT) $(AM_V_F77LD)$(global_testing_pg2test_LINK) $(global_testing_pg2test_OBJECTS) $(global_testing_pg2test_LDADD) $(LIBS) global/testing/pg2testmatmult.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/pg2testmatmult$(EXEEXT): $(global_testing_pg2testmatmult_OBJECTS) $(global_testing_pg2testmatmult_DEPENDENCIES) $(EXTRA_global_testing_pg2testmatmult_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/pg2testmatmult$(EXEEXT) $(AM_V_F77LD)$(global_testing_pg2testmatmult_LINK) $(global_testing_pg2testmatmult_OBJECTS) $(global_testing_pg2testmatmult_LDADD) $(LIBS) global/testing/pgtest.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/pgtest$(EXEEXT): $(global_testing_pgtest_OBJECTS) $(global_testing_pgtest_DEPENDENCIES) $(EXTRA_global_testing_pgtest_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/pgtest$(EXEEXT) $(AM_V_F77LD)$(global_testing_pgtest_LINK) $(global_testing_pgtest_OBJECTS) $(global_testing_pgtest_LDADD) $(LIBS) global/testing/pgtestmatmult.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/pgtestmatmult$(EXEEXT): $(global_testing_pgtestmatmult_OBJECTS) $(global_testing_pgtestmatmult_DEPENDENCIES) $(EXTRA_global_testing_pgtestmatmult_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/pgtestmatmult$(EXEEXT) $(AM_V_F77LD)$(global_testing_pgtestmatmult_LINK) $(global_testing_pgtestmatmult_OBJECTS) $(global_testing_pgtestmatmult_LDADD) $(LIBS) global/testing/print.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/print$(EXEEXT): $(global_testing_print_OBJECTS) $(global_testing_print_DEPENDENCIES) $(EXTRA_global_testing_print_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/print$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_print_OBJECTS) $(global_testing_print_LDADD) $(LIBS) global/testing/random.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/random$(EXEEXT): $(global_testing_random_OBJECTS) $(global_testing_random_DEPENDENCIES) $(EXTRA_global_testing_random_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/random$(EXEEXT) $(AM_V_F77LD)$(global_testing_random_LINK) $(global_testing_random_OBJECTS) $(global_testing_random_LDADD) $(LIBS) global/testing/scan.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/scan$(EXEEXT): $(global_testing_scan_OBJECTS) $(global_testing_scan_DEPENDENCIES) $(EXTRA_global_testing_scan_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/scan$(EXEEXT) $(AM_V_F77LD)$(global_testing_scan_LINK) $(global_testing_scan_OBJECTS) $(global_testing_scan_LDADD) $(LIBS) global/testing/scan_addc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/scan_addc$(EXEEXT): $(global_testing_scan_addc_OBJECTS) $(global_testing_scan_addc_DEPENDENCIES) $(EXTRA_global_testing_scan_addc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/scan_addc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_scan_addc_OBJECTS) $(global_testing_scan_addc_LDADD) $(LIBS) global/testing/scan_copyc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/scan_copyc$(EXEEXT): $(global_testing_scan_copyc_OBJECTS) $(global_testing_scan_copyc_DEPENDENCIES) $(EXTRA_global_testing_scan_copyc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/scan_copyc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_scan_copyc_OBJECTS) $(global_testing_scan_copyc_LDADD) $(LIBS) global/testing/simple_groups.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/simple_groups$(EXEEXT): $(global_testing_simple_groups_OBJECTS) $(global_testing_simple_groups_DEPENDENCIES) $(EXTRA_global_testing_simple_groups_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/simple_groups$(EXEEXT) $(AM_V_F77LD)$(global_testing_simple_groups_LINK) $(global_testing_simple_groups_OBJECTS) $(global_testing_simple_groups_LDADD) $(LIBS) global/testing/simple_groups_comm.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/simple_groups_comm$(EXEEXT): $(global_testing_simple_groups_comm_OBJECTS) $(global_testing_simple_groups_comm_DEPENDENCIES) $(EXTRA_global_testing_simple_groups_comm_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/simple_groups_comm$(EXEEXT) $(AM_V_F77LD)$(global_testing_simple_groups_comm_LINK) $(global_testing_simple_groups_comm_OBJECTS) $(global_testing_simple_groups_comm_LDADD) $(LIBS) global/testing/simple_groups_commc.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/simple_groups_commc$(EXEEXT): $(global_testing_simple_groups_commc_OBJECTS) $(global_testing_simple_groups_commc_DEPENDENCIES) $(EXTRA_global_testing_simple_groups_commc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/simple_groups_commc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_simple_groups_commc_OBJECTS) $(global_testing_simple_groups_commc_LDADD) $(LIBS) global/testing/sparse.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/sparse$(EXEEXT): $(global_testing_sparse_OBJECTS) $(global_testing_sparse_DEPENDENCIES) $(EXTRA_global_testing_sparse_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/sparse$(EXEEXT) $(AM_V_F77LD)$(global_testing_sparse_LINK) $(global_testing_sparse_OBJECTS) $(global_testing_sparse_LDADD) $(LIBS) global/testing/sprsmatmult.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/sprsmatmult$(EXEEXT): $(global_testing_sprsmatmult_OBJECTS) $(global_testing_sprsmatmult_DEPENDENCIES) $(EXTRA_global_testing_sprsmatmult_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/sprsmatmult$(EXEEXT) $(AM_V_F77LD)$(global_testing_sprsmatmult_LINK) $(global_testing_sprsmatmult_OBJECTS) $(global_testing_sprsmatmult_LDADD) $(LIBS) global/testing/stride.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/stride$(EXEEXT): $(global_testing_stride_OBJECTS) $(global_testing_stride_DEPENDENCIES) $(EXTRA_global_testing_stride_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/stride$(EXEEXT) $(AM_V_F77LD)$(global_testing_stride_LINK) $(global_testing_stride_OBJECTS) $(global_testing_stride_LDADD) $(LIBS) global/testing/test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/test$(EXEEXT): $(global_testing_test_OBJECTS) $(global_testing_test_DEPENDENCIES) $(EXTRA_global_testing_test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/test$(EXEEXT) $(AM_V_F77LD)$(global_testing_test_LINK) $(global_testing_test_OBJECTS) $(global_testing_test_LDADD) $(LIBS) global/testing/global_testing_test_mirrored-test.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/global_testing_test_mirrored-util.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/global_testing_test_mirrored-ffflush.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/global_testing_test_mirrored-testblas.$(OBJEXT): \ global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/test_mirrored$(EXEEXT): $(global_testing_test_mirrored_OBJECTS) $(global_testing_test_mirrored_DEPENDENCIES) $(EXTRA_global_testing_test_mirrored_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/test_mirrored$(EXEEXT) $(AM_V_F77LD)$(global_testing_test_mirrored_LINK) $(global_testing_test_mirrored_OBJECTS) $(global_testing_test_mirrored_LDADD) $(LIBS) global/testing/testc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testc$(EXEEXT): $(global_testing_testc_OBJECTS) $(global_testing_testc_DEPENDENCIES) $(EXTRA_global_testing_testc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_testc_OBJECTS) $(global_testing_testc_LDADD) $(LIBS) global/testing/testeig.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testeig$(EXEEXT): $(global_testing_testeig_OBJECTS) $(global_testing_testeig_DEPENDENCIES) $(EXTRA_global_testing_testeig_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testeig$(EXEEXT) $(AM_V_F77LD)$(global_testing_testeig_LINK) $(global_testing_testeig_OBJECTS) $(global_testing_testeig_LDADD) $(LIBS) global/testing/testmatmult.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testmatmult$(EXEEXT): $(global_testing_testmatmult_OBJECTS) $(global_testing_testmatmult_DEPENDENCIES) $(EXTRA_global_testing_testmatmult_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testmatmult$(EXEEXT) $(AM_V_F77LD)$(global_testing_testmatmult_LINK) $(global_testing_testmatmult_OBJECTS) $(global_testing_testmatmult_LDADD) $(LIBS) global/testing/testmatmultc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testmatmultc$(EXEEXT): $(global_testing_testmatmultc_OBJECTS) $(global_testing_testmatmultc_DEPENDENCIES) $(EXTRA_global_testing_testmatmultc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testmatmultc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_testmatmultc_OBJECTS) $(global_testing_testmatmultc_LDADD) $(LIBS) global/testing/testmult.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testmult$(EXEEXT): $(global_testing_testmult_OBJECTS) $(global_testing_testmult_DEPENDENCIES) $(EXTRA_global_testing_testmult_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testmult$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_testmult_OBJECTS) $(global_testing_testmult_LDADD) $(LIBS) global/testing/testmultrect.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testmultrect$(EXEEXT): $(global_testing_testmultrect_OBJECTS) $(global_testing_testmultrect_DEPENDENCIES) $(EXTRA_global_testing_testmultrect_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testmultrect$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_testmultrect_OBJECTS) $(global_testing_testmultrect_LDADD) $(LIBS) global/testing/testsolve.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testsolve$(EXEEXT): $(global_testing_testsolve_OBJECTS) $(global_testing_testsolve_DEPENDENCIES) $(EXTRA_global_testing_testsolve_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testsolve$(EXEEXT) $(AM_V_F77LD)$(global_testing_testsolve_LINK) $(global_testing_testsolve_OBJECTS) $(global_testing_testsolve_LDADD) $(LIBS) global/testing/testspd.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/testspd$(EXEEXT): $(global_testing_testspd_OBJECTS) $(global_testing_testspd_DEPENDENCIES) $(EXTRA_global_testing_testspd_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/testspd$(EXEEXT) $(AM_V_F77LD)$(global_testing_testspd_LINK) $(global_testing_testspd_OBJECTS) $(global_testing_testspd_LDADD) $(LIBS) global/testing/types-test.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/types_test$(EXEEXT): $(global_testing_types_test_OBJECTS) $(global_testing_types_test_DEPENDENCIES) $(EXTRA_global_testing_types_test_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/types_test$(EXEEXT) $(AM_V_F77LD)$(global_testing_types_test_LINK) $(global_testing_types_test_OBJECTS) $(global_testing_types_test_LDADD) $(LIBS) global/testing/unit-tests/$(am__dirstamp): @$(MKDIR_P) global/testing/unit-tests @: > global/testing/unit-tests/$(am__dirstamp) global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/testing/unit-tests/$(DEPDIR) @: > global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_abs_value.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/mock.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_abs_value$(EXEEXT): $(global_testing_unit_tests_ga_abs_value_OBJECTS) $(global_testing_unit_tests_ga_abs_value_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_abs_value_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_abs_value$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_abs_value_OBJECTS) $(global_testing_unit_tests_ga_abs_value_LDADD) $(LIBS) global/testing/unit-tests/ga_acc.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_acc$(EXEEXT): $(global_testing_unit_tests_ga_acc_OBJECTS) $(global_testing_unit_tests_ga_acc_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_acc_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_acc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_acc_OBJECTS) $(global_testing_unit_tests_ga_acc_LDADD) $(LIBS) global/testing/unit-tests/ga_add.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_add$(EXEEXT): $(global_testing_unit_tests_ga_add_OBJECTS) $(global_testing_unit_tests_ga_add_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_add_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_add$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_add_OBJECTS) $(global_testing_unit_tests_ga_add_LDADD) $(LIBS) global/testing/unit-tests/ga_add_constant.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_add_constant$(EXEEXT): $(global_testing_unit_tests_ga_add_constant_OBJECTS) $(global_testing_unit_tests_ga_add_constant_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_add_constant_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_add_constant$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_add_constant_OBJECTS) $(global_testing_unit_tests_ga_add_constant_LDADD) $(LIBS) global/testing/unit-tests/ga_add_constantpatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_add_constantpatch$(EXEEXT): $(global_testing_unit_tests_ga_add_constantpatch_OBJECTS) $(global_testing_unit_tests_ga_add_constantpatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_add_constantpatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_add_constantpatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_add_constantpatch_OBJECTS) $(global_testing_unit_tests_ga_add_constantpatch_LDADD) $(LIBS) global/testing/unit-tests/ga_add_diagonal.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_add_diagonal$(EXEEXT): $(global_testing_unit_tests_ga_add_diagonal_OBJECTS) $(global_testing_unit_tests_ga_add_diagonal_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_add_diagonal_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_add_diagonal$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_add_diagonal_OBJECTS) $(global_testing_unit_tests_ga_add_diagonal_LDADD) $(LIBS) global/testing/unit-tests/ga_add_patch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_add_patch$(EXEEXT): $(global_testing_unit_tests_ga_add_patch_OBJECTS) $(global_testing_unit_tests_ga_add_patch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_add_patch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_add_patch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_add_patch_OBJECTS) $(global_testing_unit_tests_ga_add_patch_LDADD) $(LIBS) global/testing/unit-tests/ga_copy.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_copy$(EXEEXT): $(global_testing_unit_tests_ga_copy_OBJECTS) $(global_testing_unit_tests_ga_copy_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_copy_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_copy$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_copy_OBJECTS) $(global_testing_unit_tests_ga_copy_LDADD) $(LIBS) global/testing/unit-tests/ga_copy2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_copy2$(EXEEXT): $(global_testing_unit_tests_ga_copy2_OBJECTS) $(global_testing_unit_tests_ga_copy2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_copy2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_copy2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_copy2_OBJECTS) $(global_testing_unit_tests_ga_copy2_LDADD) $(LIBS) global/testing/unit-tests/ga_copy3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_copy3$(EXEEXT): $(global_testing_unit_tests_ga_copy3_OBJECTS) $(global_testing_unit_tests_ga_copy3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_copy3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_copy3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_copy3_OBJECTS) $(global_testing_unit_tests_ga_copy3_LDADD) $(LIBS) global/testing/unit-tests/ga_copypatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_copypatch$(EXEEXT): $(global_testing_unit_tests_ga_copypatch_OBJECTS) $(global_testing_unit_tests_ga_copypatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_copypatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_copypatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_copypatch_OBJECTS) $(global_testing_unit_tests_ga_copypatch_LDADD) $(LIBS) global/testing/unit-tests/ga_copypatch2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_copypatch2$(EXEEXT): $(global_testing_unit_tests_ga_copypatch2_OBJECTS) $(global_testing_unit_tests_ga_copypatch2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_copypatch2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_copypatch2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_copypatch2_OBJECTS) $(global_testing_unit_tests_ga_copypatch2_LDADD) $(LIBS) global/testing/unit-tests/ga_create.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create$(EXEEXT): $(global_testing_unit_tests_ga_create_OBJECTS) $(global_testing_unit_tests_ga_create_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create_OBJECTS) $(global_testing_unit_tests_ga_create_LDADD) $(LIBS) global/testing/unit-tests/ga_create1.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create1$(EXEEXT): $(global_testing_unit_tests_ga_create1_OBJECTS) $(global_testing_unit_tests_ga_create1_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create1_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create1$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create1_OBJECTS) $(global_testing_unit_tests_ga_create1_LDADD) $(LIBS) global/testing/unit-tests/ga_create2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create2$(EXEEXT): $(global_testing_unit_tests_ga_create2_OBJECTS) $(global_testing_unit_tests_ga_create2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create2_OBJECTS) $(global_testing_unit_tests_ga_create2_LDADD) $(LIBS) global/testing/unit-tests/ga_create3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create3$(EXEEXT): $(global_testing_unit_tests_ga_create3_OBJECTS) $(global_testing_unit_tests_ga_create3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create3_OBJECTS) $(global_testing_unit_tests_ga_create3_LDADD) $(LIBS) global/testing/unit-tests/ga_create_handle.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create_handle$(EXEEXT): $(global_testing_unit_tests_ga_create_handle_OBJECTS) $(global_testing_unit_tests_ga_create_handle_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create_handle_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create_handle$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create_handle_OBJECTS) $(global_testing_unit_tests_ga_create_handle_LDADD) $(LIBS) global/testing/unit-tests/ga_create_irreg.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create_irreg$(EXEEXT): $(global_testing_unit_tests_ga_create_irreg_OBJECTS) $(global_testing_unit_tests_ga_create_irreg_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create_irreg_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create_irreg$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create_irreg_OBJECTS) $(global_testing_unit_tests_ga_create_irreg_LDADD) $(LIBS) global/testing/unit-tests/ga_create_irreg2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create_irreg2$(EXEEXT): $(global_testing_unit_tests_ga_create_irreg2_OBJECTS) $(global_testing_unit_tests_ga_create_irreg2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create_irreg2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create_irreg2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create_irreg2_OBJECTS) $(global_testing_unit_tests_ga_create_irreg2_LDADD) $(LIBS) global/testing/unit-tests/ga_create_irreg3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_create_irreg3$(EXEEXT): $(global_testing_unit_tests_ga_create_irreg3_OBJECTS) $(global_testing_unit_tests_ga_create_irreg3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_create_irreg3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_create_irreg3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_create_irreg3_OBJECTS) $(global_testing_unit_tests_ga_create_irreg3_LDADD) $(LIBS) global/testing/unit-tests/ga_destroy.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_destroy$(EXEEXT): $(global_testing_unit_tests_ga_destroy_OBJECTS) $(global_testing_unit_tests_ga_destroy_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_destroy_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_destroy$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_destroy_OBJECTS) $(global_testing_unit_tests_ga_destroy_LDADD) $(LIBS) global/testing/unit-tests/ga_dgop.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_dgop$(EXEEXT): $(global_testing_unit_tests_ga_dgop_OBJECTS) $(global_testing_unit_tests_ga_dgop_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_dgop_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_dgop$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_dgop_OBJECTS) $(global_testing_unit_tests_ga_dgop_LDADD) $(LIBS) global/testing/unit-tests/ga_dot.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_dot$(EXEEXT): $(global_testing_unit_tests_ga_dot_OBJECTS) $(global_testing_unit_tests_ga_dot_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_dot_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_dot$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_dot_OBJECTS) $(global_testing_unit_tests_ga_dot_LDADD) $(LIBS) global/testing/unit-tests/ga_duplicate.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_duplicate$(EXEEXT): $(global_testing_unit_tests_ga_duplicate_OBJECTS) $(global_testing_unit_tests_ga_duplicate_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_duplicate_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_duplicate$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_duplicate_OBJECTS) $(global_testing_unit_tests_ga_duplicate_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_divide.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_divide$(EXEEXT): $(global_testing_unit_tests_ga_elem_divide_OBJECTS) $(global_testing_unit_tests_ga_elem_divide_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_divide_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_divide$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_divide_OBJECTS) $(global_testing_unit_tests_ga_elem_divide_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_dividepatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_dividepatch$(EXEEXT): $(global_testing_unit_tests_ga_elem_dividepatch_OBJECTS) $(global_testing_unit_tests_ga_elem_dividepatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_dividepatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_dividepatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_dividepatch_OBJECTS) $(global_testing_unit_tests_ga_elem_dividepatch_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_maximum.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_maximum$(EXEEXT): $(global_testing_unit_tests_ga_elem_maximum_OBJECTS) $(global_testing_unit_tests_ga_elem_maximum_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_maximum_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_maximum$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_maximum_OBJECTS) $(global_testing_unit_tests_ga_elem_maximum_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_maximumpatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_maximumpatch$(EXEEXT): $(global_testing_unit_tests_ga_elem_maximumpatch_OBJECTS) $(global_testing_unit_tests_ga_elem_maximumpatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_maximumpatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_maximumpatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_maximumpatch_OBJECTS) $(global_testing_unit_tests_ga_elem_maximumpatch_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_minimum.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_minimum$(EXEEXT): $(global_testing_unit_tests_ga_elem_minimum_OBJECTS) $(global_testing_unit_tests_ga_elem_minimum_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_minimum_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_minimum$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_minimum_OBJECTS) $(global_testing_unit_tests_ga_elem_minimum_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_minimumpatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_minimumpatch$(EXEEXT): $(global_testing_unit_tests_ga_elem_minimumpatch_OBJECTS) $(global_testing_unit_tests_ga_elem_minimumpatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_minimumpatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_minimumpatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_minimumpatch_OBJECTS) $(global_testing_unit_tests_ga_elem_minimumpatch_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_multiply.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_multiply$(EXEEXT): $(global_testing_unit_tests_ga_elem_multiply_OBJECTS) $(global_testing_unit_tests_ga_elem_multiply_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_multiply_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_multiply$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_multiply_OBJECTS) $(global_testing_unit_tests_ga_elem_multiply_LDADD) $(LIBS) global/testing/unit-tests/ga_elem_multiplypatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_elem_multiplypatch$(EXEEXT): $(global_testing_unit_tests_ga_elem_multiplypatch_OBJECTS) $(global_testing_unit_tests_ga_elem_multiplypatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_elem_multiplypatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_elem_multiplypatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_elem_multiplypatch_OBJECTS) $(global_testing_unit_tests_ga_elem_multiplypatch_LDADD) $(LIBS) global/testing/unit-tests/ga_fill.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_fill$(EXEEXT): $(global_testing_unit_tests_ga_fill_OBJECTS) $(global_testing_unit_tests_ga_fill_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_fill_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_fill$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_fill_OBJECTS) $(global_testing_unit_tests_ga_fill_LDADD) $(LIBS) global/testing/unit-tests/ga_fillpatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_fillpatch$(EXEEXT): $(global_testing_unit_tests_ga_fillpatch_OBJECTS) $(global_testing_unit_tests_ga_fillpatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_fillpatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_fillpatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_fillpatch_OBJECTS) $(global_testing_unit_tests_ga_fillpatch_LDADD) $(LIBS) global/testing/unit-tests/ga_fillpatch1.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_fillpatch1$(EXEEXT): $(global_testing_unit_tests_ga_fillpatch1_OBJECTS) $(global_testing_unit_tests_ga_fillpatch1_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_fillpatch1_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_fillpatch1$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_fillpatch1_OBJECTS) $(global_testing_unit_tests_ga_fillpatch1_LDADD) $(LIBS) global/testing/unit-tests/ga_gather.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_gather$(EXEEXT): $(global_testing_unit_tests_ga_gather_OBJECTS) $(global_testing_unit_tests_ga_gather_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_gather_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_gather$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_gather_OBJECTS) $(global_testing_unit_tests_ga_gather_LDADD) $(LIBS) global/testing/unit-tests/ga_gather2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_gather2$(EXEEXT): $(global_testing_unit_tests_ga_gather2_OBJECTS) $(global_testing_unit_tests_ga_gather2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_gather2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_gather2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_gather2_OBJECTS) $(global_testing_unit_tests_ga_gather2_LDADD) $(LIBS) global/testing/unit-tests/ga_gather3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_gather3$(EXEEXT): $(global_testing_unit_tests_ga_gather3_OBJECTS) $(global_testing_unit_tests_ga_gather3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_gather3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_gather3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_gather3_OBJECTS) $(global_testing_unit_tests_ga_gather3_LDADD) $(LIBS) global/testing/unit-tests/ga_get.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_get$(EXEEXT): $(global_testing_unit_tests_ga_get_OBJECTS) $(global_testing_unit_tests_ga_get_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_get_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_get$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_get_OBJECTS) $(global_testing_unit_tests_ga_get_LDADD) $(LIBS) global/testing/unit-tests/ga_get_blockinfo.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_get_blockinfo$(EXEEXT): $(global_testing_unit_tests_ga_get_blockinfo_OBJECTS) $(global_testing_unit_tests_ga_get_blockinfo_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_get_blockinfo_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_get_blockinfo$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_get_blockinfo_OBJECTS) $(global_testing_unit_tests_ga_get_blockinfo_LDADD) $(LIBS) global/testing/unit-tests/ga_get_diagonal.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_get_diagonal$(EXEEXT): $(global_testing_unit_tests_ga_get_diagonal_OBJECTS) $(global_testing_unit_tests_ga_get_diagonal_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_get_diagonal_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_get_diagonal$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_get_diagonal_OBJECTS) $(global_testing_unit_tests_ga_get_diagonal_LDADD) $(LIBS) global/testing/unit-tests/ga_igop.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_igop$(EXEEXT): $(global_testing_unit_tests_ga_igop_OBJECTS) $(global_testing_unit_tests_ga_igop_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_igop_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_igop$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_igop_OBJECTS) $(global_testing_unit_tests_ga_igop_LDADD) $(LIBS) global/testing/unit-tests/ga_igop2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_igop2$(EXEEXT): $(global_testing_unit_tests_ga_igop2_OBJECTS) $(global_testing_unit_tests_ga_igop2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_igop2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_igop2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_igop2_OBJECTS) $(global_testing_unit_tests_ga_igop2_LDADD) $(LIBS) global/testing/unit-tests/ga_inquire.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_inquire$(EXEEXT): $(global_testing_unit_tests_ga_inquire_OBJECTS) $(global_testing_unit_tests_ga_inquire_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_inquire_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_inquire$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_inquire_OBJECTS) $(global_testing_unit_tests_ga_inquire_LDADD) $(LIBS) global/testing/unit-tests/ga_intialize.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_intialize$(EXEEXT): $(global_testing_unit_tests_ga_intialize_OBJECTS) $(global_testing_unit_tests_ga_intialize_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_intialize_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_intialize$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_intialize_OBJECTS) $(global_testing_unit_tests_ga_intialize_LDADD) $(LIBS) global/testing/unit-tests/ga_lgop.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_lgop$(EXEEXT): $(global_testing_unit_tests_ga_lgop_OBJECTS) $(global_testing_unit_tests_ga_lgop_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_lgop_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_lgop$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_lgop_OBJECTS) $(global_testing_unit_tests_ga_lgop_LDADD) $(LIBS) global/testing/unit-tests/ga_median.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_median$(EXEEXT): $(global_testing_unit_tests_ga_median_OBJECTS) $(global_testing_unit_tests_ga_median_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_median_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_median$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_median_OBJECTS) $(global_testing_unit_tests_ga_median_LDADD) $(LIBS) global/testing/unit-tests/ga_ndim.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_ndim$(EXEEXT): $(global_testing_unit_tests_ga_ndim_OBJECTS) $(global_testing_unit_tests_ga_ndim_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_ndim_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_ndim$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_ndim_OBJECTS) $(global_testing_unit_tests_ga_ndim_LDADD) $(LIBS) global/testing/unit-tests/ga_ndim2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_ndim2$(EXEEXT): $(global_testing_unit_tests_ga_ndim2_OBJECTS) $(global_testing_unit_tests_ga_ndim2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_ndim2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_ndim2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_ndim2_OBJECTS) $(global_testing_unit_tests_ga_ndim2_LDADD) $(LIBS) global/testing/unit-tests/ga_nnodes.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_nnodes$(EXEEXT): $(global_testing_unit_tests_ga_nnodes_OBJECTS) $(global_testing_unit_tests_ga_nnodes_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_nnodes_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_nnodes$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_nnodes_OBJECTS) $(global_testing_unit_tests_ga_nnodes_LDADD) $(LIBS) global/testing/unit-tests/ga_nodeid.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_nodeid$(EXEEXT): $(global_testing_unit_tests_ga_nodeid_OBJECTS) $(global_testing_unit_tests_ga_nodeid_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_nodeid_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_nodeid$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_nodeid_OBJECTS) $(global_testing_unit_tests_ga_nodeid_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_create.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_create$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_create_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_create_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_create$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_create_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_create2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_create2$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_create2_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_create2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_create2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_create2_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create2_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_create3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_create3$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_create3_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_create3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_create3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_create3_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create3_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_create4.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_create4$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_create4_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create4_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_create4_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_create4$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_create4_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create4_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_create5.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_create5$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_create5_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create5_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_create5_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_create5$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_create5_OBJECTS) $(global_testing_unit_tests_ga_pgroup_create5_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_destroy.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_destroy$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_destroy_OBJECTS) $(global_testing_unit_tests_ga_pgroup_destroy_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_destroy_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_destroy$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_destroy_OBJECTS) $(global_testing_unit_tests_ga_pgroup_destroy_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_destroy2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_destroy2$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_destroy2_OBJECTS) $(global_testing_unit_tests_ga_pgroup_destroy2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_destroy2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_destroy2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_destroy2_OBJECTS) $(global_testing_unit_tests_ga_pgroup_destroy2_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_nnodes_nodeid.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_nnodes_nodeid$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_OBJECTS) $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_nnodes_nodeid_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_nnodes_nodeid$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_OBJECTS) $(global_testing_unit_tests_ga_pgroup_nnodes_nodeid_LDADD) $(LIBS) global/testing/unit-tests/ga_pgroup_setdefault.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_pgroup_setdefault$(EXEEXT): $(global_testing_unit_tests_ga_pgroup_setdefault_OBJECTS) $(global_testing_unit_tests_ga_pgroup_setdefault_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_pgroup_setdefault_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_pgroup_setdefault$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_pgroup_setdefault_OBJECTS) $(global_testing_unit_tests_ga_pgroup_setdefault_LDADD) $(LIBS) global/testing/unit-tests/ga_put.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_put$(EXEEXT): $(global_testing_unit_tests_ga_put_OBJECTS) $(global_testing_unit_tests_ga_put_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_put_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_put$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_put_OBJECTS) $(global_testing_unit_tests_ga_put_LDADD) $(LIBS) global/testing/unit-tests/ga_put2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_put2$(EXEEXT): $(global_testing_unit_tests_ga_put2_OBJECTS) $(global_testing_unit_tests_ga_put2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_put2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_put2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_put2_OBJECTS) $(global_testing_unit_tests_ga_put2_LDADD) $(LIBS) global/testing/unit-tests/ga_scale.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scale$(EXEEXT): $(global_testing_unit_tests_ga_scale_OBJECTS) $(global_testing_unit_tests_ga_scale_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scale_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scale$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scale_OBJECTS) $(global_testing_unit_tests_ga_scale_LDADD) $(LIBS) global/testing/unit-tests/ga_scale2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scale2$(EXEEXT): $(global_testing_unit_tests_ga_scale2_OBJECTS) $(global_testing_unit_tests_ga_scale2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scale2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scale2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scale2_OBJECTS) $(global_testing_unit_tests_ga_scale2_LDADD) $(LIBS) global/testing/unit-tests/ga_scale_cols.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scale_cols$(EXEEXT): $(global_testing_unit_tests_ga_scale_cols_OBJECTS) $(global_testing_unit_tests_ga_scale_cols_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scale_cols_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scale_cols$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scale_cols_OBJECTS) $(global_testing_unit_tests_ga_scale_cols_LDADD) $(LIBS) global/testing/unit-tests/ga_scale_patch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scale_patch$(EXEEXT): $(global_testing_unit_tests_ga_scale_patch_OBJECTS) $(global_testing_unit_tests_ga_scale_patch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scale_patch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scale_patch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scale_patch_OBJECTS) $(global_testing_unit_tests_ga_scale_patch_LDADD) $(LIBS) global/testing/unit-tests/ga_scale_rows.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scale_rows$(EXEEXT): $(global_testing_unit_tests_ga_scale_rows_OBJECTS) $(global_testing_unit_tests_ga_scale_rows_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scale_rows_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scale_rows$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scale_rows_OBJECTS) $(global_testing_unit_tests_ga_scale_rows_LDADD) $(LIBS) global/testing/unit-tests/ga_scatter.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_scatter$(EXEEXT): $(global_testing_unit_tests_ga_scatter_OBJECTS) $(global_testing_unit_tests_ga_scatter_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_scatter_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_scatter$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_scatter_OBJECTS) $(global_testing_unit_tests_ga_scatter_LDADD) $(LIBS) global/testing/unit-tests/ga_set_data.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_set_data$(EXEEXT): $(global_testing_unit_tests_ga_set_data_OBJECTS) $(global_testing_unit_tests_ga_set_data_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_set_data_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_set_data$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_set_data_OBJECTS) $(global_testing_unit_tests_ga_set_data_LDADD) $(LIBS) global/testing/unit-tests/ga_set_diagonal.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_set_diagonal$(EXEEXT): $(global_testing_unit_tests_ga_set_diagonal_OBJECTS) $(global_testing_unit_tests_ga_set_diagonal_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_set_diagonal_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_set_diagonal$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_set_diagonal_OBJECTS) $(global_testing_unit_tests_ga_set_diagonal_LDADD) $(LIBS) global/testing/unit-tests/ga_set_restricted.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_set_restricted$(EXEEXT): $(global_testing_unit_tests_ga_set_restricted_OBJECTS) $(global_testing_unit_tests_ga_set_restricted_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_set_restricted_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_set_restricted$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_set_restricted_OBJECTS) $(global_testing_unit_tests_ga_set_restricted_LDADD) $(LIBS) global/testing/unit-tests/ga_solve.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_solve$(EXEEXT): $(global_testing_unit_tests_ga_solve_OBJECTS) $(global_testing_unit_tests_ga_solve_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_solve_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_solve$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_solve_OBJECTS) $(global_testing_unit_tests_ga_solve_LDADD) $(LIBS) global/testing/unit-tests/ga_sync.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_sync$(EXEEXT): $(global_testing_unit_tests_ga_sync_OBJECTS) $(global_testing_unit_tests_ga_sync_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_sync_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_sync$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_sync_OBJECTS) $(global_testing_unit_tests_ga_sync_LDADD) $(LIBS) global/testing/unit-tests/ga_transpose.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_transpose$(EXEEXT): $(global_testing_unit_tests_ga_transpose_OBJECTS) $(global_testing_unit_tests_ga_transpose_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_transpose_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_transpose$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_transpose_OBJECTS) $(global_testing_unit_tests_ga_transpose_LDADD) $(LIBS) global/testing/unit-tests/ga_transpose2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_transpose2$(EXEEXT): $(global_testing_unit_tests_ga_transpose2_OBJECTS) $(global_testing_unit_tests_ga_transpose2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_transpose2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_transpose2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_transpose2_OBJECTS) $(global_testing_unit_tests_ga_transpose2_LDADD) $(LIBS) global/testing/unit-tests/ga_transpose3.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_transpose3$(EXEEXT): $(global_testing_unit_tests_ga_transpose3_OBJECTS) $(global_testing_unit_tests_ga_transpose3_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_transpose3_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_transpose3$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_transpose3_OBJECTS) $(global_testing_unit_tests_ga_transpose3_LDADD) $(LIBS) global/testing/unit-tests/ga_zero.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_zero$(EXEEXT): $(global_testing_unit_tests_ga_zero_OBJECTS) $(global_testing_unit_tests_ga_zero_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_zero_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_zero$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_zero_OBJECTS) $(global_testing_unit_tests_ga_zero_LDADD) $(LIBS) global/testing/unit-tests/ga_zerodiagonal.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_zerodiagonal$(EXEEXT): $(global_testing_unit_tests_ga_zerodiagonal_OBJECTS) $(global_testing_unit_tests_ga_zerodiagonal_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_zerodiagonal_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_zerodiagonal$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_zerodiagonal_OBJECTS) $(global_testing_unit_tests_ga_zerodiagonal_LDADD) $(LIBS) global/testing/unit-tests/ga_zeropatch.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_zeropatch$(EXEEXT): $(global_testing_unit_tests_ga_zeropatch_OBJECTS) $(global_testing_unit_tests_ga_zeropatch_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_zeropatch_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_zeropatch$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_zeropatch_OBJECTS) $(global_testing_unit_tests_ga_zeropatch_LDADD) $(LIBS) global/testing/unit-tests/ga_zeropatch2.$(OBJEXT): \ global/testing/unit-tests/$(am__dirstamp) \ global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) global/testing/unit-tests/ga_zeropatch2$(EXEEXT): $(global_testing_unit_tests_ga_zeropatch2_OBJECTS) $(global_testing_unit_tests_ga_zeropatch2_DEPENDENCIES) $(EXTRA_global_testing_unit_tests_ga_zeropatch2_DEPENDENCIES) global/testing/unit-tests/$(am__dirstamp) @rm -f global/testing/unit-tests/ga_zeropatch2$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unit_tests_ga_zeropatch2_OBJECTS) $(global_testing_unit_tests_ga_zeropatch2_LDADD) $(LIBS) global/testing/unpackc.$(OBJEXT): global/testing/$(am__dirstamp) \ global/testing/$(DEPDIR)/$(am__dirstamp) global/testing/unpackc$(EXEEXT): $(global_testing_unpackc_OBJECTS) $(global_testing_unpackc_DEPENDENCIES) $(EXTRA_global_testing_unpackc_DEPENDENCIES) global/testing/$(am__dirstamp) @rm -f global/testing/unpackc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(global_testing_unpackc_OBJECTS) $(global_testing_unpackc_LDADD) $(LIBS) global/trace/$(am__dirstamp): @$(MKDIR_P) global/trace @: > global/trace/$(am__dirstamp) global/trace/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) global/trace/$(DEPDIR) @: > global/trace/$(DEPDIR)/$(am__dirstamp) global/trace/adjust.$(OBJEXT): global/trace/$(am__dirstamp) \ global/trace/$(DEPDIR)/$(am__dirstamp) global/trace/adjust$(EXEEXT): $(global_trace_adjust_OBJECTS) $(global_trace_adjust_DEPENDENCIES) $(EXTRA_global_trace_adjust_DEPENDENCIES) global/trace/$(am__dirstamp) @rm -f global/trace/adjust$(EXEEXT) $(AM_V_CCLD)$(global_trace_adjust_LINK) $(global_trace_adjust_OBJECTS) $(global_trace_adjust_LDADD) $(LIBS) global/trace/collisions.$(OBJEXT): global/trace/$(am__dirstamp) \ global/trace/$(DEPDIR)/$(am__dirstamp) global/trace/collisions$(EXEEXT): $(global_trace_collisions_OBJECTS) $(global_trace_collisions_DEPENDENCIES) $(EXTRA_global_trace_collisions_DEPENDENCIES) global/trace/$(am__dirstamp) @rm -f global/trace/collisions$(EXEEXT) $(AM_V_CCLD)$(global_trace_collisions_LINK) $(global_trace_collisions_OBJECTS) $(global_trace_collisions_LDADD) $(LIBS) gparrays/testing/$(am__dirstamp): @$(MKDIR_P) gparrays/testing @: > gparrays/testing/$(am__dirstamp) gparrays/testing/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gparrays/testing/$(DEPDIR) @: > gparrays/testing/$(DEPDIR)/$(am__dirstamp) gparrays/testing/test.$(OBJEXT): gparrays/testing/$(am__dirstamp) \ gparrays/testing/$(DEPDIR)/$(am__dirstamp) gparrays/testing/test$(EXEEXT): $(gparrays_testing_test_OBJECTS) $(gparrays_testing_test_DEPENDENCIES) $(EXTRA_gparrays_testing_test_DEPENDENCIES) gparrays/testing/$(am__dirstamp) @rm -f gparrays/testing/test$(EXEEXT) $(AM_V_F77LD)$(gparrays_testing_test_LINK) $(gparrays_testing_test_OBJECTS) $(gparrays_testing_test_LDADD) $(LIBS) gparrays/testing/testc.$(OBJEXT): gparrays/testing/$(am__dirstamp) \ gparrays/testing/$(DEPDIR)/$(am__dirstamp) gparrays/testing/testc$(EXEEXT): $(gparrays_testing_testc_OBJECTS) $(gparrays_testing_testc_DEPENDENCIES) $(EXTRA_gparrays_testing_testc_DEPENDENCIES) gparrays/testing/$(am__dirstamp) @rm -f gparrays/testing/testc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(gparrays_testing_testc_OBJECTS) $(gparrays_testing_testc_LDADD) $(LIBS) gparrays/testing/transpose.$(OBJEXT): \ gparrays/testing/$(am__dirstamp) \ gparrays/testing/$(DEPDIR)/$(am__dirstamp) gparrays/testing/transpose$(EXEEXT): $(gparrays_testing_transpose_OBJECTS) $(gparrays_testing_transpose_DEPENDENCIES) $(EXTRA_gparrays_testing_transpose_DEPENDENCIES) gparrays/testing/$(am__dirstamp) @rm -f gparrays/testing/transpose$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(gparrays_testing_transpose_OBJECTS) $(gparrays_testing_transpose_LDADD) $(LIBS) ma/test-coalesce.$(OBJEXT): ma/$(am__dirstamp) \ ma/$(DEPDIR)/$(am__dirstamp) ma/test-coalesce$(EXEEXT): $(ma_test_coalesce_OBJECTS) $(ma_test_coalesce_DEPENDENCIES) $(EXTRA_ma_test_coalesce_DEPENDENCIES) ma/$(am__dirstamp) @rm -f ma/test-coalesce$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(ma_test_coalesce_OBJECTS) $(ma_test_coalesce_LDADD) $(LIBS) ma/test-inquire.$(OBJEXT): ma/$(am__dirstamp) \ ma/$(DEPDIR)/$(am__dirstamp) ma/test-inquire$(EXEEXT): $(ma_test_inquire_OBJECTS) $(ma_test_inquire_DEPENDENCIES) $(EXTRA_ma_test_inquire_DEPENDENCIES) ma/$(am__dirstamp) @rm -f ma/test-inquire$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(ma_test_inquire_OBJECTS) $(ma_test_inquire_LDADD) $(LIBS) ma/testc.$(OBJEXT): ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/testc$(EXEEXT): $(ma_testc_OBJECTS) $(ma_testc_DEPENDENCIES) $(EXTRA_ma_testc_DEPENDENCIES) ma/$(am__dirstamp) @rm -f ma/testc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(ma_testc_OBJECTS) $(ma_testc_LDADD) $(LIBS) ma/testf.$(OBJEXT): ma/$(am__dirstamp) ma/$(DEPDIR)/$(am__dirstamp) ma/testf$(EXEEXT): $(ma_testf_OBJECTS) $(ma_testf_DEPENDENCIES) $(EXTRA_ma_testf_DEPENDENCIES) ma/$(am__dirstamp) @rm -f ma/testf$(EXEEXT) $(AM_V_F77LD)$(ma_testf_LINK) $(ma_testf_OBJECTS) $(ma_testf_LDADD) $(LIBS) pario/dra/big.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/ffflush.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/util.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/big$(EXEEXT): $(pario_dra_big_OBJECTS) $(pario_dra_big_DEPENDENCIES) $(EXTRA_pario_dra_big_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/big$(EXEEXT) $(AM_V_F77LD)$(pario_dra_big_LINK) $(pario_dra_big_OBJECTS) $(pario_dra_big_LDADD) $(LIBS) pario/dra/bign.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/bign$(EXEEXT): $(pario_dra_bign_OBJECTS) $(pario_dra_bign_DEPENDENCIES) $(EXTRA_pario_dra_bign_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/bign$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_bign_OBJECTS) $(pario_dra_bign_LDADD) $(LIBS) pario/dra/dbg_read.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/dbg_read$(EXEEXT): $(pario_dra_dbg_read_OBJECTS) $(pario_dra_dbg_read_DEPENDENCIES) $(EXTRA_pario_dra_dbg_read_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/dbg_read$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_dbg_read_OBJECTS) $(pario_dra_dbg_read_LDADD) $(LIBS) pario/dra/dbg_write.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/dbg_write$(EXEEXT): $(pario_dra_dbg_write_OBJECTS) $(pario_dra_dbg_write_DEPENDENCIES) $(EXTRA_pario_dra_dbg_write_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/dbg_write$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_dbg_write_OBJECTS) $(pario_dra_dbg_write_LDADD) $(LIBS) pario/dra/dra2arviz.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/dra2arviz$(EXEEXT): $(pario_dra_dra2arviz_OBJECTS) $(pario_dra_dra2arviz_DEPENDENCIES) $(EXTRA_pario_dra_dra2arviz_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/dra2arviz$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_dra2arviz_OBJECTS) $(pario_dra_dra2arviz_LDADD) $(LIBS) pario/dra/dra_mxm.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/dra_mxm$(EXEEXT): $(pario_dra_dra_mxm_OBJECTS) $(pario_dra_dra_mxm_DEPENDENCIES) $(EXTRA_pario_dra_dra_mxm_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/dra_mxm$(EXEEXT) $(AM_V_F77LD)$(pario_dra_dra_mxm_LINK) $(pario_dra_dra_mxm_OBJECTS) $(pario_dra_dra_mxm_LDADD) $(LIBS) pario/dra/ntest.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/ntest$(EXEEXT): $(pario_dra_ntest_OBJECTS) $(pario_dra_ntest_DEPENDENCIES) $(EXTRA_pario_dra_ntest_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/ntest$(EXEEXT) $(AM_V_F77LD)$(pario_dra_ntest_LINK) $(pario_dra_ntest_OBJECTS) $(pario_dra_ntest_LDADD) $(LIBS) pario/dra/ntestc.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/ntestc$(EXEEXT): $(pario_dra_ntestc_OBJECTS) $(pario_dra_ntestc_DEPENDENCIES) $(EXTRA_pario_dra_ntestc_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/ntestc$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_ntestc_OBJECTS) $(pario_dra_ntestc_LDADD) $(LIBS) pario/dra/perf.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/perf$(EXEEXT): $(pario_dra_perf_OBJECTS) $(pario_dra_perf_DEPENDENCIES) $(EXTRA_pario_dra_perf_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/perf$(EXEEXT) $(AM_V_F77LD)$(pario_dra_perf_LINK) $(pario_dra_perf_OBJECTS) $(pario_dra_perf_LDADD) $(LIBS) pario/dra/perf2.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/perf2$(EXEEXT): $(pario_dra_perf2_OBJECTS) $(pario_dra_perf2_DEPENDENCIES) $(EXTRA_pario_dra_perf2_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/perf2$(EXEEXT) $(AM_V_F77LD)$(pario_dra_perf2_LINK) $(pario_dra_perf2_OBJECTS) $(pario_dra_perf2_LDADD) $(LIBS) pario/dra/perf3.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/perf3$(EXEEXT): $(pario_dra_perf3_OBJECTS) $(pario_dra_perf3_DEPENDENCIES) $(EXTRA_pario_dra_perf3_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/perf3$(EXEEXT) $(AM_V_F77LD)$(pario_dra_perf3_LINK) $(pario_dra_perf3_OBJECTS) $(pario_dra_perf3_LDADD) $(LIBS) pario/dra/perfn.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/perfn$(EXEEXT): $(pario_dra_perfn_OBJECTS) $(pario_dra_perfn_DEPENDENCIES) $(EXTRA_pario_dra_perfn_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/perfn$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_perfn_OBJECTS) $(pario_dra_perfn_LDADD) $(LIBS) pario/dra/rate.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/rate$(EXEEXT): $(pario_dra_rate_OBJECTS) $(pario_dra_rate_DEPENDENCIES) $(EXTRA_pario_dra_rate_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/rate$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(pario_dra_rate_OBJECTS) $(pario_dra_rate_LDADD) $(LIBS) pario/dra/test.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/test$(EXEEXT): $(pario_dra_test_OBJECTS) $(pario_dra_test_DEPENDENCIES) $(EXTRA_pario_dra_test_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/test$(EXEEXT) $(AM_V_F77LD)$(pario_dra_test_LINK) $(pario_dra_test_OBJECTS) $(pario_dra_test_LDADD) $(LIBS) pario/dra/test_mxm.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/test_mxm$(EXEEXT): $(pario_dra_test_mxm_OBJECTS) $(pario_dra_test_mxm_DEPENDENCIES) $(EXTRA_pario_dra_test_mxm_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/test_mxm$(EXEEXT) $(AM_V_F77LD)$(pario_dra_test_mxm_LINK) $(pario_dra_test_mxm_OBJECTS) $(pario_dra_test_mxm_LDADD) $(LIBS) pario/dra/time_mxm.$(OBJEXT): pario/dra/$(am__dirstamp) \ pario/dra/$(DEPDIR)/$(am__dirstamp) pario/dra/time_mxm$(EXEEXT): $(pario_dra_time_mxm_OBJECTS) $(pario_dra_time_mxm_DEPENDENCIES) $(EXTRA_pario_dra_time_mxm_DEPENDENCIES) pario/dra/$(am__dirstamp) @rm -f pario/dra/time_mxm$(EXEEXT) $(AM_V_F77LD)$(pario_dra_time_mxm_LINK) $(pario_dra_time_mxm_OBJECTS) $(pario_dra_time_mxm_LDADD) $(LIBS) pario/eaf/test.$(OBJEXT): pario/eaf/$(am__dirstamp) \ pario/eaf/$(DEPDIR)/$(am__dirstamp) pario/eaf/test$(EXEEXT): $(pario_eaf_test_OBJECTS) $(pario_eaf_test_DEPENDENCIES) $(EXTRA_pario_eaf_test_DEPENDENCIES) pario/eaf/$(am__dirstamp) @rm -f pario/eaf/test$(EXEEXT) $(AM_V_F77LD)$(pario_eaf_test_LINK) $(pario_eaf_test_OBJECTS) $(pario_eaf_test_LDADD) $(LIBS) pario/sf/test.$(OBJEXT): pario/sf/$(am__dirstamp) \ pario/sf/$(DEPDIR)/$(am__dirstamp) pario/sf/test$(EXEEXT): $(pario_sf_test_OBJECTS) $(pario_sf_test_DEPENDENCIES) $(EXTRA_pario_sf_test_DEPENDENCIES) pario/sf/$(am__dirstamp) @rm -f pario/sf/test$(EXEEXT) $(AM_V_F77LD)$(pario_sf_test_LINK) $(pario_sf_test_OBJECTS) $(pario_sf_test_LDADD) $(LIBS) tcgmsg/tests/$(am__dirstamp): @$(MKDIR_P) tcgmsg/tests @: > tcgmsg/tests/$(am__dirstamp) tcgmsg/tests/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tcgmsg/tests/$(DEPDIR) @: > tcgmsg/tests/$(DEPDIR)/$(am__dirstamp) tcgmsg/tests/test.$(OBJEXT): tcgmsg/tests/$(am__dirstamp) \ tcgmsg/tests/$(DEPDIR)/$(am__dirstamp) tcgmsg/tests/test$(EXEEXT): $(tcgmsg_tests_test_OBJECTS) $(tcgmsg_tests_test_DEPENDENCIES) $(EXTRA_tcgmsg_tests_test_DEPENDENCIES) tcgmsg/tests/$(am__dirstamp) @rm -f tcgmsg/tests/test$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(tcgmsg_tests_test_OBJECTS) $(tcgmsg_tests_test_LDADD) $(LIBS) tcgmsg/tests/test_asyn.$(OBJEXT): tcgmsg/tests/$(am__dirstamp) \ tcgmsg/tests/$(DEPDIR)/$(am__dirstamp) tcgmsg/tests/test_asyn$(EXEEXT): $(tcgmsg_tests_test_asyn_OBJECTS) $(tcgmsg_tests_test_asyn_DEPENDENCIES) $(EXTRA_tcgmsg_tests_test_asyn_DEPENDENCIES) tcgmsg/tests/$(am__dirstamp) @rm -f tcgmsg/tests/test_asyn$(EXEEXT) $(AM_V_F77LD)$(F77LINK) $(tcgmsg_tests_test_asyn_OBJECTS) $(tcgmsg_tests_test_asyn_LDADD) $(LIBS) tcgmsg/tests/testf.$(OBJEXT): tcgmsg/tests/$(am__dirstamp) \ tcgmsg/tests/$(DEPDIR)/$(am__dirstamp) tcgmsg/tests/testf$(EXEEXT): $(tcgmsg_tests_testf_OBJECTS) $(tcgmsg_tests_testf_DEPENDENCIES) $(EXTRA_tcgmsg_tests_testf_DEPENDENCIES) tcgmsg/tests/$(am__dirstamp) @rm -f tcgmsg/tests/testf$(EXEEXT) $(AM_V_F77LD)$(tcgmsg_tests_testf_LINK) $(tcgmsg_tests_testf_OBJECTS) $(tcgmsg_tests_testf_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_cgemm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_cgemm.lo -rm -f LinAlg/lapack+blas/gal_daxpy.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_daxpy.lo -rm -f LinAlg/lapack+blas/gal_dcabs1.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dcabs1.lo -rm -f LinAlg/lapack+blas/gal_dcopy.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dcopy.lo -rm -f LinAlg/lapack+blas/gal_ddot.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_ddot.lo -rm -f LinAlg/lapack+blas/gal_dgemm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dgemm.lo -rm -f LinAlg/lapack+blas/gal_dgemv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dgemv.lo -rm -f LinAlg/lapack+blas/gal_dger.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dger.lo -rm -f LinAlg/lapack+blas/gal_dgetf2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dgetf2.lo -rm -f LinAlg/lapack+blas/gal_dgetrf.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dgetrf.lo -rm -f LinAlg/lapack+blas/gal_dgetrs.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dgetrs.lo -rm -f LinAlg/lapack+blas/gal_disnan.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_disnan.lo -rm -f LinAlg/lapack+blas/gal_dlacpy.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlacpy.lo -rm -f LinAlg/lapack+blas/gal_dlae2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlae2.lo -rm -f LinAlg/lapack+blas/gal_dlaev2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlaev2.lo -rm -f LinAlg/lapack+blas/gal_dlaisnan.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlaisnan.lo -rm -f LinAlg/lapack+blas/gal_dlamch.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlamch.lo -rm -f LinAlg/lapack+blas/gal_dlanst.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlanst.lo -rm -f LinAlg/lapack+blas/gal_dlansy.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlansy.lo -rm -f LinAlg/lapack+blas/gal_dlapy2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlapy2.lo -rm -f LinAlg/lapack+blas/gal_dlarf.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlarf.lo -rm -f LinAlg/lapack+blas/gal_dlarfb.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlarfb.lo -rm -f LinAlg/lapack+blas/gal_dlarfg.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlarfg.lo -rm -f LinAlg/lapack+blas/gal_dlarft.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlarft.lo -rm -f LinAlg/lapack+blas/gal_dlartg.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlartg.lo -rm -f LinAlg/lapack+blas/gal_dlascl.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlascl.lo -rm -f LinAlg/lapack+blas/gal_dlaset.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlaset.lo -rm -f LinAlg/lapack+blas/gal_dlasr.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlasr.lo -rm -f LinAlg/lapack+blas/gal_dlasrt.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlasrt.lo -rm -f LinAlg/lapack+blas/gal_dlassq.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlassq.lo -rm -f LinAlg/lapack+blas/gal_dlaswp.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlaswp.lo -rm -f LinAlg/lapack+blas/gal_dlatrd.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dlatrd.lo -rm -f LinAlg/lapack+blas/gal_dnrm2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dnrm2.lo -rm -f LinAlg/lapack+blas/gal_dorg2l.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dorg2l.lo -rm -f LinAlg/lapack+blas/gal_dorg2r.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dorg2r.lo -rm -f LinAlg/lapack+blas/gal_dorgql.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dorgql.lo -rm -f LinAlg/lapack+blas/gal_dorgqr.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dorgqr.lo -rm -f LinAlg/lapack+blas/gal_dorgtr.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dorgtr.lo -rm -f LinAlg/lapack+blas/gal_dpotf2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dpotf2.lo -rm -f LinAlg/lapack+blas/gal_dpotrf.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dpotrf.lo -rm -f LinAlg/lapack+blas/gal_dscal.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dscal.lo -rm -f LinAlg/lapack+blas/gal_dsteqr.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsteqr.lo -rm -f LinAlg/lapack+blas/gal_dsterf.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsterf.lo -rm -f LinAlg/lapack+blas/gal_dswap.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dswap.lo -rm -f LinAlg/lapack+blas/gal_dsyev.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsyev.lo -rm -f LinAlg/lapack+blas/gal_dsygs2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsygs2.lo -rm -f LinAlg/lapack+blas/gal_dsygst.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsygst.lo -rm -f LinAlg/lapack+blas/gal_dsygv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsygv.lo -rm -f LinAlg/lapack+blas/gal_dsymm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsymm.lo -rm -f LinAlg/lapack+blas/gal_dsymv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsymv.lo -rm -f LinAlg/lapack+blas/gal_dsyr2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsyr2.lo -rm -f LinAlg/lapack+blas/gal_dsyr2k.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsyr2k.lo -rm -f LinAlg/lapack+blas/gal_dsyrk.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsyrk.lo -rm -f LinAlg/lapack+blas/gal_dsytd2.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsytd2.lo -rm -f LinAlg/lapack+blas/gal_dsytrd.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dsytrd.lo -rm -f LinAlg/lapack+blas/gal_dtrmm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dtrmm.lo -rm -f LinAlg/lapack+blas/gal_dtrmv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dtrmv.lo -rm -f LinAlg/lapack+blas/gal_dtrsm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dtrsm.lo -rm -f LinAlg/lapack+blas/gal_dtrsv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_dtrsv.lo -rm -f LinAlg/lapack+blas/gal_idamax.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_idamax.lo -rm -f LinAlg/lapack+blas/gal_ieeeck.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_ieeeck.lo -rm -f LinAlg/lapack+blas/gal_iladlc.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_iladlc.lo -rm -f LinAlg/lapack+blas/gal_iladlr.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_iladlr.lo -rm -f LinAlg/lapack+blas/gal_ilaenv.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_ilaenv.lo -rm -f LinAlg/lapack+blas/gal_iparmq.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_iparmq.lo -rm -f LinAlg/lapack+blas/gal_lsame.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_lsame.lo -rm -f LinAlg/lapack+blas/gal_sgemm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_sgemm.lo -rm -f LinAlg/lapack+blas/gal_xerbla.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_xerbla.lo -rm -f LinAlg/lapack+blas/gal_zaxpy.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_zaxpy.lo -rm -f LinAlg/lapack+blas/gal_zgemm.$(OBJEXT) -rm -f LinAlg/lapack+blas/gal_zgemm.lo -rm -f LinAlg/lapack+blas/xgemm.$(OBJEXT) -rm -f LinAlg/lapack+blas/xgemm.lo -rm -f compat/random.$(OBJEXT) -rm -f compat/random.lo -rm -f ga++/src/GAServices.$(OBJEXT) -rm -f ga++/src/GAServices.lo -rm -f ga++/src/GlobalArray.$(OBJEXT) -rm -f ga++/src/GlobalArray.lo -rm -f ga++/src/PGroup.$(OBJEXT) -rm -f ga++/src/PGroup.lo -rm -f ga++/src/init_term.$(OBJEXT) -rm -f ga++/src/init_term.lo -rm -f ga++/src/overload.$(OBJEXT) -rm -f ga++/src/overload.lo -rm -f ga++/src/services.$(OBJEXT) -rm -f ga++/src/services.lo -rm -f ga++/testing/elempatch.$(OBJEXT) -rm -f ga++/testing/mtest.$(OBJEXT) -rm -f ga++/testing/ntestc.$(OBJEXT) -rm -f ga++/testing/testc.$(OBJEXT) -rm -f ga++/testing/testmult.$(OBJEXT) -rm -f ga++/testing/util.$(OBJEXT) -rm -f gaf2c/drand.$(OBJEXT) -rm -f gaf2c/drand.lo -rm -f gaf2c/farg.$(OBJEXT) -rm -f gaf2c/farg.lo -rm -f gaf2c/gaf2c.$(OBJEXT) -rm -f gaf2c/gaf2c.lo -rm -f gaf2c/testarg.$(OBJEXT) -rm -f gaf2c/testargf.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_colormap.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_dialog.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_display.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_fileio.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_main.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_overview.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_pixregion.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_scrollbars.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_util.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_view.$(OBJEXT) -rm -f global/X/global_X_xregion-xregion_xcmap.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-equil.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-main.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-properties.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-setup.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.$(OBJEXT) -rm -f global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.$(OBJEXT) -rm -f global/examples/conjugate_gradient/computeloops.$(OBJEXT) -rm -f global/examples/conjugate_gradient/ga_cg.$(OBJEXT) -rm -f global/examples/conjugate_gradient/matvecmul.$(OBJEXT) -rm -f global/examples/conjugate_gradient/read_input.$(OBJEXT) -rm -f global/examples/lennard-jones/lennard.$(OBJEXT) -rm -f global/examples/md_cluster/cell_list.$(OBJEXT) -rm -f global/examples/md_cluster/cl_sim.$(OBJEXT) -rm -f global/examples/md_cluster/cluster.$(OBJEXT) -rm -f global/examples/md_cluster/estats.$(OBJEXT) -rm -f global/examples/md_cluster/factor.$(OBJEXT) -rm -f global/examples/md_cluster/force.$(OBJEXT) -rm -f global/examples/md_cluster/gather.$(OBJEXT) -rm -f global/examples/md_cluster/grp_sim.$(OBJEXT) -rm -f global/examples/md_cluster/hash.$(OBJEXT) -rm -f global/examples/md_cluster/heapsort.$(OBJEXT) -rm -f global/examples/md_cluster/kin.$(OBJEXT) -rm -f global/examples/md_cluster/mdinit.$(OBJEXT) -rm -f global/examples/md_cluster/mdout.$(OBJEXT) -rm -f global/examples/md_cluster/mdstep.$(OBJEXT) -rm -f global/examples/md_cluster/newcfg.$(OBJEXT) -rm -f global/examples/md_cluster/nextc.$(OBJEXT) -rm -f global/examples/md_cluster/pairs.$(OBJEXT) -rm -f global/examples/md_cluster/ran3.$(OBJEXT) -rm -f global/examples/md_cluster/rdpar.$(OBJEXT) -rm -f global/examples/md_cluster/scatter.$(OBJEXT) -rm -f global/examples/md_cluster/shuffle.$(OBJEXT) -rm -f global/examples/md_cluster/sort.$(OBJEXT) -rm -f global/examples/md_cluster/tstats.$(OBJEXT) -rm -f global/examples/md_cluster/update.$(OBJEXT) -rm -f global/examples/scf/input.$(OBJEXT) -rm -f global/examples/scf/integ.$(OBJEXT) -rm -f global/examples/scf/output.$(OBJEXT) -rm -f global/examples/scf/scf.$(OBJEXT) -rm -f global/examples/scf/timer.$(OBJEXT) -rm -f global/src/DP.$(OBJEXT) -rm -f global/src/DP.lo -rm -f global/src/base.$(OBJEXT) -rm -f global/src/base.lo -rm -f global/src/capi.$(OBJEXT) -rm -f global/src/capi.lo -rm -f global/src/collect.$(OBJEXT) -rm -f global/src/collect.lo -rm -f global/src/complex.$(OBJEXT) -rm -f global/src/complex.lo -rm -f global/src/datatypes.$(OBJEXT) -rm -f global/src/datatypes.lo -rm -f global/src/decomp.$(OBJEXT) -rm -f global/src/decomp.lo -rm -f global/src/elem_alg.$(OBJEXT) -rm -f global/src/elem_alg.lo -rm -f global/src/fapi.$(OBJEXT) -rm -f global/src/fapi.lo -rm -f global/src/ga_ckpt.$(OBJEXT) -rm -f global/src/ga_ckpt.lo -rm -f global/src/ga_dgemmf.$(OBJEXT) -rm -f global/src/ga_dgemmf.lo -rm -f global/src/ga_diag.$(OBJEXT) -rm -f global/src/ga_diag.lo -rm -f global/src/ga_diag_seq.$(OBJEXT) -rm -f global/src/ga_diag_seq.lo -rm -f global/src/ga_diag_seqc.$(OBJEXT) -rm -f global/src/ga_diag_seqc.lo -rm -f global/src/ga_malloc.$(OBJEXT) -rm -f global/src/ga_malloc.lo -rm -f global/src/ga_solve_seq.$(OBJEXT) -rm -f global/src/ga_solve_seq.lo -rm -f global/src/ga_symmetr.$(OBJEXT) -rm -f global/src/ga_symmetr.lo -rm -f global/src/ga_trace.$(OBJEXT) -rm -f global/src/ga_trace.lo -rm -f global/src/ghosts.$(OBJEXT) -rm -f global/src/ghosts.lo -rm -f global/src/global.nalg.$(OBJEXT) -rm -f global/src/global.nalg.lo -rm -f global/src/global.npatch.$(OBJEXT) -rm -f global/src/global.npatch.lo -rm -f global/src/global.periodic.$(OBJEXT) -rm -f global/src/global.periodic.lo -rm -f global/src/global.util.$(OBJEXT) -rm -f global/src/global.util.lo -rm -f global/src/hsort.scat.$(OBJEXT) -rm -f global/src/hsort.scat.lo -rm -f global/src/matmul.$(OBJEXT) -rm -f global/src/matmul.lo -rm -f global/src/matrix.$(OBJEXT) -rm -f global/src/matrix.lo -rm -f global/src/nbutil.$(OBJEXT) -rm -f global/src/nbutil.lo -rm -f global/src/onesided.$(OBJEXT) -rm -f global/src/onesided.lo -rm -f global/src/peigstubs.$(OBJEXT) -rm -f global/src/peigstubs.lo -rm -f global/src/rsg.$(OBJEXT) -rm -f global/src/rsg.lo -rm -f global/src/scalapack.$(OBJEXT) -rm -f global/src/scalapack.lo -rm -f global/src/sclstubs.$(OBJEXT) -rm -f global/src/sclstubs.lo -rm -f global/src/select.$(OBJEXT) -rm -f global/src/select.lo -rm -f global/src/sparse.$(OBJEXT) -rm -f global/src/sparse.lo -rm -f global/testing/big.$(OBJEXT) -rm -f global/testing/bin.$(OBJEXT) -rm -f global/testing/blktest.$(OBJEXT) -rm -f global/testing/d2test.$(OBJEXT) -rm -f global/testing/elempatch.$(OBJEXT) -rm -f global/testing/ffflush.$(OBJEXT) -rm -f global/testing/field-test.$(OBJEXT) -rm -f global/testing/g2test.$(OBJEXT) -rm -f global/testing/g3test.$(OBJEXT) -rm -f global/testing/ga-mpi.$(OBJEXT) -rm -f global/testing/ga_lu.$(OBJEXT) -rm -f global/testing/ga_shift.$(OBJEXT) -rm -f global/testing/gatscat.$(OBJEXT) -rm -f global/testing/getmem.$(OBJEXT) -rm -f global/testing/ghosts.$(OBJEXT) -rm -f global/testing/global_testing_test_mirrored-ffflush.$(OBJEXT) -rm -f global/testing/global_testing_test_mirrored-test.$(OBJEXT) -rm -f global/testing/global_testing_test_mirrored-testblas.$(OBJEXT) -rm -f global/testing/global_testing_test_mirrored-util.$(OBJEXT) -rm -f global/testing/ipc.clean.$(OBJEXT) -rm -f global/testing/jacobi.$(OBJEXT) -rm -f global/testing/lock.$(OBJEXT) -rm -f global/testing/mir_perf2.$(OBJEXT) -rm -f global/testing/mmatrix.$(OBJEXT) -rm -f global/testing/mtest.$(OBJEXT) -rm -f global/testing/mulmatpatch.$(OBJEXT) -rm -f global/testing/mulmatpatchc.$(OBJEXT) -rm -f global/testing/nb2test.$(OBJEXT) -rm -f global/testing/ndim.$(OBJEXT) -rm -f global/testing/nga-onesided.$(OBJEXT) -rm -f global/testing/nga-patch.$(OBJEXT) -rm -f global/testing/nga-periodic.$(OBJEXT) -rm -f global/testing/nga-scatter.$(OBJEXT) -rm -f global/testing/nga-util.$(OBJEXT) -rm -f global/testing/ngatest.$(OBJEXT) -rm -f global/testing/normc.$(OBJEXT) -rm -f global/testing/ntestc.$(OBJEXT) -rm -f global/testing/ntestfc.$(OBJEXT) -rm -f global/testing/packc.$(OBJEXT) -rm -f global/testing/patch.$(OBJEXT) -rm -f global/testing/patch2.$(OBJEXT) -rm -f global/testing/patch_enumc.$(OBJEXT) -rm -f global/testing/patch_enumf.$(OBJEXT) -rm -f global/testing/perf.$(OBJEXT) -rm -f global/testing/perf2.$(OBJEXT) -rm -f global/testing/perfmod.$(OBJEXT) -rm -f global/testing/perform.$(OBJEXT) -rm -f global/testing/pg2test.$(OBJEXT) -rm -f global/testing/pg2testmatmult.$(OBJEXT) -rm -f global/testing/pgtest.$(OBJEXT) -rm -f global/testing/pgtestmatmult.$(OBJEXT) -rm -f global/testing/print.$(OBJEXT) -rm -f global/testing/random.$(OBJEXT) -rm -f global/testing/scan.$(OBJEXT) -rm -f global/testing/scan_addc.$(OBJEXT) -rm -f global/testing/scan_copyc.$(OBJEXT) -rm -f global/testing/simple_groups.$(OBJEXT) -rm -f global/testing/simple_groups_comm.$(OBJEXT) -rm -f global/testing/simple_groups_commc.$(OBJEXT) -rm -f global/testing/sparse.$(OBJEXT) -rm -f global/testing/sprsmatmult.$(OBJEXT) -rm -f global/testing/stride.$(OBJEXT) -rm -f global/testing/test.$(OBJEXT) -rm -f global/testing/testblas.$(OBJEXT) -rm -f global/testing/testc.$(OBJEXT) -rm -f global/testing/testeig.$(OBJEXT) -rm -f global/testing/testmatmult.$(OBJEXT) -rm -f global/testing/testmatmultc.$(OBJEXT) -rm -f global/testing/testmult.$(OBJEXT) -rm -f global/testing/testmultrect.$(OBJEXT) -rm -f global/testing/testsolve.$(OBJEXT) -rm -f global/testing/testspd.$(OBJEXT) -rm -f global/testing/types-test.$(OBJEXT) -rm -f global/testing/unit-tests/ga_abs_value.$(OBJEXT) -rm -f global/testing/unit-tests/ga_acc.$(OBJEXT) -rm -f global/testing/unit-tests/ga_add.$(OBJEXT) -rm -f global/testing/unit-tests/ga_add_constant.$(OBJEXT) -rm -f global/testing/unit-tests/ga_add_constantpatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_add_diagonal.$(OBJEXT) -rm -f global/testing/unit-tests/ga_add_patch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_copy.$(OBJEXT) -rm -f global/testing/unit-tests/ga_copy2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_copy3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_copypatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_copypatch2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create1.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create_handle.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create_irreg.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create_irreg2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_create_irreg3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_destroy.$(OBJEXT) -rm -f global/testing/unit-tests/ga_dgop.$(OBJEXT) -rm -f global/testing/unit-tests/ga_dot.$(OBJEXT) -rm -f global/testing/unit-tests/ga_duplicate.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_divide.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_dividepatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_maximum.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_maximumpatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_minimum.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_minimumpatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_multiply.$(OBJEXT) -rm -f global/testing/unit-tests/ga_elem_multiplypatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_fill.$(OBJEXT) -rm -f global/testing/unit-tests/ga_fillpatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_fillpatch1.$(OBJEXT) -rm -f global/testing/unit-tests/ga_gather.$(OBJEXT) -rm -f global/testing/unit-tests/ga_gather2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_gather3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_get.$(OBJEXT) -rm -f global/testing/unit-tests/ga_get_blockinfo.$(OBJEXT) -rm -f global/testing/unit-tests/ga_get_diagonal.$(OBJEXT) -rm -f global/testing/unit-tests/ga_igop.$(OBJEXT) -rm -f global/testing/unit-tests/ga_igop2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_inquire.$(OBJEXT) -rm -f global/testing/unit-tests/ga_intialize.$(OBJEXT) -rm -f global/testing/unit-tests/ga_lgop.$(OBJEXT) -rm -f global/testing/unit-tests/ga_median.$(OBJEXT) -rm -f global/testing/unit-tests/ga_ndim.$(OBJEXT) -rm -f global/testing/unit-tests/ga_ndim2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_nnodes.$(OBJEXT) -rm -f global/testing/unit-tests/ga_nodeid.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_create.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_create2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_create3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_create4.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_create5.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_destroy.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_destroy2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_nnodes_nodeid.$(OBJEXT) -rm -f global/testing/unit-tests/ga_pgroup_setdefault.$(OBJEXT) -rm -f global/testing/unit-tests/ga_put.$(OBJEXT) -rm -f global/testing/unit-tests/ga_put2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scale.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scale2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scale_cols.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scale_patch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scale_rows.$(OBJEXT) -rm -f global/testing/unit-tests/ga_scatter.$(OBJEXT) -rm -f global/testing/unit-tests/ga_set_data.$(OBJEXT) -rm -f global/testing/unit-tests/ga_set_diagonal.$(OBJEXT) -rm -f global/testing/unit-tests/ga_set_restricted.$(OBJEXT) -rm -f global/testing/unit-tests/ga_solve.$(OBJEXT) -rm -f global/testing/unit-tests/ga_sync.$(OBJEXT) -rm -f global/testing/unit-tests/ga_transpose.$(OBJEXT) -rm -f global/testing/unit-tests/ga_transpose2.$(OBJEXT) -rm -f global/testing/unit-tests/ga_transpose3.$(OBJEXT) -rm -f global/testing/unit-tests/ga_zero.$(OBJEXT) -rm -f global/testing/unit-tests/ga_zerodiagonal.$(OBJEXT) -rm -f global/testing/unit-tests/ga_zeropatch.$(OBJEXT) -rm -f global/testing/unit-tests/ga_zeropatch2.$(OBJEXT) -rm -f global/testing/unit-tests/mock.$(OBJEXT) -rm -f global/testing/unpackc.$(OBJEXT) -rm -f global/testing/util.$(OBJEXT) -rm -f global/trace/adjust.$(OBJEXT) -rm -f global/trace/collisions.$(OBJEXT) -rm -f gparrays/src/gpbase.$(OBJEXT) -rm -f gparrays/src/gpbase.lo -rm -f gparrays/src/gpcapi.$(OBJEXT) -rm -f gparrays/src/gpcapi.lo -rm -f gparrays/src/gpfapi.$(OBJEXT) -rm -f gparrays/src/gpfapi.lo -rm -f gparrays/src/gponesided.$(OBJEXT) -rm -f gparrays/src/gponesided.lo -rm -f gparrays/testing/test.$(OBJEXT) -rm -f gparrays/testing/testc.$(OBJEXT) -rm -f gparrays/testing/transpose.$(OBJEXT) -rm -f ma/error.$(OBJEXT) -rm -f ma/error.lo -rm -f ma/f2c.$(OBJEXT) -rm -f ma/f2c.lo -rm -f ma/ma.$(OBJEXT) -rm -f ma/ma.lo -rm -f ma/maf.$(OBJEXT) -rm -f ma/maf.lo -rm -f ma/string-util.$(OBJEXT) -rm -f ma/string-util.lo -rm -f ma/table.$(OBJEXT) -rm -f ma/table.lo -rm -f ma/test-coalesce.$(OBJEXT) -rm -f ma/test-inquire.$(OBJEXT) -rm -f ma/testc.$(OBJEXT) -rm -f ma/testf.$(OBJEXT) -rm -f pario/dra/big.$(OBJEXT) -rm -f pario/dra/bign.$(OBJEXT) -rm -f pario/dra/buffers.$(OBJEXT) -rm -f pario/dra/buffers.lo -rm -f pario/dra/capi.$(OBJEXT) -rm -f pario/dra/capi.lo -rm -f pario/dra/dbg_read.$(OBJEXT) -rm -f pario/dra/dbg_write.$(OBJEXT) -rm -f pario/dra/disk.arrays.$(OBJEXT) -rm -f pario/dra/disk.arrays.lo -rm -f pario/dra/disk.param.$(OBJEXT) -rm -f pario/dra/disk.param.lo -rm -f pario/dra/dra2arviz.$(OBJEXT) -rm -f pario/dra/dra_mxm.$(OBJEXT) -rm -f pario/dra/env.$(OBJEXT) -rm -f pario/dra/env.lo -rm -f pario/dra/ffflush.$(OBJEXT) -rm -f pario/dra/fortran.$(OBJEXT) -rm -f pario/dra/fortran.lo -rm -f pario/dra/ntest.$(OBJEXT) -rm -f pario/dra/ntestc.$(OBJEXT) -rm -f pario/dra/patch.util.$(OBJEXT) -rm -f pario/dra/patch.util.lo -rm -f pario/dra/perf.$(OBJEXT) -rm -f pario/dra/perf2.$(OBJEXT) -rm -f pario/dra/perf3.$(OBJEXT) -rm -f pario/dra/perfn.$(OBJEXT) -rm -f pario/dra/rate.$(OBJEXT) -rm -f pario/dra/test.$(OBJEXT) -rm -f pario/dra/test_mxm.$(OBJEXT) -rm -f pario/dra/time_mxm.$(OBJEXT) -rm -f pario/dra/util.$(OBJEXT) -rm -f pario/eaf/eaf.$(OBJEXT) -rm -f pario/eaf/eaf.lo -rm -f pario/eaf/eaf_f2c.$(OBJEXT) -rm -f pario/eaf/eaf_f2c.lo -rm -f pario/eaf/test.$(OBJEXT) -rm -f pario/elio/elio.$(OBJEXT) -rm -f pario/elio/elio.lo -rm -f pario/elio/stat.$(OBJEXT) -rm -f pario/elio/stat.lo -rm -f pario/sf/sf_capi.$(OBJEXT) -rm -f pario/sf/sf_capi.lo -rm -f pario/sf/sf_fortran.$(OBJEXT) -rm -f pario/sf/sf_fortran.lo -rm -f pario/sf/shared.files.$(OBJEXT) -rm -f pario/sf/shared.files.lo -rm -f pario/sf/test.$(OBJEXT) -rm -f tcgmsg/capi.$(OBJEXT) -rm -f tcgmsg/capi.lo -rm -f tcgmsg/fapi.$(OBJEXT) -rm -f tcgmsg/fapi.lo -rm -f tcgmsg/tcgmsg-mpi/checkbyte.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/checkbyte.lo -rm -f tcgmsg/tcgmsg-mpi/clustercheck.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/clustercheck.lo -rm -f tcgmsg/tcgmsg-mpi/collect.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/collect.lo -rm -f tcgmsg/tcgmsg-mpi/drand48.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/drand48.lo -rm -f tcgmsg/tcgmsg-mpi/evlog.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/evlog.lo -rm -f tcgmsg/tcgmsg-mpi/evon.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/evon.lo -rm -f tcgmsg/tcgmsg-mpi/llog.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/llog.lo -rm -f tcgmsg/tcgmsg-mpi/misc.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/misc.lo -rm -f tcgmsg/tcgmsg-mpi/niceftn.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/niceftn.lo -rm -f tcgmsg/tcgmsg-mpi/nxtval-armci.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/nxtval-armci.lo -rm -f tcgmsg/tcgmsg-mpi/p2p.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/p2p.lo -rm -f tcgmsg/tcgmsg-mpi/pbeginf.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/pbeginf.lo -rm -f tcgmsg/tcgmsg-mpi/pfilecopy.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/pfilecopy.lo -rm -f tcgmsg/tcgmsg-mpi/sizeof.$(OBJEXT) -rm -f tcgmsg/tcgmsg-mpi/sizeof.lo -rm -f tcgmsg/tests/test.$(OBJEXT) -rm -f tcgmsg/tests/test_asyn.$(OBJEXT) -rm -f tcgmsg/tests/testf.$(OBJEXT) -rm -f tools/ga-wapi.$(OBJEXT) -rm -f tools/ga-wapi.lo -rm -f tools/gp-wapi.$(OBJEXT) -rm -f tools/gp-wapi.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@LinAlg/lapack+blas/$(DEPDIR)/xgemm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/random.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/GAServices.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/GlobalArray.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/PGroup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/init_term.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/overload.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/src/$(DEPDIR)/services.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/elempatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/mtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/ntestc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/testc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/testmult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ga++/testing/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gaf2c/$(DEPDIR)/drand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gaf2c/$(DEPDIR)/gaf2c.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gaf2c/$(DEPDIR)/testarg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_view.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/examples/conjugate_gradient/$(DEPDIR)/ga_cg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/examples/conjugate_gradient/$(DEPDIR)/matvecmul.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/examples/conjugate_gradient/$(DEPDIR)/read_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/examples/lennard-jones/$(DEPDIR)/lennard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/DP.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/base.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/capi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/collect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/datatypes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/decomp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/elem_alg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/fapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_ckpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_diag_seqc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_solve_seq.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_symmetr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ga_trace.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/ghosts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/global.nalg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/global.npatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/global.periodic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/global.util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/hsort.scat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/matmul.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/nbutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/onesided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/peigstubs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/sclstubs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/select.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/src/$(DEPDIR)/sparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/big.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/elempatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/ga-mpi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/ga_lu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/gatscat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/getmem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/ipc.clean.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/lock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/mtest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/mulmatpatchc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/normc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/ntestc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/ntestfc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/packc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/patch_enumc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/perf2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/print.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/scan_addc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/scan_copyc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/simple_groups_commc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/testc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/testmatmultc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/testmult.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/testmultrect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/unpackc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_abs_value.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_acc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_add.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_add_constant.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_add_constantpatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_add_diagonal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_add_patch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_copy2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_copy3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_copypatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_copypatch2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create_irreg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create_irreg2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_create_irreg3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_destroy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_dgop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_dot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_duplicate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_divide.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_dividepatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_maximum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_maximumpatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_minimum.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_minimumpatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_multiply.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_elem_multiplypatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_fill.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_fillpatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_fillpatch1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_gather.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_gather2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_gather3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_get.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_get_blockinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_get_diagonal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_igop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_igop2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_inquire.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_intialize.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_lgop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_median.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_ndim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_ndim2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_nnodes.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_nodeid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_create.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_create2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_create3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_create4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_create5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_destroy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_destroy2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_nnodes_nodeid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_pgroup_setdefault.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_put.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_put2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scale.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scale2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scale_cols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scale_patch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scale_rows.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_scatter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_set_data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_set_diagonal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_set_restricted.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_solve.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_sync.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_transpose.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_transpose2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_transpose3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_zero.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_zerodiagonal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_zeropatch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/ga_zeropatch2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/testing/unit-tests/$(DEPDIR)/mock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/trace/$(DEPDIR)/adjust.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@global/trace/$(DEPDIR)/collisions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/src/$(DEPDIR)/gpbase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/src/$(DEPDIR)/gpcapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/src/$(DEPDIR)/gpfapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/src/$(DEPDIR)/gponesided.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/testing/$(DEPDIR)/testc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gparrays/testing/$(DEPDIR)/transpose.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/f2c.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/ma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/string-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/test-coalesce.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/test-inquire.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@ma/$(DEPDIR)/testc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/bign.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/buffers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/capi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/dbg_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/dbg_write.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/disk.arrays.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/disk.param.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/dra2arviz.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/fortran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/ntestc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/patch.util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/perfn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/rate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/dra/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/eaf/$(DEPDIR)/eaf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/eaf/$(DEPDIR)/eaf_f2c.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/elio/$(DEPDIR)/elio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/elio/$(DEPDIR)/stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/sf/$(DEPDIR)/sf_capi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/sf/$(DEPDIR)/sf_fortran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@pario/sf/$(DEPDIR)/shared.files.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/$(DEPDIR)/capi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/$(DEPDIR)/fapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/checkbyte.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/clustercheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/collect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/drand48.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/evlog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/evon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/llog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/niceftn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/nxtval-armci.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/p2p.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/pbeginf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/pfilecopy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tcgmsg-mpi/$(DEPDIR)/sizeof.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tests/$(DEPDIR)/test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tcgmsg/tests/$(DEPDIR)/test_asyn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/ga-wapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tools/$(DEPDIR)/gp-wapi.Plo@am__quote@ .F.o: $(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ $< .F.obj: $(AM_V_PPF77)$(PPF77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .F.lo: $(AM_V_PPF77)$(LTPPF77COMPILE) -c -o $@ $< global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.o: global/examples/boltzmann/boltzmann.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.o `test -f 'global/examples/boltzmann/boltzmann.F' || echo '$(srcdir)/'`global/examples/boltzmann/boltzmann.F global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.obj: global/examples/boltzmann/boltzmann.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-boltzmann.obj `if test -f 'global/examples/boltzmann/boltzmann.F'; then $(CYGPATH_W) 'global/examples/boltzmann/boltzmann.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/boltzmann.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-equil.o: global/examples/boltzmann/equil.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-equil.o `test -f 'global/examples/boltzmann/equil.F' || echo '$(srcdir)/'`global/examples/boltzmann/equil.F global/examples/boltzmann/global_examples_boltzmann_boltz-equil.obj: global/examples/boltzmann/equil.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-equil.obj `if test -f 'global/examples/boltzmann/equil.F'; then $(CYGPATH_W) 'global/examples/boltzmann/equil.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/equil.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.o: global/examples/boltzmann/get_patch.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.o `test -f 'global/examples/boltzmann/get_patch.F' || echo '$(srcdir)/'`global/examples/boltzmann/get_patch.F global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.obj: global/examples/boltzmann/get_patch.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-get_patch.obj `if test -f 'global/examples/boltzmann/get_patch.F'; then $(CYGPATH_W) 'global/examples/boltzmann/get_patch.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/get_patch.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.o: global/examples/boltzmann/initpar.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.o `test -f 'global/examples/boltzmann/initpar.F' || echo '$(srcdir)/'`global/examples/boltzmann/initpar.F global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.obj: global/examples/boltzmann/initpar.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-initpar.obj `if test -f 'global/examples/boltzmann/initpar.F'; then $(CYGPATH_W) 'global/examples/boltzmann/initpar.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/initpar.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-main.o: global/examples/boltzmann/main.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-main.o `test -f 'global/examples/boltzmann/main.F' || echo '$(srcdir)/'`global/examples/boltzmann/main.F global/examples/boltzmann/global_examples_boltzmann_boltz-main.obj: global/examples/boltzmann/main.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-main.obj `if test -f 'global/examples/boltzmann/main.F'; then $(CYGPATH_W) 'global/examples/boltzmann/main.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/main.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.o: global/examples/boltzmann/printdat.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.o `test -f 'global/examples/boltzmann/printdat.F' || echo '$(srcdir)/'`global/examples/boltzmann/printdat.F global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.obj: global/examples/boltzmann/printdat.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-printdat.obj `if test -f 'global/examples/boltzmann/printdat.F'; then $(CYGPATH_W) 'global/examples/boltzmann/printdat.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/printdat.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-properties.o: global/examples/boltzmann/properties.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-properties.o `test -f 'global/examples/boltzmann/properties.F' || echo '$(srcdir)/'`global/examples/boltzmann/properties.F global/examples/boltzmann/global_examples_boltzmann_boltz-properties.obj: global/examples/boltzmann/properties.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-properties.obj `if test -f 'global/examples/boltzmann/properties.F'; then $(CYGPATH_W) 'global/examples/boltzmann/properties.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/properties.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-setup.o: global/examples/boltzmann/setup.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-setup.o `test -f 'global/examples/boltzmann/setup.F' || echo '$(srcdir)/'`global/examples/boltzmann/setup.F global/examples/boltzmann/global_examples_boltzmann_boltz-setup.obj: global/examples/boltzmann/setup.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-setup.obj `if test -f 'global/examples/boltzmann/setup.F'; then $(CYGPATH_W) 'global/examples/boltzmann/setup.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/setup.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.o: global/examples/boltzmann/timestep.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.o `test -f 'global/examples/boltzmann/timestep.F' || echo '$(srcdir)/'`global/examples/boltzmann/timestep.F global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.obj: global/examples/boltzmann/timestep.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-timestep.obj `if test -f 'global/examples/boltzmann/timestep.F'; then $(CYGPATH_W) 'global/examples/boltzmann/timestep.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/timestep.F'; fi` global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.o: global/examples/boltzmann/vorticity.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.o `test -f 'global/examples/boltzmann/vorticity.F' || echo '$(srcdir)/'`global/examples/boltzmann/vorticity.F global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.obj: global/examples/boltzmann/vorticity.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_examples_boltzmann_boltz_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/examples/boltzmann/global_examples_boltzmann_boltz-vorticity.obj `if test -f 'global/examples/boltzmann/vorticity.F'; then $(CYGPATH_W) 'global/examples/boltzmann/vorticity.F'; else $(CYGPATH_W) '$(srcdir)/global/examples/boltzmann/vorticity.F'; fi` global/testing/global_testing_test_mirrored-test.o: global/testing/test.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-test.o `test -f 'global/testing/test.F' || echo '$(srcdir)/'`global/testing/test.F global/testing/global_testing_test_mirrored-test.obj: global/testing/test.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-test.obj `if test -f 'global/testing/test.F'; then $(CYGPATH_W) 'global/testing/test.F'; else $(CYGPATH_W) '$(srcdir)/global/testing/test.F'; fi` global/testing/global_testing_test_mirrored-ffflush.o: global/testing/ffflush.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-ffflush.o `test -f 'global/testing/ffflush.F' || echo '$(srcdir)/'`global/testing/ffflush.F global/testing/global_testing_test_mirrored-ffflush.obj: global/testing/ffflush.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-ffflush.obj `if test -f 'global/testing/ffflush.F'; then $(CYGPATH_W) 'global/testing/ffflush.F'; else $(CYGPATH_W) '$(srcdir)/global/testing/ffflush.F'; fi` global/testing/global_testing_test_mirrored-testblas.o: global/testing/testblas.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-testblas.o `test -f 'global/testing/testblas.F' || echo '$(srcdir)/'`global/testing/testblas.F global/testing/global_testing_test_mirrored-testblas.obj: global/testing/testblas.F $(AM_V_PPF77)$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS) -c -o global/testing/global_testing_test_mirrored-testblas.obj `if test -f 'global/testing/testblas.F'; then $(CYGPATH_W) 'global/testing/testblas.F'; else $(CYGPATH_W) '$(srcdir)/global/testing/testblas.F'; fi` .F.f: $(F77COMPILE) -F $< .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< global/X/global_X_xregion-xregion_colormap.o: global/X/xregion_colormap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_colormap.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Tpo -c -o global/X/global_X_xregion-xregion_colormap.o `test -f 'global/X/xregion_colormap.c' || echo '$(srcdir)/'`global/X/xregion_colormap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_colormap.c' object='global/X/global_X_xregion-xregion_colormap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_colormap.o `test -f 'global/X/xregion_colormap.c' || echo '$(srcdir)/'`global/X/xregion_colormap.c global/X/global_X_xregion-xregion_colormap.obj: global/X/xregion_colormap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_colormap.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Tpo -c -o global/X/global_X_xregion-xregion_colormap.obj `if test -f 'global/X/xregion_colormap.c'; then $(CYGPATH_W) 'global/X/xregion_colormap.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_colormap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_colormap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_colormap.c' object='global/X/global_X_xregion-xregion_colormap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_colormap.obj `if test -f 'global/X/xregion_colormap.c'; then $(CYGPATH_W) 'global/X/xregion_colormap.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_colormap.c'; fi` global/X/global_X_xregion-xregion_dialog.o: global/X/xregion_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_dialog.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Tpo -c -o global/X/global_X_xregion-xregion_dialog.o `test -f 'global/X/xregion_dialog.c' || echo '$(srcdir)/'`global/X/xregion_dialog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_dialog.c' object='global/X/global_X_xregion-xregion_dialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_dialog.o `test -f 'global/X/xregion_dialog.c' || echo '$(srcdir)/'`global/X/xregion_dialog.c global/X/global_X_xregion-xregion_dialog.obj: global/X/xregion_dialog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_dialog.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Tpo -c -o global/X/global_X_xregion-xregion_dialog.obj `if test -f 'global/X/xregion_dialog.c'; then $(CYGPATH_W) 'global/X/xregion_dialog.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_dialog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_dialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_dialog.c' object='global/X/global_X_xregion-xregion_dialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_dialog.obj `if test -f 'global/X/xregion_dialog.c'; then $(CYGPATH_W) 'global/X/xregion_dialog.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_dialog.c'; fi` global/X/global_X_xregion-xregion_display.o: global/X/xregion_display.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_display.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_display.Tpo -c -o global/X/global_X_xregion-xregion_display.o `test -f 'global/X/xregion_display.c' || echo '$(srcdir)/'`global/X/xregion_display.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_display.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_display.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_display.c' object='global/X/global_X_xregion-xregion_display.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_display.o `test -f 'global/X/xregion_display.c' || echo '$(srcdir)/'`global/X/xregion_display.c global/X/global_X_xregion-xregion_display.obj: global/X/xregion_display.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_display.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_display.Tpo -c -o global/X/global_X_xregion-xregion_display.obj `if test -f 'global/X/xregion_display.c'; then $(CYGPATH_W) 'global/X/xregion_display.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_display.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_display.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_display.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_display.c' object='global/X/global_X_xregion-xregion_display.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_display.obj `if test -f 'global/X/xregion_display.c'; then $(CYGPATH_W) 'global/X/xregion_display.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_display.c'; fi` global/X/global_X_xregion-xregion_fileio.o: global/X/xregion_fileio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_fileio.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Tpo -c -o global/X/global_X_xregion-xregion_fileio.o `test -f 'global/X/xregion_fileio.c' || echo '$(srcdir)/'`global/X/xregion_fileio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_fileio.c' object='global/X/global_X_xregion-xregion_fileio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_fileio.o `test -f 'global/X/xregion_fileio.c' || echo '$(srcdir)/'`global/X/xregion_fileio.c global/X/global_X_xregion-xregion_fileio.obj: global/X/xregion_fileio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_fileio.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Tpo -c -o global/X/global_X_xregion-xregion_fileio.obj `if test -f 'global/X/xregion_fileio.c'; then $(CYGPATH_W) 'global/X/xregion_fileio.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_fileio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_fileio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_fileio.c' object='global/X/global_X_xregion-xregion_fileio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_fileio.obj `if test -f 'global/X/xregion_fileio.c'; then $(CYGPATH_W) 'global/X/xregion_fileio.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_fileio.c'; fi` global/X/global_X_xregion-xregion_main.o: global/X/xregion_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_main.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_main.Tpo -c -o global/X/global_X_xregion-xregion_main.o `test -f 'global/X/xregion_main.c' || echo '$(srcdir)/'`global/X/xregion_main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_main.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_main.c' object='global/X/global_X_xregion-xregion_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_main.o `test -f 'global/X/xregion_main.c' || echo '$(srcdir)/'`global/X/xregion_main.c global/X/global_X_xregion-xregion_main.obj: global/X/xregion_main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_main.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_main.Tpo -c -o global/X/global_X_xregion-xregion_main.obj `if test -f 'global/X/xregion_main.c'; then $(CYGPATH_W) 'global/X/xregion_main.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_main.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_main.c' object='global/X/global_X_xregion-xregion_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_main.obj `if test -f 'global/X/xregion_main.c'; then $(CYGPATH_W) 'global/X/xregion_main.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_main.c'; fi` global/X/global_X_xregion-xregion_overview.o: global/X/xregion_overview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_overview.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Tpo -c -o global/X/global_X_xregion-xregion_overview.o `test -f 'global/X/xregion_overview.c' || echo '$(srcdir)/'`global/X/xregion_overview.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_overview.c' object='global/X/global_X_xregion-xregion_overview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_overview.o `test -f 'global/X/xregion_overview.c' || echo '$(srcdir)/'`global/X/xregion_overview.c global/X/global_X_xregion-xregion_overview.obj: global/X/xregion_overview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_overview.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Tpo -c -o global/X/global_X_xregion-xregion_overview.obj `if test -f 'global/X/xregion_overview.c'; then $(CYGPATH_W) 'global/X/xregion_overview.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_overview.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_overview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_overview.c' object='global/X/global_X_xregion-xregion_overview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_overview.obj `if test -f 'global/X/xregion_overview.c'; then $(CYGPATH_W) 'global/X/xregion_overview.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_overview.c'; fi` global/X/global_X_xregion-xregion_pixregion.o: global/X/xregion_pixregion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_pixregion.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Tpo -c -o global/X/global_X_xregion-xregion_pixregion.o `test -f 'global/X/xregion_pixregion.c' || echo '$(srcdir)/'`global/X/xregion_pixregion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_pixregion.c' object='global/X/global_X_xregion-xregion_pixregion.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_pixregion.o `test -f 'global/X/xregion_pixregion.c' || echo '$(srcdir)/'`global/X/xregion_pixregion.c global/X/global_X_xregion-xregion_pixregion.obj: global/X/xregion_pixregion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_pixregion.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Tpo -c -o global/X/global_X_xregion-xregion_pixregion.obj `if test -f 'global/X/xregion_pixregion.c'; then $(CYGPATH_W) 'global/X/xregion_pixregion.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_pixregion.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_pixregion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_pixregion.c' object='global/X/global_X_xregion-xregion_pixregion.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_pixregion.obj `if test -f 'global/X/xregion_pixregion.c'; then $(CYGPATH_W) 'global/X/xregion_pixregion.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_pixregion.c'; fi` global/X/global_X_xregion-xregion_scrollbars.o: global/X/xregion_scrollbars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_scrollbars.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Tpo -c -o global/X/global_X_xregion-xregion_scrollbars.o `test -f 'global/X/xregion_scrollbars.c' || echo '$(srcdir)/'`global/X/xregion_scrollbars.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_scrollbars.c' object='global/X/global_X_xregion-xregion_scrollbars.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_scrollbars.o `test -f 'global/X/xregion_scrollbars.c' || echo '$(srcdir)/'`global/X/xregion_scrollbars.c global/X/global_X_xregion-xregion_scrollbars.obj: global/X/xregion_scrollbars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_scrollbars.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Tpo -c -o global/X/global_X_xregion-xregion_scrollbars.obj `if test -f 'global/X/xregion_scrollbars.c'; then $(CYGPATH_W) 'global/X/xregion_scrollbars.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_scrollbars.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_scrollbars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_scrollbars.c' object='global/X/global_X_xregion-xregion_scrollbars.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_scrollbars.obj `if test -f 'global/X/xregion_scrollbars.c'; then $(CYGPATH_W) 'global/X/xregion_scrollbars.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_scrollbars.c'; fi` global/X/global_X_xregion-xregion_util.o: global/X/xregion_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_util.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_util.Tpo -c -o global/X/global_X_xregion-xregion_util.o `test -f 'global/X/xregion_util.c' || echo '$(srcdir)/'`global/X/xregion_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_util.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_util.c' object='global/X/global_X_xregion-xregion_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_util.o `test -f 'global/X/xregion_util.c' || echo '$(srcdir)/'`global/X/xregion_util.c global/X/global_X_xregion-xregion_util.obj: global/X/xregion_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_util.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_util.Tpo -c -o global/X/global_X_xregion-xregion_util.obj `if test -f 'global/X/xregion_util.c'; then $(CYGPATH_W) 'global/X/xregion_util.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_util.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_util.c' object='global/X/global_X_xregion-xregion_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_util.obj `if test -f 'global/X/xregion_util.c'; then $(CYGPATH_W) 'global/X/xregion_util.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_util.c'; fi` global/X/global_X_xregion-xregion_view.o: global/X/xregion_view.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_view.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_view.Tpo -c -o global/X/global_X_xregion-xregion_view.o `test -f 'global/X/xregion_view.c' || echo '$(srcdir)/'`global/X/xregion_view.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_view.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_view.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_view.c' object='global/X/global_X_xregion-xregion_view.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_view.o `test -f 'global/X/xregion_view.c' || echo '$(srcdir)/'`global/X/xregion_view.c global/X/global_X_xregion-xregion_view.obj: global/X/xregion_view.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_view.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_view.Tpo -c -o global/X/global_X_xregion-xregion_view.obj `if test -f 'global/X/xregion_view.c'; then $(CYGPATH_W) 'global/X/xregion_view.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_view.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_view.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_view.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_view.c' object='global/X/global_X_xregion-xregion_view.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_view.obj `if test -f 'global/X/xregion_view.c'; then $(CYGPATH_W) 'global/X/xregion_view.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_view.c'; fi` global/X/global_X_xregion-xregion_xcmap.o: global/X/xregion_xcmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_xcmap.o -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Tpo -c -o global/X/global_X_xregion-xregion_xcmap.o `test -f 'global/X/xregion_xcmap.c' || echo '$(srcdir)/'`global/X/xregion_xcmap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_xcmap.c' object='global/X/global_X_xregion-xregion_xcmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_xcmap.o `test -f 'global/X/xregion_xcmap.c' || echo '$(srcdir)/'`global/X/xregion_xcmap.c global/X/global_X_xregion-xregion_xcmap.obj: global/X/xregion_xcmap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/X/global_X_xregion-xregion_xcmap.obj -MD -MP -MF global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Tpo -c -o global/X/global_X_xregion-xregion_xcmap.obj `if test -f 'global/X/xregion_xcmap.c'; then $(CYGPATH_W) 'global/X/xregion_xcmap.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_xcmap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Tpo global/X/$(DEPDIR)/global_X_xregion-xregion_xcmap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/X/xregion_xcmap.c' object='global/X/global_X_xregion-xregion_xcmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_X_xregion_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/X/global_X_xregion-xregion_xcmap.obj `if test -f 'global/X/xregion_xcmap.c'; then $(CYGPATH_W) 'global/X/xregion_xcmap.c'; else $(CYGPATH_W) '$(srcdir)/global/X/xregion_xcmap.c'; fi` global/testing/global_testing_test_mirrored-util.o: global/testing/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/testing/global_testing_test_mirrored-util.o -MD -MP -MF global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Tpo -c -o global/testing/global_testing_test_mirrored-util.o `test -f 'global/testing/util.c' || echo '$(srcdir)/'`global/testing/util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Tpo global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/testing/util.c' object='global/testing/global_testing_test_mirrored-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/testing/global_testing_test_mirrored-util.o `test -f 'global/testing/util.c' || echo '$(srcdir)/'`global/testing/util.c global/testing/global_testing_test_mirrored-util.obj: global/testing/util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT global/testing/global_testing_test_mirrored-util.obj -MD -MP -MF global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Tpo -c -o global/testing/global_testing_test_mirrored-util.obj `if test -f 'global/testing/util.c'; then $(CYGPATH_W) 'global/testing/util.c'; else $(CYGPATH_W) '$(srcdir)/global/testing/util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Tpo global/testing/$(DEPDIR)/global_testing_test_mirrored-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='global/testing/util.c' object='global/testing/global_testing_test_mirrored-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(global_testing_test_mirrored_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o global/testing/global_testing_test_mirrored-util.obj `if test -f 'global/testing/util.c'; then $(CYGPATH_W) 'global/testing/util.c'; else $(CYGPATH_W) '$(srcdir)/global/testing/util.c'; fi` .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .f.o: $(AM_V_F77)$(F77COMPILE) -c -o $@ $< .f.obj: $(AM_V_F77)$(F77COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .f.lo: $(AM_V_F77)$(LTF77COMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf LinAlg/lapack+blas/.libs LinAlg/lapack+blas/_libs -rm -rf compat/.libs compat/_libs -rm -rf ga++/src/.libs ga++/src/_libs -rm -rf ga++/testing/.libs ga++/testing/_libs -rm -rf gaf2c/.libs gaf2c/_libs -rm -rf global/X/.libs global/X/_libs -rm -rf global/examples/boltzmann/.libs global/examples/boltzmann/_libs -rm -rf global/examples/conjugate_gradient/.libs global/examples/conjugate_gradient/_libs -rm -rf global/examples/lennard-jones/.libs global/examples/lennard-jones/_libs -rm -rf global/examples/md_cluster/.libs global/examples/md_cluster/_libs -rm -rf global/examples/scf/.libs global/examples/scf/_libs -rm -rf global/src/.libs global/src/_libs -rm -rf global/testing/.libs global/testing/_libs -rm -rf global/testing/unit-tests/.libs global/testing/unit-tests/_libs -rm -rf global/trace/.libs global/trace/_libs -rm -rf gparrays/src/.libs gparrays/src/_libs -rm -rf gparrays/testing/.libs gparrays/testing/_libs -rm -rf ma/.libs ma/_libs -rm -rf pario/dra/.libs pario/dra/_libs -rm -rf pario/eaf/.libs pario/eaf/_libs -rm -rf pario/elio/.libs pario/elio/_libs -rm -rf pario/sf/.libs pario/sf/_libs -rm -rf tcgmsg/.libs tcgmsg/_libs -rm -rf tcgmsg/tcgmsg-mpi/.libs tcgmsg/tcgmsg-mpi/_libs -rm -rf tcgmsg/tests/.libs tcgmsg/tests/_libs -rm -rf tools/.libs tools/_libs distclean-libtool: -rm -f libtool config.lt install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-nodist_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__sh_e_setup); \ list='$(TEST_LOGS)'; \ results=`for f in $$list; do \ test -r $$f && read line < $$f && echo "$$line" \ || echo FAIL; \ done`; \ all=`echo "$$results" | sed '/^$$/d' | wc -l | sed -e 's/^[ ]*//'`; \ fail=`echo "$$results" | grep -c '^FAIL'`; \ pass=`echo "$$results" | grep -c '^PASS'`; \ skip=`echo "$$results" | grep -c '^SKIP'`; \ xfail=`echo "$$results" | grep -c '^XFAIL'`; \ xpass=`echo "$$results" | grep -c '^XPASS'`; \ failures=`expr $$fail + $$xpass`; \ all=`expr $$all - $$skip`; \ if test "$$all" -eq 1; then tests=test; All=; \ else tests=tests; All="All "; fi; \ case fail=$$fail:xpass=$$xpass:xfail=$$xfail in \ fail=0:xpass=0:xfail=0) \ msg="$$All$$all $$tests passed. "; \ exit=true;; \ fail=0:xpass=0:xfail=*) \ msg="$$All$$all $$tests behaved as expected"; \ if test "$$xfail" -eq 1; then xfailures=failure; \ else xfailures=failures; fi; \ msg="$$msg ($$xfail expected $$xfailures). "; \ exit=true;; \ fail=*:xpass=0:xfail=*) \ msg="$$fail of $$all $$tests failed. "; \ exit=false;; \ fail=*:xpass=*:xfail=*) \ msg="$$failures of $$all $$tests did not behave as expected"; \ if test "$$xpass" -eq 1; then xpasses=pass; \ else xpasses=passes; fi; \ msg="$$msg ($$xpass unexpected $$xpasses). "; \ exit=false;; \ *) \ echo >&2 "incorrect case"; exit 4;; \ esac; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ msg="$$msg($$skip test was not run). "; \ else \ msg="$$msg($$skip tests were not run). "; \ fi; \ fi; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ echo "$$msg"; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for f in $$list; do \ test -r $$f && read line < $$f || line=; \ case $$line in \ PASS:*|XFAIL:*);; \ *) echo; cat $$f;; \ esac; \ done; \ } >$(TEST_SUITE_LOG).tmp; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if test "$$failures" -ne 0; then \ msg="$${msg}See $(subdir)/$(TEST_SUITE_LOG). "; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ msg="$${msg}Please report to $(PACKAGE_BUGREPORT). "; \ fi; \ fi; \ test x"$$VERBOSE" = x || $$exit || cat $(TEST_SUITE_LOG); \ $(am__tty_colors); \ if $$exit; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$$msg" | $(am__text_box) "col=$$col" "std=$$std"; \ $$exit || exit 1 check-TESTS recheck: @if test $@ != recheck; then \ list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list; \ fi @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @list='' list2='$(TEST_LOGS)'; for f in $$list2; do \ test .log = $$f && continue; \ if test $@ = recheck; then \ test -f $$f || continue; \ if test -r $$f && read line < $$f; then \ case $$line in FAIL*|XPASS*) : ;; *) continue;; esac; \ fi; \ fi; \ if test -z "$$list"; then list=$$f; else list="$$list $$f"; fi; \ done; \ if test $@ = recheck && test -n "$$list"; then \ $(am__make_dryrun) || rm -f $$list || exit 1; \ fi; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$list" recheck: $(check_LTLIBRARIES) $(check_PROGRAMS) am--mostlyclean-test-html: list='$(TEST_LOGS:.log=.html)'; test -z "$$list" || rm -f $$list rm -f $(TEST_SUITE_HTML) .log.html: @list='$(RST2HTML) $$RST2HTML rst2html rst2html.py'; \ for r2h in $$list; do \ if ($$r2h --version) >/dev/null 2>&1; then \ R2H=$$r2h; \ fi; \ done; \ if test -z "$$R2H"; then \ echo >&2 "cannot find rst2html, cannot create $@"; \ exit 2; \ fi; \ $$R2H $< >$@.tmp @mv $@.tmp $@ # Be sure to run check first, and then to convert the result. # Beware of concurrent executions. Run "check" not "check-TESTS", as # check-SCRIPTS and other dependencies are rebuilt by the former only. # And expect check to fail. check-html recheck-html: @target=`echo $@ | sed 's/-html$$//'`; \ rv=0; $(MAKE) $(AM_MAKEFLAGS) $$target || rv=$$?; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_HTML) TEST_LOGS= || exit 4; \ exit $$rv ma/test-coalesce.log: ma/test-coalesce$(EXEEXT) @p='ma/test-coalesce$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ma/test-inquire.log: ma/test-inquire$(EXEEXT) @p='ma/test-inquire$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ma/testf.log: ma/testf$(EXEEXT) @p='ma/testf$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/elempatch.log: global/testing/elempatch$(EXEEXT) @p='global/testing/elempatch$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/getmem.log: global/testing/getmem$(EXEEXT) @p='global/testing/getmem$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/mtest.log: global/testing/mtest$(EXEEXT) @p='global/testing/mtest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/mulmatpatchc.log: global/testing/mulmatpatchc$(EXEEXT) @p='global/testing/mulmatpatchc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/normc.log: global/testing/normc$(EXEEXT) @p='global/testing/normc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ntestc.log: global/testing/ntestc$(EXEEXT) @p='global/testing/ntestc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ntestfc.log: global/testing/ntestfc$(EXEEXT) @p='global/testing/ntestfc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/packc.log: global/testing/packc$(EXEEXT) @p='global/testing/packc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/patch_enumc.log: global/testing/patch_enumc$(EXEEXT) @p='global/testing/patch_enumc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/print.log: global/testing/print$(EXEEXT) @p='global/testing/print$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/scan_addc.log: global/testing/scan_addc$(EXEEXT) @p='global/testing/scan_addc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/scan_copyc.log: global/testing/scan_copyc$(EXEEXT) @p='global/testing/scan_copyc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testc.log: global/testing/testc$(EXEEXT) @p='global/testing/testc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testmatmultc.log: global/testing/testmatmultc$(EXEEXT) @p='global/testing/testmatmultc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testmult.log: global/testing/testmult$(EXEEXT) @p='global/testing/testmult$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testmultrect.log: global/testing/testmultrect$(EXEEXT) @p='global/testing/testmultrect$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/unpackc.log: global/testing/unpackc$(EXEEXT) @p='global/testing/unpackc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/bin.log: global/testing/bin$(EXEEXT) @p='global/testing/bin$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/blktest.log: global/testing/blktest$(EXEEXT) @p='global/testing/blktest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/g2test.log: global/testing/g2test$(EXEEXT) @p='global/testing/g2test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/g3test.log: global/testing/g3test$(EXEEXT) @p='global/testing/g3test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ga_lu.log: global/testing/ga_lu$(EXEEXT) @p='global/testing/ga_lu$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ga_shift.log: global/testing/ga_shift$(EXEEXT) @p='global/testing/ga_shift$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ghosts.log: global/testing/ghosts$(EXEEXT) @p='global/testing/ghosts$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/jacobi.log: global/testing/jacobi$(EXEEXT) @p='global/testing/jacobi$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/mir_perf2.log: global/testing/mir_perf2$(EXEEXT) @p='global/testing/mir_perf2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/mmatrix.log: global/testing/mmatrix$(EXEEXT) @p='global/testing/mmatrix$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/mulmatpatch.log: global/testing/mulmatpatch$(EXEEXT) @p='global/testing/mulmatpatch$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nb2test.log: global/testing/nb2test$(EXEEXT) @p='global/testing/nb2test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ndim.log: global/testing/ndim$(EXEEXT) @p='global/testing/ndim$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/patch.log: global/testing/patch$(EXEEXT) @p='global/testing/patch$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/patch2.log: global/testing/patch2$(EXEEXT) @p='global/testing/patch2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/patch_enumf.log: global/testing/patch_enumf$(EXEEXT) @p='global/testing/patch_enumf$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/perfmod.log: global/testing/perfmod$(EXEEXT) @p='global/testing/perfmod$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/perform.log: global/testing/perform$(EXEEXT) @p='global/testing/perform$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/perf.log: global/testing/perf$(EXEEXT) @p='global/testing/perf$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/perf2.log: global/testing/perf2$(EXEEXT) @p='global/testing/perf2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/pg2test.log: global/testing/pg2test$(EXEEXT) @p='global/testing/pg2test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/pgtest.log: global/testing/pgtest$(EXEEXT) @p='global/testing/pgtest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/scan.log: global/testing/scan$(EXEEXT) @p='global/testing/scan$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/simple_groups.log: global/testing/simple_groups$(EXEEXT) @p='global/testing/simple_groups$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/sparse.log: global/testing/sparse$(EXEEXT) @p='global/testing/sparse$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/sprsmatmult.log: global/testing/sprsmatmult$(EXEEXT) @p='global/testing/sprsmatmult$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/stride.log: global/testing/stride$(EXEEXT) @p='global/testing/stride$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testeig.log: global/testing/testeig$(EXEEXT) @p='global/testing/testeig$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testmatmult.log: global/testing/testmatmult$(EXEEXT) @p='global/testing/testmatmult$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testsolve.log: global/testing/testsolve$(EXEEXT) @p='global/testing/testsolve$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/test.log: global/testing/test$(EXEEXT) @p='global/testing/test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/testspd.log: global/testing/testspd$(EXEEXT) @p='global/testing/testspd$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/simple_groups_comm.log: global/testing/simple_groups_comm$(EXEEXT) @p='global/testing/simple_groups_comm$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ga-mpi.log: global/testing/ga-mpi$(EXEEXT) @p='global/testing/ga-mpi$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/lock.log: global/testing/lock$(EXEEXT) @p='global/testing/lock$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/simple_groups_commc.log: global/testing/simple_groups_commc$(EXEEXT) @p='global/testing/simple_groups_commc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nga-onesided.log: global/testing/nga-onesided$(EXEEXT) @p='global/testing/nga-onesided$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nga-patch.log: global/testing/nga-patch$(EXEEXT) @p='global/testing/nga-patch$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nga-periodic.log: global/testing/nga-periodic$(EXEEXT) @p='global/testing/nga-periodic$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nga-scatter.log: global/testing/nga-scatter$(EXEEXT) @p='global/testing/nga-scatter$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/nga-util.log: global/testing/nga-util$(EXEEXT) @p='global/testing/nga-util$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/testing/ngatest.log: global/testing/ngatest$(EXEEXT) @p='global/testing/ngatest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/examples/lennard-jones/lennard.log: global/examples/lennard-jones/lennard$(EXEEXT) @p='global/examples/lennard-jones/lennard$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) global/examples/boltzmann/boltz.log: global/examples/boltzmann/boltz$(EXEEXT) @p='global/examples/boltzmann/boltz$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ga++/testing/elempatch.log: ga++/testing/elempatch$(EXEEXT) @p='ga++/testing/elempatch$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ga++/testing/mtest.log: ga++/testing/mtest$(EXEEXT) @p='ga++/testing/mtest$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ga++/testing/ntestc.log: ga++/testing/ntestc$(EXEEXT) @p='ga++/testing/ntestc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ga++/testing/testc.log: ga++/testing/testc$(EXEEXT) @p='ga++/testing/testc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) ga++/testing/testmult.log: ga++/testing/testmult$(EXEEXT) @p='ga++/testing/testmult$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) .test.log: @p='$<'; $(am__check_pre) $(TEST_LOG_COMPILE) "$$tst" $(am__check_post) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; $(am__check_pre) $(TEST_LOG_COMPILE) "$$tst" $(am__check_post) distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(HEADERS) \ config.h install-binPROGRAMS: install-libLTLIBRARIES installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(LIBOBJS)" || rm -f $(LIBOBJS) -test -z "$(LTLIBOBJS)" || rm -f $(LTLIBOBJS) -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS_TMP)" || rm -f $(TEST_LOGS_TMP) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f LinAlg/lapack+blas/$(DEPDIR)/$(am__dirstamp) -rm -f LinAlg/lapack+blas/$(am__dirstamp) -rm -f compat/$(DEPDIR)/$(am__dirstamp) -rm -f compat/$(am__dirstamp) -rm -f ga++/src/$(DEPDIR)/$(am__dirstamp) -rm -f ga++/src/$(am__dirstamp) -rm -f ga++/testing/$(DEPDIR)/$(am__dirstamp) -rm -f ga++/testing/$(am__dirstamp) -rm -f gaf2c/$(DEPDIR)/$(am__dirstamp) -rm -f gaf2c/$(am__dirstamp) -rm -f global/X/$(DEPDIR)/$(am__dirstamp) -rm -f global/X/$(am__dirstamp) -rm -f global/examples/boltzmann/$(DEPDIR)/$(am__dirstamp) -rm -f global/examples/boltzmann/$(am__dirstamp) -rm -f global/examples/conjugate_gradient/$(DEPDIR)/$(am__dirstamp) -rm -f global/examples/conjugate_gradient/$(am__dirstamp) -rm -f global/examples/lennard-jones/$(DEPDIR)/$(am__dirstamp) -rm -f global/examples/lennard-jones/$(am__dirstamp) -rm -f global/examples/md_cluster/$(DEPDIR)/$(am__dirstamp) -rm -f global/examples/md_cluster/$(am__dirstamp) -rm -f global/examples/scf/$(DEPDIR)/$(am__dirstamp) -rm -f global/examples/scf/$(am__dirstamp) -rm -f global/src/$(DEPDIR)/$(am__dirstamp) -rm -f global/src/$(am__dirstamp) -rm -f global/testing/$(DEPDIR)/$(am__dirstamp) -rm -f global/testing/$(am__dirstamp) -rm -f global/testing/unit-tests/$(DEPDIR)/$(am__dirstamp) -rm -f global/testing/unit-tests/$(am__dirstamp) -rm -f global/trace/$(DEPDIR)/$(am__dirstamp) -rm -f global/trace/$(am__dirstamp) -rm -f gparrays/src/$(DEPDIR)/$(am__dirstamp) -rm -f gparrays/src/$(am__dirstamp) -rm -f gparrays/testing/$(DEPDIR)/$(am__dirstamp) -rm -f gparrays/testing/$(am__dirstamp) -rm -f ma/$(DEPDIR)/$(am__dirstamp) -rm -f ma/$(am__dirstamp) -rm -f pario/dra/$(DEPDIR)/$(am__dirstamp) -rm -f pario/dra/$(am__dirstamp) -rm -f pario/eaf/$(DEPDIR)/$(am__dirstamp) -rm -f pario/eaf/$(am__dirstamp) -rm -f pario/elio/$(DEPDIR)/$(am__dirstamp) -rm -f pario/elio/$(am__dirstamp) -rm -f pario/sf/$(DEPDIR)/$(am__dirstamp) -rm -f pario/sf/$(am__dirstamp) -rm -f tcgmsg/$(DEPDIR)/$(am__dirstamp) -rm -f tcgmsg/$(am__dirstamp) -rm -f tcgmsg/tcgmsg-mpi/$(DEPDIR)/$(am__dirstamp) -rm -f tcgmsg/tcgmsg-mpi/$(am__dirstamp) -rm -f tcgmsg/tests/$(DEPDIR)/$(am__dirstamp) -rm -f tcgmsg/tests/$(am__dirstamp) -rm -f tools/$(DEPDIR)/$(am__dirstamp) -rm -f tools/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) @MSG_COMMS_TCGMSG4_FALSE@clean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \ clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf LinAlg/lapack+blas/$(DEPDIR) compat/$(DEPDIR) ga++/src/$(DEPDIR) ga++/testing/$(DEPDIR) gaf2c/$(DEPDIR) global/X/$(DEPDIR) global/examples/conjugate_gradient/$(DEPDIR) global/examples/lennard-jones/$(DEPDIR) global/src/$(DEPDIR) global/testing/$(DEPDIR) global/testing/unit-tests/$(DEPDIR) global/trace/$(DEPDIR) gparrays/src/$(DEPDIR) gparrays/testing/$(DEPDIR) ma/$(DEPDIR) pario/dra/$(DEPDIR) pario/eaf/$(DEPDIR) pario/elio/$(DEPDIR) pario/sf/$(DEPDIR) tcgmsg/$(DEPDIR) tcgmsg/tcgmsg-mpi/$(DEPDIR) tcgmsg/tests/$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-includeHEADERS install-nodist_includeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS \ install-libLTLIBRARIES install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf LinAlg/lapack+blas/$(DEPDIR) compat/$(DEPDIR) ga++/src/$(DEPDIR) ga++/testing/$(DEPDIR) gaf2c/$(DEPDIR) global/X/$(DEPDIR) global/examples/conjugate_gradient/$(DEPDIR) global/examples/lennard-jones/$(DEPDIR) global/src/$(DEPDIR) global/testing/$(DEPDIR) global/testing/unit-tests/$(DEPDIR) global/trace/$(DEPDIR) gparrays/src/$(DEPDIR) gparrays/testing/$(DEPDIR) ma/$(DEPDIR) pario/dra/$(DEPDIR) pario/eaf/$(DEPDIR) pario/elio/$(DEPDIR) pario/sf/$(DEPDIR) tcgmsg/$(DEPDIR) tcgmsg/tcgmsg-mpi/$(DEPDIR) tcgmsg/tests/$(DEPDIR) tools/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: am--mostlyclean-test-html mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-nodist_includeHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ check-am check-html ctags-recursive install install-am \ install-strip recheck-html tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--mostlyclean-test-html am--refresh check \ check-TESTS check-am check-html clean clean-binPROGRAMS \ clean-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ clean-libLTLIBRARIES clean-libtool clean-local ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \ dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-binPROGRAMS \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man \ install-nodist_includeHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ recheck recheck-html tags tags-recursive uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-nodist_includeHEADERS .PHONY: flags flags: @echo '# =========================================================================== ' @echo 'F77="$(F77)"' @echo 'CC="$(CC)"' @CXX_BINDINGS_TRUE@ @echo 'CXX="$(CXX)"' @echo '# Suggested compiler/linker options are as follows.' @echo '# GA libraries are installed in $(libdir)' @echo '# GA headers are installed in $(includedir)' @echo '#' @echo 'CPPFLAGS="$(ELPA_CPPFLAGS) $(SCALAPACK_CPPFLAGS) $(LAPACK_CPPFLAGS) $(BLAS_CPPFLAGS) $(GA_MP_CPPFLAGS) $(ARMCI_NETWORK_CPPFLAGS) -I$(includedir)"' | $(SED_NORMALIZE_WHITESPACE) @echo '#' @echo 'LDFLAGS="$(ELPA_LDFLAGS) $(SCALAPACK_LDFLAGS) $(LAPACK_LDFLAGS) $(BLAS_LDFLAGS) $(GA_MP_LDFLAGS) $(ARMCI_NETWORK_LDFLAGS) -L$(libdir)"' | $(SED_NORMALIZE_WHITESPACE) @echo '#' @echo '# For Fortran Programs: ' @echo 'FFLAGS="$(AM_FFLAGS)"' | $(SED_NORMALIZE_WHITESPACE) @echo 'LIBS="-lga $(ELPA_LIBS) $(SCALAPACK_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(GA_MP_LIBS) $(ARMCI_NETWORK_LIBS)"' | $(SED_NORMALIZE_WHITESPACE) @echo '#' @echo '# For C Programs: ' @echo 'CFLAGS="$(AM_CFLAGS)"' | $(SED_NORMALIZE_WHITESPACE) @echo 'LIBS="-lga $(ELPA_LIBS) $(SCALAPACK_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(GA_MP_LIBS) $(ARMCI_NETWORK_LIBS) $(MAYBE_FLIBS)"' | $(SED_NORMALIZE_WHITESPACE) @CXX_BINDINGS_TRUE@ @echo '#' @CXX_BINDINGS_TRUE@ @echo '# For C++ Programs: ' @CXX_BINDINGS_TRUE@ @echo 'CXXFLAGS="$(AM_CXXFLAGS)"' | $(SED_NORMALIZE_WHITESPACE) @CXX_BINDINGS_TRUE@ @echo 'LIBS="-lga++ -lga $(ELPA_LIBS) $(SCALAPACK_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(GA_MP_LIBS) $(ARMCI_NETWORK_LIBS) $(MAYBE_FLIBS)"' | $(SED_NORMALIZE_WHITESPACE) @echo '# =========================================================================== ' config.fh: config.h @-rm -f $@ $(SED_V) \ $(SED) "/^#/!d" config.h > $@ global/src/ga-wapi.h: $(PAPI_H) @-rm -f $@ $(SED_V) \ $(SED) -e "s/PAPI/WAPI/g" \ -e "s/pnga_/wnga_/g" \ -e "/typedef/d" \ $(PAPI_H) > $@ global/src/ga-wapidefs.h: $(PAPI_H) @-rm -f $@ $(SED_V) \ $(SED) -e "s/PAPI/WAPIDEFS/g" \ -e "s/^.*p\(nga_.*\)(.*$$/#define w\1 p\1/g" \ -e "/^ /d" \ -e "/^\/\*/d" \ -e "/^ \*/d" \ -e "/typedef/d" \ $(PAPI_H) > $@ @HAVE_M4_TRUE@global/testing/nga-onesided.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@global/testing/nga-patch.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@global/testing/nga-periodic.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@global/testing/nga-scatter.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@global/testing/nga-util.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@global/testing/ngatest.F: $(GLOBAL_TESTING_M4_DEPS) @HAVE_M4_TRUE@.m4.F: @HAVE_M4_TRUE@ $(M4_V) \ @HAVE_M4_TRUE@ $(M4) -I$(top_srcdir)/global/testing $< > $@ ############################################################################## # python # @HAVE_PYTHON_TRUE@python: install @HAVE_PYTHON_TRUE@ (cd $(top_srcdir)/python && $(PYTHON) setup.py build_ext -L$(libdir) -I$(includedir)) || exit 1 @HAVE_PYTHON_TRUE@ (cd $(top_srcdir)/python && $(PYTHON) setup.py install) || exit 1 @ENABLE_GPARRAYS_TRUE@gparrays/src/gp-wapi.h: $(GPPAPI_H) @ENABLE_GPARRAYS_TRUE@ @-rm -f $@ @ENABLE_GPARRAYS_TRUE@ $(SED_V) \ @ENABLE_GPARRAYS_TRUE@ $(SED) -e "s/GPPAPI/GPWAPI/g" \ @ENABLE_GPARRAYS_TRUE@ -e "s/pgp_/wgp_/g" \ @ENABLE_GPARRAYS_TRUE@ -e "/typedef/d" \ @ENABLE_GPARRAYS_TRUE@ $(GPPAPI_H) > $@ @ENABLE_GPARRAYS_TRUE@gparrays/src/gp-wapidefs.h: $(GPPAPI_H) @ENABLE_GPARRAYS_TRUE@ @-rm -f $@ @ENABLE_GPARRAYS_TRUE@ $(SED_V) \ @ENABLE_GPARRAYS_TRUE@ $(SED) -e "s/GPPAPI/GPWAPIDEFS/g" \ @ENABLE_GPARRAYS_TRUE@ -e "s/^.*p\(gp_.*\)(.*$$/#define w\1 p\1/g" \ @ENABLE_GPARRAYS_TRUE@ -e "/^ /d" \ @ENABLE_GPARRAYS_TRUE@ -e "/^\/\*/d" \ @ENABLE_GPARRAYS_TRUE@ -e "/^ \*/d" \ @ENABLE_GPARRAYS_TRUE@ -e "/typedef/d" \ @ENABLE_GPARRAYS_TRUE@ -e "/include/d" \ @ENABLE_GPARRAYS_TRUE@ $(GPPAPI_H) > $@ @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_TRUE@comex/libarmci.la: @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_TRUE@ ($(am__cd) comex && $(MAKE) $(AM_MAKEFLAGS) all) || exit 1; @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_FALSE@armci/libarmci.la: @ARMCI_NETWORK_ARMCI_FALSE@@ARMCI_SRC_DIR_COMEX_FALSE@ ($(am__cd) armci && $(MAKE) $(AM_MAKEFLAGS) all) || exit 1; dist-hook: tascel-dist-hook .PHONY: tascel-dist-hook tascel-dist-hook: rm -rf $(distdir)/tascel/autom4te.cache dist-hook: gfutex-dist-hook .PHONY: gfutex-dist-hook gfutex-dist-hook: rm -rf $(distdir)/gfutex/autom4te.cache ############################################################################## # the end # .PHONY: checkprogs checkprogs-recursive checkprogs-am checkprogs: checkprogs-recursive checkprogs-am: $(check_PROGRAMS) # COPIED FROM MAKEFILE GENERATED BY AUTOMAKE 1.11.1 # Modified to use our own recursive targets. $(GA_RECURSIVE_TARGETS): all @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" .PHONY: pfiles clean-pfiles @MSG_COMMS_TCGMSG4_TRUE@pfiles: $(check_PROGRAMS) @MSG_COMMS_TCGMSG4_TRUE@ for p in $(check_PROGRAMS); do \ @MSG_COMMS_TCGMSG4_TRUE@ echo "`whoami` `hostname` $(NPROCS) `pwd`/$$p /tmp" > $$p.p; \ @MSG_COMMS_TCGMSG4_TRUE@ done @MSG_COMMS_TCGMSG4_TRUE@check: pfiles @MSG_COMMS_TCGMSG4_TRUE@clean-pfiles: @MSG_COMMS_TCGMSG4_TRUE@ find . -name '*.p' -exec rm {} \; ; @MSG_COMMS_TCGMSG4_TRUE@clean-local: clean-pfiles .PHONY: check-ga check-ga: $(all-am) $(check_LTLIBRARIES) $(check_PROGRAMS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) check-TESTS .PHONY: recheck-ga recheck-ga: $(all-am) $(check_LTLIBRARIES) $(check_PROGRAMS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) recheck .PHONY: check-ma check-ma: $(all-am) $(check_LTLIBRARIES) $(MA_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(MA_TESTS)" XFAIL_TESTS="$(MA_TESTS_XFAIL)" check-TESTS .PHONY: check-global check-global: $(all-am) $(check_LTLIBRARIES) $(GLOBAL_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(GLOBAL_TESTS)" XFAIL_TESTS="$(GLOBAL_TESTS_XFAIL)" check-TESTS .PHONY: check-pario check-pario: $(all-am) $(check_LTLIBRARIES) $(PARIO_TESTS) $(MAYBE_PFILES) $(MAKE) $(AM_MAKEFLAGS) TESTS="$(PARIO_TESTS)" XFAIL_TESTS="$(PARIO_TESTS_XFAIL)" check-TESTS .PHONY: check-ga++ @CXX_BINDINGS_TRUE@check-ga++: $(all-am) $(check_LTLIBRARIES) $(CXX_TESTS) $(MAYBE_PFILES) @CXX_BINDINGS_TRUE@ $(MAKE) $(AM_MAKEFLAGS) TESTS="$(CXX_TESTS)" XFAIL_TESTS="$(CXX_TESTS_XFAIL)" check-TESTS # Because pario tests are not listed in the TESTS variable, the log targets # are not generated by automake. Do them manually here. pario/dra/bign.log: pario/dra/bign$(EXEEXT) @p='pario/dra/bign$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) pario/dra/ntestc.log: pario/dra/ntestc$(EXEEXT) @p='pario/dra/ntestc$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) pario/dra/perfn.log: pario/dra/perfn$(EXEEXT) @p='pario/dra/perfn$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) pario/dra/rate.log: pario/dra/rate$(EXEEXT) @p='pario/dra/rate$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: ga-5-4/build-aux/0000755000175000017500000000000012662210376011727 5ustar mbambaga-5-4/build-aux/config.guess0000755000175000017500000012367212662210376014262 0ustar mbamba#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-11-04' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/build-aux/missing0000755000175000017500000002415212662210376013332 0ustar mbamba#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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, see . # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/build-aux/depcomp0000755000175000017500000005064312662210376013314 0ustar mbamba#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # 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, 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, see . # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/build-aux/config.sub0000755000175000017500000010622312662210376013716 0ustar mbamba#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2014 Free Software Foundation, Inc. timestamp='2014-12-03' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: ga-5-4/build-aux/ltmain.sh0000755000175000017500000105154412662210376013564 0ustar mbamba # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -mkl*|-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mkl*|-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 ga-5-4/build-aux/install-sh0000755000175000017500000003325612662210376013744 0ustar mbamba#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: ga-5-4/python/0000755000175000017500000000000012662210372011352 5ustar mbambaga-5-4/python/epydocify.py0000755000175000017500000000573112662210321013722 0ustar mbamba#!/usr/bin/env python # -------------------------------------------------------------------- import sys sys.path.append('..') import mpi4py.MPI import ga try: from signal import signal, SIGPIPE, SIG_IGN signal(SIGPIPE, SIG_IGN) except ImportError: pass # -------------------------------------------------------------------- try: from docutils.nodes import NodeVisitor NodeVisitor.unknown_visit = lambda self, node: None NodeVisitor.unknown_departure = lambda self, node: None except ImportError: pass try: # epydoc 3.0.1 + docutils 0.6 from docutils.nodes import Text from UserString import UserString if not isinstance(Text, UserString): def Text_get_data(s): try: return s._data except AttributeError: return s.astext() def Text_set_data(s, d): s.astext = lambda: d s._data = d Text.data = property(Text_get_data, Text_set_data) except ImportError: pass # -------------------------------------------------------------------- from epydoc.docwriter import dotgraph import re dotgraph._DOT_VERSION_RE = \ re.compile(r'dot (?:- Graphviz )version ([\d\.]+)') try: dotgraph.DotGraph.DEFAULT_HTML_IMAGE_FORMAT dotgraph.DotGraph.DEFAULT_HTML_IMAGE_FORMAT = 'png' except AttributeError: DotGraph_to_html = dotgraph.DotGraph.to_html DotGraph_run_dot = dotgraph.DotGraph._run_dot def to_html(self, image_file, image_url, center=True): if image_file[-4:] == '.gif': image_file = image_file[:-4] + '.png' if image_url[-4:] == '.gif': image_url = image_url[:-4] + '.png' return DotGraph_to_html(self, image_file, image_url) def _run_dot(self, *options): if '-Tgif' in options: opts = list(options) for i, o in enumerate(opts): if o == '-Tgif': opts[i] = '-Tpng' options = type(options)(opts) return DotGraph_run_dot(self, *options) dotgraph.DotGraph.to_html = to_html dotgraph.DotGraph._run_dot = _run_dot # -------------------------------------------------------------------- import re _SIGNATURE_RE = re.compile( # Class name (for builtin methods) r'^\s*((?P\w+)\.)?' + # The function name r'(?P\w+)' + # The parameters r'\(((?P(?:self|cls|mcs)),?)?(?P.*)\)' + # The return value (optional) r'(\s*(->)\s*(?P\S.*?))?'+ # The end marker r'\s*(\n|\s+(--|<=+>)\s+|$|\.\s+|\.\n)') from epydoc import docstringparser as dsp dsp._SIGNATURE_RE = _SIGNATURE_RE # -------------------------------------------------------------------- import sys, os import epydoc.cli def epydocify(): dirname = os.path.dirname(__file__) config = os.path.join(dirname, 'epydoc.cfg') sys.argv.append('--config=' + config) epydoc.cli.cli() if __name__ == '__main__': epydocify() # -------------------------------------------------------------------- ga-5-4/python/setup.py0000644000175000017500000001224412662210364013070 0ustar mbambaimport os from subprocess import Popen, PIPE import sys from distutils.core import setup from distutils.extension import Extension from distutils.spawn import find_executable from distutils.sysconfig import get_config_vars # numpy is required -- attempt import try: import numpy except ImportError: print "numpy is required" raise # mpi4py is required -- attempt import try: import mpi4py except ImportError: print "mpi4py is required" raise # cython is optional -- attempt import use_cython = False try: from Cython.Build import cythonize from Cython.Distutils import build_ext use_cython = True except: pass # need to find 'ga-config' to gather how GA was configured ga_config = find_executable("ga-config", None) if not ga_config: raise ValueError, "ga-config not found in path -- required" p = Popen("%s --cc" % ga_config, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True) ga_cc,ignore = p.communicate() p = Popen("%s --cppflags" % ga_config, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True) ga_cppflags,ignore = p.communicate() p = Popen("%s --ldflags" % ga_config, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True) ga_ldflags,ignore = p.communicate() p = Popen("%s --libs" % ga_config, shell=True, stdout=PIPE, stderr=PIPE, close_fds=True) ga_clibs,ignore = p.communicate() if 'CC' not in os.environ: os.environ['CC'] = ga_cc if 'LDSHARED' not in os.environ: # take a lucky guess and reuse the same flags Python used flags = get_config_vars('LDSHARED')[0].strip().split() assert(flags) flags[0] = ga_cc os.environ['LDSHARED'] = ' '.join(flags) if 'ARCHFLAGS' not in os.environ: os.environ['ARCHFLAGS'] = '' # On osx, '-framework Accelerate' doesn't link the actual LAPACK and BLAS # libraries. Locate them manually if GA was configured to use them. linalg_include = [] linalg_library = [] linalg_lib = [] if 'Accelerate' in ga_clibs or 'vecLib' in ga_clibs: path = "/System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/A" linalg_include = [] if os.path.exists(path): linalg_library = [path] linalg_lib = ["LAPACK","BLAS"] # remove '-framework Accelerate' from flags ga_clibs = ga_clibs.replace("-framework","") ga_clibs = ga_clibs.replace("Accelerate","") ga_clibs = ga_clibs.replace("vecLib","") include_dirs = [numpy.get_include(), mpi4py.get_include()] library_dirs = [] libraries = [] # add the GA stuff for dir in ga_cppflags.split(): dir = dir.strip() include_dirs.append(dir.replace("-I","")) for dir in ga_ldflags.split(): dir = dir.strip() library_dirs.append(dir.replace("-L","")) for part in ga_clibs.split(): part = part.strip() if '-L' in part: library_dirs.append(part.replace("-L","")) elif '-l' in part: libraries.append(part.replace("-l","")) include_dirs.extend(linalg_include) library_dirs.extend(linalg_library) libraries.extend(linalg_lib) ga4py_ga_sources = ["ga4py/ga.c"] ga4py_gain_core_sources = ["ga4py/gain/core.c"] ga4py_gain_misc_sources = ["ga4py/gain/misc.c"] ga4py_gain_notimplemented_sources = ["ga4py/gain/notimplemented.c"] ga4py_gain_random_sources = ["ga4py/gain/random.c"] ga4py_gain_util_sources = ["ga4py/gain/util.c"] if use_cython: ga4py_ga_sources = ["ga4py/ga.pyx"] ga4py_gain_core_sources = ["ga4py/gain/core.pyx"] ga4py_gain_misc_sources = ["ga4py/gain/misc.pyx"] ga4py_gain_notimplemented_sources = ["ga4py/gain/notimplemented.pyx"] ga4py_gain_random_sources = ["ga4py/gain/random.pyx"] ga4py_gain_util_sources = ["ga4py/gain/util.pyx"] include_dirs.append(".") ext_modules = [ Extension( name="ga4py.ga", sources=ga4py_ga_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), Extension( name="ga4py.gain.core", sources=ga4py_gain_core_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), Extension( name="ga4py.gain.misc", sources=ga4py_gain_misc_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), Extension( name="ga4py.gain.notimplemented", sources=ga4py_gain_notimplemented_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), Extension( name="ga4py.gain.random", sources=ga4py_gain_random_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), Extension( name="ga4py.gain.util", sources=ga4py_gain_util_sources, include_dirs=include_dirs, library_dirs=library_dirs, libraries=libraries ), ] if use_cython: ext_modules = cythonize(ext_modules, include_path=include_dirs) cmdclass = {} #cmdclass = {'build_ext': build_ext} else: cmdclass = {} setup( name = "Global Arrays", packages = ["ga4py","ga4py.gain"], ext_modules = ext_modules, cmdclass = cmdclass ) ga-5-4/python/ga4py/0000755000175000017500000000000012662210323012372 5ustar mbambaga-5-4/python/ga4py/gah.pxd0000644000175000017500000007302312662210323013653 0ustar mbambafrom libc.stdio cimport FILE from libc.stdint cimport int64_t cdef extern from "typesf2c.h": ctypedef int Integer ctypedef float Real ctypedef double DoublePrecision ctypedef struct DoubleComplex: DoublePrecision real DoublePrecision imag ctypedef struct SingleComplex: Real real Real imag cdef extern from "ga.h": ctypedef Integer ga_nbhdl_t void GA_Abs_value(int g_a) void GA_Abs_value_patch(int g_a, int *lo, int *hi) void GA_Add_constant(int g_a, void* alpha) void GA_Add_constant_patch(int g,int *lo,int *hi,void *alpha) void GA_Add_diagonal(int g_a, int g_v) void GA_Add(void *alpha, int g_a, void* beta, int g_b, int g_c) int GA_Allocate(int g_a) int GA_Assemble_duplicate(int g_a, char *name, void *ptr) void GA_Brdcst(void *buf, int lenbuf, int root) SingleComplex GA_Cdot(int g_a, int g_b) void GA_Cgop(SingleComplex x[], int n, char *op) void GA_Cgemm(char ta, char tb, int m, int n, int k, SingleComplex alpha, int g_a, int g_b, SingleComplex beta, int g_c ) void GA_Check_handle(int g_a, char *string) int GA_Cluster_nnodes() int GA_Cluster_nodeid() int GA_Cluster_nprocs(int x) int GA_Cluster_procid(int x, int y) int GA_Cluster_proc_nodeid(int proc) int GA_Compare_distr(int g_a, int g_b) void GA_Copy(int g_a, int g_b) int GA_Create_handle() int GA_Create_mutexes(int number) double GA_Ddot(int g_a, int g_b) void GA_Destroy(int g_a) int GA_Destroy_mutexes() void GA_Dgemm(char ta, char tb, int m, int n, int k, double alpha, int g_a, int g_b, double beta, int g_c ) void GA_Dgop(double x[], int n, char *op) void GA_Diag(int g_a, int g_s, int g_v, void *eval) void GA_Diag_reuse(int reuse, int g_a, int g_s, int g_v, void *eval) void GA_Diag_seq(int g_a, int g_s, int g_v, void *eval) void GA_Diag_std(int g_a, int g_v, void *eval) void GA_Diag_std_seq(int g_a, int g_v, void *eval) int GA_Duplicate(int g_a, char* array_name) void GA_Elem_divide(int g_a, int g_b, int g_c) void GA_Elem_divide_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi) void GA_Elem_maximum(int g_a, int g_b, int g_c) void GA_Elem_maximum_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi) void GA_Elem_minimum(int g_a, int g_b, int g_c) void GA_Elem_minimum_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi) void GA_Elem_multiply(int g_a, int g_b, int g_c) void GA_Elem_multiply_patch(int g_a,int *alo,int *ahi, int g_b,int *blo,int *bhi,int g_c,int *clo,int *chi) void GA_Error(char *str, int code) float GA_Fdot(int g_a, int g_b) void GA_Fence() void GA_Fgop(float x[], int n, char *op) void GA_Fill(int g_a, void *value) void GA_Freemem(void* ptr) void GA_Get_block_info(int g_a, int num_blocks[], int block_dims[]) int GA_Get_debug() void GA_Get_diag(int g_a, int g_v) int GA_Get_dimension(int g_a) void* GA_Getmem(int type, int nelem, int grp_id) int GA_Get_pgroup(int g_a) int GA_Get_pgroup_size(int grp_id) void GA_Get_proc_grid(int g_a, int dims[]) void GA_Get_proc_index(int g_a, int iproc, int subscript[]) void GA_Gop(int type, void *x, int n, char *op) int GA_Has_ghosts(int g_a) int GA_Idot(int g_a, int g_b) void GA_Igop(int x[], int n, char *op) void GA_Init_fence() void GA_Initialize_args(int *argc, char ***argv) void GA_Initialize_ltd(size_t limit) void GA_Initialize() size_t GA_Inquire_memory() char* GA_Inquire_name(int g_a) int GA_Is_mirrored(int g_a) void GA_List_nodeid(int *list, int nprocs) long GA_Ldot(int g_a, int g_b) void GA_Lgop(long x[], int n, char *op) long long GA_Lldot(int g_a, int g_b) void GA_Llgop(long long x[], int n, char *op) int GA_Llt_solve(int g_a, int g_b) void GA_Lock(int mutex) void GA_Lu_solve(char tran, int g_a, int g_b) void GA_Mask_sync(int first, int last) void GA_Matmul_patch(char transa, char transb, void* alpha, void *beta, int g_a, int ailo, int aihi, int ajlo, int ajhi, int g_b, int bilo, int bihi, int bjlo, int bjhi, int g_c, int cilo, int cihi, int cjlo, int cjhi) void GA_Median(int g_a, int g_b, int g_c, int g_m) void GA_Median_patch(int g_a, int *alo, int *ahi, int g_b, int *blo, int *bhi, int g_c, int *clo, int *chi, int g_m, int *mlo, int *mhi) size_t GA_Memory_avail() int GA_Memory_limited() void GA_Merge_mirrored(int g_a) void GA_Nblock(int g_a, int *nblock) int GA_Ndim(int g_a) int GA_Nnodes() int GA_Nodeid() void GA_Norm1(int g_a, double *nm) void GA_Norm_infinity(int g_a, double *nm) int GA_Pgroup_absolute_id(int pgroup, int pid) void GA_Pgroup_brdcst(int grp, void *buf, int lenbuf, int root) void GA_Pgroup_cgop(int grp, SingleComplex x[], int n, char *op) int GA_Pgroup_create(int *list, int count) int GA_Pgroup_destroy(int grp) void GA_Pgroup_dgop(int grp, double x[], int n, char *op) void GA_Pgroup_fgop(int grp, float x[], int n, char *op) int GA_Pgroup_get_default() int GA_Pgroup_get_mirror() int GA_Pgroup_get_world() void GA_Pgroup_igop(int grp, int x[], int n, char *op) void GA_Pgroup_lgop(int grp, long x[], int n, char *op) void GA_Pgroup_llgop(int grp, long long x[], int n, char *op) int GA_Pgroup_nnodes(int grp_id) int GA_Pgroup_nodeid(int grp_id) void GA_Pgroup_set_default(int p_handle) int GA_Pgroup_split(int grp_id, int num_group) int GA_Pgroup_split_irreg(int grp_id, int color) void GA_Pgroup_sync(int grp_id) void GA_Pgroup_zgop(int grp, DoubleComplex x[], int n, char *op) void GA_Print_distribution(int g_a) void GA_Print_file(FILE *file, int g_a) void GA_Print(int g_a) void GA_Print_patch(int g_a,int ilo,int ihi,int jlo,int jhi,int pretty) void GA_Print_stats() void GA_Randomize(int g_a, void *value) void GA_Recip(int g_a) void GA_Recip_patch(int g_a,int *lo, int *hi) void GA_Register_stack_memory(void * (*ext_alloc)(size_t, int, char *), void (*ext_free)(void *)) void GA_Scale_cols(int g_a, int g_v) void GA_Scale(int g_a, void *value) void GA_Scale_rows(int g_a, int g_v) void GA_Scan_add(int g_a, int g_b, int g_sbit, int lo, int hi, int excl) void GA_Scan_copy(int g_a, int g_b, int g_sbit, int lo, int hi) void GA_Set_array_name(int g_a, char *name) void GA_Set_block_cyclic(int g_a, int dims[]) void GA_Set_block_cyclic_proc_grid(int g_a, int block[], int proc_grid[]) void GA_Set_chunk(int g_a, int chunk[]) void GA_Set_data(int g_a, int ndim, int dims[], int type) void GA_Set_debug(int flag) void GA_Set_diagonal(int g_a, int g_v) void GA_Set_ghost_corner_flag(int g_a, int flag) void GA_Set_ghosts(int g_a, int width[]) void GA_Set_irreg_distr(int g_a, int map[], int block[]) void GA_Set_irreg_flag(int g_a, int flag) void GA_Set_memory_limit(size_t limit) void GA_Set_pgroup(int g_a, int p_handle) void GA_Set_restricted(int g_a, int list[], int size) void GA_Set_restricted_range(int g_a, int lo_proc, int hi_proc) void GA_Sgemm(char ta, char tb, int m, int n, int k, float alpha, int g_a, int g_b, float beta, int g_c ) void GA_Shift_diagonal(int g_a, void *c) int GA_Solve(int g_a, int g_b) int GA_Spd_invert(int g_a) void GA_Step_bound_info(int g_xx, int g_vv, int g_xxll, int g_xxuu, void *boundmin, void *wolfemin, void *boundmax) void GA_Step_bound_info_patch(int g_xx, int *xxlo, int *xxhi, int g_vv, int *vvlo, int *vvhi, int g_xxll, int *xxlllo, int *xxllhi, int g_xxuu, int *xxuulo, int *xxuuhi, void *boundmin, void *wolfemin, void *boundmax) void GA_Step_max(int g_a, int g_b, void *step) void GA_Step_max_patch(int g_a, int *alo, int *ahi, int g_b, int *blo, int *bhi, void *step) void GA_Summarize(int verbose) void GA_Symmetrize(int g_a) void GA_Sync() void GA_Terminate() int GA_Total_blocks(int g_a) void GA_Transpose(int g_a, int g_b) void GA_Unlock(int mutex) void GA_Update_ghosts(int g_a) int GA_Uses_fapi() int GA_Uses_ma() int GA_Uses_proc_grid(int g_a) int GA_Valid_handle(int g_a) int GA_Verify_handle(int g_a) double GA_Wtime() DoubleComplex GA_Zdot(int g_a, int g_b) void GA_Zgop(DoubleComplex x[], int n, char *op) void GA_Zero_diagonal(int g_a) void GA_Zero(int g_a) void GA_Zgemm(char ta, char tb, int m, int n, int k, DoubleComplex alpha, int g_a, int g_b, DoubleComplex beta, int g_c ) void NGA_Access_block_grid(int g_a, int index[], void *ptr, int ld[]) void NGA_Access_block(int g_a, int idx, void *ptr, int ld[]) void NGA_Access_block_segment(int g_a, int proc, void *ptr, int *len) void NGA_Access_ghost_element(int g_a, void *ptr, int subscript[], int ld[]) void NGA_Access_ghosts(int g_a, int dims[], void *ptr, int ld[]) void NGA_Access(int g_a, int lo[], int hi[], void *ptr, int ld[]) void NGA_Acc(int g_a, int lo[], int hi[],void* buf,int ld[],void* alpha) void NGA_Add_patch(void * alpha, int g_a, int alo[], int ahi[], void * beta, int g_b, int blo[], int bhi[], int g_c, int clo[], int chi[]) SingleComplex NGA_Cdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) int NGA_Compare_distr(int g_a, int g_b) void NGA_Copy_patch(char trans, int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[]) int NGA_Create_config(int type,int ndim,int dims[], char *name, int chunk[], int p_handle) int NGA_Create_ghosts_config(int type,int ndim,int dims[], int width[], char *name, int chunk[], int p_handle) int NGA_Create_ghosts(int type,int ndim,int dims[], int width[], char *name, int chunk[]) int NGA_Create_ghosts_irreg_config(int type,int ndim,int dims[], int width[], char *name, int map[], int nblock[], int p_handle) int NGA_Create_ghosts_irreg(int type,int ndim,int dims[], int width[], char *name, int map[], int nblock[]) int NGA_Create(int type,int ndim,int dims[], char *name, int chunk[]) int NGA_Create(int type,int ndim,int dims[], char *name, int chunk[]) int NGA_Create_irreg_config(int type,int ndim,int dims[],char *name, int map[], int block[], int p_handle) int NGA_Create_irreg(int type,int ndim,int dims[],char *name, int map[], int block[]) int NGA_Create_handle() int NGA_Deregister_type(int type) void NGA_Destroy(int g_a) int NGA_Destroy_mutexes() double NGA_Ddot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) void NGA_Distribution(int g_a, int iproc, int lo[], int hi[]) int NGA_Duplicate(int g_a, char* array_name) void NGA_Error(char *str, int code) float NGA_Fdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) void NGA_Fence() void NGA_Fill(int g_a, void *value) void NGA_Fill_patch(int g_a, int lo[], int hi[], void *val) void NGA_Gather(int g_a, void *v, int* subsArray[], int n) void NGA_Gather_flat(int g_a, void *v, int subsArray[], int n) void NGA_Get(int g_a, int lo[], int hi[], void* buf, int ld[]) void NGA_Get_block_info(int g_a, int num_blocks[], int block_dims[]) int NGA_Get_debug() int NGA_Get_dimension(int g_a) void NGA_Get_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld) void NGA_Get_ghost_block(int g_a, int lo[], int hi[], void *buf, int ld[]) int NGA_Get_pgroup(int g_a) int NGA_Get_pgroup_size(int grp_id) void NGA_Get_proc_grid(int g_a, int dims[]) void NGA_Get_proc_index(int g_a, int iproc, int subscript[]) int NGA_Has_ghosts(int g_a) int NGA_Idot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) void NGA_Init_fence() void NGA_Initialize() void NGA_Initialize_ltd(size_t limit) void NGA_Inquire(int g_a, int *type, int *ndim, int dims[]) size_t NGA_Inquire_memory() char* NGA_Inquire_name(int g_a) int NGA_Is_mirrored(int g_a) void NGA_List_nodeid(int *list, int nprocs) long NGA_Ldot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) long long NGA_Lldot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) int NGA_Locate(int g_a, int subscript[]) int NGA_Locate_num_blocks(int g_a, int lo[], int hi[]) int NGA_Locate_nnodes(int g_a, int lo[], int hi[]) int NGA_Locate_region(int g_a,int lo[],int hi[],int map[],int procs[]) void NGA_Lock(int mutex) void NGA_Mask_sync(int first, int last) void NGA_Matmul_patch(char transa, char transb, void* alpha, void *beta, int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[], int g_c, int clo[], int chi[]) size_t NGA_Memory_avail() int NGA_Memory_limited() void NGA_Merge_distr_patch(int g_a, int alo[], int ahi[], int g_b, int blo[], int bhi[]) void NGA_Merge_mirrored(int g_a) void NGA_Nblock(int g_a, int *nblock) void NGA_NbAcc(int g_a,int lo[], int hi[],void* buf,int ld[],void* alpha, ga_nbhdl_t* nbhandle) void NGA_NbGet_ghost_dir(int g_a, int mask[], ga_nbhdl_t* handle) void NGA_NbGet(int g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle) void NGA_Nbget_field(int g_a, int *lo, int *hi, int foff, int fsize,void *buf, int *ld, ga_nbhdl_t *nbhandle) void NGA_Nbput_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld, ga_nbhdl_t *nbhandle) void NGA_NbPut(int g_a, int lo[], int hi[], void* buf, int ld[], ga_nbhdl_t* nbhandle) int NGA_NbTest(ga_nbhdl_t* nbhandle) void NGA_NbWait(ga_nbhdl_t* nbhandle) int NGA_Ndim(int g_a) int NGA_Nnodes() int NGA_Nodeid() void NGA_Periodic_acc(int g_a, int lo[], int hi[],void* buf,int ld[],void* alpha) void NGA_Periodic_get(int g_a, int lo[], int hi[], void* buf, int ld[]) void NGA_Periodic_put(int g_a, int lo[], int hi[], void* buf, int ld[]) int NGA_Pgroup_absolute_id(int pgroup, int pid) int NGA_Pgroup_create(int *list, int count) int NGA_Pgroup_destroy(int grp) int NGA_Pgroup_get_default() int NGA_Pgroup_get_mirror() int NGA_Pgroup_get_world() int NGA_Pgroup_nnodes(int grp_id) int NGA_Pgroup_nodeid(int grp_id) void NGA_Pgroup_set_default(int p_handle) int NGA_Pgroup_split(int grp_id, int num_group) int NGA_Pgroup_split_irreg(int grp_id, int color) void NGA_Pgroup_sync(int grp_id) void NGA_Print_patch(int g_a, int lo[], int hi[], int pretty) void NGA_Proc_topology(int g_a, int proc, int coord[]) void NGA_Put(int g_a, int lo[], int hi[], void* buf, int ld[]) void NGA_Put_field(int g_a, int *lo, int *hi, int foff, int fsize, void *buf, int *ld) void NGA_Randomize(int g_a, void *value) long NGA_Read_inc(int g_a, int subscript[], long inc) int NGA_Register_type(size_t bytes) void NGA_Release_block_grid(int g_a, int index[]) void NGA_Release_block(int g_a, int idx) void NGA_Release_block_segment(int g_a, int idx) void NGA_Release_ghost_element(int g_a, int index[]) void NGA_Release_ghosts(int g_a) void NGA_Release(int g_a, int lo[], int hi[]) void NGA_Release_update_block_grid(int g_a, int index[]) void NGA_Release_update_block(int g_a, int idx) void NGA_Release_update_block_segment(int g_a, int idx) void NGA_Release_update_ghost_element(int g_a, int index[]) void NGA_Release_update_ghosts(int g_a) void NGA_Release_update(int g_a, int lo[], int hi[]) void NGA_Scale_patch(int g_a, int lo[], int hi[], void *alpha) void NGA_Scatter_acc(int g_a, void *v, int* subsArray[], int n, void *alpha) void NGA_Scatter_acc_flat(int g_a, void *v, int subsArray[], int n, void *alpha) void NGA_Scatter(int g_a, void *v, int* subsArray[], int n) void NGA_Scatter_flat(int g_a, void *v, int subsArray[], int n) void NGA_Select_elem(int g_a, char* op, void* val, int *index) void NGA_Set_array_name(int g_a, char *name) void NGA_Set_block_cyclic(int g_a, int dims[]) void NGA_Set_block_cyclic_proc_grid(int g_a, int block[], int proc_grid[]) void NGA_Set_chunk(int g_a, int chunk[]) void NGA_Set_data(int g_a, int ndim, int dims[], int type) void NGA_Set_debug(int flag) void NGA_Set_ghosts(int g_a, int width[]) void NGA_Set_irreg_distr(int g_a, int map[], int block[]) void NGA_Set_irreg_flag(int g_a, int flag) void NGA_Set_memory_limit(size_t limit) void NGA_Set_pgroup(int g_a, int p_handle) void NGA_Set_restricted(int g_a, int list[], int size) void NGA_Set_restricted_range(int g_a, int lo_proc, int hi_proc) void NGA_Strided_acc(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[], void *alpha) void NGA_Strided_get(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[]) void NGA_Strided_put(int g_a, int lo[], int hi[], int skip[], void* buf, int ld[]) void NGA_Sync() void NGA_Terminate() int NGA_Total_blocks(int g_a) void NGA_Unlock(int mutex) int NGA_Update_ghost_dir(int g_a, int dimension, int idir, int flag) int NGA_Uses_ma() int NGA_Uses_proc_grid(int g_a) int NGA_Valid_handle(int g_a) int NGA_Verify_handle(int g_a) DoubleComplex NGA_Zdot_patch(int g_a, char t_a, int alo[], int ahi[], int g_b, char t_b, int blo[], int bhi[]) void NGA_Zero_patch(int g_a, int lo[], int hi[]) void GA_Abs_value_patch64(int g_a, int64_t *lo, int64_t *hi) void GA_Add_constant_patch64(int g,int64_t *lo,int64_t *hi,void *alpha) void GA_Cgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, SingleComplex alpha, int g_a, int g_b, SingleComplex beta, int g_c ) void GA_Dgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, double alpha, int g_a, int g_b, double beta, int g_c ) void GA_Elem_divide_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]) void GA_Elem_maximum_patch64(int g_a,int64_t *alo,int64_t *ahi, int g_b,int64_t *blo,int64_t *bhi, int g_c,int64_t *clo,int64_t *chi) void GA_Elem_minimum_patch64(int g_a,int64_t *alo,int64_t *ahi, int g_b,int64_t *blo,int64_t *bhi, int g_c,int64_t *clo,int64_t *chi) void GA_Elem_multiply_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]) void GA_Matmul_patch64(char transa, char transb, void* alpha, void *beta, int g_a, int64_t ailo, int64_t aihi, int64_t ajlo, int64_t ajhi, int g_b, int64_t bilo, int64_t bihi, int64_t bjlo, int64_t bjhi, int g_c, int64_t cilo, int64_t cihi, int64_t cjlo, int64_t cjhi) void GA_Median_patch64(int g_a, int64_t *alo, int64_t *ahi, int g_b, int64_t *blo, int64_t *bhi, int g_c, int64_t *clo, int64_t *chi, int g_m, int64_t *mlo, int64_t *mhi) void GA_Pack64(int g_src, int g_dest, int g_mask, int64_t lo, int64_t hi, int64_t *icount) void GA_Pack(int g_src, int g_dest, int g_mask, int lo, int hi, int *icount) void GA_Patch_enum64(int g_a, int64_t lo, int64_t hi, void *start, void *inc) void GA_Patch_enum(int g_a, int lo, int hi, void *start, void *inc) void GA_Recip_patch64(int g_a,int64_t *lo, int64_t *hi) void GA_Scan_add64(int g_a, int g_b, int g_sbit, int64_t lo, int64_t hi, int excl) void GA_Scan_copy64(int g_a, int g_b, int g_sbit, int64_t lo, int64_t hi) void GA_Set_chunk64(int g_a, int64_t chunk[]) void GA_Set_data64(int g_a, int ndim, int64_t dims[], int type) void GA_Set_ghosts64(int g_a, int64_t width[]) void GA_Set_irreg_distr64(int g_a, int64_t map[], int64_t block[]) void GA_Sgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, float alpha, int g_a, int g_b, float beta, int g_c ) void GA_Step_bound_info_patch64(int g_xx, int64_t xxlo[], int64_t xxhi[], int g_vv, int64_t vvlo[], int64_t vvhi[], int g_xxll, int64_t xxlllo[], int64_t xxllhi[], int64_t g_xxuu, int64_t xxuulo[], int64_t xxuuhi[], void *boundmin, void *wolfemin, void *boundmax) void GA_Step_max_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], void *step) void GA_Unpack64(int g_src, int g_dest, int g_mask, int64_t lo, int64_t hi, int64_t *icount) void GA_Unpack(int g_src, int g_dest, int g_mask, int lo, int hi, int *icount) void GA_Zgemm64(char ta, char tb, int64_t m, int64_t n, int64_t k, DoubleComplex alpha, int g_a, int g_b, DoubleComplex beta, int g_c ) void NGA_Acc64(int g_a, int64_t lo[], int64_t hi[],void* buf,int64_t ld[],void* alpha) void NGA_Access64(int g_a, int64_t lo[], int64_t hi[], void *ptr, int64_t ld[]) void NGA_Access_block64(int g_a, int64_t idx, void *ptr, int64_t ld[]) void NGA_Access_block_grid64(int g_a, int64_t index[], void *ptr, int64_t ld[]) void NGA_Access_block_segment64(int g_a, int proc, void *ptr, int64_t *len) void NGA_Access_ghost_element64(int g_a, void *ptr, int64_t subscript[], int64_t ld[]) void NGA_Access_ghosts64(int g_a, int64_t dims[], void *ptr, int64_t ld[]) void NGA_Add_patch64(void * alpha, int g_a, int64_t alo[], int64_t ahi[], void * beta, int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]) SingleComplex NGA_Cdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) void NGA_Copy_patch64(char trans, int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[]) int NGA_Create64(int type,int ndim,int64_t dims[], char *name, int64_t chunk[]) int NGA_Create_config64(int type,int ndim,int64_t dims[], char *name, int64_t chunk[], int p_handle) int NGA_Create_ghosts64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t chunk[]) int NGA_Create_ghosts_config64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t chunk[], int p_handle) int NGA_Create_ghosts_irreg64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t map[], int64_t nblock[]) int NGA_Create_ghosts_irreg_config64(int type,int ndim,int64_t dims[], int64_t width[], char *name, int64_t map[], int64_t nblock[], int p_handle) int NGA_Create_irreg64(int type,int ndim,int64_t dims[],char *name, int64_t map[], int64_t block[]) int NGA_Create_irreg_config64(int type,int ndim,int64_t dims[],char *name, int64_t map[], int64_t block[], int p_handle) double NGA_Ddot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) void NGA_Distribution64(int g_a, int iproc, int64_t lo[], int64_t hi[]) float NGA_Fdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) void NGA_Fill_patch64(int g_a, int64_t lo[], int64_t hi[], void *val) void NGA_Gather64(int g_a, void *v, int64_t* subsArray[], int64_t n) void NGA_Gather_flat64(int g_a, void *v, int64_t subsArray[], int64_t n) void NGA_Get64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) void NGA_Get_ghost_block64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) int NGA_Idot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) void NGA_Inquire64(int g_a, int *type, int *ndim, int64_t dims[]) long NGA_Ldot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) long long NGA_Lldot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) int NGA_Locate64(int g_a, int64_t subscript[]) int NGA_Locate_nnodes64(int g_a, int64_t lo[], int64_t hi[]) int NGA_Locate_region64(int g_a,int64_t lo[],int64_t hi[],int64_t map[],int procs[]) void NGA_Matmul_patch64(char transa, char transb, void* alpha, void *beta, int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[], int g_c, int64_t clo[], int64_t chi[]) void NGA_Merge_distr_patch64(int g_a, int64_t alo[], int64_t ahi[], int g_b, int64_t blo[], int64_t bhi[]) void NGA_NbAcc64(int g_a,int64_t lo[],int64_t hi[],void* buf,int64_t ld[],void* alpha, ga_nbhdl_t* nbhandle) void NGA_NbGet64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[], ga_nbhdl_t* nbhandle) void NGA_NbGet_ghost_dir64(int g_a, int64_t mask[], ga_nbhdl_t* handle) void NGA_NbPut64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[], ga_nbhdl_t* nbhandle) void NGA_Periodic_acc64(int g_a, int64_t lo[], int64_t hi[],void* buf,int64_t ld[],void* alpha) void NGA_Periodic_get64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) void NGA_Periodic_put64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) void NGA_Print_patch64(int g_a, int64_t lo[], int64_t hi[], int pretty) void NGA_Put64(int g_a, int64_t lo[], int64_t hi[], void* buf, int64_t ld[]) long NGA_Read_inc64(int g_a, int64_t subscript[], long inc) void NGA_Release64(int g_a, int64_t lo[], int64_t hi[]) void NGA_Release_ghost_element64(int g_a, int64_t index[]) void NGA_Release_update64(int g_a, int64_t lo[], int64_t hi[]) void NGA_Release_update_ghost_element64(int g_a, int64_t index[]) void NGA_Scale_patch64(int g_a, int64_t lo[], int64_t hi[], void *alpha) void NGA_Scatter64(int g_a, void *v, int64_t* subsArray[], int64_t n) void NGA_Scatter_flat64(int g_a, void *v, int64_t subsArray[], int64_t n) void NGA_Scatter_acc64(int g_a, void *v, int64_t* subsArray[], int64_t n, void *alpha) void NGA_Scatter_acc_flat64(int g_a, void *v, int64_t subsArray[], int64_t n, void *alpha) void NGA_Select_elem64(int g_a, char* op, void* val, int64_t* index) void NGA_Set_data64(int g_a, int ndim, int64_t dims[], int type) void NGA_Set_ghosts64(int g_a, int64_t width[]) void NGA_Set_irreg_distr64(int g_a, int64_t map[], int64_t block[]) void NGA_Strided_acc64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[], void *alpha) void NGA_Strided_get64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[]) void NGA_Strided_put64(int g_a, int64_t lo[], int64_t hi[], int64_t skip[], void* buf, int64_t ld[]) DoubleComplex NGA_Zdot_patch64(int g_a, char t_a, int64_t alo[], int64_t ahi[], int g_b, char t_b, int64_t blo[], int64_t bhi[]) void NGA_Zero_patch64(int g_a, int64_t lo[], int64_t hi[]) ga-5-4/python/ga4py/__init__.py0000644000175000017500000000000012662210323014471 0ustar mbambaga-5-4/python/ga4py/ga.pyx0000644000175000017500000045542712662210323013544 0ustar mbamba#cython: embedsignature=True """The Global Arrays (GA) Python interface. This module exports the GA C API, with a few enhancements. The notable exceptions include supporting Pythonic ranges. The ranges here are half-open e.g. [0,n) instead of in the C API where they are closed e.g. [0,n]. This follows the Python convention. """ # keep the ga functions alphabetical since this is going to be a huge file! from libc.stdlib cimport malloc,free from gah cimport * import numpy as np cimport numpy as np from cpython.ref cimport Py_INCREF from cpython.ref cimport PyTypeObject import __builtin__ DEF EXCLUSIVE = 0 np.import_array() cdef extern from "numpy/arrayobject.h": object PyArray_NewFromDescr(PyTypeObject* subtype, np.dtype descr, int nd, np.npy_intp * dims, np.npy_intp * strides, void * data, int flags, object obj) cdef bint _initialized = False TYPE_BASE = 1000 C_CHAR = (TYPE_BASE + 0) C_INT = (TYPE_BASE + 1) C_LONG = (TYPE_BASE + 2) C_FLOAT = (TYPE_BASE + 3) C_DBL = (TYPE_BASE + 4) C_LDBL = (TYPE_BASE + 5) C_SCPL = (TYPE_BASE + 6) C_DCPL = (TYPE_BASE + 7) C_LDCPL = (TYPE_BASE + 8) F_BYTE = (TYPE_BASE + 9) F_INT = (TYPE_BASE + 10) F_LOG = (TYPE_BASE + 11) F_REAL = (TYPE_BASE + 12) F_DBL = (TYPE_BASE + 13) F_SCPL = (TYPE_BASE + 14) F_DCPL = (TYPE_BASE + 15) C_LONGLONG = (TYPE_BASE + 16) WORLD_PROC_GROUP = -1 _to_dtype = { C_CHAR: np.dtype(np.int8), C_INT: np.dtype(np.int32), C_LONG: np.dtype(np.int64), C_LONGLONG: np.dtype(np.int64), C_FLOAT: np.dtype(np.float32), C_DBL: np.dtype(np.float64), C_SCPL: np.dtype(np.complex64), C_DCPL: np.dtype(np.complex128), } # numpy doesn't always have these types depending on the system cdef bint float128_in_np = ('float128' in dir(np)) cdef bint complex256_in_np = ('complex256' in dir(np)) if float128_in_np: _to_dtype[C_LDBL] = np.dtype(np.float128) if complex256_in_np: _to_dtype[C_LDCPL] = np.dtype(np.complex256) ############################################################################# # utility functions ############################################################################# def dtype(int gatype): """Converts the given GA type to a numpy dtype.""" if gatype in _to_dtype: return _to_dtype[gatype] raise ValueError, "%d was not a recognized GA type" % gatype def inquire_dtype(int g_a): """Returns the numpy dtype of the given GA.""" gatype = inquire_type(g_a) return dtype(gatype) cdef inline void* _gapy_malloc(size_t bytes, int align, char *name): """Wrapper around C stdlib malloc().""" return malloc(bytes) cdef inline void _gapy_free(void *ptr): """Wrapper around C stdlib free().""" free(ptr) cdef inline np.ndarray[np.int32_t, ndim=1] _inta32(array_like): """Converts an integer array-like to an ndarray of 32bit integers. Functions which take a dimension shape or subscript can use this to convert what the user passes to a numpy.ndarray using numpy.asarray. As a convenience, single values can be passed as well. :Parameters: array_like : integer array-like :returns: The converted array_like to an ndarray. """ cdef np.ndarray[np.int32_t, ndim=1] array_like_nd try: array_like_nd = np.asarray(array_like, dtype=np.int32) except ValueError: # try again in case array_like is a single value array_like_nd = np.asarray([array_like], dtype=np.int32) return array_like_nd cdef inline np.ndarray[np.int64_t, ndim=1] _inta64(array_like): """Converts an integer array-like to an ndarray of 64bit integers. Functions which take a dimension shape or subscript can use this to convert what the user passes to a numpy.ndarray using numpy.asarray. As a convenience, single values can be passed as well. :Parameters: array_like : integer array-like :returns: The converted array_like to an ndarray. """ cdef np.ndarray[np.int64_t, ndim=1] array_like_nd try: array_like_nd = np.asarray(array_like, dtype=np.int64) except ValueError: # try again in case array_like is a single value array_like_nd = np.asarray([array_like], dtype=np.int64) return array_like_nd cdef inline _lohi(int g_a, lo, hi): """Converts and/or prepares a lo/hi combination. Functions which take a patch specification can use this to convert the given lo and/or hi into ndarrays using numpy.asarray. * If neither lo nor hi is given, lo is replaced with an array of zeros and hi is replaced with the last index in each dimension (i.e. the shape). * If only lo is given, hi is replaced with lo. In other words, this is a single value. * It is an error to specify hi without lo. :Parameters: g_a : int the array handle lo : 1D array-like lower bounds of a slice hi : 1D array-like upper bounds of a slice :returns: The converted lo and hi ndarrays. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef int ndim = GA_Ndim(g_a) if lo is None and hi is None: lo_nd = np.zeros((ndim), dtype=np.int64) hi_nd = inquire_dims(g_a) elif lo is not None and hi is None: lo_nd = _inta64(lo) hi_nd = lo_nd+1 elif lo is None and hi is not None: raise ValueError, 'lo cannot be None if hi is None' else: # lo and hi are not None lo_nd = _inta64(lo) hi_nd = _inta64(hi) if len(lo_nd) != ndim: raise ValueError, 'len(lo_nd) != ndim; len(%s) != %s' % (lo_nd,ndim) if len(hi_nd) != ndim: raise ValueError, 'len(hi_nd) != ndim; len(%s) != %s' % (hi_nd,ndim) # We must make a copy of hi_nd. If user passes in an ndarray, the # following "prep" operation will change the user's 'hi'. #hi_nd -= 1 # <----- don't do that! hi_nd = hi_nd-1 # prep hi for GA's inclusive indexing return lo_nd,hi_nd cdef void* _convert_multiplier(int gtype, value, int *iv, long *lv, long long *llv, float *fv, double *dv, long double *ldv, SingleComplex *fcv, DoubleComplex *dcv): """Returns the address of an appropriately converted value. Functions which take an alpha/beta/value need to have the value appropriately converted from the (possible) Python type to a C type. Often the GA function takes a void* in this case, so the address of the converted value is returned. """ cdef float complex pfcv=1.0 cdef double complex pdcv=1.0 if value is None: raise ValueError, "cannot convert None" if gtype == C_INT: iv[0] = value return iv elif gtype == C_LONG: lv[0] = value return lv elif gtype == C_LONGLONG: llv[0] = value return llv elif gtype == C_FLOAT: fv[0] = value return fv elif gtype == C_DBL: dv[0] = value return dv elif gtype == C_LDBL and float128_in_np: ldv[0] = value return ldv elif gtype == C_SCPL: pfcv = value fcv[0].real = pfcv.real fcv[0].imag = pfcv.imag return fcv elif gtype == C_DCPL: pdcv = value dcv[0].real = pdcv.real dcv[0].imag = pdcv.imag return dcv else: raise TypeError, "type of g_a not recognized" def zip(lo, hi): """Transforms a GA lo,hi combination into a slice list.""" return [slice(l,h) for l,h in __builtin__.zip(lo,hi)] ############################################################################# # GA API ############################################################################# def abs_value(int g_a, lo=None, hi=None): """Take element-wise absolute value of the array or patch. This is a collective operation. :Parameters: g_a : int the array handle lo : 1D array-like lower bound patch coordinates, inclusive hi : 1D array-like higher bound patch coordinates, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd if lo is None and hi is None: GA_Abs_value(g_a) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) GA_Abs_value_patch64(g_a, lo_nd.data, hi_nd.data) def acc(int g_a, buffer, lo=None, hi=None, alpha=None): """Combines data from buffer with data in the global array patch. The buffer array is assumed to be have the same number of dimensions as the global array. If the buffer is not contiguous, a contiguous copy will be made. global array section (lo[],hi[]) += alpha * buffer This is a one-sided and atomic operation. :Parameters: g_a : int the array handle buffer : array-like must be contiguous and have same number of elements as patch lo : 1D array-like lower bound patch coordinates, inclusive hi : 1D array-like higher bound patch coordinates, exclusive alpha : object multiplier (converted to appropriate type) """ _acc_common(g_a, buffer, lo, hi, alpha) cdef _acc_common(int g_a, buffer, lo=None, hi=None, alpha=None, bint nb=False, bint periodic=False, skip=None): """Combines data from buffer with data in the global array patch. The local array is assumed to have the same shape as the requested region, or the local array can be 1-dimensional so long as it has the same number of elements as the requested region. Any detected inconsitencies raise a ValueError. global array section (lo[],hi[]) += alpha * buffer This is a one-sided and atomic operation. :Parameters: g_a : int the array handle buffer : array-like the data to put; should either be 1D and len(buffer)==np.prod(hi-lo), or np.all(buffer.shape == hi-lo) i.e. buffer is 1D and same size as requested region or buffer is the same shape as requested region lo : 1D array-like lower bound patch coordinates, inclusive hi : 1D array-like higher bound patch coordinates, exclusive alpha : object multiplier (converted to appropriate type) nb : bool whether the call is non-blocking periodic : bool whether the call is periodic skip : 1D array-like strides for each dimension :see: nbacc :see: periodic_acc :see: strided_acc :returns: None, however if nb=True, the nonblocking handle is returned. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd, ld_nd, shape, skip_nd cdef np.ndarray buffer_nd cdef int gtype=inquire_type(g_a) cdef int ialpha cdef long lalpha cdef long long llalpha cdef float falpha cdef double dalpha cdef long double ldalpha cdef SingleComplex fcalpha cdef DoubleComplex dcalpha cdef void *valpha=NULL cdef ga_nbhdl_t nbhandle dtype = _to_dtype[gtype] lo_nd,hi_nd = _lohi(g_a,lo,hi) shape = hi_nd-lo_nd+1 if skip is None: skip_nd = None else: skip_nd = _inta64(skip) shape = (hi_nd-lo_nd)/skip_nd+1 buffer_nd = np.asarray(buffer, dtype=dtype) if buffer_nd.dtype != dtype: raise ValueError, "buffer is wrong type :: buffer=%s != %s" % ( buffer.dtype, dtype) # Due to GA restrictions, buffer must not have negative strides # and buffer's last stride must be same as itemsize strides = [buffer_nd.strides[i]/buffer_nd.itemsize for i in range(buffer_nd.ndim)] if (strides and (strides[-1] != 1 or np.any(np.asarray(strides) < 0))): buffer_nd = np.ascontiguousarray(buffer_nd) # we allow 1-d "flat" buffers in addition to buffers matching the shape of # the requested region if buffer_nd.ndim == 1: if buffer_nd.size != np.prod(shape): raise ValueError, ('buffer size does not match shape :: ' 'buffer.size=%s != np.prod(shape)=%s' % ( buffer_nd.size, np.prod(shape))) ld_nd = shape[1:] else: buffer_shape = [buffer_nd.shape[i] for i in range(buffer_nd.ndim)] if not np.all(buffer_shape == shape): raise ValueError, ('buffer shape does not match request shape :: ' 'buffer_shape=%s != shape=%s' % ( buffer_shape, shape)) ld_nd = np.asarray([strides[i]/strides[i+1] for i in range(buffer_nd.ndim-1)], dtype=np.int64) if alpha is None: alpha = 1 valpha = _convert_multiplier(gtype, alpha, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) if nb: NGA_NbAcc64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data, valpha, &nbhandle) return nbhandle elif periodic: NGA_Periodic_acc64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data, valpha) elif skip is not None: NGA_Strided_acc64(g_a, lo_nd.data, hi_nd.data, skip_nd.data, buffer_nd.data, ld_nd.data, valpha) else: NGA_Acc64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data, valpha) def access(int g_a, lo=None, hi=None, int proc=-1): """Returns local array patch. This routine allows to access directly, in place elements in the local section of a global array. It useful for writing new GA operations. If no patch is specified, the entire local patch is returned. If this process does not own any data, None is returned. Note: The entire local data is always accessed, but if a smaller patch is requested, an appropriately sliced ndarray is returned. If proc is not specified, then ga.nodeid() is used. Each call to ga.access has to be followed by a call to either ga.release or ga.release_update. You can access in this fashion only local data. Since the data is shared with other processes, you need to consider issues of mutual exclusion. This operation is local. :Parameters: g_a : int the array handle lo : 1D array-like lower bound patch coordinates, inclusive hi : 1D array-like higher bound patch coordinates, exclusive proc : int defaults to ga.nodeid(), but can specify a proc within the same SMP node to access its data instead :returns: ndarray representing local patch """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef np.ndarray[np.int64_t, ndim=1] ld_nd, lo_dst, hi_dst, dims_nd cdef int i, gtype=inquire_type(g_a) cdef int dimlen=GA_Ndim(g_a) cdef np.dtype dtype = _to_dtype[gtype] cdef void *ptr cdef np.npy_intp *dims = NULL cdef np.npy_intp *strides = NULL if proc < 0: proc = GA_Nodeid() # first things first, if no data is owned, return None lo_dst,hi_dst = distribution(g_a, proc) if lo_dst[0] < 0 or hi_dst[0] < 0: return None # always access the entire local data ld_nd = np.ones(dimlen, dtype=np.int64) # put hi_dst back to GA inclusive indexing convention hi_dst -= 1 NGA_Access64(g_a, lo_dst.data, hi_dst.data, &ptr, ld_nd.data) # put hi_dst back to Python exclusive indexing convention hi_dst += 1 dims_nd = hi_dst-lo_dst # fix the strides, for example if ghost cells are in use # or if memory is allocated in a non-contiguous way if dimlen >= 3: for i in range(-3, -dimlen-1, -1): ld_nd[i] *= ld_nd[i+1] ld_nd *= _to_dtype[gtype].itemsize # must convert int64_t ndarray shape to npy_intp array dims = malloc(dimlen*sizeof(np.npy_intp)) strides = malloc(dimlen*sizeof(np.npy_intp)) for i in range(dimlen): dims[i] = dims_nd[i] strides[i] = ld_nd[i] Py_INCREF(dtype) array = PyArray_NewFromDescr(np.ndarray, dtype, dimlen, dims, strides, ptr, np.NPY_WRITEABLE, None) free(dims) free(strides) if lo is not None or hi is not None: if lo is not None: lo_nd = _inta64(lo) else: lo_nd = lo_dst if hi is not None: hi_nd = _inta64(hi) else: hi_nd = hi_dst # sanity checks if np.sometrue(lo_nd>hi_nd): raise ValueError,"lo>hi lo=%s hi=%s"%(lo_nd,hi_nd) if np.sometrue(lo_ndhi_dst): raise ValueError,"hi out of bounds hi_dst=%s hi=%s"%(hi_dst,hi_nd) slices = [] for i in range(dimlen): slices.append(slice(lo_nd[i]-lo_dst[i],hi_nd[i]-lo_dst[i])) return array[slices] return array def access_block(int g_a, int idx): """Returns local array patch for a block-cyclic distribution. This routine allows to access directly, in place elements in the local section of a global array. It useful for writing new GA operations. Each call to ga.access_block has to be followed by a call to either ga.release_block or ga.release_update_block. You can access in this fashion only local data. Since the data is shared with other processes, you need to consider issues of mutual exclusion. This operation is local. :Parameters: g_a : int the array handle idx : int the block index :returns: ndarray representing local block """ cdef np.ndarray[np.int64_t, ndim=1] ld_nd, lo_dst, hi_dst, dims_nd cdef int i, gtype=inquire_type(g_a) cdef int dimlen=GA_Ndim(g_a), typenum=_to_dtype[gtype].num cdef void *ptr cdef np.npy_intp *dims = NULL # first things first, if no data is owned, return None lo_dst,hi_dst = distribution(g_a, idx) if lo_dst[0] < 0 or hi_dst[0] < 0: return None # put hi_dst back to GA inclusive indexing convention hi_dst -= 1 # always access the entire local data ld_nd = np.zeros(dimlen-1, dtype=np.int64) NGA_Access_block64(g_a, idx, &ptr, ld_nd.data) dims_nd = hi_dst-lo_dst+1 # must convert int64_t ndarray shape to npy_intp array dims = malloc(dimlen*sizeof(np.npy_intp)) for i in range(dimlen): dims[i] = dims_nd[i] array = np.PyArray_SimpleNewFromData(dimlen, dims, typenum, ptr) free(dims) return array def access_block_grid(int g_a, subscript): """Returns local array patch for a SCALAPACK block-cyclic distribution. The subscript array contains the subscript of the block in the array of blocks. This subscript is based on the location of the block in a grid, each of whose dimensions is equal to the number of blocks that fit along that dimension. Each call to ga.access_block_grid has to be followed by a call to either ga.release_block_grid or ga.release_update_block_grid. You can access in this fashion only local data. Since the data is shared with other processes, you need to consider issues of mutual exclusion. This operation is local. :Parameters: g_a : int the array handle subscript : 1D array-like subscript of the block in the array :returns: ndarray representing local block """ raise NotImplementedError def access_block_segment(int g_a, int proc): """This function can be used to gain access to the all the locally held data on a particular processor that is associated with a block-cyclic distributed array. The data inside this segment has a lot of additional structure so this function is not generally useful to developers. It is primarily used inside the GA library to implement other GA routines. Each call to ga.access_block_segment should be followed by a call to either ga.release_block_segment or ga.release_update_block_segment. This is a local operation. :Parameters: g_a : int the array handle proc : int processor ID :returns: ndarray representing local block """ cdef int64_t elems cdef int gtype=inquire_type(g_a) cdef int typenum=_to_dtype[gtype].num cdef void *ptr cdef np.npy_intp *dims = NULL # always access the entire local data NGA_Access_block_segment64(g_a, proc, &ptr, &elems) # must convert int64_t ndarray shape to npy_intp array dims = malloc(sizeof(np.npy_intp)) dims[0] = elems array = np.PyArray_SimpleNewFromData(1, dims, typenum, ptr) free(dims) return array def access_ghost_element(int g_a, subscript): """Returns a scalar ndarray representing the requested ghost element. This function can be used to return a pointer to any data element in the locally held portion of the global array and can be used to directly access ghost cell data. The array subscript refers to the local index of the element relative to the origin of the local patch (which is assumed to be indexed by (0,0,...)). This is a local operation. :Parameters: g_a : int the array handle subscript : 1D array-like of integers index of the desired element :returns: ndarray scalar representing local block """ raise NotImplementedError, "use access_ghosts(g_a) instead" def access_ghosts(int g_a): """Returns ndarray representing local patch with ghost cells. This routine will provide access to the ghost cell data residing on each processor. Calls to NGA_Access_ghosts should normally follow a call to NGA_Distribution that returns coordinates of the visible data patch associated with a processor. You need to make sure that the coordinates of the patch are valid (test values returned from NGA_Distribution). You can only access local data. This operation is local. :Parameters: g_a : int the array handle :returns: ndarray scalar representing local block with ghost cells """ cdef np.ndarray[np.int64_t, ndim=1] ld_nd, lo_dst, hi_dst, dims_nd cdef int i, gtype=inquire_type(g_a) cdef int dimlen=GA_Ndim(g_a), typenum=_to_dtype[gtype].num cdef void *ptr cdef np.npy_intp *dims = NULL # first things first, if no data is owned, return None lo_dst,hi_dst = distribution(g_a) if lo_dst[0] < 0 or hi_dst[0] < 0: return None # always access the entire local data dims_nd = np.zeros(dimlen, dtype=np.int64) ld_nd = np.zeros(dimlen-1, dtype=np.int64) NGA_Access_ghosts64(g_a, dims_nd.data, &ptr, ld_nd.data) # must convert int64_t ndarray shape to npy_intp array dims = malloc(dimlen*sizeof(np.npy_intp)) for i in range(dimlen): dims[i] = dims_nd[i] array = np.PyArray_SimpleNewFromData(dimlen, dims, typenum, ptr) free(dims) return array def add(int g_a, int g_b, int g_c, alpha=None, beta=None, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None): """Element-wise addition of two arrays. The arrays must be the same shape and identically aligned. The result (c) may replace one of the input arrays (a/b). Patches of arrays (which must have the same number of elements) may also be added together elementw=-wise, if patch coordinates are specified. c = alpha*a + beta*b This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle alpha : object multiplier (converted to appropriate type) beta : object multiplier (converted to appropriate type) alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd cdef int gtype=inquire_type(g_a) cdef int ialpha, ibeta cdef long lalpha, lbeta cdef long long llalpha, llbeta cdef float falpha, fbeta cdef double dalpha, dbeta cdef long double ldalpha, ldbeta cdef SingleComplex fcalpha, fcbeta cdef DoubleComplex dcalpha, dcbeta cdef void *valpha cdef void *vbeta if alpha is None: alpha = 1 valpha = _convert_multiplier(gtype, alpha, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) if beta is None: beta = 1 vbeta = _convert_multiplier(gtype, beta, &ibeta, &lbeta, &llbeta, &fbeta, &dbeta, &ldbeta, &fcbeta, &dcbeta) if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None): GA_Add(valpha, g_a, vbeta, g_b, g_c) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) NGA_Add_patch64( valpha, g_a, alo_nd.data, ahi_nd.data, vbeta, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def add_constant(int g_a, alpha, lo=None, hi=None): """Adds the constant alpha to each element of the array. This operation is collective. :Parameters: g_a : int the array handle alpha : object the constant to add (converted to appropriate type) lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef int gtype=inquire_type(g_a) cdef int ialpha cdef long lalpha cdef long long llalpha cdef float falpha cdef double dalpha cdef long double ldalpha cdef SingleComplex fcalpha cdef DoubleComplex dcalpha cdef void *valpha valpha = _convert_multiplier(gtype, alpha, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) if lo is None and hi is None: GA_Add_constant(g_a, valpha) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) GA_Add_constant_patch64( g_a, lo_nd.data, hi_nd.data, valpha) def add_diagonal(int g_a, int g_v): """Adds the elements of the vector g_v to the diagonal of matrix g_a. This operation is collective. :Parameters: g_a : int the array handle g_v : int the vector handle """ GA_Add_diagonal(g_a, g_v) def allocate(int g_a): """Allocates memory for the handle obtained using ga.create_handle. At a minimum, the ga.set_data function must be called before the memory is allocated. Other ga.set_xxx functions can also be called before invoking this function. This is a collective operation. :Parameters: g_a : int the array handle :returns: True if allocation of g_a was successful. """ if GA_Allocate(g_a) == 1: return True return False def brdcst(buffer, int root=0): """Broadcast from process root to all other processes. If the buffer is not contiguous, an error is raised. This operation is provided only for convenience purposes: it is available regardless of the message-passing library that GA is running with. This is a collective operation. :Parameters: buffer : 1D array-like of objects the ndarray message (converted to the appropriate type) root : int the process which is sending :returns: The buffer in case a temporary was passed in. """ cdef np.ndarray buffer_nd buffer_nd = np.asarray(buffer) if not buffer_nd.flags['C_CONTIGUOUS']: raise ValueError, "the buffer must be contiguous" #if buffer_nd.ndim != 1: # raise ValueError, "the buffer must be one-dimensional" GA_Brdcst(buffer_nd.data, buffer_nd.size*buffer_nd.itemsize, root) return buffer_nd def check_handle(int g_a, char *message): """Checks that the array handle g_a is valid. If not, calls ga.error withe the provided string. This operation is local. """ GA_Check_handle(g_a, message) def cluster_nnodes(): """Returns the total number of nodes that the program is running on. On SMP architectures, this will be less than or equal to the total number of processors. This is a local operation. """ return GA_Cluster_nnodes() def cluster_nodeid(int proc=-1): """Returns the node ID of this process or the given process. On SMP architectures with more than one processor per node, several processes may return the same node id. This is a local operation. :Parameters: proc : int process ID to lookup """ if proc >= 0: return GA_Cluster_proc_nodeid(proc) return GA_Cluster_nodeid() def cluster_proc_nodeid(int proc): """Returns the node ID of the specified process. On SMP architectures with more than one processor per node, several processors may return the same node id. This is a local operation. """ return GA_Cluster_proc_nodeid(proc) def cluster_nprocs(int node): """Returns the number of processors available on the given node. This is a local operation. """ return GA_Cluster_nprocs(node) def cluster_procid(int node, int proc): """Returns the proc ID associated with node and local proc ID. If node has N processors, then the value of proc lies between 0 and N-1. This is a local operation. """ return GA_Cluster_procid(node, proc) def compare_distr(int g_a, int g_b): """Compares the distributions of two global arrays. This is a collective operation. :returns: True if distributions are identical and False when they are not """ if GA_Compare_distr(g_a, g_b) == 0: return True return False def copy(int g_a, int g_b, alo=None, ahi=None, blo=None, bhi=None, bint trans=False): """Copies elements from array g_a into array g_b. For the operation over the entire arrays, the arrays must be the same type, shape, and identically aligned. No transpose is allowed in this case. For patch operations, the patches of arrays may be of different shapes but must have the same number of elements. Patches must be nonoverlapping (if g_a=g_b). Transposes are allowed for patch operations. This is a collective operation. :Parameters: g_a : int the array handle copying from g_b : int the array handle copying to alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive trans : bool whether the transpose operator should be applied True=applied """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef char trans_c if alo is None and ahi is None and blo is None and bhi is None: GA_Copy(g_a, g_b) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) if trans: trans_c = "T" else: trans_c = "N" NGA_Copy_patch64(trans_c, g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data) def create(int gtype, dims, char *name="", chunk=None, int pgroup=-1): """Creates an n-dimensional array using the regular distribution model. The array can be distributed evenly or not. The control over the distribution is accomplished by specifying chunk (block) size for all or some of array dimensions. For example, for a 2-dimensional array, setting chunk[0]=dim[0] gives distribution by vertical strips (chunk[0]*dims[0]); setting chunk[1]=dim[1] gives distribution by horizontal strips (chunk[1]*dims[1]). Actual chunks will be modified so that they are at least the size of the minimum and each process has either zero or one chunk. Specifying chunk[i] as <1 will cause that dimension to be distributed evenly. As a convenience, when chunk is omitted or None, the entire array is distributed evenly. :Parameters: gtype : int the type of the array dims : 1D array-like of integers shape of the array name : string the name of the array chunk : 1D array-like of integers see above pgroup : int create array only as part of this processor group :returns: a non-zero array handle means the call was succesful. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] dims_nd, chunk_nd=None dims_nd = _inta64(dims) if pgroup < 0: pgroup = pgroup_get_default() if chunk: chunk_nd = _inta64(chunk) return NGA_Create_config64(gtype, len(dims_nd), dims_nd.data, name, chunk_nd.data, pgroup) else: return NGA_Create_config64(gtype, len(dims_nd), dims_nd.data, name, NULL, pgroup) def create_ghosts(int gtype, dims, width, char *name="", chunk=None, int pgroup=-1): """Creates an array with a layer of ghost cells around the visible data. The array can be distributed evenly or not evenly. The control over the distribution is accomplished by specifying chunk (block) size for all or some of the array dimensions. For example, for a 2-dimensional array, setting chunk(1)=dim(1) gives distribution by vertical strips (chunk(1)*dims(1)); setting chunk(2)=dim(2) gives distribution by horizontal strips (chunk(2)*dims(2)). Actual chunks will be modified so that they are at least the size of the minimum and each process has either zero or one chunk. Specifying chunk(i) as <1 will cause that dimension (i-th) to be distributed evenly. The width of the ghost cell layer in each dimension is specified using the array width(). The local data of the global array residing on each processor will have a layer width[n] ghosts cells wide on either side of the visible data along the dimension n. :Parameters: gtype : int the type of the array dims : 1D array-like of integers shape of the array width : 1D array-like of integers ghost cell widths name : string the name of the array chunk : 1D array-like of integers see above pgroup : int create array only as part of this processor group :returns: a non-zero array handle means the call was successful. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] dims_nd, chunk_nd, width_nd dims_nd = _inta64(dims) width_nd = _inta64(width) if pgroup < 0: pgroup = pgroup_get_default() if chunk: chunk_nd = _inta64(chunk) return NGA_Create_ghosts_config64(gtype, len(dims_nd), dims_nd.data, width_nd.data, name, chunk_nd.data, pgroup) else: return NGA_Create_ghosts_config64(gtype, len(dims_nd), dims_nd.data, width_nd.data, name, NULL, pgroup) def create_handle(): """Returns a global array handle that can be used to create a new array. The sequence of operations is to begin with a call to ga.create_handle to get a new array handle. The attributes of the array, such as dimension, size, type, etc. can then be set using successive calls to the ga.set_xxx subroutines. When all array attributes have been set, the ga.allocate subroutine is called and the global array is actually created and memory for it is allocated. This is a collective operation. """ return GA_Create_handle() def create_irreg(int gtype, dims, block, map, char *name="", int pgroup=-1): """Creates an array by following the user-specified distribution. The distribution is specified as a Cartesian product of distributions for each dimension. The array indices start at 0. For example, the following figure demonstrates distribution of a 2-dimensional array 8x10 on 6 (or more) processors. nblock[2]=[3,2], the size of map array is s=5 and array map contains the following elements map=[0,2,6, 0, 5]. The distribution is nonuniform because, P1 and P4 get 20 elements each and processors P0,P2,P3, and P5 only 10 elements each. This is a collective operation. :Parameters: gtype : int the type of the array dims : 1D array-like of integers shape of the array block : 1D array-like of integers the number of blocks each dimension is divided into map : 1D array-like of integers starting index for each block len(map) == sum of all elements of nblock array name : string the name of the array pgroup : int create array only as part of this processor group :returns: integer handle representing the array; a non-zero value indicates success """ cdef np.ndarray[np.int64_t, ndim=1] dims_nd, block_nd, map_nd dims_nd = _inta64(dims) block_nd = _inta64(block) map_nd = _inta64(map) if pgroup < 0: pgroup = pgroup_get_default() return NGA_Create_irreg_config64(gtype, len(dims_nd), dims_nd.data, name, block_nd.data, map_nd.data, pgroup) def create_ghosts_irreg(int gtype, dims, width, block, map, char *name="", int pgroup=-1): """Creates an array with a layer of ghost cells around the visible data. The distribution is specified as a Cartesian product of distributions for each dimension. For example, the following figure demonstrates distribution of a 2-dimensional array 8x10 on 6 (or more) processors. nblock(2)=[3,2], the size of map array is s=5 and array map contains the following elements map=[1,3,7, 1, 6]. The distribution is nonuniform because, P1 and P4 get 20 elements each and processors P0,P2,P3, and P5 only 10 elements each. The array width[] is used to control the width of the ghost cell boundary around the visible data on each processor. The local data of the global array residing on each processor will have a layer width[n] ghosts cells wide on either side of the visible data along the dimension n. This is a collective operation. :Parameters: gtype : int the type of the array dims : 1D array-like of integers shape of the array width : 1D array-like of integers ghost cell widths block : 1D array-like of integers number of blocks each dimension is divided into map : 1D array-like of integers starting index for each block len(map) == sum of all elements of nblock array name : string the name of the array pgroup : int create array only as part of this processor group :returns: a non-zero array handle means the call was succesful """ cdef np.ndarray[np.int64_t, ndim=1] dims_nd, width_nd, block_nd, map_nd dims_nd = _inta64(dims) width_nd = _inta64(width) block_nd = _inta64(block) map_nd = _inta64(map) if pgroup < 0: pgroup = pgroup_get_default() return NGA_Create_ghosts_irreg_config64(gtype, len(dims_nd), dims_nd.data, width_nd.data, name, block_nd.data, map_nd.data, pgroup) def create_mutexes(int number): """Creates a set containing the number of mutexes. Mutex is a simple synchronization object used to protect Critical Sections. Only one set of mutexes can exist at a time. Array of mutexes can be created and destroyed as many times as needed. Mutexes are numbered: 0, ..., number -1. This is a collective operation. :Parameters: number : int the number of mutexes to create :returns: True on success, False on failure """ if GA_Create_mutexes(number) == 1: return True return False def deregister_type(int type): """Removes the data type previously registered using register_type. :Parameters: type : int the data type handle """ return NGA_Deregister_type(type) def destroy(int g_a): """Deallocates the array and frees any associated resources. This is a collective operation. """ GA_Destroy(g_a) def destroy_mutexes(): """Destroys the set of mutexes created with ga_create_mutexes. :returns: True if the operation succeeded; False when failed This is a collective operation. """ if GA_Destroy_mutexes() == 1: return True return False def diag(int g_a, int g_s, int g_v, evalues=None): """Solve the generalized eigen-value problem. The input matrices are not overwritten or destroyed. :Parameters: g_a : int the array handle of the matrix to diagonalize g_s : int the array handle of the metric g_v : int the array handle to return evecs :returns: All eigen-values as an ndarray in ascending order. This is a collective operation. """ if evalues is None: gtype,dims = inquire(g_a) evalues = np.ndarray((dims[0]), dtype=_to_dtype(gtype)) else: evalues = np.asarray(evalues) GA_Diag(g_a, g_s, g_v, evalues.data) return evalues def diag_reuse(int control, int g_a, int g_s, int g_v, evalues=None): """Solve the generalized eigen-value problem. Recommended for REPEATED calls if g_s is unchanged. The input matrices are not overwritten or destroyed. :Parameters: control : int 0 indicates first call to the eigensolver; >0 consecutive calls (reuses factored g_s); <0 only erases factorized g_s; g_v and eval unchanged (should be called after previous use if another eigenproblem, i.e., different g_a and g_s, is to be solved) g_a : int the array handle of the matrix to diagonalize g_s : int the array handle of the metric g_v : int the array handle to return evecs :returns: All eigen-values as an ndarray in ascending order. This is a collective operation. """ if evalues is None: gtype,dims = inquire(g_a) evalues = np.ndarray((dims[0]), dtype=_to_dtype(gtype)) else: evalues = np.asarray(evalues) GA_Diag_reuse(control, g_a, g_s, g_v, evalues.data) return evalues def diag_std(int g_a, int g_v, evalues=None): """Solve the standard (non-generalized) eigenvalue problem. The input matrix is neither overwritten nor destroyed. :Parameters: g_a : int the array handle of the matrix to diagonalize g_v : int the array handle to return evecs :returns: all eigenvectors via the g_v global array, and eigenvalues as an ndarray in ascending order This is a collective operation. """ if evalues is None: gtype,dims = inquire(g_a) evalues = np.ndarray((dims[0]), dtype=_to_dtype(gtype)) else: evalues = np.asarray(evalues) GA_Diag_std(g_a, g_v, evalues.data) return evalues cpdef distribution(int g_a, int proc=-1): """Return the distribution given to proc. If proc is not specified, then ga.nodeid() is used. The range is returned as -1 for lo and -2 for hi if no elements are owned by proc. """ cdef int ndim = GA_Ndim(g_a) cdef np.ndarray[np.int64_t, ndim=1] lo = np.zeros((ndim), dtype=np.int64) cdef np.ndarray[np.int64_t, ndim=1] hi = np.zeros((ndim), dtype=np.int64) if proc < 0: proc = GA_Nodeid() NGA_Distribution64(g_a, proc, lo.data, hi.data) # convert hi to python exclusive indexing convetion hi += 1 return lo,hi def dot(int g_a, int g_b, alo=None, ahi=None, blo=None, bhi=None, bint ta=False, bint tb=False): """Computes the element-wise dot product of two arrays. Arrays must be of the same type and same number of elements. Patch operation allows for possibly transposed patches. This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive ta : bool whether the transpose operator should be applied to g_a True=applied tb : bool whether the transpose operator should be applied to g_b True=applied :returns: SUM_ij a(i,j)*b(i,j) """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef char ta_c, tb_c cdef int gtype=inquire_type(g_a) cdef float complex pfcv cdef double complex pdcv cdef SingleComplex gfcv cdef DoubleComplex gdcv if alo is None and ahi is None and blo is None and bhi is None: if gtype == C_INT: return GA_Idot(g_a, g_b) elif gtype == C_LONG: return GA_Ldot(g_a, g_b) elif gtype == C_LONGLONG: return GA_Lldot(g_a, g_b) elif gtype == C_FLOAT: return GA_Fdot(g_a, g_b) elif gtype == C_DBL: return GA_Ddot(g_a, g_b) elif gtype == C_SCPL: gfcv = GA_Cdot(g_a, g_b) pfcv.real = gfcv.real pfcv.imag = gfcv.imag return pfcv elif gtype == C_DCPL: gdcv = GA_Zdot(g_a, g_b) pdcv.real = gdcv.real pdcv.imag = gdcv.imag return pdcv else: raise TypeError else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) if ta: ta_c = "T" else: ta_c = "N" if tb: tb_c = "T" else: tb_c = "N" if gtype == C_INT: return NGA_Idot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) elif gtype == C_LONG: return NGA_Ldot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) elif gtype == C_LONGLONG: return NGA_Lldot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) elif gtype == C_FLOAT: return NGA_Fdot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) elif gtype == C_DBL: return NGA_Ddot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) elif gtype == C_SCPL: gfcv = NGA_Cdot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) pfcv.real = gfcv.real pfcv.imag = gfcv.imag return pfcv elif gtype == C_DCPL: gdcv = NGA_Zdot_patch64( g_a, ta_c, alo_nd.data, ahi_nd.data, g_b, tb_c, blo_nd.data, bhi_nd.data) pdcv.real = gdcv.real pdcv.imag = gdcv.imag return pdcv else: raise TypeError def duplicate(int g_a, char *name=""): """Creates a new array by applying all the properties of another existing array. :Parameters: g_a : int the array handle name : string the new name of the created array :returns: a non-zero array handle means the call was succesful. This is a collective operation. """ return GA_Duplicate(g_a, name) def elem_divide(int g_a, int g_b, int g_c, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None): """Computes the element-wise quotient of the two arrays. Arrays or array patches must be of the same types and same number of elements. For two-dimensional arrays: c(i, j) = a(i,j)/b(i,j) The result (c) may replace one of the input arrays (a/b). If one of the elements of array g_b is zero, the quotient for the element of g_c will be set to GA_NEGATIVE_INFINITY. This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None): GA_Elem_divide(g_a, g_b, g_c) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) GA_Elem_divide_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def elem_maximum(int g_a, int g_b, int g_c, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None): """Computes the element-wise maximum of the two arrays. Arrays or array patches must be of the same types and same number of elements. For two-dimensional arrays:: c(i,j) = max(a(i,j),b(i,j)) If the data type is complex, then:: c(i,j).real = max{ |a(i,j)|, |b(i,j)|} while c(i,j).image = 0 The result (c) may replace one of the input arrays (a/b). This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None): GA_Elem_maximum(g_a, g_b, g_c) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) GA_Elem_maximum_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def elem_minimum(int g_a, int g_b, int g_c, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None): """Computes the element-wise minimum of the two arrays. Arrays or array patches must be of the same types and same number of elements. For two-dimensional arrays:: c(i,j) = min(a(i,j),b(i,j)) If the data type is complex, then:: c(i,j).real = min{ |a(i,j)|, |b(i,j)|} while c(i,j).image = 0 The result (c) may replace one of the input arrays (a/b). This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None): GA_Elem_minimum(g_a, g_b, g_c) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) GA_Elem_minimum_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def elem_multiply(int g_a, int g_b, int g_c, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None): """Computes the element-wise product of the two arrays. Arrays or array patches must be of the same types and same number of elements. For two-dimensional arrays: c(i, j) = a(i,j)*b(i,j) The result (c) may replace one of the input arrays (a/b). This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None): GA_Elem_multiply(g_a, g_b, g_c) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) GA_Elem_multiply_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def error(char *message, int code=1): """Prints message and aborts safely with code.""" GA_Error(message, code) def fence(): """Blocks the calling process until all the data transfers corresponding to GA operations called after ga.init_fence() complete. For example, since ga.put might return before the data reaches the final destination, ga_init_fence and ga_fence allow processes to wait until the data tranfer is fully completed: ga.init_fence() ga.put(g_a, ...) ga.fence() ga.fence() must be called after ga.init_fence(). A barrier, ga.sync(), assures completion of all data transfers and implicitly cancels all outstanding ga.init_fence() calls. ga.init_fence() and ga.fence() must be used in pairs, multiple calls to ga.fence() require the same number of corresponding ga.init_fence() calls. ga.init_fence()/ga_fence() pairs can be nested. ga.fence() works for multiple GA operations. For example: ga.init_fence() ga.put(g_a, ...) ga.scatter(g_a, ...) ga.put(g_b, ...) ga.fence() The calling process will be blocked until data movements initiated by two calls to ga_put and one ga_scatter complete. """ GA_Fence() def fill(int g_a, value, lo=None, hi=None): """Assign a single value to all elements in the array or patch. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef int ivalue cdef long lvalue cdef long long llvalue cdef float fvalue cdef double dvalue cdef long double ldvalue cdef SingleComplex fcvalue cdef DoubleComplex dcvalue cdef void *vvalue cdef int gtype=inquire_type(g_a) vvalue = _convert_multiplier(gtype, value, &ivalue, &lvalue, &llvalue, &fvalue, &dvalue, &ldvalue, &fcvalue, &dcvalue) if lo is None and hi is None: GA_Fill(g_a, vvalue) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) NGA_Fill_patch64( g_a, lo_nd.data, hi_nd.data, vvalue) def gather(int g_a, subsarray, np.ndarray values=None): """Gathers array elements from a global array into a local array. subsarray will be converted to an ndarray if it is not one already. A two-dimensional array is allowed so long as its shape is (n,ndim) where n is the number of elements to gather and ndim is the number of dimensions of the target array. Also, subsarray must be contiguous. For example, if the subsarray were two-dimensional:: for k in range(n): v[k] = g_a[subsarray[k,0],subsarray[k,1],subsarray[k,2]...] For example, if the subsarray were one-dimensional:: for k in range(n): base = n*ndim v[k] = g_a[subsarray[base+0],subsarray[base+1],subsarray[base+2]...] This is a one-sided operation. """ cdef np.ndarray[np.int64_t, ndim=1] subsarray1_nd = None cdef np.ndarray[np.int64_t, ndim=2] subsarray2_nd = None cdef int gtype = inquire_type(g_a) cdef int ndim = GA_Ndim(g_a) cdef int64_t n # prepare subsarray try: subsarray1_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray1_nd) / ndim except ValueError: subsarray1_nd = None try: subsarray2_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray2_nd) # length of first dimension of subsarray2_nd except ValueError: raise ValueError, "subsarray must be either 1- or 2-dimensional" # prepare values array if values is None: values = np.ndarray(n, dtype=_to_dtype[gtype]) else: if values.ndim != 1: raise ValueError, "values must be one-dimensional" if not values.flags['C_CONTIGUOUS']: raise ValueError, "values must be contiguous" if len(values) < n: raise ValueError, "values was not large enough" # call the wrapped function if subsarray1_nd is not None: NGA_Gather_flat64(g_a, values.data, subsarray1_nd.data, n) elif subsarray2_nd is not None: NGA_Gather_flat64(g_a, values.data, subsarray2_nd.data, n) else: raise ValueError, "how did this happen?" return values def gemm(bint ta, bint tb, int64_t m, int64_t n, int64_t k, alpha, int g_a, int g_b, beta, int g_c): """Performs one of the matrix-matrix operations. C := alpha*op( A )*op( B ) + beta*C where op( X ) is one of op(X)=X or op(X) = X', alpha and beta are scalars, and A, B and C are matrices, with op(A) an m by k matrix, op(B) a k by n matrix, and C an m by n matrix. On entry, ta specifies the form of op( A ) to be used in the matrix multiplication as follows:: ta = False, op(A) = A. ta = True, op(A) = A'. This is a collective operation. :Parameters: ta : bool transpose operator tb : bool transpose operator m : int number of rows of op(A) and of matrix C n : int number of columns of op(B) and of matrix C k : int number of columns of op(A) and rows of matrix op(B) alpha : object scale factor g_a : int handle to input array g_b : int handle to input array beta : object scale factor g_c : int handle to output array """ cdef int gtype=inquire_type(g_a) #cdef int ialpha=1, ibeta=1 #cdef long lalpha=1, lbeta=1 #cdef long long llalpha=1, llbeta=1 cdef float falpha=1.0, fbeta=1.0 cdef double dalpha=1.0, dbeta=1.0 #cdef long double ldalpha=1.0, ldbeta=1.0 cdef float complex fcalpha=1.0, fcbeta=1.0 cdef double complex dcalpha=1.0, dcbeta=1.0 #cdef long double complex ldalpha=1.0, ldbeta=1.0 cdef SingleComplex ga_fcalpha, ga_fcbeta cdef DoubleComplex ga_dcalpha, ga_dcbeta cdef char ta_char = 'N' cdef char tb_char = 'N' if ta: ta_char = 'T' if tb: tb_char = 'T' if gtype == C_INT: raise TypeError, "C_INT not supported" elif gtype == C_LONG: raise TypeError, "C_LONG not supported" elif gtype == C_LONGLONG: raise TypeError, "C_LONGLONG not supported" elif gtype == C_FLOAT: falpha = alpha fbeta = beta GA_Sgemm64(ta_char, tb_char, m, n, k, falpha, g_a, g_b, fbeta, g_c) elif gtype == C_DBL: dalpha = alpha dbeta = beta GA_Dgemm64(ta_char, tb_char, m, n, k, dalpha, g_a, g_b, dbeta, g_c) elif gtype == C_LDBL: raise TypeError, "C_LDBL not supported" elif gtype == C_SCPL: fcalpha = alpha fcbeta = beta ga_fcalpha.real = fcalpha.real ga_fcalpha.imag = fcalpha.imag ga_fcbeta.real = fcbeta.real ga_fcbeta.imag = fcbeta.imag GA_Cgemm64(ta_char, tb_char, m, n, k, ga_fcalpha, g_a, g_b, ga_fcbeta, g_c) elif gtype == C_DCPL: dcalpha = alpha dcbeta = beta ga_dcalpha.real = dcalpha.real ga_dcalpha.imag = dcalpha.imag ga_dcbeta.real = dcbeta.real ga_dcbeta.imag = dcbeta.imag GA_Zgemm64(ta_char, tb_char, m, n, k, ga_dcalpha, g_a, g_b, ga_dcbeta, g_c) elif gtype == C_LDCPL: raise TypeError, "C_LDCPL not supported (yet)" else: raise TypeError def get(int g_a, lo=None, hi=None, np.ndarray buffer=None): """Copies data from global array section to the local array buffer. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in the input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive buffer : an ndarray of the appropriate type, large enough to hold lo,hi :returns: The local array buffer. """ return _get_common(g_a, lo, hi, buffer) cdef _get_common(int g_a, lo=None, hi=None, np.ndarray buffer=None, bint nb=False, bint periodic=False, skip=None): """Copies data from global array section to the local array buffer. The local array is assumed to have the same shape as the requested region, or the local array can be 1-dimensional so long as it has the same number of elements as the requested region. Any detected inconsitencies raise a ValueError. This is a one-sided operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive buffer : ndarray should either be 1D and len(buffer)==np.prod(hi-lo), or np.all(buffer.shape == hi-lo) i.e. buffer is 1D and same size as requested region or buffer is the same shape as requested region nb : bool whether this call is non-blocking (see ga.nbget) periodic : bool whether this call is periodic (see ga.periodic_get) skip : 1D array-like of integers strides for each dimension :returns: The local array buffer (and the nonblocking handle if nb=True.) """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd, ld_nd, shape, skip_nd cdef int gtype=inquire_type(g_a) cdef ga_nbhdl_t nbhandle dtype = _to_dtype[gtype] lo_nd,hi_nd = _lohi(g_a,lo,hi) shape = hi_nd-lo_nd+1 if skip is None: skip_nd = None else: skip_nd = _inta64(skip) shape = (hi_nd-lo_nd)/skip_nd+1 if buffer is None: buffer = np.ndarray(shape, dtype=dtype) elif buffer.dtype != dtype: raise ValueError, "buffer is wrong type :: buffer=%s != %s" % ( buffer.dtype, dtype) # Due to GA restrictions, buffer must not have negative strides # and buffer's last stride must be same as itemsize strides = [buffer.strides[i]/buffer.itemsize for i in range(buffer.ndim)] if strides[-1] != 1: raise ValueError, "first dimension of buffer cannot be strided" if np.any(np.asarray(strides) < 0): raise ValueError, "buffer cannot have negative strides" # we allow 1-d "flat" buffers in addition to buffers matching the shape of # requested region if buffer.ndim == 1: if buffer.size != np.prod(shape): raise ValueError, ('buffer size does not match shape :: ' 'buffer.size=%s != np.prod(shape)=%s' % ( buffer.size, np.prod(shape))) ld_nd = shape[1:] else: buffer_shape = [buffer.shape[i] for i in range(buffer.ndim)] if not np.all(buffer_shape == shape): raise ValueError, ('buffer shape does not match request shape :: ' 'buffer_shape=%s != shape=%s' % ( buffer_shape, shape)) ld_nd = np.asarray([strides[i]/strides[i+1] for i in range(buffer.ndim-1)], dtype=np.int64) if nb: NGA_NbGet64(g_a, lo_nd.data, hi_nd.data, buffer.data, ld_nd.data, &nbhandle) return buffer,nbhandle elif periodic: NGA_Periodic_get64(g_a, lo_nd.data, hi_nd.data, buffer.data, ld_nd.data) return buffer elif skip is not None: NGA_Strided_get64(g_a, lo_nd.data, hi_nd.data, skip_nd.data, buffer.data, ld_nd.data) return buffer else: NGA_Get64(g_a, lo_nd.data, hi_nd.data, buffer.data, ld_nd.data) return buffer def get_block_info(int g_a): """Returns information about the block-cyclic distribution. The number of blocks along each of the array axes are returned in the array num_blocks and the dimensions of the individual blocks, specified in the ga.set_block_cyclic or ga.set_block_cyclic_proc_grid subroutines, are returned in block_dims. This is a local function. :Parameters: g_a : int the array handle :returns: The number of blocks along each of the array axes and the dimensions of thet individual blocks, in that order, as ndarrays. """ cdef np.ndarray[np.int32_t, ndim=1] num_blocks, block_dims cdef int ndim = GA_Ndim(g_a) num_blocks = np.zeros(ndim, dtype=np.int32) block_dims = np.zeros(ndim, dtype=np.int32) GA_Get_block_info(g_a, num_blocks.data, block_dims.data) return num_blocks,block_dims def get_diag(int g_a, int g_v): """Inserts the diagonal elements of this matrix g_a into the vector g_v. This is a collective operation. :Parameters: g_a : int the array handle """ GA_Get_diag(g_a, g_v) def get_debug(): """Returns the value of an internal flag in the GA library whose value can be set using the ga.set_debug() subroutine. This is a local operation. """ return GA_Get_debug() def gop(X, char *op): """Global operation. X(1:N) is a vector present on each process. gop 'sums' elements of X accross all nodes using the commutative operator op. The result is broadcast to all nodes. Supported operations include '+', '*', 'max', 'min', 'absmax', 'absmin'. The use of lowerecase for operators is necessary. X must be a contiguous array-like. X is not guaranteed to be modified in-place so use as: >>> value = ga.gop((1,2,3), "+") This operation is provided only for convenience purposes: it is available regardless of the message-passing library that GA is running with. This is a collective operation. """ cdef np.ndarray X_nd = np.asarray(X) cdef int size = 0 if not X_nd.flags['C_CONTIGUOUS']: raise ValueError, "X must be contiguous" try: size = len(X_nd) except TypeError: size = 1 if X_nd.dtype == np.dtype(np.intc): GA_Igop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.long): GA_Lgop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.longlong): GA_Llgop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.single): GA_Fgop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.double): GA_Dgop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.complex64): GA_Cgop(X_nd.data, size, op) elif X_nd.dtype == np.dtype(np.complex128): GA_Zgop(X_nd.data, size, op) else: raise TypeError, "type not supported by ga.gop %s" % X_nd.dtype return X_nd def gop_add(X): return gop(X, "+") def gop_multiply(X): return gop(X, "*") def gop_max(X): return gop(X, "max") def gop_min(X): return gop(X, "min") def gop_absmax(X): return gop(X, "absmax") def gop_absmin(X): return gop(X, "absmin") def has_ghosts(int g_a): """Determines whether any dimension of the given array has ghost cells. This is a collective operation. :Parameters: g_a : int the array handle :returns: True if the global array has some dimensions for which the ghost cell width is greater than zero, it returns False otherwise. """ if GA_Has_ghosts(g_a) == 1: return True return False def init_fence(): """Initializes tracing of completion status of data movement operations. This operation is local. """ GA_Init_fence() def initialize(): """Allocates and initializes internal data structures in Global Arrays. This is a collective operation. """ import atexit global _initialized GA_Initialize() GA_Register_stack_memory(_gapy_malloc, _gapy_free) atexit.register(terminate) _initialized = True def initialize_ltd(size_t limit): """Allocates and initializes internal data structures and sets limit for memory used in global arrays. The limit is per process: it is the amount of memory that the given processor can contribute to collective allocation of global arrays. It does not include temporary storage that GA might be allocating (and releasing) during execution of a particular operation. limit = 0 means "allow unlimited memory usage" in which case this operation is equivalent to GA_initialize. This is a collective operation. """ global _initialized GA_Initialize_ltd(limit) _initialized = True def initialized(): """Returns whether ga has been initialized.""" return _initialized cpdef inquire(int g_a): cdef int gtype cdef int ndim = GA_Ndim(g_a) cdef np.ndarray[np.int64_t, ndim=1] dims=np.zeros((ndim), dtype=np.int64) NGA_Inquire64(g_a, >ype, &ndim, dims.data) return gtype,dims cpdef np.ndarray[np.int64_t, ndim=1] inquire_dims(int g_a): cdef int gtype cdef np.ndarray[np.int64_t, ndim=1] dims gtype,dims = inquire(g_a) return dims def inquire_memory(): """Returns amount of memory (in bytes) used in the allocated global arrays on the calling processor. This operation is local. """ return GA_Inquire_memory() def inquire_name(int g_a): """Returns the name of an array represented by the handle g_a. This operation is local. :Parameters: g_a : int the array handle """ return GA_Inquire_name(g_a) cpdef int inquire_type(int g_a): cdef int gtype cdef np.ndarray[np.int64_t, ndim=1] dims gtype,dims = inquire(g_a) return gtype def is_mirrored(int g_a): """Checks whether the array is mirrored. This is a local operation. :returns: True if it is a mirrored array, else returns False. """ if GA_Is_mirrored(g_a) == 1: return True return False def llt_solve(int g_a, int g_b): """Solves a system of linear equations A * X = B using the Cholesky factorization of an NxN double precision symmetric positive definite matrix A (epresented by handle g_a). On successful exit B will contain the solution X. This is a collective operation. :Parameters: g_a : int the coefficient matrix g_b : int the rhs/solution matrix :returns: 0 if successful; >0 if the leading minor of this order is not positive definite and the factorization could not be completed """ return GA_Llt_solve(g_a, g_b) def locate(int g_a, subscript): """Return the GA compute process id that 'owns' the data. If any element of subscript[] is out of bounds "-1" is returned. This operation is local. :Parameters: g_a : int the array handle subscript : 1D array-like of integers len(subscript) should be ndim """ cdef np.ndarray[np.int64_t, ndim=1] subscript_nd subscript_nd = _inta64(subscript) return NGA_Locate64(g_a, subscript_nd.data) def locate_nnodes(int g_a, lo, hi): """Return the number of process which own the specified patch. This operation is local. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd,hi_nd cdef int result lo_nd,hi_nd = _lohi(g_a,lo,hi) return NGA_Locate_nnodes64(g_a, lo_nd.data, hi_nd.data) def locate_region(int g_a, lo, hi): """Return the list of the GA processes id that 'own' the data. Parts of the specified patch might be actually 'owned' by several processes. If lo/hi are out of bounds "0" is returned, otherwise return value is equal to the number of processes that hold the data . map[i][0] - lo[ndim] map[i][1] - hi[ndim] procs[i] - processor id that owns data in patch lo[i]:hi[i] This operation is local. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd cdef np.ndarray[np.int64_t, ndim=1] hi_nd cdef np.ndarray[np.int64_t, ndim=1] map cdef np.ndarray[np.int64_t, ndim=3] map_reshape cdef np.ndarray[np.int32_t, ndim=1] procs cdef int np_result cdef int np_guess cdef int ndim = GA_Ndim(g_a) lo_nd,hi_nd = _lohi(g_a,lo,hi) np_guess = NGA_Locate_nnodes64( g_a, lo_nd.data, hi_nd.data) map = np.ndarray(np_guess*ndim*2, dtype=np.int64) procs = np.ndarray(np_guess, dtype=np.int32) np_result = NGA_Locate_region64(g_a, lo_nd.data, hi_nd.data, map.data, procs.data) assert(np_guess == np_result) # TODO then slice it and reshape to something useful? map_reshape = map.reshape(np_result,2,ndim) # need to add 1 to every 'hi' value map_reshape[:,1,:] += 1 return map_reshape,procs def lock(int mutex): """Locks a mutex object identified by the mutex number. It is a fatal error for a process to attempt to lock a mutex which was already locked by this process. """ GA_Lock(mutex) def lu_solve(int g_a, int g_b, bint trans=False): """Solve the system of linear equations op(A)X = B based on the LU factorization. op(A) = A or A' depending on the parameter trans trans = False means that the transpose operator should not be applied. trans = True means that the transpose operator should be applied. Matrix A is a general real matrix. Matrix B contains possibly multiple rhs vectors. The array associated with the handle g_b is overwritten by the solution matrix X. This is a collective operation. :Parameters: g_a : int the array handle for the coefficient matrix g_b : int the array handle for the solution matrix trans : bool transpose (True) or not transpose (False) """ cdef char ctrans = 'N' if trans: ctrans = 'T' GA_Lu_solve(ctrans, g_a, g_b) def mask_sync(bint first, bint last): """This subroutine can be used to remove synchronization calls from around collective operations. Setting the parameter first=False removes the synchronization prior to the collective operation, setting last=False removes the synchronization call after the collective operation. This call is applicable to all collective operations. It most be invoked before each collective operation. This is a collective operation. :Parameters: first : bool mask for prior internal synchronization last : bool mask for post internal synchronization """ GA_Mask_sync(first,last) def matmul_patch(bint transa, bint transb, alpha, beta, int g_a, alo, ahi, int g_b, blo, bhi, int g_c, clo, chi): """An n-dimensional patch version of ga_dgemm. C[clo[]:chi[]] := alpha * AA[alo[]:ahi[]] * BB[blo[]:bhi[]] ) + beta*C[clo[]:chi[]], where AA = op(A), BB = op(B), and op( X ) is one of op( X ) = X or op( X ) = X', It works for both double and DoubleComplex data tape. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd cdef int gtype=inquire_type(g_a) cdef int ialpha, ibeta cdef long lalpha, lbeta cdef long long llalpha, llbeta cdef float falpha, fbeta cdef double dalpha, dbeta cdef long double ldalpha, ldbeta cdef SingleComplex fcalpha, fcbeta cdef DoubleComplex dcalpha, dcbeta cdef void *valpha cdef void *vbeta cdef char char_transa = 'N' cdef char char_transb = 'N' if alpha is None: alpha = 1 valpha = _convert_multiplier(gtype, alpha, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) if beta is None: beta = 1 vbeta = _convert_multiplier(gtype, beta, &ibeta, &lbeta, &llbeta, &fbeta, &dbeta, &ldbeta, &fcbeta, &dcbeta) alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) if transa: char_transa = 'T' if transb: char_transb = 'T' NGA_Matmul_patch64(char_transa, char_transb, valpha, vbeta, g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data) def median(int g_a, int g_b, int g_c, int g_m, alo=None, ahi=None, blo=None, bhi=None, clo=None, chi=None, mlo=None, mhi=None): """Computes the componentwise Median of three arrays or patches g_a, g_b, and g_c, and stores the result in this array or patch g_m. The result (m) may replace one of the input arrays (a/b/c). This is a collective operation. :Parameters: g_a : int the array handle g_b : int the array handle g_c : int the array handle g_m : int the array handle for the result alo : 1D array-like of integers lower bound patch coordinates of g_a, inclusive ahi : 1D array-like of integers higher bound patch coordinates of g_a, exclusive blo : 1D array-like of integers lower bound patch coordinates of g_b, inclusive bhi : 1D array-like of integers higher bound patch coordinates of g_b, exclusive clo : 1D array-like of integers lower bound patch coordinates of g_c, inclusive chi : 1D array-like of integers higher bound patch coordinates of g_c, exclusive mlo : 1D array-like of integers lower bound patch coordinates of g_m, inclusive mhi : 1D array-like of integers higher bound patch coordinates of g_m, exclusive """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef np.ndarray[np.int64_t, ndim=1] clo_nd, chi_nd cdef np.ndarray[np.int64_t, ndim=1] mlo_nd, mhi_nd if (alo is None and ahi is None and blo is None and bhi is None and clo is None and chi is None and mlo is None and mhi is None): GA_Median(g_a, g_b, g_c, g_m) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) clo_nd,chi_nd = _lohi(g_c,clo,chi) mlo_nd,mhi_nd = _lohi(g_m,mlo,mhi) GA_Median_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, g_c, clo_nd.data, chi_nd.data, g_m, mlo_nd.data, mhi_nd.data) def memory_avail(): """Returns amount of memory (in bytes) left for allocation of new global arrays on the calling processor. Note: If ga.uses_ma() returns True, then ga.memory_avail() returns the lesser of the amount available under the GA limit and the amount available from MA (according to ma.inquire_avail() operation). If no GA limit has been set, it returns what MA says is available. If ( ! ga.uses_ma() && ! ga.memory_limited() ) returns < 0, indicating that the bound on currently available memory cannot be determined. This operation is local. """ return GA_Memory_avail() def memory_limited(): """Indicates if limit is set on memory usage in Global Arrays on the calling processor. This operation is local. :returns: True for "yes", False for "no" """ if 1 == GA_Memory_limited(): return True return False def merge_distr_patch(int g_a, alo, ahi, int g_b, blo, bhi): """This function merges all copies of a patch of a mirrored array (g_a) into a patch in a distributed array (g_b). This is a collective operation. :Parameters: g_a : int array handle alo : 1D array-like of integers g_a patch coordinate ahi : 1D array-like of integers g_a patch coordinate g_b : int array handle blo : 1D array-like of integers g_b patch coordinate bhi : 1D array-like of integers g_b patch coordinate """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) NGA_Merge_distr_patch64( g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data) def merge_mirrored(int g_a): """This subroutine merges mirrored arrays by adding the contents of each array across nodes. The result is that the each mirrored copy of the array represented by g_a is the sum of the individual arrays before the merge operation. After the merge, all mirrored arrays are equal. This is a collective operation. :Parameters: g_a : int array handle """ GA_Merge_mirrored(g_a) def nbacc(int g_a, buffer, lo=None, hi=None, alpha=None): """Non-blocking version of ga.acc. The accumulate operation can be completed locally by making a call to the ga.nbwait() routine. Combines data from buffer with data in the global array patch. The buffer array is assumed to be have the same number of dimensions as the global array. If the buffer is not contiguous, a contiguous copy will be made. global array section (lo[],hi[]) += alpha * buffer This is a non-blocking and one-sided and atomic operation. :Parameters: g_a : int the array handle buffer : array-like must be contiguous and have same number of elements as patch lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive alpha : object multiplier (converted to the appropriate type) :returns: The non-blocking request handle. """ return _acc_common(g_a, buffer, lo, hi, alpha, True) def nbget(int g_a, lo=None, hi=None, np.ndarray buffer=None): """Non-blocking version of the blocking ga.get operation. The get operation can be completed locally by making a call to the ga.nbwait() routine. Copies data from global array section to the local array buffer. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in the input arguments are fatal. This is a non-blocking and one-sided operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive buffer : ndarray Fill this buffer instead of allocating a new one internally. Must be contiguous and have same number of elements as patch. :returns: The local array buffer. """ return _get_common(g_a, lo, hi, buffer, True) def nblock(int g_a): """Returns the number of partitions of each array dimension for g_a. This operation is local. :Parameters: g_a : int array handle """ cdef np.ndarray[np.int32_t, ndim=1] nblock_nd cdef int ndim = GA_Ndim(g_a) nblock_nd = np.zeros(ndim, dtype=np.intc) GA_Nblock(g_a, nblock_nd.data) return nblock_nd def nbput(int g_a, buffer, lo=None, hi=None): """Non-blocking version of the blocking put operation. The put operation can be completed locally by making a call to the ga.nbwait() routine. Copies data from local array buffer to the global array section. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle buffer : array-like the data to put lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive """ return _put_common(g_a, buffer, lo, hi, True, False) def nbwait(ga_nbhdl_t nbhandle): """This function completes a non-blocking one-sided operation locally. Waiting on a nonblocking put or an accumulate operation assures that data was injected into the network and the user buffer can be now be reused. Completing a get operation assures data has arrived into the user memory and is ready for use. Wait operation ensures only local completion. Unlike their blocking counterparts, the nonblocking operations are not ordered with respect to the destination. Performance being one reason, the other reason is that by ensuring ordering we incur additional and possibly unnecessary overhead on applications that do not require their operations to be ordered. For cases where ordering is necessary, it can be done by calling a fence operation. The fence operation is provided to the user to confirm remote completion if needed. """ NGA_NbWait(&nbhandle) def ndim(int g_a): """Returns the number of dimensions in array represented by the handle g_a. This operation is local. :Parameters: g_a : int the array handle :returns: the number of dimensions in the array g_a """ return GA_Ndim(g_a) def nnodes(): """Returns the number of the GA compute (user) processes. This operation is local. :returns: the number of GA compute (user) processes """ return GA_Nnodes() def nodeid(): """Returns the GA process id (0, ..., ga.nnodes()-1) of the requesting compute process. This operation is local. :returns: the GA process id """ return GA_Nodeid() def norm1(int g_a): """Computes the 1-norm of the matrix or vector g_a. This is a collective operation. :Parameters: g_a : int the array handle :returns: the 1-norm of the matrix or vector g_a (as a float) """ cdef double nm GA_Norm1(g_a, &nm) return nm def norm_infinity(int g_a): """Computes the 1-norm of the matrix or vector g_a. This is a collective operation. :Parameters: g_a : int the array handle :returns: the 1-norm of the matrix or vector g_a """ cdef double nm GA_Norm_infinity(g_a, &nm) return nm def enum(int g_a, lo=None, hi=None, start=None, inc=None): """This subroutine enumerates the values of an array between elements lo and hi starting with the value istart and incrementing each subsequent value by inc. This operation is only applicable to 1-dimensional arrays. An example of its use is shown below: ga.enum(g_a, 1, n, 7, 2) # g_a: 7 9 11 13 15 17 19 21 23 ... This is a collective operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers patch coordinate hi : 1D array-like of integers patch coordinate start : object starting value of enumeration (converted to appropriate type) inc : object increment value (converted to appropriate type) """ cdef np.ndarray[np.int64_t, ndim=1] hi_nd = inquire_dims(g_a)-1 cdef int64_t c_lo=0, c_hi=hi_nd[0] cdef int gtype=inquire_type(g_a) cdef int istart, iinc cdef long lstart, linc cdef long long llstart, llinc cdef float fstart, finc cdef double dstart, dinc cdef long double ldstart, ldinc cdef SingleComplex fcstart, fcinc cdef DoubleComplex dcstart, dcinc cdef void *vstart=NULL cdef void *vinc=NULL if lo is not None: c_lo = lo if hi is not None: c_hi = hi if start is None: start = 1 if inc is None: inc = 1 vstart = _convert_multiplier(gtype, start, &istart, &lstart, &llstart, &fstart, &dstart, &ldstart, &fcstart, &dcstart) vinc = _convert_multiplier(gtype, inc, &iinc, &linc, &llinc, &finc, &dinc, &ldinc, &fcinc, &dcinc) GA_Patch_enum64(g_a, c_lo, c_hi, vstart, vinc) def pack(int g_src, int g_dst, int g_msk, lo=None, hi=None): """The pack subroutine is designed to compress the values in the source vector g_src into a smaller destination array g_dst based on the values in an integer mask array g_msk. The values lo and hi denote the range of elements that should be compressed and the number of values placed in the compressed array is returned. This operation is the complement of the ga.unpack operation. An example is shown below:: icount = ga.pack(g_src, g_dst, g_msk, 1, n); # g_msk: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 # g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # g_dst: 1 7 9 12 15 16 # icount: 6 This is a collective operation. :Parameters: g_src : int handle for source arrray g_dst : int handle for destination array g_msk : int handle for integer array representing mask lo : 1D array-like of integers low value of range on which operation is performed hi : 1D array-like of integers hi value of range on which operation is performed """ cdef np.ndarray[np.int64_t, ndim=1] hi_nd = inquire_dims(g_src)-1 cdef int64_t c_lo=0, c_hi=hi_nd[0], icount if lo is not None: c_lo = lo if hi is not None: c_hi = hi GA_Pack64(g_src, g_dst, g_msk, lo, hi, &icount) return icount def periodic_acc(int g_a, buffer, lo=None, hi=None, alpha=None): """Periodic version of ga.acc. The indices can extend beyond the array boundary/dimensions in which case the libray wraps them around. Combines data from buffer with data in the global array patch. The buffer array is assumed to be have the same number of dimensions as the global array. If the buffer is not contiguous, a contiguous copy will be made. global array section (lo[],hi[]) += alpha * buffer This is a one-sided and atomic operation. :Parameters: g_a : int the array handle buffer : array-like must be contiguous and have same number of elements as patch lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive alpha : object multiplier (converted to the appropriate type) """ _acc_common(g_a, buffer, lo, hi, alpha, False, True) def periodic_get(int g_a, lo=None, hi=None, np.ndarray buffer=None): """Periodic version of ga.get. The indices can extend beyond the array boundary/dimensions in which case the libray wraps them around. Copies data from global array section to the local array buffer. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in the input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive buffer : array-like must be contiguous and have same number of elements as patch :returns: The local array buffer. """ return _get_common(g_a, lo, hi, buffer, False, True) def periodic_put(int g_a, buffer, lo=None, hi=None): """Periodic version of ga.put. The indices can extend beyond the array boundary/dimensions in which case the libray wraps them around. Copies data from local array buffer to the global array section. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle buffer : array-like the data to put lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive """ _put_common(g_a, buffer, lo, hi, False, True) def pgroup_absolute_id(int pgroup, int pid): """TODO""" return GA_Pgroup_absolute_id(pgroup, pid) def pgroup_brdcst(int pgroup, buffer, int root=0): """Broadcast from process root to all other processes in the same group. If the buffer is not contiguous, an error is raised. This operation is provided only for convenience purposes: it is available regardless of the message-passing library that GA is running with. This is a collective operation. :Parameters: pgroup : int processor group handle buffer : array-like the message root : int the process which is sending :returns: The buffer in case a temporary was passed in. """ cdef np.ndarray buffer_nd buffer_nd = np.asarray(buffer) if not buffer_nd.flags['C_CONTIGUOUS']: raise ValueError, "the buffer must be contiguous" #if buffer_nd.ndim != 1: # raise ValueError, "the buffer must be one-dimensional" GA_Pgroup_brdcst(pgroup, buffer_nd.data, buffer_nd.size*buffer_nd.itemsize, root) return buffer_nd def pgroup_create(list): """Creates a processor group. At present, it must be invoked by all processors in the current default processor group. The list of processors use the indexing scheme of the default processor group. If the default processor group is the world group, then these indices are the usual processor indices. This function returns a process group handle that can be used to reference this group by other functions. This is a collective operation on the default processor group. """ cdef np.ndarray[np.int32_t, ndim=1] list_nd list_nd = _inta32(list) return GA_Pgroup_create(list_nd.data, len(list_nd)) def pgroup_destroy(int pgroup): """Frees up a processor group handle. This is a collective operation on the default processor group. :returns: True if the handle was previously active. False if the handle was not previously active. """ if 0 == GA_Pgroup_destroy(pgroup): return False return True def pgroup_get_default(): """Returns a handle to the default processor group. The return value can then be used to create a global array using one of the ga.create or ga.set_pgroup calls. This is a local operation. """ return GA_Pgroup_get_default() def pgroup_get_mirror(): """Returns a handle to the mirrored processor group. The return value can then be used to create a global array using one of the ga.create or ga.set_pgroup calls. This is a local operation. """ return GA_Pgroup_get_mirror() def pgroup_get_world(): """Returns a handle to the world processor group. The return value can then be used to create a global array using one of the ga.create or ga.set_pgroup calls. This is a local operation. """ return GA_Pgroup_get_world() def pgroup_gop(int pgroup, X, char *op): """Global operation. X(1:N) is a vector present on each process in the group. gop 'sums' elements of X accross all nodes using the commutative operator op. The result is broadcast to all nodes. Supported operations include '+', '*', 'max', 'min', 'absmax', 'absmin'. The use of lowerecase for operators is necessary. X must be a contiguous array-like. X is not guaranteed to be modified in-place so use as: >>> value = ga.gop((1,2,3), "+") This operation is provided only for convenience purposes: it is available regardless of the message-passing library that GA is running with. This is a collective operation. """ cdef np.ndarray X_nd = np.asarray(X) if not X_nd.flags['C_CONTIGUOUS']: raise ValueError, "X must be contiguous" if X_nd.dtype == np.intc: GA_Pgroup_igop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.long: GA_Pgroup_lgop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.longlong: GA_Pgroup_llgop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.single: GA_Pgroup_fgop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.double: GA_Pgroup_dgop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.complex64: GA_Pgroup_cgop(pgroup, X_nd.data, len(X_nd), op) elif X_nd.dtype == np.complex128: GA_Pgroup_zgop(pgroup, X_nd.data, len(X_nd), op) else: raise TypeError, "type not supported by ga.pgroup_gop %s" % X_nd.dtype return X_nd def pgroup_gop_add(int pgroup, X): return pgroup_gop(pgroup, X, "+") def pgroup_gop_multiply(int pgroup, X): return pgroup_gop(pgroup, X, "*") def pgroup_gop_max(int pgroup, X): return pgroup_gop(pgroup, X, "max") def pgroup_gop_min(int pgroup, X): return pgroup_gop(pgroup, X, "min") def pgroup_gop_absmax(int pgroup, X): return pgroup_gop(pgroup, X, "absmax") def pgroup_gop_absmin(int pgroup, X): return pgroup_gop(pgroup, X, "absmin") def pgroup_nnodes(int pgroup=-1): """Returns the number of processors contained in the group specified by pgroup. This is a local local operation. :Parameters: pgroup : int the group handle """ if pgroup < 0: pgroup = pgroup_get_default() return GA_Pgroup_nnodes(pgroup) def pgroup_nodeid(int pgroup=-1): """Returns the relative index of the processor in the processor group specified by pgroup. This index will generally differ from the absolute processor index returned by ga.nodeid if the processor group is not the world group. This is a local operation. :Parameters: pgroup : int the group handle """ if pgroup < 0: pgroup = pgroup_get_default() return GA_Pgroup_nodeid(pgroup) def pgroup_set_default(int pgroup=-1): """Resets the default processor group on a collection of processors. All processors in the group referenced by p_handle must make a call to this function. Any standard global array call that is made after resetting the default processor group will be restricted to processors in that group. Global arrays that are created after resetting the default processor group will only be defined on that group and global operations such as ga.sync or ga.gop will be restricted to processors in that group. The ga.pgroup_set_default call can be used to rapidly convert large applications, written with GA, into routines that run on processor groups. The default processor group can be overridden by using GA calls that require an explicit group handle as one of the arguments. This is a collective operation on the group represented by the handle pgroup. """ if pgroup < 0: pgroup = pgroup_get_world() GA_Pgroup_set_default(pgroup) def pgroup_split(int pgroup, int num_group): """TODO""" return GA_Pgroup_split(pgroup, num_group) def pgroup_split_irreg(int pgroup, int color): """TODO""" return GA_Pgroup_split_irreg(pgroup, color) def pgroup_sync(int pgroup=-1): """Executes a synchronization group across the processors in the processor group specified by pgroup. Nodes outside this group are unaffected. This is a collective operation on the processor group specified by pgroup. """ if pgroup < 0: pgroup = pgroup_get_default() GA_Pgroup_sync(pgroup) def print_distribution(int g_a): """Prints the array distribution. This is a collective operation. """ GA_Print_distribution(g_a) def print_file(int g_a, file): """Prints an entire array to a file. This is a collective operation. :Parameters: file : file-like file-like object which must implement fileno(), or a string g_a : int the array handle """ #GA_Print_file(file.fileno(), g_a) raise NotImplementedError def print_patch(int g_a, lo=None, hi=None, bint pretty=True): """Prints a patch of g_a array to the standard output. If pretty is False then output is printed in a dense fashion. If pretty is True then output is formatted and rows/columns labeled. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef int apretty=0 lo_nd,hi_nd = _lohi(g_a,lo,hi) if pretty: apretty = 1 NGA_Print_patch64(g_a, lo_nd.data, hi_nd.data, apretty) def print_stats(): """This non-collective (MIMD) operation prints information about: * number of calls to the GA create/duplicate, destroy, get, put, * scatter, gather, and read_and_inc operations * total amount of data moved in the GA primitive operations * amount of data moved in GA primitive operations to logicaly * remote locations * maximum memory consumption in global arrays, and * number of requests serviced in the interrupt-driven * implementations by the calling process. This operation is local. """ GA_Print_stats() def print_stdout(int g_a): """Prints an entire array to the standard output.""" GA_Print(g_a) def proc_topology(int g_a, int proc): """Based on the distribution of an array associated with handle g_a, determines coordinates of the specified processor in the virtual processor grid corresponding to the distribution of array g_a. The numbering starts from 0. The values of -1 means that the processor doesn't 'own' any section of array represented by g_a. This operation is local. """ cdef int ndim = GA_Ndim(g_a) cdef np.ndarray[np.int32_t, ndim=1] coord coord = np.zeros(ndim, dtype=np.intc) NGA_Proc_topology(g_a, proc, coord.data) return coord def put(int g_a, buffer, lo=None, hi=None): """Copies data from local array buffer to the global array section. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle buffer : array-like the data to put lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive """ _put_common(g_a, buffer, lo, hi) cdef _put_common(int g_a, buffer, lo=None, hi=None, bint nb=False, bint periodic=False, skip=None): """Copies data from local array buffer to the global array section. The local array is assumed to have the same shape as the requested region, or the local array can be 1-dimensional so long as it has the same number of elements as the requested region. Any detected inconsitencies raise a ValueError. This is a one-sided operation. :Parameters: g_a : int the array handle buffer : array-like the data to put; should either be 1D and len(buffer)==np.prod(hi-lo), or np.all(buffer.shape == hi-lo) i.e. buffer is 1D and same size as requested region or buffer is the same shape as requested region lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive nb : bool whether this call is non-blocking (see ga.nbget) periodic : bool whether this call is periodic (see ga.periodic_get) skip : 1D array-like of integers strides for each dimension :returns: None, usually. However if nb=True, the nonblocking handle is returned. """ cdef np.ndarray buffer_nd cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd, ld_nd, shape, skip_nd cdef int gtype=inquire_type(g_a) cdef ga_nbhdl_t nbhandle dtype = _to_dtype[gtype] lo_nd,hi_nd = _lohi(g_a,lo,hi) shape = hi_nd-lo_nd+1 if skip is None: skip_nd = None else: skip_nd = _inta64(skip) shape = (hi_nd-lo_nd)/skip_nd+1 buffer_nd = np.asarray(buffer, dtype=dtype) if buffer_nd.dtype != dtype: raise ValueError, "buffer is wrong type :: buffer=%s != %s" % ( buffer.dtype, dtype) # Due to GA restrictions, buffer must not have negative strides # and buffer's last stride must be same as itemsize strides = [buffer_nd.strides[i]/buffer_nd.itemsize for i in range(buffer_nd.ndim)] if (strides and (strides[-1] != 1 or np.any(np.asarray(strides) < 0))): buffer_nd = np.ascontiguousarray(buffer_nd) # we allow 1-d "flat" buffers in addition to buffers matching the shape of # the requested region if buffer_nd.ndim == 1: if buffer_nd.size != np.prod(shape): raise ValueError, ('buffer size does not match shape :: ' 'buffer.size=%s != np.prod(shape)=%s' % ( buffer_nd.size, np.prod(shape))) ld_nd = shape[1:] else: buffer_shape = [buffer_nd.shape[i] for i in range(buffer_nd.ndim)] if not np.all(buffer_shape == shape): raise ValueError, ('buffer shape does not match request shape :: ' 'buffer_shape=%s != shape=%s' % ( buffer_shape, shape)) ld_nd = np.asarray([strides[i]/strides[i+1] for i in range(buffer_nd.ndim-1)], dtype=np.int64) if nb: NGA_NbPut64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data, &nbhandle) return nbhandle elif periodic: NGA_Periodic_put64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data) elif skip is not None: NGA_Strided_put64(g_a, lo_nd.data, hi_nd.data, skip_nd.data, buffer_nd.data, ld_nd.data) else: NGA_Put64(g_a, lo_nd.data, hi_nd.data, buffer_nd.data, ld_nd.data) def randomize(int g_a, val=None): """Fill array with random values in [0,val).""" cdef int gtype=inquire_type(g_a) cdef int ival cdef long lval cdef long long llval cdef float fval cdef double dval cdef long double ldval cdef SingleComplex fcval cdef DoubleComplex dcval cdef void *vval=NULL if val is None: val = 1 vval = _convert_multiplier(gtype, val, &ival, &lval, &llval, &fval, &dval, &ldval, &fcval, &dcval) GA_Randomize(g_a, vval) def read_inc(int g_a, subscript, long inc=1): """Atomically read and increment an element in an integer array. This is a one-sided and atomic operation. :Parameters: g_a : int the array handle subscript : 1D array-like of integers index for the referenced element inc : long the increment """ cdef np.ndarray[np.int64_t, ndim=1] subscript_nd subscript_nd = _inta64(subscript) return NGA_Read_inc64(g_a, subscript_nd.data, inc) def register_dtype(dtype): """Creates a new data type based on the given dtype. :Parameters: dtype : dtype the numpy dtype to register """ cdef int gatype dtype = np.dtype(dtype) # just in case it's not really a dtype instance gatype = NGA_Register_type(dtype.itemsize) _to_dtype[gatype] = dtype return gatype def register_type(size_t bytes): """Creates a new data type of size bytes. :Parameters: bytes : size_t the size of the new data type """ return NGA_Register_type(bytes) def recip(int g_a, lo=None, hi=None): """Take element-wise reciprocal of the array or patch. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd if lo is None and hi is None: GA_Recip(g_a) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) GA_Recip_patch64(g_a, lo_nd.data, hi_nd.data) def release(int g_a, lo=None, hi=None): """Releases access to a global array when the data was read only. Your code should look like: array = ga.access(g_a) # ga.release(g_a) NOTE: see restrictions specified for ga.access This operation is local. """ _release_common(g_a, lo, hi, False) def release_block(int g_a, int index): """Releases access to the block of data specified by the integer index when data was accessed as read only. This is only applicable to block-cyclic data distributions created using the simple block-cyclic distribution. This is a local operation. """ NGA_Release_block(g_a, index) def release_block_grid(int g_a, subscript): """Releases access to the block of data specified by the subscript array when data was accessed as read only. This is only applicable to block-cyclic data distributions created using the SCALAPACK data distribution. This is a local operation. """ cdef np.ndarray[np.int32_t, ndim=1] subscript_nd subscript_nd = _inta32(subscript) NGA_Release_block_grid(g_a, subscript_nd.data) def release_block_segment(int g_a, int proc): """Releases access to the block of locally held data for a block-cyclic array, when data was accessed as read-only. This is a local operation. """ NGA_Release_block_segment(g_a, proc) cdef _release_common(int g_a, lo, hi, bint update): """TODO""" cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd, lo_dst, hi_dst # first things first, if no data is owned, return silently lo_dst,hi_dst = distribution(g_a) # convet hi_dst back to GA inclusive indexing convention hi_dst -= 1 if lo_dst[0] < 0 or hi_dst[0] < 0: return if lo is not None: lo_nd = _inta64(lo) else: lo_nd = lo_dst if hi is not None: hi_nd = _inta64(hi) else: hi_nd = hi_dst # sanity checks if np.sometrue(lo_nd>hi_nd): raise ValueError,"lo>hi lo=%s hi=%s"%(lo_nd,hi_nd) if np.sometrue(lo_ndhi_dst): raise ValueError,"hi out of bounds hi_dst=%s hi=%s"%(hi_dst,hi_nd) if update: NGA_Release_update64(g_a, lo_nd.data, hi_nd.data) else: NGA_Release64(g_a, lo_nd.data, hi_nd.data) def release_ghost_element(int g_a, subscript): """Releases access to the locally held data for an array with ghost elements, when data was accessed as read-only. This is a local operation. """ cdef np.ndarray[np.int64_t, ndim=1] subscript_nd subscript_nd = _inta64(subscript) NGA_Release_ghost_element64(g_a, subscript_nd.data) def release_ghosts(int g_a): """Releases access to the locally held block of data containing ghost elements, when data was accessed as read-only. This is a local operation. """ NGA_Release_ghosts(g_a) def release_update(int g_a, lo=None, hi=None): """Releases access to the data. It must be used if the data was accessed for writing. NOTE: see restrictions specified for ga.access. This operation is local. """ _release_common(g_a, lo, hi, True) def release_update_block(int g_a, int index): """Releases access to the block of data specified by the integer index when data was accessed in read-write mode. This is only applicable to block-cyclic data distributions created using the simple block-cyclic distribution. This is a local operation. """ NGA_Release_update_block(g_a, index) def release_update_block_grid(int g_a, subscript): """Releases access to the block of data specified by the subscript array when data was accessed in read-write mode. This is only applicable to block-cyclic data distributions created using the SCALAPACK data distribution. This is a local operation. """ cdef np.ndarray[np.int32_t, ndim=1] subscript_nd subscript_nd = _inta32(subscript) NGA_Release_update_block_grid(g_a, subscript_nd.data) def release_update_block_segment(int g_a, int proc): """Releases access to the block of locally held data for a block-cyclic array, when data was accessed as read-only. This is a local operation. """ NGA_Release_update_block_segment(g_a, proc) def release_update_ghost_element(int g_a, subscript): """Releases access to the locally held data for an array with ghost elements, when data was accessed in read-write mode. This is a local operation. """ cdef np.ndarray[np.int64_t, ndim=1] subscript_nd subscript_nd = _inta64(subscript) NGA_Release_update_ghost_element64(g_a, subscript_nd.data) pass def release_update_ghosts(int g_a): """Releases access to the locally held block of data containing ghost elements, when data was accessed in read-write mode. This is a local operation. """ NGA_Release_update_ghosts(g_a) def scale(int g_a, value, lo=None, hi=None): """Scales an array by the constant s. Note that the library is unable to detect errors when the pointed value is of different type than the array. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd cdef int gtype=inquire_type(g_a) cdef int ivalue cdef long lvalue cdef long long llvalue cdef float fvalue cdef double dvalue cdef long double ldvalue cdef SingleComplex fcvalue cdef DoubleComplex dcvalue cdef void *vvalue vvalue = _convert_multiplier(gtype, value, &ivalue, &lvalue, &llvalue, &fvalue, &dvalue, &ldvalue, &fcvalue, &dcvalue) if lo is None and hi is None: GA_Scale(g_a, vvalue) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) NGA_Scale_patch64( g_a, lo_nd.data, hi_nd.data, vvalue) def scale_rows(int g_a, int g_v): """Scales the rows of this matrix g_a using the vector g_v. This is a collective operation. """ GA_Scale_rows(g_a, g_v) def scale_cols(int g_a, int g_v): """Scales the columns of this matrix g_a using the vector g_v. This is a collective operation. """ GA_Scale_cols(g_a, g_v) def scan_add(int g_src, int g_dst, int g_msk, lo=None, hi=None, bint excl=False): """Adds successive elements in a source vector g_src and put the results in a destination vector g_dst. The addition will restart based on the values of the integer mask vector g_msk. The scan is performed within the range specified by the integer values lo and hi. Note that this operation can only be applied to 1-dimensional arrays. The excl flag determines whether the sum starts with the value in the source vector corresponding to the location of a 1 in the mask vector (excl=False) or whether the first value is set equal to 0 (excl=True). Some examples of this operation are given below. ga.scan_add(g_src, g_dst, g_msk, 0, n, False); g_msk: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 g_dst: 1 3 6 10 16 21 7 15 9 19 30 12 25 39 15 16 33 ga.scan_add(g_src, g_dst, g_msk, 0, n, True); g_msk: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 g_dst: 0 1 3 6 10 15 0 7 0 9 19 0 12 25 0 0 16 This is a collective operation. :Parameters: g_src : int handle for source arrray g_dst : int handle for destination array g_msk : int handle for integer array representing mask lo : 1D array-like of integers low value of range on which operation is performed hi : 1D array-like of integers hi value of range on which operation is performed excl : bool whether the first value is set to 0 (see above) """ cdef np.ndarray[np.int64_t, ndim=1] hi_nd = inquire_dims(g_src)-1 cdef int64_t c_lo=0, c_hi=hi_nd[0] cdef int c_excl=0 if lo is not None: c_lo = lo if hi is not None: c_hi = hi if excl: c_excl = 1 GA_Scan_add64(g_src, g_dst, g_msk, c_lo, c_hi, c_excl) def scan_copy(int g_src, int g_dst, int g_msk, lo=None, hi=None): """This subroutine does a segmented scan-copy of values in the source array g_src into a destination array g_dst with segments defined by values in the integer mask array g_msk. The scan-copy operation is only applied to the range between the lo and hi indices. This operation is restriced to 1-dimensional arrays. The resulting destination array will consist of segments of consecutive elements with the same value. An example is shown below GA_Scan_copy(g_src, g_dst, g_msk, 0, n); g_msk: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 g_src: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 g_dst: 1 1 1 1 1 1 7 7 9 9 9 12 12 12 15 16 16 This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] hi_nd = inquire_dims(g_src)-1 cdef int64_t c_lo=0, c_hi=hi_nd[0] cdef int c_excl=0 if lo is not None: c_lo = lo if hi is not None: c_hi = hi GA_Scan_copy64(g_src, g_dst, g_msk, c_lo, c_hi) def scatter(int g_a, values, subsarray): """Scatters array elements from a global array into a local array. subsarray will be converted to an ndarray if it is not one already. A two-dimensional array is allowed so long as its shape is (n,ndim) where n is the number of elements to gather and ndim is the number of dimensions of the target array. Also, subsarray must be contiguous. For example, if the subsarray were two-dimensional:: for k in range(n): v[k] = g_a[subsarray[k,0],subsarray[k,1],subsarray[k,2]...] For example, if the subsarray were one-dimensional:: for k in range(n): base = n*ndim v[k] = g_a[subsarray[base+0],subsarray[base+1],subsarray[base+2]...] This is a one-sided operation. """ cdef np.ndarray[np.int64_t, ndim=1] subsarray1_nd = None cdef np.ndarray[np.int64_t, ndim=2] subsarray2_nd = None cdef np.ndarray values_nd = None cdef int gtype = inquire_type(g_a) cdef int ndim = GA_Ndim(g_a) cdef int64_t n # prepare subsarray try: subsarray1_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray1_nd) / ndim except ValueError: subsarray1_nd = None try: subsarray2_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray2_nd) # length of first dimension of subsarray2_nd except ValueError: raise ValueError, "subsarray must be either 1- or 2-dimensional" # prepare values array values_nd = np.asarray(values, dtype=_to_dtype[gtype]) if values_nd.ndim != 1: raise ValueError, "values must be one-dimensional" if not values_nd.flags['C_CONTIGUOUS']: raise ValueError, "values must be contiguous" if len(values_nd) < n: raise ValueError, "values was not large enough" # call the wrapped function if subsarray1_nd is not None: NGA_Scatter_flat64(g_a, values_nd.data, subsarray1_nd.data, n) elif subsarray2_nd is not None: NGA_Scatter_flat64(g_a, values_nd.data, subsarray2_nd.data, n) else: raise ValueError, "how did this happen?" def scatter_acc(int g_a, values, subsarray, alpha=None): """Scatters array elements from a global array into a local array. Like scatter, but adds values to existing values in the global array after multiplying by alpha. subsarray will be converted to an ndarray if it is not one already. A two-dimensional array is allowed so long as its shape is (n,ndim) where n is the number of elements to gather and ndim is the number of dimensions of the target array. Also, subsarray must be contiguous. For example, if the subsarray were two-dimensional:: for k in range(n): v[k] = g_a[subsarray[k,0],subsarray[k,1],subsarray[k,2]...] For example, if the subsarray were one-dimensional:: for k in range(n): base = n*ndim v[k] = g_a[subsarray[base+0],subsarray[base+1],subsarray[base+2]...] This is a one-sided operation. """ cdef np.ndarray[np.int64_t, ndim=1] subsarray1_nd = None cdef np.ndarray[np.int64_t, ndim=2] subsarray2_nd = None cdef np.ndarray values_nd = None cdef int gtype = inquire_type(g_a) cdef int ndim = GA_Ndim(g_a) cdef int64_t n cdef int ialpha cdef long lalpha cdef long long llalpha cdef float falpha cdef double dalpha cdef long double ldalpha cdef SingleComplex fcalpha cdef DoubleComplex dcalpha cdef void *valpha=NULL # prepare subsarray try: subsarray1_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray1_nd) / ndim except ValueError: subsarray1_nd = None try: subsarray2_nd = np.ascontiguousarray(subsarray, dtype=np.int64) n = len(subsarray2_nd) # length of first dimension of subsarray2_nd except ValueError: raise ValueError, "subsarray must be either 1- or 2-dimensional" # prepare values array values_nd = np.asarray(values, dtype=_to_dtype[gtype]) if values_nd.ndim != 1: raise ValueError, "values must be one-dimensional" if not values_nd.flags['C_CONTIGUOUS']: raise ValueError, "values must be contiguous" if len(values_nd) < n: raise ValueError, "values was not large enough" # prepare alpha if alpha is None: alpha = 1 valpha = _convert_multiplier(gtype, alpha, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) # call the wrapped function if subsarray1_nd is not None: NGA_Scatter_acc_flat64(g_a, values_nd.data, subsarray1_nd.data, n, valpha) elif subsarray2_nd is not None: NGA_Scatter_acc_flat64(g_a, values_nd.data, subsarray2_nd.data, n, valpha) else: raise ValueError, "how did this happen?" def select_elem(int g_a, char *op): """Returns the value and index for an element that is selected by the specified operator in a global array corresponding to g_a handle. This is a collective operation. :returns: the selected element and the array index for the selected element """ cdef np.ndarray[np.int64_t, ndim=1] index cdef int gtype=inquire_type(g_a) cdef int ialpha cdef long lalpha cdef long long llalpha cdef float falpha cdef double dalpha cdef long double ldalpha cdef SingleComplex fcalpha cdef DoubleComplex dcalpha cdef void *valpha=NULL valpha = _convert_multiplier(gtype, 0, &ialpha, &lalpha, &llalpha, &falpha, &dalpha, &ldalpha, &fcalpha, &dcalpha) index = np.ndarray(GA_Ndim(g_a), dtype=np.int64) NGA_Select_elem64(g_a, op, valpha, index.data) if gtype == C_INT: return ialpha,index elif gtype == C_LONG: return lalpha,index elif gtype == C_LONGLONG: return llalpha,index elif gtype == C_FLOAT: return falpha,index elif gtype == C_DBL: return dalpha,index elif gtype == C_LDBL: return ldalpha,index elif gtype == C_SCPL: # TODO explicitly convert GA complex to Python complex type return fcalpha,index elif gtype == C_DCPL: # TODO explicitly convert GA complex to Python complex type return dcalpha,index else: raise TypeError, "type of g_a not recognized" def select_elem_min(int g_a): """Equivalent to ga.select_elem(g_a, "min").""" return select_elem(g_a, "min") def select_elem_max(int g_a): """Equivalent to ga.select_elem(g_a, "max").""" return select_elem(g_a, "max") def set_array_name(int g_a, char *name): """Assigns a unique character string name to a global array handle that was obtained using the GA_Create_handle function. This is a collective operation. """ GA_Set_array_name(g_a, name) def set_block_cyclic(int g_a, dims): """Creates a global array with a simple block-cyclic data distribution. The array is broken up into blocks of size dims and each block is numbered sequentially using a column major indexing scheme. The blocks are then assigned in a simple round-robin fashion to processors. This is illustrated in the figure below for an array containing 25 blocks distributed on 4 processors. Blocks at the edge of the array may be smaller than the block size specified in dims. In the example below, blocks 4,9,14,19,20,21,22,23, and 24 might be smaller thatn the remaining blocks. Most global array operations are insensitive to whether or not a block-cyclic data distribution is used, although performance may be slower in some cases if the global array is using a block-cyclic data distribution. Individual data blocks can be accessesed using the block-cyclic access functions. This is a collective operation. """ cdef np.ndarray[np.int32_t, ndim=1] dims_nd dims_nd = _inta32(dims) GA_Set_block_cyclic(g_a, dims_nd.data) def set_block_cyclic_proc_grid(int g_a, block, proc_grid): """Creates a global array with a SCALAPACK-type block cyclic data distribution. The user specifies the dimensions of the processor grid in the array proc_grid. The product of the processor grid dimensions must equal the number of total number of processors and the number of dimensions in the processor grid must be the same as the number of dimensions in the global array. The data blocks are mapped onto the processor grid in a cyclic manner along each of the processor grid axes. This is illustrated below for an array consisting of 25 data blocks disributed on 6 processors. The 6 processors are configured in a 3 by 2 processor grid. Blocks at the edge of the array may be smaller than the block size specified in dims. Most global array operations are insensitive to whether or not a block-cyclic data distribution is used, although performance may be slower in some cases if the global array is using a block-cyclic data distribution. Individual data blocks can be accessesed using the block-cyclic access functions. This is a collective operation. """ cdef np.ndarray[np.int32_t, ndim=1] block_nd, proc_grid_nd block_nd = _inta32(block) proc_grid_nd = _inta32(proc_grid) GA_Set_block_cyclic_proc_grid(g_a, block_nd.data, proc_grid_nd.data) def set_chunk(int g_a, chunk): """This function is used to set the chunk array for a global array handle that was obtained using the GA_Create_handle function. The chunk array is used to determine the minimum number of array elements assigned to each processor along each coordinate direction. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] chunk_nd chunk_nd = _inta64(chunk) GA_Set_chunk64(g_a, chunk_nd.data) def set_data(int g_a, dims, int type): """Sets the array dimension, the coordinate dimensions, and the data type assigned to a global array handle obtained using the ga.create_handle function. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] dims_nd dims_nd = _inta64(dims) GA_Set_data64(g_a, len(dims_nd), dims_nd.data, type) def set_debug(bint debug): """Sets an internal flag in the GA library to either True or False. The value of this flag can be recovered at any time using the ga.get_debug function. The flag is set to false when the the GA library is initialized. This can be useful in a number of debugging situations, especially when examining the behavior of routines that are called in multiple locations in a code. This is a local operation. """ GA_Set_debug(debug) def set_diagonal(int g_a, int g_v): """Sets the diagonal elements of this matrix g_a with the elements of the vector g_v. This is a collective operation. """ GA_Set_diagonal(g_a, g_v) def set_ghosts(int g_a, width): """Sets the ghost cell widths for a global array handle that was obtained using the ga.create_handle function. The ghosts cells widths indicate how many ghost cells are used to pad the locally held array data along each dimension. The padding can be set independently for each coordinate dimension. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] width_nd width_nd = _inta64(width) GA_Set_ghosts64(g_a, width_nd.data) def set_irreg_distr(int g_a, mapc, nblock): """Partitions the array data among the individual processors for a global array handle obtained using the ga.create_handle function. The distribution is specified as a Cartesian product of distributions for each dimension. For example, the following figure demonstrates distribution of a 2-dimensional array 8x10 on 6 (or more) processors. nblock(2)={3,2}, the size of mapc array is s=5 and array mapc contains the following elements mapc={1,3,7, 1, 6}. The distribution is nonuniform because, P1 and P4 get 20 elements each and processors P0,P2,P3, and P5 only 10 elements each. +----+----++--+ | 5 | 5 || | +====+====++==+ | P0 | P3 || 2| | P1 | P4 || 4| | P2 | P5 || 2| +----+----++--+ The array width() is used to control the width of the ghost cell boundary around the visible data on each processor. The local data of the global array residing on each processor will have a layer width(n) ghosts cells wide on either side of the visible data along the dimension n. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] mapc_nd, nblock_nd mapc_nd = _inta64(mapc) nblock_nd = _inta64(nblock) GA_Set_irreg_distr64(g_a, mapc_nd.data, nblock_nd.data) def set_memory_limit(size_t limit): """Sets the amount of memory to be used (in bytes) per process. This is a local operation. :Parameters: limit : size_t the amount of memory in bytes per process """ GA_Set_memory_limit(limit) def set_pgroup(int g_a, int pgroup): """Sets the processor configuration assigned to a global array handle that was obtained using the ga.create_handle function. It can be used to create mirrored arrays by using the mirrored array processor configuration in this function call. It can also be used to create an array on a processor group by using a processor group handle in this call. This is a collective operation. """ GA_Set_pgroup(g_a, pgroup) def set_restricted(int g_a, list): """Restrict data in the global array g_a to only the processors listed in the array list. len(list) must be less than or equal to the number of available processors. If this call is used in conjunction with set_irreg_distr, then the decomposition in the set_irreg_distr call must be done assuming that the number of processors is nproc. The data that ordinarily would be mapped to process 0 is mapped to the process in list[0], the data that would be mapped to process 1 will be mapped to list[1], etc. This can be used to remap the data distribution to different processors, even if nproc equals the number of available processors. This is a collective operation. """ cdef np.ndarray[np.int32_t, ndim=1] list_nd list_nd = _inta32(list) GA_Set_restricted(g_a, list_nd.data, len(list_nd)) def set_restricted_range(int g_a, int lo_proc, int hi_proc): """Restrict data in the global array to the given range of processors. Both lo_proc and hi_proc must be less than or equal to the total number of processors minus one (e.g., in the range [0,N-1], where N is the total number of processors) and lo_proc must be less than or equal to hi_proc. If lo_proc = 0 and hi_proc = N-1 then this call has no effect on the data distribution. This is a collective operation. """ GA_Set_restricted_range(g_a, lo_proc, hi_proc) def shift_diagoal(int g_a, value=None): """Adds this constant to the diagonal elements of the matrix. This is a collective operation. """ cdef int ivalue cdef long lvalue cdef long long llvalue cdef float fvalue cdef double dvalue cdef long double ldvalue cdef SingleComplex fcvalue cdef DoubleComplex dcvalue cdef void *vvalue cdef int gtype=inquire_type(g_a) if value is None: value = 1 vvalue = _convert_multiplier(gtype, value, &ivalue, &lvalue, &llvalue, &fvalue, &dvalue, &ldvalue, &fcvalue, &dcvalue) GA_Shift_diagonal(g_a, vvalue) def solve(int g_a, int g_b): """Solves a system of linear equations A * X = B. It first will call the Cholesky factorization routine and, if sucessfully, will solve the system with the Cholesky solver. If Cholesky will be not be able to factorize A, then it will call the LU factorization routine and will solve the system with forward/backward substitution. On exit B will contain the solution X. This is a collective operation. :returns: 0 if Cholesky factoriztion was succesful. >0 if the leading minor of this order is not positive definite, Cholesky factorization could not be completed and LU factoriztion was used """ return GA_Solve(g_a, g_b) def spd_invert(int g_a): """Compute the inverse of a double precision using the Cholesky factorization of a NxN double precision symmetric positive definite matrix A stored in the global array represented by g_a. On successful exit, A will contain the inverse. This is a collective operation. :returns: 0 if successful exit; >0 if the leading minor of this order is not positive definite and the factorization could not be completed; <0 if it returns the index i of the (i,i) element of the factor L/U that is zero and the inverse could not be computed """ return GA_Spd_invert(g_a) def step_max(int g_a, int g_b, alo=None, ahi=None, blo=None, bhi=None): """Calculates the largest multiple of a vector g_b that can be added to this vector g_a while keeping each element of this vector non-negative. This is a collective operation. """ cdef np.ndarray[np.int64_t, ndim=1] alo_nd, ahi_nd cdef np.ndarray[np.int64_t, ndim=1] blo_nd, bhi_nd cdef double step if (alo is None and ahi is None and blo is None and bhi is None): GA_Step_max(g_a, g_b, &step) else: alo_nd,ahi_nd = _lohi(g_a,alo,ahi) blo_nd,bhi_nd = _lohi(g_b,blo,bhi) GA_Step_max_patch64(g_a, alo_nd.data, ahi_nd.data, g_b, blo_nd.data, bhi_nd.data, &step) return step def strided_acc(int g_a, buffer, lo=None, hi=None, skip=None, alpha=None): """Strided version of ga.acc. The values corresponding to dimension n in buf are accumulated to every skip[n] values of the global array g_a. Combines data from buffer with data in the global array patch. The buffer array is assumed to be have the same number of dimensions as the global array. If the buffer is not contiguous, a contiguous copy will be made. global array section (lo[],hi[]) += alpha * buffer This is a one-sided and atomic operation. :Parameters: g_a : int the array handle buffer : array-like must be contiguous and have same number of elements as patch lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive alpha : object multiplier (converted to the appropriate type) """ _acc_common(g_a, buffer, lo, hi, alpha, False, False, skip) def strided_get(int g_a, lo=None, hi=None, skip=None, np.ndarray buffer=None): """Strided version of ga.get. Copies data from global array section to the local array buffer. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in the input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : 1D array-like of integers higher bound patch coordinates, exclusive skip : 1D array-like of integers strides for each dimension buffer : ndarray an ndarray of the appropriate type, large enough to hold lo,hi :returns: The local array buffer. """ return _get_common(g_a, lo, hi, buffer, False, False, skip) def strided_put(int g_a, buffer, lo=None, hi=None, skip=None): """Strided version of ga.put. Copies data from local array buffer to the global array section. The local array is assumed to be have the same number of dimensions as the global array. Any detected inconsitencies/errors in input arguments are fatal. This is a one-sided operation. :Parameters: g_a : int the array handle buffer : array-like the data to put lo : 1D array-like of integers lower bound patch coordinates, inclusive hi : array-like of integers higher bound patch coordinates, exclusive skip : 1D array-like of integers strides for each dimension """ _put_common(g_a, buffer, lo, hi, False, False, skip) def summarize(bint verbose): """Prints info about allocated arrays.""" GA_Summarize(verbose) def symmetrize(int g_a): """Symmetrizes matrix A represented with handle g_a: A:= .5 * (A+A'). This is a collective operation. """ GA_Symmetrize(g_a) def sync(): """Synchronize processes (a barrier) and ensure that all GA operations completed. This is a collective operation. """ GA_Sync() def terminate(): """Delete all active arrays and destroy internal data structures. This is a collective operation. """ global _initialized _initialized = False GA_Terminate() def total_blocks(int g_a): """Returns the total number of blocks contained in a global array with a block-cyclic data distribution. This is a local operation. """ return GA_Total_blocks(g_a) def transpose(int g_a, int g_b): """Transposes a matrix: B = A', where A and B are represented by handles g_a and g_b. This is a collective operation. """ GA_Transpose(g_a, g_b) def unlock(int mutex): """Unlocks a mutex object identified by the mutex number. It is a fatal error for a process to attempt to unlock a mutex which has not been locked by this process.""" GA_Unlock(mutex) def unpack(int g_src, int g_dst, int g_msk, lo=None, hi=None): """Expands the values in the source vector into a larger destination vector. The unpack subroutine is designed to expand the values in the source vector g_src into a larger destination array g_dst based on the values in an integer mask array g_msk. The values lo and hi denote the range of elements that should be uncompressed and icount is a variable that on output lists the number of values placed in the uncompressed array. This operation is the complement of the ga.pack operation. An example is shown below:: ga.unpack(g_src, g_dst, g_msk, 1, n, &icount); g_src: 1 7 9 12 15 16 g_msk: 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 g_dst: 1 0 0 0 0 0 7 0 9 0 0 12 0 0 15 16 0 icount: 6 This is a collective operation. :Parameters: g_src : int handle for source arrray g_dst : int handle for destination array g_msk : int handle for integer array representing mask lo : 1D array-like of integers low value of range on which operation is performed hi : 1D array-like of integers hi value of range on which operation is performed """ cdef np.ndarray[np.int64_t, ndim=1] hi_nd = inquire_dims(g_src)-1 cdef int64_t c_lo=0, c_hi=hi_nd[0], icount if lo is not None: c_lo = lo if hi is not None: c_hi = hi GA_Unpack64(g_src, g_dst, g_msk, lo, hi, &icount) return icount def update_ghosts(int g_a): """This call updates the ghost cell regions on each processor with the corresponding neighbor data from other processors. The operation assumes that all data is wrapped around using periodic boundary data so that ghost cell data that goes beyound an array boundary is wrapped around to the other end of the array. The ga.update_ghosts call contains two ga.sync calls before and after the actual update operation. For some applications these calls may be unecessary, if so they can be removed using the ga.mask_sync subroutine. This is a collective operation. """ GA_Update_ghosts(g_a) def update_ghost_dir(int g_a, int dimension, int dir, int flag): """This function can be used to update the ghost cells along individual directions. It is designed for algorithms that can overlap updates with computation. The variable dimension indicates which coordinate direction is to be updated (e.g. dimension = 1 would correspond to the y axis in a two or three dimensional system), the variable idir can take the values +/-1 and indicates whether the side that is to be updated lies in the positive or negative direction, and cflag indicates whether or not the corners on the side being updated are to be included in the update. The following calls would be equivalent to a call to GA_Update_ghosts for a 2-dimensional system: status = NGA_Update_ghost_dir(g_a,0,-1,1); status = NGA_Update_ghost_dir(g_a,0,1,1); status = NGA_Update_ghost_dir(g_a,1,-1,0); status = NGA_Update_ghost_dir(g_a,1,1,0); The variable cflag is set equal to 1 (or non-zero) in the first two calls so that the corner ghost cells are update, it is set equal to 0 in the second two calls to avoid redundant updates of the corners. Note that updating the ghosts cells using several independent calls to the nga_update_ghost_dir functions is generally not as efficient as using GA_Update_ghosts unless the individual calls can be effectively overlapped with computation. """ NGA_Update_ghost_dir(g_a, dimension, dir, flag) def uses_ma(): """TODO""" if GA_Uses_ma() == 1: return True return False def wtime(): """This function return a wall (or elapsed) time on the calling processor. Returns time in seconds representing elapsed wall-clock time since an arbitrary time in the past. Example: starttime = ga.wtime() # .... code snippet to be timed .... endtime = ga.wtime() print "Time taken = %s seconds" % endtime-starttime This is a local operation. This function is only available in release 4.1 or greater. """ return GA_Wtime() def zero(int g_a, lo=None, hi=None): """Set all the elements in the array or patch to zero.""" cdef np.ndarray[np.int64_t, ndim=1] lo_nd, hi_nd if lo is None and hi is None: GA_Zero(g_a) else: lo_nd,hi_nd = _lohi(g_a,lo,hi) NGA_Zero_patch64(g_a, lo_nd.data, hi_nd.data) def zero_diagonal(int g_a): """Sets the diagonal elements of this matrix g_a with zeros. This is a collective operation. """ GA_Zero_diagonal(g_a) initialize() ga-5-4/python/ga4py/gain/0000755000175000017500000000000012662210323013310 5ustar mbambaga-5-4/python/ga4py/gain/notimplemented.pyx0000644000175000017500000137315712662210323017117 0ustar mbamba import sys import numpy as np cimport numpy as np def docstring(obj, docstring): """docstring(obj, docstring) Add a docstring to a built-in obj if possible. If the obj already has a docstring raise a RuntimeError If this routine does not know how to add a docstring to the object raise a TypeError """ # BUILTIN raise NotImplementedError def add_newdoc(place, obj, doc): """Adds documentation to obj which is in module place. If doc is a string add it to obj as a docstring If doc is a tuple, then the first element is interpreted as an attribute of obj and the second as the docstring (method, docstring) If doc is a list, then each element of the list should be a sequence of length two --> [(method1, docstring1), (method2, docstring2), ...] This routine never raises an error. """ raise NotImplementedError def all(a, axis=None, out=None): """Test whether all array elements along a given axis evaluate to True. Parameters ---------- a : array_like Input array or object that can be converted to an array. axis : int, optional Axis along which a logical AND is performed. The default (`axis` = `None`) is to perform a logical AND over a flattened input array. `axis` may be negative, in which case it counts from the last to the first axis. out : ndarray, optional Alternate output array in which to place the result. It must have the same shape as the expected output and its type is preserved (e.g., if ``dtype(out)`` is float, the result will consist of 0.0's and 1.0's). See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- all : ndarray, bool A new boolean or array is returned unless `out` is specified, in which case a reference to `out` is returned. See Also -------- ndarray.all : equivalent method any : Test whether any element along a given axis evaluates to True. Notes ----- Not a Number (NaN), positive infinity and negative infinity evaluate to `True` because these are not equal to zero. Examples -------- >>> np.all([[True,False],[True,True]]) False >>> np.all([[True,False],[True,True]], axis=0) array([ True, False], dtype=bool) >>> np.all([-1, 4, 5]) True >>> np.all([1.0, np.nan]) True >>> o=np.array([False]) >>> z=np.all([-1, 4, 5], out=o) >>> id(z), id(o), z # doctest: +SKIP (28293632, 28293632, array([ True], dtype=bool)) """ raise NotImplementedError def allclose(a, b, rtol=1e-05, atol=1e-08): """Returns True if two arrays are element-wise equal within a tolerance. The tolerance values are positive, typically very small numbers. The relative difference (`rtol` * abs(`b`)) and the absolute difference `atol` are added together to compare against the absolute difference between `a` and `b`. Parameters ---------- a, b : array_like Input arrays to compare. rtol : float The relative tolerance parameter (see Notes). atol : float The absolute tolerance parameter (see Notes). Returns ------- y : bool Returns True if the two arrays are equal within the given tolerance; False otherwise. If either array contains NaN, then False is returned. See Also -------- all, any, alltrue, sometrue Notes ----- If the following equation is element-wise True, then allclose returns True. absolute(`a` - `b`) <= (`atol` + `rtol` * absolute(`b`)) The above equation is not symmetric in `a` and `b`, so that `allclose(a, b)` might be different from `allclose(b, a)` in some rare cases. Examples -------- >>> np.allclose([1e10,1e-7], [1.00001e10,1e-8]) False >>> np.allclose([1e10,1e-8], [1.00001e10,1e-9]) True >>> np.allclose([1e10,1e-8], [1.0001e10,1e-9]) False >>> np.allclose([1.0, np.nan], [1.0, np.nan]) False """ raise NotImplementedError def alltrue(a, axis=None, out=None): """Check if all elements of input array are true. See Also -------- numpy.all : Equivalent function; see for details. """ raise NotImplementedError def alterdot(): """Change `dot`, `vdot`, and `innerproduct` to use accelerated BLAS functions. Typically, as a user of Numpy, you do not explicitly call this function. If Numpy is built with an accelerated BLAS, this function is automatically called when Numpy is imported. When Numpy is built with an accelerated BLAS like ATLAS, these functions are replaced to make use of the faster implementations. The faster implementations only affect float32, float64, complex64, and complex128 arrays. Furthermore, the BLAS API only includes matrix-matrix, matrix-vector, and vector-vector products. Products of arrays with larger dimensionalities use the built in functions and are not accelerated. See Also -------- restoredot : `restoredot` undoes the effects of `alterdot`. """ # BUILTIN raise NotImplementedError def amax(a, axis=None, out=None): """Return the maximum of an array or maximum along an axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default flattened input is used. out : ndarray, optional Alternate output array in which to place the result. Must be of the same shape and buffer length as the expected output. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- amax : ndarray or scalar Maximum of `a`. If `axis` is None, the result is a scalar value. If `axis` is given, the result is an array of dimension ``a.ndim - 1``. See Also -------- nanmax : NaN values are ignored instead of being propagated. fmax : same behavior as the C99 fmax function. argmax : indices of the maximum values. Notes ----- NaN values are propagated, that is if at least one item is NaN, the corresponding max value will be NaN as well. To ignore NaN values (MATLAB behavior), please use nanmax. Examples -------- >>> a = np.arange(4).reshape((2,2)) >>> a array([[0, 1], [2, 3]]) >>> np.amax(a) 3 >>> np.amax(a, axis=0) array([2, 3]) >>> np.amax(a, axis=1) array([1, 3]) >>> b = np.arange(5, dtype=np.float) >>> b[2] = np.NaN >>> np.amax(b) nan >>> np.nanmax(b) 4.0 """ raise NotImplementedError def amin(a, axis=None, out=None): """Return the minimum of an array or minimum along an axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default a flattened input is used. out : ndarray, optional Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- amin : ndarray A new array or a scalar array with the result. See Also -------- nanmin: nan values are ignored instead of being propagated fmin: same behavior as the C99 fmin function argmin: Return the indices of the minimum values. amax, nanmax, fmax Notes ----- NaN values are propagated, that is if at least one item is nan, the corresponding min value will be nan as well. To ignore NaN values (matlab behavior), please use nanmin. Examples -------- >>> a = np.arange(4).reshape((2,2)) >>> a array([[0, 1], [2, 3]]) >>> np.amin(a) # Minimum of the flattened array 0 >>> np.amin(a, axis=0) # Minima along the first axis array([0, 1]) >>> np.amin(a, axis=1) # Minima along the second axis array([0, 2]) >>> b = np.arange(5, dtype=np.float) >>> b[2] = np.NaN >>> np.amin(b) nan >>> np.nanmin(b) 0.0 """ raise NotImplementedError def angle(z, deg=0): """Return the angle of the complex argument. Parameters ---------- z : array_like A complex number or sequence of complex numbers. deg : bool, optional Return angle in degrees if True, radians if False (default). Returns ------- angle : {ndarray, scalar} The counterclockwise angle from the positive real axis on the complex plane, with dtype as numpy.float64. See Also -------- arctan2 absolute Examples -------- >>> np.angle([1.0, 1.0j, 1+1j]) # in radians array([ 0. , 1.57079633, 0.78539816]) >>> np.angle(1+1j, deg=True) # in degrees 45.0 """ raise NotImplementedError def any(a, axis=None, out=None): """Test whether any array element along a given axis evaluates to True. Returns single boolean unless `axis` is not ``None`` Parameters ---------- a : array_like Input array or object that can be converted to an array. axis : int, optional Axis along which a logical OR is performed. The default (`axis` = `None`) is to perform a logical OR over a flattened input array. `axis` may be negative, in which case it counts from the last to the first axis. out : ndarray, optional Alternate output array in which to place the result. It must have the same shape as the expected output and its type is preserved (e.g., if it is of type float, then it will remain so, returning 1.0 for True and 0.0 for False, regardless of the type of `a`). See `doc.ufuncs` (Section "Output arguments") for details. Returns ------- any : bool or ndarray A new boolean or `ndarray` is returned unless `out` is specified, in which case a reference to `out` is returned. See Also -------- ndarray.any : equivalent method all : Test whether all elements along a given axis evaluate to True. Notes ----- Not a Number (NaN), positive infinity and negative infinity evaluate to `True` because these are not equal to zero. Examples -------- >>> np.any([[True, False], [True, True]]) True >>> np.any([[True, False], [False, False]], axis=0) array([ True, False], dtype=bool) >>> np.any([-1, 0, 5]) True >>> np.any(np.nan) True >>> o=np.array([False]) >>> z=np.any([-1, 4, 5], out=o) >>> z, o (array([ True], dtype=bool), array([ True], dtype=bool)) >>> # Check now that z is a reference to o >>> z is o True >>> id(z), id(o) # identity of z and o # doctest: +SKIP (191614240, 191614240) """ raise NotImplementedError def append(arr, values, axis=None): """Append values to the end of an array. Parameters ---------- arr : array_like Values are appended to a copy of this array. values : array_like These values are appended to a copy of `arr`. It must be of the correct shape (the same shape as `arr`, excluding `axis`). If `axis` is not specified, `values` can be any shape and will be flattened before use. axis : int, optional The axis along which `values` are appended. If `axis` is not given, both `arr` and `values` are flattened before use. Returns ------- out : ndarray A copy of `arr` with `values` appended to `axis`. Note that `append` does not occur in-place: a new array is allocated and filled. If `axis` is None, `out` is a flattened array. See Also -------- insert : Insert elements into an array. delete : Delete elements from an array. Examples -------- >>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]]) array([1, 2, 3, 4, 5, 6, 7, 8, 9]) When `axis` is specified, `values` must have the correct shape. >>> np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0) array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> np.append([[1, 2, 3], [4, 5, 6]], [7, 8, 9], axis=0) Traceback (most recent call last): ... ValueError: arrays must have same number of dimensions """ raise NotImplementedError def apply_along_axis(func1d, axis, arr): """Apply a function to 1-D slices along the given axis. Execute `func1d(a, *args)` where `func1d` operates on 1-D arrays and `a` is a 1-D slice of `arr` along `axis`. Parameters ---------- func1d : function This function should accept 1-D arrays. It is applied to 1-D slices of `arr` along the specified axis. axis : integer Axis along which `arr` is sliced. arr : ndarray Input array. args : any Additional arguments to `func1d`. Returns ------- outarr : ndarray The output array. The shape of `outarr` is identical to the shape of `arr`, except along the `axis` dimension, where the length of `outarr` is equal to the size of the return value of `func1d`. If `func1d` returns a scalar `outarr` will have one fewer dimensions than `arr`. See Also -------- apply_over_axes : Apply a function repeatedly over multiple axes. Examples -------- >>> def my_func(a): ... '''Average first and last element of a 1-D array''' ... return (a[0] + a[-1]) * 0.5 >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> np.apply_along_axis(my_func, 0, b) array([ 4., 5., 6.]) >>> np.apply_along_axis(my_func, 1, b) array([ 2., 5., 8.]) For a function that doesn't return a scalar, the number of dimensions in `outarr` is the same as `arr`. >>> def new_func(a): ... '''Divide elements of a by 2.''' ... return a * 0.5 >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> np.apply_along_axis(new_func, 0, b) array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ], [ 3.5, 4. , 4.5]]) """ raise NotImplementedError def apply_over_axes(func, a, axes): """Apply a function repeatedly over multiple axes. `func` is called as `res = func(a, axis)`, where `axis` is the first element of `axes`. The result `res` of the function call must have either the same dimensions as `a` or one less dimension. If `res` has one less dimension than `a`, a dimension is inserted before `axis`. The call to `func` is then repeated for each axis in `axes`, with `res` as the first argument. Parameters ---------- func : function This function must take two arguments, `func(a, axis)`. a : array_like Input array. axes : array_like Axes over which `func` is applied; the elements must be integers. Returns ------- val : ndarray The output array. The number of dimensions is the same as `a`, but the shape can be different. This depends on whether `func` changes the shape of its output with respect to its input. See Also -------- apply_along_axis : Apply a function to 1-D slices of an array along the given axis. Examples -------- >>> a = np.arange(24).reshape(2,3,4) >>> a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) Sum over axes 0 and 2. The result has same number of dimensions as the original array: >>> np.apply_over_axes(np.sum, a, [0,2]) array([[[ 60], [ 92], [124]]]) """ raise NotImplementedError def argmax(a, axis=None): """Indices of the maximum values along an axis. Parameters ---------- a : array_like Input array. axis : int, optional By default, the index is into the flattened array, otherwise along the specified axis. Returns ------- index_array : ndarray of ints Array of indices into the array. It has the same shape as `a.shape` with the dimension along `axis` removed. See Also -------- ndarray.argmax, argmin amax : The maximum value along a given axis. unravel_index : Convert a flat index into an index tuple. Notes ----- In case of multiple occurrences of the maximum values, the indices corresponding to the first occurrence are returned. Examples -------- >>> a = np.arange(6).reshape(2,3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> np.argmax(a) 5 >>> np.argmax(a, axis=0) array([1, 1, 1]) >>> np.argmax(a, axis=1) array([2, 2]) >>> b = np.arange(6) >>> b[1] = 5 >>> b array([0, 5, 2, 3, 4, 5]) >>> np.argmax(b) # Only the first occurrence is returned. 1 """ raise NotImplementedError def argmin(a, axis=None): """Return the indices of the minimum values along an axis. See Also -------- argmax : Similar function. Please refer to `numpy.argmax` for detailed documentation. """ raise NotImplementedError def argsort(a, axis=-1, kind='quicksort', order=None): """Returns the indices that would sort an array. Perform an indirect sort along the given axis using the algorithm specified by the `kind` keyword. It returns an array of indices of the same shape as `a` that index data along the given axis in sorted order. Parameters ---------- a : array_like Array to sort. axis : int or None, optional Axis along which to sort. The default is -1 (the last axis). If None, the flattened array is used. kind : {'quicksort', 'mergesort', 'heapsort'}, optional Sorting algorithm. order : list, optional When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be specified. Returns ------- index_array : ndarray, int Array of indices that sort `a` along the specified axis. In other words, ``a[index_array]`` yields a sorted `a`. See Also -------- sort : Describes sorting algorithms used. lexsort : Indirect stable sort with multiple keys. ndarray.sort : Inplace sort. Notes ----- See `sort` for notes on the different sorting algorithms. As of NumPy 1.4.0 `argsort` works with real/complex arrays containing nan values. The enhanced sort order is documented in `sort`. Examples -------- One dimensional array: >>> x = np.array([3, 1, 2]) >>> np.argsort(x) array([1, 2, 0]) Two-dimensional array: >>> x = np.array([[0, 3], [2, 2]]) >>> x array([[0, 3], [2, 2]]) >>> np.argsort(x, axis=0) array([[0, 1], [1, 0]]) >>> np.argsort(x, axis=1) array([[0, 1], [0, 1]]) Sorting with keys: >>> x = np.array([(1, 0), (0, 1)], dtype=[('x', '>> x array([(1, 0), (0, 1)], dtype=[('x', '>> np.argsort(x, order=('x','y')) array([1, 0]) >>> np.argsort(x, order=('y','x')) array([0, 1]) """ raise NotImplementedError def argwhere(a): """Find the indices of array elements that are non-zero, grouped by element. Parameters ---------- a : array_like Input data. Returns ------- index_array : ndarray Indices of elements that are non-zero. Indices are grouped by element. See Also -------- where, nonzero Notes ----- ``np.argwhere(a)`` is the same as ``np.transpose(np.nonzero(a))``. The output of ``argwhere`` is not suitable for indexing arrays. For this purpose use ``where(a)`` instead. Examples -------- >>> x = np.arange(6).reshape(2,3) >>> x array([[0, 1, 2], [3, 4, 5]]) >>> np.argwhere(x>1) array([[0, 2], [1, 0], [1, 1], [1, 2]]) """ raise NotImplementedError def around(a, decimals=0, out=None): """Evenly round to the given number of decimals. Parameters ---------- a : array_like Input data. decimals : int, optional Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left of the decimal point. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary. See `doc.ufuncs` (Section "Output arguments") for details. Returns ------- rounded_array : ndarray An array of the same type as `a`, containing the rounded values. Unless `out` was specified, a new array is created. A reference to the result is returned. The real and imaginary parts of complex numbers are rounded separately. The result of rounding a float is a float. See Also -------- ndarray.round : equivalent method ceil, fix, floor, rint, trunc Notes ----- For values exactly halfway between rounded decimal values, Numpy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc. Results may also be surprising due to the inexact representation of decimal fractions in the IEEE floating point standard [1]_ and errors introduced when scaling by powers of ten. References ---------- .. [1] "Lecture Notes on the Status of IEEE 754", William Kahan, http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF .. [2] "How Futile are Mindless Assessments of Roundoff in Floating-Point Computation?", William Kahan, http://www.cs.berkeley.edu/~wkahan/Mindless.pdf Examples -------- >>> np.around([0.37, 1.64]) array([ 0., 2.]) >>> np.around([0.37, 1.64], decimals=1) array([ 0.4, 1.6]) >>> np.around([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value array([ 0., 2., 2., 4., 4.]) >>> np.around([1,2,3,11], decimals=1) # ndarray of ints is returned array([ 1, 2, 3, 11]) >>> np.around([1,2,3,11], decimals=-1) array([ 0, 0, 0, 10]) """ raise NotImplementedError def array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0): """array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0) Create an array. Parameters ---------- object : array_like An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence. dtype : data-type, optional The desired data-type for the array. If not given, then the type will be determined as the minimum type required to hold the objects in the sequence. This argument can only be used to 'upcast' the array. For downcasting, use the .astype(t) method. copy : bool, optional If true (default), then the object is copied. Otherwise, a copy will only be made if __array__ returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). order : {'C', 'F', 'A'}, optional Specify the order of the array. If order is 'C' (default), then the array will be in C-contiguous order (last-index varies the fastest). If order is 'F', then the returned array will be in Fortran-contiguous order (first-index varies the fastest). If order is 'A', then the returned array may be in any order (either C-, Fortran-contiguous, or even discontiguous). subok : bool, optional If True, then sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default). ndmin : int, optional Specifies the minimum number of dimensions that the resulting array should have. Ones will be pre-pended to the shape as needed to meet this requirement. Returns ------- out : ndarray An array object satisfying the specified requirements. See Also -------- empty, empty_like, zeros, zeros_like, ones, ones_like, fill Examples -------- >>> np.array([1, 2, 3]) array([1, 2, 3]) Upcasting: >>> np.array([1, 2, 3.0]) array([ 1., 2., 3.]) More than one dimension: >>> np.array([[1, 2], [3, 4]]) array([[1, 2], [3, 4]]) Minimum dimensions 2: >>> np.array([1, 2, 3], ndmin=2) array([[1, 2, 3]]) Type provided: >>> np.array([1, 2, 3], dtype=complex) array([ 1.+0.j, 2.+0.j, 3.+0.j]) Data-type consisting of more than one element: >>> x = np.array([(1,2),(3,4)],dtype=[('a','>> x['a'] array([1, 3]) Creating an array from sub-classes: >>> np.array(np.mat('1 2; 3 4')) array([[1, 2], [3, 4]]) >>> np.array(np.mat('1 2; 3 4'), subok=True) matrix([[1, 2], [3, 4]]) """ # BUILTIN raise NotImplementedError def array2string(a, max_line_width=None, precision=None, suppress_small=None, separator=' ', prefix='', style=repr): """Return a string representation of an array. Parameters ---------- a : ndarray Input array. max_line_width : int, optional The maximum number of columns the string should span. Newline characters splits the string appropriately after array elements. precision : int, optional Floating point precision. Default is the current printing precision (usually 8), which can be altered using `set_printoptions`. suppress_small : bool, optional Represent very small numbers as zero. A number is "very small" if it is smaller than the current printing precision. separator : str, optional Inserted between elements. prefix : str, optional An array is typically printed as:: 'prefix(' + array2string(a) + ')' The length of the prefix string is used to align the output correctly. style : function, optional A function that accepts an ndarray and returns a string. Used only when the shape of `a` is equal to (). Returns ------- array_str : str String representation of the array. See Also -------- array_str, array_repr, set_printoptions Examples -------- >>> x = np.array([1e-16,1,2,3]) >>> print np.array2string(x, precision=2, separator=',', ... suppress_small=True) [ 0., 1., 2., 3.] """ raise NotImplementedError def array_equal(a1, a2): """True if two arrays have the same shape and elements, False otherwise. Parameters ---------- a1, a2 : array_like Input arrays. Returns ------- b : bool Returns True if the arrays are equal. See Also -------- allclose: Returns True if two arrays are element-wise equal within a tolerance. array_equiv: Returns True if input arrays are shape consistent and all elements equal. Examples -------- >>> np.array_equal([1, 2], [1, 2]) True >>> np.array_equal(np.array([1, 2]), np.array([1, 2])) True >>> np.array_equal([1, 2], [1, 2, 3]) False >>> np.array_equal([1, 2], [1, 4]) False """ raise NotImplementedError def array_equiv(a1, a2): """Returns True if input arrays are shape consistent and all elements equal. Shape consistent means they are either the same shape, or one input array can be broadcasted to create the same shape as the other one. Parameters ---------- a1, a2 : array_like Input arrays. Returns ------- out : bool True if equivalent, False otherwise. Examples -------- >>> np.array_equiv([1, 2], [1, 2]) True >>> np.array_equiv([1, 2], [1, 3]) False Showing the shape equivalence: >>> np.array_equiv([1, 2], [[1, 2], [1, 2]]) True >>> np.array_equiv([1, 2], [[1, 2, 1, 2], [1, 2, 1, 2]]) False >>> np.array_equiv([1, 2], [[1, 2], [1, 3]]) False """ raise NotImplementedError def array_repr(arr, max_line_width=None, precision=None, suppress_small=None): """Return the string representation of an array. Parameters ---------- arr : ndarray Input array. max_line_width : int, optional The maximum number of columns the string should span. Newline characters split the string appropriately after array elements. precision : int, optional Floating point precision. Default is the current printing precision (usually 8), which can be altered using `set_printoptions`. suppress_small : bool, optional Represent very small numbers as zero, default is False. Very small is defined by `precision`, if the precision is 8 then numbers smaller than 5e-9 are represented as zero. Returns ------- string : str The string representation of an array. See Also -------- array_str, array2string, set_printoptions Examples -------- >>> np.array_repr(np.array([1,2])) 'array([1, 2])' >>> np.array_repr(np.ma.array([0.])) 'MaskedArray([ 0.])' >>> np.array_repr(np.array([], np.int32)) 'array([], dtype=int32)' >>> x = np.array([1e-6, 4e-7, 2, 3]) >>> np.array_repr(x, precision=6, suppress_small=True) 'array([ 0.000001, 0. , 2. , 3. ])' """ raise NotImplementedError def array_split(ary, indices_or_sections, axis=0): """Split an array into multiple sub-arrays of equal or near-equal size. Please refer to the ``split`` documentation. The only difference between these functions is that ``array_split`` allows `indices_or_sections` to be an integer that does *not* equally divide the axis. See Also -------- split : Split array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(8.0) >>> np.array_split(x, 3) [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])] """ raise NotImplementedError def array_str(a, max_line_width=None, precision=None, suppress_small=None): """Return a string representation of the data in an array. The data in the array is returned as a single string. This function is similar to `array_repr`, the difference being that `array_repr` also returns information on the kind of array and its data type. Parameters ---------- a : ndarray Input array. max_line_width : int, optional Inserts newlines if text is longer than `max_line_width`. The default is, indirectly, 75. precision : int, optional Floating point precision. Default is the current printing precision (usually 8), which can be altered using `set_printoptions`. suppress_small : bool, optional Represent numbers "very close" to zero as zero; default is False. Very close is defined by precision: if the precision is 8, e.g., numbers smaller (in absolute value) than 5e-9 are represented as zero. See Also -------- array2string, array_repr, set_printoptions Examples -------- >>> np.array_str(np.arange(3)) '[0 1 2]' """ raise NotImplementedError def asanyarray(a, dtype=None, order=None): """Convert the input to an ndarray, but pass ndarray subclasses through. Parameters ---------- a : array_like Input data, in any form that can be converted to an array. This includes scalars, lists, lists of tuples, tuples, tuples of tuples, tuples of lists, and ndarrays. dtype : data-type, optional By default, the data-type is inferred from the input data. order : {'C', 'F'}, optional Whether to use row-major ('C') or column-major ('F') memory representation. Defaults to 'C'. Returns ------- out : ndarray or an ndarray subclass Array interpretation of `a`. If `a` is an ndarray or a subclass of ndarray, it is returned as-is and no copy is performed. See Also -------- asarray : Similar function which always returns ndarrays. ascontiguousarray : Convert input to a contiguous array. asfarray : Convert input to a floating point ndarray. asfortranarray : Convert input to an ndarray with column-major memory order. asarray_chkfinite : Similar function which checks input for NaNs and Infs. fromiter : Create an array from an iterator. fromfunction : Construct an array by executing a function on grid positions. Examples -------- Convert a list into an array: >>> a = [1, 2] >>> np.asanyarray(a) array([1, 2]) Instances of `ndarray` subclasses are passed through as-is: >>> a = np.matrix([1, 2]) >>> np.asanyarray(a) is a True """ raise NotImplementedError def asarray_chkfinite(a): """Convert the input to an array, checking for NaNs or Infs. Parameters ---------- a : array_like Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays. Success requires no NaNs or Infs. dtype : data-type, optional By default, the data-type is inferred from the input data. order : {'C', 'F'}, optional Whether to use row-major ('C') or column-major ('FORTRAN') memory representation. Defaults to 'C'. Returns ------- out : ndarray Array interpretation of `a`. No copy is performed if the input is already an ndarray. If `a` is a subclass of ndarray, a base class ndarray is returned. Raises ------ ValueError Raises ValueError if `a` contains NaN (Not a Number) or Inf (Infinity). See Also -------- asarray : Create and array. asanyarray : Similar function which passes through subclasses. ascontiguousarray : Convert input to a contiguous array. asfarray : Convert input to a floating point ndarray. asfortranarray : Convert input to an ndarray with column-major memory order. fromiter : Create an array from an iterator. fromfunction : Construct an array by executing a function on grid positions. Examples -------- Convert a list into an array. If all elements are finite ``asarray_chkfinite`` is identical to ``asarray``. >>> a = [1, 2] >>> np.asarray_chkfinite(a) array([1, 2]) Raises ValueError if array_like contains Nans or Infs. >>> a = [1, 2, np.inf] >>> try: ... np.asarray_chkfinite(a) ... except ValueError: ... print 'ValueError' ... ValueError """ raise NotImplementedError def ascontiguousarray(a, dtype=None): """Return a contiguous array in memory (C order). Parameters ---------- a : array_like Input array. dtype : str or dtype object, optional Data-type of returned array. Returns ------- out : ndarray Contiguous array of same shape and content as `a`, with type `dtype` if specified. See Also -------- asfortranarray : Convert input to an ndarray with column-major memory order. require : Return an ndarray that satisfies requirements. ndarray.flags : Information about the memory layout of the array. Examples -------- >>> x = np.arange(6).reshape(2,3) >>> np.ascontiguousarray(x, dtype=np.float32) array([[ 0., 1., 2.], [ 3., 4., 5.]], dtype=float32) >>> x.flags['C_CONTIGUOUS'] True """ raise NotImplementedError def asfarray(a, dtype=np.float64): """Return an array converted to a float type. Parameters ---------- a : array_like The input array. dtype : str or dtype object, optional Float type code to coerce input array `a`. If `dtype` is one of the 'int' dtypes, it is replaced with float64. Returns ------- out : ndarray The input `a` as a float ndarray. Examples -------- >>> np.asfarray([2, 3]) array([ 2., 3.]) >>> np.asfarray([2, 3], dtype='float') array([ 2., 3.]) >>> np.asfarray([2, 3], dtype='int8') array([ 2., 3.]) """ raise NotImplementedError def asfortranarray(a, dtype=None): """Return an array laid out in Fortran order in memory. Parameters ---------- a : array_like Input array. dtype : str or dtype object, optional By default, the data-type is inferred from the input data. Returns ------- out : ndarray The input `a` in Fortran, or column-major, order. See Also -------- ascontiguousarray : Convert input to a contiguous (C order) array. asanyarray : Convert input to an ndarray with either row or column-major memory order. require : Return an ndarray that satisfies requirements. ndarray.flags : Information about the memory layout of the array. Examples -------- >>> x = np.arange(6).reshape(2,3) >>> y = np.asfortranarray(x) >>> x.flags['F_CONTIGUOUS'] False >>> y.flags['F_CONTIGUOUS'] True """ raise NotImplementedError def asmatrix(data, dtype=None): """Interpret the input as a matrix. Unlike `matrix`, `asmatrix` does not make a copy if the input is already a matrix or an ndarray. Equivalent to ``matrix(data, copy=False)``. Parameters ---------- data : array_like Input data. Returns ------- mat : matrix `data` interpreted as a matrix. Examples -------- >>> x = np.array([[1, 2], [3, 4]]) >>> m = np.asmatrix(x) >>> x[0,0] = 5 >>> m matrix([[5, 2], [3, 4]]) """ raise NotImplementedError def asscalar(a): """Convert an array of size 1 to its scalar equivalent. Parameters ---------- a : ndarray Input array of size 1. Returns ------- out : scalar Scalar representation of `a`. The input data type is preserved. Examples -------- >>> np.asscalar(np.array([24])) 24 """ raise NotImplementedError def atleast_1d(): """Convert inputs to arrays with at least one dimension. Scalar inputs are converted to 1-dimensional arrays, whilst higher-dimensional inputs are preserved. Parameters ---------- array1, array2, ... : array_like One or more input arrays. Returns ------- ret : ndarray An array, or sequence of arrays, each with ``a.ndim >= 1``. Copies are made only if necessary. See Also -------- atleast_2d, atleast_3d Examples -------- >>> np.atleast_1d(1.0) array([ 1.]) >>> x = np.arange(9.0).reshape(3,3) >>> np.atleast_1d(x) array([[ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.]]) >>> np.atleast_1d(x) is x True >>> np.atleast_1d(1, [3, 4]) [array([1]), array([3, 4])] """ raise NotImplementedError def atleast_2d(): """View inputs as arrays with at least two dimensions. Parameters ---------- array1, array2, ... : array_like One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have two or more dimensions are preserved. Returns ------- res, res2, ... : ndarray An array, or tuple of arrays, each with ``a.ndim >= 2``. Copies are avoided where possible, and views with two or more dimensions are returned. See Also -------- atleast_1d, atleast_3d Examples -------- >>> np.atleast_2d(3.0) array([[ 3.]]) >>> x = np.arange(3.0) >>> np.atleast_2d(x) array([[ 0., 1., 2.]]) >>> np.atleast_2d(x).base is x True >>> np.atleast_2d(1, [1, 2], [[1, 2]]) [array([[1]]), array([[1, 2]]), array([[1, 2]])] """ raise NotImplementedError def atleast_3d(): """View inputs as arrays with at least three dimensions. Parameters ---------- array1, array2, ... : array_like One or more array-like sequences. Non-array inputs are converted to arrays. Arrays that already have three or more dimensions are preserved. Returns ------- res1, res2, ... : ndarray An array, or tuple of arrays, each with ``a.ndim >= 3``. Copies are avoided where possible, and views with three or more dimensions are returned. For example, a 1-D array of shape ``(N,)`` becomes a view of shape ``(1, N, 1)``, and a 2-D array of shape ``(M, N)`` becomes a view of shape ``(M, N, 1)``. See Also -------- atleast_1d, atleast_2d Examples -------- >>> np.atleast_3d(3.0) array([[[ 3.]]]) >>> x = np.arange(3.0) >>> np.atleast_3d(x).shape (1, 3, 1) >>> x = np.arange(12.0).reshape(4,3) >>> np.atleast_3d(x).shape (4, 3, 1) >>> np.atleast_3d(x).base is x True >>> for arr in np.atleast_3d([1, 2], [[1, 2]], [[[1, 2]]]): ... print arr, arr.shape ... [[[1] [2]]] (1, 2, 1) [[[1] [2]]] (1, 2, 1) [[[1 2]]] (1, 1, 2) """ raise NotImplementedError def average(a, axis=None, weights=None, returned=False): """Compute the weighted average along the specified axis. Parameters ---------- a : array_like Array containing data to be averaged. If `a` is not an array, a conversion is attempted. axis : int, optional Axis along which to average `a`. If `None`, averaging is done over the flattened array. weights : array_like, optional An array of weights associated with the values in `a`. Each value in `a` contributes to the average according to its associated weight. The weights array can either be 1-D (in which case its length must be the size of `a` along the given axis) or of the same shape as `a`. If `weights=None`, then all data in `a` are assumed to have a weight equal to one. returned : bool, optional Default is `False`. If `True`, the tuple (`average`, `sum_of_weights`) is returned, otherwise only the average is returned. If `weights=None`, `sum_of_weights` is equivalent to the number of elements over which the average is taken. Returns ------- average, [sum_of_weights] : {array_type, double} Return the average along the specified axis. When returned is `True`, return a tuple with the average as the first element and the sum of the weights as the second element. The return type is `Float` if `a` is of integer type, otherwise it is of the same type as `a`. `sum_of_weights` is of the same type as `average`. Raises ------ ZeroDivisionError When all weights along axis are zero. See `numpy.ma.average` for a version robust to this type of error. TypeError When the length of 1D `weights` is not the same as the shape of `a` along axis. See Also -------- mean ma.average : average for masked arrays Examples -------- >>> data = range(1,5) >>> data [1, 2, 3, 4] >>> np.average(data) 2.5 >>> np.average(range(1,11), weights=range(10,0,-1)) 4.0 >>> data = np.arange(6).reshape((3,2)) >>> data array([[0, 1], [2, 3], [4, 5]]) >>> np.average(data, axis=1, weights=[1./4, 3./4]) array([ 0.75, 2.75, 4.75]) >>> np.average(data, weights=[1./4, 3./4]) Traceback (most recent call last): ... TypeError: Axis must be specified when shapes of a and weights differ. """ raise NotImplementedError def bartlett(M): """Return the Bartlett window. The Bartlett window is very similar to a triangular window, except that the end points are at zero. It is often used in signal processing for tapering a signal, without generating too much ripple in the frequency domain. Parameters ---------- M : int Number of points in the output window. If zero or less, an empty array is returned. Returns ------- out : array The triangular window, normalized to one (the value one appears only if the number of samples is odd), with the first and last samples equal to zero. See Also -------- blackman, hamming, hanning, kaiser Notes ----- The Bartlett window is defined as .. math:: w(n) = \frac{2}{M-1} \left( \frac{M-1}{2} - \left|n - \frac{M-1}{2}\right| \right) Most references to the Bartlett window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. Note that convolution with this window produces linear interpolation. It is also known as an apodization (which means"removing the foot", i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. The fourier transform of the Bartlett is the product of two sinc functions. Note the excellent discussion in Kanasewich. References ---------- .. [1] M.S. Bartlett, "Periodogram Analysis and Continuous Spectra", Biometrika 37, 1-16, 1950. .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The University of Alberta Press, 1975, pp. 109-110. .. [3] A.V. Oppenheim and R.W. Schafer, "Discrete-Time Signal Processing", Prentice-Hall, 1999, pp. 468-471. .. [4] Wikipedia, "Window function", http://en.wikipedia.org/wiki/Window_function .. [5] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, "Numerical Recipes", Cambridge University Press, 1986, page 429. Examples -------- >>> np.bartlett(12) array([ 0. , 0.18181818, 0.36363636, 0.54545455, 0.72727273, 0.90909091, 0.90909091, 0.72727273, 0.54545455, 0.36363636, 0.18181818, 0. ]) Plot the window and its frequency response (requires SciPy and matplotlib): >>> from numpy import clip, log10, array, bartlett, linspace >>> from numpy.fft import fft, fftshift >>> import matplotlib.pyplot as plt >>> window = bartlett(51) >>> plt.plot(window) [] >>> plt.title("Bartlett window") >>> plt.ylabel("Amplitude") >>> plt.xlabel("Sample") >>> plt.show() >>> plt.figure() >>> A = fft(window, 2048) / 25.5 >>> mag = abs(fftshift(A)) >>> freq = linspace(-0.5,0.5,len(A)) >>> response = 20*log10(mag) >>> response = clip(response,-100,100) >>> plt.plot(freq, response) [] >>> plt.title("Frequency response of Bartlett window") >>> plt.ylabel("Magnitude [dB]") >>> plt.xlabel("Normalized frequency [cycles per sample]") >>> plt.axis('tight') (-0.5, 0.5, -100.0, ...) >>> plt.show() """ raise NotImplementedError def base_repr(number, base=2, padding=0): """Return a string representation of a number in the given base system. Parameters ---------- number : int The value to convert. Only positive values are handled. base : int, optional Convert `number` to the `base` number system. The valid range is 2-36, the default value is 2. padding : int, optional Number of zeros padded on the left. Default is 0 (no padding). Returns ------- out : str String representation of `number` in `base` system. See Also -------- binary_repr : Faster version of `base_repr` for base 2. Examples -------- >>> np.base_repr(5) '101' >>> np.base_repr(6, 5) '11' >>> np.base_repr(7, base=5, padding=3) '00012' >>> np.base_repr(10, base=16) 'A' >>> np.base_repr(32, base=16) '20' """ raise NotImplementedError def binary_repr(num, width=None): """Return the binary representation of the input number as a string. For negative numbers, if width is not given, a minus sign is added to the front. If width is given, the two's complement of the number is returned, with respect to that width. In a two's-complement system negative numbers are represented by the two's complement of the absolute value. This is the most common method of representing signed integers on computers [1]_. A N-bit two's-complement system can represent every integer in the range :math:`-2^{N-1}` to :math:`+2^{N-1}-1`. Parameters ---------- num : int Only an integer decimal number can be used. width : int, optional The length of the returned string if `num` is positive, the length of the two's complement if `num` is negative. Returns ------- bin : str Binary representation of `num` or two's complement of `num`. See Also -------- base_repr: Return a string representation of a number in the given base system. Notes ----- `binary_repr` is equivalent to using `base_repr` with base 2, but about 25x faster. References ---------- .. [1] Wikipedia, "Two's complement", http://en.wikipedia.org/wiki/Two's_complement Examples -------- >>> np.binary_repr(3) '11' >>> np.binary_repr(-3) '-11' >>> np.binary_repr(3, width=4) '0011' The two's complement is returned when the input number is negative and width is specified: >>> np.binary_repr(-3, width=4) '1101' """ raise NotImplementedError def bincount(x, weights=None, minlength=None): """bincount(x, weights=None, minlength=None) Count number of occurrences of each value in array of non-negative ints. The number of bins (of size 1) is one larger than the largest value in `x`. If `minlength` is specified, there will be at least this number of bins in the output array (though it will be longer if necessary, depending on the contents of `x`). Each bin gives the number of occurrences of its index value in `x`. If `weights` is specified the input array is weighted by it, i.e. if a value ``n`` is found at position ``i``, ``out[n] += weight[i]`` instead of ``out[n] += 1``. Parameters ---------- x : array_like, 1 dimension, nonnegative ints Input array. weights : array_like, optional Weights, array of the same shape as `x`. minlength : int, optional .. versionadded:: 1.6.0 A minimum number of bins for the output array. Returns ------- out : ndarray of ints The result of binning the input array. The length of `out` is equal to ``np.amax(x)+1``. Raises ------ ValueError If the input is not 1-dimensional, or contains elements with negative values, or if `minlength` is non-positive. TypeError If the type of the input is float or complex. See Also -------- histogram, digitize, unique Examples -------- >>> np.bincount(np.arange(5)) array([1, 1, 1, 1, 1]) >>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7])) array([1, 3, 1, 1, 0, 0, 0, 1]) >>> x = np.array([0, 1, 1, 3, 2, 1, 7, 23]) >>> np.bincount(x).size == np.amax(x)+1 True The input array needs to be of integer dtype, otherwise a TypeError is raised: >>> np.bincount(np.arange(5, dtype=np.float)) Traceback (most recent call last): File "", line 1, in TypeError: array cannot be safely cast to required type A possible use of ``bincount`` is to perform sums over variable-size chunks of an array, using the ``weights`` keyword. >>> w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6]) # weights >>> x = np.array([0, 1, 1, 2, 2, 2]) >>> np.bincount(x, weights=w) array([ 0.3, 0.7, 1.1]) """ # BUILTIN raise NotImplementedError def blackman(M): """Return the Blackman window. The Blackman window is a taper formed by using the the first three terms of a summation of cosines. It was designed to have close to the minimal leakage possible. It is close to optimal, only slightly worse than a Kaiser window. Parameters ---------- M : int Number of points in the output window. If zero or less, an empty array is returned. Returns ------- out : ndarray The window, normalized to one (the value one appears only if the number of samples is odd). See Also -------- bartlett, hamming, hanning, kaiser Notes ----- The Blackman window is defined as .. math:: w(n) = 0.42 - 0.5 \cos(2\pi n/M) + 0.08 \cos(4\pi n/M) Most references to the Blackman window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means "removing the foot", i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. It is known as a "near optimal" tapering function, almost as good (by some measures) as the kaiser window. References ---------- Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York. Oppenheim, A.V., and R.W. Schafer. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice-Hall, 1999, pp. 468-471. Examples -------- >>> from numpy import blackman >>> blackman(12) array([ -1.38777878e-17, 3.26064346e-02, 1.59903635e-01, 4.14397981e-01, 7.36045180e-01, 9.67046769e-01, 9.67046769e-01, 7.36045180e-01, 4.14397981e-01, 1.59903635e-01, 3.26064346e-02, -1.38777878e-17]) Plot the window and the frequency response: >>> from numpy import clip, log10, array, blackman, linspace >>> from numpy.fft import fft, fftshift >>> import matplotlib.pyplot as plt >>> window = blackman(51) >>> plt.plot(window) [] >>> plt.title("Blackman window") >>> plt.ylabel("Amplitude") >>> plt.xlabel("Sample") >>> plt.show() >>> plt.figure() >>> A = fft(window, 2048) / 25.5 >>> mag = abs(fftshift(A)) >>> freq = linspace(-0.5,0.5,len(A)) >>> response = 20*log10(mag) >>> response = clip(response,-100,100) >>> plt.plot(freq, response) [] >>> plt.title("Frequency response of Blackman window") >>> plt.ylabel("Magnitude [dB]") >>> plt.xlabel("Normalized frequency [cycles per sample]") >>> plt.axis('tight') (-0.5, 0.5, -100.0, ...) >>> plt.show() """ raise NotImplementedError def bmat(obj, ldict=None, gdict=None): """Build a matrix object from a string, nested sequence, or array. Parameters ---------- obj : str or array_like Input data. Names of variables in the current scope may be referenced, even if `obj` is a string. Returns ------- out : matrix Returns a matrix object, which is a specialized 2-D array. See Also -------- matrix Examples -------- >>> A = np.mat('1 1; 1 1') >>> B = np.mat('2 2; 2 2') >>> C = np.mat('3 4; 5 6') >>> D = np.mat('7 8; 9 0') All the following expressions construct the same block matrix: >>> np.bmat([[A, B], [C, D]]) matrix([[1, 1, 2, 2], [1, 1, 2, 2], [3, 4, 7, 8], [5, 6, 9, 0]]) >>> np.bmat(np.r_[np.c_[A, B], np.c_[C, D]]) matrix([[1, 1, 2, 2], [1, 1, 2, 2], [3, 4, 7, 8], [5, 6, 9, 0]]) >>> np.bmat('A,B; C,D') matrix([[1, 1, 2, 2], [1, 1, 2, 2], [3, 4, 7, 8], [5, 6, 9, 0]]) """ raise NotImplementedError def broadcast_arrays(): """Broadcast any number of arrays against each other. Parameters ---------- `*args` : array_likes The arrays to broadcast. Returns ------- broadcasted : list of arrays These arrays are views on the original arrays. They are typically not contiguous. Furthermore, more than one element of a broadcasted array may refer to a single memory location. If you need to write to the arrays, make copies first. Examples -------- >>> x = np.array([[1,2,3]]) >>> y = np.array([[1],[2],[3]]) >>> np.broadcast_arrays(x, y) [array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]), array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])] Here is a useful idiom for getting contiguous copies instead of non-contiguous views. >>> map(np.array, np.broadcast_arrays(x, y)) [array([[1, 2, 3], [1, 2, 3], [1, 2, 3]]), array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])] """ raise NotImplementedError def byte_bounds(a): """Returns pointers to the end-points of an array. Parameters ---------- a : ndarray Input array. It must conform to the Python-side of the array interface. Returns ------- (low, high) : tuple of 2 integers The first integer is the first byte of the array, the second integer is just past the last byte of the array. If `a` is not contiguous it will not use every byte between the (`low`, `high`) values. Examples -------- >>> I = np.eye(2, dtype='f'); I.dtype dtype('float32') >>> low, high = np.byte_bounds(I) >>> high - low == I.size*I.itemsize True >>> I = np.eye(2, dtype='G'); I.dtype dtype('complex192') >>> low, high = np.byte_bounds(I) >>> high - low == I.size*I.itemsize True """ raise NotImplementedError def can_cast(): """can_cast(from, totype, casting = 'safe') Returns True if cast between data types can occur according to the casting rule. If from is a scalar or array scalar, also returns True if the scalar value can be cast without overflow or truncation to an integer. Parameters ---------- from : dtype, dtype specifier, scalar, or array Data type, scalar, or array to cast from. totype : dtype or dtype specifier Data type to cast to. casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'}, optional Controls what kind of data casting may occur. * 'no' means the data types should not be cast at all. * 'equiv' means only byte-order changes are allowed. * 'safe' means only casts which can preserve values are allowed. * 'same_kind' means only safe casts or casts within a kind, like float64 to float32, are allowed. * 'unsafe' means any data conversions may be done. Returns ------- out : bool True if cast can occur according to the casting rule. See also -------- dtype, result_type Examples -------- Basic examples >>> np.can_cast(np.int32, np.int64) True >>> np.can_cast(np.float64, np.complex) True >>> np.can_cast(np.complex, np.float) False >>> np.can_cast('i8', 'f8') True >>> np.can_cast('i8', 'f4') False >>> np.can_cast('i4', 'S4') True Casting scalars >>> np.can_cast(100, 'i1') True >>> np.can_cast(150, 'i1') False >>> np.can_cast(150, 'u1') True >>> np.can_cast(3.5e100, np.float32) False >>> np.can_cast(1000.0, np.float32) True Array scalar checks the value, array does not >>> np.can_cast(np.array(1000.0), np.float32) True >>> np.can_cast(np.array([1000.0]), np.float32) False Using the casting rules >>> np.can_cast('i8', 'i8', 'no') True >>> np.can_cast('i8', 'no') False >>> np.can_cast('i8', 'equiv') True >>> np.can_cast('i8', 'equiv') False >>> np.can_cast('i8', 'safe') True >>> np.can_cast('i4', 'safe') False >>> np.can_cast('i4', 'same_kind') True >>> np.can_cast('u4', 'same_kind') False >>> np.can_cast('u4', 'unsafe') True """ # BUILTIN raise NotImplementedError def choose(a, choices, out=None, mode='raise'): """Construct an array from an index array and a set of arrays to choose from. First of all, if confused or uncertain, definitely look at the Examples - in its full generality, this function is less simple than it might seem from the following code description (below ndi = `numpy.lib.index_tricks`): ``np.choose(a,c) == np.array([c[a[I]][I] for I in ndi.ndindex(a.shape)])``. But this omits some subtleties. Here is a fully general summary: Given an "index" array (`a`) of integers and a sequence of `n` arrays (`choices`), `a` and each choice array are first broadcast, as necessary, to arrays of a common shape; calling these *Ba* and *Bchoices[i], i = 0,...,n-1* we have that, necessarily, ``Ba.shape == Bchoices[i].shape`` for each `i`. Then, a new array with shape ``Ba.shape`` is created as follows: * if ``mode=raise`` (the default), then, first of all, each element of `a` (and thus `Ba`) must be in the range `[0, n-1]`; now, suppose that `i` (in that range) is the value at the `(j0, j1, ..., jm)` position in `Ba` - then the value at the same position in the new array is the value in `Bchoices[i]` at that same position; * if ``mode=wrap``, values in `a` (and thus `Ba`) may be any (signed) integer; modular arithmetic is used to map integers outside the range `[0, n-1]` back into that range; and then the new array is constructed as above; * if ``mode=clip``, values in `a` (and thus `Ba`) may be any (signed) integer; negative integers are mapped to 0; values greater than `n-1` are mapped to `n-1`; and then the new array is constructed as above. Parameters ---------- a : int array This array must contain integers in `[0, n-1]`, where `n` is the number of choices, unless ``mode=wrap`` or ``mode=clip``, in which cases any integers are permissible. choices : sequence of arrays Choice arrays. `a` and all of the choices must be broadcastable to the same shape. If `choices` is itself an array (not recommended), then its outermost dimension (i.e., the one corresponding to ``choices.shape[0]``) is taken as defining the "sequence". out : array, optional If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype. mode : {'raise' (default), 'wrap', 'clip'}, optional Specifies how indices outside `[0, n-1]` will be treated: * 'raise' : an exception is raised * 'wrap' : value becomes value mod `n` * 'clip' : values < 0 are mapped to 0, values > n-1 are mapped to n-1 Returns ------- merged_array : array The merged result. Raises ------ ValueError: shape mismatch If `a` and each choice array are not all broadcastable to the same shape. See Also -------- ndarray.choose : equivalent method Notes ----- To reduce the chance of misinterpretation, even though the following "abuse" is nominally supported, `choices` should neither be, nor be thought of as, a single array, i.e., the outermost sequence-like container should be either a list or a tuple. Examples -------- >>> choices = [[0, 1, 2, 3], [10, 11, 12, 13], ... [20, 21, 22, 23], [30, 31, 32, 33]] >>> np.choose([2, 3, 1, 0], choices ... # the first element of the result will be the first element of the ... # third (2+1) "array" in choices, namely, 20; the second element ... # will be the second element of the fourth (3+1) choice array, i.e., ... # 31, etc. ... ) array([20, 31, 12, 3]) >>> np.choose([2, 4, 1, 0], choices, mode='clip') # 4 goes to 3 (4-1) array([20, 31, 12, 3]) >>> # because there are 4 choice arrays >>> np.choose([2, 4, 1, 0], choices, mode='wrap') # 4 goes to (4 mod 4) array([20, 1, 12, 3]) >>> # i.e., 0 A couple examples illustrating how choose broadcasts: >>> a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]] >>> choices = [-10, 10] >>> np.choose(a, choices) array([[ 10, -10, 10], [-10, 10, -10], [ 10, -10, 10]]) >>> # With thanks to Anne Archibald >>> a = np.array([0, 1]).reshape((2,1,1)) >>> c1 = np.array([1, 2, 3]).reshape((1,3,1)) >>> c2 = np.array([-1, -2, -3, -4, -5]).reshape((1,1,5)) >>> np.choose(a, (c1, c2)) # result is 2x3x5, res[0,:,:]=c1, res[1,:,:]=c2 array([[[ 1, 1, 1, 1, 1], [ 2, 2, 2, 2, 2], [ 3, 3, 3, 3, 3]], [[-1, -2, -3, -4, -5], [-1, -2, -3, -4, -5], [-1, -2, -3, -4, -5]]]) """ raise NotImplementedError def column_stack(tup): """Stack 1-D arrays as columns into a 2-D array. Take a sequence of 1-D arrays and stack them as columns to make a single 2-D array. 2-D arrays are stacked as-is, just like with `hstack`. 1-D arrays are turned into 2-D columns first. Parameters ---------- tup : sequence of 1-D or 2-D arrays. Arrays to stack. All of them must have the same first dimension. Returns ------- stacked : 2-D array The array formed by stacking the given arrays. See Also -------- hstack, vstack, concatenate Notes ----- This function is equivalent to ``np.vstack(tup).T``. Examples -------- >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.column_stack((a,b)) array([[1, 2], [2, 3], [3, 4]]) """ raise NotImplementedError def common_type(): """Return a scalar type which is common to the input arrays. The return type will always be an inexact (i.e. floating point) scalar type, even if all the arrays are integer arrays. If one of the inputs is an integer array, the minimum precision type that is returned is a 64-bit floating point dtype. All input arrays can be safely cast to the returned dtype without loss of information. Parameters ---------- array1, array2, ... : ndarrays Input arrays. Returns ------- out : data type code Data type code. See Also -------- dtype, mintypecode Examples -------- >>> np.common_type(np.arange(2, dtype=np.float32)) >>> np.common_type(np.arange(2, dtype=np.float32), np.arange(2)) >>> np.common_type(np.arange(4), np.array([45, 6.j]), np.array([45.0])) """ raise NotImplementedError def compare_chararrays(): """ """ # BUILTIN raise NotImplementedError def compress(condition, a, axis=None, out=None): """Return selected slices of an array along given axis. When working along a given axis, a slice along that axis is returned in `output` for each index where `condition` evaluates to True. When working on a 1-D array, `compress` is equivalent to `extract`. Parameters ---------- condition : 1-D array of bools Array that selects which entries to return. If len(condition) is less than the size of `a` along the given axis, then output is truncated to the length of the condition array. a : array_like Array from which to extract a part. axis : int, optional Axis along which to take slices. If None (default), work on the flattened array. out : ndarray, optional Output array. Its type is preserved and it must be of the right shape to hold the output. Returns ------- compressed_array : ndarray A copy of `a` without the slices along axis for which `condition` is false. See Also -------- take, choose, diag, diagonal, select ndarray.compress : Equivalent method. numpy.doc.ufuncs : Section "Output arguments" Examples -------- >>> a = np.array([[1, 2], [3, 4], [5, 6]]) >>> a array([[1, 2], [3, 4], [5, 6]]) >>> np.compress([0, 1], a, axis=0) array([[3, 4]]) >>> np.compress([False, True, True], a, axis=0) array([[3, 4], [5, 6]]) >>> np.compress([False, True], a, axis=1) array([[2], [4], [6]]) Working on the flattened array does not return slices along an axis but selects elements. >>> np.compress([False, True], a) array([2]) """ raise NotImplementedError def concatenate(): """concatenate((a1, a2, ...), axis=0) Join a sequence of arrays together. Parameters ---------- a1, a2, ... : sequence of array_like The arrays must have the same shape, except in the dimension corresponding to `axis` (the first, by default). axis : int, optional The axis along which the arrays will be joined. Default is 0. Returns ------- res : ndarray The concatenated array. See Also -------- ma.concatenate : Concatenate function that preserves input masks. array_split : Split an array into multiple sub-arrays of equal or near-equal size. split : Split array into a list of multiple sub-arrays of equal size. hsplit : Split array into multiple sub-arrays horizontally (column wise) vsplit : Split array into multiple sub-arrays vertically (row wise) dsplit : Split array into multiple sub-arrays along the 3rd axis (depth). hstack : Stack arrays in sequence horizontally (column wise) vstack : Stack arrays in sequence vertically (row wise) dstack : Stack arrays in sequence depth wise (along third dimension) Notes ----- When one or more of the arrays to be concatenated is a MaskedArray, this function will return a MaskedArray object instead of an ndarray, but the input masks are *not* preserved. In cases where a MaskedArray is expected as input, use the ma.concatenate function from the masked array module instead. Examples -------- >>> a = np.array([[1, 2], [3, 4]]) >>> b = np.array([[5, 6]]) >>> np.concatenate((a, b), axis=0) array([[1, 2], [3, 4], [5, 6]]) >>> np.concatenate((a, b.T), axis=1) array([[1, 2, 5], [3, 4, 6]]) This function will not preserve masking of MaskedArray inputs. >>> a = np.ma.arange(3) >>> a[1] = np.ma.masked >>> b = np.arange(2, 5) >>> a masked_array(data = [0 -- 2], mask = [False True False], fill_value = 999999) >>> b array([2, 3, 4]) >>> np.concatenate([a, b]) masked_array(data = [0 1 2 2 3 4], mask = False, fill_value = 999999) >>> np.ma.concatenate([a, b]) masked_array(data = [0 -- 2 2 3 4], mask = [False True False False False False], fill_value = 999999) """ # BUILTIN raise NotImplementedError def convolve(a, v, mode='full'): """Returns the discrete, linear convolution of two one-dimensional sequences. The convolution operator is often seen in signal processing, where it models the effect of a linear time-invariant system on a signal [1]_. In probability theory, the sum of two independent random variables is distributed according to the convolution of their individual distributions. Parameters ---------- a : (N,) array_like First one-dimensional input array. v : (M,) array_like Second one-dimensional input array. mode : {'full', 'valid', 'same'}, optional 'full': By default, mode is 'full'. This returns the convolution at each point of overlap, with an output shape of (N+M-1,). At the end-points of the convolution, the signals do not overlap completely, and boundary effects may be seen. 'same': Mode `same` returns output of length ``max(M, N)``. Boundary effects are still visible. 'valid': Mode `valid` returns output of length ``max(M, N) - min(M, N) + 1``. The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect. Returns ------- out : ndarray Discrete, linear convolution of `a` and `v`. See Also -------- scipy.signal.fftconvolve : Convolve two arrays using the Fast Fourier Transform. scipy.linalg.toeplitz : Used to construct the convolution operator. Notes ----- The discrete convolution operation is defined as .. math:: (f * g)[n] = \sum_{m = -\infty}^{\infty} f[m] g[n - m] It can be shown that a convolution :math:`x(t) * y(t)` in time/space is equivalent to the multiplication :math:`X(f) Y(f)` in the Fourier domain, after appropriate padding (padding is necessary to prevent circular convolution). Since multiplication is more efficient (faster) than convolution, the function `scipy.signal.fftconvolve` exploits the FFT to calculate the convolution of large data-sets. References ---------- .. [1] Wikipedia, "Convolution", http://en.wikipedia.org/wiki/Convolution. Examples -------- Note how the convolution operator flips the second array before "sliding" the two across one another: >>> np.convolve([1, 2, 3], [0, 1, 0.5]) array([ 0. , 1. , 2.5, 4. , 1.5]) Only return the middle values of the convolution. Contains boundary effects, where zeros are taken into account: >>> np.convolve([1,2,3],[0,1,0.5], 'same') array([ 1. , 2.5, 4. ]) The two arrays are of the same length, so there is only one position where they completely overlap: >>> np.convolve([1,2,3],[0,1,0.5], 'valid') array([ 2.5]) """ raise NotImplementedError def copy(a): """Return an array copy of the given object. Parameters ---------- a : array_like Input data. Returns ------- arr : ndarray Array interpretation of `a`. Notes ----- This is equivalent to >>> np.array(a, copy=True) #doctest: +SKIP Examples -------- Create an array x, with a reference y and a copy z: >>> x = np.array([1, 2, 3]) >>> y = x >>> z = np.copy(x) Note that, when we modify x, y changes, but not z: >>> x[0] = 10 >>> x[0] == y[0] True >>> x[0] == z[0] False """ raise NotImplementedError def corrcoef(x, y=None, rowvar=1, bias=0, ddof=None): """Return correlation coefficients. Please refer to the documentation for `cov` for more detail. The relationship between the correlation coefficient matrix, `P`, and the covariance matrix, `C`, is .. math:: P_{ij} = \frac{ C_{ij} } { \sqrt{ C_{ii} * C_{jj} } } The values of `P` are between -1 and 1, inclusive. Parameters ---------- x : array_like A 1-D or 2-D array containing multiple variables and observations. Each row of `m` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below. y : array_like, optional An additional set of variables and observations. `y` has the same shape as `m`. rowvar : int, optional If `rowvar` is non-zero (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations. bias : int, optional Default normalization is by ``(N - 1)``, where ``N`` is the number of observations (unbiased estimate). If `bias` is 1, then normalization is by ``N``. These values can be overridden by using the keyword ``ddof`` in numpy versions >= 1.5. ddof : {None, int}, optional .. versionadded:: 1.5 If not ``None`` normalization is by ``(N - ddof)``, where ``N`` is the number of observations; this overrides the value implied by ``bias``. The default value is ``None``. Returns ------- out : ndarray The correlation coefficient matrix of the variables. See Also -------- cov : Covariance matrix """ raise NotImplementedError def correlate(a, v, mode='valid', old_behavior=False): """Cross-correlation of two 1-dimensional sequences. This function computes the correlation as generally defined in signal processing texts:: z[k] = sum_n a[n] * conj(v[n+k]) with a and v sequences being zero-padded where necessary and conj being the conjugate. Parameters ---------- a, v : array_like Input sequences. mode : {'valid', 'same', 'full'}, optional Refer to the `convolve` docstring. Note that the default is `valid`, unlike `convolve`, which uses `full`. old_behavior : bool If True, uses the old behavior from Numeric, (correlate(a,v) == correlate(v, a), and the conjugate is not taken for complex arrays). If False, uses the conventional signal processing definition (see note). See Also -------- convolve : Discrete, linear convolution of two one-dimensional sequences. Examples -------- >>> np.correlate([1, 2, 3], [0, 1, 0.5]) array([ 3.5]) >>> np.correlate([1, 2, 3], [0, 1, 0.5], "same") array([ 2. , 3.5, 3. ]) >>> np.correlate([1, 2, 3], [0, 1, 0.5], "full") array([ 0.5, 2. , 3.5, 3. , 0. ]) """ raise NotImplementedError def count_nonzero(a): """count_nonzero(a) Counts the number of non-zero values in the array ``a``. Parameters ---------- a : array_like The array for which to count non-zeros. Returns ------- count : int Number of non-zero values in the array. See Also -------- nonzero : Return the coordinates of all the non-zero values. Examples -------- >>> np.count_nonzero(np.eye(4)) 4 >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]]) 5 """ # BUILTIN raise NotImplementedError def cov(m, y=None, rowvar=1, bias=0, ddof=None): """Estimate a covariance matrix, given data. Covariance indicates the level to which two variables vary together. If we examine N-dimensional samples, :math:`X = [x_1, x_2, ... x_N]^T`, then the covariance matrix element :math:`C_{ij}` is the covariance of :math:`x_i` and :math:`x_j`. The element :math:`C_{ii}` is the variance of :math:`x_i`. Parameters ---------- m : array_like A 1-D or 2-D array containing multiple variables and observations. Each row of `m` represents a variable, and each column a single observation of all those variables. Also see `rowvar` below. y : array_like, optional An additional set of variables and observations. `y` has the same form as that of `m`. rowvar : int, optional If `rowvar` is non-zero (default), then each row represents a variable, with observations in the columns. Otherwise, the relationship is transposed: each column represents a variable, while the rows contain observations. bias : int, optional Default normalization is by ``(N - 1)``, where ``N`` is the number of observations given (unbiased estimate). If `bias` is 1, then normalization is by ``N``. These values can be overridden by using the keyword ``ddof`` in numpy versions >= 1.5. ddof : int, optional .. versionadded:: 1.5 If not ``None`` normalization is by ``(N - ddof)``, where ``N`` is the number of observations; this overrides the value implied by ``bias``. The default value is ``None``. Returns ------- out : ndarray The covariance matrix of the variables. See Also -------- corrcoef : Normalized covariance matrix Examples -------- Consider two variables, :math:`x_0` and :math:`x_1`, which correlate perfectly, but in opposite directions: >>> x = np.array([[0, 2], [1, 1], [2, 0]]).T >>> x array([[0, 1, 2], [2, 1, 0]]) Note how :math:`x_0` increases while :math:`x_1` decreases. The covariance matrix shows this clearly: >>> np.cov(x) array([[ 1., -1.], [-1., 1.]]) Note that element :math:`C_{0,1}`, which shows the correlation between :math:`x_0` and :math:`x_1`, is negative. Further, note how `x` and `y` are combined: >>> x = [-2.1, -1, 4.3] >>> y = [3, 1.1, 0.12] >>> X = np.vstack((x,y)) >>> print np.cov(X) [[ 11.71 -4.286 ] [ -4.286 2.14413333]] >>> print np.cov(x, y) [[ 11.71 -4.286 ] [ -4.286 2.14413333]] >>> print np.cov(x) 11.71 """ raise NotImplementedError def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None): """Return the cross product of two (arrays of) vectors. The cross product of `a` and `b` in :math:`R^3` is a vector perpendicular to both `a` and `b`. If `a` and `b` are arrays of vectors, the vectors are defined by the last axis of `a` and `b` by default, and these axes can have dimensions 2 or 3. Where the dimension of either `a` or `b` is 2, the third component of the input vector is assumed to be zero and the cross product calculated accordingly. In cases where both input vectors have dimension 2, the z-component of the cross product is returned. Parameters ---------- a : array_like Components of the first vector(s). b : array_like Components of the second vector(s). axisa : int, optional Axis of `a` that defines the vector(s). By default, the last axis. axisb : int, optional Axis of `b` that defines the vector(s). By default, the last axis. axisc : int, optional Axis of `c` containing the cross product vector(s). By default, the last axis. axis : int, optional If defined, the axis of `a`, `b` and `c` that defines the vector(s) and cross product(s). Overrides `axisa`, `axisb` and `axisc`. Returns ------- c : ndarray Vector cross product(s). Raises ------ ValueError When the dimension of the vector(s) in `a` and/or `b` does not equal 2 or 3. See Also -------- inner : Inner product outer : Outer product. ix_ : Construct index arrays. Examples -------- Vector cross-product. >>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> np.cross(x, y) array([-3, 6, -3]) One vector with dimension 2. >>> x = [1, 2] >>> y = [4, 5, 6] >>> np.cross(x, y) array([12, -6, -3]) Equivalently: >>> x = [1, 2, 0] >>> y = [4, 5, 6] >>> np.cross(x, y) array([12, -6, -3]) Both vectors with dimension 2. >>> x = [1,2] >>> y = [4,5] >>> np.cross(x, y) -3 Multiple vector cross-products. Note that the direction of the cross product vector is defined by the `right-hand rule`. >>> x = np.array([[1,2,3], [4,5,6]]) >>> y = np.array([[4,5,6], [1,2,3]]) >>> np.cross(x, y) array([[-3, 6, -3], [ 3, -6, 3]]) The orientation of `c` can be changed using the `axisc` keyword. >>> np.cross(x, y, axisc=0) array([[-3, 3], [ 6, -6], [-3, 3]]) Change the vector definition of `x` and `y` using `axisa` and `axisb`. >>> x = np.array([[1,2,3], [4,5,6], [7, 8, 9]]) >>> y = np.array([[7, 8, 9], [4,5,6], [1,2,3]]) >>> np.cross(x, y) array([[ -6, 12, -6], [ 0, 0, 0], [ 6, -12, 6]]) >>> np.cross(x, y, axisa=0, axisb=0) array([[-24, 48, -24], [-30, 60, -30], [-36, 72, -36]]) """ raise NotImplementedError def cumprod(a, axis=None, dtype=None, out=None): """Return the cumulative product of elements along a given axis. Parameters ---------- a : array_like Input array. axis : int, optional Axis along which the cumulative product is computed. By default the input is flattened. dtype : dtype, optional Type of the returned array, as well as of the accumulator in which the elements are multiplied. If *dtype* is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used instead. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type of the resulting values will be cast if necessary. Returns ------- cumprod : ndarray A new array holding the result is returned unless `out` is specified, in which case a reference to out is returned. See Also -------- numpy.doc.ufuncs : Section "Output arguments" Notes ----- Arithmetic is modular when using integer types, and no error is raised on overflow. Examples -------- >>> a = np.array([1,2,3]) >>> np.cumprod(a) # intermediate results 1, 1*2 ... # total product 1*2*3 = 6 array([1, 2, 6]) >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> np.cumprod(a, dtype=float) # specify type of output array([ 1., 2., 6., 24., 120., 720.]) The cumulative product for each column (i.e., over the rows) of `a`: >>> np.cumprod(a, axis=0) array([[ 1, 2, 3], [ 4, 10, 18]]) The cumulative product for each row (i.e. over the columns) of `a`: >>> np.cumprod(a,axis=1) array([[ 1, 2, 6], [ 4, 20, 120]]) """ raise NotImplementedError def cumproduct(a, axis=None, dtype=None, out=None): """Return the cumulative product over the given axis. See Also -------- cumprod : equivalent function; see for details. """ raise NotImplementedError def cumsum(a, axis=None, dtype=None, out=None): """Return the cumulative sum of the elements along a given axis. Parameters ---------- a : array_like Input array. axis : int, optional Axis along which the cumulative sum is computed. The default (None) is to compute the cumsum over the flattened array. dtype : dtype, optional Type of the returned array and of the accumulator in which the elements are summed. If `dtype` is not specified, it defaults to the dtype of `a`, unless `a` has an integer dtype with a precision less than that of the default platform integer. In that case, the default platform integer is used. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output but the type will be cast if necessary. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- cumsum_along_axis : ndarray. A new array holding the result is returned unless `out` is specified, in which case a reference to `out` is returned. The result has the same size as `a`, and the same shape as `a` if `axis` is not None or `a` is a 1-d array. See Also -------- sum : Sum array elements. trapz : Integration of array values using the composite trapezoidal rule. Notes ----- Arithmetic is modular when using integer types, and no error is raised on overflow. Examples -------- >>> a = np.array([[1,2,3], [4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> np.cumsum(a) array([ 1, 3, 6, 10, 15, 21]) >>> np.cumsum(a, dtype=float) # specifies type of output value(s) array([ 1., 3., 6., 10., 15., 21.]) >>> np.cumsum(a,axis=0) # sum over rows for each of the 3 columns array([[1, 2, 3], [5, 7, 9]]) >>> np.cumsum(a,axis=1) # sum over columns for each of the 2 rows array([[ 1, 3, 6], [ 4, 9, 15]]) """ raise NotImplementedError def datetime_data(dtype): """Return (unit, numerator, denominator, events) from a datetime dtype """ raise NotImplementedError def delete(arr, obj, axis=None): """Return a new array with sub-arrays along an axis deleted. Parameters ---------- arr : array_like Input array. obj : slice, int or array of ints Indicate which sub-arrays to remove. axis : int, optional The axis along which to delete the subarray defined by `obj`. If `axis` is None, `obj` is applied to the flattened array. Returns ------- out : ndarray A copy of `arr` with the elements specified by `obj` removed. Note that `delete` does not occur in-place. If `axis` is None, `out` is a flattened array. See Also -------- insert : Insert elements into an array. append : Append elements at the end of an array. Examples -------- >>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) >>> arr array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) >>> np.delete(arr, 1, 0) array([[ 1, 2, 3, 4], [ 9, 10, 11, 12]]) >>> np.delete(arr, np.s_[::2], 1) array([[ 2, 4], [ 6, 8], [10, 12]]) >>> np.delete(arr, [1,3,5], None) array([ 1, 3, 5, 7, 8, 9, 10, 11, 12]) """ raise NotImplementedError def deprecate(): """Issues a DeprecationWarning, adds warning to `old_name`'s docstring, rebinds ``old_name.__name__`` and returns the new function object. This function may also be used as a decorator. Parameters ---------- func : function The function to be deprecated. old_name : str, optional The name of the function to be deprecated. Default is None, in which case the name of `func` is used. new_name : str, optional The new name for the function. Default is None, in which case the deprecation message is that `old_name` is deprecated. If given, the deprecation message is that `old_name` is deprecated and `new_name` should be used instead. message : str, optional Additional explanation of the deprecation. Displayed in the docstring after the warning. Returns ------- old_func : function The deprecated function. Examples -------- Note that ``olduint`` returns a value after printing Deprecation Warning: >>> olduint = np.deprecate(np.uint) >>> olduint(6) /usr/lib/python2.5/site-packages/numpy/lib/utils.py:114: DeprecationWarning: uint32 is deprecated warnings.warn(str1, DeprecationWarning) 6 """ raise NotImplementedError def deprecate_with_doc(msg): """message """ raise NotImplementedError def diag_indices(n, ndim=2): """Return the indices to access the main diagonal of an array. This returns a tuple of indices that can be used to access the main diagonal of an array `a` with ``a.ndim >= 2`` dimensions and shape (n, n, ..., n). For ``a.ndim = 2`` this is the usual diagonal, for ``a.ndim > 2`` this is the set of indices to access ``a[i, i, ..., i]`` for ``i = [0..n-1]``. Parameters ---------- n : int The size, along each dimension, of the arrays for which the returned indices can be used. ndim : int, optional The number of dimensions. See also -------- diag_indices_from Notes ----- .. versionadded:: 1.4.0 Examples -------- Create a set of indices to access the diagonal of a (4, 4) array: >>> di = np.diag_indices(4) >>> di (array([0, 1, 2, 3]), array([0, 1, 2, 3])) >>> a = np.arange(16).reshape(4, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> a[di] = 100 >>> a array([[100, 1, 2, 3], [ 4, 100, 6, 7], [ 8, 9, 100, 11], [ 12, 13, 14, 100]]) Now, we create indices to manipulate a 3-D array: >>> d3 = np.diag_indices(2, 3) >>> d3 (array([0, 1]), array([0, 1]), array([0, 1])) And use it to set the diagonal of an array of zeros to 1: >>> a = np.zeros((2, 2, 2), dtype=np.int) >>> a[d3] = 1 >>> a array([[[1, 0], [0, 0]], [[0, 0], [0, 1]]]) """ raise NotImplementedError def diag_indices_from(arr): """Return the indices to access the main diagonal of an n-dimensional array. See `diag_indices` for full details. Parameters ---------- arr : array, at least 2-D See Also -------- diag_indices Notes ----- .. versionadded:: 1.4.0 """ raise NotImplementedError def diagflat(v, k=0): """Create a two-dimensional array with the flattened input as a diagonal. Parameters ---------- v : array_like Input data, which is flattened and set as the `k`-th diagonal of the output. k : int, optional Diagonal to set; 0, the default, corresponds to the "main" diagonal, a positive (negative) `k` giving the number of the diagonal above (below) the main. Returns ------- out : ndarray The 2-D output array. See Also -------- diag : MATLAB work-alike for 1-D and 2-D arrays. diagonal : Return specified diagonals. trace : Sum along diagonals. Examples -------- >>> np.diagflat([[1,2], [3,4]]) array([[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]]) >>> np.diagflat([1,2], 1) array([[0, 1, 0], [0, 0, 2], [0, 0, 0]]) """ raise NotImplementedError def diff(a, n=1, axis=-1): """Calculate the n-th order discrete difference along given axis. The first order difference is given by ``out[n] = a[n+1] - a[n]`` along the given axis, higher order differences are calculated by using `diff` recursively. Parameters ---------- a : array_like Input array n : int, optional The number of times values are differenced. axis : int, optional The axis along which the difference is taken, default is the last axis. Returns ------- out : ndarray The `n` order differences. The shape of the output is the same as `a` except along `axis` where the dimension is smaller by `n`. See Also -------- gradient, ediff1d Examples -------- >>> x = np.array([1, 2, 4, 7, 0]) >>> np.diff(x) array([ 1, 2, 3, -7]) >>> np.diff(x, n=2) array([ 1, 1, -10]) >>> x = np.array([[1, 3, 6, 10], [0, 5, 6, 8]]) >>> np.diff(x) array([[2, 3, 4], [5, 1, 2]]) >>> np.diff(x, axis=0) array([[-1, 2, 0, -2]]) """ raise NotImplementedError def digitize(x, bins): """digitize(x, bins) Return the indices of the bins to which each value in input array belongs. Each index ``i`` returned is such that ``bins[i-1] <= x < bins[i]`` if `bins` is monotonically increasing, or ``bins[i-1] > x >= bins[i]`` if `bins` is monotonically decreasing. If values in `x` are beyond the bounds of `bins`, 0 or ``len(bins)`` is returned as appropriate. Parameters ---------- x : array_like Input array to be binned. It has to be 1-dimensional. bins : array_like Array of bins. It has to be 1-dimensional and monotonic. Returns ------- out : ndarray of ints Output array of indices, of same shape as `x`. Raises ------ ValueError If the input is not 1-dimensional, or if `bins` is not monotonic. TypeError If the type of the input is complex. See Also -------- bincount, histogram, unique Notes ----- If values in `x` are such that they fall outside the bin range, attempting to index `bins` with the indices that `digitize` returns will result in an IndexError. Examples -------- >>> x = np.array([0.2, 6.4, 3.0, 1.6]) >>> bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0]) >>> inds = np.digitize(x, bins) >>> inds array([1, 4, 3, 2]) >>> for n in range(x.size): ... print bins[inds[n]-1], "<=", x[n], "<", bins[inds[n]] ... 0.0 <= 0.2 < 1.0 4.0 <= 6.4 < 10.0 2.5 <= 3.0 < 4.0 1.0 <= 1.6 < 2.5 """ # BUILTIN raise NotImplementedError def disp(mesg, device=None, linefeed=True): """Display a message on a device. Parameters ---------- mesg : str Message to display. device : object Device to write message. If None, defaults to ``sys.stdout`` which is very similar to ``print``. `device` needs to have ``write()`` and ``flush()`` methods. linefeed : bool, optional Option whether to print a line feed or not. Defaults to True. Raises ------ AttributeError If `device` does not have a ``write()`` or ``flush()`` method. Examples -------- Besides ``sys.stdout``, a file-like object can also be used as it has both required methods: >>> from StringIO import StringIO >>> buf = StringIO() >>> np.disp('"Display" in a file', device=buf) >>> buf.getvalue() '"Display" in a file\n' """ raise NotImplementedError def dsplit(ary, indices_or_sections): """Split array into multiple sub-arrays along the 3rd axis (depth). Please refer to the `split` documentation. `dsplit` is equivalent to `split` with ``axis=2``, the array is always split along the third axis provided the array dimension is greater than or equal to 3. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(2, 2, 4) >>> x array([[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.]], [[ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]]) >>> np.dsplit(x, 2) [array([[[ 0., 1.], [ 4., 5.]], [[ 8., 9.], [ 12., 13.]]]), array([[[ 2., 3.], [ 6., 7.]], [[ 10., 11.], [ 14., 15.]]])] >>> np.dsplit(x, np.array([3, 6])) [array([[[ 0., 1., 2.], [ 4., 5., 6.]], [[ 8., 9., 10.], [ 12., 13., 14.]]]), array([[[ 3.], [ 7.]], [[ 11.], [ 15.]]]), array([], dtype=float64)] """ raise NotImplementedError def dstack(tup): """Stack arrays in sequence depth wise (along third axis). Takes a sequence of arrays and stack them along the third axis to make a single array. Rebuilds arrays divided by `dsplit`. This is a simple way to stack 2D arrays (images) into a single 3D array for processing. Parameters ---------- tup : sequence of arrays Arrays to stack. All of them must have the same shape along all but the third axis. Returns ------- stacked : ndarray The array formed by stacking the given arrays. See Also -------- vstack : Stack along first axis. hstack : Stack along second axis. concatenate : Join arrays. dsplit : Split array along third axis. Notes ----- Equivalent to ``np.concatenate(tup, axis=2)``. Examples -------- >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.dstack((a,b)) array([[[1, 2], [2, 3], [3, 4]]]) >>> a = np.array([[1],[2],[3]]) >>> b = np.array([[2],[3],[4]]) >>> np.dstack((a,b)) array([[[1, 2]], [[2, 3]], [[3, 4]]]) """ raise NotImplementedError def ediff1d(ary, to_end=None, to_begin=None): """The differences between consecutive elements of an array. Parameters ---------- ary : array_like If necessary, will be flattened before the differences are taken. to_end : array_like, optional Number(s) to append at the end of the returned differences. to_begin : array_like, optional Number(s) to prepend at the beginning of the returned differences. Returns ------- ed : ndarray The differences. Loosely, this is ``ary.flat[1:] - ary.flat[:-1]``. See Also -------- diff, gradient Notes ----- When applied to masked arrays, this function drops the mask information if the `to_begin` and/or `to_end` parameters are used. Examples -------- >>> x = np.array([1, 2, 4, 7, 0]) >>> np.ediff1d(x) array([ 1, 2, 3, -7]) >>> np.ediff1d(x, to_begin=-99, to_end=np.array([88, 99])) array([-99, 1, 2, 3, -7, 88, 99]) The returned array is always 1D. >>> y = [[1, 2, 4], [1, 6, 24]] >>> np.ediff1d(y) array([ 1, 2, -3, 5, 18]) """ raise NotImplementedError def einsum(): """einsum(subscripts, *operands, out=None, dtype=None, order='K', casting='safe') Evaluates the Einstein summation convention on the operands. Using the Einstein summation convention, many common multi-dimensional array operations can be represented in a simple fashion. This function provides a way compute such summations. The best way to understand this function is to try the examples below, which show how many common NumPy functions can be implemented as calls to `einsum`. Parameters ---------- subscripts : str Specifies the subscripts for summation. operands : list of array_like These are the arrays for the operation. out : ndarray, optional If provided, the calculation is done into this array. dtype : data-type, optional If provided, forces the calculation to use the data type specified. Note that you may have to also give a more liberal `casting` parameter to allow the conversions. order : {'C', 'F', 'A', or 'K'}, optional Controls the memory layout of the output. 'C' means it should be C contiguous. 'F' means it should be Fortran contiguous, 'A' means it should be 'F' if the inputs are all 'F', 'C' otherwise. 'K' means it should be as close to the layout as the inputs as is possible, including arbitrarily permuted axes. Default is 'K'. casting : {'no', 'equiv', 'safe', 'same_kind', 'unsafe'}, optional Controls what kind of data casting may occur. Setting this to 'unsafe' is not recommended, as it can adversely affect accumulations. * 'no' means the data types should not be cast at all. * 'equiv' means only byte-order changes are allowed. * 'safe' means only casts which can preserve values are allowed. * 'same_kind' means only safe casts or casts within a kind, like float64 to float32, are allowed. * 'unsafe' means any data conversions may be done. Returns ------- output : ndarray The calculation based on the Einstein summation convention. See Also -------- dot, inner, outer, tensordot Notes ----- .. versionadded:: 1.6.0 The subscripts string is a comma-separated list of subscript labels, where each label refers to a dimension of the corresponding operand. Repeated subscripts labels in one operand take the diagonal. For example, ``np.einsum('ii', a)`` is equivalent to ``np.trace(a)``. Whenever a label is repeated, it is summed, so ``np.einsum('i,i', a, b)`` is equivalent to ``np.inner(a,b)``. If a label appears only once, it is not summed, so ``np.einsum('i', a)`` produces a view of ``a`` with no changes. The order of labels in the output is by default alphabetical. This means that ``np.einsum('ij', a)`` doesn't affect a 2D array, while ``np.einsum('ji', a)`` takes its transpose. The output can be controlled by specifying output subscript labels as well. This specifies the label order, and allows summing to be disallowed or forced when desired. The call ``np.einsum('i->', a)`` is like ``np.sum(a, axis=-1)``, and ``np.einsum('ii->i', a)`` is like ``np.diag(a)``. The difference is that `einsum` does not allow broadcasting by default. To enable and control broadcasting, use an ellipsis. Default NumPy-style broadcasting is done by adding an ellipsis to the left of each term, like ``np.einsum('...ii->...i', a)``. To take the trace along the first and last axes, you can do ``np.einsum('i...i', a)``, or to do a matrix-matrix product with the left-most indices instead of rightmost, you can do ``np.einsum('ij...,jk...->ik...', a, b)``. When there is only one operand, no axes are summed, and no output parameter is provided, a view into the operand is returned instead of a new array. Thus, taking the diagonal as ``np.einsum('ii->i', a)`` produces a view. An alternative way to provide the subscripts and operands is as ``einsum(op0, sublist0, op1, sublist1, ..., [sublistout])``. The examples below have corresponding `einsum` calls with the two parameter methods. Examples -------- >>> a = np.arange(25).reshape(5,5) >>> b = np.arange(5) >>> c = np.arange(6).reshape(2,3) >>> np.einsum('ii', a) 60 >>> np.einsum(a, [0,0]) 60 >>> np.trace(a) 60 >>> np.einsum('ii->i', a) array([ 0, 6, 12, 18, 24]) >>> np.einsum(a, [0,0], [0]) array([ 0, 6, 12, 18, 24]) >>> np.diag(a) array([ 0, 6, 12, 18, 24]) >>> np.einsum('ij,j', a, b) array([ 30, 80, 130, 180, 230]) >>> np.einsum(a, [0,1], b, [1]) array([ 30, 80, 130, 180, 230]) >>> np.dot(a, b) array([ 30, 80, 130, 180, 230]) >>> np.einsum('ji', c) array([[0, 3], [1, 4], [2, 5]]) >>> np.einsum(c, [1,0]) array([[0, 3], [1, 4], [2, 5]]) >>> c.T array([[0, 3], [1, 4], [2, 5]]) >>> np.einsum('..., ...', 3, c) array([[ 0, 3, 6], [ 9, 12, 15]]) >>> np.einsum(3, [Ellipsis], c, [Ellipsis]) array([[ 0, 3, 6], [ 9, 12, 15]]) >>> np.multiply(3, c) array([[ 0, 3, 6], [ 9, 12, 15]]) >>> np.einsum('i,i', b, b) 30 >>> np.einsum(b, [0], b, [0]) 30 >>> np.inner(b,b) 30 >>> np.einsum('i,j', np.arange(2)+1, b) array([[0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]) >>> np.einsum(np.arange(2)+1, [0], b, [1]) array([[0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]) >>> np.outer(np.arange(2)+1, b) array([[0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]) >>> np.einsum('i...->...', a) array([50, 55, 60, 65, 70]) >>> np.einsum(a, [0,Ellipsis], [Ellipsis]) array([50, 55, 60, 65, 70]) >>> np.sum(a, axis=0) array([50, 55, 60, 65, 70]) >>> a = np.arange(60.).reshape(3,4,5) >>> b = np.arange(24.).reshape(4,3,2) >>> np.einsum('ijk,jil->kl', a, b) array([[ 4400., 4730.], [ 4532., 4874.], [ 4664., 5018.], [ 4796., 5162.], [ 4928., 5306.]]) >>> np.einsum(a, [0,1,2], b, [1,0,3], [2,3]) array([[ 4400., 4730.], [ 4532., 4874.], [ 4664., 5018.], [ 4796., 5162.], [ 4928., 5306.]]) >>> np.tensordot(a,b, axes=([1,0],[0,1])) array([[ 4400., 4730.], [ 4532., 4874.], [ 4664., 5018.], [ 4796., 5162.], [ 4928., 5306.]]) """ # BUILTIN raise NotImplementedError def expand_dims(a, axis): """Expand the shape of an array. Insert a new axis, corresponding to a given position in the array shape. Parameters ---------- a : array_like Input array. axis : int Position (amongst axes) where new axis is to be inserted. Returns ------- res : ndarray Output array. The number of dimensions is one greater than that of the input array. See Also -------- doc.indexing, atleast_1d, atleast_2d, atleast_3d Examples -------- >>> x = np.array([1,2]) >>> x.shape (2,) The following is equivalent to ``x[np.newaxis,:]`` or ``x[np.newaxis]``: >>> y = np.expand_dims(x, axis=0) >>> y array([[1, 2]]) >>> y.shape (1, 2) >>> y = np.expand_dims(x, axis=1) # Equivalent to x[:,newaxis] >>> y array([[1], [2]]) >>> y.shape (2, 1) Note that some examples may use ``None`` instead of ``np.newaxis``. These are the same objects: >>> np.newaxis is None True """ raise NotImplementedError def extract(condition, arr): """Return the elements of an array that satisfy some condition. This is equivalent to ``np.compress(ravel(condition), ravel(arr))``. If `condition` is boolean ``np.extract`` is equivalent to ``arr[condition]``. Parameters ---------- condition : array_like An array whose nonzero or True entries indicate the elements of `arr` to extract. arr : array_like Input array of the same size as `condition`. See Also -------- take, put, putmask, compress Examples -------- >>> arr = np.arange(12).reshape((3, 4)) >>> arr array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> condition = np.mod(arr, 3)==0 >>> condition array([[ True, False, False, True], [False, False, True, False], [False, True, False, False]], dtype=bool) >>> np.extract(condition, arr) array([0, 3, 6, 9]) If `condition` is boolean: >>> arr[condition] array([0, 3, 6, 9]) """ raise NotImplementedError def _fastCopyAndTranspose(a): """_fastCopyAndTranspose(a) """ # BUILTIN raise NotImplementedError def fill_diagonal(a, val): """Fill the main diagonal of the given array of any dimensionality. For an array `a` with ``a.ndim > 2``, the diagonal is the list of locations with indices ``a[i, i, ..., i]`` all identical. This function modifies the input array in-place, it does not return a value. Parameters ---------- a : array, at least 2-D. Array whose diagonal is to be filled, it gets modified in-place. val : scalar Value to be written on the diagonal, its type must be compatible with that of the array a. See also -------- diag_indices, diag_indices_from Notes ----- .. versionadded:: 1.4.0 This functionality can be obtained via `diag_indices`, but internally this version uses a much faster implementation that never constructs the indices and uses simple slicing. Examples -------- >>> a = np.zeros((3, 3), int) >>> np.fill_diagonal(a, 5) >>> a array([[5, 0, 0], [0, 5, 0], [0, 0, 5]]) The same function can operate on a 4-D array: >>> a = np.zeros((3, 3, 3, 3), int) >>> np.fill_diagonal(a, 4) We only show a few blocks for clarity: >>> a[0, 0] array([[4, 0, 0], [0, 0, 0], [0, 0, 0]]) >>> a[1, 1] array([[0, 0, 0], [0, 4, 0], [0, 0, 0]]) >>> a[2, 2] array([[0, 0, 0], [0, 0, 0], [0, 0, 4]]) """ raise NotImplementedError def find_common_type(array_types, scalar_types): """Determine common type following standard coercion rules. Parameters ---------- array_types : sequence A list of dtypes or dtype convertible objects representing arrays. scalar_types : sequence A list of dtypes or dtype convertible objects representing scalars. Returns ------- datatype : dtype The common data type, which is the maximum of `array_types` ignoring `scalar_types`, unless the maximum of `scalar_types` is of a different kind (`dtype.kind`). If the kind is not understood, then None is returned. See Also -------- dtype, common_type, can_cast, mintypecode Examples -------- >>> np.find_common_type([], [np.int64, np.float32, np.complex]) dtype('complex128') >>> np.find_common_type([np.int64, np.float32], []) dtype('float64') The standard casting rules ensure that a scalar cannot up-cast an array unless the scalar is of a fundamentally different kind of data (i.e. under a different hierarchy in the data type hierarchy) then the array: >>> np.find_common_type([np.float32], [np.int64, np.float64]) dtype('float32') Complex is of a different type, so it up-casts the float in the `array_types` argument: >>> np.find_common_type([np.float32], [np.complex]) dtype('complex128') Type specifier strings are convertible to dtypes and can therefore be used instead of dtypes: >>> np.find_common_type(['f4', 'f4', 'i4'], ['c8']) dtype('complex128') """ raise NotImplementedError def fix(x, y=None): """Round to nearest integer towards zero. Round an array of floats element-wise to nearest integer towards zero. The rounded values are returned as floats. Parameters ---------- x : array_like An array of floats to be rounded y : ndarray, optional Output array Returns ------- out : ndarray of floats The array of rounded numbers See Also -------- trunc, floor, ceil around : Round to given number of decimals Examples -------- >>> np.fix(3.14) 3.0 >>> np.fix(3) 3.0 >>> np.fix([2.1, 2.9, -2.1, -2.9]) array([ 2., 2., -2., -2.]) """ raise NotImplementedError def flatnonzero(a): """Return indices that are non-zero in the flattened version of a. This is equivalent to a.ravel().nonzero()[0]. Parameters ---------- a : ndarray Input array. Returns ------- res : ndarray Output array, containing the indices of the elements of `a.ravel()` that are non-zero. See Also -------- nonzero : Return the indices of the non-zero elements of the input array. ravel : Return a 1-D array containing the elements of the input array. Examples -------- >>> x = np.arange(-2, 3) >>> x array([-2, -1, 0, 1, 2]) >>> np.flatnonzero(x) array([0, 1, 3, 4]) Use the indices of the non-zero elements as an index array to extract these elements: >>> x.ravel()[np.flatnonzero(x)] array([-2, -1, 1, 2]) """ raise NotImplementedError def fliplr(m): """Flip array in the left/right direction. Flip the entries in each row in the left/right direction. Columns are preserved, but appear in a different order than before. Parameters ---------- m : array_like Input array. Returns ------- f : ndarray A view of `m` with the columns reversed. Since a view is returned, this operation is :math:`\mathcal O(1)`. See Also -------- flipud : Flip array in the up/down direction. rot90 : Rotate array counterclockwise. Notes ----- Equivalent to A[:,::-1]. Does not require the array to be two-dimensional. Examples -------- >>> A = np.diag([1.,2.,3.]) >>> A array([[ 1., 0., 0.], [ 0., 2., 0.], [ 0., 0., 3.]]) >>> np.fliplr(A) array([[ 0., 0., 1.], [ 0., 2., 0.], [ 3., 0., 0.]]) >>> A = np.random.randn(2,3,5) >>> np.all(np.fliplr(A)==A[:,::-1,...]) True """ raise NotImplementedError def flipud(m): """Flip array in the up/down direction. Flip the entries in each column in the up/down direction. Rows are preserved, but appear in a different order than before. Parameters ---------- m : array_like Input array. Returns ------- out : array_like A view of `m` with the rows reversed. Since a view is returned, this operation is :math:`\mathcal O(1)`. See Also -------- fliplr : Flip array in the left/right direction. rot90 : Rotate array counterclockwise. Notes ----- Equivalent to ``A[::-1,...]``. Does not require the array to be two-dimensional. Examples -------- >>> A = np.diag([1.0, 2, 3]) >>> A array([[ 1., 0., 0.], [ 0., 2., 0.], [ 0., 0., 3.]]) >>> np.flipud(A) array([[ 0., 0., 3.], [ 0., 2., 0.], [ 1., 0., 0.]]) >>> A = np.random.randn(2,3,5) >>> np.all(np.flipud(A)==A[::-1,...]) True >>> np.flipud([1,2]) array([2, 1]) """ raise NotImplementedError def frombuffer(buffer, dtype=float, count=-1, offset=0): """frombuffer(buffer, dtype=float, count=-1, offset=0) Interpret a buffer as a 1-dimensional array. Parameters ---------- buffer : buffer_like An object that exposes the buffer interface. dtype : data-type, optional Data-type of the returned array; default: float. count : int, optional Number of items to read. ``-1`` means all data in the buffer. offset : int, optional Start reading the buffer from this offset; default: 0. Notes ----- If the buffer has data that is not in machine byte-order, this should be specified as part of the data-type, e.g.:: >>> dt = np.dtype(int) >>> dt = dt.newbyteorder('>') >>> np.frombuffer(buf, dtype=dt) The data of the resulting array will not be byteswapped, but will be interpreted correctly. Examples -------- >>> s = 'hello world' >>> np.frombuffer(s, dtype='S1', count=5, offset=6) array(['w', 'o', 'r', 'l', 'd'], dtype='|S1') """ # BUILTIN raise NotImplementedError def fromfile(file, dtype=float, count=-1, sep=''): """fromfile(file, dtype=float, count=-1, sep='') Construct an array from data in a text or binary file. A highly efficient way of reading binary data with a known data-type, as well as parsing simply formatted text files. Data written using the `tofile` method can be read using this function. Parameters ---------- file : file or str Open file object or filename. dtype : data-type Data type of the returned array. For binary files, it is used to determine the size and byte-order of the items in the file. count : int Number of items to read. ``-1`` means all items (i.e., the complete file). sep : str Separator between items if file is a text file. Empty ("") separator means the file should be treated as binary. Spaces (" ") in the separator match zero or more whitespace characters. A separator consisting only of spaces must match at least one whitespace. See also -------- load, save ndarray.tofile loadtxt : More flexible way of loading data from a text file. Notes ----- Do not rely on the combination of `tofile` and `fromfile` for data storage, as the binary files generated are are not platform independent. In particular, no byte-order or data-type information is saved. Data can be stored in the platform independent ``.npy`` format using `save` and `load` instead. Examples -------- Construct an ndarray: >>> dt = np.dtype([('time', [('min', int), ('sec', int)]), ... ('temp', float)]) >>> x = np.zeros((1,), dtype=dt) >>> x['time']['min'] = 10; x['temp'] = 98.25 >>> x array([((10, 0), 98.25)], dtype=[('time', [('min', '>> import os >>> fname = os.tmpnam() >>> x.tofile(fname) Read the raw data from disk: >>> np.fromfile(fname, dtype=dt) array([((10, 0), 98.25)], dtype=[('time', [('min', '>> np.save(fname, x) >>> np.load(fname + '.npy') array([((10, 0), 98.25)], dtype=[('time', [('min', '>> iterable = (x*x for x in range(5)) >>> np.fromiter(iterable, np.float) array([ 0., 1., 4., 9., 16.]) """ # BUILTIN raise NotImplementedError def frompyfunc(func, nin, nout): """frompyfunc(func, nin, nout) Takes an arbitrary Python function and returns a Numpy ufunc. Can be used, for example, to add broadcasting to a built-in Python function (see Examples section). Parameters ---------- func : Python function object An arbitrary Python function. nin : int The number of input arguments. nout : int The number of objects returned by `func`. Returns ------- out : ufunc Returns a Numpy universal function (``ufunc``) object. Notes ----- The returned ufunc always returns PyObject arrays. Examples -------- Use frompyfunc to add broadcasting to the Python function ``oct``: >>> oct_array = np.frompyfunc(oct, 1, 1) >>> oct_array(np.array((10, 30, 100))) array([012, 036, 0144], dtype=object) >>> np.array((oct(10), oct(30), oct(100))) # for comparison array(['012', '036', '0144'], dtype='|S4') """ # BUILTIN raise NotImplementedError def fromregex(file, regexp, dtype): """Construct an array from a text file, using regular expression parsing. The returned array is always a structured array, and is constructed from all matches of the regular expression in the file. Groups in the regular expression are converted to fields of the structured array. Parameters ---------- file : str or file File name or file object to read. regexp : str or regexp Regular expression used to parse the file. Groups in the regular expression correspond to fields in the dtype. dtype : dtype or list of dtypes Dtype for the structured array. Returns ------- output : ndarray The output array, containing the part of the content of `file` that was matched by `regexp`. `output` is always a structured array. Raises ------ TypeError When `dtype` is not a valid dtype for a structured array. See Also -------- fromstring, loadtxt Notes ----- Dtypes for structured arrays can be specified in several forms, but all forms specify at least the data type and field name. For details see `doc.structured_arrays`. Examples -------- >>> f = open('test.dat', 'w') >>> f.write("1312 foo\n1534 bar\n444 qux") >>> f.close() >>> regexp = r"(\d+)\s+(...)" # match [digits, whitespace, anything] >>> output = np.fromregex('test.dat', regexp, ... [('num', np.int64), ('key', 'S3')]) >>> output array([(1312L, 'foo'), (1534L, 'bar'), (444L, 'qux')], dtype=[('num', '>> output['num'] array([1312, 1534, 444], dtype=int64) """ raise NotImplementedError def fromstring(string, dtype=float, count=-1, sep=''): """fromstring(string, dtype=float, count=-1, sep='') A new 1-D array initialized from raw binary or text data in a string. Parameters ---------- string : str A string containing the data. dtype : data-type, optional The data type of the array; default: float. For binary input data, the data must be in exactly this format. count : int, optional Read this number of `dtype` elements from the data. If this is negative (the default), the count will be determined from the length of the data. sep : str, optional If not provided or, equivalently, the empty string, the data will be interpreted as binary data; otherwise, as ASCII text with decimal numbers. Also in this latter case, this argument is interpreted as the string separating numbers in the data; extra whitespace between elements is also ignored. Returns ------- arr : ndarray The constructed array. Raises ------ ValueError If the string is not the correct size to satisfy the requested `dtype` and `count`. See Also -------- frombuffer, fromfile, fromiter Examples -------- >>> np.fromstring('\x01\x02', dtype=np.uint8) array([1, 2], dtype=uint8) >>> np.fromstring('1 2', dtype=int, sep=' ') array([1, 2]) >>> np.fromstring('1, 2', dtype=int, sep=',') array([1, 2]) >>> np.fromstring('\x01\x02\x03\x04\x05', dtype=np.uint8, count=3) array([1, 2, 3], dtype=uint8) """ # BUILTIN raise NotImplementedError def fv(rate, nper, pmt, pv, when='end'): """Compute the future value. Given: * a present value, `pv` * an interest `rate` compounded once per period, of which there are * `nper` total * a (fixed) payment, `pmt`, paid either * at the beginning (`when` = {'begin', 1}) or the end (`when` = {'end', 0}) of each period Return: the value at the end of the `nper` periods Parameters ---------- rate : scalar or array_like of shape(M, ) Rate of interest as decimal (not per cent) per period nper : scalar or array_like of shape(M, ) Number of compounding periods pmt : scalar or array_like of shape(M, ) Payment pv : scalar or array_like of shape(M, ) Present value when : {{'begin', 1}, {'end', 0}}, {string, int}, optional When payments are due ('begin' (1) or 'end' (0)). Defaults to {'end', 0}. Returns ------- out : ndarray Future values. If all input is scalar, returns a scalar float. If any input is array_like, returns future values for each input element. If multiple inputs are array_like, they all must have the same shape. Notes ----- The future value is computed by solving the equation:: fv + pv*(1+rate)**nper + pmt*(1 + rate*when)/rate*((1 + rate)**nper - 1) == 0 or, when ``rate == 0``:: fv + pv + pmt * nper == 0 References ---------- .. [WRW] Wheeler, D. A., E. Rathke, and R. Weir (Eds.) (2009, May). Open Document Format for Office Applications (OpenDocument)v1.2, Part 2: Recalculated Formula (OpenFormula) Format - Annotated Version, Pre-Draft 12. Organization for the Advancement of Structured Information Standards (OASIS). Billerica, MA, USA. [ODT Document]. Available: http://www.oasis-open.org/committees/documents.php?wg_abbrev=office-formula OpenDocument-formula-20090508.odt Examples -------- What is the future value after 10 years of saving $100 now, with an additional monthly savings of $100. Assume the interest rate is 5% (annually) compounded monthly? >>> np.fv(0.05/12, 10*12, -100, -100) 15692.928894335748 By convention, the negative sign represents cash flow out (i.e. money not available today). Thus, saving $100 a month at 5% annual interest leads to $15,692.93 available to spend in 10 years. If any input is array_like, returns an array of equal shape. Let's compare different interest rates from the example above. >>> a = np.array((0.05, 0.06, 0.07))/12 >>> np.fv(a, 10*12, -100, -100) array([ 15692.92889434, 16569.87435405, 17509.44688102]) """ raise NotImplementedError def genfromtxt(fname, dtype=float, comments='#', delimiter=None, skiprows=0, skip_header=0, skip_footer=0, converters=None, missing='', missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True): """Load data from a text file, with missing values handled as specified. Each line past the first `skip_header` lines is split at the `delimiter` character, and characters following the `comments` character are discarded. Parameters ---------- fname : file or str File, filename, or generator to read. If the filename extension is `.gz` or `.bz2`, the file is first decompressed. Note that generators must return byte strings in Python 3k. dtype : dtype, optional Data type of the resulting array. If None, the dtypes will be determined by the contents of each column, individually. comments : str, optional The character used to indicate the start of a comment. All the characters occurring on a line after a comment are discarded delimiter : str, int, or sequence, optional The string used to separate values. By default, any consecutive whitespaces act as delimiter. An integer or sequence of integers can also be provided as width(s) of each field. skip_header : int, optional The numbers of lines to skip at the beginning of the file. skip_footer : int, optional The numbers of lines to skip at the end of the file converters : variable, optional The set of functions that convert the data of a column to a value. The converters can also be used to provide a default value for missing data: ``converters = {3: lambda s: float(s or 0)}``. missing_values : variable, optional The set of strings corresponding to missing data. filling_values : variable, optional The set of values to be used as default when the data are missing. usecols : sequence, optional Which columns to read, with 0 being the first. For example, ``usecols = (1, 4, 5)`` will extract the 2nd, 5th and 6th columns. names : {None, True, str, sequence}, optional If `names` is True, the field names are read from the first valid line after the first `skip_header` lines. If `names` is a sequence or a single-string of comma-separated names, the names will be used to define the field names in a structured dtype. If `names` is None, the names of the dtype fields will be used, if any. excludelist : sequence, optional A list of names to exclude. This list is appended to the default list ['return','file','print']. Excluded names are appended an underscore: for example, `file` would become `file_`. deletechars : str, optional A string combining invalid characters that must be deleted from the names. defaultfmt : str, optional A format used to define default field names, such as "f%i" or "f_%02i". autostrip : bool, optional Whether to automatically strip white spaces from the variables. replace_space : char, optional Character(s) used in replacement of white spaces in the variables names. By default, use a '_'. case_sensitive : {True, False, 'upper', 'lower'}, optional If True, field names are case sensitive. If False or 'upper', field names are converted to upper case. If 'lower', field names are converted to lower case. unpack : bool, optional If True, the returned array is transposed, so that arguments may be unpacked using ``x, y, z = loadtxt(...)`` usemask : bool, optional If True, return a masked array. If False, return a regular array. invalid_raise : bool, optional If True, an exception is raised if an inconsistency is detected in the number of columns. If False, a warning is emitted and the offending lines are skipped. Returns ------- out : ndarray Data read from the text file. If `usemask` is True, this is a masked array. See Also -------- numpy.loadtxt : equivalent function when no data is missing. Notes ----- * When spaces are used as delimiters, or when no delimiter has been given as input, there should not be any missing data between two fields. * When the variables are named (either by a flexible dtype or with `names`, there must not be any header in the file (else a ValueError exception is raised). * Individual values are not stripped of spaces by default. When using a custom converter, make sure the function does remove spaces. Examples --------- >>> from StringIO import StringIO >>> import numpy as np Comma delimited file with mixed dtype >>> s = StringIO("1,1.3,abcde") >>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'), ... ('mystring','S5')], delimiter=",") >>> data array((1, 1.3, 'abcde'), dtype=[('myint', '>> s.seek(0) # needed for StringIO example only >>> data = np.genfromtxt(s, dtype=None, ... names = ['myint','myfloat','mystring'], delimiter=",") >>> data array((1, 1.3, 'abcde'), dtype=[('myint', '>> s.seek(0) >>> data = np.genfromtxt(s, dtype="i8,f8,S5", ... names=['myint','myfloat','mystring'], delimiter=",") >>> data array((1, 1.3, 'abcde'), dtype=[('myint', '>> s = StringIO("11.3abcde") >>> data = np.genfromtxt(s, dtype=None, names=['intvar','fltvar','strvar'], ... delimiter=[1,3,5]) >>> data array((1, 1.3, 'abcde'), dtype=[('intvar', '>> buf = np.getbuffer(np.ones(5), 1, 3) >>> len(buf) 3 >>> buf[0] '\x00' >>> buf """ # BUILTIN raise NotImplementedError def getbufsize(): """Return the size of the buffer used in ufuncs. """ raise NotImplementedError def geterr(): """Get the current way of handling floating-point errors. Returns ------- res : dict A dictionary with keys "divide", "over", "under", and "invalid", whose values are from the strings "ignore", "print", "log", "warn", "raise", and "call". The keys represent possible floating-point exceptions, and the values define how these exceptions are handled. See Also -------- geterrcall, seterr, seterrcall Notes ----- For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`. Examples -------- >>> np.geterr() {'over': 'warn', 'divide': 'warn', 'invalid': 'warn', 'under': 'ignore'} >>> np.arange(3.) / np.arange(3.) array([ NaN, 1., 1.]) >>> oldsettings = np.seterr(all='warn', over='raise') >>> np.geterr() {'over': 'raise', 'divide': 'warn', 'invalid': 'warn', 'under': 'warn'} >>> np.arange(3.) / np.arange(3.) __main__:1: RuntimeWarning: invalid value encountered in divide array([ NaN, 1., 1.]) """ raise NotImplementedError def geterrcall(): """Return the current callback function used on floating-point errors. When the error handling for a floating-point error (one of "divide", "over", "under", or "invalid") is set to 'call' or 'log', the function that is called or the log instance that is written to is returned by `geterrcall`. This function or log instance has been set with `seterrcall`. Returns ------- errobj : callable, log instance or None The current error handler. If no handler was set through `seterrcall`, ``None`` is returned. See Also -------- seterrcall, seterr, geterr Notes ----- For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`. Examples -------- >>> np.geterrcall() # we did not yet set a handler, returns None >>> oldsettings = np.seterr(all='call') >>> def err_handler(type, flag): ... print "Floating point error (%s), with flag %s" % (type, flag) >>> oldhandler = np.seterrcall(err_handler) >>> np.array([1, 2, 3]) / 0.0 Floating point error (divide by zero), with flag 1 array([ Inf, Inf, Inf]) >>> cur_handler = np.geterrcall() >>> cur_handler is err_handler True """ raise NotImplementedError def geterrobj(): """geterrobj() Return the current object that defines floating-point error handling. The error object contains all information that defines the error handling behavior in Numpy. `geterrobj` is used internally by the other functions that get and set error handling behavior (`geterr`, `seterr`, `geterrcall`, `seterrcall`). Returns ------- errobj : list The error object, a list containing three elements: [internal numpy buffer size, error mask, error callback function]. The error mask is a single integer that holds the treatment information on all four floating point errors. The information for each error type is contained in three bits of the integer. If we print it in base 8, we can see what treatment is set for "invalid", "under", "over", and "divide" (in that order). The printed string can be interpreted with * 0 : 'ignore' * 1 : 'warn' * 2 : 'raise' * 3 : 'call' * 4 : 'print' * 5 : 'log' See Also -------- seterrobj, seterr, geterr, seterrcall, geterrcall getbufsize, setbufsize Notes ----- For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`. Examples -------- >>> np.geterrobj() # first get the defaults [10000, 0, None] >>> def err_handler(type, flag): ... print "Floating point error (%s), with flag %s" % (type, flag) ... >>> old_bufsize = np.setbufsize(20000) >>> old_err = np.seterr(divide='raise') >>> old_handler = np.seterrcall(err_handler) >>> np.geterrobj() [20000, 2, ] >>> old_err = np.seterr(all='ignore') >>> np.base_repr(np.geterrobj()[1], 8) '0' >>> old_err = np.seterr(divide='warn', over='log', under='call', invalid='print') >>> np.base_repr(np.geterrobj()[1], 8) '4351' """ # BUILTIN raise NotImplementedError def gradient(f): """Return the gradient of an N-dimensional array. The gradient is computed using central differences in the interior and first differences at the boundaries. The returned gradient hence has the same shape as the input array. Parameters ---------- f : array_like An N-dimensional array containing samples of a scalar function. `*varargs` : scalars 0, 1, or N scalars specifying the sample distances in each direction, that is: `dx`, `dy`, `dz`, ... The default distance is 1. Returns ------- g : ndarray N arrays of the same shape as `f` giving the derivative of `f` with respect to each dimension. Examples -------- >>> x = np.array([1, 2, 4, 7, 11, 16], dtype=np.float) >>> np.gradient(x) array([ 1. , 1.5, 2.5, 3.5, 4.5, 5. ]) >>> np.gradient(x, 2) array([ 0.5 , 0.75, 1.25, 1.75, 2.25, 2.5 ]) >>> np.gradient(np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float)) [array([[ 2., 2., -1.], [ 2., 2., -1.]]), array([[ 1. , 2.5, 4. ], [ 1. , 1. , 1. ]])] """ raise NotImplementedError def hamming(M): """Return the Hamming window. The Hamming window is a taper formed by using a weighted cosine. Parameters ---------- M : int Number of points in the output window. If zero or less, an empty array is returned. Returns ------- out : ndarray The window, normalized to one (the value one appears only if the number of samples is odd). See Also -------- bartlett, blackman, hanning, kaiser Notes ----- The Hamming window is defined as .. math:: w(n) = 0.54 + 0.46cos\left(\frac{2\pi{n}}{M-1}\right) \qquad 0 \leq n \leq M-1 The Hamming was named for R. W. Hamming, an associate of J. W. Tukey and is described in Blackman and Tukey. It was recommended for smoothing the truncated autocovariance function in the time domain. Most references to the Hamming window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means "removing the foot", i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. References ---------- .. [1] Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York. .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The University of Alberta Press, 1975, pp. 109-110. .. [3] Wikipedia, "Window function", http://en.wikipedia.org/wiki/Window_function .. [4] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, "Numerical Recipes", Cambridge University Press, 1986, page 425. Examples -------- >>> np.hamming(12) array([ 0.08 , 0.15302337, 0.34890909, 0.60546483, 0.84123594, 0.98136677, 0.98136677, 0.84123594, 0.60546483, 0.34890909, 0.15302337, 0.08 ]) Plot the window and the frequency response: >>> from numpy.fft import fft, fftshift >>> import matplotlib.pyplot as plt >>> window = np.hamming(51) >>> plt.plot(window) [] >>> plt.title("Hamming window") >>> plt.ylabel("Amplitude") >>> plt.xlabel("Sample") >>> plt.show() >>> plt.figure() >>> A = fft(window, 2048) / 25.5 >>> mag = np.abs(fftshift(A)) >>> freq = np.linspace(-0.5, 0.5, len(A)) >>> response = 20 * np.log10(mag) >>> response = np.clip(response, -100, 100) >>> plt.plot(freq, response) [] >>> plt.title("Frequency response of Hamming window") >>> plt.ylabel("Magnitude [dB]") >>> plt.xlabel("Normalized frequency [cycles per sample]") >>> plt.axis('tight') (-0.5, 0.5, -100.0, ...) >>> plt.show() """ raise NotImplementedError def hanning(M): """Return the Hanning window. The Hanning window is a taper formed by using a weighted cosine. Parameters ---------- M : int Number of points in the output window. If zero or less, an empty array is returned. Returns ------- out : ndarray, shape(M,) The window, normalized to one (the value one appears only if `M` is odd). See Also -------- bartlett, blackman, hamming, kaiser Notes ----- The Hanning window is defined as .. math:: w(n) = 0.5 - 0.5cos\left(\frac{2\pi{n}}{M-1}\right) \qquad 0 \leq n \leq M-1 The Hanning was named for Julius van Hann, an Austrian meterologist. It is also known as the Cosine Bell. Some authors prefer that it be called a Hann window, to help avoid confusion with the very similar Hamming window. Most references to the Hanning window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means "removing the foot", i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. References ---------- .. [1] Blackman, R.B. and Tukey, J.W., (1958) The measurement of power spectra, Dover Publications, New York. .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The University of Alberta Press, 1975, pp. 106-108. .. [3] Wikipedia, "Window function", http://en.wikipedia.org/wiki/Window_function .. [4] W.H. Press, B.P. Flannery, S.A. Teukolsky, and W.T. Vetterling, "Numerical Recipes", Cambridge University Press, 1986, page 425. Examples -------- >>> from numpy import hanning >>> hanning(12) array([ 0. , 0.07937323, 0.29229249, 0.57115742, 0.82743037, 0.97974649, 0.97974649, 0.82743037, 0.57115742, 0.29229249, 0.07937323, 0. ]) Plot the window and its frequency response: >>> from numpy.fft import fft, fftshift >>> import matplotlib.pyplot as plt >>> window = np.hanning(51) >>> plt.plot(window) [] >>> plt.title("Hann window") >>> plt.ylabel("Amplitude") >>> plt.xlabel("Sample") >>> plt.show() >>> plt.figure() >>> A = fft(window, 2048) / 25.5 >>> mag = abs(fftshift(A)) >>> freq = np.linspace(-0.5,0.5,len(A)) >>> response = 20*np.log10(mag) >>> response = np.clip(response,-100,100) >>> plt.plot(freq, response) [] >>> plt.title("Frequency response of the Hann window") >>> plt.ylabel("Magnitude [dB]") >>> plt.xlabel("Normalized frequency [cycles per sample]") >>> plt.axis('tight') (-0.5, 0.5, -100.0, ...) >>> plt.show() """ raise NotImplementedError def histogram(a, bins=10, range=None, normed=False, weights=None, density=None): """Compute the histogram of a set of data. Parameters ---------- a : array_like Input data. The histogram is computed over the flattened array. bins : int or sequence of scalars, optional If `bins` is an int, it defines the number of equal-width bins in the given range (10, by default). If `bins` is a sequence, it defines the bin edges, including the rightmost edge, allowing for non-uniform bin widths. range : (float, float), optional The lower and upper range of the bins. If not provided, range is simply ``(a.min(), a.max())``. Values outside the range are ignored. normed : bool, optional This keyword is deprecated in Numpy 1.6 due to confusing/buggy behavior. It will be removed in Numpy 2.0. Use the density keyword instead. If False, the result will contain the number of samples in each bin. If True, the result is the value of the probability *density* function at the bin, normalized such that the *integral* over the range is 1. Note that this latter behavior is known to be buggy with unequal bin widths; use `density` instead. weights : array_like, optional An array of weights, of the same shape as `a`. Each value in `a` only contributes its associated weight towards the bin count (instead of 1). If `normed` is True, the weights are normalized, so that the integral of the density over the range remains 1 density : bool, optional If False, the result will contain the number of samples in each bin. If True, the result is the value of the probability *density* function at the bin, normalized such that the *integral* over the range is 1. Note that the sum of the histogram values will not be equal to 1 unless bins of unity width are chosen; it is not a probability *mass* function. Overrides the `normed` keyword if given. Returns ------- hist : array The values of the histogram. See `normed` and `weights` for a description of the possible semantics. bin_edges : array of dtype float Return the bin edges ``(length(hist)+1)``. See Also -------- histogramdd, bincount, searchsorted, digitize Notes ----- All but the last (righthand-most) bin is half-open. In other words, if `bins` is:: [1, 2, 3, 4] then the first bin is ``[1, 2)`` (including 1, but excluding 2) and the second ``[2, 3)``. The last bin, however, is ``[3, 4]``, which *includes* 4. Examples -------- >>> np.histogram([1, 2, 1], bins=[0, 1, 2, 3]) (array([0, 2, 1]), array([0, 1, 2, 3])) >>> np.histogram(np.arange(4), bins=np.arange(5), density=True) (array([ 0.25, 0.25, 0.25, 0.25]), array([0, 1, 2, 3, 4])) >>> np.histogram([[1, 2, 1], [1, 0, 1]], bins=[0,1,2,3]) (array([1, 4, 1]), array([0, 1, 2, 3])) >>> a = np.arange(5) >>> hist, bin_edges = np.histogram(a, density=True) >>> hist array([ 0.5, 0. , 0.5, 0. , 0. , 0.5, 0. , 0.5, 0. , 0.5]) >>> hist.sum() 2.4999999999999996 >>> np.sum(hist*np.diff(bin_edges)) 1.0 """ raise NotImplementedError def histogram2d(x, y, bins=10, range=None, normed=False, weights=None): """Compute the bi-dimensional histogram of two data samples. Parameters ---------- x : array_like, shape(N,) A sequence of values to be histogrammed along the first dimension. y : array_like, shape(M,) A sequence of values to be histogrammed along the second dimension. bins : int or [int, int] or array_like or [array, array], optional The bin specification: * If int, the number of bins for the two dimensions (nx=ny=bins). * If [int, int], the number of bins in each dimension (nx, ny = bins). * If array_like, the bin edges for the two dimensions (x_edges=y_edges=bins). * If [array, array], the bin edges in each dimension (x_edges, y_edges = bins). range : array_like, shape(2,2), optional The leftmost and rightmost edges of the bins along each dimension (if not specified explicitly in the `bins` parameters): ``[[xmin, xmax], [ymin, ymax]]``. All values outside of this range will be considered outliers and not tallied in the histogram. normed : bool, optional If False, returns the number of samples in each bin. If True, returns the bin density, i.e. the bin count divided by the bin area. weights : array_like, shape(N,), optional An array of values ``w_i`` weighing each sample ``(x_i, y_i)``. Weights are normalized to 1 if `normed` is True. If `normed` is False, the values of the returned histogram are equal to the sum of the weights belonging to the samples falling into each bin. Returns ------- H : ndarray, shape(nx, ny) The bi-dimensional histogram of samples `x` and `y`. Values in `x` are histogrammed along the first dimension and values in `y` are histogrammed along the second dimension. xedges : ndarray, shape(nx,) The bin edges along the first dimension. yedges : ndarray, shape(ny,) The bin edges along the second dimension. See Also -------- histogram: 1D histogram histogramdd: Multidimensional histogram Notes ----- When `normed` is True, then the returned histogram is the sample density, defined such that: .. math:: \sum_{i=0}^{nx-1} \sum_{j=0}^{ny-1} H_{i,j} \Delta x_i \Delta y_j = 1 where `H` is the histogram array and :math:`\Delta x_i \Delta y_i` the area of bin `{i,j}`. Please note that the histogram does not follow the Cartesian convention where `x` values are on the abcissa and `y` values on the ordinate axis. Rather, `x` is histogrammed along the first dimension of the array (vertical), and `y` along the second dimension of the array (horizontal). This ensures compatibility with `histogramdd`. Examples -------- >>> x, y = np.random.randn(2, 100) >>> H, xedges, yedges = np.histogram2d(x, y, bins=(5, 8)) >>> H.shape, xedges.shape, yedges.shape ((5, 8), (6,), (9,)) We can now use the Matplotlib to visualize this 2-dimensional histogram: >>> extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]] >>> import matplotlib.pyplot as plt >>> plt.imshow(H, extent=extent, interpolation='nearest') >>> plt.colorbar() >>> plt.show() """ raise NotImplementedError def histogramdd(sample, bins=10, range=None, normed=False, weights=None): """Compute the multidimensional histogram of some data. Parameters ---------- sample : array_like The data to be histogrammed. It must be an (N,D) array or data that can be converted to such. The rows of the resulting array are the coordinates of points in a D dimensional polytope. bins : sequence or int, optional The bin specification: * A sequence of arrays describing the bin edges along each dimension. * The number of bins for each dimension (nx, ny, ... =bins) * The number of bins for all dimensions (nx=ny=...=bins). range : sequence, optional A sequence of lower and upper bin edges to be used if the edges are not given explicitely in `bins`. Defaults to the minimum and maximum values along each dimension. normed : bool, optional If False, returns the number of samples in each bin. If True, returns the bin density, ie, the bin count divided by the bin hypervolume. weights : array_like (N,), optional An array of values `w_i` weighing each sample `(x_i, y_i, z_i, ...)`. Weights are normalized to 1 if normed is True. If normed is False, the values of the returned histogram are equal to the sum of the weights belonging to the samples falling into each bin. Returns ------- H : ndarray The multidimensional histogram of sample x. See normed and weights for the different possible semantics. edges : list A list of D arrays describing the bin edges for each dimension. See Also -------- histogram: 1-D histogram histogram2d: 2-D histogram Examples -------- >>> r = np.random.randn(100,3) >>> H, edges = np.histogramdd(r, bins = (5, 8, 4)) >>> H.shape, edges[0].size, edges[1].size, edges[2].size ((5, 8, 4), 6, 9, 5) """ raise NotImplementedError def hsplit(ary, indices_or_sections): """Split an array into multiple sub-arrays horizontally (column-wise). Please refer to the `split` documentation. `hsplit` is equivalent to `split` with ``axis=1``, the array is always split along the second axis regardless of the array dimension. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(4, 4) >>> x array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]) >>> np.hsplit(x, 2) [array([[ 0., 1.], [ 4., 5.], [ 8., 9.], [ 12., 13.]]), array([[ 2., 3.], [ 6., 7.], [ 10., 11.], [ 14., 15.]])] >>> np.hsplit(x, np.array([3, 6])) [array([[ 0., 1., 2.], [ 4., 5., 6.], [ 8., 9., 10.], [ 12., 13., 14.]]), array([[ 3.], [ 7.], [ 11.], [ 15.]]), array([], dtype=float64)] With a higher dimensional array the split is still along the second axis. >>> x = np.arange(8.0).reshape(2, 2, 2) >>> x array([[[ 0., 1.], [ 2., 3.]], [[ 4., 5.], [ 6., 7.]]]) >>> np.hsplit(x, 2) [array([[[ 0., 1.]], [[ 4., 5.]]]), array([[[ 2., 3.]], [[ 6., 7.]]])] """ raise NotImplementedError def hstack(tup): """Stack arrays in sequence horizontally (column wise). Take a sequence of arrays and stack them horizontally to make a single array. Rebuild arrays divided by `hsplit`. Parameters ---------- tup : sequence of ndarrays All arrays must have the same shape along all but the second axis. Returns ------- stacked : ndarray The array formed by stacking the given arrays. See Also -------- vstack : Stack arrays in sequence vertically (row wise). dstack : Stack arrays in sequence depth wise (along third axis). concatenate : Join a sequence of arrays together. hsplit : Split array along second axis. Notes ----- Equivalent to ``np.concatenate(tup, axis=1)`` Examples -------- >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.hstack((a,b)) array([1, 2, 3, 2, 3, 4]) >>> a = np.array([[1],[2],[3]]) >>> b = np.array([[2],[3],[4]]) >>> np.hstack((a,b)) array([[1, 2], [2, 3], [3, 4]]) """ raise NotImplementedError def i0(x): """Modified Bessel function of the first kind, order 0. Usually denoted :math:`I_0`. This function does broadcast, but will *not* "up-cast" int dtype arguments unless accompanied by at least one float or complex dtype argument (see Raises below). Parameters ---------- x : array_like, dtype float or complex Argument of the Bessel function. Returns ------- out : ndarray, shape = x.shape, dtype = x.dtype The modified Bessel function evaluated at each of the elements of `x`. Raises ------ TypeError: array cannot be safely cast to required type If argument consists exclusively of int dtypes. See Also -------- scipy.special.iv, scipy.special.ive Notes ----- We use the algorithm published by Clenshaw [1]_ and referenced by Abramowitz and Stegun [2]_, for which the function domain is partitioned into the two intervals [0,8] and (8,inf), and Chebyshev polynomial expansions are employed in each interval. Relative error on the domain [0,30] using IEEE arithmetic is documented [3]_ as having a peak of 5.8e-16 with an rms of 1.4e-16 (n = 30000). References ---------- .. [1] C. W. Clenshaw, "Chebyshev series for mathematical functions," in *National Physical Laboratory Mathematical Tables*, vol. 5, London: Her Majesty's Stationery Office, 1962. .. [2] M. Abramowitz and I. A. Stegun, *Handbook of Mathematical Functions*, 10th printing, New York: Dover, 1964, pp. 379. http://www.math.sfu.ca/~cbm/aands/page_379.htm .. [3] http://kobesearch.cpan.org/htdocs/Math-Cephes/Math/Cephes.html Examples -------- >>> np.i0([0.]) array(1.0) >>> np.i0([0., 1. + 2j]) array([ 1.00000000+0.j , 0.18785373+0.64616944j]) """ raise NotImplementedError def imag(val): """Return the imaginary part of the elements of the array. Parameters ---------- val : array_like Input array. Returns ------- out : ndarray Output array. If `val` is real, the type of `val` is used for the output. If `val` has complex elements, the returned type is float. See Also -------- real, angle, real_if_close Examples -------- >>> a = np.array([1+2j, 3+4j, 5+6j]) >>> a.imag array([ 2., 4., 6.]) >>> a.imag = np.array([8, 10, 12]) >>> a array([ 1. +8.j, 3.+10.j, 5.+12.j]) """ raise NotImplementedError def in1d(ar1, ar2, assume_unique=False): """Test whether each element of a 1D array is also present in a second array. Returns a boolean array the same length as `ar1` that is True where an element of `ar1` is in `ar2` and False otherwise. Parameters ---------- ar1 : array_like, shape (M,) Input array. ar2 : array_like The values against which to test each value of `ar1`. assume_unique : bool, optional If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False. Returns ------- mask : ndarray of bools, shape(M,) The values `ar1[mask]` are in `ar2`. See Also -------- numpy.lib.arraysetops : Module with a number of other functions for performing set operations on arrays. Notes ----- `in1d` can be considered as an element-wise function version of the python keyword `in`, for 1D sequences. ``in1d(a, b)`` is roughly equivalent to ``np.array([item in b for item in a])``. .. versionadded:: 1.4.0 Examples -------- >>> test = np.array([0, 1, 2, 5, 0]) >>> states = [0, 2] >>> mask = np.in1d(test, states) >>> mask array([ True, False, True, False, True], dtype=bool) >>> test[mask] array([0, 2, 0]) """ raise NotImplementedError def indices(dimensions, dtype=int): """Return an array representing the indices of a grid. Compute an array where the subarrays contain index values 0,1,... varying only along the corresponding axis. Parameters ---------- dimensions : sequence of ints The shape of the grid. dtype : dtype, optional Data type of the result. Returns ------- grid : ndarray The array of grid indices, ``grid.shape = (len(dimensions),) + tuple(dimensions)``. See Also -------- mgrid, meshgrid Notes ----- The output shape is obtained by prepending the number of dimensions in front of the tuple of dimensions, i.e. if `dimensions` is a tuple ``(r0, ..., rN-1)`` of length ``N``, the output shape is ``(N,r0,...,rN-1)``. The subarrays ``grid[k]`` contains the N-D array of indices along the ``k-th`` axis. Explicitly:: grid[k,i0,i1,...,iN-1] = ik Examples -------- >>> grid = np.indices((2, 3)) >>> grid.shape (2, 2, 3) >>> grid[0] # row indices array([[0, 0, 0], [1, 1, 1]]) >>> grid[1] # column indices array([[0, 1, 2], [0, 1, 2]]) The indices can be used as an index into an array. >>> x = np.arange(20).reshape(5, 4) >>> row, col = np.indices((2, 3)) >>> x[row, col] array([[0, 1, 2], [4, 5, 6]]) Note that it would be more straightforward in the above example to extract the required elements directly with ``x[:2, :3]``. """ raise NotImplementedError def info(object=None, maxwidth=76, output=sys.stdout, toplevel='numpy'): """Get help information for a function, class, or module. Parameters ---------- object : object or str, optional Input object or name to get information about. If `object` is a numpy object, its docstring is given. If it is a string, available modules are searched for matching objects. If None, information about `info` itself is returned. maxwidth : int, optional Printing width. output : file like object, optional File like object that the output is written to, default is ``stdout``. The object has to be opened in 'w' or 'a' mode. toplevel : str, optional Start search at this level. See Also -------- source, lookfor Notes ----- When used interactively with an object, ``np.info(obj)`` is equivalent to ``help(obj)`` on the Python prompt or ``obj?`` on the IPython prompt. Examples -------- >>> np.info(np.polyval) # doctest: +SKIP polyval(p, x) Evaluate the polynomial p at x. ... When using a string for `object` it is possible to get multiple results. >>> np.info('fft') # doctest: +SKIP *** Found in numpy *** Core FFT routines ... *** Found in numpy.fft *** fft(a, n=None, axis=-1) ... *** Repeat reference found in numpy.fft.fftpack *** *** Total of 3 references found. *** """ raise NotImplementedError def inner(a, b): """inner(a, b) Inner product of two arrays. Ordinary inner product of vectors for 1-D arrays (without complex conjugation), in higher dimensions a sum product over the last axes. Parameters ---------- a, b : array_like If `a` and `b` are nonscalar, their last dimensions of must match. Returns ------- out : ndarray `out.shape = a.shape[:-1] + b.shape[:-1]` Raises ------ ValueError If the last dimension of `a` and `b` has different size. See Also -------- tensordot : Sum products over arbitrary axes. dot : Generalised matrix product, using second last dimension of `b`. einsum : Einstein summation convention. Notes ----- For vectors (1-D arrays) it computes the ordinary inner-product:: np.inner(a, b) = sum(a[:]*b[:]) More generally, if `ndim(a) = r > 0` and `ndim(b) = s > 0`:: np.inner(a, b) = np.tensordot(a, b, axes=(-1,-1)) or explicitly:: np.inner(a, b)[i0,...,ir-1,j0,...,js-1] = sum(a[i0,...,ir-1,:]*b[j0,...,js-1,:]) In addition `a` or `b` may be scalars, in which case:: np.inner(a,b) = a*b Examples -------- Ordinary inner product for vectors: >>> a = np.array([1,2,3]) >>> b = np.array([0,1,0]) >>> np.inner(a, b) 2 A multidimensional example: >>> a = np.arange(24).reshape((2,3,4)) >>> b = np.arange(4) >>> np.inner(a, b) array([[ 14, 38, 62], [ 86, 110, 134]]) An example where `b` is a scalar: >>> np.inner(np.eye(2), 7) array([[ 7., 0.], [ 0., 7.]]) """ # BUILTIN raise NotImplementedError def insert(arr, obj, values, axis=None): """Insert values along the given axis before the given indices. Parameters ---------- arr : array_like Input array. obj : int, slice or sequence of ints Object that defines the index or indices before which `values` is inserted. values : array_like Values to insert into `arr`. If the type of `values` is different from that of `arr`, `values` is converted to the type of `arr`. axis : int, optional Axis along which to insert `values`. If `axis` is None then `arr` is flattened first. Returns ------- out : ndarray A copy of `arr` with `values` inserted. Note that `insert` does not occur in-place: a new array is returned. If `axis` is None, `out` is a flattened array. See Also -------- append : Append elements at the end of an array. delete : Delete elements from an array. Examples -------- >>> a = np.array([[1, 1], [2, 2], [3, 3]]) >>> a array([[1, 1], [2, 2], [3, 3]]) >>> np.insert(a, 1, 5) array([1, 5, 1, 2, 2, 3, 3]) >>> np.insert(a, 1, 5, axis=1) array([[1, 5, 1], [2, 5, 2], [3, 5, 3]]) >>> b = a.flatten() >>> b array([1, 1, 2, 2, 3, 3]) >>> np.insert(b, [2, 2], [5, 6]) array([1, 1, 5, 6, 2, 2, 3, 3]) >>> np.insert(b, slice(2, 4), [5, 6]) array([1, 1, 5, 2, 6, 2, 3, 3]) >>> np.insert(b, [2, 2], [7.13, False]) # type casting array([1, 1, 7, 0, 2, 2, 3, 3]) >>> x = np.arange(8).reshape(2, 4) >>> idx = (1, 3) >>> np.insert(x, idx, 999, axis=1) array([[ 0, 999, 1, 2, 999, 3], [ 4, 999, 5, 6, 999, 7]]) """ raise NotImplementedError def int_asbuffer(): """ """ # BUILTIN raise NotImplementedError def interp(x, xp, fp, left=None, right=None): """One-dimensional linear interpolation. Returns the one-dimensional piecewise linear interpolant to a function with given values at discrete data-points. Parameters ---------- x : array_like The x-coordinates of the interpolated values. xp : 1-D sequence of floats The x-coordinates of the data points, must be increasing. fp : 1-D sequence of floats The y-coordinates of the data points, same length as `xp`. left : float, optional Value to return for `x < xp[0]`, default is `fp[0]`. right : float, optional Value to return for `x > xp[-1]`, defaults is `fp[-1]`. Returns ------- y : {float, ndarray} The interpolated values, same shape as `x`. Raises ------ ValueError If `xp` and `fp` have different length Notes ----- Does not check that the x-coordinate sequence `xp` is increasing. If `xp` is not increasing, the results are nonsense. A simple check for increasingness is:: np.all(np.diff(xp) > 0) Examples -------- >>> xp = [1, 2, 3] >>> fp = [3, 2, 0] >>> np.interp(2.5, xp, fp) 1.0 >>> np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp) array([ 3. , 3. , 2.5 , 0.56, 0. ]) >>> UNDEF = -99.0 >>> np.interp(3.14, xp, fp, right=UNDEF) -99.0 Plot an interpolant to the sine function: >>> x = np.linspace(0, 2*np.pi, 10) >>> y = np.sin(x) >>> xvals = np.linspace(0, 2*np.pi, 50) >>> yinterp = np.interp(xvals, x, y) >>> import matplotlib.pyplot as plt >>> plt.plot(x, y, 'o') [] >>> plt.plot(xvals, yinterp, '-x') [] >>> plt.show() """ raise NotImplementedError def intersect1d(ar1, ar2, assume_unique=False): """Find the intersection of two arrays. Return the sorted, unique values that are in both of the input arrays. Parameters ---------- ar1, ar2 : array_like Input arrays. assume_unique : bool If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False. Returns ------- out : ndarray Sorted 1D array of common and unique elements. See Also -------- numpy.lib.arraysetops : Module with a number of other functions for performing set operations on arrays. Examples -------- >>> np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1]) array([1, 3]) """ raise NotImplementedError def ipmt(rate, per, nper, pv, fv=0.0, when='end'): """Not implemented. Compute the payment portion for loan interest. Parameters ---------- rate : scalar or array_like of shape(M, ) Rate of interest as decimal (not per cent) per period per : scalar or array_like of shape(M, ) Interest paid against the loan changes during the life or the loan. The `per` is the payment period to calculate the interest amount. nper : scalar or array_like of shape(M, ) Number of compounding periods pv : scalar or array_like of shape(M, ) Present value fv : scalar or array_like of shape(M, ), optional Future value when : {{'begin', 1}, {'end', 0}}, {string, int}, optional When payments are due ('begin' (1) or 'end' (0)). Defaults to {'end', 0}. Returns ------- out : ndarray Interest portion of payment. If all input is scalar, returns a scalar float. If any input is array_like, returns interest payment for each input element. If multiple inputs are array_like, they all must have the same shape. See Also -------- ppmt, pmt, pv Notes ----- The total payment is made up of payment against principal plus interest. ``pmt = ppmt + ipmt`` """ raise NotImplementedError def irr(values): """Return the Internal Rate of Return (IRR). This is the "average" periodically compounded rate of return that gives a net present value of 0.0; for a more complete explanation, see Notes below. Parameters ---------- values : array_like, shape(N,) Input cash flows per time period. By convention, net "deposits" are negative and net "withdrawals" are positive. Thus, for example, at least the first element of `values`, which represents the initial investment, will typically be negative. Returns ------- out : float Internal Rate of Return for periodic input values. Notes ----- The IRR is perhaps best understood through an example (illustrated using np.irr in the Examples section below). Suppose one invests 100 units and then makes the following withdrawals at regular (fixed) intervals: 39, 59, 55, 20. Assuming the ending value is 0, one's 100 unit investment yields 173 units; however, due to the combination of compounding and the periodic withdrawals, the "average" rate of return is neither simply 0.73/4 nor (1.73)^0.25-1. Rather, it is the solution (for :math:`r`) of the equation: .. math:: -100 + \frac{39}{1+r} + \frac{59}{(1+r)^2} + \frac{55}{(1+r)^3} + \frac{20}{(1+r)^4} = 0 In general, for `values` :math:`= [v_0, v_1, ... v_M]`, irr is the solution of the equation: [G]_ .. math:: \sum_{t=0}^M{\frac{v_t}{(1+irr)^{t}}} = 0 References ---------- .. [G] L. J. Gitman, "Principles of Managerial Finance, Brief," 3rd ed., Addison-Wesley, 2003, pg. 348. Examples -------- >>> np.irr([-100, 39, 59, 55, 20]) 0.2809484211599611 (Compare with the Example given for numpy.lib.financial.npv) """ raise NotImplementedError def iscomplex(x): """Returns a bool array, where True if input element is complex. What is tested is whether the input has a non-zero imaginary part, not if the input type is complex. Parameters ---------- x : array_like Input array. Returns ------- out : ndarray of bools Output array. See Also -------- isreal iscomplexobj : Return True if x is a complex type or an array of complex numbers. Examples -------- >>> np.iscomplex([1+1j, 1+0j, 4.5, 3, 2, 2j]) array([ True, False, False, False, False, True], dtype=bool) """ raise NotImplementedError def iscomplexobj(x): """Return True if x is a complex type or an array of complex numbers. The type of the input is checked, not the value. So even if the input has an imaginary part equal to zero, `iscomplexobj` evaluates to True if the data type is complex. Parameters ---------- x : any The input can be of any type and shape. Returns ------- y : bool The return value, True if `x` is of a complex type. See Also -------- isrealobj, iscomplex Examples -------- >>> np.iscomplexobj(1) False >>> np.iscomplexobj(1+0j) True >>> np.iscomplexobj([3, 1+0j, True]) True """ raise NotImplementedError def isfortran(a): """Returns True if array is arranged in Fortran-order in memory and dimension > 1. Parameters ---------- a : ndarray Input array. Examples -------- np.array allows to specify whether the array is written in C-contiguous order (last index varies the fastest), or FORTRAN-contiguous order in memory (first index varies the fastest). >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C') >>> a array([[1, 2, 3], [4, 5, 6]]) >>> np.isfortran(a) False >>> b = np.array([[1, 2, 3], [4, 5, 6]], order='FORTRAN') >>> b array([[1, 2, 3], [4, 5, 6]]) >>> np.isfortran(b) True The transpose of a C-ordered array is a FORTRAN-ordered array. >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C') >>> a array([[1, 2, 3], [4, 5, 6]]) >>> np.isfortran(a) False >>> b = a.T >>> b array([[1, 4], [2, 5], [3, 6]]) >>> np.isfortran(b) True 1-D arrays always evaluate as False. >>> np.isfortran(np.array([1, 2], order='FORTRAN')) False """ raise NotImplementedError def isneginf(x, y=None): """Test element-wise for negative infinity, return result as bool array. Parameters ---------- x : array_like The input array. y : array_like, optional A boolean array with the same shape and type as `x` to store the result. Returns ------- y : ndarray A boolean array with the same dimensions as the input. If second argument is not supplied then a numpy boolean array is returned with values True where the corresponding element of the input is negative infinity and values False where the element of the input is not negative infinity. If a second argument is supplied the result is stored there. If the type of that array is a numeric type the result is represented as zeros and ones, if the type is boolean then as False and True. The return value `y` is then a reference to that array. See Also -------- isinf, isposinf, isnan, isfinite Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). Errors result if the second argument is also supplied when x is a scalar input, or if first and second arguments have different shapes. Examples -------- >>> np.isneginf(np.NINF) array(True, dtype=bool) >>> np.isneginf(np.inf) array(False, dtype=bool) >>> np.isneginf(np.PINF) array(False, dtype=bool) >>> np.isneginf([-np.inf, 0., np.inf]) array([ True, False, False], dtype=bool) >>> x = np.array([-np.inf, 0., np.inf]) >>> y = np.array([2, 2, 2]) >>> np.isneginf(x, y) array([1, 0, 0]) >>> y array([1, 0, 0]) """ raise NotImplementedError def isposinf(x, y=None): """Test element-wise for positive infinity, return result as bool array. Parameters ---------- x : array_like The input array. y : array_like, optional A boolean array with the same shape as `x` to store the result. Returns ------- y : ndarray A boolean array with the same dimensions as the input. If second argument is not supplied then a boolean array is returned with values True where the corresponding element of the input is positive infinity and values False where the element of the input is not positive infinity. If a second argument is supplied the result is stored there. If the type of that array is a numeric type the result is represented as zeros and ones, if the type is boolean then as False and True. The return value `y` is then a reference to that array. See Also -------- isinf, isneginf, isfinite, isnan Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). Errors result if the second argument is also supplied when `x` is a scalar input, or if first and second arguments have different shapes. Examples -------- >>> np.isposinf(np.PINF) array(True, dtype=bool) >>> np.isposinf(np.inf) array(True, dtype=bool) >>> np.isposinf(np.NINF) array(False, dtype=bool) >>> np.isposinf([-np.inf, 0., np.inf]) array([False, False, True], dtype=bool) >>> x = np.array([-np.inf, 0., np.inf]) >>> y = np.array([2, 2, 2]) >>> np.isposinf(x, y) array([0, 0, 1]) >>> y array([0, 0, 1]) """ raise NotImplementedError def isreal(x): """Returns a bool array, where True if input element is real. If element has complex type with zero complex part, the return value for that element is True. Parameters ---------- x : array_like Input array. Returns ------- out : ndarray, bool Boolean array of same shape as `x`. See Also -------- iscomplex isrealobj : Return True if x is not a complex type. Examples -------- >>> np.isreal([1+1j, 1+0j, 4.5, 3, 2, 2j]) array([False, True, True, True, True, False], dtype=bool) """ raise NotImplementedError def isrealobj(x): """Return True if x is a not complex type or an array of complex numbers. The type of the input is checked, not the value. So even if the input has an imaginary part equal to zero, `isrealobj` evaluates to False if the data type is complex. Parameters ---------- x : any The input can be of any type and shape. Returns ------- y : bool The return value, False if `x` is of a complex type. See Also -------- iscomplexobj, isreal Examples -------- >>> np.isrealobj(1) True >>> np.isrealobj(1+0j) False >>> np.isrealobj([3, 1+0j, True]) False """ raise NotImplementedError def isscalar(num): """Returns True if the type of `num` is a scalar type. Parameters ---------- num : any Input argument, can be of any type and shape. Returns ------- val : bool True if `num` is a scalar type, False if it is not. Examples -------- >>> np.isscalar(3.1) True >>> np.isscalar([3.1]) False >>> np.isscalar(False) True """ raise NotImplementedError def issctype(rep): """Determines whether the given object represents a scalar data-type. Parameters ---------- rep : any If `rep` is an instance of a scalar dtype, True is returned. If not, False is returned. Returns ------- out : bool Boolean result of check whether `rep` is a scalar dtype. See Also -------- issubsctype, issubdtype, obj2sctype, sctype2char Examples -------- >>> np.issctype(np.int32) True >>> np.issctype(list) False >>> np.issctype(1.1) False Strings are also a scalar type: >>> np.issctype(np.dtype('str')) True """ raise NotImplementedError def issubclass_(arg1, arg2): """Determine if a class is a subclass of a second class. `issubclass_` is equivalent to the Python built-in ``issubclass``, except that it returns False instead of raising a TypeError is one of the arguments is not a class. Parameters ---------- arg1 : class Input class. True is returned if `arg1` is a subclass of `arg2`. arg2 : class or tuple of classes. Input class. If a tuple of classes, True is returned if `arg1` is a subclass of any of the tuple elements. Returns ------- out : bool Whether `arg1` is a subclass of `arg2` or not. See Also -------- issubsctype, issubdtype, issctype Examples -------- >>> np.issubclass_(np.int32, np.int) True >>> np.issubclass_(np.int32, np.float) False """ raise NotImplementedError def issubdtype(arg1, arg2): """Returns True if first argument is a typecode lower/equal in type hierarchy. Parameters ---------- arg1, arg2 : dtype_like dtype or string representing a typecode. Returns ------- out : bool See Also -------- issubsctype, issubclass_ numpy.core.numerictypes : Overview of numpy type hierarchy. Examples -------- >>> np.issubdtype('S1', str) True >>> np.issubdtype(np.float64, np.float32) False """ raise NotImplementedError def issubsctype(arg1, arg2): """Determine if the first argument is a subclass of the second argument. Parameters ---------- arg1, arg2 : dtype or dtype specifier Data-types. Returns ------- out : bool The result. See Also -------- issctype, issubdtype,obj2sctype Examples -------- >>> np.issubsctype('S8', str) True >>> np.issubsctype(np.array([1]), np.int) True >>> np.issubsctype(np.array([1]), np.float) False """ raise NotImplementedError def iterable(y): """Check whether or not an object can be iterated over. Parameters ---------- y : object Input object. Returns ------- b : {0, 1} Return 1 if the object has an iterator method or is a sequence, and 0 otherwise. Examples -------- >>> np.iterable([1, 2, 3]) 1 >>> np.iterable(2) 0 """ raise NotImplementedError def ix_(): """Construct an open mesh from multiple sequences. This function takes N 1-D sequences and returns N outputs with N dimensions each, such that the shape is 1 in all but one dimension and the dimension with the non-unit shape value cycles through all N dimensions. Using `ix_` one can quickly construct index arrays that will index the cross product. ``a[np.ix_([1,3],[2,5])]`` returns the array ``[[a[1,2] a[1,5]], [a[3,2] a[3,5]]]``. Parameters ---------- args : 1-D sequences Returns ------- out : tuple of ndarrays N arrays with N dimensions each, with N the number of input sequences. Together these arrays form an open mesh. See Also -------- ogrid, mgrid, meshgrid Examples -------- >>> a = np.arange(10).reshape(2, 5) >>> a array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> ixgrid = np.ix_([0,1], [2,4]) >>> ixgrid (array([[0], [1]]), array([[2, 4]])) >>> ixgrid[0].shape, ixgrid[1].shape ((2, 1), (1, 2)) >>> a[ixgrid] array([[2, 4], [7, 9]]) """ raise NotImplementedError def kaiser(M, beta): """Return the Kaiser window. The Kaiser window is a taper formed by using a Bessel function. Parameters ---------- M : int Number of points in the output window. If zero or less, an empty array is returned. beta : float Shape parameter for window. Returns ------- out : array The window, normalized to one (the value one appears only if the number of samples is odd). See Also -------- bartlett, blackman, hamming, hanning Notes ----- The Kaiser window is defined as .. math:: w(n) = I_0\left( \beta \sqrt{1-\frac{4n^2}{(M-1)^2}} \right)/I_0(\beta) with .. math:: \quad -\frac{M-1}{2} \leq n \leq \frac{M-1}{2}, where :math:`I_0` is the modified zeroth-order Bessel function. The Kaiser was named for Jim Kaiser, who discovered a simple approximation to the DPSS window based on Bessel functions. The Kaiser window is a very good approximation to the Digital Prolate Spheroidal Sequence, or Slepian window, which is the transform which maximizes the energy in the main lobe of the window relative to total energy. The Kaiser can approximate many other windows by varying the beta parameter. ==== ======================= beta Window shape ==== ======================= 0 Rectangular 5 Similar to a Hamming 6 Similar to a Hanning 8.6 Similar to a Blackman ==== ======================= A beta value of 14 is probably a good starting point. Note that as beta gets large, the window narrows, and so the number of samples needs to be large enough to sample the increasingly narrow spike, otherwise nans will get returned. Most references to the Kaiser window come from the signal processing literature, where it is used as one of many windowing functions for smoothing values. It is also known as an apodization (which means "removing the foot", i.e. smoothing discontinuities at the beginning and end of the sampled signal) or tapering function. References ---------- .. [1] J. F. Kaiser, "Digital Filters" - Ch 7 in "Systems analysis by digital computer", Editors: F.F. Kuo and J.F. Kaiser, p 218-285. John Wiley and Sons, New York, (1966). .. [2] E.R. Kanasewich, "Time Sequence Analysis in Geophysics", The University of Alberta Press, 1975, pp. 177-178. .. [3] Wikipedia, "Window function", http://en.wikipedia.org/wiki/Window_function Examples -------- >>> from numpy import kaiser >>> kaiser(12, 14) array([ 7.72686684e-06, 3.46009194e-03, 4.65200189e-02, 2.29737120e-01, 5.99885316e-01, 9.45674898e-01, 9.45674898e-01, 5.99885316e-01, 2.29737120e-01, 4.65200189e-02, 3.46009194e-03, 7.72686684e-06]) Plot the window and the frequency response: >>> from numpy import clip, log10, array, kaiser, linspace >>> from numpy.fft import fft, fftshift >>> import matplotlib.pyplot as plt >>> window = kaiser(51, 14) >>> plt.plot(window) [] >>> plt.title("Kaiser window") >>> plt.ylabel("Amplitude") >>> plt.xlabel("Sample") >>> plt.show() >>> plt.figure() >>> A = fft(window, 2048) / 25.5 >>> mag = abs(fftshift(A)) >>> freq = linspace(-0.5,0.5,len(A)) >>> response = 20*log10(mag) >>> response = clip(response,-100,100) >>> plt.plot(freq, response) [] >>> plt.title("Frequency response of Kaiser window") >>> plt.ylabel("Magnitude [dB]") >>> plt.xlabel("Normalized frequency [cycles per sample]") >>> plt.axis('tight') (-0.5, 0.5, -100.0, ...) >>> plt.show() """ raise NotImplementedError def kron(a, b): """Kronecker product of two arrays. Computes the Kronecker product, a composite array made of blocks of the second array scaled by the first. Parameters ---------- a, b : array_like Returns ------- out : ndarray See Also -------- outer : The outer product Notes ----- The function assumes that the number of dimenensions of `a` and `b` are the same, if necessary prepending the smallest with ones. If `a.shape = (r0,r1,..,rN)` and `b.shape = (s0,s1,...,sN)`, the Kronecker product has shape `(r0*s0, r1*s1, ..., rN*SN)`. The elements are products of elements from `a` and `b`, organized explicitly by:: kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN] where:: kt = it * st + jt, t = 0,...,N In the common 2-D case (N=1), the block structure can be visualized:: [[ a[0,0]*b, a[0,1]*b, ... , a[0,-1]*b ], [ ... ... ], [ a[-1,0]*b, a[-1,1]*b, ... , a[-1,-1]*b ]] Examples -------- >>> np.kron([1,10,100], [5,6,7]) array([ 5, 6, 7, 50, 60, 70, 500, 600, 700]) >>> np.kron([5,6,7], [1,10,100]) array([ 5, 50, 500, 6, 60, 600, 7, 70, 700]) >>> np.kron(np.eye(2), np.ones((2,2))) array([[ 1., 1., 0., 0.], [ 1., 1., 0., 0.], [ 0., 0., 1., 1.], [ 0., 0., 1., 1.]]) >>> a = np.arange(100).reshape((2,5,2,5)) >>> b = np.arange(24).reshape((2,3,4)) >>> c = np.kron(a,b) >>> c.shape (2, 10, 6, 20) >>> I = (1,3,0,2) >>> J = (0,2,1) >>> J1 = (0,) + J # extend to ndim=4 >>> S1 = (1,) + b.shape >>> K = tuple(np.array(I) * np.array(S1) + np.array(J1)) >>> c[K] == a[I]*b[J] True """ raise NotImplementedError def lexsort(keys, axis=-1): """lexsort(keys, axis=-1) Perform an indirect sort using a sequence of keys. Given multiple sorting keys, which can be interpreted as columns in a spreadsheet, lexsort returns an array of integer indices that describes the sort order by multiple columns. The last key in the sequence is used for the primary sort order, the second-to-last key for the secondary sort order, and so on. The keys argument must be a sequence of objects that can be converted to arrays of the same shape. If a 2D array is provided for the keys argument, it's rows are interpreted as the sorting keys and sorting is according to the last row, second last row etc. Parameters ---------- keys : (k,N) array or tuple containing k (N,)-shaped sequences The `k` different "columns" to be sorted. The last column (or row if `keys` is a 2D array) is the primary sort key. axis : int, optional Axis to be indirectly sorted. By default, sort over the last axis. Returns ------- indices : (N,) ndarray of ints Array of indices that sort the keys along the specified axis. See Also -------- argsort : Indirect sort. ndarray.sort : In-place sort. sort : Return a sorted copy of an array. Examples -------- Sort names: first by surname, then by name. >>> surnames = ('Hertz', 'Galilei', 'Hertz') >>> first_names = ('Heinrich', 'Galileo', 'Gustav') >>> ind = np.lexsort((first_names, surnames)) >>> ind array([1, 2, 0]) >>> [surnames[i] + ", " + first_names[i] for i in ind] ['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich'] Sort two columns of numbers: >>> a = [1,5,1,4,3,4,4] # First column >>> b = [9,4,0,4,0,2,1] # Second column >>> ind = np.lexsort((b,a)) # Sort by a, then by b >>> print ind [2 0 4 6 5 3 1] >>> [(a[i],b[i]) for i in ind] [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)] Note that sorting is first according to the elements of ``a``. Secondary sorting is according to the elements of ``b``. A normal ``argsort`` would have yielded: >>> [(a[i],b[i]) for i in np.argsort(a)] [(1, 9), (1, 0), (3, 0), (4, 4), (4, 2), (4, 1), (5, 4)] Structured arrays are sorted lexically by ``argsort``: >>> x = np.array([(1,9), (5,4), (1,0), (4,4), (3,0), (4,2), (4,1)], ... dtype=np.dtype([('x', int), ('y', int)])) >>> np.argsort(x) # or np.argsort(x, order=('x', 'y')) array([2, 0, 4, 6, 5, 3, 1]) """ # BUILTIN raise NotImplementedError def load(file, mmap_mode=None): """Load a pickled, ``.npy``, or ``.npz`` binary file. Parameters ---------- file : file-like object or string The file to read. It must support ``seek()`` and ``read()`` methods. If the filename extension is ``.gz``, the file is first decompressed. mmap_mode: {None, 'r+', 'r', 'w+', 'c'}, optional If not None, then memory-map the file, using the given mode (see `numpy.memmap`). The mode has no effect for pickled or zipped files. A memory-mapped array is stored on disk, and not directly loaded into memory. However, it can be accessed and sliced like any ndarray. Memory mapping is especially useful for accessing small fragments of large files without reading the entire file into memory. Returns ------- result : array, tuple, dict, etc. Data stored in the file. Raises ------ IOError If the input file does not exist or cannot be read. See Also -------- save, savez, loadtxt memmap : Create a memory-map to an array stored in a file on disk. Notes ----- - If the file contains pickle data, then whatever is stored in the pickle is returned. - If the file is a ``.npy`` file, then an array is returned. - If the file is a ``.npz`` file, then a dictionary-like object is returned, containing ``{filename: array}`` key-value pairs, one for each file in the archive. Examples -------- Store data to disk, and load it again: >>> np.save('/tmp/123', np.array([[1, 2, 3], [4, 5, 6]])) >>> np.load('/tmp/123.npy') array([[1, 2, 3], [4, 5, 6]]) Mem-map the stored array, and then access the second row directly from disk: >>> X = np.load('/tmp/123.npy', mmap_mode='r') >>> X[1, :] memmap([4, 5, 6]) """ raise NotImplementedError def loads(): """loads(string) -- Load a pickle from the given string """ # BUILTIN raise NotImplementedError def loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0): """Load data from a text file. Each row in the text file must have the same number of values. Parameters ---------- fname : file or str File, filename, or generator to read. If the filename extension is ``.gz`` or ``.bz2``, the file is first decompressed. Note that generators should return byte strings for Python 3k. dtype : data-type, optional Data-type of the resulting array; default: float. If this is a record data-type, the resulting array will be 1-dimensional, and each row will be interpreted as an element of the array. In this case, the number of columns used must match the number of fields in the data-type. comments : str, optional The character used to indicate the start of a comment; default: '#'. delimiter : str, optional The string used to separate values. By default, this is any whitespace. converters : dict, optional A dictionary mapping column number to a function that will convert that column to a float. E.g., if column 0 is a date string: ``converters = {0: datestr2num}``. Converters can also be used to provide a default value for missing data (but see also `genfromtxt`): ``converters = {3: lambda s: float(s.strip() or 0)}``. Default: None. skiprows : int, optional Skip the first `skiprows` lines; default: 0. usecols : sequence, optional Which columns to read, with 0 being the first. For example, ``usecols = (1,4,5)`` will extract the 2nd, 5th and 6th columns. The default, None, results in all columns being read. unpack : bool, optional If True, the returned array is transposed, so that arguments may be unpacked using ``x, y, z = loadtxt(...)``. When used with a record data-type, arrays are returned for each field. Default is False. ndmin : int, optional The returned array will have at least `ndmin` dimensions. Otherwise mono-dimensional axes will be squeezed. Legal values: 0 (default), 1 or 2. .. versionadded:: 1.6.0 Returns ------- out : ndarray Data read from the text file. See Also -------- load, fromstring, fromregex genfromtxt : Load data with missing values handled as specified. scipy.io.loadmat : reads MATLAB data files Notes ----- This function aims to be a fast reader for simply formatted files. The `genfromtxt` function provides more sophisticated handling of, e.g., lines with missing values. Examples -------- >>> from StringIO import StringIO # StringIO behaves like a file object >>> c = StringIO("0 1\n2 3") >>> np.loadtxt(c) array([[ 0., 1.], [ 2., 3.]]) >>> d = StringIO("M 21 72\nF 35 58") >>> np.loadtxt(d, dtype={'names': ('gender', 'age', 'weight'), ... 'formats': ('S1', 'i4', 'f4')}) array([('M', 21, 72.0), ('F', 35, 58.0)], dtype=[('gender', '|S1'), ('age', '>> c = StringIO("1,0,2\n3,0,4") >>> x, y = np.loadtxt(c, delimiter=',', usecols=(0, 2), unpack=True) >>> x array([ 1., 3.]) >>> y array([ 2., 4.]) """ raise NotImplementedError def lookfor(what, module=None, import_modules=True, regenerate=False, output=None): """Do a keyword search on docstrings. A list of of objects that matched the search is displayed, sorted by relevance. All given keywords need to be found in the docstring for it to be returned as a result, but the order does not matter. Parameters ---------- what : str String containing words to look for. module : str or list, optional Name of module(s) whose docstrings to go through. import_modules : bool, optional Whether to import sub-modules in packages. Default is True. regenerate : bool, optional Whether to re-generate the docstring cache. Default is False. output : file-like, optional File-like object to write the output to. If omitted, use a pager. See Also -------- source, info Notes ----- Relevance is determined only roughly, by checking if the keywords occur in the function name, at the start of a docstring, etc. Examples -------- >>> np.lookfor('binary representation') Search results for 'binary representation' ------------------------------------------ numpy.binary_repr Return the binary representation of the input number as a string. numpy.core.setup_common.long_double_representation Given a binary dump as given by GNU od -b, look for long double numpy.base_repr Return a string representation of a number in the given base system. ... """ raise NotImplementedError def mafromtxt(fname): """Load ASCII data stored in a text file and return a masked array. For a complete description of all the input parameters, see `genfromtxt`. See Also -------- numpy.genfromtxt : generic function to load ASCII data. """ raise NotImplementedError def mask_indices(n, mask_func, k=0): """Return the indices to access (n, n) arrays, given a masking function. Assume `mask_func` is a function that, for a square array a of size ``(n, n)`` with a possible offset argument `k`, when called as ``mask_func(a, k)`` returns a new array with zeros in certain locations (functions like `triu` or `tril` do precisely this). Then this function returns the indices where the non-zero values would be located. Parameters ---------- n : int The returned indices will be valid to access arrays of shape (n, n). mask_func : callable A function whose call signature is similar to that of `triu`, `tril`. That is, ``mask_func(x, k)`` returns a boolean array, shaped like `x`. `k` is an optional argument to the function. k : scalar An optional argument which is passed through to `mask_func`. Functions like `triu`, `tril` take a second argument that is interpreted as an offset. Returns ------- indices : tuple of arrays. The `n` arrays of indices corresponding to the locations where ``mask_func(np.ones((n, n)), k)`` is True. See Also -------- triu, tril, triu_indices, tril_indices Notes ----- .. versionadded:: 1.4.0 Examples -------- These are the indices that would allow you to access the upper triangular part of any 3x3 array: >>> iu = np.mask_indices(3, np.triu) For example, if `a` is a 3x3 array: >>> a = np.arange(9).reshape(3, 3) >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> a[iu] array([0, 1, 2, 4, 5, 8]) An offset can be passed also to the masking function. This gets us the indices starting on the first diagonal right of the main one: >>> iu1 = np.mask_indices(3, np.triu, 1) with which we now extract only three elements: >>> a[iu1] array([1, 2, 5]) """ raise NotImplementedError def mat(data, dtype=None): """Interpret the input as a matrix. Unlike `matrix`, `asmatrix` does not make a copy if the input is already a matrix or an ndarray. Equivalent to ``matrix(data, copy=False)``. Parameters ---------- data : array_like Input data. Returns ------- mat : matrix `data` interpreted as a matrix. Examples -------- >>> x = np.array([[1, 2], [3, 4]]) >>> m = np.asmatrix(x) >>> x[0,0] = 5 >>> m matrix([[5, 2], [3, 4]]) """ raise NotImplementedError def max(a, axis=None, out=None): """Return the maximum of an array or maximum along an axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default flattened input is used. out : ndarray, optional Alternate output array in which to place the result. Must be of the same shape and buffer length as the expected output. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- amax : ndarray or scalar Maximum of `a`. If `axis` is None, the result is a scalar value. If `axis` is given, the result is an array of dimension ``a.ndim - 1``. See Also -------- nanmax : NaN values are ignored instead of being propagated. fmax : same behavior as the C99 fmax function. argmax : indices of the maximum values. Notes ----- NaN values are propagated, that is if at least one item is NaN, the corresponding max value will be NaN as well. To ignore NaN values (MATLAB behavior), please use nanmax. Examples -------- >>> a = np.arange(4).reshape((2,2)) >>> a array([[0, 1], [2, 3]]) >>> np.amax(a) 3 >>> np.amax(a, axis=0) array([2, 3]) >>> np.amax(a, axis=1) array([1, 3]) >>> b = np.arange(5, dtype=np.float) >>> b[2] = np.NaN >>> np.amax(b) nan >>> np.nanmax(b) 4.0 """ raise NotImplementedError def maximum_sctype(t): """Return the scalar type of highest precision of the same kind as the input. Parameters ---------- t : dtype or dtype specifier The input data type. This can be a `dtype` object or an object that is convertible to a `dtype`. Returns ------- out : dtype The highest precision data type of the same kind (`dtype.kind`) as `t`. See Also -------- obj2sctype, mintypecode, sctype2char dtype Examples -------- >>> np.maximum_sctype(np.int) >>> np.maximum_sctype(np.uint8) >>> np.maximum_sctype(np.complex) >>> np.maximum_sctype(str) >>> np.maximum_sctype('i2') >>> np.maximum_sctype('f4') """ raise NotImplementedError def may_share_memory(a, b): """Determine if two arrays can share memory The memory-bounds of a and b are computed. If they overlap then this function returns True. Otherwise, it returns False. A return of True does not necessarily mean that the two arrays share any element. It just means that they *might*. Parameters ---------- a, b : ndarray Returns ------- out : bool Examples -------- >>> np.may_share_memory(np.array([1,2]), np.array([5,8,9])) False """ raise NotImplementedError def mean(a, axis=None, dtype=None, out=None): """Compute the arithmetic mean along the specified axis. Returns the average of the array elements. The average is taken over the flattened array by default, otherwise over the specified axis. `float64` intermediate and return values are used for integer inputs. Parameters ---------- a : array_like Array containing numbers whose mean is desired. If `a` is not an array, a conversion is attempted. axis : int, optional Axis along which the means are computed. The default is to compute the mean of the flattened array. dtype : data-type, optional Type to use in computing the mean. For integer inputs, the default is `float64`; for floating point inputs, it is the same as the input dtype. out : ndarray, optional Alternate output array in which to place the result. The default is ``None``; if provided, it must have the same shape as the expected output, but the type will be cast if necessary. See `doc.ufuncs` for details. Returns ------- m : ndarray, see dtype parameter above If `out=None`, returns a new array containing the mean values, otherwise a reference to the output array is returned. See Also -------- average : Weighted average Notes ----- The arithmetic mean is the sum of the elements along the axis divided by the number of elements. Note that for floating-point input, the mean is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-precision accumulator using the `dtype` keyword can alleviate this issue. Examples -------- >>> a = np.array([[1, 2], [3, 4]]) >>> np.mean(a) 2.5 >>> np.mean(a, axis=0) array([ 2., 3.]) >>> np.mean(a, axis=1) array([ 1.5, 3.5]) In single precision, `mean` can be inaccurate: >>> a = np.zeros((2, 512*512), dtype=np.float32) >>> a[0, :] = 1.0 >>> a[1, :] = 0.1 >>> np.mean(a) 0.546875 Computing the mean in float64 is more accurate: >>> np.mean(a, dtype=np.float64) 0.55000000074505806 """ raise NotImplementedError def median(a, axis=None, out=None, overwrite_input=False): """Compute the median along the specified axis. Returns the median of the array elements. Parameters ---------- a : array_like Input array or object that can be converted to an array. axis : {None, int}, optional Axis along which the medians are computed. The default (axis=None) is to compute the median along a flattened version of the array. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary. overwrite_input : {False, True}, optional If True, then allow use of memory of input array (a) for calculations. The input array will be modified by the call to median. This will save memory when you do not need to preserve the contents of the input array. Treat the input as undefined, but it will probably be fully or partially sorted. Default is False. Note that, if `overwrite_input` is True and the input is not already an ndarray, an error will be raised. Returns ------- median : ndarray A new array holding the result (unless `out` is specified, in which case that array is returned instead). If the input contains integers, or floats of smaller precision than 64, then the output data-type is float64. Otherwise, the output data-type is the same as that of the input. See Also -------- mean, percentile Notes ----- Given a vector V of length N, the median of V is the middle value of a sorted copy of V, ``V_sorted`` - i.e., ``V_sorted[(N-1)/2]``, when N is odd. When N is even, it is the average of the two middle values of ``V_sorted``. Examples -------- >>> a = np.array([[10, 7, 4], [3, 2, 1]]) >>> a array([[10, 7, 4], [ 3, 2, 1]]) >>> np.median(a) 3.5 >>> np.median(a, axis=0) array([ 6.5, 4.5, 2.5]) >>> np.median(a, axis=1) array([ 7., 2.]) >>> m = np.median(a, axis=0) >>> out = np.zeros_like(m) >>> np.median(a, axis=0, out=m) array([ 6.5, 4.5, 2.5]) >>> m array([ 6.5, 4.5, 2.5]) >>> b = a.copy() >>> np.median(b, axis=1, overwrite_input=True) array([ 7., 2.]) >>> assert not np.all(a==b) >>> b = a.copy() >>> np.median(b, axis=None, overwrite_input=True) 3.5 >>> assert not np.all(a==b) """ raise NotImplementedError def meshgrid(x, y): """Return coordinate matrices from two coordinate vectors. Parameters ---------- x, y : ndarray Two 1-D arrays representing the x and y coordinates of a grid. Returns ------- X, Y : ndarray For vectors `x`, `y` with lengths ``Nx=len(x)`` and ``Ny=len(y)``, return `X`, `Y` where `X` and `Y` are ``(Ny, Nx)`` shaped arrays with the elements of `x` and y repeated to fill the matrix along the first dimension for `x`, the second for `y`. See Also -------- index_tricks.mgrid : Construct a multi-dimensional "meshgrid" using indexing notation. index_tricks.ogrid : Construct an open multi-dimensional "meshgrid" using indexing notation. Examples -------- >>> X, Y = np.meshgrid([1,2,3], [4,5,6,7]) >>> X array([[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> Y array([[4, 4, 4], [5, 5, 5], [6, 6, 6], [7, 7, 7]]) `meshgrid` is very useful to evaluate functions on a grid. >>> x = np.arange(-5, 5, 0.1) >>> y = np.arange(-5, 5, 0.1) >>> xx, yy = np.meshgrid(x, y) >>> z = np.sin(xx**2+yy**2)/(xx**2+yy**2) """ raise NotImplementedError def min(a, axis=None, out=None): """Return the minimum of an array or minimum along an axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default a flattened input is used. out : ndarray, optional Alternative output array in which to place the result. Must be of the same shape and buffer length as the expected output. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- amin : ndarray A new array or a scalar array with the result. See Also -------- nanmin: nan values are ignored instead of being propagated fmin: same behavior as the C99 fmin function argmin: Return the indices of the minimum values. amax, nanmax, fmax Notes ----- NaN values are propagated, that is if at least one item is nan, the corresponding min value will be nan as well. To ignore NaN values (matlab behavior), please use nanmin. Examples -------- >>> a = np.arange(4).reshape((2,2)) >>> a array([[0, 1], [2, 3]]) >>> np.amin(a) # Minimum of the flattened array 0 >>> np.amin(a, axis=0) # Minima along the first axis array([0, 1]) >>> np.amin(a, axis=1) # Minima along the second axis array([0, 2]) >>> b = np.arange(5, dtype=np.float) >>> b[2] = np.NaN >>> np.amin(b) nan >>> np.nanmin(b) 0.0 """ raise NotImplementedError def min_scalar_type(a): """min_scalar_type(a) For scalar ``a``, returns the data type with the smallest size and smallest scalar kind which can hold its value. For non-scalar array ``a``, returns the vector's dtype unmodified. Floating point values are not demoted to integers, and complex values are not demoted to floats. Parameters ---------- a : scalar or array_like The value whose minimal data type is to be found. Returns ------- out : dtype The minimal data type. Notes ----- .. versionadded:: 1.6.0 See Also -------- result_type, promote_types, dtype, can_cast Examples -------- >>> np.min_scalar_type(10) dtype('uint8') >>> np.min_scalar_type(-260) dtype('int16') >>> np.min_scalar_type(3.1) dtype('float16') >>> np.min_scalar_type(1e50) dtype('float64') >>> np.min_scalar_type(np.arange(4,dtype='f8')) dtype('float64') """ # BUILTIN raise NotImplementedError def mintypecode(typechars, typeset='GDFgdf', default='d'): """Return the character for the minimum-size type to which given types can be safely cast. The returned type character must represent the smallest size dtype such that an array of the returned type can handle the data from an array of all types in `typechars` (or if `typechars` is an array, then its dtype.char). Parameters ---------- typechars : list of str or array_like If a list of strings, each string should represent a dtype. If array_like, the character representation of the array dtype is used. typeset : str or list of str, optional The set of characters that the returned character is chosen from. The default set is 'GDFgdf'. default : str, optional The default character, this is returned if none of the characters in `typechars` matches a character in `typeset`. Returns ------- typechar : str The character representing the minimum-size type that was found. See Also -------- dtype, sctype2char, maximum_sctype Examples -------- >>> np.mintypecode(['d', 'f', 'S']) 'd' >>> x = np.array([1.1, 2-3.j]) >>> np.mintypecode(x) 'D' >>> np.mintypecode('abceh', default='G') 'G' """ raise NotImplementedError def mirr(values, finance_rate, reinvest_rate): """Modified internal rate of return. Parameters ---------- values : array_like Cash flows (must contain at least one positive and one negative value) or nan is returned. The first value is considered a sunk cost at time zero. finance_rate : scalar Interest rate paid on the cash flows reinvest_rate : scalar Interest rate received on the cash flows upon reinvestment Returns ------- out : float Modified internal rate of return """ raise NotImplementedError def msort(a): """Return a copy of an array sorted along the first axis. Parameters ---------- a : array_like Array to be sorted. Returns ------- sorted_array : ndarray Array of the same type and shape as `a`. See Also -------- sort Notes ----- ``np.msort(a)`` is equivalent to ``np.sort(a, axis=0)``. """ raise NotImplementedError def nan_to_num(x): """Replace nan with zero and inf with finite numbers. Returns an array or scalar replacing Not a Number (NaN) with zero, (positive) infinity with a very large number and negative infinity with a very small (or negative) number. Parameters ---------- x : array_like Input data. Returns ------- out : ndarray, float Array with the same shape as `x` and dtype of the element in `x` with the greatest precision. NaN is replaced by zero, and infinity (-infinity) is replaced by the largest (smallest or most negative) floating point value that fits in the output dtype. All finite numbers are upcast to the output dtype (default float64). See Also -------- isinf : Shows which elements are negative or negative infinity. isneginf : Shows which elements are negative infinity. isposinf : Shows which elements are positive infinity. isnan : Shows which elements are Not a Number (NaN). isfinite : Shows which elements are finite (not NaN, not infinity) Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Examples -------- >>> np.set_printoptions(precision=8) >>> x = np.array([np.inf, -np.inf, np.nan, -128, 128]) >>> np.nan_to_num(x) array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, -1.28000000e+002, 1.28000000e+002]) """ raise NotImplementedError def nanargmax(a, axis=None): """Return indices of the maximum values over an axis, ignoring NaNs. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default flattened input is used. Returns ------- index_array : ndarray An array of indices or a single index value. See Also -------- argmax, nanargmin Examples -------- >>> a = np.array([[np.nan, 4], [2, 3]]) >>> np.argmax(a) 0 >>> np.nanargmax(a) 1 >>> np.nanargmax(a, axis=0) array([1, 0]) >>> np.nanargmax(a, axis=1) array([1, 1]) """ raise NotImplementedError def nanargmin(a, axis=None): """Return indices of the minimum values over an axis, ignoring NaNs. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which to operate. By default flattened input is used. Returns ------- index_array : ndarray An array of indices or a single index value. See Also -------- argmin, nanargmax Examples -------- >>> a = np.array([[np.nan, 4], [2, 3]]) >>> np.argmin(a) 0 >>> np.nanargmin(a) 2 >>> np.nanargmin(a, axis=0) array([1, 1]) >>> np.nanargmin(a, axis=1) array([1, 0]) """ raise NotImplementedError def nanmax(a, axis=None): """Return the maximum of an array or maximum along an axis ignoring any NaNs. Parameters ---------- a : array_like Array containing numbers whose maximum is desired. If `a` is not an array, a conversion is attempted. axis : int, optional Axis along which the maximum is computed. The default is to compute the maximum of the flattened array. Returns ------- nanmax : ndarray An array with the same shape as `a`, with the specified axis removed. If `a` is a 0-d array, or if axis is None, a ndarray scalar is returned. The the same dtype as `a` is returned. See Also -------- numpy.amax : Maximum across array including any Not a Numbers. numpy.nanmin : Minimum across array ignoring any Not a Numbers. isnan : Shows which elements are Not a Number (NaN). isfinite: Shows which elements are not: Not a Number, positive and negative infinity Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Positive infinity is treated as a very large number and negative infinity is treated as a very small (i.e. negative) number. If the input has a integer type the function is equivalent to np.max. Examples -------- >>> a = np.array([[1, 2], [3, np.nan]]) >>> np.nanmax(a) 3.0 >>> np.nanmax(a, axis=0) array([ 3., 2.]) >>> np.nanmax(a, axis=1) array([ 2., 3.]) When positive infinity and negative infinity are present: >>> np.nanmax([1, 2, np.nan, np.NINF]) 2.0 >>> np.nanmax([1, 2, np.nan, np.inf]) inf """ raise NotImplementedError def nanmin(a, axis=None): """Return the minimum of an array or minimum along an axis ignoring any NaNs. Parameters ---------- a : array_like Array containing numbers whose minimum is desired. axis : int, optional Axis along which the minimum is computed.The default is to compute the minimum of the flattened array. Returns ------- nanmin : ndarray A new array or a scalar array with the result. See Also -------- numpy.amin : Minimum across array including any Not a Numbers. numpy.nanmax : Maximum across array ignoring any Not a Numbers. isnan : Shows which elements are Not a Number (NaN). isfinite: Shows which elements are not: Not a Number, positive and negative infinity Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. Positive infinity is treated as a very large number and negative infinity is treated as a very small (i.e. negative) number. If the input has a integer type the function is equivalent to np.min. Examples -------- >>> a = np.array([[1, 2], [3, np.nan]]) >>> np.nanmin(a) 1.0 >>> np.nanmin(a, axis=0) array([ 1., 2.]) >>> np.nanmin(a, axis=1) array([ 1., 3.]) When positive infinity and negative infinity are present: >>> np.nanmin([1, 2, np.nan, np.inf]) 1.0 >>> np.nanmin([1, 2, np.nan, np.NINF]) -inf """ raise NotImplementedError def nansum(a, axis=None): """Return the sum of array elements over a given axis treating Not a Numbers (NaNs) as zero. Parameters ---------- a : array_like Array containing numbers whose sum is desired. If `a` is not an array, a conversion is attempted. axis : int, optional Axis along which the sum is computed. The default is to compute the sum of the flattened array. Returns ------- y : ndarray An array with the same shape as a, with the specified axis removed. If a is a 0-d array, or if axis is None, a scalar is returned with the same dtype as `a`. See Also -------- numpy.sum : Sum across array including Not a Numbers. isnan : Shows which elements are Not a Number (NaN). isfinite: Shows which elements are not: Not a Number, positive and negative infinity Notes ----- Numpy uses the IEEE Standard for Binary Floating-Point for Arithmetic (IEEE 754). This means that Not a Number is not equivalent to infinity. If positive or negative infinity are present the result is positive or negative infinity. But if both positive and negative infinity are present, the result is Not A Number (NaN). Arithmetic is modular when using integer types (all elements of `a` must be finite i.e. no elements that are NaNs, positive infinity and negative infinity because NaNs are floating point types), and no error is raised on overflow. Examples -------- >>> np.nansum(1) 1 >>> np.nansum([1]) 1 >>> np.nansum([1, np.nan]) 1.0 >>> a = np.array([[1, 1], [1, np.nan]]) >>> np.nansum(a) 3.0 >>> np.nansum(a, axis=0) array([ 2., 1.]) When positive infinity and negative infinity are present >>> np.nansum([1, np.nan, np.inf]) inf >>> np.nansum([1, np.nan, np.NINF]) -inf >>> np.nansum([1, np.nan, np.inf, np.NINF]) nan """ raise NotImplementedError def ndfromtxt(fname): """Load ASCII data stored in a file and return it as a single array. Complete description of all the optional input parameters is available in the docstring of the `genfromtxt` function. See Also -------- numpy.genfromtxt : generic function. """ raise NotImplementedError def ndim(a): """Return the number of dimensions of an array. Parameters ---------- a : array_like Input array. If it is not already an ndarray, a conversion is attempted. Returns ------- number_of_dimensions : int The number of dimensions in `a`. Scalars are zero-dimensional. See Also -------- ndarray.ndim : equivalent method shape : dimensions of array ndarray.shape : dimensions of array Examples -------- >>> np.ndim([[1,2,3],[4,5,6]]) 2 >>> np.ndim(np.array([[1,2,3],[4,5,6]])) 2 >>> np.ndim(1) 0 """ raise NotImplementedError def nested_iters(): """ """ # BUILTIN raise NotImplementedError def newbuffer(size): """newbuffer(size) Return a new uninitialized buffer object of size bytes """ # BUILTIN raise NotImplementedError def nonzero(a): """Return the indices of the elements that are non-zero. Returns a tuple of arrays, one for each dimension of `a`, containing the indices of the non-zero elements in that dimension. The corresponding non-zero values can be obtained with:: a[nonzero(a)] To group the indices by element, rather than dimension, use:: transpose(nonzero(a)) The result of this is always a 2-D array, with a row for each non-zero element. Parameters ---------- a : array_like Input array. Returns ------- tuple_of_arrays : tuple Indices of elements that are non-zero. See Also -------- flatnonzero : Return indices that are non-zero in the flattened version of the input array. ndarray.nonzero : Equivalent ndarray method. count_nonzero : Counts the number of non-zero elements in the input array. Examples -------- >>> x = np.eye(3) >>> x array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> np.nonzero(x) (array([0, 1, 2]), array([0, 1, 2])) >>> x[np.nonzero(x)] array([ 1., 1., 1.]) >>> np.transpose(np.nonzero(x)) array([[0, 0], [1, 1], [2, 2]]) A common use for ``nonzero`` is to find the indices of an array, where a condition is True. Given an array `a`, the condition `a` > 3 is a boolean array and since False is interpreted as 0, np.nonzero(a > 3) yields the indices of the `a` where the condition is true. >>> a = np.array([[1,2,3],[4,5,6],[7,8,9]]) >>> a > 3 array([[False, False, False], [ True, True, True], [ True, True, True]], dtype=bool) >>> np.nonzero(a > 3) (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2])) The ``nonzero`` method of the boolean array can also be called. >>> (a > 3).nonzero() (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2])) """ raise NotImplementedError def nper(rate, pmt, pv, fv=0, when='end'): """Compute the number of periodic payments. Parameters ---------- rate : array_like Rate of interest (per period) pmt : array_like Payment pv : array_like Present value fv : array_like, optional Future value when : {{'begin', 1}, {'end', 0}}, {string, int}, optional When payments are due ('begin' (1) or 'end' (0)) Notes ----- The number of periods ``nper`` is computed by solving the equation:: fv + pv*(1+rate)**nper + pmt*(1+rate*when)/rate*((1+rate)**nper-1) = 0 but if ``rate = 0`` then:: fv + pv + pmt*nper = 0 Examples -------- If you only had $150/month to pay towards the loan, how long would it take to pay-off a loan of $8,000 at 7% annual interest? >>> np.nper(0.07/12, -150, 8000) 64.073348770661852 So, over 64 months would be required to pay off the loan. The same analysis could be done with several different interest rates and/or payments and/or total amounts to produce an entire table. >>> np.nper(*(np.ogrid[0.07/12: 0.08/12: 0.01/12, ... -150 : -99 : 50 , ... 8000 : 9001 : 1000])) array([[[ 64.07334877, 74.06368256], [ 108.07548412, 127.99022654]], [[ 66.12443902, 76.87897353], [ 114.70165583, 137.90124779]]]) """ raise NotImplementedError def npv(rate, values): """Returns the NPV (Net Present Value) of a cash flow series. Parameters ---------- rate : scalar The discount rate. values : array_like, shape(M, ) The values of the time series of cash flows. The (fixed) time interval between cash flow "events" must be the same as that for which `rate` is given (i.e., if `rate` is per year, then precisely a year is understood to elapse between each cash flow event). By convention, investments or "deposits" are negative, income or "withdrawals" are positive; `values` must begin with the initial investment, thus `values[0]` will typically be negative. Returns ------- out : float The NPV of the input cash flow series `values` at the discount `rate`. Notes ----- Returns the result of: [G]_ .. math :: \sum_{t=0}^M{\frac{values_t}{(1+rate)^{t}}} References ---------- .. [G] L. J. Gitman, "Principles of Managerial Finance, Brief," 3rd ed., Addison-Wesley, 2003, pg. 346. Examples -------- >>> np.npv(0.281,[-100, 39, 59, 55, 20]) -0.0066187288356340801 (Compare with the Example given for numpy.lib.financial.irr) """ raise NotImplementedError def obj2sctype(rep, default=None): """Return the scalar dtype or NumPy equivalent of Python type of an object. Parameters ---------- rep : any The object of which the type is returned. default : any, optional If given, this is returned for objects whose types can not be determined. If not given, None is returned for those objects. Returns ------- dtype : dtype or Python type The data type of `rep`. See Also -------- sctype2char, issctype, issubsctype, issubdtype, maximum_sctype Examples -------- >>> np.obj2sctype(np.int32) >>> np.obj2sctype(np.array([1., 2.])) >>> np.obj2sctype(np.array([1.j])) >>> np.obj2sctype(dict) >>> np.obj2sctype('string') >>> np.obj2sctype(1, default=list) """ raise NotImplementedError def outer(a, b): """Compute the outer product of two vectors. Given two vectors, ``a = [a0, a1, ..., aM]`` and ``b = [b0, b1, ..., bN]``, the outer product [1]_ is:: [[a0*b0 a0*b1 ... a0*bN ] [a1*b0 . [ ... . [aM*b0 aM*bN ]] Parameters ---------- a, b : array_like, shape (M,), (N,) First and second input vectors. Inputs are flattened if they are not already 1-dimensional. Returns ------- out : ndarray, shape (M, N) ``out[i, j] = a[i] * b[j]`` See also -------- inner, einsum References ---------- .. [1] : G. H. Golub and C. F. van Loan, *Matrix Computations*, 3rd ed., Baltimore, MD, Johns Hopkins University Press, 1996, pg. 8. Examples -------- Make a (*very* coarse) grid for computing a Mandelbrot set: >>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5)) >>> rl array([[-2., -1., 0., 1., 2.], [-2., -1., 0., 1., 2.], [-2., -1., 0., 1., 2.], [-2., -1., 0., 1., 2.], [-2., -1., 0., 1., 2.]]) >>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,))) >>> im array([[ 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j], [ 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j], [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j], [ 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j], [ 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]]) >>> grid = rl + im >>> grid array([[-2.+2.j, -1.+2.j, 0.+2.j, 1.+2.j, 2.+2.j], [-2.+1.j, -1.+1.j, 0.+1.j, 1.+1.j, 2.+1.j], [-2.+0.j, -1.+0.j, 0.+0.j, 1.+0.j, 2.+0.j], [-2.-1.j, -1.-1.j, 0.-1.j, 1.-1.j, 2.-1.j], [-2.-2.j, -1.-2.j, 0.-2.j, 1.-2.j, 2.-2.j]]) An example using a "vector" of letters: >>> x = np.array(['a', 'b', 'c'], dtype=object) >>> np.outer(x, [1, 2, 3]) array([[a, aa, aaa], [b, bb, bbb], [c, cc, ccc]], dtype=object) """ raise NotImplementedError def packbits(myarray, axis=None): """packbits(myarray, axis=None) Packs the elements of a binary-valued array into bits in a uint8 array. The result is padded to full bytes by inserting zero bits at the end. Parameters ---------- myarray : array_like An integer type array whose elements should be packed to bits. axis : int, optional The dimension over which bit-packing is done. ``None`` implies packing the flattened array. Returns ------- packed : ndarray Array of type uint8 whose elements represent bits corresponding to the logical (0 or nonzero) value of the input elements. The shape of `packed` has the same number of dimensions as the input (unless `axis` is None, in which case the output is 1-D). See Also -------- unpackbits: Unpacks elements of a uint8 array into a binary-valued output array. Examples -------- >>> a = np.array([[[1,0,1], ... [0,1,0]], ... [[1,1,0], ... [0,0,1]]]) >>> b = np.packbits(a, axis=-1) >>> b array([[[160],[64]],[[192],[32]]], dtype=uint8) Note that in binary 160 = 1010 0000, 64 = 0100 0000, 192 = 1100 0000, and 32 = 0010 0000. """ # BUILTIN raise NotImplementedError def percentile(a, q, axis=None, out=None, overwrite_input=False): """Compute the qth percentile of the data along the specified axis. Returns the qth percentile of the array elements. Parameters ---------- a : array_like Input array or object that can be converted to an array. q : float in range of [0,100] (or sequence of floats) Percentile to compute which must be between 0 and 100 inclusive. axis : int, optional Axis along which the percentiles are computed. The default (None) is to compute the median along a flattened version of the array. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type (of the output) will be cast if necessary. overwrite_input : bool, optional If True, then allow use of memory of input array `a` for calculations. The input array will be modified by the call to median. This will save memory when you do not need to preserve the contents of the input array. Treat the input as undefined, but it will probably be fully or partially sorted. Default is False. Note that, if `overwrite_input` is True and the input is not already an array, an error will be raised. Returns ------- pcntile : ndarray A new array holding the result (unless `out` is specified, in which case that array is returned instead). If the input contains integers, or floats of smaller precision than 64, then the output data-type is float64. Otherwise, the output data-type is the same as that of the input. See Also -------- mean, median Notes ----- Given a vector V of length N, the qth percentile of V is the qth ranked value in a sorted copy of V. A weighted average of the two nearest neighbors is used if the normalized ranking does not match q exactly. The same as the median if ``q=0.5``, the same as the minimum if ``q=0`` and the same as the maximum if ``q=1``. Examples -------- >>> a = np.array([[10, 7, 4], [3, 2, 1]]) >>> a array([[10, 7, 4], [ 3, 2, 1]]) >>> np.percentile(a, 50) 3.5 >>> np.percentile(a, 0.5, axis=0) array([ 6.5, 4.5, 2.5]) >>> np.percentile(a, 50, axis=1) array([ 7., 2.]) >>> m = np.percentile(a, 50, axis=0) >>> out = np.zeros_like(m) >>> np.percentile(a, 50, axis=0, out=m) array([ 6.5, 4.5, 2.5]) >>> m array([ 6.5, 4.5, 2.5]) >>> b = a.copy() >>> np.percentile(b, 50, axis=1, overwrite_input=True) array([ 7., 2.]) >>> assert not np.all(a==b) >>> b = a.copy() >>> np.percentile(b, 50, axis=None, overwrite_input=True) 3.5 """ raise NotImplementedError def piecewise(x, condlist, funclist): """Evaluate a piecewise-defined function. Given a set of conditions and corresponding functions, evaluate each function on the input data wherever its condition is true. Parameters ---------- x : ndarray The input domain. condlist : list of bool arrays Each boolean array corresponds to a function in `funclist`. Wherever `condlist[i]` is True, `funclist[i](x)` is used as the output value. Each boolean array in `condlist` selects a piece of `x`, and should therefore be of the same shape as `x`. The length of `condlist` must correspond to that of `funclist`. If one extra function is given, i.e. if ``len(funclist) - len(condlist) == 1``, then that extra function is the default value, used wherever all conditions are false. funclist : list of callables, f(x,*args,**kw), or scalars Each function is evaluated over `x` wherever its corresponding condition is True. It should take an array as input and give an array or a scalar value as output. If, instead of a callable, a scalar is provided then a constant function (``lambda x: scalar``) is assumed. args : tuple, optional Any further arguments given to `piecewise` are passed to the functions upon execution, i.e., if called ``piecewise(..., ..., 1, 'a')``, then each function is called as ``f(x, 1, 'a')``. kw : dict, optional Keyword arguments used in calling `piecewise` are passed to the functions upon execution, i.e., if called ``piecewise(..., ..., lambda=1)``, then each function is called as ``f(x, lambda=1)``. Returns ------- out : ndarray The output is the same shape and type as x and is found by calling the functions in `funclist` on the appropriate portions of `x`, as defined by the boolean arrays in `condlist`. Portions not covered by any condition have undefined values. See Also -------- choose, select, where Notes ----- This is similar to choose or select, except that functions are evaluated on elements of `x` that satisfy the corresponding condition from `condlist`. The result is:: |-- |funclist[0](x[condlist[0]]) out = |funclist[1](x[condlist[1]]) |... |funclist[n2](x[condlist[n2]]) |-- Examples -------- Define the sigma function, which is -1 for ``x < 0`` and +1 for ``x >= 0``. >>> x = np.arange(6) - 2.5 >>> np.piecewise(x, [x < 0, x >= 0], [-1, 1]) array([-1., -1., -1., 1., 1., 1.]) Define the absolute value, which is ``-x`` for ``x <0`` and ``x`` for ``x >= 0``. >>> np.piecewise(x, [x < 0, x >= 0], [lambda x: -x, lambda x: x]) array([ 2.5, 1.5, 0.5, 0.5, 1.5, 2.5]) """ raise NotImplementedError def pkgload(): """Load one or more packages into parent package top-level namespace. This function is intended to shorten the need to import many subpackages, say of scipy, constantly with statements such as import scipy.linalg, scipy.fftpack, scipy.etc... Instead, you can say: import scipy scipy.pkgload('linalg','fftpack',...) or scipy.pkgload() to load all of them in one call. If a name which doesn't exist in scipy's namespace is given, a warning is shown. Parameters ---------- *packages : arg-tuple the names (one or more strings) of all the modules one wishes to load into the top-level namespace. verbose= : integer verbosity level [default: -1]. verbose=-1 will suspend also warnings. force= : bool when True, force reloading loaded packages [default: False]. postpone= : bool when True, don't load packages [default: False] """ raise NotImplementedError def place(arr, mask, vals): """Change elements of an array based on conditional and input values. Similar to ``np.putmask(arr, mask, vals)``, the difference is that `place` uses the first N elements of `vals`, where N is the number of True values in `mask`, while `putmask` uses the elements where `mask` is True. Note that `extract` does the exact opposite of `place`. Parameters ---------- arr : array_like Array to put data into. mask : array_like Boolean mask array. Must have the same size as `a`. vals : 1-D sequence Values to put into `a`. Only the first N elements are used, where N is the number of True values in `mask`. If `vals` is smaller than N it will be repeated. See Also -------- putmask, put, take, extract Examples -------- >>> arr = np.arange(6).reshape(2, 3) >>> np.place(arr, arr>2, [44, 55]) >>> arr array([[ 0, 1, 2], [44, 55, 44]]) """ raise NotImplementedError def pmt(rate, nper, pv, fv=0, when='end'): """Compute the payment against loan principal plus interest. Given: * a present value, `pv` (e.g., an amount borrowed) * a future value, `fv` (e.g., 0) * an interest `rate` compounded once per period, of which there are * `nper` total * and (optional) specification of whether payment is made at the beginning (`when` = {'begin', 1}) or the end (`when` = {'end', 0}) of each period Return: the (fixed) periodic payment. Parameters ---------- rate : array_like Rate of interest (per period) nper : array_like Number of compounding periods pv : array_like Present value fv : array_like (optional) Future value (default = 0) when : {{'begin', 1}, {'end', 0}}, {string, int} When payments are due ('begin' (1) or 'end' (0)) Returns ------- out : ndarray Payment against loan plus interest. If all input is scalar, returns a scalar float. If any input is array_like, returns payment for each input element. If multiple inputs are array_like, they all must have the same shape. Notes ----- The payment is computed by solving the equation:: fv + pv*(1 + rate)**nper + pmt*(1 + rate*when)/rate*((1 + rate)**nper - 1) == 0 or, when ``rate == 0``:: fv + pv + pmt * nper == 0 for ``pmt``. Note that computing a monthly mortgage payment is only one use for this function. For example, pmt returns the periodic deposit one must make to achieve a specified future balance given an initial deposit, a fixed, periodically compounded interest rate, and the total number of periods. References ---------- .. [WRW] Wheeler, D. A., E. Rathke, and R. Weir (Eds.) (2009, May). Open Document Format for Office Applications (OpenDocument)v1.2, Part 2: Recalculated Formula (OpenFormula) Format - Annotated Version, Pre-Draft 12. Organization for the Advancement of Structured Information Standards (OASIS). Billerica, MA, USA. [ODT Document]. Available: http://www.oasis-open.org/committees/documents.php ?wg_abbrev=office-formulaOpenDocument-formula-20090508.odt Examples -------- What is the monthly payment needed to pay off a $200,000 loan in 15 years at an annual interest rate of 7.5%? >>> np.pmt(0.075/12, 12*15, 200000) -1854.0247200054619 In order to pay-off (i.e., have a future-value of 0) the $200,000 obtained today, a monthly payment of $1,854.02 would be required. Note that this example illustrates usage of `fv` having a default value of 0. """ raise NotImplementedError def poly(seq_of_zeros): """Find the coefficients of a polynomial with the given sequence of roots. Returns the coefficients of the polynomial whose leading coefficient is one for the given sequence of zeros (multiple roots must be included in the sequence as many times as their multiplicity; see Examples). A square matrix (or array, which will be treated as a matrix) can also be given, in which case the coefficients of the characteristic polynomial of the matrix are returned. Parameters ---------- seq_of_zeros : array_like, shape (N,) or (N, N) A sequence of polynomial roots, or a square array or matrix object. Returns ------- c : ndarray 1D array of polynomial coefficients from highest to lowest degree: ``c[0] * x**(N) + c[1] * x**(N-1) + ... + c[N-1] * x + c[N]`` where c[0] always equals 1. Raises ------ ValueError If input is the wrong shape (the input must be a 1-D or square 2-D array). See Also -------- polyval : Evaluate a polynomial at a point. roots : Return the roots of a polynomial. polyfit : Least squares polynomial fit. poly1d : A one-dimensional polynomial class. Notes ----- Specifying the roots of a polynomial still leaves one degree of freedom, typically represented by an undetermined leading coefficient. [1]_ In the case of this function, that coefficient - the first one in the returned array - is always taken as one. (If for some reason you have one other point, the only automatic way presently to leverage that information is to use ``polyfit``.) The characteristic polynomial, :math:`p_a(t)`, of an `n`-by-`n` matrix **A** is given by :math:`p_a(t) = \mathrm{det}(t\, \mathbf{I} - \mathbf{A})`, where **I** is the `n`-by-`n` identity matrix. [2]_ References ---------- .. [1] M. Sullivan and M. Sullivan, III, "Algebra and Trignometry, Enhanced With Graphing Utilities," Prentice-Hall, pg. 318, 1996. .. [2] G. Strang, "Linear Algebra and Its Applications, 2nd Edition," Academic Press, pg. 182, 1980. Examples -------- Given a sequence of a polynomial's zeros: >>> np.poly((0, 0, 0)) # Multiple root example array([1, 0, 0, 0]) The line above represents z**3 + 0*z**2 + 0*z + 0. >>> np.poly((-1./2, 0, 1./2)) array([ 1. , 0. , -0.25, 0. ]) The line above represents z**3 - z/4 >>> np.poly((np.random.random(1.)[0], 0, np.random.random(1.)[0])) array([ 1. , -0.77086955, 0.08618131, 0. ]) #random Given a square array object: >>> P = np.array([[0, 1./3], [-1./2, 0]]) >>> np.poly(P) array([ 1. , 0. , 0.16666667]) Or a square matrix object: >>> np.poly(np.matrix(P)) array([ 1. , 0. , 0.16666667]) Note how in all cases the leading coefficient is always 1. """ raise NotImplementedError def polyadd(a1, a2): """Find the sum of two polynomials. Returns the polynomial resulting from the sum of two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree. Parameters ---------- a1, a2 : array_like or poly1d object Input polynomials. Returns ------- out : ndarray or poly1d object The sum of the inputs. If either input is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree. See Also -------- poly1d : A one-dimensional polynomial class. poly, polyadd, polyder, polydiv, polyfit, polyint, polysub, polyval Examples -------- >>> np.polyadd([1, 2], [9, 5, 4]) array([9, 6, 6]) Using poly1d objects: >>> p1 = np.poly1d([1, 2]) >>> p2 = np.poly1d([9, 5, 4]) >>> print p1 1 x + 2 >>> print p2 2 9 x + 5 x + 4 >>> print np.polyadd(p1, p2) 2 9 x + 6 x + 6 """ raise NotImplementedError def polyder(p, m=1): """Return the derivative of the specified order of a polynomial. Parameters ---------- p : poly1d or sequence Polynomial to differentiate. A sequence is interpreted as polynomial coefficients, see `poly1d`. m : int, optional Order of differentiation (default: 1) Returns ------- der : poly1d A new polynomial representing the derivative. See Also -------- polyint : Anti-derivative of a polynomial. poly1d : Class for one-dimensional polynomials. Examples -------- The derivative of the polynomial :math:`x^3 + x^2 + x^1 + 1` is: >>> p = np.poly1d([1,1,1,1]) >>> p2 = np.polyder(p) >>> p2 poly1d([3, 2, 1]) which evaluates to: >>> p2(2.) 17.0 We can verify this, approximating the derivative with ``(f(x + h) - f(x))/h``: >>> (p(2. + 0.001) - p(2.)) / 0.001 17.007000999997857 The fourth-order derivative of a 3rd-order polynomial is zero: >>> np.polyder(p, 2) poly1d([6, 2]) >>> np.polyder(p, 3) poly1d([6]) >>> np.polyder(p, 4) poly1d([ 0.]) """ raise NotImplementedError def polydiv(u, v): """Returns the quotient and remainder of polynomial division. The input arrays are the coefficients (including any coefficients equal to zero) of the "numerator" (dividend) and "denominator" (divisor) polynomials, respectively. Parameters ---------- u : array_like or poly1d Dividend polynomial's coefficients. v : array_like or poly1d Divisor polynomial's coefficients. Returns ------- q : ndarray Coefficients, including those equal to zero, of the quotient. r : ndarray Coefficients, including those equal to zero, of the remainder. See Also -------- poly, polyadd, polyder, polydiv, polyfit, polyint, polymul, polysub, polyval Notes ----- Both `u` and `v` must be 0-d or 1-d (ndim = 0 or 1), but `u.ndim` need not equal `v.ndim`. In other words, all four possible combinations - ``u.ndim = v.ndim = 0``, ``u.ndim = v.ndim = 1``, ``u.ndim = 1, v.ndim = 0``, and ``u.ndim = 0, v.ndim = 1`` - work. Examples -------- .. math:: \frac{3x^2 + 5x + 2}{2x + 1} = 1.5x + 1.75, remainder 0.25 >>> x = np.array([3.0, 5.0, 2.0]) >>> y = np.array([2.0, 1.0]) >>> np.polydiv(x, y) (array([ 1.5 , 1.75]), array([ 0.25])) """ raise NotImplementedError def polyfit(x, y, deg, rcond=None, full=False): """Least squares polynomial fit. Fit a polynomial ``p(x) = p[0] * x**deg + ... + p[deg]`` of degree `deg` to points `(x, y)`. Returns a vector of coefficients `p` that minimises the squared error. Parameters ---------- x : array_like, shape (M,) x-coordinates of the M sample points ``(x[i], y[i])``. y : array_like, shape (M,) or (M, K) y-coordinates of the sample points. Several data sets of sample points sharing the same x-coordinates can be fitted at once by passing in a 2D-array that contains one dataset per column. deg : int Degree of the fitting polynomial rcond : float, optional Relative condition number of the fit. Singular values smaller than this relative to the largest singular value will be ignored. The default value is len(x)*eps, where eps is the relative precision of the float type, about 2e-16 in most cases. full : bool, optional Switch determining nature of return value. When it is False (the default) just the coefficients are returned, when True diagnostic information from the singular value decomposition is also returned. Returns ------- p : ndarray, shape (M,) or (M, K) Polynomial coefficients, highest power first. If `y` was 2-D, the coefficients for `k`-th data set are in ``p[:,k]``. residuals, rank, singular_values, rcond : present only if `full` = True Residuals of the least-squares fit, the effective rank of the scaled Vandermonde coefficient matrix, its singular values, and the specified value of `rcond`. For more details, see `linalg.lstsq`. Warns ----- RankWarning The rank of the coefficient matrix in the least-squares fit is deficient. The warning is only raised if `full` = False. The warnings can be turned off by >>> import warnings >>> warnings.simplefilter('ignore', np.RankWarning) See Also -------- polyval : Computes polynomial values. linalg.lstsq : Computes a least-squares fit. scipy.interpolate.UnivariateSpline : Computes spline fits. Notes ----- The solution minimizes the squared error .. math :: E = \sum_{j=0}^k |p(x_j) - y_j|^2 in the equations:: x[0]**n * p[n] + ... + x[0] * p[1] + p[0] = y[0] x[1]**n * p[n] + ... + x[1] * p[1] + p[0] = y[1] ... x[k]**n * p[n] + ... + x[k] * p[1] + p[0] = y[k] The coefficient matrix of the coefficients `p` is a Vandermonde matrix. `polyfit` issues a `RankWarning` when the least-squares fit is badly conditioned. This implies that the best fit is not well-defined due to numerical error. The results may be improved by lowering the polynomial degree or by replacing `x` by `x` - `x`.mean(). The `rcond` parameter can also be set to a value smaller than its default, but the resulting fit may be spurious: including contributions from the small singular values can add numerical noise to the result. Note that fitting polynomial coefficients is inherently badly conditioned when the degree of the polynomial is large or the interval of sample points is badly centered. The quality of the fit should always be checked in these cases. When polynomial fits are not satisfactory, splines may be a good alternative. References ---------- .. [1] Wikipedia, "Curve fitting", http://en.wikipedia.org/wiki/Curve_fitting .. [2] Wikipedia, "Polynomial interpolation", http://en.wikipedia.org/wiki/Polynomial_interpolation Examples -------- >>> x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0]) >>> y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0]) >>> z = np.polyfit(x, y, 3) >>> z array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254]) It is convenient to use `poly1d` objects for dealing with polynomials: >>> p = np.poly1d(z) >>> p(0.5) 0.6143849206349179 >>> p(3.5) -0.34732142857143039 >>> p(10) 22.579365079365115 High-order polynomials may oscillate wildly: >>> p30 = np.poly1d(np.polyfit(x, y, 30)) /... RankWarning: Polyfit may be poorly conditioned... >>> p30(4) -0.80000000000000204 >>> p30(5) -0.99999999999999445 >>> p30(4.5) -0.10547061179440398 Illustration: >>> import matplotlib.pyplot as plt >>> xp = np.linspace(-2, 6, 100) >>> plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '--') [, , ] >>> plt.ylim(-2,2) (-2, 2) >>> plt.show() """ raise NotImplementedError def polyint(p, m=1, k=None): """Return an antiderivative (indefinite integral) of a polynomial. The returned order `m` antiderivative `P` of polynomial `p` satisfies :math:`\frac{d^m}{dx^m}P(x) = p(x)` and is defined up to `m - 1` integration constants `k`. The constants determine the low-order polynomial part .. math:: \frac{k_{m-1}}{0!} x^0 + \ldots + \frac{k_0}{(m-1)!}x^{m-1} of `P` so that :math:`P^{(j)}(0) = k_{m-j-1}`. Parameters ---------- p : {array_like, poly1d} Polynomial to differentiate. A sequence is interpreted as polynomial coefficients, see `poly1d`. m : int, optional Order of the antiderivative. (Default: 1) k : {None, list of `m` scalars, scalar}, optional Integration constants. They are given in the order of integration: those corresponding to highest-order terms come first. If ``None`` (default), all constants are assumed to be zero. If `m = 1`, a single scalar can be given instead of a list. See Also -------- polyder : derivative of a polynomial poly1d.integ : equivalent method Examples -------- The defining property of the antiderivative: >>> p = np.poly1d([1,1,1]) >>> P = np.polyint(p) >>> P poly1d([ 0.33333333, 0.5 , 1. , 0. ]) >>> np.polyder(P) == p True The integration constants default to zero, but can be specified: >>> P = np.polyint(p, 3) >>> P(0) 0.0 >>> np.polyder(P)(0) 0.0 >>> np.polyder(P, 2)(0) 0.0 >>> P = np.polyint(p, 3, k=[6,5,3]) >>> P poly1d([ 0.01666667, 0.04166667, 0.16666667, 3. , 5. , 3. ]) Note that 3 = 6 / 2!, and that the constants are given in the order of integrations. Constant of the highest-order polynomial term comes first: >>> np.polyder(P, 2)(0) 6.0 >>> np.polyder(P, 1)(0) 5.0 >>> P(0) 3.0 """ raise NotImplementedError def polymul(a1, a2): """Find the product of two polynomials. Finds the polynomial resulting from the multiplication of the two input polynomials. Each input must be either a poly1d object or a 1D sequence of polynomial coefficients, from highest to lowest degree. Parameters ---------- a1, a2 : array_like or poly1d object Input polynomials. Returns ------- out : ndarray or poly1d object The polynomial resulting from the multiplication of the inputs. If either inputs is a poly1d object, then the output is also a poly1d object. Otherwise, it is a 1D array of polynomial coefficients from highest to lowest degree. See Also -------- poly1d : A one-dimensional polynomial class. poly, polyadd, polyder, polydiv, polyfit, polyint, polysub, polyval Examples -------- >>> np.polymul([1, 2, 3], [9, 5, 1]) array([ 9, 23, 38, 17, 3]) Using poly1d objects: >>> p1 = np.poly1d([1, 2, 3]) >>> p2 = np.poly1d([9, 5, 1]) >>> print p1 2 1 x + 2 x + 3 >>> print p2 2 9 x + 5 x + 1 >>> print np.polymul(p1, p2) 4 3 2 9 x + 23 x + 38 x + 17 x + 3 """ raise NotImplementedError def polysub(a1, a2): """Difference (subtraction) of two polynomials. Given two polynomials `a1` and `a2`, returns ``a1 - a2``. `a1` and `a2` can be either array_like sequences of the polynomials' coefficients (including coefficients equal to zero), or `poly1d` objects. Parameters ---------- a1, a2 : array_like or poly1d Minuend and subtrahend polynomials, respectively. Returns ------- out : ndarray or poly1d Array or `poly1d` object of the difference polynomial's coefficients. See Also -------- polyval, polydiv, polymul, polyadd Examples -------- .. math:: (2 x^2 + 10 x - 2) - (3 x^2 + 10 x -4) = (-x^2 + 2) >>> np.polysub([2, 10, -2], [3, 10, -4]) array([-1, 0, 2]) """ raise NotImplementedError def polyval(p, x): """Evaluate a polynomial at specific values. If `p` is of length N, this function returns the value: ``p[0]*x**(N-1) + p[1]*x**(N-2) + ... + p[N-2]*x + p[N-1]`` If `x` is a sequence, then `p(x)` is returned for each element of `x`. If `x` is another polynomial then the composite polynomial `p(x(t))` is returned. Parameters ---------- p : array_like or poly1d object 1D array of polynomial coefficients (including coefficients equal to zero) from highest degree to the constant term, or an instance of poly1d. x : array_like or poly1d object A number, a 1D array of numbers, or an instance of poly1d, "at" which to evaluate `p`. Returns ------- values : ndarray or poly1d If `x` is a poly1d instance, the result is the composition of the two polynomials, i.e., `x` is "substituted" in `p` and the simplified result is returned. In addition, the type of `x` - array_like or poly1d - governs the type of the output: `x` array_like => `values` array_like, `x` a poly1d object => `values` is also. See Also -------- poly1d: A polynomial class. Notes ----- Horner's scheme [1]_ is used to evaluate the polynomial. Even so, for polynomials of high degree the values may be inaccurate due to rounding errors. Use carefully. References ---------- .. [1] I. N. Bronshtein, K. A. Semendyayev, and K. A. Hirsch (Eng. trans. Ed.), *Handbook of Mathematics*, New York, Van Nostrand Reinhold Co., 1985, pg. 720. Examples -------- >>> np.polyval([3,0,1], 5) # 3 * 5**2 + 0 * 5**1 + 1 76 >>> np.polyval([3,0,1], np.poly1d(5)) poly1d([ 76.]) >>> np.polyval(np.poly1d([3,0,1]), 5) 76 >>> np.polyval(np.poly1d([3,0,1]), np.poly1d(5)) poly1d([ 76.]) """ raise NotImplementedError def ppmt(rate, per, nper, pv, fv=0.0, when='end'): """Not implemented. Compute the payment against loan principal. Parameters ---------- rate : array_like Rate of interest (per period) per : array_like, int Amount paid against the loan changes. The `per` is the period of interest. nper : array_like Number of compounding periods pv : array_like Present value fv : array_like, optional Future value when : {{'begin', 1}, {'end', 0}}, {string, int} When payments are due ('begin' (1) or 'end' (0)) See Also -------- pmt, pv, ipmt """ raise NotImplementedError def prod(a, axis=None, dtype=None, out=None): """Return the product of array elements over a given axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis over which the product is taken. By default, the product of all elements is calculated. dtype : data-type, optional The data-type of the returned array, as well as of the accumulator in which the elements are multiplied. By default, if `a` is of integer type, `dtype` is the default platform integer. (Note: if the type of `a` is unsigned, then so is `dtype`.) Otherwise, the dtype is the same as that of `a`. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary. Returns ------- product_along_axis : ndarray, see `dtype` parameter above. An array shaped as `a` but with the specified axis removed. Returns a reference to `out` if specified. See Also -------- ndarray.prod : equivalent method numpy.doc.ufuncs : Section "Output arguments" Notes ----- Arithmetic is modular when using integer types, and no error is raised on overflow. That means that, on a 32-bit platform: >>> x = np.array([536870910, 536870910, 536870910, 536870910]) >>> np.prod(x) #random 16 Examples -------- By default, calculate the product of all elements: >>> np.prod([1.,2.]) 2.0 Even when the input array is two-dimensional: >>> np.prod([[1.,2.],[3.,4.]]) 24.0 But we can also specify the axis over which to multiply: >>> np.prod([[1.,2.],[3.,4.]], axis=1) array([ 2., 12.]) If the type of `x` is unsigned, then the output type is the unsigned platform integer: >>> x = np.array([1, 2, 3], dtype=np.uint8) >>> np.prod(x).dtype == np.uint True If `x` is of a signed integer type, then the output type is the default platform integer: >>> x = np.array([1, 2, 3], dtype=np.int8) >>> np.prod(x).dtype == np.int True """ raise NotImplementedError def product(a, axis=None, dtype=None, out=None): """Return the product of array elements over a given axis. See Also -------- prod : equivalent function; see for details. """ raise NotImplementedError def promote_types(type1, type2): """promote_types(type1, type2) Returns the data type with the smallest size and smallest scalar kind to which both ``type1`` and ``type2`` may be safely cast. The returned data type is always in native byte order. This function is symmetric and associative. Parameters ---------- type1 : dtype or dtype specifier First data type. type2 : dtype or dtype specifier Second data type. Returns ------- out : dtype The promoted data type. Notes ----- .. versionadded:: 1.6.0 See Also -------- result_type, dtype, can_cast Examples -------- >>> np.promote_types('f4', 'f8') dtype('float64') >>> np.promote_types('i8', 'f4') dtype('float64') >>> np.promote_types('>i8', '>> np.promote_types('i1', 'S8') Traceback (most recent call last): File "", line 1, in TypeError: invalid type promotion """ # BUILTIN raise NotImplementedError def ptp(a, axis=None, out=None): """Range of values (maximum - minimum) along an axis. The name of the function comes from the acronym for 'peak to peak'. Parameters ---------- a : array_like Input values. axis : int, optional Axis along which to find the peaks. By default, flatten the array. out : array_like Alternative output array in which to place the result. It must have the same shape and buffer length as the expected output, but the type of the output values will be cast if necessary. Returns ------- ptp : ndarray A new array holding the result, unless `out` was specified, in which case a reference to `out` is returned. Examples -------- >>> x = np.arange(4).reshape((2,2)) >>> x array([[0, 1], [2, 3]]) >>> np.ptp(x, axis=0) array([2, 2]) >>> np.ptp(x, axis=1) array([1, 1]) """ raise NotImplementedError def put(a, ind, v, mode='raise'): """Replaces specified elements of an array with given values. The indexing works on the flattened target array. `put` is roughly equivalent to: :: a.flat[ind] = v Parameters ---------- a : ndarray Target array. ind : array_like Target indices, interpreted as integers. v : array_like Values to place in `a` at target indices. If `v` is shorter than `ind` it will be repeated as necessary. mode : {'raise', 'wrap', 'clip'}, optional Specifies how out-of-bounds indices will behave. * 'raise' -- raise an error (default) * 'wrap' -- wrap around * 'clip' -- clip to the range 'clip' mode means that all indices that are too large are replaced by the index that addresses the last element along that axis. Note that this disables indexing with negative numbers. See Also -------- putmask, place Examples -------- >>> a = np.arange(5) >>> np.put(a, [0, 2], [-44, -55]) >>> a array([-44, 1, -55, 3, 4]) >>> a = np.arange(5) >>> np.put(a, 22, -5, mode='clip') >>> a array([ 0, 1, 2, 3, -5]) """ raise NotImplementedError def putmask(a, mask, values): """putmask(a, mask, values) Changes elements of an array based on conditional and input values. Sets ``a.flat[n] = values[n]`` for each n where ``mask.flat[n]==True``. If `values` is not the same size as `a` and `mask` then it will repeat. This gives behavior different from ``a[mask] = values``. Parameters ---------- a : array_like Target array. mask : array_like Boolean mask array. It has to be the same shape as `a`. values : array_like Values to put into `a` where `mask` is True. If `values` is smaller than `a` it will be repeated. See Also -------- place, put, take Examples -------- >>> x = np.arange(6).reshape(2, 3) >>> np.putmask(x, x>2, x**2) >>> x array([[ 0, 1, 2], [ 9, 16, 25]]) If `values` is smaller than `a` it is repeated: >>> x = np.arange(5) >>> np.putmask(x, x>1, [-33, -44]) >>> x array([ 0, 1, -33, -44, -33]) """ # BUILTIN raise NotImplementedError def pv(rate, nper, pmt, fv=0.0, when='end'): """Compute the present value. Given: * a future value, `fv` * an interest `rate` compounded once per period, of which there are * `nper` total * a (fixed) payment, `pmt`, paid either * at the beginning (`when` = {'begin', 1}) or the end (`when` = {'end', 0}) of each period Return: the value now Parameters ---------- rate : array_like Rate of interest (per period) nper : array_like Number of compounding periods pmt : array_like Payment fv : array_like, optional Future value when : {{'begin', 1}, {'end', 0}}, {string, int}, optional When payments are due ('begin' (1) or 'end' (0)) Returns ------- out : ndarray, float Present value of a series of payments or investments. Notes ----- The present value is computed by solving the equation:: fv + pv*(1 + rate)**nper + pmt*(1 + rate*when)/rate*((1 + rate)**nper - 1) = 0 or, when ``rate = 0``:: fv + pv + pmt * nper = 0 for `pv`, which is then returned. References ---------- .. [WRW] Wheeler, D. A., E. Rathke, and R. Weir (Eds.) (2009, May). Open Document Format for Office Applications (OpenDocument)v1.2, Part 2: Recalculated Formula (OpenFormula) Format - Annotated Version, Pre-Draft 12. Organization for the Advancement of Structured Information Standards (OASIS). Billerica, MA, USA. [ODT Document]. Available: http://www.oasis-open.org/committees/documents.php?wg_abbrev=office-formula OpenDocument-formula-20090508.odt Examples -------- What is the present value (e.g., the initial investment) of an investment that needs to total $15692.93 after 10 years of saving $100 every month? Assume the interest rate is 5% (annually) compounded monthly. >>> np.pv(0.05/12, 10*12, -100, 15692.93) -100.00067131625819 By convention, the negative sign represents cash flow out (i.e., money not available today). Thus, to end up with $15,692.93 in 10 years saving $100 a month at 5% annual interest, one's initial deposit should also be $100. If any input is array_like, ``pv`` returns an array of equal shape. Let's compare different interest rates in the example above: >>> a = np.array((0.05, 0.04, 0.03))/12 >>> np.pv(a, 10*12, -100, 15692.93) array([ -100.00067132, -649.26771385, -1273.78633713]) So, to end up with the same $15692.93 under the same $100 per month "savings plan," for annual interest rates of 4% and 3%, one would need initial investments of $649.27 and $1273.79, respectively. """ raise NotImplementedError def rank(a): """Return the number of dimensions of an array. If `a` is not already an array, a conversion is attempted. Scalars are zero dimensional. Parameters ---------- a : array_like Array whose number of dimensions is desired. If `a` is not an array, a conversion is attempted. Returns ------- number_of_dimensions : int The number of dimensions in the array. See Also -------- ndim : equivalent function ndarray.ndim : equivalent property shape : dimensions of array ndarray.shape : dimensions of array Notes ----- In the old Numeric package, `rank` was the term used for the number of dimensions, but in Numpy `ndim` is used instead. Examples -------- >>> np.rank([1,2,3]) 1 >>> np.rank(np.array([[1,2,3],[4,5,6]])) 2 >>> np.rank(1) 0 """ raise NotImplementedError def rate(nper, pmt, pv, fv, when='end', guess=0.1, tol=1e-06, maxiter=100): """Compute the rate of interest per period. Parameters ---------- nper : array_like Number of compounding periods pmt : array_like Payment pv : array_like Present value fv : array_like Future value when : {{'begin', 1}, {'end', 0}}, {string, int}, optional When payments are due ('begin' (1) or 'end' (0)) guess : float, optional Starting guess for solving the rate of interest tol : float, optional Required tolerance for the solution maxiter : int, optional Maximum iterations in finding the solution Notes ----- The rate of interest is computed by iteratively solving the (non-linear) equation:: fv + pv*(1+rate)**nper + pmt*(1+rate*when)/rate * ((1+rate)**nper - 1) = 0 for ``rate``. References ---------- Wheeler, D. A., E. Rathke, and R. Weir (Eds.) (2009, May). Open Document Format for Office Applications (OpenDocument)v1.2, Part 2: Recalculated Formula (OpenFormula) Format - Annotated Version, Pre-Draft 12. Organization for the Advancement of Structured Information Standards (OASIS). Billerica, MA, USA. [ODT Document]. Available: http://www.oasis-open.org/committees/documents.php?wg_abbrev=office-formula OpenDocument-formula-20090508.odt """ raise NotImplementedError def ravel(a, order='C'): """Return a flattened array. A 1-D array, containing the elements of the input, is returned. A copy is made only if needed. Parameters ---------- a : array_like Input array. The elements in ``a`` are read in the order specified by `order`, and packed as a 1-D array. order : {'C','F', 'A', 'K'}, optional The elements of ``a`` are read in this order. 'C' means to view the elements in C (row-major) order. 'F' means to view the elements in Fortran (column-major) order. 'A' means to view the elements in 'F' order if a is Fortran contiguous, 'C' order otherwise. 'K' means to view the elements in the order they occur in memory, except for reversing the data when strides are negative. By default, 'C' order is used. Returns ------- 1d_array : ndarray Output of the same dtype as `a`, and of shape ``(a.size(),)``. See Also -------- ndarray.flat : 1-D iterator over an array. ndarray.flatten : 1-D array copy of the elements of an array in row-major order. Notes ----- In row-major order, the row index varies the slowest, and the column index the quickest. This can be generalized to multiple dimensions, where row-major order implies that the index along the first axis varies slowest, and the index along the last quickest. The opposite holds for Fortran-, or column-major, mode. Examples -------- It is equivalent to ``reshape(-1, order=order)``. >>> x = np.array([[1, 2, 3], [4, 5, 6]]) >>> print np.ravel(x) [1 2 3 4 5 6] >>> print x.reshape(-1) [1 2 3 4 5 6] >>> print np.ravel(x, order='F') [1 4 2 5 3 6] When ``order`` is 'A', it will preserve the array's 'C' or 'F' ordering: >>> print np.ravel(x.T) [1 4 2 5 3 6] >>> print np.ravel(x.T, order='A') [1 2 3 4 5 6] When ``order`` is 'K', it will preserve orderings that are neither 'C' nor 'F', but won't reverse axes: >>> a = np.arange(3)[::-1]; a array([2, 1, 0]) >>> a.ravel(order='C') array([2, 1, 0]) >>> a.ravel(order='K') array([2, 1, 0]) >>> a = np.arange(12).reshape(2,3,2).swapaxes(1,2); a array([[[ 0, 2, 4], [ 1, 3, 5]], [[ 6, 8, 10], [ 7, 9, 11]]]) >>> a.ravel(order='C') array([ 0, 2, 4, 1, 3, 5, 6, 8, 10, 7, 9, 11]) >>> a.ravel(order='K') array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) """ raise NotImplementedError def ravel_multi_index(multi_index, dims, mode='raise', order='C'): """ravel_multi_index(multi_index, dims, mode='raise', order='C') Converts a tuple of index arrays into an array of flat indices, applying boundary modes to the multi-index. Parameters ---------- multi_index : tuple of array_like A tuple of integer arrays, one array for each dimension. dims : tuple of ints The shape of array into which the indices from ``multi_index`` apply. mode : {'raise', 'wrap', 'clip'}, optional Specifies how out-of-bounds indices are handled. Can specify either one mode or a tuple of modes, one mode per index. * 'raise' -- raise an error (default) * 'wrap' -- wrap around * 'clip' -- clip to the range In 'clip' mode, a negative index which would normally wrap will clip to 0 instead. order : {'C', 'F'}, optional Determines whether the multi-index should be viewed as indexing in C (row-major) order or FORTRAN (column-major) order. Returns ------- raveled_indices : ndarray An array of indices into the flattened version of an array of dimensions ``dims``. See Also -------- unravel_index Notes ----- .. versionadded:: 1.6.0 Examples -------- >>> arr = np.array([[3,6,6],[4,5,1]]) >>> np.ravel_multi_index(arr, (7,6)) array([22, 41, 37]) >>> np.ravel_multi_index(arr, (7,6), order='F') array([31, 41, 13]) >>> np.ravel_multi_index(arr, (4,6), mode='clip') array([22, 23, 19]) >>> np.ravel_multi_index(arr, (4,4), mode=('clip','wrap')) array([12, 13, 13]) >>> np.ravel_multi_index((3,1,4,1), (6,7,8,9)) 1621 """ # BUILTIN raise NotImplementedError def real(val): """Return the real part of the elements of the array. Parameters ---------- val : array_like Input array. Returns ------- out : ndarray Output array. If `val` is real, the type of `val` is used for the output. If `val` has complex elements, the returned type is float. See Also -------- real_if_close, imag, angle Examples -------- >>> a = np.array([1+2j, 3+4j, 5+6j]) >>> a.real array([ 1., 3., 5.]) >>> a.real = 9 >>> a array([ 9.+2.j, 9.+4.j, 9.+6.j]) >>> a.real = np.array([9, 8, 7]) >>> a array([ 9.+2.j, 8.+4.j, 7.+6.j]) """ raise NotImplementedError def real_if_close(a, tol=100): """If complex input returns a real array if complex parts are close to zero. "Close to zero" is defined as `tol` * (machine epsilon of the type for `a`). Parameters ---------- a : array_like Input array. tol : float Tolerance in machine epsilons for the complex part of the elements in the array. Returns ------- out : ndarray If `a` is real, the type of `a` is used for the output. If `a` has complex elements, the returned type is float. See Also -------- real, imag, angle Notes ----- Machine epsilon varies from machine to machine and between data types but Python floats on most platforms have a machine epsilon equal to 2.2204460492503131e-16. You can use 'np.finfo(np.float).eps' to print out the machine epsilon for floats. Examples -------- >>> np.finfo(np.float).eps 2.2204460492503131e-16 >>> np.real_if_close([2.1 + 4e-14j], tol=1000) array([ 2.1]) >>> np.real_if_close([2.1 + 4e-13j], tol=1000) array([ 2.1 +4.00000000e-13j]) """ raise NotImplementedError def recfromcsv(fname): """Load ASCII data stored in a comma-separated file. The returned array is a record array (if ``usemask=False``, see `recarray`) or a masked record array (if ``usemask=True``, see `ma.mrecords.MaskedRecords`). For a complete description of all the input parameters, see `genfromtxt`. See Also -------- numpy.genfromtxt : generic function to load ASCII data. """ raise NotImplementedError def recfromtxt(fname): """Load ASCII data from a file and return it in a record array. If ``usemask=False`` a standard `recarray` is returned, if ``usemask=True`` a MaskedRecords array is returned. Complete description of all the optional input parameters is available in the docstring of the `genfromtxt` function. See Also -------- numpy.genfromtxt : generic function Notes ----- By default, `dtype` is None, which means that the data-type of the output array will be determined from the data. """ raise NotImplementedError def repeat(a, repeats, axis=None): """Repeat elements of an array. Parameters ---------- a : array_like Input array. repeats : {int, array of ints} The number of repetitions for each element. `repeats` is broadcasted to fit the shape of the given axis. axis : int, optional The axis along which to repeat values. By default, use the flattened input array, and return a flat output array. Returns ------- repeated_array : ndarray Output array which has the same shape as `a`, except along the given axis. See Also -------- tile : Tile an array. Examples -------- >>> x = np.array([[1,2],[3,4]]) >>> np.repeat(x, 2) array([1, 1, 2, 2, 3, 3, 4, 4]) >>> np.repeat(x, 3, axis=1) array([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]]) >>> np.repeat(x, [1, 2], axis=0) array([[1, 2], [3, 4], [3, 4]]) """ raise NotImplementedError def require(a, dtype=None, requirements=None): """Return an ndarray of the provided type that satisfies requirements. This function is useful to be sure that an array with the correct flags is returned for passing to compiled code (perhaps through ctypes). Parameters ---------- a : array_like The object to be converted to a type-and-requirement-satisfying array. dtype : data-type The required data-type, the default data-type is float64). requirements : str or list of str The requirements list can be any of the following * 'F_CONTIGUOUS' ('F') - ensure a Fortran-contiguous array * 'C_CONTIGUOUS' ('C') - ensure a C-contiguous array * 'ALIGNED' ('A') - ensure a data-type aligned array * 'WRITEABLE' ('W') - ensure a writable array * 'OWNDATA' ('O') - ensure an array that owns its own data See Also -------- asarray : Convert input to an ndarray. asanyarray : Convert to an ndarray, but pass through ndarray subclasses. ascontiguousarray : Convert input to a contiguous array. asfortranarray : Convert input to an ndarray with column-major memory order. ndarray.flags : Information about the memory layout of the array. Notes ----- The returned array will be guaranteed to have the listed requirements by making a copy if needed. Examples -------- >>> x = np.arange(6).reshape(2,3) >>> x.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : False WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False >>> y = np.require(x, dtype=np.float32, requirements=['A', 'O', 'W', 'F']) >>> y.flags C_CONTIGUOUS : False F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False """ raise NotImplementedError def reshape(a, newshape, order='C'): """Gives a new shape to an array without changing its data. Parameters ---------- a : array_like Array to be reshaped. newshape : int or tuple of ints The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions. order : {'C', 'F', 'A'}, optional Determines whether the array data should be viewed as in C (row-major) order, FORTRAN (column-major) order, or the C/FORTRAN order should be preserved. Returns ------- reshaped_array : ndarray This will be a new view object if possible; otherwise, it will be a copy. See Also -------- ndarray.reshape : Equivalent method. Notes ----- It is not always possible to change the shape of an array without copying the data. If you want an error to be raise if the data is copied, you should assign the new shape to the shape attribute of the array:: >>> a = np.zeros((10, 2)) # A transpose make the array non-contiguous >>> b = a.T # Taking a view makes it possible to modify the shape without modiying the # initial object. >>> c = b.view() >>> c.shape = (20) AttributeError: incompatible shape for a non-contiguous array Examples -------- >>> a = np.array([[1,2,3], [4,5,6]]) >>> np.reshape(a, 6) array([1, 2, 3, 4, 5, 6]) >>> np.reshape(a, 6, order='F') array([1, 4, 2, 5, 3, 6]) >>> np.reshape(a, (3,-1)) # the unspecified value is inferred to be 2 array([[1, 2], [3, 4], [5, 6]]) """ raise NotImplementedError def resize(a, new_shape): """Return a new array with the specified shape. If the new array is larger than the original array, then the new array is filled with repeated copies of `a`. Note that this behavior is different from a.resize(new_shape) which fills with zeros instead of repeated copies of `a`. Parameters ---------- a : array_like Array to be resized. new_shape : int or tuple of int Shape of resized array. Returns ------- reshaped_array : ndarray The new array is formed from the data in the old array, repeated if necessary to fill out the required number of elements. The data are repeated in the order that they are stored in memory. See Also -------- ndarray.resize : resize an array in-place. Examples -------- >>> a=np.array([[0,1],[2,3]]) >>> np.resize(a,(1,4)) array([[0, 1, 2, 3]]) >>> np.resize(a,(2,4)) array([[0, 1, 2, 3], [0, 1, 2, 3]]) """ raise NotImplementedError def restoredot(): """Restore `dot`, `vdot`, and `innerproduct` to the default non-BLAS implementations. Typically, the user will only need to call this when troubleshooting and installation problem, reproducing the conditions of a build without an accelerated BLAS, or when being very careful about benchmarking linear algebra operations. See Also -------- alterdot : `restoredot` undoes the effects of `alterdot`. """ # BUILTIN raise NotImplementedError def result_type(*arrays_and_dtypes): """result_type(*arrays_and_dtypes) Returns the type that results from applying the NumPy type promotion rules to the arguments. Type promotion in NumPy works similarly to the rules in languages like C++, with some slight differences. When both scalars and arrays are used, the array's type takes precedence and the actual value of the scalar is taken into account. For example, calculating 3*a, where a is an array of 32-bit floats, intuitively should result in a 32-bit float output. If the 3 is a 32-bit integer, the NumPy rules indicate it can't convert losslessly into a 32-bit float, so a 64-bit float should be the result type. By examining the value of the constant, '3', we see that it fits in an 8-bit integer, which can be cast losslessly into the 32-bit float. Parameters ---------- arrays_and_dtypes : list of arrays and dtypes The operands of some operation whose result type is needed. Returns ------- out : dtype The result type. See also -------- dtype, promote_types, min_scalar_type, can_cast Notes ----- .. versionadded:: 1.6.0 The specific algorithm used is as follows. Categories are determined by first checking which of boolean, integer (int/uint), or floating point (float/complex) the maximum kind of all the arrays and the scalars are. If there are only scalars or the maximum category of the scalars is higher than the maximum category of the arrays, the data types are combined with :func:`promote_types` to produce the return value. Otherwise, `min_scalar_type` is called on each array, and the resulting data types are all combined with :func:`promote_types` to produce the return value. The set of int values is not a subset of the uint values for types with the same number of bits, something not reflected in :func:`min_scalar_type`, but handled as a special case in `result_type`. Examples -------- >>> np.result_type(3, np.arange(7, dtype='i1')) dtype('int8') >>> np.result_type('i4', 'c8') dtype('complex128') >>> np.result_type(3.0, -2) dtype('float64') """ # BUILTIN raise NotImplementedError def roll(a, shift, axis=None): """Roll array elements along a given axis. Elements that roll beyond the last position are re-introduced at the first. Parameters ---------- a : array_like Input array. shift : int The number of places by which elements are shifted. axis : int, optional The axis along which elements are shifted. By default, the array is flattened before shifting, after which the original shape is restored. Returns ------- res : ndarray Output array, with the same shape as `a`. See Also -------- rollaxis : Roll the specified axis backwards, until it lies in a given position. Examples -------- >>> x = np.arange(10) >>> np.roll(x, 2) array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7]) >>> x2 = np.reshape(x, (2,5)) >>> x2 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> np.roll(x2, 1) array([[9, 0, 1, 2, 3], [4, 5, 6, 7, 8]]) >>> np.roll(x2, 1, axis=0) array([[5, 6, 7, 8, 9], [0, 1, 2, 3, 4]]) >>> np.roll(x2, 1, axis=1) array([[4, 0, 1, 2, 3], [9, 5, 6, 7, 8]]) """ raise NotImplementedError def rollaxis(a, axis, start=0): """Roll the specified axis backwards, until it lies in a given position. Parameters ---------- a : ndarray Input array. axis : int The axis to roll backwards. The positions of the other axes do not change relative to one another. start : int, optional The axis is rolled until it lies before this position. The default, 0, results in a "complete" roll. Returns ------- res : ndarray Output array. See Also -------- roll : Roll the elements of an array by a number of positions along a given axis. Examples -------- >>> a = np.ones((3,4,5,6)) >>> np.rollaxis(a, 3, 1).shape (3, 6, 4, 5) >>> np.rollaxis(a, 2).shape (5, 3, 4, 6) >>> np.rollaxis(a, 1, 4).shape (3, 5, 6, 4) """ raise NotImplementedError def roots(p): """Return the roots of a polynomial with coefficients given in p. The values in the rank-1 array `p` are coefficients of a polynomial. If the length of `p` is n+1 then the polynomial is described by:: p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n] Parameters ---------- p : array_like Rank-1 array of polynomial coefficients. Returns ------- out : ndarray An array containing the complex roots of the polynomial. Raises ------ ValueError : When `p` cannot be converted to a rank-1 array. See also -------- poly : Find the coefficients of a polynomial with a given sequence of roots. polyval : Evaluate a polynomial at a point. polyfit : Least squares polynomial fit. poly1d : A one-dimensional polynomial class. Notes ----- The algorithm relies on computing the eigenvalues of the companion matrix [1]_. References ---------- .. [1] R. A. Horn & C. R. Johnson, *Matrix Analysis*. Cambridge, UK: Cambridge University Press, 1999, pp. 146-7. Examples -------- >>> coeff = [3.2, 2, 1] >>> np.roots(coeff) array([-0.3125+0.46351241j, -0.3125-0.46351241j]) """ raise NotImplementedError def rot90(m, k=1): """Rotate an array by 90 degrees in the counter-clockwise direction. The first two dimensions are rotated; therefore, the array must be at least 2-D. Parameters ---------- m : array_like Array of two or more dimensions. k : integer Number of times the array is rotated by 90 degrees. Returns ------- y : ndarray Rotated array. See Also -------- fliplr : Flip an array horizontally. flipud : Flip an array vertically. Examples -------- >>> m = np.array([[1,2],[3,4]], int) >>> m array([[1, 2], [3, 4]]) >>> np.rot90(m) array([[2, 4], [1, 3]]) >>> np.rot90(m, 2) array([[4, 3], [2, 1]]) """ raise NotImplementedError def round(a, decimals=0, out=None): """Round an array to the given number of decimals. Refer to `around` for full documentation. See Also -------- around : equivalent function """ raise NotImplementedError def round_(a, decimals=0, out=None): """Round an array to the given number of decimals. Refer to `around` for full documentation. See Also -------- around : equivalent function """ raise NotImplementedError def row_stack(tup): """Stack arrays in sequence vertically (row wise). Take a sequence of arrays and stack them vertically to make a single array. Rebuild arrays divided by `vsplit`. Parameters ---------- tup : sequence of ndarrays Tuple containing arrays to be stacked. The arrays must have the same shape along all but the first axis. Returns ------- stacked : ndarray The array formed by stacking the given arrays. See Also -------- hstack : Stack arrays in sequence horizontally (column wise). dstack : Stack arrays in sequence depth wise (along third dimension). concatenate : Join a sequence of arrays together. vsplit : Split array into a list of multiple sub-arrays vertically. Notes ----- Equivalent to ``np.concatenate(tup, axis=0)`` Examples -------- >>> a = np.array([1, 2, 3]) >>> b = np.array([2, 3, 4]) >>> np.vstack((a,b)) array([[1, 2, 3], [2, 3, 4]]) >>> a = np.array([[1], [2], [3]]) >>> b = np.array([[2], [3], [4]]) >>> np.vstack((a,b)) array([[1], [2], [3], [2], [3], [4]]) """ raise NotImplementedError def safe_eval(source): """Protected string evaluation. Evaluate a string containing a Python literal expression without allowing the execution of arbitrary non-literal code. Parameters ---------- source : str The string to evaluate. Returns ------- obj : object The result of evaluating `source`. Raises ------ SyntaxError If the code has invalid Python syntax, or if it contains non-literal code. Examples -------- >>> np.safe_eval('1') 1 >>> np.safe_eval('[1, 2, 3]') [1, 2, 3] >>> np.safe_eval('{"foo": ("bar", 10.0)}') {'foo': ('bar', 10.0)} >>> np.safe_eval('import os') Traceback (most recent call last): ... SyntaxError: invalid syntax >>> np.safe_eval('open("/home/user/.ssh/id_dsa").read()') Traceback (most recent call last): ... SyntaxError: Unsupported source construct: compiler.ast.CallFunc """ raise NotImplementedError def save(file, arr): """Save an array to a binary file in NumPy ``.npy`` format. Parameters ---------- file : file or str File or filename to which the data is saved. If file is a file-object, then the filename is unchanged. If file is a string, a ``.npy`` extension will be appended to the file name if it does not already have one. arr : array_like Array data to be saved. See Also -------- savez : Save several arrays into a ``.npz`` archive savetxt, load Notes ----- For a description of the ``.npy`` format, see `format`. Examples -------- >>> from tempfile import TemporaryFile >>> outfile = TemporaryFile() >>> x = np.arange(10) >>> np.save(outfile, x) >>> outfile.seek(0) # Only needed here to simulate closing & reopening file >>> np.load(outfile) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) """ raise NotImplementedError def savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n'): """Save an array to a text file. Parameters ---------- fname : filename or file handle If the filename ends in ``.gz``, the file is automatically saved in compressed gzip format. `loadtxt` understands gzipped files transparently. X : array_like Data to be saved to a text file. fmt : str or sequence of strs A single format (%10.5f), a sequence of formats, or a multi-format string, e.g. 'Iteration %d -- %10.5f', in which case `delimiter` is ignored. delimiter : str Character separating columns. newline : str .. versionadded:: 1.5.0 Character separating lines. See Also -------- save : Save an array to a binary file in NumPy ``.npy`` format savez : Save several arrays into a ``.npz`` compressed archive Notes ----- Further explanation of the `fmt` parameter (``%[flag]width[.precision]specifier``): flags: ``-`` : left justify ``+`` : Forces to preceed result with + or -. ``0`` : Left pad the number with zeros instead of space (see width). width: Minimum number of characters to be printed. The value is not truncated if it has more characters. precision: - For integer specifiers (eg. ``d,i,o,x``), the minimum number of digits. - For ``e, E`` and ``f`` specifiers, the number of digits to print after the decimal point. - For ``g`` and ``G``, the maximum number of significant digits. - For ``s``, the maximum number of characters. specifiers: ``c`` : character ``d`` or ``i`` : signed decimal integer ``e`` or ``E`` : scientific notation with ``e`` or ``E``. ``f`` : decimal floating point ``g,G`` : use the shorter of ``e,E`` or ``f`` ``o`` : signed octal ``s`` : string of characters ``u`` : unsigned decimal integer ``x,X`` : unsigned hexadecimal integer This explanation of ``fmt`` is not complete, for an exhaustive specification see [1]_. References ---------- .. [1] `Format Specification Mini-Language `_, Python Documentation. Examples -------- >>> x = y = z = np.arange(0.0,5.0,1.0) >>> np.savetxt('test.out', x, delimiter=',') # X is an array >>> np.savetxt('test.out', (x,y,z)) # x,y,z equal sized 1D arrays >>> np.savetxt('test.out', x, fmt='%1.4e') # use exponential notation """ raise NotImplementedError def savez(file): """Save several arrays into a single file in uncompressed ``.npz`` format. If arguments are passed in with no keywords, the corresponding variable names, in the .npz file, are 'arr_0', 'arr_1', etc. If keyword arguments are given, the corresponding variable names, in the ``.npz`` file will match the keyword names. Parameters ---------- file : str or file Either the file name (string) or an open file (file-like object) where the data will be saved. If file is a string, the ``.npz`` extension will be appended to the file name if it is not already there. *args : Arguments, optional Arrays to save to the file. Since it is not possible for Python to know the names of the arrays outside `savez`, the arrays will be saved with names "arr_0", "arr_1", and so on. These arguments can be any expression. **kwds : Keyword arguments, optional Arrays to save to the file. Arrays will be saved in the file with the keyword names. Returns ------- None See Also -------- save : Save a single array to a binary file in NumPy format. savetxt : Save an array to a file as plain text. Notes ----- The ``.npz`` file format is a zipped archive of files named after the variables they contain. The archive is not compressed and each file in the archive contains one variable in ``.npy`` format. For a description of the ``.npy`` format, see `format`. When opening the saved ``.npz`` file with `load` a `NpzFile` object is returned. This is a dictionary-like object which can be queried for its list of arrays (with the ``.files`` attribute), and for the arrays themselves. Examples -------- >>> from tempfile import TemporaryFile >>> outfile = TemporaryFile() >>> x = np.arange(10) >>> y = np.sin(x) Using `savez` with *args, the arrays are saved with default names. >>> np.savez(outfile, x, y) >>> outfile.seek(0) # Only needed here to simulate closing & reopening file >>> npzfile = np.load(outfile) >>> npzfile.files ['arr_1', 'arr_0'] >>> npzfile['arr_0'] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) Using `savez` with **kwds, the arrays are saved with the keyword names. >>> outfile = TemporaryFile() >>> np.savez(outfile, x=x, y=y) >>> outfile.seek(0) >>> npzfile = np.load(outfile) >>> npzfile.files ['y', 'x'] >>> npzfile['x'] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) See Also -------- numpy.savez_compressed : Save several arrays into a compressed .npz file format """ raise NotImplementedError def savez_compressed(file): """Save several arrays into a single file in compressed ``.npz`` format. If keyword arguments are given, then filenames are taken from the keywords. If arguments are passed in with no keywords, then stored file names are arr_0, arr_1, etc. Parameters ---------- file : str File name of .npz file. args : Arguments Function arguments. kwds : Keyword arguments Keywords. See Also -------- numpy.savez : Save several arrays into an uncompressed .npz file format """ raise NotImplementedError def sctype2char(sctype): """Return the string representation of a scalar dtype. Parameters ---------- sctype : scalar dtype or object If a scalar dtype, the corresponding string character is returned. If an object, `sctype2char` tries to infer its scalar type and then return the corresponding string character. Returns ------- typechar : str The string character corresponding to the scalar type. Raises ------ ValueError If `sctype` is an object for which the type can not be inferred. See Also -------- obj2sctype, issctype, issubsctype, mintypecode Examples -------- >>> for sctype in [np.int32, np.float, np.complex, np.string_, np.ndarray]: ... print np.sctype2char(sctype) l d D S O >>> x = np.array([1., 2-1.j]) >>> np.sctype2char(x) 'D' >>> np.sctype2char(list) 'O' """ raise NotImplementedError def searchsorted(a, v, side='left'): """Find indices where elements should be inserted to maintain order. Find the indices into a sorted array `a` such that, if the corresponding elements in `v` were inserted before the indices, the order of `a` would be preserved. Parameters ---------- a : 1-D array_like Input array, sorted in ascending order. v : array_like Values to insert into `a`. side : {'left', 'right'}, optional If 'left', the index of the first suitable location found is given. If 'right', return the last such index. If there is no suitable index, return either 0 or N (where N is the length of `a`). Returns ------- indices : array of ints Array of insertion points with the same shape as `v`. See Also -------- sort : Return a sorted copy of an array. histogram : Produce histogram from 1-D data. Notes ----- Binary search is used to find the required insertion points. As of Numpy 1.4.0 `searchsorted` works with real/complex arrays containing `nan` values. The enhanced sort order is documented in `sort`. Examples -------- >>> np.searchsorted([1,2,3,4,5], 3) 2 >>> np.searchsorted([1,2,3,4,5], 3, side='right') 3 >>> np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3]) array([0, 5, 1, 2]) """ raise NotImplementedError def select(condlist, choicelist, default=0): """Return an array drawn from elements in choicelist, depending on conditions. Parameters ---------- condlist : list of bool ndarrays The list of conditions which determine from which array in `choicelist` the output elements are taken. When multiple conditions are satisfied, the first one encountered in `condlist` is used. choicelist : list of ndarrays The list of arrays from which the output elements are taken. It has to be of the same length as `condlist`. default : scalar, optional The element inserted in `output` when all conditions evaluate to False. Returns ------- output : ndarray The output at position m is the m-th element of the array in `choicelist` where the m-th element of the corresponding array in `condlist` is True. See Also -------- where : Return elements from one of two arrays depending on condition. take, choose, compress, diag, diagonal Examples -------- >>> x = np.arange(10) >>> condlist = [x<3, x>5] >>> choicelist = [x, x**2] >>> np.select(condlist, choicelist) array([ 0, 1, 2, 0, 0, 0, 36, 49, 64, 81]) """ raise NotImplementedError def set_numeric_ops(): """set_numeric_ops(op1=func1, op2=func2, ...) Set numerical operators for array objects. Parameters ---------- op1, op2, ... : callable Each ``op = func`` pair describes an operator to be replaced. For example, ``add = lambda x, y: np.add(x, y) % 5`` would replace addition by modulus 5 addition. Returns ------- saved_ops : list of callables A list of all operators, stored before making replacements. Notes ----- .. WARNING:: Use with care! Incorrect usage may lead to memory errors. A function replacing an operator cannot make use of that operator. For example, when replacing add, you may not use ``+``. Instead, directly call ufuncs. Examples -------- >>> def add_mod5(x, y): ... return np.add(x, y) % 5 ... >>> old_funcs = np.set_numeric_ops(add=add_mod5) >>> x = np.arange(12).reshape((3, 4)) >>> x + x array([[0, 2, 4, 1], [3, 0, 2, 4], [1, 3, 0, 2]]) >>> ignore = np.set_numeric_ops(**old_funcs) # restore operators """ # BUILTIN raise NotImplementedError def set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, suppress=None, nanstr=None, infstr=None): """Set printing options. These options determine the way floating point numbers, arrays and other NumPy objects are displayed. Parameters ---------- precision : int, optional Number of digits of precision for floating point output (default 8). threshold : int, optional Total number of array elements which trigger summarization rather than full repr (default 1000). edgeitems : int, optional Number of array items in summary at beginning and end of each dimension (default 3). linewidth : int, optional The number of characters per line for the purpose of inserting line breaks (default 75). suppress : bool, optional Whether or not suppress printing of small floating point values using scientific notation (default False). nanstr : str, optional String representation of floating point not-a-number (default nan). infstr : str, optional String representation of floating point infinity (default inf). See Also -------- get_printoptions, set_string_function Examples -------- Floating point precision can be set: >>> np.set_printoptions(precision=4) >>> print np.array([1.123456789]) [ 1.1235] Long arrays can be summarised: >>> np.set_printoptions(threshold=5) >>> print np.arange(10) [0 1 2 ..., 7 8 9] Small results can be suppressed: >>> eps = np.finfo(float).eps >>> x = np.arange(4.) >>> x**2 - (x + eps)**2 array([ -4.9304e-32, -4.4409e-16, 0.0000e+00, 0.0000e+00]) >>> np.set_printoptions(suppress=True) >>> x**2 - (x + eps)**2 array([-0., -0., 0., 0.]) To put back the default options, you can use: >>> np.set_printoptions(edgeitems=3,infstr='Inf', ... linewidth=75, nanstr='NaN', precision=8, ... suppress=False, threshold=1000) """ raise NotImplementedError def set_string_function(f, repr=True): """Set a Python function to be used when pretty printing arrays. Parameters ---------- f : function or None Function to be used to pretty print arrays. The function should expect a single array argument and return a string of the representation of the array. If None, the function is reset to the default NumPy function to print arrays. repr : bool, optional If True (default), the function for pretty printing (``__repr__``) is set, if False the function that returns the default string representation (``__str__``) is set. See Also -------- set_printoptions, get_printoptions Examples -------- >>> def pprint(arr): ... return 'HA! - What are you going to do now?' ... >>> np.set_string_function(pprint) >>> a = np.arange(10) >>> a HA! - What are you going to do now? >>> print a [0 1 2 3 4 5 6 7 8 9] We can reset the function to the default: >>> np.set_string_function(None) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) `repr` affects either pretty printing or normal string representation. Note that ``__repr__`` is still affected by setting ``__str__`` because the width of each array element in the returned string becomes equal to the length of the result of ``__str__()``. >>> x = np.arange(4) >>> np.set_string_function(lambda x:'random', repr=False) >>> x.__str__() 'random' >>> x.__repr__() 'array([ 0, 1, 2, 3])' """ raise NotImplementedError def setbufsize(size): """Set the size of the buffer used in ufuncs. Parameters ---------- size : int Size of buffer. """ raise NotImplementedError def setdiff1d(ar1, ar2, assume_unique=False): """Find the set difference of two arrays. Return the sorted, unique values in `ar1` that are not in `ar2`. Parameters ---------- ar1 : array_like Input array. ar2 : array_like Input comparison array. assume_unique : bool If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False. Returns ------- difference : ndarray Sorted 1D array of values in `ar1` that are not in `ar2`. See Also -------- numpy.lib.arraysetops : Module with a number of other functions for performing set operations on arrays. Examples -------- >>> a = np.array([1, 2, 3, 2, 4, 1]) >>> b = np.array([3, 4, 5, 6]) >>> np.setdiff1d(a, b) array([1, 2]) """ raise NotImplementedError def seterr(all=None, divide=None, over=None, under=None, invalid=None): """Set how floating-point errors are handled. Note that operations on integer scalar types (such as `int16`) are handled like floating point, and are affected by these settings. Parameters ---------- all : {'ignore', 'warn', 'raise', 'call', 'print', 'log'}, optional Set treatment for all types of floating-point errors at once: - ignore: Take no action when the exception occurs. - warn: Print a `RuntimeWarning` (via the Python `warnings` module). - raise: Raise a `FloatingPointError`. - call: Call a function specified using the `seterrcall` function. - print: Print a warning directly to ``stdout``. - log: Record error in a Log object specified by `seterrcall`. The default is not to change the current behavior. divide : {'ignore', 'warn', 'raise', 'call', 'print', 'log'}, optional Treatment for division by zero. over : {'ignore', 'warn', 'raise', 'call', 'print', 'log'}, optional Treatment for floating-point overflow. under : {'ignore', 'warn', 'raise', 'call', 'print', 'log'}, optional Treatment for floating-point underflow. invalid : {'ignore', 'warn', 'raise', 'call', 'print', 'log'}, optional Treatment for invalid floating-point operation. Returns ------- old_settings : dict Dictionary containing the old settings. See also -------- seterrcall : Set a callback function for the 'call' mode. geterr, geterrcall Notes ----- The floating-point exceptions are defined in the IEEE 754 standard [1]: - Division by zero: infinite result obtained from finite numbers. - Overflow: result too large to be expressed. - Underflow: result so close to zero that some precision was lost. - Invalid operation: result is not an expressible number, typically indicates that a NaN was produced. .. [1] http://en.wikipedia.org/wiki/IEEE_754 Examples -------- >>> old_settings = np.seterr(all='ignore') #seterr to known value >>> np.seterr(over='raise') {'over': 'ignore', 'divide': 'ignore', 'invalid': 'ignore', 'under': 'ignore'} >>> np.seterr(all='ignore') # reset to default {'over': 'raise', 'divide': 'ignore', 'invalid': 'ignore', 'under': 'ignore'} >>> np.int16(32000) * np.int16(3) 30464 >>> old_settings = np.seterr(all='warn', over='raise') >>> np.int16(32000) * np.int16(3) Traceback (most recent call last): File "", line 1, in FloatingPointError: overflow encountered in short_scalars >>> old_settings = np.seterr(all='print') >>> np.geterr() {'over': 'print', 'divide': 'print', 'invalid': 'print', 'under': 'print'} >>> np.int16(32000) * np.int16(3) Warning: overflow encountered in short_scalars 30464 """ raise NotImplementedError def seterrcall(func): """Set the floating-point error callback function or log object. There are two ways to capture floating-point error messages. The first is to set the error-handler to 'call', using `seterr`. Then, set the function to call using this function. The second is to set the error-handler to 'log', using `seterr`. Floating-point errors then trigger a call to the 'write' method of the provided object. Parameters ---------- func : callable f(err, flag) or object with write method Function to call upon floating-point errors ('call'-mode) or object whose 'write' method is used to log such message ('log'-mode). The call function takes two arguments. The first is the type of error (one of "divide", "over", "under", or "invalid"), and the second is the status flag. The flag is a byte, whose least-significant bits indicate the status:: [0 0 0 0 invalid over under invalid] In other words, ``flags = divide + 2*over + 4*under + 8*invalid``. If an object is provided, its write method should take one argument, a string. Returns ------- h : callable, log instance or None The old error handler. See Also -------- seterr, geterr, geterrcall Examples -------- Callback upon error: >>> def err_handler(type, flag): ... print "Floating point error (%s), with flag %s" % (type, flag) ... >>> saved_handler = np.seterrcall(err_handler) >>> save_err = np.seterr(all='call') >>> np.array([1, 2, 3]) / 0.0 Floating point error (divide by zero), with flag 1 array([ Inf, Inf, Inf]) >>> np.seterrcall(saved_handler) >>> np.seterr(**save_err) {'over': 'call', 'divide': 'call', 'invalid': 'call', 'under': 'call'} Log error message: >>> class Log(object): ... def write(self, msg): ... print "LOG: %s" % msg ... >>> log = Log() >>> saved_handler = np.seterrcall(log) >>> save_err = np.seterr(all='log') >>> np.array([1, 2, 3]) / 0.0 LOG: Warning: divide by zero encountered in divide array([ Inf, Inf, Inf]) >>> np.seterrcall(saved_handler) <__main__.Log object at 0x...> >>> np.seterr(**save_err) {'over': 'log', 'divide': 'log', 'invalid': 'log', 'under': 'log'} """ raise NotImplementedError def seterrobj(errobj): """seterrobj(errobj) Set the object that defines floating-point error handling. The error object contains all information that defines the error handling behavior in Numpy. `seterrobj` is used internally by the other functions that set error handling behavior (`seterr`, `seterrcall`). Parameters ---------- errobj : list The error object, a list containing three elements: [internal numpy buffer size, error mask, error callback function]. The error mask is a single integer that holds the treatment information on all four floating point errors. The information for each error type is contained in three bits of the integer. If we print it in base 8, we can see what treatment is set for "invalid", "under", "over", and "divide" (in that order). The printed string can be interpreted with * 0 : 'ignore' * 1 : 'warn' * 2 : 'raise' * 3 : 'call' * 4 : 'print' * 5 : 'log' See Also -------- geterrobj, seterr, geterr, seterrcall, geterrcall getbufsize, setbufsize Notes ----- For complete documentation of the types of floating-point exceptions and treatment options, see `seterr`. Examples -------- >>> old_errobj = np.geterrobj() # first get the defaults >>> old_errobj [10000, 0, None] >>> def err_handler(type, flag): ... print "Floating point error (%s), with flag %s" % (type, flag) ... >>> new_errobj = [20000, 12, err_handler] >>> np.seterrobj(new_errobj) >>> np.base_repr(12, 8) # int for divide=4 ('print') and over=1 ('warn') '14' >>> np.geterr() {'over': 'warn', 'divide': 'print', 'invalid': 'ignore', 'under': 'ignore'} >>> np.geterrcall() is err_handler True """ # BUILTIN raise NotImplementedError def setxor1d(ar1, ar2, assume_unique=False): """Find the set exclusive-or of two arrays. Return the sorted, unique values that are in only one (not both) of the input arrays. Parameters ---------- ar1, ar2 : array_like Input arrays. assume_unique : bool If True, the input arrays are both assumed to be unique, which can speed up the calculation. Default is False. Returns ------- xor : ndarray Sorted 1D array of unique values that are in only one of the input arrays. Examples -------- >>> a = np.array([1, 2, 3, 2, 4]) >>> b = np.array([2, 3, 5, 7, 5]) >>> np.setxor1d(a,b) array([1, 4, 5, 7]) """ raise NotImplementedError def show_config(): """ """ raise NotImplementedError def sinc(x): """Return the sinc function. The sinc function is :math:`\sin(\pi x)/(\pi x)`. Parameters ---------- x : ndarray Array (possibly multi-dimensional) of values for which to to calculate ``sinc(x)``. Returns ------- out : ndarray ``sinc(x)``, which has the same shape as the input. Notes ----- ``sinc(0)`` is the limit value 1. The name sinc is short for "sine cardinal" or "sinus cardinalis". The sinc function is used in various signal processing applications, including in anti-aliasing, in the construction of a Lanczos resampling filter, and in interpolation. For bandlimited interpolation of discrete-time signals, the ideal interpolation kernel is proportional to the sinc function. References ---------- .. [1] Weisstein, Eric W. "Sinc Function." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/SincFunction.html .. [2] Wikipedia, "Sinc function", http://en.wikipedia.org/wiki/Sinc_function Examples -------- >>> x = np.arange(-20., 21.)/5. >>> np.sinc(x) array([ -3.89804309e-17, -4.92362781e-02, -8.40918587e-02, -8.90384387e-02, -5.84680802e-02, 3.89804309e-17, 6.68206631e-02, 1.16434881e-01, 1.26137788e-01, 8.50444803e-02, -3.89804309e-17, -1.03943254e-01, -1.89206682e-01, -2.16236208e-01, -1.55914881e-01, 3.89804309e-17, 2.33872321e-01, 5.04551152e-01, 7.56826729e-01, 9.35489284e-01, 1.00000000e+00, 9.35489284e-01, 7.56826729e-01, 5.04551152e-01, 2.33872321e-01, 3.89804309e-17, -1.55914881e-01, -2.16236208e-01, -1.89206682e-01, -1.03943254e-01, -3.89804309e-17, 8.50444803e-02, 1.26137788e-01, 1.16434881e-01, 6.68206631e-02, 3.89804309e-17, -5.84680802e-02, -8.90384387e-02, -8.40918587e-02, -4.92362781e-02, -3.89804309e-17]) >>> import matplotlib.pyplot as plt >>> plt.plot(x, np.sinc(x)) [] >>> plt.title("Sinc Function") >>> plt.ylabel("Amplitude") >>> plt.xlabel("X") >>> plt.show() It works in 2-D as well: >>> x = np.arange(-200., 201.)/50. >>> xx = np.outer(x, x) >>> plt.imshow(np.sinc(xx)) """ raise NotImplementedError def size(a, axis=None): """Return the number of elements along a given axis. Parameters ---------- a : array_like Input data. axis : int, optional Axis along which the elements are counted. By default, give the total number of elements. Returns ------- element_count : int Number of elements along the specified axis. See Also -------- shape : dimensions of array ndarray.shape : dimensions of array ndarray.size : number of elements in array Examples -------- >>> a = np.array([[1,2,3],[4,5,6]]) >>> np.size(a) 6 >>> np.size(a,1) 3 >>> np.size(a,0) 2 """ raise NotImplementedError def sometrue(a, axis=None, out=None): """Check whether some values are true. Refer to `any` for full documentation. See Also -------- any : equivalent function """ raise NotImplementedError def sort(a, axis=-1, kind='quicksort', order=None): """Return a sorted copy of an array. Parameters ---------- a : array_like Array to be sorted. axis : int or None, optional Axis along which to sort. If None, the array is flattened before sorting. The default is -1, which sorts along the last axis. kind : {'quicksort', 'mergesort', 'heapsort'}, optional Sorting algorithm. Default is 'quicksort'. order : list, optional When `a` is a structured array, this argument specifies which fields to compare first, second, and so on. This list does not need to include all of the fields. Returns ------- sorted_array : ndarray Array of the same type and shape as `a`. See Also -------- ndarray.sort : Method to sort an array in-place. argsort : Indirect sort. lexsort : Indirect stable sort on multiple keys. searchsorted : Find elements in a sorted array. Notes ----- The various sorting algorithms are characterized by their average speed, worst case performance, work space size, and whether they are stable. A stable sort keeps items with the same key in the same relative order. The three available algorithms have the following properties: =========== ======= ============= ============ ======= kind speed worst case work space stable =========== ======= ============= ============ ======= 'quicksort' 1 O(n^2) 0 no 'mergesort' 2 O(n*log(n)) ~n/2 yes 'heapsort' 3 O(n*log(n)) 0 no =========== ======= ============= ============ ======= All the sort algorithms make temporary copies of the data when sorting along any but the last axis. Consequently, sorting along the last axis is faster and uses less space than sorting along any other axis. The sort order for complex numbers is lexicographic. If both the real and imaginary parts are non-nan then the order is determined by the real parts except when they are equal, in which case the order is determined by the imaginary parts. Previous to numpy 1.4.0 sorting real and complex arrays containing nan values led to undefined behaviour. In numpy versions >= 1.4.0 nan values are sorted to the end. The extended sort order is: * Real: [R, nan] * Complex: [R + Rj, R + nanj, nan + Rj, nan + nanj] where R is a non-nan real value. Complex values with the same nan placements are sorted according to the non-nan part if it exists. Non-nan values are sorted as before. Examples -------- >>> a = np.array([[1,4],[3,1]]) >>> np.sort(a) # sort along the last axis array([[1, 4], [1, 3]]) >>> np.sort(a, axis=None) # sort the flattened array array([1, 1, 3, 4]) >>> np.sort(a, axis=0) # sort along the first axis array([[1, 1], [3, 4]]) Use the `order` keyword to specify a field to use when sorting a structured array: >>> dtype = [('name', 'S10'), ('height', float), ('age', int)] >>> values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38), ... ('Galahad', 1.7, 38)] >>> a = np.array(values, dtype=dtype) # create a structured array >>> np.sort(a, order='height') # doctest: +SKIP array([('Galahad', 1.7, 38), ('Arthur', 1.8, 41), ('Lancelot', 1.8999999999999999, 38)], dtype=[('name', '|S10'), ('height', '>> np.sort(a, order=['age', 'height']) # doctest: +SKIP array([('Galahad', 1.7, 38), ('Lancelot', 1.8999999999999999, 38), ('Arthur', 1.8, 41)], dtype=[('name', '|S10'), ('height', '>> np.sort_complex([5, 3, 6, 2, 1]) array([ 1.+0.j, 2.+0.j, 3.+0.j, 5.+0.j, 6.+0.j]) >>> np.sort_complex([1 + 2j, 2 - 1j, 3 - 2j, 3 - 3j, 3 + 5j]) array([ 1.+2.j, 2.-1.j, 3.-3.j, 3.-2.j, 3.+5.j]) """ raise NotImplementedError def source(object, output=sys.stdout): """Print or write to a file the source code for a Numpy object. The source code is only returned for objects written in Python. Many functions and classes are defined in C and will therefore not return useful information. Parameters ---------- object : numpy object Input object. This can be any object (function, class, module, ...). output : file object, optional If `output` not supplied then source code is printed to screen (sys.stdout). File object must be created with either write 'w' or append 'a' modes. See Also -------- lookfor, info Examples -------- >>> np.source(np.interp) #doctest: +SKIP In file: /usr/lib/python2.6/dist-packages/numpy/lib/function_base.py def interp(x, xp, fp, left=None, right=None): '''.... (full docstring printed)''' if isinstance(x, (float, int, number)): return compiled_interp([x], xp, fp, left, right).item() else: return compiled_interp(x, xp, fp, left, right) The source code is only returned for objects written in Python. >>> np.source(np.array) #doctest: +SKIP Not available for this object. """ raise NotImplementedError def split(ary, indices_or_sections, axis=0): """Split an array into multiple sub-arrays of equal size. Parameters ---------- ary : ndarray Array to be divided into sub-arrays. indices_or_sections : int or 1-D array If `indices_or_sections` is an integer, N, the array will be divided into N equal arrays along `axis`. If such a split is not possible, an error is raised. If `indices_or_sections` is a 1-D array of sorted integers, the entries indicate where along `axis` the array is split. For example, ``[2, 3]`` would, for ``axis=0``, result in - ary[:2] - ary[2:3] - ary[3:] If an index exceeds the dimension of the array along `axis`, an empty sub-array is returned correspondingly. axis : int, optional The axis along which to split, default is 0. Returns ------- sub-arrays : list of ndarrays A list of sub-arrays. Raises ------ ValueError If `indices_or_sections` is given as an integer, but a split does not result in equal division. See Also -------- array_split : Split an array into multiple sub-arrays of equal or near-equal size. Does not raise an exception if an equal division cannot be made. hsplit : Split array into multiple sub-arrays horizontally (column-wise). vsplit : Split array into multiple sub-arrays vertically (row wise). dsplit : Split array into multiple sub-arrays along the 3rd axis (depth). concatenate : Join arrays together. hstack : Stack arrays in sequence horizontally (column wise). vstack : Stack arrays in sequence vertically (row wise). dstack : Stack arrays in sequence depth wise (along third dimension). Examples -------- >>> x = np.arange(9.0) >>> np.split(x, 3) [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7., 8.])] >>> x = np.arange(8.0) >>> np.split(x, [3, 5, 6, 10]) [array([ 0., 1., 2.]), array([ 3., 4.]), array([ 5.]), array([ 6., 7.]), array([], dtype=float64)] """ raise NotImplementedError def squeeze(a): """Remove single-dimensional entries from the shape of an array. Parameters ---------- a : array_like Input data. Returns ------- squeezed : ndarray The input array, but with with all dimensions of length 1 removed. Whenever possible, a view on `a` is returned. Examples -------- >>> x = np.array([[[0], [1], [2]]]) >>> x.shape (1, 3, 1) >>> np.squeeze(x).shape (3,) """ raise NotImplementedError def std(a, axis=None, dtype=None, out=None, ddof=0): """Compute the standard deviation along the specified axis. Returns the standard deviation, a measure of the spread of a distribution, of the array elements. The standard deviation is computed for the flattened array by default, otherwise over the specified axis. Parameters ---------- a : array_like Calculate the standard deviation of these values. axis : int, optional Axis along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array. dtype : dtype, optional Type to use in computing the standard deviation. For arrays of integer type the default is float64, for arrays of float types it is the same as the array type. out : ndarray, optional Alternative output array in which to place the result. It must have the same shape as the expected output but the type (of the calculated values) will be cast if necessary. ddof : int, optional Means Delta Degrees of Freedom. The divisor used in calculations is ``N - ddof``, where ``N`` represents the number of elements. By default `ddof` is zero. Returns ------- standard_deviation : ndarray, see dtype parameter above. If `out` is None, return a new array containing the standard deviation, otherwise return a reference to the output array. See Also -------- var, mean numpy.doc.ufuncs : Section "Output arguments" Notes ----- The standard deviation is the square root of the average of the squared deviations from the mean, i.e., ``std = sqrt(mean(abs(x - x.mean())**2))``. The average squared deviation is normally calculated as ``x.sum() / N``, where ``N = len(x)``. If, however, `ddof` is specified, the divisor ``N - ddof`` is used instead. In standard statistical practice, ``ddof=1`` provides an unbiased estimator of the variance of the infinite population. ``ddof=0`` provides a maximum likelihood estimate of the variance for normally distributed variables. The standard deviation computed in this function is the square root of the estimated variance, so even with ``ddof=1``, it will not be an unbiased estimate of the standard deviation per se. Note that, for complex numbers, `std` takes the absolute value before squaring, so that the result is always real and nonnegative. For floating-point input, the *std* is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for float32 (see example below). Specifying a higher-accuracy accumulator using the `dtype` keyword can alleviate this issue. Examples -------- >>> a = np.array([[1, 2], [3, 4]]) >>> np.std(a) 1.1180339887498949 >>> np.std(a, axis=0) array([ 1., 1.]) >>> np.std(a, axis=1) array([ 0.5, 0.5]) In single precision, std() can be inaccurate: >>> a = np.zeros((2,512*512), dtype=np.float32) >>> a[0,:] = 1.0 >>> a[1,:] = 0.1 >>> np.std(a) 0.45172946707416706 Computing the standard deviation in float64 is more accurate: >>> np.std(a, dtype=np.float64) 0.44999999925552653 """ raise NotImplementedError def sum(a, axis=None, dtype=None, out=None): """Sum of array elements over a given axis. Parameters ---------- a : array_like Elements to sum. axis : integer, optional Axis over which the sum is taken. By default `axis` is None, and all elements are summed. dtype : dtype, optional The type of the returned array and of the accumulator in which the elements are summed. By default, the dtype of `a` is used. An exception is when `a` has an integer type with less precision than the default platform integer. In that case, the default platform integer is used instead. out : ndarray, optional Array into which the output is placed. By default, a new array is created. If `out` is given, it must be of the appropriate shape (the shape of `a` with `axis` removed, i.e., ``numpy.delete(a.shape, axis)``). Its type is preserved. See `doc.ufuncs` (Section "Output arguments") for more details. Returns ------- sum_along_axis : ndarray An array with the same shape as `a`, with the specified axis removed. If `a` is a 0-d array, or if `axis` is None, a scalar is returned. If an output array is specified, a reference to `out` is returned. See Also -------- ndarray.sum : Equivalent method. cumsum : Cumulative sum of array elements. trapz : Integration of array values using the composite trapezoidal rule. mean, average Notes ----- Arithmetic is modular when using integer types, and no error is raised on overflow. Examples -------- >>> np.sum([0.5, 1.5]) 2.0 >>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32) 1 >>> np.sum([[0, 1], [0, 5]]) 6 >>> np.sum([[0, 1], [0, 5]], axis=0) array([0, 6]) >>> np.sum([[0, 1], [0, 5]], axis=1) array([1, 5]) If the accumulator is too small, overflow occurs: >>> np.ones(128, dtype=np.int8).sum(dtype=np.int8) -128 """ raise NotImplementedError def swapaxes(a, axis1, axis2): """Interchange two axes of an array. Parameters ---------- a : array_like Input array. axis1 : int First axis. axis2 : int Second axis. Returns ------- a_swapped : ndarray If `a` is an ndarray, then a view of `a` is returned; otherwise a new array is created. Examples -------- >>> x = np.array([[1,2,3]]) >>> np.swapaxes(x,0,1) array([[1], [2], [3]]) >>> x = np.array([[[0,1],[2,3]],[[4,5],[6,7]]]) >>> x array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> np.swapaxes(x,0,2) array([[[0, 4], [2, 6]], [[1, 5], [3, 7]]]) """ raise NotImplementedError def take(a, indices, axis=None, out=None, mode='raise'): """Take elements from an array along an axis. This function does the same thing as "fancy" indexing (indexing arrays using arrays); however, it can be easier to use if you need elements along a given axis. Parameters ---------- a : array_like The source array. indices : array_like The indices of the values to extract. axis : int, optional The axis over which to select values. By default, the flattened input array is used. out : ndarray, optional If provided, the result will be placed in this array. It should be of the appropriate shape and dtype. mode : {'raise', 'wrap', 'clip'}, optional Specifies how out-of-bounds indices will behave. * 'raise' -- raise an error (default) * 'wrap' -- wrap around * 'clip' -- clip to the range 'clip' mode means that all indices that are too large are replaced by the index that addresses the last element along that axis. Note that this disables indexing with negative numbers. Returns ------- subarray : ndarray The returned array has the same type as `a`. See Also -------- ndarray.take : equivalent method Examples -------- >>> a = [4, 3, 5, 7, 6, 8] >>> indices = [0, 1, 4] >>> np.take(a, indices) array([4, 3, 6]) In this example if `a` is an ndarray, "fancy" indexing can be used. >>> a = np.array(a) >>> a[indices] array([4, 3, 6]) """ raise NotImplementedError def tensordot(a, b, axes=2): """Compute tensor dot product along specified axes for arrays >= 1-D. Given two tensors (arrays of dimension greater than or equal to one), ``a`` and ``b``, and an array_like object containing two array_like objects, ``(a_axes, b_axes)``, sum the products of ``a``'s and ``b``'s elements (components) over the axes specified by ``a_axes`` and ``b_axes``. The third argument can be a single non-negative integer_like scalar, ``N``; if it is such, then the last ``N`` dimensions of ``a`` and the first ``N`` dimensions of ``b`` are summed over. Parameters ---------- a, b : array_like, len(shape) >= 1 Tensors to "dot". axes : variable type * integer_like scalar Number of axes to sum over (applies to both arrays); or * array_like, shape = (2,), both elements array_like Axes to be summed over, first sequence applying to ``a``, second to ``b``. See Also -------- dot, einsum Notes ----- When there is more than one axis to sum over - and they are not the last (first) axes of ``a`` (``b``) - the argument ``axes`` should consist of two sequences of the same length, with the first axis to sum over given first in both sequences, the second axis second, and so forth. Examples -------- A "traditional" example: >>> a = np.arange(60.).reshape(3,4,5) >>> b = np.arange(24.).reshape(4,3,2) >>> c = np.tensordot(a,b, axes=([1,0],[0,1])) >>> c.shape (5, 2) >>> c array([[ 4400., 4730.], [ 4532., 4874.], [ 4664., 5018.], [ 4796., 5162.], [ 4928., 5306.]]) >>> # A slower but equivalent way of computing the same... >>> d = np.zeros((5,2)) >>> for i in range(5): ... for j in range(2): ... for k in range(3): ... for n in range(4): ... d[i,j] += a[k,n,i] * b[n,k,j] >>> c == d array([[ True, True], [ True, True], [ True, True], [ True, True], [ True, True]], dtype=bool) An extended example taking advantage of the overloading of + and \*: >>> a = np.array(range(1, 9)) >>> a.shape = (2, 2, 2) >>> A = np.array(('a', 'b', 'c', 'd'), dtype=object) >>> A.shape = (2, 2) >>> a; A array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) array([[a, b], [c, d]], dtype=object) >>> np.tensordot(a, A) # third argument default is 2 array([abbcccdddd, aaaaabbbbbbcccccccdddddddd], dtype=object) >>> np.tensordot(a, A, 1) array([[[acc, bdd], [aaacccc, bbbdddd]], [[aaaaacccccc, bbbbbdddddd], [aaaaaaacccccccc, bbbbbbbdddddddd]]], dtype=object) >>> np.tensordot(a, A, 0) # "Left for reader" (result too long to incl.) array([[[[[a, b], [c, d]], ... >>> np.tensordot(a, A, (0, 1)) array([[[abbbbb, cddddd], [aabbbbbb, ccdddddd]], [[aaabbbbbbb, cccddddddd], [aaaabbbbbbbb, ccccdddddddd]]], dtype=object) >>> np.tensordot(a, A, (2, 1)) array([[[abb, cdd], [aaabbbb, cccdddd]], [[aaaaabbbbbb, cccccdddddd], [aaaaaaabbbbbbbb, cccccccdddddddd]]], dtype=object) >>> np.tensordot(a, A, ((0, 1), (0, 1))) array([abbbcccccddddddd, aabbbbccccccdddddddd], dtype=object) >>> np.tensordot(a, A, ((2, 1), (1, 0))) array([acccbbdddd, aaaaacccccccbbbbbbdddddddd], dtype=object) """ raise NotImplementedError def tile(A, reps): """Construct an array by repeating A the number of times given by reps. If `reps` has length ``d``, the result will have dimension of ``max(d, A.ndim)``. If ``A.ndim < d``, `A` is promoted to be d-dimensional by prepending new axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication, or shape (1, 1, 3) for 3-D replication. If this is not the desired behavior, promote `A` to d-dimensions manually before calling this function. If ``A.ndim > d``, `reps` is promoted to `A`.ndim by pre-pending 1's to it. Thus for an `A` of shape (2, 3, 4, 5), a `reps` of (2, 2) is treated as (1, 1, 2, 2). Parameters ---------- A : array_like The input array. reps : array_like The number of repetitions of `A` along each axis. Returns ------- c : ndarray The tiled output array. See Also -------- repeat : Repeat elements of an array. Examples -------- >>> a = np.array([0, 1, 2]) >>> np.tile(a, 2) array([0, 1, 2, 0, 1, 2]) >>> np.tile(a, (2, 2)) array([[0, 1, 2, 0, 1, 2], [0, 1, 2, 0, 1, 2]]) >>> np.tile(a, (2, 1, 2)) array([[[0, 1, 2, 0, 1, 2]], [[0, 1, 2, 0, 1, 2]]]) >>> b = np.array([[1, 2], [3, 4]]) >>> np.tile(b, 2) array([[1, 2, 1, 2], [3, 4, 3, 4]]) >>> np.tile(b, (2, 1)) array([[1, 2], [3, 4], [1, 2], [3, 4]]) """ raise NotImplementedError def trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None): """Return the sum along diagonals of the array. If `a` is 2-D, the sum along its diagonal with the given offset is returned, i.e., the sum of elements ``a[i,i+offset]`` for all i. If `a` has more than two dimensions, then the axes specified by axis1 and axis2 are used to determine the 2-D sub-arrays whose traces are returned. The shape of the resulting array is the same as that of `a` with `axis1` and `axis2` removed. Parameters ---------- a : array_like Input array, from which the diagonals are taken. offset : int, optional Offset of the diagonal from the main diagonal. Can be both positive and negative. Defaults to 0. axis1, axis2 : int, optional Axes to be used as the first and second axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults are the first two axes of `a`. dtype : dtype, optional Determines the data-type of the returned array and of the accumulator where the elements are summed. If dtype has the value None and `a` is of integer type of precision less than the default integer precision, then the default integer precision is used. Otherwise, the precision is the same as that of `a`. out : ndarray, optional Array into which the output is placed. Its type is preserved and it must be of the right shape to hold the output. Returns ------- sum_along_diagonals : ndarray If `a` is 2-D, the sum along the diagonal is returned. If `a` has larger dimensions, then an array of sums along diagonals is returned. See Also -------- diag, diagonal, diagflat Examples -------- >>> np.trace(np.eye(3)) 3.0 >>> a = np.arange(8).reshape((2,2,2)) >>> np.trace(a) array([6, 8]) >>> a = np.arange(24).reshape((2,2,2,3)) >>> np.trace(a).shape (2, 3) """ raise NotImplementedError def transpose(a, axes=None): """Permute the dimensions of an array. Parameters ---------- a : array_like Input array. axes : list of ints, optional By default, reverse the dimensions, otherwise permute the axes according to the values given. Returns ------- p : ndarray `a` with its axes permuted. A view is returned whenever possible. See Also -------- rollaxis Examples -------- >>> x = np.arange(4).reshape((2,2)) >>> x array([[0, 1], [2, 3]]) >>> np.transpose(x) array([[0, 2], [1, 3]]) >>> x = np.ones((1, 2, 3)) >>> np.transpose(x, (1, 0, 2)).shape (2, 1, 3) """ raise NotImplementedError def trapz(y, x=None, dx=1.0, axis=-1): """Integrate along the given axis using the composite trapezoidal rule. Integrate `y` (`x`) along given axis. Parameters ---------- y : array_like Input array to integrate. x : array_like, optional If `x` is None, then spacing between all `y` elements is `dx`. dx : scalar, optional If `x` is None, spacing given by `dx` is assumed. Default is 1. axis : int, optional Specify the axis. Returns ------- out : float Definite integral as approximated by trapezoidal rule. See Also -------- sum, cumsum Notes ----- Image [2]_ illustrates trapezoidal rule -- y-axis locations of points will be taken from `y` array, by default x-axis distances between points will be 1.0, alternatively they can be provided with `x` array or with `dx` scalar. Return value will be equal to combined area under the red lines. References ---------- .. [1] Wikipedia page: http://en.wikipedia.org/wiki/Trapezoidal_rule .. [2] Illustration image: http://en.wikipedia.org/wiki/File:Composite_trapezoidal_rule_illustration.png Examples -------- >>> np.trapz([1,2,3]) 4.0 >>> np.trapz([1,2,3], x=[4,6,8]) 8.0 >>> np.trapz([1,2,3], dx=2) 8.0 >>> a = np.arange(6).reshape(2, 3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> np.trapz(a, axis=0) array([ 1.5, 2.5, 3.5]) >>> np.trapz(a, axis=1) array([ 2., 8.]) """ raise NotImplementedError def tri(N, M=None, k=0, dtype=float): """An array with ones at and below the given diagonal and zeros elsewhere. Parameters ---------- N : int Number of rows in the array. M : int, optional Number of columns in the array. By default, `M` is taken equal to `N`. k : int, optional The sub-diagonal at and below which the array is filled. `k` = 0 is the main diagonal, while `k` < 0 is below it, and `k` > 0 is above. The default is 0. dtype : dtype, optional Data type of the returned array. The default is float. Returns ------- T : ndarray of shape (N, M) Array with its lower triangle filled with ones and zero elsewhere; in other words ``T[i,j] == 1`` for ``i <= j + k``, 0 otherwise. Examples -------- >>> np.tri(3, 5, 2, dtype=int) array([[1, 1, 1, 0, 0], [1, 1, 1, 1, 0], [1, 1, 1, 1, 1]]) >>> np.tri(3, 5, -1) array([[ 0., 0., 0., 0., 0.], [ 1., 0., 0., 0., 0.], [ 1., 1., 0., 0., 0.]]) """ raise NotImplementedError def tril(m, k=0): """Lower triangle of an array. Return a copy of an array with elements above the `k`-th diagonal zeroed. Parameters ---------- m : array_like, shape (M, N) Input array. k : int, optional Diagonal above which to zero elements. `k = 0` (the default) is the main diagonal, `k < 0` is below it and `k > 0` is above. Returns ------- L : ndarray, shape (M, N) Lower triangle of `m`, of same shape and data-type as `m`. See Also -------- triu : same thing, only for the upper triangle Examples -------- >>> np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1) array([[ 0, 0, 0], [ 4, 0, 0], [ 7, 8, 0], [10, 11, 12]]) """ raise NotImplementedError def tril_indices(n, k=0): """Return the indices for the lower-triangle of an (n, n) array. Parameters ---------- n : int The row dimension of the square arrays for which the returned indices will be valid. k : int, optional Diagonal offset (see `tril` for details). Returns ------- inds : tuple of arrays The indices for the triangle. The returned tuple contains two arrays, each with the indices along one dimension of the array. See also -------- triu_indices : similar function, for upper-triangular. mask_indices : generic function accepting an arbitrary mask function. tril, triu Notes ----- .. versionadded:: 1.4.0 Examples -------- Compute two different sets of indices to access 4x4 arrays, one for the lower triangular part starting at the main diagonal, and one starting two diagonals further right: >>> il1 = np.tril_indices(4) >>> il2 = np.tril_indices(4, 2) Here is how they can be used with a sample array: >>> a = np.arange(16).reshape(4, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) Both for indexing: >>> a[il1] array([ 0, 4, 5, 8, 9, 10, 12, 13, 14, 15]) And for assigning values: >>> a[il1] = -1 >>> a array([[-1, 1, 2, 3], [-1, -1, 6, 7], [-1, -1, -1, 11], [-1, -1, -1, -1]]) These cover almost the whole array (two diagonals right of the main one): >>> a[il2] = -10 >>> a array([[-10, -10, -10, 3], [-10, -10, -10, -10], [-10, -10, -10, -10], [-10, -10, -10, -10]]) """ raise NotImplementedError def tril_indices_from(arr, k=0): """Return the indices for the lower-triangle of arr. See `tril_indices` for full details. Parameters ---------- arr : array_like The indices will be valid for square arrays whose dimensions are the same as arr. k : int, optional Diagonal offset (see `tril` for details). See Also -------- tril_indices, tril Notes ----- .. versionadded:: 1.4.0 """ raise NotImplementedError def trim_zeros(filt, trim='fb'): """Trim the leading and/or trailing zeros from a 1-D array or sequence. Parameters ---------- filt : 1-D array or sequence Input array. trim : str, optional A string with 'f' representing trim from front and 'b' to trim from back. Default is 'fb', trim zeros from both front and back of the array. Returns ------- trimmed : 1-D array or sequence The result of trimming the input. The input data type is preserved. Examples -------- >>> a = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0)) >>> np.trim_zeros(a) array([1, 2, 3, 0, 2, 1]) >>> np.trim_zeros(a, 'b') array([0, 0, 0, 1, 2, 3, 0, 2, 1]) The input data type is preserved, list/tuple in means list/tuple out. >>> np.trim_zeros([0, 1, 2, 0]) [1, 2] """ raise NotImplementedError def triu(m, k=0): """Upper triangle of an array. Return a copy of a matrix with the elements below the `k`-th diagonal zeroed. Please refer to the documentation for `tril` for further details. See Also -------- tril : lower triangle of an array Examples -------- >>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1) array([[ 1, 2, 3], [ 4, 5, 6], [ 0, 8, 9], [ 0, 0, 12]]) """ raise NotImplementedError def triu_indices(n, k=0): """Return the indices for the upper-triangle of an (n, n) array. Parameters ---------- n : int The size of the arrays for which the returned indices will be valid. k : int, optional Diagonal offset (see `triu` for details). Returns ------- inds : tuple of arrays The indices for the triangle. The returned tuple contains two arrays, each with the indices along one dimension of the array. See also -------- tril_indices : similar function, for lower-triangular. mask_indices : generic function accepting an arbitrary mask function. triu, tril Notes ----- .. versionadded:: 1.4.0 Examples -------- Compute two different sets of indices to access 4x4 arrays, one for the upper triangular part starting at the main diagonal, and one starting two diagonals further right: >>> iu1 = np.triu_indices(4) >>> iu2 = np.triu_indices(4, 2) Here is how they can be used with a sample array: >>> a = np.arange(16).reshape(4, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) Both for indexing: >>> a[iu1] array([ 0, 1, 2, 3, 5, 6, 7, 10, 11, 15]) And for assigning values: >>> a[iu1] = -1 >>> a array([[-1, -1, -1, -1], [ 4, -1, -1, -1], [ 8, 9, -1, -1], [12, 13, 14, -1]]) These cover only a small part of the whole array (two diagonals right of the main one): >>> a[iu2] = -10 >>> a array([[ -1, -1, -10, -10], [ 4, -1, -1, -10], [ 8, 9, -1, -1], [ 12, 13, 14, -1]]) """ raise NotImplementedError def triu_indices_from(arr, k=0): """Return the indices for the upper-triangle of an (n, n) array. See `triu_indices` for full details. Parameters ---------- arr : array_like The indices will be valid for square arrays whose dimensions are the same as arr. k : int, optional Diagonal offset (see `triu` for details). See Also -------- triu_indices, triu Notes ----- .. versionadded:: 1.4.0 """ raise NotImplementedError def typename(char_): """Return a description for the given data type code. Parameters ---------- char : str Data type code. Returns ------- out : str Description of the input data type code. See Also -------- dtype, typecodes Examples -------- >>> typechars = ['S1', '?', 'B', 'D', 'G', 'F', 'I', 'H', 'L', 'O', 'Q', ... 'S', 'U', 'V', 'b', 'd', 'g', 'f', 'i', 'h', 'l', 'q'] >>> for typechar in typechars: ... print typechar, ' : ', np.typename(typechar) ... S1 : character ? : bool B : unsigned char D : complex double precision G : complex long double precision F : complex single precision I : unsigned integer H : unsigned short L : unsigned long integer O : object Q : unsigned long long integer S : string U : unicode V : void b : signed char d : double precision g : long precision f : single precision i : integer h : short l : long integer q : long long integer """ raise NotImplementedError def union1d(ar1, ar2): """Find the union of two arrays. Return the unique, sorted array of values that are in either of the two input arrays. Parameters ---------- ar1, ar2 : array_like Input arrays. They are flattened if they are not already 1D. Returns ------- union : ndarray Unique, sorted union of the input arrays. See Also -------- numpy.lib.arraysetops : Module with a number of other functions for performing set operations on arrays. Examples -------- >>> np.union1d([-1, 0, 1], [-2, 0, 2]) array([-2, -1, 0, 1, 2]) """ raise NotImplementedError def unique(ar, return_index=False, return_inverse=False): """Find the unique elements of an array. Returns the sorted unique elements of an array. There are two optional outputs in addition to the unique elements: the indices of the input array that give the unique values, and the indices of the unique array that reconstruct the input array. Parameters ---------- ar : array_like Input array. This will be flattened if it is not already 1-D. return_index : bool, optional If True, also return the indices of `ar` that result in the unique array. return_inverse : bool, optional If True, also return the indices of the unique array that can be used to reconstruct `ar`. Returns ------- unique : ndarray The sorted unique values. unique_indices : ndarray, optional The indices of the unique values in the (flattened) original array. Only provided if `return_index` is True. unique_inverse : ndarray, optional The indices to reconstruct the (flattened) original array from the unique array. Only provided if `return_inverse` is True. See Also -------- numpy.lib.arraysetops : Module with a number of other functions for performing set operations on arrays. Examples -------- >>> np.unique([1, 1, 2, 2, 3, 3]) array([1, 2, 3]) >>> a = np.array([[1, 1], [2, 3]]) >>> np.unique(a) array([1, 2, 3]) Return the indices of the original array that give the unique values: >>> a = np.array(['a', 'b', 'b', 'c', 'a']) >>> u, indices = np.unique(a, return_index=True) >>> u array(['a', 'b', 'c'], dtype='|S1') >>> indices array([0, 1, 3]) >>> a[indices] array(['a', 'b', 'c'], dtype='|S1') Reconstruct the input array from the unique values: >>> a = np.array([1, 2, 6, 4, 2, 3, 2]) >>> u, indices = np.unique(a, return_inverse=True) >>> u array([1, 2, 3, 4, 6]) >>> indices array([0, 1, 4, 3, 1, 2, 1]) >>> u[indices] array([1, 2, 6, 4, 2, 3, 2]) """ raise NotImplementedError def unpackbits(myarray, axis=None): """unpackbits(myarray, axis=None) Unpacks elements of a uint8 array into a binary-valued output array. Each element of `myarray` represents a bit-field that should be unpacked into a binary-valued output array. The shape of the output array is either 1-D (if `axis` is None) or the same shape as the input array with unpacking done along the axis specified. Parameters ---------- myarray : ndarray, uint8 type Input array. axis : int, optional Unpacks along this axis. Returns ------- unpacked : ndarray, uint8 type The elements are binary-valued (0 or 1). See Also -------- packbits : Packs the elements of a binary-valued array into bits in a uint8 array. Examples -------- >>> a = np.array([[2], [7], [23]], dtype=np.uint8) >>> a array([[ 2], [ 7], [23]], dtype=uint8) >>> b = np.unpackbits(a, axis=1) >>> b array([[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8) """ # BUILTIN raise NotImplementedError def unravel_index(indices, dims, order='C'): """unravel_index(indices, dims, order='C') Converts a flat index or array of flat indices into a tuple of coordinate arrays. Parameters ---------- indices : array_like An integer array whose elements are indices into the flattened version of an array of dimensions ``dims``. Before version 1.6.0, this function accepted just one index value. dims : tuple of ints The shape of the array to use for unraveling ``indices``. order : {'C', 'F'}, optional .. versionadded:: 1.6.0 Determines whether the indices should be viewed as indexing in C (row-major) order or FORTRAN (column-major) order. Returns ------- unraveled_coords : tuple of ndarray Each array in the tuple has the same shape as the ``indices`` array. See Also -------- ravel_multi_index Examples -------- >>> np.unravel_index([22, 41, 37], (7,6)) (array([3, 6, 6]), array([4, 5, 1])) >>> np.unravel_index([31, 41, 13], (7,6), order='F') (array([3, 6, 6]), array([4, 5, 1])) >>> np.unravel_index(1621, (6,7,8,9)) (3, 1, 4, 1) """ # BUILTIN raise NotImplementedError def unwrap(p, discont=3.14159265359, axis=-1): """Unwrap by changing deltas between values to 2*pi complement. Unwrap radian phase `p` by changing absolute jumps greater than `discont` to their 2*pi complement along the given axis. Parameters ---------- p : array_like Input array. discont : float, optional Maximum discontinuity between values, default is ``pi``. axis : int, optional Axis along which unwrap will operate, default is the last axis. Returns ------- out : ndarray Output array. See Also -------- rad2deg, deg2rad Notes ----- If the discontinuity in `p` is smaller than ``pi``, but larger than `discont`, no unwrapping is done because taking the 2*pi complement would only make the discontinuity larger. Examples -------- >>> phase = np.linspace(0, np.pi, num=5) >>> phase[3:] += np.pi >>> phase array([ 0. , 0.78539816, 1.57079633, 5.49778714, 6.28318531]) >>> np.unwrap(phase) array([ 0. , 0.78539816, 1.57079633, -0.78539816, 0. ]) """ raise NotImplementedError def vander(x, N=None): """Generate a Van der Monde matrix. The columns of the output matrix are decreasing powers of the input vector. Specifically, the `i`-th output column is the input vector raised element-wise to the power of ``N - i - 1``. Such a matrix with a geometric progression in each row is named for Alexandre-Theophile Vandermonde. Parameters ---------- x : array_like 1-D input array. N : int, optional Order of (number of columns in) the output. If `N` is not specified, a square array is returned (``N = len(x)``). Returns ------- out : ndarray Van der Monde matrix of order `N`. The first column is ``x^(N-1)``, the second ``x^(N-2)`` and so forth. Examples -------- >>> x = np.array([1, 2, 3, 5]) >>> N = 3 >>> np.vander(x, N) array([[ 1, 1, 1], [ 4, 2, 1], [ 9, 3, 1], [25, 5, 1]]) >>> np.column_stack([x**(N-1-i) for i in range(N)]) array([[ 1, 1, 1], [ 4, 2, 1], [ 9, 3, 1], [25, 5, 1]]) >>> x = np.array([1, 2, 3, 5]) >>> np.vander(x) array([[ 1, 1, 1, 1], [ 8, 4, 2, 1], [ 27, 9, 3, 1], [125, 25, 5, 1]]) The determinant of a square Vandermonde matrix is the product of the differences between the values of the input vector: >>> np.linalg.det(np.vander(x)) 48.000000000000043 >>> (5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1) 48 """ raise NotImplementedError def var(a, axis=None, dtype=None, out=None, ddof=0): """Compute the variance along the specified axis. Returns the variance of the array elements, a measure of the spread of a distribution. The variance is computed for the flattened array by default, otherwise over the specified axis. Parameters ---------- a : array_like Array containing numbers whose variance is desired. If `a` is not an array, a conversion is attempted. axis : int, optional Axis along which the variance is computed. The default is to compute the variance of the flattened array. dtype : data-type, optional Type to use in computing the variance. For arrays of integer type the default is `float32`; for arrays of float types it is the same as the array type. out : ndarray, optional Alternate output array in which to place the result. It must have the same shape as the expected output, but the type is cast if necessary. ddof : int, optional "Delta Degrees of Freedom": the divisor used in the calculation is ``N - ddof``, where ``N`` represents the number of elements. By default `ddof` is zero. Returns ------- variance : ndarray, see dtype parameter above If ``out=None``, returns a new array containing the variance; otherwise, a reference to the output array is returned. See Also -------- std : Standard deviation mean : Average numpy.doc.ufuncs : Section "Output arguments" Notes ----- The variance is the average of the squared deviations from the mean, i.e., ``var = mean(abs(x - x.mean())**2)``. The mean is normally calculated as ``x.sum() / N``, where ``N = len(x)``. If, however, `ddof` is specified, the divisor ``N - ddof`` is used instead. In standard statistical practice, ``ddof=1`` provides an unbiased estimator of the variance of a hypothetical infinite population. ``ddof=0`` provides a maximum likelihood estimate of the variance for normally distributed variables. Note that for complex numbers, the absolute value is taken before squaring, so that the result is always real and nonnegative. For floating-point input, the variance is computed using the same precision the input has. Depending on the input data, this can cause the results to be inaccurate, especially for `float32` (see example below). Specifying a higher-accuracy accumulator using the ``dtype`` keyword can alleviate this issue. Examples -------- >>> a = np.array([[1,2],[3,4]]) >>> np.var(a) 1.25 >>> np.var(a,0) array([ 1., 1.]) >>> np.var(a,1) array([ 0.25, 0.25]) In single precision, var() can be inaccurate: >>> a = np.zeros((2,512*512), dtype=np.float32) >>> a[0,:] = 1.0 >>> a[1,:] = 0.1 >>> np.var(a) 0.20405951142311096 Computing the standard deviation in float64 is more accurate: >>> np.var(a, dtype=np.float64) 0.20249999932997387 >>> ((1-0.55)**2 + (0.1-0.55)**2)/2 0.20250000000000001 """ raise NotImplementedError def vdot(): """Return the dot product of two vectors. The vdot(`a`, `b`) function handles complex numbers differently than dot(`a`, `b`). If the first argument is complex the complex conjugate of the first argument is used for the calculation of the dot product. Note that `vdot` handles multidimensional arrays differently than `dot`: it does *not* perform a matrix product, but flattens input arguments to 1-D vectors first. Consequently, it should only be used for vectors. Parameters ---------- a : array_like If `a` is complex the complex conjugate is taken before calculation of the dot product. b : array_like Second argument to the dot product. Returns ------- output : ndarray Dot product of `a` and `b`. Can be an int, float, or complex depending on the types of `a` and `b`. See Also -------- dot : Return the dot product without using the complex conjugate of the first argument. Examples -------- >>> a = np.array([1+2j,3+4j]) >>> b = np.array([5+6j,7+8j]) >>> np.vdot(a, b) (70-8j) >>> np.vdot(b, a) (70+8j) Note that higher-dimensional arrays are flattened! >>> a = np.array([[1, 4], [5, 6]]) >>> b = np.array([[4, 1], [2, 2]]) >>> np.vdot(a, b) 30 >>> np.vdot(b, a) 30 >>> 1*4 + 4*1 + 5*2 + 6*2 30 """ # BUILTIN raise NotImplementedError def vsplit(ary, indices_or_sections): """Split an array into multiple sub-arrays vertically (row-wise). Please refer to the ``split`` documentation. ``vsplit`` is equivalent to ``split`` with `axis=0` (default), the array is always split along the first axis regardless of the array dimension. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(4, 4) >>> x array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]) >>> np.vsplit(x, 2) [array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.]]), array([[ 8., 9., 10., 11.], [ 12., 13., 14., 15.]])] >>> np.vsplit(x, np.array([3, 6])) [array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]), array([[ 12., 13., 14., 15.]]), array([], dtype=float64)] With a higher dimensional array the split is still along the first axis. >>> x = np.arange(8.0).reshape(2, 2, 2) >>> x array([[[ 0., 1.], [ 2., 3.]], [[ 4., 5.], [ 6., 7.]]]) >>> np.vsplit(x, 2) [array([[[ 0., 1.], [ 2., 3.]]]), array([[[ 4., 5.], [ 6., 7.]]])] """ raise NotImplementedError def vstack(tup): """Stack arrays in sequence vertically (row wise). Take a sequence of arrays and stack them vertically to make a single array. Rebuild arrays divided by `vsplit`. Parameters ---------- tup : sequence of ndarrays Tuple containing arrays to be stacked. The arrays must have the same shape along all but the first axis. Returns ------- stacked : ndarray The array formed by stacking the given arrays. See Also -------- hstack : Stack arrays in sequence horizontally (column wise). dstack : Stack arrays in sequence depth wise (along third dimension). concatenate : Join a sequence of arrays together. vsplit : Split array into a list of multiple sub-arrays vertically. Notes ----- Equivalent to ``np.concatenate(tup, axis=0)`` Examples -------- >>> a = np.array([1, 2, 3]) >>> b = np.array([2, 3, 4]) >>> np.vstack((a,b)) array([[1, 2, 3], [2, 3, 4]]) >>> a = np.array([[1], [2], [3]]) >>> b = np.array([[2], [3], [4]]) >>> np.vstack((a,b)) array([[1], [2], [3], [2], [3], [4]]) """ raise NotImplementedError def where(): """where(condition, [x, y]) Return elements, either from `x` or `y`, depending on `condition`. If only `condition` is given, return ``condition.nonzero()``. Parameters ---------- condition : array_like, bool When True, yield `x`, otherwise yield `y`. x, y : array_like, optional Values from which to choose. `x` and `y` need to have the same shape as `condition`. Returns ------- out : ndarray or tuple of ndarrays If both `x` and `y` are specified, the output array contains elements of `x` where `condition` is True, and elements from `y` elsewhere. If only `condition` is given, return the tuple ``condition.nonzero()``, the indices where `condition` is True. See Also -------- nonzero, choose Notes ----- If `x` and `y` are given and input arrays are 1-D, `where` is equivalent to:: [xv if c else yv for (c,xv,yv) in zip(condition,x,y)] Examples -------- >>> np.where([[True, False], [True, True]], ... [[1, 2], [3, 4]], ... [[9, 8], [7, 6]]) array([[1, 8], [3, 4]]) >>> np.where([[0, 1], [1, 0]]) (array([0, 1]), array([1, 0])) >>> x = np.arange(9.).reshape(3, 3) >>> np.where( x > 5 ) (array([2, 2, 2]), array([0, 1, 2])) >>> x[np.where( x > 3.0 )] # Note: result is 1D. array([ 4., 5., 6., 7., 8.]) >>> np.where(x < 5, x, -1) # Note: broadcasting. array([[ 0., 1., 2.], [ 3., 4., -1.], [-1., -1., -1.]]) """ # BUILTIN raise NotImplementedError def who(vardict=None): """Print the Numpy arrays in the given dictionary. If there is no dictionary passed in or `vardict` is None then returns Numpy arrays in the globals() dictionary (all Numpy arrays in the namespace). Parameters ---------- vardict : dict, optional A dictionary possibly containing ndarrays. Default is globals(). Returns ------- out : None Returns 'None'. Notes ----- Prints out the name, shape, bytes and type of all of the ndarrays present in `vardict`. Examples -------- >>> a = np.arange(10) >>> b = np.ones(20) >>> np.who() Name Shape Bytes Type =========================================================== a 10 40 int32 b 20 160 float64 Upper bound on total bytes = 200 >>> d = {'x': np.arange(2.0), 'y': np.arange(3.0), 'txt': 'Some str', ... 'idx':5} >>> np.who(d) Name Shape Bytes Type =========================================================== y 3 24 float64 x 2 16 float64 Upper bound on total bytes = 40 """ raise NotImplementedError ga-5-4/python/ga4py/gain/core.pyx0000644000175000017500000032405112662210323015007 0ustar mbamba# cython: profile=True cimport mpi4py.MPI as MPI import mpi4py.MPI as MPI from ga4py import ga import util import numpy as np cimport numpy as np import os cpdef int me(): return ga.pgroup_nodeid(ga.pgroup_get_default()) cpdef int nproc(): return ga.pgroup_nnodes(ga.pgroup_get_default()) # at what point do we distribute arrays versus leaving as np.ndarray? cdef int SIZE_THRESHOLD = 1 cpdef int get_size_threshold(): global SIZE_THRESHOLD return SIZE_THRESHOLD cpdef set_size_threshold(int threshold): global SIZE_THRESHOLD SIZE_THRESHOLD = threshold cpdef bint should_distribute(shape): the_shape = listify(shape) if len(the_shape) == 0: return False return np.multiply.reduce(the_shape) >= get_size_threshold() cpdef bint is_distributed(thing): return isinstance(thing, (ndarray,flatiter)) cpdef bint is_array(thing): return isinstance(thing, (ndarray,flatiter,np.ndarray,np.flatiter)) cpdef get_shape(thing): try: return thing.shape # an ndarray except AttributeError: return (len(thing),) # a flatiter cpdef get_dtype(thing): try: return thing.dtype # an ndarray except AttributeError: return thing.base.dtype # a flatiter cpdef list listify(thing): try: return list(thing) except: return [thing] cpdef tuple tuplify(thing): try: return tuple(thing) except: return (thing,) gatypes = { np.dtype(np.int8): ga.C_CHAR, np.dtype(np.int32): ga.C_INT, np.dtype(np.int64): ga.C_LONG, np.dtype(np.float32): ga.C_FLOAT, np.dtype(np.float64): ga.C_DBL, np.dtype(np.complex64): ga.C_SCPL, np.dtype(np.complex128): ga.C_DCPL, } # numpy doesn't always have these types depending on the system cdef bint float128_in_np = ('float128' in dir(np)) cdef bint complex256_in_np = ('complex256' in dir(np)) if float128_in_np: gatypes[np.dtype(np.float128)] = ga.C_LDBL if complex256_in_np: gatypes[np.dtype(np.complex256)] = ga.C_LDCPL cdef bint _mask_sync = False cpdef inline mask_sync(): global _mask_sync _mask_sync = True cpdef inline sync(): #print "syncing over group %s" % ga.pgroup_get_default() #ga.pgroup_sync(ga.pgroup_get_default()) if not _mask_sync: ga.sync() # internally it checks for the default group class flagsobj(object): def __init__(self): self._c = True self._f = False self._o = True self._w = True self._a = True self._u = False def _get_c(self): return self._c c_contiguous = property(_get_c) def _get_f(self): return self._f f_contiguous = property(_get_f) def _get_o(self): return self._o owndata = property(_get_o) def _get_w(self): return self._w writeable = property(_get_w) def _get_a(self): return self._a aligned = property(_get_a) def _get_u(self): return self._u updateifcopy = property(_get_u) def __getitem__(self, item): if isinstance(item, str): if item == "C" or item == "C_CONTIGUOUS": return self._c if item == "F" or item == "F_CONTIGUOUS": return self._f if item == "O" or item == "OWNDATA": return self._o if item == "W" or item == "WRITEABLE": return self._w if item == "A" or item == "ALIGNED": return self._a if item == "U" or item == "UPDATEIFCOPY": return self._u raise KeyError, "Unknown flag" def __repr__(self): return """ C_CONTIGUOUS : %s F_CONTIGUOUS : %s OWNDATA : %s WRITEABLE : %s ALIGNED : %s UPDATEIFCOPY : %s""" % (self._c, self._f, self._o, self._w, self._a, self._u) class GlobalArrayCache(object): """When ndarray instances are removed, their GA handles are preserved. This class abstracts away various caching schemes in use and proides a consistent interface. The scheme that inspired this cache was to preserve the last three arrays with the same shape and type. Using the cache avoids many create/destroy cycles for GAs which occur as part of temporary array creation during numpy codes. """ def __init__(self, level=3): self.cache = {} self.level = level def __del__(self): for value in self.cache.values(): for g_a in value: ga.destroy(g_a) def __contains__(self, item): return (item in self.cache and self.cache[item]) def __getitem__(self, item): if item in self.cache and self.cache[item]: return self.cache[item].pop() raise KeyError, item def __setitem__(self, item, value): if item in self.cache: self.cache[item].append(value) else: self.cache[item] = [value] def count(self, item): if item in self.cache: return len(self.cache[item]) return 0 def empty(self, item): return self.count(item) == 0 def full(self, item): return self.count(item) == self.level def pop(self, item): return self[item] def size(self): """Return the size of the cache in bytes.""" ga_cache = GlobalArrayCache() class ndarray(object): """ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None) An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.) Arrays should be constructed using `array`, `zeros` or `empty` (refer to the See Also section below). The parameters given here refer to a low-level method (`ndarray(...)`) for instantiating an array. For more information, refer to the `numpy` module and examine the the methods and attributes of an array. Parameters ---------- (for the __new__ method; see Notes below) shape : tuple of ints Shape of created array. dtype : data-type, optional Any object that can be interpreted as a numpy data type. buffer : object exposing buffer interface, optional Used to fill the array with data. offset : int, optional Offset of array data in buffer. strides : tuple of ints, optional Strides of data in memory. order : {'C', 'F'}, optional Row-major or column-major order. Parameters added for Global Arrays ---------------------------------- base : ndarray Should be a "gainarray". Used during view creation so that a new Global Array is not created and other attributes from base are copied into the view ndarray. Attributes ---------- T : ndarray Transpose of the array. data : buffer The array's elements, in memory. dtype : dtype object Describes the format of the elements in the array. flags : dict Dictionary containing information related to memory use, e.g., 'C_CONTIGUOUS', 'OWNDATA', 'WRITEABLE', etc. flat : numpy.flatiter object Flattened version of the array as an iterator. The iterator allows assignments, e.g., ``x.flat = 3`` (See `ndarray.flat` for assignment examples; TODO). imag : ndarray Imaginary part of the array. real : ndarray Real part of the array. size : int Number of elements in the array. itemsize : int The memory use of each array element in bytes. nbytes : int The total number of bytes required to store the array data, i.e., ``itemsize * size``. ndim : int The array's number of dimensions. shape : tuple of ints Shape of the array. strides : tuple of ints The step-size required to move from one element to the next in memory. For example, a contiguous ``(3, 4)`` array of type ``int16`` in C-order has strides ``(8, 2)``. This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (``2 * 4``). ctypes : ctypes object Class containing properties of the array needed for interaction with ctypes. base : ndarray If the array is a view into another array, that array is its `base` (unless that array is also a view). The `base` array is where the array data is actually stored. Attributes added for Global Arrays ---------------------------------- handle : int The Global Arrays handle. global_slice: tuple of integers and/or slice objects Represents the slice to take from this ndarray. global_slice is calculated first based on the shape of the array, then as slices are taken from it, slice arithmetic is performed. When an ndarray is accessed or converted to an ndarray, the global_slice is used to turn the ndarray into its correct shape/strides before returning to the caller. _is_real : bool Whether this is a 'real' view of a complex ndarray. _is_imag : bool Whether this is an 'imag' view of a complex ndarray. _T : None, tuple of ints None, or a tuple of ints If a transpose has been applied. 'i' in the 'j'-th place in the tuple means 'a's 'i'-th axis becomes 'a.transpose()'s 'j'-th axis. _T_inv : None, tuple of ints The inverse of _T, or how to reverse the current transpose See Also -------- array : Construct an array. zeros : Create an array, each element of which is zero. empty : Create an array, but leave its allocated memory unchanged (i.e., it contains "garbage"). dtype : Create a data-type. Notes ----- There are two modes of creating an array using ``__new__``: 1. If `buffer` is None, then only `shape`, `dtype`, and `order` are used. 2. If `buffer` is an object exposing the buffer interface, then all keywords are interpreted. No ``__init__`` method is needed because the array is fully initialized after the ``__new__`` method. Examples -------- These examples illustrate the low-level `ndarray` constructor. Refer to the `See Also` section above for easier ways of constructing an ndarray. First mode, `buffer` is None: >>> np.ndarray(shape=(2,2), dtype=float, order='F') array([[ -1.13698227e+002, 4.25087011e-303], [ 2.88528414e-306, 3.27025015e-309]]) Second mode: >>> np.ndarray((2,), buffer=np.array([1,2,3]), ... offset=np.int_().itemsize, ... dtype=int) # offset = 1*itemsize, i.e. skip first element array([2, 3]) """ def __new__(cls, shape, dtype=float, buffer=None, offset=0, strides=None, order=None, base=None): if base is None and not should_distribute(shape): return np.ndarray(shape, dtype, buffer, offset, strides, order) return super(ndarray, cls).__new__(cls) def __init__(self, shape, dtype=float, buffer=None, offset=0, strides=None, order=None, base=None): shape = tuplify(shape) if order not in [None,'C','F']: raise TypeError, "order not understood" if order is None: order = 'C' if order is 'F': raise NotImplementedError, "Fortran order not supported" self._dtype = np.dtype(dtype) self._order = order self._base = base self._is_real = False self._is_imag = False if base is None: self.global_slice = util.MasterKey(shape) self._flags = flagsobj() dtype_ = self._dtype gatype = None if dtype_ in gatypes: gatype = gatypes[dtype_] else: gatype = ga.register_dtype(dtype_) gatypes[dtype_] = gatype if (shape,dtype_.str) in ga_cache: self.handle = ga_cache.pop((shape,dtype_.str)) else: self.handle = ga.create(gatype, shape, pgroup=ga.pgroup_get_default()) if buffer is not None: local = ga.access(self.handle) if local is not None: a = None if isinstance(buffer, np.ndarray): buffer.shape = shape a = buffer else: a = np.ndarray(shape, dtype_, buffer, offset, strides, order) local[:] = a[ga.zip(*self.distribution())] self.release_update() self._strides = [self.itemsize] for size in shape[-1:0:-1]: self._strides = [size*self._strides[0]] + self._strides elif isinstance(base, ndarray): self.global_slice = base.global_slice self.handle = base.handle self._strides = strides self._is_real = base._is_real self._is_imag = base._is_imag self._flags = base._flags self._flags._c = False self._flags._o = False else: # assume base is a g_a handle self.handle = base self.global_slice = util.MasterKey(shape) self._flags = flagsobj() self._strides = [self.itemsize] for size in shape[-1:0:-1]: self._strides = [size*self._strides[0]] + self._strides def __del__(self): if self._base is None: if ga.initialized(): shape = self.shape if ga_cache.full((shape,self.dtype.str)): ga.destroy(self.handle) else: ga_cache[(shape,self.dtype.str)] = self.handle ################################################################ ### ndarray methods added for Global Arrays ################################################################ def distribution(self): """Return the bounds of the distribution. Always returns the lo/hi distribution based on the original shape of the array. This operation is local. """ return ga.distribution(self.handle) def owns(self): """Return True if this process owns some of the data. This operation is local. """ lo,hi = self.distribution() return np.all(hi>=0) def access(self, global_slice=None): """Access the local array. Return None if no data is owned. This operation is local. """ # we access the entire block for this process a = ga.access(self.handle) if a is None: return None # bail; this process doesn't own any data # get the original GA distribution lo,hi = ga.distribution(self.handle) # caller may pass in a different global_slice if global_slice is None: global_slice = self.global_slice # transpose, if needed b = a.transpose(global_slice.lohi_T()) # slice away any fixed dimensions try: fixed_slice = global_slice.access_key(lo,hi) except IndexError: self.release() return None # bail; this process doesn't own relevant piece c = b[fixed_slice] # at this point the shape of c should match the global_slice shape # except for any None/newaxis added d = c[global_slice.None_key()] return d def get(self, key=None): """Similar to the __getitem__ built-in, but one-sided (not collective.) We sometimes want the semantics of "slicing" an ndarray and then immediately calling ga.get() to fetch the result. We can't use the __getitem__ built-in because it is a collective operation. For example, during a ufunc we need to get() the corresponding pieces of the arrays and that is where this function is handy. This operation is one-sided. """ # caller may modify the global_slice global_slice = self.global_slice if key is not None: global_slice = self.global_slice[key] # determine the lo/hi/skip for the ga.strided_get() _lo,_hi,_skip,adjust,need_strided = global_slice.get_lo_hi_skip_adjust() if need_strided: ret = ga.strided_get(self.handle, _lo, _hi, _skip) else: ret = ga.get(self.handle, _lo, _hi) # pull out real or imag parts, if needed if self._is_real: ret = ret.real elif self._is_imag: ret = ret.imag # apply the adjustment (which only reverses some dimensions, if needed) ret = ret[adjust] # transpose the result, if needed ret = ret.transpose(global_slice.lohi_T()) # reshape the array based on global_slice # this will add any newaxis and remove any fixed dimensions ret.shape = global_slice.shape return ret def allget(self, key=None): """Like get(), but when all processes need the same piece. This operation is collective. """ # TODO it's not clear whether this approach is better than having all # P processors ga.get() the same piece. if not me(): result = self.get(key) return comm().bcast(result) else: return comm().bcast() def gather(self, i): """Use ga.gather() but modify the indicies `i' based on global_slice. Parameters ---------- i : 1D or 2D array of indices see ga.gather() documentation) """ # we need to modify the indices based on the global_slice # the underlying GA instance might not have the same shape, may be a # view, etc # make sure we're always working with a 2D index array i = np.asarray(i, dtype=np.int64) if i.ndim == 1: i.shape = (-1,self.ndim) step = [] start = [] for gs in self.global_slice: if isinstance(gs, util.RangeKey): step.append(gs.step) start.append(gs.start) elif isinstance(gs, util.NoneKey): step.append(1) start.append(0) elif isinstance(gs, util.FixedKey): pass else: raise TypeError, "unhandled piece of global_slice" # modify new index array based on global_slice new_i = (i*np.asarray(step,dtype=np.int64)[None,:] + np.asarray(start, dtype=np.int64)[None,:]) # get rid of index columns which don't refer to an actual GA dimension # add index columns which were missing, single-valued GA dimensions columns = np.hsplit(new_i,self.ndim) # returns a list column_iter = iter(columns) new_columns = [None]*self.global_slice.get_original_ndim() for fixed in self.global_slice.fixed: new_column = np.empty((len(new_i),1),dtype=np.int64) new_column[:] = fixed.value new_columns[fixed.origin] = new_column for col,gs in zip(columns,self.global_slice.data): if isinstance(gs, util.RangeKey): # no change to column new_columns[gs.origin] = col elif isinstance(gs, util.NoneKey): # skip column pass elif isinstance(gs, util.FixedKey): raise TypeError, "FixedKey found in MasterKey" else: raise TypeError, "unhandled piece of global_slice" new_i = np.hstack(new_columns) return ga.gather(self.handle, new_i) def release(self): ga.release(self.handle) def release_update(self): ga.release_update(self.handle) ################################################################ ### ndarray properties ################################################################ def _get_T(self): return self.transpose() T = property(_get_T) def _get_data(self): a = self.access() if a is not None: return a.data return None data = property(_get_data) def _get_dtype(self): return self._dtype dtype = property(_get_dtype) def _get_flags(self): return self._flags flags = property(_get_flags) def _get_flat(self): return flatiter(self) def _set_flat(self, value): a = flatiter(self) a[:] = value flat = property(_get_flat,_set_flat) def _get_imag(self): if self._dtype.kind != 'c': return zeros(self.shape, self.dtype) else: ret = self[:] ret._is_imag = True ret._dtype = np.dtype("float%s" % (self._dtype.itemsize/2*8)) return ret def _set_imag(self, value): if self._dtype.kind != 'c': raise TypeError, "array does not have imaginary part to set" else: self._get_imag()[:] = value imag = property(_get_imag,_set_imag) def _get_real(self): if self._dtype.kind != 'c': return self else: ret = self[:] ret._is_real = True ret._dtype = np.dtype("float%s" % (self._dtype.itemsize/2*8)) return ret def _set_real(self, value): self._get_real()[:] = value real = property(_get_real,_set_real) def _get_size(self): return reduce(lambda x,y: x*y, self.shape, 1) size = property(_get_size) def _get_itemsize(self): return self._dtype.itemsize itemsize = property(_get_itemsize) def _get_nbytes(self): return self.itemsize * self.size nbytes = property(_get_nbytes) def _get_ndim(self): return len(self.shape) ndim = property(_get_ndim) def _get_shape(self): return self.global_slice.shape def _set_shape(self, value): if self.base is None: # we can change the underlying GA # we do this by creating a new ndarray and copying properties a = self.reshape(value) ga.destroy(self.handle) self.handle = a.handle self.global_slice = a.global_slice self._strides = a.strides self._flags = a._flags else: raise AttributeError, "incompatible shape for a non-contiguous array" shape = property(_get_shape, _set_shape) def _get_strides(self): strides = [self.itemsize] for size in self.shape[-1:0:-1]: strides = [size*strides[0]] + strides return strides strides = property(_get_strides) def _get_ctypes(self): raise NotImplementedError, "TODO" ctypes = property(_get_ctypes) def _get_base(self): return self._base base = property(_get_base) ################################################################ ### ndarray methods ################################################################ def all(self, axis=None, out=None): """Returns True if all elements evaluate to True. Refer to `numpy.all` for full documentation. See Also -------- numpy.all : equivalent function """ raise NotImplementedError def any(self, axis=None, out=None): """ Returns True if any of the elements of `a` evaluate to True. Refer to `numpy.any` for full documentation. See Also -------- numpy.any : equivalent function """ raise NotImplementedError def argmax(self, axis=None, out=None): """Return indices of the maximum values along the given axis. Refer to `numpy.argmax` for full documentation. See Also -------- numpy.argmax : equivalent function """ raise NotImplementedError def argmin(self, axis=None, out=None): """Return indices of the minimum values along the given axis of `a`. Refer to `numpy.argmin` for detailed documentation. See Also -------- numpy.argmin : equivalent function """ raise NotImplementedError def argsort(self, axis=-1, kind='quicksort', order=None): """Returns the indices that would sort this array. Refer to `numpy.argsort` for full documentation. See Also -------- numpy.argsort : equivalent function """ raise NotImplementedError def astype(self, t): """Copy of the array, cast to a specified type. Parameters ---------- t : string or dtype Typecode or data-type to which the array is cast. Examples -------- >>> x = np.array([1, 2, 2.5]) >>> x array([ 1. , 2. , 2.5]) >>> x.astype(int) array([1, 2, 2]) """ # TODO we can optimize a copy if new and old ndarray instances align the_copy = ndarray(self.shape, dtype=t) if should_distribute(the_copy.size): local = the_copy.access() if local is not None: lo,hi = the_copy.distribution() local[:] = self.get(ga.zip(lo,hi)) the_copy.release_update() else: # case where the copy is not distributed but the original was the_copy[:] = self.allget() return the_copy def byteswap(self, inplace=False): """Swap the bytes of the array elements Toggle between low-endian and big-endian data representation by returning a byteswapped array, optionally swapped in-place. Parameters ---------- inplace: bool, optional If ``True``, swap bytes in-place, default is ``False``. Returns ------- out: ndarray The byteswapped array. If `inplace` is ``True``, this is a view to self. Examples -------- >>> A = np.array([1, 256, 8755], dtype=np.int16) >>> map(hex, A) ['0x1', '0x100', '0x2233'] >>> A.byteswap(True) array([ 256, 1, 13090], dtype=int16) >>> map(hex, A) ['0x100', '0x1', '0x3322'] Arrays of strings are not swapped >>> A = np.array(['ceg', 'fac']) >>> A.byteswap() array(['ceg', 'fac'], dtype='|S3') """ raise NotImplementedError def choose(self, choices, out=None, mode='raise'): """Use an index array to construct a new array from a set of choices. Refer to `numpy.choose` for full documentation. See Also -------- numpy.choose : equivalent function """ raise NotImplementedError def clip(self, a_min, a_max, out=None): """Return an array whose values are limited to ``[a_min, a_max]``. Refer to `numpy.clip` for full documentation. See Also -------- numpy.clip : equivalent function """ raise NotImplementedError def compress(self, condition, axis=None, out=None): """Return selected slices of this array along given axis. Refer to `numpy.compress` for full documentation. See Also -------- numpy.compress : equivalent function """ return NotImplementedError def conj(self): """Complex-conjugate all elements. Refer to `numpy.conjugate` for full documentation. See Also -------- numpy.conjugate : equivalent function """ raise NotImplementedError def conjugate(self): """Return the complex conjugate, element-wise. Refer to `numpy.conjugate` for full documentation. See Also -------- numpy.conjugate : equivalent function """ raise NotImplementedError def copy(self, order='C'): """Return a copy of the array. Parameters ---------- order : {'C', 'F', 'A'}, optional By default, the result is stored in C-contiguous (row-major) order in memory. If `order` is `F`, the result has 'Fortran' (column-major) order. If order is 'A' ('Any'), then the result has the same order as the input. Examples -------- >>> x = np.array([[1,2,3],[4,5,6]], order='F') >>> y = x.copy() >>> x.fill(0) >>> x array([[0, 0, 0], [0, 0, 0]]) >>> y array([[1, 2, 3], [4, 5, 6]]) >>> y.flags['C_CONTIGUOUS'] True """ # TODO we can optimize a copy if new and old ndarray instances align the_copy = ndarray(self.shape, dtype=self.dtype) if should_distribute(the_copy.size): local = the_copy.access() if local is not None: lo,hi = the_copy.distribution() local[:] = self.get(ga.zip(lo,hi)) the_copy.release_update() else: # case where the copy is not distributed but the original was the_copy[:] = self.allget() return the_copy def cumprod(self, axis=None, dtype=None, out=None): """Return the cumulative product of the elements along the given axis. Refer to `numpy.cumprod` for full documentation. See Also -------- numpy.cumprod : equivalent function """ raise NotImplementedError def cumsum(self, axis=None, dtype=None, out=None): """Return the cumulative sum of the elements along the given axis. Refer to `numpy.cumsum` for full documentation. See Also -------- numpy.cumsum : equivalent function """ raise NotImplementedError def diagonal(self, offset=0, axis1=0, axis2=1): """Return specified diagonals. Refer to `numpy.diagonal` for full documentation. See Also -------- numpy.diagonal : equivalent function """ if self.ndim < 2: raise ValueError, "array.ndim must be >= 2" if self.ndim != 2: raise NotImplementedError, "diagonal for a.ndim > 2" nrow,ncol = self.shape if offset >= 0: size = min(ncol-offset,nrow) else: size = min(nrow+offset,ncol) out = ndarray(size, dtype=self.dtype) if not is_distributed(out): raise NotImplementedError, "resulting diagonal is not distributed" npout = out.access() if npout is not None: indices = np.empty((size,2), dtype=np.int64) if offset >= 0: indices[:,0] = np.arange(size, dtype=np.int64) indices[:,1] = np.arange(offset, size+offset, dtype=np.int64) else: offset = -offset indices[:,0] = np.arange(offset, size+offset, dtype=np.int64) indices[:,1] = np.arange(size, dtype=np.int64) my_range = out.global_slice.bound_by_lohi(*out.distribution()) my_range = my_range[0].pyobj() my_indices = indices[my_range] npout[:] = self.gather(my_indices) return out def dot(self, b, out=None): """a.dot(b, out=None) Dot product of two arrays. Refer to `numpy.dot` for full documentation. See Also -------- numpy.dot : equivalent function Examples -------- >>> a = np.eye(2) >>> b = np.ones((2, 2)) * 2 >>> a.dot(b) array([[ 2., 2.], [ 2., 2.]]) This array method can be conveniently chained: >>> a.dot(b).dot(b) array([[ 8., 8.], [ 8., 8.]]) """ raise NotImplementedError def dump(self, file): """Dump a pickle of the array to the specified file. The array can be read back with pickle.load or numpy.load. Parameters ---------- file : str A string naming the dump file. """ raise NotImplementedError def dumps(self): """Returns the pickle of the array as a string. pickle.loads or numpy.loads will convert the string back to an array. Parameters ---------- None """ raise NotImplementedError def fill(self, value): """Fill the array with a scalar value. Parameters ---------- value : scalar All elements of `a` will be assigned this value. Examples -------- >>> a = np.array([1, 2]) >>> a.fill(0) >>> a array([0, 0]) >>> a = np.empty(2) >>> a.fill(1) >>> a array([ 1., 1.]) """ a = self.access() if a is not None: a.fill(value) self.release_update() def flatten(self, order='C'): """Return a copy of the array collapsed into one dimension. Parameters ---------- order : {'C', 'F'}, optional Whether to flatten in C (row-major) or Fortran (column-major) order. The default is 'C'. Returns ------- y : ndarray A copy of the input array, flattened to one dimension. See Also -------- ravel : Return a flattened array. flat : A 1-D flat iterator over the array. Examples -------- >>> a = np.array([[1,2], [3,4]]) >>> a.flatten() array([1, 2, 3, 4]) >>> a.flatten('F') array([1, 3, 2, 4]) """ return self.reshape(self.size) def getfield(self, dtype, offset): """Returns a field of the given array as a certain type. A field is a view of the array data with each itemsize determined by the given type and the offset into the current array, i.e. from ``offset * dtype.itemsize`` to ``(offset+1) * dtype.itemsize``. Parameters ---------- dtype : str String denoting the data type of the field. offset : int Number of `dtype.itemsize`'s to skip before beginning the element view. Examples -------- >>> x = np.diag([1.+1.j]*2) >>> x array([[ 1.+1.j, 0.+0.j], [ 0.+0.j, 1.+1.j]]) >>> x.dtype dtype('complex128') >>> x.getfield('complex64', 0) # Note how this != x array([[ 0.+1.875j, 0.+0.j ], [ 0.+0.j , 0.+1.875j]], dtype=complex64) >>> x.getfield('complex64',1) # Note how different this is than x array([[ 0. +5.87173204e-39j, 0. +0.00000000e+00j], [ 0. +0.00000000e+00j, 0. +5.87173204e-39j]], dtype=complex64) >>> x.getfield('complex128', 0) # == x array([[ 1.+1.j, 0.+0.j], [ 0.+0.j, 1.+1.j]]) If the argument dtype is the same as x.dtype, then offset != 0 raises a ValueError: >>> x.getfield('complex128', 1) Traceback (most recent call last): File "", line 1, in ValueError: Need 0 <= offset <= 0 for requested type but received offset = 1 >>> x.getfield('float64', 0) array([[ 1., 0.], [ 0., 1.]]) >>> x.getfield('float64', 1) array([[ 1.77658241e-307, 0.00000000e+000], [ 0.00000000e+000, 1.77658241e-307]]) """ raise NotImplementedError def item(self, *args): """Copy an element of an array to a standard Python scalar and return it. Parameters ---------- \*args : Arguments (variable number and type) * none: in this case, the method only works for arrays with one element (`a.size == 1`), which element is copied into a standard Python scalar object and returned. * int_type: this argument is interpreted as a flat index into the array, specifying which element to copy and return. * tuple of int_types: functions as does a single int_type argument, except that the argument is interpreted as an nd-index into the array. Returns ------- z : Standard Python scalar object A copy of the specified element of the array as a suitable Python scalar Notes ----- When the data type of `a` is longdouble or clongdouble, item() returns a scalar array object because there is no available Python scalar that would not lose information. Void arrays return a buffer object for item(), unless fields are defined, in which case a tuple is returned. `item` is very similar to a[args], except, instead of an array scalar, a standard Python scalar is returned. This can be useful for speeding up access to elements of the array and doing arithmetic on elements of the array using Python's optimized math. Examples -------- >>> x = np.random.randint(9, size=(3, 3)) >>> x array([[3, 1, 7], [2, 8, 3], [8, 5, 3]]) >>> x.item(3) 2 >>> x.item(7) 5 >>> x.item((0, 1)) 1 >>> x.item((2, 2)) 3 """ raise NotImplementedError def itemset(self, *args): """Insert scalar into an array (scalar is cast to array's dtype, if possible) There must be at least 1 argument, and define the last argument as *item*. Then, ``a.itemset(*args)`` is equivalent to but faster than ``a[args] = item``. The item should be a scalar value and `args` must select a single item in the array `a`. Parameters ---------- \*args : Arguments If one argument: a scalar, only used in case `a` is of size 1. If two arguments: the last argument is the value to be set and must be a scalar, the first argument specifies a single array element location. It is either an int or a tuple. Notes ----- Compared to indexing syntax, `itemset` provides some speed increase for placing a scalar into a particular location in an `ndarray`, if you must do this. However, generally this is discouraged: among other problems, it complicates the appearance of the code. Also, when using `itemset` (and `item`) inside a loop, be sure to assign the methods to a local variable to avoid the attribute look-up at each loop iteration. Examples -------- >>> x = np.random.randint(9, size=(3, 3)) >>> x array([[3, 1, 7], [2, 8, 3], [8, 5, 3]]) >>> x.itemset(4, 0) >>> x.itemset((2, 2), 9) >>> x array([[3, 1, 7], [2, 0, 3], [8, 5, 9]]) """ raise NotImplementedError def max(self, axis=None, out=None): """Return the maximum along a given axis. Refer to `numpy.amax` for full documentation. See Also -------- numpy.amax : equivalent function """ if axis is None: a = self.access() if a is not None: result = np.maximum.reduce(a) while result.ndim > 0: result = np.maximum.reduce(result) result = comm().allgather(result) result = np.maximum.reduce(result) else: # we don't own anything, so get an actual value from the array result = self.get([0]*self.ndim) result = comm().allgather(result) result = np.maximum.reduce(result) if out is None: return result else: out[:] = result return out else: return maximum.reduce(self, axis, out) def mean(self, axis=None, dtype=None, out=None): """Returns the average of the array elements along given axis. Refer to `numpy.mean` for full documentation. See Also -------- numpy.mean : equivalent function """ raise NotImplementedError def min(self, axis=None, out=None): """Return the minimum along a given axis. Refer to `numpy.amin` for full documentation. See Also -------- numpy.amin : equivalent function """ if axis is None: a = self.access() if a is not None: result = np.minimum.reduce(a) while result.ndim > 0: result = np.minimum.reduce(result) result = comm().allgather(result) result = np.minimum.reduce(result) else: # we don't own anything, so get an actual value from the array result = self.get([0]*self.ndim) result = comm().allgather(result) result = np.minimum.reduce(result) if out is None: return result else: out[:] = result return out else: return minimum.reduce(self, axis, out) def newbyteorder(self, new_order='S'): """Return the array with the same data viewed with a different byte order. Equivalent to:: arr.view(arr.dtype.newbytorder(new_order)) Changes are also made in all fields and sub-arrays of the array data type. Parameters ---------- new_order : string, optional Byte order to force; a value from the byte order specifications above. `new_order` codes can be any of:: * 'S' - swap dtype from current to opposite endian * {'<', 'L'} - little endian * {'>', 'B'} - big endian * {'=', 'N'} - native order * {'|', 'I'} - ignore (no change to byte order) The default value ('S') results in swapping the current byte order. The code does a case-insensitive check on the first letter of `new_order` for the alternatives above. For example, any of 'B' or 'b' or 'biggish' are valid to specify big-endian. Returns ------- new_arr : array New array object with the dtype reflecting given change to the byte order. """ raise NotImplementedError def nonzero(self): """Return the indices of the elements that are non-zero. Refer to `numpy.nonzero` for full documentation. See Also -------- numpy.nonzero : equivalent function """ raise NotImplementedError def prod(self, axis=None, dtype=None, out=None): """Return the product of the array elements over the given axis Refer to `numpy.prod` for full documentation. See Also -------- numpy.prod : equivalent function """ raise NotImplementedError def ptp(self, axis=None, out=None): """Peak to peak (maximum - minimum) value along a given axis. Refer to `numpy.ptp` for full documentation. See Also -------- numpy.ptp : equivalent function """ raise NotImplementedError def put(self, indices, values, mode='raise'): """Set ``a.flat[n] = values[n]`` for all `n` in indices. Refer to `numpy.put` for full documentation. See Also -------- numpy.put : equivalent function """ raise NotImplementedError def ravel(self, order=None): """Return a flattened array. Refer to `numpy.ravel` for full documentation. See Also -------- numpy.ravel : equivalent function ndarray.flat : a flat iterator on the array. """ raise NotImplementedError def repeat(self, repeats, axis=None): """Repeat elements of an array. Refer to `numpy.repeat` for full documentation. See Also -------- numpy.repeat : equivalent function """ raise NotImplementedError def reshape(self, shape, order='C', *args): """Returns an array containing the same data with a new shape. Refer to `numpy.reshape` for full documentation. See Also -------- numpy.reshape : equivalent function """ if type(order) == type(""): # assume user specified a shape tuple shape = listify(shape) else: # assume user specified an unpacked shape e.g. reshape(3,4,5) shape = listify([shape]+[order]+list(args)) order = 'C' shape = np.asarray(shape, dtype=np.int64) count_neg_ones = shape[shape==-1].size if count_neg_ones > 1: raise ValueError, "can only specify one unknown dimension" if count_neg_ones == 1: shape_product = np.prod(shape)*(-1) if np.size%shape_product != 0: raise ValueError, "total size of new array must be unchanged" shape[shape==-1] = np.size//shape_product # now that shape is established, create new array a = ndarray(shape, dtype=self.dtype) # based on distribution, gather same indices from self nda = a.access() if nda is not None: lo,hi = a.distribution() lohi_shape = hi-lo i = np.indices(lohi_shape).reshape(len(lohi_shape),-1).T + lo # get the flattened indices strides = [1] for size in shape[-1:0:-1]: strides = [size*strides[0]] + strides i_flat = np.sum(i*strides, axis=1) # unravel the flattened indices based on the original array i_unravel = util.unravel_index(i_flat, self.shape) nda.flat = self.gather(i_unravel) a.release_update() return a def resize(self, new_shape, refcheck=True): """Change shape and size of array in-place. Parameters ---------- new_shape : tuple of ints, or `n` ints Shape of resized array. refcheck : bool, optional If False, reference count will not be checked. Default is True. Returns ------- None Raises ------ ValueError If `a` does not own its own data or references or views to it exist, and the data memory must be changed. SystemError If the `order` keyword argument is specified. This behaviour is a bug in NumPy. See Also -------- resize : Return a new array with the specified shape. Notes ----- This reallocates space for the data area if necessary. Only contiguous arrays (data elements consecutive in memory) can be resized. The purpose of the reference count check is to make sure you do not use this array as a buffer for another Python object and then reallocate the memory. However, reference counts can increase in other ways so if you are sure that you have not shared the memory for this array with another Python object, then you may safely set `refcheck` to False. Examples -------- Shrinking an array: array is flattened (in the order that the data are stored in memory), resized, and reshaped: >>> a = np.array([[0, 1], [2, 3]], order='C') >>> a.resize((2, 1)) >>> a array([[0], [1]]) >>> a = np.array([[0, 1], [2, 3]], order='F') >>> a.resize((2, 1)) >>> a array([[0], [2]]) Enlarging an array: as above, but missing entries are filled with zeros: >>> b = np.array([[0, 1], [2, 3]]) >>> b.resize(2, 3) # new_shape parameter doesn't have to be a tuple >>> b array([[0, 1, 2], [3, 0, 0]]) Referencing an array prevents resizing... >>> c = a >>> a.resize((1, 1)) Traceback (most recent call last): ... ValueError: cannot resize an array that has been referenced ... Unless `refcheck` is False: >>> a.resize((1, 1), refcheck=False) >>> a array([[0]]) >>> c array([[0]]) """ raise NotImplementedError def round(self, decimals=0, out=None): """Return `a` with each element rounded to the given number of decimals. Refer to `numpy.around` for full documentation. See Also -------- numpy.around : equivalent function """ raise NotImplementedError def searchsorted(self, v, side='left'): """Find indices where elements of v should be inserted in a to maintain order. For full documentation, see `numpy.searchsorted` See Also -------- numpy.searchsorted : equivalent function """ raise NotImplementedError def setfield(self, val, dtype, offset=0): """Put a value into a specified place in a field defined by a data-type. Place `val` into `a`'s field defined by `dtype` and beginning `offset` bytes into the field. Parameters ---------- val : object Value to be placed in field. dtype : dtype object Data-type of the field in which to place `val`. offset : int, optional The number of bytes into the field at which to place `val`. Returns ------- None See Also -------- getfield Examples -------- >>> x = np.eye(3) >>> x.getfield(np.float64) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) >>> x.setfield(3, np.int32) >>> x.getfield(np.int32) array([[3, 3, 3], [3, 3, 3], [3, 3, 3]]) >>> x array([[ 1.00000000e+000, 1.48219694e-323, 1.48219694e-323], [ 1.48219694e-323, 1.00000000e+000, 1.48219694e-323], [ 1.48219694e-323, 1.48219694e-323, 1.00000000e+000]]) >>> x.setfield(np.eye(3), np.int32) >>> x array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) """ raise NotImplementedError def setflags(self, write=None, align=None, uic=None): """Set array flags WRITEABLE, ALIGNED, and UPDATEIFCOPY, respectively. These Boolean-valued flags affect how numpy interprets the memory area used by `a` (see Notes below). The ALIGNED flag can only be set to True if the data is actually aligned according to the type. The UPDATEIFCOPY flag can never be set to True. The flag WRITEABLE can only be set to True if the array owns its own memory, or the ultimate owner of the memory exposes a writeable buffer interface, or is a string. (The exception for string is made so that unpickling can be done without copying memory.) Parameters ---------- write : bool, optional Describes whether or not `a` can be written to. align : bool, optional Describes whether or not `a` is aligned properly for its type. uic : bool, optional Describes whether or not `a` is a copy of another "base" array. Notes ----- Array flags provide information about how the memory area used for the array is to be interpreted. There are 6 Boolean flags in use, only three of which can be changed by the user: UPDATEIFCOPY, WRITEABLE, and ALIGNED. WRITEABLE (W) the data area can be written to; ALIGNED (A) the data and strides are aligned appropriately for the hardware (as determined by the compiler); UPDATEIFCOPY (U) this array is a copy of some other array (referenced by .base). When this array is deallocated, the base array will be updated with the contents of this array. All flags can be accessed using their first (upper case) letter as well as the full name. Examples -------- >>> y array([[3, 1, 7], [2, 0, 0], [8, 5, 9]]) >>> y.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : True ALIGNED : True UPDATEIFCOPY : False >>> y.setflags(write=0, align=0) >>> y.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : True WRITEABLE : False ALIGNED : False UPDATEIFCOPY : False >>> y.setflags(uic=1) Traceback (most recent call last): File "", line 1, in ValueError: cannot set UPDATEIFCOPY flag to True """ raise NotImplementedError def sort(self, axis=-1, kind='quicksort', order=None): """Sort an array, in-place. Parameters ---------- axis : int, optional Axis along which to sort. Default is -1, which means sort along the last axis. kind : {'quicksort', 'mergesort', 'heapsort'}, optional Sorting algorithm. Default is 'quicksort'. order : list, optional When `a` is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be specified. See Also -------- numpy.sort : Return a sorted copy of an array. argsort : Indirect sort. lexsort : Indirect stable sort on multiple keys. searchsorted : Find elements in sorted array. Notes ----- See ``sort`` for notes on the different sorting algorithms. Examples -------- >>> a = np.array([[1,4], [3,1]]) >>> a.sort(axis=1) >>> a array([[1, 4], [1, 3]]) >>> a.sort(axis=0) >>> a array([[1, 3], [1, 4]]) Use the `order` keyword to specify a field to use when sorting a structured array: >>> a = np.array([('a', 2), ('c', 1)], dtype=[('x', 'S1'), ('y', int)]) >>> a.sort(order='y') >>> a array([('c', 1), ('a', 2)], dtype=[('x', '|S1'), ('y', '>> a = np.array([1, 2]) >>> a.tolist() [1, 2] >>> a = np.array([[1, 2], [3, 4]]) >>> list(a) [array([1, 2]), array([3, 4])] >>> a.tolist() [[1, 2], [3, 4]] """ raise NotImplementedError def tostring(self, order='C'): """Construct a Python string containing the raw data bytes in the array. Constructs a Python string showing a copy of the raw contents of data memory. The string can be produced in either 'C' or 'Fortran', or 'Any' order (the default is 'C'-order). 'Any' order means C-order unless the F_CONTIGUOUS flag in the array is set, in which case it means 'Fortran' order. Parameters ---------- order : {'C', 'F', None}, optional Order of the data for multidimensional arrays: C, Fortran, or the same as for the original array. Returns ------- s : str A Python string exhibiting a copy of `a`'s raw data. Examples -------- >>> x = np.array([[0, 1], [2, 3]]) >>> x.tostring() '\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00' >>> x.tostring('C') == x.tostring() True >>> x.tostring('F') '\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00' """ raise NotImplementedError def trace(self, offset=0, axis1=0, axis2=1, dtype=None, out=None): """Return the sum along diagonals of the array. Refer to `numpy.trace` for full documentation. See Also -------- numpy.trace : equivalent function """ raise NotImplementedError def transpose(self, *axes): """Returns a view of the array with axes transposed. For a 1-D array, this has no effect. (To change between column and row vectors, first cast the 1-D array into a matrix object.) For a 2-D array, this is the usual matrix transpose. For an n-D array, if axes are given, their order indicates how the axes are permuted (see Examples). If axes are not provided and ``a.shape = (i[0], i[1], ... i[n-2], i[n-1])``, then ``a.transpose().shape = (i[n-1], i[n-2], ... i[1], i[0])``. Parameters ---------- axes : None, tuple of ints, or `n` ints * None or no argument: reverses the order of the axes. * tuple of ints: `i` in the `j`-th place in the tuple means `a`'s `i`-th axis becomes `a.transpose()`'s `j`-th axis. * `n` ints: same as an n-tuple of the same ints (this form is intended simply as a "convenience" alternative to the tuple form) Returns ------- out : ndarray View of `a`, with axes suitably permuted. See Also -------- ndarray.T : Array property returning the array transposed. Examples -------- >>> a = np.array([[1, 2], [3, 4]]) >>> a array([[1, 2], [3, 4]]) >>> a.transpose() array([[1, 3], [2, 4]]) >>> a.transpose((1, 0)) array([[1, 3], [2, 4]]) >>> a.transpose(1, 0) array([[1, 3], [2, 4]]) """ ret = self[:] if self.ndim < 2: return ret if not axes: # empty axes tuple i.e. no axes were passed axes = np.arange(self.ndim)[::-1] elif len(axes) == 1: # we have either None or a tuple of ints if axes[0] is None: axes = np.arange(self.ndim)[::-1] elif isinstance(axes[0], tuple): axes = axes[0] else: raise ValueError, "invalid axis for this array" else: # assume axes is a tuple of ints axes = np.asarray(axes, dtype=np.int64) if len(axes) != self.ndim: raise ValueError, "axes don't match array" ret.global_slice = self.global_slice.transpose(axes) return ret def var(self, axis=None, dtype=None, out=None, ddof=0): """Returns the variance of the array elements, along given axis. Refer to `numpy.var` for full documentation. See Also -------- numpy.var : equivalent function """ raise NotImplementedError def view(self, dtype=None, type=None): """New view of array with the same data. Parameters ---------- dtype : data-type, optional Data-type descriptor of the returned view, e.g., float32 or int16. The default, None, results in the view having the same data-type as `a`. type : Python type, optional Type of the returned view, e.g., ndarray or matrix. Again, the default None results in type preservation. Notes ----- ``a.view()`` is used two different ways: ``a.view(some_dtype)`` or ``a.view(dtype=some_dtype)`` constructs a view of the array's memory with a different data-type. This can cause a reinterpretation of the bytes of memory. ``a.view(ndarray_subclass)`` or ``a.view(type=ndarray_subclass)`` just returns an instance of `ndarray_subclass` that looks at the same array (same shape, dtype, etc.) This does not cause a reinterpretation of the memory. Examples -------- >>> x = np.array([(1, 2)], dtype=[('a', np.int8), ('b', np.int8)]) Viewing array data using a different type and dtype: >>> y = x.view(dtype=np.int16, type=np.matrix) >>> y matrix([[513]], dtype=int16) >>> print type(y) Creating a view on a structured array so it can be used in calculations >>> x = np.array([(1, 2),(3,4)], dtype=[('a', np.int8), ('b', np.int8)]) >>> xv = x.view(dtype=np.int8).reshape(-1,2) >>> xv array([[1, 2], [3, 4]], dtype=int8) >>> xv.mean(0) array([ 2., 3.]) Making changes to the view changes the underlying array >>> xv[0,1] = 20 >>> print x [(1, 20) (3, 4)] Using a view to convert an array to a record array: >>> z = x.view(np.recarray) >>> z.a array([1], dtype=int8) Views share data: >>> x[0] = (9, 10) >>> z[0] (9, 10) """ raise NotImplementedError ################################################################ ### ndarray operator overloading ################################################################ def __abs__(self): return abs(self) def __add__(self, y): return add(self,y) def __and__(self, y): return logical_and(self,y) def __array__(self, dtype): raise NotImplementedError def __array_finalize__(self, *args, **kwargs): raise NotImplementedError def __array_interface__(self, *args, **kwargs): raise NotImplementedError def __array_prepare__(self, *args, **kwargs): raise NotImplementedError def __array_priority__(self, *args, **kwargs): raise NotImplementedError def __array_struct__(self, *args, **kwargs): raise NotImplementedError def __array_wrap__(self, *args, **kwargs): raise NotImplementedError def __contains__(self, y): raise NotImplementedError def __copy__(self, order=None): """Return a copy of the array. Parameters ---------- order : {'C', 'F', 'A'}, optional If order is 'C' (False) then the result is contiguous (default). If order is 'Fortran' (True) then the result has fortran order. If order is 'Any' (None) then the result has fortran order only if the array already is in fortran order. """ raise NotImplementedError def __deepcopy__(self): raise NotImplementedError #def __delattr__ def __delitem__(self, *args, **kwargs): raise ValueError, "cannot delete array elements" #def __delslice__ def __div__(self, y): return divide(self,y) def __divmod__(self, y): t = mod(self,y) s = subtract(self,t) s = divide(s,y,s) return s,t def __eq__(self, y): return equal(self,y) def __float__(self): raise NotImplementedError def __floordiv__(self,y): return floor_divide(self,y) #def __format__ def __ge__(self,y): return greater_equal(self,y) #def __getattribute__ def __getitem__(self, key): # THIS IS A COLLECTIVE OPERATION if isinstance(key, (str,unicode)): raise NotImplementedError, "str or unicode key" if self.ndim == 0: raise IndexError, "0-d arrays can't be indexed" key = listify(key) fancy = False for arg in key: if isinstance(arg, (ndarray,np.ndarray,list,tuple)): fancy = True break if fancy: raise NotImplementedError, "TODO: fancy indexing" new_global_slice = self.global_slice[key] new_shape = new_global_slice.shape a = ndarray(new_shape, self.dtype, base=self) a.global_slice = new_global_slice if a.size == 1: a = a.allget() # convert single item to np.generic (scalar) a = a.dtype.type(a) return a #def __getslice__ def __gt__(self,y): return greater(self,y) #def __hash__ #def __hex__ def __iadd__(self,y): return add(self,y,self) def __iand__(self,y): return logical_and(self,y,self) def __idiv__(self,y): return divide(self,y,self) def __ifloordiv__(self,y): return floor_divide(self,y,self) def __ilshift__(self,y): return left_shift(self,y,self) def __imod__(self,y): return mod(self,y,self) def __imul__(self,y): return multiply(self,y,self) #def __index__ def __int__(self, *args, **kwargs): if self.size != 1: raise TypeError, "only length-1 arrays can be converted to Python scalars" t=np.dtype(np.int32) return t.type(self.allget()) def __invert__(self): return invert(self) def __ior__(self,y): return logical_or(self,y,self) def __ipow__(self,y): return power(self,y,self) def __irshift__(self,y): return right_shift(self,y,self) def __isub__(self,y): return subtract(self,y,self) def __iter__(self, *args, **kwargs): raise NotImplementedError def __itruediv__(self,y): return true_divide(self,y,self) def __ixor__(self,y): return logical_xor(self,y,self) def __le__(self,y): return less_equal(self,y) def __len__(self): return self.shape[0] def __long__(self, *args, **kwargs): raise NotImplementedError def __lshift__(self,y): return left_shift(self,y) def __lt__(self,y): return less(self,y) def __mod__(self,y): return mod(self,y) def __mul__(self,y): return multiply(self,y) def __ne__(self,y): return not_equal(self,y) def __neg__(self): return negative(self) def __nonzero__(self): raise ValueError, ("The truth value of an array with more than one" " element is ambiguous. Use a.any() or a.all()") def __oct__(self, *args, **kwargs): raise NotImplementedError def __or__(self,y): return logical_or(self,y) def __pos__(self): return self.copy() def __pow__(self,y): return power(self,y) def __radd__(self,y): return add(y,self) def __rand__(self,y): return logical_and(y,self) def __rdiv__(self,y): return divide(y,self) def __rdivmod__(self,y): t = mod(y,self) s = subtract(y,t) s = divide(s,self,s) return s,t def __reduce__(self, *args, **kwargs): raise NotImplementedError def __reduce_ex__(self, *args, **kwargs): raise NotImplementedError def __repr__(self): result = "" if 0 == me(): result = repr(self.get()) return result def __rfloordiv__(self,y): return floor_divide(y,self) def __rlshift__(self,y): return left_shift(y,self) def __rmod__(self,y): return mod(y,self) def __rmul__(self,y): return multiply(y,self) def __ror__(self,y): return logical_or(y,self) def __rpow__(self,y): return power(y,self) def __rrshift__(self,y): return right_shift(y,self) def __rshift__(self,y): return right_shift(self,y) def __rsub__(self,y): return subtract(y,self) def __rtruediv__(self,y): return true_divide(y,self) def __rxor__(self,y): return logical_xor(y,self) #def __setattr__ def __setitem__(self, key, value): # THIS IS A COLLECTIVE OPERATION sync() if isinstance(key, (str,unicode)): raise NotImplementedError, "str or unicode key" if self.ndim == 0: raise IndexError, "0-d arrays can't be indexed" key = listify(key) fancy = False for arg in key: if isinstance(arg, (ndarray,np.ndarray,list,tuple)): fancy = True break if fancy: raise NotImplementedError, "TODO: fancy indexing" global_slice = self.global_slice[key] new_shape = global_slice.shape value = asarray(value) npvalue = None release_value = False # access based on new global_slice as an ndarray first npself = self.access(global_slice) if npself is not None: if isinstance(value, ndarray): if (ga.compare_distr(value.handle, self.handle) and value.global_slice == global_slice and value.global_slice.T == self.global_slice.T): # opt: same distributions and same slicing # in practice this might not happen all that often npvalue = value.access() release_value = True else: lo,hi = self.distribution() result = global_slice.get_key(lo,hi) result = util.broadcast_chomp(value.shape, result) npvalue = value.get(result) elif isinstance(value, flatiter): raise NotImplementedError elif value.ndim > 0: lo,hi = self.distribution() result = global_slice.get_key(lo,hi) result = util.broadcast_chomp(value.shape, result) npvalue = value[result] else: npvalue = value npself[:] = npvalue if release_value: value.release() self.release_update() sync() #def __setslice__ #def __setstate__ #def __sizeof__ def __str__(self): result = "" if 0 == me(): result = str(self.get()) return result def __sub__(self,y): return subtract(self,y) #def __subclasshook__ def __truediv__(self,y): return true_divide(self,y) def __xor__(self,y): return logical_xor(self,y) def _npin_piece_based_on_out(input, out, shape=None): # opt: same distributions and same slicing # we can use local data exclusively # in practice this might not happen all that often if (isinstance(input, ndarray) and ga.compare_distr(input.handle, out.handle) and input.global_slice == out.global_slice and input.global_slice.T == out.global_slice.T): return input.access(),True # no opt: requires copy of remote data elif shape is None or len(shape) > 0: lo,hi = out.distribution() result = out.global_slice.get_key(lo,hi) if shape is not None: result = util.broadcast_chomp(shape, result) if is_distributed(input): return input.get(result),False else: return input[result],False else: return input,False class ufunc(object): """Functions that operate element by element on whole arrays. A detailed explanation of ufuncs can be found in the "ufuncs.rst" file in the NumPy reference guide. Unary ufuncs: ============= op(X, out=None) Apply op to X elementwise Parameters ---------- X : array_like Input array. out : array_like An array to store the output. Must be the same shape as `X`. Returns ------- r : array_like `r` will have the same shape as `X`; if out is provided, `r` will be equal to out. Binary ufuncs: ============== op(X, Y, out=None) Apply `op` to `X` and `Y` elementwise. May "broadcast" to make the shapes of `X` and `Y` congruent. The broadcasting rules are: * Dimensions of length 1 may be prepended to either array. * Arrays may be repeated along dimensions of length 1. Parameters ---------- X : array_like First input array. Y : array_like Second input array. out : array_like An array to store the output. Must be the same shape as the output would have. Returns ------- r : array_like The return value; if out is provided, `r` will be equal to out. """ def __init__(self, func): self.func = func self.__doc__ = func.__doc__ def _get_identity(self): return self.func.identity identity = property(_get_identity) def _get_nargs(self): return self.func.nargs nargs = property(_get_nargs) def _get_nin(self): return self.func.nin nin = property(_get_nin) def _get_nout(self): return self.func.nout nout = property(_get_nout) def _get_ntypes(self): return self.func.ntypes ntypes = property(_get_ntypes) def _get_signature(self): return self.func.signature signature = property(_get_signature) def _get_types(self): return self.func.types types = property(_get_types) def __call__(self, *args, **kwargs): if self.func.nin == 1: return self._unary_call(*args, **kwargs) elif self.func.nin == 2: return self._binary_call(*args, **kwargs) else: raise ValueError, "only unary and binary ufuncs supported" def _unary_call(self, input, out=None, *args, **kwargs): input = asarray(input) input_shape = get_shape(input) input_dtype = get_dtype(input) if not (is_distributed(input) or is_distributed(out)): # no ndarray instances used, pass through immediately to numpy return self.func(input, out, *args, **kwargs) if out is None: # input must be an ndarray given previous conditionals # TODO okay, is there something better than this? ignore = np.ones(1, dtype=input_dtype) out_type = self.func(ignore).dtype out = ndarray(input_shape, out_type) # sanity checks if not is_array(out): raise TypeError, "return arrays must be of ArrayType" out_shape = get_shape(out) if input_shape != out_shape: # broadcasting doesn't apply to unary operations raise ValueError, 'invalid return array shape' # Now figure out what to do... if isinstance(out, ndarray): sync() # get out as an np.ndarray first npout = out.access() if npout is not None: # this proc owns data if input is out: npin,release_in = npout,False else: npin,release_in = _npin_piece_based_on_out(input,out) self.func(npin, npout, *args, **kwargs) if release_in: input.release() out.release_update() #sync() elif isinstance(out, flatiter): sync() # first opt: input and out are same object # we call _unary_call over again with the bases # NOT SURE THAT THIS IS ACTUALLY OPTIMAL -- NEED TO TEST if input is out: self._unary_call(out.base, out.base, *args, **kwargs) return out.copy() # differs from NumPy (should be view) else: npout = out.access() if npout is not None: # this proc 'owns' data lo,hi = out.distribution() result = out.global_slice.get_key(lo,hi) if is_distributed(input): npin = input.get(result) else: npin = input[result] self.func(npin, npout, *args, **kwargs) out.release_update() #sync() else: sync() # out is not distributed npin = input if is_distributed(input): npin = input.allget() self.func(npin, out, *args, **kwargs) #sync() # I don't think we need this one return out def _binary_call(self, first, second, out=None, *args, **kwargs): first_isscalar = np.isscalar(first) second_isscalar = np.isscalar(second) # just in case first = asarray(first) second = asarray(second) if not (is_distributed(first) or is_distributed(second) or is_distributed(out)): # no ndarray instances used, pass through immediately to numpy return self.func(first, second, out, *args, **kwargs) first_dtype = get_dtype(first) second_dtype = get_dtype(second) first_shape = get_shape(first) second_shape = get_shape(second) if out is None: # first and/or second must be ndarrays given previous conditionals # TODO okay, is there something better than this? dtype = None if first_isscalar: if second_isscalar: dtype = np.find_common_type([],[first_dtype,second_dtype]) else: dtype = np.find_common_type([second_dtype],[first_dtype]) else: if second_isscalar: dtype = np.find_common_type([first_dtype],[second_dtype]) else: dtype = np.find_common_type([first_dtype,second_dtype],[]) shape = util.broadcast_shape(first_shape, second_shape) out = ndarray(shape, dtype) # sanity checks if not is_array(out): raise TypeError, "return arrays must be of ArrayType" # Now figure out what to do... if isinstance(out, ndarray): sync() # get out as an np.ndarray first npout = out.access() if npout is not None: # this proc owns data # get matching and compatible portions of input arrays # broadcasting rules (may) apply if first is out: npfirst,release_first = npout,False else: npfirst,release_first = _npin_piece_based_on_out( first,out,first_shape) if second is first: # zeroth opt: first and second are same object, so do the # same thing for second that we did for first npsecond,release_second = npfirst,False elif second is out: npsecond,release_second = npout,False else: npsecond,release_second = _npin_piece_based_on_out( second,out,second_shape) self.func(npfirst, npsecond, npout, *args, **kwargs) if release_first: first.release() if release_second: second.release() out.release_update() #sync() elif isinstance(out, flatiter): sync() # first op: first and second and out are same object if first is second is out: self._binary_call(out.base,out.base,out.base,*args,**kwargs) return out.copy() else: npout = out.access() if npout is not None: # this proc 'owns' data lo,hi = out.distribution() result = out.global_slice.get_key(lo,hi) if is_distributed(first): npfirst = first.get(result) else: npfirst = first[result] if second is first: npsecond = npfirst elif is_distributed(second): npsecond = second.get(result) else: npsecond = second[result] self.func(npfirst, npsecond, npout, *args, **kwargs) out.release_update() #sync() else: sync() # out is not distributed ndfirst = first if is_distributed(first): ndfirst = first.allget() ndsecond = second if second is first: ndsecond = ndfirst elif is_distributed(second): ndsecond = second.allget() self.func(ndfirst, ndsecond, out, *args, **kwargs) #sync() # I don't think we need this one return out def reduce(self, a, axis=0, dtype=None, out=None, *args, **kwargs): """reduce(a, axis=0, dtype=None, out=None) Reduces `a`'s dimension by one, by applying ufunc along one axis. Let :math:`a.shape = (N_0, ..., N_i, ..., N_{M-1})`. Then :math:`ufunc.reduce(a, axis=i)[k_0, ..,k_{i-1}, k_{i+1}, .., k_{M-1}]` = the result of iterating `j` over :math:`range(N_i)`, cumulatively applying ufunc to each :math:`a[k_0, ..,k_{i-1}, j, k_{i+1}, .., k_{M-1}]`. For a one-dimensional array, reduce produces results equivalent to: :: r = op.identity # op = ufunc for i in xrange(len(A)): r = op(r, A[i]) return r For example, add.reduce() is equivalent to sum(). Parameters ---------- a : array_like The array to act on. axis : int, optional The axis along which to apply the reduction. dtype : data-type code, optional The type used to represent the intermediate results. Defaults to the data-type of the output array if this is provided, or the data-type of the input array if no output array is provided. out : ndarray, optional A location into which the result is stored. If not provided, a freshly-allocated array is returned. Returns ------- r : ndarray The reduced array. If `out` was supplied, `r` is a reference to it. Examples -------- >>> np.multiply.reduce([2,3,5]) 30 A multi-dimensional array example: >>> X = np.arange(8).reshape((2,2,2)) >>> X array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> np.add.reduce(X, 0) array([[ 4, 6], [ 8, 10]]) >>> np.add.reduce(X) # confirm: default axis value is 0 array([[ 4, 6], [ 8, 10]]) >>> np.add.reduce(X, 1) array([[ 2, 4], [10, 12]]) >>> np.add.reduce(X, 2) array([[ 1, 5], [ 9, 13]]) """ if self.func.nin != 2: raise ValueError, "reduce only supported for binary functions" a = asarray(a) if not (isinstance(a, ndarray) or isinstance(out, ndarray)): # no ndarray instances used, pass through immediately to numpy return self.func.reduce(a, axis, dtype, out, *args, **kwargs) if axis < 0: axis += a.ndim if a.ndim < axis < 0: raise ValueError, "axis not in array" if out is None: shape = list(a.shape) del shape[axis] if dtype is None: dtype = a.dtype out = ndarray(shape, dtype=dtype) if out.ndim == 0: # optimize the 1d reduction nda = a.access() value = self.func.identity if self.func is np.subtract: value = 0 if nda is not None: value = self.func.reduce(nda) p = ga.locate(a.handle, 0) if p != me(): value = value - nda[0] - nda[0] everything = comm().allgather(value) np.add.reduce(everything, out=out) else: if nda is not None: value = self.func.reduce(nda) everything = comm().allgather(value) self.func.reduce(everything, out=out) elif out.ndim == 1 and 'OLD_REDUCE' in os.environ: # optimize the 2d reduction ndout = out.access() if ndout is not None: my_range = out.global_slice.bound_by_lohi(*out.distribution()) if axis == 0: # rows my_range = [slice(None,None,None)]+my_range elif axis == 1: # cols my_range = my_range+[slice(None,None,None)] piece = a.get(my_range) self.func.reduce(piece, axis, dtype, ndout, *args, **kwargs) elif out.ndim == 1: # new algorithm using Isend/Irecv send_requests = [] recv_requests = [] nda = a.access() if nda is not None: TAG = 733823 # we own part of the input # reduce it, then find where to send it local_out = self.func.reduce(nda, axis, dtype, *args, **kwargs) lo,hi = a.distribution() if axis == 0: lo,hi = lo[1],hi[1] else: lo,hi = lo[0],hi[0] m,p = ga.locate_region(out.handle, lo, hi) #print_sync("nda m=%s" % str(m)) #print_sync("nda p=%s" % str(p)) for i in range(len(p)): rlo,rhi = m[i] #print_sync("rlo,rhi=%s,%s" % (rlo,rhi)) rlo = rlo - lo rhi = rhi - lo #print_sync("again rlo,rhi=%s,%s" % (rlo,rhi)) send_requests.append( comm().Isend(local_out[rlo:rhi], p[i], TAG)) ndout = out.access() buf = None if ndout is not None: lo,hi = out.distribution() lo,hi = lo[0],hi[0] #print_sync("lo,hi=%s,%s" % (lo,hi)) shape = ga.inquire_dims(a.handle) #print_sync("shape=%s" % shape) olo = [lo,lo] ohi = [hi,hi] #print_sync("olo,ohi=%s,%s" % (olo,ohi)) olo[axis],ohi[axis] = 0,shape[axis] #print_sync("again olo,ohi=%s,%s" % (olo,ohi)) m,p = ga.locate_region(a.handle, olo, ohi) #print_sync("nda m=%s" % str(m)) #print_sync("nda p=%s" % str(p)) buf = np.ndarray((len(p),hi-lo), dtype=out.dtype) value = self.func.identity if value is None and self.func is np.subtract: value = 0 buf[:] = value for i in range(len(p)): rlo,rhi = m[i] #print_sync("rlo,rhi=%s,%s" % (rlo,rhi)) if axis == 0: rlo,rhi = rlo[1],rhi[1] else: rlo,rhi = rlo[0],rhi[0] #print_sync("again rlo,rhi=%s,%s" % (rlo,rhi)) rlo = rlo - lo rhi = rhi - lo #print_sync("yet again rlo,rhi=%s,%s" % (rlo,rhi)) recv_requests.append( comm().Irecv(buf[i][rlo:rhi], p[i], TAG)) while send_requests or recv_requests: if MPI.Request.Testall(send_requests): send_requests = [] if MPI.Request.Testall(recv_requests): recv_requests = [] if ndout is not None: self.func.reduce(buf, axis=0, out=ndout) out.release_update() if nda is not None: a.release() else: slicer = [slice(0,None,None)]*a.ndim axis_iterator = iter(xrange(a.shape[axis])) # copy first loop iteration to 'out' slicer[axis] = axis_iterator.next() out[:] = a[slicer] # remaining loop iterations are appropriately reduced for i in axis_iterator: slicer[axis] = i ai = a[slicer] self.__call__(out,ai,out) return out def accumulate(self, a, axis=0, dtype=None, out=None, *args, **kwargs): if self.func.nin != 2: raise ValueError, "accumulate only supported for binary functions" a = asarray(a) if not (isinstance(a, ndarray) or isinstance(out, ndarray)): # no ndarray instances used, pass through immediately to numpy return self.func.accumulate(a, axis, dtype, out, *args, **kwargs) if axis < 0: axis += a.ndim if a.ndim < axis < 0: raise ValueError, "axis not in array" if out is None: if dtype is None: dtype = a.dtype out = ndarray(a.shape, dtype=dtype) if out.ndim == 1: # optimize the 1d accumulate if isinstance(out, ndarray): ndout = out.access() if ndout is not None: result = out.global_slice.get_key(*out.distribution()) lo,hi = result[0].start,result[0].stop if is_distributed(a): piece = a.get(result) else: piece = a[lo:hi] self.func.accumulate(piece, out=ndout) # probably more efficient to use allgather and exchange last # values among all procs. We also need ordering information, # so we exchange the 'lo' value. everything = comm().allgather((ndout[-1],lo)) reduction = self.func.identity for lvalue,llo in everything: if lvalue is not None and llo < lo: reduction = self.func(reduction,lvalue) self.func(ndout,reduction,ndout) else: everything = comm().allgather((None,None)) else: raise NotImplementedError else: slicer_i = [slice(0,None,None)]*a.ndim slicer_i_1 = [slice(0,None,None)]*a.ndim axis_iterator = iter(xrange(a.shape[axis])) # copy first loop iteration to 'out' slicer_i[axis] = axis_iterator.next() out[slicer_i] = a[slicer_i] # remaining loop iterations are appropriately accumulated for i in axis_iterator: slicer_i[axis] = i slicer_i_1[axis] = i-1 x = out[slicer_i_1] y = a[slicer_i] z = out[slicer_i] self.__call__(x,y,z) #self.__call__(out[slicer_i_1],a[slicer_i],out[slicer_i]) return out def outer(self, *args, **kwargs): if self.func.nin != 2: raise ValueError, "outer product only supported for binary functions" raise NotImplementedError def reduceat(self, *args, **kwargs): if self.func.nin != 2: raise ValueError, "reduceat only supported for binary functions" raise NotImplementedError # unary ufuncs abs = ufunc(np.abs) absolute = abs arccos = ufunc(np.arccos) arccosh = ufunc(np.arccosh) arcsin = ufunc(np.arcsin) arcsinh = ufunc(np.arcsinh) arctan = ufunc(np.arctan) arctanh = ufunc(np.arctanh) bitwise_not = ufunc(np.bitwise_not) ceil = ufunc(np.ceil) conj = ufunc(np.conj) conjugate = ufunc(np.conjugate) cos = ufunc(np.cos) cosh = ufunc(np.cosh) deg2rad = ufunc(np.deg2rad) degrees = ufunc(np.degrees) exp = ufunc(np.exp) exp2 = ufunc(np.exp2) expm1 = ufunc(np.expm1) fabs = ufunc(np.fabs) floor = ufunc(np.floor) frexp = ufunc(np.frexp) invert = ufunc(np.invert) isfinite = ufunc(np.isfinite) isinf = ufunc(np.isinf) isnan = ufunc(np.isnan) log = ufunc(np.log) log2 = ufunc(np.log2) log10 = ufunc(np.log10) log1p = ufunc(np.log1p) logical_not = ufunc(np.logical_not) modf = ufunc(np.modf) negative = ufunc(np.negative) rad2deg = ufunc(np.rad2deg) radians = ufunc(np.radians) reciprocal = ufunc(np.reciprocal) rint = ufunc(np.rint) sign = ufunc(np.sign) signbit = ufunc(np.signbit) sin = ufunc(np.sin) sinh = ufunc(np.sinh) spacing = ufunc(np.spacing) sqrt = ufunc(np.sqrt) square = ufunc(np.square) tan = ufunc(np.tan) tanh = ufunc(np.tanh) trunc = ufunc(np.trunc) # binary ufuncs add = ufunc(np.add) arctan2 = ufunc(np.arctan2) bitwise_and = ufunc(np.bitwise_and) bitwise_or = ufunc(np.bitwise_or) bitwise_xor = ufunc(np.bitwise_xor) copysign = ufunc(np.copysign) divide = ufunc(np.divide) equal = ufunc(np.equal) floor_divide = ufunc(np.floor_divide) fmax = ufunc(np.fmax) fmin = ufunc(np.fmin) fmod = ufunc(np.fmod) greater = ufunc(np.greater) greater_equal = ufunc(np.greater_equal) hypot = ufunc(np.hypot) ldexp = ufunc(np.ldexp) left_shift = ufunc(np.left_shift) less = ufunc(np.less) less_equal = ufunc(np.less_equal) logaddexp = ufunc(np.logaddexp) logaddexp2 = ufunc(np.logaddexp2) logical_and = ufunc(np.logical_and) logical_or = ufunc(np.logical_or) logical_xor = ufunc(np.logical_xor) maximum = ufunc(np.maximum) minimum = ufunc(np.minimum) mod = ufunc(np.mod) multiply = ufunc(np.multiply) nextafter = ufunc(np.nextafter) not_equal = ufunc(np.not_equal) power = ufunc(np.power) remainder = ufunc(np.remainder) right_shift = ufunc(np.right_shift) subtract = ufunc(np.subtract) true_divide = ufunc(np.true_divide) class flatiter(object): """Flat iterator object to iterate over arrays. A `flatiter` iterator is returned by ``x.flat`` for any array `x`. It allows iterating over the array as if it were a 1-D array, either in a for-loop or by calling its `next` method. Iteration is done in C-contiguous style, with the last index varying the fastest. The iterator can also be indexed using basic slicing or advanced indexing. See Also -------- ndarray.flat : Return a flat iterator over an array. ndarray.flatten : Returns a flattened copy of an array. Notes ----- A `flatiter` iterator can not be constructed directly from Python code by calling the `flatiter` constructor. Examples -------- >>> x = np.arange(6).reshape(2, 3) >>> fl = x.flat >>> type(fl) >>> for item in fl: ... print item ... 0 1 2 3 4 5 >>> fl[2:4] array([2, 3]) """ def __init__(self, base): self._base = base self._index = 0 self._values = None size = base.global_slice.size self.global_slice = util.MasterKey([size]) size_per_proc = size//nproc() remainder = size%nproc() # remainder gets distributed if me() < remainder: self._lo = [size_per_proc*me() + me()] self._hi = [size_per_proc*me() + me() + size_per_proc + 1] else: self._lo = [size_per_proc*me() + remainder] self._hi = [size_per_proc*me() + remainder + size_per_proc] # if lo,hi are the same, this indicates no data on this proc if self._lo == self._hi: self._lo = [-1] self._hi = [-1] def _get_base(self): return self._base base = property(_get_base) def _get_coords(self): return np.unravel_index(self._index, self._base.shape) coords = property(_get_coords) def copy(self): """Get a copy of the iterator as a 1-D array. Examples -------- >>> x = np.arange(6).reshape(2, 3) >>> x array([[0, 1, 2], [3, 4, 5]]) >>> fl = x.flat >>> fl.copy() array([0, 1, 2, 3, 4, 5]) """ return self._base.flatten() def _get_index(self): return self._index index = property(_get_index) def distribution(self): return self._lo,self._hi def owns(self): return self._hi[0]>=0 def get(self, key=None): # THIS OPERATION IS ONE-SIDED # we expect key to be a single value or a slice, but might also be an # iterable of length 1 if key is None: # TODO this doesn't feel right -- communicate and then a local copy # operation? The answer is correct, but seems like too much extra # work. return self._base.get().flatten() if isinstance(key, (list,tuple)): key = key[0] if isinstance(key, (slice,util.RangeKey)): # get shape of base's global_slice shape = self._base.global_slice.shape # create index coordinates if isinstance(key, util.RangeKey): key = key.pyobj() i = (np.indices(shape).reshape(len(shape),-1).T)[key] return self._base.gather(i) else: key = long(key) index = np.unravel_index(key, self._base.shape) return self._base.gather(index) def allget(self, key=None): """Like get(), but when all processes need the same piece. This operation is collective. """ # TODO it's not clear whether this approach is better than having all # P processors ga.get() the same piece. if not me(): result = self.get(key) return comm().bcast(result) else: return comm().bcast() def __getitem__(self, key): # THIS OPERATION IS COLLECTIVE sync() if isinstance(key, (list,tuple)): if len(key) > 1: raise IndexError, "unsupported iterator index" # TODO optimize the gather since this is a collective return self.allget(key) def __len__(self): return self.global_slice.size def put(self, key, value): # THIS OPERATION IS ONE-SIDED # we expect key to be a single value or a slice, but might also be an # iterable of length 1 if isinstance(key, (list,tuple)): key = key[0] if isinstance(key, (slice,util.RangeKey)): if isinstance(key, util.RangeKey): key = key.pyobj() # get shape of global_slice shape = self._base.global_slice.shape # create index coordinates i = (np.indices(shape).reshape(len(shape),-1).T)[key] value = asarray(value) values = None if value.size == 1: values = np.zeros(len(i), dtype=self._base.dtype) values[:] = value else: assert value.ndim == 1 and len(value) == len(i) if is_distributed(value): values = value.get() else: values = value ga.scatter(self._base.handle, values, i) else: key = long(key) i = np.unravel_index(key, self._base.shape) ga.scatter(self._base.handle, value, i) def __setitem__(self, key, value): # THIS OPERATION IS COLLECTIVE sync() if self.owns(): global_slice = self.global_slice[key] if isinstance(key, (slice,util.RangeKey)): try: my_range = global_slice.bound_by_lohi(self._lo,self._hi) except IndexError: sync() return value = asarray(value) if value.ndim == 1: self.put(my_range, value[my_range]) else: self.put(my_range, value) else: self.put(key, value) sync() def next(self): if self._index < self._len: tmp = self.base[self.coords] self._index += 1 return tmp else: raise StopIteration def access(self): """Return a copy of a 'local' portion.""" if self._values is not None: raise ValueError, "call release or release_update before access" if not self.owns(): self._values = None else: lo,hi = self.distribution() result = self.global_slice.get_key(lo,hi) self._values = self.get(result) return self._values def release(self): self._values = None def release_update(self): if self._values is not None: lo,hi = self.distribution() result = self.global_slice.get_key(lo,hi) self.put(result, self._values) self._values = None def __repr__(self): result = "" if 0 == me(): result = repr(self.get()) return result def __str__(self): result = "" if 0 == me(): result = str(self.get()) return result def zeros(shape, dtype=np.float, order='C'): """zeros(shape, dtype=float, order='C') Return a new array of given shape and type, filled with zeros. Parameters ---------- shape : int or sequence of ints Shape of the new array, e.g., ``(2, 3)`` or ``2``. dtype : data-type, optional The desired data-type for the array, e.g., `numpy.int8`. Default is `numpy.float64`. order : {'C', 'F'}, optional Whether to store multidimensional data in C- or Fortran-contiguous (row- or column-wise) order in memory. Returns ------- out : ndarray Array of zeros with the given shape, dtype, and order. See Also -------- zeros_like : Return an array of zeros with shape and type of input. ones_like : Return an array of ones with shape and type of input. empty_like : Return an empty array with shape and type of input. ones : Return a new array setting values to one. empty : Return a new uninitialized array. Examples -------- >>> np.zeros(5) array([ 0., 0., 0., 0., 0.]) >>> np.zeros((5,), dtype=numpy.int) array([0, 0, 0, 0, 0]) >>> np.zeros((2, 1)) array([[ 0.], [ 0.]]) >>> s = (2,2) >>> np.zeros(s) array([[ 0., 0.], [ 0., 0.]]) >>> np.zeros((2,), dtype=[('x', 'i4'), ('y', 'i4')]) # custom dtype array([(0, 0), (0, 0)], dtype=[('x', ' x==y Raises ------ NotImplementedError : subclasses must define this """ raise NotImplementedError, "subclasses must define this" def __getitem__(self, key): """x.__getitem__(y) <==> x[y] The given key is assumed to be a Python object. Raises ------ NotImplementedError : subclasses must define this """ raise NotImplementedError, "subclasses must define this" def __repr__(self): return str(self) def __str__(self): return "Key()" def bound_by_lohi(self, lo, hi): """Return a new Key modified to fit between lo and hi. Raises ------ NotImplementedError : subclasses must define this """ raise NotImplementedError, "subclasses must define this" def get_size(self): """Returns number of elements represented by this Key. See Also -------- size : Attribute getter for get_size method. """ raise NotImplementedError, "subclasses must define this" size = property(get_size) def pyobj(self): """Returns a Python object based on this Key e.g. slice, int, None. Raises ------ NotImplementedError : subclasses must define this """ raise NotImplementedError, "subclasses must define this" class NoneKey(Key): """A None with additional Key methods. Slicing a None is allowed. A None (newaxis) can be removed by slicing it with a value of 0. Slicing a None returns None which indicates the dimension should be removed. NoneKey instances should never have their origin attribute set since a None for an axis should never refer back to an original GA shape. """ def __init__(self): Key.__init__(self) def __eq__(self, other): """Returns True of other is None or a NoneKey.""" return isinstance(other, (type(None),NoneKey)) def __getitem__(self, key): """x.__getitem__(y) <==> x[y] An index of 0 is allowed, or a slice starting from 0. Returns None if an index of 0 is passed because this effectively removes this Key from an index. """ if isinstance(key, (RangeKey,slice)): if isinstance(key, slice): start,stop,step = key.indices(self.size) else: start,stop,step = key.start,key.stop,key.step if start != 0 or stop != 1 or step != 1: raise IndexError, "bad slice for NoneKey: %s" % key return self else: key = long(key) if key not in [0,0L]: # probably don't need '0' due to cast raise IndexError, "index out of bounds" return None # on purpose not self -- indicates index removal def __repr__(self): return str(self) def __str__(self): return "NoneKey()" def bound_by_lohi(self, lo, hi): """Always raises NotImplementedError.""" raise NotImplementedError, "bound_by_lohi nonsensical for NoneKey" def get_size(self): """Always returns 1.""" return 1 size = property(get_size) def pyobj(self): """Returns a Python object based on this Key (always None).""" return None class FixedKey(Key): """An integer with additional Key methods. There must be a valid 'value' at all times. Anything that can be transformed into an int or long is allowed. long is prefered. FixedKey instances must always refer to an original GA dimension using the 'origin' attribute. It does not make sense for a FixedKey to be without an 'origin'. Attributes ---------- origin : int, or None The original index this FixedKey refers to. size : int shorthand for get_size() method """ def __init__(self, value, origin): """A integer value and an integer origin must be given. The given 'value' must be >= 0. The given 'origin' must be >= 0. """ Key.__init__(self) self.value = long(value) self.origin = origin assert self.value >= 0 assert self.origin >= 0 def __eq__(self, other): """Compares the 'value' attributes.""" if hasattr(other,'value'): return self.value == other.value return False def __getitem__(self, key): """You cannot index a FixedKey. Raises ------ IndexError : cannot index a FixedKey """ raise IndexError, "cannot index a FixedKey" def __int__(self): return int(self.value) def __long__(self): return long(self.value) def __repr__(self): return str(self) def __str__(self): return "FixedKey(%s)" % self.value def bound_by_lohi(self, lo, hi): """Returns self but raises IndexError if value is not within range. Raises ------ IndexError : if not (lo <= self.value < hi) """ if not (lo <= self.value < hi): raise IndexError, "lo/hi out of bounds %s <= %s < %s" % ( lo, self.value, hi) return self def get_size(self): """Always returns 1 even though 0 is more correct. FixedKey instances don't count towards the shape of an array because FixedKey instances remove dimensions. However, since it is often convenient to calculate the shape of multiple Key instances using a reduction of the sizes of the Key instances, we return 1 here instead of 0. """ return 1 size = property(get_size) def pyobj(self): """Returns a Python object based on this Key (long 'value' attr).""" return self.value class RangeKey(Key): """A Python slice (w/o the indices function) with additional Key methods. RangeKey instances must always refer to an original GA dimension using the 'origin' attribute. It does not make sense for a RangeKey to be without an 'origin'. """ def __init__(self, start, stop=None, step=None, origin=None): """Creates given either a slice or an explicit start, stop, and step. Asserts that the start, stop, and step are not None. An 'origin' is required. The given 'origin' must be >= 0. """ Key.__init__(self) if isinstance(start, slice): self.start = start.start self.stop = start.stop self.step = start.step assert stop is None assert step is None else: self.start = start self.stop = stop self.step = step assert start is not None assert stop is not None assert step is not None assert origin is not None assert origin >= 0 self.origin = origin def __eq__(self, other): """Returns true if all start, stop, and step values match other.""" try: return (self.start == other.start and self.stop == other.stop and self.step == other.step) except AttributeError: return False def __getitem__(self, key): """You can index using either a slice, RangeKey, or integer.""" if isinstance(key, (RangeKey,slice)): if isinstance(key, slice): _start,_stop,_step = key.indices(self.size) else: _start,_stop,_step = key.start,key.stop,key.step start = ((_start*self.step) + self.start) stop = ((_stop*self.step) + self.start) step = _step * self.step return RangeKey(start,stop,step,origin=self.origin) else: try: key = long(key) except TypeError: raise TypeError, ("long() argument must be a string or a " "number, not %s" % key) if key < 0: key += self.size if key >= self.size or key < 0: raise IndexError, "invalid index" shifted = (key*self.step) + self.start if (self.step < 0 and shifted <= self.stop or self.step > 0 and shifted >= self.stop): raise IndexError return FixedKey(shifted, self.origin) def __str__(self): return "RangeKey(%s,%s,%s)" % (self.start,self.stop,self.step) def __repr__(self): return str(self) def bound_by_lohi(self, lo, hi): """Return a new RangeKey modified to fit between lo and hi. Raises ------ IndexError if start/stop/step is out of the bounds of lo/hi . Returns ------- A new RangeKey between the values of lo and hi. Examples -------- >>> RangeKey(1,10,2).bound_by_lohi(4,20) RangeKey(5,10,2) >>> RangeKey(1,10,2).bound_by_lohi(1,20) RangeKey(1,10,2) >>> RangeKey(1,10,2).bound_by_lohi(4,10) RangeKey(5,10,2) >>> RangeKey(1,10,2).bound_by_lohi(4,9) RangeKey(5,9,2) """ new_start = 0 new_stop = 0 if self.step > 0: if self.start >= hi: raise IndexError, "start >= hi (out of bounds)" elif self.start >= lo: # start < hi is implied new_start = self.start else: # start < lo < hi is implied guess = (lo-self.start)//self.step new_start = guess*self.step + self.start while new_start < lo: guess += 1 new_start = guess*self.step + self.start if self.stop <= lo: raise IndexError, "stop <= lo (out of bounds)" elif self.stop <= hi: # lo < stop is implied new_stop = self.stop else: # lo < hi < stop is implied new_stop = hi # this should be good enough else: if self.start < lo: raise IndexError, "negative step, start < lo (out of bounds)" elif self.start < hi: new_start = self.start else: # start >= hi >= lo guess = (hi-self.start)//self.step new_start = guess*self.step + self.start while new_start >= hi: guess += 1 new_start = guess*self.step + self.start if self.stop >= hi: raise IndexError, "negative step, stop >= hi (out of bounds)" elif self.stop >= (lo-1): new_stop = self.stop else: new_stop = lo-1 # this should be good enough result = RangeKey(new_start,new_stop,self.step,self.origin) if result.size <= 0: raise IndexError, "bound_by_lohi resulted in 0 length" return result def get_size(self): """Returns the length of the range.""" start,stop,step = self.start,self.stop,self.step # for brevity if (step < 0 and stop >= start) or (step > 0 and start >= stop): return 0 elif step < 0: return (stop - start + 1) / (step) + 1 else: return (stop - start - 1) / (step) + 1 size = property(get_size) def pyobj(self): """Returns a Python object based on this Key (a slice).""" return slice(self.start,self.stop,self.step) class MasterKey(object): """A list of Key instances with some extra methods. Represents one or more indices into an array. Contains methods to calculate shape, constrain the indices to lo/hi bounds of various types. Also contains attributes T and TT to represent axes to transpose as well as the inverse of the axes so that the transpose can be undone. The T and TT attributes will always be set in tandem -- both will be None or both will be set to a tuple of integers. Certain methods will query the T and TT attributes and change their behavior appropriately. Slicing a transposed MasterKey is one such example. """ def __init__(self, shape=None, data=None, fixed=None, T=None, TT=None): if shape is None and data is None: raise ValueError, "specify either shape or data" elif shape is not None: self.data = [RangeKey(0,x,1,origin=i) for i,x in enumerate(shape)] elif data is not None: for datum in data: assert isinstance(datum, Key) self.data = data else: raise ValueError, "specify either shape or data" self.T = T self.TT = TT if fixed is None: self.fixed = [] else: self.fixed = fixed def __eq__(self, other): try: return (self.data == other.data) and (self.fixed == other.fixed) except AttributeError: return False def __iter__(self): return iter(self.data) def __str__(self): return str(self.data) def __repr__(self): return repr(self.data) def _count_instances(self, *args): """Return the number of instances of the given type.""" return len(self._get_instances(args)) def _get_instances(self, *args): return [item for item in self.data if isinstance(item, args)] def _get_origins_within_data(self): """Return list of keys which have their origin set.""" return [item for item in self.data if item.origin is not None] def get_origin(self): """Return current list of FixedKey and RangeKey instances. The returned list is in the current (possibly transposed) order. See Also -------- get_sorted_origin() : sorts the list by 'origin' property """ origins = self._get_origins_within_data() result = [None]*(len(self.fixed)+len(origins)) for fixed in self.fixed: result[fixed.origin] = fixed iter_origins = iter(origins) for i in range(len(result)): if result[i] is None: result[i] = iter_origins.next() return result def get_sorted_origin(self): """Return sorted list of FixedKey and RangeKey instances. The returned list is in the current (possibly transposed) order. See Also -------- get_origin() : does not sort the list by 'origin' property """ origins = self._get_origins_within_data() result = [None]*(len(self.fixed)+len(origins)) for fixed in self.fixed: result[fixed.origin] = fixed for datum in origins: result[datum.origin] = datum return result def get_original_ndim(self): return len(self.get_origin()) def get_shape(self): return tuple( [item.size for item in self._get_instances(NoneKey,RangeKey)]) shape = property(get_shape) def get_size(self): return reduce(lambda x,y: x*y, self.shape, 1) size = property(get_size) def get_ndim(self): return self._count_instances(NoneKey,RangeKey) ndim = property(get_ndim) def pyobj(self): return [x.pyobj() for x in self.data] def replace_ellipsis(self, key): """Given key, replace one or more Ellipsis based on this MasterKey. Assumes key is a list, and if not, makes it a list. Raises IndexError if the key is too large. """ if type(key) != type([]): key = [key] ndim = self.ndim count_real_keys = len(key)-key.count(None)-key.count(Ellipsis) if count_real_keys > ndim: raise IndexError, "invalid index %s[%s]" % (self,key) # implicit Ellipsis at end of key if one wasn't given if Ellipsis not in key: key.append(Ellipsis) # first Ellipsis replaced with as many slice(None,None,None) as needed ellipsis_index = key.index(Ellipsis) ellipsis_count = key.count(Ellipsis) key = (key[:ellipsis_index] + ([slice(None,None,None)] * (ndim-count_real_keys)) + key[ellipsis_index+1:]) # remove all remaining Ellipsis from key ellipsis_count -= 1 while ellipsis_count > 0: key.remove(Ellipsis) ellipsis_count -= 1 return key def __getitem__(self, key): """Slices this MasterKey and returns a new MasterKey.""" key = self.replace_ellipsis(key) new_data = [] new_fixed = self.fixed[:] # copy fixed dimensions key_iter = iter(key) for item in self.data: if isinstance(item, (RangeKey,NoneKey)): next_key = key_iter.next() while next_key is None: new_data.append(NoneKey()) next_key = key_iter.next() result = item[next_key] if isinstance(item, RangeKey) and isinstance(result, FixedKey): # went from range to fixed, add to fixed keys new_fixed.append(result) elif result is not None: new_data.append(result) elif isinstance(item, FixedKey): raise TypeError, "FixedKey found in MasterKey" else: raise TypeError, "unrecognized item in MasterKey" # there might be some items left in the key_iter # the only valid items that can remain are None for next_key in key_iter: assert next_key is None new_data.append(NoneKey()) result = MasterKey(None, new_data, new_fixed, self.T, self.TT) return result def bound_by_lohi(self, lo, hi): """Calculate new MasterKey for the subarray denoted by lo and hi. returns a list of slice objects representing the piece of the subarray that the lo and hi bounds maintain after applying bounds to global_slice. raises IndexError if the lo and hi bounds don't get a piece of the subarray Examples -------- >>> j = MasterKey((10,15,20,25)) >>> k = j[1:10:2, 10:1:-3, 2, None, 10] >>> k.bound_by_lohi([4,4,0,5], [10,9,3,20]) [RangeKey(5,10,2), RangeKey(7,3,-3)] """ result = [] lo = [l for l in lo] hi = [h for h in hi] assert len(lo) == len(hi) == self.get_original_ndim() # verify fixed dimensions within bounds; raises IndexError otherwise for item in self.fixed: item.bound_by_lohi(lo[item.origin], hi[item.origin]) for item in self.data: if isinstance(item, RangeKey): result.append( item.bound_by_lohi(lo[item.origin], hi[item.origin])) elif isinstance(item, NoneKey): pass elif isinstance(item, FixedKey): raise TypeError, "FixedKey found in MasterKey" else: raise TypeError, "unrecognized item in MasterKey" return result def lohi_T(self): """Return the current order of origin including fixed dimensions. This produces a tranpose suitable for a lo or hi. Examples -------- >>> lo,hi = [0,0,0], [2,3,4] >>> k = MasterKey((2,3,4)) >>> k_T = k.transpose((2,1,0)) >>> k_T1 = k_T[:,1] >>> k_T1.lohi_T() """ return [item.origin for item in self.get_origin()] def None_key(self): """Return a key based on current None's in this MasterKey. Examples -------- >>> k = MasterKey((2,3,4)) >>> k1 = k[None, :, None, :, None, :, None] >>> k1.None_key() [None, slice(None,None,None), """ return [None if isinstance(datum, NoneKey) else slice(None,None,None) for datum in self.data] def get_lo_hi_skip_adjust(self): """Return lo/hi/skip/adjust needed for successful ga.strided_get().""" sorted_origin = self.get_sorted_origin() lo = [] hi = [] sk = [] ad = [] need_strided = False for item in sorted_origin: if isinstance(item, FixedKey): lo.append(item.value) hi.append(item.value+1) sk.append(1) ad.append(slice(0,None,None)) elif isinstance(item, RangeKey): if item.step > 1 or item.step < -1: need_strided = True if item.step < 0: length = item.size-1 lo.append(item.step*length + item.start) hi.append(item.start+1) sk.append(-item.step) ad.append(slice(None,None,-1)) else: lo.append(item.start) hi.append(item.stop) sk.append(item.step) ad.append(slice(0,None,None)) else: raise TypeError, "unhandled piece of MasterKey" lo = np.asarray(lo, dtype=np.int64) hi = np.asarray(hi, dtype=np.int64) sk = np.asarray(sk, dtype=np.int64) return lo,hi,sk,ad,need_strided def access_key(self, lo, hi): """Converts from MasterKey to list appropriate for ga.access()[list]. Does NOT return a new MasterKey or any Key subclasses. The returned list contains one or more of slice, int, long, etc which an access()ed ndarray can iterpret. """ result = [None]*self.get_original_ndim() for fixed in self.fixed: result[fixed.origin] = fixed.value-lo[fixed.origin] iter_ranged_origin = iter(self.bound_by_lohi(lo, hi)) for i in range(len(result)): if result[i] is None: ranged = iter_ranged_origin.next() nlo = lo[ranged.origin] start = ranged.start-nlo stop = ranged.stop-nlo if start < 0: start = None if stop < 0: stop = None result[i] = slice(start,stop,ranged.step) return result def get_key(self, lo, hi): """Converts from MasterKey to list appropriate for ga.get()[list].""" iter_ranged_origin = iter(self.bound_by_lohi(lo, hi)) result = [] for datum in self.data: if isinstance(datum, FixedKey): raise TypeError, "FixedKey found in MasterKey" elif isinstance(datum, RangeKey): ro = iter_ranged_origin.next() offset = RangeKey( datum.start,ro.start,datum.step,datum.origin).size result.append(slice(offset, offset+ro.size, 1)) elif isinstance(datum, NoneKey): result.append(slice(None,None,None)) else: raise ValueError, "MasterKey contained unknown object" return result def transpose(self, axes): """Swap the axes of this MasterKey given axes. Returns the inverse of the axes in addition to the new MasterKey instance. Parameters ---------- axes : list of ints `i` in the `j`-th place in the tuple means `a`'s `i`-th axis becomes `a.transpose()`'s `j`-th axis. Examples -------- >>> k = MasterKey((40,30,20)) >>> k = k[2:34:1, 4, None, 10:2:-1] >>> inv,new_k = k.transpose((1,2,0)) >>> print inv [2, 0, 1] >>> print new_k """ # normalize the inputs, making sure they're all iterable axes = listify(axes) # create the inverse of the given axes inverse = [None]*len(axes) for i,val in enumerate(axes): inverse[val] = i # modify the given axes based on this MasterKey new_data = [self.data[i] for i in axes] return MasterKey(None, new_data, self.fixed, axes, inverse) def broadcast_shape(first, second): """Return the broadcasted version of shapes first and second.""" def worker(x,y): if x is None: x = 1 if y is None: y = 1 if x != 1 and y != 1 and x != y: raise ValueError, ("shape mismatch:" " objects cannot be broadcast to a single shape") return max(x,y) return tuple(reversed(map(worker, reversed(first), reversed(second)))) def broadcast_chomp(smaller_key, larger_key): """Return a key appropriate for the given shape.""" new_key = [] for s,l in zip(reversed(smaller_key),reversed(larger_key)): if s == 1: new_key.append(slice(0,1,1)) else: new_key.append(l) new_key.reverse() return new_key def unravel_index(x,dims): """Like np.unravel_index, but 'x' can be an integer array. Yeah, I know, numpy 1.6.0 has this already, but we're based on 1.5.1. I copied the code and modified it from 1.5.1. """ import numpy as _nx x = _nx.asarray(x) if x.ndim == 0: return _nx.unravel_index(x,dims) max = _nx.prod(dims)-1 if _nx.any(x>max) or _nx.any(x<0): raise ValueError("Invalid index, must be 0 <= x <= number of elements.") idx = _nx.empty_like(dims) # Take dimensions # [a,b,c,d] # Reverse and drop first element # [d,c,b] # Prepend [1] # [1,d,c,b] # Calculate cumulative product # [1,d,dc,dcb] # Reverse # [dcb,dc,d,1] dim_prod = _nx.cumprod([1] + list(dims)[:0:-1])[::-1] # Indices become [x/dcb % a, x/dc % b, x/d % c, x/1 % d] return tuple(x[:,None]//dim_prod % dims) ga-5-4/python/ga4py/gain/misc.pyx0000644000175000017500000010573112662210323015014 0ustar mbamba# cython: profile=True import math from ga4py import ga from core import asarray from core import flatiter from core import get_dtype from core import get_shape from core import is_array from core import is_distributed from core import multiply from core import ndarray from core import _npin_piece_based_on_out from core import should_distribute from core import sync from core import zeros import numpy as np cimport numpy as np def zeros_like(a, dtype=None, order='K', subok=True): """Return an array of zeros with the same shape and type as a given array. Equivalent to ``a.copy().fill(0)``. Parameters ---------- a : array_like The shape and data-type of `a` define the parameters of the returned array. Returns ------- out : ndarray Array of zeros with same shape and type as `a`. See Also -------- ones_like : Return an array of ones with shape and type of input. empty_like : Return an empty array with shape and type of input. zeros : Return a new array setting values to zero. ones : Return a new array setting values to one. empty : Return a new uninitialized array. Examples -------- >>> x = np.arange(6) >>> x = x.reshape((2, 3)) >>> x array([[0, 1, 2], [3, 4, 5]]) >>> np.zeros_like(x) array([[0, 0, 0], [0, 0, 0]]) >>> y = np.arange(3, dtype=np.float) >>> y array([ 0., 1., 2.]) >>> np.zeros_like(y) array([ 0., 0., 0.]) """ return zeros(a.shape, dtype=a.dtype) def ones(shape, dtype=np.float, order='C'): """Return a new array of given shape and type, filled with ones. Please refer to the documentation for `zeros`. See Also -------- zeros Examples -------- >>> np.ones(5) array([ 1., 1., 1., 1., 1.]) >>> np.ones((5,), dtype=np.int) array([1, 1, 1, 1, 1]) >>> np.ones((2, 1)) array([[ 1.], [ 1.]]) >>> s = (2,2) >>> np.ones(s) array([[ 1., 1.], [ 1., 1.]]) """ if not should_distribute(shape): return np.ones(shape, dtype, order) a = ndarray(shape, dtype) buf = a.access() if buf is not None: buf[:] = 1 a.release_update() return a def ones_like(x): """ones_like(x[, out]) Returns an array of ones with the same shape and type as a given array. Equivalent to ``a.copy().fill(1)``. Please refer to the documentation for `zeros_like`. See Also -------- zeros_like Examples -------- >>> a = np.array([[1, 2, 3], [4, 5, 6]]) >>> np.ones_like(a) array([[1, 1, 1], [1, 1, 1]]) """ return ones(x.shape, dtype=x.dtype) def empty(shape, dtype=float, order='C'): """empty(shape, dtype=float, order='C') Return a new array of given shape and type, without initializing entries. Parameters ---------- shape : int or tuple of int Shape of the empty array dtype : data-type, optional Desired output data-type. order : {'C', 'F'}, optional Whether to store multi-dimensional data in C (row-major) or Fortran (column-major) order in memory. See Also -------- empty_like, zeros, ones Notes ----- `empty`, unlike `zeros`, does not set the array values to zero, and may therefore be marginally faster. On the other hand, it requires the user to manually set all the values in the array, and should be used with caution. Examples -------- >>> np.empty([2, 2]) array([[ -9.74499359e+001, 6.69583040e-309], #random data [ 2.13182611e-314, 3.06959433e-309]]) >>> np.empty([2, 2], dtype=int) array([[-1073741821, -1067949133], #random data [ 496041986, 19249760]]) """ return ndarray(shape, dtype) def empty_like(a, dtype=None, order='K', subok=True): """ Return a new array with the same shape and type as a given array. Parameters ---------- a : array_like The shape and data-type of `a` define the parameters of the returned array. Returns ------- out : ndarray Array of random data with the same shape and type as `a`. See Also -------- ones_like : Return an array of ones with shape and type of input. zeros_like : Return an array of zeros with shape and type of input. empty : Return a new uninitialized array. ones : Return a new array setting values to one. zeros : Return a new array setting values to zero. Notes ----- This function does *not* initialize the returned array; to do that use `zeros_like` or `ones_like` instead. It may be marginally faster than the functions that do set the array values. Examples -------- >>> a = ([1,2,3], [4,5,6]) # a is array-like >>> np.empty_like(a) array([[-1073741821, -1073741821, 3], #random [ 0, 0, -1073741821]]) >>> a = np.array([[1., 2., 3.],[4.,5.,6.]]) >>> np.empty_like(a) array([[ -2.00000715e+000, 1.48219694e-323, -2.00000572e+000], #random [ 4.38791518e-305, -2.00000715e+000, 4.17269252e-309]]) """ return empty(a.shape, dtype or a.dtype) def eye(N, M=None, k=0, dtype=float): """Return a 2-D array with ones on the diagonal and zeros elsewhere. Parameters ---------- N : int Number of rows in the output. M : int, optional Number of columns in the output. If None, defaults to `N`. k : int, optional Index of the diagonal: 0 refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal. dtype : dtype, optional Data-type of the returned array. Returns ------- I : ndarray (N,M) An array where all elements are equal to zero, except for the `k`-th diagonal, whose values are equal to one. See Also -------- diag : Return a diagonal 2-D array using a 1-D array specified by the user. Examples -------- >>> np.eye(2, dtype=int) array([[1, 0], [0, 1]]) >>> np.eye(3, k=1) array([[ 0., 1., 0.], [ 0., 0., 1.], [ 0., 0., 0.]]) """ if M is None: M = N if not should_distribute((N,M)): return np.eye(N,M,k,dtype) a = zeros((N,M), dtype=dtype) nda = a.access() if nda is not None: lo,hi = a.distribution() indices = np.indices(nda.shape) indices[0] += lo[0] indices[1] += lo[1]-k bindex = (indices[0] == indices[1]) nda[bindex] = 1 a.release_update() return a def identity(n, dtype=None): """Return the identity array. The identity array is a square array with ones on the main diagonal. Parameters ---------- n : int Number of rows (and columns) in `n` x `n` output. dtype : data-type, optional Data-type of the output. Defaults to ``float``. Returns ------- out : ndarray `n` x `n` array with its main diagonal set to one, and all other elements 0. Examples -------- >>> np.identity(3) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) """ if dtype is None: dtype = np.dtype(float) return eye(n,n,dtype=dtype) def fromfunction(func, shape, **kwargs): """Construct an array by executing a function over each coordinate. The resulting array therefore has a value ``fn(x, y, z)`` at coordinate ``(x, y, z)``. Parameters ---------- function : callable The function is called with N parameters, each of which represents the coordinates of the array varying along a specific axis. For example, if `shape` were ``(2, 2)``, then the parameters would be two arrays, ``[[0, 0], [1, 1]]`` and ``[[0, 1], [0, 1]]``. `function` must be capable of operating on arrays, and should return a scalar value. shape : (N,) tuple of ints Shape of the output array, which also determines the shape of the coordinate arrays passed to `function`. dtype : data-type, optional Data-type of the coordinate arrays passed to `function`. By default, `dtype` is float. Returns ------- out : any The result of the call to `function` is passed back directly. Therefore the type and shape of `out` is completely determined by `function`. See Also -------- indices, meshgrid Notes ----- Keywords other than `shape` and `dtype` are passed to `function`. Examples -------- >>> np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int) array([[ True, False, False], [False, True, False], [False, False, True]], dtype=bool) >>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int) array([[0, 1, 2], [1, 2, 3], [2, 3, 4]]) """ if not should_distribute(shape): return np.fromfunction(func, shape, **kwargs) dtype = kwargs.pop('dtype', np.float32) # create the new GA (collective operation) a = ndarray(shape, dtype) # determine which part of 'a' we maintain local_array = ga.access(a.handle) if local_array is not None: lo,hi = a.distribution() local_shape = hi-lo # create a numpy indices array args = np.indices(local_shape, dtype=dtype) # modify the indices arrays based on our distribution for index in xrange(len(lo)): args[index] += lo[index] # call the passed function buf = func(*args, **kwargs) # now put the data into the global array local_array[:] = buf #sync() return a def arange(start, stop=None, step=None, dtype=None, shape=None): """Return evenly spaced values within a given interval. Values are generated within the half-open interval ``[start, stop)`` (in other words, the interval including `start` but excluding `stop`). For integer arguments the function is equivalent to the Python built-in `range `_ function, but returns a ndarray rather than a list. Parameters ---------- start : number, optional Start of interval. The interval includes this value. The default start value is 0. stop : number End of interval. The interval does not include this value. step : number, optional Spacing between values. For any output `out`, this is the distance between two adjacent values, ``out[i+1] - out[i]``. The default step size is 1. If `step` is specified, `start` must also be given. dtype : dtype The type of the output array. If `dtype` is not given, infer the data type from the other input arguments. Hack Parameters --------------- shape : tuple of ints Useful shortcut when doing something like np.arange(...).reshape(...) Returns ------- out : ndarray Array of evenly spaced values. For floating point arguments, the length of the result is ``ceil((stop - start)/step)``. Because of floating point overflow, this rule may result in the last element of `out` being greater than `stop`. See Also -------- linspace : Evenly spaced numbers with careful handling of endpoints. ogrid: Arrays of evenly spaced numbers in N-dimensions mgrid: Grid-shaped arrays of evenly spaced numbers in N-dimensions Examples -------- >>> np.arange(3) array([0, 1, 2]) >>> np.arange(3.0) array([ 0., 1., 2.]) >>> np.arange(3,7) array([3, 4, 5, 6]) >>> np.arange(3,7,2) array([3, 5]) """ if step == 0: raise ValueError, "step size of 0 not allowed" if not step: step = 1 if not stop: start,stop = 0,start length = 0 if ((step < 0 and stop >= start) or (step > 0 and start >= stop)): length = 0 else: # true division, otherwise off by one length = int(math.ceil((stop-start)/step)) # bail if threshold not met if not should_distribute(length): return np.arange(start,stop,step,dtype) if dtype is None: if (isinstance(start, (int,long)) and isinstance(stop, (int,long)) and isinstance(step, (int,long))): dtype = np.int64 else: dtype = np.float64 a = None if shape is not None: shape = np.asarray(shape,dtype=np.int64) if np.prod(shape) != length: raise ValueError, "total size of new array must be unchanged" a = ndarray(shape, dtype) a_local = a.access() if a_local is not None: lo,hi = a.distribution() lshape = hi-lo v = np.add.reduce( (np.indices(lshape).reshape(len(lshape),-1).T + lo) * (np.asarray(a.strides)/a.itemsize), axis=1) a_local.flat = v*step + start a.release_update() else: a = ndarray(length, dtype) a_local = a.access() if a_local is not None: lo,hi = a.distribution() a_local[...] = np.arange(lo[0],hi[0]) a_local *= step a_local += start a.release_update() return a def linspace(start, stop, num=50, endpoint=True, retstep=False): """Return evenly spaced numbers over a specified interval. Returns `num` evenly spaced samples, calculated over the interval [`start`, `stop` ]. The endpoint of the interval can optionally be excluded. Parameters ---------- start : scalar The starting value of the sequence. stop : scalar The end value of the sequence, unless `endpoint` is set to False. In that case, the sequence consists of all but the last of ``num + 1`` evenly spaced samples, so that `stop` is excluded. Note that the step size changes when `endpoint` is False. num : int, optional Number of samples to generate. Default is 50. endpoint : bool, optional If True, `stop` is the last sample. Otherwise, it is not included. Default is True. retstep : bool, optional If True, return (`samples`, `step`), where `step` is the spacing between samples. Returns ------- samples : ndarray There are `num` equally spaced samples in the closed interval ``[start, stop]`` or the half-open interval ``[start, stop)`` (depending on whether `endpoint` is True or False). step : float (only if `retstep` is True) Size of spacing between samples. See Also -------- arange : Similiar to `linspace`, but uses a step size (instead of the number of samples). logspace : Samples uniformly distributed in log space. Examples -------- >>> np.linspace(2.0, 3.0, num=5) array([ 2. , 2.25, 2.5 , 2.75, 3. ]) >>> np.linspace(2.0, 3.0, num=5, endpoint=False) array([ 2. , 2.2, 2.4, 2.6, 2.8]) >>> np.linspace(2.0, 3.0, num=5, retstep=True) (array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25) Graphical illustration: >>> import matplotlib.pyplot as plt >>> N = 8 >>> y = np.zeros(N) >>> x1 = np.linspace(0, 10, N, endpoint=True) >>> x2 = np.linspace(0, 10, N, endpoint=False) >>> plt.plot(x1, y, 'o') >>> plt.plot(x2, y + 0.5, 'o') >>> plt.ylim([-0.5, 1]) >>> plt.show() """ # bail if threshold not met if not should_distribute(num): return np.linspace(start,stop,num,endpoint,retstep) a = ndarray(num) step = None if endpoint: step = (stop-start)/(num-1) else: step = (stop-start)/num buf = a.access() if buf is not None: lo,hi = a.distribution() lo,hi = lo[0],hi[0] buf[:] = np.arange(lo,hi)*step+start a.release_update() #sync() if retstep: return a,step return a def logspace(start, stop, num=50, endpoint=True, base=10.0): """Return numbers spaced evenly on a log scale. In linear space, the sequence starts at ``base ** start`` (`base` to the power of `start`) and ends with ``base ** stop`` (see `endpoint` below). Parameters ---------- start : float ``base ** start`` is the starting value of the sequence. stop : float ``base ** stop`` is the final value of the sequence, unless `endpoint` is False. In that case, ``num + 1`` values are spaced over the interval in log-space, of which all but the last (a sequence of length ``num``) are returned. num : integer, optional Number of samples to generate. Default is 50. endpoint : boolean, optional If true, `stop` is the last sample. Otherwise, it is not included. Default is True. base : float, optional The base of the log space. The step size between the elements in ``ln(samples) / ln(base)`` (or ``log_base(samples)``) is uniform. Default is 10.0. Returns ------- samples : ndarray `num` samples, equally spaced on a log scale. See Also -------- arange : Similiar to linspace, with the step size specified instead of the number of samples. Note that, when used with a float endpoint, the endpoint may or may not be included. linspace : Similar to logspace, but with the samples uniformly distributed in linear space, instead of log space. Notes ----- Logspace is equivalent to the code >>> y = linspace(start, stop, num=num, endpoint=endpoint) >>> power(base, y) Examples -------- >>> np.logspace(2.0, 3.0, num=4) array([ 100. , 215.443469 , 464.15888336, 1000. ]) >>> np.logspace(2.0, 3.0, num=4, endpoint=False) array([ 100. , 177.827941 , 316.22776602, 562.34132519]) >>> np.logspace(2.0, 3.0, num=4, base=2.0) array([ 4. , 5.0396842 , 6.34960421, 8. ]) Graphical illustration: >>> import matplotlib.pyplot as plt >>> N = 10 >>> x1 = np.logspace(0.1, 1, N, endpoint=True) >>> x2 = np.logspace(0.1, 1, N, endpoint=False) >>> y = np.zeros(N) >>> plt.plot(x1, y, 'o') >>> plt.plot(x2, y + 0.5, 'o') >>> plt.ylim([-0.5, 1]) >>> plt.show() """ # bail if threshold not met if not should_distribute(num): return np.logspace(start,stop,num,endpoint,base) a = ndarray(num) step = None if endpoint: step = (stop-start)/(num-1) else: step = (stop-start)/num buf = a.access() if buf is not None: lo,hi = a.distribution() lo,hi = lo[0],hi[0] buf[:] = base**(np.arange(lo,hi)*step+start) a.release_update() #sync() return a def dot(a, b, out=None): """dot(a, b) Dot product of two arrays. For 2-D arrays it is equivalent to matrix multiplication, and for 1-D arrays to inner product of vectors (without complex conjugation). For N dimensions it is a sum product over the last axis of `a` and the second-to-last of `b`:: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m]) Parameters ---------- a : array_like First argument. b : array_like Second argument. Returns ------- output : ndarray Returns the dot product of `a` and `b`. If `a` and `b` are both scalars or both 1-D arrays then a scalar is returned; otherwise an array is returned. Raises ------ ValueError If the last dimension of `a` is not the same size as the second-to-last dimension of `b`. See Also -------- vdot : Complex-conjugating dot product. tensordot : Sum products over arbitrary axes. Examples -------- >>> np.dot(3, 4) 12 Neither argument is complex-conjugated: >>> np.dot([2j, 3j], [2j, 3j]) (-13+0j) For 2-D arrays it's the matrix product: >>> a = [[1, 0], [0, 1]] >>> b = [[4, 1], [2, 2]] >>> np.dot(a, b) array([[4, 1], [2, 2]]) >>> a = np.arange(3*4*5*6).reshape((3,4,5,6)) >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3)) >>> np.dot(a, b)[2,3,2,1,2,2] 499128 >>> sum(a[2,3,2,:] * b[1,2,:,2]) 499128 """ a = asarray(a) b = asarray(b) if not (is_distributed(a) or is_distributed(b)): # numpy pass through return np.dot(a,b) # working with flatiter instances can be expensive, try this opt if (isinstance(a,flatiter) and isinstance(b,flatiter) and a._base is b._base): return (a._base * b._base).sum() if ((isinstance(a,flatiter) or a.ndim == 1) and (isinstance(b,flatiter) or b.ndim == 1)): if len(a) != len(b): raise ValueError, "objects are not aligned" tmp = multiply(a,b) ndtmp = tmp.access() local_sum = None if ndtmp is None: local_sum = np.add.reduce(np.asarray([0], dtype=tmp.dtype)) else: local_sum = np.add.reduce(ndtmp) return ga.gop_add(local_sum) elif a.ndim == 2 and b.ndim == 2: if a.shape[1] != b.shape[0]: raise ValueError, "objects are not aligned" # use GA gemm if certain conditions apply valid_types = [np.dtype(np.float32), np.dtype(np.float64), np.dtype(np.complex64), np.dtype(np.complex128)] if (a.base is None and b.base is None and a.dtype == b.dtype and a.dtype in valid_types): out = zeros((a.shape[0],b.shape[1]), a.dtype) ga.gemm(False, False, a.shape[0], b.shape[1], b.shape[0], 1, a.handle, b.handle, 1, out.handle) return out else: raise NotImplementedError elif isinstance(a,(ndarray,flatiter)) and isinstance(b,(ndarray,flatiter)): if a.shape[1] != b.shape[0]: raise ValueError, "objects are not aligned" raise NotImplementedError, "arbitrary dot" else: # assume we have a scalar somewhere, so just multiply return multiply(a,b) def diag(v, k=0): """Extract a diagonal or construct a diagonal array. Parameters ---------- v : array_like If `v` is a 2-D array, return a copy of its `k`-th diagonal. If `v` is a 1-D array, return a 2-D array with `v` on the `k`-th diagonal. k : int, optional Diagonal in question. The default is 0. Use `k>0` for diagonals above the main diagonal, and `k<0` for diagonals below the main diagonal. Returns ------- out : ndarray The extracted diagonal or constructed diagonal array. See Also -------- diagonal : Return specified diagonals. diagflat : Create a 2-D array with the flattened input as a diagonal. trace : Sum along diagonals. triu : Upper triangle of an array. tril : Lower triange of an array. Examples -------- >>> x = np.arange(9).reshape((3,3)) >>> x array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> np.diag(x) array([0, 4, 8]) >>> np.diag(x, k=1) array([1, 5]) >>> np.diag(x, k=-1) array([3, 7]) >>> np.diag(np.diag(x)) array([[0, 0, 0], [0, 4, 0], [0, 0, 8]]) """ v = asarray(v) if isinstance(v, ndarray): raise NotImplementedError, "TODO" # the following isn't right. # We want to scatter the values from the given diagonal into a brand # new distributed array, but how to compute the indices for the # scatter operation? Or should we "access" the newly created array # and "gather" values from the given diagonal? #if v.ndim == 1: # k_fabs = math.fabs(k) # N = k_fabs + len(v) # a = zeros((N,N), dtype=v.dtype) # ndv = v.access() # if ndv is not None: # lo,hi = v.distribution() # count = hi[0]-lo[0] # indices = np.ndarray(count*2,dtype=int) # if k >= 0: # indices[0::2] = np.arange(count)+lo[0] # indices[1::2] = np.arange(count)+lo[0]+k # else: # indices[0::2] = np.arange(count)+lo[0]+k_fabs # indices[1::2] = np.arange(count)+lo[0] # a.scatter( # return a #elif v.ndim == 2: # pass #else: # raise ValueError, "Input must be 1- or 2-d." else: return np.diag(v,k) def clip(a, a_min, a_max, out=None): """Clip (limit) the values in an array. Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of ``[0, 1]`` is specified, values smaller than 0 become 0, and values larger than 1 become 1. Parameters ---------- a : array_like Array containing elements to clip. a_min : scalar or array_like Minimum value. a_max : scalar or array_like Maximum value. If `a_min` or `a_max` are array_like, then they will be broadcasted to the shape of `a`. out : ndarray, optional The results will be placed in this array. It may be the input array for in-place clipping. `out` must be of the right shape to hold the output. Its type is preserved. Returns ------- clipped_array : ndarray An array with the elements of `a`, but where values < `a_min` are replaced with `a_min`, and those > `a_max` with `a_max`. See Also -------- numpy.doc.ufuncs : Section "Output arguments" Examples -------- >>> a = np.arange(10) >>> np.clip(a, 1, 8) array([1, 1, 2, 3, 4, 5, 6, 7, 8, 8]) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.clip(a, 3, 6, out=a) array([3, 3, 3, 3, 4, 5, 6, 6, 6, 6]) >>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.clip(a, [3,4,1,1,1,4,4,4,4,4], 8) array([3, 4, 2, 3, 4, 5, 6, 7, 8, 8]) """ # just in case a = asarray(a) a_min = asarray(a_min) a_max = asarray(a_max) if not (is_distributed(a) or is_distributed(a_min) or is_distributed(a_max) or is_distributed(out)): # no ndarray instances used, pass through immediately to numpy return np.clip(a, a_min, a_max, out) a_shape = get_shape(a) a_min_shape = get_shape(a_min) a_max_shape = get_shape(a_max) if out is None: out = ndarray(a_shape, get_dtype(a)) # sanity checks if not is_array(out): raise TypeError, "output must be an array" if out.shape != a.shape: raise ValueError, ("clip: Output array must have thesame shape as " "the input.") # Now figure out what to do... if isinstance(out, ndarray): sync() # get out as an np.ndarray first npout = out.access() if npout is not None: # this proc owns data # get matching and compatible portions of input arrays # broadcasting rules (may) apply if a is out: npa,release_a = npout,False else: npa,release_a = _npin_piece_based_on_out(a,out,a_shape) if a_min is out: npa_min,release_a_min = npout,False elif a_min is a: npa_min,release_a_min = npa,False else: npa_min,release_a_min = _npin_piece_based_on_out( a_min,out,a_min_shape) if a_max is out: npa_max,release_a_max = npout,False elif a_max is a: npa_max,release_a_max = npa,False elif a_max is a_min: npa_max,release_a_max = npa_min,False else: npa_max,release_a_max = _npin_piece_based_on_out( a_max,out,a_max_shape) np.clip(npa, npa_min, npa_max, npout) if release_a: a.release() if release_a_min: a_min.release() if release_a_max: a_max.release() out.release_update() #sync() elif isinstance(out, flatiter): raise NotImplementedError, "flatiter version of clip" #sync() ## first op: first and second and out are same object #if first is second is out: # self._binary_call(out.base,out.base,out.base,*args,**kwargs) # return out.copy() #else: # npout = out.access() # if npout is not None: # this proc 'owns' data # if is_distributed(first): # npfirst = first.get(out._range) # else: # npfirst = first[out._range] # if second is first: # npsecond = npfirst # elif is_distributed(second): # npsecond = second.get(out._range) # else: # npsecond = second[out._range] # self.func(npfirst, npsecond, npout, *args, **kwargs) # out.release_update() #sync() else: sync() # out is not distributed nda = a if is_distributed(a): nda = a.allget() nda_min = a_min if a is a_min: nda_min = nda elif is_distributed(a_min): nda_min = a_min.allget() nda_max = a_max if a is a_max: nda_max = nda elif a_max is a_min: nda_max = nda_min elif is_distributed(a_max): nda_max = a_max.allget() np.clip(a, nda_min, nda_max, out) #sync() # I don't think we need this one return out def indices(dimensions, dtype=int): """Return an array representing the indices of a grid. Compute an array where the subarrays contain index values 0,1,... varying only along the corresponding axis. Parameters ---------- dimensions : sequence of ints The shape of the grid. dtype : dtype, optional Data type of the result. Returns ------- grid : ndarray The array of grid indices, ``grid.shape = (len(dimensions),) + tuple(dimensions)``. See Also -------- mgrid, meshgrid Notes ----- The output shape is obtained by prepending the number of dimensions in front of the tuple of dimensions, i.e. if `dimensions` is a tuple ``(r0, ..., rN-1)`` of length ``N``, the output shape is ``(N,r0,...,rN-1)``. The subarrays ``grid[k]`` contains the N-D array of indices along the ``k-th`` axis. Explicitly:: grid[k,i0,i1,...,iN-1] = ik Examples -------- >>> grid = np.indices((2, 3)) >>> grid.shape (2, 2, 3) >>> grid[0] # row indices array([[0, 0, 0], [1, 1, 1]]) >>> grid[1] # column indices array([[0, 1, 2], [0, 1, 2]]) The indices can be used as an index into an array. >>> x = np.arange(20).reshape(5, 4) >>> row, col = np.indices((2, 3)) >>> x[row, col] array([[0, 1, 2], [4, 5, 6]]) Note that it would be more straightforward in the above example to extract the required elements directly with ``x[:2, :3]``. """ orig_shape = [dim for dim in dimensions] shape = [len(orig_shape)] + orig_shape if should_distribute(shape): a = zeros(shape, dtype=dtype) buf = a.access() if buf is not None: lo,hi = a.distribution() lohi_shape = hi-lo for i in range(lo[0],hi[0]): vec = np.arange(lohi_shape[i+1])+lo[i+1] vec_mod = [None]*len(orig_shape) vec_mod[i] = slice(None,None,None) values = vec[vec_mod] buf[i-lo[0]][:] = values a.release_update() else: return np.indices(orig_shape,dtype) return a def shape(a): """Return the shape of an array. Parameters ---------- a : array_like Input array. Returns ------- shape : tuple of ints The elements of the shape tuple give the lengths of the corresponding array dimensions. See Also -------- alen ndarray.shape : Equivalent array method. Examples -------- >>> np.shape(np.eye(3)) (3, 3) >>> np.shape([[1, 2]]) (1, 2) >>> np.shape([0]) (1,) >>> np.shape(0) () >>> a = np.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')]) >>> np.shape(a) (2,) >>> a.shape (2,) """ return asarray(a).shape def diagonal(a, offset=0, axis1=0, axis2=1): """Return specified diagonals. If `a` is 2-D, returns the diagonal of `a` with the given offset, i.e., the collection of elements of the form ``a[i, i+offset]``. If `a` has more than two dimensions, then the axes specified by `axis1` and `axis2` are used to determine the 2-D sub-array whose diagonal is returned. The shape of the resulting array can be determined by removing `axis1` and `axis2` and appending an index to the right equal to the size of the resulting diagonals. Parameters ---------- a : array_like Array from which the diagonals are taken. offset : int, optional Offset of the diagonal from the main diagonal. Can be positive or negative. Defaults to main diagonal (0). axis1 : int, optional Axis to be used as the first axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults to first axis (0). axis2 : int, optional Axis to be used as the second axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults to second axis (1). Returns ------- array_of_diagonals : ndarray If `a` is 2-D, a 1-D array containing the diagonal is returned. If the dimension of `a` is larger, then an array of diagonals is returned, "packed" from left-most dimension to right-most (e.g., if `a` is 3-D, then the diagonals are "packed" along rows). Raises ------ ValueError If the dimension of `a` is less than 2. See Also -------- diag : MATLAB work-a-like for 1-D and 2-D arrays. diagflat : Create diagonal arrays. trace : Sum along diagonals. Examples -------- >>> a = np.arange(4).reshape(2,2) >>> a array([[0, 1], [2, 3]]) >>> a.diagonal() array([0, 3]) >>> a.diagonal(1) array([1]) A 3-D example: >>> a = np.arange(8).reshape(2,2,2); a array([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) >>> a.diagonal(0, # Main diagonals of two arrays created by skipping ... 0, # across the outer(left)-most axis last and ... 1) # the "middle" (row) axis first. array([[0, 6], [1, 7]]) The sub-arrays whose main diagonals we just obtained; note that each corresponds to fixing the right-most (column) axis, and that the diagonals are "packed" in rows. >>> a[:,:,0] # main diagonal is [0 6] array([[0, 2], [4, 6]]) >>> a[:,:,1] # main diagonal is [1 7] array([[1, 3], [5, 7]]) """ return asarray(a).diagonal(offset, axis1, axis2) ga-5-4/python/ga4py/gain/random.pyx0000644000175000017500000000505712662210323015341 0ustar mbambafrom core import asarray from core import ndarray from core import me from mpi4py import MPI import numpy as np def random_sample(size=None): """random_sample(size=None) Return random floats in the half-open interval [0.0, 1.0). Results are from the "continuous uniform" distribution over the stated interval. To sample :math:`Unif[a, b), b > a` multiply the output of `random_sample` by `(b-a)` and add `a`:: (b - a) * random_sample() + a Parameters ---------- size : int or tuple of ints, optional Defines the shape of the returned array of random floats. If None (the default), returns a single float. Returns ------- out : float or ndarray of floats Array of random floats of shape `size` (unless ``size=None``, in which case a single float is returned). Examples -------- >>> np.random.random_sample() 0.47108547995356098 >>> type(np.random.random_sample()) >>> np.random.random_sample((5,)) array([ 0.30220482, 0.86820401, 0.1654503 , 0.11659149, 0.54323428]) Three-by-two array of random numbers from [-5, 0): >>> 5 * np.random.random_sample((3, 2)) - 5 array([[-3.99149989, -0.52338984], [-2.99091858, -0.79479508], [-1.23204345, -1.75224494]]) """ # this was my first implementation # but each process does a lot of unnecessary work #a = np.random.random_sample(size) #if size is None: # return a #else: # return asarray(a) a = None if size is None: a = np.random.random_sample(size) a = MPI.COMM_WORLD.bcast(a, 0) else: a = ndarray(size, dtype=float) buf = a.access() if buf is not None: buf[:] = np.random.random_sample(buf.shape) a.release_update() return a def seed(seed=None): """seed(seed=None) Seed the generator. This method is called when `RandomState` is initialized. It can be called again to re-seed the generator. For details, see `RandomState`. Parameters ---------- seed : int or array_like, optional Seed for `RandomState`. See Also -------- RandomState """ #np.random.seed(seed) if seed is None: np.random.seed() elif isinstance(seed,int): np.random.seed(seed+me()) else: a = np.asarray(seed) a += me() np.random.seed(a) ga-5-4/python/epydoc.cfg0000644000175000017500000001053712662210321013316 0ustar mbamba[epydoc] # Epydoc section marker (required by ConfigParser) # The list of objects to document. Objects can be named using # dotted names, module filenames, or package directory names. # Alases for this option include "objects" and "values". modules: ga # The type of output that should be generated. Should be one # of: html, text, latex, dvi, ps, pdf. #output: html # The path to the output directory. May be relative or absolute. #target: docs/html/ # An integer indicating how verbose epydoc should be. The default # value is 0; negative values will supress warnings and errors; # positive values will give more verbose output. verbosity: 0 # A boolean value indicating that Epydoc should show a tracaback # in case of unexpected error. By default don't show tracebacks #debug: 0 # If True, don't try to use colors or cursor control when doing # textual output. The default False assumes a rich text prompt #simple-term: 0 ### Generation options # The default markup language for docstrings, for modules that do # not define __docformat__. Defaults to epytext. docformat: reStructuredText # Whether or not parsing should be used to examine objects. parse: yes # Whether or not introspection should be used to examine objects. introspect: yes # Don't examine in any way the modules whose dotted name match this # regular expression pattern. exclude: # Don't perform introspection on the modules whose dotted name match this # regular expression pattern. #exclude-introspect # Don't perform parsing on the modules whose dotted name match this # regular expression pattern. #exclude-parse # The format for showing inheritance objects. # It should be one of: 'grouped', 'listed', 'included'. inheritance: listed # Whether or not to inclue private variables. (Even if included, # private variables will be hidden by default.) private: yes # Whether or not to list each module's imports. imports: no # Whether or not to include syntax highlighted source code in # the output (HTML only). sourcecode: yes # Whether or not to include a a page with Epydoc log, containing # effective option at the time of generation and the reported logs. include-log: no ### Output options # The documented project's name. name: Global Arrays for Python # The documented project's URL. url: http://www.emsl.pnl.gov/docs/global/ # The CSS stylesheet for HTML output. Can be the name of a builtin # stylesheet, or the name of a file. css: white # HTML code for the project link in the navigation bar. If left # unspecified, the project link will be generated based on the # project's name and URL. #link: My Cool Project # The "top" page for the documentation. Can be a URL, the name # of a module or class, or one of the special names "trees.html", # "indices.html", or "help.html" #top: os.path # An alternative help file. The named file should contain the # body of an HTML file; navigation bars will be added to it. #help: my_helpfile.html # Whether or not to include a frames-based table of contents. frames: yes # Whether each class should be listed in its own section when # generating LaTeX or PDF output. separate-classes: no ### API linking options # Define a new API document. A new interpreted text role # will be created #external-api: epydoc # Use the records in this file to resolve objects in the API named NAME. #external-api-file: epydoc:api-objects.txt # Use this URL prefix to configure the string returned for external API. #external-api-root: epydoc:http://epydoc.sourceforge.net/api ### Graph options # The list of graph types that should be automatically included # in the output. Graphs are generated using the Graphviz "dot" # executable. Graph types include: "classtree", "callgraph", # "umlclasstree". Use "all" to include all graph types graph: classtree # The path to the Graphviz "dot" executable, used to generate # graphs. #dotpath: /usr/local/bin/dot # The name of one or more pstat files (generated by the profile # or hotshot module). These are used to generate call graphs. #pstat: profile.out # Specify the font used to generate Graphviz graphs. # (e.g., helvetica or times). graph-font: Helvetica # Specify the font size used to generate Graphviz graphs. graph-font-size: 10 ### Return value options # The condition upon which Epydoc should exit with a non-zero # exit status. Possible values are error, warning, docstring_warning #fail-on: error ga-5-4/python/tools/0000755000175000017500000000000012662210320012503 5ustar mbambaga-5-4/python/tools/pxdgen.py0000755000175000017500000000226212662210320014347 0ustar mbamba#!/usr/bin/env python """ Generate the gah.pxd source from the ga.h header. We basically remove the "extern" and the ";" since our ga.h header is one-function-per-line. We then add other cython things to the top. Usage: pxdgen.py path/to/ga.h > gah.pxd """ import sys if len(sys.argv) != 2: print 'incorrect number of arguments' print 'usage: pxdgen.py > ' sys.exit(len(sys.argv)) # print headers print '''from libc.stdio cimport FILE from libc.stdint cimport int64_t cdef extern from "typesf2c.h": ctypedef int Integer ctypedef float Real ctypedef double DoublePrecision ctypedef struct DoubleComplex: DoublePrecision real DoublePrecision imag ctypedef struct SingleComplex: Real real Real imag cdef extern from "ga.h": ctypedef Integer ga_nbhdl_t ''' for line in open(sys.argv[1]): line = line.strip() if 'extern' in line and '{' in line: continue elif 'extern' in line: line = line.replace('extern','') line = line.replace(';','') if '(void)' in line: line = line.replace('(void)', '()') line = line.strip() print " %s" % line ga-5-4/python/tools/gen_notimplemented.py0000644000175000017500000000547112662210320016741 0ustar mbambaimport inspect import sys import numpy as np from ga import gain empty = "empty" print ''' import sys import numpy as np cimport numpy as np ''' #failed_signatures = [] for name in dir(np): np_attr = getattr(np,name) gain_attr = getattr(gain,name,None) if gain_attr is None and inspect.isbuiltin(np_attr): sig = "%s()" % name doc = "" if np_attr.__doc__: doc = np_attr.__doc__ first_line = doc.splitlines()[0] if '(' in first_line and ')' in first_line: # see if the first line is valid python syntax maybe_sig = first_line.strip() sig_test = 'def %s: pass' % maybe_sig try: exec(sig_test) sig = maybe_sig except Exception, e: #failed_signatures.append(maybe_sig) pass print ''' def %s: """%s """ # BUILTIN raise NotImplementedError ''' % (sig, doc.strip().replace('"""',"'''")) elif gain_attr is None and inspect.isfunction(np_attr): args,varargs,keywords,defaults = inspect.getargspec(np_attr) newdefaults = [empty]*len(args) if defaults is not None: newdefaults[(len(args)-len(defaults)):] = defaults sig = "%s(" % name stuff = zip(args,newdefaults) def stringify(arg,default): if arg == "char": # 'char' is a cython keyword arg = "char_" if default is empty: return "%s" % arg elif default is None: return "%s=None" % (arg) elif default is sys.stdout: return "%s=sys.stdout" % (arg) elif default is int: return "%s=int" % (arg) elif default is float: return "%s=float" % (arg) elif default is np.float64: return "%s=np.float64" % (arg) elif isinstance(default,basestring): if '\n' in default: return "%s='\\n'" % (arg) else: return "%s='%s'" % (arg,default) elif inspect.isbuiltin(default): return "%s=%s" % (arg,default.__name__) else: return "%s=%s" % (arg,default) if len(stuff) > 0: for arg,default in stuff[:-1]: sig += stringify(arg,default) sig += ", " arg,default = stuff[-1] sig += stringify(arg,default) sig += ")" else: sig += ")" doc = "" if np_attr.__doc__: doc = np_attr.__doc__ print ''' def %s: """%s """ raise NotImplementedError ''' % (sig, doc.strip().replace('"""',"'''")) #for sig in failed_signatures: # print sig ga-5-4/python/benchmarks/0000755000175000017500000000000012662210372013467 5ustar mbambaga-5-4/python/benchmarks/from_distnumpy/0000755000175000017500000000000012662210372016546 5ustar mbambaga-5-4/python/benchmarks/from_distnumpy/nbody.py0000644000175000017500000000665112662210372020243 0ustar mbamba#import numpy as np import sys import time d = int(sys.argv[1]) #Distributed n = int(sys.argv[2]) #Number of bodies k = int(sys.argv[3]) #Number of iterations if d: import ga.gain as np print "GAiN" else: import numpy as np print "NumPy" G = 1 #Gravitational constant dT = 0.01 #Time increment #M = np.empty((n,1)) #np.ufunc_random(M,M) M = np.random.random_sample((n,1)) #MT = np.empty((1,n)) #np.ufunc_random(MT,MT) MT = np.random.random_sample((1,n)) #Px = np.empty((n,1)) #np.ufunc_random(Px,Px) Px = np.random.random_sample((n,1)) #Py = np.empty((n,1)) #np.ufunc_random(Py,Py) Py = np.random.random_sample((n,1)) #Pz = np.empty((n,1)) #np.ufunc_random(Pz,Pz) Pz = np.random.random_sample((n,1)) #PxT= np.empty((1,n)) #np.ufunc_random(PxT,PxT) PxT = np.random.random_sample((1,n)) #PyT= np.empty((1,n)) #np.ufunc_random(PyT,PyT) PyT = np.random.random_sample((1,n)) #PzT= np.empty((1,n)) #np.ufunc_random(PzT,PzT) PzT = np.random.random_sample((1,n)) #Vx = np.empty((n,1)) #np.ufunc_random(Vx,Vx) Vx = np.random.random_sample((n,1)) #Vy = np.empty((n,1)) #np.ufunc_random(Vy,Vy) Vy = np.random.random_sample((n,1)) #Vz = np.empty((n,1)) #np.ufunc_random(Vz,Vz) Vz = np.random.random_sample((n,1)) OnesCol = np.zeros((n,1), dtype=float)+1.0 OnesRow = np.zeros((1,n), dtype=float)+1.0 #Identity= array(diag([1]*n), dtype=double) #np.timer_reset() #np.evalflush() stime = time.time() for i in xrange(k): #distance between all pairs of objects Fx = np.dot(OnesCol, PxT) - np.dot(Px, OnesRow) Fy = np.dot(OnesCol, PyT) - np.dot(Py, OnesRow) Fz = np.dot(OnesCol, PzT) - np.dot(Pz, OnesRow) Dsq = Fx * Fx Dsq += Fy * Fy Dsq += Fz * Fz #Dsq += Identity D = np.sqrt(Dsq) #mutual forces between all pairs of objects F = np.dot(M, MT) F *= G F /= Dsq del Dsq #F = F - diag(diag(F))#set 'self attraction' to 0 Fx /= D Fx *= F Fy /= D Fy *= F Fz /= D Fz *= F del D del F #net force on each body Fnet_x = np.add.reduce(Fx,1) Fnet_y = np.add.reduce(Fy,1) Fnet_z = np.add.reduce(Fz,1) Fnet_x = Fnet_x[:,np.newaxis] Fnet_y = Fnet_y[:,np.newaxis] Fnet_z = Fnet_z[:,np.newaxis] Fnet_x *= dT Fnet_y *= dT Fnet_z *= dT #change in velocity: Vx += Fnet_x / M Vy += Fnet_y / M Vz += Fnet_z / M del Fnet_x del Fnet_y del Fnet_z #change in position Px += Vx * dT Py += Vy * dT Pz += Vz * dT #np.evalflush() print 'nbody with #bodies: ', n,', iter: ', i+1, 'in sec: ', time.time() - stime, if d: print " (Dist) notes: %s"%sys.argv[4] else: print " (Non-Dist) notes: %s"%sys.argv[4] """Paper version: #distance between all pairs of objects Fx = dot(OnesCol, PxT) - dot(Px, OnesRow) Fy = dot(OnesCol, PyT) - dot(Py, OnesRow) Fz = dot(OnesCol, PzT) - dot(Pz, OnesRow) Dsq = Fx * Fx + Fy * Fy + Fx * Fz #+ Identity D = sqrt(Dsq) #mutual forces between all pairs of objects F = G * dot(M, MT) / Dsq #F = F - diag(diag(F))#set 'self attraction' to 0 Fx = (Fx / D) * F Fy = (Fy / D) * F Fz = (Fz / D) * F #net force on each body Fnet_x = add.reduce(Fx,1) Fnet_x = add.reduce(Fy,1) Fnet_x = add.reduce(Fz,1) #change in velocity: Vx += Fnet_x[:,newaxis] * dT / M Vy += Fnet_y[:,newaxis] * dT / M Vz += Fnet_z[:,newaxis] * dT / M #change in position Px += Vx * dT Py += Vy * dT Pz += Vz * dT """ ga-5-4/python/benchmarks/from_distnumpy/jacobi.py0000644000175000017500000000354612662210372020357 0ustar mbambaimport time import sys #import numpy as np import ga.gain as np from ga.gain import me def jacobi(A, B, tol=0.005, forcedIter=0): '''itteratively solving for matrix A with solution vector B tol = tolerance for dh/h init_val = array of initial values to use in the solver ''' h = np.zeros(np.shape(B), float) dmax = 1.0 n = 0 tmp0 = np.empty(np.shape(A), float) tmp1 = np.empty(np.shape(B), float) AD = np.diagonal(A) #np.timer_reset() #np.evalflush() t1 = time.time() while (forcedIter and forcedIter > n) or \ (forcedIter == 0 and dmax > tol): n += 1 np.multiply(A,h,tmp0) np.add.reduce(tmp0,1,out=tmp1) tmp2 = AD np.subtract(B, tmp1, tmp1) np.divide(tmp1, tmp2, tmp1) hnew = h + tmp1 np.subtract(hnew,h,tmp2) np.divide(tmp2,h,tmp1) np.absolute(tmp1,tmp1) dmax = np.maximum.reduce(tmp1) h = hnew print dmax #np.evalflush() t1 = time.time() - t1 print 'Iter: ', n, ' size: ', np.shape(B),' time: ', t1, print "(Dist) notes: %s"%sys.argv[4] #if A.dist(): # print "(Dist) notes: %s"%sys.argv[4] #else: # print "(Non-Dist) notes: %s"%sys.argv[4] return h def main(): d = int(sys.argv[1]) size = int(sys.argv[2]) iter = int(sys.argv[3]) #A = array([[4, -1, -1, 0], [-1, 4, 0, -1], [-1, 0, 4, -1], [0, -1, -1, 4]], float, dist=d) #B = array([1,2,0,1], float, dist=d) #A = np.zeros([size,size], dtype=float) #np.ufunc_random(A,A) A = np.random.random_sample([size,size]) #B = np.zeros([size], dtype=float) #np.ufunc_random(B,B) B = np.random.random_sample([size]) C = jacobi(A, B, 0.10, forcedIter=iter) if __name__ == '__main__': #import cProfile #cProfile.run("main()", "profile.%s.prof" % str(me())) main() ga-5-4/python/benchmarks/from_distnumpy/MonteCarlo.py0000755000175000017500000000207612662210372021173 0ustar mbambaimport time #import numpy as np import ga.gain as np from ga.gain import me import random import sys def MC_int(c, s): x = np.empty([s], dtype=np.double) y = np.empty([s], dtype=np.double) sum=0.0 #np.timer_reset() #np.evalflush() start=time.time() for i in range(c): #np.ufunc_random(x,x) #np.ufunc_random(y,y) x = np.random.random_sample([s]) y = np.random.random_sample([s]) np.square(x,x) np.square(y,y) np.add(x,y,x) z = np.less_equal(x, 1) sum += np.add.reduce(z)*4.0/s sum = sum / c #np.evalflush() stop=time.time() print 'Pi: ', sum, ' with ', s,' samples in sec: ', stop-start, print "(Dist) notes: %s"%sys.argv[3] #if dist: # print "(Dist) notes: %s"%sys.argv[4] #else: # print "(Non-Dist) notes: %s"%sys.argv[4] def main(): #D=int(sys.argv[1]) N=int(sys.argv[1]) C=int(sys.argv[2]) MC_int(C, N) if __name__ == '__main__': #import cProfile #cProfile.run("main()", "profile.%s.prof" % str(me())) main() ga-5-4/python/benchmarks/distmap/0000755000175000017500000000000012662210372015130 5ustar mbambaga-5-4/python/benchmarks/distmap/distmap.py0000644000175000017500000001012112662210372017136 0ustar mbambanp = None def set_np(module): global np np = module # generate nPt random points within the grid def generate_random_points(shape, nPt): pt = None if False: pt = [] for k in range(nPt): x = shape[0] * np.random.random_sample() y = shape[1] * np.random.random_sample() pt.append((x, y)) else: pt = np.random.random_sample((nPt,2)) pt[:,0] *= shape[0] pt[:,1] *= shape[1] return pt def dist((x, y), (x0, y0), expo): """Returns the Euclidean distance between two (2D) points.""" return ((x-x0)**expo + (y-y0)**expo)**(1.0/expo) def dist_array(shape, pt, expo): """Returns an array whose elements are the distance (in units of rows and columns) to a given point (x0, y0).""" x0 = pt[0] y0 = pt[1] f = lambda x, y: dist((x, y), (x0, y0), expo) return np.fromfunction(f, shape, dtype=np.float32) def distmap(shape, nPt, expo): pt = generate_random_points(shape, nPt) # distMin[i,j] is the distance from pixel (i,j) to the closest 'pt'. distMin = dist_array(shape, pt[0], expo) for i in range(1, nPt): distMin = np.minimum(dist_array(shape, pt[i], expo), distMin) pxlMin = 0 pxlMax = np.maximum.reduce(distMin) # scale and offset distances to lie between 0 and 1 distMinScaled = (distMin - pxlMin) / (pxlMax - pxlMin) # (gray) pixel values lie between 0 and 255 pxls = 255 * distMinScaled return pxls def main(): # python libs from getopt import getopt import sys # 3rd party libs #from PIL import Image import Image # command-line options nPt = 8 # default expo = 2 # default distance exponent (Euclidean) nGrid = 512 # image size (in each dimension) seed = 0 # default seed useGain = False help = False imgOutput = True rawOutput = False img_name = "distmap.png" raw_name = "distmap.dat" usage = """ distmap.py [options] -h help (prints this message) -g use gain instead of numpy -e expo set exponent (default: 2 (Euclidean)) -o out output filename (default: distmap.png) -r raw raw output filename (default: distmap.dat) -p points number of points (default: 8) -s seed for random number generation -w width image size e.g. Width X Width square -d whether to enable profiling """ (optsvals, args) = getopt(sys.argv[1:], 'hge:o:r:p:s:w:') for (opt, val) in optsvals: if opt == '-h': help = True elif opt == '-g': useGain = True elif opt == '-e': expo = float(val) elif opt == '-o': img_name = str(val) imgOutput = True elif opt == '-r': raw_name = str(val) rawOutput = True elif opt == '-p': nPt = int(val) elif opt == '-s': seed = int(val) elif opt == '-w': nGrid = int(val) if useGain: import ga.gain as np from ga.gain import me set_np(np) if help: if not me(): print usage sys.exit() else: import numpy as np set_np(np) if help: print usage sys.exit() shape = (nGrid,nGrid) # seed the random number generator np.random.seed(seed) # generate the distmap pxls = distmap(shape, nPt, expo) # write pxls to file if (imgOutput or rawOutput) and useGain: if me() == 0: pxls = pxls.get() else: return if imgOutput: im_r = Image.frombuffer("F", pxls.shape, pxls, "raw", "F", 0, 1) im_r = im_r.convert("L") im_r.save(img_name) if rawOutput: f = open(raw_name, "wb") f.write(buffer(pxls.astype(np.float32))) f.close() if __name__ == '__main__': profile = False if profile: import cProfile if useGain: cProfile.run("main()", "distmap.prof" + str(me())) else: cProfile.run("main()", "distmap.prof") else: main() ga-5-4/python/benchmarks/laplace.py0000644000175000017500000001756512662210372015460 0ustar mbamba#!/usr/bin/env python """ This script compares different ways of implementing an iterative procedure to solve Laplace's equation. These provide a general guideline to using Python for high-performance computing and also provide a simple means to compare the computational time taken by the different approaches. The script compares functions implemented in pure Python, Numeric, weave.blitz, weave.inline, fortran (via f2py) and Pyrex. The function main(), additionally accelerates the pure Python version using Psyco and provides some numbers on how well that works. To compare all the options you need to have Numeric, weave, f2py, Pyrex and Psyco installed. If Psyco is not installed the script will print a warning but will perform all other tests. The fortran and pyrex modules are compiled using the setup.py script that is provided with this file. You can build them like so: python setup.py build_ext --inplace Author: Prabhu Ramachandran License: BSD Last modified: Sep. 18, 2004 """ #import numpy import ga import ga.gain as numpy import sys, time class PrintZero(object): def __init__(self): self.me = ga.nodeid() self.stdout = sys.stdout def write(self, something): if not self.me: self.stdout.write(something) def flush(self): if not self.me: self.stdout.flush() sys.stdout = PrintZero() def timer(): #return time.clock() return time.time() class Grid: """A simple grid class that stores the details and solution of the computational grid.""" def __init__(self, nx=10, ny=10, xmin=0.0, xmax=1.0, ymin=0.0, ymax=1.0): self.xmin, self.xmax, self.ymin, self.ymax = xmin, xmax, ymin, ymax self.dx = float(xmax-xmin)/(nx-1) self.dy = float(ymax-ymin)/(ny-1) self.u = numpy.zeros((nx, ny), 'd') # used to compute the change in solution in some of the methods. self.old_u = self.u.copy() def setBC(self, l, r, b, t): """Sets the boundary condition given the left, right, bottom and top values (or arrays)""" self.u[0, :] = l self.u[-1, :] = r self.u[:, 0] = b self.u[:,-1] = t self.old_u = self.u.copy() def setBCFunc(self, func): """Sets the BC given a function of two variables.""" xmin, ymin = self.xmin, self.ymin xmax, ymax = self.xmax, self.ymax x = numpy.arange(xmin, xmax + self.dx*0.5, self.dx) y = numpy.arange(ymin, ymax + self.dy*0.5, self.dy) self.u[0 ,:] = func(xmin,y) self.u[-1,:] = func(xmax,y) self.u[:, 0] = func(x,ymin) self.u[:,-1] = func(x,ymax) def computeError(self): """Computes absolute error using an L2 norm for the solution. This requires that self.u and self.old_u must be appropriately setup.""" # use flat v = (self.u - self.old_u).flat return numpy.sqrt(numpy.dot(v,v)) # don't use flat #v = (self.u - self.old_u) #return (v*v).sum() class LaplaceSolver: """A simple Laplacian solver that can use different schemes to solve the problem.""" def __init__(self, grid, stepper='numeric'): self.grid = grid self.setTimeStepper(stepper) def slowTimeStep(self, dt=0.0): """Takes a time step using straight forward Python loops.""" g = self.grid nx, ny = g.u.shape dx2, dy2 = g.dx**2, g.dy**2 dnr_inv = 0.5/(dx2 + dy2) # small change here so we can see gain vs numpy slow #u = g.u u = g.u.get() err = 0.0 for i in range(1, nx-1): for j in range(1, ny-1): tmp = u[i,j] u[i,j] = ((u[i-1, j] + u[i+1, j])*dy2 + (u[i, j-1] + u[i, j+1])*dx2)*dnr_inv diff = u[i,j] - tmp err += diff*diff return numpy.sqrt(err) def numericTimeStep(self, dt=0.0): """Takes a time step using a numeric expressions.""" g = self.grid dx2, dy2 = g.dx**2, g.dy**2 dnr_inv = 0.5/(dx2 + dy2) u = g.u g.old_u = u.copy() # The actual iteration u[1:-1, 1:-1] = ((u[0:-2, 1:-1] + u[2:, 1:-1])*dy2 + (u[1:-1,0:-2] + u[1:-1, 2:])*dx2)*dnr_inv ## first op, assign directly to result #numpy.multiply(g.old_u[0:-2, 1:-1], dy2, u[1:-1, 1:-1]) ## creates a temporary array #tmp = g.old_u[2:, 1:-1]*dy2 ## accumulate temporary array into result #numpy.add(tmp, u[1:-1, 1:-1], u[1:-1, 1:-1]) ## does NOT create a temporary array since we have one already #numpy.multiply(g.old_u[1:-1,0:-2], dx2, tmp) ## accumulate temporary array into result #numpy.add(tmp, u[1:-1, 1:-1], u[1:-1, 1:-1]) ## does NOT create a temporary array since we have one already #numpy.multiply(g.old_u[1:-1, 2:], dx2, tmp) ## accumulate temporary array into result #numpy.add(tmp, u[1:-1, 1:-1], u[1:-1, 1:-1]) ## last operation, replace result #numpy.multiply(dnr_inv, u[1:-1, 1:-1], u[1:-1, 1:-1]) return g.computeError() def setTimeStepper(self, stepper='numeric'): """Sets the time step scheme to be used while solving given a string which should be one of ['slow', 'numeric'].""" if stepper == 'slow': self.timeStep = self.slowTimeStep elif stepper == 'numeric': self.timeStep = self.numericTimeStep else: self.timeStep = self.numericTimeStep def solve(self, n_iter=0, eps=1.0e-16): """Solves the equation given an error precision -- eps. If n_iter=0 the solving is stopped only on the eps condition. If n_iter is finite then solution stops in that many iterations or when the error is less than eps whichever is earlier. Returns the error if the loop breaks on the n_iter condition and returns the iterations if the loop breaks on the error condition.""" err = self.timeStep() count = 1 while err > eps: if n_iter and count >= n_iter: return err err = self.timeStep() count = count + 1 print count return count def BC(x, y): """Used to set the boundary condition for the grid of points. Change this as you feel fit.""" return (x**2 - y**2) def test(nmin=5, nmax=30, dn=5, eps=1.0e-16, n_iter=0, stepper='numeric'): iters = [] n_grd = numpy.arange(nmin, nmax, dn) times = [] for i in n_grd: g = Grid(nx=i, ny=i) g.setBCFunc(BC) s = LaplaceSolver(g, stepper) t1 = timer() iters.append(s.solve(n_iter=n_iter, eps=eps)) dt = timer() - t1 times.append(dt) print "Solution for nx = ny = %d, took %f seconds"%(i, dt) return (n_grd**2, iters, times) def time_test(nx=500, ny=500, eps=1.0e-16, n_iter=100, stepper='numeric'): g = Grid(nx, ny) g.setBCFunc(BC) s = LaplaceSolver(g, stepper) t = timer() s.solve(n_iter=n_iter, eps=eps) return timer() - t def main(n=1000, n_iter=100): print "Doing %d iterations on a %dx%d grid"%(n_iter, n, n) i = 'numeric' print i, sys.stdout.flush() print "took", time_test(n, n, stepper=i, n_iter=n_iter), "seconds" #print "slow (1 iteration)", #sys.stdout.flush() #s = time_test(n, n, stepper='slow', n_iter=1) #print "took", s, "seconds" #print "%d iterations should take about %f seconds"%(n_iter, s*n_iter) if __name__ == "__main__": if False: import cProfile me = ga.nodeid() cProfile.run("main()", "profile_%s.prof" % me) else: main() #if me == 0: # ga.print_stats() ga-5-4/python/docs/0000755000175000017500000000000012662210366012305 5ustar mbambaga-5-4/python/docs/scipy_11/0000755000175000017500000000000012662210366013735 5ustar mbambaga-5-4/python/docs/scipy_11/scipy_proc.cfg0000644000175000017500000000012512662210365016565 0ustar mbamba[default] proceedings_title = PROC. OF THE 10th PYTHON IN SCIENCE CONF. (SCIPY 2011) ga-5-4/python/docs/scipy_11/papers/0000755000175000017500000000000012662210365015226 5ustar mbambaga-5-4/python/docs/scipy_11/papers/00_vanderwalt/0000755000175000017500000000000012662210365017674 5ustar mbambaga-5-4/python/docs/scipy_11/papers/00_vanderwalt/figure1.png0000644000175000017500000004476412662210365021763 0ustar mbambaPNG  IHDR XvpsBIT|d pHYsaa?i IDATxp7AtmăR9MkR[6 B`(b"J )M9mtu,P6,N=aÏ"aL rj7R h&y%@Ϗk&3'繾uD"$I$) R I$)yX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@$I$ED$IRX@?)))) 8[?q<_=|_eΝ}R$Im"H$رc|\s5{{|3g3f V"--^x^k_ZK$I SL+`РA+|K/ĢEػw/cǎ[nk7x#%IElڴݻw/ݮꫯq߿?۷~J$I1rǏgɒ%ZaÆu}o&_җ><33CZFI$)\vXO/~G{w߸{% H^y~_&j)(('IKi&~c% yh"o1tPN:ٳghii+ 552dlȐ!}M7A _Ckɒ%]6?&vm|bfꂏݦ;É'я~ď~Ou]Ǵi/~qgffrO=?x }__/|[oR㫏 4ȟK .6͟O"X[?fXݦPUUE~>~DXjvb۶m>}:O<oM6 7߃$I.][<?…W]] y\uU| ߿9 RVV[oxGycժU\K9r^{-j߇$IzQ9~;(+sNX<wΪ@gg'rWRYYInn.EEEL:ǏuVhǖ$IR7UT1p4Z>6l{gxD$I1 χ v#N$Ibѣ~ee0wn؉[\$IRL1ci|$ $IbB{;XӦ׿l< ;z#X$I ݉kҥj, $I UM AGTVa'R_rK$ID`:Ɂ# , $I`jb(*;aذS)$IRT> 3f@SWJH$)jۃ uudd$IRCa,x~S) `I$O;`E, $I3UU0{6 0n\؉6G$I"B!##8b!H$w ˗Îv* G$Ik=y**`԰)ָ"I^Av6B}Cg$Ie9s.o|#8j^5*TU`I$56̙Ui)"8i|X@$IvXM`yffةH$I'N@~>:YKzzD$I@^tt@e%v"%*G$IX$ANtSpĮC}"IZ[ŋ`ذS)9%I3 ˃+)\$IJ2p,. $IRCa,xطNd$IR8v,(E.,_;v@ZZة$G$I΁'OBELv"鿸"I@~3ΆT|(X@$I3p!|iW{¨Qa>,I83gWce$Ic۷Ü90p cƄH0G$IPg'0vlpĮCI8 GI C++NX@$I~߇[{N$] 4iÇ+$551cư~wƍĉQH/IM$l0Bˇ+ ]hii_" >ӧOyf,X'(..蟱qFy6xྊ,IT[<?G?UWJ4.䐓sγロvdddp뭷UDI F~;(+sN$]Gzk#HHDVQlu4Z>, DhooԩSlݺKv?W\qC aƌ:tJD+Vil< ;; RZZ @y(**{>O9x V";;2_Iԅ' ?^֬K\_ jjjɓeyGΟgW_=k⮻bРA^~~>mH8PSyya'Jn7of<;uw料޽CO=ȿ3lذw AK\"xyxVr?3%{줩5TIZ[ŋ,Jljѣ{?OTVVrwQ2Io3)X ;, ]x'4h ÛoɪUHIIg ے$I1 apO],%, HxO~{ǵ^˗e6mĜ9s>~]gg'1zh6l@cc#gϞeСL0+WxD$%?e`Z=֯k ;=nB!nj$);f âEosD$) ƍ ;O$ICHpĉ %7 $IRii~/; --TR$IG< 0uj؉ $IR/ ;RS!% $IR/9s.o|#8j^5*TRlqK$46̙Ui) χ_5k`Ro5zD$/@^tt@e%v")8%IDpu7kzD$%`jb(**6,TRbrK$%Ça hj`JRqD$%ruu), $)|!|0k<a#X$);`E+ED$%*= j7.DRqK$%H$PpDص|HᰀH>.,_;v@ZZة$IJXG< 0uj؉$"I~ِ )VX@$IRB9s.o|#8j^5*T>$IJ0sf0zUZ =RH};̙ž=0fL؉$#X$)uvBI L cGZ> $I[PP~@q1, $).x}غ'D$IR\D w\(`D$ō6?,BؽF;pK$ŅG[͏2;7D.+ $)UT'[AmCgIa 6 rs癙at9$I1qχ]`X[ͥD`$I1*+aI-`Iu7kD$ń`jb(**6,Tz#X$)tG65Ayy0~%)1"IBU^!%: $I Ň’%0kLAzzة$5G$IR;`E+% $I*= j7.D,I^ 'BFFpĮCJ>IZZakHK ;08%Iԁ'OBELv"IarD$2ΆT|HH>p ,\] FJR,pK$F93*-]I"Iz0g {1a'k$IJJ`d;68b!|\$I Տ(.? $Id=n{ ;X$"`w 64X>$uD$H[̟ @a! #FJRpK$uѣG Νv"II-VmmP[kti, $a 6 rs癙a$I]:~a.X.VsI"IΫ*+aIJ`IsD"nM7GZ>$ H~_3i$ΕW^Ijj*cƌaz'xGIMM_*;wԒ$]`jb(**6,T#X]hii_" >ӧOyf,X'(..gΜa„ {[4^x^^{5E;${mj`Jz 999=, /2b޽;s-l2x>.IROã7B]HRrW_%==п طoov_F$>,Y`ط!oY@."ΩSxٺu+K.{|M/}y~С>*IRO;暰SIJt`]… )--U{ wezѳ*IRz1`TWøqa',, Q\\7MZZZزe +V?賿sɒ% 4g)IJHpmp͐v*)6m޼͛7ԩS!I>|8Ç 77o~ \!C~Gφ rsڵz뭗\s#Ayi?TR: dee(1X@z(++N, 8pS<@FFFf$=y**`԰IJVnBjѣ|o˾}>~ΦMnFTI(+lHMzˇp҅'|Ainneee,[1Bx뭷>zGycժU\K9r^{-oKDΜ  F^z :T YYY'?k_26mbΜ9N"ϮJ*++YlEEE|[r]wHLc#̜^cA~a$9+Tmjw$ms+0fL؉.{@$IJPR'ر`{$)47CAAQRŐnjbD8aV瞰IRlD8#ͼ!)Y@$ICmm0>,X{7v*I8G$I3G9\28wn؉$\$)TT'[AmCRHa 6 rs癙asKw8î]f ,]DVSyy0~|؉$8%IR D`:Ɂn ص|HJIbLkk0rx1AU v*I`ICmj`J+ $ňruuI"IR>,Y`طN%I},IBtXP$X@$I:`jb(**6,T$mj`J;\$/m|HRoH|!,Yf)oJ#XwXP$)VY@$Iq χ v#N%I#Xuhp#%s熝Ht1HREEpU[Z>$)^X@$IqVi_6gfJ]`I㐟v5tKRHBM AGTVa'$] G$I1-u 'F ص|HRHbVkk0rx1Ν0lXة$I,IRL:|88b ˃+IRsDs@f IDATۂ uuIJ$IRCXf͂)S=N%IM`Ib±cA 6/Z, UU0`TWøqa'$G$ID`j822#v-, P׎v*IR_tW9+뮻ɓ'gϞwƍĉQH/I3&ڲ};$)҅sIp7crssپ};36nH'oY>*>?[F$!s$%%F9롰#v%)YZZZؿ?7|s^sW0df̘C8$Ş[w`x1ˇ$%3 H<|_ugyٴi555^7dggs(puvBI L cB}=deJ~H$vxrJ}Y^xx3ꫯ5 deeq]w1hРs~/??K.I GI CyI37of<;uw料޽= PRR³>s=wIn 777x㢯]vAK[=Z[S&M ;$]}ƺt~u%%%-_<7KJTw [>$Ifgyr?QYYɸqz)$Ŏ6?,NڽF;$)9Յ|{Tvv6[o1|pxrrr[g>ÛoɪUHIIg"I}Q1 .;7DXf/KǶmضm9ׯ_?:::줳?zh6l@cc#gϞeСL0+W2z~ԗ**`$Ic$r <8̛vw/v*IR2qKDc#̜ PX賀HRض ~쁬I#X:;Ǝ {X>$IarDTs3A ).?v$"I .qt0~5iR؉$I Y$%HJK;a`!I%IJmm0>,Xp{7v*I$%G[͏ .;7D$+ **ڠ!ImISbL&v*I.,ICǏC~>kҥj.II355PY LJHsKD$AN IRHRhm F/"ع ;$I=$ŸÇ#v<$)^"I1n-`^Wg$? $Šga5 L HO;$I,I1ǎC}E$I"I!kiakHK ;$I},I с'O–-sI+ 2ΆT|HDxq7/8fw^5*T$E#XE0s&<CaGJDd6xaZسN$IR9%I}JJ``C\> }{PB!ŏ~$II"I}.qt0~5iR؉$I IR/D F,$, ԋ`|X 8jn1"T$G$=j~Hpܹa'$)"I"8٪ jk-$u"IVi`ؿ23N%IRrK.㐟v5tKt1I55PY LJH$@$AN Iz"I\-^ EEs' v*I#X G65Ayy0~%IzIr`y]Ca.= KY0eJpGzzة$Io`Iy;=-]IzD> fφƍ ;$I,IO^ 'BFFpĮCe$O˃; --T$%G$%#vO-[ $o")Av6B}CfΜycvQN%IRsKRil3AX =bWhHJ*۶õž=v"I#XBg'}ر~ˇ$I }{PB!ŏ_$I DRB {>_Mv"IvW9+뮻ɓ'gϞnĉ<#\կ~;wqjID F,$҅?|;kKUU{&L@UU֭c˖- :{w(}RjkaݻaĈSI$pK/iii<4iG#77:t{2vXƏ-²ex74̎ n5?r$dpܰI H>Y>*>?}WIOO|ߟoy%AEEpU[Z>$IEhiia||ݛoɗO=СC}OJVbL&&Ib#X=OP\\|׽ ٩SBJ8, PRR³>s=O P^0`@ة$IROX@{|}G}o<6okC=đ#GXzuߎۂ uuI҅_׏m۶m۶s~_~tttIgg'H߿+dٲeWn]wCwg²egp5a$I҅nnÆ lذSظqc/˱cCo[yĮ$I")&UU+@u5v"I")D"z5L`$)X@$Ō>/v쀴SIp̘'O–-0eJ؉$IR_pDRʂSS!IR"H ͙30o̚{¨Qa$I},Ihl3nBؕ$)X@$EݶmpgdeH$E#XJJ``C hnؾ=(!ŐG $% >WW8}:4)D$),~(D"PZ w C#WIDRhkaݻaĈSI9%=j~Hpܹa'$II"8٪ jk-$\IVi`ؿ23N%Ib#X.㐟v5tKH,55PY LJH$2G$]H֭9,$, z5Z`N6,T$)8%Gmj`J$\mpm:ˇ$I9 :{,Y`ʔ~SIx :v z 6/Z$Y@$u fφƍ ;$Iw`IHV!##8b!IzD9ZZ`tX<ڱN%I#X>v@pɓeK\$7" 2ΆT|Haܙ30o^p޽0jTة$IRrKJb0s&<CaGJeԶmpgdeH$%G$ %%p}0vl!I)47CAlbHcIE)I=NƯ&M ;$IJF~)%HJK;a`!IbX[̟ '\ #FJ$%3Guhp#%s熝H$)!UT'[AmC$ @a 6 &L!33T$I,)A?P] ?!$)>Y@WUgÀƅH$9%ŨHV!##8b!IDA--0}:,_|iia$I|`I1ݓ'a2%D$I)Av6\s [>$IRⱀH1xq7/p^SFJ$9%f΄az(,]I, Rmk={ ++D$I},)PR|H ePP۷%R(@$% Euu~ӧIN$I]~*EA$p0thpC$%# `|X 8jnưSI$,=j~Hpܹa'$I + RNjkZˇ$IX@^+Vi0aa$I `Iqχjᩧ\$/Y@^RSyyv"It"X.(#GGZ>$Ir,[I&qדBIII޻qFRRRuĉ>Nhim F/o} vaN%Iwy/ӧӟ~=߸q#<٩SBJ8, Qt 7oq׭]֍1̓<4v*I-% Hzzݓ'a2%D$IMQ?Jƹ Avv!Iԛ\[ri}:+'\]}RVV[ox[n3 o&V"%%gy&G];s&O??8N%IX, OS?N~7Hgg'1zh6l@cc#gϞeСL0+W2z谾uf΄az(,'$Iz"?\56l`Æ <[vm_ER/۶ ~I$(iuvBI w_磾!I\QRjnؾ=(!Őb$Is%`դIa'$IJ~櫤@i)y'  Ih()G.Xp{7xcة$I#XJxG9\28wn؉$I+ JhVmmP[k$I D Vi`ؿ23N%I$Gp|z[%IbD *+!''D$IK`)!D"n]P8F ص|H$ ^kk0rx1|[s' v*I$#XkG65Ayy0~%I Vy9v[!I, ;g’%0kLv*I$u#X+ǎC}+IO, UU0{6 1n\؉$IS`)E"z5LIdQLkidU]#$y[[@9t TlaYNK*UͲI&c)m& 4LE :lY? Y|7&^]8\\<۵|}]{y>LicvUh)`!hY=wN˓ƌq"W@rrTkW* *55ҿ-Mlpwt]nW,''˥,it j  ۶I<#rgvE[઺:O랏R@( \SQ!M$mnE$/ @=.^_ed]7QHWK>(a՜q@KS3'\-Ź],8;fdgݮn ledK .\:T:xPJLt*-Xř3ĉRQ/Vs@`{qkפ|ݮ-Xh3H+WZo_mr5w4gTP vU6lB9b=bIi&kU6m n0?p hWy vUvlB<>@=G 04KaSM7Y<О 1Fz]i0)!z.EߪƎ,>;vH11nW-XzsR^4f= n('GJMvJK h=SS#4yu޽]w]B[ȉғOJRV4}:@!OK"#%']B [:F(-%|\**I>h%&A~ji6)#ij ~= t0.ISJ3gZOڽ[s*tl@~zcK}pزE8к? ZiBǥGn}H***'v͚5:|ۧIҐ!Ct}i*.._z+M*Z%ED+ 04͛7+>>!|HRXX&M>}ӧ֮5k :tHIIIOLL$>|Ο/,TVV{?VQQ+WH#5/ ~IDATՉpႾ!A/zMp?ȑ#˗/\IE "Ǐ$#.&%'']?/zO]FDATT*++;^,**u#FкuԧOEp@йr劎?#F]JEAbbʮ;^^^.IJHHhrmݦgy:iiinЮq 233uQ4պu딚={XuV]xQ$U_|$iъӕ~I{$M6MVҸq|rEGG룏>ұcǴk.׾61k,?^ӧOQnnƏ &ܹs:5zWHxx󕞞_|QFW_}%c̙7={VSLQttt颴4];j͛7OЀOvv^og:Pyh󕑑hy^|3;jM{ܹS'NT߾}H5J{ h=c􆹱? [ҥ37G ڵk~'IZvm׋Qvvխ[7ZJ;wԠA4qDmذ]SSCP+WT^^z衑#Gȶь;V999ZdmpeggѧG0yΟ?,]zU$O/avךcv쑕]vڥ]|Y*,,ٱWkzSGUU^XB~K%%%i̙ZtߵM 믿6|獎gddXsڵ]jx_@3;jn{9scW\1wq6lߵ̎Z={s2\͛խ[77SԩSڿߵJIIi8I&DO5gim̎Z?cuYs~Wk{7gEFF9M@lt!O^o?DIM&%%]w<LkSoԩOЗ ̎stAy̎M=^… ZfnݪW^yex ***tw_w~fEE VVV63LkzK֭˵|rj޽ 8oٺ|-Z|=裊כo͛7Xg-^Xׯׇ~]9anh"͘1CUUU… uE-YBFQQQM&ʆomy]?MٳU\\&eٱҥKl2͚5ogv4i{{nx[zz^y͘1Czjr s2b$9rDuuuKn611Qeeed-ӚǑm1;v|>_gavђ'99Yuuu:y anZbLUWW7=^vvbcc=1GUIIIñZ[NٳmuwOSN:| <-D31;Ӷ~m|>Zxq7ManWTT&ܴk 222LMVV)((0?xc^oqOKkȐ!׏m8q^kzk͚5&--DFF0ig}׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|TE$J{ "(U"JQ+PPf>"] "4QAH7 B wv%! ʼٝ6@0 aFZZZZZZwtGδ6t#%;u܊~gqҧ7o{wO&V+T=)Rwƌjcܴi=ƭ\r8xʟ??ծ]xd;n8ʗ/;s̡-[?N=hȑThQ]F!!!J?=J@z?mիWٳg|.̞=Zn-B@@Ȟ=;5lPoѥKx]o֬Yd8%\5k?~ נ [<իWuu&!!XbTZ5[uWN:ETR%t rE{Kks}زe *dE]x'EFFJ(͛Kq>K\x1\|֬YC*[R*Udd{իWŅn-\xvرcTjU' ݺuy4 + oN_NDуrK17hsTB t "cv''MD_5,XVx{nQW@Y_xCpKx SAgΜ;p@Qi,qke˖@x`޽tT'/jܸey}mƍʕ+#H GEЉl߾]H#Fv4iwynˁ*Dyrqfo[NHO!Y9E\~M al߾=͟?֭kc<| 3g/\ȢfZXә2e c=闗Vׯߠ;STT4_ׯS007\R V45fC_p>jy@\菬@gŊ~]]^qUq):6_ ~ "|o߉KteѣpCs>Tܰe }@ o'm&ڽcR.]XFs۶miɒ%ޚ"|}{=-[6;TQwI=ŃtI|/_N7vUVA?zh背,*ʻ=ߡXjaa҆%5{TMo8i{Vb6Ю |Tza?~JۦCR|4ͲoQx,c T ~p4uA +fFGZ^}sjS!վ]3|7QJ;u#li߾}b%W\FiO?A>և}@yև{ҷ,;SlgEjmm;MGC=c*̄LrR}@:vh3%AM9?ޭ+ 1cm XTdIg2k˜j )hDž><4ufk:vh/& fs-[YWa@~uLW^Y̒u<ޥs'zNԢ勎f0ڵmͫUぃ lΜhϞN<"ФWI ?vFt&VFj;+ OT6.F]vUb,VBGbM2F#5v! ^{K Pppς<$IK:l;f4-u?Q\0 daT dRsr03@0k%h}l؍@ӧOYf҈ 5kS>k\9@_,hkx3$t)dm9t;ׇb)G:;@]a+[@ws1`x 駟p@4@O?lPUhԙ `s#S0^@*ݧl-^ u鬃@o(@AXT Թ>8@]/@`)S>xT:0`@}̳)kꃳRmGNPhP:t42<1.\8/ v+@*TT6]NjZ(@ٸ!D5²b$`2E/]yV ¹Q #tԦ%:shĖBߑe1,MkjYX>^*ںuEr%?cOΟ{qBC*p7 %.gOЬ98 F_'HL#/^(#?wa!'ϑ#mx>TSܙlܸn\'9r Pvh*_~F2eDY&2zO?-9m(ӧO^Z|V<0r/>7N_4TDU+c? J{r ÝőYL]{bo$R)0xItcg8lNuo??r0EEFѽ"x 27~d}>Er]n-۴mOccĈT^=G02E=xnv{-F,coe9{+=KsX^,LmLϕPJ'ʛ7/}ᅨ$ Ys岟i_H3 ʉe%_,).q>f<4vuR.<ԡ+9ܹs9#EU.FUxޤ$3mIT<:fgtTNA<[dێ\< ^x\hܦlRԱcGG0DYȇxnuq8A+WȮ/\#uTT)>{XlF@%x%`}g.{x`.\XH^>`uATϰr˖.%JPYBgV)+Xn/CΛCpACbb\lzm[ͯ>Cz.Ag+RII-+w/&Tˊ^pfN o JJ^l@ ٻGP(Y %G(oƎ H1_}U1ݟ#|yԔܒ1Ha=*:F6m/s]ldf7o뻘>_„*@ HR\o cwSHݴ]Jxo-p|YތYO<%~èw=/Iv5r7>P0`YQJ,mxcиq3 4P% (^0>xы6СԠAC%^fҥ2b5xPRdb yMTI(etJ#V'Rذ*ן}^Y9tʺw%*,̙ӕpA3J>s aA'+Fأ ^g͚mG?q,BlmҮ;paL`V@.wV i:K?\5']6|u|v?`=QA;;+.I`@EFY4m) H`w,_Txſ("ロEun{{R= {yBa˖J,N3V`g*0Rʠ'V4RlÚ6o[VAQHߒK|딵RIe:#(-}%۷4ZZZZZZ6R!<+r?t 9r4*GjIK-kY>pi6M~4=gaɼK?Nc"Eej9yիIǡ-qS:SC8{=ޏ!ĿKxPxu\sc8>wjAN @& 2"\`"q#&#'eh@ ѱsDOO nCPN:IsMM}kQ>(>FOVFh'}(BaU:"os_S󣩛(O-Z؇p<՗d8,ڈCujuB!Y^шIO7sRԺM[0a\OZ%}SR\$O'O kz 'm_} DsL%Ç+룱BL;{cVxGX%5= Qe&KU5Ev_Eנ$*ϟ?a3RJ}j{iY>^%I2ʕ+D8v;ДS0 z؟(2 Z]8u& SUq$f xET*(9sW=H@o"-? 81K94oѱ t+e<5@7ǽ1FE'N%QۑXCu4T!b0#Ӻf/~K#h7{@1)<v;SuǷ^3? `0o;DGP VDB7Ӻt)ƌȗHߟH7Çhiop _3@}_t& $PRtSPfm6b?)IN+\qr  N!BCrpkxgEy:\!7pܹ"V]PJW4Afa'.:>vO?݈ 554*:3xe!W 큁 xE@[&M}̄}h\7dOKI8p/D'U (oE1!*> uފevp."Y}<^cbѨQI}%"uz:g/H%\eF=g2t41b4%C lƤILU_Au,CvtaWsx$\[@Q) '[`$?F#޲E36WmZL~fai/I5f%{ד&MV _!C)ɝC9lת>HyFR1a89j U|Ic3wtD(HW }ں0&SGf+@b,s@0RT1b?Xs~Ѯ]`ka3PNJ-vs20ܻw{&Oj-ӗ_}6c܆/-XB~'a3 Bcك&6Y( 䠰X>Ki&Zϻx0"⪃'TiXv_Yv;.yIk>]!=p1hT%Q!DO}MVq|R꩚Z˨Nm,/,*%%%%%%$T:/ZZZZZZFR#/ѐ$Z:ZZZޓq2{}G e#ȓ=.8hOPq`{7+v}%Zx03گzAlb)멢cUd%6,3r8OO~q$Gh.+t'߻:[wqz;;ũ?3-\'cOd 0FWhѢca +3sOգʸ!{1uoSq،ݸx1S;Z>>95Nff>\|I)˫O Olxr:,Mnc/DYCC3N 3cQY]K ׳"GSÌs6_]F6unkOOq@9\Tj.:ō:Gߓ(64a_id6_|F3Ϥ%5$38ΩnݺIclO")l:#h$?DQT1=M 3vhϦMSOx5@F67H鸺ؖ4|4W',>1D \H-+Q\P2t <<w򙋎;t)O+W^tPS:2Ю3~p 沌}#.]:pDB c ' !_-|FWJAkB%x5v<9DjSՏ*JR~$$&6['Xr+6Fuxa!D@0{ԍ` ̃R/L#+2H o Ͼq7:Q1<҄q#kr IDATyM޷a.w΃U8H'(&ѐD$J (kTPBz ڣ{eJN;J} *i;xUle_޾:՗`hS%}"QcG.K3gNJ[Y_q/ m A|D?>\M\Ӳ J5Lhnu3 2U7W ~BB#7/u2lիJV e6xЇxs-<\mמ+D=vD `}M:bW?_d6ѣ4[L1:>p7n@ӧOH~lr) o *c^evlNqŕ+k1:{,[U{ʎeF'P&D"Mɏ’{  '*H ^eS0R9CQ5kҒ6ZP4xp \';o+26of~˖-m6%^z/Q졿e,'tG!Os]C2] :^wfz,Ea11Lc}j{qTE :~O=#-7's1e|a`*J +@J#@k*(u㕇ΏHSR][7FTWtaT"w KЃU)a3A5l.^4IU (K+V a3`Aŕftz#}GBv4Ӱ'Ow|Z:4ּ6TR“W])dD6#$:l]wEx9G%Ffhl~\ynO[}gͰ3T"Fpa3{͘)76oNW'Oܺ>!3eCWa35A;(S4|OV Q}x"-{=l9&0ǝD،'*T 0O>ӜStZm۴{6N*W̺UV9lFo:FIf >`c>C6;4a3q@@،?.4ct}TZ*mp&%O6e(ǙA,p gekŭvr~+ytcoyH-"_Q=WxUw|1$( h#*nY------C2$( h#(4JH5h h h h n68i',_mحÑ@޿˜ݤgds,Ø"5'p(… '!iR@;#|EDP&z1v[pet@ 7gpdg Lɪ`#Y7+G ,_~ahlimOEy@;鱇гϦY^Qap#O=F3؇ TV-]y%}&^xJ7;B[# ~ * ٳfҀ|W@~;N·IЗof肀4ɓ'+'I1}0j֬Hӆ?ʕ+o@iRhBKSA%m>t=o]{$m82O … ddw:z;q;^'`9oͼp3S@%AeғmL8 I| ~:th/e'aN3RBbhJe EPZSf 1#.Uv#o@{S.2ǥULd<<zFڞ#lyr aEyo G~E@7 " 7 'e'O- _hѢE"(i:K9ߖ* 3f( x#mI{DO̝Uhf@ p.2~Z?R }}T@KEXɟ?TXgΜ˗e ӆ31|-[s*1i)z}qrhR7)Dƾ"28{pk ~4}@2Pl!*F]JW9 mC rh"_tޒUf><)gح[7/,:tHRWCTxE.x߅l3~>}e<d\rEt2sЉ1T1S^2eʨ++4[*U|C,V i:y$=öX<}-|bfp4VA l \l0ahh+ez\ߧ7A #,`2D<=GU1 T PUueUpa)].tXJGٵk}*dE(KӡcUOd6Zܐ66[@o؀|2o,UOx_dIe~aՓž ; #0@TǎYO `S5d ZZZZZZZEs%:ZZZZZZZnxÆ #GJP0e4yL߿_L/Hl: K^^߶m[o1٫W/駟K38B޼yX\a344Ti?ў={'WXP#CqF5bc5A|s+%Z޹s'azFr)~1=ڸqcg;@}Bv{zꖨk׮_|Q,teO9|X8uЖ̄^` 6x'*THZo \Ȗf,̙3Zha3G裴p"Uؾ|A,.YDVbCoTܠ7wTd }@#XJ=sݒLF@hѢҺ%k|yd`љ~?P!>V䤉/⍜vyzzvAԮ]J)K} #'1?pU\ڵ`_|0~/U4c6DT`{1\E}խ[v8h@/Sw(7;Uv`xԩSMv4x j޼լU }ҽCWe ~[~tRjժVWs)EF ݩ|G}H4jtEcIbiӦѻ+tWtԴiSi1ܘ&{厲BuA"ɡC]h4\Xlدɧqcqe0rzk7c9{7iRJۃ3~4_W%>wf%*NA^0:{=cNEIY`G}@oӃpW,g W ;N-{lgf:6r+r'OO?eQQsDvo6} /znFxۣ]|2xn{'{=zKD;c CW[_Hhz|Jݠ ^1hT+A-[vRY0:uzE4HȜl44~D `#a#4\~zf(gWGU6@I;._nj'׬YM#_{#M zBίR\cճԤsjRw~2h׶ [/2׋BfΠ-Z N0䆣^I晲o0ֹ { fڴ~6ٸ[v:w+\I7=-o:߻ǖ_V|J>X/nC0}rĊ}V3 Æ~C?hĈQ<,g}٧ԣǻSOӧ7 % Fa >B7!͸ THWa ??w Cɮsj__K 4GisY3g4lH.cޭ-^է T>۴֭[m0R) ~!W-gG}Vh{pS'f2 vmI9v=Ơ믇ҽ(ݻc7ߖۑ  4`%AݺmVw5p`1¶̒ݻG4bYyn$V/f+|zpVtwZ UFȧt])QF kGӁ1zW-b ﹦M驧__DX1vz#AB24i"u Q;s(wݺuŌ?bǩk׷,;vhOTY^u <~.-]:q%,iӆ>sшqD4vK_3W_>ݦM;v0T&Lcڥ]Xq;ܝ< ׯuųv`?vdof/,/Y~3NvF󐯿={C%Kݵk<(_|%:[;sxċo/:=;﹎Ϝ1kXý|ݽ82a9uϛyVFe6KN>hK%LYɟ~Z`Zn` !Di+jFTP`V 2OgS駟҈#i8aŎM;|m :Yc_8*+:`TFc}lj/9.@Xm^ڙUG:*(3^9 yO>ƍtg0d":3f#2JQ\P(t:(ʿ}>?4J 3YNg0$! wy@1ɨSП9sfӛux-onvMM#]@ƫ'BE^nݖg'NύpQ'a_'r/o&+OxEEnۮW_~Nkj{9\30>"\,c ~/7nŒ> iY&ꎬ>|)ߠe޼< U#bJ>f^>sDŽ5mY6_OxQ2趼3A?{q<ԥK%}0x#Fݲ|UY^ "XedCð *-qcOeX ,WxՋMj2ʮ[qVRz*m X3`zIcqOL?e`wiFŜ]-[4ϳwy;l?hÃpr [6m0͈ܰWhty1BUڷoKs}3n6;$: 긱ג\_@v^ =7 jL(lNY'>DFF͹71y \"#H-"  aq-J.^@fPv\tIiB[)-]EMۄ3hjqn o/ !s!: {j&h'p#uQr6mdD4 Xbsߣ; #[XL` }6[ʞ#9S%Nz9#QnsgЛ {R< Rl9 jTқ|zJ˟E{8ŕ7QˮK,M>%s(t^sߋ`ّh䕓2rʨ0xhŸ, }H (92# y(;@ϝCŊQ=FFF f/cY+OG2߿2WFݿZ%t?" 8 l֬YdǺlR؛7kE8_ǙJ-[&p4\뮊". F=f?wAQS+W`Rkb& ~(n?,i^q+|!l `ZM281' ӑ2^ %~).8ZfQKy$-O .NR#d/WZqְpYP^hZjMժWa3xMg.k`]E+~hd%J`\{匸wy&q3ĽJ8Qo21>;_L0Sv \N?Fο{\gUxEvyev3Is\0~~"\~gÆJboӧ&gRnĉtDZe`o*yk}gY4$8+7(PyY?!m*UICnosҴ}Ƕl `5;:zP A| |g߾}|UxžSQлw/a\ҋ D?*bӉ'} 91'ʰt_Yc$ŧq'|u>epqBp4?Rv|RgC`1fAUR IDATP9,20a\A-9R}]<$VXQFVrt`a(Ao GWo0iL]XXInŌNIqa.H026yNIvN̸:59=p`?8oʤdɒ>;f08V ;F 2f 1Tx0DVm;P͚5Yg0PJ* ^ƒ2FԨBٚ6ߊ\<{M=,^v\,fLFp…巇$ ~wQ qP_RS֭<biGm@TլJ5&‘Y\Q_/m?ΟW6)<2mР! ("v4T"Q `ɓW)v,*GDDU.vΏ;Z*m/2[tد;lR1 /Tỵ;g bCwk*0 W\y%^;l͚l뵊| Zlڍ0{*PF˕+fWk'4رѸna"bŊ+a yJ&6 W!a{쑱)ޫKA*`bZIu91=R0tjeyOj0Uk> >]RvggϞb ]sL .bZZ5a Ǖ*#vZnUp& /ed܍6P@%Ƒpρ/2yRDK@K@K@K@K@K h#aiT------#me9@1H*x*`;Mkbn8t,אmZHW]WI8uV#vy«8D{ǎ"s#TgK>Mr9&~㴫G5.׭u.+vMmZ gH}X%gj޽gta3JUd/ǧh4Î2* a6Y`AX-(-+i4={GߧzgnV:v(B$OxIhDFcrȈ`o" nʨLo|CݩϧWLii\駷.5kNSդOD,C;6mz˴C/,Y訑#)02<\Ѩ[) 8bi#_~Ȟxf4@$A,Y|> # 5*G=o>r>v0^z{'REY\"dD@$ɒ%Ġ@V.Yt`}#+\b{OF1xr~$#eF W_{%qx-C|8TɜT2qrg dgEp,,];={v<3Y :pKgX߇/F{1h-bfAf^uFWAѢ(8{jn{n ai+{ߕ K]ް ӦN%[.p, ow;#rj 7p;HN,~;Eɓ NwcH )<>Fv:uiΜK(_ XZr>"m ;F泇X/iS,X@ ^[+:GjM\¨Uٽ{7:%^K*&iɭ[^@y)fzG _tSV`'ЇBBX^Ej#мysS|"vrQcZhgO20}~CMw@9!\TxEߌ/eG2Xl@yDؾH6̩ E]W÷\@)wz`}BBbK*AU8  ;44qnN"]D;ͷXђx q6Tx\r++LPP>}xVHaʙ3LW,s-ZL ^=<ߧ/ ) Te\ap#Qn<`DPV:b@v T]ive +0Hs=] =MwW +HEJБ00 p*,Y=?liWc"WDW^Y)`C@P?٨&2"x)hѢJ0X1hm#@%mc?BOĬ (0 )~b3gN+BUx-kgˎ*A9,Q /\x}T5@[BըE- 7V;1,͸VXAXXN*UR،= )Ēl Ɔ U"'AuxJ،Cnzk7YD~}HUft~UD)lF~}r*ԢEK)1i)^Z!~o*ҹW tbB O`+NV .yJa3R@%lJBIDV;ԩR،_`( 9Eq\tZ ?CV}ktv bk;+x."j،M7%-ޡ|R<f;_P 1Ja3ʖ->f hfLo޴:v|E)lu$6(E"+ QX;LBNi@ZZZP;2TnFm66̤i h h h h h dz h#(Πd&LK@K@K@K@K@K KtcMx{<7fz)y!wW/ϔD"o\&aI8~TϦyi?$yi歒w*}ʀ&a$pj+w'J+y^~O%C P7m&#h׭[+Bg5lmJO"x|WEb(<)Ÿha@V*xMn}R ]6Ov_%Uܾ,Xg3{.;SCňs>7R>}l磏>d/E $;zlBjxbBE2gq1ǽbŊrxh2ȟ?Q5&*͚5^z%[C z)!NULY[\_2^իWw1(1PG )QJPx WE2NC_}GUj$k}VΰXp˕+9q*Y #a2r#CqV7m\h`SF(N7(g|lpz` 9sBD  + ;앂~L膇yZ3XhRfnE6 b `Vw]Z~a'ez70W K Q>|8)'^rnɒ%>  0֭N|0@Ĩу|!@.m9;> F1׊ njӦ ; +ql`_ _FDte y摝TWD3}ۥxLyi\a~FƠ׎z޼4q_.}xp{]Hq$<ґ O:7m&rZ(TtpPEGMd/_#M}%$p|tiR֢Sn lejQ+&% "EmM R*c YR5y?|o2Vޛ5pzp%\K; - lR>dlelZ' iZ@ /y\J}05deI eb(5o"Itm fz7]8%]K;H@FΛ@7y^1YxDHۛihZZv5ALL |@LJ+lC "CH o{v0/:syR~ )xj -4.F }aHe@E>,HM(K|>u%wD_"~! 4弯N>r{vG_$ij ܒbt|+|-߈ g}=.g<FKa)֑!wK#/K|A f8q/Sw.<0#\ܩdnҙ_ޣI'@zHOI#exN] ǽ/.lOYrp>7%™-t@" ,AѮ{ K#Hy ;ݸxq/CpwzBsSxw | >t~ BOבPэzP@h^ǽ/.)ÏOg }%Uްo@ǺS@dx_[#L 4ځ wǦWR:UUZAG7Lk?H@H :(Yf`X![%3FY%on pN!Tw\G8 -4w<1e^͑\u I)m5]H$;;iƇNHK%so:mJdxx/b2qt4vr[䥙™ s%k \;Nn쒝 j6C,A (kD?𪄍xBudBC{Gr OGbN[T1≝ fcHpFGs9|*3Ay˱!4/wOؕNЉI@ZHK9M's~?\Sf _9MGקkw9^cԑʋ^=^"\_h xK 8R'.;K .[йn MzK4~`"nUmڍƍ!z9te.ЫT.&r:5銥SXѿZ%.dr=ؖgEq+8wytllHKv#| W|R@HNNWiəmwt|Z(c)q(~؋<3D}clonĺp8븈 {\ޜ`C#yB߿z(;oD,Jy~bC~qGy0C,'\NzMSW7.+7 ~NO舳gP2NYPTWF`\Ա$}`_C!:IIgvOFl¾ Bb\3p!KB떍 #,]VеS(f82;$r6 H!E7r;>_@vx܏g 2|!yoS )Vk,rpH1T1bmx/E(.93ҥs<&l^fd}(Srpn!ǩ6gw;eZKWXr YBr@n&Lm.l=jM%Lzoӑ#GD6l@VZUܗ+WL:3;ʞaRb~ 9/4¼e-0*k)|oQ3aW.I҇ ]^?P7{n XuqOևf h#HMNJXgvЩy|L[贜7?x|q:4]I}'^RLO_KFI{I,YB6h@ *Uy[@uֳlqS2`.E+rIq 4.m#svaЗg7clg/_w\l9CznY:'|\9*k ]幾\\f_q&YsYq8Z$Y8_sRAL_JaIA IDATcOKG4r ݃ I@A+7.ckqc?tFTs+~{`„&@<{믿L ̒֬YSp|/*G1,rqwؘ5€X| 7"FPehA!QTc}pqyBvw.CTJ^!v<@VI&&MT{xlM$yo:HF=8V #h빔;hȌ=| R1}:~u}K=胔͝y( pٯLoj( .TER1HU|z'~6 AyWA^39agnDH^#),ٯ!M$=Ӑ{XO}ϯ fxӟ;@f@ow*]k(C4;$N,dɑt#}* h#(Uׁxap8q >CBK SK{2S[@PّL-#;G! >%D>vݣ6/S7~^+y '=iy4ҍqk#/v,p\,HhZ]+<~rdYp8}}U h#ȫ4'lgK_2P̟ Z>eV+z k@:H 7|0ZK}K@A겺eLLgL!N A-gZZZүxF7 ]{H#d2I:CI|\Lx_LM)y֒)@2DhG8D3iuL%B8>i o<pq8 3;Z])~dWV"էJ: )AyJeH>5SZi!@!-p$S(D׎BK@8$U-!@t6CAi#gpvGjA);^ -;@~n:u(tEK h}O_>+qDɎB)`%W}%pIbmt8HU2! }qI 1.wd;6|#WMUK@K@K@K@K@K K@/ei h h h h h FY|C֜)k֬/ݞ8q)$$Mk׮H")_<ٿ?+M߷o/_%=8ʒE?~pPНQ|Æ TX1%)ڵn%\OΝ;GS'Odq*Q1Uf\Bٳ'ݳWR``3TLSڝ(ŋ\vMwݕsKox6O޽{B J,:tJR;] =p-ЎyONȑÎ-Sn|lԩC7nH~hq( &YFQhhR%xȓ'AAAlekǗ.]%ׯ_Xʖ-.\ B;.P h+#d ""i/'3L+ te*226mJϗݛfΜ),cPWFU``@"i):t;@uu(3+W.iA c 0tMxRg2!v@;!+f/,X ܓ G"YYL?wܶeیACC19suݎiN9nJ ?Agwz7o^;T%h` 7M @jբwMիWбcǨKNԣOо-U~n{>LOVQ#G9s_h4adC]s|]6Tn=֭-.*`ǎ@4tpA}W_П+WJGsΡ)'Ѩcx$kooذG~=v,}w/Q^iN/?׭Y.?0ƏuIQ,t!= "(`Q"JJ 3Oɨ$=Nrwcoovv?ݙښ꯫kzz1rU^#(m۶vytkG֚~Qᥠz1~Y*[,H:x@T,̘>\~A?XYd1 6}0z U &Jv5^5,&;kբ7|+,Nvxƍk+/l(OZF ^uߪ@8>-Zt7d_}t͵;N:q7Hd:$i<,YFz_ۇ-]|uΜل>1m ^ da!繵`F#@xᇩkר`**Uoګ|SƍÿJAodɒAH!tJ ^h^Ĩu6A9HIy>Wth I__TԢEKqea3GNhA9%PVyu+Gh2'4yv4 /m9PMP"E= &L<oj g{ ܽ"V?@N9<z];m਽p 8+N4i^JgyE͗(8i8?a8ӧ6J(p!*W1@mڼ"yvαXb:[P+vB~.$,17kl7WvN:t,٫v wQw^-x^a_?+#n;+h. OySn-i>ѻwT/+W…?P/͝;F  V_*`<5kС`6089c W^D<|忩{"6mƫԣ`P`fAv޻裍-SxGl c{紁-& 6p_k G٧w_oHv~8~+k3{/o>zGUfLN'OW:r[k#PٲwтQ֐h֬+HwC}6jl֭aмsTªhC? nՍCz \0΍9Ԧu[ >QmܸA{.X_ ̄>}Qݻ>#hQ~#S&J{V* V7i{YԹ/_ym!,_^ׇ߯A p h̘1H}ۙNS6lXOGywܩ$n>nTl,W%v6WDMԋ~Iِ<$1 w~np|Rl^&,fr&Tnj#j7}ڵ3Qo<;O|%~UAX< P\.AҶbr3b2Yj7)cX?G췑Xʏ)J.Cݢ+ aλkLοjժmP^UܮUTM$./dxwUǿ~TzT8t,6->70WRUD?/^HY)\oVh1TՉUJɟ/8}׿ٽ[L9Xkhl3&LLƝK< <<ԠACuٌ?ԯw2?p]kּ9qU@8d~'V&P0`A@~_Z|;qgQM{23z;Wn3Pŋ~Vx߃|r !pᄗ߱lf'ŋ)}N<9' 7oexwڵTn=5g?@<*^zy%ݢe+©S'FXwӦ}B}U1bƭq`PҵD?w2 *wL2qQQ=?Ue`Tj"YU˧y#T6.^lOZ=C]׷7ծsKʜF;Z?aѼjo38^y%jҴiwA>ue/h-"O|C$xE,G/؁*<=4lHx|+3gΠYOX$'~ЙjHY a2ƞ4[T駚^7hxǐXC+v]BϷ~CW=xïg(,tlIn=X>GWIsXW>֊lqcEnƏ(Yև_ *!2%6k"[w6c-ΖDJM+.#,3ݶ-0Blz_HFٞ-cX,ESl)VE"`X, Be]E"`x <*X, [, Z$ޜrFvH템ILdMlY* 6["`?"xV Up+HCAA[R!/]Kxo[OҟɅV$XMzd>Md=2 9,p<, ~LusI_$`R¢Ff!LdC)'WGPˡQв",F]@/D-5I 7 {?73ōt[D dbC!q_;LLjY,#l5*q?]i x{<ܑOqF0%Hy-Eʵ\d0 $A+HxyS׹.2{Jtc]*kb^xH셣f,PY|="! c؀$ъf-gHt+U_o$>?c_,o⋠|l/MdD3qq4stZ+ڌ' uExE[kf-Yf,l4ߕyJE"YwsllEȤ.)5`oU6cذa1cK(G&V*s( F,R{S?ń<qrّRʪ&`{1-(I2mIB[ۓ$+&lٲA1|rYFH^@'sܱ@0tSujEBLMJd78D, GI/|J6?Dcs'~A͉|p$~1^v!c+–6w]f\e"䓏h@6yΛ/%;wH͛?Rl3f4%;tK.$C1u|V-h5Kh3ڵkKo5PHчi3h3@ڌN 54hfΚ-zTIWyy3mVC19+rS?X^hۚ mXC1żIO|m-)n]"d01blf_&M"hѲ6c?_k]juh3Vݣtlm1Eyl4xHf̛7; {g~mƸmW_+ @!!R]X#Z{5>S ܾLJ{6 MMno c׎گ58y:R 0e0{$$^T&ޟJhA y[WE"`X)E"`6J+u-E"`HSlۋ[,E"VVb"+VʯeQ1 ^oflٲʌ lȹY1[*ub˝;<ڶmnukn1yО^ y(g.zCqo)7B.in;jMD ̯޿0E#pMdC,YvO1\)+V ЊPy+^TƍUy*T \hA|B̙3i|BjצH䭨?N^)g3 c5+ƏO̪Li`N_+ d¢}d}?xJq}?[l߃V%@2\"k rU4{MGUdml`EjvE"?{Hg>qH?~V7o^| Z3h )&`-;-[.Cf`H<^et&X;wN:)ҋ'sΡC7ϷQ3f?`|ѭzOb\grlw3S'\֭]G/ߙ_=F7}G.GٟtFg]4%=GիWOzO?D7mN_u9Ю]i3ݫXvt+ȘdNj7|_P!seKعsds4'O^,. ˗QÍ7VP>sAJّ7o>;ݳ_T$w`ەe&*wYȢq_\9Q_ҥˈ%Kف0Hl+s(Daby,ɈZb%wƮ"0]ŋ?S +Ȃ@"YpeϞ]$ #aCr"#F(\JUmrA`lc~z5Hd2/_>^ȪU! xa*eE"`X,눀 #RE"`6 X,E"pAu^"`X,A '.&bH46q(+rlхyU9 }<'bMd:^} .3gC5io4H[% /jhS𦦡1IDATFq[>JlLL O]]̤S`N$}U/8GLU4^>D7x\o:@e("od%"ag" P hœTrْr<:^ )o/3_C?Ub@x[Bq>7ɵ7")iZ 2Xr90%@J~cP42(Ee kaů?0[2~v:~)ȓǥ11ڵY6$_& 5*shDD6ի8A]ʟ7=ƍN{UڵpIR3gNsF߭"Y k׮UwNlܸA%CBŽ~X'> dY :e'fX^^f_\MU9"wL7qW$. GIV8\~]YD-Ȫ,[XfJ?>\JInN_N%|+ !H_ǒ%~ǎ;wꇄk,`# RD$ ԕիVQʕ)/'7L,JxlFVDQV%_( w޽!,~"۷_g>>SUxD v I@4K3<@vm#?|twRa'I+r&*dfu]\`]H4TĔdT}pp.!KK]^rqfX]STdI-$U:'۷oɞ`>#d5 D 鞆Dr/OTGUiu%SL{.Q{$獜kYxȣE#,xEd-JMZ0+^\$br5J4m7(~Q r ޣ.h.$HdVՂ/ȹsfS=t+SfZ͝ժie&5jف&Lj<ʓF@8̜1׃"ڌ3_VzwRx|LUGVXQ݋-\H|:k&Ojwڿ|"ڌE~VfQƉlՖ͛DD6㡇f̞= $]) ڏMxe@Wv,V4moDYf|"Y\xل%Ki/6cF]b9Yob%zQS'S&MD7ׯbZ'(jeX,E"` ` @E"`X,vX,E@ 4E"`OB+2JPѥq,˫%F{?%7ڒzxJQW3EY6O6/~ rl*6o |kFM[h21Jn\H+(xrŊ4gw3_da^ɆZ  kb( cRAAUs^%5?eWQ;Z|;OsNKd(]&90_&u4& deK CE-4  PAKU# ^pA@-TbEӟ[kD#F+/[v.J Um`ofG=2G {5]<Gv,dD?8.G*dnñ#D]ď^ƏG9'(j TO@ǏNM6j3bpCV#@`IN:JdQ3L1iQB#n'OT6o$rHLt_!Db 9p#fd_-VƏpG#4udEEKUvhWd`}M/>ox&/.k'NI&R9o׮Lo'۽G˖-SǍi48pTR?dX1Ę׭SMow/ 5a8ʖ՗Ƚ0a<,X0Q PIrA/4k ŋ)q.7m=٨Ua p=vgDd'MIiݓ'MROWmvTj[𜩓嗕j?CY|uʰo>Q z}B=壼FOpyTRe:'#!.VtI}Q YdHt\Mպp^o3қ#xf͚,]f2S&׷"k֬yb}JNǻu.ZXru`_̗OQ{nzZU:"k |N h3m* iV3͛7fEvb>(ImH1%ȉqGEHY !y" k^Dѩ+L+PD1jH\ Eh3W{w}b~+ŅW@*-3>+ӻ'.͛mUd3h39L݅>[Q?ץ֞Re{9^JZ, .]+E"`%6 fF[,E"p ZX,E , (s50NSFS0F[R/1Ue]F3QkP~gCjY~>/ hMLp^[3`! HN:ӧH&Ǜ"lb)_x5rah DIŨn))9bbbi~("odtl71YJl%y=ѩ o#"H"L.6.ڴn-i3_&y&tI>^z&[DRīӧ}ڵk_ {߄|cD\[lO>Ym‹b8{aPA}IKֺ6r+E8u Zn+ʛ@MX!?d I (Ξ9 Cr${+AH/^Hk#GK}{9'gXZF:pMllTH+X׏3bFb.,ӧN,eŭ[A9! k( $v`A9ۥk7G>]G=Ɋ\,'[-3#h' ÝD6hQY"{^ݓȢ:x*kiǟ;(z Ξĉ";gؼwW"1%~wj7ݤcz@Xj1cYWsVǏӒŋuܦg#x!,|X,DIf`Y8ţB,Ї+/B}^\?tuF/P͚7gѫrwT󢢢h֬O)O=2xD %WOrVp|g+5p[CYp'N<|U/7?zs̙y;p\,˗?PYDP\dRZY~Ź~f\>AˑVAFfqW%~BX ;\&sGi;f4tP==;Rh*! 9'HŸy~CPFHO㛓̙/r_C S@/ d"້Da?ŋ /sRwӋ! Pȑ 8SAd5>(#i19\}Aw{T'|囿hP-({ C%Ch=0&&xV"Yap3_˹rRɢCȜY&)chUl7;8qejead'ecp_Ey$m26`\Σe{^Px+Al`,@vpC[c}h3^lߎufۛԹwe}ub "T'Fh3^((yf`_7Xp |C-nNo k/mM={f4`ʄƍhmmƎ?biꇻ'xƎ fHVELhĈQ_ "$ZZ4@1)mUh[okư'SS-[<̈́o$c.о][٫6Ĵ׭!C vyuxXM?BG뉘Ey=InBPkߩY,pFe%6 (ljX,@j"`DX,E lAP45"`X,DAeX,@ `ik(r^-7[,S>2H#Ϛ-IgƳ! (4Ǝ\=kokM2f͜IUV X-׈rMZ`A 0mCs~>.PwqUMllF6eDoBWt/YN>Y? #?8ىOP@92k 7o'.)flٲסoQ[m8 TR5<3?齡W`dzIJeRV*Wg8 R)RL۷og٨|'`_R%3ɿ7 i+T܃oU+~W(TP ٵkʤZL3ɿB/te߾}ꫯnz!NӿOd6 0]DŖ+W.6{ #/0AT\9T)d˖-9?&+$'W9J< 2p~ ۷)E ]ƠP<aMp]"QL$X(L 55UKM4;dg+h"L';P~% =IrIܐ`-S?` ][)]4,N@O":h*VOЇwq~ {kժLm4J E"`X, | ZE"`XBB+X,E"` Cn/hX,@( `PhkE"`X,]w-E"`l `mX,E#jYaIENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/image1_crop.png0000644000175000017500000007653312662210366022235 0ustar mbambaPNG  IHDR^+iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]D>pIoRDXAaoEEE 6l`G,Xh (U"B lv7L.{\6̜̼3y39sfN>IA@5ڝF  !^ 2E]Dʕ-[FTkΝ4}tڱcGD|m۶ɓi޼ytX"W\I3g2g̘ʄCUnf{9~뭷TYʗ/O ,ʀϚ5VXa;W_|~ӛ2nJӦMٳgSNN~TTMy/_N+VTy"??ФIhr❸+=[~O|gV|nz D^lONwJ7pC58n3~#++˨VQ@K.qo 7mXvmoAg<Vwwa}^y啈$cƌQR`Ag˖-k5JF%Kzhw}ג?~gԩW_MK(Ton޼hԨq뭷Zi^k7=}F %K(Q 5N)~B B߾}UΒ0`@D\n}{ϟ;40s#FdEpI'*U0t\%^z衈 }-bš f;5kfvmhuΟƟ|׫믿Vq `ȭD_|QmQFo^T7T#wsTL}n,]dƎjĖ`$^/y˅ /3ui&Kd#s3 }gGc _ N514{>7BQ'Oq>hѢEV\V믷SNs_le"qQG{0R͚5 5gΙ|1;?3(bpU#4~UMZ8p`viK >g7ƒw1Ǩcsc]<ADy?&1jx]+( :L *"mnŵk׎XbX_H&^xe=z{XG%JtY)N;XRGTjՈ"5jO8:ST9x4H<%U/7}ޣ/l|Iģ4zU w)N>>~[ x?:냽f.׈,QC79T3<imV~gzgԛ'k"ҙ'n+h?{!hтXCmڴ!VMXyiS{g}΂Q'!CX@| p ʚ'6?>r2ЁOu|@ܬ뮻x7n >gDQ x<!;UN>~[ 'ֿ++%4/i2Â'V@GK}aQ$GdF xŻ>p9眣F1Ff#˖ij0t>&t@<٧<8?09Bǎh.Frΐ >_jP`k8R>~C' &(@(;+ Ҕ)S"-F^+rH= aN)wNoj3O 趽Md+Ff T:)ƲQ;~&x='^axv| իW~p -8MM`;Y`Pjv'̬2T LYL`gqVyfLAfwy$&X-&b a: f7ۣŲ O{u̫U>XZ}Qvi,}< 'x }"̇*b# FW_}u:.r͜L_E 鍀oz^!4l4) 7)GP9Zj6!&d`^X|,v YXl 06Fyű|/o-#ҏXXF:KZ`QegwI;#JK(ټ[~L4ݏXm$楗Y|晌R&nݺʣY([}2s X5ՑM_bj̗K3D`?caܸ?Sq4WPWzQZv 6f'QzZRŀIy!`e_W>҃(<> p?pľ~]xI}=FyO)w/)gǙx/?vKQqZnYA7W>4s*w1Xarmυsi3o&g>t斆vݙű[z,'Ċ%w-#4rSLbqu+= xbKi9Z-=۔3=g>%~;ŋ>|K׫D̙ %ec\әljcq^ ȌO:G/C^}SxM_?^ңcT؏#< A=Im_cxڬMnO'~\ Jw2˳|*x2㥗^[$X%prK,=~ǭ&t#-n:[z|ﱙ>~ͺC/+@/ M޼)VXy4_~i3$>)p.^v jwtO˫#מxbCq䵼"5@,L>zeg8wKj|Jo&M":5z*]&^KzC#^PG8 F"l뇇Rz.Ha<# B8&7>87eAXL7.,( N{Iog*L=ȳ|*}W9lmÍʷ~JU,+|ʙ!+ +x3z t Hx"yLͫ|J½ٕI{̏X!n UBh޼yQXRO(1_d#Gzu&X!/2>)EtG?c]v|[Z&F#:VWJPU-p|L&99e9|)R$jp~oÆ u9*UC WB^|SJ =VDԡ3# ^5Kڧk۶'ƞ%?XTѳgO+n '{_R`A@|" 0I.@Px"(A@O$ A A'B>䂀 E@7(_L  !ޠJ~A@|"u': ko\[,7Qpe m #`Y*;ul)!u{<"6> ̙C鼖2B}t)Q~/ *KA8_`z9oKK(Y6e}x+7*}ü䏕f׮]͊΀ Qxɒ%ͻ~=xeeS EDuf%r>{ x{x|܇ s/xuQOΓڵk穚Z{뭷 WUmsΤ}i-(zT-^֍/^Dw/u} ~Y$ޒ|ըoɁ;|{g^b|@=}RR;ӑga:9k2xP.HsΥ^A +7PoguQ#G*ÇOUG͒:?x?灌 j{WC!Ci{PI txS 8&6jܘ nvۥ㡐w br3IO[_k={9oILt^-.I>9t_;=󬳩\r DvmذKltAE vuz rs =qnǎ)"t1J̑.Hꫯ%̑.HkHnc']]>ᜤKec']\2 t~U`5;ݪ9E֭M96kL\s mI6 ttQ;;a !C%]HIxt5 k'Axa4tu &tzkHNWzaɒ%j"-z1N:&Ҡթ^ذaHӭ^;&LBtA?*t x1n tRՇթ^?G5[0fJnf.NC5͛?x3,Ter^{yfߩES]'`{Fa=4ujWݻ)*U$}3ǟZ_ 0BnҤ)/_> Yuǎ|?8e}~L &@ɐʲiF6Q&D~38tzg錀Yg`}]+WkRӦEeH/YϛGlտAhdt?0>hv̖iMCiժUn'Y?䓣严3ˮqB$,R$+~畻֭['j}% b[\ amku-͝:s)dhb뮻%{;.cӻկ .]:q~I.+rJs'q&$pOT ;x[teI ]8˳VZuN}/EϞ5tnd?~\; 9^z[ؽ\~װwP#c4D(vgeeSuvE;ؼeڴAGwyav y@VTQѢEh8iӦZfg刺{{]PyR"]bnݪaGl't 6z~A)`]T)znZ"^<]Ԛ:IM!=^zNiޜ.B3JsݞFߠE)^Geˁd83ޤz /]<(ۛo < 6ϿBoڽ yg۴{~x3ߘ!}tĈ/huwGmmA}-g=3Z^=OLim&@bxc$)A@ЊV8E MA@+BZa $F@71FBjS  !I A@" īN&@bxc$)A@ЊV8E M{ D#cOGJ#v؍u`lnwuCC.-ٽv6L>!v'9r{N #]MZ ziBHe'O҄~2kΎPO}"wm~:Rj`EcU+ &CnٺE開N/ÿ2 ?t7}v6͛;^0VXA[l,B@W]uu ]t) 7`bݗֳK%rs,.$̞TzjZC5ZAf+Vd7׋uӒݲcna.ͷ-:K*TX#)~Z*t}HiTD PZ2y駟P*Xq:Pޑ#Қup$ٰa@UZU[6oAZ} wܩ:{v//5o"OzBW_퉶L/}_CL2 [\ҥK[z :{ ?׽~/wt{:ݗ^10h2 {;lKq4s}Wfa-H&86jěIJ]A@Ho"  A B낀 hF@W3"ND&BH  !^̀8A@! ě!.fx5*A@Ho"  A Bu=ƞd+g˗/S}"ݫ֭[3$ o{fr|NNڛwo5ڝ̫3Wtc/^ hNN7RޮF5W뼃oݼe35)'͛hڵع6mڤ]f.Y; :\v ;ۡ]m[OE灧kФIMy} MMJ3g ם*OkA,OfΤѣGSP҅pm><*U@\qn {csQ!~&19n4io{0dWT)ŞAK.M&X'ϟ/M. aÆM7rh5jիX,!H"c*_O쬬T~}*<둉sʅ^{rǎKK, ,)rOJ& ,}ʕ+e-+auWڣ}ܹtgp1}޿6+;_ 0|w;,khSO=52s2wI/]JKW>_װKZi~W/ 7H#Ǘ_~6jdC /hEW:d0-]yw jժ)#dknj'o=xW]꼜m[̈O'@xhp!.=ʋ+ҫT)=CUQP aׂ;F P^C ڷNX)V^^vq8jp3I/j'Q#G!ô=((;H/ t:jܸ&vÞ%Jh t͡.O\vI}_吝/ bk'M6>ՇH7]wu4:IK*us6隤[Danf͒̈IANvҭ]rHۄwO67ޒl#]n67<"줫/9IW'9bkngӉt+%1g n!A${?${dt# $BZ7(BJRċ4t^H.&5 2M˫#]#tb:]SFS{& H_ZI#{;u$T[RMɆNW'̫vbX{6ݻќ9s4lA>ªב{ tf4q38/EՋ T`6aXE‰Qi>zUi5k֌(]̿=l(l%BKS{Qi|Suuh16m2; [nV_Mގ֯SN0j&3#F|A6;E] чz%-0|?`:Ҽ7+?6PԠ/Vg)sXT>gueҴC**:TLf 1wVM?Ipj I$@D@7oZ BG| MxfKA" {[ @D@7oZ BG| MxfKA" {[ @D@7oZ BG| Mxlx;JŻ2>a[E o9j\H91۷o_V3nO_6˖-={vu:!wd}XĻw7ox?:WDŽĻ O 6{lڶm[!uXĻqZz͞=;V}m ;G5s *j:0 ﶛ\[m>й]GٟM,1_NBe˖u+NfąviW7WNkpo%InoO%K 9LҭV:o~frB$W iӦה{(3#n'&^tQk::j+ .vmذ{"t۷s>It~1*Qxrv=<'ⵣın"$/I7U I7[PDu[z!]̡~o%dP!GS҅,Ļo8 c" :]Q/`&x}VtaiLE #]xBN0n2;w?|66ɓ-uϟOp_vܩ/>jzNlBw68; |o㎣k7"'|fHc¬33~wtͻq桖˗Fwܡaٲezq^t^o!p+N\s-5n4,W_xIKG>~U+m۶ժeO$Z҅f͚Qjըۤ_뮷;/KSv˲ $A@B:P @@XT@Qd !^`IRA@t īE!x}%IA@ЁE >=li1v2xfGܐ0'Z{dlegqz^xg a aB*vN w{%dm31ĻFcfmSX9 i3om맏 &C *;t`w&qܨr пa/슖Av|w'v?CkOJ dEo}o>:)fj$ݛBř`2IZ'@91 N0I[Qu.OVv=f1RIW{w{ftq0IvۋFf%; 1Gz!] O%CN$^B0.. tlB H>t} - n,^{.5t1 ?h9~b; K믿RŊgq5\7$΅t-N!8$yIH7Ibd B)XB^NHN~R A+qڠ;711SƄ& oV:]Q/$aT&!(HE ]@7fsFs"MtIh!<ֶm[ҵpwyN(*+20Ww>r빘Fb'rkshٸqq֬5iڔӧU9s*:sLsrrT}ud…1N!8φ Q sfϞMO>$K=ԯ_?}t޼\5 >zL 装 kR2eviϏ>qeXw_={%VM6?̾ LO3/E)SZ~!6pp3tkܹs|+W3g*sDW:|͉Ą~Re)_< 0InSW6Q=zguVLug5ZnmKHrÆ jHB/_>SN vI'd*T F"EbbMѾ}{mIU{ ֭s˞kqro.]TߩV/0xB2ū[Fվ2x1QV-mh]V}fTxuVywayW"3@{ g˖-kb1+M}fB h>ctϞ=ƹkԩSǼ P@ ~ppbȼ ^ J&YѸnKx k%\bUG@6`зo_E$5aq(ӨY"F3ⷼ3:3wm4hXdRccy+R_PVٺuf: xF׮]n'=@Wb@wqꩧFeƀ"rD3ϟ?_wީcNK.j0:H7)^w'yxY5kfvm~k3uU-1h_ Bfy_b>bə.UχNZN;*A!`w5?za7|w< F@{ai2H[=Xzy{ Z_/؟Sh_mbi| _PL{a<} vynǘ<- uܹz(YW=;Pv,7H`&!=<yL`lppgAպ{3_2R|ya|o%QYEudorJ\XO8  Zh15rHL|>t饗q IDAT^n*rz 0XO#O> 'tYg;8GJk9LD@?hJcݟmJh%pakҽמozEy&R1O;eYRBNj/V%=3yOՀk`K&é~Jfo_mqU:ޜ{93]Rnk6tO>m 6{,믿nRPC&rneJed8lg`:vh KpǞ| ^{KDH:v#^lX#䣗eMoϻ}v5a*<D2/vyxxُ/&0a1*{uL .|zUC”/ᵑ鉗t l=JZױ>ܶgkܸJ+W|>KHT&/2T }V<=8쒡|^iOc'*ϡ&2CG6=E}aC~oz=S} ~9%/:7W,32#W8 G3>Sjfx851fKBrUWV 򰉏51tlDl Bl;o :M;!&нIeLKAufY_ +FpE϶t-bo+T  zQ蘟{9EVX́9 :an=v_~Y>KRUO?){Y`ׁ_}x8xإXxB-ց<>"$:fĞ) C>뮋0Jj@6 ٺk2"ޒ3[kӸ7V Rx%0'\jqcOk˄Ou ͔~[oUbxAիW)3nM?ȫWCۣIJ {W&^p@'N'?0a ecbXH~F];]y]:F|\7nKT#L'abO}يAZ#03TL<!?7OtiP:0&ÿ#KEյ~&L@5jo*YH]|?0ɟJׇr`n_ТA\Ē xmv^(kǽHV3XYjܡf!WA >9{6nyVc*լ)ʪp&ŃЁ˭s9A@HE$*.Doj'Ddp (' Q]=Ê_0>XQ[L- {Vnʯ 켩F#Ӣ2V?ǻ\ lswUЂ`A^ 0aFaNYX&QMBf3{a˝m eʕx?Jgdٗ{.ZRȾ  %Vz40l~~-ؾ#n?⥇[l>a߅^HND_KcD,YK/L{G//^\0EkfX4gǜy$utKZ3s X%RSLo}2}rzlRX|17Tze37,5pu[qT 8au0^bjX76]0֪ ҷiӆc?y =B̀E^8C=d^M3T RF칀: "b# l -lNBƾ? /L|wjEϙYmjyGmK9#Ztq}r\8ϝL=B׀~ə~x3#{=fUUΊb/`<^[z~Υ^[L{y1u7ٵI\G`2'݊rsg;)םXb& n鱜+˚װZn5KJ6 xbG=3^ $Xx"-=۔_26>jL5T\0hTB]ڿq2y!Ė-!T g. WrO+{Z{I""x~ x bGJՐ6Qz,1 $|ҰaÈ*뺣/ٱqPcGl22mċܵ֍~ Y(XөdxpņlSw;`3  9hYshǴo{)DkPD]K&B+iگ=+4~(\ ۾U"e(.hQ%"mȗ /TVBr-ZWDڔ^P#{]3Ov{:m=#5gv5Qv`jnޮrgv.F VP,ݮEchӄ޴sX3J~)tԱTK*^WS6Dʮ%?޵xg!,_(E~ CE*͵BՙѡR;+!o"PzTGE* doyN{ٖeB>x3u[^n˅V\!^{slY¿oRfdjٻ{ٞT Yib2Քwprh znWK?$myEO_Re.%6N4M1-\)/"NTmu͍J=Rl~tϊikXMVT嚡hkvO_>wlt9Klǫ3_"Tr*$oINݦF&"0Qޢ2!1S+! /͹\DЉN4EVbϏԂm{ږ;>|y }WA|,}B:gF9BB@7$`El|g_~<5<"aFR[FoNtW ufFA BqK#՟QaOƭFF=B~Q-W;"J~ïXn^ɕTaݨt>V> + ލ@(R$q,]}WdLItShE@FZaAؿao4}6/]o~ǾwGG(J6 ?dP1;u %GQv`ˋ)fX3.2?W}rEX\t(iCE@7TxE_h6oZɓoz]gnOoPWyAĕL94BGQ99kO巁yͿYI{CHR !Tj )@+ޠ*[rwe]`? c߿@Jyy*@ ě2M!#hY، ^4O].ݺVaUu.@ ě*-!Bdx߄sl> u֥ /^jˁ JRkHYtk llЉx5̗E.sO&A@.7Wlz;uoA UMՖrY?;m<:FB CYur?`A UMՖrE P6grWlM^|u.@" ě-#@ _b5Y_Cmswf:&>ŠA M6@t+l/Gx.}|o*-8̗U8uŅ+gˁ rH"WŠٷ:.^XTG@7[H@zE'oʯ |I~jNJȁ BPcHQ#PQ`f&&`F@7G@RU@ȭTI|ҕђTE@zk+&+5VRÈs9R!To!)_Ԉ+P:<⢜)o 6)>KWH<('@ " ě"E@",IDHAxSQH_LDEJGˉ z I_hD<⢜)o 6)>ċ$GҩR<@J%=, dˁ 38CA d jȔz@ ě6M%LA@7SZR!io4T2!LiI  BiTRPA@x3% 6Z@1m44h+w̙3iϞ=Ԣadž:]p!UXʔ\TҥKiΝԴiӠ"رE˖-)_|ׂ,Z*T@e˖ "&*իi߾}tGG] uъæMhTvmrOvRLg-X *߿J( ̛MmڴVZ9/G ֭[S2bMsΣٳgSSO&eT{/TVYj5;N:rϟO~)|)|,mA&L&8^FE48V G}DժЊK/}L:]f- >/_U.)S:u⻄IwܸqT*؟}L7pC'Y7ۥtt#iӦҐuM?38q"FjP@C n=Ogq_laj4K_nߠFKnљgM_E&MC2FS}Ư~pxglѣGѯNԊè_^q5nk֬.JZj6$7L}iI2N/<=ۭv6t xYmm} ;xPHgi'AL4;7C!n>CO=v}s?Mۿ?٫w(Η!E" 5jj#]!]"!C]*In]V1h MKXSSJg=nP/HzAFDP/=M)RO++km }B #] ux&+s_7o>Ӌ)=cͣ^=_S:ͥoA|iW^RxTPh:u* ZO:(-ZL/xt}=-94 P^~TxqMR-]F?kTREmrsr zkv.&:O~"(!(P .oٲeT\9W`l|A&d qMTti*YdT8B ,Xt>Q8 :".S8ر6mHJR2%{h >{hgv3c?!MVwJμ1 !sHwAG8ٳ֭[ؖ~vdq\$l7nܨ <p}Й~w^Zv-ehc!^'"5i҄n-[4:K_JI]{-/_s/ v =֥+5nKrir4x+x믥>}_g띡Ci G+iϗK#nlsʫTr'wف:uN8ᄠ"UW%`IDB'7^ٛUSLTAR&ADB(/n"7(C4BWq)V8,V! xSRA@2&IDAT!ތhF BZRVA@x3 NSkIYA #͈fJ@:! ěN%e@@7#Q*!鄀o:U2!ތhF BZRVA@x=7czm%a > va@¶m]γׄx=6}jN^T/JQa!8B78rI! '3 @R˅Nz0!L3Ϫ!$t~ Ni[!]M0K)< [&:޺0e)rxϞ=ZO~tNB#xN`3Xw/Bx)މr\G}:Uu^2o<@̉9SL F\_:~gQx A@uQ-hڵ.t)PFHOQGEg}ҡngqFׯȇ!(H$BFzap7+ݼy"v㫕%\B͚5m۶FΛ6mSO=՞:zN$G7Br]FmсSlyaۭ[7ڰaaٹsg: ѣGӵ^FS_UcǎU[nEǤ&ߖ/_۶mK}СC.fx#FPg)1JDP Gk֬ŋӒ%K"Ru"0WHNC]q2X*]NX88)VX%`rkQ 9dkYfȑ#,c ҥ"` =z(ȃ7aT#(R ըQK5V ?wj,]/Lc^^;Zag@b432;x:uJҮ8Vuni:ۑ#捚}ih$|;W^y{9HԹF@kC9 7Tn*~-b,_6!+3^T ND2<$j`}YZ\X AR[EVNK.UI=`oj':v[N҅t Zg.a$GOm?-c)[*'I!`."^n;IQrJ53^tQD`t;aNH4˨wwb89.6_lL/4PV-5Y RJ 1plx#WA *NttƗ/L/$ae'rrXM0VHgMe30$vQy/+9l_IPh#*κiE!fSc$Sl?MnXp_Yv8bV(/E_pnk_t“/2 l NSp]NiND*:Fwݶmo!CQݓè}vԧTlu}s&Ml))JH+4}$rubCCPSSч6!RC|\HK` ^<xHE-bm87'hg<ߖ3g.k͞u{^?TS=T!h]Y-ﱹܛ >;Щ|wժiVKNuj*ۖ@[vRaϞnUM{aÆ l1(Ix n/0"`r!"Dsu͛z$^T(_[ITZqI_0<-Ԉ{XX'\`=p.9u6?vf(%%Dz-w[]-_`ƘstB;ydqEr[|;=ٳjݺu} guQ~`L04q5fܹsn~8ˁ}q $< ~60?&P !\ ȒI "0;vLxE0 MDSȈ/ύ i{uE0\rEW?t 1 w%$ylREYWWӝ- $@V "ʲeˊ@JㅼzZ@Boo+U@7*^ptf`F܃H` ]|.&ŋ֭[}jڵ3qƌuqV75C$D}B~ӦM БU_ xxtHX_x?,4P, $Oonnve|з37La୨&FgHз +)MMMJ@Hw'玎wy߾} .zoiͥI/G.H7*1O$8ᅗΛ aLN`E?pñ?`CAׂ_|hPp+nw'O֭we\.*DeEϟW;vrq_^#{7Pewl_i*Û29eVF_?Sr]PzP3iܹS^:P䄲d,NUvgܿ]_PK.=-?c2-Q B?opCVc7kwZ _K.\sH-tȂ/G}I3;f@$ F@ݺ' *K!_v/U+Ps Bi566n}SZk.ySM K@8;lq{+*}8ch9sZO7T+2֦Tmmmt U~*UΚ]֪*)(N:AĄ^R0TuuYW|98ܱ9hɂPSS#fA J lGH=O_pUKK, Ys$ $ 7IڬHcFigIENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/image4a_crop.png0000644000175000017500000005507712662210366022401 0ustar mbambaPNG  IHDR iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]xE>7! %^l]b {O콁RJ %^?]2{sC 3ϓ3gΙ9s材@:h h h h h T Ԩ&Xlծ]6mzN;V9M:.*%(+VڵkФ1ϧ~0VlѢp1Gee'yG-[߿^ (6>gZzcZj|;MYYY 裏ioI:غwNz(KdeXdIbhƌyfҥ yTfMOБ{"p?S?>5h@*nݺdgϖ\<(1!CҥK?T\?N?t:CЯef#޹sl .LzaR$1ڰa>SΝ&]wE~-;]($Űa8gu8蠃NMz"))IhYO_atGsӧYh֬+IQF oѲB7|sX\"ܜ{ V?Y;v̏j=Θ &MdVqƲq.CU'6~n!Q>""KDQQlo ED'ʼn~k>#nae93YfI5k@?.s<}!7҂ hѢET~}5jn"=#zjǎKhO0bۦM{NI  TeVmٲ xG'tuAe*$# aڱBnݚN;4cyX?6p@JNNrsswߕO?$Yc oL0a K#;;[ 6m"7|#ׄ8 Jxx{gW?Nb={$mĉuVY.<?G&I;8FZzrz=oX`ǟ֭+)SQwYbжm[ 46G8>h9NYaa޼yr&_"{! iҤI?Cg}gKPD/zq>X( \o߾x,?PwbN/1K ^ 7xc۶mR*k'^2hx̘1rd?!FBDy9#JDa ftPl%w!_6;}t;wnXqu 6oo&N*ڗ^zt9ceBt Ndu)ΚMrw[uX|9xrȦ@i{OD>A۸hi#.Um#~V^֭['n+#S2{2 JLEVmQ\\,ӰR<=F! :̗M~gP?IÝQ` g.d OdGvސq Z2kwy\cN ,sX}:IٳI .HʁzD|ߕy/\TuzL  /RSSϤ²`*|c(2(<]`Q5:.:*L&7t\7&(` W<]{>V\Il3_{ltȔGHr`:}<5 L y]_uh5DkzVRZM \SI`8#CW$`8vQ\b'zq?^sfAhlt Q3=!0OL:4f3fu Ad4fQ *2L3pfN'F"@yՁcaMdi3^{5 03zxb;d6a/J zROAt uN0E^ϰ'eW>1h7xklNqrtp!c„ r/;G{}-2摏|7w$l"khڻƍK`qk.pz O$aeډU@FxOzzt ;n8gbf4_ڵk't)#L!/#YRJ0B' 3qϞ#Ŵiz${/"ݓ+5>J5zfwya=ςoYTm u~X9`-63qps*ְQf^kla+3{ |Oc|ƚo miM+`>W- B`L XLޘDH؜ S;Џ?h kRI{M|r8*lq{!G)_u'|ƻ`=%$"5v 4Q a:Cz#kd fpm)grA&1{{'5A07 aQ>y`J\cUպwzֆf5+`]T'X)vkq$9rYhp4R"e_c+8iEϊi*}_r<"lI^ -ˀًS 5n%!5y>De},uUd+̒I y<{Fn1lfbsK<+3xսی amяor 3/kgNqbY[G:=ccX64cSũ_qjckl03fF\E1:=Y%1{3( 6pctph|@Z?S"sfM)ZIb3BKq۷P!E6[ J~>ѧ (A+2Q | pZ MA̸pÇi ֱoAKx#-NH PC 2$\yb9ԣE_pt,K Uckb)w~6#f kJ~oTrquZZXZUE%M{c2k h h Tc :k.* pAQ6z r{"7y bS@`oٲ5l'e|'n6rčƈ#׳g/65z)4h[YxvI ^Zl\Fޝ|>ݺPDZ ~FzG7ߜ<9;Yig5vA)[y}L֭]M%EԎxG=.ZڰLӽ )`%RPȿΗ/s-((/3'>5o[%!vNQx۶PAi.P -CmPMpoO[ʨ0ϜYK1Rkz 0/N;RjI2jҸ!ի߇̛;ǶTno,^ˮ.oN %ڷW(,,`ԼYSw-/R(5Lۄ2y;ZE?֤q#jy_o۸q=mٴQ~~4g6o6-VHuY+QjPj}0lWZMONx;.Wўk|` 6<|(;!}Ć1_ь}k~~ޅ~l/zxMxqlB?<୨1Blx0_9G@]u\^2|,bvwPD~^{U\I-4uII)[/ΪǔTu#ł?5hw$:=#3jեRacS6X?rϦk>f%K)>>Qa*p"WV{2*܃} *?.~ӹu (KbA kcڙۺ6޹о=?=L {zʢVN}j7NIz%9+9 { Q$:/DtGe-䧴VN{j5D5I fN) (yT=n\%ҨWc<MJZQ, wrq[Oֽ=.)A+{9:Ivg)vsv( >PrMj{8fxN[7v_vMjk04L%"n,=#Z.9ȋ̙MO=_|po/R {t 'CJm z3Z#A^3* .:!s%z80 sQ~㹃}rņEcO-".1 S6}3mskD5qԄ;>.bٗSV-g^|>ZfpHB|Tj)yvV7p#'I \D>O<Ժ]*5xqw1c=̬IS￧Y5^~ƴO>9E I(N{yI'+)6RCz㢋RnY}jmL:*ԨYדv?Sh w}=i6nVj7Q-RMkhź\thJJ m[1U*:~Օ訣˖x1t7~gQ6ֿ:q M~HΦGy3[nCQz3}yٮ4ƃɓߣEcǍ7\ceW냁? 4{7fz*yݻK??~M]Ė[ mIDD*iH)"Ht pt'lY_^i=CgVNt?&Hzq;e}r󋉗0BB2TC0 ~+ּQY~V~+:,F;G9 y 8 MSI@C/=gx0ً%%%%Њ-1Ms%%%%"\SZ%fi\$G[pvuaEW+C3(,*43A]A.ϋ+-  Yl4!;1dbYyOwU AxsA>{D(&@ZH]  歷&RƼ a#.,8ʔH%˩l,ⓧ+$:j, UF"/f(|seջs*j%Hqsb'1b*)apĜ*ϰ+`1gVOəN|Cwߪs$: g%}Mƀ[nIY.dQ4Z؁7|UeսMJFOޠ*e@T\9M3 v,JO{jǾ|<>HBG`dϣ F/5?@ lËg`5lP![/ZR֢eK_YX؋ݺs|Q@"SYY|9e 5ލR>d#tTRn(Q'<8Npuc*ɢp;Qf%Yy6$xԦ>a=Dž IPU"6(Tc0H : 9+R-JӍ+9#W=7yIe6Z1^en G"_i7ZdctPZPENd| 'Y>QkyʷR:|bZPR#;QGE5H,{5l th>fze|Y6sS*>1|B@N`cJ߾}}88/4l؈%YlܸQ79_x/a1Rd;`+mkb6<lmvSf2E6$2iv PbZkQ(Nf 58a)Vx"(Xv3zT˷+h5RLÊm IDATu)^$X s4̷`3QIksJ(Zj!#bd;VpcZ%H[t!Ÿ$&0R(GC >Lؔm1\7O6p;Co@;bQh{$DK9R)iR˨(df akloV{C4Bݷt*aE\kNgqOk`ECOXNDM~]WŠOXÔ";uATs+g)Ѣ| <4sƆ8`|%oM/=1hk15?yX$" 7P?X-_dG嘇 XI"] +2gzJG #`EnFe}B1|T:_hȭevVƊ n(ѡjX%ѰV嘋*X1sPH(+r-* P>n{JXng5h-[DKx0- ()O@"kuT$"j1X-----Vl Zqm----g h,%%%%Њ-A+N%%%%,=؂łZ H-5V7d[C'WmPog6]YT}Akڞ%!Жˍ?8X~q :XUK٣ x8UlN2P"VxPcfIl?xa!n: Dw3jO;4{1AJ[Jvc˨%D¾eTdQl..ȥY( B6 'WGYT. D윅[l<@jiG wo *,̆Sx?7o.uJb!CX2 Ǡ,NY)JJ)Cg3Ϩ>q xx߰^*RS6Ƌ5q'}[ԨnWQGaS7 ~&)q'jPI. VjzcEo2&䔗@W_RJ,l߶26IիWKw7O,[3 펝;$< -xı,-aӺ_M͞)кux/;[|6o"Z>0:y{Jc9sfS鬙tuUkhy(Q>(H$ -D Ж2pDh`bxOQb}M 1S-B7t+\pGc!a6?R]SV;5M!lHd3Ɵ_z Fmv0 9$R#wJ`Z^֙_ g%.ʟ(,J|\Hv*NPkI> Ֆ Ziɒ%t]2%3]~k'+K( r j԰Qyi7pg(ᘄBR Q5bg_{%u\ZB r%t\*t` nj,~ "EDJD)c !Lo؉ R xq@MpD9 };Hno < m5$ m假JjJ2l3O*TNў&Qo{Uh"5YmOa؝ZJU,KF;^?.GԲH@jmM%h 'Iw>~D.+,IsdX#q_Kg_4lpѓ&I~Jݑ.WZG" # LwG=h5:vL"ū&MЈ#LPrd= ҋق ż@jlԞ~g ΃OV70μNNVA;w[a^A[3yQ/--~R ՆBSV^EW_wrhƵ*AjeAy3})Yhʬ?7 (DD%%%%%!<i h h h $bK:k h h h xH`(܃SCIn2` %/ ȭ4RK{ x@""ʣM@+M%Er7ɻ=v$T}RƁȁ`OS llͱ[! ʪ^*St@Y [3^uyA&PAtcVePHAV+3=˗/w4bwR{6WpJSd2LtZi]-ZH2a_bDX '%6@D[iСUW䀼󾗪|s<`2Sz{VM5ө]v{?xQH 7YBTv9lM$Z"2ܩ2G_`Z#LQFM}(-4U|IPf#v&Ą|iAH;[ RR@pn| 3ƎO҂Z>֘1Qu54iJ cc(ߥ/3+oeHY$䞟 g p>*ϫeZ, IsR`Z(_3%ZIya?Z(TQ),o+!E Z (ס}~R@+CjQÕ! 6\}l>FGm@j)c1EDL4w4Z?m@H ߳,-B/|h;yiWTLK!D$!la|H7VvL@wg 8f]a͝L?H hŖPVldZZZZ!Wl̑U=Y Q6jCsPۭiOvEr@Z]^'@UQ+6k+^p<-A[5I'Rݒ-VFt.>r7*H&MIqoF^$ mZ!T֨$y;DI.3̡/" P ATZ|ӫ,*@|DD SOfR!*k$J 4mbvǯQ7γ?E$Ґ! !?AAivgmo71 Ai)!b*jYAaTj'xԪ'&Q6D%gvQB:|#tB-CMUQ Մ?2js ŋ.:dž ' _@_/;]v떭T*۷o0Y*ౄC@ٶogDPʨ&9;v(!e@*|ܱ0Vl ^*FqYƝ;h7t'O?Nf N,%ThK Pϩ .哻/FL+wecZYAYE!_*Q*dB+&,5Ds 1(ށrfx%%>X"g%l@%w޻7_[>2Kub$ \Q?*uvS opg*\R+@ިz6 o+(G|hGyVW]HWRjv,I [?WS (55U!'LX_6bjJ Z@g0nݺjԨAu2DϮ|Oء` !))L[U;--ĦsEC3r+|ut*Zv8Kbo5TY>šB@yɤWPɜ/BáˊYAp'^ǩpf2 kGIJYV|$Ѐ8/x.`B5(-@`Zdy; YEȩ|EX_`e̦]@HRjZ:U^&7Y (EF"ʷKJQ'̯ѶdPZfk*j9DƨBjX0aQ7 g% ׺LeTὀ;QԹUNnNQɩnRb)A iA׍ huB\2W,lrCujogSYyN%Z2y;è7pZ=27n+k!kex4 Ǝ{H R2Ժᆛb`3g S zw s?uI%[~=^_fhz$,Zʻ[(?R˕GI3Gw޴e|;p@!22}\j=$ Rˍ=CgLÆ w~%3wcXZ5iqG#蕗0z H73 +\w5RBffn{#chAj |ﴀegr}cȐZ2uurÀ:`/.i9a#KZ h \yvr4g]&ϮRv8<RaZnZu"[u>Њԥ.K@+6 bVթ %%%%nZZZZB%nIQ+6Tp3,H ytU>#_l0=,MeXZAMž4#񶓏?ظoމt AB!vK)/w^E,fTذmF58L s|5 p q~cjʷC&+Vfyc;N0Ҍc/0[Fq7@WfYP7IצSRR$If+|?Q7оf}ģ>؆lbRG%ޖѨ RlACɶT+#D2,ӓ'5hʫ+Aj]ut!5i}3aڵ4rO%;zZjKHS)Z/ .  Z~2Vv|y4lPkm%jz5zD͉,Z΄+!f~+3Z(ϋ?$:,ZnZAjRKM9֦+Ac0O2R-a1xx7!g@/-ZnNZnĐZi U ҕ ^"eH[ luve}re@j~~Yu}+j}$H-RNb޻@jh?e'13ּNy!kl!l ê!T(jZ? NNnu#A*Xe`C,tKH !%'Bi%4@"H@+D%ͣbS&g ,Zs-)o6N۷i:h TP!>zݐmN'ߋ% D)BpTw܋^.`D+tI'Q۶mX*$P(\DZщ7F7~ZnZMYV*^zҤI$[I @eANF:#8Ԝ p֧gKqi,RIZ  +V2:I$R2oԮuX 6ʷe0Z~C/,Ԛ(ߝ[Rݙy/Z̻jݨӂ*)ה۞!H;+^Z.oʧ",))8y)V#JM-t9Rn]:ƪTŠ+-Sa׉[ ,X@ݻw&w[nϭQյkWk5֞Bu%<2qyVTT H SiPb˗/Fy^c4 *uޥK;}eգ <\ mڴ NsrrlZr;zj+L+"+)Dj xϑ;~-----Њ-4@|K@+͝@@ hP`\K@K@K@K %[|׏NK@K@K@K b (0M%%%%Њ-Gs%%%%PZ&^ԏM̙C}ekO^u_~@/rU>ޛOlCf͊+ffpه BK.?su@,>#IΝ wW$4b;8jѢM8/B3f̐?s5 <.~7B@V93 h2nIDATOiԠA:{"*:ۻ=?O?9B?^O^!Tt#8sGޥOp *?#XQ(W!;w.Ĕ)SLr { 9&JaiXo9,nod}ر, "ЦȸzhU_|Ēw}ׯO'x-+_d3aÆ4N_=M:0c fWkccteE$?F K2x`be'q"C-ʓ>hdsv@g{=šDWv1z˖-r@77H]zz:viԮ];wL6{)q϶a0|5gO&H014=Œ8rH 诿:(,@1.ٳ',0pI38F--LU]QiG2(o:bs~R  }m۶uO]r%ӧO'69r52Nv<f͓>hǼȫZ:`y3U:|es^|~{eW_}%eJ٤ye8\? <'OҌ; =묳%VZA !~,yn/i}l$6l"Yvpx,\1 f 9c/Xg]tEp^ٖ1Kc ՜&ᰁBڻO# +2k3ho[Řd`|뭷0~Ċ\߳OJ_Oޱ)vd} :v^)J _{od%:i?W9бKP=}Gr=nijt"~0JNS᱆f[r|م_&2 0gY!4om^#}R7#{A;'x"lϚ<<[ĵES%/Op'/(Dwم`w )n)okQ&LeE}z `Sƺώd:"W^yD'M͍<+"^oЋ5>v]w7Ӊ,;󎤳n.g\e2Vݝ:ule:]\`O[.x^5d^5jD {^Jw,^ҎTe $J0W%G$3VdIG t< . Hxeg ?(ݻtgC=MaEz8]s=&!9^0 4bdOJ #PXQ ͜fZIg}[$ {,ٛС`ˈ_?yW*ȐyDU{Z^G"Xg$A`t[#Gp0(7|0=#F]~=anZ9&8# ʅ'y,7M9/Xs̩րːZځ^ +==Vph͵ӚƫacǚOO$-y`;?ˬ΋RUF`G&SՄѦ`2n6/U^Θ1¿lRP WdI/^,7N^AW-6=nkl46 H2 62*e["XhSd,`vAc}w*\@ABK@+>ͼ]iHh hŖէK@+6D@BK@+>ͼ]Z%X 3Dm@O3bx/i{\r"K/~g/hH? {K*ƳѣkJ(??LCd7#[CN͇{م=+ ˀ=qD3[qw8ΰj &?X֝JP4 ;8!l5xC@^o< ୓k TK N*z뭘PtAayK||/RpWB/AzM7IHF@JUxH+Z ^ X-% pcoO'tBL9;w)S|QHEy䑂$J +: ڏ>Ȑy\{=o ''90o},3,{Vh`ܰHOʰGGkS$u:h I(%$;V#WWhL F8k#m d/fxNga |Dbg'r3GVe gz';0~N=T9df|&ZB;¬˰7ژWqH|Dq=b(6L e'"h_8",l4A+hT  nC`7%x~t?0b <[f?iҤӦn|0ɑO0IfJ~Wzۡ88Ԫ`ż@ֳ`:B8xd/;Tt{sPmO|4 [e6=Ҕ{k'I?߿ h3L09R*3.BxO>d7ymħgSݡ4⛀hVlHMa8A[Gmt%u ،(1Fǎ59659t0b!1ޠONz"( klAvQaטQA|EpZ;8Al #no AO?Mw})* PW]uA9Da9.QG%ڱu텏ӑР/W{ ͗N_4 m{ʴN:@kgeਡ`CIHE"mFFgQ)>`|`A7oT*PnFq681pL1;3#sk̙38=<]Jcz05;bj]v<0+C]c&7̈|H4 l^CJ 8#8,p`B[L/EhE#5&%(ς<W!?#y6>j4t0` A! P0XކCbqȋ1J{ ^0wEYJ늴'>HCzJ&C(3X0KM}ٲ2PRdԏ=3jOP>0ZSmI+6苽IO?Ih>ZUeExt"@fK{䁧 :XΎ`F0`.N;4bo9zRCL +#15fFFYp$*Ҟ0H`=`ņ%S-| hX %e2B[B'a~&X(H$(KmI+6$^%J@t12fo~g9|kb𛕕EFa|OƠkajH%6m*|b=ޛ7JU}}81 +IڷoʆRЌu?P9b"XbkXwd<$n P;JIdX/Bd|WcN6unE:u TT2hŦ^4@H@'@%i%4@HZ4(/IENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/image6_crop.png0000644000175000017500000004636212662210366022237 0ustar mbambaPNG  IHDRVxdiCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|ƍ8  ܽk)RJBKWj[K-I!o= pOؽ7F3ofA']t %pI*JT]t % $`EVBUUVdeeiӦrN8mF52 7`ڐ2---ugJZQQQ4M't"PQQ3gh?OJ/iCCQm5Q5RĦW[oU**L G'U]SSDJ]`>C]pUعٳ'PMcv^i7]tx7QNC!6*!EUKY{OWZw0Y$9..!!!}ҥxs⑑6mWwYj`ǵx۶"<:;ob֋/cT氳Uݩ<8T#jǚ]@[b w?iįÇo㎄<:tlUk.TVVbApT}xg5&tѺ!#1y ^m9x2 U^7cZ{a֬YBC;[e˭Sc4r FYȽppQns;~cj FRT+GSPYULn"5|{9P:PԨ(9ju&5iбcGUqܦy\PPwww(+J;oBùxTD{t VD&`PZ,XHuַo^<%~%*J+K/BxxwYx3q7t0 z+2L8 Ok{RSڹ9 'Ϲ (cz!|7\v """0w2c9y3f(G (PEYt8^CrN˫m_Äv('3W_MXD|yپl$?<BgGqǗy} 9ONYIн3/X4_ZM,=tF6QL=S3ѭڶm+/Gk)ϊyAsϽ[XQRR [oˎ,cN V`a\V'16].1+7ww/\S_0p-\0jg{ \=?SerppĀџjμɿކ#5F7-/5* գfeW&^Q {C.ׇs?R%\`zGUg% \EE;nӐkуAkol1?AlMgkS5W^q!eqm \3fe]+L4YUUÇcuS\h^+붶G< _l)F^sւGvGM7BsN;RIɅwK4cf酁+,, ]qJ؟1ݼAȶT 6 iBE#!* KJ+)\O7GR / #NDF!44h-B''#֝\xF$,n޼ Æ j ⌃kGTw"55p,> :>t2;i(9FF5w:'rqS_4΁ֶ0Ε! H_;TMmhRȌRp'h)m2hZtnJd,ڗw,x8$7xC4 ʪIΝ Li៩Mjou:C`ZWڬ¸e!ORR1?^xrfgz]/ `̴ǫC/ltm4RhycEYML9.SC)z?kg=ZkEa.+oIY`6P0P8 MTo T4Ơ,KTۑJƠ,=Ǵ.2-18s-Qz|˲>6*Ģ.]t h@}}6:EJ{tdn|UE"hvE{%K@Jm\P2Qf]iN;> ׹]R^d.N wO^d%KRKw:{ط? u~BAhWwkhV ^K+,[" [Jk5/Kbҿ%pKg] ^UeEɍB [Kzo&2:Q’ a 7>5 xƒw= a&%5VКMZI2ݛO)vy0>ig!cף7mXćM\'F)C%m%"gKJȄRV IJJW9ۃ5PUI.l6?Ď✨5J/[a'lQ6l\$tXА1\ҲҞH ٝ(Z28\|zYʰuXdՂ˒ H)P޸q+K?^ª˕OхͿy}"/kuѶ6ljUIѨ%Sd_Nk|:9g &O{DiGkL8ܙ0yI hzO ~>X*Y_~hKB6bcح{ j\'_KV Ɉ=gy k!q͋p[~X:'k*Kx׭%Ytl=ku صg?Zje~_PgxeիW W-`{qlI[B*.[۫;oJD-A܋Fr:UyMVZ~%>#-bw#ZeejF-U /޽k'k.tFrGB:[DaƦ t0\< Qk޸ lzr%Eϸv.LBWC}5,X~f.:\7*j&{].xuc'7O(- L9Ҋ*ycb,uU%8@--Tb}A$}XBBZ&QM62 YGmItEH-6Q*fVl]0/>g:o-Z$[P߲]GQ&gs[meyX9t/(~6SKN\G "YoBf MDC/.-C9,JPD]|vVALHq_ &N4'Fl;bXFן_OD8lOndRadw'd+ e琞j$`E^vo߃g^xXފas>b6:ĦŴZd{֭1M ˈUyض ^\oCZ1/f~?zF×F~Fe'/@ %j239ÒU {q%K?-Í^RZ6x{S-n LKU]/ bu#+q e:۠JK@.GRdž"[:Q2IFB%Plk~×_|(q\cUyvh2%H$]RFȊ5DrU  0I})O]t \>Psss3\BMdg^.`68{fFLCڨZAP}/tCYl 2ե"Ooj3uIx߸Dx)o k"ǫv@H@b%K%k, 0K(;\*jK4$!E8nPMzE1a 11;Nc8̑ RES.]WRI";󺒉 y1xolS 3]v[?[0h&<: BH.][)[yy29rD{8@B 6W 7G`P1A SO.]&}hl0[K7+GrA˗2yM8 gggu4/pj!V7nQӹsgZgmmܸ웥|;{x'V,d4uqo~c,G- icoޥz|#uf6ZMQ qY;zR#GDpjz+.re6S}`Z':>}haUKQ<7[bbPan—n;Nߠ2+F4t|drQIfIl:d&[;}9Kw'|ԡ,[ wq噎ʝkdd$RѳgOxy)_(nF1t07߬Rh3Oa0_s7NCcl8;єV@n`B69_ gƉPolٲETN߹s8&1fXU0ˁkGąs3@Y`dX0UpB:2 KaZ)&M"8h9qqgEc)_Lyn(G~t cλ[|_<]5E{ŸqH6&Z:Dgy-7b/@k_eRtMĆ ;BI%m^ ^*J{4tĻRm+m);9E3 ̔+ҥ/Bvv8{y9pD<#=^();牸 ޿GW' 5}T'x*7'ߗ耰JICBV9n2ؠ0C>K׮Xa }8p^sVfK(h/Hj=wc׮]ԩ3Lo^B^p-ڞī 01 ^'g#M.>;4;-͜O,׻:hڀkce)zTOpe' v؆ǞxJ3pQbL3. :{hJ5wL yz:uV:F}٠!4/er~f+ \n}׀ʂ:gKTsp1~^X߫W/1eB) yqՅprϸ +x6c)@5 g*VMu41C9zJ[aRA<>bVKA>YuaÆcɒ?57кL]:{6'|]?p`?)Tlĩ*\n-FhMa"xԣ{8k7V*'-HAf.䌷'R}rҚC(,pO,ؒ.x 42KbP#{ooot$Qa>Q^j%: ˎTPH?{5ڷoc޼PE^Vر]|aYD_}OQ܎%g!)[b$ZlgdZ.yg_s`cgpԥ lJ`OA w.߫Wf{o4k֜>rr.Hdmnݱ}V4`Øh :T^pTL}POƛzxÎswD"?]/m|3TjL]dtTN-рEɓ'#{Jw qօwXƞ}o5Jػ70`%"dd];1nuBrsԸfk{ׅK\gΕ.Rh&^kʔ)ܻLAƚT9HE@!Ӡ,QceZ+`Keg*=6Jl!kZQ@+Ǝl^:}`í酀 :ɢUAը?%K*,xqRj-0%^՗T5(<#E)Ԉ5e!* dOt j !T%1K'“+P{"C%K@ZAV}&a4*?H\^- U;zr22,i >VA-萧aUtL,Ё@!̛!fXG矲.^bffTpd1nIjԛo?dXbu+Ħ ޝda Z>O]t \`LwkѴ@a}xwEm4}w+ucF#" vPM|qsWáB%/ٻ9YP|d0'Ν5|pچE,Zd$ ӏJ[{( %@ڎ=Y7##]*>rEx\l1;4-d>n1+P\ZA %媉0JJyN p,]_Sc%(%sg &h9*dj^C>EK.ss@W70qHT͑8]y7􀯫 -2nƴ'쨔P UO)?xi&%} ;>(wb JmPa8i?jվdx[eefY*iw '>{.C CdƬΜZOLR]Cw7љ0k#>I/ƒXUJjQL7m+MEމt)чԾtc+McYT[ap޵kVu XV(F 4{qD۸%hN }6\Q-)kO6=Ҽӄ36dQ׊C&^?xoEmǟ|Z7 Й?i!ÅR cq !zۚ_>pcG駟ZUR7mڈH<#[MڸzÇbV.N_}Y^ދ[Ug nWx9}ξtp:GQƕOM,H^xe8 e| |؟תxw!ױ#pz-/WTX# ^W{Dwǥ[ W|/SD1h[O߿dyu20W;"L@}3gbkNKqF$'N#F(d[[[#w=|ȲFZY\Zv'=Z7$.XfBBB*۷oXk-DUMWNCd*R1 f̘a-"3cOn-blYUr:w˗ 1Wπ.H!}W)vrZC}d$Zb9]_09kG m劥h^ m#BrR"nypO Re& 6{dǪQ,iX/!Zp;Y6 ,7@ؽ{T$Y oZZr<fdH.te(FK*l[Zxsѩ\|gZƣK>T/u" &%>D{(ʍ>)pR9͒Qqԉllj4Q..GFyO &OQ@uI= [/}M$cٻw/\Ru -2@YQKWR]Kd>s?PvFl7Sm߾7L+mI֦qɂh,i2 G;M$# hpx#Vijk7y6SQ*jTh꿒faSYq(M,֬\SOa]Q^ I4pRfΝ;ǎv<{%K-y5,Z8p +0"Uz%-yٱAfW0X 3Lj2l{Qy ܓs;r]34͎'ud{FWVԨ8e 41c_*LCdJ|ʫžY@ĝ=#l=*%eA *PSeyI@ zhHpˌǧ#&*JbFP *eʼLi&;#95 {G_C Æ C7R=o,L1ȵmۖgjL؇,}z&L;cWM2鿯ҕkL*( וq{F<َRhؽU&;ѝqӬ.mL}auq_Ye#Qڧ.]t h Bԃ%K@.+.+4S]`u %e/ 2>xG9mD Zɔ[4,j [%K@.s X xжΖAߙ]w1mC4쬺d %K@\x4ߞ)z6yt %$ TåǦ]vjl52:aBs,9i3Xc7$ * \͚5Gh()V*i8ɴ뿪jh:.]]e@0eL?)e(NnD\Xb~YKVy5(șxvEP{Pe||<Q?EW]$>_Ckn?j`*QqޡfJא'@x 0;`aΫK@.NRf[|pYz쉒#[S,+J&s6SR֤T`^_W4R={M; o_[HHL'P~޾O[pSE~2#r;f<\t//+/T=yt 4XR&=uj/y:WGl:fJ5l`rDbs*E#p/_Jt %py%p-l\]\# w-:WpA֎:h50t j$`3/>dJ4 t:u_'gP|}6/Rvv޸R$Alq pMx-GΝkߴ^PPP CߋwB|_"o3gvh|˖-1b]y.ҥ"X\\ztӶ)-^|71MLSNڐ2ݷo[/ \ܶ4i"\[2ex>]N4ߟoY|Gyh_رC{0ս͒ǣtk͜-|[RRRD][_4ѐG2d{Ր^\Ȼv쌋EjHZWG?/2Z7/^ #Y,3 .rH;!ֽONqe`tl=KaY%vMy$b-k dӧOGdo<5 *42# J+n`uskBIA;:ǗdԛoBQqD٘CPbQsgDd⧚2yMd"W_1cp&6=zK[ */&}eotyٽkur|-wV<{QbLX [ (.Dޡ-f10RI&*_NXZQʔ{; D*ݷ7 ^n\Gc*r:yR m21p ݽp.`UDKG9Սjol-N&s lzLT`KL nF?^@?qDeWqvڧO_8\CvTGpTm[y*ΗnX.#_Ε#2mljHZ4l f0;wM|r]t]$sбZAvq=58=91sh Ueѕ0} $Vׯ#+H4o/G7!>;t~Ĵ;R=g w csY0p%ً׆l)q9\stK ˈ3 ~n3bb`r'7h kqRTdrs?xg~@e>㪳G EkRis0J/4s0 xd`I꼻04 BoU.۾_n(hb8eʳ3xw ,oB;Te|R 릗Mi/i@ Çfp ];B€>xb ޏ:VޮxstӚm1ih*@yكq㖩w}MCx tCGs5iE^vk2hL1 W , ܐ ,"P|9!i"W^}-0~>KZ @`U&Bl$ЬaxnH{uMuFw5J$z隀kxţ_npym.Ch.,? 6gzWFQOCSfhcz^$BWk.;1j˗bȰfk ޻6L~;%'=Ty&m\6ya0"wޭ JKKk9~hݺH̸ B(ߊi6T? \<8bo1͆WrR[ޮz uq!ƥ P.ņ:z}ӤzF7PUr{*N2xՠ ن̯aL.G }rh"/%&X_|!t줬VbǏ{Njp-a4uj%f:@>|0fuHO QQQ8y*dž]vag{Ta J}P/T}uP0Pfv$;|\Dު黋K}A9ME+/yx)w L<δ-Sx~lܹ HDQO}AeUL,h +֊.SQQNez h؅F998{&3Yf{PSlRƧA8:ѻhkTws/1Nr:!,ĄigFF߆?,Bve)ITiVHchMw Ux3.Z9ARAZCI"{k|^^&JFza z6l %RMBWR{y8Q=&^[.;n 5H)Ɔ@l뀗F{>B6xlI#R#ʕiA>շhwM\NMI\+l>Uz У~[d =tA01UPT{$ Yq}c>2 qޏsB #<<^|Et"-\? lT4ӷ  '篒԰ǎE@@ }kbDL=ZR{{Ҡl.],d2$p%ilPXogSl RXZyS~YHWHaHOgggP%NOrEaa8ajM w68`cHU"yXr"ٳ2uM%Cΰ:IhJMex IDATue F Yg-FT(7'W۴mJ 6+Wgf;lb-}62Բe+*J\2Iu`0(ڨW6G'Ô߯^xtf 𲧶M&:Sؓ]EJ>*E:Ɲژvlg̰D3C?G5)yr~~xӆk~6AqK>$ e64J w$*ڔP?~-2JM=fvF#[oSGF< cKy:j* UWPyi4}k Tr|vyfˆ㤵鬩LRegΤM"Np͛Fgz КsPo k ٦<lں ={ď?h i8y5d-tYk!> W㇟~M5k°o-"3c /roXW%=0P% &?%MzjkI*S^z5J,W>cښ7$w]sZxQBar؀9yE(~a6T2ͼyy+.ϸ&ғ\qٲb#3~fϞmf`ʿ[Wr8xڵiCySOԟ,Ty3B\'L8a=HLxM%lh{Ə^x ӢE >s}Aܦ -}XdKݛΡK@.] WN׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|>7@Wby**<{yק (V{WT#(ޓonv2ܛ܄9rv7s~XHB@!P( 1u0N*J B@!('2B@!PYI"P(qu tWh"ꫯgM]vq[O;w.q[t6l@ԣGRO?Dnݺ5}5fKMxɒ%uV tꩧRjjjM5ͳ˖-͛7 O;ü<]6mQGē$={ԆQ5k&hw/k<6m4  eeeӵO>$8̤}ڣ>7N[jE .a;;<ꪫc9&M0 |s=u ]O淲aU9'֭[Kڶm,*=vq JKKm͙3G_|Acƌ=}牻M&vfsnn.M:~鯿v޽{w( 0 wCҗ_~ͣJbi}8 k4]bu{ 6Xa|AGIB3۷oO{.ٳg<{vAg6E.Dv\ Yni2<D6pda_wurJ:_U'1XtiDT< (k}^ y v '38f̘aB1%ݐ(w{WD]"gx衇ݻqFF~[zٌҰaD_f͚ g݆9:7iŊ;sL1 O=!\"4lhi!]ױcG>#{Wd878F} ZzHh'wY2yd[ϟO˗/"ErS<` ?:묳hҤI{d28yNz7a׵Tbx իQ^ TB~hHG`/Z)^ '*e<nhIGg yx"%N6m&%86KO?im۶-xc\ 5XC| k3ZppC wOлwo)vܙN>dт՝Z"keee!,-XWE.BrvEC>x 3)w}gPϏxtOp0~`l&Ä&Dǯ`?#cعi\czfүrKg)Ƶ<@>InF ni<VdT&D^^"l%*v˄*dm@Sa_Bj+ *hx*Y;w:V&/$K&/! Z=[ d4n9z^F4|DE;s{ZĜ$4Ż1 2b5*y \6 oc6 ő?yώLMN+Pޅ0܊Ho')CZ`@&plà+vkbvP:,W_`&-qjB"dѣGmQʾ롢{dc%Lt HHMH|\6xѷ nuWqSWS(ս4U1R( J B"N<Y 4@Zߝ~Q5s*+)?' iR+ nRN^ 촤u9RIi ۑG)/+-+B%f=dRL\%'‡'w/ugQZZLY-̬@vᚯ͛7y]'&.1Ib&ɤR2PqYJ3^;=!^asfK= )&`-lMo%l*b8Lb,EyT\RJ ˴2˥X9)]/Ay^Z/me4%EETTGׯɳ2ax~הwl:驧avcL ̲rۭС7f2d0rit]u7 ",7^?O،ʁ` '-ܩ/u?u:.j~s;hͷRnSi^VVJN S׳BC'(1&$&\tRR (NoKG^[!y63]CMr|0GįAcͷl0%P"zKq/D7̝H%Kc(>ٽ"sה}&s_({,1Pɽ;t<޽f.6`<ŧ۞c,3t97bqaj8ENõbXƎ|7(Y'|=x ŗn^ٱ [!=]vۋߌ iΧ̷ֽB3_3f=o Vj6̷BQ=J/ng?NV"6JDz􎺓 |;u+YE{upX N&/^7nV.9..+ɗwp;82NӇe 0xҿ?s8"!=Yewp{:8~?\AʡTu.iH9ຟ󄴃k~\bV.?C`WdnSR3tJ6q]wppn_r+l|:5ʄY,+a A|<[ ^]Әq]tǝwyz8/sf#_{[7S+^&KEd}F_z宵/sڻGR\m0{{MF;8@$Z{^JMq̘3ϢO9MUt5"\I0쟞i .)'э7­t}.d7{Ngq7s&ucGԮߍMVf5vפ4|swg8ב`FAKК5gam,q7;2/,uL[5cnwJEYcvZ+Z)_ʺdrMBE.bQl*- kRPD]_x-^3-,hB@!K('WRSE!P(,('gC( @]B@94U D!&,旇'??tۚ<˾}Ãl; [> ds/73V%4y*_If?6)OK.MdL*եڜ\ ݀pzLcAUYOb@C|4U}bz?a]?y_ȏBhɉE[>4idijLG/ ۯ-Z:880q)TmNN,WiD)(Ċ-62J̊q[)q'UiD0:ZnQnx 4JksbpF4)!SC_d72Af".⏰A+kГ I !c'.XK?pEIq ԯq4K I~wqb93{  1 {el@MPV6˅ cv{Of[JC<"F2FJl &`'Ŕ0#~g QȫɒpHxi}"?ɦ#bκ"ʤGt瀥(簥l(YF7XHqMcT:eƒ"? dR2|+ͺ[ TN Rp ;j"sp ]0 Tdt#*'2qC`q/XkdiH.o!(VD!>p> .,*IÊaj2vZv+a3+V gP12 u?1㥹+L%wdu.?ED~B`Cڠׂ7;LO^"4'm!%~vm"`JKKpy,Ͼ*0~ѰzM27,?z?CiZ&Jz 2)Z _M녭{` IDATDOT}z R 'D]^ k?:;l=dҤ 9w$z?E%lW< }y҅ykǿӜ(Lň/Fۻ^K-ZXY*LADʐȸ-oGt$Nڶoh`?u0Zr\m5Rbx;jǏDnDjER#62ar\>?-ٔҴrrёVD&;#=mwIƭ^z ⶦD̗~АOޛ6ns\xi4h6!\ǑI"R_ʣjQ&/&x11.:$2ߘ?x.aK@F d%0&2Xh233aÆԼy )柝;wRfEg l*t]].;@9%%Qt]7Ξ=y1 f8%U`ছ, lEFF?';Џo^a<݇cYZ(?'(-[Pv]Lrrr(77W*z7AÆ]˩ *Kaxڵ5j?3~;ws:FK"pH@;x31kם &ߊRq 0Ɩ|. *"/(ߊx Le-+"e:rpǯ0 b0p1'hqؠ9c>JOШ;Ϗ$+=1r(pp=iL |R.=Þ0jVZڼz u^^G r a{ _fK yZ {F%-G ]iM^rJ,KEHmik\P6~l-M(蜓zҙg;~{۶4?>p}uT3gi!T\t85 'DvШ7Y4tЊG7m7|㗛GO<8Ӆy+^i긕OI!q~";8; xB={jr NgϞRN; 64iLJ_$),N H"lѹs)JįKRܕ_۶h%Io-Re=dZO.$\ԌH&c;K3w*]dlOJJ.fh[FF˽CRܕI?5iiiRƎ7Rjj=)GpD,]8$JkFBI\(SZqWK^MMJavZ ^}(o|%U6R6c|UVR&Y`\2XbHrE2[~jvB@!P(j=$TP( 'sBF]W( Zrr> U B jsr֫" "E[{f(EV8RD`#b/WQO=? ӯWXرc']ӑBCkV&P7Yt֭[E!-gVո[??B,EBltqfċ1œ!#{fs*.2P ]>O&~yyj*)]/Z=Zш߽~oqjZcJ-J_rMKzY&`ł͢6Z.Os.e&˖-4upfeK le◾6K7~HC=SaXsPN递ҩ$cEyx@^1LZ( xI_8Oڲ&ǂCf eE胩hժRi7Gq i@Bl+VݻOtQހ;8.]iJⷋ7o,?alw#Tә0;`6)ZGùx >}aELAi\xѦA;w-[GẕuwߒlNܻ 'w)RV{H:&vhCĀ>Ŕ_ZZTd◗I#7lXOW]=H0RFzMs,b֓ >JJv)LriI)mݺE r''OK89 ]tӧ RS˛6nv۳y:)4o >1ՔLGO@f1,[JҎ"-Ȫa:MB*fG5oNlmN'jڏi(՞+&'`(p/rA&mCF*m:7K1ܕ%p‰Ԯ]{/UŽuxIA~ܹC*~NN{Ģr''ǦE+˥ulJoف-DTLD^t$/Lx|Tdߩ[RvD26ϟ7.\ 1tιJz}"ӵlc391OgxAA6mMJ̙w)='KY~5X@ZZ|3<.g~t =ݵk'IׯoU&;oKª?PTV@%̙͕^>]z ''AePB@!PEu1*N B@!pP A* BD@93U A@9HJ<5"'h9~ >0|' O4k%<]0F0X"J )|gmp0\lY؉2a}V:9S٧fĿ~rhTf_D@TZ1xZ"D.B Ky!.6.d2tz3KǡxmO>H,5)JFQc]fHS"/0mNLի>}^umPJԡC#7Fӏ\K.҃Zۜ_~ GGjmn$~"aC Ղ5?S "ʍxFJZ<`ba,322(^ye(|'nl\wV IY8IL]YuM]Ϭ;vlW&@LEt7;:JǺ~^UjּrIwǎ4ud L\ڳf͢‚&cƭ[֬Y-"5zǟ g?R k΋a7P:+u.a; S/ݭLs7S3dv ?b<lɦ5K.\覧nۊbE~BrlڲeEEE2A+!׫_04ff>܏( .蠨g"Jvr-ϥ@^z˦ kR?@F1ˎ[ kۡ?e={Zv2 yϬgefƜ6PoM|JLJ4ݱ? A%Xfժ?=?3^!S%z_@'qrGJ@%HPy',ӻ3Qkذ-(2 5/]p56i҄.x7)<Ӑ2}26#J|HRR2XD~"l\ΞFHhD3&PRT¼,3r@R~^P@I4 mx*Ll+gslS~l݇ nTV^fhHo<`S=%,wp6')Hxm.VJu]Z.2z'tMCOQC9tw ZL**sQފ +ܕ7t3zutI'IzM2gKA* Z/dtב#U`sވ5eBVxHqt'JzM:lRvzO&כ<{wW #c {sF|.h`L[oZle69iK+iʫY^lKRΗ}ir^ǒVQ +^p\`wAt9 v}:]'[r1rxVǒxqڎ{U`m_1;nQw@R^?2EeNuP*=X吪-pf:1ڐW/R( Zrr* B@!t BV!PmNSd#rMxXXjW&m>U?W*~BʬڥeqY5:9!U5Y?!tqaY'dyݢ5VxKW->4M$ L~X39-T,*,X^{=|DTBU/s~gP3RM9믿6.,!0k1dU^g&N&B{3~g~. -ZH~0],\ g1,qd*F*l1\`Z7(.1 oU͏U{6hLGܚ vx=E]d]m-95| _WaCMb0=-o jc:/ZFY i^Jj범D/?؜\&Zi,-9,ٳGwܹsNuA법2gxo> ʐc޽~K``] ZO)xr /^ !WȔc"4oXGL% Z/! mJ7lSǎw_^6Ul;)1icR؄m6wل WȕC65?"Jj$,VebBK& \>ZggۤpÒ}t۷8so s@ҸqŹ_D^yUk C#"Bn=YZS'/O4fR^ |)Z;K/B {ў6k֬驧E[o_ԅh`Ś"h^ڟ/Q! <Qus&Ex'DG<Ŝ&odUG{3)Y%޺ =G.~p\ n%%޼N#%1a˥i˛Ҷ:0er^%xui^{v83z}c## n#:^Sj{ނ֫^܊C_Wү8E;R^LUh^yKRYhcJ]Oɺ?$K»~[D®Wɬ^P( p!\T( @!\%2H!P(…rrBRP(QrrQ$oaiRZ%Ė)QT e ~Q*X.z ꫯTu(Rv~B\ts=R(%#L!e4x֥rr ܜ\>=3RWRvpo9ŖauC!@{@CX,Ӄ?EFݰ~=^A-;,2u.b Py/eRL* $[;؜+Y&\Dh? J;80:w'&! 2=V&a8IȄ,+"ĺvB2~|2m nrp9]`3eB+ݿJ_.JvI nd5G/2O>$r%ybf<DJXT#vq.N?xZ/83<%( Aծ];RZ~Q]\jS]uq۾quS*,*My=;lߡGy;֯K RMp("׭/_|j B@!ٕ4 B@!rr) B@!('WKNP(('獑P( Zrr4 B@!rr) B@!('WKNP(('獑# XzuC|P`ooŋ{Eg` ˖-7|Cn4y3 ެQ:Z ^QOV֮]K ,}/K.Kv3`}ѣ}t SL;vЃ>ߛmݺ5G` F 3 EtSff Q-γ\s:+p+UVҥK騣"R`ږV\I3gΤ,ٳ' 8P'4/fm:묳Xn#h( J;c}n/O@egg*=\C1q|rI'{IaaMNNׯor)vkjk)))" , ;7w~]Mh"=&PcJFq|Gk̹+l+VИrQ HuWV_BP3|ԨQ#:s`ѭʅ~ĕx \Z;j5kc駟N'NÇ;uo qG%uC GF/F%7+N*e]wEW\qt/;3TB?B=XE0- sXn7#nuQ.]<ٵkNݐGy$ߟbv_8p~{6Edǘ?,Uz'p_Pƴ 3g[`wDR:N@ zJl[nŶ+=P!C:ƍӌ3ǰc: ]}ǏwurшVܹsmhqi51BZW_6`$tPz-B $Dlcնm[Q6mq'*?55U`rM6|;#e]ztyF[g["=5'x4a!xG&M4vpwk{/{Zոil/zו|hƎ*ioOd&d>R-pWKTx,M6%l6}v*%ѝnym{뭷O?$0^ƳɫE֣~]E grV&;;q k 3r q [ת f5!^x˦0<`1t7A y<M2"ʤz&t_ 1SƷ[]p/"ay OF0~ӱcG;vc>9ic8wJ17f fAn*~$\o۶tmWx^x?Q9"X7 u: f,ufbK/k^~H#ՒN.bC f +EhM}lIT0xmv &|gRc0#r޼ydq=8>"#fjb׷lbwז,Y"8ê(pd H/UČ^88|0Y`y,7|<27'i~8H3U @tx͎Ũ^*c'x \qƉ|q19[6xƭ9'g]bbҤIwOj(N:i\`MƳ?E|;Sqv.c, <9b̏'hVƭEO?kra:9cr/8g+ĽW^yŸfq3nxuu-]tEbb4{.##0\s5xQظvqkL8;0dŤ{Qhω'R+FfO1 uƑh@1 /i<&BG*/&`Ƣ. K|DbIe_u#NmuӧGcdݾhĬ<}DST( jA@uWV % B@!P('Ww* @ \^P(5rr5zB@!PT U %c_9] j0Y^/vomƧ6 dm8ydK#tVÉ]`z.x_S1e%<\VMUݶ_|A { kkC~tt]=$`C\L3&a<+?av}LFO)vgRBZ!ȈW~P؎Dڵ}WFҥK騣"8;l.xhܓZJ2VDx(9䐰c tawc_NZH~vUetÕ\\SQF{ァ_:(#?-_\`W_=Z\c8* FHO>Y6IuM#BawtAuWJUB>p @K oĉ4|put w^'ީVUFA{.bx]ZOwl} h4u 2y95^H˝+4tPk`Ag2 ov6?AAy*' RZ9s`G'X0>[?Of1 bDw#Ÿ6mZ.x7݊#s]wpw1̙CNv"c=+ ڃY0~i݈sx/.BC=dQo%z :{׿[hm(Х8ϪrrUAO=[+5k @'L@<%Ώ?8qWwW' )(asX2;CԤy3}D-Zw/yBn2:vڃ15kqP\J~BW^tm#,+?`-x\7xbZj|rWԜx 7N"xT5?RA]`̘wݻW:y''$xN ]￟]F(NO%|3駄ު){Q C 3pnv]tcL1H"G%2 |8}tSU`BXM ftZq3ynݺ&k ̂5ϧQF4c /7?1yKc0· ?0tM%%'LlX%**qu]!PnCE/7nY#>rasvГ7nGzDBc*1r0T5?q7_;D͕G#,e<'W8GB51[p9 h]ᚧq -?p.4n2LhO/8-bP0.Y UՎ,RJO!AFJFD4hr\RC )\qPN.${ B@!PWPKJJx( @qtCr6oIENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/laplace.gnuplot0000644000175000017500000000114012662210366022332 0ustar mbamba#set terminal png giant set terminal png font "/usr/X11/lib/X11/fonts/TTF/Vera.ttf,16" set output 'laplace.png' set key out vert bottom center set title "laplace.py Strong Scaling" set logscale xy set xlabel "Cores" set ylabel "Time (s)" set pointsize 2 plot \ "laplace.dat" u 1:2 t "N=10,000" w linespoints, \ "laplace.dat" u 1:4 t "N=100,000" w linespoints #"laplace.dat" u 1:2 t "Solver Time, N=10,000" w linespoints, \ #"laplace.dat" u 1:4 t "Solver Time, N=100,000" w linespoints #"laplace.dat" u 1:3 t "Wall Time, N=10,000" w linespoints, \ #"laplace.dat" u 1:5 t "Wall Time, N=100,000" w linespoints ga-5-4/python/docs/scipy_11/papers/jeff_daily/laplace.png0000644000175000017500000001263112662210366021435 0ustar mbambaPNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ߟ___???/n"IDATxڪ Fi߅7Gv>QYȌ gR~al.'6i+}cf0MU!,X$FjռCwU>0MbQ]8 vf 4㢫F-_)nVGuܾ,?jZ#6S˫nޟ}e4tFmhn'xskfi? Q㭍=lY=`jmuUm{;T9;@=?W;q*#K)`z|J@+]nSXz>K@ov|[_@p9t7Hu@hC;l$,}JLh6ffLrBo:Vދu+Jj2qc:d[Kͤu+qjgfL6}<^2N`uK3 q~O͉[ ?LW~)$q4c 3b%z>桊we2= =ޟ>Uf5bkSЫLWFߢ$ ]Tm33nÅvۨ13`_~ڙt3`hj3θanU[G!wL6# 4Xب{t@0>kuc`=m8.vEX@8ڛ};zզ[G*ȅKIVnoP{GjAjrעczS-fw Hl}"b$$X,";ucqg7 B#)mpInHF?PAh$ B#)mpInH8 uFR9>B#gLoS BzOX ׄ*8h/5 .Lo0D& 0E*I.ӓ`)I|``j&XNE 0\7L9P!H7Wc(Pl " M: ,Y&)0 " 8 $F! S` 48 5_v?6)0?˕n`b@""DL,CQ ACQSe7  Y:)k8K6'K[!D(F|#",F(XAWX!x9SҪJ*r#o,+i.tDI/%!kܥ@y7݆{ A+%7@So #3 AxO!V`H$ _>㜖y+7*Y̆q5\z}q4vv9Hz. A|ߐIIn9$E@L#AKh!3 nIݪ'@ "Cݹn &^Rl/D?@Hszv;f!WxƱ?{-pDmŻ쵷3kB BpW$[UvH=kB B+gV9`RZEj^z@3b(n B#)(pXaBj4P`הj_{.J:M܆ be|_QT-q˳B#)- /4BޤEKB#)m^)4Bv)~H u{g#B#)=HIn1dYFRl6ŮGn]y;jǕq:3VI/$kBR=%5.Y=eX|H0tvFKskvFCpVuWi٪A-xf/H6\~ۃ~gSV}$5woZP ؓ<#F5(HIn'G PϓMXh$}lW. PϓmK/]X\"eEA5 9H̱s 8='#=[d7>)гԁr"Y9Q3Scpd@HVprR 0HRu4p\džnX@a˰0bCt% z I D@B#)WH u;<(4Bݾ In_p`FHV "B#)틐We]6,4Bݾ;'d ypc~,|V{;!@ݜ&Nڸh$o!?6]/t'hMۙ]"oΜQ=m_z3] {9!sT8/7ۏ A., z nnV T~]a\82z)#TW0 YHW/ `o(\$ B0H2L)Vcӊݩl0$uvInGb.`0Ҫ;O˖Qy&jDh$4' P}vd B#)itBGnGfV^JInGƐ]2InG\InG+5)4BNu1! o8 u;U>iҿړ+ը{tj6q[ޖOs[Ou![a,nړ(U5W% cwS՞D`U{K 瑩="fW옺![a,nړ(t?dÇljO(E u{lQ܁V=h@?=!k$中 s se/>l9S)S4 m-o'M%<\t6i+(WsSRm2G7(jXW+?bc#iGOOOT&{ uek$,ǼDTje/DoѨNwkOx_nXe>TJ{RgJ@{cd5-4Z[pS#Bêk2nkc ^֗ ݻ:H%B\/hC쑐u+xH$ͻA4wNc~1Ig$? @سaV#!$cjFB`Ay#u̷OZҘ_)6Lq{ ~۴s$֗v <:[4xBѵN֗v c-ӗDӇnѕոb3qgNQ5=p! |b3q` my\/鏃Vk<]Km}iL?sDZ~ϠCSB`m  ϵCzC݂iC`'KWGH? fVgm/c=?]Zš=eȱ`?1Z[wlߨb ?H[#R.Vxuk%o)X k|Vo|;A>>+f8Kq~FO>+x|K.rg%*o)|V3^!#|Vok]w_Zg%}J,Y |[?`u׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|UK zX(6,PQBb,(6]P "T D:^Bz=Kd/W$~7ovvy?=p,t1annnnnn / jܠ6w;-----pZ;7-----b 222 00){vv6*yy9dffBHH*/1899FQMLLPEbzz:c|1994ibdqM6HJ8wo^EȚ 999аaC 9 aT+W\-[2rvvfm|PW э9tk|}|UՎOJO? }孨O>OGrէw%6!r{!ԩ}ysβt:0i $z㟿T`jZxyzym۶t*IZFzJeB{$TH՛ErO?]uww%µr̚)DlNPn d$`УgoHONB (AH99AW 9?jٳg-beΕl&ŗccbrxI׊2߹K78u,10螻DL%y.N(gISH_{k7nÆRYɣ55j/9P#%6l\R֯pϝ9P_껿S?sV.ڟ B6XEKuP4|5  ayT DD;wRgbrtnCA.fsb Xt)̞=[Чi a]$yIJH=4>$ɒz|~gWoha&Au=  zwprDma&} '9HL-/+S!ͽp*]S#;@ߊ.Cvn}':trU22c xwL;Z%b[ZVИV ꫯ^7ydo]3xN}0edc)YjvV,4 IQ~YQ62B:< 2 tl%'RHO.g^!0fwc`ot*$'&%`3aй@MvGfCn8.]ǽx  K` 4n[E #^HUCp`HUGo/CJyx)WIٰH, ݤ :+J`̦({aMG G} p)_c?U(;b :-Y%KS–iШcv$H&Wo*hG2.l}٨¥ 9-̸A>/A~QHSqq1w};wQbrXz%n^[&@t\_5$Op[Su7_h}Rz|r5ņG):fv©:e%"3KK;,~ *VyXY,~:+p*) c]뱋GԲpIpFzѕD$F4h(;$e#wvT]E}8 ZrpwU &>};dPvD]:T9.._39_~1^|i,JTqʱQԭD# H; JÆ: :n~Q( _x/e=p w˪\Ndii@#b칋w[4tD`9~4~=Mm[شxr0W&UXލQc֡cgC~c/7z=Uy3z3w C߰>|FЭ{,x*]BX#"/)vj55`+HS՗d @I(Z.y_^;n#"Y] Ō] ? ]yhM#YC8#M*.rF4YaҨ(أP\ 2Oq0c'By'NOл5ud>ihsj] ~fڵS~2>S,*=m_E C..qiCA^.0n팼Rk K[T cZyBsgH+ c94Y]$S1&W;IL!Zck{Сc䊽PZcN'O0g[n nPzv=d$e ]&NR]c69= r Ӎ`:I|4Iw 6 ZŋЫW/p K?NW %YS W Ӎ 2-*_^I'Ժ}Q9kDaPJΊms}k|۶m0Mk )ئ}T3uU-[2 ̫Fu/~PSd siyUx{pǩJ%^֍G㠹 Xk֔ϝ;{pj\B:3{5S#q %ap*j0fːĪx !hR@>)QAЕ_NzP\]${%y)-g}hC04LV㱂4CRgF1ȉ= y:R/ +?tnhZ_E][t/ZӐz4mp8䜀n];C+,ۗYɘ<}*2c#n1@sjG+?NY*4&83 ?& E~go@Q.];iQi AXHW "S'O ÇteB|h+Imޢ?QW-w5Mcf~@D|&:}55x 0kNseHefLôN;Y07Ly] 6dq>{Lݫ7#xrF敏U{4gOSWᾮ|W5Sƍ6~2R-rz 5fNl9:SsR"-bQ:¢d0J˅X6… d <xg͞+vq@A R#MjlѡxprեL&U.S@ɐp']Ð,R\-h|[Ay=b3n"΂`]k,{nzȐ 10%i:;Ca/m^P܍JJ"سǶw `g[$l2@zvö1zmS"3|L1R T+a>On :oj, Av 6&!9cK`Wa+n)j^r6CeA׭+B@=i+[#:]B=#:4!b>f%پY(cʱg Ha4>켬Zx' '? &_6/Ki4{%\p^U5oj} Uf6bC'* "Aψ0XFSyXG%Wct=.Ԋ] 2 1L!9fh@WǖÓ<@+3TVVVGN&%А29cƾß Qg.1]bYb> /FG oIHfivT;ʐsKN%..$TK)Fx %8P+t.NLJP=q$C~Gm۶Vjt ?Y74 ?& B8 a/p"AjK AC;Qfzt*@bG$5di{k&#MG1sYm L cl%!8W~zƷv9S],)}۵kxOaMO\8!; !!!p .$f'q6J5NۧK0~V)D.t 2X.sN$0BSΤk}"!\t^X,#&"4Bk (\ۼ!"+[F^ޔY (- M6cmѢYjZpsYx!xG`S  C=uHIe7x̢`0:9D'NFhusV~Ie <4-֋6n#e#g#kX >=Sīh [1΀3}yS21 Vt{گ|L?t?Ϣ.Kt^0t9*&bvsv?~U-H^7`/XAA~Iu e2cU稷ܧ"'\Hybo2ێS祵 ' sxoBl*qU^JzVrd9-Uc/B6kFgC7~UThrݜ  y\-i\0-SwSuCt Q)>!-ihi*l:Ыgwx28Sx۴=z KpF@j &7( ^o(WW)i3_dPbI|*R*/1mlHuZgp뭷TelGf'4`F,႙X& +:M"xbZ8F™u%ri34,h,W#wb?08,4sJDܱkbWqC^-O8Rr_wque%Z!zɵ' |zNP wuS ya@JP.O^ C˂=^7S * ; DmQPYħd 2̯)kdϹ p'yFwn,;>JqE!ml@X;@A${8c]nSTJ q?*~_9'.,,C7tj4>YUj2^<2RS3)qXa'%1R׌6ڷ}uϬrt:rj@uL~Zռo^kuY2rRDmW˖-ct=aXA"^ yp1+r_{{DONWmSmlKKMw6܋q}%(۾/ל ~[}A^n5v/آaۆ۷|kJ2,mܔX Ya=D11WavC Ɯ*C6vAKK HCWbi*̚Ms!5|%<]wݥ8pU hϕpFmv#+u{# |_ǤJ'h<cl4Um2SjǟU>ڴYۖmANB|CSvznca0Ï3ܽǑHPW t 6֑o\79>^qf͚0[j D-DBBF{鯰Fm9q]*@wKp$B;a1uRP+(J!=@T<@4@#}CtfJ|[Ω?B)ԗ@鐡%J oG3c AYp 0 UhիLDQ=8F7nDؾ}d d==aw!h\a5J= h4" L3K:G }iɸpB}SOԠh8wz5_RdC>,7W[|$BtkMH q`GM#NE$ʜкu٫W FɨT/JBDx1F"] p3u^4 `pW "fbL~336ѴK ѭD`B.4!)]~y~V]iA:I0?A&K\ 1v`ḧ́ĽB |;r9คD4U \3 <<ܸ(h 'Cu aDRIIICnv[(}wQ1m $ O)Rl}SbBz)& Ez^nMjQ*qDs+TE):B>T Lu:yRzCͤW 5r?i>iy.տX: ?qK|U T3Ua:},SCE0lS\[@y!! T*aYN8]й]|Z IDATL}20\ݬP~ OV mZtfe _#z w *t %'@85KʁUASӋyq"ªSCF.933!ԻoPPI0e40=zUPPq<DRl`=q؉z*_)ŭ ˆaHK:hWCE轊̈́{< avkIWt()ʹ1Hwt@;TW5+)CwacBg`]D@h.^|&cu0IxS%µbh޼>[lUuвEsxe,K50 VWfv ag36j3*_ ܧO_`4 OC#$va?a6بЅBvzd¡0¡9#G0k6`o9|%a=i0PBK@I16As+0U#OK-[Y׸` ٳ'4;PҥK`rc6njV;x>U^Ma,bA1B&vrbI몖ȫ?L~0h3AS^&+)r 5nB/9"=^p3Ӄ oJõpa K гg/1h96ٳ׹>NlLPb qjަm8Sk%b6|G %3)Ƥ2hk*w|ޮGgMyZ`gE-]{EY-*q p p p p p \N5ظ5wjnC.[[[[[wDt/;ɋp8 eB:sV7`+VڍRb͍rYYD{z뭎*m@RP~h:'nk,;v S|ڵkmjRB ^WD](7<Һ]ʫI!ߡ`%5sݚM`ײ}/*5W@кqwWz0{+:ީgc{Ρu-K\0엮BQN"bx$)mڴta6$k ЃGpKؼiCX 7x;lHR%@$A^ Xޯw|p/J@ڻ I'lݺqD(0 9XJ=s"`3 dQ.'q嫗OF[0UV1Sc}òeE.k4aJ`;|>ƎE ;!uipHPEeUe2@jy%AH隋PFM3#_VVk#A]Q4ߓ-a ^(|!tPde9*::-<*(AQ1л ~ 68W1V:(FDJ`k=wAEE9ر|}d;j`\2b KNBڼPQY[ :t[`BtkX/B0)X6.QIZI>Dky"?)/f/D-T/=>RТ r`Eg\(;#f]\2#)WJJ):)i@M,BJgN`s0$ !::zqyy @S2.'f0aX OZTTM1It >-Z"[!?6)Q/ 88XU1gIćU!r(ܳ@"o0;M h,gg@ eli6xelF.`@JY-=z꣐!\xZu|RV@pBߩPRU~gлrEw%S vUi*ߚcZ(ŏ۷oNJȂ^PU@ˮ|S)wsl}Ye!4h\m۶vZ|wΈbq64J>w)EI31jW0L| XPnE]?~w$k׮pJDK,Qb1\#CA iJթt2 0[UzRRRBLZƱE.~/\ p ,Kw}|"lbȣt!U5nXMFU("3p p r͚5LR$=`Rt=zOcD%bLW^^.PVAS˗s!w$h}MM iA ݈#^#M8ѱ[r% >\ht:h 4GόhU"sq?=/7%" g: ^?զFX``jݡ5ٟiR= G'P2^j <=|(( )={nV h0J;KvC K[JԩSa̙Ld]^{C|)lŇ,'xTa^p"MеMRG{\Y?w^m>RgY.4hUmH~d_w(QNN/Yf)SLX6 >RDSLiB4n~$˜ܦO> akg. <%LF%ȗv,d'qa+|ᇒFy_yulqtnsyI'pCNU_Qr SX嗆 CX㦲N@O=ΣAaR ʗf==VeOG]n"UXt1|7{1?5A͛܏ÒB^mMir͉{tlo&@̝3;#qMM2|̜5D9C&\7߬=zfD ʋuC vtp a.i(_ ZAʊ]U*h Pr x5-.h 3Ρw@Xx$$$$WsO>SC  6m&Ys&atStșxehy ^y`8D&GtT0p@Cj&5{.0w9ph[5r g^&/Nw{Q%GTtjB@nh{9%Bz;U|ri@V+*̜5=g.еKW)Wu܁1WMIm20OEi;tV2vF~\xGsgϘ0[@V ?>P8)! {Kؘ(L;mQW5 NHZ kԻ #PhQr(3rr믿ers;z T#\J]BWjh7|qgTu{p9XGf`!>>޸XJ`uѸc䈆,&>pĂ ٧0r tjK`Hɓ]{NSBҴ>عsL: .HrTXT΁ƍt--}['8@?(l& ay%+ZH/Ύ]!?[q qԐx@9@ԫk_T:vIEf0I^̘iK8*&K f7O+ʵ~z .G  w&O"l#r ~ L:$rT?V,_;z;u5a}Wa0n8JtܲHؘOْK?{@Ѵ iݽk!=;'GZWt1~5P-56.F ԁarDy(rӣ#0ǯ+A$-J!;5rOBluQQEd\pl7}ey! 4/A?jDm#>swBdG(3M=(Z Q5v̋>ktC:)/]59>L4YyɮaEw&ਝQGh5vf'@X^z>|A :4OW%P\dSw՗Mׂˠd$ B{, i+ 8Ӯ=/-xQ۠/"">RpԢ*,E[,zp%.h\ j򱤫=ba3O}]y[qoXCm]k]S q p p p p p \Nܸ5wjlB.[[[[[ڴwƵ+ĮEF--pZs8FV9*(c*9٘ύ;[6.ڶcJuWi9uf((TMGꊊU$>"kۈb#|ذaTԦP .wdՖM|u+blmh@`HgJ@Ǵh最J;)ɶܷyi(6'O(ն]礸Db՚K} eU>bŊ/HDw2\,blذ^D <2l6Eqp}1e&+w=N$},ց40絣 KW\Xkp=vS)VXg e(6&au"8.RpǝyßWUh}VD:!*8z?TMڽWT3 WW_"to:m^l̙= O~h79[lTQ8@T7!Zz )N6Efĭ"kF7~zUI%@t۳ `L1Vt厩_CJb#,_4lؐ-3NY=MýW>R<ׁF0cR|WgJ\8"DHz-Ƀ/(qֈXyiHX/ ڸqRD%4d"{4ċ I^KQl;(*pG AtOzAR(%3 /&"*" +)V,e˫$_l4 [G\hliBE=º037a&tr˙y˱!\~5M,JO5𛯿Bp=dQ;Ydg)f!-D6 /rA!0Yx5T},rdu*/ `HW8L/F`#\Dbx~7Bac8H588 bbc$' t5:Zj.u*_eRPdggh1[ qk„'4 /mR*56}Ii88Ϧ+}bVjGAv&{wzNbw1R&?UoI}"PW^Z>uzK[xMebȢѫۨ.J Rtp!$ղYMCO<^PU%/?"DՃK]6It($]De/UI3IrBc(3a?zh%D +[ZC?А&u@/#U+---ʆ3C|Rǥ8eDp#{0xL' 6Y~`Yތ(J|u.kme{¯9#_3 ˢIچiw tݻ73l$ jlb'E1&^-Ac @JN L"f%9{)S/5чO>΄ު& .@I418\μ>)N?@a:/r: Q iBW;WեX9[v:o&aBv:/.Uk޼9 p'5ECB0 5(yMOԈbwS1/_x 6wނ N E~Pcms~LؠY496 k}HNH}krΐr.˫3dOC p'Es p p p p 8O-----PN@wy9ވԨZ9LNJ9u!܎uQ2G@>ƍHZm"![aCE!fUKL_cԋ#2eZ"^UU\[fE**2mkkn333ql,WӢf[[Cu-m>r@Q"5pp{aJr.VRMQHoi*UacacoܸQ%e+̤,HjqIſxl]ser2 1nYeӍu̸ v4**B3%5qUL Vz1{wQPݻa؏|־n?o[h%zPJs6(:rMsA{j۠rjNF}A";wjO n'$Zn-G0AH̚<=.F$jX{ֆsB+AQdu־.D~XZp\폨&84hj֒fD͛= mʵV굓@0m۶JATg s>B>J9_̟7ܧiaHp?x^6ܶ@~-\\1rtd?+D#,$$C[o3h:ʶbPp (I!99??ZbyEH`kDƋ ad"_XgfUj/G -X$ &Eb /ηȥmD{ R_ LXpI.Z0U C!X[\3OH4K(" /Mdffop:Q&΁bu]baHVix ~[gnQ=FaÇ3O>c3 TyYЇ"#[ pR 9rqh}T)ӦBPHWJә(i †׫5vж]{-\u;X4\ouԌaԇصbpV,@;E@Ҵ~ yT}x"(2RɊH'ޮUO1p5IeuQW)zH#ۃ\?f~}[ߣwyd/!=Jw :*T.2 1GLȑϪOPnj}6W?&YLA mbV0;%4{חᇝ>y+G,yC|4aA\[b`aB 11BПLzz^ď<-FHW9^jB#>A9s,xyI8D"nOETu|)[Q#MD/)/(Kbr  ]͞= x /RzzIv%}ѢLzk_Ν/~|[J53 Ԙ,|?1TU @9$$F~QpB4m*@u늍@U^ZiFPbvR}Whp%>ٙ^Ži, (C 92ԦMpqB3љAʶK-Å/@ȎIvl4خ(joѳV$wbn{C e l 2!ҕI^$.gRqv=vXdkr1:biegCA/U֏FLFG坿z5-lb$OhaYʍ:9ٲ" E ΖQ=aEX.)%^nGN wu}xg]!5:Qp[@+el[[[[[[-~8\5nnnnn󚀺Tp\ c -EG$VmQ:D"TċW0H}P mrj*"Ֆ\@X@q2W$rpl@\l,|So2\ `CΑc bN6]Ÿ )tlhp!&,ۏmlLzmM[i WpԳ\+B H8@Ǿ1p=4LJ9KeJ+iyRrssO) NHZA)hLWVptK~ifN,:1;/ .Х"}Lww- }&ZjHv2{ l'*Y'TJq(nI8L+6[Ͽ>9;`[>{CA۶mؘ4U7|75|U,Ξ[ti ̙ ##PEP1> xem?7|3kClL(/~G=qkd-PZ,FQ9k"kmbUO`?6ر#Kia_|¨QySॗ^Uh MM5d*%[&88pc$ݽu&@-C)-D*d0Lvd0S1kF+|8ZԕUV}Wצ D%%`5h ࿃iJw% k9{74pTN p@v)@ZqF[l 6(! /"֯(15w eG\AIJ6:#(.6}꤯\Kh /!(a捲aqM&"azIWZ$K:@ CO@QzԓXx!'6r6XsYe U^Tue/t:#*Jk436[͎s­A$_$G}|͟ m۴U͝{Re!F =..Y&Cr9ՈP&?SGAJt 6;wVu˖-|~BK= T:]%3u+^ %oYïy 1L<;udvp%HiSrUʗW75.q,;F8n [k+!#$Tj~ͅGIv"۸H`d AbOiG]߇]|Zl)tFf~{UIsQT͊1sA *li- clk@8$߾qxzZ2UNxxQUSkx Ͼ  !mJnt-JW/eMF܊*--Nw BдioY3W2^PL__z05O^!CoƤ+5;( <~4OjKF`/s~C*]!W>'R<a[0Yeà&z.&"U';}D7tj[jdYcSd?* jtCCG E~j#TO>-"-Yt~I Y+ɤR4,-:Gkcbi9(x4n8A橐{ ƭa$zxBŸN>iahIRDM0* QdVGm9Rtc%H]HW^yEa3f*kslռ/4!fuN +|+Ce e]n<\8pM/n 5=%>Qq@nVea>D9{CYSYa-;ЏK;M֢|V=8bb24 7%#g9h MJ->m5c$ӎՠ0?,w7zPhez *Ia1(kr-$4T9mdHY''Xes 8hJ$Ў.ʯ[p[poT]R+rnڴ@I(M=oqm:T#-MNTu(_逢;ceYW*~ݞ2A@ A . -H7ߠuyp^[N~ (?p ]^ԞnK ԭ\ A3w~f!'p ԧ2wuk[%w.(1EJxڴwbA#>uAm^GƠ ~f;a_ =ƍjPx p ԧ*8P"C5z`mFPąwb˧j\H0ʭe 7cTruzQ A[,+@ oƥru)$Rc[,u/Ứʦyʠ;6wŻ^7 4[>- T$rVkѤ=k*e dGX]zǔ` odP$46c [>,G`σ{hy]8!ks ˋr  ՐiKB)"]|A-/D7u{.>]0?9GFp Y }`(տ12g{Ҵ}?(˴MK=ln[ ~8F?}JGOA|P^i8kpUQPi/q&Ϭg&j8 ,{&P=̅ WÇ'4HMM>TL WDuPr‡Em(c* ~J 02h!{Yn2$ʧ c I gdE Qx_ ;^1B<(O!%q (Z@vR6N@SғO>)@.]ڬE N,F#@XjE°{&vI~PbѰC»L#x5G#~xm},Y!Blz6*'EBa(/ Jvk!8oV8{ ('B5΢)dRD(}yY(:kOG㐏}Y H:BG^S'ʢQuc Jɢ]ZhS:H.>16w:8EpHIImbcw^Weɵ lc!_; X+V#d RW}@kswpQZe,ΏQ1gWN , mm%qp VWzߓ{j*:$j'ЊC8ᘹ*"iz $xE;!?W(8./@#ú`8+=6۹6+!u (^Q"@opöAZt+.:?Pm$ ~v,Dab`HkÇ [-=P%pi2v|S\OI!rc i>]4~-P[31L5k<{aa_D \~A;p'MI?܍C ?3)l|ݐ̩,@=!"T >4^h6zᜂAEnAX`0?,NCDa`\Xpa $mۢƗ@][08__4oxVs'Gx޴uhtmo~y_!?,@ c)H?2w~*&a/@Z@ 5`yC IDATJLwm)ihq0;ċ P{W0C٩0zm~-P0XߎH_o F /P %lhا:6A;4p #E>mJҸ`Gx! GA@4p Կ{<#":NMSQc]'] ӣ%34'ڃX:?,@aM)9uzi7⥇Jt p (p hjrL =-gR|;?qTgWKd5ےe7 ĸBxI $ $$S10`BsȽIlْ{_w]jw5;V{vwsn3wf%Q{}0@]; פs`KAߥ y9}wl_$x6UʾO*KIW~W=U{QVz,EXA zO{d@2  Hl @ɀd@2  S3e%ɀd@2 m@2 (sAbkFرf͚% =%IBBB)cǎɓXb644@hh6''w:Z[[ l)T>"##NuUI||<~{vp}޽p jj̿FnkkӧOĉj~@KK&ƾsp㍝Ufg!$iLeggATd XuL G2}v FkW^YI74􄲚&t)!4L6<.^Aq!2*Z͜˶9`@L Ƣfh,6%''s$@U:(//K T+xEv⊊xQD99`8peu˗C=P?xc?]pݴXG9}OaZZR /_4IdgN3ɓh`x$Ì#Vmٳׄ]: 2vsP]SgBPpϖ*Ó #^kk  Cg` mQ9.jk x FƋxV^ Ӧ1N{ ?> Ja8i_=rX yEZp^Ǣ6nNY۹~,& n1V,Mݻvi1b]E[saA8), |>n6\,>)+Cg< Z@uP^O4U-Hf mA! "Fݢ]* fN߲s%KFG2ժw-Ɠof R'䓏ņ満Up 7~-8Hj% :Λ4(++_O`۶Ï]hî'u/c~Ƀk᝷m/b^0{Ҿ ?y}vS;p?Z[am@P Jpv e#܄X[A(8in-Z?`@,:];`$Bg0+r`Oqd?jzѢEpb.<4q?_e튰4}_86sq8/{c\~~WX\+_^|g &%?^mټ "#] >VݎWa Ojv"2(>x}ue a'R\·j~o!Rmi?ܸ b0JRg>OW ٛQAG@+T5Nj_5n|>|{ǹgukKaiʒ"Xj`!jmjjISgMm5?vƎB3>f(x?8\엿 vxq``saM5Y" . w2,/7!mo, Fߊb6 }^@(GX 30K\ {hSHZA=zj"GX ֬^%Ь`q, hgܺGڀ(- =_TIO_@(O9-.yd-rQ q`eKAᕽ 2]$M] r> 1,Mտrǖ9/EG;hPYY O0Z\= \ZZ 2̛f^]voj0pow`ِW ̃^3sݺuds^pDuW/q쪧 8h1c2 Mҭp3mx:D8+6'O@axEp=ݏ?t a.vs<ܻ?x *n3lHpjX| Z "i2^`Ќ,h*8;`Zpڽ<8ƎP+i6)<(X 8 cpVx~V>_kF,vۯ sE'B}쿃)hDV| k~ {tKWx[VSNA+z?mmVvOAcǎvKB 1b$#?46]Dj:el7jɴbĤ$, B6u@v#3=ڹ +Jrkjm Ǐ}h Gӟ>Ju`o8瞜qȮ;چ ^ Kӿ-?}vhbϗc؏SRRg ] K8S:'_vX89e0C>gٲe82 9mE͂Qr9iKIg #Gj!C4Q~$jO 7A%x ٻƒӠ.(u{O7u{nA kN@qhl%% U*X핖s4`o( ^Y~ ԴoN&ul]-s/;l餮c),x f:fFi '^:fSV@Y *!VnLԻP:NCM/GL|ֱ#ӵ/؁?;yL%6Oͧ%a.({…`t\5̛_>cq%eJQ,xkBxg9řd{̔ڏ5i>!,S;3%2䐡)S3"""`>8>hʑh% ZDHEo)B18 x%o<^~ R T 5VkTNKA\|W 1]YJP"{,}RЂaJHHu2/߷=4xP=Ј]z#ilIq> xRKN~S?k^K=qwdeӬXL2 vd5$ H$ɀA bYɀd@2  x;2I$ɀd d`Ҭd@2['}|=dWd ߮ ;϶:ꀊoCZ-.̬L]c@O5;}T4,hZg8iPRZ롶 *y~"U?XfC8olxZݻwQ_t7MGv>b?+='`X*=]BzZv۝=edل>+pq%2ݮTu# Ц[;wlg=Pߞ ÚcXZO!I}!;VLFOk\_rP9B"Q=HeK:RpuUU EM&̰Nvʈ W"Ilk95 E~n?xi.~REx,MG"XrT IDD1V%Z0]5 imB!\ S"vi+eq CC,eEc;[P @0%݂ |?G$K^XxJ%H+r\o^iUUl.,)m,9I2;;SH1gg7@Zz:.Q,2 ?3<>;K4ba)6] zU.F vv<jXڣ m5${˸y 8b@*nP>T|r򱭮H p&\\NholdWK˰uj_ ;is7Y:-F5-j"#Nzdt0a__;4+}PUWU3\hXmkV\[!aiQy MsRTФJ,[VuHҵ-_LK[OYBHYyS4hͮkȊO(;Q KۨElcII(nۂH+dAvmj5M8]'ܹ|RV>c3L `Ok\0K[G'PS?nW}Ω-UxH,U7Y}P/ΰmcb}WueKIʹ:8 v2C5ȰRX g?y}ZBX:Nq/w@TcMq!1LUM`8WY]5"bJŸr_NNd{wqL:}s;Lrb4PZzʔi NE 4$=O_!B?XS3d7!8MoRGT?. ?%c2.JTH6xŻAM4.;g3_E)`jO(/>_î', >U?Ar;%U,7-(i8{^oeSSSaΛ-؇:ՀO~Q{\Ђ]Kx'c;]P':i}^# up=~nH['Ry)n*dTBba.D4&J%HI\cAk:"XZ;СBXoHMMZ;4쓇 Z;:R,%3L.&.B$1qYܵQɀd@2  QdG+N- H$2 2( H$@e@}ے̀c}}HW{zQ@oջ =I_E-:ېsW{dzfE=S}a ]X<*VSUk֬= X= Chlljj[[پ&tصKvPktm ]ʽ|N ng]?]Өg}|ѤK z,.tH҆OV.]}@+@Ӣd̠6| u͛7O.t.ć^PqBbLټƪqwbIxc!0(" \MJ4w!l`&t5K[}R Ip3>NQ0"(nt>H- !1UjpdF++ ! HzhXkkpZ$J"X*!W$+ :`"^,+:쎈>],%.HAmc*)uIRS%DT4#(ƨ-ڥ(MЭ):إt=}nӱQ.P6|LC@R dlO> /@~yaGGM(5焰,TJ)Mg;%Bh΢QO`!"OP*(ȇ)Xu=Mt;+dO$qJrI K 36Φ԰40ֆUҌ+&fcaYxڀЊڧ(QN3PP6`rnRK>xR>|Fk#L%VE &`+cG}6ÂlvwڧOtƒTvitnD/a) ,7)J@7$ `$T3QX u0@D% e9~\.4 MoPT,EPz܌&, ֢X?tmx-H\,럓&NnJw_tHjD?.mv"w$5 "" 7U}O{EM6ys +-462Q6xss+.,e²?\=kX{Z&pui-"Gzێ? ίpj[= yL)K@ >,Xi@@6. yy貍쳃e ^rW=eW6CH6xGk 5uë鼍dI~BCf/\ԟnU }@%+vNj'̃J$d@>XHɀd@2 a@",Id@2  H|`"I$ɀd@+Gtڡîhl8슁vN#SÝ6+ꑞꓲ:dqsuU _ !zAuQWWLoeY,ضmcQ_v`TaWlFUn-A%rJv=ThYSAH !c0V…7TVEĮS܌*kܳg=˸yEqcb#7m8Ir+xa=Pd P qe1ph'pڗ[7CxD8@G2~MyQ":).ZH]Il:'`ta[-1ŭڐ(:}@T aNœNN j:ҌTh`M7:;`ez)xi\?Ϧ>&$l, miu.S}\\.e1vFW9Q+S@nmTJ3fvW @qQ\{.H۝a-]{_w7/Avi(.Ifȑ(*4vlkll;=g.>u.? Η~DIfIDjocJIa]4dz'+3JۢD~Ɓ5(5h$L9$^ |yQ5 $/wNJmR' 5ŕ\,V5(, uC5mՊoCc ҏ%:G S'r "= xK$_q=/T@](Wl\̹g=Pn>\ N#Fr[|a!plؾ}wOvkkka+g?%>AV5sq͍|Yon*@IDATW>S%PF=ʷN> 0o|,.d Կ8N |o!RRRp͓``l,`6LXhPXHH{uQvRqFM_j92 Bv)#/9Hl> 2 﫝G_ 66`؃` \mz^kΙT>aU,e\E_9UTToY%R $)Q,lC[r&1U.* zTي跐ϭ8c˗rvk%2Em"Xʘ*G[[+4 ٦-)G JK!,</=sK_8q222 88[M&%uIJgKQfEf&.RhK>\&QObMV\ô1TWt` 3p`V (O!,z@Q(%h>ǎm[gŎDhʉԷ7ۿ &7_:v:Sjjj2m'#R:MvDx'Lq 7IaPow,̼F݂+p`^}b.6|\C._ \ AA\6BCwAŚrW> v&[\NN^ |91,Y;a$m"&))&OR$@Bӯ:&L?YDI۸؊2'rxpגw}{ϝKށo?uӌÇ64$ Vvl}.F|Y^<%ɀd@2 qd %ɀd@2 ;Az! H$g@=NP2  H$ d=惕^WO4}.vkmқXΩBvз^L~ljՁlGbQ|rÆ S'ƴN9z׎Wj2RWNL=ǀ23+mO'C=fkطٷί_%t]^D*YΞYf~tX 8_ Y#B+ ,&Fa}ݤNN@Ӣn#|v =˸t@o`%ązΑ~Wmx:Nό.Oy *ٻT:, 0d1A?I޲W lWP+VUa8#bAibu q8-,%Xʘղ?h>OgXEK8ķ0/a$ER!j,hm"~ոr`ee.Ć\t &;(>[J-p)"BnBy-.*DzO:Ir%Ԃm#@ ~Ip͠,+Hpӧל۬׸X}~+udv=ԃC_VׅwP10eʦjJߦ0(‰>-77k uxeοغɦIu'Hd :ڹz#,I Xv] 8azgMP?&42/~$s[ M[C<Pc/؉wU^-_#iC OA9{qX+*΢̖Ta_{XV⣃Xyer{C5Ƒ7"}{wkb={HC 8!1E b$MSB|'s!!N)!,_|IK\))gMk:2Ur,cTmj*E0PRvq>@ۖbX::\r?BZR/%"<[}lLL [<̏$9 G AdKe=@R{x1G[rX5" FYgD{4  Q lǬ)Z[0 EG4e`e L" k>,s %:d0XXt;jz2ȾSYzB/펅zrgC>^!`i-3gN a)0~$:g2Cs(P\ @BP~?C9 P&\Cˮ: >bΦ] 1 R"cٳ!-m8\*/C0}L.H!Y>Q\\HRS WWWr}5tYlymzVV|zX-o%ōԑrd@2  5vؖJ$ɀdAUtE2  H$=ɀ zmd@2  HxQeHW$ɀd@2Г 'ٖyydߣ_58:14_5Ӊ @HH466Ά^Ag\ ʁU" ʀ*:NiȃOa-̙3GEH4(|ݻ_Nd ΕDO]vq A ,,(^,G1" z" +Mve=EIX7r0'$^H xZ[[mJpUUSd,KR"X2'e@w %4y M o!TwZd 2 ]0q+2P9 gW <t7Ic"Σ ^jDlueP-))fKzeIBK>x~t1it (?:ifpw@X$_6DĂ#K6U@@pkӖl%2jq1 $,+T_WP,o3[S>Ҏ!E-I/kFZe2c짍%35ІkUPUq!glEM!LMJJ(tXB@_PP`jraaalGEh۴]:8'Nke_[$ ? R¤J4cD} ܙ3g࣏>ʊI4vL]jbzZ<)#b ˗TqDdXTOg7COc'򙕕#G[-; kOd:}P_\H$@ ~C$ɀd@2 0ܱHɀd@2  2eɀd@2 udU  H$@0 ]* H$^g@^ɀd@2  HW0PIENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/laplace_results.txt0000644000175000017500000000061712662210366023252 0ustar mbambacores N numeric wall 1 (np) 1000 7.14 64 1000 4.53 7 1 (np) 10000 843.43 32 10000 183.74 95 64 10000 99.31 53 128 10000 53.33 34 256 10000 29.67 28 512 10000 18.01 33 1024 10000 13.17 57 2048 10000 11.78 111 512 100000 1348.93 1024 100000 670.04 2048 100000 353.70 ga-5-4/python/docs/scipy_11/papers/jeff_daily/laplace.dat0000644000175000017500000000122012662210366021411 0ustar mbamba#Cores Solver Time (s) Wall Time (s) Solver Time (s) Wall Time (s) 4 560.03 564 ? ? 8 322.81 333 ? ? 16 180.35 191 ? ? 32 86.71 97 ? ? 64 44.43 56 ? ? 128 28.67 38 ? ? 256 12.15 34 ? ? 512 7.38 43 567.46 602 1024 5.31 72 299.48 366 2048 4.84 131 150.36 270 ga-5-4/python/docs/scipy_11/papers/jeff_daily/image5_crop.png0000644000175000017500000006427312662210366022237 0ustar mbambaPNG  IHDR.|iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]`Waʘ23sI^zޕ!+)3c4mӤar̖%Y,KU۲Z>v޼y6 $]Wϧ%%Y(i]l].m-drcI BΈ]Z~G뤩NFњ"Ɇ(!tqee{J u][] V[|5XZ"2| R%)99VX(iw\Q "KIW8hyqiXW$RyQ5 ٩q)/W]GF822e ݰ%JlZ*M U_F׋ z`炍+ ͙+i5S iPnV, K`ߗ&ژc|56-n˜0p oT_fG-mjoϺ?SCil"@pgf`uJIK ^!UUWɟKK~1¬`<ҴUr1,լ"|C1m&eD˖  2c*q_ ÆIOh̙rQG $\x|6cmI^&L`^WUEɬi0aXW!kʎ;$%ZS}Xw^X Z&MzDv_})q:69-C؞[sΓS'N ;v*cƌ*RjִZ~ ??J [By ILA?xB 4ydwJJ( ;z;g{O ؼ5?̑G? xR+-niVWW5WMvGA폾Aނ ϪY=_3{VfA:Iˉq{Jeŗ`gw}ٽ%`ZA~;ZTPpeXkЧO믿Ï_~Y|^ -}sސO]/e#e= N\h.{])8Rҕ}/jZ+#%HrY;˽;vDe_v~z[nѣGw>X|]>HaXϝ;Gm{advGݰ5Gz33+n< S=w2Oأ`97P Z[ Uʒ%K}ݧ˖-3T(LAɱg z8U=АW+-SV*zk- Z9tlZzp}jk_g D[;qA  `?~kxFW3"r#AlJOGHQ" y]53eS}3bk~ڥb,4*2d p=2o<}w; &{ml#uջq%u6*5;ݻyw)u%,zKj0裏',ÇǞPv I:fI %@={5\#zjdWتf>A3tb^hP#ԥm\&<9:ExNԺIkhv8NwP8;'ڽt+F'ȊrYWtwUk>~)yd hI8Hm%*D06"5L(W#rȆQOֵM GRJE|5f&~z藿A ŎVs|D9NAΜ .a*eY]~_-׸6G*++čXY׆nF0AZS+3\Z]|,Xl :35 _U£ٶUThHX"~āN341#eYW[#WHsԤ)P+<#!T?µXV8񾪀\ſ\lsաP¹O xPC+ʳE iӽLԝ|4<[kCXDCv~کy_)JDȏc٣r1;q!πGs%0'_8de! 5=S!?\v9-,'f˞wȓ.<ƶ?s SBEVe!߀A.g碛)W :u,*:B~2Kޒ tQmߦ=Vcشژ,4[b ~9Nn_VlruϤ&YhO t:pg笲I m-\Sˁgs\q%ve(hw'+Sy͊e>7u5HYWJk<𝲀/MUr6[\f%| pHV $ 6Bfo}XObΔDጨEOk ' JR/J\j:7Y  l;i+yuljBujB (C.KY6a8s"sP}}}HZS\O_{55kru9餓dvk#B#?\>Cxː!CTwyGͼvi2n84LvZd='矗Q!8WoG}$r9ɣG>X :_J`PYr%ZU Uw0@zg_g3tol`.6^|.4dCȏD~Ԕi/e?5B'~͚5w<>f`{ky2ydyd c/^ΡDjajSCVc^xHgځ?C vwk\vX=8\~[Cd R+%vѱ %|T5Jx?3/hLA'ۻ*(-/%}µ.2]ۏ)m^9c?XnҥrUWT=y@u!IfmBY:4p8'1E5U. [JQ6mf獣axj_R  1p֐P$dB&%~)[o!^tCҮ "K~_ '_Lmd 2gݍg}Vdf=5~S\9 H*bzfkʻ曱NrW* ɫZg|"%X*v)`^~Eq# G*eĊY'4;A/.VKr$^Yax }oU'l9E[w?nQ}ġ6?ߴi~2m4uQ{JsUCs=W nZ~H-Svqƙ`O~/J=*?KǚF_W[L0|*]yUB!?$\)v,o"=%'+E.,0lTɁy}PO.ohC~bC7ĝĠŶ3yX\w#O˷^{)v f5=묳$8@|Iebo-VxH"U %\"z0Q$g9$ey9‰GΒ"_Qf&|%&vnhj:?-ʲk^%[g#u#l ^u57qD`~_ xrJ;ҁ%~.U!)Q$'E1b3dر 8H>xs?7,'ڬߦ5hU%(q(!\Hj+(te O3T$jhKqv/=?,wu6Q' nl_a+]$,JaHڴ9;ep;b'I}ܥ;z1i$1vEEM5ynG#meIL6'&5f'b<fnFvu4JocϢvFк1m<γ66J2ECy"Ε& s[av¦Ɍ6?OL'[Dxug ijďU 1Iyr:ā. 9a7(ZcR2}zo%;iŒ=yo%r?NOU7?`5 %Ư; FkD<0ހSdpɛ5ˮ%)pIÌfpHE2rEާ&7O^8 ^z4Zk^;:Tz̿gPyߚZ^#.?B}PI]"IuJVBú"5 tIS^БWܮhYWk?K{DnG\g.V?a3Mh4xy6ց[VeGJQAջoMU=z=R0h 3q eV>5@>HL@h kH~\D)gNAKXC!{#7qJyy}Cb5NI)F9k;^zNCw}WDBV!pQjXjw-3tVNXie:k'hyk rb-Td"wҖki% ^WZd FIV(?S/N={~+ʰ_*<%?OFνJ%#X9N{@G=Qw!p>]cRfiG* HrͬSxڴV8hoz{^a-_&߭X-}{~|7&^$lI4p%UkYi0Ѐ0롞1W2:)3e̒T hٕ#MJa! v95(^;Ȏ2yEf8_Fz_T[QZ:L^0 .'>fUP?VhW6-|Ezor?ύޅwX ĸ:++ɍrK`34!1rj3OӤBs17HBHAn$qFo\> R"haب4槚Lf&z/^\&y_;@OR[BRp 1UC; }o+N\. ;6V?g*|}R=%5+W)YjT:>Ζ,oCzqAT[pv ]ed&AZO/RII@j藚=,h=n7'y~E#>&#FZ̭$>TA#!Cg^a.K"Y㎉˃%W7!Y0GSSdʵ_ޘ ~9uÕWKS8q`4O){춋lXձӧK) 3ԗڲ7tR_?y隖n"hrKaqˬEn$I5B#=C0 ТzSNg/IN_NaFN"P ",C:7V# c\.jAHR^}~98XEkiph|^DMAjn AﱻY\R6q頕[sUoX=#hM|dޗk+sWͼGOIO[!gN,3R9$<|=O9K'&aqrqyyk IDATZ R匯EVM4+)$%7/eu:dϽ[?++gk4ݍÕ"}0lh(j|tfko"syd߽5A :`АΡ[}jy)R0d@Uuhv KړZ=9hav)|hQ3KĞ=T GJT"x7r"='ו_;Lr7jLO9I )+_xIjȫJ#MNK.u衇b*W*!ţ+Td~ש1 7 AcӞtoXlRíN?՛N^>^h#0 ?4-4)>7n.;qcb[/ZHq9dFBPg _bYY8UgKW"wnBs~h 'TyKvEDE&mW[̔mj6ظ a >[Fɬ3#H?8W 5hc+^\OM>%x3GyNm_|׽ȿ'd_뻣#/>a&uGbqEm'mdC0u3 -6h„ ȆY$O?Dodpo xĽc)Ň69%%#G{ cᇅilY+xV.UR8LoKVY"'4?MÇǕ?uqAQ&OM{Hz!,'2ռ%eUR]tUG^ИkQ=ڢ-VKr-S .iڴ_j%07 *4|}q6N?TɌk(PmC/ ȱ I;NWogK`InsrsfV<@[oT/\ֺ@]Z@R7kHݬI;%gt!S7_ݵ 8™ݣ;GA4^nA6M,$j$^h|q#.μ\ Da^r 'ʫ_nsZ ݴV7Mʢ0\ceS&C>([rg*J%vք0V~ȴu"d 9 |weȉ"gF?c,t 6檰7m\kLm ]I\S;oe.mD?8~}HX1.WrGcABpmadg Qvl$°wuH\_Q$YHjVAJ}ssJU&I]2ĹBR*4n]OeAH `*f" nVPA/*$pVzP.`QJ,";nWDo<zL`N'V"Y'%ݰX̄:ّv<18,-Y&z5.U*'PqHJ<:1'Mz! *"p1w< ȅ/wJ)C^6??Դ,R6YuIkX-9%}_2[AW')a N]luH~P 6.q5'u#b Z RZd5Zlq+Ժ.AʓWݾ ez0.ӧ2Vլja*PuA\EbiZW0pB jZ&JfJ_EӁ+xm/𔎤DʷYF%OSyaag&@%M)f`Walx%=T񇩚})qJ#u4_eo` |S(1ئ◟LG;΄TѧV؁kqSxd MqEJ>i%'xq9¯! j>\usy5g`o%XQ|"+c"0姟j #έF9pLWT1zZ!IoDˢ&1WdC97^~tT +ZXB+dhjSm>&5.-գGN҄5ےڞe@+k(r'zoo:C~dVOU+gzhM}v_|=aΜ9m6 [JYWL Y!**eʔXIQV'E(G[jK/,UϚ5K4,%j]H_TВEWEb+d͚ߌ*V \_V;@Od5VpY6z#^tVE佃sV6TXa|@߯&1Ǒ*,qMĜLdIQ&{jvncJt33|'b29sf.y3Oϐ")f.|Ǜ88@(L(yC=@x/_j.d=7&6^z U1a 4OxrkB+/WR{T:Nͫ+3K"t/yB+\zJZ d&X_Jf&HZB[o!!`lsNh'դ`\:-S9lf~#˼}Z j-Jϕ}%*K ɓDUryKJUվxJKJcK+hXAm3ZT~Z\hA|XL3 n  pM3šI5ĪUaLFEگ7 <+2ʮ*@C2]"KFl2srޒ䊌 +eB= {7i /~p$ڴ8ȕFTХ^,Gqh +4E)~!rpSNb ?dXR"+WHCVa`$ CiPiZoR Lo )U3Yd1%m.I"jZ$иv,`ЎA~J\(W] *VLRǒ /#|hPiZI ZQU{ݕ cx]\J֟d@BM9l '##S0,֐B4 `xj^0 2 \6gd?4\p[.%%$ˎl).8¸#rl'cD mY;mq-*p!w3C-_!u ޗGkm[T /š6nzh;6sFvN*M+R@l+?hkW=Xz0W闷Һ…Xn:2$gSNn 5ll*c«͙&=2$9R3ֆ%Δ@HoCM1&fmbk U\W"ڰ$7ˆw. Uȗ{_mmt .:{晣% 6, t剡V[xbOX$ۗ)0ԟjj?uB K"1ӥn2G'&ZeI j4_|lq r_!{YKM5h/•7@]8#B'YB=mUO(:NWN\+i6, l. <5R4aòY2¯$UUNibh-zx_6Ljо#ㄘFnb63̞gz ɷ)4_x6oJe[\[Ri\/2w;% ]ki\;la"1Yݜ&xےSR܊^>M1 LksO+ܮfw½!f>pWߕ.`uژUhT^V~aRV4,d<(njm+ᒷY|sBZV~Xh' X)/8_V*yL_RY msf>Gދ[$&9B²6, \&e ޻R*{$t ]1GdCtix2>$bmXh+CX{J><$\b6I:.jZ9㏑~lVHrֆ%+\6yoQeճ []Ⱦ1xWtL 6, X. e3HR߱VC]WpȀ_ŌaX6pkÒ@'Iv<3Ȯתr.eVY Syַ%KÚ,o[WE4+f a5 ;f2Zg$`IE"vڲ!]˰3:hž{ÈoV;*J9ۜ ѶA5xqXUXd X"4.ʐ1Ga0T%`6 GQlB, lixԔ>6LKH6"i)F u;S$VOے^~ejgvoQ puUE(+%Vљ;M(wz-[&O>D~ywI\k}C;sZC; KȐ!CȞ{)^{|gtpuufju6, @EEgcܵ;/"td֭[',YD6mZwZB+!qm֦:[d?DkKVvqGyl7W;^j{SS8qN$P1魦iGgR{ʢo_kbSy$??_fΜ) YnLDq/s̑#u4|>ﭕ̬h,}_RЋ*)(0^k Z4IFvU%''GRR'+++Ct*.Ar2Ty#V[JrzcW;En<}HV~y}̱2id}wjx?x JFOI3p(^.? >B2?$S w9Wz +*3]2z匫% 7ܠ4Xy+OwZzX\U*4 Zm=VnvSBIjN=u"@kR\Y蠕owV|kvDAkLVCSRzjq$.6Zƍ/çTbC2 r1y5OV?^81yy瞗kA 8OJ bP%k^.\>x/2h xm5HOǟAqenhng[.f?%yrI'?Ė)G<qWPX.+˿LիWO,ޢ5k䩧;MƊjmz٧ҨeJc9YͱH`ݝ5_)/wK7kLQ4d ER݆?^vyBINx^̛n(>MeduХnͶ;+^ tfDÏ?%dž+-8a_x#ojDE?99Կh. HlKY" $di-sɜ9uu8SA9͑/seح%=YVE:dl$cG IKD;%m&6PgMO7@l^wr9ÌpW7a w ENhW+//OOx8rOU4կsorv;>Z<'h1*״ HF.l~KiTKVFS&Cѧ|,%dq~+Vo_咾Ӳ8DYXȬY:L;vl[eQHqkIԚW֞b/{巵AoorIZ@k5"Ii5˒%K+\ֶ%K]Bpud5H7&P~PyW+>ni;T=qAfSOmrpm, 9N7]FM>]M`y*FH&&t /;m!778_+K-70,g!C7qBbEC[o5?Z2[. kےfMz^w]zBf&?xgة-1^qc|p zO:U,X GyqBE曅oFoNʨ>LߵQ:p0Un`5]&hÍjV ,2V_ 6E>u(..VK.U.V7_|u# .@wvioq|M=C: ᨣ /6AGkʁ('//(aÆǘ!?T矯4!.裏d]w M7q+B !/_S޿KE~ӟ>02|=SMN. JehVp9J'mL5is1qD{a&V6Γ}Gw}IQ&O,;ShgXC!}͞=[8TEԂ|̸=*w߭<ϪDj0̌ʌX1aȐ!lC-R|x&S"1H,sZҎd4~"qAר]ln)STV_CVXX(~ޡ m~7Ѐv#tF 7|csgi5S.yce#ƨ\]TᝌWEè͉žXu5Ũ<ڌ1*6V6evj04Wmaq~!eUj x饗 &vU=A0 F]]GO!]ðSp6?׮;Nή54dWm? 5Zm}^paoT%]5.~務'|Bh[&oKiӞl{,kMͿFzB~ U,>mtpLAsICϫOcGOm|Ǣ[o75륇ha!?ʕ%Kv!QVѸNR3f矒y$8y'=a6M(<]rxTڻh[bh.L;N^{rS3!ZgIv~EMMnGU p1G'@rA ~꼑ߔA-s8$Ўcݢ4DՌ3OMA⡇Rh6l%.1"df[nENࢭ6y-Aw (C ~Op\oQx$Qir3$}iP:cQ ,<_]rEXa7]'h ׎t>jwL'5瘣 RgmMGx>)Vq~XWX|Iwi`Q;6CpbᠥBm$9pHG Qk!`RЉõp~"s\-}n.qQ?\U6=rKJ2-+\ֶ% p)0~8}O-G2DmC{>2WʦsqicFP2ZġY6/97t6, mI BYc"mpjW*48tՇ nJ"SӔ2ɘ@b!YJl!>1 5rH.bLk1'-p8&h}zZTӝF@rWn C6“njYp~Z%WԨ0ru:13TqdCR[<#yBycV Z@; A-)A\ +bc,#rr NYW%%,̴6**L~T۪\@@2ڎnEiz׳gA%ZeZg<̘26o9 ,C3-i*]Ns=oiYE:[(Tc>x_f)m18ZvjIzgr5\!#[DEe_Ej;)uks͎.nc;f7"Ί8gSؖN3-)SomMɍRXĮUOŗ\-##ʚANg:ɽ^2j7AˢC7u.ZrC t+Y M4֏xIg: t=\Y@@ '3"}东wꩧp.6ƌ1^ފ$ :S~E|5LClL*Hp(j#3==K̗6KLbUbK)rU":4+ ;`3~j $ $QKC˿ cBƻ+ 2j( :[}u+i=toKI$g 3Cve,;M/Ő"}ov*韾駟wBe.epl3g*wO<s#ʡ^0484^bAgc׮CZ- X0'LSa h"Ka2c 9ĢS+*icbXc9$?5$ 7,1LgMmN~s_dXZ*\J$!>lP4{g`0=Mx*e1f22a"Y6ssJ҃WLĂ ׸b"x- t qFM#̞湏6TB-v/l4X׭[3~a\&3 uԺt5!%jz[KMPϚO.BMS$cmдc^%bӪ!oV_LT%h8g2OC7 ġ8yhfnü̩O%1?҇)H5HeίО_ƺˤ2 a8ѶƏNҘ*++jzTyS\8ۈșɅE{7[.;@_6}\زGfOiލcU:|rYМXKˑq9fڼh- Y|n;@uGk37g"i9gQ6+ bӃ\3g.+1xn%Hx?&u(Hy|~P<)jBTJ4NEZC/Y(#}ZqD 0Q71i']#יlW^;lvm3"b"ޖZ Ίdwl[P=.-`?Q.^u:E%NZ4^趦F6PVgJZ[bu)|s+|w~Jn< h7&g'ƿm&Tʸ.ɡV/ ^)‚5w7A%Vlp. ?s2gHYI&XGQ<_/J-1~U@axlꘆ MBĹpOS!?ie`N3!?~4d2<ְ4Sm囹MBT~i\_>BDLmZ w6cѬᅲl>B)꽲-kTv).xܾ;tHnfꔌ4^e6:ϒ@wmZR"h6oP.kѹ@MBOfV k*ɒhx5ig52VTBjжeUZL< ;R6A 2bOM˔ŇɯʮF55==nYIY|6Ubh[RYj6~ii2b V,[f߆ Hrg6FԐ@E*t, ڰ$оPWn R*M3&AGtMPʘX-曤tL{Pr,^:z^{`-KO.D,H 4Zqa ':_vwb0`5xt+LN@d &h:q"F/Y&]%&*p!)V9O^J'vw&-MAN||} oc{رdƷwc\fH>]񚒐VUcxfw"]gC쩧N4<3E)~kP4Ty=nd.U<.B,aw1GC;o@+n]`r.d?WO 선+]/8/EGO@))QW3UQ6Bu؝]oTTVΌ̞3[4UP$#?kZx;(ۉm+bs6_u4epe梣˂Jz O_jȌo|X4-T.ˈV6ShՋĶrzq0d\6mիr$I-2 PT oKµ-b2#@9жVXFDIUlt8Fϖ@k!)NIqUMEI]kرHcP=XFʄk)uhٚc=5KPU` ~ݍ11fETzYH'YhL x13`vJO9YAxLDI\.uOM+=!Np.ώhl;(xa_| Y,`c[C~fWc14cL =\ȏ{u_tKi v1˄ y1s yUȏgiY8TOc3sjF63Q1_7}5t7"䆿-JB';Dΰ$e$@M28HH"Yȕ5+aY'X4 ("Xcl0-(Y'Yd $A=T˂>lZpm- t3湑{%uu2v׃9;x8t=6jPBdo$Xǣ-ڿ`'͇OD@# 0#<7H|e"M$7S\ 8O5fkk3Lb媕ea1Y%[ a|#^ EVIyxƔ,VFlE%R}­'*iLfWUѣ|E$̈ԪuC"+Zq;7Z`ІOQ^!mm[B+MǺn:U"Vve7\֡*@Ao Ng-TWW?(+ 3BSKifZa[OIDATdgRlY[ofxMQM$GiZiy =[/ ӎɵp,3L7?Qhc:7M۝%t鐟~2#o@|aS <6ZS!?ȝwݕ@ρC~vf:mcȏ}eq '䅦B~RsW zYTk>'!?Я-D `w#Gk:jǫ7ڦhjG&k%C $n-1 w=Xwy/٩]5d>K[|߄d`ԴH'%Өq%?lE7l%n/fJmbٰgalUKFVV@.KAKA prV;/Hv%#+ [(pYw%-@(TU%NCJ9WKZ]2R:,ndbz_J" %._\pQ-C$`@:iL-,$[BxR>mFd#g9ז*7ڝ^r)]dfkoen}=Wv;|(GL9.陓*tv5/aXh'3X`K@/>-A& 8|I:$V@@0vu#E˒X ? >T 1t] 5;_!_TkAS0sּnn;!n\P\۶Mlw>$<衜Z(g_~YaLy#ͻ$)11S>VsRí٩k, ɴF}7yJs D7G rp$2`kG20队%ȯX+\ $Y^{ S\~t#O-t5-j^a#-J}V5V(B/SIENDB`ga-5-4/python/docs/scipy_11/papers/jeff_daily/gain.rst0000644000175000017500000013307312662210366021002 0ustar mbamba:author: Jeff Daily :email: jeff.daily@pnnl.gov :institution: Pacific Northwest National Laboratory :author: Robert R. Lewis :email: bobl@tricity.wsu.edu :institution: Washington State University -------------------------------------------------------------------------------- Using the Global Arrays Toolkit to Reimplement NumPy for Distributed Computation -------------------------------------------------------------------------------- .. class:: abstract Global Arrays (GA) is a software system from Pacific Northwest National Laboratory that enables an efficient, portable, and parallel shared-memory programming interface to manipulate distributed dense arrays. Using a combination of GA and *NumPy*, we have reimplemented *NumPy* as a distributed drop-in replacement called Global Arrays in NumPy (*GAiN*). Scalability studies will be presented showing the utility of developing serial *NumPy* codes which can later run on more capable clusters or supercomputers. .. class:: keywords Global Arrays, Python, NumPy, MPI Introduction ------------ Scientific computing with Python typically involves using the *NumPy* package. *NumPy* provides an efficient multi-dimensional array and array processing routines. Unfortunately, like many Python programs, *NumPy* is serial in nature. This limits both the size of the arrays as well as the speed with which the arrays can be processed to the available resources on a single compute node. For the most part, *NumPy* programs are written, debugged, and run in singly-threaded environments. This may be sufficient for certain problem domains. However, *NumPy* may also be used to develop prototype software. Such software is usually ported to a different, compiled language and/or explicitly parallelized to take advantage of additional hardware. Global Arrays in NumPy (*GAiN*) is an extension to Python that provides parallel, distributed processing of arrays. It implements a subset of the *NumPy* API so that for some programs, by simply importing *GAiN* in place of *NumPy* they may be able to take advantage of parallel processing transparently. Other programs may require slight modification. This allows those programs to take advantage of the additional cores available on single compute nodes and to increase problem sizes by distributing across clustered environments. Background ---------- Like any complex piece of software, *GAiN* builds on many other foundational ideas and implementations. This background is not intended to be a complete reference, rather only what is necessary to understand the design and implementation of *GAiN*. Further details may be found by examining the references or as otherwise noted. *NumPy* ======= *NumPy* [Oli06]_ is a Python extension module which adds a powerful multidimensional array class ``ndarray`` to the Python language. *NumPy* also provides scientific computing capabilities such as basic linear algebra and Fourier transform support. *NumPy* is the de facto standard for scientific computing in Python and the successor of the other numerical Python packages Numarray [Dub96]_ and numeric [Asc99]_. .. *NumPy*'s ndarray .. ================= The primary class defined by *NumPy* is ``ndarray``. The ``ndarray`` is implemented as a contiguous memory segment. Internally, all ``ndarray`` instances have a pointer to the location of the first element as well as the attributes ``shape``, ``ndim``, and ``strides``. ``ndim`` describes the number of dimensions in the array, ``shape`` describes the number of elements in each dimension, and ``strides`` describes the number of bytes between consecutive elements per dimension. The ``ndarray`` can be either FORTRAN- or C-ordered. Recall that in FORTRAN, the first dimension has a stride of one while it is the opposite (last) dimension in C. ``shape`` can be modified while ``ndim`` and ``strides`` are read-only and used internally, although their exposure to the programmer may help in developing certain algorithms. The creation of ``ndarray`` instances is complicated by the various ways in which it can be done such as explicit constructor calls, view casting, or creating new instances from template instances (e.g. slicing). To this end, the ``ndarray`` does not implement Python’s ``__init__()`` object constructor. Instead, ``ndarrays`` use the ``__new__()`` ``classmethod``. Recall that ``__new__()`` is Python’s hook for subclassing its built-in objects. If ``__new__()`` returns an instance of the class on which it is defined, then the class's ``__init__()`` method is also called. Otherwise, the ``__init__()`` method is not called. Given the various ways that ``ndarray`` instances can be created, the ``__new__()`` ``classmethod`` might not always get called to properly initialize the instance. ``__array_finalize__()`` is called instead of ``__init__()`` for ``ndarray`` subclasses to avoid this limitation. .. *NumPy*'s Universal Functions .. ============================= The element-wise operators in *NumPy* are known as *Universal Functions*, or *ufuncs*. Many of the methods of ``ndarray`` simply invoke the corresponding ufunc. For example, the operator ``+`` calls ``ndarray.__add__()`` which invokes the ufunc ``add``. Ufuncs are either unary or binary, taking either one or two arrays as input, respectively. Ufuncs always return the result of the operation as an ``ndarray`` or ``ndarray`` subclass. Optionally, an additional output parameter may be specified to receive the results of the operation. Specifying this output parameter to the ufunc avoids the sometimes unnecessary creation of a new ``ndarray``. .. Ufuncs are more than just callable functions. They also have some special .. methods such as ``reduce`` and ``accumulate``. ``reduce`` is similar to .. Python’s built-in function of the same name that repeatedly applies a callable .. object to its last result and the next item of the sequence. This effectively .. reduces a sequence to a single value. When applied to arrays the reduction .. occurs along the first axis by default, but other axes may be specified. Each .. ufunc defines the function that is used for the reduction. For example, .. ``add`` will sum the values along an axis while ``multiply`` will generate the .. running product. ``accumulate`` is similar to reduce, but it returns the .. intermediate results of the reduction. Ufuncs can operate on ``ndarray`` subclasses or array-like objects. In order for subclasses of the ``ndarray`` or array-like objects to utilize the ufuncs, they may define three methods or one attribute which are ``__array_prepare__()``, ``__array_wrap__()``, ``__array__()``, and ``__array_priority__``, respectively. The ``__array_prepare__()`` and ``__array_wrap__()`` methods will be called on either the output, if specified, or the input with the highest ``__array_priority__``. ``__array_prepare__()`` is called on the way into the ufunc after the output array is created but before any computation has been performed and ``__array_wrap__()`` is called on the way out of the ufunc. Those two functions exist so that ``ndarray`` subclasses can properly modify any attributes or properties specific to their subclass. Lastly, if an output is specified which defines an ``__array__()`` method, results will be written to the object returned by calling ``__array__()``. Single Program, Multiple Data ============================= Parallel applications can be classified into a few well defined programming paradigms. Each paradigm is a class of algorithms that have the same control structure. The literature differs in how these paradigms are classified and the boundaries between paradigms can sometimes be fuzzy or intentionally blended into hybrid models [Buy99]_. The Single Program Multiple Data (SPMD) paradigm is one example. With SPMD, each process executes essentially the same code but on a different part of the data. The communication pattern is highly structured and predictable. Occasionally, a global synchronization may be needed. The efficiency of these types of programs depends on the decomposition of the data and the degree to which the data is independent of its neighbors. These programs are also highly susceptible to process failure. If any single process fails, generally it causes deadlock since global synchronizations thereafter would fail. Message Passing Interface (MPI) =============================== Message passing libraries allow efficient parallel programs to be written for distributed memory systems. MPI [Gro99a]_, also known as MPI-1, is a library specification for message-passing that was standardized in May 1994 by the MPI Forum. It is designed for high performance on both massively parallel machines and on workstation clusters. An optimized MPI implementation exists on nearly all modern parallel systems and there are a number of freely available, portable implementations for all other systems [Buy99]_. As such, MPI is the de facto standard for writing massively parallel application codes in either FORTRAN, C, or C++. The MPI-2 standard [Gro99b]_ was first completed in 1997 and added a number of important additions to MPI including, but not limited to, one-sided communication and the C++ language binding. Before MPI-2, all communication required explicit handshaking between the sender and receiver via ``MPI_Send()`` and ``MPI_Recv()`` in addition to non-blocking variants. MPI-2’s one-sided communication model allows reads, writes, and accumulates of remote memory without the explicit cooperation of the process owning the memory. If synchronization is required at a later time, it can be requested via ``MPI_Barrier()``. Otherwise, there is no strict guarantee that a one-sided operation will complete before the data segment it accessed is used by another process. mpi4py ====== mpi4py is a Python wrapper around MPI. It is written to mimic the C++ language bindings. It supports point-to-point communication, one-sided communication, as well as the collective communication models. Typical communication of arbitrary objects in the FORTRAN or C bindings of MPI require the programmer to define new MPI datatypes. These datatypes describe the number and order of the bytes to be communicated. On the other hand, strings could be sent without defining a new datatype so long as the length of the string was understood by the recipient. mpi4py is able to communicate any serializable Python object since serialized objects are just byte streams. mpi4py also has special enhancements to efficiently communicate any object implementing Python’s buffer protocol, such as *NumPy* arrays. It also supports dynamic process management and parallel I/O [Dal05]_ [Dal08]_. Global Arrays and Aggregate Remote Memory Copy Interface ======================================================== The GA toolkit [Nie06]_ [Nie10]_ [Pnl11]_ is a software system from Pacific Northwest National Laboratory that enables an efficient, portable, and parallel shared-memory programming interface to manipulate physically distributed dense multidimensional arrays, without the need for explicit cooperation by other processes. GA compliments the message-passing programming model and is compatible with MPI so that the programmer can use both in the same program. GA has supported Python bindings since version 5.0. Arrays are created by calling one of the creation routines such as ``ga.ceate()``, returning an integer handle which is passed to subsequent operations. The GA library handles the distribution of arrays across processes and recognizes that accessing local memory is faster than accessing remote memory. However, the library allows access mechanisms for any part of the entire distributed array regardless of where its data is located. Local memory is acquired via ``ga.access()`` returning a pointer to the data on the local process, while remote memory is retrieved via ``ga.get()`` filling an already allocated array buffer. Individual discontiguous sets of array elements can be updated or retrieved using ``ga.scatter()`` or ``ga.gather()``, respectively. GA has been leveraged in several large computational chemistry codes and has been shown to scale well [Apr09]_. The Aggregate Remote Memory Copy Interface (ARMCI) provides general-purpose, efficient, and widely portable remote memory access (RMA) operations (one-sided communication). ARMCI operations are optimized for contiguous and non-contiguous (strided, scatter/gather, I/O vector) data transfers. It also exploits native network communication interfaces and system resources such as shared memory [Nie00]_. ARMCI provides simpler progress rules and a less synchronous model of RMA than MPI-2. ARMCI has been used to implement the Global Arrays library, GPSHMEM - a portable version of Cray SHMEM library, and the portable Co-Array FORTRAN compiler from Rice University [Dot04]_. Cython ====== Cython [Beh11]_ is both a language which closely resembles Python as well as a compiler which generates C code based on Python's C API. The Cython language additionally supports calling C functions as well as static typing. This makes writing C extensions or wrapping external C libraries for the Python language as easy as Python itself. Previous Work ------------- *GAiN* is similar in many ways to other parallel computation software packages. It attempts to leverage the best ideas for transparent, parallel processing found in current systems. The following packages provided insight into how *GAiN* was to be developed. .. Star-P .. ====== MITMatlab [Hus98]_, which was later rebranded as Star-P [Ede07]_, provides a client-server model for interactive, large-scale scientific computation. It provides a transparently parallel front end through the popular MATLAB [Pal07]_ numerical package and sends the parallel computations to its Parallel Problem Server. Star-P briefly had a Python interface. Separating the interactive, serial nature of MATLAB from the parallel computation server allows the user to leverage both of their strengths. This also allows much larger arrays to be operated over than is allowed by a single compute node. .. Global Arrays Meets MATLAB .. ========================== Global Arrays Meets MATLAB (GAMMA) [Pan06]_ provides a MATLAB binding to the GA toolkit, thus allowing for larger problem sizes and parallel computation. GAMMA can be viewed as a GA implementation of MITMatlab and was shown to scale well even within an interpreted environment like MATLAB. .. IPython .. ======= IPython [Per07]_ provides an enhanced interactive Python shell as well as an architecture for interactive parallel computing. IPython supports practically all models of parallelism but, more importantly, in an interactive way. For instance, a single interactive Python shell could be controlling a parallel program running on a supercomputer. This is done by having a Python engine running on a remote machine which is able to receive Python commands. .. IPython's distarray .. =================== distarray [Gra09]_ is an experimental package for the IPython project. distarray uses IPython’s architecture as well as MPI extensively in order to look and feel like *NumPy* ``ndarray`` instances. Only the SPMD model of parallel computation is supported, unlike other parallel models supported directly by IPython. Further, the status of distarray is that of a proof of concept and not production ready. .. GpuPy .. ===== A Graphics Processing Unit (GPU) is a powerful parallel processor that is capable of more floating point calculations per second than a traditional CPU. However, GPUs are more difficult to program and require other special considerations such as copying data from main memory to the GPU’s on-board memory in order for it to be processed, then copying the results back. The GpuPy [Eit07]_ Python extension package was developed to lessen these burdens by providing a *NumPy*-like interface for the GPU. Preliminary results demonstrate considerable speedups for certain single-precision floating point operations. .. pyGA .. ==== A subset of the Global Arrays toolkit was wrapped in Python for the 3.x series of GA by Robert Harrison [Har99]_. It illustrated some important concepts such as the benefits of integration with *NumPy* -- the local or remote portions of the global arrays were retrieved as *NumPy* arrays at which point they could be used as inputs to *NumPy* functions like the ufuncs. .. However, the .. burden was still on the programmer to understand the SPMD nature of the .. program. For example, when accessing the global array as an ``ndarray``, the array .. shape and dimensions would match that of the local array maintained by the .. process calling the access function. Such an implementation is entirely .. correct, however there was no attempt to handle slicing at the global level as .. it is implemented in *NumPy*. In short, pyGA recognized the benefit of .. returning portions of the global array wrapped in a *NumPy* array, but it did .. not treat the global arrays as if they were themselves a subclass of the .. ``ndarray``. .. Co-Array Python .. =============== Co-Array Python [Ras04]_ is modeled after the Co-Array FORTRAN extensions to FORTRAN 95. It allows the programmer to access data elements on non-local processors via an extra array dimension, called the co-dimension. The ``CoArray`` module provided a local data structure existing on all processors executing in a SPMD fashion. The CoArray was designed as an extension to Numeric Python [Asc99]_. Design ------ .. There comes a point at which a single compute node does not have the resources .. necessary for executing a given problem. The need for parallel programming and running these programs on parallel architectures is obvious, however, efficiently programming for a parallel environment can be a daunting task. One area of research is to automatically parallelize otherwise serial programs and to do so with the least amount of user intervention [Buy99]_. *GAiN* attempts to do this for certain Python programs utilizing the *NumPy* module. It will be shown that some *NumPy* programs can be parallelized in a nearly transparent way with *GAiN*. There are a few assumptions which govern the design of *GAiN*. First, all documented *GAiN* functions are collective. Since Python and *NumPy* were designed to run serially on workstations, it naturally follows that *GAiN*, running in an SPMD fashion, will execute every documented function collectively. Second, only certain arrays should be distributed. In general, it is inefficient to distribute arrays which are relatively small and/or easy to compute. It follows, then, that *GAiN* operations should allow mixed inputs of both distributed and local array-like objects. Further, *NumPy* represents an extensive, useful, and hardened API. Every effort to reuse *NumPy* should be made. Lastly, GA has its own strengths to offer such as processor groups and custom data distributions. In order to maximize scalability of this implementation, we should enable the use of processor groups [Nie05]_. A distributed array representation must acknowledge the duality of a global array and the physically distributed memory of the array. Array attributes such as ``shape`` should return the global, coalesced representation of the array which hides the fact the array is distributed. But when operations such as ``add()`` are requested, the corresponding pieces of the input arrays must be operated over. Figure :ref:`fig1` will help illustrate. Each local piece of the array has its own shape (in parenthesis) and knows its portion of the distribution (in square brackets). Each local piece also knows the global shape. .. figure:: image1_crop.png :scale: 50% :label:`fig1` Each local piece of the ``gain.ndarray`` has its own shape (in parenthesis) and knows its portion of the distribution (in square brackets). Each local piece also knows the global shape. A fundamental design decision was whether to subclass ``ndarray`` or to provide a work-alike replacement for the entire ``numpy`` module. The *NumPy* documentation states that ``ndarray`` implements ``__new__()`` in order to control array creation via constructor calls, view casting, and slicing. Subclasses implement ``__new__()`` for when the constructor is called directly, and ``__array_finalize__()`` in order to set additional attributes or further modify the object from which a view has been taken. One can imagine an ``ndarray`` subclass called ``gainarray`` circumventing the usual ``ndarray`` base class memory allocation and instead allocating a smaller ``ndarray`` per process while retaining the global ``shape``. One problem occurs with view casting -- with this approach the other ``ndarray`` subclasses know nothing of the distributed nature of the memory within the ``gainarray``. *NumPy* itself is not designed to handle distributed arrays. By design, ufuncs create an output array when one is not specified. The first hook which *NumPy* provides is ``__array_prepare__()`` which is called *after the output array has been created*. This means any ufunc operation on one or more ``gainarray`` instances without a specified output would automatically allocate the entire output on each process. For this reason alone, we opted to reimplement the entire ``numpy`` module, controlling all aspects of array creation and manipulation to take into account distributed arrays. We present a new Python module, ``gain``, developed as part of the main Global Arrays software distribution. The release of GA v5.0 contained Python bindings based on the complete GA C API, available in the extension module ``ga``. The GA bindings as well as the ``gain`` module were developed using Cython. With the upcoming release of GA v5.1, the module ``ga.gain`` is available as a drop-in replacement for *NumPy*. The goal of the implementation is to allow users to write .. code-block:: python import ga.gain as numpy and then to execute their code using the MPI process manager .. code-block:: bash mpiexec -np 4 python script.py In order to succeed as a drop-in replacement, all attributes, functions, modules, and classes which exist in ``numpy`` must also exist within ``gain``. Efforts were made to reuse as much of ``numpy`` as possible, such as its type system. As of GA v5.1, arrays of arbitrary fixed-size element types and sizes can be created and individual fields of C ``struct`` data types accessed directly. *GAiN* is able to use the ``numpy`` types when creating the GA instances which back the ``gain.ndarray`` instances. *GAiN* follows the owner-computes rule [Zim88]_. The rule assigns each computation to the processor that owns the data being computed. Figures :ref:`fig2` and :ref:`fig3` illustrate the concept. For any array computation, *GAiN* bases the computation on the output array. The processes owning portions of the output array will acquire the corresponding pieces of the input array(s) and then perform the computation locally, *calling the original NumPy routine* on the corresponding array portions. In some cases, for example if the output array is a view created by a slicing operation, certain processors will have no computation to perform. .. figure:: image3_crop.png :label:`fig2` Add two arrays with the same data distribution. There are eight processors for this computation. Following the owner-computes rule, each process owning a piece of the output array (far right) retrieves the corresponding pieces from the sliced input arrays (left and middle). For example, the corresponding gold elements will be computed locally on the owning process. Note that for this computation, the data distribution is the same for both input arrays as well as the output array such that communication can be avoided by using local data access. .. figure:: image2_crop.png :label:`fig3` Add two sliced arrays. There are eight processors for this computation. The elements in blue were removed by a slice operation. Following the owner-computes rule, each process owning a piece of the output array (far right) retrieves the corresponding pieces from the sliced input arrays (left and middle). For example, the corresponding gold elements will be computed locally on the owning process. Similarly for the copper elements. Note that for this computation, the data for each array is not equivalently distributed which will result in communication. .. ``gain.ndarray`` and array operations .. ===================================== The *GAiN* implementation of the ``ndarray`` implements a few important concepts including the dual nature of a global array and its individual distributed pieces, slice arithmetic, and separating collective operations from one-sided operations. When a ``gain.ndarray`` is created, it creates a Global Array of the same shape and type and stores the GA integer handle. The distribution on a given process can be queried using ``ga.distribution()``. The other important attribute of the ``gain.ndarray`` is the *global_slice*. The global_slice begins as a list of ``slice`` objects based on the original ``shape`` of the array. .. code-block:: python self.global_slice = [slice(0,x,1) for x in shape] Slicing a ``gain.ndarray`` must return a view just like slicing a ``numpy.ndarray`` returns a view. The approach taken is to apply the ``key`` of the ``__getitem__(key)`` request to the ``global_slice`` and store the new ``global_slice`` on the newly created view. We call this type of operation *slice arithmetic*. First, the ``key`` is *canonicalized* meaning ``Ellipsis`` are replaced with ``slice(0,dim_max,1)`` for each dimension represented by the ``Ellipsis``, all ``slice`` instances are replaced with the results of calling ``slice.indices()``, and all negative index values are replaced with their positive equivalents. This step ensures that the length of the ``key`` is compatible with and based on the current shape of the array. This enables consistent slice arithmetic on the canonicalized keys. Slice arithmetic effectively produces a new ``key`` which, when applied to the same original array, produces the same results had the same sequence of keys been applied in order. Figures :ref:`figslice1` and :ref:`figslice2` illustrate this concept. .. figure:: image4a_crop.png :label:`figslice1` Slice arithmetic example 1. Array ``b`` could be created either using the standard notation (top middle) or using the *canonicalized* form (bottom middle). Array ``c`` could be created by applying the standard notation (top right) or by applying the equivalent canonical form (bottom right) to the original array ``a``. .. figure:: image4b_crop.png :label:`figslice2` Slice arithmetic example 2. See the caption of Figure :ref:`figslice1` for details. When performing calculations on a ``gain.ndarray``, the current ``global_slice`` is queried when accessing the local data or fetching remote data such that an appropriate ``ndarray`` data block is returned. Accessing local data and fetching remote data is performed by the ``gain.ndarray.access()`` and ``gain.ndarray.get()`` methods, respectively. Figure :ref:`figaccessget` illustrates how ``access()`` and ``get()`` are used. The ``ga.access()`` function on which ``gain.ndarray.access()`` is based will always return the entire block owned by the calling process. The returned piece must be further sliced to appropriately match the current ``global_slice``. The ``ga.strided_get()`` function on which ``gain.ndarray.get()`` method is based will fetch data from other processes without the remote processes' cooperation i.e. using one-sided communication. The calling process specifies the region to fetch based on the current view's ``shape`` of the array. The ``global_slice`` is adjusted to match the requested region using slice arithmetic and then transformed into a ``ga.strided_get()`` request based on the global, original shape of the array. .. figure:: image5_crop.png :scale: 60% :label:`figaccessget` ``access()`` and ``get()`` examples. The current ``global_slice``, indicated by blue array elements, is respected in either case. A process can access its local data block for a given array (red highlight). Note that ``access()`` returns the entire block, including the sliced elements. Any process can fetch any other processes' data using ``get()`` with respect to the current ``shape`` of the array (blue highlight). Note that the fetched block will not contain the sliced elements, reducing the amount of data communicated. Recall that GA allows the contiguous, process-local data to be accessed using ``ga.access()`` which returns a C-contiguous ``ndarray``. However, if the ``gain.ndarray`` is a view created by a slice, the data which is accessed will be contiguous while the view is not. Based on the distribution of the process-local data, a new slice object is created from the ``global_slice`` and applied to the accessed ``ndarray``, effectively having applied first the ``global_slice`` on the global representation of the distributed array followed by a slice representing the process-local portion. After process-local data has been accessed and sliced as needed, it must then fetch the remote data. This is again done using ``ga.get()`` or ``ga.strided_get()`` as above. Recall that one-sided communication, as opposed to two-sided communication, does not require the cooperation of the remote process(es). The local process simply fetches the corresponding array section by performing a similar transformation to the target array's ``global_slice`` as was done to access the local data, and then translates the modified ``global_slice`` into the proper arguments for ``ga.get()`` if the ``global_slice`` does not contain any ``step`` values greater than one, or ``ga.strided_get()`` if the ``global_slice`` contained ``step`` values greater than one. One limitation of using GA is that GA does not allow negative stride values corresponding to the negative ``step`` values allowed for Python sequences and *NumPy* arrays. Supporting negative ``step`` values for *GAiN* required special care -- when a negative ``step`` is encountered during a slice operation, the slice is applied as usual. However, prior to accessing or fetching data, the slice is inverted from a negative ``step`` to a positive ``step`` and the ``start`` and ``stop`` values are updated appropriately. The ``ndarray`` which results from accessing or fetching based on the inverted slice is then re-inverted, creating the correct view of the new data. Another limitation of using GA is that the data distribution cannot be changed once an array is created. This complicates such useful functionality as ``numpy.reshape()``. Currently, *GAiN* must make a copy of the array instead of a view when altering the shape of an array. .. ``gain.flatiter`` .. ================= Translating the ``numpy.flatiter`` class, which assumes a single address space while translating an N-dimensional array into a 1D array, into a distributed form was made simpler by the use of ``ga.gather()`` and ``ga.scatter()``. These two routines allow individual data elements within a GA to be fetched or updated. Flattening a distributed N-dimensional array which had been distributed in blocked fashion will cause the blocks to become discontiguous. Figure :ref:`figflatten` shows how a :math:`6 \times 6` array might be distributed and flattened. The ``ga.get()`` operation assumes the requested patch has the same number of dimensions as the array from which the patch is requested. Reshaping, in general, is made difficult by GA and its lack of a redistribute capability. However, in this case, we can use ``ga.gather()`` and ``ga.scatter()`` to fetch and update, respectively, any array elements in any order. ``ga.gather()`` takes a 1D array-like of indices to fetch and returns a 1D ``ndarray`` of values. Similarly, ``ga.scatter()`` takes a 1D array-like of indices to update and a 1D array-like buffer containing the values to use for the update. If a ``gain.flatiter`` is used as the output of an operation, following the owner-computes rule is difficult. Instead, pseudo-owners are assigned to contiguous slices of the of 1D view. These pseudo-owners gather their own elements as well as the corresponding elements of the other inputs, compute the result, and scatter the result back to their own elements. This results in additional communication which is otherwise avoided by true adherence to the owner-computes rule. To avoid this inefficiency, there are some cases where operating over ``gain.flatiter`` instances can be optimized, for example with ``gain.dot()`` if the same ``flatiter`` is passed as both inputs, the ``base`` of the ``flatiter`` is instead multiplied together element-wise and then the ``gain.sum()`` is taken of the resulting array. .. figure:: image6_crop.png :label:`figflatten` Flattening a 2D distributed array. The block owned by a process becomes discontiguous when representing the 2D array in 1 dimension. Evaluation ---------- The success of *GAiN* hinges on its ability to enable distributed array processing in *NumPy*, to transparently enable this processing, and most importantly to efficiently accomplish those goals. Performance Python [Ram08]_ “perfpy” was conceived to demonstrate the ways Python can be used for high performance computing. It evaluates *NumPy* and the relative performance of various Python extensions to *NumPy*. It represents an important benchmark by which any additional high performance numerical Python module should be measured. The original program ``laplace.py`` was modified by importing ``ga.gain`` in place of ``numpy`` and then stripping the additional test codes so that only the ``gain`` (``numpy``) test remained. The latter modification makes no impact on the timing results since all tests are run independently but was necessary because ``gain`` is run on multiple processes while the original test suite is serial. The program was run on the chinook supercomputer at the Environmental Molecular Sciences Laboratory, part of Pacific Northwest National Laboratory. Chinook consists of 2310 HP DL185 nodes with dual socket, 64-bit, Quad-core AMD 2.2 GHz Opteron processors. Each node has 32 Gbytes of memory for 4 Gbytes per core. Fast communication between the nodes is obtained using a single rail Infiniband interconnect from Voltaire (switches) and Melanox (NICs). The system runs a version of Linux based on Red Hat Linux Advanced Server. *GAiN* utilized up to 512 nodes of the cluster, using 4 cores per node. In Figure :ref:`figlaplace`, *GAiN* is shown to scale up to 2K cores on a modest problem size. *GAiN* is also able to run on problems which are not feasible on workstations. For example, to store one 100,000x100,000 matrix of double-precision numbers requires approximately 75GB. .. figure:: laplace.png :scale: 35% :label:`figlaplace` ``laplace.py`` for N=10,000 and N=100,000. For N=10,000, one matrix of double-precision numbers is approximately 0.75GB. For this problem, *GAiN* scales up to 2K cores. For N=100,000, one matrix of double-precision numbers is approximately 75GB. In addition to handling this large-scale problem, *GAiN* continues to scale up to 2K cores. .. .. table:: ``laplace.py`` for N=10,000. One matrix of double-precision .. numbers is approximately 0.75GB. For this problem, *GAiN* scales up to 2K .. cores. The results for native *NumPy* are shown for the first, single-core .. row. Even for a modest number of cores, *GAiN* is much .. faster. :label:`tabscaling` .. .. +-------+-----------------+---------------+ .. | Cores | Solver Time (s) | Wall Time (s) | .. +-------+-----------------+---------------+ .. | 1 | 843.43 | 845 | .. +-------+-----------------+---------------+ .. | 4 | 560.03 | 564 | .. +-------+-----------------+---------------+ .. | 8 | 322.81 | 333 | .. +-------+-----------------+---------------+ .. | 16 | 180.35 | 191 | .. +-------+-----------------+---------------+ .. | 32 | 86.71 | 97 | .. +-------+-----------------+---------------+ .. | 64 | 44.43 | 56 | .. +-------+-----------------+---------------+ .. | 128 | 28.67 | 38 | .. +-------+-----------------+---------------+ .. | 256 | 12.15 | 34 | .. +-------+-----------------+---------------+ .. | 512 | 7.38 | 43 | .. +-------+-----------------+---------------+ .. | 1024 | 5.31 | 72 | .. +-------+-----------------+---------------+ .. | 2048 | 4.84 | 131 | .. +-------+-----------------+---------------+ .. .. .. table:: ``laplace.py`` for N=100,000. One matrix of double-precision .. numbers is approximately 75GB. In addition to handling this large-scale .. problem, *GAiN* continues to scale again up to 2K cores. :label:`tabbig` .. .. +-------+-----------------+---------------+ .. | Cores | Solver Time (s) | Wall Time (s) | .. +-------+-----------------+---------------+ .. | 512 | 567.46 | 602 | .. +-------+-----------------+---------------+ .. | 1024 | 299.48 | 366 | .. +-------+-----------------+---------------+ .. | 2048 | 150.36 | 270 | .. +-------+-----------------+---------------+ During the evaluation, it was noted that a lot of time was spent within global synchronization calls e.g. ``ga.sync()``. The source of the calls was traced to, among other places, the vast number of temporary arrays getting created. Using GA statistics reporting, the original ``laplace.py`` code created 912 arrays and destroyed 910. Given this staggering figure, an array cache was created. The cache is based on a Python ``dict`` using the shape and type of the arrays as the keys and stores discarded GA instances represented by the GA integer handle. The number of GA handles stored per shape and type is referred to as the cache depth. The ``gain.ndarray`` instances are discarded as usual. Utilizing the cache keeps the GA memory from many allocations and deallocations but primarily avoids many synchronization calls. Three cache depths were tested, as shown in Table :ref:`tabcache`. The trade-off of using this cache is that if the arrays used by an application vary wildly in size or type, this cache will consume too much memory. Other hueristics could be developed to keep the cache from using too much memory e.g. a maximum size of the cache, remove the least used arrays, remove the least recently used. Based on the success of the GA cache, it is currently used by *GAiN*. .. table:: How array caching affects GA array creation/destruction counts when running ``laplace.py`` for 100 iterations. The smaller numbers indicate better reuse of GA memory and avoidance of global synchronization calls, at the expense of using additional memory. :label:`tabcache` +----------+---------------+---------------+---------------+ | No Cache | Depth-1 Cache | Depth-2 Cache | Depth-3 Cache | +----------+---------------+---------------+---------------+ | 912/910 | 311/306 | 110/102 | 11/1 | +----------+---------------+---------------+---------------+ Conclusion ---------- *GAiN* succeeds in its ability to grow problem sizes beyond a single compute node. The performance of the perfpy code and the ability to drop-in *GAiN* without modification of the core implementation demonstrates its utility. As described previously, *GAiN* allows certain classes of existing *NumPy* programs to run using *GAiN* with sometimes as little effort as changing the import statement, immediately taking advantage of the ability to run in a cluster environment. Once a smaller-sized program has been developed and tested on a desktop computer, it can then be run on a cluster with very little effort. *GAiN* provides the groundwork for large distributed multidimensional arrays within *NumPy*. Future Work ----------- *GAiN* is not a complete implementation of the *NumPy* API nor does it represent the only way in which distributed arrays can be achieved for *NumPy*. Alternative parallelization strategies besides the owner-computes rule should be explored. GA allows for the get-compute-put model of computation where ownership of data is largely ignored, but data movement costs are increased. Task parallelism could also be explored if load balancing becomes an issue. The GA cache should be exposed as a tunable parameter. Alternative temporary array creation strategies could be developed such as lazy evaluation. Acknowledgment -------------- A portion of the research was performed using the Molecular Science Computing (MSC) capability at EMSL, a national scientific user facility sponsored by the Department of Energy’s Office of Biological and Environmental Research and located at Pacific Northwest National Laboratory (PNNL). PNNL is operated by Battelle for the U.S. Department of Energy under contract DE-AC05-76RL01830. .. [Apr09] E. Apra, A. P. Rendell, R. J. Harrison, V. Tipparaju, W. A. deJong, and S. S. Xantheas. *Liquid water: obtaining the right answer for the right reasons*, Proceedings of the Conference on High Performance Computing Networking, Storage, and Analysis, 66:1-7, 2009. .. [Asc99] D. Ascher, P. F. Dubois, K. Hinsen, J. Hugunin, and T. Oliphant. *Numerical Python*, UCRL-MA-128569, 1999. .. [Beh11] S. Behnel, R. Bradshaw, C. Citro, L. Dalcin, D. S. Seljebotn, and K. Smith. *Cython: The Best of Both Worlds*, Computing in Science Engineering, 13(2):31-39, March/April 2011. .. [Buy99] R. Buyya. *High Performance Cluster Computing: Architectures and Systems*, Vol. 1, Prentice Hall PTR, 1 edition, May 1999. .. [Dai09] J. Daily. *GAiN: Distributed Array Computation with Python*, Master's thesis, Washington State University, Richland, WA, August 2009. .. [Dal05] L. Dalcin, R. Paz, and M. Storti. *MPI for python*, Journal of Parallel and Distributed Computing, 65(9):1108-1115, September 2005. .. [Dal08] L. Dalcin, R. Paz, M. Storti, and J. D'Elia. *MPI for python: Performance improvements and MPI-2 extensions*, Journal of Parallel and Distributed Computing, 68(5):655-662, September 2005. .. [Dot04] Y. Dotsenko, C. Coarfa,. and J. Mellor-Crummmey. *A Multi-Platform Co-Array Fortran Compiler*, Proceedings of the 13th International Conference on Parallel Architectures and Compilation Techniques, 29-40, 2004. .. [Dub96] P. F. Dubois, K. Hinsen, and J. Hugunin. *Numerical Python*, Computers in Physics, 10(3), May/June 1996. .. [Ede07] A. Edelman. *The Star-P High Performance Computing Platform*, IEEE International Conference on Acoustics, Speech, and Signal Processing, April 2007. .. [Eit07] B. Eitzen. *Gpupy: Efficiently using a gpu with python*, Master's thesis, Washington State University, Richland, WA, August 2007. .. [Gra09] B. Granger and F. Perez. *Distributed Data Structures, Parallel Computing and IPython*, SIAM CSE 2009. .. [Gro99a] W. Gropp, E. Lusk, and A. Skjellum. *Using MPI: Portable Parallel Programming with the Message-Passing Interface*, second edition, MIT Press, November 1999. .. [Gro99b] W. Gropp, E. Lusk, and R. Thakur. *Using MPI-2: Advanced Features of the Message-Passing Interface*, MIT Press, 1999. .. [Har99] R. J. Harrison. *Global Arrays Python Interface*, http://www.emsl.pnl.gov/docs/global/old/pyGA/, December 1999. .. [Hus98] P. Husbands and C. Isbell. *The Parallel Problems Server: A Client-Server Model for Interactive Large Scale Scientific Computation*, 3rd International Meeting on Vector and Parallel Processing, 1998. .. [Nie00] J. Nieplocha, J. Ju, and T. P. Straatsma. *A multiprotocol communication support for the global address space programming model on the IBM SP*, Proceedings of EuroPar, 2000. .. [Nie05] J. Nieplocha, M. Krishnan, B. Palmer, V. Tipparaju, and Y. Zhang. *Exploiting processor groups to extend scalability of the GA shared memory programming model*, Proceedings of the 2nd conference on Computing Frontiers, 262-272, 2005. .. [Nie06] J. Nieplocha, B. Palmer, V. Tipparaju, M. Krishnan, H. Trease, and E. Apra. *Advances, Applications and Performance of the Global Arrays Shared Memory Programming Toolkit*, International Journal of High Performance Computing Applications, 20(2):203-231, 2006. .. [Nie10] J. Nieplocha, M. Krishnan, B. Palmer, V. Tipparaju, and J. Ju. *The Global Arrays User's Manual*. .. [Oli06] T. E. Oliphant. *Guide to NumPy*, http://www.tramy.us/, March 2006. .. [Pal07] W. Palm III. *A Concise Introduction to Matlab*, McGraw-Hill, 1st edition, October 2007. .. [Pan06] R. Panuganti, M. M. Baskaran, D. E. Hudak, A. Krishnamurthy, J. Nieplocha, A. Rountev, and P. Sadayappan. *GAMMA: Global Arrays Meets Matlab*, Technical Report. ftp://ftp.cse.ohio-state.edu/pub/tech-report/ 2006/TR15.pdf .. [Per07] F. Perez and B. E. Granger. *IPython: a System for Interactive Scientific Computing*, Computing in Science Engineering, 9(3):21-29, May 2007. .. [Pnl11] Global Arrays Webpage. http://www.emsl.pnl.gov/docs/global/ .. [Ram08] P. Ramachandran. *Performance Python*, http://www.scipy.org/PerformancePython, May 2008. .. [Ras04] C. E. Rasmussen, M. J. Sottile, J. Nieplocha, R. W. Numrich, and E. Jones. *Co-array Python: A Parallel Extension to the Python Language*, Euro-Par, 632-637, 2004. .. [Zim88] H. P. Zima, H. Bast, and M. Gerndt. *SUPERB: A tool for semi-automatic MIMD/SIMD Parallelization*, Parallel Computing, 6:1-18, 1988. ga-5-4/python/docs/scipy_11/papers/jeff_daily/image1.pptx0000644000175000017500000033663712662210366021425 0ustar mbambaPK!#{.E[Content_Types].xml (Wn0?4Mrms 0f"9vhE(eH.(o,|Ù^=yV cJu&"aG,r(T&r apjvaz1"ڭ\–+.]B!\ (2׶HKFbl[g-so[9aZn4~OgFWC?PK!&  _rels/.rels (N0 HCn ]n0$J<=aJf?b)X%rZDbt{Hl y(u6$U\R1)hT@.w| ?%*;j@5[ n і1dGZ"E[b\NEyr 4Vӣ׻,i y$ ahDSB`"lrǎ#)Sx~g&'Y}PK!c\#7 ppt/slides/_rels/slide1.xml.relsj0D{$;Re_B Sq>`ֶ- 꿯6zN.xQbZV ț`5 gIJ ]{h~h\B<ȢPV_sPK!K=7 ppt/slides/_rels/slide3.xml.rels 0DnR=HS/"D?`ImMB6{s xN}xxQb@7:iN-rQ_i\BܻȢPV_sPK!K=7 ppt/slides/_rels/slide4.xml.rels 0DnR=HS/"D?`ImMB6{s xN}xxQb@7:iN-rQ_i\BܻȢPV_sPK!K=7 ppt/slides/_rels/slide5.xml.rels 0DnR=HS/"D?`ImMB6{s xN}xxQb@7:iN-rQ_i\BܻȢPV_sPK!K=7 ppt/slides/_rels/slide6.xml.rels 0DnR=HS/"D?`ImMB6{s xN}xxQb@7:iN-rQ_i\BܻȢPV_sPK!AMppt/_rels/presentation.xml.rels (N0 ;PNv?h.i$dEIk V[D=QO_v`,W2'id*.뜼nHdJBN`ɼ`?[mU9@-0+ O64ahjYjYLi EfrbUhj%<a$^@dAl-`gy^IHgfxt>=БE<"]x ȇ Ӂv ԇni%Kptkh/N5}X!tvLƔnN;=_WA;X PK!h ppt/presentation.xmln0'"_n!4"T[J: c D~hR w?>?3KJDwcptYmA^F B+^aӼk-W: Fٜd\e;.5WmAl`/E8PJ.|$^o6?4k$L41\u]UۓdԼ7iYź;xӳM[ƨKi$+f1,o dViC8,i7Ln(_NGV/5K[j֖'xG$ӏ ls |dLeV?uiO[=(ʓ[cb4V/}1رCAl;԰UV4lmva'n/4t_&W_]hETӀ-[>y՟ij$n}m!Q]`*8F1zo"H̀[-7GalnQ~m(v_ ќ+ӣp}ysrAs0A(ϱ,iB>4JhM2= J(L2(^F*(j .?;HtO_OLx@,PK!Մppt/slides/slide6.xml][oF~_`Y~dhӠq4Ej)Rh_ߙ!1X2¼$8ss?>l2cu/fֿ̙I\7W߄3cW2Ί<]ُ̾?oli|7۪/.vmw*i{,o.e|Z7مm&^%:I*MW2 -ݮM6qMRlz/ҶbvWKo6,vŪg87$E_g͞LwiOVUݚԽ}I TI^J?-LST%tfM]7bpq<~V9xX̀//Ce$kr[G Ђ3N}(avjH>&1zUŌjSF"p8kF%n42nv|@}3M- y:#h-l|2j஼JcgY`vFŅb@|;p㵃|ywz8ݲ56oҷeYߦxg8a쀶; c- 4lm4 % v}-ԶUbcbKlR/aeY'ϙdjHL2 c]WMu5hX{ܸ_"X¸cH6U|ىtdu8\_W:xy/FfzxW,PK?w߸~,>[|/,֡lW}d)k >_~wLY^kLi .9| |C _Cl  ׿buE~i!H1J? D-K/M~TEI1P¬RC\J$Š b;\D| bliMRL4NC[S(}[b÷(5i;*(5Ħ%*Ԝz)%kú>7ݮ.rlй4wQ#0s*&ވT乨#*rh#^S[8mބ UHw$Fbg#T*ɶbJECo kJO"ݑl k)v6RL"y"v)tH-s[(1/ ]lDXCþnˆLbųݖ>~cDjމ"#k':V`@*R,mF|0 v%T#>JBT>}RL5HqRl- HEj,zDCEj,! 'mf' cn;tx,vk;t7{1prp2?yA'DŽ=1J,q/)N% z8?ϗgْtZK`k3S5[o?YVķ L:$y-peWTbG+HZ@@(GwaLHfXUUps[~"?GHvWzcʥɣVtWY~HQM'ꦈJ9Lu>/ Ȗ8S)8CN>L;bKN3⦅Xz聾[HZCxuNX#z.Լ-hNrl1VH*&mľ8Ar*;.ğ-O %#՗-H5fmRTs|$r,!6_%p&iS.2W"#4ЂΣ1Ed`(NQDFF [#cPp} BI6j^ML(PýNfv"dFƏ3|gj ׵hdLRE{D.-WZϘ2i2^- i j(3" mLϠ IJ rm#XMz2 G342G|Q J1A  $a)^ )cx9aG %P'ݐ6g46(7"Q6dgWʍ<:ͣ1Ilțҟp-wY9lhMhMFޚkiB82QNXQnVsZnL"pTGlvs<NxYL|VzFGE 7 {š"S_ÞpؘMQEe\|NrSbC]Ua԰3>moj]Jl dS{:ṦFccPZ' ,!ZS<2|=Q%dsyQ[Oؘ6^XoMSņS_S((7>yQ?EccrrCE蟢19l((r$ RǂN9aMQxQO^OFC46&'7^䰡ߚSF!7ršv(ϟ2 }Ccl('/p_ȟ&zQxQO^Bnh;x((ңSFohl VzPQmN0ϣ('/SjߥamX 7^XOn0ؘ((?k%69K| YS؟޸,2MH-Y5/#Ļ*-:!ɂ"TPK!6.(ppt/slides/slide4.xml[o8?YuNF;Lc9wJb,NVLrtiIǦ-eQ׵wWզW5r\??&]W6˲4vv҃w7Y9on;{v7۪]mue[~V(ҷrۗsuZT?nT#mU|jZ[/^ܺlvfYoUdc3wsmf%Yf=uݭk[/f{lYgjWw]׮.oj%p4@N۪G݇v{=o;or _ۯU>}WΠxrVwB=?.n~zoo0~hJbv%iNs}Ii&/RDQYG&^pEF3~}<ȁ0z#P H"Ya7 H΀@o-hEduQwfMym|Ժ5u%A( ѫ`""OTLj,Qc4dϤAa$E0(51vL9mU]ܵחguݕ'(x2sj=b5n^V^TowjX7C;g;ϸvADե mw݇j_wTK`߀inQ7ާ_$N |<\oZk+kMj] ?rwB6lU*?5K{؂>~uG]_J躑VZt}?@F1N?אyVĜOf6A?Py`x'3rjضG),ضO3@B5ϥmvs s1bWc\,1(vƘgc.m;bk= Xu;Lg h8n YZQTDC} n> RS>'2.ƙ#Tb\dhK$a˔k#nVyT; Rks܄)Э:qu : Rlk#w zAtcu!õmyA%'弞??$"BAn\~h+7AGNܡA&@Ǚ#0eu$9$521TC[ ׃ S&n9ʈ#'hMБݪ7A$t0ښ/LΑrF[SqsWpdH#*5Fk҈6%akvVfrs1GYȇd @h;lv>G2sG\xOe@8Uw*#nrs0ٚU79VsVDxnrs0ٚǔ $)`577QWnL4"[c6-͵-QQl؃xPڍp"!Yđ` @8 d:[X`R[G\xOe@8Uw*#nb4`5AJq\mkjS3sG縉9@#`k#nnHP1:҈ l!l}d+19GB9މ@8s$P{KXrs= !@8L-c9@#[u&[9@#dks<59pus|*s g59nruiM\رku>7`*sBHp֑ dKuNI2["&ClMv Zp}9[Gqar1 ׭:GSqsGzbrsVT9@s9R157P%{li_Ehm [|ol&I9q;Q< \1:|l@8z s|"sBsVީ9@s9)Э:qsRdkss0ٚ∛{*&[G=?z.bѹW7^/s1]+g+ޑaj WSDQVq/ xEq,?m>T~[-:?e^:n6?v~p٧~M=nmM-;]w= ?Vܯ7^rvp)Y] !՝keۖߥ'a=~N^lje[dʫJ^|ϲO]xgk)hU^`<}[Ox.EKr]ij('Zu3H_s'ǰ?h|Yd <+GŰIT@"ݡ7uH#ONj"+K%"MSo4cPQF*9[ԫ%ꮽ<[Z7^V7ާ_$U]vp]]s{e} szѵ`)ݽTh~,w7OW6Ki*:s3ߕ(_y6' 1OQ+tH8 B 'Ƹa-NZQz~,_ªL[{0 bR4) &HoO Ժ{ \Edq\o!TJ}#>? R> |Rq v1N96GĢ^vul'jEŇǰ.ưV" !߈$pZ"҂F 47kMmX\Soś~ZlDZ$)} k9mX\SXi⢤)ү78uN%=ML7a-.|}y>S8 ֆqEIKRހ;4ú X q &$aG3uѧXE%y.HsNs" 1kq uBzSXi⢤>6,.QnKV>_o0rN(70+¹=],.Qnu>%7n8g7,. ZI(Bf_ f% 0p?0/'hfqьq@9kuRH A/ja][o>z zC) aqQ 6tpN)+8%hNEU2 u{TͳY_ٺ=PeXV}J1 8@Uj:iYU}n-.SrQ6 kù$S:ב)N RX\4䢆Oam70} hاn8(,. Zӆ^\xu~i7(^ݰ5O7z_ aqтY8uO-HE, aqQGk6ӆE R.Ր=mX\T;C˹^6%5| sQǸh\Bސ>,=arQ 6d}6ӆE〒Xiq@/f=m\4HV6L.uV6L.\T!|=m\4HSo87L.z_l7x곖 SԞGaӆEA+ڐ>Eydm \㔾k=mX\4zmaӆECJ.:6x0s-RrQk=aqQ Z)7\ECJ.jֆsڰ(hnh}S,.RrQǰi#hHEz_ aqQ O}6 ( wn/ Gco82~Nt7w_AUߛ+!"(8TEAniEZ_{ H;"%{o 0~6kZt>~By|kvï|^Ԗ۹lڮ>s??vD- wֻ{+x>ml~ռK\-v[wguU6|ww; M=҄7. gooYmǓM˃Q%h ab1/V%.Es4P%)wu!%X XʿvjQ}C/ F-kh: mJ-&le4k,~k䭖s?ICzvvmP ZZ?j",b0"LCU^-n~W0J,B;oVFc8r}hWHX}LٿH:䙭"ҙD- {ӧuGpNvhx#Oī;$f^V^o}0H ݇wͲ%!S{(_M:es(HA|6,+R abԊmQ&ʆ6֤E1%v1| ʏ]`Hi7tr\mpIWDLGC8V k9+EݧVq 88Ѥrt0"AIۍj}0"A8E~8`m^7'HЧD RyH\.y#oV"La~,썵(hPHspRP7wJi>cXbXH0솺CO ݧ6ӆ7T6tpN߈))xcǰ7bJKpr-:&f檌Y|WҧE])Xn!58ݹh7`+ RBՈs{0A#߇,XL̾Ԇ7@+} ǰ7"oDSXiBֆsڰFD7O: oX;soH¹=)־6MS>kv*K0f_ (k r"HR1sNsvE9uE%pMA7t1sv pN -lj>J>4Cf_) -| /Wak#-,} f?'}} }n2C38 >7Aѫ|#kOQUN k=a G $6,Po>ǺO9X|#ҧl7XheS|<{>ek=m35Xi#,Lg)zmaӆ7P+t1G9k=m|?ȧ}k=m|#,(So8bm-QnOam8 oVbO1FXP ǰiaA_V4pM Һ=Z/ֆkso|C1{ڰhp-fam o|CpOP'PqQݧ0poISXiSXi9)}q zFN7z_ ak A+>pN72Rf=mX|Bg7, a2Crdm>WO 3od|C)úfC>6,Z!ԆVCy_S^Srod|C1skQܭV톬K Q2}9X{6\Sz_l7h7ngb{n;ɟpⷻ[-~ c*Xw7^luѠUߛ+e"KEo@(HԶr-$b8-bu}KXkCY{`բʻ_'-gKf-^<~~ujo6M{mWmVwn;h;]w=<?ies=͟\\ xm˼ݺ;'廻KlZLS4ͽp&<yٖ"_" Œ}(Tq,b1tXvjQ}$''^_$Gg#M _.=OfְQY)L~h7[NeWS;`lgZc{4# A(ϩ*aif0BeQZ-gߕ)}O-}q~ }[~[u55{#CRFcFBH0ʥayq`7 Hi/k3mоo`E(]~u~ ^F:aj-`q SdE pLaHSaU R\WK߫+>+WO`WŒ~:QCOY`x̟I3ޘOPjpuaȶfWq|eA&<_>'EntBNUE[uEhʅq>x.Ou; ey̿v9*-ZeJ% ?Z웄]V!ј(gvMiBGÀ̮i>H CDPќ >B1iN]Ӵ -iv]i9As6Y|ț􀈃Dx4Aaב 7 |ǜa$1m;îpz3.'}W]#`gvi%I%,!H1B ahpİkNSX4@8z@|*<hpuAd1g5E۞X#!my>yn􀈃,b |J 4>@cD<ϧ2ϱԤIn9̘[4@8vMҶ[Cݶ<<  &9-!HîIգ` yŰHc?zngN߁*h{ /V~|s,Na_kiFP{Q(" ,#̐Y+ⴈcxohfჹV(~u-|kw/>vmWmVwn;hoYYﺋe@!/겹U [.Bݺ;?仺қ{Ͳl$okUl?l^U0 }n/)>;2j9})8qd!Ox.0 ^ߕfD,򴀗m,n~ VF ١?Gp$ XY}$Q*'@IܫeY(&i@Sw a/)HڅQ$.E{i*9[ԫ%ꮽ<[hZ7^V7'$U]vpyk}aN/V 30:A9"JEX?fkcwd*GmҍiY6̥$jNIqk=mSePO *2.0٧LnOam8Sk˫&*rqbֆkڰӄܧgJ\8eTukbzMS݈X )|r+ֆs0ouLo ^7X:-q5J@+1`6,. Z!)Ȁq6-HS8unaqт>6,. w!pNvpQSzcX$0Ȣ!2N(qJ\B S_ֆ0(jPt^}9H eW\4˃1r&EQ+vʝ/֢&EjC):SL.1Bm>6L.\T) arQ⣴ҧ/&MC ad\4]f )Xٗ wjy hNiI hj#mxR}9 V ~8/֢ECJ.ja]aCVSXi⢠Bm>6,.RrQS}X\4)zk)%tJ"V:6bx6,. Zӆ^,. a4s(%z$vaqQ 6tpo`U>,5ӆ^+bm8 V贡|=ZkHNdY\4F/ֆsv⢠:!}P6,.QrQ'c#ǰ̾^`5.c-JE,GǰhZpZ/ֆs N/2FLEu1k+*Րdݰ(h0N} EcR.9mX\T.GSkank9mX\4䢉^6,.N8Zm#ǰ̾IV`zm.wƤ\Tp.ưOֵ(hPOam8 Vֆsڰ z/aӆE)}6ӆEehbm8 J.f9r aqQA/* f_h⢂>k9X\f9] ka][o$jCy_ V B&BmȺ}/aӆEJ.jbm8 &\Ԩژ6u؞{S2}~s% ;;o@3]ՕYeGCX8W9-qZj/Z:sP"r6n6?Z}=Uh;ï|^Ԗ۹lڮ>s??vD- wֻ{+x>ml~ռK(j[2olItmwT+z o]m5U5-x1uap0~CǼ~21$y 'LbY*)&\~I*Xmb{\&_щ!5)6eHz N$Rº_sT|yO$Zn$/wlA37xZKG^$D=ct=Er]d.տO@{D+zC]zcA;쏴QZ!Kz_",MG;o؁u0@.n/+O \4:"-`vp-]~u~ k 9r),O@?cOpMJZzN4jP)ReCYٍqRn>9p' AzS 58@fjا$ Ĭ f =F)E1  5&õ0[ SZDqJuYٍkQ~6dİ|vsq a 8 ox,. Z[ƑEV?Vi'R6ܴ%=)Ǎa}oݠ䢆O96} 0 B>Z g{ڠʧ7ӆEIρQ> '#}p EIρ! 84K縨uHhB#`"ڰ(90qFMmX\ç7eza#Hρur\m0:@%=) 8`_(^bqQs`OW#}J7ng7,.JzL\$I{9u3(90"(3}m Az\n8i7s`eNS2z=߰΁>`u6|Qs` p}"=F)̾p |QS} #} v9' 8ô|)E-.Jz^8mX\HpZs` 9Zs` pNV(90ҧ |EIρ1}=Z8kQ8ÈaIρQ>EoD)h⢤8碬 aבcX) &\TrdmO9@zmֆ{qEᄱȧ0pm'X5P/Bmh5$o8g7Rk=hPZ/ֆ{ڰ(hP2NǍa9NyZ}JJyQ8mX\T;]2}6[Z\%)Z#ǰSU'og$eu\1v⢠BmhYòO9@(^`q6,.QYXŰHS8u.hFE pNN֢Oam)>ٗ|EA+vC%f6,. Z!%}1Oy]ۋl'6wC y뭖s?]KXw7^bmr{xziୠ#h~N[rϱ&",|&0 p?^Ezo އjoE'wȽ /ϫV_O} { ?v7򽶫6d4a  ЏZzW͛?/|oj;m˼ݺ;'廻KlZLS4ͽ,:[Ul?n*` ΁J$Heqe/s-RIE*X(6ӤA)cuKPSRիE]pDߟzz~i_Fk41|0:TJylJ~qQ/_wr]WgYrlPK!Yx-3g ppt/slides/slide3.xmlYoH/pǹS)>WWKaʃLK2 rͧ$̐B4A[%SbFdD/##~ܹϋj9y厜|9]nד?/~i$-5hO45&8X͠E]QoL/8D[㔩HM-LW_1;kF- uzwq=Di#Jql~ nˏ¹ѹ+AVZ,juxw;᭺uY>dEvg3}!6ǻ~o6* 0lu Pٺؔ¡D)*5rsx G0tV5ƫJhu/oQu OGȒMvh?Uv_KehHvj%~{]B*X$`T ła`)w7\K牋$]$V嶂Y0"") 6%YEsݘ0G ES°eLÔvlᮩ#>k`Pa[tua e~Z^aK= +-s}]FpnfGۡ7tp61I{7K_s.q(K]sAʲ9GÑZ}wؓذ0θÞ qv},{X^;Aذ0CC@${R>ܡ V5̱:F: F59T!&w6{&h(k_NCV\h]#ܢam^EA60ܢajd7+ ~Cgt}BņipiPnѰV5SH(hX)w$[4`w܃ܑ`nϝWsGEZ0cܢajF ߔ5[~s[nFϗX(+W#pU,y@$\욐81j&7G%X4m] 0{/iZ7|}mu !kKPb_}݂k[p}mu n!}mu=KT IؔMi=Ojubs(Ėi pKS>[9ؒ*W=퉨rRP ><0UK4q3e1Mm<-' z!DB1mtv[yd5sPse6\6O j {;5Wg{Vsn{a!tslq'UZҙS҂~o q^O\0YIbQm2"{Pg}~R J5>^|C]NkT6~)>=$Jg|8u?km4_ m|uZn3zIjۿD/GSJ iDe~z2g%^.ֳh9z9Mbϴp3xvI5FWڸLgcZ#r-|6r9>^_M# sK H$f+%~܋"I>ќ6y+22Lo#1ɀR?kҋqF$nRǽH'ı28KGJê)VX2{bq[ےZ6?E3/$ _)^L0WJDJ1b~Fj.lG^nǻaWR_)q![I9d E*O֎laꦀ%[/fyK![6bwXl硸LHmpv17@՗=M (1[ÌMm55t?d P/[U(qʍ.+7}(=![}M-q![I9d "9_8dkBpVjTW6قh;lud;-XFk}$1[62\c ^9Ă5m }{ͶHZtz9mE:ТoR656e.2 ^-sA\9 :z0J$PK\qy0/mE:ТՑ[PCK&#oKBVZH gx-g˺%:on?q^~c5'\㇫bA?WWWqHpBKuymB//|J1E/Oh]ljЋhꃲ7%}z_#j1&l1^ݩAXogeSh?o1͗η(E~-m7"o:)HfgVbutev;G0I|8_;_\'b] L?dkc|tw̺m'M>7BA,ٗΡQ_+Ԣ6x*2Pʜԗ[SbOUlt]"!+D2ULR/bkTaՐU:*ڏl;;qAf7dNAcBVQT=YEVգ,hM-TqVV4)*('YYXE;⤪4EߝU' rRUT|qu;'L9TEߍ* ~wV *֧-8ul{i0FRQwYd'A n]v:q'UEA ywD|IUQ9hA*ӖqάJtch;U$p 9q+xRUTZt>v)WXƓrЂf| GCjbLH^Cl9^L@^D}P|T'0&9^5#uM5ͳt'u&9[7d[HޘU ǜ͇u~G@7VPؼhݱokĜKPkD9Gpi NU&j.*U:s7N;U g]M< nyQ}u mU7}|$l^vM$GE뎮u#݄g],6S|tz6F~'flNؼx{#auG:\F|VW+c0 CL&Q rggӛJj,|z()DiSMY %f QNR |} JbY#PI f}~vwkh!^\+GzݝTZ9u ZuL[N8a%=,?YH;YVbѺ!k?1H;1r l~@1cAvKͿ| {t|䍝:UE(;uGHؙ Nv:JRl6/kY&oE_|Fa_ n2\~c5'\臫bA+q E'ޡy(jx{P{:HۧwȻ9s7~QM L0}O$8cnhں΍]k޴Qo }M~I}muM㾦{4-g^u_}R6}mK5۱)5ћ/{Z|hWK([":ܧ)-MniJ`K'M<2tm(ܿi_jݴ f"1 lӇeeɖדJb8 $#9+yl5 ls_i3˝j,șxz®D`9]Ё^s,. v%o vAڶz`aۼh 5օȆk`X` (]Ё DvqqLѩfX`9]Ё^s? $g7D# v[v v vAZj.gD:iU+MR?L28՜D:&W5Q C z"n'量_I=v6cF5#4ėZ|z()كGzi&|mUx4L f374Ԑ6RqW)u,2e%axDh qQExSa>aZQ#ìW(t?J㱾'݌[vYogdHɸq РMx$QVY0jn~jx bX}#ws6j~4PFw=ٿFbMF#WGcQ>Иc,oQ,xTáX-gJz]fsd!}QL#GwY\h s&[1O۪޵!u$l~ 6-J3MĢ>KHJOu=z٧:ZgFSj;:֙c'::{xR;nh]>SIbaS-:(Z<,7v>^MEzUzYmw^Nl]ol]lAxJcaEONbdZg Pl)m]M5*:~w ߺtҡ UGb>@y@|l>lFfvIIW x5MD&uMТմhݐSҰ'@nZ)iؓoUC:NIîO$+Z7d4h݀.ZPOFbSۙ /QMwOG~Wl׌1Ո*Q纰y%qnj ͇E}[nZ'Bu6bSי֙«uFⰛyXauG:NIq-[+l?8fNؼغ:"6/Zׂ=7f|q\%dN\bFؼ\{.26/ZwtR; Na[))vu߉Q26/ 1 ;qJ ;qJ ;<yѺd@Q杭#wV =$hzC}_MO?H0<+O+=DAz[;_%IBJtC  Buw(-btG -vgUPP4kgwdQ{v|!CTb;iyvN2TjώmN8^]{ozh"ܲ1]D;eWJR=K{W B3w(x)|{vtGow%QSԂRRq4 4zsSXuuC $B,vʞ=YѸ;oyCvvh!'N?+QiDhώmb;g;YѸC<㝢N~V4Ɠg^Ĩ[3ަT9UW+<,4>LGƇI;fgӛ(5٧7Jg&QTS4FY:EJ:pdtu4Ѭ@%qުeݝ|XC%yvݝhVRu>d,8"5$NayX)?`[svvw=I!{&vwb`yXuCukOȿ|s҃nuR&*ZՀL#ÊjbLl|zz6o"’ U-:x"ij`UF {'{8$r͋;c4r͋]%\auG:FI#WؼhѵGHى/6?rb9 +jU,Gx4.Qlyo.uB&5_ Y>ewJDQ+q E'ޡynB}/lqtb{#s7~Qx_}p| #-⍚sմQon_ӽ_~j_}¸k[Hc_}"Yƾ{E쾶%~ kcSj#7_-H׉:FѮP'4EtOS@[9Ҕ'(B^Q̗f|SFMGALY4 MP}^9*ًjC7oZ&](NЎ~k4䅲^{Vs[/7'Vs}"js\S9M7>,n 1(OƵȧ;FD I⼤ʻ`ĢK" R1[jPhԯuwD}FKb }p4;(_?ϣT2Mc<^usoQη=Fݳo|(byo^?DoGJgh5BjO mPPp+KsqӸƊ<~x ir<1r%+U?~+W^08 :됎d'n/?z> M\?ҺC>ϭWnubu>$A@~D14V;cX)m됨+rBU*$fk2NYl2,GN6^"d,MțC,5ۭWڮrƮdZ#8|6r9>^)[\~aK<2oa*]]vG$c ="ay̏{AQdBÆI+e~"ZKv+enf hŠ2bے"J+ۮWCG'2̱dnhR!.Ndޟ5VmvJ+^ɼka2_8;JR2{JUd3RŢ4%TؘOj4~hjviVl~TUM!"ki@CT`M>-g?ĖgHղ I:<KtE]`Wol >B5 .oZmyޛyneLz<KnlMۜz)& Fo$r Hς]n5M7S4)]G7$BaKkʰDvo o3+DH[歂]ChpɼUanjeC҆V^v>V#>L.7󜁏Ո] |{Z(s{Vo^ Hσ] a1[]fή0G) bÀI3E>  > lP Ց=b>-<V!Mp_6DЁ A1hQz)s>-ܴzcZz9k[myޗy3 >vq |@Zz)&G.@2Ց̟FS.2k5H2 > ,B>-P]Ѓ+d:Т s>-ܴ [h#>VieeSx3 :жm*pJ5Ȝ@2KDhzJ`WG2jM k+`#h|"i |@vX~BId3hQHd3 >L.VzV"d#l|moz4me~oaj(|9/Fǿoשq*feI6vfÛ4*qg߿€_g4˪L/.2Y&໛XXԺN/ .*3}~s'uU"I Z^.Wm=Nunf7P*]U_Xm53Ȧ#YE^7fujY^)t}HʤO~bu}W%%~5[S9-`%YP굟WEUvYl6 OZFiEE]3bpq)noO?S~c;3_xl+c?>/(;_(}Z޴P4?em s_%G?q[ڔ7p&?Ȗ{śx^cxsB}?Q`{4BrM_Ï0riŇUb]Zq:3:oݷ~]\(&t8v= `=/wܰ52n"X&Jܚ;gUbIZ.4;;jSe sx$6eŰ!/c7tz]X?9Ц b ? 03#Y+Iځ'قW);8m-Ŧ &jo]2*I&5( S\M33qUJ,%>(V"NIdy5@Z06(Cc vĜRW=8!&*q d\| l"^X{vmHUd +$ޱA^#j;66#P{mPd (4 xxA8w'p\|a;R(&^eybDo#;s֝/O> Pkd_aUӟ{ }VHS܅ߒ媚*x7m,zzz|lBA7TO[lM`FV[4k79YW}P5PO@5f97"& cىP_P#P5z|,Ǔc[yٽofNuPG:kY(;M:NxRQEPtN(*f*fGd' 6y3G7};!FKxX*wB7"O:;AlXBUMtN4}PIg?O9aZ H1qs̫&yG?En,;3,/&#шsHctyf` .nRv!܊e8tZ8Bm/~J01L HKN(ҞVEڀK/mU _@Pd9Q[s+tB7bn@N8o@~")mG$uT9 ǁSyF8H|yߣAG/D/fH|m!ٽ[ao*pp瓭vpkwKQ >RF-^_aD=Fd^کD-_>Ѩ ^%D-/Y; R\ڪ<Ѩ59]Kj*QC85d~d9]YAnVk ӻķ[g~7Qɵ?!yӫH ӓaHTC;!F 3KycG Ev$ĆLaGV 1"&T2I B;HړPK@C bCchH2{'ĈP_P&!P$BCQO;aC$7y6\̈́T, x|YXc A~scl%mSYEl wq-s,:6А~h~WVI*8]hrX-%gXެxfpl8'ƃ5eaіRJI%V4lW_U wD׮Ղ*UZP7vV UZ*Y/zŻ wV,Ћ=駽e@f4 Q [YRu8>K$|5dk<2]cahT5̐ߖrvʂhMAl|8aPplZ 8" @9V(K98^8KgTw0X:GRqnXfAl0uEHRDA7ƿ\ UD{l,> Fpm߮̂ox8S<~#Ufb6 7_?568~6. mk>Q+yma)о=*8l}(/PεmN#8eٍñќbL7!de‰g`TrYY|E hYVCQ7*ACH E7DBw@D(gB(mD(="m@=^h􀆢lC*B/|BqP΄Pa×_t! "VC9yMHD(C$kH]CLɢyJf6a2:|iٍP v 7K36n"mxCJ6z`C6! Sb86qRܐ8E/6nnxCS2A {XFl($xRҌ Pyg|iٍñ*;!Ҽ%XS,Av6}T߀IK36no"6z`C7A Sb86}^;zC oi4a =K36SoJ=l)fl8o\o)Y4anoVÆK36no8CE36no8"6z`C7! Sb86}Rߐ8E/6no8S`Kq_%W7! 1grbydksmSF}<)jӏiv d*Ttvɾ.nc8BLH 5x)713-8:k`׶ݐ{v1Gڙ_ 0_Vn]EӘʹmfZlK{lDͯw8M~.aċ![w7w,E23*7qnZ}6#۱c ftSe (*ċ:g}Y. WMutJS]Zә%*dT[ޓ:3bxkhdޯo5W\lꎩm1Zp3쟻JҲ k %[|0)bf&ٛ? ֪5}PTxM;.<;u9|>P|~AVen-E"94PDvo?3(*IUc(b~۲0leyU6'tfoRv!܊Ɗ(ES@\Q9~G0AECPd .EZ F݇.''08(`a*V./ݭ'"46)Ƀv|:wrҋdI"@5zL>)AB0Y3`2;GœkKm;Xk8axS^As8HM*/g:HZ;a+>7'|n}vl"i 3_os8xb1 CGQ|}!-HGң@W[|apv, ^UT|n!4YoC"JژnPj` RXg**:BK }v"a֊AQ}Yfmy6st vZӃ-oapY1u`Wv1NP6 0v#f V) ?$C# Q͑)|ީ!AAld"[(9%9i.[>GE &Hd:vY;gM9*$uXk~;G5\WKA<N\ E"^>4+0خi7$Ĉx_`+0٠LnYI,1x*4`~utݕ_-)SHkilKw: ݳÖbx/ߴMMg jXӨc& ނ,O#Ms #M^6ݬg:DIP͑kg[QIx6^~`hMKcqwgbJrd~ۓwfmi?lEyY}%Y\y6\(yeEhO hH1-`Pt}"P#~ H=)(geap^w|NN u0XAѠ0^Q GP АH^tx  n A`:Wh'L[ +"q̠Y6f~ ur((FSJ[\HXeh <@#^( iUݟyƅbd֔w]%hF#W ,zLE{ Ԣm{@fWx*Pffp'̬5*>abc`tFRG89ff0,'Mu̬E.S:"X׮6Y֫h_o"AMy"u"yNMzbUi[1"TD>lj64-(b-pWKcB6V t1֩XAӂ"V @MX%@(65 p)Y."Q W@ChJ^qhY4W*"V ++>JPS޼J`P%sJlS6%||p7lXJPmjf n`tjSkPV +,V9W LBھW*zA"kAaئf b=aZK`x,(6UjZ}j!\p}7{?\oYx:A:#V8כbH=Ƶ< k19ĩS!=5jۨUHmce^= hܛdr^NKW*ˤb{; -' mܱi^= ƵS"9S:m滟ܱ+sj+prHH?Tc@#fFcUL,,5\'zMzX#@8Wl@MzX#@(61a8 Ĭ5 P4Ĭ50PkWI< gjƛ/$N_#Jj/$Y,`g>Vg>X$̬E0Pl3l0G݈qM)jmf&B V:Ņ_tH0tHPzHPmf"Bq(ӵ"EⱠ"Ax"?D:)@@#/ F}X}DmM6 /KWJ^Cfie!i!O'XY["q$HY["q$Bj>P-RֆyNmXF Au C{̷a(*b7בJ>jQUYn`b@Fs1\qqDD D?Ĺs`<'09W@sugɝOy-|<>.6%90e[fC%]Ds5)S:Z15].\tԀ4|߄MS@N36[nxPoy͇D.(as= WN#|#<9S r-t,WS 8X) |jZSu[-`T[<& }W.t5|HPt j)pնK,إiXȓv%KvE[ ,ZM{mOvOS }WR4ash-ɚ̧!e#=i]6#G-Mv[_2˂]A@qK*WJ,-_"|8@;М߼9iN$e#WܗKwA^hS'5Ԝt7,]ԍ^-l&hR< K+șsyMV> Jb*.IfClFW)mPЯyyb|&8$e囘d]V7ѧЉOjt?ed)w *rGartգO m]@'+Ґz7( ~ >IIݍZ9&EO[MA-&¤'H/!+y,.@RJPl7Yѡ3B|9 ׾YA۷&aVW]VKQax[{ (ߨepgU|!I}ĝ\]A fЯd*AJ`,$fOAf".鞧S $M"<6ZJϓ+O*Bіʄ.`-0(:jxy0&o< 1+-~)+hY\hqhJw(Ze'T68{E&hYV%WZg*_fC5R]+-^݂$#p%rAfqJS^Y\>+cYNH:buxx4 f'`K"BW㖡霉휵y 7H 7efs2Rp }Ĺ,϶Aorefu .ýM. N%ZGh;^$C4%f^Ǒ˪)"*%l 5FFWqhqh J^2!{ܐaqWfzue)E"{IgSh[YUpj=<5j["TPb:HBG,=Z'\0ԁb:}|,}\,Bѫc;˔d $eB@Y^H+SNT#LYzܐi4tR%GS$I$~O#tsVq0-TڽRb: HB[,/}%HRpesN?PnLYz1W) @Gj^ݑ) WI1Z\,=q$hqpz,y4rzݳI,T5#I*alEFQlJܹJڹUXXNFX2c1Aj /xMDУlXX]EH,Np ^ F.}qs9fhLkm8#G5>.3--^O&80Gu#[L`L #fK1=ᬚqŶXOQ 4d%ec:rT#XXα@j}\f,=qѫcK W91qze,Y4z]ׄ@GU32:ʎTo2d蕲$F2e1T##dУtH)Spv:&cLYz8ThS,qGqe.w#qTor0ucGj}\,=ZI1ZFCI*ׅMHR dgT5#IwHvzr}BrlF0 ׿.nb/?J%&o;$6!2l|ZKx̷U}1x2rPG) WB|#L`G2e{Cj\$!S-$@!nȔG^Ixuhq$e蕲:q0z,c) WI1ZGCI*׽XW@P"w$2,M&k"~t\G*۟5Md:"ʼnr$ V 8(r-jT%W ,s*R**:Fo٘yiK㜧;Eo;xV=)R1oh,_!%X38tCs}8vLsFA!$iIգ_ܓrL HU2sUcP~)AH0v7.>y,Gs>d5WRs4b *8 4Cfh3[¦/S3':in ''/ 3-InƁ֟0W 嘣M/`0:` !ǂ9!M E9x9X4c7b)I+4¹zBO9y1's~9(!H6Ɋ}R"PK!,&y,nppt/slides/slide2.xml][s6~?U?ŵʩ$:Udj>}H=koHQ1#A |>,}Vo|:qnO,z:≵|.o쯵|uubqKbB#^Fb8?‡FƏm' /倆v^,u;TA^0N\jl],n.ӢDd{a":Ds>]hu%ʋO7i~Tŷ,5!oVǻl >c=1Ԯ@00u9+]L'3izۺH׳${b]-PiF ly3 bWMw5h|Xַ$ @:4cO GHMz8s/u.5n|#UwzK]<+-W W_t"zVkb]Wx=MN?kD< .%XhL`[A%O~BH+-_4X&$ 0cƢ4 sۏSn8l"LL%i0a" t`4E{0F2Ƃ P°e aHb;M:Lp7<#p鸆DK?:LXIFƲw<a~:LXIF!!^iy%iɼ~nv 5_3;q샥#0پ39'%8Skqٿ3In ~`fƂ0v3=.+,?O0밑0d"fG-,A2=F,7?0}{ Yn'c.G4x,p )kmejXGQNDk/ކ@"SیDq0H&U0UH&0HtNL3{AIL3{AIL3{AIL3 xJzw v!(\5Sdb2|`$D5k M@ȮFb/H4]!} GubȮFb/H4]! t `$D5k^H|kG @GM8Q$<;k9\5-ɉYJ,E=rHOC,9W5-백0ՏzRU+y%Ƃ0zH9$NVGSFp @X&3YGsa&me)8G8V[&|tx[?B箌 ܭ>.+b5NqJGX,7#*8e YnFX3YYnFX3YYnFX/J2a&3a&3a&3{)TT8bU~-(֣K2F!X'?[P(DD# n~vwy;5^Rh샦0p O!?O}ڱCt7]q#ٳHSݠ<[&;O}kGd77Oؼd~{cO+J/X6Fxa7Oya=}7FBV;d9֬,,R_W^,oVr"n\pҚnsvO 8]kB'3VAF_`S{+CqQ, o&L|;vm쳛_*kU$AH /Nť S텉#4kOUz?]fX= جwP4g nT-25ePiYNij>뉕.dV-vv-OҺOa=$)#,osWRLg#/lBe'" /ՓɖxXdWW0nr)iDL[=,1l~KuMTT:yF<LJ2aTo#IQ=0Wq$,Q{%:cq%'rV)bMbQZK=c%C{ZN܆Io]`]XX7d8_Vǩ^MzHb:)ju=B,G%ް1ϩp[ivp b˱]7E-f3[1092.5$Cy@.G53593[WfHm359̖q4v\W05f '9)ϾwՙCZ$&qfFuf8مV9~9f '9߄ljkka|?e>M̭QԌS1[8ߥNfF;uf83gZ)pAңҊ8pF{ HgHsPbk2k̙̍.`C{Fr`PTN(ס̙J"j2gk 9v4_DvQ<9K=a`"ִ\J? ɮ+P? 2ՓK|25yn]@ %Ցlܙ!bk3.`ydg]@2gk27.`C)A <&`_Dvy;dKK5J3. l T1l PLv hdd^G5U;ngk(7.vSGcؑ6 9]CAvʜɮA ed en]>]cXw.e^]4(|[1k ;Y~G_KһPoWWWt^$T"zU (eMz6C;;vm1dN`Ǿ >B}IB&wuSDvr 6 ӵ%9cǤ9HtPS=#Rf$1nN8aqişbkY+h/&k mr`64/J~( f44ӧ"nJ5aih@?FPhG'6Чa44s(wu"C 'I>A' 4NA@wdMJځЖɜSR zANQ\a#hx[?BGAvf2-% R(n֊iEQܚ>P.4^1&ΝɜAإP(n֊iEQ@P92:2^85wdbMo ri "T"k"kŎhx[?ۋ\ۣJڶ0OWtmGQܚv7" tGZٯɜ"莠hx[?[3 œ3ІŗGz̑sn"p"Qj;(ŏw4Z o}iE7Np#sD%A {f_PlMxEbGP4-Ȳ(MǣyMo rE@Z#(ޖG 4jP<5^1-ٗVT}Gߋy6wU15yAN4G[ZP R*n}W(lv!Q E1E?ҼuMwByϵ%*o#] =EU_*XZt1̐]H5?yRNXWE:` -77Ц;C̄8 򙻮&1y"JH"dBck5=,Iu)p\s/MR4]d[,y}wYuM<(Xb&cqPX)¡rsZ̤{+. Hbb& Gk!6:=b- . PCH|c+޼v]zo`hz<ʀjͻD3iz- %kQ64,?A9#[2:΄a6:L»,>ȱ^j;[yylَ3kg-6-f}f# %SEAxe tx3{f(YFwY3y^W"Έi~=d,(rQv5!e@PJ3}ZL%mCuZfUQ.GЊXn)`n7im[f|T3A#L8Dbd1yME0#]_`6}\yn͢G|`l֍1` p֛Ook-H 6m[յ5mhk-YmM[lk-kk/Jikڱ*5ѫjJɶB E %PלP?d)ڻ({#;7EÝޛE}'^QNz5S7 4r [ ƑߍCOS9kWꑬ[>/u5̈́+q{CXlH 1;嶤9ĐXzvd\™zkCA'6 'qqIZDV֚{ k} S3AH']M'Wrczbene9OY=4fI=t}#]ߙV}yg2/l>nOWxO+@ N.'V-.Y0?ocRegX比9&s=2WwbRXh2=orX比9=u2nqk,+dtne(篛h Mz7=2amUBźy>rgu(!­IOBTE~dJ-듉.A䎙 KD̛Lv>C+нg`]@FSz!WIWځAvʜɮAs:9]Av]]25,{n]vdHTF#>^-4.`C{dWOEdWCvwxs w PedכS#"QS'!ȮDv t(s&zR{ɮ eΑ]Av\5n]!]dN"t8U|0 _?]#%" n Zsd#k7.C5BdRvhdɤnB)2.#d0ݤuSYh;N eӻľl;[~/tUń:~*܀~ǃ%-zfr%>~vd֔ێVK.^I(Gyz^O"NӅhDguc\5/vb!~t?z?њ-rtn Bneq?q] d=O0ɶzX̿C^/}&_i/MRGvG,ۊ޷,y}' |5-B b:<=S5OHN(( A Cq_:~ŃB1vr VlIAQUEa s((JBY 40: (ꮼjEaAEVd(ПVIh@Q0f(unP0ВnB/底 4  N?PDxjZ= &>(fVt#ŝ+Llm C'NP5xP4-aw1ֈ m^~(n@3srGqK]'EٗV 4Chz[)n2T[yS LoK- tiEGqK]+2O m1Ox$ۮ1È9ffA:xY(Dq(uP(Q œӊE'WTĎ?'W֊o=Av3`lO昕oz[Pz/^1P'gMoQ ZQ5E6>MoQPT'%4(nAwEb;((nhb;(("莴mF2G c2Դ"թo ("F+"Bg 1iEU VT 49'EQZ@ tGF CjE@3ON+ޖ(MyH(j79'E3 E-x#mx[A(AQ œӊo˯e]z"vʺ^1NЁ*{'xN|~:RO7gw26 Ldds3Sso,G>rM 0[ucytæSaGֶ[i[ևİmӺikImmۺfښv J[۶n)z[~UV$Z;Vf?"zUZ s糭o5R>UogKU:{[R罻 Jom2sUy`KUE⅛) EQ tVD TȪXS9IP3o2~A(DD#2Qrv1O[kYF}FS#O}ڱCY6]q#y?l9Ѕ[[Tjhᄉ#07EÝޛE}'^QNz3XOY#N ~1|+m9@@TkIړ S%aضOHD,|*AY(i4CtIv8-3>.(0멏 cy4,/Gc`o4{j ?|l;cȂ{̹8qgIIg9307ʜRXei2SyQ]sC2R5Y۱d;(sj(dƞdoY惑9,Po$Xꞅu{vS(sY/TJKg^ ?C;uAHs+]]IQђ]Ava`Ҭk7Q"&P PLv Pꆈ`Av\  Knmў35Hn]]?fed]]㗹Avs& u";X35p+!? QsE%bTdR7D ʆ(6.`C35Dd0С̙ Pngk0 b&86Ȯɮ u;o dNu(s&3.`C3Փ_م*5Gc|ȮQ]]FG1ԣ|gGz"UӨF3ՓݻPh]Lv~CD"yden]F.tscIKcew^VY$Ru>_oӭ=҉| oӼx9kWzE. {\N(6l"v(R! V/$٢=]q/LUV~nkք_PK!>3`d!ppt/slideLayouts/slideLayout4.xmlXn6?i`e&各!*|LG:Es&qJVl¦I綶9WNL[JYy~%7E2l<4gbF S|EK~[V8Y)UƭLV/ gVUܶRi֋S,2ɺ L$PrҲ)twMxQ2M5pւōIn'K)&.pWuPğnxIA233A$TJ˵"R?)',5 Sm {{~A!x'1\➣g h#Y.!Ī_D9/g¬ffhV:A3_`[~kpD118 mV"BI=<&d59n M!ڢ֜E(AΪagI8ةͯK+Km 5kW?4zXMXjsӭ6| $Ts1ON<ܯsHB(xj8yrG$")cԔ43,{>ph{B,d DQ)"xL3"m\{QvzPRL]c kG0 va'm@dl5957o)ɴATo >08 c-X1>O`Z`ǰ16:akֺI'M.m^]:Lr'Ug&pH9I8K%'Л,;~&!`Py;yvn7k5 ܧ28ثkЕ Z7 -~/lF轰аulacEtkV7uo3zg F&v&؝tнD0ÿ3OTd߮Yغ4N~*jw%UwgUYy! Nn6Cod֦Sd%e٦)YRVTnȍ⚫ ?7F5:&x5!gNsXCUFP69gAC쬮oh'7?zV(jsHvi'Z3Uv~s@kҊk aK>,sMf ש>ު._, ر;AM?ű!L#NnqzmC(E\+~66;!xjsQUwa1'ϭ¨<Bhl+#38Z:~Bqp'~ā1~d<`x5f.//Y>7oVB}ƞmc [ LЇ9dPK!4͹,ppt/slideMasters/_rels/slideMaster1.xml.relsj AŘ5=ŽFwDڱ0H`s|}wmRV//O; %Er©x|8a'dvħ(ˡqn8Pj{a=_*mzt凨fiS3̀bIΒ9Kƀ\g]^{T3ZbWcqH麝NKÖ-is4n+6K2(Т+BUV!:lmb6!YSdۘmHox.$ǔC2xFgo PK!wYg.!ppt/slideMasters/slideMaster1.xmlZkn6_w-\[/[6)'HwMzZm5ԣ&[;E=ʞ3CJ{A") D|_}w kevϢLt#!C{8Dx"@Ђ',b~HFhv m4;YCݮ6՛_ǭs( ">E L"e 8Rr eɨz‡-yHT"!A9[c sp ~%2ݾ:mxeFQ*+X)IgCI*$DzK\R Nj>@OYKI gR#Dז-'2`,QJdE,y_0lDDdiEڬN^NMmrj 6r@{PHխhA=Bx"YbAIbH%#Ֆ1˗<ʳ|Ij2j}[qLr0S+>fj5@@kұ/<,c# &]/;:W 8n-{%^VQ"B8hLL b>A?tнX$>MHiّJ2^ !1mM/gp/)kwNF}ǭ[GNNs{oT)iATd:\?8It9KC44N f#s~qL S 83 ;a m s\ʨ[HR%]FvJ'/fh&j&Tzr?{wrݷjNt䟴Ρ:8a:.Q2?kS+yx?‚"JЎi>Id!#XvȩW˲^ۀ#p|NX1Ax GGvy>r4,qYPQ]hLm> IU2Ll r^EVxUc/%Be?`OJ BIِm&k؆^6ѐQٿІĶNuL.!\~wVC?PK!P3!ppt/slideLayouts/slideLayout5.xmlYnFwܻJ,1X!R6{nl;>>I9!qH.Vj|f|q&Ƃ"?XPDqv?0?/[ieKD8Ƀ"J̕Y9S*"D3m*d|HGNcYv̬Mi SD)yҰ ]Jg,V2VJ >V)LxP`B˘c{u!c~׆@D#'ɓjN%e ZLJ-j`D԰$kV}Uj`u3j`uj`uj`u/j`ѓŗDrA4 nZz`,"# i]zЏgl^=+ΥK5kl[vdsxf7κZƻY|q91gJ(4*7ָ۵0&Cj}Vy}VӚoVxY{*eGK١ym#e|{y|sų;PkVwckֶ "Vk ]G鮻_praI_h}?hYӷFþ}ꎜ֨뺭swZ#8:YmFઊS~%+ٟ Z6ٛEo;K>a~):T d? mD:"wIqzNvBZx {CfKB.^gZgײ=CvH;C]0l$cbrBJ"HvinWh  $Ľ.Uh2:ςI2&iŽ$ƽ䨗&i΁-;/fוůKUS.a 13mn.7Jx]dgauѰC[vUSdƋJ̟BEi|WxQ {ã :J|N^4hxps5돕澁%)kOyО&PK!c!ppt/slideLayouts/slideLayout7.xmlUn0;DRf[kV\i#NhAH{-x= NֽsŖ3JR $=* 7{`a&;Wi]❬B#<7Ɣ( 5P,gTag,L,^^yATSaE6пn8y *"y f@0@{J/Z 9=N kY(U*C}޶K:,-0滋] {w`/9d2O`˰A](JJT,^ >IEh+>c.yہôP4A%grfLvn6FIZ:Sl`ЍdU^| Ta@N{BeDÔ\-ow*7^#}fl|1}ŎS&E[Anَe1b,͎Q0()_;h6tLi㸛Iλi)j NźR20)04f(3i#3< c}׈3Pd 'PV'c 2e߽̥4ȯ$p'7S::_ѣ*,YQ't \4Nw7Ѩ;:4 ttQL'YzxW[י}f֍nsM^&d.k8n} 4q^f1b/OPK!q>!ppt/slideLayouts/slideLayout8.xmlXnFwwxX%@J$* nw<ЪҾV8$f!IrQ)">s=5UƋ9EӬX[;P%I ڷ~᪌+ޑ-_IE;*YҜTxI x6"'E'p:Nz>g dB$2"ja˓6t9ONx^,cjͺoD7.y^Tk$:gʓE1RwXk)E6[IZGφlcaH <ܖ>XH`/ȡ5$pc S&hHJ*ʩT/B/_? :̓a"f.!ihӷn$Jdp,'Xʲ=׸3$JB?{ڐ)}DujpCtLHAᆞsÞTd0 b㚹憧[đ"YrYgVɉ2H3ٚa0fgP$N7Uٷ$if!p&1>`)#J+haVr('9,yB#f} 鸁e]=4%-G"2jYİ3 usa<2%g)ᾮI{Af8c :AxJvn(v]&&Sդ(ӞrnSUc 5'v6`sXl`sXl!Xa,)F7|-u^"E)kA{2uC\~W_[}Ug0T|fS})oFՋ 0 -8Dꡦ$G_Lt+U7ݰ0n;W ܝ>bdE uLܪi@LTXD%o ѭH#ծ߁6hÇw/r#% <;u#0%|GmB_;ONȁGoA|?t9M:~\%IHkk(_O I!yH>Ǒs;ǁ78rq4<7|~ ,b%Jj9M[A?O0D)N-ꬽ?'5^uzX;49 _Hh"2aYJ*ťq7"@}24g%;:wۡ?#ۣh^]VSvI~O_>5e~ .E&>aG05z[%'(3DqNPK!x-!ppt/slideLayouts/slideLayout9.xmln8`e! 0@W#uZ0`Qu ZinkrJ'ҡ[Dhc8yK82QY7wAXfQƧ4(R70~& }iо2Z"\ﲜ2 UZcYVBԨKgeqn"_д$P0Kr@,b˽0۾iPd&q("[J$4 7HVi&肃3`bˆRx5;d9BR {MsX+ j14p#nLPn#c&#Ԙ" ptC|*ԇT8BT0Z05apz6}I4-E2?a N3c^vpX2/-G3%g>XU0> f`'_>l5 mF|&%qz||7zLJ] z敎w]I7nkjMEJtmѥ iΠ83grvD(_AsDl'*PB[~As4GLłE"GQW&aQ,GZH&rH R,TP)cAXl6+7`<^z[]Ӑ3&tU)h@@.넹.y2h:jy6&˥bAU5i҂$^:ɉ6$Eb=8.Lv<E.9G *Hky=UGs?'RkCO7f=ix1Im"kϺ.z幖y7r'o ms<Olg#됼Zޚ߾۷/_Y'|G?nKȧk =A~3PK!}כ!ppt/slideLayouts/slideLayout1.xmlXQn6/;_%Yd!"@6 m (TEV{=ΐ)-@Pq 9mIäK1vwCH,֍4`cgǔ~wWUxvGwe `бѺJz=nXAջbޭJYP r$ 0ЖSLj&O HBO92z2yLtIXk*$&zB^ ʷLdTҏy4ChZ}Y~Ң^9s "®t~[qehֶӗ3Ԭ?`ۛ\qWWP@C=PWfwN铉WPK!š !ppt/slideLayouts/slideLayout2.xmlVmn6_w %q EĨ)bv{8{)i)` Y"gg y~+8j6LQD%Q9Qqd,9JQ&x?*3z{zN; θ+a s=ab؛yv<#D崡x%Ӈ_:P³MtPv [=! /-lA1/Y~S{pr~ Nӛ.f2Mûd8bp=LigЉXZ&mjMjw<@_ŷ2Ԋ(_ܴ8om.,rzotju Vc +:g9EX49nO9x:si<N:4xl &7747qK؞~ =.K\CO C?MPw_w鳉PK![jm "ppt/slideLayouts/slideLayout11.xmlW6_`*eIB >J3o8vZUjgN0TF\{qr~sTQU2)^.DfLlާOa?1/aQ7 m:/Ŵ-iٺH)N+/R_2u9z*5;'_ gOob&X;֝ip(|5{zuIkٙ35\ml ǟ9~oi48$$iG$q J,3)3$ՉgvChtv[!M jq̤4~z:kjy~a+8Q趌t# 2v{LxXqF8%OQOƓip4 ڞ|=kOn;=:(| @?P2&9`OPK!fppt/theme/theme1.xmlYoE#?N4Tc7Ц;jf7qAZKkEP ] CZy>c8N:$BR6ZHfp׽ paS D76}:^W1ITf+/,3» V( G7a Bi'`@CzZeQ(0xL!Z5q$ 6:k6fDGU ^4 6/\r`)rzvmoLM:NS/CR[ ݮ-.iVb٘¯Vހ,~y hm+ހ,~e ߽p3Lu@\{ p텯|'(Ȇ2Y\t +"5mh_P=^'rjHυd(h{//'*G"rxb\I_OcZLXQ3 {p-2x_@o:b;݊9kqeᖞBsoQo6NvFNSَc.éC;~@:Pp =;4ڦ e3ps8yE]$Tf{94#NXX>#":RAqԉ>tw8qBۘ*rcd>>M*=y).W>w+D?Cp:3)q}v7GIoFBӄswMA%}m."o[xm}{|UvI9vl2ƌܖf,a0I,ywpC \}@U 6@+\PK8an Ge}x@b#;3B,;Cs-&Z lZܾdumܳՍi9.C ]M؉ ؿ+pVS!3i"\D Qu$!r+lM2RН͒5 l#LZΟ9I.LHewXZ-fg`Sd4n 'Tf홵ht?p0`2΄T[X6U*Ꙭ lM X )YvCKj+#;wB>RD곑~TQ \i+杦zepv,yW*EYT1|n;+/˕j\"ndF^*Ѕ]-p |6 r5guڣC$(,'*B[2wzX,Wd2b̬}rHXO݃Cn;s^AޣT!ik޸bN%t&zV?+oċ5~1%5p| 0\Ykmǚxq081 m?*Bf?2"f`CWtW þdҪ,GV,֗Q-=ElxrNe3pmfR =]04(!&0T?@oUOJ2'Sٮ08ɤ]pm3Ft GɄ-!Y"ӉV . `עv,.%вKasUSƭvMz`9S=K=(1PL) o:೤p47&e7PK !^dD8;L RGBUniwersalny profil RGBdescGeneric RGB ProfileGeneric RGB ProfileXYZ Zus4XYZ RXYZ tM=XYZ (6curvtextCopyright 2007 Apple Inc., all rights reserved.sf32 B&ltExifMM*>F(iNHHCC }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jo0j^᧌nொ:6Zx>=kSዿO ^Y4Zh__6ex^$էO xS@ml`/m54?l=5a xS-߳~j|wO.wþZ' ÷1e|wi~+~<0-;ůx[N>>xof_׀~c`fg./vwOdžƗᩧ{q w~4Tu BOӼ;p| ?gZG]'Q'M+6V~Ѵ5H,.!uQY}Cxoźrm!5Oj֜@n.mhIXĥ$/33 xᯅ55=2B2/<];_4{N]|AOsMa*K'zS,ͱ@w_־ $fxW񩷇I—!tyk)_Ǫi^w? xB՟߆Sx{G4;Y~I on{"Wfgr('m*mzS;}>M^}f{ht亜ڌz|vR^l҈j~:X隟/Y?wn}_~iZiWchzL Mjh7#ⱊmz=WL-UmkXMMߏ>š/-D(:KסҼc?=CuM;Q`mn]_>ڍToKҼqGQ`JiegMss3G N@Q_Wj07)Ow:u7BX+85K[y.hC3o<"$Z~M n|S#ݾ\ͫJu-2KIMׅt hi\KmB[@3n.m<ωMzIaүk,-vTP@P@P@P@ek3zݴ+]+Q*9x,)JUȎ:ك?d#|~_~3κ?_fCo5d*wŚݟ|7jSU?þ[E y}_d_&ەサ{/F??3qٷ^k~/Z ]KM+E4=:K[_^Η_O=]EWuF'w^*cku|AԯuueY׸4ح4}6C4c's7%+>C{ 1|_s?gc@wxܱ/|7_ =SW]B|\>OexCRc|'}vqk {_|Ϛk'ݏ*mO់~;?_#/x>;xz{i%ީyq_jR_%Zm-_o][oV|?k'|;o+A?Ϗ~x ~5yoK'l,&&N}D[_^G9(zѽݻ_>35]w.q~ -.tO|+Exp%o x@Ѯ=2qK-o蓿PM{7ϯ<4Ox?CM]+=O@&~WzWKN9xe<77|/tKCAAy-G/aM|EY>5kٚak\_.&_g?]>+~|@<%ğ5qτ ~_G#֕bÞ2H4i@կF4]nj3nڎm[Vz$?g:?dx7><i>|OO_~ x ?E;P҅_VZ_$/n;AI+?+>[{Oүڻ?k/_|5ۿ oBҴ1M_M3h|ERI>(xrox/㯈hs(~:cOwZ;O: ^}wVƇ$-h7ˣܗ'wQ?_yN`~'xjo?π63]kkrԾ \x_3^y:.s{ɭ.|Uq_w%{6]>@z{߭ BŚh`?࠿  Wø !a_[|4<'DD~l^}}K^k::IZn_q{G{guRXP@P@P@P@s-F¾&&qNU!q#$: " "7!|. 5?nzw?a&cM6֡~iֶ 4h5Kf_{d[NQ/vmo܂'LMtYË ͬKA{eFD^F U9ц KSVԇ חV߻׻;=o~#ub~چ77-&.溓òjMq,^5WVX [xi}W^Zݐ~˟ uڛ]?s[|Bm'~+g4$E 7WoI<_]OqiSi+mI8|5mZV_eߛ#?gGK?f~?Kuտ7/X&XKmsN{&ԤѮ't:lm%˦]Ȕֺt}Y_G隧쀚{į~ٿ [߃n<2koXn5-ӵfQ[ n ]5BM/Gfg0X<1l?~x}x&&gǧRυ |#M:=GIP/ΏiMjkwg|֭Z]5Ij+;=nF}1?"A9 qu8"/|CO|3df9'xC\_\ZAfYGkwkoqE7zW{;[U}{u?# h?N߱ߋ5A7/jG'ƯZ G&j˥M} {{}B6wguN~KoCncUcڥƑ7Z[a8|;i{֪zP渾{i e_kww*o_<[Gd ƷߋMwxCmO5  cIy$w,|L-5a]b]S??s-妘-mt9EjSW6zj~߳#j?7jgs]ZKw[ow_ϧ=nw&}5*~?iWNG>.x^;?ү {éj{۫ ,LoְޣCmi? - qx ? u⹴:KoNl?ve'K)2{/_Q,Kgߤi%P@P@P@PZnր?O/]3Ӵ{W>_n%GKGR,ԿV&^9G?txIKk'4onz]ĩ}S_-qb<26+y{f?|btٱnokPg]&56_h|O5&xzIOrjvׇacro"/|/l_~ǫr~>&m[Wi~ :σ'MtQ7@\⶞ii.1fK]Io\~]ooރ_I|E2|)Gmq{uŽaco.iD7zW{7g]~CM6NJQ&Oa $Vlmxf+Uؗ=ğoaӮWy}ֿ4r~+'_]]j<ͧVqZKFˡ\.^wާ|q s =%oϋ5O|Ps7C[O ?5 BM3¯4 ~)VfC3 *m!InvKlq-|ݾ_$k^>9!<uW3]z'_+Eu6#M{]MJP!0d~D0jr77loU7c .m}dxLc!zլt ;nEݾe_س韴i߷'3eӿmCHBWer.nm [_]ꚥլ _e-w/"⿭ ( ( ( Ei=7gsJ!DKy(VҖQ f?x߁?l?ۇ wJWgu sDn>o}O|NV񵼃\g|el-^V[ϗ&ѽ{x3{ n| o39д+qxV(-q܍ŷV> хKCE ֺۯpj7;Z.Xh/(Nq% F/7m*7Zg"|5hhh˫ho=6)tK;Q/&_6WqZ7};|_iПH_zRO~?x'JGn,|.׾-WźE/ __x)oOPZͫuZ;hבn |@ %}߇;о'xOo?}[>ծns|0Z-?i'VR'ZkIGME~~*|[ ᷌3K~m/#?</;-?U|=h>_m*4fl/A%ȴMV%=__soĿ4-xG2뿶_V4MfDyuOٯGſj7].Ko ֙T!r}~hm}1 jk?h_?f| Oo>|:ǂKc~6+ .O@_| ;?IOUo9m={◍?h_w<Pg<1|)xg3ɦ"]VZo4^Sxz^kb֍wujm^]'=LTg,x+g>7B5<>XmO#-4x8ԭ~x 6WG!֯"燣5+N{}Bϧgs[tΟ#x9?>)i?f˟\x[X VW>8kh&|CӼCs W?Il}mqwˣx/? P>|0aUxgS7?kwW^4x?WOmZ<#]QքAj~[2e|K( z?_<7}=eyk}BG?D]Sx'㖷/"y_T:|z&x+K_+?Χc3WQi>ͫՓ:wJ_PP@P@P@P@% y!,JQErK,B$q.Tb&??`; C>1~Ȗ><^~ ZK6OWZ%k=ЦڕrFV|׳R 802&Eɣ> ]lҠcՆ#Md-V155۬BukA5+gw#A?Ư$G'x_ɢ8WY:ՈbuM6[>A'ut}f?AO/音l>jF=z-ko3_jN0j7wl-.dF.MiR"Y ?dƟ+3m Ζ~_|MԮ@noջӠԊi{(͖bMiQ$}ObվB Z7'mY# _uߊg?&P&y_?O1M]$BJ=W[yNZ=mgђx?~ u-K]-w 4y5 %>0mFKn-_Mec?a;7wӯ.wkxࠚ>2~Ǐ źcj %]&K\d[C*adݙ.l$YgyV:Ʒ'?8~Ҭw[f⫽KMWii]_Y7O3n-+k|=g˳Cʾ1|ru(쩡>#ZgK y_xw/][Ѽ)k5cjճ_kAdIz-_G~|Rx3i&~ *~Yecm>m<]ZiXj1Omh/ T[\i'viz~Diy72~ǖ#V&~[Vj~o|1ut`^ 7[ȉIu[}Õ?bώaO|ctO5]  ZMxfĶIKN:W\0.ymiXE Qk|Ozha#P}+]#ጰk~I]7]i%aE,<.W.tOCuh^"SUżI޲_EZj>=IA@P@P@P@xx-|){=$0AZm̒4(YQK1@Wo ק6xoQXIh J֣Wo#\iۦm,+z[]ϚCuB; q>7ū)a(|=į+ hֿNjӖ`kukA4{G8-ibY||dCMH<`~kkm>-RD+ڳlN]?f|pi 5kߌ >IXxz= ÒxFg[ȹmV#Mߛ{h'qCK<%54Iujzܦzt)ί}~KkcEV&|KO,#?::ZOWg?\V^]iJ;D[$֚uO}mOڃA|<|THxX_~;$]濧ZxSM7^{^Wu t6(A-WVcmϧz{J_E? òKcgW(ǿVZgu׼ |$O<' ]wIW9 cź7<;۽Au]Vtm;>F{ ;_H#SO(( ( ( (1|H'uFI4]QKΪ 33@$~߱u]kK#-[?XNu=?G52R\bN;{䷙derFV|׳Uc'c-?hl߰O/o7[~}%tEƥì\f#Q7uMgi߱;z?gy p}ax[7x OR/ǀSRv(YڞGƗow]}ݞd_Wtٱ<=I~?a4ω^{i*XoQ-7O>}ăɷ4Yɭ5_DS +~ؿOY W=ߴC_Doğ\&/|NFT"Kr-լLdц$֚uOLj?gx+'?-GAI Y_~-!4^𶁨$?mԵ hv.mcEluVJUn ;{ߪg,; hcXxS?>&fk>& ۡmc;Mf/&K ˛oZ@-vn_T\} xi/)sK^:<~!JJjgMJ}6 va4!]j}|י+ʶOXQ wōHC2:a;>2tg .o&V3iqrY]s^U. k {ߎoOo5մs R|-7D xgY3YkVVZΑsiz(_@mU NoofYeZ\ɯ_ƙc|Oį|UZ]P-Λ=ՕWZBUiIw[m2YdŞ?i'#=ik?!-5O>}CÚϋ`ukTS6~ ;n7 M_l>Y|d?Ϳ7}u|ux\1Iה̪F~o Pq514N$8uT5)SQYMJ2Os"*g<Igv%Q!a$:(joGE N6,g7znPt-*1h?4xľ=n='OmTͣWC-6֗}}!f/xGSgt?"£=`]R4]kY mg7l/W^ k}K_5PMqYWv΋:|z6Ew\궺zNeolfE9'յ/|D1G?2,)Ѵd: [χy.xjf=I`{M:5zՕ#TNMJ~<[˩]ZZH[&_i_x὜Vz7υ>~xC~'/i~R_'5&jZ+|9>=wƺs'76_]./ ;şf|7/? [xWWϋ*}=WN뺘ֵKu[$@/k$D%@4?_ō C{G~{O{xTwh &igi$մO^~?[Sn|@>Ҡ>9_DY54|=xχ? +x[u |$5~(6iDY  ƹo[x6џ3DkzOA9S6ɸc+d O /:3J\ʖaVf`f!®eN+| >l>8-K*0ϳiONK/w[ENV\?8 ( ( ( (<>@m5F55~1/ 8U ODךe&e翚J!,[㸇[TsZoaܟ2>CPuc2Xe6氵13)K7)_^/ [R*{jNgg9EjulnWq"!_(K%nG?}Ą͍x_ o)Nťǟ=oYx@;x_!VME? 4go 64*ɿ;?!f!?@8C >B|bƏY7'D,<?᝼/CHO_&Z\yЇt߀"|*ş {|{>*<\t&Ne\SV; ;\+#KKF?ck*xLN2n>)|"~<=R1U4,*<ʧ$qrZNxh%lj4߇?W5XћĚq6[huN_ۋ=MٹռQw5՝siכq\ 1lIҍ< Jtq8| jpsBV>]N5e\+Yv? 8sS$1#R> SR唥*+aiՖ _#֥u/>%2/|;𶁧Z$[ۥD@=Cb"\uFkObgU%l,N(NQ՟5ILT[8G[2`xiUkZ%^ܥT#/3 Y7' 4go 64*ɿ;?!f!?@8C >B|bƏY7'D,<?᝼/CHO_&Z\yЇt߳-C5[9[;Q{ކ^|H]+" ~pD|F\&/>:0\ZI49硔N֞#\ et<\ٚ\zx_žNezg49Yl"+;HdSJmĬ]Ldy..eiF%8{.9]ʲ*j BzsI.zfRiUVRVs)IiY6ec9?ӭ՝j\4N)B(rӥMF8Q]zP@P@P@P@P@P@&? |E5}JSO??m%1|Gʊk19f2ٖ-𳃱|;~*x|e,.#ᏭQOGkBUʤTe&gO|{x=bã^ 􋋏f7p]o[kccqqǦR%y|.K/~#Hk6oi_ ZԼ[>=]S>#~?Vw?6oD..<ycǍ?X!xzOØ"L%g=[R: ΝmyMWE|F?ୟgoI|D{?d[]b|7yuwt˟i9߁MH2~NvI#jj]CN|9_xQ jwំ|G}t-oj3x.OxI?ӼWo oC7S/%l) x^k~_:g|+cjkxRiҍ2?Ac!nA);7g?c co7/L>&BoW~=~^)_w{ixfCuSFSMC쩥)v{&cWl]OH?^/>;"V1еzY/o@׵w.l~ m.W n /ح3o?Oh>.|A_7 #EѴ}Z?xzgqsŚqXtѨBejvwվ]㩡xGM?g7/m?|Y㯏=H<}w௅*nkWTSBՇύ/|]ύ?F:_wh66Qx_~)xJco^>xNЯt?L.ֺնև?*s~~ wOڳÞ9_zO}EG=[?U>M>\>#K񯍾,ɟ4+o~'kl^]CxKԼaXW:$mq;ﶽ)_noݾ:y& ƣio-{XI]\, l-$kP@P@P@P@~b~Z]յ;ovn6gCd/n;cw2VS4ʄg꿲獬|KWšL.%,5OշJ}:woAcKuR ]dNwS(}k4Ku|buoS7[ Moc_ڣcN4݋m{^4F<ڜYj `7ozG^v-?lSMb x[L!ݦG5oCP%k{~"Ҽ;s#J.-7#r^}fY2?'ׇ,bKjyiCZZ?-\k-$rkS_Ca%r^ml>2~ڇ/b vO#S4b<'>`=oPk7n_=Bwr^~>̩ide~^m?PG5u}cW]7طolbj-$6tma mxm$ޚ}ר►wcϿxW]N<zUx_TĚ 1{?jtQq꺌Z76sAO#Qrv`Eڇت]k,Ɓy~6Q]V/k:іÓZ6淬ìA{jך-4 \j6#rzaeg_NϺ-~l߉_SLC6KTOTj ;uҵM7k qc>7F^W#.&qwShoڤwr}g?'sU7ڏU7Z|esBOڣ—Tsj7BH|GϸKM5ۼtqwg }o|x7g{hR\3igc|_'43š,jSuO]G4R]7[LIm-ߦ￟$FOi.? Gav_ J ]0f"8L(*( ( ( ( ( %?Lnm6+F/^3AwxBֶ^nMWKop`G22'#վomSேF't[-Wv\i6~~h-^+ 2XNiy>ٮwg{tFwO'IwGofR__14[%mj^m._ًA_k> KMHj-._kitz.-Wy Z<mkʿ=nRkwW'Y~xkLMكD a 'Cueoiz ҵ-Dw]_u y?2'ؼe?~_4;jئL~[ hY0kkk"Lu]qne}wkie Vg_ďVğ] +Re?k}o^#4f= t7WD6'Dy4]jhcn~u~eK?ym,I+Ѕ>^hgM}Ak?:d.ҋ}TL!$z.__!k_$~ڷ^"^> 7\kzzoHau9i,WZu4YSR{=߿y2ړGuآMsT)^Y~ך}ksXGFVًKiAue`StdZ[ч}4[~@mt^o9sk|K$eOZEaxVu{x+Do[__v×^!֣"MSFta\]G{g5mw_O!O?/n}_R)j_#m>KOj~}jR~Zsnֵ /5-.Bm6Z]kK[}:wwďVڷ?e_~e/~ޥc ~)VVd4nn/n ҼA&|cZC &]/Rּ7 x)oG_ɥ-+k6w|aiV <~/o \i>[GĚVx V7O{}|&^jVkgSҦӚ#CҴڇ//'n|5Y6c5BAxkK3x\?/1 ,okG_ůk1]G᜺D6.BXK -FM~M3M-u{(t{e{;ӯm̬y?1mR?eC.%k^'ՆEn&~k Ozfyk:_߲u}אo_rr=^++8J/|;]|[&Ϳw66LԿbO Z-#I׵a߇+K:~CKư;[k}ԧ𝶑^|[-5#}3W7tD"՗]l^7{g5mu >?ߗ1&Uխ?H–zoysTӵadoB /jW_s2Kj[Ҵk+ ^Ěu߻ӻ_WlV?e/xo ioqkSѵ~-f/w_>},LxŎMRG5ƺ[`IyxP״u)z( ( ( (?8?்'m+ A#bSyp.-m.#.㘭b. `~:/$_~2jܧig~:F\kk[s~YrZ}woβ+2O'??o9g[Ã%SQ;/g"lDM{%ϥevEw]_u%k}%ޑ]jkZO'Oa럷ܿ /~:pb,&1//F QZh%⺟PѼ?s^jVV.;[k}Gc!ҬuAgiSiv}C}:ww㾹y?O >FD^/ Ҿ;d/7#סMc6qu\:v%Ϋ 67/Z'~h误_-zij_O?S* xK?|^8|Kk:-OKgx258Yn(] }{q{jkZj餺ߦkX]:mOwWƵ~ Y{isyNo'agޡ]:N CQ[&y^L 7puG1lBLJ j[[_BѼ=nCiZuMkoJxg^fO+úd/v={C5K{;[=>Q ecY  P@P@P@P@W~?_ML|Y{&O`iV-8vj?~̾0< ?LFO|Is//Z›M7ɗ\lZ[O}qk P[Mgtu2'/˨ߏ;ߏC?-}$ď7zԓ:uv6ċwNh7v6[Xܷ{tu}אz,ڇٯ~؟ ᯈn5>Y$>SG]=Ʃk`M^\"㿖 ϧ+߲ٚ&>! f|o 5#Eɗ#V>Zv7:uXC;IIJm.u{;ӯSKԿo?߲\/urxsWƉa'WU,ˆ^#Mm^kFM nZ-k?بw\YSA{[Ha<«yl: \iPo-Y^Ymwy2@_F|G-A?jM'oww>*?_RYk=džJP[^Ь͚iu߻{ڿ(#|p\q>#7"Ҿ#|l%iEy>]IV ŝƕmKtk9Ӯ{gN~mS~xC?Igi_4M w m E3Km}$ڪ Ahpߚ;uRNo|K?l/߀ |%NC7~=tM;s/%?xoIźUpM}jzbZU餺ߦkX]:S$>wN ( ( ( ( _ANw?3Df\I5N͆j%jzd۝BV-ca e  /=~^\|.k}^߆|ybi7ĸ{{ ]>s3C,sqNmi|P?h%??c nYjV ~8;E}⏃~'Z_j|8.'hnmףpP~|x^D>6<_|q}O;|[t"Kk[]«\ 7:_ێmףpP~k`D>0O|Tx>|qy_/~-ZXdmF‘,\<_iHnz;>;w+kXA5OoG/¯|*vŖ^/4[a_i_ZW9ۿ^B~%_#T c#_߇Gӫno4+7>gI{#,$ٲͻm(Zc2-o~ R|v5OD_h5{.Αy/3^3Ԯ`G]BHfi՟;^~~`?Poz]vm]|gGgۘ5J?RژLrCe.TKWèXYMz&[ !'K7ؾo?'e ~8Z_ Ӯ}3 y|)^;+kew妽|Buo/_&CǾ< >7~?#Ƕé|OM=7$a%Qq'{RNw妽|J(w>-] ׾!jZ|1mY%HUkԒhidqkvi4jy/#7#R|A;mUx?j^5_xN^'?Z<;./մ [VšFo4ɿ5?+++M6N ++KtXm-bH-@XHEQT TP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PK!iqppt/viewProps.xmlˊ0в2i* R@2+򱣩nH'8s";ۧwH >HkJZ䔀)dAIT\Y%=BwϟBH%vlNV?B7Z=ԑ4ƺm6w#'(Y+֪# w˪P DDuM'~-x2χI/vF b[ inszHC% +%7Vh(>,ڈ[B ڇbqr IуwC|ep|Ie8O ^q?E>Ey޽EPK!ppt/tableStyles.xml I0@Ὁwh}-CQ$ +w*!@he/?JXd45ݤ{c@qqi` yߥ&{p|o@XpQQ)(tiѰӓZo0uI=7"tl ɶo ;U{nwK˪V_-gylƤ |OlM$Pz,Gr҃7G\^bPK!ah-docProps/app.xml (TM0Wrj``!UZqXHdg7m.w!9{GU-X'F "RIFS!" R+F;p#V^#BiTxo&J> \Jxt<)uh0Ae!a2Nf:so`Ü%ڋ2 G}6s|4z`41LGERV;{T^lcEI\͟O|z. N'7_@dbc)rtٺ8~b/c`h0Bf=-RߚlfESl>XH8R-q7n8"?ZiV Q.ɍ" T + k1G UbMKpPT**Ӵt ]' ގ!1{ΰQw3 + v{ {9LP;<3zY$z.i a!7ŏedV Է-hdl6j!OeJTdS']K%$Nqզx VLV`8o[16%J ⾻pVٿcCToCg-}XmȏƋ,䖒&Gbo7nSޤ4&3P /T PK!n$(ppt/printerSettings/printerSettings1.binYOs@H몱13V0Q;SfK,kSEuX@@b{H2ݷokjٯ)$kPTڲD,ꆵ:ID>4z.٦2I]~MGDhh&AhKl:_H@KY0fFF|TaktA<HlǰXK+2WŰyM\p,8}a-!QG+.u߫z.Iq6"O`  xZ,N6N7#aF&&^~P"YgVDC 4WAV%. E<]2jj(P5l)W@#  @QP!F?",D .nn~1ú7~KꅪUwDurDe#&ܠuEFrݯS'#3#*dkƣ,0iÍa&zZT/]aObp,T{C~2k2Z ȁUҨGx='O<&7iKkvNv 0ݳg[Yb RGi Vp%cA]l=jua"mՅi֫  ˹T&nViNEvՅ2Ichp&yy^xnv؃ݑUtIV9ӌySI ;j5}e6r l#l\C+$#[)ߔRa_&(#p-?̡5I 茨I0t\j N*K??労Da؂W1rq@!{A-PR*CpH {'Gǽ~a7V$%G%>y(/,8˂{xN~= PK-!#{.E[Content_Types].xmlPK-!&  g_rels/.relsPK-!c\#7 ppt/slides/_rels/slide1.xml.relsPK-!K=7 ppt/slides/_rels/slide2.xml.relsPK-!K=7 ppt/slides/_rels/slide3.xml.relsPK-!K=7 ppt/slides/_rels/slide4.xml.relsPK-!K=7 ppt/slides/_rels/slide5.xml.relsPK-!K=7 ppt/slides/_rels/slide6.xml.relsPK-!AM ppt/_rels/presentation.xml.relsPK-!h 'ppt/presentation.xmlPK-!Մ ppt/slides/slide6.xmlPK-!6.(#ppt/slides/slide4.xmlPK-!Yx-3g (Rppt/slides/slide3.xmlPK-!bvppt/slides/slide5.xmlPK-!zi`}ppt/slides/slide1.xmlPK-!,&y,nppt/slides/slide2.xmlPK-!>3`d!ppt/slideLayouts/slideLayout4.xmlPK-!ђ7,ppt/slideLayouts/_rels/slideLayout4.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout3.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout2.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout1.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout5.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout6.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout7.xml.relsPK-!ђ7-ppt/slideLayouts/_rels/slideLayout11.xml.relsPK-!ђ7-ppt/slideLayouts/_rels/slideLayout10.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout9.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout8.xml.relsPK-!{UbU!ppt/slideLayouts/slideLayout3.xmlPK-!4͹,ppt/slideMasters/_rels/slideMaster1.xml.relsPK-!wYg.!`ppt/slideMasters/slideMaster1.xmlPK-!P3!jppt/slideLayouts/slideLayout5.xmlPK-!J$!gppt/slideLayouts/slideLayout6.xmlPK-!c!ppt/slideLayouts/slideLayout7.xmlPK-!q>! ppt/slideLayouts/slideLayout8.xmlPK-!x-!xppt/slideLayouts/slideLayout9.xmlPK-!}כ!ppt/slideLayouts/slideLayout1.xmlPK-!yM "xppt/slideLayouts/slideLayout10.xmlPK-!š !oppt/slideLayouts/slideLayout2.xmlPK-![jm "I"ppt/slideLayouts/slideLayout11.xmlPK-!f&ppt/theme/theme1.xmlPK- !^d The following BSD license holds for all the above code: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ga-5-4/python/docs/scipy_11/README.txt0000644000175000017500000000241112662210366015431 0ustar mbambaSciPy Proceedings ================= Paper Format ------------ General Guidelines `````````````````` - All figures and tables should have captions. - License conditions on images and figures must be respected (Creative Commons, etc.). - Code snippets should be formatted to fit inside a single column without overflow. - Try to use as little custom LaTeX markup as possible. - The paper abstract should be a single paragraph. Authors and affiliations ```````````````````````` Define the fields in the beginning of the paper:: :author: My Name :email: myname@myplace.com :institution: Some University :author: Author Two :email: two@myplace.com :institution: Some University Other markup ------------ Please refer to the example paper in ``papers/00_vanderwalt`` for examples of how to: - Label figures, equations and tables - Use math markup - Include code snippets Build Process ------------- :: ./make_paper.sh papers/my_paper_dir Building the entire Proceedings ------------------------------- :: ./make_all.sh ./build_index.py ./make_all.sh ./concat_proceedings_pdf.sh Requirements ------------ - IEEETran and AMSmath LaTeX classes - **Latest** docutils (development version, they haven't released in years) - Pygments for code highlighting ga-5-4/python/docs/scipy_11/build_index.py0000755000175000017500000000134012662210366016576 0ustar mbamba#!/usr/bin/env python import glob import os import sys sys.path.insert(0, 'publisher') import options output_dir = 'output' dirs = [d for d in glob.glob('%s/*' % output_dir) if os.path.isdir(d)] pages = [] cum_pages = [1] for d in sorted(dirs): try: stats = options.cfg2dict(os.path.join(d, 'paper_stats.cfg')) pages.append(int(stats['pages'])) cum_pages.append(cum_pages[-1] + pages[-1]) print '"%s" from p. %s to %s' % (os.path.basename(d), cum_pages[-2], cum_pages[-1] - 1) f = open(os.path.join(d, 'page_numbers.tex'), 'w') f.write('\setcounter{page}{%s}' % cum_pages[-2]) f.close() except IOError, e: continue ga-5-4/python/docs/scipy_11/concat_proceedings_pdf.sh0000755000175000017500000000013612662210366020756 0ustar mbambaPDFS=`find ./output -name "paper.pdf" | sort` pdftk $PDFS cat output output/proceedings.pdf ga-5-4/python/docs/pgas_11/0000755000175000017500000000000012662210372013535 5ustar mbambaga-5-4/python/docs/pgas_11/image3_crop.png0000644000175000017500000011601312662210372016435 0ustar mbambaPNG  IHDRA씟iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|TE$J{ "(U"JQ+PPf>"] "4QAH7 B wv%! ʼٝ6@0 aFZZZZZZwtGδ6t#%;u܊~gqҧ7o{wO&V+T=)Rwƌjcܴi=ƭ\r8xʟ??ծ]xd;n8ʗ/;s̡-[?N=hȑThQ]F!!!J?=J@z?mիWٳg|.̞=Zn-B@@Ȟ=;5lPoѥKx]o֬Yd8%\5k?~ נ [<իWuu&!!XbTZ5[uWN:ETR%t rE{Kks}زe *dE]x'EFFJ(͛Kq>K\x1\|֬YC*[R*Udd{իWŅn-\xvرcTjU' ݺuy4 + oN_NDуrK17hsTB t "cv''MD_5,XVx{nQW@Y_xCpKx SAgΜ;p@Qi,qke˖@x`޽tT'/jܸey}mƍʕ+#H GEЉl߾]H#Fv4iwynˁ*Dyrqfo[NHO!Y9E\~M al߾=͟?֭kc<| 3g/\ȢfZXә2e c=闗Vׯߠ;STT4_ׯS007\R V45fC_p>jy@\菬@gŊ~]]^qUq):6_ ~ "|o߉KteѣpCs>Tܰe }@ o'm&ڽcR.]XFs۶miɒ%ޚ"|}{=-[6;TQwI=ŃtI|/_N7vUVA?zh背,*ʻ=ߡXjaa҆%5{TMo8i{Vb6Ю |Tza?~JۦCR|4ͲoQx,c T ~p4uA +fFGZ^}sjS!վ]3|7QJ;u#li߾}b%W\FiO?A>և}@yև{ҷ,;SlgEjmm;MGC=c*̄LrR}@:vh3%AM9?ޭ+ 1cm XTdIg2k˜j )hDž><4ufk:vh/& fs-[YWa@~uLW^Y̒u<ޥs'zNԢ勎f0ڵmͫUぃ lΜhϞN<"ФWI ?vFt&VFj;+ OT6.F]vUb,VBGbM2F#5v! ^{K Pppς<$IK:l;f4-u?Q\0 daT dRsr03@0k%h}l؍@ӧOYf҈ 5kS>k\9@_,hkx3$t)dm9t;ׇb)G:;@]a+[@ws1`x 駟p@4@O?lPUhԙ `s#S0^@*ݧl-^ u鬃@o(@AXT Թ>8@]/@`)S>xT:0`@}̳)kꃳRmGNPhP:t42<1.\8/ v+@*TT6]NjZ(@ٸ!D5²b$`2E/]yV ¹Q #tԦ%:shĖBߑe1,MkjYX>^*ںuEr%?cOΟ{qBC*p7 %.gOЬ98 F_'HL#/^(#?wa!'ϑ#mx>TSܙlܸn\'9r Pvh*_~F2eDY&2zO?-9m(ӧO^Z|V<0r/>7N_4TDU+c? J{r ÝőYL]{bo$R)0xItcg8lNuo??r0EEFѽ"x 27~d}>Er]n-۴mOccĈT^=G02E=xnv{-F,coe9{+=KsX^,LmLϕPJ'ʛ7/}ᅨ$ Ys岟i_H3 ʉe%_,).q>f<4vuR.<ԡ+9ܹs9#EU.FUxޤ$3mIT<:fgtTNA<[dێ\< ^x\hܦlRԱcGG0DYȇxnuq8A+WȮ/\#uTT)>{XlF@%x%`}g.{x`.\XH^>`uATϰr˖.%JPYBgV)+Xn/CΛCpACbb\lzm[ͯ>Cz.Ag+RII-+w/&Tˊ^pfN o JJ^l@ ٻGP(Y %G(oƎ H1_}U1ݟ#|yԔܒ1Ha=*:F6m/s]ldf7o뻘>_„*@ HR\o cwSHݴ]Jxo-p|YތYO<%~èw=/Iv5r7>P0`YQJ,mxcиq3 4P% (^0>xы6СԠAC%^fҥ2b5xPRdb yMTI(etJ#V'Rذ*ן}^Y9tʺw%*,̙ӕpA3J>s aA'+Fأ ^g͚mG?q,BlmҮ;paL`V@.wV i:K?\5']6|u|v?`=QA;;+.I`@EFY4m) H`w,_Txſ("ロEun{{R= {yBa˖J,N3V`g*0Rʠ'V4RlÚ6o[VAQHߒK|딵RIe:#(-}%۷4ZZZZZZ6R!<+r?t 9r4*GjIK-kY>pi6M~4=gaɼK?Nc"Eej9yիIǡ-qS:SC8{=ޏ!ĿKxPxu\sc8>wjAN @& 2"\`"q#&#'eh@ ѱsDOO nCPN:IsMM}kQ>(>FOVFh'}(BaU:"os_S󣩛(O-Z؇p<՗d8,ڈCujuB!Y^шIO7sRԺM[0a\OZ%}SR\$O'O kz 'm_} DsL%Ç+룱BL;{cVxGX%5= Qe&KU5Ev_Eנ$*ϟ?a3RJ}j{iY>^%I2ʕ+D8v;ДS0 z؟(2 Z]8u& SUq$f xET*(9sW=H@o"-? 81K94oѱ t+e<5@7ǽ1FE'N%QۑXCu4T!b0#Ӻf/~K#h7{@1)<v;SuǷ^3? `0o;DGP VDB7Ӻt)ƌȗHߟH7Çhiop _3@}_t& $PRtSPfm6b?)IN+\qr  N!BCrpkxgEy:\!7pܹ"V]PJW4Afa'.:>vO?݈ 554*:3xe!W 큁 xE@[&M}̄}h\7dOKI8p/D'U (oE1!*> uފevp."Y}<^cbѨQI}%"uz:g/H%\eF=g2t41b4%C lƤILU_Au,CvtaWsx$\[@Q) '[`$?F#޲E36WmZL~fai/I5f%{ד&MV _!C)ɝC9lת>HyFR1a89j U|Ic3wtD(HW }ں0&SGf+@b,s@0RT1b?Xs~Ѯ]`ka3PNJ-vs20ܻw{&Oj-ӗ_}6c܆/-XB~'a3 Bcك&6Y( 䠰X>Ki&Zϻx0"⪃'TiXv_Yv;.yIk>]!=p1hT%Q!DO}MVq|R꩚Z˨Nm,/,*%%%%%%$T:/ZZZZZZFR#/ѐ$Z:ZZZޓq2{}G e#ȓ=.8hOPq`{7+v}%Zx03گzAlb)멢cUd%6,3r8OO~q$Gh.+t'߻:[wqz;;ũ?3-\'cOd 0FWhѢca +3sOգʸ!{1uoSq،ݸx1S;Z>>95Nff>\|I)˫O Olxr:,Mnc/DYCC3N 3cQY]K ׳"GSÌs6_]F6unkOOq@9\Tj.:ō:Gߓ(64a_id6_|F3Ϥ%5$38ΩnݺIclO")l:#h$?DQT1=M 3vhϦMSOx5@F67H鸺ؖ4|4W',>1D \H-+Q\P2t <<w򙋎;t)O+W^tPS:2Ю3~p 沌}#.]:pDB c ' !_-|FWJAkB%x5v<9DjSՏ*JR~$$&6['Xr+6Fuxa!D@0{ԍ` ̃R/L#+2H o Ͼq7:Q1<҄q#kr IDATyM޷a.w΃U8H'(&ѐD$J (kTPBz ڣ{eJN;J} *i;xUle_޾:՗`hS%}"QcG.K3gNJ[Y_q/ m A|D?>\M\Ӳ J5Lhnu3 2U7W ~BB#7/u2lիJV e6xЇxs-<\mמ+D=vD `}M:bW?_d6ѣ4[L1:>p7n@ӧOH~lr) o *c^evlNqŕ+k1:{,[U{ʎeF'P&D"Mɏ’{  '*H ^eS0R9CQ5kҒ6ZP4xp \';o+26of~˖-m6%^z/Q졿e,'tG!Os]C2] :^wfz,Ea11Lc}j{qTE :~O=#-7's1e|a`*J +@J#@k*(u㕇ΏHSR][7FTWtaT"w KЃU)a3A5l.^4IU (K+V a3`Aŕftz#}GBv4Ӱ'Ow|Z:4ּ6TR“W])dD6#$:l]wEx9G%Ffhl~\ynO[}gͰ3T"Fpa3{͘)76oNW'Oܺ>!3eCWa35A;(S4|OV Q}x"-{=l9&0ǝD،'*T 0O>ӜStZm۴{6N*W̺UV9lFo:FIf >`c>C6;4a3q@@،?.4ct}TZ*mp&%O6e(ǙA,p gekŭvr~+ytcoyH-"_Q=WxUw|1$( h#*nY------C2$( h#(4JH5h h h h n68i',_mحÑ@޿˜ݤgds,Ø"5'p(… '!iR@;#|EDP&z1v[pet@ 7gpdg Lɪ`#Y7+G ,_~ahlimOEy@;鱇гϦY^Qap#O=F3؇ TV-]y%}&^xJ7;B[# ~ * ٳfҀ|W@~;N·IЗof肀4ɓ'+'I1}0j֬Hӆ?ʕ+o@iRhBKSA%m>t=o]{$m82O … ddw:z;q;^'`9oͼp3S@%AeғmL8 I| ~:th/e'aN3RBbhJe EPZSf 1#.Uv#o@{S.2ǥULd<<zFڞ#lyr aEyo G~E@7 " 7 'e'O- _hѢE"(i:K9ߖ* 3f( x#mI{DO̝Uhf@ p.2~Z?R }}T@KEXɟ?TXgΜ˗e ӆ31|-[s*1i)z}qrhR7)Dƾ"28{pk ~4}@2Pl!*F]JW9 mC rh"_tޒUf><)gح[7/,:tHRWCTxE.x߅l3~>}e<d\rEt2sЉ1T1S^2eʨ++4[*U|C,V i:y$=öX<}-|bfp4VA l \l0ahh+ez\ߧ7A #,`2D<=GU1 T PUueUpa)].tXJGٵk}*dE(KӡcUOd6Zܐ66[@o؀|2o,UOx_dIe~aՓž ; #0@TǎYO `S5d ZZZZZZZEs%:ZZZZZZZnxÆ #GJP0e4yL߿_L/Hl: K^^߶m[o1٫W/駟K38B޼yX\a344Ti?ў={'WXP#CqF5bc5A|s+%Z޹s'azFr)~1=ڸqcg;@}Bv{zꖨk׮_|Q,teO9|X8uЖ̄^` 6x'*THZo \Ȗf,̙3Zha3G裴p"Uؾ|A,.YDVbCoTܠ7wTd }@#XJ=sݒLF@hѢҺ%k|yd`љ~?P!>V䤉/⍜vyzzvAԮ]J)K} #'1?pU\ڵ`_|0~/U4c6DT`{1\E}խ[v8h@/Sw(7;Uv`xԩSMv4x j޼լU }ҽCWe ~[~tRjժVWs)EF ݩ|G}H4jtEcIbiӦѻ+tWtԴiSi1ܘ&{厲BuA"ɡC]h4\Xlدɧqcqe0rzk7c9{7iRJۃ3~4_W%>wf%*NA^0:{=cNEIY`G}@oӃpW,g W ;N-{lgf:6r+r'OO?eQQsDvo6} /znFxۣ]|2xn{'{=zKD;c CW[_Hhz|Jݠ ^1hT+A-[vRY0:uzE4HȜl44~D `#a#4\~zf(gWGU6@I;._nj'׬YM#_{#M zBίR\cճԤsjRw~2h׶ [/2׋BfΠ-Z N0䆣^I晲o0ֹ { fڴ~6ٸ[v:w+\I7=-o:߻ǖ_V|J>X/nC0}rĊ}V3 Æ~C?hĈQ<,g}٧ԣǻSOӧ7 % Fa >B7!͸ THWa ??w Cɮsj__K 4GisY3g4lH.cޭ-^է T>۴֭[m0R) ~!W-gG}Vh{pS'f2 vmI9v=Ơ믇ҽ(ݻc7ߖۑ  4`%AݺmVw5p`1¶̒ݻG4bYyn$V/f+|zpVtwZ UFȧt])QF kGӁ1zW-b ﹦M驧__DX1vz#AB24i"u Q;s(wݺuŌ?bǩk׷,;vhOTY^u <~.-]:q%,iӆ>sшqD4vK_3W_>ݦM;v0T&Lcڥ]Xq;ܝ< ׯuųv`?vdof/,/Y~3NvF󐯿={C%Kݵk<(_|%:[;sxċo/:=;﹎Ϝ1kXý|ݽ82a9uϛyVFe6KN>hK%LYɟ~Z`Zn` !Di+jFTP`V 2OgS駟҈#i8aŎM;|m :Yc_8*+:`TFc}lj/9.@Xm^ڙUG:*(3^9 yO>ƍtg0d":3f#2JQ\P(t:(ʿ}>?4J 3YNg0$! wy@1ɨSП9sfӛux-onvMM#]@ƫ'BE^nݖg'NύpQ'a_'r/o&+OxEEnۮW_~Nkj{9\30>"\,c ~/7nŒ> iY&ꎬ>|)ߠe޼< U#bJ>f^>sDŽ5mY6_OxQ2趼3A?{q<ԥK%}0x#Fݲ|UY^ "XedCð *-qcOeX ,WxՋMj2ʮ[qVRz*m X3`zIcqOL?e`wiFŜ]-[4ϳwy;l?hÃpr [6m0͈ܰWhty1BUڷoKs}3n6;$: 긱ג\_@v^ =7 jL(lNY'>DFF͹71y \"#H-"  aq-J.^@fPv\tIiB[)-]EMۄ3hjqn o/ !s!: {j&h'p#uQr6mdD4 Xbsߣ; #[XL` }6[ʞ#9S%Nz9#QnsgЛ {R< Rl9 jTқ|zJ˟E{8ŕ7QˮK,M>%s(t^sߋ`ّh䕓2rʨ0xhŸ, }H (92# y(;@ϝCŊQ=FFF f/cY+OG2߿2WFݿZ%t?" 8 l֬YdǺlR؛7kE8_ǙJ-[&p4\뮊". F=f?wAQS+W`Rkb& ~(n?,i^q+|!l `ZM281' ӑ2^ %~).8ZfQKy$-O .NR#d/WZqְpYP^hZjMժWa3xMg.k`]E+~hd%J`\{匸wy&q3ĽJ8Qo21>;_L0Sv \N?Fο{\gUxEvyev3Is\0~~"\~gÆJboӧ&gRnĉtDZe`o*yk}gY4$8+7(PyY?!m*UICnosҴ}Ƕl `5;:zP A| |g߾}|UxžSQлw/a\ҋ D?*bӉ'} 91'ʰt_Yc$ŧq'|u>epqBp4?Rv|RgC`1fAUR IDATP9,20a\A-9R}]<$VXQFVrt`a(Ao GWo0iL]XXInŌNIqa.H026yNIvN̸:59=p`?8oʤdɒ>;f08V ;F 2f 1Tx0DVm;P͚5Yg0PJ* ^ƒ2FԨBٚ6ߊ\<{M=,^v\,fLFp…巇$ ~wQ qP_RS֭<biGm@TլJ5&‘Y\Q_/m?ΟW6)<2mР! ("v4T"Q `ɓW)v,*GDDU.vΏ;Z*m/2[tد;lR1 /Tỵ;g bCwk*0 W\y%^;l͚l뵊| Zlڍ0{*PF˕+fWk'4رѸna"bŊ+a yJ&6 W!a{쑱)ޫKA*`bZIu91=R0tjeyOj0Uk> >]RvggϞb ]sL .bZZ5a Ǖ*#vZnUp& /ed܍6P@%Ƒpρ/2yRDK@K@K@K@K@K h#aiT------#me9@1H*x*`;Mkbn8t,אmZHW]WI8uV#vy«8D{ǎ"s#TgK>Mr9&~㴫G5.׭u.+vMmZ gH}X%gj޽gta3JUd/ǧh4Î2* a6Y`AX-(-+i4={GߧzgnV:v(B$OxIhDFcrȈ`o" nʨLo|CݩϧWLii\駷.5kNSդOD,C;6mz˴C/,Y訑#)02<\Ѩ[) 8bi#_~Ȟxf4@$A,Y|> # 5*G=o>r>v0^z{'REY\"dD@$ɒ%Ġ@V.Yt`}#+\b{OF1xr~$#eF W_{%qx-C|8TɜT2qrg dgEp,,];={v<3Y :pKgX߇/F{1h-bfAf^uFWAѢ(8{jn{n ai+{ߕ K]ް ӦN%[.p, ow;#rj 7p;HN,~;Eɓ NwcH )<>Fv:uiΜK(_ XZr>"m ;F泇X/iS,X@ ^[+:GjM\¨Uٽ{7:%^K*&iɭ[^@y)fzG _tSV`'ЇBBX^Ej#мysS|"vrQcZhgO20}~CMw@9!\TxEߌ/eG2Xl@yDؾH6̩ E]W÷\@)wz`}BBbK*AU8  ;44qnN"]D;ͷXђx q6Tx\r++LPP>}xVHaʙ3LW,s-ZL ^=<ߧ/ ) Te\ap#Qn<`DPV:b@v T]ive +0Hs=] =MwW +HEJБ00 p*,Y=?liWc"WDW^Y)`C@P?٨&2"x)hѢJ0X1hm#@%mc?BOĬ (0 )~b3gN+BUx-kgˎ*A9,Q /\x}T5@[BըE- 7V;1,͸VXAXXN*UR،= )Ēl Ɔ U"'AuxJ،Cnzk7YD~}HUft~UD)lF~}r*ԢEK)1i)^Z!~o*ҹW tbB O`+NV .yJa3R@%lJBIDV;ԩR،_`( 9Eq\tZ ?CV}ktv bk;+x."j،M7%-ޡ|R<f;_P 1Ja3ʖ->f hfLo޴:v|E)lu$6(E"+ QX;LBNi@ZZZP;2TnFm66̤i h h h h h dz h#(Πd&LK@K@K@K@K@K KtcMx{<7fz)y!wW/ϔD"o\&aI8~TϦyi?$yi歒w*}ʀ&a$pj+w'J+y^~O%C P7m&#h׭[+Bg5lmJO"x|WEb(<)Ÿha@V*xMn}R ]6Ov_%Uܾ,Xg3{.;SCňs>7R>}l磏>d/E $;zlBjxbBE2gq1ǽbŊrxh2ȟ?Q5&*͚5^z%[C z)!NULY[\_2^իWw1(1PG )QJPx WE2NC_}GUj$k}VΰXp˕+9q*Y #a2r#CqV7m\h`SF(N7(g|lpz` 9sBD  + ;앂~L膇yZ3XhRfnE6 b `Vw]Z~a'ez70W K Q>|8)'^rnɒ%>  0֭N|0@Ĩу|!@.m9;> F1׊ njӦ ; +ql`_ _FDte y摝TWD3}ۥxLyi\a~FƠ׎z޼4q_.}xp{]Hq$<ґ O:7m&rZ(TtpPEGMd/_#M}%$p|tiR֢Sn lejQ+&% "EmM R*c YR5y?|o2Vޛ5pzp%\K; - lR>dlelZ' iZ@ /y\J}05deI eb(5o"Itm fz7]8%]K;H@FΛ@7y^1YxDHۛihZZv5ALL |@LJ+lC "CH o{v0/:syR~ )xj -4.F }aHe@E>,HM(K|>u%wD_"~! 4弯N>r{vG_$ij ܒbt|+|-߈ g}=.g<FKa)֑!wK#/K|A f8q/Sw.<0#\ܩdnҙ_ޣI'@zHOI#exN] ǽ/.lOYrp>7%™-t@" ,AѮ{ K#Hy ;ݸxq/CpwzBsSxw | >t~ BOבPэzP@h^ǽ/.)ÏOg }%Uްo@ǺS@dx_[#L 4ځ wǦWR:UUZAG7Lk?H@H :(Yf`X![%3FY%on pN!Tw\G8 -4w<1e^͑\u I)m5]H$;;iƇNHK%so:mJdxx/b2qt4vr[䥙™ s%k \;Nn쒝 j6C,A (kD?𪄍xBudBC{Gr OGbN[T1≝ fcHpFGs9|*3Ay˱!4/wOؕNЉI@ZHK9M's~?\Sf _9MGקkw9^cԑʋ^=^"\_h xK 8R'.;K .[йn MzK4~`"nUmڍƍ!z9te.ЫT.&r:5銥SXѿZ%.dr=ؖgEq+8wytllHKv#| W|R@HNNWiəmwt|Z(c)q(~؋<3D}clonĺp8븈 {\ޜ`C#yB߿z(;oD,Jy~bC~qGy0C,'\NzMSW7.+7 ~NO舳gP2NYPTWF`\Ա$}`_C!:IIgvOFl¾ Bb\3p!KB떍 #,]VеS(f82;$r6 H!E7r;>_@vx܏g 2|!yoS )Vk,rpH1T1bmx/E(.93ҥs<&l^fd}(Srpn!ǩ6gw;eZKWXr YBr@n&Lm.l=jM%Lzoӑ#GD6l@VZUܗ+WL:3;ʞaRb~ 9/4¼e-0*k)|oQ3aW.I҇ ]^?P7{n XuqOևf h#HMNJXgvЩy|L[贜7?x|q:4]I}'^RLO_KFI{I,YB6h@ *Uy[@uֳlqS2`.E+rIq 4.m#svaЗg7clg/_w\l9CznY:'|\9*k ]幾\\f_q&YsYq8Z$Y8_sRAL_JaIA IDATcOKG4r ݃ I@A+7.ckqc?tFTs+~{`„&@<{믿L ̒֬YSp|/*G1,rqwؘ5€X| 7"FPehA!QTc}pqyBvw.CTJ^!v<@VI&&MT{xlM$yo:HF=8V #h빔;hȌ=| R1}:~u}K=胔͝y( pٯLoj( .TER1HU|z'~6 AyWA^39agnDH^#),ٯ!M$=Ӑ{XO}ϯ fxӟ;@f@ow*]k(C4;$N,dɑt#}* h#(Uׁxap8q >CBK SK{2S[@PّL-#;G! >%D>vݣ6/S7~^+y '=iy4ҍqk#/v,p\,HhZ]+<~rdYp8}}U h#ȫ4'lgK_2P̟ Z>eV+z k@:H 7|0ZK}K@A겺eLLgL!N A-gZZZүxF7 ]{H#d2I:CI|\Lx_LM)y֒)@2DhG8D3iuL%B8>i o<pq8 3;Z])~dWV"էJ: )AyJeH>5SZi!@!-p$S(D׎BK@8$U-!@t6CAi#gpvGjA);^ -;@~n:u(tEK h}O_>+qDɎB)`%W}%pIbmt8HU2! }qI 1.wd;6|#WMUK@K@K@K@K@K K@/ei h h h h h FY|C֜)k֬/ݞ8q)$$Mk׮H")_<ٿ?+M߷o/_%=8ʒE?~pPНQ|Æ TX1%)ڵn%\OΝ;GS'Odq*Q1Uf\Bٳ'ݳWR``3TLSڝ(ŋ\vMwݕsKox6O޽{B J,:tJR;] =p-ЎyONȑÎ-Sn|lԩC7nH~hq( &YFQhhR%xȓ'AAAlekǗ.]%ׯ_Xʖ-.\ B;.P h+#d ""i/'3L+ te*226mJϗݛfΜ),cPWFU``@"i):t;@uu(3+W.iA c 0tMxRg2!v@;!+f/,X ܓ G"YYL?wܶeیACC19suݎiN9nJ ?Agwz7o^;T%h` 7M @jբwMիWбcǨKNԣOо-U~n{>LOVQ#G9s_h4adC]s|]6Tn=֭-.*`ǎ@4tpA}W_П+WJGsΡ)'Ѩcx$kooذG~=v,}w/Q^iN/?׭Y.?0ƏuIQ,t!= "(`Q"JJ 3Oɨ$=Nrwcoovv?ݙښ꯫kzz1rU^#(m۶vytkG֚~Qᥠz1~Y*[,H:x@T,̘>\~A?XYd1 6}0z U &Jv5^5,&;kբ7|+,Nvxƍk+/l(OZF ^uߪ@8>-Zt7d_}t͵;N:q7Hd:$i<,YFz_ۇ-]|uΜل>1m ^ da!繵`F#@xᇩkר`**Uoګ|SƍÿJAodɒAH!tJ ^h^Ĩu6A9HIy>Wth I__TԢEKqea3GNhA9%PVyu+Gh2'4yv4 /m9PMP"E= &L<oj g{ ܽ"V?@N9<z];m਽p 8+N4i^JgyE͗(8i8?a8ӧ6J(p!*W1@mڼ"yvαXb:[P+vB~.$,17kl7WvN:t,٫v wQw^-x^a_?+#n;+h. OySn-i>ѻwT/+W…?P/͝;F  V_*`<5kС`6089c W^D<|忩{"6mƫԣ`P`fAv޻裍-SxGl c{紁-& 6p_k G٧w_oHv~8~+k3{/o>zGUfLN'OW:r[k#PٲwтQ֐h֬+HwC}6jl֭aмsTªhC? nՍCz \0΍9Ԧu[ >QmܸA{.X_ ̄>}Qݻ>#hQ~#S&J{V* V7i{YԹ/_ym!,_^ׇ߯A p h̘1H}ۙNS6lXOGywܩ$n>nTl,W%v6WDMԋ~Iِ<$1 w~np|Rl^&,fr&Tnj#j7}ڵ3Qo<;O|%~UAX< P\.AҶbr3b2Yj7)cX?G췑Xʏ)J.Cݢ+ aλkLοjժmP^UܮUTM$./dxwUǿ~TzT8t,6->70WRUD?/^HY)\oVh1TՉUJɟ/8}׿ٽ[L9Xkhl3&LLƝK< <<ԠACuٌ?ԯw2?p]kּ9qU@8d~'V&P0`A@~_Z|;qgQM{23z;Wn3Pŋ~Vx߃|r !pᄗ߱lf'ŋ)}N<9' 7oexwڵTn=5g?@<*^zy%ݢe+©S'FXwӦ}B}U1bƭq`PҵD?w2 *wL2qQQ=?Ue`Tj"YU˧y#T6.^lOZ=C]׷7ծsKʜF;Z?aѼjo38^y%jҴiwA>ue/h-"O|C$xE,G/؁*<=4lHx|+3gΠYOX$'~ЙjHY a2ƞ4[T駚^7hxǐXC+v]BϷ~CW=xïg(,tlIn=X>GWIsXW>֊lqcEnƏ(Yև_ *!2%6k"[w6c-ΖDJM+.#,3ݶ-0Blz_HFٞ-cX,ESl)VE"`X, Be]E"`x <*X, [, Z$ޜrFvH템ILdMlY* 6["`?"xV Up+HCAA[R!/]Kxo[OҟɅV$XMzd>Md=2 9,p<, ~LusI_$`R¢Ff!LdC)'WGPˡQв",F]@/D-5I 7 {?73ōt[D dbC!q_;LLjY,#l5*q?]i x{<ܑOqF0%Hy-Eʵ\d0 $A+HxyS׹.2{Jtc]*kb^xH셣f,PY|="! c؀$ъf-gHt+U_o$>?c_,o⋠|l/MdD3qq4stZ+ڌ' uExE[kf-Yf,l4ߕyJE"YwsllEȤ.)5`oU6cذa1cK(G&V*s( F,R{S?ń<qrّRʪ&`{1-(I2mIB[ۓ$+&lٲA1|rYFH^@'sܱ@0tSujEBLMJd78D, GI/|J6?Dcs'~A͉|p$~1^v!c+–6w]f\e"䓏h@6yΛ/%;wH͛?Rl3f4%;tK.$C1u|V-h5Kh3ڵkKo5PHчi3h3@ڌN 54hfΚ-zTIWyy3mVC19+rS?X^hۚ mXC1żIO|m-)n]"d01blf_&M"hѲ6c?_k]juh3Vݣtlm1Eyl4xHf̛7; {g~mƸmW_+ @!!R]X#Z{5>S ܾLJ{6 MMno c׎گ58y:R 0e0{$$^T&ޟJhA y[WE"`X)E"`6J+u-E"`HSlۋ[,E"VVb"+VʯeQ1 ^oflٲʌ lȹY1[*ub˝;<ڶmnukn1yО^ y(g.zCqo)7B.in;jMD ̯޿0E#pMdC,YvO1\)+V ЊPy+^TƍUy*T \hA|B̙3i|BjצH䭨?N^)g3 c5+ƏO̪Li`N_+ d¢}d}?xJq}?[l߃V%@2\"k rU4{MGUdml`EjvE"?{Hg>qH?~V7o^| Z3h )&`-;-[.Cf`H<^et&X;wN:)ҋ'sΡC7ϷQ3f?`|ѭzOb\grlw3S'\֭]G/ߙ_=F7}G.GٟtFg]4%=GիWOzO?D7mN_u9Ю]i3ݫXvt+ȘdNj7|_P!seKعsds4'O^,. ˗QÍ7VP>sAJّ7o>;ݳ_T$w`ەe&*wYȢq_\9Q_ҥˈ%Kف0Hl+s(Daby,ɈZb%wƮ"0]ŋ?S +Ȃ@"YpeϞ]$ #aCr"#F(\JUmrA`lc~z5Hd2/_>^ȪU! xa*eE"`X,눀 #RE"`6 X,E"pAu^"`X,A '.&bH46q(+rlхyU9 }<'bMd:^} .3gC5io4H[% /jhS𦦡1IDATFq[>JlLL O]]̤S`N$}U/8GLU4^>D7x\o:@e("od%"ag" P hœTrْr<:^ )o/3_C?Ub@x[Bq>7ɵ7")iZ 2Xr90%@J~cP42(Ee kaů?0[2~v:~)ȓǥ11ڵY6$_& 5*shDD6ի8A]ʟ7=ƍN{UڵpIR3gNsF߭"Y k׮UwNlܸA%CBŽ~X'> dY :e'fX^^f_\MU9"wL7qW$. GIV8\~]YD-Ȫ,[XfJ?>\JInN_N%|+ !H_ǒ%~ǎ;wꇄk,`# RD$ ԕիVQʕ)/'7L,JxlFVDQV%_( w޽!,~"۷_g>>SUxD v I@4K3<@vm#?|twRa'I+r&*dfu]\`]H4TĔdT}pp.!KK]^rqfX]STdI-$U:'۷oɞ`>#d5 D 鞆Dr/OTGUiu%SL{.Q{$獜kYxȣE#,xEd-JMZ0+^\$br5J4m7(~Q r ޣ.h.$HdVՂ/ȹsfS=t+SfZ͝ժie&5jف&Lj<ʓF@8̜1׃"ڌ3_VzwRx|LUGVXQ݋-\H|:k&Ojwڿ|"ڌE~VfQƉlՖ͛DD6㡇f̞= $]) ڏMxe@Wv,V4moDYf|"Y\xل%Ki/6cF]b9Yob%zQS'S&MD7ׯbZ'(jeX,E"` ` @E"`X,vX,E@ 4E"`OB+2JPѥq,˫%F{?%7ڒzxJQW3EY6O6/~ rl*6o |kFM[h21Jn\H+(xrŊ4gw3_da^ɆZ  kb( cRAAUs^%5?eWQ;Z|;OsNKd(]&90_&u4& deK CE-4  PAKU# ^pA@-TbEӟ[kD#F+/[v.J Um`ofG=2G {5]<Gv,dD?8.G*dnñ#D]ď^ƏG9'(j TO@ǏNM6j3bpCV#@`IN:JdQ3L1iQB#n'OT6o$rHLt_!Db 9p#fd_-VƏpG#4udEEKUvhWd`}M/>ox&/.k'NI&R9o׮Lo'۽G˖-SǍi48pTR?dX1Ę׭SMow/ 5a8ʖ՗Ƚ0a<,X0Q PIrA/4k ŋ)q.7m=٨Ua p=vgDd'MIiݓ'MROWmvTj[𜩓嗕j?CY|uʰo>Q z}B=壼FOpyTRe:'#!.VtI}Q YdHt\Mպp^o3қ#xf͚,]f2S&׷"k֬yb}JNǻu.ZXru`_̗OQ{nzZU:"k |N h3m* iV3͛7fEvb>(ImH1%ȉqGEHY !y" k^Dѩ+L+PD1jH\ Eh3W{w}b~+ŅW@*-3>+ӻ'.͛mUd3h39L݅>[Q?ץ֞Re{9^JZ, .]+E"`%6 fF[,E"p ZX,E , (s50NSFS0F[R/1Ue]F3QkP~gCjY~>/ hMLp^[3`! HN:ӧH&Ǜ"lb)_x5rah DIŨn))9bbbi~("odtl71YJl%y=ѩ o#"H"L.6.ڴn-i3_&y&tI>^z&[DRīӧ}ڵk_ {߄|cD\[lO>Ym‹b8{aPA}IKֺ6r+E8u Zn+ʛ@MX!?d I (Ξ9 Cr${+AH/^Hk#GK}{9'gXZF:pMllTH+X׏3bFb.,ӧN,eŭ[A9! k( $v`A9ۥk7G>]G=Ɋ\,'[-3#h' ÝD6hQY"{^ݓȢ:x*kiǟ;(z Ξĉ";gؼwW"1%~wj7ݤcz@Xj1cYWsVǏӒŋuܦg#x!,|X,DIf`Y8ţB,Ї+/B}^\?tuF/P͚7gѫrwT󢢢h֬O)O=2xD %WOrVp|g+5p[CYp'N<|U/7?zs̙y;p\,˗?PYDP\dRZY~Ź~f\>AˑVAFfqW%~BX ;\&sGi;f4tP==;Rh*! 9'HŸy~CPFHO㛓̙/r_C S@/ d"້Da?ŋ /sRwӋ! Pȑ 8SAd5>(#i19\}Aw{T'|囿hP-({ C%Ch=0&&xV"Yap3_˹rRɢCȜY&)chUl7;8qejead'ecp_Ey$m26`\Σe{^Px+Al`,@vpC[c}h3^lߎufۛԹwe}ub "T'Fh3^((yf`_7Xp |C-nNo k/mM={f4`ʄƍhmmƎ?biꇻ'xƎ fHVELhĈQ_ "$ZZ4@1)mUh[okư'SS-[<̈́o$c.о][٫6Ĵ׭!C vyuxXM?BG뉘Ey=InBPkߩY,pFe%6 (ljX,@j"`DX,E lAP45"`X,DAeX,@ `ik(r^-7[,S>2H#Ϛ-IgƳ! (4Ǝ\=kokM2f͜IUV X-׈rMZ`A 0mCs~>.PwqUMllF6eDoBWt/YN>Y? #?8ىOP@92k 7o'.)flٲסoQ[m8 TR5<3?齡W`dzIJeRV*Wg8 R)RL۷og٨|'`_R%3ɿ7 i+T܃oU+~W(TP ٵkʤZL3ɿB/te߾}ꫯnz!NӿOd6 0]DŖ+W.6{ #/0AT\9T)d˖-9?&+$'W9J< 2p~ ۷)E ]ƠP<aMp]"QL$X(L 55UKM4;dg+h"L';P~% =IrIܐ`-S?` ][)]4,N@O":h*VOЇwq~ {kժLm4J E"`X, | ZE"`XBB+X,E"` Cn/hX,@( `PhkE"`X,]w-E"`l `mX,E#jYaIENDB`ga-5-4/python/docs/pgas_11/image1_crop.png0000644000175000017500000007653312662210372016447 0ustar mbambaPNG  IHDR^+iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]D>pIoRDXAaoEEE 6l`G,Xh (U"B lv7L.{\6̜̼3y39sfN>IA@5ڝF  !^ 2E]Dʕ-[FTkΝ4}tڱcGD|m۶ɓi޼ytX"W\I3g2g̘ʄCUnf{9~뭷TYʗ/O ,ʀϚ5VXa;W_|~ӛ2nJӦMٳgSNN~TTMy/_N+VTy"??ФIhr❸+=[~O|gV|nz D^lONwJ7pC58n3~#++˨VQ@K.qo 7mXvmoAg<Vwwa}^y啈$cƌQR`Ag˖-k5JF%Kzhw}ג?~gԩW_MK(Ton޼hԨq뭷Zi^k7=}F %K(Q 5N)~B B߾}UΒ0`@D\n}{ϟ;40s#FdEpI'*U0t\%^z衈 }-bš f;5kfvmhuΟƟ|׫믿Vq `ȭD_|QmQFo^T7T#wsTL}n,]dƎjĖ`$^/y˅ /3ui&Kd#s3 }gGc _ N514{>7BQ'Oq>hѢEV\V믷SNs_le"qQG{0R͚5 5gΙ|1;?3(bpU#4~UMZ8p`viK >g7ƒw1Ǩcsc]<ADy?&1jx]+( :L *"mnŵk׎XbX_H&^xe=z{XG%JtY)N;XRGTjՈ"5jO8:ST9x4H<%U/7}ޣ/l|Iģ4zU w)N>>~[ x?:냽f.׈,QC79T3<imV~gzgԛ'k"ҙ'n+h?{!hтXCmڴ!VMXyiS{g}΂Q'!CX@| p ʚ'6?>r2ЁOu|@ܬ뮻x7n >gDQ x<!;UN>~[ 'ֿ++%4/i2Â'V@GK}aQ$GdF xŻ>p9眣F1Ff#˖ij0t>&t@<٧<8?09Bǎh.Frΐ >_jP`k8R>~C' &(@(;+ Ҕ)S"-F^+rH= aN)wNoj3O 趽Md+Ff T:)ƲQ;~&x='^axv| իW~p -8MM`;Y`Pjv'̬2T LYL`gqVyfLAfwy$&X-&b a: f7ۣŲ O{u̫U>XZ}Qvi,}< 'x }"̇*b# FW_}u:.r͜L_E 鍀oz^!4l4) 7)GP9Zj6!&d`^X|,v YXl 06Fyű|/o-#ҏXXF:KZ`QegwI;#JK(ټ[~L4ݏXm$楗Y|晌R&nݺʣY([}2s X5ՑM_bj̗K3D`?caܸ?Sq4WPWzQZv 6f'QzZRŀIy!`e_W>҃(<> p?pľ~]xI}=FyO)w/)gǙx/?vKQqZnYA7W>4s*w1Xarmυsi3o&g>t斆vݙű[z,'Ċ%w-#4rSLbqu+= xbKi9Z-=۔3=g>%~;ŋ>|K׫D̙ %ec\әljcq^ ȌO:G/C^}SxM_?^ңcT؏#< A=Im_cxڬMnO'~\ Jw2˳|*x2㥗^[$X%prK,=~ǭ&t#-n:[z|ﱙ>~ͺC/+@/ M޼)VXy4_~i3$>)p.^v jwtO˫#מxbCq䵼"5@,L>zeg8wKj|Jo&M":5z*]&^KzC#^PG8 F"l뇇Rz.Ha<# B8&7>87eAXL7.,( N{Iog*L=ȳ|*}W9lmÍʷ~JU,+|ʙ!+ +x3z t Hx"yLͫ|J½ٕI{̏X!n UBh޼yQXRO(1_d#Gzu&X!/2>)EtG?c]v|[Z&F#:VWJPU-p|L&99e9|)R$jp~oÆ u9*UC WB^|SJ =VDԡ3# ^5Kڧk۶'ƞ%?XTѳgO+n '{_R`A@|" 0I.@Px"(A@O$ A A'B>䂀 E@7(_L  !ޠJ~A@|"u': ko\[,7Qpe m #`Y*;ul)!u{<"6> ̙C鼖2B}t)Q~/ *KA8_`z9oKK(Y6e}x+7*}ü䏕f׮]͊΀ Qxɒ%ͻ~=xeeS EDuf%r>{ x{x|܇ s/xuQOΓڵk穚Z{뭷 WUmsΤ}i-(zT-^֍/^Dw/u} ~Y$ޒ|ըoɁ;|{g^b|@=}RR;ӑga:9k2xP.HsΥ^A +7PoguQ#G*ÇOUG͒:?x?灌 j{WC!Ci{PI txS 8&6jܘ nvۥ㡐w br3IO[_k={9oILt^-.I>9t_;=󬳩\r DvmذKltAE vuz rs =qnǎ)"t1J̑.Hꫯ%̑.HkHnc']]>ᜤKec']\2 t~U`5;ݪ9E֭M96kL\s mI6 ttQ;;a !C%]HIxt5 k'Axa4tu &tzkHNWzaɒ%j"-z1N:&Ҡթ^ذaHӭ^;&LBtA?*t x1n tRՇթ^?G5[0fJnf.NC5͛?x3,Ter^{yfߩES]'`{Fa=4ujWݻ)*U$}3ǟZ_ 0BnҤ)/_> Yuǎ|?8e}~L &@ɐʲiF6Q&D~38tzg錀Yg`}]+WkRӦEeH/YϛGlտAhdt?0>hv̖iMCiժUn'Y?䓣严3ˮqB$,R$+~畻֭['j}% b[\ amku-͝:s)dhb뮻%{;.cӻկ .]:q~I.+rJs'q&$pOT ;x[teI ]8˳VZuN}/EϞ5tnd?~\; 9^z[ؽ\~װwP#c4D(vgeeSuvE;ؼeڴAGwyav y@VTQѢEh8iӦZfg刺{{]PyR"]bnݪaGl't 6z~A)`]T)znZ"^<]Ԛ:IM!=^zNiޜ.B3JsݞFߠE)^Geˁd83ޤz /]<(ۛo < 6ϿBoڽ yg۴{~x3ߘ!}tĈ/huwGmmA}-g=3Z^=OLim&@bxc$)A@ЊV8E MA@+BZa $F@71FBjS  !I A@" īN&@bxc$)A@ЊV8E M{ D#cOGJ#v؍u`lnwuCC.-ٽv6L>!v'9r{N #]MZ ziBHe'O҄~2kΎPO}"wm~:Rj`EcU+ &CnٺE開N/ÿ2 ?t7}v6͛;^0VXA[l,B@W]uu ]t) 7`bݗֳK%rs,.$̞TzjZC5ZAf+Vd7׋uӒݲcna.ͷ-:K*TX#)~Z*t}HiTD PZ2y駟P*Xq:Pޑ#Қup$ٰa@UZU[6oAZ} wܩ:{v//5o"OzBW_퉶L/}_CL2 [\ҥK[z :{ ?׽~/wt{:ݗ^10h2 {;lKq4s}Wfa-H&86jěIJ]A@Ho"  A B낀 hF@W3"ND&BH  !^̀8A@! ě!.fx5*A@Ho"  A Bu=ƞd+g˗/S}"ݫ֭[3$ o{fr|NNڛwo5ڝ̫3Wtc/^ hNN7RޮF5W뼃oݼe35)'͛hڵع6mڤ]f.Y; :\v ;ۡ]m[OE灧kФIMy} MMJ3g ם*OkA,OfΤѣGSP҅pm><*U@\qn {csQ!~&19n4io{0dWT)ŞAK.M&X'ϟ/M. aÆM7rh5jիX,!H"c*_O쬬T~}*<둉sʅ^{rǎKK, ,)rOJ& ,}ʕ+e-+auWڣ}ܹtgp1}޿6+;_ 0|w;,khSO=52s2wI/]JKW>_װKZi~W/ 7H#Ǘ_~6jdC /hEW:d0-]yw jժ)#dknj'o=xW]꼜m[̈O'@xhp!.=ʋ+ҫT)=CUQP aׂ;F P^C ڷNX)V^^vq8jp3I/j'Q#G!ô=((;H/ t:jܸ&vÞ%Jh t͡.O\vI}_吝/ bk'M6>ՇH7]wu4:IK*us6隤[Danf͒̈IANvҭ]rHۄwO67ޒl#]n67<"줫/9IW'9bkngӉt+%1g n!A${?${dt# $BZ7(BJRċ4t^H.&5 2M˫#]#tb:]SFS{& H_ZI#{;u$T[RMɆNW'̫vbX{6ݻќ9s4lA>ªב{ tf4q38/EՋ T`6aXE‰Qi>zUi5k֌(]̿=l(l%BKS{Qi|Suuh16m2; [nV_Mގ֯SN0j&3#F|A6;E] чz%-0|?`:Ҽ7+?6PԠ/Vg)sXT>gueҴC**:TLf 1wVM?Ipj I$@D@7oZ BG| MxfKA" {[ @D@7oZ BG| MxfKA" {[ @D@7oZ BG| Mxlx;JŻ2>a[E o9j\H91۷o_V3nO_6˖-={vu:!wd}XĻw7ox?:WDŽĻ O 6{lڶm[!uXĻqZz͞=;V}m ;G5s *j:0 ﶛ\[m>й]GٟM,1_NBe˖u+NfąviW7WNkpo%InoO%K 9LҭV:o~frB$W iӦה{(3#n'&^tQk::j+ .vmذ{"t۷s>It~1*Qxrv=<'ⵣın"$/I7U I7[PDu[z!]̡~o%dP!GS҅,Ļo8 c" :]Q/`&x}VtaiLE #]xBN0n2;w?|66ɓ-uϟOp_vܩ/>jzNlBw68; |o㎣k7"'|fHc¬33~wtͻq桖˗Fwܡaٲezq^t^o!p+N\s-5n4,W_xIKG>~U+m۶ժeO$Z҅f͚Qjըۤ_뮷;/KSv˲ $A@B:P @@XT@Qd !^`IRA@t īE!x}%IA@ЁE >=li1v2xfGܐ0'Z{dlegqz^xg a aB*vN w{%dm31ĻFcfmSX9 i3om맏 &C *;t`w&qܨr пa/슖Av|w'v?CkOJ dEo}o>:)fj$ݛBř`2IZ'@91 N0I[Qu.OVv=f1RIW{w{ftq0IvۋFf%; 1Gz!] O%CN$^B0.. tlB H>t} - n,^{.5t1 ?h9~b; K믿RŊgq5\7$΅t-N!8$yIH7Ibd B)XB^NHN~R A+qڠ;711SƄ& oV:]Q/$aT&!(HE ]@7fsFs"MtIh!<ֶm[ҵpwyN(*+20Ww>r빘Fb'rkshٸqq֬5iڔӧU9s*:sLsrrT}ud…1N!8φ Q sfϞMO>$K=ԯ_?}t޼\5 >zL 装 kR2eviϏ>qeXw_={%VM6?̾ LO3/E)SZ~!6pp3tkܹs|+W3g*sDW:|͉Ą~Re)_< 0InSW6Q=zguVLug5ZnmKHrÆ jHB/_>SN vI'd*T F"EbbMѾ}{mIU{ ֭s˞kqro.]TߩV/0xB2ū[Fվ2x1QV-mh]V}fTxuVywayW"3@{ g˖-kb1+M}fB h>ctϞ=ƹkԩSǼ P@ ~ppbȼ ^ J&YѸnKx k%\bUG@6`зo_E$5aq(ӨY"F3ⷼ3:3wm4hXdRccy+R_PVٺuf: xF׮]n'=@Wb@wqꩧFeƀ"rD3ϟ?_wީcNK.j0:H7)^w'yxY5kfvm~k3uU-1h_ Bfy_b>bə.UχNZN;*A!`w5?za7|w< F@{ai2H[=Xzy{ Z_/؟Sh_mbi| _PL{a<} vynǘ<- uܹz(YW=;Pv,7H`&!=<yL`lppgAպ{3_2R|ya|o%QYEudorJ\XO8  Zh15rHL|>t饗q IDAT^n*rz 0XO#O> 'tYg;8GJk9LD@?hJcݟmJh%pakҽמozEy&R1O;eYRBNj/V%=3yOՀk`K&é~Jfo_mqU:ޜ{93]Rnk6tO>m 6{,믿nRPC&rneJed8lg`:vh KpǞ| ^{KDH:v#^lX#䣗eMoϻ}v5a*<D2/vyxxُ/&0a1*{uL .|zUC”/ᵑ鉗t l=JZױ>ܶgkܸJ+W|>KHT&/2T }V<=8쒡|^iOc'*ϡ&2CG6=E}aC~oz=S} ~9%/:7W,32#W8 G3>Sjfx851fKBrUWV 򰉏51tlDl Bl;o :M;!&нIeLKAufY_ +FpE϶t-bo+T  zQ蘟{9EVX́9 :an=v_~Y>KRUO?){Y`ׁ_}x8xإXxB-ց<>"$:fĞ) C>뮋0Jj@6 ٺk2"ޒ3[kӸ7V Rx%0'\jqcOk˄Ou ͔~[oUbxAիW)3nM?ȫWCۣIJ {W&^p@'N'?0a ecbXH~F];]y]:F|\7nKT#L'abO}يAZ#03TL<!?7OtiP:0&ÿ#KEյ~&L@5jo*YH]|?0ɟJׇr`n_ТA\Ē xmv^(kǽHV3XYjܡf!WA >9{6nyVc*լ)ʪp&ŃЁ˭s9A@HE$*.Doj'Ddp (' Q]=Ê_0>XQ[L- {Vnʯ 켩F#Ӣ2V?ǻ\ lswUЂ`A^ 0aFaNYX&QMBf3{a˝m eʕx?Jgdٗ{.ZRȾ  %Vz40l~~-ؾ#n?⥇[l>a߅^HND_KcD,YK/L{G//^\0EkfX4gǜy$utKZ3s X%RSLo}2}rzlRX|17Tze37,5pu[qT 8au0^bjX76]0֪ ҷiӆc?y =B̀E^8C=d^M3T RF칀: "b# l -lNBƾ? /L|wjEϙYmjyGmK9#Ztq}r\8ϝL=B׀~ə~x3#{=fUUΊb/`<^[z~Υ^[L{y1u7ٵI\G`2'݊rsg;)םXb& n鱜+˚װZn5KJ6 xbG=3^ $Xx"-=۔_26>jL5T\0hTB]ڿq2y!Ė-!T g. WrO+{Z{I""x~ x bGJՐ6Qz,1 $|ҰaÈ*뺣/ٱqPcGl22mċܵ֍~ Y(XөdxpņlSw;`3  9hYshǴo{)DkPD]K&B+iگ=+4~(\ ۾U"e(.hQ%"mȗ /TVBr-ZWDڔ^P#{]3Ov{:m=#5gv5Qv`jnޮrgv.F VP,ݮEchӄ޴sX3J~)tԱTK*^WS6Dʮ%?޵xg!,_(E~ CE*͵BՙѡR;+!o"PzTGE* doyN{ٖeB>x3u[^n˅V\!^{slY¿oRfdjٻ{ٞT Yib2Քwprh znWK?$myEO_Re.%6N4M1-\)/"NTmu͍J=Rl~tϊikXMVT嚡hkvO_>wlt9Klǫ3_"Tr*$oINݦF&"0Qޢ2!1S+! /͹\DЉN4EVbϏԂm{ږ;>|y }WA|,}B:gF9BB@7$`El|g_~<5<"aFR[FoNtW ufFA BqK#՟QaOƭFF=B~Q-W;"J~ïXn^ɕTaݨt>V> + ލ@(R$q,]}WdLItShE@FZaAؿao4}6/]o~ǾwGG(J6 ?dP1;u %GQv`ˋ)fX3.2?W}rEX\t(iCE@7TxE_h6oZɓoz]gnOoPWyAĕL94BGQ99kO巁yͿYI{CHR !Tj )@+ޠ*[rwe]`? c߿@Jyy*@ ě2M!#hY، ^4O].ݺVaUu.@ ě*-!Bdx߄sl> u֥ /^jˁ JRkHYtk llЉx5̗E.sO&A@.7Wlz;uoA UMՖrY?;m<:FB CYur?`A UMՖrE P6grWlM^|u.@" ě-#@ _b5Y_Cmswf:&>ŠA M6@t+l/Gx.}|o*-8̗U8uŅ+gˁ rH"WŠٷ:.^XTG@7[H@zE'oʯ |I~jNJȁ BPcHQ#PQ`f&&`F@7G@RU@ȭTI|ҕђTE@zk+&+5VRÈs9R!To!)_Ԉ+P:<⢜)o 6)>KWH<('@ " ě"E@",IDHAxSQH_LDEJGˉ z I_hD<⢜)o 6)>ċ$GҩR<@J%=, dˁ 38CA d jȔz@ ě6M%LA@7SZR!io4T2!LiI  BiTRPA@x3% 6Z@1m44h+w̙3iϞ=Ԣadž:]p!UXʔ\TҥKiΝԴiӠ"رE˖-)_|ׂ,Z*T@e˖ "&*իi߾}tGG] uъæMhTvmrOvRLg-X *߿J( ̛MmڴVZ9/G ֭[S2bMsΣٳgSSO&eT{/TVYj5;N:rϟO~)|)|,mA&L&8^FE48V G}DժЊK/}L:]f- >/_U.)S:u⻄IwܸqT*؟}L7pC'Y7ۥtt#iӦҐuM?38q"FjP@C n=Ogq_laj4K_nߠFKnљgM_E&MC2FS}Ư~pxglѣGѯNԊè_^q5nk֬.JZj6$7L}iI2N/<=ۭv6t xYmm} ;xPHgi'AL4;7C!n>CO=v}s?Mۿ?٫w(Η!E" 5jj#]!]"!C]*In]V1h MKXSSJg=nP/HzAFDP/=M)RO++km }B #] ux&+s_7o>Ӌ)=cͣ^=_S:ͥoA|iW^RxTPh:u* ZO:(-ZL/xt}=-94 P^~TxqMR-]F?kTREmrsr zkv.&:O~"(!(P .oٲeT\9W`l|A&d qMTti*YdT8B ,Xt>Q8 :".S8ر6mHJR2%{h >{hgv3c?!MVwJμ1 !sHwAG8ٳ֭[ؖ~vdq\$l7nܨ <p}Й~w^Zv-ehc!^'"5i҄n-[4:K_JI]{-/_s/ v =֥+5nKrir4x+x믥>}_g띡Ci G+iϗK#nlsʫTr'wف:uN8ᄠ"UW%`IDB'7^ٛUSLTAR&ADB(/n"7(C4BWq)V8,V! xSRA@2&IDAT!ތhF BZRVA@x3 NSkIYA #͈fJ@:! ěN%e@@7#Q*!鄀o:U2!ތhF BZRVA@x=7czm%a > va@¶m]γׄx=6}jN^T/JQa!8B78rI! '3 @R˅Nz0!L3Ϫ!$t~ Ni[!]M0K)< [&:޺0e)rxϞ=ZO~tNB#xN`3Xw/Bx)މr\G}:Uu^2o<@̉9SL F\_:~gQx A@uQ-hڵ.t)PFHOQGEg}ҡngqFׯȇ!(H$BFzap7+ݼy"v㫕%\B͚5m۶FΛ6mSO=՞:zN$G7Br]FmсSlyaۭ[7ڰaaٹsg: ѣGӵ^FS_UcǎU[nEǤ&ߖ/_۶mK}СC.fx#FPg)1JDP Gk֬ŋӒ%K"Ru"0WHNC]q2X*]NX88)VX%`rkQ 9dkYfȑ#,c ҥ"` =z(ȃ7aT#(R ըQK5V ?wj,]/Lc^^;Zag@b432;x:uJҮ8Vuni:ۑ#捚}ih$|;W^y{9HԹF@kC9 7Tn*~-b,_6!+3^T ND2<$j`}YZ\X AR[EVNK.UI=`oj':v[N҅t Zg.a$GOm?-c)[*'I!`."^n;IQrJ53^tQD`t;aNH4˨wwb89.6_lL/4PV-5Y RJ 1plx#WA *NttƗ/L/$ae'rrXM0VHgMe30$vQy/+9l_IPh#*κiE!fSc$Sl?MnXp_Yv8bV(/E_pnk_t“/2 l NSp]NiND*:Fwݶmo!CQݓè}vԧTlu}s&Ml))JH+4}$rubCCPSSч6!RC|\HK` ^<xHE-bm87'hg<ߖ3g.k͞u{^?TS=T!h]Y-ﱹܛ >;Щ|wժiVKNuj*ۖ@[vRaϞnUM{aÆ l1(Ix n/0"`r!"Dsu͛z$^T(_[ITZqI_0<-Ԉ{XX'\`=p.9u6?vf(%%Dz-w[]-_`ƘstB;ydqEr[|;=ٳjݺu} guQ~`L04q5fܹsn~8ˁ}q $< ~60?&P !\ ȒI "0;vLxE0 MDSȈ/ύ i{uE0\rEW?t 1 w%$ylREYWWӝ- $@V "ʲeˊ@JㅼzZ@Boo+U@7*^ptf`F܃H` ]|.&ŋ֭[}jڵ3qƌuqV75C$D}B~ӦM БU_ xxtHX_x?,4P, $Oonnve|з37La୨&FgHз +)MMMJ@Hw'玎wy߾} .zoiͥI/G.H7*1O$8ᅗΛ aLN`E?pñ?`CAׂ_|hPp+nw'O֭we\.*DeEϟW;vrq_^#{7Pewl_i*Û29eVF_?Sr]PzP3iܹS^:P䄲d,NUvgܿ]_PK.=-?c2-Q B?opCVc7kwZ _K.\sH-tȂ/G}I3;f@$ F@ݺ' *K!_v/U+Ps Bi566n}SZk.ySM K@8;lq{+*}8ch9sZO7T+2֦Tmmmt U~*UΚ]֪*)(N:AĄ^R0TuuYW|98ܱ9hɂPSS#fA J lGH=O_pUKK, Ys$ $ 7IڬHcFigIENDB`ga-5-4/python/docs/pgas_11/laplace.eps0000644000175000017500000231430712662210372015661 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (laplace.eps) %%CreationDate: (2011-07-21T20:46:53-07:00) %%BoundingBox: 0 0 640 480 %%HiResBoundingBox: 0 0 640 480 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 640 480 userdict begin DisplayImage 0 0 640 480 12 640 480 1 0 0 102 FFFFFF 000000 A0A0A0 FF0000 00C000 0080FF C000FF 00EEEE C04000 C8C800 4169E1 FFC020 008040 C080FF 306080 8B0000 408000 FF80FF 7FFFD4 A52A2A FFFF00 40E0D0 000000 1A1A1A 333333 4D4D4D 666666 7F7F7F 999999 B3B3B3 C0C0C0 CCCCCC E5E5E5 FFFFFF F03232 90EE90 ADD8E6 F055F0 E0FFFF EEDD82 FFB6C1 AFEEEE FFD700 00FF00 006400 00FF7F 228B22 2E8B57 0000FF 00008B 191970 000080 0000CD 87CEEB 00FFFF FF00FF 00CED1 FF1493 FF7F50 F08080 FF4500 FA8072 E9967A F0E68C BDB76B B8860B F5F5DC A08020 FFA500 EE82EE 9400D3 DDA0DD 905040 556B2F 801400 801414 804014 804080 8060C0 8060FF 808000 FF8040 FFA040 FFA060 FFA070 FFC0C0 FFFF80 FFFFC0 CDB79E F0FFF0 A0B6CD C1FFC1 CDC0B0 7CFF40 A0FF20 BEBEBE DFDFDF 9F9F9F 5F5F5F 1F1F1F 3F3F3F BFBFBF 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000000000000000000000000000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000101000000000101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000101000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000061646301 63641B6000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000616463 0163641B60000000000000000000000000000000000000000000000000000000000000010100 0000000101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101000000000000000000000000 0000000000000000000000000000000000000101000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000006401010101010101010000 0000010100000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000064010101010101010100 0000000000000000000000000000000000000000000000000000000000010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101000000000000000000000000000000000000 0000000000000000000000000101000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000062016361600060651B630000000001010000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000062016361600060651B6300000000000000 0000000000000000000000000000000000000000000000010100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101000000000000000000000000000000000000000000000000 0000000000000101000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000630165000000000000000000000001010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000006301650000000000000000000000000000000000000000 0000000000000000000000000000000000010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000010100000000601B640163641B0000000000000101001B6401641B0000000000 01010000000000601B640163641B000000000000006062640163626500000000006062640163 646100000000000000000000000101001B6401641B0000000000640161000000000061016400 0000000000000000010160000000000000000000000101010101010100000001010061626301 00006562630163626500000000000101006164636364600000000000001B6401646100010100 000000000000000000010160000000000000000000000000006062640163626500000000601B 640163641B000000000000010100000000010100000000010100616463636460000000000000 1B64016461000101000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101000000000101010101010163000000000001011B01010101016200000000010100000000 0001010101010101630000000000610101010101010100000000610101010101010164000000 0000000000000001011B01010101016200000000610164000000000063016100000000000000 0000640164600000000000000000000101010101010100000001011B01010101001B01010101 0101011B0000000001011B01010101010160000000006201010101011B010100000000000000 0000006401646000000000000000000000006101010101010101000000000101010101010163 000000000001010000000001010000000001011B01010101010160000000006201010101011B 0101000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100000000 64616000606564011B0000000001010161606061010165000000010100000000006461600060 6564011B0000006001016265006061640000006001011B6560606163011B0000000000000000 0001010161606061010165000000006301650000006501630000000000000000000065010101 63621B650000000000000101000000000000000101011B600000650101626000606201016500 00000101011B6060616301620000006501016160606101010100000000000000000000650101 0163621B650000000000006001016265006061640000000064616000606564011B0000000001 01000000000101000000000101011B6060616301620000006501016160606101010100000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010100000000000000000000 6001640000000001011B000000001B0164000000010100000000000000000000006001640000 00620162000000000000000000620165000000000060016400000000000000000001011B0000 00001B0164000000001B016200000064011B0000000000000000000000606263010101016365 0000000001010000000000000001011B00000000620162000000000062016200000001016100 00000061016300000064011B000000001B010100000000000000000000006062630101010163 6500000000620162000000000000000000000000000000006001640000000001010000000001 01000000000101610000000061016300000064011B000000001B010100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010100000000606263630101010101000000 0001016000000000600163000000010100000000006062636301010101010000006301600000 0000000000000063010101010101010101010000000000000000000101600000000060016300 0000006001016000600101600000000000000000000000000000606162630101650000000101 0000000000000001016000000000630160000000000060016300000001016000000000600101 0000006301600000000060010100000000000000000000000000006061626301016500000063 0160000000000000000000006062636301010101010000000001010000000001010000000001 0160000000006001010000006301600000000060010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000065010101010101010101000000000101000000 0000000101000000010100000000650101010101010101010000000101000000000000000000 0001010101010101010101010000000000000000000101000000000000010100000000006201 1B00620162000000000000000000000000000000000000001B01640000000101000000000000 0001010000000000010100000000000000010100000001010000000000000101000000010100 000000000001010000000000000000000000000000000000001B016400000001010000000000 0000000000650101010101010101010000000001010000000001010000000001010000000000 0001010000000101000000000000010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000064016265600000000101000000000101600000000060016300 0000010100000000640162656000000001010000006301600000000000000000006301600000 0000000000000000000000000000000101600000000060016300000000006501636001016000 0000000000000000000000000000000000006001010000000101000000000000000101000000 0000630160000000000060016300000001010000000000000101000000630160000000006001 0100000000000000000000000000000000000060010100000063016000000000000000000064 0162656000000001010000000001010000000001010000000001010000000000000101000000 6301600000000060010100000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000101000000010160000000006101010000000001011B000000001B016400000001010000 0000010160000000006101010000006201620000000000000000006201620000000000000000 00000000000000000001011B000000001B016400000000000064016401640000000000000000 0000000000000000000000006501630000000101000000000000000101000000000062016200 000000006201620000000101000000000000010100000064011B000000001B01010000000000 0000000000000000000000000065016300000062016200000000000000000001016000000000 610101000000000101000000000101000000000101000000000000010100000064011B000000 001B010100000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 006301626500601B010101000000000101016160606101016500000001010000000063016265 00601B0101010000006001016265006061640000006001016465600060651B63000000010100 0000000101016160606101016500000000000061010101650000000000000000000000006362 6560000060616301620000006301610000000000000101000000000065010162600060620101 6500000001010000000000000101000000650101616060610101010000000000000000000063 626560000060616301620000006001016265006061640000006301626500601B010101000000 0001010000000001010000000001010000000000000101000000650101616060610101010000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000006101010101 01011B01010000000001011B01010101016200000000010100000000610101010101011B0101 000000006101010101010101000000006563010101010101010100000001010000000001011B 0101010101620000000000000000630163000000000000000000000000000101010101010101 0164000000001B010101010100000001010000000000001B010101010101011B000000000101 0000000000000101000000006201010101011B01010000000000000000000001010101010101 01016400000000006101010101010101000000610101010101011B0101000000000101000000 0001010000000001010000000000000101000000006201010101011B01010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000061640163646100010100 0000000101001B6401641B000000000001010000000000616401636461000101000000000060 6263016362650000000000001B64630163641B600000000101000000000101001B6401641B00 000000000000000064016100000000000000000000000000601B646301016364610000000000 001B630101010000000101000000000000006562630163626500000000000101000000000000 010100000000001B6401641B60016300000000000000000000601B6463010163646100000000 0000006062630163626500000000616401636461000101000000000101000000000101000000 000101000000000000010100000000001B6401641B6001630000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010100000000000000000000000000 0060010100000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000001B01620000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000001B01620000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000010100000000000000000000000000606401620000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000064616000601B 0101650000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000064616000601B0101650000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000010100000000000000000000000001010101600000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010101010101016200000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010101 0101010162000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000010100000000000000000000000001016365000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000656263016364610000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000656263016364610000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000060616263010100000000 0000000000606264016462600000000000000060626401646260000000000000006062640164 6260000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010101010100000000000000006563 0101010101636000000000006563010101010163600000000000656301010101016360000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000063626160010100000000000000006301646500656401 6300000000006301646500656401630000000000630164650065640163000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000650163000000000063016500000065 0163000000000063016500000065016300000000006301650000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000001010000000000000062011B00000000001B016200000062011B00000000 001B016200000062011B00000000001B01620000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000640160000000000060016400000064016000000000006001640000 0064016000000000006001640000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000630160000000000060016300000063016000000000006001630000006301600000 0000006001630000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000001 0100000000000000010100000001010000000000000001010000000101000000000000000101 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000063016000000000 0060016300000063016000000000006001630000006301600000000000600163000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000064016000000000006001640000 0064016000000000006001640000006401600000000000600164000000000000000000000000 0000000000000000010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000062011B00000000001B016200000062011B0000 0000001B016200000062011B00000000001B0162000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000001000000000000000000000000000100000000 0000000000000100000000000000000100000000000000010000000000010000000000010000 0000000100000000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000001000000000000000000000000000100000000 0000000000000001000000000000000001000000000000010000000000000100000000000100 0000000100000000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000000010000000000000000000000000001000000 0000000000000001000000000000000001000000000000000100000000000100000000000100 0000000001000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000010000000000000000000000000001000000 0000000000000000010000000000000000010000000000000100000000000001000000000001 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010000000000000065016300000000006301650000006501630000000000630165 0000006501630000000000630165000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000001000000000000000000000000000100000000000000000000 0100000000000000000100000000000000010000000000010000000000010000000000010000 0000000000000000000000000000000000000000000000000000000000000001000000000000 0000000000000000000000000001000000000000000000000000000100000000000000000000 0001000000000000000001000000000000010000000000000100000000000100000000010000 0000000000000000000000000000000000000000000000000000000000000001000000000000 0000000000000000000000000000010000000000000000000000000001000000000000000000 0001000000000000000001000000000000000100000000000100000000000100000000000100 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000010000000000000000000000000001000000000000000000 0000010000000000000000010000000000000100000000000001000000000001000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000000630164650065640163000000000063016465006564016300000000006301 6465006564016300000000000000000000000000000000000000000001010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101010101010101000000 0000656301010101016360000000000065630101010101636000000000006563010101010163 6000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101010101010101000000000000606264 0164626000000000000000606264016462600000000000000060626401646260000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000606060606060600000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000005000005000005000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000600000000000600000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000050005000500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000060400 0000040600000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010101000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000505050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000060004060600060000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010101000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000005050505050505000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000060000040006060000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000003030505050503000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000060004000404060606000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000005 0005030505050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000060606060606060400060606000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000500000500000503 0505000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000040000000000040004040000060600000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000300000000030305050000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000400000006060000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000003030505000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000004040000000606060000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000303050500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0404000000000606000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000030305050000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000004040000 0000060600000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000003030505000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000400000000000606 0600000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000303050500000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000004040000000000000606000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000030305050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000404000000000000060600000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000003030505000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000040400000000000006060600000606060606060600 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0303050500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000004000000000000000006060600000000000600000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000003030505 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000040400000000000000000606000000000600000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000303050500000500 0005000005000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000004040000000000000600060606000600000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000030305050005000500050000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0404000000000600000000060606060000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000003030505050505000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000004000000 0600000000000600000606060600000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000505050505050500000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000040400060606060606 0600000000000006060606000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000303050505050500000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000004040400000004000000000000 0000000000060606000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000005000500050305050000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000404000400000000000000000000000000 0000060606060000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010101000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0500000500000503030505000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000040000000000000000000000000000000000000000 0606060600000000000006060606060606000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010101000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000030000 0000000303050500000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000004000404000000000000000000000000000000000000000000000606 0606000006000000000006000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000003 0305050000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000400000004040400000000000000000000000000000000000000000000000006060606 0000000006000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000303050500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000004000000 0000040004000000000000000000000000000000000000000000000000000600060600000600 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030305050000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000004 0400000000000000000000000000000000000000000000000600000000000600000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000003030505000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000400000000 0000000000000000000000000000000000000600000000000600000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000303050500000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000004040000000000000000 0000000000000000000000000606060606060600000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000030305050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000404000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000003030505000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000040000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000303050500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000404000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030305050000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000040000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0003030505000005000005000005000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000404000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000030305 0500050005000500000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000040400000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003030505050505 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000400 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000505050505050500000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000004040000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000303050505050300000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000404000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000005000503050505000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000040000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000500000500000500050000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000404000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000300000003030505000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000040004000000000004000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000300050500000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000404040000000400000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0003030005050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000040400040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000030000 0500000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0004000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000303000505000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000500040504000500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000030000050500000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000005000500050000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000606162630101000000000000000000606264016462600000000000000060626401646260 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000303000005000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000400050505000400000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010101 0101000000000000000065630101010101636000000000006563010101010163600000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000030000050500000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000505050505050500000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000063626160010100000000 0000000063016465006564016300000000006301646500656401630000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000300000005050000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000005050505000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010100000000000000650163 0000000000630165000000650163000000000063016500000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000003030000000500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000005 0505000500050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000006061626363016363626160 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000001010000000000000062011B00000000001B 016200000062011B00000000001B016200000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000300000005050000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000050500050000050000 0500000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000065620101010101010101010101626500000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000640160000000000060016400000064 0160000000000060016400000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000303 0000000505000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000505000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000606201016362616060006060616263010162600000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000000000000630160000000000060016300000063016000000000 0060016300000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000030000000005 0500000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000005050000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000010162650000000000000000000000656201010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000010100000000000000010100000001010000000000000001010000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000303000000000500050000 0500000500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000050500000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000064 6000000000000000000000000000000060640000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000630160000000000060016300000063016000000000006001630000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000030000000005050500050005000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000050500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000064 0160000000000060016400000064016000000000006001640000000000000000000000000000 0000000000000101010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000303000000000505050500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000505000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010101010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000062011B00000000 001B016200000062011B00000000001B01620000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000030000050505050505050000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000065016300000000006301650000 0065016300000000006301650000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000303000005050505050000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000505000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000606401636100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000000630164650065640163000000000063016465 0065640163000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030500050005000505000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000005050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000006501640000630101010165000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0001010101010101010000000000656301010101016360000000000065630101010101636000 0000000000000000000000000000000000000000010101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000005 0303050000050000050500000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000005050000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000006201610061016360620162000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000101010101 0101010000000000006062640164626000000000000000606264016462600000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003030303030303 0000000005050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000050500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 6301600062016100650163000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000003030300000000000000 0505000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000505000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100006301 6500000101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000003000003030000000000000005050000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000050000050000050005050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000630160000101000060016300 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000003000000000303000000000000000505000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000050005 0005050500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000064011B610164000065016400000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000030000000000000000050500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000505050500000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000061010101016100001B011B00000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000303000000000000000005050000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000005050505050505000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000001B63631B00000063016000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000030300000000000000000505000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000005050505050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000003030000000000000000050500000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000050500050005000500000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0300000000000000000005050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0505000005000005000005000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000646000000000000000000000000000 0000606400000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000303000000 0000000000000505000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000505000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000010162650000000000000000000000656201010000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030300000000000000 0000050500000500000500000500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000505050000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000060620101631B616060006060611B63010162600000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000003030000000000000000000505 0005000500050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000005050000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000065620101010101010101010101626500000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000300000000000000000000050505050500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000050500000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000006061626363016363626160000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000003030000000000000000050505050505050000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000050500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000303000000000000000005050505050500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000505000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000030300000000000500050005000005050500000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000005050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000003000000050000050000050000000005050000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000005050500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010101000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000003 0300000000030000000000000000000505050000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000050500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010101000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000303000003 0000000000000000000000000505050000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000050000050000050000050500000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030303000000000000 0000000000000000000505050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000500050005000505000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000003030303030303000000000000000000 0000000000000505050000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000005050505050000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000003000303000000000000000000000000000000 0000000505050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000050505050505050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000003000000030303000000000000000000000000000000000000 0505000000000500000500000500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000505050505 0005050500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000003000000000000030303000000000000000000000000000000000005050500 0005000500050000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000005050505050000000000050005000500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001B640101000063016000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000030300000000000000000000000000000000000005050505050500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000050505050500000000000000000005000005000005000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000640101010100001B011B00000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000003030300000000000000000000000000000000050505050505050505000000 0000000000000000000000000000000000000000000000050000050000050000000000000000 0005050505000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000610163600101000065016400000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000003030000000000000000000000000000000005050500000000050505050505050505 0505050000000000000000000000000000000500050005000000000005050505050000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000064016100 0101000060016300000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0303030000000000000000000000000500050005000000000000000000000000000000050505 0505050505050505050000000005050500050505050500000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000063016000010100000001 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000030303 0000000000000000050000050000050000000000000000000000000000000000000000000000 0000000505050505050505050000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001016000010100006001630000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000030300000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0005050500000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000064016500010100006501640000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000003030300000000000003 0000000000000000000000000000000000000000000000000000000000000000050005000500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000062011B000101000064011B0000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000003030300000003000000000000 0000000000000000000000000000000000000000000000000005000005000005000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000060010165010160620163000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000003030003000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000061 0101010101016365000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000003030303030303000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000606263016362 6000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000003030000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000003000303000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0003000000030000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0300000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000303000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0065626301010101010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000650101010101 0101010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000300000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000640164600000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000003030000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010165000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000640160000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000003000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000001B0161000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000001B63616000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0303000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000606301 0101010101010100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000003000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000065010101010101010101 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000062016460000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000303000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000063016500000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000030000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000064016000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000001B016100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000003000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000001B 6361600000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030300000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101010101010101 0101010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0003000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101010101010101010101000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000003000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030300000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000003000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000606162630101000000000000000000606264016462600000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000030000000300000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010101010101000000000000000065630101010101636000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000303000300000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101000000010101010101 0101010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000063626160 0101000000000000000063016465006564016300000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000030300000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101000000010101010101010101010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100000000 0000006501630000000000630165000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000303030303030300000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000001010000000000000062011B 00000000001B0162000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0300030300000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010100000000000000640160000000000060 0164000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000030000000303 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000630160000000000060016300000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000030000000000030300000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000000000000010100000000000000010100000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000003030300000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000630160000000000060016300000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000003030000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000640160000000000060016400000000000000000000000000000000000000000101 0101010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000303000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010101 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000062 011B00000000001B016200000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000030300000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000101000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000065016300000000 0063016500000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000003030300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101010101010101010101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000000630164650065640163000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000003030000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101010101010101010101010101010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000001010101010101010000000000656301010101016360000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000303000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0001010101010101010000000000006062640164626000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000030303000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000003 0300000000000300000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000303000000 0300000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000030300030000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000030303030303030000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000030003030303000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000030000000000030303000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000030000000000000000030303030000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000303030000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000303030300000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000003030300000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000003030303000000000000000003000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030303000000000003000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000030303030003000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000303 0303030303030300000000000000000000000000000000000000000000000000000000030000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000300000000 0003030303030303030303030000000000000000000000000000000000030000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000300000000000000000000 0000000000000303030303030303030303030000000000030000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000300000000000000000000000000000000 0000000000000000000000000303030303030303030000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000030000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000030000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000003 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000100000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000100000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000606162630101000000000000000000000000 0000000000000000000000000100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010101010101000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000636261600101000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101000000000000000000000000000000000000000000000000010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101000000000000000000000000000000000000000000000000010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100000000 0000000000000000000000000000000000000000010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010100000000000000000000 0000000000000000000000000000010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010100000000000000000000000000000000 0000000000000000010000000000000000000000000000000000000000000000000000000000 0000000001000000000000000000000000000000000000000001000000000000000000000000 0001000000000000000000000100000000000000000100000000000000010000000000010000 0000000100000000000100000000000000000000000000000000000000000000000000000000 0000000000010000000000000000000000000000000000000001000000000000000000000000 0001000000000000000000000001000000000000000001000000000000010000000000000100 0000000001000000000100000000000000000000000000000000000000000000000000000000 0000000000010000000000000000000000000000000000000000010000000000000000000000 0000010000000000000000000001000000000000000001000000000000000100000000000100 0000000001000000000001000000000000000000000000000000000000000000000000000000 0000000000000100000000000000000000000000000000000000010000000000000000000000 0000010000000000000000000000010000000000000000010000000000000100000000000001 0000000000010000000001000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000000000000000000000000000000000 0000010000000000000000000000000000000000000000000000000000000000000000000100 0000000000000000000000000000000000000001000000000000000000000000000100000000 0000000000000100000000000000000100000000000000010000000000010000000000010000 0000000100000000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000001000000000000000000000000000100000000 0000000000000001000000000000000001000000000000010000000000000100000000000100 0000000100000000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000000010000000000000000000000000001000000 0000000000000001000000000000000001000000000000000100000000000100000000000100 0000000001000000000000000000000000000000000000000000000000000000000000000000 0100000000000000000000000000000000000000010000000000000000000000000001000000 0000000000000000010000000000000000010000000000000100000000000001000000000001 0000000001000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000000000000000000000000000000000000000000000001010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010101 0101010101010101010101010101010101010101010101010101010101010101010101010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000001010101010101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000001010101010101010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000060616263010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000060616263010100000000000000000060626401646260000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000006061626301010000000000000000006062640164626000000000000000606264016462 6000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000606162 6301010000000000000000006062640164626000000000000000606264016462600000000000 0000606264016462600000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000060616263010100000000 0000000000606264016462600000000000000060626401646260000000000000006062640164 6260000000000000606264016462600000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010101010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010101010100000000000000006563010101010163600000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010101 0101010000000000000000656301010101016360000000000065630101010101636000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010101010101000000 0000000000656301010101016360000000000065630101010101636000000000006563010101 0101636000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010101010100000000000000006563 0101010101636000000000006563010101010163600000000000656301010101016360000000 0065630101010101636000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000063626160010100000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000006362 6160010100000000000000006301646500656401630000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000636261600101000000 0000000000630164650065640163000000000063016465006564016300000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000636261600101000000000000000063 0164650065640163000000000063016465006564016300000000006301646500656401630000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000063626160010100000000000000006301646500656401 6300000000006301646500656401630000000000630164650065640163000000006301646500 6564016300000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000650163000000000063016500000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101000000000000006501 6300000000006301650000006501630000000000630165000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101000000000000006501630000000000 6301650000006501630000000000630165000000650163000000000063016500000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000650163000000000063016500000065 0163000000000063016500000065016300000000006301650000650163000000000063016500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000062 011B00000000001B016200000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000001010000000000000062011B0000000000 1B016200000062011B00000000001B0162000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000001010000000000000062011B00000000001B0162000000 62011B00000000001B016200000062011B00000000001B016200000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000001010000000000000062011B00000000001B016200000062011B00000000 001B016200000062011B00000000001B0162000062011B00000000001B016200000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000064016000000000 0060016400000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000101000000000000006401600000000000600164000000 6401600000000000600164000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000101000000000000006401600000000000600164000000640160000000 0000600164000000640160000000000060016400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010100000000000000640160000000000060016400000064016000000000006001640000 0064016000000000006001640000640160000000000060016400000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000063016000000000006001630000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000101000000000000006301600000000000600163000000630160000000 0000600163000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000101000000000000006301600000000000600163000000630160000000000060016300 0000630160000000000060016300000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010000 0000000000630160000000000060016300000063016000000000006001630000006301600000 0000006001630000630160000000000060016300000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000001010000000000000001010000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000101000000000000000101000000000000000101000000010100000000000000010100 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010100 0000000000000101000000000000000101000000010100000000000000010100000001010000 0000000000010100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010000000000000001 0100000000000000010100000001010000000000000001010000000101000000000000000101 0000010100000000000000010100000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010000000000000063016000000000006001630000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010100 0000000000006301600000000000600163000000630160000000000060016300000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010100000000000000 6301600000000000600163000000630160000000000060016300000063016000000000006001 6300000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010000000000000063016000000000 0060016300000063016000000000006001630000006301600000000000600163000063016000 0000000060016300000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000064016000000000006001640000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010100000000000000 6401600000000000600164000000640160000000000060016400000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010100000000000000640160000000 0000600164000000640160000000000060016400000064016000000000006001640000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000001010000000000000064016000000000006001640000 0064016000000000006001640000006401600000000000600164000064016000000000006001 6400000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101000000000000 0062011B00000000001B01620000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000001010000000000000062011B000000 00001B016200000062011B00000000001B016200000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000001010000000000000062011B00000000001B016200 000062011B00000000001B016200000062011B00000000001B01620000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000062011B00000000001B016200000062011B0000 0000001B016200000062011B00000000001B0162000062011B00000000001B01620000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101000000000000006501630000 0000006301650000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000010100000000000000650163000000000063016500 0000650163000000000063016500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000010100000000000000650163000000000063016500000065016300 0000000063016500000065016300000000006301650000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010000000000000065016300000000006301650000006501630000000000630165 0000006501630000000000630165000065016300000000006301650000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000101000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000101000000000000000063016465006564016300 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000010100000000000000006301646500656401630000000000630164 6500656401630000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000010100000000000000006301646500656401630000000000630164650065640163 0000000000630164650065640163000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 0000000000000000630164650065640163000000000063016465006564016300000000006301 6465006564016300000000630164650065640163000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000101010101010101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000101010101010101000000000065630101010101636000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000010101010101010100000000006563010101010163600000000000656301010101016360 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010101 0101010100000000006563010101010163600000000000656301010101016360000000000065 6301010101016360000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101010101010101000000 0000656301010101016360000000000065630101010101636000000000006563010101010163 6000000000656301010101016360000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000101010101010101000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000101010101010101000000000000606264016462600000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000001010101 0101010100000000000060626401646260000000000000006062640164626000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010101010101010000 0000000060626401646260000000000000006062640164626000000000000000606264016462 6000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101010101010101000000000000606264 0164626000000000000000606264016462600000000000000060626401646260000000000000 6062640164626000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000601B64630163641B60000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000006163 0101010101010101000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000610101646560006065 1B63000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000060630161000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001B016400000000000000000000000000006562630163 6265000000000001010061626301000060626401636461000000000061646301636265000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000640165000000000000000000000000001B010101010101011B000000 0001011B01010101006101010101010101640000001B01010101010101000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000063016000000000000000000000000065010162600060620101650000000101011B60 00006001011B6560606163011B000063011B6000606164000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000101 00000000000000000000000000620162000000000062016200000001011B0000000062016500 0000000060016400006301610000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000006301600000000000 0000000000000063016000000000006001630000000101600000000063010101010101010101 0100001B01010163626100000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000006401650000000000000000000000 0001010000000000000001010000000101000000000001010101010101010101010000006164 0101010163600000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000001B01640000000000000000000000006301600000 0000006001630000000101000000000063016000000000000000000000000000006561630164 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000006063016100000000000000000000006201620000000000620162 0000000101000000000062016200000000000000000000000000000000600101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000006101016465600060651B630000006501016260006062010165000000010100 000000006001016465600060651B630000631B65600065620163000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000061630101010101010101000000001B010101010101011B00000000010100000000000065 6301010101010101010000010101010101010161000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000601B64 630163641B600000000000656263016362650000000000010100000000000000001B64630163 641B600000601B64630163626500000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000001010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000001010000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000616463016364 1B60000000000000000000000000000000000001010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000101010101010101010101 0100000001010000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000001010160000000000000010100000000000000 0000000000000000000000000000006061626301010000000000000000006062640164626000 0000000000000000000000006062640164626000000000000000606264016462600000000000 0000606264016462600000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000064010101010101010100000000 0000000000000000000000000001010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101010101010101010101010000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000001010164000000000000010100000000000000000000000000 0000000000000000000101010101010000000000000000656301010101016360000000000000 0000000000656301010101016360000000000065630101010101636000000000006563010101 0101636000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000062016361600060651B6300000000000000000000 0000000000000001010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000001010101650000000000010100000000000000000000000000000000000000 0000006362616001010000000000000000630164650065640163000000000000000000000063 0164650065640163000000000063016465006564016300000000006301646500656401630000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000006301650000000000000000000000000000000000000000000000 0001010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0001011B01630000000000010100000000000000000000000000000000000000000000000000 0001010000000000000065016300000000006301650000000000000000006501630000000000 6301650000006501630000000000630165000000650163000000000063016500000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101600000000000000000000000006562630163626500000000000101000064 0161000000000061016400000000006062640163646100000000000101006162630100000000 0000000000000000010100000000000000000101000000000101001B6463626500001B640164 6500000000000060626401636461000000000000000000000000000000000000000101006301 6100000000010100000000000000000000000000000000000000000000000000000101000000 0000000062011B00000000001B016200000000000000000062011B00000000001B0162000000 62011B00000000001B016200000062011B00000000001B016200000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 64016460000000000000000000001B010101010101011B000000000101000061016400000000 00640161000000006101010101010101640000000001011B0101010100000000000000000000 00000101000000000000000001010000000001011B0101010101601B01010101016500000000 6101010101010101640000000000000000000000000000000000000101006101636000000001 0100000000000000000000000000000000000000000000000000000101000000000000006401 6000000000006001640000000000000000006401600000000000600164000000640160000000 0000600164000000640160000000000060016400000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000650101016362 1B65000000000065010162600060620101650000000101000060010160000000600101600000 006001011B6560606163011B0000000101011B60000000000000000000000000000001010000 000000000000010100000000010163616065640163636160656401620000006001011B656060 6163011B00000000000000000000000000000000000101000064016200000001010000000001 0101010101010101010101010000000000000000000101000000000000006301600000000000 6001630000000000000000006301600000000000600163000000630160000000000060016300 0000630160000000000060016300000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000030000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000006062630101010163650000 006201620000000000620162000000010100000062011B0000001B0162000000006201650000 00000060016400000001011B0000000000000000000000000000000001010000000000000000 0101000000000101610000006001016100000060016300000062016500000000006001640000 0000000000000000000000000000000101000060010160000001010000000001010101010101 0101010101010000000000000000000101000000000000000101000000000000000101000000 0000000000000101000000000000000101000000010100000000000000010100000001010000 0000000000010100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000030000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000006061626301016500006301600000 0000006001630000000101000000650163000000630165000000006301010101010101010101 0000000101600000000000000000000000000000000001010000000000000000010100000000 0101600000000001016000000000010100000063010101010101010101010000000000000000 0000000000000000000101000000620164000001010000000000000000000000000000000000 0000000000000000000101000000000000006301600000000000600163000000000000000000 6301600000000000600163000000630160000000000060016300000063016000000000006001 6300000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000030000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000001B016400000101000000000000000101 0000000101000000006301650065016300000000000101010101010101010101000000010100 0000000000000000000000000000000001010000000000000000010100000000010100000000 0001010000000000010100000001010101010101010101010000000000000000000000000000 0000000101000000606301610001010000000000000000000000000000000000000000000000 0000000101000000000000006401600000000000600164000000000000000000640160000000 0000600164000000640160000000000060016400000064016000000000006001640000000000 0000000000000000000000000000030303030303030303030303030303030303030303030303 0303030303030303030303030303030303030303030303030303030303030303030303030303 0303030000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000060010100006301600000000000600163000000010100 0000001B01620062011B00000000006301600000000000000000000000010100000000000000 0000000000000000000001010000000000000000010100000000010100000000000101000000 0000010100000063016000000000000000000000000000000000000000000000000000010100 0000006101630001010000000001010101010101010101010101000000000000000000010100 00000000000062011B00000000001B016200000000000000000062011B00000000001B016200 000062011B00000000001B016200000062011B00000000001B01620000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000030000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000065016300006201620000000000620162000000010100000000600101 6001016000000000006201620000000000000000000000010100000000000000000000000000 0000000001010000000000000000010100000000010100000000000101000000000001010000 0062016200000000000000000000000000000000000000000000000000010100000000006301 1B01010000000001010101010101010101010101000000000000000000010100000000000000 6501630000000000630165000000000000000000650163000000000063016500000065016300 0000000063016500000065016300000000006301650000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000003000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000063626560 0000606163016200006501016260006062010165000000010100000000006401640164000000 0000006001016465600060651B63000000010100000000000000000000000000000000000101 0000000000000000010100000000010100000000000101000000000001010000006001016465 600060651B630000000001010000000000000000000000010100000000006501010101000000 0000000000000000000000000000000000000000000000010100000000000000006301646500 6564016300000000010100000000006301646500656401630000000000630164650065640163 0000000000630164650065640163000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000003000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000001010101010101010164 000000001B010101010101011B00000000010100000000006101010161000000000000006563 0101010101010101000000010100000000000000000000000000000000000101000000000000 0000010100000000010100000000000101000000000001010000000065630101010101010101 0000000001010000000000000000000000010100000000000064010101000000000000000000 0000000000000000000000000000010101010101010100000000006563010101010163600000 0000010100000000006563010101010163600000000000656301010101016360000000000065 6301010101016360000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000601B6463010163646100000000000065 62630163626500000000000101000000000000630163000000000000000000001B6463016364 1B60000000010100000000000000000000000000000000000101000000000000000001010000 0000010100000000000101000000000001010000000000001B64630163641B6000000065011B 0000000000000000000000010100000000000060010101000000000000000000000000000000 00000000000000000101010101010101000000000000606264016462600000000065011B0000 0000000060626401646260000000000000006062640164626000000000000000606264016462 6000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000001B6300000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000001B63000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000636500000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000006365000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000001010000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000001010000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000006164630163641B6000000000 0000000000000000000000000001010000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000101010101010101010101010000000101 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000001010160000000000000010100000000000000000000000000 0000000000000000006061626301010000000000000000006062640164626000000000000060 6264016462600000000000000000000000000000606264016462600000000000000060626401 6462600000000000006062640164626000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000064010101010101010100000000000000000000 0000000000000001010000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000101010101010101010101010000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000001010164000000000000010100000000000000000000000000000000000000 0000000101010101010000000000000000656301010101016360000000006563010101010163 6000000000000000000000000065630101010101636000000000006563010101010163600000 0000656301010101016360000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000062016361600060651B6300000000000000000000000000000000 0001010000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0001010101650000000000010100000000000000000000000000000000000000000000636261 6001010000000000000000630164650065640163000000006301646500656401630000000000 0000000000000063016465006564016300000000006301646500656401630000000063016465 0065640163000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000006301650000000000000000000000000000000000000000000000000101000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000010100000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000001011B0163 0000000000010100000000000000000000000000000000000000000000000000000101000000 0000000065016300000000006301650000650163000000000063016500000000000000000000 6501630000000000630165000000650163000000000063016500006501630000000000630165 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0101600000000000000000000000006562630163626500000000000101000064016100000000 0061016400000000006062640163646100000000000101006162630100000000000000000000 0000010100000000000000000101000000000101001B6463626500001B640164650000000000 0060626401636461000000000000000000000000000000000000000101006301610000000001 0100000000000000000000000000000000000000000000000000000101000000000000006201 1B00000000001B0162000062011B00000000001B01620000000000000000000062011B000000 00001B016200000062011B00000000001B0162000062011B00000000001B0162000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000640164600000 00000000000000001B010101010101011B000000000101000061016400000000006401610000 00006101010101010101640000000001011B0101010100000000000000000000000001010000 00000000000001010000000001011B0101010101601B01010101016500000000610101010101 0101640000000000000000000000000000000000000101006101636000000001010000000000 0000000000000000000000000000000000000000000101000000000000006401600000000000 6001640000640160000000000060016400000000000000000000640160000000000060016400 0000640160000000000060016400006401600000000000600164000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000006501010163621B6500000000 0065010162600060620101650000000101000060010160000000600101600000006001011B65 60606163011B0000000101011B60000000000000000000000000000001010000000000000000 010100000000010163616065640163636160656401620000006001011B6560606163011B0000 0000000000000000000000000000000101000064016200000001010000000001010101010101 0101010101010000000000000000000101000000000000006301600000000000600163000063 0160000000000060016300000000000000000000630160000000000060016300000063016000 0000000060016300006301600000000000600163000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000004000000000004 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000006062630101010163650000006201620000 000000620162000000010100000062011B0000001B0162000000006201650000000000600164 00000001011B0000000000000000000000000000000001010000000000000000010100000000 0101610000006001016100000060016300000062016500000000006001640000000000000000 0000000000000000000101000060010160000001010000000001010101010101010101010101 0000000000000000000101000000000000000101000000000000000101000001010000000000 0000010100000000000000000000010100000000000000010100000001010000000000000001 0100000101000000000000000101000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000040000000400000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000006061626301016500006301600000000000600163 0000000101000000650163000000630165000000006301010101010101010101000000010160 0000000000000000000000000000000001010000000000000000010100000000010160000000 0001016000000000010100000063010101010101010101010000000000000000000000000000 0000000101000000620164000001010000000000000000000000000000000000000000000000 0000000101000000000000006301600000000000600163000063016000000000006001630000 0000000000000000630160000000000060016300000063016000000000006001630000630160 0000000000600163000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000400040000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000001B016400000101000000000000000101000000010100 0000006301650065016300000000000101010101010101010101000000010100000000000000 0000000000000000000001010000000000000000010100000000010100000000000101000000 0000010100000001010101010101010101010000000000000000000000000000000000010100 0000606301610001010000000000000000000000000000000000000000000000000000010100 0000000000006401600000000000600164000064016000000000006001640000000000000000 0000640160000000000060016400000064016000000000006001640000640160000000000060 0164000000000000000000000000000000000000000004040404040404040404040404040404 0404040404040404040404040404040404040404040404040404040404040404040404040404 0404040404040404040404000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000600101000063016000000000006001630000000101000000001B0162 0062011B00000000006301600000000000000000000000010100000000000000000000000000 0000000001010000000000000000010100000000010100000000000101000000000001010000 0063016000000000000000000000000000000000000000000000000000010100000000610163 0001010000000001010101010101010101010101000000000000000000010100000000000000 62011B00000000001B0162000062011B00000000001B01620000000000000000000062011B00 000000001B016200000062011B00000000001B0162000062011B00000000001B016200000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000400040000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000065016300006201620000000000620162000000010100000000600101600101600000 0000006201620000000000000000000000010100000000000000000000000000000000000101 0000000000000000010100000000010100000000000101000000000001010000006201620000 00000000000000000000000000000000000000000000000101000000000063011B0101000000 0001010101010101010101010101000000000000000000010100000000000000650163000000 0000630165000065016300000000006301650000000000000000000065016300000000006301 6500000065016300000000006301650000650163000000000063016500000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000040000000400000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000063626560000060616301 6200006501016260006062010165000000010100000000006401640164000000000000600101 6465600060651B63000000010100000000000000000000000000000000000101000000000000 0000010100000000010100000000000101000000000001010000006001016465600060651B63 0000000001010000000000000000000000010100000000006501010101000000000000000000 0000000000000000000000000000000000010100000000000000006301646500656401630000 0000630164650065640163000000000001010000000000630164650065640163000000000063 0164650065640163000000006301646500656401630000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000400000000 0004000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000001010101010101010164000000001B01 0101010101011B00000000010100000000006101010161000000000000006563010101010101 0101000000010100000000000000000000000000000000000101000000000000000001010000 0000010100000000000101000000000001010000000065630101010101010101000000000101 0000000000000000000000010100000000000064010101000000000000000000000000000000 0000000000000000010101010101010100000000006563010101010163600000000065630101 0101016360000000000001010000000000656301010101016360000000000065630101010101 6360000000006563010101010163600000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000601B6463010163646100000000000065626301636265 00000000000101000000000000630163000000000000000000001B64630163641B6000000001 0100000000000000000000000000000000000101000000000000000001010000000001010000 0000000101000000000001010000000000001B64630163641B6000000065011B000000000000 0000000000010100000000000060010101000000000000000000000000000000000000000000 0000010101010101010100000000000060626401646260000000000000606264016462600000 00000065011B0000000000006062640164626000000000000000606264016462600000000000 0060626401646260000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000001B6300000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000001B6300 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000636500000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000636500000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000010100000000 0001010000000000000000000000000000000000000000000000010100000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000063016500000000 6001010165000000006501630000000000000000000000000000010100000000000101000000 0000000000010101010101010101010101000000010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000010101 6000000000000001010000000000000000000000000000000000000000000060616263010100 0000000000000000606264016462600000000000000000000000000060626401646260000000 0000000060626401646260000000000000006062640164626000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000062011B00000000610101011B00 0000001B01620000000000000000000000000000010100000000000101000000000000000001 0101010101010101010101000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010101640000000000 0001010000000000000000000000000000000000000000000001010101010100000000000000 0065630101010101636000000000000000000000006563010101010163600000000000656301 0101010163600000000000656301010101016360000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000061016400000000620164016400000000640161 0000000000000000000000000000010100000000000101000000000000000000000000000101 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010101016500000000000101000000 0000000000000000000000000000000000000063626160010100000000000000006301646500 6564016300000000000000000000006301646500656401630000000000630164650065640163 0000000000630164650065640163000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000060016300000000630165016300000000630160000000000000 0000000000000000010100000000000101000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000001011B016300000000000101000000000000000000 0000000000000000000000000000000000010100000000000000650163000000000063016500 0000000000000000650163000000000063016500000065016300000000006301650000006501 6300000000006301650000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000063016500006001630063016000006501630000601B640163641B00000000 0000010100000000000101000000000000000000000000000101000000000000000001010000 00000101001B6463626500001B64016465000000000000006062640163646100000000000000 0000000000000000000000010100630161000000000101000000000000000000000000000000 000000000000000000000001010000000000000062011B00000000001B016200000000000000 000062011B00000000001B016200000062011B00000000001B016200000062011B0000000000 1B01620000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000062011B00006101620062016100001B016200000101010101010163000000000001010000 0000000101000000000000000000000000000101000000000000000001010000000001011B01 01010101601B0101010101650000000000610101010101010164000000000000000000000000 0000000000010100610163600000000101000000000000000000000000000000000000000000 0000000000010100000000000000640160000000000060016400000000000000000064016000 0000000060016400000064016000000000006001640000006401600000000000600164000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000061016400 00620161006101620000640161000064616000606564011B0000000001010000000000010100 0000000000000000000000000101000000000000000001010000000001016361606564016363 616065640162000000006001011B6560606163011B0000000000000000000000000000000001 0100006401620000000101000000000101010101010101010101010100000000000000000001 0100000000000000630160000000000060016300000000000000000063016000000000006001 6300000063016000000000006001630000006301600000000000600163000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0005000005000005000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000060016300006301600060 0163000063016000000000000000006001640000000001010000000000010100000000000000 0000000000000101000000000000000001010000000001016100000060010161000000600163 0000000062016500000000006001640000000000000000000000000000000001010000600101 6000000101000000000101010101010101010101010100000000000000000001010000000000 0000010100000000000000010100000000000000000001010000000000000001010000000101 0000000000000001010000000101000000000000000101000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000005000500 0500000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000630165600163000000630160650163 0000006062636301010101010000000001010000000000010100000000000000000000000000 0101000000000000000001010000000001016000000000010160000000000101000000006301 0101010101010101010000000000000000000000000000000001010000006201640000010100 0000000000000000000000000000000000000000000000000001010000000000000063016000 0000000060016300000000000000000063016000000000006001630000006301600000000000 6001630000006301600000000000600163000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000050505000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000062011B6101620000006201611B0162000065010101 0101010101010000000001010000000000010100000000000000000000000000010100000000 0000000001010000000001010000000000010100000000000101000000000101010101010101 0101010000000000000000000000000000000001010000006063016100010100000000000000 0000000000000000000000000000000000000001010000000000000064016000000000006001 6400000000000000000064016000000000006001640000006401600000000000600164000000 6401600000000000600164000000000000000000000000000000000000000505050505050505 0505050505050505050505050505050505050505050505050505050505050505050505050505 0505050505050505050505050505050505050500000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000610164620161000000610162640161000064016265600000000101 0000000001010000000000010100000000000000000000000000010100000000000000000101 0000000001010000000000010100000000000101000000006301600000000000000000000000 0000000000000000000000000001010000000061016300010100000000010101010101010101 0101010100000000000000000001010000000000000062011B00000000001B01620000000000 0000000062011B00000000001B016200000062011B00000000001B016200000062011B000000 00001B0162000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000050505000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000600163630160000000600163630160000001016000000000610101000000000101 0000000000010100000000000000000000000000010100000000000000000101000000000101 0000000000010100000000000101000000006201620000000000000000000000000000000000 000000000000000101000000000063011B010100000000010101010101010101010101010000 0000000000000001010000000000000065016300000000006301650000000000000000006501 6300000000006301650000006501630000000000630165000000650163000000000063016500 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000005000500050000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 630101630000000000630101630000006301626500601B010101000000000101000000000001 0100000000000000000000000000010100000000000000000101000000000101000000000001 0100000000000101000000006001016465600060651B63000000010100000000000000000000 0001010000000000650101010100000000000000000000000000000000000000000000000000 0001010000000000000000630164650065640163000000000001010000000063016465006564 0163000000000063016465006564016300000000006301646500656401630000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000500000500000500000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000620101620000 00000064010162000000610101010101011B0101000000000101000000000001010000000000 0000000000000000010100000000000000000101000000000101000000000001010000000000 0101000000000065630101010101010101000000010100000000000000000000000101000000 0000006401010100000000000000000000000000000000000000000000000101010101010101 0000000000656301010101016360000000000001010000000065630101010101636000000000 0065630101010101636000000000006563010101010163600000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000006101016100000000001B0101 6100000000616401636461000101000000000101000000000001010000000000000000000000 0000010100000000000000000101000000000101000000000001010000000000010100000000 0000001B64630163641B60000065011B00000000000000000000000101000000000000600101 0100000000000000000000000000000000000000000000000101010101010101000000000000 60626401646260000000000065011B0000000000606264016462600000000000000060626401 6462600000000000000060626401646260000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000001B630000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000001B63000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0063650000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 6365000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000010100000000000101000000 0000000000000000000000000000000000000000010100000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000063016500000000600101016500 0000006501630000000000000000000000000000010100000000000101000000000000000001 0101010101010101010101000000010100000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000010101600000000000 0001010000000000000000000000000000000000000000000060616263010100000000000000 0000606264016462600000000000000060626401646260000000000000000000000000006062 6401646260000000000000006062640164626000000000000000606264016462600000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000062011B00000000610101011B000000001B0162 0000000000000000000000000000010100000000000101000000000000000001010101010101 0101010101000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000010101640000000000000101000000 0000000000000000000000000000000000000001010101010100000000000000006563010101 0101636000000000006563010101010163600000000000000000000000656301010101016360 0000000000656301010101016360000000000065630101010101636000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000061016400000000620164016400000000640161000000000000 0000000000000000010100000000000101000000000000000000000000000101000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000010101016500000000000101000000000000000000 0000000000000000000000000063626160010100000000000000006301646500656401630000 0000006301646500656401630000000000000000000000630164650065640163000000000063 0164650065640163000000000063016465006564016300000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000060016300000000630165016300000000630160000000000000000000000000 0000010100000000000101000000000000000000000000000101000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000001011B016300000000000101000000000000000000000000000000 0000000000000000000000010100000000000000650163000000000063016500000065016300 0000000063016500000000000000000065016300000000006301650000006501630000000000 6301650000006501630000000000630165000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000063016500006001630063016000006501630000601B640163641B00000000000001010000 000000010100000000000000000000000000010100000000000000000101000000000101001B 6463626500001B64016465000000000000006062640163646100000000000000000000000000 0000000000010100630161000000000101000000000000000000000000000000000000000000 000000000001010000000000000062011B00000000001B016200000062011B00000000001B01 6200000000000000000062011B00000000001B016200000062011B00000000001B0162000000 62011B00000000001B0162000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000062011B00 006101620062016100001B016200000101010101010163000000000001010000000000010100 0000000000000000000000000101000000000000000001010000000001011B0101010101601B 0101010101650000000000610101010101010164000000000000000000000000000000000001 0100610163600000000101000000000000000000000000000000000000000000000000000001 0100000000000000640160000000000060016400000064016000000000006001640000000000 0000000064016000000000006001640000006401600000000000600164000000640160000000 0000600164000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000061016400006201610061 01620000640161000064616000606564011B0000000001010000000000010100000000000000 0000000000000101000000000000000001010000000001016361606564016363616065640162 000000006001011B6560606163011B0000000000000000000000000000000001010000640162 0000000101000000000101010101010101010101010100000000000000000001010000000000 0000630160000000000060016300000063016000000000006001630000000000000000006301 6000000000006001630000006301600000000000600163000000630160000000000060016300 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000606060606060600000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000060016300006301600060016300006301 6000000000000000006001640000000001010000000000010100000000000000000000000000 0101000000000000000001010000000001016100000060010161000000600163000000006201 6500000000006001640000000000000000000000000000000001010000600101600000010100 0000000101010101010101010101010100000000000000000001010000000000000001010000 0000000000010100000001010000000000000001010000000000000000000101000000000000 0001010000000101000000000000000101000000010100000000000000010100000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000600000000000600000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000630165600163000000630160650163000000606263 6301010101010000000001010000000000010100000000000000000000000000010100000000 0000000001010000000001016000000000010160000000000101000000006301010101010101 0101010000000000000000000000000000000001010000006201640000010100000000000000 0000000000000000000000000000000000000001010000000000000063016000000000006001 6300000063016000000000006001630000000000000000006301600000000000600163000000 6301600000000000600163000000630160000000000060016300000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000060000 0000000600000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000062011B6101620000006201611B0162000065010101010101010101 0000000001010000000000010100000000000000000000000000010100000000000000000101 0000000001010000000000010100000000000101000000000101010101010101010101000000 0000000000000000000000000001010000006063016100010100000000000000000000000000 0000000000000000000000000001010000000000000064016000000000006001640000006401 6000000000006001640000000000000000006401600000000000600164000000640160000000 0000600164000000640160000000000060016400000000000000000000000000000000000000 0606060606060606060606060606060606060606060606060606060606060606060606060606 0606060606060606060606060606060606060606060606060606060000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000610164620161000000610162640161000064016265600000000101000000000101 0000000000010100000000000000000000000000010100000000000000000101000000000101 0000000000010100000000000101000000006301600000000000000000000000000000000000 0000000000000001010000000061016300010100000000010101010101010101010101010000 0000000000000001010000000000000062011B00000000001B016200000062011B0000000000 1B016200000000000000000062011B00000000001B016200000062011B00000000001B016200 000062011B00000000001B016200000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000060000000000060000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000060 0163630160000000600163630160000001016000000000610101000000000101000000000001 0100000000000000000000000000010100000000000000000101000000000101000000000001 0100000000000101000000006201620000000000000000000000000000000000000000000000 000101000000000063011B010100000000010101010101010101010101010000000000000000 0001010000000000000065016300000000006301650000006501630000000000630165000000 0000000000006501630000000000630165000000650163000000000063016500000065016300 0000000063016500000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000060000000000060000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000630101630000 000000630101630000006301626500601B010101000000000101000000000001010000000000 0000000000000000010100000000000000000101000000000101000000000001010000000000 0101000000006001016465600060651B63000000010100000000000000000000000101000000 0000650101010100000000000000000000000000000000000000000000000000000101000000 0000000000630164650065640163000000000063016465006564016300000000010100000000 0063016465006564016300000000006301646500656401630000000000630164650065640163 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000060606060606060000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000620101620000000000640101 62000000610101010101011B0101000000000101000000000001010000000000000000000000 0000010100000000000000000101000000000101000000000001010000000000010100000000 0065630101010101010101000000010100000000000000000000000101000000000000640101 0100000000000000000000000000000000000000000000000101010101010101000000000065 6301010101016360000000000065630101010101636000000000010100000000006563010101 0101636000000000006563010101010163600000000000656301010101016360000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000006101016100000000001B0101610000000061 6401636461000101000000000101000000000001010000000000000000000000000001010000 00000000000001010000000001010000000000010100000000000101000000000000001B6463 0163641B60000065011B00000000000000000000000101000000000000600101010000000000 0000000000000000000000000000000000000101010101010101000000000000606264016462 6000000000000000606264016462600000000065011B00000000000060626401646260000000 0000000060626401646260000000000000006062640164626000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 001B630000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000001B630000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000006365000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000063650000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000 end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/image3_crop.eps0000644000175000017500000256246412662210372016461 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image3_crop.eps) %%CreationDate: (2011-07-20T14:56:57-07:00) %%BoundingBox: 0 0 577 202 %%HiResBoundingBox: 0 0 576.928 202 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 577 202 userdict begin DisplayImage 0 0 576.928 201.975 12 577 202 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2ADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADAD7A7A7AA6A6A6ADADADADADADADADADADADADADADADADADADADADADADADADADADAD 959595949494ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADE4E4E4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A3ADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADAD797979ADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADAD888888ADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADAAAAAAC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD565656ADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADA8A8A8DADADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFE919191ADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADA5A5A5ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD5F5F5F ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADFDFDFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3ADADADADADADADADADADADADADADADADADAD ADADADADADADADADADAAAAAA515151ADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADB0B0B0ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBBADADADADADAD ADADADADADADADADADADADADADADADADADADADADADA6A6A6595959ADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADB1B1B1ADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADC2C2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E3E3E3A7A7A7ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA3A3A3 ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAFAFAFADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADCACACAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADAD949494808080ADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADAEAEAEADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADD3D3D3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5ADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADA5A5A5ADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADAD7C7C7CADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADB7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBDADADAD ADADADADADADADADADADADADADADADADADADADADADADADADA6A6A6585858ADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADB1B1B1ADADADADADADADADADADADADADADAD ADADADADADADADADADADADADADADADC0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB5B5B5AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA1A1A1 666666AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE7E7E7EAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEC9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAE9898987B7B7BAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEB0B0B0AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE 919191FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2231D1548341B48341B48341B 48341B48341B48341B48341B48341B48341B3023120D0803412D1448341B48341B48341B48341B 48341B48341B48341B48341B3B2B16080501422C1348341B48341B48341B48341B48341B48341B 48341B48341B45321A000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C9C9C 292929414141414141414141414141414141414141414141414141414141181818111111373838 4141414141414141414141414141414141414141414141412F30300808083A3B3B414141414141 4141414141414141414141414141414141413E3F3F000000161616FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF818181323232414141414141414141414141414141414141414141414141 4141412020201819193C3D3D414141414141414141414141414141414141414141414141191A1A 0D0D0D2E2F2F4141414141414141414141414141414141414141414141413D3D3D0000004D4D4D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6868683B3B3C414141414141414141414141 4141414141414141414141414141410C0C0C000000393939414141414141414141414141414141 4141414141414141412323231010103D3D3D414141414141414141414141414141414141414141 4141412D2D2D000000343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9635E5800000048341B 48341B48341B48341B48341B48341B48341B48341B46331A150F0635220C47331B48341B48341B 48341B48341B48341B48341B48341B48341B040301010000402E1648341B48341B48341B48341B 48341B48341B48341B48341B20170C0000007B7B7BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F2F2F25252520000004141414141414141414141414141414141414141414141413E3E3E0D0D0D 3333344141414141414141414141414141414141414141414141414141410606060000003D3D3E 4141414141414141414141414141414141414141414141411010100000009F9F9FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE3E3E31F1F1F454545414141414141414141414141414141414141 4141414141413B3B3C0F0F0F000000414141414141414141414141414141414141414141414141 404040090909000000404040414141414141414141414141414141414141414141414141010101 000000C2C2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD353535323233414141414141 414141414141414141414141414141414141363737070707353535414141414141414141414141 4141414141414141414141413B3C3C0C0C0C000000414141414141414141414141414141414141 414141414141414141000000000000E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA67625D000000 47331B48341B48341B48341B48341B48341B48341B48341B47331A0B070200000045311948341B 48341B48341B48341B48341B48341B48341B48341B0302011E130644301748341B48341B48341B 48341B48341B48341B48341B48341B22190D000000727272FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF4F4F45555560000004141414141414141414141414141414141414141414141413E3E3E 0F0F0F323333414141414141414141414141414141414141414141414141414141060606000000 3C3C3C414141414141414141414141414141414141414141414141131313000000979797FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEB494949000000404040404040404040404040404040 4040404040404040403A3A3B09090A353535404040404040404040404040404040404040404040 4040403F3F3F1314140000003E3F3F404040404040404040404040404040404040404040404040 050505000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E13B3B3B313131404040 404040404040404040404040404040404040404040363737070707353535404040404040404040 4040404040404040404040404040403B3C3C0B0B0B0000003F3F40404040404040404040404040 404040404040404040404040292929000000F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2 130F0BBC7B2ADD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032925F21090602B07328 DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032B375280B0703794F1BDD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD9032D98D314832162F1E09201D18FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9C9C9C161616B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C46B6B6D0A0A0AA8A9ABC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48B8C8D 070708828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC3333332F3030 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181202021B7B8BAC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555657101010B3B4B6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47777790707088D8E8FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4B2B3B5262626383939565656FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6868682D2D2D BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C44040411B1B1BB2B3B5C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4636364090909A5A6A8C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A9AAAC1818183E3E3F757576FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F7F7F7403D39513719DB8E31DD9032DD9032DD9032DD9032DD9032DD9032DD9032D98D312A1C0A 38240DDC8F31DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032483011170F05C6812C DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032AC7027110C0734210AA3A3A3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEFEFEF2D2D2D595A5AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4B9BABC191919434444C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C42C2C2C212121B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488888A 0F0F10222223BDBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E31F1F1F6C6D6EC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4AFB0B2101010595A5BC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BDBEC01E1E1E303030BBBCBEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4777879131313141415D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5 1515157E7E80C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A1A2A40B0B0B6F6F70 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B6B7B9141414414142BFC0C2C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46566671B1B1B030303F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF8F8F845423F4C3518DA8E31DD9032DD9032DD9032DD9032DD9032DD9032DD9032DA8E31 2C1D0A36230CD68C30DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD90324E3212140D04 CF862EDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032AF7227110C073722099D9D9D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1313131545556C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4BABBBD1C1C1C3F3F40C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C43030311E1E1FB3B4B6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 8C8C8E0F0F0F252526B7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6E6E6222222686869C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B2B3B5131313535354C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C22121222B2C2CBABBBDC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C47C7D7E111111181818D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D9D9D9171717797A7BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A70C0C0C 6B6B6CC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1616163D3D3EBEBFC1 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46A6B6C181819010101EDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB2B2B2130F0BB07328DD9032DD9032DD9032DD9032DD9032DD9032DD9032 DD90329B6522090602A66C25DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032C07D2B 0B07037A4F1BDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032D98D3148321637230A 8E4E00221E19FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C9C9C161616A6A7A9C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6B6D0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C49696980707087D7E7FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BDBEC03333333A3A3B68696B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181202021 AFB0B2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4585859101010A9AAACC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47777790707088D8E8FC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B8B9BB2626264646475A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6868682D2D2DB7B8BAC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 4040411B1B1BB2B3B5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4646566090909 9B9B9DC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A9AAAC1818185555574B4C4D 757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7403D39513719DB8E31DD9032DD9032DD9032DD9032DD9032 DD9032DD9032DC8F312A1C0A38240DD78C30DD9032DD9032DD9032DD9032DD9032DD9032DD9032 DD9032483011170F05C6812CDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032AC7027 110C077B430041290CA3A3A3FFFFFFFFFFFFFFFFFFFFFFFFEFEFEF2D2D2D595A5AC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC0191919434444C0C1C3C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C42C2C2C212121B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C488888A0F0F107172732B2B2CBDBDBDFFFFFFFFFFFFFFFFFFFFFFFFECECEC 1F1F1F6C6D6EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4AFB0B21010105A5A5B C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC01E1E1E303030BBBCBEC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47778791313137A7B7C1B1B1BD8D8D8FFFFFF FFFFFFFFFFFFFFFFFFD5D5D51515157E7E80C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4ABACAE0B0B0B6F7071C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B6B7B9 141414414142BFC0C2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46566671B1B1B 818284080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F845423F4C3518DA8E31DD9032DD9032DD9032DD9032 DD9032DD9032DD9032DA8E312C1D0A36230CD68C30DD9032DD9032DD9032DD9032DD9032DD9032 DD9032DD90324E3212140D04C37F2CDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032 AF7227110C07784200442A0B9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1313131545556C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC01C1C1C3F3F40BFC0C2C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43030311E1E1FB3B4B6C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C48C8C8E0F0F0F6F6F712E2F2FB7B7B7FFFFFFFFFFFFFFFFFFFFFFFF E6E6E6222222686869C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC131313 535354C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C22121222B2C2CBABBBD C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47C7D7E11111178797B1F1F1FD2D2D2 FFFFFFFFFFFFFFFFFFFFFFFFD9D9D9171717797A7BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4AFB0B10C0C0C6B6B6CC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 B7B8BA1616163D3D3EBEBFC1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46A6B6C 1818197F80820C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6000000573A1762421A62421A62421A 62421A62421A62421A62421A62421A5E3E19000000513512603E155E3D155F3E1762421A62421A 62421A62421A62421A604019000000462D0F603E155F3E155F3E1762421A62421A62421A62421A 62421A5F40190000004A2F0EA75C00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFFDBDBDB000000 4F50515657585657585657585657585657585657585657585657583030310000004A4B4C545555 525354545555565758565758565758565758565758525253000000424343545555525354545455 56575856575856575856575856575856575868696A3A3A3B8D8E90696A6B3B3B3BFFFFFFFFFFFF FFFFFFFFFFFFB9B9B9000000525253565758565758565758565758565758565758565758565758 4646460000004D4E4F545555525354555556565758565758565758565758565758242425000000 4748495455555253545455555657585657585657585657585657585656576E6E6F4646478F9092 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFFAFAFAF0E0E0E545455565758565758565758565758 5657585657585657585657580B0B0B2E2E2F515152545555525253555556565758565758565758 5657585657584E4E4F0000004A4A4B545555525253555556565758565758565758565758565758 3F3F3F00000058595A8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F80000002D1F0F62421A62421A 62421A62421A62421A62421A62421A62421A62421A402A101B12065E3D14603E155D3C1562411A 62421A62421A62421A62421A62421A0C08020503015B3B14603E155D3D1561411962421A62421A 62421A62421A62421A30200D0B08047E4500AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFEFEFEF 0000001B1B1B565758565758565758565758565758565758565758565758565758373838282829 545555545555515152565758565758565758565758565758565758050505353535515152545555 5151525657585657585657585657585657585657581D1E1E1515157273758F90922B2B2CBDBDBD FFFFFFFFFFFFFFFFFFFDFDFD000000414242565758565758565758565758565758565758565758 5657584F4F4F000000151515545555545455525253565758565758565758565758565758565758 0202022D2D2E535354545455515253565758565758565758565758565758565758181818191919 7B7C7E8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFD4D4D4000000464747565758565758565758 5657585657585657585657585657585455560000003E3E3F545555535455525354565758565758 565758565758565758505152000000222323545555545455525253565758565758565758565758 5657585657581010102121228283858F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02020231231161411A 62421A62421A62421A62421A62421A62421A62421A62421A04020031200B5E3D14603E155D3C15 61411A62421A62421A62421A62421A62421A180F040000005A3A13603E155D3D1561411962421A 62421A62421A62421A62421A34230E0705037C4400AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFF F1F1F10000001E1E1E565758565758565758565758565758565758565758565758565758383939 242425535355545555515152565758565758565758565758565758565758070707303031515152 5455555151525657585657585657585657585657585657581F1F1F1313137172738F90922E2F2F B7B7B7FFFFFFFFFFFFFFFFFFE6E6E6000000424242565758565758565758565758565758565758 565758565758555657313131363637545555545455515253565758565758565758565758565758 5657580F0F0F2E2E2E525354545555515152565758565758565758565758565758565758191919 1717177A7B7C8F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFD9D9D9000000454647565758565758 5657585657585657585657585657585657585556570000003D3D3E545555535455525253565758 565758565758565758565758545455000000252525535455545455525253565758565758565758 5657585657585657585556561516167F80828F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777675 4B29007540007540007540007540007540007540007540007540007540003A1F00000000754000 754000754000754000754000754000754000754000754000552F00000000754000754000754000 7540007540007540007540007540007540007540000201009D5600AB5E00904F00221E19FFFFFF FFFFFFFFFFFFFFFFFF4949494F5050626264626264626264626264626264626264626264626264 6262642425254444456262646262646262646262646262646262646262646262646262643A3B3C 0000006262646262646262646262646262646262646262646262646262646161620000008D8E90 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF1D1D1D555556626264626264626264626264 626264626264626264626264626264161617515253626264626264626264626264626264626264 6262646262646262642F2F2F010101626264626264626264626264626264626264626264626264 6262645C5D5E0000008F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF0000005A5A5B 6262646262646262646262646262646262646262646262646262640B0B0B575758626264626264 6262646262646262646262646262646262646262642324243F3F40626264626264626264626264 6262646262646262646262646262645758592020218F90928F90924B4C4D757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000754000754000754000754000754000754000754000754000754000754000000000 713E00754000754000754000754000754000754000754000754000754000120A01653701754000 754000754000754000754000754000754000754000754000603401452908AB5E00AB5E0041290C A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4000000626264626264626264626264626264626264626264 6262646262645E5E60000000626264626264626264626264626264626264626264626264626264 62626404040459595A626264626264626264626264626264626264626264626264626264444445 4848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA000000626264626264626264 626264626264626264626264626264626264545456000000626264626264626264626264626264 6262646262646262646262646262640000005E5E5F626264626264626264626264626264626264 6262646262646262643435355657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF 000000626264626264626264626264626264626264626264626264626264494A4B000000626264 626264626264626264626264626264626264626264626264616163000000626264626264626264 6262646262646262646262646262646262646262642324246666688F90928F9092080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000743F00754000754000754000754000754000754000754000754000754000 000000703D00754000754000754000754000754000754000754000754000754000120A01623601 754000754000754000754000754000754000754000754000754000613501412809AB5E00AB5E00 442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA000000626264626264626264626264626264626264 626264626264626264616163000000616263626264626264626264626264626264626264626264 62626462626407070758595A626264626264626264626264626264626264626264626264626264 4747484546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0000000626264626264 626264626264626264626264626264626264626264565658000000626264626264626264626264 6262646262646262646262646262646262640000005C5D5E626264626264626264626264626264 6262646262646262646262643838395354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF B5B5B50000006262646262646262646262646262646262646262646262646262644C4C4E000000 626264626264626264626264626264626264626264626264626264626264000000616263626264 6262646262646262646262646262646262646262646262642020215E5F608F90928F90920C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501 D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D57501 8D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04 9D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF3F3F3F 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262626737475B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF252526939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B519191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F9092 8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501070400C56C00D57501D57501D57501D57501D57501D57501D57501 D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501D57501D57501 7E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFF CACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F90928F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434 6666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501 D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501 D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501 D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFF FFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA0 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3737386263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501 D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501 D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501 D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501 D57501D57501D57501D57501D57501D57501D575011F1102935100D57501D57501D57501D57501 D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFF FFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F9092 2B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302 CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501 D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501 D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFF FFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121313 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F9092 8F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00 221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102 935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500472B08AB5E00 AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092 080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501 D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D57501 2113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501834801432909 AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F9092 8F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501 D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501 D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501 D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501 D57501D57501D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501 D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFF FFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F9092 8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501 D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501 D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501 D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C535455 8F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00 D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501 D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501 D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092 696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00 D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102935100D57501D57501 D57501D57501D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3 FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849 8F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600 C06900D57501D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501 D57501D57501D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B 9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDED FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010E0A049D5600 AB5E00904F00211D18FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F90928F9092696A6B1C1C1DFFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515158F90928F90925A5B5C434343FFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2525258F90928F9092 4B4C4D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501 D575011E1102935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500 462A07AB5E00AB5E003F270AA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55757584848498F90928F90922A2A2ABDBDBDFFFFFFFFFFFFFFFFFFCACACA 282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54545465657588F90928F90921A1A1AD8D8D8 FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333666668 8F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501 D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501 D57501D575012113018E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501 834801432809AB5E00AB5E004229099D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4545468F90928F90922D2D2EB7B7B7FFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5354558F90928F90921C1C1C D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737 6263648F90928F90920B0B0BEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501 D57501D57501D57501D57501D57501D575015A3100593100D57501D57501D57501D57501D57501 D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501 D57501D57501D575010B06009D5600AB5E007A4300050200FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202028F90928F9092414142191919FFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142 464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0E0E0F8F9092 8E8F91303031121212FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181819868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1B1B1C8F90928D8E90343536404040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501 D57501D57501D57501D57501D57501D575011C0F00935100D57501D57501D57501D57501D57501 D57501D57501D57501D575017E45003F2300AB5E00A55B012212016F6F6FFFFFFFFFFFFFFFFFFF E4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020202 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8E8F90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55657584848498F9092868789111111 686868FFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070708A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53D3D3E 5657588F90928283850909098F8F8FFFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52828296666688F90927E7F80030304B6B6B6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201 D57501D57501D57501D57501D57501D57501D57501D57501D575010A0500C06900D57501D57501 D57501D57501D57501D57501D57501D57501D575011F11008E4E00D57501D57501D57501D57501 D57501D57501D57501D57501D575018348013A2000AB5E00A65B00251401686868FFFFFFFFFFFF FFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51111118A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4444458F909287888A 131414616161FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435354558F90928384860A0B0BA7A7A7FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52C2C2D6263648F90927F8081040404C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100 D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501 D57501D57501D57501D57501D57501D57501D57501D575010E08009D5600663801070400181512 FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0030303 8F9092474748080808363636FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1314148E8F913838390B0B0B545454FFFFFFFFFFFFFFFFFFFFFFFF262626 939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2323248C8D8F2829290F0F0F727273FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011E1000935100 D57501D57501D57501D57501D57501D57501D57501D57501D575017E45004627019F5701190E00 040200A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5757584848497E7F810D0D0E101010BEBEBEFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5434445565758767779080808080808D8D8D8FFFFFFFFFFFFFFFFFF AFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53031316666686D6E70060606000000 F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501 D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D57501211201 8E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501834801422501A05801 1C10000402009D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5B5C4545468081830F0F0F111112B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B548484953545579797B090909010101D2D2D2FFFFFFFFFFFF FFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D 1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5353536626364707072060606 000000EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501 D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501 D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 0E0800633601080400784100221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB00303034747480909095E5E5F3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1313143838390E0E0E545556565656 FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B222223 28292914141449494A757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501 D57501D57501D575011E1000935100D57501D57501D57501D57501D57501D57501D57501D57501 D575017E4500422501190E002C190141290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55757584444450D0D0E3333342A2B2BBEBEBEFFFFFFFFFFFF FFFFFFCACACA282828B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5434445505152080808414243 1B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3031315D5E5F060606515253080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501 D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501 D57501D57501D57501D575012112018E4E00D57501D57501D57501D57501D57501D57501D57501 D57501D575018348013F23011C1000271602442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4141420F0F0F3030312E2E2EB8B8B8FFFFFF FFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54848494D4E4F090909 3E3F401F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373737B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53535365A5B5C0606064D4E4F0C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7978776034019C5500 9C55009C55009C55009C55009C55009C55009C55009C55004F2B004C2A009C55009C55009C5500 9C55009C55009C55009C55009C55009C5500733F00180D009C55009C55009C55009C55009C5500 9C55009C55009C55009C55009C5500000000060300834801904F00221E19FFFFFFFFFFFFFFFFFF FFFFFF555555626264828384828384828384828384828384828384828384828384828384313131 555556828384828384828384828384828384828384828384828384828384505151262627828384 8283848283848283848283848283848283848283848283848181830000000909097A7A7C696A6B 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF353636757577828384828384828384828384828384828384 828384828384828384222222686869828384828384828384828384828384828384828384828384 8283843A3A3A3A3A3B8283848283848283848283848283848283848283848283848283847C7D7F 0303030E0E0E8384865A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1515157A7B7C828384828384 828384828384828384828384828384828384828384141415777879828384828384828384828384 828384828384828384828384828384282829505152828384828384828384828384828384828384 8283848283848283847778790404041414148A8B8D4B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 9C55009C55009C55009C55009C55009C55009C55009C55009C55009C55000402009853009C5500 9C55009C55009C55009C55009C55009C55009C55009C5500180D008549019C55009C55009C5500 9C55009C55009C55009C55009C55009C55006F3D000100002C1901AB5E0041290CA3A3A3FFFFFF FFFFFFFFFFFFE2E2E2070707828384828384828384828384828384828384828384828384828384 7D7E7F0000008283848283848283848283848283848283848283848283848283848283840C0C0C 797A7B828384828384828384828384828384828384828384828384828384464647000000333334 8F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC4C4C4141414828384828384828384828384828384 8283848283848283848283847071710A0A0A828384828384828384828384828384828384828384 8283848283848283840404057E7F80828384828384828384828384828384828384828384828384 8283843030310000004142438F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFA4A4A4252525828384 828384828384828384828384828384828384828384828384626264181818828384828384828384 828384828384828384828384828384828384808182000000828384828384828384828384828384 8283848283848283848283848283841B1B1C0000005152538F9092080808F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0000009A54009C55009C55009C55009C55009C55009C55009C55009C55009C5500060300975300 9C55009C55009C55009C55009C55009C55009C55009C55009C5500190E008046009C55009C5500 9C55009C55009C55009C55009C55009C55009C5500744000020100271602AB5E00442A0B9D9D9D FFFFFFFFFFFFFFFFFFE9E9E9040404828384828384828384828384828384828384828384828384 828384808182000000828384828384828384828384828384828384828384828384828384828384 0D0D0D78797A8283848283848283848283848283848283848283848283848283844E4E4F010101 3030318F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFCBCBCB111111838385838385838385838385 838385838385838385838385838385747475070707838385838385838385838385838385838385 8383858383858383858383850606067D7E7F838385838385838385838385838385838385838385 8383858383853535360000003E3F408F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5252526 838385838385838385838385838385838385838385838385838385666668151515838385838385 838385838385838385838385838385838385838385838385000000828384838385838385838385 8383858383858383858383858383858383852121210000004D4E4F8F90920C0C0CEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7877760905001B10021B10021B10021B10021B10021B10021B10021B10021B1002 0B06000804001A0E001A0E001A0E001A0E011B10021B10021B10021B10021B10021009000A0500 190E001A0E001A0E001A0E011B10021B10021B10021B10021B1002150C01050200965200AB5E00 904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF3A3A3A0B0C0C171717171717171717171717171717 171717171717171717161617050505080808161616161616151515161616171717171717171717 171717171717070707080808161616161616151516161616171717171717171717171717171717 1616160000007A7A7C8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF0C0C0C0E0E0E171717 171717171717171717171717171717171717171717161717090909090909161616161616151515 161616171717171717171717171717171717040404080808161616161616151515161616171717 1717171717171717171717170D0D0D00000087888A8F90925A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFF070707121212171717171717171717171717171717171717171717171717161616060606 0D0D0D161616161616151515161717171717171717171717171717161616050505070808161616 1616161515151616171717171717171717171717171717170A0A0A0808088C8D8F8F90924B4C4D 757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF0A05001A0F021B10021B10021B10021B10021B10021B10021B1002 1B1002190E020A0500140A001A0E001A0E00190E001B10021B10021B10021B10021B10021A0F02 0604000E07001A0E001A0E00190E001B10021B10021B10021B10021B10021B1002060300070300 AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFC8C8C8090909171717171717171717171717 171717171717171717171717171717121212080808131313161616161616151515171717171717 1717171717171717171414140707070E0F0F161616161616151515171717171717171717171717 1717171515160000003D3D3E8F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFAAAAAA080808 1717171717171717171717171717171717171717171717171717171111110A0A0A151515161616 161616151515171717171717171717171717171717131313090909121213161616161616151515 1717171717171717171717171717171515150000004A4A4C8F90928F90921B1B1BD8D8D8FFFFFF FFFFFFFFFFFF909090080808171717171717171717171717171717171717171717171717171717 0E0F0F080809151515161616151616151515171717171717171717171717171717111111090909 1515151616161616161515151717171717171717171717171717171414140101015A5B5D8F9092 8F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A05001A0F021B10021B10021B10021B10021B10021B1002 1B10021B1002180E020A0500140B001A0E001A0E00190E001B10021B10021B10021B10021B1002 180E020603000F08001A0E001A0E00190E001B10021B10021B10021B10021B10021B1002060300 070300AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFCFCFCF080808171717171717171717 171717171717171717171717171717171717131414080808121313161616161616151515171717 1717171717171717171717171414140707070E0E0E161616161616151515171717171717171717 17171717171715161604040439393B8F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFB1B1B1 080809171717171717171717171717171717171717171717171717171717121313090909141414 151616151616141515171717171717171717171717171717131313080808111111151616151616 14141417171717171717171717171717171716161600000029292A8F90928F90921F1F1FD2D2D2 FFFFFFFFFFFFFFFFFFB6B6B6080808171717171717171717171717171717171717171717171717 171717101010090909151515151616151516141515171717171717171717171717171717141515 0909091415151516161516161415151717171717171717171717171717171516160000003E3E3F 8F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501 D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501 D57501D57501D575018D4E00201200D57501D57501D57501D57501D57501D57501D57501D57501 D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5A5A5B6E6E70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202028F90928F9092696A6B3B3B3BFFFFFFFFFFFF FFFFFFFFFFFF3D3D3D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F9092 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5181818868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501 D57501D57501D57501D57501D575011D1102935100D57501D57501D57501D57501D57501D57501 D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4 151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108E8F90B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBE FFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5454647575859 8F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501 D57501D57501D57501D57501D57501D57501D57501D57501090500C06900D57501D57501D57501 D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501 D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFF EAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51112128A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2E B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B548484A 5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53636376263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7978 6E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501 D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501 D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400 C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102935100D57501 D57501D57501D57501D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290C A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859 4848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF 3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501 0B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00 D57501D57501D57501D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00 442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF B5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501 D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D57501 8D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04 9D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F9092 8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501 D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501D57501D57501 7E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFF C9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434 6666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501 D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501 D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501 D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFF FFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA0 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501 D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501 D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501 D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501 D57501D57501D57501D57501D57501D57501D575011F1102935100D57501D57501D57501D57501 D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFF FFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F9092 2A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302 CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501 D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501 D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFF FFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121313 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F9092 8F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00 221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102 935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500472B08AB5E00 AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092 080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501 D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D57501 2113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501834801432909 AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F9092 8F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501 D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501 D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501 D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B2C2C2CFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90928F90924B4C4D727273FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501 D57501D57501D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501 D57501D575017E4500472B08AB5E00AB5E0040290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFF FFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F9092 8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501 D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501 D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501 D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B545455 8F90928F9092191919D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396263648F90928F9092030303EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00 D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100593100D57501D57501 D57501D57501D57501D57501D57501D57501D575018D4E00201200D57501D57501D57501D57501 D57501D57501D57501D57501D57501D575010A06009D5600AB5E008D4D00070400FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202028F90928F9092 5E5E60151515FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D0E0E0F8F90928F90925A5A5C141414FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181819868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1B1B1B8F90928F90923D3D3E6F6F6FFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00 D57501D57501D57501D57501D57501D57501D57501D57501D575011C0F00935100D57501D57501 D57501D57501D57501D57501D57501D57501D575017E45003F2200AB5E00A95D00010000A1A1A1 FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0F0F0F8E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5565758484849 8F90928D8E901A1B1B6C6C6CFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5070708A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3C3D5758598F90928C8D8F0E0E0F8D8D8DFFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52728286666688F90928B8C8D050505B2B2B2FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010A0500 C06900D57501D57501D57501D57501D57501D57501D57501D57501D575011F11008E4E00D57501 D57501D57501D57501D57501D57501D57501D57501D575018348013A2000AB5E00AA5D00030200 9C9C9CFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51111118A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4444458F90928E8F911D1D1E646464FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54142435454558F909287888A000000CFCFCFFFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D6263648F9092828384000000ECECEC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010E08009D5600 864901070400100E0CFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F9092646567050505313131FFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1313148F909259595B060606454545FFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2223238F9092494A4B 070707757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501 D575011E1000935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500 452701A95D003A2000090500A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55757584848498B8C8D2222220B0B0BBBBBBBFFFFFFFFFFFFFFFFFFC9C9C9 29292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424344575859868789171717050606D8D8D8 FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5303031666668 8081830F0F0F020202F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501 D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501 D57501D575012112018E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501 834801412401AA5D003D22000905009D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4545468B8C8E2525260B0B0BB5B5B5FFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B546474854545587888A1B1B1B060606 D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5343435 626364828384101010040404EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501 D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501 D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501 D57501D57501D575010E08008247010804005E3301221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303036465670606064F50513B3B3BFFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142 464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D13141459595B 0707074B4B4C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B232324494A4B090909434343757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501 D57501D57501D57501D57501D57501D575011E1000935100D57501D57501D57501D57501D57501 D57501D57501D57501D575017E45004627013A2000150C013E270BA3A3A3FFFFFFFFFFFFFFFFFF E4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55757584747482222231B1B1B292A2A BEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5434444 5555571717172627271B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3B3CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53031316262640F0F0F343435080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201 D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501 D57501D57501D57501D57501D57501D57501D575012112018E4E00D57501D57501D57501D57501 D57501D57501D57501D57501D575018348014225013E2200130B0141280A9D9D9DFFFFFFFFFFFF FFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C44444525252619191A 2D2D2DB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4747495253541B1B1B2223231F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53535365F60611010113131320C0C0CEDEDEDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7A79786C3B00CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000593100583000 CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD70008C4D001F1100CD7000CD7000 CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000020100060300633601904F00221E19 FFFFFFFFFFFFFFFFFFFFFFFF5959596C6D6EABACAEABACAEABACAEABACAEABACAEABACAEABACAE ABACAEABACAE353636606061ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE 58595A2D2D2EABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEAAABAD000000 060606626364696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF3B3B3B7F8081ABACAEABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAE262626727374ABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAEABACAE404141444445ABACAEABACAEABACAEABACAEABACAEABACAEABACAE ABACAEABACAE999A9C0303030707076F70725A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1D1D1D 919294ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE181818858687ABACAE ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE2C2D2D5B5B5CABACAEABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAE8788891213130909097B7C7D4B4C4D757576FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000 070400C46B00CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD70001D1000925000 CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD70007D4400281601150C01A35901 41290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E40E0E0EABACAEABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAEA5A6A8020202ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE ABACAEABACAE0F0F0F8D8D8FABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE 5454551212121B1B1B8D8E902A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C91D1D1DABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAEABACAE9394960F0F0FABACAEABACAEABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAE0707079FA0A1ABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAEABACAE3E3E3F0B0B0B2627278F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFF ACACAC2E2E2EABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE8282831E1E1E ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEA9AAAC000000ABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE29292A0707073434358F9092080808 F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF020201CB6F00CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000 CD70000A0500BF6900CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD70001F1100 8D4D00CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000CD7000824701241401130B01 A25901442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA0B0B0BABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAEABACAEA9AAAC000000ABACAEABACAEABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAE10111188898BABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE ABACAE59595A14141419191A8C8D8F2E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D019191AACADAF ACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF98999B0B0C0CACADAFACADAFACADAF ACADAFACADAFACADAFACADAFACADAFACADAFACADAF0809099A9B9DACADAFACADAFACADAFACADAF ACADAFACADAFACADAFACADAFACADAF4545460F0F0F2223238F90921F1F1FD2D2D2FFFFFFFFFFFF FFFFFFB5B5B52D2D2DACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF868789 1A1A1BACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF000000ABACAE ACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF3131320808083131328F9092 0C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797877000000030200030200030200030200030200030200 030200030200030200000000000000030200030200030200030200030200030200030200030200 030200000000000000030100030200030200030200030200030200030200030200030200000000 0000007E4500AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF3A3B3B000000030303030303 030303030303030303030303030303030303030303020202000000030303030303030303030303 030303030303030303030303030303000000000000030303030303030303030303030303030303 0303030303030303030202020000006263648F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF 131313000000030303030303030303030303030303030303030303030303030303070707000000 030303030303030303030303030303030303030303030303030303000000000000030303030303 0303030303030303030303030303030303030303030000000000008182848F90925A5B5C565656 FFFFFFFFFFFFFFFFFFFFFFFF080808000000030303030303030303030303030303030303030303 030303030303080808000000030303030303030303030303030303030303030303030303020202 010101000000030303030303030303030303030303030303030303030303030303000000000000 7B7C7D8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF020100030200030200030200030200030200 030200030200030200030200020100060300000000030200030200030200030200030200030200 030200030200030200090500000000030200030200030200030200030200030200030200030200 030200000000000000A35901AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFBBBBBB000000030303 030303030303030303030303030303030303030303030303000000010101020202030303030303 030303030303030303030303030303030303010102080808000000030303030303030303030303 0303030303030303030303030202020000003A3A3A8E8F918F90922A2B2BBEBEBEFFFFFFFFFFFF FFFFFF999999000000030303030303030303030303030303030303030303030303030303020202 000000020202030303030303030303030303030303030303030303030303010101060606000000 0303030303030303030303030303030303030303030303030202020000003A3C3C8F90928F9092 1B1B1BD8D8D8FFFFFFFFFFFFFFFFFF7B7B7B000000030303030303030303030303030303030303 030303030303030303000000000000030303030303030303030303030303030303030303030303 030303000000010202020203030303030303030303030303030303030303030303030303010101 0000004343448F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040200020100030200030200030200 030200030200030200030200030200020100070400000000030200030200030200030200030200 030200030200030200020100080500000000030200030200030200030200030200030200030200 030200030200000000000000A25901AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFC3C3C3000000 030303030303030303030303030303030303030303030303030303010101010202020202030303 030303030303030303030303030303030303030303010102080808000000030303030303030303 0303030303030303030303030303030202020000003737398E8F918F90922E2E2EB8B8B8FFFFFF FFFFFFFFFFFFA1A1A1000000020202020202020202020202020202020202020202020202020202 010101000000020202020202020202020202020202020202020202020202020202000000070707 0000000202020202020202020202020202020202020202020202020202020000000A0A0A8F9092 8F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB2B2B2000000020202020202020202020202020202 020202020202020202020202010101000000020202020202020202020202020202020202020202 020202020202020202020202020202020202020202020202020202020202020202020202020202 0202020000001818198F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7978776E3C00D57501 D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501 D57501D57501D57501D57501D57501D575018D4E00201100D57501D57501D57501D57501D57501 D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFF FFFFFF59595A6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5353636 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00000008F90928F9092696A6B 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF3B3B3B818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B2424258F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501 D57501D57501D57501D57501D57501D57501D57501D575011D1002935100D57501D57501D57501 D57501D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFF FFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F9092 8F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900 D57501D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501 D57501D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9D FFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C454647 8F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54748495454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373737 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1A1A1AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53535366263648F90928F90920C0C0CEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D57501 5A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201 D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00 904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D 757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501D57501 1F1102935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500472B08 AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFF FFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F9092 8F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501 D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501 D575012113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501834801 432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0 242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2 FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839626364 8F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501 D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501 D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501 D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFF FFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F9092 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501 D57501D57501D57501D57501D575011F1102935100D57501D57501D57501D57501D57501D57501 D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4 151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBE FFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5454647575859 8F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501 D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501 D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501 D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFF EAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2E B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B 5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7978 6E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501 D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501 D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400 C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102935100D57501 D57501D57501D57501D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290C A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859 4848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF 3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501 0B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00 D57501D57501D57501D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00 442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF B5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501 D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D57501 8D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04 9D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F9092 8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501 D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501D57501D57501 7E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFF C9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434 6666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501 D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501 D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501 D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFF FFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA0 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501 D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501 D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501 D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B313131 FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B2526268F90928F90924B4C4D737374FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501 D57501D57501D57501D57501D57501D57501D575011F1102935100D57501D57501D57501D57501 D57501D57501D57501D57501D575017E4500472B08AB5E00AB5E0041290CA3A3A3FFFFFFFFFFFF FFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F9092 2A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302 CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501 D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501 D57501D57501D57501D57501D57501D57501834801432909AB5E00AB5E00442A0B9D9D9DFFFFFF FFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121313 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F9092 8F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5494A4B5454558F90928F90921D1D1DD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F9092090909EDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00914F00 231F1AFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F909268696A242425FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925D5E5F4E4E4EFFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F9092494A4B848484 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102 935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500472A08AB5E00 AB5E00060401B1B1B1FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922F3030ACACACFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F9092212121C5C5C5FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928E8F91 0F0F0FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501 D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501D57501D57501 2113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501834801432909 AB5E00AB5E000B0702ACACACFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F9092333333A7A7A7FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928D8E90000000D9D9D9FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F9092 898A8C000000F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501 D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501 D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501 D575010F0A049D5600945100171109969594FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092747476101010EDEDEDFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90926A6B6C0E0E0F C2C2C2FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90925F6061131313FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501 D57501D57501D57501D575011F1102935100D57501D57501D57501D57501D57501D57501D57501 D57501D575017E4500472B08AB5E00583305423C35FFFFFFFFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498E8F913C3C3D373737F3F3F3FFFFFF FFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598C8D8F 3030314A4A4AFAFAFAFFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B533343466666888898B252525626262FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501 D57501D57501D57501D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501 D57501D57501D57501D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501 D57501D57501D57501834801432909AB5E005C34043A352EFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90923E3F40333333F1F1F1 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B545455 8D8E903434357D7D7DFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5383839626364898A8C292A2A9D9D9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00 D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501 D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501 D57501D57501D57501D57501D57501D575010F0A04914F00171109969594FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0030303747476101010 AEAEAEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515166A6B6C0E0E0FC2C2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B2526265F6061131313D3D3D3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080400C56C00 D57501D57501D57501D57501D57501D57501D57501D57501D575011F1102935100D57501D57501 D57501D57501D57501D57501D57501D57501D575017E4500472B0858330525221EEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849 3C3C3D373737F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54546475657583030314A4A4AFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434646566252525626262FEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040302CF7201D57501D57501D57501D57501D57501D57501D57501D57501D575010B0600 C06900D57501D57501D57501D57501D57501D57501D57501D57501D575012113028E4E00D57501 D57501D57501D57501D57501D57501D57501D57501D575018348014329095C3404211E1AEAEAEA FFFFFFFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4546473E3F40333333F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5494A4B535455343435434343FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839616263292A2A595959FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A3100593100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 201200D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080602130E08 969594FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB0000000101010AEAEAEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0A0A0B0E0E0FC2C2C2FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1B1B1C131313D3D3D3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501080400C56C00D57501D57501D57501D57501D57501D57501D57501D57501 D575011E1102935100D57501D57501D57501D57501D57501D57501D57501D57501D575017E4500 34210825221EE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575859292929373737F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9 29292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54545462121214A4A4AFAFAFAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B531323219191A 626262FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040302CF7201D57501D57501D57501D57501D57501 D57501D57501D57501D575010B0600C06900D57501D57501D57501D57501D57501D57501D57501 D57501D575012113028E4E00D57501D57501D57501D57501D57501D57501D57501D57501D57501 834801321F09211E1AE7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C2B2B2C333333F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B242425434343F8F8F8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 1D1D1D595959FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A8A70000001A130B1A130B1A130B 1A130B1A130B1A130B1A130B1A130B1A130B0000000000001811091A130B1A130B1A130B1A130B 1A130B1A130B1A130B1A130B0302000000001710081A130B1A130B1A130B1A130B1A130B1A130B 1A130B1A130B151009000000B2B1B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F 000000171717171717171717171717171717171717171717171717171717030303000000161616 171717171717171717171717171717171717171717171717000000000000151516171717171717 171717171717171717171717171717171717151515000000AEAEAEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF565656000000171717171717171717171717171717171717171717171717 171717070708000000171717171717171717171717171717171717171717171717171717000000 000000161616171717171717171717171717171717171717171717171717000000000000DADADA FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF303030010101171717171717171717171717 171717171717171717171717171717080808000000171717171717171717171717171717171717 171717171717171717010101000000171717171717171717171717171717171717171717171717 171717000000000000D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000001A130B1A130B 1A130B1A130B1A130B1A130B1A130B1A130B1A130B18120A0201000C08031A130B1A130B1A130B 1A130B1A130B1A130B1A130B1A130B19120A0A05000000001A130B1A130B1A130B1A130B1A130B 1A130B1A130B1A130B1A130B000000000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EFEFEF000000171717171717171717171717171717171717171717171717171717141414000000 121212171717171717171717171717171717171717171717171717171717080808000000171717 1717171717171717171717171717171717171717171717170000006E6E6EF8F8F8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000171717171717171717171717171717171717171717 171717171717151515000000121212171717171717171717171717171717171717171717171717 141414030404090909171717171717171717171717171717171717171717171717161617000000 787979FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE000000171717171717171717 1717171717171717171717171717171717170C0C0C000000151515171717171717171717171717 171717171717171717171717161616000000121213171717171717171717171717171717171717 171717171717161616000000838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000171109 1A130B1A130B1A130B1A130B1A130B1A130B1A130B1A130B19120A0402000A07021A130B1A130B 1A130B1A130B1A130B1A130B1A130B1A130B19120A0A050000000019130A1A130B1A130B1A130B 1A130B1A130B1A130B1A130B1A130B000000000000E7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3000000171717171717171717171717171717171717171717171717171717141414 000000121212171717171717171717171717171717171717171717171717171717080808000000 1717171717171717171717171717171717171717171717171717170000006A6A6AF7F7F7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E2000000171717171717171717171717171717171717 171717171717171717151515000000121212171717171717171717171717171717171717171717 171717151515050505060606171717171717171717171717171717171717171717171717171717 000000070707F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2000000171717171717 171717171717171717171717171717171717171717141414000000131314171717171717171717 171717171717171717171717171717131313000000121213171717171717171717171717171717 1717171717171717171717170000002B2B2BFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BFBFBF E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BEBEBEE1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E0E0E0DCDCDCE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1C4C4C4E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1C7C7C7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1DDDDDDE0E0E0E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1CBCBCBE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1D5D5D5D8D8D8E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF0F0F0E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 DDDDDDE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EAEAEAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDEDE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1DDDDDDE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1BFBFBFE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEAE1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1B4B4B4E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE7E7E7E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1DCDCDC E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1B7B7B7E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E8E8E8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1DCDCDCE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E7E7E7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1DCDCDCE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1C0C0C0E0E0E0E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBE1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1B4B4B4E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1D4D4D4F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE8E8E8E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 B5B5B5E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1C8C8C8FDFDFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD8D8D8D2020202B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2A2A2A0C0C0C1414142B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B0606060000002929292B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 1010102D2D2DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA7070702222222B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A0E0E0E1717172B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0A0A0A1414142A2A2A2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B0303034B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F7F7F75858582323232B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2929290E0E0E 1A1A1A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0C0C0C1616162A2A2A 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0000006A6A6AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF2F2F23F3F3F2525252B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2626260C0C0D1D1D1D2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2929290D0E0E1919192B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B000000 8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E91C1C1C2727272B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2121210808082222222B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2425250D0D0D1D1D1D2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B000000ABABABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E20A0A0A 2828282B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B1414140909092B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2121210C0C0C2121212B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B292929000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8888882C2C2C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 1010100101012828282B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B1718180C0C0D 2526262B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B272727000000C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C51D1D1D2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B0707071617172B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B0A0B0B090A0A2727272B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 242424000000DADADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEB2222222828282C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2323230909092222222C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2424240606062525252C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C000000A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5 0F0F0F2929292C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C1818180809092C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2323230C0C0C2121212C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2A2A2A000000B7B7B7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDCDCDC0000002A2A2A2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C0F0F0F0E0E0E2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C1D1D1D 0A0A0A2727272C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C282828000000C6C6C6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD1D1D1D2B2B2B2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C0909091515152C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C0F0F0F0C0C0C2828282C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C272727000000FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F63E3E3E3F40409B9C9E 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F98999B2020202F2F2F9B9C9E9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F39393A1414148C8C8E9C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F8C8D8E0303030F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EDEDED2C2C2C4E4F509C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F959698151515 3D3D3E9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F262627202020999A9C 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F7D7E7F0000002C2C2DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE2E2E21E1E1E5D5D5E9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F8E8F900E0E0E4F4F509C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 9A9B9D1A1A1A2C2C2C9B9B9D9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F6D6E6F 0000004C4C4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D41414156B6B6C9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F8686870A0A0A5F5F609C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9596981212123A3A3B9B9C9E9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F5B5B5C0404046F6F70FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7B7B7111111 7C7D7E9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F7474750808087676779C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F898A8B0A0A0A5556579C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9B9C9E3B3B3B121213A1A1A1FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA1A1A11515158586889C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 6767680909099D9E9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F7F8081070707 6666689C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9B9B9D2A2A2A0A0A0ABCBCBC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888881D1D1E9E9FA09C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F5556560E0E0E8788899C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F7474750707077374759C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F 999A9C1C1C1C000000D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A2A2B2B999A9C 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F4141411717179E9FA09C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F9C9D9F6061620808087E7F809C9D9F9C9D9F9C9D9F9C9D9F 9C9D9F9C9D9F9C9D9F9C9D9F979899111111000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB 111111797A7B9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E767778070707737374 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E8A8B8D0A0B0B7677789B9C9E9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9B9D3E3F3F1010109B9B9BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFA7A7A71313138283849B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E 9B9C9E69696B0808089B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E818283 0808086162639B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9A9B9C2E2F2F0D0D0D B6B6B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8E8E1B1B1B898A8B9B9C9E9B9C9E9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E5A5A5C0C0C0D9E9FA09B9C9E9B9C9E9B9C9E9B9C9E9B9C9E 9B9C9E9B9C9E9B9C9E7677780707077070719B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E 9B9C9E98999B1F1F1F000000D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF717171272728 98999B9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E4545461414149D9E9F9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E6666670808087A7B7C9B9C9E9B9C9E9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E979899131314000000EDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F6F6F63E3E3E49494ABFC0C2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC0222323 353536BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43E3E3E151515AEAEB0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49596980E0E0E626364212121FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEDEDED2C2C2C5B5C5DC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4B8B9BB171717474748C0C1C3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C429292A222223B6B7B9C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4868788 0F0F106262643B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E21E1E1E6E6E6FC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ADAEB00F0F0F5D5D5EC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BDBEC01C1C1D313132BBBCBEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4767778131313555657565656FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D4 1414157F8081C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A1A1A30B0B0B707172 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B6B7B9131314434444BFC0C2C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46464651B1C1C484849757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB7B7B7111111979899C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 8484860808088D8E8FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A0A1A30B0B0B 656667C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BEBFC14444452D2E2E373738 A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1A1A1151515A4A5A6C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C46F70710909099B9B9DC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C48F909208080879797BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 BABBBD33343438393A2A2A2BBDBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888881D1D1EAEAEB0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45B5B5D0E0E0EA6A7A9C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47B7C7E0707078A8B8CC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B4B5B72526264545461B1B1BD8D8D8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6A6A6A2C2C2DB5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4454546 171718B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C467676908080998999B C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ABACAE1A1A1B525253080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFBBBBBB111111949596C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C488898A0808088A8B8CC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A3A4A6 0C0C0C606162C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C24848492B2B2B 3A3A3B9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7A7A7131313A1A2A3C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C474757609090998999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4939496080808747576C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BBBCBE3838393536362E2E2EB7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8E8E1B1B1B ABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46060610D0D0DA4A5A6C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4808183070707868788C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B6B7B92829294242431F1F1FD2D2D2FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF717171282828B4B5B6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 4A4A4B151515AEAFB1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46C6C6E080808 959597C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4AEAEB01D1D1D4F50510C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F63B3B3B474748B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB3B4B61D1D1E333334B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BA3A3A3B131313ABACAEB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA949596 0E0E0E68696A78797B212121FFFFFFFFFFFFFFFFFFFFFFFFECECEC292929595A5AB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAAFB0B1151515454546B7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BA262626202121B4B5B6B7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BA8586880F0F10727374696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0 1B1B1C6B6C6DB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAA7A8A90E0E0E5A5B5C B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB4B5B71919192F2F30B6B7B9B7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA7676771313137A7B7D5A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFFD1D1D11212127D7E7FB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BA9C9D9E090A0A6E6E70B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB0B1B3 121213414242B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA6363641B1C1C 8283844B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B10E0E0E959597B7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BA8080810707078B8B8DB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BA9D9EA00A0A0A636364B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BA4444452D2E2E8A8B8D383939A3A3A3FFFFFFFFFFFFFFFFFFFFFFFF9A9A9A121212A1A2A4 B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA90919208080898999BB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA8C8C8E070707767778B7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BA33343438393A8D8E902B2B2CBDBDBDFFFFFFFFFFFFFFFFFF FFFFFFA3A3A31B1B1BABACAEB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA565757 0D0D0DA4A5A6B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA78797A06060688888A B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB2B3B52526264545468F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFFFFFFF6161612A2A2AB3B4B6B7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BA606162161616AEAEB0B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BA626364070707969798B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAAAABAC 1A1A1B5252538F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B60E0E0E929294B7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BA84858706060788888AB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAAEAFB10B0B0B5E5E5FB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BA4848492B2B2B898A8C3B3C3C9D9D9DFFFFFFFFFFFFFFFFFFFFFFFFA1A1A1111111 9E9FA1B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA949597070707969798B7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA909192070707727374B7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB6B7B93838393536368D8E902E2F2FB7B7B7FFFFFFFFFFFF FFFFFFFFFFFF868686181819A9AAACB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA 8080820B0B0BA1A2A4B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA8A8B8C060606 848586B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB4B5B62829294242438F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFFFFFFF686868262626B1B2B4B7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BAB7B8BAB7B8BA666768131313ACADAFB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BA686969070707929395B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BA1D1D1D4F50518F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D5D5D000000080808080808 080808080808080808080808080808080808080808000000000000060606070707060607070707 080808080808080808080808080808000000000000050505070707060707070707080808080808 08080808080808080800000000000078787A8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 2D2D2D000000080808080808080808080808080808080808080808080808080808010101000000 070707070707060606070707080808080808080808080808080808000000000000060606070707 0606060707070808080808080808080808080808080000000000008283848F9092696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFF000000000000080808080808080808080808080808080808080808 080808080808020202000000070707070707060606070707080808080808080808080808080808 000000000000060607070707060606070707080808080808080808080808080808000000000000 8686888F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF000000000000080808080808080808 080808080808080808080808080808050505000000000000070707070707060606080808080808 080808080808080808070707010101000000070707070707060606070808080808080808080808 080808080808000000000000898A8C8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF000000040404 080808080808080808080808080808080808080808080808000000000000000000070707070707 060606080808080808080808080808080808020202010101000000070707070707060606080808 0808080808080808080808080808080000004D4E4E8D8E908F9092383939A3A3A3FFFFFFFFFFFF FFFFFFC7C7C7000000050505080808080808080808080808080808080808080808080808070707 000000000000070707070707060606080808080808080808080808080808000000000000000000 0707070707070606060808080808080808080808080808080606060000005B5C5E8F90928F9092 2B2B2CBDBDBDFFFFFFFFFFFFFFFFFFE3E3E3000000040404080808080808080808080808080808 080808080808080808000000000000040404070707070707060606080808080808080808080808 080808000000000000000000070707070707060606080808080808080808080808080808030303 0000005E5F608F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFF929292000000070707080808 080808080808080808080808080808080808080808060606000000030303070707070707060606 080808080808080808080808080808000000000000030303070707070707060606080808080808 0808080808080808080000000000005F60618F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 030303080808080808080808080808080808080808080808080808000000000000000000070707 070707060606080808080808080808080808080808030303060606000000070707070707060606 0808080808080808080808080808080808080000004848498C8D8F8F90923B3C3C9D9D9DFFFFFF FFFFFFFFFFFFCDCDCD000000040404080808080808080808080808080808080808080808080808 070707000000000000070707070707060606080808080808080808080808080808000000000000 0000000707070707070606060808080808080808080808080808080606060000005B5C5C8E8F91 8F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFB4B4B4000000060606080808080808080808080808 080808080808080808080808070707000000000000070707070707060606080808080808080808 080808080808080808000000000000070707070707060606080808080808080808080808080808 0404040000005E5E608F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF989898000000070707 080808080808080808080808080808080808080808080808070707000000030303070707070707 060606080808080808080808080808080808000000000000020202070707070707060606080808 0808080808080808080808080808080000003637388F90928F90920C0C0CEDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B 212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A 7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F9092 8F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA252626B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1C1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092 080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1A1A1B777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B 8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA009090AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333346263648F9092 8F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFF FFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F9092 8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C535455 8F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092 696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3 FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849 8F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C 9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDED FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5767778 1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 19191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F9092 4B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B 3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55758594848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA 282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8 FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434666668 8F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1F D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142 464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F9092 8F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFF E4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922B2B2C BDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464747 5657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFF FFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F9092 2E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121 FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0030303 8F90928F9092696A6B343435FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C525252FFFFFFFFFFFFFFFFFFFFFFFF262626 939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092 383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5758594848498F90928F90922B2B2CBDBDBDFFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54647475657588F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFF AFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808 F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D 777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F9092 8F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5B5C4546478F90928F90922E2F2FB7B7B7FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54A4A4C5354558F90928F90921F1F1FD2D2D2FFFFFFFFFFFF FFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D 1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F9092 0C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57677781B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A8384868F909279797B191A1AFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB00202028F90928F90926666680A0A0AFFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1111118F90928F9092555657333333 FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 8F90928F90924D4D4F6C6C6CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51819197B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56A6A6B3838398F90928F90922E2E2F9D9D9DFFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020203B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55657584848498F90928F9092242425ACACACFFFFFFFFFFFF FFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54040415657588F90928F9092 161616C7C7C7FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2C2C2D6666688F90928F9092070707E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51B1B1B777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56E6E703435358F90928F9092323233979797FFFFFFFFFFFFFFFFFFEAEAEA101010 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51111128A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4445468F90928F9092282828A7A7A7FFFFFF FFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54545465354558F9092 8F9092141414CDCDCDFFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53030316263648F90928D8E90000000EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0B0B838486848587131314030303FFFFFFFFFFFFFFFFFF FFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737 616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202028F90927E7F800C0C0C 212121FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 1111118F90927677780707083F3F3FFFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F208F90926C6D6F050505555556FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51819197B7C7DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3838398F909259595B0505058B8B8BFFFFFF FFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ACADAF020203B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101010 8E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55657584848498F9092 4A4B4C050505A7A7A7FFFFFFFFFFFFFFFFFFCACACA282929B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54041425657588F909238393A060606CACACAFFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2D2D6666688D8E902A2A2B050506EBEBEBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1B777879B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703535358F90925B5C5D050505838383 FFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1112128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C444546 8F90924E4F4F050505A0A0A0FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54546475354558F90923D3D3E060606C4C4C4FFFFFFFFFFFFFFFFFFB5B5B5373738 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53131316263648D8E902F2F300C0D0DEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C4B4B4CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C808183141415 242425212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ADAEB00303037E7F800C0C0D2F30313B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D131414767778080808353536565656FFFFFFFFFFFFFFFFFF FFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2323246C6D6F050606313233 757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 19191A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3B3B3C 59595B060606232323A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55757584848494A4B4C090909232324BEBEBEFFFFFFFFFFFFFFFFFFCACACA282929 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B543444556575839393A0D0D0D171718D8D8D8FFFFFF FFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53031316566672B2B2C 131314060606F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51B1C1C777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E70 3838385B5C5D0606062223239D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5B5C4545464E4F4F080808262626B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0 242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54848495354553D3E3E0C0C0C181818D2D2D2 FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5353536626264 2F30301011110A0A0AEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57677781B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B508080912121226262778797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00000000C0C0D353536696A6B3B3B3BFFFFFFFFFFFF FFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464646 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0E0E0F080808434344 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF242425939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1818190506065353544B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56A6A6B2B2B2C0606066B6C6D383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4 131313B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020203B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B557575836373709090977787A2A2B2BBEBEBE FFFFFFFFFFFFFFFFFFCACACA242525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54344452B2C2C 0D0D0D8182841B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF363637B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52F3030222222131314898A8C080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF030303ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56E6E7028282906060668686A3B3C3C9D9D9DFFFFFFFFFFFFFFFFFF EAEAEA0E0E0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C3334350808087576762E2E2E B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5484849 2E2F2F0C0C0C7F80821F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5333334B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B535353625252610111187888A0C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E 000000212122212222212222212222212222212222212222212222212222060606000000212121 2121222121212121212122222122222122222122222122220E0F0F000000202021212122212121 2121212122222122222122222122222122221F1F200000003131318F909278797B212121FFFFFF FFFFFFFFFFFFFFFFFF4F4F4F000000212122212222212222212222212222212222212222212222 212222030303000000212121212122212121212122212222212222212222212222212222040404 0000002021212121222121212121222122222122222122222122222122221F1F20000000353536 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF2A2A2A050505212222212222212222212222 212222212222212222212222212222080808000000212121212122212121212122212222212222 212222212222212222000000000000212121212122212121212122212222212222212222212222 2122221313130000004C4C4D8F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF0606060F0F0F 212222212222212222212222212222212222212222212222212222080808080808212121212122 212121212122212222212222212222212222212222010101000000212121212122212121212122 2122222122222122222122222122220303030000005A5A5C8F90924B4C4D757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000202121212222212222212222212222212222212222212222212222212122000000 191919212122212122212121212222212222212222212222212222212222080809020202212121 2121222121212121222122222122222122222122222122220000000000007071728F9092383939 A3A3A3FFFFFFFFFFFFFFFFFFC4C4C4000000212121212222212222212222212222212222212222 212222212222202020000000202020212122212122212121212222212222212222212222212222 2121210707070C0C0C212122212122212121212222212222212222212222212222212222000000 0000007E7F818F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFA3A3A3000000212121212222212222 2122222122222122222122222122222122221B1C1C000000202021212122212122212121212222 212222212222212222212222202020010101161617212122212122212121212222212222212222 21222221222221222200000029292A8586888F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFF828282 000000212121212222212222212222212222212222212222212222212222181819000000202121 2121222121212121212122222122222122222122222122221D1D1E000000202021212122212122 21212121222221222221222221222221222221212100000029292A8A8B8D8F9092080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000001E1F1F212222212222212222212222212222212222212222212222212122 000000171717212122212122212121212222212222212222212222212222212222080808000000 2121212121222121212121222122222122222122222122222122220000000000006D6E708F9092 3B3C3C9D9D9DFFFFFFFFFFFFFFFFFFCDCDCD000000212121212222212222212222212222212222 212222212222212222202020000000202020212122212122212121212222212222212222212222 2122222121210707070A0A0A212122212122212121212222212222212222212222212222212222 0000000000007C7D7E8F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFAAAAAA000000212121212222 2122222122222122222122222122222122222122221E1E1F000000202020212122212122212121 212222212222212222212222212222212121030303131414212122212122212121212222212222 2122222122222122222122220000001011118283858F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF B5B5B50000002121212122222122222122222122222122222122222122222122221B1B1B000000 2020212121222121212121212122222122222122222122222122222020200000001F1F1F212122 21212221212121222221222221222221222221222221222200000001010187888A8F90920C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7777773C3D3E6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F3535361717176D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 5151530202026D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F060606 8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF4F4F4F4B4C4D6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F2323243E3E3F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F3E3F400C0C0C6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6C6C6E0000008F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF2A2A2A 5A5A5C6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F1717174546476D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F2D2D2E1F1F1F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F69696A0D0D0D8F90928F90925A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF1717176768696D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F0A0A0A5E5F606D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F1E1E1E 3838386D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6061621B1B1C8F9092 8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000006D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F0000006768696D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F0D0D0D5657576D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 494A4A3636378F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E40000006D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F696A6B0000006C6C6D6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F0505056565666D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F3C3C3C4848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFF C9C9C90C0C0C6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F5E5E5F000000 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F0000006A6A6C6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F3031315758598F90928F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF1818186D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F5253540606066D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6C6C6D0000006D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F242425 6666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000006C6C6E6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F0000006A6A6C6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F1111115354546D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F4C4D4D3333338F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA0000006D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6C6C6D0000006C6C6D6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F0707076162636D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F3E3E3F4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFF FFFFFFD0D0D00909096D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F606162 0000006D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F010101676869 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F3131315253548F90928F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B51010106D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F5556570404046D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F0000006C6D6E6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 1C1C1D5E5E608F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFF FFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F9092 2A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFF FFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121313 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F9092 8F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B 212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A 7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F9092 8F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092 080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B 8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F9092 8F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFF FFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F9092 8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B545455 8F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092 696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3 FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849 8F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C 9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDED FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5767778 1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F9092 4B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B 3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C9 29292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8 FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434666668 8F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1F D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57677781B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B8384868F909278797B1D1D1DFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202038F90928F9092696A6B363636FFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142 464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1212128F9092 8F90925A5B5C525252FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B2021218F90928F90924B4C4D747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060607A5A6A8B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51919197B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6A6B39393A8F90928F909219191AA3A3A3FFFFFFFFFFFFFFFFFF E4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020203 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55757584848498F90928F9092252526 BEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414242 5758598F90928F9092171717D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52E2E2F6666688F90928F9092070707F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1B777879B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703636368F90928F90921D1D1E9D9D9DFFFFFFFFFFFF FFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4445468F90928F9092 292929B8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4646475454558F90928F9092000000D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232336263648F90928F9092000000EDEDEDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781B1B1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A8384868E8F913A3B3C040404 FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0020202 8F90928B8C8E2C2D2E040404FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1010118F909288898B212121020202FFFFFFFFFFFFFFFFFFFFFFFF262626 939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181819868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1E1E1E8F90928384851717171B1B1BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 060606A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51818197B7C7D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3738388F9092727374 0606069D9D9DFFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ACADAF020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50F0F0F8E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5657584848498F90927071730707077D7D7DFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53F3F405758598F9092666768050606A6A6A6FFFFFFFFFFFFFFFFFF AFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2C6666688F90925A5B5B040404 D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1B 777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703334348F9092 747476050505989898FFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51111118A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5B5C4445468F9092727374080808757575FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54344455454558F90925E5F600B0B0BCECECEFFFFFFFFFFFF FFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D 1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53030306263648F9092515153 0C0C0DECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57677781B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C8384852D2E2E1212121F1F1FFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB00303038A8B8D2121221919193A3A3AFFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D131414868688161617222223565656 FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B232324 7F80820E0E0E242425757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B519191A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56A6A6B3B3B3C727374060607151616A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF020303B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B557575848484968696A0505051B1C1CBEBEBEFFFFFFFFFFFF FFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54344445758595B5B5D060606 121213D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3031316666684D4E4F090909050505F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51B1C1C777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56E6E703838387474760707071515159D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4545466A6B6C0505061D1D1EB8B8B8FFFFFF FFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54747495454555E5F60 060606101010D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5353536626364515253080808050505EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B2B2B2C131414747577212121FFFFFFFFFFFFFFFFFF FFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00101012121221C1C1C68696A 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 1010111616172828285A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1D1E1E0E0E0E3636374B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B519191A7B7C7DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B323233060607505051383939A3A3A3FFFFFF FFFFFFFFFFFFE4E4E4141414B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ACADAF020303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101010 8E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55757583E3F40050505 5E5F612A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C9272727B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54344444A4A4B0606066D6D6E1B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF383839B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B530313143444409090978797B080808F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1C1C777879B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703030300707074C4C4D3B3C3C9D9D9D FFFFFFFFFFFFFFFFFFEAEAEA0F0F0FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1212128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C3C3C3D 0505065C5C5D2E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0222222B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5474749474849060606696A6C1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5353535 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53535364647480808087677780C0C0CEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF474747000000525253525253525253525253525253525253525253525253525253 1616160000005152535252535252535252535252535252535252535252535252532A2A2A000000 51525352525352525352525352525352525352525352525352525352525300000019191A8B8C8D 78797B212121FFFFFFFFFFFFFFFFFFFFFFFF252525111112525253525253525253525253525253 5252535252535252535252530B0B0B060606515253525253525253525253525253525253525253 525253525253161617000000515253525253525253525253525253525253525253525253525253 4D4D4E0000001616168E8F91696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF0E0E0F232324525253 525253525253525253525253525253525253525253525253070707171717525253525253525253 525253525253525253525253525253525253070707000000515253525253525253525253525253 52525352525352525352525339393A0000001717188F90925A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFF010101353536525253525253525253525253525253525253525253525253525253050505 282929525253525253525253525253525253525253525253525253525253010101010101525253 5252535252535252535252535252535252535252535252532626260000003C3C3D8F90924B4C4D 757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F1000000525253525253525253525253525253525253525253525253 525253525253000000464647525253525253525253525253525253525253525253525253525253 0707071E1E1F5252535252535252535252535252535252535252535252535252530D0D0D000000 5050518F9092383939A3A3A3FFFFFFFFFFFFFFFFFFCBCBCB000000525253525253525253525253 5252535252535252535252535252534F4F50000000515253525253525253525253525253525253 525253525253525253525253030303303031525253525253525253525253525253525253525253 5252535252530000000000006263658F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFA8A8A8000000 525253525253525253525253525253525253525253525253525253474747000000515253525253 525253525253525253525253525253525253525253525253000000414142525253525253525253 5252535252535252535252535252535252530000000000006F70728F90921B1B1BD8D8D8FFFFFF FFFFFFFFFFFF868686000000525253525253525253525253525253525253525253525253525253 3B3B3C000000515253525253525253525253525253525253525253525253525253505152000000 5152535252535252535252535252535252535252535252535252535252530000000000007B7B7D 8F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004E4E4F525253525253525253525253525253525253 525253525253525253000000424243525253525253525253525253525253525253525253525253 5252530707071A1A1B525253525253525253525253525253525253525253525253525253111112 0000004C4C4D8F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFD4D4D4000000525253525253525253 525253525253525253525253525253525253515152000000515253525253525253525253525253 5252535252535252535252535252530404042C2C2D525253525253525253525253525253525253 5252535252535252530000000000006060618F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFB1B1B1 000000525253525253525253525253525253525253525253525253525253484849000000515253 5252535252535252535252535252535252535252535252535252530000003D3D3E525253525253 525253525253525253525253525253525253525253000000000000696A6C8F90921F1F1FD2D2D2 FFFFFFFFFFFFFFFFFFB0B0B0000000525253525253525253525253525253525253525253525253 525253404041000000515253525253525253525253525253525253525253525253525253525253 0000004F5051525253525253525253525253525253525253525253525253525253000000000000 7677788F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7777772828283E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F1F1F1F0A0A0A3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F2D2E2E0000003E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F0203038384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF4D4D4E313232 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F1717172727283E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F2526260303033E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3D3D3E0000008F90928F9092696A6B3B3B3BFFFFFFFFFFFF FFFFFFFFFFFF2929293737383E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 0D0D0D3333343E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F1D1D1D090909 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3B3B3B0D0D0D8F90928F9092 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF0B0B0B393A3A3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F0707073838393E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F1313132828283E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3838391D1D1D8F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000003E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F0000003C3C3D3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F0909093637373E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F2F2F302424258F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4 0000003E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3B3C3C0000003E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F00000039393A3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F2626274848498F90928F90922A2B2BBEBEBE FFFFFFFFFFFFFFFFFFC9C9C90000003E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3535360000003B3C3C3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 0000003B3C3C3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F202021575859 8F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF0404043E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F2E2E2F0000003E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F3E3E3F3D3E3E0000003E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F3E3E3F 3E3E3F3E3E3F1818196666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000003C3D3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E0000003B3B3C3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E0A0A0B3636373D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3131322020218F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFF EAEAEA0000003D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3C3D3E000000 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E0202023838393D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E2727284445468F90928F90922E2E2E B8B8B8FFFFFFFFFFFFFFFFFFD0D0D00000003D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3636370000003A3B3B3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E0000003A3B3B3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E1B1C1C 4242438F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B50000003D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E2F30300000003C3C3D3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E0000003B3B3C3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E1010105455568F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707 A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939 A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51010108E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859 4848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF 3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F9092 3B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51212128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B549494A5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFF B5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386263648F90928F90920C0C0C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F9092 8F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFF C9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1B D8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434 6666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFF FFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA0 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F9092 1F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFF FFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F9092 2A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFF FFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121313 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F9092 8F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B 212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF 262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924B4C4D757576 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A 7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F9092 8F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFF FFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5848586 1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092 080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B 8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90928F90921F1F1FD2D2D2FFFFFF FFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F9092 8F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 2526268F90928F90924B4C4D757576FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092383939A3A3A3FFFFFFFFFFFFFFFFFFE4E4E4151515 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55758594848498F90928F90922A2B2BBEBEBEFFFFFF FFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F9092 8F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53334346666688F90928F9092080808F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90923B3C3C9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA 101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928F90922E2E2EB8B8B8 FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B545455 8F90928F90921F1F1FD2D2D2FFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396263648F90928F90920C0C0CEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2A04EE29E4AE29E4AF4D9B87979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092 696A6B1B1B1BFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F90928F90924A4A4B707071F4DABAE29E4AE29E4A E29F4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2ABE29E4AE29E4AE4A65AFFFFFF 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E8F90928F9092292929A3A3A3 FFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849 8F90928F90922A2B2BBEBEBEFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54546475758598F90928F90921B1B1BD8D8D8FFFFFFFFFFFFFFFFFFAFAFAF3B3C3C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53334346666688F90928F9092080808F3F3F3E6AB62 E29E4AE29E4AF1CEA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D5B0E29E4AE29E4AE4A456 FFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B8F90928F90922D2D2E 9D9D9DFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C 4546478F90928F90922E2E2EB8B8B8FFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5494A4B5454558F90928F9092040404D2D2D2FFFFFFFFFFFFFFFFFFB5B5B5 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396263648F90928F9092000000EDEDED E6AD66E29E4AE29E4AF0CC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD87D0D D57501D57501EEC5937979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5767778 1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F90925C5C5E282828FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F90928E8F9139393A878787FFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8E90434344545455FFFFFFFFFFFF FFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B2526268F909288898B 1F1F20CBCBCBEEC695D57501D57501D77B0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EDC491D57501D57501D87D0EFFFFFF000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B 3D3D3E8F90927E7F80040505DEDEDEFFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55758594848498F90927F80811E1E1EB2B2B2FFFFFFFFFFFFFFFFFFC9C9C9 29292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54546475758598F9092797A7C171717C7C7C7 FFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434666668 8F9092737475111111DDDDDDDA8319D57501D57501ECBE86FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEEC797D57501D57501D77A08FFFFFF040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6E6E703A3B3B8F90927F8082030303DCDCDCFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4546478F90928081831F1F1FADADADFFFFFFFFFFFFFFFFFF D0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B5454558F90926F6F71111111 EFEFEFFFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6263648F90926465661E1E1EF9F9F9DB861FD57501D57501EBBB80FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDA841AD57501D57501EBBC827979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D83848648494A272727EAEAEAFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038E8F913C3D3E353535FDFDFDFFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5414142 464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168C8D8F 2F2F2F4D4D4DFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF262626939495B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B25262688898B262627616161FFFFFFEBBD84D57501D57501D98217FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CB9ED57501D57501D67702FFFDFB000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6A6B3D3D3E7E7F80161616A0A0A0FFFFFFFFFFFFFFFFFFFFFFFF E4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ACADAF030303 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010118E8F90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575859484849767778101011A9A9A9 FFFFFFFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5454647 5758596C6D6F0F0F0FBDBDBDFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF3B3C3CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5333434666668626264121212CFCFCFFFFFFFD77A09D57501D57501EEC593 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CEA4D57501D57501D57501FEFBF7040404ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909A1A2A3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D777879B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E703A3B3B7F8082181818989898FFFFFFFFFFFFFFFFFF FFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51213138A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C45464778797B111111 A4A4A4FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 494A4B5454556F6F710F0F0FD0D0D0FFFFFFFFFFFFFFFFFFFFFFFFB5B5B5373738B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5383839626364646566101010E3E3E3FFFFFFD87D0ED57501D57501 EDC28DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE9235D57501D57501E6AD66 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C4B4B4C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57677781C1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D454647272727EAEAEAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0030303 3C3D3E353535F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627737475B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5414142464647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1515152F2F2F4D4D4DFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF262626 939495B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E5C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B242425262627616161FEFEFEFFFFFFE7AE68 D57501D57501DE9133FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DABAD57501D57501 D57501FBEFE1000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7B7C7D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6A6B39393A161616909090 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4151515B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ACADAF030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51010118E8F90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575859424243101011A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C929292AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C0F0F10B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A0A1A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54546474F4F500F0F0FBDBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AFAFAF3B3C3CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58485861F1F1F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333434585859121212CFCFCFFFFFFF FCF5ECD57501D57501D57501F2D4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5DDBFD57501 D57501D57501FAECDB040404ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5090909A1A2A3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D 777879B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56E6E70373737181818 8A8A8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA101010B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B0B1B3000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51213138A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5B5C404041111111A4A4A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0D0D0242424B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59D9EA00C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5494A4B4C4C4D0F0F0FB9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB5B5B5373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58B8C8D 1B1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839585859101010CCCCCC FFFFFFFDF8F2D57501D57501D57501F1D1A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3A355D57501D57501E0973D7979794B4B4C6E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F703737383C3C3D6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F705151521212126E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 000000222223EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59595A5D5E5F6E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F702A2A2B5051526E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F704343442323246E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706D6E6F000000353535F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 3B3B3B6262646E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F701F1F205F6061 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F703636373737376E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F7068696A0000004D4D4DFAFAFAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1F1F1F6767696E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F701414146364656E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 2525254C4C4D6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70646566161616 616161FEFEFEFFFFFFFFFFFFE0983FD57501D57501E3A253FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF9EBDAD57501D57501D57501F4DAB90000006E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F700202026B6C6D6E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F701212136161626E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F7059595A050505909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E40909096E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706A6B6C0000006E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F700C0C0C6566676E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F703A3B3B000000A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC9C9C91C1C1C6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F705E5F60 0808086E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F700304046A6B6C 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F702C2C2C000000BDBDBDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF2C2C2D6E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F705353551515166E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706D6E6F0000006E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 171718030303CFCFCFFFFFFFFFFFFFF6E0C4D57501D57501D57501F8E6CFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFAEFE0D57501D57501D57501F3D6B30000006D6E6F6E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F700404046A6B6C6E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706E6F701414156060616E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F705D5E5F0707088A8A8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA040405 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706D6E6F0000006E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F700E0E0E6565666E6F706E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F70484949000000A4A4A4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD0D0D01717176E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6162630505056E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70050505 69696B6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F7039393A000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B52929296E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F706E6F705657571212126E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F700000006E6E706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F70272728000000CCCCCCFFFFFFFFFFFFF7E3CAD57501D57501D57501F7E2C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBD85D57501D57501D87D0EECEBEA4D4D4D5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C4F4F501D1D1D5B5B5B5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5454551F1F1F5A5A5A5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C575758828282FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD9D9D95050505B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5A5A5B434343 3F3F405B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C4F4F502525255B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C2D2D2DF4F4F4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C35353545B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5A5A5B3C3C3C4545455B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C4C4C4C2929295B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C525252 A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEAFAF5656575B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C3737373838385B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5A5A5B4141414444445B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5454554C4C4CFEFEFEFFFFFFFFFFFFFFFEFDD87E10D57501D57501EBBC82 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDD77B0BD57501D57501ECBF878C8C8C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C59595A3232325454545B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C59595A3737374D4D4D5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5050507B7B7BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC8080805B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5757583333335858585B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C2A2A2A 4545465B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5A5A5B323232E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F97272725B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C59595A1A1A1A5353545B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5858593E3F3F5555565B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 59595A3F3F40EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F56464645B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5353544040405B5B5B5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C1D1D1D5555555B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5858594C4C4DF0F0F0FFFFFFFFFFFFFFFFFFEEC592D57501D57501 D67805FEFCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD87E10D57501D57501EBBB81 9191915B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B595959303030535353 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5959593434344C4C4C5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B505050757575FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFDFD8282825B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5858583333335858585B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 2C2C2C4343435B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5A5A5A464646E3E3E3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA7474745B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5959591B1B1B5252525B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5858583D3D3D5555555B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B444444ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6686868 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5858581919195656565B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5757574C4C4C5A5A5A5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B3B3B3BC3C3C3FFFFFFFFFFFFFFFFFFEFC898D57501 D57501D67702FEFAF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4DAB9D57501 D57501D57501F7E2C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F7E4CDD57501D57501D57501F3D8B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E0973ED57501D57501E19B45FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE3A151D57501D57501DE9132FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE19A44D57501D57501E0983FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE4A557D57501D57501DD8D2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFBF6D77A08D57501D57501EAB97CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBB81D57501D57501D67906FEFAF4FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBC83D57501D57501D77907FDF7F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF7D87D0ED57501D57501E9B576FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECC089D57501D57501D67805FCF5ECFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAD87F11D57501D57501E8B270FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE29E4AD57501D57501DB8822 FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8B27D57501D57501 E19B45FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E5CED57501D57501 D57501EFCA9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2ABD57501 D57501D57501F5DEC1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8D4D57501 D57501D57501EEC796FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D5B1 D57501D57501D57501F4DBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1D0A7D57501D57501D57501F3D5B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF4DBBBD57501D57501D57501F0CCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDD8D2BD57501D57501DD8E2EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE09840D57501D57501DA861EFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDE9031D57501D57501DC8C29FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE19B46D57501D57501DA8319FFFEFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF7D98116D57501D57501DE9234FFFFFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0983FD57501D57501D87F11FEFAF4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEC592D57501D57501D57501F2D4AE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6DFC3D57501D57501D57501EBBB81FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC898D57501D57501D57501 F1D0A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E2C9D57501D57501D57501EAB87B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECBE86 D57501D57501D57501EFCA9DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D4AFD57501D57501 D57501EAB87AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFAF5D98014D57501D57501DB8823FEFAF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDDE9336 D57501D57501D77B0AFCF5EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFCF8D98218D57501D57501DB861FFEF9F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE DF953BD57501D57501D77907FCF3E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFAF4DA841BD57501D57501D87D0EFAEEDEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCF5ECDA841AD57501D57501D87F12FDF6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEC593D57501D57501D57501E7AE69FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFECC18BD57501D57501D57501EAB97CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC899D57501D57501D57501E6AB63FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEDC491D57501D57501D57501E9B576FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D0A8D57501D57501 D57501DD8D2CFDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBE19B45D57501D57501D57501EEC695FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCDD8F30 D57501D57501D57501EFC898FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5DDBFD67804D57501D57501DA851DFEF9F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFD DE9235D57501D57501D57501EEC592FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E0C4D67906D57501D57501DA841A FDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE4A75BD57501D57501D57501DE9234FCF5EBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAE4A456D57501D57501 D57501E09942FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF9E9D6D77A09D57501D57501D67702EFC899FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E1C7D87D0E D57501D57501D67601F4DBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBDAD77B0BD57501D57501D67601EEC694FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E3CA D87E10D57501D57501D57501F3D8B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF4DE9133D57501D57501D57501 DA861EF6DFC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBF1E5E09840D57501D57501D57501DA851DFCF3E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D1AAD67601D57501 D57501D57501E7AE69FEF9F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF0CDA1D77A09D57501D57501D57501EBBC82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D4AFD67702 D57501D57501D57501E6AC64FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1CFA5D77B0AD57501D57501D57501EAB97CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCF3E7DD8D2BD57501D57501D57501D67601E4A659F7E5CEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDF8F1ECC08AD87E10D57501D57501D57501D98115F8E8D3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEEC695D67601D57501D57501D57501DA851CEEC695FEF9F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E2C9E19C47D57501D57501D57501D57501E6AC65FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEFC99AD67702D57501D57501D57501DA841AEEC592FDF8F2FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E3CBE29E4AD57501D57501D57501D57501E5A95F FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5ECE0973ED57501D57501D57501D57501 D57501DC8A26E5AA61EBBD85EEC593EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EFCA9DF2D5B0FAEDDC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF5F7E2C9F1D1A9EFC99A EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EDC491EAB97CE29E4BD77A08D57501D57501D57501D57501 DB861FF8E8D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE8E8E8E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CFA5D77A09D57501D57501 D57501D57501D77A08E19C47E9B677EDC28DEEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC797F1CFA5 F5DEC2FEF9F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFE1F3D7B5 F0CDA1EEC796EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695ECC089E7AE68DC8B28D57501D57501D57501 D57501D57501E8B371FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D1A9D77B0BD57501 D57501D57501D57501D77907E19B45E9B576EDC28DEEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC797 F1CFA5F5DEC1FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0E2 F3D8B6F0CDA2EEC796EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695ECC08AE7AE69DC8C2AD57501D57501 D57501D57501D57501E7AF6BFFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFEFCEABA7ED67906D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501DA841BE8B270FAEDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8EFCA9C E19A43D67804D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501E2A04EFCF5EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555555E5E5EFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF8E7D2DE9133D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D67703E19A43F0CEA3FFFDFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F9E9D6E7B06DDA851DD57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D87F11F1CEA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF9E9D5DE9336D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D67702E09941F0CCA0FFFDFAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF9EAD8E8B270DB861FD57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D87E0FF0CCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBDAE5A95FD67906D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D67703 E7AE69FDF8F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFEEFCA9CD98217D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501DE9031F2D5B0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5555555E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDF0CB9EDC8C29D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501DB8823F4D9B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFBEFE1E3A253D67601D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D77A08E7AF6BFCF3E8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F89D9D9D 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9E9E9EFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF0CDA1DD8D2CD57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501DB8720F3D6B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBF0E3E4A557D67601D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D77907E7AE69FBF2E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCF5ECF0CC9FE5A85EDD8F30DA8319D77C0CD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD67703 D57501D57501D57501D57501D57501D57501DA861EF7E4CDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF3E8E09942D57501D57501D57501D57501D57501D57501 D57501D67805D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD87D0EDA861EE09941E9B678F7E2C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555555E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFEF6E2C8EAB97CE19C48DB8822D87F11D77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77A08D57501D57501D57501D57501D57501D57501D57501E7B06CFFFDFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CEA3D77B0BD57501D57501D57501D57501 D57501D57501D57501D77A09D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD98115DD8D2BE4A65AEFCA9D FDF6EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE7E7E72828282626262626262626262626262626262A2A2AEFEFEFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF7E3CAEAB97DE29D49DB8822D87F12D77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77A08D57501D57501D57501D57501D57501D57501D57501E6AD67FFFCF9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D0A7D87D0DD57501D57501D57501 D57501D57501D57501D57501D77A09D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD98115DC8C2AE4A659 EFC99BFCF5ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF1E5F1D1AAE3A150D67702D57501D57501D57501D77A09 F4DABAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EAD8DA851CD57501D57501 D57501D57501DB8924EBBC82F6E1C7FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F5050505050501A1A1A1D1D1D505050 505050757575FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF7F7E4CCEBBC82DB861FD57501D57501D57501 D57501E19C48FEFBF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9B779D57501 D57501D57501D57501D67804E3A354F1D0A7FAEEDFFFFEFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8F7E4CDEBBD84DB8721D57501D57501 D57501D57501E19A43FEFAF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEABA7E D57501D57501D57501D57501D67703E3A252F1CFA6FAEEDEFFFEFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8E8D3DF9438D57501D57501D57501D77A08F6DFC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FAECDBD98115D57501D57501D57501D98218F1CEA4FFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF898989 6D6D6D6D6D6D2424242828286D6D6D6D6D6D8E8E8EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFCF9EDC18CD77A09D57501D57501D57501E29E4AFFFEFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE9B575D57501D57501D57501D57501E3A355FAEFE0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFDFAEDC390D77B0AD57501D57501D57501E19B45FFFDFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEAB87BD57501D57501D57501D57501E3A151FAEEDEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCE7B06CD57501D57501D57501D98115FBF0E2 FFFFFFFFFFFFFFFFFFFFFFFFFDF7EFDC8A25D57501D57501D57501E09942FCF5EBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5555555E5E5EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E6D0DA851CD57501D57501D57501 E8B473FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC899D57501D57501D57501D77A08F0CDA1FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606040404040404040404040404040404070707 ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8D3DB861FD57501D57501 D57501E7B06DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0CB9ED57501D57501D57501D77907EFCA9D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9B474D57501D57501D57501E09942FFFFFEFFFFFFFFFFFFFFFFFFE4A557D57501D57501D57501 E3A150FFFCF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF555555 5E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFAEDDDDA841BD57501D57501D67601F4DBBBFFFFFFFFFFFFFFFFFFF8E8D3D77A08D57501 D57501D77A09F4DBBCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCBFBFBFBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDC1C1C1FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAEFE0DA861ED57501D57501D57501F3D8B6FFFFFFFFFFFFFFFFFFF9EAD7D77B0A D57501D57501D77A08F4D9B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE3A150D57501D57501D57501F0CB9EFFFFFFFFFFFF F2D5B0D57501D57501D57501DF9438FEFCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF595959626262FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E3CBD77A08D57501D57501DB8721FEFCF8 FFFFFFFFFFFEDE9336D57501D57501D67601F2D2ABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E6CFD77A09D57501D57501DA851D FEFBF6FFFFFFFFFFFFDF953BD57501D57501D57501F1CFA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF6EED98218 D57501D57501DA841AFEFAF5FFFDFADB8822D57501D57501D87E0FFBEFE1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECC18BD57501D57501D57501ECC18BFFFFFFF0CDA1D57501D57501D57501E7B06CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEDC491D57501D57501D57501EBBD85FFFFFFF1D0A7D57501D57501D57501E6AD66FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1CEA4D57501D57501D57501EEC694F0CB9ED57501D57501D57501 EEC694FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCDD8D2CD57501D57501D98217FEFAF5DC8A25D57501 D57501DA841BFEFAF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDDE9031D57501D57501D98014FEFAF4DC8C2A D57501D57501D98217FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDD8E2DD57501D57501 DC8A25DD8D2CD57501D57501DB8924FFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D5B0D57501 D57501D57501E3A151D57501D57501D57501EFCA9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D8B6 D57501D57501D57501E3A151D57501D57501D57501EEC796FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF0CC9FD57501D57501D57501D57501D57501D57501EEC797FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFEDC8A25D57501D57501D57501D57501D57501DA8319FFFCF9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8C2AD57501D57501D57501D57501D57501D98115FEFBF7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF5D77C0CD57501D57501D57501D57501 D77A09FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECBE86D57501D57501D57501 D57501D57501E9B677FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC18CD57501D57501 D57501D57501D57501E8B371FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E4A557D57501D57501D57501D57501E3A252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFAECDBD57501D57501D57501D57501D57501F7E5CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFBEFE1D57501D57501D57501D57501D57501F6E2C8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCA9CD57501D57501D57501D57501EFC899FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB8720D57501D57501D57501D98116FFFFFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8A26D57501D57501D57501D87F11 FFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E9D6D57501D57501 D57501D57501F8E8D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A65A D57501D57501D57501E3A04FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E5A960D57501D57501D57501E29D49FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFEFCD77A08D57501D57501D77907FFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFECC089D57501D57501D57501EABA7EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC38FD57501D57501D57501E9B678FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8A25D57501D57501DB8823FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D1AAD57501D57501D57501 F0CC9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D5B0D57501D57501 D57501EFC899FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E0973ED57501D57501DF963CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6DFC3D57501D57501D57501F4D9B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7E2C9D57501D57501D57501F3D6B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE29E4AD57501D57501E19C47FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E5CED57501D57501D57501F6DFC3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8D4D57501D57501D57501F5DCBDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8D3F5DDBFF5DDBF F8E7D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF4F5DDBF F5DDBFF5DDBFFDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF6 F5DDBFF5DDBFF5DDBFFDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DDDDDDE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6CBCBCBDEDEDE E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6DEDEDECBCBCBE6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C1C1C1E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E69F9F9FE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6A9A9A9E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6C4C4C4E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E5E5E5E3E3E3E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C0C0C0E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6CACACAE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC9C9C9E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 BCBCBCE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D1D1D1E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E4E4E4E4E4E4E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6BCBCBCE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 C7C7C7E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6DADADAE6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6DCDCDCE1E1E1E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C3C3C3E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEEEEEEE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6BDBDBDE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E3E3E3E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6BFBFBFE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6C5C5C5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6DADADA E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C2C2C2E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD9D9D9191919141414141414141414141414141414141414141414 1414141414140F0F0F070707101010141414141414141414141414141414141414141414141414 121212080808121212141414141414141414141414141414141414141414141414141414050505 0000001212121414141414141414141414141414141414141414141414140505050B0B0B131314 141414141414141414141414141414141414141414141414060606070707131313141414141414 1414141414141414141414141414141414140E0E0E070707121212141414141414141414141414 141414141414141414141414121212131313010101141414141414141414141414141414141414 1414141414141313130B0B0B000000131313141414141414141414141414141414141414141414 1414140101010A0A0A141414141414141414141414141414141414141414141414141414000000 0000000C0C0C141414141414141414141414141414141414141414141414020202060606101010 141414141414141414141414141414141414141414141414101010000000515151FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7676761B1B1B141414141414141414141414141414 1414141414141414141414140303030B0B0C121213141414141414141414141414141414141414 1414141414140000000505060B0B0B141414141414141414141414141414141414141414141414 0707070707070F0F0F141414141414141414141414141414141414141414141414111111131313 0202021414141414141414141414141414141414141414141414141313130C0C0C000000131313 141414141414141414141414141414141414141414141414030303000000101010141414141414 141414141414141414141414141414141414010101090909111111141414141414141414141414 141414141414141414141414000000060606111111141414141414141414141414141414141414 141414141414111111131314020202141414141414141414141414141414141414141414141414 1313130808080B0B0B141414141414141414141414141414141414141414141414141414070707 000000121212141414141414141414141414141414141414141414141414040404000000FAFAFA FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF000000121212141414141414141414 1414141414141414141414141414140202020B0B0B121212141414141414141414141414141414 1414141414141414140000000707070B0B0B141414141414141414141414141414141414141414 141414090909121212030303141414141414141414141414141414141414141414141414121212 1313130101011414141414141414141414141414141414141414141414141313130B0B0B000000 1313131414141414141414141414141414141414141414141414140202020A0A0B141414141414 1414141414141414141414141414141414141414140808080000000E0E0E141414141414141414 1414141414141414141414141414140101010D0D0E070707141414141414141414141414141414 1414141414141414140E0E0E0808080E0E0E141414141414141414141414141414141414141414 141414131313111111000000141414141414141414141414141414141414141414141414141414 060606000000121212141414141414141414141414141414141414141414141414000000000000 D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D91717178B8C8EC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A70C0C0C797A7BC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1818183A3B3BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4373738171718B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4555556101011B8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4767678 070707A2A3A5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A1A2A30B0B0B6E6F70 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B3B3B5121212535455C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C22122222A2B2BB9BABCC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C44D4E4E0E0E0EB5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C46B6C6D0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C48B8C8D0808088F9092C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC 313132282829787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF767676252525BDBEC0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C44C4D4D141414BABBBDC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F70080808949596C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C49A9B9C0A0A0A797A7BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4AEAFB00F0F0F5B5C5DC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 BDBEC01C1C1C313131BBBCBEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4454546 101011A9AAACC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46363640B0C0CB3B4B6 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4848586070707979899C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ABACAE0E0E0E535354C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B9BABC181919434444C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C42C2C2D202021B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C488888A0F0F10000000F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A242425 B1B2B4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4515153121212B9BABCC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4737375070707919293C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49FA0A10A0B0B656566C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4B0B1B3111111575758C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BFC0C21F1F202D2D2EBABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 4B4B4C0F0F0FB7B8BAC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C468696A0A0A0A A0A1A2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488898B0708087F8081C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ADAEB0101010515252C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BABBBD1B1B1B404041BFC0C2C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C43030311E1E1EB3B4B6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C48C8C8E0F0F0F000000F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9 171717797A7BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB0C0C0C6B6B6C C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BCBCBE1818183B3B3CBEBFC1C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4373738181818B0B1B3C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555556101011A9AAACC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47676780707078F8F91C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4A5A6A70B0B0B636364C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B3B3B5 121212545455C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C22122222B2B2C B9BABCC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C44D4E4E0E0E0EA5A6A8C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6C6D0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48B8C8D0808087C7D7EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4B9BABC3131323B3B3C49494B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF767676252525B3B4B6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C44C4D4D 141414ADAEB0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F70080808949596 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49B9C9E0A0A0A6B6B6CC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4AEAFB00F0F0F5C5C5DC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BDBEC01C1C1C313132BBBCBEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4454546101011A9AAACC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C46363640B0C0CA2A3A5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4848586 070707838485C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ADAEB00E0E0E545555 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE181919434444C0C1C3C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C42C2C2D202121B5B6B8C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488888A0F0F10717273060606F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7A7A7A242425B1B2B4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 515153121212ABABADC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4737375070707 919293C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49FA0A10A0B0B656667C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B0B1B3111111575858C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C21F1F202D2E2EBABBBDC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C44B4B4C0F0F0FA7A8A9C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C468696A0A0A0AA0A1A2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 88898B0708087F8081C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B0B1B2101010 4D4E4EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BABBBD1B1B1B404142BFC0C2 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43030311E1E1FB3B4B6C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48C8C8E0F0F0F6F6F710A0A0AF0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF03030368696A7F80817F80817F80817F80817F80817F80817F8081 7F80817F80810000005A5B5C7F80817F80817F80817F80817F80817F80817F80817F80817F8081 3838392B2B2C7F7F817F80817F80817F80817F80817F80817F80817F80817F80812B2B2C0B0B0B 7B7C7D7F80817F80817F80817F80817F80817F80817F80817F80815F6060040404797A7B7F8081 7F80817F80817F80817F80817F80817F80817F80817778790000007373747F80817F80817F8081 7F80817F80817F80817F80817F80817F80810000005353547F80817F80817F80817F80817F8081 7F80817F80817F80817777780000004444457F80817F80817F80817F80817F80817F80817F8081 7F80817E7E7F0E0E0E1C1D1D7D7E7F7F80817F80817F80817F80817F80817F80817F80817F8081 57575702020279797A7F80817F80817F80817F80817F80817F80817F80817F8081484849000000 7677787F80817F80817F80817F80817F80817F80817F80817F80817777780000006C6C6E7F8081 7F80817F80817F80817F80817F80817F80817F80817D7E7F2D2D2E3B3B3C8D8E904A4A4B797979 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1A1A11313137C7C7E7F80817F80817F80817F80817F8081 7F80817F80817F80815757580707077A7B7C7F80817F80817F80817F80817F80817F80817F8081 7F80815455560000007475767F80817F80817F80817F80817F80817F80817F80817F80817B7C7D 0000005A5B5C7F80817F80817F80817F80817F80817F80817F80817F80817575760000004C4C4D 7F80817F80817F80817F80817F80817F80817F80817F80817D7E7F0909092223237E7F807F8081 7F80817F80817F80817F80817F80817F80817F8081313132040405797A7B7F80817F80817F8081 7F80817F80817F80817F80817F808163636400010178787A7F80817F80817F80817F80817F8081 7F80817F80817F80817475760000007071727F80817F80817F80817F80817F80817F80817F8081 7F80817777780000004444457F80817F80817F80817F80817F80817F80817F80817F80817F8081 2526263434357F80817F80817F80817F80817F80817F80817F80817F80817F8081212122131313 7C7D7E7F80817F80817F80817F80817F80817F80817F80817F80818283840F0F107172738F9092 060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5353531313137C7D7E808182808182808182808182 8081828081828081828081825A5B5B0606067B7C7D808182808182808182808182808182808182 808182808182575859000000747576808182808182808182808182808182808182808182808182 6F7071000000555657808182808182808182808182808182808182808182808182767677000000 4848498081828081828081828081828081828081828081828081827E7F800C0C0C1F20207F7F81 808182808182808182808182808182808182808182808182545555040404797A7B808182808182 808182808182808182808182808182808182494A4B00000078787A808182808182808182808182 808182808182808182808182626363000000707071808182808182808182808182808182808182 8081828081827E7F801A1A1A3E3E3F808182808182808182808182808182808182808182808182 7B7C7D0202023232337F80818081828081828081828081828081828081828081828081821C1C1C 1111127C7D7E8081828081828081828081828081828081828081828081827F7F810F0F0F6F6F71 8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9191910909093F40413F40413F4041 3F40413F40413F40413F40413F40413F40411213130000003A3A3B3A3A3B37373839393A3F4041 3F40413F40413F40413F404122222200000039393A3A3A3B3738393838393F40413F40413F4041 3F40413F40413F40410000003637383A3A3B39393A3535363F40413F40413F40413F40413F4041 3F40410000002D2D2E3A3A3B3A3A3B3434353E3E3F3F40413F40413F40413F40413F4041050505 1F1F203A3A3B3A3A3B3535363D3D3E3F40413F40413F40413F40413F40410404040000003A3A3B 3A3A3B3636373A3B3C3F40413F40413F40413F40413F40411010100000003A3A3B3A3A3B383839 3737383F40413F40413F40413F40413F40412121220000003A3A3B3A3A3B38383A3636373F4041 3F40413F40413F40413F40413535360000002C2D2D3A3A3B3A3A3B3434353F40413F40413F4041 3F40413F40413A3A3B0101012E2E2F3A3A3B3A3A3B3535363D3D3E3F40413F40413F40413F4041 3B3C3D0202020F0F0F3A3A3B3A3A3B3536373C3C3D3F40413F40413F40413F40413E3F40020202 1E1E1F8F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000003B3C3D3F4041 3F40413F40413F40413F40413F40413F40413F40413737380000003131323A3A3B3A3A3B343435 3F3F403F40413F40413F40413F404138393A0404042B2B2C3A3A3B3A3A3B3435363E3E3F3F4041 3F40413F40413F40413D3D3E0000000000003A3A3B3A3A3B3636373B3B3C3F40413F40413F4041 3F40413F40410B0B0B0000003A3A3B3A3A3B3738393838393F40413F40413F40413F40413F4041 1A1A1B0000003A3A3B3A3A3B3838393637383F40413F40413F40413F40413F4041333334000000 3334343A3A3B3A3A3B3434353F40413F40413F40413F40413F404139393A0000002A2A2B3A3A3B 3A3A3B3535363D3D3E3F40413F40413F40413F40413B3B3C0404041A1A1B3A3A3B3A3A3B353636 3C3D3D3F40413F40413F40413F40413F40410B0B0B0000003A3A3B3A3A3B3637383A3A3B3F4041 3F40413F40413F40413F40412020210000003A3A3B3A3A3B38383A3636373F40413F40413F4041 3F40413F404138393A0000003839393A3A3B39393A3536363F40413F40413F40413F40413F4041 3F40410000005051528F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000003D3D3E 3E3F403E3F403E3F403E3F403E3F403E3F403E3F403E3F403737380000002F2F3039393A39393A 3334353D3E3E3E3F403E3F403E3F403E3F4038393A0404052A2A2B39393A39393A3434353C3D3E 3E3F403E3F403E3F403E3F403C3C3D00000000000039393A39393A3636373A3A3B3E3F403E3F40 3E3F403E3F403E3F400D0D0D00000039393A39393A3737383737383E3F403E3F403E3F403E3F40 3E3F401D1D1E00000039393A39393A3838383636373E3F403E3F403E3F403E3F403E3F40333334 0000002D2E2E39393A39393A3333343E3F403E3F403E3F403E3F403E3F403E3F400000002C2D2D 39393A39393A3435353C3C3D3E3F403E3F403E3F403E3F403A3A3B02020225252539393A39393A 3535363B3B3C3E3F403E3F403E3F403E3F403E3E3F00000000000039393A39393A363637383939 3E3F403E3F403E3F403E3F403E3F402A2A2B00000039393A39393A3838393536373E3F403E3F40 3E3F403E3F403E3F402F303000000038383939393A3838393535363E3F403E3F403E3F403E3F40 3E3F403636370000006767698F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B19191AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51313138F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F306768698F90928F9092060606F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E 757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D 2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 18181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F9092 4A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162 383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232676869 8F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636 6465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546 404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 8F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606 F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142 444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A 1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F9092 0A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788272828 8F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F9092 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D 303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727 656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092000000F5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 79797B191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D727374B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171718 88888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687881D1D1E8F90928F9092474748 323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5070707A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5191919797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383839 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313138F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262626656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52627276768698F9092 7E7F81000000D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51B1B1B757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768 333333B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51515168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B646566 8F90928B8C8D060606AFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8687882324248F90924747480707076A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1B797A7BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5606162383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52D2D2E6768697E7F810D0D0D030303F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606 ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D757677B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5666768333333B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 8B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232326465668081830F0F0F020202F0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F 48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882525254747480A0A0A404142797979FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1B 797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383839B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657 313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2F2F6364650D0D0E323333060606F5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333336061620F0F0F3030300A0A0A F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D575859A9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAAC4D4D4E464647A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAAC777879181818A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAAC030303A7A8AAA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC0B0B0B 9A9B9CA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC1C1D1D707172A9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC4344443D3D3EA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC696A6B2E2E2FA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAAC98999B080808A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAAC0B0B0B939495A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAAC171717868688A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC2B2B2B 5C5D5EA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC8485860F0F0F0A0A0A 7A7A7C4A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000A8A9ABA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC070707A1A2A3A9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAAC181919777879A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAAC39393A464647A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC 5F5F61353636A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC8D8E900D0D0D A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC0808089A9B9CA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC1212138D8D8FA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC252526636465A9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAAC5354542E2E2FA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAAC7D7E80202020A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A5A6A8000000A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC2A2A2B 0606063233338F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF040404A8A9ABAAABADAAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABAD0909099D9D9FAAABADAAABADAAABADAAABAD AAABADAAABADAAABADAAABADAAABAD1B1B1B737475AAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABADAAABAD3F4040414242AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABAD656666313132AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD949597 0A0A0AAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD0A0A0A969698 AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD151515898A8BAAABADAAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABAD29292A5F6061AAABADAAABADAAABADAAABAD AAABADAAABADAAABADAAABADAAABAD5A5A5C2A2A2AAAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABADAAABAD8283841C1C1CAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABAD000000AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD 2C2C2C0707073030308F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF868686000000 030304030304030304030304030304030304030304030304030304000000000000030303030303 030303030303030304030304030304030304030304000000000000030303030303030303030303 030304030304030304030304030304010101040404010202030303030303030303030304030304 030304030304030304030303070707000000030303030303030303030304030304030304030304 030304030303060606000000030303030303030303030304030304030304030304030304030304 000000000000030303030303030303030303030304030304030304030304030304000000000000 030303030303030303030303030304030304030304030304030304000000010101030303030303 030303030303030304030304030304030304030304020202080808000000030303030303030303 030304030304030304030304030304030303080808000000030303030303030303030304030304 030304030304030304030303020202000000030303030303030303030304030304030304030304 0303040303040000000202028586888F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 020202030303030304030304030304030304030304030304030304030304020202060606000000 030303030303030303030304030304030304030304030304030303070707000000030303030303 030303030304030304030304030304030304030304000000000000030303030303030303030303 030304030304030304030304030304000000000000030303030303030303030303030304030304 030304030304030304000000000000030303030303030303030303030304030304030304030304 030304010102070707000000030303030303030303030304030304030304030304030304030303 080808000000030303030303030303030304030304030304030304030304030303040404000000 030303030303030303030304030304030304030304030304030304000000000000030303030303 030303030303030304030304030304030304030304000000000000030303030303030303030303 030304030304030304030304030304020202020202030303030303030303030303030304030304 0303040303040303040303030000002C2C2D8F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF040404020202030303030303030303030303030303030303030303030303020202060606 000000030303030303030303030303030303030303030303030303020202070707000000030303 030303030303030303030303030303030303030303030303000000000000030303030303030303 030303030303030303030303030303030303000000000000030303030303030303030303030303 030303030303030303030303000000000000030303030303030303030303030303030303030303 030303030303010101070708000000030303030303030303030303030303030303030303030303 030303080808000000030303030303030303030303030303030303030303030303030303020202 000000030303030303030303030303030303030303030303030303030303000000000000030303 030303030303030303030303030303030303030303030303020202000000030303030303030303 030303030303030303030303030303030303000000020202030303030303030303030303030303 0303030303030303030303030202020000003F40418F90928F90920A0A0AF0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B 181818B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101A9AAAC B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6D2E2F2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515161688888A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050505A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D 49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183 212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092 060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 404142444445B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5969799090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5C5D2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 87888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F9092 8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F 737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788 2728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAF B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E 757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D 2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 18181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F9092 4A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161 383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232676869 8F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636 6465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546 404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 8F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606 F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142 444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A 1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F9092 0A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1D737375 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B517181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687881F1F1F 8F90928F90924C4D4E505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070708A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51919197A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5606161383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F9092 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313138F8F91B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262626656667B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2828296768698F90928F9092060606CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51515168B8C8DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52D2D2D6465668F90928F9092080808C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51D1D1E737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D 2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58687882222238F9092656667050505595959FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191A1A7A7A7CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2C6768698B8C8D222222050505F2F2F2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D757677 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53030306465668B8C8E242525050505ECECECFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 79797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181818 88888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788252525656667050506363737 797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51A1A1A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2F2F666768222223 1B1B1B050505F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768 333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333636365 25252619191A090909F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B19191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1E1E1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54445463F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F2F30B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8687881717170505066263644A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3C484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5606161373839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657303031B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2D19191A1B1B1B8D8E90060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF050505 ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D757677B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5666768333333B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 8B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2B2C2CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53131311B1C1C19191A8C8D8F0A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343000000161616161616161616161616161616161616161616161616161616020202 000000161616161616161616161616161616161616161616161616161616080808000000161616 161616161616161616161616161616161616161616161616161616000000121212161616161616 1616161616161616161616161616161616161616160404040C0C0C161616161616161616161616 161616161616161616161616161616070707000000161616161616161616161616161616161616 161616161616161616000000000000161616161616161616161616161616161616161616161616 1616160A0A0A0000001616161616161616161616161616161616161616161616161616160F0F10 000000161616161616161616161616161616161616161616161616161616161616060606080808 161616161616161616161616161616161616161616161616161616080808020202161616161616 161616161616161616161616161616161616161616020202000000161616161616161616161616 1616161616161616161616161616160000000000007172738F90924A4A4B797979FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000151516161616161616161616161616161616161616161616161616 1616160101010F0F0F161616161616161616161616161616161616161616161616161616080808 000000161616161616161616161616161616161616161616161616161616000000000000161616 161616161616161616161616161616161616161616161616030303000000161616161616161616 1616161616161616161616161616161616160A0A0A000000161616161616161616161616161616 1616161616161616161616161414150404040C0C0C161616161616161616161616161616161616 161616161616161616070707050506161616161616161616161616161616161616161616161616 161616040404000000161616161616161616161616161616161616161616161616161616000000 0000001616161616161616161616161616161616161616161616161616160D0D0E000000161616 161616161616161616161616161616161616161616161616151515000000161616161616161616 1616161616161616161616161616161616161515160000002F30308D8E908F9092060606F5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000141414171717171717171717171717171717171717171717 1717171616160303030E0E0E161617171717161617171717171717171717171717171717161617 080808000000161617171717161617171717171717171717171717171717171717000000000000 161617171717161617171717171717171717171717171717171717060606000000161617171717 1717171617171717171717171717171717171717170D0D0D000000161617171717171717161617 1717171717171717171717171717171717170505050A0A0A171717171717161617171717171717 171717171717171717171717070707040404161617171717161617171717171717171717171717 171717171717030303000000161617171717161617171717171717171717171717171717171717 000000000000161617171717161617171717171717171717171717171717171717121212000000 161617171717171717161617171717171717171717171717171717141415000000161617171717 1717171616171717171717171717171717171717171616160000002F2F2F8D8E908F90920A0A0A F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D464748898A8C898A8C898A8C898A8C898A8C 898A8C898A8C898A8C898A8C3E3E3F2A2B2B898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C898A8C6161620D0D0D898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C01010188898A898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C060606 7A7B7B898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C161616585858898A8C 898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C3637372F3030898A8C898A8C898A8C 898A8C898A8C898A8C898A8C898A8C898A8C5556571A1A1B898A8C898A8C898A8C898A8C898A8C 898A8C898A8C898A8C898A8C7B7C7E040404898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C898A8C898A8C090909777879898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C111111666668898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C222222 4A4B4B898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C6B6C6D2525258F9092 8F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000089898B898A8C898A8C898A8C 898A8C898A8C898A8C898A8C898A8C898A8C030303808182898A8C898A8C898A8C898A8C898A8C 898A8C898A8C898A8C898A8C121213616163898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C898A8C303031363637898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C 4D4D4E252525898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C737375080808 898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C0707077D7E7F898A8C 898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C0E0E0E737374898A8C898A8C898A8C 898A8C898A8C898A8C898A8C898A8C898A8C1D1D1D4B4B4B898A8C898A8C898A8C898A8C898A8C 898A8C898A8C898A8C898A8C444445252525898A8C898A8C898A8C898A8C898A8C898A8C898A8C 898A8C898A8C656668151516898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C 868789000000898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C898A8C292929 6768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000088898A898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B0606067F7F81898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B1616165D5E5E898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B333434313132898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B515252222223898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B78787A 030303898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B08080879797B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B0E0E0F69696A898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B2020214D4D4E898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B48494A1E1E1E898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B68696B0E0E0E898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B000000898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 2C2C2D6465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B 1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAAC B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D 49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183 212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092 060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 87888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F9092 8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F 737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788 2728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAF B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E 757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D 2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 18181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F9092 4A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161 383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232676869 8F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636 6465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1D1E737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546 404041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58687882020218F90928F90924A4A4B636363FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070808A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51919197A7A7CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5606161383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313 8F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262626656667B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B529292A6768698F90928F9092030303F4F4F4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1C757677B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1516168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52E2E2E6465668F90928F9092070707DDDDDDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882121228F90927677790A0A0A494949FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 19191A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383839B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262626656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2C6768698F90923C3C3D050506 EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C1C1C757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142 444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5C5D2C2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A 1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F306465668F90923F3F40 060606E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788252525 7475770707072D2D2E797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F9092 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2E2F2F676869363637111111050505F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B533333364656639393A101010080808F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B191A1AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54445463F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D 2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0D0D959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58687881B1B1B0707074F50504A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7A7A7CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D48494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161373839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627 656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657303131B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2E2F2C2D2D11111187888A060606F5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF050505ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D757677 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444445B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333333B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232332F2F301010108586880A0A0AF0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF414141000000333334333334333334333334333334333334333334 3333343333340E0E0E000000323333333333333333333333333334333334333334333334333334 1A1A1A000000323233333333333333333333333334333334333334333334333334313132000000 2C2C2D333333333333333333333334333334333334333334333334333334000000232323333333 333333333333333334333334333334333334333334333334070708050505333333333333333333 333334333334333334333334333334333334030303000000323333333333333333333333333334 3333343333343333343333341A1A1B000000323233333333333333333333333334333334333334 333334333334282828000000323233333333333333333333333334333334333334333334333334 3333330303031E1E1E333333333333333333333334333334333334333334333334333334070707 141414333333333333333333333334333334333334333334333334333334020202000000323333 3333333333333333343333343333343333343333343333340E0E0E0000005C5D5E8F90924A4A4B 797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000323232333334333334333334333334333334 333334333334333334333333000000282828333333333333333333333334333334333334333334 3333343333340808080B0B0B333333333333333333333334333334333334333334333334333334 000000000000323333333333333333333333333334333334333334333334333334131313000000 323333333333333333333333333334333334333334333334333334242424000000323233333333 333333333333333334333334333334333334333334323232000000232324333333333333333333 333334333334333334333334333334333334050505191A1A333333333333333333333334333334 333334333334333334333334050505000000333333333333333333333334333334333334333334 333334333334050505000000323333333333333333333333333334333334333334333334333334 222222000000323233333333333333333333333334333334333334333334333334303030000000 32323333333333333333333333333433333433333433333433333433333400000016161688898B 8F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000002F3030333434333434333434333434 333434333434333434333434333434000000252626333334333334333334333434333434333434 333434333434333434080808080808333334333334333334333434333434333434333434333434 333434000000000000333333333334333334333434333434333434333434333434333434161616 000000333333333334333334333334333434333434333434333434333434262626000000323333 333334333334333334333434333434333434333434333434333334020202202020333334333334 333334333434333434333434333434333434333434060606171717333334333334333334333434 333434333434333434333434333434030404000000333334333334333334333434333434333434 3334343334343334340D0D0D000000323333333334333334333334333434333434333434333434 333434292929000000323333333334333334333334333434333434333434333434333434313232 000000323333333334333334333334333434333434333434333434333434333334000000232324 87888A8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D373738656667656667 656667656667656667656667656667656667656667313132171717656667656667656667656667 6566676566676566676566676566674C4D4E060606656667656667656667656667656667656667 656667656667656667656667000000646466656667656667656667656667656667656667656667 6566676566670202025A5A5C656667656667656667656667656667656667656667656667656667 1010103F3F406566676566676566676566676566676566676566676566676566672B2B2B171717 6566676566676566676566676566676566676566676566676566674142420D0D0D656667656667 6566676566676566676566676566676566676566675B5C5C000000656667656667656667656667 6566676566676566676566676566676566670303035C5C5D656667656667656667656667656667 6566676566676566676566670A0A0A4A4B4C656667656667656667656667656667656667656667 6566676566671A1A1A303131656667656667656667656667656667656667656667656667656667 5455562222238F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000646566 6566676566676566676566676566676566676566676566676566670000005D5D5E656667656667 6566676566676566676566676566676566676566670F0F0F4C4C4D656667656667656667656667 65666765666765666765666765666725252519191A656667656667656667656667656667656667 6566676566676566673C3D3E161717656667656667656667656667656667656667656667656667 656667565657010101656667656667656667656667656667656667656667656667656667656667 0202026162636566676566676566676566676566676566676566676566676566670606065A5A5C 6566676566676566676566676566676566676566676566676566671515163E3E3E656667656667 656667656667656667656667656667656667656667353636151515656667656667656667656667 6566676566676566676566676566674A4B4C080808656667656667656667656667656667656667 656667656667656667636364000000656667656667656667656667656667656667656667656667 6566676566671C1C1C6768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 636465646466646466646466646466646466646466646466646466646466000000606162646466 64646664646664646664646664646664646664646664646611111149494A646466646466646466 6464666464666464666464666464666464662828281F1F1F646466646466646466646466646466 6464666464666464666464663F3F40131313646466646466646466646466646466646466646466 646466646466575859000000646466646466646466646466646466646466646466646466646466 6464660101015C5D5E646466646466646466646466646466646466646466646466646466090909 4D4D4E6464666464666464666464666464666464666464666464666464661818183B3B3C646466 6464666464666464666464666464666464666464666464663939390B0B0B646466646466646466 6464666464666464666464666464666464664D4D4D060606646466646466646466646466646466 646466646466646466646466646466000000646466646466646466646466646466646466646466 6464666464666464662323236465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F 48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C 797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657 313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0A F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D 5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F9092 8F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232 6768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5969799 0B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B 1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAAC B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20727374B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D 49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383939B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183 212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092 060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 87888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F9092 8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F20 727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788 2728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5606162383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAF B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58687882323238F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A797A7B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383839B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B509090A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2D2D6768698F90928F9092000000F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D 757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333333B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D 2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53131326465668F90928F9092090909F0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E727374B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 17181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687881F20208F90927F8081 111112202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070708A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B519191A797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162 383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313138F8F91B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262626656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929676869 8F90924444450D0D0DE9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51B1C1C757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 666768333333B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2D2E 6465668F9092525354050505D0D0D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546 404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58687882525257B7C7E0B0B0B262627797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1B797A7BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5606162383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314 8F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52E2F2F6768694546470A0A0A020202F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D757677B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B533333364656648494A090909060606F0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F727374B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54445463F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6D2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687881E1E1E0B0B0B39393A4A4A4B797979FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1A1A1B797A7BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D48494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606162383839B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 555657303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2F2F3B3C3D0A0A0A7A7B7D060606 F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF050505ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142 434445B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333333B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A 1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333333E3E3F09090979797B 0A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D000000484849484849484849484849 484849484849484849484849484849161616000000474748484849484849484849484849484849 484849484849484849282828000000464748484849484849484849484849484849484849484849 4848494848490000003F4041484849484849484849484849484849484849484849484849484849 0000003434354848494848494848494848494848494848494848494848494848490707070F0F0F 474848484849484849484849484849484849484849484849484849090909000000474848484849 484849484849484849484849484849484849484849242425000000464748484849484849484849 4848494848494848494848494848493A3B3C000000464748484849484849484849484849484849 4848494848494848494848490101012E2E2E484849484849484849484849484849484849484849 484849484849050606222223474848484849484849484849484849484849484849484849484849 0202020000004748484848494848494848494848494848494848494848494848491C1C1C000000 4040428F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000464748484849484849 484849484849484849484849484849484849484849000000393A3A484849484849484849484849 484849484849484849484849484849080808151515474849484849484849484849484849484849 484849484849484849000000000000484849484849484849484849484849484849484849484849 4848491E1E1E000000474748484849484849484849484849484849484849484849484849333434 000000464748484849484849484849484849484849484849484849484849484849000000343535 484849484849484849484849484849484849484849484849484849040404282829474849484849 484849484849484849484849484849484849484849050505040404474848484849484849484849 4848494848494848494848494848490D0D0E000000474848484849484849484849484849484849 484849484849484849313132000000464748484849484849484849484849484849484849484849 484849464647000000464647484849484849484849484849484849484849484849484849484849 0000000000007B7C7E8F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000043444449494A 49494A49494A49494A49494A49494A49494A49494A49494A000000363737484949484949484949 49494A49494A49494A49494A49494A49494A07070713131348484948494948494949494A49494A 49494A49494A49494A49494A02020300000048484948494948494948494949494A49494A49494A 49494A49494A22232300000047474848494948494948494949494A49494A49494A49494A49494A 38383900000047474848494948494948494949494A49494A49494A49494A49494A49494A000000 31313248494948494948494949494A49494A49494A49494A49494A49494A050505252526484849 48494948494948494A49494A49494A49494A49494A49494A040404010101484849484949484949 48494A49494A49494A49494A49494A49494A12121200000048484948494948494948494949494A 49494A49494A49494A49494A39393900000047474848494948494948494949494A49494A49494A 49494A49494A48484900000047474848494948494948494949494A49494A49494A49494A49494A 49494A0000000000007B7C7D8F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 252526404041404041404041404041404041404041404041404041404041202121020202404041 404041404041404041404041404041404041404041404041303030000000404041404041404041 4040414040414040414040414040414040414040410000003E3E40404041404041404041404041 404041404041404041404041404041000000353636404041404041404041404041404041404041 4040414040414040410A0A0A2E2E2E404041404041404041404041404041404041404041404041 404041202021000000404041404041404041404041404041404041404041404041404041292929 000000404041404041404041404041404041404041404041404041404041393939000000404041 4040414040414040414040414040414040414040414040414040410101013C3C3D404041404041 40404140404140404140404140404140404140404103030339393A404041404041404041404041 4040414040414040414040414040411313132C2C2C404041404041404041404041404041404041 40404140404140404139393A2020208F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0000003F4040404041404041404041404041404041404041404041404041404041000000 3D3D3E4040414040414040414040414040414040414040414040414040410A0A0A383839404041 4040414040414040414040414040414040414040414040411C1D1D090909404041404041404041 404041404041404041404041404041404041262626030303404041404041404041404041404041 404041404041404041404041353536000000404041404041404041404041404041404041404041 4040414040414040410000003C3D3D404041404041404041404041404041404041404041404041 4040410303033A3A3C404041404041404041404041404041404041404041404041404041101111 303031404041404041404041404041404041404041404041404041404041252626010101404041 4040414040414040414040414040414040414040414040412E2F2F000000404041404041404041 4040414040414040414040414040414040413E3E3F0000003E3F40404041404041404041404041 4040414040414040414040414040411111115E5F608F90928F9092060606F5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000003E3F3F3F40403F40403F40403F40403F40403F40403F40403F40403F4040 0000003C3D3D3F40403F40403F40403F40403F40403F40403F40403F40403F40400B0B0B373737 3F40403F40403F40403F40403F40403F40403F40403F40403F40401E1F1F0202023F40403F4040 3F40403F40403F40403F40403F40403F40403F40402727280101013F40403F40403F40403F4040 3F40403F40403F40403F40403F40403737380000003F40403F40403F40403F40403F40403F4040 3F40403F40403F40403F40400000003C3C3C3F40403F40403F40403F40403F40403F40403F4040 3F40403F40400404043030313F40403F40403F40403F40403F40403F40403F40403F40403F4040 1212122D2E2E3F40403F40403F40403F40403F40403F40403F40403F40403F4040272728000000 3F40403F40403F40403F40403F40403F40403F40403F40403F40403030310000003F3F403F4040 3F40403F40403F40403F40403F40403F40403F40403F40400000003F40403F40403F40403F4040 3F40403F40403F40403F40403F40403F40401A1A1A6465668F90928F90920A0A0AF0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 79797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181818 88888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B 797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F9092 8F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768 333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C98999AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636646566 8F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606 ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 8B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F 48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B 7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657 313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0A F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D 5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F9092 8F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232 6768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5969799 0B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B 1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAAC B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882425258F90928F90924A4A4B797979 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1A1A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D 49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183 212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2E2F6768698F90928F9092 060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 87888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333336465668F9092 8F9092090909F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D 737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B517171888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788 1E1E1F8F90928B8C8E2A2A2B1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070708A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51819197A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5606161383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313138F8F91B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262626656667B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52828286768698F9092757678030303C3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAF B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C757677B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51515168B8C8D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2C6465668F9092767779040404BABABAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181888888AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5868788252525898A8C1D1D1E181919787878FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1A7A7A7C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2F2F676869646566050505000000F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D 757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D 2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333646566666768050506020202F0F0F0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4F4F484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B579797B1A1A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F737375B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404041B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 18181888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52C2C2D5E5F60 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882222231D1D1E1F1F20 49494A797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51A1A1A7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3C3D48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161 383839B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090A0A9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148F8F91B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262627656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52E2F2F5A5A5C 050505646466060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF050506ACADAFB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C1D1D757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5404142444445B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B98999AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2C2C2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333 5A5A5C0505066061620A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F4A4B4B747576 7475767475767475767475767475767475767475767475763B3C3C3A3A3B747576747576747576 747576747576747576747576747576747576575759111112747576747576747576747576747576 747576747576747576747576747576000000727374747576747576747576747576747576747576 7475767475767475760707086E6F70747576747576747576747576747576747576747576747576 747576181818636465747576747576747576747576747576747576747576747576747576313132 3232337475767475767475767475767475767475767475767475767475764A4B4C242525747576 74757674757674757674757674757674757674757674757668686A030303747576747576747576 7475767475767475767475767475767475767475760808086D6E6F747576747576747576747576 7475767475767475767475767475761313136A6A6B747576747576747576747576747576747576 7475767475767475762424254F5050747576747576747576747576747576747576747576747576 7475766767690000001F1F208E8F914A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 737475747576747576747576747576747576747576747576747576747576030404717172747576 747576747576747576747576747576747576747576747576121213666768747576747576747576 7475767475767475767475767475767475762829293A3A3B747576747576747576747576747576 7475767475767475767475764545462C2C2C747576747576747576747576747576747576747576 747576747576626263070808747576747576747576747576747576747576747576747576747576 7475760506066E6F707475767475767475767475767475767475767475767475767475760E0E0E 6B6C6D747576747576747576747576747576747576747576747576747576202020565758747576 7475767475767475767475767475767475767475767475763A3B3C242525747576747576747576 747576747576747576747576747576747576565657181818747576747576747576747576747576 747576747576747576747576717273000000747576747576747576747576747576747576747576 7475767475767475761414140000006464668F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000737475757577757577757577757577757577757577757577757577757577050505707172 757577757577757577757577757577757577757577757577757577141414656667757577757577 757577757577757577757577757577757577757577373838363637757577757577757577757577 757577757577757577757577757577484949282828757577757577757577757577757577757577 757577757577757577666668050506757577757577757577757577757577757577757577757577 7575777575770707076E6F70757577757577757577757577757577757577757577757577757577 1111116B6C6D757577757577757577757577757577757577757577757577757577232323525253 75757775757775757775757775757775757775757775757775757749494A212121757577757577 757577757577757577757577757577757577757577595A5B141515757577757577757577757577 757577757577757577757577757577757577000000757577757577757577757577757577757577 7575777575777575777575771818190000006061628F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF717171151516222222222222222222222222222222222222222222222222222222 0E0E0E080808212122212222212122212222222222222222222222222222222222141414080808 212121212222212122212122222222222222222222222222222222212122070707202121212222 212222212122222222222222222222222222222222212222090909171818212222212222212122 212222222222222222222222222222212222080808121212212222212222212122212222222222 222222222222222222222222060606070707212222212222212122212222222222222222222222 222222222222141414080808202121212222212122212122222222222222222222222222222222 1A1A1A0A0A0A212122212222212222212122222222222222222222222222222222222222060606 1D1D1D212222212222212122222222222222222222222222222222222222080909121313212222 212222212122212222222222222222222222222222212222050606131414212222212222212122 2122222222222222222222222222222222221011111213138F90928F90924A4A4B797979FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF070707222222222222222222222222222222222222222222222222 22222222222208080819191A212222212222212122212222222222222222222222222222212121 060606161616212222212222212122212222222222222222222222222222212222040404070708 21222221222221212221222222222222222222222222222222222210101009090A212222212222 2121222121222222222222222222222222222222221818180A0A0A212122212222212122212122 2222222222222222222222222222221F20200606061E1E1F212222212222212122222222222222 2222222222222222222121210808081A1A1A212222212222212122212222222222222222222222 222222212222070707101010212222212222212122212222222222222222222222222222212222 0809090808082122222122222121222122222222222222222222222222222222221617170A0A0A 2121222122222122222121222222222222222222222222222222222021210707071F2020212222 2122222121222222222222222222222222222222222020210505056162638F90928F9092060606 F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606202121212222212222212222212222212222212222 2122222122222020200808081C1C1C212122212122202121212222212222212222212222212222 202021070707161717212122212122202121212222212222212222212222212222212122040404 0707072121222121222021212121222122222122222122222122222122221011110A0A0A202121 2121222121212021212122222122222122222122222122221919190A0A0B202121212122212121 2021212122222122222122222122222122222122220606061D1D1E212122212122202121212222 212222212222212222212222212222080809131414212122212122202121212122212222212222 212222212222212121060606141414212122212122202121212122212222212222212222212222 2122220B0B0B0808082121222121222021212121212122222122222122222122222122221A1A1A 0808081F20202121222121212021212122222122222122222122222122221F1F1F090909202121 2121222121212021212122222122222122222122222122222020200505055D5E5E8F90928F9092 0A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B517171888888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788272828 8F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1A1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F9092 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C 98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D 303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727 656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 79797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5181819 88888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B 797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F9092 8F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768 333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636646566 8F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8687882728288F90928F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606 ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 8B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F 48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F90928F90924A4A4B797979FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B 7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657 313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928F9092060606F5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F90928F90920A0A0A F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C 5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288F9092 8F90924A4A4B797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5313232 6768698F90928F9092060606F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5969799 0B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3636366465668F90928F90920A0A0AF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58687882728288F90928F9092454546636363FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53132326768698F90928283850C0D0DD7D7D7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636366465668F9092838486101010D2D2D2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B579797B 1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A9AAAC B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F737375B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B518181988888A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C5E5F60B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58687882728288D8E903737383E3E3EF6F6F6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D 49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5606161383939B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58F90920E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5808183 212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AEAFB1010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53132326768697374750F0F0F B0B0B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAFB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5666768333334 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59697990B0B0BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C98999AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 87888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636646566757678 101010ABABABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4F4F48494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B579797B1A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303A9AAACB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F 737375B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444546404141B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6D303031B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59C9D9F090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B518181988888AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2C5E5F60B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5868788 2727273737383E3E3EF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51A1B1B7A7A7CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D49494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5606161383939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8F90920E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51414148F8F91B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5262727656667B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5555657313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5808183212121B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AEAFB1010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53132326161630F0F0FB0B0B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606ACADAF B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E757677B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5404142444546B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5666768333334B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59697990B0B0BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C98999AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168B8C8D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52A2A2A616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5C5D2D2D2DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B587888A1D1D1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B1B2B4B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53636365E5E60101010ABABABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5152538F90928F90928F90928F90928F90928F90928F90928F90928F909249494B414142 8F90928F90928F90928F90928F90928F90928F90928F90928F90926D6D6E1414158F90928F9092 8F90928F90928F90928F90928F90928F90928F90928F90920101018D8E908F90928F90928F9092 8F90928F90928F90928F90928F90928F909209090A8A8A8C8F90928F90928F90928F90928F9092 8F90928F90928F90928F90921B1B1C6A6B6C8F90928F90928F90928F90928F90928F90928F9092 8F90928F90924040403839398F90928F90928F90928F90928F90928F90928F90928F90928F9092 5D5D5F29292A8F90928F90928F90928F90928F90928F90928F90928F90928F9092818283060606 8F90928F90928F90928F90928F90928F90928F90928F90928F90928F90920B0B0B88898B8F9092 8F90928F90928F90928F90928F90928F90928F90928F90921516167F80818F90928F90928F9092 8F90928F90928F90928F90928F90928F90922828285657588F90928F90928F90928F90928F9092 8F90928F90928F90928F90927D7E7F0B0B0B3E3E3EF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0000008F8F918F90928F90928F90928F90928F90928F90928F90928F90928F9092 0506068C8D8E8F90928F90928F90928F90928F90928F90928F90928F90928F9092171717717273 8F90928F90928F90928F90928F90928F90928F90928F90928F90923737384142428F90928F9092 8F90928F90928F90928F90928F90928F90928F90925757583031318F90928F90928F90928F9092 8F90928F90928F90928F90928F9092797A7B0A0A0A8F90928F90928F90928F90928F90928F9092 8F90928F90928F90928F90920707078A8A8C8F90928F90928F90928F90928F90928F90928F9092 8F90928F90921111118687888F90928F90928F90928F90928F90928F90928F90928F90928F9092 2122225D5E5F8F90928F90928F90928F90928F90928F90928F90928F90928F90924F50502A2A2B 8F90928F90928F90928F90928F90928F90928F90928F90928F90926A6B6B1C1C1D8F90928F9092 8F90928F90928F90928F90928F90928F90928F90928C8D8F0000008F90928F90928F90928F9092 8F90928F90928F90928F90928F90928F9092212222020202B0B0B0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0000008E8F908F90928F90928F90928F90928F90928F90928F90928F9092 8F90920707088A8B8D8F90928F90928F90928F90928F90928F90928F90928F90928F9092191919 6D6E6F8F90928F90928F90928F90928F90928F90928F90928F90928F90923B3C3C3C3C3D8F9092 8F90928F90928F90928F90928F90928F90928F90928F90925A5A5C2D2D2D8F90928F90928F9092 8F90928F90928F90928F90928F90928F90927D7E800808088F90928F90928F90928F90928F9092 8F90928F90928F90928F90928F909209090A898A8B8F90928F90928F90928F90928F90928F9092 8F90928F90928F90921414148383858F90928F90928F90928F90928F90928F90928F90928F9092 8F909225252659595A8F90928F90928F90928F90928F90928F90928F90928F90928F9092555657 2626268F90928F90928F90928F90928F90928F90928F90928F90928F90926E6E701818198F9092 8F90928F90928F90928F90928F90928F90928F90928F90928F90920000008F90928F90928F9092 8F90928F90928F90928F90928F90928F90928F9092272727020202ABABABFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D60909092B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B1919190303032A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B1E1E1E0707072929292B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B262626 0808082626262B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B080808161616 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0505050A0A0B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0F0F0F0606062B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2020200505052828292B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2121210A0A0A2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B0808081818182B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 0A0A0A0E0E0E2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B080808040404 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0E0E0E7B7B7BFDFDFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848482B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B09090919191A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2828290606061111112B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B0D0D0D0505052B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B141414 0C0C0C2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B252525070707282828 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2727270809092020202B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B29292A0808091717182B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B29292A0303030B0B0B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B0909091212122B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B1F1F1F0808082A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B242424 0708082929292B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B282828000000D2D2D2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D4D4D29292A2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2828290808091E1E1E2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B29292A0505051010102B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2A2A2A0202020C0C0C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 1717170D0D0D2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B1E1E1E0A0A0A 2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B08080819191A2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0909090F0F0F2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A0202020909092B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B1616160606062A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2727270607072727272B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2525250808082929292B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B282828000000 CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/image5_crop.eps0000644000175000017500000132441512662210372016452 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image5_crop.eps) %%CreationDate: (2011-07-20T14:56:57-07:00) %%BoundingBox: 0 0 302 199 %%HiResBoundingBox: 0 0 301.962 199 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 302 199 userdict begin DisplayImage 0 0 301.962 198.975 12 302 199 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFBFBFCF8F8 FAF3F3F9F0F0F9EEEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EEEEF9F0F0FAF3F3FCF8F8FDFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE FDFBFBFAF4F4F6E9E8F2DCDCEFD5D4EED1D1EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED1D1EFD5D4F2DDDDF7E9E9FBF5F5FDFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEFDFBFBFAF3F2F5E4E4EDCFCEE6BBBAE1AFAEE0ABA9E0AAA8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8E0AAA8E0ABA9E1AFAEE7BDBCEFD3D2F7E9E9FCF8F8FEFDFD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFDFBFBFAF3F2F4E3E3ECCBCBE2B1AFDB9C9AD7918ED68D8BD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD68D8BD79190DDA19FE7BDBC F2DDDDFAF3F3FDFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFAF4F4F5E4E4ECCBCBE1AFAED99895D48886 D1827FD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D28382D79290E1AFAEEFD5D4F9F0EFFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB2B2B2AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE 7B7B7BA7A7A7AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE969696959595 AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADACACABA8A8DBD0CFEDCFCEE2B1AF D99895D38786D07F7DCF7D7BD07B79D07B79854F4D8D53528D53528D53528D53528D53528D5352 8D53528D53528D53528D5352633A398D53528D53528D53528D53528D53528D53528D53528D5352 8D53528D53526F41408D53528D53528D53528D53528D53528D53528D53528D53528D53528D5352 8B52519D5D5BD07D7BD07F7DD68D8BE0AAA9EED2D1F9EEEEFDFBFBFFFFFF989898ADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADAD565656ADADADADADADADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD ADADADADADADADADADADADADA8A8A8DADADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFE919191ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA5A5A5 ADADADADADADADADADADADADADADADADADADADADADADADADADADADADADAD5F5F5FADADADADADAD ADADADADADADADADADADADADADADADADADADADADADADADADADADADFDFDFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2212121404040404040404040404040404040404040404040 4040404040402A2B2B03050A141F331B263A1B263A1B263A1B263A1B263A1B263A1B263A1B263A 16203007070739393A4040404040404040404040404040404040404040404040403D3D3E000000 000000E6BBBADB9C9AD48886D07F7DD07D7BCF7B79CF7B797E4B4B14131C181E33181E33181E33 181E33181E33181E33181E33181E33181E33090B131111113534343D38393D38393D38393D3839 3D38393D38393D38393D38392D2929020407131B30181E33181E33181E33181E33181E33181E33 181E33181E33171D310000000F0A0BD07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFB818181 3232324141414141414141414141414141414141414141414141414141411E1E20060C16172237 1B273B1B273B1B273B1B273B1B273B1B273B1B273B1B273B0A0F180D0D0D2E2F2F414141414141 4141414141414141414141414141414141413D3D3D0000004D4D4DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFE6465671E26371B273B1B273B1B273B1B273B1B273B1B273B1B273B1B273B 1B273B08090B000000393939414141414141414141414141414141414141414141414141232323 04070E1723371B273B1B273B1B273B1B273B1B273B1B273B1B273B1B273B131B29000000333434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2121212A4A5A7C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4808081020407284A89325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC284B8B08090A69696BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 BDBEC04040412929291D1B1BE1AEADD7918ED1827FCF7D7BCF7B79CF7B797E4B4B0A0A102D549D 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1B335F0A0A0AA8A9ABC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48B8C8D030407213E73325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC3059A512182A061026281B1FD07B79D07F7DD58B8ADFA9A8EED0D0 F9EFEE807F7F202021B7B8BAC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4545557 04080E2E569F325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1E396A0707078D8E8F C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B2B3B5262626383939565656FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE646567131B29315BA8325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC1321391A1B1BB2B3B5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C46363640204082A4F93325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2B5197 0A0E16021435737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B21212129A9B9CC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4888889020407254681325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC2B519608090A69696BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4BDBEC04040412F30307778791F1C1CE0AAA9D68D8BD07F7DD07B79CF7B797E4B4B 0A0A102A4F93325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1B335F0A0A0A9E9FA0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4969698030407203C6F325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC315BA812182A07132E001F59281B1FD07B79D07F7D D58B8ADFA9A8EED0D07E7979202020AFB0B2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C456575904080E2B5197325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1E396A 0707078D8E8FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B8B9BB262626464647 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF646567131B292F58A3325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC1321391A1B1BB2B3B5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4646566020408284A8A325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC2B51970A0E16021C49011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F60000004C4D4E 56575856575856575856575856575856575856575856575853535400000013233F172A4B16284A 17294A1A2C4D1A2C4D1A2C4D1A2C4D1A2C4D192B4C0000003B3C3E515255515254535354565758 5657585657585657585657585454550000004041418C8D8F78797B1F1C1CDFA9A8D58B8AD07F7D D07B79B06967000000172645192A4B192A4B192A4B192A4B192A4B192A4B192A4B192A4B0D172A 00000048494B51525551525354535455545555545555545555545555545551505100000012203B 172A4B16284A17284A192A4B192A4B192A4B192A4B192A4B192A4B25325407132E012A79001F59 281B1FD07B79D07F7DD58B8ADFA9A8AC9797000000525253565758565758565758565758565758 565758565758565758434546000000152645172A4B16284A182A4C1A2C4D1A2C4D1A2C4D1A2C4D 1A2C4D0A1220000000454648515255515254545555565758565758565758565758565758565657 6E6E6F4646478F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFFA7AAAE06090D192B4B1A2C4D 1A2C4D1A2C4D1A2C4D1A2C4D1A2C4D1A2C4D1A2C4D05070A2D2E2F4E4F52515255515253555556 5657585657585657585657585657584E4E4F000000142442172A4B162849182A4C1A2C4D1A2C4D 1A2C4D1A2C4D1A2C4D132038000000031D4C012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE9E9E92B2B2B2727272C2C2C595959D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7676763E3F3F626264626264626264626264626264626264626264626264626264303031000000 001D54001D54001D54001D54001D54001D54001D54001D54001D5401153D000000626264626264 6262646262646262646262646262646262646262646262640202028384868F909278797B1F1C1C DFA9A8D58B8AD07F7DD07B79352225001843001D54001D54001D54001D54001D54001D54001D54 001D54001D54030D1F444445626264626264626264626264626264626264626264626264626264 3A3B3C000000001D54001D54001D54001D54001D54001D54001D54001D54001D54011D52000000 012A79012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A81C1919555556626264626264626264 626264626264626264626264626264626264101216001845001D54001D54001D54001D54001D54 001D54001D54001D54001D54010D28010101626264626264626264626264626264626264626264 6262646262645C5D5E0000008F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF000000 001B4C001D54001D54001D54001D54001D54001D54001D54001D54001D5406070A575758626264 626264626264626264626264626264626264626264626264212223001336001D54001D54001D54 001D54001D54001D54001D54001D54001D54001A4B09101D012B7A012B7A011640737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000DBDBDBD5D5D5646464181818F5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698002364 1B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79432A2E01215E003698003698003698003698 00369800369800369800369800369804132E616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698 003698003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83B3535818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698 003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFF FFFFFFFFFFFF1C1F24002C7D003698003698003698003698003698003698003698003698003698 0B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F 0036980036980036980036980036980036980036980036980036980029740B1322012B7A012B7A 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000FBFBFBFFFFFFF3F3F3 010101C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698 0036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698 00369800369800369800369800369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698 003698003698003698003698003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8A DFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025 002362003698003698003698003698003698003698003698003698003698001337454547B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698003698003698 0036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698002974 0B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000 FBFBFBFFFFFFE3E3E3000000DCDCDCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698 0036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79 442B2F01215E00369800369800369800369800369800369800369800369800369804132F616162 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698 003698003698003698003698003698003698003698003494010102012B7A012B7A001F59281B1F D07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698003698003698 001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698 0036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698 0036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD7D7D7000000A9A9A99B9B9B313131565656FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8 D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698003698003698 00369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010102012B7A 012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698 003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D 0036980036980036980036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698 0036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD7D7D70000005B5B5B6E6E6EA5A5A5FDFDFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F9092 78797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698 00369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698 003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFF1C1F25002C7D0036980036980036980036980036980036980036980036980036980B0F17 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698 0036980036980036980036980036980036980036980036980029740B1322012B7A012B7A011640 737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000FBFBFBFFFFFFFFFFFFFFFFFF FFFFFFF6F6F6787878515151FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384868F909278797B1E1B1BDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698 00369800369800369800369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698 003698003698003698003494000102012B7A012B7A001F5922171BD07B79D07F7DD58B8ADFA9A8 3C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515158F90928F90925A5B5C434343 FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698003698003698003698 0036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2E011C4F0036980036980036980036980036980036980036980036980036980029740A1221 012B7A012B7A011640717273FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFC1C1C1C8C8C8414141FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698 0036980036980036980036980023641A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909098384868F9092666768040404DFA9A8D58B8AD07F7DD07B79442B2F 01215E00369800369800369800369800369800369800369800369800369804132F616162B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B010F28003698003698003698 003698003698003698003698003698003698003494000002012B7A012B7A001A49050407D07B79 D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C2025002362003698003698003698003698003698003698003698003698003698001337 454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0E0E0F8F9092 8E8F91303031121212FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698 0036980036980036980036980036980B0F16868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698 003698002974000817012B7A012A79000F2D3E3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DADADA010101FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5414141FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698 0036980036980036980036980036980036980036980023641A1B1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C838486565658060606151313DFA9A8D58B8A D07F7DD07B79442B2F01215E003698003698003698003698003698003698003698003698003698 04132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029 003698003698003698003698003698003698003698003698003698003494000102012B7A01153C 00020723161AD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698 003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1314148E8F913838390B0B0B545454FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698 0036980036980036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698 003698003698003698003698002974020C1E002A77010C2301050D707172FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5414141 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 0117400036980036980036980036980036980036980036980036980036980023641A1B1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C535455070707646466 1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698 00369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B011029003698003698003698003698003698003698003698003698003698003494 00010201153C000308011C50281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698 003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1313143838390E0E0E545556565656FFFFFFFFFFFFFFFFFFFFFFFF 1C1F25002C7D0036980036980036980036980036980036980036980036980036980B0F17868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698 003698003698003698003698003698003698003698002974020B1D010C2302081101153E737475 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF5F5F5414141FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF797979505051838385838385838385838385838385838385838385 838385838385424243001336002770002770002770002770002770002770002770002770002770 001D53141414838385838385838385838385838385838385838385838385838385838385000000 0505056D6E7078797B1F1C1CDFA9A8D58B8AD07F7DD07B793E272B001D54002770002770002770 00277000277000277000277000277000277004112A555556838385838385838385838385838385 8383858383858383858383854F5051000B20002770002770002770002770002770002770002770 00277000277001276E000000000308002468001F59281B1FD07B79D07F7DD58B8ADFA9A8322D2D 757577828384828384828384828384828384828384828384828384828384181C21001F5800276F 00276F00276F00276F00276F00276F00276F00276F00276F0011313A3A3B828384828384828384 8283848283848283848283848283848283847C7D7F0303030E0E0E8384865A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF0C0F1400256800276F00276F00276F00276F00276F00276F00276F00276F 00276F0A0D13777879828384828384828384828384828384828384828384828384828384262728 00184500276F00276F00276F00276F00276F00276F00276F00276F00276F002465000104020811 002976011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFBFBFBF5B5B5B181818686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787878070707171717171717171717171717 171717171717171717171717171717080808010307010712010712010712010712020913020913 020913020913020913000309080909141415141516141515151515171717171717171717171717 1717171212120303047C7D7F8F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79291B1E000309 020712020712020712020712020712020712020712020712020712010205070708141516141516 141415151515161616161616161616161616161616050505010308010712010712000712010612 02071202071202071202071202071201060F00010400276F012B7A001F59281B1FD07B79D07F7D D58B8ADFA9A80C0B0B0E0E0E171717171717171717171717171717171717171717171717161717 030508000308010713010713000712010813020914020914020914020914020913000003070708 1515161515161515151616161717171717171717171717171717170D0D0D00000087888A8F9092 5A5B5C555556FBFCFDFBFDFDFCFDFDFBFBFD00020602070F020814020814020814020814020814 0208140208140208140208130606060C0D0D151516151516151515161717171717171717171717 171717161616040505000206010713010713000712010813020814020814020814020914020914 000308000207012978012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698 0036980036980036980036980036980036980023641A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7D D07B79422A2E01215E00369800369800369800369800369800369800369800369800369803132E 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698 003698003698003698003698003698003698003698003698003494000001012B7A012B7A001F59 281B1FD07B79D07F7DD58B8ADFA9A8393434818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698003698 003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 1515158F90928F90925A5B5C515254EEF3F8EFF4F8EFF5F8F1F5F91A1E24002C7D003698003698 0036980036980036980036980036980036980036980A0F16868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698 0036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740 0036980036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1C DFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698003698 00369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B021029003698003698003698003698003698003698003698003698003698003494010102 012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698 003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1414158F90928F90925A5B5C484C51D0DDECD1DDEDD4E0EDD5E0EE171C23 002C7D0036980036980036980036980036980036980036980036980036980B0F17868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698 0036980036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698002364 1B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698 00369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698 003698003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698 003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1313158F90928F90925A5B5C3C434CA7C0DCA8C0DD ABC2DDAEC5E0131921002C7D003698003698003698003698003698003698003698003698003698 0B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F 0036980036980036980036980036980036980036980036980036980029740B1322012B7A012B7A 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698 0036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698 00369800369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698 003698003698003698003698003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8A DFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025 002362003698003698003698003698003698003698003698003698003698001337454547B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1213148F90928F90925A5B5C 313C4887A9D187A9D289AAD18CABD20F1620002C7D003698003698003698003698003698003698 0036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698002974 0B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C48A8A8A FFFFFF7B7B7BD6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698 0036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79 442B2F01215E00369800369800369800369800369800369800369800369800369804132E616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698 003698003698003698003698003698003698003698003494010102012B7A012B7A001F59281B1F D07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698003698003698 001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D121314 8F90928F9092595A5B2D3A49789ECC759CCB759CCB779DCB0D151F002C7D003698003698003698 0036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698 0036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF474747999999FFFFFF8282826E6E6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8 D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698003698003698 00369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010102012B7A 012B7A001F591E1417D07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698 003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1113148F90928F9092585B5C2E3D4D739AC96D96C86B95C66D95C70C141F002C7D 0036980036980036980036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698 0036980036980036980036980036980029740B1322012B7A012B7A011640707172FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE7E7E7070707ECECECFFFFFFD9D9D9131313F9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641A1A1B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909098384868F9092 767778060606DFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698 00369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B010F28003698003698003698003698003698003698003698003698003698 003494000001012B7A012B7A011C500A080CD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0E0E0F8F90928D8E91585B5F131B256D97C76792C56590C4 6993C50C141F002C7D0036980036980036980036980036980036980036980036980036980B0F17 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698 003698003698003698003698003698003698003698003698002974000817012B7A012B7A001234 6C6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBA5A5A5 696969727272C7C7C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBA5A5A5696969727272C7C7C7 FFFFFFFFFFFFFFFFFFBABABA6F6F6F7A7A7ADFDFDFFFFFFFFFFFFFBABABA6F6F6F7A7A7ADFDFDF FFFFFFFFFFFFC3C3C37373737A7A7AD4D4D4FFFFFFFFFFFFEBEBEB818181666666AAAAAAFFFFFF FDFDFD9F9F9F676767858585F4F4F4FFFFFF9D9D9D3E3E3EFFFFFFFFFFFFFFFFFF262626B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641A1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C8384867070720606060E0D0DDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698 00369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B011029003698003698003698003698003698003698 003698003698003698003494000102012B7A001E56000104211519D07B79D07F7DD58B8ADFA9A8 3C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1313148F909257585A090D102E3D51 6894C5628EC3608DC26691C50C141F002C7D003698003698003698003698003698003698003698 0036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2E011C4F003698003698003698003698003698003698003698003698003698002974010C1E 012B7A01163F000206737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFADADAD626262AAAAAA8B8B8B090909E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFADADAD626262 AAAAAA8B8B8B090909E2E2E2FFFFFF9F9F9F121212828282848484545454FFFFFF9F9F9F121212 828282848484545454FFFFFFABABAB242424A8A8A87D7D7D121212D9D9D9FFFFFF3E3E3E777777 B6B6B67C7C7CFFFFFF9393933C3C3CB8B8B88A8A8AD4D4D4FFFFFF6969695E5E5EFFFFFFFFFFFF FFFFFF474747949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698 0036980036980036980036980023641A1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C6D6E6F0606064E4F501F1C1CDFA9A8D58B8AD07F7DD07B79442B2F 01215E00369800369800369800369800369800369800369800369800369804132E616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698 003698003698003698003698003698003698003494000102001E56000104001744281B1FD07B79 D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C2025002362003698003698003698003698003698003698003698003698003698001337 454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D13141459595B 060808494E54394A636691C45F8CC15F8BC2658FC40C141F002C7D003698003698003698003698 0036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698 003698002974020C1E01163F010308001339737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313131AEAEAEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313131AEAEAEFFFFFF272727929292FFFFFFFFFFFFFEFEFE FFFFFF272727929292FFFFFFFFFFFFFEFEFEFFFFFF2D2D2DB0B0B0FFFFFFFFFFFF4F4F4F7B7B7B FFFFFF1A1A1AB0B0B0FFFFFFFFFFFFFFFFFF7070705C5C5CFEFEFEFFFFFFFFFFFFFFFFFF4C4C4C 7A7A7AFFFFFFFFFFFFFFFFFF636363727272FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795A5B5C ACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF4B4B4C01163E003493003493 0034930034930034930034930034930034930034930023641A1A1AACADAFACADAFACADAFACADAF ACADAFACADAFACADAFACADAFACADAFACADAF02020205050553535478797B1F1C1CDFA9A8D58B8A D07F7DD07B7941292D00215C003493003493003493003493003493003493003493003493003493 04122E606061ACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF58595A010E26 003493003493003493003493003493003493003493003493003493003392000000000104001D53 001F59281B1FD07B79D07F7DD58B8ADFA9A83832327F8081ABACAEABACAEABACAEABACAEABACAE ABACAEABACAEABACAEABACAE1C1F25012261003492003492003492003492003492003492003492 003492003492001336434345ABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAEABACAE 999A9C0303030707076D6F72575D63394C656590C35E8BC15E8AC26491C4080E17002C7C003492 0034920034920034920034920034920034920034920034920A0E16858687ABACAEABACAEABACAE ABACAEABACAEABACAEABACAEABACAEABACAE2A2B2D011B4E003492003492003492003492003492 003492003492003492003492002973000610010308002569011640737475FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC9292924C4C4C3838380C0C0CA7A7A7 FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC9292924C4C4C3838380C0C0CA7A7A7FBFBFB030303CDCDCD FFFFFFFFFFFFFFFFFFFBFBFB030303CDCDCDFFFFFFFFFFFFFFFFFFFEFEFE0505052424242C2C2C 2C2C2C171717727272FFFFFFAAAAAA1212124D4D4DCBCBCBFFFFFFE0E0E03030302929299C9C9C FEFEFEFFFFFF424242898989FFFFFFFFFFFFFFFFFF7272725B5B5BFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF787878000000020202020202020202020202020202020202020202020202020202000000 000000000002000002000002000002000002000002000002000002000002000000000000020202 0202020202020202020202020202020202020202020202020000000000006A6A6B8F909278797B 1F1C1CDFA9A8D58B8AD07F7DD07B79281A1E000000000002000002000002000002000002000002 000002000002000002020202000000020202020202020202020202020202020202020202020202 020202000000000000000002000002000002000002000002000002000002000002000002000001 000000001D53012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A8121111000000030303030303 030303030303030303030303030303030303030303000206000000000102000102000002000102 000102000103000103000204000204000000000000020303030303030303030303030303030303 0303030303030303030000000000008182848D8F92575D63384D666490C45E8BC25E8BC16491C4 000207000000000102000102000102000102000103000103000204000204010204080808000000 030303030303030303030303030303030303030303030303020202000001000000000102000102 000002000102000102000102000102000102000102000000000000002569012B7A011640737475 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484843E3E3EDDDDDD F8F8F8383838A7A7A7FFFFFFFFFFFFFFFFFFFFFFFF8484843E3E3EDDDDDDF8F8F8383838A7A7A7 FFFFFF090909CACACAFFFFFFFFFFFFFFFFFFFFFFFF090909CACACAFFFFFFFFFFFFFFFFFFFFFFFF 101010C8C8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F48D8D8D0A0A0AE8E8E8FFFFFF FEFEFEBBBBBB1E1E1E9C9C9CFFFFFF5151516F6F6FFFFFFFFFFFFFFFFFFF595959696969FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7878785C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698 0023641A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B7942292D01215E003698003698003698 00369800369800369800369800369800369803122E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B010F28003698003698003698003698003698003698003698 003698003698003494000000012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A8383232 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698 003698003698013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63384D666490C4 5E8BC25E8BC16491C4101620002C7D003698003698013698063C9A1349A02559A93365AF386BB1 3A6DB2111720868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E 011C4F0036980036980036980036980036980036980036980036980036980029740A1220012B7A 012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5B6A6A6AFFFFFFDFDFDF181818A7A7A7FFFFFFC6C6C6ABABABFFFFFF5B5B5B6A6A6AFFFFFF DFDFDF181818A7A7A7FFFFFF464646636363FEFEFEF3F3F3A1A1A1FFFFFF464646636363FEFEFE F3F3F3A1A1A1FFFFFF535353636363FDFDFDFFFFFFF2F2F2ECECECF9F9F9D6D6D6FFFFFFF7F7F7 0E0E0ED5D5D5D0D0D0FEFEFEFFFFFF5B5B5B808080FFFFFF767676525252FFFFFFFFFFFFFFFFFF 3C3C3C8E8E8EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698 0036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E 00369800369800369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698 003698003698003698003698003698003494010102012B7A012B7A001F59281B1FD07B79D07F7D D58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C2025002362003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E454647 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92 575D63384D666490C45E8BC25E8BC16491C4101620002C7D003698003698013698063C9A1349A0 2559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698 0029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC5C5C51515152A2A2A3838383F3F3FA9A9A9FFFFFF747474424242FFFFFF C5C5C51515152A2A2A3838383F3F3FA9A9A9FFFFFFD7D7D72A2A2A141414121212858585FFFFFF D7D7D72A2A2A141414121212858585FFFFFFE2E2E23E3E3E1919192D2D2D1E1E1EC3C3C3F3F3F3 2525252C2C2C1B1B1B6A6A6AFFFFFF6B6B6B1C1C1C2B2B2B303030E6E6E6FFFFFFAEAEAE252525 FFFFFFFFFFFFFBFBFB131313C6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698 0036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7D D07B79442B2F01215E00369800369800369800369800369800369800369800369800369804132E 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698 003698003698003698003698003698003698003698003698003494010102012B7A012B7A001F59 281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A02559A93365AF 386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 1515168F90928D8F92575D63384D666490C45E8BC25E8BC16491C4101620002C7D003698003698 013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698 0036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEBEBEBFFFFFFFCFCFCFEFEFEFFFFFF FFFFFFFDFDFDFFFFFFFFFFFFFBFBFBEBEBEBFFFFFFFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFEBEBEB F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFEBEBEBF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3E8E8E8 FFFFFFFFFFFFFFFFFFFFFFFFE7E7E7F4F4F4FFFFFFFFFFFFFFFFFFF1F1F1EBEBEBFFFFFFFFFFFF FFFFFFF5F5F50A0A0AD0D0D0FFFFFFBABABA191919FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740 0036980036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B1F1C1C DFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698003698 00369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B021029003698003698003698003698003698003698003698003698003698003494010102 012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A 1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63384D666490C45E8BC25E8BC16491C4101620 002C7D003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698 0036980036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A7B7B7BFFFFFF646464818181FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698002364 1B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698 00369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698 003698003494010102012B7A012B7A001F59281B1FD07B79D07F7DD58B8ADFA9A83C3636818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698 003698013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63384D666490C45E8BC2 5E8BC16491C4101620002C7D003698003698013698063C9A1349A02559A93365AF386BB13A6DB2 121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F 0036980036980036980036980036980036980036980036980036980029740B1322012B7A012B7A 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFDFCFCFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBE8E6E6BFBEBEFEFDFDB9B9B9F1F1F1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698 0036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B1F1C1CDFA9A8D58B8AD07F7DD07B79442B2F01215E003698 00369800369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698 003698003698003698003698003494010102012B7A012B7A001F5922161AD07B79D07F7DD58B8A DFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025 002362003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63 384D666490C45E8BC25E8BC16491C4101620002C7D003698003698013698063C9A1349A02559A9 3365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698002974 0B1322012B7A012B7A011640717273FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFBFBFCF8F8FAF3F3F9F0F0 F9EEEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EEEEF9F0F0FAF3F3 FCF8F8FDFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698 0036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F9092797A7C201D1DDFA9A8D58B8AD07F7DD07B79 442B2F01215E00369800369800369800369800369800369800369800369800369804132E616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698 003698003698003698003698003698003698003698003494010102012B7A012B7A001F58181012 D07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A02559A93365AF386BB1 213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928D8F925A60663449606490C45E8BC25E8BC16491C4101620002C7D003698003698013698 063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698 0036980036980029740A1321012B7A012B7A01163F828384FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFBFBFAF4F4 F6E9E8F2DCDCEFD5D4EED1D1EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED1D1EFD5D4F2DDDDF7E9E9FBF5F5FDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384867C7D7F1414148B7979DFA9A8 D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698003698003698003698 00369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010102012B7A 00236307060ABE716FD07B79D07F7DD58B8ADFA9A83C3636818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A0 2559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F9092686A6C10161B5779A26390C35D8AC25D8BC16490C4101620002C7D 003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698 0036980036980036980036980036980029740B1322012B7A011D510D0F12FEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE FDFBFBFAF3F2F5E4E4EDCFCEE6BBBAE1AFAEE0ABA9E0AAA8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8E0AAA8E0ABA9E1AFAEE7BDBCEFD3D2F7E9E9FCF8F8FEFDFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D797A7C151415 928C8BEED0D0DFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698003698003698003698 00369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698 00349401010200236307060A8B5352CF7B79D07B79D07F7DD68D8BE0AAA93C3736818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515156A6B6C0B0D0F56769C6A94C6628FC35D8AC15E8BC1 6491C40F1620002C7D003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698 0036980036980036980036980036980036980036980036980029740B1322011D510D0F12D3D3D3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEFDFBFBFAF3F2F4E2E2ECCBCBE2B1AFDB9C9AD7918ED68D8BD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD68D8BD79190DDA19FE7BDBCF2DDDDFAF3F3FDFCFC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641A1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707111111949393F9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79442B2F01215E003698003698 00369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B010F28003698003698003698003698003698003698 00369800369800369800349400000007060A8B5352CF7B79CF7B79CF7D7BD1827FD7918EE1AEAD 3C3737818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E454547B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D0A0A0A0B0C0D5371986A94C56590C4 5F8CC25D89C15D8BC16490C40F1620002C7D003698003698013698063C9A1349A02559A93365AF 386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2E011C4F003698003698003698003698003698003698003698003698003698002974080E18 0D0F12D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFDFBFBFAF3F2F4E2E2ECCBCBE1AFAED99895D48886D1827FD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD28382D79290E1AFAE EFD5D4F9F0EFFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9A9000000171717171717171717 171717171717171717171717171717171717000000000000080C130B0E150B0E150B0E150B0E15 0B0E150B0E150B0E150B0E15000102000000151515171717171717171717171717171717171717 171717171717131313000000B1B1B1FDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79613C3E 000000080910080910080910080910080910080910080910080910080910030303000000141111 15111215111215111215111215111215111215111215111200000000000007080F080910080910 08091008091008091008091008091008091007080E0000008B5352CF7B79CF7B79D07D7BD07F7D D48886DB9C9AE6BBBA524B4B000000171717171717171717171717171717171717171717171717 1717170002060000000A0E150B0F150B0F150B10171018231B2B3F2A45653657823A608D2A4767 000000121315121415121415121415121415121415121415121415121415000000000000567BA7 648FC3618DC25E8BC25B8AC05B88C05C8AC0628FC3121B26000001060B13060B13060C150B1521 17293E28436435568139608D3B6290151D27000000101214101215101215101215101215101215 111315111315121315000001000000040912040A13040A13040A13040A13050A13060B14080D14 0A0E15000000000000D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFAF4F4F5E4E4ECCBCBE1AFAED99895D38786 D07F7DCF7D7BD07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79 D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79 D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07D7B D07F7DD68D8BE0AAA9EED2D1F9EEEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BFBFBFE1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BEBEBEE1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1EEEEEEFFFFFFFDFBFBF9EEEEEED2D1E0AAA9D68D8B D07F7DD07D7BCD7977B76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6A B66B69B36968B76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AA05E5C B76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AB76C6AA25F5ED07B79D07B79 CF7D7BD07F7DD38786D99895E2B1AFEDCFCEF0E3E2DED9D9E0DFDFE1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1DDDDDDE0E0E0E1E1E1E1E1E1E1E1E1DDDEDFD1D6DBB7C5D594AECB 789BC46990C1628BBD537AA8527BAB527AAA527AAA527AAA527AAA527AAA527AAA527AAA527AAA 527AAA5885B85D8BC15D8AC05B88C05A89BF5A88BF5987BF5A88C15F8BC15C88BB537CAB527BAA 527AAA5179A95079AA507AAD4F7CB14E7CB54D7CB74E7CB64979B04470A44571A54571A54471A5 4571A54671A54772A54A75A74D78A85079A95179AA527AAA527AAA527AAA5279AB557DAB5C81AE 6D8DB48BA3BFB1BECECED4D9DCDDDED8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCF7F7F6E9E8EDCFCEE2B1AF D99895D38786D07F7DD07D7BCF7B79CF7B79633A39603939603939603939603939603939603939 603939603939603939603939150C0C603A39613A39613A39613A39613A39613A39613A39613A39 613A39613A393D2424563434603939603939603939603939603939603939603939603939603939 5A3636784746D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9F0EF EFD5D4E1AFAED79290D28382D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD1827FD48886D99895E1AFAEECCBCBF5E4E4FAF4F4FDFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFD EBF2F7CCD9EBA0BADA7DA1CE6B93C7618DC45D8BC15B8AC05A89C05A89C05A89C05A89C05A89C0 5A89C05A89C05A89C05A89C05A89C05A88C15A88BE5A89BF5C88C05A88C15887C05987BF5A88C1 5B8AC05B8AC05A89C05A89C05888BE5787BF5685BE5483BE5182BD5080BC4F7FBD4E81BB4E80BB 4E80BB4D80BB4D80BB4E80BB4F81BC5082BC5384BD5686BE5888BF5A89C05A89C05A88C15C89C0 5E8CC1618DC36A93C77CA1CD9FBADACCD9EAEBF2F7FBFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFCFAF3F3 F2DCDCE6BBBADB9C9AD48886D07F7DD07D7BCF7B79CF7B795D3839181C2E1A305A1A305A1A305A 1A305A1A305A1A305A1A305A1A305A1A305A0F192C202021656566656566656566656566656566 6565666565666565666565664243430203061A315B1A305A1A305A1A305A1A305A1A305A1A305A 1A305A1A305A192E56010103040203D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFCFCFAF3F3F2DDDDE7BDBCDDA19FD79190D68D8BD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD68D8BD7918EDB9C9AE2B1AFECCBCBF4E3E3FAF3F2FDFBFB FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFBFCEBF2F7CBD9EA9EB9D97BA0CC6993C6618DC25E8AC25E8AC15D8AC15D8AC1 5D8AC15D8AC15D8AC15D8AC15D8AC15D8AC15D8AC15D8AC15D8AC15C8ABF5D8DC05F8BC05E8BBF 5988BF5987C05A87BF5B89C05C89C15D8AC15D8AC15B89BF5A89BF5887BE5584BC5183BC5081BD 4E7FBB4E7FBC4E7FBB4E80BB4E7FBC4F80BC4F80BC5081BC5181BC5584BD5887BF5B88C05C8AC1 5D8AC15D8AC15E8BC1618EC36791C46F97C881A4CEA3BDDBCDDBEBEDF2F7FBFCFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFBFBF9F0EFEFD5D4E1AEADD7918ED1827FCF7D7BCF7B79CF7B795D38390F111C2F58A3 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC162644131314B2B3B5C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46D6E70020407264784325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC2D549B0B0E1803163A1D1318D07B79D07F7DD58B8ADFA9A8EED0D0 F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F63F3F3F2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B0103051C1F2324262B24262B 24262B24262B24262B24262B24262B24262B24262B0303032020212C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2C2C2C2C2B2B1612123F3131EFD3D2E7BDBCE1AFAEE0ABA9E0AAA8DFA9A8 DFA9A8D59F9E723D3D6E393B6E393B6E393B6E393B6E393B6E393B6E393B6E393B6E393B6D383A 5F29286C3635723C3B723C3B723C3B723C3B723C3B723C3B723C3B723C3B723C3B5C27276B3638 6E393B6E393B6E393B6E393B6E393B6E393B6E393B6E393A6D393A5826267F5656EDCFCEF5E4E4 FAF3F2FDFBFBFEFEFEFFFFFFFFFFFFE2E2E22828282C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C2C2727270103051E2227252D372D3D52395577416692466FA14672A64872A8 4773A84773A83B5F882E4867344F6F354F6F354F6F354F6F354F6F354F6F364F6F354F6D334A6A 1E364F486A92608DC15D89BE5A88C05B8ABF608BC3628EC3638FC35982B22D486A314F7336567F 3D6392446FA14875AD4979B14B79B4497AB3497AB24877B03C618E36577E345478335072324E6F 334E6E344F6F354F6F364F6F354F6D324B691D324B20334A1B293918212E181F281D212722252A 23262A24262B24262B24262B0000008E8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EEEEEED2D1E0AAA9D68D8BD07F7DD07B79CF7B795D3839 0F111C2E569F325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC17294A131314AEAEB0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4838385020407264784325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC2F58A40B0E180419400122611D1318D07B79D07F7D D58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 4141415F5F609B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E98999B1B1D2111203B 284B8A284B8A284B8A284B8A284B8A284B8A284B8A284B8A284B8A121D331414149D9E9F9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E8C8D8E040202171111F7E9E9F2DDDDEFD5D4 EED1D1EED0D0EED0D0E0C2C24F32354B3F604E4A794E4A794E4A794E4A794E4A794E4A794E4A79 4E4A794D4774391E21745657A38688A38688A38688A38688A38688A38688A38688A38688A38688 4B2E3037202B4E4A794E4A794E4A794E4A794E4A794E4A794E4A794E4A794E4A79473F652C1211 432F32F6E9E8FAF4F4FDFBFBFEFEFEFFFFFFFFFFFFE2E2E21E1E1E8585879B9C9E9B9C9E9B9C9E 9B9C9E9B9C9E9B9C9E9B9C9E9B9C9E8E8E90090B0F1D3665274B89284E8C3057963964A3416DAB 4572B04574B04675B14574AF243A543241518593A38594A58594A58594A58594A58594A58594A5 8594A58694A4637080101F2C354D67618EC25C8AC05C88BF5F8BC16590C46A94C65D82AD1B2B3D 2E548E315A9735609D3C69A64171AE4876B34778B44879B54879B54372AB294463546C857D91A7 8192A58393A48593A48594A58594A58594A58594A5828F9F1B27391F39602C508F294D8B284B8A 274A89284B8A284B8A284B8A284B8A284B8A1A2D510102046D6E6FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7D D07B79A362620000001014221216251216251216251216251216251216251216251216250A0D16 00000021222524262A2425272927272D2A2A2D2A2A2D2A2A2D2A2A2D2A2A201D1E0000000A101B 0F17270C14240C132212162512162512162512162512162512162500000004183F012B7A012261 1D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6F6F6414141474748C0C1C3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BEBFC1 1E20230D182D315BA9325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC132037141415 AEAEB0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49596980E0E0E616263222020 FCF8F8FAF3F3F9F0F0F9EEEEF9EFEEE8DEDD362D2F2A304E3E5BA23E5BA23E5BA23E5BA23E5BA2 3E5BA23E5BA23E5BA23B579B1C151A4E4545C0B7B8C0B7B8C0B7B8C0B7B8C0B7B8C0B7B8C0B7B8 C0B7B8C0B7B8352B2D1915203B579A3E5BA23E5BA23E5BA23E5BA23E5BA23E5BA23E5BA23E5BA2 2F4173160E120E1F51393539FCF8F8FDFBFBFEFEFEFFFFFFFFFFFFE2E2E21E1E1E6E6E6FC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4AEAFB10A0C10172B51325DAC325DAB325EAB 3765AE3E6DB14272B44475B74577B64575B31B2A3D31373EB0B6BCB5BBC2B5BBC2B5BBC2B5BBC2 B5BBC2B5BBC2B5BBC2B5BBC271777D151C20505962374B65628EC15C8ABE5C8AC0628EC26A94C5 5F80A8101720244276325FAB3260AB3865AE3D6DB04374B44676B64778B64779B6406CA51A2A3C 67727FABB6C0AFB7C1B1B9C0B4BAC1B5BBC2B5BBC2B5BBC2B5BBC2ABB1B8131A22152743315EAB 325DAB315DAB315CAB325DAC325DAC325DAC325DAC325DAC1D3259090F1901153D737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0 DFA9A8D58B8AD07F7DD07B794F3132001A49002973002973002973002973002973002973002973 002973002973001233282929878889878889878889878889878889878889878889878889878889 5D5E5E000103002973002973002973002973002973002973002973002973002973002973000000 002975012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3E3E3E444545B7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA B7B8BAB7B8BA26282B0D172B2F58A32F58A32F58A32F58A32F58A32F58A32F58A32F58A32F58A3 1B2D50131313ABACAEB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BA9495960E0E0E 68696A78797B212121FEFDFDFDFCFCFDFBFBFDFBFBFAF8F828282B1D2D4D3157A03157A03157A0 3157A03157A03157A03157A03157A03157A00E0F15434243B6B5B7B6B5B7B6B5B7B6B5B7B6B5B7 B6B5B7B6B5B7B6B5B7B6B5B72C2B2E0A0F1B30559D3157A03157A03157A03157A03157A03157A0 3157A03157A02B4B8B08090E032260021E57323438FEFDFDFFFFFFFFFFFFFFFFFFF7F7F71B1B1C 6B6C6DB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB7B8BAB4B5B70B0D10172A4F2F58A3 2F58A32F58A2305BA43562A83C6AAD4270B14275B34373B1151F2E2E3033B3B5B8B4B6B9B4B6B9 B4B6B9B4B6B9B4B6B9B4B6B9B4B6B9B4B6B98D8F92131415767A7D555C62384B65648EC25C8ABF 5C89C06390C3658BB9090C11203C6F2F58A22F58A1305BA33561A73C69AC4070AF4274B34375B3 3B669C0E161D696D74AEB3B8B1B4B8B2B4B8B4B6B9B4B6B9B4B6B9B4B6B9B4B6B9B4B6B9111317 1120392E58A22E57A22E57A22F58A32F58A32F58A32F58A32F58A32F58A31D3158090F1901276E 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698 003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698003698 003698003698010204002975012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEE FDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3000000080808080808080808080808080808 080808080808080808080808000000000000020306020406010306020306030508030508030508 030508030508000000000000020203060607060606060707080808080808080808080808080808 00000000000078787A8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF828487000000030508 030508030508030508030508030508030508030508030508030303000000060607060607060606 070707080808080808080808080808080808000000000000010204020406010306020306030508 030508030508030508030508020305000000012261012B7A001F59323539FFFFFFFFFFFFFFFFFF FFFFFF303030000000080808080808080808080808080808080808080808080808080808000207 000000020406020406010305020509080F1715243526405F34547D385E8A1B2D41000000050506 0606070606060707070808080808080808080808080808080000000000007A7B7D8D8F92575D63 384D666490C45E8BC25E8BC16491C400000000000003050803050803060A080F17152435253F5E 33537D375D8939608C010203000202050607050507060606070707070708070708070808080808 080808000001000000020306020406010305010306020407020407020407030407030507000000 000000002975012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698 003698003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698 003698003698003698003698003698010204002975012B7A0122611D1318D07B79D07F7DD58B8A DFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7878785B5B5CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C01173F003698003698003698003698 003698003698003698003698003698002364181919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 50535701215E00369800369800369800369800369800369800369800369800369803132E616162 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B020F27003698003698 003698003698003698003698003698003698003698003494000000012B7A012B7A001F59323539 FFFFFFFFFFFFFFFFFFFFFFFF3A3B3B818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51B1E23002362003698003698003698013698063C9A1349A02559A93365AF386BB1 213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D111112 8F90928D8F92575D63384D666490C45E8BC25E8BC16491C40D121B002C7D003698003698013698 063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52A2C2D011B4E003698003698003698003698003698003698003698 0036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79 543335001E55003698003698003698003698003698003698003698003698003698001337565758 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698 003698003698003698003698003698003698003698003698010204002975012B7A0122611D1318 D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFF FFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698 00369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010103012B7A 012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A0 2559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928D8F92575D63384D666490C45E8BC25E8BC16491C4101620002C7D 003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698 0036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8 D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698003698003698 003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A 010C1F003698003698003698003698003698003698003698003698003698003698010204002975 012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F9092 78797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698 00369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698 003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63384D666490C45E8BC25E8BC1 6491C4101620002C7D003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698 0036980036980036980036980036980036980036980036980029740B1322012B7A012B7A011640 737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFB F9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698 003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698003698003698 003698010204002975012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698 00369800369800369800369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698 003698003698003698003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E454647B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8F92575D63384D66 6490C45E8BC25E8BC16491C4101620002C7D003698003698013698063C9A1349A02559A93365AF 386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2E011C4F0036980036980036980036980036980036980036980036980036980029740B1322 012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698 003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698 003698003698003698003698010103002975012B7A012261140F13D07B79D07F7DD58B8ADFA9A8 EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698 0036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B 01215E00369800369800369800369800369800369800369800369800369804132F616162B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698 003698003698003698003698003698003698003494010103012B7A012B7A001F59323539FFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C2025002362003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E 454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F9092 8D8F92575D63384D666490C45E8BC25E8BC16491C4101620002C7D003698003698013698063C9A 1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698 0036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335 001E55003698003698003698003698003698003698003698003698003698001337565758B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010B1E003698003698003698 003698003698003698003698003698003698003698000103002975012A79001235000103D07B79 D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698 0036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFF FFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698003698 04132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029 003698003698003698003698003698003698003698003698003698003494010103012B7A012B7A 001F592D2F33FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A02559A9 3365AF386BB1213B5E454647B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515168F90928D8F92575D63364B636490C45E8BC25E8BC16491C4101620002C7D003698 003698013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698 0036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8A D07F7DD07B79543335001E55003698003698003698003698003698003698003698003698003698 001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F 003698003698003698003698003698003698003698003698003698003698000104002975010E28 01040C1B1216D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 0117400036980036980036980036980036980036980036980036980036980023641A1B1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A8384868F909279797B 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698003698 00369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B011029003698003698003698003698003698003698003698003698003698003494 000102012B7A012B7A001E570A0B0CFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698 063C9A1349A02559A93365AF386BB1213B5E454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D1111118F90928D8F9253595F2A3E536490C45E8BC25E8BC16491C4 101620002C7D003698003698013698063C9A1349A02559A93365AF386BB13A6DB2121923868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698 003698003698003698003698003698003698003698002974040C1B012B7A012B7A001742656667 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEE EED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698 003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B569696A010C1F003698003698003698003698003698003698003698003698003698003698 000103010E2701050E00205C1D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698 0023641A1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0B0B 838486848587131314030303FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698 00369800369800369800369800369800369804132F616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B011029003698003698003698003698003698003698003698 003698003698003494000002012B7A01256B00030A171B1DFFFFFFFFFFFFFFFFFFFFFFFF404040 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698 003698003698013698063C9A1349A02559A93365AF386BB1213B5E454547B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1111118F90927476780D131947709F6490C4 5E8BC25E8BC16491C4101620002C7D003698003698013698063C9A1349A02559A93365AF386BB1 3A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E 011C4F003698003698003698003698003698003698003698003698003698002974010A1B012B7A 00205C0001044A4A4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B794C2F3001163F011C4F011C4F011C4F 011C4F011C4F011C4F011C4F011C4F011C4F010C224142435D5E5F5D5E5F5D5E5F5D5E5F5D5E5F 5D5E5F5D5E5F5D5E5F5D5E5F3B3C3C000613011C4F011C4F011C4F011C4F011C4F011C4F011C4F 011C4F011C4F011C4F00000001050D0028720122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0 F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698 0036980036980036980023641A1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C808183141415242425212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E 00369800369800369800369800369800369800369800369800369804132F616162B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698 00369800369800369800369800369800349400010201256B00040B010F28323539FFFFFFFFFFFF FFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C2025002362003698003698003698013698063C9A1349A02559A93365AF386BB1213B5E454547 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D131414767778090A0C 3550704E77A86490C45E8AC25E8CC16591C4101620002C7D003698003698013698063C9A1349A0 2559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698 002974020C1E00205C000205000E2A737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79482C2D000A1C 010D26010D26010D26010D26010D26010D26010D26010D26010D260005100202022D2D2D2D2D2D 2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D1D1D1D000101010D26010D26010D26010D26 010D26010D26010D26010D26010D26010D26000001002975012B7A0122611D1318D07B79D07F7D D58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698 0036980036980036980036980036980036980023641A1A1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B508080912121226262778797B212121FFFFFFFFFFFFFFFFFF FFFFFF53565A01215E00369800369800369800369800369800369800369800369800369804132F 616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B010F28003698 00369800369800369800369800369800369800369800369800349400000000040B00112D001F59 323539FFFFFFFFFFFFFFFFFFFFFFFF3E3F3F818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C2025002362003698003698003698013698063C9A1349A02559A93365AF 386BB1213B5E454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D 0E0E0F09090A36506E4F76A54E77A86591C45F8BC25F8DC26692C50F151F002C7D003698003698 013698063C9A1349A02559A93365AF386BB13A6DB2121923868788B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698 003698003698003698002974010814000205001846011640737475FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7D D07B79533335001E55003698003698003698003698003698003698003698003698003698001337 565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698 003698003698003698003698003698003698003698003698003698010103002976012B7A012261 1D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 454545000000212122212222212222212222212222212222212222212222212222060606000000 000A1C000A1C000A1C000A1C000B1D000B1D000B1D000B1D000B1D00040B000000202021212122 2121212121212122222122222122222122222122221F1F200000003131318F909278797B212121 FFFFFFFFFFFFFFFFFFFFFFFF1A1D21000000000B1D000B1D000B1D000B1D000B1D000B1D000B1D 000B1D000B1D030303000000212121212122212121212122212222212222212222212222212222 040404000000000A1C000A1C000A1C000A1C000B1D000B1D000B1D000B1D000B1D00091A000000 001435012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF0D0D0D040404212222212222212222 212222212222212222212222212222212222000207000000000A1C000A1C000A1C010B1E06152A 13294525436933568538608F274160000000212223212223212223222323222324222324222324 2223242223241314140000003952705D83B04F76A54E76A76591C5618DC3628FC36994C604090F 00050E010C1E010C1F010D2106152C13294625446A3357853860903A639311171E080808232629 232629232629232629232629232528232426222425222324000001000000030F22030F24030F23 030F23030F23020E22020D21010C1F010B1D000002000000001D54012B7A011640737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0 DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698003698 003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 69696A010C1F003698003698003698003698003698003698003698003698003698003698010103 002976012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7878783E3F406D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F35353600071600215D00215D00215D00215D00215D00215D00215D00215D00215D001846 0505056D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F060606838486 8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF4C4F5300164100215D00215D00215D00215D 00215D00215D00215D00215D00215D010B1F4040416D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F 6D6E6F6D6E6F6D6E6F3E3F4000040C00215D00215D00215D00215D00215D00215D00215D00215D 00215D00205C000000012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF3333335A5B5C 6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F6D6E6F11131701143B00215D00215D 00215D01225E062964133874254E89325D993865A23A6194345174476485476485476485476485 4764854764854764854764854764854663842B46655E84B15D83B04F76A34D75A66A95C66791C4 6892C66F96C8395C852B507F2B50812B50812B50812D5385335B8F3B669C416EA64471AC4572AC 406C9E3C608B3D618C3E618C3E618C3E618B3F628A416288436388456386466385314E70264469 2B50812B50802A4E80274C7D2246791A3C720F316906286301235E001C5209101D012B7A012B7A 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698 003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698003698 003698003698010103002976012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEE FDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698 0036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698 00369800369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698 003698003698003698003698003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025 002362003698003698003698003797053B9A1246A02356A83063AE3769B13861984A6F9B688EB9 688EB9688EB9688EB9688EB9688EB9688EB9688EB9688EB96287B33D628E5F84B05D82B04F75A1 4F74A1759BCB7299CA7399CA769CCB3F65913869AA386BB1386BB1376BB0386CB13C6EB34273B6 4578B84879B84779B94878AF5180B75483BB5483BA5584BB5885BA5C87BA608AB9648BB9668DB9 688DB943699438649D386AB2386AB13568AF2E61AC2356A8164BA10B409C043999003797002974 0B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698 003698003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698 003698003698003698003698003698010103002976012B7A0122611D1318D07B79D07F7DD58B8A DFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698 0036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 54565B01215E00369800369800369800369800369800369800369800369800369804132E616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698 003698003698003698003698003698003698003698003494010103012B7A012B7A001F59323539 FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C2025002362003698003698003698003697043A990E429E1D50A4295DAA3063AE 32588C4A6A937090B97090B97090B97090B97090B97090B97090B97090B97090B96888B13A5A82 6484AD6283AA5071984E6F968BABD187A9D186A8D187A8D13C5D873362A63365AF3365AF3264AD 3366AF3769B13D6FB24174B54476B84577B74774AC527FB65784BA5985BA5C86BA6188BA668BB9 6A8DB96E8FB96F90B97090B941628A335C963265AE3164AD2B5FAB2256A6164BA10B409C053A99 0136980035970029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79 543335001E55003698003698003698003698003698003698003698003698003698001337565758 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698 003698003698003698003698003698003698003698003698010103002976012B7A0122611D1318 D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFF FFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698 00369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010103012B7A 012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003597023898083D9C 1347A01D50A42356A825467549607F8099B78099B78099B78099B78099B78099B78099B78099B7 8099B7748DAB2F48667087A66E86A4536A884F6783AEC4DFACC3DEA8C0DEA7C0DC344D6E25549B 2559A92559A92458A82559A9295CAB3062AE3769B03C6EB33E71B4416A9D5780B1628AB9658CB9 6B8EB87292B87895B77C97B77E98B77F99B78099B73B5472264B832559A82356A81D52A51449A0 0B409C053A990136980035970036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8 D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698003698003698 003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A 010C1F003698003698003698003698003698003698003698003698003698003698010103002976 012B7A012261090608D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F9092 78797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698 00369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698 003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 003698003797033999083D9C0E429E1246A0132E5746546496A5B696A5B696A5B696A5B696A5B6 96A5B696A5B696A5B696A5B68593A42230407C8B9C7D8B9B546272515E6BD5E0EFD4DFEDD1DDED D0DDEC27374B13418C1349A01349A01349A01348A0154BA11B50A42256A72A5CAB2D60AB31527A 6382A57896B77F99B7859CB68CA0B691A2B594A4B596A4B596A5B696A5B632415213356A1348A0 1246A00E439D093E9B0439990136980035970036980036980029740B1322012B7A012B7A011640 737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFB F9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698 003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B569696A010B1E003698003698003698003698003698003698003698003698003698 003698000102002976012B7A001843000308D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698 00369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698 003698003698003698003494010103012B7A012B7A001F59313439FFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698003698003597003797023898043A99053B9A061C42444950A7ADB4A7ADB4 A7ADB4A7ADB4A7ADB4A7ADB4A7ADB4A7ADB4A7ADB492989E191E24888E94888E94565C6152585B F1F5F9EFF5F8EFF4F8EEF3F81F2731063381063C9A063C9A063C9A053B99063C99093E9A0E439D 12489F164BA01E324972839594A3B49AA5B49EA9B4A2ABB4A5ACB3A7ACB3A7ADB4A7ADB4A7ADB4 2D3339062457063C9A053B9A043A990238980037970035970036980036980036980029740B1322 012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698 003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698 003698003698003698003698000103002976001946000206191115D07B79D07F7DD58B8ADFA9A8 EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698 0036980036980036980036980023641A1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B8384868F909278797B1D1D1DFFFFFFFFFFFFFFFFFFFFFFFF54565B 01215E00369800369800369800369800369800369800369800369800369804132E616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B011029003698003698003698 003698003698003698003698003698003698003494000102012B7A012B7A001F580C0D0FFFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C2025002362003698003698003698003698003698003698003597003697003797011438 444548AFB1B4AFB1B4AFB1B4AFB1B4AFB1B4AFB1B4AFB1B4AFB1B4AFB1B497999C1213148D8F92 8D8F92585B5C515252FBFBFDFCFDFDFBFDFDFBFCFD1C2027012D7D013698013698013698013698 013698013696013897043B98053B991019277E858BA8ADB3A9AEB4ACAFB3ADAFB3AFB1B4AFB1B4 AFB1B4AFB1B4AFB1B42B2D30011D50013698003797003697003597003698003698003698003698 003698002974060E1D012B7A012B7A01153D696A6BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335 001E55003698003698003698003698003698003698003698003698003698001337565758B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698 003698003698003698003698003698003698003698000103001845000206001C531D1318D07B79 D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698 0036980036980036980036980036980036980036980023641A1A1BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A8384868E8F913A3B3C040404FFFFFFFFFFFF FFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698003698 04132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B011029 003698003698003698003698003698003698003698003698003698003494000002012B7A002976 00091B070A0FFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698 003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1010118F909288898B212122020202FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698 0036980036980036980036980035970035970036970037970B1018838687AFB1B3B0B1B4B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698 003698003698003698003698002974000A1A012B7A01266D0003096A6C6CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8A D07F7DD07B79402729001A4B002873002873002873002873002873002873002873002873002873 0011324C4C4D8687888687888687888687888687888687888687888687888687885B5C5E000818 002873002873002873002873002873002873002873002873002873002873000000000206002364 0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C 0117400036980036980036980036980036980036980036980036980036980023641A1B1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C8384852D2E2E121212 1F1F1FFFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698003698 00369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698003494 000102002976000B1E010814323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698 003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59A9B9D131414868688161617222223565656FFFFFFFFFFFFFFFFFFFFFFFF 1C1F25002C7D0036980036980036980036980036980036980036980036980036980B0F17868788 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698 003698003698003698003698003698003698003698002974020C1E01266D00040C000B1E737475 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEE EED0D0DFA9A8D58B8AD07F7DD07B79362124000309010713010713010713010713010713010713 010713010713010713000004050506151616161616161616161616171616171616171616171616 171616080808010408000713010713000713000713010713010713010713010713010713010713 00000001215F012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698 0023641A1B1BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 2B2B2C131414747577212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698 00369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B010F28003698003698003698003698003698003698003698 003698003698003494000002000B1E010917001E57323539FFFFFFFFFFFFFFFFFFFFFFFF404040 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698 003698003698003698003698003698003698003698003698001337454546B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1010111616172828285A5B5C565656FFFFFF FFFFFFFFFFFFFFFFFF1C1F24002C7D003698003698003698003698003698003698003698003698 0036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E 011C4F003698003698003698003698003698003698003698003698003698002974010A1A00040C 00102D011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698 003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698 003698003698003698010102002976012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0 F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F000000525253525253525253525253 525253525253525253525253525253181919000000001846001846001846001846001846001846 001846001846001846010D26000000515253525253525253525253525253525253525253525253 5252535252530000001919198B8C8D78797B212121FFFFFFFFFFFFFFFFFFFFFFFF383A3F00050F 00184600184600184600184600184600184600184600184600184603050A060606515253525253 525253525253525253525253525253525253525253161617000000001846001846001846001846 001846001846001846001846001846001743000000010917012A78001F59323539FFFFFFFFFFFF FFFFFFFFFFFF1F1F1F232324525253525253525253525253525253525253525253525253525253 00020600071300184600184600184600184600184600184600184600184600184600030A000000 51525352525352525352525352525352525352525352525352525339393A0000001717188F9092 5A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF00000100102D001846001846001846001846001846 001846001846001846001846050505282929515253525253525253525253525253525253525253 525253525253000001000001001846001846001846001846001846001846001846001846001846 010D2500000000102D012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55 003698003698003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698 003698003698003698003698003698003698010103002976012B7A0122611D1318D07B79D07F7D D58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7676762424253D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E1F1F1F000102001234001234001234 001234001234001234001234001234001234010D260000003D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E0203038384868F909278797B212121FFFFFFFFFFFFFFFFFF FFFFFF424447010E28001234001234001234001234001234001234001234001234001234000612 2424253D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E252526000000001234 001234001234001234001234001234001234001234001234001234000000012A78012B7A001F59 323539FFFFFFFFFFFFFFFFFFFFFFFF2020203737383D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E0A0B0D000F2B001234001234001234001234001234001234001234001234 0012340008190606063D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E3A3B3B 0D0D0D8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF08090B001131001234001234 0012340012340012340012340012340012340012340102032C2C2C3D3E3E3D3E3E3D3E3E3D3E3E 3D3E3E3D3E3E3D3E3E3D3E3E3D3E3E111212010B22001234001234001234001234001234001234 00123400123400123400102F03060B012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7D D07B79543335001E55003698003698003698003698003698003698003698003698003698001337 565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698 003698003698003698003698003698003698003698003698003698010103002976012B7A012261 1D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740 0036980036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121 FFFFFFFFFFFFFFFFFFFFFFFF53565A01215E003698003698003698003698003698003698003698 00369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B021029003698003698003698003698003698003698003698003698003698003494010103 012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF3F3F3F818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698 003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25 002C7D0036980036980036980036980036980036980036980036980036980B0F17868788B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698 0036980036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0 DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698003698 003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 69696A010C1F003698003698003698003698003698003698003698003698003698003698010103 002976012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54B4C4C011740003698003698003698003698003698003698003698003698003698002364 1B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838486 8F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698 00369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698 003698003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698 003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFF FFFFFFFFFFFF1C1F25002C7D003698003698003698003698003698003698003698003698003698 0B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F 0036980036980036980036980036980036980036980036980036980029740B1322012B7A012B7A 011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698 003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698003698 003698003698010103002976012B7A0122611D1318D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEE FDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698 0036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698 00369800369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698 003698003698003698003698003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFF FFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025 002362003698003698003698003698003698003698003698003698003698001337454547B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C 565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698003698003698 0036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698003698002974 0B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698 003698003698003698003698003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698003698003698003698 003698003698003698003698003698010103002976012B7A012261110B0ED07B79D07F7DD58B8A DFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7979795C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698 0036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFFFFFFFFFFFFFFFFFFFF 54565B01215E00369800369800369800369800369800369800369800369800369804132E616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698 003698003698003698003698003698003698003698003494010103012B7A012B7A001F59323539 FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698003698003698 001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D151516 8F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698 0036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698 0036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79 543335001E55003698003698003698003698003698003698003698003698003698001337565758 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A010C1F003698003698 003698003698003698003698003698003698003698003698010103002976012B7A011D5222171A D07B79D07F7DD58B8ADFA9A8EED0D0F9EFEEFDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698 0036980036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F909278797B212121FFFFFF FFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698 00369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 021029003698003698003698003698003698003698003698003698003698003494010103012B7A 012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698 003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D 0036980036980036980036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698 0036980036980036980036980036980029740B1322012B7A012B7A011640737475FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8 D58B8AD07F7DD07B79543335001E55003698003698003698003698003698003698003698003698 003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B569696A 010C1F003698003698003698003698003698003698003698003698003698003698010103002976 001E56090609C27371D07B79D07F7DD68D8BE0AAA9EED2D1F9EEEEFDFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2A04EE29E4A E29E4AF4D9B87979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4B4C4C0117400036980036980036980036980036980036980036980036980036980023641B1B1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384868F9092 78797B212121FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698003698003698003698 00369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698003698003698003698 003494010103012B7A012B7A001F59323539FFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698 003698003698003698003698003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928F90925A5B5C565656FFFFFFFFFFFFFFFFFF FFFFFF1C1F25002C7D0036980036980036980036980036980036980036980036980036980B0F17 868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698 0036980036980036980036980036980036980036980036980029740B1322012B7A012B7A011640 737475F4DABAE29E4AE29E4AE29F4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFB F9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335001E55003698003698003698003698003698 003698003698003698003698001337565758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B569696A010C1F003698003698003698003698003698003698003698003698003698 003698010103001E55090609A3615FCF7B79CF7D7BD1827FD7918EE1AEADEFD5D4F9F0EFFDFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD87D0DD57501D57501EEC5937979795C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698003698003698003698 0036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384868F90925C5C5E282828FFFFFFFFFFFFFFFFFFFFFFFF54565B01215E003698003698 00369800369800369800369800369800369800369804132E616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698003698003698003698 003698003698003698003494010103012B7A012B7A0A1F45393A3DFFFFFFFFFFFFFFFFFFFFFFFF 404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C2025002362 003698003698003698003698003698003698003698003698003698001337454547B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168F90928D8E90444445535354 FFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698003698003698003698 0036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2C2E011C4F0036980036980036980036980036980036980036980036980036980029740B1321 012B7A002976101C326E6E6EEEC695D57501D57501D77B0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B79543335011D5100318A00318A 00318A00318A00318A00318A00318A00318A00318A001235525354A1A2A4A1A2A4A1A2A4A1A2A4 A1A2A4A1A2A4A1A2A4A1A2A4A1A2A4666667000A1C00318A00318A00318A00318A00318A00318A 00318A00318A00318A00318A000000080608A3615FCF7B79D07D7BD07F7DD48886DB9C9AE6BBBA F2DCDCFAF3F3FDFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDA841AD57501D57501EBBC827979795C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698003698003698003698 0036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D83848648494A272727EAEAEAFFFFFFFFFFFFFFFFFFFFFFFF54565B 01215E00369800369800369800369800369800369800369800369800369804132E616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029003698003698003698 003698003698003698003698003698003698003494010103012A79071733313337F4F4F4FFFFFF FFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C2025002362003698003698003698003698003698003698003698003698003698001337 454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59A9B9D1515168C8D8F 2F2F304C4C4CFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698003698003698003698 0036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698003698003698003698 0036980029740B13220028740A1220606164FEFEFEEBBD84D57501D57501D98217FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EFEEEED0D0DFA9A8D58B8AD07F7DD07B798F5656 0000000A080B0A080B0A080B0A080B0A080B0A080B0A080B0A080B0A080B000000000000100C0C 100C0C100C0C100C0C100C0C100C0C100C0C100C0C100C0C00000000000009070A0A080B0A080B 0A080B0A080B0A080B0A080B0A080B0A080B0A080B000000A15F5ECF7B79D07D7BD07F7DD38786 D99895E2B1AFEDCFCEF6E9E8FCF7F7FEFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE9235D57501D57501E6AD667979795C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54B4C4C011740003698003698 0036980036980036980036980036980036980036980023641B1B1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D454647272727EAEAEAFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF54565B01215E003698003698003698003698003698003698003698003698003698 04132E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B021029 003698003698003698003698003698003698003698003698003698003494010103071733313337 F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF404040818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C2025002362003698003698003698003698003698003698003698 003698003698001337454547B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9A9B9D1515152F2F304C4C4CFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C1F25002C7D003698 0036980036980036980036980036980036980036980036980B0F17868788B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2E011C4F003698003698003698003698003698 0036980036980036980036980029740A12200A1220606164FEFEFEFFFFFFE7AE68D57501D57501 DE9133FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9EEEEEED2D1E0AAA9D68D8B D07F7DD07D7BD07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79 D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79 D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79D07B79CF7D7B D07F7DD38786D99895E1AFAEECCBCBF5E4E4FAF4F4FDFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3A355D57501D57501 E0973D7979794B4B4C6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70363637 00123201215E01215E01215E01215E01215E01215E01215E01215E01215E0018441212126E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70000000222223EAEAEAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF515458011C4F01215E01215E01215E01215E01215E01215E 01215E01215E01215E030F255051526E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F70 6E6F70414142000A1D01215E01215E01215E01215E01215E01215E01215E01215E01215E00215D 000000313337F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B3B3B6262646E6F706E6F70 6E6F706E6F706E6F706E6F706E6F706E6F706E6F7016191E011D5101215E01215E01215E01215E 01215E01215E01215E01215E01215E000F2C3737376E6F706E6F706E6F706E6F706E6F706E6F70 6E6F706E6F706E6F7068696A0000004C4C4CFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 17191E001F5801215E01215E01215E01215E01215E01215E01215E01215E01215E0A0C11636465 6E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F706E6F7022242501174001215E01215E 01215E01215E01215E01215E01215E01215E01215E001D54000000606164FEFEFEFFFFFFFFFFFF E0983FD57501D57501E3A253FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBF9F0EF EFD5D4E1AFAED79290D28382D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7DD07F7D D07F7DD07F7DD1827FD48886D99895E1AFAEECCBCBF4E2E2FAF3F2FDFBFBFEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EBBD85D57501D57501D87D0EECEBEA4D4D4D5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B4A4A4A36393D53555A53555A53555A53555A53555A53555A53555A53555A53555A 484A4F4A4B4C5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B575757828282 FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D7D8484A4F53555A53555A53555A 53555A53555A53555A53555A53555A5254593D3F423E3E3F5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B4A4A4A44474B53555A53555A53555A53555A53555A53555A53555A 53555A53555A4E5155898C8EFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C2 5353535B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5A5A5A393A3C3D404453555A 53555A53555A53555A53555A53555A53555A53555A5254593F41454344445B5B5B5B5B5B5B5B5B 5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B525252A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFAAACAE4E515553555A53555A53555A53555A53555A53555A53555A53555A 51535827282A4D4D4D5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5A5A5A414141 3C3E4253555A53555A53555A53555A53555A53555A53555A53555A53555A47494EB2B4B7FFFFFF FFFFFFFFFFFFFFFEFDD87E10D57501D57501EBBC82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFCFCFAF3F3F2DDDDE7BDBCDDA19FD79190D68D8BD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8AD58B8A D58B8AD58B8AD58B8AD58B8AD68D8BD7918EDB9C9AE2B1AFECCBCBF4E2E2FAF3F2FDFBFBFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF4DAB9D57501D57501D57501F7E2C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E4CDD57501D57501D57501F3D8B6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCF8F8F7E9E9EFD3D2E7BDBCE1AFAEE0ABA9E0AAA8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8 DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8DFA9A8E0AAA8E0ABA9E1AFAEE6BBBAEDCFCEF5E4E4FAF3F2 FDFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF6D77A08D57501D57501EAB97CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBB81D57501D57501D67906FEFAF4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBFBFBF5F5F7E9E9F2DDDDEFD5D4 EED1D1EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0 EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED0D0EED1D1EFD5D4F2DCDC F6E9E8FAF4F4FDFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE29E4AD57501D57501 DB8822FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8B27D57501 D57501E19B45FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFBFB FCF8F8FAF3F3F9F0F0F9EEEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEEF9EFEE F9EEEEF9F0F0FAF3F3FCF8F8FDFBFBFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1D0A7D57501D57501D57501F3D5B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F4DBBBD57501D57501D57501F0CCA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFDFDFDFCFCFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFBFB FDFBFBFDFBFBFDFBFBFDFBFBFDFBFBFDFCFCFEFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFBF7D98116D57501D57501DE9234FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE0983FD57501D57501D87F11FEFAF4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECBE86D57501D57501D57501EFCA9DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D4AFD57501D57501D57501EAB87AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF4DA841BD57501 D57501D87D0EFAEEDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5ECDA841AD57501D57501D87F12FDF6EE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1D0A8D57501D57501D57501DD8D2CFDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBE19B45D57501D57501 D57501EEC695FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A75BD57501D57501D57501DE9234FCF5EBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAE4A456 D57501D57501D57501E09942FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF4DE9133D57501D57501D57501 DA861EF6DFC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBF1E5E09840D57501D57501D57501DA851DFCF3E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF3E7 DD8D2BD57501D57501D57501D67601E4A659F7E5CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDF8F1ECC08AD87E10D57501D57501D57501D98115F8E8D3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCF5ECE0973ED57501D57501D57501D57501D57501DC8A26E5AA61EBBD85 EEC593EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EFCA9DF2D5B0FAEDDCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF5F7E2C9F1D1A9EFC99AEEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695EEC695 EEC695EDC491EAB97CE29E4BD77A08D57501D57501D57501D57501DB861FF8E8D4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCEABA7ED67906D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501DA841B E8B270FAEDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8EFCA9CE19A43D67804D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501E2A04EFCF5EB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBDA E5A95FD67906D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D67703E7AE69FDF8F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEFCA9CD98217D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501DE9031 F2D5B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCF5ECF0CC9FE5A85EDD8F30DA8319D77C0CD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD67703D57501D57501D57501D57501D57501D57501DA861EF7E4CDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF3E8E09942D57501D57501D57501 D57501D57501D57501D57501D67805D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0A D77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD77B0AD87D0EDA861EE09941 E9B678F7E2C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBF1E5F1D1AAE3A150D67702D57501D57501D57501 D77A09F4DABAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EAD8DA851CD57501 D57501D57501D57501DB8924EBBC82F6E1C7FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E8D3 DF9438D57501D57501D57501D77A08F6DFC3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAECDB D98115D57501D57501D57501D98218F1CEA4FFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFEFCE7B06CD57501D57501D57501D98115FBF0E2FFFFFFFFFFFFFFFFFF FFFFFFFDF7EFDC8A25D57501D57501D57501E09942FCF5EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9B474D57501D57501D57501E09942 FFFFFEFFFFFFFFFFFFFFFFFFE4A557D57501D57501D57501E3A150FFFCF9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE3A150 D57501D57501D57501F0CB9EFFFFFFFFFFFFF2D5B0D57501D57501D57501DF9438FEFCF8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDF6EED98218D57501D57501DA841AFEFAF5FFFDFADB8822D57501D57501D87E0F FBEFE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CEA4D57501D57501D57501EEC694F0CB9ED57501 D57501D57501EEC694FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDD8E2DD57501D57501 DC8A25DD8D2CD57501D57501DB8924FFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F0CC9FD57501D57501D57501D57501D57501D57501EEC797FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFAF5D77C0CD57501D57501D57501D57501D77A09FDF8F2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A557D57501D57501D57501D57501E3A252 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCA9CD57501D57501 D57501D57501EFC899FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F9E9D6D57501D57501D57501D57501F8E8D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFEFCD77A08D57501D57501D77907FFFDFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5A5A52727272727273333337A7A7AF7F7F7FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC8A25D57501D57501DB8823FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF828282464646DFDFDFC3C3C32B2B2B 636363FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0973ED57501D57501 DF963CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF828282505050 FFFFFFFFFFFFA0A0A01A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E29E4AD57501D57501E19C47FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF828282505050FFFFFFFFFFFF8E8E8E323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF8E8D3F5DDBFF5DDBFF8E7D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF828282363636AAAAAA858585101010A9A9A9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8282821D1D1D5E5E5E7B7B7BCBCBCBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF828282505050FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F9F9F9E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E5E5E5 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E5E5E5E3E3E3E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 828282505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFE0E0E0A3A3A3E3E3E3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE9E9E93A3B3B080808141414141414141414141414141414141414141414141414 0F0F0F0408100102030C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130A0C10101010 0000001414141414141414141414141414141414141414141414141414140102040000000A0D10 0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130303030000000E0E0E141414141414 1414141414141414141414141414141414140000000204070507090C0E130C0E130C0E130C0E13 0C0E130C0E130C0E130C0E13050709131313030303141414141414141414141414141414141414 1414141414141212120509110000010C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13 0B0D120B0B0B000000131313141414141414141414141414141414141414141414141414000102 000000090B0F0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130000000000000C0C0C 14141414141414141414141414141414141414141414141402020203060C0305070C0E130C0E13 0C0E130C0E130C0E130C0E130C0E130C0E13090B0F000000505050FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF848484535353FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7272725A5A5AAEAEAE 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD9D9D9171717797A7BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4A5A6A806080B1B335E325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 2F58A40C0F143B3C3DBEBFC1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4343537 060B152D549D325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC17294C101011A9AAAC C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C476767802030625447F325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC294D90090A0B616263C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B3B3B50C0E1116284A325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC315CAA0F151F2A2A2BB9BABCC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C44C4D4E04070C2A4F93325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1B335F 0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48B8C8D030407203C6F 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC3059A5131C2C061023777778FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 727272CDCDCDFFFFFF3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9171717797A7BC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4A5A6A806080B1C335E325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC2F58A40C0F143C3C3EBEBFC1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4343537070C152D549D325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC17294C 101011A9AAACC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C476767802030625447F 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC294D90090A0B616264C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B3B3B50C0E1116284B325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC315CAA0F151F2A2A2BB9BABCC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C44C4D4E04070C2A4F93325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC1B335F0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48B8C8D 030407203C6F325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC3059A5131C2C091834 01163E787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF727272CDCDCDFFFFFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D9040404696A6B808182808182 808182808182808182808182808182808182717172000000172C50213E72213E72213E72213E72 213E72213E72213E72213E72203B6D0102032D2E2F7F8081808182808182808182808182808182 80818280818280818221222403050A203B6E213E72213E72213E72213E72213E72213E72213E72 213E720F1C330505057A7B7C80818280818280818280818280818280818280818280818258595A 0000001E3767213E72213E72213E72213E72213E72213E72213E72213E721C3664000000525254 80818280818280818280818280818280818280818280818277777800000012213D213E72213E72 213E72213E72213E72213E72213E72213E72203D7106090D1C1D1D7E7F80808182808182808182 80818280818280818280818280818239393A0001021F3A6C213E72213E72213E72213E72213E72 213E72213E72213E72122240000000777879808182808182808182808182808182808182808182 8081826464650000001C3461213E72213E72213E72213E72213E72213E72213E72213E72203C70 111929091834012A7901163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737373CECECEFFFFFF414141FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D6D6D282829 3E3F403E3F403E3F403E3F403E3F403E3F403E3F403E3F403E3E3F020202000000091833091833 0515300716310E1D380E1D380E1D380E1D380E1D3802050B000000333539333539333437373738 3E3F403E3F403E3F403E3F403E3F4030303100000008163009183308173204122D0E1D380E1D38 0E1D380E1D380E1D380C19310000002E2F323335393335393334353D3D3E3E3F403E3F403E3F40 3E3F4038393A00010404102409183309183304122D0C1B360E1D380E1D380E1D380E1D380D1C36 000000000000333539333539333437393A3B3E3F403E3F403E3F403E3F403E3F400F0F0F000000 0918330918330615300615300E1D380E1D380E1D380E1D380E1D38070E1D000000333539333539 3335383536373E3F403E3F403E3F403E3F403E3F4033333400000006142B09183309173202112C 0E1D380E1D380E1D380E1D380E1D380D1A330101012A2B2E3335393335393334353C3C3D3E3F40 3E3F403E3F403E3F403B3B3C000001030D1F09183309183304132E0A19340E1D380E1D380E1D38 0E1D380E1C3700000009101C012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFDFDFD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F 01173F003698003698003698003698003698003698003698003698003698002466191A1AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698 003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698 00369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698012F85 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F 0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698 0036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698003698 002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 013390003698003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698 00369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698 003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B503060B002D7F0036980036980036980036980036980036980036980036980036980B0F16 88898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698 0036980036980036980036980036980036980036980036980028730B1423012B7A012B7A01163F 787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698 003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698003698 080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262 00369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698 003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698 0036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 282A2C011C510036980036980036980036980036980036980036980036980036980028730B1423 012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698 003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698 003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B515181E00226200369800369800369800369800369800369800369800369800369800143A 3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698 003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698 0036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698 0036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF898989 C6C6C6FFFFFFA6A6A66F6F6FA1A1A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF868686 ECECECFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C48A8A8AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B69B9B9B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F 003698003698003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698 003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698 00369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6C010F29003698003698003698003698003698003698003698003698003698012F85090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698 0036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698 0036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4E1E1E1FFFFFFFFFFFF FFFFFFEAEAEA0C0C0CEAEAEAFFFFFF4E4E4E757575D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0B0B0BD3D3D3F8F8F8050505C6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF474747999999FFFFFFBEBEBE 3D3D3D0E0E0E292929ABABABFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E9E9E 1F1F1FA6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC8D8D8D1E1E1EDEDEDEFFFFFF FFFFFFD7D7D71C1C1CFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698003698002466 191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390 003698003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698 00369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698 003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 03060B002D7F0036980036980036980036980036980036980036980036980036980B0F1688898B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698 0036980036980036980036980036980036980036980028730B1423012B7A012B7A01163F787879 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5A5A5 3A3A3AFFFFFFFFFFFFFFFFFF949494464646FFFFFFFFFFFF4E4E4EA0A0A0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B0B0BD3D3D3FFFFFFCACACAF9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7070707 ECECECFFFFFF828282B6B6B6E4E4E4757575070707EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEBEBEB1C1C1C2F2F2F909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F23636365E5E5E 000000D7D7D7FFFFFFFFFFFFFFFFFF2F2F2FB7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698003698003698003698003698003698 00369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B500010301339000369800369800369800369800369800369800369800369800369808090B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513161B002262003698 00369800369800369800369800369800369800369800369800143A3F4041B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698 003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B502050A002D7F003698003698003698003698003698003698003698003698 0036980A0E1588898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C 011C51003698003698003698003698003698003698003698003698003698002873000919012B7A 012B7A01153D313132FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE8E8E8898989656565828282EAEAEAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBBBBBB6E6E6E7373737F7F7F999999FFFFFFFFFFFFC3C3C37373737A7A7AD4D4D4 FFFFFFCCCCCC5252521C1C1C7F7F7FBABABAFFFFFF484848939393FFFFFFFFFFFF4E4E4EA0A0A0 FFFFFFFFFFFFEBEBEB818181666666AAAAAAFFFFFFFFFFFF0B0B0BD3D3D3FFFFFF838383ECECEC FFFFFFFFFFFFBABABA6F6F6F7A7A7ADFDFDFFFFFFFFFFFFFC3C3C37373737A7A7AD4D4D4FFFFFF FFFFFF9D9D9D3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4000000C8C8C8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF6565658686864B4B4B909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3CACACAFBFBFB000000D7D7D7FFFFFFFFFFFFFFFFFF7C7C7C646464FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698 00369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698 00369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 14181D00226200369800369800369800369800369800369800369800369800369800143A3F4042 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698 003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698 0036980036980036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698 002873010C1E012B7A01153C00020669696AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B6B6B848484AEAEAE5555553E3E3EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFBABABA1F1F1FADADAD6D6D6D0E0E0EABABABFFFFFFABABAB242424 A8A8A87D7D7D121212D9D9D9D5D5D55D5D5D202020909090C6C6C6FFFFFF141414B4B4B4FFFFFF FFFFFF4E4E4EA0A0A0FFFFFFFFFFFF3E3E3E777777B6B6B67C7C7CFFFFFFFFFFFF0B0B0BD3D3D3 FFFFFF0B0B0BD3D3D3FFFFFF9F9F9F121212828282848484545454FFFFFFABABAB242424A8A8A8 7D7D7D121212D9D9D9FFFFFF6969695E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD050505 EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB272727F8F8F84B4B4B909090FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB000000D7D7D7FFFFFFFFFFFFFFFFFF9D9D9D3F3F3F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698 00369800369800369800369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698 00369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B515181D002262003698003698003698003698003698003698003698003698 00369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C 010F29003698003698003698003698003698003698003698003698003698012F85090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698 0036980036980036980036980036980036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698 003698003698003698002873020C1F01153D010308001337787879FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DBDBDB050505FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF727272787878FFFFFFFBFBFB090909DFDFDF FFFFFF2D2D2DB0B0B0FFFFFFFFFFFF4F4F4F7B7B7BFFFFFFA5A5A5393939FFFFFFFFFFFFF7F7F7 000000D0D0D0FFFFFFFFFFFF4E4E4EA0A0A0FFFFFFFFFFFF1A1A1AB0B0B0FFFFFFFFFFFFFFFFFF FFFFFF0B0B0BD3D3D3FFFFFF0B0B0BD3D3D3FFFFFF272727929292FFFFFFFFFFFFFEFEFEFFFFFF 2D2D2DB0B0B0FFFFFFFFFFFF4F4F4F7B7B7BFFFFFF4C4C4C7A7A7AFFFFFFFFFFFFFFFFFFFFFFFF FDFDFD3D3D3D6B6B6BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE373737B5B5B5FFFFFF4B4B4B 909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB000000D7D7D7FFFFFFFFFFFF FFFFFFB9B9B91D1D1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF777777575859AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD 4C4D4D01153C003391003391003391003391003391003391003391003391003391002365181818 AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD00010201328F003391 00339100339100339100339100339100339100339100339107080A9A9B9CAAABADAAABADAAABAD AAABADAAABADAAABADAAABADAAABADAAABAD13161B012260003391003391003391003391003391 0033910033910033910033910013373E3E3FAAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABAD69696B010E27003391003391003391003391003391003391003391003391003391 002E82080808AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD010409 002C7D0033910033910033910033910033910033910033910033910033910A0E15868788AAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD27292B011C4F003391003391003391 00339100339100339100339100339100339100287100050C01030800246801163F787879FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E4E4E4727272444444303030000000FCFCFCFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D2B2B2BCFCFCF A7A7A7151515F9F9F9FEFEFE0505052424242C2C2C2C2C2C171717727272FFFFFFA5A5A5393939 FFFFFFFFFFFFEDEDED000000DEDEDEFFFFFFFFFFFF4E4E4EA0A0A0FFFFFFFFFFFFAAAAAA121212 4D4D4DCBCBCBFFFFFFFFFFFF0B0B0BD3D3D3FFFFFF0B0B0BD3D3D3FBFBFB030303CDCDCDFFFFFF FFFFFFFFFFFFFEFEFE0505052424242C2C2C2C2C2C171717727272FFFFFF424242898989FFFFFF FFFFFFFFFFFFFFFFFF757575323232F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F4D4D4D FFFFFFFFFFFF4A4A4A909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB000000 D7D7D7FFFFFFFFFFFFFFFFFFC8C8C8060606FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4A4A000000030303030303030303030303030303030303 030303030303030303000000000000000103000103000103000103000103000103000103000103 000103000000000000030303030303030303030303030303030303030303030303030303030303 000104000001000103000103000103000103000103000103000103000103000102070707000000 030303030303030303030303030303030303030303030303020202000205000000000103000103 000103000103000103000103000103000103000103000000000000030303030303030303030303 030303030303030303030303030303000000000000000102000103000103000103000103000103 000103000103000103000000000000030303030303030303030303030303030303030303030303 030303030303000206000000000103000103000102000103000103000103000103000103000102 080808000000030303030303030303030303030303030303030303030303030303000002000000 000103000103000103000103000103000103000103000103000103000000000001002772012B7A 01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2F2F2F808080EDEDEDDEDEDE000000FCFCFCFFFFFFFFFFFFFFFFFFFFFFFF 8484844B4B4B414141545454CDCDCDFFFFFFFFFFFF101010C8C8C8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFA5A5A5393939FFFFFFFFFFFFFBFBFB000000C4C4C4FFFFFFFFFFFF4E4E4EA0A0A0FFFFFF FFFFFFFFFFFFF4F4F48D8D8D0A0A0AE8E8E8FFFFFF0B0B0BD3D3D3FFFFFF0B0B0BD3D3D3FFFFFF 090909CACACAFFFFFFFFFFFFFFFFFFFFFFFF101010C8C8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5151516F6F6FFFFFFFFFFFFFFFFFFF8E8E8E222222E7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF616161070707070707070707020202040404656565FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFBFBFB000000D7D7D7FFFFFFFFFFFFFFFFFFAEAEAE141414FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698 003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698 003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E 00226200369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698 003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698 0036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698002873 0B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE070707BFBFBFFFFFFFA2A2A2000000FCFCFCFFFFFF 9B9B9BD6D6D6FFFFFF595959585858ABABABB8B8B8E0E0E0FFFFFFFFFFFF535353636363FDFDFD FFFFFFF2F2F2ECECECFFFFFFB2B2B2191919F9F9F9FEFEFEFFFFFF202020A8A8A8FFFFFFFFFFFF 4E4E4EA0A0A0FFFFFFF9F9F9D6D6D6FFFFFFF7F7F70E0E0ED5D5D5FFFFFF0B0B0BD3D3D3FFFFFF 0B0B0BD3D3D3FFFFFF464646636363FEFEFEF3F3F3A1A1A1FFFFFF535353636363FDFDFDFFFFFF F2F2F2ECECECFFFFFF767676525252FFFFFFFFFFFF9D9D9D1D1D1DDFDFDFFFFFFFFFFFFFFFFFFF FFFFFFF8F8F8808080EEEEEEFFFFFFFFFFFFFFFFFFFFFFFF4B4B4B909090FFFFFFFFFFFFA3A3A3 C4C4C4FFFFFFFFFFFFFFFFFFFBFBFB000000D7D7D7FFFFFFFFFFFFFFFFFF929292393939FFFFFF FFFFFFA3A3A3C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698 003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698 003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698003698 00143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29 003698003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698 0036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698 0036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8181810C0C0C2D2D2D626262 0B0B0BFCFCFCFFFFFF1F1F1F979797FFFFFF9C9C9C2B2B2B6C6C6C5A5A5A141414929292FFFFFF E2E2E23E3E3E1919192D2D2D1E1E1EC3C3C3FFFFFFF1F1F12424241212127D7D7DFFFFFF595959 7A7A7AFFFFFFFFFFFF4E4E4EA0A0A0FFFFFFF3F3F32525252C2C2C1B1B1B6A6A6AFFFFFFFFFFFF 0D0D0DD5D5D5FFFFFF0D0D0DD5D5D5FFFFFFD7D7D72A2A2A141414121212858585FFFFFFE2E2E2 3E3E3E1919192D2D2D1E1E1EC3C3C3FFFFFFAEAEAE252525FFFFFFFFFFFF282828000000000000 000000000000676767FFFFFFE3E3E3000000DADADAFFFFFFFFFFFFFFFFFFFFFFFF4D4D4D929292 FFFFFFFFFFFF383838858585FFFFFFF0F0F01010100E0E0E0000000C0C0C191919FFFFFFFFFFFF 646464717171FFFFFFFFFFFF383838858585FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F 01173F003698003698003698003698003698003698003698003698003698002466191A1AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698 003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698 00369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698012F85 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F 0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698 0036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F4F4F4F3F3F3FFFFFFFBFBFBFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF191919C6C6C6FFFFFFFFFFFF 919191454545FFFFFFFFFFFFFFFFFFF3F3F3E8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE9E9E9 FEFEFEFFFFFFAAAAAA262626FFFFFFFFFFFF4E4E4EA0A0A0FFFFFFFFFFFFFFFFFFE7E7E7F4F4F4 FFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFEBEBEBF7F7F7 FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3E8E8E8FFFFFFFFFFFFFFFFFFF5F5F50A0A0AD0D0D0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999994A4A4AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFBFBFBFEFEFEFFFFFFE6E6E6171717E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFBFBFB141414C2C2C2FFFFFFE6E6E6171717E5E5E5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698003698 002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 013390003698003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698 00369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698 003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B503060B002D7F0036980036980036980036980036980036980036980036980036980B0F16 88898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698 0036980036980036980036980036980036980036980036980028730B1423012B7A012B7A01163F 787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444 3C3C3C9191918A8A8A202020A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA1B1B1BD0D0D0FFFFFF505050393939949494FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 6A6A6A7B7B7BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE383838E3E3E3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7BA0A0A0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA2D2D2DFFFFFFFFFFFF7B7B7BA0A0A0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698 003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698003698 080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262 00369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698 003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698 0036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 282A2C011C510036980036980036980036980036980036980036980036980036980028730B1423 012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF8F8F8ACACAC8A8A8A989898D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCBDFDFDFFFFFFFE7E7E7 D0D0D0E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEAEAEAC1C1C1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7D3D3D3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698 003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698 003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B515181E00226200369800369800369800369800369800369800369800369800369800143A 3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698 003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698 0036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698 0036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E 00369800369800369800369800369800369800369800369800369800246619191AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698 00369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B513171C002262003698003698003698003698003698003698003698 00369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6C010F29003698003698003698003698003698003698003698003698003698012F85090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B502050A002D7F003698 0036980036980036980036980036980036980036980036980A0E1688898BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698 003698003698003698003698002873020B1B012B7A012B7A0017414F5050FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4F01163E003698003698003698003698003698003698003698003698003698002466 19191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390 00369800369800369800369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B514171D002262003698003698003698003698 00369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698 003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 03060B002D7F0036980036980036980036980036980036980036980036980036980A0E1688898B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698 003698003698003698003698003698003698003698002873010B1D012B7A001E56000104585859 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698 00369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B500010301339000369800369800369800369800369800369800369800369800369808090B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D002262003698 00369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698 003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698 0036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C 011C51003698003698003698003698003698003698003698003698003698002873020C1F001E56 000205000F2E787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698003698003698 00369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698 00369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 15181D00226200369800369800369800369800369800369800369800369800369800143A3F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010E28003698003698 003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B502050B002D7F003698003698003698003698003698 0036980036980036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698 002873000713000205001D5301163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDEDEDE959595FFFFFFFFFFFFFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF898989C6C6C6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7B7B7BD6D6D6FFFFFFFFFFFF9C9C9C6F6F6FABABABFFFFFFF1F1F1616161FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E 000000171717171717171717171717171717171717171717171717171717020202000000000713 000713000713000713000713000713000713000713000713000207000000161617161617161617 161717171717171717171717171717171717161617000000000510000713000713000713000713 0007130007130007130007130007130404040C0C0C161617161617161617171717171717171717 171717171717171717000206000000000713000713000713000713000713000713000713000713 0007130000000000001616171616171616171717171717171717171717171717171717170A0A0A 00000000071300071300071300071300071300071300071300071300071300040D000000161617 161617161617161617171717171717171717171717171717151516000105000207000713000713 000713000713000713000713000713000713000713080808030303161617161617161617171717 171717171717171717171717171717000102000000000713000713000713000713000713000713 000713000713000713000000000000002161012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB6B6B6282828FFFFFFA8A8A81C1C1CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA0C0C0C EAEAEAFFFFFFFFFFFFFFFFFF9E9E9E1F1F1FA6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECECEC6565651F1F1F1212126F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8595959 454545FFFFFFFFFFFFFFFFFF8282826E6E6EFFFFFFFFFFFFD3D3D36F6F6F565656FFFFFFFFFFFF 2C2C2CC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D454647898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 3D3E3E010B22002974002974002974002974002974002974002974002974002974011C510A0B0B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B000000002874002974 002974002974002974002974002974002974002974002974010203797A7B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B0C0F12001949002974002974002974002974002974 00297400297400297400297400102E2C2D2E898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B555556000716002974002974002974002974002974002974002974002974002974 002568010101898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B010306 002365002974002974002974002974002974002974002974002974002974080A106C6D6E898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B1E1F2101153F002974002974002974 00297400297400297400297400297400297400205B0A1321012B7A012B7A01163F787879FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B6282828FFFFFFF2F2F2D0D0D0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF949494464646FFFFFFFFFFFFFFFFFFEBEBEB1C1C1C2F2F2F909090FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF3C3C3C646464E9E9E9F9F9F9D8D8D8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C0C0C02323234F4F4F2C2C2CFFFFFFFFFFFFFFFFFFD9D9D9131313F9F9F9FFFFFFFFFFFF989898 565656FFFFFFFFFFFF848484616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698 003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000103013390003698003698003698003698003698003698003698003698003698080A0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698 00369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698 003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698003698 0B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51 0036980036980036980036980036980036980036980036980036980028730B1423012B7A012B7A 01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C8707070707070D4D4D4FFFFFFB6B6B6282828FFFFFF DDDDDD929292FFFFFFFFFFFFF9F9F9959595686868939393F8F8F8FFFFFFFDFDFD9D9D9D6B6B6B 8C8C8CF3F3F3FFFFFFFFFFFF484848939393FFFFFFFFFFFFFFFFFF6565658686864B4B4B909090 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C01A1A1AFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD2D2D2EAEAEAA6A6A62C2C2CFFFFFFFFFFFFFFFFFFFFFFFF262626B9B9B9 FFFFFFFFFFFF989898565656FFFFFFFFFFFFD1D1D10F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698 003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698 003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E 00226200369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698 003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698 0036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698002873 0B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1141414A9A9A9A6A6A6A1A1A1FFFFFF B6B6B6282828FFFFFFB6B6B6282828FFFFFFFFFFFF4A4A4A3030309898985F5F5F9A9A9AFFFFFF 585858535353ACACAC515151383838FEFEFEFFFFFF141414B4B4B4FFFFFFFFFFFFCBCBCB272727 F8F8F84B4B4B909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF838383575757C2C2C2999999B7B7B7 FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6A6A62C2C2CFFFFFFFFFFFFFFFFFF FFFFFF474747949494FFFFFFFFFFFF989898565656FFFFFFFFFFFFF2F2F2000000E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698 003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698 003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698003698 00143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29 003698003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698 0036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698 0036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5181818EDEDED FFFFFFFFFFFFFFFFFFB6B6B6282828FFFFFFB6B6B6282828FFFFFFD1D1D1000000E7E7E7FFFFFF FFFFFFFEFEFED8D8D80E0E0EF7F7F7FFFFFFF3F3F3060606D0D0D0F7F7F7000000D0D0D0FFFFFF FEFEFE373737B5B5B5FFFFFF4B4B4B909090FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B6B6B0A0A0A 5555557676762B2B2B4C4C4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6A6A62C2C2C FFFFFFFFFFFFFFFFFFFFFFFF636363727272FFFFFFFFFFFF989898565656FFFFFFFFFFFFFFFFFF 0E0E0EC7C7C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F 01173F003698003698003698003698003698003698003698003698003698002466191A1AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698 003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698 00369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698012F85 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F 0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698 0036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFE656565121212717171EDEDEDFFFFFFB6B6B6282828FFFFFFB6B6B6282828FFFFFFAAAAAA 222222FFFFFFFFFFFFFFFFFFFFFFFFAEAEAE0707072C2C2C2C2C2C2C2C2C0B0B0BC5C5C5EDEDED 000000DEDEDEFFFFFF9F9F9F4D4D4DFFFFFFFFFFFF4A4A4A909090FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6C6C6C5F5F5FFFFFFFFFFFFFE3E3E3000000E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFA6A6A62C2C2CFFFFFFFFFFFFFFFFFFFFFFFF7272725B5B5BFFFFFFFFFFFF989898565656 FFFFFFFFFFFFFFFFFF1D1D1DB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698003698 002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 013390003698003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698 00369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698 003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B503060B002D7F0036980036980036980036980036980036980036980036980036980B0F16 88898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698 0036980036980036980036980036980036980036980036980028730B1423012B7A012B7A01163F 787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE4F4F4F464646FFFFFFB6B6B6282828FFFFFFB6B6B6 282828FFFFFFB3B3B31F1F1FFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB1D1D1DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFBFBFB000000C4C4C4FFFFFF616161070707070707070707020202040404656565 FFFFFFFFFFFFFFFFFFFFFFFF858585474747FFFFFFFFFFFFF9F9F9000000DADADAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFA6A6A62C2C2CFFFFFFFFFFFFFFFFFFFFFFFF595959696969FFFFFF FFFFFF989898565656FFFFFFFFFFFFFEFEFE050505BEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698003698003698003698003698 00369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698003698 08090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B514171C002262 00369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698 003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B502050B002D7F003698003698003698003698003698003698003698 0036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 282A2C011C51003698003698003698003698003698003698003698003698003698002873030C1C 012B7A012B7A01163F626263FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDEF1F1F1FFFFFFB1B1B12B2B2BFFFFFFB6B6B6 282828FFFFFFB6B6B6282828FFFFFFE8E8E8080808B7B7B7FFFFFFD6D6D6BEBEBEEEEEEE0F0F0F B6B6B6FFFFFFFFFFFFDFDFDFFFFFFFFFFFFF202020A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4B4B4B909090FFFFFFFFFFFFD0D0D0979797FFFFFFC7C7C7080808DCDCDCFFFFFF959595222222 FCFCFCF8F8F8808080EEEEEEFFFFFFFFFFFFFFFFFFA6A6A62C2C2CFFFFFFFFFFFFFFFFFFFFFFFF 3C3C3C8E8E8EFFFFFFFFFFFF989898565656FFFFFFFFFFFFE7E7E7000000E3E3E3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698003698 00369800369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698 00369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B514171C00226200369800369800369800369800369800369800369800369800369800143A 3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698 003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B502050B002D7F003698003698003698003698 0036980036980036980036980036980A0E1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698 003698002873010B1C012B7A002365000309484849FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B61717173232321B1B1B AFAFAFFFFFFFB8B8B82B2B2BFFFFFFB8B8B82B2B2BFFFFFFFFFFFFA0A0A00E0E0E1A1A1A1E1E1E C6C6C6FFFFFFB3B3B31C1C1C272727242424333333FCFCFCFFFFFF5959597A7A7AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4D4D4D929292FFFFFFFFFFFF8D8D8D303030FFFFFFFFFFFF7878780C0C0C 1E1E1E2A2A2ACCCCCCFFFFFFE3E3E3000000DADADAFFFFFFA1A1A10E0E0E0909090202020E0E0E 6A6A6AFFFFFFFBFBFB131313C6C6C6FFFFFFFFFFFF989898565656FFFFFFFFFFFFBABABA1C1C1C FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F 00369800369800369800369800369800369800369800369800369800246619191AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698 00369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B515181D002262003698003698003698003698003698003698003698 00369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6C010F29003698003698003698003698003698003698003698003698003698012F85090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698 0036980036980036980036980036980036980036980036980A0F1688898BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698 003698003698003698003698002873020C1F002363000206010D26787879FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFEFCFDFDFBFDFDFBFCFDFBFCFD F6F7F8E1E2E3F8F9FAFBFCFDFBFCFDFBFCFDF6F7F8FBFCFDFBFCFDF6F7F8FBFCFDFBFCFDFBFCFD F9FAFBE3E4E5FAFBFCFBFCFDFBFCFDFBFCFDFBFCFDE5E6E7EDEEEFFBFCFDFBFCFDFBFDFDA8A9A9 252526FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFEFEFEFFFFFFFFFFFF4343439F9F9FFFFFFF FFFFFFFFFFFFF6F6F6EEEEEEFFFFFFFFFFFFFFFFFF9999994A4A4AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA191919FDFDFDFFFFFFFFFFFF989898565656FFFFFF FFFFFF6565656D6D6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4F01163E003698003698003698003698003698003698003698003698003698002466 19191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390 00369800369800369800369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D002262003698003698003698003698 00369800369800369800369800369800143A3F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6C010E28003698003698003698003698003698003698003698003698 003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 03060B002D7F0036980036980036980036980036980036980036980036980036980A0F1688898B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698 00369800369800369800369800369800369800369800287301091700020600174301163F787879 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFDFDF8FAFCF3F7FA F0F5F9EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8 EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8 EEF3F8F0F5F9EEF2F51C1E20CCCECEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD 4E4E4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE383838E3E3E3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF646464818181FFFFFFFFFFFF8F8F8F 363636585858FFFFFFFBFBFB151515D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF767676000000333434333434333434333434333434 3334343334343334343334340B0B0B000000000F2B00102C000F2C000F2C00102C00102C00102C 00102C00102C000613000000323333333334333334333334333434333434333434333434333434 323333000000010D26000F2C000F2C000F2B00102C00102C00102C00102C00102C00102C000000 232324333334333334333334333434333434333434333434333434333434000206000105000F2C 00102C000F2B00102C00102C00102C00102C00102C00102C000000000000323333333334333334 333334333434333434333434333434333434181819000000000F2B00102C000F2C000F2C00102C 00102C00102C00102C00102C010B23000000323233333334333334333334333434333434333434 33343433343433333400010300091A000F2C00102C000F2B00102C00102C00102C00102C00102C 00102C070707151516333334333334333334333434333434333434333434333434333434000102 000000000F2B00102C000F2C00102C00102C00102C00102C00102C00102C00040C000000011B4F 012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFCFD F4F7FAE9EFF6DCE6F1D5E0EFD1DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEED D0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEED D0DEEDD0DEEDD0DEEDD1DEEDD5E0EFDDE6F2BBC1C9D6D9DCFBFDFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B9F1F1F1 FFFFFFFFFFFFE1E1E1D0D0D0E9E9E9FFFFFFF5F5F5B6B6B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D343536646466646466 646466646466646466646466646466646466646466303131000819001E55001E55001E55001E55 001E55001E55001E55001E55001E55011740050505646466646466646466646466646466646466 646466646466646466646466000000001D54001E55001E55001E55001E55001E55001E55001E55 001E55001E55000000606162646466646466646466646466646466646466646466646466646466 0A0C0F01153C001E55001E55001E55001E55001E55001E55001E55001E55001E55010C24191A1B 64646664646664646664646664646664646664646664646664646641414200040D001E55001E55 001E55001E55001E55001E55001E55001E55001E55001A4C000000646466646466646466646466 646466646466646466646466646466646466000104011C50001E55001E55001E55001E55001E55 001E55001E55001E55001E55030508555656646466646466646466646466646466646466646466 64646664646617181A001030001E55001E55001E55001E55001E55001E55001E55001E55001E55 0019470A111F012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFEFBFCFDF3F6FAE4ECF4CEDCECBACEE5AFC5E1AAC2DEAAC1DFA8C1DEA8C1DEA8C1DEA8C1DE A8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DE A8C1DEA8C1DEA8C1DEA8C1DEA8C1DEAAC1DFAAC2DEAFC5E1BDCFE5D3DFEEE9EFF7F8FAFCFDFDFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698 003698003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698 003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698 00369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C 010F29003698003698003698003698003698003698003698003698003698012F85090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698 0036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698 0036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEFBFCFDF3F6FAE3EBF4CBDAEBB0C6E09BB8D990AFD48CACD38BABD38BABD3 8BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD3 8BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38CACD391B0D6A0BBDBBDCFE5 DDE6F2F3F7FAFCFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4D4E4F01173F003698003698003698003698003698003698003698003698003698002466191A1A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698 003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698 00369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698 012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B 002D7F0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698 0036980036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFDF4F7FAE4ECF4CBDAEBAFC5E197B4D788AAD181A4CF 7EA2CF7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE 7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA2CF 83A5D091B0D6AFC5E1D5E0EFEFF4F9FBFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698 003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000103013390003698003698003698003698003698003698003698003698003698080A0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698 00369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698 003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698003698 0B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51 0036980036980036980036980036980036980036980036980036980028730B1423012B7A012B7A 01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFEF6F9FCE7EEF6CEDCECB1C6E197B4D7 86A9D17EA2CF7DA2CD7BA1CD7BA1CD6685AA5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F 5F7D9F5F7D9F5F7D9F617FA25F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F5F7D9F 5F7D9F6685AA7CA0CD7EA2CF8CACD3AAC2DED1DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698 003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698 003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E 00226200369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698 003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698 0036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698002873 0B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEFF4F9D8E2F0 B7CBE399B6D886A8D27EA2CF7CA0CD7BA0CD799ECA42526700000024272925272A25272A25272A 25272A25272A25272A25272A25272A04040400000021232525272A25272A25272A25272A25272A 25272A25272A25272A0C0D0D00000049607B7EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698 003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698 003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698003698 00143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29 003698003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698 0036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698 0036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFE F6F9FCE6ECF5C7D7EAA4BDDC8BACD37FA3CE7CA0CD7BA0CD789CC828323E393B3DBDBEC0C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43F4041121212ABACAEC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C498999B0D0D0E1B1D1F5874937EA3CE8BABD3A8C1DED0DEED EEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F 01163E00369800369800369800369800369800369800369800369800369800246619191AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698 00369800369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B514171D002262003698003698003698003698003698003698 00369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698012F85 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F 0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698 003698003698003698003698003698002873060F1F012B7A012B7A01163F777878FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFDFDF3F6FADCE6F1B8CCE497B4D784A6D07CA1CE7BA1CD789CC828323E393B3D BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43F4041121212ABACAEC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C498999B0D0D0E65666726282B5874937EA3CE 8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4F01163E003698003698003698003698003698003698003698003698003698 00246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 01339000369800369800369800369800369800369800369800369800369808090B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B514171C002262003698003698003698 00369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698 003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B502050B002D7F0036980036980036980036980036980036980036980036980036980A0E16 88898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698 003698003698003698003698003698003698003698003698002873010A1B012B7A01266C00050F 202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFDEFF4F9D4E0EEAEC5E08FAED57FA3CE7CA0CD789CC8 07090C24262767686968686A68686A68686A68686A68686A68686A68686A68686A2A2B2B020202 63636468686A68686A68686A68686A68686A68686A68686A68686A5E5F600D0D0E6566678F9092 26282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698 00369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698003698 08090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D002262 00369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698 003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698 0036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 282A2C011C51003698003698003698003698003698003698003698003698003698002873020C1F 002569000309000B20787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D2DFEDABC2DF8DADD4 7EA2CF7BA1CD7295BF000000505153505153505153505153505153505153505153505153505153 4D4E500303034646475050515050514D4E4F5051535051535051535051535051534E5051000000 4647488F90928F909226282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698003698 00369800369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698 00369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B515181D00226200369800369800369800369800369800369800369800369800369800143A 3F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698 003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698 0036980036980036980036980036980A0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698 003698002873010A1A00030900113001163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFDFDEFF4F9 D4E0EEAEC5E08FAFD57FA3CE7CA0CD7599C4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55B5B5C4445468F90928F909226282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8 FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 53535300000048494949494A49494A49494A49494A49494A49494A49494A49494A151616000000 01163D01163E01163E01163E01163E01163E01163E01163E01163E010C22000000474748484949 48494948494949494A49494A49494A49494A49494A48494900000000133701163E01163E01163D 01163E01163E01163E01163E01163E01163E00000034353548484948494948494949494A49494A 49494A49494A49494A49494A00020600050E01163D01163E01163D01163E01163E01163E01163E 01163E01163E00010500000048484948494948494948494949494A49494A49494A49494A49494A 26262700000001163D01163E01163E01163E01163E01163E01163E01163E01163E001233000000 46474848494948494948494949494A49494A49494A49494A49494A49494A000001010E2801163E 01163E01163D01163E01163E01163E01163E01163E01163E050505232424484849484949484949 48494A49494A49494A49494A49494A49494A00000200000001163D01163E01163E01163E01163E 01163E01163E01163E01163E000818000000001337012B7A01163F787879FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFDFDF3F6FADBE5F1B7CBE495B3D783A5D07DA2CD7599C4060607B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4445468F90928F909226282B5874937EA3CE8BABD3 A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D29292A3F40403F40403F40403F40403F40403F40403F40403F4040 3F4040202020000104001336001336001336001336001336001336001336001336001336010E28 0000003F40403F40403F40403F40403F40403F40403F40403F40403F40403F4040000000001235 0013360013360013360013360013360013360013360013360013360000003536363F40403F4040 3F40403F40403F40403F40403F40403F40403F404007090C00102E001336001336001336001336 00133600133600133600133600133600091B0606063F40403F40403F40403F40403F40403F4040 3F40403F40403F4040282829000000001336001336001336001336001336001336001336001336 0013360010300000003F40403F40403F40403F40403F40403F40403F40403F40403F40403F4040 000001001133001336001336001336001336001336001336001336001336001336020305393A3A 3F40403F40403F40403F40403F40403F40403F40403F40403F4040111113000A1D001336001336 00133600133600133600133600133600133600133600113008101C012B7A012B7A01163F787879 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFDFEF6F9FBE4ECF4C2D4E89EBADA86A9D17DA2CE759AC4060607 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4445468F90928F909226282B 5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698 003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000103013390003698003698003698003698003698003698003698003698003698080A0C 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698 00369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698 003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698 0036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C 011C510036980036980036980036980036980036980036980036980036980028730B1423012B7A 012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFBFCEAF0F6CBDAEBA5BEDD8AABD2 7EA2CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C444546 8F90928F909226282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698 003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698 003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 15181E00226200369800369800369800369800369800369800369800369800369800143A3F4042 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698 003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698 0036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698 0028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEDF2F8 CFDDEDA8C0DE8BACD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55B5B5C4445468F90928F909226282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698 003698003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698 003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698 00369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C 010F29003698003698003698003698003698003698003698003698003698012F85090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698 0036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698 0036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4445468F90928F909226282B5874937EA3CE8BABD3A8C1DE D0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4D4E4F01173F003698003698003698003698003698003698003698003698003698002466191A1A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698 003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698 00369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698 012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B 002D7F0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698 0036980036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C4444458F90928B8C8E1818182E3D4D 7EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698 003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000103013390003698003698003698003698003698003698003698003698003698080A0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698 00369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698 003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698003698 0B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51 0036980036980036980036980036980036980036980036980036980028730B1423012B7A012B7A 01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE 759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5111111 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55B5B5C444546868688 1717170C0C0D5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698 003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698 00369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D 00226200369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698 003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698 0036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698002873 081120012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEED A8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51111118A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5B5B5C42434417171721222326282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01163E003698003698 00369800369800369800369800369800369800369800246619191AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698 00369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B513161C002262003698003698003698003698003698003698003698003698003698 00143A3F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29 003698003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B502050A002D7F003698003698003698 0036980036980036980036980036980036980A0E1588898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698 003698003698002873000A1A012B7A002977010C241A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4010102949597949597949597949597949597 9495979495979495979495979495970E0E0E828384949597949597949597949597949597949597 9495979495979495975353540707082122238F909226282B5874937EA3CE8BABD3A8C1DED0DEED EEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F 01173F00369800369800369800369800369800369800369800369800369800246619191AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698 00369800369800369800369800369800369800369808090B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D002262003698003698003698003698003698003698 00369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698012F85 090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F 0036980036980036980036980036980036980036980036980036980A0F1688898BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698 003698003698003698003698003698002873020C1F002975000919000815777778FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE6585A90707070D0D0D0D0D0E 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0B0B0B0808080606060D0D0D0D0D0D0D0D0D 0D0D0E0D0D0E0D0D0E0D0D0E0D0D0E0C0D0D0000003737398F90928F909226282B5874937EA3CE 8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4F01163E003698003698003698003698003698003698003698003698003698 00246619191AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 01339000369800369800369800369800369800369800369800369800369808090B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181D002262003698003698003698 00369800369800369800369800369800369800143A3F4041B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698 003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B503060B002D7F0036980036980036980036980036980036980036980036980036980A0F16 88898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698 003698003698003698003698003698003698003698003698002873010B1D000919010A1B01153E 787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4 060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C4546468F90928F9092 26282B5874937EA3CE8BABD3A8C1DED0DEEDEEF3F8FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F4A4B4B757577757577757577757577 7575777575777575777575777575773C3C3D001233002364002364002364002364002364002364 002364002364002364001A4A111112757577757577757577757577757577757577757577757577 757577757577000000002262002364002364002364002364002364002364002364002364002364 0506076F70717575777575777575777575777575777575777575777575777575770F1217001E55 002364002364002364002364002364002364002364002364002364010E29323333757577757577 7575777575777575777575777575777575777575774B4C4C000B1F002364002364002364002364 002364002364002364002364002364001F58040404757577757577757577757577757577757577 75757775757775757775757700020701215E002364002364002364002364002364002364002364 002364002364090C106A6B6C757577757577757577757577757577757577757577757577757577 212224001843002364002364002364002364002364002364002364002364002364001F58000000 010A1B012A7901163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE 8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C 4546468F90928F909226282B5874937EA3CE8BACD3A8C0DECFDDEDEDF2F8FBFCFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF717171141515212222 2122222122222122222122222122222122222122222122220D0E0E000206000A1C000A1C000A1C 000A1C000A1D000A1D000A1D000A1D000A1D000510080808202121202121202121202121212222 212222212222212222212222212121000206000A1B000A1C000A1C000A1B000A1D000A1D000A1D 000A1D000A1D000A1C060608171718202121202121202121212222212222212222212222212222 21212204050700050F000A1C000A1C000A1B000A1C000A1D000A1D000A1D000A1D000A1D000005 070707202121202121202121212122212222212222212222212222212222121313000206000A1B 000A1C000A1C000A1C000A1D000A1D000A1D000A1D000A1D00071607080A202121202121202121 2021212122222122222122222122222122221F2020000105000818000A1C000A1C000A1B000A1D 000A1D000A1D000A1D000A1D000A1C040507181919202121202121202121212122212222212222 21222221222221212104050500030B000A1C000A1C000A1C000A1C000A1D000A1D000A1D000A1D 000A1D00050E020810012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFD EEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55A5B5C4546468F90928F909226282B5874937EA2CE8AABD2A5BEDDCBDAEBEAF0F6 FAFBFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F 003698003698003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698 003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698 00369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6B6B6C010F29003698003698003698003698003698003698003698003698003698012F85090909 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698 0036980036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B528292C011C51003698003698003698003698003698 0036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C4546468F90928F909226282B5874937DA2CE86A9D1 9EBADAC2D4E8E4ECF4F6F9FBFDFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698003698002466 191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390 003698003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698 00369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698 003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 03060B002D7F0036980036980036980036980036980036980036980036980036980B0F1688898B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698 0036980036980036980036980036980036980036980028730B1423012B7A012B7A01163F787879 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C4546468F90928F909226282B 5873937DA2CD83A5D095B3D7B7CBE4DBE5F1F3F6FAFCFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698 003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000103013390003698003698003698003698003698003698003698003698003698080A0C 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698 00369800369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698 003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698 0036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C 011C510036980036980036980036980036980036980036980036980036980028730B1423012B7A 012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD3 7EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C454646 8F90928F909226282B5873937CA0CD7FA3CE8FAFD5AEC5E0D4E0EEEFF4F9FBFDFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698 003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698 003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 15181E00226200369800369800369800369800369800369800369800369800369800143A3F4042 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698 003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698 0036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698 0028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8 D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55A5B5C4546468F90928F9092292B2F4E65827BA1CD7EA2CF8DADD4ABC2DFD2DFEDEEF3F8 FBFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698 003698003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698 003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698 00369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C 010F29003698003698003698003698003698003698003698003698003698012F85090909B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698 0036980036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698 0036980036980036980028730B1423012B7A012B7A01163F787879FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55A5B5C4546468D8E903436382028317699C47CA0CD7FA3CE8FAED5 AEC5E0D4E0EEEFF4F9FBFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4D4E4F01173F003698003698003698003698003698003698003698003698003698002466191A1A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698 003698003698003698003698003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698003698003698003698 00369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698003698003698003698 012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B 002D7F0036980036980036980036980036980036980036980036980036980B0F1688898BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698 0036980036980036980036980036980036980028730B1423012B7A012B7A01163F787879FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE759AC4060607B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51011128A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5B5C4445463436382028317699C47BA1CD 7CA1CE84A6D097B4D7B8CCE4DCE6F1F3F6FAFCFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698003698003698003698 003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000103013390003698003698003698003698003698003698003698003698003698080A0C9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E002262003698003698 00369800369800369800369800369800369800369800143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698003698003698003698 003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698003698003698003698 0B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51 0036980036980036980036980036980036980036980036980036980028730B1423012B7A012B7A 0A1C3C626262FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEEDA8C1DE8BABD37EA3CE 759AC4060607B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101011 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55A5A5B222324202831 7699C47BA0CD7CA0CD7FA3CE8BACD3A4BDDCC7D7EAE6ECF5F6F9FCFDFDFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698003698003698003698 003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698003698003698003698 003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B515181E 00226200369800369800369800369800369800369800369800369800369800143A3F4042B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29003698003698003698 003698003698003698003698003698003698012F85090909B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698003698003698003698 0036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5282A2C011C51003698003698003698003698003698003698003698003698003698002873 0B1423012A79081630383A3DF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFDEEF3F8D0DEED A8C1DE8BABD37EA3CE789DC8000000090A0C090A0C090A0C090A0C090A0C090A0C090A0C090A0C 090A0C070809080808000000090A0C090A0C090A0C090A0C090A0C090A0C090A0C090A0C090A0C 000000405063789CC87BA0CD7CA0CD7EA2CF86A8D299B6D8B7CBE3D8E2F0EFF4F9FBFCFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D5A5A5B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4F01173F003698003698 003698003698003698003698003698003698003698002466191A1AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103013390003698003698003698003698003698 003698003698003698003698080A0C9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B515181E002262003698003698003698003698003698003698003698003698003698 00143A3F4042B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56B6B6C010F29 003698003698003698003698003698003698003698003698003698012F85090909B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B503060B002D7F003698003698003698 0036980036980036980036980036980036980B0F1688898BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5282A2C011C51003698003698003698003698003698003698003698 0036980036980028730B1423081630383A3DF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFCFDEEF3F8D1DEEDAAC2DE8CACD37EA2CF7CA0CD769BC57296BF7296BF7296BF7296BF7296BF 7296BF7296BF7296BF7296BF7296BF7396BF7296BF7296BF7296BF7296BF7296BF7296BF7296BF 7296BF7296BF7296BF7296BF7BA1CD7BA1CD7DA2CD7EA2CF86A9D197B4D7B1C6E1CEDCECE7EEF6 F6F9FCFDFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7D7D7D5152538F90928F90928F90928F90928F90928F90928F90928F90928F909249494A 001438012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A01205D1414158F9092 8F90928F90928F90928F90928F90928F90928F90928F90928F9092000001012A79012B7A012B7A 012B7A012B7A012B7A012B7A012B7A012B7A012B7A0707098A8A8C8F90928F90928F90928F9092 8F90928F90928F90928F90928F909211141900205B012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A0012363838398F90928F90928F90928F90928F90928F90928F90928F9092 8F90925D5D5F010C23012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A01266D 0606068F90928F90928F90928F90928F90928F90928F90928F90928F90928F9092010409002974 012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A0A0E138081828F90928F9092 8F90928F90928F90928F90928F90928F90928F9092252628001A49012B7A012B7A012B7A012B7A 012B7A012B7A012B7A012B7A012B7A00266B04060A383A3DF6F6F6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFBFDFDEFF4F9D5E0EFAFC5E191B0D683A5D07EA2CF7EA3CE7EA3CE7EA3CE 7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE 7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA3CE7EA2CF81A4CF88AAD197B4D7AFC5E1 CBDAEBE4ECF4F4F7FAFBFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD6D6D60808082B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B0E0E0E05060720232921242A21242A21242A21242A21242A21242A21242A21242A 0F11141314152A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B262626000207 1C1F2421242A21242A21242A21242A21242A21242A21242A21242A1F22270809091D1D1D2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B29292A0002040A0B0D21242A21242A21242A 21242A21242A21242A21242A21242A2023290202030D0D0D2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B18181807090C20232921242A21242A21242A21242A21242A21242A 21242A21242A181B1F090A0A2A2A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 27272700020715171C21242A21242A21242A21242A21242A21242A21242A21242A1F2228080808 1414152B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A00000105060721242A 21242A21242A21242A21242A21242A21242A21242A21242A0B0C0E707479FDFDFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFDFDF3F7FADDE6F2BDCFE5A0BBDB91B0D68CACD3 8BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD3 8BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38BABD38CACD390AFD4 9BB8D9B0C6E0CBDAEBE3EBF4F3F6FAFBFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFEF8FAFCE9EFF7D3DFEE BDCFE5AFC5E1AAC2DEAAC1DFA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DE A8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DEA8C1DE AAC1DFAAC2DEAFC5E1BACEE5CEDCECE4ECF4F3F6FAFBFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFDFDF5F8FBE9EFF7DDE6F2D5E0EFD1DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEED D0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEEDD0DEED D0DEEDD0DEEDD0DEEDD0DEEDD1DEEDD5E0EFDCE6F1E9EFF6F4F7FAFBFCFDFEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFBFDFDF8FAFCF3F7FAF0F5F9EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8 EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8 EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8EEF3F8F0F5F9F3F7FAF8FAFCFBFDFDFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFEFCFDFDFBFDFDFBFCFDFBFCFD FBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFD FBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFCFDFBFDFDFCFDFD FDFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/image4a_crop.png0000644000175000017500000005507712662210372016613 0ustar mbambaPNG  IHDR iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]xE>7! %^l]b {O콁RJ %^?]2{sC 3ϓ3gΙ9s材@:h h h h h T Ԩ&Xlծ]6mzN;V9M:.*%(+VڵkФ1ϧ~0VlѢp1Gee'yG-[߿^ (6>gZzcZj|;MYYY 裏ioI:غwNz(KdeXdIbhƌyfҥ yTfMOБ{"p?S?>5h@*nݺdgϖ\<(1!CҥK?T\?N?t:CЯef#޹sl .LzaR$1ڰa>SΝ&]wE~-;]($Űa8gu8蠃NMz"))IhYO_atGsӧYh֬+IQF oѲB7|sX\"ܜ{ V?Y;v̏j=Θ &MdVqƲq.CU'6~n!Q>""KDQQlo ED'ʼn~k>#nae93YfI5k@?.s<}!7҂ hѢET~}5jn"=#zjǎKhO0bۦM{NI  TeVmٲ xG'tuAe*$# aڱBnݚN;4cyX?6p@JNNrsswߕO?$Yc oL0a K#;;[ 6m"7|#ׄ8 Jxx{gW?Nb={$mĉuVY.<?G&I;8FZzrz=oX`ǟ֭+)SQwYbжm[ 46G8>h9NYaa޼yr&_"{! iҤI?Cg}gKPD/zq>X( \o߾x,?PwbN/1K ^ 7xc۶mR*k'^2hx̘1rd?!FBDy9#JDa ftPl%w!_6;}t;wnXqu 6oo&N*ڗ^zt9ceBt Ndu)ΚMrw[uX|9xrȦ@i{OD>A۸hi#.Um#~V^֭['n+#S2{2 JLEVmQ\\,ӰR<=F! :̗M~gP?IÝQ` g.d OdGvސq Z2kwy\cN ,sX}:IٳI .HʁzD|ߕy/\TuzL  /RSSϤ²`*|c(2(<]`Q5:.:*L&7t\7&(` W<]{>V\Il3_{ltȔGHr`:}<5 L y]_uh5DkzVRZM \SI`8#CW$`8vQ\b'zq?^sfAhlt Q3=!0OL:4f3fu Ad4fQ *2L3pfN'F"@yՁcaMdi3^{5 03zxb;d6a/J zROAt uN0E^ϰ'eW>1h7xklNqrtp!c„ r/;G{}-2摏|7w$l"khڻƍK`qk.pz O$aeډU@FxOzzt ;n8gbf4_ڵk't)#L!/#YRJ0B' 3qϞ#Ŵiz${/"ݓ+5>J5zfwya=ςoYTm u~X9`-63qps*ְQf^kla+3{ |Oc|ƚo miM+`>W- B`L XLޘDH؜ S;Џ?h kRI{M|r8*lq{!G)_u'|ƻ`=%$"5v 4Q a:Cz#kd fpm)grA&1{{'5A07 aQ>y`J\cUպwzֆf5+`]T'X)vkq$9rYhp4R"e_c+8iEϊi*}_r<"lI^ -ˀًS 5n%!5y>De},uUd+̒I y<{Fn1lfbsK<+3xսی amяor 3/kgNqbY[G:=ccX64cSũ_qjckl03fF\E1:=Y%1{3( 6pctph|@Z?S"sfM)ZIb3BKq۷P!E6[ J~>ѧ (A+2Q | pZ MA̸pÇi ֱoAKx#-NH PC 2$\yb9ԣE_pt,K Uckb)w~6#f kJ~oTrquZZXZUE%M{c2k h h Tc :k.* pAQ6z r{"7y bS@`oٲ5l'e|'n6rčƈ#׳g/65z)4h[YxvI ^Zl\Fޝ|>ݺPDZ ~FzG7ߜ<9;Yig5vA)[y}L֭]M%EԎxG=.ZڰLӽ )`%RPȿΗ/s-((/3'>5o[%!vNQx۶PAi.P -CmPMpoO[ʨ0ϜYK1Rkz 0/N;RjI2jҸ!ի߇̛;ǶTno,^ˮ.oN %ڷW(,,`ԼYSw-/R(5Lۄ2y;ZE?֤q#jy_o۸q=mٴQ~~4g6o6-VHuY+QjPj}0lWZMONx;.Wўk|` 6<|(;!}Ć1_ь}k~~ޅ~l/zxMxqlB?<୨1Blx0_9G@]u\^2|,bvwPD~^{U\I-4uII)[/ΪǔTu#ł?5hw$:=#3jեRacS6X?rϦk>f%K)>>Qa*p"WV{2*܃} *?.~ӹu (KbA kcڙۺ6޹о=?=L {zʢVN}j7NIz%9+9 { Q$:/DtGe-䧴VN{j5D5I fN) (yT=n\%ҨWc<MJZQ, wrq[Oֽ=.)A+{9:Ivg)vsv( >PrMj{8fxN[7v_vMjk04L%"n,=#Z.9ȋ̙MO=_|po/R {t 'CJm z3Z#A^3* .:!s%z80 sQ~㹃}rņEcO-".1 S6}3mskD5qԄ;>.bٗSV-g^|>ZfpHB|Tj)yvV7p#'I \D>O<Ժ]*5xqw1c=̬IS￧Y5^~ƴO>9E I(N{yI'+)6RCz㢋RnY}jmL:*ԨYדv?Sh w}=i6nVj7Q-RMkhź\thJJ m[1U*:~Օ訣˖x1t7~gQ6ֿ:q M~HΦGy3[nCQz3}yٮ4ƃɓߣEcǍ7\ceW냁? 4{7fz*yݻK??~M]Ė[ mIDD*iH)"Ht pt'lY_^i=CgVNt?&Hzq;e}r󋉗0BB2TC0 ~+ּQY~V~+:,F;G9 y 8 MSI@C/=gx0ً%%%%Њ-1Ms%%%%"\SZ%fi\$G[pvuaEW+C3(,*43A]A.ϋ+-  Yl4!;1dbYyOwU AxsA>{D(&@ZH]  歷&RƼ a#.,8ʔH%˩l,ⓧ+$:j, UF"/f(|seջs*j%Hqsb'1b*)apĜ*ϰ+`1gVOəN|Cwߪs$: g%}Mƀ[nIY.dQ4Z؁7|UeսMJFOޠ*e@T\9M3 v,JO{jǾ|<>HBG`dϣ F/5?@ lËg`5lP![/ZR֢eK_YX؋ݺs|Q@"SYY|9e 5ލR>d#tTRn(Q'<8Npuc*ɢp;Qf%Yy6$xԦ>a=Dž IPU"6(Tc0H : 9+R-JӍ+9#W=7yIe6Z1^en G"_i7ZdctPZPENd| 'Y>QkyʷR:|bZPR#;QGE5H,{5l th>fze|Y6sS*>1|B@N`cJ߾}}88/4l؈%YlܸQ79_x/a1Rd;`+mkb6<lmvSf2E6$2iv PbZkQ(Nf 58a)Vx"(Xv3zT˷+h5RLÊm IDATu)^$X s4̷`3QIksJ(Zj!#bd;VpcZ%H[t!Ÿ$&0R(GC >Lؔm1\7O6p;Co@;bQh{$DK9R)iR˨(df akloV{C4Bݷt*aE\kNgqOk`ECOXNDM~]WŠOXÔ";uATs+g)Ѣ| <4sƆ8`|%oM/=1hk15?yX$" 7P?X-_dG嘇 XI"] +2gzJG #`EnFe}B1|T:_hȭevVƊ n(ѡjX%ѰV嘋*X1sPH(+r-* P>n{JXng5h-[DKx0- ()O@"kuT$"j1X-----Vl Zqm----g h,%%%%Њ-A+N%%%%,=؂łZ H-5V7d[C'WmPog6]YT}Akڞ%!Жˍ?8X~q :XUK٣ x8UlN2P"VxPcfIl?xa!n: Dw3jO;4{1AJ[Jvc˨%D¾eTdQl..ȥY( B6 'WGYT. D윅[l<@jiG wo *,̆Sx?7o.uJb!CX2 Ǡ,NY)JJ)Cg3Ϩ>q xx߰^*RS6Ƌ5q'}[ԨnWQGaS7 ~&)q'jPI. VjzcEo2&䔗@W_RJ,l߶26IիWKw7O,[3 펝;$< -xı,-aӺ_M͞)кux/;[|6o"Z>0:y{Jc9sfS鬙tuUkhy(Q>(H$ -D Ж2pDh`bxOQb}M 1S-B7t+\pGc!a6?R]SV;5M!lHd3Ɵ_z Fmv0 9$R#wJ`Z^֙_ g%.ʟ(,J|\Hv*NPkI> Ֆ Ziɒ%t]2%3]~k'+K( r j԰Qyi7pg(ᘄBR Q5bg_{%u\ZB r%t\*t` nj,~ "EDJD)c !Lo؉ R xq@MpD9 };Hno < m5$ m假JjJ2l3O*TNў&Qo{Uh"5YmOa؝ZJU,KF;^?.GԲH@jmM%h 'Iw>~D.+,IsdX#q_Kg_4lpѓ&I~Jݑ.WZG" # LwG=h5:vL"ū&MЈ#LPrd= ҋق ż@jlԞ~g ΃OV70μNNVA;w[a^A[3yQ/--~R ՆBSV^EW_wrhƵ*AjeAy3})Yhʬ?7 (DD%%%%%!<i h h h $bK:k h h h xH`(܃SCIn2` %/ ȭ4RK{ x@""ʣM@+M%Er7ɻ=v$T}RƁȁ`OS llͱ[! ʪ^*St@Y [3^uyA&PAtcVePHAV+3=˗/w4bwR{6WpJSd2LtZi]-ZH2a_bDX '%6@D[iСUW䀼󾗪|s<`2Sz{VM5ө]v{?xQH 7YBTv9lM$Z"2ܩ2G_`Z#LQFM}(-4U|IPf#v&Ą|iAH;[ RR@pn| 3ƎO҂Z>֘1Qu54iJ cc(ߥ/3+oeHY$䞟 g p>*ϫeZ, IsR`Z(_3%ZIya?Z(TQ),o+!E Z (ס}~R@+CjQÕ! 6\}l>FGm@j)c1EDL4w4Z?m@H ߳,-B/|h;yiWTLK!D$!la|H7VvL@wg 8f]a͝L?H hŖPVldZZZZ!Wl̑U=Y Q6jCsPۭiOvEr@Z]^'@UQ+6k+^p<-A[5I'Rݒ-VFt.>r7*H&MIqoF^$ mZ!T֨$y;DI.3̡/" P ATZ|ӫ,*@|DD SOfR!*k$J 4mbvǯQ7γ?E$Ґ! !?AAivgmo71 Ai)!b*jYAaTj'xԪ'&Q6D%gvQB:|#tB-CMUQ Մ?2js ŋ.:dž ' _@_/;]v떭T*۷o0Y*ౄC@ٶogDPʨ&9;v(!e@*|ܱ0Vl ^*FqYƝ;h7t'O?Nf N,%ThK Pϩ .哻/FL+wecZYAYE!_*Q*dB+&,5Ds 1(ށrfx%%>X"g%l@%w޻7_[>2Kub$ \Q?*uvS opg*\R+@ިz6 o+(G|hGyVW]HWRjv,I [?WS (55U!'LX_6bjJ Z@g0nݺjԨAu2DϮ|Oء` !))L[U;--ĦsEC3r+|ut*Zv8Kbo5TY>šB@yɤWPɜ/BáˊYAp'^ǩpf2 kGIJYV|$Ѐ8/x.`B5(-@`Zdy; YEȩ|EX_`e̦]@HRjZ:U^&7Y (EF"ʷKJQ'̯ѶdPZfk*j9DƨBjX0aQ7 g% ׺LeTὀ;QԹUNnNQɩnRb)A iA׍ huB\2W,lrCujogSYyN%Z2y;è7pZ=27n+k!kex4 Ǝ{H R2Ժᆛb`3g S zw s?uI%[~=^_fhz$,Zʻ[(?R˕GI3Gw޴e|;p@!22}\j=$ Rˍ=CgLÆ w~%3wcXZ5iqG#蕗0z H73 +\w5RBffn{#chAj |ﴀegr}cȐZ2uurÀ:`/.i9a#KZ h \yvr4g]&ϮRv8<RaZnZu"[u>Њԥ.K@+6 bVթ %%%%nZZZZB%nIQ+6Tp3,H ytU>#_l0=,MeXZAMž4#񶓏?ظoމt AB!vK)/w^E,fTذmF58L s|5 p q~cjʷC&+Vfyc;N0Ҍc/0[Fq7@WfYP7IצSRR$If+|?Q7оf}ģ>؆lbRG%ޖѨ RlACɶT+#D2,ӓ'5hʫ+Aj]ut!5i}3aڵ4rO%;zZjKHS)Z/ .  Z~2Vv|y4lPkm%jz5zD͉,Z΄+!f~+3Z(ϋ?$:,ZnZAjRKM9֦+Ac0O2R-a1xx7!g@/-ZnNZnĐZi U ҕ ^"eH[ luve}re@j~~Yu}+j}$H-RNb޻@jh?e'13ּNy!kl!l ê!T(jZ? NNnu#A*Xe`C,tKH !%'Bi%4@"H@+D%ͣbS&g ,Zs-)o6N۷i:h TP!>zݐmN'ߋ% D)BpTw܋^.`D+tI'Q۶mX*$P(\DZщ7F7~ZnZMYV*^zҤI$[I @eANF:#8Ԝ p֧gKqi,RIZ  +V2:I$R2oԮuX 6ʷe0Z~C/,Ԛ(ߝ[Rݙy/Z̻jݨӂ*)ה۞!H;+^Z.oʧ",))8y)V#JM-t9Rn]:ƪTŠ+-Sa׉[ ,X@ݻw&w[nϭQյkWk5֞Bu%<2qyVTT H SiPb˗/Fy^c4 *uޥK;}eգ <\ mڴ NsrrlZr;zj+L+"+)Dj xϑ;~-----Њ-4@|K@+͝@@ hP`\K@K@K@K %[|׏NK@K@K@K b (0M%%%%Њ-Gs%%%%PZ&^ԏM̙C}ekO^u_~@/rU>ޛOlCf͊+ffpه BK.?su@,>#IΝ wW$4b;8jѢM8/B3f̐?s5 <.~7B@V93 h2nIDATOiԠA:{"*:ۻ=?O?9B?^O^!Tt#8sGޥOp *?#XQ(W!;w.Ĕ)SLr { 9&JaiXo9,nod}ر, "ЦȸzhU_|Ēw}ׯO'x-+_d3aÆ4N_=M:0c fWkccteE$?F K2x`be'q"C-ʓ>hdsv@g{=šDWv1z˖-r@77H]zz:viԮ];wL6{)q϶a0|5gO&H014=Œ8rH 诿:(,@1.ٳ',0pI38F--LU]QiG2(o:bs~R  }m۶uO]r%ӧO'69r52Nv<f͓>hǼȫZ:`y3U:|es^|~{eW_}%eJ٤ye8\? <'OҌ; =묳%VZA !~,yn/i}l$6l"Yvpx,\1 f 9c/Xg]tEp^ٖ1Kc ՜&ᰁBڻO# +2k3ho[Řd`|뭷0~Ċ\߳OJ_Oޱ)vd} :v^)J _{od%:i?W9бKP=}Gr=nijt"~0JNS᱆f[r|م_&2 0gY!4om^#}R7#{A;'x"lϚ<<[ĵES%/Op'/(Dwم`w )n)okQ&LeE}z `Sƺώd:"W^yD'M͍<+"^oЋ5>v]w7Ӊ,;󎤳n.g\e2Vݝ:ule:]\`O[.x^5d^5jD {^Jw,^ҎTe $J0W%G$3VdIG t< . Hxeg ?(ݻtgC=MaEz8]s=&!9^0 4bdOJ #PXQ ͜fZIg}[$ {,ٛС`ˈ_?yW*ȐyDU{Z^G"Xg$A`t[#Gp0(7|0=#F]~=anZ9&8# ʅ'y,7M9/Xs̩րːZځ^ +==Vph͵ӚƫacǚOO$-y`;?ˬ΋RUF`G&SՄѦ`2n6/U^Θ1¿lRP WdI/^,7N^AW-6=nkl46 H2 62*e["XhSd,`vAc}w*\@ABK@+>ͼ]iHh hŖէK@+6D@BK@+>ͼ]Z%X 3Dm@O3bx/i{\r"K/~g/hH? {K*ƳѣkJ(??LCd7#[CN͇{م=+ ˀ=qD3[qw8ΰj &?X֝JP4 ;8!l5xC@^o< ୓k TK N*z뭘PtAayK||/RpWB/AzM7IHF@JUxH+Z ^ X-% pcoO'tBL9;w)S|QHEy䑂$J +: ڏ>Ȑy\{=o ''90o},3,{Vh`ܰHOʰGGkS$u:h I(%$;V#WWhL F8k#m d/fxNga |Dbg'r3GVe gz';0~N=T9df|&ZB;¬˰7ژWqH|Dq=b(6L e'"h_8",l4A+hT  nC`7%x~t?0b <[f?iҤӦn|0ɑO0IfJ~Wzۡ88Ԫ`ż@ֳ`:B8xd/;Tt{sPmO|4 [e6=Ҕ{k'I?߿ h3L09R*3.BxO>d7ymħgSݡ4⛀hVlHMa8A[Gmt%u ،(1Fǎ59659t0b!1ޠONz"( klAvQaטQA|EpZ;8Al #no AO?Mw})* PW]uA9Da9.QG%ڱu텏ӑР/W{ ͗N_4 m{ʴN:@kgeਡ`CIHE"mFFgQ)>`|`A7oT*PnFq681pL1;3#sk̙38=<]Jcz05;bj]v<0+C]c&7̈|H4 l^CJ 8#8,p`B[L/EhE#5&%(ς<W!?#y6>j4t0` A! P0XކCbqȋ1J{ ^0wEYJ늴'>HCzJ&C(3X0KM}ٲ2PRdԏ=3jOP>0ZSmI+6苽IO?Ih>ZUeExt"@fK{䁧 :XΎ`F0`.N;4bo9zRCL +#15fFFYp$*Ҟ0H`=`ņ%S-| hX %e2B[B'a~&X(H$(KmI+6$^%J@t12fo~g9|kb𛕕EFa|OƠkajH%6m*|b=ޛ7JU}}81 +IڷoʆRЌu?P9b"XbkXwd<$n P;JIdX/Bd|WcN6unE:u TT2hŦ^4@H@'@%i%4@HZ4(/IENDB`ga-5-4/python/docs/pgas_11/image6_crop.png0000644000175000017500000004636212662210372016451 0ustar mbambaPNG  IHDRVxdiCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|ƍ8  ܽk)RJBKWj[K-I!o= pOؽ7F3ofA']t %pI*JT]t % $`EVBUUVdeeiӦrN8mF52 7`ڐ2---ugJZQQQ4M't"PQQ3gh?OJ/iCCQm5Q5RĦW[oU**L G'U]SSDJ]`>C]pUعٳ'PMcv^i7]tx7QNC!6*!EUKY{OWZw0Y$9..!!!}ҥxs⑑6mWwYj`ǵx۶"<:;ob֋/cT氳Uݩ<8T#jǚ]@[b w?iįÇo㎄<:tlUk.TVVbApT}xg5&tѺ!#1y ^m9x2 U^7cZ{a֬YBC;[e˭Sc4r FYȽppQns;~cj FRT+GSPYULn"5|{9P:PԨ(9ju&5iбcGUqܦy\PPwww(+J;oBùxTD{t VD&`PZ,XHuַo^<%~%*J+K/BxxwYx3q7t0 z+2L8 Ok{RSڹ9 'Ϲ (cz!|7\v """0w2c9y3f(G (PEYt8^CrN˫m_Äv('3W_MXD|yپl$?<BgGqǗy} 9ONYIн3/X4_ZM,=tF6QL=S3ѭڶm+/Gk)ϊyAsϽ[XQRR [oˎ,cN V`a\V'16].1+7ww/\S_0p-\0jg{ \=?SerppĀџjμɿކ#5F7-/5* գfeW&^Q {C.ׇs?R%\`zGUg% \EE;nӐkуAkol1?AlMgkS5W^q!eqm \3fe]+L4YUUÇcuS\h^+붶G< _l)F^sւGvGM7BsN;RIɅwK4cf酁+,, ]qJ؟1ݼAȶT 6 iBE#!* KJ+)\O7GR / #NDF!44h-B''#֝\xF$,n޼ Æ j ⌃kGTw"55p,> :>t2;i(9FF5w:'rqS_4΁ֶ0Ε! H_;TMmhRȌRp'h)m2hZtnJd,ڗw,x8$7xC4 ʪIΝ Li៩Mjou:C`ZWڬ¸e!ORR1?^xrfgz]/ `̴ǫC/ltm4RhycEYML9.SC)z?kg=ZkEa.+oIY`6P0P8 MTo T4Ơ,KTۑJƠ,=Ǵ.2-18s-Qz|˲>6*Ģ.]t h@}}6:EJ{tdn|UE"hvE{%K@Jm\P2Qf]iN;> ׹]R^d.N wO^d%KRKw:{ط? u~BAhWwkhV ^K+,[" [Jk5/Kbҿ%pKg] ^UeEɍB [Kzo&2:Q’ a 7>5 xƒw= a&%5VКMZI2ݛO)vy0>ig!cף7mXćM\'F)C%m%"gKJȄRV IJJW9ۃ5PUI.l6?Ď✨5J/[a'lQ6l\$tXА1\ҲҞH ٝ(Z28\|zYʰuXdՂ˒ H)P޸q+K?^ª˕OхͿy}"/kuѶ6ljUIѨ%Sd_Nk|:9g &O{DiGkL8ܙ0yI hzO ~>X*Y_~hKB6bcح{ j\'_KV Ɉ=gy k!q͋p[~X:'k*Kx׭%Ytl=ku صg?Zje~_PgxeիW W-`{qlI[B*.[۫;oJD-A܋Fr:UyMVZ~%>#-bw#ZeejF-U /޽k'k.tFrGB:[DaƦ t0\< Qk޸ lzr%Eϸv.LBWC}5,X~f.:\7*j&{].xuc'7O(- L9Ҋ*ycb,uU%8@--Tb}A$}XBBZ&QM62 YGmItEH-6Q*fVl]0/>g:o-Z$[P߲]GQ&gs[meyX9t/(~6SKN\G "YoBf MDC/.-C9,JPD]|vVALHq_ &N4'Fl;bXFן_OD8lOndRadw'd+ e琞j$`E^vo߃g^xXފas>b6:ĦŴZd{֭1M ˈUyض ^\oCZ1/f~?zF×F~Fe'/@ %j239ÒU {q%K?-Í^RZ6x{S-n LKU]/ bu#+q e:۠JK@.GRdž"[:Q2IFB%Plk~×_|(q\cUyvh2%H$]RFȊ5DrU  0I})O]t \>Psss3\BMdg^.`68{fFLCڨZAP}/tCYl 2ե"Ooj3uIx߸Dx)o k"ǫv@H@b%K%k, 0K(;\*jK4$!E8nPMzE1a 11;Nc8̑ RES.]WRI";󺒉 y1xolS 3]v[?[0h&<: BH.][)[yy29rD{8@B 6W 7G`P1A SO.]&}hl0[K7+GrA˗2yM8 gggu4/pj!V7nQӹsgZgmmܸ웥|;{x'V,d4uqo~c,G- icoޥz|#uf6ZMQ qY;zR#GDpjz+.re6S}`Z':>}haUKQ<7[bbPan—n;Nߠ2+F4t|drQIfIl:d&[;}9Kw'|ԡ,[ wq噎ʝkdd$RѳgOxy)_(nF1t07߬Rh3Oa0_s7NCcl8;єV@n`B69_ gƉPolٲETN߹s8&1fXU0ˁkGąs3@Y`dX0UpB:2 KaZ)&M"8h9qqgEc)_Lyn(G~t cλ[|_<]5E{ŸqH6&Z:Dgy-7b/@k_eRtMĆ ;BI%m^ ^*J{4tĻRm+m);9E3 ̔+ҥ/Bvv8{y9pD<#=^();牸 ޿GW' 5}T'x*7'ߗ耰JICBV9n2ؠ0C>K׮Xa }8p^sVfK(h/Hj=wc׮]ԩ3Lo^B^p-ڞī 01 ^'g#M.>;4;-͜O,׻:hڀkce)zTOpe' v؆ǞxJ3pQbL3. :{hJ5wL yz:uV:F}٠!4/er~f+ \n}׀ʂ:gKTsp1~^X߫W/1eB) yqՅprϸ +x6c)@5 g*VMu41C9zJ[aRA<>bVKA>YuaÆcɒ?57кL]:{6'|]?p`?)Tlĩ*\n-FhMa"xԣ{8k7V*'-HAf.䌷'R}rҚC(,pO,ؒ.x 42KbP#{ooot$Qa>Q^j%: ˎTPH?{5ڷoc޼PE^Vر]|aYD_}OQ܎%g!)[b$ZlgdZ.yg_s`cgpԥ lJ`OA w.߫Wf{o4k֜>rr.Hdmnݱ}V4`Øh :T^pTL}POƛzxÎswD"?]/m|3TjL]dtTN-рEɓ'#{Jw qօwXƞ}o5Jػ70`%"dd];1nuBrsԸfk{ׅK\gΕ.Rh&^kʔ)ܻLAƚT9HE@!Ӡ,QceZ+`Keg*=6Jl!kZQ@+Ǝl^:}`í酀 :ɢUAը?%K*,xqRj-0%^՗T5(<#E)Ԉ5e!* dOt j !T%1K'“+P{"C%K@ZAV}&a4*?H\^- U;zr22,i >VA-萧aUtL,Ё@!̛!fXG矲.^bffTpd1nIjԛo?dXbu+Ħ ޝda Z>O]t \`LwkѴ@a}xwEm4}w+ucF#" vPM|qsWáB%/ٻ9YP|d0'Ν5|pچE,Zd$ ӏJ[{( %@ڎ=Y7##]*>rEx\l1;4-d>n1+P\ZA %媉0JJyN p,]_Sc%(%sg &h9*dj^C>EK.ss@W70qHT͑8]y7􀯫 -2nƴ'쨔P UO)?xi&%} ;>(wb JmPa8i?jվdx[eefY*iw '>{.C CdƬΜZOLR]Cw7љ0k#>I/ƒXUJjQL7m+MEމt)чԾtc+McYT[ap޵kVu XV(F 4{qD۸%hN }6\Q-)kO6=Ҽӄ36dQ׊C&^?xoEmǟ|Z7 Й?i!ÅR cq !zۚ_>pcG駟ZUR7mڈH<#[MڸzÇbV.N_}Y^ދ[Ug nWx9}ξtp:GQƕOM,H^xe8 e| |؟תxw!ױ#pz-/WTX# ^W{Dwǥ[ W|/SD1h[O߿dyu20W;"L@}3gbkNKqF$'N#F(d[[[#w=|ȲFZY\Zv'=Z7$.XfBBB*۷oXk-DUMWNCd*R1 f̘a-"3cOn-blYUr:w˗ 1Wπ.H!}W)vrZC}d$Zb9]_09kG m劥h^ m#BrR"nypO Re& 6{dǪQ,iX/!Zp;Y6 ,7@ؽ{T$Y oZZr<fdH.te(FK*l[Zxsѩ\|gZƣK>T/u" &%>D{(ʍ>)pR9͒Qqԉllj4Q..GFyO &OQ@uI= [/}M$cٻw/\Ru -2@YQKWR]Kd>s?PvFl7Sm߾7L+mI֦qɂh,i2 G;M$# hpx#Vijk7y6SQ*jTh꿒faSYq(M,֬\SOa]Q^ I4pRfΝ;ǎv<{%K-y5,Z8p +0"Uz%-yٱAfW0X 3Lj2l{Qy ܓs;r]34͎'ud{FWVԨ8e 41c_*LCdJ|ʫžY@ĝ=#l=*%eA *PSeyI@ zhHpˌǧ#&*JbFP *eʼLi&;#95 {G_C Æ C7R=o,L1ȵmۖgjL؇,}z&L;cWM2鿯ҕkL*( וq{F<َRhؽU&;ѝqӬ.mL}auq_Ye#Qڧ.]t h Bԃ%K@.+.+4S]`u %e/ 2>xG9mD Zɔ[4,j [%K@.s X xжΖAߙ]w1mC4쬺d %K@\x4ߞ)z6yt %$ TåǦ]vjl52:aBs,9i3Xc7$ * \͚5Gh()V*i8ɴ뿪jh:.]]e@0eL?)e(NnD\Xb~YKVy5(șxvEP{Pe||<Q?EW]$>_Ckn?j`*QqޡfJא'@x 0;`aΫK@.NRf[|pYz쉒#[S,+J&s6SR֤T`^_W4R={M; o_[HHL'P~޾O[pSE~2#r;f<\t//+/T=yt 4XR&=uj/y:WGl:fJ5l`rDbs*E#p/_Jt %py%p-l\]\# w-:WpA֎:h50t j$`3/>dJ4 t:u_'gP|}6/Rvv޸R$Alq pMx-GΝkߴ^PPP CߋwB|_"o3gvh|˖-1b]y.ҥ"X\\ztӶ)-^|71MLSNڐ2ݷo[/ \ܶ4i"\[2ex>]N4ߟoY|Gyh_رC{0ս͒ǣtk͜-|[RRRD][_4ѐG2d{Ր^\Ȼv쌋EjHZWG?/2Z7/^ #Y,3 .rH;!ֽONqe`tl=KaY%vMy$b-k dӧOGdo<5 *42# J+n`uskBIA;:ǗdԛoBQqD٘CPbQsgDd⧚2yMd"W_1cp&6=zK[ */&}eotyٽkur|-wV<{QbLX [ (.Dޡ-f10RI&*_NXZQʔ{; D*ݷ7 ^n\Gc*r:yR m21p ݽp.`UDKG9Սjol-N&s lzLT`KL nF?^@?qDeWqvڧO_8\CvTGpTm[y*ΗnX.#_Ε#2mljHZ4l f0;wM|r]t]$sбZAvq=58=91sh Ueѕ0} $Vׯ#+H4o/G7!>;t~Ĵ;R=g w csY0p%ً׆l)q9\stK ˈ3 ~n3bb`r'7h kqRTdrs?xg~@e>㪳G EkRis0J/4s0 xd`I꼻04 BoU.۾_n(hb8eʳ3xw ,oB;Te|R 릗Mi/i@ Çfp ];B€>xb ޏ:VޮxstӚm1ih*@yكq㖩w}MCx tCGs5iE^vk2hL1 W , ܐ ,"P|9!i"W^}-0~>KZ @`U&Bl$ЬaxnH{uMuFw5J$z隀kxţ_npym.Ch.,? 6gzWFQOCSfhcz^$BWk.;1j˗bȰfk ޻6L~;%'=Ty&m\6ya0"wޭ JKKk9~hݺH̸ B(ߊi6T? \<8bo1͆WrR[ޮz uq!ƥ P.ņ:z}ӤzF7PUr{*N2xՠ ن̯aL.G }rh"/%&X_|!t줬VbǏ{Njp-a4uj%f:@>|0fuHO QQQ8y*dž]vag{Ta J}P/T}uP0Pfv$;|\Dު黋K}A9ME+/yx)w L<δ-Sx~lܹ HDQO}AeUL,h +֊.SQQNez h؅F998{&3Yf{PSlRƧA8:ѻhkTws/1Nr:!,ĄigFF߆?,Bve)ITiVHchMw Ux3.Z9ARAZCI"{k|^^&JFza z6l %RMBWR{y8Q=&^[.;n 5H)Ɔ@l뀗F{>B6xlI#R#ʕiA>շhwM\NMI\+l>Uz У~[d =tA01UPT{$ Yq}c>2 qޏsB #<<^|Et"-\? lT4ӷ  '篒԰ǎE@@ }kbDL=ZR{{Ҡl.],d2$p%ilPXogSl RXZyS~YHWHaHOgggP%NOrEaa8ajM w68`cHU"yXr"ٳ2uM%Cΰ:IhJMex IDATue F Yg-FT(7'W۴mJ 6+Wgf;lb-}62Բe+*J\2Iu`0(ڨW6G'Ô߯^xtf 𲧶M&:Sؓ]EJ>*E:Ɲژvlg̰D3C?G5)yr~~xӆk~6AqK>$ e64J w$*ڔP?~-2JM=fvF#[oSGF< cKy:j* UWPyi4}k Tr|vyfˆ㤵鬩LRegΤM"Np͛Fgz КsPo k ٦<lں ={ď?h i8y5d-tYk!> W㇟~M5k°o-"3c /roXW%=0P% &?%MzjkI*S^z5J,W>cښ7$w]sZxQBar؀9yE(~a6T2ͼyy+.ϸ&ғ\qٲb#3~fϞmf`ʿ[Wr8xڵiCySOԟ,Ty3B\'L8a=HLxM%lh{Ə^x ӢE >s}Aܦ -}XdKݛΡK@.] WN׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|>7@Wby**<{yק (V{WT#(ޓonv2ܛ܄9rv7s~XHB@!P( 1u0N*J B@!('2B@!PYI"P(qu tWh"ꫯgM]vq[O;w.q[t6l@ԣGRO?Dnݺ5}5fKMxɒ%uV tꩧRjjjM5ͳ˖-͛7 O;ü<]6mQGē$={ԆQ5k&hw/k<6m4  eeeӵO>$8̤}ڣ>7N[jE .a;;<ꪫc9&M0 |s=u ]O淲aU9'֭[Kڶm,*=vq JKKm͙3G_|Acƌ=}牻M&vfsnn.M:~鯿v޽{w( 0 wCҗ_~ͣJbi}8 k4]bu{ 6Xa|AGIB3۷oO{.ٳg<{vAg6E.Dv\ Yni2<D6pda_wurJ:_U'1XtiDT< (k}^ y v '38f̘aB1%ݐ(w{WD]"gx衇ݻqFF~[zٌҰaD_f͚ g݆9:7iŊ;sL1 O=!\"4lhi!]ױcG>#{Wd878F} ZzHh'wY2yd[ϟO˗/"ErS<` ?:묳hҤI{d28yNz7a׵Tbx իQ^ TB~hHG`/Z)^ '*e<nhIGg yx"%N6m&%86KO?im۶-xc\ 5XC| k3ZppC wOлwo)vܙN>dт՝Z"keee!,-XWE.BrvEC>x 3)w}gPϏxtOp0~`l&Ä&Dǯ`?#cعi\czfүrKg)Ƶ<@>InF ni<VdT&D^^"l%*v˄*dm@Sa_Bj+ *hx*Y;w:V&/$K&/! Z=[ d4n9z^F4|DE;s{ZĜ$4Ż1 2b5*y \6 oc6 ő?yώLMN+Pޅ0܊Ho')CZ`@&plà+vkbvP:,W_`&-qjB"dѣGmQʾ롢{dc%Lt HHMH|\6xѷ nuWqSWS(ս4U1R( J B"N<Y 4@Zߝ~Q5s*+)?' iR+ nRN^ 촤u9RIi ۑG)/+-+B%f=dRL\%'‡'w/ugQZZLY-̬@vᚯ͛7y]'&.1Ib&ɤR2PqYJ3^;=!^asfK= )&`-lMo%l*b8Lb,EyT\RJ ˴2˥X9)]/Ay^Z/me4%EETTGׯɳ2ax~הwl:驧avcL ̲rۭС7f2d0rit]u7 ",7^?O،ʁ` '-ܩ/u?u:.j~s;hͷRnSi^VVJN S׳BC'(1&$&\tRR (NoKG^[!y63]CMr|0GįAcͷl0%P"zKq/D7̝H%Kc(>ٽ"sה}&s_({,1Pɽ;t<޽f.6`<ŧ۞c,3t97bqaj8ENõbXƎ|7(Y'|=x ŗn^ٱ [!=]vۋߌ iΧ̷ֽB3_3f=o Vj6̷BQ=J/ng?NV"6JDz􎺓 |;u+YE{upX N&/^7nV.9..+ɗwp;82NӇe 0xҿ?s8"!=Yewp{:8~?\AʡTu.iH9ຟ󄴃k~\bV.?C`WdnSR3tJ6q]wppn_r+l|:5ʄY,+a A|<[ ^]Әq]tǝwyz8/sf#_{[7S+^&KEd}F_z宵/sڻGR\m0{{MF;8@$Z{^JMq̘3ϢO9MUt5"\I0쟞i .)'э7­t}.d7{Ngq7s&ucGԮߍMVf5vפ4|swg8ב`FAKК5gam,q7;2/,uL[5cnwJEYcvZ+Z)_ʺdrMBE.bQl*- kRPD]_x-^3-,hB@!K('WRSE!P(,('gC( @]B@94U D!&,旇'??tۚ<˾}Ãl; [> ds/73V%4y*_If?6)OK.MdL*եڜ\ ݀pzLcAUYOb@C|4U}bz?a]?y_ȏBhɉE[>4idijLG/ ۯ-Z:880q)TmNN,WiD)(Ċ-62J̊q[)q'UiD0:ZnQnx 4JksbpF4)!SC_d72Af".⏰A+kГ I !c'.XK?pEIq ԯq4K I~wqb93{  1 {el@MPV6˅ cv{Of[JC<"F2FJl &`'Ŕ0#~g QȫɒpHxi}"?ɦ#bκ"ʤGt瀥(簥l(YF7XHqMcT:eƒ"? dR2|+ͺ[ TN Rp ;j"sp ]0 Tdt#*'2qC`q/XkdiH.o!(VD!>p> .,*IÊaj2vZv+a3+V gP12 u?1㥹+L%wdu.?ED~B`Cڠׂ7;LO^"4'm!%~vm"`JKKpy,Ͼ*0~ѰzM27,?z?CiZ&Jz 2)Z _M녭{` IDATDOT}z R 'D]^ k?:;l=dҤ 9w$z?E%lW< }y҅ykǿӜ(Lň/Fۻ^K-ZXY*LADʐȸ-oGt$Nڶoh`?u0Zr\m5Rbx;jǏDnDjER#62ar\>?-ٔҴrrёVD&;#=mwIƭ^z ⶦD̗~АOޛ6ns\xi4h6!\ǑI"R_ʣjQ&/&x11.:$2ߘ?x.aK@F d%0&2Xh233aÆԼy )柝;wRfEg l*t]].;@9%%Qt]7Ξ=y1 f8%U`ছ, lEFF?';Џo^a<݇cYZ(?'(-[Pv]Lrrr(77W*z7AÆ]˩ *Kaxڵ5j?3~;ws:FK"pH@;x31kם &ߊRq 0Ɩ|. *"/(ߊx Le-+"e:rpǯ0 b0p1'hqؠ9c>JOШ;Ϗ$+=1r(pp=iL |R.=Þ0jVZڼz u^^G r a{ _fK yZ {F%-G ]iM^rJ,KEHmik\P6~l-M(蜓zҙg;~{۶4?>p}uT3gi!T\t85 'DvШ7Y4tЊG7m7|㗛GO<8Ӆy+^i긕OI!q~";8; xB={jr NgϞRN; 64iLJ_$),N H"lѹs)JįKRܕ_۶h%Io-Re=dZO.$\ԌH&c;K3w*]dlOJJ.fh[FF˽CRܕI?5iiiRƎ7Rjj=)GpD,]8$JkFBI\(SZqWK^MMJavZ ^}(o|%U6R6c|UVR&Y`\2XbHrE2[~jvB@!P(j=$TP( 'sBF]W( Zrr> U B jsr֫" "E[{f(EV8RD`#b/WQO=? ӯWXرc']ӑBCkV&P7Yt֭[E!-gVո[??B,EBltqfċ1œ!#{fs*.2P ]>O&~yyj*)]/Z=Zш߽~oqjZcJ-J_rMKzY&`ł͢6Z.Os.e&˖-4upfeK le◾6K7~HC=SaXsPN递ҩ$cEyx@^1LZ( xI_8Oڲ&ǂCf eE胩hժRi7Gq i@Bl+VݻOtQހ;8.]iJⷋ7o,?alw#Tә0;`6)ZGùx >}aELAi\xѦA;w-[GẕuwߒlNܻ 'w)RV{H:&vhCĀ>Ŕ_ZZTd◗I#7lXOW]=H0RFzMs,b֓ >JJv)LriI)mݺE r''OK89 ]tӧ RS˛6nv۳y:)4o >1ՔLGO@f1,[JҎ"-Ȫa:MB*fG5oNlmN'jڏi(՞+&'`(p/rA&mCF*m:7K1ܕ%p‰Ԯ]{/UŽuxIA~ܹC*~NN{Ģr''ǦE+˥ulJoف-DTLD^t$/Lx|Tdߩ[RvD26ϟ7.\ 1tιJz}"ӵlc391OgxAA6mMJ̙w)='KY~5X@ZZ|3<.g~t =ݵk'IׯoU&;oKª?PTV@%̙͕^>]z ''AePB@!PEu1*N B@!pP A* BD@93U A@9HJ<5"'h9~ >0|' O4k%<]0F0X"J )|gmp0\lY؉2a}V:9S٧fĿ~rhTf_D@TZ1xZ"D.B Ky!.6.d2tz3KǡxmO>H,5)JFQc]fHS"/0mNLի>}^umPJԡC#7Fӏ\K.҃Zۜ_~ GGjmn$~"aC Ղ5?S "ʍxFJZ<`ba,322(^ye(|'nl\wV IY8IL]YuM]Ϭ;vlW&@LEt7;:JǺ~^UjּrIwǎ4ud L\ڳf͢‚&cƭ[֬Y-"5zǟ g?R k΋a7P:+u.a; S/ݭLs7S3dv ?b<lɦ5K.\覧nۊbE~BrlڲeEEE2A+!׫_04ff>܏( .蠨g"Jvr-ϥ@^z˦ kR?@F1ˎ[ kۡ?e={Zv2 yϬgefƜ6PoM|JLJ4ݱ? A%Xfժ?=?3^!S%z_@'qrGJ@%HPy',ӻ3Qkذ-(2 5/]p56i҄.x7)<Ӑ2}26#J|HRR2XD~"l\ΞFHhD3&PRT¼,3r@R~^P@I4 mx*Ll+gslS~l݇ nTV^fhHo<`S=%,wp6')Hxm.VJu]Z.2z'tMCOQC9tw ZL**sQފ +ܕ7t3zutI'IzM2gKA* Z/dtב#U`sވ5eBVxHqt'JzM:lRvzO&כ<{wW #c {sF|.h`L[oZle69iK+iʫY^lKRΗ}ir^ǒVQ +^p\`wAt9 v}:]'[r1rxVǒxqڎ{U`m_1;nQw@R^?2EeNuP*=X吪-pf:1ڐW/R( Zrr* B@!t BV!PmNSd#rMxXXjW&m>U?W*~BʬڥeqY5:9!U5Y?!tqaY'dyݢ5VxKW->4M$ L~X39-T,*,X^{=|DTBU/s~gP3RM9믿6.,!0k1dU^g&N&B{3~g~. -ZH~0],\ g1,qd*F*l1\`Z7(.1 oU͏U{6hLGܚ vx=E]d]m-95| _WaCMb0=-o jc:/ZFY i^Jj범D/?؜\&Zi,-9,ٳGwܹsNuA법2gxo> ʐc޽~K``] ZO)xr /^ !WȔc"4oXGL% Z/! mJ7lSǎw_^6Ul;)1icR؄m6wل WȕC65?"Jj$,VebBK& \>ZggۤpÒ}t۷8so s@ҸqŹ_D^yUk C#"Bn=YZS'/O4fR^ |)Z;K/B {ў6k֬驧E[o_ԅh`Ś"h^ڟ/Q! <Qus&Ex'DG<Ŝ&odUG{3)Y%޺ =G.~p\ n%%޼N#%1a˥i˛Ҷ:0er^%xui^{v83z}c## n#:^Sj{ނ֫^܊C_Wү8E;R^LUh^yKRYhcJ]Oɺ?$K»~[D®Wɬ^P( p!\T( @!\%2H!P(…rrBRP(QrrQ$oaiRZ%Ė)QT e ~Q*X.z ꫯTu(Rv~B\ts=R(%#L!e4x֥rr ܜ\>=3RWRvpo9ŖauC!@{@CX,Ӄ?EFݰ~=^A-;,2u.b Py/eRL* $[;؜+Y&\Dh? J;80:w'&! 2=V&a8IȄ,+"ĺvB2~|2m nrp9]`3eB+ݿJ_.JvI nd5G/2O>$r%ybf<DJXT#vq.N?xZ/83<%( Aծ];RZ~Q]\jS]uq۾quS*,*My=;lߡGy;֯K RMp("׭/_|j B@!ٕ4 B@!rr) B@!('WKNP(('獑P( Zrr4 B@!rr) B@!('WKNP(('獑# XzuC|P`ooŋ{Eg` ˖-7|Cn4y3 ެQ:Z ^QOV֮]K ,}/K.Kv3`}ѣ}t SL;vЃ>ߛmݺ5G` F 3 EtSff Q-γ\s:+p+UVҥK騣"R`ږV\I3gΤ,ٳ' 8P'4/fm:묳Xn#h( J;c}n/O@egg*=\C1q|rI'{IaaMNNׯor)vkjk)))" , ;7w~]Mh"=&PcJFq|Gk̹+l+VИrQ HuWV_BP3|ԨQ#:s`ѭʅ~ĕx \Z;j5kc駟N'NÇ;uo qG%uC GF/F%7+N*e]wEW\qt/;3TB?B=XE0- sXn7#nuQ.]<ٵkNݐGy$ߟbv_8p~{6Edǘ?,Uz'p_Pƴ 3g[`wDR:N@ zJl[nŶ+=P!C:ƍӌ3ǰc: ]}ǏwurшVܹsmhqi51BZW_6`$tPz-B $Dlcնm[Q6mq'*?55U`rM6|;#e]ztyF[g["=5'x4a!xG&M4vpwk{/{Zոil/zו|hƎ*ioOd&d>R-pWKTx,M6%l6}v*%ѝnym{뭷O?$0^ƳɫE֣~]E grV&;;q k 3r q [ת f5!^x˦0<`1t7A y<M2"ʤz&t_ 1SƷ[]p/"ay OF0~ӱcG;vc>9ic8wJ17f fAn*~$\o۶tmWx^x?Q9"X7 u: f,ufbK/k^~H#ՒN.bC f +EhM}lIT0xmv &|gRc0#r޼ydq=8>"#fjb׷lbwז,Y"8ê(pd H/UČ^88|0Y`y,7|<27'i~8H3U @tx͎Ũ^*c'x \qƉ|q19[6xƭ9'g]bbҤIwOj(N:i\`MƳ?E|;Sqv.c, <9b̏'hVƭEO?kra:9cr/8g+ĽW^yŸfq3nxuu-]tEbb4{.##0\s5xQظvqkL8;0dŤ{Qhω'R+FfO1 uƑh@1 /i<&BG*/&`Ƣ. K|DbIe_u#NmuӧGcdݾhĬ<}DST( jA@uWV % B@!P('Ww* @ \^P(5rr5zB@!PT U %c_9] j0Y^/vomƧ6 dm8ydK#tVÉ]`z.x_S1e%<\VMUݶ_|A { kkC~tt]=$`C\L3&a<+?av}LFO)vgRBZ!ȈW~P؎Dڵ}WFҥK騣"8;l.xhܓZJ2VDx(9䐰c tawc_NZH~vUetÕ\\SQF{ァ_:(#?-_\`W_=Z\c8* FHO>Y6IuM#BawtAuWJUB>p @K oĉ4|put w^'ީVUFA{.bx]ZOwl} h4u 2y95^H˝+4tPk`Ag2 ov6?AAy*' RZ9s`G'X0>[?Of1 bDw#Ÿ6mZ.x7݊#s]wpw1̙CNv"c=+ ڃY0~i݈sx/.BC=dQo%z :{׿[hm(Х8ϪrrUAO=[+5k @'L@<%Ώ?8qWwW' )(asX2;CԤy3}D-Zw/yBn2:vڃ15kqP\J~BW^tm#,+?`-x\7xbZj|rWԜx 7N"xT5?RA]`̘wݻW:y''$xN ]￟]F(NO%|3駄ު){Q C 3pnv]tcL1H"G%2 |8}tSU`BXM ftZq3ynݺ&k ̂5ϧQF4c /7?1yKc0· ?0tM%%'LlX%**qu]!PnCE/7nY#>rasvГ7nGzDBc*1r0T5?q7_;D͕G#,e<'W8GB51[p9 h]ᚧq -?p.4n2LhO/8-bP0.Y UՎ,RJO!AFJFD4hr\RC )\qPN.${ B@!PWPKJJx( @qtCr6oIENDB`ga-5-4/python/docs/pgas_11/laplace.gnuplot0000644000175000017500000000114112662210372016545 0ustar mbamba#set terminal png giant set terminal png font "/usr/X11/lib/X11/fonts/TTF/Vera.ttf,16" set output 'laplace.png' set key out vert bottom center set title "laplace.py Strong Scaling" set logscale xy set xlabel "Cores" set ylabel "Time (s)" set pointsize 1 plot \ "laplace.dat" u 1:2 t "Solver Time, N=10,000" w linespoints, \ "laplace.dat" u 1:4 t "Solver Time, N=100,000" w linespoints, \ "laplace.dat" u 1:3 t "Wall Time, N=10,000" w linespoints, \ "laplace.dat" u 1:5 t "Wall Time, N=100,000" w linespoints #"laplace.dat" u 1:2 t "N=10,000" w linespoints, \ #"laplace.dat" u 1:4 t "N=100,000" w linespoints ga-5-4/python/docs/pgas_11/sigplanconf.cls0000644000175000017500000010541712662210372016553 0ustar mbamba%----------------------------------------------------------------------------- % % LaTeX Class/Style File % % Name: sigplanconf.cls % Purpose: A LaTeX 2e class file for SIGPLAN conference proceedings. % This class file supercedes acm_proc_article-sp, % sig-alternate, and sigplan-proc. % % Author: Paul C. Anagnostopoulos % Windfall Software % 978 371-2316 % sigplan-style [atsign] acm.org % % Created: 12 September 2004 % % Revisions: See end of file. % %----------------------------------------------------------------------------- \NeedsTeXFormat{LaTeX2e}[1995/12/01] \ProvidesClass{sigplanconf}[2010/05/24 v2.4 ACM SIGPLAN Proceedings] % The following few pages contain LaTeX programming extensions adapted % from the ZzTeX macro package. % Token Hackery % ----- ------- \def \@expandaftertwice {\expandafter\expandafter\expandafter} \def \@expandafterthrice {\expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter} % This macro discards the next token. \def \@discardtok #1{}% token % This macro removes the `pt' following a dimension. {\catcode `\p = 12 \catcode `\t = 12 \gdef \@remover #1pt{#1} } % \catcode % This macro extracts the contents of a macro and returns it as plain text. % Usage: \expandafter\@defof \meaning\macro\@mark \def \@defof #1:->#2\@mark{#2} % Control Sequence Names % ------- -------- ----- \def \@name #1{% {\tokens} \csname \expandafter\@discardtok \string#1\endcsname} \def \@withname #1#2{% {\command}{\tokens} \expandafter#1\csname \expandafter\@discardtok \string#2\endcsname} % Flags (Booleans) % ----- ---------- % The boolean literals \@true and \@false are appropriate for use with % the \if command, which tests the codes of the next two characters. \def \@true {TT} \def \@false {FL} \def \@setflag #1=#2{\edef #1{#2}}% \flag = boolean % IF and Predicates % -- --- ---------- % A "predicate" is a macro that returns \@true or \@false as its value. % Such values are suitable for use with the \if conditional. For example: % % \if \@oddp{\x} \else \fi % A predicate can be used with \@setflag as follows: % % \@setflag \flag = {} % Here are the predicates for TeX's repertoire of conditional % commands. These might be more appropriately interspersed with % other definitions in this module, but what the heck. % Some additional "obvious" predicates are defined. \def \@eqlp #1#2{\ifnum #1 = #2\@true \else \@false \fi} \def \@neqlp #1#2{\ifnum #1 = #2\@false \else \@true \fi} \def \@lssp #1#2{\ifnum #1 < #2\@true \else \@false \fi} \def \@gtrp #1#2{\ifnum #1 > #2\@true \else \@false \fi} \def \@zerop #1{\ifnum #1 = 0\@true \else \@false \fi} \def \@onep #1{\ifnum #1 = 1\@true \else \@false \fi} \def \@posp #1{\ifnum #1 > 0\@true \else \@false \fi} \def \@negp #1{\ifnum #1 < 0\@true \else \@false \fi} \def \@oddp #1{\ifodd #1\@true \else \@false \fi} \def \@evenp #1{\ifodd #1\@false \else \@true \fi} \def \@rangep #1#2#3{\if \@orp{\@lssp{#1}{#2}}{\@gtrp{#1}{#3}}\@false \else \@true \fi} \def \@tensp #1{\@rangep{#1}{10}{19}} \def \@dimeqlp #1#2{\ifdim #1 = #2\@true \else \@false \fi} \def \@dimneqlp #1#2{\ifdim #1 = #2\@false \else \@true \fi} \def \@dimlssp #1#2{\ifdim #1 < #2\@true \else \@false \fi} \def \@dimgtrp #1#2{\ifdim #1 > #2\@true \else \@false \fi} \def \@dimzerop #1{\ifdim #1 = 0pt\@true \else \@false \fi} \def \@dimposp #1{\ifdim #1 > 0pt\@true \else \@false \fi} \def \@dimnegp #1{\ifdim #1 < 0pt\@true \else \@false \fi} \def \@vmodep {\ifvmode \@true \else \@false \fi} \def \@hmodep {\ifhmode \@true \else \@false \fi} \def \@mathmodep {\ifmmode \@true \else \@false \fi} \def \@textmodep {\ifmmode \@false \else \@true \fi} \def \@innermodep {\ifinner \@true \else \@false \fi} \long\def \@codeeqlp #1#2{\if #1#2\@true \else \@false \fi} \long\def \@cateqlp #1#2{\ifcat #1#2\@true \else \@false \fi} \long\def \@tokeqlp #1#2{\ifx #1#2\@true \else \@false \fi} \long\def \@xtokeqlp #1#2{\expandafter\ifx #1#2\@true \else \@false \fi} \long\def \@definedp #1{% \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname \relax \@false \else \@true \fi} \long\def \@undefinedp #1{% \expandafter\ifx \csname \expandafter\@discardtok \string#1\endcsname \relax \@true \else \@false \fi} \def \@emptydefp #1{\ifx #1\@empty \@true \else \@false \fi}% {\name} \let \@emptylistp = \@emptydefp \long\def \@emptyargp #1{% {#n} \@empargp #1\@empargq\@mark} \long\def \@empargp #1#2\@mark{% \ifx #1\@empargq \@true \else \@false \fi} \def \@empargq {\@empargq} \def \@emptytoksp #1{% {\tokenreg} \expandafter\@emptoksp \the#1\@mark} \long\def \@emptoksp #1\@mark{\@emptyargp{#1}} \def \@voidboxp #1{\ifvoid #1\@true \else \@false \fi} \def \@hboxp #1{\ifhbox #1\@true \else \@false \fi} \def \@vboxp #1{\ifvbox #1\@true \else \@false \fi} \def \@eofp #1{\ifeof #1\@true \else \@false \fi} % Flags can also be used as predicates, as in: % % \if \flaga \else \fi % Now here we have predicates for the common logical operators. \def \@notp #1{\if #1\@false \else \@true \fi} \def \@andp #1#2{\if #1% \if #2\@true \else \@false \fi \else \@false \fi} \def \@orp #1#2{\if #1% \@true \else \if #2\@true \else \@false \fi \fi} \def \@xorp #1#2{\if #1% \if #2\@false \else \@true \fi \else \if #2\@true \else \@false \fi \fi} % Arithmetic % ---------- \def \@increment #1{\advance #1 by 1\relax}% {\count} \def \@decrement #1{\advance #1 by -1\relax}% {\count} % Options % ------- \@setflag \@authoryear = \@false \@setflag \@blockstyle = \@false \@setflag \@copyrightwanted = \@true \@setflag \@explicitsize = \@false \@setflag \@mathtime = \@false \@setflag \@natbib = \@true \@setflag \@ninepoint = \@true \newcount{\@numheaddepth} \@numheaddepth = 3 \@setflag \@onecolumn = \@false \@setflag \@preprint = \@false \@setflag \@reprint = \@false \@setflag \@tenpoint = \@false \@setflag \@times = \@false % Note that all the dangerous article class options are trapped. \DeclareOption{9pt}{\@setflag \@ninepoint = \@true \@setflag \@explicitsize = \@true} \DeclareOption{10pt}{\PassOptionsToClass{10pt}{article}% \@setflag \@ninepoint = \@false \@setflag \@tenpoint = \@true \@setflag \@explicitsize = \@true} \DeclareOption{11pt}{\PassOptionsToClass{11pt}{article}% \@setflag \@ninepoint = \@false \@setflag \@explicitsize = \@true} \DeclareOption{12pt}{\@unsupportedoption{12pt}} \DeclareOption{a4paper}{\@unsupportedoption{a4paper}} \DeclareOption{a5paper}{\@unsupportedoption{a5paper}} \DeclareOption{authoryear}{\@setflag \@authoryear = \@true} \DeclareOption{b5paper}{\@unsupportedoption{b5paper}} \DeclareOption{blockstyle}{\@setflag \@blockstyle = \@true} \DeclareOption{cm}{\@setflag \@times = \@false} \DeclareOption{computermodern}{\@setflag \@times = \@false} \DeclareOption{executivepaper}{\@unsupportedoption{executivepaper}} \DeclareOption{indentedstyle}{\@setflag \@blockstyle = \@false} \DeclareOption{landscape}{\@unsupportedoption{landscape}} \DeclareOption{legalpaper}{\@unsupportedoption{legalpaper}} \DeclareOption{letterpaper}{\@unsupportedoption{letterpaper}} \DeclareOption{mathtime}{\@setflag \@mathtime = \@true} \DeclareOption{natbib}{\@setflag \@natbib = \@true} \DeclareOption{nonatbib}{\@setflag \@natbib = \@false} \DeclareOption{nocopyrightspace}{\@setflag \@copyrightwanted = \@false} \DeclareOption{notitlepage}{\@unsupportedoption{notitlepage}} \DeclareOption{numberedpars}{\@numheaddepth = 4} \DeclareOption{numbers}{\@setflag \@authoryear = \@false} %%%\DeclareOption{onecolumn}{\@setflag \@onecolumn = \@true} \DeclareOption{preprint}{\@setflag \@preprint = \@true} \DeclareOption{reprint}{\@setflag \@reprint = \@true} \DeclareOption{times}{\@setflag \@times = \@true} \DeclareOption{titlepage}{\@unsupportedoption{titlepage}} \DeclareOption{twocolumn}{\@setflag \@onecolumn = \@false} \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} \ExecuteOptions{9pt,indentedstyle,times} \@setflag \@explicitsize = \@false \ProcessOptions \if \@onecolumn \if \@notp{\@explicitsize}% \@setflag \@ninepoint = \@false \PassOptionsToClass{11pt}{article}% \fi \PassOptionsToClass{twoside,onecolumn}{article} \else \PassOptionsToClass{twoside,twocolumn}{article} \fi \LoadClass{article} \def \@unsupportedoption #1{% \ClassError{proc}{The standard '#1' option is not supported.}} % This can be used with the 'reprint' option to get the final folios. \def \setpagenumber #1{% \setcounter{page}{#1}} \AtEndDocument{\label{sigplanconf@finalpage}} % Utilities % --------- \newcommand{\setvspace}[2]{% #1 = #2 \advance #1 by -1\parskip} % Document Parameters % -------- ---------- % Page: \setlength{\hoffset}{-1in} \setlength{\voffset}{-1in} \setlength{\topmargin}{1in} \setlength{\headheight}{0pt} \setlength{\headsep}{0pt} \if \@onecolumn \setlength{\evensidemargin}{.75in} \setlength{\oddsidemargin}{.75in} \else \setlength{\evensidemargin}{.75in} \setlength{\oddsidemargin}{.75in} \fi % Text area: \newdimen{\standardtextwidth} \setlength{\standardtextwidth}{42pc} \if \@onecolumn \setlength{\textwidth}{40.5pc} \else \setlength{\textwidth}{\standardtextwidth} \fi \setlength{\topskip}{8pt} \setlength{\columnsep}{2pc} \setlength{\textheight}{54.5pc} % Running foot: \setlength{\footskip}{30pt} % Paragraphs: \if \@blockstyle \setlength{\parskip}{5pt plus .1pt minus .5pt} \setlength{\parindent}{0pt} \else \setlength{\parskip}{0pt} \setlength{\parindent}{12pt} \fi \setlength{\lineskip}{.5pt} \setlength{\lineskiplimit}{\lineskip} \frenchspacing \pretolerance = 400 \tolerance = \pretolerance \setlength{\emergencystretch}{5pt} \clubpenalty = 10000 \widowpenalty = 10000 \setlength{\hfuzz}{.5pt} % Standard vertical spaces: \newskip{\standardvspace} \setvspace{\standardvspace}{5pt plus 1pt minus .5pt} % Margin paragraphs: \setlength{\marginparwidth}{36pt} \setlength{\marginparsep}{2pt} \setlength{\marginparpush}{8pt} \setlength{\skip\footins}{8pt plus 3pt minus 1pt} \setlength{\footnotesep}{9pt} \renewcommand{\footnoterule}{% \hrule width .5\columnwidth height .33pt depth 0pt} \renewcommand{\@makefntext}[1]{% \noindent \@makefnmark \hspace{1pt}#1} % Floats: \setcounter{topnumber}{4} \setcounter{bottomnumber}{1} \setcounter{totalnumber}{4} \renewcommand{\fps@figure}{tp} \renewcommand{\fps@table}{tp} \renewcommand{\topfraction}{0.90} \renewcommand{\bottomfraction}{0.30} \renewcommand{\textfraction}{0.10} \renewcommand{\floatpagefraction}{0.75} \setcounter{dbltopnumber}{4} \renewcommand{\dbltopfraction}{\topfraction} \renewcommand{\dblfloatpagefraction}{\floatpagefraction} \setlength{\floatsep}{18pt plus 4pt minus 2pt} \setlength{\textfloatsep}{18pt plus 4pt minus 3pt} \setlength{\intextsep}{10pt plus 4pt minus 3pt} \setlength{\dblfloatsep}{18pt plus 4pt minus 2pt} \setlength{\dbltextfloatsep}{20pt plus 4pt minus 3pt} % Miscellaneous: \errorcontextlines = 5 % Fonts % ----- \if \@times \renewcommand{\rmdefault}{ptm}% \if \@mathtime \usepackage[mtbold,noTS1]{mathtime}% \else %%% \usepackage{mathptm}% \fi \else \relax \fi \if \@ninepoint \renewcommand{\normalsize}{% \@setfontsize{\normalsize}{9pt}{10pt}% \setlength{\abovedisplayskip}{5pt plus 1pt minus .5pt}% \setlength{\belowdisplayskip}{\abovedisplayskip}% \setlength{\abovedisplayshortskip}{3pt plus 1pt minus 2pt}% \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} \renewcommand{\tiny}{\@setfontsize{\tiny}{5pt}{6pt}} \renewcommand{\scriptsize}{\@setfontsize{\scriptsize}{7pt}{8pt}} \renewcommand{\small}{% \@setfontsize{\small}{8pt}{9pt}% \setlength{\abovedisplayskip}{4pt plus 1pt minus 1pt}% \setlength{\belowdisplayskip}{\abovedisplayskip}% \setlength{\abovedisplayshortskip}{2pt plus 1pt}% \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} \renewcommand{\footnotesize}{% \@setfontsize{\footnotesize}{8pt}{9pt}% \setlength{\abovedisplayskip}{4pt plus 1pt minus .5pt}% \setlength{\belowdisplayskip}{\abovedisplayskip}% \setlength{\abovedisplayshortskip}{2pt plus 1pt}% \setlength{\belowdisplayshortskip}{\abovedisplayshortskip}} \renewcommand{\large}{\@setfontsize{\large}{11pt}{13pt}} \renewcommand{\Large}{\@setfontsize{\Large}{14pt}{18pt}} \renewcommand{\LARGE}{\@setfontsize{\LARGE}{18pt}{20pt}} \renewcommand{\huge}{\@setfontsize{\huge}{20pt}{25pt}} \renewcommand{\Huge}{\@setfontsize{\Huge}{25pt}{30pt}} \else\if \@tenpoint \relax \else \relax \fi\fi % Abstract % -------- \renewenvironment{abstract}{% \section*{Abstract}% \normalsize}{% } % Bibliography % ------------ \renewenvironment{thebibliography}[1] {\section*{\refname \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}}% \list{\@biblabel{\@arabic\c@enumiv}}% {\settowidth\labelwidth{\@biblabel{#1}}% \leftmargin\labelwidth \advance\leftmargin\labelsep \@openbib@code \usecounter{enumiv}% \let\p@enumiv\@empty \renewcommand\theenumiv{\@arabic\c@enumiv}}% \bibfont \clubpenalty4000 \@clubpenalty \clubpenalty \widowpenalty4000% \sfcode`\.\@m} {\def\@noitemerr {\@latex@warning{Empty `thebibliography' environment}}% \endlist} \if \@natbib \if \@authoryear \typeout{Using natbib package with 'authoryear' citation style.} \usepackage[authoryear,sort,square]{natbib} \bibpunct{[}{]}{;}{a}{}{,} % Change citation separator to semicolon, % eliminate comma between author and year. \let \cite = \citep \else \typeout{Using natbib package with 'numbers' citation style.} \usepackage[numbers,sort&compress,square]{natbib} \fi \setlength{\bibsep}{3pt plus .5pt minus .25pt} \fi \def \bibfont {\small} % Categories % ---------- \@setflag \@firstcategory = \@true \newcommand{\category}[3]{% \if \@firstcategory \paragraph*{Categories and Subject Descriptors}% \@setflag \@firstcategory = \@false \else \unskip ;\hspace{.75em}% \fi \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}} \def \@category #1#2#3[#4]{% {\let \and = \relax #1 [\textit{#2}]% \if \@emptyargp{#4}% \if \@notp{\@emptyargp{#3}}: #3\fi \else :\space \if \@notp{\@emptyargp{#3}}#3---\fi \textrm{#4}% \fi}} % Copyright Notice % --------- ------ \def \ftype@copyrightbox {8} \def \@toappear {} \def \@permission {} \def \@reprintprice {} \def \@copyrightspace {% \@float{copyrightbox}[b]% \vbox to 1in{% \vfill \parbox[b]{20pc}{% \scriptsize \if \@preprint [Copyright notice will appear here once 'preprint' option is removed.]\par \else \@toappear \fi \if \@reprint \noindent Reprinted from \@conferencename, \@proceedings, \@conferenceinfo, pp.~\number\thepage--\pageref{sigplanconf@finalpage}.\par \fi}}% \end@float} \long\def \toappear #1{% \def \@toappear {#1}} \toappear{% \noindent \@permission \par \vspace{2pt} \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par \noindent Copyright \copyright\ \@copyrightyear\ ACM \@copyrightdata \dots \@reprintprice\par} \newcommand{\permission}[1]{% \gdef \@permission {#1}} \permission{% Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee.} % Here we have some alternate permission statements and copyright lines: \newcommand{\ACMCanadapermission}{% \permission{% Copyright \@copyrightyear\ Association for Computing Machinery. ACM acknowledges that this contribution was authored or co-authored by an affiliate of the National Research Council of Canada (NRC). As such, the Crown in Right of Canada retains an equal interest in the copyright, however granting nonexclusive, royalty-free right to publish or reproduce this article, or to allow others to do so, provided that clear attribution is also given to the authors and the NRC.}} \newcommand{\ACMUSpermission}{% \permission{% Copyright \@copyrightyear\ Association for Computing Machinery. ACM acknowledges that this contribution was authored or co-authored by a contractor or affiliate of the U.S. Government. As such, the Government retains a nonexclusive, royalty-free right to publish or reproduce this article, or to allow others to do so, for Government purposes only.}} \newcommand{\authorpermission}{% \permission{% Copyright is held by the author/owner(s).} \toappear{% \noindent \@permission \par \vspace{2pt} \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par ACM \@copyrightdata.}} \newcommand{\Sunpermission}{% \permission{% Copyright is held by Sun Microsystems, Inc.}% \toappear{% \noindent \@permission \par \vspace{2pt} \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par ACM \@copyrightdata.}} \newcommand{\USpublicpermission}{% \permission{% This paper is authored by an employee(s) of the United States Government and is in the public domain.}% \toappear{% \noindent \@permission \par \vspace{2pt} \noindent \textsl{\@conferencename}\quad \@conferenceinfo \par ACM \@copyrightdata.}} \newcommand{\reprintprice}[1]{% \gdef \@reprintprice {#1}} \reprintprice{\$10.00} % Enunciations % ------------ \def \@begintheorem #1#2{% {name}{number} \trivlist \item[\hskip \labelsep \textsc{#1 #2.}]% \itshape\selectfont \ignorespaces} \def \@opargbegintheorem #1#2#3{% {name}{number}{title} \trivlist \item[% \hskip\labelsep \textsc{#1\ #2}% \if \@notp{\@emptyargp{#3}}\nut (#3).\fi]% \itshape\selectfont \ignorespaces} % Figures % ------- \@setflag \@caprule = \@true \long\def \@makecaption #1#2{% \addvspace{4pt} \if \@caprule \hrule width \hsize height .33pt \vspace{4pt} \fi \setbox \@tempboxa = \hbox{\@setfigurenumber{#1.}\nut #2}% \if \@dimgtrp{\wd\@tempboxa}{\hsize}% \noindent \@setfigurenumber{#1.}\nut #2\par \else \centerline{\box\@tempboxa}% \fi} \newcommand{\nocaptionrule}{% \@setflag \@caprule = \@false} \def \@setfigurenumber #1{% {\rmfamily \bfseries \selectfont #1}} % Hierarchy % --------- \setcounter{secnumdepth}{\@numheaddepth} \newskip{\@sectionaboveskip} \setvspace{\@sectionaboveskip}{10pt plus 3pt minus 2pt} \newskip{\@sectionbelowskip} \if \@blockstyle \setlength{\@sectionbelowskip}{0.1pt}% \else \setlength{\@sectionbelowskip}{4pt}% \fi \renewcommand{\section}{% \@startsection {section}% {1}% {0pt}% {-\@sectionaboveskip}% {\@sectionbelowskip}% {\large \bfseries \raggedright}} \newskip{\@subsectionaboveskip} \setvspace{\@subsectionaboveskip}{8pt plus 2pt minus 2pt} \newskip{\@subsectionbelowskip} \if \@blockstyle \setlength{\@subsectionbelowskip}{0.1pt}% \else \setlength{\@subsectionbelowskip}{4pt}% \fi \renewcommand{\subsection}{% \@startsection% {subsection}% {2}% {0pt}% {-\@subsectionaboveskip}% {\@subsectionbelowskip}% {\normalsize \bfseries \raggedright}} \renewcommand{\subsubsection}{% \@startsection% {subsubsection}% {3}% {0pt}% {-\@subsectionaboveskip} {\@subsectionbelowskip}% {\normalsize \bfseries \raggedright}} \newskip{\@paragraphaboveskip} \setvspace{\@paragraphaboveskip}{6pt plus 2pt minus 2pt} \renewcommand{\paragraph}{% \@startsection% {paragraph}% {4}% {0pt}% {\@paragraphaboveskip} {-1em}% {\normalsize \bfseries \if \@times \itshape \fi}} \renewcommand{\subparagraph}{% \@startsection% {subparagraph}% {4}% {0pt}% {\@paragraphaboveskip} {-1em}% {\normalsize \itshape}} % Standard headings: \newcommand{\acks}{\section*{Acknowledgments}} \newcommand{\keywords}{\paragraph*{Keywords}} \newcommand{\terms}{\paragraph*{General Terms}} % Identification % -------------- \def \@conferencename {} \def \@conferenceinfo {} \def \@copyrightyear {} \def \@copyrightdata {[to be supplied]} \def \@proceedings {[Unknown Proceedings]} \newcommand{\conferenceinfo}[2]{% \gdef \@conferencename {#1}% \gdef \@conferenceinfo {#2}} \newcommand{\copyrightyear}[1]{% \gdef \@copyrightyear {#1}} \let \CopyrightYear = \copyrightyear \newcommand{\copyrightdata}[1]{% \gdef \@copyrightdata {#1}} \let \crdata = \copyrightdata \newcommand{\proceedings}[1]{% \gdef \@proceedings {#1}} % Lists % ----- \setlength{\leftmargini}{13pt} \setlength\leftmarginii{13pt} \setlength\leftmarginiii{13pt} \setlength\leftmarginiv{13pt} \setlength{\labelsep}{3.5pt} \setlength{\topsep}{\standardvspace} \if \@blockstyle \setlength{\itemsep}{1pt} \setlength{\parsep}{3pt} \else \setlength{\itemsep}{1pt} \setlength{\parsep}{3pt} \fi \renewcommand{\labelitemi}{{\small \centeroncapheight{\textbullet}}} \renewcommand{\labelitemii}{\centeroncapheight{\rule{2.5pt}{2.5pt}}} \renewcommand{\labelitemiii}{$-$} \renewcommand{\labelitemiv}{{\Large \textperiodcentered}} \renewcommand{\@listi}{% \leftmargin = \leftmargini \listparindent = 0pt} %%% \itemsep = 1pt %%% \parsep = 3pt} %%% \listparindent = \parindent} \let \@listI = \@listi \renewcommand{\@listii}{% \leftmargin = \leftmarginii \topsep = 1pt \labelwidth = \leftmarginii \advance \labelwidth by -\labelsep \listparindent = \parindent} \renewcommand{\@listiii}{% \leftmargin = \leftmarginiii \labelwidth = \leftmarginiii \advance \labelwidth by -\labelsep \listparindent = \parindent} \renewcommand{\@listiv}{% \leftmargin = \leftmarginiv \labelwidth = \leftmarginiv \advance \labelwidth by -\labelsep \listparindent = \parindent} % Mathematics % ----------- \def \theequation {\arabic{equation}} % Miscellaneous % ------------- \newcommand{\balancecolumns}{% \vfill\eject \global\@colht = \textheight \global\ht\@cclv = \textheight} \newcommand{\nut}{\hspace{.5em}} \newcommand{\softraggedright}{% \let \\ = \@centercr \leftskip = 0pt \rightskip = 0pt plus 10pt} % Program Code % ------- ---- \newcommand{\mono}[1]{% {\@tempdima = \fontdimen2\font \texttt{\spaceskip = 1.1\@tempdima #1}}} % Running Heads and Feet % ------- ----- --- ---- \def \@preprintfooter {} \newcommand{\preprintfooter}[1]{% \gdef \@preprintfooter {#1}} \if \@preprint \def \ps@plain {% \let \@mkboth = \@gobbletwo \let \@evenhead = \@empty \def \@evenfoot {\scriptsize \textit{\@preprintfooter}\hfil \thepage \hfil \textit{\@formatyear}}% \let \@oddhead = \@empty \let \@oddfoot = \@evenfoot} \else\if \@reprint \def \ps@plain {% \let \@mkboth = \@gobbletwo \let \@evenhead = \@empty \def \@evenfoot {\scriptsize \hfil \thepage \hfil}% \let \@oddhead = \@empty \let \@oddfoot = \@evenfoot} \else \let \ps@plain = \ps@empty \let \ps@headings = \ps@empty \let \ps@myheadings = \ps@empty \fi\fi \def \@formatyear {% \number\year/\number\month/\number\day} % Special Characters % ------- ---------- \DeclareRobustCommand{\euro}{% \protect{\rlap{=}}{\sf \kern .1em C}} % Title Page % ----- ---- \@setflag \@addauthorsdone = \@false \def \@titletext {\@latex@error{No title was provided}{}} \def \@subtitletext {} \newcount{\@authorcount} \newcount{\@titlenotecount} \newtoks{\@titlenotetext} \def \@titlebanner {} \renewcommand{\title}[1]{% \gdef \@titletext {#1}} \newcommand{\subtitle}[1]{% \gdef \@subtitletext {#1}} \newcommand{\authorinfo}[3]{% {names}{affiliation}{email/URL} \global\@increment \@authorcount \@withname\gdef {\@authorname\romannumeral\@authorcount}{#1}% \@withname\gdef {\@authoraffil\romannumeral\@authorcount}{#2}% \@withname\gdef {\@authoremail\romannumeral\@authorcount}{#3}} \renewcommand{\author}[1]{% \@latex@error{The \string\author\space command is obsolete; use \string\authorinfo}{}} \newcommand{\titlebanner}[1]{% \gdef \@titlebanner {#1}} \renewcommand{\maketitle}{% \pagestyle{plain}% \if \@onecolumn {\hsize = \standardtextwidth \@maketitle}% \else \twocolumn[\@maketitle]% \fi \@placetitlenotes \if \@copyrightwanted \@copyrightspace \fi} \def \@maketitle {% \begin{center} \@settitlebanner \let \thanks = \titlenote {\leftskip = 0pt plus 0.25\linewidth \rightskip = 0pt plus 0.25 \linewidth \parfillskip = 0pt \spaceskip = .7em \noindent \LARGE \bfseries \@titletext \par} \vskip 6pt \noindent \Large \@subtitletext \par \vskip 12pt \ifcase \@authorcount \@latex@error{No authors were specified for this paper}{}\or \@titleauthors{i}{}{}\or \@titleauthors{i}{ii}{}\or \@titleauthors{i}{ii}{iii}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{viii}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{viii}{ix}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{}\or \@titleauthors{i}{ii}{iii}\@titleauthors{iv}{v}{vi}% \@titleauthors{vii}{viii}{ix}\@titleauthors{x}{xi}{xii}% \else \@latex@error{Cannot handle more than 12 authors}{}% \fi \vspace{1.75pc} \end{center}} \def \@settitlebanner {% \if \@andp{\@preprint}{\@notp{\@emptydefp{\@titlebanner}}}% \vbox to 0pt{% \vskip -32pt \noindent \textbf{\@titlebanner}\par \vss}% \nointerlineskip \fi} \def \@titleauthors #1#2#3{% \if \@andp{\@emptyargp{#2}}{\@emptyargp{#3}}% \noindent \@setauthor{40pc}{#1}{\@false}\par \else\if \@emptyargp{#3}% \noindent \@setauthor{17pc}{#1}{\@false}\hspace{3pc}% \@setauthor{17pc}{#2}{\@false}\par \else \noindent \@setauthor{12.5pc}{#1}{\@false}\hspace{2pc}% \@setauthor{12.5pc}{#2}{\@false}\hspace{2pc}% \@setauthor{12.5pc}{#3}{\@true}\par \relax \fi\fi \vspace{20pt}} \def \@setauthor #1#2#3{% {width}{text}{unused} \vtop{% \def \and {% \hspace{16pt}} \hsize = #1 \normalfont \centering \large \@name{\@authorname#2}\par \vspace{5pt} \normalsize \@name{\@authoraffil#2}\par \vspace{2pt} \textsf{\@name{\@authoremail#2}}\par}} \def \@maybetitlenote #1{% \if \@andp{#1}{\@gtrp{\@authorcount}{3}}% \titlenote{See page~\pageref{@addauthors} for additional authors.}% \fi} \newtoks{\@fnmark} \newcommand{\titlenote}[1]{% \global\@increment \@titlenotecount \ifcase \@titlenotecount \relax \or \@fnmark = {\ast}\or \@fnmark = {\dagger}\or \@fnmark = {\ddagger}\or \@fnmark = {\S}\or \@fnmark = {\P}\or \@fnmark = {\ast\ast}% \fi \,$^{\the\@fnmark}$% \edef \reserved@a {\noexpand\@appendtotext{% \noexpand\@titlefootnote{\the\@fnmark}}}% \reserved@a{#1}} \def \@appendtotext #1#2{% \global\@titlenotetext = \expandafter{\the\@titlenotetext #1{#2}}} \newcount{\@authori} \iffalse \def \additionalauthors {% \if \@gtrp{\@authorcount}{3}% \section{Additional Authors}% \label{@addauthors}% \noindent \@authori = 4 {\let \\ = ,% \loop \textbf{\@name{\@authorname\romannumeral\@authori}}, \@name{\@authoraffil\romannumeral\@authori}, email: \@name{\@authoremail\romannumeral\@authori}.% \@increment \@authori \if \@notp{\@gtrp{\@authori}{\@authorcount}} \repeat}% \par \fi \global\@setflag \@addauthorsdone = \@true} \fi \let \addauthorsection = \additionalauthors \def \@placetitlenotes { \the\@titlenotetext} % Utilities % --------- \newcommand{\centeroncapheight}[1]{% {\setbox\@tempboxa = \hbox{#1}% \@measurecapheight{\@tempdima}% % Calculate ht(CAP) - ht(text) \advance \@tempdima by -\ht\@tempboxa % ------------------ \divide \@tempdima by 2 % 2 \raise \@tempdima \box\@tempboxa}} \newbox{\@measbox} \def \@measurecapheight #1{% {\dimen} \setbox\@measbox = \hbox{ABCDEFGHIJKLMNOPQRSTUVWXYZ}% #1 = \ht\@measbox} \long\def \@titlefootnote #1#2{% \insert\footins{% \reset@font\footnotesize \interlinepenalty\interfootnotelinepenalty \splittopskip\footnotesep \splitmaxdepth \dp\strutbox \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore %%% \protected@edef\@currentlabel{% %%% \csname p@footnote\endcsname\@thefnmark}% \color@begingroup \def \@makefnmark {$^{#1}$}% \@makefntext{% \rule\z@\footnotesep\ignorespaces#2\@finalstrut\strutbox}% \color@endgroup}} % LaTeX Modifications % ----- ------------- \def \@seccntformat #1{% \@name{\the#1}% \@expandaftertwice\@seccntformata \csname the#1\endcsname.\@mark \quad} \def \@seccntformata #1.#2\@mark{% \if \@emptyargp{#2}.\fi} % Revision History % -------- ------- % Date Person Ver. Change % ---- ------ ---- ------ % 2004.09.12 PCA 0.1--5 Preliminary development. % 2004.11.18 PCA 0.5 Start beta testing. % 2004.11.19 PCA 0.6 Obsolete \author and replace with % \authorinfo. % Add 'nocopyrightspace' option. % Compress article opener spacing. % Add 'mathtime' option. % Increase text height by 6 points. % 2004.11.28 PCA 0.7 Add 'cm/computermodern' options. % Change default to Times text. % 2004.12.14 PCA 0.8 Remove use of mathptm.sty; it cannot % coexist with latexsym or amssymb. % 2005.01.20 PCA 0.9 Rename class file to sigplanconf.cls. % 2005.03.05 PCA 0.91 Change default copyright data. % 2005.03.06 PCA 0.92 Add at-signs to some macro names. % 2005.03.07 PCA 0.93 The 'onecolumn' option defaults to '11pt', % and it uses the full type width. % 2005.03.15 PCA 0.94 Add at-signs to more macro names. % Allow margin paragraphs during review. % 2005.03.22 PCA 0.95 Implement \euro. % Remove proof and newdef environments. % 2005.05.06 PCA 1.0 Eliminate 'onecolumn' option. % Change footer to small italic and eliminate % left portion if no \preprintfooter. % Eliminate copyright notice if preprint. % Clean up and shrink copyright box. % 2005.05.30 PCA 1.1 Add alternate permission statements. % 2005.06.29 PCA 1.1 Publish final first edition of guide. % 2005.07.14 PCA 1.2 Add \subparagraph. % Use block paragraphs in lists, and adjust % spacing between items and paragraphs. % 2006.06.22 PCA 1.3 Add 'reprint' option and associated % commands. % 2006.08.24 PCA 1.4 Fix bug in \maketitle case command. % 2007.03.13 PCA 1.5 The title banner only displays with the % 'preprint' option. % 2007.06.06 PCA 1.6 Use \bibfont in \thebibliography. % Add 'natbib' option to load and configure % the natbib package. % 2007.11.20 PCA 1.7 Balance line lengths in centered article % title (thanks to Norman Ramsey). % 2009.01.26 PCA 1.8 Change natbib \bibpunct values. % 2009.03.24 PCA 1.9 Change natbib to use the 'numbers' option. % Change templates to use 'natbib' option. % 2009.09.01 PCA 2.0 Add \reprintprice command (suggested by % Stephen Chong). % 2009.09.08 PCA 2.1 Make 'natbib' the default; add 'nonatbib'. % SB Add 'authoryear' and 'numbers' (default) to % control citation style when using natbib. % Add \bibpunct to change punctuation for % 'authoryear' style. % 2009.09.21 PCA 2.2 Add \softraggedright to the thebibliography % environment. Also add to template so it will % happen with natbib. % 2009.09.30 PCA 2.3 Remove \softraggedright from thebibliography. % Just include in the template. % 2010.05.24 PCA 2.4 Obfuscate author's email address. ga-5-4/python/docs/pgas_11/laplace.png0000644000175000017500000001445412662210372015654 0ustar mbambaPNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ߟ___???/nIDATx *Ee%'PtShh@AV iW4 + Tu!A01ͭ?T59ډiV\V~(HUfɓw>iklx78],Xk%io#hTEߎ>ٔOsI~o)l~(Hs]ZUG[.q k?ɫK1)T4:;%g<)l~(HBXO.)u@aպ[e/\V2voN~$fZ$f۶VDA>:*=1 M-:TlLW.MxØ_`o}ofr&>L'xçt.pK@ެqK@Y F_|X +ٶV1s]8u@hs뀪j7?>%[xT]ӉDvL! b v.Xqظ=#NgP% ]:h֭`[ V71۶Z$ ~vyֺdV?{6.͐^~`b4WuU?eVm[_0ң{1UL.Q6 V']>iŪq U*1۶j(IhQu.[6u+D Vm_eW}0{PG/X961pWL1= ffD|zt@4>֋/Gc`ohGGcబ96|9 Ezբ[G% J: p6 nl?_ycsKF'F? |oSm_2:1FB2I_r?:Oc =9U˳a7S D=IlAԓY :dHlAԓDD=IlAԓd 2 n'lAx 'I0Aё`:K<).JH@$nT[(t ,e ;7BG~Gu{)AXvȸ[|#hX(Y黌<D'{X?`kV)y6J`cC,KOH}b`9Y'KMo͔6`J5V^5YZ 1RP5HOb-uVZ@k&#If;%܀G֓D^a$hꀉ5XzfLD $V]ڍ(F}tH-nnDZIzۼ^ՙ[4XfxQO5{+l  JԓDxlbky$jzM b-G֓d[Omi/hmOW2I~lǣsg(TxetM'Ul_+pkyX$0(IUM =1~E5v | bpifҞ"J`zK_o'ѥ4VF.$d)JN3.*h߇7 ONMqz ɟuDa/cB!I"qHңJfoBzg =B $juTQO5:g"$!IfRz١T gdK_!@ SxzUdH9~yDQO55 @ Qk5x$QQOm~$j6 If$j6 If$j6 If$j6 IG A( o7}#P=>X"ڻAalYK=wtJ@݅s58Jh۸sGGj(3F{Ke_;5*vژyS6Mkmq;:E0;f![.Z)r6ziMoN pXv;:E0m)q>X`u yl;k paJ~4k.a7fֹ_y]|i(6pӏ-rة͛oZ?%@FGކ\7wM١Tl黮>6͖楱q{/y"ZV!7.m/}Qw:vP|o1]W>}棻5z{Osഭ`VT![wKkx}mg}|(-~(.60?-}/ MMy;#!zo oa)`ƶvsEil PO6GpfBmW%E:iNW|?)@{v˒fÀĺȞx"ڴx)NPHG`<xDol}` =Pp 9` ‚H}3\DoNp>2&x3 aePM$fA\HPz .~Y *"SR}_\GGCٷlz(Gm HFH`wdc#!hc)`Gc[W`,@vc6 -~qw".ui;0rB}W. a`1Sy؛M`/hLhR?ϋ Gp1 |4{M~@$e\[k|27Əf/:593.3<*@?J La``P@)>)B]Ԓ23w(0aySD,NDcg5(0ay/s?HT \ ]{_ȝ7nwa*r?/)S%3U5KnN7BBÔiP-*!+ T8ݦf LX_P~PXb09څ L\W~&G_ՏO' kQK{HZ)tߵ<5.E 1\ ޚ&1JxN ay"F"0Nh^p    z z z i~ H`[ן n\$pz7A.8n_(SN F r !v-1l E;G߯Xpt"3c6 ~ //8!lYIENDB`ga-5-4/python/docs/pgas_11/image2_crop.png0000644000175000017500000011243212662210372016435 0ustar mbambaPNG  IHDR׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]|UK zX(6,PQBb,(6]P "T D:^Bz=Kd/W$~7ovvy?=p,t1annnnnn / jܠ6w;-----pZ;7-----b 222 00){vv6*yy9dffBHH*/1899FQMLLPEbzz:c|1994ibdqM6HJ8wo^EȚ 999аaC 9 aT+W\-[2rvvfm|PW э9tk|}|UՎOJO? }孨O>OGrէw%6!r{!ԩ}ysβt:0i $z㟿T`jZxyzym۶t*IZFzJeB{$TH՛ErO?]uww%µr̚)DlNPn d$`УgoHONB (AH99AW 9?jٳg-beΕl&ŗccbrxI׊2߹K78u,10螻DL%y.N(gISH_{k7nÆRYɣ55j/9P#%6l\R֯pϝ9P_껿S?sV.ڟ B6XEKuP4|5  ayT DD;wRgbrtnCA.fsb Xt)̞=[Чi a]$yIJH=4>$ɒz|~gWoha&Au=  zwprDma&} '9HL-/+S!ͽp*]S#;@ߊ.Cvn}':trU22c xwL;Z%b[ZVИV ꫯ^7ydo]3xN}0edc)YjvV,4 IQ~YQ62B:< 2 tl%'RHO.g^!0fwc`ot*$'&%`3aй@MvGfCn8.]ǽx  K` 4n[E #^HUCp`HUGo/CJyx)WIٰH, ݤ :+J`̦({aMG G} p)_c?U(;b :-Y%KS–iШcv$H&Wo*hG2.l}٨¥ 9-̸A>/A~QHSqq1w};wQbrXz%n^[&@t\_5$Op[Su7_h}Rz|r5ņG):fv©:e%"3KK;,~ *VyXY,~:+p*) c]뱋GԲpIpFzѕD$F4h(;$e#wvT]E}8 ZrpwU &>};dPvD]:T9.._39_~1^|i,JTqʱQԭD# H; JÆ: :n~Q( _x/e=p w˪\Ndii@#b칋w[4tD`9~4~=Mm[شxr0W&UXލQc֡cgC~c/7z=Uy3z3w C߰>|FЭ{,x*]BX#"/)vj55`+HS՗d @I(Z.y_^;n#"Y] Ō] ? ]yhM#YC8#M*.rF4YaҨ(أP\ 2Oq0c'By'NOл5ud>ihsj] ~fڵS~2>S,*=m_E C..qiCA^.0n팼Rk K[T cZyBsgH+ c94Y]$S1&W;IL!Zck{Сc䊽PZcN'O0g[n nPzv=d$e ]&NR]c69= r Ӎ`:I|4Iw 6 ZŋЫW/p K?NW %YS W Ӎ 2-*_^I'Ժ}Q9kDaPJΊms}k|۶m0Mk )ئ}T3uU-[2 ̫Fu/~PSd siyUx{pǩJ%^֍G㠹 Xk֔ϝ;{pj\B:3{5S#q %ap*j0fːĪx !hR@>)QAЕ_NzP\]${%y)-g}hC04LV㱂4CRgF1ȉ= y:R/ +?tnhZ_E][t/ZӐz4mp8䜀n];C+,ۗYɘ<}*2c#n1@sjG+?NY*4&83 ?& E~go@Q.];iQi AXHW "S'O ÇteB|h+Imޢ?QW-w5Mcf~@D|&:}55x 0kNseHefLôN;Y07Ly] 6dq>{Lݫ7#xrF敏U{4gOSWᾮ|W5Sƍ6~2R-rz 5fNl9:SsR"-bQ:¢d0J˅X6… d <xg͞+vq@A R#MjlѡxprեL&U.S@ɐp']Ð,R\-h|[Ay=b3n"΂`]k,{nzȐ 10%i:;Ca/m^P܍JJ"سǶw `g[$l2@zvö1zmS"3|L1R T+a>On :oj, Av 6&!9cK`Wa+n)j^r6CeA׭+B@=i+[#:]B=#:4!b>f%پY(cʱg Ha4>켬Zx' '? &_6/Ki4{%\p^U5oj} Uf6bC'* "Aψ0XFSyXG%Wct=.Ԋ] 2 1L!9fh@WǖÓ<@+3TVVVGN&%А29cƾß Qg.1]bYb> /FG oIHfivT;ʐsKN%..$TK)Fx %8P+t.NLJP=q$C~Gm۶Vjt ?Y74 ?& B8 a/p"AjK AC;Qfzt*@bG$5di{k&#MG1sYm L cl%!8W~zƷv9S],)}۵kxOaMO\8!; !!!p .$f'q6J5NۧK0~V)D.t 2X.sN$0BSΤk}"!\t^X,#&"4Bk (\ۼ!"+[F^ޔY (- M6cmѢYjZpsYx!xG`S  C=uHIe7x̢`0:9D'NFhusV~Ie <4-֋6n#e#g#kX >=Sīh [1΀3}yS21 Vt{گ|L?t?Ϣ.Kt^0t9*&bvsv?~U-H^7`/XAA~Iu e2cU稷ܧ"'\Hybo2ێS祵 ' sxoBl*qU^JzVrd9-Uc/B6kFgC7~UThrݜ  y\-i\0-SwSuCt Q)>!-ihi*l:Ыgwx28Sx۴=z KpF@j &7( ^o(WW)i3_dPbI|*R*/1mlHuZgp뭷TelGf'4`F,႙X& +:M"xbZ8F™u%ri34,h,W#wb?08,4sJDܱkbWqC^-O8Rr_wque%Z!zɵ' |zNP wuS ya@JP.O^ C˂=^7S * ; DmQPYħd 2̯)kdϹ p'yFwn,;>JqE!ml@X;@A${8c]nSTJ q?*~_9'.,,C7tj4>YUj2^<2RS3)qXa'%1R׌6ڷ}uϬrt:rj@uL~Zռo^kuY2rRDmW˖-ct=aXA"^ yp1+r_{{DONWmSmlKKMw6܋q}%(۾/ל ~[}A^n5v/آaۆ۷|kJ2,mܔX Ya=D11WavC Ɯ*C6vAKK HCWbi*̚Ms!5|%<]wݥ8pU hϕpFmv#+u{# |_ǤJ'h<cl4Um2SjǟU>ڴYۖmANB|CSvznca0Ï3ܽǑHPW t 6֑o\79>^qf͚0[j D-DBBF{鯰Fm9q]*@wKp$B;a1uRP+(J!=@T<@4@#}CtfJ|[Ω?B)ԗ@鐡%J oG3c AYp 0 UhիLDQ=8F7nDؾ}d d==aw!h\a5J= h4" L3K:G }iɸpB}SOԠh8wz5_RdC>,7W[|$BtkMH q`GM#NE$ʜкu٫W FɨT/JBDx1F"] p3u^4 `pW "fbL~336ѴK ѭD`B.4!)]~y~V]iA:I0?A&K\ 1v`ḧ́ĽB |;r9คD4U \3 <<ܸ(h 'Cu aDRIIICnv[(}wQ1m $ O)Rl}SbBz)& Ez^nMjQ*qDs+TE):B>T Lu:yRzCͤW 5r?i>iy.տX: ?qK|U T3Ua:},SCE0lS\[@y!! T*aYN8]й]|Z IDATL}20\ݬP~ OV mZtfe _#z w *t %'@85KʁUASӋyq"ªSCF.933!ԻoPPI0e40=zUPPq<DRl`=q؉z*_)ŭ ˆaHK:hWCE轊̈́{< avkIWt()ʹ1Hwt@;TW5+)CwacBg`]D@h.^|&cu0IxS%µbh޼>[lUuвEsxe,K50 VWfv ag36j3*_ ܧO_`4 OC#$va?a6بЅBvzd¡0¡9#G0k6`o9|%a=i0PBK@I16As+0U#OK-[Y׸` ٳ'4;PҥK`rc6njV;x>U^Ma,bA1B&vrbI몖ȫ?L~0h3AS^&+)r 5nB/9"=^p3Ӄ oJõpa K гg/1h96ٳ׹>NlLPb qjަm8Sk%b6|G %3)Ƥ2hk*w|ޮGgMyZ`gE-]{EY-*q p p p p p \N5ظ5wjnC.[[[[[wDt/;ɋp8 eB:sV7`+VڍRb͍rYYD{z뭎*m@RP~h:'nk,;v S|ڵkmjRB ^WD](7<Һ]ʫI!ߡ`%5sݚM`ײ}/*5W@кqwWz0{+:ީgc{Ρu-K\0엮BQN"bx$)mڴta6$k ЃGpKؼiCX 7x;lHR%@$A^ Xޯw|p/J@ڻ I'lݺqD(0 9XJ=s"`3 dQ.'q嫗OF[0UV1Sc}òeE.k4aJ`;|>ƎE ;!uipHPEeUe2@jy%AH隋PFM3#_VVk#A]Q4ߓ-a ^(|!tPde9*::-<*(AQ1л ~ 68W1V:(FDJ`k=wAEE9ر|}d;j`\2b KNBڼPQY[ :t[`BtkX/B0)X6.QIZI>Dky"?)/f/D-T/=>RТ r`Eg\(;#f]\2#)WJJ):)i@M,BJgN`s0$ !::zqyy @S2.'f0aX OZTTM1It >-Z"[!?6)Q/ 88XU1gIćU!r(ܳ@"o0;M h,gg@ eli6xelF.`@JY-=z꣐!\xZu|RV@pBߩPRU~gлrEw%S vUi*ߚcZ(ŏ۷oNJȂ^PU@ˮ|S)wsl}Ye!4h\m۶vZ|wΈbq64J>w)EI31jW0L| XPnE]?~w$k׮pJDK,Qb1\#CA iJթt2 0[UzRRRBLZƱE.~/\ p ,Kw}|"lbȣt!U5nXMFU("3p p r͚5LR$=`Rt=zOcD%bLW^^.PVAS˗s!w$h}MM iA ݈#^#M8ѱ[r% >\ht:h 4GόhU"sq?=/7%" g: ^?զFX``jݡ5ٟiR= G'P2^j <=|(( )={nV h0J;KvC K[JԩSa̙Ld]^{C|)lŇ,'xTa^p"MеMRG{\Y?w^m>RgY.4hUmH~d_w(QNN/Yf)SLX6 >RDSLiB4n~$˜ܦO> akg. <%LF%ȗv,d'qa+|ᇒFy_yulqtnsyI'pCNU_Qr SX嗆 CX㦲N@O=ΣAaR ʗf==VeOG]n"UXt1|7{1?5A͛܏ÒB^mMir͉{tlo&@̝3;#qMM2|̜5D9C&\7߬=zfD ʋuC vtp a.i(_ ZAʊ]U*h Pr x5-.h 3Ρw@Xx$$$$WsO>SC  6m&Ys&atStșxehy ^y`8D&GtT0p@Cj&5{.0w9ph[5r g^&/Nw{Q%GTtjB@nh{9%Bz;U|ri@V+*̜5=g.еKW)Wu܁1WMIm20OEi;tV2vF~\xGsgϘ0[@V ?>P8)! {Kؘ(L;mQW5 NHZ kԻ #PhQr(3rr믿ers;z T#\J]BWjh7|qgTu{p9XGf`!>>޸XJ`uѸc䈆,&>pĂ ٧0r tjK`Hɓ]{NSBҴ>عsL: .HrTXT΁ƍt--}['8@?(l& ay%+ZH/Ύ]!?[q qԐx@9@ԫk_T:vIEf0I^̘iK8*&K f7O+ʵ~z .G  w&O"l#r ~ L:$rT?V,_;z;u5a}Wa0n8JtܲHؘOْK?{@Ѵ iݽk!=;'GZWt1~5P-56.F ԁarDy(rӣ#0ǯ+A$-J!;5rOBluQQEd\pl7}ey! 4/A?jDm#>swBdG(3M=(Z Q5v̋>ktC:)/]59>L4YyɮaEw&ਝQGh5vf'@X^z>|A :4OW%P\dSw՗Mׂˠd$ B{, i+ 8Ӯ=/-xQ۠/"">RpԢ*,E[,zp%.h\ j򱤫=ba3O}]y[qoXCm]k]S q p p p p p \Nܸ5wjlB.[[[[[ڴwƵ+ĮEF--pZs8FV9*(c*9٘ύ;[6.ڶcJuWi9uf((TMGꊊU$>"kۈb#|ذaTԦP .wdՖM|u+blmh@`HgJ@Ǵh最J;)ɶܷyi(6'O(ն]礸Db՚K} eU>bŊ/HDw2\,blذ^D <2l6Eqp}1e&+w=N$},ց40絣 KW\Xkp=vS)VXg e(6&au"8.RpǝyßWUh}VD:!*8z?TMڽWT3 WW_"to:m^l̙= O~h79[lTQ8@T7!Zz )N6Efĭ"kF7~zUI%@t۳ `L1Vt厩_CJb#,_4lؐ-3NY=MýW>R<ׁF0cR|WgJ\8"DHz-Ƀ/(qֈXyiHX/ ڸqRD%4d"{4ċ I^KQl;(*pG AtOzAR(%3 /&"*" +)V,e˫$_l4 [G\hliBE=º037a&tr˙y˱!\~5M,JO5𛯿Bp=dQ;Ydg)f!-D6 /rA!0Yx5T},rdu*/ `HW8L/F`#\Dbx~7Bac8H588 bbc$' t5:Zj.u*_eRPdggh1[ qk„'4 /mR*56}Ii88Ϧ+}bVjGAv&{wzNbw1R&?UoI}"PW^Z>uzK[xMebȢѫۨ.J Rtp!$ղYMCO<^PU%/?"DՃK]6It($]De/UI3IrBc(3a?zh%D +[ZC?А&u@/#U+---ʆ3C|Rǥ8eDp#{0xL' 6Y~`Yތ(J|u.kme{¯9#_3 ˢIچiw tݻ73l$ jlb'E1&^-Ac @JN L"f%9{)S/5чO>΄ު& .@I418\μ>)N?@a:/r: Q iBW;WեX9[v:o&aBv:/.Uk޼9 p'5ECB0 5(yMOԈbwS1/_x 6wނ N E~Pcms~LؠY496 k}HNH}krΐr.˫3dOC p'Es p p p p 8O-----PN@wy9ވԨZ9LNJ9u!܎uQ2G@>ƍHZm"![aCE!fUKL_cԋ#2eZ"^UU\[fE**2mkkn333ql,WӢf[[Cu-m>r@Q"5pp{aJr.VRMQHoi*UacacoܸQ%e+̤,HjqIſxl]ser2 1nYeӍu̸ v4**B3%5qUL Vz1{wQPݻa؏|־n?o[h%zPJs6(:rMsA{j۠rjNF}A";wjO n'$Zn-G0AH̚<=.F$jX{ֆsB+AQdu־.D~XZp\폨&84hj֒fD͛= mʵV굓@0m۶JATg s>B>J9_̟7ܧiaHp?x^6ܶ@~-\\1rtd?+D#,$$C[o3h:ʶbPp (I!99??ZbyEH`kDƋ ad"_XgfUj/G -X$ &Eb /ηȥmD{ R_ LXpI.Z0U C!X[\3OH4K(" /Mdffop:Q&΁bu]baHVix ~[gnQ=FaÇ3O>c3 TyYЇ"#[ pR 9rqh}T)ӦBPHWJә(i †׫5vж]{-\u;X4\ouԌaԇصbpV,@;E@Ҵ~ yT}x"(2RɊH'ޮUO1p5IeuQW)zH#ۃ\?f~}[ߣwyd/!=Jw :*T.2 1GLȑϪOPnj}6W?&YLA mbV0;%4{חᇝ>y+G,yC|4aA\[b`aB 11BПLzz^ď<-FHW9^jB#>A9s,xyI8D"nOETu|)[Q#MD/)/(Kbr  ]͞= x /RzzIv%}ѢLzk_Ν/~|[J53 Ԙ,|?1TU @9$$F~QpB4m*@u늍@U^ZiFPbvR}Whp%>ٙ^Ži, (C 92ԦMpqB3љAʶK-Å/@ȎIvl4خ(joѳV$wbn{C e l 2!ҕI^$.gRqv=vXdkr1:biegCA/U֏FLFG坿z5-lb$OhaYʍ:9ٲ" E ΖQ=aEX.)%^nGN wu}xg]!5:Qp[@+el[[[[[[-~8\5nnnnn󚀺Tp\ c -EG$VmQ:D"TċW0H}P mrj*"Ֆ\@X@q2W$rpl@\l,|So2\ `CΑc bN6]Ÿ )tlhp!&,ۏmlLzmM[i WpԳ\+B H8@Ǿ1p=4LJ9KeJ+iyRrssO) NHZA)hLWVptK~ifN,:1;/ .Х"}Lww- }&ZjHv2{ l'*Y'TJq(nI8L+6[Ͽ>9;`[>{CA۶mؘ4U7|75|U,Ξ[ti ̙ ##PEP1> xem?7|3kClL(/~G=qkd-PZ,FQ9k"kmbUO`?6ر#Kia_|¨QySॗ^Uh MM5d*%[&88pc$ݽu&@-C)-D*d0Lvd0S1kF+|8ZԕUV}Wצ D%%`5h ࿃iJw% k9{74pTN p@v)@ZqF[l 6(! /"֯(15w eG\AIJ6:#(.6}꤯\Kh /!(a捲aqM&"azIWZ$K:@ CO@QzԓXx!'6r6XsYe U^Tue/t:#*Jk436[͎s­A$_$G}|͟ m۴U͝{Re!F =..Y&Cr9ՈP&?SGAJt 6;wVu˖-|~BK= T:]%3u+^ %oYïy 1L<;udvp%HiSrUʗW75.q,;F8n [k+!#$Tj~ͅGIv"۸H`d AbOiG]߇]|Zl)tFf~{UIsQT͊1sA *li- clk@8$߾qxzZ2UNxxQUSkx Ͼ  !mJnt-JW/eMF܊*--Nw BдioY3W2^PL__z05O^!CoƤ+5;( <~4OjKF`/s~C*]!W>'R<a[0Yeà&z.&"U';}D7tj[jdYcSd?* jtCCG E~j#TO>-"-Yt~I Y+ɤR4,-:Gkcbi9(x4n8A橐{ ƭa$zxBŸN>iahIRDM0* QdVGm9Rtc%H]HW^yEa3f*kslռ/4!fuN +|+Ce e]n<\8pM/n 5=%>Qq@nVea>D9{CYSYa-;ЏK;M֢|V=8bb24 7%#g9h MJ->m5c$ӎՠ0?,w7zPhez *Ia1(kr-$4T9mdHY''Xes 8hJ$Ў.ʯ[p[poT]R+rnڴ@I(M=oqm:T#-MNTu(_逢;ceYW*~ݞ2A@ A . -H7ߠuyp^[N~ (?p ]^ԞnK ԭ\ A3w~f!'p ԧ2wuk[%w.(1EJxڴwbA#>uAm^GƠ ~f;a_ =ƍjPx p ԧ*8P"C5z`mFPąwb˧j\H0ʭe 7cTruzQ A[,+@ oƥru)$Rc[,u/Ứʦyʠ;6wŻ^7 4[>- T$rVkѤ=k*e dGX]zǔ` odP$46c [>,G`σ{hy]8!ks ˋr  ՐiKB)"]|A-/D7u{.>]0?9GFp Y }`(տ12g{Ҵ}?(˴MK=ln[ ~8F?}JGOA|P^i8kpUQPi/q&Ϭg&j8 ,{&P=̅ WÇ'4HMM>TL WDuPr‡Em(c* ~J 02h!{Yn2$ʧ c I gdE Qx_ ;^1B<(O!%q (Z@vR6N@SғO>)@.]ڬE N,F#@XjE°{&vI~PbѰC»L#x5G#~xm},Y!Blz6*'EBa(/ Jvk!8oV8{ ('B5΢)dRD(}yY(:kOG㐏}Y H:BG^S'ʢQuc Jɢ]ZhS:H.>16w:8EpHIImbcw^Weɵ lc!_; X+V#d RW}@kswpQZe,ΏQ1gWN , mm%qp VWzߓ{j*:$j'ЊC8ᘹ*"iz $xE;!?W(8./@#ú`8+=6۹6+!u (^Q"@opöAZt+.:?Pm$ ~v,Dab`HkÇ [-=P%pi2v|S\OI!rc i>]4~-P[31L5k<{aa_D \~A;p'MI?܍C ?3)l|ݐ̩,@=!"T >4^h6zᜂAEnAX`0?,NCDa`\Xpa $mۢƗ@][08__4oxVs'Gx޴uhtmo~y_!?,@ c)H?2w~*&a/@Z@ 5`yC IDATJLwm)ihq0;ċ P{W0C٩0zm~-P0XߎH_o F /P %lhا:6A;4p #E>mJҸ`Gx! GA@4p Կ{<#":NMSQc]'] ӣ%34'ڃX:?,@aM)9uzi7⥇Jt p (p hjrL =-gR|;?qTgWKd5ےe7 ĸBxI $ $$S10`BsȽIlْ{_w]jw5;V{vwsn3wf%Q{}0@]; פs`KAߥ y9}wl_$x6UʾO*KIW~W=U{QVz,EXA zO{d@2  Hl @ɀd@2  S3e%ɀd@2 m@2 (sAbkFرf͚% =%IBBB)cǎɓXb644@hh6''w:Z[[ l)T>"##NuUI||<~{vp}޽p jj̿FnkkӧOĉj~@KK&ƾsp㍝Ufg!$iLeggATd XuL G2}v FkW^YI74􄲚&t)!4L6<.^Aq!2*Z͜˶9`@L Ƣfh,6%''s$@U:(//K T+xEv⊊xQD99`8peu˗C=P?xc?]pݴXG9}OaZZR /_4IdgN3ɓh`x$Ì#Vmٳׄ]: 2vsP]SgBPpϖ*Ó #^kk  Cg` mQ9.jk x FƋxV^ Ӧ1N{ ?> Ja8i_=rX yEZp^Ǣ6nNY۹~,& n1V,Mݻvi1b]E[saA8), |>n6\,>)+Cg< Z@uP^O4U-Hf mA! "Fݢ]* fN߲s%KFG2ժw-Ɠof R'䓏ņ満Up 7~-8Hj% :Λ4(++_O`۶Ï]hî'u/c~Ƀk᝷m/b^0{Ҿ ?y}vS;p?Z[am@P Jpv e#܄X[A(8in-Z?`@,:];`$Bg0+r`Oqd?jzѢEpb.<4q?_e튰4}_86sq8/{c\~~WX\+_^|g &%?^mټ "#] >VݎWa Ojv"2(>x}ue a'R\·j~o!Rmi?ܸ b0JRg>OW ٛQAG@+T5Nj_5n|>|{ǹgukKaiʒ"Xj`!jmjjISgMm5?vƎB3>f(x?8\엿 vxq``saM5Y" . w2,/7!mo, Fߊb6 }^@(GX 30K\ {hSHZA=zj"GX ֬^%Ь`q, hgܺGڀ(- =_TIO_@(O9-.yd-rQ q`eKAᕽ 2]$M] r> 1,Mտrǖ9/EG;hPYY O0Z\= \ZZ 2̛f^]voj0pow`ِW ̃^3sݺuds^pDuW/q쪧 8h1c2 Mҭp3mx:D8+6'O@axEp=ݏ?t a.vs<ܻ?x *n3lHpjX| Z "i2^`Ќ,h*8;`Zpڽ<8ƎP+i6)<(X 8 cpVx~V>_kF,vۯ sE'B}쿃)hDV| k~ {tKWx[VSNA+z?mmVvOAcǎvKB 1b$#?46]Dj:el7jɴbĤ$, B6u@v#3=ڹ +Jrkjm Ǐ}h Gӟ>Ju`o8瞜qȮ;چ ^ Kӿ-?}vhbϗc؏SRRg ] K8S:'_vX89e0C>gٲe82 9mE͂Qr9iKIg #Gj!C4Q~$jO 7A%x ٻƒӠ.(u{O7u{nA kN@qhl%% U*X핖s4`o( ^Y~ ԴoN&ul]-s/;l餮c),x f:fFi '^:fSV@Y *!VnLԻP:NCM/GL|ֱ#ӵ/؁?;yL%6Oͧ%a.({…`t\5̛_>cq%eJQ,xkBxg9řd{̔ڏ5i>!,S;3%2䐡)S3"""`>8>hʑh% ZDHEo)B18 x%o<^~ R T 5VkTNKA\|W 1]YJP"{,}RЂaJHHu2/߷=4xP=Ј]z#ilIq> xRKN~S?k^K=qwdeӬXL2 vd5$ H$ɀA bYɀd@2  x;2I$ɀd d`Ҭd@2['}|=dWd ߮ ;϶:ꀊoCZ-.̬L]c@O5;}T4,hZg8iPRZ롶 *y~"U?XfC8olxZݻwQ_t7MGv>b?+='`X*=]BzZv۝=edل>+pq%2ݮTu# Ц[;wlg=Pߞ ÚcXZO!I}!;VLFOk\_rP9B"Q=HeK:RpuUU EM&̰Nvʈ W"Ilk95 E~n?xi.~REx,MG"XrT IDD1V%Z0]5 imB!\ S"vi+eq CC,eEc;[P @0%݂ |?G$K^XxJ%H+r\o^iUUl.,)m,9I2;;SH1gg7@Zz:.Q,2 ?3<>;K4ba)6] zU.F vv<jXڣ m5${˸y 8b@*nP>T|r򱭮H p&\\NholdWK˰uj_ ;is7Y:-F5-j"#Nzdt0a__;4+}PUWU3\hXmkV\[!aiQy MsRTФJ,[VuHҵ-_LK[OYBHYyS4hͮkȊO(;Q KۨElcII(nۂH+dAvmj5M8]'ܹ|RV>c3L `Ok\0K[G'PS?nW}Ω-UxH,U7Y}P/ΰmcb}WueKIʹ:8 v2C5ȰRX g?y}ZBX:Nq/w@TcMq!1LUM`8WY]5"bJŸr_NNd{wqL:}s;Lrb4PZzʔi NE 4$=O_!B?XS3d7!8MoRGT?. ?%c2.JTH6xŻAM4.;g3_E)`jO(/>_î', >U?Ar;%U,7-(i8{^oeSSSaΛ-؇:ՀO~Q{\Ђ]Kx'c;]P':i}^# up=~nH['Ry)n*dTBba.D4&J%HI\cAk:"XZ;СBXoHMMZ;4쓇 Z;:R,%3L.&.B$1qYܵQɀd@2  QdG+N- H$2 2( H$@e@}ے̀c}}HW{zQ@oջ =I_E-:ېsW{dzfE=S}a ]X<*VSUk֬= X= Chlljj[[پ&tصKvPktm ]ʽ|N ng]?]Өg}|ѤK z,.tH҆OV.]}@+@Ӣd̠6| u͛7O.t.ć^PqBbLټƪqwbIxc!0(" \MJ4w!l`&t5K[}R Ip3>NQ0"(nt>H- !1UjpdF++ ! HzhXkkpZ$J"X*!W$+ :`"^,+:쎈>],%.HAmc*)uIRS%DT4#(ƨ-ڥ(MЭ):إt=}nӱQ.P6|LC@R dlO> /@~yaGGM(5焰,TJ)Mg;%Bh΢QO`!"OP*(ȇ)Xu=Mt;+dO$qJrI K 36Φ԰40ֆUҌ+&fcaYxڀЊڧ(QN3PP6`rnRK>xR>|Fk#L%VE &`+cG}6ÂlvwڧOtƒTvitnD/a) ,7)J@7$ `$T3QX u0@D% e9~\.4 MoPT,EPz܌&, ֢X?tmx-H\,럓&NnJw_tHjD?.mv"w$5 "" 7U}O{EM6ys +-462Q6xss+.,e²?\=kX{Z&pui-"Gzێ? ίpj[= yL)K@ >,Xi@@6. yy貍쳃e ^rW=eW6CH6xGk 5uë鼍dI~BCf/\ԟnU }@%+vNj'̃J$d@>XHɀd@2 a@",Id@2  H|`"I$ɀd@+Gtڡîhl8슁vN#SÝ6+ꑞꓲ:dqsuU _ !zAuQWWLoeY,ضmcQ_v`TaWlFUn-A%rJv=ThYSAH !c0V…7TVEĮS܌*kܳg=˸yEqcb#7m8Ir+xa=Pd P qe1ph'pڗ[7CxD8@G2~MyQ":).ZH]Il:'`ta[-1ŭڐ(:}@T aNœNN j:ҌTh`M7:;`ez)xi\?Ϧ>&$l, miu.S}\\.e1vFW9Q+S@nmTJ3fvW @qQ\{.H۝a-]{_w7/Avi(.Ifȑ(*4vlkll;=g.>u.? Η~DIfIDjocJIa]4dz'+3JۢD~Ɓ5(5h$L9$^ |yQ5 $/wNJmR' 5ŕ\,V5(, uC5mՊoCc ҏ%:G S'r "= xK$_q=/T@](Wl\̹g=Pn>\ N#Fr[|a!plؾ}wOvkkka+g?%>AV5sq͍|Yon*@IDATW>S%PF=ʷN> 0o|,.d Կ8N |o!RRRp͓``l,`6LXhPXHH{uQvRqFM_j92 Bv)#/9Hl> 2 﫝G_ 66`؃` \mz^kΙT>aU,e\E_9UTToY%R $)Q,lC[r&1U.* zTي跐ϭ8c˗rvk%2Em"Xʘ*G[[+4 ٦-)G JK!,</=sK_8q222 88[M&%uIJgKQfEf&.RhK>\&QObMV\ô1TWt` 3p`V (O!,z@Q(%h>ǎm[gŎDhʉԷ7ۿ &7_:v:Sjjj2m'#R:MvDx'Lq 7IaPow,̼F݂+p`^}b.6|\C._ \ AA\6BCwAŚrW> v&[\NN^ |91,Y;a$m"&))&OR$@Bӯ:&L?YDI۸؊2'rxpגw}{ϝKށo?uӌÇ64$ Vvl}.F|Y^<%ɀd@2 qd %ɀd@2 ;Az! H$g@=NP2  H$ d=惕^WO4}.vkmқXΩBvз^L~ljՁlGbQ|rÆ S'ƴN9z׎Wj2RWNL=ǀ23+mO'C=fkطٷί_%t]^D*YΞYf~tX 8_ Y#B+ ,&Fa}ݤNN@Ӣn#|v =˸t@o`%ązΑ~Wmx:Nό.Oy *ٻT:, 0d1A?I޲W lWP+VUa8#bAibu q8-,%Xʘղ?h>OgXEK8ķ0/a$ER!j,hm"~ոr`ee.Ć\t &;(>[J-p)"BnBy-.*DzO:Ir%Ԃm#@ ~Ip͠,+Hpӧל۬׸X}~+udv=ԃC_VׅwP10eʦjJߦ0(‰>-77k uxeοغɦIu'Hd :ڹz#,I Xv] 8azgMP?&42/~$s[ M[C<Pc/؉wU^-_#iC OA9{qX+*΢̖Ta_{XV⣃Xyer{C5Ƒ7"}{wkb={HC 8!1E b$MSB|'s!!N)!,_|IK\))gMk:2Ur,cTmj*E0PRvq>@ۖbX::\r?BZR/%"<[}lLL [<̏$9 G AdKe=@R{x1G[rX5" FYgD{4  Q lǬ)Z[0 EG4e`e L" k>,s %:d0XXt;jz2ȾSYzB/펅zrgC>^!`i-3gN a)0~$:g2Cs(P\ @BP~?C9 P&\Cˮ: >bΦ] 1 R"cٳ!-m8\*/C0}L.H!Y>Q\\HRS WWWr}5tYlymzVV|zX-o%ōԑrd@2  5vؖJ$ɀdAUtE2  H$=ɀ zmd@2  HxQeHW$ɀd@2Г 'ٖyydߣ_58:14_5Ӊ @HH466Ά^Ag\ ʁU" ʀ*:NiȃOa-̙3GEH4(|ݻ_Nd ΕDO]vq A ,,(^,G1" z" +Mve=EIX7r0'$^H xZ[[mJpUUSd,KR"X2'e@w %4y M o!TwZd 2 ]0q+2P9 gW <t7Ic"Σ ^jDlueP-))fKzeIBK>x~t1it (?:ifpw@X$_6DĂ#K6U@@pkӖl%2jq1 $,+T_WP,o3[S>Ҏ!E-I/kFZe2c짍%35ІkUPUq!glEM!LMJJ(tXB@_PP`jraaalGEh۴]:8'Nke_[$ ? R¤J4cD} ܙ3g࣏>ʊI4vL]jbzZ<)#b ˗TqDdXTOg7COc'򙕕#G[-; kOd:}P_\H$@ ~C$ɀd@2 0ܱHɀd@2  2eɀd@2 udU  H$@0 ]* H$^g@^ɀd@2  HW0PIENDB`ga-5-4/python/docs/pgas_11/image4b_crop.eps0000644000175000017500000140214012662210372016603 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image4b_crop.eps) %%CreationDate: (2011-07-20T14:56:57-07:00) %%BoundingBox: 0 0 441 145 %%HiResBoundingBox: 0 0 440.945 145 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 441 145 userdict begin DisplayImage 0 0 440.945 144.982 12 441 145 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDCDCE8E8E8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 969696DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF6F6F6B5B5B5B4B4B4CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFB4B4B4B5B5B5F4F4F4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D1B4B4B4B4B4B4F4F4F4FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5B4B4B4B4B4B4CFCFCF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292929616161FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1C1000000 DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFC6C6C69292927E7E7EA5A5A5F7F7F7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F6F6F6AAAAAA7F7F7F919191D6D6D6FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB0B0B0000000363636767676FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADAD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE8F8F8F E6E6E6FFFFFFFFFFFFFFFFFF7C7C7C383838000000A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF303030191919393939D9D9D9FFFFFFFFFFFF FFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFDFDFDF3939391B1B1B282828FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292929616161FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF535353333333FFFFFF FFFFFFFFFFFFF7F7F74D4D4D0202023030304A4A4A1A1A1AACACACFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFDDDDDD181818 0A0A0A292929080808040404A2A2A2FFFFFFFFFFFFFFFFFF282828767676FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC8D8D8D0A0A0A000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFD8D8D8 3C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC8D8D8D0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 8D8D8D0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292929616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F30808088B8B8BFFFFFFFFFFFF FFFFFF686868121212C9C9C9FFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFFD1D1D1898989F4F4F4 FFFFFFE1E1E1151515141414FFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5 090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B5B5B5090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D2323237B7B7B000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFB5B5B5090909686868 343434393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3D3D3D2323237B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D232323 7B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC6C6C68B8B8B858585AEAEAEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3C3C3C3FAFAFAB0B0B0888888BFBFBFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C38A8A8AA7A7A7F6F6F6292929616161FFFFFFFFFFFFFFFFFFC6C6C68B8B8B858585 AEAEAEFCFCFCFFFFFFFFFFFFF4F4F49D9D9DF4F4F4B5B5B5808080D9D9D9F4F4F49D9D9DF4F4F4 B5B5B5808080D9D9D9FFFFFFECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFC0C0C0B1B1B1 FFFFFFFFFFFFFFFFFFFFFFFFC7C7C7B2B2B2FFFFFFAEAEAE000000DCDCDCFFFFFFFFFFFFE9E9E9 0606068C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5C5C5C000000EDEDEDFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF585858343434FBFBFBA5A5A5858585BABABAFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFFFFFFFADADAD 000000F3F3F3FFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5CDCDCD FFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5 CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8C3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF9191918A8A8A D0D0D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FBFBFBA5A5A5858585BABABA FEFEFEFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9A9A9AF8F8F8C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8C3C3C3 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5C5C5C0B0B0B454545484848050505474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF8F8F89D9D9D9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9E9E9EFBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5858584444443E3E3E181818272727000000878787FFFFFFFFFFFFFFFFFF777777 0000002A2A2A151515303030191919616161FFFFFFFFFFFF5C5C5C0B0B0B454545484848050505 474747FFFFFFFFFFFFD8D8D80000006C6C6C0505051A1A1A8B8B8BD8D8D80000006C6C6C050505 1A1A1A8B8B8BD1D1D10B0B0B2A2A2A505050242424060606C0C0C0FFFFFF7F7F7F030303E7E7E7 FFFFFFFFFFFFFFFFFF242424585858FFFFFF787878030303FCFCFCFFFFFFFFFFFFAAAAAA000000 E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4A4A4A0A0A0AFCFCFCFFFFFFFFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5858582424243434342323232B2B2B000000636363FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC8C8C89B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9BCCCCCCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD1D1D10B0B0B2A2A2A505050242424060606C0C0C0FFFFFFFFFFFFADADAD000000 F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF BCBCBC0000009B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFBCBCBC0000009B9B9BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080020202313131343434020202 A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFF8F8F89D9D9D9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9E9E9E FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858582424243434342323232B2B2B000000636363 FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFBCBCBC0000009B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D 1B1B1BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB5B5B5F1F1F1FFFFFFFFFFFFA1A1A1000000D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E7E7E72828282626262626262626262626262626262A2A2AEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858000000727272FCFCFCFEFEFE5252520D0D0DFBFBFBFFFFFFD4D4D4010101808080 FFFFFFFCFCFC6E6E6E000000606060FFFFFFFFFFFFB5B5B5F1F1F1FFFFFFFFFFFFA1A1A1000000 D3D3D3FFFFFFD8D8D8000000101010D1D1D1FFFFFFFBFBFBD8D8D8000000101010D1D1D1FFFFFF FBFBFBE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626535353FFFFFFDDDDDD010101909090FFFFFF FFFFFFCCCCCC000000B4B4B4FFFFFF4C4C4C1C1C1CFFFFFFFFFFFFFFFFFF8282820202027C7C7C 2929290C0C0C2A2A2A818181FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5070707 5C5C5CFFFFFFFFFFFFFFFFFFFFFFFF101010747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5858580000007A7A7AFEFEFEFFFFFF7C7C7C000000CBCBCBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7C7C7C262626262626262626262626262626262626868686FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626535353FFFFFFFFFFFFADADAD000000F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFC4C4C4 0F0F0FA6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFC4C4C40F0F0FA6A6A6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE020202858585FFFFFFFFFFFFC9C9C9BDBDBD FFFFFFFFFFFFFFFFFFFFFFFFE7E7E72828282626262626262626262626262626262A2A2AEFEFEF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580000007A7A7AFEFEFEFFFFFF7C7C7C000000CBCBCB FFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFC4C4C40F0F0FA6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C4C4C2C2C2C FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5858582C2C2CFFFFFFFFFFFFFFFFFFA4A4A4000000E3E3E3FFFFFF838383060606F2F2F2FFFFFF FFFFFFFFFFFF232323606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B5B5B5 FFFFFFD8D8D8000000979797FFFFFFFFFFFFFFFFFFD8D8D8000000979797FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFF3E3E3E353535FFFFFFFFFFFF 757575151515FBFBFBFFFFFF393939383838FFFFFFFFFFFFFFFFFF747474000000525252ABABAB BDBDBD767676000000878787FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5353530D0D0DE2E2E2 FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5858582C2C2CFFFFFFFFFFFFFFFFFFEBEBEB000000828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFFADADAD000000F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFAF6F6F6F6F6F6F6F6F6FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6F6F6F6F6F6F6 F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA 000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E000000E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5858582C2C2CFFFFFFFFFFFFFFFFFFEBEBEB000000828282FFFFFF FFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6F6F6F6F6F6F6F9F9F9FFFFFFFFFFFF FFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFEF6F6F6F6F6F6F6F6F6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 8888884141412828281C1C1C000000B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFFFFFFFFB4B4B4000000D7D7D7FFFFFF6565651F1F1FFFFFFFFFFFFFFFFFFF FFFFFF292929616161FFFFFFFFFFFFF1F1F18888884141412828281C1C1C000000B2B2B2FFFFFF D8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFFFFFFF C2C2C25B5B5B3434342222220C0C0C323232FFFFFFFFFFFF9D9D9D000000D9D9D9FEFEFE1F1F1F 6D6D6DFFFFFFFFFFFF303030444444FFFFFFFFFFFFFFFFFF797979010101FBFBFBFFFFFFFFFFFF FFFFFF393939313131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858585020202ADADADFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFFFFFFFFFFFFFF0F0F0F696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C2C2C25B5B5B3434342222220C0C0C323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF282828000000000000000000A2A2A2FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8A8A8000000000000000000222222 FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000 A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5A5A5A1C1C1CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF0F0F0F696969FFFFFFFFFFFF 2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8A8A8000000000000000000222222FFFFFFFFFFFFFFFFFF FFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8A8A8 000000000000000000222222FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B3B3B252525 A9A9A9CDCDCDB5B5B5000000B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606040404 040404040404040404040404070707ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFFFFFFFFB4B4B4000000D8D8D8FFFFFF676767181818FFFFFFFFFFFFFFFFFFFFFFFF 292929616161FFFFFFFFFFFF3B3B3B252525A9A9A9CDCDCDB5B5B5000000B2B2B2FFFFFFD8D8D8 000000B4B4B4FFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFB8B8B8030303 6F6F6FC2C2C2D2D2D24C4C4C323232FFFFFFFFFFFFF2F2F20A0A0A7F7F7FC6C6C6000000C9C9C9 FFFFFFFFFFFF3E3E3E292929FFFFFFFFFFFFFFFFFF8D8D8D000000E9E9E9FFFFFFFFFFFFFFFFFF 595959212121FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F010101929292FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F1F1F4B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFFFFFFFFFFFFFF080808787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767040404 040404040404040404040404040404727272FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8B8B8030303 6F6F6FC2C2C2D2D2D24C4C4C323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E1E1E1D4D4D4D4D4D4D4D4D4F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6D4D4D4D4D4D4D4D4D4E0E0E0FFFFFF FFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5D5D5D202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE3E3E3060606040404040404040404040404040404070707ECECECFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF080808787878FFFFFFFFFFFF2D2D2D 737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6D4D4D4D4D4D4D4D4D4E0E0E0FFFFFFFFFFFFFFFFFFFFFFFF C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6D4D4D4 D4D4D4D4D4D4E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1000000A2A2A2FFFFFF FFFFFFD9D9D9000000B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCBFBFBFBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDC1C1C1FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFFFFFFFB4B4B4000000D8D8D8FFFFFF8A8A8A000000E0E0E0FFFFFFFFFFFFE9E9E9131313 616161FFFFFFE1E1E1000000A2A2A2FFFFFFFFFFFFD9D9D9000000B2B2B2FFFFFFD8D8D8000000 B4B4B4FFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFF616161222222FFFFFF FFFFFFFFFFFF595959323232FFFFFFFFFFFFFFFFFF5C5C5C2424246E6E6E262626FFFFFFFFFFFF FFFFFF5858580D0D0DFFFFFFFFFFFFFFFFFFBDBDBD000000AAAAAAFFFFFFFFFFFFFFFFFF2A2A2A 494949FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFACACAC030303818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFDFD050505656565FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858581B1B1BEDEDED FFFFFFFFFFFFCBCBCB000000A0A0A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDE0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF616161222222FFFFFF FFFFFFFFFFFF595959323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF818181030303E4E4E4FFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCBFBFBFBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDC1C1C1FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5858581B1B1BEDEDEDFFFFFFFFFFFFCBCBCB000000A0A0A0FFFFFFFFFFFF2D2D2D737373 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2040404505050EBEBEBD3D3D3 353535000000B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF FFFFFFB4B4B4000000D8D8D8FFFFFFE4E4E4040404464646D4D4D4C3C3C32A2A2A0B0B0B606060 FFFFFFF2F2F2040404505050EBEBEBD3D3D3353535000000B2B2B2FFFFFFD8D8D8000000B4B4B4 FFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFF777777020202BCBCBCF1F1F1 919191040404323232FFFFFFFFFFFFFFFFFFBCBCBC000000090909828282FFFFFFFFFFFFFFFFFF 888888000000F0F0F0FFFFFFFFFFFFFCFCFC212121252525C8C8C8DFDFDF717171000000BCBCBC FFFFFFFFFFFF303030595959FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACA FEFEFEFFFFFFC6C6C60606063B3B3BB7B7B7B7B7B7B7B7B7B7B7B7DCDCDCFFFFFFFFFFFFE6E6E6 000000959595FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580404042E2E2EBABABA CBCBCB313131141414F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777020202BCBCBCF1F1F1 919191040404323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFF0F0F0C9C9C9 C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFC6C6C6141414A9A9A9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFF FFFFFF303030595959FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFE FFFFFFC6C6C6141414A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5 C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE2E2E2070707424242CECECED1D1D16666667D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5858580404042E2E2EBABABACBCBCB313131141414F5F5F5FFFFFFFFFFFF2D2D2D737373FFFFFF FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFC6C6C6141414 A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5C9C9C9999999000000 929292C9C9C9E4E4E4FFFFFFFFFFFF303030595959FFFFFFFFFFFFF0F0F0C9C9C9C9C9C9343434 2D2D2DC9C9C9CACACAFEFEFEFFFFFFFFFFFF525252323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD5D5D5C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFFFFFFFF 7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B9B9B0B0B0B0000000F0F0F969696 111111B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFFFFFFF B8B8B8000000DBDBDBFFFFFFFFFFFFAFAFAF141414000000141414979797575757636363FFFFFF FFFFFF9B9B9B0B0B0B0000000F0F0F969696111111B5B5B5FFFFFFDBDBDB000000B7B7B7FFFFFF FFFFFFFFFFFFDBDBDB000000B7B7B7FFFFFFFFFFFFFFFFFFECECEC3A3A3A000000020202414141 747474353535FFFFFFFFFFFFFFFFFFFDFDFD212121000000DEDEDEFFFFFFFFFFFFFFFFFFC5C5C5 000000B7B7B7FFFFFFFFFFFFFFFFFFD1D1D12C2C2C0000000000001D1D1DAAAAAAFFFFFFFFFFFF FFFFFF111111555555FFFFFFFFFFFF9F9F9F000000000000000000000000000000010101E5E5E5 FFFFFF8F8F8F0000000000000000000000000000000000006D6D6DFFFFFFFFFFFFADADAD000000 D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B5E5E5E6E6E6E030303000000 232323CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC3A3A3A000000020202414141 747474353535FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFF9F9F9F000000000000 000000000000000000010101E5E5E5FFFFFFBABABA000000999999FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFFFFFFFF 111111555555FFFFFFFFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFF BABABA000000999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F000000 000000000000000000000000666666FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB5B5B51A1A1A000000000000363636D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B 5E5E5E6E6E6E030303000000232323CBCBCBFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFF FFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFFBABABA000000999999 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F000000000000000000000000 000000666666FFFFFFFFFFFF111111555555FFFFFFFFFFFF9F9F9F000000000000000000000000 000000010101E5E5E5FFFFFFFFFFFF3A3A3A191919FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F1F1F000000000000000000000000000000666666FFFFFFFFFFFFFFFFFF7A7A7A 262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9E0E0E0FDFDFDFFFFFFF8F8F8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4FEFEFEFFFFFFFBFBFBFCFCFCFFFFFFFFFFFF FFFFFFF9F9F9E0E0E0FDFDFDFFFFFFF8F8F8FFFFFFFFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFE FAFAFAFFFFFFFFFFFFFFFFFFFFFFFF3C3C3C3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE191919 616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFC4C4C4 020202C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFCFFFFFFEEEEEEE6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFE FAFAFAFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C4020202 C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE5E5E5E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFC FFFFFFEEEEEEE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC4C4C4020202C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAFAFAF8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD7D7D7000000989898FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B111111 FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFADADAD000000B6B6B6D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6FFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD7D7D7BBBBBB000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D565656BFBFBFF6F6F6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7BFBFBF5B5B5B262626FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF737373070707EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E80A0A0ABBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B10F0F0FEFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFCDCDCD3131313030306F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF757575303030303030C8C8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767303030303030D7D7D7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7 7E7E7EF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD303030303030616161FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE4E4E4E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECE6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E2E2E2E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E7E7E7E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E1E1E1E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5F5F5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E1E1E1E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6C9C9C9E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 DCDCDCE5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C4C4C4 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E2E2E2E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C2C2C2E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6BCBCBCE6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E5E5E5E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E7E7E7E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E1E1E1E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5E5E5E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6C2C2C2E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E1E1E1E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6D3D3D3E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E6E6E6E2E2E2D4D4D4E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 E6E6E6E6E6E6E1E1E1E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6 C0C0C0E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6CFCFCFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2000000121212141414 141414141414141414141414141414141414141414060606000000121212141414141414141414 1414141414141414141414141414140000000101010D0D0D141414141414141414141414141414 1414141414141414140404040F0F10060606141414141414141414141414141414141414141414 1414140F0F0F121212030303141414141414141414141414141414141414141414141414121212 0F0F0F000000141414141414141414141414141414141414141414141414141414040404000000 1212121414141414141414141414141414141414141414141414140303030000000E0E0E141414 1414141414141414141414141414141414141414140000000909090A0A0A141414141414141414 1414141414141414141414141414140A0A0A131313030303141414141414141414141414141414 141414141414141414121212131313010101141414141414141414141414141414141414141414 1414141414140A0A0A000000131313141414141414141414141414141414141414141414141414 000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DADADA0E101307090C0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E1305060702050A 0405070C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E1307080B0409110101020C0E13 0C0E130C0E130C0E130C0E130C0E130C0E130C0E130B0D1203060A0000000B0E120C0E130C0E13 0C0E130C0E130C0E130C0E130C0E130C0E130204070000000B0D110C0E130C0E130C0E130C0E13 0C0E130C0E130C0E130C0E13000001000000080A0D0C0E130C0E130C0E130C0E130C0E130C0E13 0C0E130C0E13000000010305080B0F0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13 080A0C04070E0203040C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13090C0F020407 05070C0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E1301020403060C0C0E13 0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13010204000000090B0E0C0E130C0E13 0C0E130C0E130C0E130C0E130C0E130C0E130000000103060A0C110C0E130C0E130C0E130C0E13 0C0E130C0E130C0E130C0E13090B0E000000C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7C7C8000000090B0E0C0E130C0E130C0E130C0E130C0E13 0C0E130C0E130C0E13000000020407090B0F0C0E130C0E130C0E130C0E130C0E130C0E130C0E13 0C0E1302030404070D0304060C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13090B0F 0409100000000C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130B0D1204070D000000 0B0E120C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130102040000000A0D100C0E13 0C0E130C0E130C0E130C0E130C0E130C0E130C0E130000000203070A0C110C0E130C0E130C0E13 0C0E130C0E130C0E130C0E130C0E130405060204080405080C0E130C0E130C0E130C0E130C0E13 0C0E130C0E130C0E1306070901030606090D0C0E130C0E130C0E130C0E130C0E130C0E130C0E13 0C0E130A0D1101030604070D0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13 0305090000000B0D110C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E13000101020509 0C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E130C0E1306080A000000DFDFDFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6464642F2F2FB7B8BAC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43E3F3F1C1C1CB2B3B5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C46162620909099B9C9EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4909193080808767678C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A7A8A9 0C0C0C68696AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B8B9BB1717173B3B3C BEBFC1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4393939171717AFB0B2C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555657101010A8A9ABC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C477787A0707088D8E8FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4A1A2A40B0B0C606162C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4B3B3B5131313515253C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C3 222223292929B9BABCC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47F80810F0F0F 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C00B0C0F 254681325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC24447D020407234178325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC2B509404060B172B52325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC305BA9080F1A0C1528305AA6325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC0D192E09101F2F57A2325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC15294C03050A2A4E91325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 224077020306264784325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC284B8D030509 1E3767325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2E56A0060A1111203C325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC0D1729070E1A315BA9325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC122242050A122D549B325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC1B33600204072B5196325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC2D539B0C111A000000A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFA1A1A20C0E132A4E91325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC1D36640204082D539B325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC254580 0204071F3A6B325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2D569E05090F12223F 315CAB325DAC325DAC325DAC325DAC325DAC325DAC325DAC305AA7080F1B0F1C33315BA9325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC0F1B32060B152D549D325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC1A325D0204072B5197325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC22407802030724437D325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC294D9003050A1D3563325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC305AA7 080E180C172C325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC315CAB0C16290A1323 2F58A4325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC14264603060C2F57A2325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC294C8E080B10000000C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6464642F2F2FB7B8BAC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C43E3F3F1C1C1CB2B3B5C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C46162620909099B9C9EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4909193 080808767778C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A7A8A90C0C0C68696A C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B8B9BB1717173B3C3CBEBFC1C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4393939171717AFB0B2C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555657101010A8A9ABC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C477787A0707088D8E8FC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4A1A2A40B0B0C616162C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B3B3B5 131313525253C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C3222223292A2A B9BABCC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47F8081111111757678040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C00B0C0F254681325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC24447D020407234178325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC2B509404060B172C52325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC305BA9080F1A0C1629305AA6325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC0D192E09101F2F57A2325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 15294C03050A2A4E91325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC224077020306 213E73325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC284B8D0305091E3767325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC2E57A2060A1111203C315CAB325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC0D1729070E1A2E56A0325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC122242050A122D549B325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC1B3360020407264885325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 2D549D0C111A041B440C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFA1A1A20C0E132A4E91325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC1D3664 020408284A8A325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2545800204071F3A6B 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2D569E05090F122240315CAB325DAC 325DAC325DAC325DAC325DAC325DAC325DAC305AA7080F1B0F1C34315BA9325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC0F1B32060B152D549D325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC1A325D020407264885325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC22407802030724437D325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2A4E91 03050A192F58325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC305BA8080E180D182C 305AA7325DAC325DAC325DAC325DAC325DAC325DAC325DAC315CAB0C16290A13242F58A4325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC14264603060C2B5094325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC294C8E080B10011D510F1521C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFE3636361E1E1E7E7F80808182808182808182808182808182808182808182 8081822525261010107C7D7E8081828081828081828081828081828081828081828081824D4E4F 00000077787980818280818280818280818280818280818280818280818268696A010101676768 80818280818280818280818280818280818280818280818271717300000058595A808182808182 8081828081828081828081828081828081827B7C7D0303032D2D2D7F8081808182808182808182 8081828081828081828081828081822525250B0B0B7C7C7E808182808182808182808182808182 8081828081828081823B3B3C0505057A7B7C808182808182808182808182808182808182808182 808182595A5B000000737475808182808182808182808182808182808182808182808182707172 000000515152808182808182808182808182808182808182808182808182777778000000434344 8081828081828081828081828081828081828081828081827F80810F0F0F1C1C1C7E7F80808182 8081828081828081828081828081828081828081827475761111117677798B8C8D040404FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B20000001E3867213E72213E72213E72 213E72213E72213E72213E72213E72182E550000001D3765213E72213E72213E72213E72213E72 213E72213E72213E721D3766000000132544213E72213E72213E72213E72213E72213E72213E72 213E72203D7103050A080F1D203D71213E72213E72213E72213E72213E72213E72213E72213E72 070D18050A14203C6F213E72213E72213E72213E72213E72213E72213E72213E72101F3A000001 1F3A6B213E72213E72213E72213E72213E72213E72213E72213E721E396A0000001D3664213E72 213E72213E72213E72213E72213E72213E72213E721B33600000001A3059213E72213E72213E72 213E72213E72213E72213E72213E72203D7109101B0D192F213E72213E72213E72213E72213E72 213E72213E72213E72213E72101D3404080E203C6F213E72213E72213E72213E72213E72213E72 213E72213E720C172B020408203B6E213E72213E72213E72213E72213E72213E72213E72213E72 1C35630000001E3869213E72213E72213E72213E72213E72213E72213E72213E72213E72111825 041B44012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF878788 0102031F3A6B213E72213E72213E72213E72213E72213E72213E72213E721A325C0000001E3969 213E72213E72213E72213E72213E72213E72213E72213E721A325C0000011B325D213E72213E72 213E72213E72213E72213E72213E72213E721E3A6C0000000E1B32213E72213E72213E72213E72 213E72213E72213E72213E72203C6F0102050B1527213D71213E72213E72213E72213E72213E72 213E72213E72213E7209122003050A203B6E213E72213E72213E72213E72213E72213E72213E72 213E721C35630000001E3869213E72213E72213E72213E72213E72213E72213E72213E72172B50 0000001E3767213E72213E72213E72213E72213E72213E72213E72213E72203C6F00000015274A 213E72213E72213E72213E72213E72213E72213E72213E72213D710B1422091120203D71213E72 213E72213E72213E72213E72213E72213E72203D71050A13070D18203C70213E72213E72213E72 213E72213E72213E72213E72213E72162A4F0001021F3A6C213E72213E72213E72213E72213E72 213E72213E72213E72213F74080B10011D51012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDBDBDB0000003E3E3F3E3F403E3F403E3F403E3F403E3F403E3F403E3F403E3F40353536 00000036363839393A39393A3333343E3F403E3F403E3F403E3F403E3F403636370202022E2E2E 39393A39393A3334353D3E3E3E3F403E3F403E3F403E3F403B3B3C00000022222239393A39393A 3535363B3B3C3E3F403E3F403E3F403E3F403E3E3F03030300000039393A39393A363738383839 3E3F403E3F403E3F403E3F403E3F400E0F0F00000039393A39393A3737383737383E3F403E3F40 3E3F403E3F403E3F4031313200000036363739393A3838393434353E3F403E3F403E3F403E3F40 3E3F4037373800000032323339393A39393A3434353D3D3E3E3F403E3F403E3F403E3F4038393A 04040428282939393A39393A3435353C3C3D3E3F403E3F403E3F403E3F403C3C3D000000000000 39393A39393A36363739393A3E3F403E3F403E3F403E3F403E3F4010101000000039393A39393A 3738383637383E3F403E3F403E3F403E3F403E3F4022222200000039393A39393A383839353637 3E3F403E3F403E3F403E3F403E3F403434350000007273758F90928B8C8D040404FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28292C0B162A0E1D380E1D380E1D380E1D380E1D38 0E1D380E1D380E1D380D1C36000103020D2002133202133202122E0918330E1D380E1D380E1D38 0E1D380E1C3600000000000002133202133202122F0917320E1D380E1D380E1D380E1D380E1D38 050B1600000002133202133202123005142F0E1D380E1D380E1D380E1D380E1D38091428000000 02123002133202133102112C0E1D380E1D380E1D380E1D380E1D380C182F000000021029021332 02133202112C0E1C380E1D380E1D380E1D380E1D380D1B3400010301071302133202133203122E 0B1A350E1D380E1D380E1D380E1D380E1C3700000000000002133202133202122F0817320E1D38 0E1D380E1D380E1D380E1C3701030700000002133202133202122F0716310E1D380E1D380E1D38 0E1D380E1D380A152A00000002122F02133202123004132E0E1D380E1D380E1D380E1D380E1D38 0C193000000002112D02133202133202112C0D1C370E1D380E1D380E1D380E1D380C1A32000102 010B1E02133202133202122D0C1B360E1D380E1D380E1D380E1D380E1D38000000000204012B7A 012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000C1930 0E1D380E1D380E1D380E1D380E1D380E1D380E1D380E1D380D1B34000000020C20021332021332 03122E0B1A350E1D380E1D380E1D380E1D380D1B34000000010B1D02133202133203122E0A1934 0E1D380E1D380E1D380E1D380E1C3700010200000002133202133202122F0716310E1D380E1D38 0E1D380E1D380E1D38070F1D00000002133102133202123004132E0E1D380E1D380E1D380E1D38 0E1D380B172C00000002122F02133202133103122D0E1D380E1D380E1D380E1D380E1D380C1931 000102010B1E02133202133202122D0D1C370E1D380E1D380E1D380E1D380D1B35000104020D22 02133202133203122E0A18340E1D380E1D380E1D380E1D380D1C36000000000000021332021332 02122F0918330E1D380E1D380E1D380E1D380E1D38050A14000000021230021332021230051430 0E1D380E1D380E1D380E1D380E1D3809132400000002133102133202133103122D0E1D380E1D38 0E1D380E1D380E1D380C182E000000020E2602133202133202112C0E1D380E1D380E1D380E1D38 0E1D380E1D38000000010C23012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020 717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698 003698003698003698010E2800205A003698003698003698003698003698003698003698003698 003698001742001131003698003698003698003698003698003698003698003698003698002B7C 00030A003698003698003698003698003698003698003698003698003698003392000103003698 00369800369800369800369800369800369800369800369800369801050E012B7A003698003698 003698003698003698003698003698003698003698010C21001E54003698003698003698003698 003698003698003698003698003698001439001A48003698003698003698003698003698003698 00369800369800369800205A000B1E003698003698003698003698003698003698003698003698 003698003597000000003698003698003698003698003698003698003698003698003698003698 00020600328D003698003698003698003698003698003698003698003698003698020916002569 003698003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A 0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698 003698003698003698003698003698003698003698003698000816002870003698003698003698 003698003698003698003698003698003698010E28001B4D003698003698003698003698003698 003698003698003698003698001E56000B1F003698003698003698003698003698003698003698 003698003698002B7B000713003698003698003698003698003698003698003698003698003698 003698000103003391003698003698003698003698003698003698003698003698003698020914 00256A003698003698003698003698003698003698003698003698003698010C2301225F003698 00369800369800369800369800369800369800369800369801153C001438003698003698003698 00369800369800369800369800369800369800287200050E003698003698003698003698003698 00369800369800369800369800318C000206003698003698003698003698003698003698003698 00369800369800369800040A002D80003698003698003698003698003698003698003698003698 003698051C45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698 003698003698010E2800205A003698003698003698003698003698003698003698003698003698 001742001131003698003698003698003698003698003698003698003698003698002B7C00030A 003698003698003698003698003698003698003698003698003698003392000103003698003698 00369800369800369800369800369800369800369800369801050E012B7A003698003698003698 003698003698003698003698003698003698010C22001E54003698003698003698003698003698 003698003698003698003698001439001A48003698003698003698003698003698003698003698 00369800369800205A000B1E003698003698003698003698003698003698003698003698003698 003597000000003698003698003698003698003698003698003698003698003698003698000206 00328D003698003698003698003698003698003698003698003698003698020916002569003698 003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32 A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698 003698003698003698003698003698003698003698000817002870003698003698003698003698 003698003698003698003698003698010E28001B4D003698003698003698003698003698003698 003698003698003698001E56000B1F003698003698003698003698003698003698003698003698 003698002B7B000713003698003698003698003698003698003698003698003698003698003698 00010300339100369800369800369800369800369800369800369800369800369802091500256A 003698003698003698003698003698003698003698003698003698010C2301225F003698003698 00369800369800369800369800369800369800369801153C001438003698003698003698003698 00369800369800369800369800369800287200050F003698003698003698003698003698003698 00369800369800369800318C000206003698003698003698003698003698003698003698003698 00369800369801040B002D80003698003698003698003698003698003698003698003698003698 051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698 003698010E2800205A003698003698003698003698003698003698003698003698003698001742 001131003698003698003698003698003698003698003698003698003698002B7C00030A003698 003698003698003698003698003698003698003698003698003392000103003698003698003698 00369800369800369800369800369800369800369801050E012B7A003698003698003698003698 003698003698003698003698003698010C22001E54003698003698003698003698003698003698 003698003698003698001439001A48003698003698003698003698003698003698003698003698 00369800205A000B1E003698003698003698003698003698003698003698003698003698003597 00000000369800369800369800369800369800369800369800369800369800369800020600328D 003698003698003698003698003698003698003698003698003698020916002569003698003698 003698003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698 003698003698003698003698003698003698000817002870003698003698003698003698003698 003698003698003698003698010E28001B4D003698003698003698003698003698003698003698 003698003698001E56000B1F003698003698003698003698003698003698003698003698003698 002B7B000713003698003698003698003698003698003698003698003698003698003698000103 00339100369800369800369800369800369800369800369800369800369802091500256A003698 003698003698003698003698003698003698003698003698010C2301225F003698003698003698 00369800369800369800369800369800369801153C001438003698003698003698003698003698 00369800369800369800369800287200050F003698003698003698003698003698003698003698 00369800369800318C000206003698003698003698003698003698003698003698003698003698 00369801040B002D80003698003698003698003698003698003698003698003698003698051D45 001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698003698 010E2800205A003698003698003698003698003698003698003698003698003698001742001131 003698003698003698003698003698003698003698003698003698002B7C00030A003698003698 003698003698003698003698003698003698003698003392000103003698003698003698003698 00369800369800369800369800369800369801050E012B7A003698003698003698003698003698 003698003698003698003698010C22001E54003698003698003698003698003698003698003698 003698003698001439001A48003698003698003698003698003698003698003698003698003698 00205A000B1E003698003698003698003698003698003698003698003698003698003597000000 00369800369800369800369800369800369800369800369800369800369800020600328D003698 003698003698003698003698003698003698003698003698020916002569003698003698003698 003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698 003698003698003698003698003698000817002870003698003698003698003698003698003698 003698003698003698010E28001B4D003698003698003698003698003698003698003698003698 003698001E56000B1F003698003698003698003698003698003698003698003698003698002B7B 000713003698003698003698003698003698003698003698003698003698003698000103003391 00369800369800369800369800369800369800369800369800369802091500256A003698003698 003698003698003698003698003698003698003698010C2301225F003698003698003698003698 00369800369800369800369800369801153C001438003698003698003698003698003698003698 00369800369800369800287200050F003698003698003698003698003698003698003698003698 00369800318C000206003698003698003698003698003698003698003698003698003698003698 01040B002D80003698003698003698003698003698003698003698003698003698051D45001742 012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF45494E002465003698003698003698003698003698003698003698003698003698010E28 00205A003698003698003698003698003698003698003698003698003698001742001131003698 003698003698003698003698003698003698003698003698002B7C00030A003698003698003698 003698003698003698003698003698003698003392000103003698003698003698003698003698 00369800369800369800369800369801050E012B7A003698003698003698003698003698003698 003698003698003698010C22001E54003698003698003698003698003698003698003698003698 003698001439001A4800369800369800369800369800369800369800369800369800369800205A 000B1E003698003698003698003698003698003698003698003698003698003597000000003698 00369800369800369800369800369800369800369800369800369800020600328D003698003698 003698003698003698003698003698003698003698020916002569003698003698003698003698 003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698 003698003698003698003698000817002870003698003698003698003698003698003698003698 003698003698010E28001B4D003698003698003698003698003698003698003698003698003698 001E56000B1F003698003698003698003698003698003698003698003698003698002B7B000713 003698003698003698003698003698003698003698003698003698003698000103003391003698 00369800369800369800369800369800369800369800369802091500256A003698003698003698 003698003698003698003698003698003698010C2301225F003698003698003698003698003698 00369800369800369800369801153C001438003698003698003698003698003698003698003698 00369800369800287200050F003698003698003698003698003698003698003698003698003698 00318C00020600369800369800369800369800369800369800369800369800369800369801040B 002D80003698003698003698003698003698003698003698003698003698051D45001742012B7A 012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D 191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2525257172738F90928B8C8D000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 45494E002465003698003698003698003698003698003698003698003698003698010E2800205A 003698003698003698003698003698003698003698003698003698001742001131003698003698 003698003698003698003698003698003698003698002B7C00030A003698003698003698003698 003698003698003698003698003698003392000103003698003698003698003698003698003698 00369800369800369800369801050E012B7A003698003698003698003698003698003698003698 003698003698010C22001E54003698003698003698003698003698003698003698003698003698 001439001A4800369800369800369800369800369800369800369800369800369800205A000B1E 003698003698003698003698003698003698003698003698003698003597000000003698003698 00369800369800369800369800369800369800369800369800020600328D003698003698003698 003698003698003698003698003698003698020916002569003698003698003698003698003698 003698003698003698003698001F5A081835012B7A012B7A0C1931A3A3A3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698 003698003698003698000817002870003698003698003698003698003698003698003698003698 003698010E28001B4D003698003698003698003698003698003698003698003698003698001E56 000B1F003698003698003698003698003698003698003698003698003698002B7B000713003698 003698003698003698003698003698003698003698003698003698000103003391003698003698 00369800369800369800369800369800369800369802091500256A003698003698003698003698 003698003698003698003698003698010C2301225F003698003698003698003698003698003698 00369800369800369801153C001438003698003698003698003698003698003698003698003698 00369800287200050F00369800369800369800369800369800369800369800369800369800318C 00020600369800369800369800369800369800369800369800369800369800369801040B002D80 003698003698003698003698003698003698003698003698003698051D45001742012B7A012B7A 0D121DC9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5131313858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181818 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54646473E3F3FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1C1C 7172738F9092797A7C000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E 002465003698003698003698003698003698003698003698003698003698010E2800205A003698 003698003698003698003698003698003698003698003698001742001131003698003698003698 003698003698003698003698003698003698002B7C00030A003698003698003698003698003698 003698003698003698003698003392000103003698003698003698003698003698003698003698 00369800369800369800040C012B7A003698003698003698003698003698003698003698003698 003698010B21001E54003698003698003698003698003698003698003698003698003698001439 001A4800369800369800369800369800369800369800369800369800369800205A000A1D003698 003698003698003698003698003698003698003698003698003597000000003698003698003698 00369800369800369800369800369800369800369800020500328D003698003698003698003698 003698003698003698003698003698000714002569003698003698003698003698003698003698 003698003698003698001F5A00102E012B7A012A79000000787878FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698 003698003698000816002870003698003698003698003698003698003698003698003698003698 010E28001B4D003698003698003698003698003698003698003698003698003698001E56000B1F 003698003698003698003698003698003698003698003698003698002B7B000713003698003698 003698003698003698003698003698003698003698003698000102003391003698003698003698 00369800369800369800369800369800369800071300256A003698003698003698003698003698 003698003698003698003698010C2301225F003698003698003698003698003698003698003698 00369800369801153C001337003698003698003698003698003698003698003698003698003698 00287200050E00369800369800369800369800369800369800369800369800369800318C000206 00369800369800369800369800369800369800369800369800369800369800030A002D80003698 003698003698003698003698003698003698003698003698011740001742012B7A002974000000 9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051 474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181919B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1 080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5212222717273 7A7B7C0A0A0A010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465 003698003698003698003698003698003698003698003698003698010E2800205A003698003698 003698003698003698003698003698003698003698001742001131003698003698003698003698 003698003698003698003698003698002B7C00030A003698003698003698003698003698003698 003698003698003698003392000103003698003698003698003698003698003698003698003698 00369800369800050D012B7A003698003698003698003698003698003698003698003698003698 010C21001E54003698003698003698003698003698003698003698003698003698001439001A48 00369800369800369800369800369800369800369800369800369800205A000B1E003698003698 003698003698003698003698003698003698003698003597000000003698003698003698003698 00369800369800369800369800369800369800020500328D003698003698003698003698003698 003698003698003698003698010815002569003698003698003698003698003698003698003698 003698003698001F5A011232012A79010E2902060EA2A2A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698 003698000816002870003698003698003698003698003698003698003698003698003698010E28 001B4D003698003698003698003698003698003698003698003698003698001E56000B1F003698 003698003698003698003698003698003698003698003698002B7B000713003698003698003698 003698003698003698003698003698003698003698000103003391003698003698003698003698 00369800369800369800369800369800071400256A003698003698003698003698003698003698 003698003698003698010C2301225F003698003698003698003698003698003698003698003698 00369801153C001338003698003698003698003698003698003698003698003698003698002872 00050E00369800369800369800369800369800369800369800369800369800318C000206003698 00369800369800369800369800369800369800369800369800369800030A002D80003698003698 00369800369800369800369800369800369800369800194300174200297400091901040AC9C9C9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181919B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52223236C6C6E0A0A0A 3B3B3C040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698 003698003698003698003698003698003698003698003698010E2800205A003698003698003698 003698003698003698003698003698003698001742001131003698003698003698003698003698 003698003698003698003698002B7C00030A003698003698003698003698003698003698003698 003698003698003392000103003698003698003698003698003698003698003698003698003698 00369800050D012B7A003698003698003698003698003698003698003698003698003698010C21 001E54003698003698003698003698003698003698003698003698003698001439001A48003698 00369800369800369800369800369800369800369800369800205A000B1E003698003698003698 003698003698003698003698003698003698003597000000003698003698003698003698003698 00369800369800369800369800369800020500328D003698003698003698003698003698003698 003698003698003698010916002569003698003698003698003698003698003698003698003698 003698001F5A011232010E2902060E0B182FA3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698 000816002870003698003698003698003698003698003698003698003698003698010E28001B4D 003698003698003698003698003698003698003698003698003698001E56000B1F003698003698 003698003698003698003698003698003698003698002B7B000713003698003698003698003698 003698003698003698003698003698003698000103003391003698003698003698003698003698 00369800369800369800369800071400256A003698003698003698003698003698003698003698 003698003698010C2301225F003698003698003698003698003698003698003698003698003698 01153C00133800369800369800369800369800369800369800369800369800369800287200050E 00369800369800369800369800369800369800369800369800369800318C000206003698003698 00369800369800369800369800369800369800369800369800030B002D80003698003698003698 00369800369800369800369800369800369800194300174100091A020A180F1521C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1070707AAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABADAAABAD000000A9AAACAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABAD131313838385AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD2C2C2C 565758AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD4F4F50444445AAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD797A7B171717AAABADAAABADAAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABAD030303A6A7A8AAABADAAABADAAABADAAABAD AAABADAAABADAAABADAAABADAAABAD0C0C0C98999BAAABADAAABADAAABADAAABADAAABADAAABAD AAABADAAABADAAABAD1D1D1D6F7071AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD AAABAD4344453B3C3CAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD6B6C6D 2C2C2DAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD9A9B9C070707AAABAD AAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABADAAABAD1E1E1F0505053C3C3D8B8C8D 040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C3F45002363003391003391 003391003391003391003391003391003391003391010D27001F58003391003391003391003391 00339100339100339100339100339100164100102F003391003391003391003391003391003391 003391003391003391012B7A000309003391003391003391003391003391003391003391003391 00339100318B000102003391003391003391003391003391003391003391003391003391003391 00040C012A79003391003391003391003391003391003391003391003391003391000A1E011D52 003391003391003391003391003391003391003391003391003391001337001947003391003391 003391003391003391003391003391003391003391001F5A00091C003391003391003391003391 003391003391003391003391003391013290000000003391003391003391003391003391003391 00339100339100339100339100020500318B003391003391003391003391003391003391003391 003391003391010814002467003391003391003391003391003391003391003391003391003391 001F58000A1B02060E0028740C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF171A20012B7A003391003391003391003391003391003391003391003391003391000816 01276E003391003391003391003391003391003391003391003391003391010E27001A4B003391 003391003391003391003391003391003391003391003391001E55000A1D003391003391003391 003391003391003391003391003391003391002975000612003391003391003391003391003391 00339100339100339100339100339100000201338F003391003391003391003391003391003391 003391003391003391000611002568003391003391003391003391003391003391003391003391 003391010C2201215E00339100339100339100339100339100339100339100339100339100143A 00133500339100339100339100339100339100339100339100339100339100277200040D003391 003391003391003391003391003391003391003391003391012F86000205003391003391003391 003391003391003391003391003391003391003391000309002C7E003391003391003391003391 00339100339100339100339100339100184100050D020A18012A790F1521C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFCDCDCD010101030303030303030303030303030303030303030303030303 030303030303030303020303030303030303030303030303030303030303030303030303030303 080808000000030303030303030303030303030303030303030303030303030303000000000000 030303030303030303030303030303030303030303030303030303000000000000030303030303 030303030303030303030303030303030303030303000000000000030303030303030303030303 030303030303030303030303030303010101050505010101030303030303030303030303030303 030303030303030303030303070707000000030303030303030303030303030303030303030303 030303030303060606000000030303030303030303030303030303030303030303030303030303 000000000000030303030303030303030303030303030303030303030303030303000000000000 030303030303030303030303030303030303030303030303030303000000010101030303030303 0303030303030303030303030303030303030303030303030000003838398F90928B8C8D040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B0D12000000000103000103000103 000103000103000103000103000103000103000103000000000103000103000103000103000103 000103000103000103000103000000000000000103000103000103000103000103000103000103 000103000103000000000000000103000103000103000103000103000103000103000103000103 000001000001000102000103000103000103000103000103000103000103000103000001000207 000000000103000103000103000103000103000103000103000103000102000102000000000103 000103000103000103000103000103000103000103000103000000000000000103000103000103 000103000103000103000103000103000103000000000000000103000103000103000103000103 000103000103000103000103000000000002000103000103000103000103000103000103000103 000103000103000002000104000000000103000103000103000103000103000103000103000103 000102000206000000000103000103000103000103000103000103000103000103000103000000 000000002875012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000207000000000103000103000103000103000103000103000103000103000102000207000000 000103000103000103000103000103000103000103000103000102000000000000000103000103 000103000103000103000103000103000103000103000000000000000103000103000103000103 000103000103000103000103000103000000000000000102000103000103000103000103000103 000103000103000103000001000104000001000103000103000103000103000103000103000103 000103000002000206000000000103000103000102000103000103000103000103000103000103 000205000000000103000103000103000103000103000103000103000103000103000000000000 000103000103000103000103000103000103000103000103000103000000000000000103000103 000103000103000103000103000103000103000103000000000001000102000103000103000103 000103000103000103000103000103000001000206000000000103000103000102000103000103 00010300010300010300010300000001060F012A79012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515 858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 3F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698 0036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD 040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E121800256A003698003698003698003698003698003698003698003698003698001F5A081835 012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228 012C7B003698003698003698003698003698003698003698003698003698000817002870003698 003698003698003698003698003698003698003698003698010E28001B4D003698003698003698 003698003698003698003698003698003698001E56000B1E003698003698003698003698003698 003698003698003698003698002B7B000713003698003698003698003698003698003698003698 003698003698003698000001003391003698003698003698003698003698003698003698003698 00369802091400256A003698003698003698003698003698003698003698003698003698010B21 01225F00369800369800369800369800369800369800369800369800369801153C001438003698 00369800369800369800369800369800369800369800369800287200050F003698003698003698 00369800369800369800369800369800369800318C000206003698003698003698003698003698 00369800369800369800369800369800040B002D80003698003698003698003698003698003698 003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698 0036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F1318 00256A003698003698003698003698003698003698003698003698003698001F5A081835012B7A 012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B 003698003698003698003698003698003698003698003698003698000817002870003698003698 003698003698003698003698003698003698003698010E28001B4D003698003698003698003698 003698003698003698003698003698001E56000B1F003698003698003698003698003698003698 003698003698003698002B7B000713003698003698003698003698003698003698003698003698 003698003698000103003391003698003698003698003698003698003698003698003698003698 02091500256A003698003698003698003698003698003698003698003698003698010C2301225F 00369800369800369800369800369800369800369800369800369801153C001438003698003698 00369800369800369800369800369800369800369800287200050F003698003698003698003698 00369800369800369800369800369800318C000206003698003698003698003698003698003698 00369800369800369800369801040B002D80003698003698003698003698003698003698003698 003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020 717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698 0036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5919294 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A 003698003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A 0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698 003698003698003698003698003698003698003698003698000817002870003698003698003698 003698003698003698003698003698003698010E28001B4D003698003698003698003698003698 003698003698003698003698001E56000B1F003698003698003698003698003698003698003698 003698003698002B7B000713003698003698003698003698003698003698003698003698003698 003698000103003391003698003698003698003698003698003698003698003698003698020915 00256A003698003698003698003698003698003698003698003698003698010C2301225F003698 00369800369800369800369800369800369800369800369801153C001438003698003698003698 00369800369800369800369800369800369800287200050F003698003698003698003698003698 00369800369800369800369800318C000206003698003698003698003698003698003698003698 00369800369800369801040B002D80003698003698003698003698003698003698003698003698 003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698 0036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707 A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A003698 003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32 A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698 003698003698003698003698003698003698003698000817002870003698003698003698003698 003698003698003698003698003698010E28001B4D003698003698003698003698003698003698 003698003698003698001E56000B1F003698003698003698003698003698003698003698003698 003698002B7B000713003698003698003698003698003698003698003698003698003698003698 00010300339100369800369800369800369800369800369800369800369800369802091500256A 003698003698003698003698003698003698003698003698003698010C2301225F003698003698 00369800369800369800369800369800369800369801153C001438003698003698003698003698 00369800369800369800369800369800287200050F003698003698003698003698003698003698 00369800369800369800318C000206003698003698003698003698003698003698003698003698 00369800369801040B002D80003698003698003698003698003698003698003698003698003698 051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698 0036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E 3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A003698003698 003698003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698 003698003698003698003698003698003698000817002870003698003698003698003698003698 003698003698003698003698010E28001B4D003698003698003698003698003698003698003698 003698003698001E56000B1F003698003698003698003698003698003698003698003698003698 002B7B000713003698003698003698003698003698003698003698003698003698003698000103 00339100369800369800369800369800369800369800369800369800369802091500256A003698 003698003698003698003698003698003698003698003698010C2301225F003698003698003698 00369800369800369800369800369800369801153C001438003698003698003698003698003698 00369800369800369800369800287200050F003698003698003698003698003698003698003698 00369800369800318C000206003698003698003698003698003698003698003698003698003698 00369801040B002D80003698003698003698003698003698003698003698003698003698051D45 001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698003698 0612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A003698003698003698 003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698 003698003698003698003698003698000817002870003698003698003698003698003698003698 003698003698003698010E28001B4D003698003698003698003698003698003698003698003698 003698001E56000B1F003698003698003698003698003698003698003698003698003698002B7B 000713003698003698003698003698003698003698003698003698003698003698000103003391 00369800369800369800369800369800369800369800369800369802091500256A003698003698 003698003698003698003698003698003698003698010C2301225F003698003698003698003698 00369800369800369800369800369801153C001438003698003698003698003698003698003698 00369800369800369800287200050F003698003698003698003698003698003698003698003698 00369800318C000206003698003698003698003698003698003698003698003698003698003698 01040B002D80003698003698003698003698003698003698003698003698003698051D45001742 012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E717273B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1D1D7172738F90928B8C8E040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF45494E002465003698003698003698003698003698003698003698003698003698061229 6A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3A3BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C 232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D101600256A003698003698003698003698 003698003698003698003698003698001F5A01122F012B7A012B7A010F29757575FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698 003698003698003698003698000816002870003698003698003698003698003698003698003698 003698003698010E28001B4D003698003698003698003698003698003698003698003698003698 001E56000B1F003698003698003698003698003698003698003698003698003698002B7B000713 003698003698003698003698003698003698003698003698003698003698000102003391003698 00369800369800369800369800369800369800369800369800071300256A003698003698003698 003698003698003698003698003698003698010C2301225F003698003698003698003698003698 00369800369800369800369801153C001337003698003698003698003698003698003698003698 00369800369800287200050E003698003698003698003698003698003698003698003698003698 00318C00020600369800369800369800369800369800369800369800369800369800369800030A 002D80003698003698003698003698003698003698003698003698003698001841001742012B7A 012B7A0209169C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D 181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D9A9B9DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 20202071727388898B1B1B1B040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 45494E0024650036980036980036980036980036980036980036980036980036980612296A6A6B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3A3BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232323 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E111700256A003698003698003698003698003698 003698003698003698003698001F5A001231012B7A0018450001058C8C8CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698 003698003698003698000816002870003698003698003698003698003698003698003698003698 003698010E28001B4D003698003698003698003698003698003698003698003698003698001E56 000B1F003698003698003698003698003698003698003698003698003698002B7B000713003698 003698003698003698003698003698003698003698003698003698000103003391003698003698 00369800369800369800369800369800369800369801081400256A003698003698003698003698 003698003698003698003698003698010C2301225F003698003698003698003698003698003698 00369800369800369801153C001338003698003698003698003698003698003698003698003698 00369800287200050E00369800369800369800369800369800369800369800369800369800318C 00020600369800369800369800369800369800369800369800369800369800369800030A002D80 003698003698003698003698003698003698003698003698003698001842001742012B7A001130 000105BDBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5222323 6F70711B1C1C212122030303FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E 0024650036980036980036980036980036980036980036980036980036980612296A6A6BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343 545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E121800256A003698003698003698003698003698003698 003698003698003698001F5A0113320018450003070A152AA3A3A3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698 003698003698000816002870003698003698003698003698003698003698003698003698003698 010E28001B4D003698003698003698003698003698003698003698003698003698001E56000B1F 003698003698003698003698003698003698003698003698003698002B7B000713003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369801091400256A003698003698003698003698003698 003698003698003698003698010C2301225F003698003698003698003698003698003698003698 00369800369801153C001438003698003698003698003698003698003698003698003698003698 00287200050E00369800369800369800369800369800369800369800369800369800318C000206 00369800369800369800369800369800369800369800369800369800369800030B002D80003698 00369800369800369800369800369800369800369800369800194300174200123101050D0E131E C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051 464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181819B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54646473D3E3FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56D6D6F2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1 080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020151516 2222228A8B8C040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42454A002465 0036980036980036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E39393AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 262727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C222223B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E111700256A003698003698003698003698003698003698003698 003698003698001F5A010D230003070023640C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1B1F24012C7B003698003698003698003698003698003698003698003698 003698000816002870003698003698003698003698003698003698003698003698003698010E28 001B4D003698003698003698003698003698003698003698003698003698001E56000B1E003698 003698003698003698003698003698003698003698003698002B7B000713003698003698003698 003698003698003698003698003698003698003698000102003391003698003698003698003698 00369800369800369800369800369801081300256A003698003698003698003698003698003698 003698003698003698010C2301225F003698003698003698003698003698003698003698003698 00369801153C001337003698003698003698003698003698003698003698003698003698002872 00050E00369800369800369800369800369800369800369800369800369800318C000206003698 00369800369800369800369800369800369800369800369800369800030A002D80003698003698 003698003698003698003698003698003698003698001943010D2301050D0027700F1521C9C9C9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0000000161617171717171717171717171717171717 171717171717171717171717000000151516161617171717161617171717171717171717171717 171717171717080808010101161617171717161617171717171717171717171717171717171717 000000000000161617171717161617171717171717171717171717171717171717030303000000 161617171717161617171717171717171717171717171717171717090909000000161617171717 171717171717171717171717171717171717171717141415000000121212171717171717161617 1717171717171717171717171717171717170404040C0C0C161617171717161617171717171717 171717171717171717171717070708000000161617171717161617171717171717171717171717 171717171717000000000000161617171717161617171717171717171717171717171717171717 070707000000161617171717171717161617171717171717171717171717171717121213000000 1616171717171717171616171717171717171717171717171717171515160000003232338F9092 8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090C10000000000713 000713000713000713000713000713000713000713000713060606000000161617161617161617 171717171717171717171717171717171717000000000000161617171717161617171717171717 1717171717171717171717170B0B0B000000161617171717171717161617171717171717171717 171717171717141415000000161617171717171717161617171717171717171717171717171717 171717070707060606161617171717161617171717171717171717171717171717171717030303 000000161617171717161617171717171717171717171717171717171717000000000000161617 171717161617171717171717171717171717171717171717000000000000161617171717161717 171717171717171717171717171717171717111111000000161617171717171717161617171717 171717171717171717171717161616000000111111161617171717161617171717171717171717 171717171717171717000207000000000713000713000713000713000713000713000713000713 00071300000000000001256C012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000206000206000713000713000713000713000713000713000713000713000713 000207000000000713000713000713000713000713000713000713000713000713000001000000 000713000713000713000713000713000713000713000713000713000000000000000713000713 000713000713000713000713000713000713000713000610000000000713000713000713000713 000713000713000713000713000713000611000000000510000713000713000713000713000713 000713000713000713000713000207000000000713000713000713000713000713000713000713 000713000713000206000000000713000713000713000713000713000713000713000713000713 000000000000000713000713000713000713000713000713000713000713000713000005000000 000713000713000713000713000713000713000713000713000713000511000000000713000713 000713000713000713000713000713000713000713000713000105000208000713000713000713 000713000713000713000713000713000713000000061126002874012B7A0F1521C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F1000000898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B000000868789898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B0C0C0C676769898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B252526 454545898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B404040272728898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B6263630A0A0A898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B010101868788898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B040404777879898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B161616555656898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B3738382E2E2F898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B565758 1F1F1F898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B7D7D7E020202898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B1F1F1F7172738F90928B8C8D 040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF414449011C50002974002974 002974002974002974002974002974002974002974030C1D484849898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B3D3E3F292929898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B747475070707898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B828385000000898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 080808707173898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B1F1F1F4E4E4F 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B343535393A3B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B555556181818898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B88898A000000898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B000000848586898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B080B0F011C51002974002974002974002974002974002974002974002974002974 001947071734012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF1B1E22002263002974002974002974002974002974002974002974002974002974000511 001F59002974002974002974002974002974002974002974002974002974000B1F464748898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B515152181818898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B898A8B6F70700A0A0B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B898A8B898A8B00000087888A898A8B898A8B898A8B898A8B898A8B898A8B 898A8B898A8B898A8B121212636364898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B 898A8B1D1D1D575759898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B383838 28292A898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B6C6C6D0C0C0C898A8B 898A8B898A8B898A8B898A8B898A8B898A8B898A8B898A8B7E7F81000002002974002974002974 002974002974002974002974002974002974002974000105002265002974002974002974002974 002974002974002974002974002974041737001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698 0036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101010 8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50F131800256A003698003698003698003698003698003698003698003698003698001F5A 081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F2228012C7B003698003698003698003698003698003698003698003698003698000817002870 003698003698003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 292929707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698 00369800369800369800369800369800369801040B002D80003698003698003698003698003698 003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515 858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 3F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698 0036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD 040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0F131800256A003698003698003698003698003698003698003698003698003698001F5A081835 012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228 012C7B003698003698003698003698003698003698003698003698003698000817002870003698 003698003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5909192161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929 707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698 00369800369800369800369800369801040B002D80003698003698003698003698003698003698 003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698 0036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F1318 00256A003698003698003698003698003698003698003698003698003698001F5A081835012B7A 012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B 003698003698003698003698003698003698003698003698003698000817002870003698003698 003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5909192161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698003698 00369800369800369800369801040B002D80003698003698003698003698003698003698003698 003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020 717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698 0036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5919294 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A 003698003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A 0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698 003698003698003698003698003698003698003698003698000817002870003698003698003698 003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5909192161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5191919 7C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698003698003698 00369800369800369801040B002D80003698003698003698003698003698003698003698003698 003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698 0036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707 A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F131800256A003698 003698003698003698003698003698003698003698003698001F5A081835012B7A012B7A0C1A32 A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698 003698003698003698003698003698003698003698000817002870003698003698003698003698 003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5909192161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51919197C7D7F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698003698003698003698 00369800369801040B002D80003698003698003698003698003698003698003698003698003698 051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314858687B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F717273B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1E7172738F90928B8C8D020202FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698 0036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F 393A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8F9092B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D101600256A003698003698 003698003698003698003698003698003698003698001F5A021230012B7A012B7A010D259B9B9B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698 003698003698003698003698003698003698000816002870003698003698003698003698003698 003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5656667242525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717177C7D7FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414142B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5A4A5A7000206003698003698003698003698003698003698003698003698003698 00369800030A002D80003698003698003698003698003698003698003698003698003698011941 001742012B7A012B7A000612C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414858687B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1F1F717273B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51F20207172738D8E90343435050505FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698003698 0612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F393A3A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606A5A6A8B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E111700256A003698003698003698 003698003698003698003698003698003698001F5A001230012B7A001F58000205818181FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698 003698003698003698003698003698000816002870003698003698003698003698003698003698 003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192 161717B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717177C7D7FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414142B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5A4A5A7000206003698003698003698003698003698003698003698003698003698003698 00030A002D80003698003698003698003698003698003698003698003698003698001842001742 012B7A001A4A000105AFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52223237071732D2E2E151515030303FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF45494E002465003698003698003698003698003698003698003698003698003698061229 6A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C 232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E121800256A003698003698003698003698 003698003698003698003698003698001F5A011332001E5500020508101FA3A3A3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698 003698003698003698003698000816002870003698003698003698003698003698003698003698 003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161717 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51818187C7D7FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 A4A5A700020600369800369800369800369800369800369800369800369800369800369800030B 002D80003698003698003698003698003698003698003698003698003698001943001742001846 0003070B0F19C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D 181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473E3F3FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56D6D6F2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 222222272728151515868788040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 43474C0024650036980036980036980036980036980036980036980036980036980612296A6A6B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F39393AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C222223 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060607A5A6A8B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E121800256A003698003698003698003698003698 003698003698003698003698001F5A010E27000205001E580C1A32A3A3A3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D2025012C7B003698003698003698003698003698003698 003698003698003698000816002870003698003698003698003698003698003698003698003698 003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667 242425B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161617B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51818187C7D7FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5292929707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5464647404142B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7 00020600369800369800369800369800369800369800369800369800369800369800030B002D80 003698003698003698003698003698003698003698003698003698001943001335000307002466 0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0000000323333333434333434333434 333434333434333434333434333434333434000000313131333334333334333334333434333434 333434333434333434333434070707131313333334333334333334333434333434333434333434 333434333434000000000000333333333334333334333434333434333434333434333434333434 0C0C0C000000333333333334333334333334333434333434333434333434333434181919000000 3233333333343333343333343334343334343334343334343334343232320000002C2C2D333334 333334333334333434333434333434333434333434333434010101222323333334333334333334 333434333434333434333434333434333434070707050505333334333334333334333434333434 333434333434333434333434000000000000333333333334333334333334333434333434333434 333434333434191A1A000000323333333334333334333334333434333434333434333434333434 2A2A2A000000323333333334333334333334333434333434333434333434333434333334000000 1919198B8C8E8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0D12 00020700102C00102C00102C00102C00102C00102C00102C00102C00102C060606000000333333 333334333334333434333434333434333434333434333434030303000000333333333334333334 333334333434333434333434333434333434222323000000323333333334333334333334333434 333434333434333434333434313131000000323333333334333334333334333434333434333434 3334343334343333340505051A1A1B333334333334333334333434333434333434333434333434 333434030303000000333333333334333334333434333434333434333434333434333434050505 000000333333333334333334333334333434333434333434333434333434101011000000323333 333334333334333334333434333434333434333434333434313131000000323333333334333334 3333343334343334343334343334343334343333340000002A2A2A333334333334333334333434 33343433343433343433343433343400020700030B000F2C00102C000F2B00102C00102C00102C 00102C00102C00102C000000000000001F5B012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF00010400081700102C00102C00102C00102C00102C00102C00102C 00102C00102C00020600050F000F2B000F2C000F2B00102C00102C00102C00102C00102C00102C 0000000000003333333333343333343334343334343334343334343334343334340D0D0D000000 3333333333343333343333343334343334343334343334343334342A2A2B000000323333333334 3333343333343334343334343334343334343334343232320000002D2D2E333334333334333334 3334343334343334343334343334343334340808080D0D0D333334333334333334333434333434 333434333434333434333434070707040404333334333334333334333434333434333434333434 333434333434040404000000333333333334333334333334333434333434333434333434333434 1D1D1D0000003233333333343333343333343334343334343334343334343334342F3030000000 000F2B000F2C00102C000F2B00102C00102C00102C00102C00102C000F2C00010200091A000F2C 000F2C000F2B00102C00102C00102C00102C00102C00102C000000000000002469012B7A0F1521 C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1000000646466646466646466646466646466 646466646466646466646466646466000000646465646466646466646466646466646466646466 6464666464666464660A0A0A535354646466646466646466646466646466646466646466646466 6464661C1C1D333434646466646466646466646466646466646466646466646466646466323232 1B1C1C6464666464666464666464666464666464666464666464666464664D4D4E040404646466 646466646466646466646466646466646466646466646466646466000000626264646466646466 646466646466646466646466646466646466646466010101606162646466646466646466646466 646466646466646466646466646466101010454647646466646466646466646466646466646466 6464666464666464662B2C2C191919646466646466646466646466646466646466646466646466 6464664142430F0F0F6464666464666464666464666464666464666464666464666464665A5B5C 000000646466646466646466646466646466646466646466646466646466646466131313717273 8F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C3F4401163E 001E55001E55001E55001E55001E55001E55001E55001E55001E55020A173E3F3F646466646466 646466646466646466646466646466646466646466303031151515646466646466646466646466 646466646466646466646466646466565657000000646466646466646466646466646466646466 646466646466646466606061000000646466646466646466646466646466646466646466646466 6464666464660404045A5A5B646466646466646466646466646466646466646466646466646466 15151632333464646664646664646664646664646664646664646664646664646629292A242525 6464666464666464666464666464666464666464666464666464664343430A0A0A646466646466 646466646466646466646466646466646466646466636465000000646466646466646466646466 646466646466646466646466646466646466000000626263646466646466646466646466646466 64646664646664646664646605070A01153B001E55001E55001E55001E55001E55001E55001E55 001E55001E55001337061630012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF15171A001B4D001E55001E55001E55001E55001E55001E55001E55001E55 001E55000309001946001E55001E55001E55001E55001E55001E55001E55001E55001E55000718 3636366464666464666464666464666464666464666464666464666464663F40400E0E0E646466 646466646466646466646466646466646466646466646466515152040404646466646466646466 646466646466646466646466646466646466646466000000626364646466646466646466646466 646466646466646466646466646466090A0A474748646466646466646466646466646466646466 646466646466646466171717434344646466646466646466646466646466646466646466646466 6464662B2B2C141414646466646466646466646466646466646466646466646466646466525253 0000006464666464666464666464666464666464666464666464666464665C5C5E000000001E55 001E55001E55001E55001E55001E55001E55001E55001E55001E55000001001B4D001E55001E55 001E55001E55001E55001E55001E55001E55001E5503112A001741012B7A012B7A0F1521C9C9C9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F9092 8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698 0036980036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ABABAD030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828 636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5101319002569003698003698003698003698003698003698003698003698 003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698 000817002870003698003698003698003698003698003698003698003698003698010E285A5B5C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B529292A707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 464647414242B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698 00369800369800369800369800369800369800369800369801040B002D80003698003698003698 003698003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F30 58595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F 2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D 040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698 0036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ABABAD030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5101319002569003698003698003698003698003698003698003698003698003698 001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698000817 002870003698003698003698003698003698003698003698003698003698010E285A5B5CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B529292A707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 414242B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698 00369800369800369800369800369800369800369801040B002D80003698003698003698003698 003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698 0036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ABABAD030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101010 8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5101319002569003698003698003698003698003698003698003698003698003698001F5A 081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F2228012C7B003698003698003698003698003698003698003698003698003698000817002870 003698003698003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 29292A707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698 00369800369800369800369800369800369801040B002D80003698003698003698003698003698 003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515 858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 3F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698 0036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD 030303B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 101319002569003698003698003698003698003698003698003698003698003698001F5A081835 012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228 012C7B003698003698003698003698003698003698003698003698003698000817002870003698 003698003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A 707172B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698 00369800369800369800369800369801040B002D80003698003698003698003698003698003698 003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698 0036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54E4E4F3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD030303 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51010108F9092B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101319 002569003698003698003698003698003698003698003698003698003698001F5A081835012B7A 012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B 003698003698003698003698003698003698003698003698003698000817002870003698003698 003698003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1919197C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A707172 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414242B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000306003698003698003698003698003698003698 00369800369800369800369801040B002D80003698003698003698003698003698003698003698 003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414858687B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F 717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52121217172738F90928B8C8D000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698 0036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54E4E4F393A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5919294 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD030303B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 060607A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E1217002569 003698003698003698003698003698003698003698003698003698001F5A041532012B7A012B7A 030914A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698 003698003698003698003698003698003698003698003698000816002870003698003698003698 003698003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5656667252525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171718 7C7D7FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A707172B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414142B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5A4A5A7000206003698003698003698003698003698003698003698 00369800369800369800040A002D80003698003698003698003698003698003698003698003698 003698031A43001742012B7A012B7A000000C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314858687B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E717273 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51D1E1E7172738F90923A3A3B0C0D0DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698 0036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4E4E4F393A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD030303B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F0F8F9092B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060606 A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D1117002569003698 003698003698003698003698003698003698003698003698001F5A00112F012B7A00215D000206 747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698 003698003698003698003698003698003698003698000816002870003698003698003698003698 003698003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5656667242525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030303AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616177C7D7F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A707172B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414142B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5A4A5A7000206003698003698003698003698003698003698003698003698 00369800369800030A002D80003698003698003698003698003698003698003698003698003698 001841001742012B7A011C5000030AAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7B7D181919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52223237172733C3C3D0C0C0C010101FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698 0036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F 3A3A3AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD030303B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4 000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F1218002569003698003698 003698003698003698003698003698003698003698001F5A01133200215D000205071020A3A3A3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698 003698003698003698003698003698003698000816002870003698003698003698003698003698 003698003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5656667242525B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 909192161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303 AAABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617187C7D7FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A707172B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647414142B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5A4A5A7000206003698003698003698003698003698003698003698003698003698 00369800030B002D80003698003698003698003698003698003698003698003698003698001943 001742011C500002050A0F17C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473E3E3FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52223233535360D0D0D808082040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698003698003698 0612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54E4E4F39393A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ABABAD030303B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F1218002569003698003698003698 003698003698003698003698003698003698001F5A000F2B0002050018440C1A32A3A3A3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2227012C7B003698003698003698003698 003698003698003698003698003698000816002870003698003698003698003698003698003698 003698003698003698010E285A5B5CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5656667242425B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5909192 161617B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303AAABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617187C7D7FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B529292A707172B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647404142B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5878889111111B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5A4A5A7000206003698003698003698003698003698003698003698003698003698003698 00030B002D80003698003698003698003698003698003698003698003698003698001943001338 000205001E570F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E100000047484949494A 49494A49494A49494A49494A49494A49494A49494A49494A000000454546484949484949484949 49494A49494A49494A49494A49494A49494A06060620202148494948494948494949494A49494A 49494A49494A49494A49494A00000000000048494948494948494948494949494A49494A49494A 49494A49494A17171800000047484948494948494948494949494A49494A49494A49494A49494A 28292900000047474848494948494948494949494A49494A49494A49494A49494A484849000000 3F3F4048494948494948494949494A49494A49494A49494A49494A49494A000000333334484949 48494948494949494A49494A49494A49494A49494A49494A0707070F0F0F484849484949484949 48494A49494A49494A49494A49494A49494A07070800000048484948494948494948494949494A 49494A49494A49494A49494A27272800000047474848494948494948494949494A49494A49494A 49494A49494A3D3E3E00000047474848494948494948494949494A49494A49494A49494A49494A 49494A0000000101018182848B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF15181C00061101163E01163E01163E01163E01163E01163E01163E01163E01163E060606 09090947484948494948494948494949494A49494A49494A49494A49494A0F0F0F000000474849 48494948494948494949494A49494A49494A49494A49494A2E2F30000000484849484949484949 48494949494A49494A49494A49494A49494A45464600000046474848494948494948494949494A 49494A49494A49494A49494A49494A030303292A2A48494948494948494949494A49494A49494A 49494A49494A49494A04040402020248494948494948494948494A49494A49494A49494A49494A 49494A0D0D0D00000047484948494948494948494949494A49494A49494A49494A49494A1C1C1D 00000047484948494948494948494949494A49494A49494A49494A49494A434344000000474849 48494948494948494949494A49494A49494A49494A49494A49494A0000003C3C3D484949484949 48494949494A49494A49494A49494A49494A49494A00020600071401163D01163E01163D01163E 01163E01163E01163E01163E01163E000207000000001847012B7A0C1A32A3A3A3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF010203010D2501163E01163E01163E01163E01163E 01163E01163E01163E01163E00020500091A01163D01163E01163E01163E01163E01163E01163E 01163E01163E000000000000464749474849474849474849474849474849474849474849474849 16161700000046474947484947484947484947484947484947484947484947484939393B000000 464748474849474849474849474849474849474849474849474849464749000000404042474849 47484947484947484947484947484947484947484947484907070819191A474849474849474849 4748494748494748494748494748494748490707070E0E0E464749474849474849474849474849 474849474849474849474849060607000000464749474849474849474849474849474849474849 474849474849262727000000464749474849474849474849474849474849474849474849474849 42434400000001153D01163E01163E01163D01163E01163E01163E01163E01163E01163E000000 010E2801163D01163E01163D01163E01163E01163E01163E01163E01163E000000000000001E58 012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10000003F40403F40403F4040 3F40403F40403F40403F40403F40403F40403F40400000003A3B3B3F40403F40403F40403F4040 3F40403F40403F40403F40403F40400404043333343F40403F40403F40403F40403F40403F4040 3F40403F40403F40401515162828293F40403F40403F40403F40403F40403F40403F40403F4040 3F40402020220404043F40403F40403F40403F40403F40403F40403F40403F40403F4040303030 0000003F40403F40403F40403F40403F40403F40403F40403F40403F40403F40400000003D3E3F 3F40403F40403F40403F40403F40403F40403F40403F40403F40400000003435363F40403F4040 3F40403F40403F40403F40403F40403F40403F40400C0C0C3636373F40403F40403F40403F4040 3F40403F40403F40403F40403F40402121210505053F40403F40403F40403F40403F40403F4040 3F40403F40403F404029292A0000003F40403F40403F40403F40403F40403F40403F40403F4040 3F404038393A0000003F40403F40403F40403F40403F40403F40403F40403F40403F40403F4040 0B0B0B6A6B6C8F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 34363A00102F0013360013360013360013360013360013360013360013360013360207112F2F30 3F40403F40403F40403F40403F40403F40403F40403F40403F40402222230202023F40403F4040 3F40403F40403F40403F40403F40403F40403F40403636360000003F40403F40403F40403F4040 3F40403F40403F40403F40403F40403C3D3D0000003C3C3D3F40403F40403F40403F40403F4040 3F40403F40403F40403F40400202023B3B3B3F40403F40403F40403F40403F40403F40403F4040 3F40403F40401212132E2E2F3F40403F40403F40403F40403F40403F40403F40403F40403F4040 1D1D1D0606063F40403F40403F40403F40403F40403F40403F40403F40403F40402B2B2C000000 3F40403F40403F40403F40403F40403F40403F40403F40403F40403E3F3F0000003F40403F4040 3F40403F40403F40403F40403F40403F40403F40403F40400000003D3D3E3F40403F40403F4040 3F40403F40403F40403F40403F40403F404004050800112F001336001336001336001336001336 001336001336001336001336000E2A051125012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090A0C001132001336001336001336001336001336001336 001336001336001336000106001130001336001336001336001336001336001336001336001336 001336000511010B22001336001336001336001336001336001336001336001336001336010C24 000000001336001336001336001336001336001336001336001336001336000F2B000000001336 001336001336001336001336001336001336001336001336001336000000001235001336001336 00133600133600133600133600133600133600133600030900112F001336001336001336001336 00133600133600133600133600133600030C000E2A001336001336001336001336001336001336 00133600133600133600091B000104001336001336001336001336001336001336001336001336 001336000F2B000000001336001336001336001336001336001336001336001336001336001131 000000001336001336001336001336001336001336001336001336001336001336000000001133 001336001336001336001336001336001336001336001336001336020C1E001336012B7A012B7A 0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5252525 7172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E 0024650036980036980036980036980036980036980036980036980036980612296A6A6BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343 545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F121800256A003698003698003698003698003698003698 003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698 003698003698000817002870003698003698003698003698003698003698003698003698003698 010E28001B4D003698003698003698003698003698003698003698003698003698001E56000B1F 003698003698003698003698003698003698003698003698003698002B7B000713003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369802091500256A003698003698003698003698003698 003698003698003698003698010B2201225F003698003698003698003698003698003698003698 00369800369801153C001438003698003698003698003698003698003698003698003698003698 00287200050F00369800369800369800369800369800369800369800369800369800318C000206 00369800369800369800369800369800369800369800369800369800369800040B002D80003698 003698003698003698003698003698003698003698003698051D45001742012B7A012B7A0F1521 C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051 474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1 080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5252525717273 8F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465 0036980036980036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 272828636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50F131800256A003698003698003698003698003698003698003698 003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698 003698000817002870003698003698003698003698003698003698003698003698003698010E28 001B4D003698003698003698003698003698003698003698003698003698001E56000B1F003698 003698003698003698003698003698003698003698003698002B7B000713003698003698003698 003698003698003698003698003698003698003698000103003391003698003698003698003698 00369800369800369800369800369802091500256A003698003698003698003698003698003698 003698003698003698010C2301225F003698003698003698003698003698003698003698003698 00369801153C001438003698003698003698003698003698003698003698003698003698002872 00050F00369800369800369800369800369800369800369800369800369800318C000206003698 00369800369800369800369800369800369800369800369800369801040B002D80003698003698 003698003698003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F9092 8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698 0036980036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828 636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50F131800256A003698003698003698003698003698003698003698003698 003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698 000817002870003698003698003698003698003698003698003698003698003698010E28001B4D 003698003698003698003698003698003698003698003698003698001E56000B1F003698003698 003698003698003698003698003698003698003698002B7B000713003698003698003698003698 003698003698003698003698003698003698000103003391003698003698003698003698003698 00369800369800369800369802091500256A003698003698003698003698003698003698003698 003698003698010C2301225F003698003698003698003698003698003698003698003698003698 01153C00143800369800369800369800369800369800369800369800369800369800287200050F 00369800369800369800369800369800369800369800369800369800318C000206003698003698 00369800369800369800369800369800369800369800369801040B002D80003698003698003698 003698003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F30 58595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F 2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D 040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698 0036980036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1010108F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50F131800256A003698003698003698003698003698003698003698003698003698 001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698000817 002870003698003698003698003698003698003698003698003698003698010E28001B4D003698 003698003698003698003698003698003698003698003698001E56000B1F003698003698003698 003698003698003698003698003698003698002B7B000713003698003698003698003698003698 003698003698003698003698003698000103003391003698003698003698003698003698003698 00369800369800369802091500256A003698003698003698003698003698003698003698003698 003698010C2301225F00369800369800369800369800369800369800369800369800369801153C 00143800369800369800369800369800369800369800369800369800369800287200050F003698 00369800369800369800369800369800369800369800369800318C000206003698003698003698 00369800369800369800369800369800369800369801040B002D80003698003698003698003698 003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698 0036980036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 AAABAD040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5101010 8F9092B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272828636364B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50F131800256A003698003698003698003698003698003698003698003698003698001F5A 081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F2228012C7B003698003698003698003698003698003698003698003698003698000817002870 003698003698003698003698003698003698003698003698003698010E28001B4D003698003698 003698003698003698003698003698003698003698001E56000B1F003698003698003698003698 003698003698003698003698003698002B7B000713003698003698003698003698003698003698 003698003698003698003698000103003391003698003698003698003698003698003698003698 00369800369802091500256A003698003698003698003698003698003698003698003698003698 010C2301225F00369800369800369800369800369800369800369800369800369801153C001438 00369800369800369800369800369800369800369800369800369800287200050F003698003698 00369800369800369800369800369800369800369800318C000206003698003698003698003698 00369800369800369800369800369800369801040B002D80003698003698003698003698003698 003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51F1F1F717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 3F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52223237172738F90928B8C8D040404FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698 0036980036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54D4E4E3A3B3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD 040404B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5070707A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E121800256A003698003698003698003698003698003698003698003698003698001F5A061633 012B7A012B7A09172FA3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228 012C7B003698003698003698003698003698003698003698003698003698000817002870003698 003698003698003698003698003698003698003698003698010E28001B4D003698003698003698 003698003698003698003698003698003698001E56000B1F003698003698003698003698003698 003698003698003698003698002B7B000713003698003698003698003698003698003698003698 003698003698003698000103003391003698003698003698003698003698003698003698003698 00369801091400256A003698003698003698003698003698003698003698003698003698010C23 01225F00369800369800369800369800369800369800369800369800369801153C001438003698 00369800369800369800369800369800369800369800369800287200050E003698003698003698 00369800369800369800369800369800369800318C000206003698003698003698003698003698 00369800369800369800369800369800040B002D80003698003698003698003698003698003698 003698003698003698041B44001742012B7A012B7A0C131EC9C9C9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314858687 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051464748B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D181819B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1E1E717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473E3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D7172738F90926F7071030303FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698 0036980036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54D4E4E3A3A3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9192940C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0F0F8F9092B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272727636364B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5060606A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D1016 00256A003698003698003698003698003698003698003698003698003698001F5A00112E012B7A 002872000713494949FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B 003698003698003698003698003698003698003698003698003698000816002870003698003698 003698003698003698003698003698003698003698010E28001B4D003698003698003698003698 003698003698003698003698003698001E56000B1F003698003698003698003698003698003698 003698003698003698002B7B000713003698003698003698003698003698003698003698003698 003698003698000102003391003698003698003698003698003698003698003698003698003698 00071300256A003698003698003698003698003698003698003698003698003698010C2301225F 00369800369800369800369800369800369800369800369800369801153C001337003698003698 00369800369800369800369800369800369800369800287200050E003698003698003698003698 00369800369800369800369800369800318C000206003698003698003698003698003698003698 00369800369800369800369800030A002D80003698003698003698003698003698003698003698 003698003698011740001742012B7A01266D0003097D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F 717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52223237172735C5D5E060606000000FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698 0036980036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54D4E4E3A3A3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5919294 0C0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56A6B6C232324B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 060607A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D111700256A 003698003698003698003698003698003698003698003698003698001F5A01133201266E00040D 040B15A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698 003698003698003698003698003698003698003698003698000816002870003698003698003698 003698003698003698003698003698003698010E28001B4D003698003698003698003698003698 003698003698003698003698001E56000B1F003698003698003698003698003698003698003698 003698003698002B7B000713003698003698003698003698003698003698003698003698003698 003698000103003391003698003698003698003698003698003698003698003698003698000714 00256A003698003698003698003698003698003698003698003698003698010C2301225F003698 00369800369800369800369800369800369800369800369801153C001338003698003698003698 00369800369800369800369800369800369800287200050E003698003698003698003698003698 00369800369800369800369800318C000206003698003698003698003698003698003698003698 00369800369800369800030B002D80003698003698003698003698003698003698003698003698 003698001943001742002364000206060A0FC9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415858687B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7B7D181919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F1F1F717273 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473E3F3FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52223235555570606066A6B6D040404FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698003698003698 0036980036980612296A6A6BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4D4E4E393A3BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59192940C0C0C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5AAABAD040404B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50F0F108F9092B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5272728636364B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424343545556B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56A6B6C232323B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B1B2B4000000B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5060607 A5A6A8B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D111700256A003698 003698003698003698003698003698003698003698003698001F5A01112E00040D00102C0C1A32 A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698 003698003698003698003698003698003698003698000816002870003698003698003698003698 003698003698003698003698003698010E28001B4D003698003698003698003698003698003698 003698003698003698001E56000B1F003698003698003698003698003698003698003698003698 003698002B7B000713003698003698003698003698003698003698003698003698003698003698 00010300339100369800369800369800369800369800369800369800369800369800071400256A 003698003698003698003698003698003698003698003698003698010C2301225F003698003698 00369800369800369800369800369800369800369801153C001337003698003698003698003698 00369800369800369800369800369800287200050E003698003698003698003698003698003698 00369800369800369800318C000206003698003698003698003698003698003698003698003698 00369800369800030B002D80003698003698003698003698003698003698003698003698003698 00194301153D00020601163F0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAEAEA000000 757577757577757577757577757577757577757577757577757577757577000000747576757577 7575777575777575777575777575777575777575777575770F0F106A6A6B757577757577757577 7575777575777575777575777575777575771D1D1E49494A757577757577757577757577757577 7575777575777575777575773D3D3E39393A757577757577757577757577757577757577757577 75757775757758595A101010757577757577757577757577757577757577757577757577757577 757577000000727374757577757577757577757577757577757577757577757577757577080808 6F7071757577757577757577757577757577757577757577757577757577191919626264757577 757577757577757577757577757577757577757577757577313132313132757577757577757577 7575777575777575777575777575777575774C4D4D232323757577757577757577757577757577 757577757577757577757577696A6B020202757577757577757577757577757577757577757577 7575777575777575770808080303036B6C6E8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF24272C001F57002364002364002364002364002364002364002364002364 0023640610235A5B5C7575777575777575777575777575777575777575777575777575773F3F40 2C2D2D7575777575777575777575777575777575777575777575777575775F6061060606757577 7575777575777575777575777575777575777575777575776F6F71000000757577757577757577 7575777575777575777575777575777575777575770B0B0B6C6D6E757577757577757577757577 757577757577757577757577757577171718535455757577757577757577757577757577757577 757577757577757577343435464647757577757577757577757577757577757577757577757577 7575774F5051191919757577757577757577757577757577757577757577757577757577727274 000000757577757577757577757577757577757577757577757577757577757577020202717273 757577757577757577757577757577757577757577757577757577090C12001F58002364002364 002364002364002364002364002364002364002364001B4C00000000102C012B7A0C1A32A3A3A3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080B1000215C002364002364002364 002364002364002364002364002364002364000611001F5A002364002364002364002364002364 002364002364002364002364010B22011640002364002364002364002364002364002364002364 002364002364001742000816002364002364002364002364002364002364002364002364002364 011C5100040D002364002364002364002364002364002364002364002364002364002364000000 00226200236400236400236400236400236400236400236400236400236400040C001F58002364 002364002364002364002364002364002364002364002364000A1D011D52002364002364002364 002364002364002364002364002364002364001234000F2C002364002364002364002364002364 002364002364002364002364001A4B000308002364002364002364002364002364002364002364 00236400236400205C000001002364002364002364002364002364002364002364002364002364 00236400020701215E00236400236400236400236400236400236400236400236400236400112F 00000001163F012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED070707212222 2122222122222122222122222122222122222122222122222121220808081B1B1B212122212122 202121212222212222212222212222212222212122070808151515212122212122202121212222 212222212222212222212222212121010101141414212122212122202121212122212222212222 2122222122222122220D0E0E070708202121212122202121212121212222212222212222212222 2122221414140707082021212121222121212121212122222122222122222122222122221F1F20 0606071F2020212122212121202121212222212222212222212222212222212122080808171717 212122212122202121212222212222212222212222212222212222080808111212212122212122 202121212122212222212222212222212222212122050505070707212122212122202121212122 2122222122222122222122222122221212120A0A0A202121212122212121202121212222212222 2122222122222122221D1E1E0808081F2020212122212121202121212222212222212222212222 2122221F20200505056B6C6D8F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF272A2F000815000A1D000A1D000A1D000A1D000A1D000A1D000A1D000A1D000A1D 02030807090C09101E09101E09101E09101E09111E09111E09111E09111E09111E060709080809 09101E09101E09101E09101E09111E09111E09111E09111E09111E060C1507070809101E09101E 09101E09101E09111E09111E09111E09111E09111E080F1A09090909101D09101E09101E09101D 09111E09111E09111E09111E09111E09111E070707080D1509101E09101E09101D09111E09111E 09111E09111E09111E09111E020305070C1409101E09101E09101D09111E09111E09111E09111E 09111E09111E06080A08080809101E09101E09101E09101E09111E09111E09111E09111E09111E 06090E090A0A09101E09101E09101E09101E09111E09111E09111E09111E09111E080F1B070707 09101E09101E09101E09101D09111E09111E09111E09111E09111E09101D090909090F1A09101E 09101E09101D09111E09111E09111E09111E09111E09111E030407000510000A1C000A1C000A1B 000A1C000A1D000A1D000A1D000A1D000A1C000207031127012B7A012B7A0C1A32A3A3A3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF030509000918000A1D000A1D000A1D000A1D 000A1D000A1D000A1D000A1D000A1C000105000714000A1C000A1C000A1B000A1C000A1D000A1D 000A1D000A1D000A1C00010400050F000A1C000A1C000A1C000A1C000A1D000A1D000A1D000A1D 000A1D00020A000206000A1C000A1C000A1C000A1C000A1D000A1D000A1D000A1D000A1D000817 00020700091A000A1C000A1C000A1C000A1D000A1D000A1D000A1D000A1D00091A00020800091A 000A1C000A1C000A1B000A1D000A1D000A1D000A1D000A1D000A1D000207000715000A1C000A1C 000A1B000A1C000A1D000A1D000A1D000A1D000A1C00020600050F000A1C000A1C000A1C000A1C 000A1D000A1D000A1D000A1D000A1D000208000206000A1C000A1C000A1C000A1C000A1D000A1D 000A1D000A1D000A1D00040F000207000A1C000A1C000A1C000A1C000A1D000A1D000A1D000A1D 000A1D00081800020800091B000A1C000A1C000A1B000A1D000A1D000A1D000A1D000A1D000A1D 000105000715000A1C000A1C000A1B000A1D000A1D000A1D000A1D000A1D000A1C00010300143A 012B7A012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51F2020717273B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF45494E002465003698003698003698003698003698003698003698003698003698010D27 00205A003698003698003698003698003698003698003698003698003698001742001131003698 003698003698003698003698003698003698003698003698002B7C00030A003698003698003698 003698003698003698003698003698003698003391000103003698003698003698003698003698 00369800369800369800369800369801050D012B7A003698003698003698003698003698003698 003698003698003698010C22001E54003698003698003698003698003698003698003698003698 003698001439001A4800369800369800369800369800369800369800369800369800369800205A 000B1E003698003698003698003698003698003698003698003698003698003597000000003698 00369800369800369800369800369800369800369800369800369800020500328D003698003698 00369800369800369800369800369800369800369802091600256A003698003698003698003698 003698003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698 003698003698003698003698000817002870003698003698003698003698003698003698003698 003698003698010E28001B4D003698003698003698003698003698003698003698003698003698 001E56000B1F003698003698003698003698003698003698003698003698003698002B7B000713 003698003698003698003698003698003698003698003698003698003698000102003391003698 00369800369800369800369800369800369800369800369802091500256A003698003698003698 003698003698003698003698003698003698010B2201225F003698003698003698003698003698 00369800369800369800369801153C001438003698003698003698003698003698003698003698 00369800369800287200050F003698003698003698003698003698003698003698003698003698 00318C00020600369800369800369800369800369800369800369800369800369800369800040B 002D80003698003698003698003698003698003698003698003698003698051D45001742012B7A 012B7A0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D 191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2525257172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 45494E002465003698003698003698003698003698003698003698003698003698010E2800205A 003698003698003698003698003698003698003698003698003698001742001131003698003698 003698003698003698003698003698003698003698002B7C00030A003698003698003698003698 003698003698003698003698003698003391000103003698003698003698003698003698003698 00369800369800369800369801050E012B7A003698003698003698003698003698003698003698 003698003698010C22001E54003698003698003698003698003698003698003698003698003698 001439001A4800369800369800369800369800369800369800369800369800369800205A000B1E 003698003698003698003698003698003698003698003698003698003597000000003698003698 00369800369800369800369800369800369800369800369800020600328D003698003698003698 00369800369800369800369800369800369802091600256A003698003698003698003698003698 003698003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698 003698003698003698000817002870003698003698003698003698003698003698003698003698 003698010E28001B4D003698003698003698003698003698003698003698003698003698001E56 000B1F003698003698003698003698003698003698003698003698003698002B7B000713003698 003698003698003698003698003698003698003698003698003698000103003391003698003698 00369800369800369800369800369800369800369802091500256A003698003698003698003698 003698003698003698003698003698010C2301225F003698003698003698003698003698003698 00369800369800369801153C001438003698003698003698003698003698003698003698003698 00369800287200050F00369800369800369800369800369800369800369800369800369800318C 00020600369800369800369800369800369800369800369800369800369800369801040B002D80 003698003698003698003698003698003698003698003698003698051D45001742012B7A012B7A 0F1521C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 505051474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 9E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5252525 7172738F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E 002465003698003698003698003698003698003698003698003698003698010E2800205A003698 003698003698003698003698003698003698003698003698001742001131003698003698003698 003698003698003698003698003698003698002B7C00030A003698003698003698003698003698 003698003698003698003698003391000103003698003698003698003698003698003698003698 00369800369800369801050E012B7A003698003698003698003698003698003698003698003698 003698010C22001E54003698003698003698003698003698003698003698003698003698001439 001A4800369800369800369800369800369800369800369800369800369800205A000B1E003698 003698003698003698003698003698003698003698003698003597000000003698003698003698 00369800369800369800369800369800369800369800020600328D003698003698003698003698 00369800369800369800369800369802091600256A003698003698003698003698003698003698 003698003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698 003698003698000817002870003698003698003698003698003698003698003698003698003698 010E28001B4D003698003698003698003698003698003698003698003698003698001E56000B1F 003698003698003698003698003698003698003698003698003698002B7B000713003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369802091500256A003698003698003698003698003698 003698003698003698003698010C2301225F003698003698003698003698003698003698003698 00369800369801153C001438003698003698003698003698003698003698003698003698003698 00287200050F00369800369800369800369800369800369800369800369800369800318C000206 00369800369800369800369800369800369800369800369800369800369801040B002D80003698 003698003698003698003698003698003698003698003698051D45001742012B7A012B7A0F1521 C9C9C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051 474748B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1 080808B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5252525717273 8F90928B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465 003698003698003698003698003698003698003698003698003698010E2800205A003698003698 003698003698003698003698003698003698003698001742001131003698003698003698003698 003698003698003698003698003698002B7C00030A003698003698003698003698003698003698 003698003698003698003391000103003698003698003698003698003698003698003698003698 00369800369801050E012B7A003698003698003698003698003698003698003698003698003698 010C22001E54003698003698003698003698003698003698003698003698003698001439001A48 00369800369800369800369800369800369800369800369800369800205A000B1E003698003698 003698003698003698003698003698003698003698003597000000003698003698003698003698 00369800369800369800369800369800369800020600328D003698003698003698003698003698 00369800369800369800369802091600256A003698003698003698003698003698003698003698 003698003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698 003698000817002870003698003698003698003698003698003698003698003698003698010E28 001B4D003698003698003698003698003698003698003698003698003698001E56000B1F003698 003698003698003698003698003698003698003698003698002B7B000713003698003698003698 003698003698003698003698003698003698003698000103003391003698003698003698003698 00369800369800369800369800369802091500256A003698003698003698003698003698003698 003698003698003698010C2301225F003698003698003698003698003698003698003698003698 00369801153C001438003698003698003698003698003698003698003698003698003698002872 00050F00369800369800369800369800369800369800369800369800369800318C000206003698 00369800369800369800369800369800369800369800369800369801040B002D80003698003698 003698003698003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2F2F3058595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6D6D6F2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F9092 8B8C8D040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698 003698003698003698003698003698003698003698003698010E2800205A003698003698003698 003698003698003698003698003698003698001742001131003698003698003698003698003698 003698003698003698003698002B7C00030A003698003698003698003698003698003698003698 003698003698003391000103003698003698003698003698003698003698003698003698003698 00369801050E012B7A003698003698003698003698003698003698003698003698003698010C22 001E54003698003698003698003698003698003698003698003698003698001439001A48003698 00369800369800369800369800369800369800369800369800205A000B1E003698003698003698 003698003698003698003698003698003698003597000000003698003698003698003698003698 00369800369800369800369800369800020600328D003698003698003698003698003698003698 00369800369800369802091600256A003698003698003698003698003698003698003698003698 003698001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698 000817002870003698003698003698003698003698003698003698003698003698010E28001B4D 003698003698003698003698003698003698003698003698003698001E56000B1F003698003698 003698003698003698003698003698003698003698002B7B000713003698003698003698003698 003698003698003698003698003698003698000103003391003698003698003698003698003698 00369800369800369800369802091500256A003698003698003698003698003698003698003698 003698003698010C2301225F003698003698003698003698003698003698003698003698003698 01153C00143800369800369800369800369800369800369800369800369800369800287200050F 00369800369800369800369800369800369800369800369800369800318C000206003698003698 00369800369800369800369800369800369800369800369801040B002D80003698003698003698 003698003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F30 58595AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F 2E2E2FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90928B8C8D 040404FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698 003698003698003698003698003698003698003698010E2800205A003698003698003698003698 003698003698003698003698003698001742001131003698003698003698003698003698003698 003698003698003698002B7C00030A003698003698003698003698003698003698003698003698 003698003391000103003698003698003698003698003698003698003698003698003698003698 01050E012B7A003698003698003698003698003698003698003698003698003698010C22001E54 003698003698003698003698003698003698003698003698003698001439001A48003698003698 00369800369800369800369800369800369800369800205A000B1E003698003698003698003698 003698003698003698003698003698003597000000003698003698003698003698003698003698 00369800369800369800369800020600328D003698003698003698003698003698003698003698 00369800369802091600256A003698003698003698003698003698003698003698003698003698 001F5A081835012B7A012B7A0C1A32A3A3A3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF1F2228012C7B003698003698003698003698003698003698003698003698003698000817 002870003698003698003698003698003698003698003698003698003698010E28001B4D003698 003698003698003698003698003698003698003698003698001E56000B1F003698003698003698 003698003698003698003698003698003698002B7B000713003698003698003698003698003698 003698003698003698003698003698000103003391003698003698003698003698003698003698 00369800369800369802091500256A003698003698003698003698003698003698003698003698 003698010C2301225F00369800369800369800369800369800369800369800369800369801153C 00143800369800369800369800369800369800369800369800369800369800287200050F003698 00369800369800369800369800369800369800369800369800318C000206003698003698003698 00369800369800369800369800369800369800369801040B002D80003698003698003698003698 003698003698003698003698003698051D45001742012B7A012B7A0F1521C9C9C9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151515858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4646473F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172738F90927E7F810A0A0A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698 003698003698003698003698003698003698010E2800205A003698003698003698003698003698 003698003698003698003698001742001131003698003698003698003698003698003698003698 003698003698002B7C00030A003698003698003698003698003698003698003698003698003698 00339100010300369800369800369800369800369800369800369800369800369800369801050E 012B7A003698003698003698003698003698003698003698003698003698010C22001E54003698 003698003698003698003698003698003698003698003698001439001A48003698003698003698 00369800369800369800369800369800369800205A000B1E003698003698003698003698003698 003698003698003698003698003597000000003698003698003698003698003698003698003698 00369800369800369800020600328D003698003698003698003698003698003698003698003698 00369802091600256A003698003698003698003698003698003698003698003698003698001F5A 081835012B7A012A78121D2F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F2228012C7B003698003698003698003698003698003698003698003698003698000817002870 003698003698003698003698003698003698003698003698003698010E28001B4D003698003698 003698003698003698003698003698003698003698001E56000B1F003698003698003698003698 003698003698003698003698003698002B7B000713003698003698003698003698003698003698 003698003698003698003698000103003391003698003698003698003698003698003698003698 00369800369802091500256A003698003698003698003698003698003698003698003698003698 010C2301225F00369800369800369800369800369800369800369800369800369801153C001438 00369800369800369800369800369800369800369800369800369800287200050F003698003698 00369800369800369800369800369800369800369800318C000206003698003698003698003698 00369800369800369800369800369800369801040B002D80003698003698003698003698003698 003698003698003698003698051D45001742012B7A002974121720ADADADFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515 858687B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5464647 3F3F40B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525257172736D6E6F0E0E0EBDBDBDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698 003698003698003698003698003698010E2800205A003698003698003698003698003698003698 003698003698003698001742001131003698003698003698003698003698003698003698003698 003698002B7C00030A003698003698003698003698003698003698003698003698003698003391 00010300369800369800369800369800369800369800369800369800369800369801050E012B7A 003698003698003698003698003698003698003698003698003698010C22001E54003698003698 003698003698003698003698003698003698003698001439001A48003698003698003698003698 00369800369800369800369800369800205A000B1E003698003698003698003698003698003698 003698003698003698003597000000003698003698003698003698003698003698003698003698 00369800369800020600328D003698003698003698003698003698003698003698003698003698 02091600256A003698003698003698003698003698003698003698003698003698001F5A081835 0029740A12215C5E61FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228 012C7B003698003698003698003698003698003698003698003698003698000817002870003698 003698003698003698003698003698003698003698003698010E28001B4D003698003698003698 003698003698003698003698003698003698001E56000B1F003698003698003698003698003698 003698003698003698003698002B7B000713003698003698003698003698003698003698003698 003698003698003698000103003391003698003698003698003698003698003698003698003698 00369802091500256A003698003698003698003698003698003698003698003698003698010C23 01225F00369800369800369800369800369800369800369800369800369801153C001438003698 00369800369800369800369800369800369800369800369800287200050F003698003698003698 00369800369800369800369800369800369800318C000206003698003698003698003698003698 00369800369800369800369800369801040B002D80003698003698003698003698003698003698 003698003698003698051D4500174201266E0A0E17838485FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F10A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 010101AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515858687 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52F2F3058595AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505051474748B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7B7D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D9A9B9DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 202020717273B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54646473F3F40 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56D6D6F2E2E2FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B59E9FA1080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52525256666680E0E0EBDBDBDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45494E002465003698003698003698003698003698 003698003698003698003698010E2800205A003698003698003698003698003698003698003698 003698003698001742001131003698003698003698003698003698003698003698003698003698 002B7C00030A003698003698003698003698003698003698003698003698003698003391000103 00369800369800369800369800369800369800369800369800369800369801050E012B7A003698 003698003698003698003698003698003698003698003698010C22001E54003698003698003698 003698003698003698003698003698003698001439001A48003698003698003698003698003698 00369800369800369800369800205A000B1E003698003698003698003698003698003698003698 003698003698003597000000003698003698003698003698003698003698003698003698003698 00369800020600328D003698003698003698003698003698003698003698003698003698020916 00256A003698003698003698003698003698003698003698003698003698001F5A0717340A1221 5C5E61FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F2228012C7B 003698003698003698003698003698003698003698003698003698000817002870003698003698 003698003698003698003698003698003698003698010E28001B4D003698003698003698003698 003698003698003698003698003698001E56000B1F003698003698003698003698003698003698 003698003698003698002B7B000713003698003698003698003698003698003698003698003698 003698003698000103003391003698003698003698003698003698003698003698003698003698 02091500256A003698003698003698003698003698003698003698003698003698010C2301225F 00369800369800369800369800369800369800369800369800369801153C001438003698003698 00369800369800369800369800369800369800369800287200050F003698003698003698003698 00369800369800369800369800369800318C000206003698003698003698003698003698003698 00369800369800369800369801040B002D80003698003698003698003698003698003698003698 003698003698051D450116400A0E17838485FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1F1F10505058F90928F90928F90928F90928F90928F90928F90928F90928F90928F9092000000 8F8F918F90928F90928F90928F90928F90928F90928F90928F90928F90921111117C7D7F8F9092 8F90928F90928F90928F90928F90928F90928F90928F90922B2B2B5050518F90928F90928F9092 8F90928F90928F90928F90928F90928F90924B4C4C3F3F408F90928F90928F90928F90928F9092 8F90928F90928F90928F90926E6E6F1313138F90928F90928F90928F90928F90928F90928F9092 8F90928F90928F90920202028D8D8F8F90928F90928F90928F90928F90928F90928F90928F9092 8F90920A0A0A8A8A8C8F90928F90928F90928F90928F90928F90928F90928F90928F90921C1C1C 69696B8F90928F90928F90928F90928F90928F90928F90928F90928F90924041423636378F9092 8F90928F90928F90928F90928F90928F90928F90928F90925E5F602828288F90928F90928F9092 8F90928F90928F90928F90928F90928F90928283840505058F90928F90928F90928F90928F9092 8F90928F90928F90928F90928F9092141414040404BDBDBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44474C01215E012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A010D24001D53012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A01153D000F2A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A002569 000207012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A002974000001012B7A 012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A01040C002973012B7A012B7A 012B7A012B7A012B7A012B7A012B7A012B7A012B7A000B1F001B4D012B7A012B7A012B7A012B7A 012B7A012B7A012B7A012B7A012B7A001234001741012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A001E55000818012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012A79000000012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 000103002A77012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A020814002362 012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A011D5204060A5C5E61FEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C1F24002973012B7A 012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A000714002569012B7A012B7A012B7A 012B7A012B7A012B7A012B7A012B7A012B7A010C24001846012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A012B7A011C5100091A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012B7A002263000510012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A000001012A79012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A020813 002363012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A000B20001F58012B7A 012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A001337001131012B7A012B7A012B7A 012B7A012B7A012B7A012B7A012B7A012B7A00236400040B012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A012B7A002770000103012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A012B7A012B7A000309002974012B7A012B7A012B7A012B7A012B7A012B7A012B7A012B7A 012B7A04183A020304838485FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB 3E3E3E2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B282828080808252525 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2828290707071515152B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A0000000505052B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0F0F0F0909092B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B1616161414152A2A2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2626260808082525252B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B282829 0909091C1C1C2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B0405050A0A0A 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2A2A2A0505050D0D0D2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B1919190808092A2A2A2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2929290808082727272B2B2B2B2B2B2B2B2B2B2B2B2B2B2B 2B2B2B2B2B2B2B2B2B272727000000DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9EA0A30F101321242A21242A21242A21242A21242A21242A21242A 21242A21242A080A0E01020420232921242A21242A21242A21242A21242A21242A21242A21242A 050607090B0E20242921242A21242A21242A21242A21242A21242A21242A21242A1B1E23000206 1D212621242A21242A21242A21242A21242A21242A21242A21242A1C1F240002061C202521242A 21242A21242A21242A21242A21242A21242A21242A21242A0003070E101421242A21242A21242A 21242A21242A21242A21242A21242A21242A05070902030521242A21242A21242A21242A21242A 21242A21242A21242A21242A07080A03040520232921242A21242A21242A21242A21242A21242A 21242A21242A0C0D100B0E1220232921242A21242A21242A21242A21242A21242A21242A21242A 1C1F240002061F222821242A21242A21242A21242A21242A21242A21242A21242A1E2126000207 171A2021242A21242A21242A21242A21242A21242A21242A21242A21242A00020508090C21242A 21242A21242A21242A21242A21242A21242A21242A2023290000009EA1A5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71747817191D21242A21242A 21242A21242A21242A21242A21242A21242A1F22280002060C0E1221242A21242A21242A21242A 21242A21242A21242A21242A20232900000004040621242A21242A21242A21242A21242A21242A 21242A21242A21242A0B0C0E0C0E1220232921242A21242A21242A21242A21242A21242A21242A 21242A1F21270002061B1F2421242A21242A21242A21242A21242A21242A21242A21242A1C1F24 0002071C1F2421242A21242A21242A21242A21242A21242A21242A21242A21242A000206090A0D 21242A21242A21242A21242A21242A21242A21242A21242A20232900020408090C21242A21242A 21242A21242A21242A21242A21242A21242A21242A0C0D0F01020520232921242A21242A21242A 21242A21242A21242A21242A21242A1315180C0F1420232921242A21242A21242A21242A21242A 21242A21242A21242A1B1E230002061D202621242A21242A21242A21242A21242A21242A21242A 21242A21242A00020710121721242A21242A21242A21242A21242A21242A21242A21242A1F2228 000000B1B2B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6B5B5B5B4B4B4CECECE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBC6C6C6F4F4F4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D19F9F9FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 B5B5B5B4B4B4CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBC6C6C6 F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D1 9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D6D6D69B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B0B0000000363636767676FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF9C9C9C 848484FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4141415B5B5BFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AFAFAFA0A0A0A0A0A0A0A0A0A0A0A0B7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B0B0000000 363636767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4 FFFFFFFFFFFF9C9C9C848484FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4141415B5B5B FFFFFFFFFFFFFFFFFFD4D4D48E8E8E808080A9A9A9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB959595D9D9D9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFD0D0D0 000000D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF474747272727 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000B3B3B3FFFFFFFFFFFFFFFFFFD8D8D8 3C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9000000 0909090D0D0D0D0D0D0D0D0D3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC8D8D8D0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF282828767676FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFF FFFFFF474747272727FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000B3B3B3FFFFFF FFFFFF7575750000001E1E1E1D1D1D000000313131F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD4D4D4050505000000838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC8D8D8D0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF282828 767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFEFEFEFCFCFCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C111111F9F9F9FFFFFFFFFFFFB5B5B5090909686868 343434393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7000000B6B6B6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D 2323237B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF FEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C111111F9F9F9FFFFFFFFFFFF 838383CBCBCBFFFFFFFFFFFF777777000000939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4242425A5A5A050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3D3D3D2323237B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF7F7F7F181818 FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FBFBFBA5A5A5 858585BABABAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECA2A2A2808080 959595DCDCDCFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFE9E9E9989898 808080AEAEAEFCFCFCFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFC4C4C4B6B6B6FFFFFFFFFFFF FFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFD7D7D79797978C8C8CC2C2C2 FFFFFFFFFFFFFFFFFFFFFFFF2E2E2E5C5C5CFFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7000000B6B6B6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8 C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF FFFFFFE9E9E9989898808080AEAEAEFCFCFCFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFC4C4C4 B6B6B6FFFFFFFFFFFFFFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFD7D7D7 9797978C8C8CC2C2C2FFFFFFFFFFFFFFFFFFFFFFFF2E2E2E5C5C5CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDCDCDC0000006D6D6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFA9A9A90C0C0CE5E5E5050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9A9A9AF8F8F8C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0000000BDBDBD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858582424243434342323232B2B2B 000000636363FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C89B9B9B9B9B9B9B9B9B9B9B9B 9B9B9B9B9B9BCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D10B0B0B2A2A2A505050242424 060606C0C0C0FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFD9D9D91010103939395C5C5C 1F1F1FA0A0A0FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFFFFFFDEDEDE 2424241212123F3F3F151515292929FFFFFFFFFFFF939393060606444444343434000000666666 FFFFFFFFFFFFF5F5F5030303808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7000000B6B6B6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DEDEDE2424241212123F3F3F151515292929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C89B9B9B 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9BCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D10B0B0B 2A2A2A505050242424060606C0C0C0FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFD9D9D9 1010103939395C5C5C1F1F1FA0A0A0FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434 FFFFFFFFFFFFDEDEDE2424241212123F3F3F151515292929FFFFFFFFFFFF939393060606444444 343434000000666666FFFFFFFFFFFFF5F5F5030303808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFCACACA000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5 1D1D1D8A8A8AFFFFFF050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFF4F4F4000000969696FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580000007A7A7AFEFEFEFFFFFF7C7C7C 000000CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C262626262626262626262626262626 262626868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626 535353FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF797979202020FEFEFEFFFFFFFBFBFB F1F1F1FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFFFFFF5050501B1B1B EAEAEAFFFFFFF7F7F78E8E8EFFFFFFDADADA0404049A9A9AFFFFFFFFFFFFA0A0A0000000C0C0C0 FFFFFFCCCCCC0000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8000000131313151515303030686868 E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF505050 1B1B1BEAEAEAFFFFFFF7F7F78E8E8EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C262626262626 262626262626262626262626868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3C3C3C3FFFFFF FFFFFFFAFAFA262626535353FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF797979202020 FEFEFEFFFFFFFBFBFBF1F1F1FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFF FFFFFF5050501B1B1BEAEAEAFFFFFFF7F7F78E8E8EFFFFFFDADADA0404049A9A9AFFFFFFFFFFFF A0A0A0000000C0C0C0FFFFFFCCCCCC0000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6D6D6D020202D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A272727 FAFAFAFFFFFF050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010747474FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858582C2C2CFFFFFFFFFFFFFFFFFFEBEBEB000000 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535 FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF8D8D8D060606B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFAFAFA030303606060FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8383830E0E0EFEFEFEFFFFFFFFFFFFF4F4F4060606808080FFFFFF B9B9B9000000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFABABABB0B0B0ADADAD8080801313131C1C1C EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA030303606060 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858353535FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF8D8D8D060606B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFAFAFA 030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8383830E0E0EFEFEFEFFFFFFFFFFFFF4F4F4 060606808080FFFFFFB9B9B9000000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE 040404707070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDBDB070707B9B9B9FFFFFF FFFFFF050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF0F0F0F696969 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C25B5B5B3434342222220C0C0C323232FFFFFF FFFFFFADADAD000000F3F3F3FFFFFFFFFFFFF6F6F64C4C4C000000363636ACACACFFFFFFFFFFFF D8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFDADADA0000009C9C9CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5F5F5F0101010D0D0D0D0D0D0D0D0D0D0D0D010101747474FFFFFFB0B0B0 000000C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B6000000969696 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA0000009C9C9CFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C25B5B5B343434222222 0C0C0C323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFF6F6F64C4C4C000000363636 ACACACFFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFDADADA000000 9C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F0101010D0D0D0D0D0D0D0D0D0D0D0D010101 747474FFFFFFB0B0B0000000C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E71D1D1D393939 F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B4B4B515151FFFFFFFFFFFFFFFFFF 050505838383FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF080808787878FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF676767040404040404040404040404040404040404727272FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2D2D2D24C4C4C323232FFFFFFFFFFFF ADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFC9C9C95656560000008F8F8FFFFFFFD8D8D8 000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFDDDDDD000000A0A0A0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF676767171717E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2FAFAFAFFFFFFBEBEBE000000 A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC0000007B7B7BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F1F1F4B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD000000A0A0A0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767040404040404040404040404040404 040404727272FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2D2D2D24C4C4C 323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFC9C9C9565656000000 8F8F8FFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFDDDDDD000000A0A0A0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767171717E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2FAFAFA FFFFFFBEBEBE000000A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0313131262626ECECECFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1000000171717242424242424242424000000 121212282828F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F4B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5858581B1B1BEDEDEDFFFFFFFFFFFFCBCBCB000000A0A0A0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDDDDDDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDE0E0E0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF616161222222FFFFFFFFFFFFFFFFFF595959323232FFFFFFFFFFFFADADAD 000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4646463E3E3EFFFFFFD8D8D8000000 B4B4B4FFFFFFFFFFFF585858343434FFFFFFFBFBFB060606686868FFFFFFFFFFFFFFFFFFFBFBFB FFFFFF8D8D8D030303E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D80000008D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC000000A6A6A6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFDFDFD050505656565FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB060606686868FFFFFFFFFFFFFFFFFF FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF616161222222FFFFFFFFFFFFFFFFFF595959323232 FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4646463E3E3E FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFBFBFB060606686868FFFFFF FFFFFFFFFFFFFBFBFBFFFFFF8D8D8D030303E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D8D8D80000008D8D8DFFFFFFFFFFFFFFFFFFF4F4F43A3A3A1F1F1FE1E1E1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA0A0A09C9C9C9C9C9C9C9C9C9C9C9C030303505050 A0A0A0FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFDFDFD050505656565FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5858580404042E2E2EBABABACBCBCB313131141414F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF777777020202BCBCBCF1F1F1919191040404323232FFFFFFFFFFFFADADAD000000 F3F3F3FFFFFFFFFFFF808080BCBCBCF7F7F7DADADA202020656565FFFFFFD8D8D8000000B4B4B4 FFFFFFFFFFFF585858343434FFFFFFFFFFFF6969690707079B9B9BDCDCDCA9A9A9212121FBFBFB EDEDED111111414141D2D2D2F5F5F5DCDCDC919191DDDDDDFFFFFFFDFDFD0B0B0B707070FFFFFF FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFAAAAAA0E0E0E D0D0D0FFFFFF939393939393D5D5D5E1E1E1AEAEAE1F1F1F292929F5F5F5FFFFFFFFFFFFAAAAAA 0E0E0ED0D0D0FFFFFFFFFFFFD5D5D5C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFF E6E6E6000000959595FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6969690707079B9B9BDCDCDCA9A9A9212121 FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777020202BCBCBCF1F1F1919191040404323232FFFFFF FFFFFFADADAD000000F3F3F3FFFFFFFFFFFF808080BCBCBCF7F7F7DADADA202020656565FFFFFF D8D8D8000000B4B4B4FFFFFFFFFFFF585858343434FFFFFFFFFFFF6969690707079B9B9BDCDCDC A9A9A9212121FBFBFBEDEDED111111414141D2D2D2F5F5F5DCDCDC919191DDDDDDFFFFFFFDFDFD 0B0B0B707070FFFFFFFFFFFFFFFFFF4C4C4C030303939393B7B7B7B7B7B7B7B7B7BABABAFEFEFE FFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF050505838383FFFFFF FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFD5D5D5C9C9C9999999000000929292C9C9C9 E4E4E4FFFFFFFFFFFFE6E6E6000000959595FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5B5E5E5E6E6E6E030303000000232323CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFECECEC3A3A3A000000020202414141747474353535FFFFFFFFFFFFADADAD000000F3F3F3 FFFFFFFFFFFF848484080808000000000000444444EBEBEBFFFFFFDBDBDB000000B7B7B7FFFFFF FFFFFF5B5B5B383838FFFFFFFFFFFFF2F2F25959590404040000000D0D0D7F7F7FFFFFFFFFFFFF CACACA313131000000000000020202363636E2E2E2FFFFFFFFFFFF454545373737FFFFFFFFFFFF FFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFF919191000000D5D5D5 FFFFFFA8A8A81A1A1A000000000000050505565656E1E1E1FFFFFFFFFFFFFFFFFF919191000000 D5D5D5FFFFFFFFFFFF1F1F1F000000000000000000000000000000666666FFFFFFFFFFFFADADAD 000000D2D2D2FFFFFFFFFFFF919191000000D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F25959590404040000000D0D0D7F7F7FFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFECECEC3A3A3A000000020202414141747474353535FFFFFFFFFFFF ADADAD000000F3F3F3FFFFFFFFFFFF848484080808000000000000444444EBEBEBFFFFFFDBDBDB 000000B7B7B7FFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFF2F2F25959590404040000000D0D0D 7F7F7FFFFFFFFFFFFFCACACA313131000000000000020202363636E2E2E2FFFFFFFFFFFF454545 373737FFFFFFFFFFFFFFFFFF0F0F0F000000000000000000000000000000020202EAEAEAFFFFFF 919191000000D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808868686FFFFFFFFFFFF FFFFFF919191000000D5D5D5FFFFFFFFFFFF1F1F1F000000000000000000000000000000666666 FFFFFFFFFFFFADADAD000000D2D2D2FFFFFFFFFFFF919191000000D5D5D5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FBFBFBFCFCFCFFFFFFEEEEEEE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFAFFFFFFFFFFFFADADAD000000F3F3F3FFFFFF FFFFFFFFFFFFF8F8F8DCDCDCF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFF FCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF3F3F3DCDCDCF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF989898000000E0E0E0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFF FFFFFFFFFFFFE6E6E6DEDEDEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424 FFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFAFFFFFFFFFFFFADADAD 000000F3F3F3FFFFFFFFFFFFFFFFFFF8F8F8DCDCDCF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 FFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3DCDCDCF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF989898000000 E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444 474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8FEFEFEFFFFFFFFFFFFFFFFFF 444444474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF575757242424FFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000B6B6B6D6D6D6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF0C0C0C8C8C8CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFF FFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000 B6B6B6D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF0C0C0C8C8C8C FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0E E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 0B0B0B878787FFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD3131313030306F6F6FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7373733B3B3BFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B10F0F0FEFEFEFFFFFFFFFFFFF B3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD313131303030 6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7373733B3B3BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B10F0F0F EFEFEFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF969696DBDBDBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AD7D7D7FFFFFFFFFFFFFFFFFFCFCFCFB4B4B4 B5B5B5F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D1D19F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFF FFFFFFFFFFFFF5F5F5B4B4B4B4B4B4CFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF9C9C9C848484 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1C1000000DBDBDBFFFFFFFFFFFFFFFFFF FFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADAD FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE8F8F8F E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF505050585858FFFFFFFFFFFFFFFFFF7C7C7C383838000000 A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFF9C9C9C848484FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF414141 5B5B5BFFFFFFFFFFFFFFFFFFD4D4D48E8E8E808080A9A9A9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6F6F6B9B9B9858585A2A2A2E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFF FFFFFFDFDFDF3939391B1B1B282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF474747272727FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF535353333333FFFFFFFFFFFFFFFFFFFCFCFC8D8D8D 0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8 3C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC8D8D8D0A0A0A000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFA8A8A8070707EEEEEEFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFF474747272727FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000B3B3B3 FFFFFFFFFFFF7575750000001E1E1E1D1D1D000000313131F5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE 3535350707073D3D3D1B1B1B0E0E0EC3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC8D8D8D0A0A0A000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF282828767676FFFFFFFFFFFF FFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF3F3F30808088B8B8BFFFFFFFFFFFFFFFFFF3D3D3D2323237B7B7B 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5090909686868 343434393939FFFFFFFFFFFFFFFFFFFFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D2323237B7B7B000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFF5F5F50A0A0A949494FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C111111F9F9F9FFFFFF FFFFFF838383CBCBCBFFFFFFFFFFFF777777000000939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFF616161141414 E2E2E2FFFFFFF7F7F7353535242424FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D 2323237B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFBFFFFFFFFFFFF FFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA868686 8F8F8FDEDEDEFFFFFFFFFFFF585858343434FFFFFFFFFFFFC4C4C4B6B6B6FFFFFFFFFFFFFFFFFF FFFFFFCFCFCF9191918A8A8AD0D0D0FFFFFFFFFFFFFFFFFFF9F9F9B0B0B0868686A4A4A4EAEAEA FFFFFFFFFFFFFFFFFFAEAEAE000000DCDCDCFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8C3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8C3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5050503D3D3DFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFBABABA8686868F8F8FDEDEDEFFFFFFFFFFFF585858343434FFFFFFFFFFFF C4C4C4B6B6B6FFFFFFFFFFFFFFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFF F9F9F9B0B0B0868686A4A4A4EAEAEAFFFFFFFFFFFFFFFFFF2E2E2E5C5C5CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDCDCDC0000006D6D6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFFF5F5F50D0D0D7B7B7BFFFFFF FFFFFFFFFFFFA4A4A4000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9AF8F8F8 C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFF 7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A0F0F0F5B5B5B464646 242424FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFF808080 020202313131343434020202A8A8A8FFFFFFE6E6E63232321C1C1C5151510D0D0D171717CECECE FFFFFFFFFFFF787878030303FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF747474161616FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6A6A6A0F0F0F5B5B5B464646242424FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858 343434FFFFFFFFFFFFDEDEDE2424241212123F3F3F151515292929FFFFFFFFFFFFE6E6E6323232 1C1C1C5151510D0D0D171717CECECEFFFFFFF5F5F5030303808080FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFCACACA000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFCBCBCB000000B4B4B4FFFFFFFFFFFF FFFFFFD5D5D5000000A2A2A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFF7A7A7A 262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F60303039E9E9EFFFFFFFFFFFFECECEC FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFFCECECE020202858585 FFFFFFFFFFFFC9C9C9BDBDBDFFFFFF5F5F5F282828F1F1F1FFFFFFF2F2F22D2D2D404040FFFFFF FFFFFF4C4C4C1C1C1CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF909090000000F4F4F4FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 0303039E9E9EFFFFFFFFFFFFECECECFFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434 FFFFFFFFFFFF5050501B1B1BEAEAEAFFFFFFF7F7F78E8E8EFFFFFFFFFFFF5F5F5F282828F1F1F1 FFFFFFF2F2F22D2D2D404040FFFFFFCCCCCC0000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6D6D6D020202D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFB4B4B4000000C7C7C7FFFFFFFFFFFFFFFFFF EAEAEA0000008F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010747474FFFFFFFFFFFFFFFFFF7A7A7A262626 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD0F0F0F4F4F4FF1F1F1FFFFFFFFFFFFFFFFFF FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF7E7E7E000000E0E0E0FFFFFF FFFFFFFFFFFFFFFFFFFCFCFC0606068D8D8DFFFFFFFFFFFFFFFFFF7A7A7A040404FBFBFBFFFFFF 393939383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADADAD000000D2D2D2FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD0F0F0F 4F4F4FF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFF FAFAFA030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC0606068D8D8DFFFFFFFFFFFF FFFFFF7A7A7A040404FBFBFBB9B9B9000000B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CECECE040404707070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343393939FFFFFFFFFFFFFFFFFFA7A7A7000000CDCDCDFFFFFFFFFFFFFFFFFFF1F1F1 000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B11010100E0E0E6C6C6CE7E7E7FFFFFFFFFFFF 585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF5A5A5A1C1C1CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFDFDFDF0000000808080D0D0D0D0D0D0D0D0D080808030303F1F1F1FFFFFF303030 444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B9 000000BDBDBDFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1101010 0E0E0E6C6C6CE7E7E7FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFDADADA 0000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF0000000808080D0D0D0D0D0D0D0D0D 080808030303F1F1F1B0B0B0000000C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E71D1D1D 393939F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFB8B8B8000000BEBEBEFFFFFFFFFFFFFFFFFFE8E8E8000000 9B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F29494941A1A1A1D1D1DF1F1F1FFFFFF585858 343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF5D5D5D202020FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE7E7E7000000888888E2E2E2E2E2E2E2E2E2E2E2E2EBEBEBFFFFFFFFFFFF3E3E3E292929 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F000000 CBCBCBFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2949494 1A1A1A1D1D1DF1F1F1FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFDDDDDD000000 A0A0A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7000000888888E2E2E2E2E2E2E2E2E2E2E2E2 EBEBEBFFFFFFBEBEBE000000A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFF0F0F0313131262626ECECEC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFCCCCCC000000A4A4A4FFFFFFFFFFFFFFFFFFC9C9C9000000B4B4B4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F1F1F4B4B4BFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6000000BEBEBEFFFFFF585858343434 FFFFFFFFFFFF585858343434FFFFFFFFFFFF818181030303E4E4E4FFFFFFFFFFFFFFFFFFFBFBFB FFFFFF0E0E0E686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580D0D0DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF838383000000E5E5E5 FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6 000000BEBEBEFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFBFBFB060606686868 FFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFF0E0E0E686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD8D8D80000008D8D8DFFFFFFFFFFFFFFFFFFF4F4F43A3A3A1F1F1FE1E1E1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFAFAFA1313135D5D5DFFFFFFFFFFFFFFFFFF7E7E7E0D0D0DF5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFDFDFD050505656565FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFCFCFCF828282E3E3E3F7F7F7828282030303E1E1E1FFFFFF585858343434FFFFFF FFFFFF585858343434FFFFFFFFFFFFE2E2E2070707424242CECECED1D1D16666667D7D7DFFFFFF 7F7F7F0707079B9B9BEAEAEAEFEFEFBCBCBC9A9A9AFFFFFFFFFFFF888888000000F0F0F0FFFFFF FFFFFFFFFFFFD5D5D5C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFF303030595959 FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFF0F0F0C9C9C9 C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFD5D5D5 C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFFFFFFFF666666151515FFFFFFFFFFFF FFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF828282E3E3E3F7F7F7828282030303 E1E1E1FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF6969690707079B9B9B DCDCDCA9A9A9212121FBFBFBFFFFFF7F7F7F0707079B9B9BEAEAEAEFEFEFBCBCBC9A9A9AFFFFFF FDFDFD0B0B0B707070FFFFFFFFFFFFFFFFFF4C4C4C030303939393B7B7B7B7B7B7B7B7B7BABABA FEFEFEFFFFFFFFFFFF303030595959FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9 CACACAFEFEFEFFFFFF717171020202969696DFDFDFA8A8A80B0B0B737373FFFFFFFFFFFFAAAAAA 0E0E0ED0D0D0FFFFFFFFFFFFD5D5D5C9C9C9999999000000929292C9C9C9E4E4E4FFFFFFFFFFFF E6E6E6000000959595FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE1E1E12A2A2A0000000000001212129E9E9EFFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFF 5B5B5B383838FFFFFFFFFFFFFFFFFFB5B5B51A1A1A000000000000363636D5D5D5FFFFFFF9F9F9 7979790B0B0B000000000000121212888888FFFFFFFFFFFFC5C5C5000000B7B7B7FFFFFFFFFFFF FFFFFF1F1F1F000000000000000000000000000000666666FFFFFFFFFFFF111111555555FFFFFF FFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFF9F9F9F000000000000 000000000000000000010101E5E5E5FFFFFF919191000000D5D5D5FFFFFFFFFFFF1F1F1F000000 000000000000000000000000666666FFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF FAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E12A2A2A0000000000001212129E9E9EFFFFFF FFFFFF5B5B5B383838FFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFF2F2F2595959040404000000 0D0D0D7F7F7FFFFFFFFFFFFFF9F9F97979790B0B0B000000000000121212888888FFFFFFFFFFFF 454545373737FFFFFFFFFFFFFFFFFF0F0F0F000000000000000000000000000000020202EAEAEA FFFFFFFFFFFF111111555555FFFFFFFFFFFF9F9F9F000000000000000000000000000000010101 E5E5E5FFFFFFFBFBFB6565650B0B0B000000121212727272FEFEFEFFFFFFFFFFFF919191000000 D5D5D5FFFFFFFFFFFF1F1F1F000000000000000000000000000000666666FFFFFFFFFFFFADADAD 000000D2D2D2FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE7E7E7E0E0E0FCFCFCFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFCFCFC FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFEE1E1E1E4E4E4FEFEFEFFFFFFFFFFFFFFFFFFFEFEFE191919616161FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C4020202C5C5C5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7000000A4A4A4FFFFFFFFFFFFFFFFFFFAFAFA 000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7E0E0E0FCFCFCFFFFFFFFFFFFFFFFFF FCFCFCFAFAFAFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE1E1E1E4E4E4FEFEFEFFFFFFFFFFFFFFFFFF989898 000000E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C4C4C4020202C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFCE3E3E3FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424 FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B111111FAFAFAFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181121212F4F4F4FFFFFFFFFFFFD7D7D7BBBBBB000000 A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF0C0C0C 8C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF484848 6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFF FFFFFFF7F7F7BFBFBF5B5B5B262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E80A0A0ABBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3131317E7E7EFFFFFFFFFFFFFFFFFF757575303030303030C8C8C8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7373733B3B3B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B10F0F0FEFEFEFFFFFFFFFFFFF DDDDDD303030303030616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/image1_crop.eps0000644000175000017500000347340512662210372016454 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image1_crop.eps) %%CreationDate: (2011-07-20T14:56:56-07:00) %%BoundingBox: 0 0 350 443 %%HiResBoundingBox: 0 0 349.956 443 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 350 443 userdict begin DisplayImage 0 0 349.956 442.945 12 350 443 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF464646111111393939FFFFFFFFFFFFFFFFFF F3F3F3CBCBCBF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0 C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3 D1D1D1FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0CBCBCB F3F3F3FFFFFFFFFFFFFFFFFF2424241111115A5A5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 959595111111121212D8D8D8FFFFFFFFFFFFFCFCFCD2D2D2E2E2E2FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCACACAD3D3D3FDFDFDFFFFFF747474111111181818 F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1151515111111898989FFFFFFFFFFFFFFFFFF E3E3E3D1D1D1FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0 C5C5C5E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF CACACAD3D3D3FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD6D6D6CFCFCF F9F9F9FFFFFFFFFFFFC3C3C3111111121212A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF464646111111393939FFFFFF FFFFFFFFFFFFF3F3F3CBCBCBF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCD6D6D6CFCFCFF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDFDFDFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDD2D2D2CCCCCCF5F5F5FFFFFFFFFFFF FFFFFF747474111111181818F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289B9B9BFCFCFCFFFFFFFEFEFE6D6D6D030303 1B1B1B040404767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7676760707071B1B1B 0404042D2D2DE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7323232070707161616 0F0F0FBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B91818181414140D0D0D0E0E0E B1B1B1FFFFFFFFFFFFFBFBFB8686863E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E 484848FAFAFAFFFFFFFFFFFFB5B5B50E0E0E1313130A0A0A363636ECECECFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB9B9B91818181414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB9B9B91818181414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF8F8F8626262020202202020131313696969FFFFFFFDFDFDD9D9D9000000E9E9E9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000EFEFEFFEFEFEFFFFFFE7E7E7323232070707 1616160F0F0FBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEB3B3B3B090909181818 0101016A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8626262020202202020 131313696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC1818181919191010101F1F1F D4D4D4FFFFFFFFFFFFF9F9F9323232939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289B9B9BFCFCFCFFFFFFFEFEFE 6D6D6D0303031B1B1B040404767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEBEB3B3B3B 0909091818180101016A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC181818 1919191010101F1F1FD4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF646464 010101888888FFFFFFFFFFFFFFFFFFBABABA1B1B1B050505020202111111B4B4B4FFFFFFFFFFFF FDFDFDD9D9D9000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF9797970F0F0FD5D5D5FFFFFF C0C0C0030303B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D9 0B0B0B777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF424242454545F5F5F5FEFEFE6F6F6F 101010F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242222222 FFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4A FFFFFFFFFFFFE6E6E6060606919191FEFEFEEEEEEE2A2A2A5E5E5EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF676767272727DDDDDDFFFFFFFEFEFEECECECFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFF424242454545F5F5F5FEFEFE 6F6F6F101010F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F 000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767272727DDDDDDFFFFFFFEFEFE ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1141414787878FFFFFFF9F9F9434343383838 FFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF9797970F0F0F D5D5D5FFFFFFC0C0C0030303B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7939393F7F7F7 FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1141414787878FFFFFF F9F9F9434343383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D81B1B1B656565161616 888888FFFFFFFFFFFFFFFFFF999999ADADADFBFBFBEBEBEB333333171717FFFFFFFFFFFFFFFFFF DEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF363636717171FFFFFFFFFFFFFFFFFF 3F3F3F5D5D5DFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F 5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0010101C6C6C6FFFFFFFFFFFFEAEAEA000000 B2B2B2FFFFFFF8F8F8E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0AFFFFFF FFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFF FFFFFF8C8C8C1B1B1BFFFFFFFFFFFFFFFFFF9595950D0D0DFAFAFAFFFFFFF8F8F8E3E3E3FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0AFFFFFFFFFFFFFFFFFFDFDFDFFCFCFCFFFFFFE8E8E8 040404BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFE0E0E0010101C6C6C6FFFFFFFFFFFFEAEAEA 000000B2B2B2FFFFFFFFFFFFDFDFDFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA000000 B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8040404BBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEBEBEBF0F0F0FFFFFFBBBBBB000000EDEDEDFFFFFFFFFFFFB5B5B5000000E7E7E7 FFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF363636717171FFFFFF FFFFFFFFFFFF3F3F3F5D5D5DFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DADADA000000B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000EDEDEDFFFFFFFFFFFF B5B5B5000000E7E7E7FFFFFFF8F8F8E3E3E3FFFFFFFFFFFFDEDEDECBCBCBFFFFFF1F1F1F888888 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B000000F0F0F0FFFFFFFFFFFFDEDEDE 000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF060606A5A5A5FFFFFFFFFFFFFFFFFF6D6D6D 383838FFFFFFFFFFFF2B2B2B464646FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1000000FAFAFAFFFFFFFFFFFFFFFFFF1818188D8D8D FFFFFF818181010101EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131535353FFFFFFFFFFFF FFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF 5B5B5B4F4F4FFFFFFFFFFFFFFFFFFFC2C2C2000000E2E2E2FFFFFF818181010101EFEFEFFFFFFF FFFFFFFFFFFFFFFFFFF2F2F2313131535353FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF2F2F2313131535353FFFFFFFFFFFFD6D6D60000009C9C9CFFFFFFACACAC090909 FEFEFEDFDFDFD9D9D9FBFBFBFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFB1B1B1000000FAFAFAFFFFFFFFFFFFFFFFFF181818 8D8D8DFFFFFFD6D6D60000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACACAC090909FEFEFEDFDFDFD9D9D9FBFBFBFFFFFFFFFFFF FFFFFF2B2B2B464646FFFFFFB1B1B1000000EFEFEFFFFFFFFFFFFFDBDBDB000000C2C2C2FFFFFF FFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF060606A5A5A5FFFFFFFFFFFF FFFFFF6D6D6D383838FFFFFFFFFFFF2B2B2B464646FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A 0F0F0FEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1000000EFEFEFFFFFFFFFFFFFDBDBDB 000000C2C2C2FFFFFF818181010101EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F131313FEFEFEFFFFFFFFFFFFDEDEDE000000 E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2828289F9F9FFFFFFFEFEFEF000000B5B5B5FFFFFFFFFFFFFFFFFF7D7D7D252525 FFFFFFFFFFFF8B8B8B9C9C9CFFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9A9A9A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFF2828287A7A7AFFFFFF C0C0C06B6B6BFBFBFBFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1FFFFFFFFFFFFFFFFFF 8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF454545 5F5F5FFFFFFFFFFFFFFFFFFFD3D3D3000000CFCFCFFFFFFFC0C0C06B6B6BFBFBFBFFFFFFFFFFFF 6F6F6F424242121212464646F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F 424242121212464646F1F1F1FFFFFFFFFFFFF0F0F0656565D1D1D1FFFFFF8B8B8B0D0D0D262626 1616160E0E0E111111B2B2B2FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD3D3D3000000F4F4F4FFFFFF9A9A9A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFF2828287A7A7A FFFFFFF0F0F0656565D1D1D1FFFFFFFFFFFFACACAC4848482525251C1C1CC6C6C6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8B8B8B0D0D0D2626261616160E0E0E111111B2B2B2FFFFFFFFFFFF 8B8B8B9C9C9CFFFFFFE5E5E5060606777777F7F7F7F0F0F0939393000000B7B7B7FFFFFFFFFFFF 343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFEFEFEF000000B5B5B5FFFFFFFFFFFFFFFFFF 7D7D7D252525FFFFFFFFFFFF8B8B8B9C9C9CFFFFFFFFFFFFACACAC4848482525251C1C1CC6C6C6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5060606777777F7F7F7F0F0F0939393000000 B7B7B7FFFFFFC0C0C06B6B6BFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEDEDED131313767676FFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF2828289F9F9FFFFFFFEFEFEF000000B0B0B0FFFFFFFFFFFFFFFFFF7F7F7F292929FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9A9A9A060606FFFFFFFFFFFFFFFFFFFFFFFF2929297E7E7EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFBFFFFFFFFFFFF898989 3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF4444445B5B5B FFFFFFFFFFFFFFFFFFD4D4D4000000D4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC A1A1A1797979121212494949FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1 797979121212494949FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484101010CECECEFFFFFF FDFDFD606060161616FDFDFDFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D3D3D3000000F4F4F4FFFFFF9A9A9A060606FFFFFFFFFFFFFFFFFFFFFFFF2929297E7E7EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADAA5A5A58E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF848484101010CECECEFFFFFFFDFDFD606060161616FDFDFDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFA6A6A61A1A1A020202090909484848000000C2C2C2FFFFFFFFFFFF343434 949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFEFEFEF000000B0B0B0FFFFFFFFFFFFFFFFFF7F7F7F 292929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADAA5A5A58E8E8E3131311B1B1BD4D4D4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6A6A61A1A1A020202090909484848000000C2C2C2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFE545454252525F4F4F4FFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2828289F9F9FFFFFFFFEFEFE040404A0A0A0FFFFFFFFFFFFFFFFFF6C6C6C3F3F3FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF FFFFFFFFFFFFADADAD000000F5F5F5FFFFFFFFFFFFFFFFFF171717949494FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFF8989893E3E3E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF5858584A4A4AFFFFFF FFFFFFFFFFFFC1C1C1000000EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF BFBFBF000000A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFFFFFFFF BEBEBE000000E5E5E5FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3 000000F4F4F4FFFFFFADADAD000000F5F5F5FFFFFFFFFFFFFFFFFF171717949494FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F61E1E1E525252FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFFFFFFFFBEBEBE000000E5E5E5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF2F2F2FEFEFECFCFCF000000E8E8E8FFFFFFFFFFFF343434949494 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2828289F9F9FFFFFFFFEFEFE040404A0A0A0FFFFFFFFFFFFFFFFFF6C6C6C3F3F3F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F61E1E1E525252FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2FEFEFECFCFCF000000E8E8E8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF787878151515DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828 9F9F9FFFFFFFFFFFFF2D2D2D696969FFFFFFFFFFFFFFFFFF363636767676FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFD8D8D8000000BEBEBEFFFFFFFFFFFFE0E0E0000000CBCBCBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF8989893E3E3EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF838383151515FEFEFEFFFFFF FFFFFF8B8B8B222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E90000009A9A9AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9 0000009A9A9AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFFACACAC 020202F7F7F7FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000 F4F4F4FFFFFFD8D8D8000000BEBEBEFFFFFFFFFFFFE0E0E0000000CBCBCBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3F454545FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFFACACAC020202F7F7F7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787878313131FFFFFFFFFFFFFFFFFF343434949494FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF2828289F9F9FFFFFFFFFFFFF2D2D2D696969FFFFFFFFFFFFFFFFFF363636767676FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3F454545FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787878313131FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFF898989 0E0E0ECBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9F FFFFFFFFFFFF8989890E0E0EC4C4C4FBFBFB9A9A9A050505D6D6D6FFFFFFFFFFFF7777778B8B8B FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFF9D9D9D646464FFFFFF FFFFFF3333333D3D3DEAEAEAF1F1F1505050323232FFFFFFFFFFFFB4B4B4535353F9F9F9FFFFFF 7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFDBDBDB030303848484F8F8F8D3D3D3 191919878787FFFFFFFFFFFFB4B4B4535353F9F9F9FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363 090909DDDDDDFFFFFFDADADA464646E1E1E1FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909 DDDDDDFFFFFFECECEC4E4E4EC7C7C7FFFFFFF5F5F5111111666666F8F8F8E4E4E4313131565656 FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4 FFFFFFFFFFFF3333333D3D3DEAEAEAF1F1F1505050323232FFFFFFFFFFFFECECEC4E4E4EC7C7C7 FFFFFFA7A7A7A1A1A1F0F0F0FAFAFAAAAAAA030303919191FFFFFFFFFFFF5E5E5EA4A4A4FFFFFF F5F5F5111111666666F8F8F8E4E4E4313131565656FFFFFFFFFFFF7777778B8B8BFFFFFFFDFDFD CACACAFCFCFCF3F3F39A9A9A070707B4B4B4FFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2828289F9F9FFFFFFFFFFFFF8989890E0E0EC4C4C4FBFBFB9A9A9A050505D6D6D6FFFFFFFFFFFF 7777778B8B8BFFFFFFA7A7A7A1A1A1F0F0F0FAFAFAAAAAAA030303919191FFFFFFFFFFFF9D9D9D 646464FFFFFFFDFDFDCACACAFCFCFCF3F3F39A9A9A070707B4B4B4FFFFFFFFFFFFB4B4B4535353 F9F9F9FFFFFFFEFEFEEBEBEBEBEBEB1C1C1C7E7E7EEBEBEBF8F8F8FFFFFF9D9D9D0303039F9F9F DBDBDBDBDBDBDBDBDBF1F1F1FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFF FFFFFFFCFCFC6666660909090202021F1F1FB4B4B4FFFFFFFFFFFFFFFFFF3232324D4D4DFFFFFF F1F1F14848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFF6565652D2D2DFFFFFFFFFFFF E1E1E13434340202020606063E3E3EE7E7E7FFFFFFFFFFFF878787060606F1F1F1FFFFFF838383 101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFFAAAAAA1616160202020E0E0E717171 FEFEFEFFFFFFFFFFFF878787060606F1F1F1FFFFFF838383101010020202000000252525B6B6B6 FFFFFFFFFFFFBABABA000000D8D8D8FFFFFF838383101010020202000000252525B6B6B6FFFFFF FFFFFFDADADA010101A2A2A2FFFFFFFFFFFFB9B9B9191919040404060606555555EDEDEDFFFFFF FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFF FFFFFFE1E1E13434340202020606063E3E3EE7E7E7FFFFFFFFFFFFDADADA010101A2A2A2FFFFFF C0C0C02727270000000202020C0C0C7B7B7BFEFEFEFFFFFFFFFFFF0F0F0F828282FFFFFFFFFFFF B9B9B9191919040404060606555555EDEDEDFFFFFFFFFFFF3232324D4D4DFFFFFFF7F7F71B1B1B 050505030303202020AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828 9F9F9FFFFFFFFFFFFFFCFCFC6666660909090202021F1F1FB4B4B4FFFFFFFFFFFFFFFFFF323232 4D4D4DFFFFFFC0C0C02727270000000202020C0C0C7B7B7BFEFEFEFFFFFFFFFFFF6565652D2D2D FFFFFFF7F7F71B1B1B050505030303202020AAAAAAFFFFFFFFFFFFFFFFFF878787060606F1F1F1 FFFFFFC7C7C7000000000000000000000000000000787878FFFFFF454545000000000000000000 0000000000007E7E7EFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFF FFFFFFFFFFFFFBFBFBEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFFFFFFFFFFFF FFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFFFFFFFF FFFFFFF1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFFFFFFFFFDFDFD E3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8FDFDFDFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFF FFFFFF6E6E6E494949FFFFFFFFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF DEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFF FFFFFFFFFFFFF1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FFFFFFFFFFFFFFFFFF FFFFFFECECECE4E4E4FEFEFEFFFFFFFFFFFFFFFFFFC4C4C40E0E0EE4E4E4FFFFFFFFFFFFFFFFFF FDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFFFFFFFFFFFFFEFEFEE3E3E3 EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9F FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFB FFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFF FFFFFFFEFEFEE3E3E3EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828585858A1A1A1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9696964C4C4C3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7E7E7E2929298D8D8DEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9 181818E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC7B7B7B 000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000878787C7C7C7FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848489C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE2E2E28D8D8D1C1C1C949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828585858A1A1A1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBCBCBC7B7B7B000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2808080969696FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8B8B8B808080ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CDCDCD808080808080EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD9D9D9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B6808080868686 FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4838383808080C1C1C1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE0E0E0808080808080D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2808080969696FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB6B6B6808080868686FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF2F2F2FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9292923B3B3BFFFFFFFFFFFFFFFFFFF0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFEFEFE161616 BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606E4E4E4FFFFFFFFFFFFFCFCFC D0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0 CBCBCBF3F3F3FFFFFFFFFFFFFFFFFF6A6A6A6A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF3D3D3D919191FFFFFFFFFFFFFFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFFC0C0C0181818 FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9292923B3B3BFFFFFFFFFFFFFFFFFFF0F0F0 C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0C7C7C7 D6D6D6FCFCFCFFFFFFFFFFFFFEFEFE161616BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE 232323919191FFFFFFFFFFFF7676760707071B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7676760707071B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFF6A6A6A5D5D5D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7878783B3B3BFFFFFFFFFFFFB9B9B9181818141414 0D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B91818181414140D0D0D 0E0E0EB1B1B1FFFFFFFFFFFFC0C0C0101010F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD 010101E4E4E4FFFFFFEBEBEB3B3B3B0909091818180101016A6A6AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEBEBEB3B3B3B0909091818180101016A6A6AFFFFFFFFFFFFFDFDFD181818B2B2B2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE232323919191FFFFFFFFFFFF7676760707071B1B1B 0404042D2D2DE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7676760707071B1B1B040404 2D2D2DE8E8E8FFFFFFFFFFFF6A6A6A5D5D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C8020202 E6E6E6FFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D90B0B0B777777FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D90B0B0B777777FFFFFFFFFFFFC2C2C2090909F1F1F1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E1E1E939393FFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7 424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242 222222FFFFFFFFFFFFFDFDFD191919A5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7272723E3E3E FFFFFFFFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFF6C6C6C505050FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC8C8C8020202E6E6E6FFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D9 0B0B0B777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D90B0B0B 777777FFFFFFFFFFFFC2C2C2090909F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B383838FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F5F5F5FFFFFFFFFFFFFFEFEFE121212A6A6A6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD0D0D0000000E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484 0A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0A FFFFFFFFFFFFFFFFFF666666505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2626268D8D8DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA000000B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDADADA000000B5B5B5FFFFFFFFFFFFBBBBBB040404F6F6F6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7B7B7B383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F 5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F5F5F5F FFFFFFFFFFFFFEFEFE121212A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4545455A5A5AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8FFFFFFFFFFFFFFFFFF333333808080FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9B9B9B060606FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131535353 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131535353FFFFFF FFFFFFFFFFFF8888882A2A2AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF000000AFAFAFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEEFFFFFFFFFFFFDEDEDE000000D5D5D5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF4545455A5A5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8FFFFFF FFFFFFFFFFFF333333808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF212121767676FFFFFFFFFFFFFFFFFF E8E8E84A4A4A383838090909888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8 4A4A4A383838090909888888FFFFFFFFFFFFFFFFFFFFFFFF4F4F4F5E5E5EFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF767676202020FFFFFFFFFFFFFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1FFFFFFFFFFFF FFFFFFA5A5A5090909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB000000CBCBCBFFFFFFFFFFFFFFFFFF ACACAC4848482525251C1C1CC6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACACAC 4848482525251C1C1CC6C6C6FFFFFFFFFFFFFFFFFFF9F9F9010101B3B3B3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF212121767676FFFFFFFFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFFFFFFFFFFFFFF FFFFFF4F4F4F5E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010909090FFFFFFFFFFFFFFFFFFF8F8F8 A6A6A69999995B5B5B050505969696FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8A6A6A6 9999995B5B5B050505969696FFFFFFFFFFFFFFFFFF6A6A6A3D3D3DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 6565653B3B3BFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFBFFFFFFFFFFFF BFBFBF000000E8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA000000E6E6E6FFFFFFFFFFFFFFFFFFDADADA A5A5A58E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADAA5A5A5 8E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFFFFFFFF151515929292FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 101010909090FFFFFFFFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFFFFFFFFFFFFFF 6A6A6A3D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF151515858585FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF5F5F5F3D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A 303030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFFB4B4B4 000000E7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000DADADAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6F6F61E1E1E525252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F6F6F61E1E1E525252FFFFFFFFFFFFFFFFFF0A0A0A929292FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF151515 858585FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF5F5F5F 3D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF949494000000EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 949494000000EFEFEFFFFFFFFFFFFF434343505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D131313 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF989898020202 F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000BEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF3F3F3F454545FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 3F3F3F454545FFFFFFFFFFFFEEEEEE000000A5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828686868 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFF434343505050 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5454544C4C4CFFFFFFFFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D5 2828283C3C3CFFFFFFFFFFFF9D9D9D646464FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D5282828 3C3C3CFFFFFFFFFFFFFFFFFF2727277C7C7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9A9000000F6F6F6 FFFFFFFFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFDADADA464646E1E1E1 FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFFFFFFF7C7C7C272727FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF9F9F9050505A1A1A1FFFFFFFFFFFFA7A7A7A1A1A1F0F0F0FAFAFAAAAAAA 030303919191FFFFFFFFFFFF5E5E5EA4A4A4FFFFFFA7A7A7A1A1A1F0F0F0FAFAFAAAAAAA030303 919191FFFFFFFFFFFFD1D1D1000000D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5454544C4C4CFFFFFF FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFF9D9D9D646464FFFFFF E1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFFFFFFFF2727277C7C7CFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF8F8F8F1B1B1BFEFEFEFFFFFFF1F1F14848480404040202020202024B4B4B E2E2E2FFFFFFFFFFFF6565652D2D2DFFFFFFF1F1F14848480404040202020202024B4B4BE2E2E2 FFFFFFFFFFFFEEEEEE050505B7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3000000C3C3C3FFFFFF FFFFFF838383101010020202000000252525B6B6B6FFFFFFFFFFFFBABABA000000D8D8D8FFFFFF 838383101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF494949616161FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF3939396E6E6EFFFFFFFFFFFFC0C0C02727270000000202020C0C0C7B7B7B FEFEFEFFFFFFFFFFFF0F0F0F828282FFFFFFC0C0C02727270000000202020C0C0C7B7B7BFEFEFE FFFFFFFFFFFF9F9F9F101010FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F1B1B1BFEFEFEFFFFFF F1F1F14848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFF6565652D2D2DFFFFFFF1F1F1 4848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFFEEEEEE050505B7B7B7FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE0E0E0000000C3C3C3FFFFFFFFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFF FFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFF FFFFFF9E9E9E0F0F0FF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3636366E6E6EFFFFFFFFFFFF FFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF6E6E6E494949FFFFFFFFFFFFFFFFFF FDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE050505B3B3B3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8C8C8C1B1B1BFEFEFEFFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFFFFFFFF FFFFFFC4C4C40E0E0EE4E4E4FFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFFFFFFFFFFFFFF FFFFFF4949495D5D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0000000C3C3C3FFFFFFFFFFFF FFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFFFFFFFF F6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFFFFFF9E9E9E0F0F0FF9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF4848486E6E6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D1A1A1AFEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9181818E2E2E2FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D1E1E1EFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEAEAEA080808C3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4848489C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED 050505C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486E6E6EFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC9C9C9707070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6 EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE595959 E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F95A5A5AE5E5E5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909090A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF8E8E8EAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB6E6E6E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9707070FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE595959E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2 EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFB2B2B2EFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFACACACEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFCDCDCDDFDFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFCACACAEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2 EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEAEAEABFBFBFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEEEEEEBABABAEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFBABABAEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFCBCBCBEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B4B41010100D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0505050909090C0C0C0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0202020707070D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D000000000000 F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEDEDED2D2D2D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D090909 0506060909090D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0707070606060B0B0B0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0A0A0A000000BABABAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8080801415150D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0C0C0C0707070808080D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0C0C0C0606060A0A0A0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D000000000000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD2D2D21414140D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D050505 0607070B0B0B0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0000000606060B0B0B0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D 0D0D0D0D0D0D0D0D0D0D0D0D0000000000009F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B4B4121212ADAEB0C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4555556161616BCBDBFC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 5353550E0E0EB7B8BAC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49596980F0F0F000000E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEDEDED2F2F2F656667C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49C9D9E0A0A0A959698 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49D9E9F0A0A0A818283C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4B9BABC343434000000828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080202021BCBDBFC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4BDBEC02D2D2E333334C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C3 2A2A2B242525C0C1C3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47475760E0E0E121212FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD2D2D213131498989AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C478787A0B0B0BB1B2B4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4757577080808A8A8AAC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4A8A9AB1818181A1B1BBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B4B412121298999BC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4555556161616AFB0B2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45353550E0E0E A6A7A9C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49596980F0F0F676869111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED 2F2F2F595A5AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49C9D9E0A0A0A808182C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C49D9E9F0A0A0A6F7071C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 B9BABC3434343A3A3A454647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080202021B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BDBEC02D2D2E333334BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32A2A2B252525 B8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47475761414147778791A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2 131314828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C478787A0B0B0B9E9FA1C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4757577080808929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 A8A9AB1818185556572C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB4B4B412121298999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 555556161616AFB0B2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45353550E0E0EA6A7A9C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49596980F0F0F6768698F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2F2F2F595A5A C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49C9D9E0A0A0A808182C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C49D9E9F0A0A0A6F7071C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC343434 3A3A3A8D8E90464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF808080202021B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC0 2D2D2E333334BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32A2A2B252525B8B9BBC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47475761414147B7C7E7D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2131314828284 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C478787A0B0B0B9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4757577080808929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB181818 5556578F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB4B4B412121298999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555556161616 AFB0B2C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45353550E0E0EA6A7A9C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C49596980F0F0F6768698F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2F2F2F595A5AC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C49C9D9E0A0A0A808182C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 9D9E9F0A0A0A6F7071C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC3434343A3A3A8D8E90 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF808080202021B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC02D2D2E333334 BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32A2A2B252525B8B9BBC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47475761414147B7C7E8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2131314828284C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C478787A0B0B0B9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 757577080808929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB1818185556578F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B4B4B412121298999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4555556161616AFB0B2C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45353550E0E0EA6A7A9C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C49596980F0F0F6768698F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2F2F2F595A5AC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C49C9D9E0A0A0A808182C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49D9E9F0A0A0A 6F7071C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC3434343A3A3A8D8E908F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 808080202021B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC02D2D2E333334BDBEC0C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32A2A2B252525B8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C47475761414147B7C7E8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2D2D2131314828284C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C478787A0B0B0B9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4757577080808 929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB1818185556578F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC121212 98999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4595A5B161616AFB0B2C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C45758580E0E0EA6A7A9C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49E9FA1 0F0F0F6768698F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F62F2F2F595A5AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 A8A9AB0A0A0A808182C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4ACADAE0A0A0A6F7071C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BDBEC03434343A3A3A8D8E908F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808080202021 B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32F2F2F333334BDBEC0C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C42A2A2B252525B8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4747576 1414147B7C7E8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDEDEDE131314828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 8081820B0B0B9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47B7C7D080808929395C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB1818185556578F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F00000003A3A3B444445 444445444445444445444445444445444445444445444445444445444445444445444445444445 44444544444544444544444544444532323200000039393A3F3F403F3F403F3F403F3F403F3F40 3B3B3C414242444445444445444445444445444445444445444445444445444445444445444445 4444453233330000003737383F3F403F3F403F3F403F3F403F3F4039393A444445444445444445 4444454444454444454444454444454444454444454444454444454444453B3C3C050505676869 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5A5B5B29292A444445444445444445444445444445444445444445444445 444445444445444445444445444445444445444445444445444445444445444445414142000000 2C2C2D3F3F403F3F403F3F403F3F403F3F403D3D3E3D3D3E444445444445444445444445444445 4444454444454444454444454444454444454444454242430000002829293F3F403F3F403F3F40 3F3F403F3F403B3C3D404041444445444445444445444445444445444445444445444445444445 4444454444454444454444454B4B4C3838388D8E908F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C20000003F4040444445 444445444445444445444445444445444445444445444445444445444445444445444445444445 4444454444454444454444454444452828281010103D3D3E3F3F403F3F403F3F403F3F403F3F40 39393A444445444445444445444445444445444445444445444445444445444445444445444445 4444452B2C2C0303033C3D3D3F3F403F3F403F3F403F3F403E3E3F3B3B3C444445444445444445 4444454444454444454444454444454444454444454444454444454444450000002121217F8081 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF6F6F6000000343434444445444445444445444445444445444445444445444445 4444454444454444454444454444454444454444454444454444454444454444453F3F40000000 3435353F3F403F3F403F3F403F3F403F3F403B3C3D404041444445444445444445444445444445 4444454444454444454444454444454444454444451E1E1E0000003333333F3F403F3F403F3F40 3F3F403F3F403A3A3B424243444445444445444445444445444445444445444445444445444445 4444454444454444452B2B2C0000005F60618F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898080808747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 7475767475767475767475762425255A5A5B747576747576747576747576747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 2B2B2C464647747576747576747576747576747576747576747576747576747576747576747576 7475767475767475767475767475767475767475767475767475766667682525258F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC000000747576747576747576747576747576747576747576747576747576747576 74757674757674757674757674757674757674757674757674757674757659595A000000747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 747576747576747576747576747576747576636465000000747576747576747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 7475767475767475760000008283858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4A4A5B5B5C747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 7475767475767475767475760000006C6D6E747576747576747576747576747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 0A0A0A68696A747576747576747576747576747576747576747576747576747576747576747576 7475767475767475767475767475767475767475767475767475764546474B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C3000000747576747576747576747576747576747576747576747576747576747576 7475767475767475767475767475767475767475767475767475767475763F3F400D0D0D747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 747576747576747576747576747576747576444444010101747576747576747576747576747576 747576747576747576747576747576747576747576747576747576747576747576747576747576 7475767475766E6E701111118F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53738386D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A5A5B6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171718 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C171717 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2525258F90928F90928F9092 8F90928F9092898A8C0909099E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909098384858F90928F90928F90928F90928F90923E3F402F2F2FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55051524B4B4C8F90928F90928F9092 8F90928F909278797B050505FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373737B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C0F0F0F8F90928F90928F90928F90928F90928D8E901A1A1B656565FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2D2E8F90928F90928F90928F9092 8081830E0E0E020202E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384858F90928F90928F90928F90923A3A3B0B0B0B787878FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55353554B4B4C8F90928F90928F90928F9092 6D6E700606060B0B0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C1515158F90928F90928F90928F9092898A8C1D1D1E0C0C0DBABABAFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928F90928081830E0E0F 333334111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384858F90928F90928F90923A3A3B0E0E0F404041828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90928F90926D6E70060606 5152521A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 1515158F90928F90928F9092898A8C1D1D1E1E1E1F2B2B2CBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928081830E0E0F3333348F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 8384858F90928F90923A3A3B0E0E0F828385464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90926D6E700606065555567D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C151515 8F90928F9092898A8C1D1D1E1E1E1F8E8F912C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928081830E0E0F3333348F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838485 8F90923A3A3B0E0E0F8283858F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90926D6E700606065555568F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515158F9092 898A8C1D1D1E1F1F1F8E8F918F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8081830E0E0F3333348F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384853A3A3B 0E0E0F8283858F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55354554B4B4C6D6E700606065555568F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C151515898A8C1D1D1E 1F1F1F8E8F918F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF989898484849B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D2828290E0E0F3333348F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D3737380E0E0F828385 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55354554243440606065555568F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32B2C2CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1213131D1D1E1F1F1F8E8F91 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7474742F3030626264626264626264626264626264626264626264626264626264626264626264 626264626264626264626264626264626264626264626264626264232424505152626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 626264626264626264626264626264232324474849626264626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262644F50500000003535378F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3000000626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262646262644B4B4C121313626264626264626264626264626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264545454060606 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262646262646262646262646262646262646262646262640000000F0F108384868F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 303031515253626264626264626264626264626264626264626264626264626264626264626264 6262646262646262646262646262646262646262646262646262640C0C0D5B5B5C626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262646262646262646262646262640D0D0E565758626264626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262642323230000005657588F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAA131313626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262646262643535353A3A3B626264626264626264626264626264626264626264626264626264 626264626264626264626264626264626264626264626264626264626264626264363636272728 626264626264626264626264626264626264626264626264626264626264626264626264626264 6262646262646262646262646262646262646262645A5A5B0000001313138E8F918F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF959595 0303032E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E0F0F0F1E1E1E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2D2E2E1212121D1D1E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2526262627278F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC0303032E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2223230505052D2D2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2626270404042E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2D2D2E0303038283848F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF474747 2525262E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2D2E2E0404042626272E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2D2E2E0808082627272E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2D2E2E 1B1B1B4848498F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C00303032E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E1919190606062E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E19191A0404042E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E 2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2A2A2A0D0E0E8F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B171718 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3030318F90928F90928F90928F90928F90928F90920A0A0AE6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171718838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5454554B4B4C8F90928F90928F90928F90928F90927D7D7F0B0B0CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717178F90928F90928F90928F90928F9092 8F9092282929BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 2525268F90928F90928F90928F90928F9092868688000000E0E0E0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909098384858F90928F90928F90928F90928F9092 141414797979FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5505152 4B4B4C8F90928F90928F90928F90928F9092737475000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373737B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B0F0F108F90928F90928F90928F90928F90928C8D8F 000000B0B0B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E 8F90928F90928F90928F9092868688171717050506E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858F90928F90928F90928F909248494A060606 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C 8F90928F90928F90928F90927677790708080C0C0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1515168F90928F90928F90928F90928C8D8F29292A080808 BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F9092 8F90928F90928686881717172D2D2E111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858F90928F90928F909248494A0B0B0B3E3E3F828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F9092 8F90928F90927677790808084D4E4E1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1515168F90928F90928F90928C8D8F29292A1A1A1B2B2B2CBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F9092 8686881717172D2D2E8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D8384858F90928F909248494A0B0B0B7F8082464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F9092 7677790808085050527D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1515168F90928F90928C8D8F29292A1A1A1B8C8D8F2C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F9092868688171717 2D2D2E8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D8384858F909248494A0B0B0B7F80828F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F9092767779080808 5050528F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1515168F90928C8D8F29292A1A1A1B8C8D8F8F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8686881717172D2D2E8F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D83848548494A0B0B0B7F80828F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C7677790808085050528F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1515168C8D8F29292A1A1A1B8C8D8F8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898474848B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2A2A2B1717172D2D2E8F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D4546470B0B0B7F80828F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554445460808085050528F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32B2B2B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 14141529292A1A1A1B8C8D8F8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF909090333434737375737375737375737375737375737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 2A2A2B5D5E5F737375737375737375737375737375737375737375737375737375737375737375 7373757373757373757373757373757373757373757373757373752B2B2B4C4D4E737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 7373757373757373757373757373756565661414142D2D2E8F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC000000737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 737375737375737375737375737375737375585859151616737375737375737375737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 737375737375626364080808737375737375737375737375737375737375737375737375737375 737375737375737375737375737375737375737375737375737375737375737375737375000000 0A0A0A7F80828F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF4747475E5F60737375737375737375737375737375737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 0E0F0F6C6C6E737375737375737375737375737375737375737375737375737375737375737375 737375737375737375737375737375737375737375737375737375121212676769737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 7373757373757373757373757373754243440000005050528F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2151516737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 7373757373757373757373757373757373753E3F3F3E3E3F737375737375737375737375737375 737375737375737375737375737375737375737375737375737375737375737375737375737375 7373757373754142422A2A2B737375737375737375737375737375737375737375737375737375 7373757373757373757373757373757373757373757373757373757373757373756C6D6E030304 1A1A1B8C8D8F8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF8F8F8F080808292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A0F0F10 0C0C0C29292A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A0F0F0F0E0E0F292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A2121210D0D0D8F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC070707292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A202020080808232324292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A242425070707272828292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A020202747576 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF3E3E3E1E1E1E292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A090909 151516292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A0909091A1A1A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A1616162929298F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC070708292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A181819080808272828292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A151515090909292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A 292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A292A2A2525260303038C8D8F 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53738386D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5A5A5B6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171718838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B171718 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3030318F90928F90928F90928F90928F90928B8C8D161617C8C8C8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F90924848496B6B6BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927A7B7C181919FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F9092 8F90928F90928F90928D8E902F2F309E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928283841A1B1B818181FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90924344442D2D2DEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90927172730F0F0FB5B5B5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092 8F90928A8B8D2A2A2A575757FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928283841A1B1B818181FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 4344442D2D2DEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90927172730F0F0FB5B5B5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928A8B8D 2A2A2A575757FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928283841A1B1B818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90924344442D2D2D EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90927172730F0F0FB5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928A8B8D2A2A2A575757 FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928283841A1B1B818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90924344442D2D2DEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90927172730F0F0FB5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928A8B8D2A2A2A575757FDFDFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8283841A1B1B818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384854344442D2D2DEEEEEEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 7172730F0F0FB5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188A8B8D2A2A2A575757FDFDFDFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2D2D1A1B1B 818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E4041412D2D2DEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564344450F0F0F B5B5B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1616162A2A2A575757FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898383939676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 676769676769676769676769252626555657676769676769676769676769676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 252626494A4B676769676769676769676769676769676769676769676769676769676769676769 676769676769676769676769676769676769676769676769676769555556000000818181FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC000000676769676769676769676769676769676769676769676769676769676769 6767696767696767696767696767696767696767696767696767696767694F4F50131313676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 676769676769676769676769676769676769575859070707676769676769676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 676769676769676769000000282828EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585859565758676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 6767696767696767696767690D0D0D606061676769676769676769676769676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 1010105B5B5C676769676769676769676769676769676769676769676769676769676769676769 6767696767696767696767696767696767696767696767696767692D2E2E000000B5B5B5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C31E1E1E676769676769676769676769676769676769676769676769676769676769 6767696767696767696767696767696767696767696767696767696767693738383B3B3C676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 67676967676967676967676967676967676939393A282828676769676769676769676769676769 676769676769676769676769676769676769676769676769676769676769676769676769676769 6767696767695F6061000000575757FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7696969676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767545454494949676767676767676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767666666555555 515151676767676767676767676767676767676767676767676767676767676767676767676767 6767676767676767676767676767676767676767676767675C5C5CCACACAFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9C9C9C676767676767676767676767676767676767676767676767676767676767676767 6767676767676767676767676767676767676767676767676767676363633C3C3C656565676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767676767676767676767626262595959676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767646464929292FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E05F5F5F676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767676767666666424242585858676767676767676767676767676767676767676767676767 6767676767676767676767676767676767676767676767676767676767676767676565654A4A4A 5D5D5D676767676767676767676767676767676767676767676767676767676767676767676767 6767676767676767676767676767676767676767676666664E4E4EEFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FAFAFA7F7F7F676767676767676767676767676767676767676767676767676767676767676767 6767676767676767676767676767676767676767676767676767675F5F5F3F4040676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 6767676767676767676767676767675B5B5B585858676767676767676767676767676767676767 676767676767676767676767676767676767676767676767676767676767676767676767676767 676767606060B6B6B6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE7E7E7E979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 9797979797979797978F8F8F353535979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797939393 3E3E3E979797979797979797979797979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797757575FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFBABABA979797979797979797979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797979797525252848484979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 979797979797979797979797979797979797434343979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 979797979797686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F17F7F7F979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 979797979797979797808080484848979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797848484 5A5A5A979797979797979797979797979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797D9D9D9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF929292979797979797979797979797979797979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797959595333333979797979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 9797979797979797979797979797979797975F5F5F979797979797979797979797979797979797 979797979797979797979797979797979797979797979797979797979797979797979797979797 979797979797B0B0B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE636363414242505051505051505051505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 5050514B4B4C1313134545464E4E4F505051505051505051505051505051505051505051505051 5050515050515050515050515050515050515050515050515050515050514E4E4F1414143D3D3E 505051505051505051505051505051505051505051505051505051505051505051505051505051 505051505051505051505051505051505051505051373738000000E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD 1B1B1B505051505051505051505051505051505051505051505051505051505051505051505051 5050515050515050515050515050515050515050515050512B2B2B1D1D1D494A4B505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 5050515050515050515050512C2C2C1414144C4D4D505051505051505051505051505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 4646470000008F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1363636535354505051505051505051505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 5050514444440A0A0A4A4A4A505051505051505051505051505051505051505051505051505051 5050515050515050515050515050515050515050515050515050515050514545460707074A4B4B 505051505051505051505051505051505051505051505051505051505051505051505051505051 5050515050515050515050515050515050514B4C4C000000000000FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D8D8D 313131505051505051505051505051505051505051505051505051505051505051505051505051 5050515050515050515050515050515050515050514F4F501C1C1C3535364C4D4D505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 5050515050515050515050510505052B2B2C4D4E4F505051505051505051505051505051505051 505051505051505051505051505051505051505051505051505051505051505051505051505051 1010100000009E9E9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFE6363632F2F2FBDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA 1D1D1E49494AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE1C1C1C383839C0C1C3C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45F60611D1D1E090909E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD11111198989A C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45E5F5F121212B3B4B6C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C45C5C5D0B0B0CA9AAACC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49B9B9D101010 1B1B1B828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F1363636515152C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A3A4A5 0C0C0C777879C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A60B0C0C656566C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE383839303131191919FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D8D8D1C1C1CB3B4B6 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BEBFC13434352C2C2DBEBFC1C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C43232321F1F20BABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47C7D7E121212 262626BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFE6363632F2F2FB8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1D1D1E49494A C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE1C1C1C383839BDBEC0C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C45F60611D1D1E838486111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD111111929395C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C45E5F5F121212ABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 5C5C5D0B0B0CA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49B9B9D101010636365464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF1F1F1363636515152C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A3A4A50C0C0C777879 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A60B0C0C656567C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4BBBCBE3838393536367C7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D8D8D1C1C1CABACAEC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4BEBFC13434352C2C2DBABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 3232321F1F20B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47C7D7E12121278787A2C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE 6363632F2F2FB8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1D1D1E49494AC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE1C1C1C383839BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C45F60611D1D1E8384868F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD111111929395C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C45E5F5F121212ABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45C5C5D0B0B0C A1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49B9B9D1010106363658F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 363636515152C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A3A4A50C0C0C777879C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4A4A5A60B0C0C656567C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 BBBCBE3838393536368D8E907D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D8D8D1C1C1CABACAEC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BEBFC13434352C2C2DBABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43232321F1F20 B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47C7D7E12121278787A8F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6363632F2F2F B8B9BBC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1D1D1E49494AC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4BBBCBE1C1C1C383839BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45F6061 1D1D1E8384868F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFBDBDBD111111929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 5E5F5F121212ABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45C5C5D0B0B0CA1A2A4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49B9B9D1010106363658F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1363636515152 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A3A4A50C0C0C777879C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4A4A5A60B0C0C656567C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE383839 3536368D8E908F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8D8D8D1C1C1CABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BEBFC1 3434352C2C2DBABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43232321F1F20B5B6B8C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47C7D7E12121278787A8F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6363632F2F2FB8B9BBC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B7B8BA1D1D1E49494AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 BCBDBF1C1C1C383839BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45F60611D1D1E838486 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFBDBDBD111111929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45E5F5F121212 ABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45C5C5D0B0B0CA1A2A4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C49B9B9D1010106363658F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1363636515152C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4A4A5A60C0C0C777879C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 A4A5A60B0C0C656567C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE3838393536368D8E90 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8D8D8D1C1C1CABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BFC0C23434352C2C2D BABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43232321F1F20B5B6B8C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47C7D7E12121278787A8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F2F2F2FB8B9BBC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C0C1C322222249494AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C41A1B1B 383839BDBEC0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45B5B5C1D1D1E8384868F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DEDEDE111111929395C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47E7F80121212ABACAEC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48283830B0B0CA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4B1B2B41010106363658F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE363636515152C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4B7B8BA0B0B0C777879C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE0B0C0C 656567C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE3838393536368D8E908F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ACACAC1C1C1CABACAEC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4393A3A2C2C2DBABBBDC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C42F2F301F1F20B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C47C7D7E12121278787A8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000050505000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000010101000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000008384868F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000005D5E5F8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000040404000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000005E5E5F8E8F918F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E2000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000008384868F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF98989848494AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3536366D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335B5B5CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2E2E2E8F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC000000B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1C1C1DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0B0C0CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080808 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5656576E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 101010959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32A2A2AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614A4B4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758353636B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C171717 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333 5C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 999A9C1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C 1717178F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2C2D2D8F90928F90928F90928F90928F90928F9092 0D0D0DE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 8384858F90928F90928F90928F90928F9092454646828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55353554B4B4C8F90928F90928F90928F90928F90927D7D7F 131313FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C141414 8F90928F90928F90928F90928F90928F9092252526BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2728288F90928F90928F90928F90928F90926F7071040404 C7C7C7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A838485 8F90928F90928F90928F90928788891C1D1D4E4E4EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161617838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55151534B4B4C8F90928F90928F90928F90928F9092515253040404 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1111118F9092 8F90928F90928F90928F90927B7C7D0A0B0B8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928F90928F9092616163060606040404E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858F9092 8F90928F90928384851212120A0A0A828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90928F90928F90924141420B0B0B151515FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515158F90928F9092 8F90928F90927273740707070B0B0BBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928F9092616163060606666768111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858F90928F9092 8384851212122D2E2E464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55354554B4B4C8F90928F90928F90924141420C0C0C7172741A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515158F90928F90928F9092 7273740707074E4E4F2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D2D2E2E8F90928F90926161630606066667688F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858F9092838485121212 2D2E2E8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55354554B4B4C8F90928F90924141420C0C0C7E7F817D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515158F90928F9092727374070707 4E4E4F8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D2D2E2E8F90926161630606066667688F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8384858384851212122D2E2E8F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5354554B4B4C8F90924141420C0C0C7E7F818F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515158F90927273740707074E4E4F8F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 2D2E2E6161630606066667688F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8081831212122D2E2E8F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5535455 4B4B4C4141420C0C0C7E7F818F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5999A9C1515157273740707074E4E4F8F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898434444B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53333335C5C5DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D1E1F1F 0606066667688F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909090F10102D2E2E8F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5535455303131 0C0C0C7E7F818F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3282828B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373737B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5999A9C0C0C0C0707074E4E4F8F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898980000001B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0808080000001B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B0101010000001B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0000000000006D6E6F 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC0000001A1A1A1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B151515000000 1A1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1414140000001A1A1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1919190000002D2D2E8F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848480000001B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0505060B0C0C1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B0808090303031B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B000000101010828284 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9494940000001B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0F0F0F000000 1A1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B0000000000001A1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B1B 1B1B1B1B1B1B1B1B1B0A0A0A0000005858598F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898982D2E2E7E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F812627274C4D4E7E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 2424244343437E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F815D5E5F2A2A2B8F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC0000007E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F816061630C0C0D7E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F816D6E6F0202027E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F810404048384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5252535353547E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F810707076F70717E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 0F10106464657E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F813E3F404A4A4B8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C31B1B1B7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F814545462A2A2B7E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F814242431E1F1F7E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F817E7F81 7E7F817E7F817475770E0E0E8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B171718 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2C2C2C8F90928F9092 8F90928F90928F90928F9092000000E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C8384858F90928F90928F90928F90928F90923E3F40828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55253544B4B4C8F90928F9092 8F90928F90928F90927D7D7F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1414158F90928F90928F90928F90928F90928F9092141515BBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2828298F90928F90928F9092 8F90928F90926B6C6D050505E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0B8384858F90928F90928F90928F909287888A050505767676FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161617 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55152534B4B4C8F90928F90928F9092 8F90928F90924D4E4F0A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1112128F90928F90928F90928F90928F90927A7B7C020202AFAFAFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928F90928F9092 6B6C6D060606060606E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D8384858F90928F90928F909287888A1B1B1C0D0D0D828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90928F90928F9092 505051090909181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1515168F90928F90928F90928F90927A7B7C0A0A0A101010BBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90928F90926B6C6D060606 616263111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D8384858F90928F909287888A1B1B1C272728464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90928F9092505051090909 6D6E701A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 1515168F90928F90928F90927A7B7C0A0A0A48494A2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90928F90926B6C6D0606066162638F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 8384858F909287888A1B1B1C2727288E8F91464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90928F90925050510909097C7C7E7D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B151516 8F90928F90927A7B7C0A0A0A48494A8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D2D2E2E8F90926B6C6D0606066162638F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D838485 87888A1B1B1C2727288E8F918F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55354554B4B4C8F90925050510909097C7C7E8F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1515168F9092 7A7B7C0A0A0A48494A8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D2D2E2E6B6C6D0606066162638F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D8182841B1B1C 2727288E8F918F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55354554B4B4C5050510909097C7C7E8F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1515167A7B7C0A0A0A 48494A8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF989898434444B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D2323230606066162638F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C1919192727288E8F91 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5B6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55354553A3B3B0909097C7C7E8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3272727B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373737B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1011110A0A0A48494A8F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 8C8C8C0000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C0F0F0F0000002B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C0101010000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C0808080000006162638F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC0000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2323230000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C242425000000 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C0000002020208E8F918F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 3C3C3C0000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C0404041919192B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C0808080D0D0D2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C0000000000007C7C7E8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B0000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C1A1A1A0000002B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C070707000000 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C 2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C2B2B2C1B1B1C00000048494A8F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 30313178787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A22222231313378787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A21212132323378787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 5454562122228F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC00000078787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A5B5C5D0A0A0A75767778787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A67676804040478787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A0404048283848F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF525253 4B4C4D78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A08080853535478787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A0C0D0D53535478787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 3738384142438F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C320202078787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A4141421E1E1F78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A3B3B3C21222278787A 78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A78787A 78787A78787A78787A78787A78787A78787A68696A0B0B0B8F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092 464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F9092 2C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647 828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2D BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 8F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 8F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F9092 8F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F9092 8F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F9092 8F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F9092 8F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F9092 8F9092111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0E0E0E8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F9092 7D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 1717188F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092 111111E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E 8384858F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F 1A1A1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B171718 8F90928F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5383839 6D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111 E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E838485 8F90928F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F9092 8F90928F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 97989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F9092 8F90928F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F9092 8F90928F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A 0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F9092 8F90928F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092 8F90928F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F9092 8F90928F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F9092 8F90928F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF989898 4A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7B7C7D3031318F90928F90928F90928F90928F90928F9092111111E6E6E6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F9092 8F9092464647828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5455564B4B4C8F90928F90928F90928F90928F90927D7D7F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F9092 8F90922C2C2DBBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D 3030318F90928F90928F90928F90928F9092737475131313D5D5D5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 88898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928F909288898B 3030317E7E7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5545556 4B4B4C8F90928F90928F90928F90928F90925E5E5F232323FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F90928F90927E7F80 1D1D1DB3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131 8F90928F90928F90928F9092646567101010CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B 1F1F20B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928F90928485871D1E1E767676 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C 8F90928F90928F90928F90924A4B4C242424E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F6061 4C4C4DB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F90928F9092757677101010ACACAC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092 8F90928F9092646567101010CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50E0E0E8384858F90928F90928485871D1E1E767676FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F9092 8F90928F90924A4B4C242424E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4D B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B598999B1717188F90928F90928F9092757677101010ACACACFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3232335C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F90928F9092 646567101010CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50E0E0E8384858F90928485871D1E1E767676FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90928F9092 4A4B4C242424E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B598999B1717188F90928F9092757677101010ACACACFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323233 5C5D5EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D3031318F9092646567101010 CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFC010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50E0E0E8384858485871D1E1E767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C8F90924A4B4C242424 E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C3C3C32E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B598999B1717188F9092757677101010ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D303131646567101010CBCBCBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 010101B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50E0E0E8081831D1E1E767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55455564B4B4C4A4B4C242424E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3 2E2E2EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758373838B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 98999B171718757677101010ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898984A4A4BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53838396D6E6FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53232335C5D5EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57B7C7D242525101010CBCBCBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC010101 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B588898B1F1F20B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B597989A0E0E0EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0A1A1A1A767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5C6E6F70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414959697B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B554555639393A242424E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C32E2E2E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55F60614C4C4DB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758373738B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B598999B 0F0F0F101010ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB3B3B30000002E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 0B0B0B0000002B2B2C2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F0101010000002C2D2D2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F000000000000D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD0000002E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2526260000002525262E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F24242400000029292A2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2C2C2C000000 7A7A7AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF6E6E6E0000002E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 0505050F0F0F2C2D2D2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F0808080707072D2E2E2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F000000070707EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D30000002E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F1A1A1A00000029292A2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F0202020000002B2B2C2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F 2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F2E2E2F131313000000 C2C2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC8C8C8C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2BCBCBC B4B4B4C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C1C1C1BEBEBEC2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2B0B0B0C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C0C0C0C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2DCDCDCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF8F8F8C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2B2B2B2 BEBEBEC2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2BEBEBEC2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2AEAEAEC2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2BFBFBFC2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2 C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2EAEAEAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF464646111111393939FFFFFFFFFFFF FCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF9F9F9D5D5D5C9C9C9F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E3E3E3D1D1D1FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0 CBCBCBF3F3F3FFFFFFFFFFFFFFFFFF2424241111115A5A5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF959595111111121212D8D8D8FFFFFFFFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E2C5C5C5E4E4E4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCACACAD3D3D3FDFDFDFFFFFF747474111111 181818F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1151515111111898989FFFFFFFFFFFF F0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEFEFEFCACACAD3D3D3FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EFEFEFCACACAD3D3D3FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCD6D6D6 CFCFCFF9F9F9FFFFFFFFFFFFC3C3C3111111121212A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF464646111111393939 FFFFFFFFFFFFFCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEFEFEFCACACAD3D3D3FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFCD6D6D6CFCFCFF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFDFDFDFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDD2D2D2CCCCCCF5F5F5FFFFFF FFFFFFFFFFFF747474111111181818F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289B9B9BFCFCFCFFFFFFB9B9B9181818 1414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F 121212131313202020151515FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7323232070707 1616160F0F0FBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B91818181414140D0D0D 0E0E0EB1B1B1FFFFFFFFFFFFFBFBFB8686863E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7E7E7E484848FAFAFAFFFFFFEBEBEB3B3B3B0909091818180101016A6A6AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D4333333060606262626080808BEBEBEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB9B9B91818181414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF8F8F8626262020202202020131313696969FFFFFFFDFDFDD9D9D9000000 E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000EFEFEFFEFEFEFFFFFF767676070707 1B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8626262 020202202020131313696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8626262020202 202020131313696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC181818191919101010 1F1F1FD4D4D4FFFFFFFFFFFFF9F9F9323232939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289B9B9BFCFCFCFFFFFF B9B9B91818181414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8F8F8626262020202202020131313696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC 1818181919191010101F1F1FD4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF 646464010101888888FFFFFFFFFFFFFFFFFFBABABA1B1B1B050505020202111111B4B4B4FFFFFF FFFFFFFDFDFDD9D9D9000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFA3A3A3BFBFBFFFFFFF F7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA080808A9A9A9 FEFEFEFFFFFFEBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF424242454545F5F5F5FEFEFE 6F6F6F101010F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242 222222FFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E 4A4A4AFFFFFFFFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF3F3F31E1E1E626262F7F7F7FFFFFFF5F5F5F6F6F6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF676767272727DDDDDDFFFFFFFEFEFEECECECFFFFFFFFFFFFDEDEDE000000E9E9E9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFF7F7F7FE3E3E3FFFFFF D9D9D90B0B0B777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767272727DDDDDD FFFFFFFEFEFEECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767272727DDDDDDFFFFFF FEFEFEECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1141414787878FFFFFFF9F9F9434343 383838FFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFA3A3A3 BFBFBFFFFFFFF7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767 272727DDDDDDFFFFFFFEFEFEECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1141414787878 FFFFFFF9F9F9434343383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D81B1B1B656565 161616888888FFFFFFFFFFFFFFFFFF999999ADADADFBFBFBEBEBEB333333171717FFFFFFFFFFFF FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 8484840A0A0AFFFFFFFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFFFFFFF424242666666FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0010101C6C6C6FFFFFFFFFFFFEAEAEA 000000B2B2B2FFFFFFF8F8F8E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0A FFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA000000B5B5B5FFFFFFFFFFFFF8F8F8E3E3E3 FFFFFFFFFFFF979797171717F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8484840A0A0AFFFFFFFFFFFFFFFFFFDFDFDFFCFCFCFFFFFF E8E8E8040404BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2F2F2F5F5F5FFFFFFFFFFFFFFFFFFFDFDFDFFCFCFCFFFFFFE8E8E8040404BBBBBBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E8040404BBBBBBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFBBBBBB000000EDEDEDFFFFFFFFFFFFB5B5B5000000 E7E7E7FFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8484840A0A0AFFFFFFFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFE8E8E8040404BBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000EDEDEDFFFFFF FFFFFFB5B5B5000000E7E7E7FFFFFFF8F8F8E3E3E3FFFFFFFFFFFFDEDEDECBCBCBFFFFFF1F1F1F 888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B000000F0F0F0FFFFFFFFFFFF DEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131 535353FFFFFFFFFFFFFFFFFF2B2B2B464646FFFFFFFAFAFA060606B3B3B3EDEDEDD3D3D3F2F2F2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1000000FAFAFAFFFFFFFFFFFFFFFFFF181818 8D8D8DFFFFFF818181010101EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131535353FFFFFF FFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEEFFFFFFFFFFFF818181010101EFEFEF FFFFFF5656565E5E5EF9F9F9D4D4D4E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF2F2F2313131535353FFFFFFFFFFFFD6D6D60000009C9C9CFFFFFFACACAC 090909FEFEFEDFDFDFD9D9D9FBFBFBFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505 A8A8A8FFFFFFFFFFFFD6D6D60000009C9C9CFFFFFFACACAC090909FEFEFEDFDFDFD9D9D9FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACACAC090909FEFEFEDFDFDFD9D9D9FBFBFBFFFFFF FFFFFFFFFFFF2B2B2B464646FFFFFFB1B1B1000000EFEFEFFFFFFFFFFFFFDBDBDB000000C2C2C2 FFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F2F2F2313131535353FFFFFFFFFFFFFFFFFF2B2B2B464646FFFFFFACACAC090909FEFEFEDFDFDF D9D9D9FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1000000EFEFEFFFFFFFFFFFFF DBDBDB000000C2C2C2FFFFFF818181010101EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F131313FEFEFEFFFFFFFFFFFFDEDEDE 000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1 FFFFFFFFFFFFFFFFFF8B8B8B9C9C9CFFFFFFE1E1E10000003131310D0D0D1818180101016D6D6D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFF2828287A7A7A FFFFFFC0C0C06B6B6BFBFBFBFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1FFFFFFFFFFFF FFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF FFFFFFACACAC4848482525251C1C1CC6C6C6FFFFFFFFFFFFFFFFFFC0C0C06B6B6BFBFBFBFFFFFF 3636362525251111111C1C1C050505343434E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 6F6F6F424242121212464646F1F1F1FFFFFFFFFFFFF0F0F0656565D1D1D1FFFFFF8B8B8B0D0D0D 2626261616160E0E0E111111B2B2B2FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFF FFFFFFFFFFFFF0F0F0656565D1D1D1FFFFFF8B8B8B0D0D0D2626261616160E0E0E111111B2B2B2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B0D0D0D2626261616160E0E0E111111B2B2B2FFFFFF FFFFFF8B8B8B9C9C9CFFFFFFE5E5E5060606777777F7F7F7F0F0F0939393000000B7B7B7FFFFFF FFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFF6F6F6F424242121212 464646F1F1F1FFFFFFFFFFFFFFFFFF8B8B8B9C9C9CFFFFFF8B8B8B0D0D0D2626261616160E0E0E 111111B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5060606777777F7F7F7F0F0F0939393 000000B7B7B7FFFFFFC0C0C06B6B6BFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED131313767676FFFFFFFFFFFFFFFFFFDEDEDE000000 E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDF7E2C9F7E2C9F7E2C9FDF6EE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9D9D90000008D8D8DFBFBFBFFFFFFB3B3B3000000BEBEBE FFFFFFFFFFFFFFFFFFFFFFFF9A9A9A060606FFFFFFFFFFFFFFFFFFFFFFFF2929297E7E7EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFBFFFFFFFFFFFF 8989893E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFF DADADAA5A5A58E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E2E2E 474747EBEBEBFFFFFFE9E9E91F1F1F696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC A1A1A1797979121212494949FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484101010CECECE FFFFFFFDFDFD606060161616FDFDFDFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD3D3D3000000F4F4F4FFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484101010CECECEFFFFFFFDFDFD606060161616FDFDFD FFFFFFFFFFFFFFFFFFFFFFFF848484101010CECECEFFFFFFFDFDFD606060161616FDFDFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFA6A6A61A1A1A020202090909484848000000C2C2C2FFFFFFFFFFFF 343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212 494949FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484101010CECECEFFFFFFFDFDFD606060 161616FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6A6A61A1A1A020202090909484848000000 C2C2C2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFE545454252525F4F4F4FFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF2E6F7E2C9F7E2C9 F7E5CEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8D57501D57501D57501F1D0A7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE5E5E5000000BABABAFFFFFFFFFFFFFFFFFF131313909090FFFFFF FFFFFFFFFFFFFFFFFFADADAD000000F5F5F5FFFFFFFFFFFFFFFFFF171717949494FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFF898989 3E3E3EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF6F6F61E1E1E525252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A3A3A656565 FFFFFFFFFFFFFFFFFF6868683A3A3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFF FFFFFFBEBEBE000000E5E5E5FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D3D3D3000000F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFFFFFFFFBEBEBE000000E5E5E5FFFFFF FFFFFFFFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFFFFFFFFBEBEBE000000E5E5E5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2FEFEFECFCFCF000000E8E8E8FFFFFFFFFFFF343434 949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000 A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F101010FFFFFFFFFFFFFFFFFFBEBEBE000000 E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2FEFEFECFCFCF000000E8E8E8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF787878151515DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBC83D57501D57501DA851C FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD67702D57501D57501F0CB9EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFE0C0C0C929292FFFFFFFFFFFFF8F8F8080808A5A5A5FFFFFFFFFFFF FFFFFFFFFFFFD8D8D8000000BEBEBEFFFFFFFFFFFFE0E0E0000000CBCBCBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF8989893E3E3E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3F3F3F454545FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F3C3C3CFFFFFF FFFFFFFFFFFF5656564F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E90000009A9A9AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFF ACACAC020202F7F7F7FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3 000000F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFFACACAC020202F7F7F7FFFFFFFFFFFF FFFFFFFFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFFACACAC020202F7F7F7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787878313131FFFFFFFFFFFFFFFFFF343434949494 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2828289F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5000000E6E6E6FFFFFFFFFFFFACACAC020202F7F7F7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787878313131FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFF 8989890E0E0ECBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAB87AD57501D57501DC8A25FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD77B0BD57501D57501EEC695FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828 9F9F9FFFFFFFFFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFFFFFFF777777 8B8B8BFFFFFFFFFFFF5C5C5C262626E2E2E2F7F7F7727272131313EEEEEEFFFFFF9D9D9D646464 FFFFFFFFFFFF3333333D3D3DEAEAEAF1F1F1505050323232FFFFFFFFFFFFB4B4B4535353F9F9F9 FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFFFFFFF8989893E3E3EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFA7A7A7A1A1A1F0F0F0FAFAFA AAAAAA030303919191FFFFFFFFFFFFB4B4B4535353F9F9F9FFFFFFB1B1B1010101B3B3B3FDFDFD BABABA070707ACACACFFFFFFDADADA464646E1E1E1FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363 090909DDDDDDFFFFFFECECEC4E4E4EC7C7C7FFFFFFF5F5F5111111666666F8F8F8E4E4E4313131 565656FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000 F4F4F4FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFFECECEC4E4E4E C7C7C7FFFFFFF5F5F5111111666666F8F8F8E4E4E4313131565656FFFFFFFFFFFF5E5E5EA4A4A4 FFFFFFF5F5F5111111666666F8F8F8E4E4E4313131565656FFFFFFFFFFFF7777778B8B8BFFFFFF FDFDFDCACACAFCFCFCF3F3F39A9A9A070707B4B4B4FFFFFFFFFFFFFFFFFF343434949494FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF2828289F9F9FFFFFFFFFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFF FFFFFF7777778B8B8BFFFFFFF5F5F5111111666666F8F8F8E4E4E4313131565656FFFFFFFFFFFF 9D9D9D646464FFFFFFFDFDFDCACACAFCFCFCF3F3F39A9A9A070707B4B4B4FFFFFFFFFFFFB4B4B4 535353F9F9F9FFFFFFFEFEFEEBEBEBEBEBEB1C1C1C7E7E7EEBEBEBF8F8F8FFFFFF9D9D9D030303 9F9F9FDBDBDBDBDBDBDBDBDBF1F1F1FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8B371D57501D57501DD8F2FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD98115D57501D57501ECC089FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9F FFFFFFFFFFFF838383101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF3232324D4D4D FFFFFFFFFFFFEAEAEA3C3C3C0000000404042B2B2BC7C7C7FFFFFFFFFFFF6565652D2D2DFFFFFF FFFFFFE1E1E13434340202020606063E3E3EE7E7E7FFFFFFFFFFFF878787060606F1F1F1FFFFFF 838383101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFC0C0C02727270000000202020C0C0C 7B7B7BFEFEFEFFFFFFFFFFFF878787060606F1F1F1FFFFFFFFFFFF777777050505040404101010 8D8D8DFFFFFFFFFFFFBABABA000000D8D8D8FFFFFF838383101010020202000000252525B6B6B6 FFFFFFFFFFFFDADADA010101A2A2A2FFFFFFFFFFFFB9B9B9191919040404060606555555EDEDED FFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4 FFFFFFF1F1F14848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFFDADADA010101A2A2A2 FFFFFFFFFFFFB9B9B9191919040404060606555555EDEDEDFFFFFFFFFFFF0F0F0F828282FFFFFF FFFFFFB9B9B9191919040404060606555555EDEDEDFFFFFFFFFFFF3232324D4D4DFFFFFFF7F7F7 1B1B1B050505030303202020AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2828289F9F9FFFFFFFFFFFFF838383101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF 3232324D4D4DFFFFFFFFFFFFB9B9B9191919040404060606555555EDEDEDFFFFFFFFFFFF656565 2D2D2DFFFFFFF7F7F71B1B1B050505030303202020AAAAAAFFFFFFFFFFFFFFFFFF878787060606 F1F1F1FFFFFFC7C7C7000000000000000000000000000000787878FFFFFF454545000000000000 0000000000000000007E7E7EFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6AC65D57501D57501DF9439FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDD8D2BD57501D57501E8B26FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2828289F9F9FFFFFFF FFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFFFFFF FFFFFFFFFFFFFFFFFFEDEDEDEFEFEFFFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFF FFFFFFFFFFFFF1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFFFFFFFF FDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8989893E3E3EFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7E5E5E5FFFFFFFFFFFF FFFFFFFFFFFF6E6E6E494949FFFFFFFFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFF FFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000F4F4F4FFFFFF FFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FFFFFFFFFFFF FFFFFFFFFFFFFDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFFC4C4C40E0E0EE4E4E4FFFFFFFFFFFF FFFFFFFDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFFFFFFFFFFFFFEFEFE E3E3E3EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828 9F9F9FFFFFFFFFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9 FBFBFBFFFFFFFFFFFFFFFFFFFDFDFDE5E5E5F9F9F9FFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9E FFFFFFFFFFFFFEFEFEE3E3E3EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE29E4BD57501D57501E3A150FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE19C48D57501D57501E3A253FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828585858A1A1A1FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9696964C4C4C3E3E3EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7E7E7E2929298D8D8DEDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E9181818E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC 7B7B7B000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000878787C7C7C7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848489C9C9CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2E2E28D8D8D1C1C1C949494FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828585858 A1A1A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFBCBCBC7B7B7B000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDD8E2ED57501D57501E7B06CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE6AC65D57501D57501DE9336FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2808080969696FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8B8B808080ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFCDCDCD808080808080EBEBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6B6B6808080 868686FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F4F4838383808080C1C1C1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE0E0E0808080808080D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2A2A2808080969696 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB6B6B6808080868686FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD87F12D57501D57501ECC089FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFEBBC83D57501D57501D87F12FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDF6EDD57501D57501D57501F1D0A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F2D4AFD57501D57501D57501FBEFE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F5DCBDD57501D57501D57501F8E8D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEFE0 D57501D57501D57501F3D5B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC28E D57501D57501D77A08FFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD87F12 D57501D57501EABA7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A75BD57501 D57501DE9234FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B46D57501 D57501DF963CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCF4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF2F2F2FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA841AD57501D57501 E7AE69FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECC08AD57501D57501 D67804FDF8F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF9292923B3B3BFFFFFFFFFFFFFFFFFFF0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFEFEFE 161616BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606E4E4E4FFFFFFFFFFFF FCFCFCD0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC D0D0D0CBCBCBF3F3F3FFFFFFFFFFFFFFFFFF6A6A6A6A6A6AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3D3D3D919191FFFFFFFFFFFFFFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0C5C5C5E5E5E5FFFFFFFFFFFFFFFFFFC0C0C0 181818FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9292923B3B3BFFFFFFFFFFFFFFFFFF F0F0F0C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0 C7C7C7D6D6D6FCFCFCFFFFFFFFFFFFFEFEFE161616BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E9D6D57501D57501D57501F2D3AC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E7D1D57501D57501D57501 F3D5B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FEFEFE232323919191FFFFFFFFFFFF7676760707071B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7676760707071B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFF6A6A6A 5D5D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7878783B3B3BFFFFFFFFFFFFB9B9B9181818 1414140D0D0D0E0E0EB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9B9B9181818141414 0D0D0D0E0E0EB1B1B1FFFFFFFFFFFFC0C0C0101010F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CDCDCD010101E4E4E4FFFFFFEBEBEB3B3B3B0909091818180101016A6A6AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEBEBEB3B3B3B0909091818180101016A6A6AFFFFFFFFFFFFFDFDFD181818 B2B2B2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE232323919191FFFFFFFFFFFF767676070707 1B1B1B0404042D2D2DE8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7676760707071B1B1B 0404042D2D2DE8E8E8FFFFFFFFFFFF6A6A6A5D5D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC491D57501D57501D67703FDF6EEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD98218D57501D57501E5A85E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C8 020202E6E6E6FFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D90B0B0B777777FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D90B0B0B777777FFFFFFFFFFFFC2C2C2090909 F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E1E1E939393FFFFFFFFFFFFA3A3A3BFBFBFFFFFFF F7F7F7424242222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A3BFBFBFFFFFFFF7F7F7 424242222222FFFFFFFFFFFFFDFDFD191919A5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF727272 3E3E3EFFFFFFFFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD7D7D7939393F7F7F7FFFFFF8F8F8F000000CCCCCCFFFFFFFFFFFF6C6C6C505050 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C8020202E6E6E6FFFFFFFFFFFF7F7F7FE3E3E3FFFFFF D9D9D90B0B0B777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FE3E3E3FFFFFFD9D9D9 0B0B0B777777FFFFFFFFFFFFC2C2C2090909F1F1F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0973ED57501D57501DF9337FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6AD67D57501D57501D77C0CFEFAF5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B383838 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F5F5F5FFFFFFFFFFFFFFEFEFE121212A6A6A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD0D0D0000000E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 8484840A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF848484 0A0A0AFFFFFFFFFFFFFFFFFF666666505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2626268D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA000000B5B5B5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA000000B5B5B5FFFFFFFFFFFFBBBBBB040404F6F6F6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7B7B7B383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2F2F2F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F 5F5F5FFFFFFFFFFFFFFEFEFE121212A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBF0E3D67601D57501D57501ECBF87FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E0C5D57501D57501D57501F1CFA5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4545455A5A5AFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8FFFFFFFFFFFFFFFFFF333333808080FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9B9B9B060606FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131 535353FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2313131535353 FFFFFFFFFFFFFFFFFF8888882A2A2AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF000000AFAFAFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A0F0F0FEEEEEEFFFFFFFFFFFFDEDEDE000000D5D5D5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4545455A5A5AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505 A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9050505A8A8A8 FFFFFFFFFFFFFFFFFF333333808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFECC18BD57501D57501D67601FBEFE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB8924D57501D57501E0973DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF212121767676FFFFFFFFFFFF FFFFFFE8E8E84A4A4A383838090909888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E8E8E84A4A4A383838090909888888FFFFFFFFFFFFFFFFFFFFFFFF4F4F4F5E5E5EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF767676202020FFFFFFFFFFFFFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6F424242121212464646F1F1F1FFFFFF FFFFFFFFFFFFA5A5A5090909FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB000000CBCBCBFFFFFFFFFFFF FFFFFFACACAC4848482525251C1C1CC6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ACACAC4848482525251C1C1CC6C6C6FFFFFFFFFFFFFFFFFFF9F9F9010101B3B3B3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF212121767676FFFFFFFFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E84A4A4A383838090909888888FFFFFFFFFFFF FFFFFFFFFFFF4F4F4F5E5E5EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFEDC8A25D57501D57501E0973EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBD84D57501D57501D57501F6E2C8FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010909090FFFFFFFFFFFFFFFFFF F8F8F8A6A6A69999995B5B5B050505969696FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8 A6A6A69999995B5B5B050505969696FFFFFFFFFFFFFFFFFF6A6A6A3D3D3DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF6565653B3B3BFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBCA1A1A1797979121212494949FBFBFBFFFFFF FFFFFFBFBFBF000000E8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA000000E6E6E6FFFFFFFFFFFFFFFFFF DADADAA5A5A58E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA A5A5A58E8E8E3131311B1B1BD4D4D4FFFFFFFFFFFFFFFFFF151515929292FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF101010909090FFFFFFFFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8A6A6A69999995B5B5B050505969696FFFFFFFFFFFF FFFFFF6A6A6A3D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3D6B2D57501D57501D57501F0CB9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5ECD77B0BD57501D57501E3A252FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF151515858585FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF5F5F5F3D3D3DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 6A6A6A303030FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000A8A8A8FFFFFFFFFFFF B4B4B4000000E7E7E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000DADADAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF6F6F61E1E1E525252FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6F6F61E1E1E525252FFFFFFFFFFFFFFFFFF0A0A0A929292FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 151515858585FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A060606F6F6F6FFFFFFFFFFFF 5F5F5F3D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE09840 D57501D57501D98217FEFCF8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8B26FD57501D57501D67601F7E4CCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF949494000000EFEFEFFFFFFFFFFFFF434343505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D7D7D 131313FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90000009A9A9AFFFFFFFFFFFF989898 020202F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000BEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3F3F3F454545FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF3F3F3F454545FFFFFFFFFFFFEEEEEE000000A5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF282828 686868FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949494000000EFEFEFFFFFFFFFFFFF434343 505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5DCBED57501D57501 D57501EBBC82FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBEFE1D67805D57501D57501E0973DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5454544C4C4CFFFFFFFFFFFFE1E1E17A7A7ADDDDDDFEFEFE D5D5D52828283C3C3CFFFFFFFFFFFF9D9D9D646464FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D5 2828283C3C3CFFFFFFFFFFFFFFFFFF2727277C7C7CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A9A9000000 F6F6F6FFFFFFFFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFDADADA464646 E1E1E1FFFFFF7A7A7AC3C3C3FAFAFAEFEFEF636363090909DDDDDDFFFFFFFFFFFF7C7C7C272727 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9050505A1A1A1FFFFFFFFFFFFA7A7A7A1A1A1F0F0F0FAFAFA AAAAAA030303919191FFFFFFFFFFFF5E5E5EA4A4A4FFFFFFA7A7A7A1A1A1F0F0F0FAFAFAAAAAAA 030303919191FFFFFFFFFFFFD1D1D1000000D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5454544C4C4C FFFFFFFFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFF9D9D9D646464 FFFFFFE1E1E17A7A7ADDDDDDFEFEFED5D5D52828283C3C3CFFFFFFFFFFFFFFFFFF2727277C7C7C FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDE9234D57501D57501D77B0B FCF5ECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE8B372D57501D57501D57501F1D1A9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8F8F8F1B1B1BFEFEFEFFFFFFF1F1F1484848040404020202020202 4B4B4BE2E2E2FFFFFFFFFFFF6565652D2D2DFFFFFFF1F1F14848480404040202020202024B4B4B E2E2E2FFFFFFFFFFFFEEEEEE050505B7B7B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3000000C3C3C3 FFFFFFFFFFFF838383101010020202000000252525B6B6B6FFFFFFFFFFFFBABABA000000D8D8D8 FFFFFF838383101010020202000000252525B6B6B6FFFFFFFFFFFFFFFFFF494949616161FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939396E6E6EFFFFFFFFFFFFC0C0C02727270000000202020C0C0C 7B7B7BFEFEFEFFFFFFFFFFFF0F0F0F828282FFFFFFC0C0C02727270000000202020C0C0C7B7B7B FEFEFEFFFFFFFFFFFF9F9F9F101010FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F8F1B1B1BFEFEFE FFFFFFF1F1F14848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFF6565652D2D2DFFFFFF F1F1F14848480404040202020202024B4B4BE2E2E2FFFFFFFFFFFFEEEEEE050505B7B7B7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CEA4D57501D57501D57501EBBB81FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDF7F0D98116D57501D57501D98116FCF4E9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE0E0E0000000C3C3C3FFFFFFFFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFF FFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFF FFFFFFFFFFFF9E9E9E0F0F0FF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3636366E6E6EFFFFFF FFFFFFFFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF6E6E6E494949FFFFFFFFFFFF FFFFFFFDFDFDE3E3E3EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE050505B3B3B3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF8C8C8C1B1B1BFEFEFEFFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFF FFFFFFFFFFFFC4C4C40E0E0EE4E4E4FFFFFFFFFFFFFFFFFFECECECE4E4E4FEFEFEFFFFFFFFFFFF FFFFFFFFFFFF4949495D5D5DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0000000C3C3C3FFFFFF FFFFFFFFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFAFAFA1E1E1E9E9E9EFFFFFFFFFFFF FFFFFFF6F6F6E0E0E0F8F8F8FFFFFFFFFFFFFFFFFFFFFFFF9E9E9E0F0F0FF9F9F9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF4EAD98115D57501D57501DA841AFEFAF5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEFC99BD57501D57501D57501E2A04EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4848486E6E6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D1A1A1AFEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9181818E2E2E2FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D1E1E1EFBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEAEAEA080808C3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF4848489C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EDEDED050505C4C4C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486E6E6EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D474747FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE4A456D57501D57501D57501F0CC9FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFEE19C48D57501D57501D57501EDC38FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC9C9C9707070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE 595959E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F95A5A5AE5E5E5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF909090A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8E8E8EAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C6C6C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB 6E6E6EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9C9C9707070FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D6EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE595959E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEFCA9DD57501D57501D57501E19C47FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCF3E7D98014D57501D57501D67702F3D7B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F7E2C9D77907D57501D57501D87E10FBF0E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF3D7B4D67702D57501D57501D77C0CF7E3CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEEDFDA841A D57501D57501D57501F1D0A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEDC28ED57501D57501D57501D87D0EF6E0C4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0E2DB8721D57501D57501 D57501E9B677FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE7AF6AD57501D57501D57501D77B0BF3D7B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAECDBDB8823D57501D57501D57501E29E4B FFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFEFDE6AB62D57501D57501D57501D67601EABA7FFFFEFDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5DCBED87F12D57501D57501D57501E09840FEFAF5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFEE8B26FD57501D57501D57501D57501E09942F9EBDAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFDFAEBBC82D67804D57501D57501D57501E09840FEFAF5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFECC18BD67804D57501D57501D57501D77907EAB97DFDF8F2FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F6E2C8DD8F2FD57501D57501D57501D57501E3A355FEFAF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF5DEC2DA841AD57501D57501D57501D57501D87E0FE9B678FBF1E5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E1C7E29E4AD57501 D57501D57501D57501D67702EBBD85FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFCF4EAE5A95FD67601D57501D57501D57501D57501D67702E0973DEDC38FF8E7D2 FFFDFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFBF7E5CEEBBC83DC8C29D57501D57501D57501D57501 D57501DB8924F5DCBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF6E0C4DE9132D57501D57501D57501D57501D57501D57501D57501D77907 DE9133E2A04EE5A85EE7B06DE8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E9B576EBBB81EFC899F5DEC2FEF9F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF4 F6E1C6F0CB9EECBE86E9B678E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371E8B371 E8B270E6AB62E3A151DF9337D77A08D57501D57501D57501D57501D57501D57501D77907E9B677 FEFBF6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF4DAB9E19B46D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D67702DC8C2AE9B474F7E3CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAF4DABAE7AE69DC8A26D67702D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D77B0AE8B270FBF1E5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EBD9ECBF88DF9337D67601D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501DC8A25EFC899FFFCF9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAEFE0E8B371D87E10D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501D67703E19A43EFC99BFDF6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF6EDF5DCBDEDC28EE6AB62E19C48DF9438 DD8F30DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDB8924D87F12D67702 D57501D57501D57501D57501D57501D57501D57501DA851CEFC99AFFFFFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFAEEDFE4A659D67804D57501D57501D57501D57501D57501D57501D57501D67601D87E0F DA861EDD8D2CDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2E DD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8E2EDD8F2FDE9235E19A43 E5A85DECC08AF5DCBEFDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFAF7E4CC EEC797E3A252D77A08D57501D57501D57501D57501D57501E0973DF9EAD8FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCF8EBBC82 D77A09D57501D57501D57501D57501D57501D87E10E5A85DEFC99AF7E3CAFEFBF7FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDF7F0EFC99BDC8A25D57501D57501D57501D57501D77907EFCA9DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E9D6DC8C2AD57501D57501 D57501D57501D67601E29F4DF4D9B8FFFDFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFEFCF0CDA1DA841AD57501D57501D57501D57501E7B06DFFFDFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CEA4D77B0BD57501D57501D57501D57501 E4A659F9E9D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDF7EFE5AA61D57501D57501D57501D57501E29F4CFFFCF9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBBB80D57501D57501D57501D57501DC8B28F5DCBEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF1D1AAD77B0AD57501D57501D57501E29E4BFFFCF9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE8B372D57501D57501D57501D57501E6AC65FEFCF8FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF7E4CCDA841AD57501D57501D57501E3A150FFFFFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE8B371D57501D57501D57501D77907F0CB9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAECDBDA841AD57501D57501D57501EAB87AFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEC593 D57501D57501D57501D77A09F4D9B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF9EAD8D98217D57501D57501D57501F1D0A7FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D7B4D67703D57501 D57501D77B0BF5DDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6E2C8D77907D57501D57501D87D0DFAEFE0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF1E5D87F12D57501D57501D67702 F2D5B0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEFCA9CD57501D57501D57501E09941FFFFFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE19A44D57501D57501D57501ECC18BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE5A85DD57501D57501D57501EEC695FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDC491D57501D57501D57501E3A253FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDF6EEDA8319D57501D57501D87F12FDF6EEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCF4EAD87E0FD57501D57501D98218FCF5ECFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF2D4AFD57501D57501D57501E8B372FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE6AC65D57501D57501D57501F3D7B4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE09942D57501D57501D67906FAEEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F8E7D2D67702D57501D57501E29E4AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF7E4CCD67601D57501D57501E7B06CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A65A D57501D57501D67804F9EAD7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE3A355D57501D57501D77B0BFDF6EEFFFFFFFFFFFFFFFFFFFAEEDFD67703D57501 D57501E6AD66FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF6E2C8D57501D57501D57501ECBE86FFFFFFFFFFFFFFFFFFE7B06CD57501D57501D67702 F9EBDAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDF9439D57501D57501DB8823FFFFFFFFFFFFFEFCF8D87E10D57501D57501E3A252FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F1CFA6D57501D57501D57501F6E1C7FFFFFFF1D1AAD57501D57501D57501F5DDC0FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFAF5 D77B0BD57501D57501E7AF6BFFFFFFE29F4CD57501D57501DB861FFFFFFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A65A D57501D57501D98217FDF7F0D67804D57501D57501E9B779FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D5B1D57501 D57501D57501EBBB80D57501D57501D57501F8E7D1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9F3D67805D57501 D57501D77C0CD57501D57501DA8319FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF963CD57501D57501 D57501D57501D57501E5A85EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEABA7FD57501D57501D57501 D57501D57501F0CDA2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D7B5D57501D57501D57501D57501 D57501F9EAD8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF1E5D57501D57501D57501D57501D77B0B FFFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD98014D57501D57501D57501DF9439FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0973ED57501D57501D57501E6AB62FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4A75BD57501D57501D57501EABA7FFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE9B677D57501D57501D57501EFC99BFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFEEC592D57501D57501D57501F4D9B7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF0CDA2D57501D57501D57501F6E1C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF2D2ABD57501D57501D57501F8E6CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F3D7B4D57501D57501D57501F9EBD9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAEEDF ECBF87ECBF87ECBF87FDF7F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFCACACA6262626C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C3E3E3E3535356C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C4646465C5C5C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C4B4B4B3F3F3F6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5F5F5F313131 6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C4747475B5B5B6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C5252524B4B4B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C636363 4949496B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C5959594B4B4B6B6B6B6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6666665B5B5B6B6B6B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 4545454B4B4B6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C4A4A4A5656566C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C 6C6C6C6C6C6C6C6C6C6C6C6C6C6C6C676767BFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA 1212127172736C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E4242431212126C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E4646460808086D6E6F6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 5151520606067272746C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E4444440808086565666C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E4747470808086E6F706C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E5252530606067172736C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E454546080808646566 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E4848490808084445456C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E5353540606063D3D3E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E4646460E0E0E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E494A4A0707077070716C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E6C6D6E 6C6D6E6C6D6E6C6D6E666768000000161616FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA12121288888A C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F700D0D0DA7A8A9C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C46B6C6E09090998999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4838485070707 858688C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47172730D0D0DA1A2A4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C46F6F70080808979899C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4858688 070707848586C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47374750B0B0CA1A2A3C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4717273080808959597C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 88898A070707828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47677780B0B0CA1A2A3C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4757576080808939495C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4A8A9AB1717184D4E4F333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA12121288888AC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C46E6F700D0D0DA4A5A6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 6B6C6E09090998999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4838485070707858688C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47172730D0D0DA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C46F6F70080808979899C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4858688070707848586 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47374750B0B0CA1A2A3C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4717273080808959597C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488898A070707 828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47677780B0B0C9E9FA1C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4757576080808939495C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB 1717185657586D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA12121288888AC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C46E6F700D0D0DA4A5A6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6C6E090909 98999BC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4838485070707858688C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47172730D0D0DA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46F6F70 080808979899C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4858688070707848586C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C47374750B0B0CA1A2A3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 717273080808959597C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488898A070707828284C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C47677780B0B0C9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4757576080808939495C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB171718565758 8F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFCACACA12121288888AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 6E6F700D0D0DA4A5A6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6C6E09090998999BC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4838485070707858688C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C47172730D0D0DA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46F6F70080808979899 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4858688070707848586C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C47374750B0B0CA1A2A3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4717273080808 959597C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488898A070707828284C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C47677780B0B0C9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4757576 080808939495C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB1717185657588F90928F9092 6D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFCACACA12121288888AC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F700D0D0D A4A5A6C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6C6E09090998999BC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4838485070707858688C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4717273 0D0D0DA1A2A4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46F6F70080808979899C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4858688070707848586C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 7374750B0B0CA1A2A3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4717273080808959597C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C488898A070707828284C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C47677780B0B0C9E9FA1C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4757576080808939495 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A8A9AB1717185657588F90928F90928F90926D6E70 333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E6E6E60808097F8081A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A378797B070707999A9CA1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A378797A040404909192A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A39394960303037D7E7FA1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A35C5C5D070707999A9C A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A37C7C7E0303048F8F91A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A39091930303037C7C7EA1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A35B5C5D060606 98999BA1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A36B6C6D0303038C8D8EA1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A37C7D7F030303797A7BA1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A37B7C7C 060606969798A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A38181830303038B8B8DA1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3A1A2A3 A1A2A3A1A2A3A1A2A3A1A2A39FA0A21717185657588F90928F90928F90928F90926D6E70333333 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF030303 0A0A0A202020202020202020202020202020202020202020202020202020202020202020202020 2020202020202020202020202020202020202020202020200000001212121C1C1C1C1C1C1C1C1C 1C1C1C1C1C1C1B1B1B181818202020202020202020202020202020202020202020202020202020 2020202020202020201212130000000F0F0F1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1A1A1A1A1A1A 202020202020202020202020202020202020202020202020202020202020202020202020202020 0101010606061C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1A1A1B191919202020202020202020202020 2020202020202020202020202020202020202020202020202020200000001515161C1C1C1C1C1C 1C1C1C1C1C1C1C1C1C1B1B1B181818202020202020202020202020202020202020202020202020 2020202020202020202020201313140000000E0E0E1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1A1A1A 1A1A1A202020202020202020202020202020202020202020202020202020202020202020202020 1616170202020606061C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1A1B1B191919202020202020202020 2020202020202020202020202020202020202020202020202020201B1B1C0000001717171C1C1C 1C1C1C1C1C1C1C1C1C1C1C1C1B1B1C171718202020202020202020202020202020202020202020 2020202020202020202020202020202020200000001313131C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1A1A1A1A1A1A202020202020202020202020202020202020202020202020202020202020202020 2020201717180000000E0E0F1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1B1B1B191919202020202020 2020202020202020202020202020202020202020202020202020202020201B1B1C000000121212 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1B1B1C171718202020202020202020202020202020202020 2020202020202020202020202020202020201414140000000D0D0D1C1C1C1C1C1C1C1C1C1C1C1C 1C1C1C1A1A1B19191A202020202020202020202020202020202020202020202020202020202020 2020202020201818180000005B5C5D8F90928F90928F90928F90928F90926D6E70333333FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2F898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50707079FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5121212 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E70333333FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F9092 8F90928F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F9092 6D6E70333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E70 333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E70333333 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E70333333FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3C3D5A5B5C8F90928F90928F90928F90928F90926D6E70242424FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141515 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53A3B3B5A5B5C8F90928F90928F90928F90928A8B8D252626040404FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3F3F405A5B5C8F90928F90928F9092898A8C1D1D1D1B1B1C333333FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F40 5A5B5C8F90928F9092898A8C1D1D1D1F1F1F6C6D6E343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C 8F9092898A8C1D1D1D1F1F1F8E8F916D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C898A8C 1D1D1D1F1F1F8E8F918F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F4059595B1D1D1D1F1F1F 8E8F918F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF313232898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50809099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415818284B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3C3D1112121F1F1F8E8F918F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0C0C0C000000040404040404040404040404040404040404040404040404 040404040404040404040404040404040404040404040404040404040404040404040404000000 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404040404040404040404040404040404040404030303050505000000040404040404040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404040404040404030303090909000000040404040404040404040404040404040404040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 000000030303040404040404040404040404040404040404040404040404040404040404040404 040404040404040404040404040404040404040404040404030303050505000000040404040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404040404040404040404030303090909000000040404040404040404040404040404040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404010101020202040404040404040404040404040404040404040404040404040404040404 040404040404040404040404040404040404040404040404040404030303060606000000040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404040404040404040404040404030303080808000000040404040404040404040404040404 040404040404040404040404040404040404040404040404040404040404040404040404040404 040404040404020202010101040404040404040404040404040404040404040404040404040404 040404040404040404040404040404040404040404040404040404040404030303070707000000 040404040404040404040404040404040404040404040404040404040404040404040404040404 0404040404040404040404040404040404040404040000001E1E1F8F90928F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2D2E2E828384A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC000000A7A8AA A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC070707979899A9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAAC111111808182A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC000000 A4A5A7A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC060606949596A9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAAC1213137D7E7FA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC 020202A2A3A5A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC0A0A0A929394A9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAAC1516167B7C7DA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAAC030404A0A1A2A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC0B0B0B8F9092A9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC A9AAACA9AAACA9AAACA9AAACA9AAACA9AAAC3C3C3D5A5B5C8F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E6F333333FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5131314878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3B3C5A5B5C8F90928F90928F90928F90928F9092 6C6D6F080808FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3B3C5A5B5C8F90928F90928F90928F90928C8D8F262626 141414FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8F90928F90928F90928C8D8F282929181919333333 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53F3F405A5B5C8F90928F90928C8D8F2829291B1B1B6A6B6C343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53F3F405A5B5C8F90928C8D8F2829291B1B1B8C8D8F6D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53F3F405A5B5C8C8D8F2829291B1B1B8C8D8F8F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3F3F405A5A5C2829291B1B1B8C8D8F8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF303030898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53E3E3F 1D1D1E1B1B1B8C8D8F8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0A0A000000111111111111111111111111 111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111110000000F0F0F101011101011101011101011101011101011101010111111 111111111111111111111111111111111111111111111111111111111111111111101010040404 080808101011101011101011101011101011101011101011111111111111111111111111111111 111111111111111111111111111111111111111111111111080808000000101011101011101011 101011101011101011101011111111111111111111111111111111111111111111111111111111 1111111111111111111111110000000E0E0E101011101011101011101011101011101011101010 1111111111111111111111111111111111111111111111111111111111111111111111110F0F0F 040404070707101011101011101011101011101011101011101011111111111111111111111111 111111111111111111111111111111111111111111111111101010090909000000101011101011 101011101011101011101011101011111111111111111111111111111111111111111111111111 1111111111111111111111111010110000000E0E0E101011101011101011101011101011101011 101010111111111111111111111111111111111111111111111111111111111111111111111111 101010050505060606101011101011101011101011101011101011101011111111111111111111 111111111111111111111111111111111111111111111111111111101010080808000000101011 101011101011101011101011101011101011111111111111111111111111111111111111111111 1111111111111111111111111111111111110000000C0C0C101011101011101011101011101011 101011101010111111111111111111111111111111111111111111111111111111111111111111 111111101010060606050505101011101011101011101011101011101011101011111111111111 111111111111111111111111111111111111111111111111111111111111111111000000040404 8C8D8F8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C2D2D75767798999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B00000091929298999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B04040488898A 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B0F0F0F73747598999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B0000008D8E9098999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B060607 85868798999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B12121271727398999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B02020292939598999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 08090984858598999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B1415156F707198999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B00010188898B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B08080880818398999B98999B98999B98999B98999B98999B98999B98999B98999B98999B 98999B98999B98999B98999B98999B98999B98999B98999B98999B98999B31313258595A8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF959595111111121212D8D8D8FFFFFFFFFFFF FFFFFFE3E3E3D1D1D1FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE2E2E2C5C5C5E4E4E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3 CBCBCBF2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC D6D6D6FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2C8C8C8D9D9D9FDFDFDFFFFFFFFFFFFC3C3C3 111111121212A9A9A9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E484848FAFAFAFFFFFFFFFFFFE7E7E7323232 0707071616160F0F0FBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D4333333 060606262626080808BEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE6D6D6D0303031B1B1B 040404767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE313131000000 DEDEDEFFFFFFFFFFFFFFFFFF797979070707070707000000323232E8E8E8FFFFFFFFFFFFF9F9F9 323232939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFFFFFFF424242454545F5F5F5 FEFEFE6F6F6F101010F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F31E1E1E626262F7F7F7 FFFFFFF5F5F5F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9797970F0F0FD5D5D5FFFFFFC0C0C0 030303B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9898981616166B6B6B000000DDDDDD FFFFFFFFFFFFFFFFFF6F6F6FD3D3D3FFFFFFC3C3C30606066C6C6CFFFFFFFFFFFFFFFFFF343434 949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFE0E0E0010101C6C6C6FFFFFFFFFFFF EAEAEA000000B2B2B2FFFFFFF8F8F8E3E3E3FFFFFFFFFFFF979797171717F9F9F9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF363636717171FFFFFFFFFFFFFFFFFF3F3F3F 5D5D5DFFFFFFFFFFFFEBEBEBF0F0F0FFFFFFFFFFFFBCBCBCECECECCACACA000000DEDEDEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF363636454545FFFFFFFFFFFFFFFFFF343434949494 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFFB1B1B1000000FAFAFAFFFFFFFFFFFFFFFFFF 1818188D8D8DFFFFFF818181010101EFEFEFFFFFFF5656565E5E5EF9F9F9D4D4D4E5E5E5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF060606A5A5A5FFFFFFFFFFFFFFFFFF6D6D6D383838 FFFFFFFFFFFF2B2B2B464646FFFFFFFFFFFFFFFFFFFFFFFFCACACA000000DEDEDEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE1B1B1B666666FFFFFFFFFFFFFFFFFF343434949494FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF9A9A9A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFF282828 7A7A7AFFFFFFC0C0C06B6B6BFBFBFBFFFFFF3636362525251111111C1C1C050505343434E5E5E5 FFFFFFFFFFFFFFFFFFFFFFFFEFEFEF000000B5B5B5FFFFFFFFFFFFFFFFFF7D7D7D252525FFFFFF FFFFFF8B8B8B9C9C9CFFFFFFFFFFFFFFFFFFFFFFFFCACACA000000DEDEDEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFACACAC010101C9C9C9FFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFF7E7E7E4A4A4AFFFFFFFFFFFF9A9A9A060606FFFFFFFFFFFFFFFFFFFFFFFF2929297E7E7E FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E2E2E474747EBEBEBFFFFFFE9E9E91F1F1F696969FFFFFF FFFFFFFFFFFFFFFFFFEFEFEF000000B0B0B0FFFFFFFFFFFFFFFFFF7F7F7F292929FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA000000DEDEDEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE4E4E41919196F6F6FFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF 7E7E7E4A4A4AFFFFFFFFFFFFADADAD000000F5F5F5FFFFFFFFFFFFFFFFFF171717949494FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3A3A3A656565FFFFFFFFFFFFFFFFFF6868683A3A3AFFFFFFFFFFFF FFFFFFFFFFFFFEFEFE040404A0A0A0FFFFFFFFFFFFFFFFFF6C6C6C3F3F3FFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA000000DEDEDEFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1 3131314A4A4AFBFBFBFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E 4A4A4AFFFFFFFFFFFFD8D8D8000000BEBEBEFFFFFFFFFFFFE0E0E0000000CBCBCBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5F5F5F3C3C3CFFFFFFFFFFFFFFFFFF5656564F4F4FFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF2D2D2D696969FFFFFFFFFFFFFFFFFF363636767676FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFCACACA000000DEDEDEFFFFFFFFFFFFFFFFFFF6F6F63E3E3E3A3A3A F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E6F323232FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4A FFFFFFFFFFFFFFFFFF3333333D3D3DEAEAEAF1F1F1505050323232FFFFFFFFFFFFB4B4B4535353 F9F9F9FFFFFFB1B1B1010101B3B3B3FDFDFDBABABA070707ACACACFFFFFFDADADA464646E1E1E1 FFFFFF8989890E0E0EC4C4C4FBFBFB9A9A9A050505D6D6D6FFFFFFFFFFFF7777778B8B8BFFFFFF FFFFFFF7F7F7EBEBEBBABABA000000CCCCCCECECECFEFEFEFEFEFE4A4A4A1F1F1FCCCCCCDBDBDB DBDBDBDCDCDCFDFDFDFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616828384B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5393A3B5A5B5C8F9092 8F90928F90928F90928F90926C6C6E040404FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFF FFFFFFFFFFFFE1E1E13434340202020606063E3E3EE7E7E7FFFFFFFFFFFF878787060606F1F1F1 FFFFFFFFFFFF7777770505050404041010108D8D8DFFFFFFFFFFFFBABABA000000D8D8D8FFFFFF FCFCFC6666660909090202021F1F1FB4B4B4FFFFFFFFFFFFFFFFFF3232324D4D4DFFFFFFFFFFFF 727272000000000000000000000000000000CDCDCDEDEDED030303000000000000000000000000 000000D3D3D3FFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E5A5B5C8F90928F9092 8F90928F9092898A8C1F1F201B1B1CFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E4A4A4AFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1F1F1F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6FFFFFFFFFFFF FFFFFFFFFFFFF7F7F7E5E5E5FFFFFFFFFFFFFFFFFFFFFFFF6E6E6E494949FFFFFFFFFFFFFFFFFF FFFFFFFBFBFBEAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9FBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8F90928F90928F9092 898A8C212122222223343434FFFFFFFFFFFFFFFFFFFFFFFF7E7E7E2929298D8D8DEDEDEDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9181818E2E2E2FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E2E2E28D8D8D1C1C1C949494FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8F90928F9092898A8C212122 2525266C6D6E343434FFFFFFFFFFFFFFFFFFFFFFFFCDCDCD808080808080EBEBEBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECD9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0 808080808080D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8F9092898A8C2121222525268D8E90 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C898A8C2121222525268D8E908F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53F3F40595A5B2121222525268D8E908F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030303ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151516828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3C3D1616162525268D8E908F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808000000 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909090909080909000000080808090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909070707040404010101090909090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909080808080808 000000090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909000000060606090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909070707050505000000090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909080808 080808000000090909090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909000000060606090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909050606000000090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 080808080809000000090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909010101040404090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909090909090909080808060606000000090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 09090909090900000009090A8D8E908F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF7F7F7F8F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF4F4F4FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3030307E7F80A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6000000A2A3A4A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6060606929394A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A61010107C7D7E A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A60000009A9B9DA4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A60708088F9091A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6121212 797A7BA4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A60202029D9D9FA4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A60708088D8E8FA4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 141515767779A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6030404959697A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A60A0A0A8B8C8DA4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6A4A4A6 A4A4A6363637595A5B8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3D3D3D919191FFFFFFFFFFFFFFFFFFFFFFFFE2E2E2C5C5C5E4E4E4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFF0F0F0FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE2E2E2C6C6C6E8E8E8FFFFFFFFFFFFFFFFFFC0C0C0181818FBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818 818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CDCDCD010101E4E4E4FFFFFFFFFFFFD4D4D4333333060606262626080808BEBEBEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFEFEFEF646464010101888888FFFFFFFFFFFFFFFFFFEBEBEB3F3F3F 0000000606060101016E6E6EFFFFFFFFFFFFFDFDFD181818B2B2B2FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF727272 3E3E3EFFFFFFFFFFFFF3F3F31E1E1E626262F7F7F7FFFFFFF5F5F5F6F6F6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD8D8D81B1B1B656565161616888888FFFFFFFFFFFFFFFFFFD4D4D4818181EDEDED FCFCFC777777000000C2C2C2FFFFFFFFFFFF6C6C6C505050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2626268D8D8D FFFFFFFFFFFF979797171717F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDEDEDECBCBCBFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E1E1E10000009A9A9AFFFFFFFFFFFFBBBBBB040404F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF000000AFAFAFFFFFFF FFFFFF5656565E5E5EF9F9F9D4D4D4E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C4 000000BCBCBCFFFFFFFFFFFFDEDEDE000000D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB000000CBCBCBFFFFFFFFFFFF 3636362525251111111C1C1C050505343434E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424 FBFBFBFFFFFFFFFFFFF9F9F9010101B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA000000E6E6E6FFFFFFFFFFFF2E2E2E 474747EBEBEBFFFFFFE9E9E91F1F1F696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8A8A8040404C1C1C1FFFFFF FFFFFFFFFFFFFFFFFF151515929292FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBF000000DADADAFFFFFFFFFFFF3A3A3A656565 FFFFFFFFFFFFFFFFFF6868683A3A3AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F1F1F888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C50909099B9B9BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0A0A0A929292FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000BEBEBEFFFFFFFFFFFF5F5F5F3C3C3CFFFFFF FFFFFFFFFFFF5656564F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F 888888FFFFFFFFFFFFFFFFFFFFFFFFCFCFCF101010848484FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EEEEEE000000A5A5A5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF9F9F9050505A1A1A1FFFFFFFFFFFFB1B1B1010101B3B3B3FDFDFD BABABA070707ACACACFFFFFFDADADA464646E1E1E1FFFFFFFEFEFEEBEBEBEBEBEB1C1C1C7E7E7E EBEBEBF8F8F8FFFFFFDDDDDD151515595959DBDBDBDBDBDBDBDBDBE5E5E5FFFFFFFFFFFFD1D1D1 000000D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939396E6E6EFFFFFFFFFFFFFFFFFF777777050505040404101010 8D8D8DFFFFFFFFFFFFBABABA000000D8D8D8FFFFFFC7C7C7000000000000000000000000000000 787878FFFFFF9B9B9B000000000000000000000000000000282828FFFFFFFFFFFF9F9F9F101010 FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF8C8C8C1B1B1BFEFEFEFFFFFFFFFFFFFFFFFFF7F7F7E5E5E5FFFFFFFFFFFF FFFFFFFFFFFF6E6E6E494949FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4949495D5D5DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171818818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F2E2E2FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEAEAEA080808C3C3C3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E9181818E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED050505C4C4C4FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141515 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53A3B3B5A5B5C8F90928F90928F90928F90928F90926A6B6C010101FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF8E8E8EAAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBCBCB6E6E6EFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131314878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151515848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 818284B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3B3C3D5A5B5C8F90928F90928F90928F90928081830F0F0F1A1A1AFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F40 5A5B5C8F90928F90928F90928081830F10102D2D2E343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C 8F90928F90928081830F10103232336D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8F9092 8081830F10103232338F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405A5B5C8081830F1010 3232338F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717818284B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F405758590F10103232338F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2D2D2D8485869FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2000000 9FA0A19FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A20707079A9B9C9FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A21111118283849FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 0000009E9FA19FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A209090997989A9FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A21212127F80819FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A20202029D9EA09FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A20A0A0A9596979FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A21111127C7D7F9FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A20404049D9EA09FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A20B0B0C929395 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A2 9FA0A29FA0A29FA0A29FA0A29FA0A29FA0A29FA0A239393A0506063232338F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF080809000000090909090909090909090909090909090909090909090909090909 090909090909090909090909090909090909090909090909090909090909080808050505080808 090909090909090909090909090909090909080808090909090909090909090909090909090909 090909090909090909090909090909090909070707080808040405090909090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909080808080808000000090909090909090909090909090909090909080809090909 090909090909090909090909090909090909090909090909090909090909090909090909060606 060606090909090909090909090909090909090909080808090909090909090909090909090909 090909090909090909090909090909090909090909070707080808040404090909090909090909 090909090909090909090909090909090909090909090909090909090909090909090909090909 090909090909090909070707080808000000090909090909090909090909090909090909080809 090909090909090909090909090909090909090909090909090909090909090909090909080808 060606070707090909090909090909090909090909090909080808090909090909090909090909 090909090909090909090909090909090909090909090909080808080808030303090909090909 090909090909090909090909080909090909090909090909090909090909090909090909090909 090909090909090909090909070707080808000000090909090909090909090909090909090909 080809090909090909090909090909090909090909090909090909090909090909090909090909 090909070707050505090909090909090909090909090909090909080808090909090909090909 090909090909090909090909090909090909090909090909090909090909080808030303090909 090909090909090909090909090909080809090909090909090909090909090909090909090909 0909090909090909090909090909090808090000002424258F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF303030898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151616828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5393A3B5A5B5C8F90928F90928F90928F90928F90926D6E6F 1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151515848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53C3C3D5A5B5C8F90928F90928F90928F909287888A1C1C1D0F0F0F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141414878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53F3F405A5B5C8F90928F90928F9092868789161717292A2A343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53F3F405A5B5C8F90928F90928687891617172C2D2E6D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53F3F405A5B5C8F90928687891617172C2D2E8F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3F3F405A5B5C8687891617172C2D2E8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141414878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5030304ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53F3F40 58595A1617172C2D2E8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2E2E88898BB0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3000000AFB0B2B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3080808 9E9FA1B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3121212868788B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3020202ADAEB0B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 0A0A0A9B9C9EB0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3131313838486B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3030303ABABADB0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B30B0B0B999A9CB0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3121212818284B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3050606A8A9ABB0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B30C0C0C969799B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3 B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3B0B1B3393A3B0C0C0C 2C2D2E8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000050505000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000080808000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000010101000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000060606 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000080808000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000020202000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 060606000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000080808000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000030303000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000070707000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000003C3D3E8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF303030898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50808089FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5131313878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141515848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F9092 8F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F9092 6D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8B B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415 878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B54242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 4242435A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 5A5B5C8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909 9FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C 8F90928F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F9092 8F90928F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F9092 8F90928F90928F90926D6E6F343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D 97989AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092 8F90928384861F1F1F7D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928F9092838485 1B1B1B7D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 040404ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928F90928384851B1B1B7D7D7D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404 ABACAEB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 050606A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8F90928384851B1B1B7D7D7DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 343434898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAE B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606 A8A9ABB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B54242435A5B5C8384851B1B1B7D7D7DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF343434 898A8BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50909099FA0A1B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 141415878889B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9C9D9EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5040404ABACAEB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C9A9B9CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5171717828384B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5050606A8A9AB B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50D0D0D97989AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B54242435858591B1B1B7D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333868688 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8000000A4A5A7A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A80808089B9C9EA5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8141414 838486A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8010101A4A4A6A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A809090998999BA5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 141515818183A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8020202A4A4A6A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A80B0B0B969799A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A81516167F7F81A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8040405A3A4A6A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A80C0C0C939496A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8A5A6A8 A5A6A8A5A6A83B3B3C0C0C0C7D7D7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6565650000000E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0404040707070E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0B0B0B0707070404040E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E080808000000 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0505050606060E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0B0B0B0707080202020E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0C0C0C080808 0000000E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0D0E0505050909090E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0808080101010E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0D0D0D 0808080000000E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0606060404040E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0B0B0B0808080000000E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E 0D0D0D0000009F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/paper.tex0000644000175000017500000017760212662210372015403 0ustar mbamba\documentclass{sigplanconf} % The following \documentclass options may be useful: % % 10pt To set in 10-point type instead of 9-point. % 11pt To set in 11-point type instead of 9-point. % authoryear To obtain author/year citation style instead of numeric. \usepackage{amsmath} \usepackage{graphicx} \usepackage{minted} \usepackage{fancyvrb} \begin{document} \conferenceinfo{PGAS '11}{October 15, Galveston.} \copyrightyear{2011} \copyrightdata{[to be supplied]} \titlebanner{preprint} % These are ignored unless \preprintfooter{preprint} % 'preprint' option specified. \title{Automatic Parallelization of Numerical Python Applications Using the Global Arrays Toolkit} %\subtitle{Subtitle Text, if any} \authorinfo{Jeff Daily} {Pacific Northwest National Laboratory} {jeff.daily@pnnl.gov} \authorinfo{Robert R Lewis} {Washington State University} {bobl@tricity.wsu.edu} \maketitle \DefineShortVerb{\*} \begin{abstract} Global Arrays is a software system from Pacific Northwest National Laboratory that enables an efficient, portable, and parallel shared-memory programming interface to manipulate distributed dense arrays. The NumPy module is the de facto standard for numerical calculation in the Python programming language, a language whose use is growing rapidly in the scientific and engineering communities. NumPy provides a powerful N-dimensional array class as well as other scientific computing capabilities. However, like the majority of the core Python modules, NumPy is inherently serial. Using a combination of Global Arrays and NumPy, we have reimplemented NumPy as a distributed drop-in replacement called Global Arrays in NumPy (GAiN). Serial NumPy applications can become parallel, scalable GAiN applications with only minor source code changes. GAiN's design follows the owner computes rule, utilizing both the data locality and one-sided communication capabilities of Global Arrays. Scalability studies of several different GAiN applications will be presented showing the utility of developing serial NumPy codes which can later run on more capable clusters or supercomputers. \end{abstract} %\category{CR-number}{subcategory}{third-level} %\terms %Global Arrays, PGAS, NumPy, Python, GAiN \keywords Global Arrays, PGAS, NumPy, Python, GAiN \section{Introduction} Scientific computing with Python typically involves using the NumPy package. NumPy provides an efficient multi-dimensional array and array processing routines. Unfortunately, like many Python programs, NumPy is serial in nature. This limits both the size of the arrays as well as the speed with which the arrays can be processed to the available resources on a single compute node. For the most part, NumPy programs are written, debugged, and run in singly-threaded environments. This may be sufficient for certain problem domains. However, NumPy may also be used to develop prototype software. Such software is usually ported to a different, compiled language and/or explicitly parallelized to take advantage of additional hardware. Global Arrays in NumPy (GAiN) is an extension to Python that provides parallel, distributed processing of arrays. It implements a subset of the NumPy API so that for some programs, by simply importing GAiN in place of NumPy they may be able to take advantage of parallel processing transparently. Other programs may require slight modification. This allows those programs to take advantage of the additional cores available on single compute nodes and to increase problem sizes by distributing across clustered environments. This work builds on \cite{Dai09} by increasing the scalability of the approach from from 16 cores to 2K cores. This manuscript also builds on \cite{Dai11} by expanding both the design discussion and background such that this paper may stand on its own. The previous manuscript was prepared for the Python community and as such relevant background material on the Python language and related modules was omitted. An alternative parallelization strategy is also implemented and discussed while other parallelization strategies are additionally proposed while discussing future work. Lastly, the difficulty of scaling the Python interpreter has been added to the evaluation. \section{Background} Like any complex piece of software, GAiN builds on many other foundational ideas and implementations. This background is not intended to be a complete reference, rather only what is necessary to understand the design and implementation of GAiN. Further details may be found by examining the references or as otherwise noted. \subsection{Python} Python \cite{Lun01,Pyt11a} is a machine-independent, bytecode interpreted, object-oriented programming (OOP) language. It can be used for rapid application development, shell scripting, or scientific computing to name a few. It gives programmers and end users the ability to extend the language with new features or functionality. Such extensions can be written in C, C++, FORTRAN, or Python. It is also a highly introspective language, allowing code to examine various features of the Python interpreter at run-time and adapt as needed. Although Python v3.2 exists, the following sections explain specific features of Python 2.7 as it is the version most commonly used by the scientific Python community \cite{Pyt11b}. \subsubsection{Operator Overloading} User-defined classes may implement special methods that are then invoked by built-in Python functions. This allows any user-defined class to behave like Python built-in objects. For example, if a class defines \verb=__len__()= it will be called by the built-in len(). There are special methods for object creation, deletion, attribute access, calling objects as functions, and making objects act like Python sequences, maps, or numbers. Classes need only implement the appropriate overloaded operators. \subsubsection{Object Construction} User-defined classes control their instance creation using either the overloaded \verb=__new__()=, \verb=__init__()=, or both. \verb=__new__()= is a special-cased static method that takes the class of which an instance was requested as its first argument. It must return a class instance, but it need not be an instance of the class that was requested. If \verb=__new__()= returns an instance of the requested class, then the instance’s \verb=__init__()= is called. If some other class instance is returned, then \verb=__init__()= is not called on that instance. \verb=__new__()= was designed to allow for subclasses of Python’s immutable types but can be used for other purposes. \subsubsection{Slicing} Python supports two types of built-in sequences, immutable and mutable. The immutable sequences are the \texttt{string}s, \texttt{unicode}s, and \texttt{tuple}s while the only mutable type is the \texttt{list}. Python sequences generally support access to their items via bracket “[]” notation and accept either an integer $k$ where $0 <= k < N$ and $N$ is the length of the sequence, or a \texttt{slice} object. Out-of-bounds indices, as opposed to out-of-bounds slices, will result in an error. However, negative indices and slices are supported by the built-in Python sequences by calculating offsets from the end of the sequence. It is up to the implementing class whether to support negative indices and slices when overloading the sequence operators. \texttt{slice} objects are used for describing \emph{extended slice syntax}. \texttt{slice} objects describe the beginning, end, and increment of a subsequence via the start, stop, and step attributes, respectively. When \texttt{slice}s are used within the bracket notation, they can be represented by using the \texttt{slice()} constructor or as colon-separated values. The start value is inclusive of its index while the stop value is not. If the start value is omitted it defaults to 0. Similarly, stop defaults to the length of the sequence and step defaults to 1. The \texttt{slice} can be used in lieu of an index for accessing a subsequence of the sequence object. Slicing a built-in Python sequence always returns a copy of the returned subsequence. User-defined classes are free to abandon that convention. Further, \texttt{slice}s that are out-of-bounds will silently return an in-bounds sequence which is different behavior than simple single-item indexing. To illustrate both index and \texttt{slice} access to Python sequences assume we have the \texttt{list} of \texttt{int}s \texttt{A=[0,1,2,3,4,5,6,7,8,9]}. An example of single-item access would be \texttt{A[1]=1}. Using slice syntax would look like \texttt{A[1:2]=[1]}. A negative single-item index looks like \texttt{A[-1]=9}. Finally, an example of slice syntax that includes a step is \texttt{A[2:9:3]=[2,5,8]}. Note in these examples how single-item access returns an int whereas slicing notation returns a list. \subsubsection{Object Serialization} Many languages have the need for object serialization and de-serialization. Serialization is the process by which a class instance is transformed into another, often succinct, representation (like a byte stream) which can persist or be transmitted. It can then be de-serialized back into its original object. This is also commonly known as marshalling and unmarshalling. In Python this is also called pickling and unpickling. The \texttt{pickle} module is part of the Python Standard Library \cite{Lun01} and can serialize nearly everything in Python. It is designed to be backwards compatible with earlier versions of Python. Certain Python objects, such as modules or functions, are serialized by name only rather than by their state. They can only be de-serialized so long as the same module or function exists within the scope where the de-serialization occurs. There is no guarantee that the same function will result from the de-serialization or that the function exists in the target namespace. \subsection{NumPy} NumPy \cite{Oli06} is a Python extension module which adds a powerful multidimensional array class *ndarray* to the Python language. NumPy also provides scientific computing capabilities such as basic linear algebra and Fourier transform support. NumPy is the de facto standard for scientific computing in Python and the successor of the other numerical Python packages Numarray \cite{Dub96} and numeric \cite{Asc99}. \subsubsection{NumPy's ndarray} The primary class defined by NumPy is \verb=ndarray=. The \verb=ndarray= is implemented as a contiguous memory segment. Internally, all \verb=ndarray= instances have a pointer to the location of the first element as well as the attributes \verb=shape=, \verb=ndim=, and \verb=strides=. \verb=ndim= describes the number of dimensions in the array, \verb=shape= describes the number of elements in each dimension, and \verb=strides= describes the number of bytes between consecutive elements per dimension. The \verb=ndarray= can be either FORTRAN- or C-ordered. Recall that in FORTRAN, the first dimension has a stride of one while it is the opposite (last) dimension in C. \verb=shape= can be modified while \verb=ndim= and \verb=strides= are read-only and used internally, although their exposure to the programmer may help in developing certain algorithms. The creation of \verb=ndarray= instances is complicated by the various ways in which it can be done such as explicit constructor calls, view casting, or creating new instances from template instances (e.g. slicing). To this end, the \verb=ndarray= does not implement Python’s \verb=__init__()= object constructor. Instead, \verb=ndarrays= use the \verb=__new__()= \verb=classmethod=. Recall that \verb=__new__()= is Python’s hook for subclassing its built-in objects. If \verb=__new__()= returns an instance of the class on which it is defined, then the class's \verb=__init__()= method is also called. Otherwise, the \verb=__init__()= method is not called. Given the various ways that \verb=ndarray= instances can be created, the \verb=__new__()= \verb=classmethod= might not always get called to properly initialize the instance. \verb=__array_finalize__()= is called instead of \verb=__init__()= for \verb=ndarray= subclasses to avoid this limitation. \subsubsection{Slicing} Unlike slicing with built-in Python sequences, slicing in NumPy is performed per axis. Each sliced axis is separated by commas within the usual bracket notation. Further, slicing in NumPy produces "views" rather than copies of the original ndarray. If a copy of the result is truly desired, it can be explicitly requested. This allows operations on subarrays without unnecessary copying of data. To the programmer, \texttt{ndarray}s behave the same whether they are the result of a slicing operation. Views have an additional attribute, \texttt{base}, assigned that points to the \texttt{ndarray} that owns the data. The original \texttt{ndarray}’s \texttt{base} is \texttt{None} (effectively a null pointer.) When an \texttt{ndarray} is sliced, the resulting \texttt{ndarray} may have different \texttt{shape}, \texttt{strides}, and \texttt{ndim} attributes appropriately. There is no restriction on taking slices of already sliced \texttt{ndarray}s, either. \subsubsection{NumPy's Universal Functions} The element-wise operators in NumPy are known as Universal Functions, or ufuncs. Many of the methods of \verb=ndarray= simply invoke the corresponding ufunc. For example, the operator \verb=+= calls \verb=ndarray.__add__()= which invokes the ufunc \verb=add=. Ufuncs are either unary or binary, taking either one or two arrays as input, respectively. Ufuncs always return the result of the operation as an \verb=ndarray= or \verb=ndarray= subclass. Optionally, an additional output parameter may be specified to receive the results of the operation. Specifying this output parameter to the ufunc avoids the sometimes unnecessary creation of a new \verb=ndarray=. Ufuncs are more than just callable functions. They also have some special methods such as \verb=reduce()= and \verb=accumulate()=. \verb=reduce()= is similar to Python’s built-in function of the same name that repeatedly applies a callable object to its last result and the next item of the sequence. This effectively reduces a sequence to a single value. When applied to arrays the reduction occurs along the first axis by default, but other axes may be specified. Each ufunc defines the function that is used for the reduction. For example, \verb=add.reduce()= will sum the values along an axis while \verb=multiply.reduce()= will generate the running product. \verb=accumulate()= is similar to \verb=reduce()=, but it returns the intermediate results of the reduction. Ufuncs can operate on \verb=ndarray= subclasses or array-like objects. In order for subclasses of the \verb=ndarray= or array-like objects to utilize the ufuncs, they may define three methods or one attribute which are \verb=__array_prepare__()=, \verb=__array_wrap__()=, \verb=__array__()=, and \verb=__array_priority__=, respectively. The\linebreak \verb=__array_prepare__()= and \verb=__array_wrap__()= methods will be called on either the output, if specified, or the input with the highest \verb=__array_priority__=. \verb=__array_prepare__()= is called on the way into the ufunc after the output array is created but before any computation has been performed and \verb=__array_wrap__()= is called on the way out of the ufunc. Those two functions exist so that \verb=ndarray= subclasses can properly modify any attributes or properties specific to their subclass. Lastly, if an output is specified which defines an \verb=__array__()= method, results will be written to the object returned by calling \verb=__array__()=. \subsubsection{Broadcasting} NumPy introduces the powerful feature of allowing otherwise incompatible arrays to be used as operands in element-wise operations. If the number of dimensions do not match for two arrays, 1’s are repeatedly prepended to the shape of the array with the least number of dimensions until their ndims match. Arrays are then broadcast-compatible (also \emph{broadcastable}) if for each of their dimensions their shapes either match or one of them is equal to 1. For example, the shapes \verb=(3, 4, 5)= and \verb=(2, 3, 4, 1)= are broadcastable. In this way, scalars can be used as operands in element-wise array operations since they will be broadcast to match any other array. Broadcasting relies on the \texttt{strides} attribute of the \texttt{ndarray}. A stride of 0 effectively causes the data for that dimension to repeat, which is precisely what happens when broadcasting occurs in element-wise array operations. \subsection{Parallel Programming Paradigms} Parallel applications can be classified into a few well defined programming paradigms. Each paradigm is a class of algorithms that have the same control structure. The literature differs in how these paradigms are classified and the boundaries between paradigms can sometimes be fuzzy or intentionally blended into hybrid models \cite{Buy99}. \subsubsection{Master/Slave} The master/slave paradigm, also known as task-farming, is where a single master process farms out tasks to multiple slave processes. The control is always maintained by the master, dispatching commands to the slaves. Usually, the communication takes place only between the master and slaves. This model may either use static or dynamic load-balancing. The former involves the allocation of tasks to happen when the computation begins whereas the latter allows the application to adjust to changing conditions within the computation. Dynamic load-balancing may involve recovering after the failure of a subset of slave processes or handling the case where the number of tasks is not known at the start of the application. \subsubsection{Single Program, Multiple Data} With SPMD, each process executes essentially the same code but on a different part of the data. The communication pattern is highly structured and predictable. Occasionally, a global synchronization may be needed. The efficiency of these types of programs depends on the decomposition of the data and the degree to which the data is independent of its neighbors. These programs are also highly susceptible to process failure. If any single process fails, generally it causes deadlock since global synchronizations thereafter would fail. \subsection{Message Passing Interface (MPI)} Message passing libraries allow efficient parallel programs to be written for distributed memory systems. MPI \cite{Gro99a}, also known as MPI-1, is a library specification for message-passing that was standardized in May 1994 by the MPI Forum. It is designed for high performance on both massively parallel machines and on workstation clusters. An optimized MPI implementation exists on nearly all modern parallel systems and there are a number of freely available, portable implementations for all other systems \cite{Buy99}. As such, MPI is the de facto standard for writing massively parallel application codes in either FORTRAN, C, or C++. The MPI-2 standard \cite{Gro99b} was first completed in 1997 and added a number of important additions to MPI including, but not limited to, one-sided communication and the C++ language binding. Before MPI-2, all communication required explicit handshaking between the sender and receiver via \verb=MPI_Send()= and \verb=MPI_Recv()= in addition to non-blocking variants. MPI-2’s one-sided communication model allows reads, writes, and accumulates of remote memory without the explicit cooperation of the process owning the memory. If synchronization is required at a later time, it can be requested via \verb=MPI_Barrier()=. Otherwise, there is no strict guarantee that a one-sided operation will complete before the data segment it accessed is used by another process. \subsection{mpi4py} mpi4py is a Python wrapper around MPI. It is written to mimic the C++ language bindings. It supports point-to-point communication, one-sided communication, as well as the collective communication models. Typical communication of arbitrary objects in the FORTRAN or C bindings of MPI require the programmer to define new MPI datatypes. These datatypes describe the number and order of the bytes to be communicated. On the other hand, strings could be sent without defining a new datatype so long as the length of the string was understood by the recipient. mpi4py is able to communicate any serializable Python object since serialized objects are just byte streams. mpi4py also has special enhancements to efficiently communicate any object implementing Python’s buffer protocol, such as NumPy arrays. It also supports dynamic process management and parallel I/O \cite{Dal05,Dal08}. \subsection{Global Arrays and Aggregate Remote Memory Copy Interface} The GA toolkit \cite{Nie06,Nie10,Pnl11} is a software system from Pacific Northwest National Laboratory that enables an efficient, portable, and parallel shared-memory programming interface to manipulate physically distributed dense multidimensional arrays, without the need for explicit cooperation by other processes. GA compliments the message-passing programming model and is compatible with MPI so that the programmer can use both in the same program. GA has supported Python bindings since version 5.0. Arrays are created by calling one of the creation routines such as \verb=ga.create()=, returning an integer handle which is passed to subsequent operations. The GA library handles the distribution of arrays across processes and recognizes that accessing local memory is faster than accessing remote memory. However, the library allows access mechanisms for any part of the entire distributed array regardless of where its data is located. Local memory is acquired via \verb=ga.access()= returning a pointer to the data on the local process, while remote memory is retrieved via \verb=ga.get()= filling an already allocated array buffer. Individual discontiguous sets of array elements can be updated or retrieved using \verb=ga.scatter()= or \verb=ga.gather()=, respectively. GA has been leveraged in several large computational chemistry codes and has been shown to scale well \cite{Apr09}. The Aggregate Remote Memory Copy Interface (ARMCI) provides general-purpose, efficient, and widely portable remote memory access (RMA) operations (one-sided communication). ARMCI operations are optimized for contiguous and non-contiguous (strided, scatter/gather, I/O vector) data transfers. It also exploits native network communication interfaces and system resources such as shared memory \cite{Nie00}. ARMCI provides simpler progress rules and a less synchronous model of RMA than MPI-2. ARMCI has been used to implement the Global Arrays library, GPSHMEM - a portable version of Cray SHMEM library, and the portable Co-Array FORTRAN compiler from Rice University \cite{Dot04}. \subsection{Cython} Cython \cite{Beh11} is both a language which closely resembles Python as well as a compiler which generates C code based on Python's C API. The Cython language additionally supports calling C functions as well as static typing. This makes writing C extensions or wrapping external C libraries for the Python language as easy as Python itself. \section{Related Work} GAiN is similar in many ways to other parallel computation software packages. It attempts to leverage the best ideas for transparent, parallel processing found in current systems. The following packages provided insight into how GAiN was to be developed. \subsection{Star-P} MITMatlab \cite{Hus98}, which was later rebranded as Star-P \cite{Ede07}, provides a client-server model for interactive, large-scale scientific computation. It provides a transparently parallel front end through the popular MATLAB \cite{Pal07} numerical package and sends the parallel computations to its Parallel Problem Server. Star-P briefly had a Python interface. Separating the interactive, serial nature of MATLAB from the parallel computation server allows the user to leverage both of their strengths. This also allows much larger arrays to be operated over than is allowed by a single compute node. \subsection{Global Arrays Meets MATLAB} Global Arrays Meets MATLAB (GAMMA) \cite{Pan06} provides a MATLAB binding to the GA toolkit, thus allowing for larger problem sizes and parallel computation. GAMMA can be viewed as a GA implementation of MITMatlab and was shown to scale well even within an interpreted environment like MATLAB. \subsection{IPython} IPython \cite{Per07} provides an enhanced interactive Python shell as well as an architecture for interactive parallel computing. IPython supports practically all models of parallelism but, more importantly, in an interactive way. For instance, a single interactive Python shell could be controlling a parallel program running on a supercomputer. This is done by having a Python engine running on a remote machine which is able to receive Python commands. \subsection{IPython's distarray} distarray \cite{Per09} is an experimental package for the IPython project. distarray uses IPython’s architecture as well as MPI extensively in order to look and feel like NumPy \verb=ndarray= instances. Only the SPMD model of parallel computation is supported, unlike other parallel models supported directly by IPython. Further, the status of distarray is that of a proof-of-concept and not production ready. \subsection{DistNumPy} DistNumPy \cite{Kri10} extends the NumPy module with a new, distributed backend for NumPy arrays. The distributed nature of DistNumPy is almost fully transparent to the user, must like the work described in this paper. It is able to parallelize any NumPy application by having the master process dispatch parallel NumPy operations to the slaves while the master is able to execute any serial user code. However, certain features limit its utility. DistNumPy cannot be used in conjunction with a standard NumPy installation because it implements the same \texttt{numpy} namespace. DistNumPy is a fork of v1.3 of the NumPy codebase and it is unclear how much effort would be involved in bringing it up-to-date with the ehancements found in the latest NumPy v1.6 release. The block cyclic distribution used by DistNumPy works well for some packages, but it is not ideal for all problem types. The user is not allowed to alter the distribution scheme used by DistNumPy. Lastly, DistNumPy does not adequately handle problems that involve non-aligned array views. \subsection{GpuPy} A Graphics Processing Unit (GPU) is a powerful parallel processor that is capable of more floating point calculations per second than a traditional CPU. However, GPUs are more difficult to program and require other special considerations such as copying data from main memory to the GPU’s on-board memory in order for it to be processed, then copying the results back. The GpuPy \cite{Eit07} Python extension package was developed to lessen these burdens by providing a NumPy-like interface for the GPU. Preliminary results demonstrate considerable speedups for certain single-precision floating point operations. \subsection{pyGA} A subset of the Global Arrays toolkit was wrapped in Python for the 3.x series of GA by Robert Harrison \cite{Har99}. It illustrated some important concepts such as the benefits of integration with NumPy -- the local or remote portions of the global arrays were retrieved as NumPy arrays at which point they could be used as inputs to NumPy functions like the ufuncs. \subsection{Co-Array Python} Co-Array Python \cite{Ras04} is modeled after the Co-Array FORTRAN extensions to FORTRAN 95. It allows the programmer to access data elements on non-local processors via an extra array dimension, called the co-dimension. The \verb=CoArray= module provided a local data structure existing on all processors executing in a SPMD fashion. The CoArray was designed as an extension to Numeric Python \cite{Asc99}. \section{Design} The need for parallel programming and running these programs on parallel architectures is obvious, however, efficiently programming for a parallel environment can be a daunting task. One area of research is to automatically parallelize otherwise serial programs and to do so with the least amount of user intervention \cite{Buy99}. GAiN attempts to do this for certain Python programs utilizing the NumPy module. It will be shown that some NumPy programs can be parallelized in a nearly transparent way with GAiN. There are a few assumptions which govern the design of GAiN. First, all documented GAiN functions are collective. Since Python and NumPy were designed to run serially on workstations, it naturally follows that GAiN, running in an SPMD fashion, will execute every documented function collectively. Second, only certain arrays should be distributed. In general, it is inefficient to distribute arrays which are relatively small and/or easy to compute. It follows, then, that GAiN operations should allow mixed inputs of both distributed and local array-like objects. Further, NumPy represents an extensive, useful, and hardened API. Every effort to reuse NumPy should be made. Lastly, GA has its own strengths to offer such as processor groups and custom data distributions. In order to maximize scalability of this implementation, we should enable the use of processor groups \cite{Nie05}. A distributed array representation must acknowledge the duality of a global array and the physically distributed memory of the array. Array attributes such as \verb=shape= should return the global, coalesced representation of the array which hides the fact the array is distributed. But when operations such as \verb=add()= are requested, the corresponding pieces of the input arrays must be operated over. Figure \ref{fig:1} will help illustrate. Each local piece of the array has its own shape (in parenthesis) and knows its portion of the distribution (in square brackets). Each local piece also knows the global shape. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image1_crop.eps} \caption{ Each local piece of the gain.ndarray has its own shape (in parenthesis) and knows its portion of the distribution (in square brackets). Each local piece also knows the global shape. } \label{fig:1} \end{figure} A fundamental design decision was whether to subclass \verb=ndarray= or to provide a work-alike replacement for the entire \verb=numpy= module. The NumPy documentation states that \verb=ndarray= implements \verb=__new__()= in order to control array creation via constructor calls, view casting, and slicing. Subclasses implement \verb=__new__()= for when the constructor is called directly, and \linebreak\verb=__array_finalize__()= in order to set additional attributes or further modify the object from which a view has been taken. One can imagine an \verb=ndarray= subclass called \verb=gainarray= circumventing the usual \verb=ndarray= base class memory allocation and instead allocating a smaller \verb=ndarray= per process while retaining the global \verb=shape=. One problem occurs with view casting -- with this approach the other \verb=ndarray= subclasses know nothing of the distributed nature of the memory within the \verb=gainarray=. NumPy itself is not designed to handle distributed arrays. By design, ufuncs create an output array when one is not specified. The first hook which NumPy provides is \verb=__array_prepare__()= which is called \emph{after the output array has been created}. This means any ufunc operation on one or more \verb=gainarray= instances without a specified output would automatically allocate the entire output on each process. For this reason alone, we opted to reimplement the entire \verb=numpy= module, controlling all aspects of array creation and manipulation to take into account distributed arrays. We present a new Python module, \verb=gain=, developed as part of the main Global Arrays software distribution. The release of GA v5.0 contained Python bindings based on the complete GA C API, available in the extension module \verb=ga=. The GA bindings as well as the \verb=gain= module were developed using Cython. With the upcoming release of GA v5.1, the module \verb=ga.gain= is available as a drop-in replacement for NumPy. The goal of the implementation is to allow users to write \begin{minted}[]{python} import ga.gain as numpy \end{minted} and then to execute their code using the MPI process manager \begin{minted}[]{bash} mpiexec -np 4 python script.py \end{minted} In order to succeed as a drop-in replacement, all attributes, functions, modules, and classes which exist in \verb=numpy= must also exist within \verb=gain=. Efforts were made to reuse as much of \verb=numpy= as possible, such as its type system. As of GA v5.1, arrays of arbitrary fixed-size element types and sizes can be created and individual fields of C \verb=struct= data types accessed directly. GAiN is able to use the \verb=numpy= types when creating the GA instances which back the \verb=gain.ndarray= instances. GAiN is able to use an unmodified NumPy installation and will work with any sufficiently recent NumPy release. GAiN follows the owner-computes rule \cite{Zim88}. The rule assigns each computation to the processor that owns the data being computed. Figures \ref{fig:2} and \ref{fig:3} illustrate the concept. For any array computation, GAiN bases the computation on the output array. The processes owning portions of the output array will acquire the corresponding pieces of the input array(s) and then perform the computation locally, \emph{calling the original NumPy routine} on the corresponding array portions. In some cases, for example if the output array is a view created by a slicing operation, certain processors will have no computation to perform. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image3_crop.eps} \caption{ Add two arrays with the same data distribution. There are eight processors for this computation. Following the owner-computes rule, each process owning a piece of the output array (far right) retrieves the corresponding pieces from the sliced input arrays (left and middle). For example, the corresponding gold elements will be computed locally on the owning process. Note that for this computation, the data distribution is the same for both input arrays as well as the output array such that communication can be avoided by using local data access. } \label{fig:2} \end{figure} \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image2_crop.eps} \caption{ Add two sliced arrays. There are eight processors for this computation. The elements in blue were removed by a slice operation. Following the owner-computes rule, each process owning a piece of the output array (far right) retrieves the corresponding pieces from the sliced input arrays (left and middle). For example, the corresponding gold elements will be computed locally on the owning process. Similarly for the copper elements. Note that for this computation, the data for each array is not equivalently distributed which will result in communication. } \label{fig:3} \end{figure} The GAiN implementation of the \verb=ndarray= implements a few important concepts including the dual nature of a global array and its individual distributed pieces, slice arithmetic, and separating collective operations from one-sided operations. When a \verb=gain.ndarray= is created, it creates a Global Array of the same shape and type and stores the GA integer handle. The distribution on a given process can be queried using \verb=ga.distribution()=. The other important attribute of the \verb=gain.ndarray= is the \verb=global_slice=. The \verb=global_slice= begins as a list of \verb=slice= objects based on the original \verb=shape= of the array. \begin{minted}[]{python} self.global_slice = [slice(0,x,1) for x in shape] \end{minted} Slicing a \verb=gain.ndarray= must return a view just like slicing a \verb=numpy.ndarray= returns a view. The approach taken is to apply the \verb=key= of the \verb=__getitem__(key)= request to the \verb=global_slice= and store the new \verb=global_slice= on the newly created view. We call this type of operation slice arithmetic. First, the \verb=key= is canonicalized meaning \verb=Ellipsis= are replaced with \verb=slice(0,dim_max,1)= for each dimension represented by the \verb=Ellipsis=, all \verb=slice= instances are replaced with the results of calling \verb=slice.indices()=, and all negative index values are replaced with their positive equivalents. This step ensures that the length of the \verb=key= is compatible with and based on the current shape of the array. This enables consistent slice arithmetic on the canonicalized keys. Slice arithmetic effectively produces a new \verb=key= which, when applied to the same original array, produces the same results had the same sequence of keys been applied in order. Figures \ref{fig:slice1} and \ref{fig:figslice2} illustrate this concept. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image4a_crop.eps} \caption{ Slice arithmetic example 1. Array $b$ could be created either using the standard notation (top middle) or using the canonicalized form (bottom middle). Array $c$ could be created by applying the standard notation (top right) or by applying the equivalent canonical form (bottom right) to the original array $a$. } \label{fig:slice1} \end{figure} \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image4b_crop.eps} \caption{ Slice arithmetic example 2. See the caption of Figure \ref{fig:slice1} for details. } \label{fig:figslice2} \end{figure} When performing calculations on a \verb=gain.ndarray=, the current \verb=global_slice= is queried when accessing the local data or fetching remote data such that an appropriate \verb=ndarray= data block is returned. Accessing local data and fetching remote data is performed by the \verb=gain.ndarray.access()= and \verb=gain.ndarray.get()= methods, respectively. Figure \ref{fig:accessget} illustrates how \verb=access()= and \verb=get()= are used. The \verb=ga.access()= function on which\linebreak \verb=gain.ndarray.access()= is based will always return the entire block owned by the calling process. The returned piece must be further sliced to appropriately match the current \verb=global_slice=. The \verb=ga.strided_get()= function on which \verb=gain.ndarray.get()= method is based will fetch data from other processes without the remote processes' cooperation i.e. using one-sided communication. The calling process specifies the region to fetch based on the current view's \verb=shape= of the array. The \verb=global_slice= is adjusted to match the requested region using slice arithmetic and then transformed into a \verb=ga.strided_get()= request based on the global, original shape of the array. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image5_crop.eps} \caption{ \texttt{access()} and \texttt{get()} examples. The current \texttt{global\_slice}, indicated by blue array elements, is respected in either case. A process can access its local data block for a given array (red highlight). Note that \texttt{access()} returns the entire block, including the sliced elements. Any process can fetch any other processes' data using \texttt{get()} with respect to the current \texttt{shape} of the array (blue highlight). Note that the fetched block will not contain the sliced elements, reducing the amount of data communicated. } \label{fig:accessget} \end{figure} Recall that GA allows the contiguous, process-local data to be accessed using \verb=ga.access()= which returns a C-contiguous \verb=ndarray=. However, if the \verb=gain.ndarray= is a view created by a slice, the data which is accessed will be contiguous while the view is not. Based on the distribution of the process-local data, a new slice object is created from the \verb=global_slice= and applied to the accessed \verb=ndarray=, effectively having applied first the \verb=global_slice= on the global representation of the distributed array followed by a slice representing the process-local portion. After process-local data has been accessed and sliced as needed, it must then fetch the remote data. This is again done using \verb=ga.get()= or \verb=ga.strided_get()= as above. Recall that one-sided communication, as opposed to two-sided communication, does not require the cooperation of the remote process(es). The local process simply fetches the corresponding array section by performing a similar transformation to the target array's \verb=global_slice= as was done to access the local data, and then translates the modified \verb=global_slice= into the proper arguments for \verb=ga.get()= if the \verb=global_slice= does not contain any \verb=step= values greater than one, or \verb=ga.strided_get()= if the \verb=global_slice= contained \verb=step= values greater than one. One limitation of using GA is that GA does not allow negative stride values corresponding to the negative \verb=step= values allowed for Python sequences and NumPy arrays. Supporting negative \verb=step= values for GAiN required special care -- when a negative \verb=step= is encountered during a slice operation, the slice is applied as usual. However, prior to accessing or fetching data, the slice is inverted from a negative \verb=step= to a positive \verb=step= and the \verb=start= and \verb=stop= values are updated appropriately. The \verb=ndarray= which results from accessing or fetching based on the inverted slice is then re-inverted, creating the correct view of the new data. Another limitation of using GA is that the data distribution cannot be changed once an array is created. This complicates such useful functionality as \verb=numpy.reshape()=. Currently, GAiN must make a copy of the array instead of a view when altering the shape of an array. Translating the \verb=numpy.flatiter= class, which assumes a single address space while translating an N-dimensional array into a 1D array, into a distributed form was made simpler by the use of \verb=ga.gather()= and \verb=ga.scatter()=. These two routines allow individual data elements within a GA to be fetched or updated. Flattening a distributed N-dimensional array which had been distributed in blocked fashion will cause the blocks to become discontiguous. Figure \ref{fig:flatten} shows how a $6 \times 6$ array might be distributed and flattened. The \verb=ga.get()= operation assumes the requested patch has the same number of dimensions as the array from which the patch is requested. Reshaping, in general, is made difficult by GA and its lack of a redistribute capability. However, in this case, we can use \verb=ga.gather()= and \verb=ga.scatter()= to fetch and update, respectively, any array elements in any order. \verb=ga.gather()= takes a 1D array-like of indices to fetch and returns a 1D \verb=ndarray= of values. Similarly, \verb=ga.scatter()= takes a 1D array-like of indices to update and a 1D array-like buffer containing the values to use for the update. If a \verb=gain.flatiter= is used as the output of an operation, following the owner-computes rule is difficult. Instead, pseudo-owners are assigned to contiguous slices of the of 1D view. These pseudo-owners gather their own elements as well as the corresponding elements of the other inputs, compute the result, and scatter the result back to their own elements. This results in additional communication which is otherwise avoided by true adherence to the owner-computes rule. To avoid this inefficiency, there are some cases where operating over \verb=gain.flatiter= instances can be optimized, for example with \verb=gain.dot()= if the same \verb=flatiter= is passed as both inputs, the \verb=base= of the \verb=flatiter= is instead multiplied together element-wise and then the \verb=gain.sum()= is taken of the resulting array. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{image6_crop.eps} \caption{ Flattening a 2D distributed array. The block owned by a process becomes discontiguous when representing the 2D array in 1 dimension. } \label{fig:flatten} \end{figure} Not all NumPy programs are suitable for SPMD execution. If the NumPy program has made assumptions about a single process environment, there must be a separation between Python running as a single process and a parallel back-end where the parallel computation is performed. For example, the program might open a connection to a database. Doing so with multiple processes and in addition having each process make multiple updates to that database would be disastrous. Explicit knowledge on the user’s part of the parallel nature of the execution environment would be needed to mitigate database access. NumPy programs unsuitable for SPMD execution can be handled by utilizing master/slave parallelism. The original program assumes the role of master while any expression involving a \texttt{gain.ndarray} is serialized and sent to an SPMD parallel back-end. Unless the data being operated on already exists on the slaves, both the data and the function to operate on the data must be sent. To accomplish this master/slave parallelism, we use the process management features of the MPI-2 specification as well as custom Python code to serialize the objects. \section{Evaluation} The success of GAiN hinges on its ability to enable distributed array processing in NumPy, to transparently enable this processing, and most importantly to efficiently accomplish those goals. Performance Python \cite{Ram08} “perfpy” was conceived to demonstrate the ways Python can be used for high performance computing. It evaluates NumPy and the relative performance of various Python extensions to NumPy. It represents an important benchmark by which any additional high performance numerical Python module should be measured. The original program \verb=laplace.py= was modified by importing \verb=ga.gain= in place of \verb=numpy= and then stripping the additional test codes so that only the \verb=gain= (\verb=numpy=) test remained. The latter modification makes no impact on the timing results since all tests are run independently but was necessary because \verb=gain= is run on multiple processes while the original test suite is serial. The program was run on the chinook supercomputer at the Environmental Molecular Sciences Laboratory, part of Pacific Northwest National Laboratory. Chinook consists of 2310 HP DL185 nodes with dual socket, 64-bit, Quad-core AMD 2.2 GHz Opteron processors. Each node has 32 Gbytes of memory for 4 Gbytes per core. Fast communication between the nodes is obtained using a single rail Infiniband interconnect from Voltaire (switches) and Melanox (NICs). The system runs a version of Linux based on Red Hat Linux Advanced Server. GAiN utilized up to 512 nodes of the cluster, using 4 cores per node. In Figure \ref{fig:laplace}, GAiN is shown to scale up to 2K cores on a modest problem size. However, the startup cost of the Python interpreter became prohibitively large such that a 4K core test could not be run in a reasonable amount of time. It is encouraging that the implementation of GAiN allows the algorithm to scale so long as the Python interpreter can be sufficiently modified to scale, as well. GAiN is also able to run on problems which are not feasible on workstations. For example, to store one 100,000x100,000 matrix of double-precision numbers requires approximately 75GB. \begin{figure}[htb] \centering \includegraphics[width=0.47\textwidth]{laplace.eps} \caption{ \texttt{laplace.py} for N=10,000 and N=100,000. For N=10,000, one matrix of double-precision numbers is approximately 0.75GB. For this problem, GAiN scales up to 2K cores in terms of the solver algorithm, however, the Python interpreter fails to scale beyond a few hundred cores in this case. For N=100,000, one matrix of double-precision numbers is approximately 75GB. In addition to handling this large-scale problem, GAiN continues to scale up to 2K cores. Again, the startup cost of the Python interpreter prohibited the 4K run from starting in a reasonable amount of time. } \label{fig:laplace} \end{figure} During the evaluation, it was noted that a lot of time was spent within global synchronization calls e.g. \verb=ga.sync()=. The source of the calls was traced to, among other places, the vast number of temporary arrays getting created. Using GA statistics reporting, the original \verb=laplace.py= code created 912 arrays and destroyed 910. Given this staggering figure, an array cache was created. The cache is based on a Python \verb=dict= using the shape and type of the arrays as the keys and stores discarded GA instances represented by the GA integer handle. The number of GA handles stored per shape and type is referred to as the cache depth. The \verb=gain.ndarray= instances are discarded as usual. Utilizing the cache keeps the GA memory from many allocations and deallocations but primarily avoids many synchronization calls. Three cache depths were tested, as shown in Table \ref{tab:cache}. The trade-off of using this cache is that if the arrays used by an application vary wildly in size or type, this cache will consume too much memory. Other heuristics could be developed to keep the cache from using too much memory e.g. a maximum size of the cache, remove the least used arrays, remove the least recently used. Based on the success of the GA cache, it is currently used by GAiN. \begin{table} \begin{center} %\begin{tabular}{|l|l|l|} \begin{tabular}{l|l|l} %\hline & Create & Destroy \\ \hline No Cache & 912 & 910 \\ %\hline Depth-1 Cache & 311 & 306 \\ %\hline Depth-2 Cache & 110 & 102 \\ %\hline Depth-3 Cache & 11 & 1 \\ %\hline \end{tabular} \caption{ How array caching affects GA array creation/destruction counts when running \texttt{laplace.py} for 100 iterations. The smaller numbers indicate better reuse of GA memory and avoidance of global synchronization calls, at the expense of using additional memory. } \label{tab:cache} \end{center} \end{table} \section{Conclusion} GAiN succeeds in its ability to grow problem sizes beyond a single compute node. The performance of the perfpy code and the ability to drop-in GAiN without modification of the core implementation demonstrates its utility. As described previously, GAiN allows certain classes of existing NumPy programs to run using GAiN with sometimes as little effort as changing the import statement, immediately taking advantage of the ability to run in a cluster environment. Once a smaller-sized program has been developed and tested on a desktop computer, it can then be run on a cluster with very little effort. GAiN provides the groundwork for large distributed multidimensional arrays within NumPy. \section{Future Work} GAiN is not a complete implementation of the NumPy API nor does it represent the only way in which distributed arrays can be achieved for NumPy. Alternative parallelization strategies besides the owner-computes rule should be explored. GA allows for the get-compute-put model of computation where ownership of data is largely ignored while data movement costs are increased. However, the get-compute-put model of computation may allow an algorithm to mix communication and computation, improving overall performance as is done with the SRUMMA dense matrix multiplication algorithm \cite{Kri04}. Task parallelism could also be explored if load balancing becomes an issue. The scioto framework \cite{Din08} interoperates with MPI and GA and provides locality-aware dynamic load balancing via management of shared collections of task objects. Certain NumPy functionality may better lend itself to task parallelism instead of owner-computes. Task parallelism decouples data ownership from the computation and is more akin to the get-compute-put model. Further, GAiN does not support block cyclic data distributions. Block cyclic distributions may alleviate load imbalance but may also incur additional overhead. The GA cache should be exposed as a tunable parameter since the current heuristic of reusing arrays with the same type and shape does not apply to dynamic applications. For example, while not a true application, the current test suite for GAiN creates many arrays of different shapes and types. Most of those arrays are not reused. Applications of this nature may wish to disable GA caching. Alternative temporary array creation strategies and heuristics could also be developed. Although the GA cache is meant to solve the problem of temporary array creation which occurs through normal use of the NumPy API, it does not solve the problem of combining arithmetic operations. Packages such as \emph{numexpr} \cite{Coo11} and \emph{Metagraph} \cite{Wan11} evaluate multiple-operator NumPy expressions many times faster than NumPy. numexpr works by combining arithmetic operations, reducing temporary array creation, and utilizing vectorizing libraries. A similar approach could be utilized by GAiN. The approach taken by numexpr is similar to the approach used by GpuPy discussed earlier. GpuPy utilizes lazy evaluation to store NumPy functions as an abstract syntax tree to combine arithmetic operations on a GPU. Although the master/slave capabilities of GAiN allow for most NumPy applications to parallelize their NumPy portions alone, utilizing the MPI-2 specification may not be the preferred approach. The distributed computing capabilities of the IPython project may provide another means of separating the serial from the parallel. The approach taken by DistNumPy does not involve MPI-2 dynamic process management but rather has all processes besides the master process block for task messages during the module import. There may be other ways to separate the serial from the parallel which don't involve dynamic process management such as processor groups or careful use of branching within the code effectively emulating a master/slave situation like DistNumPy. The scalability of the Python interpreter remains an open problem. This is the single greatest hurdle to running Python applications at scale. There is a potential solution for diskless systems such as BlueGene/P machines provided by \cite{Scu11}. Clusters with local disks mounted to their compute nodes may find other approaches valuable, as well. %\appendix %\section{Appendix Title} % %This is the text of the appendix, if you need one. \acks A portion of the research was performed using the Molecular Science Computing (MSC) capability at EMSL, a national scientific user facility sponsored by the Department of Energy’s Office of Biological and Environmental Research and located at Pacific Northwest National Laboratory (PNNL). PNNL is operated by Battelle for the U.S. Department of Energy under contract DE-AC05-76RL01830. % We recommend abbrvnat bibliography style. %\bibliographystyle{abbrvnat} %\bibliography{bibliography} \begin{thebibliography}{36} \providecommand{\natexlab}[1]{#1} \providecommand{\url}[1]{\texttt{#1}} \expandafter\ifx\csname urlstyle\endcsname\relax \providecommand{\doi}[1]{doi: #1}\else \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi \bibitem[Pnl(2011)]{Pnl11} Global arrays webpage. \newblock http://www.emsl.pnl.gov/docs/global/, 2011. \bibitem[Apr\'{a} et~al.(2009)Apr\'{a}, Rendell, Harrison, Tipparaju, deJong, and Xantheas]{Apr09} E.~Apr\'{a}, A.~P. Rendell, R.~J. Harrison, V.~Tipparaju, W.~A. deJong, and S.~S. Xantheas. \newblock Liquid water: obtaining the right answer for the right reasons. \newblock In \emph{SC}. ACM, 2009. \newblock ISBN 978-1-60558-744-8. \bibitem[Ascher et~al.(1999)Ascher, Dubois, Hinsen, Hugunin, , and Oliphant]{Asc99} D.~Ascher, P.~F. Dubois, K.~Hinsen, J.~Hugunin, , and T.~Oliphant. \newblock Numerical python. \newblock Technical Report UCRL-MA-128569, Lawrence Livermore National Laboratory, 1999. \bibitem[Behnel et~al.(2011)Behnel, Bradshaw, Citro, Dalcin, Seljebotn, and Smith]{Beh11} S.~Behnel, R.~Bradshaw, C.~Citro, L.~Dalcin, D.~S. Seljebotn, and K.~Smith. \newblock Cython: The best of both worlds. \newblock \emph{Computing in Science Engineering}, 13\penalty0 (2):\penalty0 31--39, 2011. \bibitem[Buyya(1999)]{Buy99} R.~Buyya. \newblock \emph{High Performance Cluster Computing: Architectures and Systems}. \newblock Prentice Hall PTR, Upper Saddle River, NJ, USA, 1999. \newblock ISBN 0130137847. \bibitem[Cooke and Hochberg()]{Coo11} D.~Cooke and T.~Hochberg. \newblock numexpr. \newblock http://code.google.com/p/numexpr/. \bibitem[Daily(2009)]{Dai09} J.~Daily. \newblock Gain: Distributed array computation with python. \newblock Technical Report PNNL-18355, Pacific Northwest National Laboratory, 2009. \bibitem[Daily and Lewis(2011)]{Dai11} J.~Daily and R.~R. Lewis. \newblock Using the global arrays toolkit to reimplement numpy for distributed computation. \newblock In \emph{Proceedings of the 10th Python in Science Conference}, 2011. \bibitem[Dalc\'{\i}n et~al.(2005)Dalc\'{\i}n, Paz, and Storti]{Dal05} L.~Dalc\'{\i}n, R.~Paz, and M.~Storti. \newblock Mpi for python. \newblock \emph{J. Parallel Distrib. Comput.}, 65:\penalty0 1108--1115, September 2005. \newblock ISSN 0743-7315. \newblock \doi{http://dx.doi.org/10.1016/j.jpdc.2005.03.010}. \bibitem[Dalc\'{\i}n et~al.(2008)Dalc\'{\i}n, Paz, Storti, and D'El\'{\i}a]{Dal08} L.~Dalc\'{\i}n, R.~Paz, M.~Storti, and J.~D'El\'{\i}a. \newblock Mpi for python: Performance improvements and mpi-2 extensions. \newblock \emph{J. Parallel Distrib. Comput.}, 68:\penalty0 655--662, May 2008. \newblock ISSN 0743-7315. \newblock \doi{10.1016/j.jpdc.2007.09.005}. \bibitem[Dinan et~al.(2008)Dinan, Krishnamoorthy, Larkins, Nieplocha, and Sadayappan]{Din08} J.~Dinan, S.~Krishnamoorthy, D.~B. Larkins, J.~Nieplocha, and P.~Sadayappan. \newblock Scioto: A framework for global-view task parallelism. \newblock In \emph{ICPP}, pages 586--593. IEEE Computer Society, 2008. \bibitem[Dotsenko et~al.(2004)Dotsenko, Coarfa, and Mellor-Crummey]{Dot04} Y.~Dotsenko, C.~Coarfa, and J.~Mellor-Crummey. \newblock A multi-platform co-array fortran compiler. \newblock In \emph{Proceedings of the 13th International Conference on Parallel Architectures and Compilation Techniques}, PACT '04, pages 29--40, Washington, DC, USA, 2004. IEEE Computer Society. \newblock ISBN 0-7695-2229-7. \newblock \doi{http://dx.doi.org/10.1109/PACT.2004.3}. \bibitem[Dubois et~al.(1996)Dubois, Hinsen, and Hugunin]{Dub96} P.~F. Dubois, K.~Hinsen, and J.~Hugunin. \newblock Numerical python. \newblock \emph{Computers in Physics}, 10, May/June 1996. \bibitem[Edelman(2007)]{Ede07} A.~Edelman. \newblock The star-p high performance computing platform. \newblock In \emph{Acoustics, Speech and Signal Processing, 2007. ICASSP 2007. IEEE International Conference on}, volume~4, pages IV--1197 --IV--1200, april 2007. \newblock \doi{10.1109/ICASSP.2007.367290}. \bibitem[Eitzen(2007)]{Eit07} B.~Eitzen. \newblock Gpupy: Efficiently using a gpu with python. \newblock Master's thesis, Washington State University, 2007. \bibitem[Gropp et~al.(1999{\natexlab{a}})Gropp, Lusk, and Skjellum]{Gro99a} W.~Gropp, E.~Lusk, and A.~Skjellum. \newblock \emph{Using MPI: Portable Parallel Programming with the Message-Passing Interface}. \newblock MIT Press, 2 edition, November 1999{\natexlab{a}}. \newblock ISBN 978-0-262-57132-6. \bibitem[Gropp et~al.(1999{\natexlab{b}})Gropp, Lusk, and Thakur]{Gro99b} W.~Gropp, E.~Lusk, and R.~Thakur. \newblock \emph{Using MPI-2: Advanced Features of the Message-Passing Interface}. \newblock MIT Press, November 1999{\natexlab{b}}. \newblock ISBN 978-0-262-57133-3. \bibitem[Harrison(1999)]{Har99} R.~J. Harrison. \newblock Global arrays python interface. \newblock http://www.emsl.pnl.gov/docs/global/old/pyGA, December 1999. \bibitem[Husbands and Isbell(1999)]{Hus98} P.~Husbands and C.~Isbell. \newblock The parallel problems server: A client-server model for interactive large scale scientific computation. \newblock In \emph{Selected Papers and Invited Talks from the Third International Conference on Vector and Parallel Processing}, VECPAR '98, pages 156--169, London, UK, 1999. Springer-Verlag. \newblock ISBN 3-540-66228-6. \vfill\eject \bibitem[III(2007)]{Pal07} W.~P. III. \newblock \emph{A Concise Introduction to Matlab}. \newblock McGraw-Hill Science/Engineering/Math, October 2007. \newblock ISBN 978-0073385839. \bibitem[Krishnan and Nieplocha(2004)]{Kri04} M.~Krishnan and J.~Nieplocha. \newblock Srumma: a matrix multiplication algorithm suitable for clusters and scalable shared memory systems. \newblock In \emph{in proceedings of Parallel and Distributed Processing Symposium}, 2004. \bibitem[Kristensen and Vinter(2010)]{Kri10} M.~R.~B. Kristensen and B.~Vinter. \newblock {Numerical Python for Scalable Architectures}. \newblock In \emph{Fourth Conference on Partitioned Global Address Space Programming Model, PGAS{'}10}. ACM, 2010. \bibitem[Lundh(2001)]{Lun01} F.~Lundh. \newblock \emph{Python Standard Library}. \newblock O'Reilly Media, May 2001. \newblock ISBN 978-0-596-00096-7. \bibitem[Nieplocha et~al.(2000)Nieplocha, Ju, and Straatsma]{Nie00} J.~Nieplocha, J.~Ju, and T.~P. Straatsma. \newblock A multiprotocol communication support for the global address space programming model on the ibm sp. \newblock In \emph{Proceedings from the 6th International Euro-Par Conference on Parallel Processing}, Euro-Par '00, pages 718--728, London, UK, 2000. Springer-Verlag. \newblock ISBN 3-540-67956-1. \newblock URL \url{http://portal.acm.org/citation.cfm?id=646665.699092}. \bibitem[Nieplocha et~al.(2005{\natexlab{a}})Nieplocha, Krishnan, Palmer, Tipparaju, and Zhang]{Nie05} J.~Nieplocha, M.~Krishnan, B.~Palmer, V.~Tipparaju, and Y.~Zhang. \newblock Exploiting processor groups to extend scalability of the ga shared memory programming model. \newblock In \emph{Proceedings of the 2nd conference on Computing frontiers}, CF '05, pages 262--272, New York, NY, USA, 2005{\natexlab{a}}. ACM. \newblock ISBN 1-59593-019-1. \newblock \doi{http://doi.acm.org/10.1145/1062261.1062305}. \newblock URL \url{http://doi.acm.org/10.1145/1062261.1062305}. \bibitem[Nieplocha et~al.(2005{\natexlab{b}})Nieplocha, Palmer, Krishnan, Trease, and Apr\'{a}]{Nie06} J.~Nieplocha, B.~Palmer, M.~Krishnan, H.~Trease, and E.~Apr\'{a}. \newblock Advances, applications and performance of the global arrays shared memory programming toolkit. \newblock \emph{Intern. J. High Perf. Comp. Applications}, 20, 2005{\natexlab{b}}. \bibitem[Nieplocha et~al.(2010)Nieplocha, Krishnan, Palmer, Tipparaju, and Ju]{Nie10} J.~Nieplocha, M.~Krishnan, B.~Palmer, V.~Tipparaju, and J.~Ju. \newblock The gobal arrays user's manual. \newblock http://www.emsl.pnl.gov/docs/global/um/UG-PDF/GA-UserManual-Main.pdf, 2010. \bibitem[Oliphant(2006)]{Oli06} T.~E. Oliphant. \newblock Guide to numpy. \newblock http://www.tramy.us/, 2006. \bibitem[Panuganti et~al.(2006)Panuganti, Baskaran, Hudak, Krishnamurthy, Nieplocha, Rountev, , and Sadayappan]{Pan06} R.~Panuganti, M.~M. Baskaran, D.~E. Hudak, A.~Krishnamurthy, J.~Nieplocha, A.~Rountev, , and P.~Sadayappan. \newblock Gamma: Global arrays meets matlab. \newblock Technical Report OSU-CISRC-1/06-TR15, Ohio State University, 2006. \bibitem[Perez et~al.(2009)Perez, Langtangen, and LeVeque]{Per09} F.~Perez, H.~P. Langtangen, and R.~LeVeque. \newblock {CSE 2009: Python for Scientific Computing at CSE 2009}. \newblock SIAM News, 2009. \newblock URL \url{http://www.siam.org/news/news.php?id=1595}. \bibitem[P\i{e}rez and Granger(2007)]{Per07} F.~P\i{e}rez and B.~E. Granger. \newblock Ipython: A system for interactive scientific computing. \newblock \emph{Computing in Science and Engineering}, 9:\penalty0 21--29, 2007. \newblock ISSN 1521-9615. \newblock \doi{http://doi.ieeecomputersociety.org/10.1109/MCSE.2007.53}. \bibitem[Ramachandran(2008)]{Ram08} P.~Ramachandran. \newblock Performance python. \newblock http://www.scipy.org/PerformancePython, May 2008. \bibitem[Rasmussen et~al.(2004)Rasmussen, Sottile, Nieplocha, Numrich, and Jones]{Ras04} C.~E. Rasmussen, M.~J. Sottile, J.~Nieplocha, R.~W. Numrich, and E.~Jones. \newblock Co-array python: A parallel extension to the python language. \newblock In \emph{Euro-Par 2004}, pages 632--637. Springer-Verlag Berlin Heidelberg, 2004. \bibitem[Scullin and Ahmadia()]{Scu11} W.~Scullin and A.~Ahmadia. \newblock walla. \newblock https://bitbucket.org/wscullin/walla/overview. \bibitem[Wang(2011)]{Wan11} P.~Wang. \newblock Metagraph: A declarative graphing system for python. \newblock In \emph{Proceedings of the 10th Python in Science Conference}. SciPy, 2011. \newblock To appear. \bibitem[Zima et~al.(1988)Zima, Bast, and Gerndt]{Zim88} H.~P. Zima, H.-J. Bast, and M.~Gerndt. \newblock Superb: A tool for semi-automatic mimd/simd parallelization. \newblock \emph{Parallel Computing}, 6:\penalty0 1--18, 1988. \newblock \doi{10.1016/0167-8191(88)90002-6}. \end{thebibliography} % The bibliography should be embedded for final submission. \end{document} ga-5-4/python/docs/pgas_11/laplace_results.txt0000644000175000017500000000061712662210372017464 0ustar mbambacores N numeric wall 1 (np) 1000 7.14 64 1000 4.53 7 1 (np) 10000 843.43 32 10000 183.74 95 64 10000 99.31 53 128 10000 53.33 34 256 10000 29.67 28 512 10000 18.01 33 1024 10000 13.17 57 2048 10000 11.78 111 512 100000 1348.93 1024 100000 670.04 2048 100000 353.70 ga-5-4/python/docs/pgas_11/sigplanconf-template.tex0000644000175000017500000000375012662210372020400 0ustar mbamba%----------------------------------------------------------------------------- % % Template for sigplanconf LaTeX Class % % Name: sigplanconf-template.tex % % Purpose: A template for sigplanconf.cls, which is a LaTeX 2e class % file for SIGPLAN conference proceedings. % % Author: Paul C. Anagnostopoulos % Windfall Software % 978 371-2316 % paul@windfall.com % % Created: 15 February 2005 % %----------------------------------------------------------------------------- \documentclass[preprint]{sigplanconf} % The following \documentclass options may be useful: % % 10pt To set in 10-point type instead of 9-point. % 11pt To set in 11-point type instead of 9-point. % authoryear To obtain author/year citation style instead of numeric. \usepackage{amsmath} \begin{document} \conferenceinfo{WXYZ '05}{date, City.} \copyrightyear{2005} \copyrightdata{[to be supplied]} \titlebanner{banner above paper title} % These are ignored unless \preprintfooter{short description of paper} % 'preprint' option specified. \title{Title Text} \subtitle{Subtitle Text, if any} \authorinfo{Name1} {Affiliation1} {Email1} \authorinfo{Name2\and Name3} {Affiliation2/3} {Email2/3} \maketitle \begin{abstract} This is the text of the abstract. \end{abstract} \category{CR-number}{subcategory}{third-level} \terms term1, term2 \keywords keyword1, keyword2 \section{Introduction} The text of the paper begins here. \appendix \section{Appendix Title} This is the text of the appendix, if you need one. \acks Acknowledgments, if needed. % We recommend abbrvnat bibliography style. \bibliographystyle{abbrvnat} % The bibliography should be embedded for final submission. \begin{thebibliography}{} \softraggedright \bibitem[Smith et~al.(2009)Smith, Jones]{smith02} P. Q. Smith, and X. Y. Jones. ...reference text... \end{thebibliography} \end{document} ga-5-4/python/docs/pgas_11/Makefile0000644000175000017500000000041112662210372015171 0ustar mbambaall: paper.pdf paper.dvi: paper.tex bibliography.bib latex -shell-escape paper #bibtex paper latex -shell-escape paper latex -shell-escape paper paper.pdf: paper.dvi dvipdf paper.dvi clean: rm -f paper.aux paper.bbl paper.blg paper.dvi paper.log paper.pdf ga-5-4/python/docs/pgas_11/sigplanconf-guide.pdf0000644000175000017500000031161212662210372017632 0ustar mbamba%PDF-1.5 % 156 0 obj <> endobj xref 156 19 0000000016 00000 n 0000001463 00000 n 0000001548 00000 n 0000001696 00000 n 0000001794 00000 n 0000002389 00000 n 0000002564 00000 n 0000002658 00000 n 0000002772 00000 n 0000003057 00000 n 0000008575 00000 n 0000008985 00000 n 0000009383 00000 n 0000009755 00000 n 0000010220 00000 n 0000010349 00000 n 0000012032 00000 n 0000012294 00000 n 0000000676 00000 n trailer <]/Prev 100053>> startxref 0 %%EOF 174 0 obj <>stream hb```f``ǀ| l@qLpl<+6x// #s )܃o 0Kx Q84# * 5dbX4q(T}Ád!kKwX.elW04'UOշ\+M (Xm׊eZUyI< 4pq^cywK6-lEKqr\6@0d@W@ Y9{O,a9M4}:k9{oV4'!(:;0<~=4qF4')w~\mF',O˘00 .j*H8t| DccHl80fcc8[PP44MQPPIIIcRRg@5)))$((0TX w +kCT@fȁAj<@d%$^f7[›:4fHc`(MmBYf,n"ogX4*rv(l~0"Aa(k@HB Т H``[ ,(ɯ 'K_<l;camX.qRx6cAaf F endstream endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 160 0 obj <> endobj 161 0 obj <>stream hު6THLIQ00P-QH/V0T3DR+3p(*.MdR2j  endstream endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <>stream hޔYy\S׶NɉXpN=gzҪ(X*(Af1̐d! "C0[DmmvPzoju;9g5|kou,-Dbi5+9:/q -Gwp˖?9ILj֬]<%ˣ YCvGu '6;;'3viHG#P'A"`hh\4B4[*/&-HEf19( O.)Z,_c"$,H${:A$ZH|Q"GQH ? ,Y.if iK1lP1 +X Z;fM`{C&I|hЧ4:H1{FGZ,ŎUD Aa6̕pV9;n'LrQRNa'\wl(llqUbݗV8FڽK, l~^KrEEM6SD*Z ^s/XEעv_*x_7AK'XǂU$6]HU̓%4x)7obK,J"/_t9X+0YIC/X&OMS? ̹ov6G"{no>ojl*z^Dpi+!5#b]V[J:w{Xr%m>7wCepb\|P;)@F!ARt pc `**es}՘WPQ'y#C``tQ|F Z=d.qIYo>-- ]Ga7j c큺lؑl{cFGOp4)a>Q`屚\[CNAATTPzmK+ν|+MfJj/J*j "C>Ãw)yϏ.>Rmu` /xNo2 $X0;&%oìNr]?f+ awFlnƧ~O~}y;?`\RHQ}`;1^v2/ף >q!z}d8SH[p+Hg,O٧Ua٪BUC揑]F|T^(R.!6Eɳ0+P^]Iqn.W\:Q]7:"#.ހnHA%Ӈ>gbr}[N|Wz4wܣu䁗6|T m-Ouxo)x&L|lwa0v#iRw/m:7xVn4mm]?%)'I(X@5]x A|;4z%yL\ eVaoCGb};E}*@~/$!z{dCl=ztpzcI%);q`N``w~*$joǍ0l>*KP'yϴ)!lD3<ck{v˲fŸ .ŇPxķv}NW.MQOlۤ %CzQwQSf* ^d( ū*# B[bLLN5Ma'NL:a\ZVgD>ia\L?קWLV!QhvۏT%^[|(mio"(I8?m%lm! Qf. Os޳qxn aE\j4 ہ4"WZiJ 9CECEN۶!iN_m< 9z#Tې2ǜ|[Lܲ4(Swf{v~nt; yO6#]ߓՇD@ֿ,+I1g%=pΌ0T $p4 AZPTvQh+E)i*WRAA/N^QFg_Dfì[TNr!O: mCeُϸZ 41J X=y&^Asa ScO}L]k~N*?G6ylicm^0}y6Bi*ed&gBvAx*#KM|z>-=|$̃yE) Ԛc?iQYR{$`O"}Y5ti^ߺIA _AŅy_U`҆>ԥOϝ2IMsr `>p{$i25u>K5 Hu}$zy\鷵['uTI"'ΔE鑰Qt#&%2[jZOm"~x7{`UfR6ʢ%E87vT\9Fϭ@<%5փ46U;`v endstream endobj 166 0 obj <> endobj 167 0 obj <>stream hTOo0 >vځRRġ*?Zi0Q~ٸKlv;MqMq8GpS!5tn q~U;mSb;H^c'XҏOG?[lR % y^ vkB[.+@S8Iͦ"F'U13}KᒸF3S]RZ/$ .²be8$pLdlŖJR%gK.-"I( b!&sb!Ē7w;HW1_>stream hLMn0> vZAQ !$(Eq$d~y3y߬XKZ{EPAݞHHM9FVQsRD8sU~Ɇ-.á|*YqiwQvɗ{#)pc4M> endobj 170 0 obj <> endobj 171 0 obj <>stream hlXu68t$v*(D|@'L2acؾc 'N I>=Q<X|miГ>Xq\*yMFڊL;qbB6|XS; >}3d-Mk$SdՒ|Z[&)Y$OYVXVIunQded\0,V t İ,Nz&d*6+ ԚL[fmcI52o¿ -%=Q͑׉RC9Oģʲ[Ky(5u'YB3ΰGGUWkjxϬZE9]6csc #2pE6PyIzQπU%՝-#fj6h}/S15@b\ې^_ Uth)is.RPSkjaϒZPU[A#ʦ'p0 .?! tQS nMTzπOgE<,ϩ}AS"N \+_C_rp|6nijiY2*10 >uM]F^Z -!"$Saϒ rg PF:vMG qHboͅ1|cgްeTRdk{ç_]p~ mpdдa9Omv2PlɦsjJ<;&J?\PGp] !~LcfSm?Hp }>cqZzMfe{ڷrc*q mjVeO4o٧Eˊu打new4֩,lH7=yr ʥMט^t|ta}g8ܭS[( 9sb{q?Cv,ӱStvh9I;4""7A`F날˃&q!ѤS "B.+ &ȇ(Uh$ !L#~sy #B,3FĒ\WdIn0$|׬-d ,=(w/KəCQa'/e&P f8k.f#F&Z״N~gptAiQBx[U@[I/NJ$)p7'TmtIZaOp[z#_D7(ZL事,%5hQٰ֛MK@ lFXB6Բfeؽ]VWiBD;<#nU]m{:{ 6r[숥 endstream endobj 172 0 obj <> endobj 173 0 obj <>stream hTMo 9nJW&ċmHT$} 3 m軛d (:pA(-}g9 wۼؚ~ 68<Sp?<(T  f  .7;w* Vh /0 endstream endobj 1 0 obj <> endobj 2 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 3 0 obj <>stream hޜVn8zS(-bV%:n-==mH w3v[`$o>b}ѫ7?|}<E'y]ukHV8~Ttvd30lz/\\Kpp| '?7ͮ,H^FNYy.Vt۞¥9z;2 Tlt:-&]״T?dh/7y?#~l^qĿpH&.͒CUNM(h& 5[>!Oޥ5{Z+8y g(S)ݔadj_nR& ` ǫ 0\G8-(JĮfѽ6=e:Ey\ We}{6=(:j\SEqBЋG`X4az<#Y 7{XАsA;Z6g k3ڨǴJ[=\\q?Ti[=qӣܺEC4ԃE!2S9f`&DD+*& oFiVqz;X{tXQYQb?R-×[By\D=P6Cu.ƪ~ܸM]۲ɯq' ,B1@q2puiq7&O7C@ l{KFKtV%ivvl6iW*)vzrKEUY!Ӓx&rwKTrf% EZ:-&܃}Mai~WGTYtЀuaJ4=<([mSt )4.~A-, g;h.xД'g,3(XFq  c>v 6zx_4W@G+N/;62_%o&Y| `7rŜzibjG Z[ָF:u₍%w|XH)F-lw}JѳaQ&IZ92T\feo i@: 7zR|ql)#5־= O/#iտ P endstream endobj 4 0 obj <> endobj 5 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 6 0 obj <>stream h޴Vmo6_0"%R⾵yi3 C7 (`9!X/HJ4-ˑt b3swٻbxey1k33N4f9Oxz&% ,~hf90-cF.a`/U"$n\`b&qĒ<}gu=" fڷ_WѺ7n{ ~vu{ZJC+r G)" d<)ǞffRd#0Aԛz99A2#xm Qe'k40NSAT_[$1TиېTzUX}ĺ˿CJ JP:Q߶. CQT\ %Ʃ/ףcrrvV_jwd3Ze4 1 6T(ڦhJM뫞xa<5&^{\p}_)L $kF֖B>1j]H#v)R,An0*,$F endstream endobj 7 0 obj <> endobj 8 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 9 0 obj <>stream hތN0D,/uZ$̪HK ڢR&6Dd<3%K1QU2E[J:TY :SZoA#٬eCWl<>MЃW"xPY<<5K6s\4lЎEVؚ 4:~O>3+0PJ":춝7\hA4O?֝`й>?kZ99-GH=,xsz5n}} YCL#7ƀIOn$~~N*?Ne3],M_FQjE,ۙ,Ut*zRb/ (S#?Y=%ƀU1ԝa, # endstream endobj 10 0 obj <> endobj 11 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 12 0 obj <>stream hެXKo6z_")RRo$uȁ Fo|O(?SkF8 7%rvG8Zf$A%8(X$ZϲgWF4c1[~ey-GOH,%U|)F4,`Dj,6ɻzK8Ơ#4Ң vxtN2lğϞs[UGKa}>͍/$i(IDN_~%8:Aԫ?֛YKyWò}0F Gm!zjɝ‡fzf(K pzji^t fI\Jv)W6K)+լ{4_ ^I_MXYAJ)NvnuU#_ve06./4 2.VMY2r{8EIjh;Vu^ưSze?9vav ~>{hG{@)j#~D6pDN ""*vF6g?t߇$ fqJ n V:WaH_ K/.TYE Q]A4ڛ8 J {բY#34S̕{0*Pky Qcѹ rHfμ<,`-J]lVy3XTP!!oT;ƁvO\u3\MT׮w9e/]蝒eduX}S,Px']V&$OnA9e?t,CdZNka? t$n@BMLkV=1{،A#eeWaE:--*uKq~Ab;k>gZ(V*0N*av֖QU3q+÷ T[U+y~y,4Jp0IYD pgy(p0 >J}iO]N))tTb FSδddӴ`hIĶx uRic!zr˰CYz/+V=:Qڭ0m|g?e9.p: 4#iaIr-Ç <k/9C:mĺiY;ma & 8.GO| Tu|{SN 6\e$Ӧ;n<4@E{nό_onGP|-+%(K"w@L\s?)? Y{i ԅ% TX_EUN1JZ 3IQ-&!&v2SW`ffn"ᓝ]HվZ_+,>C:ipOKeJ ܢ[‰KSNN#EN3 #<_`LXOyAƾ @h({~*ԷSqO'CÑCهP3sa.b( 7}௣f瓽 pHg*ୖVeoOxab=6,tL')y<>*lY8;N+ 3`]:v%J<&J>W-D2Nh?w JrbYj6zr$np) nfjhzsch燿1?-iۚhX 2Km^Z t=T-cj#WN 0ϛUmh #Mb 0@b endstream endobj 13 0 obj <> endobj 14 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 15 0 obj <>stream hތSMo0+8BUltTYw+VƛRp6rV 7o9Ģ21;Dƹ9i(6aR1:)QQRbxiI5O(I3I4yiMGn>ƍ >^u??v{pê=m4YE$ +DB:}zVr7 qgp %gǙv;)_mP<6RUc^ @;r >]g,q/g=;^[hUF4!;9V8{=+m^'- >MDyD1Fì+Z^z+AK=Ļ}Xrm=W}.q; kZ z(w"=[+uҟBzl~+[ir ^RdHRb>i 4=*YW)9F endstream endobj 16 0 obj <> endobj 17 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 18 0 obj <>stream hތVn6zS(#Ri6h.X {eVWTIny}9$'vm>|fnZZ-Ӏv, x;&9)s$c" vjuX7{9jB}~_0Nhg[LצQxP]bhطػz1HADrc׊,/rdi$ pWS'yr;[6tT?8܍r7 /KԽjU=l8LhpvMwrɼfB%͍hxͩE~㋥ j0f MfƋ|vBf6փYg]> endobj 20 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 21 0 obj <>stream hެX_۸У\"E/E({\^bK$c();3d$R7gg=t/g~YAeQ=IdQg2 v$z8|;͈,rdy5"MSƌRJWz%>i[mcn'C DGLcp`X_ &.뀋Y蟊KM>i^Bw67$G=-Hrq~2%=p'P8B9cWX7'5usN/S71 [7!<=#9rMяa3A$r lOm]nz .YҸȮ3vkȇ yw:,>ҵPnnY{dl?i2I?2m-}ꦌH0o!o]Q$Cx92TV^; 1 N؋5}w_ʴ J,$8I}Ra N;{HKy!G*?޷U}sZd2_~!SM@^Xζ6:<5@~23D

Y"!ާ_`r.N-yN#1#mHVԂʳ";<&>;Kbʜ.) rՕ-/ *2p p{.0=Swn۸NYY:;mv|ΫhR. 6nE͓ꟓ$|3UoL|`>9$\Jҍ/$m8جa-(PƎ3)  k(C4kTO&_ގgj\ QGr< 2̘ /LIA0PBWq|5M^ɍPCSAEםp@Qan_!F% Wjxi4먲q:݇J+ endstream endobj 22 0 obj <> endobj 23 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 24 0 obj <>stream hޤTMo0W 2qh+*$mleTR0Nbh?ϼy3',;uDŽK Q\?k2@0[Q/߭79H8A4JOTJ)C BA F$e4D~6 "csூP?%-]vέՄ{8A3w̫`(DO;nD& 9#+ZxJs% gpP{cTޅprƑB'BPQ2ۘ5v> endobj 26 0 obj <> endobj 27 0 obj <>stream h endstream endobj 28 0 obj <> endobj 29 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 30 0 obj <>stream hބTێ6}W."ߺKA>@˔D&U^⺂ܡH@j9sfȻ_7񴖓_hM$Q4?oGa*fEpZo["b$lܾ)Z,r+0N lKUKeM1|հB\/NI SүvWl=fJV 碐zg5Y7wK¾=q<7RG,q%Poiju@U{̕Q~@{p͸Toiܯ$KoDHN&;=bQ.%<"{=ꏪ\,|AWeez7k*xW߰> endobj 32 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 33 0 obj <>stream hޤWo6"P1>hoR ˕iD%5U~D@y.Z)JDLN4J=ىEw* >J\0H@F(k,!c b=MxEe] F/YL-EV5qGKװTXm{`*%]r}>'˗]ߕͲ+}J$.bg+g:a٘H\gh@X ncJU}$v7;Qn2y7>'}bƜTl_?2D$ ,%fiWcI LLJ4cHm*iެyb]J7 # J\!$25z+fkS z[\2$k[|lThE7`v`ď9H)®+A -WHJw~i]H Ju\y#ȥkTյ'M@9% )1zb,'Yl,IPQuX0_Hb0t!$3~((wVhGу!A^^.| X$U%~Wthq}F$ Ј6!GZ#x/!}Ni3,'.%y.{Amu''P_j**$dKvžQ'Ïd gVꆅ,흡 9%KjE٨ܼ;)O|˶#!%<(b8L5u$UDH@ k*߰$K7L)8ޯ]C } %G-~Ei<|5FqHޣ~B0SEFBCjK Ŏ󤈓0 2 砇=!+_`K&4 <697L$d#0X()(~d?Q0,_\P1(}j5Ԇ j+/iZ[;8Iyvj?kMmRi ɕp0gEkuSsLH^f-*,SC} q5ґvM;6ZiJԏےf g;:5WՖ+E\m؎ُW^ж|5 IԪ~JbǭBϹ3EmFu xD Z.=ejw&=~8N<1?̏ a"v }#[ěazA-}P#v`אNc5hh 5Z#FkTc@F`lYNR1pt$Xڵ.EM ;rv;TC_@)%zq] Ŗ We]Sa]jF"] G=%? ]y endstream endobj 34 0 obj <> endobj 35 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 36 0 obj <>stream h޴X͎6қGIQR{JH("+Ȓ!ME/\rCI6I3ÿ#_]z^pu`81 KT*Q,䱙v\;7>ol%uv'`b$}~5J]7l/ ,$Ԗ5!ɁcT'OmGM_!ar*C0S:\<Y9$uѴGM&[.J@+ăߦʋo_zlr{we}G P4T>ot?+.դmG3'b]$Rq=Dd݅!6M+`DXd25JxgĠhAKT2]Gns,BR"%4NtQniMWw xDsnXb`* tqd"&JZsJ[ ̘:]>@܃4IXIܳwA$j.Yu~#7..~'z>[0F}9†$:ɲz_jGԞ7-xԃr`C EAC#t@He(mo=<{̎J͢~Eh1f>:ΕnaYU=o06C50; %݅%;qE&3J1@av<Y :>d n04[G Xcj5[:7a ]$R1',|4i'8 ; F]~ҭs,h}q)5O1F*@71&Ȯrps]dşD‹q3χO*yeXqtNLm*357hʎ!iQ Ԁ.~3o|{u }C-3z_/A"l84`"$6}zk$ mTӐlc(ÈL'QGk`N婲lFLzA8{dw|A*Q[x,_عoN~bv~_f# ( endstream endobj 37 0 obj <> endobj 38 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 39 0 obj <>stream h޴XKo6zأ=]q&R9X+-$*"Op.rHJAggWd|M'$=Yiҏ=I4ӘAۖGd?Y.?r|o}% *Kb *WG?/S7 C:!Iγ7F|9Mi ά%ޝ/^wߚwӏ_GL>%!u3CWR4WA伞B8 |;4[pB8MU5F7%6UۭㅡE3(0|Z/$G ufSдf#ŢiI,kcuf[x-1F8p0|8a)ĹVH$/%-I׻+zW\qg$NX^ -Jiݰvv9;U+XN>& O-l8ƔMW!WY,smbr8 #р7#kY.xk]oӍ!:8Xvwo-.6' gCvX`u^-FADzDߩ(!'ТHK",vfoGBIuw (llc v[hꑳg6 k{{hj.7c:32Ndw![RJuWhuNׇtqV3s6r\+ycϛvݿ%[˛iC[5'"$m%жQAHȯod*ŢlQGV3Մ-_?<ܷb0fHGQE$hɮZ#}.fk7$o˕hnQ((Ӫ7ۖ0LذE-(W49(pwz46y7GJ`R# ySXq{ {|˨=Haq1PZVhKW;+-[i`Y1*k'hrHH" f({}CZ7G&.+:1|o`uQ>X/`ee!6P=cݱU Cg.YB!5 ~&`$`xk޲ s@}m'lWq˞꧉C79jVe'vCO(iFttE8yyEZFXG"7&@7\ᷝ/ޝV1Fdb/'z wʥ̶ e|gۓf5w|r@RW+'Y?N>~@?PwFh; 9`Bk+L>IT!+pRhF(}ySф@q-$frAa1̂Y93ǗAٵ[v% ټZ2gt~h-O,xdB%=K.#z3S!e;xZȇ?S}_ 85[' 9) {:ԓ< )yeqCY:{&gO _Ӂ4 endstream endobj 40 0 obj <> endobj 41 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 42 0 obj <>stream h޴X͎6rQhfq$3C0FV6@^8Ez4 ,"Y"U_}U7 g߭Yy8Vb;>1"cƙp4f\$v\n X^$,uo B{sN׿lcC<4#p|u剈a:ZB-ݻ"$0vaBe[]<=}leוMM ]ZGYq}ǴElJ_d>pn_`jN>Gġw^80`ҪVw|\1N8Yڷus<3tɮhS7F. 2oާ/FZS&D*K܇ηit sgYwЛk߽$nќps[\{pӐW%ECi|N In\|'{(Ǚx.E w42I#F7~{'?䉀L?;F{sT9#(*М9= U?4]z僬$!1)p7e6xY]| /&$;  /CuT5I3_0Jh9.1/k EDs Q43RJkeUKr(7jV3f/Ӗf {gU>ArSԇ4) }4Ե+PljєAF3Dߐ$mQv|-gȄvoX]ţEz״| Nܘ8Px$B*G:Ҟ*"{YI y/#q0m[&<2yIOLLytgQNXZD?ct,>!$˂fsm3h g1 eԴdѵl㎙D>t=T,8P66u:Z=#Kˋ(1(]ud=Ϋ!y?8ebUa/ aGT3a4Gqxx xC&4^=-q3:G(e Sϋ:. XF6s|[ L'`qQ63zb #ucE9hfUE!? DOHzIƈn)[X0CM=ZRZq#~8- ^:t4՟W#*fyАX ߾d,*ˏFRKsCgO"sJLeS w$ʆ.Z.ZEӷx1tSqݸcnBpϐYk7n V-Ps+M+\~[ e endstream endobj 43 0 obj <> endobj 44 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 45 0 obj <>stream hތUMo6_CRdHJ佹8bzʴ$# rHNs(Xf#nK:ZS>MwI! %RT&rCY9a=yx\$&!e Ey-~A@/>&^J^Oc σ/Vs,Lno?ܺ=8CP$FEM56N1{߾5m+-}w¢$MDm]_G,ybӯԒDΦS;*g9+v.[}]IؽD}ݸp^W;ժ*W#3akDQbf ~iE]}ՖNMWձC' 1lxJF@zj\`i~'<"fX`ߚ6jW2ybz7/m_T֞6'Qy@HWU?zqzOÿ6[ ju:CgU eEgt,N`؀Vp* [{Wҟ"z%yA5mNC۵ul+&pGi # FiTKaČ"n@jg&A^hYZěL:zh}tÙCޞ>!4 Ð߅@NG >z8!l[Ԫ1QTsNUތ8~g!3]+5g_(*{luM$5ɿ Cx. endstream endobj 46 0 obj <> endobj 47 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 48 0 obj <>stream h޴VKoF _&kѢ+YDZؒ!M?Ry87Y($Ϗn~Ģi}H#U+2q4)T"Yp"ȣjʢ6~YIs$/r,tqNruS=%7zVR1eY%9nJRQ"&a9)b27zjnN{ݰ語]^0{shlkCDޚ(E{*φ8z͔! Lrs Z`IJ)'ONULHPI2EQ&>ë:@AH݄z@&yO U)~#y&dNcxts4g \&xxS;-ߙ?/U0[߾`ϳ=>͉Z%!AxZî1 )|pmq;I%n;7H\ckO1pA~nT& ۻ rl<0:B0G~NR/-̰E86FӅϙ,\١Eiv8=C漍xz -~WIa>[o."q^eKV,|1Z+ 9z endstream endobj 49 0 obj <> endobj 50 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 51 0 obj <>stream hUn@xWFֻkR ^Pk \R!>OfqH539;3>{{f{{gokoY$>Ƅ$Ɍd@Ƌfa_II@(8ލ8_^!`?A)Ż˫Ib9$0,!B 4T/A чe7E[lbJN">#I Q#|B@t-v׉B7M* -BUK5E'h}[ZT;Y&mLKs1#qO^d1׼fSGjU^DӖYGx] L>l"G[Ze)KQCmHVVZitm4d.9d64+y({r(r}ruu}̢4UF.`tY pL,kJDLLh݈A!J^Wz_hA;C|zbAVwN^v,|+%YQP:TbY^Ňvb<rMX{&Cro &-ۅ10;Zf_tAde=jO%.+#m3Wvm/diۜ tk*)I'54ͪ[h[Y?NDmWKJ#/))*ق V>n7 [43/sQ;P endstream endobj 52 0 obj <> endobj 53 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 54 0 obj <>stream hޔUn0+t..I:zm&VA[$wKrHFM`§_X0v[ZТ_1b 7ɔ(ܨXQ~Em;nˊ[qB(/8NJScݡz7{cJN1G$!S?UJbFdSt0w[ULQu ]? GոAph=;uO1{ nkބQd5>;mCώޔ03.1i:)*̨#&"ޡ sk`TJ%ҽk/3X=娿IEBP[-yHLˊR&apXX8E|O`{TQ!ufF /@1nѭèt 9S>vU9foM- endstream endobj 55 0 obj <> endobj 56 0 obj <> endobj 57 0 obj <>stream h endstream endobj 58 0 obj <> endobj 59 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 60 0 obj <>stream hޤVˎ6Wh)5GDJnv}v,hX!ɝA"^򒔜_އo^aa\PnhDYxŸ42#yQխ6Vu>ʾ;iqI8n:KGR§ +8ذt*_jmpNG)lmA!ftXcN/lzć&ݑG)e"(zh 6g0".'rV'3nᒫb_@3_F]˧==;$VK6rdHh/Jڵn ]frR'f]h!)M(604#Ql}Bl 28('mj$ðwڙUdѣsmN's > V2Jx9qHrBtr5a> endobj 62 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 63 0 obj <>stream hlTr0}+xNQ؀sqt:L>9}A6jb@ԓz]Nc{v9{VKG{W ?[U~ c&yXy$- b_\$eIIH\ w&raeʂQQ ~<_l5qX7_ܑ%RTyJ[gQp:"NJRG J h.JtvR;*EUß'jǨhoPnH/获"\d -Qbg4Tc'7mjH5p\~l0'}f~аi7 .AQ*`b:&k39^SnK-5\%6JŻ?.HTSٲ$ -rs0qgΏNvFLv<$}oP28E5SԟD\ wcO=KNHk=d$!-@::(& L#xy@*ń%j8Т͕•A%hNmDtSmO!JVh'qhΒr3̓1f%vk(G}+C endstream endobj 64 0 obj <> endobj 65 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 66 0 obj <>stream hޔVn8_Gy3"u[.6h-Ӳ(PRR#B wxzBg gxy{OE;._17#8&؇_Kc?Fiq( d<ߍq\{--m:&& da누(Im`+PHZx*y!h^Y|j2$V )F)mh-4By$(cZfm.dt-r q45T0RK~{pw^x$ mMי O1"ˑy2 @H5$I HMM;8[ F‘./pR+ڶMWrCt-)~6 mtq(Πpp=Wc? 58{G kVLI h~2Z9΄"Y-n.2fwU͞cĔpEC\l[1ў s65* :ɀ:nș[wL38#S߻71N?Rʴ\G1GD> #pA+rc){ Vhoa"A]a-+YؔnZWC$TpIvP^vrYZ}gm8B)1AUu?TOLXe:ړV`=:\4(ڎIft_@X̷ܭ2Y걬*K9`6! {e O Tv*#¬ң*Ax2ŘDލrUT)Hd @NFdl(mekjs{7zAv8(1WEsc,i eẆm]MUގfL#, R!q#? e]U\cQ.?ծ܅"OQ c'\xjVLvQbfeYJ V3hPLsbcm53/h2헺;FUSE~./̋5M]˲GF~!V m7\Ϝ@0 n|P}b/] }28U.+V: 2ml(ZŶ3z͚*WevkA-]zDsV_xH-IY.kxQwvf}cvfz;uMmM]}z~v.>By4f{P>7r_ӝ|MHfF뢇>_~w|%\!a@1lZ ມbͪԫY7Y/'Vwo x)74|^x3~%Opo9mY3ڛCJ&x/KVES]?_n,4펋(7|TXu.'M!N&)ΥW`4 ^NLT0.<}Ϭ`[,5mغ+]m]|Z92zͅ=j7q$wD0i& endstream endobj 67 0 obj <> endobj 68 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 69 0 obj <>stream hތX_6G ?71W$J&7s<6m+џ=Ifo'> ?5 @{0!Omu=P9Ri E7r{&1ڂ*_'|n ‚Za jx%]zO+ =3y! _( tYQ}Kc{QcݑU=rFJ.Q HZc|{C@8 7Ψ6PGǻ2wM}~.@˼3gb\{7Exnї [x9;? ulVl5E=l>Z@(u< < ~=5I,Tv!2 +jx FiSܚ BH޵ #^4҉O{HǤ|Xy'g0S`[DȰKJT}85;DdѶԟ흏4pU3 0Ino{D3{sP+#~اq ;YtA7MD#`c9Shsgm%񶬺-QRDڸ'ECF]{FbVIUc:)h6M\ٳ*X0sKog8 8/Fҁ' iR؇JlAXBtkRY@o'anQ35nRg^҆TEU}t[ܵz=xb%[^,}2]a]Z=Uaߋ#E8k޾>>OuW!) wRZKvoԉ"IIiM}ZOoEg sѝ54jm; #2DĴy})^`oeQd<#I9cGBAЏ+/]ӳ@ohR]BEY ;a\l,qIt9ʎy{2jy[p] fjE튥s{$3Q֝$`9ps\0GY^^h9BÒ:F큹/?΄i(Q׺x[rʙ%.}i7υEP?g(w4`U6=j/$(Q-|?U5PQ/L 9AńTjHlr@[`3Ҽ:y-x/B]tW%\엫QWlWd(4}I6Yg)~^3b2ثYBֲE 7G@Kh^2_|~,?ˀk~yWZײL&\_l/(WgG=u` Pq ޤ ϾG̔& fQ ݔzVgXnN|m|ϴsLyW2s+<4IpRP_"XϜO>A69`#2WpYf,%o*onKs_ endstream endobj 70 0 obj <> endobj 71 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 72 0 obj <>stream h|QMO@+8B"~]f֚&Ũ]Z Њ݁61;o޼ys:qsz%\&SbxLH0G#+nM^yb(Kr1ļ|Ζwsr '!C)K.?y$I2Al ƿz>὞ABCo!덪iʳjS˷^wqӞ0F*{ndoʆ%FBcB}&R'p XMTbfzj=׶W 8d[ٓ\mn/UQrLɴbpX(Q8j:pk.WG`Ys/%T\RV4v^FPu8? Ա endstream endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <>stream h endstream endobj 76 0 obj <> endobj 77 0 obj <>/Font<>/ProcSet[/PDF/Text]>> endobj 78 0 obj <>stream hޔVK6zQ.V\%Q6-Z=s%Ē IcrH=,.`py|d]x^Nt~^!9!Qa̖Rq"r,wNœp<|N *+Iaiׂ "LIȩԘz֟ leֿ-&M|W7% YǺ,*C1CV .x\99ɓZ>Wk!,"GޢrCҶ, Uuee'>&=$iZ7YQLx0҇#yɊ PpOFS^xi$+_0ȕobvMmft|&W}rG%3IҒDƱO6V [r} CI H`Zh)Hx bd!aⱃyzt{ 0Ј٧IHtf͊O D`*օkbAe]oCuyY݁*VDbcsc+ 4P4-gh{8ul7"~Hۺ3!6;lw&+{nrTN+ʩ~I6Ok߽z" A[R`Uz8e=wN~G8 U26[$3)F!vuhY +ԈURr|f!Τ3b.7toT2_H@#q_G ٢r:k8TJ筪fL y nE<Kf`/xVzteXrC&% PC.^k`/UO3h>faHU=̨FO^阛 U[l${H椇wĜb^F;]|rd!X>GH2e/SHg>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 81 0 obj <>stream hެzw\>˲;(FI⌙Xc,1j^b/ Io+M`)˖]z/ KqA@{7jQcFśFs_n{$-gy=<9g@ 7揙lՄFˆM{.Y@3쭬)H#{z9xE;Dzy9xzo tpv8%A[VH++UVVVC߶neS+ٔU删U@:epcϴ+mZQXVIGaj*µ>6$*kvmkc^3O}^k߷o6ۉo4Ѿ]2_w`9l$|s>oߚGgаAT蝃W Vs;rXP6D8$lC vtإa׆黗;_>Yz&0([=!! F?S]MHTJ*%]{7٭6`+G6t2&J, }2GS NOdDmĤtӶ,u]YZZY$L40 u6%f_ܖxv̳vʈ\ Wj*M"`f"`l&0qǒfxԿBqKOl=mc2dv[ C:zBRH)f>svl͹+W).~fe'Y=0^6ѵ#Kٜ̥,nl 3v۪@gڎ3 9,̒e8:П*]2a ۜ5 w>l) 3Ix\&=x`N~Dx·f0qNW\\]᛬J拲 {>kh d*< qSS\&,⤴2i} |>D`<%W?>fg6m~s{~=|D:!A2ԅ tܢ S۪U)t:EHIdL-ް`RqᷚXtGI~q:s0o{E}>X%ew_<)dq9\QxhI΋ '~}Y;?|SHX] 2P.Y鶰D:#"MLLNaP;:( +4xE HʎO=H Yng7ksw=<ӓ,d]YzN ~`j[>9ws߻ŗ2|ދC_~MQe4񲭔D4{ۯk8b8Zŧ'й4iD 4|۱%|  q(NaQpIыIM?J:'yIjM> BLQGQ]HOըخo'dkԙtYJs}7hMZ x9]3 \Ҋ).O^A+|1ZG"wܙxa Lg}' {(`_r 8Mp" 3=i=PL⍹a7d$KquOΙ6}c0ɣ0w+TD#CA>8\x' hȐQ !Q Q[RzCjCma\9>07pa 溌jFllaǥ0-˕%Z[+lkF!#Rh+$1H#ʸ/ڹװsYP(ɂ/5X<ԡtJ&?pPmrAKռV$/Zg>_=( X\̧ؤuMɒCc%ril10@H-/+-Gwx:MNm?Ut[\`A[t8<bfɼL֩3uRZw N]$.1.fczƧ]ϴ[޹JȿǿI;XE՞N0Ñyt+QA%T)2 DZJFwi,,hـRHiJ0.ȌTQd\hL-t7%YSYBe2s 0% BI%Hc\y3aK2Eߚn-!+MBB:i;mâKJZ_; $\+ҨQDF5& 6 *Y ,ušU gCǚj1麖mf67SErn@R{KRH'aTMI=YQ}'Y,z:ҜdmjJbN"}\{=6{eEffl,m︍ѹ\lۭ+R Et|QYY]/o]G0bg2I6jVN%\Ce2F^9*0E~=*ؼ&67""D-MH'ƕfe)}ܹ aeZΩuL*KbrJ3ˊj<#]nLNJ?Si+-ϗtZ{#1܇kv.mCSn%s4)Vs 9mlحcOo 7yzSE`mis` 6m%]qPށ {ۃIѳgr׮bPׇq,&nqz8O+$, m~/=]r>㗓rl9YK5t]]EFVs 3HCBC*f,ۣR-~9s%\~(S/*ёt=F9oR |P?`mVۛԪ=!]Ҳ:QDYUjrX$"65CG]8Ŝik,2( }i5qXJ9x*2.Av"}>S"a>\L_"Z{HkMxjx'Ck8'RagZRux}@"񿫍"7;י,\z'?Q_Rſ!3̇oy#ag0 0@ PDaST#w|7D%u`+\^V8K]6=uf&b[~R G?D63\X I'ڪWOMB")=!) 6E_ 5S$Z 1)5^$*'2FoͻH43q!NwZ~߶|Βp vjy[x##@ˌHjcqÖ;dj9Q#B`6c)&uB8˨;#Q})lD"I'#s 3.W{tj9mI=j |u(p{BWe+:waqXO2IlN۳DܽCxFHLR(mܹm4Zڷ(RքVɿK=asa&L_a6?af4 F)l稚@'_p9彐WiYW8<}@?=1q)փ |+r"F30݌'8 on|neŻڻ7 uYנ΍d1,d5"yeqhJ,ajUg,VBehS윴޵bkYr_mQAZM^m*5Gb<5#*9`U8cHæs3&Էǂ^鴗ǻSh-U,1gQ}2legS.R[4|F}HiՠM[aT-*u9Z.%2Vמ̒5n͒ʩm!MHW6U-o587$ 6M"NZ;aVńQjUjR#!EUZU2J9__Bc5/biY""("RsLcLʙFA N<ſKfZE3X&L `MXjdL  } [> endobj 83 0 obj <>stream hTPj0 tpb8d\;(ΐKt=$%A^ٛ# ,6=T`{t:GZO ";p+?>-!|Ydq5 /wcoq k?U,Piwg*`mw%K0hb endstream endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <>stream hTMo0 ;J Rġ*!i(Cl:@x8b:\7x=m皀p k UtvZvj{AP>N؟\;։q wX [h0t KE&PU`G]At1"h*td3~Nʊ8+JR/Y;sv$s@\JKKW֪2V.gړNA [3  6-0qJݕ2 \̖]ҥ1Y{ >?<[j~> endobj 89 0 obj <> endobj 90 0 obj <>stream FBNLIG+CMSY10-J_  nTLNt ,38 CIcirclecopyrtComputer Modern fonts were designed by Donald E. KnuthCMSY10t_lóC^a[c[c]aO>sIQLOosIQLOo àO3"62" 4u?Cy 3:33O endstream endobj 91 0 obj <>stream hެXy|Se>!MHe-8={0*( *djiҕ.iӐniINfkmtoӝEHY\@e{gF/ʜup/_>=ߡAAc 6ش~aݛ.d Blz8~ӓHA9?7O3|rO5Nh+V23'3s33f$f'd$'rgX΍I~Ɍ-ܬ̤ќ bA4MY4Ҡ=A h9eA[]AP 86u.,m ^mޠmvB{Vj?H@@P+ͧBc1z0b>{y}lk7fpb'2ho&57s';TeVMO~pə@|~^A?`KmKt: 7Ɓ`#:<%Bt䞑0"]W"cI_ Qb{N3alp1-rB-!`ZZVH=*c[Dm2 ϗC]?2bB6yltЉY?xi <0@65NCW'ahh2t)J߽kKodߐ͉.}jF9m˚ds"lVp@|^pJwȾfɉl(j~˹yaXr[($"C-֩qbiq^mXް` |jkGWZ涴4sK}ZZ ,|8QKqZzsC2r;jB@Ͽvfp vњ$-K`\/*_=^ۮ zLO4`a+A;*;*:X@/3r2$R !8#flmj(u*a8nbуLW3 F)Ua$]N` L*Bopܥ\AgiՄTq9zGqBƒ2/}7 @JoP{[^BV,;f To1ؗy !5enԗ_B1rzi2)-jVNP1nzTy&lXuBKjy`4X-3󦾞 LL'dgTUD62'#rPuRP#YRl@RT;a:m=Gn ܁d̵Y@ \f|gF9fCaVI&(c49R;¬LgNA ,s ;IFl~j01Kapj[[9KE+ctvBz4e 9d9l L/.®t2xRM^Bnޭov;H1×ϫp+TŶUk.+r0hU0cƿnA6fIz],XjO4#VVԢ8TV\YY[;ONOVƦȡxta̵CXUvHBF3UB!ՙlPةgㄸ2HgWXEټt~]2ُU@"}uقyO{`u'*.N&>Ʃ7 {ݮ̐rL**2)%h9p|El `8kxEdw8yg4|惽eՕNqx*BJ>c} &'FíޝG :V!\L:ZNRk~ⶠmͺlˊpwV2vT\$d 1AxZ5WJG}H q_#ON+. qB_R˪(zl0厞Ԯw\j~mHS&EI3YƎ?{X׿m;9=:k6' L$E#.?' <^ǒS-Imk56ˢl*(ƚF2.I<0?pEF'&s~IXUPd7ZCvj >uR|E;ڸv6b!DeXPxWto=Ĉ,!zBNxZ ܵIo%Q Xr L9c'漊*GgOMdpW.jTh[Va:.D;3'=wWts\Q"ҲepR{D19!,b<3lցF(#z|TB@ƽ#J{N0*gϺN~m0MFخp) -VZ8$]M;Dɻ6|^y zLEnX/zI9Oh_~(CcZ}Dc]]SNmԅsgNe&[f%ZqɆ=c wGMfo*/uyN~3O= qt (Nn\v8ppwD d;YV>2wTp"B_lTnCjݙqHALHbmf C (*]pUYgwd6֕;ˎJl{}Nk#fp XX}E' JBThja:q͆:{Uƅm}=U8(2ádդ-zgrT=Wޞ|_O觺o[{ݦZJ`O8ކ`ӌRlWy(`Z Nkes`"RsWbDH5W'>ZO䡹 urP)DRLDD1Ky^Vzsg#q-X "l'] ҫnW!9n٨ضMW&i,Rl+ u쨳 vJB%6SkH$grEg8\7ɣQ$82 RcՙY7֠g{ an", sv(,Ah^fga͓gfV^2 L2>B}O\絍'OƦϳ. endstream endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <>stream hT?o0w>ō:` 1EB M)CIsHX :~g?| oa{\\p"484t]c!%2/8\?A]';-Kj߫;H_Cap'XOgqD$<RiGq]:}k1P+@] %˱_mHt&srJEbыWZEX k2D|I ~HZ[6tq!s9Jo9!.JaX`K!-Ij Wኒ& %g.X H|[?9jUlbpxCI~Ս endstream endobj 96 0 obj <> endobj 97 0 obj <>stream hTQn0 StL^"ӮZdgߗ,N#}桱O tm=3$v0z In._aTޫ;E?6㓈Źo.Nóv/zD\ǝ! dm<8;mk#Tk@E8wK{J0FH8||Li佺~=c*KHm0\Hٞy{"1 SSEHbgEDɸK*<6eq$΁xOi r#qzj endstream endobj 98 0 obj <>stream hތXyX1f&* V;V}Zm(hWD EAV"$_lŅ%)0kRjm ~~7gyswhvXp#f.7P~//iړQNwuot}NxFӓ ۲5:*(eAX`PD{aQ.ۂ"\"7n t к 9e^htTo(rCijFS(jMM(;LA?H;FS㘷9|j1WmRIP,Emh.Spw݇v߫D{ &ufiwq{9CWmNNN_~Ug9_v5'Cm0 SK\JIIY6]9oii3se:VI7`_p5jm\$c4$@/ܮJPNxJNbmb&T&vâM;-O(a>pVKY ^ (}iy;wt1RɆJ0_]}*G-9@Emq{Gsmӽf{/W' 6VA&6T(P| UПa Kh4Gr5beuƐu[}}8}Cʅ[<ɣyon-6xj:5+瑼8no`."楽Q]u8002ŝ0fs9_s%05LqpT9]#5LZ{{=CHq2$D5ڠ@ MpS[{_.4r ouÉpl}fxa pdP粏 N[`47[,!*-KT' #6%_}FE{f8ek ])»)c3a̰]hQ]q+?uҁW Ϥucnzi&C)_f2$s .w& `8 bwX5{ !kkXM&dZ%9ew>&J pH' x<UfFpa9H&y`|Qb6N KSKB .7cWڧp? cto!٥<gf?BBp!JI('%nk$ȓJ4}( C~0$(8_/z{@ |y_7e_=BM|1# 1z']{lo`R(Zi_$v`OuV<7ʁ'Cէ -vLݔy`8r9 M#H?BT0h=l%}m`%&-` 6!0G`-P&]!ҔU+`)oYPget --PYݦ7ԵOȟfzNePw)ќ*Kؒ_"БUE'Ih _ij2:Šι :nQӠ@m|?M%߸9`&W:Eg0FW>i[v_g=T^a?[7 +Ly5Ǚxz8kTW_"lFǀ7'&V)0Ȧ>Þ)J {>Il~QAa~*%e]=G*oU" zH+N;zj@1 71 U&և"3>@+>dkVcA7#aYP(D;6>`;8^nFj#RN96$&_W 9Bt\weqw'L`a"0n7Љkb@#zBn1[*UeyGxaM$ү1dHFΠBoD9`%n׳#CƖoh: SX)N\O4hn/"M& `OlUG!,PR0l:a8ʸ|hŜkRR :uD@voFN[fxQbXnS:n!^3_:4yє s|/22 9{gd ÍGѥ;wМkќY+%Z!p~;nj:w**O!h~ZQ6gIP`̟|MxX V˅*KKrH.U@_c_LmU<$mv[#|ܗ|7GQ/ \WfMcճ~+wA}٧ '>uǮ\.6&-t͢)?w,rd۴;g2tu%BD!$$א)x"n7UE~GphوQO@}'-@\c7 2 ǒxcʍY%ϋ$v^HK.L}ړ%3 Kxʹ;5Z1q/2vɯj$z NDo`4jw*9Ra=J;~fϯ$*W՟@' eyj׶ۀb-x4o-.W>۩/VO_iH|$EfcQra41$*a4׆mb{Ue͕kաӅ8)@v&}DSb !-vsELVWmb]nGrƇ],?M9t 2-oij'r3Oэ&a* }vU8kl]BN}iyG5b˿%w'2b# c4h3d ¢QkkCfwLi)b}Vue䁍a>R>8v\ k- dL-Ew:zӫ6&'aQoӯ}o2 endstream endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <>stream hTMo 9nM&흅ђT$} 0mڇ蛛d (:pA(-}g9 ԛm^plM?焾yqWi3|zЭ~f 6¾l}'VHt a :׀F?#,9$eǚcկ>y{QqLܻd-#!y@A"yl[ruη%:Voa' 0 U endstream endobj 102 0 obj <> endobj 103 0 obj <>stream hތX XN 8.3[VVq-(*Ⱦ@XɄ%5,Xw뭭vQ\Zm]j'^'g=yO<{;wX<}҉ <<ޟjda4ȳ?xAxhDO:-|4l0Yo@0-c|,  2fє1Kâe<7ȁ7ϛlϛ.ͱ'x|K~ID.e+|%rxsyYK|~P;/&PA ۰9 {*] s? qÁ zءv`pC܇\:{f(*IÎ #5aݨQg /D?v~fU7[[}"" F*?OM2جs6i) D^YZ)Q>8[j,=7BC~x h REeDA!2 mB#Q!pVՐuy<38 p'ueͼ(R)heh+1~+9Re(46H(Y8+`<8$e6s-fil AALPj%;BsBI'q"UI: 刷\Ln \#5.aD*};A󥺎2n5\'g3LTR푥bD? Cy 7LqJV\P뛟;/6n5H\䷳Sl[&F& )]/*xkh]4$dkcdڦ&a?NZPDk0=Aäqelf #i},@v~<"+rF?\) ]߁q߮^.qE?3'\-2gLmh*))'hbᄴ"rn~i(! ehjƦ(&Ye:"4P!L9t `b)9ھsGqא?g̭dZo*(Iͧj:IfEVx\}͎;?f!+[xNө_!hZjT-+jj_UDDRZ2S!5ߎ~}ղ?):I DMA*VO{Èݿuƥj`dᩉZN7Qxn-UR붫= Ǣ24D}%A OmfuQxh_VB%TӨRȚ+rP{*Ng7whg/-8Vo d1-~X0; xɯc͎ǿeE?߼M(Oȣ322TqDT֠ol?1!oJ ߀03כ1h,:-j|8 8lr Ѳ@%Ԣ5Py aP]JXu Vc@&:2;ZJSwTf!ajftk?S=WmOWqsu4 pʃk$O,]>p: {^s=lf|K|{/vY5;Kųs@}p4$w&:7/O'j Ry|hpB`:.B$$7K,v{;sBoNkzR}& *\֨32rR +gQVr:c*/GȽmEm6 "?rhEmB4 A#Чh 8Q0LLJ|B%7x&SӁjz){{_r~7 JUjCȰ/FBQd*%c9OW.X[B9{5L1%ےU4 6 }%D#1f+ܵ²ފ8P* ` W?A\qL.%&y%HR4v^TIbI (,%A3uTl `D8f (&9UƄwӝ|ɩ3 ?:ϞTJd'4-MJ3*,,NU]hb06 FHugD lG[#"DaFXX,?P1^SA$h!eZv0Uޯ|)nbmWꊨI-)iZm.Ub &Fc9 56<ޥ ꓄)6ZĬ; ]Hh55LSc$L!<CI֐Ns9=rNxz:>[TS E"d$*ƀe>$6" Z;3Nm6ь'A,+ yXw.%>5 X &rQ؞59;#6m=SF敿}˾zyݗN-Z̙kJ_76Z[mW00F>*oY8_lvcxj*LRMbN\"e䪞fK) |f1L0FjEE#Y_^8MW^L9AW|\^Rl"Yf*#S_v[^Ʒ')r"%v)?lZ ue J5udcq.vk^Vh@=WcBn-&C{˪a/|9Y7]j ץԀ`J?YiD.x."I@.c/_{Tz=OsorR-.64O.!U62tU C2Tޔ3#B$ihԧN`GlyΝ\BmLY_ɴҜy(x_jl8wB ƙ=FS{&;Cu itjnP)r&:JB^ni*OPa-Ms>BZ]2jb9' 1wXz@qZX_5LK0-\v?{>irMRQ.e.Фoa}v@=|[F>+rSrT4aJ^A|i(Wdnҽ{6 H`_XHWDgN?w&.r]qV ߘW,)`71xU> 򒀝p#- G&q1ġ;ҲbϣW)֞ů9y3obǬ]^m2UUq[05sl͙> #Ɵ/O^VwM/"aI Zd&>F6Wf S}z 7'vC-"aK:jL4Izrj.>G}w{=+_mC+jwss}OK -Ʒkh cF#m ucz+zLJn)%"I[C{K])ž(_o3`B}S;}<8TEo8J73eC.%f~/Ǟ@-©)qwP$e؁/B>hv .]>:u-#zrx I1ZK+ϑrA57}ihd͎oQ!LWSƍX}$޳{JZr-5֭ASV]RE=JxB.,׶Sm&5wӑS4Ѥ2Oͺ9`irearƾ 4+Sd'̱޹ٱg352dߩ˵S7NIsTӨhg6S+y 5ly~:0G M%5b BܮKVV3ۋhL#8[@`旳vռUF1q4aqQjn֢B Yx0i\\VQ©dNnFTSpT󋗌}iϢN,7GܝShkokKs8՚ي妉+8MۚS^z6JR0xG:uSO;XX+쥇G!hpSbh0<;H}Kĭ QjL#k__& Dυ)ZCTZk Jڸ iD|\ώmȢޖY`O=qA'vD3߳qmm\u-BP0FɊ'JUCqӗqX_/evP*ng: n'N5*fm8ȟQ'P Bk4: W(>FL?LrhhjjSi4:D QmFjomvm&gU~YnϵDde&W7JhhsY>*XIŢ0USV?Bj_ 7h9b"v2e;˩54FiS(-V$ȿO O\QPSᡑ J2%8.IɈx-WE e E<]>ej+/%rwb!fYo*Wӆ !"Cq"ʸd[i goV _ endstream endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <>stream hTn0E|,SuaC$Ģ*eчJڽTeȂMRua\?t<~G] moix`[H30U24pe*N_`󼿗w ޼A6@}q3H*0&ܫyqYX)^_:V+2iQ%Ի-qL$%i 64A M-;[vh!Ma`"x"ΛH'eȏ-3} _Rz_txx$ ޑ endstream endobj 107 0 obj <> endobj 108 0 obj <>stream hޤXyXN3FEj\24>\zU`@q_(BedK!uf$*KH@@(*nUb[ںUZjmzI_@k>}?<3B%k֬] >3O!7vǚ䏌߶c | VW  xzD*cBBw'&Ƈ&D4fwtޭ@*L  Bg$ %2y>[~3q-C=d%1QZJ ,:[\{Ԟ"gT`Q::s:0c FTɚ%l82[M"3?~h1O{E\<\"iMwF^gtz &R/['A E3?\<ȕMꖽ)e1Z0zYg'-7,_F#'E",;[!ΊoV<<[#ѿ!x[brE^.?4ljgX!McS*:!pQ)d4Bv$:?R+C.:X G#~E|T4 Zr[\:2Si7Cq-ii>VZ'ߋb,Ū(i71j*QM_n'|>4܋.د%7+9.cH;?{vwF+l kDp}W|>VVH5QfX 2Z7JIGp2>ypkÊߒ~S,CK >k>󖺣$nJbAw`p5lf74a={KaOL@dWI̼M2t4i80 0l8`ŗ@AhڂR7[tَ}D޾VhX*ZN[Ww}br,ppy{~i#rKգȍA^FL 8?36ظ_h+{B>~ yðZܜDSd ~c1Yxa &SCپH R%b>T`=ggi)@*rf>lVz _EZ>gGlÁj6˒n^%JR^vOOs#NTO{[eJ $m`a^70MZ i5:~ۃ1l I~IeFAS)t6URuE^t44\ Pw_Aa,6Vceeg Nچr(A#O4†BHfYo; `)BX= _B/`I[PIR0*f2]K3_Q%GE"k5<0xDGcpI7Grm^;=A V i Ś'zaG{i̕y|G1׾B-별 * EK/Y6`'"B뽜׻భ^okEWdIac 47顰:`ҋHo:fh$hFڰeþm01ѐ]HM$|lwOO7S@;oqK*B =H"ӘCr|zn=j9xG*${ڱx:~+1iLFxxc5ɻI6O„ёDEj.Yh*\6s;>F!w_dJr4 C(mr4zd=$=nAypz>,q/Z⑀Ʈu#yZFi#\P G߃]|$ܟWzfP!|,84%Va|hFrQrN J[\'= PC _8pA8ĀZtY>6VIߺFͣb>OhlKfDDH YVUK@u|,&ܒ`O) !{r*KxC~$B<6ak˷l:!$`^kk:K% X5$n?AaPaGs i ^K8|\Tomqˊsʋ9R)Y 蝃)~֙X,8ɭp#8'B;̾{B %"5qdIK]n@ѱdLQ4&`e ] ܷM!ppsX:[TEA|=R)t;X g{KV&*]QPj'xA=leAc}XCɨx> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <>stream  FBNNPL+CMR7' [LNV 7;Computer Modern fonts were designed by Donald E. KnuthCMR7"A{| SBUFxx{{rz_1gՇ_o&oUpgˍֈwHw?naCy ڛ 8J_ %o endstream endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <>stream hTP=0 +<" z屇-b-}Wd ;]cƒaᎭ%`s7e)2U8( !<]eKg6ȖZX\['vH2(K0;*RLv=zYȊZbdg{k3bqwF+6mw-%B 0h` endstream endobj 116 0 obj <>stream FBNOAL+CMMI10-J  kLNQ -26DJtrianglerightComputer Modern fonts were designed by Donald E. KnuthCMMI10.HI g\yuww}L}w["u?aCy 3:33O endstream endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <>stream 8;Z]_9+&HW$q4%f^VRCM[`2*r:)#u#pCrUXKGYsI!!!".8br7X;I-RfSa'4`*;jMp fr)3HeSFhp3n9 endstream endobj 121 0 obj <>stream 8;Z]]d0dZ3#_h6orrmhA5q=95/1Y=bs1;G$69M+N!!)f%<8D1YcQ@#&f0Nf"g+/,NG[F@j]qh2"]h>p9Br, /n^pcd7 endstream endobj 122 0 obj <>stream 8;Z]!5n\\j$j6D,&,&(k"GK\kZr7+6#>^bLQ3+'!63na1NHeVu16f8^;Wb`[W?`"D-65B_]T*.=0g,5qHZD#eB f=`jlPksOb]sfn-id1_igX/63GOORU>_Q6`(J7h?;`?/95[3Jt(QR6?;qL!9r(Nn) pWnP6a?DpOd*$&K^'XY_/oe<3h+B5!%O"&F)ZWD4?/Y~> endstream endobj 123 0 obj <>stream 8;Z][_$L)b&-G2pDpWZT*;U71'bl@ipTc'$&\(s\\bU'fnq)tTpmko2g%) endstream endobj 124 0 obj <>stream 8;Z]!>7Q?0$q.`-%kBn\,36o<1?j6T2!'h>E9"/igC&MF;CU&R: n-I/mDpShP>=!P9G6kjT"eNeNI9d9hV46u)%TEsAgYns;p-S;b%9j#SGLMMXe`gYq 477@1fI5@SO<[7bC3OqnjCkjP's1>M4gNVPjINK#T%q$uBm*"Zs+[[`s#0+@?[BL2 B><3n0TD8_/fmXa(!XD)OhasFF?6%S5NgV`DCk"1BA-QaDbVDe,6\&hitqc=#7(>~> endstream endobj 125 0 obj <>stream 8;Z]]9+&HW$jFH%s+7dV.J+hg95l&?c7D@O6[Y=/X=S\`LMIO9Sc9=L@SJV'%b[YC oCI:@eXPfO'jI`i\dp@`2/C$hgi9P,z!$AZZ!0d`Mmf~> endstream endobj 126 0 obj <>stream 8;Z]">n2B-%"id($Z[6sLb]$baMJ/RHgh9(;@3nV%KHJ/!)89jTAIJQ.$kip-`qmA@K &JII2E9*Ym=Ij4-]H/tE~> endstream endobj 127 0 obj <>stream 8;Z]"!=j`9#Xs+?$hcV;`]74OeH$DZ]OZqC6N79IY1=ji,#dFAQ0#LG4^,UaGnc8s I`S?rD3Yk$6TMh)q;9iT]u&QbIul#O=XYh:&QO#hD, 7MCSkkGrJBR8Q5G&PVYs!4"kqpuO7L$:DaHi(O9X#BmSX]sk[E`(65k7k_>W#KOCi krjC'MZBY5AJT\N:oWL-j"k:iX@j6u(F7Vi.0m8;=g.lWGF[XrFWPt3m+SCZa`j*; ,4QiUVn@jumK8aRr2Jd&g/?NgBR#TI$;-I,!IP(OY[C92~> endstream endobj 128 0 obj <>stream 8;Z]_>7/.g$q/Lrrs#g#g3sa3=JllUi&unq8=0rC!l0tp[*n)Am@@feb/M'9S]nF] $b+c2[.MltQO5U""=rQ&g>`AO$N&EmW'7pUPH71JoYUO8\j2;Vz!!#d7!;ZP6[f~> endstream endobj 129 0 obj <>stream 8;Z]LJH,ZM!5fq/_Wb=a!*'%"z!:ZEW!rsh\Y[m~> endstream endobj 130 0 obj <>stream 8;Z]!;%eL($q0jh(X.$U6&K&ILnT?@hhUDTAi@7u&Kuf=6HCGQgp3K?CMg`-=_gT* 7;?eE6[X\3iuh25nVoji(StL;'d.k9Ias?U5Op<7/fAH$r_1fg)$CZ'eEW`Q(#ZfQ CVPbi_k`p.0"O%:=U)iE,X5H6^El-keCrJQ2lZ1i3YmQ*@H@+ FIZ*A*,h[dgg@p@3L"Q>cf[&EFd"EEq%>H:o51>"G"[(`>H'LF$K=P@l,DO:9#sW; "p!?+UL4~> endstream endobj 131 0 obj <>stream 8;Z]"@1If1#_ftl"hd[33Q4D*76nleUU<#FnGl'63f[^q)2ZWTDt:EVBDY,\d&!q)GA*,95D=-iO:E*_&u8R[Y>3.PK=`6-0o~> endstream endobj 132 0 obj <>stream 8;Z]"%17V.%#&p*$gp'D'SU?LU>&W@&K+RCp=%KXK-5\t-lr,Ja#*"@g8VrC"M?Vb Kbu[*.JFb3\h*$NLY+8lhe;+iBaKT-g(ZT7Qb.:NB&7n2f:!S'o6eI48kM:Ik%Yq& >M#BlPO^&X0!lTBE32L endstream endobj 133 0 obj <>stream 8;Z]!=Uos)$jF?E"hBX_>Y9^%MLCb35)]jmdfh!"a)NXd:$X*Gg^qbTBN5]sq&oJO P=uc,>,%U?3*=':"^[+qc>7Kn2)7^<3Hi:0[WO2+CPS,OLQX]- QVbkSKmHqq4.,0&Vi+aI+EXR:3U1rjU+ c^>"<"qHG]~> endstream endobj 134 0 obj <>stream 8;Z]"JI9:;$q1'o+7sb8#4;%>`C,^=\47Dg?/o42[$WWm,U=hPNuIhdA.pqSCFBi2 *Z-FT?)lPMX6>[B53p1JMqAI1U[X(O9r43B[/_hVCr(akO=MaIJ1&igC6$R(%p7HY 0@i!3DKf;4ek@bl)A9dP_k9Q6,nj1)%r8R*f+ktjpj!:c_Kbn?E`Jf2(8>13rom#n '%T5IkP9J`iN9"n[eYnC@i_<,ZS-.LIp,lsK.$'_:?X/r=?kRL\qY/9]b0F@RdALm YeIO$=K.0d-%u1+Y5nVJjn1q~> endstream endobj 135 0 obj <>stream 8;Z]_;$qgr&4KIj^Ho=B)44Hnb0)NLk9E;aShjm5"'Ct4iGjZ,M0$p&l2pM`=f9Bl R[A<+Br;8o/LgR!WcMj-:R\!`5+G9V=#+BVW4H5pQ_89'Gg1["pHMKQQYK2^d?aXV h?RgY>]iXJO8CsR*P!f#gO&a1p?>P1!WW3#!!$];%02(52J<~> endstream endobj 136 0 obj <>stream 8;Z]a5n8Pj$jG#7s+7qE#nTH97&?Rlr`b=;MeTo%TZdB9!-!jP_WC\4Wtd>uf4'_) )bK?4^Q6qQe^@'QiZ_bnIuA@Y@*ckB1'V;%80P]`3W1%3*BZa`cV `2KUV<'IX;,DNupN)8niK2o)JL3g;;>rH"(\UA@2c<'c?7NHI%HFNHh-FBjeO(X5W .92B!`A#[bCYffAlAblFC/2iL~> endstream endobj 137 0 obj <>stream 8;Z]^>7,mG#XD8]^Ho>-"@F9+@M()3cVMo@q&365PDKE4QhBu8r/\H-di'FEm49&H UC]"?#\k> endstream endobj 138 0 obj <>stream 8;Z]!;%A4$&4G^\(Z[V7kUOOUYYZbEh?P6fa^fQ0SHAilJ0^/1 +FN$]'p%Qqd9#CdelKe#(>h&-rhI/0.;O4B7J endstream endobj 139 0 obj <>stream 8;Z]LJH,ZM!5fq/_Wb=a!*'%"z!:ZEW!rsh\Y[m~> endstream endobj 140 0 obj <>stream 8;Z]"CCZ"?%#!gC([Q:q+MlU6%;6Qhm!OXer%Uke%F`R`:($d`5B0aba $(5DO&<5ps/04Gpkt=-^?gW-<@8)OGWF=)BlRQiqeL(7Q[8EtjBhF?E2]d_!ZNU*! d1()53B;G(e/I endstream endobj 141 0 obj <>stream 8;Z]]9+$2'$jFH's+7eATHZuQpc",!^@:M))$ ]hutllJ#[6ojZqP8qr5+qs5n`ahAjpO*YWnJO(AB:D*g2!!!!IC)?pVrRT?~> endstream endobj 142 0 obj <>stream 8;Z]"CC\9*#_]bg"hDojCMU.X6tKr;Hp@I$-8S3C,!(bE30(lX!66N0`j>dQ_cj!I kXBlS0iU:MD5;98%-2]1@?C8*ecI8a?$qCiWtm9<$.94.,gUT711@[n)\pVgdWm6LnZr(J^AI4H#QY"6)VqEa9j Zl[^_G0&%LX26pC2LG]/U79g#~> endstream endobj 143 0 obj <>stream 8;Z]">7Q?0$q/eK#.pFA1`EFedUJVRm*Q=h>%\'/6'NY:b`j=ED]B5N`/dd@n=pr" >!e(%n7sKnX**UeM-a1dAU3B-~> endstream endobj 144 0 obj <>stream 8;Z]\YmnJk$j8ih?guYR9nX]Y.KhBlA@ZaN[M,=0ep;bH-V6O(`l7NBgTdV'rjeJ5 Q1SUcc$!u'iF`,j!!!"`nI,DVCaIL~> endstream endobj 145 0 obj <>stream 8;Z]LJH,ZM!5fq/_Wb=a!*'%"z!:ZEW!rsh\Y[m~> endstream endobj 146 0 obj <>stream 8;Z]!$OVD,&4H9l(\BaW)4L?R<&TI)La]93Ai;4'!!!"lNk>jtI%s##cHUF$%6>FC fTi&`GNWCjnjpI4PfhSt_`Zt-7#+D_OZ1pKFSI`)[5(f7ZK6Hk!e8X5Ai7XfT2nD? =-4Spkuko*qW94jI>[<^Fk`:/h%qUfb6,!,RncCS9=`8U^pY=#64aS7H%;J ?q64X!6uafmf~> endstream endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <>stream application/pdf guide Paul C. Anagnostopoulos 101 2008-04-12 11:19:18 2010-05-23T11:09:49-04:00 DVIPSONE 2.3.2.124 http://www.YandY.com 2010-05-23T11:09:49-04:00 Acrobat Distiller 9.0.0 (Windows) uuid:023acbeb-3884-483f-9387-2144ed837577 uuid:aab93d86-9727-4a59-96b9-5e8c6da6c703 endstream endobj 155 0 obj <> endobj xref 0 156 0000000000 65535 f 0000012644 00000 n 0000012786 00000 n 0000012890 00000 n 0000014056 00000 n 0000014198 00000 n 0000014304 00000 n 0000015374 00000 n 0000015516 00000 n 0000015633 00000 n 0000016091 00000 n 0000016236 00000 n 0000016364 00000 n 0000018227 00000 n 0000018372 00000 n 0000018479 00000 n 0000019100 00000 n 0000019245 00000 n 0000019385 00000 n 0000020423 00000 n 0000020568 00000 n 0000020697 00000 n 0000022612 00000 n 0000022757 00000 n 0000022875 00000 n 0000023701 00000 n 0000023846 00000 n 0000023881 00000 n 0000023957 00000 n 0000024102 00000 n 0000024209 00000 n 0000025251 00000 n 0000025396 00000 n 0000025536 00000 n 0000027195 00000 n 0000027340 00000 n 0000027480 00000 n 0000029124 00000 n 0000029269 00000 n 0000029409 00000 n 0000031136 00000 n 0000031281 00000 n 0000031421 00000 n 0000033363 00000 n 0000033508 00000 n 0000033647 00000 n 0000034608 00000 n 0000034753 00000 n 0000034882 00000 n 0000035972 00000 n 0000036117 00000 n 0000036257 00000 n 0000037098 00000 n 0000037243 00000 n 0000037361 00000 n 0000038270 00000 n 0000038415 00000 n 0000038450 00000 n 0000038526 00000 n 0000038671 00000 n 0000038790 00000 n 0000039890 00000 n 0000040035 00000 n 0000040142 00000 n 0000040793 00000 n 0000040938 00000 n 0000041056 00000 n 0000042668 00000 n 0000042813 00000 n 0000042953 00000 n 0000045378 00000 n 0000045523 00000 n 0000045641 00000 n 0000046131 00000 n 0000046276 00000 n 0000046311 00000 n 0000046387 00000 n 0000046532 00000 n 0000046672 00000 n 0000047903 00000 n 0000047951 00000 n 0000048465 00000 n 0000056444 00000 n 0000057109 00000 n 0000057394 00000 n 0000058134 00000 n 0000058208 00000 n 0000058618 00000 n 0000059007 00000 n 0000059338 00000 n 0000059563 00000 n 0000059968 00000 n 0000064619 00000 n 0000065159 00000 n 0000065903 00000 n 0000066119 00000 n 0000066528 00000 n 0000066738 00000 n 0000067117 00000 n 0000071086 00000 n 0000071427 00000 n 0000071897 00000 n 0000072240 00000 n 0000072396 00000 n 0000078449 00000 n 0000078951 00000 n 0000079317 00000 n 0000079683 00000 n 0000080019 00000 n 0000083675 00000 n 0000083984 00000 n 0000084565 00000 n 0000084783 00000 n 0000085169 00000 n 0000085223 00000 n 0000085385 00000 n 0000085669 00000 n 0000086019 00000 n 0000086163 00000 n 0000086400 00000 n 0000086465 00000 n 0000086753 00000 n 0000087066 00000 n 0000087452 00000 n 0000087701 00000 n 0000088108 00000 n 0000088362 00000 n 0000088725 00000 n 0000089179 00000 n 0000089453 00000 n 0000089636 00000 n 0000090053 00000 n 0000090461 00000 n 0000090841 00000 n 0000091260 00000 n 0000091693 00000 n 0000092018 00000 n 0000092386 00000 n 0000092689 00000 n 0000093047 00000 n 0000093230 00000 n 0000093628 00000 n 0000093898 00000 n 0000094332 00000 n 0000094765 00000 n 0000095004 00000 n 0000095187 00000 n 0000095542 00000 n 0000095590 00000 n 0000095616 00000 n 0000095642 00000 n 0000095714 00000 n 0000095845 00000 n 0000095978 00000 n 0000096089 00000 n 0000099796 00000 n trailer <]>> startxref 116 %%EOF ga-5-4/python/docs/pgas_11/image4a_crop.eps0000644000175000017500000136250112662210372016610 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image4a_crop.eps) %%CreationDate: (2011-07-20T14:56:57-07:00) %%BoundingBox: 0 0 438 143 %%HiResBoundingBox: 0 0 437.945 143 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 438 143 userdict begin DisplayImage 0 0 437.945 142.982 12 438 143 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDCDCE8E8E8FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF969696 DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 B5B5B5B4B4B4CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5B4B4B4B4B4B4CFCFCFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD1D1D1B4B4B4B4B4B4F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CFCFCFB4B4B4B5B5B5F4F4F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF292929616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1C1C1000000DBDBDBFFFFFFFFFFFFFFFFFF FFFFFFC6C6C69292927E7E7EA5A5A5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6AAAAAA7F7F7F919191 D6D6D6FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B0B0000000363636767676FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6AAAAAA 7F7F7F919191D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3A7A7A77F7F7F8E8E8ED3D3D3 FFFFFFFFFFFFFFFFFFDFDFDF3939391B1B1B282828FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF303030 191919393939D9D9D9FFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C383838000000A8A8A8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 292929616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF535353333333FFFFFFFFFFFFFFFFFFF7F7F74D4D4D0202023030304A4A4A 1A1A1AACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939 FFFFFFFFFFFFFFFFFFFFFFFFDDDDDD1818180A0A0A292929080808040404A2A2A2FFFFFFFFFFFF FFFFFF282828767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD1818180A0A0A292929080808040404A2A2A2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDDDDDD161616171717404040151515020202A0A0A0FFFFFFFFFFFFFFFFFF FFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFF FFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292929616161FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3080808 8B8B8BFFFFFFFFFFFFFFFFFF686868121212C9C9C9FFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB5B5B5090909686868343434393939FFFFFFFFFFFFFFFFFFFFFFFF D1D1D1898989F4F4F4FFFFFFE1E1E1151515141414FFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFD1D1D1898989F4F4F4FFFFFFE1E1E1151515141414FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5 9D9D9DFBFBFBFFFFFFF1F1F1202020202020FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFB5B5B5090909686868343434 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3C3C3C3FAFAFAB0B0B0888888BFBFBFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC3C3C38A8A8AA7A7A7F6F6F6292929616161FFFFFFFFFFFFFFFFFFC6C6C68B8B8B858585 AEAEAEFCFCFCFFFFFFFFFFFFF4F4F49D9D9DF4F4F4B5B5B5808080D9D9D9FFFFFFC3C3C3C3C3C3 EBEBEB8989899B9B9BFFFFFFECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFC0C0C0B1B1B1 FFFFFFFFFFFFFFFFFFFFFFFFC7C7C7B2B2B2FFFFFFAEAEAE000000DCDCDCFFFFFFFFFFFFE9E9E9 0606068C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5C5C5C000000EDEDEDFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 585858343434FBFBFBA5A5A5858585BABABAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFECECECA2A2A2808080959595DCDCDCFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFF FFFFFFFFFFFFFFFFFFF7F7F7FFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5C5C5C000000EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5757570A0A0AFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF585858343434FBFBFBA5A5A5858585BABABAFEFEFEFFFFFFFFFFFFFFFFFF 2D2D2D737373FFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFAFAFA000000 A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D1 0B0B0B2A2A2A505050242424060606C0C0C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F89D9D9D 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9E9E9EFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 4444443E3E3E181818272727000000878787FFFFFFFFFFFFFFFFFF7777770000002A2A2A151515 303030191919616161FFFFFFFFFFFF5C5C5C0B0B0B454545484848050505474747FFFFFFFFFFFF D8D8D80000006C6C6C0505051A1A1A8B8B8BFFFFFF585858474747252525171717141414D1D1D1 0B0B0B2A2A2A505050242424060606C0C0C0FFFFFF7F7F7F030303E7E7E7FFFFFFFFFFFFFFFFFF 242424585858FFFFFF787878030303FCFCFCFFFFFFFFFFFFAAAAAA000000E1E1E1FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4A4A0A0A0AFCFCFC FFFFFFFFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858242424343434232323 2B2B2B000000636363FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C89B9B9B9B9B9B9B9B9B 9B9B9B9B9B9B9B9B9BCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D10B0B0B2A2A2A505050 242424060606C0C0C0FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFBCBCBC000000 9B9B9BFFFFFFFFFFFF3D3D3D1B1B1BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4A4A 0A0A0AFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBCBCBC0000009B9B9BFFFFFFFFFFFF BCBCBC0000009B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F21C1C1C454545FFFFFFFFFFFF FFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DEDEDE2424241212123F3F3F151515292929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F8F89D9D9D 9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9E9E9EFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 2424243434342323232B2B2B000000636363FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3D3D3D1B1B1BFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA 262626535353FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7282828262626262626262626262626 2626262A2A2AEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858000000727272FCFCFCFEFEFE 5252520D0D0DFBFBFBFFFFFFD4D4D4010101808080FFFFFFFCFCFC6E6E6E000000606060FFFFFF FFFFFFB5B5B5F1F1F1FFFFFFFFFFFFA1A1A1000000D3D3D3FFFFFFD8D8D8000000101010D1D1D1 FFFFFFFBFBFBFFFFFF585858000000656565FDFDFDFBFBFBE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA 262626535353FFFFFFDDDDDD010101909090FFFFFFFFFFFFCCCCCC000000B4B4B4FFFFFF4C4C4C 1C1C1CFFFFFFFFFFFFFFFFFF8282820202027C7C7C2929290C0C0C2A2A2A818181FBFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E50707075C5C5CFFFFFFFFFFFFFFFFFFFFFFFF101010 747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580000007A7A7AFEFEFEFFFFFF7C7C7C000000CBCBCB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C262626262626262626262626262626262626868686 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626535353FFFFFF FFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFC4C4C40F0F0FA6A6A6FFFFFFFFFFFF4C4C4C 2C2C2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E50707075C5C5CFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC4C4C40F0F0FA6A6A6FFFFFFFFFFFFC4C4C40F0F0FA6A6A6FFFFFF FFFFFFD9D9D99393937D7D7D2424243A3A3ADFDFDFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5050501B1B1BEAEAEAFFFFFF F7F7F78E8E8EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7282828262626262626262626262626 2626262A2A2AEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580000007A7A7AFEFEFEFFFFFF 7C7C7C000000CBCBCBFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C4C4C2C2C2C FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5858582C2C2CFFFFFFFFFFFFFFFFFFA4A4A4000000E3E3E3FFFFFF 838383060606F2F2F2FFFFFFFFFFFFFFFFFF232323606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD8D8D8000000B5B5B5FFFFFFD8D8D8000000979797FFFFFFFFFFFFFFFFFFFFFFFF585858 1E1E1EF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFF 3E3E3E353535FFFFFFFFFFFF757575151515FBFBFBFFFFFF393939383838FFFFFFFFFFFFFFFFFF 747474000000525252ABABABBDBDBD767676000000878787FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5353530D0D0DE2E2E2FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5858582C2C2CFFFFFFFFFFFFFFFFFFEBEBEB000000828282FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFFADADAD000000F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5353530D0D0DE2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B4B43A3A3A2A2A2A 080808363636B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5858582C2C2CFFFFFFFFFFFFFFFFFFEBEBEB000000828282FFFFFF FFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA 000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC2C2C25B5B5B3434342222220C0C0C323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 585858343434FFFFFFFFFFFFFFFFFFB4B4B4000000D7D7D7FFFFFF6565651F1F1FFFFFFFFFFFFF FFFFFFFFFFFF292929616161FFFFFFFFFFFFF1F1F18888884141412828281C1C1C000000B2B2B2 FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFF FFFFFFC2C2C25B5B5B3434342222220C0C0C323232FFFFFFFFFFFF9D9D9D000000D9D9D9FEFEFE 1F1F1F6D6D6DFFFFFFFFFFFF303030444444FFFFFFFFFFFFFFFFFF797979010101FBFBFBFFFFFF FFFFFFFFFFFF393939313131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858585020202ADADADFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFFFFFFFFFFFFF0F0F0F696969FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C25B5B5B 3434342222220C0C0C323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858585020202 ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E73E3E3E040404D2D2D2 FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DADADA0000009C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 585858343434FFFFFFFFFFFFFFFFFFFFFFFF0F0F0F696969FFFFFFFFFFFF2D2D2D737373FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2 D2D2D24C4C4C323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606040404040404040404 040404040404070707ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF FFFFFFB4B4B4000000D8D8D8FFFFFF676767181818FFFFFFFFFFFFFFFFFFFFFFFF292929616161 FFFFFFFFFFFF3B3B3B252525A9A9A9CDCDCDB5B5B5000000B2B2B2FFFFFFD8D8D8000000B4B4B4 FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2 D2D2D24C4C4C323232FFFFFFFFFFFFF2F2F20A0A0A7F7F7FC6C6C6000000C9C9C9FFFFFFFFFFFF 3E3E3E292929FFFFFFFFFFFFFFFFFF8D8D8D000000E9E9E9FFFFFFFFFFFFFFFFFF595959212121 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9F9F9F010101929292FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F1F1F4B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF080808 787878FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767040404040404040404040404040404040404 727272FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2D2D2D24C4C4C323232 FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9F9F010101929292FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C2000000878787FFFFFFFFFFFFFFFFFF7A7A7A 262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD000000A0A0A0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3E3E3060606040404040404040404 040404040404070707ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF FFFFFFFFFFFF080808787878FFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF616161222222FFFFFFFFFFFFFFFFFF595959323232FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCBFBFBFBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDC1C1C1FEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFB4B4B4000000D8D8D8 FFFFFF8A8A8A000000E0E0E0FFFFFFFFFFFFE9E9E9131313616161FFFFFFE1E1E1000000A2A2A2 FFFFFFFFFFFFD9D9D9000000B2B2B2FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFFFFFFF 585858343434FFFFFFFFFFFFFFFFFF616161222222FFFFFFFFFFFFFFFFFF595959323232FFFFFF FFFFFFFFFFFF5C5C5C2424246E6E6E262626FFFFFFFFFFFFFFFFFF5858580D0D0DFFFFFFFFFFFF FFFFFFBDBDBD000000AAAAAAFFFFFFFFFFFFFFFFFF2A2A2A494949FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACACAC 030303818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD050505656565FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5858581B1B1BEDEDEDFFFFFFFFFFFFCBCBCB000000A0A0A0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFDDDDDDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDE0E0E0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF616161222222FFFFFFFFFFFFFFFFFF595959323232FFFFFFFFFFFFADADAD000000 F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFACACAC030303818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB5B5B50000009C9C9CFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFB060606686868FFFFFFFFFFFFFFFFFFFBFBFBFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCBFBFBFBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDC1C1C1FEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858581B1B1BEDEDEDFFFFFFFFFFFFCBCBCB000000A0A0A0 FFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF777777020202BCBCBCF1F1F1919191040404323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858343434FFFFFFFFFFFFFFFFFFB4B4B4000000D8D8D8FFFFFFE4E4E4040404464646 D4D4D4C3C3C32A2A2A0B0B0B606060FFFFFFF2F2F2040404505050EBEBEBD3D3D3353535000000 B2B2B2FFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF FFFFFF777777020202BCBCBCF1F1F1919191040404323232FFFFFFFFFFFFFFFFFFBCBCBC000000 090909828282FFFFFFFFFFFFFFFFFF888888000000F0F0F0FFFFFFFFFFFFFCFCFC212121252525 C8C8C8DFDFDF717171000000BCBCBCFFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFF0F0F0C9C9C9 C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFC6C6C60606063B3B3BB7B7B7B7B7B7B7B7B7 B7B7B7DCDCDCFFFFFFFFFFFFE6E6E6000000959595FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858040404 2E2E2EBABABACBCBCB313131141414F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777020202 BCBCBCF1F1F1919191040404323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFF C6C6C6141414A9A9A9FFFFFFFFFFFF525252323232FFFFFFFFFFFFC6C6C60606063B3B3BB7B7B7 B7B7B7B7B7B7B7B7B7DCDCDCFFFFFFFFFFFF303030595959FFFFFFFFFFFFC6C6C6141414A9A9A9 FFFFFFFFFFFFC6C6C6141414A9A9A9FFFFFF7D7D7D6E6E6EC5C5C5E2E2E2B8B8B8252525151515 E8E8E8FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6969690707079B9B9BDCDCDCA9A9A9212121FBFBFBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5858580404042E2E2EBABABACBCBCB313131141414F5F5F5FFFFFFFFFFFF2D2D2D737373 FFFFFFFFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFEFFFFFFAAAAAA 0E0E0ED0D0D0FFFFFFFFFFFF525252323232FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC3A3A3A000000 020202414141747474353535FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B383838FFFFFF FFFFFFFFFFFFB8B8B8000000DBDBDBFFFFFFFFFFFFAFAFAF141414000000141414979797575757 636363FFFFFFFFFFFF9B9B9B0B0B0B0000000F0F0F969696111111B5B5B5FFFFFFDBDBDB000000 B7B7B7FFFFFFFFFFFFFFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFFFFFFFECECEC3A3A3A000000 020202414141747474353535FFFFFFFFFFFFFFFFFFFDFDFD212121000000DEDEDEFFFFFFFFFFFF FFFFFFC5C5C5000000B7B7B7FFFFFFFFFFFFFFFFFFD1D1D12C2C2C0000000000001D1D1DAAAAAA FFFFFFFFFFFFFFFFFF919191000000D5D5D5FFFFFF9F9F9F000000000000000000000000000000 010101E5E5E5FFFFFF8F8F8F0000000000000000000000000000000000006D6D6DFFFFFFFFFFFF ADADAD000000D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B5E5E5E6E6E6E030303000000232323 CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC3A3A3A000000020202414141747474 353535FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFBABABA000000999999FFFFFF FFFFFF3A3A3A191919FFFFFFFFFFFF8F8F8F0000000000000000000000000000000000006D6D6D FFFFFFFFFFFF111111555555FFFFFFFFFFFFBABABA000000999999FFFFFFFFFFFFBABABA000000 999999FFFFFFC2C2C23131310000000000000101013C3C3CCDCDCDFFFFFFFFFFFFFFFFFFFFFFFF 7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2595959 0404040000000D0D0D7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5B5B5E5E5E6E6E6E 030303000000232323CBCBCBFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFF9F9F9F 000000000000000000000000000000010101E5E5E5FFFFFF919191000000D5D5D5FFFFFFFFFFFF 3A3A3A191919FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFA FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4FEFEFEFFFFFFFBFBFBFCFCFCFFFFFFFFFFFFFFFFFF F9F9F9E0E0E0FDFDFDFFFFFFF8F8F8FFFFFFFFFFFFFFFFFFF6F6F6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFA FFFFFFFFFFFFFFFFFFFFFFFF3C3C3C3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE191919616161 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444 474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFBFBFBFCFCFCFFFFFFEEEEEEE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFAFFFFFFFFFFFFADADAD 000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3FFFFFFFFFFFFFFFFFFFAFAFAF8F8F8FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C4020202C5C5C5 FFFFFFFFFFFFFFFFFFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFFF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF EFEFEFDCDCDCF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFCFFFFFFEEEEEEE6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFAFAFAF8F8F8FFFFFFFFFFFF FFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7 000000989898FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B7B7B111111FAFAFAFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000B6B6B6D6D6D6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF7F7F7BFBFBF5B5B5B262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D 565656BFBFBFF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C8 0E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D7BBBBBB000000A6A6A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737373070707EEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE8E8E80A0A0ABBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B1B1B10F0F0FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFCDCDCD3131313030306F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF7F7F77E7E7EF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD 303030303030616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767303030303030D7D7D7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF757575303030303030C8C8C8FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE4E4E4E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC6C6C62E2E2E373737373737373737373737373737373737373737 373737373737292929070707363636373737373737373737373737373737373737373737373737 3131310909092E2E2E373737373737373737373737373737373737373737373737363636050505 323232373737373737373737373737373737373737373737373737373737090909242425373737 3737373737373737373737373737373737373737373737370E0E0E1C1C1C373737373737373737 373737373737373737373737373737373737252526060606373737373737373737373737373737 3737373737373737373737372E2E2E060606343435373737373737373737373737373737373737 373737373737353535111111232324373737373737373737373737373737373737373737373737 373737070707252525363636373737373737373737373737373737373737373737373737111111 1B1B1C3737373737373737373737373737373737373737373737373737371F1F1F131414333333 373737373737373737373737373737373737373737373737323232000000FBFBFBFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD8A8A8A2D2D2E373737373737 373737373737373737373737373737373737353535010204292B302E31362E31362E31362E3136 2E31362E31362E31362E31362E31360103061C1E222D30352E31362E31362E31362E31362E3136 2E31362E31362E3136151719121313333333373737373737373737373737373737373737373737 3737372E2E2E07090D25282C2E31362E31362E31362E31362E31362E31362E31362E313626282D 0102052D30342E31362E31362E31362E31362E31362E31362E31362E31362C2F340B0B0B282829 37373737373737373737373737373737373737373737373737373705070B15171B2D30352E3136 2E31362E31362E31362E31362E31362E31362E3136090B0D08090B2D2F342E31362E31362E3136 2E31362E31362E31362E31362E31361E2023161616323232373737373737373737373737373737 373737373737373737323232080B0F2224292E31362E31362E31362E31362E31362E31362E3136 2E31362C2E3303060B24262A2E31362E31362E31362E31362E31362E31362E31362E31362E3136 000000ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D0D0D028292C2E31362E31362E31362E31362E31362E31362E31362E31362E31362A2C3103060A 282A2E2E31362E31362E31362E31362E31362E31362E31362E31362C2F34080B111E20242E3136 2E31362E31362E31362E31362E31362E31362E31362E31360204072022262D30352E31362E3136 2E31362E31362E31362E31362E31362E3136080A0D14171B2E31362E31362E31362E31362E3136 2E31362E31362E31362E31361517190B0D112B2D322E31362E31362E31362E31362E31362E3136 2E31362E3136272A2E0B0E1424262B2E31362E31362E31362E31362E31362E31362E31362E3136 2C2F3306090F1F21252E31362E31362E31362E31362E31362E31362E31362E31362D303505080D 1B1D212E31362E31362E31362E31362E31362E31362E31362E31362E31360305070304042D2F34 2E31362E31362E31362E31362E31362E31362E31362E3136181B1E0506082D2F342E31362E3136 2E31362E31362E31362E31362E31362E31362021250D0F142A2D312E31362E31362E31362E3136 2E31362E31362E31362E31362C2E33131314D2D2D2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6 1111119293959394959394959394959394959394959394959394959394957576780707088D8E8F 9394959394959394959394959394959394959394959394958788890D0D0D696A6B939495939495 939495939495939495939495939495939495929394202020323333939495939495939495939495 939495939495939495939495939495373737232324939495939495939495939495939495939495 9394959394959394955555570A0A0A959698939495939495939495939495939495939495939495 939495767778070707898A8B939495939495939495939495939495939495939495939495808082 0B0B0B8080829394959394959394959394959394959394959394959394958D8E90121213333334 9293959394959394959394959394959394959394959394959394952F2F301818188F9092939495 9394959394959394959394959394959394959394954C4C4D101111959597939495939495939495 9394959394959394959394959394956868690707076F6F70939495939495939495939495939495 9394959394959394958F9092171718000000EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF5F5F53939393E3E3F939495939495939495939495939495939495939495 9394958F9091181A1D132341264783264783264783264783264783264783264783264783264783 0D192E050A1425447F264783264783264783264783264783264783264783264783192F57070707 7374759394959394959394959394959394959394959394959394956F6F710204061C3460264783 264783264783264783264783264783264783264783213E730305091F396A264783264783264783 26478326478326478326478326478325447F0C101729292A929294939495939495939495939495 93949593949593949592939426272A08101E254681264783264783264783264783264783264783 26478326478312234103060C203C6F264783264783264783264783264783264783264783264783 1C356306060768686A9394959394959394959394959394959394959394959394957A7B7C030507 182E5526478326478326478326478326478326478326478326478323427B04070D0F1D35264783 264783264783264783264783264783264783264783264783182847020305888888FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0D0D00E101325457F264783264783 2647832647832647832647832647832647831F3C6E020408182C52264783264783264783264783 26478326478326478326478323427C04080E0F1B33264783264783264783264783264783264783 2647832647832647830B1323070D19254580264783264783264783264783264783264783264783 264783101F3B060B14264783264783264783264783264783264783264783264783264783192E57 0204071E37672647832647832647832647832647832647832647832647831F3B6E020407172A4E 264783264783264783264783264783264783264783264783223F7603060B132443264783264783 26478326478326478326478326478326478325447F070C150B1426254682264783264783264783 264783264783264783264783264783101D3404080F213D71264783264783264783264783264783 26478326478326478315294C03060B203C6F264783264783264783264783264783264783264783 2647831C35630103061B325D264783264783264783264783264783264783264783264783254580 0B101A000000DEDEDEFFFFFFFFFFFFFFFFFFFFFFFFC6C6C61111118C8C8EC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4939495080808818283C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4ACADAF0F0F0F525253C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4242425272727BABBBDC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 3C3C3D1C1D1DB5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C45D5D5E0A0A0A 9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48D8E8F0708087A7B7CC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A60C0C0C6C6D6EC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B7B8B91515163F4040BEBFC1C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C43434351A1A1AB1B2B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4525353111111ABABADC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 7575760707078F9092C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B1B2B3232324 48494A0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5393939 4D4D4EC0C1C3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BCBDBF1B1D210F1A30315CAA 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC0F1C33060B152D549D325DAC325DAC 325DAC325DAC325DAC325DAC325DAC325DAC1B335E070808959698C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C487878902040724437C325DAC325DAC325DAC325DAC325DAC325DAC 325DAC325DAC294D9003060B192E57325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 305AA80D121A313233BCBDBFC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C0C1C32A2C2E 0A13232F58A4325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC14264703060C2A4F93 325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC203D72070707858688C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49A9B9D0405081F3A6B325DAC325DAC325DAC325DAC 325DAC325DAC325DAC325DAC2D559D05090F132443315CAB325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC1B2E510A111D0517378D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD0D0D00E1013223F75325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC284B8B0305091E3868325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC2D569F 050910122240315CAB325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC0C1627080F1C 2E57A1325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC122240050A132D549D325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC1B335E020407274886325DAC325DAC325DAC 325DAC325DAC325DAC325DAC325DAC2648870204081D3563325DAC325DAC325DAC325DAC325DAC 325DAC325DAC325DAC2C539904070D182D55325DAC325DAC325DAC325DAC325DAC325DAC325DAC 325DAC305AA7080E180D192F305AA7325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC 111F3A0408102C5299325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC182E5503060B 2A4F93325DAC325DAC325DAC325DAC325DAC325DAC325DAC325DAC203D72020306224078325DAC 325DAC325DAC325DAC325DAC325DAC325DAC325DAC2F57A11017250719390B0F15DEDEDEFFFFFF FFFFFFFFFFFFE5E5E51111118C8C8EC0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3 B1B2B4080808818283C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3B6B7B90F0F0F 525253C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3212122272727B8B9BB C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C34444451C1D1DB4B5B6C0C1C3C0C1C3 C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C38485860A0A0A9E9FA0C0C1C3C0C1C3C0C1C3C0C1C3 C0C1C3C0C1C3C0C1C3C0C1C3AFB0B20708087A7B7CC0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3 C0C1C3C0C1C3BABBBD0C0C0C6C6D6EC0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3 B7B8B91515163F4040BEBFC1C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C33F3F40 1A1A1AB1B2B3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3747576111111ABABAD C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C37575760707078F9092C0C1C3C0C1C3 C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3BDBEC023232448494A8F90920C0C0CEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F53939394D4D4EC0C1C3C0C1C3C0C1C3C0C1C3 C0C1C3C0C1C3C0C1C3C0C1C3C0C1C31A1C1F0F1A30315BA9315CAB315CAB315CAB315CAB315CAB 315CAB315CAB315CAB12223D060B152D549D315CAB315CAB315CAB315CAB315CAB315CAB315CAB 315CAB1B335E070808959698C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3878789 02040724437C315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB305AA603060B192E57 315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB305AA80D1219313233BCBDBFC0C1C3 C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3BFC0C22A2C2E0A13232F58A4315CAB315CAB315CAB 315CAB315CAB315CAB315CAB315CAB182E5503060C2A4F93315CAB315CAB315CAB315CAB315CAB 315CAB315CAB315CAB203D72070707858688C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3C0C1C3 C0C1C39A9B9D0405081F3A6B315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB2F58A3 05090F132443315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB1B2E510A111D 0027710618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED0E1013 223F75315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB2A4F920305091E3868315CAB 315CAB315CAB315CAB315CAB315CAB315CAB315CAB2D569F050910122240315CAB315CAB315CAB 315CAB315CAB315CAB315CAB315CAB315CAB0C1526080F1C2E57A1315CAB315CAB315CAB315CAB 315CAB315CAB315CAB315CAB162A4E050A132D549C315CAB315CAB315CAB315CAB315CAB315CAB 315CAB315CAB1F3B6E020407274886315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB 2648870204081D3563315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB2C539904070D 182D55315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB305AA7080E180D192F305AA7 315CAB315CAB315CAB315CAB315CAB315CAB315CAB315CAB111F3A0408102C5299315CAB315CAB 315CAB315CAB315CAB315CAB315CAB315CAB182E5503060B2A4F93315CAB315CAB315CAB315CAB 315CAB315CAB315CAB315CAB203D72020306224078315CAB315CAB315CAB315CAB315CAB315CAB 315CAB315CAB2F57A1101725071939012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000080808000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000020203000000 000000000000000000000000000000000000000000000000000000010101000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000003232338F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF3E3E3E000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000104000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000001000000000000000000000000 00000000000000000000000000000000000000000017233A002976012B7A0618398D8D8DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000001000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000000000000B2452 012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF000000ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50808089D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C1C1C747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243424242B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B070707B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5090909969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51313148A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D191919B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333333636365 8F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4C003698003698 003698003698003698003698003698003698003698001E54010C22003698003698003698003698 003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698 00369800369801071101266D003698003698003698003698003698003698003698003698003698 000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437 003698003698003698003698003698003698003698003698003698002770000611003698003698 003698003698003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698 003698003698003698003698010B1D00215C003698003698003698003698003698003698003698 0036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0A0B0E003088003698003698003698003698003698003698003698003698 00369801060F002C7D003698003698003698003698003698003698003698003698003698000C1F 001F5A00369800369800369800369800369800369800369800369800369800184500102E003698 003698003698003698003698003698003698003698003698002569000A1D003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 00369800369800369800369800369801060F002A77003698003698003698003698003698003698 00369800369800369800091901266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 000A1B003698003698003698003698003698003698003698003698003698002D8000050F003698 00369800369800369800369800369800369800369800369800369800020500318C003698003698 0036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDE FFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E 747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F 2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E001B4D003698003698003698003698003698003698 003698003698003698001E54010C23003698003698003698003698003698003698003698003698 003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 00010300339100369800369800369800369800369800369800369800369800369802091401266D 003698003698003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698 003698003698003698003698003698002770000611003698003698003698003698003698003698 003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B506090E002D80003698003698003698003698003698003698003698003698003698 010B1D00215C0036980036980036980036980036980036980036980036980036980024670B172D 012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114 00308800369800369800369800369800369800369800369800369800369801060F002C7D003698 003698003698003698003698003698003698003698003698000C1F001F5A003698003698003698 00369800369800369800369800369800369800184500102E003698003698003698003698003698 003698003698003698003698002569000B1F003698003698003698003698003698003698003698 003698003698003392000102003698003698003698003698003698003698003698003698003698 00369801060F002A77003698003698003698003698003698003698003698003698003698000919 01266C00369800369800369800369800369800369800369800369800369800102D001947003698 00369800369800369800369800369800369800369800369800215D000A1B003698003698003698 003698003698003698003698003698003698002D8000050F003698003698003698003698003698 00369800369800369800369800369800020500318C003698003698003698003698003698003698 0036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53C3D3E001B4D003698003698003698003698003698003698003698003698003698001E54 010C23003698003698003698003698003698003698003698003698003698003493020202B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698 00369800369800369800369800369800369800369802091401266D003698003698003698003698 003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698003698 003698002770000611003698003698003698003698003698003698003698003698003698003698 060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80 003698003698003698003698003698003698003698003698003698010B1D00215C003698003698 0036980036980036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698 00369800369800369800369800369800369801060F002C7D003698003698003698003698003698 003698003698003698003698000C1F001F5A003698003698003698003698003698003698003698 00369800369800184500102E003698003698003698003698003698003698003698003698003698 002569000B1F003698003698003698003698003698003698003698003698003698003392000102 00369800369800369800369800369800369800369800369800369800369801060F002A77003698 00369800369800369800369800369800369800369800369800091901266C003698003698003698 00369800369800369800369800369800369800102D001947003698003698003698003698003698 00369800369800369800369800215D000A1B003698003698003698003698003698003698003698 003698003698002D8000050F003698003698003698003698003698003698003698003698003698 00369800020500318C0036980036980036980036980036980036980036980036980036980A1C3A 001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 68696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373738 6363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666 686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E001B4D003698 003698003698003698003698003698003698003698003698001E54010C23003698003698003698 003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698 00369800369800369802091401266D003698003698003698003698003698003698003698003698 003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 001437003698003698003698003698003698003698003698003698003698002770000611003698 003698003698003698003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698 003698003698003698003698003698010B1D00215C003698003698003698003698003698003698 0036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698 00369800369801060F002C7D003698003698003698003698003698003698003698003698003698 000C1F001F5A00369800369800369800369800369800369800369800369800369800184500102E 003698003698003698003698003698003698003698003698003698002569000B1F003698003698 003698003698003698003698003698003698003698003392000102003698003698003698003698 00369800369800369800369800369800369801060F002A77003698003698003698003698003698 00369800369800369800369800091901266C003698003698003698003698003698003698003698 00369800369800102D001947003698003698003698003698003698003698003698003698003698 00215D000A1B003698003698003698003698003698003698003698003698003698002D8000050F 00369800369800369800369800369800369800369800369800369800369800020500318C003698 0036980036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15 DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0C EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E001B4D003698003698003698003698003698 003698003698003698003698001E54010C23003698003698003698003698003698003698003698 003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000103003391003698003698003698003698003698003698003698003698003698020914 01266D003698003698003698003698003698003698003698003698003698000F2D515253B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698 003698003698003698003698003698003698002770000611003698003698003698003698003698 003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698003698003698003698 003698010B1D00215C003698003698003698003698003698003698003698003698003698002467 0B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0F111400308800369800369800369800369800369800369800369800369800369801060F002C7D 003698003698003698003698003698003698003698003698003698000C1F001F5A003698003698 00369800369800369800369800369800369800369800184500102E003698003698003698003698 003698003698003698003698003698002569000B1F003698003698003698003698003698003698 003698003698003698003392000102003698003698003698003698003698003698003698003698 00369800369801060F002A77003698003698003698003698003698003698003698003698003698 00091901266C00369800369800369800369800369800369800369800369800369800102D001947 00369800369800369800369800369800369800369800369800369800215D000A1B003698003698 003698003698003698003698003698003698003698002D8000050F003698003698003698003698 00369800369800369800369800369800369800020500318C003698003698003698003698003698 0036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF 070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53C3D3E001B4D003698003698003698003698003698003698003698003698003698 001E54010C23003698003698003698003698003698003698003698003698003698003493020202 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698 00369800369800369800369800369800369800369800369802091401266D003698003698003698 003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698 003698003698002770000611003698003698003698003698003698003698003698003698003698 003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E 002D80003698003698003698003698003698003698003698003698003698010B1D00215C003698 0036980036980036980036980036980036980036980036980024670B172D012B7A012B7A061839 8D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698 00369800369800369800369800369800369800369801060F002C7D003698003698003698003698 003698003698003698003698003698000C1F001F5A003698003698003698003698003698003698 00369800369800369800184500102E003698003698003698003698003698003698003698003698 003698002569000B1F003698003698003698003698003698003698003698003698003698003392 00010200369800369800369800369800369800369800369800369800369800369801060F002A77 00369800369800369800369800369800369800369800369800369800091901266C003698003698 00369800369800369800369800369800369800369800102D001947003698003698003698003698 00369800369800369800369800369800215D000A1B003698003698003698003698003698003698 003698003698003698002D8000050F003698003698003698003698003698003698003698003698 00369800369800020500318C003698003698003698003698003698003698003698003698003698 0A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1D747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616178A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2A2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3031316363658F90928E8F91000000E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E001B4D 003698003698003698003698003698003698003698003698003698001E54010C22003698003698 003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698 00369800369800369800369800071301266D003698003698003698003698003698003698003698 003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758001437003698003698003698003698003698003698003698003698003698002770000611 003698003698003698003698003698003698003698003698003698003698050606A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505090E002D80003698003698003698 003698003698003698003698003698003698000A1C00215C003698003698003698003698003698 003698003698003698003698002467051126012B7A012B7A021436878787FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698 00369800369800369800050F002C7D003698003698003698003698003698003698003698003698 003698000A1E001F5A003698003698003698003698003698003698003698003698003698001845 00102D003698003698003698003698003698003698003698003698003698002569000B1F003698 003698003698003698003698003698003698003698003698003392000102003698003698003698 00369800369800369800369800369800369800369800050E002A77003698003698003698003698 00369800369800369800369800369800091901266C003698003698003698003698003698003698 00369800369800369800102D001947003698003698003698003698003698003698003698003698 00369800215D00091A003698003698003698003698003698003698003698003698003698002D80 00050F00369800369800369800369800369800369800369800369800369800369800010500318C 003698003698003698003698003698003698003698003698003698041534001B4D012B7A012B7A 03060CDDDDDDFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1D1D747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 434343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55D5E5F2A2B2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D 1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53030306363658E8F91343535 0D0D0EECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E001B4D003698003698003698003698 003698003698003698003698003698001E54010C22003698003698003698003698003698003698 003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698003698003698 00071201266D003698003698003698003698003698003698003698003698003698000F2D515253 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698 003698003698003698003698003698003698003698002770000611003698003698003698003698 003698003698003698003698003698003698050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B505080E002D80003698003698003698003698003698003698003698 003698003698000A1C00215C003698003698003698003698003698003698003698003698003698 002467010D25012B7A001F59000105646464FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0F111400308800369800369800369800369800369800369800369800369800369800050F 002C7D003698003698003698003698003698003698003698003698003698000A1E001F5A003698 00369800369800369800369800369800369800369800369800184500102D003698003698003698 003698003698003698003698003698003698002569000B1F003698003698003698003698003698 003698003698003698003698003392000102003698003698003698003698003698003698003698 00369800369800369800050E002A77003698003698003698003698003698003698003698003698 00369800091901266C00369800369800369800369800369800369800369800369800369800102D 00194700369800369800369800369800369800369800369800369800369800215D00091A003698 003698003698003698003698003698003698003698003698002D8000050F003698003698003698 00369800369800369800369800369800369800369800010500318C003698003698003698003698 003698003698003698003698003698001233001B4D012B7A001335000205D0D0D0FFFFFFFFFFFF FFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B 606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53434356363653536360F0F0F090909EEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53C3D3E001B4D003698003698003698003698003698003698003698003698 003698001E54010C22003698003698003698003698003698003698003698003698003698003493 020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391 00369800369800369800369800369800369800369800369800369800071301266D003698003698 003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698 003698003698003698002770000611003698003698003698003698003698003698003698003698 003698003698050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 05080E002D80003698003698003698003698003698003698003698003698003698000A1D00215C 003698003698003698003698003698003698003698003698003698002467021029001F58000104 0310278D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698 00369800369800369800369800369800369800369800369800050F002C7D003698003698003698 003698003698003698003698003698003698000A1F001F5A003698003698003698003698003698 00369800369800369800369800184500102E003698003698003698003698003698003698003698 003698003698002569000B1F003698003698003698003698003698003698003698003698003698 00339200010200369800369800369800369800369800369800369800369800369800369800050E 002A7700369800369800369800369800369800369800369800369800369800091901266C003698 00369800369800369800369800369800369800369800369800102D001947003698003698003698 00369800369800369800369800369800369800215D00091A003698003698003698003698003698 003698003698003698003698002D8000050F003698003698003698003698003698003698003698 00369800369800369800010500318C003698003698003698003698003698003698003698003698 003698011437001B4D00123401040A080B0FDEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424243424243B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B568696A313132B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 99999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2A2A2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53434352A2B2B0F0F0F8585860C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53C3D3E 001B4D003698003698003698003698003698003698003698003698003698001E54010C22003698 003698003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698 00369800369800369800369800369800071301266D003698003698003698003698003698003698 003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758001337003698003698003698003698003698003698003698003698003698002770 000611003698003698003698003698003698003698003698003698003698003698050606A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505080E002D80003698003698 003698003698003698003698003698003698003698000A1D00215C003698003698003698003698 003698003698003698003698003698002467010B1E000104001A4C0618398D8D8DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D1013003088003698003698003698003698003698 00369800369800369800369800050F002C7D003698003698003698003698003698003698003698 003698003698000A1F001F5A003698003698003698003698003698003698003698003698003698 00184500102C003698003698003698003698003698003698003698003698003698002569000B1F 003698003698003698003698003698003698003698003698003698003392000102003698003698 00369800369800369800369800369800369800369800369800050E002A77003698003698003698 00369800369800369800369800369800369800091901266C003698003698003698003698003698 00369800369800369800369800102D001947003698003698003698003698003698003698003698 00369800369800215D00091A003698003698003698003698003698003698003698003698003698 002D8000050F003698003698003698003698003698003698003698003698003698003698000105 00318C003698003698003698003698003698003698003698003698003698011437010E2901040A 01266C0B0F15DEDEDEFFFFFFFFFFFFFFFFFF0000002425252A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A0101011B1B1C292A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A070808010101292A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 00000000000029292A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A151515000000 2829292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2223230000002828282A2A2A 2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0404041717172A2A2A2A2A2A292A2A 2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0707070F0F0F292A2A2A2A2A292A2A2A2A2A2A2A2A 2A2A2A2A2A2A2A2A2A2A2A2A030303000000292A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A 2A2A2A2A2A2A08080800000029292A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A 2121210000002828292A2A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A272828000000 2727272A2A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A000000000000858688 8F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B5C5C00000028292A 28292A28292A28292A28292A28292A28292A28292A28292A030404000000010C23010C23010C23 010D23010D24010D24010D24010D24010D2400030A000000010C22010C23010C23010D23010D24 010D24010D24010D24010D2400091C00000028282928282A28282A28282A28292A28292A28292A 28292A28292A28292A000000000B1E010C23010C23010C23010D24010D24010D24010D24010D24 010D24000207000207010C23010C23010C23010D24010D24010D24010D24010D24010D24000000 00000028282A28282A28282A28292A28292A28292A28292A28292A28292A090A0A000000010C23 010C23010C23010D23010D24010D24010D24010D24010D24000614000000010C22010C23010C23 010D23010D24010D24010D24010D24010D24010C220000001E1F2028282A28282A28282A28292A 28292A28292A28292A28292A28292A000103000713010C23010C23010C23010D24010D24010D24 010D24010D24010D24000206000000010C23010C23010C23010D24010D24010D24010D24010D24 010D24000000000000001E56012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF000000000919010D24010D24010D24010D24010D24010D24010D24010D24010D24 000104000611010C23010C23010C23010D24010D24010D24010D24010D24010D24000105000000 010C23010C23010C23010D24010D24010D24010D24010D24010D24000002000000010C23010C23 010C23010D23010D24010D24010D24010D24010D24000715000000010C23010C23010C23010C23 010D24010D24010D24010D24010D24010B22000000010C22010C23010C23010C23010D24010D24 010D24010D24010D24010D2300020600050D010C23010C23010C23010D24010D24010D24010D24 010D24010D24000207000207010C23010C23010C23010D24010D24010D24010D24010D24010D24 000000000000010C23010C23010C23010D24010D24010D24010D24010D24010D24000207000000 010C23010C23010C23010D23010D24010D24010D24010D24010D24000A1D000000010C22010C23 010C23010C23010D24010D24010D24010D24010D24010C2200000000091B010C23010C23010C23 010D24010D24010D24010D24010D24010D2400000001060E01276E012B7A0B0F15DEDEDEFFFFFF FFFFFFFFFFFF000000606161616263616263616263616263616263616263616263616263616263 00000059595A6162636162636162636162636162636162636162636162636162630F0F0F4A4A4B 6162636162636162636162636162636162636162636162636162632A2B2B141414616263616263 6162636162636162636162636162636162636162633E3E3F060607616263616263616263616263 616263616263616263616263616263565757000000616263616263616263616263616263616263 6162636162636162636162630000005C5D5E616263616263616263616263616263616263616263 616263616263090909525252616263616263616263616263616263616263616263616263616263 191A1A3C3D3E6162636162636162636162636162636162636162636162636162633D3D3E070808 6162636162636162636162636162636162636162636162636162634B4C4D030303616263616263 616263616263616263616263616263616263616263616263000000616163616263616263616263 6162636162636162636162636162636162631C1D1D5E5E608F90928F90920C0C0CEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56575A001336001D53001D53001D53001D53001D53 001D53001D53001D53001D53010B21010C24001D53001D53001D53001D53001D53001D53001D53 001D53001D53001337000003001D53001D53001D53001D53001D53001D53001D53001D53001D53 011C50000000001D53001D53001D53001D53001D53001D53001D53001D53001D53001D53000000 011D52001D53001D53001D53001D53001D53001D53001D53001D53001D53000208001743001D53 001D53001D53001D53001D53001D53001D53001D53001D5300091C00091A001D53001D53001D53 001D53001D53001D53001D53001D53001D5300102F000511001D53001D53001D53001D53001D53 001D53001D53001D53001D53001742000000001D53001D53001D53001D53001D53001D53001D53 001D53001D53001D53000000011C51001D53001D53001D53001D53001D53001D53001D53001D53 001D53000000011B4F001D53001D53001D53001D53001D53001D53001D53001D53001D53000510 001236001D53001D53001D53001D53001D53001D53001D53001D53001D530017430A1428012B7A 012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000011C50 001D53001D53001D53001D53001D53001D53001D53001D53001D53000004001948001D53001D53 001D53001D53001D53001D53001D53001D53001D53000612001339001D53001D53001D53001D53 001D53001D53001D53001D53001D53000F2D00050F001D53001D53001D53001D53001D53001D53 001D53001D53001D5301143B000107001D53001D53001D53001D53001D53001D53001D53001D53 001D53011B4F000000001D53001D53001D53001D53001D53001D53001D53001D53001D53001D53 000207001B4D001D53001D53001D53001D53001D53001D53001D53001D53001D5300030D001846 001D53001D53001D53001D53001D53001D53001D53001D53001D5300091C00081A001D53001D53 001D53001D53001D53001D53001D53001D53001D5301143B000105001D53001D53001D53001D53 001D53001D53001D53001D53001D53001845000000001D53001D53001D53001D53001D53001D53 001D53001D53001D53001D53000000011C51001D53001D53001D53001D53001D53001D53001D53 001D53001D53061022001A4B012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698003698003698 001234001B4D003698003698003698003698003698003698003698003698003698001E54010C23 003698003698003698003698003698003698003698003698003698003493000001003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369802091401266D003698003698003698003698003698 003698003698003698003698000F2D001846003698003698003698003698003698003698003698 003698003698001A4A001337003698003698003698003698003698003698003698003698003698 002770000611003698003698003698003698003698003698003698003698003698003698000205 00318B00369800369800369800369800369800369800369800369800369800050D002D80003698 003698003698003698003698003698003698003698003698010B1D00215C003698003698003698 0036980036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698 00369800369800369800369800369801060F002C7D003698003698003698003698003698003698 003698003698003698000C1F001F5A003698003698003698003698003698003698003698003698 00369800184500102E003698003698003698003698003698003698003698003698003698002569 000B1F003698003698003698003698003698003698003698003698003698003392000102003698 00369800369800369800369800369800369800369800369800369801060F002A77003698003698 00369800369800369800369800369800369800369800091901266C003698003698003698003698 00369800369800369800369800369800102D001947003698003698003698003698003698003698 00369800369800369800215D000A1B003698003698003698003698003698003698003698003698 003698002D7F000510003698003698003698003698003698003698003698003698003698003698 00020500318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D 012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373738636365 8F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58 003698003698003698003698003698003698003698003698003698001234001B4D003698003698 003698003698003698003698003698003698003698001E54010C23003698003698003698003698 003698003698003698003698003698003493000001003698003698003698003698003698003698 003698003698003698003698000103003391003698003698003698003698003698003698003698 00369800369802091401266D003698003698003698003698003698003698003698003698003698 000F2D001846003698003698003698003698003698003698003698003698003698001A4A001337 003698003698003698003698003698003698003698003698003698002770000611003698003698 00369800369800369800369800369800369800369800369800020500318B003698003698003698 00369800369800369800369800369800369800050D002D80003698003698003698003698003698 003698003698003698003698010B1D00215C003698003698003698003698003698003698003698 0036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698 00369801060F002C7D003698003698003698003698003698003698003698003698003698000C1F 001F5A00369800369800369800369800369800369800369800369800369800184500102E003698 003698003698003698003698003698003698003698003698002569000B1F003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 00369800369800369800369800369801060F002A77003698003698003698003698003698003698 00369800369800369800091901266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 000A1B003698003698003698003698003698003698003698003698003698002D7F000510003698 00369800369800369800369800369800369800369800369800369800020500318C003698003698 0036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDE FFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F 747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E 2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698 003698003698003698003698003698001234001B4D003698003698003698003698003698003698 003698003698003698001E54010C23003698003698003698003698003698003698003698003698 003698003493000001003698003698003698003698003698003698003698003698003698003698 00010300339100369800369800369800369800369800369800369800369800369802091401266D 003698003698003698003698003698003698003698003698003698000F2D001846003698003698 003698003698003698003698003698003698003698001A4A001337003698003698003698003698 003698003698003698003698003698002770000611003698003698003698003698003698003698 00369800369800369800369800020500318B003698003698003698003698003698003698003698 00369800369800050D002D80003698003698003698003698003698003698003698003698003698 010B1D00215C0036980036980036980036980036980036980036980036980036980024670B172D 012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114 00308800369800369800369800369800369800369800369800369800369801060F002C7D003698 003698003698003698003698003698003698003698003698000C1F001F5A003698003698003698 00369800369800369800369800369800369800184500102E003698003698003698003698003698 003698003698003698003698002569000B1F003698003698003698003698003698003698003698 003698003698003392000102003698003698003698003698003698003698003698003698003698 00369801060F002A77003698003698003698003698003698003698003698003698003698000919 01266C00369800369800369800369800369800369800369800369800369800102D001947003698 00369800369800369800369800369800369800369800369800215D000A1B003698003698003698 003698003698003698003698003698003698002D7F000510003698003698003698003698003698 00369800369800369800369800369800020500318C003698003698003698003698003698003698 0036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5171717 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698003698 003698001234001B4D003698003698003698003698003698003698003698003698003698001E54 010C23003698003698003698003698003698003698003698003698003698003493000001003698 003698003698003698003698003698003698003698003698003698000103003391003698003698 00369800369800369800369800369800369800369802091401266D003698003698003698003698 003698003698003698003698003698000F2D001846003698003698003698003698003698003698 003698003698003698001A4A001337003698003698003698003698003698003698003698003698 003698002770000611003698003698003698003698003698003698003698003698003698003698 00020500318B00369800369800369800369800369800369800369800369800369800050D002D80 003698003698003698003698003698003698003698003698003698010B1D00215C003698003698 0036980036980036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698 00369800369800369800369800369800369801060F002C7D003698003698003698003698003698 003698003698003698003698000C1F001F5A003698003698003698003698003698003698003698 00369800369800184500102E003698003698003698003698003698003698003698003698003698 002569000B1F003698003698003698003698003698003698003698003698003698003392000102 00369800369800369800369800369800369800369800369800369800369801060F002A77003698 00369800369800369800369800369800369800369800369800091901266C003698003698003698 00369800369800369800369800369800369800102D001947003698003698003698003698003698 00369800369800369800369800215D000A1B003698003698003698003698003698003698003698 003698003698002D7F000510003698003698003698003698003698003698003698003698003698 00369800020500318C0036980036980036980036980036980036980036980036980036980A1C3A 001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 68696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373738 6363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265 001F58003698003698003698003698003698003698003698003698003698001234001B4D003698 003698003698003698003698003698003698003698003698001E54010C23003698003698003698 003698003698003698003698003698003698003493000001003698003698003698003698003698 003698003698003698003698003698000103003391003698003698003698003698003698003698 00369800369800369802091401266D003698003698003698003698003698003698003698003698 003698000F2D001846003698003698003698003698003698003698003698003698003698001A4A 001337003698003698003698003698003698003698003698003698003698002770000611003698 00369800369800369800369800369800369800369800369800369800020500318B003698003698 00369800369800369800369800369800369800369800050D002D80003698003698003698003698 003698003698003698003698003698010B1D00215C003698003698003698003698003698003698 0036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698 00369800369801060F002C7D003698003698003698003698003698003698003698003698003698 000C1F001F5A00369800369800369800369800369800369800369800369800369800184500102E 003698003698003698003698003698003698003698003698003698002569000B1F003698003698 003698003698003698003698003698003698003698003392000102003698003698003698003698 00369800369800369800369800369800369801060F002A77003698003698003698003698003698 00369800369800369800369800091901266C003698003698003698003698003698003698003698 00369800369800102D001947003698003698003698003698003698003698003698003698003698 00215D000A1B003698003698003698003698003698003698003698003698003698002D7F000510 00369800369800369800369800369800369800369800369800369800369800020500318C003698 0036980036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15 DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1D1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53233336363658F90928F90920A0A0A EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698 003698003698003698003698003698003698001234001B4D003698003698003698003698003698 003698003698003698003698001E54010C22003698003698003698003698003698003698003698 003698003698003493000001003698003698003698003698003698003698003698003698003698 003698000103003391003698003698003698003698003698003698003698003698003698010813 01266D003698003698003698003698003698003698003698003698003698000F2D001846003698 003698003698003698003698003698003698003698003698001A4A001337003698003698003698 003698003698003698003698003698003698002770000611003698003698003698003698003698 00369800369800369800369800369800020500318B003698003698003698003698003698003698 00369800369800369800050D002D80003698003698003698003698003698003698003698003698 003698000B1D00215C003698003698003698003698003698003698003698003698003698002467 061328012B7A012B7A0315368D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0F111400308800369800369800369800369800369800369800369800369800369800050F002C7D 003698003698003698003698003698003698003698003698003698000B1F001F5A003698003698 00369800369800369800369800369800369800369800184500102D003698003698003698003698 003698003698003698003698003698002569000B1F003698003698003698003698003698003698 003698003698003698003392000102003698003698003698003698003698003698003698003698 00369800369800050E002A77003698003698003698003698003698003698003698003698003698 00091901266C00369800369800369800369800369800369800369800369800369800102D001947 00369800369800369800369800369800369800369800369800369800215D00091A003698003698 003698003698003698003698003698003698003698002D7F000510003698003698003698003698 00369800369800369800369800369800369800020500318C003698003698003698003698003698 003698003698003698003698061736001B4D012B7A012B7A05090FDEDEDEFFFFFFFFFFFFFFFFFF 070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1D747576B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1616168A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2A2B2BB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52F2F2F6363658F9092646566040404C6C6C6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698 003698003698001234001B4D003698003698003698003698003698003698003698003698003698 001E54010C22003698003698003698003698003698003698003698003698003698003493000001 003698003698003698003698003698003698003698003698003698003698000103003391003698 00369800369800369800369800369800369800369800369800071201266D003698003698003698 003698003698003698003698003698003698000F2D001846003698003698003698003698003698 003698003698003698003698001A4A001337003698003698003698003698003698003698003698 003698003698002770000611003698003698003698003698003698003698003698003698003698 00369800010500318B00369800369800369800369800369800369800369800369800369800040D 002D80003698003698003698003698003698003698003698003698003698000A1C00215C003698 003698003698003698003698003698003698003698003698002467010D24012B7A01266E000610 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698 00369800369800369800369800369800369800369800050F002C7D003698003698003698003698 003698003698003698003698003698000A1E001F5A003698003698003698003698003698003698 00369800369800369800184500102D003698003698003698003698003698003698003698003698 003698002569000B1F003698003698003698003698003698003698003698003698003698003392 00010200369800369800369800369800369800369800369800369800369800369800040D002A77 00369800369800369800369800369800369800369800369800369800091901266C003698003698 00369800369800369800369800369800369800369800102D001947003698003698003698003698 00369800369800369800369800369800215D00091A003698003698003698003698003698003698 003698003698003698002D7F000510003698003698003698003698003698003698003698003698 00369800369800010500318C003698003698003698003698003698003698003698003698003698 001232001B4D012B7A00205B000104BEBEBEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 343435636365565758070707060606EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 606265001F58003698003698003698003698003698003698003698003698003698001234001B4D 003698003698003698003698003698003698003698003698003698001E54010C22003698003698 003698003698003698003698003698003698003698003493000001003698003698003698003698 003698003698003698003698003698003698000103003391003698003698003698003698003698 00369800369800369800369800071301266D003698003698003698003698003698003698003698 003698003698000F2D001846003698003698003698003698003698003698003698003698003698 001A4A001337003698003698003698003698003698003698003698003698003698002770000611 00369800369800369800369800369800369800369800369800369800369800020500318B003698 00369800369800369800369800369800369800369800369800050D002D80003698003698003698 003698003698003698003698003698003698000A1D00215C003698003698003698003698003698 00369800369800369800369800246702102900256A00030A020B1C8D8D8DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698 00369800369800369800060F002C7D003698003698003698003698003698003698003698003698 003698000B1F001F5A003698003698003698003698003698003698003698003698003698001845 00102E003698003698003698003698003698003698003698003698003698002569000B1F003698 003698003698003698003698003698003698003698003698003392000102003698003698003698 00369800369800369800369800369800369800369800050E002A77003698003698003698003698 00369800369800369800369800369800091901266C003698003698003698003698003698003698 00369800369800369800102D001947003698003698003698003698003698003698003698003698 00369800215D00091A003698003698003698003698003698003698003698003698003698002D7F 00051000369800369800369800369800369800369800369800369800369800369800010500318C 003698003698003698003698003698003698003698003698003698011437001B4D011C50000205 040609DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51D1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 424343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55D5D5E2A2A2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D 1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53434354B4C4D070707717274 0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698 003698003698003698003698003698003698003698001234001B4D003698003698003698003698 003698003698003698003698003698001E54010C22003698003698003698003698003698003698 003698003698003698003493000001003698003698003698003698003698003698003698003698 003698003698000103003391003698003698003698003698003698003698003698003698003698 00071301266D003698003698003698003698003698003698003698003698003698000F2D001846 003698003698003698003698003698003698003698003698003698001A4A001337003698003698 003698003698003698003698003698003698003698002770000611003698003698003698003698 00369800369800369800369800369800369800020500318B003698003698003698003698003698 00369800369800369800369800050D002D80003698003698003698003698003698003698003698 003698003698000A1D00215C003698003698003698003698003698003698003698003698003698 002467010D2300030A0011320618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0E101400308800369800369800369800369800369800369800369800369800369800060F 002C7D003698003698003698003698003698003698003698003698003698000B1F001F5A003698 00369800369800369800369800369800369800369800369800184500102D003698003698003698 003698003698003698003698003698003698002569000B1F003698003698003698003698003698 003698003698003698003698003392000102003698003698003698003698003698003698003698 00369800369800369800050E002A77003698003698003698003698003698003698003698003698 00369800091901266C00369800369800369800369800369800369800369800369800369800102D 00194700369800369800369800369800369800369800369800369800369800215D00091A003698 003698003698003698003698003698003698003698003698002D7F000510003698003698003698 00369800369800369800369800369800369800369800010500318C003698003698003698003698 003698003698003698003698003698011437001742000205001F5B0B0F15DEDEDEFFFFFFFFFFFF FFFFFF00000059595A5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C040404 5657585B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C0D0D0D4C4C4D5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C2525262F2F305B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C3838382122225B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C4E4F4F0202025B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C0707075454555B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C0B0B0B5152535B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C1D1D1D 4747485B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C3333341B1B1B5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C4647471010105B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C0000005A5B5C5B5B5C5B5B5C5B5B5C5B5B5C 5B5B5C5B5B5C5B5B5C5B5B5C5B5B5C0606060303037373758F90920C0C0CEEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F515401163D011B4E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E011B4E000A1E01143B011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 011B4E00102F000715011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E001846 000000011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E000000001B4C 011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E000309001743011B4E011B4E 011B4E011B4E011B4E011B4E011B4E011B4E011B4E000612001234011B4E011B4E011B4E011B4E 011B4E011B4E011B4E011B4E011B4E010E28010E27011B4E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E011B4E01143B000308011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E000001001A4B011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 000206001948011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E00040C01163F 011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E01153C000000001235012B7A 0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000103001A49011B4E 011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E000207001947011B4E011B4E011B4E 011B4E011B4E011B4E011B4E011B4E011B4E00040C01163E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E011B4E011B4E000A1E000B1E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E001236000714011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 001949000000011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E000207 001845011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E000612001743011B4E 011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E00091B001336011B4E011B4E011B4E 011B4E011B4E011B4E011B4E011B4E011B4E000F2B00050F011B4E011B4E011B4E011B4E011B4E 011B4E011B4E011B4E011B4E011640000207011B4E011B4E011B4E011B4E011B4E011B4E011B4E 011B4E011B4E011B4E000001001A4B011B4E011B4E011B4E011B4E011B4E011B4E011B4E011B4E 011B4E00040B000000001F5B012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF000000343435353536 353536353536353536353536353536353536353536353536000000323233353536353536353536 3535363535363535363535363535363535360909092C2C2D353536353536353536353536353536 353536353536353536353536191919010101353536353536353536353536353536353536353536 353536353536202021010101353536353536353536353536353536353536353536353536353536 2E2E2F010101353536353536353536353536353536353536353536353536353536353536000000 323233353536353536353536353536353536353536353536353536353536050505303031353536 353536353536353536353536353536353536353536353536101010252525353536353536353536 353536353536353536353536353536353536202020010101353536353536353536353536353536 35353635353635353635353629292A010101353536353536353536353536353536353536353536 353536353536353536000000353536353536353536353536353536353536353536353536353536 3535361819196262648F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF545454252628343436343436343436343436343436343436343436343436343436131416 00091B000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D00091D000001000F2D 000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000E2B000001343436343436343436 343436343436343436343436343436343436343436000000000E2C000F2D000F2D000F2D000F2D 000F2D000F2D000F2D000F2D000F2D000106010D27000F2D000F2D000F2D000F2D000F2D000F2D 000F2D000F2D000F2D000410070809343436343436343436343436343436343436343436343436 3434361B1C1D000003000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D010B23 000001000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000000323334 343436343436343436343436343436343436343436343436343436000000010E29000F2D000F2D 000F2D000F2D000F2D000F2D000F2D000F2D000F2D00020A010C25000F2D000F2D000F2D000F2D 000F2D000F2D000F2D000F2D000F2D010D26091325012B7A012B7A0618398D8D8DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000313234343436343436343436343436343436 343436343436343436343436000001010E29000F2D000F2D000F2D000F2D000F2D000F2D000F2D 000F2D000F2D00030A010B23000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D 000718010102343436343436343436343436343436343436343436343436343436232325000001 000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000E2B000001000F2D000F2D 000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D0304052F3031343436343436343436 343436343436343436343436343436343436030507010D27000F2D000F2D000F2D000F2D000F2D 000F2D000F2D000F2D000F2D000511000107000F2D000F2D000F2D000F2D000F2D000F2D000F2D 000F2D000F2D000A20000001343436343436343436343436343436343436343436343436343436 2B2B2C000001000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000000 000F2C000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D000F2D030A16001949012B7A 012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51D1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F9092 8F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF656565686869B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698 003698003698003698003698003698003698001E54010C23003698003698003698003698003698 003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698003698 00369802091401266D003698003698003698003698003698003698003698003698003698000F2D 515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698 003698003698003698003698003698003698003698003698002770000611003698003698003698 003698003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698003698 003698003698003698010B1D00215C003698003698003698003698003698003698003698003698 0036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 080B10002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A 003698003698003698003698003698003698003698003698003698001845333436B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698003698003698 003698003698003698003698003698003392000102003698003698003698003698003698003698 0036980036980036980036980C0D108C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B513171D01266C003698003698003698003698003698003698003698003698003698 00102D00194700369800369800369800369800369800369800369800369800369800215D1E1E1F B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000610003698003698 00369800369800369800369800369800369800369800369800020500318C003698003698003698 0036980036980036980036980036980036980A1B3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFF FFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698003698 003698003698001E54010C23003698003698003698003698003698003698003698003698003698 003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 00339100369800369800369800369800369800369800369800369800369802091401266D003698 003698003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698 003698003698003698003698002770000611003698003698003698003698003698003698003698 003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B506090E002D80003698003698003698003698003698003698003698003698003698010B1D 00215C0036980036980036980036980036980036980036980036980036980024670B172D012B7A 012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1616169FA0A2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080B10002C7D003698003698 003698003698003698003698003698003698003698000C1F001F5A003698003698003698003698 003698003698003698003698003698001845333436B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698003698003698003698003698003698003698 003698003392000102003698003698003698003698003698003698003698003698003698003698 0C0D108C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513171D01266C 00369800369800369800369800369800369800369800369800369800102D001947003698003698 00369800369800369800369800369800369800369800215D1E1E1FB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000610003698003698003698003698003698003698 00369800369800369800369800020500318C003698003698003698003698003698003698003698 0036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3B3C3D001B4D003698003698003698003698003698003698003698003698003698001E54010C23 003698003698003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698 00369800369800369800369800369800369802091401266D003698003698003698003698003698 003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698003698003698 002770000611003698003698003698003698003698003698003698003698003698003698060606 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698 003698003698003698003698003698003698003698003698010B1D00215C003698003698003698 0036980036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080B10002C7D003698003698003698003698003698003698 003698003698003698000C1F001F5A003698003698003698003698003698003698003698003698 003698001845333436B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57A7B7C 000B1F003698003698003698003698003698003698003698003698003698003392000102003698 0036980036980036980036980036980036980036980036980036980C0D108C8D8EB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513171D01266C003698003698003698003698 00369800369800369800369800369800102D001947003698003698003698003698003698003698 00369800369800369800215D1E1E1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5959697000610003698003698003698003698003698003698003698003698003698003698 00020500318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D 012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373738636365 8F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698 003698003698003698003698003698003698003698001E54010C23003698003698003698003698 003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698 00369800369802091401266D003698003698003698003698003698003698003698003698003698 000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437 003698003698003698003698003698003698003698003698003698002770000611003698003698 003698003698003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698 003698003698003698003698010B1D00215C003698003698003698003698003698003698003698 0036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5080B10002C7D003698003698003698003698003698003698003698003698003698000C1F 001F5A003698003698003698003698003698003698003698003698003698001845333436B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 0036980036980036980036980036980C0D108C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B513171D01266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 1E1E1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000610003698 00369800369800369800369800369800369800369800369800369800020500318C003698003698 0036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDE FFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E 747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E 2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698 003698003698003698001E54010C23003698003698003698003698003698003698003698003698 003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 00010300339100369800369800369800369800369800369800369800369800369802091401266D 003698003698003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698 003698003698003698003698003698002770000611003698003698003698003698003698003698 003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B506090E002D80003698003698003698003698003698003698003698003698003698 010B1D00215C0036980036980036980036980036980036980036980036980036980024670B172D 012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF161616 9FA0A2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5080B10002C7D003698 003698003698003698003698003698003698003698003698000C1F001F5A003698003698003698 003698003698003698003698003698003698001845333436B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698003698003698003698003698003698 003698003698003392000102003698003698003698003698003698003698003698003698003698 0036980C0D108C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513171D 01266C00369800369800369800369800369800369800369800369800369800102D001947003698 00369800369800369800369800369800369800369800369800215D1E1E1FB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000610003698003698003698003698003698 00369800369800369800369800369800020500318C003698003698003698003698003698003698 0036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1D1E747576B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161717 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53334346363658F90928F9092090909EEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53B3C3D001B4D003698003698003698003698003698003698003698003698003698001E54 010C22003698003698003698003698003698003698003698003698003698003493020202B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698 00369800369800369800369800369800369800369801081301266D003698003698003698003698 003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698003698 003698002770000611003698003698003698003698003698003698003698003698003698003698 050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80 003698003698003698003698003698003698003698003698003698000B1D00215C003698003698 003698003698003698003698003698003698003698002467081429012B7A012B7A0416378D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070B10002C7D003698003698003698003698003698 003698003698003698003698000B1F001F5A003698003698003698003698003698003698003698 003698003698001845333436B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 7A7B7C000B1F003698003698003698003698003698003698003698003698003698003392000102 0036980036980036980036980036980036980036980036980036980036980B0D108C8D8EB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513171D01266C003698003698003698 00369800369800369800369800369800369800102D001947003698003698003698003698003698 00369800369800369800369800215D1E1E1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5959697000610003698003698003698003698003698003698003698003698003698 00369800020500318C003698003698003698003698003698003698003698003698003698071837 001B4D012B7A012B7A000000DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C1C1C747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 68696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0C969799B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2A2B2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52D2E2E 6363658F909278797B040404CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666 686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698 003698003698003698003698003698003698003698003698001E54010C22003698003698003698 003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698 00369800369800369800061201266D003698003698003698003698003698003698003698003698 003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758 001437003698003698003698003698003698003698003698003698003698002770000611003698 003698003698003698003698003698003698003698003698003698050606A3A4A6B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505080E002D80003698003698003698003698 00369800369800369800369800369800091C00215C003698003698003698003698003698003698 003698003698003698002467010D23012B7A002975000A1C2D2D2DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5070A10002C7D003698003698003698003698003698003698003698003698003698 000A1E001F5A003698003698003698003698003698003698003698003698003698001845333335 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698 003698003698003698003698003698003698003698003392000102003698003698003698003698 0036980036980036980036980036980036980A0C0F8C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B513171D01266C003698003698003698003698003698003698003698 00369800369800102D001947003698003698003698003698003698003698003698003698003698 00215D1D1E1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000510 00369800369800369800369800369800369800369800369800369800369800010500318C003698 003698003698003698003698003698003698003698003698001231001B4D012B7A01215E000103 BDBDBDFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1D1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B534343563636568696A060606000000 EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698 003698003698003698003698001E54010C22003698003698003698003698003698003698003698 003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000103003391003698003698003698003698003698003698003698003698003698000713 01266D003698003698003698003698003698003698003698003698003698000F2D515253B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698 003698003698003698003698003698003698002770000611003698003698003698003698003698 003698003698003698003698003698050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B505080E002D80003698003698003698003698003698003698003698003698 003698000A1D00215C003698003698003698003698003698003698003698003698003698002467 0210290028720007130209168D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1616169FA0A2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070A10002C7D 003698003698003698003698003698003698003698003698003698000B1F001F5A003698003698 003698003698003698003698003698003698003698001845333436B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B57A7B7C000B1F003698003698003698003698003698003698 003698003698003698003392000102003698003698003698003698003698003698003698003698 0036980036980A0C108C8D8EB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 13171D01266C00369800369800369800369800369800369800369800369800369800102D001947 00369800369800369800369800369800369800369800369800369800215D1D1E1FB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5959697000510003698003698003698003698 00369800369800369800369800369800369800010500318C003698003698003698003698003698 003698003698003698003698011437001B4D01215E00020506090CDEDEDEFFFFFFFFFFFFFFFFFF 070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1E1E747576B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5343435595A5B0606066162630C0C0CEEEEEEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698003698003698003698 001E54010C22003698003698003698003698003698003698003698003698003698003493020202 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698 00369800369800369800369800369800369800369800369800071301266D003698003698003698 003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698 003698003698002770000611003698003698003698003698003698003698003698003698003698 003698050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505080E 002D80003698003698003698003698003698003698003698003698003698000A1D00215C003698 003698003698003698003698003698003698003698003698002467010E26000713010C24061839 8D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1616169FA0A2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070A10002C7D003698003698003698003698 003698003698003698003698003698000B1F001F5A003698003698003698003698003698003698 003698003698003698001845333435B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B57A7B7C000B1F003698003698003698003698003698003698003698003698003698003392 0001020036980036980036980036980036980036980036980036980036980036980A0C108C8D8E B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B513171D01266C003698003698 00369800369800369800369800369800369800369800102D001947003698003698003698003698 00369800369800369800369800369800215D1D1E1FB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5959697000510003698003698003698003698003698003698003698003698 00369800369800010500318C003698003698003698003698003698003698003698003698003698 011437001846000205001A4B0B0F15DEDEDEFFFFFFFFFFFFFFFFFF000000747576767778767778 767778767778767778767778767778767778767778070707717273767778767778767778767778 767778767778767778767778767778151515656667767778767778767778767778767778767778 7677787677787677783A3A3B363636767778767778767778767778767778767778767778767778 7677784B4C4C262627767778767778767778767778767778767778767778767778767778686969 0505057677787677787677787677787677787677787677787677787677787677780808086F7071 7677787677787677787677787677787677787677787677787677781111116C6D6E767778767778 767778767778767778767778767778767778767778242424515253767778767778767778767778 7677787677787677787677787677784A4A4B1F1F20767778767778767778767778767778767778 7677787677787677785C5C5D141414767778767778767778767778767778767778767778767778 767778767778000000757677767778767778767778767778767778767778767778767778767778 1A1A1A0000006162638F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 40404059595A767778767778767778767778767778767778767778767778767778313133011740 002465002465002465002465002465002465002465002465002465001641000919002465002465 002465002465002465002465002465002465002465002362000000767778767778767778767778 767778767778767778767778767778767778000000002363002465002465002465002465002465 00246500246500246500246500050D00205A002465002465002465002465002465002465002465 002465002465010D25434344767778767778767778767778767778767778767778767778767778 404142000F2C002465002465002465002465002465002465002465002465002465011C4F00040B 002465002465002465002465002465002465002465002465002465002465030303737375767778 76777876777876777876777876777876777876777876777803050901215F002465002465002465 002465002465002465002465002465002465000715011C50002465002465002465002465002465 002465002465002465002465001E56000000010D25012B7A0618398D8D8DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0B0B717273767778767778767778767778767778767778 76777876777876777804060B01215E002465002465002465002465002465002465002465002465 002465000919001B4D002465002465002465002465002465002465002465002465002465001438 282829767778767778767778767778767778767778767778767778767778545556000818002465 002465002465002465002465002465002465002465002465012261000000002465002465002465 00246500246500246500246500246500246500246509090B6C6D6E767778767778767778767778 7677787677787677787677787677780F121800205A002465002465002465002465002465002465 002465002465002465010D2501153B002465002465002465002465002465002465002465002465 002465001948151516767778767778767778767778767778767778767778767778767778636364 00030A002465002465002465002465002465002465002465002465002465002465000002002262 002465002465002465002465002465002465002465002465002465010D26000000001A4C012B7A 0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707222223232323232323232323232323232323232323 232323232323232323080808191919232323232323232323232323232323232323232323232323 232323070707171718232323232323232323232323232323232323232323232323232323101010 080808232323232323232323232323232323232323232323232323232323171717080808222223 2323232323232323232323232323232323232323232323231F1F1F080808222222232323232323 2323232323232323232323232323232323232323230707071A1B1B232323232323232323232323 2323232323232323232323232323230607071A1A1A232323232323232323232323232323232323 2323232323232323230C0C0C0F0F10232323232323232323232323232323232323232323232323 232323131313090A0A2323232323232323232323232323232323232323232323232323231A1A1B 0A0A0B23232323232323232323232323232323232323232323232323232321212109090A222223 2323232323232323232323232323232323232323232323232222220A0A0A5657588F90928F9092 0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4C4E080C160A111F0A111F 0A111F0A111F0A111F0A111F0A111F0A111F0A111F06090C01060E000A1E000A1E000A1E000A1E 000A1E000A1E000A1E000A1E000A1E000510000208000A1E000A1E000A1E000A1E000A1E000A1E 000A1E000A1E000A1E00081A07080A0A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F 0A111F0A111F010307000818000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1D 000107000716000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1D00030A070708 0A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F070A0F010408000A1E000A1E 000A1E000A1E000A1E000A1E000A1E000A1E000A1E000715000209000A1D000A1E000A1E000A1E 000A1E000A1E000A1E000A1E000A1E000A1C06060909101C0A111F0A111F0A111F0A111F0A111F 0A111F0A111F0A111F09111F010307000818000A1E000A1E000A1E000A1E000A1E000A1E000A1E 000A1E000A1D000005000613000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1D 000713061122012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF07070709101D0A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F09111F010307 000817000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E00020A00050E000A1E 000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1D00040E0808090A111F0A111F0A111F 0A111F0A111F0A111F0A111F0A111F0A111F080C15020409000A1D000A1E000A1E000A1E000A1E 000A1E000A1E000A1E000A1E00081A000209000A1D000A1E000A1E000A1E000A1E000A1E000A1E 000A1E000A1E000A1D060608090E190A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F 0A111F04060B00050F000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1D00030A 000207000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E000A1E0006140808080A111F 0A111F0A111F0A111F0A111F0A111F0A111F0A111F0A111F090F1B00020700091C000A1E000A1E 000A1E000A1E000A1E000A1E000A1E000A1E000A1C00020800091B000A1E000A1E000A1E000A1E 000A1E000A1E000A1E000A1E000A1E00040B001233012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFF FFFFFF060606ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B 606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53637376363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698 003698003698003698001234001B4D003698003698003698003698003698003698003698003698 003698001E54010C23003698003698003698003698003698003698003698003698003698003493 000001003698003698003698003698003698003698003698003698003698003698000103003391 00369800369800369800369800369800369800369800369800369802081401266D003698003698 003698003698003698003698003698003698003698000F2D001846003698003698003698003698 003698003698003698003698003698001A4A001337003698003698003698003698003698003698 003698003698003698002770000611003698003698003698003698003698003698003698003698 00369800369800020500318B003698003698003698003698003698003698003698003698003698 00050D002D80003698003698003698003698003698003698003698003698003698010B1D00215C 0036980036980036980036980036980036980036980036980036980024670B172D012B7A012B7A 0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E1014003088003698 00369800369800369800369800369800369800369800369801060F002C7D003698003698003698 003698003698003698003698003698003698000C1F001F5A003698003698003698003698003698 00369800369800369800369800184500102E003698003698003698003698003698003698003698 003698003698002569000B1F003698003698003698003698003698003698003698003698003698 00339200010200369800369800369800369800369800369800369800369800369800369801060F 002A7700369800369800369800369800369800369800369800369800369800091901266C003698 00369800369800369800369800369800369800369800369800102D001947003698003698003698 00369800369800369800369800369800369800215D000A1B003698003698003698003698003698 003698003698003698003698002D8000050F003698003698003698003698003698003698003698 00369800369800369800020500318C003698003698003698003698003698003698003698003698 0036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 99999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF606265001F58003698003698003698003698003698003698003698003698003698001234 001B4D003698003698003698003698003698003698003698003698003698001E54010C23003698 003698003698003698003698003698003698003698003698003493000001003698003698003698 003698003698003698003698003698003698003698000103003391003698003698003698003698 00369800369800369800369800369802091401266D003698003698003698003698003698003698 003698003698003698000F2D001846003698003698003698003698003698003698003698003698 003698001A4A001337003698003698003698003698003698003698003698003698003698002770 00061100369800369800369800369800369800369800369800369800369800369800020500318B 00369800369800369800369800369800369800369800369800369800050D002D80003698003698 003698003698003698003698003698003698003698010B1D00215C003698003698003698003698 0036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698 00369800369800369800369801060F002C7D003698003698003698003698003698003698003698 003698003698000C1F001F5A003698003698003698003698003698003698003698003698003698 00184500102E003698003698003698003698003698003698003698003698003698002569000B1F 003698003698003698003698003698003698003698003698003698003392000102003698003698 00369800369800369800369800369800369800369800369801060F002A77003698003698003698 00369800369800369800369800369800369800091901266C003698003698003698003698003698 00369800369800369800369800102D001947003698003698003698003698003698003698003698 00369800369800215D000A1B003698003698003698003698003698003698003698003698003698 002D8000050F003698003698003698003698003698003698003698003698003698003698000205 00318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D012B7A 012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F9092 8F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698 003698003698003698003698003698003698003698003698001234001B4D003698003698003698 003698003698003698003698003698003698001E54010C23003698003698003698003698003698 003698003698003698003698003493000001003698003698003698003698003698003698003698 003698003698003698000103003391003698003698003698003698003698003698003698003698 00369802091401266D003698003698003698003698003698003698003698003698003698000F2D 001846003698003698003698003698003698003698003698003698003698001A4A001337003698 003698003698003698003698003698003698003698003698002770000611003698003698003698 00369800369800369800369800369800369800369800020500318B003698003698003698003698 00369800369800369800369800369800050D002D80003698003698003698003698003698003698 003698003698003698010B1D00215C003698003698003698003698003698003698003698003698 0036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698003698 01060F002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A 00369800369800369800369800369800369800369800369800369800184500102E003698003698 003698003698003698003698003698003698003698002569000B1F003698003698003698003698 003698003698003698003698003698003392000102003698003698003698003698003698003698 00369800369800369800369801060F002A77003698003698003698003698003698003698003698 00369800369800091901266C003698003698003698003698003698003698003698003698003698 00102D00194700369800369800369800369800369800369800369800369800369800215D000A1B 003698003698003698003698003698003698003698003698003698002D8000050F003698003698 00369800369800369800369800369800369800369800369800020500318C003698003698003698 0036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFF FFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698 003698003698003698003698001234001B4D003698003698003698003698003698003698003698 003698003698001E54010C23003698003698003698003698003698003698003698003698003698 003493000001003698003698003698003698003698003698003698003698003698003698000103 00339100369800369800369800369800369800369800369800369800369802091401266D003698 003698003698003698003698003698003698003698003698000F2D001846003698003698003698 003698003698003698003698003698003698001A4A001337003698003698003698003698003698 003698003698003698003698002770000611003698003698003698003698003698003698003698 00369800369800369800020500318B003698003698003698003698003698003698003698003698 00369800050D002D80003698003698003698003698003698003698003698003698003698010B1D 00215C0036980036980036980036980036980036980036980036980036980024670B172D012B7A 012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088 00369800369800369800369800369800369800369800369800369801060F002C7D003698003698 003698003698003698003698003698003698003698000C1F001F5A003698003698003698003698 00369800369800369800369800369800184500102E003698003698003698003698003698003698 003698003698003698002569000B1F003698003698003698003698003698003698003698003698 003698003392000102003698003698003698003698003698003698003698003698003698003698 01060F002A7700369800369800369800369800369800369800369800369800369800091901266C 00369800369800369800369800369800369800369800369800369800102D001947003698003698 00369800369800369800369800369800369800369800215D000A1B003698003698003698003698 003698003698003698003698003698002D8000050F003698003698003698003698003698003698 00369800369800369800369800020500318C003698003698003698003698003698003698003698 0036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698003698003698 001234001B4D003698003698003698003698003698003698003698003698003698001E54010C23 003698003698003698003698003698003698003698003698003698003493000001003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369802091401266D003698003698003698003698003698 003698003698003698003698000F2D001846003698003698003698003698003698003698003698 003698003698001A4A001337003698003698003698003698003698003698003698003698003698 002770000611003698003698003698003698003698003698003698003698003698003698000205 00318B00369800369800369800369800369800369800369800369800369800050D002D80003698 003698003698003698003698003698003698003698003698010B1D00215C003698003698003698 0036980036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698 00369800369800369800369800369801060F002C7D003698003698003698003698003698003698 003698003698003698000C1F001F5A003698003698003698003698003698003698003698003698 00369800184500102E003698003698003698003698003698003698003698003698003698002569 000B1F003698003698003698003698003698003698003698003698003698003392000102003698 00369800369800369800369800369800369800369800369800369801060F002A77003698003698 00369800369800369800369800369800369800369800091901266C003698003698003698003698 00369800369800369800369800369800102D001947003698003698003698003698003698003698 00369800369800369800215D000A1B003698003698003698003698003698003698003698003698 003698002D8000050F003698003698003698003698003698003698003698003698003698003698 00020500318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D 012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637636365 8F90928F9092000000EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58 003698003698003698003698003698003698003698003698003698001234001B4D003698003698 003698003698003698003698003698003698003698001E54010C22003698003698003698003698 003698003698003698003698003698003493000001003698003698003698003698003698003698 003698003698003698003698000103003391003698003698003698003698003698003698003698 00369800369801091401266D003698003698003698003698003698003698003698003698003698 000F2D001846003698003698003698003698003698003698003698003698003698001A4A001337 003698003698003698003698003698003698003698003698003698002770000611003698003698 00369800369800369800369800369800369800369800369800020500318B003698003698003698 00369800369800369800369800369800369800050D002D80003698003698003698003698003698 003698003698003698003698010B1D00215C003698003698003698003698003698003698003698 0036980036980024670A162C012B7A012B7A0517398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698 00369801060F002C7D003698003698003698003698003698003698003698003698003698000B1F 001F5A00369800369800369800369800369800369800369800369800369800184500102E003698 003698003698003698003698003698003698003698003698002569000B1F003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 00369800369800369800369800369801060F002A77003698003698003698003698003698003698 00369800369800369800091901266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 000A1B003698003698003698003698003698003698003698003698003698002D8000050F003698 00369800369800369800369800369800369800369800369800369800020500318C003698003698 003698003698003698003698003698003698003698091A39001B4D012B7A012B7A0B0E15DEDEDE FFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50A0A0A9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1C1C 747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313132B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51616168A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F 2A2A2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2C2C6363658F9092717274010101CCCCCC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698 003698003698003698003698003698001234001B4D003698003698003698003698003698003698 003698003698003698001E54010C22003698003698003698003698003698003698003698003698 003698003493000001003698003698003698003698003698003698003698003698003698003698 00010300339100369800369800369800369800369800369800369800369800369800061201266D 003698003698003698003698003698003698003698003698003698000F2D001846003698003698 003698003698003698003698003698003698003698001A4A001337003698003698003698003698 003698003698003698003698003698002770000611003698003698003698003698003698003698 00369800369800369800369800010500318B003698003698003698003698003698003698003698 00369800369800040D002D80003698003698003698003698003698003698003698003698003698 00091C00215C003698003698003698003698003698003698003698003698003698002467010C21 012B7A012A78010C23323232FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114 00308800369800369800369800369800369800369800369800369800369800050E002C7D003698 003698003698003698003698003698003698003698003698000A1D001F5A003698003698003698 00369800369800369800369800369800369800184500102D003698003698003698003698003698 003698003698003698003698002569000B1F003698003698003698003698003698003698003698 003698003698003392000102003698003698003698003698003698003698003698003698003698 00369800040D002A77003698003698003698003698003698003698003698003698003698000919 01266C00369800369800369800369800369800369800369800369800369800102D001947003698 00369800369800369800369800369800369800369800369800215D00091A003698003698003698 003698003698003698003698003698003698002D8000050F003698003698003698003698003698 00369800369800369800369800369800010500318C003698003698003698003698003698003698 003698003698003698001130001B4D012B7A00276F000207959595FFFFFFFFFFFFFFFFFF070707 ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161717 8A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5343435636365717274060606000000EEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698003698 003698001234001B4D003698003698003698003698003698003698003698003698003698001E54 010C22003698003698003698003698003698003698003698003698003698003493000001003698 003698003698003698003698003698003698003698003698003698000103003391003698003698 00369800369800369800369800369800369800369800071301266D003698003698003698003698 003698003698003698003698003698000F2D001846003698003698003698003698003698003698 003698003698003698001A4A001337003698003698003698003698003698003698003698003698 003698002770000611003698003698003698003698003698003698003698003698003698003698 00020500318B00369800369800369800369800369800369800369800369800369800050D002D80 003698003698003698003698003698003698003698003698003698000A1D00215C003698003698 003698003698003698003698003698003698003698002467021029002975000A1C0208118B8B8B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698 00369800369800369800369800369800369800050F002C7D003698003698003698003698003698 003698003698003698003698000A1F001F5A003698003698003698003698003698003698003698 00369800369800184500102E003698003698003698003698003698003698003698003698003698 002569000B1F003698003698003698003698003698003698003698003698003698003392000102 00369800369800369800369800369800369800369800369800369800369800050E002A77003698 00369800369800369800369800369800369800369800369800091901266C003698003698003698 00369800369800369800369800369800369800102D001947003698003698003698003698003698 00369800369800369800369800215D00091A003698003698003698003698003698003698003698 003698003698002D8000050F003698003698003698003698003698003698003698003698003698 00369800010500318C003698003698003698003698003698003698003698003698003698011437 001B4D002365000207010305DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 68696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B55D5E5F2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5343435 5B5C5D0606064B4C4C0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265 001F58003698003698003698003698003698003698003698003698003698001234001B4D003698 003698003698003698003698003698003698003698003698001E54010C22003698003698003698 003698003698003698003698003698003698003493000001003698003698003698003698003698 003698003698003698003698003698000103003391003698003698003698003698003698003698 00369800369800369800071301266D003698003698003698003698003698003698003698003698 003698000F2D001846003698003698003698003698003698003698003698003698003698001A4A 001337003698003698003698003698003698003698003698003698003698002770000611003698 00369800369800369800369800369800369800369800369800369800020500318B003698003698 00369800369800369800369800369800369800369800050D002D80003698003698003698003698 003698003698003698003698003698000A1D00215C003698003698003698003698003698003698 003698003698003698002467010F27000A1C0209160517388D8D8DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698 00369800369800050F002C7D003698003698003698003698003698003698003698003698003698 000A1F001F5A00369800369800369800369800369800369800369800369800369800184500102D 003698003698003698003698003698003698003698003698003698002569000B1F003698003698 003698003698003698003698003698003698003698003392000102003698003698003698003698 00369800369800369800369800369800369800050E002A77003698003698003698003698003698 00369800369800369800369800091901266C003698003698003698003698003698003698003698 00369800369800102D001947003698003698003698003698003698003698003698003698003698 00215D00091A003698003698003698003698003698003698003698003698003698002D8000050F 00369800369800369800369800369800369800369800369800369800369800010500318C003698 0036980036980036980036980036980036980036980036980114370019470002070013380B0F15 DEDEDEFFFFFFFFFFFFFFFFFF010101848586868788868788868788868788868788868788868788 868788868788080808818284868788868788868788868788868788868788868788868788868788 18181869696B868788868788868788868788868788868788868788868788868788363737383839 86878886878886878886878886878886878886878886878886878856565829292A868788868788 868788868788868788868788868788868788868788767778060606868788868788868788868788 8687888687888687888687888687888687880808097F8081868788868788868788868788868788 8687888687888687888687881313137C7D7F868788868788868788868788868788868788868788 868788868788252525555556868788868788868788868788868788868788868788868788868788 51515322222386878886878886878886878886878886878886878886878886878868696A161616 868788868788868788868788868788868788868788868788868788868788000000868688868788 8687888687888687888687888687888687888687888687882728280000004B4C4C8F90920C0C0C EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C4E51011C4F002873002873002873 00287300287300287300287300287300287300102F001843002873002873002873002873002873 002873002873002873002873001A4C00091B002873002873002873002873002873002873002873 00287300287300266F000000002873002873002873002873002873002873002873002873002873 002873000000002871002873002873002873002873002873002873002873002873002873000610 002364002873002873002873002873002873002873002873002873002873010C2301153D002873 00287300287300287300287300287300287300287300287301164000102F002873002873002873 00287300287300287300287300287300287300205B00040C002873002873002873002873002873 002873002873002873002873002873000103002770002873002873002873002873002873002873 00287300287300287300030A01266D002873002873002873002873002873002873002873002873 002873000819001D5300287300287300287300287300287300287300287300287300287300215D 000104020916012A790618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 05060901276E00287300287300287300287300287300287300287300287300287300040C01266C 002873002873002873002873002873002873002873002873002873000919011C50002873002873 00287300287300287300287300287300287300287300143A010D25002873002873002873002873 002873002873002873002873002873011D52000919002873002873002873002873002873002873 00287300287300287301266E000000002873002873002873002873002873002873002873002873 00287300287300030A00256A002873002873002873002873002873002873002873002873002873 000817002362002873002873002873002873002873002873002873002873002873010D2701163E 002873002873002873002873002873002873002873002873002873011B4F000714002873002873 00287300287300287300287300287300287300287301216000040B002873002873002873002873 002873002873002873002873002873002873000102002770002873002873002873002873002873 002873002873002873002873010E27000000001338012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF 0808081414141515151515151515151515151515151515151515151515151313140808080E0E0E 1414141414141313131515151515151515151515151515151313130405050A0A0A141414141414 131313141415151515151515151515151515141415020202060606141414141414131313141414 1515151515151515151515151515150A0A0A070707131313141414131314131314151515151515 1515151515151515150D0D0D080808131313141414141414131313151515151515151515151515 1515151313130808080F0F0F141414141414131313151515151515151515151515151515141414 0909090B0B0B141414141414131313141415151515151515151515151515141414030303070707 141414141414131313141414151515151515151515151515151515030303080808141414141414 1313141414141515151515151515151515151515150E0E0E080808131313141414141414131313 151515151515151515151515151515101010090909131313141414141414131313151515151515 1515151515151515151313130101013F40408F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF37393A0305090A0D130A0D130A0D130A0D130A0D130A0D130A0D13 0A0D13090D13000105000104010611010711000610010711020812020812020812020812020812 00010600020600051000061100051001061102081202081202081202081202081200030A000207 070B12070B12070B12080B110A0D130A0D130A0D130A0D130A0D13070A1000020700060F010711 010711000510020812020812020812020812020812020711000105000309000611000611000510 020712020812020812020812020812020712000001000105070B12070B12070B11090C130A0D13 0A0D130A0D130A0D130A0D13000105000206010611010711000610010611020812020812020812 020812020812000209000207000510000611000510000610020812020812020812020812020812 01060E000207060910070B12070B12080B110A0D130A0D130A0D130A0D130A0D13080B11000207 00040C010711010711000510020712020812020812020812020812020711000105000207000611 000611000510010711020812020812020812020812020812000104071021012B7A012B7A061839 8D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00020701060F020812020812 02081202081202081202081202081202081202071100020700030A000611000611000510020712 020812020812020812020812020711000102000207000611000611000510010711020812020812 020812020812020812000002000206000611000611000510010711020812020812020812020812 02081200020900020700051100061100061000061002081202081202081202081202081200040D 00020700051000061100061000061002081202081202081202081202081201060F00020600040B 000611000611000510020812020812020812020812020812020711000105000309000611000611 000510010711020812020812020812020812020711000002000104000611000611000510010711 020812020812020812020812020812000002000207000611000611000510010611020812020812 02081202081202081200040B000207000510000611000611000610020812020812020812020812 02081201060E00020700050E000611000611000510020812020812020812020812020812020710 000000011640012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D 003698003698003698003698003698003698003698003698003698001E54010C23003698003698 003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698 00369800369800369800369802091401266D003698003698003698003698003698003698003698 003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 575758001437003698003698003698003698003698003698003698003698003698002770000611 003698003698003698003698003698003698003698003698003698003698060606A3A4A6B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698 003698003698003698003698003698003698010B1D00215C003698003698003698003698003698 0036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698 00369800369800369801060F002C7D003698003698003698003698003698003698003698003698 003698000C1F001F5A003698003698003698003698003698003698003698003698003698001845 00102E003698003698003698003698003698003698003698003698003698002569000B1F003698 003698003698003698003698003698003698003698003698003392000102003698003698003698 00369800369800369800369800369800369800369801060F002A77003698003698003698003698 00369800369800369800369800369800091901266C003698003698003698003698003698003698 00369800369800369800102D001947003698003698003698003698003698003698003698003698 00369800215D000A1B003698003698003698003698003698003698003698003698003698002D7F 00051000369800369800369800369800369800369800369800369800369800369800020500318C 0036980036980036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A 0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D 1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F9092 0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698 003698003698003698003698003698001E54010C23003698003698003698003698003698003698 003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698003698003698 02091401266D003698003698003698003698003698003698003698003698003698000F2D515253 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698 003698003698003698003698003698003698003698002770000611003698003698003698003698 003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698003698003698 003698003698010B1D00215C003698003698003698003698003698003698003698003698003698 0024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0F111400308800369800369800369800369800369800369800369800369800369801060F 002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A003698 00369800369800369800369800369800369800369800369800184500102E003698003698003698 003698003698003698003698003698003698002569000B1F003698003698003698003698003698 003698003698003698003698003392000102003698003698003698003698003698003698003698 00369800369800369801060F002A77003698003698003698003698003698003698003698003698 00369800091901266C00369800369800369800369800369800369800369800369800369800102D 00194700369800369800369800369800369800369800369800369800369800215D000A1B003698 003698003698003698003698003698003698003698003698002D7F000510003698003698003698 00369800369800369800369800369800369800369800020500318C003698003698003698003698 0036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFF FFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B 606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698003698003698 003698001E54010C23003698003698003698003698003698003698003698003698003698003493 020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391 00369800369800369800369800369800369800369800369800369802091401266D003698003698 003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698003698 003698003698003698002770000611003698003698003698003698003698003698003698003698 003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 06090E002D80003698003698003698003698003698003698003698003698003698010B1D00215C 0036980036980036980036980036980036980036980036980036980024670B172D012B7A012B7A 0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698 00369800369800369800369800369800369800369800369801060F002C7D003698003698003698 003698003698003698003698003698003698000C1F001F5A003698003698003698003698003698 00369800369800369800369800184500102E003698003698003698003698003698003698003698 003698003698002569000B1F003698003698003698003698003698003698003698003698003698 00339200010200369800369800369800369800369800369800369800369800369800369801060F 002A7700369800369800369800369800369800369800369800369800369800091901266C003698 00369800369800369800369800369800369800369800369800102D001947003698003698003698 00369800369800369800369800369800369800215D000A1B003698003698003698003698003698 003698003698003698003698002D7F000510003698003698003698003698003698003698003698 00369800369800369800020500318C003698003698003698003698003698003698003698003698 0036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 99999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D 001B4D003698003698003698003698003698003698003698003698003698001E54010C23003698 003698003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698 00369800369800369800369800369802091401266D003698003698003698003698003698003698 003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5575758001437003698003698003698003698003698003698003698003698003698002770 000611003698003698003698003698003698003698003698003698003698003698060606A3A4A6 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698 003698003698003698003698003698003698003698010B1D00215C003698003698003698003698 0036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698 00369800369800369800369801060F002C7D003698003698003698003698003698003698003698 003698003698000C1F001F5A003698003698003698003698003698003698003698003698003698 00184500102E003698003698003698003698003698003698003698003698003698002569000B1F 003698003698003698003698003698003698003698003698003698003392000102003698003698 00369800369800369800369800369800369800369800369801060F002A77003698003698003698 00369800369800369800369800369800369800091901266C003698003698003698003698003698 00369800369800369800369800102D001947003698003698003698003698003698003698003698 00369800369800215D000A1B003698003698003698003698003698003698003698003698003698 002D7F000510003698003698003698003698003698003698003698003698003698003698000205 00318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D012B7A 012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51E1E1F747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F9092 8F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698 003698003698003698003698003698003698001E54010C23003698003698003698003698003698 003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698003698 00369802091401266D003698003698003698003698003698003698003698003698003698000F2D 515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698 003698003698003698003698003698003698003698003698002770000611003698003698003698 003698003698003698003698003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B506090E002D80003698003698003698003698003698003698 003698003698003698010B1D00215C003698003698003698003698003698003698003698003698 0036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698003698 01060F002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A 00369800369800369800369800369800369800369800369800369800184500102E003698003698 003698003698003698003698003698003698003698002569000B1F003698003698003698003698 003698003698003698003698003698003392000102003698003698003698003698003698003698 00369800369800369800369801060F002A77003698003698003698003698003698003698003698 00369800369800091901266C003698003698003698003698003698003698003698003698003698 00102D00194700369800369800369800369800369800369800369800369800369800215D000A1B 003698003698003698003698003698003698003698003698003698002D7F000510003698003698 00369800369800369800369800369800369800369800369800020500318C003698003698003698 0036980036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFF FFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1F747576 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698003698 003698003698001E54010C23003698003698003698003698003698003698003698003698003698 003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103 00339100369800369800369800369800369800369800369800369800369802091401266D003698 003698003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698003698 003698003698003698003698002770000611003698003698003698003698003698003698003698 003698003698003698060606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B506090E002D80003698003698003698003698003698003698003698003698003698010B1D 00215C0036980036980036980036980036980036980036980036980036980024670B172D012B7A 012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088 00369800369800369800369800369800369800369800369800369801060F002C7D003698003698 003698003698003698003698003698003698003698000C1F001F5A003698003698003698003698 00369800369800369800369800369800184500102E003698003698003698003698003698003698 003698003698003698002569000B1F003698003698003698003698003698003698003698003698 003698003392000102003698003698003698003698003698003698003698003698003698003698 01060F002A7700369800369800369800369800369800369800369800369800369800091901266C 00369800369800369800369800369800369800369800369800369800102D001947003698003698 00369800369800369800369800369800369800369800215D000A1B003698003698003698003698 003698003698003698003698003698002D7F000510003698003698003698003698003698003698 00369800369800369800369800020500318C003698003698003698003698003698003698003698 0036980036980A1C3A001B4D012B7A012B7A080B0FDEDEDEFFFFFFFFFFFFFFFFFF070707ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0B9D9EA0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51B1B1C747576B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51616168A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2A2B2BB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52C2C2C6363658F90928C8D8F070707ACACACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3B3C3D001B4D003698003698003698003698003698003698003698003698003698001E54010C22 003698003698003698003698003698003698003698003698003698003493020202B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698 00369800369800369800369800369800369800061201266D003698003698003698003698003698 003698003698003698003698000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5575758001437003698003698003698003698003698003698003698003698003698 002770000611003698003698003698003698003698003698003698003698003698003698050606 A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505080D002D80003698 00369800369800369800369800369800369800369800369800091C00215C003698003698003698 003698003698003698003698003698003698002467010C22012B7A012B7A0011323E3E3EFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698 00369800369800369800369800369800050E002C7D003698003698003698003698003698003698 003698003698003698000A1E001F5A003698003698003698003698003698003698003698003698 00369800184500102D003698003698003698003698003698003698003698003698003698002569 000B1F003698003698003698003698003698003698003698003698003698003392000102003698 00369800369800369800369800369800369800369800369800369800040D002A77003698003698 00369800369800369800369800369800369800369800091901266C003698003698003698003698 00369800369800369800369800369800102D001947003698003698003698003698003698003698 00369800369800369800215D00091A003698003698003698003698003698003698003698003698 003698002D7F000510003698003698003698003698003698003698003698003698003698003698 00010500318C003698003698003698003698003698003698003698003698003698001130001B4D 012B7A002872000000DCDCDCFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51D1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5333334636365 838485111212030303EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698 003698003698003698003698003698003698003698001E54010C22003698003698003698003698 003698003698003698003698003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000103003391003698003698003698003698003698003698003698 00369800369800071301266D003698003698003698003698003698003698003698003698003698 000F2D515253B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437 003698003698003698003698003698003698003698003698003698002770000611003698003698 003698003698003698003698003698003698003698003698050606A3A4A6B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B505080E002D80003698003698003698003698003698 003698003698003698003698000A1D00215C003698003698003698003698003698003698003698 003698003698002467010F28012B7A001335000308818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698 00369800050F002C7D003698003698003698003698003698003698003698003698003698000B1F 001F5A00369800369800369800369800369800369800369800369800369800184500102D003698 003698003698003698003698003698003698003698003698002569000B1F003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 00369800369800369800369800369800050E002A77003698003698003698003698003698003698 00369800369800369800091901266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 00091A003698003698003698003698003698003698003698003698003698002D7F000510003698 00369800369800369800369800369800369800369800369800369800010500318C003698003698 003698003698003698003698003698003698003698011436001B4D002872000714000105DEDEDE FFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51D1E1E 747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434343B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313232B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51617178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E 2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53434356061621212122F2F300C0C0CEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666686869B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53B3C3D001B4D003698003698003698003698003698003698 003698003698003698001E54010C22003698003698003698003698003698003698003698003698 003698003493020202B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 00010300339100369800369800369800369800369800369800369800369800369800071301266D 003698003698003698003698003698003698003698003698003698000F2D515253B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5575758001437003698003698003698003698 003698003698003698003698003698002770000611003698003698003698003698003698003698 003698003698003698003698050606A3A4A6B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B505080E002D80003698003698003698003698003698003698003698003698003698 000A1D00215C003698003698003698003698003698003698003698003698003698002467020F29 00133501050B0515348D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114 00308800369800369800369800369800369800369800369800369800369800050F002C7D003698 003698003698003698003698003698003698003698003698000B1F001F5A003698003698003698 00369800369800369800369800369800369800184500102D003698003698003698003698003698 003698003698003698003698002569000B1F003698003698003698003698003698003698003698 003698003698003392000102003698003698003698003698003698003698003698003698003698 00369800050E002A77003698003698003698003698003698003698003698003698003698000919 01266C00369800369800369800369800369800369800369800369800369800102D001947003698 00369800369800369800369800369800369800369800369800215D00091A003698003698003698 003698003698003698003698003698003698002D7F000510003698003698003698003698003698 00369800369800369800369800369800010500318C003698003698003698003698003698003698 003698003698003698011437001A4B000714000C200B0F15DEDEDEFFFFFFFFFFFFFFFFFF060606 AAABADAFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B20B0B0B9D9D9FAFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B21C1C1D737475AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2424243414142AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B268686A303031AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B298999B0A0A0AAFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B20B0B0B969698AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2161616 898A8BAFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B22A2B2B5F6061AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B25C5D5E29292AAFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B288898A1B1B1BAFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2000000AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B22E2F2F0909092F2F308F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF646464676769AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B23B3C3D001B4C003596003596003596003596003596003596003596003596003596001D54 010B21003596003596003596003596003596003596003596003596003596003391020202AFB0B2 AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2000103013390003596003596 00359600359600359600359600359600359600359600061201266D003596003596003596003596 003596003596003596003596003596000E2A515152AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2 AFB0B2AFB0B2AFB0B2575758001336003596003596003596003596003596003596003596003596 00359600276F000510003596003596003596003596003596003596003596003596003596003596 050506A2A3A5AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B2AFB0B205080E002D7F 00359600359600359600359600359600359600359600359600359600091C00205C003596003596 00359600359600359600359600359600359600359600246600071301050B01266D0618398D8D8D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF090B0F003087003596003596003596 00359600359600359600359600359600359600050E002C7C003596003596003596003596003596 003596003596003596003596000B1E001F59003596003596003596003596003596003596003596 003596003596001743000F2B003596003596003596003596003596003596003596003596003596 002568000B1F003596003596003596003596003596003596003596003596003596013290000102 00359600359600359600359600359600359600359600359600359600359600040C002A77003596 00359600359600359600359600359600359600359600359600091900266B003596003596003596 003596003596003596003596003596003596000F2D001947003596003596003596003596003596 00359600359600359600359600215D000819003596003596003596003596003596003596003596 003596003596002C7D000510003596003596003596003596003596003596003596003596003596 00359600010400318C003596003596003596003596003596003596003596003596003596011335 00040B000C20012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF020303000000000000000000000000 000000000000000000000000000000000000060606000000000000000000000000000000000000 000000000000000000000000070707000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000070707000000000000 000000000000000000000000000000000000000000000000080808000000000000000000000000 000000000000000000000000000000000000020202000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000010101000000000000000000000000000000000000000000000000000000000000000000 4142428F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4C4D 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000002000000000000000000000000000000000000000000 000000000000000000000207000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000050505000000000000000000 000000000000000000000000000000000000000000000206000000000000000000000000000000 000000000000000000000000000000000104000000000000000000000000000000000000000000 000000000000000000000000040C18002875012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF000105000000000000000000000000000000000000000000000000 000000000000000206000000000000000000000000000000000000000000000000000000000000 000104000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000206000000000000000000000000000000000000 000000000000000000000000000207000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000104000000000000 00000000000000000000000000000000000000000000000000000000040B012B7A012B7A0B0F15 DEDEDEFFFFFFFFFFFFFFFFFF030303ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50809099D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C1C1D747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A313132B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B080808B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50A0A0A969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 5D5D5E2A2A2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0C EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D5F62001F58003698003698003698 003698003698003698003698003698003698001234001B4D003698003698003698003698003698 003698003698003698003698001E54010C22003698003698003698003698003698003698003698 003698003698003493000001003698003698003698003698003698003698003698003698003698 003698000001003391003698003698003698003698003698003698003698003698003698020914 01266D003698003698003698003698003698003698003698003698003698000F2D001846003698 003698003698003698003698003698003698003698003698001A4A001337003698003698003698 003698003698003698003698003698003698002770000611003698003698003698003698003698 00369800369800369800369800369800020500318B003698003698003698003698003698003698 00369800369800369800040B002D80003698003698003698003698003698003698003698003698 003698010B1D00215C003698003698003698003698003698003698003698003698003698002467 0B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0F111400308800369800369800369800369800369800369800369800369800369801060F002C7D 003698003698003698003698003698003698003698003698003698000C1F001F5A003698003698 00369800369800369800369800369800369800369800184500102E003698003698003698003698 003698003698003698003698003698002569000B1F003698003698003698003698003698003698 003698003698003698003392000102003698003698003698003698003698003698003698003698 00369800369801060F002A77003698003698003698003698003698003698003698003698003698 00091901266C00369800369800369800369800369800369800369800369800369800102D001947 00369800369800369800369800369800369800369800369800369800215D000A1B003698003698 003698003698003698003698003698003698003698002D7F000510003698003698003698003698 00369800369800369800369800369800369800020500318C003698003698003698003698003698 0036980036980036980036980A1A38001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF 070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698 003698003698001234001B4D003698003698003698003698003698003698003698003698003698 001E54010C23003698003698003698003698003698003698003698003698003698003493000001 003698003698003698003698003698003698003698003698003698003698000103003391003698 00369800369800369800369800369800369800369800369802091401266D003698003698003698 003698003698003698003698003698003698000F2D001846003698003698003698003698003698 003698003698003698003698001A4A001337003698003698003698003698003698003698003698 003698003698002770000611003698003698003698003698003698003698003698003698003698 00369800020500318B00369800369800369800369800369800369800369800369800369800050D 002D80003698003698003698003698003698003698003698003698003698010B1D00215C003698 0036980036980036980036980036980036980036980036980024670B172D012B7A012B7A061839 8D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698 00369800369800369800369800369800369800369801060F002C7D003698003698003698003698 003698003698003698003698003698000C1F001F5A003698003698003698003698003698003698 00369800369800369800184500102E003698003698003698003698003698003698003698003698 003698002569000B1F003698003698003698003698003698003698003698003698003698003392 00010200369800369800369800369800369800369800369800369800369800369801060F002A77 00369800369800369800369800369800369800369800369800369800091901266C003698003698 00369800369800369800369800369800369800369800102D001947003698003698003698003698 00369800369800369800369800369800215D000A1B003698003698003698003698003698003698 003698003698003698002D7F000510003698003698003698003698003698003698003698003698 00369800369800020500318C003698003698003698003698003698003698003698003698003698 0A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 606265001F58003698003698003698003698003698003698003698003698003698001234001B4D 003698003698003698003698003698003698003698003698003698001E54010C23003698003698 003698003698003698003698003698003698003698003493000001003698003698003698003698 003698003698003698003698003698003698000103003391003698003698003698003698003698 00369800369800369800369802091401266D003698003698003698003698003698003698003698 003698003698000F2D001846003698003698003698003698003698003698003698003698003698 001A4A001337003698003698003698003698003698003698003698003698003698002770000611 00369800369800369800369800369800369800369800369800369800369800020500318B003698 00369800369800369800369800369800369800369800369800050D002D80003698003698003698 003698003698003698003698003698003698010B1D00215C003698003698003698003698003698 0036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698 00369800369800369801060F002C7D003698003698003698003698003698003698003698003698 003698000C1F001F5A003698003698003698003698003698003698003698003698003698001845 00102E003698003698003698003698003698003698003698003698003698002569000B1F003698 003698003698003698003698003698003698003698003698003392000102003698003698003698 00369800369800369800369800369800369800369801060F002A77003698003698003698003698 00369800369800369800369800369800091901266C003698003698003698003698003698003698 00369800369800369800102D001947003698003698003698003698003698003698003698003698 00369800215D000A1B003698003698003698003698003698003698003698003698003698002D7F 00051000369800369800369800369800369800369800369800369800369800369800020500318C 0036980036980036980036980036980036980036980036980036980A1C3A001B4D012B7A012B7A 0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243 434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D 1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F9092 0C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698 003698003698003698003698003698003698003698001234001B4D003698003698003698003698 003698003698003698003698003698001E54010C23003698003698003698003698003698003698 003698003698003698003493000001003698003698003698003698003698003698003698003698 003698003698000103003391003698003698003698003698003698003698003698003698003698 02091401266D003698003698003698003698003698003698003698003698003698000F2D001846 003698003698003698003698003698003698003698003698003698001A4A001337003698003698 003698003698003698003698003698003698003698002770000611003698003698003698003698 00369800369800369800369800369800369800020500318B003698003698003698003698003698 00369800369800369800369800050D002D80003698003698003698003698003698003698003698 003698003698010B1D00215C003698003698003698003698003698003698003698003698003698 0024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF0F111400308800369800369800369800369800369800369800369800369800369801060F 002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A003698 00369800369800369800369800369800369800369800369800184500102E003698003698003698 003698003698003698003698003698003698002569000B1F003698003698003698003698003698 003698003698003698003698003392000102003698003698003698003698003698003698003698 00369800369800369801060F002A77003698003698003698003698003698003698003698003698 00369800091901266C00369800369800369800369800369800369800369800369800369800102D 00194700369800369800369800369800369800369800369800369800369800215D000A1B003698 003698003698003698003698003698003698003698003698002D7F000510003698003698003698 00369800369800369800369800369800369800369800020500318C003698003698003698003698 0036980036980036980036980036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFF FFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B 9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B 606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698003698 003698003698003698001234001B4D003698003698003698003698003698003698003698003698 003698001E54010C23003698003698003698003698003698003698003698003698003698003493 000001003698003698003698003698003698003698003698003698003698003698000103003391 00369800369800369800369800369800369800369800369800369802091401266D003698003698 003698003698003698003698003698003698003698000F2D001846003698003698003698003698 003698003698003698003698003698001A4A001337003698003698003698003698003698003698 003698003698003698002770000611003698003698003698003698003698003698003698003698 00369800369800020500318B003698003698003698003698003698003698003698003698003698 00050D002D80003698003698003698003698003698003698003698003698003698010B1D00215C 0036980036980036980036980036980036980036980036980036980024670B172D012B7A012B7A 0618398D8D8DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698 00369800369800369800369800369800369800369800369801060F002C7D003698003698003698 003698003698003698003698003698003698000C1F001F5A003698003698003698003698003698 00369800369800369800369800184500102E003698003698003698003698003698003698003698 003698003698002569000B1F003698003698003698003698003698003698003698003698003698 00339200010200369800369800369800369800369800369800369800369800369800369801060F 002A7700369800369800369800369800369800369800369800369800369800091901266C003698 00369800369800369800369800369800369800369800369800102D001947003698003698003698 00369800369800369800369800369800369800215D000A1B003698003698003698003698003698 003698003698003698003698002D7F000510003698003698003698003698003698003698003698 00369800369800369800020500318C003698003698003698003698003698003698003698003698 0036980A1C3A001B4D012B7A012B7A0B0F15DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 99999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C 969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B53737386363658F90928F90920C0C0CEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF606265001F58003698003698003698003698003698003698003698003698003698001234 001B4D003698003698003698003698003698003698003698003698003698001E54010C23003698 003698003698003698003698003698003698003698003698003493000001003698003698003698 003698003698003698003698003698003698003698000103003391003698003698003698003698 00369800369800369800369800369802091401266D003698003698003698003698003698003698 003698003698003698000F2D001846003698003698003698003698003698003698003698003698 003698001A4A001337003698003698003698003698003698003698003698003698003698002770 00061100369800369800369800369800369800369800369800369800369800369800020500318B 00369800369800369800369800369800369800369800369800369800050D002D80003698003698 003698003698003698003698003698003698003698010B1D00215C003698003698003698003698 0036980036980036980036980036980024670B172D012B7A012B7A0618398D8D8DFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698 00369800369800369800369801060F002C7D003698003698003698003698003698003698003698 003698003698000C1F001F5A003698003698003698003698003698003698003698003698003698 00184500102E003698003698003698003698003698003698003698003698003698002569000B1F 003698003698003698003698003698003698003698003698003698003392000102003698003698 00369800369800369800369800369800369800369800369801060F002A77003698003698003698 00369800369800369800369800369800369800091901266C003698003698003698003698003698 00369800369800369800369800102D001947003698003698003698003698003698003698003698 00369800369800215D000A1B003698003698003698003698003698003698003698003698003698 002D7F000510003698003698003698003698003698003698003698003698003698003698000205 00318C0036980036980036980036980036980036980036980036980036980A1C3A001B4D012B7A 012B7A0A0D13DEDEDEFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658F9092 8F9092111111DEDEDEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698 003698003698003698003698003698003698003698003698001234001B4D003698003698003698 003698003698003698003698003698003698001E54010C23003698003698003698003698003698 003698003698003698003698003493000001003698003698003698003698003698003698003698 003698003698003698000103003391003698003698003698003698003698003698003698003698 00369802091401266D003698003698003698003698003698003698003698003698003698000F2D 001846003698003698003698003698003698003698003698003698003698001A4A001337003698 003698003698003698003698003698003698003698003698002770000611003698003698003698 00369800369800369800369800369800369800369800020500318B003698003698003698003698 00369800369800369800369800369800050D002D80003698003698003698003698003698003698 003698003698003698010B1D00215C003698003698003698003698003698003698003698003698 0036980024670B172D012B7A012B7A071A3D818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698003698 01060F002C7D003698003698003698003698003698003698003698003698003698000C1F001F5A 00369800369800369800369800369800369800369800369800369800184500102E003698003698 003698003698003698003698003698003698003698002569000B1F003698003698003698003698 003698003698003698003698003698003392000102003698003698003698003698003698003698 00369800369800369800369801060F002A77003698003698003698003698003698003698003698 00369800369800091901266C003698003698003698003698003698003698003698003698003698 00102D00194700369800369800369800369800369800369800369800369800369800215D000A1B 003698003698003698003698003698003698003698003698003698002D7F000510003698003698 00369800369800369800369800369800369800369800369800020500318C003698003698003698 0036980036980036980036980036980036980A1C3A001B4D012B7A002A77000000E2E2E2FFFFFF FFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 2B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53737386363658A8B8D29292A585858FDFDFDFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58003698003698003698003698003698 003698003698003698003698001234001B4D003698003698003698003698003698003698003698 003698003698001E54010C23003698003698003698003698003698003698003698003698003698 003493000001003698003698003698003698003698003698003698003698003698003698000103 00339100369800369800369800369800369800369800369800369800369802091401266D003698 003698003698003698003698003698003698003698003698000F2D001846003698003698003698 003698003698003698003698003698003698001A4A001337003698003698003698003698003698 003698003698003698003698002770000611003698003698003698003698003698003698003698 00369800369800369800020500318B003698003698003698003698003698003698003698003698 00369800050D002D80003698003698003698003698003698003698003698003698003698010B1D 00215C0036980036980036980036980036980036980036980036980036980024670B172D012B7A 021C4C111316DCDCDCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088 00369800369800369800369800369800369800369800369800369801060F002C7D003698003698 003698003698003698003698003698003698003698000C1F001F5A003698003698003698003698 00369800369800369800369800369800184500102E003698003698003698003698003698003698 003698003698003698002569000B1F003698003698003698003698003698003698003698003698 003698003392000102003698003698003698003698003698003698003698003698003698003698 01060F002A7700369800369800369800369800369800369800369800369800369800091901266C 00369800369800369800369800369800369800369800369800369800102D001947003698003698 00369800369800369800369800369800369800369800215D000A1B003698003698003698003698 003698003698003698003698003698002D7F000510003698003698003698003698003698003698 00369800369800369800369800020500318C003698003698003698003698003698003698003698 0036980036980A1C3A001B4D002A7709162C7D8186FFFFFFFFFFFFFFFFFFFFFFFF070707ABABAD B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5424243434344B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B568696A323233B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B599999B0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0C0C0C969799B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B55D5D5E2B2B2CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B537373862626429292A585858FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF606265001F58003698003698003698003698003698003698003698003698003698 001234001B4D003698003698003698003698003698003698003698003698003698001E54010C23 003698003698003698003698003698003698003698003698003698003493000001003698003698 003698003698003698003698003698003698003698003698000103003391003698003698003698 00369800369800369800369800369800369802091401266D003698003698003698003698003698 003698003698003698003698000F2D001846003698003698003698003698003698003698003698 003698003698001A4A001337003698003698003698003698003698003698003698003698003698 002770000611003698003698003698003698003698003698003698003698003698003698000205 00318B00369800369800369800369800369800369800369800369800369800050D002D80003698 003698003698003698003698003698003698003698003698010B1D00215C003698003698003698 0036980036980036980036980036980036980024670B172D021C4C111316DCDCDCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698 00369800369800369800369800369801060F002C7D003698003698003698003698003698003698 003698003698003698000C1F001F5A003698003698003698003698003698003698003698003698 00369800184500102E003698003698003698003698003698003698003698003698003698002569 000B1F003698003698003698003698003698003698003698003698003698003392000102003698 00369800369800369800369800369800369800369800369800369801060F002A77003698003698 00369800369800369800369800369800369800369800091901266C003698003698003698003698 00369800369800369800369800369800102D001947003698003698003698003698003698003698 00369800369800369800215D000A1B003698003698003698003698003698003698003698003698 003698002D7F000510003698003698003698003698003698003698003698003698003698003698 00020500318C0036980036980036980036980036980036980036980036980036980A1C3A001A4C 09162C424447FCFCFCFFFFFFFFFFFFFFFFFFFFFFFF070707ABABADB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50B0B0B9D9EA0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51E1E1E747576B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5424243424343B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B568696A 313232B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B599999B0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B50C0C0C969799B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51717178A8A8CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B52B2B2B606061B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B55D5D5E2A2A2BB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B58A8B8D1B1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000AFB0B2B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636361D1D1D 585858FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF606265001F58 003698003698003698003698003698003698003698003698003698001234001B4D003698003698 003698003698003698003698003698003698003698001E54010C22003698003698003698003698 003698003698003698003698003698003493000001003698003698003698003698003698003698 003698003698003698003698000103003391003698003698003698003698003698003698003698 00369800369802091401266D003698003698003698003698003698003698003698003698003698 000F2D001846003698003698003698003698003698003698003698003698003698001A4A001337 003698003698003698003698003698003698003698003698003698002770000611003698003698 00369800369800369800369800369800369800369800369800020500318B003698003698003698 00369800369800369800369800369800369800050D002D80003698003698003698003698003698 003698003698003698003698010B1D00215C003698003698003698003698003698003698003698 00369800369800246708101F111316DCDCDCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0F1114003088003698003698003698003698003698003698003698003698 00369801060F002C7D003698003698003698003698003698003698003698003698003698000C1F 001F5A00369800369800369800369800369800369800369800369800369800184500102D003698 003698003698003698003698003698003698003698003698002569000B1F003698003698003698 003698003698003698003698003698003698003392000102003698003698003698003698003698 00369800369800369800369800369801060E002A77003698003698003698003698003698003698 00369800369800369800091901266C003698003698003698003698003698003698003698003698 00369800102D00194700369800369800369800369800369800369800369800369800369800215D 00091A003698003698003698003698003698003698003698003698003698002D7F000510003698 00369800369800369800369800369800369800369800369800369800020500318C003698003698 0036980036980036980036980036980036980036980A1C3A070F1F424447FAFAFAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF0000001717171C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1C1C1C0404040808081C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C080808 0000001C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C0000000000001A1A1B 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C0A0A0A0000001818191C1C1C1C1C1C 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1515150000001818181C1C1C1C1C1C1C1C1C1C1C1C 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C0606060606061C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1C1C1C1C1C1C1C1C1C0808080000001B1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C 1C1C1C0303030000001B1B1B1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C000000 0000001A1B1B1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C121212000000191919 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1818180000001717171C1C1C1C1C1C 1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1B1B1B0000007B7B7BFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85878A0000000C11190C11190C11190C1119 0C11190C11190C11190C11190C11190000000000000B10180C11190C11190C11190C11190C1119 0C11190C11190C11190000000000000A0F180C11190C11190C11190C11190C11190C11190C1119 0C1119090D14000000090E160C11190C11190C11190C11190C11190C11190C11190C11190C1119 00000001050C0C11190C11190C11190C11190C11190C11190C11190C11190C1019000207000000 0C11190C11190C11190C11190C11190C11190C11190C11190C11190000000000000B10190C1119 0C11190C11190C11190C11190C11190C11190C11190000000000000A0F180C11190C11190C1119 0C11190C11190C11190C11190C11190203050000000A0F170C11190C11190C11190C11190C1119 0C11190C11190C11190B0F1600000204070D0C11190C11190C11190C11190C11190C11190C1119 0C11190C10190001050102050C11190C11190C11190C11190C11190C11190C11190C11190C1119 0002050000000C10190C11190C11190C11190C11190C11190C11190C11190C1119000000000000 E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F1012 06090E0C11190C11190C11190C11190C11190C11190C11190C11190C11190002060102030C1119 0C11190C11190C11190C11190C11190C11190C11190C11190002040000000B10190C11190C1119 0C11190C11190C11190C11190C11190C11190000000000000B10180C11190C11190C11190C1119 0C11190C11190C11190C111904070B000000090E170C11190C11190C11190C11190C11190C1119 0C11190C1119090D14000000090E160C11190C11190C11190C11190C11190C11190C11190C1119 0B10180002060000000C11190C11190C11190C11190C11190C11190C11190C11190C1119000207 0000000B10190C11190C11190C11190C11190C11190C11190C11190C11190000000000000B1019 0C11190C11190C11190C11190C11190C11190C11190C1119000001000000090E170C11190C1119 0C11190C11190C11190C11190C11190C11190A0F16000000060B140C11190C11190C11190C1119 0C11190C11190C11190C11190B0F1600000104070D0C11190C11190C11190C11190C11190C1119 0C11190C11190C11190000000D0E0EFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBBBBBBBD8D8D8DBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBC5C5C5DBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBB1B1B1DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBB2B2B2DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBB3B3B3DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD6D6D6 DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADACECECEDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD5D5D5DBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBE3E3E3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFCFCFCDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBD4D4D4DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDCDCDCDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBB3B3B3DADADADBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBD5D5D5DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD5D5D5DBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD9D9D9DBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBF9F9F9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F1F1DBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD5D5D5DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBD4D4D4D0D0D0DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBD5D5D5DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBD4D4D4CECECEDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDADADADBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBB9B9B9DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBACACACDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBC9C9C9 FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D1B4B4B4B4B4B4F4F4F4FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D19F9F9FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6B5B5B5B4B4B4 CECECEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF303030191919393939D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF9C9C9C848484FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF4141415B5B5BFFFFFFFFFFFFFFFFFFF6F6F6B9B9B9858585A2A2A2E2E2E2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C69292927E7E7E A5A5A5F7F7F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6AAAAAA7F7F7F919191 D6D6D6FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0B0B0000000363636767676FFFFFFFFFFFFF6F6F6 AAAAAA7F7F7F919191D6D6D6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFF474747272727FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3D3D3000000 B3B3B3FFFFFFFFFFFFEEEEEE3535350707073D3D3D1B1B1B0E0E0EC3C3C3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF7F7F74D4D4D0202023030304A4A4A1A1A1AACACACFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFDDDDDD1818180A0A0A292929080808040404A2A2A2FFFFFFFFFFFF FFFFFF282828767676FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFDDDDDD1818180A0A0A292929080808040404 A2A2A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858 343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFEFEFE FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C111111F9F9F9FFFFFFFFFFFF616161 141414E2E2E2FFFFFFF7F7F7353535242424FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 686868121212C9C9C9FFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D1D1D1898989F4F4F4FFFFFFE1E1E1151515141414FFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000 F3F3F3FFFFFFFFFFFFD1D1D1898989F4F4F4FFFFFFE1E1E1151515141414FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FBFBFBA5A5A5858585 BABABAFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECECA2A2A2808080959595 DCDCDCFFFFFFFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFFBABABA868686 8F8F8FDEDEDEFFFFFFFFFFFF585858343434FFFFFFFFFFFFC4C4C4B6B6B6FFFFFFFFFFFFFFFFFF F5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFD7D7D79797978C8C8CC2C2C2FFFFFF FFFFFFFFFFFFFFFFFF2E2E2E5C5C5CFFFFFFFFFFFFF5F5F50D0D0D7B7B7BFFFFFFFFFFFFFFFFFF A4A4A4000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9E9E90606068C8C8CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5C5C5C000000EDEDEDFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC A2A2A2808080959595DCDCDCFFFFFFFFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C000000EDEDEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5858582424243434342323232B2B2B000000636363FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFC8C8C89B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9B9BCCCCCCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD1D1D10B0B0B2A2A2A505050242424060606C0C0C0FFFFFFFFFFFF FFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFF6A6A6A0F0F0F5B5B5B464646242424FFFFFFFFFFFF 585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFFDEDEDE2424241212123F3F3F151515 292929FFFFFFFFFFFF939393060606444444343434000000666666FFFFFFFFFFFFF5F5F5030303 808080FFFFFFFFFFFFCBCBCB000000B4B4B4FFFFFFFFFFFFFFFFFFD5D5D5000000A2A2A2FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA000000E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4A4A0A0A0AFCFCFC FFFFFFFFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE2424241212123F3F3F 151515292929FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C89B9B9B9B9B9B9B9B9B9B9B9B9B9B9B 9B9B9BCCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D10B0B0B2A2A2A505050242424060606 C0C0C0FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 4A4A4A0A0A0AFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5858580000007A7A7AFEFEFEFFFFFF7C7C7C000000CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7C7C7C262626262626262626262626262626262626868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626535353FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFF FFFFFFF6F6F60303039E9E9EFFFFFFFFFFFFECECECFFFFFFFFFFFF585858343434FFFFFFFFFFFF 585858343434FFFFFFFFFFFF5050501B1B1BEAEAEAFFFFFFF7F7F78E8E8EFFFFFFDADADA040404 9A9A9AFFFFFFFFFFFFA0A0A0000000C0C0C0FFFFFFCCCCCC0000009C9C9CFFFFFFFFFFFFB4B4B4 000000C7C7C7FFFFFFFFFFFFFFFFFFEAEAEA0000008F8F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 8282820202027C7C7C2929290C0C0C2A2A2A818181FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E50707075C5C5CFFFFFFFFFFFFFFFFFFFFFFFF101010 747474FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5050501B1B1BEAEAEAFFFFFFF7F7F78E8E8EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7C7C7C262626262626262626262626262626262626868686FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE3E3E3C3C3C3FFFFFFFFFFFFFAFAFA262626535353FFFFFFFFFFFFADADAD 000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E50707075C5C5CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858582C2C2CFFFFFFFFFFFF FFFFFFEBEBEB000000828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858353535FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFDFDFD0F0F0F4F4F4F F1F1F1FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFAFAFA 030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8383830E0E0EFEFEFEFFFFFFFFFFFFF4F4F4 060606808080FFFFFFB9B9B9000000B8B8B8FFFFFFFFFFFFA7A7A7000000CDCDCDFFFFFFFFFFFF FFFFFFF1F1F1000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF747474000000525252ABABAB BDBDBD767676000000878787FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF5353530D0D0DE2E2E2FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FAFAFA030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF585858353535FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF5353530D0D0DE2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF0F0F0F696969 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C25B5B5B3434342222220C0C0C323232FFFFFF FFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFB1B1B11010100E0E0E6C6C6CE7E7E7FFFFFF FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFDADADA0000009C9C9CFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5F5F5F0101010D0D0D0D0D0D0D0D0D0D0D0D010101747474FFFFFFB0B0B0 000000C4C4C4FFFFFFFFFFFFB8B8B8000000BEBEBEFFFFFFFFFFFFFFFFFFE8E8E80000009B9B9B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797979010101FBFBFBFFFFFFFFFFFFFFFFFF393939313131 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858585020202ADADADFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDADADA0000009C9C9CFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C25B5B5B343434222222 0C0C0C323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF858585 020202ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858343434FFFFFFFFFFFFFFFFFFFFFFFF080808787878FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF676767040404040404040404040404040404040404727272FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB8B8B80303036F6F6FC2C2C2D2D2D24C4C4C323232FFFFFFFFFFFFFFFFFF2D2D2D737373 FFFFFFFFFFFFFFFFFFFFFFFFF2F2F29494941A1A1A1D1D1DF1F1F1FFFFFF585858343434FFFFFF FFFFFF585858343434FFFFFFDDDDDD000000A0A0A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF676767 171717E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2FAFAFAFFFFFFBEBEBE000000A9A9A9FFFFFFFFFFFF CCCCCC000000A4A4A4FFFFFFFFFFFFFFFFFFC9C9C9000000B4B4B4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF8D8D8D000000E9E9E9FFFFFFFFFFFFFFFFFF595959212121FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF9F9F9F010101929292FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1F1F1F4B4B4BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD000000A0A0A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF676767040404040404040404040404040404040404727272FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB8B8B80303036F6F6FC2C2C2D2D2D24C4C4C323232FFFFFFFFFFFF ADADAD000000F3F3F3FFFFFFFFFFFFFFFFFFFFFFFF9F9F9F010101929292FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858581B1B1BEDEDED FFFFFFFFFFFFCBCBCB000000A0A0A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDBDBDBDBDBDBD BDBDBDBDBDBDBDBDBDBDBDBDE0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF616161222222FFFFFF FFFFFFFFFFFF595959323232FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC6C6C6000000BEBEBEFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFF FBFBFB060606686868FFFFFFFFFFFFFFFFFFFBFBFBFFFFFF8D8D8D030303E5E5E5FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD8D8D80000008D8D8DFFFFFFFFFFFFFAFAFA1313135D5D5DFFFFFF FFFFFFFFFFFF7E7E7E0D0D0DF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBDBD000000AAAAAA FFFFFFFFFFFFFFFFFF2A2A2A494949FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACACAC 030303818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD050505656565FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFBFBFB060606686868FFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DDDDDDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDE0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 616161222222FFFFFFFFFFFFFFFFFF595959323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFF FFFFFFFFFFFFACACAC030303818181FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5858580404042E2E2EBABABACBCBCB313131141414 F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777020202BCBCBCF1F1F1919191040404323232 FFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFCFCFCF828282E3E3E3F7F7F7828282030303 E1E1E1FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF6969690707079B9B9B DCDCDCA9A9A9212121FBFBFBEDEDED111111414141D2D2D2F5F5F5DCDCDC919191DDDDDDFFFFFF FDFDFD0B0B0B707070FFFFFFFFFFFFFFFFFF717171020202969696DFDFDFA8A8A80B0B0B737373 FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFCFCFC212121252525C8C8C8DFDFDF717171000000 BCBCBCFFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFC6C6C60606063B3B3BB7B7B7B7B7B7B7B7B7 B7B7B7DCDCDCFFFFFFFFFFFFE6E6E6000000959595FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF696969070707 9B9B9BDCDCDCA9A9A9212121FBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777020202BCBCBCF1F1F1 919191040404323232FFFFFFFFFFFFADADAD000000F3F3F3FFFFFFFFFFFFC6C6C60606063B3B3B B7B7B7B7B7B7B7B7B7B7B7B7DCDCDCFFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5B5B5B5E5E5E6E6E6E030303000000232323CBCBCBFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFECECEC3A3A3A000000020202414141747474353535FFFFFFFFFFFFFFFFFF2D2D2D 737373FFFFFFFFFFFFE1E1E12A2A2A0000000000001212129E9E9EFFFFFFFFFFFF5B5B5B383838 FFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFF2F2F25959590404040000000D0D0D7F7F7FFFFFFF FFFFFFCACACA313131000000000000020202363636E2E2E2FFFFFFFFFFFF454545373737FFFFFF FFFFFFFFFFFFFBFBFB6565650B0B0B000000121212727272FEFEFEFFFFFFFFFFFF919191000000 D5D5D5FFFFFFFFFFFFD1D1D12C2C2C0000000000001D1D1DAAAAAAFFFFFFFFFFFFFFFFFF919191 000000D5D5D5FFFFFF8F8F8F0000000000000000000000000000000000006D6D6DFFFFFFFFFFFF ADADAD000000D2D2D2FFFFFFFFFFFF919191000000D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F25959590404040000000D0D0D7F7F7F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECECEC3A3A3A000000020202414141747474353535FFFFFF FFFFFFADADAD000000F3F3F3FFFFFFFFFFFF8F8F8F000000000000000000000000000000000000 6D6D6DFFFFFFFFFFFF919191000000D5D5D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFCFCFC FFFFFFEEEEEEE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E9E9E9EEEEEEFFFFFFFEFEFEFAFAFAFFFFFFFFFFFFFFFFFF2D2D2D737373FFFFFFFFFFFFFFFFFF FFFFFFE7E7E7E0E0E0FCFCFCFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFCFCFCFAFAFA FFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3 DCDCDCF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF989898000000E0E0E0FFFFFFFFFFFFFFFFFFFFFFFF FCFCFCE3E3E3FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE9E9E9EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424FFFFFFFFFFFF FFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE9E9E9EEEEEEFFFFFFFEFEFEFAFAFAFFFFFFFFFFFFADADAD000000F3F3F3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444 474747FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D565656BFBFBFF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFEFEFEF0C0C0C8C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADAD000000B6B6B6D6D6D6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 676767303030303030D7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737373 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3 B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B1B1B10F0F0FEFEFEFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFCDCDCD3131313030306F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF969696DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF9A9A9AD7D7D7FFFFFFFFFFFFFFFFFFCFCFCFB4B4B4B5B5B5F4F4F4FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFD7D7D7FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1D1D19F9F9FFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6D6D69B9B9BFFFFFFFFFFFFFFFFFFF5F5F5 B4B4B4B4B4B4CFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF585858343434FFFFFFFFFFFFE6E6E6676767D3D3D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFC1C1C1000000DBDBDBFFFFFFFFFFFFFFFFFFDADADA9C9C9C898989BDBDBDFCFCFCFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEA8A8A8ADADADFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD4D4D48E8E8E808080A9A9A9FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD0D0D08C8C8C7F7F7FA6A6A6F9F9F9FFFFFFFFFFFFFFFFFF505050 585858FFFFFFFFFFFFFFFFFF7C7C7C383838000000A8A8A8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF9C9C9C848484FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4141415B5B5BFFFFFFFFFFFFFFFFFFF6F6F6B9B9B9 858585A2A2A2E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DEDEDE8F8F8FE6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4D4D48E8E8E808080A9A9A9FAFAFA FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F3A7A7A77F7F7F8E8E8ED3D3D3 FFFFFFFFFFFFFFFFFFD0D0D0000000D7D7D7FFFFFFFFFFFFDFDFDF3939391B1B1B282828FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFF FFFFFFC5C5C5020202A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF535353333333FFFFFF FFFFFFFFFFFFA1A1A10303032121213C3C3C020202565656FAFAFAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD8D8D83C3C3C000000393939FFFFFFFFFFFFFFFFFFFFFFFF757575000000 1E1E1E1D1D1D000000313131F5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737373 0303033434343535350000002D2D2DF6F6F6FFFFFFFFFFFFA8A8A8070707EEEEEEFFFFFFFFFFFF FFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF585858343434FFFFFFFFFFFF474747272727FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD3D3D3000000B3B3B3FFFFFFFFFFFFEEEEEE3535350707073D3D3D1B1B1B0E0E0EC3C3C3 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC8D8D8D0A0A0A000000B9B9B9FFFFFF FFFFFFFFFFFFFFFFFF7575750000001E1E1E1D1D1D000000313131F5F5F5FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFDDDDDD161616171717404040151515020202A0A0A0FFFFFFFFFFFFFFFFFF 282828767676FFFFFFFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFFFFFFFFAFAFAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F3F30808088B8B8BFFFFFFFFFFFFDFDFDF020202767676 FFFFFFFFFFFFADADAD000000A4A4A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5090909 686868343434393939FFFFFFFFFFFFFFFFFFFFFFFF838383CBCBCBFFFFFFFFFFFF777777000000 939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF919191DCDCDCFFFFFFFFFFFF929292 000000A0A0A0FFFFFFFFFFFFF5F5F50A0A0A949494FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF585858343434 FFFFFFFFFFFFFEFEFEFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C7C7C111111F9F9F9 FFFFFFFFFFFF616161141414E2E2E2FFFFFFF7F7F7353535242424FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF3D3D3D2323237B7B7B000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF838383 CBCBCBFFFFFFFFFFFF777777000000939393FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D5D5 9D9D9DFBFBFBFFFFFFF1F1F1202020202020FFFFFFFFFFFFFFFFFF7F7F7F181818FBFBFBFFFFFF FFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBABABA8686868F8F8FDEDEDE FFFFFFFFFFFF585858343434FFFFFFFFFFFFF5F5F59D9D9DE8E8E8FFFFFFFFFFFFFFFFFFCFCFCF 9191918A8A8AD0D0D0FFFFFFFFFFFFFFFFFFF9F9F9B0B0B0868686A4A4A4EAEAEAFFFFFFFFFFFF FFFFFFAEAEAE000000DCDCDCFFFFFFFFFFFF828282050505F5F5F5FFFFFFFFFFFFFFFFFF242424 4C4C4CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5CDCDCDFFFFFF434343393939FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDCDC0000006D6D6DFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7D7D70000008A8A8AFFFFFFFFFFFF FFFFFF5050503D3D3DFFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFBABABA8686868F8F8FDEDEDEFFFFFFFFFFFF585858343434FFFFFFFFFFFFC4C4C4B6B6B6 FFFFFFFFFFFFFFFFFFF5F5F5A8A8A8848484A3A3A3F5F5F5FFFFFFFFFFFFFFFFFFD7D7D7979797 8C8C8CC2C2C2FFFFFFFFFFFFFFFFFFFFFFFF2E2E2E5C5C5CFFFFFFFFFFFFF5F5F50D0D0D7B7B7B FFFFFFFFFFFFFFFFFFA4A4A4000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A9A9A F8F8F8C3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCDCDC 0000006D6D6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5757570A0A0AFFFFFFFFFFFFFFFFFFD0D0D0000000BDBDBDFFFFFFFFFFFFFFFFFF7A7A7A262626 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF6A6A6A0F0F0F5B5B5B464646242424FFFFFFFFFFFF585858343434 FFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFFFFFFF808080020202313131343434020202A8A8A8 FFFFFFE6E6E63232321C1C1C5151510D0D0D171717CECECEFFFFFFFFFFFF787878030303FCFCFC FFFFFFFFFFFF4B4B4B343434FFFFFFFFFFFFFFFFFFFFFFFF555555222222FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFCACACA000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF8F8F8F000000C5C5C5FFFFFFFFFFFFFFFFFF747474161616FFFFFF FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A6A6A0F0F0F5B5B5B464646 242424FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFFDEDEDE242424 1212123F3F3F151515292929FFFFFFFFFFFF939393060606444444343434000000666666FFFFFF FFFFFFF5F5F5030303808080FFFFFFFFFFFFCBCBCB000000B4B4B4FFFFFFFFFFFFFFFFFFD5D5D5 000000A2A2A2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCACACA000000868686FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F21C1C1C454545FFFFFFFFFFFF FFFFFFF4F4F4000000969696FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6 0303039E9E9EFFFFFFFFFFFFECECECFFFFFFFFFFFF585858343434FFFFFFFFFFFFD8D8D8000000 B4B4B4FFFFFFCECECE020202858585FFFFFFFFFFFFC9C9C9BDBDBDFFFFFF5F5F5F282828F1F1F1 FFFFFFF2F2F22D2D2D404040FFFFFFFFFFFF4C4C4C1C1C1CFFFFFFFFFFFFFFFFFF343434474747 FFFFFFFFFFFFFFFFFFFFFFFF6A6A6A0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D6D6D 020202D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3A3A38C8C8C5A5A5A 1212128A8A8AFFFFFFFFFFFFFFFFFFFFFFFF909090000000F4F4F4FFFFFFFFFFFFFAFAFA000000 A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F60303039E9E9EFFFFFFFFFFFFECECECFFFFFFFFFFFF585858 343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF5050501B1B1BEAEAEAFFFFFFF7F7F78E8E8E FFFFFFDADADA0404049A9A9AFFFFFFFFFFFFA0A0A0000000C0C0C0FFFFFFCCCCCC0000009C9C9C FFFFFFFFFFFFB4B4B4000000C7C7C7FFFFFFFFFFFFFFFFFFEAEAEA0000008F8F8FFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF6D6D6D020202D9D9D9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFD9D9D99393937D7D7D2424243A3A3ADFDFDFFFFFFFFFFFFFFFFFFFFFFFFF101010747474 FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD0F0F0F4F4F4FF1F1F1FFFFFF FFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFF7E7E7E000000 E0E0E0FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC0606068D8D8DFFFFFFFFFFFFFFFFFF7A7A7A040404 FBFBFBFFFFFF393939383838FFFFFFFFFFFFFFFFFF2727274D4D4DFFFFFFFFFFFFFFFFFFFFFFFF 717171060606FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE040404707070FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5151513636361818181414146A6A6AF2F2F2FFFFFF FFFFFFFFFFFFADADAD000000D2D2D2FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFDFD0F0F0F4F4F4FF1F1F1FFFFFFFFFFFFFFFFFFFFFFFF585858343434FFFFFFFFFFFF585858 343434FFFFFFFAFAFA030303606060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8383830E0E0EFEFEFE FFFFFFFFFFFFF4F4F4060606808080FFFFFFB9B9B9000000B8B8B8FFFFFFFFFFFFA7A7A7000000 CDCDCDFFFFFFFFFFFFFFFFFFF1F1F1000000868686FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECECE 040404707070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B4B43A3A3A2A2A2A 080808363636B8B8B8FFFFFFFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF7A7A7A 262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B11010100E0E0E6C6C6CE7E7E7FFFFFFFFFFFF585858 343434FFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFF5A5A5A1C1C1CFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFDFDFDF0000000808080D0D0D0D0D0D0D0D0D080808030303F1F1F1FFFFFF303030444444 FFFFFFFFFFFFFFFFFF3838383E3E3EFFFFFFFFFFFFFFFFFFFFFFFF6868681B1B1BFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE7E7E71D1D1D393939F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4A4A4030303575757FFFFFFFFFFFFFFFFFFB9B9B9000000 BDBDBDFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B11010100E0E0E 6C6C6CE7E7E7FFFFFFFFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFDADADA000000 9C9C9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F5F5F0101010D0D0D0D0D0D0D0D0D0D0D0D010101 747474FFFFFFB0B0B0000000C4C4C4FFFFFFFFFFFFB8B8B8000000BEBEBEFFFFFFFFFFFFFFFFFF E8E8E80000009B9B9BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000 B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E71D1D1D393939F6F6F6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E73E3E3E040404D2D2D2 FFFFFFFFFFFFFFFFFF3939393D3D3DFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF2F2F29494941A1A1A1D1D1DF1F1F1FFFFFF585858343434FFFFFFFFFFFFD8D8D8 000000B4B4B4FFFFFF5D5D5D202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7000000888888 E2E2E2E2E2E2E2E2E2E2E2E2EBEBEBFFFFFFFFFFFF3E3E3E292929FFFFFFFFFFFFFFFFFF4C4C4C 242424FFFFFFFFFFFFFFFFFFFFFFFF494949343434FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF434343393939FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F0F0313131262626 ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF424242080808FEFEFEFFFFFFFFFFFF9F9F9F000000CBCBCBFFFFFFFFFFFFFAFAFA 000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F29494941A1A1A1D1D1DF1F1F1FFFFFF 585858343434FFFFFFFFFFFF585858343434FFFFFFDDDDDD000000A0A0A0FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF676767171717E2E2E2E2E2E2E2E2E2E2E2E2E2E2E2FAFAFAFFFFFFBEBEBE000000 A9A9A9FFFFFFFFFFFFCCCCCC000000A4A4A4FFFFFFFFFFFFFFFFFFC9C9C9000000B4B4B4FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF0F0F0313131262626ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2C2C2000000878787FFFFFFFFFFFFFFFFFF1F1F1F 4B4B4BFFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF C6C6C6000000BEBEBEFFFFFF585858343434FFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFF818181 030303E4E4E4FFFFFFFFFFFFFFFFFFFBFBFBFFFFFF0E0E0E686868FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF5858580D0D0DFFFFFFFFFFFFFFFFFF8D8D8D000000DDDDDDFFFFFFFFFFFF F2F2F20C0C0C828282FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF434343 393939FFFFFFFFFFFFFFFFFFFFFFFFF4F4F43A3A3A1F1F1FE1E1E1FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3535351C1C1C FFFFFFFFFFFFFFFFFF838383000000E5E5E5FFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C6000000BEBEBEFFFFFF585858343434FFFFFFFFFFFF 585858343434FFFFFFFBFBFB060606686868FFFFFFFFFFFFFFFFFFFBFBFBFFFFFF8D8D8D030303 E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D80000008D8D8DFFFFFFFFFFFFFAFAFA 1313135D5D5DFFFFFFFFFFFFFFFFFF7E7E7E0D0D0DF5F5F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFC3C3C3000000B9B9B9FFFFFFFFFFFFFFFFFFFFFFFFF4F4F43A3A3A1F1F1F E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB5B5B50000009C9C9CFFFFFFFFFFFFFDFDFD050505656565FFFFFFFFFFFFFFFFFF 7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF828282E3E3E3F7F7F7828282030303E1E1E1FFFFFF 585858343434FFFFFFFFFFFFD8D8D8000000B4B4B4FFFFFFE2E2E2070707424242CECECED1D1D1 6666667D7D7DFFFFFF7F7F7F0707079B9B9BEAEAEAEFEFEFBCBCBC9A9A9AFFFFFFFFFFFF888888 000000F0F0F0FFFFFFFFFFFFE5E5E50C0C0C3A3A3ACDCDCDD7D7D74E4E4E111111E2E2E2FFFFFF FFFFFF303030595959FFFFFFFFFFFFF0F0F0C9C9C9C9C9C93434342D2D2DC9C9C9CACACAFEFEFE FFFFFF4C4C4C030303939393B7B7B7B7B7B7B7B7B7BABABAFEFEFEFFFFFFFFFFFF303030595959 FFFFFFEFEFEF363636A2A2A2DADADAD8D8D87676760000007E7E7EFFFFFFFFFFFFFFFFFF666666 151515FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF828282E3E3E3 F7F7F7828282030303E1E1E1FFFFFF585858343434FFFFFFFFFFFF585858343434FFFFFFFFFFFF 6969690707079B9B9BDCDCDCA9A9A9212121FBFBFBEDEDED111111414141D2D2D2F5F5F5DCDCDC 919191DDDDDDFFFFFFFDFDFD0B0B0B707070FFFFFFFFFFFFFFFFFF717171020202969696DFDFDF A8A8A80B0B0B737373FFFFFFFFFFFFAAAAAA0E0E0ED0D0D0FFFFFFFFFFFFD5D5D5C9C9C9999999 000000929292C9C9C9E4E4E4FFFFFFFFFFFF4C4C4C030303939393B7B7B7B7B7B7B7B7B7BABABA FEFEFEFFFFFFAAAAAA0E0E0ED0D0D0FFFFFF7D7D7D6E6E6EC5C5C5E2E2E2B8B8B8252525151515 E8E8E8FFFFFFFFFFFFE6E6E6000000959595FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE1E1E12A2A2A0000000000001212129E9E9EFFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFF DBDBDB000000B7B7B7FFFFFFFFFFFFB5B5B51A1A1A000000000000363636D5D5D5FFFFFFF9F9F9 7979790B0B0B000000000000121212888888FFFFFFFFFFFFC5C5C5000000B7B7B7FFFFFFFFFFFF FFFFFFC7C7C7252525000000020202303030CFCFCFFFFFFFFFFFFFFFFFFF111111555555FFFFFF FFFFFF9F9F9F000000000000000000000000000000010101E5E5E5FFFFFF0F0F0F000000000000 000000000000000000020202EAEAEAFFFFFFFFFFFF111111555555FFFFFFFDFDFD6868680E0E0E 0000000000000F0F0F808080FBFBFBFFFFFFFFFFFFFFFFFF2D2D2D525252FFFFFFFFFFFFFFFFFF FAFAFA000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E12A2A2A0000000000001212129E9E9EFFFFFF FFFFFF5B5B5B383838FFFFFFFFFFFF5B5B5B383838FFFFFFFFFFFFF2F2F2595959040404000000 0D0D0D7F7F7FFFFFFFFFFFFFCACACA313131000000000000020202363636E2E2E2FFFFFFFFFFFF 454545373737FFFFFFFFFFFFFFFFFFFBFBFB6565650B0B0B000000121212727272FEFEFEFFFFFF FFFFFF919191000000D5D5D5FFFFFFFFFFFF1F1F1F000000000000000000000000000000666666 FFFFFFFFFFFF0F0F0F000000000000000000000000000000020202EAEAEAFFFFFF919191000000 D5D5D5FFFFFFC2C2C23131310000000000000101013C3C3CCDCDCDFFFFFFFFFFFFFFFFFFADADAD 000000D2D2D2FFFFFFFFFFFFFFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7E7E7 E0E0E0FCFCFCFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFF6F6F6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE5E5E5E9E9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEE1E1E1E4E4E4 FEFEFEFFFFFFFFFFFFFFFFFFFEFEFE191919616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFC4C4C4020202C5C5C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC4C4C4020202C5C5C5FFFFFFFFFFFFFFFFFFFCFCFCE1E1E1E6E6E6FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFD7D7D7000000A4A4A4FFFFFFFFFFFFFFFFFFFAFAFA000000A6A6A6FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE7E7E7E0E0E0FCFCFCFFFFFFFFFFFFFFFFFFFCFCFCFAFAFAFFFFFF FFFFFFFCFCFCFAFAFAFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7DDDDDDF9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF3F3F3DCDCDCF3F3F3FFFFFFFFFFFFFFFFFFFFFFFF989898000000E0E0E0FFFFFF FFFFFFFFFFFFFFFFFFFCFCFCE3E3E3FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444474747FFFFFFFFFFFFFFFFFFFFFFFF EFEFEFDCDCDCF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF575757242424FFFFFFFFFFFFFFFFFF FFFFFF7A7A7A262626FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7B7B7B111111FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF4848486F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4848486F6F6F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF818181 121212F4F4F4FFFFFFFFFFFFD7D7D7BBBBBB000000A6A6A6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF0C0C0C8C8C8CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFC8C8C80E0E0EE1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF6F6F60B0B0B878787FFFFFFFFFFFFF7F7F7BFBFBF5B5B5B262626FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8E80A0A0ABBBBBB FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F77E7E7EF5F5F5FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3131317E7E7EFFFFFFFFFFFFFFFFFF 757575303030303030C8C8C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7373733B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB3B3B3B8B8B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B3B3B8B8B8 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1B1B1 0F0F0FEFEFEFFFFFFFFFFFFFDDDDDD303030303030616161FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/laplace.dat0000644000175000017500000000122012662210372015623 0ustar mbamba#Cores Solver Time (s) Wall Time (s) Solver Time (s) Wall Time (s) 4 560.03 564 ? ? 8 322.81 333 ? ? 16 180.35 191 ? ? 32 86.71 97 ? ? 64 44.43 56 ? ? 128 28.67 38 ? ? 256 12.15 34 ? ? 512 7.38 43 567.46 602 1024 5.31 72 299.48 366 2048 4.84 131 150.36 270 ga-5-4/python/docs/pgas_11/image5_crop.png0000644000175000017500000006427312662210372016451 0ustar mbambaPNG  IHDR.|iCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx]`Waʘ23sI^zޕ!+)3c4mӤar̖%Y,KU۲Z>v޼y6 $]Wϧ%%Y(i]l].m-drcI BΈ]Z~G뤩NFњ"Ɇ(!tqee{J u][] V[|5XZ"2| R%)99VX(iw\Q "KIW8hyqiXW$RyQ5 ٩q)/W]GF822e ݰ%JlZ*M U_F׋ z`炍+ ͙+i5S iPnV, K`ߗ&ژc|56-n˜0p oT_fG-mjoϺ?SCil"@pgf`uJIK ^!UUWɟKK~1¬`<ҴUr1,լ"|C1m&eD˖  2c*q_ ÆIOh̙rQG $\x|6cmI^&L`^WUEɬi0aXW!kʎ;$%ZS}Xw^X Z&MzDv_})q:69-C؞[sΓS'N ;v*cƌ*RjִZ~ ??J [By ILA?xB 4ydwJJ( ;z;g{O ؼ5?̑G? xR+-niVWW5WMvGA폾Aނ ϪY=_3{VfA:Iˉq{Jeŗ`gw}ٽ%`ZA~;ZTPpeXkЧO믿Ï_~Y|^ -}sސO]/e#e= N\h.{])8Rҕ}/jZ+#%HrY;˽;vDe_v~z[nѣGw>X|]>HaXϝ;Gm{advGݰ5Gz33+n< S=w2Oأ`97P Z[ Uʒ%K}ݧ˖-3T(LAɱg z8U=АW+-SV*zk- Z9tlZzp}jk_g D[;qA  `?~kxFW3"r#AlJOGHQ" y]53eS}3bk~ڥb,4*2d p=2o<}w; &{ml#uջq%u6*5;ݻyw)u%,zKj0裏',ÇǞPv I:fI %@={5\#zjdWتf>A3tb^hP#ԥm\&<9:ExNԺIkhv8NwP8;'ڽt+F'ȊrYWtwUk>~)yd hI8Hm%*D06"5L(W#rȆQOֵM GRJE|5f&~z藿A ŎVs|D9NAΜ .a*eY]~_-׸6G*++čXY׆nF0AZS+3\Z]|,Xl :35 _U£ٶUThHX"~āN341#eYW[#WHsԤ)P+<#!T?µXV8񾪀\ſ\lsաP¹O xPC+ʳE iӽLԝ|4<[kCXDCv~کy_)JDȏc٣r1;q!πGs%0'_8de! 5=S!?\v9-,'f˞wȓ.<ƶ?s SBEVe!߀A.g碛)W :u,*:B~2Kޒ tQmߦ=Vcشژ,4[b ~9Nn_VlruϤ&YhO t:pg笲I m-\Sˁgs\q%ve(hw'+Sy͊e>7u5HYWJk<𝲀/MUr6[\f%| pHV $ 6Bfo}XObΔDጨEOk ' JR/J\j:7Y  l;i+yuljBujB (C.KY6a8s"sP}}}HZS\O_{55kru9餓dvk#B#?\>Cxː!CTwyGͼvi2n84LvZd='矗Q!8WoG}$r9ɣG>X :_J`PYr%ZU Uw0@zg_g3tol`.6^|.4dCȏD~Ԕi/e?5B'~͚5w<>f`{ky2ydyd c/^ΡDjajSCVc^xHgځ?C vwk\vX=8\~[Cd R+%vѱ %|T5Jx?3/hLA'ۻ*(-/%}µ.2]ۏ)m^9c?XnҥrUWT=y@u!IfmBY:4p8'1E5U. [JQ6mf獣axj_R  1p֐P$dB&%~)[o!^tCҮ "K~_ '_Lmd 2gݍg}Vdf=5~S\9 H*bzfkʻ曱NrW* ɫZg|"%X*v)`^~Eq# G*eĊY'4;A/.VKr$^Yax }oU'l9E[w?nQ}ġ6?ߴi~2m4uQ{JsUCs=W nZ~H-Svqƙ`O~/J=*?KǚF_W[L0|*]yUB!?$\)v,o"=%'+E.,0lTɁy}PO.ohC~bC7ĝĠŶ3yX\w#O˷^{)v f5=묳$8@|Iebo-VxH"U %\"z0Q$g9$ey9‰GΒ"_Qf&|%&vnhj:?-ʲk^%[g#u#l ^u57qD`~_ xrJ;ҁ%~.U!)Q$'E1b3dر 8H>xs?7,'ڬߦ5hU%(q(!\Hj+(te O3T$jhKqv/=?,wu6Q' nl_a+]$,JaHڴ9;ep;b'I}ܥ;z1i$1vEEM5ynG#meIL6'&5f'b<fnFvu4JocϢvFк1m<γ66J2ECy"Ε& s[av¦Ɍ6?OL'[Dxug ijďU 1Iyr:ā. 9a7(ZcR2}zo%;iŒ=yo%r?NOU7?`5 %Ư; FkD<0ހSdpɛ5ˮ%)pIÌfpHE2rEާ&7O^8 ^z4Zk^;:Tz̿gPyߚZ^#.?B}PI]"IuJVBú"5 tIS^БWܮhYWk?K{DnG\g.V?a3Mh4xy6ց[VeGJQAջoMU=z=R0h 3q eV>5@>HL@h kH~\D)gNAKXC!{#7qJyy}Cb5NI)F9k;^zNCw}WDBV!pQjXjw-3tVNXie:k'hyk rb-Td"wҖki% ^WZd FIV(?S/N={~+ʰ_*<%?OFνJ%#X9N{@G=Qw!p>]cRfiG* HrͬSxڴV8hoz{^a-_&߭X-}{~|7&^$lI4p%UkYi0Ѐ0롞1W2:)3e̒T hٕ#MJa! v95(^;Ȏ2yEf8_Fz_T[QZ:L^0 .'>fUP?VhW6-|Ezor?ύޅwX ĸ:++ɍrK`34!1rj3OӤBs17HBHAn$qFo\> R"haب4槚Lf&z/^\&y_;@OR[BRp 1UC; }o+N\. ;6V?g*|}R=%5+W)YjT:>Ζ,oCzqAT[pv ]ed&AZO/RII@j藚=,h=n7'y~E#>&#FZ̭$>TA#!Cg^a.K"Y㎉˃%W7!Y0GSSdʵ_ޘ ~9uÕWKS8q`4O){춋lXձӧK) 3ԗڲ7tR_?y隖n"hrKaqˬEn$I5B#=C0 ТzSNg/IN_NaFN"P ",C:7V# c\.jAHR^}~98XEkiph|^DMAjn AﱻY\R6q頕[sUoX=#hM|dޗk+sWͼGOIO[!gN,3R9$<|=O9K'&aqrqyyk IDATZ R匯EVM4+)$%7/eu:dϽ[?++gk4ݍÕ"}0lh(j|tfko"syd߽5A :`АΡ[}jy)R0d@Uuhv KړZ=9hav)|hQ3KĞ=T GJT"x7r"='ו_;Lr7jLO9I )+_xIjȫJ#MNK.u衇b*W*!ţ+Td~ש1 7 AcӞtoXlRíN?՛N^>^h#0 ?4-4)>7n.;qcb[/ZHq9dFBPg _bYY8UgKW"wnBs~h 'TyKvEDE&mW[̔mj6ظ a >[Fɬ3#H?8W 5hc+^\OM>%x3GyNm_|׽ȿ'd_뻣#/>a&uGbqEm'mdC0u3 -6h„ ȆY$O?Dodpo xĽc)Ň69%%#G{ cᇅilY+xV.UR8LoKVY"'4?MÇǕ?uqAQ&OM{Hz!,'2ռ%eUR]tUG^ИkQ=ڢ-VKr-S .iڴ_j%07 *4|}q6N?TɌk(PmC/ ȱ I;NWogK`InsrsfV<@[oT/\ֺ@]Z@R7kHݬI;%gt!S7_ݵ 8™ݣ;GA4^nA6M,$j$^h|q#.μ\ Da^r 'ʫ_nsZ ݴV7Mʢ0\ceS&C>([rg*J%vք0V~ȴu"d 9 |weȉ"gF?c,t 6檰7m\kLm ]I\S;oe.mD?8~}HX1.WrGcABpmadg Qvl$°wuH\_Q$YHjVAJ}ssJU&I]2ĹBR*4n]OeAH `*f" nVPA/*$pVzP.`QJ,";nWDo<zL`N'V"Y'%ݰX̄:ّv<18,-Y&z5.U*'PqHJ<:1'Mz! *"p1w< ȅ/wJ)C^6??Դ,R6YuIkX-9%}_2[AW')a N]luH~P 6.q5'u#b Z RZd5Zlq+Ժ.AʓWݾ ez0.ӧ2Vլja*PuA\EbiZW0pB jZ&JfJ_EӁ+xm/𔎤DʷYF%OSyaag&@%M)f`Walx%=T񇩚})qJ#u4_eo` |S(1ئ◟LG;΄TѧV؁kqSxd MqEJ>i%'xq9¯! j>\usy5g`o%XQ|"+c"0姟j #έF9pLWT1zZ!IoDˢ&1WdC97^~tT +ZXB+dhjSm>&5.-գGN҄5ےڞe@+k(r'zoo:C~dVOU+gzhM}v_|=aΜ9m6 [JYWL Y!**eʔXIQV'E(G[jK/,UϚ5K4,%j]H_TВEWEb+d͚ߌ*V \_V;@Od5VpY6z#^tVE佃sV6TXa|@߯&1Ǒ*,qMĜLdIQ&{jvncJt33|'b29sf.y3Oϐ")f.|Ǜ88@(L(yC=@x/_j.d=7&6^z U1a 4OxrkB+/WR{T:Nͫ+3K"t/yB+\zJZ d&X_Jf&HZB[o!!`lsNh'դ`\:-S9lf~#˼}Z j-Jϕ}%*K ɓDUryKJUվxJKJcK+hXAm3ZT~Z\hA|XL3 n  pM3šI5ĪUaLFEگ7 <+2ʮ*@C2]"KFl2srޒ䊌 +eB= {7i /~p$ڴ8ȕFTХ^,Gqh +4E)~!rpSNb ?dXR"+WHCVa`$ CiPiZoR Lo )U3Yd1%m.I"jZ$иv,`ЎA~J\(W] *VLRǒ /#|hPiZI ZQU{ݕ cx]\J֟d@BM9l '##S0,֐B4 `xj^0 2 \6gd?4\p[.%%$ˎl).8¸#rl'cD mY;mq-*p!w3C-_!u ޗGkm[T /š6nzh;6sFvN*M+R@l+?hkW=Xz0W闷Һ…Xn:2$gSNn 5ll*c«͙&=2$9R3ֆ%Δ@HoCM1&fmbk U\W"ڰ$7ˆw. Uȗ{_mmt .:{晣% 6, t剡V[xbOX$ۗ)0ԟjj?uB K"1ӥn2G'&ZeI j4_|lq r_!{YKM5h/•7@]8#B'YB=mUO(:NWN\+i6, l. <5R4aòY2¯$UUNibh-zx_6Ljо#ㄘFnb63̞gz ɷ)4_x6oJe[\[Ri\/2w;% ]ki\;la"1Yݜ&xےSR܊^>M1 LksO+ܮfw½!f>pWߕ.`uژUhT^V~aRV4,d<(njm+ᒷY|sBZV~Xh' X)/8_V*yL_RY msf>Gދ[$&9B²6, \&e ޻R*{$t ]1GdCtix2>$bmXh+CX{J><$\b6I:.jZ9㏑~lVHrֆ%+\6yoQeճ []Ⱦ1xWtL 6, X. e3HR߱VC]WpȀ_ŌaX6pkÒ@'Iv<3Ȯתr.eVY Syַ%KÚ,o[WE4+f a5 ;f2Zg$`IE"vڲ!]˰3:hž{ÈoV;*J9ۜ ѶA5xqXUXd X"4.ʐ1Ga0T%`6 GQlB, lixԔ>6LKH6"i)F u;S$VOے^~ejgvoQ puUE(+%Vљ;M(wz-[&O>D~ywI\k}C;sZC; KȐ!CȞ{)^{|gtpuufju6, @EEgcܵ;/"td֭[',YD6mZwZB+!qm֦:[d?DkKVvqGyl7W;^j{SS8qN$P1魦iGgR{ʢo_kbSy$??_fΜ) YnLDq/s̑#u4|>ﭕ̬h,}_RЋ*)(0^k Z4IFvU%''GRR'+++Ct*.Ar2Ty#V[JrzcW;En<}HV~y}̱2id}wjx?x JFOI3p(^.? >B2?$S w9Wz +*3]2z匫% 7ܠ4Xy+OwZzX\U*4 Zm=VnvSBIjN=u"@kR\Y蠕owV|kvDAkLVCSRzjq$.6Zƍ/çTbC2 r1y5OV?^81yy瞗kA 8OJ bP%k^.\>x/2h xm5HOǟAqenhng[.f?%yrI'?Ė)G<qWPX.+˿LիWO,ޢ5k䩧;MƊjmz٧ҨeJc9YͱH`ݝ5_)/wK7kLQ4d ER݆?^vyBINx^̛n(>MeduХnͶ;+^ tfDÏ?%dž+-8a_x#ojDE?99Կh. HlKY" $di-sɜ9uu8SA9͑/seح%=YVE:dl$cG IKD;%m&6PgMO7@l^wr9ÌpW7a w ENhW+//OOx8rOU4կsorv;>Z<'h1*״ HF.l~KiTKVFS&Cѧ|,%dq~+Vo_咾Ӳ8DYXȬY:L;vl[eQHqkIԚW֞b/{巵AoorIZ@k5"Ii5˒%K+\ֶ%K]Bpud5H7&P~PyW+>ni;T=qAfSOmrpm, 9N7]FM>]M`y*FH&&t /;m!778_+K-70,g!C7qBbEC[o5?Z2[. kےfMz^w]zBf&?xgة-1^qc|p zO:U,X GyqBE曅oFoNʨ>LߵQ:p0Un`5]&hÍjV ,2V_ 6E>u(..VK.U.V7_|u# .@wvioq|M=C: ᨣ /6AGkʁ('//(aÆǘ!?T矯4!.裏d]w M7q+B !/_S޿KE~ӟ>02|=SMN. JehVp9J'mL5is1qD{a&V6Γ}Gw}IQ&O,;ShgXC!}͞=[8TEԂ|̸=*w߭<ϪDj0̌ʌX1aȐ!lC-R|x&S"1H,sZҎd4~"qAר]ln)STV_CVXX(~ޡ m~7Ѐv#tF 7|csgi5S.yce#ƨ\]TᝌWEè͉žXu5Ũ<ڌ1*6V6evj04Wmaq~!eUj x饗 &vU=A0 F]]GO!]ðSp6?׮;Nή54dWm? 5Zm}^paoT%]5.~務'|Bh[&oKiӞl{,kMͿFzB~ U,>mtpLAsICϫOcGOm|Ǣ[o75륇ha!?ʕ%Kv!QVѸNR3f矒y$8y'=a6M(<]rxTڻh[bh.L;N^{rS3!ZgIv~EMMnGU p1G'@rA ~꼑ߔA-s8$Ўcݢ4DՌ3OMA⡇Rh6l%.1"df[nENࢭ6y-Aw (C ~Op\oQx$Qir3$}iP:cQ ,<_]rEXa7]'h ׎t>jwL'5瘣 RgmMGx>)Vq~XWX|Iwi`Q;6CpbᠥBm$9pHG Qk!`RЉõp~"s\-}n.qQ?\U6=rKJ2-+\ֶ% p)0~8}O-G2DmC{>2WʦsqicFP2ZġY6/97t6, mI BYc"mpjW*48tՇ nJ"SӔ2ɘ@b!YJl!>1 5rH.bLk1'-p8&h}zZTӝF@rWn C6“njYp~Z%WԨ0ru:13TqdCR[<#yBycV Z@; A-)A\ +bc,#rr NYW%%,̴6**L~T۪\@@2ڎnEiz׳gA%ZeZg<̘26o9 ,C3-i*]Ns=oiYE:[(Tc>x_f)m18ZvjIzgr5\!#[DEe_Ej;)uks͎.nc;f7"Ί8gSؖN3-)SomMɍRXĮUOŗ\-##ʚANg:ɽ^2j7AˢC7u.ZrC t+Y M4֏xIg: t=\Y@@ '3"}东wꩧp.6ƌ1^ފ$ :S~E|5LClL*Hp(j#3==K̗6KLbUbK)rU":4+ ;`3~j $ $QKC˿ cBƻ+ 2j( :[}u+i=toKI$g 3Cve,;M/Ő"}ov*韾駟wBe.epl3g*wO<s#ʡ^0484^bAgc׮CZ- X0'LSa h"Ka2c 9ĢS+*icbXc9$?5$ 7,1LgMmN~s_dXZ*\J$!>lP4{g`0=Mx*e1f22a"Y6ssJ҃WLĂ ׸b"x- t qFM#̞湏6TB-v/l4X׭[3~a\&3 uԺt5!%jz[KMPϚO.BMS$cmдc^%bӪ!oV_LT%h8g2OC7 ġ8yhfnü̩O%1?҇)H5HeίО_ƺˤ2 a8ѶƏNҘ*++jzTyS\8ۈșɅE{7[.;@_6}\زGfOiލcU:|rYМXKˑq9fڼh- Y|n;@uGk37g"i9gQ6+ bӃ\3g.+1xn%Hx?&u(Hy|~P<)jBTJ4NEZC/Y(#}ZqD 0Q71i']#יlW^;lvm3"b"ޖZ Ίdwl[P=.-`?Q.^u:E%NZ4^趦F6PVgJZ[bu)|s+|w~Jn< h7&g'ƿm&Tʸ.ɡV/ ^)‚5w7A%Vlp. ?s2gHYI&XGQ<_/J-1~U@axlꘆ MBĹpOS!?ie`N3!?~4d2<ְ4Sm囹MBT~i\_>BDLmZ w6cѬᅲl>B)꽲-kTv).xܾ;tHnfꔌ4^e6:ϒ@wmZR"h6oP.kѹ@MBOfV k*ɒhx5ig52VTBjжeUZL< ;R6A 2bOM˔ŇɯʮF55==nYIY|6Ubh[RYj6~ii2b V,[f߆ Hrg6FԐ@E*t, ڰ$оPWn R*M3&AGtMPʘX-曤tL{Pr,^:z^{`-KO.D,H 4Zqa ':_vwb0`5xt+LN@d &h:q"F/Y&]%&*p!)V9O^J'vw&-MAN||} oc{رdƷwc\fH>]񚒐VUcxfw"]gC쩧N4<3E)~kP4Ty=nd.U<.B,aw1GC;o@+n]`r.d?WO 선+]/8/EGO@))QW3UQ6Bu؝]oTTVΌ̞3[4UP$#?kZx;(ۉm+bs6_u4epe梣˂Jz O_jȌo|X4-T.ˈV6ShՋĶrzq0d\6mիr$I-2 PT oKµ-b2#@9жVXFDIUlt8Fϖ@k!)NIqUMEI]kرHcP=XFʄk)uhٚc=5KPU` ~ݍ11fETzYH'YhL x13`vJO9YAxLDI\.uOM+=!Np.ώhl;(xa_| Y,`c[C~fWc14cL =\ȏ{u_tKi v1˄ y1s yUȏgiY8TOc3sjF63Q1_7}5t7"䆿-JB';Dΰ$e$@M28HH"Yȕ5+aY'X4 ("Xcl0-(Y'Yd $A=T˂>lZpm- t3湑{%uu2v׃9;x8t=6jPBdo$Xǣ-ڿ`'͇OD@# 0#<7H|e"M$7S\ 8O5fkk3Lb媕ea1Y%[ a|#^ EVIyxƔ,VFlE%R}­'*iLfWUѣ|E$̈ԪuC"+Zq;7Z`ІOQ^!mm[B+MǺn:U"Vve7\֡*@Ao Ng-TWW?(+ 3BSKifZa[OIDATdgRlY[ofxMQM$GiZiy =[/ ӎɵp,3L7?Qhc:7M۝%t鐟~2#o@|aS <6ZS!?ȝwݕ@ρC~vf:mcȏ}eq '䅦B~RsW zYTk>'!?Я-D `w#Gk:jǫ7ڦhjG&k%C $n-1 w=Xwy/٩]5d>K[|߄d`ԴH'%Өq%?lE7l%n/fJmbٰgalUKFVV@.KAKA prV;/Hv%#+ [(pYw%-@(TU%NCJ9WKZ]2R:,ndbz_J" %._\pQ-C$`@:iL-,$[BxR>mFd#g9ז*7ڝ^r)]dfkoen}=Wv;|(GL9.陓*tv5/aXh'3X`K@/>-A& 8|I:$V@@0vu#E˒X ? >T 1t] 5;_!_TkAS0sּnn;!n\P\۶Mlw>$<衜Z(g_~YaLy#ͻ$)11S>VsRí٩k, ɴF}7yJs D7G rp$2`kG20队%ȯX+\ $Y^{ S\~t#O-t5-j^a#-J}V5V(B/SIENDB`ga-5-4/python/docs/pgas_11/image6_crop.eps0000644000175000017500000070311612662210372016451 0ustar mbamba%!PS-Adobe-3.0 EPSF-3.0 %%Creator: (ImageMagick) %%Title: (image6_crop.eps) %%CreationDate: (2011-07-20T14:56:57-07:00) %%BoundingBox: 0 0 431 86 %%HiResBoundingBox: 0 0 430.946 86 %%DocumentData: Clean7Bit %%LanguageLevel: 1 %%Pages: 1 %%EndComments %%BeginDefaults %%EndDefaults %%BeginProlog % % Display a color image. The image is displayed in color on % Postscript viewers or printers that support color, otherwise % it is displayed as grayscale. % /DirectClassPacket { % % Get a DirectClass packet. % % Parameters: % red. % green. % blue. % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /DirectClassImage { % % Display a DirectClass image. % systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { DirectClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayDirectClassPacket } image } ifelse } bind def /GrayDirectClassPacket { % % Get a DirectClass packet; convert to grayscale. % % Parameters: % red % green % blue % length: number of pixels minus one of this color (optional). % currentfile color_packet readhexstring pop pop color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /GrayPseudoClassPacket { % % Get a PseudoClass packet; convert to grayscale. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def color_packet 0 get 0.299 mul color_packet 1 get 0.587 mul add color_packet 2 get 0.114 mul add cvi /gray_packet exch def compression 0 eq { /number_pixels 1 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add def } ifelse 0 1 number_pixels 1 sub { pixels exch gray_packet put } for pixels 0 number_pixels getinterval } bind def /PseudoClassPacket { % % Get a PseudoClass packet. % % Parameters: % index: index into the colormap. % length: number of pixels minus one of this color (optional). % currentfile byte readhexstring pop 0 get /offset exch 3 mul def /color_packet colormap offset 3 getinterval def compression 0 eq { /number_pixels 3 def } { currentfile byte readhexstring pop 0 get /number_pixels exch 1 add 3 mul def } ifelse 0 3 number_pixels 1 sub { pixels exch color_packet putinterval } for pixels 0 number_pixels getinterval } bind def /PseudoClassImage { % % Display a PseudoClass image. % % Parameters: % class: 0-PseudoClass or 1-Grayscale. % currentfile buffer readline pop token pop /class exch def pop class 0 gt { currentfile buffer readline pop token pop /depth exch def pop /grays columns 8 add depth sub depth mul 8 idiv string def columns rows depth [ columns 0 0 rows neg 0 rows ] { currentfile grays readhexstring pop } image } { % % Parameters: % colors: number of colors in the colormap. % colormap: red, green, blue color packets. % currentfile buffer readline pop token pop /colors exch def pop /colors colors 3 mul def /colormap colors string def currentfile colormap readhexstring pop pop systemdict /colorimage known { columns rows 8 [ columns 0 0 rows neg 0 rows ] { PseudoClassPacket } false 3 colorimage } { % % No colorimage operator; convert to grayscale. % columns rows 8 [ columns 0 0 rows neg 0 rows ] { GrayPseudoClassPacket } image } ifelse } ifelse } bind def /DisplayImage { % % Display a DirectClass or PseudoClass image. % % Parameters: % x & y translation. % x & y scale. % label pointsize. % image label. % image columns & rows. % class: 0-DirectClass or 1-PseudoClass. % compression: 0-none or 1-RunlengthEncoded. % hex color packets. % gsave /buffer 512 string def /byte 1 string def /color_packet 3 string def /pixels 768 string def currentfile buffer readline pop token pop /x exch def token pop /y exch def pop x y translate currentfile buffer readline pop token pop /x exch def token pop /y exch def pop currentfile buffer readline pop token pop /pointsize exch def pop /Times-Roman findfont pointsize scalefont setfont x y scale currentfile buffer readline pop token pop /columns exch def token pop /rows exch def pop currentfile buffer readline pop token pop /class exch def pop currentfile buffer readline pop token pop /compression exch def pop class 0 gt { PseudoClassImage } { DirectClassImage } ifelse } bind def %%EndProlog %%Page: 1 1 %%PageBoundingBox: 0 0 431 86 userdict begin DisplayImage 0 0 430.946 85.9893 12 431 86 0 0 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B2B2B2AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE7B7B7BA7A7A7 AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE969696959595AEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEE4E4E4FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFA4A4A4AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAE7A7A7AAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE 898989AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEABABABC1C1C1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA3A3A3AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEADADAD848484AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAED3D3D3FFFFFFFFFFFFFFFFFFFFFFFFAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA2A2A2AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAE989898A9A9A9AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEADADADB2B2B2FFFFFFFFFFFFFFFFFFFFFFFFD4D4D4AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE535353AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAE818181AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEA7A7A7EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA6A6A6AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEB1B1B1AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFADADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE9A9A9AAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEABABABAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEADADADB1B1B1FFFFFFFFFFFFFFFFFFFFFFFFD4D4D4AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA5A5A5AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFC0C0C0AEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA6A6A6AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEB1B1B1AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEBEBEBEFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEAEAEAEAEAEAEACACAC838383AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAEAEAEAEA8A8A8848484AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE AEAEAE919191FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB2B2B2231D1547331B47331B47331B47331B47331B47331B47331B47331B47331B302212 0D0803402C1447331B47331B47331B47331B47331B47331B47331B47331B3B2A16080501412C12 47331B47331B47331B47331B47331B47331B47331B47331B44311A000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D292929404040404040404040404040404040404040 404040404040404040181818111111363737404040404040404040404040404040404040404040 4040402F2F2F0808083A3A3A4040404040404040404040404040404040404040404040403D3E3E 000000161616FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E03B342C36271547331B47331B 47331B47331B47331B47331B47331B47331B3A2A16130C0400000047331B47331B47331B47331B 47331B47331B47331B47331B44311A0D080300000046331B47331B47331B47331B47331B47331B 47331B47331B47331B000000000000DFDFDFFFFFFFFFFFFFACACAC232323404040404040404040 4040404040404040404040404040404040402020210A0A0A2D2D2D404040404040404040404040 404040404040404040404040292929070707343434404040404040404040404040404040404040 4040404040403F3F40000000000000FFFFFFFFFFFFFFFFFF88868300000044311A47331B47331B 47331B47331B47331B47331B47331B47331B1E160B23170844301847331B47331B47331B47331B 47331B47331B47331B47331B2C20100B07023A291447331B47331B47331B47331B47331B47331B 47331B47331B412F19000000787774FFFFFFFFFFFFF6F6F65A5A5B000000404040404040404040 4040404040404040404040404040403E3E3E0B0B0B0000003E3E3F404040404040404040404040 4040404040404040404040400505050000003A3B3B404040404040404040404040404040404040 4040404040401616160000008C8C8CFFFFFFFFFFFFFFFFFFACACAC251F1647331B47331B47331B 47331B47331B47331B47331B47331B47331B3123120C080237261247331B47331B47331B47331B 47331B47331B47331B47331B302312140D0400000047331B47331B47331B47331B47331B47331B 47331B47331B46331B000000000000FFFFFFFFFFFFFFFFFF8888880000003D3E3E404040404040 4040404040404040404040404040404040400D0D0D000000373737404040404040404040404040 404040404040404040404040121313090A0A313131404040404040404040404040404040404040 4040404040402F2F2F000000222222FFFFFFFFFFFFF7F7F75C575100000047331B47331B47331B 47331B47331B47331B47331B47331B45321A0D080200000045311A47331B47331B47331B47331B 47331B47331B47331B47331B050401000000412E1747331B47331B47331B47331B47331B47331B 47331B47331B19120A0000008B8B8BFFFFFFFFFFFFD8D8D8191919404040404040404040404040 404040404040404040404040404040383939111111000000404040404040404040404040404040 4040404040404040403B3C3C080808313131404040404040404040404040404040404040404040 404040404040292929000000F2F2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB2B2B2130F0BBC7B2ADD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032 925F21090602B07328DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032B375280B0803 794F1BDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032D98D314832162F1E09201D18 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D161616B0B1B3C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C46B6C6D0A0A0AA8A9ABC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C48B8C8D080808818283C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 B9BABC3434342F2F303B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D81614118D5C21DD9032 DD9032DD9032DD9032DD9032DD9032DD9032DD9032BB792A0D08037D511CDD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD9032D2882F181006482F10DA8E31DD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD9032774E1E1C1309060503F0F0F0FFFFFFACACAC121212A8A9ABC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4797A7B080808959597C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4989899090909707072C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4BDBEC03D3D3E2A2A2B282828FFFFFFFFFFFF6D6B682F2213D0872FDD9032 DD9032DD9032DD9032DD9032DD9032DD9032DD90325134111A1106D2892FDD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD9032784E1B0A0602AD7027DD9032DD9032DD9032DD9032DD9032 DD9032DD9032DD9032C5802C1E160C4D2B036D6B68FFFFFFF3F3F33737374F5051C0C1C3C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE1D1E1E3B3B3CBEBFC1C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43636361A1A1BB1B2B3C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C49091920E0E0E282829AFAFAFFFFFFFFFFFFFACACAC14100BC17D2BDD9032 DD9032DD9032DD9032DD9032DD9032DD9032DD90328B5A1F0A0602AA6F26DD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD9032AE71270A070280531DDD9032DD9032DD9032DD9032DD9032 DD9032DD9032DD9032D88D31453015301F0829251FFFFFFFFFFFFF6D6D6D2A2B2BB4B5B7C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4464647171717AFB0B2C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C468696A080808979899C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4ACADAF1B1B1C4141416C6C6CFFFFFFF4F4F4383531593D1ADC8F31DD9032 DD9032DD9032DD9032DD9032DD9032DD9032D68C30221608432C0FDA8E31DD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD90323E290F1D1306CA842DDD9032DD9032DD9032DD9032DD9032 DD9032DD9032DD9032A66C25100B062E1E0BAFAFAFFFFFFFD8D8D81616167E7E80C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A4A5A70C0C0C6C6C6DC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4B7B8B91616173C3D3DC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C468696A191919000000EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB2B2B2130F0BB07328DD9032DD9032DD9032DD9032DD9032DD9032DD9032 DD90329B6522090602A66C25DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032C07D2B 0B0803794F1BDD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032D98D3148321637230A 8E4E00221E19FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D9D9D161616A5A6A8C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46B6C6D0A0A0A9E9FA0C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C49696980808087C7D7EC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4BDBEC034343439393A68696B3B3B3BFFFFFFDF963CDB8924E4A558F1CFA5FFFDFAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D81614118D5C21 DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032BB792A0D08037D511CDD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD9032D58A2F181006492F10DA8E31DD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD9032774E1E1C13099A54000B0906F0F0F0ACACAC1212129E9FA0 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4797A7B080808959597C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C49E9EA0090909707072C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4BFC0C23D3D3E313232727375292929FFFFFF6D6B682F2213D0872F DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD90325134111A1106C9832DDD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD90327B501B0A0602AD7027DD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD9032CD852E1E160C6036045F34016D6B68F3F3F33737374F5051C0C1C3 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BBBCBE1D1E1E3B3B3CBEBFC1C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C43636361A1A1BB1B2B3C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C49091920E0E0E6C6C6E333333AFAFAFFFFFFFACACAC14100BB57628 DD9032DD9032DD9032DD9032DD9032DD9032DD9032DD9032915E200A0602AA6F26DD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD9032AE71270A070280541DDD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD9032DB8E3145301539240A8A4B002A2520FFFFFF6D6D6D2A2B2BB4B5B7 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4464647171717AFB0B2C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C468696A080808979899C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4ACADAF1B1B1C5151525050516C6C6CF4F4F4383531593D1ADC8F31 DD9032DD9032DD9032DD9032DD9032DD9032DD9032D68C30221608432C0FDA8E31DD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD90323E290F1D1306CA842DDD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD9032A66C25100B0680460039260EAFAFAFE0E0E01616167B7B7DC1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4A7A8AA0C0C0C6C6C6DC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4BABBBD1616173C3D3EBEBFC1C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C468696A1919198081830B0B0BEFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6000000573A1762421A62421A62421A62421A62421A62421A 62421A62421A5E3E19000000513512603E155E3D155F3E1762421A62421A62421A62421A62421A 604019000000462D0F603E155F3E155F3E1762421A62421A62421A62421A62421A5F4019000000 4A2F0EA75C00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFFDBDBDB0000004F5051565758565758 5657585657585657585657585657585657583131310000004A4B4C545555525354545555565758 565758565758565758565758525253000000424343545555525354545455565758565758565758 56575856575856575868696A39393A8D8E90696A6B3B3B3BFFFFFFDD8F2FD57501D57501D57501 DB861FF4D9B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8D8D8000000 4F351662421A62421A62421A62421A62421A62421A62421A62421A503515000000472E10603E15 5F3E155E3D1662421A62421A62421A62421A62421A62421A000000281A095F3D15603E155D3D15 62421A62421A62421A62421A62421A62421A140D0523180B9B5500AB5E000B0906DFDFDF000000 4D4E4E5657585657585657585657585657585657585657585657582A2B2B00000048494A545555 5253545454555657585657585657585657585657584242430000003F3F40545555535354535455 5657585657585657585657585657585657586667683132328C8D8F73747529292941403F47351F 5E3F1962421A62421A62421A62421A62421A62421A62421A62421A472F120000005B3A14603E15 5D3D1561401962421A62421A62421A62421A62421A422C11000000543612603E155E3D15604018 62421A62421A62421A62421A62421A60401A2C2011603604AB5E005F3401686663000000222223 565758565758565758565758565758565758565758565758565758000000272728535355545555 5151525657585657585657585657585657585657580909092F3030505051545555515253565657 5657585657585657585657585657582425250E0E0E6E6F708F9092333333AFAFAFEDEDED000000 573B1762421A62421A62421A62421A62421A62421A62421A62421A442E12000000533612603E15 5E3D155F3F1762421A62421A62421A62421A62421A432D11000000492F10603E155F3D155F3E17 62421A62421A62421A62421A62421A62421A73502739240AA75C008A4C002A2520424242414142 5354555657585657585657585657585657585657585657585657580C0D0D070707505051545555 5252535555565657585657585657585657585657581B1B1B0000004A4A4B545555525354555556 5657585657585657585657585657584242430000005555568F9092505051676767000000261B0C 62421A62421A62421A62421A62421A62421A62421A62421A62421A0000002D1D0A5F3D15603E15 5D3C1562421A62421A62421A62421A62421A62421A0A060236230C5B3B14603E155D3C1561411A 62421A62421A62421A62421A62421A2A1C0B100B06834801AB5E0039260EACACAC000000454546 5657585657585657585657585657585657585657585657584C4D4D0000003E3E3F545555535455 5253545657585657585657585657585657585454550E0E0E222323535455545455525253565758 5657585657585657585657585657585455561717178081838F90920B0B0BEFEFEFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7776754B2900754000754000754000754000754000 7540007540007540007540003A1F00000000754000754000754000754000754000754000754000 754000754000552F00000000754000754000754000754000754000754000754000754000754000 7540000201009D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF4949494F5050626264 626264626264626264626264626264626264626264626264242525444445626264626264626264 6262646262646262646262646262646262643A3B3C000000626264626264626264626264626264 6262646262646262646262646161620000008D8E908F9092696A6B3B3B3BFFFFFFDD8F2FD57501 D57501D57501D57501D67601EDC491FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B2B2B2000000754000754000754000754000754000754000754000754000754000593100000000 754000754000754000754000754000754000754000754000754000754000000000754000754000 7540007540007540007540007540007540007540007540002B1B08784100AB5E00AB5E000B0906 6262624545466262646262646262646262646262646262646262646262646262642C2D2D060606 626264626264626264626264626264626264626264626264626264434344000000626264626264 62626462626462626462626462626462626462626462626400000087888A8F9092737475292929 0F0D0B6A3A007540007540007540007540007540007540007540007540007540000D0700653701 7540007540007540007540007540007540007540007540007540002F19010A0500754000754000 7540007540007540007540007540007540007540006A3A00110B04AB5E00AB5E005F3401676562 000000626264626264626264626264626264626264626264626264626264626264000000616162 6262646262646262646262646262646262646262646262646262640A0A0A575758626264626264 6262646262646262646262646262646262646262644C4D4E4142438F90928F9092333333AFAFAF 696765522D00754000754000754000754000754000754000754000754000754000351D01080400 754000754000754000754000754000754000754000754000754000502C00000000754000754000 754000754000754000754000754000754000754000754000000000A25901AB5E008A4C002A2520 10101059595A6262646262646262646262646262646262646262646262646262640F1010555657 626264626264626264626264626264626264626264626264626264272728080808626264626264 62626462626462626462626462626462626462626459595A1C1C1D8F90928F9092505051666666 000000754000754000754000754000754000754000754000754000754000754000000000743F00 7540007540007540007540007540007540007540007540007540000C0700673800754000754000 7540007540007540007540007540007540007540005C32014D2C04AB5E00AB5E0039260E7A7A7A 0000006262646262646262646262646262646262646262646262646262644C4C4D000000626264 626264626264626264626264626264626264626264626264626264000000616263626264626264 6262646262646262646262646262646262646262641F1F1F5F60618F90928F90920B0B0BEFEFEF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501 D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501 D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501 D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5B5B5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616162B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFF F1CFA5E8B270DB8822D57501D57501D57501D67601F3D6B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501D57501D57501 A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501000000 D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C784100AB5E00 AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F9092 7374752929292F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D57501 2212019A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100693900 D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00AB5E00 5F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151516848586 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928F9092 333333AFAFAF706E6B744000D57501D57501D57501D57501D57501D57501D57501D57501D57501 512C00633601D57501D57501D57501D57501D57501D57501D57501D57501D57501824701281601 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080502A25901AB5E00 8A4C002A25202E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 1C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333575758 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E902122228F90928F9092 5050516666660A0704D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 020100CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501190F029D5600 D57501D57501D57501D57501D57501D57501D57501D57501D575017440004D2D04AB5E00AB5E00 39260E7A7A7A393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5898A8B 1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B53636376364658F90928F9092 0B0B0BEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501 D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501 D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501 D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFF FFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737 616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B 3B3B3BFFFFFFFFFFFFFFFFFFFFFEFDEEC592D67703D57501D57501DB861FFFFDFAFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501 D57501D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C 784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707 88898B8F90927374752929292F2923AA5D00D57501D57501D57501D57501D57501D57501D57501 D57501D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501D57501 3C2100693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0A AB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 151516848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5616162424243 8F90928F9092333333AFAFAF716F6C744000D57501D57501D57501D57501D57501D57501D57501 D57501D57501512C00633601D57501D57501D57501D57501D57501D57501D57501D57501D57501 824701281601D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080602 A25901AB5E008A4C002A25202E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 323333575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E90212222 8F90928F90925050516666660A0704D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501020100CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501 190F029D5600D57501D57501D57501D57501D57501D57501D57501D57501D575017440004D2D04 AB5E00AB5E0039260E7A7A7A393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363737636465 8F90928F90920B0B0BEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7978 6E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501 D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501 D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEC592D57501D57501D57501F3D7B4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501 D57501D57501D57501D57501A25901231301D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501000000D47401D57501D57501D57501D57501D57501D57501D57501D57501 D575013E280C784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B507070788898B8F90927374752929292F2923AA5D00D57501D57501D57501D57501D57501 D57501D57501D57501D575012213019A5400D57501D57501D57501D57501D57501D57501D57501 D57501D575013C2100693900D57501D57501D57501D57501D57501D57501D57501D57501D57501 A95D00261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5151516848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6161624242438F90928F9092333333AFAFAF716F6C744000D57501D57501D57501D57501D57501 D57501D57501D57501D57501512C00633601D57501D57501D57501D57501D57501D57501D57501 D57501D57501824701281601D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501080602A25901AB5E008A4C002A25202E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5323333575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 8D8E902122228F90928F90925050516666660A0704D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501020100CF7201D57501D57501D57501D57501D57501D57501D57501 D57501D57501190F029D5600D57501D57501D57501D57501D57501D57501D57501D57501D57501 7440004D2D04AB5E00AB5E0039260E7A7A7A393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 3637376364658F90928F90920B0B0BEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00 221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFCD98116D57501 D57501E9B678FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501 D57501D57501D57501D57501D57501D57501A25901231301D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501000000D47401D57501D57501D57501D57501D57501D57501 D57501D57501D575013E280C784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B507070788898B8F90927374752929292F2923AA5D00D57501D57501D57501 D57501D57501D57501D57501D57501D575012213019A5400D57501D57501D57501D57501D57501 D57501D57501D57501D575013C2100693900D57501D57501D57501D57501D57501D57501D57501 D57501D57501A95D00261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5151516848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B56161624242438F90928F9092333333AFAFAF716F6C744000D57501D57501D57501 D57501D57501D57501D57501D57501D57501512C00633601D57501D57501D57501D57501D57501 D57501D57501D57501D57501824701281601D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501080602A25901AB5E008A4C002A25202E2E2E8D8E90B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5323333575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B58D8E902122228F90928F90925050516666660A0704D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501020100CF7201D57501D57501D57501D57501D57501 D57501D57501D57501D57501190F029D5600D57501D57501D57501D57501D57501D57501D57501 D57501D575017440004D2D04AB5E00AB5E0039260E7A7A7A393939B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B1B2B4373C405A6E857588A17588A124374EAFC2D9B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3BBCEE4E6EDF4FEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600 AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E09840D57501D57501E5A85EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501 D57501D57501D57501D57501D57501D57501D57501D57501A25901231301D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501000000D47401D57501D57501D57501D57501 D57501D57501D57501D57501D575013E280C784100AB5E00AB5E000B0906696969616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F90927374752929292F2923AA5D00D57501 D57501D57501D57501D57501D57501D57501D57501D575012213019A5400D57501D57501D57501 D57501D57501D57501D57501D57501D575013C2100693900D57501D57501D57501D57501D57501 D57501D57501D57501D57501A95D00261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151516848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928F9092333333AFAFAF716F6C744000D57501 D57501D57501D57501D57501D57501D57501D57501D57501512C00633601D57501D57501D57501 D57501D57501D57501D57501D57501D57501824701281601D57501D57501D57501D57501D57501 D57501D57501D57501D57501D57501080602A25901AB5E008A4C002A25202E2E2E8D8E90B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B58D8E902122228F90928F90925050516666660A0704D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501020100CF7201D57501D57501D57501 D57501D57501D57501D57501D57501D57501190F029D5600D57501D57501D57501D57501D57501 D57501D57501D57501D575017440004D2D04AB5E00AB5E0039260E7A7A7A393939B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5AFB0B239444F4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD769CC9FAFAFAFEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501 D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501 D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 0E0A049D5600AB5E00904F00211D18FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B333333FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2 422B0ED57501D57501D57501D57501D57501D57501D57501D57501D57501A25901231301D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501000000D47401D57501D57501 D57501D57501D57501D57501D57501D57501D575013E280C784100AB5E00AB5E000B0906696969 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F90927374752929292F2923 AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D575012213019A5400D57501 D57501D57501D57501D57501D57501D57501D57501D575013C2100693900D57501D57501D57501 D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00AB5E005F34016765620A0A0A B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151516848586B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928F9092333333AFAFAF716F6C 744000D57501D57501D57501D57501D57501D57501D57501D57501D57501512C00633601D57501 D57501D57501D57501D57501D57501D57501D57501D57501824701281601D57501D57501D57501 D57501D57501D57501D57501D57501D57501D57501080602A25901AB5E008A4C002A25202E2E2E 8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D818183B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333575758B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E902122228F90928F90925050516666660A0704 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501020100CF7201D57501 D57501D57501D57501D57501D57501D57501D57501D57501190F029D5600D57501D57501D57501 D57501D57501D57501D57501D57501D575017440004D2D04AB5E00AB5E0039260E7A7A7A393939 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5898A8B1C1C1CB2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4ADAEB0353C435070965C7BA25B7BA13453797897BD7C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17497C04F81BD6992C3 F2F2F2FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501 D57501D57501D57501D57501D575015A3100593100D57501D57501D57501D57501D57501D57501 D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501 D57501D575010B06009D5600AB5E007A4300050200FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00202028F90928F90925656570B0B0BFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501D57501D57501A25901 231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501000000D47401 D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C784100AB5E00975300 100E0B5E5E5E616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445 535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F9092646566 2525252F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D57501221301 9A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100693900D57501 D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00AA5D0050320C 5756550A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151516848586B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F909288898B2A2A2A 999999716F6C744000D57501D57501D57501D57501D57501D57501D57501D57501D57501512C00 633601D57501D57501D57501D57501D57501D57501D57501D57501D57501824701281601D57501 D57501D57501D57501D57501D57501D57501D57501D57501D57501080602A25901AB5E00784403 2523202E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B51C1D1D 818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333575758B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E902122228F90928E8F91454647 5555560A0704D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501020100 CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501190F029D5600D57501 D57501D57501D57501D57501D57501D57501D57501D575017440004D2D04AB5E00A359012E2213 6B6B6B393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5898A8B1C1C1C B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000B0B1B3B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4ADAEB03132325152536F6F716061620B0B0B A2A2A2C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C0C0C0A6B0BB 4F81BD668FC0EAEAEAFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501 D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501 D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501 D57501D57501D57501D575010E08009D5600673900070400181512FFFFFFFFFFFFFFFFFFFFFFFF 5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5373737616162 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092474748080808333333 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501D57501 D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C784100 8448010F0C08BABABA707070616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D 222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B 5454551A1A1AE1E1E12F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501 D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100 693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AA85C00 3B240846433FEBEBEB0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5151516 848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5616162424243828385 1B1B1B7E7E7EFFFFFF716F6C744000D57501D57501D57501D57501D57501D57501D57501D57501 D57501512C00633601D57501D57501D57501D57501D57501D57501D57501D57501D57501824701 281601D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501080602A25901 6438021B1915E0E0E02E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5323333 575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E902122228D8E90 333434444444ECECEC0A0704D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501020100CF7201D57501D57501D57501D57501D57501D57501D57501D57501D57501190F02 9D5600D57501D57501D57501D57501D57501D57501D57501D57501D575017440004D2D049C5500 1F150A7F7D7BB3B3B3393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5000000 B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4AFB0B233343458595A606062 0C0C0C9F9F9FDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDBDBDB D5D5D5B0BAC54F81BD658EBFE7E7E7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00 D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501 D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501 D57501D57501D57501D57501D57501D575010E0800643701080400774100221E19FFFFFFFFFFFF FFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 373737616162B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB003030347474809090A 5E5E5F3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501 D57501D57501D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D57501 3E280C6E3C000F0C08BABABAFFFFFF707070616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 0707075253541A1A1AE1E1E1FFFFFF2F2923AA5D00D57501D57501D57501D57501D57501D57501 D57501D57501D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501 D575013C2100693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00 25190A3B240846433FF8F8F8F2F2F20A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5151516848586B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5616162 3E3F401B1B1B7E7E7EFFFFFFFFFFFF716F6C744000D57501D57501D57501D57501D57501D57501 D57501D57501D57501512C00633601D57501D57501D57501D57501D57501D57501D57501D57501 D57501824701281601D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 0806026237021B1915E0E0E0FFFFFF2E2E2E8D8E90B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B51C1D1D818183B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5323333575758B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B58D8E90 212121333434444444F8F8F8F3F3F30A0704D57501D57501D57501D57501D57501D57501D57501 D57501D57501D57501020100CF7201D57501D57501D57501D57501D57501D57501D57501D57501 D57501190F029D5600D57501D57501D57501D57501D57501D57501D57501D57501D57501744000 492A041F150A7F7D7BFFFFFFB3B3B3393939B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5898A8B1C1C1CB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5000000B0B1B3B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B1B2B4353636 58595A0E0E0EB1B1B1F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F2F2F2EAEAEABBC5D04F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7978776034019D56009D56009D56009D56009D56009D56009D56009D56009D56004F2B004C2A00 9D56009D56009D56009D56009D56009D56009D56009D56009D5600743F00180D009D56009D5600 9D56009D56009D56009D56009D56009D56009D56009D5600000000060300834801904F00221E19 FFFFFFFFFFFFFFFFFFFFFFFF555555626264838385838385838385838385838385838385838385 838385838385313131555556838385838385838385838385838385838385838385838385838385 4F5051252626838385838385838385838385838385838385838385838385838385818284000000 09090A7A7A7C696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501 E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B236230C9D56009D56009D56009D5600 9D56009D56009D56009D56009D56007741001C0F009D56009D56009D56009D56009D56009D5600 9D56009D56009D56009D56000000009D56009D56009D56009D56009D56009D56009D56009D5600 9D56009D5600261907000000BABABAFFFFFFFFFFFF6F6F6F555657838385838385838385838385 8383858383858383858383858383853D3D3E484849838385838385838385838385838385838385 8383858383858383855B5B5D1A1A1A838385838385838385838385838385838385838385838385 838385838385000000181818E1E1E1FFFFFFFFFFFF2A251F9250009D56009D56009D56009D5600 9D56009D56009D56009D56009D56001C10008C4D009D56009D56009D56009D56009D56009D5600 9D56009D56009D5600341C015B32009D56009D56009D56009D56009D56009D56009D56009D5600 9D5600914F0002010046433FF8F8F8FFFFFFF2F2F2020202838385838385838385838385838385 838385838385838385838385838385000000818284838385838385838385838385838385838385 83838583838583838510101178787A838385838385838385838385838385838385838385838385 8383855454550202027E7E7EFFFFFFFFFFFFFFFFFF706E6B6638019D56009D56009D56009D5600 9D56009D56009D56009D56009D5600492800552F009D56009D56009D56009D56009D56009D5600 9D56009D56009D56006D3C001F11009D56009D56009D56009D56009D56009D56009D56009D5600 9D56009D5600000000191613E0E0E0FFFFFFFFFFFF2A2A2A7A7A7C838385838385838385838385 838385838385838385838385838385171818757577838385838385838385838385838385838385 8383858383858383852C2C2D4B4B4C838385838385838385838385838385838385838385838385 838385797A7B020202444444F8F8F8FFFFFFF3F3F30101009D56009D56009D56009D56009D5600 9D56009D56009D56009D56009D56000000009B55009D56009D56009D56009D56009D56009D5600 9D56009D56009D5600140B018E4E009D56009D56009D56009D56009D56009D56009D56009D5600 9D56006537010201007F7D7BFFFFFFFFFFFFB3B3B32F2F2F838385838385838385838385838385 838385838385838385838385656567161616838385838385838385838385838385838385838385 838385838385838385000000828384838385838385838385838385838385838385838385838385 838385212122000000B7B7B7FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFBFBFBF2F2F2C0CAD54F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7877760804001B10021B10021B10021B10021B10021B10021B10021B10021B1002 080500090500190E001A0E00190E00190E011B10021B10021B10021B10021B10020D07000C0700 190E001A0E00190E00190E011B10021B10021B10021B10021B1002150C01040200955100AB5E00 904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF3A3A3A0B0B0B171717171717171717171717171717 171717171717171717161616050505080808151616151616141515151616171717171717171717 171717161717050505090909151616151616151515151616171717171717171717171717171717 1313130505058383858F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45 D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED3C37323F39323F3932 3F39323F39323F39323F39323F39323F39323F393234302A15100A3E38313F39323F39323F3932 3F39323F39323F39323F39323F393239342D17120B3D37303F39323F39323F39323F39323F3932 3F39323F39323F39323C3730070706DDDDDDFFFFFFFFFFFFFFFFFFD5D5D52424243D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D2020201818183D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D2627272626263D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D373838282828F6F6F6FFFFFFFFFFFFFFFFFF95918C342F293F39323F3932 3F39323F39323F39323F39323F39323F39323D373007030027221D3F39323F39323F39323F3932 3F39323F39323F39323F39323E38311614111D19153F39323F39323F39323F39323F39323F3932 3F39323F39323F39322A26218C8781FEFEFEFFFFFFFFFFFFFCFCFC5A5A5A3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3939390C0C0C3637373D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3A3A3A090909292A2A3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3C3C3C181818B5B5B6FFFFFFFFFFFFFFFFFFFFFFFFD5D4D325221D3F39323F3932 3F39323F39323F39323F39323F39323F39323F3932211E1A1A16113F39323F39323F39323F3932 3F39323F39323F39323F39323F393228242028221B3F39323F39323F39323F39323F39323F3932 3F39323F39323F393239342D282623F6F6F6FFFFFFFFFFFFFFFFFF9494943232323D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3B3B3B0606062525253D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3C3C3C1616161C1C1C3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D2829298A8A8BFEFEFEFFFFFFFFFFFFFDFDFD5C57523F39323F39323F3932 3F39323F39323F39323F39323F39323F39323B362F0E090338322B3F39323F39323F39323F3932 3F39323F39323F39323F39323C37300A07012B27213F39323F39323F39323F39323F39323F3932 3F39323F39323E3831191613B6B4B1FFFFFFFFFFFFFFFFFFEDEDED3B3B3B3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3334341313143C3C3C3D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3D3D3D3D3D3D3738381515153B3B3B3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D 3D3D3D3D3D3D3A3A3A070707DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501 D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D57501 8D4E00201200D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04 9D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5A5A5B6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363636616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00202028F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6 F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501 D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501 D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501 D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD 658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501 D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501 D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501 D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4 C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501 D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501 D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501 D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFF FFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B 3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7978 6E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501 D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501 D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00 221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F90928F9092696A6B2C2C2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501 D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A3100593100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 201200D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010A06009D5600 AB5E008D4D00070400FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB00202028F90928F90925E5F60151515FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFED9E3EFC4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7 C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C4D4E7C3D3E6BDCDE09CB2CC4F81BD658EBFE6E6E6F9F9F9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501 D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501 D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 0E08009D5600864901070400100E0CFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F3030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB00303038F9092656667050505313131FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFDFDE2E9F04F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD678FBF E6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501 D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501 D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501 D57501D575010E08008247010804005E3301221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303036566670505064F50513B3B3BFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAFAFACED8E34F81BD5685BE7598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C1 7598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17598C17497C07194BD 7193BCA0B1C5E7E7E7FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786C3B00CE7100CE7100 CE7100CE7100CE7100CE7100CE7100CE7100CE7100593100583000CE7100CE7100CE7100CE7100 CE7100CE7100CE7100CE7100CE71008C4D001F1100CE7100CE7100CE7100CE7100CE7100CE7100 CE7100CE7100CE7100CE7100020100060300633601904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF 5959596C6D6EACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF353636606061 ACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAFACADAF58595A2D2D2EACADAFACADAF ACADAFACADAFACADAFACADAFACADAFACADAFACADAFABABAD000000050506626364696A6B3B3B3B FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF6F6F6C5CFDA4F81BD638CBDBDBDBDC1C1C1 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C1C1C1C0C0C0C3C3C3D5D5D5EDEDEDFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787876000000 030100030100030100030100030100030100030100030100030100000000000000030100030100 030100030100030100030100030100030100030100000000000000030100030100030100030100 0301000301000301000301000301000000000000007E4500AB5E00904F00221E19FFFFFFFFFFFF FFFFFFFFFFFF3A3A3A000000020202020202020202020202020202020202020202020202020202 020202000000020202020202020202020202020202020202020202020202020202000000000000 0202020202020202020202020202020202020202020202020202020101010000006263648F9092 696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEF3F5F8F3F3F3C1CBD64F81BD638CBD CBCBCBD5D5D5D1D3D6D9D9D9D9D9D9DADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA DADADADADADAD9D9D9DADADADEDEDEE9E9E9F6F6F6FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7978776E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100 D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00201100D57501D57501 D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19 FFFFFFFFFFFFFFFFFFFFFFFF59595A6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5353636616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0000000 8F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501 E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFC9EB8D85283BEC9D5E3BFC9D4 4F81BD648DBED9D9D98CAACD5283BED1DAE5F1F1F1F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2 F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F3F3F3F5F5F5F9F9F9FDFDFDFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D57501 5A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201 D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00 904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45 D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F7F7A1B8D44F81BD 6A93C4B9C4D04F81BD658EBFBCC6D34F81BD5383BEDAE0E7F8F8F8FCFCFCFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501 D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D57501 8D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04 9D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF2F2F2 D9DBDC5F8ABF4F81BD8AA4C34F81BD648DBE6A91C04F81BD8CA7C7E6E6E6F8F8F8FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501 D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501 D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501D57501D57501 D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FDFDFDF4F4F4DEDEDEA0B0C34F81BD5685BD4F81BD5B87BC4F81BD5A87BDC7CACCE8E8E8F9F9F9 FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501 D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501D57501D57501 D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501D57501D57501 D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C 6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B3B3B3BFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFEFEFEF9F9F9E8E8E8CECECE6A8FBC4F81BD4F81BD5081BC4F81BD687B90878787 9696969E9E9EA0A0A0A0A0A0A0A0A0959595A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A4A4A4A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0939393A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A09D9D9DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0E3E3E3FFFFFFFFFFFFFFFFFFFFFFFFCDCDCDA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0989898A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A2A2A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0999999A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A5A5A5A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4E4E4A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0939393A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A09D9D9DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0E2E2E2FFFFFFFFFFFFFFFFFFFFFFFFCDCDCDA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0989898A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A2A2A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFB5B5B5A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0999999A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A5A5A5A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 B3B3B3FFFFFFFFFFFFFFFFFFFFFFFFFCFCFCA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A0A0A0A0A0A0949494A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 A0A0A0A0A0A0A3A3A3A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0 CACACAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501 D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501D57501D57501 D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501D57501D57501 D57501D57501D57501D57501D575010F0A049D5600AB5E00904F00221E19FFFFFFFFFFFFFFFFFF FFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637 616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F90928F9092696A6B 313131FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF3F3F3B9B9B9292E344E7FBB4F81BD4F81BD4A6D97 422E164A341950381B52391B533A1C3F2C15110B040C0802533A1C533A1C533A1C533A1C533A1C 533A1C533A1C533A1C4933180D0803040200533A1C533A1C533A1C533A1C533A1C533A1C533A1C 533A1C533A1C000000000000E2E2E2FFFFFFFFFFFFADADAD0909094444444A4A4B4A4A4B4A4A4B 4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B2020210808083A3A3A4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B 4A4A4B4A4A4B4A4A4B2E2E2E0F0F0F0C0C0C4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B 4A4A4B444445000000000000FFFFFFFFFFFFFFFFFF75716E02020151391B533A1C533A1C533A1C 533A1C533A1C533A1C533A1C533A1C0F09040302004B3316533A1C533A1C533A1C533A1C533A1C 533A1C533A1C533A1C140D06080501452F14533A1C533A1C533A1C533A1C533A1C533A1C533A1C 533A1C392813000000212120FFFFFFFFFFFFF2F2F24848480707074A4A4B4A4A4B4A4A4B4A4A4B 4A4A4B4A4A4B4A4A4B4A4A4B4747480B0B0B02020249494A4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B 4A4A4B4A4A4B4A4A4B0606060101014646474A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B4A4A4B 4A4A4B1616170000008D8D8DFFFFFFFFFFFFFFFFFFADACAB09070641281D472B20472B20472B20 472B20472B20472B20472B20472B2021130E070402371E14472B20472B20472B20472B20472B20 472B20472B20472B202D1A140E07040C0604472B20472B20472B20472B20472B20472B20472B20 472B2042281D000000000000FFFFFFFFFFFFFFFFFF71717101010237383939393A39393A39393A 39393A39393A39393A39393A39393A09090901010132323339393A39393A39393A39393A39393A 39393A39393A39393A0E0E0E0505052D2E2F39393A39393A39393A39393A39393A39393A39393A 39393A272828000000212121FFFFFFFFFFFFF2F2F247423F060403472B20472B20472B20472B20 472B20472B20472B20472B2044291E0A0503030101472B1F472B20472B20472B20472B20472B20 472B20472B20472B2005030201000043281D472B20472B20472B20472B20472B20472B20472B20 472B20160D090000008D8D8DFFFFFFFFFFFFD7D7D72727272E2E2F39393A39393A39393A39393A 39393A39393A39393A39393A2C2C2D0B0B0B08080839393A39393A39393A39393A39393A39393A 39393A39393A33343508080902020239393A39393A39393A39393A39393A39393A39393A39393A 39393A000000000000E1E1E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A7978 6E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A31005A3100D57501 D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501D57501D57501 D57501D57501D57501D57501D57501D57501D575010F0A049D5600AB5E00914F00231F1AFFFFFF FFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B 303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB00303038F9092 8F909268696A242424FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19C47D57501D57501E4A557 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFECACACA110F0C7B501C6B77874F81BD 4F81BD937044BD7B2AD1882FDA8E31DD9032B274280B070288591FDD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD9032CB842D140D05543612DC8F31DD9032DD9032DD9032DD9032DD9032 DD9032DD9032DD903268461B24180A070503F0F0F0FFFFFFA0A0A0151616A4A5A6C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F6F09090A9C9D9FC1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C48E8F900808087A7B7CC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4BABBBD333434323233282828FFFFFFFEFEFE605D5A382815D3892FDD9032DD9032 DD9032DD9032DD9032DD9032DD9032DD9032432B0F231708CE862EDD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD90326A45170B0702B57628DD9032DD9032DD9032DD9032DD9032DD9032 DD9032DD9032BF7C2B19120A4F2C016D6B68FFFFFFEFEFEF2D2D2D595A5AC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC181818454546C0C1C3C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C42C2C2D202121B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C488888A0F0F102A2A2BAFAFAFFFFFFFFFFFFFA09F9E150F0D9D5334B9623EB9623E B9623EB9623EB9623EB9623EB9623EB9623E6A3823090503954F32B9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E89482D070402753E27B9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623EB25E3B311E162F160B272220FFFFFFFEFEFE5D5D5D27282885878A8C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918C8E912A2B2C1516168284878C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E914444460707077274768C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E91797B7D1212122B2C2D6B6B6BFFFFFFEFEFEF2D2928563121B9623EB9623EB9623E B9623EB9623EB9623EB9623EB9623EB15E3B170C08422216B8613DB9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E2A170F1F100AAD5B3AB9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623E82452B0F090728160FAFAFAFFFFFFFD0D0D01112125F61638C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918C8E917173750707075657598C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918284860D0D0D3435368B8D908C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E91454647171718060606EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501D575015A3100 5A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00211201D57501 D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A049D5600945100171109 969594FFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5ADAEB0 0303038F9092747577101010ECECECFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5A85DD57501 D57501DF953BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF12100D925F21C27E2B A26E30547EB16C7782B27428CA842DD78C30DC8F31B274280B070288591FDD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD9032CB842D140D05543612DC8F31DD9032DD9032DD9032DD9032 DD9032DD9032DD9032DD903268461B24180A9E56000B0906F0F0F0A0A0A0151616A4A5A6C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C46E6F6F09090A9C9D9FC1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C48E8F900808087A7B7CC1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4BABBBD33343439393A727375292929FEFEFE605D5A382815D3892FDD9032 DD9032DD9032DD9032DD9032DD9032DD9032DD9032432B0F231708CE862EDD9032DD9032DD9032 DD9032DD9032DD9032DD9032DD90326A45170B0702B57628DD9032DD9032DD9032DD9032DD9032 DD9032DD9032DD9032BF7C2B19120A683A025F34016D6B68EFEFEF2D2D2D595A5AC1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4B9BABC181818454546C0C1C3C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C4C1C2C4C1C2C42C2C2D202121B5B6B8C1C2C4C1C2C4C1C2C4C1C2C4C1C2C4 C1C2C4C1C2C4C1C2C488888A0F0F10717273333333AFAFAFFFFFFFA09F9E150F0D9D5334B9623E B9623EB9623EB9623EB9623EB9623EB9623EB9623E6A3823090503954F32B9623EB9623EB9623E B9623EB9623EB9623EB9623EB9623E89482D070402753E27B9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623EB25E3B311E1637190D6D2609282321FEFEFE5D5D5D27282885878A8C8E91 8C8E918C8E918C8E918C8E918C8E918C8E918C8E912A2B2C1516168284878C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918C8E914444460707077274768C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E91797B7D12121238393B3233356B6B6BEFEFEF2D2928563121B9623EB9623E B9623EB9623EB9623EB9623EB9623EB9623EB15E3B170C08422216B8613DB9623EB9623EB9623E B9623EB9623EB9623EB9623EB9623E2A170F1F100AAD5B3AB9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623E82452B0F09076A2609301A11AFAFAFD0D0D01112125F61638C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918C8E917173750707075657598C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918284860D0D0D3435368B8D908C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E91454647171718525457090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501D57501D57501 D575015A31005A3100D57501D57501D57501D57501D57501D57501D57501D57501D575018D4E00 211201D57501D57501D57501D57501D57501D57501D57501D57501D57501D575010F0A04914F00 171109969594FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5595A5B303030B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5ADAEB0030303747577101010ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECBF88D57501D57501D67703FAEEDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCDCD000000463015 543A19503718473115464B504436234B3316523818553A19412D130000003E280D533511523411 4F3413563B1A563B1A563B1A563B1A563B1A5037180000002E1E095335115235114E3312563B1A 563B1A563B1A563B1A563B1A563B1A0000006D4A1FA05801AB5E000B09068D8D8D000000474748 4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E1D1D1D0000003F3F4048494A464647 4848494D4D4E4D4D4E4D4D4E4D4D4E4D4D4E2B2B2B00000038393948494A4647474747484D4D4E 4D4D4E4D4D4E4D4D4E4D4D4E4747480000004141428E8F917374752929292F2E2D3C2D1A553A1A 563B1A563B1A563B1A563B1A563B1A563B1A563B1A563B1A0503002C1C094F33105335114F3311 543918563B1A563B1A563B1A563B1A563B1A0D09030000004A2F0F5335114F3311533817563B1A 563B1A563B1A563B1A563B1A382611000000703F02AB5E005F3401666461000000292A2A4D4D4E 4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E00000029292A48494A48494A434445 4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E4D4D4E02020228282846464748494A4444454C4C4D4D4D4E 4D4D4E4D4D4E4D4D4E4D4D4E1010101414147475778F9092333333AFAFAF96969600000044271C 4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F1C100B0000003C1F13452416432215 45261A4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F2B1811000000361C114524164323154426194A2B1F 4A2B1F4A2B1F4A2B1F4A2B1F44271C0000003E1D0F862F0B6D26092823212E2E2E2C2C2D39393A 3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C0303031C1C1D313233343436323234 3838393A3B3C3A3B3C3A3B3C3A3B3C3A3B3C0909090000002E2F303434363232343737393A3B3C 3A3B3C3A3B3C3A3B3C3A3B3C2526260000003C3E405A5C5F3233356464640000002818124A2B1F 4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F00000028150D452316452416402215 4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F4A2B1F02010026140C422215452416412215492A1E4A2B1F 4A2B1F4A2B1F4A2B1F4A2B1F0F0906130C096E270987300C301A118D8D8D0000002F30313A3B3C 3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C2C2D2D000000262728343436333435323334 3A3B3C3A3B3C3A3B3C3A3B3C3A3B3C3737380000001D1D1E3434363434353232343A3B3C3A3B3C 3A3B3C3A3B3C3A3B3C3A3B3C000000494A4B5455585A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A79786E3C00D57501D57501D57501D57501D57501D57501 D57501D57501D575015A3100593100D57501D57501D57501D57501D57501D57501D57501D57501 D575018D4E00201200D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 080602130E08969594FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C5C5C6E6E70B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5363637616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5595A5B2F2F30B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5ADAEB0000000101010ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFF9EBDAD67601D57501D57501DF953BFEFAF4FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2 0000008147018046007C44007540006E3C00703E007842007E4500804600623501000000814701 814701814701814701814701814701814701814701814701814701000000814701814701814701 8147018147018147018147018147018147018147012D1D09784100AB5E00AB5E000B0906656565 5050516C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E3232321010106C6C6E 6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E4A4B4C0000006C6C6E6C6C6E6C6C6E 6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E00000088898B8F909273747529292913100E 764100814701814701814701814701814701814701814701814701814701140B00723E00814701 814701814701814701814701814701814701814701814701311B01160C00814701814701814701 814701814701814701814701814701814701764100211608AB5E00AB5E005F3401676562000000 6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E0000006A6B6C6C6C6E 6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E0C0C0C6060616C6C6E6C6C6E6C6C6E 6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E6C6C6E4F50504142438F90928F9092333333AFAFAF6B6968 4B1B066624096624096624096624096624096624096624096624096624092E10040F0501662409 662409662409662409662409662409662409662409662409461806000000662409662409662409 662409662409662409662409662409662409662409000000802D0B87300C6D2609282321121212 3E3F414445474445474445474445474445474445474445474445474445470B0B0B3C3D3F444547 4445474445474445474445474445474445474445474445471A1A1B0B0B0C444547444547444547 4445474445474445474445474445474445473E3F411515165A5C5F5A5C5F323335656565000000 662409662409662409662409662409662409662409662409662409662409000000642409662409 6624096624096624096624096624096624096624096624090B04025A2008662409662409662409 6624096624096624096624096624096624094B1B063E190A87300C87300C301A117A7A7A000000 444547444547444547444547444547444547444547444547444547343537000000444547444547 444547444547444547444547444547444547444547444547000000434447444547444547444547 4445474445474445474445474445474445471C1D1D3E40425A5C5F5A5C5F090909EFEFEFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9A8A70000001A130B1A130B1A130B1A130B 1A130B1A130B1A130B1A130B1A130B0000000000001711081A130B1A130B1A130B1A130B1A130B 1A130B1A130B1A130B0302000000001710081A130B1A130B1A130B1A130B1A130B1A130B1A130B 1A130B151009000000B2B0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F7F7F000000 171717171717171717171717171717171717171717171717171717030303000000161616171717 171717171717171717171717171717171717171717000000000000151516171717171717171717 171717171717171717171717171717151515000000ADADADFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5A85ED57501D57501D57501DC8B27F1D1A9FEFAF4FFFFFF FFFFFFB2B2B2422B0ED57501D57501D27301CE7100C86E00CA6F00CF7201D47401D57501A25901 231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501000000D47401 D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C784100AB5E00AB5E00 0B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445 535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F9092737475 2929292F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D57501221301 9A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100693900D57501 D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00AB5E005F3401 6765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202 ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616838486B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928F9092333333 AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F401605 4E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C6D2609 2823212A2A2B595A5D707276707276707276707276707276707276707276707276707276121213 5152557072767072767072767072767072767072767072767072767072761F2021363739707276 707276707276707276707276707276707276707276707276595B5E1818195A5C5F5A5C5F323335 656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000 A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C87300C301A11 7A7A7A292A2A70727670727670727670727670727670727670727670727670727656575A121212 7072767072767072767072767072767072767072767072767072767072760000006F7175707276 7072767072767072767072767072767072767072767072762727283E40425A5C5F5A5C5F090909 EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BFBFBFE1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1BEBEBEE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FCFCFCE1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E0E0E0DCDCDC E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1C4C4C4E1E1E1E1E1E1 E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1E1C7C7C7FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF5ECDC8B27D57501D57501D57501D57501 D67703E3A252FFFFFFB2B2B2422B0ED57501D57501D47401D37401D17301D27301D47401D57501 D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501 000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C784100 AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D 222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B 8F90927374752929292F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501 D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100 693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00 AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616 838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F9092 8F9092333333AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409 200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B 87300C6D26092823212A2A2B595A5D707276707276707276707276707276707276707276707276 7072761212135152557072767072767072767072767072767072767072767072767072761F2021 363739707276707276707276707276707276707276707276707276707276595B5E1818195A5C5F 5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F140804 7C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C 87300C301A117A7A7A292A2A707276707276707276707276707276707276707276707276707276 56575A121212707276707276707276707276707276707276707276707276707276707276000000 6F71757072767072767072767072767072767072767072767072767072762727283E40425A5C5F 5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF0E2DC8A25D57501 D57501D57501D57501E19A43FFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501 D57501D57501D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501 D57501D57501000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D57501 3E280C784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 07070788898B8F90927374752929292F2923AA5D00D57501D57501D57501D57501D57501D57501 D57501D57501D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501 D575013C2100693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00 261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5161616838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5616162 4242438F90928F9092333333AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 070403802D0B87300C6D26092823212A2A2B595A5D707276707276707276707276707276707276 707276707276707276121213515255707276707276707276707276707276707276707276707276 7072761F2021363739707276707276707276707276707276707276707276707276707276595B5E 1818195A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C2008 3E190A87300C87300C301A117A7A7A292A2A707276707276707276707276707276707276707276 70727670727656575A121212707276707276707276707276707276707276707276707276707276 7072760000006F7175707276707276707276707276707276707276707276707276707276272728 3E40425A5C5F595B5E080808EEEEEEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEC592 D67702D57501D57501D57501D57501E19A43FFFFFFB2B2B2422B0ED57501D57501D57501D57501 D57501D57501D57501D57501D57501A25901231301D57501D57501D57501D57501D57501D57501 D57501D57501D57501D57501000000D47401D57501D57501D57501D57501D57501D57501D57501 D57501D575013E280C784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B507070788898B8F90927374752929292F2923AA5D00D57501D57501D57501D57501 D57501D57501D57501D57501D575012213019A5400D57501D57501D57501D57501D57501D57501 D57501D57501D575013C2100693900D57501D57501D57501D57501D57501D57501D57501D57501 D57501A95D00261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5161616838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B56161624242438F90928F9092333333AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F070403802D0B87300C6D26092823212A2A2B595A5D707276707276707276707276 707276707276707276707276707276121213515255707276707276707276707276707276707276 7072767072767072761F2021363739707276707276707276707276707276707276707276707276 707276595B5E1818195A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F5C20083E190A87300C87300C301A117A7A7A292A2A707276707276707276707276707276 70727670727670727670727656575A121212707276707276707276707276707276707276707276 7072767072767072760000006F7175707276707276707276707276707276707276707276707276 6F7175292D33455B77546B88536A87273D58A5BBD6AEC4DFAEC4DFAEC4DFAEC4DFAEC4DFAEC4DF AEC4DFAEC4DFAEC4DFAEC4DFAEC4DFAEC4DFB0C6E0E0E8F2FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F63E3C3A2C26242C26242C26242C26242C26242C2624 2C26242C26242C26242B2523050302241F1D2C26242C26242C26242C26242C26242C26242C2624 2C26242C2624030201201B182C26242C26242C26242C26242C26242C26242C26242C26242C2624 110F0E2F2D2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2F2F2F292929292929 2929292929292929292929292929292929292929292727270404041D1D1D292929292929292929 292929292929292929292929292929292929030304242424292929292929292929292929292929 2929292929292929292929290707075C5C5CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF F2D4AFD67601D57501D57501D57501D98218E5A95FF0CB9EFFFFFFB2B2B2422B0ED57501D57501 D57501D57501D57501D57501D57501D57501D57501A25901231301D57501D57501D57501D57501 D57501D57501D57501D57501D57501D57501000000D47401D57501D57501D57501D57501D57501 D57501D57501D57501D575013E280C784100AB5E00AB5E000B0906696969616263B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F90927374752929292F2923AA5D00D57501D57501 D57501D57501D57501D57501D57501D57501D575012213019A5400D57501D57501D57501D57501 D57501D57501D57501D57501D575013C2100693900D57501D57501D57501D57501D57501D57501 D57501D57501D57501A95D00261A0AAB5E00AB5E005F34016765620A0A0AB2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B56161624242438F90928F9092333333AFAFAF706D6D5C2008A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F070403802D0B87300C6D26092823212A2A2B595A5D707276707276 707276707276707276707276707276707276707276121213515255707276707276707276707276 7072767072767072767072767072761F2021363739707276707276707276707276707276707276 707276707276707276595B5E1818195A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F5C20083E190A87300C87300C301A117A7A7A292A2A707276707276707276 70727670727670727670727670727670727656575A121212707276707276707276707276707276 7072767072767072767072767072760000006F7175707276707276707276707276707276707276 7072767072766E70742D37424F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD739AC8F9F9F9FEFEFEFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6413D3C5B3626954F32954F32954F32954F32 954F32954F32954F32954F32924D311F110B402215954F32954F32954F32954F32954F32954F32 954F32954F32954F32361D12130A06964F32954F32954F32954F32954F32954F32954F32954F32 954F3286472D0201010F0D0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2D2D2D565759 7172757172757172757172757172757172757172757172756C6D6F101011424344717275717275 7172757172757172757172757172757172757172751D1D1E1B1B1C717275717275717275717275 7172757172757172757172757172755B5C5E0000002C2C2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFAF5DA841AD57501D57501D67703ECC08AFFFDFAFFFFFFFFFFFFFFFFFFB2B2B2422B0E D57501D57501D57501D57501D57501D57501D57501D57501D57501A25901231301D57501D57501 D57501D57501D57501D57501D57501D57501D57501D57501000000D47401D57501D57501D57501 D57501D57501D57501D57501D57501D575013E280C784100AB5E00AB5E00000000696969616263 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F90927374752929292F2923AA5D00 D57501D57501D57501D57501D57501D57501D57501D57501D575012213019A5400D57501D57501 D57501D57501D57501D57501D57501D57501D575013C2100693900D57501D57501D57501D57501 D57501D57501D57501D57501D57501A95D00261A0AAB5E00AB5E005E33015D5C5A0A0A0AB2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616838486B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928F9092333333AFAFAF706D6D5C2008 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C6D26092823212A2A2B595A5D 707276707276707276707276707276707276707276707276707276121213515255707276707276 7072767072767072767072767072767072767072761F2021363739707276707276707276707276 707276707276707276707276707276595B5E1818195A5C5F5A5C5F3132345C5C5C080605A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C87300C301A117A7A7A292A2A707276 70727670727670727670727670727670727670727670727656575A121212707276707276707276 7072767072767072767072767072767072767072760000006F7175707276707276707276707276 7072767072767072766F71756D6F73282D354360824B688B4B678B304C6E7D99BB839FC1839FC1 839FC1839FC1839FC1839FC1839FC1839FC1839FC1839FC1839FC17A9AC14F81BD6992C3F1F1F1 FCFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6413D3C44281CB8613DB9623EB9623E B9623EB9623EB9623EB9623EB9623EB6603D22120C301910B6603DB9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E3B2014140A06A65837B9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623E8F4C300E09075D2108201C1AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDEDED2D2D2D 4243458C8E918C8E918C8E918C8E918C8E918C8E918C8E918C8E9185878A1112123233348C8E91 8C8E918C8E918C8E918C8E918C8E918C8E918C8E918C8E912020211718188486898C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918C8E916163650C0C0C3D3F41383838FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFF1D0A8D57501D57501D57501EEC796FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501D57501D57501A25901231301 D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501000000D47401D57501 D57501D57501D57501D57501D57501D57501D57501D575013E280C784100AB5E007E450015120F 6D6D6D616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5444445535354 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B8F90925F5F61292929 2F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D575012213019A5400 D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100693900D57501D57501 D57501D57501D57501D57501D57501D57501D57501A95D00261A0AAB5E00A65B002D1D08AEACAA 0A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5020202ADAEB0 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616838486B2B3B5B2B3B5 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242438F90928686882626279E9E9E 706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C5A240D292625 2A2A2B595A5D707276707276707276707276707276707276707276707276707276121213515255 7072767072767072767072767072767072767072767072767072761F2021363739707276707276 707276707276707276707276707276707276707276595B5E1818195A5C5F57595C1C1C1DADADAD 080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0E A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C7E2C0B2519146E6E6E 292A2A70727670727670727670727670727670727670727670727670727656575A121212707276 7072767072767072767072767072767072767072767072767072760000006F7175707276707276 7072767072767072767072767072766F71756C6E7223232433343646474A3A3B3D0A0A0AA4A4A4 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C0C0C0A6B0BB4F81BD 668FC0EAEAEAFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E3A3942261BAF5D3AB05D3B B05D3BB05D3BB05D3BB05D3BB05D3BB05D3BB05D3B29170E2E180FAF5D3AB05D3BB05D3BB05D3B B05D3BB05D3BB05D3BB05D3BB05D3B552E1D120A06A45737B05D3BB05D3BB05D3BB05D3BB05D3B B05D3BB05D3BB05D3B8E4B2F0E090762230871280A201C1AFFFFFFFFFFFFFFFFFFFFFFFFFCFCFC 2A2A2A41424385878A85878A85878A85878A85878A85878A85878A85878A85878A101111313132 85878A85878A85878A85878A85878A85878A85878A85878A85878A21222316161782848785878A 85878A85878A85878A85878A85878A85878A85878A7374770C0C0C48494C424346383838FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6AD67D57501D57501DB8721FFFFFEFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501D57501D57501 A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501D57501000000 D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C7841007E4500 100D09DFDFDF707070616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56C6D6D222222 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B507070788898B4C4D4E 222222E7E7E72F2923AA5D00D57501D57501D57501D57501D57501D57501D57501D57501D57501 2213019A5400D57501D57501D57501D57501D57501D57501D57501D57501D575013C2100693900 D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D00261A0AA65B0036220A 4F4C48F2F2F20A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5161616838486 B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161624242437E7F81161617 8E8E8EFFFFFF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B491D0A 221E1DE7E7E72A2A2B595A5D707276707276707276707276707276707276707276707276707276 1212135152557072767072767072767072767072767072767072767072767072761F2021363739 707276707276707276707276707276707276707276707276707276595B5E18181957595C212122 4C4C4CF3F3F3080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0B A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A782A0A160E0A 8D8C8CB3B3B3292A2A70727670727670727670727670727670727670727670727670727656575A 1212127072767072767072767072767072767072767072767072767072767072760000006F7175 7072767072767072767072767072767072767072766F71756E707425252538393B393B3D0B0B0B A9A9A9DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCD7D7D7 B1BBC64F81BD658EBFE7E7E7F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3B2B2000000070403 080504080504080504080504080504080504080504080504000000000000060201070301060201 060302080504080504080504080504080504000000000000030100070301060301060302080504 08050408050408050408050400000000000071280A87300C71280A201C1AFFFFFFFFFFFFFFFFFF FFFFFF868686000000060607060607060607060607060607060607060607060607060607010101 000000050505050505040404050505060607060607060607060607060607000000000000030303 05050504040405050506060706060706060706060706060705050500000048494C5A5C5F424346 383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE29E4BD57501D57501E3A253FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2422B0ED57501D57501D57501D57501D57501D57501D57501 D57501D57501A25901231301D57501D57501D57501D57501D57501D57501D57501D57501D57501 D57501000000D47401D57501D57501D57501D57501D57501D57501D57501D57501D575013E280C 6C3B00100D09C4C4C4FFFFFF707070616263B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5444445535354B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 6C6D6D222222B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5070707 4A4B4C222222E7E7E7FFFFFF2F2923AA5D00D57501D57501D57501D57501D57501D57501D57501 D57501D575012213019A5400D57501D57501D57501D57501D57501D57501D57501D57501D57501 3C2100693900D57501D57501D57501D57501D57501D57501D57501D57501D57501A95D0025190A 36220A4F4C48FBFBFBF2F2F20A0A0AB2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 B2B3B5B2B3B5020202ADAEB0B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5 161616838486B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B5B2B3B56161623E3E3F 1616178E8E8EFFFFFFFFFFFF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403 471C0A221E1DE7E7E7FFFFFF2A2A2B595A5D707276707276707276707276707276707276707276 707276707276121213515255707276707276707276707276707276707276707276707276707276 1F2021363739707276707276707276707276707276707276707276707276707276595B5E181819 2121224C4C4CFBFBFBF3F3F3080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083A1709 160E0A8D8C8CFFFFFFB3B3B3292A2A707276707276707276707276707276707276707276707276 70727656575A121212707276707276707276707276707276707276707276707276707276707276 0000006F71757072767072767072767072767072767072767072767072766F7175262627363839 0C0C0CBBBBBBF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5 F4F4F4ECECECBCC6D14F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF787777 561E07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709180802A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFF FFFFFFFFFFFFFFFFFF555556454649707276707276707276707276707276707276707276707276 7072762222233D3E4070727670727670727670727670727670727670727670727670727638393B 1D1D1E7072767072767072767072767072767072767072767072767072766D6F730000005A5C5F 5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B234220B904F00904F00904F00904F00904F00 904F00904F00904F00904F006D3B001A0E00904F00904F00904F00904F00904F00904F00904F00 904F00904F00904F00000000904F00904F00904F00904F00904F00904F00904F00904F00904F00 904F002D1D09000000C4C4C4FFFFFFFFFFFF6F6F6F53535478797A78797A78797A78797A78797A 78797A78797A78797A78797A37373845454678797A78797A78797A78797A78797A78797A78797A 78797A78797A54555519191978797A78797A78797A78797A78797A78797A78797A78797A78797A 78797A0000001F1F20E7E7E7FFFFFFFFFFFF29241E854901904F00904F00904F00904F00904F00 904F00904F00904F00904F001D1000814701904F00904F00904F00904F00904F00904F00904F00 904F00904F00321B01583000904F00904F00904F00904F00904F00904F00904F00904F00904F00 854901130D074F4C48FBFBFBFFFFFFF2F2F200000078797A78797A78797A78797A78797A78797A 78797A78797A78797A78797A00000077787978797A78797A78797A78797A78797A78797A78797A 78797A78797A1010106C6D6E78797A78797A78797A78797A78797A78797A78797A78797A78797A 5152530000008E8E8EFFFFFFFFFFFFFFFFFF6F6D6C4E1C0771280A71280A71280A71280A71280A 71280A71280A71280A71280A34120441170571280A71280A71280A71280A71280A71280A71280A 71280A71280A4F1B0617080271280A71280A71280A71280A71280A71280A71280A71280A71280A 71280A0000001F1C1AE7E7E7FFFFFFFFFFFF25252546474A4B4D504B4D504B4D504B4D504B4D50 4B4D504B4D504B4D504B4D500F0F104445474B4D504B4D504B4D504B4D504B4D504B4D504B4D50 4B4D504B4D501A1B1C2E2E304B4D504B4D504B4D504B4D504B4D504B4D504B4D504B4D504B4D50 46474A0C0D0D4C4C4CFBFBFBFFFFFFF3F3F300000071280A71280A71280A71280A71280A71280A 71280A71280A71280A71280A00000070280A71280A71280A71280A71280A71280A71280A71280A 71280A71280A0F060266240971280A71280A71280A71280A71280A71280A71280A71280A71280A 4D1B060000008D8C8CFFFFFFFFFFFFB3B3B32021214B4D504B4D504B4D504B4D504B4D504B4D50 4B4D504B4D504B4D503A3B3E0D0D0D4B4D504B4D504B4D504B4D504B4D504B4D504B4D504B4D50 4B4D504B4D500000004B4C4F4B4D504B4D504B4D504B4D504B4D504B4D504B4D504B4D504B4D50 151515000000C2C2C2FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE FEFEFEFEFEFEFCFCFCF3F3F3C0CAD54F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFF FFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906 461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A 201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276 7072767072767072762223243D3E40707276707276707276707276707276707276707276707276 70727638393B1E1F207072767072767072767072767072767072767072767072767072766D6F73 0202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501 D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F2F2524D484E49424E49424E4942 4E49424E49424E49424E49424E49424E49424A463F100B054A443D4E49424E49424E49424E4942 4E49424E49424E49424E494249443E29241D4D47404E49424E49424E49424E49424E49424E4942 4E49424E49424E4942262320B7B7B7FFFFFFFFFFFFFFFFFFDEDEDE3939394C4C4C4C4C4C4C4C4C 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C3434342929294C4C4C4C4C4C4C4C4C4C4C4C4C4C4C 4C4C4C4C4C4C4C4C4C4C4C4C4242421616164B4B4B4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C 4C4C4C4C4C4C4848484D4D4DF9F9F9FFFFFFFFFFFFFFFFFFA5A29E46413B4E49424E49424E4942 4E49424E49424E49424E49424E49424E49422D282128231D4E49424E49424E49424E49424E4942 4E49424E49424E49424D48412D2A262E2A244E49424E49424E49424E49424E49424E49424E4942 4E49424E494246413B2F2E2CFBFBFBFFFFFFFFFFFFFDFDFD7171714C4C4C4C4C4C4C4C4C4C4C4C 4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4949491D1D1D4646464C4C4C4C4C4C4C4C4C4C4C4C4C4C4C 4C4C4C4C4C4C4C4C4C4A4A4A1F1F1F3C3C3C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C 4C4C4C4B4B4B303030CBCBCBFFFFFFFFFFFFFFFFFFFFFFFFDEDDDD3934324C45434C45434C4543 4C45434C45434C45434C45434C45434C4543342F2D2923214C45434C45434C45434C45434C4543 4C45434C45434C45434C45433A353338312F4C45434C45434C45434C45434C45434C45434C4543 4C45434C454347413F4D4947F9F9F9FFFFFFFFFFFFFFFFFFA3A3A4404041494949494949494949 494949494949494949494949494949494949282828232323494949494949494949494949494949 4949494949494949494848482A2A2A2A2A2A494949494949494949494949494949494949494949 4949494949494040412D2D2DFBFBFBFFFFFFFFFFFFFDFDFD716C6A4C45434C45434C45434C4543 4C45434C45434C45434C45434C45434943401C1614453F3D4C45434C45434C45434C45434C4543 4C45434C45434C45434943401E19173C36344C45434C45434C45434C45434C45434C45434C4543 4C45434B4542302C2AC9C7C7FFFFFFFFFFFFFFFFFFF2F2F24E4E4E494949494949494949494949 4949494949494949494949494949494040402A2A2A484848494949494949494949494949494949 494949494949494949444444242424474747494949494949494949494949494949494949494949 494949464646272727E8E8E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFF FFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709 1A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B 87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276 7072767072767072767072767072762223243D3E40707276707276707276707276707276707276 70727670727670727638393B1E1F20707276707276707276707276707276707276707276707276 7072766D6F730202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276 7072767072767072767072767072767072767072762223243D3E40707276707276707276707276 70727670727670727670727670727638393B1E1F20707276707276707276707276707276707276 7072767072767072766D6F730202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBF E6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649 7072767072767072767072767072767072767072767072767072762223243D3E40707276707276 70727670727670727670727670727670727670727638393B1E1F20707276707276707276707276 7072767072767072767072767072766D6F730202025A5C5F5A5C5F424346383838FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD6 4F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF 5959594546497072767072767072767072767072767072767072767072767072762223243D3E40 70727670727670727670727670727670727670727670727670727638393B1E1F20707276707276 7072767072767072767072767072767072767072766D6F730202025A5C5F5A5C5F424346323232 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD F4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709190902A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0A04027C2C0B87300C72280A191412FFFFFFFFFFFF FFFFFFFFFFFF595959454649707276707276707276707276707276707276707276707276707276 2223243D3E4070727670727670727670727670727670727670727670727670727638393B1E1E1F 7072767072767072767072767072767072767072767072767072766D6F730101025A5C5F5A5C5F 4041430B0B0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709190902A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0A04017C2C0B7D2C0B120601030100 FFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276707276 7072767072762223243D3E40707276707276707276707276707276707276707276707276707276 38393B1D1E1F7072767072767072767072767072767072767072767072767072766D6F73010101 5A5C5F4F51530708081C1C1CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501 E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFDFDFDF4F4F4C1CBD64F81BD658EBFE6E6E6F9F9F9FFFFFFFFFFFFFFFFFF FFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0B0401792B0A130702 210D04201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276 7072767072767072767072762223243D3E40707276707276707276707276707276707276707276 70727670727638393B1E1E1F707276707276707276707276707276707276707276707276707276 6D6F730202024F51530808081D1E1F383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45 D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFDFDFDCEDBEBB9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3 B9CCE3B9CCE3B9CCE3B9CCE3B9CCE3B8CBE2B3C6DD95ADCB4F81BD658EBFE6E6E6F9F9F9FFFFFF FFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 6F2709190902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F080301 110602240E0571280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF585859454649707276707276707276 7072767072767072767072767072767072762223243D3E40707276707276707276707276707276 70727670727670727670727638393B1D1E1F707276707276707276707276707276707276707276 7072767072766D6F73000000080808212122424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFDFDFDE0E7EF4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD 4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD4F81BD678FBFE6E6E6 F9F9F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF454545000000200B03200B03200B03200B03200B03 200B03200B03200B03200B030502000000001F0B031F0B031F0B031F0B03200B03200B03200B03 200B03200B030C04000000001E0B031F0B031F0B031F0B03200B03200B03200B03200B03200B03 1D0A030000002D120687300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF1F1F1F000000151616 151616151616151616151616151616151616151616151616020202000000151516151516151516 151516151616151616151616151616151616020303000000141515151516151516151516151616 1516161516161516161516161313140000002728295A5C5F424346383838FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFEFEFEFAFAFACDD7E24F81BD5786BE7C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC1 7C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17C9BC17B9AC07897BD7796BB A6B5C6E8E8E8FAFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7877773B1505672409672409672409 672409672409672409672409672409672409311103180802672409672409672409672409672409 6724096724096724096724094D1B06040100672409672409672409672409672409672409672409 6724096724096724090603027C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF515152 30313244454844454844454844454844454844454844454844454844454816171728282A444548 444548444548444548444548444548444548444548444548272829080909444548444548444548 4445484445484445484445484445484445484445470000005A5C5F5A5C5F424346383838FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF6F6F6C5CFDA4F81BD638CBDBDBDBDC1C1C1C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3 C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C2C2C2 C0C0C0C4C4C4D6D6D6EEEEEEFBFBFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFF FFFFFF595959454649707276707276707276707276707276707276707276707276707276222224 3D3E4070727670727670727670727670727670727670727670727670727638393B1E1F20707276 7072767072767072767072767072767072767072767072766D6F730202025A5C5F5A5C5F424346 383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFBFCFDEAEFF5F3F3F3C1CBD64F81BD638CBDCCCCCC D5D6D7CBD0D6DADADADBDBDBDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDBDBDBDCDCDCE0E0E0EBEBEBF7F7F7FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878 561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFF FFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276707276707276 7072762222243D3E4070727670727670727670727670727670727670727670727670727638393B 1E1F207072767072767072767072767072767072767072767072767072766D6F730202025A5C5F 5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFCFCFC98B4D64F81BDC2CFE0BFC9D44F81BD 648DBEDADADA85A5CB5081BDCFD9E5F2F2F2F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4 F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F6F6F6F9F9F9FDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906 461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A 201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276 7072767072767072762222243D3E40707276707276707276707276707276707276707276707276 70727638393B1E1F207072767072767072767072767072767072767072767072767072766D6F73 0202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501 D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF6F6F6A5BBD64F81BD658FC2 B9C4CF4F81BD658EBFB7C3D24F81BD5484BEDDE2E8F8F8F8FCFCFCFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709 1A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B 87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276 7072767072767072767072767072762222243D3E40707276707276707276707276707276707276 70727670727670727638393B1E1F20707276707276707276707276707276707276707276707276 7072766D6F730202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF E19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF2F2F2DADBDC 628DC04F81BD85A1C24F81BD648DBE678FC04F81BD91A9C7E6E6E6F8F8F8FEFEFEFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276 7072767072767072767072767072767072767072762222243D3E40707276707276707276707276 70727670727670727670727670727638393B1E1F20707276707276707276707276707276707276 7072767072767072766D6F730202025A5C5F5A5C5F424346373737FFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFD F4F4F4DEDEDEA4B2C44F81BD5484BD4F81BD5A87BD4F81BD5D89BEC9CBCDE8E8E8F9F9F9FEFEFE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F0B05037C2C0B87300C71280A1D1816FFFFFFFFFFFFFFFFFFFFFFFF595959454649 7072767072767072767072767072767072767072767072767072762222243D3E40707276707276 70727670727670727670727670727670727670727638393B1E1E1F707276707276707276707276 7072767072767072767072767072766D6F730202025A5C5F5A5C5F4143450E0E0EFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFEFEFEF9F9F9E9E9E9CFCFCF6D91BB4F81BD4F81BD4F80BC4F81BD6272867B7B7B888888 8F8F8F919191919191737373626262919191919191919191919191919191919191919191919191 919191919191969696919191919191919191919191919191919191919191919191919191919191 727272FFFFFFFFFFFFFFFFFFFFFFFFE0E0E0919191919191919191919191919191919191919191 919191919191919191838383919191919191919191919191919191919191919191919191919191 919191878787848484919191919191919191919191919191919191919191919191919191919191 DEDEDEFFFFFFFFFFFFFFFFFFFCFCFC787878919191919191919191919191919191919191919191 919191919191919191505050919191919191919191919191919191919191919191919191919191 919191656565919191919191919191919191919191919191919191919191919191919191868686 ECECECFFFFFFFFFFFFFFFFFFFFFFFFA9A9A9919191919191919191919191919191919191919191 9191919191919191918A8A8A919191919191919191919191919191919191919191919191919191 919191989898919191919191919191919191919191919191919191919191919191919191A7A7A7 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0E0919191919191919191919191919191919191919191 9191919191919191915B5B5B919191919191919191919191919191919191919191919191919191 919191878787858585919191919191919191919191919191919191919191919191919191919191 DEDEDEFFFFFFFFFFFFFFFFFFFFFFFFC5C5C5919191919191919191919191919191919191919191 9191919191919191918B8B8B919191919191919191919191919191919191919191919191919191 9191913C3C3C919191919191919191919191919191919191919191919191919191919191919191 F9F9F9FFFFFFFFFFFFFFFFFFE9E9E97C7C7C919191919191919191919191919191919191919191 919191919191909090535353919191919191919191919191919191919191919191919191919191 9090905D5D5D919191919191919191919191919191919191919191919191919191919191626262 FFFFFFFFFFFFFFFFFFFFFFFFFCFCFC919191919191919191919191919191919191919191919191 9191919191917777777E7E7E919191919191919191919191919191919191919191919191919191 919191969696919191919191919191919191919191919191919191919191919191919191C2C2C2 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F6F2709190902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F0903017C2C0B862F0B371405040100FFFFFFFFFFFFFFFFFFFFFFFF 5959594546497072767072767072767072767072767072767072767072767072762222243D3E40 70727670727670727670727670727670727670727670727670727638393B1D1E1F707276707276 7072767072767072767072767072767072767072766D6F730101015A5C5F57595C1414150D0D0D FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFDFDFDF3F3F3B0B0B01D20284F7FBA4F81BD4F81BD496992402519 492A1C4E2D1F502E1F512F203F24180603024C2819512F20512F20512F20512F20512F20512F20 512F20512F2044271B0A05030D0704512F20512F20512F20512F20512F20512F20512F20512F20 512F20362118000000F2F2F2FFFFFFFFFFFF9A9A9A0404043B3C3D3F40413F40413F40413F4041 3F40413F40413F40413F40411819190303033435363F40413F40413F40413F40413F40413F4041 3F40413F40412F2F300909091414153F40413F40413F40413F40413F40413F40413F40413F4041 38393A000000000000FFFFFFFFFFFFFCFCFC545150482E23512F20512F20512F20512F20512F20 512F20512F20512F20512F201F120C0402014C2B1D512F20512F20512F20512F20512F20512F20 512F20512F20100906150B074D2B1C512F20512F20512F20512F20512F20512F20512F20512F20 492A1D0000006A6867FFFFFFFFFFFFEBEBEB3232320E0F0F3F40413F40413F40413F40413F4041 3F40413F40413F40413B3B3C0707070909093F3F403F40413F40413F40413F40413F40413F4041 3F40413F40410505050303033C3D3E3F40413F40413F40413F40413F40413F40413F40413F4041 1111120000008D8D8DFFFFFFFFFFFFFFFFFF9B9A9A0504034C2C1E512F20512F20512F20512F20 512F20512F20512F20512F201E110B130A064B291A512F20512F20512F20512F20512F20512F20 512F20512F203C22170C06041A0E09512F20512F20512F20512F20512F20512F20512F20512F20 48291C000000000000FFFFFFFFFFFFFDFDFD5D5D5D0505053E3E403F40413F40413F40413F4041 3F40413F40413F40413F40410909090303033B3B3C3F40413F40413F40413F40413F40413F4041 3F40413F40412021211010103D3D3E3F40413F40413F40413F40413F40413F40413F40413F4041 2A2A2B0000001E1E1EFFFFFFFFFFFFE9E9E9262221563224512F20512F20512F20512F20512F20 512F20512F20512F204B2B1E130B070C0604502E20512F20512F20512F20512F20512F20512F20 512F20502E1F060302311A104F2D1F512F20512F20512F20512F20512F20512F20512F20512F20 41251A000000B5B5B5FFFFFFFFFFFFCBCBCB1A1A1A3636373F40413F40413F40413F40413F4041 3F40413F40413F40412C2C2D0505053A3A3B3F40413F40413F40413F40413F40413F40413F4041 3F40413536370707080A0A0A3F40413F40413F40413F40413F40413F40413F40413F40413F4041 000000000000E5E5E5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0B04017B2C0B2B0F041107031E1B19FFFFFFFFFFFF FFFFFFFFFFFF595959454649707276707276707276707276707276707276707276707276707276 2222243D3E4070727670727670727670727670727670727670727670727670727638393B1E1E1F 7072767072767072767072767072767072767072767072767072766D6F7302020257595C161717 0F0F10383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501E4A659FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEC2C2C20E0C0B6D3924636A844F81BD5081BC 7E53479F5435B05D3BB7613DB9623E8C4A2E0804037C4129B9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623EA556370E0805512B1BB9623EB9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623E502E1F22120C050303F0F0F0FFFFFF9191911515157B7D7F8C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918C8E9148494B08080976777A8C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E915F61630505056061638C8E918C8E918C8E918C8E918C8E918C8E918C8E91 8C8E91848689212222262728262626FFFFFFFCFCFC545150362119B6603DB9623EB9623EB9623E B9623EB9623EB9623EB9623EB8613D2E181024130CB05D3BB9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623E4F2A1A0C0604A45737B9623EB9623EB9623EB9623EB9623EB9623EB9623E B9623E9A5133120C094017066B6968FFFFFFE9E9E9242424494A4B8C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918183860E0E0F3A3B3C8C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918B8D901A1A1B1D1E1E85878A8C8E918C8E918C8E918C8E918C8E918C8E918C8E91 8C8E915D5E600D0D0D202021AFAFAFFFFFFFFFFFFF93929219110EA25636B9623EB9623EB9623E B9623EB9623EB9623EB9623EB9623E5F321F0B0603A25636B9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623E7E432A0704027E422AB9623EB9623EB9623EB9623EB9623EB9623EB9623E B9623EAF5D3A2A1A1336170B282321FFFFFFFCFCFC5151512C2D2E888A8D8C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918B8D902424251B1B1B85878A8C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E913B3C3E0909097C7D808C8E918C8E918C8E918C8E918C8E918C8E918C8E91 8C8E917577790F0F0F2B2C2E6B6B6BFFFFFFE9E9E92622215F3523B9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623EAC5B39130A074C2819B9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623EB8613D24140D25140CB5603CB9623EB9623EB9623EB9623EB9623EB9623EB9623E B9623E7B4129100A081B0F0AAFAFAFFFFFFFC6C6C60F0F106567698C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E916B6B6E0606065D5E608C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E917C7E810A0B0B3C3D3F8C8E918C8E918C8E918C8E918C8E918C8E918C8E918C8E91 8C8E913D3E3F1B1B1C070707EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709190902A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0B0401290E041208036D2609201C1A FFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276707276 7072767072762222243D3E40707276707276707276707276707276707276707276707276707276 38393B1D1E1F7072767072767072767072767072767072767072767072767072766D6F73010101 161717111212414245383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45D57501D57501 E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6C6C60F0C0B81442BA356368B4E36 547BAF65687F964F32AA5A39B45F3CB8613D9B52330804037C4129B9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623EA556370E0805512B1BB9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623E502E1F22120C7F2D0B0A0706F0F0F09191911515157B7D7F8C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918C8E9148494B08080976777A8C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E916567690505056061638C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918486892122222B2C2D484A4C262626FFFFFF545150362119B35F3CB9623EB9623E B9623EB9623EB9623EB9623EB9623EB8613D2E181024130CB05D3BB9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E4F2A1A0C06049E5335B9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623EA35636120C095820094B1A066B6968E9E9E9242424494A4B8C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918183860E0E0F3A3B3C8C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918B8D901A1A1B1D1E1E85878A8C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E915D5E600D0D0D4A4C4E252627AFAFAFFFFFFF93929219110EA25636B9623EB9623E B9623EB9623EB9623EB9623EB9623EB9623E6033200B06039B5234B9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E86472C0704027E422AB9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623EAF5D3A2A1A133D1B0D6D2609282321FCFCFC5151512C2D2E888A8D8C8E918C8E91 8C8E918C8E918C8E918C8E918C8E918B8D902424251B1B1B85878A8C8E918C8E918C8E918C8E91 8C8E918C8E918C8E918C8E913D3F4009090977787B8C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E917577790F0F0F3C3D3F3233356B6B6BF3F3F32622215F3523B9623EB9623EB9623E B9623EB9623EB9623EB9623EB9623EAE5C3A130A074C2819B9623EB9623EB9623EB9623EB9623E B9623EB9623EB9623EB9623E24140D25140CB15D3BB9623EB9623EB9623EB9623EB9623EB9623E B9623EB9623E7E432A100A086F2709301A11AFAFAFC6C6C60F0F106567698C8E918C8E918C8E91 8C8E918C8E918C8E918C8E918C8E917172750606065D5E608C8E918C8E918C8E918C8E918C8E91 8C8E918C8E918C8E917C7E810A0B0B3C3D3F8C8E918C8E918C8E918C8E918C8E918C8E918C8E91 8C8E918C8E913D3E3F1B1B1C555659090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF6F6E6E0000004E1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B07 1707010000004D1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B072A0F03000000 4D1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B074E1B07000000180A04832E0B 71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF3D3D3D0B0B0B343537343537343537343537343537 343537343537343537343537070707030304333436343537333437343537343537343537343537 3435373435370E0E0F000000333436343537333537343537343537343537343537343537343537 323234000000111212585A5D424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE19B45 D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4C4C40000003621183E261C 3B241B352018393C4B3425223822193D251B3F261C3D251B00000029150D3B1E123A1D12371E13 40271D40271D40271D40271D40271D3923190000001F10093B1E123A1D12371D1340271D40271D 40271D40271D40271D40271D41281E1A0E097F2D0B87300C0A07067F7F7F050505303031333435 3334353334353334353334353334353334353334350C0C0D0000002727282C2D2D2A2B2B2D2E2F 3334353334353334353334353334352526260000002222232C2D2D2A2B2C2C2D2E333435333435 3334353334353334352D2E2E0000002E30315A5C5F484A4C2626269792900F0A083F261C40271D 40271D40271D40271D40271D40271D40271D40271D0D08051C0E09381C113B1E12371D123D241A 40271D40271D40271D40271D40271D000000000000341A103B1E12371D123D231940271D40271D 40271D40271D40271D3A231A09060458200987300C4B1A0662605F000000242525333435333435 3334353334353334353334353334353334353333340000001818182C2C2D2C2D2D282929333435 333435333435333435333435333435010101191A1A2A2B2C2C2D2D28292A323334333435333435 3334353334353334350000001313134D4F515A5C5F252627AFAFAF8888880504033C241A40271D 40271D40271D40271D40271D40271D40271D40271D170D0A000000321A0F3B1E12381D123B2117 40271D40271D40271D40271D40271D2F1C140000002D170E3B1E12381D123A201640271D40271D 40271D40271D40271D392319000000421D0E87300C6D26092823211C1C1C232323333334333435 3334353334353334353334353334353334353334350101011717172A2A2B2C2D2D292A2B303132 3334353334353334353334353334352525260000002627272C2D2D2A2A2B303031333435333435 3334353334353334351A1A1A0000004143455A5C5F3233356A6A6A06050528191340271D40271D 40271D40271D40271D40271D40271D40271D40271D0000001E0F093B1E123B1E12351C1140271D 40271D40271D40271D40271D40271D070301040201381C113B1E12361C1240261C40271D40271D 40271D40271D40271D321F160402026F270987300C301A118686860000002A2B2B333435333435 3334353334353334353334353334353334352829290000001F20202C2D2D2B2C2C2A2B2B333435 3334353334353334353334352E2E2F0000001717182C2D2D2B2C2D292A2B333435333435333435 33343533343533343500000045474756585A5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFF767575220C023A14043A14043A14043A14043A14043A14043A1404 3A14043A14041C09020301003A14043A14043A14043A14043A14043A14043A14043A14043A1404 2A0F030000003A14043A14043A14043A14043A14043A14043A14043A14043A14043A1404020101 7C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF4545451D1E1F262728262728262728 2627282627282627282627282627282627280D0D0E171718262728262728262728262728262728 262728262728262728262728171718000000262728262728262728262728262728262728262728 262728262728262628000000585A5D5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFE19B45D57501D57501E4A659FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2050301 6F27096E26086B25086523085F21076122076824086D26086E2608541D060000006F27096F2709 6F27096F27096F27096F27096F27096F27096F27096F27090000006F27096F27096F27096F2709 6F27096F27096F27096F27096F27096F270921100A5C200887300C87300C0A0706646464333436 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E2222241010114A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E3334360000004A4B4E4A4B4E4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E00000055575A5A5C5F484A4C262626090807662409 6F27096F27096F27096F27096F27096F27096F27096F27096F27091106016323086F27096F2709 6F27096F27096F27096F27096F27096F27096F2709280E031507016F27096F27096F27096F2709 6F27096F27096F27096F27096F2709662409120A0787300C87300C4B1A066563620000004A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E000000494A4D4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E0808094243464A4B4E4A4B4E4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E3334362B2C2D5A5C5F5A5C5F252627AFAFAF6C6A694D1B06 6F27096F27096F27096F27096F27096F27096F27096F27096F27093412041206016F27096F2709 6F27096F27096F27096F27096F27096F27096F27094D1B060000006F27096F27096F27096F2709 6F27096F27096F27096F27096F27096F2709000000802D0B87300C6D2609282321151515444548 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E0B0C0C4243454A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E1A1B1C0D0D0E4A4B4E4A4B4E4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4445481616175A5C5F5A5C5F3233356565650000006F2709 6F27096F27096F27096F27096F27096F27096F27096F27096F27090000006E27096F27096F2709 6F27096F27096F27096F27096F27096F27096F27090903016423086F27096F27096F27096F2709 6F27096F27096F27096F27096F27094D1B0638170987300C87300C301A117A7A7A0303044A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E393A3C0000004A4B4E4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E000000494B4D4A4B4E4A4B4E4A4B4E4A4B4E 4A4B4E4A4B4E4A4B4E4A4B4E4A4B4E1E1E1F3E40425A5C5F5A5C5F090909EFEFEFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF585859454649707276 7072767072767072767072767072767072767072767072762222243D3E40707276707276707276 70727670727670727670727670727670727638393B1E1F20707276707276707276707276707276 7072767072767072767072766D6F730202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFE19A44D57501D57501E4A75BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF B2B2B2371D12A83C0FA83C0FA63B0EA23A0E9E380EA0390EA43A0EA73B0EA83C0F7F2D0A1B0A02 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F000000A73B0EA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F5E210887300C87300C0A0706 6868683D3E407072767072767072767072767072767072767072767072767072762B2B2D343537 707276707276707276707276707276707276707276707276707276434547151516707276707276 70727670727670727670727670727670727670727670727605050655575A5A5C5F484A4C262626 2C252386300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1B0A02792B0A A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004531D07A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B20120C87300C87300C4B1A06656362 0808087072767072767072767072767072767072767072767072767072767072760101016D6F73 7072767072767072767072767072767072767072767072767072760E0F0F535457707276707276 7072767072767072767072767072767072767072763D3E402B2C2D5A5C5F5A5C5F252627AFAFAF 706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C6D2609282321 2A2A2B595A5D707276707276707276707276707276707276707276707276707276121213515255 7072767072767072767072767072767072767072767072767072761F2021363739707276707276 707276707276707276707276707276707276707276595A5D19191A5A5C5F5A5C5F323335656565 080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0E A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C87300C301A117A7A7A 292A2A70727670727670727670727670727670727670727670727670727656575A121212707276 7072767072767072767072767072767072767072767072767072760000006F7175707276707276 7072767072767072767072767072767072767072762727283E40425A5C5F5A5C5F090909EFEFEF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959 4546497072767072767072767072767072767072767072767072767072762222243D3E40707276 70727670727670727670727670727670727670727670727638393B1E1F20707276707276707276 7072767072767072767072767072767072766D6F730202025A5C5F5A5C5F424346383838FFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD8D2CD57501D57501E8B26FFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFB2B2B2371D12A83C0FA83C0FA83C0FA63B0EA63B0EA63B0EA73B0EA83C0FA83C0F 7F2D0A1B0A02A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F000000 A73B0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F5E210887300C 87300C0A07066868683D3E40707276707276707276707276707276707276707276707276707276 2B2B2D343537707276707276707276707276707276707276707276707276707276434547151516 70727670727670727670727670727670727670727670727670727670727605050655575A5A5C5F 484A4C2626262D262486300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 1B0A02792B0AA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004531D07 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B20120C87300C87300C 4B1A06656362080808707276707276707276707276707276707276707276707276707276707276 0101016D6F737072767072767072767072767072767072767072767072767072760E0F0F535457 7072767072767072767072767072767072767072767072767072763D3E402B2C2D5A5C5F5A5C5F 252627AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C 6D26092823212A2A2B595A5D707276707276707276707276707276707276707276707276707276 1212135152557072767072767072767072767072767072767072767072767072761F2021363739 707276707276707276707276707276707276707276707276707276595A5D19191A5A5C5F5A5C5F 323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0B A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C87300C 301A117A7A7A292A2A70727670727670727670727670727670727670727670727670727656575A 1212127072767072767072767072767072767072767072767072767072767072760000006F7175 7072767072767072767072767072767072767072767072767072762727283E40425A5C5F5A5C5F 090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFFFFFFFFFFFFFF FFFFFF595959454649707276707276707276707276707276707276707276707276707276222224 3D3E4070727670727670727670727670727670727670727670727670727638393B1E1F20707276 7072767072767072767072767072767072767072767072766D6F730202025A5C5F5A5C5F424346 383838FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9EAD8D57501D57501D57501EEC796FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFB2B2B2371D12A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F7F2D0A1B0A02A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F000000A73B0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F 5E210887300C87300C0A07066868683D3E40707276707276707276707276707276707276707276 7072767072762B2B2D343537707276707276707276707276707276707276707276707276707276 434547151516707276707276707276707276707276707276707276707276707276707276050506 55575A5A5C5F484A4C2626262D262486300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F1B0A02792B0AA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 2F1004531D07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B20120C 87300C87300C4B1A06656362080808707276707276707276707276707276707276707276707276 7072767072760101016D6F73707276707276707276707276707276707276707276707276707276 0E0F0F5354577072767072767072767072767072767072767072767072767072763D3E402B2C2D 5A5C5F5A5C5F252627AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403 802D0B87300C6D26092823212A2A2B595A5D707276707276707276707276707276707276707276 707276707276121213515255707276707276707276707276707276707276707276707276707276 1F2021363739707276707276707276707276707276707276707276707276707276595A5D19191A 5A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A 87300C87300C301A117A7A7A292A2A707276707276707276707276707276707276707276707276 70727656575A121212707276707276707276707276707276707276707276707276707276707276 0000006F71757072767072767072767072767072767072767072767072767072762727283E4042 5A5C5F5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878 561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A201C1AFFFFFF FFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276707276707276 7072762222243D3E4070727670727670727670727670727670727670727670727670727638393B 1E1F207072767072767072767072767072767072767072767072767072766D6F730202025A5C5F 5A5C5F424346383838FFFFFFFFFFFFFFFFFFFFFFFFFEFAF5DF953AD57501D57501D67702FBF1E5 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2371D12A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F7F2D0A1B0A02A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F000000A73B0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F331A0F5E210887300C87300C0A07066868683D3E40707276707276707276707276707276 7072767072767072767072762B2B2D343537707276707276707276707276707276707276707276 707276707276434547151516707276707276707276707276707276707276707276707276707276 70727605050655575A5A5C5F484A4C2626262D262486300CA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F1B0A02792B0AA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F2F1004531D07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 852F0B20120C87300C87300C4B1A06656362080808707276707276707276707276707276707276 7072767072767072767072760101016D6F73707276707276707276707276707276707276707276 7072767072760E0F0F535457707276707276707276707276707276707276707276707276707276 3D3E402B2C2D5A5C5F5A5C5F252627AFAFAF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F070403802D0B87300C6D26092823212A2A2B595A5D707276707276707276707276707276 707276707276707276707276121213515255707276707276707276707276707276707276707276 7072767072761F2021363739707276707276707276707276707276707276707276707276707276 595A5D19191A5A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 5C20083E190A87300C87300C301A117A7A7A292A2A707276707276707276707276707276707276 70727670727670727656575A121212707276707276707276707276707276707276707276707276 7072767072760000006F7175707276707276707276707276707276707276707276707276707276 2727283E40425A5C5F5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906 461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B87300C71280A 201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276707276707276 7072767072767072762222243D3E40707276707276707276707276707276707276707276707276 70727638393B1E1F207072767072767072767072767072767072767072767072767072766D6F73 0202025A5C5F5A5C5F424346383838FFFFFFFFFFFFFFFDFBF3D8B6DD8D2CD57501D57501D57501 E6AC65FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2371D12A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F7F2D0A1B0A02A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F000000A73B0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F331A0F5E210887300C87300C0A07066868683D3E40707276707276707276 7072767072767072767072767072767072762B2B2D343537707276707276707276707276707276 707276707276707276707276434547151516707276707276707276707276707276707276707276 70727670727670727605050655575A5A5C5F484A4C2626262D262486300CA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1B0A02792B0AA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F2F1004531D07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F852F0B20120C87300C87300C4B1A06656362080808707276707276707276707276 7072767072767072767072767072767072760101016D6F73707276707276707276707276707276 7072767072767072767072760E0F0F535457707276707276707276707276707276707276707276 7072767072763D3E402B2C2D5A5C5F5A5C5F252627AFAFAF706D6D5C2008A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F070403802D0B87300C6D26092823212A2A2B595A5D707276707276707276 707276707276707276707276707276707276121213515255707276707276707276707276707276 7072767072767072767072761F2021363739707276707276707276707276707276707276707276 707276707276595A5D19191A5A5C5F5A5C5F323335656565080605A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F5C20083E190A87300C87300C301A117A7A7A292A2A707276707276707276707276 70727670727670727670727670727656575A121212707276707276707276707276707276707276 7072767072767072767072760000006F7175707276707276707276707276707276707276707276 7072767072762727283E40425A5C5F5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F6F2709 1A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0D07057C2C0B 87300C71280A201C1AFFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276707276707276 7072767072767072767072767072762222243D3E40707276707276707276707276707276707276 70727670727670727638393B1E1F20707276707276707276707276707276707276707276707276 7072766D6F730202025A5C5F5A5C5F424346383838FFFFFFE3A150D77C0CD57501D57501D57501 D57501DC8B27FDF6EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2371D12A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F7F2D0A1B0A02A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F000000A73B0EA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F331A0F5E210887300C87300C0A07066868683D3E40707276 7072767072767072767072767072767072767072767072762B2B2D343537707276707276707276 707276707276707276707276707276707276434547151516707276707276707276707276707276 70727670727670727670727670727605050655575A5A5C5F484A4C2626262D262486300CA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1B0A02792B0AA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004531D07A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F852F0B20120C87300C87300C4B1A06656362080808707276707276 7072767072767072767072767072767072767072767072760101016D6F73707276707276707276 7072767072767072767072767072767072760E0F0F535457707276707276707276707276707276 7072767072767072767072763D3E402B2C2D5A5C5F5A5C5F252627AFAFAF706D6D5C2008A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C6D26092823212A2A2B595A5D707276 707276707276707276707276707276707276707276707276121213515255707276707276707276 7072767072767072767072767072767072761F2021363739707276707276707276707276707276 707276707276707276707276595A5D19191A5A5C5F5A5C5F323335656565080605A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F5C20083E190A87300C87300C1E110B7A7A7A292A2A707276707276 70727670727670727670727670727670727670727656575A121212707276707276707276707276 7072767072767072767072767072767072760000006F7175707276707276707276707276707276 7072767072767072767072762727283E40425A5C5F5A5C5F090909EFEFEFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 0D07057C2C0B87300C57230E282524FFFFFFFFFFFFFFFFFFFFFFFF595959454649707276707276 7072767072767072767072767072767072767072762222243D3E40707276707276707276707276 70727670727670727670727670727638393B1E1F20707276707276707276707276707276707276 7072767072767072766D6F730202025A5C5F5A5C5F3536383C3C3CFFFFFFDD8F2FD57501D57501 D57501D57501DD8F30FBEFE1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B2 371D12A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F7F2D0A1B0A02A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F000000A73B0EA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F5E210887300C6D2609100E0D5F5F5F 3D3E407072767072767072767072767072767072767072767072767072762B2B2D343537707276 707276707276707276707276707276707276707276707276434547151516707276707276707276 70727670727670727670727670727670727670727605050655575A5A5C5F3A3B3D2D2D2D2D2624 86300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1B0A02792B0AA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004531D07A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B20120C87300C832E0B391E13616060080808 7072767072767072767072767072767072767072767072767072767072760101016D6F73707276 7072767072767072767072767072767072767072767072760E0F0F535457707276707276707276 7072767072767072767072767072767072763D3E402B2C2D5A5C5F5254561D1D1DA4A4A4706D6D 5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F4016054E1B07A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B87300C54220E2E2B2A2A2A2B 595A5D707276707276707276707276707276707276707276707276707276121213515255707276 7072767072767072767072767072767072767072767072761F2021363739707276707276707276 707276707276707276707276707276707276595A5D19191A5A5C5F57595C2B2B2C616161080605 A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000A43A0EA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A87300C73290A0504039E9E9E292A2A 70727670727670727670727670727670727670727670727670727656575A121212707276707276 7072767072767072767072767072767072767072767072760000006F7175707276707276707276 7072767072767072767072767072767072762727283E40425A5C5F494A4D0F0F0FDADADAFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0F0D07057C2C0B451B0B262321EAEAEAFFFFFFFFFFFFFFFFFFFFFFFF595959454649 7072767072767072767072767072767072767072767072767072762222243D3E40707276707276 70727670727670727670727670727670727670727638393B1E1F20707276707276707276707276 7072767072767072767072767072766D6F73020202595B5E272829363636F4F4F4FFFFFFDD8F2F D57501D57501D98013EBBD85FEFBF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFB2B2B2371D12A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F7F2D0A 1B0A02A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F000000A73B0E A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F5E21085D2108100D0C CDCDCD6F6F6F3D3E407072767072767072767072767072767072767072767072767072762B2B2D 343537707276707276707276707276707276707276707276707276707276434547151516707276 70727670727670727670727670727670727670727670727670727605050655575A2D2E2F2A2A2A EDEDED2D262486300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1B0A02 792B0AA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004531D07A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B20120C812E0B26140D5D5A59 F0F0F0080808707276707276707276707276707276707276707276707276707276707276010101 6D6F737072767072767072767072767072767072767072767072767072760E0F0F535457707276 7072767072767072767072767072767072767072767072763D3E402B2C2D4D4F510F0F0F9C9C9C FFFFFF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F401605 4E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409200B03A83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F070403802D0B411B0B2B2726 EDEDED2A2A2B595A5D707276707276707276707276707276707276707276707276707276121213 5152557072767072767072767072767072767072767072767072767072761F2021363739707276 707276707276707276707276707276707276707276707276595A5D19191A56585B1D1D1E5B5B5B F1F1F1080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F020000 A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F1408047C2C0BA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C20083E190A73290A120C0AAFAEAE B3B3B3292A2A70727670727670727670727670727670727670727670727670727656575A121212 7072767072767072767072767072767072767072767072767072767072760000006F7175707276 7072767072767072767072767072767072767072767072762727283E40423E40420F0F0FCCCCCC FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878561F07A83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F471906461906A83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0FA83C0F6F27091A0902A83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0FA83C0FA83C0FA83C0F0D0705421A0A262321EAEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 5959594546497072767072767072767072767072767072767072767072767072762222243D3E40 70727670727670727670727670727670727670727670727670727638393B1E1F20707276707276 7072767072767072767072767072767072767072766D6F73020202272829363636F4F4F4FFFFFF FFFFFFEDC390EDC18CF5DDC0FFFDFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFB2B2B2371D12A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F7F2D0A1B0A02A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F 000000A73B0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F331A0F531D07 100D0CCDCDCDFFFFFF6F6F6F3D3E40707276707276707276707276707276707276707276707276 7072762B2B2D343537707276707276707276707276707276707276707276707276707276434547 1515167072767072767072767072767072767072767072767072767072767072760505062C2D2E 2A2A2AEDEDEDFFFFFF2D262486300CA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F1B0A02792B0AA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F2F1004 531D07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F852F0B1E110B26140D 5D5A59FDFDFDF2F2F2080808707276707276707276707276707276707276707276707276707276 7072760101016D6F737072767072767072767072767072767072767072767072767072760E0F0F 5354577072767072767072767072767072767072767072767072767072763D3E402829290F0F0F 9C9C9CFFFFFFFFFFFF706D6D5C2008A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F4016054E1B07A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F672409 200B03A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F0704033F1A0B 2B2726EDEDEDFFFFFF2A2A2B595A5D707276707276707276707276707276707276707276707276 7072761212135152557072767072767072767072767072767072767072767072767072761F2021 363739707276707276707276707276707276707276707276707276707276595A5D1717181D1D1E 5B5B5BFDFDFDF3F3F3080605A83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F A83C0F020000A43A0EA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F140804 7C2C0BA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0FA83C0F5C2008391709120C0A 9C9B9BFFFFFFB3B3B3292A2A707276707276707276707276707276707276707276707276707276 56575A121212707276707276707276707276707276707276707276707276707276707276000000 6F717570727670727670727670727670727670727670727670727670727627272838393B0F0F0F CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF797878471906 682509682509682509682509682509682509682509682509682509321204381405682509682509 6825096825096825096825096825096825096825094B1A06100601682509682509682509682509 682509682509682509682509682509682509000000221F1DEAEAEAFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFF5656573A3B3E454749454749454749454749454749454749454749454749454749 1B1B1C32333545474945474945474945474945474945474945474945474945474928292A151616 454749454749454749454749454749454749454749454749454749444648000000363636F4F4F4 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2B2B229160E682509682509682509682509682509682509 6825096825096825094F1C06130601682509682509682509682509682509682509682509682509 682509682509000000682509682509682509682509682509682509682509682509682509682509 180C07010101CDCDCDFFFFFFFFFFFF6E6E6E323335454749454749454749454749454749454749 4547494547494547491F1F202A2B2C454749454749454749454749454749454749454749454749 4547492F30320E0E0F454749454749454749454749454749454749454749454749454749454749 000000272727EDEDEDFFFFFFFFFFFF26211F602208682509682509682509682509682509682509 6825096825096825091407015C2108682509682509682509682509682509682509682509682509 682509260D034318066825096825096825096825096825096825096825096825096825095E2108 0000005D5A59FDFDFDFFFFFFF2F2F2000000454749454749454749454749454749454749454749 454749454749454749000000444648454749454749454749454749454749454749454749454749 45474909090A3E3F41454749454749454749454749454749454749454749454749454749313234 0000009C9C9CFFFFFFFFFFFFFFFFFF6F6D6C4C1B06682509682509682509682509682509682509 6825096825096825092E10043F1605682509682509682509682509682509682509682509682509 682509481906160802682509682509682509682509682509682509682509682509682509682509 000000292524EDEDEDFFFFFFFFFFFF242425404143454749454749454749454749454749454749 4547494547494547490D0D0E3D3F41454749454749454749454749454749454749454749454749 4547491A1A1B2C2D2E4547494547494547494547494547494547494547494547494547493E3F42 0000005B5B5BFDFDFDFFFFFFF3F3F3000000682509682509682509682509682509682509682509 682509682509682509000000672409682509682509682509682509682509682509682509682509 6825090E05025D21086825096825096825096825096825096825096825096825096825094C1B06 0000009C9B9BFFFFFFFFFFFFB3B3B31E1F20454749454749454749454749454749454749454749 4547494547493537380C0C0D454749454749454749454749454749454749454749454749454749 454749000000454649454749454749454749454749454749454749454749454749454749131314 010101CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ECECEC4C48465B56535B56535B56535B56535B56535B56535B56535B56535B56534945443D3836 5B56535B56535B56535B56535B56535B56535B56535B56535B56534F4B494C46445B56535B5653 5B56535B56535B56535B56535B56535B56535B5653575250817D7CFBFBFBFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFD8D8D84D4D4D585858585858585858585858585858585858585858 5858585757574040403C3C3C585858585858585858585858585858585858585858585858585858 4848484949495858585858585858585858585858585858585858585858585858585454548D8D8D FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F665615F5B56535B56535B56535B5653 5B56535B56535B56535B56535B5653534E4C403A375A55535B56535B56535B56535B56535B5653 5B56535B56535B56535752504B45435954525B56535B56535B56535B56535B56535B56535B5653 5B56535954524B4746F0F0F0FFFFFFFFFFFFFFFFFFE6E6E64B4B4B585858585858585858585858 5858585858585858585858585858584646463A3A3A585858585858585858585858585858585858 5858585858585858584A4A4A494A4A585858585858585858585858585858585858585858585858 585858545454838383FCFCFCFFFFFFFFFFFFFFFFFFB3B1B055504E5B56535B56535B56535B5653 5B56535B56535B56535B56535A55522724224C47455B56535B56535B56535B56535B56535B5653 5B56535B56535A5552433F3E413D3B5B56535B56535B56535B56535B56535B56535B56535B5653 5B56534F4B49B2B0AEFFFFFFFFFFFFFFFFFFFEFEFE848484585858585858585858585858585858 5858585858585858585858585555552F2F2F545454585858585858585858585858585858585858 5858585858585656563636364C4C4C585858585858585858585858585858585858585858585858 575757454545DBDBDBFFFFFFFFFFFFFFFFFFFFFFFFE6E6E64D49475B56535B56535B56535B5653 5B56535B56535B56535B56535B56534844423C37355B56535B56535B56535B56535B56535B5653 5B56535B56535B5653534E4C211C1A5A55535B56535B56535B56535B56535B56535B56535B5653 5B565357525086817FFCFCFCFFFFFFFFFFFFFFFFFFB2B3B3535353585858585858585858585858 585858585858585858585858575757262626494949585858585858585858585858585858585858 585858585858585858474747282828585858585858585858585858585858585858585858585858 5858584D4D4DB0B1B1FFFFFFFFFFFFFFFFFFFEFEFE8782815B56535B56535B56535B56535B5653 5B56535B56535B56535B56535B5653221E1B4B46435B56535B56535B56535B56535B56535B5653 5B56535B56535954523934324E4A475B56535B56535B56535B56535B56535B56535B56535B5653 5B56534D49478A8989FFFFFFFFFFFFFFFFFFF6F6F6646464585858585858585858585858585858 5858585858585858585858585151513D3D3D585858585858585858585858585858585858585858 585858585858545454484848575757585858585858585858585858585858585858585858585858 565656484848F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFF end %%PageTrailer %%Trailer %%EOF ga-5-4/python/docs/pgas_11/bibliography.bib0000644000175000017500000004140312662210372016670 0ustar mbamba@inproceedings{Apr09, author = {Edoardo Apr\'{a} and Alistair P. Rendell and Robert J. Harrison and Vinod Tipparaju and Wibe A. deJong and Sotiris S. Xantheas}, booktitle = {SC}, interhash = {99cb2eb568650e760996ff46b941154e}, intrahash = {038d82070304c4a246d44f81af06ba17}, publisher = {ACM}, title = {Liquid water: obtaining the right answer for the right reasons.}, year = 2009, timestamp = {2009-11-23T00:00:00.000+0100}, keywords = {dblp}, ee = {http://doi.acm.org/10.1145/1654059.1654127}, added-at = {2009-11-23T00:00:00.000+0100}, description = {dblp}, isbn = {978-1-60558-744-8}, biburl = {http://www.bibsonomy.org/bibtex/2038d82070304c4a246d44f81af06ba17/dblp}, date = {2009-11-23} } % [Apr09] E. Apra, A. P. Rendell, R. J. Harrison, V. Tipparaju, W. A. % deJong, and S. S. Xantheas. *Liquid water: obtaining the right % answer for the right reasons*, Proceedings of the Conference on % High Performance Computing Networking, Storage, and Analysis, % 66:1-7, 2009. @techreport{Asc99, author = {D. Ascher and P. F. Dubois and K. Hinsen and J. Hugunin and and T. Oliphant}, title = {Numerical Python}, institution = {Lawrence Livermore National Laboratory}, year = {1999}, number = {UCRL-MA-128569} } % [Asc99] D. Ascher, P. F. Dubois, K. Hinsen, J. Hugunin, and T. Oliphant. % *Numerical Python*, UCRL-MA-128569, 1999. @article{Beh11, title={Cython: The Best of Both Worlds}, volume={13}, number={2}, journal={Computing in Science Engineering}, publisher={IEEE}, author={Behnel, Stefan and Bradshaw, Robert and Citro, Craig and Dalcin, Lisandro and Seljebotn, Dag Sverre and Smith, Kurt}, year={2011}, pages={31--39} } % [Beh11] S. Behnel, R. Bradshaw, C. Citro, L. Dalcin, D. S. Seljebotn, and % K. Smith. *Cython: The Best of Both Worlds*, Computing in Science % Engineering, 13(2):31-39, March/April 2011. @book{Buy99, author = {Buyya, Rajkumar}, title = {High Performance Cluster Computing: Architectures and Systems}, year = {1999}, isbn = {0130137847}, publisher = {Prentice Hall PTR}, address = {Upper Saddle River, NJ, USA}, } % [Buy99] R. Buyya. *High Performance Cluster Computing: Architectures and % Systems*, Vol. 1, Prentice Hall PTR, 1 edition, May 1999. @misc{Coo11, author = {David Cooke and Tim Hochberg}, title = {numexpr}, howpublished = {http://code.google.com/p/numexpr/} } @techreport{Dai09, author = {Jeff Daily}, title = {GAiN: Distributed Array Computation with Python}, institution = {Pacific Northwest National Laboratory}, year = {2009}, number = {PNNL-18355} } % [Dai09] J. Daily. *GAiN: Distributed Array Computation with Python*, % Master's thesis, Washington State University, Richland, WA, August % 2009. @inproceedings{Dai11, author = {Jeff Daily and Robert R. Lewis}, title = {Using the Global Arrays Toolkit to Reimplement NumPy for Distributed Computation}, booktitle = {Proceedings of the 10th Python in Science Conference}, year = {2011}, } % [Dai09] J. Daily. *GAiN: Distributed Array Computation with Python*, % Master's thesis, Washington State University, Richland, WA, August % 2009. @article{Dal05, author = {Dalc\'{\i}n, Lisandro and Paz, Rodrigo and Storti, Mario}, title = {MPI for Python}, journal = {J. Parallel Distrib. Comput.}, volume = {65}, issue = {9}, month = {September}, year = {2005}, issn = {0743-7315}, pages = {1108--1115}, numpages = {8}, doi = {http://dx.doi.org/10.1016/j.jpdc.2005.03.010}, acmid = {1196228}, publisher = {Academic Press, Inc.}, address = {Orlando, FL, USA}, keywords = {High level languages, MPI, Message passing, Parallel Python}, } % [Dal05] L. Dalcin, R. Paz, and M. Storti. *MPI for python*, % Journal of Parallel and Distributed Computing, 65(9):1108-1115, % September 2005. @article{Dal08, author = {Dalc\'{\i}n, Lisandro and Paz, Rodrigo and Storti, Mario and D'El\'{\i}a, Jorge}, title = {MPI for Python: Performance improvements and MPI-2 extensions}, journal = {J. Parallel Distrib. Comput.}, volume = {68}, issue = {5}, month = {May}, year = {2008}, issn = {0743-7315}, pages = {655--662}, numpages = {8}, doi = {10.1016/j.jpdc.2007.09.005}, acmid = {1360729}, publisher = {Academic Press, Inc.}, address = {Orlando, FL, USA}, keywords = {High-level languages, MPI, Message passing, Parallel Python}, } % [Dal08] L. Dalcin, R. Paz, M. Storti, and J. D'Elia. *MPI for python: % Performance improvements and MPI-2 extensions*, % Journal of Parallel and Distributed Computing, 68(5):655-662, % September 2005. @inproceedings{Din08, author = {James Dinan and Sriram Krishnamoorthy and D. Brian Larkins and Jarek Nieplocha and P. Sadayappan}, booktitle = {ICPP}, interhash = {8bbba44d89f9fd4e733693c50fb3444e}, intrahash = {9321c6a7e16b583967dc4809b19b7a1d}, pages = {586-593}, publisher = {IEEE Computer Society}, title = {Scioto: A Framework for Global-View Task Parallelism.}, year = 2008, timestamp = {2009-01-08T00:00:00.000+0100}, keywords = {dblp}, ee = {http://dx.doi.org/10.1109/ICPP.2008.44}, added-at = {2009-01-08T00:00:00.000+0100}, description = {dblp}, biburl = {http://www.bibsonomy.org/bibtex/29321c6a7e16b583967dc4809b19b7a1d/dblp}, date = {2009-01-08} } @inproceedings{Dot04, author = {Dotsenko, Yuri and Coarfa, Cristian and Mellor-Crummey, John}, title = {A Multi-Platform Co-Array Fortran Compiler}, booktitle = {Proceedings of the 13th International Conference on Parallel Architectures and Compilation Techniques}, series = {PACT '04}, year = {2004}, isbn = {0-7695-2229-7}, pages = {29--40}, numpages = {12}, doi = {http://dx.doi.org/10.1109/PACT.2004.3}, acmid = {1025994}, publisher = {IEEE Computer Society}, address = {Washington, DC, USA}, } % [Dot04] Y. Dotsenko, C. Coarfa,. and J. Mellor-Crummmey. *A Multi-Platform % Co-Array Fortran Compiler*, Proceedings of the 13th International % Conference on Parallel Architectures and Compilation Techniques, % 29-40, 2004. @article{Dub96, author = {Dubois, Paul F. and Hinsen, Konrad and Hugunin, James}, title = {Numerical Python}, journal = {Computers in Physics}, volume = {10}, issue = {3}, month = {May/June}, year = {1996} } % [Dub96] P. F. Dubois, K. Hinsen, and J. Hugunin. *Numerical Python*, % Computers in Physics, 10(3), May/June 1996. @INPROCEEDINGS{Ede07, author={Edelman, A.}, booktitle={Acoustics, Speech and Signal Processing, 2007. ICASSP 2007. IEEE International Conference on}, title={The Star-P High Performance Computing Platform}, year={2007}, month={april}, volume={4}, number={}, pages={IV-1197 -IV-1200}, keywords={C++;HPC;Interactive Supercomputing Star-P;Internet;Star-P high performance computing platform;high performance MATLAB;high speed FFT;open Star-P platform;mathematics computing;}, doi={10.1109/ICASSP.2007.367290}, ISSN={1520-6149}, } % [Ede07] A. Edelman. *The Star-P High Performance Computing Platform*, IEEE % International Conference on Acoustics, Speech, and Signal % Processing, April 2007. @mastersthesis{Eit07, author = {Benjamin Eitzen}, title = {Gpupy: Efficiently using a gpu with python}, school = {Washington State University}, year = {2007} } % [Eit07] B. Eitzen. *Gpupy: Efficiently using a gpu with python*, Master's % thesis, Washington State University, Richland, WA, August 2007. @misc{Per09, author="F. Perez and H. P. Langtangen and R. LeVeque", title="{CSE 2009: Python for Scientific Computing at CSE 2009}", howpublished="SIAM News", volume="42", number="5", year="2009", url="http://www.siam.org/news/news.php?id=1595" } % [Gra09] B. Granger and F. Perez. *Distributed Data Structures, Parallel % Computing and IPython*, SIAM CSE 2009. @book{Gro99a, author = {William Gropp and Ewing Lusk and Anthony Skjellum}, title = {Using MPI: Portable Parallel Programming with the Message-Passing Interface}, publisher = {MIT Press}, year = {1999}, edition = {2}, month = {November}, isbn = {978-0-262-57132-6} } % [Gro99a] W. Gropp, E. Lusk, and A. Skjellum. *Using MPI: Portable Parallel % Programming with the Message-Passing Interface*, second edition, % MIT Press, November 1999. @book{Gro99b, author = {William Gropp and Ewing Lusk and Rajeev Thakur}, title = {Using MPI-2: Advanced Features of the Message-Passing Interface}, publisher = {MIT Press}, year = {1999}, month = {November}, isbn = {978-0-262-57133-3} } % [Gro99b] W. Gropp, E. Lusk, and R. Thakur. *Using MPI-2: Advanced Features of % the Message-Passing Interface*, MIT Press, 1999. @misc{Har99, author = {Robert J. Harrison}, title = {Global Arrays Python Interface}, howpublished = {http://www.emsl.pnl.gov/docs/global/old/pyGA}, month = {December}, year = {1999} } % [Har99] R. J. Harrison. *Global Arrays Python Interface*, % http://www.emsl.pnl.gov/docs/global/old/pyGA/, December 1999. @inproceedings{Hus98, author = {Husbands, Parry and Isbell, Charles}, title = {The Parallel Problems Server: A Client-Server Model for Interactive Large Scale Scientific Computation}, booktitle = {Selected Papers and Invited Talks from the Third International Conference on Vector and Parallel Processing}, series = {VECPAR '98}, year = {1999}, isbn = {3-540-66228-6}, pages = {156--169}, numpages = {14}, acmid = {715282}, publisher = {Springer-Verlag}, address = {London, UK}, } % [Hus98] P. Husbands and C. Isbell. *The Parallel Problems Server: A % Client-Server Model for Interactive Large Scale Scientific % Computation*, 3rd International Meeting on Vector and Parallel % Processing, 1998. @INPROCEEDINGS{Kri04, author = {Manojkumar Krishnan and Jarek Nieplocha}, title = {SRUMMA: a matrix multiplication algorithm suitable for clusters and scalable shared memory systems}, booktitle = {in proceedings of Parallel and Distributed Processing Symposium}, year = {2004} } @book{Lun01, author = {Fredrik Lundh}, title = {Python Standard Library}, year = {2001}, month = {May}, isbn = {978-0-596-00096-7}, publisher = {O'Reilly Media}, pages = {304} } @inproceedings{Nie00, author = {Nieplocha, Jarek and Ju, Jialin and Straatsma, Tjerk P.}, title = {A Multiprotocol Communication Support for the Global Address Space Programming Model on the IBM SP}, booktitle = {Proceedings from the 6th International Euro-Par Conference on Parallel Processing}, series = {Euro-Par '00}, year = {2000}, isbn = {3-540-67956-1}, pages = {718--728}, numpages = {11}, url = {http://portal.acm.org/citation.cfm?id=646665.699092}, acmid = {699092}, publisher = {Springer-Verlag}, address = {London, UK}, } % [Nie00] J. Nieplocha, J. Ju, and T. P. Straatsma. *A multiprotocol % communication support for the global address space programming % model on the IBM SP*, Proceedings of EuroPar, 2000. @inproceedings{Nie05, author = {Nieplocha, Jarek and Krishnan, Manoj and Palmer, Bruce and Tipparaju, Vinod and Zhang, Yeliang}, title = {Exploiting processor groups to extend scalability of the GA shared memory programming model}, booktitle = {Proceedings of the 2nd conference on Computing frontiers}, series = {CF '05}, year = {2005}, isbn = {1-59593-019-1}, location = {Ischia, Italy}, pages = {262--272}, numpages = {11}, url = {http://doi.acm.org/10.1145/1062261.1062305}, doi = {http://doi.acm.org/10.1145/1062261.1062305}, acmid = {1062305}, publisher = {ACM}, address = {New York, NY, USA}, keywords = {extreme scalability, global arrays, multi-level parallelism, processor groups}, } % [Nie05] J. Nieplocha, M. Krishnan, B. Palmer, V. Tipparaju, and Y. Zhang. % *Exploiting processor groups to extend scalability of the GA % shared memory programming model*, Proceedings of the 2nd % conference on Computing Frontiers, 262-272, 2005. @ARTICLE{Nie06, author = {Jarek Nieplocha and Bruce Palmer and Manojkumar Krishnan and Harold Trease and Edoardo Apr\'{a}}, title = {Advances, Applications and Performance of the Global Arrays Shared Memory Programming Toolkit}, journal = {Intern. J. High Perf. Comp. Applications}, year = {2005}, volume = {20} } % [Nie06] J. Nieplocha, B. Palmer, V. Tipparaju, M. Krishnan, H. Trease, and % E. Apra. *Advances, Applications and Performance of the Global % Arrays Shared Memory Programming Toolkit*, International Journal of % High Performance Computing Applications, 20(2):203-231, 2006. @misc{Nie10, author = {Jarek Nieplocha and Manojkumar Krishnan and Bruce Palmer and Vinod Tipparaju and J. Ju}, title = {The Gobal Arrays User's Manual}, year = {2010}, howpublished = {http://www.emsl.pnl.gov/docs/global/um/UG-PDF/GA-UserManual-Main.pdf} } % [Nie10] J. Nieplocha, M. Krishnan, B. Palmer, V. Tipparaju, and J. Ju. *The % Global Arrays User's Manual*. @misc{Oli06, author = {Travis E. Oliphant}, title = {Guide to NumPy}, year = {2006}, howpublished = {http://www.tramy.us/} } % [Oli06] T. E. Oliphant. *Guide to NumPy*, http://www.tramy.us/, % March 2006. @inproceedings{Kri10, author = {Kristensen, Mads R. B. and Vinter, Brian}, booktitle = {Fourth Conference on Partitioned Global Address Space Programming Model, PGAS{'}10}, publisher = {ACM}, title = {{Numerical Python for Scalable Architectures}}, year = {2010} } @book{Pal07, author = {William Palm III}, title = {A Concise Introduction to Matlab}, year = {2007}, month = {October}, isbn = {978-0073385839}, publisher = {McGraw-Hill Science/Engineering/Math}, } % [Pal07] W. Palm III. *A Concise Introduction to Matlab*, McGraw-Hill, 1st % edition, October 2007. @techreport{Pan06, author = {R. Panuganti and M. M. Baskaran and D. E. Hudak and A. Krishnamurthy and J. Nieplocha and A. Rountev and and P. Sadayappan}, title = {GAMMA: Global Arrays Meets Matlab}, institution = {Ohio State University}, year = {2006}, number = {OSU-CISRC-1/06-TR15}, howpublished = {ftp://ftp.cse.ohio-state.edu/pub/tech-report/2006/TR15.pdf} } % [Pan06] R. Panuganti, M. M. Baskaran, D. E. Hudak, A. Krishnamurthy, J. % Nieplocha, A. Rountev, and P. Sadayappan. *GAMMA: Global Arrays % Meets Matlab*, Technical Report. % ftp://ftp.cse.ohio-state.edu/pub/tech-report/ 2006/TR15.pdf @article{Per07, author = {Fernando P\i{e}rez and Brian E. Granger}, title = {IPython: A System for Interactive Scientific Computing}, journal ={Computing in Science and Engineering}, volume = {9}, issn = {1521-9615}, year = {2007}, pages = {21-29}, doi = {http://doi.ieeecomputersociety.org/10.1109/MCSE.2007.53}, publisher = {IEEE Computer Society}, address = {Los Alamitos, CA, USA}, } % [Per07] F. Perez and B. E. Granger. *IPython: a System for Interactive % Scientific Computing*, Computing in Science Engineering, % 9(3):21-29, May 2007. @misc{Pnl11, title = {Global Arrays Webpage}, year = {2011}, howpublished = {http://www.emsl.pnl.gov/docs/global/} } % [Pnl11] Global Arrays Webpage. http://www.emsl.pnl.gov/docs/global/ @misc{Pyt11, title = {Python v2.7.2 documentation}, year = {2011}, howpublished = {http://docs.python.org/} } @misc{Ram08, title = {Performance Python}, author = {Prabu Ramachandran}, howpublished = {http://www.scipy.org/PerformancePython}, month = {May}, year = {2008} } % [Ram08] P. Ramachandran. *Performance Python*, % http://www.scipy.org/PerformancePython, May 2008. @inproceedings{Ras04, author = {Craig E. Rasmussen and Matthew J. Sottile and Jarek Nieplocha and Robert W. Numrich and Eric Jones}, booktitle = {Euro-Par 2004}, publisher = {Springer-Verlag Berlin Heidelberg}, title = {Co-array Python: A Parallel Extension to the Python Language}, year = {2004}, pages={632--637} } % [Ras04] C. E. Rasmussen, M. J. Sottile, J. Nieplocha, R. W. Numrich, and E. % Jones. *Co-array Python: A Parallel Extension to the Python % Language*, Euro-Par, 632-637, 2004. @misc{Scu11, author = {William Scullin and Aron Ahmadia}, title = {walla}, howpublished = {https://bitbucket.org/wscullin/walla/overview}, } @inproceedings{Wan11, author = {Peter Wang}, booktitle = {Proceedings of the 10th Python in Science Conference}, publisher = {SciPy}, title = {Metagraph: A Declarative Graphing System for Python}, year = {2011}, note = {To appear} } @article{Zim88, author = {Hans P. Zima and Heinz-J. Bast and Michael Gerndt}, title = {SUPERB: A tool for semi-automatic MIMD/SIMD parallelization}, journal = {Parallel Computing}, volume = {6}, year = {1988}, pages = {1--18}, issue = {1}, doi = {10.1016/0167-8191(88)90002-6}, masid = {1692998} } % [Zim88] H. P. Zima, H. Bast, and M. Gerndt. *SUPERB: A tool for % semi-automatic MIMD/SIMD Parallelization*, Parallel Computing, % 6:1-18, 1988. ga-5-4/python/docs/sc_11/0000755000175000017500000000000012662210364013211 5ustar mbambaga-5-4/python/docs/sc_11/Daily_SC11_Poster_GAiN.ppt0000644000175000017500001336100012662210364017725 0ustar mbambaࡱ> .     z}  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~RdO)VMPictures'PowerPoint Document( .SummaryInformation({       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~n~a]*fߠfNVšXPNG  IHDRc7XBiCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYsgR IDATx oϲ\ * ^(T(E &hDx<&>D"5 ") }-˱ovz{ٙO^d 5UF<@@@@@W8     %@0@@@@H$ s @@@@@`,     I@     X@@@@@ c-@@@@@     @&[     cy@@@@@$M2@@@@@     I dn    @@@@@ @06 @@@@ ;    $A`l     @0w@@@@H$ s @@@@@`,     I@     X@@@@@ c-@@@@@     @&[     cy@@@@@$M2@@@@@*@ @Y _^tiӦRn"XA&jf>ѣGe̙tRٽ{ݻW<(ח&Mo3J]|[hzA-@%`#V%# E]$q_y>|xL, G5iѢE?A̙#q=%\"O<ϒ'Oy_^f6 KC.IߒD맣 }F@ X G>! ) ^o6+ծϟ?_z)}+ViM&m۶g}XsQz {j@E`lD@(p1߿|jrڵkƍ{O4Q~+?<) ز  @ z뭲pRw}'_ڟюÇo͆:ujPx2B@` YYY] 6zYym߾]6myn_Bx :/<39ee*O &@06F  e,0zhhVs4k֬H+Wʃ>(~sZ0fyǤqƮ),w;CS]t)RF ҳ%@@ #fΜO={ョ細cǎ2qDݻ[O>` e{ܗ`Сɽ!wC@K5cy@@losmW]3QB_YmѢE8Q~x 7fƖy@ eܸq_9pԨQCj֬i9o߾@L0AN:zg8ҩНuCwvvtӽ{wׯq;,Ōn;x5{?[ʞ={,FYܮ];cAљ&MUVɮ]Zβf\ObU O?zg"е^Y?rL6\^N:bf[^Ν;nݺ^֭[K˖-eƍvY(~軫Xzu);}w|Ŋevu _l/D7>}ݻW9я~$7|my%]|뭷dÆ ~Wyhڴp[;^mD#;~TTI `>}Zf̘!Ǐ-[Xj;ud 8'Oe˖ҥKDժU5j|AKk~Gf:wWYA@D@@@BwȟW^y%fBܡ=h+r[Zfs̉vՋi~۾V\H1"x Dw*UD}ܹsÛ6A5\4xw]6S!c9׭[W_?zh\mU2Am_r%|ˊ +V{_:4k]5ZnƱc\߿Uw t143 Aɸ>ge\!h" t ͵w&iEx?Qn0,ac}37g NXWYƵÆ kdw^=$jVVl^ # T ~ ?/ X j05- 裏%J3d۶mv`:mP =oϧ~:LԟlpQۈXK |AvU?pkCbO Y] /غ<y?'2sl?CA.|Bi?w+KNeΦzo @c> @ ?ͯxfn 2]-־G|нk׮4閪a4 =_7 >(jL؛>y::&H1UA!cwgϞ'x"h[dk{袋b"\#ǃ1 l\gݦ[+XI~{nJkf;]ߟuw+Kf~gS}|# x @qcP,nAPu:6T3Z- ={nOT5k- ,Y}YPz֯JG;o ԯ֑_x=Bv曮Wڣ}>ZA-ZpW5?O]As=梦 z5T(q[JD )O}[n3 b+jK{j%,Z;zDN&ߟuw+Kf|gS}|# @?W n4p"5Z?ZW Ȕ)S *O"] h3<#fE7B 3xfmY^| u6\/ӵ7s}R1_B@NZfKt#77W^uk#68Iͅ"~bή,.ռcKyov͠osf6oZsí v*%LnfͬwG |t nU~}洵 W: /9җ^z4s1S+buB}okðPYfkmg',لnyr bzM6cQnpf.b=n#]3YgJfگw6ds/@ 0@@u#?mbfBF3ׇ:~23ʤntg>G>}:0lȵs̀k]$L7kq;/_nd~vIe{-iժgulKw/#NqWo>{ٗ_~9e?^B۷kP:ٳtnS5#Xa(K7䓠Ҝx2߻d|%߭D-IOYv@ +2JQ@Ǡ~X7Z3fLP $h5 ݷosE ș\ u] c*W݂6W :M4q\m]r% f^ю#G:Ӝ9%s+ w;4zLT%.ӵ4K+W]uUP׺vT@xtpԢm۶ _xe Y瞷oxldtz.kYhkH{:}d%H;np  @ɿf?9@)-۷JSO=e}U\'ֳ 21g繞ׯV'rAE+^WCK vsbt=*4VbdWu] ƅ.]usc+[B07r+.2?sk*Z[oumfJ}3PX&uYnb5P̋Zn-ϸe]ŏ)L=zOR \pR ^3]On͛݊\WM\υ ͍ EI摬s>Bf~fSV?KMܹ/ @z Mq Q̝]y17s3/kEKnuꫯ:e7nX:ud_|ExַtI 6nڷ.]j0U߿ZnGkF*U PF;4kGLȢR5~k?uCzi䡁o1T ]Tc|u|YSV;3uT1f(~j,3c]isRA?0jԴ"cuo#}+eΎt(3g(KVϺxJ}Wl~. @f ojCf4 i.`, ,smXEr'O ~\jrE-mE@i(j_g?U?1xĪVCRL5^{ԬYڤ,jrJMBԃX暪RNP5_j_o6OAAw\՚zvֆkxOk&w>}סg˖-hܭ̫N\7ص8r/L"^u,*:/l$t_}@S`lzFʽx y׬ W"_X _/]oonZhr :SmFh<_D^:/Kԥ ƒ^K <ȵ(о?Q5esy.CccDiAq5iHn޼y\mh%{쉻 s٘u˱ظ^kdxm/.u~}fߣҥfZVc}@RWe Rwl t-XX]Pv5{Śk}EsP`bnz?s"D 5ǡ_s _7VY_:xh>WۑȻ55]ϴ:te B׆~ +͟~w yGY,w6]ײ %@06Ƌ"^@#M|7=-4uFeku&nv$:3vn)oiAf\)@f~tճzy"WMΝ;Kv{Ue˖YY-8kjW?s9rh={-Zn&2[x'~Cn?:K^uYF3g}6;Bբܺuk%9YV]2>ֵؗΦZZf P~X=O#m# &;:O7 yL4okI0'2~XJ# 6m4i+mΜ9\<^AxUw{- d,Q^xHޓ_׮ {֚ud~_Çږ-[yxMt۠~.Gַxk?e%Nx;ߖ ̌1 @Яv}];W^?X@"u; X"+pQ`l 6,lɓ'[kץf @ }ƦXS@ :njNא:+nݼG+Y^u ,uօs#h&Y^ }~BϢ3(׬Y#ƍDX :ZʮЯک:% ҹיFO~luWDvk@gu=V3ؽf{= zlwodW4.~zKe?h+݊VvykٲpBsGy@(ϲzKgcRmZ6@ Ʀ @ xyC"?5ȡA!5>ڡkeU\Ynʒe5Ogn]t&o&:]O>v><g?5\c]v6s{׋j#x\1 1^^ShzX^f:jCP5/aڎ,OӃ^s&L^Ǘ_~)Gv=U_B,~_$7xn{g]>}$ $sp;@  a ,5R7V7ol~&kСCĉ6L},H6n:}z.dKұcGkFhxԨQV[nV@P8ۡb+W8u饗E]i9k,+ݡCѵjX2Sל>|}2~nDKij,Β>u׌TjCgj1^M[e4,Y8Y7?nYx{ ^jO?{>Xr[{Xo!CxM{g]2? T~_O#T ^4a, ɜ=UnnF Mzk}\ׇډ G S@6r;9cP+rנ+=̙E$̱1իcz@`eֿDϛKY}5=ͯy^g1l׋7a.m^"ln3&fW*k~u]E{.3P4cj IDATԮי3g/ѓeiKֿ[~%Z_Φ& $*2@H] zvX& ute]f:5;Վn 5ʓi볚;Qկ_lK׈u;:Ӵ$3u$f9Yc߶m[k{GX%/"یLc] ID-ZζرcG<ՊU痿U^3xiTgKI&^\[;[oy.N{g]2?0R}Mg[ Pv93 @9hҤMZ?X[`_vknUTq;]Lzu"Mu|}YR>}tiذa#8.~-^P_"#FHbM '#P̙3էzZkM^y3yG5p7o~ۘi 6]?ώY?hĉ㏋Ze"xKgviQ5״ )%@06 #pu׉md׮]@yLZ5#?Oe͚5V*vuNNj'8L2 4Wfh:WH}ѢE<.nꥳ#5kִ麡v2d7|]qI{lݬKJ5{ugvLk>Cָ`kX^i {u/e#7sYTѠ}ߗdϩtg ]oܸ\y֚9z b,x~O~~%3;tk:yW@0t]=@@xv=ۻw5[CgI&`… _]5X'nvgZ 'Y_^7fi0tϞ=VMgiL֮]ҸunvZk) ֫Wzu9+]e|"Ϣ=EK Y]xKgv3tYřD(q @ prx0:kQ\nҥKE@" O? k_g&|ёKxp PI[ &}T-A@2\ָ[&CYL n̡C5m50KJ<3SE~9rZv SNnŔ!P"q1 @ M{  P~tiaÆevqnŔ!S@?N:%Ԉ;wIWϞ=ëC7|cC ȰM6,?(5R!@ B@@ tϚxgȦMdznO%i:ڍ5ֻun]gm۶KuZͺ.qurݮZ&Ms .>@TX7ԗј{ZF UxGG e@?s= _vnVgI27+te+c˓!] Px~@@,49tM7T#G[n|"'^z%Q7aׄɸ@ MƦ@M@< |:Ȍ3D@\nz2f^6xx_㕢 @: fl:}EH;G*U,"a{ Ʈ]Uy2b͓VZBɑ~Z^I&ynv-dV^zH#o4 P[@ʷ={d_[W\dqƢ@/17_ʺuDG%ǭغ^;u$k318 cb$    -}?    ش&:    .@06G#    @ZMa     c}?    ش&:    .@06G#    @ZMa     c}?    ش&:    .@06G#    @ZMa     c}?    ش&:    .@06G#    @ZMa     c}?    @e vrѢExbYtرcrJV;:G/,ƍeR~}iӦ|rWKVVViE?LTF@@@@4G Ǐ[^{5z@@ &ӟf͚رc;wz0`7Nrrr<넟I#    @c0۶m\wul2UJ-d߾}W_ݻ̘1sVXoF J^^lڴV^dĉRzuGydƏ6#A@@@@`8/UT?ϲ~Ybl߾ӷo_Yfɣ>j2d ,YbKLQFaeg϶+o#2G     `fln#F_|Ѫ)SVu; $ouRJ֬YA~_Nj3gΔڵkWo :TN>m͛'\rIzZG7@@@@`fld|Vѣ=Zggΐ ?VZeb\nX=7x`+i=t/Ï6C    O`lnkhfj˖-eQ:K/ Hv /3f={n#GǏwˏ6훒@@@@@ ޲k:v+k>LnGE>}iD6m?y;HU?,r @@@@@ccН8qB/_nݻ.NB#fwn[rքm:n@@@@@J,P-dx6lSNYOYreҥ`P40yf+ کS'iѢ166mj%7nl^nքm:n@@@@@J,@065kyyyRB),,6z饗d˖-yMTVMzy%77qN3{u5iđ4l>m6; ?tܠ2w7RVVFo\P @@@@S /:Q]v5jժ%kV͛g'9"̙3GY/@ÇgFW&<?h3Hhq5+u@@@@Hq1(??߮Qzu@lz[nrZ3d/^lmڥlݺUt}Ye˖v:4􂜜:]@g熖CMfhРAiӦIڵ-R=     Pcc Ax0vVT//)O?TRnA7z衇r]OVgu]2k,Nx{VGRJ3}$Ѧfd@@@@@;Mh |-{yX-YG?񏚵ٳg[lЯ{D f    '@06SWK}ʿon:-b51p@\Uo>y'3{.6lDn*'hӾ) @@@@(@֣QV2]u׮]RQWǎ+_%'O 0@~GJ*YϗlٳO>zj\[X?tt&/š~;m&͛7-[ȬYZk֬ׄҥK|W^rUWYiV'ؾ}{贼+2|p;{$#?m4kSupq_    cٮ:^yh'O,[;^z!r^h^~Kv@@@@Re ʲfmV6o,~laaZjɯ~+?)5r (]7١o~푗hF>L4    Pf̌-. gɊ+5N4i";w7J;wʲeˬ 6m*-[f͚%ڌm:nC>$    @ -!c#E#   d@ g@@@@@R]`lC@@@@ C     @ M     c3by@@@@Hu>B@@@@2B`lF #    .P!;HHgݻw˂0,F @^_9}FZЩci֬9 @@@@K`lzM3VaEzX"ٲoA3{qEd(@@@@Se su h`5OV7>Z70ļ*͞"   x +$GYw|M#   TP*IXxj&ed@@@@2K`lf'ObCevlH    @ ܱRPmVl̎ I@@@L9I̎M    @ZMa,Ȭs؎ǡ,?@@@@2@`l " ϊ =M Y-O e    c|~j T9+b#Dg;#<    @ TH~mB~&m5êQ{}R1j3JkJH"   t=y-Jވqs}vrP}R+@I6 @@@@ Mx۫R 2|G@@@@ F3PFݳdOV[ȖÇd@@@@O`l=`7=)8é2y[22    '@06ƌg uy91^Wٴi     @z M@p'mc:    +zZ y]NKR(We3/    fcln=jua[d͌ʡCd@@@@C`lz,n~I rO DG@@@@ D/ˡ@Ru9Î'ikM_8    #zX^q!X f^2    @ M1Z$ǥIlP!   #zXjKb.F#c^9QؼQN@@@@ 5Ʀ+4>Q#0K&f^2    @j MqW0*V}pגRc cG9@@@@ zcBȻ.9U|gc`qA@@@H-5F@zQ>1G&OyQN@@@@ Ʀxb T=d5X*͖/('    :cSg, q 4e Yvn?aA    @M'-PN 6QA ^">Y('    cSc q)̮Bc?m|w옣     @ -1K PԿꏎkJd@@@@^`lُ=@u.[Mw3ɒE ouA@@@([e(@ [GՌr,yq     z@ _츶|u,[QN@@@@Ɩ=wFD] IDAT"a-'P&O*'NI    ز@ΙK:ke-2Ùr2    e#@0lܹ+.P( 9v{`̝@g@@@@( esMwI#FUz^wQyeѢEqFٽ{ԯ__ڴi#7|\}Ւy ?te#P!,7?ڝj([$2r    0ۦ{9{Ν;%//c}'Z0`7Nrr~UWh3JܴiӤvҭ[n: <*j&GwϺ?XW&Æ 6[$@@@@+2 x\Y;k[nqbsssE^M4I'rm݇0\AXj{ښ{3$@@@@)2 hcufÆ mFedȐ!ܪU+y7SN֒v^{M|Aٳ ͛yO?'RV.yˉ]k>v ,֏R    @X N낂V:uʺb%}eԩV[:t3gZ_͏h*K"Yy?tυ,SPrࣛ>m^hhy"Y[~[@@@@X Nkځ *H㼲hUVفX=/b`Ѝ?te!PEުdd)SwA@@@H8×(h۶mܛi5?f]vҳgO;9r]<~x~j)PEg'K`,]Bm۞E@@@@4!Rc;w\[.ZȾO>v+ѦMiРuɓ2v"UhM(H+JyI}ninU3[O('    8WXa,I0V˗/ѣ޽}:<0~iߌDZ ԻbTj?afv%$@@@@-`PtMѥK y u$++K:vhˤN:ꎟׯǏeM67O? ot dU˓[vg_Vtо]ܰ%    S`lL"-[H~~U3. puW_}zԩVvEnyݻQ֤IG+ӰaCԶm&hq2i-P}+r7sMgkI    '@06e eĈQڷo 4Ht-X+;;ۮa;5j8^\ԑ#G&hqRlذAf͚WK}!K.>b ԯ[Zɿ습d0׏3ǐxGJ$@@@@4.*n3u{B^l[]v|K$˓5kٳ^ 1n8iݺ<#СCvZ6'\999v.sYzѦ}RJr n3ݚ?n߾iʊ# 9{}urdeW2v9 @@@@ ]R9cxgj72zhǕ8馛dȐ!F4h۶U?܁f\2*UrjժYe~Y)dլyu*_l[R9"%|KڽGk>G@@@@ZYfT:o]{"_N8!|xtvyDdmO9?::>DGd)9*A@@@(3c 0`x/\~ӟʻk]xblV-(((c%tiQre~?3KOI_J#[NJgc[M[ {]Y    )$XCc+8 d wy18r/?ڴoF"*嵕݆:\s#^3>)    ҳtԪU+G^7#r]v9ye:Ѧd2J@Ū3YsSo@@@@(]i0Xuuk&I۷o׬Y3GU?t܀LF T@\v9R.[!|' A@@@)@06ɓ'%/_.|h>cƍjkז<n%6l`ѣքm:n@&j_kmx kɎ0QN@@@@tplÆ srUWɂ b\i3ϴ֭3gJ=zT.]j޽%h36?3OȮ*\AQ--}W޷:@@@@/@06e]&vߏONk믷ӧO0a:uʪRJ T"7 zox.|ɒS2etk YI2    % Zj,+"6mzըQ R 'xQRrel߾}O:·g>,=]4l0Q%h36?3TȒzW?xjF3J~~p@@@@ d=j%k"nԨ_2 ʉ'drWJ͚5Wz!ӟd~rwyMTTIN>-% =}۳gOGK>}dVy뭷\~L3_| :+w-Xrؿg|+er~Rj @@@@ f1Xϕ:;Xg,.]Ξ]l+W]͓ueDAAu5kBE躴͛7Ҧu+sv9 @@@@ NcsfƺSN2uT_gU]`2qD::6|PyO?ڌy~ mqC7bȻwȡ`-~Pi\ @@@@ flna?o|=Y=,Y$j V{~%_grbja91zB߯ct7Z7ad) 51̓    I`fl19"7n 63`=\i׮]1[ٹs܁.MдiSiٲ4k֬~Yq13c@鿓M.Ivϖe^]i@@@(?cX͓-*,8,_>GNcw`OWxȃol$    $Ee2W P)Wyuo^?.Sޟ8G@@@@ 1yQ}T݌y%uW;v#    @ *H~Y8$m%     /@06~+j"P.wTmܬ|c$/ɲ+ʅ   =2@ g0 I*It ,򓧼/'Nϑ@@@@O`l|NB\ 4&np Tnq.ɖlNjd7rT"   `yD'`H^gˑc*;}f^ 2    PnƖAH@=% ,jr*fYj<@@@@<-3"dz#+۾kv~)rI;O@@@(c($YbR_8z^Zegv'   dLa2%0fٳʾ}< @@@@ f|@VRwo|-MϭSNɄ    ,@06GgCj]+X݌kvzY~<@@@@ Sf\@VE7ѓ\㠴 ,&7IN>8k@@@@2P`l*@* ToS"G:K%9fݻOtX@@@@ f|@kG ð{RQ 8s3J5ayÇ    CYv߳ṯ9< @@@@ ƦTbR»of|.vه͒y    @: Mѣ@=,v<L3N8!ߛ8O@@@HW:r T)u/~,    cKqx iݺgرq|Qyꩧ?wyRn]i׮ 4H&M$OPE? OJ[j+z~fJ59d͞=WkI    &`#:]p\zv__1AOvYw2n8~6;=m4]t[~ lv<}Ֆ`KYx?e k0;O@@@H'fƖh>|XnV;o`[\iѢ ۯ_?weh>!P+.l3c40eo$+V$@@@@t [ _JnݚPK˖-!CHhbrVdɒ%kcnܸ Ў5J ðڝ={\}QGQoIJYnGB:V/4f!v{&< @@@@ ]Ɩpyy7nG:Ȃ k׮e< ?:h^#@ w㎦k{lÇi3u     @0_íU&@<ǪUdԩv_|Z#.K Ծ~ǝ2Icc]v1yv    Rsطx@tf޽?|Z/lҤI\7lЮm6; ?tܠ2w IDAT4;x`\-=zT*T ~m\VC$0wc6׊Mi& !   @\>wUyǿ7=PBMz "lˮ "bAAP+U@J{/ &!yܙ̙3_&3D2,п{fE|Cĉ%KtsM v1sN͝;7_#۵kmۖt*e[ĸ-jg3Tvu\v   \|ȯ9|~g9}Z>PLLL>>v%88Xv=BD3eN70?k.V^=\3gT\\ӝ>^`X-7mX3(!_RbVn:@@@@ gl># ݻO=:t;Nz6`u򭅇;N@C gtqͱڷ#F@@@(L$c?~>3g- /㮜P=WFFx}(^Jxbm:U;fd)v    PHƞ;uV=V/0apWvcJJ]>SlM"##cLϳDED9>iǶlݦE@@@@$@26Yiwʳ /&MqǙYYYNuwRRݜ/i?D (ʹWiT!}~ȝ@@@@ @f>@(̏9r.\hM166:4_u'N~GNr+[Q#S\f.ޗ?2Ettt{J޳žR렟)UŠ_\L:]C@@@( $c.ڵn5ֿ/vL)S|y|J6l>wؑdj׮)Z*W*B4W2ocWTK[Qv    h)(@\\*T`?uv9ºumeSǘPA DRųkk#ٔJMMuĨ    `elڵʣ4n8{+R͚5BBNS/̙r*$&&jɒ%vS6m첧1=c@a(5\;M'^_߫,^:zf|z݇    H@΢>[n2_On'c{쩇~8[{a'cg͚%lʱ N:UV{%tǘ>!@!uz됲Y{Rgg৅^   Jm  -(22zÇ+: W/>Aެ-YO"+s6! ${ϭ @@@@ @$c|e9Ν;kÆ VShh Uǘ9> E (};لfe={j@@@@ $c~O?&MOguW^'xB-[t;tPU^ݾ'{cfu @:Wd) e;oСC    -r_5kj 6,=c=o ݻM ic,gΜ8Cɸ8@]LM S{هyuj둇}(    -؂zZK/J*^-&!9gΜ|%b]l(!PBJVU.X]a^MhᢟC@@@@`elr}iҥڱcjժzvytVyGw3+cϛ 3Mh*9_Sٝ(    ~ 'X=wnw1yjlmy`kHK}kܨQA@@@ Bm Bg J餒-{9S+}*v9bkeW8bT@@@@ [< DB)8"ΑLGlӕx/G#@@@@O$c˰ P!1T:\"eZ%$$j@@@@$c- PeVDg|E#f*X_F*     u2vO mU*~j}K\ڡ'N˅   @@'Nӵm6qƎwꫯ*++7Ckц |  7[!H. Ptx\Z;^,lX]ޠ#f*_~8'   @to_]we{ζ_ʕ5} `Uc}2ҭXVz.=~YN&Riiz wX6 @@@8+$cgϞEDζҥKu!-[lo? ` Wj֡ٯ")G]5sַzv_     eWBeg3훞j G\(|}OoKk:cڏjm>q    @~ϳϫOɒ%Y{^܌F=@fZ 9233OSA@@@#m :u+Bi}-[Wnݺ> VXḑWN+VTH_הiCb(YʴTe]ҶzpW9rDOBwK@@@ȏ+}3ydnԩSn;Qls+TXAo9f    P5 x'c5kL}ѵ^UZ{:tHWx}C@@@@X2v׮]믿uQ.]&@\yn~_^Nj˥,EVk]Vs{w!   @6޽9'b= 3 P94rbfm R@@@}7dɒ󖏉918Y+_xͱA@@@(Mŋsnذ*U$Y͞9C(EU1xJ-n:թSGʕW6m{) -U^J;SQڵMJ7;D@@@+}[YgϞ "|Aa@lvUgJ]1VPOLHHq(-=   G "sA9A/_'xB_j֬*Um۶zǵtҳN2u]7i0y睚>}91Ÿb(x@G\.)7ϩZ6]vO&    @6fKvz7kzg4n8effzު#G|4L4IC oY|"""<1|nd pV #Uf]mr~H6|;:M[h3Vv'   E[ آHv)kN+Wu*$$D7nTZZVZ5/X^0 ^z{XUPϻN4m4i5?GAI2((̤#fKwBvH{5m>S&|o6ldi5o   E[ Eۉ`=<ׯך5ktITxxz;wT=r}UA>}Dl 9lÆ Jٗ_~JʘAfϞ]:iǘy>F8@PdUOk~J?I}`]8}ҤOd-B@@@#@269s?{zTMom[`~]?+Լys]vL\fugKOl2_]3gG DVo7!#vп6$ǎӉ'QA@@@+P(f |饗ԯ_?]uU+eV꫚2elsz)OY/3IuB޽-Olذac:@Kt*u}1RO/}[fVB6-=;L@@@_ IDAT_ճN5+KM}ܹ7oƎkۭG}dYAM5##J{׽{w{'uvl90a2ݎ; O<6}uOcz.@G*r `'~sW_Ν- 7QA@@@")dl{YjV}}o߮[W\qJڂf/֯Z{]wޫxܸh"OQ]t˹5jJ*Y搰VcCMj}(s3ѩ?ty6>Xf}O   -%cX-O?6g;^~WZU7p~i5l/v- L$S-[fm.UhtfŊ* pBKRջ'%AVfvMSwo%u?M}eSSSǹ\._Çy'%K:Ubccl  P1Z*_#ܹSNQW}TbBN7ؒqv,D'߮ i&&&ꍷe*,,9F@@@?|&sTa5IƗ^z>ڵ5tP9k֭Swo3v:jW>}rH/? %C~9 ;1]BxxʔqZSTTT6q @v'Wz=R*Rr޲u}MSܩc(    P@fda|0ۍ7OVs'k0c5`sDIzq?? 2> ;iޗIF{ǘϺ/W~Ç+..N .@NVԮOTԒp 8|oج}uĩ    @Ȟ˗ELR1/mQ?~III2N0A+Wm/xnʳwrc9@ 4Es@Fqw2׫U>\*MrO   N$c4ibk,_\M.ZȾ4htUV*]ի{՚5kԾ}{{*xbYj1;P^ykc0B GsWɖOH9Q&2tw]Tfϙ?96t"   B XgϞʾ5Ό34vX;l_]/,RJɬ-Q=_|.{'N؝r('ϕ/y Pp{Qd֎&lNb ۿ_/_n*Sk#t"   H2ukga̙[^{5͟?_[loiʔ)VnSZZ VZ5{T;XH f[3_ϵpBOgTCϼ{z/RG B"U xoدcT½*|~>v鸏    .$coVu!a\}ձcGP+y5yd:Or [Yf;f-k 6㦰cG=wڵk;cL @ VQ>SxkΜ9bZdަM)cL|"@ ly^鉇cL:M薛9Mȑ#NzӉ   D `Xݺuƍ3("""OshS֬W^}/dcާs=lt-{[V)îϚ5K&ٚ5uT3s0_c<@^QLL9Q;*eg^yedd@@@@ 4k^;&&F/v4|p`nkّ#GZͭ[/Ý(<+3tP1;C^ЦMݻeS[Ç+8ڽ+'NЋ/h ~(+HUHUI2_'ԭ y(iشi&LHYYY;OE@@@ݗO49֭uuYw]s5Ke^ZkРƏo2KII… u7*661t_< sK/gfŚg+}92nܥKZ >qX=,DJ*X@p)M:ۧL>a1e:ԸQCܵ[9ڿQ}@@@@ p.wҐeS6ll4t=2[-V\/R+Vd;L2vS0I]x^z'N:W:udf{;v#FРAz?Ϝ9:{܂x.@0 Md\Uz+55MxO۷yoN]S@@@$d뭃N:e4IRJȰ~kuYΝ;w9g^}Uw#1IU9p,lA`cڴiu>c![cf{߫$cN@Y)+^0JԾʽ ~]8p {]=}xO    w$cd{EԶm_$ׯ}f٫.^6lc=oƞw$_zZ6 Mݽ{O?:\oOl~+/qGho\j=Haczk0?~zK9((HK-Z4sK@@@ N Xs(׃>hYjdꫯtMO7X uIZvոqc5iDK>)dҥK$?^z~Ͻ$cDY`?9R ]Q{a#d~}>jؠw2   @@+p3֭[UF3e]%KX*/m$?@:Ddl@yhQԮ w꩎YGViUPx6o٪QZZO Av8@@@@sؕ^z=)33NA  R^Y2&^]t2RUv-}jX+՝5}ڽ;L@@@ @ X'dɒ?ccc}u4PA+uo;F^=b;UF7:ǃQF@@@ +d%\bs5!!U_lQࠂ@pT9Bb*8?[V-[nuJBBmH@@@"d9sO>ֶXN&MҬYMM6uԩ @h_+8"置#8mԭ vS9v옆_ @@@@J -Z8&9eСC/h׮]\V_|[oU{vc,ϡ_ P J+UsCo_tb$+d_!1Z7QG@@@ ,r_x3(u֭g[_cǎͭx9s_߂#P''&Ak5ɟME}&WZU=@EDD@@@@ #QQQV"r[ԪUKo9M @qmyw}zYi5v%c;nUfΝ܇zUJJj&    p5sꪫ4l02vM8;g(qO:|R;ܠke~ vwqㆎ>mv=Viii>m@@@@5S衇aOAAyO%22RO?6oެvڝ3 PL*tJv鉇}Tj}_l޲Unj9\ @@@.@@8uiƍΝ;UbEծ][uQVT|n%V3}CydjǸ[~aqU 4wQcifGSiؠ`6    pn&{n(@28~Wy@drVx|D&\EQjjF7}6GSiҤ 3ύ@@@@ G EAZBPDe]Vk{٬i~^+^V&~,6    p&{I\RƎkמp C (j F& +#EzR^SY7M1 Y   @)7ou0ŋ}fo͚5 ztqk/gyF111>(lSPAH?S[>kcroQ>BxJÆ޽}LUr|    @2633S={ԕW^fK,wW^omQ@[ d5 <Ěii_)+SQQ%݇%l![@@@@,}W5y|O566V\slo\aeY[Gt(_|6Rttyhʕ-c*˗5B@@@H2vŊzz^{}o&, @+ +دkܱ,G r9$dWuQA@@@,5tlժ>cЮ}x;dN^j] ?Umb7]rvӯFzi#   ,~$xNr @ V[tCJ,x@իW};=:uʧ   @@;n8k|̡]cƌQPff "-PcNPTZ5}ܵ[;R'O&@@@@bX2րK7o_=]z4ig_@_司}gك߿z=[ݧ ѣ|    p1 d؜=uiƍ׾}TZ5ծ][uQFTdɜn%V3}Cy"/pwʃʾxNO Zck >[T)kmre}    p1 dńλ-@26oZ_hg}qWQqLk} PJ|    p? ˮ]V3fЄ xb%%%L2*QDa*Mu*U0:C"DTi25rgd!/RfQE׿˻Ef:tWjj/_ujT)ۆ2   #WMHHpZ-eZ LU?vر>=wyuxWTTTnCG@KJ`23^2Ӓˎ}"{.\/ֆ%1L@@@b(m LEm 6~]N:kŊPM6_|a%cE^m ('ݟq'd3oZTV4Lrfϙc*!!!s=@@@@8 &OH^}9&b pDj*@ U{{+-]%2YkV7U7\ ݇}?~~uO@@@_~lAӵ`}G95[t:6F ~mS\0dzNvﮬd+~m~Mr\~m>xr+g    P]hMeҥ].]7?0?_x@ntHO>C;vUVjxEk?YGGwleՌ@@@(~Kƚ=`y7fK@@@,dlB+<8*Tn*͚5K/wI;wv6oSA(xTWpd)OFQ IDATYF\}Vi&z``?ED;ʢſh*#y(OG   a%c˕+޶mY:e/賿ԲeKGM69T@#Yj>8[!H޻J[uPmVuCg*J6   %ca-jղ̡[.u1{>ڰaCtMnH羄ǏwSA@x|Dn݊WZE ~XK;WҚ 7imh]    EToXѸqc˵^GyDC Q-fG̙3bF@F~m}t|pD≉ڱcDGGZ>m@@@(~]۾}{u%_.>|x;eʔQӦM56@ V 8{9*Q'c:£J葇PL9lH_   EQX2zhCe ;foo]6nݺ)(w<  @"Jo]KS~~,,,LUK[ Qci>m@@@(j~fV^]f~D>>fkyi>m-[4j(OJ>v @pF_) fefhtYq˵{SWwT222O4{<6   %"==:kٲe֞M4QZr=s裏رc*Y `%w=|/-^OK +SxDG*;Νi_PN[wnw!@@@(-"Mb-{ʝ㥠Pmѧ֪읛7k{K!!!ٛ#   PMA~{& P庼Jߑ+۞Ǘc*35V-[+<8G!ozxI;eʔv'dV͚5Lĉz}z6   6;|@H ʥ5x8:={˂v/Q~5kTRRR5z8-ZO@@@ `. E(Ztt+}U+;Jff>f|=˧   EdlaN0@"*omYBVfNyHf>gr7떛YeGgwfkď:    o@0(U;]vtj]u} l 1J|    HW ׬YI&iƍݻUF 5hTz|Zbb EiÆ :p*VF{Q׮]LGyV83gT\\cnE,pu|^!Ug"JYm[mט㭟y;/_N yR&{u@@@"@2,M4z<4sO|I2D˵7߬O>DnǘL2Œ@8Xpxkie?H(BѮ=|1되 ~Wǡ_Fm۷;^=բy36   {Sw$b=Ciʕ:q№-[OpBٚG.]T}f_~EG*0+e_~eٳg[5]hC-U:|hBKVv<*~mqNQQQzԼYSG?SIKK&g@@@@ X &wvϡCjvݻ`V~:u6{$iͽ[n1c3m?O_~W\Uǘ9>AV(wjخJ޻1{WP*ʴ̎q\]h26B@@@h>ħOcjV>#r4j(,Yꓑ߬$bMoc"ִ$Iz.sWN?9@@/P%8}KYVMnT\?Fd8T@@@(P6Q=$\>mڴ,_.Yi빚6m;z9~>v|ʔ)91R@ @PxZ.g6tWVZ6ؿp6lқoO@@@)@2 ;vPxx}Wƍp͵jղmܸ.¢Ez.]rnFRJVpҤI>]1C  UcU|~1vrtmQ'ZlРJ.3덷;|    /g^LB6%%Zڮ]3Gڵk~p.e/նm[O1O+VpǘPA @٫*>TPskҮe:4^)~f\RE=`UZ 4l{ZbO@@@!@26気 *(,,w:t:1>>Sث{)B5w10  @!mK5^!QqۥmvPV<6&FyHM4r3ˬ ?ҷF@@@ -@2B{u){dմ&Q}լYӻkZjv)cL T f|d]aFI|&]ǡaa׷ G?SYIȅ   B5:… 5rHZjʮ8q.Bɒ%*vZcz!ʫV_Lb$DfϞtBB3R|IfcdefhZ8sDuSclLN&vgwae֗w,?esc\XN@@@? ORhhp~C=??fnIV<**Jozppp㈈KNNVff ǘ.P|v%Εk ߻)K/4.@_?ʏmqXU9AhmJX^H7|g\@@@S0'bͫ=ovsu]#GxB3f2 'O۽v0Bx BtI49l}_O:yR܈L BC;ԆY;U+MzDFsvt8?   E*zjo^vG{uwuO!$tl&;91=(jeBJ޳R[+y*e|YE]/   @ {߯Q:tp$b'qdjVx6k&\ 1Y|"EQ ݪ1DuL?^mqNbţCŅ   Hƞ t{F(8;qjNv'%%ǘ( ET F{zgoxS5o+n~v=@@@s~饗ԻwoY#5`4s_Ssݺuv{۶m)cL E] (DnOW %nUIב@@@ 8EZ'zW_}eOkO?ի۱nfE홮D-Yߦo6m|nǘ>!q2Z syDMPv7ڠA_Y>m@@@82dLmsK=l[3s͚5K&ٚ5uTdJ(/ܧ?y@D7Y5RUo]4Y \+x>;wVmwR @@@ /Roݳs裏jΦp-(22ҺzWrĉzvs@Xɒ%1=c7-U_YՂ+QrW6 M%/Z-pyu쉓'PA@@@ 'WN 0+RvcǎY >\:x`̽f_W /?߽B˝رyuEVc2c:&SM6Y+TROQ p ǨT{zpRx =*^ N!Js'fH%:MUf )Sڧ   WT8q>߆ԨQC۶msܑ֭[kvSNUN+Ak'رc>b 4Ȯg/c(̙3>\@lXs?i.@%?)Jf)ؽUANٶ{U3Uwٲ,=.{wHHB d!, 6KdYHB a NRKܻ%[zҴ;f4fs5z4(߱嶩C䍇_y*++#g@@@@@@@|ƺR?t萗4I/~}iW:TaWvŚCD XjIo[>G6Ooo%ֱ|ʜvOڽ-61Ln WWWӮ]k"2e 넡XsXc2 C@J@5-M狉Hdr57{M`}V*(чIb|a}cp >AU~}L{ >s3N1u^7y6      0F M}mO6K}_zrSs^5M((]8uL&7A      0@s7   0 skr:g{kߦ3urR}[ߠE8]+HO)pmF@@@@@@`;8n@@;bmV3JjݻV5t:goo??A=9{A@@@@@cA6A@|*ֱbkow&5eKo+%&&89˦fzK;vt      0v@;w   0@b/S_#kO*))7.P2/ҋ/Jţ      Kbl>[wo_-v :b25WCI :emG-^      } F3Hy>0?:JU z=} G)zǨ       U46NQuG'n:Ƞ F@"@O^:a{jPF+A+u4ɓgFvWH5W^N/^ڌ:@e4nbl44@@ Rh(?~dSmj3?xmh"{]4iRX-n 8@y '0G76j߽*v5D7N%2@-xQڳwZc  Q@^~dRʅ#oSoRٝO3F"O=_ҋ/@@@@@˜0~88@thܫ"NvsM˩iSN=TRlslٺTSSڌ:@S ?N4nܸ1J   PB*j?Y{۝kZ[dj8AS/g@111`G%%ŮͨXƎhl?X #A.!RmUMݚ۪yȐ:b樮Zhҩg\ڹkL&%jV      B !\,=47n-JUAM{ ]$ic}`SKK͵2n\>}SnNk3      !$16p@7~uGn xܬ1,Ŏ__|ls+ ]ji4.A@@@@@B@n BK fD/]B&. snn LZC,O\}2 *WFz:?܃{YV:VZM*)85q      \ .O D, D/},]82gHxACc#}tdxi15WK{G# @>Cdc ˁD-S):qlʿ8*gf~?bqu 6u }s7QJJ %@ض}m޲mHjt5khH1)0c#@b@ Cf_dcS;(_쪬RVUU6J\\p54\fA@@@@”7 PUkO]rPbNpp"QeIH'k$?:}rz~_?ZZZP_d   WQQ>t$~oRVfi8|(ϯ;>ڏF@ F@ƥ[_s,&ytVoBߣ˗oJ_,̹*      ;(" "v*#e_}}^KƿRzzݵrX)Ӗ]Q`a(D cd*fOHչB瞻>sY:}S&OݴlV=KOPX8aD^x2f{t⡙v5ghnvpV?V~DVk?       @   5 ۂ:+dn3*_ Y[%%|V\NZDxz3y<FR*#F@D2<&7 xxu'djAٞsd`ee=oߤ^\T@@@@@BOGt1cZ +͇+u(_]3LR  0f X:joP 04 -rd2wߧo$lw7]OӧMumF@@@@@ khMkֆZs}ꒋ Ab0dd @Y @`h U]^1}"J).}5Yv׋ ̦뮻R]Q&]Jˆtp7cp@FXjY{mC#1vh0+ Ɔ. 4xjq/Y[=fR9ׯ(ҥ|mLޑ_=A>-Z]\N ^Ǡ@@@@@Ye6ڸq z~ӦMrupa F Dž;2@ [PKSw;bʻdt`(*_} ڷy(>dRzVp:@@@@@ H܏o;vB[y.R"lnNϱc#YB37  aZvj޼'b)Sƪ{W_:yyytuI%&     5Μ9K}A*XV%o-_De ] F󌊻7 ,Ty߼alw(nr~~&zt] fΜA^}effD"Ç(YYt\:"؈z\ccs]D6oRoI JWt.xͷ|Fztl>s٧     aL@ vC%lMM͠'-.H/^E\0]VtD4c@IOC6 Ja5 ,/?I/*yy=3}.&uPA     A6p06ǔϷf^@^E&"16HG'K]GG=uV*--Zͥ3f-Bk֬! $b@Xá  0N]xU!G @@ lj8սt{ZhtX~er/mL>M5P*))fQJX     #JJv߾>?ʡ+. ?fEb0ٳgiʕtg^ b_H,)99rrrѤիW믿yuXjX@BGZI5o~ZuCr%_tG]]'{a>׆ ̦5W^ _PP1GGҲEZI %=r k, ;\^^N_~pk.Zl|}ڴi3ܹsKqO}kWXA6lġXsB16p4woSouuSLxӧ?Yq߳dBS611c 4@0 \w累onvY\\AV f8P"1vV+=cJ(_1zK>g(#=t@{m9EQ[ Ś uP  02ln迩!cSVGiIٟyqin:'+ܽm]#@0 +Jsqfjii嚩r |E%16ga׾F۶m:1v߾}Ǭc+WNO=j>G=\!5=6#ۀ/7OȤ+~N FѺ5l}'~.bZ|) @G9.qhLz3c@@@@@SS_P.r@C裃;/~A?O9ktM7߯c^z衇Yfy|.Ӕ64km0cG6$~M~{Pu9{#_ڣ{ڲumAܐD%$?x`>溶\&A@@@3g*WKތr- } oG ~M;i4cF`?n\K/uyyyd2ڵk=bMM   8j*-jw>K3ד׬|нkGv]t҈$. ^yuںm^'!pzÿ_ڳgO!6++n'b@;Nq`,2Xh=䏐ڟwv6/^YU=_{55d޽nCC b(SAnC_XkmJ_OH#}/*xk݀l}4p. &`2;iMT[[7(Π\ yc#l2;. `#GϻngcQQRXX)k:>uҋyC庠6s/5Zv=CY'-:9;u*;~^.UTr    Ӧ[T`.5+9rqB }'5W_ `n'Nt袠u/XӹY*T]]j---`ii_1@@ 'y{,;Cv3:zWYpi ?/W|tV Cihnn& 9% 8HǏC wi)4{LѺl2 gen+"J^''';۝ubM p!]ZIJ6c@4L)ܚ(vim>[md{NjKJ_΄)7]R4Rle[(ha(hnaZOoG2>asHQY żq b%!ƎOG_jY:́DSyIXӹY*A?iݺu>.\p*_#Sc9ռj=ǝ%ɥ?Y7R?'c(k3=rc mM7^p3_瓝ia!vKZA^D @@ utXlq֥I-km Ab嗩 _]gvzzej;:>}?sc䕤ܜaP(biVںu;uv2X6uar#AbHPvC|8 [85m   0VRwvPm{L[~K;L˾KqincꢄcNF81oDy+WPn/GpL8 vX===~@\8R\\{P %. %<%ϼ>I!;$lCA9lMt=vXb=xbg]*Xm\@0fNq_XKLu좠'MԴrz6R,.@ֱL&Z'IoiɒE?@@@@CY"ضjoot4 v$v@ \ @'pBz71StttΝ;c-Z;*Xӱ6Jw1hFgvP;Q{?=*::bl#9{1ܣe~>xB+;gl2 c    9VZF7oG,29] ÂQx 7|S}wHքN_(l}ԡXc4@-XH>jAJ)ybu¬Ɗ_l֬a.6ӁH^'U~ g"-*m8@@@@\w젭vPCCKb_/_B+) ` ӳE̱^~e馛y%rwW D+GH~]](w=ކ]`~裏z ŚPúuE)XֈI7n$MrJu_cc#]zt$c{9JIIq qXӹW?Nb&ƨ\&POOvgg'?AزV^3M$DH` $Z8 z3&!_4[K]{5xõ#G@ R 26O.PXR~?>xiw%'%v|./QI:Lֲ,m&"/D3zQvE 9z/+6˖.gQ4k16O|(bl+nVzu%ֶ<@fPI Ɔ01D[t髆|)}(y֍DZ߮vǎ5Sި6m 5< H PU]M;w&qO8t$@ @ +[)sz'9h7%ZbM7@A%@@@bfH-wRڢIŅy@@@`$0i}}ÐE  8Wq޳>ٹΞ9M/% ײ%)//@F1ڵkrMPTTDSLa0k@~L$ pbm5S/Q;(&BoC$2kuu! &+Qv3(55p@@I\ 5Rffszoo/{^'_ vtхsT,` D:c@@` *V%}|&i to ߤ9#~pU*Qv[6x[rqIDٙcv<ב@@@@`8G>f ^U{a4%&&|]h A @G716!@Fpb GQGbŧSQ¬1sϱ)O}iCm9Jvi4}ThD0W> N`bٳߌGh Ӧ{t,H 0V @O>bl? @"@󎧨;YwʻaJ[ug?aQ7ԺEY̥h(x.M%I+O?gA/I o-&{[~}IBR]SDك3rBU )YB 'p   c@x3{&e ؒ"7@ ZGQA@"`j,mG͟pcg  LKmPlXZ->5R)/RҴ+t2tD9IGR]oxKIIM*)f b!فh@@jHO~X7tWҥh4 kLHbX|a~cx  > oٖ]2cSn7+Y:٣t1:"Pfe8 LYiǏQ%_򗸇/s}'?{);;k` Ǝŧ 16  7MJm"YOȠ .!fmbXd;VJet\efg]M,z!I@xl1, *N& fLXk;֞x/xH8"@@l.vc&YKm֑_zM\VUax @ =c  0z]M$-{N'7eMĩ8{-%YmlnʎW¬2u(;QYNdfJ tZVz+[666?9#!" ƎG716| N  \3Բy%vV*a6i5dH~$555ywDQgYqo ?\3bJܡ <1~-eWqE4 4}4ڹk__tc"va;@X07/ )6o6%N_ÖWP|3;tTc%rd=[SS;l64aBJfvBA%$nmmϯ/ٸqtw/&hp '+mCIy4c4`tX @?C    }J_q斳,̾'n%UIrMJ|%Mح>)ϏIKK$UsdEdad):s,Dp>zʎ232@+" ޠcB2L P?*g|zX9Vu+%%LLSNVeRR_!fKa  Fs]D0}xJ_~ʖj;j;:urXZ+>i%_>f)[Q ֙PY&ZEٳ0+0V:"gk@k`q yj7QֳJeYĀ   0*Yx=7RUV Kǘ#)v67'g{Z}Jtq @OpS'( 9pS0r@d:}%̶@kn(1JV))1{FPnY:YQqZY=wnȖ<2b.Ύ'Vfg:${ `lTb|u|Y_0䥵ZW`%|  FsS;7n@@`lV:ڏyuW ACJ>%LKXMB0XϞdagO>CuXzXk@>LX?%[$gΜVp*oITRRL'O8Ac#QB;w   <*80ֳ7fNr bAK h7V~)=՗>`G2AI @YϞ=~Ϸ,653?-%I%%v_&k%16B\4bl4?]jv[]33dMbvkYJcHzs싶d nkAuÁ ! [U%uC8(?NT9>>э@ @ 16"@@ X:b}m:_'.W1kjk`ZF:r-HZ̞|/S^ Z QIK!X8)NAQ 7^@MKb  O@yc2wU2,ey-eϲ3gTZZ332(\>媜G+L}@xhjjb*\QJƦZ~dZȁ&R@.cهC GD%T'>ΓlKw)n<gR|3Є?9P78_D5$%mnX+n@@"@ww7U[U,VVW˪j`$PP@&s!ZDGC- h(&o+Ϛ},n dlty:OmUo!O]Lq)vܠ[VZ2ڧ6VzV_XJvMIII}ֳAUr\RB@ Z TԐdqj2V ,Xt  oX8WaSSS(A@+^@@@(V"*q-N{*Ylj9Sj5^gcYȞ 1s_k4]54SZS%y Dm6ZjkkcJV^7UL_S`h1 @ (?I?!`< yFhUZÂ,A"sܱǝ=^0 Jbl0@@@͝rڒo;75UPWf=5٠v@[b=uij-]|:,gr}!&,VjZr}m^1_]홾/`kk@D| i233(++,.3:S% B`K ᦎN]YpW{yX_ tԔΜ|4  X2MT9[ kOuF](7]fH c`LDYfc9Ǎ(*6maif^cQ3gp WWUɕUUʪJ 'c_ZVr%pXFz:N?  , 7Pm]vuulg_J|eu*(@ Iɗl?zk ,ҲPSs/YXӽVGIJkZ[rz֦b]Cw 4yRʎqg /}H^EWrj)%%Y ,ЦEXMSb4TzB2@_ok]}=RMMA7v oh>Jxͅh7uG;@>'(!!ctSܦ`;lj#Y-dk8FSXw9XHG]7X\oֱ)ʩI>eftN0:"&EW0ڭd:Qɔ.,[Xu|8d =rP[G*و @7?+1h^tVn.[a5G]zLL@S #Jbf    06 h_ZeshwY)$kyqJY(Qꭋ:kSQGȐ1h(6'Q%&PE̯׊cC]Uh1#M ,@-R25%ªDb #A=|i&](J=/7bcc`lX@@@@/J"~B=?֞vv%+E,]ej`#!9B6    cFKq qp)dzNL_sdd18۬PLU-6%HPgE id_Ronn"sC{̱|&p+.DVZ%rľľz|\G{\/X6+eff@k6jemG+EluR6u(Jłb񚕕A[ 4  u F# @Yzayk'zj>!CY2JXl]kH/"}9$Qaw+A^&l_l&"-. F* D5n+p6&΃D@ՐX_# @+֎NB;کs__H]\@;l .n<Ѡ@`;FK{֧#.QŲTr~wZ9hg'g BNZ΂oEliĝdG=..b9DZq;?h1$NײiV;[ky~ 1BbyиMtb[N} a= &uSK(ں2-빺Lg H2 GbUkp(rMu?O+;jUuhu\Z[Mv$ n5 Y2A,v+MmC' EhZZ-T?M_ >W޵Aq8ŸEøQYY'0>'8ſq|=N.dum ,rk  y F3ÉA@@@`0fNi?%X"Ej .oi%sYfϰ_ڳz92VQRAQw{Y&~$1.֊-vK[p!:oBVkcUUEڭbS,7'h)KS:|2U.:ϑbO IDAT%@rLI^y(*.| ccp=p ' rb*u.x{x.r5#=a( Ə4%16j-n @@@6.\E=icɘ=COn%s[5ڪXZը>` d`k"?%Yti,:$w6pc2L/iEeV۞M.T&9q{/fccR7Pޣ9^,O WuH&AٜunkJ |}~z?}Ј "T쮭]},,ΚYtԪR]גsolb Sd|.iZ4q6suݬbec}n:H?JRAT) &Q\o9U8EWq~Y,VV}@VfVoqyއ}J}{<_-f9KP1ZOZ ,3Z_?~كq2G3\ަ>+&ui j,@$ O g& Flm;X:(+¬CtԹձwen>r:,bL>m]!bp]$xП^Sh͕@@FQmA@@@@ 42>V}.*[;]%v[$֘YjQ'ncQT3ﱐ l]Jؤwn@     @V!c4l욠ZqpM?ʅ_|m7Pmc4[Oj?it3ىJ5J.u! it@@@BNblc6/4>C]&p`f[+Aʸ4:-gYg?]{U')ʂgӋU^ί6+   XX     "f3M[KU/bBe:Z# vkډʺH!:$j0l`+dp.lA63"^OOSdj>VZMæ6eV8-kDZq .!{g.^22҇t|b/pΐbD pNB;\}k,ص~ )VD^j*B*۬=^h5PO]iJuVmZTeggѧ.8*7   16T&Vbl=vm> Ŏ_ే.1$,_kiYU N:u@SsDeoƄ>TXLM+T6/l}nŎ;!;Dp     0<[m! սc}x,v<,uJaBm?6nD9Ch q,Nli dP .԰nk;z[Tp˔4>+  "16Td.O?Pֱ"Ҋ6vq! ٛ-;%qO^qkm!:jꢞc*; - JM@z H:K{{=O01c@ȾS}`HѐR0Ca'yelV[gY@Fh>Clf1+htq)!Eڂx33CxHcL:7M; S}u쬛B&aL>!7[#f…|9 a `(A سXZa[hV⬁H)n Iy'iiV=,mvZ-dOEu+\ljg.&\s@Oհ@@@@@“yTTbYV'Ҳ8˖R7,XB-UJ\MIzgY's٤KL­UjehX<ڭ]MT)}#8+ nʖq\:W-Na!КN+VZK{aEJs{TZJ`WYgWߍK}Kg㨝v7jIF:ouRJN%ml b于ѧ_#D@bK;Ԏ5ݱM_M%! yy)stƑ @k=CnQ__O^xz)66m .@@@@@"4<]],ОS¬t~}^ dHU d<HBm2r eR\r]cZ8@a5C[U?uyHg:b(l~}GԼ3(ma"PuE`jRrr2PYY۩V^M:%%%,cG ` eEYs+gꪬQ5쾠VnZ i}"mZZ-;K}L_;n}Zv*ҵj>U7vL,8[3U{=""k}V ||+ٌ)V^Do)ƪ|O XƎk.;m4zghܹ%AMM =t}1}rWaÆ D63/JeqV|֊Y 5O֞6sôAl,-ӆsbl}"!J{MD\{dx Gs̑]}6m*qo̕wsp|G"j+Ƕ:aaAQ7[U|aȵ2vX|z-Ϝ9s> }Eb{-b^zXƎ g    "дIz[~/^2fOSl%pX^Z[l@B-u.|88eY, bR~O fAڸ͈6q7]pv뗶^Mr9ދjuGuЈ*V'9cGY2vtm}9XY*J߭J6mzJ.Upcա?$`饺>HK|%@۱uTFay.k>9KyTwu}dwܳ_7ϯ)ϦMJ̖ҞϷ֮ 49u vkg;U%7ֱpa; ('{顇Rk͚5sÇ\ :}43R)@@@@O PX "%ͺq9cwK8S-׭kS7 &%<)u.m.ek8.e YL #J@t/0W*OeMէ_yڱv_sJxe x"2{0s^/ZyXzbXƎ$uV^z>PeƌGUUUd2hڵtw4      08@b+E[?c1Fnaaa Fxg,ȺvVܾ,bQoK%zi9Nvq.BDd$DRv>ؠvxֱ3 !<ˋ{nV/v}U-ZDw^_C     h'2V:c>Dm^  /U!!,oWWkl뇊2J_~.}ϗBJv rKu-nK{_]B7 }sP  (uًDL1| `?ruww;ORTT:m F2N%Po$2–@G]zeʽ!qIJl=\.}⭍KۯO_?tƸ#y.r&Ǻκ{,<Xtrɐw?u"e߹])ui>~Q/dFcGVc=D\K}}ۙ'Nv=EAAԩS:*      0 FXŊH_E9k~ȴyJ (:;gq3t$J9HAFđsmP;@X3m.°KAtQ?-}KsZ.gOΤg}OmpߗIvWu/:!R#xkkF)))n]$'';۝PT***O>kiϞ "( P{C{Ɔ毢ѨhŮ(أE;(ETPE@PkvݻۻklyٙA" S lݺuFőիMz˘9F vsg[J>} {wٞزb 77. h[jiܸqHn2UV{e#РA3uZ6Uˁ=lnݪ Jodڴi}+V?uEӪW>S@EzNO?5;v4]v,eӓaUZ]=c39WGsL*;5`zWD2nuϦ1/[%&Nh:ud߃>9Oh~$ֻY+"E+*vZO /![n5x=Ts)7!  TMzlm ]ic6YQN(TX_k=JvVoô2S^$[J`/sfܸqF̞=]wSO=՝g@@@@ #@00%۪ 8cѣ3W\ c2     @3]ylڴU]o>A׼bS@@@@20ey>`76]v5lI    @u []jD@@@@ MAI9    Tե9O@@@@(ؒs@@@@.cKMs     PR%g     P]V<@@@@@cK@@@@@.5y"    @IƖ#    @u []jD@@@@ -)?;G@@@@"@04    % [R~v    E`lui@@@@J*@0@@@@RӜ'    T`lI9    Tե9O@@@@(ؒs@@@@.cKMs     PR%g     P]V<@@@@@cK@@@@@.5y"    @IƖ#    @u []jD@@@@ .9C5?==dsG"S!s1w}_|a.\hvjuf~{s1ǘZjUT6l5W~}hѢ&L`{=3i$履~2m|I'djK}1b:uvZӡCӯ_?sǚ޽{gH ǔ)Ṣ>jf̘a}f6SukcǎR)Pk8km{O-tvg>:r}F-WDڃ(Oux)O{ IDAT:J[ʕ+watL>,XmtuQfРAY_%D Ӆ*DC>uo'H PR'`]º$?òΣ [.q-$4i֝S^z%&Nm*i 4^zY &N<Ĵ_f)XdIۧ@m{zDŽFIwꩧiaÆ믿>z(%Oż͢b"fZl}OJuʹl޼y_DATȊBz]aYiqչ># +:B'[ӅN<:7L!@-[x}c] N՛c/;lMj[kێ(UoweoVK_=޷z2ӷ\v-/& Xט"=aHԩSǷN1wܴ;ZE'6pC_9[V[neqIZ.+ 7zD͙=PQk/(TXO($;3b>,[Dtؙv<W?QlڴiK.evu>j9](4,:QLJ06k(@/Ic JƟz)ߗe&On_~IXN؁?ڵK,^DfΜE4`zwj)9|p_Kٳg'{\q;*?O*8}W_}uBu\;cZͫ2w߹e~ć~a|S(b_S|U]Is:.(Dh1˹7qGq~9^aZIu}Ys뮻0`@ZB'R? aU:Me,˵u3lD "O_P/z%[X7ua+ڵky>Xe' t6s9ǭSbx9ܼǏ?Ǝzt]wN}nM&= ǡYM$J8R)T1w o"g1)v_qYU.U!4hS|:^kZ( (`]3K.2l]#۝dٌ؝3uwgf͚5<f|ͻztXQ'x cZ[}kE ;l_<4֗Y. QFGvmA8UZ8:]5sx B&" 7rd=ןs:cuBԁjܝo~|źOd{\?Ny=JrO]=wi'w>y., wޙ(}پ^t! Q^{g::בJ06M@W5=kJs'Ƕm6Txkw'Zz& bb ƺEFyz\X=e} Vnb ·MX֛9sO?hߤ.ǼFi͸!1M7`RpjmG,)筁3fp^XMX兪 JyKu>kޓ-{4y„ t؄р>/k!UBY]^wtuW3QyɁy ee]foe3sO[xH}TkKv25XRxW3]DfkL/Ktk'wnN3Q4֟58ZN8guYN;;v[+[] F~J?w6aRm]DZb]S|W{O-t*-T- >]2rvzo,U0wUH>v^o _ yp|Nªu{_> f6"X<:UI6mIJm6R<=ޮTE]dcӠAЗoO XO?^ylԩކZ]oVz2BR&䅞Gakp/_BP=f^*HqM+{sdq_|N;_}&~'Rȑ# ~ .bZnN>_U?Qx+e>./x >ɓb6rW{pvZq'mW8 YqhWfMB"ngd@wx2ohԨ[gT4F}-[th ŋg)SOeGyߩS'PQo7dwkOkpN8!lٲ8me@/Vgs3l"j ߶5H )7b\S|V7>^|NL:/Hvm:˜I;a qH ^Trs%U ;ו^~"M7䖳~T&]( |udU:uٙ_Q2  ,Q2|r 8*bf E_x֒ {bܹq^ k֫5dɒ5(;k^_LHxsL0/Qn]N{V؄W,;W=jTp~ֱln}ge{O貽V8su}/8(w OvVEfJgn*ٺ>3w]s)vYe#]* )R$ )`lO.I|4iҤdEDM:i0ʷ>4Г 3e'b t |(rDof{@i.ڨY յkWwL'&ƌA 2d@zwZW[ kPAʞs::Ϧ:GѧOvuIna&Ol4#n%u֭ꪫb w'Ul"NrW[crw@ 4V-ntMQlS6uU?ZN U|FrlɅ r!/\rI26%K.6Jr) [-n1G4ӣyO?tٞOu=l[ <حW=vgXrQ-.bE뮾<'[N8V٘է7qŻ(iZ;0w"Gϼ1biذC;ikgե~gsd*q_S|Fl^|NWAG` vw}g}pw„O ߗH3~鴊ƍBFFII֏dl:Ngk]>^ѭȉ@d˼;vMڝ[-(C[-(u/fs9'g0DPGN+׶mۚ3<8A kDм(oݻG:`]3f0k׮\>ul澢"}W PRtjEM֭}N3efIkK]U\:N U|:5`lt+r"Y5_h袋"5jџN;4F_gΜr-tlZ F&U7#wZ8 #M}z0bw){:b[n̞=;R0VduL|ͧt>V~uZ:שtS݊ PV\ XEI`[}YF)F2ٳA|a3/=j2mڴ 4!7ֈ&ݓMx:*YU<U2T`1,㚊l"qՁއ~h^yi(G5}t_6& Kƙ30 qb8DV| >M霬1-|m;"qYN 5|fܴތd߿93s2_QٝwRCN}+?}xp/8 nːڵkgڷoo{"&p ȒPPt=p .W^|ħ~xM-ygB-Z:i2#G4Bz^7:)έ`o?@x 뮻aJ'Va*/KBkl_73f}o9hK?.qXy+!:-T뭱ٍEn(՗;wQ]|Ժ7xcZ_2}TLvZх^֥ՇS$Z-TV߲nY.` Bw嗇gߚիW'?2|p2VnmCMX-Rea썷.sέNqAN:=uz!aX}eJyH?i8+-O.>{-Y*%k`)75i)e8)wba~NmU:MA(jDqɘ  Pp7;(` ZoSLI[0(QfM_YY<\Z,}}7azqyjMgjJ[.s+)s=c(N6JyMٛW%Z餪Iu0`ju H{ {3}gOBfrrG9JʓbQV^_fzU1U*}"~*sVӠu|6uobcS ds+ꁱ$O>$a *~iIX1%ӂc&:tҥK_Sn OwT֮7h}G Iǂ$R]S|&UE^ s:z5^{5[ou⫯J:0K/y'&ӂR'RL/,S.?qVl]?^{*u }zEYDӽVt!tuAcds+7pE_^Zѣ7|sC7.++\:m n{?zk+qm%8z=&6w`}juuح^UC I>\7tzuļR}WSH1"O'6xJ,X >`*`aNLZIuuM];YA瞛رow>QJ.Uu:tQuo(e I$,@+/WoG8jy/{7tWDE6Xש;w!\y啾ܝe믿Ny'tR:tUoRͿ޼[Ziö́O~WsB{1㏖OB;rg{~#8ނW\qo ߎRTtԡ>C)VԴ.D @Vfjghn R(\rw6{w<,LQ.c5#G4 惩e˖/6'N4ݺu f>Q-c)ԩyGK/d4*$TyC1ju` xjN~zz(,ͰaJ|Z}"-oe!};s<Cyc=g'RW߾}͛oi暔뵐 IZQh4c\ot FNN@ ֣t=O#cDkzm2+ _|a_#\Gz4ϴhѢ̏K'5Nu 9XݍǶ:uYdQu63={yg'?Y3|={3]fM6)Cr:7r Ɔ۰@@@@Mn bdC     @p       !    cmX    &@066J6      a      (     .@06܆5     @lccdC     @p       !    cmX    &@066J6      a      (     .@06܆5     @lccdC     @p       !    cmX    &@066J6      a      (     .@06܆5     @lccdC     @p  K IDAT      !    cmX    &@066J6      a      (     .@06܆5     @lccdC     @p       !    W@@ $ scǚ_5i3͚53]t13;QFR>   P5/r=8 @@? 0 w{ . (Y  Ro@@WO>qL|f0˗/R<  T`lI9  @cƌ1]tQ<   [pbv  ?OfO?s'x3is{ɶemFX  @# .PvmSNS~}Ӷm[sa^{lƾjѣG1  @ -x@@ iqIyN[/c9r!s1˖-+hۻwo;ۮ];3|p_9gF>3/ܹiҤի9#W_mtʦz]r6l97mԴo 8u]fժU~g;if~{]t1x2dݼ&&Md?x{뭷iРhsիCSV-s=9V  d@@(MX}w}wzg}Tnw}yz-ܒQoy}43{<6׫W/qu%֮] c&ּiױcDŽs@kGi[-CM[-睰 +0v:'S>em@(-co$@@I&$-.@_^x|{ඞy__ݗ/ՌZ^vef]w5*!U׿evm7_Z.p睉{L2YUVZ giz꩔e ?S=OYm!X @v .@@K࣏>J*[&-.馛uҊ+'vi,ףliذ8qY|~?~1b9|ϟo.䒤޽a2&upgۃ9յYgej+sϜfȑieL]x>cwWsouxWLZr- 9N@@cKϮ@@X`A~^{icVvs뭷6~Q_Nޤ>]|IӸqc{Z^qFyI~vYVAdn͚5\yuv,^]@o,<餓̀sq);8wu5ѡC ;IA߯*n>er8yE@J-R G@@ 0wyI-iJJ`_|E[-9ꨣ2-rX-k֬i~b_|akOL{5ѭ[7媶$CjO?t;ҥK?w^bL-[/bW&L`W)7nnC|ʖ9xϝi@@ ,Qo@@R{yvԶm* ֭k~a7byW5Pog zWEj0}iӦ8 pbznsu)ث>ii=κөh9s%KL<6Or9sc9  PlZ[! D駟’vjXgy-aiI~e΂vt_f̘Ls3M*?|pƪUIUXuŠԂ֛ﭷ޲*S߲ ,e<)rsb@(Rɳ_@@jԨaϪ6xH L,*p ֩SǬ]])ۮ];7oT;S1wror9Knuݠ<-spΕW@@cK]@@ T@iSN`[Z6ۘݻeży󒊩5iD"foigAd@b 2o:3m˳:h`RG}uApp\˖9ϗy@@cK>@@" \r%sfСC&L\k?hyWn 9sVZOun?) EX־j?uO0x`%պ'H *Cee@(@]"  Pv;wN:8|r}?7.X,y 5~xvʔ)lCƓ$  ؘA  @e f͚~^-;c>6~YثW/#VzG,1cfmfZwmҤ;C g]bo|o3Sn] ojOr9d@@J,@0@@Cy/̚5ḱhN;4<9sԠWwk1_~$k+4wӧ[h]!CPY83qD{ .u}oaÆmW}jt-0 0;UVCԯ_?w6r0 X'C`=  @PQzwߝ^py͵n B W[Κ5+&;`ԅK}5J:c͈#ܬ ofƌ('p=Hc1?3kO?[9}|+^9 -cˡ8@@WyWM#gy]&ZhayG{˧.Fe[im۶,no^3u1O?U|ʪ|9 r@@X*$ԩ3k|5Z;&vU W^y >ܞ۞QkզM&eYm믿n 52v„ 殻2nap;`V[me;{饗51x`e:!URO4'O6˛)l  @覠5@@\u֙%KP*].U}j{$mcڴifԩQFv *KR}Qjful:u[? ֥Ҁ[={L+x|?gŦe˖vsIY6RC8G@-@0@@@@@n?WK*N@@@@]`lvD@@@@" LEF@@@@@ wQ@@@@,@062@@@@@nGI@@@@@ TdD@@@@r %@@@@@c#S@@@@]`lvD@@@@" LEF@@@@@ wQ@@@@,@062@@@@@nGI@@@@@ TdD@@@@r %@@@@@c#S@@@@]`lvD@@@@" LEF@@@@@ wQ@@@@,@062@@@@@nGI@@@@@ TdD@@@@r %@@@@@c#S@@@@]`lvD@@@@" LEF@@@@@ wڹ$  Z`ժUf֬Yff槟~2뭷iӦ5icQz`  @cPd Exw9Ga?|߲393no[( >3sI'p O-+̱kNꠃ2\r;&\i̙33em1c>l{{_رcmz<w}gFe^x[oիW4 _7nV^SVP{0r|7pL  @0jc@,Э[7_~-Snݜ=Q@6ksu?O6.2?eY޽ɤl&N`FJ첋/W[v1@9 \\o6?sCT#Fm۶HRF;S5>J_+q"[癊-@h֬ӧo&MJj̗90K/6h"կ_ 0@ (駟6 :4r 6y?v# V`li; @{챇%pdje^~U7no 4-c 5>c{btzolze6] &]X· f@@J+@7g 9(|vKl6ꫯOԴiS|rg({WQ&8%K|Yk/|uQ/tk׮5ѣ9S|ͤ!]9!P*uفӹs&{m.B6ۘVZ!o5?ZzG}d<@Snez܃^rF -@0돣G*fZcfֈlU.E}e~{ӰaCƝo;_-_=\s5׸'NhV[l.4vI꜎:ȧQX u_gfW0@:|d~#ӼωźG5ӦMms 6R6,즛nj;}lˎ5kՋUԬ7=7&ڵk,b {s̱UYFmdo# x[ڹWc;?&P kޖO >9mM2%MF/}M6SNfb_WMOj-ݬY3ѷo_ӠA**^Ju˹ M`luq" n'pht~]'ծ]8-mdP?~{88Jߍ. zk;h'ի$Æ U/]Se#ߺ;iɪ =,GGXާO;O?mSXkd>l{1AI_{F4) Lʯ4x\F3?[o5z פI3p@OQqLEi VNBۮ]R7*Nkl欳276NֻO>1?sʽjK.ɹ[TUV˨i5Q̧@ԍ7 K.F-3cZ[` ־KEZKKs9INp\co쥗^d} uZۦ*d;SOpS.SM7g[{0{NNR˥u޼j +f/W .]5ʽҋ/h=X% ?z/* TX$=M'4z?3-3?LzVwjf ~!IՠiDSYrni2׏?x;2XuGșE&转SC?T5"u]vkL2b-LVN?`#|׵Z%{X*u|r1"$ҥKM_yYT^)*p@b $A*I૯6#8hpg0hP7L0Ȟn3 J:C"{QktiҤI(NWFwmFmZlHY7|=5K6ݖ>wFgwqG;D~n&~>| .8ٗu jE nΝ)2'h_Kʉ't,j*;X֚ͨ VJC~XIus]w5;vtfk9_JxN&WNn VRZpY|zh?sLwy``0Vk[QR I=F. 5lnݏ#@ N;dزzdW->[p}.f:&.ȼ6pC{`$T/>Q?t=؏+VRߏ 2z|\̾;^3͛//rR#W]tIv4>IDATڏ޷ `"y?k[j~فL_mzWBg9yMɭ2 vy'ZW+W~{11x=l`WeG^쀡We̘1{\Njw5B>I]|ž7y넨N}6U*uu7Z:N*,+lK^ u9 C0w P 6QEZ5i81`06e-KsT7 48I] UΣ622u9> 6n1e_~`W$i'n`rȐ!cΞ=ÝYV՛Z@:#'*sW;뮻.4zj{ fCuyӶnk*u gRSλ r=M7tOyxjVѺ?xZ t= dG3 Vi` VuѺuk_q=eEf2G}EGX T7s ݛ2]w8)`l{FR_WsU ` 9n8s}%{Tr{7T7խ9_@igsءgg5̲֙ـ֬UӴl"roc ƪըOV?a#O(P+U@Ce`9gkelXrS~cj 2Y3 HŤTX'utjѬ 9Rh ]$7p0dy"Uz_+4uRn*[-ryrԩ^78vVٜڥ_lM.MհiϦf=~ouרQ!Gu ?Wכ4(鶩`ޏnWt:t?`y6 U m]Xw,?7zT.թjN[XvuVTN_AWFتR 5&͘1λ) \]~žeΨ SI}H~`NrᨠZZGW6I-μz43ϴ`.oMA˼.VzI|e7ߜvg tYo0V^ V[ Mz;. VJ͂xAfGЍۊZuMf-=Q?G ]:۴4S%}2٬S|]_~yw{ +z/ /$I2暴X'2o;`o۶m mU ށO.JtMij WR. /`}$! Pp뭷Mg_FZjsM@.*V f &=ZOjŦxׯ_ 2/|׽}+˺=HwO~\}C6]N-x&{z.jOe(ޠoeY1yY=oJ@`/ׂ臥 .?N::.\hT}駟[>rH߼f vɑɳ@4y3׀^$& X@]zb\+WK{tQ{w!@*U`lǍ ހɚ#N@-WLR0P)/6XɷV[ُY|T5~GzYk<z F윃Jc,Jkt G$Lj%)ۨQ#_@JZlݵkלFvj۾3Yu :ٕ^ՒS}1̝;niA iW>ek&% 7_  )v2vK-l9~eJC& +ryTTiU89@xj侹Z屁4qԈJj7eӳ'`'=`0`ufԩ3ݕ'@5ӧO7ӦM־ZF*@k6{ET9`UscRe'͘1ÙoiWk$jftSucʩmՂU`:L}ezR5ոqc`lW޽jl2W/ٳ$0Q4|#zĕԂx'д `Y#$@9ud^+1 P[5q#] c3l<\U?U@|͑O~gn|MwLV J=߷txRZ=z}}TQF`}|PSWޤԏ7O?]dRr}N>,YW qnl@-9{D(%j޼_6GeخZ?Q fbCtpZi[ })6H=TpuUvr][-v0`*'꼺 _r?Qmڴ15ߤލ7ht`-Z𮶧uT?ܹ`Vl[FO3 }ou]ɝԪU+;I\WI$,b@F!@rPARgIu}~q:JGZN8ޗ,S@#O?r!I~}nd˗/Oڼ"UmTA34J^HmFѠ:fM;=}ֹI+YPeva߹|}+(h/)SNSUcaÆŲ7@ԥKD&8sI~}ٳw6iwm7v!|IŋZgJ\WX^q$xEW`lG(]:3i$liǀ՝A6I#q{ _ g^b;𗖩%mK*Ke`J 0weQfhA[laZnm{(E;lڶm1c̸q|r1bmGI :l%QSd'cIh$(J q K u[}gFvR#uw^^{G}Uz5UT}yb<) ԗ#އ]w/Sζo,V>O iЩ?ؙU]  ~IJ+I= ygvm>MfMn=A?uQnt\WtX`@ Q@X-;L2{fnZc2cxm0ntRsu;8ת'73>묳 ;/8cޛaYif#FfuRlPٹswyI|eݻޤNzﴎ5U@Ya"?O)⻗0Qr) {%@" LEF@J';z<;u5jfm-̍7[jF}8*`_Zm/_r9 Z,[oRoe8c bߴZs_uUo-נ4{o3hڴy衇,u}] :L<94009CM>}ٳ}ywn8 2CjMM]tPpAoݛ/ĉn20 Lwwua>LJ @Mf" PzW}a \il9Bf/rR}&lKd-P7x÷K/Gˌ&uֵ׫{s=kGW^ng޼y4U[}vn}T0JSO=~<\߿+ l0Q~jX~gwytp +_=\ƍ͒%K… s D}^+PۤIm; nz֛${K-Q~>}{He[li~aSf|螫=\{ZFLZnU:yxx5FU`lrC([uU*5TL]8Ss*8ȑ#PE/OqkT}Ժ[3|ɾF6lXd[o}ё󓱰N}+֨[Q&lb4Uǎ3Q iukvڴiI6^UZn0=&lŪo~+շ9s@ .d@,t [jÇ,I}Ι3'e v=4CIVԂ7˪yU^lsɶ( ,GNj>.^?Jm喑{1ӪUeXKݷۂb$]vQ=V+xa @&X Pq;SRjM4I:Vj~|4j~dX #]V8q̫L~qAGy$XYvqG;p{7`嬺.H8| (nyꩧnPͦkPguԃWzL-j} oQFޤ2WSMs]RaY*+TX E5s"JF  @j ;sL/O~7vD}}vhа ƻSVeΝkz-u_~Ν:uJ WY*vbj1.Zoٲev VtV]-`7t\Ѫjuh?![l'a\Wb ^ፀ U`lT)!    yMAxE@@@@ *E>@@@@@ yQ@@@@*@06@@@@@<GQ@@@@@ بRC@@@@ E@@@@@cJ@@@@C`lxE@@@@ *E>@@@@@ yQ@@@@*@06@@@@@<GQ@@@@@ بRC@@@@ E@@@@@cJ@@@@C`lxE@@@@ *E>@@@@@ yQ@@@@*@06@@@@@<GQ@@@@@ @m+¨ɇ     SIENDB`F r*~95, JFIFMExifMM*bj(1r2i`'`'Adobe Photoshop CS3 Macintosh2009:06:08 14:30:20&(.      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~HHJFIFHH Adobe_CMAdobed            *" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?ȣ+9}*{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J{r(%E_o$@6V>LojC5_%`f3"&*3G;FN.OF:1'Ynb_ޯڗUmqe csɘ-˩My{_ /OXaɪ廞3k"~_*e40mpZSsq9pËZ9NZ_, Ξ{p{VEkj4Ak_>?]wԟ9?;.q ;D1s|xL#I?.MdE0IHpLZ>-wE%,bcG.JdOF?W )Ixp?4)I$Jt;tӲKVU[]$k1wŬ_Wfw;f'_3H ey'zN!xjEB?/bݳk}/`9O%{;:cvpHnv7h1 O:kyofuC:4ޗ]{kkm5Xhs~w*813M-!}:I_8Oeo"̒ C>_fbF=BW/rTA斝 }?Okskm~Aϩ?r+ݓ=痘TI%)$IJI$SW[C ``Ji;tw},g|jaq~TԵhwQz}C R~іVGn!755X7;_L?FiԺp<~/~r}<|48{pO<Ǐ1П"?GTGˬIW/q?wΪ>8yEW\gX?gyOw ?}>{gAU},;K_OnEOƖ6V$n[)y}{G'kk7'g&Photoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIM8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@`\ 8BIM8BIMi72-Inch_Poster_Header_LeftnullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM 3*NJFIFHH Adobe_CMAdobed            *" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?ȣ+9}*{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J{r(%E_o$@6V>LojC5_%`f3"&*3G;FN.OF:1'Ynb_ޯڗUmqe csɘ-˩My{_ /OXaɪ廞3k"~_*e40mpZSsq9pËZ9NZ_, Ξ{p{VEkj4Ak_>?]wԟ9?;.q ;D1s|xL#I?.MdE0IHpLZ>-wE%,bcG.JdOF?W )Ixp?4)I$Jt;tӲKVU[]$k1wŬ_Wfw;f'_3H ey'zN!xjEB?/bݳk}/`9O%{;:cvpHnv7h1 O:kyofuC:4ޗ]{kkm5Xhs~w*813M-!}:I_8Oeo"̒ C>_fbF=BW/rTA斝 }?Okskm~Aϩ?r+ݓ=痘TI%)$IJI$SW[C ``Ji;tw},g|jaq~TԵhwQz}C R~іVGn!755X7;_L?FiԺp<~/~r}<|48{pO<Ǐ1П"?GTGˬIW/q?wΪ>8yEW\gX?gyOw ?}>{gAU},;K_OnEOƖ6V$n[)y}{G'kk7'g8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong;=FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong;=LCntlong8BIMRoll8BIMmfri8BIMhttp://ns.adobe.com/xap/1.0/ Adobed@     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u{jIطoֵ=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :׿翖?{{PSHŽNuyy$?Obῧ^:<'o~ӯj{{jIطxo׵=?$[߼7ڇ^ZCD}-uC-O! :җn6>=K'ݷ^'7Oq}qd}?w.g< qN?N]PwULϢoւ-6ybիU4R_s??vcO/~نl]?hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XW^?3?ao?^ غ ї,?ßӷ/~نl]{{g׿ iwhs.Gej4 ߻4?a^2us??vc0틯oں9 ;~Mn׿hyam]{{w7?b4{F_<gN߿Cfu=/XWF뫻GbFv_Zg'r |F%sqg]Zu.ec77r>r5X]xjx_dE$n+J;'o1׶{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uBIrI}M^nʣG՝o Tp͵6G)%!DT#ϕ}wu~Tc 2Hq*dw9Q͜qxϸXO*#HDcх{6tӼw'Qt/G=Vj [~ڈSRtyvf*( S?_;r?/>vB3Gmst᷆.˱%A,Q# Ԉcyx]m gE9 *OYHIT ă mOǯ{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺKu^ݽ*bZ&<e/5a~<=J^N0cCnU=[.a[+_,#< *3SH~QV˻_d{{m~=\So- O54b) ,ULd ?_%#Cmu .ߺw]{zUK–1,TS _p~^ּ̝.k;I ُwq,;NΧhw&^ƉIXme  dWRI}1oynvildA&t4yxqm*g# p&HS ܋ohciW)"5x2w{;]7n͓s&Gp\vo3X׸r/$Gc G q`pu弹FcNe^ݷm=mEV $P T7~~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^JxQ[iq4V+$:c^Y] $6wW-m,UTK1'q' M<4fbT%UԐ:X*RdjFlfy ái:2"['o;[aY W-}c(Ä@uܶt+bۥƞ\bgݲٱT#Rl$9 YJ巼U?'I] i a6$:9Y?1jd5x&TB?'Qp?]^j|&AS9=c,A۶. QL#*@POv|G Ư}#m!$%׍:O'k XGM[:<"lJ{RjLi6ԣIђTVH9ϟs^rjdbn2c~8dCU2:B+hbQ)$|wdjWS %_[2)er9FV-VC#ZMO'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ UݵY.9 ʌ5L%6S6ƪ?w^s縗Aɻ\ QiTTxXɥtS]ySl7lPTHߨPK6ѺLٺIal>1Jk0ewj L*,tvs;s1m,@{ƄC2L8<ij]qU8KhS2IWQ\GL|`_ԋSqgn2d7naJkGt=g"{G϶7i@32\lO@ȏA!]ݡ~XN멩2C[&.14J}E3=ƾ}IfcuRd¢OSZXQ&N> {n}ޛݖC7a iQ`~,/޿W6_겪7[G& d'ɷ=Gh̲2)q3UX!Yvn9üj3bZU2xΧQSQPIHS#YĒy'*$ cz&A:k{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ\^HRF;E_ٸt$!cE=Ά1_Gd6nۻ:=[WjK!x'ɧK匑f~l#l "@T4de<5[(QI^o}\^%mt8ad>Y=ŖvG3#l-@ #8#]IKbr܇~SWnևKj)1B/ hzNyϔbMkR&a3:?=Zomݣ|lm\>~QDb^ձXGlY(CE/ƁQG:pݯsKMZI]ϫ;~OU#rvM(kaVSI-ߎ$i:XeLl42F3ۡ%7*6<a\MwGEAVĈ5'o}6kύtJ\dcaD!/}6 f]MYUR0`yIJX:V<"}=w?73]^-+2RgmJF"REa=Eݝߦ~, TaYT 'H% ,hBYGpfg:K5cS/u]{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uچy`$d7V=-4!IK[s( hMϭ1 #$$$ՍW%;f7^691h%}O^{ol~~sЎAؽo*|d$`fVSTCmRj<;VoI.dY84?.vf7d&zUIipZ 5 C#g_mDwqY~J )V5cF/3Ra_>=%]~ze%ij0FxׇG͙QYݕǀ#YhI>]A:W$Z#?'Ǯjk;a6M}7[X=ſ GSp%dGo4w\}:7Tt@ YݗGk.Tξ[Ud5iL(Ap>BIqۿxɵ-^[lmyiX T]. :xo|O/K=Qv򗸼"wC Qp{tjW0oXpq =07"F((UP>Tp=1cI^$뗽u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺR J ds9Ka*|K%>?@O3Gow ; V ƥUU 'tŽ^HHʑ6v!T|Oӳ=5ϜEPqU{/#L$7>ϲͨK\x@P&gY#lc_g$rֻPC]FLvhxTG58%Äë?>6 q+wC.u3j4q%>2*js`|WEjFmMڊ5P#kKt6" XGϞ{3s RjSy<$43Я۸ wcRy!m+&kP{(hʝK,ª6zUxm}߾5-]LH¢QN*,mA$H z_n~s؏pF>=ʰ lI' L VSê Won6b6UvZ][95GMs3oǹ,+\,k%|$I;q4Yqj:d%DHz'UPTU ,u1=KĒjrz޺^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u;grg I|R͒ǤLq~۵[{v3R8ݏDPY*O=1uukak% O$Ɗ<܅Q$ul?wo/n.7A96̗ք٪t q{Sd_qfotzƅsA2۬T c\m{Q6Tn(|DeeaOn>86NjeٝPdv4O:pntÏA뙪XF4? kìt9Koh@oR#rsц&a~66C]~@R2T`0Xfe0Hd5AHxeݟ> l.xQvKiT^mqwCmz ˌw ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺRhru8] vW-䲙:ɛD4uĀČ=;ۡy敂"ff4UUp'=5'n3E__̾BñwjUnɩ;]aﬢ?"- ֳ%5=;Xi0>{qF :a%rc#(DHƔP3y$O"33YIcS/u]{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u` /%!5RM4(anlOȢgĥ'y$2I>@yë5q2M{Quqc3T52sWF]e:RN\c=^oŶ!7r-xGlJs4T$˃~yίTu2Q,fj<:CTL t_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ]3*+;,*Ibx,h 4@|j ' Ψ#^fͳ9c0іZ[$qݻKeʲ*mWIJCJ<ѷP>K+rZe,q.RªuCQaz*QpX&ݑ J*;3{GK; DRa'PQCP蚢{_R}i$q] gnX(tI4GI{;n'vDyx_v_j4? Źw>٘,>xjfgLN#J)!\krar@$e[|sTh8UQ n_Gm0Isq1Q#<ފ <:F2?"<`Rۻ4x*f#M6XI\4u1 Qo|aa^.%ʝt"5<+on®sQ%Pyu~.&s04j#:܃L)o'sWo~ ù/[X SxmyOeݦ$cQpK3"뎢TQoFsIgE#S7cKaԎ!nDG:.[jUFqcVUc5jIc֡lx6 &˛&ݴI(Ê*+psmܬ7MQ=9#P*xt쫥{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ǹInE+3TEst3bN ZZ wZ8R(&(ܡ,^TRo4̳4:eu #G@x/^DWF5:]=57uR_dSb`AqY$OpVH`qo}H{q,{6wAC'zGW"'\u~9ǜ|MlsT w2Y<0ÌpJ-UQUU*"ʪ0B(]c%=r;[Ӵv=qC^﯅֣50'` u=ZWʪ}bNe-vVӓ6Vo%O kIz|B+xdgxCTgq3f6Hp.n+ J O sD{y|Q?cij fkg3[3lc8j,N.T:?ԛi2X H毻/~_|#jF5FLJEzɞ_{W}ǖFd8&LIυEPkҒY|$\[c?_mi,Ϋt_/ޞn;'C𥥜SOL =GA_䃮hzP]Gd% ٬mS_>{d`yY[+\-B W pDI\ǻ6+f 3WeIFN魁dᥫSn̝8-訣aS{xWU̿.bX?wyZmP-@2vɣTF*2*p@b/yx$Xi$3<#pKw.Z~VqS%ڛNds퍦TS(Fܛ9?hUvp^9ɬ{sɥdݞSΞ<2HYG#H$h*&fg: ,jƧ^ֺu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^{ygOg3;t|FꜶg#(SP+9Ti$`5A b7fٶ Ynm)H;@ 4‚x-r۶k wM;[hEdW 1,h@-(9fU%⫧ͧ`,0}o,cICWzf~)J0۠2;KB(H:>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u2,*r@ROI^:I=gy)k6 Hl?n9xaMERcRӟy-(CdD_lsoǔB/w+{ T,D++%ovMC[f6_߽X# KJU18low[\ J%t~#ɡΒ9sWxyVu}5|/Y d">=WOx^Ԋ![qg]+CG7PIN1AϾ{g K~!eu=)WWjƤp?r4] 1[ [C_@Z0c0xk#Ac)ferv>3-Eeuu[$QE$@$=ۭ$%H K$"; %I[[ۄV ]݉UUOg{[#Q>2ObVJ;'v&N Qj'ُ y7# ߗf}s2U!Z)eƀ(FdmHwKu}ɸ}Um nh|摃?&h _*;T^Tjx*t[mݵ}MUWN~& s?>|Tx-*1*/H p:V_N&ͳ&DfZKtU(.cb2 #V'I=ޚ4=:K3PZpuz^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~tHPYP$OIh:z*ғ:xoi4lV-ߕ4s"j?}MR-_Jձ}!?iDH0{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^?TRtQTH݇lU, ]Gɼ.9eO2FJg>omDʎTіUgFYEqo|Fݺ;nK}%XUZgb„)!RG&'?݃93G[Q7n2Lجnvym3,qHOS~r9V DR9?MŠ+f4>?g.hDdkxd gP+\氹ˆŇVsxd9o"xa}&ټKis i)tp¢uW[{4w6 QGBUOM˺S׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^қfl=y762 6d3'jѸ}Zi#Q0)s76߮6\6DpD+MZQXEK=o;˶Gr lm$$J~J\MV<'= }}K3os$ѕqڤ '& 91G% <:"A^~܅k[yڼ>9}[M,oFi+vTݭirjw4 PR8ƺV=N?u!}pw{E+2Rب?&8}}pCz6fDžb &Ҝ\N4TQQ)144=%RR zx"T{8-൅-Qc0Q@UUT@ iV˻1,Ğ$RI=IM~{ߺMymr9Ŗ`pXIٜu.3O%EfC!Z1"^I(Xm62{[@WXUUP2KJl76y`jQf'm'LVJ,ue[ܔzon+O,`a| ܱVMDEN;sAL0!97E"tdۣrDQToe3\w;gsɲ9j)d*Tzcf"ΐ)h 6q;n U-DhCM#IO#[ qޓȪV;;FHQHn xڝuZF wH[52(]z_ʫzxd7GQKUqQ~5m_˪bƅ̟x>|B]orՌhr{]VYz?m~|=B@9[3O0C-TkJO0a\GToE=\?H'~-ݻ99rˀ5+`./Eudc@=tۿԻɉkmj F3Ta,Jº"s}vm..!bfSO>SduLg6v~/@iiƲJzǖbI>#gyRm|cn |;x%'͘ 'jOXo2^^dG EJ(thy!ic(RK,@UP f&r};HeUM$p$q`1*I<dOB>Dz&gMK[pYVɁEpi㫩bP aw~Zw$m` LWEQ7Vi)E*P^cSѓ`䩍5-)UPnfl1HENmϸbE/YOJu ZjZ|#n5"U+=8k)>WHa0)(vUK*׎ϧ]}/^[9>*eVNY]`Z ijCFID#XYULO{w"9}g3kkTkkH5Bʞ$ci;_iytZOw-V:/%a*Xϔ4;v]ydFJ߻U4$JC1E7ō-=0f}y[/hšB+Bҿl}k-#L2 O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺG`f8_XrL3};FUP $ ) 9guAr9O5,}ږ3%hM5EO֙fuQǨ3guy[Wk:4JYYRLJ[g\׺u{E/C3ÝٲBE'glzj<$e Mӎ R`@e_:肦I}}z).:o,A. zLtG4jMfm=m,ݴ;Z0+;vIkk{|YDwA{F w Opj0 T`03 Gvq}>kD P(S\ J-C=ω`f]•k)ʬ&.P2FAr?B|Թ׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^N+-2 Vep8k%P +3g}mVǷm\Lc$iڄDPYHU`top-U8z #E_+ݘ(]_AѻVqƂw7bSǷZ:Z7j6_yw>i*lVCǍv˃c*Ɩ9#l\cd篽o!{.UԤhee2KN4= 8L8t ֣twa7f犡e GN6fo}'b;m[E曉*!@xbha={W?o}-`_I2L>SI @sPHػVmFܤ͘= !i3DpDG>V$d\;sn}ĞEKy*#[E©8ck9np5+JQEQ@꡻7͗Wع({49u|~f2J#(r~ܭ6luT JX{n%^!ͫ/Xu? E?^.ɷ5aͼ'ΠO5"/or<3#_DJDg6tVg^Iq,S쫓,|qlNuǷEHu2 ]3ܤ%EY$Y2'u%QXb.3I>Λ݅G v(ISxbi&UR_5]TM)#}+r-N/vVp0rŞYIj Li'38now%ܿ T *"DUE@}EXhf*zzxy"bC$M,*,ϺI$pQA,Āp$80Y$$Röonj~O*!xd;R ڊ[]h/o}~{7-gچKkxQr%d`m.QW2=;Dž凲:Y,)s07n/|&$gvIN5 *̍_?Wa=]vu6 xҦl5f\R9cR~޶)m΋s|ϼ7La ƣwXUVh, *#42MINV2O H+kkס?ػ^׽ujJ:cQMSO0d9:8! ^HR++ 2 NE,Jee$25A# uM*ƺwZn<}w^eNaL*gr[JE58/O\%߽dگYSƑPcSE"~߽nx{/"+%H[bq&I ^E+/gmݘM6#7Na!r8ݔ(p@7O5r&2G$ZT@d`JHT6hބ0Yɰnԛ-]{k' #5t:99EWk'W{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u`P.ۏ}Ym|UNVMVBHHQ8ܯɼΛma5Hcg Tͤ( v3N|ט!:'Vv>HտtrPl|ShnɗW3IqGRE[p}5wrRYFhM$I 0q 'aϥ8ǼA^v%64~$ ͢==ml6l^PVw+r'Tc0pϟ7 nj)$ U GICw@]\nvgSΒ>:htxYXjw {Qϰ7<{Ⱦ~M F:C@X<ϗCv2i:3?n`~7l !NJjlMiJFDn>}nW>&]LyvI|Q[FCdZ]Ncfo!}6Mޛ&Д, z*XuXx\/ȯ]2z_c)jNjv62 ꢸ1,I d8by ؉Y{嵍kvd:Ջ;)8Årbgad[}oLUk-fR |=Z=g[ڝLaT9"T>z+SMA/'tOa߹F.2ml?ѸZC*Gw>c^V7ċ@y"F{n{^_Of˽_tSf ~rn1#l`>jYP"0y"4'fWb,⟧UڥC1aJX 9MllgPPxH{QpiŜ1/v9UuL8v&OtS&j{7M\h!Cgȿ|ԒamcnuΠᮤ2W!CL'S#[7N2-c5N3VfXD{rI5=Ojzu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽t{y{T#M6le*q9 7zJ)ZwIMPBF|{,^cu$24mBAe%H%: tY?1mϴo^ڿE+Uq] |pqa?'-IN;OacwVŇLdôETY($k}ugr\/*=Ԓx:JƧ}Y\w>Ӗ5e=I1lurmջI28*4uRQԨ#KWs'{*s+sԻ(ElTHQs'*'Ms5W $Zj5#e$C!cЅM^׽tw_A?m.흡Y zLܯYR45J *d }}NVIwt14Q`VKEt%H9݆ʷom.U&H8`J ퟏ)ou7U[CE6;ͺ8m4)}yLlv %E-2 mO|>9G^%XZ[A܊-Ez :i$3; cP\-ϧ ^[h\<?pf6[Fܵve]X!|ca䚩nH AhX..ZOJ=^gkGE t>~RmØ[khY%c) ev*SAsnR-1;UU ֽwWYDln *_V9)$xhL?v^ Xf HEj:m˵Wj=A9W+]]]E)Yl>\fce@XWSPz*9>Ӗ9G93m],aZMD jv9^Blza~a^e\JQG/}"׺%?!p_; [znH$;d2c8> J 9a.o7Fju/=׮*(U~ (@y9sݮ6q(|uTyw7>~ܻ//1ORe E2*…x[-Nb+;%kdcJTjr0fqbnϱ[)1-Q*>Ol%nɓpbW{wnʧv}ng@^J|7񢴑)5q"s'm>6f?af|(2V1$qfC3עM:6հ-]!<uy<:UUhZu%u NϏ[2bFբxxsd*YŒXrw6j{VEq,q*F/nC=9{B3,o] qd`gsz\`{V7[u;Ges"xeOB?v=5Q,t 67Fܻber-ɷ8>-<}ǻ.$kW8 ,mWKkCK-m^s ,r7Lˮ#FI ~b-ed4`Az^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺKػKW!n$Z2q%&B SWA,G>ܟ|;o\-cTm@µj!4&9b4苘glm⾶jJ*HQzpx[gp[1;iCm㥏eVѫp4t3cmSNY"t>ϻx[/ )_[4 RFM^Yؑ 1ܟ=g9,leYΐy$9((W96w67.-f';e*W%V#BE*\>Ͻu7;-fuк *  #5vhm`$Fd`OG ä]{ߺ^W|WmOߝB횓%]dPQz{V0,-CY+XWf%eÏ|8ϼLB;9ȊL23eH%YZyć]hKV|HpS@(#%:SvGI ͅڻG)wE"GD+B$1&[oeSd(݁ QK#7G d@nw9줳 8u5JH PV|ΛBovύKFJK Q4ȪHyЇ{^׺u{{^׺u{{^׺u{{^׺u{{^׺uK<4Q@I.O D{G$z K}.-rh͸`U,~I~?>"3#ZY8$s`)* ^[Kj$!KA_\kBQʏs.L|R[ԫ\KZ9O*1unxofzN<#l|5{?1W.ٰIJ<2b)JSM[ 71n6j|$_]Hb+bu|^DԻ.{xÁn!z}m?te}wd[kavʁ(r?&B>-y@-&(mkJo>_ϨusLe35`gяʗv r rIIn2oSR`j4r5lP.vɯiFu5d[=*G˨s{ɸ{lǤ5*J _Fl11u-#v~Vs>؟f i;sS+{ֽw/x݉` s$JȴR-b-݈. FbCv-f]Ec~U }jܮ>=(_׽tv~J%vhl&ILuQP*8ƦhՔIECYIA|7"r/9vPYYTJ $B2ʅA&Ȝe*<;E2! ФX2:,yw L{AGae_l-q#o+9> si>3e?ļyaA-ŤNâͮl? 4= #Z}}ָK ,fz|cYl&tٌJSPčHя {g,r}q3/YURpYI8t}1ɸog*^Ic;q*$Oݛ;;ŒPvPݔ!`>j;ců^ZՉyּ-mV#ʵשA~^(4?mʝ@L?3mٟO'?#~6eX&h7ӧoMu_Pi2>SFOK;_SWV#}XyX?>p_g ȶdCenT2S"d1_SC*7I"U=OFbyGV!v Pj^'GȬ2PD-ylH2[Sadk)u i5yfbarR~KO v6S+[҃O_NtSVNPyFZF'E .%c []П{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺNown v"?w&R bWr tTHf>v *+04v]Ϙk}f.XYUQI7 ms`FYQUh$XLKjgjzv{Wi>S%JaD-3?nw䵸p ۙW43Ã0:du8g_|[ek\a/LjSjU>%SgA.m02U˴145ISSidv+ /WjjUxm$(I>L~Nr[MBR#ȕ翼.=sG*ʴutuPsẼDBs՟.pS*RRMyf+A{Z׺u^ j6?kJ-ɉ,ƽ.wm]4&cl)QET\,Σ.lرܻկB[Og*ok?kOh>#|k9OΉˏY(gnVE>mlE,MN&;+T|G(2zu>OG?+7kٛlGL-pagSD`ӕyc̈́D;͹v{J;tZFoә14z{{%0L4M=i ?ßmp{ߺ^׽u~{ߺ^׽u@&}I{^n`7LJٻ{po +i"ͥTQabNOv,6K9n! , zI~nn"^yeϣWb'*ef;DBplaaǏs+}~k\ixoar?(5wWYv/್%;)oݣ l_]J?n5 ͊o"ygG/8s0Gi 4lW&Pbr,ޏw:?8YIokeܘٕ(dZ},ɎɈMdŅ%CdPf"m w%7;SnmS՚L5o:a;oSŒ٘:з^vk<:>{[%_c$N}4O0+7"~gVAVX UPUTYUTpAE(${]"7fu]ӊVǦ)Yvȝ/R>bxC\-{>û7r+F%mnSnn!,x8tu1saqz)2LkթmrQ:snPvz{em$0<_QSÄW =UvRುϸ?7[..7i<`bڬjH#NvU5Eq63[E!ҺR"s## oq5TUxUDck%\Kx/fe{thaS,X΄=.ǏQ5q3EUS@+|uVԪ}@g3׽tw/uw?m.Рe:;!vzI[]/ 2@oʭ9~Il{VQt+RE*"k$TWJ\.D}vrr ke0ƾW"#{}~Ry}H1nS̸Ap6i l,9ߣhvƣ %ی| FiIsFg't]ٴn^OP4%{#ve{4IQ#;u$"9 JhgjNڣjg5$ IDCD;[{^7Y0KXgl{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺVA!۲`vg4ݣR-Ώ!_^ȣ_+s׉!7>]cޡzYWkQqOζ"/C򮞶s׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^s7n%n=sB~ASu>G߫fj$mЇnk)shhun_ud>lj)%$]r%?ͪ?o}}*/yn+@ZZ`}ԡmBK^OsfY0U}M`YJH؏J7Q.O+޾~ngU7LϽǺ@-ށlQo$"j䘡faFPo^ ~G1T@q@o1ZN^B9+_dIWA}G[ rQ?.6y6wa5qmY:W44V7︷Z[YnC:V }v>gFBo8H_ E7{|=UpgR5}鉉L| [s'}׽MlZԬtPp$ g}uGEq*xVz*Z*ĦO*ú*'zzCS%t7vY㜧蟞_6zGqSZyf>RWed9MRceC/]khbm=x?bv& C( 6hحo-axGIcHT~CSp-n\^YG?k9,oO̺Ej1a֔[>;ݹȕl{_w[x{- eZ剩H^}Gܛ<G($]ʟ͙ە=ܻ3*~6G!5U9ڽu``Z޿~}ÿMw{ж,bVlցɧj,D½J>{Em&ͷn5=$0?Ovhu /z-7Wq,.B/ؙty)䂑jJ5,G[ݽR'W5y;6 K)V* D 7fc}(ETc?4!%SgOuIm6oTwRhQ9J%]uIU[<3\X[-* P41ifzcĕ@:geMͷi $I葪 >]:Go]2ϱ7^ fmlZj>:7*^:hr ɤi ,ȹ67g/Y"E]ڔH3E$ӣ}`rgYo.c dYڊ,@Tmc՜{Lad ~glje!Fwgv_h`x\ -5[8*C WFͯmEϭ~\\O%.8Cw ;xoϞ{&Gn˒e&E7NԓS(DU{1s?0sn&̗LjM#HǍXkD^:gv 6+;X@=M,Vc$Cя^r~׺_SdzRrjw9IwCZ$B&btjXPj\LlU9_ոhj(fP`x}l"}o odb7T=)4: D)Ĭv{>뎋8޽ڻc_V'_**Ufs)O[[>UT0 KWaF,bwH+$`.!TQUTsC9z{l*(AE5҈JHWo{^귾j1M ݏ؝-=lKxSduG a"Lg4ȓTG˱l=˘ @ 0ڒ;Z퐃0VYYh]W"o:o{ƽdb)-RXP& @: c/wq{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺJ=7_v^boͥ F%DgPc)5G4NH1oZ;[^YȲ"Ҫj0AVS#*JhwdaqRg#*ѕF Czξu;cMktwUK _ zZMUIUBywGw}-iE-uUѡ˄Ms? sM7+o0F$ݤ2f$#8;-~@rjcm0*7jG\ƚ?Oύ>}'a5>~_]0L)^u|ߧ}CIqmͭ}/,dѿ1?a~ȷ/zTr@Ne$?zzqgߟtLVFm }7:v=սCAqۖ]fI2i*V?FP;<Ž 6a.suD'1)FT1;Q wiҥm#/,fǚ3FH 5n5x~woeZ*^g _Kd]pVcNRHܩ:7 -k;yGBۮ"x'r+#*2:s{ߺ^}wgO]]MbV)vlߋm+YU )䧎YBWV4{Ok7n֮ŌS,6[O/TT`*oS%-o((%"&p%4FÌQW<6V-X zEg*=տԶ&PZ!W<>g0Cұ:L< Cb"r?تc`'J{`A˟wV-;$ˡS?^ +wM1{L`m,IU3=; {<϶[`?fN\c-e~ՇC.:u_~epy&G79w~.Z>yk;jqa:}t 蛯{^׺u>3%|9Y1Rd顒"5}=^v*{ЩvV;hD H$/).GFOܫu j*jʈ))) Xদ3,B"@M4[ff *,'dxiTTI$I' E|me%>?|@M䨙:Uݓ%F>vD#%3 "ܜ%ٽT޷Q MRuLd+K YeOyGsdaeS[`}f < Polwo,M)SU k;r% dK4=swSn+ JiU% jh*WQRsϔy'ymvQijR?ҵdjm+F: :~v4i*zx I**'qDG!4R{v&`RTx:*] II$2I=^wO]Q8WdvHԱ%%F$ Z/}' 9YF$ln>h׾j?ҷޟ [xt)6ɖʼOԑO8Vn֎IKAAKOCCCOSRQSD!*GhUҨ E8*"U@Pcin%ib3YbjI$ԓrzޛCO FM4αC 1)y%G *`9>$K+UM$p$ȏ#RI$wO(W;D1wWIg4HA4"FO*;Q?&{?8w5I5-_UVYPфnj|ibrTMC5DU3WWYQ=eee\UVVUJgfYvgY1,ĒOf\\^=۴K31%$I>g:"EDUTUP(TP* ?lun{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~1Y[`W3M^w$C*UW yq5,~PRf4ShpfAPa c*ITDž{?ɞڑC*O_xC|7]lgL|96ۛ*7XnYF0En/Cx~PPPTGO# [v9qE32Ҙf" xm{8[w]/v"+C__R?h|6F{^-.~>-GvH cY%ƅi3{)QT,7t`;'+{K\hVdTQz%(PH T0dfV8"q,\x4HT=FFT`j+c|M˞zҹ ŋ PRT%0KSr JWOwe㟿v^hnk"ۆ#+^,WJ0EW7k&f>{=/{j,$ cƵԷlEZ[V9tKDk,Bփ$S/9u+)0XLVC?Ha0ڼbW6XxyXD0vviKm(;qҪojoeH U86w!W=XO*i9HI[)7 fazH"_K򳐾>ssĻ-PvYJ!m.na'\h; WQxgW?u[s40)@6RO:*-ps?W+rJ۞nRX m(鐀JVϟybnշB߉`>&A_TqZR̩iूh|S/QjjY䑬٘ĒO$%:@T4ijq,I)toUy\E.٭S:e0}F{ͻ֯3D7uSҗٿEETcTt *xj*aoE4Ul[[@ַq#e`xV";J;G")*(Ah.ψ=jr}C9`W!7jۭ>y 嚮kI$9{+94ʶITf>m$.kSש>~ry._+.MRG9pWj%;Sm&R/ҋIc_1;ƻo?20+$`k"y[l`m+p~R7K~fϿhvOUCsa*ꆂ)V)5dԭJ1C 1\t{卵Ȝ."W3j 5Fk7T-B:e<MC"ݳHEPT"u[gǶn=>Fslנիe)ZX`x+zˮ) co-uAFAO,+4 u ?vjz>,"p(ECFYՑʮׯ{^|1.ۻZM55fc4^JJPG=k jxj ww7:U,`!jY hu1g;*&ݪ{8+ D>)g0TH^7󏽾Rc^iv\4zhm։t׶J4\}LZ+ꐔW*%Ʒ\?WӺpZ+\u<= IOR{{^W.ۅ}yxMaT*%T԰%媬 0^YE[9w9w$m)b$hgw*gvTV`Uo7-mSorvK! $hݨ7?ó>9E^MO\#j>DQljS-hY3Ƴ0S%4fA7`>u^\(n;- -Հ-x0ԠicF>7pN_v 4+ZOwC\'L~kn20]w.zƞ{{;o|NJ{Knѽ~g;Zj*8EݤW++K4D#^b=i.]RK!fvb#@#DVf̛;&nWw 8f> *BBF6-&Ke6E ^ Gfݝ6Qd7 wZAȏG}:Yy[%[:g❔1 JyZV=+[{r1h 0W ;xBU }ԚB]2M ~7f^lnD[\'hFSUeu!e A=ݥi.߸DI"Ut`U?mLq]uX(>*OvPR,6Jx D)$'rQcpj Uz}/LJhHV']ƣO 1FŘYHew89w ,8ct)t׺,w@7evݠӬM.ޏ*&Z58@"&|\\ӼA`D|{iíJF†O'{E/>i6d1 M)Djq! uTSoAu$TwafVRj}粐}Q8WϟWgC-R8Gر`Z̹!m;{;;w^c RnSSٺ*˶vTRU^f$.}\\Ӽ-ta h!F4Xbr-m0C2Dt#(x% iƪ?Hu9$ԂYՍz@"?폺LÇ]G]|]tN$<ؤI"hVp_̗IcU>|֦ s PીGV#)dL6ˊ*cpoLQĘJOUo~yJJ)@X|h|tuo~{Y!z6eHI/lbb~d#z}zϳ(a't 4 HPy?t6‘s%M~8BF9>CۍT%ԗ1*?GOg /Svq^E M= [dE6 liNr{9pٷ [Ε¾G9ұڹj #~NoaFunܒO8ږ!+B%?"ZuTToY$UpWcZ{Ao$hZ/!VЭ}̳i-Q C=Ï!QFqj:mS[U|Nmٔ9zjuޝn]SǩhqsKo`Ei*|(AGMR.o}~y&?Oi> ⦴2LG3M#s'Qo^wVeس4Ի{oc:ϼ2L63Su2@In! Yc%hج P)&(]pxVm&6&(bBf*HiA5`m/Q=ھh_e eF?9%}(DQf6*O}cC#pPI$zR~ >]YT^$$iT+0)if|ᆳ`l*v0h6f2Ӌ coO"ɷE۵řZI .TQV!2|ۻ,wyaEnNx t (UE8_t|W_wE;.f튳*d{sk G@B(UX"0*& w$n[˔.$JϡaGbdb0$nZI,Mϼxwy \XW=럺u{{^׺uM<'{_uhFթ{OsQqu*6^TSfWK^:Du)5\odlcʷQgSe:\8!jRYbÓ=owJU,a* ĔeCVHWGîn}kiqv>dwT-b1Ҭ#uڏcy]wnj=̵@jfJ<#s>4ZV+Hy%8)wA0~V?{e`=EJ]Ռbbv:1Zز{$Ϥc)˺ezRT_u[vWgKi÷Ph棫L@YYexXݣo;]дrr~Bx@A5E_R3ԴGZ窜Fע8eM$a^Xeg\OBƻ E>= WvvyT4߻xl[14[&>}m2SU7^閞* 3j $Ri!~ e>Xm1LܦCPPrn;=&7itajw/+9_&Љr[G.^addX!_LMM }⏹rjIyˊ%c֮(o,8&G:-9j ~sT˻ARgJS::4ԨF9kм'Ns>{r$?ޖ SZ 5-+4zTVFh8+d'N{m‘_JkIp茤*̦̦B>Ghed4aNMGk\oSs]=(y23@{hpVzz2M㥗%}sOۊc^/N0)S{%QM w/{Se-2@@F)$Jj6랆ؘK6(486C-TV39o5euAU3Tň 4D^G#rǷ|,Œ^G W$E py%fkqStJ( jʼn=z ~6VT0QK6j54 7-J8LrPdWY p'_xRWhawNE|(5#TWe~b[rmv Z>#,JFPWV}}~d;wۃp+SPƯM8q)n\NJ:('H-$y$vy~{;MN[->^{qef2%F*$jO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺF ~mJnlmCOmIs5 MaZY9#)ud(d°>}Nd6mo'QVXɢA_cU_jRO{٣Lb ^I(Cx0 !# ˮԝ#Ǧ>;`v&#l`,sk^xZpzud#_d(K( {[Ȟnͺ+JW&Vv5Uj$F'8}% )t(V1PeٍOCW^Q/z=Gv_]E.]njr8 Bo"Ig^DFHݔr2s:r[nֿdզC5TTP{dV5$dVuR W9uv˟ݑ sคjuBqT B_Ǡ^M|\8NZlfz nQ_MtLTyD'sb!tTy_K;M2{itS#}Di; Ps`wzKcZƛu#Y uttJZ Zzx(訨! 5--4!R8ETDE ? X8P*UAiIfbjY$RNIGzoëz goݩTR>W7^TxU]VQ4Nn5gx=[B5W1L@t.QY9+w]viH#AN@'U\/AԵx|1~]˜9\u,pl%EUDm^R{qamꭥwpM*1 'AI.:%GݫyFjZ[ⲺL0@h⍆X,q((UQəcR|Y.IcV5=v@`U`E AA@j:zk;7xl;N0Y$U/Ѳ[K$'g~{}q\Ywj(b^*8t~Ht{m(DeН4̟dZ_M9~}3 6s.*rodled 9?c"PcN2 OAj#80/F%Arz|[}nzvVen;KEKeF2[y?xh=Xٷhׄ[OELR5z.s/F6붼-!LcY#:ݟ~/w^ro鐥n]US[(*EEN?sZAijU O Yv{iD&I T+HΫЊg>r%m&lPp8Ve=ʨDe4qPM.x }mݹをU#E@~m6vPEDAUTrsa73\NF.%$~Vί+8:Ӭ$o }eTZnƅ Txt`5SC j1 =^WvK`uhl 4LA-I1sXCljj5)Gl@$"D[so˚{?;q־C;s5%`ZY,#* jĉ=0<ռ\opWwN^Idbh2O*@[^նl{l;>Z[Q~C$ԳYؖbXX={^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺW1al==U8 is[#!J|GH77#)V1F-X/_݃Hn\eeD)x%h&%hdXPHe`AVr=z9TC+AA 8.pUЃ#z6lun{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ\]E)"*pn?yՙMTH5,;8D9<ڍTp=:ԞI$޺^׈@ "~Q׺?c}|iSz/cyz`S*XzTY*Upϙw0{a$< Pg F'}v?qMXot$4v}.EO 6r{Shw]\^;UsԵDʎH'EQM:$ȭ+(-s6,Q\" 񺬑(߶ i>`{Kv(rXeIGRXމ"6>쯖KiMmA$[<(RCx02T*$f!RSx/{ױP%lZЀUΐYf$[# 43{ս{Sx2jXZA :1P(HKޝUy؛zj=V(8ZO--m\%ԕMGӊ\<,E^ZA+) ̌zo74s/-՝E*h"20!=&c%ᱹ k1[7QTlS15yF $qc=muy߶Bʉj@UTPYUA,H@KaRI#DE,*I _1]%$E_**t-iGE'zET%*oDVjuŶ`y~y"o%d̖`zYyw#ɸ8v/A47cq|}+1P4)hhU#(U#5 6v}v6$B""*"( X9ssqypwr4ŝ݋;31%I$NOS}鞐[6S}vNݧ]vg5R ;aKSS1i)iZnag]佚nali$4!U@-$J$qHq/r{[.Zyu11¢/w*2zD)z==]S rJh{}R1+(a1kK!.'4G*}s;cۣ&׵/76,?RVI致_vM|-{(5Z[7.%Sn<%4ЌUe5DHQ:1WR|MFG+WJ 1ܩhhۊR=m}y pKHmΗVn+%ʚq2*Hq7',ӔU% GiE&>q{ߺX*xyc#ygX(#TYtDYX*$h$'VDyG,@ O>C~q4C17WRܯ21g1"C _МjHjFyTRޢxM7(;s8xЙ |;Zx鈭t?Ҷe`"G.o#H|_Ӊ,͍Ow]K6Dչ$jz 0;}Q{eݭ<=;y@OV X&3j<@/u{yzl5"촐A1%I3| aX헉J%Sd>ҠJ8ioEegpx 䓓y`јk: }j*$Bw&ZDP)FNŸW]12Si{ts8StpU(xY9=Oܾ-؈nO@OE$꒪On@7Ȁm\5",e'P ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~/-Gn9Qkg}֙Jɢۻ@JWPC: ^e}ewXLlb!x`> $zxicMwnS׈ x ~?Nl87Yf LQ4TndT۟g?#1RX1dgtH$9ol}vyq9ָBE|9C(hi_p=omw$բ*F ^_ _}GslQ cP[uGOi*2Y契E7rt~U-O@Yf$Fx ,SM{˼Q5rkJxAeQɍ?2 bID0X-"bqcy)`9#ً%A}[TjdJ3SZ#I$eov=tM-YFFw3,'%X]B{ߺDo~׬Y}aX ; :q}7wwVƿu:شUP|]eYCN}v?g ReNi;@EKGO^{pǮcIt{eA CFmrds׺oxfC7Pa؊*W-qPH(՞Id`@roo4K#*G ,*K3&?kku}sm4ҰDDRƊ 31 $uϏ/I G$Yc}m2)G 5b?nMXHS3'o{}OBP4v@wOH*E͜Ͻ(;Y.'ꩀx2I&׺epj +gSN/;aXʄ7Y2xXXǵnlב;MĖڒHц# +R=1wkki%I<LuV^qyx;U$_òQ"}<5@'$}6^XCD$* /)LoBv^q^e^[":13]^,!CiޝI<S(vT]H;äp}թZjqT  MW5 3$Qyf8?f7UJv-ePcGo~8~l[C=|ъZRdX],"m90u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺBKdy߸, l-@z0Q5VݘTRU,S Ȓsw2ɆdáER]ʚO",ԍ2 $n{9YC̾#E-d57lhR%84T()dY6]aKƱwwᡎ-RShg}kC"Ar(`>}޹gMPsxGhLXI;iUym{ۧ5ZmM_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~fUScV+&t4T42QgbA&ZZ]_GeeK4ffb$TTX8RB*3K1 *M:τ?Ə 0KΆ)zZA["jskMa/vYMh yZ1s!v, ?5ᛕ=)6Y$eGgį#PKDH#8UDDPJ*=9UQBpuĖ%Ԟ'^ֺuٟ"z'zp{Pɶ56BfhuK%]E$R5JFce>soOmp/ҫP6i) o(%U&;yN~o-ϙ죞aዖBر8r2L2L,R :mef3#CYb*<^Bj3#A;RWc J:V;K)fGGRVVX Au).meUWGF + VR $j:/Nu~{ߺ^׽t)K7W`3c*g28hn]ӓ$0jY Ar$qۿnyfN<Ƣ(cki(DqGQI%c^Y#\[6a@i%a j`T*.쨬l?^8m9)ߝ_IY[ִt <]; <|nBWvWܺ6ݥEʦ &qTgÁO'畞^_YE1§7f% B TS׽t:gw`,nj9̬:ZXC0M42COM ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~l'm]m튦n_uL5QX0=GёUs$k`s/'{U.+5Ȗa1Ii%Y#SMIF}eO,+[uJ :#Q##V:bJ]}{ߺD.#sLw7afi%huِaLVwZ I6WJx%S?ޟ~7mͻܥB1+h++$K~{7>%6kX $RbB xJ#F7@ SMw.b9kk8Sp3O[dNI'yi!(%)B3x@wo-7RskAvҦd%`/k]ei/I4m4.](Fd^u_]1j/mЋvUu2x1@`g9os9޻꼷sw%;vVdX?w'qtKK8RV8nHuFɮZ:J$lC+}et=RU{Z׺u~N#ظ޶'1R.^iߴ>|. WLKu*:#ML!1X1%ye~sw zI1[DMtiڀ)` "?rQ^;Cct7cg6t!%Gcc5u2i%I>|ͼܿsrvݸQ抈fbr,|ܽ\6EwcDgv!UA$ӭOd.7T[kM:ԣDhu&*ѻ8NYz)}>^mX-lp+L=é"XQQ`$P{͏}Lzn[8 $ @'<#^>{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u߿uXa+;4U;xaVⲘPT%r/3~hWk~mmq=Ѹ ıaU,]*Z7_y^\6/v+" ɅͼteP@ѲYI_y-[|c;s91Jv Z(GHghSx߽FTRr)HcPMJH8 qOwp>e"zGᆿ>OqC\ASE[}n\޹ݛ7Ty,QPeR8%X,q"F<[5rww.^Idbh8 U *:Km[fǶó%(J"',Ėv%$m+pG09L9+' !7AI.պ;&6G$lQІVVRYX OYnI=$Fdu8*G^cOQM k+qT1^sqd45E84қvܜ̮nDDiQEYAiP"Go̟~}Uاzjfq ljA9٧:SMAMzژ?khg2Y1=jj+x'Sroq/܍[tJȌi")uE.~;{oͳVc;BxoXdž{|Z^#{^t߱M=\5ۧt+moܱS5(фR Yb=wc 5[Zr<sj .^ӗ9VZTG<B4ƹ5%U/u_ՑH[qo<G6g7U覦KEO@[{Wʾ|qO;KLy ;cSAV,Oq}/sy`zUoj#Ow=7srW@.{߶{o`t~Ge ]pPTUOy*k&b11ZڗzhT(b|?4sUZ[;5=;Tg4PW7u![kaUG$p˻/_ߖf3?uzo/^Uy)xg'Uܥ::>sm2V%5#˨h_YlQ<#ǒ{dw'87-#3,M4;I,LIW%݉gv$I$x,O!f,͒NI`(` ׽tf6cvW#&_UCheqՐUanɸûm3=ͻtt!VV A{;M]p'9#C$ŒH?{b>N` {oƑP;D9v٧[$u SXaf?y9]`TE­(EP̑(ZC_~}hlj^"> CAehhxN?%SC[A(kUcfXR K+hfVI#u :*J A{I)b`J2UYHA z GUQѻ!R"Zej/W!g1͈f-QJwn+}/}۹}^{ߺAn̓3-nF[ @U[U%f76P̡^u^\.9n',k(EG͘+0)A˜sQG$#As=IWkπؘ bμEhe/۪UGoX @8￾W1mr5V5?܏EP>OS'utEVЕ@N,{ެ@RU׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Ӿnͷr4|{PԙYxM3KL!Hҋ<6>a/`|0|+xU%$,ƬVrI|"׺_Iף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽ta~*^ظu>#4-6[sny miXWyE#O>rǸ_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^җf{ml==~b쑵fJ樔<5’K!A,-HK9TTVUAwe@XM C(hY UPI>|P?zi/3+[a+Q pZjGD52 'ߺ1- *pn@P Ie(TI,Wtouy[QYA,b'hf|Ԁh?sOQW^ wyJ|&ڸl'c0z7WN!VrETVck($wݶjyDHA!#Kh${e[\Fk(ZU䑂*XR@ILo|.7qcCnӭ͝5Y:d%:ZJ{P@(M%Lq3mY;}-4.*nn%Zw )lbMq_e}=Kin ATлap!M{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^&>n~SQUֻO60Ə+u5RRԚU?}yBrn4\E Et['`A}yoMتS,?Z#zp(u{[䳙# *hf>%cbGYd`lqeH-ѤI"G)gwf!UUAfb@M:Qkks}um42hY܅TU,ItrOst;eejsz*hHꨤ4y,>wE&IDQ/h L.JOON$.!d,6Dzu$Kͼ^cbʴ`AVHBU cDed jeGn $臰޿=֕wX9DeŴԅٌRBKϧzd%]2v]̼֍Rw[1=ڠ,K/#H鷰G(ao *)ҁ3C+T{N{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ջ'몷-}..>ڵ`ޛ*z֦,"ϐԵ8b.O<4SS4TI=ED$P HdiUUI$i" %TN$ՑG 3$jg{+Q7E_O`c;s&aEٻK&-,tBbDSAoo_۞A׳#=!TaBoiGKy[wc_mW9F0?M &..ec:N ?_fǻ0¯5Q3b0XwAƤ"/$P4"@^{+͋[mҗՠ0Mk&S4LiBY $v峵]SYܑ U%iEAd]u=~15;AOz{Fd}Te_,RSNg娝RaUH#+w;CoO+\eʑ1eUi:$k9=,O}Eqe!ؚx1S$uX: (XE*ZWPٵ7;do d]״3Y SENiR9W$Oa-O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^j̏K %x&Itu! 3Ko*t5G=he*A A`0zϾc 5>kßR7:zRuykV #=?+}孽voܒ0%ES3 Jιtz77_ l]Ym&1DMsHd0xi"%>h=]&Ԩ{RhmZ,C! F{oܻvuun61X xM-#o&{5 ]T]/ ٧O4XbH'Mrz~X'oY_{ٶNG&ƳVK3] ʨjXWUD D_b?2 EH*I ʈ5Kq(^ҫd@.#oI&cHܕ$FT6xɷ~4Yl}N;o& ,E]tI6zQ2*voy }٭})xd EuÊg˫ZۨW۸\C̚^Y-@U 7V[*MeB`{̮{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Y>>/_- $֯#)GP`+ <9J1ݻt{n[HG'P +`fӘ>2Qg/w}x<ŷLʔWp71k +_d}u&V<+t&z <.9OQĽoORB\R+-O ǖU[9%B%\ 2%EI XvǘDM9Z&Z'a d+{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ\Q"*QBXI&=r׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׸q׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~py#^GDTovUf‚~ζ<z_Iڽuoozȳh "7C)q~]eN׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~̶}q[mhuw"Ck䑂"3<[U(YdjHf4@'AբuW'5_dvONd3Tw&b6cA7[f%}OͷV,M)aupEx,)pc'4}Eː\n '$-Q(1Dҝߙ|NmZ4hO76\'wt\oiqN$!"CPL5h{jd0l~$3ODzϛso=vvcp :.KHR0Eff7$|VNY2p‹h<$¢dNI9oojMuKvY]GoQVv%T8;?{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺFn3zQlJ&W`fPÍƭteY$L]'U7S{ͷ<K2o!>8mU4Jf/kj9nck-5DAx^T %ݻ%yg&駋ȟ:Ǐ4vgen #v_MO?u4vgen #v_MO?u4vgen #v_MO?u4vgeno䙼BOmI2j ˝$ Hoz?Su+^؟z*vi|gzudI1͍BDUD ~|goe_+lY1_VSt|TfvgD@Q/m6 5+O7F' *w.1?{w߸ǽ[TF]w#:Xj?>;G]Ŵ_Ϳ5tLi_DGzcz^:m$f8y&_xOs=Aߵ\%Un@KOZ 0N\\PWr *ȃ4?۠3K׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tygMu|_mz{1_+AUniF6Ԧ7O=={m>&f impIkz|߹Vn⓱ĥL"dME0EOW g|ľKB=gKG3^ g|ľ޿B=g%/Ze3O5s5GM5&RZjxK6U]LI6$;[n ( @MO=uNG 5g6c¥I4$M˺S׽t%u7OWy:=;NvjxiSpŔC.kq*-OCFBqȎ%VXm^so{|owpm" jY 8֠vQ.oG~曥SQQ$#:T`U76u/|epjlG| [㒀ùOj;r_rk{b)P@W!Z j8=|`9, ܪrތ#)Ķ/;)Ωm5}kө[++ #9'yK{ BaZktPS[4o~|t |kcxSqcǗB_?G:4ں4[N?ik[{߷o ۇ]ZOAcݗCSJW]ufǙl@: {,{3K;u#> GGF6{hڭ?>ۑGC?36lM[jҥ[zemˑzhĆh]% ͂+si;?Sr#C sE݀YR"I|ٺi_O}4 2[D(*FHzjz!_vXެ\^/6x\pi]Zu5ؒrsk}ڹ6o7BI~-^'d71ƺcE^MXqO{s][cMi&X]+A@`|/ :w{?m#_=ٝ\??-wNCqf{cr9vq?i2u.)ȑ Q_X} ۄp;MՈ\WMĨ*0JАr~sۇb"xRAqnC lhℕiP|5:u{{^׺u{{^׺u{{^׺u{{^׺uǤأ\ߦ `:'6)2pLf 4c 7'< ?}||`I3hS_㮪zgX_zͻpi9.w.4kסC/wF/{ɽ7i'?h?el3fnܹ,emVoOk2Ti1/1PpD*T$3 t`n.v`8٢4BWiSY $j _._CMmƄќF RFtAuLy,nK asX>o :y(X28̅$4sA2w jlchgvHJ:1WFVVV1mmfdY#d7ц AA}=׽u~{ߺ\%qo%-ovE=H}z7N7{ScSnBJ=J3 u[VNZ_s.mœB ͉O$E~jӪ+Aì;^ɽ^ll֓qx#GNiMiSJҧJdyWMO?tWLZ[uٙN2{ CK k/ծcOײ6ϼ;_ m" <_F9ZN c3KvKشV\xp#xF ||JV)zȞ{{^׺u{{^׺u{{^׺u{{^׺u{{^׺x[wq\[eüHp{K ܙyPiy$ }s *A# Y$rGH-n٭gyyW쾣쾛apr;66srP}YRVQM3ҳQTԈ54aYI7>Aooq{ 8$j̀E GjWIRJyo9o-f{Ľf6Q$eVeP,u&5bA:E׽u~U?9utob-La//\l׺ӻwȏ={7ޛ0uQoa_zu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{:F+cajZ67M!?[cYt"gjV%h*znh--Ei$eDQ(iMmuzmttbrI0QSO-2Ƶtjhj*sg\Ȼudt[@'_ G0~%ar&M>,yx6HjG.9gpK!&DA)plFJf :~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^׽u~{ߺ^׽t՛a76&0ӵ&S e9*W 5~:$hͅD Ohne7kx]2E2,HnYO:Ue}{Lu$$Ã+ zT7\cv9?u0R⠟-f|+J^e 4GfGM_dctnp}VVu={K /[z̒X˵$-lv.o s% ґG (1SO0-*QR:ȋ"0du >.RUGYASCu޺^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~YŤQ73~[xnXDk;a~hr˸u?K7_Qq'[짥}:`yќ}->g6* yy|xMd \/s>̶}~ݭM35ܱkMO$j@TbzK}}gϹ2ys#K[7Tbv&ނsVKM!~ݍd@(4N2Ie}9skE{U{ː;.)j@"(+;T,/u==w-Z[׶ Gi**rQ^׽túw&'fǻ"09}ɚ KdHb#Yn<ۣvPq3 PI#ypE'^wnvEXI\"͘y-[yv6z5Vyd_L[).U#HU5DUolÙx\ICU4#f:E @i˛%/XcaV}V$T~mMDO[N+O!ecM{i=r9OvKghVXGꟿXu6KXܿ['ZuEuѾ{{^׺u{{^׺u{{^׺u{{^׺u~o~Ï[;k} }?7{ca,׺Ï3P.]ӈ :hF[dD/ȟ|ϻ,oaJ0k ]2*bZJeo#ǚ&MW4LՉLJ3DĦDFje!ee \G| C:ϲ4=w]{{^׺W*o}=nd7I"oh{_NϗYahu~}zHw렟U5'-}YC*.[qWzc7^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^99*wEO[QVOP-ً×4 6IOZڛ`QR4g5bݛ;?sej878'gJF ?32rqNa_ޣMkKX38?҈E b{Ccl& bm ئ'j`{Q}˻,ٍ,m E~tXo{to˹&?ӳ|ָ_ʛbwGQ}?mǮ}?oD=Y[׽u~U?9utob-La//\l׺ӻwȏ={7ޛ0uQoa_zu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺6A~' ,Oz+ؙ}y,g&c#}=,5Ud$YPJt/iNJ9י>k B6 z($I4%*PJ~{iӔsln%$BYF5\jZDk4m΢ޥƌOXt4XaTe~2NċOIL6[m@ BGU!Y٘G9p< ZbU@uL|gmmf/ܳ~dIcꄽ׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^i+hstHĎ U<=񶇑T"^XeqT,wTw]?އ ,wTw}]?އ )x&d R$JBEARH`l?1NU׺uDfzm^_lc~i)b7*V}E$kU5>J(+DHFڻnmgEojnbUHKPWPs /]M7eyyV !OwOã5)kǷ'~k#hRo]YSIq|Bm.71 e}=BǼomr(x{W)|Lbp}Tu}wyvf?Tq$~LzWm/^O|h_u?Y{3d'vR ,S7SYM fXޣ̲{ؽfYoA<&h$"h/<*D4,qGvMӟhy۷T‰@C#ݵXGbn3Q$̗Xm(^ip[JՊL۞[n=Z|ycK}}-wd~)n(*%ǴM6Gko\TLQl&)&.DjZL(Dc*d5w_A|yjw䶾OBJYCE)VVa((>~k{5Y8-WH:YT:ETOxկ\h6LD}FԟrIm;uVk;~ }Z5ui)}Ǒ.Ϗygӧjӫ_s~~u}G~. ի VI{cb'N2?Uo@/ 4N/lt;o3n=gxoUޡ}+^WϦ[~VfF|mZik߻wfӪXe׫f<-:t n{.7{^׺u{{^׺u{{^׺u{{^׺u{[ߺ8(_wr<0{sz:u$Ȫ::GFYY[LUATSB8bc [n^lƊum JzSWi*0@% x!i7nxiNtZ\Y&:V coWzj$h8L+(%i{~G{^׺W*o}=nd7I"oh{_NϗYahu~}zHw렟U5'-}YC*.[qWzc7^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^z 7vW񏷭n*_о?X/\2Q=k5쩶' t{OJ{Mz'-&K.c u{ߺ^сeQYWMV//+ozN[yVν{;}g|އy g}_]v/;(o{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{׽=lqsH `G9XmZ^/=b]ngӪ w? ?kpvnxoʟ/r%z~{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^֦>dٌZrGٔұ]Se5?U?{__=d={)_={[QKQ*uʨ1+jQ7 Moo[ZL64r/SFa54q\FbEu ?w;jmY_ܘ铪vuF(#cpZؗ]fi)Y#cɖ99iMcEuvш_\; LNB$ǻwO-pX^$d3DFZYB!RYR67.:um \Au٤Ŭ<>U}ltxGЕlQ^coDbV%#+n[sY%є$ַ~Ee4|>?!eja5Y~X2{u٪`Z?RzO忓?J\b7wa*tZ)YJe{X<;[,“k}BZWԯц?F|/rqV[t\t4n@/a%MGO5WTw;:hp0yw6ؖKq*/674wm7&oL߆+^hQ ҧ5O/6Xda/̱~^aݿF*ܶؤl^x3[331n4fQRT4U rЯ>_f}E[l"9$CMx=^"]r9'+s?)n r5<&F<} Zz~{ߺ^&ܞќ__">Ix:`ԝ 9=2xjZV:7l>U(d~+LUuHj=ϗ`2oU3$pD&ZT-lm8uORSXlNצhY 6 VHkeCpSd:h/\6ۜ L~%}J@zWg*YeN:7R_\\MSwv/b_G-/]G ?lt6r5#~(}9>ݔ:d7VG'N[zs|tB̓3d$={-˰s73\Aqpʶ<9e.10$1:4$_}C=m!p"Y#bjH@9$ǩ{^닺F:(,TfnVcEIlƃ'п>NU벦8zYZUa1+ Jyx((_ykݯs!qVce c]-4Q:KnҺOb>ۭahAz:B\A>loE@,$!Aé($UqHa~zu{{^׺u{{^8?#6{- ?=r{=Ǻ6>ν{{^]s;wa߸{Gxbq HZzIǪi:J4qʄ:';r*"3~sH,H tw˜ûrk{GQ?:pOZx|-gwCMv<gO9*?*e?PdG^~-n`nĵ=Ic"t #/q6sRe) խ'8_FEhCԁ׽uUk+ON[7yL(Ӛ}UϿ]ҶǾ=n{.ʈBIVcEI`4\'@/_ sؽO{czYu-NmC:t:M'jmr2cC|+qxZ hka^iSTqྲྀ^PmQRYc [Ⱦquh{,uEtҠ\|_&~Swv/beA? [{}淯FV-O{lF7mfAmNB*)b:Mqtcpڞ {9 pKB3*, duo6^^PcRnق ƕ'ϊ ;UEv˦}Y1T5ʢI~ekR @ 7QQQ:+ƾ}ykY퐶ofE uiAFF^@G~N%xfuGg !^IX? 0.1Xj%N}9\[XzVd {_9w!Ehuf Q Ḹ`>^/)^}95m-QW]^Fˢ)SrG;){Ks| f?5K6fx*k[%)|=ߟ.;wV*-]}ڹ==dC 1) K~~m{#'06ymhv剟 P)xxfJ~~vܭJxuS)J5BI;ge ^=o6K0O'P90'j?=$MOKMg0Vb#n*|:TVqiGzo;Owrm`mN"u.lvg)daE#ZS͞ŧ4lW֖jVv9t*+:KPqJ{r/oVWW2y%h<-xյ AJעM ~MԽM/dgոٿm!?tKAoq'^ոٿm겻:cT u6&R&[7pe]8U5$,rN{ɓ{{Wܛsu#y`.b.L6RꃽẔs,YsM_!#O[*3h,TH? -hqgGN]e]7y[C7a//\l׺ߝ} 16o(({o㪲ٜI1Qc}"m(PH7dݹlwSܪHHࡢh an{[Cj$\1T$M:5=1;zQ;z`:~Q1! KQOv]aS?pwKz!Ѩ|_p)Qy~(/&l5(KxMoQ@53& XmͶr2 &# P~{Ƚ}{\+ȕ(.27'}*y<a$1̷o[;9-&d#GeoSo?@}5tw;s{b+O0H 0?16{t!`nm5#PD|D߸?7d*Ivv $ɴw:-jE67qI>6f (ϸ/1XA%{ZmpM)ac\mo*ʪ?7 wۛ+7lۃamC%NȾH&1=HfKIL,J=?_h-g==z> γ;qUy1+]M$rbjjBH"u(b=AyΛ\1\,lJ Rª9hh*op'ߔ(UT $VEAqC{{^]ꮂ=z?kj 0bq3cc+SL2e KȾsB'mZhi<]z*YwxoJW=yy7<͛V&_$Kzu֤TW{_;\,LQ΂_43֞#fk2ob*)+2G&@Ę"TԨo g=-Ϝlms;*\ Zj$TiP4܍ηRr'*j QiZ+J?qCN{{^L^dKs;1&g-Cl|MKT1UTO!V$.bU${sΞ˷r]$(Zb`NH@kǕ.+kFQK *M(1SR*7 ;{v럹/~鞟/'~}%=(Ab-ʢܳdOǿ$?_~} OEiD]$P9eapl$s71*1GR!ax< ȑyQE@&\SVcEOV|:/pJj,>ѥ-_uۧdI]I,k4u8O YDexe AgdtwÆ=.e% |ZkƱ`W724J'H줻m  `H"I, A`#WǶgQ'bQMM.[iңwJ!D{_V0ycBEC1pn#2os4D_NSO= +, wzemZʦ ͂3pf]O Zmz}<ʯϠv%>>1SyjH"Q1w$OZ"?>}vg4Do-On##\: ~SuE=^cmӷ)Q撣M >˪Tk=ko {TkqkgU''N{a2%$5Pv'rLָjj:' +hQI[IP$R"Sċk99#%YXU#ȂzȔt5&+) !C)z펭׽u~JqTlR ^'ESdDXu焎$f?]w <#KUTY@$2zjy൷{(Rqgv!UGbκ_KZL۽!ȴەeܻ]baON@]e<4#fOqt9Hv+w隲PІ WRM4)#9Y.J{ KNTyx8]s}\#;׵ot֨S!>ް(U?+uGKp?mm_ߛu L?Oo:]0IQ9ym]gUicOO_WwEWenmjP[~cG?ꇰ&;ZkC7FHbROB8''oTۧE{{DP+MhR%.dp%apfF>z{˱) pT?Or@@3;dcUTcJ}d٦j N>ާbQ(6 KZV&ig2cv`s[[re6sx WȤs ?UbXr}PͰ]OcA?1 K~~}>c-._n̟Peth1/6|KC:ȯ`=}v}<>[W]4_.W{'{=O_;w_F_j?e:k7w퓯_j?CPfwۧ74{O,(q5%5Y fʶ }?n%,owp]=\UQ d3 tܭ=naޓα#ن%QZӢF׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^֧3s?O)GOtvoT~yi{.{^׺43Tiy*JSSCj%U@-Ty.#RH~@ zںF|I rI'O[ )]]>: .e/S 2;y-v?_n dHXֵ`_<[[dQبIN>or]>YG"'%DI r܏Пxܒ$>U[Mcv&~jWe hZl{Cz펺xyxeaqpeLVT0+-,)%UeK!9$n Kwv;NVLArX +;Ef"߷ݧ6[a&ZZ!G9 ;  l?٦vRw]e5򮪌ҎScQb*,$i"ۏc~|ВA]2%./Yj+5j|w޾cOrhݚiB[A,fJTB{ߺ^׽u~0n-nmTrZ :d`VREՀe! w`&ٷx.DJ׍MF*0 z_˸E 9cb<ՅA j j>IC1]kc+gTVI%efRlIH2KK,qE~>{Mrg0y Hդл䎠xOx=K]Jo;x_ j\)-2/jHU*ʨ::HK3P.IRrO[z%wG ԥrA}1;T4Ã{GFjh:iiٵշ҅npIn"-u >緸NRpCR[Efx(\kP%{礤i)iSS#4PP0A )mlqTEUUEUEYib3YI$䓒rzޛ׺u{~[){kw@`0QL,DsƲ QO:ਅX`G\sv.֑^(J0GS 5XѾǿo\ErԖP1V #*$u?OyY &OrFs!UVV:1[)Z<Qz}C;(6R9j@~W]j]w\pF|Q13FPoqb:|KQ{cGt*+,]*doVki?o{߸>5}7Zfi}}{ߺZ"/8'j=o\>hV׭Ͼ).mӿ19T6hPuOt-/.^rW@N{{^׺uWn~{҆n:&17^mMe >Z#P>Nop}CmʰW\d8HodDsN2kIE"[ՇɠEZrq%Ɖܒt'{v.x__bϭQòf}{Sջ+~#MuO·Ϭ:^gNl_y[}n_ҭ:"RhrU8e nS)xYY<|KAQSi8K3$UeewaaM4̩h݈UUUTĀ$h-{XY݂"ƁUTHO["X[ݣ},pd*i7duӬ)Y zzy8Vh֮N}'$ZA͞HK{#JaxwCeKΟz4M7,rgRKwCnH4"l@c zu{{^׺ {zͫؽ۟ 8覝<9{o5 (jӍ3SǏ oCܝqK JI O >( G E|{o|v-5kў Cܴ`_o]|RUUTݓ6ߍNK3Ai"/Mj,5p<*  %Kz8: V$Ċ{;Fs Vըr;b9 $;1u~{ߺ^׽u~{ߺ^?Cuǭ pQ ~ykxa>=ѱ0tZ~W|_}WOUxVcwN>Qɍ35Dԋ%m$R&1K'HgjIyhD][GpHeWPu r̠YB>;rSxms$.~$Ft3T IۛlwQn TYk'%@*)*bՀe7VA6}en-.Yb>GR+B1XSU`#>&>ѻB\;G,n(h~82 ̺AMWm|Z͛\xzZog}3OX+cr %Ԛ&T3 G%ɰ݅T7 Pa*̠5̠0J:J{{Ui@[)j5xXҍT$$jnm7xjvZL1$d8+-uJۏkֳIsv fs>I5~S-Nm 8i&yYc4v[vM<)wwv 31 1 L\[yy" *$Qfwc@I4uo呵: ^e%ڕoٝg)Jt&S3\_Mw.vsWݴodpTS)=擺( m?9}n,ܵrIeqX/ICn߆!Gs1Oy'u~{ߺ^׽uO?9?F,k|x㶗jC<šZ|f@e4tJ|^jAsLz)*!L}v^tmmyPd Ŵ.G.}\4<w;f8 G-5CY"\J¬c2t5.fc2T-~;#ERHgThE K+[ fI#u(J A)D RXUtt`20$2U 7;%? ?{s慿\~*=_n.3m?cu]&ٻf9+1Ի >&bIHupG9`[rihcܭn-ZD-O :J*q.rcn!TjvE+,TLКu˯͑bapGgax,U"="IR3ꚦBdgydfٍk6nP-9gvQq 1;Hļ3;InϽ\3Owy#I+xUEQQyGUO1_v'벞NZY[=YGD/+tS?_}#g?%gV_ywj-/N^{{^׺u[yb:cosd|0`q.V#-H,@쓙w>We+m\N%!`?B2@]gahO Tpn<;ynpo kugrKKy9s9'%?p.O{`/7KɥW$]ڄ[$~i>޺`8#ċ _?>6r/齏2ӯ?VՇt@q{^ؽ =y'z&>.[wn쏎5$QSR1ulcbJXRCeyS$`=^[-˛vpw-B>I 1RN g*E=s.ܯpFߵǢ%WZ*joC{^׺ugK[-=v ]WZfzZSP6r1q⨌ =;d1[Ų3Y\a| N3xC#̞YI1fje[jxѩ!8VK'aYLsSarY .o]վ;)A>׸F[HȌ4:1VV*Amsm{mXfD7SUxC =m7;żֹ֚5o-Tz+%qbBO/I/׸#.UDS V|1Gҹ&ُ u&U}ΟsM6ʋ+r`e>e}gXc=0?qF Ki$b6Se-^RPY޳&J4^K̟[Xޓ-bMW;r0Il=N3oG&N-4\'T?oZ#GUtaeaX=𭔫lYH*J#^ֺ II'h:W2zdh.ڪbT= t6E  %k On|Hb4oI- C[s? zX}yݭTYGCn*nE⨙,GPu(kv #sx(9ҭ^17A_yA{?mG][Fo-57l?ߓCUˏR<9t[\?y⑖o&?O=f9P%$C:So r\b\׭u~lzg3*Ss28vtvzjQ=YV)`,=rg4Z/@L0TO6kf4!XSpYl~ d~Gj:y)I_v?F|U\:MY&LJgB CZl?N?9g7Mu|CoĹV!YCqk&vGnMvd\ nC#I1"=$=j5e3<6xs5m*J̞[)_2qXK,?$H۶;׶DWR,qƊYI*3@$:ێ**K#1Uzٻ}Gqc[eHr+OjuH64ŮJD!4}9wKH9M`x,,Ku9iB0 oKM75}o;IMCh)Dk-4MIL8 R5<68ny6/Q|E> XG@ $)BчI}yIJfv[FjIl)FNȑjUU~qa`6u"4kQI]AT:^::y qc9C~Ncne-}) ]IWFWRUr0lղ/.,\n1C+/UoG_Z )ԭ% %U5*(grX]ewضhZ{(Zjwv *@b$ p,v}t`FR42h&Hm*ln;%(F Wc-HG7Ug`f!|4>"^o'ZHZJ,&(!ooiniߡj 58昒f8Gdu:ν{{^׺uo7wl;bXe]BvuiꚎ(Yif yяr/{A~%Y)чg/zmߝ6KhN Avmo[cr\ӼJ4HW{׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^ָ3Oncw\C't2nEGWQQd"2 RFڣ.,}E_Mwg"[La[Eԫj" n9Wڻxm.'YK(yٔ1)P^W 3wmǯ}zgS7;M ;{v럿3E[:{;M.7n|L!=F[{:0f0]ћ+_/M 2 TՒZ5?.~ZImxoA؁>)7_ݷ[.Qn;Nz 0dwᬆ9#<}/,m5CDO.Y*~c/s.!f C#\B#qIh!Xo{+y.Ѣp#a.+1E%L2)`"E}uCoz.鞭h~-W H`4$Brǔٹ%60E> !&oO1ZOwzš.묘 Fڪ"&F9m9f;*'Rd_sNO IoU?ϥvY5.No 4mÎ9@^xl 1QH9|!ݾ2C)X޾<_6mYɫaUG[{/J1{jd!rx̩w%&Ӝ{~G~"B $; fPK{:tKGW>KKMj{/nNɮz,_!ܥ?pUе&9G-9{'Ne_Dԫ#ك3,gLHc ovv{b],Mh%ѩP5`ʬ0?p}x ]n Cլ+]ٵɾk_=L>6|~rXjh2ZQ5`PܻK~z96͙D*SR)r[YRV)ůro-'r{:,QW`+Sԣhau>{>M<nxݹ5|rɅ%F_vg@ qI-dhz%.?vy%];V"\KLV8P+d`+ECH۝=Ļk^S{$iV54JWJUw\RVQvܻsg<T u5~ A + {;ON,\4!njcn΂Meb.mO)D9l=^}Yf&gZ3~ yk:A̻M'o[>Q{&]ua^Kgo%r nK{{kS^ޘ=$h ~Z*PjV:RE* @'2CO߹>+Vƨԍ@tKÕAB g.dѶniEt0Tn I! pzz޻7l&{yb)sWvaYEbjQ"̎C]]TbڹeqiyE,mZ28*Ê2go/+Auk"] A#ɔ0%XHKϐ=5݁g} 6Z93W#6u]uP T$%@;{n\zK IOSŁx$/#2!*zw s?ru6ـW2 5Nz%VNZ2:;FWo }C_{tM=ֿٺ_c^ֈ/-7.mO1յs_Kw3N?Mq/yKKKܕ{^׺u{ tݴDT3uF5x]zcVxMUU%'[UFKd԰9)v.Jn $0At(vEhM{WX#׽tU~A=UdWI6+=S43͈!(Q#Gs~}L<~ Kiܰ" AQxt1#G=r[,jpG$l,+#*;=l>=<9d"*ý۬+A*x7-C9]giDP~BB>}d5ܿyxCn{RS+(>$|~] ]o?nZ|clϹ"5%5TjQGR.I__~k[;(0'v@;y T9_t~`k^4|0Zf(x$ʽZ޻G+x]Ʌ[7N*YbbGUR.`RXU;.Q^ZN*4"MH*hwwٷn_e7i-.4xBU4# `AJf #7SPPLsfT@VIQD$Q"kɊWR+6os.wJUsuF$D/y 7_oӚu?zV4-aȕ^IܪFkg6#uQ;?euQ3^܇dL?գ~w2u^=g˿X>}IлuOrJSS? >欿musz_k1}tR_0~R|g/h*F\>7^'t1Ѭ.RH{i#:: GYdwMx}إ :_pe'% r*\j. '@)]ggW]?d#`'?%cqw]ոz{P^cyo]כs% ͒,&'FtFV&b(,B f ~ygly!\:ƋS@51*3 tg۷0n1;w3$Q#;A4,x('9_>Pս*vK"uc UE]qR9R=\~i4,wj '3❩#tݠoxhAD -PZصڻ %430(3/m=a" Sp]ϠAtS 5 wOly}iyk),nUe:dxH_&-DB`&mɷ6 >,UXyv$UՏ}%hݬ Wc]<KA A #ؔEGD\0zIr:û6 Zt3ꤥG*c^7@Xa{pi[n2 ,I 0W`JJTz2ٷ}#>i4ZiƄ>ҟXɿv?>V9?_j=q['hnvlY~JmRۣrV"L|?t*}vg'6+..7i" wHPz#Q&)R2/[ߺo;-23 * ()i'˭dӮt`~&T|l_{2>ӯ?VՇt@q{^ EDOUU<4QSSQ"C<iBfbm0D@Y@$'uxy]bK3$8[־+u~F{M,: *ݳ\NUyfj('^?dQ<إ|f6,'z *4 xHG -šҵ L׺i'h[č~#~Y0}J -1VNb?ѝOc|Za2+݁mIQ[Kt .z&Ixɦ4ЩjraX)1"_yndBΟRVM 20R#mn oll|ݘM͹b",@QU3X/gxݬL;ͼWf̢Y;ZgejLZԚ 4?%Xg_vc~lwBK/=EdO!~dAKKaWriߣsRekG⹯ rgVU PUcQ3z,'}Kau%GDY#Y$::8GzeWR*9#*C)ZZ|?ݭiS0;!6's ;L$u G#ȼ |{m[) [5 ?dA# x׈ vOo^{jmSOYW"Sq7Cޅz*5Fݸfbje5֤՗$֟OY*܁(~JOqvN^"_!Z-xI%CO.Hϛ%l`w 3R;t?xvz*zJ:HDD*F8J ;x-PGJ*<\7 ^I15,jI>dI>JMu~i/'ɎZQINyvDGJqJRjJ$8Lß}὿[ovn^?gQ>p%D*7/{k}wpM+#58YE'ԙҫbe}mo߻1 A)f ]1EL31c>|˗,m{JT4*.jĀ }ެod dJą9y;g:fm=.ٛs Ixxtx!+(k]}ra .mjV'D((,xRrzw-i&]*MJguwty1K=bF![|ouj<:R";;XfhŜܛ \ycɿ6RQ(ĂG. ~ jq[WV͕;TaJb]OU%ʬ C_ZDf,$~4n Ы;ǹd#K&‹ygxosGzν{3;4,w^Ǐ@&yPd{{íĚWJCOZ~9W]ṛU8 uyῲ4xNnޗVʰGP6JM! Un| X=u  I2 \O4R[mD$\yT~l6{K WHP? rCj45YJ*<2#c5WQU*)+(G,RȌU ymsoyoݤ,R:0dt`YYI *Au=mrWFYYMYM AWkk){;dﭫk-VxCrjL9:w|1w;0 ֠[aGG~sfi쉪Rje qkł?SL{/-sX]O_8XCz@Xgw9!EЃ|0z'W:{;/L1.a6XTHMk،r-{<ަpTpC"T)`k{nj Qm'u䚞pZ*H/uήM44QQ,TI4" 0ĥY\UU`9>$K+UH*I'Nȏ#RI O1ww뽩Z emtvu]L2yRW)I"?뉤K{.^eyn}J$ ,<@$W6栐tf/%}9up]vhH)/Q?)+TG߾m_臧>>z>k/'Ũٶ4ꧦ~ziNߑtSqoJZ|~}nt;%[InlyJE>ؙ:݀5z[){=\TϿ-_%;+P$M L'L?8?mr~ nc6Gʯ,ez߳?}o=)s8Z4+>/Qﯿ^MAA2ѺpK@tQd1Ք #eE5LD`AWV A .$YbWF ! 2$&ki9)AR]1fN"=ǂ(o/ N)| Mz/mB[;>pJJZTVExkܷ-_M^nkZj +CJ)m~e^MAA̿nw;b~߷߿p7k/*ՎeuMo;-#v0 C$#*0x"x,-U"C|Fjps/5g׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^׽u~{ߺ^׽u~7es,F ef:sH$y%*${eۖ*Aon$HR8K;UPYZZ\EceK4Ω ,B*3$u?w'a}['Mj*xMX4>Rj\i$P9&//݃W[EjjX һ<T2xu`5eȖ7qv„aEXb*>NeVXS p} F:$Sek0 mc!Z\.+Yf`,MSȐU uV 20ٝA֖sʱQ H`5@ #x&%7dVx%hH%H_?@vpTuJf꠩eXs{K)E]y?N~ܱ/-wQIʰIWq!r4|ȼciѥf28g? l;")luK$j܇f]ݲɽ@7u"?L >µz_gvk<|0ojt]M\63xnM<a_rN߼ wՄ'><wzxoV=Xzn~C6ܫ۔[&mEOU=|j;įQqd윬}o=/wY7 {-CRME$c_#^igŴg;Jz0!fՕ{ˠ)ΥuS׻ҞdWn9${ I?$o0H*cv|.NFvS V}d#i&g{&}"μɪ_7#4G]u\26#Ο14O;Zs$sMwzxe8C?ay&o9}SD' V#1T\vormV|f x?J*zjT5z*2O>(W%nRm5RȐ7}}4=xE1K[^LQYb>}}ܰkiUe6pJpH.PdGR]1l( K]̠V8B֣ő ͬDn{yܙ-ݼOf3Y1_M=$ hhRQӢC`$h=𳚹y|K˖,HjIUQEDETj;ųign4 ~'s仱,ēOs^{m+ghVymF 6+7f/yV6w(M>[7}o}ybUܱ^߈},crA" '\//oQ} m5;dHXU4:Yn??VѥIl0 6wbot{_r1r^="KR 'iNb.7iJͻ0 ;Hv#jK*$od4?;mRPTZۃrO /OQ?@.lڣj Y©_B%p擯.}=2Oe.*;əC&G|"ۛu홪ܛs-㸫V$Kp檣tA<6 Q€=>~ۯ0O}rWVPFg4'NfյklְۥJi`$"POOV-i?o{o><7Zfi}}{ߺZ$gܟr/O~omIF/-h;1T4XWrv/qޔu+MGCACKZC 1QTP@b_s=ı}Qc4TD@HTNMn{e;;34d1$I$kՒ*җ{7^~8ϾwNŚ+1 U0GѩnlEϼ9s~ݯ/aw s4hQ\cs,m>5ӶZZCm O]q Ehh+7u~Z^eUdU{S}UZU@]ߺ^r0n@A;s[:,\'d* G+?w?M_[s[:ɷj 7.ݹ7Ǹ7^jH)dlO?J>K-,о7o?xos^N@_yW[j+@0:osfq;o \{!'2_N]l Ou*EUk& ~}tJls:aGs:ǯ]Q[#6K b|.ƑBj>< 4AQC* j sS-㧯}upE'>w[Sl}\H;mnX+bVU!ѿ/ǚfdsun2O=~) ]FS_yYlz˘_?̆/D]mmk+,?.Ͽ_wit.tꦿ9/[Ahwe_+n?Zu?]d;{zrOY[~5glmNS1җ6M`x}SvJҡaP,*yjL?O]a.X9K yg"?&6w-pCnvܠXpE>?Lv6ntE hsc]1 Q cEU@g\Yw pu$2\#v?6bIzza>#twV'vObbe]͎liǡTCA(u Dv0,\S7]2L- d&4쬢E%I$T/\KμmG .K@~(`RFVԂD:** (%Yݵ;K1$rI'|wyH '_`뗺"Mdt7Fd)b`MC#AR$.$a<uGm˘.q[I&o %{8jg;H{ =ܭnI۾L䴗V F$dI$j4,LIDҷ6>~Yr67BrvG@ muB#)3Ă2҂5}X{wm\ڻej([svo;Vb3T/S͵#ÐyeϷu$ QʅWȕcB2Fz0wKݓtv1ZJDÊS0oZDVWcoޱJj2}7Ъ(Ƚ%MUWN"O狞ybrK˷` d֠#ԞA[sO/Xs-S@̟j1d?5=[P ܟ.sз%}^?zuDe%3]rl,迥U?mᔌ~Kw]7x&JI@ Q9~-=yܛYӲHF 猔f4qJ @/|6{kq4wonU"i^QixA aq6_cu4^4x' }"h-DYb͊Б>G:U y(o]x:Ϭw?[xPT?a~=@G\-r37ڎY/9IIQaӸ4E+N #3Mj=GM}:?I @7GD_Co7o~CKKNIa"r<)#'=UOIY:0??>6r/o[m@u+o?_^׽uwJejz{ a0NLyy F$uiuO}]Ϛ]sWB?#y5GkNu_+5aU;GX%Dq鬌\ߎO^Y퉸Ւ>wN߮6_TfdžGdʇFdk˖=gui4r8eb<` 8mɺ 7U< r)V 6.ߛ#gobo=^=54n,D9zU5Z9^[{&ߙyvØ"-AZ'eQ\W 3ͪmz.MdX˺)6ǖTu_TP&CNuETvO<-kqUryZF*ިa#2oY-vD)c8k1vLvY|^d!bUq5hc7a{>y!T9G#qX_f啦g6۸ 7T<9TUv Guu']Ƹ1s'`2yX(zIo su>^4 [)Pj#M>fCZО|wɼ׸r|K䊧O>RFVEb=P颒Ge/sQϹv5\Wjg2@#6>-ܫ4[ ?ltԇs1%~u9ƫ z_[ ʏxy,{_Y&N/{;2e:pg﫦%Lu=+$F~[EU-PYےS4y*B~it~]aw~f9no.9 GVaS>?u{6s3oJmd&-2+/&_iUTYbȥU0$;>ߋݓj":hV1>mُ)*5!n#E׺>ϹH%xJǨ'$b+3HVݴ)CiFn"H&vf=nֻ ս}mDv6mlXO-.Nfg䴌I$TPVm[ $ ܂x$I\Ǿ>{[I;G-Wt(Kobzoqftw\d˵k;Jm}E% U"IzDRSVWx\#źr_-A\#Gnq"T-A]]U1ՔU5]-DM$#G.mdA$S+# #H#tbFсVR >D>i]m7NwgTVM3s4VZ5imֽ|tR=JMDXM3SSƮDRpc%=u^K4Q9h RBGYC$f? qSiiW̠/3KF %-@[ow[sn<ºL*|2 a5ֳԳտ::W]羃"{/eqw>J ;e͗EO%I295,e?ͻs_*|$ܭ.-L4b@% 7aL70\\* iMWꡦ6,=9 W@;^H21P Er*eg*mvú[)%fuXrkZ+7]D导 Ir #s-yj>*!Yeܭ/\-$v?ˤ"UR#}Qe_ueFR :=1Ȣ=[k-*lv`5v颣b`/OLgYx.fNkd7 m72HYewOG Iü_Zn{77 ^I#WxY$p @pu  X*=I,u1=IzcOG4wD%pGQՙ P~X+cqOD_o jM~_ޏB$>6,h1Q*(ª=ؒO\OZ뎞cSFܱg ;jj/qO2] rCik^NrJw!PhhwTy |Y*Dt1Kw ξ9)|7o~7:}ꮿ߯<GM lI9={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^׽u~{ߺ^׽tW;wc;;w:#f-Ӿ*n;I-1sY^["~ڿm& 2t[4SdPiQ(zy/qyTö5+s00|iWxN j:׏g O1l| O\U;m5JŽ$MCW2Tg`gJZ$ KTrO2{˻*6ٱܕ5Gq@B _G1Tw_{q%HaF[dl iޒĬ&u]e))++kj`Q -%:+f ($7 ih,0UU3$ITH⍦"B3P2I iտiQt9YԛfCSE[ٙ IH?լBż?uvIBsV[s*)od,{0zur=Y :j\i"~fj#TT}Ocq.pM-{qvW [}Hk?cE>=?! a+ۅW*5?$ғzuQ~7׺u{{^׺uGb(qo}-<7?ᏬjӢo0uHù?_%_mzjSҾGb(qo}-<7?ᏬjӢo0u:Yd:O5d]͇'tuN׺uVCEkߥ#zWsVЭy5?:'>q{:m%Ym9ҶOJ`0~9cf&Uni-5oův=.[T%SU2m>aCBl/vHB?>%ގ׽u)=Dv4򶥢beZ7#~q̾n#oY?!A/-q 'w %w)2~#/DO1u9u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u?{^zoENW=aٿsQgU?wok}7Sӆ?潯]dwSՆU|P}(Z)ꬣIIOSygL<378KqrIسj''ZHETT׽}{ߺ^z 7vW񏷭n*_о?X/\2Q=k5쩶' t{OJ{Mz'-&K.c u{ߺ^сeQYWMV//+ozN[yVν{;}g|އy g}_]v/;(o{^PGǽ=xqrτC!e͇Gy ӎÎ V}VN~bdE)Hϣv{J%Mp@ǏL+sXaveI߿Sc92QW]O&iJ%jrß: **渀HjҢ6u5 W ~m|Ĉ,m)<τTSi P$ 9ЬK Fy 2Ax'6 Ξ|:P2PB3_N7dWQ=YzFco'=BhS=r{EFc!sr{d-d<dQ[ ~Ri3m==E=-GٟK\;_-"o I< ^:c0%|BāzY{K⏧opio^!" T ӽ߰wh?Qhkc60I4XȚy#1'(ۣ?+Lq8eLĈ ʽ&J J~r\}rdk}nogJIm#Gpaiklj~twDjO :IzlYji1eM]ZLrdqӵ&Fukhep~O+,.X+ 0`hU`pA8I i= #+# G ovϊ4k;=m$UnxڢRto~|[o~9ٍNnZN Ŗd? &*O\t)e 8~opҐÊi$aw^2ş"4:ebW; M9HS(0V>U}7[ [[fyMeN7yr}NhZd73O词(̗ / MّL^f?g!o|ekJ!bkz͂W 3,j۟rt ܧ7DV;-rhrZ ZH(vTF=S=:rTf[͕pU-ʨe V' u{{^׺ wEYF>0msn-7qGG ?{^{̄^t֐HT;FX m<{ 7k@8nf}U#E:'=o|NuFMl2=urxە :r8U?َ~sOeWk{ v&KI~>$1\"^>^l{bpX)U vюl-"IPf QӠiqI+2l͖*y}9חs7`e.Efhҵ,D#,p14&9ma62ԓAB/"^_!9 >cq|N3-R%T agTV/Ms煊'cc[z_?C;y=Ng?[kV<{OcauW[;Y4?k.mg/ܳ~dIcꄽ׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^ֻ>SfjFb㰑mM-!+s< @s{ۇ-r֖0HK#K6XҴ?a}˜=j[dWrLʃLS" ( +M?pտc]o$^MrOax8?~ M%MÑ`4r>CoqYqظZ< GWK^a g?8Cх6~ܜ|oq a ~J]ݝ 6% ,JR؎G|_ܾe߷r$Yo# GC-`q.ɲڸr/wc8bic(]M?}䟷afo׬ֺ#H՝jf'j*,B'?S ~v*8W9W6ZMA%,fdT?G_~w=oq.}n/T*UnCY y{9w9fbEБhŘq"A#/ڿK÷?y'u~:êq)}6 qpFF=kCFXw!VbxadNQ5vr5tD^DjC Oa^eA ˦QHQbϢ+'ýrʩMAalJewi>^-p^,zUR?ԛ7Pwn`#!oj[Oˣ snϗ]6>c흈YM[n|8TtN_R@ X*}>{<{\Qm5er41$R%$ cH`ifzܥ*Hy5 HZ&=Z?:Aw?Q3οuVXn?uR"oOo/}uFrJ(=LHR}u{?m|!`vbmcA2[{(]{ߺZ7 N+9Y}oi2:+~=۷i,W/X[ʧ,$}quoUw^5|V(@~>d^׽u~{ߺ^׽uf;FWo }cWuvn׽uF{>.n,F]m4bkWf;FWo }cWuvn׽u_ #{s$Lzl?G?㣬t^׽u'/Xv_,Ͼ6?׿s*ooՄ{ɮ>9'\/ m/:o{`̿j%VèX&# T[}v6}^-qW zDZ7rpKcM z({{^׺u{{^׺u{{^׺u~o~Ï[;k} }?7{ca,?G߭|pۇ׵{ju{^pGk`{Scj&;smj6T&[l]C/f(oRL<[\o͛xKK 5i[KhR@ȣO\4`*"9iR-G2TTPv.יO[uP-]#ȫ ~>70dpEgVβSUBXeǼ\{iͼ/ivBUEEUJ?6:l}?:wG-t/{(#!}-<x̍TOM$Q!a%~u{˜ @Y2`?-.m捧!<$1HҴ CEGl_WIG6cil-rcW%h^uW09+kn=+hM6 \XZPH`Hܡ $JTӹ[o<͸a=Wu BF5PZ'苪rJSS? >欿musz_W}q˖]EF\nlJEm.{?uPs]5yC}mژNn6ai[@\׺s&;YgBXi2CQ+)'K ʿ,yl[Inw>cꥣ}(Gn.۽>Y~D[Ƭ?ڰ*~` {:~{ߺC|UFk,e*K7wSelBQ7OO,ܩuۇSulnzߘRo&v _ 騟#">*Ϳ/USұFjaF5d;*wMH}? ~'yOCP ܟ/B?@ow]ոz{P@ʖh5=/Mv}J.K"UבG=Y%68ZLx017?p,>i}ay5IY:u{o!?گՓo[APT}'Z_eq?=MzkSlO@_~.ȟ=O;ZMh]TǼ+zu{3ʣg'.ޮܭ_>^Vi[1Ҷ?[덝{ߺZw||&j>79_vtQ=R^׏xqqG?mo߯9^Zz9{ftl}=EQ_e_s>TM?o̟,]Pco]MuvMW'|{&\S'Ads9Zh1xJGAANUs8ѝk]]P$TDR*Ot1ڡYYQqfbT| =w'ȜɜkM曵=OPffژM}5.=1SpM {n~$y0BRzțf>JTSQ2=w nٛO~mt6&3=)Dd {7Upy3l6\ǶEqUSC3ҧEkMUA,{/VUoNYV_('UA[R5}:Xx=trdXs$|u.ػ ({cXny@oyz'ZTZKQ=lC 541SAi0CUU@UU,=z85Uu7w̒ĒI$NI'/^/eW*Z Q:.68JʪJlf@}qOĿ׏xl_Ut&,n _R aƑՏw&T=t@}h TM+13T>7E[fi)?Sdt!p"`:1$[v?%u{{^׺u{{^׺ֻӢ|!,R}ee5{cs6w6KuxGxѯ̌}<q$}m?A:,e?B+!u5GWGe:_fvGOv*7n5C& &*h*c0}Iv +~R]d,q_^x` 9T\5W [oR'̄.tA#ၘԘj{%Mus?ta?]w0Ē/KW[~s]#~T{)s&ݗP xR)x ,FtʈX7̼r9lp߶،swKW‚^TnhD EwOyo# -b-(Hh\,l •&_(ڻ#!Ԓ*02Ԥ_|de*[`r 'cÏ^z_?C;y=Ng?[kV<{OcauW[;Y4?k.mg/ܳ~dIcꄽ׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^֧3s?O)GOtvoT~yi{.{^׺u{{^Lz.3y ֧w1Jj )Ϲs~Qw6.ZA$#L*C f2=_k}1^o\j&&VY<:^/3O;禳}ҹۻnRncfUhE]Q/S=s#"hE=}["IIJ݀I :V@Q$eS&c}=9HhI!&x—b,@Ī.׏5\f|9!Y:ny+Yb-!xݷ7[$Gv'v%Y';+KM6HE5T@:췥{ߺWن5F q_@?wJ8b7|xڴl}si̱o0<*nLݮ2m9]2D(wn$f`97 %N>ߦ>sDJxAι>)D:u{w7 ƍ$;)Q ,ąUPI$ >o+TW8ԓNe(3} }U^3v m*6?'1U0k": *;y l#gHJ[踕Kc%t1iVjWwi Kw7eW6uξ FP+BUkN_يv)>#?e!`H+.;)S/Smt[Ge ?"RͶn/6RȒ'Yޡ.Gb(qo}-<7?ᏬjӢo0uHù?_%_mzjSҾGb(qo}-<7?ᏬjӢo0u:Yd:O5d]͇'tuN׺uVCEkߥ#zWsVЭy5?:'>q{:m%Ym9ҶOJ^ލ`l"oqe#>E+-̠惉&IBP y׮s69^?:|=ѱ0uZͣvֿ{?8mkG}?Z=Xn^׽u~X/Wco:74Jb%MuJ*.SFF ꚕRPKIouro3l;rO)&MTQg5YdE.P oF6n"5 V,hUm}GYIcꩫ+*JJT0I#])<P%իHԆVVVV  ArheJ*hUATwu{rJSS? >欿musz_R?˧_!%>u,:xqgUS-=U]-SlW7h/޽vm0I?SE tl]E/'GK[޶iRR^ՖJzϭ}Au~kz!}OܸweXy\eKGp_iH>&>}^ [(Υi]]*sݿ0r#ruÏٙ9{I85*L5#XU7)u{kQ = s+>8GELdd8UEUMISx<߸ǶW{>-dYltј ,#I$zQjw~|orL|n7wGu-!p2\;{Ͽͪravȟі8VA'5o~,VQn&"KkSO!O.C(FOVw9h[>l?uVa}B럽_%>@o+~ӧTn_7COmln(AO?:^׽uM>݇Uz|c||o[? /O/ ?'tZ9*}kҞwI<c}KI˪=eo^׽t`~&T|l_{2>ӯ?VՇt@q{^N_Y"?Czo<5G];~n'}[׺=n7O"^+_\0l w? ?kpvnxoʟ/r%z~ƓG$R ]]tݑ8u Gԕ`Èp_oNBUByܻ6Z&2Z~L ?7[{ݷ?V4%ݪ}ѮT44&Fc}vE}]n p!Ov/&ZN|=)t[_!a[e{I Ov6斁~;wgW$s4\hT0A'5w5ٟo2\ Y?=*=tYu4n=W3wa*6>ĈXJP"55u32+Ϩ߽=R,19C=WFI!cZdA9GiV\D-~pNQ 8vQYFlIznŦnfrm9ىwPD>)d~\9v嫗sLb% M 1>qRӀt.S,pwZ !,(d$fWI-5Y@`pLw;mbbrC,Q>}i(+BZ>,7Tн3frmyU]+fM q~%QKX}^s^{sA q![53zZ&CmyB^{筳R.Q)V(zZVU2MU]S-mu\VW%Emu\yYYv&}]\KwrSwbY&f5$I''˪GP* (Pt)tN{t+v{,t7;j2Tl~C8S9fĒJa/[?%nw'1=n쬬V\GC`,A~ֺ׃u};m7n?gd/;pPcqm,X)&ْ٨%'ߣyy#hw PV5_ y=t {.wv;MIBXfuo_['>/slmd{ng3|׿slmd{ng3|׿slmdKܝ\~Ư/rXglMSҤCM5gE, VZo~2HQFTҺT3*4EjEYn k=fWhmԼAV!VBMwe` =UE_#C| cͳCeodw޿ ?U>߹oBx\ϗeLZx`dC>FI]Q-H$er,;(.ň&U$zUokkh-"HT*xTLTA!V\K*~I$$9eVsEO[wvdÍɃ]_jXكz= ƳQS451r#.xGEI ]uihAÔ'Zі22[~|Lv;D'Ŏ`C! xU c7ܹ8&*L妛#c)ZTϽG=jrB;rJGSQ/ujZXld|4g$Qnm۾8'JE)54 gjU7oAĈVYn<1B:7/D}hO^ }Nv[fg-sbcMv޸mHܱc3Ըb? K[as/.n{kR#p>@us a-żE{۠}XO?~PUUs۳QLH&!i(*_&h[+=_w9Ni=ST…@o Y T2{1Ɨli#h[$\B( {^H]ױ1[K{ aQPp p,r೿%EđAثiwm{:CZF_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?쩷 k_=u_|?v6?/zٗ]^֧3s?O)GOtvoT~yi{.{^׺u{{^.LAVWHUXXٛH5aߞ^i@Go rҥc;^UԚu }m&_}Ro!K弌%Rzs:^ֶwS|a2yޛcnbu?s)lRR I)jJ&XG߇ڮd˰ybYPXA%b5n\:-X.ZitM<qWkj?/|M Kmd[#wܓAI_q:/z1p*,:$ |w<\_P A ,j2H$tM.[a~+`vA$ g {OG;M>?u-t O TIBGHѵ9%)e& V{Z@(hIFnc?=}#bGȟyF `&"0JfIꍡO"wxLY5)aDŌ0F I\>lpGh +#@R5$yr"^Mٕ o | TN/H>ca=yTxy]NbŻP4tnܩӷx۩wP1[25Y}M#_[ }R vVZi8^(֯ǹ"O6wi!RF1%¸w <:'%y{C۲,s0p\G_6d+uuA1nC 25x̮/#M n?%jZ : ;G,R)VRUi,7Ivx'FHCtu`Ue Pŕwr4RJ:…YXAʏ){O7ݟ|JɦNe7Y K&;6Z+LQ֢舊cOz><ŶoXž srUV qI..) O iv -ܲlB#=(ГW"+7=ރ?ѝljFe0u!3A<o$O=m{^bpH-hiU-Ծd:k.}M=ʇo-_PdOɀ#{Ǭj$Q0H,[r~j[}oP7kF_*THx=Zm~%2OGoOz/{ =onMKjl dlDKM)rJv4S $578,{ukkyipfuHO8XMʼ[|P\!UIB54mpF#za87{C۷obw붢xfE<p}[_]p.`u0+xdftmo/}^y=DQ!O?{mߏ? vhiɊ[Q+n̽ =\T?ȣ }LD~~mGgceH$1<Ev`UbL,_?d:ݖϷr]^VuBUVfd12UNJi?o{>[xn@/:&_m/s{^D|;]oY:hVצe=+w-'"ysƯ:&_m/s{^CGs_}I"GX=ν{{^lOid?_Y}>l>U}?nl ߫]@}SsN_7Ӧ?k^usx+dNeWVGԫ)abETG]Qؿ?`ߌ[JuwCW-G3%˲Wb7멆\o}ovVHeTkݢ5T27C1=r#rr_WWV݋^@@ #V! s!GGV&zE/^lqm ۍTfh&A2GQKQ,̉,l9cc._~d[+,m*YHWG $n "oϽ/"Eve(֒7E( bI ]"Y)^MwGw..: !^5 t15< }}${k/sr #aSQ D?om'C'\qRz7yi%xš~RTDsE$GBx=/|pY766TӾEЄsE4^O04ݼ+H]~Ccdu}VP2=usQ)$llZ* IZe*0 5ê98Kޟ&t6xoٕ5)5/hU 2@{c=כZtXT\10U*5%-Q׽u~{ߺ^׽u?{^zoENW=aٿsQgU?wok}7Sӆ?潯]dwSՆU|P}{ߺ^׾uOU4~)]EtAN&)'=/}?wIdϓ]\uc%2K+ܴ;(8T~B)},u{rJSS? >欿musz_k,]YCw\yS`\ bj!ʚr^Q9&0ۜy"xv,5Gu&N12I&;%%>&Sn PNĵBmf( &=ג_v꒍EY-3񔁩:7?yo9!)F}@&mWxFW)!):CaMEO FCխĭ4}޺hWJ1;Һ֔DV1vPVo*R`644"+=Eg"}{ױ]As- ԋۃI3AkDt43z/oZH9fA҈j[To&rZ:`K]Cdmϭ`ۥ0Qi*fs=~[-['fyj$:؞u97-W EY夑G5flgG9yu߮93\XUQQa#EQFfz$?~Jb O*Tʫ[{)J_b,5!Sδ1t?}}؇lﭥѹ ֶ 8֏p$ hɐ1R7n~~bE#Č4M)A#=jHԱAf,ڝ$'yvbX֦%c%? ?{s慿\~*=_n.%_!.w:~hFhst4&KI&1zѾ>OY}Ӫ~{ߺQZZ<{vLxdQG[mr8 B+ `CUDC ^ßH\mQed6xdg_[G#U?tI:]CwmgP2\7mzES5jOHydJhU6F/O8KmZxĸcy&F֚n.R6--%Y`|4@DYc+!TCBtoyE^ةzG#ɤ'ǿVoYG6j?=-n r% p} WJk ޶i_ ;7=4qa>ojIc{֟Ա'_E) 1ʓDZeϘ-.]St΃I㠆[d#ۗcN/X@ANueM$K$ld8,m]UtԡQ2Q]25͂~{U̞s^ViouJn6u~i;G?c=MOը뷰yyDK}{ߺ^?Cuǭ pQ ~ykxa>=ѱ0uD|gm pS6xY2]uB^vu~\_q{vRN+_ޭ cޛ&R/5nSkA}oJE[MW-bFv\lILGf>TzzVg^׽uM8.It$9)1PBߔi^.o߿~{iVXvXstY3 ]$nA֓oږ>S ӪeoVKuʼNU> v«;:njۋeO45Xn[cnO>TߋcMڰ&&Ė|˙#j1_z>Q].n6yViߥpBL(#?˾{{^tZ.T7koXc?JZ3>32VYRaS>9´}z4܁Q5l p"Fsy6sa@'L,>a| <}z|:",Ԓ##2=X\*C#Z~յade=\$Zipr1)X&i+Ts{Ocr}Y m*wJM_MƤ QByp+E 9kMZ؁L Pe,FDf&?{ꍍ˱6 Zd\Ujz)&Tt$Py1\s-r3B'],82j#gL25ICʜӽ^o̼1٪"7RU< ZX#k+_[p5׾g|fkfG>w&Mɱc"JQf0VyH-}*J=EImVVh0tϷk;nj[yW')<s@2[Cxk;57 [in,monZ1K[LXX[6ˏlgZD5s,)mlEҺ'ZzW"}KvW쎞ڹ_vLU~PSfP1h!iɜys f"ʤiy) 75&[H[1QE4z[(|+G%l55׳5,{yIB!Y١biIW)3X W_w݃>_uo G x Rj= 0_zwu46{m?Knҳ`)GR^Iʫ;w7W3U*k3K`|z̜Hmh#V(lA l$!snٚ´~;)!"# R+⼘ gVD/2 |}#pSj DcY)`VGtxy}/z|m[0]AƠ O x]@U9ȱ/;_Ok>sk!")N Fcj|9T!dmpt|ZGݥaw4êw:OL_%1DRK*dU->}=; {0Nkq_^!Ku.K{]P .H‰9 ? \V5&,~J;'3+%&B8R"}׸ i *GR>9M6D'&CuOH? ݕb;)<8ݳn dsdDC4ǧڍ`ˡcZKw;piׅc_* ߵ@n[b\D@ґ>ka޺pu}?lfp{'eey*"98xi(( +$)}ӓryBklUM$l#,! UQ>r1rf[$spCq93HUt9c}o׺G}[8~L&N6ꪏ252DT{ky} Đn %ďF^G6[&reIBE[yиc=n?_ ?*(UziQbHqw[(BBxg =(ڹ7?cѭ0u\̣9~n:pT=͆c;rmjHa%-U+"OvA/1k]#AYU}k6!|hP&YUdb:$F.Bܽۅ)nQTDmpUAfAWG &-&[l>g{G)y<Ŵ)Zj7Uc$G>{/}Y^ri9T` *H#s"_[ =Hynr a#Ѓ|Cie]v- k̘6udXrJ x%І:|/2#_oMz/Ğ݇k{(,u,R6CLF'8D"qS/U=/__H%*!_MWKjA܁(uAfin`5A RջG=Zυ8Ȫ&iVJf!휺**DӋ|Z7Fooyd#,`zybՂJ~8H`decƎvߐ5Yc9hRTY4+UuduWGR++ 2#aPx SQ:"Uϐ꒹6j`KQN[$܁mpnd2.l-׎xD9ÛD"n1~m#ˆpt RQc颣tAKITР$PBT0AK,hTP=}K4fdI?2rzޛ׺u}M%o]8M'zO6}r0X?`IEpӏSZ:U? ]ɭ̇՛'O1tr?ݥ;kaz3j]05)c.]5- *,(@/pkϜvބDL8e\4ӍNna>AuNv?\;^nn:(ؘj!&挤"9~ܭ4Hmt3/e? |2%$BF /. Z]jb\ERhXHcF8WRA׽u~{ߺ^׽uT̃mFmLuVr*x䱕 s#3Y<$Uq54D -V}>~l?(B4m]~6eHP!).7sy%>d8An?]#ZŬj"Ɗp%f$I&}јl>U}?nl ߫]@}SsN_7Ӧ?k^usx+dNȮ7џwrQw`LPH=%HB2ƹ,tH̷>ZvuSnM~w~43 K h0(\G$/v}۽)6 ]DLR@IQ(ƙ/uZV퓁>4;hJ5e(\b@SYeEhUe#s9S ~f勔]I"~GSFIdt`U -|r?/ []6FLT:0#*C) ؇N{{^׺u{!h_;1͎\Vy]ջ5*:ޱWSܬ:`DT%78~_y+8l}YIJ˪=6Edn:A:ٮ,q{DH;qUޓ "Fd.9=go^׽u~{ߺ^׽u?{^zoENW=aٿsQgU?wok}7Sӆ?潯]dwSՆU|P}{ߺ^׽u$!yji憦i)*BC,R*C+ճ2YIAꬨcCVR(U8 'ɝ#}V8dܗ1wێEHiEUkڏ׿{cߥQHEU*KFYEbN]}mlNɸ9xj rSlV{ߺU5'-}YC*.[qWzc7FsgC7ߊlC`bum+ҴDY:gԵH*&l'mnrMTS嶪,ֵKJjSUIQ?u=gدȆ"dLRC(fO0OSv~4kgaU9UCWyPV1̪Qb ?&.s/ArVF-$J"A# E ]Rq=.ک?:y%_L 'TK4<"pxy^ak _il R$-R9%吊 1,QGok}=Xm>,DWQ$+c+V5݉m u#uuCfO26r~3\?oW0ʽE[ ~ |pKN?Q =bI?C,?oϿ~_t{ߺ^ #Yc'IaUKݕ0u g[RU,ܢo}C|4=}*)7NĦM^k/W0dPU1ч}9מ7(\ֶep* ,֊%84).h9)n{)Xn&k (e]>6fJ6]sQ'^׽u~j쮱6Gy|zm]릟tt[tN>&T|l_{b-LouJn6u~i;G?c=MOը뷰yyDK}{ߺ^?Cuǭ pQ ~ykxa>=ѱ0uD|gm pS6xY2]uB^vu~-ϰ=IguZuvWŊq2s㭥3?)+bDG 6L8&7#!$ϢNe>kY7IWAu!$ȿQSsa{n-vݘF֨3xڐ9eFw ~Ķ)nHڞUVqcto6mgEŤC" 9G)?3Lqbv?T8-,k ' A&K%TG Noec7[2O3 (HQI[{oX.H_F {~Wggu `no%INb~5[;=9v;¥BPy(`uھ]ح9_yj+#Oxjݵ9,zF{ sӦ?ڙەOEoGylT<(O{4k݇y W4N8tqFXY3[HeS 8Տ[uWaag6f6uQD%Y3Xdӏ-;A0:0 菓ϜSn-)"h،jGe#+sFwʼ}w, iM^ H=/:!RM4 1+qEkI$TI&r}#C$*$h$z;@I& O=ig$]<7型iSdm pGW*tұbO{jh'5?Q 8]X?ly=yvV*kxCOLSϟ01E?8(y׽tf&|{npϘy("v&IV4U<T}nc&[IS u2avL\ q6}ѱ}ۊsmL8-<dS=⩥VHus9Gw ~f{PUMRE%h2#Ls?,onV挭7GRUAA%胯{^׺u{{^]{ yxES:Q-D,TdT(*%f4IQ!i'\l&?qn6(УWJ‡(0cJfe_{FǾGqnxo=3>)>"T(b\S3r3m kB3H[ۚb3ogW[;/Hm- 6:Q З SM(ktTy,me.C!QKYGUNZ9b6WDbH }ͽwv,Jрeee$2 Ai0ki9#b 2 ER]{ߺX <1L4C@`G9F0 ewCT$] P'0I ,h 7'J9"FcG˯3NI?<ݺ^}1/`^Gne<ԵD`HkLdAE{Q^tm92ڮ;f[ښGD *-'J">|]kU%?u]m{b{^Nzqt"jFٵ2l)>ⶆ.~r -${Nd}ykX7[DZrq YxqPf}9V} c[ТA:cS)M-3b={ߺ^׽uB._9G:9wY׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV?O.ݝp{nWYRԴu9T؝U+KQ(1{߹:"suv6ms²II]Pi jV7a zO)s/9 r_\GE+G Q΃aÁ|.O^d飵Xox鞼c_ #>ׯ~//hk 3ן]k»cv tbw65 9Tc64UG3*ݢJ8wY7͸otjX뤔dR89R 8;2*p|%~é{^׺u{{^׺5avĭS9&ޝm hP@2F #Jآuu0ΉwGoOuiv])5i*b"J?hcmmjA*C M lLn]~/w-5.P*(Yjbr bDcY$XQuۯ[i0m14 %,kRC)Z \珻ﹼ+-nZ\ن4G F0G)b(D%XdX]qp6#A$V A 0AP+#pAGGsn{g\=݉6~QYw#o*76RhlBwf<OͼvW3o*/˨N::yoyy~JL)njRhU45Νfr*pd){by*wbTkcp+_|iɱK]5huI"G@-Cu|J盥f9*OtG6ңYU:&6_*F/ٸy=T[~$ʽuoSzAG5,u yZ(81}1{wOt4ڥ@2=a(e|VH/sضkuqIo'M2WjcW1D@v ˫q]y֟{/"־?azq |W,o"HFH+#$tuhAzoGH" [_aF x!AzRۛsh嶶vﭡY*msvm֐g{nZ,ÄmJ m%:nI D6cfdUk2p O=>V/FAxAe,KG8̟lV{t̷NepBFeu%M(VVV䫫:ܞS)[Se2Uu,FS=fC#_V,^IevfbI$]w%43;gwrY,ij1$I$g 6%,QDB"* @ oizwC:Ӵ7~cXys=P''5rEVP@!*K>1s榚ЫQכ=cޭ/!7fHԚ.kD#XP0ory]{U ,j >Hk]YO GG wwZ_~//hkXox鞼coɮ[scho+܆#oKU[Mfg1dFTDSĵH1|[nQǯPZ)~a@sL{mϜۏ5mS-,U2g2N1OʴQ]g'^я,nI}cL&Zh;>l qUCV(H4OM2{G=7Y=%*R#dSNth_k9C l& T[k\ I@Orz8k>ؕX㨢Dlꛇ8_ѲP!q"ۘem \URE.ͮWW\Xd{_EHk~ۀZuXOzc1>ݘBk5.)]X"Fso Ғ[њQfS_,ӺwQ&qN5W Jf~`=ۻKYmsIX#ڻpUVvIHN1O:Om9cO""Tu#~siH"63<#41_kr'z']\dmeL)$m'O5[驧<;*M2&|dA8Ճ, j8aR@G7$<,ō['$S/z{ߺ^׽u~{ߺ^׏^g߈4~).{˽;k6+=d劻 UCY$mar/$X{-林{ϻ\ĒF&p2J$gf{;[lwS]H )ՐFGF3 wwZ_O//hk=Xox鞼c1?]gܻ'yʭװ0\Lf肯!411+J8pnd ݖ$ש RMH΀?wj/sd,Vid@3ʠ&3ּ~5A:u{{^׺\d>_z*phdW!!ޖ7CG ki) $j͊VQg$s3sg-ٸuǵvG)_\ z w( 8aD}Mu捪&I*FݕkST'gg^oaݒn"ލYf6<"7襒 Y"3*cgj}g|sHJ2ejtȌ,E^{k>mCl}M> t[rLrjдN' SV4ŮnuH&ءl>Db<e{j=K_TK_ݐ nUZ\IZӫ(ۇMeMb )2z\:2.$wUb=eaZ:Uec{\ 3R4gv>T?>A5Ϗ=WO] M u"bPU/doQVLuLw1;gܑ|'PKUo"$uGӬ]+Q{gUr H?iEtm'F=sWAMXRipdqVty\tc}]G{ߺP29Lfr ]*5t4]EK*?q}*C2?oO!sQK1'[?e6KinLR6W;7GMffTUc$xXfH]v;/cK#gXUur05##6i[imdkU7 V8*J  W{p~ݛ)I{g6{?Cu @:c5gsn?/ەґshpKն\\]EkyUUeu8ϼjK;_Z{L^]y֟{~GkU?_^Xox鞼cXߙ[kvn޻#=Orn*+M.I5,X,66N읱"Mv^ ׫ Li t>??Zv7(WgZ+WޟOYoVr䉷ͺkrb/B1p5ӭk?z{{^a/6W,Xhm͋}mj|ǯaMK1W(娪h}Y'l>W++i#2%)IX$xdyxNe䭲[7YGr aQOQ%gC]y֟{ɏ"־?. ۳.Γ]gcG)Kk皯wNJ*gZ|Ǐ#/Fݣ݄%GL9ԁJ8[֥g$ &k5ܒNedD(2Ng(<,u^׽u~_ӽqUUݗvnoYܕRR&Shnvh#k4)r(k~䭃7yⱗnZ2paKeK<DXTP<+b_ #>ׯyU__O=7_^1AtV>i0Nge zcbh6lU~fε|KKj`n@ ~y?o}Òo74ԩ=Vw$(G+GL({5'<{ʽx756Ko- RX)Xmr{/FڮtǤ]{ߺEWl|bz;gmMeѳZnQ'}·&7AYP5eu6 D')r{SeF-7m224qidBX~cUDUDE *U*f,K1=d$/z{ߺGw_ M!GR,[!=4o5LpŘ5F RM'sϴ6yݦRMSV6In]2DIv1xdo7ݻġ*H&]Bu}=5ʾ&4taYvk6 .㨑!!En/K9[<«v;r؂~ cR@y(Ȼy헄5puDy19,.OT T ]m6BuCUHV>q[d&^7WC2z.6ב<2/u*VӇ]'׺ {zi%b4UfaRٛ s'=_'doBA2 I p©᧺~Omo^+D9XMF[uu@ {{:&Yn%TZqb"wmo,`Nn&Y2YH+\v:R J:pJSQFD O0Üw鹓sVw#UTDQDUEUUP.^ݓ6xv]KKH4;%G9yc/^n851ݧ_<&gVA^ԺN*:o|5:u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ]^?Z?^~}{ߺ^׽u~{ߺ^׽u~qxJH":Su) uJWـ.ߛh"a;oB T—?M~q_];sd M$Y}n;ż6gx"U^Bi=ܹXJr*Mʔu};O7KۙytUk܏dM&[+e?.ʍUO][$1y+FoU3]\#;9MXS= #08*>ui^w?Z?^~}{ߺ^׽uJG6mQF¼uTdR?5H$ed5R R,ft= mVh#U@>Gq(HH}5TQlSON,jƧ~ֺ~Tz~uo{^׺uֺ>ר:u׽u~w{\Sj{[~{ߺ^~׺>֨:u׽u~{ߺ^׽u3\ޮor:W58!?ٕsH%ʰ3wmmD 2ȿбM3U?oG iFN[M~ xp6JQw  |NuMmխM5ˏI }=۶AS)W,m_d{=0Fawk@w>? |e6Q} YiJ>nmsz-Ҍp: pض>Ԝt͘H\n\[B) zY|}IbMOB[KK;a p/Qc"(!RnV(0O!^I!XҦwsW$dN׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽t[tUMCƲm`eXzLD3HtC#(]L{ ѱo[kMy*.Hcy( !!AeRq KQH)j3tcs,Fչ|8U2ՙ,$pGH`MÑj}sڮTEEYV!ENIds._-k<]1s Ptf@ :G{ s׽u~{ߺO7SG6RP2WG6kpCC2SZx&1,!Hu0s H by4 hxӢiڂw z3KAeEEiZTWQXۮ8ˁ*X| $)eb_mKX؛i]vخzj*4o:XCiܠxb$J#RZW=4-_^׽tl}iz*jGS[vt%OW4#كiekXD[G(Nn{&sw$%hA=o*^ڻ Af(HIZ**wmnmS;kVSZ=́mA)SSf!:2" [}k7uԫ4o2ԍ@8+ #;ٺFmw0",ʒ+ـ4i=tܻj讧5;kk*Փb!D;Be[܀Mzk]kQuCA ( Zo K7׿ܣGk+{vk߿/2_,^ruE{_E~[_p}d{?vc;P$MI'{[Op}dx(S]lEPaqK5UT4lv:1S]a%>.wJ0h2I Z훍PI-˶BGSZ[5̩*GuXšQ ddg;^ӱסZ:z˴ߢhu/M o)DwҬm`H4Gv u6H#R'HgP PN4t|IL]ӨV╂ EQ؅R Ԏýu~py##Af Uo''ݕYWfŠbďOM[zrxRf2X#0Q -.[wWr,7D\y$NY# NM7rQ϶\G"4i'"F+)0''c ?Lꏹ Koń};h5miN?gN5z~?oSqMu5M~j>5UO_M "?r|M>^E^Ty aW^g`I68yX]q:H#R0`pT%dd:\PYMS~ֺu8=E$ 7RSd6Ykc'ZE4ѬD+fQٯ6M%bI8E 0 ք1Ums }B5xb+R+Pzj-#͝dhn۱N%DT/Lѫ+:IPA6{ox~dI7 5 u{{^׺u{{^7&諓il~3G*A%lxaY$VPTh;YnU.RFRPPO }m-Thއ ` z[g}c.㸈"H#RZ1Z>{^׺Ua6o|nltu2Qɑ{?qCK5iJ$lї)".#y?c{m7p(^dC RȤjZЃ:*߶ao[[H@`OLTiwS@4 ?oϡ}_dY[G?Wo[:"={_dYn;X]l苷]>ђf:cev][ڔ0MoU:~p@^,A@&jo935y,P:r.iiGfx$I^eM%;S u,%H }X)$dy#}J T# `}k{^׺]UB}r`YX"53UxV,~]z'd =I3ї V<Vmz}R,,& )-5^G~}̜ymxQ鑁dQZ,hR) Ãn?#C[d?Ϭ<]R6oHGcƍ<*kP/vE>}g菙WFu=5EacM%VyFgnS*^qmYCen?Aq5{)%D<ɱ]ShGFF:rsToեįrE/!?bN=QȒxdF]2x.(GrT {Z׺Way]׻qbhbxfD11tz]COOrW7Vh`b@(%t$qH$y^s/ӛ]pJKq nddpvk K7_w(g^D]>Zo K7׿ܣGk+{vk߿/2_,^rtוӚ]vUu)W3VѤjG8mPkdI͔Z/_I?sʹ'th,r:[Cio-o4WףV_Ot]{ߺ^׽t |x48'!M 2y*fY#_T9${1{;=S0$G4@A8OIo/l 4vy]c@N,Tpsc{nI]{*!len|.2jdE6C'K*9 B}˒yfkkh * $U@8HŮݸZJA!"G d`d㤇FfZJJH%COMKMgI#1H݂ Kkd2I#UPK31U$h=RI#6f 31U@,MdhOK=8=C=kc/ K7OuE{_Ez[_p}d{?v׿oϡ}m}%@uw(g^D]>Zo K7׿ܣGk+{vk߿/2_,^ruE{_E~[_p}d{?vS5ڭͷk$GTDžrfdP墆SpJ ݶ]a[լ h6kFPӣ[-o+W\R$R -EEEj*+Ǧe,n/dp,^O;`Xl:1rlIgAC~ݵn[XPIq4J$hԭTƙbٯoH!L:Ƌ܅m_37zQB˩_bLTyy ^%?p~ yr͇ڷ@zO~}ûko~t-?N$@1[rA&52%fB>.~?x;h̭P*t949?bEVyen\FBGۨ +Բ"vXξY_ ^\V*KErHP{yێ|[E݀'JK9MBa탛SԷ,v dwQ/e`ߑ]u$(,$`OITt;bjijia4%xBl׮(eam1 *JA GD|rnJH ۂ4 %APpz}kC K7ܣGk+{vk߿/2_,^ruE{_E~[_p}d{?vo9wfFa.ɹ6KICt~c;Ō4,mO_FV;Ӻmp\HfSGIuu5j,l r e"/ygwIcC4,Qu*he Cu\Ȳ NC+)*FA2Q={{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏWGܗ?yEMi=boK$[dz|d7N%giQU gjڷ ISYC:階멋&6VJߩw<۩q]V>$`" RtFJן7Y O 4[r0V$bHކTVwB jzwzu< U=Ro(yRv:O]ٮkiU~:>a6.mxoMQuO\ܝQS*qW96zuM*Mw2'd%׀n=>{' '2G+S)5 /l}V%3*xR@r+S̟K6p͛YGCY\zO])rDS%~qsޛnBkR͕d "*4yWW835F^4j+gR<|yvݕp=3Rn΄'{Ⱥ7__Eak{)7_N?gZ;ͧE|<'󷥲o+R=Thg-bU)WZlI%;?h$5'1*x9=fmvi0ۢF 2 0h7{`ٔ:qbBE͏9D.8q_xctSuz?tc:|sUo^p+vm *3{g]\ Iģ(J{US2Cq}E&$@MR|@fQZGGgyz{}F ԍř*^7]ۻ?F-`1U0ڌU[AwG \ܟϴ~l߿ҙ!|6YK~9&XԐ9a5BNrrn>-Ť mX1ҕX-(j>:g:8v.K7^1_ۻ, &u*42IמA{w4K4E*O$,9 d+ &^zq9z>dKLJ- %]Ht$~㞆l;{ Nwqs{O2pUGkz˧f܆N3{oAqJz&VnVVRGPV<A&xؽ5E"9y#^IhD䅘+ie'֌H` PegӘ-heheV"2*cp)$twWMﮀ]@n eFT>5, `C"/ 󘽯ۮQXMnݮ*c#1\r.Tj*J9c[^]ʚxȴ!Hɡe+"} :u{hI -THQk/$}`Io_t˿P;yՄ[>fnFf,K31ߙY>-0dd|]7Y4]>={ߺC7Ǟ|[O {9n >&f#9=ߙFrZp<1ǹ+/o}l:Lݹ] m44kO1Y)TG3윘Ζ .h5h=Z$Qos/6ATh+b$}D$dsEC8o+j266~I68aSsꓞn}=̖~ {)lMxnUQպ_/>˯o[rҿ> 츧}׺uYCjY=?/Wo?w'?o֦NܤIیy$$>]Um4bkOu~{ߺ^׽u~{ߺ^ճ&*msO{r=b-!Kޕ?Θê3d {>2 ?EsQ :|0:u{{^׺u{tm(n}E}+QW&>J煉^@9#Vc`:͇qϗv[٣%5<Ex(,j8H7Mcw;k8i[8ԻPy (X2zgm 'vFk9M[vbu~;+T&-랋r!'YQ}Z!Fch6n({דd /ss%R<3PsYg[EχooIdE i BvU~? |^Kߏ ]Ñ'PA8̼! _+>1OX;n[]JׄWP*!\6[781'`P2kt{^׺ٟ6+-opa>?kqh=sgOB~Wƞ-{ڲn=ۙ1;6 %G*Eg\Ʒẅ́ 8!(Y-rVЕZ=yo?4|ɶId-YpԢc :Oa:}|_Oom}o{+g껗@Lw]=e;_^_e/Z:{7_JvVڎFՙKN|c'/dz=m.gS[H$H>^.H1ݠc0~:6ï"#7]w&Uhd86ڵRFZ/␭>kSe֐a,. >a{{ Ⱥ.*݈>w#.:C{v{<mPrteBpֶ_5~%~#v;YrwuVsU|1_Y TX&gTq4 \{{7sޫIe;H|hK(J?>g+ƶ,wp)%UԖL%H8PORF7Yܝ8^*:Zr&xjLpRj.?;EO0{55{̿[å "H z0:elI4G~˞w2K)eBR Tf`Uen?˛|mXJ5q_gp<qRf&812z7]9+f~ٖeܯ )?l:X'q5`f[uե*2X.ZBʌYl]O, ӭ&j- ^yeɺy#U͢>q{ics2pihgYgDё$Z s-WS/ɖ">SΞ`l_/?H>йDԪ `#?PO}ƫߩcO܍G+lrؼ>d:vyQuuѿ)1vR%ݔ%umטӭTt(i~E{KW)>;N[mLhMxAj(KҴF ogL Pq> C|)$rpV$ǟ~}שP[*j.%R1]]j}}j;.;v:ل6GʒV4Ze'Kbn>{g~6]EPЈ$qB}Q`I5e٘7n Ien ҫUAT  )V9$?3{kv ,OqaV ʽ%Nkya9nq=2RT&YX}ڋL1? 6$۲A$ArOl>aOuWO\=㻧XN7dnײsNLܹJN&_ne%䒖!XиI#Vksn, @$F|AQM :{ [yi[w$$IbKh$EyVGWm<ϴc`o:^2 JC+]qڕ@qOC޽{{^`'d޲T.iedV@JF}oOYrKD^~'>GR(+V3\pBd,$,N(kNú8e?OqMԟwO,ú8e?O~[Iq[: ?.?] ^٧m|YW ibBKYާV[h9dKTdM:I30Sb8Ng|!.*F-y4‘eR*UcaL|>=Y=f㥊5;޺oC ֱ$ fZh)/ 12L <}xM0=hvV,"l_KT |+eaTI K 4p)VevD)_9_{z[Cn54<91*Cjhk$}9uu ]'Z %֒8=ƖaRkZ&40A~;jjBZĥ %hγ+&z;|nD:cn˄QGXh!OUJco1x(Yc}A#Uv5;*q p' gS$.HfZ,+HgBsLі]sab ʸf:<9@z-`R2rɸj |؀Kܴd/$*er?OG?,!mw&7n6qITʙjW>8g|[݅<E=m7T] pBr:K! ,DW~to[۝S`ɦ;2yh6n>chr_I7%撛nG8m $TڞbO~>c]b+1Y|FRj ')jJnJ,e`AK}cy^Kn43ttb+++u[{{x$YaU2:8 *YH*A[P?oG:Uu>xho+!y))䭬\VpOMIYD0Hזk{՗.{Ia{amaAs1U.K,TeJ(8uwm|{X# Bn4u08=n U[3?Fp ?ΦM|1/u;ÏvW=5'"~J@,zqYnm<{{M I֏;ciet"oS}ʘi;{%Hԛln*?icƢ06a5P<b}U26ѽM-T\Eꦹ pA>Ɔm8UcC1#JH_ˇȽU:ϱіcKOT*hWu`U/jPI:P׻ul=wD-mƠY|h&]U7HLʾ{qo7EyI-75csI/$C!1+:ZXj;/{E䤨luFi)Fn\KRӻFL5T qȇTt!ᔃȸjܴM&ݻ R5,LUFu4*þ)P|H؆|eTڷHL)pA"4ck_"C%ae.U~NDfLNV$陘 9/kK~I%Q<nvFUBķΡ-G[I se94Aqq/k2`YT.Ñ+7yω}.߈WdvnWwEXid jݧ+d^DV 1URG(~n>sB]SO9B%D=Z^V=*^¸5!CpVbwzu{5[ {3!yXĴuPM;Ή 'Le|r $0o/ojE,T֪R g^nO/MpCFSKv4X MQ0h|_ضfƫ Uӧ)dmZ24\<e'Rd=/އogW6"c"E %!8ҫ1Y#lJ{9/wl #e-7CN˔ ZTUUUW+*9 G!S5nC!_Y3TWWVTiIe3I>wws}u%㴲K333IbI$I9&u(%8P**UP_{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏW߸=]3eXq?[v]֬G8+/ nW7񝩟?KV,e-3Cާ~a#s.IX6q$dxZĆU7#Yr^+sj}r)A*ZxsOBN8:+!7#vVz<K{w1L1d t Ym.f]{ypB=P D3BT2Y-տ;½mH& g& 20eMWU4s7>Z!4OޛRwAhhI!fm*vh~TߗV& B\@ĈJ@H+:e#u/od# }4D 8Tj$e\R%1k׽ux?/>nCޟQe >?I{7,ZEsr⿿O>oԅNDu]d^ՙ*ߏd0T&<<}.ԏN\}Rӆd̯g_s51\dT5'ȂpVnlsK,MZN+j7-8)e^lO*Ƴ}2>ƚi(v."jMz9ǹyIK$#R[DH45"I^6`Q=2d"> ?eZ…!VęxѫWKޟWw\7/O*uW_cVп)WK.9e8bފfoBܟhG,f@7kualYiO IJ[5,-ٛ-TamY{|;a*YJ)M"dZ|ώ=M,upO"Sϖmi>aˏ|}ܽ˕7ӤKgj^[Q[!$adQ>r-5)4ɢG๋aO IPr'EG{^׺أ)̠J{'=VW{}?nٿ煿"NkËl_?a,e74&ש{^*珻/?>]Qgyy]t?N}c tg-bKΰsOrliֶ0Q%oBHw-(I"vx\jac1`ߛ?O!oxaczKre&&I0Եvw PO!`Z{ﯵ&dsy?[΀1`/{E/i>q4r#/UŌPHzԁȊY5J:D?FS<{ᛩF(|: &_˭?`v}?n?XҮJ:>cg';OlR6߄KQ."e*z>sId@c*EJg*{}7'iv;q[r8cΠ14dHga_dypمxڬMH>"ֲ܇1Z5B4o=W1yݝžst`O V2 y m^|6b/YPO/=A$lپ^rW$6BmB9RE;H( ʺŊ\I{-ٞowOOp`C n jMcm\\HÆRUBOwse!k{gh)u+-lgE)dUr A:jWҮ{߲8mk/>/Z~ڟWyW']oQOW4]^ zuN? e"=,#`<#}ŕ7Z+}8e:e?ql?trtr-mjHȶB+[5;_N6mq2{kTҗM3I1 閚s~^_sw RGSP.-5ƒUnTqT(`~v\0a /0]y1 "d $ǗWG|(@)hl*| Ys٘9|I3#8z: ,)4`ߣۭh_HN{OêuC)P m;RmO 9 ~D5*j37A>+7X1c31(܉ 9"qT;]mȌ(Je <#[^G{dXfE7\FRC{ߺ[p,!nߕ_#/\?Zgܟr/OnN1յOJu{{^׺u{{^G6?yҞvKN%JM3Ǧ>Ͽ W}x<}ͿI??GS~u{ߺ^׽u~{ߺ^'!sFLWE>/4m Îv,ؼD ~Qq?9:`ړO`A+/dCT}yO.[{bs"{V'5?Zu ẉo~?rou]q.],T+(7|}QS{ng%m܀ps(*mei9vJnf:si$)qus$M-nY̿dmظy%MqQXuPRYx5&v r^5 j]cȯR{3Vulu ™j(Sȇ#C%5t7DA&n~s۸{ 2@*ArHh&9=t9o.Z歯 VPDHƨ|:ugMJSﰟpsWz+mTkW%ho>ef߳?wxb tX}I}{ߺ^^}O6* ݌YV7tAL# Hhk~޾3cV8nV &[I;#n0~\d Q Rtď\L?oP[c>:9ltb((jt$tgS)JGļ}om7;n#2C};?dqL% Lo%q^%V&?GH_>/m{aK=ìq<ى2@뢗76V޸Q*O-ֽg'ԋ{v|vw6$S$7IØuHnTO7X㰀)YJEt%j"CF,ܓ.cO}}佔[XN!1 5dp5MXvyTb2z`y0{/RdtV^xC$S$P i7=V&aif|#1rflQ"H[˾+m %uvV\?% Sw>ܖpRW^׽u`pn_;wNR)'>TigK$N\*R,r͖_vvFL܁e9g?DTj46H ?dsy7]%~BaQ~(q8 X C#R ]''ω 5݁h++15fq9ܛN:aIj`$TCYF GFUf^}^bڑdxT3[<5P"u#eYՆw?r.w7hEGNg9)4'}@Jj"ȌUчѕՇJV$#߲﹇8mk./Z ׷?{Ǽ_yD=wҶb3׺uw=Կ+: U?_}csũm'7O^7g(~>o<۶LEȖw:!bhfuuzjUQYViAxO957[TfR;Tn:%Pd7^l*Ĺ<`Y iqlMzwq*O%mm|-~M[]lEI:kjSQ8}=>S<,`BVA^y򣮁u~.7pv>ͦ 1rǍMyLRD x1iQ]P@8[ػCspCgZ2DU=8\q$#+ytEŷ.FayXTE55K!XN:ړ'b߄_ j0E4*Fc["UyFoS?x9j=oeRiF8[f񶬿\Ǘz}YIW*IU-$P0Tqg+;u۝B]j&:~-hmi60 H J ҟ~&;"6fxc"*}Ǘy:bzoIɧ|e!܀ `]D&ktP}4Ưozr߷Yn-rmjL  2{Y׽u~XG?6/xʏy[/;Cgi v|p×?K$nY G捧\˾ӯ{^uѹO߰-EȽfMXXn.f/QMT)r>&H}Sȣ+xyYCVR~>󽷷|}͗;ۦ#n\Ht‡+뒙'; vw E%龺y)+20co?|=fFVUv?ݿqgOƆ%[Mj:K1D\X32fF<ב|=x+ u]X DTieb#iOcv6>ܕxi+aYx1x$*ptSQS*%יy~9 Y EkDDUD˻').[-7v=H^G%4a^u$ȋ"0#ea =Y)cTMW~w>0>v|.R&뚬y򴕴4Q-S%DFCBZQ%"Oqn|3 F%ՀŜ~4p)lXnH#>Gc7|: xֈQ〥e/Ï6.ǭ,7fv5,dEUQS*"e k;7Glqive1+H.M H8U df#ˋMB4{ [qP(%Oio|շr#Lg4?'a㻷7sf;#=+ݩOu<!QЃѾOY}Ӫ~{%{Ckuק읧ES3د; sP⧯5&HfYU政J^GXB4qL 3-tBCl6z56s3)/D{2$"[m-@vV˪(E|O)՞Jtqߧdڽ[e k~nkQO̞onq{M ۈ#2CqOi-n2,,^)5)-z\/ GX9OsPtS&"CʣR/ۣ;ӵ+~ޡ671q;J}cQRI2 .. x't}{{a#wF) c.WLk$^]ʒc P$ƒHAftSQ`m]k$Y׹dIxj% -LjFPr$bϚZK+b +U`q9 ʚ$kwR$~e-M).*B!*.PĺW+GgfM;;/vAU $J*(|8&Fc )!JƠggv<3g2M]]f9 QB-NUZWr-lܟrihP`/$IAV&A t{׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏW߸=]3eXq??ea?mw?|6?ޕG,o~%vy+avѤ>Ij񰱎u`!W%EL&JVe/Dw}7Oen$>xV;prRLTBXTp^&hĆD}o[ jlsB3@}2t?'UѨᑀ`GId]ux?/>nCޟQe >?I{7,ZEsr⿿O>oԅNDu]d\dq<R*v(O<{f <ڍD : = ^`sGT.+#QZuP#_Ax$tC~ /0C&帳61.Hkx"uRTʒ2|}r{.mwwb>,vzàBL(&,֮ۻG~n:4SHe8|jgocc-c^/g PtF(DRJT-sN3l#,9Oo%$5iN+;|5ZI+{(llB>( L馪>ﺏoşɣo?jh%e5!W˜F!X|`)}6mYj|h2|XuQG"E:o۟ pBMԕ /-rES797tP,T~k|m6nf\P Og3QI, *(,ѹG4\ru$8[T#xRx .'׽u~lQPwo%zh=Ny+=l'UM?@Ŷa/0XNc`STx׽tj coĕsݗ.Rt<<:'>q{߿:m%Xo9ҶOJu7f|荷_sh7l% щ`*Hj"`C$t2 'عfkǗەWR°W08:pOY'-In0IB 7R%|G`FE*2:5CeKTvXsu@1qIn&6z;_ߗ,DY=Z \ l~jNXgEwop9u.lyC~Q`2:{'^׽u~{ߺ[>(ѬvVRkz|f6ʻW+Mѻ:`jڪ(WAr>r_gs_66{ J`,'8G4Q@r;'.4z$c=PhxXR\ftt"p#rF(}@<5>\(;- i@"]*FHE_9oj-f-!X{fkfb|uOW};{G NwqaWe*ިgOO !^\n?Y;>\]Շ,?#sȴ]oSڗ^RvlC909!)+h*^H2}{=6˗?G;Yݪcr~yܒ[fic_g, alnE|Sjeb?ebNTRDݻJoc.@1dJ~UN ҍR~}Op> vqE5 >;PQ(Tn#T޺[P)#e_Ssp׺^}]=X^?u,&N5lh : uGY͋P0C骄O2b&30ICMt~c&~s@$`YQILq idvNi?+P q~n:ګ/d߄Hm^,ak gTQf),u?=`l'kkx5HQy"$r²Su˟lyspLq4Ց-(j&U@gy/,ygcvfU$,FƽuМ>@y&=Z2*;3VwP%OTL[L-JWK]OW{z"[S5TETC;XbK5˵P l}Qv A;ʚz쁂5ZzA>≕?O*CKB2N+X_I}{Ͽ W}x<}ͿI??GS~u{ߺ^׽u~{ߺRq,~?)(ql]**y|RPc1ȼ'HAX{[{cK5ìh*BbHyP$T>m3Gh4.®۾7fGK9K<@Gv9wn>ŨSfi`>q +JoǾgPl-S CnYiĉ=j;7^~n;w]Wn}2pUd/|h<8PpG&Ny[-M#RW. ax õmVmmk(}#B-}XV>lI9=Y!u Դz?3L*UjA Fxc$Rj6{ˏ/nNde*@ vTB[QWx1z~B[$wJh2֒P\/!'Q%[5?x% O^h#i*?Xsɒ?],Z^"5 8m?I{+ygS-C2D~ru~l?_'-a>m?͟= _VKnݕ-~FUQYK?j礧ڻ#KOSOLȧxN]=;[9(6+dc(F=fg<p#@O5l\~DW޿ow?R{|(67ROSmsw@ԞS@qSmN^5)Is7DLO\ :uGوw V j]EgﮋfΕ:4TA^ΜFewuw?*OWIcl.鶭VҎkrdqcjZT_y&3sbu3r3A7趲Z6z2NP""f2i>NC%Quw? 7pG#*:yOmIQ򵧮ĭKStmYn DS("?,rLҩNKk oCqatė [@$~"<hH-0_6 6ի_L*sv=Tl.U&o~Ô[cCc2鵽o0"60)r`jQ2}w6gCih3HQSnvv1- ]r$R2N`l~:E.K#KTHssڹ3iF*7Im'vF^Iă j)l7˺m$0p辧SNcv򃮃~{ߺ^׈@ "{42:^og?4يkiEmMK^zb1k Yrt\}2z].mO 0Gm41yY}۽BE$wi Mqp>KA1w;-@a! I]b'хc=t96aK;y$?@lv}O?m^wT'=\G!ul?'co=vcmuO[Ϲ|V%J).٦Ty~PL)nc<ӽՏݫkxW L" Z$dyT4T;vSݮ]96wMD2$L-S1RBDHz9v@cGh~|9,h*D7|v>,|Sj*2,?ŎPi}2(m:s] FGs^YYwr Q,cز=?Py {7Y׽uyɻ4ϻ^3ƤV:iipLs]pkI#C\̵cd$BC n#9C}9oeM7w?Umjzs2HwN.VFA]uh+qC^㕞3fHx Sj>֯p䍺MV{}'w.   0O\zn ⶑXFxxd V&Y͟vόO9ܻw"7L2ߕY]keG8w]ޭ7C͜Dр8%YC Wvo74-xeOE(Rh|[qnLfRAۻ1S;7}"K69FsG}23u>^ЫY"5$[jwE.#%t듻u7Wm IZR{gG_Q֢Y,fSⳘ9#o_|+6͟qj#hQъe DYmq,282G ׺gemv__Okwq??Z/d%'Hܳ5/g.0O7T }g^%MQԩx 8i8rrM<`f 9O>Q\\8̝ZDѕ[[l|쑧z '?7Юޟ)`  6nMD$-NzEES$\E;~ns}^V~d0ƸDEIo~ԃN6olTxĒ|vh"OHOuW^𯬜׺u{xWg5s wsF?3L* Or)~ո];o"Ih2Oŭ$thB*9a~޷|w;çz7n26/?q6{o-ɥ;XAϾZARw]GKnP:W*Rzo.Iq6k5wCxVs!/zuSMb\t?URֿF._F | 4I?@?Լ}?XM v~9`?>5@F^g=eG?M-z^GJ_~އ-]L44zkdHih+fG 50ydvbQx߆EٙU4zM=jADM؊*ݪK&ľ:mݧ?96f[Nf2ټ2QzJjILә%DсgVguD[A"m,{xqާm%XK,di'ꉧ+q8D˺BV:hϗۮ Sn;YLCE6c UYw-> C)=K#Ǜ}칷dh+Ai%Eq<и9 9b勞[[)&4O8?dB>'u]XSw޹ @7Lnd-'DuHG<oUK72WyF;"t xUH<1Fq~h6> 70Z*d,Yn_>[qm;'>SspLU W MS:A=Wy_b{99wm#oV1,VP.b#_3C,nt+{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏW߸=]3eXq??ea?mw?|6?ޕGYOի-_-л;?._rᕜ)zMdaێZl?s_o%쟣,c;~ iM<`N7K_xd=m| w8V4s ӧt ,Nn\dI{ %:KڴeUl?Sy YzYu/>_wO5r@oza@s`Z&Zάcovr^X@'_SP- %^+&FE,SA42IE=DgP9#ud7R{$uFؒyuy>U UbQB%C zKEHts(7Ev <7Kq]E8**&%xJֿw=Gg}ɶ34mň6,*6VGa9={onmw-VO7ĩ+A)*R0\PuV{?rɽoimd;3\$],o|dVCn‚ ]H%Glc兩 9vܟu'UvNe":y4> 14)/$&#a`3ӕ~INMz; fL^ :r*ԵA"\͏<_So6nO4F*3@Q5:hwwR#;7Z틸j1t&r;_>-]>fCʐ8#_qϛ&9{)U(X% Z=vy˞yNÛ,( ÔU&mʮ0GAgB{?įAM}??ܿez3Vx[$ꩿ8?%S}lJoJazu_,{!xO{NغCd?pn/yM/D ?7/ViVV;[Rdq?ѭfOWJϾEΚM*z9sJʴwP#WG[t}M&ܚ׷ӿ+Z] w0iVߧZ<厂Neelz v.[2:ξ{{^׺uIPT *}aSDn U6ݫ*.h.G6"A_ ;a}5*Lwn_|b ҙc տDѢͦ2q[Z}yŽ< u+JO_SS݄횸x>N*V;{KAϾ'<UiWP?)~C4:~v|JE%$FEX]YXY`hG@5G[,/vv"m ݕq*j{ jb26!|6@+ ֶ}3߼3c EgeyeRs6#s콷&w?jD>e>7GwJr]Ǘ;obS%XͣA#|LEtJTvO޼w-rˑ/x% IS\R+tx~mt|羺9u :oh7َJDTW*B~]h53CU$ [8UB;f"ɷbCN'!'P8J8u .E,4sA:6)4ܫADJ(H #믽*CFA >c{ouVOY}>r[]>={>.fj7z$o[^{^׺u{{^׺u4So@~.p?{ۗ)?7nli^tk{w?gT{q7Y׽u~{ߺ^׽uj_kge=>Fj|db ҭVIʒb옏XrkIZWMC$-xAdmQIuz~*rnQrqf89HEp#_򿮱=f;;#~ E7Mr OXue(OG=ky9Z.Rmva,!CPfh {ITs 7\!ۗ) -W63I ZF`(Œ0G]7}mwݩ^DDe$P],8GId]?lW}Ӛc6~?-[oW;Xvd[c*v<_2)Uid:}wVWPUuZ$T zݯgح9j^ƲZ5m ZjS8zFú8e?Od?k{)7_N?gG?'{Ⱥ;ÏvW=5'"پdjVxo\lʦ/{PZl?65Ģ9 Ok+B%ا_u_x2Ego9;}_Ete=aߪ>/$t5רw6}+M5N6YDlj)!ǯYa9>E'eU sʱ]K"`." Ѩ̾sE9J&,-v uIjkaU:?`7Pot͑lɥ*M&ǕII+i]ZıM2ewso|o}mwPB),cu/fXQJtڟuysMl6͈-EC"7 D nhf]EMi7?'F͟pP뿸oXpW_k~ϥ-:u=RAհ`hI-5pn,t!W$\mo2xҷԲҿxs)"<>1ulO|Pz|3:u{{^׺'.T>嗊2,5>vukﮟpHnwI?g\ lGz?#uuOS/?O>HظW}_&_=ްF=>O֪˯`L٭I>}?S)#e_Ssp׺{O l|?tn9Iw4g/Z횓;&F3PզjA5y=W76ϻ4V׆YYn;5 k4jBwUMJǷ%wo ɵv?pU퍉\JxJI0cbe6;ܶoe}Mq8IdX$l3F`VE{v7m[&sqDRΥj-Xs ћ_j{{0CbCi VFG4M$HU}Df]Gsv{ AeԒݺHвDH3>Zvao> 9QVV%fH?E=%,)=%4vHEA$9~ce^^>UT D@*"( r//-WLh3K31˻.rI=#=z9kmlkdmJ3?zZr1"V<,j '.l;4o|1-ip+AfQN:AsnYJޑƥڞ8 SΥM쮡ٳEOI:4W  4*2ZG=c߻olM(D2*1D,A#6˽{E=M-VLZ|dxѸiOtm^gJ畹.zcgi4ԼJ )`YK+(sߔoU@JO&0a}U?)u#Ynu]eGuyrֳ;8{ 7,KY˿?FM{Y׽uYZq]sJ'v&@krm.(:SBA 9{aI/kh? Pw"ٝ"Oe[4D:1~{ߺ^׿{^q4R/OV=4P #S゙Dc?Rkc_e6 l/\"P)JOϭ7}>ʧO=U?ů/G]JBG[uX >lwdxy7ܱn.MfcG;Q9T1鿿.QMOk6Y6l. &hQ0F=^ ~ՊŎckڌnLZQrx=4iM9@HˊNKMk[Z?WLOqnw_=ss_s?]t'_ _޿tn )<97?ڝ{UYQ[S?> 5S)%HVΪ9{߹7v>^X{l()# gmӝ}Yb}Ѥu}uE+EEq׷o`>S['}+&.b^w5,:TBjԯ[mg$m{ #ab˩atfGZJ^ڶw=ьďX $`5ê[1U}xyߺW>m5< O'= յJi0CʆVD3ċqlC럢g>Dudj5#^ˇ UG<9žߍ;{y|mZ>X:zܒ Xu1ZX/f34϶{];G>^afƱ&4W\0&jx`$.$vv|{v϶XGwuP J5f6O|nٺS/Ml<M{1ԥDGLlTCjCUHu7Ϸܟq]CK\j >;xD49Az}KΜ7J7qZr +te5S^{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏW߸=]3eXq??ea?mw?|6?ޕGYOLJYXY> RpG^QuW|_6 ^YI˶XRv$(![cSJD=Nk5.PtG5*cG~~_s9Ji[Vdc")XC$>[dlʎi|wmL]?.MX(G./HI w5.=(²npF0Tp( nfPgb76Y;"RNC J A۝\AΐAʿ8??F}m<9msn?X6}~}+<6ᓩ N;UHY݉UQ3U,W$u!FIkzF#=;s[Jfsp5R-0DcMMP stl[{w[ۆj&$)!>3#K<~a^McijCȭ1*3$E"":K&'ro ;.'a'  ]&yY|VRksL,`{u~V=&)kgJ1J+O2WJ6~Myhs.,ltB(3=_=k?hCO/mM{M!3_^;=žvhO0dZJ X\dc$hqFۖ}$TDf`DWLA`MMdqWy՛=7m#kla<mM3~+=x@+^%1'ߡFzZ/<#?S[I|to_v>qii{@f-m)Fx]][dT?ۍn+wiSBī*(<}׺أ)̠J{'=VW{}?nٿ煿"NkËl_?a,e74&ש{^*珻/?>]Qgyy]t?N}c tg-bKΰsOrli8|k |7'jv6FYG E8jA%DQ+f$x_x9S-pm1M9oO %Gd$&2{n5I"ɭ;<ɉ$P8f^7rz=銥59XXYS!K6(e=tX7䫞hłkfKcn(P<2p*0^杞ǻ۽BC_xo6GZ7]4׺u{nOrI{^jG5q; ҽ&[6c3TŷiH8` J}9~ߒj|s>!I佣 2ʐFjjA߽74^ahaΠT7/WiG|ɾv*V7ac-5U;/94o3lCFn(-UmQԌxWѺ_f6 9cڽhJ-ΧӽRto]~G&W5XTT0b,f#O,r͜g{<~-րj:Vjb(pGam7[-yo0f՚TydR`$[:*ZX}FܺE=*Vn4.,/ӻwRrblaV'\j. *aF9mod4ޮcAiXҊJFw̺*TUMB~ gjj )eB(\!n>M;9ChH>J(>J'ļjP[,h,iV>d?ycHvWOo^Euz{CLycHvWOo&O/mG}ݘ{NsIW17#Dc 1`]^:4zsNsk̋^B hEKbI7!Gj0GFw[3Zm@zGs]*`sosLPmݑvh)GE>#<M`hYcDמAN]=~"f-7JZ"A%<9ۘ5_lmehhMΆ5hjrZ'=WY ?{?[?f}?o?w'?o֦w'wS6%못_mzjSҾ{{^׺u{{^׺eMn_rn_ݻRӱ?{ҧDd?EsoRwTf^׽u~{ߺ^:͖8We C,H!wbrIr} O< br~ν2($2I>@ :_QOcԸj6qf$:}Y%C`鋤,lLH͵~/[gknInRc&զ$H_a J$=w}Ԛh 2M,vV8@٦`x<+Aֺv;emrMr`l`**p٩DI3r}^g?zx^cvih`Ga14Q5RMMV$lwk6l6{kۈ"DĚ($4 3*Z. |颺{=?~o^g?e~k?h^Yh靴ެ`|ܛ{DZ3{'jqj-fkoRAO)_i+V`2͜<6Rh+ЗvT۠E #dzr}7NEC V9[S6bJpM'EvD0lDT/u 8 BO=oꓐ|e!܀ `]D&ktP}4Ưzr߷Yn-rmjL  2{Yɳ_ur_`=Nj\еm_~j^|ı̿qWg7. _nO/{^׺:[7wݷ+팅4Z( =ӶB>{i㏉+i*Yퟸ9Ys_/J-=TI,$`9i|TaЬsjw0F j x^6R5Q?FҮCS>ڑJgx U9'8߽'坳=ݦu m-o!1uY|SLЎb_r[d:ugo I 7 jzO4WX q?ml 2 T?so~mlfd`йxmQN3~_sD;g:h- P=L/9kO>޺-׽u~{ߺ]3*+;TE,M z'UVu.R?=vvk$ozR,WGYHc%dk/?܊I[V jV ;yݝ{6 )g[ ?TAk֯ w7ir=lfݗmy6ICdUA 18{2۶o/n$ZW0: l2"8-=%Q9YK/=+z}kӆ]=sWOy? Zf'{taN\GN{,3gR~I'a.ZSqMmOC?O?=/{K^yX4RDQx\>DOj~SN oMzWwSeg'9[l-Iv?x>%WYd`mpd79+~^AkKS/d@Aԥc4Ž@:}=9d.tK&o]ZLpaF )^S[W^Euz_O/mM{M!3_`_/6ۻ73Gjf%6+sSOE*U٣ueשH`]QVۼQA,nÕU4R`QVB~M|-5VTjp ҄zؿY1l`nNɿ]w=;ڍν0l2͉L{;OJ'5ݼ{uFZɫ1 R_m9qgݨy%K+#g<*6U:)֡@H.-<zycܫA{<<2 2 #U9R290FA{]{V[geQ+~6yhwc5!:>=rGq_?R}Ar(Ѵu@wzu~^Q԰f;&fBiv>̴ 6m. p?J'Ld+ 8>#6hNodKYV].)F}ǟ~Jg*לO}5?ŨXdS iFw_on9a!_?`U|۪e_^׽u~;ޛ6+nMmG,9]+KPX_|ض[ɣ$5#E`;ͷo敏J]ʚzuoep~ )jxvir8}KhSizI O?^s՗^MihR%ڂsC$%5lT~R'5k&xҁ$$~#]i4fTГŎ2ߖ)LT^}wpkuؤmw!Xeo@ R?}?v{s!ri${lGN))<C$xO믯$q|Y~ғUiLOt6 gޠMZEvIprh7U5@#ť NTA2ޛg-0_F 5blʢbd)(&f!(}6d4Ĵ€,9 tP5EA];jоKUK%r< TLOҬKAN%Dmہ6Rm>m ̮LWHkU. d=̼<{} {YX4eͣP50#Ri**h*+j(k+fheVXVR\{ݭ͍̖wht`UІV p@=uf9"5Y#pYHeeaUea*F {Ou{TTR/RO=%e%m],SQR8XU9Vy"sFADgq|:=U*Œ H C.jݗHf\T#:HuwWp̤M{{y2ΰHj@1p$PO\y[IWcC(+E5 NETDDP*}1,ś$ז$NI뗽u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɏW߸=]3eXq??ea?mw?|6?ޕGYO׽u#䱵fOS-Cj28 J,RVP=㾱UєYYHe`@! ܱCq ܢ2:0*jYI _ʞٛ\|]ٱ0Cq8axÿqtѢwd-M觪qeH*i헼ܮv]os >DLRUn&5Ͽ{].;-n$K6j$`9K?1;罷^4uGm`evۡUlňgnYl+!ư ­%+.bA'O'0o6+w hF` ^I%&۟rycڷMmR\,HS1f*҇qūQ?7+~}+<6ᓬӢ_? +V}JZ~٪VTY+Z u@.{aXq밶?Uy\o REAےRzϣۿnwMm=D &Ԋ_oHz_}vVk6@: )VN %Lr2M] a=}]"W e|7KsBMʺX{e}DZsʦR!SǭWUU@UPUEI&$BI5>}w]{{^=5]v>#RdyW1cxH+$3"J Ucyq^Eh2  rOmtHVGFʲ0*Ge$zwVS`Ghu0h&▏# Vc``&;'(hGU\1Ȧ&_ܶBRy#yknHD]OjP%b$Qƥ& =jGqn=mnmc2YaTjz|UtoTR+|7&hJ1]HXԍJ:a:ѱkm}M*Q68e#ˤFlQPwo%zh=Ny+=l'UM?@Ŷa/0XNc`STx׽tj coĕsݗ.Rt<<:'>q{߿:m%Xo9ҶOJ[MRWiiZz=5DL$ 7ч!#% UGņ cޭM;[K}QmP)Q`~8x֯ z$r3uH@\}I>t |*7f3snle~0nmR6s^M:ZL9 'MRCTR1vnBܽnfԆ䡡"X+$@%Ar@{ߴaKm,D0 \\ nI*#^ߓ8/UGv.Tl䧧,tKCS* +2{-LnW5 zPEӢE6(|_29ecS]4}^X,XBXR]8*sG&tPBUu;r1y9噏,ǒy>h]'S_~_.\LLu;vaJ?*Ge?Sq{旽Ot{aNϗ?Waht:~ }=ۻ;mv]dVsmkAyLW-3𲙨k9&huy5w,\[0%Nc3UUaU`t+kKd]~aĶZTS\N> &dM"2?ZbevnKЭ/uQu5xa_YR\@+0rKwOc'unX-+-Nbm&Q*헝=9 WN%A jUh|H A3uw)KpY`#l)r!_F84ҢVSeIlєb~_WǒewFknjFZV7*{pT<=r9cAZ6|9RTViI Bj|/L#{O7e{i2uNFd}Eգ't&ׄxj6fy&* 2x-Lkz6̿9 :ömjH?UmބC1XݜkmċhPK Q8c/6_ƝZk'bHԬ3H25I,UK{4{.o}ڤ黽G!e13+0 M܍(:-*8D ̣ȇ,*pG2n 8zn{{^vݵۮr8ݻ d.q?/ҕ]2[ܫ째wstee pS[X] UVPJ W%# %zc.c GeT%~-櫶Tٲ)n[0sTe1cdFj5/׷v{;q6{$w%x Meu`y_n=ΆԘmoX+U|=NH)pXUGK%%IdF]u)|:e(4?]Ze*OYCj+3ﹿtG^Kyw =׾;~4ù?_,F]Um4bkW~{ߺ^׽u~{ߺ^ճ&*mtO{r=b-!Kޕ?ΛgL'`}x'y,ʓt:|0:u{{^׺O޶ZMJS﮿psWz+mTkW%ho>ef߳?wxb tX}I}{ߺ^П5~A^m/멠EmM ku%SeDDFi1|ː;4DDqH3tF s8lw<վ+ubH <&8"FWSX~s?U,S-5 G"rww]F{yHM2&RȀzU͵W%thCt?&RAzqoUck ݉[Go g}W)n._YH #wszo/_Q{H.k]֤)Ubʏ_@YN'$99/qVr:_V(Rە)X& 't IL4ٟ_o66/8p)(KBAK4{;\SP aC$p*F/ W0O>Clv*lm*IkvҫN(P4x%KVHFn}=ɹwn zCnI;5CU[o0 @/wαیd[K3٧SpN$ BZDH$hQQ}TiU|Tf,ś$BI5>}mGv}O}?m^ywlͧdRBDbjDw T;7ƇӏpSjFxŠŸoePzQY-|B>XާUNTQ#V~!sVQ#@K4qM34{_VƊ{5@i"%Fk4I2ŏ?KyW}FӺL{m9cR)_F`"IGP|ie([uB e?%33Y# C%VO/J f>$H?k6ݾu!,cifuEYUUlI3Av^^8Q w'T~CúglWO#6&Kvo8I[HdeI)9TӯGr^ű{Vg{Z-S, PyIX+D8"w}ZK-.rZkpE+G+ WĐ'G/7nv &ǿwGrdI,4{%0ԍ)- 2Q {qMIYXL@;Qxuv~~svv]6Wh(Mg NK@X]WGH!gemv__Okwq??Z/d%'Hܳ5/g.0O7T }g^r{b* BJMφkKٙs" B z+U )(7E>l 0i MJ2JJBt#m}S`p3CLɉ=m;]?;~8CnNo{YZ\+xsav `*hhAxgu HEd"o3{!d՞Ο"Gr,*kڝvOvGC]ګ;%3:.qcVCY*PoL9)^$6{g3r6Z JeH Dt^7=l+ܭͻPIҦ)1Ⱦjpù !V!7B^{QygD(Yi[DP*I}RL8gy$$2p:/e|-CC0Sw4tU {-Cq隖z),iSP5E$ΫP?S~vU~(~@U7 X|fH")y?}7Y=ŇFj ,>(idU 1?o?)ʌOŽ<6Juw]'Fq$BjDnK_/bϸ2mIL-HE?aqdDP̍F q0D3iƊ oBT֖"?pCn;w7*6k|ܞý3/ڛA_-}Zsbe=nO?O:^)%o{([%}c%~ݧW#3M.0k!M R:(#G;#3O[I;%֧$M>H-*G3,{h]SYi|E;KqWlLwpciu,8mR 7"T ^J ^~>r4`"Gp*\v$,>L]v>o[Zګ=̐ hdTV+{_Y׽u~F?_v_uO_!n"{'*[^>IWZ[׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽unɌJIܐoyEMi=boK$[jĩ'h {E%I?jzUA ]t?YT׺umϨw쾽IG MrzyU]S)_=l Քm$NᴰrW9o܁֜s.:Gв:23)9v~mخyoOiv|ǚ6q`EAɽ1} cstDSؚw-q7ᒃZ0IVHӒ{k]2Y!jmp{\qIGUT m`TWeT'pE2~ Jmd=~hNդ)O='h{NrTC(JJ.&ԕ -rk${ejc}gȡ[4-?WSZkX Qσl$gOCrKz ?1#k^^ X l?3DLޑ)?z_t?kˋuw Q\ŒUyZI@Z$|)^{qigt/wuQFWGGe%2tJ=SG^׽u~\s=~7.^+6䁓m+V')ؠ>8[3ޠ#x#øq6d17IT*w- c+/u.h^fX S &%ey'Z.b_. ̣$7}b䦧cX=BlJy`\{/O/Y^#߳qoHbJc`Tõ%[짟 ~ Ac`oKN>{Y\II0~n sݐ.R_D?v.Ы=fIElXVneA?c?~@._b;}H\]yҭ:"zBGwdu,oeveq(OZׂUmlOeeu ʁ^~s4\srlZ$duV dD s$r\'-4>$u#J 4.AR AWRQՔߓxH~u>35ֽ>>L5)ᨤۛ$JʱU0zM#Sumgm|9JeE,C:=t +dFp>{kzw}d,`ZCPĄ*]KD0DlE#j2<lKI4֙pHBln|:\A:Xp)9g6\5DK7J6c 'DQ$%O,xwXր}dEyx4R!'5I0Th}uO}yqw]_.zxQZZCiԃw2tgŸΪƿѐYiY{['DE/i!`_jWRN}nEʼ9O[۫Yyc:^0ip"N-8>s,-giqeB)Ḩkœ:Ail:Giv2qoKtlpz,|tQ5PSƧȞ[Sw;qv "ݷÊ͓4dQztQkHTdN׷_wop=ü]|I6;F%ҷ0cV0Vz}'ZnnvohgkrSIM۸X$g{g▆[MLHw\\7,?W^C?(J?Y|5sΏl?*?.qC{{^<[%+q5/6]4 [%eeIfwX.ǰnqmh 1QVt.,^{YO}OepGR+ &Y@I (ޛW[#7Ep9s\rpM E"r"HsFm; sgwZ2 25WF#9-ۧ/n [ڻG,n;A2qs[nL~&grYc)Qs$G}O{o>o;6Mss]Ch*$nnBϮ흇[N*oi,1qF*:Ǯ15S^5ze)$u7-]J.K)4cJ'+hXx;-MriܐdAzf+usP(Erטw=uk5>6tۡ V ,0iH"I\WMI |*B jqy9vcCg~{{^_<>׺OwvǏij5TI<5 ![CiኧX5.0󷵣{榥_SZY-Ete_e}9r?;$i+O@HB.<݊NIf |=RwߏMb &ߏ/cuEJ*|V~Fm}U0GKJԎ Z}V-n7gAEXc@| D*Tbay{ͥ̚iiuS^%rԡJO[,o~?n?'2G| .O>=U jj'V8P U;Lv a&{ <4TjOќ_zyaap*(Q'k@ uG/ LYu[z/#={G/{F)}_GkZz5?;F_a߿62emRGjw뗿me˯׿1iZ;G;v&פmlcoQOUU]5& O%mk<%vvϾCmV˻QA7>ގ eMwaUOe:ۏ}ؿm`yfŒDjg#uv®E}9J A,R\.A>jw뗸o`/]ކRGjw뗿me˯׿1i ?/}/~4e_K?b;_׿Ϲ_2^?i.o^8dvg?z+,P팞ߪ{sۣsn5`c8s5 ,4AY߽{U|d:JZya()#ZlV2g<{ּt k /XaK7^BҢo|܋u=ܹ};cFmd+(NJ0ܑ|ax,?Դi|5"C:/.{ߺ^׽uɫ~>5I%Geu!:J:c#X--|E%mC~q7k7)*'\8*s-Ú~f)LcJQ,ֿ:O{qn}vةed*;R0i_JL5R !KsNI~O{)`糔dՅ&8Ǽ\P?^,z= _V%^].w!j?+`VNUg* HED=Y_wۮdv%‚ŘYHPp }彖ח裵E[g*Zf9I=$Ϲ_2^62em _y֞ O}їr LYu[z/#=:ck VLY~쪨>rdB,M+mXHj*>`^\}Ww`G,}:Xv;b =CZZbo ]:2[wkFR~LkQUiU[}qwc6lݨ 云ULAFYH ?zܒscWL5JFE| G|ˌ3d6L -rRs{6az(v슍)cXhbEYefI$c}7Ŵm=ff|y–@KHd,}T.$Ҡ>113)`$UUU ~_8hwN4w)LY#,G[S;1BѼK*{I6{;̫%QS utj` -6qZ҂kyIvH+.=mUmsԋA:k"E˴DXir7?LSrjX \{?npx-TG6۸xee-8̠CvA* J1N>FeŸXåh>5ķeMW}KvM-i{ͱ.n^f'j34ITҔstoGckR{az ,fګWݯQB($ܛzyVko,ġFH={uŔO'*8pQLk|۳T@H`oݟ7NjY6ySjD0?r~uN{w{#pT] E=s.DxoiVq>H'U׽uYXð2Ǽ`\ΧnMD} udbt3׺#YX]YXie#jX2*C ̝=Wh.&qk}m $k1nc,Sfy*%+د׾_m][f#UŚHd$UrHґOɼ9cNٺ֪;m.c!*~!?C{xzrUSPҘ6/b՗`tDK]V(70c@_|>:u{{^}j)'ˌn3Ca HӷS)?rϲw{g6)o)\붒̺AFу*߄t; wU`Y` o6<9岡zҧ\̘%N._-Dd4o_}ro^Qqydɣ2B^4( Oo a?sԞ`&^#$ L3*GIDY]C) .8>jU#Tuao, sjϼ{_Ӽ;?Ncq֟/nwぱݎ p ^Y?Y˿#iW&=׺u;^M]N|j%a{b~3LVuSƣQ}߾\mc%j<$4jBџӖN"T3bZ_cBcJJrQ%Z<>=1>*v줂}mj Ǔc!@R=E9V,7de,m.K (̱FSǁ5G3.z˗=/{ҷ;cn`b-MU<|)FqE_{&ߍښW 3njbwNI$GMꢨ&Eןp0}.f۵pdhTg?pI6_1[ťAhF t%>_=ݽ Pl%C.@Vt ?-w D!] i3";5ON$_W|;*Xl1-Gjv~))T"" SpmzcR͸n4dcXb[ HH=C^J6)f9EO蘡Iǝ%i(r3ٰxܧ_|T9\rdXv )#QdւH% F7{6Ig&77Npe+^GpI%Dk@Ѭs5[+@2m)] G$%UU]u]^C!YW*rBj܆G![;TԳI4J$ŝf$|.V.;131$I$I5&gQEIonqTDU@UUQ@:n5 SZ[-܈/GJ!?GΤ>iJnQk_}yVeSu->_cNh?C, I}=u3U׺xۇ=w v\N s|nX.jk" um.9wG^K=&W>Sy^ZSn No(Tβymk:8NYϼ^’ q 62,", ,#䯸|'/Xm[ JZӭ1̤iƒʯqg5u}ftFtnW1%UU5Y( 3dQn;{&=i-)=U eG zcoo2Y~  $֨\E׺Y*儿!'?Ӑjhpx&ֽԚNуB,_z{Zdmm5>0^ݔrO!Z~[z׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u:'WQ$F j0JMD%IUbp$3m<I(IRA#ʠ|L\Zݠ$A"@p@4$V#Y}z kkT"H*h*i\{G{ߺ^׽t0;Y3,KTlKK cԶ6X 6Ө>l7}k 6 MZi´Jt(9OI5R+A^bdrK%1$-U#U^Int }{_n3}E4ScATyuh-Sµ"JLhTMC6YM ]Wfm,e=\~T@-j4ӎ8#rlio[1,)q(͍^qġ44óYdxJ~P,1FpEkyW "aO{}C츗}<{??Qt]ڴvGrVo.-r?Cnc 7sGm3op^S<% ~aq"n]^$ $j4TETE ?U{5'סy%X޺^ӵpajlFXzg$gi*6z|t#HUUKBkc;d& XPEQʍTmn$fn@@]Ip'Ϧ٦ijgY'Z5EEDŞIgwbI$}44wrYԒ|9'ץ(P0^׽u~_/x3͆13O a\t3oPV$ͯ}ϷN%"ʠtŭڄ9"#xTLTfsfsYs fyL$Zcdf ̴%,0TK^ks4~um5JiǪZj8cU5xqzZWBҦ^nmяV: ,vPQSs+(4 T\O$Sm{ kiy4qt$h*I'kreĆkX$v LƂI |C-~s?97f+o'-=s_[9S~f+o'-=s_[9S~f+o'-=s_[9S~f+o'{e߿)F?^ͳ@t<5MUEE]UL=MU\UT+kz<ĒI쇣{{^׺uQWjRbcY:]u^647[{g޿uB$cX|yс>Й{i2%įI"J~b!0žlKoՋI_$;O)_a oUx "[dV{[p raC=_pWt_4ݙ۝Y̟wU`Cɷb:<L>q4{':)7ɯ-įCUƆӡʭrie%)Ek->re?(DUEQeUU@ƬjOBI5=w]{{^rnle:b>QI/rg1q+kH(j#Y,nO&ŧ0o k+bI!UO>}"mnd2[C+g7bY:jYgY&y$zdiX<ŝؖgbI$IW,+O3w%$O'$#A`* `8u}[{^׺E]_JfC!$:]}^6#tMUмrqèk0ڻ;ݺasa+C ȡAs4 WUut"]8VM͓j,J)9dnLJIa:$J1[kn|,lA*I 4<;nm $1xʠtÉqa餔KM1T)č!UU.Z t7#u,(NAjZJ_N=vKx`( F4Ԑ+SA%Rh0KCpE \j1 Q Ap`=̛/^CQ&܅*x6}zs-/cRFm'?NT3J>oW5SѰ[ {ΚF&x{y3(SⶄC m_kE٫'"ac Q$?ho]*2o ^%7U Pa.lˁw(q<0 #3 RI6חm#?ѧkq5" xE4iN)˜ڶ[HWUZ5juVkӁA쓥{ߺ^׽tUPfTЂ!j!!@sk\27]2@1ZҴ8Ҧ>&G6#I4֕jVh+ײcs9h҉sO'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Ыz+W[.ߛȶ#!ڛ~/EGJX_Q<,+?Qy{/rwAm$K*+ P+YM >c<)e̻'<2TԬ+O,Q|mm:HOX>Q}}k;'gQYڈԻs('t__4(ǭoC7q<vYZޫ'= {r+/MH#T?Eչ}Efmjg|yPFmjB~VTHc=ݾlsw˗.+H WN~ĵg'zwnA 0[nsNB2際#Pc2Th\pm= 4dQe`#Qԫo=ݺ]HC I+Uu%X|=Ezu{{^׺u{{^׺u{{^׺u{{^׺6wmGuNg={v%$1ekh*,+#C={U|vvk`/KiFЯJ*%Bi-{qAnַwW1xѥ )˼C)Dɚ 6oX,~.jFÛ)NؚzS]=U>{7.y~9"(̯2 ,4ECxL:72^ vY&w܄>!m!LQƵ"q^I Ld43IJf&jgb0ӬxǾu\*$H$ }f^)q ҹkJ^]a;?ofil]QRWVɇO  \USL!pVRrW^ů8mVV  xs<.ͫZ0uPhA矼#r?-_{w}lȖ+*#YP$0AGRJӑџaW  7D-S%YQEdISUR"Rq>O&n\|ĤmMAlO"!1F4t2K1XXduzo5j-WpQE ^tMETޠ/T^W:]{{^׺u{{^׺ufURBYI$ &ǫ>4|ΟS!10NGvGƾ5hb?#ܟɾ{DmB>]it%E*b/NЄI0U|l})1o٘\ HG/!}hqo;ͳ eЅ<{[x E$ tuTYw;7p0VSGco^܁O f7Hcv sRޚmmگl/l'#:SG/ݻms}esn3Ẩ}6Frlo]vv P [) g2*op6˻,߾6sY\MQO"ִԒ* *|krnbX$Ic?-hH&t웥{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺGG> v]=Ip%!ȑQqX -GQ! g_vl7כl-o2E.Z&ԁK h8\,r[]+(uƄ* hs~m}6#ٝonaf5<P'ƣnĀ${/)ͼ`ǷZ\6!i4]{ d'Lإ~$\iYv՚A:M'}rb _ClW-\L }%.:J R5ag>کxo+̟t/)s K0][(O9'#n6[2M GFjd@~ΪWz `n]K\}M"jd㑿!ѹ#~1&ܘdݻp;.ۣ&)23[E @4Ξ9lyۛnm~. Ios;4 M }ܮ{>X[ZKpni]& Ò)mR0s@ iN7u^q}&EG,R0`=˻3 r׷2WLPFԥHD W=L۞Mo71Yۧ,$Q W !?cL;bʹ049LZlO_!YJIM=j*Kiيd҅2,+9sc].;*FIT%+PiW\3ZIl$VbMrx b .I ~EwCmiwmEr!WoʩV$gT3-5-,SMF7[wvvAiFOEiR|8Yr&q~~r,X\.︀BlWp@,fIkK0T[|EQQWE4UuUmQHA, ӛv97ՙ㳹ffXd*ii6;-uVLʵҭ,K!Uh +qIa:u{{^׺u{{^׺g$GY!7zq4 <*"HaU.h$Z$*bPI$2I'Nz_b[gijkl'_F9PTbr6J:ﺯle5o(s:LQzMpOP5܍iC%'8 Xd,GJmϔ jЊCԧ\TDZJe3o?p4ΏYni\*M(= 3yV-v04AđS^펡n=Ny,~* =K<p5{q|?{MՁ-Zhdݔ$aPEjR/w*sd~/,nVdC2;h$O6''gnC۟|SRf0Ģ):hH<{&޹_l@aqd.Ya3$BXUdȪ$COnٽ׍7*KJ+XN=CȺ4닺FvTf6Uhlx tjFW"Ab Ge4aNAr׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Xax)ix)iiQ54 ,H쨊aUKTĞRI'HBI I$$G; >(>9v\!K1eG6t ?ݷ}ڽ6ܷxFmoayovͩwx(p|9[.ٛk!)e;;7r4ɎuՎwvr4{GϞ{/3s,md-ЛYYx@H'dNM@3ܣWysO3oq,hȌKc@:,Ꭴk* nXUԓjWIl_* o KܭiҳڹO\c dD'j \`6Nq},VɊˡdX6X~_&+Do`X &j_# ذGo r]I;+uaݱUsQJ$A${]/kܻNWoL@86HQ kD۸dH}x#kUGI'go#w^5&omŋRHP!d 2>-epj-x #e4 р4 =KeOմ©,NF] SN=4{+_^׽udjڙ騨镥F$Hбj-nof[{HIUPI,Ɗd3dt6f**K1 (d:9|xu f,MQ6k3^SU8)anr@#@[blakB-Z:;pΡZfC߿w?DNMvQtXQ^5I^Wӻ~,S>7oiqS~&ցDJm-TbPUKu{ ߳{@.9dܤ2ͭ\!gDF4eiOXp6v&eBښh+3;j 6quu"t:m$wDvY(XLjWVbᬡY{]X}G#{d6w}-\rGk;$VT Lhzn>u˵啽 RHUчe<=w =O3־_mP / oc~۩Cfk'4~eme6. j7DIH "s{y];yfMj5̶āYAԅҵaTdgyfww[-dSL4@IRw8Fsۘ\\qXF&+SMNZ8䨎6* YIsncFmk[R"FX* ] Or+4,+hHFb 9-=ѧ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Ѕ;z[쾿VUR7ڸ܏%3d+(u0G,([J*c\9RٶUޯe}mź3[,2"Qw s;U-*Ni]D ROq7ƎY.Þܙj'۰ff䫙Ui3~q%u; $v+I,IomGomQE *FE@!j}iӾcznHr|nJ#_E\s(:yDXxUEUU9w7lgY.f (M.lv{7-Xr焍hdVZTA,$wIz6wn]QNrFtLSueLڤ_3~}=s7w}Pv`~Ϯ[r]3u<2/Q_?wnS{VA1Z#Gid& >/6aAA7Ӄ?}1SgBfon$+P)H%h T"{퇷ynmTKq-4ঢѤ"_G81<ξsj{kyWZ@ jY RHfuP>o 9Xq;mfrw?lno_&/+A)H\p}+xگ-e1\JʍMI$lQѨHԬ A=u6ssƒ"F镁t컥]{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽ub%MZbM.>W,ن 6@:bEp8MvQܭ8Us 1'aei?||6xn춉nJNzTETgPBV}۷=ZӴbXݜS )#\N}nR|{/ɤ`pY4} v>3iÐ V.RJZR.O7پ\}عh@@4\zUz߃ik{9yVWCCl{/)jDy߸,,$kj3?*i1?"kP>X w+Z/Y8 Hɾʵi@|?f4X|q}{ߺ^׽u~{ߺ^׽t[ v!7N0Tq䪍gGe4VFXј;۽ñ@7wN#4ff42H[|2!Y\Q'**7J *~;nŗ!9^ٕR2dBsy&e)aI3*SFW'R{cg*I/C}wnGI@{Kv8Xَ\4ebG-ql +k|4 e)~EG+%DAC0>s@yiMhjAfRGZҹoOw uVڵف$d'4lIܣzzu,b@b@$&++deeapC)GTх^ C~׺u{{^׺u{{^׺u{{^׺u{{^[{{a7 [Əd2`)azRHy}zBk۟cjʻ}J<$(+ : s#Znbl\&cjI-+SJW0 r<=H , C׽u~{ߺ^׽u~{ߺJ؇{ZvΌ#]ɟ08y `W%3~6ۅ੡iV0"q=9o{6biǩP)փ=m;~Z}iHHR%L^eX􏢛-|c'$_tAo*S̯vWrOxQ F~<o$Ծ{{^;$RI;,R!ԒE,d2[Ƙ-I _س˼4{%D϶ w=Eݥ4`tOZ:Fwv<k?MKOB7F?E%fWQR*Cc55m-P4* /`eMhxi9WUDX*!&jsS!^4\r78eX*I 9}қ [n\TY,rQSng!'tm먤o$2/ 5E*2K.{ʷ\mj @"9bc$r^'th}cn^<ђ5*(8GRJߵ[w폚xelո~VZdvfl%l<3^fygr5#\24oBrF4>c=vWh-{C{3C<ɣfZ ؽK'$l\7]m#2KOKCOO<}F"{- t++>0A$Ǭg^m}ک![格C%SS;K펡T"L6>F>8aɍGE%G>Qj7 yJ~@]"H/?!&'Co5>d$âD|ukuKhz*i7>ifONw '#3T{ƏqK7\׵Ȗ .c+5$&u"JRFJgג}&9_qInhI47 >#G'>||_]Y8\&Oqdo`-Y̞j):wgE:{UO4nTo4L̐P$zdtr ),{^_<̌ "DUGҊΊt.*,T~tzz˷wnړw͜ujɳ% j9eFHd(5*{ [g$ Z+@Yc5! 1HK ]",=9fȀFYGm L Ȫ cPjhI+Ga鍭k_/ia7\%ڙ%DPTbh30CRp@ {I̞r +\A5˺'q qJN@cF8oA5-G@Hy"t:2Hh][u{+!;EY+Y8?ۡAK]YZOCA9e!uf~QeQWi!1 BA}ttĸ[_QHRYVYAjHR]MpzaWYCzMGPSLbp)갰#{~noQ)YI}w-H1fbB")#TTeL{)RowX2HxE1Ƭ憃_佺2t4>]S2E,K1g*VDVo J"S)3<.VTⰭq!DW^ _F8|}w䭤ܪncV*U 9ѓ#k2(x.*mܓ{vq_&J!m><vcTs<+;3#Gܝuzg+(wF#v|17}R"աEr)rp*DX:euWFWGVR.H*Jd9հ&jj[YJ.5TrM rIIRmQE+&70,EЂQo9)=E c.Io]JOj3p'TK"{_f  0kƣ1U|<@e [p$֍I_F_u]J6Q?íQ}--_JjzmVXj6tRB%LfS#pC?laF[K* HxuϽ 1ReSBEU2q`ڞ])׷o%~ڻ׹_l9GUxm?>8<os[kl᲻qk#0* g-]-RcjJ,($6}uK,qD$ǀTPYOlrK{x#EYyd Vҟ϶6o+)cYi*}QrxqTRi}gopm-pqiVx\O5D# >0Ȧs;YreyXZiq MkGlw\yaH*-0hߜ7]KOJ+.usS{q[$Wwn^=ၡ*pض] :+I#c5MPR* 41s*IrEF 4+ KHiQ_ڂ8 h&CrW2\&vR5&jJI OF/*^H ii"C E5U<^9cud7PA~{Y r!!#xzʅeu! C*"2$gu~{ߺ^$(,HI<${A׀$u]wWt`ؙN۴A4bGlnSԂ泑x"%D4bQRj:r_}\-j+&FVĨJHdIcDU2sE'Nb)i)R@V{fco+k>K/Mn{Z;"lA+XBF9F`^Y ¯?} 7dv;-ՈM@Xc_2H2X?!{yʾm)rź[.qydMJƤG4EH7dV;y-̕͵(gCt)xgGݻz-[{NFIHeoGa}mmڽ\ 2,dpG:ؗm|=Ւ?;ֺ5Ud6Am)ia|2꣍E]4s4ʵ<=S}7qn?)mFirBHԴL ѿOUu :ή@\ _ڼYS9ۅ':zi֍b+_V8sSTfY}+-Ue4/2M9#pYg8C+@DІc"+ٽ1&{!i# wfSa+UEJ%< UR"4sw!s3n\‘\OZC,X"GY]r8]gid$5ٖ0?*1 V ڑHep׺u{{^׺u{{^׺u{{^׺u{{^E%]MeBfVdhj)zz @1Ȋ0"GZ]Ocsh& <CsE/o0Ԓ+# #[ߘ-oRush+E~O< ,cqMD xdF}z=h{in$6OBVT1-Ajb_{QѳG+ yn"<̬B0"tejnMYsun"Kl.)dKf_} x ?MG?c 9}B1z~bε$(,*%\O+$uW +:G:T{ff/5J*idQ6Ft fdU Rvody_۞Bo}͉Ze-E-K:ǐ3 LДV< ~`^n{x"y47W c+m We*֨Rϖ޿pG> *PI1R|YkpǕ{W^aƲ^*Nm,ކI5L-sM7}݋v,r!5O<Riy{{u{wJ,ć $ANPG"ёg'ffO.ۏ40$󵤒,_5R̔u+OV24\:#b@X\qZ,a:YkЕhH+)LZ또aV n :E2yiܴĖy4Mىcsd21$MO|Ϭ뢌 :}{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^9i嬍FzQA~'aM io3?ڋDwcPI$XO抝?nڕ>ëc7tFSbL kX@HyEh774մ\銛{6ZdP>du~Wܭ)ENC{,OJZXT1GHK$aI?}LgdfmR32z?Fl vdLƎ;& V$ {^ƭ_OܩثE7"+5>^3M_W`}}kzkk[C-?ߞ? GʝPS?1>FO?U`o9ފ'^|˛#14}\įWY쀹r_-+F`J͌5}Mcn*\G_ ~)EeW/cOZȽos}u'[E~R]H(GÂQ1\|Zo_ʌ&4}WxGǴ?r?sq?q>Uܼ*U6IVj[*MP9:h~wb*zq}wGȭ-&?*{`Z2`O?h͏kg{aphPXy>Ɓm r=)VnD)t'Vq}T+u{{^׺u{{^c#_ |Ȧ}e]-\:=yA-HJeWإ8N/ܻ맾BṆK@ PJd`6LnE<{qooVo*zN&"RHxx&LhAh'tV $2n.ɦV;RAfB\@><䜑ulr4ZA:eZLgTVWx ^'pro%Wя{,ѡOJSVcV?1%u{YvN}hwY%<ŕ՘HcOz)X{r77ldrBD-eg^Gܹ/^rc@JkqHD>LOV/%KZ˳q='~t&$!t366 m=e%mOc6 >5_hJW)Ӛ7/g֎[m+a<)D"Ji#G*іPZ7x؏Tn? ?rhx>ŒEkzWs'u/̟B3q;w+ػMn kUJɞ:fc4Y\GMWϗ6R_?to[0Ann ,e13¯}}.yT72ʖ7@FbTƠIeћR Ur=`e{swmm1QO2Rd–BG!@p7$ٿ\sG3ڢK}q4챀ZY QAcSv~^٭6V/1@ĖaĒIjj9}:Ltg׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~s!,tO>K%QOA$EAkg@ګio/" #UX|^hmѮ.ܞTb~AA=mCruSΝz$ifX3kBň'Q{Sa-kK+M# M.Mf_PlZi!nͲ w,_U2UڈtU>aݷ^VD$_䑂bZ;6{~OmLRӟ%4k~Ap3fr.u=ZC4#F0XjMbؑ-bHdOgGDV:-gvWteh"}6vAmFP$8& 9Y_shm+w+X&s2:б0ک '?:ܿ_/nm0+(F5h4JօBom?-ۻ;Q% L3wT9J#Qc-}$Κdz~^趴bY&TQLQKKD%l>%~@oCPKI(B)45]R`nMWhnzN7.-'qS&!]n1kVh^+EH}_vv-7#xۙ&OsC,I xYƝ*kMk.YmI0ȓLY3GuwSI 09*~wo d5̶''MjJ}r4r4NVHB-<~5iskuWDH*#+4#e5zۻqU C+)YXT2*Z6?zl6h6mRmJ嫆iRdjhqyAMvϾL{H?xn#+-e``a3x%K;j;>GI9;f忼{Vkk*7N N$YȠ X*o`|߀ͫV̎ޘcp͎ǪP,$Pys0u6;#],J EQh?:*᧾k"Z #Hۺ cw :Cion,lvl" 9LqQALV]|(aoW߽O||M͸El",ήܤQ3ƕ}}ݽr9c攑ⱖuI7F m-QW8tZ(;{|n6BhL6{o&ߊ* ݷN*bIW>n4~k+Z TTg&ylO=k8;y$ŗ%RJi3^=:Giv^Uhwӥz1s89W%N9Hd_X8[;sv\eK1lc./-pUk< {+l^fa G߲id<'M띅2ϒrGػGj`TY=ݺ GQ_ 0u y\-|[܉%^O1T H,g>gwf"im^!*f%#Uc~{g٧Joԭ>d)#O6^dHeS2Դ dx ysǿ퇷Mdm}u,Vf0UK2 ZmP"ϓvb6-cw[r[譥Z#RPMĥ070rY|y' JO]۟=9y79S45Jȡ'Qx%@0GݣxgV + ¹Yv+ `H kRѲ=eW2c۴ͼmV(f R_ş-_ J1UyS{p 6øZ1JIJKM,r?g;NrWy+:.##VHɣUQʟsNr[R:I&1O#JRDuSB?Vz{c#[C⶧d&#Q=&j')HNk}=.`VA,H D  H\!k?uu9b9c6"R1hHA֬UZ9"YYeMn_/Sn_|?v6?/z'sǷ?G =yEї8smOTOe_i7U6Ăۿ^]IӜ潧'[fO\G.qnw콭lBf6*$xw=Roj<﮿P-Bxٗt|.|t I}Tӫl, r iTF$:fl <k;jNa-yY׾'5QCs@ uo %ϸ|&ŲF`b {n\5 "^Gx}+~L[~,S[[Ⱦ#HfWLQ*Xve6~3.e 8*Unn( *]TV[_G'f P7S>VjqMWZz$E6sw]յxs+D݌MJcCuص|1k h]~FVSAh_/ܐQcSkh=A3Of-ɤSYTAQ؍v|ޮK{V=ndQ_X&+QYHqI"~=ZjHvi6imYY4%sFtoOG|ؘ*+۽ICK+"*TTb{'b쭊X'EuqT+x,G] KrHxw=_JdM.jc)hxrhw2:Ύ{{^5n<?9oA_4\>|E2>"M]H"5xaÑiJqTI<F "cqyG*r Z( +hRBcDH \x.gŇ3k}ЖUgd*K f`IMښj~JUcx̅Z}yb2PЈFPŅ'9}7v8?:6ꦞp;Mwm;>mk( 衊+AUC] 4pz)6f F1:x梁M:gKbSlqݏ֒ʬ'ƝĞ'ÒcST=k7t{^5uC'ɬY28jz%ᎮqԱrGM~xMfF$ƇmeJ[~l~JȦ/Shb|۔SȌERؕ;#iHM^)x}-_|Q^?@o4Lu3nr-U>bGH?ɾO@ɗ:hd~Hϡة(crJF*C]ϖBDWŔčJ Uy(˦@ܞ}} j@pCZ xڏ'4im[i꒷O#죙9j9Xq71c{cAgks=/ j:2u ?r(o+s6 R GU?`-]o 1s$yk VZO̞`v{9[ayDO,eD<0~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^йl΍nHwpu:@BlU I܇._u-g=\FO+~C?Gg=uSCoav'be🼦IU6iӍZZc7?WE>'e@]AOrۿy{Ͳ!Xds-In>:ePYURH>T&=up:01KmUψ`bm*goߪfSŎi*e"5H^s׻{mܹhX Ym'ĒCUVW(rGMDIR:T44$N=+>7mNG P-鞑䞿ugص%FFZqg*}s4PXßU-[H]vv-YdSP;I4ڵ/:Ї|nPkq?wuC[(yR CX%3f6O_Ncvnv7cKe+6ϑ;mvUW`zNwEC0da jMPT,Acr:yk_f}ܝj9w o qk$ʬRJc "#!0{g{;fYnbBf2/UY_{糶^_-մg &* ᩅTy9ۮa9խnWSn WFd%jAghyeyjn& * CFEԌ *QN_peobrj,~9zioFۓ` 6zl-亸HHpfbpA$z7$%K{xTʑƣ; z:nO}qf~iXLu&PAP]`}WPYBՇWhYW;sFf& X\j,qM*(*|坖rmISq#"CK(a@e ?YOչ'+f1[ Yڡehκ֭سO^&\\ňFG SaK.4%hL>Zɶm34m~6 WZFQWnvEeU:!7ىLG#(V8@w[c7/zR~k]vآkeViL#FpDJ)Ti={9vm e[ebwDB RF\4V\עp[gxEqgu=CO)p90%yZ>dr?_x̻U7-ybIt(RX@pI"N=im)M,j2(bAR+Ap$'}qǣzɪ-׎랲!w M#U$ԏfԻ)Q}^ OJ]\U6jcpr(r'>;'sAq1D}P %~G*ʭ~Vvgo $f4o]W Uk,̲!RCqW̞ivOݶAwcr!=l\ȗs9^m?x\̲JTpfE`APGGwb|w;_pPw\p;7+%bn[r롛7HISO>6uDr$EC(\{YVu/"ovKv٭-.&xlKuF]:󄜭oȼ۳~빞.D\ͥDm]fKFe pR7ܿ'ʧOQY璟?` xGS߽=Ե؞q+/;<B})'}v/\o2-rrV/R{޲?_ڈTo§۴/. sD]'!FG{GvsTUkRȇxvZl-LJ~~0?[^%[2mOu5L5h[N H! 4Tt(`|wwЙ_¶ +zPu~lI^$DmijBE,MI4*|OOrU 5CS~EObQ*'2h1 Ǫ:IZDeGr `r>O+%H#ae$Sǿq~vu% Y.谶/%2 My&`C$j&5gU1f7W)ji6F7I ڻ T` QIQ&+m Oc.kpSK$P{F%e=[ 5bѱ@b]Z0u=^HyR$ex@S*B#RaDUI"cRO=MJ`  R+ASTiWo`obPn휵Ll('jE G2E'L>r{ /< fxuP%S&_WQIr{n2)V@}{^mvj-OT]rH {:͢;:xד TTk #)-qgnw!wK m!izs hh7Y=cM۸,4S8yko6 Ŷў+oJ",^p,ؼbgIُZO$ZCQ[U4r$M$=w]\s+gbK1,ēʼn$rzH(" *0=^~{ߺ^5SKUNKGsyCvmr{Zo8}nsr"/.`A@uɏMV>o,R{hfoԆ>x!hgȞژn X7MMf>kD21m6(7čGH.]4sybn dќ7"#,to6G'SMCd2S (?,Ȋ>6^^EknG,I:ۣ\1 <,zڳ-GNݕEn, 1<ݮc1 K."#.f!XӨ{ rrscZGpԍ4E䵆rAg8\fXex&ݮd#Sĕ]݈UUx*)WvܴN Nm#}S ^kI qQ}7=8.}c$vQ 44qd;}6Imm}`$Iw/?U_Np²Ju-}9R[?^o,v. n3,mńZxhhf>PXtN6%)cip%($2Ei1EĚDbBY[_>XGc]ۻ$DTJ7Vd)Q)IH#R FbQЏY* j<#F닺ƬʈYUUQrǀXQRz L/~]7nfm|sZ:5;X2UX9R:}A>:̮'uNq_<7PĨ$7WѶHખV%t:ZMC'}N^G)scT(1qPX!Btᴺw _c>C23C1=\m}֍ԭ7M\4:DB&ʉw"}wNb{:ėi &G!WRK#"ETiP35nc W֛|NwGl.KˋYg%9b3^8Yٽ-Cqگ3G(2Z@J2@6 gnEܭ<,Ņ U]jӹ ><|Q_Y^Avc{+uI6'ab: 3U*eDH7eiw~suICWpvQgQW>r&1o,K4JNtksivAEΒAd.DS[#*ʨ$?{>v~^+r1nO$!#+K5(JEU[-_\3ջcxsܵ2xlj\EdbeXJĠ.oO<9Yܫ,k{jh7%eD$:}=;Ϙb.l|ЩD5IB,I8!^wۡ?W!&7zvZzڼ-3}#nZ:tաcL˟}¹6_ 3GБP%(2 ~t.K\^=cuK'DnG`f)]멱lJrus jlimX+zXٹ.Y )$Q2A,BX3j'_r}d͖qtagy%y zde l|==Qfٙ.Waa̮S(2[$0~6jsMx!)$|N\b)EdO ,h AҢ4'~m{eo#X#22B$F@$կ|kZ=.[:7z`kk %KjS7OMG <%APG#6q6u[{du]+̡lV!]rN{V[G4 (gS,;0>rBKSHO]:+>BtHb>O{zS &>jF)MmX2 zMٶUylbi.Yo<(5ē+Pw>j=Ϙ!7 -gXCH%H7 44S1A?#<·rm_Sߕ[p*Mh)JG.ܮI!$qs /ΞbW,o5mfa"OxZ 9#NOښL d]חov7"&B0D?O@-BqZb28>_i>&#$Rc5ygV!R(б?A/#^yeHY݈UTEUU$ԑqqogo% 1)y$v**$V#K*bQ6Jˇp~n@]62F6sPm9oiSrso,Cwy)PC TTyZ0Z8ir#-kMncIˋ[8F+b s*迋 >Mn;15|<ݍ6TX=M p_G0#R[O9;*Tf>n&oۭ&0͠([iZG7(F/skNf捏kۋr K,%HP5T:" ~0Kw5QPQĬɉ[c%,(*v=5U41O,~9dowgy^QHBM:'r%PhܯcTn=c h^ )h،0⚑fTVweD@YUU噏XQRzI=X/[]_UJ*}Ӿhf#PsM$qITU$dK3Y{SCM9{=iu*L bPyd7B9MF>{~FmmW޷5mf$丣WiHcWۨ?^TTmʯٛGN=IUWWҊ:T-X_0rG;e5n[gKam ̫*\H`9 ~r۶۸c'`EEUZ*I g ueYmewV w.׸ikvvKcûW2 [$3SIyeNMWym"c\[ fjtNE+yp9v۹#HRKyї‚X$USR2If4w̽C@띹z#wfb%+rH}e{{h4{d6G&q̧Y'aؿr?c;.7n. 8^?׺uhjjmKEIE j]歪qOI "YePԛ{~'8QK`4y׵Lt՘*ƿ lOq+Vr?Yl[3n쥣럴ZH}u%')mjf665h Iq,JAw`h Yq=F ˝I,qEIwFb#TG)b*{`|r13v VsjKedc%vMq}HH'kzэ"kF/v>v8d6,sSh^"y7逯]GUpCֵQԫ5Ң)#"^aMygSûX4*(Y$R22͍{yf u1,rJfPB ȯF*GVKM_ԇ5Drx.C&q%.&W\zVyXZ4>k?VQn~6(^+}iL~ Ec1 QPϸzͳao 5ݼ-Š|EiCI{wP+oD汃$C)b n$S.|9?xy3#x͹߲v\Fe Z!*Z7%nv|l;hf>Sl&Jɉ做;ɱr0r{ 巓IѾAQH4fѺZEc_WhE Iя^jz:ixGWU?1WHtQPrf4r ~YzS#D_|Xr!`By" b%c7l[6gY췋mQ흕$Sե0j5TWW3V8"y\Ef*+AMwv#oP['"O3 >@T!ՅgTQ(_Pc*=gpxe_X71UWS o&}Ƚߌw[lT.&)^5Xz7Ja#5b{WJcvOGÊpc4G 86bez :6TԴHI 1[so6V:H^ҠVi1R\@OMD>rTߋ=OO{m==twyN%Vuv}Oӆ]=cOޯՅ8sLj>sw.-pE;J*ˠ&_uG[NŊm@?0Oa7(Sṷ5ԓ#-x)O_tuT-?U`<.֩%buB}zwa@iho[C?w'ձ1dZοʽT?z =ߛ2ԫSE[R<&iyT51tDޖ>܋9(d 0xqh@.9Eruͳl܉iɒvi ?08R5DW,0K,TI-L])yP3KPO$}gxy#B점A$ORpĪ*;X֊ 4q45{}ӹ輕FynLYn,zNs$~=Sye߯9qY/yF%s# 53M߯bMeX,"E7s\[d"}o+ɯ훫U3tj͗]Ukf Vuo`Ć2դic<{ݾlbV󽬶I ЕӅ#99fܹ6o'."zx3E{zi*kLT|~ܛ/]dd/4`)KoQS@Nl 9}nk-^BiVZ9 F5 Jr8؞h-¸1]~-Fu.k2|H'afS?~W O܏=ۺ̏ +흊#t/z3sǷ?G =yEї8smOTOe_i7U6Ăۿ^]IӜ潧'[fO\TωCIS#R-nٝ=fڦ|-T24n zԂ XyWqmzK[ ٔ0Edk9 kCԟt^Owh./,l`hAA!R2[HjJWW[u˟6;p^?r]r}p޽mKNԱͱUnf9aZzaZc$p9u[%=r=ycimfdoUUĆ(ܩU: Dic}9nyX!==q3Rnu%@n| "L]u!ɯ훫 YT|{ޯ;t_ϺNVr+6Nv*Əҫ, +>g7Wߵwg$NEDhy?}Dno#ArhI{ JSܝO؝YX~m iRCWxDIS᪈l񩱷ULF7 ia E|7e>{D܃?cjκgjĨ1i-5eb0dh**1YPNԕ0H;7Ik2xةSH<p=v%tYΨXSun{C)VVR."} Gׁ u;'Ǿ;o`iIOcD zHȔGd5ʭR)F~soѬ6iVxPhx^HNCo=s6~YMĆx+ \OY-̂տ&wܭ]SCQn %,;o#X%K$uH6ɞI&`ߺE> VNp2,#E ImbMqO{@8LjZ6F ?u]$ݭ)02U}3\;1XpEYd)If&V{O]bRk!(KG*1 ~BSɷ ewQ"No I{{^q]'9U k(1%;9Pp{fѲ^ryѣjZuYUfsǺkֵ u)mi#JU RqrKw̷:${|ywf~4Vҿ'TTaPZ5R_d^ >omޯty\ Y:|L9_F!z*YUC͞}yl.O[Q ʲ,lE<ĒۼX Dj14eJ4xڟ̻TV-reX&b6}y~`y $]xv# _Gw>s ߯wl b!%+< 'd 2ok[}nJh2Ae0*Eé_yۮDpD^7I5&`T+F?SwB/U/cvW;tj^G +f QJz(ٕZERcMr# 9}>\ 7TAMRHBG2UPC͜[;tiYޕċWB!,PXO>61-S.R}TiiuhE]I0YY.+*2|{e=R͢+2m{*5+1FTP@7<5ԱQ5M A*FPi Q]gzն>+wWf{lm7L;&p1U5t[bҤuTdU2S~S<{_-8ݭQ4j0T++;!2^lrm2Ms#4RgUh.T%Qȣ ͩ6&;'x*pip; VcyJ |s恚9cn$x6I#fGRqSyw]痷FXڕWBTUFK# 23)[No]L'eET>L+tMMS[UIACKU_US+RPQR4ҹ Q31A'uvvQʈ 33I,I ,PDqfv!UUEY% Չ?~hl;clO´8|ϳ2OSml\dݖj zXl=Rعmyޭߕ,"Ch[hNN<`97X}ݷ_jvkDaof3cS#,Q5@I[P=>tƯ?#7}G=#ؕfg|=d2bh("̖7 4"FGn*$u g?\Z~n \{hDrwFݚJ/43GW<5rH6$6Zޝn#hYCP$ DI( mJ^{CvdxZ71OP G P*::u{{^fYȭCPzjR~YF5Ru]1(}Dpu} ĥ/lpw;oS=歸=K{ {Z5F\T_ /}^^qoi;ԭ[ۅvS҆sN |Nܴ?ǭɕ:lf;vl5SXi)s9䬙TPGFo{˛ ګdVrNE%iԏ>ZIapUEjxE8Ѥ2smNڳceun[D8 XCHcssӻ %Fs6ɱ)Z;Cs6ZP"?/'+EdVmkv&jUoE*;Ǿ|u KϬBhzN:Ր=]]>Ѡ՗\}Lj>uap]Q_ZX$}{q,k';]9Ht Vݚ4Zyh%[=aӝ.O]0 u:(EQ@>":#3aw=ݵتZM6CP`6_>wݙ_sUս]uUV h* =`KHBmk$0[E I̶d* ]`K]%fsifP)"YT@\EP;r,=Y{/Ȟhit=6ij-G ̈X>0":ط0L6gvA/hnDuh;yؚ:oo_i컮ռ2MZ fJ1ФT*tn /E&{vE&|)j<(D$*$Rd@NO9'Ǹ>_ `tYh`qUexiBŧHmO F'H}Xs~y+˾+lXC4h%$}@BҲ+PoAxsHtp>m]++秦njbim=K@pS`r\sl}nV8i1K/E., Y`A&O*}cj .{vW'xy9r9F+@34(}#>}=M#[eŚF0!ܐ>c޷9_l簲(h)|8cA$+EXI9>}U[' ͲǤRm NlZ* Rکb`5{Os~r5.:oQX۫%ʨvbĎ,ܸ`B{}Ƕ!K(Nʅ~sp4ƥ7:YXAA9edm,(GY&A=w{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^\e7On2:ۻg6폑B52{O>͉j7XDP+r;g;Ԋh,sa8ß˫f=սu~>SݛwvvfEG`NCr?⚢Dz$SJT$*6K}y9K{v=q} "+;(àȬMPuv[~a竆M5ŭ󵤊fTĄT!TAv՝kvJJz[ㅋi2WGyqnzZ&´˩%iTEyf{"+"E6+|tbnm<}7Sc:f㧤肓'%=5R?|xw[lOi(б *;EGt/#6_/e+E oVHVdǭz kr2rp59lfyJ!<л_w}|sn%I,H@5;fv YcASeeeǷmoQ"DDT}t=}=No~3ymNAih)kjh̪qPD-墑ю{/ZgrTKFX*T@JУȆw\/o%g{v1'3(jN=ʮeR6K:L/̍ ӷ㢋FcEꚦc}Lm7Vn֠.F0Cȼ_|}/9nڔլ 4ҸS F'@M7Qf9>=n=1{OzE^G{v&"W䥩40Xus6Ž^7mEy)W2L=J#1ch`S"^_ܶ>l&7-eV %PjLPx re/N,KWkomV}]fѶ[zmM&1cN'5-MkHPAmӝbw}v*_cYk!*8өk^K3.[e#ohmဈW"Eѭ;A:٣ĭվw=56Kwc6;õsv7ip+\h⭩Bj]O_ yWƏ{ q(#UѢChi"H vEi_ls3+k]mfYm]0[ZKY hgTQvgoN lݵ[_ i>JLnC!& tBvw拾kI7NXjKhEҪM+K_vnM-gmT*jvr@ަ s[p$-tD)~2t4̆U{˻I]Z?Ȏ0:26-o7[FJ$QCP|˭?_T ִkvVjJ,xE ɩ~9Ky\7Y>\YDڶUƯ"ic1ItSj7u!km/[` O]UҴ*ח;ngv#1cXk"Ը ʊ2st /9>X/a01I,jYX]њ& %Hn<4BZK,BY#FT |D` "gV/Ղ{_߻ɗݝ9\g)nm%vO%$e1E{_>z"^ߧ[mһI#KLKP|o{LQ[Emσ$h#$1DT~.Ndȶyw-h zuF`z(3?Qr}* ]y/H;ew\9HnИxyZۅQW\hU{~?sGq5IW40dT4\_u>RmiW}+!ol\`ԟ>X8bGs$$o$~,nO)g:3XCyj7 `v.;zw"F~!\ت<+PV")Z)2~~Ro4lS(1:nMa>F8֒N+RecO? n^F﹫[`J4%G n$2%M7Rd'ԙFTCsx9 Sh]oNh*$RFc5q tSШX ;"0ƻi6ɸ. 0WwbҏV*LmB4%#b.93R^E6qCMB`C :1*5$YM_PgOmςۓ7V?WbQn>79$XT:nmw6޿cos"KBc]#uOm7iﶳm?Mz}y4ZӎQWj;4QʟXE_qXJSiե+7Un(7;K3UBLmS4O(m=U-dPٯ7^Lw7bWmvǍƠ4D@ݬҵFUkyy9×}kqY#Ư cx噩Ur de-ǘ<ˉs3Yy_)˕?|>sn;kGڔřTiSǏY+ggmY÷YCoEH"Tt췥={ߺCOP?ӷV=y#4oC ~MSFCy"?/>,=2v^o ?ʽljfKH5j@GvzJo`O^b\qۣ~ZX^x%`Y)A;A+/ |;O^׽u~t쨬@DRO*'o{ O[A-Y~ |}۹טWY ޓKTp 6@V~=?.{%{lkE {rx`r /|7v>SE[pE0AT1C֪_%۟"Mw'cTOQtԏȢG?Ǽۤ;׻Ǻ[M^dphC~hT}u#}m۽l8>NaFa3t6|]$z'5-֛o>ܒ@nSx18zڋG5]u]=<1ŮVVA <$}}{Ojݮʏ1V7f4̂5u;f ᤎ~gn+krVC0EQHѝD C*;w몳Qأr(%;kkŅےT%VFZ"< ":șٶ] E< Oc yIH6T絛<;0sD&nR8HYT Ko:목Vֿ-_Z'g'5UyN/-ϗI%CI~C.Џ|wmMq{[S#;1%ēF--V$V(R5^ʔf='ww?L͏5ttwYZ+2M% 4d)>V/$1Cݺ/[yNco6I"A+]WI.̺*Yiq޶(Vwݢ@UƢH [b;?2;`5,@,pUol ^I5NW{A7/ʁW04YH N'\=Ա[iZ8C>dtn??ld>Dv",uӬռ12n<ޙq2邒բV@οs/5[I4Y@Tuy0C T(Y+:K}ke1_]Ǯd4x qD:՝!Z~`eJvKfã7WڸYH^$dJauRdT_qޯߛtyN]'#a$dQ.eZݶC,4o4ᇿwh}x!r^gao j1)Bt+>G8:s{'p"R`(%5V VePDrZIie}=*69jV]^RMC jmm9Y{{wwˏK{8H5i}­ "e_CSlOz/v-4e&**MY vOym;cۤYV A R[Ē:2/hD!nr{#EoqSXQ\荡HՆ̀f3-vwaהS>较)Ű/S9Lux @.TqI$8?+qRHҭ>#%Шe:&fJr//074?DܔmUW5+2V%U@6呵Yx6ds[DkoN-P-LAN$eT*H$m{7/-yIWoe{ 乒׏H0=F9y;WD G[ʐ#ӊ+%sTj{#^nov.:q;z=na+ꧧHyd h9yu워ֱ$q+HQ@R5\] [}!/qy|Q$1-$$-bHPMnV%xy(37K3rtj%O<ӬM(\ wvؓ 4?7^%4; d[0w`(:C3*Ʋnϰ|l\e.;hc \JX"P+@:ov{IڹHЮĶtP7]1Z1 ՎR騯%,)(Wb.kx=n!bgE~f_X8xȈ8[=>zAO۫v4]~P|=ēuNR&+m͂ _T/aiYiV QRFqVo,[8m-a3G[ Gc~: wퟱG(Npay apF"Ht]/u}3 4K%6wH+ Ȯrhh[W=ݍ` ȳC⊚S, #~]H>s o7ލ ?貧:/E_z:R;*5z#ɃA/ ? :Eq{7w }jphc"Q1c >|ݺ4cjK0GE :5$VIdFdu ?+pG6u)cT_,umj6#[# $teM"Mg;˒V%lmMU#]ԅqАjZ7XwYmWhuƣ[ A^rG)揿/$x Tt^e@?AhM>_ZՏk 4 ІY:~[ lXݷb|&(Q:#DR \oDkv 2Oϩb=lsWvyFeU#%|MWSA8ݽ^Ie4Xo?Z>rױK??QұJ8,m㙹\܎Rm褅 GV60> iF:&5g{C'y6ZɎ8tжzʀg/3UW^̞stϿB+Go'DQ.21ikv7==~Yv@iGyrqT҈ 6;>=n-U#ln֯Z$pQFXcc䩎PBF)ycuOpےXƹ6Exw.ӎ{_p6W^ӨσoxPf4 ,$*%]>Whu٧v⤕'Z<^[qu-%T-4̒x?{sOr}-r 춸fSTY$6tz1REJR@z>r++cv0B$QxO#@?7qf;0zdf-$)S]SKF;pӲ+ Z7YGg9]oôײBI l<)4L3E =(٧!r+L,hG,%e4ٝ3=]lὡ[H|JciM جCseYUdGyg {}xڟQr lh »2 ~>Y,s ! d4BT #N`=rzKLl_n?com'?:ve%entˎܳbfsstűc+kiEgu?^ϻՆoml]0|Bu7hoy3# 7^KOrTJUp=/yw^gz⇊Ҵ~Aui] 单9ov]}J6MzC{ ty׽u~[g-NTظ͕E}%D-|wo<Es<;ZʇB~g=fB8.B>`˫?_ʝ`Mu^̆)*/km|t9̖ZuVJ*j% &Joߴrw=+qZKhb@4$e4?YcHRHgvϻ̈fԈ*ҹh]$k?֌ MJ*3*v;M%NK3e5R_<~$r_7O7u{;IawŒIb*Ġ&$2U"4^>C,2!]TFNBZiwSz_0Es85lYf(kyē֫ }ba].`o+.x."@ԫEL}Ϸ7^MyRgڡ rFR#7IM2u,4,Oqn{w6kv7_⛋).g ԉfp>`/7kɤBy\UbM>}dݷm;ueQHc_ʊ죥{ߺQM?'۰ft^!YT|z j^gevꞼA ѣ͍/H>rLjWmuNyq/:@g!tOR|~׭k2<Мb0Zsmm؋ߖ}ܛ/#'IsAM)tM>n~^i۠٘e-kzr)J(꛱9~bbi~FT88U| ZnVh%_FG ep02ʿr덾R>]eDz>]BKaXPY#oEe?0A?GΌ\f=M틍I_jfsԌl YgZZ: 1%"Ϻ2[_uH1)hU0k0c&XjdL{!kͶl;FCX5b57W$w>||8 GIݻW[{DT#UeW_*ZJ )̭ITPj#Q'l$%M (ZG-[,(؟w}Teu[DdEc4,k?V c RXH i)(H)E5) 1Vmg$R+*A4#ZSϮ+#x20 R*H<)^o?,37c|| =|<_Jq9饴RWNdHz :G_ܒ;~iZHjy L;5 E޴\ׄv}HAP&867 ҿvKcq}}u9b (ENJ)$/wies39ka^rV{ [D9F8v:y"xeTVru9z彂 ydXi uK(.UHPYAjgDٶeeIo&g$ i]cR!A`X$ ?$^DW[Nj-uX۷_'%M׏}usS)_>}vd?_)_.9})׿>ѻx{usL[|dǂ`w5b5[W(# IMwm~n{r۷zC,cU2Sp&cEh>N8Zڡ:MOqǼ~8=.O>[&{'ozCsǷ?G =yEї8smOTOe_i7U6Ăۿ^]IӜ潧'[fO\_uK6]ֲSIO`Z[RO?H\vG" >̢ˬJ)kSoOo[GXN_ƌ.c3=x<[XMj6F\e[C 1MhkjU7 /W{V6sn$ԷTUTZ}=ȼ+DѤYD Б^9})׿Cϳn?(O=uyόAN߿wïwgغ<^S|;Fc׿;3Sul]k9^ttxMϾQ㩫y#YeXu VabyQ[ͻ#Gmwu<+cVdW YC 0VaPhH] 6W*Q$G*He%j*Iau{qDOSK<5T4OSKUO *A-ͳB A VUthVRVR(U A`s_c>\~:0<QvMŪ kx\sX/\l݊|bԾE|VzH*bǹu^Ps&n6k֩ZF{zf-QW=?,6C!x-jW~w B-B:,OO8V0,cWrW^{˒\r6.iKpA@{Z˥o"f2#k':AĖ0{XHRw \Xehj {-_aZfhK1i*7e{4jMD,)Hr?Fc yd*N$A37ٟ]s]\ώNKQ|rJ]f/Kt}kWomKճf7VGcW&#^20Yʱ Ir/p"Z&$vW+`)V.Fy_5淲5a[]R` !.9SP[9O僎Aڟ"!S (Q8!k/CoǾl=vX5K7n|4}OԆuXO6֌QZ( DŹץ}=TA~Ԧjqץm nޭqXFj<!Xlfֆ77&'@I#n|.ݵn 4r#@FU\PQ$ӱ*Cd.n$y w6Z**zSG+~ߛtomi]g%鷎c [A [ĕ@$qO2wٹm-exĖ E2,`[%Tdw7]Yrߘ=eKLmedT3@=kMٟ#;opnqr0=GהnPxh1'2d}3dZܖ'#Nz[q^] M:vER-1%$I1#I-{w?u2j]qX~ dlnaO.L5U (?a1aHo㱾$ҏ޺7-q&@%֦7C7 DRDžc` hkmjsw,pS#DZ530UTfjtdJGv?bh2x ןs;Ś t9,$Spg0sMq4 <`<&^GؙR9"Cp71#@ xq[$y9+{}) ;i ^Aq")%E]b~]|k>9 2?}uy E dP,4"UTqә9zy.$1@UP:[m^l-$UQ٘՝ؖw%$rsp'Om>~ힷٛ'>ݘlF8 }}u/KK"ek**SI$ZJ=>>rs({g; ,j+[]"M ,؉;zoOg)-}ep0@UyZb+L'>G_-U)e;9ZjqF-V́&Urm<`[+2Z[TWb&rid$Ef'l<uqJ5s#SU:])o{~w?|UTQOǜMw. ,:Ca*㨫ft'!򶜉{WܣGlPF&bZqgrD!۱;r4Npl&+XY 3vmf`T́L>Da[PzHg2迸FSii4=G/ZRR>w?E:2˨X21I7^UXr#2QԔ oNЕ>Ee0ݭ۔^WE*1&vUg uhتoxKUM6T{Jx7Vv+A"M (7͌o64,JYNGeΖI$7dEKy}0̤$2E5DӠe|BG5m$]v"JŽeg褐}ר<@=A ӇЯzo>ٚpHf[Zne׀:@amA[do/]֛Cw`*rrPcjbCc 4D]=y>,;#ɴ\]4dRYQ ck*Ny[{ϱ,7+-mVE P4 D-[4j9}Ǒ;11pn\kqejfk$j&r9{$S< LYڞE'=uommA d$ġnuAaNll!z}QظJubW~Iu xRm{DVqY(㒿&\,9=rs \}dDܷGdZy/uLQ$1G $Qh?QtWs#n$>]$׮~ֺc6vmf尻)m~H xcG]o%%FWTTJ-] êpq9+ywmΒDw)ä?繐=sQm<ʹ S_#3i3ZR>!EMU SǪ`E':ڛƤ$vJ}(;Z~\A]Ojܕ\j)A+MnI%A$zMV:oly^vh拂kqgڞZU@#ƒ.]n C A+2xt)l)۶e,,X=ۘ oT.>djV_:sF}PDSȑĬ#guei^$o4Ncڭ/ RAWJO\Wnߘ^"sdؽ bLmۅIUDJhR N$9fnA7[^"^,)@z0XƽxlϬa7vv9ߐmmCshdf #VB̾"H]IIJ~;αܛ7Mw+g72^$5";"Kި"sPFhoVʼeϻ+{׊.J 5,r伤/̼yĆi6 ݍ[eԾ'%`u*MUQcP*{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ձ'oqxNf28 kG7#hkuoGZ-5/퍥>ۑnSCwGC c}okLJΎ[k{#vVB&+ P-}>q2sÂ@3O#Dn{^׺ʊ*L{کf 8u kUYX+?5 7z}PT m$jN NnVG IZl;MOmKxHW &/u^lQN]G {fKwaORx֩FCn#Ew?Wpo&t($z!uԷ!OGr?(rpvGpo#olݵUc'SP~{ߺg/[W+Y$ =2G>'ͦKL(mV9p9uFSQTQQΪlcjܽ-@V G>?Smܓr Tn73NMrKwq)v,(T^ }[$'ǔ^IO˭~il? Äv͊)+压j2Gժd $﹞kʿw n %>Z:´ӮN{94;M >(2N5><\O}uPl]~Ҋy=r; &m:Ib_}iP%cZҎ-Q傞dm64:W{RUӡ f>C5zՖzMVW)3Te2ՕylCOQT~Bwoyv'}pkۗ2I+3$Ա'O Xt  }mջ?:ΛPﭫduhhFװPDZ rܼW+PoPYU 5j'z%>XǙ$amv,RnBBO{Omvq}13*+;*)f'.O0 p>?{c= 튴]Y G29֥2}(~_j~V{=>RK֝ڥX<(^܏=,{V*Gpv@4<𰵞qhfAP<ɧ[7ؘ'ĿJ HCQ-){*h0$[yjs>,6YsiZRJX|q륝{ߺ[O)U^ׯ)z$]ՋU~ Z}4 _گ1XmыgP%n5n-*\fzѸot)62@|kֳkwloPUrgg_b1t1=UvJ6E `VUaoEso*nꭅwh)je?fbIi7'v⬤ًSem!bEI#{=䍷Ȧ[F䑵V]T_mK$vQ%$TG< ךoݐ]qFn afU=_x׽u~*& efamcTv;WpY=E`!yIɻ䜱͛g1ĥ heYYG~Sد0ۚx]u)l}!n u ˮ~ֺu{EG:z1\Y}Y`̕YM fn ML)rײ^{FʐA%ӭGk 3m@fhҠw;{w34HcSOԺ@AZ˭>^w/?=ڒ1G25ٺvmJ*:Qe1RgKO3 /{}ǘedJ@*32- .}䛯r=±ؤ =ۚ-!flN?MI,W׽/؝:'rW_[L Zͩ˅(*NyzHX_fgmllIpãxڌGME;$g(!7X`.^Ϫ-Ҥ( UVw6#R"J%n?'zSwrM2 ^eٽs<~ߕAJ*IfLMQSfvqm}{,kj=̊"pdvCi$x9+,.r;4%.XH`ol hAuU@$qaKoӼagq̒uٻ"jWVɾ2#XlP~xy_ߞO!mV֢ICtyj rǍSIz8/XQ;^:U~TMQǪdo[$]MCI"qװvm?_Ȭm(`q}'k~^MOg-vq#-Du} 7n_ٔ.ay"+gU7m&#mC6jH&O)NN#mD1{{wX4V C+hR`~i(^#ٵM9*n Ig}j?u|]ܸ҃mzgƛg5Ȼo)-I9?Osa ml4xasvKpxHn.4X5vכrr !X@ǭ};|.čXΓ:tÆ>.J6* 0!ygW1K˱S7EZЈTe0diVM(&]~c}~h k9Pe(Z6oV|vy>ce==r) ,QY]2dSӠPVq毼%{OʭܢpuZiKiŕc‘b}h I&<Q 5Xeb#I$]Z++r5p&~o )ttg ?7(lw[w.ZKs GEo{<^ CIOM:Oo*>yOט_ v=C;kn,X)dL1/){9rxk\[Z")H`5ҭo mO)8'py* c4k娙 a}񯮘l>%7;s4S1|v A\SE,6VXuQc%e`CJ=?vlO{ K[+x(JB!ܲSP:=m7i8j⠂ad-h?Sjp؎׷e]GF>  pbV)IELG/pڶڽP]ܢUAHvB((hWfrlw{ۀ$ݛdOJ4 Z@xAwuk17M;IE՝qM ɾkW`N:_r}ùPn<ɪ=B3 @#\vm(]a _Jtݻ ]U{w$ZDoʣGQFe~il1H"e 8sħi6^ֶtPi [IM]{¾w?̣믇dBB4sn ;ň/aﲟrS(л; -q]*H򐑂:wާx]ί {UQ4娙9kw};#Ҥ1lţI0(#~kܹR[q#H Ɣǧ]ضxywbucX$WZw>뜕:an 7J͹u )(eϱo^\xH..̌*4GA_*=9yG۝mDZb dX|W{otg\uB{ORLP;a65./_&R|T$j7w3mmܥ`X>tY!U%4HFa7`9qK ҈M(\u8'Z15Uqwۭ:FO%mvucv0|2 N'j}.?}G/lCMS^3h)U'&{+kxd@4VḼ F}Dv/џ1XѷacV fݘAuyųG̷R$!Y%۾}.d[kmqrIJ,y XzČ^4ҬcO`-ywv< `RW NuYS*uZS8Ah vH(яP~"*~ǬAHզfbf+uu[^\{叉xe{5-5S8Xc$H#AJvMo]Xf,ŏZ׺u7lȝ)}srPT[M߹)74[gs'qriT4{mU>k=̊KY߾1q ꬰfڊMt}]OjhV-峋.J#[CK%>?~>g;lѱѴ[ۑuʤ\5?`Gb:nL(Dzm}#dV6]NK)?U暠!h+X\]3?4d]6n>oeJ,(дo3Q;v/by$@tt1CԳE4{&#dw߹ȩi)& n dF7/rFci$Au%40-z">$oq%|6fa5\V]So}=m'̻/oȲ{zV7c*޸%3l;G'6}CSԐ.i[Ut/\l-b[[6|TM?o̟,]PcXSّQ=~LV&*ƑY %~}ܖ{Ƚں$Yi W:Ǐ4V{7xSR\4u?>~IWZ'خq;5K||TWm<+,$7EiȬv"ȠMcFqỷxcuHG=O4.A"=#NFȆM~85$#Kz.c!?x|ZlROnli*N+uʚt"9*Ҧ(ge&:X'~~<&eY崂H_1O3fʮUcL,X{}Wv[FqK56~KXrGS}9Smw A6nY'ٔzItk˻}޶S;Sݿ-sFO^e}Y뜽iwc?(hLRvcau7W?*i2ه?9v^VWHʋ g #?0AiclvYk(cs _Dwu!u~{ߺ^׽u~(6;/ٻo93RWWŅ۸ʬRJ,]3VҊ^CI+eQsewcni5WaVj*+3PI{-.c2WX3Vb2zO++2"쨂t ]^DpYp[*mrfseYkv䢍Uc„7RdEr?s/o`qO?Z TQ/69ܵ豥D\: q~}6/j-9Vق>t68j@<}}_q.qvW!H*j|_PkZZ|σ{WˮMIGwM$Mpw^ͽJ7%n /Շ?ֿ{{maTn[]6[KJg_>{ 퍺S]-#+624˫IuLJn!ݝ }+C6Οmi?cTK$r-r5X`jHIr+C1}̶כ4Hm5]_ê ëLigkv>|D%o||G(p<%WpQ7|Ӽen`r)[5l̟IO*Dkۇli&$|tUeF4{\a}Drtd2B|.mNc/k2or?Rݳ?"iqio_ⶈoMS-E7W=ٿ1$G34/%!"~( ŶR_.ZOvzl*r$_0цw_i%[sԑ>1hnqOU4ӫ M}]T;[oM" AyP2x/3nNȍ#Es#ab=cgJF_s-$hp Z!UUi_6͞s`T1XHz t,/^vxuYW8ػ[T:]$܊VG?@}y^pL7BA%e#!2̴@SNTۙ ei4ׇUxl! 7ŬK9{?֫#&n}WANkAf>Ig{&gbhu.( 4B̖j0p .t?vZ2I>4̰+I+T`_ߣ?] ESKI|_gB4xͯ9+ic.|k%tA<'||/r5VV{}--ἌL?z߿&Ihy}5Vh;O"MQ8[KPce.|ހn8VT}b( ;7Lawz!z헲z0Pxj xI+iHwDDI.߽No{ic1F+oEhְ5TETDPP>{bijLI=r׽u~{ߺ[c+I5rqϾ}kTMM:s4qS'?{l] YLxQjxUwܽb^n-P3[EFq֪=.;uNnչw,9Q:{2no{K$F.ԚmvkL X!}F>쓥qtG:u:<9̦i#Fk|Cqv>bX)1,QA`"-lk+@ s,p>Hue\`V5g,lՌ^ZnwӝSWvrje?sc`EǻUB*jj{:ii"Րwkr\syl[QK.%GVx.f*@wޝÑ=yG(v;ojΈE..T{{VJHYmJ1E+ Gxq&qr*8*귌OTGK,0VPOP/OG5@R$XP[|԰x㼎IEUX=@§rJȑ0iRiɓ~𧀿5U4:\>Jhi~O)ZO=p&j:uOJox⾿N鏝߾'N{Ix:7C-6#1jjYI 1GE/tl%7\͹B"YF. hgP/m_Um~ZODgeh7j&⢩xyd޺WZa髖Kj9uDGn]Cw䂅U/Zu7}mfWdÌ{˂~}x׽th>̮w檤 6i}՛r-I?V͟w-{lE^;yӵqs/?Q70ݐ쥄WKA=r/czbо^tn5:3b81"uY錑1=Inx&k/Pfkw ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^$'ȭ$@=w(+ eO;[>w;Ga̻5} }K?=P 7*2.az?/ oG&Lg/jr+oࣤkquktvݩMRmK{>Ϳ > AI>{^׺Yuɩ|mM [;*P$X$O#;_,H} pG3JRp$tM{\˻1M[OqgQـq$gq}hh۲7qc|)kC~_Y~|-&iDsonb[=T KSU띟tMY7i.ska4ӭcǮtr`z/Jg33.#5l*u(ex*yb9hCp$V{^Uc}O+1C%U<A\;͕GE,gYhI?d>8nA60zYL)N)IhahԈ\=?mG*jڲxUm# ?˯`9n&P+ԣ?A?^4:.GJ=j'=S_ZCdrC頫`ϺwW^cu,D;ӷTAV3L dεuyGR@׻Vdf$xX;W>Q䱛⥘9<6d\, &!*4vPw{[\n]no+D":b4L w;r7=#@% Q~Ҳ6_a ,\KVV#pQmx[M5#E&J3#XoCI7[mǑЛHq%+IqV+cî)_pqSjadi~#4]t-58OE# v T缸l9]i&wO6E#0kҨsopn}9*eV vd0bs4%RzXKt#n{6]%k-*ѼlѸp ;]He$zʋ oܢ7[eW1DDBH֌(Z9CzI3Cs#F9#s}op>;Va(6Ue٬f8MdS\ &|+$nvͣku+Qx׭BX<6bwWmg0-Tܫ4n 7gݮv&Y#7G"9WF#<Zol;X=A-,HH=8=Wwvظrvm@5^A"}X>#ok9WdNe,{cL`:Mnql{Eq\7Xcig曺NkgQhxwB0(qwƗ G~P }1+#&;S(G\SsGYB|ܯiՇW=j.QXKQ:$FdԺ7[ r* HS|@A=t(iCֆ:O{9Yhzgo :Ƞkd.oC>OqU6k"ڲ\"5Ju}CG-E8 n$Q:1Χ|>IGklmɽ?T,x*5$XZ7 orssFhO$>E< ُ b#e-2>D-}J jV*UR~6:l WO#Fccn|^Yh7q<^*MJWR@e$Q}zc<{nJ96BKqnM`jY+|S觢wc<*.QYͳnùól=êGjYݘ $ krK{ku/,0T% uKKNvw}mu:6flv沚jFX]cDJU^{w`qKp<;x+lZQXB*ȱG07vSYl s ĸη(FtJMiT̓Z_Ol9+i: VMWR?)UXQӿ4) 4:nj[}[&Y-c82=2JSQj;JfDZUˍeԋFR&H-#%5DcnGcoeOݰo|u޽S3(iiݓnoJ׌o'_>ګb4x[U*3ܯ8~pRmizMp+~ؼݣ}ž;xn:mV<鎅i[Ef{s@b}yq2W$؈W͈r'\J+Kx"ƾ)L+jlEns\o౱| :*Xݝʢe9v6hZ8AVgr@ms`FYQUI[UmXvgAH_8NyD/ͻW-IcjpTX_B!aߑwm".}^p P 5g^xzmjr_%de_ I.Kp\gwlg{=_ fl{)|R;}orޯ`dnnyv^Y\RYARO]Hl6m<+h"KxpHhT_ϭCgWw|R޻fl=']Pٻ7܏)T4Kut񲴲h ~n~^6amGoosʡ.!55P|]reo7M.O hu,1B#3/ߐ9*lko<7o!bmPRZ5T$&fP<5 8H,1X+8Yc|\n|a6$/q.I>4LN=0uX^MW~zP48Jv(TeQe]R2#r?#s/|,\iER;pH]؅QtbnbKeN^2J'Bcu?gezboʇiPc0t m6? ݋K G;VH$vԁU*K{\'+rw1gqϠ,FV) I* BA j.a,n䷇Yy>mp@ 4QI]%E22YN7qr"X 8,2y:)Kpl}˟sW<;xԚ@Eh#L=4\nkyר-qDm2n|G$0j?/`>%Vhl!s ƥB*|<쁀!'S(FشpZ_ mC %x7Q`nX9n"BG᷌c5ƒRx=\Y\yiWpk =x9Oh<= )"Νa(RuJFM~_ '/C Q8 `1-Mȶf$%Dѱucc}x3mxmC, )0f* @ucn&{X``FPB2zeEgvTEUP.YJQIfo y ۛUw5!RUl ȑUTM֠<2]%=73n&Y# @A!I-F~Y$Ry >`n^eY1PQu3z|2+!==)$ý{wg@T4S`xQ>. ``{{sL:K˩")p_>]g"NIypgkO AyI4"O<.C,?2!eO< ~к5 " us(\jVz9#&6刢5GJܓϨ}[m9쯶t-o+I\yin)F5\}Ayq޷;T9+wWpZ~1u( ,.O=ޤԞ A>f|d]wv kY6Ggyk]]t>k{˷Z;e~o:ϻ=[] I?x$LO3/{:hl|{M&?xPil·&R]YEC9#H19_י6ǞRk9.fۖ3[xҼ1򺺒R pk9sE(%v6ci Wn؊"JV:YoM#qݛ{=YlOSIRi5: cE̼|Is=RRM#H$"ԄAڃZ_l7.ɴlYZ(QcJ *gcbz6|r_ 6FF]{]}En=$J)4⒍u?2d_h=}$o3n;[[seÌU#Y{r*}f|D[}f[܄NѕXr!.t_DXEH6fO+%kdst0YL uR&/XgI< #v*-=}-G'q (IFΊΪ(]UU0l{km&H%* ZXXi$>gKU_lwjDQlcdΔ/RcQ)[wx]enKQ$q$H޹CZuݎ{wToCJ[ I:%]i0zӰ Ts-5D/$45P9d)"n wJ #XBM 09 P0At0xot^vvΠD> 1[qFYЁc!{A'yĊ%*Zڞtܵ[kgpHl~S~} 1v?gcH5ecg5¯~9ԏ}4s1ڽ_L_6gyKfΰG}w7T۬I%xkV EgʰIQehH ) 2AdREE**EGdy4>"׽׺u{6>Þ;2V[ qP(@O[}/r&ulwd4ɹhV8-]ki,9}٫0FİGw>>IZj]{+v!IA# >3s'{d}q^O$F+_=1iP}Y[_^aF|0Қ|g'"wXԳao,ēeUU$O_|WZ&uNĽúӱ:y- 32d&%h%9 )f ~}y+l{+w|K;[CLĠV*Lb` nAeg{wּCIjUi\ɕxS@M5mܱ6K|geiD1koG087{[:nCLҖT8 hQ*F,3 By'99Kn:!zSĐJFiJh!| =}+rdu죀%+AdT@OPMv'===KZ"u.9{xQ% 42 Y?gAw mዥߌ_(6}ָnefUUG1S9vǷ{S5վDӢlȠsk]5/♤m(tmKK[׸׵Dkw}dmh0YE$hޢYv?UAθFM|Ii+ ճf/XC-6^*~O2]"oc_{g XnVd*/&3t?3er$u?Ů Ꭶ1]PJh!'4WF>!wSQF5%DTU: |Tut9qen.bN@Gznn,awVQy|z+'LԳ/Ibuu? sxeYnIb UC#)e <;}6׹D[G$l(JR=kCѾ'~-g[_X?RMSM7PX7>hu6R`2Ւ鍧x VXr:[4N,-BfGjyZ0*H~~m6܍ΩD5ͪb5<+OՄh[MR`SQ {{]Z4Pu kCѰ~QiVݬSR]Ǐؚ4qfيЦQP3zĴ*>=rvf۵5oGq)A D!2ҬUG퍋pSukb;u_?P1_ dj!\|O!L_e *$hV'Ri刮 ׋؃v!^my@/PQޠUZ$$_ލݭTh fh3Q%B>cs+MiG&Zgb Z)z'1LNǩanyp(\\vy`Fڟ/$Uom2>ŵ>:#8EINxŵ̔ѮA7k _Y76!Vԅ4tY*=+!POPTKU$C;yǎ3eD_#~q{I?R+{@>gSO>M+:spo}$gcI>sl[ ڿUE\H0T*5J\G^A6^sV͎,ִpGJ֪jݿd/n-ywtv tjYk|Apΐ=߽]{[cխFuc"We"d[Idօdf{\=`1BAxd%Jc\OTb;Zв2_:ȜwiʆXc?XJ:h`@o3t}ssR P[<(C<$&E&',!70q!#j»Ҡ/|)"2eCm_myuk$`%hҭuVŪu.2 *}A )T*AYcpt5:z?p|tovnCqj9v>ډRVn="xU)2T S${s>{V0 YhKM)cAMdp$z)ۏ6^-)!f>K bN51u]}t)m㒞*<&[noz)bBjqU_"@up{9[sNx7 Gr,o (XFV DE>}t[_6di[e5ҴO:\׺uc~$;7ѳ(dLܘ=:0t̨UAff6UU,I`4'I=m_Or|\[}0e.55'S{nXAqY]RȹU[~=XwjicgqwO%-$Q h ;ӮZw&ckmC h"SO8$c OZV+rMyC5uɒe+;>r٩J5&UQ`;;aHD"_Y5.\KwI]cIQ 9/ߞ70̤dz*(ȇi]} u~<ѳi&uDyPCkHTO_sۻqS׸*g8w>? fE7=>h@~h"tO|%qA . }`2}QL%sGa>k3U3Q᪣op.Y{Av5Wu pc}$mQVJpQk{? -Yl`hM>mbL!<-'\MWj1ǚrRCgb?6׌(ɯ!~DAyQ8!]m v/>  )OqLȩ4{ Ld?T8E=L`+[f;Mw_^ kqxPP L I?x}<_ۡ2 d>}uBt>w{oil[%YmWdS͵~O5$b5 K\|&.ewF`䬓9C$ƁA5a^õ퍖ʒ$FZ[+0H#'Bh Vew^;pQnnZ 7pH#r͢&V[e˅kxʒ>C i=cojpK-O'c)DcWL/ethi_nf6^W%Ufsnj*ҏWM_S$} ӘNrTfٖI!Yc,#!/5m$5q ]haf#ā _uJ~ffzg>{6cw6uwHu)U&%MwdI=Qj+Zj!L,T:Dfo7>|߮Fϰ퐻5іOM0@$jG4qV{&|/(Ž |2-eh~,c֭jZ{pR[122MSAELqE e2_:sWlr%u5YpI1~LEplpG8mgLԞ'72WZo>!+PjXTsO䔌)' &`2O=uF#7??^Ч/_ { e) 'DŽ8X;tWD4ƣc$$Xa߷>s?jmӹj:A%:,c륥rG4߸w]ka56pI8K>ʭKG,)d&,mIl?JkcHicWadu4i2GPAVVVR>>TlH tHYUTjfbr}TQRp:' ml'Ïy.[rmS7uPN_E3cm⑕OH_+ 6_ɷ{yy9Wܮi#uH Z̢66!{u|Kw쏔W`[*IFuf{4 0+Aֵz{+}oNAW=wV{w墌pdȵ E"o;oÚ7Y  4#B"Ul[--v\acP!Wqn,\t]eYzMc(UE6Oh7K$qD$ǂ ,|A'^Yr;oo Y]R4Qŝ؅Q[ EYn_)xbfA ^V2.ېR9Ia "j%꧱.}n;}? cԮ#w4* &נƈh;sݟp7ol } xeUh[UIFHr߆]O/_~!l ^mNwVolO1L3zVdƇ>Zm5n~Xƶ-|-\uO%y"^cǠ1%O. 0r6Ԡ-Ӂ+Q:8}KU 5ݡ27onmf3onInL-, :,}<F%Aij̿xh}bamJo獣S+K1Ji |A$?'G<ּ,Y* D)8;5k:tSN|n\9ɺ>J13ID Z (QQ<&ijĒ]nb׊UQJ9AoʵSr= WTyQ:ٻ +/slnl\ooii3s*vVvPΉ[㥥.! nﯱ~Zvqlf5v6CxP>nȶG+uz ^kx8yB L\Q|2$ww^Ktڬm4de4fAeܞTvW~^ݚ5vc+$wHQe l)b:\||ϻ͗r^M;E$h:cV4EQASr.l\űrݪYB;c@rp ^I\x3{r_4LMn ~WL]gcUGjUjz}R0yS4rdsIIG* oi+8.KS$h;{#nXdxFB]ĵ(:Gj+vPA!3]M]< um階EH%%DFISj҈}ν kFE 4-^ Y( ]!P A?h9_f縵F:!fV"ƌIbq$*K[$tx?Xa*>KwjwJ6An w4}LIvmk.LӬma۱c2!=Lϼ|;?@\wkMn+ :IR^;`\>0)<<7dz7k;N-Ӌ~# m=&82PSB@_d+;Y=O+3|ݽ-,6n(YR)C(W}H3ۻ[JB۔/"9r% Ƙ&Z+'<|>;/g_QwUl]4V*QryA E}uZLP`3':=ܶڬ-lh)S#4Ie\We#Fg-\ŗ# {ˍvtbӔH2Ejm VpIrUL }~,6'vWRn[9YO9@"WQKe&sΛ|:Ÿ[xq0b"ȍʫWJ(b)ʰnZGH$z5b5ʊtG?Wޔ%6Nݞj<⭫fi/9Z(/ݭ'7n qChM#jө4&A=}%x[l3K,  J@E! &{~VN*L.+ڡIclbࣧ2W$3<;}৸?+nc:閛ۛyj25R<V7y -a9 V Hq4tA*wcTGv$ZCn ~OdۭkDD ƎK1&IOsD^#dMkkw%òQZzM{*\iy8u2EKԩ׽u~{ߺ^Ӷ?ڙ>ܻ{!WIE䩍ᬢar Բ:3)4wחwH7wpte5A%c6ٺB RXPx0@ pC~Du}5ˬj0&v\Q28̼q}.JU|j]5Dh)l*DM(ƍ(t ] @db6u+bu}3nK 밻c&&Io@ĞUUd:'=ϷzLgs:ޕ޴3^**|!USfkVDE }>YYWsM K@Jִ^6D{>6|Ԁ jpxo|.ڪWvgOojvhtH2=6>_?`2 yv}5_\-{˺`M߯n55+uY/@`wȾޫ4uǾ 'ԠT>㥥Lf=ŃOPy* $Zows2LZD0(ijFo5dPYeҭ=ow(=/m*ږħbw3J5бԯU_?w|D{5OٸiW;:髮v]⟻x?p} EgO̥NL_+[x%:;}cڿg}^ՙscMˉnjE6jX)08J)⡩@H*sSi&7rsT#,P"-ԇ1::Nw0˻0` CIgGR Ugn}$m6G_aj&N5KK8V(QY4.(,C =ϛ}FὑogEdP99̒+\EH8ɟl=jVv@f@(*# >@>&grX?pR_W].ꍙ蟐uuudG[adi: f1㫡DHJA2Đџdmo=͑ⷶ^yBFI>ꡤҌi"2a{s9x9K5աe f* 2zg*_r5ݕޱەYf)eÕ=L# T)k&v%Kc+so$yNh-䘗mo'E24gaY濽o-  P(eG G͎ꭏ:C~4&J Pd;DUx6ny3rI$nșlL F<{%rϷvtWCùȷCt*,%Tbr,ɾ4v k}2< gX ) H&EBŘdƧͿ΄ɹ{czwg7<.J,>qe,⢑bNTr xɱ7 poe*TPUs߹;vճ1M9hB `Zf$@NG̮)]&i6RT66* dR02'H~X{{CJo>0!NTHPC\pGܛu>mBY',j\6((1-O9₲G֦X[M} bZs tđA $g!e6euR3vr:/g+$SWq|9)3G &7}$5';p|O}E3}WgJ;hۣ7r4jES`U`CCG0F䭞=>.x.k}9QKCo ;5P჈RNY~g6sGKo lgoNge*Ȇ5$CO2u_rê>EUM1 (>QösSY~cI;o+w.P,FSpv;nRgJ?1Cq5BBs>ow=Y7Y&i[o*?)!Z9{m߂z-i iwSj#=Hs!d$mfËq@ k?7o E-QiUFCr -{@rAks_ƒaU{aZrYmœE9]G6dM(E=Cj`$oW`YQ ŤDMc  d%C41Df2ƨ#2QI\O-?wZ/Zo-Y{w{QݏLyQՈj<8#ڝM:z_/qQy_ݷ\ Y PUSEE5b<&? s>_2ceIY"Xyjr 5E=",ob+Mb-=ix܏y%`bc qx #Nh~r=s9r}tG%ӷt3)puYE(ڄrJJW>_nr sgܑm=A_wCrGRwSCrP; KPci['ݳywfڒo۶eyQDJqZ* YZ<3ٶaM3nвĐ[h$!KCHaKvxlw6f6]2>Y&b]|C{{5ݵlaH`Q5(d mnI'PY#eEe9 DzXnY店ÚXj1UFܖI# 77f-N+pƻlu6"lE@Ȫ;$F̰Fdyggwi( ݵAfX,E3LA*hJ}Si[7ILnN SDHd]D%˩{^߿v~ܝSi:Z?GIA$b#(ay$vTM|}·Xvo侕amy*"<UDgfb@b?[Q#h;K T fUI$O9/וpKW]=Uun*FJԨSS30xy.8Yl1FUee4YIJ4BYnf}"$ ۅ&Pb1vLi3xJp=+忻*ڞ#[-~eHOoOQM~ʉus8`c]띧 $y?QTMV _6vtJJ0QI!#ui>ɾn~v˦rxjZØ7݊Z+IY 2VO l_y9ou[h#Y h񠪞j: C^ٵ>'#T]=50iU;2&"1{jZ nݜ +սt at[`,{7纳žV{j&/&?Va5"ji& ={dw.Z}{3I2ˊT*TPJb&yGsM#p9%nޠgO,V)-FUt+K"P^%s;UvݞpH()5%$URD!"V|{z6V_U#.8-ؼܵ;:1<"'t &,06ÿs~|=?\C?O4'bӨZit]^]l糖;A<2ŭ&"m&DPZ(z}ov}_s1\e~ܕ۪!CWZ,m[C)H[^y^QS`ط>b-#Y9oRD73\ityC+(X()6|~o{ݳ_L$vwC2GPA zktb\l=&kﭭ2J"UTÎ1Hְ[aȏ>|\A}+{i Cs!#dЀ847rsmwpKes5GH^DU1VҕK9k鷷lu;7 alPIQU:$|j@ \e͜ɾ<Y\_O9U|+xFEp PQվbIWvV!XfIm&P{]~"w}Ի=_vFrUؼ>ZEZM+$q3x?p?fmy-Ւ(^GhP1fc à'A$fv*$UO|LX>+Exھ9flU cWN͏[Z S#*!iK$l7grn[ 1a Mjwc.Iwޭ &=cm.߽ f*L7!EnUA`UpWISEl/ò1߸؞۽KY+ie1EZs% j YHyw?W6wm+{rQEwYȞ#~rtܪl i1sZ#yӦY*cfCCS.gKU73G6&)k$~>sK}nWcqI35,UfaYۮao0;Di"4Nnk +;s/EAldSbc\銯s婡aP8:i$g(j=36:gy'@Z[= c$)w=y7qsDm⨂* i]I%ڀ#aKH3ۯl9K Zǹ#@'$ꆁ9R$g_vuYm7{ih&Yxx\xdZ ȵ B>O%_Z{6Jv֯$y3HOxp{̼.Kjxӷ b.c}^_=2?ibtW¾RoO&/ze%o{f;"!.ԕ' <x\O{|5Zsm!!dDXRb==G}嫝'q I 1B{"}CjO=/C8؝Efzū#m;yV*Fu~ލ3,#>]KVQ4E!RBPdQGl^=߉۵讐H&u5) v>$Ԑ{ƞή?PX~{%+-4ؼk"44ZjFGfho/ gͷɷ]Ò(DJ*4*K]>?{ϼ>?*mjT/gS!!:"1Zg?cw`w/Ǎ[޽s4j~zjhq4z'-[OEQW=o|axgCab@ #}d*+:]C@Nncvn5i5Yq]Iե.(iO+R5@{ w{tq%O+T $]B*f'J*@ ۬-6 oO4%,Ϧ8".,Ejf,xOV~_|h{qc PvfRx:LV߉I7WNUZ$7-t{/lH۽l # YE 4a\J{KGesVIcej#RFL$) 4KR3\6==_!ߝE NfK& D~TB)y]:O{9x,RtcWtO<"A2zMؿ+ci,G"FFz FPtV")= A.t|#tcv>uC0Oۀem\mlmuZ"w٣1>'\vϑvoq÷ Q@MlD +JI9e=l㜹{nx}o<<4~2Lzd0d=Kx&W)u̴rRn'z7:P4rW34l5@vuϞsq_'].HkH!`X`L~#@ *Iv\"-au @%l=:z^#ݛ/7GWeQ55DM%5\,2Iᏸxd歆Sݔ,mS],?0t=,o̻5/QRUCGF⮪#W/.6>O-MI؝,&Vm Iy(]-t?]F] 'W=h,e@-:J$s,3iټ'86`<ึbHċXH,[Lͺ$ W뭳˧MTIG$6[25 i Kwwemp;^-ڳ/rQ)|.H42^{qmv#j sZGhPy?)UڸmAսo%.6jJlSKZEKOb6x#Q6'jG.m A,ˤ@ZO?WS]ڤ1"c,vf2L3U#Bxox$Nu$H*@e`nr=r4N$CByG`>0:_z◫XVvn ӊl\v.JQ/2<5up'G)]˼SOf\|KqiB]cDT[w'R:|;\M#|h]8macHڞ EWt~/׷*Y.mv?sATԔggVd\`tUU=y4U 4[J <D msql|O.v!eMqp?'v\?4l(zSf:pM =QHLqqOBr=B%t,~7y;uNkk&hGQ8'<viusi8 %:@ڻ*jT.^-}zڷnSG)NC(J ̐2"Y$sܮY#k綼u^{9"W,)V4ՁFe^ṛn|m6_ ǷYIҞCFS'9*^.>ξ}hiwoX)ZcR*Cu(F$[$m<ʜlV6${*[[e>5%QڧS*f6plMaujoӶ2=I8U4$ܟ!rOȮ¡7|QK0ʊ]h5$q:lܾ|W-ȟw[&h.wVe FpB+ɦhV] >pn U}՘Z[5$42i PVG#9K!f+j2Y^%d2d2yyF%I?xinۭ䛎3O33$K3;,K31%$I=dvvQ0¡#5(*P{2E];ZvSV)Z#m[(xrQ2a,Sh"}onvzG3**еG2F)4" 9{'d^,GJ0̢-ܤ. $r/vfzm_r5;[rmv׮=6ݸxcGVG$G:$g"{%=O vƤ%ByD_ WtTy~QMyrm*d*`̔!$/?S~4=!UrX.轫w. ;ME6(CtI O$y!{r_&߽cOs9.ad ̦\m [Hh/75sɰ/˰ʔpܧbF0I4(WB]R2~uv'ˌ&"Zz^2`SVVK% TzdUhmM zPO[UGe}Q[+g` nJBFQCrHo=]]κe+Q J! kv&Ih+i#lT3SN*i~6m|Ք0xd|x5\o1tT eDAݺlfG4=&g-Jn!G%'[NL 6ZLvQsa WHtb? qً>& 㑏rVҭwrwEA9$Qi$|"_>/,e(ێCL썙oMZR{xMp>E^UFԻ~)z̫/\9|wm\͢9+:l.v%QkDKQĮ~/}w^J*18ҩj8T3 L NBr%"9R,4.VIXpij驈Zt{t(׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~uo{ [ ST߽u{{^׺u{{^׺u{{^޽x]{{^׺uWdqxܮW+[Ibdӭ>kc{e۸h4nliuvN4GYIM6>Q{?/[0V/"FNV [c|yEt.~j]W sI`\c_Z[z/^׽u~{ߺ]i[w]{{^׺u{{^6\opw]{X^_o~u{{^@$} {O^׺u{XdǯWu~{ߺ^׽uI׺u{{^׺⑤`,B(PYS?'}홛,kKq5@?$p]zq]{{^׺MMW]UIArtv:Z̆G!]:( 4(jl.VYUUAfbHI8,Apqgv!UAffc@ bMrRĞ:NSfh'l"mИYQzH,&#OKSǔ"'qbޖDe&,Z2Qlub[sE>F_ǹw*FǴ4l#'s1[bzu{{^׺E>׺?/=Sz?/=Sz?/=SzXA]{{^׺u'Q RJSJW~ֺG(H@ tWPݕ Pc+4"LQE"!#G|;'abI2I&5$I$p( l;o]Q!GꨪہE݅ 'EzEMlOԲ)?#`BTF?=컑BOeOt{ߺ^^렪9 O׺޺^9![ybM7E{_m@H :f_ӬiI*&?~ռI?F'PnUYVEu:OϪ`j XғUiLOw6xꪊU@UT%XBI5=w]{{^뎄{}zO\u~{ߺ^׽u~{ߺ]VX#=v?Iu{{^׺u{{^׺u{ ^Iw ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~McrY?39m.3dr\|KCye(R >XnwmtO=j; ; 3$776v^^HAfwf!UTYIGKmw}p|tx.*k70'^)5tPHg*xMо[fOR+nVkbmed̎*u`T%YgG7r~<$jVMAWQHMl5H՞DDw~) ՕVQÒ`W׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Jbrn'-ʙhX>j2XxTIb*{Ue{wEXH3# 2YHe  zj{{{5)U2:0*jYIV:'h|ޔ[s3ob*I7 A[=1Y95BJGO {9{GY!8Q#_$TP 4Y#@@"{>lr&8vv#3%#y*ՋH {z~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ }1><[73t\gk/R=7*أ-\H~ǹuyڻDSÑy&iq ;*: 6pi۹5fK&I(ď:Whvn/wj e.K2F!f&3X =-$+10.,wvbOΜFp)uƀG Gjjf&<&r-[[8K\PܗF%QE~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ԊZ}]&Ccꩫeo7r$KQXjhxLQ3#;kХ HP_%##4k׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!RCޙRCߺ^֟J׺TP׵u?/=ui{kOK%~{Z_({^RCߺ^֟J׺TP׵u?/=ui{kOK%~{Z_({^RCߺ^֟J׺Rߺ^׮?n=u?ۏ~zߺ^׮?n=uy}u~zߺ^׬l}u~zߺ^׬l}uߺ]{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{c/3k3qF;1޽{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uܣgǟ{K[z 3z^xE^o~޽zs @i7ko^A׿ |yWߵ^?><_MׯPunU/mר:7??*S{{gǟ{K[z 3z^xE^o~޽zs @i7ko^A׿ |yWߵ^?><_MׯPunU/mר:7??*S{{gǟ{K[z 3z^xE^o~޽zU_kFz +"x:HYII7'ߵZ'6OA1oko^A׿D }[z ?z'@L_ׯPulx?b~޽zd/F{'~ O7ߵ^鶣Y.y~!tM:[]i E ul1a`vdִ 0;{~dGXMbhm%Ijnz9}& 78{H'3m8;z׭{j6Ox״M4kZvkZh;c{s*}^uGnχȽ^z2{{J$. #=DÙi;oHMl{J {oݳ׏~_׭_N {oݳ׏~_ׯi_NT#Q):ﰩ/ºE?SvZZ: S^:/&^rE$i>J?`'qkn?ڔo0'r?x״ 1?Iܟ:7+#2 #kGPΣ_:>{GPu{H=5]jQ[},4_O1>}arzϲ\l1:noN6,~^@Eق,}HQ>Nrqv07jLG9gM/YA1:@2s_"?{ߍ}{GϨpOՑShꙚj}Qo*O~]{GX?#gN W:~c'*A+I`7_oQj9bߚm`xv:<;Co״^9}ysJf(״^&AO򷮞ߴ&fK}d<*߀~^:Nv,D٧ԶJݐBVd5#i={GP?o?}7{߼aִI (8WFK6I6G[~d)#~0OQXMP9}Fdsq]Q{Iǟ{{Aza`1 ͓f[Ym#5S=^z?'zhnRo!rv-@jTj7[^2>6-Jʌ>VEgفA?@I{A7??=_^6O~yE3cTjF#y$OŏR{ߊ{A_N7f*O#v5{r0A>Z{߈{I)y7h: =_nF!͖o6N}Zz'rA&ԻÀ\Oߵ^.b{=7?Ḣ[2={nKXB~־z ~ICfu쩎zh6]X{ԾP o4/:ij}?z"_WU{ֵ=7=FQj$i4bnE.W}zMTP,o]w"J#j(úUՊϿj_Qרzh215gOT'ύ $(f}lj_^CUGI$M=WEw4T4tf$j],qK֨zkZ7~2M?Sv40 ˌ u{6>Yz5/$(EJo~6ѣI&$GrGhS<=( l=tըˢ"w|>QFwvl={?yMq-o{{G^Z׺[; ?+{ư[5koN?޺YO+$$~sO'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^D ApAuT㊐T*T#Oߏ~5;Ol*Tʕ"H}S׺k=_d=wJTX b}Ў-u={]0QJ bM%#{OZ饾9{thߢ:iu(aide46 >zM/WR|oI"9#~֍aѱ "zMR|74o 7RHxFb AO^o_ gt'Uֽ,Pa#޵7^鞧~-魃M%ѵ.#7?CǽoS״Njz3|A,=i_R?v{scmר:dWֵ9 ~"6u%#jW$k^AEG]:5GhjtZCCUnmk{{H鶣F.F["T LR 2%R06zdm?/mΐiwjQEe v4m7?#>t/eZPFZJ~JXF 4Snt~Qs##Jmw^ĬQ'xBd~.I{_׭i^Gˡ@Q.+Eݱ-`щ2.o+#I/'6ghS;E?s;on+#SL8}Aw.>L?Џ~_i5T _ڌ&2_Zߍ[+u#>pj)5۳= KܝGMz}2rwamLOtfJzDko$s״zw]N ~ܐHծ8?{=:v>C,n`/J.4ѹJJߟ~Zzj|ESKP>(V2pj7GeM3z>^M# zΣp7Q x9_;|O)>.NbxvLTfd9~}kA鎧|!$;ekUA{'ﮫiX~}WU':7`^ ,KF{v2M>^z`1^eitZ[Dw . KS_@Os*u'YW=i]yTڔxiiyl~Vx״gK̒UNuaQzNЈom (Z'^zi92|k:Ŭ>q(A}P$$7(K{I銫I18I>,C@UT:mE߼DZOLU?R!g`R$fβߎE?>=zޓv)Gs -VϢEIwqk^o7iDMQ_;8]g%<'Ak<{ޥzZ?1)e6`tj" O}l}zLu?PFM_?E>-⾆}zI*8j*hc`K7MvZFϡC1v~=2TufR2_VvDJY|j/ǿTz'J[KxҬګhnZeha9tx!cM*i bb5k{!DU inMZ}u1KmY*׺s }?q!m'#FTueMrxMm3[}-]{]DYJi?Ic?:zr`}usn}uݏ?u׿u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺1?2w?ƾK:ί7iotc׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tQՉV/R* E4p0HU:{Uf~=F?Xiek^S׺a^3Υ*STg5ƗizI+DbIUWTJ{k1h a{}}׭PtUEi|ZVju}ɪjo9u}u_ߵ7[?UO-f?gǫGƟV&>OZ7YW Q^oݧF}FhMzIsZ6I^5e_҂YΥd `H{޷GI+*VEo1svrbi߼GGL'P{mUtޝCv5'/`=^tQ?OR`Z^dXܨnv[^tU%D$]=C&'r3ONjS$_n=^tD?ڡcXkPbY;}>Aa@߼WGL5?/Tow?3F}__o~_i2O =+#C>Gх2A[jUm?ߌ.tQ rE/l!]YTF5IK_߼Vu_'s>Eҡ%MgWVmn5s}oNtwSj6ZV /mŦ{ӭh'9cK[֛*$zQMQL]J {}:*?8bEk:C V[S=>ooHPߍ:bTG3ie$/|yh@;ox.fma%oKU4]-*_n}{GIN}#|`k:yH$2[j6Oa״.^E㵴OQmo=:G'R+^TQJho#<{bZ@R?h=0Vr y|f4o{PA1F=&r߼e'_Nʰ'AWJ~D FE^ݍnnߊ{A/?$&mO:GqS^?Z؏~֞z_6q;2?[[2o'no6ޥz . ') Q ڑLN+yڗ׭PyFH֣;:6xٝCbOTzg5}S4RDF; HT]3Q]D\\u8=D VDC jݫiJ/x_Wǿue:F$)H*o"׺\b_]}iZ"M?"׺s }'1 ǥ4j=%}{˕ŷcߛzk)ozgZgJU6ߺYC:~r9[~wb>^~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ю1K}5r_Mu}ɸOK{go^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺXU? >Vjω5+T?VcV7eC.(ߵ7^+W xG?X5'/kJ$UMz:G+^T|A #>qff2G~^AjI.:C' VƛAbsqaz~7-Z2!dw&2oOۊ-)߼GGIAFfYPw't_Q}??Z:H"Yl]w?a _{[7u\B=~tA_kGIگN9df_/ϯi=#뿑?/؎ƿk5DQYx7?O״_##޺;w.ԱQ{NĒ6~Esm״?ɣӐ:2^z^W)!:[a=zbJ1o;]nE]5_bRid߼DZOHڿ!̚}HOqIr O^C^|x_mQ:2Yί=&|Π ~OđDɫ#QcAkr \}H_^CS!'SWȜQΎ|k!6}XR>C>k.ObdI~Fѫ"G[1Uܔ~ݸXWMBVkaWJ{tx<{Z)bufFIH]] e}Gu%m'@Aa7f{3_FB׺R[YK%*"ki>׺$$C}usn}u݈{^~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tc>e{|Su_rn<R^{?Y׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺX' 4TPO s$Xcn8V]uhTtlj@I @7={o΄h +zfUXODKt9>S֨:H|=29DA]=gWXh @*{ަ=zY=wgHt_EvGA>zHMGo]G@5n_?{GI:jSadt+mXGP~##_d[avF$wPH*ǫBO?^:H?2x:yb^ _}V#WZGH)S{ &>ܒW$*2KQd_}~tOH·]T%FOn [O}o^:Kx$ʮ1f n>Ȅ5FҀ#<=nttT/zP"~-6+O:?>k@#W M?vw?U1zIzNI|͔0i!`i7ZPXxou$rŌ+ͪDr]-&" ]= >{=:𝟑Q])Xlm> vƯ~^zJz~`'!걌8 -boƑ}ZzKW /vhYGoæ֬@2J+<y?GOHzY?6,g2d,m@Z"z'FC[1jgaNrJF;=ֹ6PY׻״}C9QyIVTj/ׯPIRudG2 <_(fF&}ZC;# 3e~4HcYѽTq9-3p?ߵ/="zõ1ɒ^ƺH2:ȕ+TjzUx<3XbV-Z<Ր ~5/t6I3InߺX?na[!HV{^2dQI6zIߦXΧ^ 7s~wb>׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺF;_.gx7gY&?-wc{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺMU,&Hb}%Q22(2}Udhk6جSVI䏥Se_B͓ЙwY^BHƣ`~޽jU߄Y5d񜆎H[Q9IM(k~MzHL_YRYyFMƍqlUׯPtQ_˂ŧ/|ClVVe?^:KV%XK/FrݵeMܞ5S!P\xִH|/]O׽&6@YC[ WGH6M?|a);jz r5GM:q+#g'eٿ'qhҚ7\VDUJF&XH_]{H|q dVBɁSkr8ؙZ:Crzߖ]NlNKv>F)hq@:No' [%TUゴ{;7[X>^Gرf Q9.PtI9 ‹9$}=ch [ %#::bhNdFh&+` Ha״ϙQ^)v)0V)جNQ{kAB?=h}K\G[QsgQGlC&_NGZ_*T{A\%T1Q_~SinUɗGՍ^AM^AW5Ht7Ͻ״9Aq`*n,o7ReI>/r, rx=z֓rƗ_~[ 60l?~}ZzU~l5_L8C}1rQMcՇ[ }G^g |icrkz7`8ϯڗׯPk+ս<';mjrukd5x+1S%HYdHC䏭{^鱲W9Q_#{ yl[ɐses{iWK'w~o~f  {^땏?u׿u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uw]|񯃒oxγMǚ[k|;zu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ] AE>׺M͟Y/?3qMΟ#2[z&J8̭ XT5ƯU矯S̃T}3zif\3X]{ަ=zSp j߈.ˬv,jxxx@Ͽk^ztS˖OgO[?X{xMkj߫WzB2-Q9Wvuz5] J/״uQcIWx*({ajM*>Oj?[=~t|8惵>N㘕֕Ъ*B^2\1&Cxߌ.tt[ %V_Ye-5b)Wӯh"+8I/6]y.K  Ǝ,-^ޟ~Z7! "|ȡ!<@IOf6d=\E>}G^ǾxĆONΧ)}x4z :] سIQH ktS'O'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Cdc0(h*b2[ZXY.-͇u>|ֿ=aיo'Oem~`[ =tKc?ܷd'=s_2%X׾l/ڛ׭Pt志\q_ OlQ>U8(H [$޶}z#VQjONҗ.جvOבBVSNi䭉7߈{H_CYo4NK6'#iNn( 97{HF˳#nߘ=fR;Nj?Y:kM~+#CuկOvNӪի{nty~ ήq]k#y4yWX0ʹʯ")&o^:2ŭ5m*݁?plV-o{Z:Cq0ͫGMM,&V{{-[M"7˯h 卑yG_GU6x>&ch=N8u ѹO=6[iE~2uM'5fc(,q\Do'Kݿϼe''?%?g?k)o+^׋ߊ{I ]]/2 뻵б fF{rE.FTOH\cf #ؽ1chUn9 6q=z֓w\??q%gqb[:P;h fYy7 r-zׯP|'rMBIO{)fjEDvXױK:A[>A`uߘeJu67r~=ׯP3{bm+N2Ĺ khcZb ؉DAIk{^ pt[[HӮ8Ԩe*yۚ7IpC~b׿uZ_~u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^||%>9/:yю~{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺM .,2fMl-jZ\_~>,aޫXdiWS}hq^{_7/&}z]i1 0<xMzA_j|9=<}^` k{#pdI2V4 C.ZQa ״?ԭ7Fb{UqCpTpw⿯Z:2_SisGp@;u8oqǿx״OwM8v$H7_@`tY @y$ߌ.t:9o$;.4 ;:@)ԪߎA? ZAC>`nn=?sne@m];5can8C~7:A9%_06k1謎41;꽁mzuNY|j>3{u4@EaiE%Fsb״Y(Kxz#of4~ꡮhpGj>'^zrʗu}-U 7pU3pIGԏ{׭i=9>@%㧀 6zP7 \^ >)|ƪ%WDvz}f0VdŲ0$X2HK:AK_ fpWSUv9UJ54P4׿xQֺDV${Su#^8M 3>?25YT! x׸Ҫ9?֨: s˻td> v6O E$㏧zACI.'^z C]'mO_Gp>/97?BϽO^C}AW QK;tƈgypu*^I&ߏ}G^6t/m˜Y?fx;!dŀ,U>Qרzr8lW񝹹Ev -J+RLEw!GT_!:]ǕoK-*i/$1Ե62#YO׿uX^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺1?2w?ƾK:ί7iotc׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽t쭛oimƻ+d5 WfSu={+ft{rKS,bX9,j~@<@>֨: s?yYr?~8hzwbbtC}? ^.)͖gjcJf8dxٙ]MnX-n-V8GAS+-̒f.;V!pXy׭iO-QbYl'w$jXos~A \{ߊ{H?zUlgf9ա#yKE'% ܒOfu- iev[?Q~1AGJu/̌6 R$q&>N# yo=(Wg`K v< q}:փkC?>񡿇T\ ohn:-fNknSےG?^z rWcx:_g4 a;Xנּ6ߊ{I8)5we^L2qo{޴ZOAG~|~|;cM qݚQ }zA_ʌ]%UcѦ ,+2O^/}o ,$5׻#rJ -'RS%LL$JT*"NAo~`L"BV<5pU+YCߺSRxdhI}u^׺u{{^׺u{{^׺u{{^׺u{{^||%>9/:yю~{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~6dlf'J2%*G~OkۀtQf˒\f䋒nK}ߞyA_#:o\t]QԽ ӏ [zAOT˳2:[,b>?߈{H;%巓Wy#7˯iNMŰ'LxihB=>{@9q2*Џk r)ma Ox./ C9%AM݇f~A_mozu?O̺mMu_g? ;8XmV%?YGl=/ϭi=S1 )]WH, sZQ^z ɣu2|}fnKe cho?~"z'5^A :탸{Li_{ևϯi=?60A)Ǩ%Oow ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~qtIUՑ2:0G~!_֛_ع&'񍥀5 iOԎYy'p9-&dWe,8P7&>OZ%,KE9f- pBMZVzdg%җ"#sm]ؘq'o,i?gmܯh9IJ^|k7ӑ4~?)>?6=~󧶍ty>mC uh(P֖ڴAصwhL5iR+Ϲ'BCyo4ȤXY[1&E vGzc`7l<aL_a{7OSo5/H]߶>Q\WDzr3a?[Cm yuFL^q~>7 w(Io1IP?m_${WCd>U"v|Y>"u ܒD_[q{aSkaM [&|G/|:2cF8꼄#`vmSS\9j?䟾5xK^[9ܽ?'D./sna馤Җw jأR~=.>5EK[߱]ョkM/vn?#!jУ<#dfG3IDˏ{ }[ޛٹ.aOi!2t. AN,ǛqO;ɾt_'/ѺGt3[D^'kz3{[%oe[7n.u5S/ﻏx>7-_=?PI7ZW/B oyVB)WϤ&[L F|Awv&k_.A#o ?&H{ :wm'צ!>K}lOk1NܞݘU/; q(8'SF?^dkx)\lt 6{ 랓OWKڈ~눿e&l* A+g%e$檩s)>L0Al(~GᕿKdǦz]{u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~4e68<AL6 phǴw[v|4h6t{6> 6¨`?n~5,m_=nx[?x%z~G2em{ w ?/٫?+_ݜ0դN{fk1n?;td<)~asnMϧq{ _}k<{ȿSCoߦorT_ l`^ߺM؞W՞/a ͽAo_໹ji%Pjykޞ& ~_俓E;Uij^;߸fO;g'B ﺐk7{iZ?J34}ۘxymqI}>۸?C 5< ?OZ?͢O?'ˤC#3|EoLyn{qz/zm5ly?OOˣrr6Iz=OqK wƮlc%rEժH-or9 Oo$_מ^ZlwQz3|}uڧ1qsN*R>wp/tяnT)ѿ`aÁ;v[H?i/ˠ#e| e}GEKx9 ݗKLܹt}/^_/QЂhns #?zAd~4G$OCWTOO>td#C)s쿻uXP3݅z0}[>6'my2;'|aѥl]/\ȒZHr@G&f vۘB wW.!랒OUO$VO% O'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tݒ3|/`PWB~XꕗilWE)*:W6ͮF?ȎEt} yޜgn9$<k(} ƧpvIJG^u+,Yװ.O샠3F}B~7tzna`?M×>{5t('ӳІul-v9-τySyn}MWӷV&IسիEo=f|H^A_O,ɮb; {'^յmaW56mw O$ϣ_/oស;_$<&ߊnE; za{j6:x:<#ybEsAڟ7?ο>6{tt_q:KfFjca7E!y% ^}=pF߼G2)5?'z@W$e#bLΉ'PTpUQ(W_lZ˚%}Wh_Aoғ+y'ںڼ+{Y)jk4s`lo6 ^w3?YOJOІʯwq?GH pUGQn˔7FxDC1_R U6({߱}[={=#4m~tg%j#=>HIzFq(P^drO}-AkK{Z,:t#{9q$?l\6 1V=m̏Z؏\IvUt}kZ=-#mn#)m2?׳kw5`ͿnYYhbН7Ir}]W-?{ ]Sm&)ŲF#S跽j^̎;)Ř0,#%W{ ^l/:B{;[I$=4:ZKD$1opEB1 OJR Oz̳B7UՁXp˭e'u^{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^y=t$2L "HP9#W!ZsٌV]C^/b/_Ўm z+83zG9:S,-?{ }a#hm'rk?^'E7/H; K=EXs2ZَGz$#v"_^EЎ~g.NHKqJ 0? vU|!} *Vm7%RT_x/y`H%>^%d-> !MӴ{2Q-mQߘFqE6s.}n^FnT)яLІ(-?ˠ%>gM6ȎF3by %RR /} cB+_g񧼃=?nI:rk&'kk"h]c@t1` kReiwb.=-{OOtd|ázݸ-ͰہnV.ݷWIҽ.v{MwOE_ tz#ptosa}S<H2=nBVw(~W"^w6 fYף$zu{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~$2}sI.oc IJK&SmarH=\Or}-R+)?z5w xiH/3fw g^t徤ե~)u,mNWЈ0B;_sȲ4y) nUeZ1b'7>94ᡅvcE.ZfXg$t{` e2&N#7U2vWe,ߞ1GW_s߻>Г旗Kq"*t!n{T-,Xe?=^oc2ko^}i\Ck/B;o׺SK v̵SGsJ-Q)mݿGcg\>c-yw#~_]m>\ _]SgϠ#l?z"-uIUC[yػ斌yƅOB;yˈ8Y?[IϠ'{z)w[MN=>ẂB-e>^,R?"j>v|V;ci y_'ttvp:)7^򡩐'ߎ%'o)}}.CVky7{l& \ZnP6?jW3gU6q6xvVWׅ'{ }AuOݲeӡ-ޏٛxKI?u^5pL-8=3 ^}ߗ4 KІ[+_7Q%3F%: =mPX੊}}~bf}Ѿicu zH>v{]v?CQ#!3ug`X}cxve:xJ0-or=o筰l?'PzZsG+;}[vCifJi (}CH?}71:Èg#5!bJ9xC#e'Z Fh#\(~G~b׶#TǮu~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺP K?릮j{b{kkYє0Ӱ=kIt:/w x9yɹ1׻K&Κ7+}߷yl[}߶VǢ=m9Ӝl);4N97+d7+pX1a"߱$卵+%{/9p4;d/'#K/Dc)abBE%.1@}\B?үt$l(?Z䁏2(0(ʔa f` _&7KWW`-.mkcOe#{oOjZD+8ʝ_ʢ'n UAl\4b\\s5wZFOKh>,ѿk"oe(P]eI[^Ep?#7] \_`3mv0;|rsAZ,߷M5] m~~ =|;cG-:s_7|mߑS#9ζb$qRw8L|K7;=B+O~/ӼI?7Ɋw_btvNG=DɃE?yJ6&t_tImAKqE-FAOO|ljM.Q< )h_5/mⴺ#sf1:t$=qvRП$s OSйZϭS7וf^[qAwEYl .X]=~~]&ב6 4;e WmV^n!;hVB^i7,n/4'F m}b/f:{g 2 OW7 "B,-ϰ~mbxzZs'n jC{TJWUA-uz>lpӇs2SAvooč¡r_d7 mr_ 9?O/ٻD%Vpl(=>ؐmp] ;:mzZ}}jZD+8ʝo΢^ MK_%^gbX}` vk:,kMt&~B6$of(P]cI;f@?4&p[Xc2~B|r̓AY߷M?KkV]IK~9kImߐ;% fuk+7:AL~Z@<\Nx̰|KWϡ?dz~=u]?~xaY3WP 03ĄA}/>DIܶTpJ"B[o]XnQ~R3[T51Mv>x GrJA6>~كDZgӡ5ޟ˚xw6R?I _˿<{㒸|}#Oa Ϻg zBOi7yB;O/o%ߐ]y?_*pnQK;Pu@ƫ TV {7+mO8nd_aOiЖݟksݟ&3%d=^ gzױ𦜰9}KIYFOa+A}v>BkNfa^_L􆒦Iʰ6a=*G0?} :LΏLT}+QRj_g4oB h#_HYQ=S{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٓp}g>NN=O}`GJ-]F*h#1[i|Zl̛ },մN}/}s5ܹ{lǢ= -9l);}'vAU!;,W|rYA~Ƙ3Lx׿we7VnZ@QxdOˡEXA73KWu2+98Xz4J7ae,%Iԟ`˿6#4Z3В1UY:#7V_y'c3w:S!ϡ=+^]^WiP/1d }WNnPEbzOB3JS^}q\|[ВoEj;1,Oא'Nej5nbq"'x}~xF>ʳIycks)MkV暷g)-.Hd_YG =wё"$1bh [zGonv|Lx}Fg:t';9W]D3t/|W=4bBS"5Ζ==Gn]ܠ[x~} m9Kn$'x3Xi~3a֟1sB(6ix[ԩ} m/9z"?uMBYJ[GEI6RO^tz[mGH#]Z׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uŕ]YUсVVSʬ >GT`~.{6/6If'fϪaJֿ6+m`n=YG2J9φ7 b, cla%'v MN~%wصN!εQgv4~bq5?c |_Zrgl5 v%MSEqTrmw<obQܢTˡE3ޛADdq _,z r3Ij,Gcm)c6nd =@@NoܧثEեW$γ^zwjZD+8?N \S =A7d2;9J>p_jd{g%#Ki3;gKأ+0~Ig(㱴yްd' ύcT~/G#2vZg3K_B__rO=0<;ۯ2q?l3?ra$s5u;}! y0uņXGO} ]EE'z8 3?6#.;?{eM_ Co)_.-8 qpIiКylی頁KO.+O՘,I[-Ӹ+1{_=4ڣY3О;MX?楝bIGAnc|̕;oL፴|']RdqV}݇mq˗-O(V@#ОOgWbJ~}!6F=}هSWVgy`g7]"4AOzZ{JOWxt1, ="yMC{_{7+i >)_ӡ=譕S\c/Qjt?A7x禭 OZt—RѿK+Xm#T "r׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uA\x (z4 &c뭋57;&gpo}WOWis^>-2Wև>d-`yS:à7~ÓҥXg덫fj=4a d}ZL~֊4oЦݿtlna@];]_.I D06ۑ?it`[kAR.6xzm}2i}y$5'锓v6jd >+ >^-n+,G:Lmz߶=ԴWqx_ʝٯ51[^*݉! {W &t'%&k=?f0\O.?b+#6^-'DYέ-oHjnk}.D'#.vo3CK'5 ?gB{_ؠ{ye>V8<g O3gtL斊\tnqx|Tq\X -Cc}/I?{rPȣ2c{ KCu|Z_Ο>{jM.!-oo 8X>΂wXQvG][YlC}6яʱyevxI8>}/k+p)&*͈Rn2M-QW#Q ` ǧ1ω_ʽ l0ي*%: 3}[d}#ܘ-ջ05^Sn n<ہF M{^1^**s=6RS:uDv Dub=nv)|7sК ]v$\~$u+h:cԤ3›NN>zPbd H#mGǯ{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uzx*zz!U+,ƓC"r$q̆9T2 AAVGx6|~A}4i"DO ;U/x#4t6?s0~;;?W(+?6zh.漶RKY]?6pj9ZM\J5( ,Ai}Ť*WТ]K: 2~Sa%ûcIE;7L>kp0UCn㧰MV73N%,ndQ"eδSinbۉ>MwgJ*t6FF;}`&),͙Fl$H[v y/pN\S J|ASgo<;_:{m-Tʑav!?`'oIT)),nУuZ(:Wu~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tm mõxk X5Iſ/Mu-!أ>{線\ӑ:GA&g='3+~ّXODH ^{;--wS_Ajb YFOƟ!_G\ @ Rěr{l1'S!# ܾ_.?朷Pՙв 5[O7^ _[VI$m[,X>o 'TiXf.maqi_ԌGn뚵b)OR?}:YSeQ؟ئ9*-w@wv)-n.| YݼrmY1Mn>ǰVujr|K?YW^V~O|V"ɼ:IJC:v.S3b_R ?ğ`opvN_ZƵ*}DSЦǛCsxxwv_AEL̕MR3 EnRC"hЊ?P*CQQJ/Dnm0G)h=fǶ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^nOӚL+&'CK_NO0իǴVVw7.0#mĵoTbA^kǽ!ptONg&!ϖ-m3;_{Wڷ\'K W?mZ"A^~Aa^\( t|x9-$:|ٔ7>)vM#'Eۨ+uv^,I?*t-+v~2Wg?¬`nab0lFn`ﹷ7@}[Zwr$ lZn\[K_u(&o;aw`{nM$~GӸ5U/i}@OZ?] ܨHv[tqя!䓶n3#{S̓[m]Ct@IK~) O)o|l J?cX%6Lq?V?c,n)OB/o-IO[^RmKXC[0^loOp$?_`{߸g6{eNmaPUg Br-obOOfucuѸhof[;/r%']ckݞ|"Gz ~]`!]P'?HQז >@Z +W]VB ?X:{ĭ H 9PI =i8֓ODSЪ˜;rz-;!6X&HY#WxpVD Tis+CQ=O0?u4ҋQ,n?۩>hCGR>GWh_HA7^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺM<>'5Nh8vZ\5}9'`W_iobI]U`GO\ڿk#FިO[C6螜NUϖ-Vꨝ ͵<޲XZAh zp{$Q@?.[ǝJ1g|ym('9M?!}Ofm7u]岃~B #к߿xsd#(*w Cwfײѷ+|,݅s#}?E;"kҾq9Uޛ[Ov8A.g1|oc>T9&6wffh7 ]I? } r^p!cm]S]xh/,6Ҹ:䑃Hn 3i;?w+Wji`Xit+ O4<35vwX)?lvJ堗&#'N\?7I[~ЮʒSw42ְ|y67@ #|hJ\7\86`{︇'ۮPIYt+Otiqm&J s?K'ISf޹ș|UM=ox"HT;&؂t+{-xBXKkvXB?޺~Xn 2{϶jD`}Vt;I$qвjmWp7ZuܝoػxҒ'9f%)VߝG#q>uԶځƷ:}H 칗w ݹZ\WuY KS &$&iEBi Gu%@ K(AG\0#~ GY=ת~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~0f܁WpyT5e,Bomu]7#XAOK=o:.%#t[joKWIUESuΆC'#MFH=o}p%gkvn-kB/t=۩[Bɐ- O@"/oMSl_uawSb=?BO?@鞟By*Ӷ?`IA\BS_ r.AH o`}O]"ο~sסe޿Pַ?V1_ S;:6Ok @m_cn%f#@@@ϰ5 )ٻn1i~Ю1cm A.LHTMMKINKA-yK>8I6?lxB?pϵ?Ƀ=1Ss)bI}ܗ*Rˏrq#?xۥֹĵ?ϡmsoIv_nuЦǑ}/ ,nP~9вU{j-X^_K^565)m[;w*Qegi5GݵK\m?iz=?ߡO?rf5q>{v$MW?Wo9h(䅇-mo-nhōO GYg_ e}eouo: rAypyl,hp6=jsݽ$Bt,]VN?r'qevЕt"Byu04w-+=I7*A{l8={޺^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^LXe`YXX}GaPz$q龡,{p;3lef?Vkd My7٬nƴnۣ.m歶;zp&J}\tg ?ܒyrz7WVhv7/>w-͂mac_[wWƟˇ +O)#vf5[;UTS }@Ԧ1Q^%y#t,{fFg[[F!W?tf?wŚy1[*|pP F Y;<`]#ܭO{r؏-{նp<[ʇ\F>]ٟ䗳 qX?6VʼS:{-<[T T[eޒv y}|+b$%ͧ_~l\*s?V 2J@O1[|[y F= ,~ܻ s!'ߖؤt%c7Lsfg0t?,{j [m#Gq0oƶAl~ޅ_{jM.`-m.?lw,O:?/Nfƣ=yZ%_)+2tL{nseQئH$[gZwv)mnt>kl8;[tk{n_w{6KY$6N?l(жjomW:W>\vFisubMqRsvbZ8mۗ! nMݭ8O:u2w+K𮠓,zH*D@$ yB~O:=XaUYHme:V\N{Z~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺI{=sT7l4} eNg(=/wMo :G@{?ŭɚMPIbmA_#rE='=n7\n,6F_cu>7Y.Efne*mƄip9ZxIQ`mK^EoXo"X?"|}負MI~m5~,.zs_&L?}{<`=IKԟd ?9.kO6W?R O%wv"Cs7&4RQK]?n?z̐O[``[ce7RM^K0m;[H~,mk=mS$h-Ks=~#[erzz풟G5>OP,aIp ,!?OUUp{-[d859 ]grq1?1p1~mHnۛlI};0ܕ87S }}4b]/^#]gbqm'+0 ~9vtw11S mzǐC }A75סm:rf$wK!2h]o6)$ua^7t AE$120e58CGRף EGbi0G̎#7u^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tוsi4eq{_ b:}sȊ0#חvo73)A!bݹi7At^z)-]oYkOMy)`{hؾ[\XZ?":Aa䷗|M'9cUjѐůjIvF݃}aJk??.6x_y@Ն/Ylv/6?&^)-ι$#Z+nrbvu|ܖ#7 9.{hHAJ'RvqBIM=7^ }}H}#7ۡm+a7Q.IGHUMiwUI_JYZeގ*o4+z,%)_:}mrQb+ &ofV/JgaD,!d>8WD R:'l6ɐ1uϡu۩/mQا*8 {Srzvf9\`O{r~,M,!WvW!оG5~Li8Dˠ{;_.i#ӱOHجiڷdis(?= }qdG?>Iwn`oRXox(ꨡ{*[u7 P<泸F yߒwLmՅӼc/(*T2%X}RXB#2K;0^+CQ= $S V)QO *8ne HAY}zu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺM\.;OyN31I}_kS*="ot]c:Qmwuf-z?H=Yߌ7;M&>:嫮==qVj/2W}/tb-s1Maj_ PAem p% t flWDAfݨIoFP`m>ky˰5A{Gmkv:GۻRI"=IڛnHT˝ YDG8-ִZ>")aav<;wz 䪦xj@Ri7!$ HiЍ\+D)1 :?>du>׊h'^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tɚ;oqƐEqf4H] ]uO t}%$,w O$ ڤt g&_ P3zbJMEXmK6J:ٯi7"Zvfr$j>{Sw08/NWWt f;{n)̰|[G.|O*r+<~~}YItnь)y3%?'o/~խo6ۑyßKk ~ܐV-.. 9Y70by?Y)Աۛ dpbĦ'A5N_y_eh`c-et f~ 6R{-!UQ6ƠN;ޝy}n֝ lm[~xHOIf.ޛcY'zmôw4irt-(sN vJqxϡt;exxW_#Ohh5t4ѫ=5hjzoKJ? 2! {l8B~׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺHYz:dnOj?Lc<Y?*uZ]׏m utsc\eŽ8xSI> :?q` X}܋[nJI=crR%x6۟n"?ou}/0d~KK֛[ri۽ttչ:t_p}VekwoY'1'CdkV)mm[\m7M?ޝ׷&u"8w>PS3CQ T?~]s'̃kMgr_|s ۮ0̌8G$o~P[b3ޕbSn?{5ve-Էp~Ά6_}@/E!1]Go_Ϡ[9ƛY}9sƨ<B7Oh˾X|q<|8)OCW&IO[5>M5+G@K|<Mڑ ;iZ=E~ sڥPܨn] Q%յO_^Xo}mx!Œ2(vFc=rX$RUA7Nuim.w.PBgf>k[Ob"O}s2wFڣ+CF ǙNpGt>\,~ÓD-~URDeʊҢA&O׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u٠Fb:wQB1mJFIFBExifMM*bj(1r2i`'`'Adobe Photoshop CS3 Macintosh2009:06:08 14:29:58&      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                       ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  (. HHJFIFHH Adobe_CMAdobed            *" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?k6z{,o\>]co\7_zJtȣ+9}*{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J~7wԮK^=uXW%MWm$E I$RI$I%)$4r@IKWoZoS4Epx%.@8]BOXJbxmgAwJvlu8cK%s}cu\K,Xv?um]I)}L#k}Z3_ uo{H^*x:qw>R;Նv/?ԩ}I-Tl](e8J;?@o9Z?bRAN ~Yo8wJwզYs岒Jsk81mr+zEoSX+$zoNgť ?鶴}߀$I%)$IJI$S$Photoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIM8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@`K\ 8BIM8BIM+72x48_PNNL_Science_Poster_Template_06-08-09nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM (*N JFIFHH Adobe_CMAdobed            *" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?k6z{,o\>]co\7_zJtȣ+9}*{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J{r(%E_o$?qGWn1q $"b_Qی\BI)ȣ+9}J~7wԮK^=uXW%MWm$E I$RI$I%)$4r@IKWoZoS4Epx%.@8]BOXJbxmgAwJvlu8cK%s}cu\K,Xv?um]I)}L#k}Z3_ uo{H^*x:qw>R;Նv/?ԩ}I-Tl](e8J;?@o9Z?bRAN ~Yo8wJwզYs岒Jsk81mr+zEoSX+$zoNgť ?鶴}߀$I%)$IJI$S8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong;=FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong;=LCntlong8BIMRoll8BIMmfri8BIMhttp://ns.adobe.com/xap/1.0/ Adobed@     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^_y=k%~KF}Ō$S?%up.|Zr`/{#;&3b~r4l^׺386\=<-e9&7u5 ]H~x^ ce*L<hIH`YChႚi\r(6=u>: $Ps#ip9!c8 1=tݒE#8fI#) 1?'U{=쨝kٮӻ*$x ~8<RO䟠_TzEȽS;2~t=;%YC/ϐ쬪U`F+G>}zN|Nav;$_@U|Z%{zd$'ͭz־z.ȱG!|MQ=UzFO0sׯP<-̪>ٕAhvj,ts=zN_0Ďes߼DON/-\ 7TG H.=O^sR~4ѩgM]Ęj7mc=z֓Ӎ7}dZEj{xۘjӋ}O^:/ʥc? {QK)asc<$;޼eN#f! `6` oP mp_azu4𝯑[Ht0h4/~W? T zu_ɾw^0zNqUu'_}{GR?9ݨOca/t,nu+ Z_߼a״|@)߼o^8ۗJu*PcA" =>"N&iW̪ުo.4Dz>}Mpj?4׌}: ¦Q/&]=7A"M&`@!}=ue^',/ENt𜾮 wWln% 9&0>^3)A?~^Ӕ_XIf LJ8#wC)uCIzNt@|i"O_a:%|f K e.*pؑ66ޝ{H?]WؗxZ\:;Lg@nʲtNG~״?>Ss{oH bI/Pﮭ b,}nu?I=3~״|s_F.c߼f{@/;ߐ҆3 +u#?{F7^:hTwCM/mO씴1ҀO`_FR{{HM?5vӧ;pE#/WZ^+#?tx^:g}qHoDZL 6{Hx _9~ub<'e__kNuŘ0zq6ПmXy+#?ǿ˟}6?xzǿ˟}6?xz?DDnQLw'u$*,dFQMz׭h^(-o״]6U =` ʵ6?Cc+i^h׈oH?S}^ufx?pwe>?^: l,Xc`۰}Z͸I'n>ִ 0;{~dG^r[?X_xz#P'NskJW{2Ve*@?[: g׏~ׯi{o+;?^:4/Wٟv^=^u=?1;" ,ik4v?ՙ?##_˗7~ׯi{cr&_##L._޳׏^u*R.eeOI(fM^/#\Y+jde [#՟˯ {ַG^]]3ߵ^:5gBdz׿?_L;'~o״R+C|AѯϴiNg{L_=&/mר:6OA1oko^A׿D }[z ?z'@L_ׯPulx?b~޽zd/F8-߀xamU>TなׯPugǟ{K[z 3z^xE^o~޽zs @i7ko^A׿ |yWߵ^?><_MׯPunU/mר:7??*S{{gǟ{K[zߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uݏ?폿u$[{^돑J׺j)]@*?۟~`l=Uu骪׺ٌBV[R-·] G\^*q`ZBTD.4&=uk&W@gK׺q!U\Nj4r?qx<4~< V\RlMVc dw\)qODA?_~ҊZ*?]U*&P0RWߪ=zOUB*)>-|9#.Ρ=RC҂/?4gEZ1^X"㣌,/>}zNq+?~GY+}V&8 } _Qרzyww>_>]:oz֞z_+/}EMd'Ms*=>*+U?5,뢧tum$&"z-Ғ*$HE@Hjxɯ$rc^"z'x?W)^T4sU,6oI/eSiSQܽqo_VJs"z'EiTw&¶[kI,A| I%GǺYPMۡ䌆 jz}n,},{AG'I>1#_ToˑXjHvycs~}{IOw/=3jMOAkxzӤ?_i]?.0;a&~ӭ=}>A M x(>DZ٠S,k?uק82C7 ^ ʰwY"9d*J7N(?8`b9#l%]ʼn}:׸/״tO *\vHNoPqQ[PXA[Cu: ?*zIZd<'Nef7<u= eyI|~c/o.q W6m1zOw>0=2zpOzGHPllO߼fOTO(Rt_׌.t'TA݋vZ~،` AA {.t'qrpXr0&Jࢎ,{H?OōT+JT!`Dt z_i; [^tkZʿ%`@w$G @?[_߼GGNP'~5$j]Y-zN|}ZYVznyV] J6#\ ߪ}zNPJW[̚MJi:PE 8ꞷN ~f[.dX6)T0dEߪzNm=M*M<ɫDaJKi8cӤX|,P*_LSAim.$~L׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^v?>׺GՇq{XX'ߺXZ/,luTB?^fpķ^Bl׺⹬;FWWS=7a}{˒Wxs^u:V Q+\FGU'>׺Ҭ؛c/lMU }&Om7{{G^GI͐b)U#ɘJ4bWb?TzT?~MCUq?4"{F_,Au#ӊ[~ԣu ~eW v+zb"AϿj_Qz}CC]/6od#붟<{RC҂}ݿ`|FޢodEǽkO^CҢZ1+ķ$ :곪5soi״ _Ժg6UnE18W^"z'?fd {AZQV,=zޓ?Lc/ א{^qa:O^E6ͶRBkTkG:Ҟ4q22ؗQ6:Ғvu?b|^>M&97i'ʾ TlӒ>/ϯi=?A t纾8S?f֗7:ɅakZ{>M (ѴR5>oI)?z^zPQt{3O1-UHu7gΒߌ=:ގ_!#O:+#Pݱi޼o^GO mJk>gNJOt? MQA;=u<qvXSGӻrZ=_%Tkq {:~u+{b[}M?]~OJWno{u)(:FkGwZ2uMF͆@Λ7_1zJJOO4 )U'5Քjbjck]k@C'dLn?X@TuKX:~}o[:y|=~AkG{ntEݵ=F-m((6޼WGJjO_W{,f6(!*!j0{oHEI4a% q2Vw/tyImi yz֑҂feI)eV0/{UES?޼G}oHA-aO>_ SY;]j̆Q+!an-n=^A?]|GiK+齼bM?^t_=[#_ni O->} vjoר:SR/"Eҕ-Vn9_!mϽkoSרJ:_ h-K$S2Z&*hO+]b?ZׯPtM/QgH-7L #(~޽z7ǞhZz, M{.Ut*b@^[qǿT麏h֏zd!ZmYEEL.@=nmh-G#SZsM@`Bbixm׺{0Aq1`XFu{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uݏ?폿uQe{m< rDruH^;dХ)L=uF_X}UrʫߺYW'k警{N =u>'Q+tm}aIn2){3e~{%&ߙ׽fB\1BG={^?{-\(Ϧ;6$iEQzXP|Ji3ɊHb4 rDsj_QרzSR|\|>)ʿw;tbei*ߵ/=)iOϚ ?!06#)_f?*,miרzVQ+O%\3aI]:ʀU?i״U1c(B~z2@H'ܠ[aǽx״tkO_Gz;2+8oWpڸ"z'5/:b&nǏ"joK`1ꋪAq>^zVP!oUD x"&fu7*.!#5~:4ʗOÁoI?{׊.t|Gn/9 2cUx<f)ڽo^:RQ!o F+EeMȂ߰q{ܟW_i* &0svԢקo6nOox״tokӂ-hǹJ^MA޼GGJ )hn̯ )ɤUx״JC)4vNNRhk{[׭*?:#!A^DTo?]`**n4I'}[`57*kqU~x徧}SzAҞqCބ3GҝkLc0`O^OEq/1]g|1Gt{O^OGg뭋Afx>h_ %/:$r?T,Ub$"c)Mp|!Ep=C=t{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~wco~p.?`=uc9SN_4k{&[_S{yr* 96&J,ՒGGOQW! NNϿu{GyݱF&ö6Գq /=`k~,qrny#AE=>"O$4b=ׯq҇'ˬ 1NWѬ rDJZ=RCҶWZ MÛ!}gōd\a N&{ֵ=*o]dym Pҍ\Z&VRȸ=zK|c"wXbƖսO^L̚Iw/O _ ]77@}O^H?bAzLa{16tCP<{׊{IkB>S},hZ5Bqv~۔~Zx״4_OZ0 wv|ɦ=XSǽxJjOOʙw|}>56v>L OTt{\/zJNu)<ݕv=P6[Hzu'r8O1<uUamkj7״|Tq1GۆvN?0 e:T}u*i?9}ZG_m.Z ׸bPDUGSe߼c״tv5c)!»_/[F_oTi [,>7[:WQzBvwʸ}Ԑ*%эԏB?'߼fu=/#]c=o +m%^doh2lsT ~ή۞o޼WGK*h +1d${ɯ$=f^tNj(Ob!g*J}N<şߋ߼GzGJj_A)?H꙽(9l9y?oh~׭i^?{>8ޛ|U֛ny"$Oznӥυ҆7h9Xz޽zuMu4uO[cblmJA*xTcmP(v2$dRbh)H5?z>{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u߿u<}x_~c2ĿXwQ}uxd(ctOuk ɖ9u+1=u&:YV ECUQ)wg:QQa Ic{^GGw^JHv7FDHRIp?@x<^m0\OCI0(g'&HI =׭=ω'+RAIa~Xt5Bq&e7ޠ4ZׯP, SH{|K1@Y$~'ϿkO^O̗"UJ_(Zs^*u''ZUόxL>S_U >$Yr5/ϯi=+h<+z|zN('+bs6>S2u7ݒ2Kմ5 ِe+yknpzu'>+#L.ˍ I(]?|]]lXcz{mɏOTk`ܖ 8߼o^һ r'=Bl- D,:~oz^6+ M՘۫ D=Oz🟃~u[콹Mo64.tC_S ?;vƬ\X1[y MÖ}܇Plc-+#ut[T@0*W_%s.Hb͕GXE {׈oHYCV=ԓ2zt-(vq'hʘ*`0G¶)ꞽҦ!A<1A,DpƑ ,u1I_~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ]؟u@o{OSM ,j?۱7L1 gSsg4d7_I'9?6?=tEA^;?+qPIbB@^kn˝8L7^ŭF5>1y~t=8,V+Ɍt/iNW}G^kE>G>ο9LGo mkרz\c? ʟoOrW#؎R1!'n; ?Sp9i״d4-']#FxTCq͏6׈{IeAn7Uu'V&jMGX }-.9:ޓ~èy2'6^*u''@FvLbù;G+4z+G֦BTr4bx׌>O?Ap5%VZ=@9ޯ~^z_c9]'^>]mCi?yC5- {kCqG à_|O8w~ 5Crp4}u,?9R-kZc6_^⃏U aS{=?_Wxӯh}X'##49nćҖHmSSr9:G}oA?>w˕ 읯Jd(&ݣϿx״87p:YO. iыAiosϽx״ O[C9nd$仓:0~y[##[-m:);#4 fᅹ >}sxw1M>b _1jrLE*ZWzB7W J|BҺJOIu| <+ҵr@l=Szt~1br|ih:q//>zKTun$uet8h:'Y~ڙlBA>S:ZQ1((b #0F!U[ q~=u/ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ]>ǿu4'/,koUs{E.OJh_ߺ]&_'1deU ߺNT3l^7-7al^#'7E () Gs!p;Yboc~ĮS%61K~#ߪ=zB.7?lKIIeI\FŤlXP $j_Qz\̡QG ب_ؓOs҅ZQZׯP+/%w/ǧ%G}Z߼DOB?52j_n0Z39W"2'yDzOKlw:bu>cu.0Wq4w]0H>?BW^*u'>uWk7OƬ!?Q]=TW/i?W?N}_^z\Py~Xo]QvVfހV|e` x״xNrK=iG#koիqkoGB'ٲ2׋mq//c:]{GKjNO]% u_ k7Nc״t ;g~E}_cW؋am{nދŽoATo4~y[ݏu~;qێW޼fu#7/ U{w4Gdxr)G}~t!ܠUtG,|pl!JmحyW^:Z(ÏƩs6Oy}_rߞ9ϧ^##+h…?zm?}\_?Rk<{ֶ qN3oƪ'OtgX|7]{=z7A#:o޵ٔ67mDު}zK~ژ {qV '/Gy^C{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ]^B~׺TыQcѠV>׺ٜ:-k5=u":IR ҡ݂ޡ ĒH׺Uci7c]{+UE-省oߪ:B6',S.SЩ 5Rr48CЇ)(TQ|>% KBbpAJ?<ֵ=/q_'fJnԧ b1QpB f_A #ߵ^zq@e>2?^[:V+YpK(_{{׈oIuGZTuV|qa_ .Ƀ?ǁ:Џ@;rMnہ,J;~VcbqRpl@[n./mx״O[y|xƂ9{'7c`xn>?.eB+R;`rd[pR\}9zuxNz[1&[ha*2LCn Ž|XNgTǤ~Suq[/ k\vǤn^1>} OĨGo6=ؔ>*jNm`ف=o^:]*2 fOh Ղ8XwtDapC]VzGB#.fMWVRdM_i4ɿmcVX[{3ɕ3/6 ϽxXc1,/NJ'4V7lӓʏ ^:a6FԒO}u]20&JO^Df߄HSUPT,{u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uݯQ ߺQ䭢],_Ң$añ*\kWR/F'N4z2)MCYm*thq޺K_Vpn挋#"CY(i`A~ ؿ/3a[?E%ZpK2u35Ff֥n7x|i/5v& ZMWHW VZׯPt&b?i~,n:]Bf{pdpSqEo~zׯi=XseZ{`z.Tzd>$?!^3$׿X]%t *.n[z𞯘3+1`Wd{?:.>QmsmC׌{I@tb;pcrIF]f80z:1I|ɔ< mBjqȸ X>39]]a\Fesޥ{/I"^Й|K/-a}DNn̫'`,.<EμfzKwFVwnre͈u l8X^:1s4So _svofbM׊{HC'幍Zwhn ؓ;?-zޑЃXoьG7vdVّ9&97I:zCb>'mȖ+=/GuU zy n?Mר:q] ӝUuDŽ<@(K?}=׭t"b18ьc((C0N9 ]{~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^v'/{ 迩߿uI{!C Zxv׺|\hS '޺J n;nn|ޯl :SKOЕq~fьgJuVNjGT>CЙ1o/l_[Q&᧤P=CH#ul?ay?g#iCoP%G@bz֞z;.GIo4oEyh">r5'[z1ȻEn}k[R`K?_zSi= ؿOZ쯌TkkE=IvICk_^z_𝟐9S1oZv>06Jʼx}U|7jqƿXsaZ׭#⿗QCU\>o c)X_I?):֞zSaC񖶂2l_7]/)Z wMoOc?P~'^zJ lqa\9oW?I?_:ޓЧ|*Gzi}iU;%:/HQce_޼T' )9Ȯ)#+j(5oAx׌{ARq,pR7kA:9;_$ x. ~YMpL + krU2[kou>?':%qm_a$nE uX>7zB>3|Vwz_]zVWWx?[:p˯~1~;ޝ?zhfjOk^AЧo= i?Pu0F(]޵1zBv'bl|QٻS  (-{IU^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^v'/{ 迩߿uI{'ֶ?G\ )NX`!I]{+do={عeDyu6]C(7'{^V|O__caMϒ YlZn mZuO(1|B[l]zldVQ{9kkZz'W qRJ9Lz8{k cy >_!c'޼D}{IK$/1]~mG7X) @Y6.B߼TzOB# -o{.NPy״W'kmAO#O'gÃmY64t8' oGB'uVƣuCWu#SlB u ֆX"?']{׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uݯ-/߿uIBm.O3s;Ͽu[KTȔ-dGj$'#Jpŏ}{'{3p]ݧ2{.k/{G^\|: O%1!gH5qZu?`9E0"L.qNu(ִ= 82|sD;\^OEHz׭= oWrv6z5[-_\{X8,~kN,=1괶c5Qvv~t_Ψn%< H~}oAPt{r_=mRFϚd_MK9CW->6׌=:l_'N{&?\IapU)_|'_6'~swX_W1zB+nn_{߫fuc=6o^+u#S?F#GuNܺtsvy4鿓>^nmo k^t'?|V5ls䟩GzGB wہW㵐ĺf 휤'ko^Aзn~v3G[7ZׯPt*b.& ^}8]9y>Sz׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^< <׺%],"T?Gn{^*1.c`lV*yXV6'ߺJ ^#7!p;{r؛y/pO1'ߺB o=!_z?+<CЫ_;sz|>?v,gꖇOV_z֞zs }U~.ݷbƥxd!P`}O^)ahڎ{pR<`I@x:\x?'xGƝ3h5X ֎&?W״ /'[?&~y !Q~{ xӭ\qۃ=tA )k_<-״t):}Nw'.̨ Ș|OZÍB3>*徿su O%>GG=ۛ >7˭ /o~7I?6s{?l[z_i x :|?ev[7F?s˗U׭ xOm?Fe9y}YJ~O$޵ _Sz,Pzcu ?cCz/ J_* E޺N׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u_uJhE娂!d4؏~E\%جy<| YO+ ^GFmn\c}6Q?uOU[]؞ ˭YLxU_3zt|?u>Qs`zjykO^CпP_̇8$q5&Ø Ji7L&ߟzׯi= Oer̂jtFv5/x˟ N/?=2k46g6`i3]*c۴g#Gx״l'CYxPK3zMBO=C/e0oGB'+ƿNm #W:_5m$7<1:_ߌʃr5]WsnlJll>7o@T #/{nM,_jhK@״/W[؄Q7AVKZ}]\ǂx@j^##O tGPO" +&o U\㞬 ~~׭t3a> 8?$dW2I6N nh(jmk:BT1mǧ~(Z-wvVٵ:ִOB%1AS}}Õۋx^R'|TzOC%Iky!ޝ_B>/ϯi= ON}T2k(mp]dd1xӭ`qi_1rԩSܵ6c6^7:0ԥ -a!ŀ>7^: ?G,=ˤ(oݧI,Yxe<6ǽx N\uQUٝppCFO⿯^:ʣv9h~%u=LKq-rUW^#|hF0_9c% )4U37sZ,'Wu뭉v;)}?A p8޺^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~w{ `^׺|TlL9zerB?t@%J Rf'auGXqЫ^݌ rȫ5zCqcZGO?~|no(n![޵OC& F1¨38{꤂py,L޼DOB1 ٽESz={׊oId{cֈ7?pJQ:hA? 6޼o^ɃGD;IR6| $0x6 Fo^_xWm:@ %_tۏz_ x0 0'[]]$`,n@@>s^##o.?[_O?ΛWm7xi޵t 8?vǏ}-Dfʝ@Ǒoz޽zk!lN6O>:O Tʫz}O׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~y^Xո{9X{B_=]<6=uʞ:9ҶI⡽d7Lq҇,{YkoF =:%H{ qt= o_6w>dw^ށůj74Qj_Qר}:cQ~*xqq}MGԙ5"a_=zB 1l 뮲 j}8 Z Eh27ǿx/'xGvgͺ}+"6 ;n=5?/_~}{A`ڨ+Yט$kow&y[-cP޼a:ގ,7'hG|d>A:jO1z]{GC6&.'mR>RlK04T)׌.t.࿐26Gm*a;xDXXnIAGn=~t2?h1|a[] $`,YYʨ@=^t2mCj_hlT a`DZ}[Ǿ?=wo.٘}v=׭t*QZZ JZdpEMqoLPQA]{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u߿u˺ ]Lk}o~Bl%Lrͣ5Co{=b2yX>s?)!|X_7- xPL?{÷3jj@J6#;:K\]/rIRרz_˗x "'iƺ&_h<CV62,!APK;shb oho=z˷ϜS5Fkw6I^ޡ`OxzOCf XE$yFneW.?[ތ:ՄV71$ oݦ}O/jX׍}oGC|~(w_Ⱦ "(zlc5l^ycFc:ށɅ@O%R{VxOȻ?B?^:0_coWf֨ܝ2)=3_x?ַ>e~t1mvä%, mWdme+GCݫ66 ApU'ϯPt26x08<> i1XشѢ ǭ{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u߿us$}K׿u%[Ai,5=tfܻBt-@zy?u}c6Dk`²͍̖ ,lXO`?޵/[e-o]ğMMcѺH=Zz' cA6GC^† ${o!?x>u/9m/K7ZxyULؚ7a zWi= N~Tz~Lu3qv{D?dJP{׌=:ގ/'| =KX~c}u {nS#7 W̟Ym$`nڣ]VOYA_ށˁC_,7pŸgrSG'/Gx״/v[M/x}˽Gt ]9ʘ/{׈oHkX %7=2,*\06koSר:vD6MV[6^m0O@Qk~-U't  ]k 0cX{^^۟EohwϬ;7"ƇA޵5A(Ĥ|ڢ﫠eދ=?ȳ7?(pm}ODB?!zׯi= [s 9z[;P.g^Q6ګR5ڿ>[zp?𝯑UOwJ6;E7͇SoQzu Ţ60 XVX;# `]x.nw~0*zVpUcbZ#3zt3`?CF; #3;*r;xN*?%gq'^z69b9A=Mco/Er_|TzOCCgVa<`uG6YHj}:ݷ9;dF/t cn4 xރkۿtmk34"s5_]!״''0B.3$fD^+u#? Ou{dFNʗH357޼WGC^Yi2>#'ET\^v+2Zt;wOIw&ǤY|h"LxACS&6ISPCINJC{^_u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^_׺-e@>(r=uŸ!EXʔU0;BI4XߺBMXG~̤l߉^á >)'KHl̎_ͼ~nmu<}d#/ ߽;C;Z89o^"z'm!¿ŇAֹ{$:.KϽx״'sS(auȣB'Ȝ0ox:сnYz@AO(ֳn,o _oGC~|\DȽ*^KnCDr@$F_:ޑ۷º>Om+mCq9-ϮQ^+# AM6=072oϟ^:6?{IcoJ !s`Go9 gֶ=nou\=Lj{jా28?{O[K_~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^_ik) f(w#ߺXղT58V<ʱ6ĞߺB-mm݇]_6?"5XG^s|չ .'/ +g6nA;oWi}Z>CṄp,R4A/mڝK-h3UUK'[z6 s6XnJ/s$A 퍹X{_V޼UOCx$k:weom"ɓë[P_=oAtqiO [pHM0%x,s3|c:M B#4Zn>۔SXYC_[޼fzGCE=ػ̩NURmjB޼WGCM.ICC뤄r7qcK^z#n5|Gl[*q3tվ^1f#YMר:0{Sk툼om6:txpx|v&-: {[ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u߿uI41e8P{kŻ%C+CW#b=tkFK'uy7 qpRL= AWTuϚۜD?#jCC=wTnK*pha#|zԾ:7BG-',Ln+3ƣp1uׯi=k0, 7e#v]4@LyC7xL'{[E X$ywȣ"|a]kC=N5 XuN->L^+A[YM2^7˯hu۟I}3rʺKv_,׺vVMFVlOIv\-3Զ1cUZq=nm,'Ė.eȹWQAhȫ5fo/xӭu?NtmGw |G\m"ޡV2ηjf׌}:ށ_Aw1-y1_,[*ǯi/+lԱ]վ;Cu ԴE?a ⿯^:6/5b{GzW9zȈ4uٚ:%[zAр}_{7뽋| {K Oz?ڸ V6r~tSG,?${}nm(9%ŘB&]]K C-%^u dA>Fpc$&+7zSi=w.\feۛK|_90(/N=81}kݿԉ>w5ьB]#7˯hzۿ𞟈87jS` > ?p>fo :ޑ?^lݝ2oO)Cѧkq^+#m+_$l_Ğ+ir`R#w]o:0oƍc;CFc6۝Ky A֦I\׺l\R,Φ w[BFO{;{cw<濺a%͆XPܐު:C΍co Ȗ7 3KnOzԣuXvnn22Ko4_|DOCA?:hg7] dU '6ԑ9Σ}N=mNpUHmvVnmǫL ?zӭzۿ𜾵hwydm8bLۧ?O[[}|^:🿃f?}ȹnb 7 uR~HT}~t>mExs;7s[~f8)=^t=_?f ~u`nTnZz~uj^Aш]9[36UCc.-?=ׯPt#[׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺>ͽu)5/sd`ߺN̶U<.s/ap\BWȡ7X;7Evoa|ZÃsl`IhauIcxݕ͙XGTm7C~Mv U%!o=z/\G.wu|tjLo񟭌p{l~AQxOCQS~V 6֛O7dYsYXnxAm_zuoo/}Qo,[_f=] 4ݽ>{GC@q&6e@o"\h㔃r#,~}nt?G~~x Qwin13}4>?[:0[W +äSUԛ'/]Q`34uIs]l|Fm^Ћ6ګ5{_ 4V=~׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{@{WK6<yV?^u-nML^;'x@i dB }ttofٱ}UصqV(jZt2%uC:uX"r-Jl2o_#FQ(o~8σ_#%\;06GtT#1P|, ͉^8$X^y^3Sbr3Z1aMCiHmsg9}t]xW^T>1'hcqj dZĎmuh!l jY%ѥAA:s t|+鏆8Uىbr-tM%l0\OߺB/Bf-ƣxPBeuN@7@=t"bV53av5Hؼ*VH@&ou׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺uI<1J>$X~wI4;Ejrl Đ,~-1}wٱ+ar*Lh6F1UxM{bU<#+BC`x =t|(_nm*!IF[wZEZioFn9~?&K{u8?4$]^zZ E\ߺB;uَޝ<},9ND5(U0$Bx^y_[1 \J9imfBjt"؃I/{?[g9Tewof8cc:q{/ ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~HH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?\o.7_a}b_ ]ScNqq'W{ۮ /_[wIMq:ޗ8_}U/nH%0ouA%6?z_uW_X u\o.7_a}b_ ]ScNqq'W{ۮ /_[wIN?]Ǡ ??=?{Vo[e,c bR?~!O\?pCwHH9 cE?޷>uk=Vk` YsCێKKUunk7&yx{\~m};)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$$|Photoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIM8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@`# 8BIM8BIMiX72-Inch_Poster_Footer_LeftXnullboundsObjcRct1Top longLeftlongBtomlongXRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongXRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM )! JFIFHH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?\o.7_a}b_ ]ScNqq'W{ۮ /_[wIMq:ޗ8_}U/nH%0ouA%6?z_uW_X u\o.7_a}b_ ]ScNqq'W{ۮ /_[wIN?]Ǡ ??=?{Vo[e,c bR?~!O\?pCwHH9 cE?޷>uk=Vk` YsCێKKUunk7&yx{\~m};)Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong;=FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong;=LCntlong8BIMRoll8BIMmfri8BIMhttp://ns.adobe.com/xap/1.0/ Adobed@X     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u)_[?w/맵3׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~{+v.ѻ?tN׿ҷn_O~ҟ=z?>7gWEV^A [ryٮ{kVݺui"u5+§׬vyn6hݧŊ9tkVZ ҕщHݓ?/aO:s?-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[׿7d{οu~\6-k_=}_:g?^rl?/F~n3W9oKoZF}zw_y_׿F?%}{#vOч?߿G[[m־'~_eޟ]u-Ѷm_^Hݓ?/aO:s?sgdn0W{u9{m[C%%\c'j??dܶFY!EMƚUUP/Br`%iK3SrQRrhuo}ͽI kHQlm *I&$rz='C{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺCO!יzvl.Żyg dRz:YvՀbUD*s-xՀ^d%H`%pJT@osWzd-%0 I`JA"xI>mybYzooZz~B]ܽ轱Cٽc79vܨ&Ȳb)#`_sr1l$vr2 t >G̼R/odpWZDc9,;0[1?|`r 4MBƝs^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV%vn{efݒ!6}v< O7ܧf;7TXAu9KpO>t=cދrAZ ??( ~Uk}]}m|(ľ:7hR sB9:_6}7s{LM |]B+ѶmUPRS|7={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺW7wvo?1m޵ۻ\M͒],2ԏws4q'gIFa/sXyGe٫f#ro[\\Hg]A\cUΌTTQm[o2{#u_ss庑k`4£0ϭn}3~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[%=ԝUՐ{3#{Pd@5%'}]`m7W[ ιӲrL~ۉ?n?WU?Nv;To/{!¶` l͛b "U5A s彉Zna'xI#lOY0<=ޏ,ְH߷JA_{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u?g2&_frx>GQ岹1EygWH%,B$U{ݷDj$;HE݈TU@鋫ki/odXaY"" ,*,$ƾ9_o"_o,??h/{ϓ}s'2/G^\l VQc+1J~GWUc椮khki*ʍVX]Ze{C4LQԫ++AHB+.mdEWGRYX*XA#^eGjL *lDv6ܛUS!> uG@]B ^@g.;t2\r{G kiqpMHa“C@&D5-qsi`҂ȷ7]A*%u,"tes_/_o,_k[zMnΐ̓qoΚ}?:v,Uu(df)!dHٸPO?qf^bw U!LWPD Ĉ inK߯߱o7AwQV!#&'?^D $${A׸t4c~7|3}eh2X3v;'jrjh&HH>[?g-"h'E9#ۯ9dtu) ) z\ݝĖ{3#[+*eYX@ S\?x'; _o,3G}m?ȬTɉH5cz|WIT5&OT.#Z)r7\{Ii;2ۯ,I#m0. 2!"?q/umEC)dquH*2$u?ϓ}s_Lr4{_ސ׬;7[6+NwH7Dz<oDmkp1O8lگ6Ϩ}]&:?4ףZj]:*{?-s kx:|O^'m:TեZu~8bq9lWYfjy|JA &?Wyr8BMokضݮ.n'eHI$w!Uwf!UTb@NXZ}*A*^I$eDDQVwv!UTd ǡϓ}sCY?x?Y}Z:_k[z+'Da߿O/e7_֎G}mWb5.difr4-v>VHgTxE XYr_ 2IQЕdt`YX  XUtt`2XU 4';׽t]cٝ8߮7aɅZ6̦v!r&Ql.~7}-a?.rO8Sگ7?%>ZO5GLrgMeDcuݴL|eWU|X񋢖IQ&+h_SXs${ou (n&C>m 4(_ofKwOتj:W[ hQOS\?x'; _o,'\l#v_{,V'EUe2]Mqu U[__[S@ 1#I,0UPY{gذwX`I$nDwwhB*BqeVTDKfwv!UUVRY@$0A9ArA4={޺^Ы#7sl嶲 Rŵ:x{QUbe4ra)!DLl@{[t{Mocu4O6#сSB+#엯[Յzu=ݼR yRaP*:es_/4Y?x?Y}Z:AG}m zgH^faNۇi ƈDbS<oDmBcr ͦl^mhӯMz55ӭuSP̞/sq< >'\E?V~Z[NWI_޽{y !(i櫮ZZ**JpK4ҺGQgf W1YFM+DE,hf8I鹦u8՝݈UUPY*XW>O5dSxehG}mq7wh'Oq<><rI6쯼(wI;e?ǹ1Ix`pEfA:޺^׽u*'[ErY*\v7AM5e~C!]:PPӆY8K; {Qiiuum42F]؀3@5<[@7. 33U$$㡫ϓ}sGY?x?Y}Z:_k[zn|uY,.U9Duˏ>+a XI4_z/yU:Op? 2lnػsHG>F!&VE2PO6^ Vzt?2.e:;lh[ʰ^'u{ߺ^׽u~{ߺ^׽t[}v^`[~./g2{cci* }9sF}:-Vj"5b\*$E[ݧ =ĩu\xS?]O\cpT,o~z*Kz͑"ڎXy ݐKqGdB 6}Q%y yfhr閠0i%5*H)flzEWov-UnW葜5 oƩR=_}m Y%=HUĂ9n.%3105UvC!]UBC1#I,0TPYi=cowX`I$nDwwhB*BoqeVTDKfwv!UUVRY I A9)φ:u{{^mױS#&'v$-LCod\%[ESҭȻɷg,/8s 2K /P4lw0@TO9ԝ>{o2,O3bfh&c\,N*E$E7Yуꬼq#+!„y 0뗽u{'grv&.l^ho%=|ت;tSQ!$#`]0$e6Y6%ncimln#V(^Cub H r^\YXGqu.PՊBT|kg'2/GE_4{_ޑϨ{s(}=܍g~G{]ϵ(+ :,79$#Ҭְ'0}|jӲmKKtg:U @M(:8ٹgH[%3Be؅R>`={ߺ^v;#|}v[/q8JO)T--;AH,+p3; 6roy8K$Qgv!UTf In.-伻b%gwv 31 f$$ӡϓ}sEY?x?Y}Z:_k[z^:|mUO"䳻c}I&ޏ,ܫ<v^֎=Кb _`7\q4=׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tG9ݸ,N6DfFJ3F/پ]lbtk4r}2ɀ?Io ݬ'nbH\zѷcx aw*_>/?fqZ4HG"mq}ɵCusF}RDV!O_M KFF* wI:km>!2;0,P()9q !˾&1Kz}].@u)`=݆//R?;VkcVEcԣ $Xy^cFv$QvU.4j(z'Bǿkhy_:2TCwdTMJ|eQbr Sx>ns{vYv HMV(\9ܛڟ0Xk)2L< G;;)bA5VjZk-#3Dc?1{6h;.AEq!j7OS7w]=i)-ֿR>`uO?C?Zu/Nq&ˌ{ n ӢbUA!}s/^휨U$e4[E1ֹFdR9}G~x큡s/d8$j ===<CKKK T$  UP-1E,(D@U@ `0qI$FV,I$I$ԒNI'${q_:3;k$!nop=J̒ 1kF}~g9i/k#pNC22jV%E= 䫯pÕ-q%fqn\VhBŇU;?+z>2[)UZ;OںA6^гOxkiu/ _M /53~&v=O{YyhviE~j,zp{I6m[vV KGZiiV(=ObKonb Wx+O.imf'w6ld, \|롽{ߺV:'yvLb@T&#)W8Q:@Aw}W>eM0 Y."fcP{^yPrmx}Rӊ@`xɖ9W=lﭝs{{^N;AGovM ߏxz"B<=w9^ט쀧t?iU .^7hv jcs6=1->T>}p7R\]4gv ǀU=lM3ۤ>1̞b7nfn,htYzDM.)i:E'o~^ڏo}MK٪;r(hɠ`2aXe땟y.{UͽA6?Q :ԡF}:y;??p"u;ֳV!]srdy)(lHsnp=YYɫnn[kOikiw) x*mbR\ >qpݭrlw,6.-cl+$qƃSϸ[o6Eu'K+DKcRFnu7b]E$.=RD(ɏK6ٶ7sI-I20e`uV2Y]Cv ]V>2 Hs t)D;+<p0{ w)Y:09ҏg `v8qa3&>i0\;4v6gܯۏ5- \M4pt(×tmQI#DuTt7Y#Q}*}12;(eؔln=t:̲d=WܧA^Zwl bEu{a8jjsWۣ>+lZ8i}}VB#!5G{Z̓ o^fi{A4%dQ@=ƬI"An{{:Dlz{j;I_Epm|Ǣ ̅ih" t,$N۞Q?p[X A,P_V9RHܕ<-FɊdb:69S܌? zGt|t;Q[Yk"_'MgXv$jo =voy3v:ͳV)BYp)TiK(gTEّ]ru=+>lƄR2jaa&* qz Tt1닸C`?@\K0Q玶HϭmQ(y Rԛ'#W]-C?pdQU c7>ڗesl'o =bOx7O>sjR4HGJ |2~չw2yE/amhllE&1|o#}ә/Avҟˮ{ _]+A*^{{^׺u{.3D}IR*,h8ov'LE[BS6SSKSv񐄥F.ULXڦ):Is"K{Ixv-ҩkx##iIں|L6C//,{ncJ ! !LkY\T"K]K?Y-׻Ko콵EJL.Qh5$4hI(2&$>fbO-r*mrՔ6650P5;RWsbI=`fo\ɸ>ys'$7h EŠ*Jg}~5g0XMψɇ ^J,7rts KI_I!6Hqv]v;iԤJ$r!⮎ 0Y_^q=0d6dpeu!"=P?.Az]D!{1;lVKA"=55D ]%BRō-@ZvvIoܯݗ${q3@Icj:(c2Fhg^=yxKm˘6^hp7HQv F p#&@=`7E m>Z9L٤`-J>nѴ.'Rک؇oo}n[ӹoZ@N@I"I6 &>r[zme38ȤaRA֮** ?I,jrO]9$S~׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺O` Tr>_Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u\AH5x G[/m݅rγav! $u={e&6gʸ'?v~co/_ґWb֌ #hD_B.n >AeAsPZ7ݠ6v2i%LĿ咚2|{Cm40JL++]2n_\s %HSiidG?D'&Q2M6jU.#R`ˑʽ ,Njȿ綿兝zl]T( (4.Ñez=^__>v4"IՃ<#$J#׽t[dUhm7.ը8iyΙ4',<54_[5xRx#_mt}}ޣ9Sbdzz(gijH૥U)zu?F9Hܺ2!=G].3UnG |z펵ǡuBfe.˖hȒ k2մђ$RP@ٽ#yJܭ:\nmk )I#mמ{z6|dmQ=e gpxut7[NwnTpn}H|IF8L@GL4nOw=咊=0I3c*2qNVdkax_d~_s$NQc+ K-@"_e 2g7dy[BAuE R#!<(r uᠨ,⢬Jk/OW,yxóvbI7>Cw{;9VEs.o\>]u{K{y6x3D04:*h=[Arc[P}TlYJ3l yF[m{a+&d\{>Ϻ\7_$/l}zP5迭2>emؿ,>CmBspxɽV$*}˞s&Eesq#S= ھ_5j?ELkZ6SX?>Wg#O}٪3& 1Ϸvxj{vдuP1p"ȷ[! W}=;8]G[} VFYK)|"E!ґH~*`M!Gˣۡ>1l<XUd%$G ֪qظ% PsQv1ܿnj`*Q2xPp'~9ܫ]'mCRoA1ՆLf0~]Aj>B_$foZ*u_5-^/Xw}/O$j&[ԩH|3{Kmw U\„x򴒣ahcuN@>{skev/wu_^EGx0V^S)D8u3~{ߺ^Ւ)ݰf,^H?_d!0s}܇f*v[4Fԟt;{=qjM լzf#ڣg:X(hHvC,,JchL-n9#O#XTTp4"БQHA H (~b~AlOVt^דxl`Y ~HVWԕ z8%H-H$ϟ9Cݤ|B$JEg%"G`'*o4s6UzT$Dq'VHUFuWgojH*ew&k )jIJZe/V#n ~}Q<䍾v[TyV9]ݒʂ)Rls^iI;ŭ r]2Tyvz_[drSv'HoK ǖ -CFG#zcfys9>b}6 k.S+i8OX๽}ݤAC%oekUkŀV=߳UVIN+HQWB6c2)jU SK)9G\{ X,H))"iejie'wعP)7RRH EjGWAމΏt_#~:o} To]CQڭc/WM$4t8|عh/!;otvQ{luf@UF]5@kP s~pWM k^o+~ptR,G*DW]Va#=Yԣ>Fuٔ>]s^ӿWkm(=` }uE@o}lɵgx.̣B׮_}7?+kX>.eϬo鞩;v9kcq+$%6.b'NQ:zhT48XNHQͶmQ\&;dyj4,*F抋Ҹ$|!zC9!#ARK*?7@lViheb{*wNcsy%eRC08E,o -^ɷrŬԑkf BH$B [0Fe')yz[dgW8iq~XSa:g)h{/w^TN͹6iZ̖ cUFRTJE!!^Ur%5lsm;zkN^-v57߹0Y4:eKE$gMG552ۻ]ӶrYͻt9g:Te1Y*e8hC=6o޶7}e%D5W2B?7 ilܢh.-ݣ7dt%YXy ϵ#~ȢtfS!ޝjL\nXrDMQ ǐ}3vk"\e"x~]Qkd>^zl=*y*tzX%VV1ыyokaGu =X$6!V@X]Um7ح GOmR6cȤO7-@5IXZ}}ib9~;d$m Kvr''yS6]&--< @|IQօbڰ.KVbAv7!i¯I_T=Ŗ=KVxYwOP?-c{7ܶC[~c{'DevGՂ|oB-3$u S%}SO=EH [αI$1$e_y?kۙvݒ7ab*|WxfxD r`K@7Vd 4PU$EB*::E,"Yaq,R׳+~G>DqGAȮA?h |zՙ T1Esn]7/rᣗAvӠ?砡zʌ@m??{*B] [ʴY5KEB~oKqWez:\i冞xii(!zʺDtK,YP.}mm=Z)y$!UTI8RIΑV 31U@f'@p$G=˲wA.u6&D{o؅dڢt=<0}}޶hv=|dV6¿K £ BƊ˟}'ymd܈+N720s#gG~Uu#;m'ooVԥ3GƸ-Q %6xĚ40R^5:Fm:٣CWR( #J`# k˒pwr2SqD xfr 0f㪲λh`tF4H!N bE> 䊤܏&n yJ[`Uv uG˘&>[ZxKsOgk`O*= /=}躋5:}uCg0LgabKV!OM7!PIf߃S&r״\mj)V4IqͶV7-ۃ('Ñ䄴j>ZEl;Fxm,|fs Vts:fKY&sL,N9QJf9g9b;9RXi0{^7 #R߶ YvN`GEЏ&VWRUԆRAމo񚃰:~Amrh䚞?_QV*)2>yӻ0ɕm_}oh-jl J鬙TwI!R&$1ѧ,~Os_ qCw'+jp.|w?pZ|?K&5w%8,o#6:rOsay Y%̎VɾAQTH'MPgxE RռW%_nﺽr?wa;`en;iW]Ai7"lDo1ann84lV;-]E[Olg'<7~_߬_,uM zѮ]e"h2j6RjYu?{ܬ6{ 1 2*H*~`h /-NURE}A=9ژݜN fc3V41;f0i  9r}ӗ7 H8TU4 ts6]yd[ZFJc4QŘ2zJ]5:nja)XR-tۆI,Y|h}c[w|r^F[8#ŝ疄UI:L`@:w}{U%B$1*GAc= _Scx:K![4ttP5Mee]D$qE@Uakwwmak-0I# 3Up$--P,fbX$ӭ4[9;˴J/*my4ɧ5{Z BR=(~\U4OfD*KO"Ղ4N'grvRdRR5'$[==H{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~li7Nힺϱ*pS)$q;A)dLA.ڞ&>Z$oˮx}6O-QolG%}usϬ=׎L$fq;)֐?%/ؚM91A[}L !I}:?Kavi"~,u:|;ٿG@럏EyP{2u0Y*벡H}{kO=7Am!Ԑ 7s4ڗDTv5>a[7Ȇ6K\9pЊG'uiL; N")UȰ)ڮVc4gv< u#I#"wc䪠|-m/ncC$";y$<'9o1X}OUʳUGxDUPP,u lܾHkMW5#f O, X4F#$Uwy f1uVrҎ)3w;)~N?${hE {bn]D O>lGN?uٯlcunu46b6pv`잰کp͊J<М@ZܽJ P j '?a~HM˞9o=uOk;;-@$IQds#\P,ĕP ,HboȜ}|a{~PԯK)Dy֕qwt׾SsnSr5|F™da=o{fIs@ZIH8v_n۬v}hEmkCj@*xRrz2?7믗}TRl섒"Z¡cH I2YRscɍK95xR]G^c}߶*j V ֞}nEr׹vwCB/3NޛV( 3N.0yTa>}ۙykuM4F|0 |WkIS#ʊkGjVwi0d_2h0U\uBGvtOxETkWzЧh!4i%-D[r/t=)9O O+{_wGj"_ 3PUI%x^)4F[gy[сO Gz0dhn}득m[X۬uC5WIqGcSPTV, j>/ݯ(#O#TUzEm3zX5f0I3^G\Ejt:{uF?h ^޻&W.Sn lr?Cat?saeAAo5ͻS2$`LGzϹr߶oaQ4dxNJ:|=z>t(ٽ?7D#ÐFzNuRK?Y/q>wǦzrem b8}Kt ч\sn'КP#@'W`|/bM=.K2°S^9 m)ǏǺq&mBMUt9 2_Ƿ^B<|o7²T[%$SR45NAx#=_Y9_˃}ϥ*܀-}8\SAOI {k3{Ւ'aHao#L61ü‹;>S֐}xPZ7vʚa.[RJ<ջ2Î? Sߟb]ޟHRf {JW-]:n}o ~Ez|X$PBW:"HM*ę,@KN' :?jitoLw'I fLl.{ ~{]rKw¦pEboiW„q>yop96&_j5HC3'AF={&| qLOTJ f kf>ѬRbqo璷rܗZYGU|Y]pŪĕ m = PN/e\VzTjA= ̍ccZ~R#CP/teau_ZEpeu }ZkK-.L3#2#jmm"M7veb#q`*1=}}s9n[?гˣ~Wݎ̻vl`qJϽhN$B$hJ̋U ,90*iWv%8goaK͝*?`djJVLAηiX~y{h=co/#,-O݂SoRc`xڝ&8u_n/.ф"I(<5"ǭ}wDtAȆp!]7]s *Qn]L7&)zPm_~l6RhwPv4u)ZDHYHIvs︶=ve.j* .~(Zp=jW,Qh4hPiQ{1v.$}umbX=r^׽u~{ߺWWޥA\ٻR76Vf'U\a&K Gw̳s'0;S%?mXe.[PqH?Ͼ]~6宦T,e3H1Xf=Bkifwԑ kkj$=C3w6{̳s/5\^BDq`$Gy 3GWG$G.{G| eq%(fݼ5FOqBν{osxmЙ*uq[gpfGl}~ج'+JkigP$1 鵈$}Eea2A'C@[2顬X IL`XNV>)% Fn* n { ׽uwZ]}(bcov6#ONjݵmEA¨h ǿ_v6xyd]nF)@#DPz' |oR\ZH浫_U~}lK\,B>Ty?vg_6]2ڙʅ+u.W_ +__~We[lS]3Ӆ ~}qޭǻxXZ|ˣM_0]17lKvL Ϻ0c뤈6髧jH-_o-sKဖ8Z(%53ւKhtuۼA+, &pR6ITf_^zŬMQ\۸1), 2xAGWҿERq`;v,6顋1I3Ҿ41L:e۽χsPqY)G(|=Zzi_ lXjƚ4ؽ KЂ<(_=ӯۆ_5v>CDkgCŭ͵$?qO=5l$\InwPRK_c=彸.mиgamqS }H$nI߻~]xY0m-XUYJDE_##ܽnw3Gۯ%_#;y k>EEG+Ί$ZCb-#,$y+p$jdmR32z׽u~{ߺ^ҳalfoh7C-=^w ?8dwq$O(r8sFh@idT.jƀNYry;0; ir(fzׯTl >Ps z\m2uoQ%DzHzNZ;y[eM1T.$jJ1=q{ǚwc]44+ZQQx*EE=%732C4~2߾uϓ{wNe'}Y:mڲL639_ )WRY6{wn+`Odh~jtknv}vm3ZџGéAEuN Y0ZޯXړ^]k {+Hn#;~ d_#Wcbzl2'钟%kq߂Fau5Wc'VW_H5 >cuE (xpU$u?Sooh[(mKLs3QrC@4.2y/Q9wX.4]XuϾF0 b: 狰zc1sWLy c p=G?|wHԬW3Z&[W bumxƲA |Ԇvk1,m0D>.v_wu?[V'g5~5Ԃ-㹩E YJĽ7׻;_iP=Ӻ~Æ"J{w$ϸAkIIo4PZ"*X9Y:kPTܾJ7_uf36@ûjҲT:TrrCG^\>T2?ntK}&GȦ0hEqz9sU@*<~x#ϭlu~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~[WqCoޛI؝]Y54Z(A6$P/ C{˒'*?h$O~3(?{j}}"pLlssm=/n4 '^CUmT',O GCw22콘w@]dGwoٱ-nv}k=G뮠|J\nJˉ4=ۚPx&6 'ՇNWמ{m*ogUwZKWP yt!tKyבCpۺe :)5ȧI>]nb0T0bx ^? ҩJlv+H8u$0ƑAvemm;dk i Q8PUP:{6|YwGn.ŝ͘~gmz=W0n۳x$)QE׸^&6bJ\AVx 3>Kr&BA[HBU)&uuNCsi(TT5Ԛr?d4I\7Lɿ|ױi*sڅ>wcwEMZl zx7$2[gmWa4i|IgcqwZ&e'Xo?<y(gW go O^ސYt)Udˆ%by.}6]Rrʂ%$}m!?:ԯ7?g-V?*Qp)FW7t7EfM<{2QVn:ᖥ{=6JjkEmBWܻ ^1,A$1*鋽ڍN=7W?'M2qsй趫q/5ZW`n%RUXT uI~iu#YdhXZ<:Tqd15)?emp9"ueaXC~G=R[xn{;XVǪazdnqk7NfgzSKqCh\~zZ+rm%{V} X-C|Q΀h9WUƦCPn\oX$VWwhmUc67s#=4|- rU1 { uضuCkgE$cURO8}Ame"F>lϒYwn9*)JJ 〛lx+@ᡰ"'^۞7G(ܖ 6ꦕa=tnl_%7X-5u\7[S}G]Z͓hynyEl 4y?A[o^mͭʎ&!<:ﺮ [Bh/7 iZW{R"e\qqU3w>*->rf;mտ#5ҵVZR шtǓ9b!itMn;b,#6nɴvcm]cbv >V+j I} l>˻5'ke pDtA_2EI99{;%ܯ41v?..{g@v|C.W}4 )*hfa}Ǿ{o_ۗ73( V:aI fA))$s,D%m|_&eLڊꚪ\ B!U;KU5]}}Tr31<wwr^ݻI,]ffcRYKxI''=v($Aq**< :7NuV&;e[ (f:փ}"V'v i.y}Zd|rZ+_KT_$~,}?3lƣv@VQ%W[=aT#춀Y<0ǰ6>F[EXHME?~}_&1r2DUo+} !_Gnħ0leCtFD{V)E[3㋳?5STdq5k]YϕմN-$skn2;5/f4:KV9B/ms++_M[8iũ 0j@yc=mﶝr|}&_=5a+[~8{ yqR WG%@}ynkޗ#WR&y]XuSr)(iiQ=̣ȆqJ#Ùx[~{y|մ.[ yv=l伒cF-ի3ļ.n`Rm&M5fj:SZc}vFiRE[R]osWQOZJ| ;&(*m;i#.aO50z؇-{h#H)gqmS/osɼ\ڳAEauo{>Qxw?xdbƴڢPhHWO%vLm25)#=GGy9pP !B;Ld,L};c7ʅ^ w(Vj#"(GhbZ2~JjUz{iQWeqӘo(6%=<|NϷXIn5ZACUyfGJ +$@u[on`M7(/F& HD*=~{ߺ^׽uX⋥{y2i}z]&BlC}-{J5_U$Sa_PG\n~79882<*us^Ӭ<]?uNꞗem=QxqV5;w q_Iz**ہZ_:O{G [[8yw8jnTփsWۗ7NrZqi#+(ɤI$g;̾{{^-uʲ*.~޷%?:rV=o55?5y]_*b䵒_k'|}5!lW{ 6ux稚qyu$ NDS'ػZZ|'m;+C'wv= 88RXP$CE'? [m\ >slRiMit+|xtl=o1BbEAuMrܥ%Vdrx؝O4ϲwI5_:qc~Tq7cf/'Y^@*J:(Q ;KhDO$!׺g3dϾsR+(=׹$$Q6P?qJ^%7ג}F)_% g&M~n<OXֹΟt=oq] WIw\J?|MY3_>]t3k,<4Poe~Wk_xDS YK*}Шr>*rP:Tv=i,fYd:>[fw8]IkIX~i =m]r)7/g?wʓsi7xcu!#<}7}"4yRkA8oP ydS?>¾׽u~{ߺ^׽ueoaż~_ⳕ1G-7Yl PK1Z}#P#ȫ; z0d{£j[PAֵSPʂ1W>$1r44:UD}CPuoY|?eEvja$twm̨G7 MX5j8y? _DۣG`3yԏ1%S_.ϻG,̾5҇nY/XPZ?o)֧p$RI5={޺^׽u?S CK'k㒆-@rZV?ojFBk.h6쨴En%}XoֵgrZ9^#,jW^Wa=ڶE5Km$$0x#9;~te(T?f}e[Q)OUv[ =20C 9A{!6[wi.qsu%x2}*-M*Myyߤ=ݺ[&q_ O!|IOP+@:y_8?z:o֫Q Cz<{5(>㇅or5|ߺr96[xGGke# |w+m2-C}_zUW>{{^$3STRT4_M[CS@-u=ZMDШP{Ue,]5"E ^!8:JG_*=T_=[hu̥Ӿw;mbdvf֘+KGOCx_x!ܫ3s}2D4@bB gn=e-ly80^/#R4G[UmݍB" SL%TfUIs_Y$$er,,=''m^~ɻ( ygƷj(:O8sFμ}[q#acO=*+ҳuynp=ÞTcz7U!"J蠒w۹hwy6qI4kD5.ARhI8V׶_o[϶Fe"F < 'iq";}w}&u-Lnb UOHjYT *^y!縛\U2 2j!HbT3(Q#ꔍNGLyFŒ-Sd賿t榏!:'LaqC{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^m?d3R};GR}_hy'׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~;fZzgLfDiK+RhA1?@msW] v|]F5Xv>QڝlS G{R*T֜:ܳ{EkW3ɗaaQAhE9{Q>&ק[6s"/Fg~rFMl;h۫?۪L=C?%34wHz˯d0GFf7fHI'8B0U{3xc ŹGFblm5@ i"G\)UnlQF_VS\M:}!z}&7rA%,skU nn[S$ѹ5c >t=ؿܬad~Ђ *Yi.$/b}r/.TPU+C B8\ww/pu̳"SNhݔ2;>qG,})|_<ǎ랦I[QIk W/r6_veDU%GuE6{udx;P2%9+,z*'b?T s)CJTV%]TrĞs|ǁv;Yȱ_5=qż".;DI#dGDuݩk:=闫PAԆ>G#Yub2HE[rUmT; ˃s"@u]'h9_̜r5?ohLjEf:{16& ~+CIPR"S-4Kh>Vvvu[}k"("EQ䪠<772^]YYٍK;I$?w5hq5sORG^*̢ɤOU掉 ~V9Dۤwe{V5 4NVH3PH+͒ҮǸ]G1m*M_Yc=طzXo[J'SfE.S#KScۭȡo8qLqt3']lWx5 ċm}~] Kh8IYO 0`_}0|~}vfW_sƼTHU{ߗ?':A.MI{@, V#VCǮ}ӹszn*L@"ǔ3&HaI{^?]7';AO).wh䩷%?R?,<{o}9_; DE_Iүqoqwtm&')o')4[p|FqGgۢi/ NjS f#f*x}Nn 3NHKZ}K0d/voc=Y܏ΐ0 VtCuƚ 阡4ük 4mU>sKع.GسX) .l4;aownh5}0YF 3ܡS >D@q7og`n[/oe>r^,f1]rXQya&y[`MZC$*"B(2Bۇ1o6Ԟ%j|V<A'&Cpv>MHˑܕW]lbv 0b[waqVѥ6I$$0Ƒ'mͶ\BkH($h%E >Cp_]wnWeY1gcf$|8͇ZMm+Q4ҬBCUuY0i2Cmp^{~ox{K:22Tt"JAbK>|=mMvW~gkR8vaHbBسܖ?RO$}>,j|k{^׺u{vw_[V)>8+f"zhd' ~=w~jKIu3: S8PrA]j??'Չ{Z |Tz)wS,.K%+<ȿ6w,ۋy^ۮNp\{F խQǡeAUY-׽u~ 9^~>9 S`u7!{Aw2Yx .qXWpWHymyl }$,cDSp)ध(থ*zx"PC(#(pTB1E,T@@ q~IYYIfbI'$ԓ'ݘfJ 9 `1k(쳘7>[oyq4k m#M>}/ٶw,F&ǫF|fre*Ų/y6bI9BLuS;znw}u`\H; řO>oigikH$HewȞڲG7]uOX|u.eI馂fٽrWRM٫YH$,z tSFs ~e[{}nCyw@4mu9Uu# W¼] $ބ歳e~z"hH GMYo:Sfb*iWvB WM>.ou~mv1xU;uI]JA6[mnva6(qq3|K38Dc_y=^oۘ _oA}j73n{f^pY"vԢ%20?|Vo-{fME)xw^^F݄sc&}\O^-]-Pno OZI7 ?홧VS@>U斞od?}]}TgɌղvMwWcv* *c6׼#n;=&]1Go#Cus{{0m<dZo|={ߺ^׽u~{ߺW5c'xʦhj$NZ6i?GeH6o5D#Xuf =b}* Z~ʚ}?yT?3od2098疗hw&G7f>Lu8ɌZ91Pjcqu7S=ۯg63k WPF+p,« u<)&o^8- 2 SҺ!ԋe6;/mñ9Vʢߍ5B~{}[Tvh vʹH8Nϭž ? 8:znId:4i]os'QOZ2Mv#vZM kO],MoG5扭m@fVJ׉ȕ*{u}9w=n3j%J3ZUT|؎!kALDrV-_nhEtOK `z sm]{ܐB]՛io-ٹR->U$І?{ď+`FrEMͽȠ*ڰY#J}?0hXQqZ 履E';m.ܖuwљ޹auxq{H#,k Cz#yF_w0-O຾|ȭ C:a7X)8_cv%]ҩzMCZ[kml| Y4gK)c߫ݿ{5<-SX!8"HgWA9t_nMq^ei&/+R5{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uXC=/~܏#/z'_nPk}A={ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~rJʼldS,f~6uYcFj.fo8 >cUhbF@QUVA#veo~A6ݔA *)76yi[w2[b= KYqUG2S^$=Mۗ 2( _ !Ic4:|9ܛHn]9sQUdÈLcFShF ґ(ʠңb]I%cs?WEIw_W fM؟"RP8J_2Yas1a5?dsݲKt/es8'SHt I^}/*N×Tm v`m\`PRebZ96oMtwP:F $1\):@pOBZ=ӕkp7Ai+VcDxXvJ :!>˷kdvhXy {jD|8C ᇾkЖ^mR黽}j-j Zgⶑxv=җ Σ73-GXO3:N{{^ao䩾o^wY*lo}=XJ$2 ҃~z߼\]Ct*xLf& ED ׋g|͐C;/2 rmc_k+sABӀ.N4ޢRېKf6c2/ck÷G"iH[D;R2^ys/ 'm{55yU#QQzփH$`DY]#4i$F5;'n̨܀'ēEU8q'5~dw̿#EvdSIQb]בHbbmydAYwOղ[x_r?tcYOf3E@eNC]2 ~*w.ȁnG73)# bϢYX]YJ AqIj:?6~{yVPlZMkO<=Ĥ,?⦅va^gC7jbM,!rulclPiI.Z}4*܊|O)ѹja4 C,2I# 5sFJ+9B`n$Aqd [kP^o,}QEUUTI㌐VVM=K(b^HP}}ێLͥeidvi%2JA!A U\s6^ny& Ƥƪⴭ3O^|v̲Q&4{v\f VXc!Kk!n˝/4ZD|ڴ ӻKJAێK,9NҪ.d+ <FT3^,:-n,_qn,F_pK?U)־K-syI{ݷ;t7)kYdl#wb)Vf%'ZYm֐|b{tHE¤qDAUe(׺15I[ɪ~Җ6)R[JŅr6̻? [27*{˻έ*M;x Wy9h Yzn`|t}=].m;iYJDI*fXSWB[+^Io93r e`Tjb9:r77_r5Zsnځ.ȬHRZ74G>Z:J\}%-4t44RQĐSRRD! #*"oc AqTUUUET AyVv.K31$RI9$RNIo}vgxv]T{{E KOvx8FBFnp+h9N]J\n..@"k IVSbй0zmS#eF8`$Laֺ=B:˾gu"*]th??< ˟~XvJ[YWQOp`=b7cE7ZጟH$-kK3'Im@"FT<]<48DmאC;]<*ĂJ jܱtZ6ۑR1q%H5#+Λr!ᄑ& `D#kVh y;V?O2ea+~ctlu/"&C{Jo- ASscG#))^}nZۤaZ\>V T{]Cr;ޯSMV;-cYAQl޲;77s|VEE0OsKSCp5F'\p9fhdZ*HٕYw7W3_߼-ıY@rRӨ+3FDqXgIV{0O(JqTdr V?B |?ubN ~O ZC-OR_skO-~_M>%=kkM4Q&3tUCy`dk'H>jX*ZXe B,kǒ"e}6hEx5D3C2%] ) $O&S{qw+{nYM5Jdz7"ȥEԇ dE,lF1?]2j50_SNHFl3c`lDXǓm|UH~__ohko+mwK K/Tv덾z3ܫIuLȟ^?;g":r%5oM 6{m3]t n66{;,5ԩ:nQ|嘼Mhv%iQI :ɏWV^1Im{鷸JoH3G1錃,3TSTC=-]%DԕuPKYEWO!pE4n IXo|fn" B>`Ϯ++GT2e# Aq[j]Ͼ&+f썽ݻ98ݿC.G+]')F=STJR(`wܷ^˶]\6$.xPpYPYu6͋nxޮ#U啂"cUjh uw5}]{|`BUwʕ|hd|j'#H9$ݓ;+ 3-m%[q]LYUu:5,~,CsMd b M̋FVQ2{ʞ۪o!iv/M \)C"}iZX4+c+XEh}tnBOo@ފ}EEj wN(r8I7)"$a%R(|J٪.>;Yiw7͎pP?l Mme)xw_~weZ-g7܎ѮM6aƏ۾y(z%?[rYߵ'(%X+oMEDuXm`}y~s9x#v1? z{h=`aQ9xd8>tP~aMQ7[NX܉uʩ@FU >l鵆;C!nu?_b*P.kh,5;>[bӗw^n1!?2wڵR/Vʏ-oc΁iss FYD5=1Ih6M='- l}߽yyCj}cg3ƋO]m/iNHAzG'톦=Z;.s}m=hȀg 6}Rw>` W6rXěų-0mBzΨt3d!KC\0JWEr~3'w^ZlL$kta_r0,0iy8{Ytݕ3T IR*,h2OVSwot1װ3=#JſF%k(̤-jU]:[گ7=s7IZNWr@*сT|^BO/&rm6oWP4rQQ6V_??JMh5w]MW^ΛOxm 1!qKܴpE< UҤETD͖%%ܠ)RBM̚EcM_ʵ _|-yg{goEqW,Q٩8l`as\ Ke-IWS),2# &>Ѻ\HK#t`hC+9f=gʳ΋$r!ԒF2:5e 쿥=YԻCU҈Z[F%M6ǂ[Ɩ"?%9hv_yhj {t^*'%2*Ic7avlfnߖb'Jwu~ֻ[x~zͱU,BT%WṞRT4{9WhX-5_=)k5H,RM ),sH1+b@U$< 'mǷۗom].keu>z&srTs0?g,bjU8UO/usu-Mewe64>I3ۂ_Cm9/۫qs:wӆ6nXf$`Ϗ!OА;m9y;6n-e|CqxҼ V rCK{vE"ܣ31QcT>N`﫰ypmtUe6J2TY-En"j4ȦIE(Oo>r&qۣ1\@ZgGEuI;@B>^۹N~Ei +9 7%B2H 5$EEuIEԌ\YNFA<}Eё뢤hzk]ߍ=grwE.soV (jڹ#1Sܩg%ǵ#ĄDR\ z&bOh}KTҡ#QVF1mkcG]=~ҷ7eJh+fMR"1I ",3*;Yv#nKZxt |TRK4AQrx/}ZjԶ55wS\PfjI?y ' 84O~.z걻R~Β}uF7d@ȐP~vMPefK-Z[}Ce!YCQ-Ϲt@keQ1Q]XuCu~;,t>Ij; j MXfGJP-.GK>poveqAuǂ5ao[->TtO\Idhx@eGgAn?z:+Rhh;eM6EiL[g2AK+*-$%LJt^Gg9fߜGs;q^6E) 3F:=9On9Og]oaq *T?2Q7zmG_kCFDQdjle*Ӛie"JK1>^Z;y[fM1T.Hy3<ǿ<ӿ^soey9]ҵ(@Q}w;y VEg*(AAED5Rb2M" 出sw4<7׾>[WȫiHI\q#SW],kgMw7H3@X嘊j߅ZXgn]{}gsU d U!Um%%E= 8'JM$s9s;j B.8ԜqFz4E$Ӯr,v\[#S@ ZIX kBS;^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~m?z?*_t/G~^O>ף$zu{{^׺u{{^׺u{{^׺u{{^׺u!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[k,7̃=יM;C?QI7gصWXӹ/[46lĶVWh~ϳQ?ܞnLw++H7?/^ ׺s'[7E !jjY,u]U Y*lClRlg9& 5l7$vHnj+=u ȃM4oen+l}Q2Z~o cy-n{2YRyϳ^n=y4h𤑸d5kKo.EcHFThۏɺޏ 8\F/c3 :~'Hr=Q o_n|j43(u?z}CL;Fё=:{Yn6WlM۾v۹]˚] 0Qd#(yt 23s<{走I"ƥ$jw ,kZQ:8qmӗs{*C#J*(KwqvFM;q,Xjy > }t0\os8n7 Yy@OdhN|8Lq<:+ePbSJ#/#SK!iNzA{t}׽u~ZWCl|sJV:raV5mGLkm>KMxkX\ Ǭ`쟼Mvy G2 >#C[A{'\׺y308jK{YmeDҙwz%>%*J4u5T[{=M7ޫ8@#R7-* u)8zOO!\Ȃ5Yl]PtimMG*p TUETE UTX*|I$,'IzltGe3l.ϗ)No%=}*$ko{ؖ< sO2~r_Tu ġ9-oc:!睻QEM8m#+HG{ή{^\i|X>+^cHce7MClmKz_~t{lk85ԩjj8ne4&TaTC۟poғDm^+k:ϔ|W|}{ߺ^ $ VSڦTb];yeG^AYX"Ҵ7 *R AROӔU[ ~`d]v1OSwF#A1X^ AGLӚCjt=lbVmºI:ƪ)vǮ{cQ{{Ȼ*4aw2kφ<z6wϘ]gMރcW]Fٰ݅ TdV?b1kjEM+Z _%3P|M`}ԯm]n >e#uhHq_}{ߺEO5|xM4I*iu<[rE%6_B>R6h)e[܏p߿~EG;4#u{0iVXF@nUdd4֐ԣ YrMi !+ Sí8 K#<UQ4OSUP-EULj%n^Iݏ%'-q1,I$I'Ԛ^BFU@@P<\X(Z\WY2ҫ`O {TiZT~}ii4D*O:3BFꝣK =o= I/SibxgҡQUGsɛ'lVQ*3C4YrɩϒJEUZ~noyvb"}$ 5$,t/W6'Hg ڻ];"} c2tHldKX "08mwʋ ۞̬ ŭ*_[[er'ZC¢U" }tétG]^bytaɻَ̣eqn}H:f; io@+}s1\N:CEKۥiߥHVZen4 *(TT~@uqq-ėS՘OOS*,*f'oc@:hMIꮌXVRYX\2}SPzVτ@Ϝ쎯TX[z%\$O_ۓS5iEWW?{ ?W }[Dovn"gbhi&Q1 :()(rg e˻yU'y̮#x=lwE\UTYVOyįai10ԕ?j=Ėr?chgZÒBSұC?)+GREɠ{8Z֖[_txK>6|_QuU}^*˛ʬgTky!YuS%">On %pX+襦u^y@9Iq}.y\ٸz˕WjFbzkqG?'֙<LHNswn)gK!Zʒ!dfHcwϵǹ;©md[? (ϧXܾݻlSCu~U kj:WZ:U?778 f}1C 5 0a=߫ym٨6ocaCq)?GYQB~TYN4 }dr>ֲ~JzuKoK~0+۳wmmGٷzdLH}Ka^O+N:pOHEFw9iQ4[DH,qƊiDE^XUQB uff,ƤzR᱙sqT*8>:Zv{}I6r\G 4}ֶ\iʊ=YP?iDF{!նO%{]VnLCn{^n;٬HՉ:X-c$/X J:쿧zgImsq2muM;2}lɵkzṇ-?kOˮ`}?z{Pj,m`+g'X֯t Z lL{#&DٜWrT?3ASJ*߻wPX#boq_>:#l/jn7?0GꭽOY=Ճ,wGʬnJl *Ebyi2|>R )j<[-JCsu$+|(ʝWB"Rl߸zw]փtÉ~\1ep[L1n Jj"<bKlgh獩P7R HNV=;FEŻ&[ȞW)"%O F <7SmnU y_g >Cjn4TmlRdQ4MD`4l]>LƉ֒Ǫo:&BARU|H9xr!5W_ N w6{ qm{vm&dcd0{AE{1(U6t#vm;턛^k 嬢 8hVF"KvqnpڧxRHO~:(O/[%}O@mzir-Μ^#ML qkq ܛ]9{Sp 1én="Gr6i^aWAnIUf~E$MZ 9>?j}i*ls( L(G&G.G>x\ͻ^GyXEQ+*]jMWQ,&Zx3GFzI)\G.HDz N*V!TT*$O@f4&h |$u۝SӝcqzMj:G1d&~=1}o[[6wOZC,$g?z]ɺnvl_ıĿl3։U5x5.TLL䨮sW<,I8I-ԒLŜ$'~@,`(F? :7^?ʼ;!?^?!{WjnɥHyq *I D#^}нaѼY-B| ؜,c[1PxԀ)o챙7M\"Zx<  Ҳ(Iexj#y~}[~_zW홐lFؼYi0tOjyjsq/sK -qno#5gFDRy,n]}}{T۶m͞1E$PJQ䱲/ˠ Ҳ/9ؙhqCRڽwܗ+ |9nt=+pH oC߽P`و]龫l}Svbj6*'4!U9eOW4XUܥܟȖm  i +K!0w`1Zc394}0+ *#O54sNb5v_͒D5G`ʖNv %R JSi^^j2\wH~ҵj) U^(Yjcٝm3-}U>AQGuV%>$Вj]6޻?wv^pnՖ,i_]##["5q* oNwr4@dP8*Y6Ϳe۠6V(^(5$$1,ı'?d.׺4~he|jU,CQƄzN繾8td;T7&F`Ӓ^MAo݋OKHW 9.*Od>,Cт&t׺#۟vyL7O#.Jxb*Zjc$/@`9pqm/lZ.w 'ڄ\:*-=~=ǹ}kuLЊppGTmf^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[%ɢb[e4 [o|⣮3C0mɚ;)aHLS*~_}y[~[R!ms ku]F6M5 -^@>3'1ZgʩjyZJ}:6j?vJr~O7EOݽ= ؝EV75O޹NiUɒ(J)OjۍӚb{b)l\fEt?ß9o婡;ydpYt[5uS PCd}i,USOW_U=u}mEEm}uSU5MmmLrM+17,U׷2]ܱy$bK1$ԖcRI6K)Ô6VBUQTl)MTR8uy"qje_yn߽ۻHmHѻڦMAhGJo:_}y^fo}R!J4eR<ѽm0;GC9S%۸< n/lC1MW.뒛~vL굝#xjm R~%zha$hϿWPA{]ήץnJ0`!šjUHyUaUx vh}ѽ;q7hJPa֕E8D38☠?|=:u{{^|QcMt6QQb{?lisW6wk,9 _ܳW2T#%bh \E;WkM'̫峙ZTa_ >fHsv$9ZAPG|NCuO lI9=1{&w^׽u~m_C>u;':հk#Ea3Ҹʪkl;kH; ͪۘ=uS+K `%.k国 h *EdVLs$XmAϵ|vJr qy?VOAzjgi%USѱMQ; Lgx6k_K/(m|ou9Kک9wgFߋ[QXnude4%'r{wq^@eQqޤ&2|p@?Zp@4}{ߺRn,cY=nl}IWǖeİَsnh ѿՁVLA[K܊pUJ7c{o۸ C-bsK&V8PGoǿ-iYeEu}uǗmpm 56(^`A_=~?*ʟHv?'fȈk躳nd#!M=Le=sZ$^:i^9)||bVF(Y.gjQZc]QNO]%|ܫe/wd x^cJjC EWd]'SU& ?UE}{蠵}ʻ&Egk4kWr Ԝ ͯi7͞KM(v?%PI}j>kRo &뗫3UؼT4SQN7Y ZgѤ̳TM*( i-r16fW!NF9FTE@ W‹wf.=fy/U]AjGp1RP,[|G_D'^JJ ]^ZwMyyj C=cdAƍ_Q;k%l.OLH[{\od'uuF}S9uUAj((DP${^`ۯd_@>gayf@_ZҴKR~CE̱u6G|VPQav'l459 Zj !9UQbGHQ>۶M@=vR(#tP[ADDV(QD/~~<\s1K-5$.'T55Z"IvQ=p{oSA۹Z&;_].G$9K}(wuU&D6x)X훖x~o%fȧH0O̺C) xiz %/,M! fbm,PFL,@ $I8%,@ Ndxo|hzV!znXS6FB};YhE7 Z1W_%:ﻐX\5t+Ɛ0 :Dwgzy2ܩm&ŽښNJojW#[o15ٸ6'lbeC6K$U^O{9{n5nD1FI-#j<+q +ѧp)gj"J(XE)3i׽u}cϐ{']l؛Zk))h1UY[K6Z0J[O~{~[ܱ@T ;Ҥ=`*r6dwaGր~}^mAϵ|;GC9S v?''u;O?Emۑ x,u`ł^JxE9rm<%2]#]h&4pngl $Qp#^F{qO7%nl HkY; Xj'}wloYa}˾sf+iZJ3'衧.K3{;9dLckS"Qff 7)ɜeʻ0"1MNĖW5#WKXr vgeV1]QU51HҖCp* 9W߾jܾ ]ڞ9nd<#@ґ*R^?n6ծBRmOسK"T1Oώ]\l8b iѾ!mr|˸Jt0הR)P){%ݞ_^E3ri֛P}BX{I%c_ɩztʬVV)*A{Q:$g=ܽu_wf7Uc">:accQ..x* fEjhy L$b (nm@1HR4i⟼v}fJhwIIy~k9gA'~,hbF6]Q]7X7cmJ"TSb2Q5Kiә۵, ܏۬r==_p&_PQ2Ł,hxc=`74/8rMV=VCӕk.{׺:ǩq &($Vuh eLTǀ 79&Z}w56|D&yR2R7Ƭǀ_^e滱cVKQU'M|ܨ!gq/0s.s) OA?ڻ>GY_(hɥ4*OTOwӴ.r }+pڄkGZ5zm׳Ktm4yֱľL"lDun}3zn {rJFH ӿ  jDcTsC9z}ndbK#fcAkUUU@Ug6׵mѳ[(* 8rjijĞ}t{^׺u4N]VwlRLݭGNv[e]ʒA'vn*I ;*vԊhgv#+<aq3k?j 4^?ҟ?oz }?T??.+n(7 ;Ͽ'F6L[8IhyJGf"L孬up c#z_-ɛ7\E*DYcYTbudB).ݪOBI=󝹮Ǖx@##i1,Z GgF#2w}wFVd6᮶)jEq _Qs딟y}AGI~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺX)m$ZewOuev_Ӭ_gI*Ԥ{7z/4G HޚYQQ=fT׺u5ޮHHʴ)?gKG#!4D["akX׮~ֺu{{^ x { oh?Z=G#zʴ-?GKG (P@U`{lMOMNO]^׺"gPݕ TfSU4ʴ)?gKG)i$+C,jp@,(HzђFbOY:u{{^׺JuI nK+YQXϫHʴ)?gKG8!(BKZGVw׬zu{撕&I&4$ۢiczpK c_gI*Ԥ{7z/ԅUE GT{lƬjzlMO]^׺MQSCWOi]&GUQAsjZ6Ic?=nlhCUe$G~|zt{^ÿ;_֘|[kdvjSHIr ?r͘~mv#o,B>t~nMk?"zjD7a~wAYU;k Q}&o>hޤ;loԒe~~%"A8|Cu9vӹ{ͳ*4mu? ԗ :J]w_>O`oM߱220ik^jrypsd#;6sG,nysq $/AkSJtYl.߬+SC3~[O= P7Tϥ#ydqx+ہMſދε{N]@y/Jto^N{~ĦM74Huj<~NJub~-s5Nf7\8SZ>+P.{7*.ibO11Y1|@(TUUQeUU@DƬjOGĒjz޺^׽uH!,QG+"a gVWuM:tJOxxe(EF"FwVvo׬zu+WP~5SC*j1h?R=gKGii$,jXFiXQ,(Xou~G4K5<$I&5$$ۢi@czpK  z?ZO~3O^#zP,$$׽t۟ktmt&ooWt9<+! Kmk^ag?HɫEE1C!̩a)G)ZgȭLt4[U4uO䪮Zک&JʂHN+v$ĒIM|ϙb"EEª(n{{^늺>m,oϽe+#^tI# 2:VЫp}YSB=:%MTܻm;otĚ6`,m:8- QڈqG 4#EE*{#gg:}Nz1ff5cS7Iwd|Ѳ)fMgru#oGM &,ML}Q{yq&zC ElHid)$ξaQ+ܑUH-^NYpāV=8 l%什`T;ZOuNQUFu-QZG,ZkDx%Zdyowۥ@3/l #\N 3y}7̿[1?;O )(`25iQ]r}Wu~{ߺ^Jig#AQSRz\>z 3WѲMVv3-ŜԬ<8,q [΢H +B t>a>X|۔aEw5-$H#grA+g%r~﷼{Rxv|͹iZGHUG@ {W;[^ى"(>Ϯy)=6[gsM*傗~0Mh\ԏkߏy74rEKۄR)J20>aYQ텃-y{oVbW˕Wf23y\~lA䙿'>+ryՙس1brO;m`ļ5TA*`:u{{^׺u RIo kmwWt gVWdM:tJOxxsJjx2A02ƠzieaFbG֌0z׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u}п{{)>w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽urgl=otwF1oP;𿾃w4q9~,_*}iAPH:!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tr|?- c]Qi*{3yүhx6ڞEdlz !jdVo3WMޞhUUfח gMj P*B)Rþ{Q˿R4ϺvH`" HԁU-Nh }׻nl윭 nd.21WzQzJ^wgN{PqynӕgvVYO v?)%M|M&a3MrI\nƊJV'(W]p{r|zI_Pfp/+6 wQ2-"NXck>s;۹n+uA7 S.䪍EU4UD7?)_uZ*鸏$ IQ@ں8 Ur)Ă0G\$F%$T<v#ݒ9W3('kw|c+)0y=/<f{Grcf^Gu9sN)"_gzc|[Ͼ_xĆe*nr+OԊK$uZ~ZK %B?u`a! zgKu Nc)SH5\u-sJ( 3#@Q@:]VVRc*hhi笭*jJ:Jh5UU3H*$ k]:jY݈UUQVfc@I *q0q*w!UT*RI& ֜4C7ɯð'Ml@S VFUKU*RǾ>{160RGE++aVBh{5ې-6 +qvEġu%EA5atU==J}{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^gBw\޿-z?>O'{^׺u{{^׺u{{^׺u{{^׺u{{^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uR旬;z;Y%gmH;m?,sܟ_Ϯ}w1/30?=Sq9Jb~ή@.v[gvDnCc a12 Z󩿧dxN$jL$ds $OEG6;{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{>aw6ڛsrn~7VUk nr" 62AQ*m[v̖[Fzu-̊ΐ0 #*eZPiB*Y^=5;luRV5f,qZҬSWFu7[tWmNz*h6f7 UF2;!Unb1/UR5yWFϗ95XĊ *9u<የ JƩ/9ߚ~-y#d  HcHCBXb-CAe(hX5t hk(&*Zdu6R={Khdu=XGȎ{Y9YIVSAr|0*ڻ)ϧdr$o<$v' '}7~7{/7,mNX$'$VC[ na 8و!ş *KӸ)GӸ7 Of?˻t3!- iTFFF&^ ݽ}o…m|8Cr7@^{}w΋_yqYhaEW^m|$iݔf"E:=MZnYȒ'쿻]Aͬ.>(~-dϏ;TZ=]L` mn?Yc8~=c׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{GK߿=#w;޹I۽Z~}PO^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u1>/a6a^[5wFh2Ͷ'x %$ɥx p:OGڞAvl{Kۋ扼Mhڄ EZ8 eq_;6lWVpA}'W,7I]y֟{?"־?.f۱}ӊ;7nu~wTg)GFձG)*/u|^~p=ӆ. q$z4M@dʓOO.{${u%1Z4R/ HH{{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺w ^ϼ ׺u{{^׺u{{^׺u{{^׺u{{^׺!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{!^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~_%gWܛ4Է׺1v~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ[i,!ʗp{G ߗ?wr/Oz?@>{{^׺u{{^׺u{{^׺u{{^׺u{j6Oִ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)zҗn)UO'&>W6Oq}݁d=x~` qV?V=Tws?UL?oт]~xӧMuwV_l?%dOm?_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/^3>?b_oA!}z?헯`|/ m{ {fv׿> Ϗؗ{_wgs޽z;eK=/3o^_=ٝl?%d?/oz6~ L׿_gal{}w{?mKG3^ g|ľ߿B=g%/F뫺buZ`['m '}F%Ury*꧛m:UQ7(!*rZ^$eygF$iZ (D817:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~        " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?nn*umkGwOa='TٟE.v][]c#1 6K9ٮX[Viww;SD}|릯Tal|׏D:}2K?r~fe~F&CGȎ?WJY'v~wg詨r0l$z|Ϫ[k - k+s}&[a}bJl.7z0ouA/ۮ )'W{\ou/nH$8_}KNqq ]_X u/q:ޫ/_[wKa}bJl.7z0ouA/ۮ )'W{\ou/nH$8_}KNqq ]_X Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$$6Photoshop 3.08BIM8BIM%\/{gdպ8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIM8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@`K# 8BIM8BIMkX72-Inch_Poster_Header_RightXnullboundsObjcRct1Top longLeftlongBtomlongXRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongXRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM !JFIFHH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?nn*umkGwOa='TٟE.v][]c#1 6K9ٮX[Viww;SD}|릯Tal|׏D:}2K?r~fe~F&CGȎ?WJY'v~wg詨r0l$z|Ϫ[k - k+s}&[a}bJl.7z0ouA/ۮ )'W{\ou/nH$8_}KNqq ]_X u/q:ޫ/_[wKa}bJl.7z0ouA/ۮ )'W{\ou/nH$8_}KNqq ]_X Tʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$ꤗʩ$8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong;=FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong;=LCntlong8BIMRoll8BIMmfri8BIMhttp://ns.adobe.com/xap/1.0/ Adobed@X     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^k}WYC۰++1qtUx |FIR+iapH<=uIލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuݟo wU{^ލ=зqWuGev^ˤnEK((l\xi(Ijffm*.ē'ڨ(+mǢsr{U[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzusr{^[?w/맿Pzuߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^'c%}MZ1Z-Z=tEGqP0rͤ*hn5[*ȪN'e.SƲYlQǛs{q.cE6h᪂IFDbA\{^gu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽t0Ǿ)i'U9Jxu=뺾˦:NEO|61$ʮ Y;nEpjƴwR Es~4$׵#`Χ)-p]c>;LGUS6wRҫ qL*JM\pFSDE#|[.+1jcM3' n=گܐ:vEWY4a1u?};OY421!%>̟gM❡۠Q}WkxtIZGQi{3&-运 7EL_?\GI$) 1i#Y |S9;*++r0z|6Sk֓:Vc!x!2[,̈́ըl"wf̏~?mߏ4jڽםM3[rI`5r]5-2,R4n3*rPv59=hI/b~6v/#L^]we:#TX^䋧˦Lh!_-vW:䃙dt}j׈V9{;ȞyUo>G[CqoJZl>5هu}ltTWdgDHi䦤dPo:+yu[{SO*\X/$Gfu`]7<؁FT-6v ?)ׁM*>ŭ[{pt/glF&vNodnںAWK[qO2Tt֢H@l^"˼.Ka|;QU7 _wl7.y%Wo?$ijtѺESc,c,utz۸;KN97[w^I-;GMOσٕX]xibXn4bYӭ{C~ZǷ3W&\syKA*< !"MJn0=: /_JuH`6Wi޽}me7CVnÿ6j hw-OG0JS<6.Wֱѧ 6+bh)*2O#(mqTl,TY!)Ⱥch*Uӥ?lH;3Cؽz״jom꜒ o?G(hij+,Q/ϯNo~>v]|Vh9Gw^i7~KwNl߬aVTIg U$FV! $֕XtT7L<zfmKec:ΛclN֘ɐǷUSMMja7EZkp9]ǺzcM ۗᬤol.*EYTE[~if癤xZ'J^X͇v^{z wG$M8Jݽ8]玂@TKV!dYS%5ڽ:,{oovϖ.7}7an6ŢW`b%ܙ}S[,xgL,48~IdEhcT!t̟ƷVxWmn=Ϻ䷧^˜fC&7#Usb)zi?S[QMW%M{ٸ^^}g19.=ힶ l䷆r0{wK-cL2[3s:2bkd uud99흝mU]i3s).+F-[,IS8T#ߊdR:;8Ex=$tʝ GxJmh FLj b$ޞ2oWS^]r۷d|mIK6k3%_oqс$\>D[$qT*&bk+^<:/ëzss~ݛ}K}No|ݏ ck=wގٴqԫE7)=[buYǐzXvj/8rg(;g>@EԸڜ,Y?zmndh_Fm_R-NV4QM2:oGU/~;lGrRo9ʌ&q1ċy5 /gQ E :; ?>sb||]n]npf-2{D C%NŏR4B켄him4aj+іw6^g5kbYof$p qc?{k_nKԝ*jRnMT{ZJ-ZTSέO%"*yv<[6x4RI[+>#Y+8 4a?t trƔEi,`>^|d/#w6!O8,+]fF %4TKHP\('M.:ZT/OȞlbm[d11cf{c;^9%;NU9YVX[V+ֈWy~.M[ul˿6YC,>|RfG]шіu`ka{9).\QME5c\c,FJT7]^ޮ+:% @LNjy:vu~ϣY]Tc3(H_6F+׈WSG ZY)'ž,A|0@g30T {ZOVӖG׸ j [T 8΢3tL"4]ZokGxӯh>zO1z>۝7m㪺lݓq8g=b <=U\V1D+`Σj=TtKۭt=j-c}-+k+姞imM:S啧gHdfH)F(`W_'譓E5Xmљ#\N#v EE.{M X-5!մ^ܿ͟6o{ Hsٻ?4ۙ骨88M_QBicU#Frrbi{×7KO|ت}뺩6zj9vZ2D*P74C&l r4,T7fo#SMeC.?KVWl7/jNۣt{"o`@ŚvEΪH/bRM)׊PWojJJOTSA;Gr|m4BFBmTGu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^^+/b63qen14Yn jc0\]$wi**eP}Y.}uz=gUn+1 ɍ"͛qIIz{^WT4%;WfC>FhwMuc=T>;M쟏]k6c6Dyytűv)Ր<#k^R:CO!oΡp_ذMUoݽ[1ي͇ M./k$fiy7:[>o: Eʍ֟t}6V{gg\N˭L'uIixydž=Tgx㧢J$G=xg'YGز`]N\g#qύr!ۖfl&*+JFUG5 x&u>O^'uRIGB٥IrK<7j{KܻW{mL 6C0H1 *)׫_^G>}vn5T=ikSN#qȬ$ *ԣ:A,i$n" _2vSlF㹷x$3J7Z飂RTX("+=J G^w|ci(7N3c`h]YEURb- ;MccVB:kԮ?$;jFMǹwHb{/2]K]R<.㦣ZZ~!l|uTxi|>qæݝ/K$7۽u&B9꭭.ٝ[֘lßu΃Vt &E{ʧF~FvOWY~6=꺞緖'i[b;S1\;+oP54F%2wULǭP_=Ol10Rp8jIi-L)UREL :|f=[>(煃*, 5)q#۽S׺u{{^jNg?vj?lMutVm>xMWêu?b;xUn޳ 87 >ꖦQO chz׺87ձ: NϳZoغ}7Xc)t涆LKOm΂ SUBۧ:z tM6au>9-ە{jTmL[bce!kc *Z9JcYgoDDqFh8uA%G;>@b][Ab/ OR#'g-#y S۪:9 ׽u!j{^<:ۯOO>JbGȽeEAD;i߇Ty{|LVeّ+TQEa>JZŌLï4SA„Mtf(+Gx],d}g Yi_O^'uf?We$o_;WP%Z[ôw*I$ƞ)'WDA JqUW1ln_뽹/Uz~嗣hnm»7nofl26ܵut3p16Bi!qX0DS}3}M>cݭZ*6=Ϻ ZDj*g%D#;JX|!?WY|-w[yٛyn.t{*2%T4uBqAH5{o]GWvmۺ) ez&ޕ8f׏ R |6ripMaaG}Y|2t3SJpdHf&8 R I,u~V8sۛ;d=>C}jX(}czK/ 1%,g*Du@4ߧ%G;Zr<Q䨧(*j\eR\}CQdqO|R}|6(7sɵrnbbZdDjWJ,qp)t(W:ޫ:{n71vA[AUOU[d6nR˗0U办itUcHAzíU+13MIM,).Ca4C>9Q"aW-􀇎?ӧu\Tĵ=41&( uN!/3Ii10X:ړwNX۔)GtFCmX֪[q{@d##fFvUm!vfu }:ѵ nv9xnH)R5jLin׈ m,v%BbZZ +!e|?M=n>v7Ͻ;[wo^*ە`G]Gsiq2(v2] ߏiR|r|mF; {w_NE_d04 ωܫHU`6"oѓ6ctKv*3o[+ w5v[15auch( b噔l }v|sy͵:42o2ɳi. V6::CtT"B%GWRzZ޸t2Ꝺ6٥l FPON,?ǷkT˭g{~F #uyXĪyᩱv0]8c\ n ^ɯoĮݽcg쪍Sss&T[C\ҰJ^c%bZ0u0 ^YT^^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^-m:V Hr vѮzx۱;9L0YfbՐbi)/Q>/R#}Xcӵg3 kbgo=Ô#]Ѵ(avu%;;k1ژŠ4TQ jNz<='{kǎ_ֿ'~ߘnONOQ {f q+d%bi'z(VM:o¥٘YyvM. r ۀT0s"yL_ jPzTm'/뎶S@KӦ VX3|?n=ŋ!z*f։Uk{^׺-dFfT(ciF 0C.B ,@uEZc6/MntP'osצ\omlM~_nfJWɽN4P)qUiFC+Zu.]O];^[+qe:gb\l|O!`T<j$׼>dR}ٴr[dVNwig)K6|' ZĨQki䢞5E ʧzSXn׽u~Zwol4K~v|29Yd1rԙq۳kipֺʰ)-۩V<:++m+/}]˺].5n .<5-떒 qRIj qəj]K^Jn>Wvmꏔ{[~~/xSNӈ@U>h!mIX0턎/XxrCI=CA>x>~Ja=|vt|g{gm(Va evlVEhj(]24C4^j:{h6O_1&'޹A ݷ2Zve5ReSVѢ*0C'M<_w]{ߺ^׽u'/w ^I[K~=ֻƵxLܪUH13*Mb qTw^dj=þxlכ56F۹S۹: φ\}jJ~!QNn*0k^A[|՟?' ):Qc}ɻy ɁVR:( ;:.5V:kk6^=_[尙M67#ԜH!>qUQ`R}L\SϷT@+æ;=]ô{3|ͻ6l[GnZE =e>6,PlEGZ>Q&;/rwo6[DQsO6 |XgyeHS4e9Y*tW+W~mڟ;sr61tfN${:Fu͒0U:SH~s22ҟuæ8\^gK·F:n{X+dr 6 7C=/7q:g {tootjs.Sɳ+ccrsdQkU>-(!pMZz->ֺ5_޽nqzs;J-{[[pd{ >w'6^ZxZCƹ~}=8£WOT.:wOKn wK'txXUM6ۻkn+L,5UrA}-fRnMEWE;1\X̶瞢h1 Q 4[zѯ[Q/mz ;fd6O|޻S)%JӪ=\~;Cs]۾^ Ǻrwvň8 g+g!-xPF}k[|쟁3u/dulhzy7 h1f;9j$i,bpز=>e)?jSW{!MK% /Vomݹe4 rZ5цey+k̯JZ|_5rZb|Ǝ))tcژh*2~,˪*~ gTaCzۯ`~ޛqv=Ykx,f))2XQMr>\|=!d{΢]%FrxVM,kisQ 5ENұ~ļWLnDԽiO7Mӷ(;1#2ubz쬝{ً2!y9289k&itGWHK-o%}BZaC^&)?CWgۂ?~εu^_M(u% /}H7V{S1>T|JGۮ26όʼ걝N_7lMTSeuFT~tFb:s80oÿ᪎煵ɶOs=j و(:=j.hݽoxg({;rTo8)qyXplz(dRm:Y՘K32yl@ϴ\S{? 0e=YH*F@AooV?UBw&ݛ}Um]wn&tM-&#M1O9.L1f%w?L_gZpolz\pav6O UFCGQKSS/qq|yub_Bu >]чÎrT;a<) W0HTF9&g-$za^y-k?V_|QGg|>ŦS8xڧ+fn?˫?ִ{ߺ[S;fn^nV# U7M݁tòL[R-})8>ؔ-|X?/~;{ڝ#9qjIRŵ!D5u#S9EkH#7Ľ?;faQ&on~di+7ueEB\}]] M#AR|̍^=kY;9m4r{#(Ӎ5VJ,R`jxdܓϷD˪`ۨ{_/֛tWGmǚmULjY̎RŚDֽm֛y-rgv7z92O|v{k$x`L`*L":ٔU Z׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺOKh^K] -6x{ueba┏byo ^pw&kgMMMUOfn$o\;5ZSO]SWX,rI53՚=:Z=՟ {7c*e&{0퍕o+G;?juf5&'͋h袦Vz_^MW-;2&Z[mn_)7Xn]ߴ7DyVUp O.<4VPh{Zz3̟vWW45?F|rwnCnu5M9&<]{fB"67F)@ gχ[&T':^Ԫu+A_)V*%+%RPcJO<#$fb@~ r?{o/GV(іejDi-` =?_7ݙŶzyuR N}5]&A5s흵2`ۑUrg-V=%57Uiƽlz5a~n}n/]N l{ubj;;nn/ ܵmL9 ʸtG]{>蝯OջovtnntvH[Scj>mn۔JX,bm}Mt)`+b$w8%Uvdٽ6vm]Jb'ӺZ3 :Jݽɺ"ڹ'mVMKQUNïbW\}2$0n,0G[ $_sxhDҝ)9Q֨z ƥ7e<U:2C)YH /~t@`Ue`C)ǿu0ϋ۟jV;9./Y[Bk"i)ɧ!l,h@JV 0u}XdP!po=_}azgb|i]vVPu4!0IAS'?E3GJ*:id?qЩN]c'm^ggf-ݔ޿]ٽzk6⦩g<a@ଢqQ5#Wˤs2_[?)jez֗vlDH"'TQM`?W2)/A( $~DV1J%E4gu7WS ޫO~{ߺ^Нӽڟ{ 1r ~ <5i`9 {Ii2fz:6dE ,qȞ C׳տc?A?5h՚ec䫑SHnb}NSPWյg͏47#9޻Ž^]+vbaLVI15~FFLQLlZ$No.׏ Qڹ\5~w1;zJueuz8LR k{(aCׁI>N&n͋nþۣ;auWV( 2}RjahE;|s`}q)*q]kڸ:ɀے5xznS<:֤ȔJ_Lz$pwjo =[WWwNٛ9(LX67Z|l0DI?nwsn[r}єgw.Wϔgyiګ%dI5D3; u^i1]wjA}`E]a0]އԑQõMfr-QL򸡃(S# ounZ,I~>׺8O(bpHYtƁ=̫*{o^v_`t:“#J^# L2[/-6$S >"A׵YfzڪYWyfWgwbK}ߪfo7'f]F97fym]2_24(^BE4ǡN ՍOV F:{οM?xK7󆧮)7dgrudM̜LE#U/# OܸbYT/I=,|_;^ߧ;?=d];j'U,6^ qP9^cd ϊ)mGTҝP/eP[(u}4vl mWg~w >ߛ13YC#UST)d#wץ[iaCK?/``;#*6񭭴cxf`v?VleLxm|yj=iDCߕBMzn=w`mwf{wz| n 7hM c&΅pzG#ᅴwfu q[6kcqPK>'-lS3FCAyiXP/Mzρc#6j.=+[VĚiC s5yı.M[:'tV>SJtC▞h*+(璖UxeTQ#@>ֺk*~Cv[rbzK{ll 6| CQY\梩*L \5$See*m>ֺ?ʾJv|WÝGim;|VooKSڭ.z/=9gR}@A 6iNu&||>|6ݛRz~3znʽ噒-e 8=*Uuիҝ+~.4OƣgI뤓{m b[b|8ں< N*#j▕,,yV5=xA=1vxTv6nigjT*(eIjv!(ln|^:+MK*76W;:!xjd̴z,>RD^w{1Nս7Y~; $7y P[smK:-7wd/^z={Ez&ygPTyzzjZH84QtF'Q/te_0_7 ݴ}iKC9ۭvkoԵnsR岹!,K5E$nҠ^lzAL =GUv[ktኮm-or5 >#T *RQQ (n=x:K)?-r;f O2[onmZf" ֡qGALs)I*[BMMz }gzzvtuڝ/M5n%79æRX$S&&.7"tf>_o5]wYyO7XA ?ۢDo1XrY|~ ^⪡xuI5n׽t[y[=ԭ#7fدUf =DwWhᩦfh䍙O\n~8S"nݸ u\&QYZuڏDa2vnlV#%UumkiZ:TƞDI)f)ey=QW#Oy]6f:vƾoig #j)F)d[ݎE:FϾ^AԝqLcWk6;g3QSeW(lKֺ̪u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺVVܧٟ) zCzw&^g7vS [46 UKaQF$7' #ϫ/|1=w 5~S_":vu~n|ߩC{(YDd`)ht֟:ו}z.]}?|2v.)~Nu}m,>-v-[쌔;;OE^U9Z*fDJ"xxw+.1kTR~DtVZѻvC]ֽv3Vv^H;{֏ooͫiqrsӵl鑥Zx+)cjg^=bޝ֝)g…޽#z}}vNgiLyLu.Y\O,G?Axׯq6{:~M3NN߽G}U{nvUN7- NSS/COtit \q,;7̟#bݿ7XvӝɚvO+,fVKz+~tvۻ'ڽvuvǾ#Txmڊ hdk(ꖶZ|jHq#F ^U%Kڝq[1bYf(r31ys+"Pg2[joW=)[*TLJZ=IPoܽq_&~:u/Y[P U-MSSgxUz:_Jyz|Q6wPN>(tV /)ݻؔrzlTsjG؝G!u}*چ 5k *➞%fq *׫5BVۛg|O[C#KI'Vvv|%.٪>ovÆn\N~|-C; D*zM:+W&ScWEMO?Sv$9&sbu, xD4:zGm>poA>-|Y=<zWXB]?/OAKj5UrG0#,h=׵f,O9=>*[s;c%3K&. ,r;vY$ZXeS׵*5a=O^z24 7?gk#\y>^mUAY}6c21SGy&:dэTTϔkj`x_^Ua8ͱlLF+'QZ}]"E@28Dff:aqEOEO繢"Ha5!# E6IZ|#u{=>uBa[zQ|()7+ ^#2gp=ݮ+Ncї+`^N.Lnu|>v:R=Lj(]iR*igdiY%tv?@W=jKQAvY-[olobIl Pj5'SYM)jn~,SzSk7a$mQ<a>r}zu{R˟mݛ+*'}&t|G*(j{>eKR9S[g[w!h+um#?{F7^:[w!h+u#?{F7^:[w!h+u#?{F7^:(<Ŀ{z+[ׯ6+)to wU_8q4ᩒ%_UdP ElOGW:[\4̚ƨ.SzW|,^Nf{,3Q{+KLڴ>!peΕ24E:? Go~[W/6Osoc﯍lL? & dR ,t4?# 4R5bI 4nV|}:uH/^ф'tv5OYn-۟=Mz]ˆJhl 7rVQ^-;ߐ4qfߊ[H9?wV~5J@8\hj]h5-{{HNlUJJi,;X}龶 U_o;{#ڴ[[aSG7&6J'TL\ #H-HAՕAYW[w!h+um#?{F7^:[w!h+u#?{F7^:[w!h+u#?{F7^: ̷N]?twoTzy7]ਢ;;=ӻC>6 u33% F FfE@]M,U:){10aKARar6 =:h Oϐ;Gac?9u[w!h+u#?{F7^:[w!h+u#'V?IRBE(|)QpG{{H"ߟ~Ǭ~Cf˭sChvK \1hW(9=pL37RCtvz<ƍ,XSƒ\B"8uuWQѤH"H^7FVG[ws׽uŜ&,G hK4H"by$vT4U=ut?ɟ^\% u4; 5E$[Ii$pT R.J=X)=^W#OvN|F\f꿻"mݍ&jJ9esմ/^GM.1DCQh7bSV^G7'r}[{C.m DuvyĚkv>cyl:%p@#rTqVH/k{߈{H;y*.['6I%.;:㤋ua`ca</kq1C]?_;~aw_d6NZnfc<޴OY}Z4WNEM4$Az1V uib8m'cͽuy>lp=E\F]ݩDa}5QSQ.u$\i,ף3yi‚+ 7oYnu~C߼VGZ0oY&7GR&S#׹mۓ-$3RFj ]:IWGQa`1"yPT"v]{ߺV_Ɋ3n{y`GtE'kmwMrthi~UjךD)v pZCZt'ʿ.͝3o4YIb;5,SHXB_K]DtIuvTݽG/`IX.[ R\׵6nlear=xU=u~}o+-9|j#9l&rʟ?$?srlkiK9*\N66%RjRhj5Vms ԧΛ7V %ɹrUaJ_UQ4x,JefdZ`8.-qI ?j .V}_osՔkl5jWk2 vϝ;f)F&U|?m}~u#S)w (zŚ6*#+:/;?kcq1K^Sd8mey.立XZ |G+eS@"M47f *zs͋!(/\>KUJ{eu K "b)b54TTTӘQֻ#>w2U{쮚_&zfώHuZ}1w3(U֏ϻu{JL-6Em;#{rQz24MGSĕ*xϳͱmvcOSJ>;cW`RnXi*vrEcc12HB<;%cϣ+ٻ!ifzvuSW뾁%c{ڟúkSv]t=ryL SC0+ԔUNXT[9.;wd5?km=B Q`,>3Zǒ}הߎ%G^=To:^׽u'3eLC}&:u϶z^׽u~{ߺ^n7vʏ36 ?:г'܇@;{U]},1|r?ѷztpx.۸=߷Ksktarwpr nLn[]pS$R:_=ߛ? Ioތ ڭC4{ hr֯zUUPSNYI3Еj4E :*~ֺ/<y&:uzHnkcnT{׺ϊu㯵3_/"M/ؿmlM~]8:ln{{^׺u{yz+?r/۟<ԞԞ7G.׺u{{^׺u$vmt}'˞AsA]w`{ GLm>_3ۺMi[sfu~l*MO[U @GRPhs`!4ʕ "~i&(w~SC4S3va wH\}UD)g ibR.ν{o cs#؃|cut4ÎWu8[9|+%,AIl%]wr6oUaQ֍ML1TB47HM#>R#jz<}VO%_UKc(!jS!PXe:zy#,r}uG)sJr dJh/GR3 iqPGMu:^ D{v(:=^Hv][wdo&{nVV l^D [V8Dhݬ4{o>֕t1lW7쎵¼ͤ@A,P;5U`WHMS^{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~7f$1b2X[u;F1=faCta8 S'~ъM?qYLJ]ٵ+kSC^םyC%TJN X 2_VxuS()+F:܊ČG$tWp_j\Ff5Vy,n,^3'Tԙ%bO:\=u~}o+-9|-Mͯ5X.rO}xu,f -{+>;rEܛrn &1GMP(h("bz 㲳2ɹ7^F|:iKw &*EnP"TBj@8u_oxݝT*`$5q:JiBȆGG7RzF;FϤn}rrخ훋UfRc|VVԉeiV1UW X=lzݗ~Gqd1GAQUrx;hD#/7tȐDJvxHJbōONAhw\^[Hdq://sU*%Lc#Ϻs1A%G4XGL)t٭s;˧,7]'=91/_??Q|#=v]{ߺFjM_^9<^=EKqn}^I64? ʟ=(M&6%W˚Vu(dZ sWHI^׺r]>OaJ:Gݼ.5)۞kPO vN5jKKe-=D ÐHJS{ר%H:xan!j_G5?{SF|fz*JDSA,G47tW"|P7.G>6Æߙz:Rln켅\n֣,YKj:XSA6zo:u 6l;+kY֚pֲ 1w FWʝBM4A`A#aK`uӪ?mi"6s6Ӈjhivz JH  |ѯ>|{'10lų;-d*(rR!!Xl}ӫu~TwG nc~籾9-go![6t8xj5_AUEHH{r3Fz u50WT#dYK Rl u|>Z_[}2T4s{ߺZ47χcʌژC 6Zh,vݍXvfÄDkO[SVPIZGqJUj_P3# ?"CY?t[asG{!K;n\dvO3׎lcXCej >yEMzܿ~׺|j/ cAQM"MI랲h%aD} eK.T׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~58Lr@M=u~3]>g2 _ zbv<`LُwnEQ\| " bb?oVG/֪=:;':u6^ͺ;calL}|Qĕ)E]HDW̪3񘨩`U`eafWXPA۽W׺uw|HĕuY>׏A/,? ?e=>׏?UvllʡuЛ}ٺPUG$T@jڣC(FT|`bVg,;,D̀!*}׽nԟ~X3~sw@ڱn="񅭮I>BeMU;E8`aHfefU@+զ1濶zj?yvۛ'_n5cv' L1Ɇ%dHo]DhJj[HYu\^%mvWfSfc4T cN_C'm~ǏDݺ^ьuG6GĪ?uSUHʼ#Fv}ǣc|xOmlH,}+wn퍷C\sP&y :bf>E݉[=O׼hb}u</_~sWGWK<[rW{ŏ&/_};6Nu{S&\lY^lcuY;_%j`u [SU+pHfBFڗ=Z'=oy9mudel~ݟ2װݿǯu=şj/_k:gʿ>_D_؛q8uz>/Smo]o'~!ï%GY]I׼hb}u</_~sWWFVԆ׺y۟<Ԟxu>t^ֶo?%Gz'?Z{u~m nψKS6ۿ F?a H(i6~51x"e**4E~{O7ӋëV׺?[>K|oӦk~ΙwtI7`j1N6?9PMLpllM)Qvbɥ5oPun};G8K9Lb&ǽ|0OAKe0n$ui,tFy+뤩ٛA*^\Xƨ2nڦ6DVbnB&{]qt7Xh% jyT0xdX20 uP_0-+SL{3]>Cu+7xTQcfHk^[KW/]T&B>v%5}eԚ/~=#Z$uDҖHRKG%"IFh³!'I6]5їku|> ҲmV+}9G{urH[]fdc]Bl+؛jvf}sTfo[[;Bԙlv2XDYDHQ: $"zU^1t4>-~ŏFOvݣ)+k,Ra)ꤔ#Iv6ZaQЉ:7Y (gbM%uDfIHPZ*H}Q^u}ϙ(ώ݁{ac7em`zvh5tRY,a H*t*juh+sxo ؛vvMwy}߻󓀯YƮTGb;x@V8E_N;{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~aOO<42GT(E^yݷvYג&+ 5FM}{{^+xwďIYoYu=mxM~SߓxȿGn8{2ݥ͔=tv]I3U>31pKUT|&c YdX%zQŴ6pŌvWgͩC^O8զ5@PP ֏ n;3a;ean;1Xs5iGrVa6SWV% %$M,Dhkk`,O9OT[WuC{-G=K;nk{ny&?]W2Q\ʭ]Fb >ֵ0}{a+:Q:r5kPddjkuq^'T*j uǪtl~E|Tvs!;tT6L_ɌFNϊBZ-El>:6k+{>wo.Uv49)zʊ q&qSt % ioV'^ECzݓhZ׺Wd/sx6v-sfXzc 4\q)FoΞv9l@쎗31{nmKe'OV #CL+ ߝA˭е뱿Q)Ȟ|TtVv~RǖVz9NOU%Ϋ׽u~m_ G.mG퉸ls힯)a) IaP,3E *J c{¿'UU(M֨:/ :>z^doQ֟~޽zA Ojo^Aֳϣ;WN3έP;3YCPe-*TIK*2p>߈ zuA??q۽Sŏ&/_};6Nu{ ]oΚ՘qU54Ta뙛BES*^tm-^EGU7 ̦2(rT5x?uf;)@ VSdy i=QTSOMryuTel~ݟ2װݿǯu=şj/_k:gʿ>_D_؛q8uz>6p؍ňp9mv7FNX6^j] DfGR~{Zꪀ:P,z]A Ojo^A׿ [x{DTߵ7^|-B?ڛׯPu_޲/w:vXmߍS;Yhm필~Ub=4UI5

pw3o Ť}}i xtvR>ZMʦ}FA^uA-.JXd-Q4E3 `-r^G5ۧv<e}Y4};#dSĀipQ"`hO׺ؕG͠h`lܤ(Zo``ێQ0tQH/ȿbjuV֙tF'#>m-MͱKOɏ*=vbcFPn{e^'O_kx_{׈{Ih+]MQGMm#ru#%;ak|ʽm)WՀ5iM5-][r3I_y]-ޙ&wml³rJ!X h8ȟ( ez_~"z';b2yL6RZ +'beD2XJlHݾ}W~׺ٿ|+o\g,%/ؽiN]>FpcbUL$GMfUCglu~{{^׺kf{sN-gK|rf62Z*aDc1h'1֏jc]+S۝W{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺV٫'m%o;-J(TeiwUvSX%/6pkYV屉[4u\+~N_˿;nyޥqڧq9[j+#wguTk$W\TU5NZI%Ѣ_N*rz*_(16buG{SY}ݛ;kF۰tjn;3UCaqdSVECB!x˧*:҇u/n̨ߔ]׽볲I_5N J3\$&|@ӭzw{ߺFߚ7NxqL\L4xӖ.cc,HϽ0Ѕ̶%w]|]_*o'#_/t*e lL[hꦂ&7(׏{]{ߺW>;~tU)~=yl&Sڝ`<5ڂڸnLϫ.*zMOvI|x8ϔ?{c{Odͯaadj28i5l.IijD*'Oi:s3;vN 6흺zϰu޿̽zoZ[nH`eSM0Yc ^cӭTytc~EΥ'|-$1?KIۮA=fB}1U Ϋ׽u~m_ G.mG퉸ls힯׽u~{ߺ^׽u(gOF> =Q''܇@;{{u~d?P{Fá޺Ano[9^h7mmn[IIgSz(H {z:u~ΛGNΖ+_t[|7,b=7tp}պu{{^׺ul*ߵ==6zNgMIêu{{^׺usw&bvPTsyF(3drL<iTU{^K(hol?V UZoFV14urH$ǽ+Ň$࢚5c< J4=6ƽTV S m+?W9qW=_~>}6}{vET7D|j?$]햎xY~nS,OIx:7ؿ/$;?=7:q8uz^׽u~|Ի[fqe9Ok=!=t;v2]1hfQDխeBxM& 4$N ;*(z_B&={޻HEFw>0n͸*#ٛ ҭ*ůIX}34!BLHT5{[׺Ob_갛3?;7%kJߎ̋H5$ED6x[^5gUcNmĊv,Qk'Xڮ/u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺW ^鿟eWwwJ۝MK,Ƨ:x⎕%%km ȎGnLXd`~׫y[7eGMg[~KW6S#OXYBU5&>ԓ/bT'd3쯉_`eݥ[+1|Q<қmemW|oPC%<4Z4dMU }z]5?^%5T9:559ƽEx܍#mTjq}|2|Wꚁ A nu^{=3QDJG[ i+!eB*f,q,`EQLh^'{m;XV9KzsG`t;sjƬlfa7U4]Fj\f梤%N)4jy4hGT o쟑Y޹n clL&wn-Ϻr)MA}+*fi<ꨖ{E{';߽?E e?6{o2/qw O[C)2Tl11uLdS:MTkjNuAz{Z|Tg=[Rl{7r[ Gm7c8#E[ʞ{W}q}# s:kmRW3pUZ}4BK@XȺg>7||sѭ9ε~z#5[z:@g!Iv5$+֩):WSH9ez5THo%Dgk}z{sJE$4g+4= irDžP.Ir}u{չfEٽ 5q;_dkNNwPM1I<) 4 XV8tl={oa/|siu/hm4{#[aVdz3R}6Pi1UtQG +8dSqU77g$KrS6AU~T=sYAfX~F)*gqbZ{?@/jpz7G_B~}M,eøs! -%-Qk֛UIk{^׺ڿ2?&]ڏq]:=_Db1\ ^6"im8j -Hb8um7)jP>5%DF#}G[[y?h}{:;FGx'ׯkA7Z=>{_U)}~.ݘΪuX-6E_ucwK[teqiR҈D.-m{_^ѽ uw֏~O^21X㵻9>nuFo穫{驑."ڬt uRk&۟<Ԟxu>t^c#Z}WG^RnciRO^V2MO⎦'T#FbTeR: qM':߯G8_\ UB H2 2"? V))#D48á޺^֯Ͽ>Q.+`mᄒ&3tuBv s1rfy*E_5S㫥HQ T"+Ϫ0=k/,cZLK<3u]E3ñ$Y;6V-Z}׶Ȗ̵{Fpi~׺/ջfGuctkc֕ eUQS9W"?2,E҄"4jzVKOjzo:_!~Iw{botpb?ln{{^׺vۿrzB{^׺;ʃw92sz~ګD{Kx]>gI Vc}- 0=]=:k_{^C/[˴?r"3ؘDCL&o顑I ":i\ֺu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺF~[']Lj7-N%׹y6`BiWU%:o:x?83[z΍|NurϔB[]-HZbuF˯CAh1tSl.v'O.Jv5ۨi+ÕTLH*a>ըQEL;fRן0;?1+xEWac~ޏ+Ĭ#(4&\>NZ( =Vuעw-_YmcK/b||QdT i㞯>v ZsG[`6_>EDݺ^տ+>;拸W?Mu]^*o,FK*宭As܀ǗV_N;:w|{}z;6,cX34Vup&;-FErkHpC E1ӷ[1 Nswl귇7?3v^;v{3K4|MdGV2Jk*h:zr|Y=28؊2U5s^6K78[ST&*4VIKei_.w?巖],t[v ]ݟ\[~mO\zZ~ ƽD9xf*j_*KCWuQmOGSg}Jn-׸骽]2gr/rBٍUWu{{^jNg?vj?lMutcl~[<wur^zbُ:=鞜=u~{ߺ^[rW{ŏ&/_};6N }>3ooCG"c)c|e w٪+GS.&"sJ-_GG unMZC˭)pis{^׺Cv^v |W}鞷*oY~3l{bogt\b#ry?v_}h5CkWu{{^׺w۟<Ԟxu>t^ִ_ ={~1_=۴;۬*\ܩrRi񝉱jVܛ p!$#JĂ+I>`PPhkЋ{wbUNLln۴;oֲu)OVjq:hSuŋAQ7PBouemN`oٻ;odih38,dJX,;.ee>e`4|mO ~E.Yې=WH e@ӼSDYZ^"?CuJ]OۿzoVљLKndmTȘIuv*4f9>QGzqxum"{+6mM{S=76>Sxq9VV#@nԣz|;ut_fRWO}QRm󂗔u4W1IdF +V *:htWXuwg^ݿ3c!G][SS ?N:'L=x8ta?㿙_5П{ׄoQO-6ȝ+|d; 7]z>}njy7Xm6Fh^v K'`o}567kgEs]*AZR,S{*RX^WWfel|Rs~t^μfqտsۃ/; r+[jiA$cz:}SAK7OWZ|ɗA=}6LAU|Ur9V WZ/Dаaf ׺OTUUVV(*%Nt9 L42 AߺW疡r eQ2_F vi1=rޝٕEQݻ%ږQ髳GH ׷ =QS+qeq,Kpn--_%e*%Isf6Uu?ş0=-w%u]$sduDTiNb,%) $LEO[Zy}W}w?8;7^ٳ6Oaaub>Jʹ'XdTB.; 36n'V>LvG|ݛdz~;`v_O~ݑo=+d驩uT{i{39-5'4r*e ¼|ZV;wuC_q_";_gȪe MV'LmzuMMQKh Ϯ ʔG:3F,Mzq cn L{=)|Ύu•CWr"c0Ek.p)0{w~{ߺ^)2~؛>Acc28:| ^>wgHk)ښWVPX,_ߺTQ'}<ڟ* CDU]Dl|WGY?>Ss{{HG)9½nuO_a^^:1?e{HNJ ?SEZ?䘝G>t_H?L_wm:=(|-_gkއֳTy }]Kf1UYl6c3dp]Zd19l}Ld4u<2))OoN]?/40Ω</5vFߥekiTEEH3PBAT2E%:jt5u}{ߺHnkcnT{׺ϊu㯵3_/"M/ؿmlM~]8:ln];wNJ+ul<^jjl.#w*UEl5R;@"+-*v zT'QrFmeW׏nxt= | ׿?>Ss{{HG)9½ntO'budo|Wf|l텼7V6%:lt rPMi!Q*21[y4EE:fYS w>Ũp6ࣕڃêuuǭ>gxj";:b =yܙC[[,bkvD`䶐R*] ~JTFe3ZCni^U6o}VWdaַO﷍!M*(Rnډ 񑦡%?.#m'<: hd(V0  G=7%_?>R֛&-eUVUJ"z5TX$YSWSB0CrǗVSC>t^o7/~_lT=ﱨV:jݵ|FyZD~ǔDs *b1ݕ@~;1s03}޽zzLv4ŚyKhyE+|ꎷܛ2n旿Ctvf19;[O~Tu0ROM.섴3<CSiIo?>޿Τg[#o|[rul=m]AZԵILr7S$B=F6Z|MSR gRzuꃃǪ>)=_Vw̪[?=F% I_74.؛"C`TȖJf>*zyOn+Tc?B/Qb7e]>!ĭ5-DR'jUd -K_G!$LlREDëNoߘ?v;k#cZ뷽O_ONV< ig0)9^]l:'%vVcsg۟ #ڭdGl,ޝQVڪ QJiE TYj#SѬe=ڟ;ͼw.S=b8s޻UQv 4"VDFC G@V5"5cǪkyv}ؙ&Ownˠ+39iGGL))GKEL)P{t Gߺ^׽u~m_ G.mG퉸ls힯׽u~{ߺ^׽u~|*?[PU#Z8t_HL_wm:=(|-_gkއֲY'Hډ(+JPVLxIRmM[Kӽ{ߺHnkcnT{׺ϊu㯵3_/"M/ؿmlM~]8:ln{{^׺u{sOzk~!֏p.]u_æq{E{ߺZŽo3]6‡r47ʼnVdu?Ute`lU nu^R/m>7|ܱP8Oug*cOYl4Z&>JSZ} {?S3lZ:ҷ#fry\^ܾW=h9܌lsALfjDh=7?~{ߺW Ukejoud^^Ͽ`d;Z|?u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽ue_&ߔT'w|&Z'^Y!}0*Y2Gi餂-ISFSGR{mvs,=GI[f_zot%4ROKFԑݿGXA bAQu\^oLȯ= 񫬷63uv"2o8 eDk'6H#IYIXE@g=G^ngi[]WfT3kyϟ,`(5bZhhi%iC (q=+qug]ߏgm 8uy쬽Vz,=qMnޙv}%̭ 51r 6Ą8^xuTݑ{pu̍a{mevUO.R4&YcpC+A.۟(?3]ߺrnܔF%z6sEXWwJ m;;6o,򖨪zyYIgeev;'>NƶS~̦*qi8i@4QROA0If.DHۭu~{ߺ^׽uGZrm>YG&*2-MR y*#xI$ȱRYY@ó._.׏=ῧW:;??x߼7ڇ^g\]gP{{P˗ˬ~ӯj{rYuAuCó._.׏=Nul˔.sɠ :ւC#⪡U-$>#{{T:k>?4?;zGh_}s{_zogU>j1.ˢ1:_$38SsrYuA^uC x?,~:|흳+w{#|6ѐq=4׷v%e&Q<:n^s," ѼRܫ"ta$~m@ ~[w> oz[.Q6~a%A1fG2e4aRa:ó._.׏=NtWxv>cVuFC):N =efjzhRWv ԓaϿhNu&*) cJK ,r!VSoG]7ɗߍ?f^mr=UϜM{_CAQCK2x喒{23`yuu m_˗ˬmoյ,^? :׿/Yῧ^:;??x߼7ڇ^g\]gP{{P˗ˬ~ӯj}8o߸<6:\ԫC\H'@Z,)֏{@~ǒ֒,nked%i$Ԟ~3Կ`$1pHqB"\{I:wPu?y{?I^}CuCx+8|ۿ 6Gjuhھl%&gTף"IDJ} HGTbU׺:oG]ڱu_]~dwNܢO5Y*l IO)IU}RӭC^?͛rcˬt_˗ˬ~ӯj0o[UPWnlmQfٝ&fݱabDJrfovUu5Zg&xfzYeI`jM A!砩!|9HԅZHjZJz*Jhki&5̒<2*:0 {Ǧ͏[mT %&(ӉMF3r[LRP9%筩M9zΤo)uj&jXIk4L<~Z)2~uXcq|Z3xĩS 6Eԯ#mZת:d,-l%$:#mm{ka%?TqQ^;"'/Xzܟ_XRGw̐aj+1Px~yxQ 5IM];(MNxjP_E&OhZy6b+ڙ W*c@bJ`f dyubQK:*k"奖Y摙Y̳O+$K#ijI>r׽u~[Wc ~Uo݅M;= `ܕݏ4)5s cno`[K ue g;??x>u}Có._.׏=NuΝKoɎA6.sWsb͍lc(mT$nS ݐ\ʼnPTn׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~Z_{J߄9pxM;srU?y֘3rmJEpsE S&FzI&4e5ԼՁ<:i/# ]f+~6oOY$vlX1ˠb7vOA&SMT 9DZH6Z"{G{Q|H|mC{v:vmgCS%V]ջ:Gqjw-N#hW$y."T]{z>Boo{s|o랬ؽ!\Yweouw?Z}Nh~&)s/$uTqZ#4ycϭ\Pur6wP>>,"y\5 ;zGw%&bm׶4}d:Qd$zpDcYt?n)zgF208|VX(05]L̵S>onTWOSDhfI=BhG^!9wBjv7stf i*0hdtQ\ٴU['W_Nmhw&v~b=A6Z 534OEg6^xY$ Ju^z wynb]Ӹz̾))eF9m_TMPljek ߇A׻z/k5_>NЯ;0cڣj  N 2g^/ cq\svfyR#r{::)6{-](yijEl^t6?×鿁ڙÐM1TGlLM *^+%K:PTBx|'ɑsvO?È.of3Ei%Z3#$K5G"z5ۭu~{ߺ^׽u~wr>׺?ϿusOs{\S^?>׺?ϿusOs{\Sߺ]{^뻟^?>׺^׺uCo~zߺ^uw#m{\S^?>׺?ϿusOs{\S^?>׺?u׿u׮n}u7^׺u{o{\S^?^׺u{ A.^LF&bZlV6f&奠 Hqczj *r?0RSƣߺS=u~{ߺ^׽u~w{\S^?>׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺG/4n`py}7`|tO_*llTË 榒JyqQL'+UYg`vnù>F%O{î ;'.[2q{f  h *\x&EB1 to}Û𝏲7?e͞yNMnu܋.7!O G$t?%hZsԎLϟ2;||xv>Csy6T euO r̖XC&$Ӱ3 +oνE_.,cv%?ɯNV[aWvU6ͫfUB./UXF^'E/??e%omf7/{]EbvSL9ZES#E*O4qN Yp:_w/tw>qZ_J}[cN­NC\'ZCMB=ּ<׆G@Kٸ;w!,^91~@u_I]O;|,hz#O9g0bI 9^9[U:xףּ}wyVE;݃ѻyLu~Kt }2I`L^گz3WU4ELb1 t ׅ+H^]SUT_ߐþ=OOQKMw8Ց Cadl|)i#H嫦NG^mc4:vjtQllg2Y.;xw%vɼ9.'H)hrtq-nC?A}.>ޚx_A;>ỻ-[c{2)[WspmMnt?-IPѡiwxY+N:yn|OqSQ6gm, sSegmu0D͘ ?0UjzǪuWi-j<^N]A=s״b3Of4_>^:tL*hz)ֺu{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^{e<>{?wݩvmL~ܘJfqrE7zWdowaIb6Ot()$FCp{ 3x*X׏Tм^VBkZFD'in˗)7=-}GËj.jFR)]T v"#%RU=;CcwƯ=wwBNfu踥ޝSK9SMC&TM$ĴKj'rmԟe:?m\vzoRnz^ݝaw%ۓ`#x#^{I^\6WfuφI]wvw}|ݏ2fiO}/TR#QՏ::;촦znwwo|6 2ydȜljľrt[5dA“?Ū*YnQߌQ&ܮGɎ]i0kwV.Ar )!VFE>޽E} _9wY쯃#WTٻS7"z̶* tk|e1N={W:i#'UTd2y:T5O#RM4yf'\=u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~b U0CQ4 _~}_kH7Pwp>F wxm1\Zs&*`ڟΧ툢퍓#ACzg,bf&GM!f<ܟuӭ=-ev_#9RY/&N .@xCȞw'?f.wlQAJ:@תz 8c44,q(}k~׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^cd(y^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^~iNI_^Gn=w{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ_ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^_y͵;k%7~7wW}Wœ+xbDlnɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^os~맿uɿ?{^[}.oM3s_eO%;?ñb{E<Gq-ݮē`T3m8;{ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ ?G߼GG^aZG}S##0-O)z׿h{H?S}^ufx?pwe>?^:3m8;~ׯi{j6Ox״ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽uߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽un"P{)[N:PNG  IHDR%DiCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A4%UN$As{z[V{wwҶ@G*q Y<ߡ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYs   IDATx UYg!QQA -6YM7al"#F@EdDiٛAN DBbX$Bd ie[ﭪ{oݪ='yꮟv@ @ @ @@&< @ @ @ @ \F @ @ @ @^ @ @ @  @ @ @ ( q @ @ @ r{ @ @ @ P@z NC @ @ @Ps@ @ @ @ \/i@ @ @ @u@ @ @ @@8 @ @ @ @@=@ @ @ @( r!@ @ @ @(׹ @ @ @ @P4 @ @ @ @: @ @ @ @@ @ @ @ \ @ @ @ @^ @ @ @  @ @ @ ( q @ @ @ r{ @ @ @ P@z NC @ @ @Ps@ @ @ @ \/i@ @ @ @u@ @ @ @@8 @ @ @ @@=@ @ @ @( r!@ @ @ @(׹ @ @ @ @P4 @ @ @ @: @ @ @ @@ @ @ @ \ @ @ @ @^ @ @ @  @ @ @ ( q @ @ @ r{ @ @ @ P@z NC @ @ @Ps@ @ @ @ \/i@ @ @ @u@ @ @ @@8 @ @ @ @@=@ @ @ @( r!@ @ @ @(׹ @ @ @ @P4 @ @ @ @: @ @ @ @@ @ @ @ \ @ @ @ @^ @ @ @  @ @ @ ( q @ @ @ r{ @ @ @ P@z NC @ @ @Ps@ @ @ @ \/i@ @ @ @u@ @ @ @@8 @ @ @ @@=@ @ @ @( r!@ @ @ @(׹ @ @ @ @P4 @ @ @ @: @ @ @ @@ @ @ @ \ @ @ @ @^ @ @ @  @ @ @ ( q @ @ @ r{ @ @ @ P@z NC @ @ @Ps@ @ @ @ \/i@ @ @ @u@ @ @ @@8 @ @ @ @@=@ @ @ @( r!@ @ @ @(׹ @ @ @ @P4 @ @ @ @: @ @ @ @4 @ @'^~7ވ^\,{E/Z3}*9r`GYghQoYaY2@ @ ,?RIC @" e܇-ye/E~aG6b@>&~ZkE[M{pT@ @&끮E?2{V]5wx]uq~嫍N:! @@)o7?elmՖ(+L_z;r#]- Wh*{O!@@ ,|MMoz!jʢnH@ "pDuolٲR*~MΊ.:;hz -._&(׵-HINr=S @,7FXL @ gR_7Kk:(+!@ @#(b7}[є$35b1@ RX7S%& @ @ "r=PH(?zť_͘1c5X#ZWRc_Ιڬw6Z{>zVXQ7&F}zuW @h~~wh_텾&G بQƨVR'z:zP7@`_rBMN#V=zFtt / @@9wՍfyw$q mhyWA:̚+37?=`Q M1e{^_AR @@(錳s6>螻1e R)XгQ/護߉^~A5RYgA7̢"K_0ƌSiLN  @m(xU%wO;8HR4 JFKvb:k'Ctsh9Я @ p,j:響ߔyO|tU|<nƘYE,r @!hٲeN9;Y{~ uA&kxCk̊h̰>e< @XIJ~}I]sO*@'k]6“bC >$piZy6.!m2 A'!@*!rv}aִ_~5@gVG_\ZٳSs @ pM8WMݧ}|# @$z=C @ ԯPSNS|A~]hw]_ֻ~ \D @1y}!^hބ$ 6ؠ ](W{ЎkeFcy[" @3_j'0u=׫oTjB<kcE@^;/sR!{*A{gsϭF5FS|:K`ޯ=dl<=c,뮻n}r{ͼRb䯁˯Ɩ>=pzkc8J H @p%rݕXhA)]6QpwX~ ar`ٲLb%C=s32>sQ4ˈ~+ѻCT< %`R8#GF[N"B$g@D@Jo;ѳϿ0Epesww.jg)Lk\+k=:I@vI\`Á<B@r텏?1D撵^VT#F -^# 2޶\m f@ހ}}^&mSkgt}sZ\/3^۪sU.{jjۀ,)% 8ĈFDna"@\')/\Uӿf=8uTvO{yʤ}Љψ;cFcUtxLo4f}UZf/l\~K4`Uz}NUZ@~]+Wl7 GőFTd=d{T(Gzi[^#$ٷLr;zq/eW]בWn-ZhQl_t&%2Ru1PTz)ыgPuQg32FUeQWEֱމo{iK->iܸ_!C'YIe߆$2 IDAT'ɴ^׾bbL{k=O63ܳ)s{V}:g7rik Z PlYIϡ?D(sH*wi调G$w?!ts>`z(<ȑ#-M=}{q$ lj7<}׆TFcV'PzNϭ$w< qNum׍U}}?>àx{6>k.>vkVXiz^Ջx u>x\/5~ Bju#9EHO}N_kC3VYwqdoka|*9CsN D9|lgR'Kss3l?) pI!5hA{(!R^"O*!~93NRڑWQl^ xB}Wv[\[ђg-XJYj#[9~s64H?VI$=VC&O/t=uohC&k6D;ݰ//gWZ}?nB;~R΋s)e2Nt+-)](^$ս ۤN>LۮUBx]w{.wѻE ~3:9Ü⤷*RnE@eTOt%) ";^Bm2e{&2]s#.lŊw<$t1 o΃{?hiqwH܌JL=fn.thxCM*ْK#e~l/wx[s#. v5M۫ie?h[Oe4#_m(bc}9$Ye=xYKb>kۍ?=}xfi@1г0@!Yw뽬%~\G{TQ}u';:wl6<%S6uJѯQ7O9mIU(m%l{4yIVn}BHk=xI&O^Zvq Y4~-v}&&6cۉXJl$O7jk%ů?Ɨۤ91e'gи\ E|zky[c,py)'9?|=kp3t^yWJUTn>nRUXv[omfѯ+i=x=¥W\λ}}zȀ08UԆ_aV?X_/G.dau-N:m;o{żGf6{'&81zfHf+56QѵݼgSg]}[g׏^_fz\O3Ͻ%G_'v4}A|]^]Be$sQ9oxz=e[G=_C]׍ \_Q4Ѱl[Mi/@*^;?cUׯ|ms~E|hݥwX=g3M5?s I2Uk99ޅgA%N;7 דiZۏ"ty3}ַH111yWfk9k}*/fM}N߾R4O}Q |ǯtݫK/j=wZcXc{s^u4ldeNH?4Wy9|K 2&e/t$׵Gz1}?>_۳Y|q1/u%-|^#z>Il֫_^_;&_(z$Y5=ɣ +ib׆k|s ^$Ak%o*3VxAK bٗl'YVVu$׽hb,f%~tI!|EY0EG!|弬}۔(ɃVyL2|q' Zy]%_쒕a 엩nd{V,ۦQ[W̼pmMȧ߰ \&Z\Q;.bYJ2U]Ơ߅~Zܻ%%)Y'/Mӣwmu+z^yUê{VUzCucV[փ?"\tA5VN"\W M 6xNW$A~z4 U֑n.D?u؊Rm>P?c:yE;B۶%YT2o1M=G$; 5S+Γ'no{e>2Es7=4Cr >w*9N:!WUt~N.\6ja#d$ra7IIټ RfQ6mHNv_˫S55I詐I6u<H[e?fmjӦlE1:T vjBE~wqX -N8g1R.2);&K0+:teb^vg7LBQ W 07,Z=Ϻw?GN3ӏ l8]}SXUCr}'mN=г9i^]ChݘU~cOdr:#\.CzoJ«)!>em4;b|xWa;`OyMUmS"%:etMz%Ync7YY\._ ]dPU(%v_6 Ӌmf()J +ns3[d+߲PP7aߙkT~\O 7 a(Yȓ@Fhyߤ}>,|UNHIiG^B+0#axpkzjOFY6FYyB(صyAL+@y(U_Z<~eą. ,FYj&=k,E,Knn Kwd  rVǵb( a 6zzdU3Uk=oY{.mWR{Rhݘ՘tw/P)XtNot;4ljֱY*>d_ɛ~+yHq>m>NO|W6 2:]ʠbyKyy%[;ej}t >>L7Y6kڕTε1Ǹ¦^sV^ʜz=G^7|_M26 1ϳ\3Mb`/B;D"AQ!D[:d E̛Z2k^L.SENJ/u(}m:Zܔ[R]'+yљFȬpBws̪CZL?xOw4.%(¿̸JnZj>l%-hL|I}* 7LQ='CRr37`YE]ѐw#hVM(s38,|޺؁V"k,þL5мWch$(k+B Չz:f#_ųK]׋[Nէ2Yu6x}kEM\7~H`@Fe객gT>_[Eר#e='MmMϒetqmwnV@ElO>8سyfFz%g00\t|'OH-iLhd)֋4I> P:ךk~2y)V~nRh̕**NW'o^5qeO M K[ ۢucQE뭢:p%RSzWBK [-hpVk8|:wcOuYsLc湶RD6 ƹ=T*R1&I&S뚴+k{Ǖ7U"=ڔL{빖N"m/߇&ԝG /ӘzX:h0M}W!pVlMqR: w\Zw78QzpKZq_\lX6i{X_'nm:dEs濤z \Uk[M S xStfC$f;`#Ǥ;+&4<-gU}{VHS!z;$PɡUSu ^pϬ)c'aL^ NTZi_vu(֕_FM1l-۶-F2v|sZ ڤ`7 o(N; viݘ1m4!އ>B۴tm26]6 QtLgmSE+[9=utml٦=m]rbWy:')]| 2~ZraULau8pͳj[M@ZxzC/H[p`fzЛ~&{f%z51o?Я 2LYZ噔C[ UMI}U'K3U-#Gfw7^Bw/2lxo!.%37!EIkK@usELoܧs85PH]6G+w})ܲ/&uyiȦucb|]&4~H_cH=>Q;'3$ u9:Ty}j̣ugeپ {(M3t*}??-aO4&;MZaHX%;f2u1^W􆺽] J"x&}t}ťǞC&ϓ<;j1._[!]W0Yem1Z]Dz*f2sa޺ATE` 㣽oiUjzӭft^!kw!(!߻%˴Pұ . mRe}] ;csB}R=\9yj=ͥ|x.6657b8W:Ȧ/ag?%a[hlg{r Ys^=S%}sGaMi'wX??6N1)mSLG&ոi{ˮ/񐿒E ^ĭ.c AMHj$>’q}R򦏕VHVj[Y=I|crpPuO - p%䋡ӡ5S~2C cHpsqz.=׾ Uhp E$rQ&lꗽ930yNKm];`㲫u)bWߙ!Dw`F]+py`OW_7]yq6~*zE,(r55NEd>l1iSwk  c_ᒊ"\2靬zنW?Ƭ yҞ+O(aUyWxcxqm6u5՚u=;!ܫiՏUrh!Զ٦Yjhl4<Ż)ج;N'Z{i$=p^5m 2vD.'JyǍ׭+{IίBhxe[۴ns]Wh:9~NW5*>ʿYOV^vc^ؿ U'EI` _5PC8hydYlI HQAo . k$sy#~7f4{!kݘVW.'EQs]^n۱&C1q#GVBUK=& cia XZ]m:\xKwaV ߤuYri5No'y IDAT'ahPJ]N a\C.#o$w~^Q4.m7-M"l5a7/-{>sE9>ܚS"L|L &XqH+kR4<5S]ce !PWeB%sJy ʫ}'(('/g֊2s35U9k3:7 TAsz{I^[Xf>yA@!M_ (C>IMuʸnhQG<<^e?h[ h6594{]M9>R?7q1뽾92K޻I^O9gnfm'e?nXNK}. ;l'Sne9)cڢI 7ke1 ]'5L#8NVz>zP{rYs}!kW;X^.a7a!ےmg5}Q/=~~e^6ε"n;ON_5@ `,hsCǞM‚E]193r9|"hkGΐ81˰Bԑ7C"{{[\ol~xL/r7[W{Yd_,s^B 4to΃ê̲C+qnqF/Ӌ~ %}k~]LRuϽCqS&OZBb3^yu֣s5?pQbRV齮6N;-m5J/QؼVl?iqϹnLF[#)4KRhx &XW|\elj A QMN䬣2$.Wy+?UhzGQ7n٦^=|^B "A"oM nmz 6=sR }sPA9N9Ku}[&܃ $\HEx_u.@HcӦSoD 4|&JN@ !PX-Sr!p5!4",[,1>j&V:G@פyO95ٕ+;Ks79R!{AkP2/"*FF(nǫU!oULPMEVaƥHJyEՔ TG[osƛl4)? mZ*+=͉?VW xW] HE97mnuama50"eT]djLh^| !PXZ[Tm8|)$ Y!*4Er)l(`&5 i#FH^F#G*wVT{촓S-<)^欺dw 9P7Zdd 3坨8ه=:䳬ӊ%C K^HsS^Tda%v <6M6J|ɍUW}pZI¿d|@{ )g^|).ZzVsdӶE}_Ι4&lᔿ-}h1ItЂU\u֡`'LpM?n + 6zdfI2" !Bc_fPKǎzAzvCǪ˟{oO[zt>loU^zDjͺ#פYCq(JB}0˃*vթ(Yg"`'(ಷ}]׌εbA&*3삮 }' }͡\Od{W5AEO<g\4*PC.l )F("jKAs̍&[|FA @YcO;0p|dY 4eҎ5MS?VqqU_ >IGQQ?2 u{_uFYd2 yP7{}n|R]Cۼfvփ:Wt=˻|ACP^֟&E&;{u]34qIz;k ߻HC%gy]]748ŃҩdxX(YΘei :QavGG{ӏ{r0 ]ʮxFG ,syM*#PXK~VYߨ؍oTIǩ2̒%!)$O\?;XQ WFEb MNuOfuqMu#Dk`Ճ7*_:ӒgK{ք,nu\W3)}S"yc5a]';M kԑρX=ʴ@JH[sO @M|cj*D 4|$o.(c,-eᒛq7% i/BÛd {aҍϿhሉQj:|LSOð֙l ~MZ􃱓hZ>M"q6$=E,mCƢI<`:Xb_VSiSq,]Btj!%!ëI _NqFP+$t@?JH# cB?^m4~o$Ђr5556M9N{V)Y.Eg(yd\!KurfگKI''[ ='eGWN7.5.QRW2?mAozQ\ Uq&mJGUa5\nboޯZe:̪3]ϣ hBI&!454xQxk_Γf$t@J~iK]f?nG}\ahz\giQ5 xO?h'.ceEu 0E"4<ԱƇ4zE oPʭj\U[O2:KՂ2lV!CWWSJG`T z+vW^{]>aҶqP7:XbTŏ<Ъ~L&n.dl۸Y,/̪Euya'nݰc6>F&qɿSN롒5a5 .$"ByۺQI+V)VBFyyxz⊙VŎ75:֍(LrEh$9$t}?^u/binWYZT54e2.c:tοm.wU2'>{W':<1 //J4/C5\XUC+15]=%PeW_k욌NBG?66RTi J@Y%4a˲>Yݸq_=Td)g?8HMU ];6 \kMet/Ħ~S-./:Э4Փ>&*?8,s]+Ev ,ksMOmע4Y&*ǪHs }:O<h.9q뭣oUiOz)jϜZ7 s+4zMҫr-h#{I y \A\m\˒? ZƦ ?k}i]ǻtot]i,޵S&OB ~~eӦɧG|""X/$ }u_&tog%m]fJfy${gakq<u9;g2XyzPC!YXVdKO1oɯLq1.K{y蓲0m>7_/=}ﭮj_}Ygs Y>e>Qp7(Qi-~%H'xӫcY׬/ve@Q4w7vnLhkh{))o}LQ{O;I@l,SJiE w),*eit7${ʩNFyU]ԛ:Gp8s-gN84I(|&{ˮ0EJ2J9X <+Z]}a+/o%<[~="Pփ:Bw:)wxS_81e'SvcpI~eU`@mUR0H,sJ}Ť>yo2vRBp~NsbYwGОwK rRt33J#H){IË]_|ik NeT܇5~K(8:^עv86CY"OGU\0]}D]e򸛌ݔ_!edHoE~rR5'" #^@'m9JZ|n㍃y5jZbE;.Qst2RAz;^Jַ <&'e=W:A ]rKS=]UСM0 v&dݡW-&^fuQ@67cHZd-IAO|RH0m1wV(b=[G˯K;M}2.\  K~ڿEJB[K_-42]Ueh,'iS1w!Gy2"Γ5ɲRFW!֢2 L|{j{C#reqNN,ߑ6cC<`H^c&6as):±&)@C{dpm(AW<}S!dm7\wEw֗HHQ1!Tӏ ?ꁀM*hAÈ2@Ki|0*'@&45 [~:nVX1 '@ 5%J^=m>|.I72.m3߷GH]IGѾJ5ݎX{οj6= %HI.u[o[]-MqzKaS9yC֟ [>j-.5($O骰|u$W!JO +j˼4!N*Gjkh4YuʹH~g╤.o7Td속^,Խ@X7qPbU&܏ο0:gW?uHP5=7m\:B,;֍&/*5"4|u OW]cJ6 7{.[c0Iw'[+ի9gq￟xj(٦iNyqC/c*2No꾭rVf^zyDjގ.)iW_gZS}XmiMyMZr]Rh꼶&nB  @{֠40$Y&3<:k#PRLirxŀ&H2."%)L\R e1*2|>]F>Wυj^pԑG3/(?=&fX'䀌ôeeW^l(QHgK"PnLH[C%T5jSx @`m]{>K-Z4PE엵%28fhR=A9EkudJDJS{W(CouKwBWabbv}s2Cԙ ]Tu^T,hJr~w|\]45i"=FGHȲ)xh>0mhrEH#F]mOcFy5/xkS!|)К$BKM1<ARWƻW5c IDATTW[oGªX(I1~5W ] I~.x-(.ɟeeg-TR]`.~kjB>>e)@RT)ɝ֍&#*Ϻ*ZSDHG~׼5d M!fc0[(4|$)dbc:nغ^{﹇?9?5]ksBۢ`!N$yQUi>Kj/v j!1^U2iG,#0+^!ӂEUv,Z[dpouI0!YZ4ed_@L@ JI-Ot7Rh&]|N:a0چZ NT]S9Omr{ 0)jfϬV LQm|<48mQhZI)X"ogNX9Ӻ1tTt]'+khnuZoi X^޾ikgХYwm̮m65A9caW(چRIkd{?.t.թCjRi^w]`7_}-]x-]3>k.%|aYP/Hr#`Z7VL4ȸ]צv]6 9}}R}2.RoJ~9^vM4\w>Ք~hܒȑlR;пFN];PJSP¥TuVzyX5)}t,'e}Ҹ5*ĭv  %ࢋ'ʄJ[JEq\ q2r.ks8wCYWpX bes Bٕ> \։Mnuq~7 WG.g<Ⱟy6{yRfr+8xJuZkh =" \_C^KSOuQ,m>IMM:>Hb-P1Q<֠%Y^H&7>.IV``f3ӋWI*IB6J@$Lwy_u~׽}=GѢOjFޘ5qM]۩"B$)q}xE;!vɖoN+ ֍"=?th{1:`E3}j0ndP 3ǵp].2tswᤌ}$tKM~LSg+}GJ}R8[ߴkue`pԑ;Ty CD`V3X\oKw7%>^] I<MpnH0EPmJ;e$oumy7DAD@w==.tujc{Pw -JxF2+җl *,R_饭|<#Lt4'cKtmF,~Mk3ńW1XkE{>jN+}v_qǍ >]LzNVCQMV I8Ri/~BX녬zDzlVa} lya&nM5q;^$q ՔGw Ϧ Hy>&ߖo@P>j ѭ2zɺZW9nHjTV4e{(ːjNt 9 <h_L%Gi2O~ֺFu_vl;SS{YXolZ߯Iw昶 >3EPM)[IE@ ECҲTN@ M=DZ]^6g ,Okt=z퓩K$P@X$5S\>dp!|P:my&4/ק? {귕Uh"-Fy\-{]UDƶ%پmdY>w v1iɳϹiEW^{ݩ.BBk,'piś!.9풣0͓ 6l2raǫ>/Wd)TOF9O5i:vm_ˋe+pg,E`kqG3/Ԫ\vE4~ܸbȑJ` h5뭾|u~[G3=aT=Rw=\Wex*?lv_*9y{:5Q+aI&Ì#J,!u?=nkѾ&gI3pV<9v͌.>Jh;tbO5&:{Lqų(x׼A.:sM] 1ʣ 6'zwmyw h%^5r>|@H,*i81=`1^cFD:k?9 K آdq]ZJNr[4]~7+ |}g@@ ߁@10R!AI;\<1mFR\ Pɴ׽8*%_ĪWmWOV,tm|hPzxʆ[x-O5ʼǻ-W"h.֥$!}ul%uE &ݧesBЖy߮mTc6.B Ux_}qqއ\e,m16!)),](2qa)R Cfm0σdxx/vpt\mk$E^E}JX7vw:*yբ} %TV[&o1WwOe/84c3&]zF@ =*YgŒ΍nxgcTU1ZK@Mۂt)=Bm,c;_!Ő*97akɯ| ` A+NdWûO(6w5|˻l b=ޯ^M5nVrUK  ?{/sp52Ux.v^͕@ IzF?kY'sjw8 oZC>{քfapϲ إJo36q^BmP>V䫮ѧhnW"8X!eוb|".Uxw ys:)j}.e.;4ou;+7^s5[V?@z:i\>Bn|dS[0hW] {U%&h<֝DỖ\s 0HzGn_3:F5)҃:C2G)~,<\Vw.'/-vi6uw|^/ꟍ|=$on%ķ_{]{ $ %1c? 7(c@鮺Lmwy<RW-F[5+$l$"eꍷ0\6vZ F`qn57'( k ?GGh,G EΖ2m-amr? ]~sy0j@uJ-ɳر^= TVB.ӞR#-+IتIJgᴩT$|t zϯM0wܗX@ʄJʫ EÙ^^~eh溷tQ_8~{ Lq^=ϵA׽cr8^ϙ*ň_{+qy/ ^:$|H6/Y\'E?=ĤgoZbo֖ A ȼ&seY?M\lX$w39P}JVnݨIXv)$l"gDY W^{W{a7?1 &wʄJy噑B|F+o㎻}L x'd$\ɺuY:w\ϙr@*Pնqu#v[Y\~D8_JHjuHu^ݸNvʓBJFDN`do/䇄2wgc .8tغE&ǟ߬wm,G@0/rXZ-4+]yu56)jv][o5S~qB\}ZX-Mv['eg]V&n] Km}ٌ*k~N'3 4i"-|OA 6i+6oJ:sqUl7RyYw.-՞oĺ'h3$ D{XamJяZL1ߐkXƸ&w[<0oNqWm$ϡyV̤-{_ژ>ާy֝-U\\U= W#eSݪH0Eirrɳ d䘗6hlNudwt2.w3cc܂gn$W9iE#l9a09|bKB}Je<OCp߯|5IvW |$N'-5nbr{;vLE dz|=Ux/A|C%ށzkaN?D/=%vG/JJKLZE@uӏvz߷r5ʻ߫(h ޸F2VRAWcemYdnԾ&uAx8uvL0勾\jtOKb=\ InN#rJM۷}CtY7yָw{F6@tj@\o5+mZǔgD3/tj^$o[Z3[o3}Kt&O>B* %U|3:;xI ~M\F}C;K^[><Ǝ:pAHp3]@ ,pIAta* :L2аְcM;+8~ 'xҡM 0Lu˚i⹦K7M} ~SoމoΰfGǰN'5ޛIQ /ȰHmA6AT!+ȣB\#ƄPA g4**zQ,&(,# 5mSmuOWwںwgN=Sy'Mo>3eLc{bG͢@ `(Du{t>H%4; @zV_Վ^ NHg%`'/͵47HP)EiT'_|NHWn^^;˂m;v:KFZø ;>ۀXZhe5s|p/ 8@X"[a8ntw)0ATemɓ&=]fG*\ `ݞ΂,ܻ1}Ԩ~& a,fGxͽ"jC.52CîEj=׍ALt˕r VvǪ,!!r=2s"((eo <[֠"̝0~lMӰ+juV^ b0@fR|j:D<:dz)n,ǽ٩KMJ ڰX~yOQ)˩% >Q.Ky%6}VExyqaΞʹ DaN- իx#Ӥ/꺆7ơt{LŰyv3 Dٱk\,̻(N0Y:mtr+1aeӦ8e]yxgٹw{ W##*ؼ׌(G=NKUҶ2@ IDATG}Zo-M_͛:_S-m>D꺦N͘FyJ2 x#P~3FCR,Xg)Z(X v--!m&0X~7/%<6XQɚaɓ'V07vWY=U:=2M< rRI䞦ҹOڊV~ȀbSKw(yp3tq5n]!r\݌V`:i0,ϗtqܔ9oϙbA-2AI!btJ ڳGwLx`JE?[IHzzI֞, R0w^/\-&ZZ5EMkie- ɏeKqY?Hkvxq;I-XY-[er9g!K!s!i)N-mo;(5nFȌe.?.}?l`g dz`onjuX:׊Q]8}~sx2(m={wT:8PEE9YXPܣtѵ*?ܴ%'y f͚i)cNF[ffJ2HC/=؎\a褰LNBwyLӕ8^*d3 >}ϙ'L(b.W+#,qrW[s8S?80Rwj=~ՋىN͞6EaN^ө VW˶fMQ#n|0ʴkrNް8v:|vC ty*Y,tcᗎYy;J A]V`w>O/<I3DˤSuN\[ @*+x}x>v)KE%e5#SkH2Jqt[{R3 kWcV Z4oӄlf$h+As^olz^7=ʉ0]%dve-߉ =ue;}.&1zq^!e:YRN-!0E dˋ`u+Ir۵gGl 8Ɏs)4uÜqEqDa)ܩq^XЮļh{-_Ф(<|ˤ/짂]bj'ȇ(L2H-_w 4 Mmqlխ#-N7>~ d^xx#͢qJ܊"dRlB'u t3aFIƹi ֩LV+l8Y&>i쥹m%j<>uws##^@.uqའMP.ee\&b'_qΗ7+NLg9I9E팧3ٽXʚ\OPV/ 5׼l}Mt3"/m7qx0˦t0:Kź|FѶ~e(̃2(:a㇛t;J[[ζ|HMNU<&_mKb+su Vi乡,5X\a?e K\@m{d\2 UR<òS2G V wrE!8 ׈`[I'Z|iVlE{V0ob)S 94<-{'۽<]rsQ܏dRd6 edįLr3!7(%`t49YoUAX˹W#QyMoԓ_1:BLWu:y&pm&y)4ml R vC\v+WrO rxS}}*:/\OqǛo鈗{vl 6Afo޲U[ u j cnjAd<|ڵ{Eчtܘ6sZA?7uqqz!=5[b'v17ֽNqz(a;2#_}-BXL2ʱݱ5Vk= q#䭥ٚZOcϋ]ίWe2S ׺WS29wP*T.0yeiCY| ;V?=:E(_޻"!7I[6!˯_y_p3ɧz %SwM5o8k:7 }kԿG@t絋}_7j_E17lԪCOn/Wu0KO!n߇'7-):;x /ōMF8T%ϩ瓹n7qsZlVf~4fޖI띿ͬײo'Rƾ&_iUN=OQd׈k?o-۳Wvzo,O,$Xf.yx%S=AKC;/Hd|Nd Oӝ%\q#d^\e)Y#ߘXk]%Խ;o~٨f#n](d=*l(muZl"W牰Qnjdf-iڶii,qn˶/?ڹ3ѶE,u87oX9tߥ.6 1?IƹW37qr.l_;}usT΋ܻWU￯b=77kJ@]$rנ}zD[ 閉ԣ571E.s䥱A%Q^=[mˋ */8g7j@ʓS=yn r-3 /ϲ9t0M֍=Yn&ɴ-/au IDA"/P:; tL5 :r9z$q\jUue},_x ^"/*1o¨=,1o1\7xv8?Z4o/$6x)|ا+W·n1 k0 ⼘f UVMYCrAR~{oqI_u6aAt:2)uI.=tE&,S"Lqkɠn˽($͚4+S=<\yH|1Es閏 { z} J Lv5<{oyiո_X}/Eْi1%q-Vr&gJ6?Q,ı-r~=m CB燼kįÇ?9f&p2?wؽZxKYOmo rpjXjeՖt;~1Q(5K0g5v/trMY5mNl t&M.6+30әYJK4%xuק\21(,^~Y&{O>=xX1 KL <:rnPS-)gZQP۝%cY93ź% ~)Y΍rZSGe\L,=xЭ:5Wܖy^%]]:q/X4&7*iE.8yLW8(^ɷxtfSX|kwSφ;f&NwILp͏U[F/zgc/ /_2J~ؔO״L((`[rC aq=AvD. %|ű5bx[srwr-Ark]f:X̢/Oʖ&N]-#嫸]>|K7vy"Gs1®%(Bd?W0)lrSG@ +Aj126"'Љ0vӞ _r"y d銒F7Fu]DkBΝEqE_,kwrS:2s,& ^x՜5< "r=3mk5v5UYGNɨSFjZ?LüZ5&׶1!&A-knvvhW"h~ȶQDjij5gMKs+0xP;t5JY1# ̒`lٶ]}R#@}^u_}heb-35۵7n ,|d|hɺk˕M-](<t 3E\E׽2&ϙºq 7rjX^麌HxFQ*t]XKQVByu+i," ź*vh'g 8ץS&~cN=E"JV=.Pڤkq ^nͭ2TX&@t99xE=vA "`yr{\"KfQK,8 ?/J-^B-ZVh b~e}X#OIZ@"Gz̝r V#o殂[w='0"ڷ @ Cie6#T.立.w S 9Ė\R9__}/ @@( \e  @ vTm;v徭+V-[1g>8'-# 5oP29jYgJPT@ u@ @ZV]9v,tU'NH*,_jUX0_P*(Ϊsf,,'Ȱ@;r.?}ȑ#*f͚U3TMq(  @ @(MU @ @u0 @ 9(#e @ @ @ @A+>@ @ @ @@\Z!/ @ @ @ Nzȩ @ @ @Fzz y!@ @ @ @ p(GN @ @ @ 5(ףc @ @ @ @@8r* @ @ @ @C^@c& IDAT @ @ @S! @ @ @ D&0Bla@DUГo\>߾ݓ( @ @ ^M"|I .rOg*4ANޛܓ( @ @ ^M"n'i @ @ @ Foh) @ @ @n'iRVzXv!;Vgj@oW׳( @ @ ^=$ÿo,Sh  To>w?D8Xߪjuv @ @ @ \wϐ jG-}t^eD&Ф[Ϸw#i @ @ @yO5i`e's#1X @ @ @ \wϐ zͽ[:Eh>Ʉ@ @ @ @@u]b@ RJBu'i @ @ @rQn>  ꪆ%ޛA"@ kKʷlOjYkN짺O` @ @ @ PWKxiߞJ%]؀ @ @ @  %{GM4߻ju" @ @ @ p@~A*@ ]YfRt6 @ @ @$r=T@0w-:~5հMl@ @ @ N(/HD%4e52-6Hg @ @ @ |~>@ ]Kk %gkm6 @ V][AFW'+i'BbuWN  @ PI\$M3!` ]›.KV0NcuZSG4r@ ڷO}sLڳW8qB(W'OFf͚jժQ:gMs[&{'*@|uf_22*UZTAAmմI:Y3&&HB@ @@\_  qkju&ZaV7hDl4i?;*4T?GM8\e~l%>ݺVg7U9V^3V9Nai/Pmٶ]}R݊ѣGICQQmVOϞC{]-_^'4_Fٹɐ#$7 "sQWi*G9"e{שM[gq*T5VZ.e{OJd @ JGzr MMnIU-L:vAפHQ^{>WN#Ie2ܤwwհIe@vu'%۫VkYHH" %CcdmԾݣ{`zSD癐P_R xMs@RMybjf=?;x(Y* [~CNe P"oRa+!`6 ?Z}CA``Dd퍅Z+Qwh]e\ <5KP L?QϘtF2iI7ȹe6Çb]{`"ݶgKߨ~dϿ27[rWE~lyI(NFۜL836 @ @!r=<}$@A~dBVWPm_*]Sf 2aR:٪mԆ껕{,ǕGʺ2}ን}őZEvʲF9)^GIs{tVue<2+rJJS"UxؒY8q"컢`oӲ¶Y& N"o׵}C%Iq?eS XgȽTwI^+#\OFU^Wy~?Y!zX7'Jzf"lC @Kzt! ȚuΪsg\gluת@}{D+y5U^'ҥnZ庬ܺyթ+li Z]şȑ#Z9ΙZL13<0s"RNꐉ17&>bK!&GP>o5ͳYBׂZugźV{cciiv-ORvb [%JlepHYa5 *_do2ABxD܁2P @ @ \wϐ <" ?=W6Hn}zK։}Ќ3*2xSC-ϳ)3>}7m7J=wѣG=K+׉EI#Zϋ]uRv*wZNw>5^ja dmk;2Zd4N&\邸k-߂Lf"Ǝ{(mc2 N&դ*Ux\ds(KJ|!r~L4i#[;8@ @@ \}  U^~<4Ov.(o[5/nF>ش+tR?Q:TVгV] *}ͺ :-@B 9!ŝkECzA( uZlA_b -ZיN_7mR\9"V邜bAM&m윷K۝;t #3$SqQi)[ @ KrHI"u3c-W$)m8L,bZ݆|E_!G]GA.^;!7;m+Bd}le}|xuZHB밫XsWUU[:|U^h9V7*G.* :&\SitU'v'iʳz 20@ @l\l=N{!8s.mz=4Ft@UY˓⯚2:27D"$f,OK4(l\3^.k.J#3*En']JcJ! ꏓ&'5$); WKgLIm4XvzE @ r=y$5xޫi"+#$ vxФ(ߋ/E]eʘTbyHN@~r{LC{GZ-_Vz{C@G.(d=YOڎ0+J[[$tR+ٵ/vumע}umuLw߹Ӭ @ @ \qP=  Y/̪$n;xd`Ze|kQ"**߸cj[=W@[v#n>شRQ~EڻGwwbW_)0$C@x9D>BΩj-WkC%uq ?ڹS5%m[^Ue21h]Bv@ @rAz.S' Y+݀'L}C$KE9/k)dRŇ^o7VplrI%֚Q*q /]6*Jb]OY\EGjZ\^h:QuLZkF=/Օw|-zO9e~6ڳm}&&C @ EZH DeS{d.Kn3JMte({Ӆ5j>qV.{76#{v= Ӹ,R-rO嵜ڪQ#nմLh:*պa!̊[Qޖ4n‰'d53Wa( @ \@Tzס}Tωhcҟ{%IQ9q|V+Zx}{й7.#e&sl B~yVUv$+26?O{R[nDžԹQJgЩ};5f`dRY֍>u#GCDAz^P~3/U3V$ @ @w(}GL@ TW<:V5uvA&kwv2e..V%]2ew|lYsFQ zړt. 9،o&E2p2vz[MJD{t|.#^Aʶֺvw ׫mȘOmΖ{:%@ @Ez i! ι)Z݆R?qڣۣ%62dC7?ڽn:Xzq[ň+=:Nw*ɣDVJWȣV)9soD$5# gz:ݡq\Բ|ѣGӶ7,"*'{_,.,.kYnQroH" @ @@^;C w+KOWI~ؠ};_Ovݼn߆y USFACuMCi!_ThXQ]ގ*%S! O8iꎼf͚W A'AOf{3s^V#oS( @ @D~Tr;roFĮV=꿇R-ʼ~]PT[5,)V%TZ5QS߷^?x{_AW^>*~H޻/.( .뿟4~o4@ @FGI"usOV =Lxftiկ.>lug;gkْDxyLZO%~:Kc^zJTj]ZP$| L@IjڅoMjk @ &r=A / siK5xޫ퓷I*$gY=AU25X_r59U2o󺱙w_Ku#TZ b諒ն;%?~<-7צ]V8R9 ]m ?畹zjLqL @ $r=?VA o xXP~s,Wmطg$6ʢ^,E1glX]"dvPg6-gmo޴VzC#0g곃₋{讞euIpD~q`wL @ !Z3/?w뷫kxc/5PsxB[Z(ٗwOj*(]!TF5㳵MVْp\+4s(ն +U -ɶA\_Խbe qV2Q@ @@%r=-@X)hj],eyf7SZw[;* Mwg/T7Js(@@mw`;- X~T];ϴ& g JըQYfS.qԮ}LlB @ P\LM[!qKd0/̎[g#ZqQ~LeĘ Kف@e$ .%|=+#&,[n*_abqJ@YY {ɭoruߨkzR@ @ -(ף_H JE@1/=K^3Gl߃Õi$Q+ 9_p'@?X}i/P3[B`kYv2@"7ֱqa77E$d?NuV" @ @*땣i%"GI:r] \;6 ACUɭwbiʺϰdl?lD]b. pnP_; hX@oc)kŏ37 @ @@ \!!*SjX]SvvA,E㕸V7k˺FطƦ/";|xh\Vʇ@6:.+l@qvjժi! ro^n]u-臉n&~en"? @ @ r=lRݭNE*5ˍ }sqk֛zq/ߞ17^ܡ, 9yٖ̅jkl%YX7m@~cJܫd{j.t5qA7 @ @S On]f<Īq mq/;SeJC*'J@e+%G9k:rMe}M@&<z6s{it-{q !@ @'r=}4Dqo86ujvqr|u6H*3|A;'tY5W>w\ӟ~Ɩe૯Rl-_>v,|B! 8Qϙ1jן‘7 SndWA\J$IWQ[;UG5_N@ @ ry!* jjaNk7+J]{ݭ^C b *Gd]Ys@C_&j2!k @ < r=:&@ 귫n5|Eɳa]}]C@fS&<<1=b]::%k @fba.V^.n8ir2\ @ DngH #ڴ1ۣiɖyMeO~lɵ.^}_~Zf,,,TFܬ*1k$ G뇝k^u uI%Q 9͚Iyܳ2W}k7^Sv2 / @ @D @jxPO~ | <0\፫TAI-^kԶ;M179=9ѿz}.me  %LZ|Z]i8RاNZ2l䘱/%k @ @/@еZ罪hwuiT^Ş)O;wF QUۭ_uﮆ %]h 1Q"_T,ȸ|ջ.Nbo׶2)O=S<4gޡ@ @@Xs=XV3(qUש$-ޭoÁف!PTTfNy,:ց0kzYeA!! ߎi!ˉqmnZ:ƏaذIe|m@ 2pv&D"C%QT{`.uߨըF(6`wK @ >xR͍7b! !ύW\;V:FVۙE{AQmeXq(_@ ۷W.aXn;4Ĵ3UbڢOSW`J"M@,Rϗ J=Ua:AN @ #;~hs(8k8'aIqR/Ng@AAmխcG[#hjPp3 N 4mRKˬ ^|Qd["fzد VMxm1 @ @ X* T1aLUG[ff-O$w ( @Wu,ZoT]WgM >Y}X-9-f.&/7K) G]j+s%a3N?]Mw8q%7ajeJ  @  A o Vrj]n3CV_*IAC2>nFoj߮n|p6 F4LZƖK~Sbd(**ti,]{:F@ B:E?if?+fzZӬ d@ @I@^cߩ=K^bG*Y7M(hz>wSy! ֞ RJ8q"b!" s! 35turI5uLWe @  \/Ci|{;Tju%}pb9$_b@Z ؀\v3W\'PXPҠ$ ^(طƞS+׮M)]@ @BzXz9 P / v7(ҭSR+T=t'|#.Oc_ʦP_n)ӟhѼ˜  )g7$%d; ko,: @ -y۵4  e6 tN*GINv ۷q͗<_;wvE dmvURyyYҒ;M8s$@ dd;(^9qSz}׾} @ \-%CiA5$KEGtQbm?566q~dlѯR&rJ` Cu,Z{{y9qm @ |ؾc1d @ @?(cK@FR6V\2GVPohRvI*>qUbF +b߮wI5 wI}r ~FFIEٸ]>C-8[IS{Ѷe>d#0ËK| ,M9MkZIڷO5__+!X*]W<&  @ @"[xN@ ŽfGCN J/wDÒ*0;i_wxФ,6IA4$~ڥ=z42];c2\V'$m\8 `Mo-M:hz}ێI؁ @ @N \wJ|-^ĥIX3Tמo&FC;wxPuΥ-~m%[t5,)*ʅ@( x(8?L(dg!*Džݴ(ðvY2ߓRj9 ;HC@&ȤshXy7]~+l4m#BD@ @@ \t!<M@\s]I_tIIu5wsr{>cnS%tAzDXWKoT -Cb}#n5AjSgԯ,9duպڮmKh%o- H+I;Ga:iC$ @ @#r=wyO@VǃM\.h^3'R-ͿȵfWN+|#ǫ.[V}v FըwϘt^ZHe]#oi֭j/j c/J=Izv \;$**ldi 1R;!@ @.\w5Yۻz[)O~uE>yFƦTW{WN*Kw]RW;Ia˓ V3񡉏h!>n;:r?oHZº]!4_X)U+M>شl}So6-.nJ@ @@V(׳"" @](u({tK<Ӵn17Qo妺t e+}?_p uIyADB  VW<;uv䇉NQb ?5h,5}@ ?ުh^PP;%UϞ%?[.Y,{˒ @ \PN9Q֊wqIY ['7qw"G4m1ꩂ]Ei.';NO0>_DǻcB=mQsH*eTw[7P V]O v,N~Ls[̔c @ Z3V.IzJCrj:?߾=i_wGf?HҺDn`sA3t₼e.PdG`QS˺˿0Kk(sin֫6YVVkDAv`v& @ @\wǏ@ VFqLN&’.r]mx|k++}N x${Z2TjeyM`' )ӟʩɓ2 I (L7M|R&֪@r&uyШ~tkDKJH]{V2 I6Vt @ @ Z7`M%fZ5 _ڛd'%f,;՝.LϘ_eõόtoqfM~!D _O2eQK!Q5x.S?q*S_:YoF+yrhX~CN%xIt&Ȅ)xT3iاF7wߑq @ tb@O\+gxV|~=Uѣ<+IAjt-c5nήV7<w/;XBxPdCwaU xnkqf>2S%8`(;oڸ'(HT;BKL2m5~9vشCE-{yiҙ#y&䂷Lpr^P[r~nU\^iu8)J*;G) @ @/$gR z74%ݮXlp'*Iu~h it#j4iۣߩM*޲qEX_tgl]$Q KJm;v"(.\;Q]kׯWQ^s&'J\(2-}4n̽j(t IDATXb]T9G{H~YK9ObÇ?Ho=o  æ۵[?*Fb'}&q%{ĸ2((]+tr?S܃ڷAs O @ @ P!P]]%0/VfEN.75˴E3~ɶڕP{U,V^%(NRr ҧgO%: s^Zqx -\'FvhUXXnu꺯*6%I+_;Aڨk*˦[H4,QʵkmMF0uPn/yk\~/ut{ ;&ut\"^m2oW.~5n%% @ @'r=}pMrrzUVf=PmHu+k{2Q u=zdoe!kkmS(e(ۿKWP|Ɏaj=WS:{~l |_d$ӞԪC&/L 6CX!;&usVdu1אAur/2K{D-d/'Kʔ14ֳazXڿb?6f.##njU2 N%JdQ$'  @ @! o !  %sCVZn=quJ}?'--Nkվ Nu@R\;d^xy%O划m"}k㢢"5u׬DR~pͶ!Vr»MVUY**tJlna?˘]52nFɵqƂuP,KڶVF\NaM#,󲒉:ks{Dun֪mVy'ʴ5oPkoj]kü-(زlG'jmqu nuּIur|}lٶ1CC&! Fbj㇛cfFŪi"׽׬ɶI"6cM.|$?~\޻OrN7^{ˮyvU{h={ڜ;o SU; @ @A4xEO庸yW.W}TN*C`pެdRD\ '}6O*Ei45fYz NJ],kWRzdi?y0c7n(J'OV% Ͳ!J*UW=KBnPe(]jYuΌO0m;v> QA ,^ ^{caNU/ufp +ߍﺝhbZԸ1fKx8^2KBv%JPH b-z$:U & 'zCf>5OI VnʄiO(7r}%  @ @/R( * {\{+XѱiXut O~4Vﭺe%%.W26kLHg-fQ!QnzBWeqh[ڳ7aÁlV¨2(SM eq~74n}B2,y.3>:38b=(FA|N)׽T ɤtAAZˑ\^]TeYe` @ @>A"xNZ݆)v'pEp,?yw5)Oh(m<6K uyc~E~_E_[ / 5Xy[(_]قK(˚?wYz Y!? 3@ @@\Ro!+\Z[KR.+ԁJcO}Uښe^|ϘeGIN|UbFd zJ6)VO/҆#gXq{f-"cVs @ @>ȪN;Mdv$Sv81#h0t"` GDj2JleDCTP@@BljP2QC8=.m6cb#~;{nۇTy_^&޴ZJqx}%wzۮ+7v*ݵ'ql# EM:<8\{z'Qw_Jxc嶂MwgXicNdtW6m @ @ @@ w+@ nw$>连~o²_ 5.=}tkso`N~GG?}DE:uS_}P/RϸohwuRUTע+Ǫm @ @ @@O$) ;;rqu w&tqW~Emv<-|ۚi=k9I >z?6i]Nh vl3g[ @ @ @zz_B \ SuY餅ߵd1X:/>ltgBÿZ޻kOxw9"tR}6})}+K @ @*.2JtG9z=퐎T;7`ԥG>,9SusP'Qᆋ @ @ E,9("3 뽯l<6MsKyjmN ӫXwvx!. @ @ @@׳D y\^ok,|-_T_Z-;~R=~ח @ @ a;;L"/𗣇Rvuwdq7sTP`WJc?L܈I{^Om+~qՓ{t {ӡa @ @ u]gee/0ώIϹl`=vvuk;6H9`E% UUF͘\Qk=Q lXp S#$_6Ɯy &|8|7-uU/ߐ֬mno?*8򃂓3gN+~w~LS`~/91/ ~O-2455lk ]V]᯾ gVUև @ @ @dɜ"a{ø1bP7K_]sm/UW6w/;wA_Tw sˌ<357]p9nb kSφ8{ۋÏ> NCw&H_ӭr:\ @ @ @ge%̓@x^s1{ڀp=^}`^Eg+.#oP=إˋ19S"ugwǔhɲ4C @ @ @ Kgi5ͅ@155x~'Vn[cMu_cR?6ʖ?ֳCç"'/T|A/]Kg/7H[SY{7|>⋾V @ @ @('rƁ3葰}{jBײ_9P|S>?τŸL8}`{)ewB RS!f (t]I>R(T?}ڹ}c&ںk"Y$!h{oGv>bذE#@ @ @Js,E dA (n /_D8K_ 'wj;6ƝZ[n3cm7|[}ȋ hӹ7~9c1ue g :sHv<*t=pk`=v{Rs~|ϯ @ @ @sW@z@;g֞ys #S,K^ޏv>ZX> G$;)k%s gn1=6<>0? @ @ @Ys= hJ9d_p Sw+Ol9|53V*m; Z;qm?:B{^۳_~mǐ ݱV/I_.n`=K?2>lPrX8c @ @ @Rs=uR ~|x_ߵdaxGGrGTO/Ti/ci/T+Ms ;nnK @ @dI@p=Ki.J8:wyGhlxs֔ЋU I`}91p? @ @ @Pp̆L@ _2&Āzuyݎo-P,gВe9l• @ @ @ \V"P\~¸cs {܍,r\$ ϙPcGKܵ.| @ @ @ c[P!P W*1w wޞN}$a Zn @ @ @@2dNJȬk>fn1w'wOd{ż%IV9fFÆk @ @ @ gmE͇@cjjBL}~' O\;7׻?7L\;'L @ @ ,9߹9o IF]̹6\fmc-XƍVU[K @ @ @@׳@18:y[I`Kmb`=oj/^YY&O @ @ @2# 4)!K]I}OnxpcSkӳm3~{nz&@ @ @tz7@9 `i b[oߟu`?ޮbοkպ'V'?gР[ @ @ @ g~M@r,p7 Vhjj gi7+3cCU>_xPkvD{לy? y`A-N/ @ @ Q?+s3-:(qz"̨VtW6Ç 5y7 |n\bV,+p^8_v @ @ 5HA YS;BMyޅmKd0ΙUtͻp:&@ @ @z@X_L1IDATy npv:yanL|yjmxc嶢HOjiẍkB4o/\~߃- ]a+= @ @ @ _b$y? ;vmω}„+l kgmWV7._~1+BSSSѲ19EmH @ @ @@3@xi⟯R|uwͳ7Se g.-:영`SO=_=6$^S @ @ @8\?t tV{ jI>h, /^>nCѲ Q`sB%葰E뉘"@ @ @3lM@c)˜];C}ENd0 %U @ @8N׏Ӆ7m(%y0uDwomMb&>:\vEꥤX'cR @ @ @@J)Aj(VI<6pΠAE}ecxnnx-{</* 9t?ؿ?7 @ @ @@0 P@<{9qIb߳~UtLba cZuO=]G 0bذD}(D @ @ *-Yw(݊0nZ8%]|+bvZx{bE{RvG|8nPUYYM1s)*K @ @ȺzWuO <[rc/naJz, /^>nC\hsBfGθr}A(@ @ @8׏7])><ђR񕲻:b;K;o;뤪aYWOnX뻸[}ö׶-{tR>Z8{ @ @ @i @ml _P9}Nƍ&O*{.Rv,<477'h+kL cjj%@ @ @耀@S/zC;߹9 *{^L34WlO8{j v1%B @ @ @X@p8^|S'=+][[?[RY~pVkh銒wuy0cݽ#@ @ @dV@p=KkbSil {~Nn+sus{~h(w_TwU>sv?2lrGH  @ @ @\ORK T1x|-# K橵ፕBUCN W,>h~Hhhh(Z?{ @ @ @.^_Zh8tPɽ|Ua] ÇJ$G! @ @ @K7S>ؿ?aw^a9-] N oo)bm{Se g.:Y4xhɲPcG$7aFݴDIS @ @ @ z~O fU 6o.y{L?n0yUFk?$*ߑBCƟF/6hZ>*pQhnn.ZÆ Dg]= @ @ @@iy)M@  455Ka꤉vY*lka@)#إiְ|]>`"@ @ @H, JA['Vmm/0mA=oox;KI~RU0uᬫ'#%BE] V;7UUGrO @ @ M:.>,Yxhnn.W\&O*Q3WnJTʵ+^<:rÔDcR @ @ @׻V(ٝ}W4{_n7Mƅ ͮǗ>@"@ @ @蔀zT&@:sfyIaLMM!JB'ĵsÀQmpoKh٣ ح~{ @ @ @@ % ]=pؽ{w5Cy0uD7O oGՐu$Ja aSOC4pSaİa%S @ @ @׻Xt@Gwr}U_Y[t/: @ @ @R\OTt@L %w; W\/_aCsss٭^  @ @ @@Y r XɰiSWWW+QBc[ʰy˅^|>hРoT @ @ @ UT95F@O ]_JF)˜uw% Na @ @ @TS ѝÆ D;7lz!{wۭ^B @ @ Pzfj ڽ;,Z] u9-)]{᰻R;~ر^J @ @ @t^@pZ @Lb |ö׶<±0%d㡹9y0k0XQ  @ @ @T@pLưHO Zh)ܫ߹5(TLK @ @ @% ]!@G:SRO/ߣ:'@ @ @(Y@pd2=6m\.Rk= ^ں5◿ 3 Go @ @ @i % @ @ @Ȭ'2;3#@ @ @ @)  @ @ @Ȯzv @ @ @ @ % 5C @ @ @\ښ @ @ @$ f @ @ @ @ ][3#@ @ @ @S  @ @ @dW@p=kkf @ @ @ zJ!@ @ @ @ gwm͌ @ @ @R\O R3 @ @ @ ]쮭 @ @ @ @@J)Aj @ @ @+ ݵ53 @ @ @HI@p=%H @ @ @ @@v׳fF @ @ @)  @ @ @Ȯzv @ @ @ @ % 5C @ @ @\ښ @ @ @$ f @ @ @ @ ][3#@ @ @ @S  @ @ @dW@p=kkf @ @ @ zJ!@ @ @ @ gwm͌ @ @ @R\O R3 @ @ @ ]쮭 @ @ @ @@J)Aj @ @ @+ ݵ53 @ @ @HI@p=%H @ @ @ @@v׳fF @ @ @)  @ @ @Ȯzv @ @ @ @ % 5C @ @ @\ښ @ @ @$ f @ @ @ @ ][3#@ @ @ @S  @ @ @dW@p=kkf @ @ @ zJ!@ @ @ @ gwm͌ @ @ @R\O R3 @ @ @ ]쮭 @ @ @ @@J)Aj @ @ @+ ݵ53 @ @ @HI@p=%H @ @ @ @@v׳fF @ @ @)  @ @ @Ȯzv @ @ @ @ % 5C @ @ @\ښ @ @ @$ f @ @ @ @ ][3#@ @ @ @S  @ @ @dW@p=kkf @ @ @ zJ!@ @ @ @ gwm͌ @ @ @R\O R3 @ @ @ ]쮭 @ @ @ @@J)Aj @ @ @+ ݵ53 @ @ @HI@p=%H @ @ @ @@v׳fF @ @ @)  @ @ @Ȯzv @ @ @ @ % 5C @ @ @\ښ @ @ @$ f @ @ @ @ ][3#@ @ @ @S  @ @ @dW@p=kkf @ @ @ zJ!@ @ @ @ gwm͌ @ @ @R\O R3 @ @ @ ]쮭 @ @ @ @@J)Aj @ @ @+ ݵ53 @ @ @HI@p=%H @ @ @ @@v?o7`IENDB`n:F-\E/׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYsgR IDATxA Avq[;3 @ @ @ @ @ @ @ @(BH  @ @ @ @ @ @ @ @|cz@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ x@ IDAT@ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @y IDAT 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @ @ @ @ @ @ #`l#jA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @@FFՂ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @̫%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @cW J @ @ @ @ @ @ @ `lC @ @ @ @ @ @ @ @262 @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @dmd^-( @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ȼZP @ @ @ @ @ @ @ @c:@ @ @ @ @ @ @ @ 0y @ @ @ @ @ @ @ @6t @ @ @e oM- @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ N IDAT@ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ݕeD IDAT @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @ pZP @ @ @ @ @ @ @ @g6@ @ @ @ @ @ @ @b oM-666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @A IDAT @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @X IDAT @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @ @ @ @ @ l @ @ @ @ @ @ @ @666U J @ @ @s& @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @U' IDAT @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ l IDAT@ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @&> IDAT @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @FƦjA  @ @ @ @ @ @ @ @s0 F76l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @| IDAT @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @03 IDAT @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @`# yC  @ @ @ @ @ @ @ @6l @ @ @ @ v50;sRXk܅EX," 7b10d}!ɘywso!@ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ IDAT @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @: IDAT @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @T-( @ @ @ @ @ @ @ @ 7@ @ @ @ @ @ @ @ 0ZP @ @ @ @ @ @ @ @cn @ @ @ @ @ @ @ @ #`l#S @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @@FFjA  @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @LՂ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @c%@ @ @ @ @ @ @ @0 @ @ @ @ @ @ @ @262U J @ @ @ @ @ @ @ `l  @ @ @ @ @ @ @ @dmd @ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @d J @ @ @ @ @ @8Rju:o<^ݿşf^އ[-&xosDxq5]<7ϟm?7ۼf_?u#0=3xޥwrLOⱙ?{1xs7z/nMv?p[8xdvo% 8 g @ @ @ @}RFAK@5v+w>gf͚9Y @u"/r*K{'O @ @ @ @ @ 0Hv9oJ1'X߀qܳ;eN<=B#756<M~W^ٛX[m @ @ @ @ @ @l@@5_[n0v#@`F3"pd^P}3{m FMuSz{&Fz c`  @ @ @ @ @ @G`G۳}ֽ%3l5îߥ٭ X;tڳ߬k]-B{S*.J1&H5H<*S«OhV JߪV^iw1.A,& @ @F IDAT @ @ @ @ @` |7'tI(vjoiۼyG)K_N~/VlSC~sNn՗1Yu~*sh4'^؎kݼhv!@jJ @ @ @ @ @ @̮Q\{,\`߃Ws@ewXhcK״V+ qSW5ٸNfIT`uz^N @ @ @ @ @ @``έݎG]~l80q_H|"}Nv}Ǥg[ܨ~WJޒa]k7O俞c}lDީ{m?K|q8K~HG%kUK|=Q1Ovɔq_qlWJEگͣwLs8+Q>r=lʹ)fE3}8ݛuɿ+g1ߚߋCa]=X}.~WԵޕw<%ʽ>͒kbF]s1VMX]6L9lO:s.\N|*qBNkϥs͊v/CΡwq+%kon;')Ʃ&N#Cݼ- @yXi ? @ @ @ @ @ @@g#S.>V۰X>qecaef̲ϛu_3}n/_ffj1yb1M9f:)7ICRnFg4ٌU>2D|:*]#qG.5x{kgO%Kgk|}HFqrXŷ|ļT:5/|Zrm9ޭӧ,3Lz׌{AHB6߲036u;nЬKҧm2,QKI3ޏKc)Mozo6IE= [fk ysbfC&8i7`>9ǩ=w9? 5ؖT٪[,fM)XqivϮv~f%0fN~/Zfd1{R_WP~_yҶ*̯gsOڟ*u[=wa{X]6L9zd~ߚacyT^5KbfŸ{jBm9^W*nWUwvώѭ-ŌdڶۼoKqߺL$P @ @ @ @ @ @LIGKʇ:3[ue!Ň+R~[JTm̜ȎeQ mq_N¨;CL^>}A"}۲F_&F-QE!N7.H9r/'9kߛ3'I8*1/d}6lh{ˌDَJ9߫%^|Yf|]>^IXj7́ߐ}&zyZ$}'.YߋZgX|I2{UD1*VS,,3sٲ`I9*6tfW"KG$j5ޒ{2ڽs]gbv[Ja z֐ѡ  >KA"@ @ @ @ @ @ 0JUi(R8,Wg;CaeYúٖITMÆ GW&a(1Nj:s{Zs}$qZu7שKk6UK|JC3Ӄ2+cd3wCm{Rϟ/A[0{+QحVGqX{Un={ߗvV)?]ŢDaK,*ת<y>|~/9mxloR'-{yU;{geoPtc=?(PV  @ @ @ @ @ @~t(aY{vevN6ʼݣ/Mh]Sv%nEvzDX YTx~Hk]Q97L )4cBo KaD; $}SKUސKxYQSD׿rn^>]2kՃEt#NS'Zbߏ#Ü eksy_'jŲ( xtDI嚴v|/lgs7R?M\?w] K{jXX!  v\wg @ @ @ @ @ @(3݇)|$|]%ɜ(S}˂ [RQJٖ1v_Fof;u%[E(~ɗ.کe-)$I<Қ'kΔE+'71.N卺!q'KarZ:'۷̹,V|ćZT<:ƄO˹dF[ר{aCu%{Vyp-_Ig\.E,.2ةݨý8}dj>3sY|DyN[-8ir2|9lw-~x*ÅhSqlW ;vֽИ_XwXY+S(9(r֠\6?L߲ Kۨ,\L^BbYe7#@ظ  @ @ @ @ @ @t-pD>l.e}&rM/~heSwVE)Ue;]r࿝ЮH|dԌFEkY0ʇgdw2evjbUڜS-^^ٔx_⥉%f58jecZT*_[ih<'+I=Ã=H\R홉sI__ʼn\Kj#r:O7'ʹ/yqwrZ6t\1*WwR5{wqza,u'0+_jקwXe3  0ۘ @ @ @ @ @ @U_DC;kUw͇ Gi#8L-8NҬ9͛uaRPVjZ{j9RvJݲUϝ#睾X׬ ~TnXU3k%(x8f5}.f4'~9{Øig8s-b1q5s ^>]],xn~RM:056-U,oC9r:߯I4Tř&>F(Ɖ'P[ͪuw&c @`= Xlc=]MB @ @ @ @ @^Qæ'i+{;SE+>Xqiflڪ{X\iϗ[ukK,JbU{b /VOFI Y!}"(ۓ.;oUcr咽8Vb1sVŊ|oS=S=d%߅u =~jGUj>w]c. '.z弊+@&"oOwRi|R&l;5sZ9\߆.T\fRRv彰*,cVg%IEIeYv>nq]?a̵Jr @ @ @ @ @ @94y۩!QN)/~$3/Z}ʂhuY-dF; ?Է4b4lv~eyIT^7~5llmk}[],nZ*cL?r̵Zn N1}8&wf'n821j?I۴r~O#潹R߬ݣN S}ﶃI{k$X**VKY8K5W @ @ @ @ @ @UڇVfԵ?S>Լڠݥ߱t G,z8Кs)SURyJ]7VVyW98Re3}нܽpK63xbɓ\i>w-؇{pHwpnco\:S%8,}LZ{1oee{ⷡpʙ_R׮ZhWtQ0wqœ$ʢi OL+[i* @  + @ @ @ @ @ @@9~. E3i՗u:{Xꇕ WU}ֱUwAܷ) 푏skfWqjiJ7]*3Yji>w}?b+V9}8.oS''BK^[NlsJP˞.{ⷡ ^.}s_eZ{a*9#*'~Vޞxr↉%>hiƴ1.Q'V&܋eM @ @ @ @ @ }YU{H>,*}Zme϶)N__w9]e}6}NZj5h;5"u<>hlI1o$Ͻđ~V&3cf_~ƘV]ߪtiaB4i? .QqW!s|qQ8/ժU, bުX9\߆֩nWqS-%F{tZ}Mq/L]|PN{&j4Ɏ)03FxC7=1gW=]4mnrr]K*CO*Ry7~2r_g~O^gcp~*+ʼ˻=۵SwѮB1w+JoZm׺>?}1/̚?fD̗ @ @ @ @ @ @`jǦ:yI!*uͪF_?ߵ!cSZuAe])q>]W2S-d1qPBWi˔֪ *n>m_17'n<lGoi)n@p>ʜV\+bʳcⅩxblg]KcFFR\'&vvCO vzm"|6P!٦lpgH-q_ *'Z{wO+'8yS7>x3ㄦOq` @ @ @ @ @ @3 pGxlK*{"omW6YD'é?Uަq.8?KCC7|[>CSMKYq?q~ڿmYlbRS8g ͹|*rv)ӳ='|N+[`gxԛ߀^{o3R'b4)Mt6!r;y4\|\XOF{}~T7pLq5k& rO6eR(ܔhSevW^]\kRxKŴ,tāZڣV9Ku}f\  W2D @ @ @ @ @ @`@Yb|zD0uA]ssQ Ͷv,L1*]wjl՗kiT.$QkRS3nYvM(KEOo-qR?b?+=ާ߀7Gt.YeHpSGbSaӡwIs?#)ses?wo-߆IbEޒǶHyy*-VƽC7g?k&{xⓉ`́%tvŌp(i @u0  @ @ @ @ @ @@_>=61cGl?m7b]aZ7M,5y>:ab}:Sa&xq+{hΞ\> } -/Om(}t];uy{ga@lJ{a:uDrR){;Q>mqABaZ緉geq8VY _GY9%DYH} d(&+m'ggp=7`ܫy'H]ٯ~߷.ytvt8d8jnuM<%Ǽ~_/sġ{:2}UW #aZ T1qh(֟I,Q5y^bs^Hgɺ ={<]NʐK[Ʈ7wJodVS~Dn&9M?3 gB~{2 @ @ @ @E@#g IDAT @ @XKI9+[sx_?yа.}vMk'8)=MKxFR+cNkt> Q2&q.vRK~`b2f;i`R>.Q\|lc`lo>e}3^s-3}%>lg.}u.Yk2~Vꉲ`Sy/W{lW2<9{圎 Z .ojM\ƽМL.8o'J,!ViZF՟$ @ @ @ @ @ @c >d:41VF#\ͷQz2f"_D/֓|%(!@?i]q)j\WsYg#/+b\ٔ8mϓ(TKO7)QyWfs_͸g/ @` `  @ @ @ @ @ @X '.G.qt*ޟN|z+}}_}t]uxQs';i'L @ @ @ @ @ S{Vi䣭3{ٞ("3P`ZӲ L>.iO7W~'*qNO%ޝ[.V"(Y!@L Xlc. @ @ @ @ @ @ @ @L"qK @ @ @ @ @ @ @ @`,1KW\  @ @ @ @ @ @ @ @&D|v&@ @ @ @ @ @ @ @%m2W @ @ @ @ @ @ @ @,1  @ @ @ @ @ @ @ @fIbt̕ @ @ @ @ @ @ @ @`"mLgg @ @ @ @ @ @ @ @Y,]-s%@ @ @ @ @ @ @ @Hbٙ @ @ @ @ @ @ @ @`,1KW\  @ @ @ @ @ @ @ @&D|v&@ @ @ @ @ @ @ @%m2W @ @ @ @ @ @ @ @,1  @ @ @ @ @ @ @ @fIbt̕ @ @ @ @ @ @ @ @`"mLgg @ @ @ @ @ @ @ @Y,]-s%@ @ @ @ @ @ @ @Hbٙ @ @ @ @ @ @ @ @`,1KW\  @ @ @ @ @ @ @ @&D|v&@ @ @ @ @ @ @ @%m2W @ @ @ @ @ @ @ @,1  @ @ @ @ @ @ @ @fIbt̕ @ @ @ @ @ @ @ @`"mLgg @ @ @ @ @ @ @ @Yq&k @ @ @ @ @ 0e$7=#ћ7or+Js'H8e܋;Mc̱# @ @B`!8'A @ @ @ @ @+e'ؘ- OY:43):gʇd߶iY=J @ @ֵ6ur @ @ @ @ @-+.Jܤ俗(tF2?VԶԿ=h?7$ʘt| ̘jV} e @ @C`UCY @ @ @ @ @ @`~ޔS.qqI\1 _80'^ Q5nɍOŸEޒ.qrN\9c힉$6'Jk-Ƙ# @ @9XX9  @ @ @ @ @ @),b6}+6l{~Q^̦Sk?_0Ȥߣ}sbA՝ӃVi @ @+suN @ @ @ @ @ 3~=V,Tܨ<_fQ0\h?FiHٔ6Ls;1 @ @ 0ۘk  @ @ @ @ @s,`C`xoQeԨܿof(|=c~QeQkFyƘñm  @ @CmEw @ @ @ @ @̷`a[Dac٥gofo(|f3oGƝ=qcV @ @yƼ\iI @ @ @ @ @@AÉ#n4޺pr#%P˸yR/4ooƘ  @ @Omuw @ @ @ @ @[ ^ iF~~2 ٞ/=xFd1f @ @̛vΗ @ @ @ @ @"{_$͛7o|<^el7ʣg4mKvc1YxK2c}u#@ @ 0-3;MkYbp̑ @ @ @ @ @$6Cn$JڜxSOJЪe5 1pl[ @ @O`3&@ @ @ @ @ @@xq7JݔC>_2Ϲ_&%}ѾU4  @ @̍ssN @ @ @ @ @Y;i峽~]L|#d}6g)q}&g41W4  @ @XXI @ @ @ @ @ @`r,fr &p0Bqu6`Ƙ]X @ @W`cff @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mtS IDATi4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @ @ @ @ @豀6z|qL @ @ @ @ @ @ @ @[mti4 @ @ @ @ @ @ @ @ Xl @ @ @ @ @ @ @ @FF#@ @ @ @޽U_ɓ< @ @ @ @ 0m @ @ @ @ @ @ @ @i7 @ @ @ @ @ @ @ @1, lc F @ @ @ @ @ @ @ ppm\O @ @ @ @ @ @ @ @a1l @ @ @ @ @FH ˲VzZfި;Z<~ثNs{9ˑ#z {Q.苳 @ @   @ @ @ @ @:C +UGE٭1ho0<VDc^6EcudOzMgckK @ @5 @ @ @ @ @ ЙJqDwUx(EmjS2꫱nSڋֹЈ*ml>O7K @ @NL @ @ @ @ @ p |$^ <,NEpQϋ*ߊꎺ(ms~y(ofя㎨?5/7F*u]  @ @xq @ @ @ @ @ @3"xWx_G_c Zחowb|Rt{ b"p@F,.-/=ًD{cVƽGգ^PE{ySrע6FuFjQڨG5NYj &h5f19ޡkZń 6<&uWԃo  @ @)? IDATa?ϺwX6Gf{q=* @ @ @ @ @@qoDW݌3w&.*w7cwQOj i1V?ŜwFV6}m_X^~v իWl6^… oٟ @ @ > @ @ @ @ @889^ Q堍ZQrE uBm1='q&y]Z[jK5ݾ @ @ 96:[{S @ @ @ @ @ J B0^o҂yqYG36o{}Lւ[ԟTj94akܧ$@ @ @j^ @ @ @ @ @J~qNt["bCilPq~9l#.eҴ=SJ#ښ @ @H6K@ @ @ @ @ @;"h\5ER]26ltGMO.,1{m$ @ @t@Wg&@ @ @ @ @ @@lCQolGwJctEsvԽ3 @ @  @ @ @ @ @\ژorP6b QEfAo~holR{_g.Tjk @ @ @@؆ @ @ @ @ @ Щ~MK_"`~/F=?j0G9Ѹ[tKR{faq٥7ښ @ @ @ @ @ @ @txWh</6ZL)MR{f+M_-Zkg`"R[ @ @h H @ @ @ @ @ @@ Dh+UzQ(]w3m7f-RKJlDŝf4? 9-ꓱ߫c=}Q ,=ļKWEػ8Ek{B:5^o @ @ [R @ @ @ @ @tu/hLޘ!B/XQD}7Ʈ6GQŵqG4yu4Ύ:5pIh1ꮨD5;}s_L @ @3 @ @ @ @ @:GEGD35%꼨ƅ3#6!mp^՚wF$|h  @ @ PC@ @ @ @ @ @'ppq\_DݰD='?y;/ŜM8+w[bE1=/!@ @.J} =K` tE @ @ @ @ @c_ (N{-iq>1QO*5~#C:bM VӢfGø|w @ @#$P$l]˛kc[:36̧  @ @ @ @ @8*6[ڪoqAF @ @hlĂCy}WS|R=n|_EF^dq4#(P{ @ @ @ @ @ @ @ 0ZAYB ԘuqSkĮW(GӋcJ@Ƙ @ @ @ @ @ @ @Mrצ=ᨯf~rmا<%6&Ltؔ}nB@؆  @ @ @ @ @ @ @ @} 8Yo(6~)SR)61wnL17I( E|&@ @ @ @ @ @ @ @c]`oAGΚU0ir]z=uݘ0AX|6:{s @ @ @ @ @ @ @ OmYLyv̛8rqHO^GI@(- @ @ @ @ @ @ @{ cuMR_3}nč+O|b.pc,}6a8 @ @ @ @ @ @ @X`oA3>fgF35vUtvo4YVKslntM2cg?xg݊bl;%06 @ @ @ @ @ @ @ @(mdk>㏜5{̣)o5P~绮jz:_n|E!pcph>Cz+ @ @ @ @ @ @ @ p Y,~1R~æj&f_35vvu8+ϲ4yz7yF;@רM  @ @ @ @ @ @ @ @1'^S}Ǘox }j4ey$eӮvq.b=Vv߶鱇l/~ei Yrqop a# @ @ @ @ @ @ @ @`|򓟬}oI_\9Kw|Kjnftشxv>FQwo<_4ɵ?O~1Ug1nF @ @ @ @ @ @ @ƞ@Ѩ=?R~aOGFL0u)6R\JY ;ҶGiغYvF+|7m/ lc݁ @ @ @ @ @ @ @I"d[_ ψrc0ܘ2%:y'mۼc˖qѼ[O"\CFijwkw&@ @ @ @ @ @ @ @FI 3=imy3&3hnjJtIRkI=[kFoO¶VsOT9p##+ lcdݍ @ @ @ @ @ @ @yK_gqj{ՇoWt~䑧Sۛmq,oAFՌJ6/#) lc$݋ @ @ @ @ @ @ @S~ZmwO|k;v0hn4{">1xUEwmT|X p6R @ @ @ @ @ @ @ 0V.\ԗ7RʟS9"Kw|ZmS9pc֭ v˷~smlQQEFw+;TQB @ @ @ @ @ @ @ 0.X;y޼("1NtY+Kӧ~lLE>A9hѼm^^_1^k6A=1, Ǩ 5z7&@ @ @ @ @ @ @ @O`ޢeg4"d#~]eӦmwwwoGUގ7z EƎ"\㱨"pFSF8FU@ƨ9 @ @ @ @ @ @ @800,.S;eEƊgxG=ܞ>E0Ʈ+;NjzT;lc[ A{67D @ @ @ @ @ @ @ @`s.}^l^y/MȲtSKFQkFMۣ]T_Q̋)V;b(~񋘿aB ]zCY[e`*j֌O @ @ @ @ @ @ @-hѢgKYΎZx$^6+gժUT" lS$@ @ @ @ @ @ @ @1%hO0eRl)|٦Z-{i7tww?\aKt^ @ @ @ @ @ @ @FS`%OM= <>^)c#e,e>e7& lc}1K @ @ @ @ @ @ @R B6N{ R/PXsoK/*{XCmtޟ @ @ @ @ @ @ @U`ɒ%Oپ#??e Q-Z 5_6'p T! @ @ @ @ @ @ @ @ ,^x|Y?&|f)mMY)WXq;XA@aE  @ @ @ @ @ @ @ @,Zli7E*[eY-ڪVi=!@``a%@ @ @ @ @ @ @ @CXĞmKޒR>)U,2ܵr%_ekط}J @ @ @ @ @ @ @)0gٲ_Ͷ5,?7O}N,vD@LJ|¥]L3LAqmA @ @ @ @ @ @ @'lٲcn[򔦤G'KR׊u.zK!N @ @ @ @ @ @ @-tң46)ShdYWue.Y{a mTs @ @ @ @ @ @ @:L`Ƒ|wy:eYZk\|W=,#@m @ @ @ @ @ @ @ p m4:/6o;-޹/K5] EƝv" l0ڄ @ @ @ @ @ @ @5%K|nJ#hcz˲W_*{XCqp=F @ @ @ @ @ @ @OP& IDAT\`3{9yE̊,}rB=߯e a@% @ @ @ @ @ @ @?F1M[O>7ogYԕoXa1&@ @ @ @ @ @ @ @/hњ齽+R2J'γz|U2F@@  @ @ @ @ @ @ @=F1G3Oi~<)V#B6>U/_fſUXn #, lcݎ @ @ @ @ @ @ @FW`u#K8dYv]-e֭N=#@`m; @ @ @ @ @ @ @ @(̽)=”ϐe_ [XG ={w&@ @ @ @ @ @ @ @(B6|y3[R~L[f)R֕w_ꦪ{XG o  @ @ @ @ @ @ @ @`M"dүFFdY,Oׯf ,"@`L S @ @ @ @ @ @ @ @ \~oRZ*lTwoXs'@`;“ @ @ @ @ @ @ @ @46m}S3KK#`ڨvd?eڅqc "@`, _dz @ @ @ @ @ @ @ @~ w?|YlNUS6Su_v?& 0nmO  @ @ @ @ @ @ @ F[ސ7#d)5zJ֭r=,$@`7ʃ @ @ @ @ @ @ @ @@! 8'EF Q &nnl\_m6W @ @ @ @ @ @ @@k~ӿ|}邈xjՐ,ogz5~2 @ @ @ @ @ @ @ @h4M<=Fƭ-߰va_@ހ @ @ @ @ @ @ @@^ۗ/˲!26OE @ @ @ @ @ @ @ pd-yM3)ϬVY׭[#uZ6m @ @ @ @ @ @ @ 09agTE"dyllXS8Dmk @ @ @ @ @ @ @ @` d/:/ڨk)k̘1fM,#@q`G @ @ @ @ @ @ @,0wWy<5NYAe͜6B6*+ZHcmţ @ @ @ @ @ @ @;̗)fҝ9횳>> Q6:s{Y @ @ @ @ @ @ @K?kDƳ+?IR>j!-$б6:{q @ @ @ @ @ @ @܅K^ȟSYNӦ~> 6:{{ @ @ @ @ @ @ @ ^ڗR#7~lFFuE+ % lÿ  @ @ @ @ @ @ @ p[<6W},B6q9s{c%~) lZ @ @ @ @ @ @ @ p ,yQ_yQlVYZ.1c_www屮@@( @ @ @ @ @ @ @ @`h/~a_J/_Rvt<ɳ<gi' @ @ @ @ @ @ @t@l<!yGOZjƴ)Wtwwou(C @ @ @ @ @ @ @X`y0N+dB6g2 l,%@ @ @ @ @ @ @ @@ Ds[![ݳ,,ښ43gk}#@@aUԬ!@ @ @ @ @ @ @ @@ ̟z_Y-[;swwwo. l @ @ @ @ @ @ @8"dfj./ee)gG^v*c!h  @ @ @ @ @ @ @j-95O,=W˦[`F_@O@ @ @ @ @ @ @ @a_m^?ԫlm&MKka# @ @ @ @ @ @ @iKzy^w˳쯺Ҕkvl 0q8Ğ @ @ @ @ @ @ @ pK,y7TȲm$MYfMTv @1v'!@ @ @ @ @ @ @ @@eŋћ/gɄWj{-ˮhNlŊV"qacy< @ @ @ @ @ @ @K`޼g=KSA5w׊+]+_rƽq  @ @ @ @ @ @ @(0gmeo!˲)PO+V^!o`ơq<2 @ @ @ @ @@bI룞֪Yq7V}4=#<,&#z {Q.s77 @EOۺ8~>7iReTy,KؕVZzH?W5K6, @ @ @ @ @a(0.zsT폊[cKc}1XulGFD}66o΀s$@ @cT`Ʊͭ?OOuo8bʕ?56 @ @ @ @ @(\sD,Nqx(G5umjWF"vBOok|S\m ^.nƨ^W~hǞ{ @˖-;fE)ߖ4cg.^{a aʗ @ @ @ @ @GbI9h_EF_)2Nc @ @`"d#oN)$̽?e?__3dcݥ4W @- l-L @ @ @ @ @Ug/|T/*{!7*2~tR{_͛&R8{&@ @%x=}ٜ/fV|"dSXv) l#?&@ @ @ @ @ @@rcsd;4Rh>3jriR{_{KapY& @YF1Gs'+=Rٸ @mt @ @ @ @ @94v,8Ǐʝ}\RhǞnq`.lV__DuLkα֭;~]'@ @CK`ǎt?{gęU߮e_:e{f<~Ƭ*i;̙s'+  @ @ @ @ @ 0,~+4KAEsF#{n*]Vjس-}WG vy @ 0gƴueԌvcĮt)iBWK{zzneR:BF'}N @ @ @ @ @DƳbh{e*o_2`g[iqZmƆcJser v*GpM!@ @q,l;z^?N;l&MHğ=)v/  @ @ @ @ @ @`hgNJ룞PZ%;JvszrFix~S56{݁u/^z3[.\x`֘C @OhL}xַǓ/L)?d)}1b/׭^yK=#@ ػ+ @ @ @ @ @X89^ QǕF'Jrԩk[=< @ @! ̽)O6ybCޠ Kٗ{7U:ؿA @ @ @ @ @ ߨAKJ5'&l{ñgi{M @ p`Fc[ޖ򴨙ұqtdY!ջ76$ lcH\& @ @ @ @ @ @s :jBM{qeS9#&ǚm{\Rj?Rjس-t  @ @Z!lqkwص"K髩3dU. lcfV @GUt IDAT @ @ @ @ @..\vBilo]8&ڍy8w ] @ 0x/|?$B6fp[!7VXn  @ @ @ @ @] B6[7h<6SW.Ύ`6yvu=B @_hLܴi뛚YZU؈d?GuoXW3 @`m }  @ @ @ @ @ 0"hcb<槢^^zۣ}fmWg3>{mIǴ&>=_]QsSc @ @`W\qńy͝!SŔ @ ~cw @ @ @ @ @ @_)N5Q堍/ETo5h{Ql< .]n7c @ @`@"d? YjN`R=ްfeƈ1!< @ @ @ @ @FA`}ե^A=4acସ{[Ǟ @HhtmڴOy~yEٸŊ[XF(Ca  @ @ @ @ @ @` DFs?pP[D$=tʸ#~9{v&@ @;M7zNH"hґ-߰vu6FD@ƈ0  @ @ @ @ @Ǝ@]'z4ڗD==p;3)֯Fk|Y{B:5NñnC @-Pl|}}7/Sٸ5 \GzyaCyL @ @ @ @ @D^Ǘi21vvɭkDKŨ^uVq^j p=! @FQ{m”'U_{ @ @ d/:ӯW}ٸOf}#@% lcl}OC @ @ @ @ @ @ @]UҸo F @Pq(|E@ @ @ @ @ @ @ @C,X|f̗)=2ARg_-d76ͧ @ @ @ @ @ @ @?{egU x3IHBToTT*ZVVZTdrNN \& ֊jkojkV* {pd$|ke-ΰr]֤͒T6*]9Rx1dS0 @ @ @ @ @ @ @XlIQRyju#~$$@Tlc9&@ @ @ @ @ @ @ E|N*d_~|]$'?a>T_LmLg @ @ @ @ @ @ @+JGZI,z~WuL$@i! ƴxA @ @ @ @ @ @ @`z ,^YipzVՓo()tq8y 0$ۘ^i @ @ @ @ @ @ @LiHqF+F$8A"ƍ%plTU4W@n @ @ @ @ @ @ @Xls򜪛9(bys^﮺y 0$ۘ @ @ @ @ @ @ @Lj%˗? FJ;77}EvU\46E;& @ @ @ @ @ @ @$x'ԈϋD71Ο;*.btd] @ @ @ @ @ @ @X'=$ϯOsQo{{u#@l;߻S @ @ @ @ @ @ @8~bn)sJZ_0oez}gu#@l߿ @ @ @ @ @ @ @8˖~ K'K2cQo޸qَ˘Fl @ @ @ @ @ @ @&\`է6הTΊs6.9bKkF% ƽ8T @ @ @ @ @ @ @Hq`R^TJ 6ntfOdÆ ~%@mt @ @ @ @ @ @ @ 0nUif+˜\)FL^?[0oz~7adc@2 @ @ @ @ @ @ @"ɃiœK#FmQ{o9Dsloh @`$??  @ @ @ @ @ @ @t%%嗥j%~;#gׯ_A/ @ @ @ @ @ @ @ еW|D\RyE-"94gs^ m @ @ @ @ @ @ @E lTDR^g$U|G=y͛7UY m쯠 @ @ @ @ @ *qUj  @8+WgvƍV\4 p@$8 %@ @ @ @ @ @"YF+q"1t: Ήz{S+YK:;  @ @X|ǥ{V_JU]%wΪ7]_e s @l@ [ @ @ @ @ @nx[t8F̏>x|hAK)_] @ @`B/o k#~7M9u=7t̎$^ @LիuT9%9UV]b{go|wa8Tm*y%@ @ @ @ @ @`: <0ۢH3|{oUEq\ydW+jU\ @ @`VZ;45)L9/]kFd  @ @ @ @ @&8V~7%nXmNl%"@ @m,wFzsKIW\p04vk_T\4 0)$ۘ& @ @ @ @ @6ZI6I @ @ @ @ @8t׵=RiDYZ/+GF:HJ @ DdMuG?SYyk:R'mLh @ @ @ @ @L wCDvNG{x.h}jV(H1N @ ,_i[G:p$Jqއ%@C@ @ @ @ @ @C+7 #zqR*wj㾼3WЮ @-h4myyzKJGVfgf7mZߕ0LA6Ke @ @ @ @ @&@$vιD/ v$Ю @Ko-[J:*I#T[kGdS; @ @ @ @ @I'GEҍ#AǎnhH @Rј{]e)T&{RG/V^D 0 $ۘ/ @ @ @ @ @8$Hqz=/FE1憎k7F @ /dNsd9bF7o^kHde:  @ @ @ @ @V tkHqdܟqX'qZ4~;bKH @ @@ 4ٷǑ`cE)UO[7| @( t|D @ @ @ @ @!>>M6a! @ ]va߽EW=r$T-zy @`: H1߮ @ @ @ @ @ 0$ژԯ @ pƬwQ3Ud!USLoݴ3U0td𖝑 @ @ @ @ @ @ @` \q3w^lFTDծsᖍ>]m @@w H]i  @ @ @ @ @(s^SPqRKV. @Fcƭ;vaNKI'T=gs}OV]< Ѝmt[wf @ @ @ @ @N26*B @.Jq;^J asWrZ߿0td] @ @ @ @ @ @ @@ l۶/~f0l4#ƍm}i( mQ/Ek:T  @ @ ,^Y%lR6*]dߺG?wIQ$ p@$8'@ @ @ @ @ @K>lF;/ʫZ_#ߏhqdDX$C @8HqFlD3>%|CdX\wU]< @ Hq`}N @ @ @ @ @@DrDBqG9hQڛ[ 9ioP&@ @+dɊ_)95wT~RN?vqWwywV^D @HqP= @ @ @ @ @.XgՈgDTZ_Z_ds @ @`|Kz@i6R*Me|sG~Jq9o뻇  @- ~?vG @ @ @ @ @$9bk#Ύl_k|). @845_1d\rܱoݺhѮGCCO%@ @ @ @ @ @d7VI7Ẻk"ļ4@ @Le^PuHӔk7-zGZ6 @ @ @ @ @ 0 [Ʊ^I7rqR#E|'"E @P`Ɋ5ʚTYsr9~?b#Ϊ˘GL6&{  @ @ @ @ @@$h}ơixDG"@ @Xt)5%&[}EşR97.1L @&d @ @ @ @ @ @ @@Uif=.lļ[#%G̟si^^e @W@n @ @ @ @ @)*_z@l1qBػc @!I6NL_W1mhޞs4l\I6nmP$@4: @ @ @ @ @ @`"Ʃ芈D$U @ؽaqrݙS3{fmXa!@d: @ @ @ @ @_G$:T  @ @` ˖58ܵ"qIegH;g  @@W Hկ  @ @ @ @ @ b" @A`1i,RR3)# ٓszi݆ i6 @d  @ @ @ @ @ @`-e涕  @ @`/KڵYҹ)hcWy }o @td] @ @ @ @ @$XΰQ=˲ @#ݽ`㼈y5r~_/kFtc;. @ @ @ @ @&NW7ĊQoU?  @ @`XhD7FqsNQuѦM}{s '@\@. @ @ @ @ @LXԈߎxHė"ƟCtָ @ +V8=MҢ=*1YRY/ @$g @ @ @ @ @)_zB,̈FJGSwD슸+DzŗΞ4j @L173xcۋ#T9A߭R߿U0 0, ư; @ @ @ @ @ Se1  @Fh̻mǮsS)K#Ƒ^rټy50 p/6šB @ @ @ @ @ @ ?dcm;w!Rѕõy͖ Ry   @#H1& @ @ @ @ @ @ @ ,9醛I"l3ٿsHͨ_iUhU"@Ldgi% @ @ @ @ @ @ @@ \ve}85ʃ*=)Xy   @clc H @ @ @ @ @ @`cn @L+F1_JYUR:.Y)SQ[6ntS @lcd& @ @ @ @ @ @k. @L{+bkwեV=pSVpQu  @U$ۨf @ @ @ @ @ @ @ƌvOX9rga @`$=s  @ @ @ @ @ 0_^ǻ(bwG11vXǷxmcã OxT1?z_G|4 @ ضm[ϕW^ʒ%"Fss}OU[, @H11V!@ @ @ @ @ @xPE|5H 1Iyž[,Ẻ=q=jˣK;Vm%9%%^;ƨ @ 0NFQuԬVRJWNZ.oJ D` ~ @ @ @ @ @ 0="kdk#4 1s#1 9$ͱă?JQz|I{Jm#ڿQXahH @ZI6n۹%z*1NﰜؓR=l}; @dޓ  @ @ @ @ @aqG>7+ϊ83,;"9Dǜ{9)J:Gի="?BG{:=2b87l0k"EƜшgF @@^ԻŹ5%ǎ}ڽGƇR-ٺy?ܻG 09$ۘ. @ @ @ @ @CI!>G;cxv1oBkFVgGsX4_r@y+bFD+YJwkq|k,UlXmFps~4@m @Ywo4KY1T!rcKlT48#ك#@ @ @ @ @ @' p#üS#ΈxhƈD_J{A(/g'xKԟnOkO{Z[+|[qh̸|t @2忾xɊ򱪉6woZ~9e˖D]q  @T1` @ @ @ @ @O=tcS$~)G1xpgf bow'U}&WC+Yֻb,g hO9 @Lk%WY.O#ڧpi p @lcZ^#@ @ @ @ @ @ 񜫢>HlqS$xUt|AI[ہ,G,x?Cb߭ h:, #ZI8BſsѮ_mm+3] @Vw3$'Rx] @lcڼJ!@ @ @ @ @ @ <$cڧcmkV'hbw&pœbs4F<4͑͡ml+VnQ^ܴiӋbaysNxC @z|`)ZfGVk%<_2?[lه&N&$8DK @ @ @ @ @xDiQ&b=<%F3'EjQHţqVŠWŞA :uGnoVb\~XX @T30nt]ǾZOΝf6/`$ 0 J1ߒ @ @ @ @ @ @` $=R[yZO:iv' S"ΌxMD+!Gzi7"JuD[9A$hWqw[mvbnm"g͜9sό/'/a_ @?f;_?08SIόw<أg:t'@&@$mgrzS3O @ @=s IDAT @ @ @..s0<wV|~tZo*^0Xvu>ٺG{se @Q@V @ @ @ @ @&6(__V{C$(m*F{5=_h*+bWFqu6}urh̬G\p'@ 0\yRS.H2ߓZ)}9KgH[7l !ݸL @d: @ @ @ @ @D dܔsx#TU1gEyS}Jg2rJX2dqw  @@o'F;#ƛ~6o @)PՁܒ  @ @ @ @ @ 05"g#8mxw}C=9jh{fl؈c"8ϞzTǀocͱZu=:.mW  @Lz˗?d`Z]Jl|.s$ظ=]><L @Ls6 v< @ @ @ @ @@$F$xJ<5x(;3!1㣌J:OWroO#,~1?_;#xR[ʊ @&իTspecUhNiW{M7UY @@7H o  @ @ @ @ @80H㭭{+ĉ=d:rkdODw_Ϗ{M1u_#6ךnO;6wG @Xq`ٵ"rN39U6w3oӦa @b7Y  @ @ @ @ @ p"1ĵVL+ι3we򌡃+{9{P|0a]/2\xA[;  @L%Z,ܔ*ww3oa @$Ʒ @ @ @ @ @80X"j"6Hx(sE[ﲯXqOcJq״.F!*[u?gOD' #b519qyqo##~qm5bN+ǺVĺG|7[ @Rŗ\2'p*njk @" (0  @ @ @ @ @ 0VHc/a ѷ dpn88UC1alju[I;>:a Z @~ \ve}82ĵUZI6>SYy󺫫,` @$ط @ @ @ @ @ؗ}1fGt&L)5F_FE2ިL @h4n۱U!9}$څ[W5#@dcs2 @ @ @ @ @{8\/#wWGQHqW۱1. @&@$٘}W7USx-.k%s @6G @ @ @ @ @ 0N8GK>.쉄Eۋ#e6@  @Lm۶\yU,\^>I66o^J D PY@t& @ @ @ @ @ @ 7n/}+6ϵ  @8Fv/KYWr`OU]< @lcbB @ @ @ @ @@w \bӢɶ݉y|ǀvU  @8dcYY%U}|N?k9]߿U0 @`b$ۘXO @ @ @ @ @ Н1Gmo#̌w7:T  @8Kk3>6tUN=-[ @6U  @ @ @ @ @.k:{x?4wG\_k%Hc#ΊX1vw{2 @Gws%-<9H߿W0 @ Hq-O @ @ @ @ @@W|2NN{(ׇb0l8ʵcqiSNeӞr_-\p^* @Z@Izl @ @ @ @ @$ 76FkcϗD8?.7c @Sw\[Rz~J•s~I?=z} @b6 x @ @ @ @ @@$p$Djyī##:;"VŜvv @ 0qK>u 4"YWZI̟HqWuL$@8mW` @ @ @ @ @L7H+δxcN񨈣"7[ǸjvLv @ oUi暒葒sӏ"N{V< @mL7g @ @ @ @ @L:HDZ ? 7l %@ UV:jKSN疒rҮRoIs6nTe s @dS= @ @ @ @ @D e<,c;_|:n\ѮJ @ܽJJSpݙSevm%Xa) @D@i" @ @ @ @ @C' 2Z7 FϢmG}1Q?m4] @X|=1-߯"jiƺ-[.A5L#@FmL( @ @ @ @ @2gƓOGM#E?ˆG^?/֦H @[w:7,rTꁘf}}}߫9 @S@^ @ @ @ @ @+pZ>_Tſ/r\1w[74Tw#@ 5dcwl)c<>c7SIO3sck_TY @- ~NG @ @ @ @ @LQ[-Ÿˀm/nk?1ʒm( @LoH1_[Rsu$xp$ڨr)k6n* C mt{vJ @ @ @ @ @@gq_60 @dcƭ;vaNKI'T>DNg7o^wu5L$@6U;( @ @ @ @ @PO;V}lG-uU @J`۶m=W~˯h6˅)}̸M뮪i @]( FtG&@ @ @ @ @ @`Z_{z۪DsΏw QG] @tK|IeM)ʇk=-7^Yy   @V@}N @ @ @ @ @ WZ$?F|{1iQyw{S/  @w'P]u)2LN$ F /éG bMAC' < ($  @ ;= +骓>g}o?'kq6]]~U/RRy6* @) O @ @ @ @ @{cuLǿepƲ5qѾ?Z|/x8tB @3X`mφ(*/#Պys($@ 0, l?  @ @ @ @ @xi~TgF]/>mu{ @3Y`ڍ?C7"]]u;cV۲gW۪Ρ @Ha#E @ @ @ @ @ @@n>7J_]+= @(g5ټH"hږSo`M @m @ @ @ @ @WEQh??=66TSB @`Z}FQ<OZnU:^% @1'^E @ @ @ @ @ 0qo9=m8X  @LKOj5/U1rʟى IDATƊel#@ 0i6& @ @ @ @ @Uܸ*u؟h?F @` tumxJ+gsXO#dcj @W@xŌ'@ @ @ @ @ @opC! @f@O˛}Eʿ{kU:|Wsl[|G*s!@ PU@FU9u @ @ @ @ @ @ @` tumDHƯE wjŎQl0 @Y@c&4 @ @ @ @ @&s.-[c4 @myhcJũ(TH9+u!Njܙ @@*l @ @ @ @ @ PU 4.+"8]n磽<3͏VnU6 @EqN\HRF?~YPsps @mas[= @ @ @ @ @3lOv~.vΊ7E./>BCI @ i4vGƵړR- WmU @&G@业 @ @ @ @ @Y*O3\ Ƹ1Ѿ-کṙqN @`2ƊZR^A+#4kչXs`w=UPC @`mL  @ @ @ @ @5ݱG[8bQۈ;%h=GaO @`5.R|ࢡyLynEmXJvjцH-v}T]'@ p:mN}&@ @ @ @ @ @`  (װc}U^Q 1_p @9.P&ox{sNG}h4xoZy]l[X u/TC @)1nF @ @ @ @ @L8D{po~^{.ڭў%EWOav @(W׾O_zvF~KqQnwbS]̹4?]wύx @S`t>{ @ @ @ @ @ @` `GoW7(ZLj87LJ?1a+ @xTZm|e+mweQK_iqz۫??\x᥿t7EQ'>"zA}AΝ7va @6d @ @ @ @ @L/xcq8oAǻ/boɳ;/㫢}! @Gtm񩋖./6Vw %ֿrV,{W=_ExTce[Q @^< @ @ @ @ @H >b, G<ҟ ڧ>8 (/;bS @'tm:Ioy``N9 @3@@ xI @ @ @ @ @.PmG<ŻFO>qydQt @8.02hc:/Kfm6VN^K‘;ӓ4=Qig'@ 0m̆h  @ @ @ @ @L%#q"Qˮ2cbds @AǟA}*bLJE\.xR/:p#\۴wnbO @`6 ۘMoZ @ @ @ @ @J{k(} @hA8'kf)aW8^K_⨁1ʱyϮ6 @U`swպ @ @ @ @ @ PUk>iltw;$@ FڨEy(ʟ[ajE_Qc+7w_77~Պ⺽{w9~ȟ @fYB- @ @ @ @ @I{Y};/WBÇQSky @` tm|+w;rvϭZ=5͔NQm]s:}_Jq5nM/~]v| @1k#@ @ @ @ @ @Go F ya|}kߴFo(7ZLjaN  @@Q;oժLV3q}\[ǃ82:w`9vG˹ Gr1Y%@s܊- @ @ @ @ @e+;J_#pch?q}XۈoVb{ @~k6Z}}2zR,YpLF?.Ƿ?~Eơ+zVrpq @BaZ @ @ @ @ @"hG q(7ć#d8~{oiؗ9n @` tu5Zg]d`"~[.*)ZV?ځ%K+25Ğ` (6F 0mo @ @ @ @ @ @ 6nx#͍tXPek\̫޸jժX(kPeF(r @1'_E @ @ @ @ @ @ @ch4gwpOέWFtJZ^׽/-C2ƵunVh<Q^/RF 0mo @ @ @ @ @ @ 0^߉Ԋ=36ƿ|o`=WoVtn!eF~BAdsD 0mo @ @ @ @ @ @ 0vFྃ/)玽sd>{wΞWpFQk5NsB @sT@}M @ @ @ @ @ @c[jEEc:qT` `т{O:1g4&, @_@VH @ @ @ @ @ @ڵ[7"]AUf9juł 7n*!@ @`bmL @ @ @ @ @ @ @`tuVJۊT|Ws(_{ g% @56fͫ @ @ @ @ @ @x_tMչr3^l޹s秫Ρ @1yf&@ @ @ @ @ @ @"ӳiC͡m񼪏!a``ǪΡ @1@ @ @ @ @ @ @TgCcEcFRqUWC @ ۘZow#@ @ @ @ @ @ @i {ᱡ%5~=6}k'RΛi$@ @ '7 @ @ @ @ @ @L'Y<>T,J./Q]aS @' lc,D @ @ @ @ @ @TwC9MJBF~!ԸWɪUt @S8 @ @ @ @ @ @ 0sn馅o8j.k @6s@ @ @ @ @ @ @N[nQ[EƓ-0H8s6* @F< @ @ @ @ @ @<gbѮH) -_co_?  @v< @ @ @ @ @ @Y`MVWāRʯ?o;w}K @-6f˛ @ @ @ @ @ @Q[ "gU!9"oٵ̡۫ @# lc+OJ @ @ @ @ @ @k֭t,mtt06!KqL @1c_'@ @ @ @ @ @ @tq>E*jUrJwPz5 @\a3yr @ @ @ @ @ @)8e IDAT9)R(ƿx- ;i* @ 6f[ @ @ @ @ @L@yuL{CEQ5[DҨyEvNDT?֘1o1on  pƊp5,U y_i;nT-ߍ  @`a j: @ @ @ @ @(1E[mybv^έ h?cG';9Ov/ @馛q]h!*=U_L)7~߰jժq}U" @i"H @ @ @ @ @I B-.  VhDq|w;g-ƿ 7v?p2|Mt @F[nQ[)=)rN"o_|k5{O @13ߛ&@ @ @ @ @ @De1qqiDUQAFxj4qmVyVFhn17IL ޟnHŕUB6'DFe#@ @ 6NpB @ @ @ @ @)X+!KB#jG$B6mw]}zkq<6sv} @iXۻYPsG3R#-mi\[ @ 0mL @ @ @ @ @ 0QS{˽bF;xegFG ^2?"lc2| @Xݳ^9rRߎ;>_qe @!ase[* @ @ @ @ @F DźkD[q?MѮt djKhg9/j2bd9N  @!ӳc7"\R 9]=7 R" @椀9- @ @ @ @ @ ΠWyW?qh}rx:NƜ;&@VhyTw^\>X {wmU @ @!aI @ @ @ @ @ @@,#d~1ϢǏvxgŧt1[8%@&[`͍7..ڈZ9W~/yӞo 1U @*_Nfڬ @ @ @ @ @* ?Ǭv$ z;ώwwt5tzuk{ɘ=Do߾3TZΏpV{wպT]'@D ?pe߿%U֔kВEk钅G !@ H/_sgY @ @ @ @ @ @$ 1#Ovz²p2q|zupf;x  @L8|؂\l*}U%Zx`N( @ `OO43zJ2W  @ @ @ @ @ @`2蘴c 8Q(CZԶ&cΎ=@p,ܹzg{zz=c @LXۻYPsGgT{|(+-w_9T @ @m< @ @ @ @ @ 06:4:G=<2wI?07sS @`"֮]]\lOE*EPJ늅n*s!@ @XmU8 @ @ @ @ @x4@ѩF ߘ9ODF @cX~eű(xa*Rs7UM{7 @ @`mL  @ @ @ @ @ 0XŽS.0Xűɘcz @@U9bpKoKcU)߸kǫԫ!@ @@UaU @ @ @ @ @ @@@g0FmQ||{sIwq\NƜ#n@oǚ_*&bxjc#dE-߻{?  @ 06R۽ @ @ @ @ @ 0{s}ہ~2q  @XƂ>OƜ#n8@^ݵSQlKN1v9r-5W~ժUQ$@ @ ۘBl"@ @ @ @ @ @l(ޜݱsxEu 뽲ċ;މs~ @ tu{nH;#d㩏>rEJ;޴gG%@ @ ۘzsw$@ @ @ @ @ @lh,'ñwi\8nNƜ  @QOh팠gr]92XXxG__},0 @S, lcݎ @ @ @ @ @XX[;l+4xQSqߵ2v26 @͗5m+RޚP,ޭ[w @L@۹  @ @ @ @ @bʿ~q'D[mSGlı":7w\x]sq>9s @!8X1%%Q훳\OB%@ @t/>}U @ @ @ @ @\ 2DƎqc|0u>L=>)c3||n2<N @ݵ|hIEZZTrmR @C@PwO @ @ @ @ @^UѾ}x[#\GnvMvQvmj|}2~26 @h4  @ @ @ @ @ @B{`igmJEWS rw}^ @a=Z @ @ @ @ @ @sPh;p`%"h*9~``۫ԫ!@ @L1ޘ%@ @ @ @ @ @ @@GHVKW,[}}}a#@ @17޳U @ @ @ @ @ @ 0K`3]HϬ=ѶEk"dh9 @ @`& ۘoϳ @ @ @ @ @ @ 0g֬[miQǫ-:J|튐PE @/ lcC+ @ @ @ @ @ @ @` ٴ(^ˬWXj3bQm۾\^  @fY:- @ @ @ @ @ @"nݺ3u;ŕ֕S}@ @ @` ۘ/Ւ @ @ @ @ @ @FcHicmPl-E j[o @6۷v @ @ @ @ @ @T`;r>2^7^R19忬vܰ @ @@J6S@ @ @ @ @ @ @I馛K#hqUns={l*j @ @!aI @ @ @ @ @ @ @ ~(qq\ݵ @ @ 6NpB @ @ @ @ @ @wFwU1tgocUPC @H= @ @ @ @ @ @,vݺҮHxN7R.?kT~ @ 0QYt @ @ @ @ @ @ @`|֭P(/Ge_u|89n:c[o< @M@؜"@ @ @ @ @ @ @FqFƢQ=JglrQ߼g/ @ @ 8mnL @ @ @ @ @ @d EshwJj)_Jw3UV5'9K @` N'>"A Lw? @ @ @ @ @ @&M{X|q|w³gl;tE' @pFoQcκrё{nEN?11A @ @ @ @ @ @ i4n">[0ޛ~C{wW[o< @&ڈuբ}O5i#.䢖<5ͯ/zİabWUCFHئ\@Ɣ! @ @ @ @ @ @%h4kVkCyfys~s|~Ϟ} @eAXZ(RtM"Lvw|k L)v3 @ @ @ @ @ @&H ˩hm*sׂE3U @eF-Z1UZ}6 \">;S" lcJ݄ @ @ @ @ @ @XӽGSQ]3ກoT @,8~a mLܚ˰p+C6mL( lcP @ @ @ @ @ @ pz7~P,C6[Iעqů6* @sB *9uiAH2lX7yk5  @ @ @ @ @ @ 6 ߯FFksˇR-߸;wg @@Q.6r(sʹۿ{5yE@X!@ @ @ @ @ @ @`Ɗ^_޽*[\fNO[eξ/Mܐ @ ϼ'<\+[te<ӕ~leGg'0i6& @ @ @ @ @ @Tz~3bKԟU壾 mڼݻWgPC @` DƢC[rN+S+W",ϋ"]xA15]G[+.)/b9ӝpZz^:=צy9NyRď8/6nt8raSN @ @ @ @ @ @6\*Z;T7})m^|\{GSk, @ p@^zь0@ҙ5 }anۣzS OIƣOWIǺ@`2mL  @ @ @ @ @ @U`ƍ.{qmTHoZ0/o߾=7l @f@#TPh EZ+;qɌ]o;h*zZM  @ @ @ @ @ @KZ_느hi'YXQ/rq`;Sh, @-oS89lEFMg*5.l|vOk:c1v+#  @ @ @ @ @ @(p-?FJFLq^s\{vmxPF @`h3J+"P#GF@Qfʩ>Axg'hͦf6 8 @ @ @ @ @ @fڵg[;rz=;^^ @ @EӷԊtEPlArE:"Nb&%J䔎kWgJz›+ݳt;&43gn" lc A @ @ @ @ @ @` twoxf_]S3]ѶXOl @Nk c eFjEvGjGdDmL-4Z_5"ZK]1/ݙV-Q ڒhgtUEo%[;pcz LI6= @ @ @ @ @ @&f'c(~og^=XmU @&p{#L+Zie]!jɑsYΏF`ǃy9o ۘB;ϼέ.uVKݲ,yj; qț0d2ofxI $Ā-[vj@HM̞` c6WlySlުy떯ZKTws~η+8O(@@@@@@@@@@@@f]wݕ={{buo]۷}@@` xw;B%RpFR @ M$aD:hOiU Pݣ~Wa+&U Ϩ %[FAOmPݶ}MJINJmXXU7T>C] +@z4@@@@@@@@@@@@f55r6 yוs;wn"@@-D/SpF!}V)an 6E4Ps q~y.\iamXF^5 HۜavjiƀYFƑV(LaS@@@@@@@@@@@@k֭{ETkY뛐{ˢ-Ew@@Y*}g$P#rH ((L%Ð7&5}Gy$њwᅛgtiGaa-B6~O6AiFz4p#? ~e 1~L@@@@@@@@@@@@XfvXMαp)Lr;a             0%bq#qtͫkwo~kהL" ޢ_XpPPBA(}qNly^jasa[ ]mΌ13~6^            M6#Z󌅭>@@`*nUYa j,9xih$Hùj(P#\rK|`F*@X8@@@@@@@@@@@@i.p7ҭ`ޗxs䊛7o~fs>  顣BSSB3lgx1A @Ha2P@U[O\gQ@Q 1j*ND@@@@@@@@@@@@`z lܸm`(j&Z9 y)oر=c @@N*еίPZ^ Pƅ0xᒾƩM'|VQ aA]ϩ[yM<8C 0[ۘ?y            0kC"uZ{&-߭z.B@H-3\0 LB3V)b w/. cj6h[|'@` 1~@@@@@@@@@@@@`(dߍ#xy=ػ`[P\ FjpFi蝬ö41鐣45)P#E..dsT< @ ?"            ~o)(cs^"}+^O^}#~o  (ΏK޷ Q ^UA}4 j(p5'jIsr.ewu{aCVJq            @6HnӢȟY9?zƂ?U P}Efʑ44:HQP0 hN;h@xf540w] 總;#3QSeN            Z^XW/ *i?^v|UG#?lݺ^y  L8P󻏺 PB5,PC޾s̾,=ZPk{b@U ]Nչp@) lcy0             ! e_Yr8mذҕ[3 8'"]W>ݴkml" XN.RDwͦ`U!˓( Ѩ&id5qzh1ԛpF99um ͦ:F=cBN            AK_h߹ ho7=|O7^j ܈,p}77SF]t/|no~6:  ~ߍ+]' t J(]671&ӥQ s }΅f댇l0 0u%z@@@@@@@@@@@@QcE_UF.5ϝ?z>~7_:o7Pyέyxmݱc7v!g# !D/SF5PCE ((bN IDAT4􎤷$̖C Wa'Ը@*$ ;ǽ 1H6fi            LOAK%Agw~.좨,_Ţ;rww~RlC9lܹs?w=W! '}nʕ] _ ְ %#$h$tORƠOsӨk]x߉3@NGZ@@@@@@@@@@@@NC qjm|Eag{n.ܜl-hcZy-q'Ƿz'/L@@` J ӈ\4Lq~ vm6 ҈FjjsM=:Aΰ@Y#@ƬQ3Q@@@@@@@@@@@@FeIFۊsr9s\TQ&FmiubwƙgYs_LTzs|sX@@`v 7}{g'  0E?g[Y(DCz_ӰP-KT H4s+zzX750PWϻp[b]@R            J8A_EK%AQ%UDzZ?k2oQOGqpwl" cy4rp R\7 4{ +Uj$\뒹+ 0[ۘ-?i            (ZrK-.|E di;V]gؕ*i%R.a;-M  0aѷG!Q zjԛDK2Q^*Isz 5$T#VF>…ݞeGt/NFm-C@@@@@@@@@@@h$$r2 ַC}KڝׯWa)fZ5bӀ L@+(wʩ*5S@@` <;[U(LCz(M4PF+Wl@sث  s@ qw 4a3aD            3Tk,iLVݹWv9Vb"ҤMv\ipz>R}ÿOεBv}mlr@@)PMu@A@ tx ptɋAvk*i*T# ,T5wy^w( %@F]l\            na]:Njҵݏ>7vgk5ej9lj=~ [_mZzrz mR@@`t+4ODQ~Aq&m Flƻg4P js.\*PcAGͰ@a@@@@@@@@@@@@WX,9|]q6ig,Eg$ǤmuNmeh = =ğt~ @@`Ej0Cϻ ]UZBҐRFܰ~CP'U]vE*mR@@~7w+u_7x#a_WKݻ! a% Ps /?h?ƃ 0ۘ?f          Ltua xR=kĽ۵}U?~[#a45k7fToKƲB6 8eWă |VmIF8hc}4!AՒjYB7@)(`;O(۹#]AAZI}ʤjGA ]DC|BmjhaP9 Xy{]MaC @M@@@@@@@@@@@qqO6OjMWVU=_Et@ un+y>{}ӗ5o+=5 쓯Rr$h׭=ѯZnXFF_QR@J+#i$Xc8P#v+^Мbx}ͣǂ4,PCoa΂5\89=( Lk6#           ) ۸G#||8yZ|rj[z֑Wt|oWݬj\E՟W .p _Y-Z u>,#ݣ[}Ͽ徣7P6hYc!G-xВmL%%@i$pp|Ea@8 pt*m]^# ,Tù. X0ׅt9" 0ۘ?U          L/6$kaS8m?Tu-FOϨUޯc9h5: ) \~K]mgQ٧|j1Ou7|[5ʮ_n H6,hcHjHڤ  ݏ Zp+Dp) 8dh$󔝤4Š4QjBB%y^|{^lp<@) lc y4           0~JsJә3.o=Z?^ 췕_}Z6H@`\֮rZ}uo+;-آ{l)_tɥ[o]A_B6Ҡ &hC@F'}x[W\GEa+PCa5.T3_eE;CFj(\#)PC];M /=@@@@@@@@@@@_3>EzG3~@;ӰPY>@`W obߍ]T[~Mwܾ|yw[}pϫ'Պ}a}վmZ[3o:P) LO6G+ Ҩj[B5VK>9rHޣ1zRW70nO7- ZSq           ae'<#5 UoUC-qƶR>w&u-"X}>|FwmcosTIJ꠪mXІo!  x[J_Ԉ,LCU_}_/5$jEQKPݧ9|5Z.psi3s@Wn           l"pZaZna/;ɺ_ 85C^$nݎku.| W\8㝝Q+ OaK-lηB ۰ װ hC@Y PAWٝ\5j(PC{:} ])Hq Ұ@Xm.Puu4\g|0C@`: 1~Z@@@@@@@@@@h`-gxv5kjU x-A~M̻?QDZ2O},sОIA$P,[X}LWO'>߂mB6, iFI4l7Ґ B WgV])LÂ4@حV/i/n 7uXs]q [總t'|?M LaFˍ@@@@@@@@@@@Y'pf:k[JտU=/mX(F8~3"'PFӡށ.ɹ-s^;Żo_;ܰZQ T-lö-(m 0(L0jFk8wF:ZT=&=g;@h =ok$G! ?1t@ 5ғ[Pyi~ԝWVۓё\ uCsgTm壹ʑ򑠽,-k- ؽ~Ոy@@@@@@@@@@@fǙý_S}FRU?]uxsCElY٨h1ac#-ZՂ{uOu/ayCϞ|# 87JT9hΜ# Xs gK4*vx7B`^܂Ђwwi?E}Ž}~I彽GqS{ @zLvNA@@@@@@@@@@@t 3١vs_O[9:9Gul~zd{MHf{һ۷ocE_B_ZvW'}<^$p ~Gůxy7MA;n3KFBF2}(A@`b^+(=`UFΛاO {Hwlq΅K[ܞS1wE@ 4o'@@@@@@@@@@@CN]ՋTz:M#t+sݩ5L?韪;S]q=7ܰg+qe־ }~}7MmD1Q@`fTI4:B11qöB4=OeM s.3~v:́1" 1@@@@@@@@@@5ZyMꨊN'VqvsnK~=٦T_hy7ڹ[ރ@*s]I$T[w+"4 & Hi]B5`]s%@8a'a7           |UOI6P9 xl؆ŨZ3",XUhŸo1ϟoc/j@@`¢o5H4g+1JiM sLO5PJ5b\:sT?8@fa,@@@@@@@@@@@F=b`j; qlxv^ZZ]kxcߦu9Ӯ[vv1[@Fxr++%p( (hKF}:jh}5Ђ5\8_y[FΉm@@tXG@@@@@@@@@@@ 1qy(ӷy ۰pڡE!p 3+qBf?^Ƿ,ZWد @NS.` >JB4:@ 9vSok.mOzweQ 540F.\fB@@ l@@@@@@@@@@@N[{MTq\R{b};[vG}Fv_+Hz'cuw2} 06lذx_yL;*o>ca v\ ) Tk^5vZ.VݠQԶOy9{ZM55:.vwS3p JYf           OwgOc*`'ޣ\ j?RQ8-2s>]bq}SІ;)j!A;oB6  p"E?4W wV)5[X.MHځh4= @ pig|F̈@NG@EmrRQ1[Uae/[uCP           _AI5_xړmT1~z5;.O6^oh!5#W{ l#PFˡށ?ghi}G?wm۶ S@ONЕ]5 >N-G^T;ӕc_\߰N*t>#ԜB >Z.psiyi IDATݛ@@& l 2OFv;T_e;6{\ .q17D@@@@@@@@@@=ZqD#:wiNs:vNM9_UMߨo)s#z>3 t wygko#wSb[5ϋػњmٲo V џ\A#HaZ5!B(.TjFT ǚj.{׵e1wu\iԱ3.@ߛ,ÊOQ3/Q[29~TvU =~U5P]&L            (j[Nm|joh#׊Uv: `f;jaMvo+ݯ7Ծ%/BuIjf@X S!3%}V죮vz5 3_~QYa v*(. Ь wy@6Pch-t@B-u50g5/s{Ϲ6p;   c|Dם`OU?K*'8[=];6ٵ/tQwvC(fͦŮr[WԻZ!_vMM~}р1#^'# 4ׂ5V{did4HxVsRZ ЂЮUs>^3@[.-4#-ַ`ѢExѶr)?s>8gΜy:@u__?>O6֪oV@sf 1@@@@@@@@@@^<2櫵U>ڥ?R;kl1fYj_z#?Xڵ_67kΝ۾^=@~7w+hD--ضڀY{FMgx@)#F{וSm5BaW^yC뿵XmW\϶\V6[ҥKsxɳ>+Vp PUz{{-`ETӠH}Vf:|skؔ$@Li2@@@@@@@@@@@V∆tt_ ݐ! \+]tz_s[{p T xzw` hxiDaޝeȕ 4׻dC+ P:ON8GQ.;\.J% H2ԶEQg$fmvN$s@m}#KvߢE pO>n hY`76+#QV-t#܇?L6&Sg!           [q9c-1v?VMwܾx)#V@ cpr/^1#Z4{E>QKzj!/jnҚ(y#G^;۶cdІv-Z)'% Hk;٧ju:~ӴdT"<+=zܹsc_B6/J*h![[T?w<  #@F(            0q߭sGk䴤hҜwoݺQ]I  eHM+_=vdM\_-q =K0P&댏]Y= +m$4taB4,01P¥j% ٦'mQ D~^v:GUAjض~V?pW뮻M~>gU?wc=6G}{? תe&êcPtd dg!           4 T=uUcZ ?[ݾٱ] im*_FTR幡Vvyn9 6V*glwZ` nmz\ HWkT"s * QXFҦ۹\.ַ`ggêtw^{/ x'T׫U+)TU{U- APN            X~R_EZWh}ՐH>׺y' 3Y?6JC(rhj-c]ݔsO9kbCj]Zs9eA - L3Z`F-4CI)Qݶդ 8vzs(VZm'4j nZFnqꇌ =' tiqשZ^=\m$Ůbn9TZ P 1e<@@@@@@@@@@@XP|F]G뙅k꓁ku\~!W(\VvD:HɖsmKk5yE!{th}Б3փ-׆>PS߻-o zeDQhh_ڐl}s;f4#9ƨd?kN72@#ٿ`Шn>I'ibxAIEZ)=߮I_o7&v{v?|:@A`2^A8            OX,?|-^3-"][\LOѝ+ шU4s&+T폓:\K?/?u9mr>qsNrȆ:ޥeaNX󗹽\:!KAhT*fX]1v`Jt?Qfvݺ2 ϰ|>o۶4q܏j?[֞ՏUM6Ґa&-K7>eT6^ #4 /@rG@@@@@@@@@@@@`F pyZu@9X?;\4ޢ_ 525 հV_U[Iz}'h];OvmI5A}~UGqvA -( YXB2B3tIcm/qZ`E0r{lTP543-Cm\oŊ=w}I8sZІeߣw_i47D3ZXU'ea۶OQ7)9icܑ&UIa            @ \ϾK,dcY#}ͻvm~:@`*huT"ZZZj"4YH]OG3OF9fUW]t%IP*J8Qhd?};8r{ ~%' $@C-oy@"b,Tܭ mՎ[lW?ssy6&"           O ZtV3Њ |pΝ[\L@yZUP |8f*Aw@AC#6 VjVC-(#5mQՎiZoaT5پyY? Е2:ޣWw.,4,5W!5acʞMksD)a            @XȆגuW}o޵k۷gv8P󻏺j}֭ގ$TùUZZs. t3~LOK/oaY[\nS(C?Qh׹pdҐ1'1fyZ0c_'vwsssO(3CAI`_@ۗf|Hx9s~ڵ'=_R6&Ǚ             '`!n3کQΪwZ-o7ܹރ@~ߍ[Ϧ$T+\c8X{Fl:Kjȡ֔y=v64,-v{r.;CRB3j H%Ӯ5^ hX~dOiG-y%a'af$m_wKKgFN#,#[˹EQ+l%ڻw'u^Zav}zL] /@D@@@@@@@@@@@@`J,d?ky:-D;dy ywOx8:Gep*:@ !gZA<IujiELmF֥v*bh[z}{q) 0!&7A`\uUM\L`f hv6DcsbXMKoFnўZ@_ %YXFO54GQݟg455%v[:;;R<+ Bk~鬷J:LN͹+7^1jmuяΑav=N !@d( @@@@@@@@@@@@ÇߥLkU;$-6:}W!Wg>j2ZyeZEjإ|AW]Wlw5(GdQ#qbimA,tnVjrmwQTjOknmTmB1FmP$ЧO_-4C?0 - o H6w`_&^ IDAT344QhK.9/8%n޼?zzݻ_S;{W\fmԀ} @m            LCuR7h]S! ~UyΝLa wC|@ .QF6\c0YY[hweF}D4.YtE v>&O+\kIxd[Гc}ZzlIYIh#C4ljsw?IȆ&\t}˖-mqұa>ɟuV{[^|V޽߮s1w S"@ƔP@@@@@@@@@@@@`֭۱Q5ZV%oe׎-_rgi X:%Z>[5qN:cU!mည515. q=T5wȕ{~U[jk6#oڴo}bQ'vFihhW@gg>bv-"om Hoǵ<9|G={P ÐN?ihU{|OSSS<3q Μ:3O-h jy oxAgz9ggA?>;^[?=_{?W 0ʔ KxFÃ@@@@@@@@@@@@X~R-jV뜴೾ZMu_[/=.D-PM[Y(LCAq` Is H@ITz\P]s- ZP ̰aao8`cx;ס5^o}`Mn Sફj:x~ H1$am-(OB4t0G^6$@r[@@@@@@@@@@@@`+j{3l!S=B6wzy]ՕH]R ӸD3X5o3}>}.[V:.vv_?;OeXdAַ jWaצ;ַ} 3FK/,QPF{TJ2; Ȱ kOlk"U[X^[Dn}+#߱FnşϛCO3O2-442jwR CE=Q@`Cmgťŋr^)^(yX Hv}kӒ5ի/=ྟ?w:fH*@Ƥr0@@@@@@@@@@@@`6nܸt`(NkޭM 꾳jIi۷}{p!Lk6A.2%ZxvP]rcu.b;ۻxZ.ոP-jsI7` [͚mXnҐ k4pcH,l#=fs(4Ub+xᘰ {fjmGyavGngϧ?j$C=N϶-4j+~! L;p鳱6P[2dk;ۺ%z[hM:2Sb|yWʲemNanΜ;QM?aϼUu Q'!           +EBh)nh4 ݴi\eIҊ;];|{pL#|{EWin>.Q$jeW<7JGYq}jP +P>wwlF?Z a`o/wL\;jzoYkSpk=p@[آ$1Ѧw$(ö^>k+`Cͱ%]==,F+ k[Eoj;iggfX9szlx^|~D ݑH6GmΧ! ge}fV8V(c5oK?GWۗ뛶\Xp+*ztv}حVԔJH^d9uD1@@@@@@&pUsnU/ ; at$4qF4bѐDDf4`ʼn1#AM2lgؑzj=TWttOo>۽[|HHHHHHHHHHHf $m#||7`IF\r..3A̶/fܐ$@+mgT6z9R ԛpBy洗 M9}PFBAᇤZ] -.ZvҠTW:.}[\ݵuܫZVWܸDI@559j3@$y&0l3in&ȎI~TaE2pm[a+PqSO=58i"v ,(󖯔J q +r Wxz @]ci'}'c̷ʼk5n3vjѯ-n2lc$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$%# "?xZCW{.x[Ukp 6K+!ETBg IvA X䐜y /_Ns~"NHd¾#z[5ފh CT /I3ZL~ҟK:Jwg>qASO-b*Y4C9j/g+p۳> 2TkЅ}P([ollڵktNG$@s"`,2Z%3 0ghi%*ȭXFd~gQ'ݘDBz: D4x FöLHHHHHHHHHHHHHHHHHHHHHHHV> Yhc"Hn 扉D"soVQfK}ZǸghy ;wKW%T*̀$#%f{ 'аmh@!R2>1u܃M՗;#{Rh@}lѾ{DVцmfL$pX PqXq`$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@k"uEAe}#E_F<;(7^>@GǼp1? BVyMHsL?," q8h(+@cYcݭXc+Ikc˯rb-͛7$VJ@?i蘫_+n~M7986WIFhOhJ3t={ L$֝,Ï ##Űr ԵtlJ3D"~"'к&2n?"G*'mwfVmr}ww_}}>~d&X2m,zHHHHHHHHHHHHHHHHHHHHHHH`-@WEyXц{h^72^X8Ҵ[ 9 7poH˙@5D?P#MxOz8qݹǖ5oh[j)Byg͙H`8sB.hw->jvVTQ68 L*M?ն XAyD 5Bekk@voVH9玐 VI2f*΀D#$X9ڹ HEw+sGg}LK7G^?1(!<>Kʦi;i=@L90گn{$(X <& #uhm p_EƓGH_VdEgos0$@IjyL F6k>lTϦzv`To/I-" -'2X"@9cX-kd >EٶaJ,N68Ժ& 0f:$; ]Z"4 We8PC%OyLOO8yPIuzz*%~J8?T֋rz"%H"                      X;TIDAYmIDM\0AԒ4n3 7R݄羸}k,ϔ?Mqwl g o{"MXM^*'D>_ko(ւ@QH˦x-UY̷EOT䳐Ԇ&̡]3{19tەlRH$Ta*kQG5.ўTgv5>CҌ.ԭ$hh_mmmGYx$(_VN 3Rb@, 3О(5|A$K2)V0[wnj #[F/$2 0iQƽpT=oa޿?PՌ:ojG׬[}}U9vI }nN:(YG#                       I I޿suyCQZS цJ68osL"I*9Ng2ѡ;&0^7gH`ax%d49Yf>rQ7zKXkD @҂kf྄@ۢSO/B.E XԧMhƆF}ȳ-Iںuk:J4kT ,3j㙾©;}.pCgDׅl[wߵo߾yc& 6jyJ %i A] RNM9?tރ?+cS6>^nD!2PWiFi4C4мhl}.EҋYo IT|f(Ttiu323&x^!N-2lm9u|I: Le5D$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$d5:{w]˻.((22̈́M‰6D2K FE]qg)xicw?6 MHBjyLbTBMd#J;Un):eԟ8bm-xUi( \pE@%ȥ}NS޲9'ݾ:AY詩 } agvȺlT̞@8 3sD)Θ=_nI!`Q"~H3R/TIU 2TJλQ?NGuWii^ی0#0Ê3ЖL]oːX_ ^-!o޲2\.t+b 2$sۯ"گ߉ IDAT}L4k;8Sk}߷ |ì0:zEf_S'2͋0rҌ@I3Ћ+P =RrߡɕiI8t\qm~JL$p Pq$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@UW]UOʅ~|x:zDDmF H%HD`-56i?HcŅ_CƁhSnL$z֬ROK4R P#3 O nZVH<{E2|ػ~Æ ~ f"{6b?/..~d/\s<6cR__9m> >c0 ޅzVm6-u\O= ̇zX⿮?V-R\7~em yD р8c|B30-$8FCdڧ ߫3Q11ͺl._X!Ӫ%@ƪ<1                       "pmL$aAůuzUQXd#=`6fy'>M k˺֙H`EhGr썚q3oĉhy쒉'ov<]HB 5Z-A N<I`:zj:ĚBբnK755hjoooZN7E3'@T_ZKg*@z~~~W$ڳgOZs'C%7w(HI0TYF 1|H4<#6h)wVc'&)vqgI@f3!'кxi@aQ)w?ӡY͖1|+L,S\Fd*pYe*2Dԇ< ۶mc|Vm梼(}Å.J/iQbx ӲnE*pH̤N 5Ok,0g!G%TCB #'UzQYMe,kf!&O򌢡u*3ZQ-~f϶1"!%}8F+ IX @ߤF!;цomt;8 ,)6?N$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$ \}#q#K}(~*xz3+6/,p$Ɖ6F181xC40!RU&M:oyc?i``+OJ%pm/^cFr"Lw 8q[y@vAJ :9)ŚPklA5ٻS>Lk $uTehv kx\Ib[ N[iJg:@tj] vڥM& 90*SeH5 Q*ɰ 32@ }])]sl͚$(#GIHÃ( z$p7 7j om}56n;WR[ eK˟G'                      X.S| > Bƌ[obdd'ķJqkg+V;MC|Ih#4-{~qO^MFsk 4%( L 4_ˆJ6TiKnWZɆm{Q bG mupŁoDEb;&ٍ;a6I`Pdy`                       B+v.b&_yF |;v$C @|nԮ{c/|u'/&Ev 'ڈOI!ۀ&* KHshZ%raN"[ц *-8?ٷԤ ?=}n"kMк殸X^<8VIzd7LMJUL&@+} gh"=elMwl9U_vpWrE# @xV*ʰ2 p -#HO>ً' ^dZI2  0V(C )2is WfbP {*#p -3" c.fpT"^w|Dk~KO7=s4XJm,%}HHHHHHHHHHHHHHHHHHHHHHH`\v)|@7.BaJk*L7@!?yϱ?a;jhmA{N,*MȄqM@ .$tO߰~a wlȆ#HHyrsf?o]SGSc˸& { _Z7w.lzjJ2}߷ fq2V0bqעDцƽ"[|!ܨǽ ?@f@@2΢ݻw7H`.y2T W1Ff GJ3TZw_1(.[h;>io[ށܙ]Z8pwc wHϡO{P*o#;!&X̻n+d$3Ҍ$Vqf22uru!-]]\ݕn{s&` temdJ81=3d·$@$@eHHHHHHHHHHHHHHHHHHHHHHH@K2rn y|}6P* _ _Y'% ^F*GPU@B+кFqjt:\@-]zS_XcVޫ7~N> Tf4 :dr,9ꮜrVn6oHtx NNwD"ΧzFc~?uuuzZ~?.EɅE`Z9wIP$ՒC|1)߃Ed}܏(-汈i&GDᆆhjPK5ZNu6a5ϖW$dž4i&K9}dT$Ks`eg0ؼys| uxJ4W&J4T1!/gbyOc .Vzl=Svj;jkk;vڥ9%DPƵ?@V&8l62]ߠ?GtrJĚHg) @ΞJI%H@aF3T!qeH4 dg̭{vO9ԿF1EF +@Qyf3L**yyQu~.E8Up  6慍; ,W]vT<"n!։!s[Ȅ _SsSӱV 5Yeگm)%.u!_68#pa7Fyrr=.^\ $Eާ%R 5\'F  dkאih[>^D= űw& pi:\ieuu޽{Q}Wfm4#_?C֋M-I_Z 749'Pujn?$0_lY.8!oiqe@@þP:-я9I.M*nY޵SsW1 -0gN#>@-~w ݅ ,56 $@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@LꫯMl'\K#kyau@i5AN ־dC4dZR&4J5*@@#>}=z;HX/KMwJ$ܦS~CvN慸3Sn^t_gy=UF-,}G7m͝$UxXVyF+nLYfwJZ+I\yF;e3R-KJJ:!XX~+4wkUQdM:#[t\kd 7i2󖯔Jʃ0#fT8#8C@#1qJIo1Mz{jtG̗1)pB 3DE*i~/*pT TrL$@$@$P.7OHHHHHHHHHHHHHHHHHHHHHHVm۶G .}y  n7A㖛?+(S:h\@˅%•܏HꔑZ>@Z}u8j.:ɹ2٫7ye{˿v7 eyws8ȳh?,"=Fُjg6R98ijjܡUшGAZjz:r W 06Wǘ3T :ZZZ1Rkf0W1d=w 5hvf'f7ǧPW)dFY\t"`u[&$Ç(##0Zhk4 4ܸe]˖qef ͱY5c 'ʀ4 4T!aJ3c¨<^'YC$@$@k_$x$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@NpXZXɜqG}=Z~LUu> ]EO'2'!,c+liƌb9 ghkiE:A=-~w d"  X$m,XNK$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$0F _kwÏ܊?O?woaM~Ws@060 ;ny#:[LvXXv7^S_x0ΘqDF>F^Ɯ_ӝfb厵|Kc:IqW\JM24e%R^VeZ2PmQ/r@%mlLJ3)B˵Y˭gY&36M|Ўv6L{'s!#φ?dF,=*gyi'Pۙs/C>aR +%^{w%'7ga{`RƓ28"mH@J]SW(%u?7fEgغLC wخ܍r]t g\#>Sh3MOlܸϖ 3Ri_aFudٙr^[YFvp U,TgXBP[2l?{w boD娥fk8Ɇo˦ӽim_]w۸>̎f$*gL!0SIXYhX]דinWn[s#_U"}9*H3<2A@AQc았15 r#`#r;1HHHHHHHHHHHHHHHHHHHHHHH`i  ]?o{N_^]#Uusr3ڌ1n]v@88F6.Coޢ.Fʜ2k^6(ZcAlE0Q G@U*%{TbJP9+1]9r0VP2e̦)VlXY Ly4`7o\9Fc"PYih[E%*h@7Yn}mW[pm(UaEyAD"8ﶧz*U53r }?k=uGwۍ 3<Ϭ5 pɟ$CR+ӭ5לq#aVI7HJ%hHxMA4Ruh].!L=4 3T#G%JmeOp{HHH` lc _|: ,f;9wG9x+Vц^!ܗ</H,bXjx]gsfmD\ 9|ApsWRcnv X:Ϋe ݸ4Nۑɸ٘#=6&}98cI`^\.O_+Sh44TdZw珺JjlӕȭmWswU7YN6he[AAAۓO>ٳ9ssϸJM^6+u3XmˋqEF*ڔJE.(-=兒W?~*ȝsH{;J$IDId+!PQ 34L5>-0Fe&9CaiHSq;<411bA7'c@H.E%J3PPBAϡq$@$@$f Pf/=OHHHHHHHHHHHHHHHHHHHHHH@F8[Ƈ>|N J׭d*XFō'(iI_L;Ӕ~D$(4V ^7`+0b_'7|3v *aARȓ#?/ܜdZCIqa6O׍i0i4xt=餗⠼cf?L#::[n޼ 1 dREYiUa%^p)7?Ws .1sJe@}LC:1h=7\kn}g!ڸ7~Cyya|kE'TcY/}%"_ gru^ Y) 'ƀ4àK%޳dն-ZGe[ [-snnܵYΓOzpr*p [X4fsy vz^}%RZ]_1VCy+w`>?0ǿ+o y򮐑w=> ?<^%ȶ3}vLȞ`b<|鏄NI?b6ި R|l]ҏ| NF䣑SdgoVGCۓz䫑K &vʴuyW fWϔehp&WNgl@z@J4@qqAJ4VgLJ7|-[x?ϫkN>ɻœ++GJ~rc@aZzȐi(Ch?*&-dTj+{՜,3HHHH`lc\*.HHHHHHHHHHHHHHHHHHHHHH'jfwWPZ*J"&TG ucZ"_Iu b};~ wwL,/+y5 yN]u"[&wݹI \dFېKa-?WT9~㥅:vZ" i!: 2xEAlӧeue\7C!dnh֤iuU% ]XXXC}^^^~8.LuMMM-EuF@"gVs 6zy@#+C+ֈD"O>ٳ9?EUW *%c^wg%d OX wePII}}$cϴ>ivϲk*+˥Xb##S8ӕ30}6dh <#j:H4 v9qHHHH`PP$9 A]]>}u߇7lyq#d{U0Ur2O }8'V^wwPנf9}^cސJ{qzEL)w*rb׸_vu$ƍ6B6gUl؁@. .,c2H_$)xJ3pfL M@jVɆ 84XJ#}Z9 d#UXQ.9xf]}k%t>mCza"&52<Ȋ5ҟd}{mY*kk*dæ6>{2I;:*kS}ֳuqhHAʗK}!d@F b㰧}W-P~|],VRθΓѭgvB JAXh<-6f0-%͛7@Q5T755iYv: kQ֠DJReb؟A!vG/mHmm@ā@)fm( 3pߧ`fڷw^ S693(oTr0+cXA4\ݠ/PqF~z̭f |w[ؿT= x'dMNCV1q~J~0C@exZv(]/??*Ug6'   O<"                      ⍒4W!'Ǣ;M #T1픢 SN'ujh]t 8Ќt-U0*+86&ۺ+ĶM9QD$HXx AAh%%!6fJ|\$V)Tx UW9VdXYge(*cKqm0nw\9R&YϘj蠫k)w|hHMx.t2iFZ!e<4!о 3Õz%HHHH&lc"IHHHHHHHHHHHHHHHHHHHHHH&+߃k{i:r#ݒWZn<ΜG _oTR*sZҗđ񊑗UzG"dmtꩧAQ 2- 9mhX)^2Ds|6ÕGoK/[Fii-`ugd6l;DSO=ALk9B*% +Ň0c$CUTif9hZ)40>iXW-4# Yȼ:00$)/$Ii[G/TF%ZWQJ2mzl]"RFa]OwǦ$@$@$@$@$(XK @ `\m6 A2U 7AԮ r760`E7q♜@F]kmgH:S5 ;a^z3l2! ZTvhn޼93 2J!Ћo(Kߍ~diFc5k꯹Rl6n iHTIN\6pkCl"H$'xbh3syB<_!>*ǰ 'v8C[ʽm?Ja>ו~B链!39tpd%enJR288="o.y +閇>^ J'@J\? @H[;'^yn} {[|;.6#8;0!͡X<̃wm4tʩ8(61vm׎mٽӶ] -45D#YtR똖\=D]L7ɾ[Տ<ҫ˽ D$@$@$@$@eZLHHHHHHHHHHHHHHHHHHHHHHH`jTC@TY֝<`5_oIyMc>?Oҋ߹(~Px}S/_h_RYN%Cuo8نF9Uao+̛0` CR%{o) UNQygwQ5;[ijj*uA_5E5$ U(2+ч`{ZG {^/ͼw((/W߉HccDJhpQj5iB*рs,1-cx+%%ӗr+o Чb m'v*!m7l\nؕc[Iz~7غ"ݸ Pb˴}C=2/_"R*GeA8 6 IDATo󋳫18L?IoJ >yׯ{3 $@ƪ<)                      NN}/|%#W^2~{߼K.@f䓲s;*v׀l>Ww@!*ܐ@|?x??p?SJ6TYTd>Kی:,(_&db En<  p{AR7 DUQ՝p P\}y*lM.ڕ:6]=w?+\{E_P_+'|0ߘ#/꾎DA:a]16y""i*H 0uWH2&][XФW%?粎Av[8|{qUYFcYFFB6i zspr.k/0MWA~_.Мjkο46wroo ~;>SvJex8 T7cP8sZg"    Iyٸh                      @&(Ww ȣ_Ҁ֯/u&$~ƙG M_@]w ܸ{7N9弇 mq]]][!S۰ah~~h~\-Jaa444؀i 0-״uA{Bx5X=zzOg``h{hK(Tf=18&sq g^GmIB}}==,J݆?+~E'+񜍔IR +$H3(àԾ$C~++[I%xNMF <=Re!Esae)fzo~KK.-,\_WWGBo\kR9j:3uZOW{iFUny|ڵzҥ>+hI F*Ł֭?{oﵾ H  +@][f            hmΟh#^ZR6sT=;C\fpC#>x}Ϸ;`Cܰ:۬lcs^wN6\Y4Vvk?hRIDˣ:: )eXr3 0ͭOR*Ԕqw;Cҥ5FܦMskvʷ+Wzm \s)Ym-0Fr\_sss_~.Ϗ|.jj/~RKKGWZFF ]_u}9._۷%p#?jq[rˌ+G \ c\V $UgtkZ[dDGesiC*nX@?U$d,(γeɰc庂f(`F9u~\7yR4p43H,,M ??H6q})nB #˻ܓt[~o3D=,Ez4X`JV/zJ[*0Fήq!Sվm_-YrS!^ĩY}*D arһ#O>XeK^gdV`|;#Nl͜yűT- aee za1"'`h4t-˰` &ULw|rݩNm%n_5@FIY1,S a2ͪci[z]g7\'%,zY>,KRGk}W]>ȕ}ڍ([_vG*  @c lח!          46ʹ]~Zz6hU6lomdhvE+t}7ܘq,lO!]K$l ^6P˕3mÿdw(vS0`D4+\qօzCCCJ` ]_٬QtN?8Poxx|JKWl֭{ٞ&qm,Fec}y&Ӱx`PۤiW9wK:ݽ0{`#-[e+Jَk*[%O| mPg7*u|W˗'W+|}P72 *1ګDƨPj )PF`^ӱוTԬY]ʾ-@ZTor{d_ a6FmHB@@k @@@@@@@@@@@R*~ꦛNsK;T}_0%kO~6;.˖KwѾO]v{]ߖSOZ;~v-7K_mʍ;<fN~?ܝ\-k̦AyD[ RزṊYҢW^ܑ]C++|S=yŎ^9H/иߤM;is~Tc/pg}vӦMN+<.`18P?Hw)ǺqϬaLs_Dʸ?4ozz-ck;ԟتzV_l֎=:T4d{6}W_}ua~X͸W\cRέWnMCZq|)6\&wY:6mR/g6Z&+G-E t,NU9M;wьUvO˔Gd= >Ԕwt@f(E=c dð@7ބ2ή)8^&s}3]w>:ޫ Ygw{Lþع m77@MHMH  4@Lѧq           Bг3N23k?s*Iv6UULnˬmm65RY|/U۹[#p]O"ȹcF_)WWRx;|?f.P 6ؽqǵFUV})4d:۽tW@PgVv];'hEۚ6*CR|Eŗ>2K2lEY[^]e*e]:=\u3(߁coV}eBW+OiqTPem-WceUT:Senhb 0TL{e2*Jj@vde\ZpV۸ϓR'Tp>4gHnmlx>ȆWU&!  _lcXf&           &p]wiM?nڗxۺa֎Οky _x__-^z>a?m"֗'Zm mw׳?/ھ:P;&`[%؇{4]ZsZЈJ2Ku}__Wys0L3P^r0Nw GU# `ϴe;iCg}|[禦C;!(&k9ġWzlX9V{>ٺP/ciM]RGZ9 J_ɎkTt P~csױ``]ɔ TdeDcl2pJeG]As= }z}@*b]k_T  ~#@f(           @6ZxzKGr\Ï5ÏmZȢ~v`7j{2!{o=!s&ۀΪˮ]t̟9Tm-ʅ+v`cX*۱o6ͼ*Nl#ν *?i<IrowuA-fۼ;˚V1bӕrcXSIvzp-[Z 0PwYb2c[\[i 7= !o6u##J&>"ίh[앲^L%>&-0Ȩ-۹G v=Smw}uU Xp}l߯-Fm UUR۽J8  ~#oD@@@@@@@@@@@W@^-NK/l/(ŗsO=uSm1:fW(F.T飹ŭ8.9S7F\ֵvm-mndɮ܆5C[:Z QwNꜭmy؝ʍ 30~Gßi/2.)F%F5F1\cuntl)|.3%BNl| gkD|q`RZWzB~\/'ɔ_Tр>,P'`Xè\קWr]tM(cQG>#I }ɨa$!`?KLa`}_u$@@;mwK΄@@@@@@@@@@@pӽH[W?ySwСKޕ_} W=~M# :o.9Kn@.ՕͮչvYE]KqԵnȂ6͎]~=TEwVnnر`cEba7rZ۲ྭOգ+{"47[ .UvUQěȵ]Xј.=_n2\nbaeCMjBSuCCcy)x.wAu9/##CƂdnǵ`Ykrr4Ѯ@쳄 _s}jN@@دbOhE@@@@@@@@@@@`@5І|9sJR|W=t|iM.:׺#]0GЍw]wOx ȋ:n~=~KZWQvmsc%צ-hve?7&n8Z r^Izxt=zha[02 8\c"5C;ڎb {7=07J`u ~ѱ`{jhd͕DzG]T ?$CA0fX(cYG S -.eU&8ƌEA41<@@y%@y @@@@@@@@@@@ MA 4>⺺4c]6Ve`bF̔pɍv$;2<ؕyx`qnj.ѤcVH2~D1Ɔ.5) `3SX99iG4hDc#M ouCCr+) gװ@@@/,Z3S@@@@@@@@@@@ |ޡIY c+oR_+jOyIǽ,BNG{1l#u7niqM]yY l39״\=p];Q{B.wc7W?pe=V5pZ4:ݶm݂ fL-~sߌ)S 0VQ%:]&2eJ:J@ ̔ IDAT6EH!ZK(d*Q!\p=fmlbɷ)T0Bcqk`c*GW9k;X)1Q ]8AԾʙ]TSsd(EuҘڏr\X+Lq-ȏF儃iV`4C^L򼞞Yjk`==:tw* 5!!   @mA @@@@@@@@@@@` h5*2 +\ݓMzl{BF'*:!o}Y8oĀEpꢣ}G^#O~*/?rxʓ7Rmv5=R}kәsFN3#so_η+Auwwl6_;a,+dWi"p )>FOr)*+nE.`k^ecBtY@J b@\i۶o_쁁(mTK bq<;2LJli}*@@@@V`"#          ; xe0C7+ӟC mP } ж 3N<]=c4~ >_pƆg.1clPM.S=?P)g_6Z[|lv8>І-` }}=\.fGRrrAYMTIJ6[=˗'.ojZ'W(pƍ߸N]+c24H   lS@@@@@@@@@@@%OՈT6PuwiyIWK*?K9d)WmJ9gN!Lv%kQR-8pvN3[+_}(|7keԕ4^ӄ֩5.q.|k=Gnn8wʋmkN޼d•9%UdVfz0GR7VfA|0놔 zQ}G,W|pcXp)kEQe~O+:8Cnkܵ,Xpǜu.kT* k~sx߰Z` {',ynTm;z   lS@@@@@@@@@@@y%pn0{oy⿩x6=56/Ye჏먩rpy^J?R!e7ս?jYX}]f|nBGCqQ^.$IR[ Wncc߲l ^Ri,%wHA:Q6k"G##ټ.u݂)X_ÂmX)!Mɂ_Lc a3| e[lQq-[{{*\tXTMB@@@zۨB           |8#Orݢ߯u@fW+L9dm#|ˣ㞭=e;_?e"ST tlo1~|RygߟRQ@5t7nz#&$칶`> ##m~+>q rF>\u.DQqP~tt;z{s>g,ІTE j~z4iw>G,:[_ -8{e} a& s    F@@@@@@@@@@@fXSg*F_\mp(f߳~|t+>>m奫kwͿ{?ZnpЫs°kK_<nE_px=~K6qU{rk͎lI,l !rW(b+tpW\4Ki c` òݰ vڔS`a bkm~,;eVݐ @@@1@@@@@@@@@@@9A96gYe/{Q׭[whda,Y?4_̑l&*(~;.^UX.Zh|}Cs^/wT*eFFFrccc; 4&`ms`(Xlii)455::::;;/^\hmm-ykgDDŽޅb̩;&w#ҺK3(u,577흰ltt&AB@@N@[|dC=6Uf           @: |‚{qժUWG5kc_v}u. PPΎ8qww-SҦ)ZGtbqzX.\0zmg>W,\)D%P8m@cAA**8[dIe6naslz< ̷1D3*︽ ]]];}mqvB?   3w_ujf }` L@@@@@@@@@@H`%mB/3Gڄս뻬7vSvD{GM :\s6*8">YBkkYݽvp/s]]k vX0}}yi%H@ڦT*ͣ0dɯ^mԳÏg>I ,.fb.ϿBu^I }-\ns4yLz?.9{g䓯Ge]{:;Kh|KcMx']KB lvS]ÿ{}p[ gʧ+Aдm1Fz>#..};hZhe:            jjuȦO}SVcNz Ssc7hcrA_eoQlWJ/j_mx޾L&-ĭjrFFErmr~jޮ]aLC:U {ec&p&fa6ln%e+luK?K|__m'4}s_~Z^5E]EF;q矿f'W܅^~ߘʹj8K4) q'D-nM.ߡ-Ʒ/vnj(}N gDC-MF@@@@@@@@@@@SL+wUm[|cW` F>iCK܅7-Zl<,6E}ۮ0j]{͔voK4>>꺷~K6qr6kC_%lƕ۞E˖qL.מdZd#;jnؕJ# Q,nM7kVs(Ǣޡbf4ۗT[؍_?*GSCC=n|Ɣ{366wG(_cϪ.3ag2â`}і-?*,@MEe pan)YPp¡GީXyX\n/oԹkk;pQ6۞/F6Y` K {۰gSilPTu|I     l#!XE@@@@@@@@@@c5=s d|Z -e h@땏gȺuKM- 6}ڶl+;Qxtq nb`¢qX0uFy a4&۪W= VhAP| ϲ[{{cJ{{^#мH    {Y`{!          N@WaZq7UA[rE LlT~2# }][|ŋpXeh@֢rVȔuR)`Gml%EBaՏE Lac`:([ڭ=w…ܼle6Z. 6R`,^bPe a.l^v݂dT]8]֏cGlLeh0X}V}^?X ꭝGE    '@s.@@@@@@@@@@@#pgGr݃st©X y‚J@[U`׷@V?ܼmmq "Ѽid ߇:a-^k7EAйvl(| Rar%@E4ݾ:[?²۰@ztɮY6ߞoa6€vOܲWy.ơf$@@@@f >\E@@@@@@@@@@ط>[0 [ ӥ[_OpO5 \aCX ѯl$-pEg{{{ג%KV%۰6ye Jaa-[z;UXl<>uwgGŝZX0 ?߷ўlVg~>؆gg?';$@@@@X=@@@@@@@@@@@H@?)/U'w+a*\Bq $²< ae ѭںT6tcVY [ aeD^X1hîlA*,Y>Іk\X{ߧ=?|>hʵYUn-?}.= 3K@Wz/,@ (}خl$g;188hI8};aH8n{a?plvLv}.3 6f1ƜB@@@@@@@@@@hm"D`2ܩMίS>Zo"vV9H[EfjѲv|m @>ukke Yޮ\BEg0-8hϴvc͜~jR?U-/Ѳvַ?Z}*ϟ8›(#    PO`TC@@@@@@* IDAT@@@@7 `A+P>1 *XT~a>3|֟$u L ТI9ϰl3h>x| +)cϷևϳ SR`2^'VmZ$lL@@@@`܎           8,SRY< YI\=Z zaG aA/| k]X " :Mc\:ϹZ>Az|{ʳNq_Ds@\NZyU57oһpsJIX9A]k~ލv iY$9[N}1O$3fH5+Zm:>l?O|^:*%a>g4 1 zG'-83IS\xS>^8R^ke}cN] ?95L)̟*?E$({?fNKFaF3\           U@lGWptІK h,omC֢u.Kb\c[9[)rn1cޏU.Ž~qgL]2o3;& [fh3y) 9ЀiZ7*ώ7lKbmdb>c\ct%awq7Eec?;~Zy e]B" u6%a>EdkAVnanXpRZ/q oUށgh3y) ɧ  *#U{7wg]IXO`q(           UmLx PUWtNB(J h/QRl#uNKɯNOR=;&+ m|V5q_@s k趾W}Mn+zm1NӻW;&a>y4J`b{MmV6Ҳ~IӐҞrݘǴ6ϸ y{llCSA{eYРފ?W~j+IXzio6Ҳ~I3 뿫1 jvFe \=nbqw;!B.h?Q~JZe{'9띰=$g]ݬ)nvm           ژ`l3f*)wimX|rllk+%kZ' `ܝ&isw=_Ԙ@s}.S _)t 'Ǹ/lIYk>Іmb *%Kǔ-|M4?IXiH̜weg-~96˂,&3H:>CZdcnV6U~a*[OQIxL:-}),wk̳ aU'VN%1Z4e냱[`paoV!K*U9Oqwu\1 >Y>[Ez'NԱS/;q?i;$N{Xa܎           & ?Uu8,&a>'5xuuYgOVe$B ri8]kn7v;%awqXF|Bò)-YT.?ju^QMKvz^9$a>CF/kMg+7|އ sO%1Z4}ڝ_+/T;2yqwSR|"s4SSZ`? CW7NNK{zn           {( ' qz{6Eh.6[ _ǕkmIsZ5n}tp>S oT^8ϫ'q_@s ݅WÿWSz>Wbis Z5-lł.viY$9[;Ac*߳'cN:>oO۽9Hc vP#ڨ:,ps*?IXa?)_y- { K6:zT*\83(OӰ~Iq SUo;ڰ6L \M$NKC\em%I?           $^߂ʗjsbm[({Ip>b뜖>gk4=+o~ wufG;9(bw6$OQ <࿭.!ҧc|昄uZhS+J%MliY$94yJ0Y1N1 qX&b!eRQޗQyv:L9LIXСVr&`wyXL%1!]]L$|w%_}qwuW KO FTҾXjU uZ6Ԥ/@@@@@@@@@@@Y`? u@q.ئ;Kʯ' pҧu~\S뜖>j5kmnS.VYA^q&ѧ* .iOUSe 5]%`NK<΂kS\1Iem0Ɲ12 M Fr> yݢڜ|0%a>C-gP>H N%1XRs~~^l'&v~g o$awq㱚ڷX$ 9ԟ'a>AlGmFIG           6PنSg*&n )(`&Ƿ('i35g]iUׅW*2{ (/lIa/W^=.X}i3pi/kuRW8 e\R`{l# .E&gɤNK{{/Ԙs)eN}П^s^{^ߨwc0lu}_8(Kt ڝIXOo)@@@@@@@@@@@P8bO.뵛0KPW?q'{O뜖>nܮ69n͈h=5h{[PbwI`8ջpfjZ|cZ/q QԚ[`(e8NKF d41Q}7^: a?٦V/lSyKby~厨|@]yOP@|w)suSi.HU8Rs(Nr{p^[L%1ZTk}Ѻ[`&;ću3gƔzy}iJ$30*DEbh3k!=IXπ!b_           %`ô6p4d4+~,Ӳ~Is4l CX_ogAYe *e{?,8?R)M' >u:int7IsZ7 MgYo mp+8bwINRJق<mD*_:LiY$9s5;0%a>j5_?%rm[@^O%1 {Kt~ǕkmXSʿU[6%a>k-\k~&`bϒ=1-8t3 _ R<т&|IKg뾞ϸ*5?|S#9U\saq< YC)6q@@@@@@@@@@@[`Q06󙊣Vmb뜖>r$7$}-޿l}ؒmJi?q_hsB㝽ZS:W |0+U~>A]XL:-}.6~I9\V~|@IiY$ƹ;^ͮ6ەU')F+U؟$3駾>jQo+oPH~ϗc|EuZh feA=8Kbә^?;Xps&Ц` >}Y?QM昄u}_ AzO`gm0{Z`#{zuZ!#           ƻ0ƮTjלs:X9V"ha:eiGBM{φD5 wj-~6y]-Q IDATNKu8R[Y?`&iY$ƹl֧ԌމӔߥS{F{cAyqbpn$3jR}C PpCO}1S-$a>EGmIg           m)+ncmڍsGHbO&moȯa1?k}XkMKn}ps7([hѻNKS%Rzu{p*iY$ƹti$Io…ӍL,0yk?+ϸ HR_l f_kfyAޗK9< 04dUSufC:~lL%1Yf|rsuT\X e % pMJEOqw_ԚYy0|u+/Q~eIق>F9L}Փ$g[3C:B@@@@@@@@@@@`? lz)ܰ7bf{#@뜖> |67=Gϳ҇}.?^&gCCkRyU r'([ ޡwtNKC*Z#5OVoڏdҲ~Isz7(ۮF6׫7ve+&awqWC)54/Ō>k6/IXπ~bv,POg6cZ/q&5ߦ>/s;+5uܢ|ڜ|]ޟcu}ݟ{#ߤɬ &tW*NG)[([0VONKGle#!           ?&јg>T9?$9-}οՈqD ?V^T nW]ϔQ` l*$awqc RZ?6_z>!?{}dҰNAV03NK5;6Ӿg鲮/ fxNM;>e7L< `/ǻ3z(hw>3IXπh? wUL%1]٤dW0E|I>\|IPbqw5qW }?P (Nt]rQÕ}U]T=I:-}zXvLg           Gkz;v>V uNKvQvw`jj>"e3ݟ=>g2ik\KkIXπ%CQ[ *T ,*&IKiY$9!_3< `/A3l2W[4?)oTN:-}$S| |WŴ_ܕM?!Gn .Tߠfޣzo6W뒰ϸ 8^}??Ϊ,քEEQjR*k[ťuK]Z(jQW* dɓ;{yf?99Ϲ|;~?vMmd5 @ @ @ @ @TU6~Dޱ6˃8~qΩ&Џܔ9ڽj=+QsW&vA++}z~9Q:!#./0TǼgnKMFѨ揳M"TvwvUsڔ׏u(DIDy~"LmI>']^jlk*?Roՙ$h~X7eζt:>ϫ'Zm:'j4U]PYOFIqieRu|56&J&dVsTeh~X7e Kom, @ @ @ @ @ @ _>9)3q2T7]߻2)yJdsNh*-YYX=Qs5뛥U}nʜjX-?_Ot\+զܿ~FѸf++Jcu*'_p,Iڥ<@u'V}R/~X7eŴhd^rYM4cjς*zD>^_}SO^*$%;(I>VڝI#'s|mACc>1=n^st^nʜ5i|he'Sm:'4{$EeaCrjM5Iy߫~Xz^t8~csUkUst%y_-o7Fnʜ5 oJf @ @ @ @ @ @kVxmX-Ș~#cC;Lq~9ozS$WϹ{O0yȺc24(%]#(I>A!N=a~ú)s-4c=pRQfU|=ܪ39qrN녕a~Xz^W7hr;6?T_^bTOOWs}5K_q1geZTsFvlfʹ1nʜc4;ݼ7ND:>h?IoNUpƵjzd u49Wͨ+UuS0:l2 @ @ @ @ @ @,#6_O+ONh(''W#"a̿0[]E?sS:4gf͟u_^9z}z=_Yo?;4Ⱥ_Y3q^1%T{vGYu܏˳^xm:siʹKzL;_x`$\~N>X:ֽؔMg&ZƯR?-Q~{Q'&TMm01X^}z=jS_?9a)<0.^Ybqo%a=$$JY8,júszA91xke~jQ&Q;ȼw:Ms lc]N @ @ @ @ @y@<|Dj-yx7eMpz-FuLQ|XZNc}RSlVƼ0ݗ7)e[NQY /N;=.$UmMfnoM`%1yOnnʜc4?(?0nє׏uvk6Uɬ7%1˒g^h؉%J򝿙KrGP~ú)sʼnê @ @ @ @ @ @=g''^fi#2V1zw?sSfܷ1g@7qyC^x8^O&J}9. >ٔ׏u6Ǥg?%+g6{=g+.%6+}Dy zeݜw${bD~X7eβiRv주.']m:'5.`,މ/'c{m2~C/u|c5;.?)Q~_TnMd츉63:˼*\!@ @ @ @ @ @jˠ填&LX{q_2q24=J_+ǜ=Edy$.-9v]aݔ9F6cM1*{/qĂDIqQ>'~cץֽu5/YA'%.O2;stuS4 )l-aDrao0VrΜ^u|W#b2+;bğ=Q3rm_ۮsw[$Vu @ @ @ @ @ @ @ @(O @ @ @ @ @ @ @ @3B@qm @ @ @ @ @ @ @ @H}@ @ @ @ @ @ @ @ 0c$ۘ1F  @ @ @ @ @ @ @ @$ @ @ @ @ @ @ @ @1m̘[m @ @ @ @ @ @ @ @mx @ @ @ @ @ @ @ @6f̭Q @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @fd3V( @ @ @ @ @ @ @ @d @ @ @ @ @ @ @ @3F@sm @ @ @ @ @ @ @ @@  @ @ @ @ @ @ @ @# ƌ6J @ @ @ @ @ @ @ ن @ @ @ @ @ @ @ @lcj%@ @ @ @ @ @ @ @l{ @ @ @ @ @ @ @ @`H1cn @ @ @ @ @ @ @ @H=@ @ @ @ @ @ @ @ 0c$ۘ1F  @ @ @ @ @ @ @ @$ @ @ @ @ @ @ @ @1m̘[m @ @ @ @ @ @ @ @mx @ @ @ @ @ @ @ @6f̭Q @ @ @ @ @ @ @ @6 @ @ @ @ @ @ @ @fd3V( @ @ @ @ @ @ @ @d @ @ @ @ @ @ @ @3F@sm @ @ @ @ @ @ @ @@  @ @ @ @ @ @ @ @# ƌ6J @ @ @ @ @ @ @ ن @ @ @ @ @ @ @ @3cvj @ @ @ @ @ @ @˔3ĝʼn .G @$0_7Ky @ @ @ @ @ @ 0l$^ڀy\J @fMpa @ @ @ @ @ @ @@2?L}z?  @ HQ&@ b IDAT@ @ @ @ @ @_ny3pciH @`f ̙Y۵[ @ @ @ @ @ @ QWY:JY[&)Y @z&0044ԳLD @ @ @ @ @ @f;y-qDG|2sސzKkTw{ @ ݺ  @ @ @ @ @ @ @&HRowX~y~]$}hǟ+GﶛOlG̱$xbH_PG9yJ&(I0*%'eTDI1^cN9:ޠr.s$d^iQ~g2%s7%{կ[3yKuJ竾Twu @& j⭝ @ @ @ @ @ @4X1~Dg$ID=Fy_%Mh#|ML%(I1N(c1{'>k^cǒs;$%1x6M*K⒎%ˉ'U<#\udkϟyt$@L6] @ @ @ @ @ @h@+?aE_=F46vT꟩K2{jɘs}Iѱܓrm;ݹ8:uofxS9-wp]X\:,NK_/kTw{ @ H[h @ @ @ @ @ @ $$84=/úCkJu*2qIY\^$\:}7J9QT/[#eww8wG^8:''e 7gr-iƱ"OxtD=U2߂t5Tei7N;$_Hqcvg;^# @`̙. @ @ @ @ @ @ 0> KGS囟(+McuCm{J4b0WQܻ6yi߷WL"׭hoJ_j̹gGk'W5?>UJ$xl1k2_uMf2;GV3D^>1;S_smzPbDIDR,.)nߑ 0-$ۘ& @ @ @ @ @ @ @` z>utb~M*%Hg9CUϥYNK"zƔ{3O5}=}pDIbQ^ܘhCR_1r\IV[^2O6jͫ'Gڲ/g;S_:evMwA l6} @ @ @ @ @ @Ob+%QƧ:91$JQsbd 3.Oel[GʩvyL3J}J]yƏ&hwc/:nIuJAz.ny?''JdrzZMx& @' Fn @ @ @ @ @ @ @4X?qJ=ľ7g=;Lߏ:ve󒄢$rsMmxm*ZW)VYqԫ6v9yUeLYvK(n3sZ\NR^W^4e{2K>mL{i' @ @ @ @ @ @ 0uRVVsW+%_$>̿WWZW.ˀ\ZJN "'0:w[Hpc׬.L\U9KU:UK#qco z=_S]!P%@4[Ҩ @ @ @ @ @ @ @xd4]So/J|k$}f}'$LE"qJu`k̾ @& Hg @ @ @ @ @ @ 0SVN`㝒ml;&Yčc]rn/]\R%u[wל{DYC}L|#^T춝~kK$wJ<|$ة<5k%h|w{ @ _\ @ @ @ @ @ @ @Y'ܒcEqwv jGw% 6N{YmLi>C_TNOdw$ŅO)ākUsDI1 G$*$QoOX&,j\S(Cz5_]$@4R@F6&@ @ @ @ @ @ @.0'ĭ^D{v/ $vNt8̷ݟPnWs+H*e;*}KCs!1Ӹ.oJ ċÉ1r(8NK.Q|T˳2KGkTw{ @" tA @ @ @ @ @ @] Il$8'.N5OONf%I:\sX]R9ON߫hS;>.4}ONR^^Tw{ @ 0k:l @ @ @ @ @ @ @I@qg( ':&p{v}Zbkrڌ;0?9qL]'F ᭉҞ`yy['F6%U=}Q}|k?^# @`:H1= @ @ @ @ @ @ @qayrHc~]OO'?5Ƙ3y\$Xր?7se+ܽn-K%(B:SپyyVDrg }dEsҵuC`m Í]S)5xhgo;w%@t'PCY!@ @ @ @ @ @ @` !'v[%},}6/۴ @` ̙F{ @ @ @ @ @ @` |Gm}-=3}h X >%,n{ 4A g zC֛y/t]($~P @==4 @ @ @ @ @É6Z7j >w5O{g]rfErłLYdeg']a}T#F t}sD~:}{'YQ%NXa. @@ck: @ @ @ @ @ @DCwuQkfl}I  8Wf+gupc$s7&ا6`yگHb;j @ HsR @ @ @ @ @ @!V l]{6pcf@&yTb 7j6\WN#[ֵ/{Z& @/mդ @ @ @ @ @ @`z Tm,un\5eϽfϙ٬`KcvN[CP㒩̚i=f/Uw>O/&ZCCem6'|M6nq'>k?WIKWpމ{Dغ!qy'Yc_2H,L,K]cJ^#EU9P^QeEբ?ĥS3Ģۇ'vKlXhʱ'e|S 7'M\h)+W|T~w~Zdgs.\m٦,[n|&>g֬YK-Zt+xrepp|O|K.)._߿ln=e;|>qJ^c|uBD1Q~)> @_@ @ @ @ @ @ tIܶ΃Ls|[mEkwj*6gc5+zYpᬛh{>[ok~ݟCi+O|)58_1q\b29{V9;sxn7ڍ^Z|oL71/ѩ,͸3smY/: L_%)Q]dȯyOsr }EDyy2}ėiƻO粦eGWzvf˳7'$^(:_gsfU/c%L'm9?g|奩8ݑcIQ-ϵt\?ɓLtz&i0csϜ_ɱ9 YBsJyNKߏf3>@Hi Ǯ[v}ֵ^ۺ^<'̛#lٲeoUvms=Neu|_̑ǁw\^|e&:}6U;c}[hu;4S^x8+/]M 2fM{C+WRȌ'X+ @}P @=(P @ @ @ @ @ @`ܾdDsIϡkm`56ܪ5848CCRq`֬ւEfݬCf.xСmW{{<_/ovJQLfƟ<`A%H%o$ f!jkN*\szbs{srx3~A\q%Ȑ/%~wq*{anVk0X6rUU|:\OTs4T_)ܫɖ's{^z<++򾯖r緫Ts$((:%(. +IL1~V:yYo'J/;,Q>CHlB`J /gKg׻曷-ZT 'X|y$ڸZg.6ZI1y;\0;k~_>-YGWOِShߡyyIh,gJb'.˵ةt}SݫYZLRߦ @6TB @ @ @ @ @ @3@Ov5pd:hc;6e#ѮcbգROֶҚqe<;oʡgWמ@K)I_c%^Ү?'J}+Yۋ3dJyеܧd1739W--W=0DskLLR|3[١t8'6!ʩIL暵~V͒$F9>1ĄJ6Jӧ'DB!0%3\X=Fm.7Go;qY/]*emd̒;4UdL%d.K&{ @&LHj~ @ @ @ @ @C`hhCCwMY.lm`yZsb8F%J2_92[y8:.}[n}kŭEW4zj̺GmlI/ȗ$%O&N(ȷliW%RbLD̗sJRw3yS-G^vIpN(.(I%ڥ$N1^↬$+w‘K$M,N;QX.PW_/3cz*)TޝK_M(e?%^G]vMSrV:JTLc3^mzhە1Q#%{ĞT}4[ZX%c6+k%^,Ir.KӏLىj۬M瞧^GI`|;&VK~]A+_MyLRs5;C>QUKޘߡ3A5^_"]>*qD+k%eN*βT3)婩nxISv^Ukk @z"P~Q @ @ @ @ @ @ 0V.Y<KΛvo6 wmmֲۢnmm6<+&FGZ 딑Vl-UZW=240<:\H}Xk;F ה_L幊NyhDzXLCyt)O_6xDg%%9g3{r,e~EǿK_yZ~:j(sJG^ܗ%_iWJI1ՒmTYgS^w~gO\yʹS/|No9s'xm!'PZ[T& F\dszeLY[7CđX85Qu(cʽJt*nSm5,r:ÏJR!Wڪ@IX^.fٲeo5gΜZ7pp}^qgp~;.?$eg'][R~)ߧs/5wF:#wJg5S]vH|޽ݑ9\7\W~\J’].%ING @@?5I @ @ @ @ @L7 ˲Nv)C+~-\ZtInZzUkuKcr,q׊VuZv뭓]ByysN\Xg̭DCri< )nV$8( 36F\I8qoG;TÓk}ify6FKy<5WjԯL)ގYr|a.c^iO{D5K|ssMYSTN}cu=vSYGvʼ qʋM8l>¦ʿd%6F+(1ڹoZ&M.;{hk͞=n-ZT$6,_˗* = Oyj񴏌i=谜|XS.'Jsc~>?Z;%9ߏv<$@4^@B @ @ @ @ @ @v-N5h()&\ 7Vܱ|ɒD%FpK zֲoJ]'h \65ؓO>yA<{,ѵ!d㖌)^> 8dOMQZ|yruƾv}iءorq_3KW&&WSO3ϘIDc3nuQѡoSwַiUƔSH,/͹&eB6\TDu>ΜZ߼WIR{~j EOw^Nדlǹ)DK.b~gНzs6|~$(GϹ05;.{|]Kw׸%cNɀz>7w#j^擕%6YJ* @~i- @ @ @ @ @ 0q7 we~[V7C/`m+ 1[soj%@9R;/ZZqm1w~e12080400t[o񓬻$4h'+#k}c6ђ1cS;\ZmTaȟ2փwߜ;7^䌝C#wn&;2z] |8H,̱@n-%AlUw掉#.ח3ɕIߜtO͸Wg*}Ϯu4;'|"t+]Sgo>1ߺ.q޼y%ap?~kv=c^Wi޲`?Oz[^xaIn1^o>n,߇oPlyf#};4U@3dWS @K@u? @ @ @ @ @LH|Xb[/^yι[y粿̳s54gg[.Y=48xǬYs|/Ť_h P;<zQo}ͷd@?m<¿IZDAdG$&lr$ʿe*˃{%J'KٝtYMU$pJWml;/Q}il#9'jxRw81VRk'Ч nBbS~F_(HB+;͓qg{IqB⨌=Ӹ;EII#Eq(\ocZqY˟Z\7Bl @ @ @ @ @֪=;iI˗Vݹl8F%V^ZdM8YܳDy@tlꁵ-IZ19ՉkzhkscuwoN}S1='prAe9^:, R){i:Kj ޥrOQ,k]2K"td2~VVda>p[kҜjb:,Q g$z$8"mYs|%9Y9;ڢKk}6ىumt0.飉'%0F @`FH1#nM @ @ @ @ @ @ QMbyk;ZIj$N1:}vגqM\2vYߪ 6nX?ubsd6ƚ/nȃ'xj⒌/{:eP]KMc_ IDAT8Z;sGgW%yk[&3aSmTY2krwguI1Dhc&wܮk;4Y;tMy'&a. @/ݴ @ @ @ @ @ @.pDna哝kqeߡ&LyxksmH~ow  @`Z ̚) @ @ @ @ @ @`{&F5šUwPf?m=-}ה(~ *~"W&{V3xg:uJ4qtbD].nXge(NRLS*aoWէ}ڟi 4U,wdM}Tbe9~sw 'ߚ'ټF=Yu=,D/+2We[ @*0 n @ @ @ @ @ @`j1pc`͙֬5:_qeK:]@Ð}IVy㯚" **JP5-h\] 3Lk*QPD 00=3]3=՟UeZMv1~iՕncvGv;)7o/KCbN&^xTbз.°E5U~ H9IuU}0WWe);tX{L:v2FflN ~LgܒDs+ "gh>;/`=,?xf @y#PΛ( @ @ @ @ @ 08ʂУ\c.eK)C]{)ڭjt]/;GuO+n Wۼ29O/D5s>6T}5 4$WisX]~F'=>ۿϷlD榿fU I+r7"mc13KW淶,ehg,34,o+~7(94}bTc9H9 @` tG6%@ @ @ @ @ @eƐU&Fń*wVS d;T'ʗ6OsS/g"-Omӥݥl.݈MN\uwU[6xLu8^?)7}~ hu[lc.yD 3Vgh#xkQN7Hyw @*P^l @ @ @ @ @ @y!ɡ++NgaUs$WZn(^4c-t.,eȥgd mۗT[s1jNSN;%EH~C?677ڕE;?.ӫ|ʽ2Bg\]jnZ+&M<0Q?gHeэ_mbb6 @Xlch>J!@ @ @ @ @ @ FWH̄Mɲ &kS}&&~R5~`54,.4635AxUf,Ke˫{u9.tdE R;ccvi729@ʼi \Qq9gG~ʵ~Oc&nH_f_~nxPҏ^FwU^ 0"5 @ @ @ @ @ @}@uݓvU6n6N6ظoWMga'u+'<[E-K^Q]UoV})rWWee`I,?.bjËcSOTUeQv39gYmjC 94qUg&X_&YS|p˜~4M @/nU @ @ @ @ @ @TU)@7>?Ww9u[s8a9y~Wee;QeUW~U{szl1LeV\Z%[@^;qE>jV7sSyQIs>QVeU 6s=^ E l<Θo}oq3ce~Xgm[MsGUG{ @z^k C @ @ @ @ @$L,@*b˦)xz3IoT?ʺfӿ2-]*_\e [j*wUe)88hml K}Y\bж2'O֩)v&ΪliU]=QvM_l{I֓׽cV н2+sRfU`6qǧV)ʺf,8!GW]34+sWevk 0=zƽ%) 5wĦf:uG%_/tIltgV/^ޫ*_/.UZo?o}&@؆/ @ @ @ @ @ 0_ɗ~K&\wɗ^lwh#=dD( Xt[)/8*Sbs$H49!iN^1V_L].'K=uXήᵝL]ޘk?nMD~9yV%8yspvE;'I[MԋS& |e7YWrTUMOgʼn M߲pm.D 3.IץY]?s_Na&M&l˒8&绹S03>/w'ʻHySb#LYsFSY?ϛfG  @%= @ @ @ @ @ @`> dO2)qIeeчJV58<񣪮3*z6}{[VI{w)^q9oוxumbDCǍEvnZ14ڔ:I}z,$Hc')YL.ߩ]:Ug%&۾GOd8 NKQ]ڜsKdE_IsD&~5qױ3"0kϸһ&, clRƶHE^ͧ;o{&(~''Jzƶ\9Y>kLwfKDYtʜnK~  0@~+f׼oRV~Cs,@qX\IOi9--X=[eLϴ & @ Tb 7l @ @ @ @ @ 2+/d@./k](;^~'@ @6^`Ɵ @ @ @ @ @ @zO՞XO#8w=xpsUŲ*\ƕ=p1 @ ,>dC$@ @ @ @ @ @C&pCsTcLf;gqi(_*%o HU&K @l@! @ @ @ @ @ @`> V?*(Tޫj*/KY\E16 @ @ Xlc  @ @ @ @ @r몫 QM& UZ'_U,Ywp]<OK \3]Ξ @9%3w*g"@ @ @ @ @ @M\h׳PUR~}5nݶ:gfQ[֕H]rzY+&l$ۺ=ƒ @ @3/`7uF @ @ @ @ @ @`8'XrWW:$l+9wzi 2)sz| U @ @!`s( @ @ @ @ @ 0'$Wb)䲴J4Ӝ 6&H['j @8Ew  @ @ @ @ @ @s#2\})'H꿒xf~9B-[3֛ql=߻rn/UiS6 @ @`Y: @ @ @ @ @ @'njwO-Q=qX2(~ 仺m:p(L9~ޒ @em2 @ @ @ @ @ @ @ @ @YF @ @ @ @ @ @ @ @`AXlcA|I @ @ @ @ @ @ @ P,{@ @ @ @ @ @ @ @ `,`>j%@ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @Ƃ  @ @ @ @ @ @ @ @b @ @ @ @ @ @ @ @ Fb 6P @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @,m,@  @ @ @ @ @ @ @ @,;@ @ @ @ @ @ @ @ `,`>j%@ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @Ƃ  @ @ @ @ @ @ @ @b @ @ @ @ @ @ @ @ Fb 6P @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @,m,@  @ @ @ @ @ @ @ @,;@ @ @ @ @ @ @ @ `,( @ @ @ @ @ @ @@ ~wIܐMq IDATGeo#@̈6fI @ @ @ @ @ @~ d2r}d_K#/9gS?FoF^ B @9=|e#/90) )8uCU콫'y;n],& @ @ @ @ @ @ zFo%g^Ffrᢜ}$+5\HK @`! 6XHocnrLY\'S~7{ w܍v83+P'F @ @ @ @ @ @, db@Ļw8-3xֽ3l2\q6* /% @ @ @ @ @ @%>oz?>yhhuv{tHv%K^@GsF5};-iuˮ:vi-_Dew;4zDm tu9Q8u)I1qQF L!  \b ` @ @ @ @ @ @`?яW5ϣ-]d;yV[mZ|eon~ʕNSl^ڋz S2 m ɇiY`yuhΉx^Oh5Q wݡĄTtuwۺ)"@`{(+`8 @ @ @ @ @h&@6FZ~ŋi--Z?Z'ZzS~nWt @ ܫ6*Y @`V,1+NJ @ @ @ @ @Oa{ܲ|=h5+l,_j.]߷~-:lv㍷|z___ؠ @(u5+UY߲v\/N,$@$eciTB @ @ @ @ @̸^8`ʕĪU#tr-ZnU*ާs; @Q`WW~gw\蟀6gJ @ @ @ @ @ @` ??$}{k]ֺeVtN]ٗXzuaZjYy @3)ЮN @fM`ɬى  @ @ @ @ @ @hre+^j.X϶\4:zܫ]hnv*ueٖ.ݴu{藿mXNã}w'hQUgc{$2kW$q\ksn]7%.I\u:r2wͳ/)qU\gYjN3s⏉V⒌i0ţ|H=]o? E6ޗ\sǤ(c+̍8mL&pJ{/_GYdl#etvE~SMtLQ~3~-,ry~g,^('ʻOyG;aYx }{4c~`G`mL @ @ @ @ @ @ޫj.fU+ZskѢE+_q b.QcVhmrcXIok8CNs_U<9q@bDִR*%aisDⅉ%m+zk*-׺[r\dwei4(T7aSn|]屍3==]R%^(/t~voJř9fU,mʄ_&WrSKTk/*fǝBsKWk'L؇)CRΜOk9fy wJ'Swhv(nIwSmt[ڛ߲y~EF\kYϗHf܋^Ծj:n[:Q~3v45V?YYWyyi}4m(ϑx[#S~帓r\yVvz!Ǥ ʱ}YGz<û]>f,N 7F =e @YF @ @ @ @ @,UeLeάSkٲo_n_u4۔t',٤ffSX׷~qdԽMى$ /$''1Iܩn0Q>L}Qn xV9oMߴ>Ѵiy(',+yⓉomtbFl5x]b6R*U|0sRmd[S߉u1w~'L6,D)+2!mL~fxxge1%-?4O\-g9o#rL>)c;8qv44iizBU gq4&f]~ߙ iZb{ءx~g;f,$>hTyfEޔ,>v٦+3/(ަu5 }f'{n=w9{ϝ{Y ̈xS=#'w @ @ @ @ @ @`p?MܠKVg[tikʵ 5 2aE ĩF[lֺ$}nnP>izrdg)yJ“㨌IhL%@Goxk3n/ =|)q z+|9[*ng'+SV&^)vlוcӲj|j|V\\{wuٲ LY,2i\}f/}?)On,i4ֆm?֪=->ҭZq҄6cE7\8an#k>/ǔgdYg*ϭ;6ӗ$=vCX`BPeᑩneOO'zg0']{Za~-#+/A`0,1^ @ @ @ @ @ @XzZd5}YrueL\Fٗ--1:ΌKhk.=eR* Kg?H^&>8g'I93Dd>8?QUX_&-\ 5ɔ>BN\(&*Q8S7H[ҙV>&(xNmbDg[_Ϙ˘g[o.~W#?a29 ϫ?IKۺJjH?(ߡ&vMxFyd['ŧKf-mvT}89?o!]YD āʼn5EBi ]tueَK~L'hK*/[ 3|J/Yk"a#0 ht @ @ @ @ @I!XZ2S9Vokxwk뭷27!,Q*;/[‹~ٺioӚ)gQ{{19=qu^ȯL2󇉥U{}U&Dy,pD`bF)SK)D<=E06rSRDsA9< m2j%đi;$_/H44 \oJc{MK#iRqy]Ku?Ϯۗ|y]vTՕ ؗVe]9,F/rHlM2mK]Y"g0c&99s+ ->Gwc{n)niYqIX+pKg'U_SQ⶧^vmkOlNиQnv7>S{,pX'_? */{]՝'Wek9fcWTc}Y|~Wc6MFs{e{cqS~֕s܇{j\_uoL^ qO?6}I=wmߞeP'cc{_SN`s'qcߥ>gӽyG`&~;= @ @ @ @ @ ?ѯ?jUW{%ee?ZrjȚo;m;e˗jq勗t[6[ʦyM. 3.QNƁ KIOjH^h,ff:ug&fY&PWeW&tα v1(ɏI?:v% (L+G\ܞ1=YHHw$z?jsFBUȾ$yQrevH,?y^?/BY|c{Vƶe#/I` ,iNj[+Q~&5'͜L0ktmC5w$_{,QڥWٕgK]~3Sݶa{~?w2Bm˳ى_|c;,~?Ç>O{O`qX4Nb @ @ @ @ @ @`FwoR]V,^Zx֍7lي W)+fn{7fnhk٦[zWYG~9w~ZfR;O%kReS+ni4.^ޥvk2/ɗLAz@dtʮ7 WmikGۚH嘲FY-mxICRNY'{'?{X2_ev9&9GǬ,.Ľb웓bt+m`oθ{'qTF%Yvh-q5ʺ%뉸_tk8et6з7,jmߥL/{Krhѯ'{K^!1閧 ##S&mCŋZRM[oֺ'Y(QtK^>)[= a|~osIgb;&@ɻxHb&7c){G9ɏF\',B+0R1b?tkMwǫR~Eͻ)"@ {aJL] 6hu8zYͧҬ<OiO6)Kh.<5wM|6ϲ`-צm d>ak{\eKE=ф @ @ @ @ @X_Iw,YzjtkFn,|M~u^lE/o)7G/~̄25$^{uX)U5 }⛉ v`}l]YL)1hmٟS.ʂ(l9)XUԱ5u&\uGig+yY{N^SڗGXcO8:Udm.]TD 8+xXC$>c(MئKE@`xէ=w0zϝ;u (0hc5#@ @ @ @ @ @-_;{gZ+?p-dm/^i+Zf_InZuKk;JWv.ws^Q{f\2x5%y*_ɖL {'IIl>lj'ݐq:hS#]'OKswMٍfYLҟ5of#4}CYz}t_Nen x orLi7-/4COO,xxlc%]ycQmtyc-Ly_0F ~w#?^Ub\<Ç>gS{]+4es'c%s|}'@ @ @ @ @ @%{lVxʛv[rL/se,1Wh&q~2۝\.eɚ7oHU>VN%M5vME< 1-[1/ tzbh쿕4qN~6ƌi4&"N?umss)#@`Ċ_Fsk֕ay~eRqAu?7"$I|=v]noGOl y.6۸ڞxA%巬l[?kYᲉ7n˳P=;}o>˳,{Xzr$&vN&:@ݜ >}WL;#;/KbvoǐIDAT @ @ @ @ @ 0D?IebKvY}V{ŭwy V uniÇ>k+x݀dF }h睌 )+ @ @ @ @ @ @JK^WrAХS]{)ڭjt]'_&fBj8e,{43uWܐǥ4I_>Y#oLqLt\av'$n|پG HLW{_ qws?6Q'MdqS9,X6n+Xn\xg'e}^/[=\_]PJ|*H @ @ @ @ @EDzm/ٽ_[oJ~Vds'y!__΄[hۦKeK\:Ջfqٹ:wU[6xLu8^?)7}~ hg%[۰ \<}2 Y@mr.% /ۘ/~ @ @ @ @ @ @SȤѲOX{> " L߫b[Tef~4xOc&nH_fʾ\nl/7?/c](,W6d.}gi%{H89?歕 00FO=uwa['8W<{SYp1{Vy9gP's1zϝE9?fqDNMl ?8 @ @ @ @ @X߮~`&ISNr'V͒?*,4hI c}9gsR&n>K%]h|Nb*+Ǧ,\5Y=m]jm\,rTݨLY8u6UUIǜ E *}|`#J< ץCθM\11ę[ylseW 9wNAu9l~?Ç>/}\hˌ  @ @ @ @ @ @ pz>.F{W9LF*;;`rjtMUwsߏuT~h/͹QKuɽv }H*?n6F͓.|b$_'.lZ:{zR 0eNv{_/1l3qOum UY';ϺN?mz3|.|}-:׫yUjv[ 0e @ @ @ @ @ @21L8Fu}U5me[TnBu{ڝZ)ʺfsRqtUnשCUpkWe]i]*>XܥAY\bж2'O֩)v&ΪliU'h욤' ד{9Ǭ1kpb_w,46wKTV%5l+S1gU5vۤGUg]˻CIiuv釷sgC1CqjfQb @ @ @ @ @ @4=YY_3-u=0 ^W66;-ٗE[+ʧ&6m6ө;*zqKRfɮKY߄X#{ӰL%u,uāU2liP&bwch.Bsu-U뱺>_̋h~Ko({P~wMUebs|l{чWj7YotW'kDyaO;@ 0ۘqR'$@ @ @ @ @ @M &˄n 6<3gbɉ;%K<'NbDs1rΑfa'._rW$K7ql}6qDg[19͝UdߘsO,'m'RDs,;w]9c8;$-u&e&z-e/nXu?nUf3} 0+UL~C˳/$8.wcm;Lm'SK8O1zww;%H<2_8"ܾ\5;;L~?Ç>믃Y}PYX2KuZ @ @ @ @ @ @@ d2Uݥj.{YR\]W%sr祪,IIZ9O)+q)N,pX,XdVx~15%?H[[eSe%&۾Gid ǩ?-Gu;?yɊMN=;wM{2c $ o;%#?~sCs)6B8ܡ @ @ @ @ @ @-n1C,zQ(q~^Li36vA]eEcqy:)m9gcJE=~D||mWo-T2ϥ'G6zN>[']zY(&qqҮgl˵^q5J漛_*qe}c}?@hFm#qlcCXݳ%QI"dߌݭOkݳnZ}o[8>76sgu#c#pfIb @ @ @ @ @ @ L6 3m\3\(;xNƞ @@s{Ҏ(+ @ @ @ @ @ @X+ m\ @s̬6f @ @ @ @ @ @UOd  @7_fUb @ @ @ @ @ @EnOm%  @;#a `>  @ @ @ @ @ @dM:=JzӒB9ѫ;  @ AtAX2h @ @ @ @ @ @,pXLF,}E6mݞxcI @M^bs @ @ @ @ @ @@ʼ&FGG/^ @A;h 0Q#@ @ @ @ @ @ 0CeD|D  @@)`\ @ @ @ @ @ ǹojm0::zCJ<;mFfK .` /|~ @ @ @ @ @ @vmNt(9ksK6 @R{t9$ @ @ @ @ @ @ @ @U7m @ @ @ @ @ @ @ @6l @ @ @ @ @ @ @ @Eb @ @ @ @ @ @ @ @ Fb 6P @ @ @ @ @ @ @ @m @ @ @ @ @ @ @ @,m,@  @ @ @ @ @ @ @ @,;@ @ @ @ @ @ @ @ `,`>j%@ @ @ @ @ @ @ @؆ @ @ @ @ @ @ @ @RnMFIENDB`n&& dK1PNG  IHDRiCCPICC ProfilexTkA6n"Zkx"IYhE6bk Ed3In6&*Ezd/JZE(ޫ(b-nL~7}ov r4 Ril|Bj A      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy{|}~4%UN$As{z[V{wwҶ@G*q Y<ߡ)t9Nyx+=Y"|@5-MS%@H8qR>׋infObN~N>! ?F?aĆ=5`5_M'Tq. VJp8dasZHOLn}&wVQygE0  HPEaP@<14r?#{2u$jtbDA{6=Q<("qCA*Oy\V;噹sM^|vWGyz?W15s-_̗)UKuZ17ߟl;=..s7VgjHUO^gc)1&v!.K `m)m$``/]?[xF QT*d4o(/lșmSqens}nk~8X<R5 vz)Ӗ9R,bRPCRR%eKUbvؙn9BħJeRR~NցoEx pHYsgR IDATx gz0 1}mDAf5DQt܈(bvɮ+'"p (s00WL53#-Ut[+?Mt[߷]5ӥ/WmmU4>vqZPVNh>4uۭnEfCrVC1}!%:S\u+W7SVnL)JՑn6Sw5̛pnzx4*ۗMՒPfuԠZ>]ݾ6.ZퟜޫnU:mT]·Xgrmx3Θ7EDGT _Z;?A[gGTj\YY) <'cJ.]Oժ#^O^^iٲ5n$'%ESCy/?/Nj#^^/^${7#G*}N-zE6lLg\*(++swk^:vݻwmһ>3cϗ瞛/&R3+&On&3RUlڴI;F>֗0?郮?k_Q*(..'PQ&8x}5ZufqwZ{{+_1zްa,\3s:tg͘/Z ޙϒ# {dɒCO=4Zy/ѣo7.]Dqq}>4wŗQۑ#Gd VS<_}u"n*/̸ ާڵ1k}ْfƇ?H^~Uv g|YYY}G6|m![XCzcjkjj|ڵ}AG[Lm۶;q802x}vukZ|A޽bj8p `bnܸz34-xIJJ O>1:5*x?XOG>qco;p$t-K#^1>%xݙGs7}K:K~iՙ6%xX9aFTFg ^P#xa8%xB5[T#o3M?0SK0q 6,bSrٹ^RSL+=a?:Uשn^7Zb}T׫o/ۘ<̩RjnlSΜ/ũ9̩RNxvM—Yέ% ^[=^%έ/6xu`)Μ/bUscf@H:@:"^u ;x];}999tnbPEE<];U]D?%\*%s:׿IRR|ǜiٲ7ر?7)EٳGny)%xIYK.c&߸Q'^ @ <~u._$$X[[ G@ ۺu 4X| @S̪@wKB=>g/= D$4ZʜC#X)@qe  |C  |Z@)@ @#@FǕ" R I DG+kE@ '@W֊ @H7$ O  7:@oH@@ :ot\Y+ !ߐ4< @t踲V@B !ix@qe  |C  |Z@)@ @#@FǕ"p*|re @㟘Cq,T݇FaD@Nkm˕uj + z!.s߾3ٓ}~sRWW'@Jcg&KGIIIrq]r֎ p& 4މ&KJjJ# 3 ۪UVM8@NzodƴF@ ($x„o@p7|gZ" ` ^݀eA@ 0"@x 5Dغ:QjUEEdٲ7C-8 G1.}=4[j[zZ&SZZbR]ScBIrsZm=<벫=k.IOK3n;+(ȗ*={W[^^9]{ _^^noٲE*@L6odEFIYܬTQG賴OVWܨPkJ7Q  99]d^R}@L|z}IzO=+(IHvv!jkd/~ufg2w5.= 6\.2DZhaLmr%''ǘt!)UUՁg_ܳʦMdZ`şoҿq˭dſ.}Vٳ7#G_PCEEE2ud:tWJAGzK^5z4֭1fv!?T:?-eoҾYot7um ҺukԩјW/gʨԿSNNQaxBZgg[CڶmgTmOz{ g U8=@,— @ 1;@_@b,@@ |@cpC@e@@ o@—m@ 1;@_@b,@@ |@cpC@e@@ o@—m@ 1;@_@lj.R۝;%J `FJx YɺC7Rv#>q۶ʺuk_Me| fԱu>เDݪto@L755w o@N@7~WN)A@4Vm D&pk'|#35 A'&|d  =;@KM/  ^ݕ?>igW$<}FKF6u _'jW͡nnעClٛ#GWW]]呗Ӹ֬^-quZZZb=R]SsEXnVwƭu\TT$UmgF֥ g֮T5o?V["eI&aMߗMѹYYyעE qV}rW>B=|@8=#?.]"|47WM4rzR d)F}HeQ#o/DnՍ'^8|g2o1b{'Æ ˇ IєW_^.t:fzXT L^_jĻ}V6m$g̐֒hΟ5R #nU췸xlݺU[ˇĿ ٕS&˕W+R2 :\|ګ2e4޽1fv!?}u@tdi>^z#uψz"jkk6mHǎ퇍o۶Ts.]ϚSګg^FXEde_yFוi?l}zz Y׮].B;O훺iݺt.׈_tɨ}3)TsNN0#"=zHv쇍pZm@@ |@cpC@e@@ o@—m@ 1;@_@b,@@ |@cpC@e@@ o@—m@ 1;@_@b,@@ |@cpC@e@@ o@9}5GՋ_wn_!p: }z P!| a8^?_U7 l  DL4h|q}ֶdݺlgGZ/ Kw^(iiFզWOjjjm>$We N[h;Q帬{{>F݇Fk2.]Kח(&hlLHO;i3{2.]S>Pu4v]M j7ɋ}שZbbg.]XVZUtw{s ȣ{b3}G;5Wï[nw+b }4~ߌreAQݪ e2jhzO5K,E,,Z"QN,q0K?lYf,^4=_ϮF >fQl[d2a$KؓU7$7Z]e]p2;vg}6U̸|[:x+**$99Y^O]J_qBͧ['< M'M99]t^R}@L|wwޣرw4]k<)ܷOnmt8lILϒǷZzdAߊqy饅7r9}?}j?'袋U8Wt7> w5N:wr f&Mlԯ.|QY1cJNN[I&L'}oQR :˲M͟?W~}2C5TPT\$=\zer/֭ޑ/QGK^`L]v!yZ**x]sLѳN#[j%%tCQ]z3f;u$稝ܤs:t0j`ɖJ*++r؛׸v/tiÆ ּ [eJJJ %kؕg_%-55 3z2n;;x`TW3WIO7mj5LeV);v0l6zꓕi YRI_*x2S D5\- 4PymU]5l&x*"^_ڔIi3LQutRjuiHMduPO?0o]kUDu+W jTCg5MLrT!-١kL)L[[2BfL hφbVfTJN84q*PKjIENDB`:g(Q6   t { Excel.Chart.80Excel.Chart.8Hhttp://www.emsl.pnl.gov/docs/global/Hhttp://www.emsl.pnl.gov/docs/global/Hhttp://www.emsl.pnl.gov/docs/global/Hhttp://www.emsl.pnl.gov/docs/global// 0DArialHlhhD-3 00000lhh DCourier Newlhh@ .  @n?" dd@  @@`` bZ@     }`b$a]*fߠfNVšX~R$r*~95,  ~R$b:wQB1mR$sJ8\gR$T*QerdVb$P{)[N:"!b$F-\E/l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB` znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`08n.)HD}u!DoaxPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxKv2.wi0^A+HX60 pVp `JgJ:Wn*Iw'=TR< !!@_^9 ݙm?=[; xKX]ۖl Ȯ8XE¥ wC~*l;,{n2Bb2ISj@|@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`@8n.)HD}u!DoaxPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxKv2.wi0^A+HX60 pVp `JgJ:Wn*Iw'=TR< !!@_^9 ݙm?=[; xKX]ۖl Ȯ8XE¥ wC~*l;,{n2Bb2ISj@|@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`PdnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB``znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`pznp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB` znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`0dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`@znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`Pznp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB``znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`pdnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`znp- }x='Zu8iƀ"PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`8n.)HD}u!DoaxPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxKv2.wi0^A+HX60 pVp `JgJ:Wn*Iw'=TR< !!@_^9 ݙm?=[; xKX]ۖl Ȯ8XE¥ wC~*l;,{n2Bb2ISj@|@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`8n.)HD}u!DoaxPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxKv2.wi0^A+HX60 pVp `JgJ:Wn*Iw'=TR< !!@_^9 ݙm?=[; xKX]ۖl Ȯ8XE¥ wC~*l;,{n2Bb2ISj@|@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`8n.)HD}u!DoaxPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxKv2.wi0^A+HX60 pVp `JgJ:Wn*Iw'=TR< !!@_^9 ݙm?=[; xKX]ۖl Ȯ8XE¥ wC~*l;,{n2Bb2ISj@|@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB` dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`0dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`@dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PdnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB``dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`pdnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`dnZet\__7_PNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`/ 0? O /(PK!J[Content_Types].xml (|N0EH-X tc HIb/yU8i{4ja&C+oU-{V~_)!bV䪻jև$:P+'5 = C 1{Q'0Q610x]l}I\JHY\@]^Q|@7J3|;CRMvGZah𩔑J]2SoNg3:~&UKM6o^PK! K& _rels/.rels ( 0nS=H^DtiUۛc a)hěBUrdk)Dd gIDr*dS("QlT3Q4b̜'օ9I]e3\0ťQ.D=vtr5aƓI+D#V0;f[e!/PK!tableStyles.xml I0@Ὁwh}-CQ$ +w*!@he/?JXd45ݤ{c@qqi` yߥ9y`Ӣ` 3f3ff` 3f3FKf` hk]wwwfܹ` ff>>\`Y{ff` R>&- {p_/̴>?" dds~?" dd7T "I" b? U 4J p?" dd@    @@``@n?" dd   @@``PR      ` p>LC900>E=2++#vPK![Content_Types].xml|j0EжXr(΢]ylF wJjǝ{za&C+W c+7oգT bV亻i6$XS)Ik2z  1{(Q'0?0mb(JUk^p+u# ˥x>V5PT[}Q.b&dۣ\>33ir<|*yR/ah3Q)#q]PSgFLzPK!*8 _rels/.rels 0DnzЃXmlo0of5OIw AN{cݠv=m 838yG 6U} ShLq`L)d=Ҍ\@.;3, ;$e͂): vq}j:zɥ'k茜(f,ƁXA6\m>PK!l/FT)!drs/slideMasters/slideMaster1.xmlZM6.[(֯I dat2eCQE㮊rH.:%sB%#KJdLmk'3}' Uq?֐BXNc6 g\`64e$@+'Gߜd<+JrB AIiFE)O|6r3Nд 1Cz4|0Qbq%./I!&1Ū Ђ3z$5Ci$?L(RaR'0Jŝ1'9Kr*' Ar9Lax-FXPR0:>]R=sP )^/2,M35`  2~Ξ:J8-VMpN2l,,rgSUWP(K\NH|d^5 [6t݆KRObJ23˯>KrHC' 97.¼1Ur[3Ux@piОCgg8*@yH ȕ6׿^Un\ysͫW7W|<nU YMd"=0r%VO+ȵ{r\hEP 5Y#ڱi42ܾ/Ʀbӹc-G{6dVlwlꦣ{:Vtz5:]u{:N!(m_ 't2 S4]7) 7J .d g?JX\y4(윺wPն؇~Z`BIYeɸaı·SF^q|=F>)KaS5D=S>0MI^z&̛=rƞx[*\.8<֛qVk;㾳!ݲrhB' d:5q ~v-ֳzhFNbNF,"L}y^wSxU[hmJz:R pbnE9P)z!/M[.` Lɲ\[ >͆b:^1Oh Pwoq PwEm띊^AuXj1W*@ŀӚZ7O#KOiPK!qԉ=drs/shapexml.xmlUN1W;XC ҖKfBGm΄JuVq/Gg[Y*BX~rQյvOM'+p-צfܪB9pN*PRa50JgÊ,8SPb bc)>o5>ޝlhϰȒ/:P;1;M$ I83p(<:<?18tܱ?t6؉w'Ε'A17u!*Y!妕SRmz Bw{ mr Ͳ~[5 i:CY-gf@Ƽ`??Z =2V1}Ts U3)0A!_ݕæ@> S=-|a6j4 jz8JħKLItuC0!B{'`4h\!gHBe(BdI2 ^0ڥ5.x 諞{;%v&`0B=.OPP-JxG J 0WyDwWOsf5qTFs5rox.q$ʳMe0ٴ.R+Xs̅ں%u$ Mz5_֙bJ6$00X+TŵLtYݕsosDjK!VK}`U{jlMVgLYS]"(U֎_o[gv; f>KH|;\XV!]օ Oȥsh]Hg3߶PK!֧6 _rels/.relsj0 }Q%v/C/}(h"O = C?hv=Ʌ%[xp{۵_Pѣ<1H0ORBdJE4b$q_6LR7`0̞O,En7Lib/SeеPK!kytheme/theme/themeManager.xml M @}w7c(EbˮCAǠҟ7՛K Y, e.|,H,lxɴIsQ}#Ր ֵ+!,^$j=GW)E+& 8PK!c Ctheme/theme/theme1.xml[nH/@1D4 @fֈ=s$%1<]`K&WتئEʱHV]]U_Uuuw\yVuV3UNSHEVf73GU E:Sߥ?9l&U$3u4ˋ:nRWn-jCZ.y n C U)sR*WUZEC`F}!rhjH'Hŭuy!LGx\r8M$5HLN!b&|\WoxD9K2գ(bJIhgmZ\pdY?Ve `?86N kWę>jX.Xu0u+8ӧM3M^NY6)-]2谿4l R+uBtrgT-dM)SQNu'L 0T8iR3AB/@.>򢋭PT2,UIv.UAsJUHX4Q,Rkۯ}تtMJ񶪛kC*/p&ƿaMNf_选|3.@j2M;=(;{rפzVLq=nf*4~f*J>}+k$Q8ɷk½os93rj-[=Xۃ=~)S-k`8H\+ ^gjY5v%q9`- x *}-1p<[WJ2'ͺJ+pKFyaCEuحy&oUe N 7OJwA(]I> ąZDeH}݅}4r! Neb́[PT :|fK eUӛV8 X3jDZs{X'3&S'΂y 9x~G M$,ras Kf}E ݇(t->*V)%r¶mBo۫J=+Ȯ)[V|Z.uq︃v( t$@ȉ+ɮnu BZB4+no0=erFLja)ۀ %Sf݃SHeU:%XL-ڤߤ -)lQʆd1 RyԌ wp~e&YwtuAL*>wMP EB͠ovRn@/m Rmym~*Eie y͒Cl/,nCtNhX@6F (.o=_,.¯ni;I6P޻ rkFM:wDLាuld[*Bg:Z|wmb7 Hv6댮ꓐųa 2 |rP*d'n˰=`d YOKcSLDDXN象G?" |ɼrJt{:wm\4c?GDZbl95At#ka2ˆK E"Nݒ; EӒwv.(:Ȃw/b"A=c:n4=:xm'@Ӗ3tFM dǢy;`:g /qn/G(X6UJ'=MfQm:7\M QXO?N)p %l8lڃA/Ѩ1CǓ tD?p}2-éǣfgecB2=˳h  j2G|:jC7qtNlC2Aء2y;:??44:; tlÞihZG3AGBh`@FB؋vheHNh:q :Ahiը@m4n;Q(*KiA_:^;5ܻ3tP6$ǡT9f1ujOK<\3Љnyd4x_e׌:0xx1i8"lxNz^GgוxT\_?Aر۷qz¾G26Ws5Gvۃq47rϗ3fl ?3~35ؕ;qm0v"7 "9쌆(>"jN[cshHńM4Fck;8;" v;1q|^\8)v|p'|25+ҹ8vPm?cg;/kƉ'laF9[#v`OEqv؊ Vs6߄8Wd; Ǘ?G,C~ ĝ V5<',H؁"|^n^./ PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-![Content_Types].xmlPK-!֧6 /_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!c Ctheme/theme/theme1.xmlPK-! ѐ'theme/theme/_rels/themeManager.xml.relsPK]: LPK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!U!drs/slideLayouts/slideLayout1.xmlVn0?<pWdWièiVI"pvg^ T2V3<8c9WM1r W&s"#yed M$Lw Sl$m[H~Hnm|pʾjL2AXZ|{#:i7Mu9ö 904}rHi(8>-j(>c TkiAZ&mj]luРhyt9ܾhd?O0ed8>OGqg,ceZ+IF;C$kCx5W!r f$t!_J L2\ Xpx0Ck.~~-8}B^#s̢38j2\d*_K~!7#/4}G[BYETBV@hܑ`䭁[aSûNd:?VK#Qh Pt{an{j8 +q;zo3q=7>y(l/ 8dXFJGu\2FBCF1PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!U!drs/slideLayouts/slideLayout1.xmlPKmQPK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!0.v!drs/slideLayouts/slideLayout1.xmlV]o0}`q 6*T[Vݻq /&]; B@{=\'[)PɬZMpc#ιZOsDDh&xwa2'[CLpɒтI>j<[i+[NrK~IIumW+NM7)_X&]k$m'}ژĒ wtSNƪn#99$4+HZiKHe\Y-'-_n9UX373˙E<h5 NuXUgdە ph;]BɠDEzX Btl7k?Iv*RzP>94گڣez@>[U#M61)(C7pU^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!YI!drs/slideLayouts/slideLayout1.xmlXr6}Lvm(&R>ApAt]/2,g~6 |w.J28?\b, Jyp&x/ElDUZtl--ϩy .a-U: ;`b]^N9dS4C2 jfA)p9ջ`*/bw"ϘVF9eq,Q*M7WnflSZnp).N9a :QUdl3wAH[H2cԜ|ClL֜>bU,P-5/x3( g$S\Fu_DcՓe//ز/X /ZGv'jYgVpM)l](3D*ݯcU>#|%u-Byzţ7.A䲎G8Nh8%tN8 hӂ؏\|cB^iLxt7&.MaTr@ \CO`lcW %4B# ޕ+Ly mA8 C ˋo+h5O2K>Sc&.Иdup\&K)ߔ6ih)([%8D!Rk&APlP Hx2|Ep2i9rNA` /puL&p0js5hU^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!tJi'!drs/slideLayouts/slideLayout1.xmlWn6w t9 % q-[i,iHUOCJtd7Yv{>J.0"\2a}ZGX*3*hM.ԈpHe[[a9/y*.ntI-~Agpb AI uj)]mɥmH4~ l%CWR.*+P Qؽ'=heںtQL+6IKҺ)YTT~NsuVƽJ U +G"w8jv_,{,0BrؽȈ%` kZPyVs{]Wwo4)2GRDE ?%`xlL4mtyuIS$jkbM,U|?Ap(ʲj<֝$*$>x@)(hTӹ߸n@|vUN[G⚗>o|LH4|6qP־ey_An>AG PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!tJi'!drs/slideLayouts/slideLayout1.xmlPKpPK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!!drs/slideLayouts/slideLayout1.xmlRN0}G,?TRhSi,| 3v+bϜsf6(ڻ-9SNF].~qw棊r}z "/O<\P. *NYg>(G֣DWU y[S\./* I}jr`@cCݬ<a! dF~ 5щi}maAά;٠ ;%>S0dʀ__-jm W j#MXFcxAr; a8l&k' D+WG4 ľE^-}3$OL@naWs(XK < 4ЖbRxU@0d3PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!!drs/slideLayouts/slideLayout1.xmlPK`PK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!EDu!drs/slideLayouts/slideLayout1.xmlTn0?<p86myukrZ.)ir(rvvfڋ˽ѬQ!Ζ3ej)ÏgVU%oU.JE(*HaST~d<jx^R}srgŎ$( Hq`3=tΏ3(Vͤ`Eoidj\tkL1€ќ)~n T$EPQF}A j*#iQleհ kꖳ |G>ɥC 2,DJ+\E`u@^=,ZѢx@/@Pؾt jLvyWn7Ő&WL;]:(P荓OYG>Ξk9-=;1tzd69N_er>L'SRmg83%J"47gHnR' uU+zS鿧 ::[r 2=! eGK}Kq~k1Un! ,MDDa)+^|V=Wwkiv:܂o2)z< ϐ1 _PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!EDu!drs/slideLayouts/slideLayout1.xmlPKP.PK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!_5q!drs/slideLayouts/slideLayout1.xmlYn6?`@Ԗ, q-[iiHO{)іm[ѥ|~sR23)&&bdy}]<  Rf{OEyrOripщSDSSNLT95S=wE_;睠tr ^ڬEe̙0b_Y[˩zYW g<3kK)'Rv*b%\\4ʜ{$?Tt!Hyi<)*ٯƨl4L]@aQ3e^l5{=bpGȤw)a7(xA#ޠ?tm6>ӨP|`2k3 dF Bl*SȬ~sLCTϕ\Ys(  [U%qn҄Ci OSrFA`07<_%!6LcstXG,%Ua]>: U.ަ8Y*ycAA2:<±ma? P5>n8U%PCLR! 3h!>_>zQUџ'^B] RaW!<- mXHv@Ec?aGHU[V7a[[!wC\5mA; FֆVZvili`دjavZgXmi}ʎjqسS\VoU>{ʣGj`4V #AE-VTц g*uicL忈 0g*` Z+i>xJnC'EM`N`XC֩F[G "XXkړXēXl^4:omBp-oo,"!i}zUojn wrLjrx-XM'Cl2%U0 iFΆ89'Q/s2'z&='˜_͉D5=_ЪBxrV eV̊?~?]fE|uXcc#gE2zS:ݾ#-K;0S3n!*PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!_5q!drs/slideLayouts/slideLayout1.xmlPKO@PK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!~&!drs/slideLayouts/slideLayout1.xmlWn8}_`-Y!vMb1 $)ѹyc;hf̡t~#8jc$Ue-'duD+&x,~?3]X^^Z;d+tYZ1A;{+eqpj{!-x/ zszZՔ}Tt-t-a8VMc17k}B@ytGLȢKD(Vί)E#8F\KeȒCD 4oL\;fȭP{Bn;Fԡs^"I\X*tpãd蹞k33.=C,JADʈ)@,`詭E`h{],>A CutҘ΢vdU %R<}mzk|Ξ^W+pP1]%<d>fây:ʡGIQ>u>^hkے8>t{8L``͞b1D`6;:a#-%&"DߜMoa4_`sF,g GЇ}a^~UGyj/;쌯sjj ۟$7 >go9=k~Ep7[l Ml{Y ' u ᒆQ ;߷ӟPK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!~&!drs/slideLayouts/slideLayout1.xmlPK0PK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK! ) !drs/slideLayouts/slideLayout1.xmlێ6 ]XAmQoh[XHZ|H75sRZZW=wqĤ&/f}yp7\\-gAoUTfe|m^ω,{g*lml=n[R8J^ooB?ؕRbmQVkp%/NbUgM,5ά=J.T+EFW E*밲I[߽j祣Gێ]]aECU KG,T9ӼR #CiSW=[)Nm6lz9AQ}К[ 3\۾H<ۯm9:/6L=͢8WlW{Dpt IVMFO'y.,9f՘rl}41m'ߤ'F9ڲP]0ԣw]J8PdxԿ,K:Nt Π? sUҔhȢ+x|cڙ65TaY^coZb&T3U06*_,o2UW?'UH;' *5xGr 5 G$ZtDpp":&i?Ni^B5~&0 ce /ȳ3}TfJlPf(8i 7MS][HxIuQπtBy$J i:A7g}O.R&J D)@p4>GX{tzaM0Ԛ7<.S )e?sbfCXIFBɄ'?PK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-! ) !drs/slideLayouts/slideLayout1.xmlPK :PK!a[Content_Types].xml|N0EH-@% #{X%S5 Phwig[5gU-ܽTQ-jvsDbEcAJR#: "CrKA} >U^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!x(/p!drs/slideLayouts/slideLayout1.xmlVko0>iI] ZPml&1ī_MvPnMڗ8{νW[%QŝFq}#)^#.4{|5y/[3C{BǸ ,r V)ѭdw:LQq7`auA4_ [4ŎS=m3RHv tSiҔtsƛU9DQF*%1R|YkRHJ+3=wM>"Zl{ CAtH>W-,e0JA8'` i`a! DS ogvR}5sHY K&{n(ٮ\R~C[(ۀX|x%_      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|~ ~SH[Wk9y[N-Gw_UJ!ְ':cuyjbޖV>DeeңIӖ^?{0UP?<%惋|QԦ7۾fJ0Ǝ*%!?$j*GSb~i|/Q>NdI 4\=DPa*94LR' JTH$Ō:rC>nق8Ixid$XDkfZ퇿yͻhKth4+[!Og֌-U_-'4ۜ3'G8~Q wU^vy&󡔏$Eqnj9h\@ҕ]^> 7peJDl)'وk^cB:bR+͉- -]8[(W+MPK!p8ܾ8 _rels/.rels 0Dnz x%ٶ6 (тqLݾQ(NAU ioo'tGHL m^W16 AJMȅ8a22~`Or[;,lij@搛}YMGBh ]pϔ{J Loc!"rPK!rVm\ !drs/slideLayouts/slideLayout1.xmln0 ]h;>hRlV b@ĨN/ӏ;Q&eɟ}yuV9NΧ1IU{xVad J9>0_]!`H[9:-Ğ+$<[+#[4|t:-&G^Wt't=0NoM1;}FЀXu=b9YǔDKjO-;1ʐ".f[L9fωP{t!_r `{x%o$Za1o$ޠ'A4 bf z6bqIj ZlinŖn?z2l7n}FHY\o}H*ӧߧGsxE}թ3M$ eb=#͊*/f$EeZ1i>CyZnuslu,IwkdcѵۿS[Ԇ[e~ApY JjH~?< 5g&F-yKS5Cu Zzʅ7r >D=D ePϾחUgc0h8Je[*ñjg2HlVd l(p4P8ȝS5OeLpf[ o@je B [hY鉕%zF=%g'Ee# JHDbXU51XiZA1X>!l0ՉqcHxB,r20<Lkaod0L.`^% _O3OPK-!a[Content_Types].xmlPK-!p8ܾ8 ._rels/.relsPK-!rVm\ !drs/slideLayouts/slideLayout1.xmlPK $Blank PresentationSI# 850584(  8c  8 Hy+?Rectangle 2"PK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!Ihdrs/shapexml.xmlUn7;;BցmI,9r[q Տ m~ WREEՐ _YZ̕5KLf$ޑ>A[R^97/?jYЌz=6Ya] 8 Q{~U4efH.'@ܸ w^TZ6ͮf"8FƖ /JQb!B+6>͏*6,B[Zw+SR V`9`p'isdh5A(\Qغ06&#u\/?k:٥Шc>8k )>jouXcMTJ!,SlkAƢt23oMt*2Jp^1-?/wzuio0<,?rٷyoPK!dudrs/downrev.xmlDMK1E!m+gJ=J ;T2?I;MJnGWj}{3l@DWr)PoFÃZAoL!אl>PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!Ih(drs/shapexml.xmlPK-!dudrs/downrev.xmlPKP   |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 N   V]8Xxc  8 H(^?Rectangle 3"PK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!-qdrs/shapexml.xmlUn7}/ H%ۈ!XLrG{hoJAU̙ٝ3yk*g3{ՕBǛ˽!*[(J4adrc3tB>յ \-txmTjv_wjUYy Wv>nFj>*2y=>ªQu FY 0.5-X H_0u=2!">-Z>#nmZ %,TUE@' ,>TWe] ?,ALv e9T'ǽ>rɌ2KȲ!ng<eңtCL6!(u1&9Ns]E텩L<l&QU&Xn*6uH\bENHsSXx k)z;&kؼt6qjإv6jm GysEe~`ԭŹ.,jv^٘gi<\RY$5H%WHyEuUOU"9gR۽c\SIbm&--uciOwoʜhmH-XLuW"Ttn+INh.>s ߞO?[af܉sXᐡ&>2 Y srbLx<%B{i`O _ŷPUOR*//#HcB_z3nD:}"y I/&QPK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!-q(drs/shapexml.xmlPK-!CVdrs/downrev.xmlPK   |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 P   V]8Xx 8 H ?Rectangle 4    8 HX-,?Rectangle 5"ÐPK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!.ߥa)drs/shapexml.xmlXQO#7~` rp#rvdI=U+R_7BEq&x<|3d߽WMu)O޴9:3yShc3΅2ZB:~=W3l֮W|}k\6poL-5 c+qk[Nj/<TnmU|tX,It`Y|͙N=|8WmB-po["/3 Hi8M[kfc)rGqn+tUS3Qˑ/enr2G$quf?E yaCvLQ0tm$"M|!#ѓs2o;gi$Iw'j'Z[?HlJE>Cbw]AisT*\BJ? ­Vp8z,W%RTYQVAŋRE**RNee ڱͬ@-;Cə^CpMwk++ |:Ք{΢xqGbZ). t"UvlcQx a #۟ IK}6!,†p5@9Z[:GU8!~Gm)Nza[FQjՠY0!Ipu6< ]B[iV +? 5Pyv /#rwsa`(2\) 4UY+N&;"ڤ\Mwj3 giiņF,X(R"Wf*/w`W%M6$cDe/n'Ψ2Т'ILIhkɢ@[",0J }[ R]l|$R;o$]n,"Rv{?nקl$ؽ2L!H,!>ĿẐi*G[buж/Ŵ_7j.M72G#^vv5ִ{3 .N/\nM{itv#u׼[ǻwx|{PK!-&drs/downrev.xmlDMK1E!j1W*@ŀӚZ7O#KOiPK!Avdrs/shapexml.xmlUn7;; YQC<˵Xq-Տ m~ WEU!9fwڈA;.oNl Yɕ ٫6lð4fbj],UqzWAզjV);4cORq={Lo 5zQb3J^nb:,_W0u=F2@rԹn1UPF=Ʒj)ai"DYEɺo-pe&Iml \סe]!;GJW<9oOX`QxzjKNpF48_B*J!.ÂlkAE;]Z2<<k2*b9 t~"??=ӧOOl]쟤iV﹇lmhJ[<|Bs7PK! #drs/downrev.xmlDN0DHHܨ *ԭP *Jpᶍ7ElGIܿլ[oD>hg% l㔶*%  \_RnGNcbCNJd0,H6gc>}Ǖ9K!ܠǑv=5_o#aZ?b|)7XgQV_zUC/gC$/!e, |PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!Av(drs/shapexml.xmlPK-! #drs/downrev.xmlPK`P  |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 N   V]8Xx  8 N(?Rectangle 7"hbPK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!o drs/shapexml.xmlVKn#75ؖ%a'C<2VlCq< 6>WdR Ƴb$Ul^ի*UBZWgR&+M]_9/t&2kz]\pXQըv\½2ˍ-޴++^x8*Uۥ(4?)VKRzXVd 9Ӣ+Í쐷xBؤ" ̊% [HiN&5˹6P5jJ˺DS-#Ulv͖ߙ D "Fܖ/_oVa,I8Sbr'q[!6T(q8uG ds8o0[<2b j:蹣6i_z^Ͳ,Vɗ"Iy}EJ\/wt+QoJ­{֬C$/!e, |PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!o (drs/shapexml.xmlPK-!;Qdrs/downrev.xmlPKW`  |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 f*   V]8Xx6 8 S  ? 3380___PPT10.Yu"KY PK![Content_Types].xmlj0 u$Nwc$ans@8JbVKS(.Y$8MVgLYS]"(U֎_o[gv; f>KH|;\XV!]օ Oȥsh]Hg3߶PK!֧6 _rels/.relsj0 }Q%v/C/}(h"O = C?hv=Ʌ%[xp{۵_Pѣ<1H0ORBdJE4b$q_6LR7`0̞O,En7Lib/SeеPK!kytheme/theme/themeManager.xml M @}w7c(EbˮCAǠҟ7՛K Y, e.|,H,lxɴIsQ}#Ր ֵ+!,^$j=GW)E+& 8PK!titheme/theme/theme1.xmlYo5#?XsoMFT6mθG7P{DBBTj%. A/lL J͌{~ ahIy W"i'4ƕI f<%`Ndpcw O R‚ a˫<#)|n4?WO>eg~_~O_~o>W#}ƕ(F1U48z9f؃[' 9{#ocEX OGq4)}4w[q-~oy">1Udbd>쐦q܅h+|8=)q}z5G#GOfBSgkzSbX> wYM m}[{|=)Zq,_=ٌɉ26TsFnK30Kh XtGXe^\$A1`ny<9HK8ԙe/o) ʞQvPX1m'2bfp͚V4RV >5aA0eC fdnpuq}.ʵxBwEWRםϚh a¢8c^°Fjnwbk1@!κpd4g7"xs*a\4vqUF^*'3!U<]RxM(`R!D1)ktJBUuveE敐xl&v0lP oLB #uLYZ.knBUݼίR3Ut;{={Vn9T,ᆀojD ꢻ- {CscppS;4BB;Q dʒS5cYLDUĕ{LkpbuSM44R7U=dkwJNHސ=~p4%]+i~N, kmŪiZ,/N1G5X, ?*Bf?:;P[| l @ګ1=vfewȇSmY_T{Z".(w;']ع[۵M OQXͩY~"Ƀl[ 'PK![Content_Types].xml|j0EжXr(΢]ylF wJjǝ{za&C+W c+7oգT bV亻i6$XS)Ik2z  1{(Q'0?0mb(JUk^p+u# ˥x>V5PT[}Q.b&dۣ\>33ir<|*yR/ah3Q)#q]PSgFLzPK!*8 _rels/.rels 0DnzЃXmlo0of5OIw AN{cݠv=m 838yG 6U} ShLq`L)d=Ҍ\@.;3, ;$e͂): vq}j:zɥ'k茜(f,ƁXA6\m>PK!.*!drs/slideMasters/slideMaster1.xmlj0{ˍq&Sҍ a@QXTd.lMsgQz1B+)>IX::j1W*@ŀӚZ7O#KOiPK!JYƋhdrs/shapexml.xmlUN#9`!@D-JYМtovGyF3Ҍކ!j4"ClǧZr&=)l^D^J5*K?7ClIdB3|Vmº.}q+ Z{{j#\735c]z@u9;t npp8X}VKAB:/Dم`dݔ k_I8B&βqk26@M$&gÀ}-\.еƹ* x}zVui{["m'%Ʒ4NeKuU?*Hev&q2"HMA'xjS KRLBd;"U6nzt~%+zl-HW,wUNc7Q!*O  vd:Z2<5dЙ(+y3 6t^><}/O>?㧍K;af=dkMS$gj盓PK!Adrs/downrev.xmlDKK1!\MIelZj(tQ n; I{ ];|h;q&ZstZD;Ǥa s.|H9jhbs)Cِ0w=q*-}-!m'3ŖC=*NVCUjV}j1W*@ŀӚZ7O#KOiPK!)~drs/shapexml.xmlUn7;;d;ۨ!XzvV\rKrTfb_ msWT&/Rl:+䛓z B#p؆Ai͠ T*pЕ*tQEMSq3$Uɣn@ jD90-dgmN(|X`)Z ֽȤ|h{jUƷj4SW P\fVDdd;Wjj,}k6Ǖ@~%ؖb}B 2nT9tGȌLȲ!ng<eңCL6!(u1&9Q'd칮P\a: D*5/`*dpi,w%.\l'G!کR,B@-͢uqf\cesx$:o.nTqQ+߬Kdnʣ+*Ssn-tf9V{Zoح%Ƥ>H7z|&i=A*-F+䬭Q%Rs&{?N{k,&i~BWfX֍Yb=])s!8j`*3խ_tSхȺw$9Lϧݙ|MJ*C\ ++]ؘ.ڡ]sՒ̕T9JT̩Vl?>zÇOu{#LxxnМPK!غdrs/downrev.xmlDKK0!\$S ks${ ];|d{1c A\9qD{Ǥas\XF$51jbX8uc1m/3nŎC=T}VC]jQ<^e[%w>?v "M*KՌ/h^e wkHzI6PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!)~(drs/shapexml.xmlPK-!غdrs/downrev.xmlPK   |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 P   V]8Xxo  4 N]t?Rectangle 4"PK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!.v“vdrs/shapexml.xmlUn7;;Bցmi,=r-F\rKrj1W*@ŀӚZ7O#KOiPK!' drs/shapexml.xmlVn7;+$Bցi,=.ڊKnI$yZoHR(z7 ͺTl)+NxU3S6o.Μ:h;/x] ]pXaհt\½2ˍ-6++^x8*Uj(4?)VKRzXVd ;=δ(Zp$F-16m%bi"6|9ɑf5"s~RR͙ҩ.P exfv;fw&Q{:}dBFH{VVաL}Q'n,sfwf;.ύ !t qs)+zZ-V=L碒x @FS~?0%RɄňC&kNmj]Èe )`Rq e-t-N7b6@m}Ԗb"FQm&Qw40&NWԳ _*8TNLr/zY}:Ƭ޿eqf>80RH sQbQ6n1hNvxty28.Bot\cPZ VuY"|%\i>,u5hƶ6 q0kSj"t!^~D*Z {kLN2Y1Ud4C龕hЯ5bdcnX&5ȡjBrB: '!ŞϏ_~zÇ_5ڝAs`PIǟ~GD& =Htp/M)NClPK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!' (drs/shapexml.xmlPK-!@Qdrs/downrev.xmlPKU`  |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 f*   V]8Xx6 4 S  ? 3380___PPT10.YuNY PK![Content_Types].xmlj0 u$Nwc$ans@8JbVKS(.Y$8MVgLYS]"(U֎_o[gv; f>KH|;\XV!]օ Oȥsh]Hg3߶PK!֧6 _rels/.relsj0 }Q%v/C/}(h"O = C?hv=Ʌ%[xp{۵_Pѣ<1H0ORBdJE4b$q_6LR7`0̞O,En7Lib/SeеPK!kytheme/theme/themeManager.xml M @}w7c(EbˮCAǠҟ7՛K Y, e.|,H,lxɴIsQ}#Ր ֵ+!,^$j=GW)E+& 8PK!titheme/theme/theme1.xmlYo5#?XsoMFT6mθG7P{DBBTj%. A/lL J͌{~ ahIy W"i'4ƕI f<%`Ndpcw O R‚ a˫<#)|n4?WO>eg~_~O_~o>W#}ƕ(F1U48z9f؃[' 9{#ocEX OGq4)}4w[q-~oy">1Udbd>쐦q܅h+|8=)q}z5G#GOfBSgkzSbX> wYM m}[{|=)Zq,_=ٌɉ26TsFnK30Kh XtGXe^\$A1`ny<9HK8ԙe/o) ʞQvPX1m'2bfp͚V4RV >5aA0eC fdnpuq}.ʵxBwEWRםϚh a¢8c^°Fjnwbk1@!κpd4g7"xs*a\4vqUF^*'3!U<]RxM(`R!D1)ktJBUuveE敐xl&v0lP oLB #uLYZ.knBUݼίR3Ut;{={Vn9T,ᆀojD ꢻ- {CscppS;4BB;Q dʒS5cYLDUĕ{LkpbuSM44R7U=dkwJNHސ=~p4%]+i~N, kmŪiZ,/N1G5X, ?*Bf?:;P[| l @ګ1=vfewȇSmY_T{Z".(w;']ع[۵M OQXͩY~"Ƀl[  ZR||<(  <3 < `yOaOa?Rectangle 7`?h___PPT11H(   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography 8___PPT10 uAutomatic Parallelization of Numerical Python Applications using the Global Arrays Toolkit Jeff Daily, Robert R Lewis*v[H$ v;V]8Xx~B < VԔ?Line 8 @A@A0. < Xx\s?Title 1"ôPK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!ʹPdrs/shapexml.xmlUn1#($٦mVQ@ UD8"71ږIyH q |nH6xof<=^U,uBvw(*ׅPӔ8TVw v8e7$HЎ6`?n=; @c #Ui]ӇJtY$%zIrxg$y? %9<{IthAo:|s\}~}ӧ/)D n 18ƧMu!_P{ȇ'ԉ iLg~PK!-{drs/downrev.xmlDOK1!רk)0OB$1$ejIxacUͥsHkKߟ Sݟlv])u7<(4gFqsJi0J ?e<PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!ʹP(drs/shapexml.xmlPK-!-{drs/downrev.xmlPK P |<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 X Motivation  U p# V]8XxE6 < t?,Content Placeholder 2"[(U(PK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!5tY:drs/shapexml.xml[_O8?龃6P(ՆղwܮĮ-{DN\;rRxd?No+܌ m魋:ϟL&I.Ș2S2WMJUɓ~9:PR&&!=%}nY,nҁ1E(YJ\µT8'BK (n,t~؊?{dIHw(,[SH,%I@5$f&>LƀCˊ9 sf9 O͚\~T 0FFY&Οz{\JS `{[vg]>1$Vg{gf{l["'HZՓ"8QH5])2NL.RȧNCNCږaǙ9 Xr`?NΒ_dbI ˄k*GCKp8gxA!4uC׍jԪPj`U9#QH%#M:Jշ-J\Q>c*b%1 윿h GRRm'6MO59R,ACCfRb) g-ѡ4iJb B OB|vח˿.׫?))2X XF 0]rtVqSS֦9>>/AcKkS5~^M,bQYgNPp3@fcC)@>@`^H_bC ÷Vk )dp3 :XrI}M BPia9hLt@>+ {d*Isܓs`{@kxXQC+'{xdDzo%iZVT99miMD&+k_uRװQ)rV2^~އ5ЬOIfk]>/V\iӻrW. 6>Ote[~:Ӛ귘-wm1Hp n_(-XT@ Aj0E"-!IWIh!,YƂ$iyJ tB5v -t3@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`PK !&__drs/media/image2.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`PK !Ủ>IIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK!x$;drs/downrev.xmlDj0D@obF $W獴W̬6ąB<+X ڛ[/ bB68x&7Y߭2 ]±B62jK܏;0eZi^3 (ÎsőjK?]?ۦ/~?}oz.zMWnu,/jo,AvcL1QPrPK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!5tY:8drs/shapexml.xmlPK-! #y+)drs/_rels/shapexml.xml.relsPK- ! drs/media/image3.pngPK- !&__.drs/media/image2.pngPK- !Ủ>IIdrs/media/image1.pngPK-!x$;:%drs/downrev.xmlPK;&   ___PPT11   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography h___PPT10H@___PPT9xp PLots of NumPy applications NumPy (and Python) are for the most part single-threaded Resources underutilized Computers have multiple cores Academic/business clusters are common Lots of parallel libraries or programming languages Message Passing Interface (MPI), Global Arrays (GA), X10, Co-Array Fortran, OpenMP, Unified Parallel C, Chapel, Titianium, Cilk Can we transparently parallelize NumPy?%0 U9m0 PUm0 PUm0 <sssU&m0 <sssU4%0 Um0 PU(m0 PU9  &4(t "Xx < X?Title 1"PK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!?drs/shapexml.xmlWn7?V+BAm"=]ĈK$%K>:S@ ݵ"({X.7ofo6$kn* %\jΐ*Ԋt}s7ʍLJޛQ{ WX+ǣw+<d$/"ZO+XO, (VЙ6͙ ut % ˮЍZ8 h;.] @c+#MiC$H( cWG'Ɠ~2cx2. X`P$J幏pBC9JuhrRAY\ -IjR߫"x&dmKbC -WlC 肺݈I5lkdіrYã .t Ծj!t~귘AGcZ`bv>r-P"L!N3MQ`ڛ:ˠʿ[28%elY05OV*GZ?<`r&䞬s8cHp_I;DV_pWzb.]SIl0T^ f"I ԅxwv}se ]jYU*iX~ⷆ,摒9e-zϻ>}#|8gȡK^}:/}ֵ2\N 4(4U6y?>j#/e&Os+zoNT+&oO3PK!kdrs/downrev.xmlDMK1E!$mz.ty9]ogS1X.*`T6 >_VrAK bf-/sWF)25ge˼b}L^i: ɽUĽ.9Π7nƓiz7zJX{wU5IV5pJV2Lhm%|PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!?(drs/shapexml.xmlPK-!kdrs/downrev.xmlPK~|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 (Design for Global Arrays in NumPy (GAiN)) U)p#, V]8Xxe- < t?,Content Placeholder 2"@:PK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!gibAdrs/shapexml.xml[n6w x;I8F"ɖ@Vu]DŜ)Rhe<ln6yIъ`3 wH;;szr4*gR .F&"&\ ;zy{YZgF#4%+QRV]52Es*4Pfs&1T%&UnWŠK )4z&IDT6n(S9BP.d4 *Ŋ\C4V#Rܴ^"cPL>y$nw1A~cOztQVw`Dv;fi$gT1T>[-d* ]%\|9!I.[ a֜2 Y #4!%O""0a,&a07g.:C88X+jEX\x(/`hwr0$} 'k)j*Uڎn#u>0{;|홉 ;^+-QLKnޞ)+CɅ8U#C(&9EBS8(^C!WG&\ ȨgQ?hBn0k)MEw](TQJ$zY,o[Z)8p&Frj1 )g(sZXD8wĭ8)!rMC ƭFAMB w |d| ?,17`*v> m i, $WȁhDMTG$n{k}%ebc4pi{Oi0()$~@hl)U"=h/?bkM+W:}>~? 30`Fb+ET x7!ח-ָl3N%ENgeA> )\uRS6cBqD1yU0š o> XksU,o>[šOYxe'UCjB;zD:{\Vb <ճGԊr=7K~/%fsӀ,o u+-@MH3ڱ%kf{if=szmU>; _ꯚ9v*S۩lg8Y$UkV̭7l>VbBI? [?7HuV/[_x=*Oŕ}luVq* ѿUKn0 mv""q v(fMINyhnr W萒l'dE c4pސJ 6J39Ԑu-K!KM$-y 6\Ҷ]$B-jÏI BX$;x8(*ZƧP%W>>BeTRR یCmUFGTZӘRXPSY(bWR 9r5`٣C"Ly<#P,8Ƨe:oќIJ )ԪaV4/kl Ң9ǷS)"U>;KU%YS#-erKa"eFrC1s>$]涅Z̯ZhF"2#E;Q6UZ![G8'2,.0Rh1@1ÕέUKaMR'=(b42=n?Wg&8^j }R{LJïݟ'%FxE(Ų7mH0HcY I-#&@?=*~)eXA״ u0{ "dk`RQq}gZQ^\̢R8+XJ_Rf܄H\9$ʈm2=3`xa(H@\X<;MIIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!gibA8drs/shapexml.xmlPK-!&!1 drs/_rels/shapexml.xml.relsPK-!-]& drs/downrev.xmlPK- !Ủ>II) drs/media/image1.pngPK!___PPT11`@   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography ___PPT10     B___PPT9$             YAll documented NumPy functions are collective. GAiN programs run in SPMD fashion. Not all arrays should be distributed. GAiN operations should allow mixed NumPy/GAiN inputs. Reuse as much of NumPy as possible (obviously). Distributed nature of arrays should be transparent to user. Use owner-computes rule to attempt data locality optimizations.@/%0 U#%0 U&%0 U6%0 U0%0 U<%0 U@%0 U#    .  -$$((6,,0014488<<    618Xxz #/=0SPq  <C ,Group 207"Rp* {< Xh*.?Title 1"PK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!'!R|[ drs/shapexml.xmlVn9_`vE(ijfw%Bg.{dLJ[7y<@^aB]rU3mGk\`PK!-dVdrs/downrev.xmlDAk@eF ARW5ަc =fr=^(;iuϏ#^=?-4*S-Xb Rʨ~ 1re:@ۆtwZ~ctwm.v)27o 鿼UÒE|T2PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!'!R|[ (drs/shapexml.xmlPK-!-dVdrs/downrev.xmlPK#/=0SPL|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 How to Use GAiN Up#  V]8Xx |< t(K$?,Content Placeholder 2#&YIPq___PPT11ld   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography P___PPT100( -Ideally, change one line in your script: #import numpy import ga.gain as numpy Run using the MPI process manager: $ mpiexec -np 4 python script.pyV$0 U) &a # !a V]8Xx)  < tU~?,Content Placeholder 2"PK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!+5drs/shapexml.xmlZn7;~,ٲu`u Awk .%>:S@:C.k hI7fHy.ɌRh%\%:,N}JJTʤV<e1( U9(":4e29+_+xi3 Us, /@lvZf΄ЕRn64D~rVڒd krC:YcSbGz;dRV걇vs^ h:r t?..qlj`|q&:Nkowݡ"nـ-I@z^;^ *+.(Zz('͕NJ CpJ )75TvC#-5s=‚/I[VsR'b އ^^`1<xVm(PBt+3E?xGcV0؉,^HJ =u7-` xp``I*&h#H0y%)Iyv%v g'LHTrĬH $U&c΀S M W0dƠ~rK# ~R0weÚm<}-נ)r+W jR-X<]&fIQ`G1<+C8H$GLs0gnpZcQ`cmަFa@bl  |k  ?"׿ 7QFԎ4NྦྷU0>1UzJL<* $%`GhJ֙+XҖ[Om+&P)=y0Ś2``鉪b7Uy% E\5ʋo??o\u&c Sh[`13%ǥ}WI&o}<yB:_+qs=|xpPK![Rdrs/downrev.xmlDN0DHkQ'U ԭ( ΋Mvdm׳&;+y _f io:(x{|:w`n7W TЦ4RFݒŸ#9fg,&&v,{;ZlI7!uAߙRD)3%/9s52PK !Ủ>IIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK !&__drs/media/image2.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!+58drs/shapexml.xmlPK-!nR drs/_rels/shapexml.xml.relsPK-![R drs/downrev.xmlPK- !Ủ>II drs/media/image1.pngPK- !&__{drs/media/image2.pngPK n {+@:  ___PPT11   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography h___PPT10H@___PPT9xp xDiskless compute nodes e.g. BlueGene/P Walla library by William Scullin of Argonne Use Python s  import hooks or modified interpreter Process 0 reads from disk, broadcasts libraries and modules Compute nodes with local disks e.g. chinook at EMSL Process 0 broadcasts installed Python and required modules to local disks on compute nodes ( bcastf below) Run Python from local compute nodes disks Reduces contention utilizing local disk copies '%0 U,m0 PU4m0 PU<m0 PU4%0 Ulm0 PU+m0 PU/m0 PU',4< 4l+/Pfc8Xx  < Xx?Title 1` {+@ L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 ~Scaling the Python Interpreter Up#  V]8XxJNz #Pq0SX߸  <C ,Group 208" p* y< X)?Title 1#Pq0Sq|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 GAiN is a Functioning Prototype  U p#  V]8XxK z< tX?,Content Placeholder 4"=+7+PK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!FWR kdrs/shapexml.xml\n6w t;Fɖ@u]DŚ)Rhe<ln6yIɶ q8&-Y99;?$$hLDrujo"~λӣ)g\yN#̒NuRƝJ%$.",VWbA$QD+jm%!s)6=qOZڻb8N9P(ȀSp*iyU@%he&)yx|/`9ʠ(#mݽ} $L={5ծZoˮӪ5VK wD" .ʃVJTpG"hjI=T<>N*BuQHc@6.`&P[B Df̬a."qH5%eZ$ϕ)/h]90!%], ]EoX)3$ pL)KJK V`1HpVw_|1!NVs- _)ei4Te!Mف*p@ ] q:3Bj@U /> *.# )jl@g`= 6\ϻL݈zJV7BN0!AywbFbğ*Ý@Dەܑ֭E"=,(YK(GkP_lk7HiH8!  s3϶Y ޚBG^Y:XjvE-ロw 1w.zmL ~uO{Ce-emY[Zf*aZfk71qEքv!ryƠ#qtDm\ g]seQ)$34szn,8hԶn`ss^ dêMl_6:`a T:& Lqn}~no{=pŹ;=˳f?$t.,Xό'݇[ӧ؇Rʋ 'u^,{6:[4H&=g0=JJ)hj \7ӳ.gg ZXֶkxqƣ5VQVI|zƥ=KKC62s\*1‹Gu9,Z 2BmZg5yl;Xb1cx[6d@%}>T%_[^b#υȳVj0~9IҚ:tMw=d8Ѣ#my&o+H&( F /lOPRYB;(m$μ WFF·snkX,{+}ʅGQSisU6 'K&j](( 찲cq=Tr4m,W^P vkpd17r[~62c9$2Suf LUZiF-h|ćwxC52dVK.''$·1F&>'>C*=-Jf`Gf\>/4l*1Ο1no Whd.bЩeE^XZW8hIvDGqSD%3Ä]uU ;A9hLL0?%9,c~v`c`C503x!Nl)ָqw6U:.3wFTQfARZPlCwBq5@ڜ5m*z֊Y,7r)ve TmB1z-]<:%>PfNj #L!Oy&-K$a^!\h@>6 M.C~8Ys< J>K? ;ɛ͟vh2<,/b쎝gad\s7L~/ :6*Mf1XއTb䁳do2DMk*_?&)|?&h[&\ |̷~.:d9aϦ8y6MfxbH4dF.MfMFMFim~.\&6aDmLz'ؙkmAomŪnV{ύ&9[x CHwhdޅџ3LfCT";d4N0& x.j2vAy?흿yHnׯq-`h| -$dV2̽a[~fNy[}:v\48XBr 4UխiR>MɌG<|ʛMw]_M}!ex67'S j%5j/dvsb?Lu ^pA"xr;椫&)Z]0\n=h|vv1h(x&39حVv%KZ MF@A٥ &&Lۆd. |[p0/nu-^Gc̭wM~e[E`*+~U^~m|ʶKMf7aG(3̶EM&u2!xSdOa^}0PomWziM&Y3 T2ۥOqo~'i|Cŗ^M٥hIzNCuҜLaVw4M4&|4559$hctpVɌzN=0О3n2Y웇Ngd,ng>Ld-&qs:1hZ&-u,`fKƵNAOo >ϰ颏&Lb aqkRݤZ >lz'՟.5\jɼ0İ]M9ܫi@oӷs\!)5y8]M|~LBO?}[핝F,4Sʯ6bҖL(. gk2Z Ld~Ih106yb`m&&LMF䚌l35)k䚌g`T*=I _ %``Ö/706]ӵL6Tguɼp<`k}[A:0Z6aj_d pi:ϯ/F02]2\bs2:@j];58T0 xwd &cL5/ &ŀ6jb_$tWzv)*$؄,S.e1256\Z3} V94PX [ٕrtؿ@6S1JYP[jZ']idfJJgB&c(* e> Jgo+*>[ `RٰuNFLl2?ٗAzo23XT6i2Bh'd72񨉤]Cf>dĶqg #MB]s2@dZ.i2@M%VF. d! d! d!!@@B.dĶfu2p u6O!P'# ^K.2œ PG9}ɈXi3@Ɛ %dvB&6wuJeC&} Q*4&#dvB&o2O~_l?ĕM&`]Ȕ[Lh3l1/΄Mfa3Tyۍ_`o&M&˘*gA&c[Q>c4dd@92.U\dv &a٩6} ӵ_y+ x ;6{> neôܻu],#6mƆKdb>I_0T=\z6cJK2dCzå.|~~80Zme&̀S{iN&KF5^w iRMƚ0Tfu2El\swjmc5]kNγLoŶ489c{6f.&jm2, ?`kyj^LL>0lo sZMFd6h16mbn2 $d~Ih30|)A̺3&}L*6o~n2_jұ$̟QvA4|ms2]Z'-n>+~˳L'X'S=hC?*w[[]~p>eۅs:z^5!8a>EQXݿeJ2'xٚj/a ~LDˠVk2K c?g44>!CoL:kC(} ~OIq}M>\ތi8ɤwa<Fj54-cU6 /?&3&#l&6oQCRНDh2)`8d鸪GR CɶNE'sE-W1Pi2Bv>n1l~Ͷ]p*C*^Arױia!Ug P2p9Zmen|̱h2lu2Aܦ:PV4!~Y~ UF<˸eh2to/4g&y]Ph2EX2Uج(,^m}+]>U0&'6= !!@ `[OIENDB`PK !&__drs/media/image2.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxIBQao4#ZP3n#As>\5;" " @k*.Ø~̵cYg jzAUU_~w2qpviLjl~-2{KX^bV Bjg2iI#0VjKi$D`M_hzS&x#0F3-d":OM15эE F"퀢FZD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDDD@dD@dD@dD@d@d@d@d@d@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d@dD@dD@dD@dD@dDDDDD@dD@dD@dD@dD@d@d@d@d"rD@I#rY:C̝!P҈LqY8Gl.LUU28O`fۆut;Ӫ M&Ml%4N`Zd>'6t^38Wo/+) M! c1NV 2fCަd#P D@dD@dMMm IENDB`PK !Ủ>IIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK!ydrs/downrev.xmlDN0DHHܨSUUɁCS{Dv۔g7z3_' Nt i]`v"&t{H",Ws̍?NT &!2,Ɖ1;`1q 4,ϲGiu| n{FOuwlnq?{w͸zhLrQ௪4,y~q(._5DA@.~PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!FWR k8drs/shapexml.xmlPK-! #y+) drs/_rels/shapexml.xml.relsPK- ! drs/media/image3.pngPK- !&__ drs/media/image2.pngPK- !Ủ>II drs/media/image1.pngPK-!y(drs/downrev.xmlPK)#lo|X߸z___PPT11T   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography ___PPT10     ___PPT9h`                ! ! !  ,Released with Global Arrays 5.1 What s finished: Ufuncs (all, but not reduceat or outer) ndarray (mostly) flatiter numpy dtypes are reused! Various array creation and other functions: zeros, zeros_like, ones, ones_like, empty, empty_like eye, identity, fromfunction, arange, linspace, logspace dot, diag, clip, asarray Everything else doesn t yet exist, including column-major (i.e. Fortran) array ordering %0 U%0 U(m0 PUm0 PU m0 PUm0 PU,m0 PU6m0 <sssU8m0 <sssUm0 <sssUX%0 U  c cc   $c$ (c(,", 00,4468c88j1W*@ŀӚZ7O#KOiPK!5e drs/shapexml.xmlVn7;~,Ų9-B G˕qɕ%) z HZA-=HÙog7$knjLO:pLŘXTƤV|L?ْలrLΕvۦK^0D\]Mn͢]nr!Q!۽Ni`BcRY95JSCD,G}J+t.K۵w&ns7pC,l }̰KT$h 4ٓ?uhr: 7D9AY^o-J{xg#q$ǰEJR zޡF,uq7, ĺI)}&ܗPT! eY\ ERe,8&dTa$|˶ߘ?Nm-yR xӒQɋn>o}%pBBa[X2c9 c~G/Ρz;t`V6S] ?n/$cеp=[?@M4*rMaLezTׯmAUK|?PK! drs/downrev.xmlDN0DHHܨ!uj)bo(n8qFow B1u+(:η >w RFop\)zu{ڄ7t9Vħ؜Zʤ-9L0gv a[i"N,w|,'|H[K?JݟmW0Voz.7 2ܖy3`XR8_3 LQ@~PK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!5e (drs/shapexml.xmlPK-! drs/downrev.xmlPK@Jv_yd___PPT11D<   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography @___PPT10  The gain.ndarray in a NutshellD Up# gp#p# V]8Xx$ < t"?,Content Placeholder 2"wqPK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!Y̏$drs/shapexml.xmlXn7;~,)uu@5Awk .W|tho+#kn vtXpf87\z%YrS "}ѡDBEqk22蚗_*eAY"skq]&s.ZM,]^re\{ΰ3T嬘7JNSCD _FJaH+d*YZܐmn+C&clEY^j9|3h{| ?n.QVY=Xe&yweG}J֘ F×6+K{`أ$H}9tD3N0';FXX6jL8sJ )HGt4 39$E9KSL0F,IPw.]F&xtNEf`A\(OW?2S`XY?IuJdigv-SQjGBsf&FxȥB &\g,]n6p6Qfd7~KJN#z[LJ`$ЉT"qE2M,Y2b#pȳ{M^A*6o2{__WH"װՑ+$8iV V,f+I\㴷C) (wy7D¿I# wӪD<9XۼKډƠeq`6H\ qxE\$"\>ЁjC$* M5(#_g~Dɂ$LS-U$'庒4@JO֙Xpiדۚ "u< )e`& DUNM=YIZ^DUKښ7W_/ӧ_()M,Ghu;#bL]t{AUR>@_&@gG< <\܈>; ϏV~SUkzܮZm3'uKtv+wib#]~eov m߶ݮT:eι^p/t?g(n]zQ߼e߾WN0~,maDeBLk8'WǶ <&1i7MWر& AU%;6y!sm wN"Gͫz·ȂdNhUN))1)d .j رtX:8ldkYo#KfU! U$CdjPP;_Ɣ7 uМR%Ti쬘CX%`R~iRi)~+=Z硜 }OR*TDHYϾZ}sɧPɄy59p:ypMi޹k98#+~e1÷LJ{cqsqkqwNOOX!$`9O-jo+]-@l͌듋 _ZV'F, A2f :g( a('2ˮV GuaBwz{f%z Be(H\Q`rKJPf,l{A8%KI; xx͡כf~ę*qnkGDZY<oBwBKßG9% iM+W+-5vOPϒ!_Wmt{ߍV{qW[}1L]MIPK!&!drs/_rels/shapexml.xml.relsAj0EA>E(Ų7mH0HcY I-#&@?=*~)eXA״ u0{ "dk`RQq}gZQ^\̢R8+XJ_Rf܄H\9$ʈm2=3`xa(H@\X<;MxR0Qf W_JT`sJ)0@)DclxecQ,,xvƾlnU߅Rwc"ӘˡZN%'[Sc: PK !Ủ>IIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!Y̏$8drs/shapexml.xmlPK-!&!i drs/_rels/shapexml.xml.relsPK-! ޝ^ drs/downrev.xmlPK- !Ủ>II` drs/media/image1.pngPK:*d \  ___PPT11     hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography ___PPT10`X  ___PPT9"""##$%%%%% Global shape and P local shapes Memory allocated from Global Arrays library, wrapped in local numpy.ndarray The memory distribution is static Global operations translate to P local numpy operations %0 UL%0 U"%0 U8%0 U > a"    $a$ ( (,^ J V]8Xx ]7N] <C ,Group 195"pxU8Po TZ ڍpcP\{n <C .Group 1467"Y!{?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ypography 0___PPT10 L  V]8Xxf `< V8F/?Cube 1450\?bțe|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf a< V=?Cube 1451Ll_[ 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf b< V(r#?Cube 1452cl_} 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf c< Vu*?Cube 1453\l_ț 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf d< Vx*?Cube 1454P\[w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf e< V'?Cube 1455c\ w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf f< V(?Cube 1456`\țw`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxj L\țe T<C .Group 1457"hpcP\{nf U< V ?Cube 1458L?b[e|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf V< V8 ?Cube 1459c?b| e|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf W< V?Cube 1460\?bțe|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf X< V.'?Cube 1461Ll_[ 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf Y< VX?Cube 1462cl_} 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf Z< VH:#?Cube 1463\l_ț 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf [< V&?Cube 1464P\[w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf \< V$?Cube 1465c\ w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf ]< V'?Cube 1466`\țw`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8XxTZ `-0Z-e <C .Group 1508"{< V/%?Cube 1497`\țw`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxj L\țe ,<C .Group 1498"80Z-ef -< Vx!?Cube 1499L?b[e|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf .< V&?Cube 1500c?b| e|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf /< VK!?Cube 1501\?bțe|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 0< VhK&?Cube 1502Ll_[ 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 1< VHR?Cube 1503cl_} 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 2< V#?Cube 1504\l_ț 3c|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 3< V,&?Cube 1505P\[w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 4< V#?Cube 1506c\ w`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8Xxf 5< V8%?Cube 1507`\țw`|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 L  V]8XxB < c ABC$DE~FQ>R"UVWuo? woo$og] @    $Freeform 4 W2L}I@|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 Pu  V]8Xx < C .AGroup 1632#"5)PK!l4[Content_Types].xmlAN0EH%,BI Ib-cePK{׫<[G,+)3F)8a#wr՞G&nU3povFgφ6[Rm}knGwWtP~n^襶uفi^y﬜> ȶrjƱ9n"_7z~4"N qٰ/H6Q[77[GݕMY>Ɨk՗ec]2yw᰻i7GYzyl@  h'rj>O0OB?K( 嘨%18>F4x?G0Lmij{률K[ļŗR"[5n\X~L?Ǘzt3*^80*koQ7mw^vKn(s:F ".l~W.dożb* '$,EG/5Zje[\y?4UәDɋI^_h9B}ԏu!gk:W#ֶXVY+ղ.-e~ew4=NrE/Zi34ĩHM4s,|֡۷ӽ5Ir |&pnhg(+qyfѳ.mso?3O3v4pҌf4 0*MhFz e %'fWc{LlhF|hFeA3z-rHn6r h53a>fX4󌚙٠`ƥnifE? F|F\GqPY6^rGNG7b;/PP7/ң_`&aHWL9ЋӱAbVMã4ĈNs?\5xjS+!Ff륞%= *6Hifl҆l$4H3>c6ZHH3z6gAbV t>g Ҧ-Mc@T6HGZvRv@f)lmE" aB]']wXsd BKΘrrFB# 1*;co4H3zi>a3B# 1Ҍ̀&1Z2.Հf3E3&>c 4m  3"V aICj*;;;\$ӋΡBVM/m`c4( ;#>ϡHC463&>c 4# 8a3lf * >3BV >g"gYIC4 ͜D3Z<vc'pLU-`E&hf4g@3|&0ifl0iFe3PgPgV90Z:#1f23iπ:C3'̽v,g 4BK@hrrzB# 1*>;cj4H3zi>3HC4g3hf Fb`giNR9~y|VMf 1 ;g|V agu3Z`gh$vV֎ؙՓGOv ;[+Qzh<_Z.}fzI<_"[;+&aFdja%31/ت?noˇc|n޼>:teT)hfew8L[K{!i︌g4V,@ke2<\3+3Hd |Ɗ8#A03J3z2f،Ag z汢g hSn0ФDa.qi+$`IlwסʩhlOfgvmiy^fó&sUp{ -kCvU9=̀NGɊbIB g_ po7PMlʄ ctUƒuYkKeptl۲I\/g|UJNH(|sV#l·&ݦ ^cRPCK}rwR eT^v.q'x "L`S`А{ f&wʳqzcc(3~&y>ޞLRӰxqxQ5--Δ3 DʤKж8{Dn q|7? PK!c{drs/downrev.xmltN0 x(Hminʲi7<@ָ?Ц! x{uw?سũm;-(;URзQJR+tGۛTw/p2)hsyt΀FVtS[2e `ZYkPI W+yijn>7F9!NJ<~Rh-94( p]_o:qŔ,tL) $ӀGa0_$cYAp}PK-!l4[Content_Types].xmlPK-!V 2_rels/.relsPK-!rs 05drs/groupshapexml.xmlPK-!c{ drs/downrev.xmlPKCyB=]  < H]?TextBox 200]7FIL___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[0:3,0:3] (3,3)  V]8Xx !< H?TextBox 201v2]7)L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[0:3,3:6] (3,3)  V]8Xx "< HO"?TextBox 202E']79L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[0:3,6:9] (3,3)  V]8Xx #< H(n#?TextBox 2036]7)eKL___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 h[0:3,9:12] (3,3)  V]8Xx $< H("?TextBox 2049/GI:L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[3:6,0:3] (3,3)  V]8Xx %< Hh&?TextBox 205w29/):L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[3:6,3:6] (3,3)  V]8Xx &< H?TextBox 206H'9/9:L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 g[3:6,6:9] (3,3)  V]8Xx '< H8#?TextBox 20769/)eK:L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 h[3:6,9:12] (3,3)  V]8Xx (< H($"?TextBox 208m9;zKNuVL___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 i[0:6,0:12] (6,12)  V]8Xx < XRz?Title 1p*0!|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 }Scaling of Python Interpreter Up#  V]8Xx < c 8A ?Chart 374" %*x1 y! < t6?,Content Placeholder 2"icPK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK![a drs/shapexml.xmlWn7;~lu`u Awk +>:S@ ܕ7@ݨe:hp837W$sn*]Jt.YB?m (IxB/U5feGUBUNfS^2BW\aЦdSs֩ \9pP);nedB=RI56~ 9l)QġZ9%c2>2i[[6Ae:<r'N5Nre?`0{OtQ5/.nwL` #$v`e^d8!^F/Z~zmWP3|ecQ8!8)պj9 G˂R8%")g*" LjT!'<>|O$B,/8"*Pځii3h2>pZ٩,"=eAm[ZXȡ#_Cl.EoP>LЀj?@$uBzOFJOˆ7H 14F+囒M4@JE8p)r8M^HGK{ Rnц)^`60jf| T[E/׿nǛ_)˦Glhٔ} *P}pDiSq~Ij̆濮}#Ѳ\ڋ&+G;t^>d t 6ΟBf4q0mn`DX<p49HlR39"K?U ֥6& ^:(tJb+$ eJ@4(7RDcT.q0T3Kp8^:O0 ĕo.s&-L(g7 >kɩY%xQ;K2b%F KD.6kݳԡ+f> a:N}CBq\@mV@C'vPLpj|`Y5Xc$ΪS8m'LTen2aK쓢U )3NIBcVf,O: fauzAUUR}5@D|cd1 FYY%X* ZgyiF<%CiODoY}@a9JREܸk??:B๟ -Cn݆Q(um@lfk BwKbFz}Κ;<%%phxNbj_aօ<4+] 7.j5OJ(:ȖD0;ˣ;LCO>-]&-. &˖~ح* PK!&!drs/_rels/shapexml.xml.relsAj0EA>E(Ų7mH0HcY I-#&@?=*~)eXA״ u0{ "dk`RQq}gZQ^\̢R8+XJ_Rf܄H\9$ʈm2=3`xa(H@\X<;MIIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-![a 8drs/shapexml.xmlPK-!&!Z drs/_rels/shapexml.xml.relsPK-!,O drs/downrev.xmlPK- !Ủ>IIR drs/media/image1.pngPK p*%: 2  ___PPT110   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography h___PPT10H@___PPT9&& & ' ' ( ( )  "laplace.py: Laplace equation using an iterative finite difference scheme. Wall clock and iterative solver times are compared. Discrepancy caused by many Python instances reading and writing same files on shared file system during module loading. J%0 U4%0 Ux%0 U%0 UB%  o B 8%o V]8Xx~ < VA??Picture 199(`BpP+  < `(d?Rectangle 9P BON"ld___PPT118   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography `___PPT10@8 About Pacific Northwest National Laboratory The Pacific Northwest National Laboratory, located in southeastern Washington State, is a U.S. Department of Energy Office of Science laboratory that solves complex problems in energy, national security and the environment, and advances scientific frontiers in the chemical, biological, materials, environmental and computational sciences. The Laboratory employs 4,000 staff members, has a $760 million annual budget, and has been managed by Ohio-based Battelle since 1965. For more information about the science you see here, please contact: Jeff Daily Pacific Northwest National Laboratory P.O. Box 999, MS-K7-90 Richland, WA 99352 (509) 372-6548 jeff.daily@pnl.gov-xHn}x,tqrv qrv=  qrv ttrqrv ;V]8Xx'  < `p?Rectangle 9"BO0'H@___PPT110x   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography X___PPT1080 GESoftware Website http://www.emsl.pnl.gov/docs/global/ Collaboratorsz&xntqrv%qrv  qrv tqrv$6;V]8Xx < C ,AChart 201#"ÖPK!7^[Content_Types].xmlRn0W?XV؁CUUI84V˞,"^1 8Y[lw3pڛ5Y^8äQwP _M)JP*V%F7ȲgK,+նOlsv B;cU'bP(a+uaq t[r:wH\fq3^o-% LT;b"%nE"7 g㕼Ǭ rZ lg9PK!#j _rels/.relsj0 }qN/k؊c[F2e~"Kl`0;1 (6{PF783.#c(Y ̵W͘tT0Dlm#]ڀzgͿ0n @]nStLBS%M=lݑm7rf9`5Y4Բ~G>~WoPK!_9drs/downrev.xmltN@M|fL6-Ań5k;.P)j01^|s̙+爝)-spP'MZ\~4 1VTUF h`]_U6'clsL 6d$ʌ5jervDu<}VRӆBP`j "_z/ 6p_=K<_ށco:q0"0) eCYGy>甘<.3?3݀.oR!pyd PK!}!N/drs/e2oDoc.xmlRn0W?XT$QD¡C+!b;Z Mz@,WG۱`+|&9Nڸ]ɿ>7O9g!N_U˾xMjF.}BZm!|5-Djq'zAl')Sa8^;!Q#3q"3up戯/-`ds18:HؠP-koJ:;q"I$N%ϳy }w(bȳL41SĐfrAtwewv^Al֨aGVU$Ji[hFW{Ka; u7.a1d 1Cjb2 $PK!F"drs/_rels/e2oDoc.xml.rels 0nz&ЫXIFooЋqvov1ONGgYqh{كYRC׫La,Ų!F@3r|˒UZpL ˬ(1,.Eà="v[ Rl6RD&Vk˳d9D񌥛 (&JQȞbϿ(LR|=ȯt@d;OA `?t@,A: U Ȗ-A:hbFXۉ,=fe,=;5u^5rtO39AAB9d{Cu8*)ܞ`=% ?H>")ȧ$2d2:&1$ /Pm 2Wuy94vR`V݅ȯA~jA07&Zl<bF#{$F]GtuK0ZLA1ea0AQjW27dW]kgPVl=mhJ23-/^僊Maz+\|y.޶2:Min1؊'SFpZUE<|WfjޒKdi:AA9r/1,r.S,L]e6C+ܨ]ccj a^OHHD.G1~ϳb P߹HObkFSdm#k=TY{Cx1/NS TLZE,r̓7誵IglQUTWx6M7>}sṕ9E qc'O]PK-!7^[Content_Types].xmlPK-!#j O_rels/.relsPK-!_9Odrs/downrev.xmlPK-!}!N/drs/e2oDoc.xmlPK-!F" drs/_rels/e2oDoc.xml.relsPK-!T drs/charts/_rels/chart1.xml.relsPK-!^ktdrs/charts/chart1.xmlPK @&q < `?Rectangle 9@,BOQ0L___PPT11,   hdman`  Arial&Monotype Typography 0___PPT10 E(A portion of) The research was performed using EMSL, a national scientific user facility sponsored by the Department of Energy's Office of Biological and Environmental Research and located at Pacific Northwest National Laboratory.xprv ;V]8Xx < tX?,Content Placeholder 2"ÕPK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!lQB%Rdrs/shapexml.xmlXn7;lYn(91r-V\rAreGyh\6~BgȥdF`DZ;$g /$ n*gJt.EB?XTΤV<+n鋓x^lE`*3Qm/}+]MtE2r嘃Ju:vɄ'ZLVn11D u(V¦r0L$L˜ңE(Ų7mH0HcY I-#&@?=*~)eXA״ u0{ "dk`RQq}gZQ^\̢R8+XJ_Rf܄H\9$ʈm2=3`xa(H@\X<;Mj c1v%DAB~?PK !Ủ>IIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!lQB%R8drs/shapexml.xmlPK-!&!drs/_rels/shapexml.xml.relsPK-!UnAdrs/downrev.xmlPK- !Ủ>IIdrs/media/image1.pngPK-{+@P1P___PPT110(   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography 8___PPT10B___PPT9$*+ FPerformance comparison between import hooks, modifying the Python interpreter, and bcastf to local disks DOE SBIR proposal to further develop GAiN is under review>i%0 U:%0 Ui:,S5V]8Xx4 < X.)?Title 1"ùPK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!3Vdrs/shapexml.xmlUN1W;XV!!bAJ[)E zmNH8TJ6y^3 ?8fѼdƭZ%QUsF 5:8TΤV< W uMBޛn1/҆++-5+<\Tf;%B(5E+;-yBQLb%\:^rҢ9@ t6q5 @eאoXfM:hlu@0/l. i{qM(mǻH'tx/e߉wɺ=u"(g>f=瑖xgBMI9Jir %kd!r)cCcfiڝ*Tsjg|~0Qh o/PK!LŦdrs/downrev.xmlDAO1&xBĬB}lݾnƃ'3ff}/SXt@`[n4>F 5JdyL0\dlx)p˙Rc˥@[G;|맦;o11÷n<40ǯ\0S 3Ɣ)j(RrPK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!3V(drs/shapexml.xmlPK-!LŦdrs/downrev.xmlPKz,{+@.|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 Y Future Work  U p# V]8Xxv < tU?,Content Placeholder 2"ÆPK!,j [Content_Types].xmlKN0H,BM =I,<&gR *Zx\͐KQs^cCuf博o=?[6cVJ#8"DtӇTcdT] Z3\E2_xpvUU*SPYn\g]-s"jسJQ9ҕ&4'i }o5.aG $ "EM "eq"Px-^\nPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!/drs/shapexml.xmlWn7;~lٲuu@ Awk +K>:S@ܕl7#: ,pf7WR%7Vh%\e:"N;#Jc*gR+5?ƶ"جJܹjlKf_+ڔaj.+*ewtK&=)USrj:JF+d*YZܐ6~+qB0Dg ۸Ǟ^n%b~Z|/[zz( SzDa(Ycr0@n>lWdPG!Ry,{gje#PB \-'ţ#qJ )wBR]͐˄!'Y\ bD{:,EA1!\J£ϗ]ѦQ F|sNلF Fh<[LՀPl*5Ln7":Ԓ7BKf&  ?!2B堂vZ &/\g,]l\DRK^-) FR2̙LkH'R̻ͪgl9d0;6bp‹Ǫ{m]A& XkVDa'WItj\ZZϮV>Eɉ7bl07OF:K>R>qZٹ,2=e]xX҇H#8>.EoP:g@u McgP Яҳ QE<3hUYx|W⊿ S_#C]Ѻr.}4a=}!jS@MH=Q @7ȡ*[W@KOH{ w7|&w7^ӧ(槬!t#bΌh*O0}D19?>~zC7]Tejh~5 X}@})Bisn'so~[~C/,卸F!跢9V}t>chPK!&!drs/_rels/shapexml.xml.relsAj0EA>E(Ų7mH0HcY I-#&@?=*~)eXA״ u0{ "dk`RQq}gZQ^\̢R8+XJ_Rf܄H\9$ʈm2=3`xa(H@\X<;MUIIdrs/media/image1.pngPNG  IHDRQgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxAN"y*8ՍGp0'8ADž 9B@Fro|5Fh*(yLD mN@7 2 2v'=]G{8su|=q]~ %qw\k0" &qFd`{Nn~"sNZ, Ss)얏ӖLu"U` :b;>l$2d>\̠=6 ~db%G͟aM b}\2l@ϖ閾w,m%#6`"2b؀%?d,Ub؀%#6`Ɉ؀%#6`d,KFd,KFlKFd,KKFld,KFd,KKAldDFlAld,KAldDFlAld,Ald,Ald,KƒAld,Al,KAldDAld@l,Ald,KFd,Kƒd,KFd,Fl,KFd,KƒKƒd,KƒKƒdDƒd@l,d@l,d@l,KFd@l,KسX2 6 X2 6 X2 6 X2 6 X2 6 X2 6dX2@jl, 56 KH%ƒRccdX2@jl, 56O0{ɔˊIC:VfbsrS5Up yxQ<u"FdxNkgtrS?s2@MB#2:n#4"dT Y32#2@ ӑ[%2"DdLc2+2@ڊ"%y`bD0jn/I.ĥ1 R"2¸&Mʕ 0\Z3ez={aY'(ηjT1Yt,`^bЈ 0.mDd@\dX2@j\, 5. KH%ŒRbqd@\Rbɀl%b݋%bݍ%bݍ%bݍ%bݍ%bɀt%bɀX2"bɀX2 .ȀX2 . %cɀX2 . %cɀX2 . .X2 . %#2 %bɈ %bɀX2 %bɈ %`ɀX2"` .X2 . .X2 %c .X2 .%` .X2"` .X2 .X2 %#2 %`X2 %#2 %#2 %#2 %cɈ X2Ȉ %#.`Ɉ X2"#.`Ɉ X2Ȉ X2%#2%#.`X2%ӗȈ X2%Ȉ X2%%#.`Ɉ X2:Xq2M` w|vڲ*2cq^2ME懸%$N/.%fq^2%srU`.˿}A q ȒY12r#<<^_ .lu{hbTon ,6̛깙Q9scq~ X2e";p" " ?+"7IENDB`PK-!,j [Content_Types].xmlPK-!]  <_rels/.relsPK-!/8drs/shapexml.xmlPK-!&!~drs/_rels/shapexml.xml.relsPK-!/sdrs/downrev.xmlPK- !Ủ>IIudrs/media/image1.pngPK'{+@F+P___PPT110(   hdman`  Arial&Monotype Typography    hdman`  Arial&Monotype Typography 8___PPT10B___PPT9$,- LThe above test only loads standard Python modules and all numpy modules Contention for the global python case would only get worse as additional modules are loaded; not so for local disk>H%0 Us%0 UHs:|V]8Xx0 < X(?Title 1"øPK!(&[Content_Types].xmlAN0EH%,BM #{X$ccB{{&m TƫvՌ}Z_VH68O}6ōV;dnV]DVBz9v I&]Hd9DУkce\%C7;DpZCE,S+pL]q4+܇#_d5;Tϐ#La\b'%ӚKE:olW:QpfCPK!]  _rels/.relsj1 @h_B֐BWaLΖ5yB/dˠA 0xM e`J FG2p%}iRdITD10Z)4(I9`mtB{ƁmtπnTg 險,ܗr>j1W*@ŀӚZ7O#KOiPK!CrUdrs/shapexml.xmlUn7?V-)BAm"=]ĈK$%K>:S@HFM[Ajv9yf}#Ɏ['YF WZ7y*&9=pG_^~ 3urSӵfrijmjW}c3DloPna6Xnnr: (QAҥ20`rZ@KUݢϰ A?b(I]^+@c[#}mSӇJt]Px4Ggr1, ){Re2>py>/CMi?p}2.Zn|Jե锾RJBQSÐ[rJbFxn kΪU]<2R8aU/!WO?)Stw팢5V.0kfx^Փ! A *:mW 7ѐ; dr}T^bq[9+ @jx`S";=ƕ5S+|JO"”3dvrNHn~<}UkOkij]}2Qŧo;EZ?6o@aÀizͶ~'(8\. ,EHVrT!E{+66Ѣd-ȇɠ)'4^;c| tKS]պv%NeqXRuz5wZ*H$ͮ j Z}̍5tcd;S-cc?^ؾkoᷧ>x;%Fr}!QCo=kfI U/{ަKk `rQ|<ә˿PK!Sdrs/downrev.xmlDN0DHHܨB(ԭהbo($8q473z1RLm E +%nnoX0#7"C|Pe*)0-@>{r&ᮗˢx[,j՛ gL3h|3Q`Y WlM)*\rPK-!(&[Content_Types].xmlPK-!]  ,_rels/.relsPK-!CrU(drs/shapexml.xmlPK-!Sdrs/downrev.xmlPKp&{+@(|<___PPT11   hdman`  Arial&Monotype Typography 0___PPT10 VAnalysis  U p# V]8Xx$ < #  ? 3380___PPT10.YuHv"P# @(  @ @  r0e0e8?Rectangle 2    @  ~(^0e0e8?Rectangle 3 @   vNote: File must be printed at 200% scale to achieve final output size of 72 wide x 48 tall. Contact Digital Duplicating (375-2969, http://digitalduplicating.pnl.gov) to order poster printing services. Remember to have your poster cleared for public display/distribution through the ERICA Information Release system (http://erica.pnl.gov). Sidebar  About PNNL content is optional, and can be removed if space is needed for technical content.   V]8Xx$ @ #  ? 3380___PPT10.YuLiVx< xTՕ%&# LJ0l 8H40L&0a&iŴE `ti ֶU1*iS:JğE=2o$ [rs߻{{}wsfɯ/}h\#Ĩq2$ShTAG/ *} 0Ey  0 `,s0   %K p&\:  vU:9Qda<xjޥ7mycW/t|$kH#YDVգn9xFZo|Z??Y14ϔ{$߆!nzr Z'4zFyQy;CK\ 0 `:@@!`@U31͆MNh/{E;.Rt:4jdO?}H/.եp xxQ[r_D{|k :o&Or/a~.xM3 gk&onO})(1M7f|rueQRJ2ht\)6ȑVkD6::E#T"M%YYl4I#(U>5/Fd}ps؇RNOG;!!<.Nc@N搽E&Ip(hniykeIq܌1~H?|-mk:}=Fn_g$HT'Z}Dq$.p+˧( \X'rpzkdŘˁ2rM\i2,X ޯ@TҲ\\>EnXA͔:oTW(%$1ַhTMD̄˪jTP9fفor7",P|5XgB/OWgm/#JNTyi3Iozю^RT%E~"tR[AՒZ+" bE-JoܪFBw$V4 9m]lUяN68'#2 1@'ImWG)q|~=̒kTF 6j9GQR=mI:tD4g=7|kَۯ.߱xǝpg;HMJ]?Ag0yxգs=2>w}X{G^9y3kL_F(_ɝ@8G A#Ñ4Y@7nb;@V6Џdthl߇e2ݨýL#fׇ4l(;ߵ-M-G6#,W#~]V 3az)+JaӃ媷o4= y{:kS6u{q8,c;KM_2b@G|iDSo2r_f?7=N+Dˤ#nx:WcXp0[~8]2U]ƽ? ->b|Q2OkM6覸 b!̘KX-½:&vWJc>|PpL ▘m9MqKE+v9ֈQg HOGC)2LJ9IHKD K0U`mQRo QY#,$;oF/@?)[XJf7 |KgMR;Pn^\6wLwԸ8d]jkjj,)(֝ ֬_*V*7xifdxkК/Wv@bwȍ n7R9u0ȧP)|B>ܧHh}>>1{}Ă>7:WAo *tT# JNqQr~DÆfI1NǸųR[cHjZ%7M;„u!wsuօϪ/rﹸ`\ 0 ~(;ID% $E1re͋~r:&@N_Qv9]*{;<ҺE Je6a (Y%s4rV%@]=7AWe/Mrw1u5s`Ay5 'wXn鳺]ϰ .Ŀ;,Cy<.W/Ǒ&s8:$:Vѱ&S!ӺnvIY(N1u D(%^tA3Uv֮LghR/!uIX fyA,",1B .=^IJxWw]^]. zj'V}w`y3#;,xt0 6POt8bWxWU>oBP2 .5PߋJzlnP}?sd!MC>MZ$/ǘi'(ihJ2ޑe;G2]$B=l x(ˎ[4W/yTG L yeHQb:RI j8} '6N?8q(.NsbE )!Jd"'ɓ~fo'>=%fmR۳YLA(Qa??21(|@oÚ0!(<(З%d&^?gHW +H+c_Et Uqe3*[Ar!!\xq'k;[߷~ϝzYf&(J SuzC7n s8:d ~K!~zz,:T`l߷M_(SӵZ;CWEfW qTpIZ4HPNBM}i=݄ %kt"zp.P`b_xӺ}Pic`(Y%cNQd 2`t*y2`o.1cP1N|4$O4u"c8 &Yų]p*BkݺAmsMZm>jVy˴n]%hEK2~Y8r%ʅ#ߠ ~W]>DNgKדÑPB+ õp)c9 Q <>7kg8(|Kj>WKvQ v7Yq8%l9ҁRَaj s}6[_%s`WKjim7[Km-\܊\Y;(`%wsm}>g;$uzIf v3̓{q>BIv1]DIBG^[_jw ,7W9gQd#ՠ^Og Wx=PCǑ8lw7w7wcI[}9vln>h/MG\l([dw]DS06*)p;uN#CrUn>Z,[qק-Q]slI2p$b?^6wK;`Y<٥KʭvlYx9ڍ#d~O S G?J~%8\)"0iu&&IYHTע.D^B-4o{P!N8p !P_V_ޭ}?Bd(0%)egʭ-Q<cn\P:K)uwETÉ:JsU#Ufb|sÑ`,Bn CHHzji)==mds Oh+'0\{ `h   'PowerPoint PresentationStaff Member Jeff Daily37 Microsoft Macintosh PowerPoint@eF@G^@PMiG>zPICTz6x HHx xxHH  xxβγεG Oĸ}zzx Ĺ~{{~ Ĺr)('4[ſvssq ſwttw ſ{xxzj#$#,cſwttr ſxuux ſ|yy{k#4B-#,wſwttr ſxuux ſ|yy{k# &#"##"#@dS&#,tſwttr ſxuux ¥þ ſ|yy{k#8V;F].#,mſwttr ſxuux̪ ſ|yy{k#6_"#,mſwttr ſxuux¡ ſ|yy{k#mL"#,ſwttr ſxuux ſ|yy{k#&+""$+&#$%#"#%(C"#,ſwttr ſxuuxͻʽ ſ|yy{k##"msn]7syjqxc"#,ſwttr ſxuux ſ|yy{k##"KH|e[ib.^}xViXqzsS#,ſwttr ſxuux ſ|yy{k#"#"3KNLKGK).CVHSIIKZA#,ſwttr ſxuux ſ|yy{k#&0*,.//,-,30-,)/,'#,ſwttr ſxuuxſ|yy{k#$#$#$##,ſwtsrstrſxutstux"ſ|yxwxy{k#AB@P4FK?FCC=y}|=F@3HK,##,ſwtsrqqppoonmnoopqrstuvwyz{|}~~}|{zyxwutsrqpponmn ooppqqrrsstr ſxutssrqqpponnopqqrstuvwxz{|}~~}|{zyxvutsrqqponno ppqqrrssttux%ſ|yxwwvuuttstuuvwxyz{|}~}{zyxwvvutts ttuuvvwwxxy{k#$&))%(+')'&&,-++%&)%$%$##,ſwt4ssrqpponnmnnoqsux|-þ}yvsqonl ſxu4ttsrrqpoonooprtvy}2ÿ~zwtrpoor ſ|yxxwvvuts(tvxz}/~{xvusud"#, ſwt"srqponnmnoqtx~ ſxu"tsrqpoonopruy~!ƿ ſ|yxwwvttstvy}ɺ{l^PC7-'$#"#,Ɓſrnmnoquz ſsoprv{'ɿſxstvzʻwdRB3)$#"##,ş#Š#øţʸ|fQ>.2@ "   ܺժ޺Ʋ*  ܫʹ ~"Ŀɽ!̵ҪثӮĿɽ!̵ҪثӮĿɽ!̵ҪثӮ޻ɱ̸q    汽Ļ ۢǿι̥ǿūɼù 汽Ļ ۢǿι̥ǿūɼù汽Ļ ۢǿι̥ǿūɼù^ȸȽڰȸȽڰȸȽڰ߁ 𻸬ڼ٭' 𻸬ڼ٭' 𻸬ڼ٭'(ꞹȭͩݲȴڳ̻ޮҬ'ҽֵκζׯ(ꞹȭͩݲȴڳ̻ޮҬ'ҽֵκζׯ(ꞹȭͩݲȴڳ̻ޮҬ'ҽֵκζׯp&&&Xγ޷ʷ'ɺ±Ⱦڱѳ嶯ҭϱγ޷ʷ'ɺ±Ⱦڱѳ嶯ҭϱγ޷ʷ'ɺ±Ⱦڱѳ嶯ҭϱɹǹɼ̿ɿɹǹɼ̿ɿɹǹɼ̿ɿ\(()ɱöԳ̻˲*̻òҫ޽ֲࣱõ԰ֺɱöԳ̻˲*̻òҫ޽ֲࣱõ԰ֺɱöԳ̻˲*̻òҫ޽ֲࣱõ԰ֺUց(ǰưź¾ҰƬ'Ӿûרɛ٫)ǰưź¾ҰƬ'Ӿûרɛ٫)ǰưź¾ҰƬ'Ӿûרɛ٫(#I)#5)$4)Ά$PݺƼ±Իۺ;)Ά$PݺƼ±Իۺ;)Ά$OݺƼ±Իۺ;)ӻýܼ$&)ӻýܼ$&)ӻýܼ$%%ʽæЮԹ"ЮӳزɼѾʷĽܹ൶%ʽæЮԹ"ЮӳزɼѾʷĽܹ൶%ʽæЮԹ"ЮӳزɼѾʷĽܹ൶^ ݽ! ݽ! ݽ! +ĻۻܸҽдŻѿ"ؾ۽ +ĻۻܸҽдŻѿ"ؾ۽ ,ĻۻܸҽдŻѿ"ؾ۽΁*"*"+"(տ˾Ͼحdz߱տ˾Ͼحdz߱տ˾Ͼحdz߱ ĹڷĹڷĹڷˁ䍄іyu೗䍄іyuൗ䍄іyu% ƹ Ÿؾ՗Φ + ۽ ۽ ۴۽+,ɻǽҸþ޾ӸԲú,ɫͧwи͛٨ ,,´ ´ ´ մ ˾մ ˿մ ˿=&оϤ 绐'оϤ 罒'оϤ 迕R& 滑' 罒' 迖カ᡹カ᡹カ᡹Fˬ ˬ̯u羔uuණݧ̢ϭü۱z潖ණݧ̢ϭü۱z濗ණݧ̢ϭü۱z^޷խ޷խ޷խa*dz⪺dzո᰹о~ָ+dz⪺dzո᰹о~׸+dz⪺dzո᰹о~ػԾH괠$&į#(аνӼȰ湿ٲʽѱʿƺܾǟPаνӼȰ湿ٲʽѱʿƺܾȠPаνӼȰ湿ٲʽѱʿƺܾɣ'(쳾 )쳾 )쳾:-ֿ׼ҧ .ֿ׼ҩ .ֿ׼Ԭ ޾.۳ /ܳ ǽ/ݶ Ưku'ѽ ٧,(Իͷϼ̽˹ºѽ9ڹǽĹ(읮ѽ ں,Ʋq\C/Jh'ƫհθʪշ̷ְʣ@¼ĹyohaFc(ƫհθʪշ̷ְʣ¼!zsmgKc(ƫհθʪշ̷ְʣ@¼qj_QE4%/@Q^mz~xupZg%ʿ~odZPD8-)26=?66%ɷ|xqf^SI?>HOX\;4%߸q]H6ucp|ztjb^`q|\ 'ūwfO72-69?=<90* 3EXg{M4'¢|{zsxjlljbTG:8RX]_``[VLO_m{U2'jg_f`qoGPY`bcb{wҙA'ڤ¤țȷ٪٫í­דwhbvu/*&"(3D97p}'ڤ¤țȷ٪٫í­׌xecad_UTSQT\k75(ڤ¤țȷ٪٫í­זnsK^fm{tѰ=Ҿo0LUѰ=诙r.KUѰ=ꛉx~W<˺ͺ軾ʼٻտⶻ<˺ͺ軾ʼٻտⶻ<˺ͺ軾ʼٻտⶻc",ͺӹٵ忶ﱽ̹#ϳ̾¸,ͺӹٵ忶ﱽ̹#ޮĬ˼౛,ͺӹٵ忶ﱽ̹O"#淳˺դשμøм##淳˺դשμøм#$淳˺դשμøмҁԷԷʸԷᖺ|˜)պŻԬ¦ԳִƯνƳ )պŻԬ¦ԳִƯνƳ *պŻԬ¦ԳִƯνƳ =ϻ* ɻþ*bϻ* ˬɻþ*bϻ* ˮɻþ-dbY~rwʷZ*רǿз˾ͻ ᲓbY~rwʷZ*רǿз˾ͻ ޣbY~rwʷZ*רǿз˾ͻ гۏm{{{{{{ ;mɰ㿺ֳɴߵƠ|||||| =tɰîֳɴ~~~~~~ ɰ󔙺ֳɴ"~λʵ̾ 4Gֵ߬²~λʵ̾ 2I՚߬²~λʵ̾ x߬²¯˴Žɵʲ¯˴Žɵʲ¯˴Žɵʲ ջѾһ w̛lĿ٤ȿlĿ٤ȿlĿ٤ȿ1۰ɿαڱ³ƭ̿ۼɰȿIJٰ1۰ɿαڱ³ƭ̿ۼɰȿIJٰ1۰ɿαڱ³ƭ̿ۼɰȿIJٰ=ޤȾ#ޤȾ #ޤȾ $)kk й';; й& й#)&2uu2x#4ȻĶýϲԿijƭɸ"vu|u4ȻĶýϲԿijƭɸ b4ȻĶýϲԿijƭɸҮΰ٭/ vuҮΰ٭/ Үΰ٭0 ZՍ'ɩ̪ؤЮ㽟ٱңо ׶Qu'ɩ̪ؤЮ㽟ٱңо x'ɩ̪ؤЮ㽟ٱңо ‡0YVVZ"߼0YVVZ"߼0YX[#߼ЁRSGRSGRTGȁ*QCئ*QCئ*RDئB]CB]DC]Dغҫ׷~*TDλĻ*TDλĻ ٽ*TEλĻ  ÙƦ롵'SE(SF(TFPUE?PUE$?PVF"?d(ZWYWYWXWX$MȽιĺҺϺҮd(ZWYWYWXWX$OȽιĺҺϺҮd([XZXZXYXY$OȽιĺҺϺҮî˻ű$"ԻȿƼ6î˻ű$"ԻȿƼ6î˻ű$"ԻȿƼ# "$೻"$ൻ"# E೻EൻE9DڭȵؾEڭȵؾEڭȵؾkŻŻŻ"೺"iŖƗƚRPOOPO\þsovtvy{|{ypnþtpwuwz|}|yqtþyu{y{~}uwg"#"(ſwrûstr ſxsĻtuxſ|wŽxy{k# T]_[a>Z\kAYYZD#,ſwrqtr ſxsruxïſ|wvy{k# _`i\m^zZ[Pj^G#,Ŀtqqwuoomnoqo Ŀurrxvppnopru Ŀyvv|zttrtsuwvxh"#"##""#("#")V݁ ܁ ݁ ՜.+,D՜.+,D    zCustomPNNL!,w ArialMS Pゴシック Courier NewBlank PresentationExcel.Chart.8Slide 1  Fonts UsedDesign TemplateEmbedded OLE Servers Slide TitlesL 8@ _PID_HLINKSA %http://www.emsl.pnl.gov/docs/global/%http://www.emsl.pnl.gov/docs/global/"_- Jeff DailyJeff Dailyga-5-4/python/docs/sc_11/FreeSerif.ttf0000644000175000017500000633773412662210364015631 0ustar mbamba0FFTMT¥GDEF2hGPOS(sNLrGSUB7lcXOS/285FVcmap" bcvt 2fpgm/<egasp glyfBA6TheadJ<6hheaY%t$hmtxkernز Sloca+x8maxp$; nameﱟkA,rpost VRprepaN]Ih_<ȻȻZ"##@ZS /]1哮P(GNU @  8,`XXMM,A= *0M0ME48M'Fo+  "8QP444Dtc ,  M "c y  ",",*c c MX(M"M%M  M3  dC(M`5 CFM4M'M 94@@M]$KM4@C6%yc c c c MMM M """""4&"@ %%%%%%%4    %%%vc c c c c       MM MMM "c c c c c    ,"""yMMM,*3,*%,*3,*'c c c       c c c M @ +.>'c uf8  MP*" """ ,*3sP rxc -c ,gC^CX/M5 y ,W   %M "     %%y%   """5   %y%"%c c MuM""MM ,*3c #, L5#c %c """"U{ c c3''c  *#YME^p)))ap F   2T&l,   TW )+PSRStt  3P  X-'''")o bq''% %  *cLM+,H M^MPMxMtMuv<v<<<M M dM M]MdM M2M3TTMtMuM M M%M MMvMCM@M~P`K "L ,22SM 7<<&&G@MQ Q Q F)B'l"cq x~~ 9s  *}sGb.LP FM B 2]gJ c c M"y  t=",sc) (M)G))AG)A,)'3A AK#2,) ()),Kl)l+!,R,  /:"P  D $RJ Q4$z !))"i)i)@y ;ee:"QQ;  @r: e D{"@"`  _@      x     r [    { ~  f" & &m"cRIG  2 ,4 JoD -< ""`32  b)b)M  j#{xQ  { vo    D n  """    <_r<  ,z#)} ,7  "  V (2 >  (Z(Xj(Z (jL(`J xx 3(8,!2 2Q ^waz;X4zQ)M9cR.SJ~8q^V^'^0^7^=J^:^/   !-c6^UA TIW~|{zzWrrHK||-&qZ!y%yI6,63,X5 NG)rdeI.O/8M,NrzRjyZF T<p vR2(=w s .*$$+-+-2--Z-b-]St^^))UP<x.BuuaLgm??PPmga9UUU:bbqggUUUUpp.a<22g9u9aar^..9m,/8NR1\6D*\,l.:O') ' 'c  &!9d  \60J"& \))meCtDDDZ@.. " Tab~xd744jh0<0T\h0POcZZ=_gM0q)$af+k+YAH~ L( =M]Z')aU1-MM8LLLL:HHORNNLJNNNJMMGL+LJHJLRMJMMMNL LMMMO JJJMMOMLM,JMLMJHJwHMC,(zJz;LL.LYLOI`/IFNJJJQNQQJ J<LfL`MqMMN\L LbJ((h((((r(g((U((((((("((((~(((((B((((((((((((c) ((((((((((((\((((((((LI??WWI(&(5((( (((:..: :G. \.....8.8. }.:.:: 0A.:[.*0*0,@,@\.\.8.:@ 888.:f. :B..::..Yzhghg$bl@ @M.zfI6B88;R8w9x88U858g.e!MP"MkMNMMMMMJNMLMMML&D1MDGLvMMMMMLMM MNKRMMM!! !u!!!!!!!4!!!!!!! !0!!s!!!!!!!F!!!!!!! !! SGEE0  G EV1211G82d-k1191119q:+..)+;MI.?>=SkC1;qG0RG101G--0G--,G,-G-G-1.1N$1(@@@@?AN@7@>@$AN7       %%%"#%%;;;11:1X8;d11dG7k01Gk l*?]*2?%IHH3+636G//6/G//G(G/*BAB*JA*N*B>>QQ>    k   q  kT @k@77K@4*NN<G<;AdC """ """"&&&&&H&&0 00d%d040d%k+1++%%Q1+%%%4%%%4 ###dd#G' 3N##*%1# dG 1???1>?11??7?q?q?* ?4?c?FG6F8FFGF8GFG6FG8FFGF8Z[G""G"AdCII?1*"&&&1 &C1&1.0G:: ; 0002d#LL2GOQOG2%fHG6C1%d2Gk0\-  %t%Y> {(S~p~5 ,# 9 w_#Us3j (7  3z6mE  eAA'/.)tB44V>G?;*:;*.?) 2)MB-:::::::<F9+=8=4 649=5[/=A1,R$1F$p$)<O35jM< S  S zt     xc '  t   S   Szt    x))O OO)) OO O O)OOF  O a+A eA OO a+A a!A  M MM   M "M3Z%}N/))Nh~ O %Q+OB 6  vJI"8XPCN E % b"%c c c c c , M      MM """c c c c y  y  y      """",,MMMM,*3,*3,*3,*',*3c c cc       c c c  %MM M,%%%%%%%%%%%c c c c ce c c MM"""""""""""        "VG)G)G)G)G)G)G)G)-1)))))O[$<.@,28/i'6092}))))))))DKG)G)))A))G)G)G)G)G)G)G)G)xytv@@)))))))) JBG)G)G)G)G)G)G)y9Lff =}sFl`MM Oe]22))0<M M )))))@<OTMdM'M'%J\87888778;:^(^(lluKSccuD,5:DM+XXxD D EPrE, Wl l (m 4((o@ @ @@@ @ @,2,2,2 O @@C@@@ @@@ @ @,2,2,2 @0TQ * 7,     - e<""c< Yk ,*c* ''l|vv ~!>P0#%,< H&2"682Be * p@<M|#! !A"Ne2#kKV9, ^'  J"}# * )))) ) ))1)MS  V c y  :BE> >->->>>>;>->/E>EHE>-E>->>>> >P->>>>- - D>ll>>->>->H->>H->H->>>>>>&>&>&>>>>>>D D -->->->T->T-R,R,R,S-T-T.><>T->J->>>>>>>>>>KlK,K,dd440440P77444|C|C>>%%%|U4>?/#P@P@44>>70;)V7;7VVV5#8#Ku@44|8|8|8f||8|8|7|7|4|4|4|8|8|8|8|8|3|A|A4444#444444X4444|B|>|>|@|>|@|E|@|E>|3|@|>|@|>|8|5|8|5|>|>|>|>|>|>|>|>|=|>|>|>|4|4|4|4|4|3|4|3|4|3>>>|T|4|T|T|U|U||||||||||=|=|=|=X>X>>>>>S>L>>>S>T>L>|>|>|>|>|>|>>>>4rl446:.F=<*J@u9|2|2|@0404|6| | |4|4EN>44433|>|>|>|>|>|>|>|>|T|T|T|T|8|8|8|8|>|>|>|>FuutY-44444Y4444X= >>>>4l##Q 033 }4 Fx2}{L >> T    II  * 7 7 7 7 7 ,  k "   " c F 5$$$$  5   ' $  (((XXX77--L11\]]yyIyyyy 6 o#S818 ) Y O 7 7 7 > 2         J J J J J ) O 7 9  B A      J- K##########yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyhyyhyhyyyyyhyhyyyyyhyhyyyyyyyyyyyyyyyyyyyyyyyyyyyXyXy|}}#########9##|#|#|^|^//|^|^|#|#|^|\//|^|^#$$#########^###########^(#####|#|#|#u ###########:s:p#  2 4 7+ 0 'C      !    (E    6           v A  3 !  \     X2X2X2X2X2X2X2X2            ` ] !($ G   9  x   ( z  L 8PK 7DkIz kIz  M&&&&s8y82  e         !( (  ^  # # # # # #M L L L       **   *   )  [ 2  "''''Y''']'c6c6 777u73K'cTi ,)ZTD,,,b########%W!#####"N$##;$#####(##A########7##I#7#A#0#?#####"##########:#/###!$##"###$i##########"#$# 8 "#####=#=#########N#N######################""#######~########B#i#<####"##s#D#D#c#c###j#j###"a#"x"#x"?#i$##"!X!"II--P N->p\\\<=>>20000880000899999DD  N0N099'   @@h h6VVt1t1M"9#9((S((S(((((B(B(((D(B(((((((S(((~(l(((5((((9((j((s(((((S~ ~D&qr&Pr)4Ea&~Rh RM4V;9c!s,%/  "c #y 3q- (/S  }g  $Q$=  $(*t  3 M "$z"  )w$g  $  $ C$ c i $@9W3+B<# 7|2B'bM+_ c  [p*A &y"$"     &  { {s  ""0"Rdlim  [J    ; ` ! `  >>>>>>>>32323232323232323232v<44b,b,VVV44+  , 5P X5zz%%A%J%J%<%" """ ic! ""P,"@@" Uccc  UM QZZ, ,y Mc2QwHJFJJD+JUJAH+JJJJJJJJJJJFfJFJJMM'H'H'HJJJJJJJJJJJJMMMJMMMMMMMJJJJJJJMM MHHHMMMMM;;;;HHHHHHHNyLyLyLH<FHFFFKFKFKFMMMGLGL}HGLGLDLGLHHH)L)LMHHMoLoLoLJJJJJJJJJJJJHH/LxJxJxJ'HM>M>MnM'JL1LLLNFFFLLMLPPPUMUMDDDM>P7P5PLM'M:MTMTMTMJJJ@FFFnJnJnJMMMMHMMMMMMMMMMgJgJgJMMMHHHLJHHHJJJNLLLLQ.H.H.HJMHJNLNLNLMMMHDL+LFFFH;HJJJHHHMLUHDHAF^H}M}M}M}MJJJ L L LFFFH HFFFFFFFFFFFQQQ Y YMMMMMMMMMMUHMMMJMHHHHHHHHHHHH J J JJJJMMJ-MMMMMMMMnFnFnF&JJM$OHFFH#HJJJHHHHHHHHHHHHHHHHLLLHDHHHFFF+H+H+H5MJJJpHpHpH M M M J J J J J J J J J J J J J J J N J J J J J JHHH J J J J J J J J J JJJJJJJJJJJJJJJJJJJJJJDJDJDJJJJJJJJJJJJJMJJJJJJJJJJJJJJJJJJJJJJJJJwJxJJJJHJ J%JJJJMMHHMMLHHHMIJIJIJHHHQHHHMMMOO$OOOOOOOHOOOOOOOOOOOOOOOOOOOOOOOOOJJ[JMMJMMMMH=JMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLHaHWHYHLLLLLLFHM]J]J]JHJeJCJJMMMMMMMEHEHEHMMMMMMMMMMJJMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ/J/J/JLLHLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLeMeMeMLLLLLLLLLLLLLLLLJJFJLeJJJJM_J_J_JJJJ)J)JFL6J6JMMMF9y(&MMMMMJ%B D%JMFMMJBMMMMMMMMMM MMLLLLL*(JMMLdLBJHJ4LMJ;M MMMlL;LMAMM)O}J JcJ"MTMmOXM2LMJ2ML#MJHJu Z i\'R=8>o Y2Ud'gCDhUtO'h   8::|rL3wE+\Wq!:!2 imee pp[E'z'$111E##X'I'''t666p%%NL  pck..B&<8>jLUU;%%H$jj;-@BB@/ SL)444z ?U:O ' 'sqOO^C?; j.*NNFCWm":O'* ' 'c  >%ZM+[Mhq{15Ewf;$+*f\e:o .&%FA_KgM?0qo}L)aaZw]'@!\K5!FbLXb4af0[....' '''Y38Y.\\\L\}^^DA@Z&$*(((((((((''((((( (((((X(((''(((''((((((((''(((''(\\lk\((''(((''(((((X(((''((('(($$$((''(((''(((##((('((&&&((''(((((( ( ( ( ( (((''(((''(cccc((''(((''(((''(((''(((''(((((((((((B((((((((((((((+(((((''(((((((((''((''(B(B(B(B((((''(((''((((((((##(~(~(~(~(~(~(((((B((((((((((c( (((((((((((((((((((((C  K2.> k  VH Hc5.0vpUV{ibh\~XaXPOPWEE &tt7$jM%J3^=k 4^'^0^^=J^/  ^0rr44{}DDRRjyjyII00?E,6,,,6,3,,,XA  TkIIWP-~~%%|nh{{44**zz>>zzXXp}TTrrrrHHKK||XX||77%%--&&&q?|&ZA|BA!!,,yy>>%%yyCCn II(  z{e{z{44444/,0,A,#7%D%g,<,0#1,2,/ ,,%<,xP%9,%u@C,,%z'B'sLJ}:`x4IZB$RDJ$Ii> R,QDQqEbgD0lRRJh/3`Y  * <33J<>WWt'WJ\Btvzl'BB\#| ":-6]'wE& T{ T{QQ``T RRh< @5Y,,-&1&      Oxxx.KKK,zZ %Y8xy}y122EE~ ~ ~ 2722222;=;3;5;>;>;!;!;!;!;!;!;!;!;!;!;/;/;2;2;-;&;&!!6&&;&;&&&&&&ei&i&i&<    =)**cc- MW[[NN;%***3333|4-/3/229'2 .000 eJ;3;3;3;33333TTTTT000000;00;@&UVVFVUVUVVV4VVV5VVV/V 1c % #c #,#,,M,M,A,,,"M, ccB\c4S,<<[;h,;fcLAGc,N,m1( -%*  af,c2CAyAcIcMW,C ,,\E1%F\;6y+gPRP /il)++!,ChyL*#0 ,/AP0:DaP##]\^b[\]2"T=PS{g7`6iV1\oHSP,UuS]p}9Be3FTee# (#'b(/.e@cQ3J33 (BA?c53,"c%z(&^5iZqa431I0<f#Hff 42B-1/;fC)$f/o<)[:1/d))#)3!)()1& "3'93d"jjI,SjS6S)M]jIJFF#jT#Vj,6Ojkjj 6'2%A=6?AA!24@  < L)GjI6E'?:E6J=?%jF(Jj6 Fjk jj667 64 6 6>>7>886:6 666h:4 66 ]_k808rf88h]!LA]`q~_ ]_#"$" 33$ $"`E4 1HNLcGjI6Ec?:7E6J=?bjFeJjF6njkjj6.67G6I;4S66>>7>886:6L6 6Ch:84^6Rxo" 3J333J>c3J <3<3lU/ /<yUcJJ{J3lJl >UJcy33##<<1 c  # : #,c# d4+8]%&8&&&$/] &2JA` ]1 ,&%]&+(&"&'  #.(]&,&+Ec c^(MA 2c<TETc,J4 " # `  j   K  }c y cm<DZN$ &$  @4M u 2M&&LLIT?:E6=?U%xF&oK I#43$.6 a'"aI, HD , H6  sIs u|ssE9V  C5; 5`,,: h6 @3M;@-M< 2cAOto`t[fD['] '*"#>yyZgpgpy,X, `~uz~#V_ :KUikt~ 9 N U r    ( 0 3 6 9 < B H M Q \ ^ u   ( 9 D H M W c u  :[FHMVX]FZ|6mtEMWY[]} d q !ADOY}ptvxz| z~1Ya !AM`kt~ < P X y     * 2 5 8 < > G K Q Y ^ f     * = F J W ` f y ?HJPXZ` Ha Pp HPY[]_ p t !!>!A!J!M!P!###G#P#W#^##########$$#$`%% %P&&''' ')'M'O'V'X'a''''** **?+++P,,#,.,0,S,^,`,q,,,,,-.@b|Vdy)8>@CFVzptvxz|wife_^TSKB;*F}zywqc\[ZYXUTSJB@=;:76530,+* pE,*}{ywutsrqonmkjhgf[YXML5&%$D`_]\[ZWVTQP)%%#/+ `_\[ZWVUSE?'5mmmmmmtmcl 6D; % ~ubzz8~~9:ABV#1VY_a*,c~  !:AKMU`ikktt~~ 9 < N1 P UD X rJ y e l o w y                  ( * 0 2 3 5 6 8 9 < < > B G H K M Q Q Y \ ^ ^ f u    ! % ' ( * , / ; @ C G H I  ^  `  h  (k * 9 = D F H J M W W ` c f u y             : ?[GdFHHJMPV XX Z] `  5 6 : Y Z ^ e f j q x     F HZ a|   6 ePm |pt     }  E HM PW YY [[ ]] _}   $ 3 A G Z ] d f p q t  !!<&!>!?c!A!De!J!Ki!M!Nk!P!m!### ##,#G#H;#P#P=#W#W>#^#^?##@##D##I##J##N##i##n##t##v##~$$!$#$$$`$i%%% %K%P&&&@&&]''a'' e' ''i')'K'M'M'O'R'V'V'X'^'a'''''''''**%* * ,**-*?*?.++ /++/=+P+T[,,!`,#,*,.,.,0,Q,S,Z,^,^,`,o,q,},,,,,,,, ,,--..5@_6bsV|hQVWdgy )68<>>@ACDFOVY$z}(,.267pp8tt9vv:xx;zz<||=>CG0J&)TVԜԞԟKԢԢMԥԦNԩԬPԮԹTԻԻ`Խah  9;>@DFFJPR֥֨!="a+"0"   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a rdei xpkHvjw5s{|gw(&sBl|\cn1T_m} b y z ~ l:  y qz,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-, ڰ+-, Ұ+-, /+\X G#Faj G#F#aj` X db8!!Y!!Y-, %Jd# PX<Y-,@@BBKcKc UX RX#b #Bb #BY @RX CcB CcB ce!Y!!Y-,Cc#Cc#-KPXYF+X!YKRX!Y+\X E+D Eg++D E ++D E 9++D E++D E"++D E++D E8++D E 2++D E ++D E+D E6+Fv+D E#+Fv+D E+Fv+D E+Fv+D E+Fv+D E#+Fv+D E+Fv+D E+Fv+D EI+Fv+D E,+Fv+DY+),&&6<IfNUU\fgns((((pP@X$h0l  0 X l  t X \h4@HhX 0l lhTl L ! !"D"##h####$$%H%&H&p'D'\'x( ($(D(T(p((()H))*D**+$+d++,<,------..(./l//////00,00001 1$1<1p12 2$2<2T2l23|333334 45|555556 6$6@66677 787P78848L8d8|89909H9`9x9::;;;0;H;`;x;;;;;(>@>X>p>>>>>???4?L?@h@@@@@@AdABBDB\BtBBBBCpCCCCCDDD0DDEE,EDE\EtEEF@FFFGG(G@GXHHHHHHII,IDI\ItIJPKK0KHKLhLLLM\MtMMMMMNNN4NLNOhOOOOOOPP(P@PXPpPQLR RRSS|STTTU0UV(V<VVWDWX,XYhZ0ZpZ[d\\\\]^^^_|_`a,abLbcXccdhdeHeffg<gPghPhiHiijXjk<kllmmmmmmnn,nDn\ntnnnnnooo4oLodo|oooopppqq0qDqdqqqqqrxsds|ssstPtttu u$u<uTuluuuv`vvwwwwxx(x@xXxpxxxxxyyy0yHy`yxyyyyyzz z8zPzhzzzzz{T{{||}0}~~0H` ,D\|@hXL$<l(<<PhH\$<D<$ d t,dTd(<P0XlD$8X@,L\DLxT0\8l0DTd$|4Hl0`D`@L`t Hl(<Pd4Xx¤¸$8L`ì,H\pĄĘ(HdŜŰ,|@TǔǨǼ4XxȬ0L`|ɐɨ(Pʰ$8L`t˸(@\̴,TTh|͐ͤ͸,@TxΤ hϘdд XѼ҈ӠTԬ8Ո<l֘h׀פ׼4L\l ٨ٸ,<LDT۬ۼDTlބޜ޴ߘ8Dl(ldttpHt x 8Pd(@HLtHpt xl|0@p $<0(x 8  D \             ( @tHxHP|t(<DLX D T d | !0!"T"l""##$%|&&'(4()*D*+l,H-.//01\12\223345T5566,6D6T67@7788`89 :;<==> >>?D?@@A0B`ClD DEF$FGHXIIJhJK|L LMDMNOOP8PPPQlQRlS ST,TU(UV@VWLW\WX|YYYYYZ[\\]0]^D^_H_`P``aaa0aHaXahaaab b$b<bTblbbbccc4cLcdc|ccdDd\dtdddddeee4eLedeff0fHfg|h0hij jjk4klpmmxmno(opPpq8qrrsst(tuvhw0xxxxxxyzd{8||}~~ $(,$pL<DTP4 ,HXtl|@H,d p`Pd<40,0|,\ D|$8||0D\0DXl0Lp(HptpdTP`HDxH4`8h<X40ˆppx dƸX$ȰTɰ ʐ˨X<ͤtt,dhѴ4dҼ@Ӽ8Ԭ Ր0֬TdDٰ4ڴL<ܐ`ppD|8l4\<  | |LhptX|8 x   x   0  x|8t0`\x8TH 0    !!0!H!`","D"\"t"""$P%&h'L'|'(0()*<*+x,X,-x.$..../0 018223 3445D6(7789t9:;L>?h@@pAABpClDDE8EF FG(GHH\HIIJlJKHKL`MMN0NNOlOP(PQQQR RS(STTUlUVpVWXlYZ([`[\$\\]^8^_D_``atabbDbcHcxcd@ee`effg4ghhhhhitijjdjkDkl,lm mnnnodopHpqqpqr0rrs`stHttuvdvw<wwwx xlxxy$yPyyzzHzpz{h{|T|}$}|}~t~HL<x8P,H,l|H0T4d($ d``4l$4HPP $l,,pt8Ȍ( d̬Hhϼ<д(рҴd|4ՐL<؀٤tڬthH|ޔެߤHXTD$d\xh<@`xxL`\thXH0|   0   D$`\p<hTl$lT P !T!l!!""#t#$4%%|&&'H'())*@*+,,-../h0T1(12d23t3455p56@6778L89x::;,;x?$?@`@AAADA\AABxBC(CCDpDDEtF FFGH<HdHIpIJJJJK4KL|M4NNOPpQ8QRV\VW\WXYYZTZ[X[\]]^$^_<_`Pa$abc cd de<efHfgh hihj8jk`llmmn(nohppq,qrrspstuuv4vwpx xyxz(z{D{|X|}D~,~H `,p|<l<t t0D8P(lph44Hdː0ϰ҄\ּ0ـt(p4 P H\8Hpl`   xXPxd($l0 !#$$%'(d)+--./0123456789:;=>@?d@AC\DF`GI,JLMOQhRTUpVWXpYtZ[|\\^^_`a0bc$d(efg(ghik|m n<oqrtuTvDwHwyyz{}$~dp|,TD00t<$h(\|X4x,Lh,T\\\ǜȀɰ̈́h`ЀDTp<լthd$۬ܘ޼4` xlxt8|Dd@8x @   0 p4`X\h40 P !@!"X"#T#$\%4%&T&'((p()t**T*++,-,../t/01 1223l34@45L56P6747899`9:H:;\;?L@@A8AB<BCDTDExFFDFFG,G`GGHHLHHHI0ILIIJ0J\JxJJJKKLLLM\MN0NOP,PQpQRS0STUV$VpVW$WdWX,X\XY(YYZ\Z[0[\X\]<]T]^ ^__x``L`d`|a0ab8bccd8deeefffg8ggghhhhiii,i@iTidixiiiij,j@jTjpjjjjk k k4kHk\kpkkkkklll(lm4mHm\mpmmmmmmmnn$n8nLn`ntnnnnno8oooooopp$p8pLp`pqHq\qpqqqqqqqrr$r8rLr`rtrrrrrrsss(s<sPsdsxsssssstu@uvwxLy yzLz{||$|8|}}~H~pLhHT H(t`(@d,@Th|0DXl  4H\p $<Tl,l,D\t4Ld|8Ph0Tl,D\t4Ld|Tl,D\tx 8Ph(@Xp0H`x 8Ph( ,Dd|lXp, 4Ld|<T(@Xp0Ph(@Xp0H`x 8PhhDXt4Ld| $<Tl0H`x $<Tl,D\t¨ 8PhÀØð(@XpĈĠĸ0Ld|ŔŬ $<TlƄƜƴ,D\tnjǤǼ4Ld|ȔȬ $<TlɄɜɴ,D\tʌʤʼ4Ld|˔ˬ $<Tl̴̜̄,D\t͌ͤͼ@Ph΀Θΰ0Ld|ϔϬ $<TlЄРи0H`xѐѨ (ҌҜ(@XtӌӤӼ,<LhԄԔԨԼDՄ,֬ׄװ,,,,,,,,,0ڨPhۈ۬ܤܼ\p݄ݼ$Dޠ,Dt4HPdx8`0DxDt8Pt(<Pdx,@`0Px`0 (D40Th  <d(<PT\ L8H L @   , T p @$lTXhX@| 0@8  t   !8!L"8"L"h"""""##0#P#h####$$$($@$`$x$$$$%%%(%H%X%h%x%%%%%%&&0&X&p&&&&&&&'(0)0))*T*+X,,--,-@-\----..$.d./////0 0H0\000001,1l12<233T3333444h4455\5556606D6X6t66667$7@7T7p7778l899909L999::(:D::;,;<<<\>x>?4??@@@d@@APAAAB B B|BBBC4CDD@DE(EPEdEFFtFGG\GlGH HlHHHHHIIJJ<JTJlK KKKL4LtLLLM,MHMdMMNN4NTO PXR8RSTxTTTUU U@UpUUV VVVW@WXWlWWXtXY YYYZZ|Z[[4[T[t[[[\0\H\d\\\\\]]4]t]]^<^T^l^^__X_p_```a4aabbbcc8cTcd@dddddeeffDfXfg g8gPgh<hhiHidiiiiijj(jjkLkklpmXmnnHn|noo,o@oho|oopp4ptppq0q|qrXrlrrrrsDsXssttt4tLttttuuDupuuv$vhvvvww0wLwhwwxxxlxxxyy$ypyyz,z{{|h|} }d}}}}~ ~\~ pH`x p(L pdD,L`d@T<,x4X0T L\|d<Pdx D| (< Tp  ,Hdt(Px@h(Hh0X@`8Xhx0Lh(Hh(Hh8d4`,X(LtHt,\ TL|$P 8d$T$d<l8(H4Pd,Hd (D`x$¼$8\xÜð 8Ĥ,ƄƠD`ȌȨ,Xlɔɰ  Hdʐʤʸ0DXxˬdT Pϔ`М0ќHdxҔ4LӘ HԈ$tռhքִ֘ 8T׀ל׸،t0Dݘ@ޤ޸`l|@4lP<8`\8|<XPpH| \     8  pDD<tP\t !#x#$%&,&'4'( ()()X*p++++,\,,-D.D.0<123356678:;p<=4=t=><>?\@@AALAAAB B$B<BTBBDDEFH\HIJKMOPQQ(QRST TU@UVVdVVWXlY$YdZZXZZ[P[\ \h\\]]X^a,b|dehf8giijklmo0ppqrTssxttXtuXvDvvwwTwwx8xyDyz{X|h|}d}~~X~T``\ (h\4pD<8lPlH(8|4`8`hx(@h`hd\DtDl0Tx$HtLp(l0x(Xh$<Tdt xpÜ4lļ$h|(Ɛtnj$hȬɜɸHdˀ$8TDẌ́͘(DpψϬ LtМHdрѬhҤTӄ,Ԑ0ք֘؈<l,۸hݤ(ް8ߘ߬4xx0 <<8l`$8L`t(<Pdx,@Th|lp<8Ddx  4H\ppL$l0h tD        ,   t @T\xh$d4P8(L Xp,D\t   0 D \ t     !!!0!H!p!"d##$$$$%P%&&'x(())0)H***+l,,-L-.\//0@01p2 23(340444566(6H8`89949::0:D:t:;<,<=L>h?h@@ABCCDDdEPF$FGLGH\HITJKtKKKKKKLLL0LLLhLLLLLLMMM(M<MPMdMMMMMNN$N8NLNxNO$OOP@PQTQRLRS@SSSTT$T8TUVlW0WXYYZ`[,[\]]^L^_`Ha ab4bbcPcdHde|f<fgPghiij jk@klllm|mmmmn4nnoHooppp$pTp|pq`qrrrs$sdsst|ttuuv4w w@wxyxzd{}~L D8X0p|D4 \\h$@p8$8dL<`4|D@̰t8 DDԨըֈ0T8 xHTP|x@$0l    P     X (      T     t D  ! " $ & ( ) +x -( .D / 0 2$ 3@ 4 6 7L 8 9 :  > ?p @l A4 A B D D E` F\ G8 HP I Jd Kp L M N O Qh R R T, Uh V W X Y Z \ ]X ^ _l `d a bT cH dp eP fd g hl id j k l n o pD q r s u vt w` x| y z { }L ~ $ D 8  l  < p  d d 8 P X $ ( p | l X p <   ( ” Ŕ  ʜ ̈ ͌ 4 x h ׀ T D  4 t ,   d $ p 0  @  p X \ H      P  D        d (  H   `   D   ! " $ $ %T &@ '8 (L )P *, +@ , - . 0` 2 3 4 5 6 7 9 :d ; < = ?4 @T A C0 DH E G4 H J K M N\ O` P@ Q R Tx U W Y4 [ \ ^ _ al bl c e f, g h i kd lH ml n p q| s s u vX wl xx y {H |T }  H  l (  t ( p    8  h d   X p x 8 4 h ĸ 4 X 8 H ˌ ̤ π М x ׌ @ \ ۰ 8 p 8  h @ D p $  4 D  , $ D 0  X d    L \    T X |          < D  !p ", " # $ %0 %H %` %x % % % % % & & &8 &P &h & & & & & & ' '( '@ 'X 'p ' ' ' ' ' ( ( (0 (H (` (x ( )T ) *@ *` * + + , , , - . . /0 / 0 1< 1 2d 2 3 3 3 4P 4 5 5 6 6 7 7 7 88 8 9 9 :$ : ;D ; ; <\ < = >P ? ? @ A$ B C D D E F G( G H I` J J Kx L@ M M N0 N O Pd QP R R S T U8 U W X Y( Z [ \x ] ^ `@ aH bx c< d e$ f g hL i j j k l m n o p q r tL v w( xP y { } ~@ X t D < T p D  < ( < < L 8 < H  H 8 \ p x  L D ¬ T X Ř Ƭ Ǹ ȼ t 4 D   X < ӈ x Ր ּ $ @ ۀ ܼ h ވ l   0  0  0 L , ,  T X |    t d   x  h    0 t  H  " # $ &t (P )t * + -X .t /T 0| 2 3 4 6< 7P 8 9 : ; =@ >H ? A B B C DT E G G H I J K L L M N OD P P R R S T U V X YT Zt [ ]4 ^ `< b< d e` f h iT j@ kt l m o@ p r sp t vT w y` z { } ~8 | x < 4 ,  ( @  h d T $ (   X  h x $  L L   x  ð < < Ǵ D ɬ ʌ @ ʹ H τ @ 8 ` H Մ 0 ָ 4 ה x < 0 8 D ܜ L ݔ ހ  ߀ $ ` | ( | x   X   8 P h  ( @ X p T   D 4 0 \ ( <<xdD  | <  T4Hl@Xp@Xp(4DH|<t  d!<"(#%&D'(*x+-.@/1@3,5@709L;,<=x>\?d@DAHBBCDE\FdGHXI|JKlLMxNOPQSTTUhVWY Z`[\l]^d_\`Ha bbcdleDf,gghiTjjkkklXmpnopqrtu\vwxzz{|}~,( <$Dt`pLTp|@ TX0Hd8$ DȘɨ̜p4԰ P٨PݨP,$4X@p@@(h |  t8,t !#$\%&()@*+-8.d/(0012L3T4p5t678:;x<=?T@ACdEFdGI,JLNP8QRSUhVXZ8[h\<]X^_a bXcddf$gihjklnoprshthuwwx<xyPz zh{L{l{{{{|||0|\|}}(}T}|}\,4P $H\\\H,l4` 8Ph(@Xp\($x4Ph(@Xp0H`x8 d`Xp ǀx Xɤ˸l̠4͔`pΈΠθp(h \јѨ0ҘHӐx(8@֐֠Lאdx$p(l۰Tݜ(޴߀L4Lx`D4<8|p4h0P($`@pP<$<4t,D\t||xd40X @   x 4  `0HL pD\$4pD<X <x H!!p!""##$|%(%&'p(0)4* +\,0,--x./P0P1(2034557799:;;<`=>d@<@@AAtABCD D$DlDEE0EF FxGGDGtGHH`HHI@IJ8JK8KKLTLMNNOOP@PQR0SST4UUW<WX4XYZZ[0[t[\\H\]$]x]]^P^__`a4bc,cdd\ddeHeffTfffg\gh@hi|ij`jkdl llmnTnoPp`qqqrrs\stvPvwwxzLz{@{|(|}@}~4~P|T(Tx400Ph0@8Ld \ 4H$DdP4LlH4L$P|X`t\<lpHl, H4Tl\0p\$ Pl dT,Ld|@|´dHŤ8`t`Ȥ, Tʠt0`̰̐ @dͬH\ЈHdѬ4TҐ(DxӜTH`xՐը8ָ֠pׄ,ؐ,tِ٨xڔl\ܸ,ݠ ޠD4T<@Xd\(lL|$P@0\x@0<(t80 H8$t\4|lT@ 0  |  d  \  8 \DD@4tP@t80, p@ ! !d!"8"##$4$%&&'()*+<+,-x.P//0123t45,56@67x889(9:L;<;>? ?@lAABCHDDEEF`GGHdIIJLK KLPLMNdOOPPPQlR(RSTTTUUV|W$WXXY$YZ<Z[8[\0\] ]^^L^_,_`4aabcLd(def\fhhij|kdklmXn@op0q qtqrDrssttu uxv0vwwwxdxy8yzz{ {|<|}L~~@8D,$x(DX0 Hd8pH80<`0|8,Hp,x4`t(T(0(„ÈøDdĘXŸ(ƴ8pǨȘ8Ɍ0ʤLˀ˜D̈,`PtάLπ<xШ4dрѼDtҼ\LpԴDl՜$xpװ \؄p٬HڔLی$Tܤ݄TބH߈(\t@h(dXt (tX<,|@ttHx @ T 0h` l@lt D|( L0L<,8@$P X H   H     T   p L |TdthxT<T|x$0d@   !t!"|##$0$%H%&<&'H'X'h'((((8(H(())))*4*D*++x++,-D-T.l///0|112D23x3445@5647 7t88949:(:;;<??p@@@@A<AhAxAAB4BDBTBBBCdCtDDDDDEtF4FDG4GGHLHIJJK`KL\LMLMN8NOOPQ(QRDRSSTTU$UUVWDWXDXXY Y0YXYhYxYYZZZ@ZPZ`ZZZZ[P[[[\@\P\]]]x]^4^__p_`8`h`aa`abbbdbc@ccd,deeTefDfggghhi,iijj8jljk$k@kxkkllLllmDmmnnPnoohoophqq\qrLrsssttpttu|uv<vw,wwx8xyyzzz{h{|\|}x}~~h|0tX,xhpt((00XLd|,Hd(P@Xp@@(@Xp`<d<\| L <t| Ll\ T\d\t 0Lh,Hd (D`|$@\x <Xt8TXd3!%!!X @tf!X 7#.546322#"&4  5 ', zV#*PT ..MK'  ##7##7#537#53733733#'#3m:!:!ktnv::ai&7777,(.446753#.'#5.'53.5654&4ZX"q0 F? 9, a`"?N-RGcOg)ar,@N ?? (o@A  (KOWWOI7W-R#2`.9= 5E2#"&5462>54&#"232673##"'#"&546"32654'.16.(3B6B+L)).J"&/)/E('0_4:'wV1EV0a!=f  s83:r)3G:^Li0!/hm $x&Or ]K4_I"U *.9C654&'533267#"'#"&54>7&54632>54&#"327&FU*I0:SA[0 #&54632e #%0O0.54>7$8G6%%2M2! ,6226,-P[EHUO&$:]Y]_<"O ME C465#"54>7.546324&5462>32#".'#"&'2$&E '[#/ #5(X#D'5#. W98#*9X  S;9"99Y 533##5#5BBBB8sf#"&54632'654  !".>2 R 3&-T82'3#'?Fd 72#"&546}!" !d" "#DN "&54632" 4&`||jb|BĚ<o"57!5>546$;8'Q[$//>323267!57654&#" !)I.Nk"! 7zN?4?"A+"fKq+ z?N9I+-7232654.#5>54&#"'>32#"&546Q["7L*:3"16=1/GYREW*4#QKj  %##5!53#fM:,N@@CW (%4.#"54?3267+#"&5432326e/CS= m &*%9KE#8B+Y;P5R-  Y Uuq;\8$ !%>c"!"&54>7>32"32654&e{6Vev/0!VfumD/LB58G)WoXE qq`g<;tYR^g ##"'7A)+ ;rT38):#"&5467.5463232654.7>54&#""ZAkZUk1QO-lRKa<,$F91= "/&  <3/=:sC[:M\\I3E=ED1DZP>3Hc#F0AP=1 "U !4=8+*J#'>7#"&546322>=4#";rJLQcwYa|3RV01, Cz9p[e|(Ts[J" %'!68YiQ' g Ps& g%5% \ BHx!5!5BBBB4D#/2#4>7654&#"#"462#"&546Ll""%2%?-%:&0]L UF$K/-@Z "' /UG2F& 0|S! t)2>"327#"&54632#"&'#"&546327332654&4&#"326~Yk I[5՘nJ$36G%3qS EA'1P)_ 0H0!Đ̩|a(!HA/Z& .zKpoQ'.%#5>54/!3#5>73%3().D%). 8t+`u)5m7Q,7%#!5>54&'5! 2>54.#32654&+"Q3dE>"!?4="-B:,N<2_FMZV,:9# 87!3 ; :+)9I?;CFy46323273#&#"327#"&@p !  7m-LQ.vi.UE!!⺢WAe=B%#!5>54&'5!24.#"3 6TX9;[W9m,FrI>N-V\C, 67)AYV6+OQ:% U)7;2673!5>54&'5!#.+"32673#.+!Hk\%-7 7 6U @%  &>P3Q!55!C& '8>" "$%#.+!5>54&'5!#.+"32673 (=!:9 7 6U <) =#=$#>5!C& #< ."326=4&'5!#".5463232673#.9X6" z6O9,@-ZbJ1:q  `|)@VO(#8,,0IzN!N]+!54&'5!!5>=!!5>54&'5!/:: 8: 8:::g66D5 "?5 "?66;74&'5!!5>s!@)?#$>?"m7 7D7!  r723254&'5!#"&546; & ==XQ+8l B77^g( "75!!52>54&/!5>54&'5!7654&'"431D2'  I9j :; :=N1I"`8i7#>5!7͡H  V %2>53!5>54&'5!3b-"   07 7;"7'  !55!!5' _$ ##5>54&'533!5>5$:>#!>8 7; =&mL1/M7 5D5!#> ##5>5.#534&'53 F$:>## %;3+&xL1/M#QL/" !"&546324.#"32>cG+:71N- ,W<=Y-VHpD,*?VO)3bb<54&'5!2%3254&#" #:dB'#;98-TS2"`e06'7!!?6&J:MI"N 4#".'.546 4&#"32>%306!=V&G76$+" drs_2N. (BE&1M. K7`A6  OG  " $"•)?TM(XB)@UP *2##!5>54&'5>54&#"%+NS2%8 :88yqY^#J5!46 #>5Mi"[V?Q#"#7!#.+!5>56T949U6">> l.RS-7 !@%73267654&'53#"&54&'5!Ka8Z$:> 5iM{;<dg+$+]K1,L;XO*}876#.'5!#654&'5%'& .) ) ;%B%[o0,# #.'53'.'5!654&'5(S:?''& k!"+ M}&'ߦYF+ R<" FS- 3!5>54/#5>?'.'5!7654&'515/())$3_w4 ,'*@mF=2.0U*q()!:+ LA Og4 v;2 $!5>='.'5!7654&'5'8+$CD!24"G'-B9!AI? U%2>73!5#"#7!. 3B! P& ) a,$!Xd+ #3#"3+Z12`4(3#CDN"d>M)#3#\D754#"#"&54632327#"&'#"&75327>%$18 L*aGR> 'V<.;ZH("' a =S/AOQ!"'I,)( #>32#"&54&#"56732654&#"N.KecDE;'<%0}\k)\S[m.!74632#"/.#"3267#"&X?[" =KWD+>$ '&>!Sko=*.aMVm*4 4 }*'5#"&5463254&#"567327#26=4&#"X0PSfzV63[8&3>(9DL @Cw`j+#+(5#53>32U 9{z =6RRP^-;DYt 87: py#&*8F7467.54632;##"'#"&5467.32654&#"4.#"326I>2+aF'YMS]? -(N7B_Gf-5JPBUh8Dey,#'@&#(6 :>/D_!'+)EV*:/Ha9(7'(% !(6+0=)2,VN1 )#5>54&#"567>32#5>=4#",+ GG#D,{)+K3W45 -'4 3j"567#5>=4&2#"&46>FU140#66!"*&#567#"&5463232654&2#"&46M-PLVS)5207jp<>M{ "*15677654&'53"#5254./#5>54&#"UF2C15!( 46o\z 6-&! $  '$567#5>54&#"c<0/o)(#=567>32632#5>=4&#"#5>=4#"#5>=4&#"HD>0=/ *i)$*567>32#5>=4#"#5>=4&#"J@3;#7?%&I*$&&O0!OG%"/a"+% 2"&54632654&#"`|}{!N?8@P?5Àbhegk`UgV',567632#"&'#5>54&#"32654&#" ?Q@PI^yY + 8,E#6CC8#C MOx]m/'#<,gSWi,'$73#5>=#"&546323276=4#"h6 )5$DYFZ^6>12$]@J  *Jx_l+PC "dgO#"&#"#5>=4&#"567>32(,2"30PD%4j#:+ &!\5)3\.273#.#"#"&#"#5332654/.54632 2+"++l-'S:T   9&-4:@5M;!: C8&+@7%4L F)'!-!$B*6E C#327#"5#&54>7672e 0HY5* /+# L- 2# t (%'5#"&=4&'5332>=4&'533N; "7B$* '/"2S  G;#-%%##"'.'53654'5 x  fc/22/M$ /.'537654&'53"/#"'.'53_!#TZ{ [pc6P) .* 1+',V&2>54'533#5>54/3#5>?'.#53  (3S%[O(r^+.0)*x! { E&(2654'&'53654#53#"&54632>, '  sa0 (O2 *2| X  hl\!%2>7!5#"#7!'.  - [ "#!7vkdK^.=4&'>=4>7^XM#22#.7,4'&88&'46T4..4,7  68>44>86 C3CBNK|^(@23267#"&#"'>2~#6"6#2~#6"6@D 0%D 0%`&M5vC"+7&5463273"&'3267#"'#7&#"t],#/K& e ,@' &$;!1"Ps=K Be|6 ,89 C ]M6J =H%#"&'#"&54632654'#53&54632"&'&#"3#32>322654&#"'D( =3*%2)lkjY8J,7-2 }yTA"2e##3 -2$##""* -$!k5((4IB,]-!##y+  %: Z&'7&547'76327'#"'"2654&b))b2`=BE8b0`''`0b9DA>`?WWzUUl`;CE9b0`''`0b:CB=`2b))bX?>YX@>X27#535'#53'.'537654#533#3##5>5_)*#A vpA'5\ 02(L(J*03(L(I5$%>C33CBBBFlBN4654&#"#"'#"&5463232654.54632.54632#"4&#"326"$&/"YA3 8&OA:P"+(/6LL6B1 <(M>7ID&'1)%&" ' *qJQ5D1;&9F:*$"*# =5:T03D2<(6D8*4w&2x( <n"c&m&&f+5#"&54632327#"&'#"&54>76754#"26=L =/i 0+(,' $ 5&q   &`s ,&" *M!'  l%5!5!JlB'/5&fm #BY!! 7Y69W 2#"&547"32654&xST=:S+==*+>>S=323267#57>54&#"2:ITVy %b$-+6 - -;/ISU Ok'Q-F*%4&#"5>54&#"'>32"5462326?4+$?.-?5^dcn:9::>86@\mbW65!"??[_TK 2#"&546{(4)73632#"'732654&#"b)# (.C:-'% ccA% '- C#5>54#"57 %v&  70 2#"&5463254&#"@QXA?RU ,%G-$ 'K;?UO<@Ok=QW9H(!'  % #%##5#53#5# #5>54#"577F/F>1 %v9ZZ1 N  73 # #5>54#"57>323267#57654&#"X>1 %v2:I&.Vy %bQ+6 N  7  -;/%D-U UkW2-F 7%##5#53#5# 4&#"5>54&#"'>32"54623267F/F>1? 5+$?/-?=Wo4%9ZZ1 N,)%!3,0#'+#N:N2'%&w"z#$z#$v#$F#$C#j$#$_9<%.+;2673!5>=#3#5>7654&'5!#.+"32673%3$71LQI+,9 @5!  )14ELWoG77-%0R75}!. 0)#>F?)y7327#"'632#"'732654&#"'7.546323273#&#"-LQ.vi-U  (.C:-'% %}@p !  7mRWAe=B4% '- Y!!⺢ Uz#( Uz#( Uv#( UB#j(;z#,=z#, Bv#,<C#j,-#!5>=#5354&'5!24.#"3#3 6TX9SS;[W9m*CwN>N-V\C, 6,7)AYV6'IT=), F#1"y#2"z#2"v#2"F#2"C#j2& 7'77''00000000"!)7.5463273#"'# 32654 &#"+XWH1X,[TO1Obs;"B_91k D^:2tl54&'5!32%3254&#" #:dB(#;98<Px"`g _06(47!!?6#< bMH 3#"&546323254'&547654&#"#5>54>32hK+6@ _0+'/&%I4N\9y#Rq)   vAJ:1(r2LC$SE6?%"8D%"7D%"8D%r"6D%k"j9D%":D%w6CJ"&54632>32!3267#"'#"&54>76754&#"'.=2673.#"(\DA4"3"LL/!+A$ '_?Q03@%3A;FU$( [:'8J=%(+(  .>-Va'3A&,5UJI*=1'>#$?0,54!2-$3$A;:)674632#"/.#"3267632#"'732654&#"'7.Y?[# =KWD+>$'V= (.C:-'$ &L[o=*.aMVm*4 OI7% '- [ y"8H"7H"8Hm"j7H""'"n&6&(#"&54632.''7&'7732654&#"}c]}zZ$4& *,{!y>G*1A&_![N@9?P@5A~de#7K-A@, 20jaVfVr"TQ"TR"TR"TRq"TRk"jSR%!5!'2#"&5462#"&546!" !!" !B" "a" "'"7&5463273#"'#3264&#"}`{a,09'Ab_/.A% #/8?ޟ%+5ANyfm}Fzh{*b0$VFf "?X "TX "GX m"jLX&"T\',567632#"&'#5>54&#"32654&#"]4AOI^yY + 8, E#6CC8#CoNx]m/',gSWi,&q"jd\#$%H":D}#$%":D[*-#"&547#5>54/!3#5>73#3235;*6().D%).",tIL, .++`u)5m8#"n%[?K2327327#"&547&'#"&54>754#"#"&5465327>R> +5;*6V<.;$18 L*aZH("' OQ!$L, .++I,)( yz#&"LFyv#&"GFyC#&n"6Fyv#&"LFw#'f&G~%2#5354&#"5673#327'5#"&5463254&#"326Tyy[8LL0PSfzV63>(9DL>(1" x"c#4@Cw`j+(54&'5!#.+"32673#.+;2673#32Q5;*6*7 7 6U @%  &>!Hk\%-,IL, .+!55!C& '8>"3Q#"[&,3267327#"&547#"&54632%3.#"a010G$6."+6;*5Weu\LT *.Z?[-09*G'1$L, .* xho[\ A2 Uv#(":H u#*&"HJ k#*&"TJ C#*&k"DJ ')*&+~J#+ z#RK3!5!#534&'5!!4&'5!3#!5>=!!5>5/kWW::/::WW 8: 8:'6  66  6'l5 "?5 "? 14#"#5>5#5354&#"5673#>32#5>5WK3,+@@ l"#D,{)+,j"45'  m'-'4 3K>#,.f" B#,$H";}#,"[#!327#"&547#5>54&'5!; $+5;*6?"!@)?#$>.$L, .+ 87 7D7![#."57#"327#"&547#5>=4&2#"&46> 1!++5;*64076*$L, .+6!!*;C#,"57#5>=4&> 14766!#-:,&#ML ~#<-&2& "').'N6#"&#"#'&+#5>54&'533267>32) %"26"}" 3665C)0$+51 9b & '' %wHF& V#%/&~#O V'/'UO V"/~|"O~ V'y;G/'yGO V(%2>53!5>=5754&'5!73b-"   07 WW 7;"7'  !52125!!5Y1Y54&#"5677#5>=5bc<MM0/Nj#5,5)(6, |#1"TQ '1'Q t#1"TQ"Q1~84.#"!5>54&#"567632#"&5463232>>.$qO$76  6 g$9<'vi+8 YC&)"+Aj4*3-LZ(  3b&02654#"#5>=4&#"567>32#"&54632$I*$&&J@3;#7?VS)52>Maa"+%O0!OGjp<"#2H"TR"}#2"TR"z#2"TRu/<23!#.+"32673#.+;2673!"#"&54>4&#"326V t+F =b3*hF9'4/@', (?UR/4[ca\5/C&%=;(8HO|K172/!+43267#"&'#"&54632>32%"3254&34.#" 5'$;# 'R:.;C3[sqY/D%:)=^C-@xg;P*?J)(0QD,33,dg"**"QfIWpx|&#*5O"U'5O'-Uv#5O"U*|#p63n"1V*v#q6%\"V*)G.#"+632#"'732654&#"'7.#"#'332654.546323273c<.:DOcXuU  (.C:-'$ $!O %bC7DB^]BgF*b XT4)(H,5g>Mi3% '- X[V?2/I47V9L_""3)\H273#.#"+632#"'732654&#"'7.#"#5332654/.54632 2+"++l-'S8  (.C:-'% '!  9&-4:@5M;!: C8&+@7%4L7% '- ] F)'!-!$B*6E*w#p6'^"V)Q0!632#"'732654&#"'7#5>5#"#7!#.+B (.C:-'% )> 6T949U6">A% '- c!@.RS-7  )C4632#"'732654&#"'7&5#&54>76723#327 (.C:-'% &B5*ee , 7% '- \m- 2# t /+# FQx#7 &W~Q#53#"#7!#.+3#!5>5rr6T949U6rr">> :-.RS--7 !@ C$#535#&54>76723#3#327#"5F995*eeee 0HY-b 2# t b-/+# L>#8 m"GX#8 H"IX}#8 "PX#8 "BX|#8 "TX[173254&'53327#"&547#"&54&'5!Pb$:> &;<+6;*34,~{;<chK1,L[[12,$L, -) ~876 [4%327#"&5475#"&=4&'5332>=4&'533 L+5;* "7B$* '/%$7+$L, i  G;#-%%%w#.:#Zw#<&"W\C#j< U{#="8] UC#=k"7] Uv#="8]".#"!5>5#53>32U 8 =6 P^-;DY287: py#,5354&#"57673#>32#"&532654&#"F C1N.KecDE;'<" x"%0}\k)\S[m.+;F%#!5>54&+"#"&543! 2>54.#32654&+"3dE>"9 $3<4="-B:&)D8+_FMZV,:9# 83#25)!3 ; :+"2  I?;CF"  &32654&#"7&'&+>32#"&54!:'>DE;'< )N.Kec#576732#!5>54&%=9 #&66!(ee:KqA( 3gFg,> !BjHH &51<=%#(Y">32#"&54&+5632654&#"N.KecDE;'<%0}\k)Iq~\S[m.y &&6*2327432#"&#"#&#"327#"&546k?r  )52#7m-LQ.vi.U!!<3$WAe=B*:174632632#"&#"#"/.#"3267#"&X1& x)52#" =KWD+>$ '&>!Sko<3$3.aMVm*4 4 }34.#"3 #!5>54&+"#"&54;2,FrI>m6TX9/ $3<[W9G+OQ:%)-V\C, 61#25))AYV'`&74>;#"#7!"3!"&7327&#"'<{VF~<%&;q{\L&##3J&!<>%s':9<&h^IX%-/ .726=4&#""#7!"327'5#"&546325%4>(9DL .!0PSfzV63**(=#"#5 $A U6 7 7-%\k4, >& 9& &C!5D5!Q3 ">,3"327#"&54>7&546323273#&#"^g_m =,gEJi$/!oR1i,8NM!CT14a mX'?$ !Od̥-74k+23254&'5!#.+"32673#.+#"&5467 & 7 6U <)  (=XQ+8R B5!C& #<=#^g( &&>32#".#"3##"&546323265#5P_-;9zzVS)52Rqx#&%Yt ^jp<;P  06;%4&'5!#".546323265432#"&#"#.#"32659,@-ZbJ1:q )52# `W9X6" z6O8,,0IzN! <3$N])@VO(#(5#"&54>7&'5!7654'534'321E9VH=I &, %m{=X! .(K [T(BGPM>%* 2.'({+#(2 J#".54654&#"#5>54&#"567363232>54.546322X8&7 .67,, i%9W .%.J#%%4g[8 30 H=r!@)?#rr$>?":-7 7-7! 8"7#"&54&#"!5654./!5>54&'5!7632%;:'XF!.?-"8;#7:"^P/h $%:*> 15C,6!%=6 8XK8"&#"7654&'53#"#53254./#5>5>32A79%S>5! 6P^-<DKYz  9:&!  'ppy#5673##5>=#5354&#"c<cc0/aa o-)(-#+%#"./##4&'57&#"#432732673C:Uyp2$L" e[\[e'S,MZ5z5 E,>E% >%2>54&'5!327'5#"'#"54/5!3274&'5!Y'F""0 3"YQ LH(a ]i4 5(4O5$445 #"2[,"[9$fflD4K:J8(3&%4&'53##"&546323265.#53%; F3N)52# L/3+&tf<;Py#8*567>32#5>54#"#5>=4&#"J@3;#7?%&I*$&&O0!OGS%"/a"+%" &6 !32>%!4."ڴ&BV/V8.K/ V!/JZJ/!(7dX5&=OOP"IL<&%;KJ"24.#"32>4&54632#"&54632326>+:71N- ,W<=Y-d<lX?U3AHHpD,*?VO)3bb<54&#" &6327>3234."2>* .M,DڴD}- #$5$3,;@/WtW/.WvW.(24:Y(41  'B/%9&86g_99_g67f_99_f'"3#5>54.#"#"&546326324.#"32>* E'_byx`w>MUv(u;';; ;),8+$93H`daTTY&$KK/^>&QU6>L 43254&#"#"'!5>54&#"#"&54;29#`eT #:dB'#;97$3<-TS2OMI06'7!!?3#25)&J' 132654&#"7"&#"632#"&'#5>5>32E#6CC8#C78@PI^yY + 8,P^-;N,gSWi,KYOx]m/'Epy# .72654&#"723#!5>54&'5!\E6D,dbSz%8 :8!@)?#<(#7K/V"4T6 #>7 7g*/"#733263232673#.#"#"&54>54&7653#&7 T:S'-l++"+2 9";M5@:4-&"2  L4%7@+&8C E6*B$!-!'1$ 2VB@%#"&5#"&463232>324&"2@29If)>7672e 3N)52 ,Y5 % /+# Btf<;P=-- t`!#.+!5>5#"#"&549U6">> !6<S-7 !@&25)r "&#"3#327#"5#53>32H79{z 0HYRRP^-;DKYt /+# L- py#4Q2>2#"&5#"#7!#.+ (8+QX6T949U6  (g^s.RS-0B673267654&'5332654&54632#"'#"&54&'5!Ka8Z$: $&<0)$(5iM{;<dg+$+]K125)6@T;XO*}876 (<%'5#"&=4&'5332>=4&'5332654&54632#"'3N; "7B$* '/<.#"2S  G;#-%%E#25)?A# \,#"#&54&'5332>54'.'.54632!9Q]._M0   +"5?5$I87 I^c,Lr@CF  $4Ip,!5>='&#"#"&546327654#53 8(??&A/,o42YE(!&; ;_30J6+!&3#".#""&5463232654./&'537632 %= #28- / ?#r &/ s<>s(WF*# D#y!8G( U %2>73!5#53#"#7!3#. Tt3B! a& ) +- ,$!-%2>7!57#537#"#7!3#'. Vtk- [v_}y "#-!7v-"#7!2#"&'732654&#T91DyXU.iv5WB^l.RAN&^xB=eBDYJ%#"327#"&54>3!#.g^BW5vi.UXyD19lJYDBe=Bx^&NAR./j467'7!.+32632#"&W[/#WR20a(;EaMx u#uH2G<8*pl0#"&54>54&#"7#"'7!63232>32XAH=a5KL5(%0#/&'#D9RR94$ 1+>:*>%)#u 22,B)$0# % $%!5767#53654&#"'>323#32677z7^uMB9=kWMh/a$$ :2,73ANC?ZmhLDK,%D$%#"&'73264&+54&'5!#.+"32D5tSU=eyMmmMZ"5 =B' 9\!AK/CDpcc5!D% I'+#"&5463232654.'"547327&+'zj4^ B7+.=*6nY Ui{..!)!eH&;$  {C+%#"&#"#5332654.=#&5476723#{W:M 6<#./BC/5 9,ee+l**w9H CI&#-#'@)P 8V t ..@5'(3#5>54&#"567>324&#">9be9$4* IGf5V2,'E\9>zfO"&1("3L,>>*=C{3C8C#__/)%##5#535#53533#3)22222'v#?'t#@'#@G #-c/ &%#Mc/&#MO D#-1 &#M1&#MQv#$%",D @v#,$""v#2"NRr#8 ":X#+#!8 "@x#Xc0I%#!8  "Sz"j@X C2#"&54632#"&5467#'3732>=4&'53#"&54&'5!7k5khhKa6L%#;=!5iM{;<((SSBUW$;!@(%A2KD#kn ..  "@~"j@X#!c1)+8  "$z"j@X H#*# $%"7x"j7D#+"$%"7x"D-_"#f%wY# 3232673#&#"326=#534&'5!3##".546v>j ??a7|)`EE:0;;Mv03`cH.!ӫ7\m<t,8 $4,"1NR &=IPT23263##"&#"3##".547#5367&'&54>7&5464&#"326.'!2 _1$ S_@ $ .N4E+B8;&+2(  ]b51%&2'&#hO0$:"'*2@S172,3> ( ,#  )YJ]7k3NF;8 +,8 v#*&"7J"v#.O#\N"[0#"&547.54632324.#"32>5;*'+:71N- ,W<=Y-IL, ($ HpD,*?VO)3bb<54&'5!!54&'5!326=4& ,O7 8:::/:: &>77'9@)r5 "?6666*.Na!%!5654&'5676324&#">.A[D$4*T#,XLDP`1=:S%2q\a="&I(*B21)WC z#1"TQ :=#76322#"&546"3264&#52654/!3#5>73%3'<(r);;)*9;)'&''C().D%).9tٔ `;R::*):"&6'&6'W !IY)SxM*%":"DG_z#f%w#"{#"Uv#$#kDl#$%#D Uv#(#mH Ul#(#H;v#!,u# ;l#M,#/"v#2#s R"l# 2#Rv#5O#Ul#5O#JUv#8#\Xl#!8 #X*'63\'VQ'7 C'bW#&%'654&''654&#"#4&5332>32/A>96#?  &@">\1#sڲF7%0 3099: -K7:j*,-)%'>54&''>54&#"'654&57>32AeJPY^P(#98P3:W !6;%F.P1&28 (SU**  E64,2B' Av#+ R#^K8+567>32!5>54&#"!5>54&#"> Hc4PS!46"<7&I3$76 E0tD3sh6(4FFG$/f)"+Aj4*B /<4#"326'632#"''675#"&5463254&#"56726=4&#""a9'z7M7(9DLsS&z3A3-F6R!JCw`j++(545#"&5467&5432654. QM*07K&  !:#~mka8_ 34@@ ,3 5E&%*'& *.&# L^vlSJhLY-t.F%P<$ .=>54&#"'7#"&547.5432654.'&,5!$)88#+ *0.,!e0 9$Aw%%"9!S}eUrB`5^%xOUDH!4- 9Y%2#654&#!5#"#7!ˎR1L+&P3B! P&F&bP9!a,$!9%2#654&+5#"#7! Q1L-' - [C%] P8!!7vk4#$%n"-D )UB7;2673#632#"'732654&#"'7!5>54&'5!#.+"32673#.+!Hk\%- (.C:-'% )7 7 6U @%  &>P3QA% '- c!55!C& '8>")33.#"3267632#"'732654&#"'7.54632c *.Z010G$`> (.C:-'% %R^u\LT 5A2?[-09JU8% '- Yxdo[\"##+2#L"jSR"#+#2#L"MR"B#2n"SR"#+#2#L"SR!#<&O"c\ &3264&#"7632#"''67&54&#"5675.&55&9*.40CD/w(). !c<r-/6J6&C0/DVPL^M&<E#B.8#"''674#"#5>=4.#"567>326324#"326B776723#5.&55&9*/30CD/w(). 5*eer-/6J6& C0/DVPL^M&= 2# t &567#"&5463232654M-PLVS)527jp<>M{< -:%32654&#">32#"&5#"&5463254&#"564&#"3265:'>DE;'<N.Kec=h0PSfzV63 [>(9DL>&3F\S[m.i%0}\k*Cw`j+ (=#"&5463232654&#"n>12$]@J5@PI^yY + 85$DYFZ^6=AE#6CC8#C+PC "dgMOx]m/*Jx_l$,gSWi, $+.%#5>54/#3##7#5>7373'37#3() "1s%).R.:sSwI.=d+`,,5m8u޵u1]y (4632733273#&'327#"'#7&&#"DA+.2!  >Bvi.U}V@1RZ('2mEAM!f.)ae=BDb}]e"+7463273#"'3267#"'#7&7.#"X.&,.8$'3+>$ '&>!4*$14?q=KoI^% *4 4 53!5>5#5354&'5!3#3b-"   07 XX 7;"yy7'  !56k5!!5k6Q$#"#7!733#.'!5>=#?&+6T9'.') ">> 1fs&6l.R;;34 7 !@_L39\I273#.#"#"'327.5462#".'&#"#5332654/.54632 2+"++l-'S: "0*5  9&-4:@5M;!: C8&+@7%4L. ,%:- F)'!-!$B*6E9#27.5462#".+5#"#7!2S "0,"$2Z - [#@'/,);:)!7vk?K?'%2#5>=232654&#"#"&546ZdP0/ DWK= "[n^|z)(mVMa.*='%2#5>=232654&#"#"&546\hL// HSI? "[^X9j* )ZCF>=.*=Q =32654&+"2>54'&#3#%#!5>=#534&'5! _FMZV,?-B:T0ee`3dE>"ll!?4="n?;CF :+\#<6:9# 8g67!3 ; 4732>=!+5354&'5!!54&'533##"&5Ka'>' fZZ;<i$:> ^^5iM{dg*!26h76hBK1,LB6;XO*}9 U 7#7&+"733#&'>73#.';2673!#7#5>54&'5Byk4  . b* #4z(k\%-17 7G: &@@?'2;$3Q,,!55! %)&#"3#73#3267#"'#7&546323&Zl`.!MP&70G$nG1'"1.>u\1 s Y6C>K%#09QVOi=toPG. r"5354&'5!3##"&54632325P` ==ZZXQ+8 & j77j ^g(  BE& *2#"&465673##"&546323265#5354--PLUUVS)52*6jp<>M6D<#8'$527.5462#".=#"&54>32733267654#" ".!?]3cgUZ+K2:H 0I, D_~, :D*]lhb/L4_ "JL<'1-'V-27.5462#"&=#"&54632733276=4#""/bQDYFZ^6=6 >12$]@J ,NN}Jx_l$ s+PC "dg$.2##!5>=#5354&'53654&#"%+NS2%8 :8UU8'Y^#J5!46 #>65!CFCO+"&#"3##5>=#5354&#"567>32(,2"30GGPD%4j#:16z+ &6D!\5)-03#!5>='#53.'5!#37654&'5#'8+o$CD!z5/" .'T-B69!A6K(*.~&142654/#53'&'5337654#533##"&54632#>,,r@ '  /x-0 /^rW)N2 *2L+|O\6 h |6l\!Z_ D(%'5#".54632>7323'54#"3268SX,9N~a3> `FA=-,;$S%1F`8c#  McvL,P?$ E (32654&#"7"&#">32#"&5>32:'>DE;'<79N.Kec7.54632#".#"6324#"326}?9+ >?|d2c ?B10T:;&+L%U=d[ HrGf7.""oC:cx4e/&[ 1726=4&#"7#"&5463254&#"56732632#"&5%4>(9DL0PSfzV63[825)SV**((9DL790PSfzV63-<**(32#"&'732>5&#"` TL\ueVGn$G010Z.* \[ogyVQ90-[_s2A H39A#".54654"#"'&#"'632>32327.54624'3260" ;'&|dI=-L/BJ~T9&',$ !"'1?Bw,&'6 @--4Jf0F1- H/-0. F+1 3),o)h6?32654&#"#"&5463232654&#"#"&54>32#"(Z3<-$ .  1#(*# "61AhE*/GgCl ]>3%45 +9$#=<(5A.@E)3a#".54654#"#"'732654&#"#"&5463232654&#"#"&54>32>32327.54620"E*/GgC+(Z3<-$ .  2#(*# >A!S0 $!"w,&'5!!(5A.@Ev ]>3%45 +9$ ( (&$'. F+1 )0%#"&546324&#"#"&543232654&#"326=L'WmnV'L=G//G\-$ . " . $-+)J]\K)+k(8ZX8(.AA%44%+=}MN=&W5673##"&54632326=#534-PLKKVS)52eeW jp<>M- .<&m.<"&#"#".54632326?#"&546325>323276=4#"C79/\@2)+7DYFZ^.2P^-;>12$]@JDKY'GD(CHmJx_lpy#+PC "dg& /73276=4#"".54632326=#"&5463273n>12$]@JZ2)+9DYFZ^6=6 0\+PC "dgCHmJx_l$ 7'GD('%#"&546323273#&#"32=4&'53saQ*j*?"SSK&!~r`t&AH(Vl#m% 1F#"&54>7&'53>54&'534.'32'p! <=42 !>D'     !:*> 6,@XT8  !0JmmO '(   #8) ..#"#".547&#"'6326324&'32>)g6V@-0 , /BJ~!#~/.,.' / 5R<+k`9TLX=1- 8a32#5>=4#"#5>5>32879#D,{)+K3,+P^-<DKY-'4 3j"45\py# &4"&#">32#"&5463232654#"#5>5>32879#D,{VS)52K3,+P^-<DKY-'jp<;PYj"45\py# %2#"&46"573##5>=#5354&. RR14PP*7?\66\?M!0"57327#"=4&>  0HY7/+# L!7#5>=4&'534444f6666O*56732673#"'#5>5&#"#>3254&#".c< 0)0/# 4& o 91)( .14# ",##5>=.5463254&#"5673#.#" `,+""" b=`!!0*) %) &i32632#"&54&#"56725)SV c<*P;<pj4#/,4&'7!#5>54&#"567!#"&432326SV0/c<>[WaF:(a/32Hu)(# xMZp*80=/ *i )$$&A4&#"#5>=4#"#5>=4&#"567632632#"&54632326n +B+++BC3(*HDFUONUtVS)52-W>0=/ *i;)$KMTTjp<;&K04&#"567>32#5>=4#"#"&54632326J@3;#7?%&I*$VS)52-%O0!OG%"/a"jp<; &T1%54#"#5>=4&#"567>3232632#"&5MI*$&&J@3;#7?25)SVca"+%O0!OGP;<pj##5>5.#5354&'53, -~-/l !0- / %&6%!"&54632;#&+"32673#.+;2674&#"326uVjsh^ @pY()Y2Q%/(#1 7)'rrWj bD'(%-()E="(XM)7%#"&'##"&54>32&"32>54&543232>54`R9??9R`\Kuu '",/.+1WI;;IWMy=.546754&'53>54.'kcj0/kj0/EQG5TGPQ |aiy k)(hyj^~ w)( zI*PH g nPKxM URM >R&)72326=4&'5332632#"&'5#"&546*,2"3025)QW%4X#:+ &eP;<kg\5)8O#"&#"#5>54&#"567>32(,2"30PD%4j#:W+ &!\5)&S)"&#"32632#"&54&#"567>32(,225)SVPD%4j#:P;<pjN!\5)q"'.#"!5>=432G 9 =6-;f# Y87|"8o"#"&54632!5>54;-/F#6= "&3H.78Y 5+ '3#5>54&'5373'3254&ǻ&&'&m{"86Y}M $'* %  [$3 ٧ ]8)3&\;273#.#"#"&'32632#"&=332654/.54632 2+"++l-'S:Q25)M4 9&-4:@5M;!: C8&+@7%4L5P;<drF)'!-!$B*6E&>32#".#"#"&546323265P_-;9VS)52qx#&%Yjp<;P"".#"3##"&546232=#53432$<{{"B$54#53%f*,Y      0'+v)$0*,+*/$&U"%2>732632#"&5!5#"#7!'. 25)N3 - [ "#P;<ft!7vk&%+'>7#5#"#7!36324&#"326c7I * '  /[9m@"S!7*S6WE C&2vkX2A/j4&'7#"'7!#"&432326$SV#0[WaF:(a/32Hu#u xMZp*8&.DU:6D/0CP@F *3_VX6EsW5&%63'%2#5>=232654&#"#"&546ZdP0/ DWK= "[n^|z)(mVMa.*='&2#"/.#"32>3#5>=.546?[" =KWD /0Pd=*.aMVm()z|^n' WV#4632#"/.#"3267#"&5X?[" =KWD+>$ '&>!Sko=*.aMUl*4 4 |a"&2y])  j3#"&#"#&#"32=4&'53#"&546324632j'#**j*?"SSK&sa'.oL";k<{;xt&AH(Vl#m%!~r` _[ $.#"&54632##"&5434.#"5673#"325 RS4'/DOMS'#0'9xS(8C#D/sN7 0#3 N45"32>73!5265h /2# }/ _,)(7 "|''n 173276=4#"%"&#"#5>=#"&546325>32n>12$]@J79)5$DYFZ^01P^-;+PC "dgKY=  *Jx_lpy#'-23##5>=#535232654&#"#"&546ZdPff0/^^ DWK= "[n^|:1)( 1mVMa.*='.2#"/.#"32>33##5>=#535.546?[" =KWD ^^/0ffPd=*.aMVm1 ()1:|^n%-<%"&#"'5##"&5463254&#"567!3267#"'54&#"3268*WY]vY:0 V=LE-k0$V?(,;B1= =@]\+k(E(0(M%+'>7#"'5##"&5463254&#"567!3632'#"%4#"326%54&#"326 c7I * ' *WY]vY91 V=L9m@"0$E$6Z7*Se?(,;B1=6WE C =@]\+k(04 A(76723#;2654.546323273#&#"W:\5 :]]3#./BC/S9=  T.0FE0w9H-T t T&#-#'@)8B {$1#&< "-4".#"#"&546232=#"5#'>76723432#32"$<"B$<,<\5<p"Bp3 n&%Yt@&%Y8-V tUU CHQ%#"''>7&'#"5#'>76723#32>7&54632#".#"6324#"326}?9+ G 2X\5<ee3     |d2c ?B10T:;&+L%U=d[ HHq-V t S (/f7.""oC:cx4e/&M".#"327>32#"&5463232654#"#5>=4+!5>5#53>32A 9{e"3;#7?VS)52I*$&&=z =6RRP^-;DYt O0!OGjp<>Maa"+P87: py#45673254.546323273#&#"#!5>54&#"c<0iQ/BC/S9=  T.0FE0V;/o)?-#'@)8B {$1#%<(8@(# 567!32>7!5>54&#"#"c<K'. /݊, ok "#(#P-[77.'537654#53#"/#"/&'537.'537654#53#"/#"/&'53~3; *2 PP  ;I  Ru3; *2 PP  ;I  Ruzw!ir   $ yzw!ir   $ e%#"'7!.#"'7!.l((((V2%326754&'53327'#"=4#"#"&5462K3,+ l""E,{21;D5#j"45)  0-'c<1.C4:%32754&'5332632".=#"=4#"#"&54632M85--21;D6# :X|21;"#7$ j?0#!1Bc<.*?,!Rc<7+J*GK*G(*|M2*CU*<uJ|(==*-<C*=Z* {?<\*  ^7632#"&5467   !".>2 R] 3&-T82P}9x".54632#"'R 2>."!  u28T-&3 tuM52#5032654&#"#"&546m5N<02 )4-% 7RB9JUB3/:   %42#"/.#"32>3#5.546%7 $.4)30gg B#'37B}>|"yzggd" #BYq]=vCd#5322 gBqD2 #'&54>;2( a 3 7>;23  aT3#73n77n7dhdTh3Tn7dt 72#5264&#u*9;)'':*):"&6'uM 3A 7533!56i66 /A7#5!##7666%4'6 %##5#5353'f6ff66ff6ff B7!! 763 3#"&'3326|8Q 50,.FW2/(v n 2#"&546n(C  2#"&546"3264&);;)*9;)'&'';R::*(;"&6'&6'@[#"&5473325;*6.,IL, .+#"Kr3#"/&#"#>32326.0) 1# 4&$" r91 .14 y&<,C3(>32327.5462#".54654"&',$ !"0" E /-0. F+1 ,&'6 K&%P '77''_``_```qG<%* O*" EV* A<[*W* #!50 0 #!5!50V a0 #!5!0V 0^ #5!5!0V 03 !5!zV 02 3!20g #0233!!20e08E= 5B&qq7 <C <C &@''eAL9Q 3## b66 #5#56b6 533 6b76 #5353b676 8D53!5366vv 8D!!53C66 B!'7!B<bb<HffHCvg#Yq#Y!!"Y6) n nj #>54#"#"&54632"'"# 1"4: 0(   *#'4DBt#5322'&RlY']}~" m"#"&54632'>548&$ R ,&<)/Z ;*C/)v.#5353#666]#3366m]6v#5#5v66nGB2654&546322'0<C625)4<U533!5666#5!##76t66 ##5#5353Uf6ff66ff6ff}c.+5367"&5462326590 -B."  !.- .1327.5462"&=73 ".B- 0 -.! U" 4632#"&y! qV 4632#"&74632#"&qx! ! #"&54632'654  !".>2 R 3&-T82)z[ ;#5322x8H"'#"=3326=332=3+(M6 66 W----!!-.U~&#'37K}>|"yz3gg~#'#73K"zy"|>gg%3#"&=332>t:P_& >NJa"$.#"#54632e &_P:"aJN^3#"/&#"#>32326S (2'4.#8) .(= ~!!7L6 B 8'B B (%3#+P%!!3+9mP-9n's*#3%'p UF8y5#'!!6$ 2"&#"#".#"#"54>32>y!/, " *% (+/#+#$*$  +)(, '77''e_``_```:4&5467'64/; 5446 5/& 7% ' &V *#"&54632'>54  !".93 %)~ 3&-C .;#"=33265Q]JLXOc.N}s<&"&L&3#5#3273326H0)"C1# 4&!>-91 :Q .14 6N #K#4#qG '7!'7!'7b:;bb;7:fHHffHH5'7'HffH<bb<w"ak 73#'57'5r"r$__ιHHWeV n' %5m 33#7#A#9?'d_= #"&'7327qTAsn8>M QQ #"&'7327qTAsn>M QQ$O!!<O+r!!7#"&#"'>Y.q$.TC-q($ "1O@ N4@ Q2  &#"'>32nsAT QQ M> 5!'7'7<bb<HffHy/:4>754#"#"&54632327#"&'#"&753276   !   *#  $k*  "   #   !#S  > 3267#"&54632'3.#"'?%+2(? W&o3*G3,09Nw"57#5>=472#"&46 B e    c{  n 2"&54632654&#")57Q55!"6*,<8+-8O.?)$,7$"5#"&=4&'533276=4&'533u$ >  D  %l  d  g4632#"/&#"327#"&8%'  %!!3#.S/:  )!%/)C5('5#"&5463254&+567;#26=4&#"!#,4% ) f 3).?C   c+%'/'#5>=4&+5767632#5>=4#" \ #5Z g  $DU  U->567>32632#5>=4&#"3#5>=4#"#526=4&#"" !%1 ^  _  _     $$LX Zl ]-y  l  "&#"#5>=4#"567>32 g "  `  j 'c#327#"=#&54>7672, &   {& 6 2#"/.'537654'5 73 T,* {!  mn 1>54'533#5>54/3#5>?'.+53 C #7V '! > 1( Y~  3T<5  G=  74&'5!!!!5>s!@)?#($>?"m7 7e,7! 46323##4&#"#/97/TJ;>;91,{ #!5>5##!#5?$>?"88j7! 8 #5####5!888ťj- '>32 @2<".! #"&547 @2<"8(#"=33265(]JLpXOENPsF0 #7632#$- %# 865) @  2#"&54632#"&546#76323i: " RO"" ":EB`"&462"2""22""2"":֨Iw":֩K":֫M":֪S^M":֫XK":֩\}";l$Q% "#.+"!5>54&'5!"+)( $79!6%,6"';5!v)3 v6 # U( U=+. &6 4."32>#4&+"#53;26=3[2oo0&5N.8\8\HeeH*UP>%9[j-#(*!;,". !#532>54' 3#5>73D  1O**05 _0 1=; !-#4&#!"#5!#4+"#53;2654'3!533!26=3;&/0b; %bVC"&/,'4IB""I[1#"2)5>5!!5>54&'5!:"6: 87!"6&<5"&<7 6D5"32) !#.+"!26=32L dB .GD?1#)LI@R1GC=2#Q7)04.#""54632>32#".#"3!52>53(#-Z'UQ_Z&L .# (/+"%Tx?""?rw># #>uP'07=#"';!525'#"&54>324+5!&#"6324&#26"a^S ,' W q!8IO(T *1# 3bT4jkU^bYcZ55 (/^xl+J3#X)11U7Uc|mm^X ;S"#"5463234.'5!2654&54632#"&#"#"'3!526=#"&54>54&f'61>%Ka ZaK%>16'"nE$@n"!S 8=8|$I8Y@8I$|8=8 ,$A&?_q1%!q_?&A$, *73;'.546323273!7654.#"!&(!E?(k^K z(A@!\q} $$+&?c:ye+H'Jl6o.<D#jM)B#jX).#:d)":xh #:jA":l#;x).'8%#".5##"&546323733265'4.#"32>.9  d:Zks\AJ  T#+<-$2 9,.<ku  8H\^cG{r<B~,UF0LD"+OAOZA79%#"&'332>54.#"#"546232>54&#"#4>32gW,G8'4 / &)$ 51#/R,R9HeTcXt0)'@K&:9$! 061J!<5"dU5\U1IEd/ _ ,4>54&#"#4323>5>32#"&t1K&*&^^5[9 =' :?S:F \tn |H*+,%3%#"&546327.54632#.#"4.#"32}db{xU( =,/>15YG*(0GTG0]@0@> :'ya}^Rs $,/8C2(6)&;AdM-M:T@#EC))6%#"&54675.54632#".#"32632#"&#"327+CgG/*EhA16" #*(#1  . $-<3Z(lvE@.A5(<=#$9+ 54%3>]'>?#"543232654#"#"&547.54632&#"632#"'32632yIC'C5W9 dSn0[N1 (; @W#Q&6/.12( ( @<-FO&)7ch8*,)$0?3O1> . (#4#"#4.#"#4323>32T>U*[  F='4 &c@gd   D`27%3)".54>2"#2>5 .PhP. 0L`L0 \-:-U0WbG//GbW0+VZD,,DZV"!*M5775M*A%#"&5332>=3/97/To;>;9Y # +>32#"&#"3#5254.'#4ȷm*+0 %%%,/,+H%-\>O' &*:53Q-&*%#"./##.#"#5463232673C:U $$( b[e'4 *5*@+1E%A  +%#".5##"'##"53324&53325 \ G" &P/M*,!"8G5/83;O/hN.#- $4K&P][I1\2D)$$"L,oM(455$ / !-5 :M2)  !5"7^/4M68$''+3*2?AA&#- ,R#(/+32653#"&5##".53325#"#>32327(*6*i21f R24  BP11#< EN*@3A,#%$0L-2#*%#"'#>54&54>324.#"32>wfE6 T1V8ct\ 8&| :%!/ h+ST/ " 665_P/$IN1"IE,!89,72654&#"#"&54632#"&#"32632#"&54632J)+QI`{+ L-C"C6 ^%6 "D,#. 0*!( yaj "4/=V"1)6@-") "#"'#"&546323274.#"32 5/"*2x]b}~h~2 ;*=4yS _4^bh (JQ1gD %#"'3253#"&5&#"#>3232740: (+=00;&&"9(w(+6+!=9$#"&54654#"#463232654&54632HP#0(610$2=F=?1XI$$9\:FO4|6@g@($("Z)42#7.54632.#"&54>4.#">(: zhT4L<+TK'(-)QQ $: +]\i'@A"l "4_=V!iKdB,FV@867"/3#"./#'.#"#&54632733273  +Y-   4$# /{W"+Y+'*yu  N#)?)?>F+S }C0#7.54654#"#54323>54&54632 ^ _w!2d/2D?EV3 -X h^s8_O1x?G5 rH( *";lgF)@%#"&'##"&546732>54&543232>=4.'5`R9>>9R`j]*  #",/.+1!+ &]jWI;;IW_#9(  8&(0323>324#">4#"32|cqn4'R$5 6-C'=%fBawP7E+2$-  '8 GAduhOh#"& Rm>Ji;)dB Z$>@%Dn93D#4##".546=4#"#4>3232="546322/.#"9A3D *'#"-"kQ:$2'  BU!!"@B.LTV#*;:+ 2 &22Ѹ:L88X)% !b>#"&54654&#"3!52>=<54.'.54;2>32b"$"R/+" /2kQ! (4 $9? 7!) K'#9SAA.  LB',!*B*+<#:־bC"j+ U@%#7.546?34&'>UoFojjTZPJXPZWJlzzlg~ss~gRuc|tSM| J##"&'##"&5467#>3!54.+"32654&543232>5m66`R9>>9R`33#* K)] %$ #1,/.+1!+qBWI;;IW@o/S 5!# "2! 8&(W6"t88s7V*L6&!ZS"&5463232>54'##"54>5#"&54>7654#"#54>3267>323273v4 W`*#"? &Z5Q$]?2 ###""!5, H+R?6j- 4,)1<67OM6iKDd9" %)5>=#".54>3!4&#"329%!"4YT00QV/59!7)P72J& 5O<%8 $ 32654&#"72#5.546wN?8@P?5A`|eOTOb{k`UgVrb[Yg024.#";2!5>=4&#".54>32#"&546*'U[Z:I;9% GT8"AtH_ !:rKQV:!7 'Q7#JF-U;&&!>2"5463232654.'&54>323273#"&#"NJ)E4MPA &X<X% */:GV=MN;'6' 97AxW1.bG+'!'OX ""#.+"!#./!5>54&'5!"+)( +<$79"5%,މ;#6"';4" &9#"&#"6323273#"&#"#"&54>7>=4>32327 310/ ;H' (/ 6#$  $U:A0 3,+%:&=Q2-3%)6   "!6iOw0"#"&5432%32>2#"5477>54SY$2!e#h" S#@v!`u zhs" C%$F=7ID-/K\*4#"#"&546232#"&547#".54?6  :$ ;' y'!?T.&(&Z00b 94!#52>54.'3#567>7'3#5>73 .: )!+WkL:   )7-6dM* QKj **05L,3%#"./#'##4.#"#5463232673,C    W%W  %%(! '`j   *[,) 7,B+%1 ()("%N#".'#".546732>54&5463232>5'5#"&#"#4632326KW$ !:)R{7#H1%5 3*7|(>%B6i271B(X@^23trO#,^fB'BA$&-"$.,BVK##ƋqJ= ,I)]%E%#"&'#".546732>574&54323254.'5#"&#"#463232>"+LH/$8S&f[kf$$TTf *\fz,a%!K T4.g#-N& Mi6_!,+(!+7"!_8&%A1JN K%4&5462'>=#".546332653*nbZ'Ot3yk3I"='CJ."Rf :NQ#Ml;` C!FE,^/$'4&5432'>=#".54>33265#T%$0V+7Y5&aI<<F07Rg(8Tv2 :NQ.$-HQ(>dFsK)ZLe3 H$27"54&5462>32"#"&547>7>54.#"3*n3*nJ-nxV|6#3? 5'8C."R."R!mr(. V*JO/[2)3463267#".#"#463232>54'#"&7327&#"dP;-7 P^c8$!(6,`&(K:HT4(1 ;R=>"'GqpDJ">6%OET&+F *$/".5>54&#"#".546323267O9_ LZW:@2(F .0tg]t=YZGAe'SZw6< ?|`YZ'A=0<7&19[N:\CEkE 50 R*".5>54#"#"&546323267'dA3<:&H+ 7NG?P(;=/_'8 .Q%(+TA==U "* '%!'>5(>-/I/? # *,/.546327>322#"&#!"&546323  6#9!yd $L2!.2 !%Ǹ"/( w#!3#!3C;),.54327>322#"&#!"5463237' %> $ ND $4(38y` "qk   P 2##շ$<'%#".54>32#"&#"%32>54& xwOt5A[Vy"#tet>$?',=odX/tkF&"/!Ίk(_^>Nh9G''%#"&54>32#"&#"'32654&^SRj'HzIR) +UR  5#+'XMgd(feE& 63 #+%XJa@>{ KZ &2#"&+'>5#"#"&546;54&54622 !.Uc Z.! 23*n#!3g :PO3!#."R$6(2#"&+'>5#"#"&546;54&54632r;#0 = i"$'+A #Tv2 ;OO# 8!;%#"547#"&54>7654#"#54>3267>323273 !W`*#"? &Z5Q$]?2 +'&H+R?6j- 4,!"1<67OM6iK) !2%#"&'##54.'&546324.#"32>wfDh 39>8.+EKN0qpct\ 8&| :%!/ hRA#39D4. 64gu$IN1"IE,!89)%#"&54632.#"3267=kb}~hd=;1t - 2=LVbhV( !+F*!)&M"a)L!#"&54632&#"3#327K)b}~h  q'" bh  &4&#)L3732>5#53&#"'632#"* "'q  h~}b)#&4&  hb, %32654&#"#4#"#432632#"&E#6CC8#CT *[/,AOI^yY +N,gSWi,=dE6Nx]my%#"&54632&#"327y(NL(l>]5|y{gq54&'533!5>5$:>#!>8 7; [}\_L1/M7F 5D5!#>;,232653#"&=4.#"#"54654.#"#46323>32K*i21 !Q./(ITLF3<380EN*@3!- s88u"!<0DYJ:>F&3%4.#"32>7#".'#7#"&=574>32 8&| :%!/ \wf1:0  qd 0``.jJct$IN1"IE,!89Dh >*s?  $ 8 $GzTy?32654.#"'>32#"&g{y|5]>l(LNqe~9i[6i;DĕCy&y&]&C]R'j3"&543232654.#"#5>5#"#7!#.+>32/;+)/'2#%K > 6T949U6P/fps '+$Yg&12!@.RS- -sOl*'~"8"632327#"&#"327#".54>323273#.k6D-p?# 7Q)x"5$%7V6vi.U#L`J37NbJII!  "+H|40E0&LM;%e=B.G~QUI. !&:$6=,>N",jm-7B5!32#!5>54&+"#"&54632327>54&32654#":EBd:# 3ST,:  (F3&4 3se`# 8'603K&"?}w=)P86IM3>%>=!!5>54&'5!!54&'5!32#!732654#": 8:::/:;#EBe9# 2SU,e`#"?5 "?666!7'603K&GIM',!5>5#"#7!#.+632!5>=4#"c">> 6T949U6HSfk::hR-7 !@/RS.=gYj66k'#C a&[V/;2654&'5!!#4.'!5>54&'5! :8 :(::9)"?" 5D6 U%$0] 6?" $" +#"32#!5>54&'5!#.3254&#"MiEBe9# $5JA"899YU"q"(93.G(6?!T1JST%*#.+"!5>54&'5!* @L $79!6G%"6"';5! Vw0764&'5!#.+"#7267;2654&+":: ::FMME/07  9  m}?66W6PZYQ! *A]( k"#52>?675.'&#"#"&54632;54&'5!3267>32#"'.#"#3#'&'&+!5>=# O%C3!&%+N83 == 38N+% 3D$O " # :: C,  * C  V@PJJLP77PLJJP@V  C * < 77&/%26544>54&#"#7332632#"&'7 HZgg#=;#R6' z)a"5-OH](Q@GQ% ?,8@RN%>%N5YrU42:)%!5>54&'5!4&'5!!5>5*:::/:: 8:("?66l#6D5 "?T#a&6@#"'."#"323#'&'&+!5>54&'5!327>32V  @8*X-1(*! :; := k(N+%fP:^ BJ"B7#>5!7JJ/"&54632327>54&'5!!5>54&+"b&4 3:: 8: (G )P866D5 "?}v~>g0+"2T"3"&P7 ,%.#5!654#53#"&5432326R .(C,B$&@:/;+')%n $R7#$RLRG'+, )Y ;V+4&'5!#.#!5>54&'5!;265 8::"9): 8:  )5 "?b6'5465 "?-(32754&'5!!5>=#"&=4&'5!hRL:: 8:HSfk::=66D5 "?=gYj6674&'5!!5>54&'5!;2654&'5!;265 8::P: 8:  8<  )5 "?O665 "?-5 >%V=4&'5!#.#!5>54&'5!;2654&'5!;265 8::"9): 8:  8< )5 "?b6'5465 "?-5 >%"-"#7!632#!5>54&#3254&#"S:;#'Be9# $5JA"8 YU#p1S!7(93.G(6JSO'"'32#!5>54&'5!3254&#"EBe9# $5JA"89;#YU"(93.G(6?!!7JSq:"#73327632#"&'732>5#"&#"'>323274.,H+"  !JHJbN73J`L#U.iv"?E2!5@)t"1 L!(o ?0o|$:&! .IUQ~G.B=e+DsK3/%/?qP$92#".5#!5>54&'5!3462>54."q}NzB!n 8:::n?\(+7.(,8++5/›Hlk-5 "?66}raJIsB+*AtJFoB, t(3&54>3!!5>=#"#52>7>?54&#"3-2RO(88: % 2(7:K'?4M'5O># 6*WJ= *<D.%4.#"32>%4767>737632#"&};';; ;),8KA ; 1J.`|^dw$KK/^>&QU6>LbU%  \$ 0bh",2+5>54&'54&#";6'32654+"C27Xnh((NFH )y399sn'5 46G84)+2 1%Rv!#.+"#5>54&'b!,W(((}8'44) +7;2654+"'4&'5!#&+"#7>76x%e&%(TT%0H $0./"*-}}KH \%"#5>7>75.#"#"&54632;54&'53327>32#"'&#"#'.##5>5! ^!"*#  3%,((,%3  #*"!^ ((  G1* G: 7+hm))mh+7 :G *1G  v44 x,72654.#5254&#"#7332632#"&'71< 4$k2)h" LFa<"0-b^=^7:- $]%1x=;'26$:P6 >)74&'537.'53#5>=#5>P((#(((#(X))#)))#'I674&'533267>32#"'&#"#'&##5>P((4 3 $%7@ !} 0((X))m=&+< 5G7p )-#"#"&543232654&'5!#5>541_ 0#&" $&(((ILp]/# /")))0h(3#5>5#"&'#5>54&'53((( ((&)))92p))/"+74&'53354&'53#5>=##5>P((((((((X))mm))44v)R##5>54+"#5>54&'5(((((()))0))) 'SF#"#7!#.+#5>55,!!,5(('8}}8'44&\) A32654&#"4&#"3265#5>=#"&463254&#"567632#"2"4;;6!1T1!6;;4"2T0/'BEjjEB' ?Q'BEjjEBh*rWZo**oZWr*.)(66# 6 [&35>54&'53;254&'53#&#(((((&T)))0))/"}-326?54&'53#5>=#".=.'53)$3'(()8E*.''!+}')46m# ,R*)3)5>54&'53;254&'53;254&'53,((((((((4))0))0))46)5>54&'53;254&'53;254&'53#&q(((&(((&4))0&)0))/"} '7;2654#"'!32+5>54+"#''1_(0c_'U<(,!ؑ)9#f)lC7(,4"'8b7%4&'53#5>%;2654#"'332+5>54&'((((''1_(0c_'U<((f))4)9#f)lC7(,4)%332+5>54&';2654#"(0c_'U<(( ''1_)lC7(,4)ۑ 9#f -.#"#73327632#"'7325#"&#"'632326@E-O  ,8mx[jCH .O "/P"B\;=j_Y% * ."32654&'5334>32#"&5##5>34~34-((A*V:^or]\oA((YDYD))m?G0~dibv4$/#5>=#"#5>7>75.5463#";54&(('# J#2,0Sie$):E(2)43.O%  W.:09K5Z1 "CJ&jC&B87#5>5#5354&#"5673#>32#"&5463232>54&#"((== i%"E,R8)5!0*3X))%  u%-'yxg =nV"v&/,%267#"&5463232?3#.#"632327#"&#"#DCja}}h8,  O-#%L$ =P^$Y}sS=; 2\bBVL"j:&M =%;2654#"'32+5>54+"#"&54632326=4&'5!''1_"0c_'U<(_C3&  &(ؑ9#fC7(,)0~  ~Na/")0;!5>=##5>54&'53354&'5332#';2654#"((((((((0c_'U<*''1_4v))))mm))lC7(,ؑ)9#f0%#5>=4#"#5>5#5354&#"5673#3632&(M67((== i%9W|X$!)j?))%  u%R&/&Cv&'I+7;254&'53##&'#5>54&'53((( (((:0))4?\")))T%##".54632#"&5474654&#"326=4&'5!32654&#"#"&54632#"&KIJp?n;K BZZTD4!@)@"tTZZB K;n?pJIKN-/@iv><)("  G-6796t  "()<ˊ>vi@/W"&54632#"'##".54632"&54654#"32=4&'5332>54.#",+Sb&T8_  _8T&bS+,&+ L((  +&)f7jMQQMj7f) ;Q?0!'h )* $'!0?Q;0;"#73.'5!3#.+"32#!5>54&#3254&#"U9 ".4% L@* EBe9# $5JA"8 YU#!(D!#?.q(93.G(6'JS 87;2654#"'4+"#7354&#"5673#.+"32+5>5 ''1_$h- ?Q  $-0c_'U<(ؑ9#f'8}n# }9&C7(,4L"632327#"&#"327#".5#!5>54&'5!346323273#.k6D-p?# 7Q)x"5$%7V6vi.U"M_K3m 8:::nƈHJ!  "+H|40E0&LM;%e=B-F{N5 "?66ƒ !&:$nF%267#"&5##5>54&'5334>3232?3#.#"632327#"&#"#DCja}@((((A "0S38,  O-#%L$ =P^$Y~hv44))m ,=4%=; 2\b {0!!5254/#!5>=#3#52673 P=$.%=>#D B#.,:<   $"?Qk6"!7ku)*K u07263'#5254/"#4.#3#526739,9cP(  #!$3 &+   * *6 =..> T .h  >A%!5254/#!5>=#3#526?!!5>54&'5!!3%!=$.%=>#D B#.,/ 8:::Y< P"?Qk6"!7ku)*KPk5 "?66: $tAH%#5254/"#4.#3#526?##5>54&'5333%263't(  #!$3 &+ ((((    T9,9c *6 =..> T .5)44)) * 67!323#'&'&+!5>=#"#52>?6;!ܻ7SO " # :: # O4m~5) * < 77,  * ^*-7#32#'.##5>="#5>7>;'!\cȄ +<%!_((" _!&8&}T+5P  v44v P5+ M7!323#'&'&+!5>=#"#52>?675!!5>54&'5!!!Aܼ7SO " # ;; # Oh 8:::-5) * < 77,  * 5 "?66*B7#32#'.##5>="#5>7>75!#5>54&'53!'!YcȄ +<%!_((" _!7((((w}T+5P  v44v wv44))m,Xj2>32#"&5463232654.#"#732>54.#"#"&5463'37632#"&#"2632#"&#"+A&(vGSG-[15.+#t,&"+. iDpU\3.3=% -Gsd< )6. [T L#)+2ZK87P.*A 6+=+$4  !#7KZD4JXL3Z  %<#_h-'8HnRY2>32#"&54>54&#"#732>54&#"#"&5467'37>32#"&#"232+ W09U,?>,; M#:*K7mGR/ %  -:' "('54/.'53;4.'5!326?>&4 ,!&1E$@10 U%% U2 Z' )sDcp1%!p4"U@9NQT!)X#5>=#5>54'.'53;4&#"567326?67>32#"'.#"#0/$!8!(8 + ?Q,   "&"    )( '  # v I 54O%*#  '!5'? " 34632#".732>=#".#">32327.#"":p^9s'dI;W.E$*C; B"F*H@ 6%0R5:W.K+S9Cz]9_f7%$$&$$&3[R09^e /2"&54632>54'#"&#"'632327.#"`|}{ 2,8!-I  %,C$ 3;;̀bheg#=8!>L+'  *!:4^>$#&'&'5!>32#".#"^  7  7%I '$I   c%@  ,#"'&5.'53>32#".1&#" x  fc:!# e2M$  (* r'&''&,@H&54?.'.'53>32#".1&#"4."2> &6 ( A3= "x  fc:!#  *DVD* *NjN*ree.B ? /\K& (* >+RS>''>SR+7g^99^g"&,8H&54?.'.'53>32#".1&#"#"&546324.#"32># A3= "x  fc:!# ma[psU]tZ=-24 5$"1ee.B ? /\K& (* dd`2cT^>&QU6=O"K7".54>34622#"&54622654.#"&5"|[d)FZa0"4!765nC9SkX?[" =KWDS$0 L++}bo=*.aMVmOR!),2,{"46?'767'767''#" <>BK! "MS MG%L"& '* '$& 546;2546;2+"/+"&   $    $  P EL  P DL I #632#.#"aLJo!XPRV]O155&54632#"54654#" >*4;*-#%*<=4/'&"654&#"#"&546324#-*;4*> "&'/4=<*%F`!#"&546323:3"#"&'.#"xi_\ +%F h4EP; ) :ZG40B*z Y'33''f'F'3'y'Dyn'>Ul#"&54632'6547632#"&54674."#"&54632'62>7632#"&5472>4.'&54632#"'7"#"&54632&'&54632#"&'732%#"&54632&#"#.&=9#.&= $-  $-   >-  >-'"?)& '"?)& '"?)& '"?)&   >-  >- $-  $- h#.&=8#.&= na!S"&54632326232654&54632!5>54&'5!4.'5!#'7#5>5tY :::/(: 8z&Y:'6.   ))  ."?66l6D5 'k"?Tn!N"&54632326232654&546324&'537.'53'7#5>=#5>BtY ((#((z&Y(#(6.     . ))#))'k)# '53533#32#!5>53254&#"#=fHHEBe9# $5JA"8fYU"6ww6_(93.G(6|^JS%53533#32+5>=;2654#"5T;;0c_'U<(T ''1_76UU69C7(,4_ 9#f#-327'7654&#"72'#"'!5>54&'5"G+U'U`eN-TS2JO'Z5^'#;98OU&U!2MI3&J4[6O&Z7!!?6'4327'7654&#"4&#"567632'#"&'#5>5E#%e'_C8#CT ?Q@PI^GW'Z-4 + 8,N,e&_0EWi,# MOx]xJW&Z/' "!"!5>54&'5!2673 !:9 7eU6 p"6!#>5!&C2673#"#5>54&'5- (((!7v44)" 5354&'5!#.+"3#!5>=c!6 @L cc$79>)5!G%)6"';z!#.+"3##5>=#5354&'b!,WPP((PP(}8'!v44v!m)&M82654.#"!5>54&'5!#.+">32#"&54632&M*X8#.!:9 7 6U *5!C& -"=`r8Tp <&3%4#"#5>=4&'5!#.+>32#"&54632326bc %&&k -v'1+0Dj`#;2%,; p%"//"}7!0 Kg;s <Vq%2#.+'&'&+!5>=#"#52>?675.'&#"#"&54632;54&'5!3267>32#"'.#"# %4"9)" # :: # O$D3!&%+N83 == 38N+% 3D$&'54< 77,  * C  V@PJJLP77PLJJP@V  Cd!'.##5>="#5>7>75.#"#"&54632;54&'53327>32#"'&#"2#&#^ (( ^!"*#  3%,((,%3  #%.*   T v44v  G1* G: 7+hm))mh+7 :G ?a },(A"&'7326544>54&#"#7332632#"'732654&:'(=HZgg#=;#R6' z)a"5-OHoj ?6J&.""I@2:Q@GQ% ?,8@RN%>%N5Oo  36VE!'&'&+!5>54&'5!327>32#"'."#"#.*! :; := k(N+%  @:(X&LB7#>5!7JJP:^ B!fD8!'&##5>54&'533267>32#"'&#"#&#^} 0((((4 3 $%5? $&T))))m=&+< 5G5n,}G#"'.#"323#'.##5#!5>54&'5!35367>32  ?8*X-1(  +0 :; :=0+^&M+%fP:^ BJ" (tt7#>5!7ttJJ =74&'53353>7>32#"'&#"#'&'#5##5>P((#3 3 $%7@ !} #((X))mVV=%+< 5G7p UV)H5354&'5!3#327>32#"'."#"323#'&'&+!5>5 N :=NN k(N+%  ?8*X-1(*! :;65!76tJJP:^ BJ"B7#>h?5354&'533#3267>32#"'&#"#'.##5>=B((??4 3 $%7@ !}((16))64=&+< 5G7p  ))#E!327>32#"'."#"323#'&'&+!5>54&+"#= k(N+%  @8*X-1(*! :; S:7JJP:^ BJ"B7#>1S2:3267>32#"'&#"#'&##5>54+"#7.(4 3 $%7@ !} 1((,!)m=&+< 5G7p ))0'8}V1!5>=!!5>54&'5!!54&'5!#.#: 8:::/:::"9)"?5 "?6666W6'54.!5>=##5>54&'53354&'53#&#((((((((&T4v))))mm))/"}0!#.+"!5>=!!5>54&'5!!54&' 9Kd 8: 8:::/:G%"5 "?5 "?666~/#.+"#5>=##5>54&'53354&'5z)M(((((((}8'44v))))mm)&?2654.#"!5>5!!5>54&'5!>32#"&54632&M*X8#. 8: 8:::*5##5>=4&'5!>32#"&54632326ec %&%&&%'1+0Dj`#;2%,; p%"/:%"//"%0 Kg;s <" <%654&#"32>7#"'#"&5463"327.54>32Z-53X+  D;.2@E̒1T6&,W<1$CW+D>jjWDM{u@rL8K!9,DWU'3bb< .UZBuq$,%3267#"'#"&5463"327&54632654#"pC"%(*^}f N>e[4@O>O;7F  :eo{jFgjeODu 9v",223273#.#"327#"'732654.'.546v8o $  rVTBS|y{g#Q!@5J&.!.1YW5!!Ud=Me5E 33=L%&%! (LV[1%#"'732654&#"&54632#"/.#"326 00*;5+ ErX?[" =KWD+> 0(, ,L$'vio=*.aMVm*P!#5>5#"#7!#.+#. n> 6T949U6:>!@.RS-6H9%#.+5>5#"#7!#.+ &+,eD-  -Dc/"{84 L!7}}7!<'.$5>=.'53654'53,$$ / ,'@H(  C#"',3#!5>=#53'.'5!#7654&'5'8+$CD!}24" .'-B)9!A)I?'-*5>=#53.'53654'533#,$$ /,'b!@H(  C$!!b' V>!563654/#5>?'.'5!7654&'53#.#23_w4 ,'*@mF=2.0U*q()15/  + "9)LA Og4 v;2 !:! '543!567654.'3#5>?'.'53"654'533#&#!#P(r^!+5#"#7!#.+c 8::>Q:6T949U6,5 "?b6H96.RS-'!4&'53#.#!5>5#"#7!#.#%&&+,F%D-  -L%"//"{84%L!7}}7! V.!5>=#"&=4&'5!32754&'5!#.#x:HSfk::hRL:::"9)"?=gYj66k=66W6'540!5>=#".=4&'53326?54&'53#&#)8E*.(()$3((&T5m# ,R++P!+}+)/"}1%#5.=4&'5!5326754&'5!!5>=z+g|::A<+'L:: 8:N#qiVj66k?Stt$66D5 "? 4%#5#".=4&'53353>?54&'53#5>=#<9((0%#. ('(('5]T3'R)+P!+\Z}*)33m(%4#"!5>54&'5!632!5>5hRL:: 8:HSfk::ؓ=665 "?=gYj66K@ 3.#".54632>32!327#"&54 *K/Vlsa<<6JzIvB/0NP)zh*Q+E3&zd08'76s1CW=7U|?e;D"",2!3267#".47.546323>.'"^MK3G!A5M(Q.=eo ,&- ̷cw72*EIN!+;'77(NGE,'@,6.54632>32!327#5.54%.#"a<<6JzIvB/0NP)zh&L2 *K/Vl08'76s1CW=7U|?e6Ctt"5+E3&zd /.'"72!3267#5.547.546323> ,&- MK3G!;2=MQ.=eo5E,'cw72xxLY3'!+;'77(NG;, a' '!I&VX#"'."#"#"&54632327>54.'#!5>54&'5!327>32V  ?0M1$  "4X7)52   0<2+ :; := k(N+%fP:^ *#-*T\F-<)4/O/,F( 7#>5!7JJ%B74&'533267>32#"'&#"#"&5463232654.##5>P((4 3 $@ohQ)D21!B-((X))m=&+< 5GOhs54&'5!#'7#5>54&+"t&4 3:: 8y&X:  (G )P866D5 'j"?}w~=n1#"#"&543232654&'5!#'7#5>541_ 0#&" $&((z&Y(ILp]/# /"))'k)0O22325!!5>54&'5!!54&'5!#"&546 & 8:::/::XQ+87 B5 "?6666^g( &1265##5>=4&'53354&'53#"&54632"%&&%&%VS)52;P%"//"%tb/"%jp<n/!54&'5!#'7#5>=!!5>54&'5!/:: 8z&Y: 8:::g66D5 'k"?5 "?66o-45"3545'7#526=##565Y*&$(!!)z&X%'It)!"'ts'#(+"'j!'*E/32754&'5!#"#7>3>=#"&=4&'5!hRL:: 8kQ> HSfk::=66D5 9H'4=gYj660326?54&'53#"#7>=#".=4&'53)$3('"Y,+(8E85'("*})(448{ 2m#2(R()ng' ##5>54&'533'7#5>5$:>#!>8 7z&Y; =&mL1/M7 5D5!'k#>nh,3#'7#5>5#"&'#5>54&'53((z&Y( ((&))'k)92p))/"=r a&4'I T&jj&j0 i j]a&'IH#"&'!654.#"'>32!3262sR{g*N=ahYZhĠ$QWe54&'5!* @L $7>Qj9!6G%"6"H9';5!v!#.+"#.+5>54&'b!,W(+,g((}8'4{844)OP'j bk'j*9#5354&'5!#.+"3#3>7"&5462326=!5>5kQQ!6 @L $70  -B." 96i5!G%66"  !.- ';v6!#.+"3#367"&5462326=!5>=#5354&'b!,WOO(. -B." (00(}8'f64 !.- 46H) O?%#"&5463232=4&/#5>?'.'5!7654&'53c_S+8 &uw4 ,'*@mF=2.0U*q()15/,Y\(  BHHA Og4w;2 !:(`&;!#"&54632326=4/3#5>?'.+53>54'53VS)52.=O(r^  +.  (3SKDjp<;P- G^{ #E)*xsi ;#!563654/#5>?'#53'.'5!7654&'53a()23_w4 ,'*@DF=2.0U*q()15/6+LA O6dg4w;2 !:9#3#5>54/3#5>?'#53'.+53>54'53g#[O(rk9  +.  (3H6" { 6X#E)*h#74>354&'5!!"&'"326 #:dBE%98 4rT9Zk 06'6"#=N6YIOGj*4%26=4!"#!"&54>354&'5!''"326*?2/536-Lcr #:dBE%9769Zk 3:3-!%*MRY\06'6"$6&V/K6O({U54Y%1<*=@U= 7*^ C)K[/A)CE%o+(('/536-Ra)48dQe`=9bQAD#)09 +$0S-!%*OS $VCDJ!9Q54&'5!326=4!"#"&54&+"t&4 3::%$/536-LdUP  (G )P866cA8:D-!%*_CGY}w~=d9#"#"&543232654&'5!32654'5#"&541_ 0#&" $&%7 (3@4DfILp]/# /")0?+^ C)ITBE!7!54&'5!32=4!"#"&=!!5>54&'5!/::# A/536-O\ 8:::g66d2C{-!%*ON5 "?666%#"&=##56545"354532654'5H7=^'K")&$(!4")2K\NJq*E)!"'ts'#($27*^ C +.#"32654!#"&546323273_2H.v"5E?T>;-jľ9p &27EmA*RmI. (gCg!!%%2654&'5#"&54632#".#"2==(\\Vi[,B0=KU>(0  Vt{bm% *$,$`NXk("&5#"#7!#.+326=4!"^K6.6" 4 >>4$&/536-M G_ "*)600?JHE-!%*aK#&'&+2654'5#"&5#"#7! *K.R2I7>\K, T6$(7*^ C)J]HFK)3||,-3#"327#"&54>7.546323273#&#"]hcS =,gEJj"1EBnS1i@6MG!U;/2a hW'>"LBO^̥K%3"327#"&547&546323273#&#"G0G==.MO JiSk{ZM'D ^*7`5*<)08= VH>fP4=.O7%#"&5463232554&+"#"&54632327>54&'5!R+8 &  (G3&4 3::(  B}w~=)P866&4!#"&54632326554+"#"&543232654&'5!XS)52_ 0#&" $&(iq<?'.'#"5463232>=4+5!7654&'515/()23_w4 ,'*@m@;%V";#W 0U*q()!:+LA O]:?(6[^3Pw;2 uC>54'533#5>54/3#5>?'.##"5463232=4&'5!  (3S#[O(r^89@ # /02+.0)*x" { $qW8#+$E '5@!563654/#"'!5>54&'5!27654&'53254&#"15/()23q>^'#;98-TS25()"`e!:+L7!!?6&J4A2 GMI' I32654&#"'567632>54'533#5>54/#"&'#5>54&#"E#6CC8#C?Q@P8T (3Q~#9hA + 8,N,gSWi,% MOI>  *u" WFT/'#BN&54>3!#.+"32673#.+;2673!567>=#"#52>7>7&#";5452RO( 6U @%  &> Qk\%-"$2(7| :K';?4M'C&6'8>"6 3Q$*(WJ=6*<5  ;#";54&3.#"3267#"&'#"#5>7>75.546;6326$):E(2 W *.Z010G$nGRd& J#2,0Sie#LT 5Z1oA2?[-09QVn`%  W.:09K [\"N4'T : ZF3>32#"'."#"#'323#'&'&+!5>54&'5!327$C*G&%Da58*X-1(*! :; := e)O'::BZ.G BJ"B7#>5!7<3>32#"'&#"#'#'&##5>54&'533267C / Dd%7@ !} 0((((*&2 (|S*7p ))))m*&O"&54632327>54&'5!>32#"&5463232654.#"!5>54&+"b&4 3::*&K#"#"&543232654&'5!>32#"&5463232654#"#5>541_ 0#&" $&('1+0Dj`#;2%,c ((ILp]/# /")0 Kg;s =!!5>54&'5!!54&'5!>32#"&54632&M*X8#- 8: 8:::/::);/6Z81oL#;2B{S5 "?5 "?6666,!=`r8Tp <&G74&'53354&'53>32#"&5463232654#"#5>=##5>P((((&0+0Dj`#;2%,c!((((X))mm)). Kg;s 54632!5>54&|aK< X:G&<;{a':;Gxgd )##678}tI/&7,e"-%!5>=#"&5463232#".#'54&#"3 ;<ee{H X:G&Ka.FKJ76saZx} )## dgi=T` L-%4&#"!5>5463232#".+!5>Ka-G;:'a{H X:G&:;<m@dge,7&/It} )##7-32654&'5!#"&54&'5!!2#".#Ka-G;:'a{;<< X:G&dge,7&/It}876q )##(%37367#"&546 !2#".#!#%2>54&#"4Z] 0M]]M< X:G&Z4M'nIX_`\)0K{x}1`JC0#  )##*,ED"hsTR%34&'5!!2#".#!!2#".#p!@)?#1 X:G& X:G&)7 7c )##z )##2#4632!5>54&#"!2#".#!2{a':;G-aK< X:G&l}tI/&7,egds )##*3.#"!5>54632#".'#"546326@54&'5!632!5>54&#"$>?"!@)?#:[a':;G-aK7! 87 7V tI/&7,eg7!2#".#!4&'5! X:G&!@)?#  )##)7 7/374&'5!332>54&'5!#".5#!5>p!@)?#,S);:'0X?5J-N$>?"m7 7o3x!DQ;7&/?bQ+ 7`gL7!  :4.#"32>"&5467#".546323!2#".+*=3=X--W<2M/ ۋVN^ X:G& X:G&kMW#Gj9" 1TZ32YU2"5JGe# )## )##$h(32754&'5!!5>=#"&=4&'5!hRL:: 8:HSfk::C=k665 "?I=gY66  7!#'!'73!% u7>"f=KWZ(| .727&#"7654&#"46 #".'#"&54632cQDn$$TnIQ]s"+G  >/HLSG| NM2.|rhsqNx}z2 )/&)?+CIP#4&#"!5>5463232#".+Ka-G;:'a{H X:G&dge,7&/It}{ )##($-%#&'#"&547&'5>32#"&#"&'32LClGekeeAT! W%Uv83l:H8  MQ?l)7R2^,G<Mk}/7N+"#"&54&'5!32654&'532#".k{;<JYAM< X:G&v/j}876chtW@6 )##(L?4;2>54&#"#7332632#".543232654&+"#"&(*%:="R6' z)aQH6`>..+A4HZie.Aj ;,8@RNn%&V5Yr"05$ $%Q@Ia: K#%32654&'5!#"&5#".54632;jKa-G;:'a{H X:G&dge,7&/It}w )##3"32>?#"&54>32&#"#"&54632&e=X--W<-H.!sBeq2(-a!DY)T^R =81TZ32YU2,??$GyL**:'7M!2!5>54&#"!5>546k{;<JYAM<;}76@chtW678j"%732>54.#">32# GJ1=X--W<-H.!sǡ ii! 1TZ32YU2,??$5463 !5>54''7;<`AW>Kr76@ED{^)(8%654&#"32>54&#"&546 !2#".#!#536?nIX_R(8H Wi0M]]M< X:G&ZZ?}rhsT9(8( ,dWx}1`JC0#  )##*)`/232#".+!5>54&#"!5>546k{H X:G&:;<JYAM<;} )##76@chtW678j!"&54&'5!32654&'5!d{;<JYAM<;}876chtW@67jB,%32#".+5#"&=4&'5!3274&'5!9W X:G&HSfk::hRL::  )##=gY66=<66(*".'732654.546323273#.#"=Z3 sA566B^]BgF*b c<.:EbbE|4.54632!5>54&#"<;{a':;G-aKm678}tI/&7,egdB1=4632#".543232654&#"#"&543&2654&#"w{W^~QH6`>..+A4HZie&5AUB6A3);7B^QOn%&V5Yr"05$ $%Q@Ia:%%P<:>F2?M;(74&'5!6323#".#"!5>p!@)?#K15=*(/B*$>?"m7 7W*<<*!+3+7! Y  =2654&#"".54632;54632#"'!2#".+!5>=JKF.aKQ X:G&{eeh- X:G&<;`T=igd;T )##}xZasL )##67 !"&546324.#"32>_G+:71N- ,W<=Y-VHpD,*?VO)3bb<54&*,G%)\?#,.K),6hI8.+9, ,QLCdXa !-?S 7$4"Uv"04% %()^1"I/<>> P4CGPwPx ( 3#5467> ?/% >0$!#&.&!#&. 732654#"#>32#"&'TF^b8:087&.aDY,$* #"&54632#";2/BC/1''&%624&'5332754&'5332>54&'53327'5#"'#"5S( +B++B:(HD>0=/ i$K/TT8.%#5>=4#"!!#5>54&#"567>32%&I*$ 8,J@3;#7?%"/2a" k/'%O0!OG8 (732>=4#"?33##5>=#"&54632n>1&.]@J6 kk)5$DYFZ^6+PC% dg_ W |  *Jx_l8.567>323##5>54#"#5>=4&#"J@3;#7?kk%&I*$&&O0!OG w%"/a"+%24&#"567!!32>=4&'53;'5#"&5S[8* '/"^0   7B= -&%#L  G;8$73#5>=#"&546323276=4#"h6 )5$DYFZ^6>12$]@J  *Jx_l+PC "dg4&#"567!!32#".+S[8{ X:G&= ^ )##8$4&#"567>32#5>=4#"!!OJ@3;#7?%&I*$R%O0!OG%"/a" 8.7%3##"&546;.#"#5>54&#"567632#"3247 cM/DC0jC6#C 8, ?Q@PI^Vj%.1%b YqD/0GR`,G/'# MOx]*1&%1 ##"3265#"&546;54&#"5673Rf9DL>&3THSfzVi[8kcT\o+FXw`jq 8*#5>54&#"5767>32#5>=4#",+ D/#D,{)+K3WG45 -'4 3j84&#"57[ ):!7.8=567332>=4&'533'5#"&=4&+#5>54&#"c<* '/%N; "7B(1<0/ o-&%&S  G;#)(# !"3254'3#"&546;&'73235AN@x$W'}c]}zZXIF<:>/wVFjiKFM~deu dRQC8)#5>=#"&54&'5332>=4&'530/ "7B$* '/t)(  G;#-&%*#5>54&#"5767>32#5>=4#",+ D/#D,{)+K3W45 -'4 3j )%54#"3263'5#".546?'7V`FA=-,;VJ`8SX,9NpWWdx 9`cvL,P?$uhX$S%1F`8\ +d<`8&4#"#5>=4&#"567>323#SI*$&&J@3;#7?$94a"+%O0!OGS&+5#"&#";'5#".547467>32326=4- 11* 8SX,9N>`iKN*'qs,;G '>S%1F`8B*y$(74&#"3'5#"&=4&'5332>=4.54632 / %N; "7B$* '5/2O?$9"F0&S  G;#-&*68.'F"%&567#"&5463232654M-PLVS)527jp<>M{<26"32>=4&'53;'5#"&=467.546;#"3+* '$#N;=!7B%;;%UX-<.&=[-&%#IG;<; 0$.50!383 &54>54&#"'67632V}8OO8:<21 1oKWEREz  '(8KyIDT5MI_mO9bY*567>32#5>=4#"#5>=4&#"J@3;#7?%&I*$&&O0!OG%"/a"+%8$3 &54>54.54>73$33$?K?V}N_N3=3!%C  %3MPr2  '\X_9&& &8 1"'#"=4&'5332754&'5332>54&'53#5>=ONUt( +B++B:(0/= TT>0=/ i)(V8.7654&#"'4.54>323 &54>@:<:I'88'!9C9)R9KWEREV}%44%(VmDT-2<,% 5)&CA&mO9bY  '$F)!>54&#"#5>=4&#"567>323%0'*$&&J@3;#9KGR}.01"+%O0!QEg %%'5#"&=4&'5332>=4&'533N;>!7B$* '/"2LG;#-&%#8%3##"&=4&'5332>54&#"#567S;!7B$* 'c< G;#-&#=4ȷ>32#5>=4#"3'5#"&=4&'5332>5SM+47"7?%&I)$2F- )7B$* 'P'H1!OG%"/a"&H- G;#-&8*%#5>=4#"#5>54&#"567>32&&I*$&&J@3;#7?C+a"+%O0!OG& /73276=4#"".54632326=#"&5463273o>12$]@JZ2)+9DYFZ^6=6 0\+PC "dgCHmJx_l$ 7'GD(34&#"57Z ):N!7.8B%#"&=4&'5332>54&#"5767>32#5>=4#"#5>5S, )7B$* ' D/47"7?%&I)$,+@, G;#-& 1!OG%"/a"B458 232654&#"'567632#"&'!!#5>5#534&#"E#6CC8#C?Q@PI^yY +#=.5432654'%'*=9":(fU.5(*? Uu,+*K0#.++vvxK53<L "CWE0  3[jS45Y',- )*) _6.732>=4&#"57#5#"&54&#"567* ' ):   7B[8|-&!7.E  G;Q%232673#"&54>65 ?.:6 %8$.C5 E 546;2+"=4&"+"=4   w5 5''''1 O'T'T>Ty/'&54;'&54;'&54;2++++".E# 9A <;I ,5@A=    - +  %  ,     ^O'T T _O'Xw'T&T<".'42! #*(.Q0 #1=w%c .'>7%))) *+ -.a1)&#"32#"&463232654&#"&54632#"'  -,!M   -,!  +>%E   + $<o1l632#"/&47 wr ; 20 J zWOza2"5>_(*#a=1# 0Q.a7a&7 7us&;D(;s ("2654&#"&#"#"/&54?654&54632" . <32#$.R!""1&/' )% 2/LT326=4;2++"=4;2" ;  $/"0,ZX-;546;2+"&=463   l    45mz 7lQ 6&@9@p+"=4;'&=4;2+a | [W | ZZGo1las ("2654&4632#"/&#"#"& . "i.$#23R""!1#/2 %) '/M,)I?M0H>u9113H"264&2"&4>( ( YJ11J1& ( (B1J11J#&OO c"~&Oa&O&Oc&OOR#[&O@&O@ FR33@.[&S &O@ O@{"5462! ! N&O3 O $W&O&O< O }_53ȃ44\ 53##"547U! }44&GE-Sx .4632}x  zd` h'OMY&OO #9$"&4632 &  +#5344ՠJ_l73J88_KKy_R43#3444o .4632o  8o\qI+i %.'67.'>7+.  C$*+$  ($  / % C%'U'% !,o\?u[ 2#"&546,-*V/V "&#"3#4&5&54746;27>5$7+%8 ' !%lSbn P-  25#r #"&54654+"&=46;2+"*&,  ,& & % ! ! H[64&547.546;237".54632#"'./2+".'.##>32>G%? & aX3'(,1:18 1$32#/|W%(/(s %3H3$< "dBG/6 (2(=/M*4H#>*(A'cC(:.=  V"&547;23!7!4&#s((0G6#C#r10!67=Pll.'(V8"&547"&".'.5##54?>5>54'54&#" 7;    >vx  ' .B   /2E  3)ew )T 3!2++'"5465!"&545;$  1&T!' < )(8V83!2+#"'"5465!"54#'"#"54654&54>324;*  Z4 V!A .V1M;$2 0 )G# d0V&2+".554&#"#"&5467323261 .!!  3&( M E5#8 7 V7"&547#"&54654&54>7"#"&547     17 t  !'.% ! + ?/W*6( '&V$".567"&5473!2+#"&5!i-' ;+ 3230-1 Ac -7VF!654&#""546763632!65654&54>7".54674&#F^/T='$X  ,B% p+3+ P C( K8$)1*#Y0FBRD9"/ 1 4g#/J$40!9:=Aw"&546732632#4>54&#"v " "# )$6 )%4)43!2+#"'".5!"546> E*&  V4&&8FZ.,E6V$"547;2#!7!2654&=4&#eF%1+=$B3=W569'EUJSl,8 1-E.J422!2#"54>54'.#%"547>54&54h # 2+;  L[L 4 7*A"27+8 IGU j " V"2!>;"!4&#"#!"&4673!:>  "~/(%36>SN 5D((45 WI%!267!754&#"".=4&5467.5467327>3(@u_,H)  %.( H >P'  Hjy[u&7B4 b#B  ]6'"/   /"&@A.T=:4#"&547+"5>54#"z#$U " 3,0!0!9 <C%J 8/V "&547;2#7354&#"$! ' 8%+7$#52  -P nbSl %V3;232>54&#!7&547;2+".=4;&?! +A+!/[S#1^Q "I:[E?uH?&=4$ . !<6+F` XH2>57.4>?#"&547324.#267>54&#"&5467&P SS   !3K   '!$$4*K  P >1"'$N K' .'U235 ' =  337"'.54>?.547;2#"54654&+"#32632N#<!KA  : !/2, $C #M fP &%V87"'.54>5.547;2!7!'.'.+"#32632M #<-A"!_#1& *9 "+ 2( $B#'7VC,dl(5$$ 5)!4J.#"##"&574654.5467>7>7.5467C/(1( 9 #-%(=  i0,&Eĉ 7  /$]> &,-/  . VA4'!67!4'.54654&+"&54677&546q!)!1( L0:G:4!$ '*V &!,#   .%2S ## D,#3  N<M.345N%4.+".'&547;2#"5467>"4654&=4>32(0.  -6" *G<!lB4!"   >F$  2AGB  /&# ! J&(dJ\xq0 (%+V2#"&544&+"&5473P0J  :-* 38D^=82 U7!0<Vi467324&#65"&546732&#3>54&'.5467!4&5.54>?"  * k"  |*@  75* 8: $  !+3!?  #%b  6  *1Y ' -8  VB;2#"&54&#"#!+&54632.547"&54G8#&G  / V   S a !":$2#C5$%*,h?1%9V%M2+".554&#"#"&546732326!2+".54&#"#"&5467323260 +$!  0 ('!   3'1M E7": ((N E:#8  !V <2#".554&#"#"&54673"&546732632#7654&#"1 -""   "!# *3(+1lWP E5"9 v%5 *$2'Aw6"&546732632#7654&#"!"&546732632#4654&#"] " "$ ) " "# ($6 )"2($6 *$/2))2#"5467>GL @ $fFz$-Z2#"5467>32#"5467>GM @GM A $gF{# $fF|#c7"&54767632 9#,62"  8<!R7 ,-6 7"&5472+"54&3mE# : 5F8,^E.  IIDFED!,4632"&54654&#"#.'&#"&4632C7C5"!'@#.2CF.$ & #>. Q;#?F,.UI%"&#"32>767.54672(1# L+6' D0@8F6 4u<0 $$5Z<( e&T"6I#W# o(#54'7 *.qUY~A'7%4&'7!"&547444N A287F 4*665RF@)S*7M~ h%% | #'#".54>7'32654&7'7'7HG- 1$$EA*4#?_777f877lP'$1 &7&< &P. d7777777{'7'7!"&547!4&'ACCACC?K56D )vBBCCBBC'P )5Lx%T# PD "'7'?'74.'7!"&547@CC@CCABBWA777F 3*WBBCCBBC7CCB8@N?)R*7K~c)&zm1)-237#"327#"&54>7.#">'7J pY|tN(N6n%Qvx.K%<2 !"55441 >7PgV%$A=%,.5r`HfF  !o553zl1(237"327#"&54>7.#">J pY~uM(N6n%nzQvx.K%<2 !"51 >6QfV&$A=%,.6RHfF  !Wp ,0237#"327#".54>7.#">7'7' pY|tN(N6n%9E7%Qvx.K%<2 !"5r,++5 >7PgV%$A=%,.6 -M0HfF  !,,+rl%&'&'&'7+"=7~ 05"87 Nc O )8hCN`&rD'7&'&'&'7+"=7/977 1 4!76  997 a N (7gBM_&Y%76?>54'E 16hSEF$EOH H 1 dcR&-WY%76?>54'7'7E 16hSEF$;8;;EOH H 1 dcR&-W885|8%254'7#"&'#"#".5473267654'732=7s4(-&% #$:1-?Y"2@(R CRm? *! k( $JZ$e44$ "-E&!  <*@e9FH*-MC1H8@D8%|8<@D%254'7#"&'#"#".5473267654'732=7'7''7'7s4(-&% #$:1-?Y"1@(R CRm? *! k( $/11"/11$/11JZ$e44$ "-E&! =*@e9FH*-MC1H8@D8%---:..,---! %.2##"567>54'7764#"232@$&W\%FS8QkA\-?",x54'7764#"2636'7@$& G]%FS8QkA\-?",x73.>>W#qS5D L b. 7kD#Iioh:54K*=m*8%Q"CK{HL.A$8]8$(467&'54763&#"32>73.'7>>W#A8K5D L b. 7kD#Iioh:01154K*@91*8%Q"CK{HL.A$8G000+3$-1%4632#%.'6723263265.73274&''7P:/*HV+""21!!4$7%e$U*/122:~{B\/K6LN$"  p =1`223/;'7'7#.54733>54&#""5467'"2654.777f877G[;R+3 >tZ/5C# _<)76pRj7777777N,8 $#2$`zaF,8, .3&xb0l#y5+#%".5473!4&/&'&546?%#8QP8*'5#Ob=>= "4[~W <\qMe M7C@-(MD@BA4 $?0oAJ.2[-y2%'72>5&'7#"&547;::W[N&(: \Bki)777'M; `Gt"a"jg\aJ:+:8l".54>7'32654&HG 6,1$$EA*4#?lP'2  &7&< &P. dI74632+5>7654'#&7.#"@5Kj3t5!Y*"c*-gBUUaA 2 "7$G42f( | (,02&#"32632#".547$7&#"546'7'7!!"]P ?NjRv<S 4h^..ceACCACC  V)g#;>"ksbS]8ABBC"BBC6fC7>7>; $ ; $& J   T J   ,8 7>?>; - ; - J   a J   6C7>; $& J   3%'#67. 546324&#"6 2"]G5  3"  '* @$'I "2)   ,8 7>; - J   Xl#"'#"&5473326732654'7 !  $+ #-   25a#"546732654's!( 5 )a9"#I"  e23267#"&#">6 "(/7: 1@9#0R$77E(NeNGvrPKG%'7Kojj|}zNT ".'O-6&TL}5dl2>7#"'#".'7,! ",K3    5)<00 & &aE~J|6^D$ep.32>3232>5>32&'#"'#"&54654&'/#$  M< ' &@p> ' #1x-&_r!$k%G|I*2632+#"'.'732>32#&#"a%'DUD !A.! 1!D #= ->kգ_/))" &!.=("&54>7'7#"'32>3232>54&;(WT4+,:;:<3Ea7  $%D IG3v9@Fql:Ia<5b0Q + 2O2'2>7#"5467.54632#"&#" L9TC[?.B w7#2 /.C'g $- .L 2! B!/>77#"&54/q>aW#v[Z~0](8a  '67:6C$&ClWdGaV Ml#.5#"&54>32327.#""'k"&5463267O'#  + 8'90+NeN"&#"32>767.54672   !1e%,)$- " !L$"#:'%rB#'7%4.'7!"&547'?'7455 B,79G 4*4555557743C' @(U+7O}e*&7749774zm1)-15237#"327#"&54>7.#">'7'7'7J pY|tN(N6n%Qvx.K%<2 !"5u>??>??>??1 >7PgV%$A=%,.5r`HfF  !w??==??===>k+ %'7''7'77> 7654'k455466455 16h  %!221G220221EOH H ),9!65-Wy-1#!".5473!654/&'&546?'6%#8QP8*3"Ob}= "4[~TW <[qN22#K4C@-'MD yA4 "ksbS]8AZT767&Z && &&&% %& fi#"&54632>72($%0WOX# Nr^%.;'o#2632##"&54>23>7&54632@P * 1'7>-+ ( 2+ %87 & @ S" ) +Ag/'"546;26765.54632326232632#"&#"F6 1"  -* >  j6$!'^+. ]   *9 $A#%Lp(+%"543>7&5463>3*.AE4%.H)SH"3 ڤ$+B4 -  +  ^a'22#"&5467>4#">7>67&v2*pGNWA"15U1  &+6 a1@}0=,RM@G  $ K f+232632"54632326767654#"5460$/   k/ } E,f$  (> A>T|k)267>232#"&54>54'>+\P 5& \(_*F  . $   8X72>32#"'4654#"#"5460'aLV=)C x$(AMA% # hvO!V#2#"5463232767&546"32654T),V<60E:_<=SV (,9, /).Y;. 4,f "#".54>72#"&'46;2>5&:,.."#7.54>763##"&54>?.  ;   0   /**;'9. $C         %&u }>%2654.54327>32#"'#"&546323:>767&'632`4" )  G>;:  R& -+      2E7"  2+,*V1=7#".'54>322674.54>32#"&'"7274.'"YZ   $-T?#$1#*8 4j!  &g"9  RO,* '/4 _ o/#"54>32>7>7#&5767>321B:V21    5 !A(##&6n/ k  $   ^m'746722674&'467+"&! F'*L h ,,   08   +"`N%'"&57>75.5>7237>23>32"#".'#"327>;2*$[  0 $)  $  v Qq99! 7B, "   $  H `; ha(7".54>7".'>32!67>32#K    #! K }*#2   &HLv0e4632#"&54>7.w{"" 37 z7M e)Q"  M)  8 *1  m22>72#"&'32632#".5467&546t" + =I U/0I&x3=O1Ni &A <   V)(6'/C92z6?K#'32>72#"&5467.5467>724#"7>32674#"IbR&X9UDB\#]J,1  ?>  '$ R&5 )0& "=$.8 (  :6#(@ '?     =$ # [54632>;2#"&54>767"#"&'>32>765&!,.; 77 b-X  $h %+ $  : $$IK    ; I%"&54632'4>7.54>763##"&54>?.    ;   0    L $Cz7"$           N' (eU4632##"'3272672#".5467>3232654.#".4&4&4q  <7'Ai-263254&54>7>"3674 gy @/*'4 (*(# ! 1:a!+0F 5\    >$#)*CSq !  NZ4632"&'".546322"&46#".=463226?4.54>7632#".'"7274&#"s% ^ %"Y[   !'O5>@## :840j"#k &H%&"8    &>#-**B 4 _! fi %"&546327#"&54>72>72  ($JT:S%w $ r^2$; ] 4632"&#"&5432>726 &W'&N=5J*F% % kq^2.1  R2"&462674.'4>727>72#"'".546323267&'632a"1      G>;g  % -"     2EbP   ]*, ( 5"&54632"543>7&5463>3*.K  0E4%.H)SH"3 &Ĥ$+B4 -  +   h G"&54632'".46324632"&".54>7"&'6322!27>32#   Z   % K  ;   $ K }*J%W%@ % #2   7 HL Oha*37".54>7".'6322!27>32#2"&46K  =   $ K }* %#2  7 HL>%w*2"&46.'4632!>7>72"#!.'> %*/    E 5&  '!B  $W1  -V0<F7#".'54>32274.54>32#"&'"7274.'"4632"&YZ   L T?#$1#*8 4j!  &  & g"9 ) RO,* '/4 _  %!0<F7#".'54>32274.54>32#"&'"7274.'"7"&54632YZ   M T?#$1#*8 4j!  &   g"9 ) RO,* '/4 _ $ X&72>32#"'4654#"#"5464632#"0'aLV=)C x$(  %AMA% # hvO!O%8&72>32#"'4654#"#"546"&546320'aLV=)C x$(Z  AMA% # hvO! &^ '1;746722674&'467+"&4632"&'4632"&! F&*L h ,,O & r &    08   +"d &  &  *5".546322#"543232767&546"32654O), #, *5/%P:^== Q$ J (  `,&  7(.Y;. +#.=467>7632      h =#&5&54>7632463>7632#&5-G  #* G4>[!)2"54>7>^"-a!*<6 `V%(*(2#"54>76"&5476722 % p  0M , #   `4S   ,"4>32#"&'4>7&#"#*.F8+>i9T8EC F& 8o#/"  2a7>32#"&54>54#"""%4632#".54>764.#"#"Z7+9a) gg(  +P=DTl !A!6-'#' 064SA  $ 272#".546721D(.-( a9A  *6p -'!ZO0#"546?632;263226;2#"57>72>*8C B  , |p 34MB( a  3BmP bG-"5432>3232#".5#"54>?"B4F4 # .O:D .,&%=& +&" )\ /  $i "cu4>2"&5654&#"32632#"&hjEy \D; ( N$*>i3X6.EX D1?+'#)A   4632#"7"32654u?+4{4d(6FbD[0*A[@ 8#]'7'2#"54654&#"#4>888(5/ 12] "$;[8880/$3"FK >C1S'".5232654&5432888l0[;$" ]21 /58881C> KF"3$/0$'888$888t7''SRTSSRTSSTSSTZ';b_23676=#".'!2+"&=##".'43232>74&#"+"&'&'41'432654#"#"&54632W MM C 3>@S;K>2mM4 .4) 2/ Qp9QV3(Uz U  '%"? :&;PJaU J5'( $  e# !> o238bb23>=*"#"&'!+.5#"&=##".'43232>74&#"#".5432654#"#"&54632W -y% >`>>d@S;K>2mM4 .4) 2// Qp9)Q43(Uz U (?? : :&;PJaU J5'( $%!e# > o23PbF463235#"&'!2+"&#"2632"/.'#".5463232>7"#"&KIQ&9@ [E>g Be++4  -8%@#,'0 hBa|0%E=<*b1"; +^* 6$$-!fPW]463235#"&'!.54632#".#"32+"&#"2632"/.'#".5463232>7"#"&KIQ&9O X3)"U5*&3/? [E>g Be++4  -8%@#,'0 hBa|0%E= _,(549 4",<*b1"; +]+ 6$$-!f|bH4&#*#!"&'!2#"&+#"&'.'47632326=4&#*+"#"&54;26p &9C#=  %)#4BL] 3  ;* 32#"&54?654&#"#".'.'43232654'&+"&'&'3CO   F ?)%,     H1 @)%,  E91^D83EC$Y 6 ;)$ +;.ERD 6SIM9#  bb25!"#"&'!32#!7&5>32"&#"32632#"&54632'"&=#"&5467.#"#"#.54>=c9 = ?ϵ U(T $8 =*V{W.]W$ A,=$X"$4<'E13?? % Ms"85<  q+.HP; G > |  = cbl>35!"#"&'!2#*#!;2>32".54>54&#"#"&54654&#"'"'&546323 dIW <3='0'&7:/ ' 23(G,*<=*5Q( AT#*5$'A L7),O!J 7.)R2FYo.:s#:CZ';cA2654'%.=.'!2632#*1##"&5436=##"&'&5432# O47x >9#>W 14/!#:)635;B =5@  c  #E/7&<8p":8Z';W8~}2+.5#"&=##".'43232>74&#"+"&'&'&5432654#"#"&46322367>504=#"#"&'!&'&#"&54323@ >d@S;K>2mM4 .4) 2/ Qp9QV3(Uz  XBC >\ S>Y[6m" b<: :&;PJaU J5'( $  d" !>o23   % ?1?7"m9 8+.5#"&=##".'43232>74&#"#"&'&'41'432654#"#"&5463223676=#".'!.'".54324&'./.5432328>d@S;K>2mM4"#8# 2/ Qp9)R33"Uz  XB C 3Y&H#\A ++& 7 vY=: :&;PJaU):;)( $  e# > o23   %%"2A`L([  : ^Y<b9H25#"&'!2#!632#"'.547654&#"".=#"&54>2654&#":/&9=Z&C 4,W"%,P)<3325!&/&2654&=4#"33 =E <=@Y%6,F89<XVF Nz6I7?>#6+6(c443246=4&=.'&#*#"+.'!2632#*1#.5##"&7   7 ;>+2,d47 )u ;C : jNYc"D.54654'&'!2632#*1#.=#"&54327>=+"32632#"Y/+ ;>BXQ}O(if  #5 (  )3D#)=) C =.}96 \   %+c@D463235!"#"&'!2632#*#!"&#"2632#".'4323267"#"&%'cJGS<> XG> [FaoR;nG-&sEhiD`878{1&E?@ +b/;I:TM-R8?e)777c.;.=#"&547#".543!:325!#.'!2632#*1#"326=#?H9!2&<iw<$#>@ >',ib%.54635!"#"&'!32#!#"&54?> 54.'#"&54654/&5463:32#"&#&#"32>7632"32>72>54&5"&#" &n9-U=n > W +\  >     It dc:,; #1EP?6& Vi U96*8$+ v9+-*A'= $;& Ub;72654&/.5!5!"&'!2#*1#.=##".'432"+  3,<%=>](/UbZ  `3(A s>? < dT&9*OU  Z_ibG\463235#"&'!2#*1#"&="#"/.'#".5463232>7"#"&26=#"&#"263232KIQ&99=A>C# *)5  -8%@#,'0 hBa [E>)I$3Z|0%E=? :$ != *\- 6$$-!f *cF2>75!#.'!2632#*1#"&=#"'#"&54322654&#"#"&'&5432G,(-9>AD0) *{ 3 2A & ($a*0 >@ ;"2K!rL' #aI!  6Ac='4>35#*#"&'&'!2632#*#!#"32>7632#".7Z[/  a ? -YU58J!,-  l`=oH*0E#s  A #D,"   "60HOc(;'4>325#"#"'&'!2632#*#!#".%4&'"&#32>:tO  1a ?[zZ:nJ-$" r"::W(63s(A p2BY/FQ 6WH$ %6,+cA463235!"#"&'!2632#*1#"&#"2632#".54323267"#"&cJGS<w > XG> [FaoR3`C3&sEhiD`{1&E?B +b/;I,AH7 -R8?eb1<4>;5!"#"&'!2#"&+#"&54632#".2>54'#JWBH =N&;  ECYJ#8^(X./mQe! ?;'p.> $(C : #7":]3fU>!*&b046;5!"./!2+.5#"#"&'&4C)x2 >$2 3 8  I#2Oo&<"'&S7  r%[c=K4327.54632#326=#"&'!30212#*1#.=#".74&#"2326 '943( +]H Qt;M%&?-O9mD) #%\*C($-rKAR  o=@4 <u';NE )sbP463235#"&'!32#*1##*#"&#"&+"32634632#"#"&/4&#"#"#".XZN':; ?" XW  51&%4 4 9   :iD(V?/Q:@ .>. ,62'#I+3MXcD7"&547&54632"32632#"327>=#"&'!30212#*1#.=Q}2Z3=-. '  )3D#(if ;M%&>B}96L<*(@+! % \ @4 =.c'46;!5!"#"&'!2632#*1#.=##"& %  =x >>%$b6&?B :("_c"1"b+%"&5<547.'!32#*1#.='26=+"T'T =?!k8T   / @ ; O9YLN;b7E.=#"'.5<547.'!2#!632#"'.54>54'4&#"'26=+"?$C82>' ?Y$B"0 (/!7U&; 5*W  / @ l {K[w  4 Gh-  3!8Y#{ b#4=25!"#"'&'!32#*1#.=#"&54632654'&#"327TH 1Z =>4]cMS '%#G &''@(? =DC8JZw;'   %B" c44&'"&'235#"&'!30212#*1#".=##"&546;u(#<aP ;M%&$$#_4-?Y$81D@4 /8  ]%c#'46;5#"&'!2632#*1#".=##"&735#4< ;$%$_?C /8]Pc(=4&+"&'!2632#*1#.=#"&'&56263>26=## G; ;?2GU&'8 5Qt-V> ?C <u({Z #0%o=5:>T  fb232>7#"&5!32#*#!".'.U%8/ > 1"@DA- "R,D$ (Z6>> 'JH-(L81, F.NAQfb"1':bD4632327>35!"#"&'!2#*1#.=#"&=4654#".?&XF#l:W < = N$/ ..#ql<80F #o?? < D? #(&+Q:0) owb)8P>35!"&'!2#!#"&'#"&54632'"32>?4&2>54&#"L R)d%8O? !odI;u8T@M?+-5u7N! ?*!L(>#&5!>'&  +#A=?   \\E^FdYF\ +ZA2$);: &/# (*(/F wb#1L*b#725!"#"'&'!32#*1#.=#"&546"32654.'&TH 1Z =>4]c/<(   C[$@(? =DC8JO 6% A@cQ"32654&5.'&#"&'.546322>7#"&5467#"#"&'!2632#*1#.5##6.  F  j&1 ! -22H2#( =x >>;c_M ^S:#%) <' 1 ! &N;4]@0/?B :( _]p5#b,%"&5<547.'!32#*1#.=532>7T'T =?!"("  / @ ; X<&j b*62>7#"&'!2+.=#"'#".26=# - T<> ?A#Gc -RT WbN3u/%Y=?? :%-5za[&  ]0 /bO46;5#"#"'&'!32#*+#*+"32632#"&54>7&#"&'.547.m3 1N =3 '[;>"%:Tv,#I#* 2_U#0%@(@ 9q2'H> 1'E7'$"  7-R4./.54>76;2;2#"&#"&+"#"&'4'432%9    " ~`5BV#4)E  > ("1* &.o7' =57" -j5*> t@K|c.5"&'!:32;#*1#}>;0  >&: ?? ~0.5"&'3=4632.#"3:32#"&+}>;U8H3F* X>/K &: ? 7:2) 0 +),3V !|~).5"&'3.'&#"#"&54632;2#"&+}>;S 6<2R ?aJT/@  &: ?({9* :-bn = MC%'4632#".'&54332654&#"+"&D4jG-HZa& !)7X5:22' ( 'b82*+Y=(55%5 ' +:BX%'4632#".#"32632#"&4).t^D (19M(&21  +&=y #)G`T-@@-&  (  qbNC4>32#"32632#"&'<8( IdN&5#C]& , .% * jbD<467&54>32632#0"#"32>32#"&#"32>72#"& 47@ ' Bg)(#/ (N#((X&=& +$E$Rv 4*% ! & , #() cps".523>54&54320[;$$ ]21.51C>!KC 3$/0eZ#4&#"#"&5332632FS*PARJ*Q#."e&3 SS'D 8a~#".'"&#"&'2 %0@i> <xVi(:;->qa"#"'&'"&#"&'2.'"#".'&56323  =agUB *c/e d:8:N< " x|s#:h3|Z';3|~(.5"&'3.'+"&56;2;2#"&+}>;S!9S;>U[6m" @  &: ?-9;#?7"m9<|224&'./.543232#*+.5"&'3.'"&#"&54\A ++& 6 vY= >;P&H ?)`L([  : ^Y<: ?2A= / .'"&52 %B*'<>b .5!+>>&: -? k!'#"&'&'32>=4&5432>32#"'&54>7654#"#".543232654./&#"#"&54>7654&#"#"&54>32{878'N>^;3c#&;$$0 IV28c<"#$  P#878^2_sb 9"1*3)6$0C@ # -*(  ,67 /50A<  ?+  A$ >  3C<4; #&54632 #%p!5!p}2l#'&5432[("ap#7632(#Ŕ pos&:Fb&1 Eb6CG>5#"&'!2+.=#"&54>325!#".26=4#"' . S=>?Y%6,F8>: FS QZGz6H7><\9!0 1 g}/xq[6+6(878c&16Ub'1c&1bUb'1ke;b&1"c&1&,b25!"#"&'!32#!7&5>32.#"32632#"&1"32>32#".5465.54632&'""&=#"&54>?>7.#"#"&'&54>76>c8 = ?ϵ U(- %> / _!:>   822?? % Ms" "@ ! &  )95++)90; I > ccb>35!"#"&'!2#*#!;2>32#"'";2676;2#"&54>54'&54>54&#"#"&54654&#"'"'&546323 dIW <3='0'&7:/ ' 2H! !9 ,7 +)#20"- .' > 7.)R2FYo.:2 JC2>32#"&54654#"#"&5474&#""&5463232>320 )/0C2 !# + #5 >.1(&3TT9 * P=)   %7"T$Ef2.JU"32632#"&=465'&54654#"#"&'4654#"#"&54>3232>322>2& # )- 4L 2"4 *0+>/#''2T0   + \=)!  &>& U$'*e1:  ga 2.=54l >=aB < a 2.=5432.=54 >= >=a?< B < gk 4>32#"&2>54&#""3+G#3+G&: ' 3A)>I)>@"1+$!( '.$b,9&'>?67&'.'&54?67.546322654#"'&Z? V$iM =x?60  $/r-" ,#' aC N n5KF`)JK4) %2"00S"3'i98#"&'.'&#"#"&54632;2>54&'&#"#.54632F, 6d1 O'>D2)'/1U=pXgKj671N+J+ = e+izEH%#".'&#"#"&546323654&+"&543:;2>5&+".54;2z   9DGD ,"N<)p? s)4 , m4!M CbZfQ2S&= +'##'>*7 MK:a!174>7.542?632#.>54.53#" cF  @*R.63oe%S 5% b: > TP&9q%  GJ `>'46733267#"&'&=4323267>?432+".'#"&F.  ] > &P  > @..*0b=V(C[-)@@=B}=c9"$2> kA+8<7HiiS%"&547.54>3:32"&#"32632#"3267654&543#"&'.'"H%P%>9 ") , oU   !==49*:('G 1 2 'I3+ `,&5  G0 = S*%  #B" Bj0 W;a&94323267"&54632#".'4&"32654&5.'& ; +"--)b$RJ-I|Z.@?B5(?6 #R [; R`? $0?G@7wm %8_wfD*,0 F*!2#!"32632#"&54>7"#"&547654.'= ? !r9G[( = :t'Oi$$@ w(e <>  )q%eO%fb);"'#"&'&543:;>54'&/547>322654'"&#"AB3!K5&4  $I J*Dr*N786e/K54 $L6k$'u[@6' .2 4>32#"&2>54&#"21=l21=lt.1 . +:s7+:s76(& $'888$888s':/iUb'1'1vy&1c)@I4&+"&'!2632#*1#.=#"&'&56263>"#3267.'632=# G; ;?2GU&'8 EL1 Hm *` TH ?C <<u({Z #0%h+6  Z8 M@R<%c*46;!5!"#"&'!2632+'!"#"&'!##"& %  =x > =%$b6&?B ?"_Ub?72654&/.5!5!"&'!2#*1#!"#"&'!##".'432"+  3,<%= =.](/UbZ  `3(A s>? ?GdT&9*OU  Z_9".=2>54&'&#"#.54632#>CJ4('/1U=pX/FF&: +J* = e+.O0cQ463235!"#"&'!2632#*#!"&#"263232632#*#!"#"&'3.'4323267"#"&cJGS<> XG> [Fa7>Y<@Z&sEhiD`{1&E?@ +b/:%@ ?&)-R8?eb;327'>54.#"'25!"'&'!32+;2#!"&'!5#"&546G+/''Ga TH!1Z = ="Cm4]c`%B /Y@(? =? 16C8J~  #"&'722672'#"&54632E# +T -$!B !0 ]8!7   /V #2654&#"5&4>32#"&sG*$0/04v))/=7(,C]7-%q)1 9A+{p#0L)'GTN# !-732674&#"72654&#""&54>32#"&54632z$="%6D+#31-?3&53;*'IK'Eo75!5-#*FU,+.P)KK531?f.,2!5!#./.'#"&'32654&##"&54>Ql:z[ )YQ(M.&!!-1qXeI22. M y0"'92! ;4#&/.'#"&'32654&##"&54>32!5!2'4&53#'|$]S)M.&&(1Ti:#=9b`2b$K y0"!?2! sVeI26KrZ324U23!./3267.#"#"'67.'#5!2>54.#"#".5463232..$10" .(+@s<>N5^) ?"/k &  !X-7%W :(2;)j+ (DD}'110'4(S" 2   /!(U67'&547"&'4>732654&#"#"&5467'#5!654&#"#"&'4>?326323""3VR1E,*()Z@'(3 !P %.u} &,R  OPf 1#H(6(LRNgUSKv: >) 7S#' )% +'2 <2  ) 2>0U23!32632#".'32>54'#"&=#5!>54&#"#".54>3326( "9&z G (6dS*F0'#/O0&;  V*&f  7-A+? ,7^>.2(\m6Tg -O>c5.B^K5,& #H.#2(  !7L J23!3>7#.'&'2654'#"&=!5!254&#"#"&547326Ra &,YqX%827)W/[ .L02 ;9#  ' %q=26753#'. ''./>7&##"&546J!/D^6B&)4262tt    7]84G+P$V1 41R?2'20%<2l   ;F5K.')$!&"6L12654.'47#654&#"32#"&5464HVDcdOL,KjkKJ%8 $2=.N>>D&1>/2$ !) +Y@C2@;5  ?#-<*3<2.'&#"#"&547326324'632#"&5465 FhHW* 9( >  &1&  $%.3;-ePJ:+7%'  l  5  (/"L,?Q^'.#.547326324'632#"&5>72654.'.5>7?4 '(*4!)CO( 0N %!1(0;*C 1#'8!+"G7B% &1+ 6- $@+P52/-E h  M5 +8,G+ W (3   ")+964632#".'&'32654'#"'4632654&#"#"&F7E',RAClQ$"36Te-?8. $,#M3'CUG5@-)?54.5467 +!) /9< &1"W@4]A;%/].9%"%%;2R({^85&&IhiI"!    ,D0#221=8G6RykBw1.&!$ .6&$$+=YN *F(0B54F. -%675!5!#2#"&54>32654&#'.'*Ij*" |VBy1#)NF*vRL " s#'22&vU(4',Qpkb23#&'./32654'"&54632>7ST 7S>S=v9f*%0)&%  H'Z=S2 "*04! g9)E '-* "#L *_43#'.'632'>54&#"#"&5>32&=[[2$B*--((6 :I Q#Q>[e^# 2-),7*+,!!$#AL *+3RgVh. .*27#"'47#5!#.'.#'67#"&26RfA =]DJ1 BQ*:'5 Nlx0:22 $%7 DT =>2654##".'32654'"&'5&'7632#"'6*<Qw -XB?e:( '4F4 \-J  &W*3I86'A> 29*CQEb|[&5&'#"&5#5!x-1!&7EE.<>Q-E'))3)"GBp22. <265.'%./32654&#"&=#5!!7|G&1*FQ $ );m410,?(,?F3Hp2$5 9*   1I#   ")'?T\P5/ ">'22A %5-d.J47#5!!327"'&47#"&'3>32#".54732654&'#"&~Hs  (82KT'% % ;s $%L $"K<8V. &M1#H F3F{7J22 McrMN @7. !7#)#D#;N9OeE G[C* S =,;#'&'&'.#'>75!5!378_PCUT,/F%C-/3>p+& &)~,2In*3 7(T2>),Y%2674'#"&4633254&#7#.''.#"#"&47.#632#"54>72>7!*"!%( 2a ]*":9$-fM\*.>N .K `U]#1S/*B'&.!*X78I'20:)i1(2oHI.( \8d03p8OG65!?J923!3267#"&54632#"&5#5!4.#"#"&547326-/L+m /1>U7JJ "i 2]% / m ;*2$k-#!69FR%;2 <23   *_E72>54'#".547>54'#53.5473!7>#5.!60&:7*>16$ ĭ  4; dV-7+_J0,N3,39:W-&80-E'(2&$!!A"3  3x2=#.'#"&'5#5!!>7#".52654R&-$F[ !N8;_5$ 3R4@RRF'22D"3r5H0Dby^$8ea;N+"I.!7"'#5!!267#"&54632)/Y!`!%) 2E>IOd22 f1'$//5[5..=3#'4&#"3&54632#"&54632R G^6O:>  /$4IWA+# d >285c.3)& & \BCW+$;D=.*.2#.'&'264&#"#"&546%!!B/I(kI6[5; !00H)1_A 1$0HJ$2>-Ol666N O6M2(Wn3$("6-+<^2 *3#&#'2654&#"#"&54>325+"`# WTzO`,(-%#*=22L'<' N2 :2h[.- %(%8 P.'#5!!>7'&54?CnCBq* '$!WA#+[m>E22"   ApvNNqf@'4'32?53#'./7"&'4632#"'FeN}6! }T3:^4;~.8*10 +H@]T&IB2"P:1O^1( 0 .2!5!#'.'#"&546/]W#*7&#*"4LbA 22LwB- #(+35?#p 3&#"2;#'&''764&#""&5632'5;4 "%!  DM2#G+   1?t $ 9  2-e .* i^~ r.84&#"'./7.'.'#5!!632#"&546323279, -4N+: )#,5J{,b Od/% C!)x(7*S~    22I+gH7X_H(0! ".%675!5!#'.'@]dwJ֗\ #<`9H2qk."22&9C/L'.(,2>7#.'&'32654'#"&546'!!$): nnV5W47 @8C*8NP>,?&6$8=!:./b2.%24.'&'#5!#'.'#"&54>?U9-6A #]U,'0-%$+wA9+\ ,:&226p,4#$. .'#5!#'.#'>N3#[\*WEJ:D1G/D!z~W%229Q%T+6.""&54>32675!5!#'.'@]eCb%%tX (A`4Jd1R$UB!22?K30.925!5!#'.#.'"&54632#"&54>3246H U?b2-".0#7 % )&;P(" D&+ 221%.++*1 ! )%O@&9 >*63#'4&#"#"&'#"&'67.+'32>32'5 CZ2C4&, #   L A2m2KK$'K 2.?` 5'/@#  3($%:dDu!. -&'5".'#5!#. '.#'>7&Y&+$hK6T("Y @Dp 0&2_z$O)B(22 #dX c. 825#6&#".'#5!#'5.'"#".'726760 @)B]    ',e2  ,6    ! )$_'?o 229! 3=3   @).-&/32654&#""&5>74'#5!#~BLeq7Dg,_*- 7''2%* $*+@0J 0D$.8*3!;  226e8 #"&54632#%](* .-20&/3674&#""&4>74&'#5  +,>0nm7@k~ *- 7'!/4."" 8",+>{D/.G3!; 4/ 232&'3#'4&+Q>"5ZX2@D.14ev824{1-'6767.#"3#'#53.4/oX4 /, /1DV r2Z^ t8?L= %  [)+2/2 -'23#'#53.#"32#>54#"&54B_ rr2UUa2fG5 {ET-;xL222cj!/2 $1(dN#a )>54.#"765.'#"&54>+*<W$#5)'%8  " dJ*D3 N-%  RK##"&54632'&#"367?,:!-E    )";r5)('0   rQ?.)n 0\+A#UKj2QN <%%'*1N_H.'.'?'?tn*J C5X 6)nsO5N;%5 5 j" j2QNT%:. ;&'467#"&547#5!:*E1%' $ 5"L_eF.>oF*> #1mry2 C <23#"&5<14>32#.547#53654/.5473;|)MS<8\/,?1= +A$iN-@; A D1 2]=LH#" /.>M6f2 &  ,+* 34&+5732&'3#'&'>7#"&547#5!@D1 . UU0Lg)@3)5"N^fF1-293U724avDCX")1td{2J N4&+576;2&'3#'23&#&54632#".'67#53654./&547@D1!7UU0kiWS ,|& m ("7+1F!  _ #A/* 1-295U3240G2<,Et 14>^Cn2   *,^.3#3#66FN3.2 4 :4&#"267>54/&/&'4632#"&'" 65 ###Qg%  } ZG': b/D    ))$,) )  e 4+ ?A^*" dO-.  $N4%.3#'#53654&+"&54732632 hh2RR -k^RcDH 262E+!#;". <4632#"&"'5#5!!>3#".'2>54'%(#0<1 2(1fL1R8,%0L/.4$S5* "":W22  *#g9Yt(>VQX8/NZ>. 6$!D. +4672#"&#"/#5!!3>7#"&54632{  1 A."Z/N $*$2(0#?!kAX>22 V1 'H%. -4632#"&'.+#'67&/&/&'#5!#,0<oF#' !~FC:Z #:'b: 5&"qV"$GQqU=C  #22oM26753#'&/&//&''&/?./>7'&##".'4>J1:)^6B&F-272rr n *'2>w$64G+P  ^+1R?P1"-%<2l :2;N%+'Hj  K.')!6Lk%#654#"632#"&54>3265654.'5+654.'"2#"&54632654&/.'47+-@@-" 4    #'7(:;. % #$2=04HV>2?ZQL,KjkKeB!4&$ #@   & !$L)$2@.  ?#->D',=12$ !) +Y@4j#6'#654&#"632#"&54>3265654.'467 )+k!A     "'7=JD #N( #$  ! !$K)! (#* w#:q#64&#"632#"&546326754.'467%#654&#"632#"&54>3265654.'467! +!("!   "%&8(:;.1 )+k!A     "'7=JD-   / $ H  %9L*$+2 #N( #$  ! !$K)! (#* 07 4&#"326%4632#".'&~-6Ij8-!$ /A.0G%.- >}"1!&/265&/.54632K?qC$ 1_G"Ec5 "0?'3?EP5&@*/(I+ $!" 0J%$%#".'32654&'#"&54632 )I.1H@>,M2`*E4'$3J:9s/?3$5Sd{U54.#"&'>7.54>2)7[( A&)+N!5'-+<,>(Z>6f C*33#H^E4U. Q(+ %+9&!* K9+6%R:5= G)/7& /& !F #074>7.'3.327#"&5467-%'/F^-=;&e )(?G112)6u^R+G-;"!K#@'FG 1M+'>j_ (4#.'32>54'"&/"&4632>p_$@(;e=, #0G*)<  @!$>! BFv!$:*Lgy[ *I=@/ !1')!,1*""+#A\!$"36=4/.#&=#"&/46322!N !0Pk28q1T-!!(A  DG"=gt7' 74.#"2657""&'"54632>72>7 ",) k  5)e[: 9& 9 & 9C dB   73FZ8.Kj73'654&#"#"&54>32Jj  <~NVs/" 1(! 3FUGDBFC"?&3*-!1 c) <>732>73#"&54322332654&"#"&54632#'#"@-"8bC8! !2TQ3L>  8/%0'0?!1'F-DbVe7Zh6FI2!    ')4J5'9 /'73#"54#632h &(&%9TG&7N-S(("+"=4#6232?>323#"=4">#%F   % $&O_OO&6HF&2! K 8S# 72>74#"'4>32#"&5|+:?!2 0 /(+< Z34S**H(! =V&9 )(=R733&+"467#"54632- '0   Eb  %-6  / /1"*4e  J'4$ %0! u2>y #"&54632732>7"& /'  5C "  ^; #"&54632aC1 "-%#"&54632&"32654#"&54632&"326541E21FF13D]4&'&7E21FF13D]4&'&v1ED23DE"##1ED23DE"##0%#"54674&'#"5474&'#53>733##5(19"< MV(262U8 e##8r2@AJ490g nR#+%:AS,9+ U D?3 9#t4###5##"54674&'#"5474&'#53>73!T@n@(19"< MV(262U8 e##8#AJ490g nR#+%:AS,9+ U D?3 9:5!26;#"/467&'###5354632#54&"!##&#":7%f! l=h?g9#N\@22K12J@!6!,)03C7 .f75_`BW2S*[7#9.1FH1$%,9*.B4:####&#"326;#"/467&'#5!54&"#5463235!2@R,)03C7 .f! l=h?g9#N !6!@K12J27%#*.B`BW2S*[79,$%2GG0.ߦ5_aD#0 D#0# #D#-3#"!##"&'.'#5362654'!!!> Ff 9'$_MQ# ++A>$#'CG:9? .BJTrL-<9Y8+*!3H0t#*&74632>5!5!##&'#"&7267.#"#_L1~@&@B&3L]E7Zs m#-7*>gA(q.2D.G9r#D*J0;`O-9Cu[=+.pfrK-1w'0!!2#&'#"&54632654&#!5#5!.#"32N,15L FIW>_YAs9@+# N)PSVt@3b7 !=D548F.39L!85##"&5#463!5!5!3254'!e_Vl83EbK8hweD-89@v @"*3#!"3!2#"'.547&5463!5!5!4+326%;5#"@2--2&,nh<$- :0*2@h^-1&43)/-%9ݕ+B2+D F./#0/;\9]@!%###5##67#&543235!5!2@@8` #!#:\89.5!3267#'#"&5463232654.#"#"/7&'#5!%RJP C<;8 KY.W;70 6#%z :z'3>.݋?L//"J*G <&&0/ !%@99$#!"3!#3263#"5"&547.5#5!5! )=9G7J? >`&ݚ0 9k9>2DM9a,5(7>;5!5!#&# 32>;#". );7T9/$X-+ 0%3# q9'[O4"399U ,#?[,F674635#5!#2#"&2654&""BBli9skktHx{99{xHLba%G)9KL8*F0%.#"3223265!5!##"54632654&#"#"54Sj)@qFl09x22D5hHS;=u327&'!5!#.'&#"327#". l>0)6&". 5$+-S;,?EzTuX?TVGO3Z99(aG$f$+#5O|Sd #M&23265!5!##"&'6732654&#"#"54l09'OhXQzTu?N<)uLFe>;;;h7K=gK>O3)(8-. %5!32'!5!'#5!##5#"&'654TbP_ 2@-CI'i(,T2299#\*Z4:][%#"&'#546;35!5!#!32>3j?gk 8(4nB4 AYu7,G9910 7327!'#5!##5#"&'64jTbP$$i 2@-CI'T?IFA99#z*Z4: $74675#5!##532654&'3?"&]o l^mM #Ir89sJ"MoDiEg99gChG@F;57o o65;H73273##5#"&'64'#53jTbP$r2@-CI'' V.T?I9#z*Z4:+9ReD$"&54;5!5!#!">274#"326@ulT=\vR\&V'E<%&; Y~v99F:>*4715 "&546;5!5!#326=#BR;0h 2VuA*1 Y2?99?Rpo5,~297467&'#5!##"32654&'.'327#"&!>2AS#Ɔ#RBkO20^K'M""N'K^.Nn ]00`3K8j99j6K5F`9F)&M89N%*E9`<29C7467&'#5!##"32654&'.'327#"&!>2"&462AS#Ɔ#RBkO20^K'M""N'K^.Nn ]00`)3K8j99j6K5F`9F)&M89N%*E9`< ##!"3!#3263#".'.546;5!5! F^J92BmH9QD2nݚ9;79"N791.;a9#!32#"&4"546?&'#5!##5# 9% H2@ R ,@'T(B99#z#:!3"546?&'#5!##5#9% H2@ R@'T(B99#z#:7325!5!##"&'&546;#"a\H~}2FV/,D54849l199%=:<6D9Tr7#5nrrr##53|@<99*#54&"3###5354632*@!6!<<@22K12J($%,9#9.1FH1###5354&"#5463232@<s1 SZkx  #"54632&#"#"5432.- X gmD%F>&V@%4".Zd< #&+"'3;2D4_08,<@F=7 "&5465337632#524&"3#]v ==\@  @rF9 I)o$"#4H2 &##"543532SW"H@WM -$4b2 3632#"&SW"H8fM ->'##5#"&'654'#53!535!322"&462@-CI'' V*rrTbP#\*Z4:][+9T]}53T4 Z )%5#"32!5!####"'&546;2"&46(%/+$LZ2@zZ=9B8a( //+99#}f=9L;F "##5##67#&543235!5!2"&462@@8` #!#:\89& /23265!5!##'#"'#'&543232654&#"#"54$K.@ )OIHH2!LD@,(3I6&N1]a W/990W0JI1L: $TZ% 2*)")/9$."&54;5!5!#!">274#"3262"&46@ulT=\vR\&V'E<%&; Y~v99F:>*471554&#"76yJ:Nur'3OLv72F5,d$wbA]x6*R9EC8Q-F:74&#"5632#'#"/"&5432654&#"#"#"54632326XS_k;Bdi$:Td( Euj?I 8r W4L[%7!4#EJQ98++?1F&("?)6%%/2>54&'52+"&547&54632654&"R=9-I]P8aC,Bb8P]I.8FhFIbI" +29QCN2)CAUW?C)2NDP93* ",12+&))72653#5#"&'654'32[@@&YMz"B3&$91`;HMDVFG:@%"&#"3!!"&547.54>7&546323"&#"2#"&#"32632d(.#:K9#5/.;'x\3r8)A& r"BX:0 *7%!#9B7G @'- >-;5;F5&$ $&1) (*( &54632#52>7654&#"r jQUqNn_T M87C "!!LZcO9 /V87FA5  ".5#463!!;uW$P9W|+JvT.2hdX9X9EbW3;%!3#".5#4633&54632&#"iU@Vu.\Q/H7QWkV 3C=5]4[lE9"9\dDN2HIeKM97>e#654&#"#&5462( 2 &@V@>0 & #((# >732767"   'B 5  0 ^%%26;#"/467&'#5!##&#"5!,! l=h?g9#N ,)03C7 .f~7%.`BW2S*[799*.B 5_D)16323##"&'.'#5!.#"!!>2654'! +l 9'$_MQ# uIGe z$#'+A>i[9? .BJTrL-<92OG:C3H0t8+*!+@IQ[#54#"&#"!##"'.'&'#53>32632".54632#"&=%!3>4'#326%4&"26@9uC+20H 1" RBD=1- `D*#Yi)F*@\;?X`B<"&@ !+6n'55B55B5O(c:X595g)7?I5*j_G19OxN0"s,&6HE9l :Wf);,c%0'('(8Y 327"&'5  => $' &/5M[L32>54.#"4632#"&!%$8H31C@88?- /25;,7@=E''X`l:EO32>73#"5##"&5463!654'&'#"54>3234>32654'"327!- %8||_<) . a,*8K<* !"#):UC"Q, !/FOcTC&.M30!c#2 (>pH7Es i$%9+j 0 J _jx5463!654'&'#"54>3234>7632#".54>3232>54&#"3273#"=##"&32654'"32>7!_<) . a,*8K<* '6:G)JzHA@) +C31C8')"! D8|| !"#):UC):*' Q&.M30!c#2 (>pH7Es N5$OF. 2   &$@(1%PEmOcT$%9+j 0 5%k-L r~254&'"7#"546;2#"&'#"5467&=4>32273#"54.#"632654.'.'32%32654&'&#">9E*2 6&uP>9=- +'??$a%TS:/-8JsF@gC205!5MP.-L6+ #`mCA20, =4,.@?e31 )a3[[G'A:>-#62?-""'Jt:Z7# -*9)6VS-.2CD4"(+30&kF7"<,)d/#f* F%4>7#"&%4>7#"&#"547!"#32632#"547!32632   0)7, y ' 7    & Ox9EBD  32!#!"54>7654&'w*(*1 5&t#A+5S. "9lKZ 3$=DO*I//7,$?= d $"0<+(7,.  +"0;9[> Yf%4#"32674&#"632#".54>326;+"32>1#"=463#"32>7#"5%4'"326#!"54>7654&'#"54>32v@( &d0. 5G*7H9/ *H,X#: N 5B;6((3 ( 3#=DP*I//D:t#A+5S. ":kKF! !!)(& 36-:F%/ +7.*'&#@+!@6 -$   ,!1:9[:,.c$"1;,(7,-53>54>3!+"3265#"&5463#"632#".32654#"2eCD C  "&&># N&BL:#5B*-C8O^A! & #/(/8$0@(A:DLV$2>**H6Y$57F%#".54>3!+"#"54>5467#"63232>54#"K8$6 #3X6D C $1,&.& '=#N "% C !!JX$2>);M@, %9#)y$/A(A 43 $#Y $ r74&"3267#"&54632632!"&#"32>323254.54?32#"'#"&543232>54&#"327#"=4&#"632B&&):M47AnU\<s0B (M*$ )8 -#kHKYR2DoH^"l&3P1%@1"9 -57>(= H*7&"8*/A?YANrJH#<:! u&; $54$:D:g.T42HbcpI*U;D` #J@60$36 }732654#"%32>54.#"632#"&54>32#".547372#"#"&54632325463.54632E'%I$!  % 1FuF.I>8 !W;9U7GY^VP=.WgPMO/;V3(@% *" /*$3  % ,'I<32#".547372#".54>3232>5467.546322>$.)'%&!&4I-OJ1,2' !W4A /,GY^VB6*@!gPMO/;V3(@% *" /*$3 I=?% , '# &,!Q=G^  "  +C'H! C732=#"%547#"".54>3543!"#32#"547>54&+BP=|!  $2M+  , yjN@?/ 2BL0:jW$Kt!t -)+ tM  tD<  88fR7#"5463!"#>3232654>7#!"54;>54&#"#"=47#"32612~ "7 y5# "'!  0*7+ "  P "$EB"+  0) 9%$=)Q }1"N3*8#% !: 4732=#"%547#"!+#".54>35463!"+BP=|!   2M+ $  y0:jW$Kt!tf -)%0t"+  t|43232654.#"#".54322>54&#"327#"=4.#"632#"&54>32632!"&#"3267632#"&4&#"326k)78%$A$+;5)A' "m5*7*,A1&! 5 1!!5H,5I89?(I/[= r&;"(MCB*$ %<2+= 9(?P!!&!#- ?L&"'2-  ,B)F] *!@ ' 36-8H[?)9.!JH%4. <9&; 1=`()&&>&"*Bix%4.#"3267#"&54>3#"632#".54>3!+"632#".'454763232>%32>54#" !' &>" N!"L:#5 #3X6DC .( #]i;W7/Nci2N{J0% D !"\"0 _& #/(/8 $/A(A 4%LV%2>);MA, '5#AlFiMBwW@!'73' S0  '%%)V | do732654&#"7#".5463263263!+"327#"5463#"".5467&#"#".547&#">32732654732654.E,,%#L>*< LRDVBU3AD C!@1o=N: 0'=E?nQA+> \7:/C6+G)&B%/7, 2A+$0  I7 "6LW2J8m&&"!#'(32T8V7=*0F<5m(EXk2J9xO*N3-9!e27hI]{9w,0:(O>1#!  X732=#"%547#"4.+#".54>35463!"#32#!"#"5463!2>BP=|!  /L2M+   yjGR3_@ %8%;# 0:jW$Kt!t +"f -)+ t#*  t_E1B1" #  W//".*  Q7267#"5463!"+>32+"#"546;2654&#"#"547#"  !7 y4#! !3U6 $9W\( #! 3 "$EB"+  1'279)#  V//?Q,6#D l!i Ta732654#"".5467&#">32#".5463263!+"32>5#"5463#"74'326E-+ C8y'; ,-187V0! G)&BN8+> BN4?D C 8@7o\%a@( 6I8X$+C>'{-"1=+-:DKW2J8n " & fU8EVhI|-,;%D%#!"&54>7;2654>7 00   S1"%)V |Q M !%2>54#"#4632#!"&54>731}@>?>aTeM0  '>U(\!FFf_z%)V |s'%#!"&'#&54>73274>7;2654>7r 0)".EQ33   S1"7MV O98 |Q 372>32#"5463!+"#"54>54>1#"R  )7k C %/* $*$3 3EB!+" $:" *x &A72325432632+"#"546;26=4#"#"54#"#".54 |L=#BP4 $9_JH!'?;7# S&h(';R+#  W/.ZTr0.((&\\G#! b8H%#".54>3232=4.'632#"=4&#">324&#"32>,--C0NZ/)5 ZD&)!8/./+D%G*!"="%, .D!DZ-Di=27*e7: KY`i@A#.>(- 4?'1  ++%O_%2632#"5463#"32632#"54#">32#".54>32>3!+"%4#"32>  #7 wJ  "8X-ZCG*!"-,#6';JC\''" C WG! % 3  "#EC\  "#FY-_>. 4$.C#$2>(6\;*:"*TY $ $_ W%2>54#".5#"&54>7;4632+;2+"#".5463232>2@#0  >?5H(+5%C2<> F$"*C*&;"  <1+9'=R#\{ $&%)V |!FF;J3>a4! %&%% '  *8*,(ET%4.#">32#".54>3232654>7#!"54>4#"32> ":$&7-%7&!"-,#6%9HG.H+ $  02#"F!+,7- -R5*# 4$.C"%2>(3Z<,*84,N7# Q }1" ,K9Y +* #")"5463232543!2#"5##"54#"#325"$7;?z|z| wz;?;G[\&()؂h6h%[\;74#"32>">54&+#"'67>7#"54>54.#">32#".54>323>7.54>32'3254.'&F!+, >+ $ 3m6*fN%%5$3## ":$&7-%7&!"++#8'Dg:.H+ '+ D@$, #7.<1M.Y +* #=( 3N "0<(   >-  >GX2#"=4#"#"54.#">32#".54>3263232=4&'64&#"32>9,9 ### *C% G)!"L?-C #3X7[*)JG2ZE';%!%! $ TO`i <'%'%7 #/>(- 5$KWDY/4>54.#">32#".54>323265432632#!"#"5463!2>=4#"#"54#"+"G!+ J## ":$&7-%8&!"M:#7%Bh=.H+ #  |K?#CO3 $9a2D$H '?<"/3Y** $g -K.,7.-S5+" 4$IZ%2>) *\P3)94+M8$ h)';S+ #KW/01;(s0.)(&\[! /72#"5463!+"32632#"54>3#"326| "7k C  #8  S !$EB ,!  !$EB & j}&"#&5463232632#"54.1E!+R$hE^3  "8!.)+)/%+;d$H[? "#Eq7T0 "%3254&#"&54>32#"&54c33#S1E+ D*=4X5$"+4#<.!' A  F2('e&.&*m354'#"&=4'!2>3!2# * 7 !$&u  Mu @ P9?'232>54.#"32+"&=#26;632#".547354+).U9>N>*,;/Kg7* @c9$ K`FKT&& )?nFHn=& [DMu%%'+B\V0Z`/H% V& A%2654&#"4.#".54632#".546323267#"5L###:TH%JJ/+Q6!G37Q(P7Dk< .T6 Q@ :F4.#"3262#"&54>32#"&5467.5462654&#""#%C,+aP~(?RM'ZF)*7I N|.Q3!G=##" &;23+F 9'LZ™N|K2RL*= N:,@ s.b]BM*;:20-<+31<"[h732>54.#"7#".54>32632#"54>54&#"#".5467&#">324&#"326E % ")-$7(HpBHQ8M4Q1 C; !"hJ#.nPA$6--96.D6+G) " F7/'+ #%$+B$$0<)4`L.$#*73A~0#0I*QfFXk#1<*'v+*N3- 4 Ihw4"G6Zd';@&A;'4@ ".54632x!, > * %$&#/(%$ *  "&54632%32>54.#"632#"&54632#".547372#"#"&=43235432+"=4#"3265463.5463232654#"54#"  ? )2FuF.I>8 !W;9U7HX̄%YmW;$5./ S":6*$/2mkM>=H>= __=_ +JYH? -"%I 8  ''/!4$8C9&*R6>Q<.WfQt)?mF1J#*# I$3  % :KQ;B4A>24A+C..3(5')('Q=G^T&'1 S!$..$((N^%2632#"54#">32#".54>32>3!+"32632#"5463#"'4#"32>  "6Z-ZCG*!"-,#6'Dg:[''" C   #7wJG! % 3  ""EY-_>. 4$.C"$1>(.^M1;!*  ""DR]TY $ $  3"&54632"2654euuibtw$|MMzMf^|h]tQJuvJU$$0%#!"54>7.54>327>54&#" ]3! ,;)M3/K* !:lJ;CPJ.5F9+     DCCF-"0<,(6,-5RF;__H?\YI7#"5463!"#>3232!"54;>54&#"#"=47#"32612~ "7 y5# "'! s*7+ "  P "$EB"+  0) 9%$=)%N3*8#% !$-73".54>3543!"#326=467+547#"32=#">W)%, y 8 0= hP=| 42&0tM&te 0#ft!t~0:jW$Z%.#"3267#"&54>3#"32632#"5463!+"632#".=476322>9% !& )7C 0& ",Ը\Z/W 7fTNwD* \?5_&  #/(/8 & 3EB!+  ' =*AmHiMmW'?#"=463#"32>7#"=47##".54>35463!"+K hP=|  & 5B;6l>W)$  yt!t~0:jW$K& #@+  @f42%1t"+'t5`k 3D7327!3273#"5#"&5463!.5463234>3654.#">:UC"Q %8aM[?$?@- "7819(7K5 0 ,!/FNdTC&!KI_)@lG2Js d+ VAD:C68! Wa732=#"%547#""54>54.#"632#".5467##".54>35463!"+32'4#"32BP=|   ." (+'1"* |>W)$  y!1 5)#0:jW$Kt!t4!./ 7'.#'4,7/>f42%1t"+'t&&6" O5*4"5463232543232=4&/.5432#"'#"54#""$7;?'!H21%#26E=L| ;G[\&().0s:]&) "pM')h%?%262#"54#"#"&54232543263!+"32632#"5463#"N $"6?;7$" |E8" C $"7wJ3 :E\\G:&h+%!* :DRZjBIS\f%4.+#"&54>;5##".54>35463!"+!+32+"#"546;26%32=#"'547#"32=#" $-mE5  >W)$  yL?*0 @. "4,0#I{ hP=| 6"%54.#">32#".546323F& -+ y3&,&":$3C27&'A++,> r.H* B&Y  H7g !)Y7,7-*^A+";C.C"4L8b*84Ou/AJU%47>7&546323#"54>54.#"632#"'#!"&54673!2654#"4#"326s)ZD?6'." !+'22eM0 8 T+<}@)'!C 9cJ\E4!//1-#'3-:%4 z%)V |zA\5+!8%4.#">32#".54>323265463!"+>32!#".=4>$323273#"=4$! !32654&#"#"547#"+"54>4#"326D":$3C27&'A-,+> 7TZ'.H* A' y4# !(afqG%ga&4,( &+! 02%-%F& -+ ,7-*^A+";C.C"4M7@i>"*84Rq5"+'1' 9'+HzQ7+#"54;5#"54#"32=#"V"$7;? p   0zY_x$| *|!;G[\(Q |0#>)?zSL h%BG4 it74#"3264#">32#".54632>;+"3>3232=467+"54>54.#"632#"&'##"&%4#"32G& + ZHH)%B-,+= s[ ('2 JRd1@6>!." (+'3(&R  )"Y  *,7H4Yo[.;C.C"3L7b;!]@IJ.S2 3"// 7'.#'4,A&G =5*;%3254.+#"'67>7#"54>54.#*#".5467&#".54632#".54632632367.54>32">54&4'3262654&#"M.e6*fN%$6++3&,&":$  k++,> 5/v!PG0+Q6!G37Q(P7Dk<VD(   Xg !)Y7,7-^.C"4L86n'y*Fi85fcCM+;9@J64@hv>?J"*84OuH+[3*? !1&00&@( 4M /*0<֎b'c@d77+/:+31<%.#"3267#"&54>3#"32632#"5463!+"632#".=4>7&546323#"54>54.#"632#"'2>4#"3269% !& )7C 0& ",Ը\Z/0WeLZD?6'." !+'22wfTNwD* )\?5_&  #/(/8 & 3EB!+  ' =*AmHNvWI7  9cJ\E4!//1-#'3-:XmW'7&546323#"54>54.#"632#"'3"+>32+"#"546;2654&#"#"547#"4#"326 "7)ZD?6'." !+'22y4# !(2aC $9V]( &+!s)3 "$EB"+C 9cJ\E4!//1-#'3-:&2'1' 9'&CA&#KV//?Q,6 ' D l"&5+!MH 2#"&5462654&#"HaaHIac`BC/0CHdddFIaC/0AA0/8 )2#"&5462#"&546&264&"2654&#"%./$#0/$%./$#0/""0F0/$#00F0/$#0$$L@K_%#"&467&#"#4&+#".547&#".54>32632632326542654&+53264&'TC6HWI#Q(ITQ4A;LN53J ^TX'!151T6G)4Hv.3^_f"E4J?W/~K|S!=6rF-VI,RRE9$NX65& $"-82 k83\L`R]r"'732654&'#"&5467&#"#4&+#"&547&#".54632632632'2654'$4&'32654+532D4 *Y8-SD7GXH#Q&KTQ4A;LN5MP^1H#'!15v`F(7Ew-3[z@WY'(;N.i,01 **S-`5\40^taCAe D((4J ?>"E4JyLH,DA"=6rFpRRrSwX780G8(J82 k7..'D"L`;E3!!"&5463!2>54&#"#54&#"632"&54632632#!"6264&#"Z;5:6t+>M?&2TI54Z "78x0CcyNqkL3$68;B:;J!!$#cbcz*I0-<+eor9M56JR"5<61#!2H`&d7OJ-8CV#"'3 5#"&54632#"&547&546322654&#"%3254&#"2>54.#"U9,:&,eK )9?8A3FLxx8\`4wwND3A% <%'LJ./G=?cJ1I=E6.>.4>R/6EnF%_+>LJ])GmE5 44XT8X36 ,+/%- R)4=7462632#".5467&#"#4&#"#"&2>54' 2654'R=BloPE0E<.00+S*0/.>F2354>32'654.#"33#"&5#5654&#"&54>26=#Df${1OR*e2y%<=46*S?3AOH<+)E.VN@PX%4>32#"/32654&+532654.#"33"&5#5654&#"&54>32326=#"5FC!g~H,0FA !-.!$ C."A@'SChWH<+)E:JL>&hNJ5A%#"/32654&+532654&#"632#"&54>322654&#"$,T.1 !-(/(( X3"?F0,@7<:-=O$8MH'S '$!/+ =(<> <"'!;(%*9)[BGT780xP<_9$Pn0" 4',-&N&kDN'@kJ,4?H232#"/32654&##"'#"&546;4>4.#"3265#32=#"#7  C@GA,-&";C @+S& >?IOY$ ;~0%2- ()=$">!c,9*L8:K/: ;"IK0PPU;G2=?(:5Z0I-/Ng G$A`UM)52!3!5>54&#"632#"&54>"32654&5_VSH+2 hB 5*&-8:?;.?F-IKF/+ '%wjgXHV2Vb(Q7HV78.jOMr;',-&/#"2M+"#".547326=462'>54&%;]@5M'{60F?%8f[ =-%4 DKYKLT.IG$D XIKi;HSV`yV:LD6?/DhLG&/%4632!!3!5#5654&#"&5463237"!5.v`SJ9'#;,;`;@b%wCU#=[nH,H16:>9!2RYMSO4(RI7XeL+=H%#"/3254&+532654&#"#4&#"632#"&54>326322654&#"")#65' .^A*'$8-=,-BSO0YV -:?8;C>F/MS,n-1gEd!*% .8J7 :P"0,2$)*$,(6hbGWdVkNLr;OMHt1#"0'-RJ233!532654&#"#&54N7Sr/4(#%* , (SCB.H"C'(624H.823&54632"&547&#"!532654&"#&542654'vR2JJT]4632632+"32$32"&547'#"&546;2654&"#54&#"62#"&3264&"$3254#"NrUT:!HIk+W<31 8>223T; 0 a08[_AC9D6RA75$2/+,*3&N**,FN55P>./*t7 "/0Z3+*FJ-0203Vg&-& /$":5$&!34LGR"'#"&=4&#"#".5467&#"&546326323265332654&'2>54'X*: j:.S>b=<'mNG/E;-/SX^!kojA2,NQQ@$(;S8"=K>6E"-We2AE1`LL^Pa:Q[Bu@O&Am$ tQ<MafH\P@. D<6lCFf26mJQm-MMRCMW>32632'654&#"#"&5467&#"#4&#"632#"&546322654'%"264&29 5+8Du6'0Wh]m]76Z9/*'LSO0YV ,:<=8A?Jl'V$:Wf8*-->$&s$ b->=ErX [|_]X_32&#"36SI&;8Ha60N.4a>G&;9E6h:Q%$H,*?H &,(H2)=G8--$M 64632#"'32654&#"Mwec_a`dFGa_IHbqƉʁGgbGFf^M8"&=4&#".546323265332654&'7"'@h5!2Uo*: vA01G),=S5!2Z>1)8 v:4 bTVI5cW>e@D0hLLM>I2#"'#"&=4&#".54632326533265#"&546"2654&?E/V7bD6UBh5!54&#"#4&#"#4&#"632#"&5463263262654&#"M >++35T2&4SA)*:SO0YV ,?.FI0AIno-/Yj.*.,-+{l7D=n@`W-#2C%",(6hbGN~EmOOMHJm)(),(+,'L *374632632'654.#""&5467&#"&2654'LZ:81@yC72V(\? /@^nY<,"#Fe^!kF;WekbCl!Cp6bF 'p@`\Y^>m#yQ~?M>BmJQm>M4632!33"!54.FvQ$F?&qT;W$./\b2X9jlSKι1J&M-%#"/2654&+532654&#"&54>32((bQ %`8?;,*=5<467"(/<9Z\8!6V7*"!7,. 3.]?Kd oO<`:'Q/?M'#"'#"&54673265332654&'`eO'2'654&#"#4&#".546326%^gKC"_H?&4R=&>Kp)7m[,N ,Œ\H| >Je-#78gE3AE0`*!KJ 2!3!5654&#"&54>Ka&8TH50-F4E$98)cx,H -M*:323546"!54&$F>&GH=+*F4E9K*Fg%wj>P#^1W7-O3454.#"#4&#"632#"&54632>32"32654&UHn/3 6%(:RH.XV ,<575>;Jj\CK)4M'**#%HHy@42+#,(6iaHYhQmPuP#+*CC:(,*)0!"4M@%372#"/32>54&'.54632654&#"&54>32#"&#"M;+8QQMI E6+6<*34*c@F65!* /?7`f-& =$'1&$=/ "/ 5/^@54.#""327.54.!]fK%Xs8-5Af=(UGJ,@TAT>150$769*.0`A&3B#"~WnBN{h &9IBRpVVlBLe;!?7^49j/R7"DF,~6,-M 2#"&547&#"&5462654'&aW49Qo"(KYWqt@+;fĄ|lbUI]}Xo@HcpB<+Tc2L2'>54&#".54֬~QG(/ ^<=_ 5,BGsqK(H5USWS;I!uHrM74>32!!3!"!54.M+95SSlwG0>*A7C645M%02#"'732654'"&5473&546>54&#"u=UJQ >5c%3!crK$"B>,P"@:-$2W:8\*4F$qNP4"-;<[@JQDM),7.2ML233!5654&#".546!]SSvk_AEQ6/(8urjg[HMcTXf>@^ BD0aM+64632#"&547&#"#"&546732652654&'[oX&PK/N=;Sx(/-IcCApMB%4 R-'<&%!k6^d2K\73!5654&#"&54>3235"&5463273"54EpH=+*F4E9K*Fg%A^M+:Af5=.EH-O34H5%4.'7#"&=4&"#4&#"&54632632326 4%-< YUCfCT54&#"!5>54&".546323&546Y ?,-4b@AbH=@ );TA5!$eCFd&Ntq;C8(W6UWWHJd <-+392G!L(MOQ,HkozHb|Z)2#"574"#"546323267676L " !/*  9)Z&+$>\j;0qG\{1M2#"&'332654&#"#46Lf#H0>X3)3A=1 '[ƒf#IJ/^B(54'.5473#".54622654&"&2./!'Q954'.5473#".546322654&#"   5&2./!'Q94&#"327:dG5'1W!4739*-8:?7A@J-HN"%#%(!%0qQ,BAAx5R,)V;HY64OrPGm;<72!#0L$092#"&547&#"327&54632#"&5462654&'">44Ee:"#<*IMMI+=%"8cErxw *** A8.)).+$su+,.&,8@\]( ,p/).L.'&<X&<&FXX2654'3#"&5473k4*Z39QL-)' F@A; 8&L12#".5332>54&#"#54&#"#&=46326Ioi=?' 5;2H%S0!-T3"'F d>S+8gk{ 5$* '>? VX&"h?0OE *XbIKOK0;FZ{#"'3265#"&54632#".547&546322654&#"%3254&#"2>54.#"'4632632'654&#"#54#"&U7?:'4gNx)9?8A3FLxx9YV)PyC) xxND3A # =%'LJ./I<;[71I=:31!/08O5(9.=)>GE/R>'4-EX>R/6EmG)_*>*$`+GmE753WS7W36 ,+-!- h&'.&WL'Im:FP"&54632632#72654'#"&5467&#"#4.#"%32>54'2654'FPkYCCeMxFPm^FOZE/37NA$b'RS+"-.=!:%" .J]2,eV, sLiQR_GwXT{;iGr& (-WDK:;` n+#5/&pA;9%212$6AO-jTGq/S` C2654&#"!254&#"'4&#"632#"&54632632#"&46327.#"#-"(R !#L2+-1M#" *-'*((~e#+2+6&IBBI&6+2+#144?H"&54632632#72654'#"&5467&#"#54&#"732654'2654'wF)D6,"!37 #*.-"- %#*)6  22+9&5R)*( ;,&8-!:$;%"@#) ,? *%4B'5)#9I.k7463!#!"32654'3#"&IKHR10+1*+/"? SI4^Cs&+P+0GJ54#.HjdFg$";#"&54>;54632"!54&,8!N|L\vAW*N# )8+$ MWr\K<ݲDnN23!5654.#".54pSl >+IUm8Q‚cbY"Ob65WLxA"wEkJ,2!!5654&#"#4&#".54>326*QjNNH?%4S;(>K1#)7']AY97Ì]mK""@}Jf-$69gE-=6AE08gLLKJ)2#"&5".5463532654&#~7dT2&Y>;cGs 0 >]i:S49nR48^;4aFC>iG-(+ ~Fi[5Ra!J?OB74>3 #654.#"3254.'ᒆ&#".54632#"&J&J~Q1 D #6Z9Di>9vN! 0)>#Ka$)d$K:=VꌙNyH .-6|.ZaJ/=h{DM](1h% qLMR !JDf9'\oQB2%#"/32>54#"#4#"#4#"&5432626325sJL3/A:R*[@:D'TI#X3(%)EHGk9;ek=( ^"#XLXE@8=NB$/"&54>32"/32>54&#"62'32654&"Td9\j6|;n5 1H3P/fUn1\fA%$,0DBzTAg> 5pmED/N]1icSCN~T&@9$%1(QB(233#"/32>5!654&#"&546/atUTt)Z )E5 .iQEFYk|Á^}GCkL"< 0"6CcaEoJBdQk)02#".="#4&#"&54>3263534#322H% 4", QG/"e^ gN7B'.<5kk'D3QQ)"DC)"8434#.}?Q7eMFFPOB633265332654.'7#"'#"'#"/32>58TF:%4S;(>K1#)7']AY98Q;.t)Z )E5 .CV-$>69gE-=6AE08gLLK'%kL"< 0"JB2%#"/32>54&#"#4&#".54>32632DWL3/ACe878;S;(>K1#)7']AY91DWJbp9326323.54632+74&#"326TC6HWI#Q(IS;(>K1#)7']AX=2Z:an)T9:HsQc,&%3.&'/+E9$NX656Xsbc D*&69gE-=6AE08gLOK<4.*.3!!">32#"&2654&#"< 8&B/E/$#+..*Jp#&&11R2* !'." 6I)"%'L[ K72654&#"%2654&'#"&547&#"632#"&54>32654&#"'>32.,-+Z-k7Z-/U46Tx%Fy ,?.FI0AI:\l6`:0$3!H027 /)(),(+,'=J4[Vf2@ZqBl^VH_y]GN~EmOBkB#$"-&%,83!Lf[ NY72654&#"#4&#"632#"&54632>32654&#"'>32#"&547&#"2654&'.,-+NSO0YV ,?.FI0AInj-":+&20$3!H027 -/U46Tx%3':-k7/)(),(+,',(6hbGN~EmOG%" "-&%,83!qBl^VH_-=J4[Vf2@M`,623##"&546;.#"#4&#".54632632=#""Ip |x@20AMAP4+2S,#?Uu7OmUg&&V%C*@qH+3`SS57R0W*&0@jGoS!C]HH$,*Mq\T_k#"&547&#"#4&#"#4&#"632#"&54>32632632654&#"'>322654'2654&#"-0-.3Os>+6>CK3DE$UC5]\2:\1. 6 4 L.*D  A28)>.% ' !'&#x98S+LCl#)>8'!,(6hbGT91SmQ<`<(OMJL+%'#/2: @Kg322>54'-0F19DsG#:S('BRu6PjXg&0V@.4 3!J.27k ) 8)>%#x9.YEY8n#)(GlDoT+vEYJJ"(&$-51)h4:h;"n7$BN\,72#"&547&#".547632654&#"'>2654&'w+B*\[64Op/T`_%3??f;/8 3N(4e2\2:'7TvmeTJ]|Nt:?@+cJK*&'.$?G'bSd98L\YALV#"&547&#"#".5467&#".54632632654&#"'>32254&' 2654'03 9'5Mj3q3'kQH.C;--RY1-!47pi>58\v>9!5S(+AnL!!"61\0R*;z'y>53KAyg6[xLr@Q(>n" tQ7326=4>32654&#"'>322654&'-/U46Tx%2F0eCU[ =-%4 A8(A&H3O70$3!H027 <-k7qBl^VH_]a1FdEN9%@;#""-&%,83!=J4[Vf2@JbZ>IQW`%2#"&547##"'#"&54>;4>32>54&#"'>322654&+'4.#"265#'32=#"JAKF=@ I6R' B:J2'$ ;(+? , D15$4H,+H )8 J-+12 ~0$2-]7/å$">!cP.6T^726bNPPT54&'(_B;;+;8%8V6  #Y>FEBP/5nu13ImyR(=2DH)Tt/C5 &E6~ )*4@ ( , g4W"">"#44#. eOcyi`>.<91#1/%&/ dO]EW .&'4''4(aA 'AI#"&4632"3264&$"&46232654&#"7632#"&547>7"264a/()..)(( !! "".R..RjFpxVs>@hvpV=0]<7*G^>"">"F44F4'4''4'kF44F4JgcL`y_wdrFC8sc5 C)O]K'4''4()%42#"&54>32.#"#"&54632&#"326ڔ{tB>W7QM7SXa{x} yxWI 4BL)*hQ3,bw(-' (`l4632#"&5467.#"53%32654232654&+54632#"&'#"&546;.#"#"&54632#"%32>54&#"G1FO0HqS02,2$P7=YY=8PW=fM;(+,,5cK5KK5LcfEO)" +!:Wf7'732>7&/7>32#"&'#"./#".54>3227&#"632654.#"27&#"ZM&  +.1J DQJ>  "!: /">JdYDc.&YA-:"#"%+:-AY&.dCYdB+85,((,3:1nf4*H,'7)&% 93?4 '   e4?l^SR`0,   ,0`RS^;T,,TX29 %&)7',H*4BT,,)+({' (}<E"4;.#"#"&54632#"32654'#"&547#"&5467%&'323 )" +!;Vf/'/F+2"8B8b+8#2]BR:'4dW\f&E6`[ A,%+54&#"#"547>32#"&'#"&546$"264\C46 ."**"1:DFՖGzl>J<54.#"#"54?'&547632#"&'#"&546$"2647.#"632 \C46 ."**"1:Df<)< -6֓DymAJ<7&#"#"&54632632#"'732654&#"n6I0@C',AY/P602;b;81SH 9 "1R16!!A.2Sp 4$03w1K3 !(4(Nf*@5rXKl1)Z .TYh(>#*# .?6-cy,OI+ _>u(?G"#"547632#&#"'>7>54&#"&54632#"&5462>54&"264Bb f*R:*&/F.ySRz4)!"(("DMVn22X ^܏Hxm># + 21 CPPCk5 +*@*VbbKIz**(4#"32654&#">32#"432654&#"#"&5463 WuyS,@- )3^ta XtySc4*8QA]u`aNi7)!+ -,Q+1ojaNiD,Looj( ]32>54&#""4;.#"#"&54632#"327546232654&+54632#"'754&"#"&5467P!-(< )" +!;Pf32#"&'#"&5467#"&54632#"32654232>54&3.#"6#264&#"[L. 2Q*P65KK5Cl3) )N4FkFՖGzl>J<O"32>54&#">32#"432654&#"#".54>32'"#"&547>7&,^0AJ%-$;V58N!` Wt]D?g*7j4=. ,5FP vIb^Ha) !+ 7U]3SxGjaJmL= C,Ve )G.(3P4<#`?d '  :{2<e(="#"547632#".5467#"4;.#"#"&54632#"32654&Fb fŏ.^a>/'K )" +!;Pf54'#"&5476#327&'2654&#"" (/y.^a>eFO)" +!;PfC|"S   ](BHT2#".546;.#"#"&54632#"2>54&+47>7"63&=732654&"+0-7y.^a>eFO)" +!;PfO? *&C())(cz"#"547>32#"&'#"&'#"&'#".#"#"54>7.#"#"&54632632#"32654232>54&32654232654&#"%&#"632>L. 2Q+O75KK57Q 9-1SH 9 #1T1 .!!A.5V~i PoN:=YY=7J,!7I0@C',AYqYdʕCKHyaB9 >FՖGzl>J<32.#"#"&547632%"327#"&547#"&'#"&'#"&/"#"=&546326!2&]B',AYHO0B5tK(SoL(&r%>32.#"#"&547%"#"&547>7&#"&547#"&'#"&54>32"32>54&#">32&#"32V<8-&:Oz&6 tFk* * ".@C48Lr dV *5Aa0AJ%-Tf^0AT,1DfG9VRg0B5hJ9 '  :{1=e&&=K;  ?,b\bGN[bL*>Q9;%]BWOa) !+ Sv:oLS%2"&54>32#"!2>54&+567>7"6&!$$BQ9O)" %NP+0-7 );Pf>W9UW/X=f1lM$Fp())*&0+8@/|'.6$/ T4_mm_+3O/:]BP:} 5(:ON0Oy>O? (-"#"547632#"&54632#"'.#"32654&Fb fŏ{|Y>l b8PopX ^܏֧x\<5 06xTZju(};&'32#"&54632#"3265423254'#"&547#"&/F+2"7K5P_|Y PoP9=YY=^.%21J#;<#'5K SC3C&.32#"&'#"&5467#"4;.#"#"&54632#"32654232>54&[L. 2Q*P65KK5If/'K )" +!;PfFՖGzl>J<32#"&'#"&'#".#"#"54767&546326732654&#"3254.#"Y&"u ;(.2!%-@8?\aZTQ$>?/D>- TEY%`AB8/= :*6W>55A"! U]lgMBځ-&$.-%$/,+= -/R-%/%* [I cC{!'8!+=5*$-5,uXmOMp0K.9wREeI::A0Sg,>>, ;9Lp*eDI+3H=)3I>>;T}'+<Y)<KP"#"547>32#"&'#"&54>32#"32654232>54&"#"&=3.67#[L. 1Q+O75KK5Kc1#@Qf32#"&'#"&54632#"32654232>54&[L. 2Q*P65KK5P_|Y PoO:=YY=)?$B9 >FՖGzl>J<[H6 6H/O^4q C32654&#"7632#"&'732767&#"#"&54632632#"'732654&#"O0LeUyZA6 JgoH,  E6!!A.2Sp>/% 06wMOq=?=B]jK\p@:l>#*# .?6-cy;gM `=u(/A"327#"&547#"&54>32&>32.#"#"&547/DhI8UH   * "-AD49Ru(dIBS*i<;8,&;F^S54&+4>32"&546;.#"#"&54632#"%32>54&#"?9UW/X=f()+-,6jAO)" +!:Wf54&#"&54632#"&546232>54&"264Bbf4\<'9&-&ySRz4)!"(("DM&-&Jp822X^ÌKsC2%'CPPCl5 +*@*Vbb/ `V**(I"4;&#"#"&54632"32>54&#">32#"432654&#"#".54673 614&4GJcoK#=6- "!/]t` WtxSc4*8Y<@*6-bdM'9`U]F13 '!+ ) L#6ojaNiD,Qj'M45\(<D"#"547632#"&5463232654'"&4632#"&'32654&"264Fb fŏ|A? \C46 *D**"1:D32#"'754&"#"&5467632654'"&4632#"&'327546232>54&#"#""264H0>]1*P68()8)(8Q^A9\C46 *D**"1:D*-!$$!-*fF|)Ij;( ,,@,C.1HiKR{A`*11*/O^4B9W , ,(3?%2654&+54632#"&'#"&54632#"32654232>54&#" 8PW=fM;(+,,5cK5KK5P_|Y PoO:=YYP!-(<[I5:OA^M6" T3RzJ<[H6 6H .P !32654&#"7632#"&547>7:bNpxVb,'hvpZ43'+x KpcL`v y_wduG3bb7*.EE(02+32654&#"326542#"&54632#"&'#"4;T t3$'5{TȤ}ڔlA1-@u 3'4<*@Fx܁i yӔWR3IB/(5 "&5476 #"&546;.#"#"&54632#"32654a h&ŏydGO)" +!;Pf=X/WV9dkՖm_Ge+8#2]BO:(5 u(:D#"32654&#">32#"&54632654&#"#"&5463&#"32 WuyS,@-  &^t&2E1.!ySc4*8QA]u`z/(8&RaNi7)!+ "A5$ o9'/@"3NiD,Looj~$4%+(}IRZ%#"5432654'#54632"&546;.#"#"&54632#"2>54&''3254&#""3254ꗘ>!`N:)+-,6dGO)" +!54&#"3 )" +!;Pf=XQ8=YY=8PW=fM;(+,,5cK5KK5Kd/(.P!-(<b+8#2]BO:5IH6 6HI5:OA^M6! T3RzJ<54&#">32#"432654&#"s*8YOraM4 3'5AHelN#=6- ""/]t` WtxSc3 C,QjdJ[b e ' ,A]B_@62 '!+ '"J%6ojaNi(I""'.#"63!.#"&'326542#"&546754632>32!"327632()>  >(4A'+9!+@#_3x}ڔD:N='CD'8Gg,# {T. 0''0Y?;R$!c>dwi yxO"Gg)"")g<VuQ(}.72#"&54632>32#"432654&#""=4&#" `uZQ1A@1QZu` UjK:7MN7:KjoiG::GiohCcL7W W7LcChL;'#"'32654&6, '-+8UoM%#"#פ*B+!4632#"&5332654&#"G1FOOF1G,4004,-;<-!hJKh!V?x#532327#"&54>ű JD3 (C=O+,b 9U 7eE/`V?x#7+"4?#53232327#"&546S())L iF1 (C;QV WY |e2F 7W=57"432654."32#"&5462 $:EbxbE9$ ;LޝL)-==-)W-W*#"'.#"#"&4632#"'&#"32>3253( [73{}7.44."0  6%''%)`Kc+2X 2<:::P:" /->-$,$.(+!4632#"&5467.#"53G1FO0HqS02,2$-;[0'@LHa! X&5(3<"&54>32#"&54632#"'.#"3 7.#"'"264&/P/"50OsR|Flc+ (]x[eFW"">"!##44#- dMDh1hzjZ TdlM_DV .&'4''4'(&;'&(!'('(:-6js4632 #"'#"&5332654&#"32654&"&54>32#"&54632#"'.#"3 7.#"'"264&\G1- ( %  & +,3OF1G,4004,8./P/"50OsR|Flc+ (]x[eFW"">"!-; j  Bm[<-!hJKh!*B2#44#- dMDh1hzjZ TdlM_DV .&'4''4'(' ?+34632#"&5332654&#"632#"&54732654&#"G1FOOF1G+4004*&*+754&#"632#"&54732654&#"+-0g1G1FOOF1G,6O04*&*+ -;<-%*  Kh1*S;3+#,(9 (QqV$263232>7632#".#"#"&#"#"&"#"&#"#"&#"#"'&546232>3232>323263232632' " C /1 &-) ! ( . # +) ,'  '$*,54  //*w7ZY0h--  % 985lg5:2#4&##467.'>ZwSP7^8&B  O(0-1r`OSNB<  '-  6F.+7%#!5354>54&#"#"&54632326534&#"326#5$$#!##=7>C##BTL-+B!,',.- .EF,%32&%o%%%%.7C463263232653#!5354>54&#"#4&#"#"&74&#"326.I%!+;ET#3%!##a:8'&A/-.%=-+B!, ',.- %%%%:#-34.54632#4&#"4>32#"'4&"26sV]tSF?DO#- '!'J  Cf4L-Qhtc[}Px=)/0#),%%%%:.84632632#4#"#4&#"4632#"'#4.74&"26:L76!>6=S8!#)8 36&!'O   TSh22`O|i%%S*.8P0#)Ad4N%%%%.=IR46326323#.'#"&46754>54&#"#4&#"#"&74&#"32632=.I%!+9*[SS %9$K404,%*!##a !:8'&@0-.86 0<(jRFR> +B!, =',.- %%%%01S&a462#7#"&74&"26#V6O#`   .2-PZ+-%%%%  *2#4&'#"&5463254.#"'>4&"26XwT.!!#)"A6))g=jO  aNv$ 0-"-B,)< X9C%%%%..(/;2#"=#5#"&4632>754&#"'>254'%4&#"326Zw,414Jq0O#$*,6[*KAn@r1!A`O =)(GRj->/2-57qAOY 5G)0G S1&&%%.2*6A%#!5354>54&#"#"&54626=3%4&#"32654'326#3$$#!##=n@#T./]#BDL-+B!,',.- .E7'Z>9 w%%%%\P-%.27BN46326326=3#!5354>54&#"#4&#"#"&54'3264&#"326.I%!*5$T./]#3%  !##T#GE:8'&8%]?8 v-+B!,  ',.-["N/%e%%%%.;BL23#4&'#"&546754&#"632#"&=467.'>32=4&"26ZwG*SR6  - .2-'-  6FY01S j%%%%.'`W.:FQ2#&'#"&546326534&#"#"&546325467.'>4&#"326&#"326&[wT"3 @$3A=843)P7_:X% )#).3*2NB>; /?1-#-  5G5%%%%!&.?KV2#'#4'#"&5463265374&#"#"&546325467.'>4&#"326&#"326&[wK3+% 4)51-*+$*P7_:X% ; /?1-", 5G5%%%%!%  &\[.=<H%632#4&#"#54>54&#"#4&#"#"&54632632'4&#"326HK;"4P'&!T !##I%!*.8s4 @%^{mv+B!, ',.- :8'&?1,V,%%%%:DPW2#.546326323#4.'#"&546754&#"#&#">7"&5464&#"32632=%$+$U#"P,; >67G*SS6)J414,! 6'.. %"!@( !Ag5D <-%>K<(IP. , 0M%%%%01S .9@J2673#"=#4&#"632#"&=467.'>254'%4&"26Zw*GO,414J<6RP7_;'D ##+,6(0-1r!A]  `O+, =)(GRjm@SNB>  - .2-'-  6F)0G S1 %%%%:(43.54632#4&#">7.546324&#"326#"sU]tSH=4U. $ "!&%$+$JJra6OmtcZ~LK(IP =,1.JA]*,%%%%:0<2#.54632632#4&#"#&#"7.5464&#"326%$+$U#"Y#; >7=T! 6'.. 4"!@z.JA]*Fs`1^g22`O|;.%>K<(IP\,1N%%%%0&02#4&#"632#"&=467.'>4&"26ZwSP7_;'D##+,6(0-1r-  `OSNB> - .2-'-  6F6%%%%. ,7632#4&#"##"&54632'4&#"326GK;#4Q%'O##+,5Ns4 @%^iw- .2-%%%%: "+22673#"&#"632+53>54&#326d  )[G82Ng## Z87J.(= CM-PHcE7*%.- (44632>73#"&=##"&254.'4&#"326.#+,6=2T,414#,l0N#@  .2-%5, =)(G*(j-0 &SX%%%%0%463232653#!53#"&74&#"3260#+,6T#3#a .2-f%=-p-%%%%0%463232653#!53#"&74&#"3260#+,6T#3#a .2-f%b-p-%%%%@ 2#"'73#'#464&#"326*$#TTyW6d/>--2N%%%%@ 2#"'73#'#464&#"326*$#TTyW6d/>--2N%%%%.!46323# ##"&74&#"326.#+,6uuT^klX#a .2-=n-%%%%.!46323# ##"&74&#"326.#+,6uuT^klX#a .2-=n-%%%%.'32#4&#"#"&463254>7.'>4&#"326&[wTP7_:X% 6,*$#$,rX`OSNB>; -2/>- 5G5%%%%:!-646323#.'#"&4675#"&74&#"32632=:#+,64?TS %9$K404,#a@! .2-5% 0<(jRFR> -%%%%01S&@,62653"&=467.=4632#"'74&"2612 :T:Sjj;"6-7-+$#K  l!"  37-'77'\0DD0/9? 6&79/ -;%%%%  (222673#"&#"632#"&463254#">4&"26d  )[F73a=6,*$#4,Z  .(= FI-2/>-_ Hc=%%%%8&02#4&#"632#"&=467.'>4&"26ZwSP7_;'D##+,6(0-1r-  `O4NB> - .2-'-  6F6%%%%8)32#5.#"632#"&=463254.#"'>4&"26XwT B,1##+,6JC[.))g=j4  aN0A>;Q- .2,DRN4)< X9C7%%%%.$02#4&#"#"&4632547.'>4&#"326&[wTP7_:X% 6,*$#J$,rX`O5NB>; -2/>-F 5G5%%%%&4.#"'>32#"&546324&#"326L*(g=j6Vw6,*$&U*< X9CZR-2/#)>%%%%:, /934.54632673#4'#"'267&#"4>4&"26sVT9 U&S &'#/VDO#-O  Cf4L-Qh2#,K10A1& #)z XPx=*.N%%%%.83=I4632326=#.54632#"'3273673#!53#"&4&"26'4&#"326.#+,6 :C+(##' T2N#3#B   .2-f%|K/#1->-,2Cm>-p-X%%&&%%%%:+.5?%#"&=463267.#"'>32673#5.#"632754'4&"26#+,6JC* @%g=j6S;T#T B,1#f g  F .2,DR 'X9C+,E1"[0A>;Q-* %%%%.%/;7>7&462#4&#"##"&5463274&"26%4&#"326$0$+<*R)A/T##+,7  X}z+ F11#* %&- .2-%%%%%%%%.{$-92653# ##"&54632"&546"354&4&#"326)8#<4)^klX##+,6uu... F(((;,Mn- .2-=1,$ 8>"%%%%:(22#"&=4632#"'326=4.#"'>4&"26XwjLKj6,*$#;)*:))g=j3  aN0DD0-20-s'77')< X9C&&%%:9+6@4632653#"&=4632#"'326=4'#"7"327&4&"26:qG@=7//jLKj6,*$#;)*:P~P&-/ >4%,  R##)<*/D0DD0,2/>-`'77'7$'_  %%%%.","&4632#"'32767632#4&#"'4&"26:5+(##9)P  *  ENJ2->-GA 1#@p6$&7~%%&&.d'==YO `: !#4&#"'632:T"(:7S\,G{/0R |BP_&a>%h" "#"54632&.#"32-W@kRI:%0{k#MI3N#g!!"#"5463253&.#"32,X@1*;kRH:%0yj#MJ)SI4M#h  *"#"5463254632&64&"2.#"32-W@ ",kDI:%0)2Ii#M $+kIu3N#g  "#"54675353&.#"32-V>:;pWH:%0%/Ni"M6=J-OI4M#$ 4632#5#"&74&#"326")'*;#a/2-n- %%%%&463226=3+"&=#"74&#"326")'*;H>>/2-j  «..(M%%%%bY "&54627"$!*u'"'/7>%+#5#5>54&'5353'4'65"#"4.'6&#',X; =9 9=(~nn+&'!2&33yz/!f ֬$2  @ 7#"&536324&#"326#+,6O#E .2-q-%%%%@'HH+52632"&54#"463232673#"&#"64&"263A "#V6=#j<%#  )XS1!  )/# ,@.2-,_ Ef +> @%%%%|&2<$"&54&#"&54632#"&546326324&#"3264&"26|#V69"!/##"(ER;:U  e@.2-)>=*!.-!,S1;RS:/%%%%%%%%z)>32632"&54&#"&54324&"26A?)#5"#V6+Y~  UL6!Q,@.2-&C%%%%   #4&#"'632 S")97P_,F[/0R |BP.5@4632>32#7>54&#"#.#"632#"&4&"326.:+   ./ /Q0  &$-!##&%q 8E 5;^L2II;5&-> #->-j%%%&z7v7A4>3232657#"632327.54632#".#".%4&"26z >,9 )+.!)&/ ""%!8,   6<  ''$' + '*; )"+<-?H"&&%%fO#".5V OHOOLe$232>73#"'527#"&44&#"32(!$7mt<M  e"3& >,Kk"$2' Id.9463263232>73#"'5654&#"#4#"#"&74&#"326I: "%7`]4 "O  /- (' >,Im 97 #$$ 6E ##5#5353373*66*377'66~"4632326?"#"&74&#"3261:$)6$%g  %7'# *%)Paa$4632&#"&#"327#"&54632& "5$ % - -- /N' ;#*-3%$31BP#$4&"26"&4624&"27#"&54632\zz=& B!0'3S."$  #(9  5'2l~GRszR OG 0r6Q%hDIc,%->/M%%%%X8B7"&54632>32 &=4&'7326=4&#"#.#"63274&"26$2@3, >:^c!?+PPYE%(#!   qX-8S' iE{`VPDNC26A16K /7, - /P$$%%87A".54632632'>54&#"#&'&#"327.5463274&"264>*`?8%I+U?- %!,( *.'! ##L5  (Q5SrONbT#RRmADL"07 h7-F" )--4;o%%&&9JZCM74>767>573263&5432#"'&#"#"&%4&"269 ,6 V## CF"a!}%L]  +" .<*&  )1B$La->.!! "!Sn$$%%8TK@JT74>7&5462>57#3263&5432#"'&#"#"&4&#"64&"268"?*M%.B.,> &6@0`H=[J@ >V## CF"a!}%M^P-=  !8#%+!..! .4),F) *$A%.C$La->.!! "!V\!$$%%W-774632#"'32654&#"'654&'7632#".74&"268.##.?2@@2I)A,GQ68NnnN4L$t  '0/-BcIJb $)@p H%ss&7-%%%%8`JT'>54&#"#&'&#"327.54632#".54632632>54.'4&"26{7Y9* v%!,( *.'! ##L,4>*`?8%I+U#"=>-]B+  `'0?6>"t mADL"07 h7-F" )--4;(Q5SrONbT(d"}O/ZbL %%&&8<V=I27#"&#"&5432327#"&4632#".#".5>324&#"326j7*#%$8OR##!2% %UB!&:"fIR> #3=nX"w:5:9.>-42!0 +*# (2'Oa)%%%%8V<F2657#"&#"#.'.#"&54632#".546326324&"26!' 6 q1K *.B##5)0I#`?81 4  s\w 3Kw/W +/6&&6&h7HV#--+,.D:SrON %%%%.$'1#2>32#4&#"#"&54632#"'74&"26$Q!& $ -P  3:5+(##  5>5*)@p6$!' M&%2->-X%%&&!K $,4<DMT^gp>7&54632>7&5462>7&54627&546327&54267&5476;#"#"547'"547.'"&547&'"&547'"&547.'"&547.'"&547&'#".54>32#"&54632#"'32654&#"32>7&546324#"6'4#"64'2'4#"6654''"6544'32'4#"6654''54#"64'24&+"64'324'32/# !  $    *      &   ! !#! (#!$e1?4#)>@ 57 +');- '&*FX@;9%0<46\?* )#4  N   V n       w  'IB G,.  #5#5"-  *# . 5   / .%!    !  $ !#  (<3 '  - / 6 &3  (4%R1/ HA':f@El<%N85O%,5'9  4+OYZJ8e?;^7%5Zc7P0  j      "*# #;<%$  (6 M &4.547#"&54632265n#12#I!D(4Tm'!9N9*,F,(4E#0 )+%Z$fjX"<_"'&#P#1%#"&546754.'.54754&#"326pQMr^G& ## iKWd7+&903&8MpqOHk    Hp(97)G:M 21#".54632#".5467326=4&'54#"; EMKG\3H;*za;>Z6,fQA13 *"7Nyc=Sz(J/ThM1a?;G3d32632#"&'.5'.#"54&#"26BIwGrP>!"G28;1AD`E_*[((P]=$`%MH1 #B/3#1g'*11255DB..8! i8D(!H3] <% N )%"&54>332654&#"#"&54632Xl 4$9*(<3#$4?"_QZko ]N"*"&&""'%$/)/BO[gUmM >%"&54>3326=4&+5326=4&#"#"&54632Vk:) 9(';11$5"#2(]L`b'N aI20  '%"t *%#1 '!BPj.2N( M )62#"&=4>=4&#"3"5463254&#"327N7>*VkNs2GF2),+aHI`0;&A9'a)0J#=(a>#%#%$%M "0%#654&'"#"&546326324&#"326FG12$:lUSmgZFLB8!3&>"&;=#':Xj,4!*3)Pnh\*Nf11"C-l1*!#.)M (732#".54>32#7>54&#" )9)R84M( 8-%7ET)387"#9< % *&"M)#"&54>3326=4&+5326=44a#>mRca:*8$"B009%b 9&@Z^L20(3x!(N ME%.'ᘀ.5432632>326=4&#"#54&#"#54&#"M5fxiVa-3.9/&I<0/(F2/%#.H,)S''Dm9 =Q6+-H,//0=<#$x!'*``/%#``1/Z%B-pM #1%#"&463254.#"#"&546354&#"326%T9MrqP6* *%8'wGPp`02&87+&87F0qr "6) ((9^oPG6*'99L %3#"&'"632#".5432324&#"3265 ,+a 0/*:= %S=%<+ C2E5,)6<%(6/ "O<(>C%&M4R"&#%'!1)M .%#654&##54&#"632#.54632632N?17!$0I;%&; 4@pQX-4P5:(Tm&8-$$1*!M3(wG2Bn$$)H+M ;%#".54632326=4&+532=4.'&5467)P<:A-%;%*8110 =$'W*<+`*@8!@()() +$< (  7 $M )2673#"54633265+5326=*N0(=';=8$50">':S? J6+)!&O/x )4G5- L <%#6=4&#"#54&"#"&546?67>32632BP25!$1I:L:('*?Ix-. *J4X9 Q:V)+W4H"Zd0.-#%!'," _{w.b'!?100$/&&&?< $#".55763232654.543,8)1U";(!RbV-5"'J1 5!%/')!6fD 0CP%#"&54672>=4.#326=4632#"&547.54632'54&#"3260$5V4pc,%]4@9&0 -"+AO)&=,j#sX0>B2!^l%l1B8$* */  6*P './1d#,k1/1#M 082#"&546732654&#"#54&#"#"&5432#"'26326CRSn9@;%':.Ha%g&PBVS(N(z)%#%$I``) I+ LG @;I#"&546326=4&+532=4&#"#"54>3263254&#"326@bb'T;Ul@:9N;010$  $O7B%<$$BLG"  tV_ ;?%[K%S"&&"0H%, &7F$$=!L 3%#"&54>332654&#"2#"&54632557673'Q8Rm 2%'.33% 8"g@3.010*.9>TR%&6 M :%.'ȳ.=4632632#6=4&"#54&#"BJvFrP>, cAI/1B#54FL1+:,U+* F?x3 'A/1!:!h9E11 FfI-""ll# [+(3%,UcM)%#".4>3265#"&54>332>=3Ͻ7S):*9N9/GO\ 3%4' 1aͿ);3&20"&&"7X1.20!M +9%#"&5463254&"#54#""&463263254&#"326)O7WjlU4-&H*+NN=",#"BR`>#&;8- =$>8 ZfWjII085X4?FB/+ !'&M !-%#>=4&#"#46326324&#"2>eC 1:VaSV>S"S,A(( 3..726=4&+532654.5472t#*#T(/X?6(CjB$$$!; %1 :!$>&4PB#.9J21  p8WV9w2..'6 L $%#".5463254&'5254&#"326qQ*8/!qO2/7*Hza7,&77*'8Ns )H,Nr'8tN+66*(99M -1;#>=4&#"#54&#"632+463263254'"2-   "I 078 :7!aIH;$$7*6%U 6L`  1yyI$G1qfBB$$*a`E M 1<4632'4#"#"&'326327672#"/#5#".5&#"32MS7)B(!*3*"1.TV .`&66%7.G<& 1-! ,*: lR :7 k (%#"&557632637354.#"326qQOq0\*7/00` *%:+&8NqqP ah'ܒ "9' #9M{/-%"'#674/#'763273#*#"7/0(xr6 0%~7 7.T`##s*#0r V; @*W'$$ + N M37632#"&5463232>=4&+532654&+532654&#"5467 '0'. U/2)R8Om$% a HH%HH'5R& 6><65 CH.H x,$(%$7K DM#"&5463232=4.+532654&+532654&5467>54#"g % %)''N)%&T;WeG8*0F3gZ !!!: 3(' "$5:M03MOEQp;1<= $&($ OdGK0IR 3$8%#"'#"5432327&54632326'4&"2>3-HD26,/#;&}\CE[W/<+q,8,! SIG+  GVh*OG2*a20j' M.2+>54&/4?"#".547232>iD1Noo$@\<%Q9 A9.#5,L+ %:C3];# (BR%#F '5" &M @2#"546332=4+532>=4.54632".'"%2A '?(@9;&`** +5+A("D %2;2.43 U&!I+j ?+&+/*-! 8M )2##"&54635".546323#3'54&#"5"32IJU@YX'8<&YCEWIII#7BD5<=5OICY;`7'DJCA`x ($$`&"Ǩ.`H! (#".5432326=4'&54>7.4.[i33265 =)/0KE:UDKne+GI& . Y6'i(/!.03(5HB5a?SxgX6O(%a:=H0!T>J2#".=4&'".'563.=4>32654&#"2636"VP$-"+ ! 0'\% "6%>zέ<*! J60$-+HH/ <)3G6"<" )/A(`d: <#f!/0؄ <% !*#".5>73>54&##"&546326N&8)7,&86!$.*^JO$5!/1 '&!5#$/*AO!:#"&5467"326=4&+532>=4&#"#"&54632gWVn:< B!$:113#,(%'YO^cb+9RRm\M+K *(s"'*0"&AOIGn :-! 1?%#"&=47>=4&#""5463254&#"326[fUlq4! +,$bG58$80'6(`:%&<>",5:VKEaR2 m "I  nF= 7$(*5!&% #&!  +7432>32#6=4#"#"%54#"26!#3 ++?!GI/Q3&Zh)b`=F?׸  ';.Vh10G/.JSpaII.0! )2#7>=4&##".546)9/!'1 ?#$;$3 o)J/3L$ "0*/-D6Zl!*#".5467326=4&+532=4&'52lQ4S>@8 9&(90;%4*c\a(9SZeK=2Iz!%#$1x!%HIQ2=K.'.'5632.5432632632#2>=4&#"#54&#"#54&#"Dz9t7-;+.=,,B<0-FFI ( !&H+1S#)34YA7D_* 7S6,,005[ x.)``*+``,00b% 2G`! !/%"&5463254&#"#"&5467254&'"26oQQpqP6*7)5 +mQ]e`5+*66*)7NqrNPq&9C "'@LqM-38('8;! "02327"&'"632#".54>54&#"326 R$:@Fi'8#A;$d_$=<# :/5,)61.6+ ;/*N4nV'Q9R/>"&#%#%,! 27"&54>32632#6=4&'"#54&"6321<&QI> #<40 #6-%gYM5V  #.+$<$)!,73265#+5326=32653".546;%">&:*S< `.b/%M53N*: .y '-G # M##='!48#R! ;26=4&#"#54&#"2#"&=46?67>326IU F.36!+)I=#&:#<-9]bE}!XIDN  1])#Ma)\L?-*/+##3<,Rg(<C[N06+ &&! '%#".55763232654.5463!:@&+9)1U !;(!T&&:2$#2 'J2 5!%0&>P$(95&=!.!=J#"&54632>=4.'32=432#"&547.5432'54&"3267`;t{M:?8$7%0 P18N+#kh)k^(##OJ1^j?5f7%$6  /$ >5*P $6\W3% j00A2632#".54673254&#"#54&#"#"&54632#"'32>')2@H&K3>>(>:<([G X!   )-PB)9&#A)4F(y"$G%#,__*E  $$!DQ%##"&54>3326=4&#"54326=4&'""&5467263254&#"26   aoSLu/ 9&(9(()'DEIM?WA#BGM6!% &D^WfaK " !%#$ #!H@N?QFG$(C4!!/25572>73#"&54>332654'"#"546.E01 0TmSl 7' <#*7T60HP$e[OZ "-$&x '%#3$#-f*H!RA%>=4&"#54&#"&'&'563.=4632>32 &+8,T+ 9T@ 6%MU :'"\F&,$4)>]Gl.""kk" S$!0%! (/D)r.X9"f7F3370Q!'#"&'4>3265#"&546332>=3_^Ot9(9N9/GTWD4<#0aT\c]L22 '&"6S=8Y1! />743254&'"#54&'""&5463672#".%4.#"3265F4-$H,MCH%)2)Q7-7(##&-6?%@/II1:*#: <;#(G# -&"*! ","#4632>726=4&74&#"26(-aPY?R164$WRI2( 61_tL]D6<;)`"L!54632"&=4>72=4&+532654.!&(#)#3,0Yubs7'/wv###"O% ."?IAoue.8I0138ux6(-)! !%#"&5463254&'5254&#"326qQNrqO2/7*Osa7,&76+'8NsrQNr'8qQ)86*(9:),#'>5."#54&#"!#&54>32>32#DG$("H )- 7(P&)#bJ); /5xx! {, #&G!LX$"/#"=467326=4.'5#"&5463254&#"#".5326327632/&#"32  0%/T\@8B*$/":NE8# 7 '91 HS0  TT < 0$g3U#(?!;d"#/!` M-3E * 9 V< lS k! (%"&557>32637354&'"26rNSo0 *7/00_7)+68)*6QorO ah&ݒ&89'(8:F6%"&/#52654ȷ'&#"&5467267#7327F;.L=4&'";C=03AD> <&SU02%#(+RH,  ITH&SD5H^? 00x-(x+!-2>32#>54.'67"#".5432$WA hD0Cet4'+N,#Q)8DG/#0/ !=4.+5326=4.54632 " 07WB'K2!;@&;>E ! **-,4,<+%*E(^;"c):* "G3&M3z"%  +6%6. ) ! %/##"&54635#"54623#3'54&#"5"326IUJBWesYYIII 6BD4<"@DNIGB`DJI;`x*$$`&"Ǩ.`H+! 3A4&#"326=463632#"'#5>=#"&54632326=4&#"B8'+67&,7sO*7/2OqrN4-sO*7/2OqrN48'+67&,7':9(*68)yQq8'rNQryQq8'rNQr':9(*68)!6%54&#"#"&54632326=4.##"&54>B3#+)%'YO^c;TU;:$!B <:nVWg;0E573267654.547>?2#"&54654.54>37632#&52++3P^-?Z&  '(^4j~D'!5?GS1U&6% EI%#"&5""#"&574654.5463232>54.54>376322>722)9:  21>32#".#"#!H"+ 8(y+ @ @M@   C% ;)8# G6P /!V  &P"N0*&#  *"X87"547#"&546543632327654'4&5456?632+!H"+H!y :7  gg  06P .!U a %^<  (2,Y=L747+".54654&547>32327>54&547>3232#"&74#"'326#$ K K3 8 O -l*56m. F 3K# U  +J%|% *+j+N )+,  <aB3232>54654&54'&54632#".5465#"54>54&547>323!4g!;8! [ 7>54.'&5476726.#">j#$*N /;-?T" "! ))%/   U X$  %D'((:'5&-#%U    :"()PRy)!!   G" %011!\074674.=4?2632+".'+"1J5 '*.,W %GO S cmM*3u\z2 -Ta88Q& 2\=7467.54722672#"&'+".'.'+"2R 'V 52/*h$)'89+T 2K Y`r!@  %F1[: 2 1-S  Wp# o%* 1\@7467.54723>467632#"'"+"/.'.'+"&1Q 'V !' !#;.1H#=  2g Jck @ <$2$3%Z'O(  *!2 2~t1`* &8#\4+"&54>767&546?2632+".'.?9\ H 2(9 6  ?##V l7 42#B+- P4?+;7  ) 2\3@7467.547>?232"#"+".'&'+"%4&+32652Q ' &*.P&5N'M1E"( 2pI9(/ &bn!@ P0V% /c! ^Q-MU;G7467&54632+"&'.'&#">32#"&732654&#"-RDJ 0%+ W $  KTE(3'%,$ /,d$#Hv!W 1 .)P0)iC- -3Ft1 8%'  >4*, 1uULX74>7.546?632>3>7>32#"#"547+".'.'+""32654&1@b0& 7  ! T> 7 ! '3u0?W(@E#"/qI!!cIz?  09 7&[Y @  + !a! M ( !9v\\7"&54>7&546?26232>72632#"&5#"&54654&546767.'.'#T 4K>9 6   F !  c 0-8'%71%..S?)c )4a@'P L1tA  1 6)00 / D8EU.JS74>3654.547>322+"&5>54.#+"5467"+"&5Rwd" O WqP6,.3  M)+G7)EpBd1 "&T8I  7#8  ?j$ ; )S72$ -Jn74>36=4.547>322367>32#"&5+"54654.#+"547>7"+"&5Rwd" O M[O/>1/ )(;c I4M8 M)BQ7EpBd1  "3    1 5+ $ D  &G0C ?j$ ; %S9 +  -Jh+"54>37>=4.547>323263>32#"'#"&+"54654&'+"&54>gG_-H#5GAB"  O  2? D. 3,GH @o_ E3,A=&%U.M1& ,+\  KZ U " 2 3&T DO@h% $ {mId7+".5467>3>54'.547>37632+"&5>7'.#+"/&5467, <1){4   "Fe +:I5 @  7'6# ,6/R)  (P1 W C/"2 b  ])JR^74>3654.547>3222++"54654.#+"547"+"&5%232654&Rwd" O [kLRd^KE4M8 M)BQ7 E) pBd1 "'M2*# + (E/C @h% ;%S9+ -ME"e4.'632>322+"&5>54.#+"54>7"+"&=4>3>54#"#'6 -'"* 1'WqP6,.3  M) +G7)ERwd"O")6F     = &T8I  7#8  ?j$ ;Wy)S7# -0Bd1 IQ74>3>54&54?6322+"5474&'*+"&547+"&58O_G&" _oN7[o B:S+ Np5W2" ;o! @))?    %@#'9)'/(tIs7+".5467>3>54'.547>376322>32#"&5"#'#"54654&#+"/&5467#".54654&54767272632, <1){4   "\qONB )(9 $}] @  7'6#29, U57   ,6/R)  'Q5C   0 6+%QEU b  ]) 'K69\]Ofx%".#"0&#"#"&54>323276323632363632#"5+"&54?>54'&#"&#"326326?64+"6323>k U(0&DsB '  $%.  ?>,i) =  .@$ - % ,^ P9 .  (1a3(LQ; *7Q/!  m% $)U+. "',@&#2M1 {:\OXo%0.#"0&#"#"&5467632326323632326327>323#"'#'&+"54?>54#"&#"326326?63232654&+"k U(0W*HR1B6$.  0 E.9I, .J;.@, )/#s?$ - % ,^   )=1a2&5m248" /  40B %# *"',@&#2v2.(`Shr4&#"##"54>?6363233263767>323"#"'+"547""+"&5464.#"#326767632?,  >\SmHDfZ ' C$    NH N"[$) B'$ E9$&X!fNJ/]I / \9X) 9312. 3JM'Z  W) <>(#E.dAdn%467"#".'&54654'&#"###"54>?3263232+"4&+"##3:3263263:32676;?4#Ll%$ ';\SmH  A!  *$  )  fNJ/]IJ&D  %c ) \9X) %42'! Y >H(#E+dKn|%>7"#".'&54654'&#"###"54>?32632322+"#"&+"54&+"##3:3263263:326763023?"326=4'"&#?Ll%$ ';\SmH  1> Nq&6,   1  *$  )  f  NJ/]I %"5[-"  %c ) \9X) , 0##*  A! Y >H #E+ );dGYg3"5467>7&547>763>32#".=4&'"+"#"+"4&#"#326=2>=J 3,D 3&lDEw?toR$E<  %  'R&  1 %355"  JR* 6 ;,B ^81%(V?6G ) !^ /JN&O0'/1376323#".=4.5+"&4&#"#326=%34>.+7N."| 0$VCx 1/72>323>321+"&5##"&54654&546767&4&#"#3263267632?[$%&A'$RI?PzY$ 7M /*;[Tj9,./R?) 3> $&Z  eNM[~HP +Y! 9#2K&&3/!  * 4-&I 2'W*CL$O>Uh#"'#"&'.54654&54;26323232637>7>54&5467>4&54;232654.5476;2632(T54&54;26323254&5476;232632*(:9   6k)H4G 5M L 5D+  hC5m    7+ 6- #2  !0! *   L( 7U   =H .* L9%4>7"'&#"#+#"&54654&56;22662>765<147654&'454;263234674.5476;2326363>32#".#"+"#"#"&+"%`>  {&$, ;&   ' !B-  A t  "G+/2$  .  $M0pb -$U  _ !  ) , (7  ]#7"65!- 9]%467".1"##"&54654&56;232>76?>54&54326323>74.54;2+"&6*"  W$, KF  !B- Kt BT0 -$U  _ A" &9  04 7! !CEDo}%467"'&#"###"#"&54654&5476;2;2634676474>54&5476;23>54'&43021;232+"#"&+"7.#&#326= )  +II#+ , # / % 3 @ ] XcDO%  1"#- V+?1#V a %>  &:439 4/54'4;23654&5476;232654'&54;2#".#"#"#"/&#"+"vw>) ,"!=< gL%02b<$X>, "4  #'[  n5D >1' 27.+"&5465454&56;232632726?654&5476;23274&5456;26:#"'+"`:kH%"+=" 3  0 ot 3  -aAZ8ED8 7b1#^  !N' U.)2 f;  0;(`\cvG8%467"&#"#+#"&54654&56;22662>7>54&5454;23>74&5476;237>32#"&5+"#"&'&54654'&546767&57>372327>32I5#MdvK1  G $9DE9$0(915(  * , B7^T 4&$#  -M71.0A%+5   RP&@7467"&54>=46;232>32#"&5#"+"&9TGTG > /BB/7L765 0 '9.9 r0;* $- y!4O$@9K k  #@-, IS% 2!% ,3'F6%) GM0'P%#"&5#"&54>76=46;2632327>;>32()::$  f<;\B_aJ -  7MPN7+#!) Oyi 5," & '5=6W>;P0 -J5/< %)$/'=" 11+GS%2#"'#.54>7<>2637263232>7&547>7>32654&#"3%6% % @ A&78!?\]F 8 ;9NL(/,!$ $Hy+$4(0  2#3V@?V2 ,J8)2=M"= #/ i*,!-'H%"'#".5&54&5>7272632;2#"&5"32>7>73I0J1*,sd:/ X 1+A)5"H3 1@( * , 2$& 2 +3F $ "#  -~IHV%"'#".5&54&5>727263232632#"&#"#".47+3263>732654.#"I0J1*,nh1 *"E%73<9"-  >MU)G@( *! $ , 2$$ 4 5(&9 )'rQ'"#  ( #0{v".54>5"&#"#"&54654.54632;>2;23>32#"&+327>;>32#"&5/.FdcF6. (= .AHF* ) +6,#32KWK2a!) Oy):* U / ;Y;=\=   -$  )4 #  6[9:.A$_'=" 4 5,) %-HS4674'4&54>26?26322##"&=>54&#"#"=4&-sO C   9G)45!3& KZ0   1 ~"  J 71'M5 & CQ C -Hs4674'4&54>26?26323;2632#"&5#"#"5465>54&#"#"=4&-sO C  Ha 1*9] ;E-D] 3& KZ0   1 t6 2 6, ?; j8/_M % >J C ,Hg4674'4&54>26?263223276726767>;23#"'#"'&565>54&#"#"=.,vM C  gO  @" : @Kr< F+B` 2 'J\0   1 FB% + 4^!80aM% ) BK C0U/,HV4674'4&54>26?26322##.5<5>54&#"#".5.,f] C   (A//;) 3  %7b0   1 ~" n-6!I2)7 &4-HZh4674'4&54>26?263222+"#"&5465>54&#"#&=4&4&+;26-sO C   &6,1 F, "0' 4% ;"1 'K[0   1 }M j80$A)Z\@! 0 -GL467./&'&543763263:32#"5465>54&#"+"=4&-h= 6& VYE*Bb 2 & GZ  = a# v~580`N% ) BK A -H]4>74'4&54>26?26323"##"54654&#"#"&=474&-CS, C  IR9 @/19'  %8  "1N& 0   1 ?7c/+6!E.; $+ 9: ;3.t Gg467&546?26322332632#"&5''#"'&54654&47>34654&#"##".'4&.B C     ((:;8T2%()E+19'   7  $Cb8' 4{5/- 1 8) 11.  D80"F\A  >pk2>7>;2#".#"632#"=4&5>54&#"#"&/&546?6=##"'>54'46?6@ ?;N!C* $F%* 1$=22 9&.5$ Z 6E(,P1 !X3 # 0 ]5*" ( +6)#G/# +E;;2M Z! #  2>7>;2#".#"2632632#"&5"#*#"#"54&54654&#"#"&/&546?6=##"'>54'46?6@ ?;N!C* $F%* 1 M;?o (+7 )  T9&.5$ Z 6E(,P1 !X3 # 0 ]=) -, 2 8(u 0#1*#G/# +E;;2M Z! # 02>7>;2#".#"63232?>264676323+"'#"&54654&#"3#"&/&54676=##"'>54'46?6@ ?;N!C* $F%* 10- = Q  4 P C'! <#-5$ Z XK,P1 !X3 # 0 ] /@; * 1 3 0*"F.5 +E;;FM Z! # p\2>7>32#".#"2632#"&54654&#"2#.54>75##"'>54'4>@ ?;N!C*! $F%* 1 \ 9+:h42F:,P1 !)X3 # 0 ^p-* *,&.\CLH0(D&d! # z26726;67323#".'&#"322+"#"'&546=4&#"2#"'&5&54675##"'>54.'6;234&+;2658C9^ /0# 7FR %6,_ 8) "+#Z! mGBO1    &.! "/ '& 8  /  ]52~M 25$, $=&\1   OM_ e"#  73 $q4'6323263>76323#".#3263#"&54654&#"#"&54&54>7&/##"'>[; Y8(!#) 5$#' % 0 Y 9&>Y <  );5; 1 "l ! !   - 8 ,#  F+4(^K((*]5%A'ZA#pt2>7>;2#".#"2632#"'&54&54654&#"##"&'&5&54>76=##"'>54'46?6@ ?;N!C* $F%* 1 =] R8& ",$  R  6-!,P1 !X3 # 0 ]3;\ . e#,":$'  !0 %;' Z! # (4>75#"#"'"54654&546323:32>72723>32##"&+2632;2632#"&5+"''##"'&54654'&54763:32;&546=4&#"2#".J2G:,%-  '08   " HC1 *  ))"5#$V +(9. 9U9,+?<>=&G[7)E'c   ! 5A $ Rp:  1 7+8C*  6( .)h8GA4@{GBXd"=4>7#"&=4>54654.5476372632###3263>7 %4&#">-  '0R7L[P  _ &J@-YQ  *|K    L9!!))GP +; M 2L-# $P=(>Y  1+& "@GNam"&5>7#".54>7>54.546372632#>32>323#"'"'263>7 %4&#">+'0?9L[P  _ 5;$*YQ %6)+3J GV@    K9!!)$i+; V  2L, $\,41 >Y  3\+& "@GQgs"54>7#"&=4>54654.5476372632#3:367>32#"'&#"#3263>7 %4&#">,  '0R7L[P  _ &J@-YQ # C- ;*5COK    L9!!)5 K4 +; M 2L-# $R?!,!* (>Y  1+& "GL]e4>3>54.5476372632##"&54654&4763232;267>5"5473272765654.'w>]K _/X#O03 $3Rj8)3   A -U:)x% !0 m",+> -3 38#*8))> 0 %  6}* >&@{G:P\k"54>7#"&=4>54654.5476372632#2+3263>7 %4&#">4&+;265,  '0R7L[P  _ &J@-YQ@>4K    L9!!)!, *4 J5 +; M 2L-# $;L% (>Y  1+& ") ?{Sbn4&'632632632####"=4>7#"&54654>54654&#"#"'>3263>7%4&#">B34 %- &J@-YQ  *  ,1N6LZQ +) K C$L9!!)X 5J-# $P=)GP +: T &>Y22+& "A3KXdu%"&=47"&'.54>765654&54>32632#654&#"32?4&#""2>7>5N84 FTI>"F.**?+ 0"I^ &>K  .#7 &k( % -4  2< F / .&, ,(=(     7   nS$.Y MY$U  @GYo{"=47#"&=4>54654.5476372632#32326;2632+"#".547#3263>7 %4&#">32654&#".!'0R7L[P  _ &J@-YQB )+Q )52; %F(W QK    L9!!).#$) +; M 2L-# $&6(%7! I(>Y  1+& "*")!@Gz"=4>7#"546547:3274654.54763726;22>54.5476;2232632#"&5"&+"54?####32?%4&#">.  8+~   _ 0b 8 A R 4'8/$  OzGoz7"&547467>7>54.54763722#;2+"&54654#"#"&#"#"#"&'&54654&476723>7&547732767"267654.'LNtM (   _ w^$$WT 4 .   8 '&9 % # ^ 4{JzI %:F 7/6?8 7& ,  T$4  4   H j 1zL2* lzGSoz$467#"&54>7>54.54763722#32"'"&"#"&54654&547>7'263767>57">5&'4&+;265 !WB2IH7  ^ w]2XO-1:(.|u  ^;,&%yG[ "L.M="'$ +<j"!0D? 16@8#!>M 1  #32)  ).S :@Gr"=4>7#"&=4>54654.54763726323:3274654&5476;2>32#"&547####3263>7 %4&#">-  '0R7L[P  _ ?Q /   D '+*4/Y  1+& "mx4'6323263:32>7>3232#"'6;2"#"54?65"#"54654>?#"&#>32637%&#">L'/ ! !l#! @" 5+JA' !0BX T!66R?@! V1"kA&Mb L:- 3] ` #   <5 @.<%7 ! "- ,K,oz4'6323263267>32#"'63267>323#"'#"#"565"#"54>?#"&#>32637%&#">L'/ ! !l#"K A#5+JA"Nf&8"# :7)+3J'.   S 62OA @! V1"kA&Mb L: - 3] 3+ Q,4  4<)< ! "- ,K,x4'6323263:32>7>3232#"'6;2";67>32#"'&#"##"5465"#"54654>?#"&#>32637%&#">L'/ ! !l#! @" 5+JA' b  # C- ;*5CN 66R?@! V1"kA&Mb L:- 3] ` ** ']  !,!* 0<%7 ! "- ,K,lu4'6323263:32>7>3232#"'632##"&54654&4763233265#"547:326=#"&#>2>54&#2635)- ! !l#! @" 5+J`e6 C%? "-Xj8)3   !GCe21 @" V1"D %.; ?/'- 3 b%3   !4,)> 0 @L 8x_! "-141grz4'6323263:32>7>3232#"'632#"2+#"5465"#"54654>?#"&#>32637%&#">4&+;265L'/ ! !l#! @" 5+JA"Fq9D4@>.D! 66R?@! V1"kA&Mb L:!-% *- 3] .4"  "K& 4<%7 ! "- ,K,1 $%"&=4>?#"&547"&+"54654&54632;2326;26?>7632#".#""7632632####"547"'32637>5.# T:6U8: n) )&8C!  - -')"   )9"'(G !<;# YU  +" +'@5&$(;5 %6 ; 5" 3#  9   (    1I.T"-Aby4'6322>32"632+"&=47"&'.54>765654.5467&'#"'26%4&54;2632#"&546654&#"32?4&#""2>7>-'"*&*5H3&0"I^ &>K  XN84 FTI &&-5#V <  8'#t.#7 &k( % -4  2< l!  9* '!(     7   F / 7 (#   !2 #S$.Y MY$U  4'6323263:32>7>3232#"'632"32326;2632+"#".547##"54?65"#"54654>?#"&#>32637%&#">32654&#"L'/ ! !l#! @" 5+JA( 9=$1v( G (!R 18O (_,!66R?@! V1"kA&Mb L:-#$- 3] ( %  "$;! 9 5 @.<%7 ! "- ,K,*")!4'6323263:32>7>3232#"'6322>54.5476;2232632#"&5"&+"54?#"#"54?65"#"&=4>?#"&#>;7%4&+">M)- ! !l#! @" 5+JA!7>3232#"'632";2632+"&54?."&#"#"&""#"&5>7654&54;263&5465#'.54676?#"&#>;67>=4&#L'/ ! !l#! @" 5+JA( 3?."HT 5 0  <  7  F'`  6P /.FB@! V1"iH,$,=<- 3H %    3)    >: "  35j! "1|8- ."9+O4'6323263:32>7>3232#"'632"#"32+"'#"&54654&54>7&5465#'.54676?#"&#>;67>=4&#4&+;265L'/ ! !l#! @" 5+JA#>?&"CL  F] %7* -# ^;+%.0[' 6P /.FB@! V1"iH,$,=N 1  35j! "1|8- ."9+1 4'6323263:32>7>3232#"'2>323:3274654&5476;2>32#"&547#"#"54?65"#"54654>?#"&#>32637%&#">L'/ ! !l#! @" 5+JA *J>/   D '+*4/ T!66R?@! V1!kA&Mb L:- 3] 1& E V  2 BK  <5 @.<%7 ! !- ,K,4I74&54632#"#"&=465>54654.#"2"#&546 vOd ,--;`#%ag|I<45" . $3&4dt ' =4T%"'"#"&54654&#"#"4&54>3267>32wK 0 >0/1  )' 2EV=Nc* G)# <3  d4 -E?4?+W;PqT5S- F: j "/ 4Y"'"&546?54.#"#"54&'467632327>3>323I' 002 & 2HRQ)LA  G./&4")#E / -X=)8' ;EG>`#)?248 !-  4E4>32#"#"5474654654.#"0#&54654&2GV<Od ,&' AW P $ Z4R. I<45H,  / oQf '  ?P4EU232#"#"&=46?4654&#"#"54&54>4&+;26,:;%K^ "4&"W@1%1  0 ' 0DT=0"3! '4 7&-  #";%E+>(R7'{vA?6T/ $ 1  4R"&54&'#".54654&547>726?>32##"=4654'&#"29 `B$ Gj K]H*K?$ ( !E//@!*3% 3A3 4L"@1*( D 04.;+X; 414>32"&=4654&#"#"&=4&1DT<+LA E.D.+5$ 4% Q7U/ @2(& #%0='R8  !"*t4f#"'&54654'&5476727&5465465.#"0#"=4&54>3232632#"&5'&#"#$8-)x3!5)@V F) 1FU=*L>"z ((:<A 8 &I,  #67++oR59)  A W4R- @146 ' 1 6*7)s226372>7632#"'##"ʎ./64&54632#"#"&=465>54654.#"2"#&546ED6  :+4H$$ S26. vOd ,--;`#%2    )"3  " / g|I<45" . $3&4dt ' =)226372>7632#"'##"ʎ./6"'"#"&=465>=4&#"#"=4&54>3267>32ED6  :+4H$$ S26.WK  0 >0/10 ' 2EV=Nc* G)# <2    )"3  " / D3  d4! $ - "5 4?+W;@>5S- F:h"/ )226372>7632#"'##"ʎ./6"'"&546?54.#"#"54&'467632327>3>323ED6  :+4H$$ S26.fI' 002 & 2HRQ)LA  G./2    )"3  " / 14")#E / -X=)8' ;EG>`#)?248 !-  7)o226372>7632#"'##"ʎ./64>32#"#"5474654654.#"0#&54654&ED6  :+4H$$ S26.2GV<Od ,&' AW P $ 2    )"3  " / 4R. I<45H,  / oQf '  ?P)m}226372>7632#"'##"ʎ./6232#"#"&=46?54&#"#"54&54>4&+;26ED6  :+4H$$ S26. :;%K^ "4&"W95 %1  0 ' 0DT=0"3! '2    )"3  " / u 7&-  $ "E'E(R7'{vA?6T/ $ 1  /)|226372>7632#"'##"ʎ./6"&54&'#".54654&547>726?>32##"=4654'&#"2=D6  :+4H$$ S26.! `B$ Gj K]H*K?$ ( !E//@2    )"3  " / S!*3% 3A3 4L"@1*( D 04.;+X; 7)[226372>7632#"'##"ʎ./64>32"&=4654&#"#"&=4&ED6  :+4H$$ S26.1DT<+LA E.D.+5$ 4% 2    )"3  " / 7U/ @2(& #%0='R8  !"*t)226372>7632#"'##"ʎ./6#"'&54654'&5476727&5465465.#"0#"=4&54>3232?632#"&5'&#"#ED6  :+4H$$ S26.8-)x3!5)@V F) "9@E0Oc69, *':!8C 8 2    )"3  " / :&I,  #67++oR59)  A]+G-!I<46 1 6+%GR%467#"&54654&54>7265>54.547>3227>32#"&5##" i3%&).Z* RU= : 1*9#:'  E. - 01 2  *7  d 1 7*%Ge%467#"&54654&54>7265>54.54632267632#"&5#>7632#"'#"#" i3%&).Z* Rj2& 1*9&>0Y!)5K  G,5 01 2  *7   ` 1 7* -. 3 #%Go"54#"&54654&54>7265>54.547>32267632#"&5#327263>32#".##- &i3%&).Z* Rh7!  1*9%>   C- +5& 1! 01 2  *7  d 1 7*  `p *#G_4>74654.546322632#"&5#"##"&54654&543232>7>5#"&54654&25X A +(87 $5Up$ 2 #N7I&A% )Vr !#V, 7* a-6+,  . 06'< $3  3 %GXi%47#"&54654&54>7265>54.547>32267632#"&5#2+#"7";26564'4# !i3%&).Z* R`9  1*9%5A>' ~ $'H4 $ 01 2  *7  b 1 7*(L% *'%o>54.5+"#"54654&54632;2>7>32#"&5#"'###"547#"&54654'&54672>38  <  #041 # w :  1);+3   3$l +,/Z-5 v W" 6V  3 8)H  .   #( 1 3Q^"&54>7#".54654&546767265654.54>32#>267672#"&5#654&#"0 cG %54.547>32267632#"&5#263632#".5&#""'#".54654'&547673>3& &iA$(*W?) Rh:"  2*92 "3%0 # 4W  g <1  4A 2  *7  b 2 7*1  3 *' ., ;z|26;>7>323#".#"#>7632#"&5"'##"&547#"&54654'&547>;>?##"'2654'7>323&o& :C6;*8% H x8! "+8d  Hf$ &J L [ t ! "" !$,#3h !9(   +  !2  *   A$!;z26;>7>323#".#"#>7632#"&5"'67272>32#".#"2##"&54?>7#"&54654'&547>;>?##"'2654'>323&o& :C6;*8% H x8! "+8d& 5)!  0% < E f$ &J L [ t !"" !$,#3h !9(  1  5  C''  !2  *   A$  ;z273263>323#"'.#">7632#"&5"'32?2>3#"&'#"#"&545#"&54654'&547>;>?##"'>54'4>@ 6 C6   :; x8! "+8d <4$$ 8%0 $ f$ &J L  v  *S3% 2 " 3h !9(  /U  /  '  !2  *   A# 1z63237>323#"#"&'>7632#"&'#"'##"&54654'&5432332676?#"&54654&54732>3267474654654&#+#"'7>54'4>32  YC6." $. 7  u=  /(74)Vz9(2A 3[b2%(n',  Ou  )D $- s # 7*dV%0.: .  %?e  21 4 ;A  :nz63276?6323#"'>7>72#"&5#"'32+"#"&545#".54654&546;>?"#""ਫ਼'4>324&#"#326;265 W H:02Fa d ,+'(;G.Ep&6,/f$ D(L "! ;,!*B' .! '. '"3    06) #) &  "4 1 #! 6X74654&547673>?#"&5467"&+"54654&4>32;2>;7>323#".'32>7>32#"&5#"'+"545#"&u  dL : o) (:3 K 5#:-"-R 8 28 8( )*:H @Ee3%'7 7 ( 7,   0'  S FN  $  ?2 OI 2  878>54'5>3223:;&54654&54763:;2#"'>72#"&5+"5467#0#"&54654&5476327654.54>?.#"#"4.#"32>$  #)    Q    ?0$+W-_B9 (,9A   O0 ,#  -%&4>U  08 =0C#'#   *  (+71J 8 >4" _' '/  9   (,  A T%,,;nz26;>7>323#".#"#>7632#"&5"'32632#"&'#"'""'#"&'&54654'&54>7&547#"&54654'&547>;>?##"'2654'7>323&o& :C6;*8% H x8! "+8d &,7*  0V% )-x( f$ &J L [ t ! "" !$,#3h !9(    400 #3  1  #  !2  *   A$!,CY43232632632654&54;2;2+"&546754'#"/&#"#"&="#".54654'4&5U!g  7 A:E7   ++ C  % S % *  *8 4  Cb43232632654&54;2;232672#"&5#"+"&54654'#"&#"&="#".54654&4V!wG : ,?0 (*95 E: ' $  , 'L#!$1 7+ *!  "1 ,Cy4;2326326326=4&1476;23:;232?267632+"'"#""&+"54?464'#"&#"#"&="#".54654'&4J ! d  3  (":& \ 0" M -0 -  $  , 'L .0 0 . 3?6  "1 , %C_4&546?632654&54;23:32##"&54654'&546;232>54&'.+"5465#"&'&546LN}) 7 ? 2@n;$1 J-WX6 3 R*% *  C  % S w-+?!7$1 ,   A-f!  $5  9C]j43232632632654&54;2;22++"&546754'#"/&#"#"&="#".54654'4&326=4U!g  7 @CB#@8   ++  .(&8C  % S %KRL% ,   *8 4  ( 7DU"5465"#*+"&546762725654&547632;2;2+"&546754'#"/&#"I0Z 0 V  5  A:E7  !=8  I`  %N % * 0Nfr47#"&54654&547>727>32633>72632#"&#"#"&5473273632+"&54654&#"+"%2654&#"(DG+5i1 h-#?<,/5 . #,),+N*   = X* @!"=,$=8 1  &,-C $$ !E0=>z  -&C|43263:32654&54;2;23263232632#"&#"#"&547#*#"+"&546754'#"/&#"#"&="#".54654'&2654&#"5W.U  7 BA! ( 8*56- / 3'47   E7   l2%2  C  % S ) 6'(67&! bJ ,  00 / !!'C432632654&546;2;2324654.54;232632#"&5#"54>7#"&#"+"&54654'#"&#"#"&="#".4654&5W. Y  3 (!4 $'90h2'<   E: ,  l15 )!  L ,1  4 n , 7, $09-0 *!  "P 2TC437263:326=4&1476;2;23:;2#"&+"&54654+"'#".4654&54>7&54654'#"&#"#"&="#"'&54654'&5W.< 3  ;1; 7   4 '!& <-  <  1 l15,, 'L 8 %.  T  ,T2   "P1 C{43263:32654&54;2;22"#"#"&+"'"'&54654'.547>7&54654'#"&#"#"&="#".54654'&4&+"32655W.U  7 ?M^"5$ $ o2J+2d6 ;  2 l2%) $)&C  % S ' e  872      00 / 6 >C43263:32654&54;2;23>54&547632;2>32#"&547+"&546754'#"/&#"#"&="#".54654'&5W.U  7 B9   7 E 130  G8   l2%C  % S !+ VZ 1 A 2t,(*   00 / 1ZB7;2#"#"&5454.+'&'4654.#&4636BAe 5 _!  8B$m /     kA[%"&5#*#""&=454&#"#"54654&54;632263232632*7,   I ' & C") i *6, %%    ! k  k M ! lAD"'##"&547654.'&"#"54654&54;6326327>3}J;F u ' & COI,"/3  ! k  k  "-  ?)I#"&'32632632+"54654&#""+#"54>7267263213(7"*:3(  l' <8 3 ?*O2 5 \ 6) a:@D  )  R'5," /]AAP%++"54765&#"#"54?4654.54763:36327226=4&#;(:-#91w0 #G,J^(!+ V! % " @ ! i  ]8)W -2'R4&#"#"&54654&54>?632;2#"'4?>54'&#*+"54?66 !2#&3N=n  P9*m  G  t N     56 3   4 Z# ?   D!?fT`"&54732>72>;632+"'4654#""+"54>726332>32#"&#"72654&#"u",),+ ) ?.( C@$3@/#7.?> ' ; .>!"y'! !E0=> ( $Q+F( - ! -&%tk)h46727&4654&#"#"54>7>32632#"&'3263263237>32#"&5##".4654&;2R4! Y+E)X< 2(5"*:3(  l)B(  ((<=Uj<0   S5A0( 2 6) a:@?d    4, 1E0 Izv4'4>323>7232>56;23#".'"#"#"#32637632+#"&5454&##"&54?654#"+#"'>* b &[..&  " & z#$s !"  /.  F    NA#Hz2>7232>5672#".'&"#"#3263232632#"&5#*#"##"&54>76545.'"54654#"#"&##"'2654'46?6A 2&B &NE%  #   0% i  **7(Y  <D&E1z "S3 +/ _   5 ! 6,  +V% j@$" Hz2>7232>5672#".'&"#"#32?26323272>73#"'+"#"&54>?>545.'"54654#"#"&##"'2654'46?6A 2&B &NE%  # &$F 5 /*$:+3N Q 5 OE1z "S3 +/ _  D5  )"3   ! % j@$" 3v2>7>3#".'"32632#".'"&#"32632+"&54654�#"54>7>7##"'>54'6E9cN !* "$ "$W, #H4E&x(D AF@& 4 O1  o2  .  :  * +V?>=   Q6$  !$+j}2>72>72326763232#"'326372632++".'4>?65.#"&54654'"&#>54'56"32632>5654&#&D ( + 8  Q 6+GI'*(:.#9 b H;-"0A-$a32 / 4k  O9 @! #  i #!,]  6v&54>7#"#"'"54654/&54322326;:3267>32##"&+"2;2#*#"#&546?674+"54?654&'"#"&54654&47>3,*   5)GV. >'&  .)! 4) Q1 6s(!J!  3&&v   6( ",     ] " # 6 8  55 2  3r~4'632723263>32#"&'23732632#"&#"#"&547.#"32632+"#"&54654&#"546747##"'>2654&#"i 2B   , N"3+ 4E -:*4&!/# 6 *%<4D&!Z )  ! I@w: 4 Q0 $$ 2$0 >) &)"$ X@;A    TF[E"$+6t7"54>76567#"+&54654&5432;2;26;23267>32##"#*#"&+"2632#".'"&#"+"#"'3272>373263237>32#"&5##"&54654&546727&4654&#"+?:DA2 ,' 5)F3 0  ?'    !*  T! # % ',%B(  ((<=Uj<0$2R4! ? P5J! !5( "-   & 4 + (/$<$   4, 1E 0   /8T7467#"&'&'&54;2322+".'.#"#"&+"#"&5/gvX  L)7  ,;,  H 47 ,' ;  $Gk4& u 4.U%   %=!&El+! /8Y7467#"&'&'&54;232232672#"&5#+"&'&'.#"#"&+"#"&5/gvX  L)8+rT *?01*94+B  63 -( ;  $Gk4& u )5J 2 5+#t #LI"Im)! /*8c7467#"&'&'&54;2322272>7632#"'"&+"&'&'&'.#"1#"&+"&5/gvX  L)8+, 6#)5K:  M /# 2 ; $Gk4& u )' Z/  ) 1!JH  &s7!/8T7467#"&'&54;2322+"&'&'.'"&#"&#"5#"&+*1"5&5/VTL)8;'3B.(A   %  BL,)^ u(  <= KP   32  /8Vb7467#"&'&'&54;2322632++"#"&'&'&'&#*#"#"&+"#"&5%4&+23265/gvX  L)8++ CV&7/A   I : ;  E#$4 %$Gk4& u )-L  &IC, _V Ei(Ln4'>32#"'>4>7#*+"54?>32;263:;2+"&'&'&'&'"&#"#"&+"#")!hN-3rbe +1  2  '  /7-  4  9 [ 72# 5?d  -      5.d, KM. sO% / 8O7467#"&'&'&54;2322+*#".'.#"+"&5/fwX  L)7  '@-    2  :5HL !Hl4& u  #" %"&>  }4'632326;>7632#"&'322+".'.#"#"&+"#"&5467#"'.'&#"##"'#"8#! 1'B! b   9&/07  ,;,  P 47 ,' ;  gvK(}#1 1 L/ 4.U%   %=!&El+   GkT @#Bm\7467#"'&54?65454.1&5463637632632#"=46=4.#"#".'454&B:   $'OQ33 #& )# 4Q #)  LbS!  *k/ 5$  B.+(v  nAmk7467#"54?65454.1&546?632632672#"&5#"&54654&#"2#"5'.A;    $'OR%B7'*99  &  7'7P.& J` S!  *k/=0?   6* )# !(-8wF,UBmZ7467#"54654&546723>3263232727>32#"'#"54654&##".'454&B:   'MR>b 1 C#! "9M G=);%5O? Lb *k/;C# ,3 D;91y  nJmT47"#"'&5654'.'&5463637632632"#"=46=4&#"#"&JG% $GX14 #(7'8J H ]=   c( 6&57C  ,5qX!& 0AmYg7467#"'&54?65454.1&54636376326322#"&546=4&#"2#&5'.26=4&#3A;   $'OQ%B8 5N(%@7S $ ''1J`S!  *k/32u= B    $' XE43 + )7,29   %   \ F7 |) .A( 5#08?>/5 [6"*P0  BmX7467#"'&54?65454.1&5463637632632##"&54654.#"##"&5'&B;  $'OR22  %")&6R  (  LaS!  *k/ 4#b  %r&0 s ""0Q>Cv4&54;2#*+"546"&547#+".'&54654.#"+"54&5'&54>32:32;26;232632#"&#"7"32654&L  0 1r)5]7 .#7M9  "1V5Jq * /  ( 2 +54+ 5 .9"!#  7S Lw5'yY  E92;22B$ 6F9'SH6(&7!! >Cu4&546;2+"54647#+"&54654.#"+"&54&5&54>232>76;2;2632#"&5#+"L 0 1*i ; )7M 9  "2VjQ(fP9[ 0.8.G9 R L &2Z352; $*A$ 6F:(&8.', Y  2 7* QoCs4&54;2#*+"546232?674654654&+"+"&54>3232+"&54674'"&#"#"&'&54654&547632_  0 1i@XO ) 8 *L0Wx9  6  =$(    7S LC kOK8QC ;PA.s]  1  / :22QCy4&54;2#"&+"546##"&#"&#"#"&54654'&54323267654&546=4654&##*+"&54654>32324&+326_<  3x\H (/:#2$E`A2-0 8 )U8Wy!.:(f%5  V L   *.,  $ %&IY7    M[?t^ l>hC4&54;2#"&+"546"&5"#+".'&54654&#"+"&5.5>763223:;254654.'&54;22632L<  3(8 7 5*'.!  7 =08F4[ N% T* V L9) 33PY    ?J,+(L*W9[`  Cn &-) 6  <,3  63237>322#".'&#"#632#"=46=4.#"#".'454&5467#"'&54?465454#&##"+"'2654'5632} gD) 00& 1OQ33 #& )# 4Q #)  : . $_&#/*=#. n/ 5$  =.+(v  nLbV .%  63237>322#".'&#"#632672#"&5##"&54654&#"2#"5'.5467#"'&54?465454#&##"+"'2654'5632} gD) 00& 1OR%B7'*99     7'7P.& ; . $_&#/*=#. n/=0?   6* R ) # !(-8wF,UJ`V .%  4./632>?>32#"'63232767>32#"'#"54654654&##".'4&5467#"54?654#""#"'26?#/*-? v"/  7)I: MR>b0 C#! "9M G=) ;%5OL  :   : $m &$   . 4(1 /;C#' ,3 D 91y   nLbV . ~63237>322#".'&#"#632"#"=46=4&#"#"&547"#"'&54654#"##"+"'2654'5632} gD) 00& 1GX14 #(7'8J H G%. $_&#/*=#. 'J( 6&57C  ,5qX!& 0E]=r .%  Z63237>322#".'&#"#6322#"&546=4&#"2#&5'.5467#"'&54?465454#&##"+"'2654'563226=4&#3} gD) 00& 1OQ%B8 5N(%@7S $ ; . $_&#/*''1=#. n/322#".'&#"#632##"54654&#">32#"&5&547#"'&547#"'&54?654'&##"+"'2654'5632} gD) 00& 1XE43 + )6,29   %  = B  . $_&#/*=#. L ( 5#08?>/5 [6"*P0    \ F7J% .%  63237>322#".'&#"#632##"&54654.#"##"&5'&5467#"'&54?465454#&##"+"'2654'5632} gD) 00& 1OR22  %")&6R  (  ;. $_&#/*=#. n/ 4#b  %r&0 s ""0QLaV .%  663237>322#".'&#"#63222636322632#"&#"#"&547#*#"#"=654&#"#".'454&5467#"'&54?465454#&##"+"'2654'56322>4.#"} gD) 00& 1OQ32V+  /0 )55+2 0 )4: / ):%5Q$)  : . $_&#/*#=#. n/ 6% 6$)77'@:2v nLbV .% D " e2>72326;>32#".'&#"#"63232>763:;23:;232632#"&5#+"&546547###"&=4654654&#"2#"&'&54>7"#"5>54#"#"&#+"'>54'6323 ?. [ C1   #' &\G21] P8 a  -)9.L^  >"4S.  "6  2O-  7 >%.  V. 6%((* T    7+  $! 7/x,FV6V" v ! # 267263>32#".'"#63232+"&54674.5##"&54654&54323274754.#"+"&5467#"4654##"&#+"'2654'56323:APD*! &% 5+8'CA&9  F Ig8+*'C'(4 7 9&)$ #O-'#3! > #. _#2eH  0  / 1; * @8 7$&{;2  7b ! #/23263>32#".#"#63232##"&#"#"&54654&54322>76=4&++"&567#"4654##"&##"'2654'56323264&+26, Z D*  & 1.3W|!.:(\H' Y7--D4.C)$14H)$ %)O- '#3! 9%8#P#. _#q[1   > 5  =\wi-b ! # Hl  63237>322#".'&#"#6323265654'&54;:322632#"&5###"54654&#"2#"5'.5467#"'&54?465454#&##"+"'2654'5632} gD) 00& 1OR8]) M P2*8    ( %<#5QG' ; . $_&#/*=#. n/30-  <  2 6+35I.25/v F,UJ`V .% @Y,:I2>;2;+"*#"#"&#"##"&54>&#"326%4&#"32>@ 12 XZ""-a !  *  6NT #5_5;  3, !/:&: "076323#".'"#"&5"#"#"&#"#"5467632764&#"%4&#"327>.7J hf//. c9 :%( G= %  -K&$@$R<8 (:& = " ;UAv / /  h($@;  "*'{A2 _e\c73Qc2672632#"&543232654&#"3263>32#"'+".5>7#"&54>32>7"&#"('4-@T %?', ?(#   HC.3,FU04)134 "M&,&73>S"547#"&54>32>3>7>32#"543232654&#"32>767"&#"!;!?J4L=   3=VhLA  =&  !7~)"  $7" =2/DM9C` <@*9h`  g" ,&Kv4DR^"54?67#"&54673263>2>762"#"5463>74&#"2#"32>7"2654'4&+:=Hwk  "P=5 G  )<!"=<$=9!D+  :S#"*# !%{: ;2BY!1))-$#S5lxY %  g" !#@!Y L @YP]u26;327>32#".#""#"#*#"+"#"&#"##"#"&5467>&#"326%4&#"327>A %pYG C-   -3! !%<(!  <!PR#s2<  3, !08& ->"HE       6K',90p%1:#?5a4)6AM7"=4676?67"&54>7326;2#*#"+32674&+2326DBc 'n_ /S6 'Wi_9%  !E. 5 9G3$*3 3# 2?> :$"/'P?>T  + ;6 !=58&A2N8".54767632632+"73>76=4654.'!*;|   .0P8J" s *:%  (SAM8{A[  EP2h' e  !(:8%2EN5Q"&54>76326322672#".5+*73>76=4654.'/ +?9#  -&-)  2&0 R4M R*:%  (TwxAb;&  6$7 0 *( p (=  !(:8%2F<WPf4.547#*#"&+"&54632326327>3#"'"&+".'4654?6%32632>54&#"  4@z(?  E ]H,"2%T:  B  <" 1+4Nb( :,L^v'M#    "- 2   @!,S./K<0W1G%"5474?654.547#*#"&+"&54632;2#32632>54&#"# R  4@z(F g  " 1+4Nb" :,L^v'M  !,S./K;NCUd4&5465+"#"&5467632;23+"#"&+"&54>?>'2654&#"3724&'"&"3256#!95&?OY#C * #A?  8 6 ?4L#*"+   K1H <(1=#F-P  @$   }$!::?$6 .& #1Q% A0/D7467&/.5&54;2"2"#"&73267654654.'A@Z @  (Z :,n #8g: E1+ot, . 5%$:$$+ #OX{^4 -; >R@C+N*97"&54>767&=47>32+"+2>54#"t!C.Mr>YO H1A{  #4u 8E@N)($,Q63?+S + =(~x ]"T7>54.54>:172632#"&=67###"5454'0.547>32  $ . 80  % &/ B*H K)#$"" !#BJ$"f7>54'.54763632>72#"&5#"&547###"5454'0.547>32  !#g. *(;=  $#  % &/ B*H K$ !"0 5+M.(*!#BJ$"b7>54.54>326323272>7>32#"'.##"&54>7##"&5454.5432    (. (  C%   *1=a  F/ Z*H K"#!2     " (. !-X5  %J"S7>54.54>:172632#"&=67"#"#"5654.547636372 $ . 80EJ$  K(. 9 d K)#$"" D  ? $"Rf7>54'.547>322#"#"&547###"5454'0.547>3226=4654&+"3  = "4&!E$  % &/ B*"+"!+  H K$ & %BK   !#BJ$(% f2>74654'.54763632#"&=4>5##"54?654&+"#"&54654&546326B& *  O###!&qx  #BCA "% %6  1"97>54.54632#"547#"5454.5432   E). [( @&/ Z*H<1  >9&g  BJ"tr7>54.543263232632#"&5"#"'#"'#"&54654&54>7632727&54?""#"5654.54372 B+/ $ )*9 0  : W -)  &    K(. !9 d L B"$17) !) 2 ?D  ?  $&5`?>7>32#"&'#"&=467#"#"5454&#"#"&54654&54>7632 ='-h0.&8, E    *+'/<+':S4a#M%.( 2 5' P(  S D.$#?2632#"&'>2#"&5"#"&=467#"#"54?654&#"#".=4654'4&54>76;2 =' s1.&8 7f* *(; $#      ! '  <+ :S*3##M%.+ 2 5' #%90 5+$!" =`"#D FA $# ?2632#"&'3276707>32#".#"#"=4>7#"#"54?654&#"#".=4654'4&54>76;2 =' s1%&8% ! D 9+   ,6$ _(    ! '  <+ :S*3##M%.+ 3 5'F     B ~P =`"#D FA $# ?2632#"&'#&=4671#&'4&5>54&#"#"&54654&54>763.\C =' s1.&8 , *#$ FTI   & *4L *@ M%.+ 2 5' +*(A  $/;]&!  &9  2 &5{?>?2632#"&'2+"##"54>7#"#"54?654&#"#".=4654'4&54>76;226=4654&+"3 =' s1.&8% %5- #)     ! '  <+ :S*3##+"!+  #M%.+ 2 5'0;n?M AVy& =`"#D FA $# 7635#"#"'"54654&54323:;2326;23267>32#*##"&+#67267>?2>72#".'#"54&4>7"#"#"5454#"(4S ,'+  4'>, - #  A'3 %(!6 #]KD, @2(#,, 0 %# ')f  ^%.-$ 3   A   !+# "-#  8 ,! "'3 &  -&   @ dz  !96=< &9 &42>72>?>7>32#"&'#"&5467#"#"54?654&#"#".=4654'4&54>76;2CN *r0 3&9" (!'   ! '  <+ :S*3##)' 1 5'  2k=`"#D FA $# ?2632#"&'32632#"&5"#'"#"'#"&'&54654'&547>;263&=467#&'4&5>54&#"+"&54654&547>763:.\C =' s1.&8#   } +(: '  . I& & A6 !FT I   & +7D *@ M%.+ 2 5' nG  8 6*#3 0    $ /;]&!  &9  2 0(-;##"&+"&=4.54>;2'">74} %  '! #:eB;2#327272632">74)9   - 15qQ65'4F-! ## e *'3"7Q%i5,` 9d"6)!;<$$(@$     1  E/'5).0(Yg%"&5<5#+"&=4.54>;2#254.47632;232632#"&5">74U C )7sQ @3} &B  7) i1*:'3"7Q%z B &T1#!::"'Mf# ; 7+ E/'5).%OD+=723267.54632#"&"#"ʎ'56">54&!E 4"o] 7  BTC6*K!4)8- g ^W-`v\Mg  5." ,7&!:%&0L(M^k%"&#"+"&547&'+"&=4.54!32#3326322632">54&"32654. = ( #<"   4 <1y$  1$ 0. !'% )!.G'"X ' L ' T /&'Ne&  '&">( #+  4iDQ]7232327.54632#;254.54763:;2+"'#'&#""&54654'&5463:"654&m6.,nz !)@  + 7>)F#- 5(*  (; | %4Xu]Mf&9& O8 !&  #> 2 +@2$%0(GU"&5"#"&##+"&=4.54>;2>32%">74X*9< $-Y5% +8oM<-+J 2'3"7Q%8)"] 'S'8*::$&5.   E/'5).%26GS72327.5<547632#32632#"&5'#"&54654'4&5&54">54&VA(B AGEu ; U .':4:)1%,D3?+% _F$+ "-Lg\2 6, 0< 3 Uh"B++GD}2327&54>32#326?63232632#"&5#*#"#"#"54654&##".#"#"&54654&5476%2>54&#"W"B6*DE$ $'$" ,3i )):6H l  ;#3 .6'(./ ; 86+>Z& #  6, )'  #  +2 1.7")<,7+/D2327&54>32# 26372632326372>32#".'&#"#"#"&54?64&+#".#"#"&54654&5476%2>54&#"W"B6*DE$ $'$" ($ H =3& 4&' ($ ,  L  ;#3 .6'(./ ; 86+>Z&      -  &v  +2 1.7")<,7+`Dds22327&54>32#32637632#*#"#"&54?674#"#".#"#"&54654&5476%2>54&#"V*< 0*DE$ $'$"   #("  43  0n  <(1 .6'(./ : 86+>Z&       (  (8 8 /7")<,7%6IU_72327.5<547632#332>32#"&#"#"&547'#"&54654'4&5&54">54&"264&VA(B AGEu ; " ,'C;(! 2 ) (5:)1%,D3?+%, _F$+ "-Lg\  >%!))" 0< 3 Uh"B+c"*%6bn72327.5<=4>3232672#"&5#"'"#32632#"&5'#"&54654'4&5&54">54&VA(A 0eIHF,1B. *+7A  $)T4 ; U /':4:)1%,D3?+% ]C#?A'"-41 2 7*\3 6, 0< 3 Uh"B+QEDT7467&54>3232632#"&5"/.#+"&">54&QmbA .T5A`:WD  :, B" 0,:: =K *c/?)<(/IAL$3*)04L%  * 5. }D XD #!( '+tD2327&54>32327>36323:32632#"&5#"&#"##"&'&54654&5467263&54?654#""#"'&#"#"&54654&5476%2>54&#"W"B6*DE$$5C4   "H0  )):B6 3 15(1T6 ;o$  9&1 .6'(./ ; 86+>[$7  1 6+#Q 2    +(5 1.7")<,7%l.Zc46;2+"&5232>7'&54632#7>32#"./.#"#"&54654&54"654&1 @  D #>!aQ97!i1s7 )  '98, 031 %D/  E  C dF1Tp +FS' 2    F 3:h#0=4632;2#*+"&5<52327.54632#3263263232672#"&5#"2#"547>54+#"&'4654&5476"2>54&  1  1-;-)+v_k &:51B. *(9 . Q7 %81# , &..  &%  7  s'BQZFS'  2 8*0 %  )  2=<-0 )f=4632;2#*+"&5<54654&54763223>7.54632#3263?2632676323+"'"+"#"54?654.#*#"#"&"2>54&  0  1 =#%&-xb1M5"## % %.+  T  1 N%*9 =w!<(1D &  (%  9 #3 w'CR\*= ? >0.3   )9 3"6 "&=g{4632;2#*+"&5<52327.54632#326376322#"547>54+#"&'4654&5476"2>54&  1  1-;-)+v_k '"#; Q7 %81# , &..  &%  7  s'BQZFS>" %  )  2=<-0 )%S.T^h46;2+"&5232>7'&54632#32>32#"&#"#"&547'#"&54654&54"654&"264&1 .  >#>!aQ97!i' E<(! . & ',031 %'/* <  B dF1Tp +FSv *>&!))6( F 3  TM$h#00,%.mv46;2+"&5045232>7.54>3232632#"&5##7>32#"./&'"#"&54654&54"654&1 B  @ #>!&J3 0U!)8De1s7 )   031 %D/  G B XK#??(]  5,>R' 2  ' F 3  :h#04=Xl4632;2#*+"&5<5467.54632#32632#"&5"/&#"#"&+"&"2>54&N  1  1hh!!zbk2d2 G ,'7831Y  &b..  &%  7 Jz!`#EO[ES*  3 9* tR  <-0 )Xv46;2#*+"&5<52127275.54632#326323023262#"&5#"#"'&54654'&547>3&4?654#"#"&54654'&54?>54&#"326 0  0)8*&-ycl%A66 - +'9y$C2%'.+h)9+18Y%'5 _ 8  v'DQ\DS? 2 6+  000   $k$     < 3x B4(559%A2>7>;2>?2>762#"'"+*#"5467""&#>54'>232>7'&54632#7>32#"./&'"#"&54654&5&54"654&B 1 8 < $8L 7 B 5'Z! 37#>!aQ97!i1s7 )   031%D/_3   03 O 1)#"  dF1Tp +FS' 2  & F 3  :h#0/2?327>;2#"'+"&54>7##"'>54'62327.54632#3263263232672#"&5#"2#"547>54+#"&'4654&5476"2>54&BI'wD* ;+4IS 8 4P2  -;-)+v_k &:51B. *(9 . Q7 %81# , &..  &n3 # ,!3L "! $ s'BQZFS'  2 8*0 %  )  2=<-0 )fE2>32>;2".'&#"#*+"&547"#"'>54'6323264654&54763223>7.54632#3263?2632676323+"'"+"#"54?654.#*#"#"&"2>54&D-=D*$ 8:& "  7  S!  3"# 2& =#%&-xb1M5"## % %.-  T  1 N%*9 =w!<(1D &  (K#/ D 7# 3 w'CR\*= ? >0 .3   )9 3"6 "&/z2?327>;2#"'+"&54>7##"'>54'62327.54632#326376322#"547>54+#"&'4654&5476"2>54&BI'wD* ;+4IS 8 4P2  -;-)+v_k '"#; Q7 %81# , &..  &n3 # ,!3L "! $ s'BQZFS>" %  )  2=<-0 )%SM2>7>;2636?2>76322+"'"#*+*#"'&5467""&#>54'>232>7'&54632#2637632#"&#"#"&547'#"&54654&54"654&"264&B 1 )     $. L 7  9  5'Z! 37#>!aQ97!i'  E<(! . & ',031 %D/*_3   03 71)#"  dF1Tp +FSv *>&!))6( F 3  $h#00,%M2>7>;2636?2>76322+"'"#*+*#"'&5467""&#>54'>232>7.54>3232632#"&5##7>32#"./&/&/"&#"#"&54654&54"654&B 1 )     $. L 7  9  5'Z! 37#>!&J3 0U!)8De1s7 )  .%7  031 %D/_3   03 71)#"  XK#??(]  5,>R' 2     F 3 $h#04/k2?327>;2#"'+"&54>7##"'>54'6467.54632#32632#"&5"/&#"#"&+"&"2>54&BI'wD* ;+4IS 8 4P2  Vhh!!zbk2d2 G ,'7831Y  &b..  &n3 # ,!3L "! $NJz!`#EO[ES*  3 9* tR  <-0 ) XE4'632323?26;>2>7>32#".#"#*+"&5<=#"'>2327275.54632#326323023262#"&5#"#"'&54654'&547>3&4?654#"#"&54654'&54?>54&#"326E)-"  -, B&   %  ? 86 V0 "(8*&-ycl%A66 - +'9y$C2%'.+h)9+18Y%'5 M 1  : 2"# v'DQ\DS? 2 6+  000   $k$     < 3x B4(559#55%45.'"".54654&54673>3"#"G4$9+ )?'61LH  (3d$: -J0  K0 #5J"54765.'"#".54654&547263>72#".'"(& 44$B# {T&0MF]$ 3 #3   6B $: 5D4 K0 1 *   #5>%45.'"".54654&5467376323267>323#".#"H4$:+ +=-,.TH 6E4:+4& )3l $: .J0  G8  % '%B2I4.#"#"&'&5467654&54>7632##"&54654&547>;2>54&5" H& *j%$+$M )8^iO;+,g1Ke6 0  >: , :0Y:Q;$*P 4 "CO6!!#E5;I2#"##"54?654&##".=4654&546732634&+;262#<'*4 *;HE7 )3PH4#"#".546=4&547672765<=4.47>322"&54?>i  + X+ EJJ > U) . %+2   + & H&F"  T )#@5Xe%45.'"#".4654&547673>3;267232632#"&#"#"&547#""#""32654&G4$B# U)71LU & 9 *47- - 0 )3e*  ( +!3d$: 5D2  I6Z  6R38%  6###<5n%46?4&'"#".4654&547263;2464.547632;222632#"&5"&+"5467###.$5$2%{T&5H A  ) ,6P-*9;# B/  M1 [\'9 33 2Q+(22p 1 7, 5+ %5_4'"&##".54654&5473263232+"#"&=4654'&+"#"&'4654&54>?>II G ^y0G76?67654&#""#".54654&54673>;22#"74./"32561GD2&$$B , ^7$!"&  (?/E 5KLG_&7/<  (FY  88 4     = 4 %5 2  H& *! M =% #5d%46?4&'"#".4654&5472633:326746=4&5476;2632#"&5+"+##.$5$2%{T&5H 8  C U3,7 !W/  M1 [\'9 33 2Q+(H ,= 1 9/+ %T1f4'56323?2>7>;23#".'"#"45.'""&54654&54673>3"#"-),/,  D' ;$' >+7G4$9+')?'61LH  (^!  -  d$: -J 0  K0 .w4'56323?2>7>32#".'"#""54765.'"#".54654&547263>72#".'"-),/,  D' ;$' >+75& 44$B# {T&0M F]$ 3 #3   ^!  -  6B $: 5D4 K0 1 *   1p4'56323?2>7>;23#".'"#"45.'"".54654&5467376323267>323#".#"-),/,  D' ;$' <,7H4$:+ +=-,.TH 6E4:+4& )^!  -  l $: .J0  G8  % '%92267:62>7>32#".'##"#"ʎ'56"##"&'&54654'&54632632##"&54654&547>7654&=4&!)   D%   *1'  ZQ$+6) $ ' I*^!2R2a{`;+, i|8         2!!2 *  ?H CX; *P 4 .00Z <41ft4'56323?2>7>;23#".'"#"45.'"#".54654&54726322+"#"74&+;265-),/,  D' ;$' >+7H4$ +z\-Q2K` %8,#)# +^!  -  c $:  %*1 H6  !`9T2fr22672>7>32#".##"#">54'56#&56?65.#"##"&#"#"&546322>322654&#"d@   H :*6 $  ZQ8, * &$02'!6+5 'cK&:;5LH2   )" " 7L $;")6 )":G Q*6*)Fk267>77>;2+".#2"&54?>54#"#".546=4&5463267654&=+"'>54'6U@ ( - 8A1   *4#  &JJ > U) i B$R &6 Q0 !p3%   [&F"  T ).5D3   >"#?k463>32632###.=4&'&#"#"&5465?#"=46567>d 259g ".F)  C  =)  =/& +    *r]3   "   G   >V-O^?463>326327673233#".'"#"#"##&=4&54.'&#"#"&5465?#"=46567>d 44(8/$A ^   )6%    #&$ ,:  C  =)  %E,7    D" . 4PX' &    G   >V-O^?463>3263232?>76;2#".#""#&=4.'&#"##"&5465?#"=46567>d ):6a    0& 52% -7 F  =)  6..    1  ;3Z`( G   >V-O^>Q4>74>7232##"'454&'"54?67"#"#"&>8ab9 WpL (*9_R' B) :E3349R*92   ,]-6 5 -e#"F.* ,?j|263232+##".=4'.#"#"&5465?#"=46567>3463>4&+;265 -67c#3E/&8)) $B)!F  =)W  "0' (7/)x # $( G   >V-O^   1G465"#*+"=>32#*+"=.'32+"&546?#"&62?+ 0BcO: 3 +0)) 9  ( Ua/ E0 (Ij(M2  "4 ;R K )65?X"=4674326;232623##"54654'"##"54>7"e&;  BQH $,  % (%5,#  <  2'a 9lc  1 9Xn '>sK/?Wz463>32>323263#"&5"#'"#"'#"&54654&543263&54.#"#"#"&546567#"#&546d  1&  ~ 3(:*  . ;34*y- 0 ,'( Zb ;l   %4$A'&', 7)Q 0#*AL60 ,n$  ! P] C  n?)mx263232+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>4&+32546%4&+325464&#"#326 ;M+K1 SO!0& 8%4H; XM!0& Z) V^P!0& 8%"z %2 #?4%#?P'#$,*$+m/! 9-JZ3 4 . 0 ("lU-! =H[$1Tl+ -?+ l?a263263:;2672#"&5#32+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>4&+32546%4&+325464&#"#326 =J9k KD'-)9jSO!0& 8%4H; XM!0& Z) V^P!0& 8%"z %2 #?4%#?P'#$,6* 2 6,2r/! 9-JZ3 4 . 0 ("lU-! =H[$1Tl+ -?+ l?ko{2632;2632#"&5"&#"#"&=4.'&#"32+#"54654672+#"#&5467>34632>4&+325464&#"#326 =JM[ *(: - !* 3I": XM!0& Z) V^P!0& 8%"z %#?P'#$,\Y8o,  1 8*,_e 3#. 0 ("lU-! =H[$1T-?+ l*et>34637632232632322+#.5?=4#:32;#+"&5467#2##"&546574#"326546!4&+232654&+326514QX&$ $UL87J  -  !.VF**$ _o=QVFZ> &_'(B"& "&N//  } /% ;b'L "*  4 *#") + /- ll?26323:;>3>32+"#"&5#32+#"#&=4.'&#"32+#"54654672+#"#&5467>34632>"32654&4&+32546%4&+325464&#"#326 =K|I ;# B'53<O "9JSO!0& 8%4H; XM!0& Z) V^P!0& 8%"z [! "!%2 #?4%#?P'#$,m 7)#8.5Q>(#".)"w& )S0=Wj8&-0 7I /") ;b45 F 7 ' I[E/% ; '!&Fu 0  + ?Qi46376326323262#"&5#"'"#"'#"&54654&5473>7&=4'.#"32##"#"5465"2##"&54>4&#"&#"46326%4.#"#326 , 9NM ( )(<*  , <9+/q %R.BUJMO:& O2G!5!H!M") 6$B)l ,^Y?h+ 0 5+*D 0&%(- T.1 $ o  >]J'p #lF6^Wd7467.54>765<=46;22#"&#"#".5.'4&+"+"2654&#"FY698*11 8 8ZM`NP  >F ..\B%/ 67@A('4  +  991*>$*)   D v6 2=$(%'# $3G^Ta7467.54>=46;2232672#"&5+"&'.'4.+"+"2654&#"GW798*11 G 8ZM`DU&m .-9C ?13F I,\B%/ 65BA('4 + 991*>$ 1 7(J! 8E u:  2=$(%'# $3F%^o|7467.54>765<=46;223272>7632#"'"#""&+".5.'4&+"+"2654&#"FY698*11 8 8ZM`nP )5K%   ?L #,/\B%/ 67@A('4  +  991*>$%G  - 1  R mA 2=$(%'# $386^HU74>7.54726=46;22+"&'.'4&+"&5+".72654&#"8#2) (7Az304 @&I  ;M;!(*54 <)]65 W /  dd  5F    6*#- + #5F^Yft7467.54>765<=46;2232+"#"&#*+./.'4&+"+"&2654&#"4&#"#3265FY698*11 8 8ZM`RQM^^(   $MF <\B%/ 6s' $5BA('4  +  991*>$ * "N w5 =$(%'# $3,+F^u7467.54>765<=46;2;2632#"&5#*#"2#"&#"#".5.'4&+"+"2654&#"FY698*11 8 +0; \ 1*9:NP  >F ..\B%/ 67@A('4  +  9 +1 5+ /4*)   D v6 2=$(%'# $3F^MZ7467.54>765<=46;22#*+"&'4&54&+"+"&2654&#"FY698*11 8 8ZM`ZY -/OE <\B%/ 65BA('4  +  991*>$ /  x5 =$(%'# $38v^74>7.547265<=46;2237>32#"&'"/##"&'&54654'&54>762>7&=4&'4&+"&5<5+".72654&#"8#2) (7 0 z304zV"N)&6,< I$ &  C3%N   ;M;!(*54 <)]. % W / 'D00 8&  "2 2   P   6*#- + #5F6 HU7467.54>322#"&#"#".5.'4&+"+"2654&#"FY698'??" >?&,/INO  >F ..\B%/ 67@B($5 1!2 *)   D v6 2=$(%'# $3G P]7467.54>32232672#"&5+"&'.'4.+"+"2654&#"GW798'??" >?&,/I$&m .-9C ?13F I,\B%/ 65BB($5 1!2 1 7(J! 4F u:  2=$(%'# $3F% `m7467.54>3223272>7632#"'"#""&+".5.'4&+"+"2654&#"FY698'??" >?&,/InP )5K%   ?L #,/\B%/ 67@B($5 1!2%G  - 1  R mA 2=$(%'# $386 :H74>7.546322+".'.+"&5+".72654&#"8#2) *4[jXl214 3&H  ;M;! "54 >(1NA8 0   $RC    6*#-%#5F JWe7467.54>32232+"#"&#*+./.'4&+"+"&2654&#"4&#"#3265FY698'??" >?&,/IRQM^^(   $MF <\B%/ 6s' $5BB($5 1!2 * "N w5 =$(%'# $3,+F `m7467.54>32;2632#"&5#*#"2#"&#"#".5.'4&+"+"2654&#"FY67:'??"Xk; \ 1*9:NP  >F ..\B%/ 67@B($5 ?41 5+ /4*)   D v6 2=$(%'# $3F >K7467.54>322#*+"&'4&54&+"+"&2654&#"FY698'??" >?&,/IZY -/OE <\B%/ 65BB($5 1!2 /  x5 =$(%'# $38v ~74>7.54632237>32#"&'"/##"&'&54654'&54>762>7&=4&'4&+"&5<5+".72654&#"8#2) *4[jXl214zV"N)&6,< I$ &  C3%N   ;M;! "54 >(1NA8 0 'D00 8&  "2 2   P   6*#-%#5Z4G74&547632632+*#"#"#".7>?26=4.'32676=]( /L'+( % o] # #   ^%9:@J7|(7=E "!!+!b/)=& %#[4HW%#"&5+"#"'.54>326322672%>?26=4.'37>765)(9A+:$ K .?85EDu] #  ! 3(+% 6+U +UeCj@)I="` /[ "*7 ) 3G-@f ""A&6NZ7"&54>7>7"&54>726327>3#"'#"&#4.#">7263:32765 7j!G/*AT FXH-!"2,J(     I0 "  )!z8-(2'[0 >:-  !, 3      ;,%M&"&(;D7"54>7"&54>72632+4.">72632765&"h H2()@  4 NX( w 8H #!N7".546726322+"+"&544.#">7263:32765"232654& %LM0YM(?W\Lr%6+  E    I0 " *"s B) +2W Y- $#*       ;,%M& +*  A00GQ2"2#"'.54767&'46;2654&'.'>2=! (Z .-@$/ >)% @ $     VP:0. 5%&A#2 (@49% {  A  ' T'/ @7C+N*3>7"&54>767&=47>32+"+.#">=t!C.Mr>YO H1A{   tN#7D8 8E@N)($,Q63?+S % sM6 -ZIFHV%#".+*+#"&4>54.'&54?632>26;:>46763%32654&#""*6 '775IA\\A $9 '!;;J!6T" ($]! 7D2;+' 6+a?j]GEW0A)G:.8-"!7Q)#203!GIG[p7"'54?>7#"&54>54./&476376326;27>32#"'2+;2>7654'  !=/9(88( #*KB !.P-"   *2J S:  Q5F  ,  $  C +$";+)5  949 <0     , s + %  IG[263236;265463:;2+"##"&54>54.'&476?6.#"#""3265' 6L6$,)$9( @ E("1_,:NA\\A 9 T 2    7(7$I?&'/="0*#97  ?W$B54^GFX0  ,,'"*(%!/IGh}%"&'4&5>7"#"&54>54&/&54763726>;2332672#"&5"&#*#"+"37>54+1 EB9*==* H %5_ +!&  R 2*9 )    ~-$<)(2 2*>=    D 1 6,` E,  " #9IUcp"&547"&#"#"&#"#"&4>54.'&54?632632632;26323263#"&#"%32654&#"2654.#"A-+ #'' .6';MA\\A $9 ' 2C:1E.  !$-A,2;;29#;"%5* $)QA Aj]HEW0> !#)6#7!*!2J8 +$#63(  #1't%"54?>7"#"&=4>7632;2632#"&547#"2>54.54;2;2632#"&5#"+ >R8/RN:F7   4)AH*: ++E*6 Hd  ();`  ?%,O)-7Q0  -(85*K! #?1 7+ G# *JR\l%#".+"##"&5&54>7263232632#"&#"#".5476326;2>322654&"32654&#":+1$ +%-K).I(9Q367&5>7"#"&54>54.543632>;2>72632#"&5"32632#".5"+"&##"&546"37>54#"A  $/EB9*==*S 5_ $0<  8X1*9 (f! 3%0 = 9 @$2  &% ^-$<)(2  *>=  ? . 6+| 0 *'3C0|,  " #&dB%45#"&54654&5476?>323>;2#"&5#"*R1%,u FB2 W(): Y !E 25 3   2 5, ] &dZ%4?#"&54654&5476?>323>;2#"&5767323#".#"#"&+R1%,u FB2 W(): ; ]:*0!) * J L" 25 3   2 5, i6  '%j & #&d[%4>7#"&54654&5476?>323>;2#"&532636723#"'#"&#"#"#"&+R1%,u FB2 W():$5 m  /JG  8IOٖ 25 3   2 5, B:= 1  3  Y[47""#"&'467654&54726323>32#"&5##"&54654&54763:;6367>5p;& %m]w& ro 2+8 d:$%  Wp=X>#4  (2 7( y)\8J[2, #?K?&dDS%45#"&54654&5476?>323>;2#"&52#"574&+;265+R1%,u FB2 W(): J_<&")F"+ (I 25 3   2 5, -: B) CeZ67#"&54654&547>7>37>323>32632#"&532#*#".547#"Iz2$&Sv% & U  -*:*V(* 2 9%k  01 2  2 5, &50 <(d["&54>7674'#"&54674&546;2?>?>323>;2#"&5##E;]dc 2%*GF& X():O7Z_f$ 716V5292  11 ,    2 5,3,32;&545#"&54654&5476?>323>;2#"&532632#"&5#@#/  %&R1%,u FB2 W():%`  (<B9 3  25 3   2 5, ]  3 6,1qe2>7>;2>7264676322+"'3267654&47>32#"&54>7>5"#"&#>54'56A 1 )' ! 1 N63td/! L  32#+"&+6363>3:32321#"&+"&'&54>7"*#"&4&'.54654'4.#"#"&#"##"#".%4#"#"#326363>2637.*>" !/8  :' HE(%  *)"4 &   .  "4s$ 4^N%7 e$D"@I7Q3ZI[A    5  &7 #  >9,-! B*E ^ ) +"`5 X 3; 5# 1qkz2>7>;2?264676322#"'6326;265463:;2+"#"&54>5#"&#>54'56"32654&#"< 0 ) : ! :0F2/6e'EG- 9( ? F(#*\-:N,BLB,7 T2!,?!7(="2)I3   '" 3 ,T4W (5( 97 =X#B6*O;C;O)"%|<((%&;+(0.437632#"#"=4>3>72#"=0Q > ;  i  >  ?  E C3GY4376;2"#"="5<=46?632#"467672##"=7467672#"= S ? A =."  L 1  i  > ?W> >   3  A 3A:X\D0C2##"54672364672"#"=43762#&=H  )_*ĥ X  ; PA D    2  A ??:2] +<2"#"54762#"=4347632#"5"54>?632D P *A _ : ~M Q I  ;i-5Q>32+"5<=42#"#"54>>32+"=4d &   %~  ,*@9Sd      / @     /@ 0.E437632"#"=4&#"#"54?>724672"#"=4&0L $ ?L*)_!X  :  > @ x |  2 A0(n,F2#"=4>72632##"=46"=467676;2##"  M L L    >n  5   C  A  A ? ?  0(n6Pl2#"=<5467632#"&5<1=4376!2#"&5<=437632##"5<=<54>764672"#"=4&467672"#"54376;2##"=  L { &  L &  L [ H!X  : 5  : L  W n 5 Ab> ?  > ?  qA  @  2A   2 " =  ?2t|'Od"&'#"&54654'&5432632++"&5467>54./&546;22>54.+"3:3"&5#".5467654&5476326329(8 % *g  3VhU /81-S( ;3",4%"+  l   *8 + R *3. #3  3 ' >O6Da '" )$$4-23&6+ #(%' 1 #t2)Xb#"&5#".54654'&54323>2#"';2654&+"5476;2+".'.54>32"254&#"&5#".54654&547>;263221,8BO13 v j#!, H,M#)!1/FecQ 32"&5+"&57>3:;2632632"&5#"&54654&5476;2632M1(<=K9.+b _~)$ a*9p B  D x[ & ):9-, Yi** 5+ 'K 1   07+ %  *g6+ 'K 0' 0 LtM,@Pv#"&5#"&54654'&5476323>324>3#".7"32654&'&"&5#"&54654&5476;2632M1(<=K9.+b _~)$ 2J>7E.u]4Q- o !5,A  ):9-, Yi** 5+ 'K 1   03M&'O532#"'#"&54>54632;232632#"&5#*#*323763>323"&5#".54654'&5476;263231)<=L9-b _~)$  B&0A'77'  5/T1*95 X'f I-*89- Yi*) 4, (J /  A ,%>- ;./=" / 1 7+E7% #'$-6+ (K1 ' 1 `2&i{#"&5#"&54654&5476;26324.'6322726322#+".'4&547>7654'+#"&#>4&#";2564#"&5#".54654&54763263220,9\ZH. Wj #3  n LD_\HB 3 % M/#F,  Q',9\Z% O|  6(  ;8 /' 0   . *"  6U !#) % 6(  "3 3' 2O`&q2632#"&'#"&54654&5464&#"#"&54654&547>3263263232727>32#".'""#"5476#"&5#".54654&5432632i+-7\Z$ )B % 2%,J[1( /I% ;)8& 0I/ 0-8Z]++^} d' 3 6(  "2  5   32 2  6    *"=( 6(  *8 1' 1QZ(>32#"&5#"&54654&5476;2"&54654'&54>7#"&54654'&54326;2632#".'2632#"&5##"&5#".54654&54763232632V}t   (<{A$, L' &+Y+PA&)vM1K* #R0 .*8TW_3,,8|?' > ( h  u  3 6+D: 3 x 0  * 0C . + + 16* 01T 9( *C 3  'OtO)Zm#"&5#"&54654&5476726323263222>?>54.54>32#"&54654&54?63232>7"&'#".54>7654&54>32632O2)99-* I A  ?D N-=\3@X$) 5   )8 + '&.C ,) 5+ (J 3 ( 247 @(CQG0X  &#)/ #Z2. #(  '2 2`2'Mt#"&5#".54654&5476;2632>54.54763732+"&'4&#"&5#".54654&54763263220,9\ZH Wj 9 ; &5 #1`',9\Z% O|  6(  ;8.' 0s  6     6(  "3 3' 2%d&2632#"&5#".54654&54324>54'#".54654&54;2$76;2#"&52#*+"&'4+"+"&5"&5#".54654&54;2>32e ));G!Xv,,`2%j (*#  1+9a  5C+ 7 d T  Aw+9j09-M \{B 1r")5, :735+,;!  112  6+   */*%Ald'#6+ (I2  fd&l"&5#".54654&54323263246;2#*+*#"&'&54654&#"#"&546323265"&'#"&54654&5476;2632^)9 *!X^*]H XR * ,"65Ccg8  !%*8f37,2 Hx  0 6+  "'3" 1 FT6Iu $t36H)#2J$ZGTm $8"(aP@3. 'J2 !1 Hf)"&5#"&54654&54&5476;2632"5&54?67&'#"&546545&54;232635465.54;2>54&54;2+#"&5#".54654'&5476;2632A.72$, N#f  )P  .?;dJ*$ 5  :  5 HDJC>)(;f3&  O#c6) .. 1  !2 W #3  ,G  B #V  # : U!   5* "1 /  ! 26f+t#"&5#".54654&54;26323>324>7#"&54654&5476;2326?632>54.5476;+"&#"&5#".54654&54;263232632-7|++Io 3'" 8 !3C ID0-8|HKQ  7(  )72&; 7S 2F Q   a   )   6)  :7 2! 1Cd,v#"&5#"&54654&5476323>32"5467#"&54654'&5476326;2632#"&5"#"#"#*#".54654'.5467>3>;22>32632#"&5+"#"&5#"&54654&54;2632v  (<$ * HTp&$]% *'=N1g .,6;   5\ N  7  o 3(:2J% k91);f32$+ Jk  3 6+  "1  2   Q  !2  0 1 :' 8  5  Z9s$ 6+&Il 5,// 3 ! (1d.s>32#"&5#"&'454654&54;2"'#".54>3>3232632#"&#"#".547"32>7>32"32654."&5#".54654'&54763:;2632So%$/';$ &M  K2F2:0(7K79 C !19 :#- TST2" /  :* "):f3$   I k 2r  5 6+ !2  3 , 6)Lp9$ ($9 '%nQ  '%"$6+ "2 0  ! 2 %fb'#"&5#"&54654&5463232632"54?>7#".54654&54323>;26;>72#".'#"+"&5467##"&5#"&54654&5463232632 +,9 *+ /5s U0 ^2$ c"5 8&~ KKA-- $'    E4/ `)-82$(/5p x1 7(  "( 2 !/Gu4 12 3  1 ) Ej'! 6 6)  ./ 0 ! 22d#,a#"&5#"&'454654&547632326324&547>32#"&+"54654&#"#"&546"&'4?>32;2#"&5#"&54654&54&5476;2632#-(<*`% & C!^I;43 "3#*   =,'c 3Q 1*:f3 ++ He  & 6+"3 0 " 4  3 B  *R 0   (}   5, "' 2  !d#*Sa"&5#"&54654'&547632326322##*+"&54654.546">54&#"&5#".4654'4&54;2632+81Z ** E ] -.TM2   1W| 'MR1)"&54654.'#*+"&54654.54632!>7&5474632!+"654&!"654&"'#".54654'&54>323>32.c/)9A ** RPb   /^wYD!6`t" ,(D)D[Y H9-0(q.#  -} 5 5, "' 0  9  &<.AG5%}?0 # >BZ| 6 6>$Z&57 ['a (I/    %#!5>54&'5!24.#"3 6TX9;[W9m,FrI>N-V\C, 67)AYV6+OQ:%0:2232673#".+3!52654&'52654&#"'+NS2%>(0 +9M/"9&8!978xrY^#J5'= '?CD.O2A]^A7#%@5>SFCH#"#7!#.+!5>56T949U6">> l.RS-7 !@2=%2=4&#""&5467>7.'5!#"5432"32654&)SWOV8?YY;3wU(;,;(\ *J0HH 9%#&,t_E T;IttI8SLg ?-,>i'HP;'SW9, tLM;B;U ?4.#"32>57#"&5!232654#"#"54632#"'+2$(=$  !4!+? d{}76D$(  (9:JB/+T[w<0/M0( $(K-: "0M<+/ÚK?9d  3M?FZ 3!5>5"&462Wd<<n#2##2@  @2##2# B732654.'#53&54>32#"&54654&#"3##"&54632(,6.#xP 32#"&54>3232654.>54."l4 ]Uxd|B/KA`G?0>N'T*#|qFAކ4dN@GDx4AI~TAD7,G7:%7326?#"&'!5>54&'5!6<Z02<<<" @FFF##![L)EG@  @@ <726?. '5!7654&'53#"&54632#20"    ")#|~(- <OO2%"*!=W?G     #-W4).(!'&%#5>54/!3#5>73%3().D%).8t+`u)5m8g723254&'5!#"&5460 & ==XQ+8l B77^g( [)7;2673!5>54&'5!#.+"32673#.+!Hk\%-7 7 6U @%  &>P3Q!55!C& '8>"  '*3254&#"##"&54632354&'5!3#7L,%G-$ '?T;?RUD:P>!@)?#Ef{=QW9H(U6FO<@O@47 7>%+>54&#"#"&54632!5>=4&'53:*/9"%4m53R.(<<((</ O>Jk#*-$3G.FI 4((44(==E'4632#32>76732#"&54632#3265##"&%4.#" 2%"+  -]1]:%F.<@2%"+ ! ; <6 -29y).(!'. 0)B0OcQ8qlCR5).(!'T"\ P0hdA%!5>54&'5!32673#.+><<,<d@  @d!?@  @<<@ (#.+"!5>54&'5!(+)( $79!6%,6"';5!74&"6.546323254&'5!#"'#"&5463232n,04`/9R:d!:@P*::*VJEI9=Eo< 5/#iiXt~B>l9?j  NNnh8hc%WW,# #.'53'.'5!654&'5(S:?''& k!"+ M}&'ߦYF+ R<" FS- !0&54632#"&54#"#"&54632.#"32>54 *0KK 2 (W?HXa?04 0(F!/5!G_Z562G6*"u\dq) #YBG[,G*#"&5463232654&#"!5>54632F@4c4%"6H9BR<<w{UeQvG3$-*#UK5gXt@ !?A|orx,"#5332#"&546323273#&#"3>54&7!  &>OI@p !  7m-LQ.MQ.F'8>"GXgw!!⺢WAR>FAc$ ##5>54&'533!5>5$:>#!>8 7; =&mL1/M7 5D5!#>(4"#"&54632!5>=#".#"#5332;4&"%4m5Ru55?%"""8:|#*-$3GaDy?!!?d;;,= HQ654&'5!32>32#"47>54&#"#"'#"54>7&#"#"&546323254 D,D )%A)90]X+2(1/M)<-8Q;P "`(qW C.(zWKC"!@)=I=F@:q I-*;ERE=\0Mu|?pN*( Oy_z5!3G$9"&54632354&'5!!5>=#"2>54.H}NzB!n 8:::n?\(+7.(,8++5/›Hlk-5 "?O66}aJIsB+*AtJFoB,+!54&'5!!5>=!!5>54&'5!/:: 8: 8:::g66D5 "?5 "?66;6%2>54&#"#"&5432326754&'5!#"&546327,? jT%;/+4 "-!C,C!uo5m4%'>8Qc7u@  @r nM^G3$-*#>332676?. '5!7654'53#".54&'K#,+     ")#{U 2:/:'%O-;%!4."ڴ&BV/V8.K/ V!/JZJ/!(7dX5&=OOP"IL<&%;KJf$%5!#5#"&=#53533#326?4&:,D d 'j,04xxd F  @P 1_r((V?-@ ."326=4&'5!#".5463232673#.{9X6" z6O9,@-ZbJ1:q  `|)@VO(#8,,0IzN!N],62>32!5>54&#"#"&54632uD& 'V@QE DD *T&  EA4c4%HttH{@  @~BTDG3$-*#X2%4#"!5>54&'5!>32!5>5J//: 8:  cP:/ؓ865 "?  c]j68a%2>73!5#"#7!. 3B! P& ) a,$! 53326=4&#"#5>54632!5>=#"&54&' /,.+;:+.,": YH\l55A%HX :;3o@P?a3; 8T^V?!!?m,T8v44.#"32>"&546327326?#"&'0+:71N- ,W<=Y-ۇ~W0+HHpD,*?VO)3bb<4.#"#"54632#".#"#"&54>3232>32326[/J! #$(Y=9_9)M63:  E05k+:(+%2!/)+3E@7r);;)27Hkq0Evj=CPCCPCVD&jL(d-=I\n\\n\>2654'743232654&#"#"467.#""&54632632#"&,/5' T5 4/9Q;d! !'< UK@N=9!GG-L21iiVwQ /1GIWB>l:>* yTT,Q4=B*MT"&5463232654&'3>7.5463232>32#"47>54&#"#"'#./%654"4c4%"&1pe)C #." #15&0]X+2( 7'" 8L1 G3$-*##3`/G 0+9"'>EREF@:q I-*;-AA-Nkq%EDD%%'K"32654.#"#"54632#".#"#"&54>3232>32#"&4&]+-K/J! #$(Y=9_9)M6-G' /$@`+:(E ",M0-@<&_p7s*;;*27Hkq0Ewl>&65&9E9VH&jL(d-FdeFS< 1:19"&54&#";2+"32654.54632#"&5467.54632/5:>UA lHC2"(" ;Yipxj6-KV^V'N>/I  0V:( L.C[cKDrW-?u>& +732>=!5!54&'53#"&54&'5!B`1G$U$:> 4[>~s;<gd *B,UBwK1,L0GI/|876 9D""&54632#"'#"'"546323267.'5332654&"32654&u5/V^dU(>:0.%$>,m$'&>  Oe(/( 4">_lHsi3B\32673#.#!5>=#358<>& )" 7 7h!'32#!5>54&'5!3254&#"EBe9# $5JA"89;#YU#(93.G(6?!!7JS8232754&'5!632"&547&#"!5>=#".546, 3!C,C!*&/P$:!CC!*#()  @  @   @  @  AK"32654.#"&4632#".=.54632>32#"47>54&4.#" 4.4Y9  .JG1/ -88,02a@S'0]X+2(N -/)26+  e54&#!5>54&'5!2#2!5>54&2?Vr555,X\QEDe55QG()%G888G%UIMQh88W326?632#".=4&'5!LA3 "wACX@::)rm.)CHc6!33# #.'537'.'534i%-wi%|'&OL'&E ;r ;:%B% ΫB%9732654.5432!5>54&#"3##"&54632(,61GG1IRL' d&&'Q ;B+Oh2%&*k6J<DBDM"U7  0x8%#2O=:O)m3).$%B'2#"&54&+"#7!#"32654&#"&54LJvH]M2(#x$P);#. uN]~nh~ 4D(օ=S< t)#"&54632#32>=4&'5!!5>5LOO2%"+3LL D,D D& oW4).(!'&b7@  @\@ ">t054+"#5!!5>=#"&54632#32>P (D D&LOO2%"+3LLs1B= @\@ ">oW4).(!'&#.'5!#654&'5%'& .) ) ;%B%[o0.%4.546323273#.#"#"&#"#'3326{B]^BgF*b c<.:DOcXvV2g %bC7D/I47V9L_""XT4)(H,5g>Mi"[V?/32%#".' #"&54>32>32#"47>54&#"v:0>^  *=bHDIUd(\E0]X+2(AZ}&-Sbiܓ]x4DF@:q I-+:fz 5?H654&#"#"&54>7&54632#"&547.'32654%3254*.55x=O!8C OBJ9?MP7E+=;GE:rI H02.$,/0+.?YF;-/"03 :(4632#"/.#";2>53!5>5KX?[" o7C-"   07 o=*.x  !5\ %2>53!5>54&'5!3h-"   07 7;"7'  !55!!5'q46323273#&#"327#"&@p !  7m-LQ.vi.UE!!⺢WAe=B)054#"32+ =.5463254&'5!&'25(&~nncQ?9.6@t!C,C!dmGVb3;><&(PeRO@VMI @  @ 772654'7#"467&#"!5>54632632#"54654&#"H,04`/9R:d!:@P*::*VJEI9=Eo< 5/#iiXt~B>l9?j  NNnh8hc%WW!'#"'!5>54&'5!2%3254&#"! #:dB'#;98-TS2#`e06'7!!?6&J:MIX6%265#"&54632#"&54>32#5>5.#"1Ua)3&.5!5>54&'5!>32&'E  D.Hx.D D,D :Q8+6)"@ !?&'/54&'5!7654&'"431D2' *I9j :; :=N1I"`8i7#>5!7͡H  54&'5!#"&54632&#"265 D,D _UJj^B<(((+%0@0k@  @PrvLbfBQOGSrd7%''#".4>3277''.#"32677754&#"32654&'5!2=432#"'#".54>32G3%-*" 946B1!xFL@55^BGEEMH,DWS&Gb3c44& > )ByPu?Q882)[]EEYFVX<R1<F2#"'#".54323267.54623267.54>654&#"%654&#"t4BHn0Zq`G*B#<(#=%3?JpJA'S,VT^:.$$x')&Ha=Xܜ~~2LK!xdHB;C@RR}A`cgD+^ILkcVhj@,}J:Hv:O*4.#">#"&5!2.'325"?F,(Mi4 F7d=2]p& LG٪TZ{? ## ,ȚT &--&$,/84632#".546323265#"632#"&>54#"NB+A#LjWG"jJxI@(O:g\% )1 1:)(dA|4U\0my=kKR668ב/.,"./vZl #."'.546323267.54632654&#"=+*>3 #&F#>CHr>oEht @l\ K-1SI)'/''$ddGI@agyR~L54&#" :fdddd{bUm3 #&!R5%2D9(K=dP`vY@'/''>5CX8D"@\bD'777'32654.#"#"54632#".#"#"&54>3232*KX2d32"'>54.#">54&T) &  _  \y" ";7_?FPlHFA>+/PHFO   M<FT&&Jm?MTQG` @+#/.9T SA<@9%32654&#"#'.'53>754&'5!#"&54632#"5;):RzX_dPF$/2 kG D,D n$8[9IWXIK&9"#JN98uW@!!@V}M!@C3 W>BX< Fb2632!5>=4&#"!5>54632#"/.#"HIeb::%9HL::[Aw" 3=PZ=fZj66kHK=66?mC).fM(2"326=4&'5!#".5463277''.z8X4# z6O9,@-ZbJ15DZ2d<d2d$=}*@UP(#8,,0IzN(1Pddx6dddB?Q*5%#!5>54&'5! 2>54'&#32654&+"Q3dE>"!?4="-B:T0_FMZV,:9# 87!3 ; :+\#I?;CF 7##/$-k5:iWA0 7#'#/$-kӏ$5:iWA0v& %!#57#.f)!')\)#>32#'%654&#"6$-".1 (/->+?|$ Fu6"X105'*   k3E"  73#/l./ERRE 3'#F*b$ư-[ib$a  733 W'B))0 RF@ 3##753/$-ut(ViW[ 33273##"'###3-C)*:09-*GG'wEDy '##53?b$ư-;E ib$a6'!#!)EY~'##537' a$|-;!UE?a$6' 73## /[./38{*RRlZe!!(737#7#/l. 11./E;ƬBR#"'#'733267%/+[3-k#/M5 ": 2 PkA0$:i$%&%7'737#7#/[. 11./lZ"{*;ƬBR#L|$eD^iW3#((%3#'(dO[7>7[6XuG`ZqϦkR1 <SA 'V(V\A `''V(VV(V\\-'4#"#".'&'67>32#r4 SO   !  #X"%8Osz98  7 #:#. b'26C3>32#5#".54>354.#"#".'&'6465&#"326H# 1S !-PI1&4 0gL'   F&LR>F> 05&#, ,"%74 q H"c!1Ap/->32#4&#"#4'62:\@=6N=MWL62$;Pf `^ % .Q+9H2#5#".5&#"#"54654'6;2>2>2674#""8K .2#,/  #. $$3..,F8 $*%+&'  D3H.8.$ 0  1 3   "}f$)Z,.#5#"54#"#"&'&'632>3232674'632ZL/)$( 3 (@/#- -  6/I.6.!5AN1,#0%B+4'6274'632#''K 8 JQ`4*1@2#4&#"5#"&54.'632>32>2654&#"%!I  "l)(T5$? 1*%% E$N H.l !F 4/)=-%1-'4*2AN2>32#5#"&'#".54.'632>2654&/"%32654&#"5  #50(N,6*: +*  "_= :(>$#?9?*  $;M^*.& 9'Z ""#G*k *9&R%.#=0%d>-#7'3326=33274'632#5#"'#"D9#"R4F #H= $V.IwX XYIM  : ?.##5#".54'63232>54'632Ne 4I# -7*@ 28/,/, A:'17;u/>O2#5#"&'#"&54'6322>547632>26=4&#"B0;  .P >61L " (D* S+%%  #* +f "F;;4$)KAL1$00-A*  %# IJ%/,T%:-&"#"54'632354'632#32>7.2h  1N0:' +0h\,t%(*;B_(=J&'>5"'#".54'63232654>5632>32"326754&_"0 ':U,%+. G",E##  -6j"ZI5 4F:,<" ,mH+* 0#  O  5I*T=(.!,2#5#"&54.'632>4&#"3267T+RPS.>Z /%$2H)'q.?'N !-(4,44m  2 i@5-#"?x-7C>32#4&#"#"326=#"&'='>?2>3226=4&#"wX.% P2G+;*) 2>'6L /'@&.0@(6#+]&9_.C "C7r*@.O *-."%$4"_=)\,;"&'&'&'672>32>32#4&#"#"'46732654#"r    8 B'''A"O)e%74 !: $&i.  2-+%a& =_rD"N*B"["d`-6-2#/HW4'>32>32#7>=#".=4>7'&'4>763254&#"#"&675&#"H  # '2*/&AE')W !4?  Uh6(4@*:I 85 &!!&! B_0L@` # .  4+2+1'%#7)6K/6#4&'>=#"&54#""&'&'672>3232674'632KmJJ'.JK;#-.  , 1=-,&;M^QZ-WLX/7/= $U-4&F  B+632672"&##4B $+ 0L ^.!!-7#"&5&'6732327&- ,  );  ):~"46;2#.54>74&+"#:$JF#NPw,Q5O%<^VD[76fT!GF4B7/;_PG`:~46;2#4&+"#:$JF#NO[76fB7/;:~+4>;2#"'>532>54.+"#:*& %I0& "/ P41.*0*/.J:+*EA"67 +L$:-;!"&52!&54 ,$ -0a :#- ;!"&5@-sV -4:0;253+".5>SEN$b $% 0Z:S43YCa:~$+54&+";!"&546;2#.54>^ ". "%?A*NRu,Q6?[YAnCAm:6 9VQVaS!GF4) aRIh<~"4&+";#"&54>;2#^wnT9 #" NvNSrlMbCL= =B:qFv"#&46;2M??'H7SB /9g/34'632>3232653#"&'#"'73254#"#">  ?(' h KS-g(93k #0, 93#PG,&;"(@"@b.8.+G-!23267#"&54&+'>n+./ M_*1"c,E'!n22)?9 @> Ɔ=.&%2+".546;2!;26'54&+"2''#*ED' (*!*O$"Z ">DC=)L{+5/y,"#3q=--:%27#"'+".54>324&522&#"3267#! 8"9$  />3.{+1.+*L)  *;K0FW>  j!#hp{T 44$-4632#"&5332>='.7H%A&554}GN+R)!  (0ER k'-& .\Y@(' #w3,'6-(%2>72+"&546;2.'&+"3N +;"0/  7/  <+GE:$/  'Ae9%"72"&54>672"& >*R =1  9S̞."0.) !8#C /! (̏"=LZ'  5~767/67.#"&5qo 0.WGONO_0 F jT*hF/+%#".#"#"&546767>32#".#"Y NWj%6&+ 7G 6*_NA$ @C^*;5o =H=5A5KO $X3HK3 =H=Ans="LZ'%265.'67#".#"".'632y$M>'7nWu=ONU &;'S  1,rZ$+Q.8vy+SxRbRD/i #:AcY*7.'67.54632#.#".'~!!+nB;fT K@0X78=) "!5 @zXw  S=G5*?6> ~ ^1-23>72.'4E-L\%%`Fd  W{75pW' S}[:7&'46332>7.5632#".'&'"&,-$H- ,{*2/ ]`M HZ/!T:L  =';"AH~ #f."#n\R &.?//C $""54>3.o)qn/t2%sfN vAz1"ev1-' 1 $'   B%$<%".#".5>323265.'67>3#&'&#.xYUUe CIJLX c9FI TV:   J a _DSDjc@N@$$P@J173M[1 )1m b B7%#&'&#""&'>32"&'433267.54>3dV:J)e/L8'F-'$ 4tQZJ0xU 2s4D d}]/<7u,' _,-mRH  !v5C$%#".'.56$7'4&#2XU?.5-V9!fMQc&SL_i7CAt6' o 'm: h9.%&'.'"'>7>7"&'63232>32S$"#,Lc!%"K5I >  !"8%ZD  " y 0T++ x {<|W4!&!))0M)rs@%"'>7&#.5>32>32#.#"#.'GQ7*A$n]a/r>&>9HO!HL6M !"\2D/.I   H#B?$K4=IXX  v'5='-VFm&u=1.?H >4o& '  i<z 0%#".#""&54>32".#""'>32z 8;R# YHBc1<ET!"'/1;N$#DU IWI>J>#rYQQ$- *(<8(>b% g'A%.'"#"&54>32>72%4>3.'"#"&1  .Dl8@(S7:7E`0$G0N."=BTl""JBR@,78?P(I:4  ?:? BPB8LG2I@; .B 4$aD5L|oR  QffO 2;2 o2%.#"".'.'>732>32 nc;NM ;.N   W4@%nTCRCOQ 7>7"&>54.'O9KSB0%P/&x {+ |?`~G% 02j8"Vo' n 5'3>7.'.5>267.'>7.'=HT ?s$A=>afM:QaG1,.i Y&j$U 5K 8R {4I /V\8+DwWv%@db-H [( Gj67&j3*2+J(+# >67&3*2+(+# #.5> ~Sf`  U`]<wLDZ% %PCBE-7>3.'"".+THb* H>9- v(fx{ EUR;lM r>74.54>3&s 5#,4, G83?$B" <01  94_1 *' 9' h 7<>4>75.#".'.'.'732>?<UE9&i 4/  !8'g 30  !+?%zN_.A& [ N ].@'  .) $*C*g*&* '* *(*9L-*.**C0*533"#5>5#4.'s*'   3E 3 !2`"2* &R@@,@]*7#4632#.#"cL{`_{L-.); eg;U+(BB  l3*C 5 7* 8*X@|@P@ 9*q:*=* My*'33654&#"#"&54632#5326?632#"&5467[@@H "[?mnJC[@@H "[?mnJCC3N>>.*=H^@T!w?3N>>.*=H^@T!)2>32#"&'#"&54632>7&546U`|*f%/.HE/0%j({b^*T"%`QNc&"V)kgnG* O* T* lU* [** $*C* %** '*(* P *** +* ,*-*.*/*C0*1*533"#5>5#4&'s*'   3E 4 "2`6 "&5463274.#"32>[|{``{|0-.); :)(<gehe;V,)BC#"AB((AB]* l3* 5* 7* 8*q:*)BD *B D*: AB *B  *:$>32#"&54&#"576732654&#"g 42D[B)F &(')./'( S>Hb\    >7=II*'5#"&5463254&#"567327#26=4&#"!57EQ:%"  J  #*&-3+-P@Gdi    (D9=KBH * B * B *A *};EJ*j5 *SN* CP* {C *;AR *B *  {;BS *W *A:X * >J * :1 * @=Y*  )+Ee * w5Cf*Ig *wCy * O5z* k5Lk*kUk*dAXk* a@Yk*+E0ek* 5fk*!Gtk*yk* 5zk* 83.#"632!3267#"''5#"&=4&'533276=4&'53 *.Z8QLT 010G$nG=,*+++<7B$*.*/5A26[\?[-09QV S++G;#-"&% <32654&#"'&#"'>3254&#"57673267#"'>32#"&5:'>DE;'3254&#"5673267#"'327&3>(9DL0PSfzV63()[8 () *+(=&#"'>325#53>32U 9{z() =6() RRP^-;DYt # 87#b py#  GS^567>3263267#5>=#"'#5>=&#"#5>='6754&#"3254#"54&#"32HD>0=n4>567>3267#5>=.'#5>='6754&#"54#"J@3;#7? "&%&)p&&'.%mI*$O0!OGP'#Y%"/C'+s"*M%(]a"' D32654&#"'567632#"&'3267#"'#5>=&#"'>324&#"E#6CC8#C?Q@PI^yY +() 8, ()N,gSWi,% MOx]m` # /'8#j#O;"&#"3267#"'#5>=&#"'>3254&#"567>32(,2()"30() PD%4j#:I# d+ &#:!\5)4".#"3267#"'!5>=&#"'>32>7>32V 9() =6()  L/-;fYg# U87{#%/"'# d<273#.#"67#"&#"#5332654/&'"#"'67&54632 2+"++l(S:T   9&-4:!( M;!: C8&+@  .4L F)'!-!. $6E,C4#3267#"'327#"=&#"'>325#&54>7672e() 0HY () 5* # 8/+# Lm# 1# t+%2>7!57&#"'>327#"#7!3267#"''. ()f- [ ()i "## !7v# &J * 0732654&#""#7!#"#"&5467.54>7PBPCK1;M- s,-UP,M{_Gf-5-DDg% !(2/J!7v+AB&SV9(7' @D9-S#754&#"576773>32#5>=4#"#5>=327#"'#7&5#&54>7672e Q"HC#D,{)+K3,+ 0H. DQ5*  W=-'4 3j"45 # L"&b- 1# t  5354&'533##5>= S44YY44 $/66/$660#327#"=#5354&#"57R 0HYPP ?>/+# LM?M!7'(085676323##"&'#5>5#5354&#"#326'.#" ?Q@PI^ uO + 8,CCnE#6CA2#C MOx]$^z/'Q$_#v,ewIU,\&175354&'53354&'533##"&=32676=#>((')??#F4VRD2A&< $$ $g2! 3g$$';5TV-2CE>*'2753654#"#46323.546323##"&547!#32654q#0(6102?"HP,$2=F$\"9\:FO49y"!$XI$6@g@ 932654&#">32"&5462326=#"&54&#"5767:'>DE;'<N.Ke0-B." C^5#53>32#".#"3#>7-B." 96RRP^-; 9{z   !.- 7: py#Yt +!  f4.#"32632654&#"'467.54632;##"'"'367"&5462326=##"&5467.I,#'9-#(PBUh8De>2+aF((MS]? (N< -B." 7TyGf-5 0=)2,HY1% !(6+E :>/D_ '+)EV*  !.- 8-D9(7'Y#"&5462326=#53254.'##5> 54&#"567>54#*#53"67-!0" C[    h30$/.6;D(+ !., ![v   $`(!+*B3 +#"&5462326=#5>54&#"567>7-!0" +" b= !., !)%   T%67"&5462326=#5>=4&#"#5>=4#"#5>=4&#"567>32632 -B." , +B+++B:(*HD>0=/ *i)$K/TT3B#"&5462326=#5>=4#"#5>54#"567>327-!0" (M(;" &# K?;&3 !., !&+a9!(9O">9&eU   A32654&#"'567632"&5462326=#"&'#5>54&#"E#6CC8#C?Q@PI^2-B." :M + 8,N,gSWi,% MOx]`I!.- :/'#O;#"&5462326=#5>=4&#"567>32#"&#">7-!0" 0PD%4,2 !., ! &!\5)#:" 3\A273#.#""&546232657#"&#"#5332654/.54632 2+"++l-'-B." ,IT   9&-4:@5M;!: C8&+@7%!.- 9 F)'!-!$B*6E8>32#".#"367"&5462326=##"&546323265gP_-;9 -B." VS)52qx#&%Y !.- jp<;P5367"&5462326=#"'.'53654'5+ -B." E x# fc/2  !.- /N$ T#"&5462326=#52>54.'3#5>?'&'.#"#53">54'5367-!0"  (r^ +<(4S5/; !., ! *#()%, \'!*xWJL '%2>7"&5462326=!5#"#7!'. -B."  - [ "#!.- !7vk%@ P%5327>4>754#"#"&54632327327.5462#"&=#"&'#"&ZH%!( $18 L*aGR> ""0!/$V<.;{!>, -  =S/AOQ!! ,.!"'I<e <%54#"326327.5462#"&='5#".54632>7323M`FA=-,;""0!/*HX,9N~a3> cvL,P?$! ,.! S%1F`8c#  q5B"&#"327327.5462#"&='5#"&54632763226=4&#"C79""0!/z0PSfzV63-<%4>(9DLDKY<#! ,.!+@Cw`j+.#*(])K7327.5462#"&5732654&#"#"&5463232654&#"#"&54>32#"B""0!/(Z3<-$ .  1#(*# "61AhE*/GgCq<! ,.! ]>3%45 +9$#=<(5A.@Ee.4##"&'!.#"'>323327.5462#"&327,hFLT 4010G$nGVe=""0!/ *.Z%GP[\?[-09QVyg!! ,.FA2s 12#"&46"57327.5462#"&=#5>=4&. 1""0!/4*76! ,.!6!5%#"'327.5462#"&5'463232654&#"'>32XP/""0!/" =KWD+>$ '&>!Sko-! ,.!.aMVm*4 4 }44632#".#"327.5462#"&=.546323265R_-;9KH""0!/(32py#&%YHco=! ,.!<<;P e6%'5#"&=4&'533276=4&'533327.5462#"&5;5++<7B$*.*/%""0!/S++G;#-"&%%! ,.!j1%#"'327.5462#"&=43232654&'7#"'7!jbF!""0!/(a02M\#/`ROPaM! ,.!{<:&-9#u = AC(5326=7632#"&'&732>54.#"  )#AT3':)-'(+ @&  dB&@/!8K*6 8*BBF * B *= *C * I * I<PJ*D'x*  * *B+ *6@,,+ 3 8)_&*~/*r B*6a) {C3* k 62*{C4*{C5*D56*9B7 *: *"zAD *7 E@*|m*T;K *F:L *=6  * 7CM* @EN*<]*{<R*<S*w2T*"Dk*'8$%'DQ1#%"wEkQ#`%k#D`EQ#qi%#qEeE)y#v~)"v0#'">Gk#`'k#\`G#qo'#q\fG,=4.#"3 !5>54&'5!2632#"'732654&#"'>,FrI>9;[W93MS (.C:-'% H+OQ:%% 67)AYV/,SYD.?% '- ' B726=4&#"'5632#"'732654&#"'7.5463254&#"567327&3>(9DL(9 (.C:-'% &QczV63[8*+(54&'5!#.+"32>73#.+("n7* )3k\%-7 7 6U ") &>a6.I//="  8 "CAz U 9#7632!!;2673!5>54&'5!#.+"32>73#.+(#7* )3k\%-7 7 6U ") &>ٔ t6.I//="  8 "vDz %U#*(#: H `U#X(V#:NH )U[#)": ",#p)9#"I #*&6"qRJ-#+  #fKk#`+ k#O`K.#j+ 9#jQK*C!54&'5!!5>=!632#"'732654&#"'7#5>54&'5!/:: 8: 8 (.C:-'% ):::g66D5 "?5 @% '- b"?66 *B632#"'732654&#"'7#5>54&#"5767>32#5>=4#", (.C:-'% )+ Q"#D,{)+K3W4@% '- b5  -'4 3j;#@+ ;#R@K^K#V,^+#VL T2#76322#"&54632#"&5464&'5!!5>(#{!@)?#$>?"ٔ `((21p1D-&6&"v"i#v.#vGN"k#`.k#X`N"#qo.#qZdN kV#`/k#`O kV# k%# V#qm/&#qnO %V#*/%&#*O _i#v0#vP _+#0b#P k_#`0k#`P ,#1a"SQ j#_1k#R`Q #qb1#qTjQ #1%#T*Q",D#76323#"/&#"#>32326".546324.#"32>h(#0) 1# 4&$" XXG+:71N- -M01N. ٔ ]91 .14 2L\4Ae='%:MG%$FL9%%9LF!"T"Rvd{"#"2j "T"RjR" 1#'&5432!!".546324.#"32>("[7ɔXXG+:71N- -M01N. a6cL\4Ae='%:MG%$FL9%%9LF "CGz" 1#7632!!".546324.#"32>D(#7ɔXXG+:71N- -M01N. ٔ t6cL\4Ae='%:MG%$FL9%%9LF "v,zi#vJ3'"v S,#p3'e"FS,#5O`"Uk#`5kO#`Uk# kO>"q #qj5O#qiU*9#c63\g" V*g#c\63k\# `V* B2#"&546#76324.546323273#.#"#"&#"#'3326(#B^]BgF*b c<.:DOcXvV2g %bC7D( *B.2N2EUOL/%%@(/]8E_ RM83n#* @2#"&546#'374.546323273#.#"#"&#"#'3326}>|"yzB^]BgF*b c<.:DOcXvV2g %bC7D(TggJ*B.2N2EUOL/%%@(/]8E_ RM8'^9##*g9#c 3k\c"  Q!#7 "`WkQ#`7 kC#`WQ#qk7.C#qgW%Q#*7.C# Wg#j\8 k#jM`XK#C8 X#NPX#8 #N XF#76323#"/&#"#>3232632676=4&'53#"&54&'5!(#0) 1# 5%## Ka8Z$:> "7]>{;<ٔ c91 .14 Z]' 'SC,(D*BA*qu10 1#vi+#q"8j "jMi-&#9h"RYj#_9k#Q`Yi#CR:#CZi#v:#vZ-#j.:l#jZ+#-:e#Zj#-_:k#`Z ,#;a"P[ !#j;M"jQ[-#<&i"N\ Ue#="8] kU#`=k#6`] U#qg=#q8c] #qRK'"j`W#Z&"N\%#D9#"A %".#"7!5>=575#53>32U 9ii =6[[RRP^-;DYG1G87>1>U py#%".#"3#!5>5#5347#53632U 9{{ =6RRV\-;DY h87: " #q5#"&546323254'&547654&#"!5>54632qL+6@ _@-LQ$>?"zR|8y"Qr)   v?K_7! 8YaVB6?,gk#`$%k#H`Dn#$%#D#"$v% #vz#"$C "Czh#"$% #p9<3#"/&#"#>32326#'#73#5>54/!3#5>73%3'0) 1# 4&$"  "zy"|><().D$ 8t91 .14 gg &Vi%:E2%4#JkP# %k"I 14#76323#"&'3326#5>54/!3#5>73%3'U(#|8Q 50,.().D$ 8tٔ .FW2/(> &Vi%:E2%8#vF14#'&54323#"&'3326#5>54/!3#5>73%3'("|8Q 50,.().D$ 8taZFW2/(8 &Vi%:E2%P#C6%AD#>54#"#"&5463273#"&'3326#5>54/!3#5>73%3'u"'"# 1"4:_|8Q 50,.().D$ 8t0(   *#'4*FW2/(1 &Vi%:E2%0##?B3#"/&#"#>323263#"&'3326#5>54/!3#5>73%3'0) 1# 4&$"  |8Q 50,.().D$ 8t91 .14 [FW2/(> &Vi%:E2%#JkU# %k"I  kU#`(k#9`H Uf#(#H U"#(j":H }#h"(v@!#v{U#"(C "Cz ee#"( #p UJ3#"/&#"#>32326#'#73;2673!5>54&'5!#.+"32>73#.+0) 1# 5%##  "zy"|> )3k\%-7 7 6U ") &>91 .14 gg;.I//="  84#: kUe# 5k": 6;y#H,#0u;#j,u#jL"k#`2k#R`R"#2#R"#"2v# #vz#"2C "Cz"h#"2 #8p"*B3#"/&#"#>32326#'#73".546324.#"32>0) 1# 5%## "zy"|>#XXG+:71N- -M01N. 91 .14 ggL\4Ae='%:MG%$FL9%%9LF4#T"kU# Ik"S J"#b"{c"#b"Kc"#b#c"M#bj"]c"S#HbW(#PLck#`8 k#L`X# 8 #X#q &rK#q "ir# q #r9"q t"rJk#`q k(#=`ri#C<&"Cr\k#`<&#^\#<&#\#<&a"N\ .%2>53!5>54&'5!32654&#"-"   0?"!@C;"77 :>$%'   87!5'$68""8D7# '/5354&#"567354&#"5673#!5>53#265 Wc<c<KK0(/^6v#v#6)(1**"7#"&54>73265402ru]e{:e@ N]LB58n1cag.kofHmtYRn? y+/%&#"32#"&546327'.'5!7654&'5 L3-0&-6'8+)>;9BK:5^6G6%G'0/N%~-B08I$>01G4Yi27 /&#"3267#"&546324'&'53654#53:9-01"$BT$^89BK:;J- '  sa0 %3($-Ng^yB12K) Z  )."d -)."d e)."d :)."d G)."d ;)."d H).!"d <).!"d I& +E"E e["EZ : "E^ G"E* ;"E, H"E <"E I)"h -)"h e"h :)"h G)"h ;)"h H& +I#I e9w#I" :#I4 G#II ;#ID H "j - "j e "j : "j G "j ; "j H  "j <  "j I>& +KL#K e3#K  :#K% G#K5 ;#K8 H#K <#K I$"l -|<"l e|"l :1"l" G"l ;#"l H@$"l <9!"l I& +M#M e:X#M :o#M4 Gq#M6 ;v#M; H #M <#M I"r -"r e"r :"r G"r ;"r H & +S\"Sj e:#S :#S G#S ;#S H"x -"x e"x :"x G"x ;"x H "x <  "x I#"X~ e8#X( G#X)B H@5@p#X I)"| -g)"| eg)"| :g)"| Gg)"| ;g)"| Hg)!"| A"l d"r Y"r d"x Y"x d)"| Y:)"| ds)8." " -)8." " e)8." " :)8." " G)8." " ;)8." " H)8. " " <)8. " " Ii"  ,Aj"  ,B"  ,"  ,"  ,x"  ,}e"  ,=g"  ,? " 1 - " 1 e " 1 : " 1 G " 1 ; " 1 H "" 1 < !" 1 I# , # , r# ,J # ,d # ,t # ,x 1# ,  1# ,  )8" [ -g)8" [ eg)8" [ :g)8" [ Gg)8" [ ;g)8" [ Hg)8%" [ 54#"#"&54632CF/!-"/4/B -6fWeOf('Zjj " 1 Y &8j " 1 d$ "j . " 1 .'I Y?# dCI)# Y<Kkn# d>Kd# ,<KFn& Y3 -l& - d=`"m' . -&lz&!l"l W&l;,"l .|,"l /|;["M B"Mq"Mk Y<#M d<O& YN ee& d< e]j& eQ&oxz&X!x"x Wr&x;z2#"t -2#"t e"x ."x /)E"X)"Xq!"X| Y<-#X d;#U e9 C  2#"&54632#"&546'&54321[_ " :mO "" @;; 432#'.&" #,*18)8" [ Y)8'8|)8" [ dv)"| .g)8" [ .g "S] Y;<P#S dg+"\] Y;5"\g d@"\ ,iU:[4632#"&#".4/"-!/F'6- B'3#'?' v y!! ?!!? zJ*U\< 87632#"&5467m   !".>2 R 3&-T827#"&54632'654   !".>2 R< 3&-T828sf#"&54632'654  !".>2 R 3&-T828"&#".54>32&, R $&9; Z/)8' ~ ~7'  7sf'  8'  ;k,"&'#54'65#"546324&5462>32\&*(+*)S , T,$$-R+h{{u%+"@d *F0"&:gO>32#"&'>32#"&'#"&5465#"&46324&'>5#"546324&54632)$&\ \%)%\  [&$$&[ [%)S , [&$vg?"&LK)"?f g?"&NMGQ+">f (6 2#"&546:NP78ONO:6OO98N(67(/gdyJd'y6Jy=Jurd'yJ'yxJy*JKy*6BN[232673##"'#"&54632654.2#"&546"32654&%2#"&546"32654&"0 ,5C,R/5(#)`F2DtK '95O '@.2d@3FuT0Q 3S#D.2d?4FuS&? 3S"B, OO:U~A'V=8[P:PH(O&2=8[P;P]d(O'1L 1?N\ky #'#"'#".54632326732654.'2#".546"32>54&%2#".546"32>54&%2#".546"32>54&7R/ 4%+_G $rN#2",7?C 5M  2 .3e>%)wQ3*B#C.3e>%)wQ3*B#C.3e>%)wQ3*B#,Q:&E#>-C  =H54&#"#"54632"&54632-/)02<6!<&2g<-3'" ""?7:V2x$TRw@:"_2M% ,?EK#= #UB, 5>32&!"5Fׁ</Nmp5us I87#3#PDCrrDD`' '  +!*#5!*XK #K>1NXK74675.=463"&5X$77$OV3(#22#(3VOy:9  9:S8 9622 2269 8TK(%#5>=4&'>=4&'52(OV3(#22#(3VO$77$yT8 9622 2269 8S:9  9DZ#""D#"#"M #"'7!)+ ;r3Ff ###5>54&'5!2>54&::9:ncd^@68?"!5S6Wbm\lT_[?, ,#32#!5>=4&'5::3paap99o[[!55!E Ps".54632#"'2#"&546R 4<."! ! "!28T-&32" "c!'  ٝEk'  'yA'y %3#"&/&#"#>32326+H>/-##5+O854$0 #91  .14 , i) >&y4'y$yJI' e' '  a'y'yJ'ylyl b>'y4'y$'y!'yJyJ( 'yyJ 6a"'y]&y]'yy'yh'yhI'yI&y( 'yJ'yy( 'y'yJ'yy*;4>32#".7"32654&21GTYB21P+%"$!:U+s^\u,YZZbR]Y L* ; ##5#53#5;7F/F9ZZ1 /##"546232654&'&#"54657327+/nZS4 429> KdfEU2',*6B%J9"&54>7632'"32654&GW &=kF'@JPQ,,&!+aP9@0%|G<@N&*?@3,5; 5 ##"'75G  x[_ 3!-#"&5467.54632'3254'>54&#"G-RL;M35N=:L*S'&( E> ,#'('6&09:-&%))+83&*^&-%,<&$"(8 ?2}E ##5#5353K2KK22KK2KK2#5222,#57#522d22  (*   ECQ*0; *C8{*86t*0*u* 8; *0/ *09 * 85 * 03 *.8 *2e 2 2L  *  *0-pD7+0!pH7+0@pR7+ 8Fj[8+ 0p7+7E";54&'5!#.+"32673#./32673!5>=#"&546323273#.$23^F#i'8\ i++iKA>#^^$RM+W;ff~% a- ')%4s &tul8Euy/5>327#"'#7&'#7&54>3273733273#&'&'$.zh/;]4&#.$1 9$?:`yA)$*%/$2& fc'IJ-6Ye)#\QT.vy !dB C@W|OyI"6=4.#"5673>32#"&#"327#".54>323273#.y<@0J? NF"7' 2zh/;]4WM&:`yA5x& p|+BoGi  Y3(#:-e)#:cxDQT.!!Sf "-.+3267#.+!5>54&'5!#.+"3267 +0zz0,),:z$78#4 9T z;+Z h/7!$>8B'  +  Q72654&#"%#"'#"&54632654'#53.'#5354632#"&54#"3#3#32>2N!&/cG7W&(3* uohdoT=4.#"3##54&#"#52>=4.#"567>329C010v) )' &Do %9"" HD&$6B-&u"rNS45! K 159=A#535#535.#53354&'533#3####5>57'#7'#5#35mVVVV$ '9 RRQQ&8;&8[Y7%B.F.$YQ+2+Y.F.uL2.NFFtootFF.SS  s3254&#"#3275332654/.5463232>73#.#"#"&#"#5#"5##"'#5>54&'53267672QV V %!&,26-A20  +$$$\&!F2G  '8K-&!30/9=.'1OMI /+#N+'!-!$B*6EC8&+@7%4L 9?-7!!?6 'A*S t#V}5  GKORVY.'5337'.'53"37654.'533#3##&'##&'#53'#5'#%#3#'7##     -#A! 0jy0 N_U 9w}P3{?0A!' -R<& Eec*.+.uZ.F.tFFFF.N|FF.K<X%67673#32#.#!#V7W jDWCT@W*WL ':@Qw E-W"(57!!%'5#"&546325#534&#"5673#327#26=4&#"La 0PSfzV63oo[8II&3>(9DL>?n@Cw`j+_?j?r#+(32&#"!!!!327(MK1F9~H) l(?3. qqxf{gq;D{. .u?6h,V9.  .c|e";5!!!!563654&/!5>=#5354&'5!37654&'"431(D2' *I9j :;YY :=5|N10I"`8i7#>05!7qH Q'#"#7!#.+77!5>=575576T949U6">> l.RS-O7OQO7Of7 !@$H7HQH7H1 &Xl#"&'#6?>324.#"32>%#"&#"&#"'>32>7>7#"&54>324&#"326 q.#@e1*h-A L)1K&*0K&?- F,   %3!@` 3d;|jzl) QYmW("r_o}"4-%-@_W! .?\U*'&'44/,J*6*9pB+B@b3p#/J4J o+ ;5>54&#">54.''#7.54632 <0B o4*9c8P"  X@$2%"G+"^9.))-p}&I85R|ss<3) D;:7>&jAW(EbM)07=534&'5!23#3##"'!5>5#535!#3654'&#"#32F7#EF9?14E:'#;9FFJ'"q-5 ,- -g7!!?-II=G%< a.8#5.54675332673#.'>=4&'53'g-&HM9%{-"J  &7",?1%qc*C' a 2IvI"14#8,)%^.?RK&}*.1%#5>54/!3#5>?#537#5333#3#/#73'().D%).N_yeS0*I+`u)5m!)<)<)<)n8<54&#"#73326323#3!D7Cb% g2VvC 2;4:.*-2?V["iM4,**$?$)4TX""_L7+*#*<*"*4323273#.#232>7#5$4670" M!    *  /[F"*; &=?!!'+1 >=JIAK.O`Be8-567354&#"5673#327#"5##5>54&#"c<j c<ee 0HYj/ or#st /+# L-^(# ###5!%5!I:HKBB'X0'R0'O*3(Mw'O3(6"&#"#7>32"%cWu>!Agec5> "A@Jl>32?#?.#"l+egA!>uWc+J@A" >5cP$)0P2 |r $2654&"7#"&5462T;;T$I"#*.45<>23:<."#*23:>4 <-zdePVl0B!  <.ycdfa|,= , 5+k\Z\Xp(7  :$tR_ILd*< lKb!1 4%VB?NO^$/  0"aECT* *UCET) . L98^/?#!"&5463!24&#!"3!26'#!"&5463!24&#!"3!26^C@C^^CC^#W7#"&547#"&54>32?'4&#"32>%#s/L$'"4! $G,8>Z$0    -*5B*&,Fl36 1G "?)%O1W>1HLe0*1$.(?9^%" 6"HK3/*=S/'=SO!WxnN%'LY]"&#"#7332654&546323273#&#"2>7#"547#"&54632?'4&#"326%# 7  '!!_5,2  >11A   -+ 5B*&,O7 1G,O'8mW>194"#z'(0o\BI!.:z 6"!KK3/*^/'" fp N+2<"32>32#"&63232632#".'&5#"'%&54n8P#)I1=a/$-Hm6)~   0%= R`iW_}]O?hT.$+$ /0#6,,':(Y1*!jnPԾ#&,r<#7.54>753#&'6733!51H$%G18t9BJ97>>/FE#$FF1OOMjR1e_MJ^H =A%#"&54>322>54&#""3267#"&54632#"&54654%#=p>6@Eo;3?*K'(M,"0K$&#4! $G,8>Z$0 *>15sR<4=uH?Xt1")Uv4!(Le0*1#.(?9^% N2,NR4ȷ327>733267#"&547#"54?"3267#"&54632#"&54654%#6BI 'J";?  ))$DP+*0K$&#4! $G,8>Z$0 *>1  u,:]:':$sR,OrLe0*1#.(?9^% NR"4"#73327632#"&'732>5#"#53;4&,H+"  !JHJbN73J`L#U.iv6V7%=(  )<ʂ|$:&! .IUQ~G.B=e#9KJ&#=<#N#),r([)5<2?67#"&54>76?#"&547'>2>54#"327 '!xpDdV ^r'J)"B5' %>;&0 0HVs.h='.HEW AI[*4 $q ~ R*$RG9*'07C(v/{6 O&hs23267#"&54>7#"&5463232>7'6767#"&54>54#"'63232?76764&#">76&0OM'Q}+s& *w3*.*<3vI`/%(."O*, &&[T TlR^{+ > RW6(;l=*?oHj|&) #H;,!:h5:jH6&U)+ F=&8 &,F,$E I'p_6' 3"E 5f#g2, -bQbp;&#"'632654&#"''7654/&54?327#"'6c{,BD< FA+! U?2FvjJ'GF?lJ$ lK,&G&Cz7=9BL*MJ=peOX/R<;9Y; V:!',5Z:7K@j:/g65GN:=DP\%26=#32#!"5432654&#"543!2#"354&#"543!2#"32#!"543&547#!&547#%%&$$&#%& %f  e%# $ $  $ !!!!!!23267#"&54?654&#"#654&#"+567632Q  ( -?&7 Z'!K LQx^%v  2 A1K R;.XsV  @%;%#"5454&#"#'7654+5677>3232>7;-R ^ Ksa y!&PM. ='@H Qi$&(.2 d)/]m#!+y :!C7K/   4@%.546$7">54'7#"&5463232>767>YAU~0F/*?C[@"_eR&Ga1'#"("L&'=5Ze@?JdU4tX@]O7gh.Y3"#AcD_-H<'72$@)2  4;:1Kg 4 I267#".#"327#"&546324632&#"#".#"'>3232654& , L5)XU&)92# .;aC44N)29(*& 65e)A( A&0*E)-,Ig@1$7K555*$.>.;S5*=&Ue'Xq'''"2'I'@)-*T;JV2327#"'#"&5463267#"&547632&#"327>>54#"32>7&#"%6^E>S4bo yq3^Oa4R:(@g$0 Puujo%/(&tPRJC-\KK4=d8' 34## -/&7`=1'M, Sc.(,1%!!*CnoNjLD  QRpAEhZ8nWRR3 -$0L0#*+%0327#"&54>7'7>324&#">-S7**F?[8/5\ o%(?%$/=#+#+H%X$LI*\&v=W32#"&5##5>5#532>54&#"b ]BX9<N3U]4eA,o-- KD)8 @?!C4#u u.:Y%PP3'N*(.$<5Ou%044&#"54;2#"'32+"543265&#"54;25#-,) a,##h#,.%P*#x\'&=/R+F133@/3l+m<-=Qh4>7.54>7>7>32#"&5463232>54#"#"&2654.'<) !6(= [1# RG!1y(8V/Nu>6A &&4f=C$ 8Fp'   /O8"="#%H8<%,:N87 Z aH%2KX-voLA2&@oDgG/&%; G'&+#-3  *=G%-8D2#"&+32#!"54327654'&#"5434'62654&#"#3&54Mrk" ((  %z|<+)>he [[V`& '# j&a[+",HHLE!!$$!U$,5?#"&'.5476 32632'>54&''#"32&54&'#"'32+U l^]4]^uW62OXZNG%M[E}I3"Jw]J_``_,9#ih!X6P"fMYq] ~#n4>3267327#"&54654'#"5432>54'#"&54632327>767&#"327673#"&uNQ+ ~.X:3# )j uT'2L  9V;)!(9$oLb2'%"("O'N9'!Cf5Jy(!(.{ t^4CyRX  0[/(*0C2')C=# '5^?kp*E?&6"$?CC7LWL#+"[.&c~6EW4.5463267327&=4.#"''7>54#"'67> 54&#"(0(aE<\ YUN$}  kN96N0=! j<j&9;0$/& $ <(G A(:%Dh;--=<%6S91?3"58U,!2?zn4ERG4"$1"ZE =   )<+4*2=CO232+"'#32#!"54327654&#"5434'6'4&#"3276&'#3&54el/ "& "#|6F5\"G#i f ^U$#  $ b!,WY(eKC$AF!$!! D4#"2>#'3#5>?'!5>54&'5!2654'53'$,K,#ݡ5(8 ::6)KV4$=h((31J$3:@D&4#%<6 !K6&< 8 *Q[-:'+09#'##7#5>54&'5!27'5'654'&#"27t$=$3I0K-:64- 8He@*B'6)r&< - ]]%<6 B?,Q=f6=/0J+6+!Sg/!+;g(!+;F733@ /7+0+:%%#.'5!'5654.'53#-L-`'% .)J4$" WB% [?,Q,to9 "9`"&*.%#!"5#"#"=763!2326?632#6%#3%3` nH5 Ek ;,]\(<X]$D6;$9"/j#4&'7#737#"'7!3#"&432326$`#0aaF:(a/32?|5#u EZp*8#".#"#>323254#"'67&'732654.#"&54632Wh-D#%6';$7":{F5. #28>!?,Go Pda/sZn'.'2#01[1E3* 9VC#?:"X?L[iSB^AlP".}s4>3267#"&54732>54'#"5432>54'#"&5463232>?>7&#"326?#"&zH|kSL-#b":6{ROU!*i)8I8&)'.C#*! (’Na0'%!)!N)!<))?9h9N~' B w]7D1jY9  ,P :,2_RHF&W9H&Q96=9,!A)-HE@(4.$$;, w7UE ,t*h~42V/3273#"&5476327327#"''654&547.#".lO3@$0XDKI*(>J%="hY ^(%ed`m̓k[zN^/#Y "$&RM)#*1>.#%#"&4632!3267%!.#"~ObbT%54&#"#&54632#"&54>7&54632#"&54732654&4&#"32@Dn H'0AMn0O2"#-U U=)5mh0R\4;cKX?/&M ;'5;o)"!xH!"&`{-6/ (hU>V3&PtU1R6" 5@J]CA3O+!:/ 2:I,1>  9$lr2327#"&#"327654'7#"&547632>?'>76767>3267#"&546324#"6G3)" >L+/Ie,!8B3"rM2=g@/";')"_J /R:i     )(% 7XN[S1'&!(!  -! ]LNB%0cM;"K=Mi7.eXr'!=(#GH ,)T =ag     Q. 9F 0`Z8R1&7 1 D ").V'326?67>2>76323267#"&54767#"&54>7#"&54632B*FpEi;yFi*5P) nrU5'K!g{@&(@Pt!&1_A:DLT@O2'$"1@RVLM^ #Pqv$KC* :{F2m.G'xZ3&"1/1ucYM|[cp@7);  [,"&547'632327#"'4#"327&543262> `e %P*% >'3D=,/DB2'\Xge+65zq<, mHcVd'(VeTf{!5>=4&'52"&544(42V==X;(((=X;;-+s4@ _f)33@g;!+;G$j!+; /5@F32+"5#+"5432=#"54>3!265432&=#27#!"633XZ7'j0, 8D˙(H)* i2MP #4.546323273#.#"#"&#"#'3326%#52654/#3#5>73%3'>1I(88(>*: <$#)/;5F4>  ;(!) )w} FN,!4".843+>%/? 73& 9F   A'!t){z)c @@|)' |)' y'{||)#u| #u"t  )# |"t#   "u#   " #   )# |" #   )# |"u#   " #   1#  " ' )X"{  ;,z",,?",#,?,~",9?9"9,;"9#,,w"9#,#,,< ",;I ; ";, >";#,, V/y&' _0L#LL#L#LL#YLY#LY#L#LY#L#L#LY#[L[#L[#L#L[OFGP* !032654&# 4>3!2#! 4.#"3 u"::"u5T[[W96TX,FrI>G/VYA))AYV/-V\C,G+OQ:%2:4.#"#3 #!5>54&'5!2654.'@,FrI9X6$ #6Y9>m6TX9;[W9!%I2G+OQ:%(*978;,&)-V\C, 67)AYV "<9&32KS[#!".54>3!24.#"#3 !265".54>754&#"%654.36TXXT69W[[W9m,FrIFf54gF#>>#Fg45fFIrF,r2I&f&IN-V\C,,C\V-/VYA))AYV6+OQ:%((BD&%FD*4"4*DF%&DB((%:QO&9<" | "<9&y#"&'732>54&#"#7332632yU.iv.QL-m7  ! p@EB=eAW!!!%#".'732654&#"#"&54632kS!>&' $>+DWK= "[?Xb} 4 4*mVMa.*=8}!%3#5#"&546323273#&#"3267 qq@d@p !  7m-LQ.->'!!⺢WA7'72!!ʁ))6*DK7654.'%#!5>54&'5!24.#"2#3 %654.' !3S55L((M56TX9;[W9m,FrIIsE- )BxO>v8+` !=>/ ,;=! >>.-V\C, 67)AYV6+OQ:% !4GE& ?M8' t!&A>43MTip4.#"2#3 #!".54>3!2!267".54>3.#"%654.'654.5.54>745,FrIIqE- )BwN>m6TXXT67UYYU7I>NwB) -EqIIrF,r+8vf !3S55L((M5v85M((L55S3! G+OQ:% "3GE& ?L9' )-V\C,,C\V-.WYA))AYW5 '9L? &EG3" %:QO>A&!9 !=>/ ,;=! >>.!&A>s.>> !=;, />=!& #u ">4%!'7!$ww!! G@>4-2@>4 '7!'7!'7vwwov !!"-]@>#!"-"i-@]%>]%>4%!#7!'7!73!o-2-ww(*2*妦!!>4'7!#7!5!73!'7w-2-{*2*w!8!;4'73232>32.#"#".+;w2jc*$E:;'7w*cj2-Q=:D$ XU-Q<:E$*cj2w!99/BB/  #Ub/BB/88!>4%!'#'737!wvwwxw!!!!-]@>4/]>4%'!'7!7vwwwU!!!!8H4E>4 %#5!'7!538ww84!!-1@>4-1I&: x>452#!'7!264&xwwwd"#8wx" "4"3!'7'7!"543#"dwwwx!<" "xw>4!##5!'7!54>324"32 5,8ww,1G9~??] .qq" +1F1??@>4!'7!#5".54632!'754"3w8,5 G1,w3~?!qq. 1F1+ !@??@ 4_.'7#"#".'#".+'7322>3232>;'7_wcx::9:@Cbwwb"F6:A3'+ 6D"cw!iT` `T45!!/.dc>K>./!>4'7!#7!'7!73!'7v-2-ww(*2*v !!"-# %7'7{7:Ma'tM l6V%kl> !##'738ww!!> '7##3'7w8w!!>> X5!3'31TpoT!7[nZuw@ # %#.#"7'74>32#AٙNk! LvIZfJosKnE # 76327'74.#" IvL !kNZEnKsoJfٙ> #!'!!"-_8"i-//l? &54732654&''?j"[4(">fiiӖq"a}8f>"ql? &547'7&' 654'7?jf? \\#iiӖq">@&`}a"o>%!7!x!>4%!'!>3^ @-^ @>x'V-^@>y'V>x%!'7'7!!!$wģw$uu;!̫!8-]@>x-]@>4&f>3&e>%!#7#'7373!!!%!3T2LL2g'X='7##7#'73733'7'#!%!3L2LL2L='=<]ii]]]]]JJI>'7##7!5!7!5!733'7'#!L2y'`2L=' ]ii88]]]J> %!'7!!!yLLJ=<]]8JI]@>] @> '7!'7!'7'!!L0LLL==<0^]^]JJJX@> %(0^ 'Q )\x3' _0(x]( >(@>>@>A%! !!!!!M5MCh'hq;]A@]8r8r>A 4$273232>322>323".#"#".#"#".+ wcA5:C@29B>A7#( '&4A5 ()2?A\w!/.cc`__`458">I>__;H;45! 4$2'7#"#".#"#".#"#52>322>3232>;'7$w\A?2)( 5A4&' (#7A>B92@C:5Acw!54;H;__>I>"854`__`cc./!-h535'7'3#3###535-!!88ww8<828<-h>4%#53#53#'73ࣣww8888!!-]@>4-]@4 %!'7!#3$ww88!!4>%!'7!5!55;8vv]]˓:8-&(>@>-]', @,& 7#'7#'33'35#5!\ \̔:88,8.vvGG8,& !5#3'3#53#'7#3g:8e8e\ \g=vv=8w,& 53#'7#3'5#3'#3#3'Ae\ \g8g:"!8eG$8w8== -' 53#'7#3'5#3'#3#Be\ \g8g:j8d8e8w8=_i[=-' 73'5753'3!#'75#'7##HJJH:8^z^^|^BD[GF&vvru#!w.& %753'3535#'75#'7##3'#!5#JH:8e^z^^|^gHJe^gGF&vvu#!wҭBD==>pjv@<`#!'!!#`"-$,"i-- >b-6' 7#7#3'3#'7#3'73:8:88^^^^ vvvv:>4$%#53>323'7'7##"&7#3267.#"R78Q ww R56Q 22 3! 2 85FE6!!2EC4$%T&'-] @>@!'7'7!5!'7!5!'>7!>wģw$ww$w'1 $!̫!88.;>?7'7!53!!#5wwY8K8!!8>?>?!'7'7!#5!'7!53ww8ww$8(!!!!>?@>?>?533'7'7##5##5#'73538ww8<8ww8(!!!!>4 75!'7!fTVα>4>475%55!'7ffVVVVαα2 #33#2*hhwK\lu`]%#"&54632#.#"3267` nhhn H ZOJghIN[ opghqPbhJ IhbO(74>32654&#"'632#"&%&#"326(R6&A0TH5?)M6oDa8PmT72>V0){'DP7&C(u 3Ǐ4=q7|Y>G ,)5!2=!5!54&#!5! p!<%2%%,z )#7#53#53!5!73354&+5#32#4$OG+%0%b E{N!%#%%#"&'7&546327#" 32654zERJKS˒z_=<\ɎgQUzytTEJKaS=7#53.#"5632{ !''9.%lR"4,lp ( %E-7Ep+ PP#3!5265!3!52654#5!"/21//22/_^u1  1K1  1rc#%3!5254!"!4!"^_/232/f/122/ccr1  1K1  1.#!!2673!!^!;1HVC6W K%'# %=ӥ75!BBz&)\'yrC6 C63#C.1N>?A74>7.546324&54632>32#".'"&465#"&>1U U; 3;  <5 0UU1 2;  <5 +5ce4)  +4ce3)>G #"&546324&#"32mMOllOMm0R8:QQ:9NllNMmmrQQ9:P]b 2#"&546+;<)*;:b;+);;+); '7p_x8A/3O  #u`1 # 91>a*6&#"327#".'&'#"&54632>32&'&#"32a!ZE!(++0,C-6@>RF@J$05-*%*.,50M0x =#/))'0 ).fCKGF#1_")I17n4>!&2#"'#"&546326324&#"326%.#"326!dOoa'w6GOfO;q#taGM9B7&f  36i-47A7&gP6XaHQT9`v;jO(+( D>8rE5;jO>)3!C>)!7]-773##4'!&'7?[S,p2 -R]ALD#!%'4'6P~ }HK2r0J1(XY)Px3P(N #'737(,J(-kQ,J%-P333P(P(NNT73##5#7373 Dd(P(!De(P(!hz\S"iS!@!@>P=!#4&#"#462PBzMPwB؜9KwqQ5no>P=@=78*%"&54623254632"&5467&#",C"'acQ,C"'ac.'\.'~\08'BWB)8'B'BOBV8z3:A%.546754632"&5467&#"#"&54623257>54&'#>nzbdQ,B"'aLm/adP,C"(`TbmyVTbmnaP\h2\.'2 Zo:g3\.'&LT]ST78wgkry2"&5467&#"!54632"&5467&#"#"&546232>=!#"&546232>=.5467546!!>54&',C"'% ]N,C"'%RmmR]N,B"'$]N,C"'%RmnQ]  _GG_XH^^H.'!?B-//[.'!?B-<=\.'&!?A.00\.'!?B-=Z\<[QPR78%#"&546232>=#"&546232>=&'#"&546232>=.46754632"&5467&#"6754632"&5467&#"54632"&5467&#">4&'&'67\J,C"(#yZMU"'#xZM,C"'$YddYYM,C"'#xZM#L"'#yYM,C"(#]hh]JSSJZwwNWWxxa.'& @@/]!8\/& @?08"_\.'& @@/{%frf%[.' A?/c"<\9 A?/<!a[.' A?/|%gvg%n!U`U!#x#!WbW>"("V8<'7.'#"&5462325#46754632"&5467&#"/c=HNdP,C"(`C`,bdQ,B"'a&=" uO?J\.'&7 Pd6h2\.'2*0V8G3>54/7.'.546754632"&5467&#"7#"&5462325>bmnaTbmb?Z4TnzbdQ,B"'a?I(adP,C"(`TSTTU.= \h2\.'2qrg3\.'&V8G3>54'7.'.546754632"&5467&#"#"&5462325>bmnaTbmJ)Z5TnzbdQ,B"'a@b?adP,C"(`TSTTu.? \h2\.'2oUg3\.'&#'y:'yb:y#'ye'y4yK'y2y@0'y4'y'y0y'y)'y"O'y#)'y'yM'y`M'ya)8E'yZ'yS8E@7632327#".#"8&w&TP T)TL O'77m 76Y8E@%&#"#"'732>32E'O LT)T PT&w Y67 m77vc'7.543232654&'5#"&/&#">Sm"=<7*U7 70;2E@A&M.??c"V-"0' .:>"\%9f >323267#"&'&'&#"1K'?O0I"D7-A0"S!H!C?L5{JPCTWG,H1iCbSO.@8hE#"'#7&#"'63273327E.6-6:6&N(&w+5/6<=$TG$m)X$i+l8E')"S7}DY|67D )#7#537. #"'63273327#"'!!D>;  T 8";DK O'&w!-B  m Y hB49A2'S &4A/&%!#7#537!5!733#632327#".#"32I!(2C%&B3'! [Z[Z 01N+%C3'!# # gg ff ') $ A::732653#"&'#%#4&"#53>23A):(23B):(t  {/?t  {'4J {9& WF`{ /I/H/G {/Pd { /" 6%!#7#537#5!733#F6F5F6F5BBBBB: !5!5!5:BBBBBB>>6%!#7#537#537!5!733#3#!>,6,..4,6,..;oo8r8r8oo8r8r>> !5!5!5!!5!!5!>:8r8t88@>y' yJ?$u>:' y??!"}@=' '$EA'!) '@:=#7#537!5!733#3!%5% E$9E9\UBBBBBB%BHE:A#7#537!5!733#3!5-5E#9E9\SBBDDBB.HHBc'Kb'!J!>V\!)&''67.547&'7>74'6\7A#2 4,,4 2#A7u1 "''" 1uIFFFF kE-  ))  -Eky)&&)yqqpp3I63%&+#7'>?.'7;7367IZ U6StG (*?$$?1%  Z U6TtG!*7)I0-F eP "&M" fQ  M'#@<h#7'5%737%'76a$N6BH4fRBåDHTuHSM>:h#75?%573776AHZ6bW3fDHTuHRBڂM@>#7#537'5%737'!!76%d}HK%6oT@AD?\]?^B]?2HCiHt?0^>:#7#5375?%573!!76%o8;8:6CD6'~\]?WHhHDBq?a98EW'S$S5BW&!"SS8E#&#7'6?'5%737'327#".'7D#?"#gB:6D'oT;G?T#BD/;\W M y YBa2HBiHs 5&m $5 "W5B#&#7'6?5?%573327#".'7D#A#$i)A*HDS<F>T"AE(\X O {gNH_|HEBr 4%m #5 d;>9<'$!"C>8<'!"$B>7<!#75?'57'5%737'776o@;6;L-̜242H=ZHb6hB^B;HFaHi6oBե]f>7<!#7'5?5?%5737%776.&/(6."-p[ɧ@B\FeHpHGBeFnHy|HZ3{J*>>'.'5>7> 06LTlE! ^ 4-/ +>>|>>^')(@>>_') A=Jo'SQ>K`'SB>>h$)#&'5673>70./76pZltg6[&?%  $,K+N +0A% (+$f;0-#"^$#*C6n^!!N! >>h$)#75>?&'503767&6Z&?$  $,J+N *0B$k6qZmu. (,%f-#"^%#)D6n^!  ;0s" 4H%!"&463!!"3!HggOagI"ʔBlKMj4H|4Hh#7.546;733#23!!"/#"E4CQg\,E,}"&FOa:f}JennBBN_lK8[4Hh#7#53&#!5!273+32654&E, .E6=JgM7Oa3fnBmBsyFelK5V4H;' yTA3H=' y3C4uH%#7#537.546;733#!!"'!!7#"EHa"H[gm$E$l NWOaDK?XOe\\BBK?elK=_3uH'#7#537#53&#!5!273+!!32654&Eh!'E18Cg;.Մ%Oa,K?LBjB d}!sCeL?lK0R4wH; #7#53733#7!"&463!!"3!HE"EggOagI"I?==?ʔBlKMj3wH= #7#53733#!2#!5!2654&#!E"Egg"OagIމI?==?}ʔBlKMj>P=332653"&5%#'73>BzMPwB؜wYY=KwqQ9no6ll>P=&0RP@=>P='@=TH%!!!!H L@4(|TH=' yTCTH;' yT AUG!3!G@p LUGk. "&462.''3#>5#k]-]\~]\.]k. "&462."!326k Ɣdc~bb.bk. "&462&#"4'/'32k(I[]G<<<hG][~i<<}GGG <k."&462&#"%4'326k(I[j<=Z->X==X~jҗԖ=XW|WYgV=7.546324&54632>32#".'"&465#"&kijji0V V; 3;  <5 0UV2 3:  <5 ~iԖԖ+5ce4) +4ce3)k. %!5!6"&4624&#"32!5!jxijjiLj.iԖԖ%.k."&4624&#"327!5!kijji[x~iԖԖ.=? )!5##5#5##5#?888孭孭=? )!5!5!?8nn孭孭=? )!!#''?`ɡPj8B(=?)!!$#"&5462?8n""!06n0!!">%!#3!`88> T>&!#!5!8L8>&&>%!#3!88> %!#3!!!888> %!#3!!!_88_8> %!#3!#388h88> %!#3!#3#388h88z88> %!#3!!!#3j88j888>3#33733##7#v88ΑCA8>33#3##7##3!7#CQPu_SASg88_}88˓%!#5#5#7373733 8B8 Kk8B8M ٟD[!!oD>3#33##7##33733#7#v88HNKM`88LMLLnY8}}8>>&075>54&#"#4>32#".5332654.>bcE8&+//+&8Ec+*+  #A2yx2A#  +*+>>&|>>-5%>2YX>>|>>>' yJB>>>&G y>>Y#"&'!#"&4632!>324&"2bF?]  ^>FbbF>]  ]>FEbEEbFaP<Y>Y #"&'!5!>324&"2bF?]  ]>F0EbEEbFaP<8!' y ?. )323#.'>FX6RyNQp;^w$ %"&5462"&5462'773#''7#5L" (!" (t%%%% %%8%%82J%7''77'8888UP]@2< 7%''77j)*88+@J|4! ' 7""B""B"BB"4! '""""B""6uC&Tw)" \>@ \>>@4H!%!"&5463!!"3!!"&463!!"3!H5IJ4+-ggQouK"J32K2,>,ʔ2vQRu4H|E7=I@N@ H@>P!##46753#4&'hBE`BaCaBbD kH5e f9Co %##5##5#535#533333##5#(P((P((PBBB""B'G43'j'B3>*> %5% !5!5-5>qqR24ɺ32>*> 5-5!5!%5% >qq 3242>>[ %5% 5%<\QBHK>>[ 5-57%5>\SHHBL>>y''.'5>75>7> 06LTlE! ^ 4-/ +; 03?05^>>y'5>7&'$'5> 06LTlE! ^ 4-/ +iN^50?30 >>|16#7&'57&'56?3>74.'.'?6_SboZc|E670E)H,$H '+6=2R;7#;:B ^)/Z6e^7M{^ =7D2 >>38#756?156?.'5736'67&>va6Q$pCC6IJUxaj);:6(*^eHN#!^w5&.(,^10: ;!J*x TuH#7#537#!733#!!!!7#EHaC$E$lN K?LZZ@BL?pTuH#7#537#53!5!733!!!3EHa~C$E$lN؋K?J@pB\\J?9pTwH= #7#53733#7!!!!HE"E LI?==?@TwH; #7#53733#!!5!!HE"E LI?==?{@p8FEW&$SX8FEW'X!"S8FEn&PX8FEj&LX>>h -#'5%7377>_6gU6I2HpYַKYX@M5>>h %#773'7'7>U6I_6g`p4ЈַKY 5b@>^>%#7#537'5%737'!'7>*6*h|W?M6AON2hRĆ:ih4c< yŜW1ϰ[?>^>%#7#53773!'/7>*6*h|C+a6iON`Z):ih4ZNxH*h}lOF'y'yIyur6'yu'yy*uq'y'yvy*Jtq'y)'yIyv-%%#"&'#53>;#"!!;%` II `Jlk pE]2]2eI2Jd4%#"&46;#"!53#5!;ggJl:11 pEʔ2eIgnJd4%#"&546;#"353#5#;]yv`6`11f1|ZVu2B>GG2II>M4'y')i4.5!#"&546;#"!!;4h]yv`6`#f166|ZVu2B>2>M')4%#"&46;#"!!!!;gg:]Zi`5ʔ2@42 24?4, Y4 4 ')i"4.5!32+53267!5!.+4h]yv`6`#f166D|ZVu2B>2>M= %!!!!!!YY8888o )%2>54''46327#"''7&"&.J) ,5dX@558aW@657.I) ,57!/:*D7,^766CUb766D!/:*D7,5''kk0qj~ ) '/t01> !#!<^> !#!5!<^<>  > !l7#!!`BJlBl %&"654'327&547#".'632LE@Q;U,5-(43RGGAD4/./ .0/3#l#l2!4>!.#"`_.c |ldae`| 1{ 632%7.#"+rw,s;753.'#5#>5#,=U\\U='9W\\U<'g9('&:g&;f9W:):V]]U;):W[':gg9()e9>e'8D!S%##5##5#535#53533533#3#5#!r((tttt((rrrٷssss((ssss(}4[-59AIQ2#"&=##"&546;5#"&54632354632+7254#"5#254+;54#"2=#"9+?>,/FhG.,>>,99+?=-/FhF/,>>,99889ZHg9889gg9889998>9889ln4F ,$4&#"322#"&546##"&547546232uzyvvĆÿ&l   l l    2F'W%6=4.54>=4&+"7#5;#3+53&=4>54.=4  "*"#### 6: "*" ;6 %.%##C?$"4 "=$299'!#2 4"$?0097%7) !.?00?6&7+#"-9_ !#!_<^]}!*"@8]* 7@{7*WL8 "#4>32#"&547&TJkS3GW?"7(!5`X'.&# 9!.Y>T<%&#"'7>32TZZ 01N+%C2(! ff * #>T<#".'7327T!'3C%&B3'! ZZ3 $ # ffTR*W?-AҾ-A-A'-8!!532;#".#jm6_@B4F$/T9A8Q-88;WgW;8;WgW;2#!"&54637'#3!'37'#7!&    [0lؔ  [ 37'3733'"&5463!2#CdRPf  }(  [ +7CO[gs'3?KWc%#!"&5463!24&#!"3!26+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2#!"=43!2%+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2:(*8:(;(:1;Q /     0  5 /    /  5   0  5  0  5 /   0 5 0  J m   14 0    11   `)8:')97+K K K  L  K K  L  KK K  L  K K  L  KK K  L    L  K:223AA:.'7.33(4* 7'3#%%%%k+##<DAcjptb7b#%#&'!!673!2#!!"&5463!2 (bHb(!EE q Sj66jV=(=   7b#&'3!!#67!"43!"&5463!2eE!(bHb(!EA q =Vj6h"h6jV=(T   7b$567&'!!!&5!"&5463!2p=Uo75qW;  L q E!+lk,!E";   7b$%&'547!!!6!"&5463!2*q57oU= H ; q G,kl+!Ev"E   7b463!2#!"&5"/#!7 q  }$H~  ",Vj-AҾ-A-AD+)/ zo0/ )/ \)/ )Da)k'?'F?/DS)D)"   uH<#<# jA<#<# <#<# <#<#' &t' tD )   # 3%!!7'5!5!}_D^D ^;cm5\^^`'01X!5!%32>;'7'7#"+}'G5347I)CwwA ;128>R/88?1N^^N1!!1N^^N1 "/49>CHMRW3767&''#67&''7&'567'767&&'27&'67'67&#767'4'u6J9X&b/DAAD/b&Y8I6J:W&]1/p(PT){R 2>@2u)WR@B2c&Z:I6J9X&a0 =CB>.[&U9L6J:W&].B>1r*QV)sO 2>A1u'VP&~W1?c."&462.#"373267#'desjddU~cc(ccF  !"&632!.#">54'!Ćÿ(wFDxqACo4=K~w:Dt5~'('(!()$  !5!! 7l7* g711*-$J$  !5!! %!7l7# g7111$L !!!!tSCWW&5C ;# gU ' 048<DS#5#532#53#53##54;#!"=#535''7543!5332#53#53#53#"=33!73"&'C(3Gnnnn (4 99*9z+(U(((((( 4( c2FnKTq: ((((( 4(Ei$$5mmm/dP(3. I! $ 7LTX\`h#5#532#53%#53#53#53##54;#535!353#5#"543!237&'#5ᘀ537+5353%#53#53#53#"=33(&((mm((((MH(\Dm ((9%,Zi(5 (h(&(((mmmm\(H3(nh(`nn3G((~"n$L> IBF(n}((((*-%#!"&=4675735##%54&'!3!26[Ȋ[OppOlp:]|^9Ex8yD[[@\8]#oo @sF-Fs@yDE %+0%#!"&=463!254&#!"3!26"''&''&5 [Ҋ[[.[(ExyDEx.yD;P, jrf֊[[[[yDDyyDES 7$ jx(8! #57>7RT"JT=.GiF%(8z 3#(RR (8 .'&53z: .=TJ"TR+ %FiG8X WX8X V8X!UYX8M#3#"L|^X8 #L XM ;#| ^78,4&+53|8, #,L 7, 3#53265L| 8 #4>7R #1J0O4#/>*0O&8 74&'5>=3#ZabYR $*%%*$ RR~"~Q~q$=/%  %/=$8 .55NB\0 D$P -3Q?28 3R-8 cX8 %#4>7.=3R $*%%*$ RYbaZo$=/%  %/=$q~Q~"~-8 aXL8 #S 18 #&'&#!#&543!$8qLX +6"T1: %!"5767'3!2767m ED^">o6v.l!5LG >x@H>@H'kWl80!PI8y!yy Ly|8yz6 ,8##"/&4?632343276325#"/376!"=54327G   fg (S SiRK eej ff SSRIHog! !5!!"C%Bk L@8k9 @'r"^@9s4^@] #&'&#!"#7!# AIIA #v9??94zO#)!!M4/%ESs;!,%"'%&547%62%"&4622654&#";  `` (L冾_NopMOnnQ    v޾^pMNooo8v#!"54763!2!!v  98  { (82!2#"&'!"547>#32%&#"0O1D5O1/O05NC56D76D89=;:6=;HpII)///8)1%Y/+/26KO/6A/;7,7/;/7,(37/(3/147/7/2(3>/./&$:2///(%,cBY/%w6heX/7e+vd`Z/)d/ydY/9x7ddVY/)w)df|Y/5f&reL[/6j6td+Y/,d6rJ/'E//6(J//&0'EJ/#/&0'EJ//&0'EJ/,/&0'E)/1%/.$O/</6A17/% /7,(39/1/$&0lQ/0tl(oB/% /8 64A/& /6;(=dQY/6i)wcQW/*p6hbQY/6g5weQ\/8{6jbUX/3b6qJ///(/'E- 73!2=3!5F  4cZ1VK// 1FM ##########yD!!yD0y\!!y\`8!3#00!8!3#``!8yD!!#g0D0$8y\!!#g0\`<8yD!!#`D0$8y\!!#`\`<8D#!50PD08\#!50P\`8D#!5`hD08\#!5`h\`y!3!0 #0y!%3!0%;`y!3!` #0y!%3!`%;`!!5!3 00!%!5!3 0`!!5!3`0!%!5!3``8y!3!!0g#0$8y!!!#3g00\`<8y! #3!!#`g0 #0$8y! 3!!#0`D#0$ 8y!!!#3``D0$8y! %#3!!#`g0%;`<8y! 3!!#0`\;`<$8y!3!!`;`<8!#!5!0P!08!#!5!0P!`8! !3##!`0PD$8! 3#!5!3`h0D08!#!5!`h!08! %!5!3##P`0`<8! 33#!50`h\;`8!#!5!`h!(`a8yD!!#!yg0PD0$8y\ #!5!!0P$`08y\ 5!!#!5g0PD`<08y\%!5!!#Pyg0``<8yD#!5!`hy$008y\ #!5!!`h$`08y\ !5!5!!#h`0`<8y\!!#!y`h\`<y!!5!3!y00#y! !!!5!3g 0D0`y! !!5!5!7P!;`0y!!!5!30\``y!3!!5`D#00y! !!!5!3`D0`y! !5!3!!h`0;`y!%!5!3!y``;8y! !5!3!!#P0g00#0$8y! #!5!3!0P0$`#08y! !!#!5!3g0P0\`<08y! !!#!5!3g0P0\`<`8y! 3!!#!5`g0PD#0$08y! #!5!3!`h0$0#08y! !5!3!!#h``0#0$8y! ##!5!3!0P`<`#08y! %#5!5!3!!#h`g00;`<8y! 3!!#!5!3`h0\0$`8y! 533!!#!50`hD;`<08y! %!5!3!!#P`g0`;`<8y! 3!!#!50`h\;`<`8y! #!5!3!`h`$`#08y! !5!3!!#h``0;`<8y! %!5!3!!#h```;`<y5!!5!!yy00h8(!3#3#h0000!8y !!!!#gg00`0lh8yD !!###h0`0D0$$h8y %263!+!!+o0`00lT08 #!5!5!50PP0`08(D ###!5(0`0D$08( %#!=!#0(0=0`0$y! %3!!!0gUk0`0hy! 333!h0`0Q ##0hy! %!373!y0`0Q0Uak0! %!5!5!5!3 P00`0(! !5!333(h0`00#(! 3!5'!5!30`hh0!0a08y! 3!!!!0ggk0`0lh8y! 3!!+30Q0`00!#0$h8y! 33!!!#h0`0Q0k0`0l8! #!5!5!5!0PP!0`08(! 3+!5!300`0h0!08(! 35!3#!5!0h00$0;08y !!!#!5yyg0P0`0l08yD !!###!y0`0D0$$8y !!!##!5!yy0`00`0l<0y! %!5!%5!3!yy00`0k0y! !5!333!yh0`0Q0##y! %!5!3!)5!3yy0Qh00%k00;8y!!5!3!!!!#!5!P0gg0P\0k0`0l08y!##!5!333!!#`0h0`0Q0$0##0$8y! #!5!3!!!#%5!30`0Q0h00%k0`0l`0;8y %#5463"0άɺ08 %44#00 yXy!yY7y ]/7y 7y7y  ' 7 y_`\\''$D!5!D0!#0!'yD!5!yD08_#0_'\!!D\`!%3`%y\!!D\`7\;XT5!!5!5T@P(8!33#0`\;$XTXX8!Y%!!8!5!}82!5!8!!w8,!!8!!q8&!!8!!k8 !!8 !!f8; !!;;8 !!$8} !!}}8 !!8 #38` #3```|8 !!} w  #'+/37;?CGKOSW[_cgkosw{#53#53%#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53%#53#53,>>~??>>~??|>>~??>>~??|>>~??|>>~??>>~??|>>~??|>>~??|>>~??>>~??|>>~??|>>~??>>~??|>>~??>>~??>>?>>>>9>>>>>>3>>>>>>>>3>>>>>>9>>>>?>>@w  #'+/37;?CGKOSW[_cgkosw{#53#53#53'#53#53#53%#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53#53%#53#53#53'#53#53#53??~>>~????|>>~??>>~??|>>~?? ??|>>~??|>>~??>>~??|>>~??|>>~????|>>~??|>>~??|>>~??>>~??|>>~??|>>~??|>>~??>>~??|>>~??|>>~??|>>>>~??|>>~??|>>~??>>~??|>>~??|>> >>~??|>>~??>>~??|>>>>~??~>>>>>>?>>>>>>>9>>>>>>>>>>>3>>>>>>>>>>>>>>>>>>>>>>3>>>>>>>>>>>9>>>>>>>?>>>>28 =AEIMQUY]aeimquy}##5##5##5##5##5##5##5##!#3#3#3#3#3#3#35##5#5#'5#5#5#%5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#5#%5#5#5#'5#5##5#>??>>??>>??>>??>>>>>>>>>>>>>>>}?>>??>?>?>?K?>?>?>?>?>?Q?>?>?>?Q?>?>?>?>?>?K?>?>?>??>?????????????????>?>?>?>?>?>?>?????}??}??}??}????}??}??}??w??}??}??}??}????}??}??}??}??}??q??}??}??}??}??}??}??q??}??}??}??}??}????}??}??}??}??w??}??}??}????}??}??}??}???? !5!}8 #3``8|,!!|, }8,8}}, 8}8 !!k 8 '8}88 !!!kr 8 ;X,| 88 '8}88 =X#)!M#)!!M ms#!%#!"&54763!24&#!"3!26eGHd/5H[Ge0I33"&H3[3IHddH[I.5dH[4H!'43II#&CB # 7!5!5!5%!5!!!!5!CsssMms }} #F@# #'+/37;?C735#535#3535!!35#35353535#35353535#353535CMǎ }}}}}}} }·M }}k}}k}} # !%#;'!!535'+55ᘴx!!!axh#h>z#Z)Z#Z% ! (5(xTx x%'!udeΗa^ ^:6d^ 7 4(LL8d/=XZ /;W@^; FXX@ ^< 7- (o#Z Zed?#Z %!sKM7d5(>d^k _W8^  >\% \>d/<bY /8W'@^= FbZ@ ^: ]~# hghg$% *+gg0*-gg$/h i/qv*=m 33' ѿ?yk:<5 "32654&'2#"&546ژ)ٙ֟#%+17AKQW]cio%&'772327#"&/"#"'632&'&'7&'&'7%'4545&545'67%67'6767'6767Y  [    3    O u D      2  3  ^       %   g   n !#"&546324'6&'6'ՙ՘1tt;DDuE;;ku[֘ՙ^_. x A^ !-2#"&546"264&'2#"&5467"32654&ژۚX{zzzR_bcfٙ֟բxVW{{{'abdbR# 2#"&546ԕՔ՗#2654&'2#"&546ԕn Ք՗#"32#"&546Ӗ‡ѕԕ#!4&#"4632#"&C Ք՗_ԕ#32654632#"&C‡NѕԕWӖ# 2#"&5463265!ԕ֓Ք՗ ¿#!"4632#"&CI Ք՗_Eԕ# &'.5463VA`yԑ1)j 32 y`AVՒj)^ "32654&7!8NO87PNvN89OO6:OM#  2#"&5467"32>54.!!RT`]\^]\\MUT[]_\\]\]O#Y "#!#4&2!46ɉ~ǑZ#X !2653!37"&5!vMȊ~rœZ#X "#4>3Y\ ccW[e`U~0@\~#`~@#X2#4.#"#4>`_ WWY\ cdaX[W[e`#^#!MM#)M#3!##!#M(6 "32654&'2#"&546'77('88(:NP78ON7'(88&(8(O:6OO98N# )!!M msW>=#)!!Mms#7!!!Cs M sm#!!!M # %!)!%!)9Z ss M#Z% !"&462 "(5(" #Z%! Ne(5>#Z%!(5( j "32654&'2#"&6ߨ➫wqԯ㤡)us# %!!!)!!MYZm s aR#@###@# 32654&'%!4632#"&F½{:y*Ք՗Q6ԕ#@##1@##@##) MdmF+a%!!!a7s+Us+a%!!a7+s%!!!YYp}%!!Y}Y#@ J763232+"/"&=&'"&4?&'#"&46;67'&5462675462G7U T.x x.T U5I  H7U U/w w/U U8G  w/U U7H  I5U T.x x.T U7G  G8U  U/w 2Jy &547>32>32632":.,4O+ !) M 6,JJC ;))4,)8%8# " *"&5332653>2&#"&#"&#"&#"Tp@<<&54&'654&'#'%H'%'%B'%}'%{'%'%4'%&'%m'%'%@48\0_TM9 6IL=cM\W4M/7?64GL \ I M   &   &  &&r  MR@VMgK;,0$H$0u # # # # #e #H # # #e #} #@ F     Z  &  H  (:/&lC>fZ5Ad4@%  a  f &&   1EoAgnJ<_7"9 97/AO7632#"&54'7632#"&547632#"&5432654.#"4>32#"&   s  sV *5% Hg$A)If)%4@/XXWb\ \  6*B$hG &3+gH3Q- ~}   !''!U YZ쪪  ''%77'7'bF<gH0> z|Ҕ'&#"'67'567 F#NRWQ++QO&C :+,+SVCu&#"'67'57!#7!67u F#NRWP=QO&C :+45SV  $4&#"322#"&546"&462uzyvvĆÿ"l"te t"-9#"&'.54623267.546324&#"26%4&#"326R?yx?Rfe_EhiF^eGJb1H35GHhGH35FF54G@` `@JbbJEcqrcEJbeG4GG43HF55FH34GH n)732654.#"4>32762#"&I*5% Hg$A)If)%4@/N; 2XW*B$hG &3+gH3Q- 2  =MY~} q0;2>54&#"".546327&54632#"'4&#"32 /I(sPQrsP8Y1 aPBV;b8X2 cR?W;uOPstOQD!/:*QrsPQr((9F2b2CY_(9F2`3CY^stOQr 64=IS^%+!"'"'>7654'#"'67>32#"'.''627&#""32654&%#"&'32%#"&'32?x  (AZY@(<<E):8)(99 =$2%,/ ,1!7=1D&  C!!D  h))N8()99(':    6 )P"264&&'.#"3!262327.'."327>#!"'>7654'#"'67>32#"'.''627&#"2#"&546%#"&'32%#"&'32h!/.@..2 # c0/ !:* A    +>1D&  C!!D  j$$N:'(99)(8   !C )!!74632327>763#".M T3  7z&#IU=;# msM]" ZoH.<, *rv*=C  % ' 7 ;;!;;;; ;; < (~ '1;EO]z#"546#"546'#"546#"546'#"546'#"546#"546#"546"&5332653>2&#"&#"&#"&#"SOkQ(p@<<&3264&#"7>%227&#"6"&'327'>5676=<6 9Dt<;&x<1<&!-@54O 4Kd ! Y [Z T!*  7-'`d{ d[UVTC  "- 0)Wy`,(%? E7*S=%K= *7)3#5=7$J0 ;.%3  J   i 8 '" H#)@1  g  sJ=#  )  'q1((? ) q1 E#".'&'>5#"&547&54632.54632>32>32%#+'Tc,+ 5I 'Q8A+HH*!H:S(O>* ; ,,+)45 3lW$ *H%#*)[h1 63(+; y:JT4632327>7>326;>4'32##"&547327.=#".%54&'   # G%)<85 '# &$./=^/$ ( >L!7 %mM>jH,2-/  !#&4%'.$$ "6 Z3)1 +S+%7MCV*E / z8&7"54>32#"'&547.547&5467'"%632#"'32654fZ2,c(5'M4:h64 l #1*$ $(B.[.U 6 '!_qPO]SK z8*;"&##"&'&'.54>7>32%327#"&546324l 46h:4M'5(  ,2ZݙR($ $*1# !' 6 U.&9[.B_KS]OPq /*.\f|%##"&547&547&547"&546326323275'#5#3"32?32?#32?>35"&32?&#"".'32654&#"2654&'.#"'32654&/&'&(,6X "i%*)|i S#6F?6#G$; +'2% C6 O.   ,0eG?E  ] !   b lg J# 82 $!. L" 1C@G  15*#  R=R    *!  1 "*$    *.[dz47&5463263263246323!'753.5!4/&#"''5.'&'#346"6544>7&#"32654&'3267>54&#"74&#"32?676;2 # / K" 0C?H  04+ #.  R<R   * "  1 #) #  `-6X "j&*)|h S#6F>6$"H"< ,(2$ B6 !  R,  ,e$HT  2[!"   b lf J"8 /*.[i}%".'#'732632632##"'33275.'.'#'7327'732654/&#"%327654'.#"#"'&#"327>4"327>54&"32654&4F6#S i |(+$i" X6, 6! .O 6C %2'+ ;$G#(4G''= !. ]N  (7  '  #J 1 Z "L .!$ 2C"  #*51  G!DR  ~% !* A&   Q $  -1^k4>7#5'7!##".5#"'#"'#"&547&!#3>7>757732?654'&'.327>54&'&547>54&#"324'&/.#"3264'./&'&#"326;0Z "L /# 2C" # +40  H"DR  ~$" * A&  R  # T4F5#T h |)*&'n_" X6-i7!-Q 6B $2(, <"H"%4H$#'< !/![1N   '7   "J  "_go#"/.5462#"/7326767632#"'#"'&'#"'"54>76367&'#"547&54323254#"3254#"3273254.:  ?ZY !  !  !$ C"W0 !'O?R, ?2<6."?I2+*%&%&&%$' {290?HI>&E0(--#5  ' ) 75"13$%  6 +.&)+.&N   t*%#!"&547654&#!#"'.'&543!23!2te}}x ! '  G# 'R;'N& q&Ko}4>3"&#"&54>7&%4&'2654.#"'654>2654'732732>7#"'#"'4>32&#""6=63&'2.54,5**< <* #/K?R$:, IL?*D( NO$4)K-# )< ?Q#  #F=  F=SB:Qm95: :4 /(0(ZD1 Y2A*D( %1'&2$) HV@(.:T*$CCN,6*%"i=5*!#*> D )#/'HW;!  !'3Z ..GE[C}) m =\`$V< bV!%)4@EJOT`kpux2767&'#"=654'!#".'"3#".#"3#".#"3&'#5'>7&547&547&547&47&547&'&'2654#"#"'2654"#"527254##"&=!#"'67&'5&54"67.546323254&4'6'4'654&54?654/&54?654&#"32632&54>&4'#57&'67&544'26'4'654'657.'7&544'6'4'65'#"5432#"54324#"32'4#"32= ),e" -G-!+5 ,$) $U"(*#$# #$#*("U$ &$, 7+!-:& H"e,)  =9%% $"!#$+^b7:2]3%" 2\2 9")" ' !C/ ')$m "%>+ #$ Y\  r  l  r     )>% # ! " !$F  \\  F$! " ! # %>)   F!   < <=#&! $  ! <<8<x  / / T * * ) _    +l    N!%'#5&54627%>54&#"!VڐNN4N4NM5M T J iNOh ,GK12JG %#5'75#535#53533#3#Qk"I\\Q\\j"ee2H!PPPPPPPP1H  _3254&#"#"'>54&'53#5>54/#5>=#5>?5'.+534&'532"FM "P=  2#d" T = |d  % !;6 u@8d!.7   #c Y!7 (; A {h (U8>!3###535#53533Q\\Q\9PzP9PTTP %#5!3#53!#53!#53#!534YY44YY4Y44YY44Y "32?#"&54632373'7zTXSs6V=Žh^aaONNmxwTX#!‹C\\8]99] <1u#"'#"&54332732672"547654'&'&5432#"'&'#"547>7.54763265454632654'&5432%#&'&547632O34/)0  & (4 [ 2V #sjV#R4T  T4OVjD    D12 [s# :1+ ## Hm+gjx#"lgm1!/ /" 1mxbX]cN.//.Nc]Xbw#E1BIjg+ml" |v4'6'.54675#7.5467&'7#>54&'&'"&547&'"5475"&547>77>54'( V+!  dH15$,H$J-AG5 ZZ 5GA-Jfr>(Ge  |3Z&l&Z4|!+V 5?Z'< E -.,#)Lx$!,-J*# ,&X4=Y .. Z=6V,`[;x#zK+-%//,`J   08v$**$v80   L <'Z?5+ C%"/#"&'#"'#"&54>?&5463273327''7654&'7 d>QDhD$    /!3`&6FXT.tKzBc * c'<1 k    -TDXU*SU+ }w>d  %#"&54632'6'7654.'Ćÿċ`TW-]Q3HG3Q\-JBD)FoAnQPoBoE) +732654&#"632#"&546324&#"3262#"&546mYCBYJt@* AZoRD\]C}5J^@XD_‹‹2& 35!%5!%5!2  dddddd2& 53%#55!%5!^ ddddd dddd2& 35!'53%#=!2dddddddddd2& 53%#553%#55!^,dddddddddddd2& 7#553!5!5,  dddddddddd2& 53%#553%#=!^,ddddd dddddddd2& %3+5373+53'!!^ddd dddddd2& 53%#553%#553%#5^,,ddddddddddddddd Yp %&'#"54323&'#"543247#"543267&542&5432#"'632#"'2632#"547"54&'&'&'26326326323#"'#"'#"'676767&547&547&5475&547&547&5472654&"7263263263&'67#"'#"'#"67&'&'&'676767&'`bF"!  A !! F !"GaBaG!"! F !! A !"!FbB-         + )/  0( $&{       9 /)  (0 @@  !"Ga!"ZN!"! @ !! @ !"!NZ"!aG"!  @ !!: )/ > /) +       {6 0(K )/ -         !*3$4&#"322#"&546&#"'>32'"&4622"&4632uzyvvĆÿ*:9,A('A""l''%--%" ""   )2#"&546324&#"32'#"&'726"&4632#"&462Ćÿ)uzyv E()E1zQ""J%++%%"" "  '2#"&546327'#"'264&":64&"jĆÿ#/SQ11675"""NBB$""  V"32654&'763232+"/"&=&'"&4?&'#"&46;67'&5462675462PloMNno9G7U T.x x.T U5I  H7U U/w w/U U8G  mONnoMNnw/U U7H  I5U T.x x.T U7G  G8U  U/w sI#%#"567>4&'&'432>54.'sԞ&GPPG&BUC/0EW?jCDk=*9 I#.464632#"&nBUC/0EW?jCDk=*9햹 44  )H32654&#".5467.54632326546232+"&=#"&46;I*5% HghGIf^fG68E  fIHg  E86GrQ    B*B$hGHgg J@li@ IffI @il?Uy    )032654&#".546232+"&=#"&46;I*5% HghGIf^frQ    B*B$hGHgg JY~XUy    4732654&#"#"&54675#"&46;546232+I*5% HghGIf%3@.WsQ    Kx*B$hGHggH3P- }ZUz     v n4732654.#"4>327#"&46;2"&=#"&I*5% Hg$A)If)%4@/N;ɒ   2XW*B$hG &3+gH3Q- 2   =MY~} u6>32356732+"=#"&54>54&#"#" W29= $ ( 33($ &(=FG:>I+R   e=*3-  ><"&5#"&5467356323+>32;2+"5454&=/B  I I H K!V#Un]Bj^U.B4   H F 4&Y1F  K%(Js @mAM##"547654'&5463235423>7632#"'&'##"&5467"32654&Zl gg :; Z(f 2C dd kf*>J0-M<(31 34|l^ eXX^  /Z>bb?L<  Taa] VtG+-MH2/A &1"!165 =ga%2+"=#"&46;5.="&54?632#"/5#"&54?632"'6=#"&54?62#"' }(w wXl 7 7   7 7   87 mV  ii  UP 88 y 88  u 88 PU(,%2#!"&546;2#4.#2> O 4@gAM,-LAdB29AbT<32#"5654&#"  `N8PgHEffEHgO8S[U ^M5-FdUDDUcF.5M '9%2>54&#"2#".5467.54322654&54$2O, }VW}~>VEAR+322654&"23267#"&5462#"'&546T;;T;C0;tE6 #;ST:;S[bPTTT;;T<0=vC6$;STtT[b <*+:;*+!(!^XTtST9VR*5:;*+;=)*!)!_WT9;ST:VR*o   V:B4632.54632265462#"&54>54&#"#"6264&" O8#R.ÂS_$33$8N7  O78O6A6tu6A6O78N77N7\pOm9t=zM0bSQ]+'77' 8NN8:}\w4`||`4w\}:8N(7N77N >NZ4>7&54&""&54&""&54&#"&4632>32>32>32#"'#"&7654&#"r)]+KjL  KjL  L5 0PP0/PO02S[:Jn  !% ҄U;?_ ,(35KK5 5KK5 5K  0((00((05,+9bIl   D f-7LN7$ X 17!2#!"&462!2#!&=654&#"!"&463!5464  l  }YZ{  (   љt  db  t K#"&54&""&54&""&54&#"&4632>32>32327#"&46;2"&5]ah>OKjL  KjL  L5 0PP0/PO0Fb<0OR: o  L?:5KK5 5KK5 5K  0((00((0bF%->  o  k*7#"&546;2"&=#"/#"&4?'&562y       y      )9"&463!2632#"&547"&4767>732654&#"4  "Z^z#',\ja v+o'7C2Lpt79   &N0pay}742i 2Od);\4" dM[v; [A%".#"#".#"#".5463232>232654&54632".#"#".#"#"&546322>3232654&54632(C-(.* #9$8*+9 3K  cC(B+(/) #:JD.F'2L  bC(D-).+!$7# 8*+8 3K cC(B+(04* #8$&D.F'3K  b#12# -. #12#I5  E`#12# -- 5?5I4 E`#21# -- #12#I5 E`#21# .- 5@5I4 E` C##"&547>7#"&46;.'&546323>763232+#"'.ya Wl lW axya Vl kW ayGj+  '^  ^&  +jj+  &^  ^'  +L.<H[hq2#"'.54>324675'53733>>54#"7"3>54&.'6326"25."3254. $-!#-% 11%)%  %)% 9)+1h*3!C  "P EegC$5g`+ 4"*"*O6CCFZ 2$#4 '/'$&&$+,  " ;;!QeQ4+(2&.22("&Qe   &.%232654&#"326&#"62&544  "32544&5462654&5463265'&54632#"&=4654&'&'&54632654.54626%"3254'"324!"324"3254&.'&'63267&547.z7_ {45z vOSWK == F;!. 6 !A!"."KIQA "."!@".!6D       63 RQ44 -  h@{":!!9#1`r:!!! *%:C*"!)( \ ::H*)!!$,A,($+ !!9s[S @222@ @7? (/b Fw//HW2 .?  +vK#';35'575'57335733573%!5%!'#'5#!75'##'5 fXZnZXf@BpBA8 D D 8A|EgM[[MgEO''c@@o87788'7Cc"'632&547"2654"3:3254&32>7.5#53533#23254&'.""326326732632.'.'632327&54654.5467&4632{F'OO/115$(u.I,oBI-:!q>""$""p>2)@,@;)-31AnG6*41!  _}YL=  !17)7Gs"'' u   j  h  G^.) .^,'++',"  ! <" ?$  0? "? 8"?i: !h?8POLt72#"547"54632'267&!654.+.'3263232767>3272!>7#"&'#"'>54'2636 ]&0 05J1C;< '9 i ,Q' 8H;)]!&#'7  0x>1 z $ ,[N.WT.@ )  #D#(B G =[a/%.H&9!1( <&%3"/ $QL+I!4.54>4.54654&#"&5467.547&5462V**e % @E D3F3E!EA (N6-G' ."!  #"" "We#2C"+,!D 1$dW! K 0?jy"#"54.#"32732>54&>32#"4#"32632324675'53733632#"'.'&546322#".546*-5&%6,)0D)'WY&9 0$ '6!>bBSpo&)% " $(#/24I''I341 %-="7''J/1L%,'DF)7/ ',$:"&-"  \+($%%$)-&D3)6!G1DD3O5)2E<!C,"/$ $,%"326323254"3247"324!"324"3254&#"&54654&54.'&54632654.54632654&5462654&54632654'4632"32544&#"3263232|?gsp8  k' ioQ\}K.!!@!!7!.6!!  @!!.K w=:{hy 2?22 2?2 A@W 2R+* !#-A)-%*  !&8s^2$; !8$2^r9" ! &,)A-!!(?k X uG#3'575'57335733573%35'35eNG&o&HNeGdMYYMdG""""7NZc%"254#'2654+"4.5467&4632372.'.'>3327&5467535#5##3"3254J331?%3n'(Lb3'(8]<G4-;#B^ : !8YE:E= # 0   *!#9j.&++&.DM1;L2654#">54'263632!>7#"5#'.7"26544.#322%}xO! 9H<)Z"'$&8  /#5>6cgd' $%&!/(=[a.%,G(:2) =  JZC 2uQL!&5467.547&5462E E@UAE E4F2B3#dW# #Vf"2 C!,,!k$%3!56767#"&54>7#"(,C$U,T 4R5K,FJHGKF-K5R4P* 8vPJ5-J=BkCBjB>J.5JI6.5463267632">54&#"#".'&OTP4U>U22F=W5QUL1=K]^DJF.84?/ 9Ekgh/?VK,6"8T;5qhkkF4+|m4/hX[c/398 /!*Jz &'67>7.8F!JE;;8-0>P<6jj1?0 8!5>7#"&54632&5462>32#" ".F--F/! O&@\S;""']]'  ;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_kC%3.'32654.'3263!56767#"&54>7#"!28"L2.@,740 ??;%@.K((,C$U,T 4R5K,FJHGKF-K5R?('t?.!7&//O09Z40='.?J4P* 8vPJ5-J=BkCBjB>J.5JI>32.54632Y6=W5QTMOTP4U>w0JFT;6phiBEkgh/?Vz &'68F!J0>P< /h%3.32654&#"654&#".#"32>!5>7#"&54632&5462>32#"!28"c`%G<$vLB44A2.+8!?D(.%  ".F--F/! O&@\S;""']]'  ;S\@n?('H538 l6&DF$e#A37G )(H%9%./$:#,"(_CA\ 82?ZZ?28 \AC_ _'<^'4654'&5474&5467'464654'&5467%#".5>732>54&'\'&2'(9N#'&2''%&'3Fd>_efofE2HH|L_sPK/=E00./ c,13-Pc*o C?.KK2 Yh`/21/'oI:1/0.K8:>.7iB7L 6**<>)(;&0&1&%#"&54632#"&54632}b;!2f9b;!2f9L\,8J'4Q\8J'4Q&74632!#"&54632!#"&!5!&f9b;!2f9b;!2g;4Q8J'4Q8J'@8I6 2764#">56;;+1T11 =#"#&'57654.'5673;54&'567332>7332673#.+#.#"#&''L*J   ! XI" & 'N U  0 Q$N#  %- T$   *Q&M/ ! WQ*   )%S   0  o $(48<'#&'675#&'6735'6737'5#5#'5#5##3355#5#o`l=3573"o` ""Xu?53<.=k] 7 &@@@&70:54/+'5327+'73'7&54?'3'3#"''&"737'H7#7''763: qa@)2u!9 @AR.Slk=AM )8l8-; D9 a@*-*8l9AM-e \ o H  # c[}oo(AApz,H !4' ebY o G'H! 4py' i)<E7+'732>54''7>327'7'."#"&54?'7'3#5>73#/v%ee/v01 n79g3$Bo79gO3 ,B!""@_ZBK"%*! 6$*" (! $U) i)<V7+'732>54''7>327'7'."#"&54?'7'36323#>?654&#"/v%ee/v01 n79g3$Bo79gr2@K2!*7.0(CB!""@_ZBK"%*! 6$*" (! $8{:.B)!,;@*&T i 6J]"#632#"'332654+52654&7+'732>54''7>327'7'."#"&54?'7'3B,l2:154''7>327'7'."#"&54?'7'3ؕ 55,nG/v%ee/v01 n79g3$Bo79g/(U}T!""@_ZBK"%*! 6$*" (! $ i4H[#632#".'332654&#"#77+'732>54''7>327'7'."#"&54?'7'3#3@D6,,9$)*#'(W/v%ee/v01 n79g3$Bo79g,bB48G$ ;,&(-!!""@_ZBK"%*! 6$*" (! $ i#9M`4>32#&#"632#"7"32654&?+'732>54''7>327'7'."#"&54?'7'3J*')5, 1&(5/>B2xz!))($/v%ee/v01 n79g3$Bo79g:Q'1+5FA(?14D*!"-,!$)!""@_ZBK"%*! 6$*" (! $ i 4G#>7#57+'732>54''7>327'7'."#"&54?'7'3-A= 04Fc/v%ee/v01 n79g3$Bo79g%WwQRae,c!""@_ZBK"%*! 6$*" (! $ i*A7#'73>7654''7>327'7'."#"&'&54?'7'3/v 5ee /v01 n79g3 6 o79g B!"@_ZB K"%*! 6 " (!  !Q&8AY2'7637327632#"4?'&#'77+#"/762324?3#"&/&54?'&5437#"/m- -wfa(72V tVwf@t!n i`%-3,| ;1[ {Lm2 _ m&0&9I6" ] ( *<Fat7'.#";7654#"'&+2654/7+54"32=327;5#'4?3254/"1%#".54>32adt' 2B#r U16%$=dtU@ ^g l!%,y  Y0: PejLjL kJ  ^2%j8% G31& [ PjLPeP ( (;E\o632'76?327632#"4?'&#'77+#"/763232&54?3#"/&54?'&5437#"/%#".54>324.#"32>h/ &p` j$30Q m Qp`7m g bZt# *"Fu 8.U t8PejLjLفzـz GgZ f!0$60DR XjLPePezفy  0Icp|2>32#"./#"&54>32>7.#"2654&#" 2#".5464&#"326  !"!'<R:+%!+(*9N;3-1    )11-1)    ΉgY۴ܴ   !0*5Y & Y5*0 = )%'#4546323#37#"&54673267>uK&'&# D;`;V|7. .T>;Rh+X&'6%i?/B-;xZ<]J+@:WM;# 6462"!!!&&< |&&Zz#$462"&462"!!!?&&&&]< |b&&&&Zz#6462"462"&462"!!!&&L&&&&]< |&&S&&&&Zz##'6"&4626"&462462"&462"!!!&&&&@&&&&]< |&&&&&&&&Zz#'+/6462""&4626"&462462"&462"!!!&&"&&&&@&&&&]< |&&5&&&&&&&&Zz#'/37$462"&462""&4626"&462462"&462"!!!@&&&&@&&&&@&&&&_< |&&&&0&&&&&&&&Zz - ##"&54>32%"32654."&54632-ҴW{zϏV&8&'IhnΐђWe6''& , !+#"&546324&#"326&"&54632#"&5462,塧䢧(ΐΐT&8&''&'6H䢧䢖ΐͬ6''&&8&'& , #"&546324&"326,塧䢧|'6''&H䢧&&8&' , #"&546324&"326%4&#"26,塧䢧|'6''&p'&&8&H䢧&&8&'&'6'' 7!5!T7] 7#53#53P7]]] &,_, &-_, &-,_ &--_*%#"$#"#3632327.#"632 :9h\..ba9:.5:5R<[i7'7'#5&''#53&5462654&"#A\7BA|r)uzAB8\<('&2&%A#$)/D&e7==7e&D)$'=&((& m<GP2#"/&547'654'#.54632767>364&#"32>%"27&_=RHL @82K@@K28    JKO@qQkXZIY:M+jR='LL}15+9W(}LH:*`9:2)235531)24`.=E[h^[BQ:%h[$,C>r*&+QC*t\:@OXaf"'#'#"54?'&'&54767'.5>74&<546324#"3 65.'654'";=N.TW0 =SoL;K4 8 g#  13 -8 &=   Y-!<b*+ fY [)-{1!,3(     | }&.BVfy}4&5432#6532'&#"'632'#'?3#"'7&543267&#"654'>32327".5432 '7&5432676"254%6T &* "C   B GG  "C    #  (%!)EF ΁J:Ԃ9Hl8*  != *SS'\ =   !  *H\   %,, $.2#"&54754&#">#'##5##?!%2#"&54afMNcB(* W05x.x50<Cl)&}^G_gS!N!F]!  7N26?>32'.'63263265.'.54623654&#"6326326:O-  '.' >E=9) ;*/ %*)"Il=+)7"   fA%; ""+3  %P=\0Md5I%(F6, +1"C$<%@]$:TL,4   7CN%#'#"'&'5&'#&'7&547'67367567632732654&#"6"&54632 h!% IJ $ g JJ g!$ JI!$"h JfdcF44#$4 %!h JJ h"$!IJ $!g JJ g $ JЗbdcd5#$33$# | AJPW2#"&46.547#"&'32632675327>32327#"'#"5"3254>4&'#*:$'g 7'% %'9!d(";* !##-#$*(RA1&QC1%09 OO9/%1BR$.D !!$+:--. Y; *29AKQagrz2#"'#"'#"547&543263264#"6'&#"6&'&'64'32&'64'&'6766"6767&&54&'6&'32'&'&'322#"&5464&'2#274>RYY)5:a_:3.YY.4>]`;6" <-F6PO6=GK] 2FJ(:$E)B $~>7 4 hAOYZNCf_1G/>JF/<"7%,/`1 3=GP77NR67D,,/-T# *13KedLd eIgeIf t\=L.-O "#:> % 394 i:S*3H@ !X*;'IDB F<$I&>= :./?P2*ED+,.#/$2/%R(  " BF&7S<\A**)((    o`2#"'654#"2#3254'632#"'.5#"&54632327".5463&#"#"&54632&54>762654&#"#4654.'#4&#"327&54632#";#"&532673654&533254'#"53254+4632t=aV6..$'  +-#, ==-!/* (%..7V`>H5 .66- 6Y+DO2LhB   AhM3MD+'7%'%2.5!!6.3%2'$8%!Z<6R24  , ."+ f f ,!0 ,42R6>X6,$"ONNN"$,6A*0HY#   ' WF2+@D*61 +0]; p44r :^0+g)E  l/=M'654&#"'632%.#"'>32#"'73254'%.547#"54732$79.-EDN @" Gd%8%J.>+K#}3 `6h;/!+W9yq!"#{ 9ṙ N̺XRKSP MU>#<"w(=VM?ehEI} %#'.546322#"&54!  )7 pN9  ,}  '8#QhzW'f)6<I23##5#535&'3##5#535.5463262654&#"&4'%327&47&#"Z~nR__0``@11@``0__Rn~ZN;=#467.#"327&'~Z.),VU+8-),VU+XYJp\|FbbFK:Wp(5(50K:V:H`bF]{L0K2K*BK1J1K@n]|TB~`IGa Ek2AP3P3Ej3AcFGa '8"0:H7.467>327'7'3##5#53>54&#"'4&'6%3267.547QouWqL-*+UV+XtXcC``0__?UbF8UNf0P=P=bF8UNf?Uy|DXK1J1JAnW|>UT0\\0]BGa=1 wQ@\ @] I`=1wQ ^'f(46327'7'3##5#535.264&#"'~Z.),VU+XoR``0__RnI``IH`b]{L0K2K@oTz S0\\0S zTbccFGa';%746327'77'7''#"&264&#"'~Z.)*SS$UV$SS)X|]\|I``IH`b\|I/*0?1J1?0)0HAnY~NbccFGa'M,8%.547''7'776327'7'3##5#5372654&#"KSnX)SS$VU$SS*)-.)fUVeXnS``/``Ha`IGab- zTn@H0*0?1J1?0*0H1J1AnUy T/]]/bGFbbFI`' $#"&54675#535#7#3#264&#"Sn|]\|mS__bzzb``I``IH`b zTY~ZTz S0II0.bccFGa'D?$2353355##5##"&546264&#"Tz T0HH0T zT\|~ZI``IH`bmS``bzzb__Sm~Z]{bccFGa6- %2654&#"%#"&54622X{SW}~Qpg؏{XM~VW|qkm6- #"&5462-pg؏qkm732654.#"4>32#"&`*5% Hg$A)If)%4@/XXW*B$hG &3+gH3Q- ~}7'8A4>32>32#"'#"&7327&547&#"%32654.#"654&7%4@/B6 DXXB77AW)*5% /(>>%2IfH>>.*Hg$A)0I6583Q- &~%%}Z*B$?X_:gO?XX>hG &3+04KP/5JK7#5C3#732654.#"4>32#"&%32654.#"4>32#"&((Y*5% Hg$A)If)%4@/XXWE*5% Hg$A)If)%4@/XXWP*B$hG &3+gH3Q- ~}Z*B$hG &3+gH3Q- ~}7>0B4>323>32#"&'##"&732654.#"32654.#"7%4@/R{ '4=+XXS}|SW)*5% Hg$A)IfX*5% Hg$A)If3Q- pR.H) ~qTSr}Z*B$hG &3+gH*B$hG &3+g3n.7'7%'%3F(*?D %EEmO:?G=K7#'.54>54&=>54.5465#+-.0 s .#+C!#++.-@(< (:;hAc'&e@h;/<(-kG%&99//Hh*'f2#5.546264&#"]|oR0Rn~ZI``IH`b~ZTz zT]{bccFGac8 4&#"'6323##5#53326uSFM%[]md=UsVr;0Hme ==uT8~3##5#535''~===i8f#'3##5#53'7#53'75373f+=++=+,==Z,=,ǀ,,Wn #3#'#5373#'#5373==[[wwN68==): %#"&546737'264&#"Ih{TQ~fJ=z**z4^a13_\RI:@MLA;Hcs,~-t,H,+%#-T8"'3##5#535.547632+|_:\.=Leec.:_|r==([_],e%! '!5!7!54A45A=,na )5373n99= $,na # '#5!n99B$$=bOa !5#!#3'!353aO=tvF 49?INSYiv~2#".=4>5656'2>54.#"5565#"'32'5''5''5&'2".4>2>4.#"7#"5432254&#"*HevPPue%$euPPv A (`lHHm`'&_mIHl` )(AGN:'8 * HPT65TPJOS66TMLbcdb%ScQPPQQ>))+ 6#&9 9i ~,i 5#!1 1!#5 z~~}~~ }~ ~  i" '6( (6' &8% ($&B''&9  V)/5;NTY_eotz2#".=4>2>5#".=%565656%2>54."56565656'5#"'3256%5&'5#"'32%5&''5&'5''5''5&'2".4>2>4.#"6#"432654&#"+FdwQOue&%euOQwaJeuPNue'&euNPu A L (`lHJn`H_nJHka $# 6 Z)(AGN:h# )(AGK=$ . '0 * HPT67UOFNU76TJRb`db%S`QPP .))V 6$&9 9&$6V 9%%9 9%%9h ,eh ~ 5#!1 1!#5 z~~~}~ ~~~~ ~~ h} ~~ ~~ h '6( (6' %8% ($%gLL9   F "(26<BR_gr%565567$2#".54>57567#"'5327'5&'5&=2>4."72".4>4#"32'2#"&546--THevPOue&%euOPvB3  6+&>JM;!0''E =11JPS66TPHOT66St%bdcbLac`azQPPQQ)>()'(  6#&9 9x   w)) (6' '6( %8& &8% L&&':   V $(-15KUZ_iouy5655675652#".54>5756757572>5#".=7#"'5327567%'5#"'5327%&'5&='5&'5&=%2>4."72".4>4#"352"&546--T T--FdwQNue'&euNQw@3# tA&euOOue&%euOOuev0!;MJ>&+6# ' +&>JJ>&+=11''E=11#OU76TPHOT68UN"%bd`bRa``azQPP). -)1('''C 6$%9 9%$6x  9% &9 9& %9  !  ;w)) v)) (6' '6) %8% %8% rLL9   #Gi3?K%632'#'"#"&546323267&'.54632'"32654&"32654& &?" $ _k^`\eb14(-D2#TE8091#.F_":"48%3!%0 ,!=7nr &2@*"2#_ ;&"0B*)!1 0!/$*#Qc3<H32%632 #"'%"&5463267&#"&4632&"3264"32654&&_&8<)&z'8-9dF '. %?.&")%'v(r'  #(65)/;%A9X76$:*&:-#'!$#Eg9EQ3727#"'%#"&54>3>7.#"#"&54632"32654&"32654&1ee\`m]" ='F."1 '$(YER#2D-(44":! 5> 2%#0%  ro6=+ )*B0"!  F##2"*@00!/!f/!*# #  *5Ax72"&546"32654&2"&46"3264&2#"&547"32654&'26327632 #"/#"&#"#"&547>4.'&546324&546327&#"+"3267327-4654&#";27&#"#"$44J55+&%#"$44J44*%%""&/  8!cJ*@%B5[CI03R?BQ@#{NS#9QB=W*F /3"& b9DKB63A8E",1D43AL?C:^  'G5$%44&%3&&&&5$%45J3%4%%4%   W _9 '=1~ ,+:LQCS) : *OBQN7%/, * >C>7CCh&&/1@E6:E 8 #@IR%"&#"32654& #"&54632#"&54?4&5467>32#"'67"'6ZE] "LՒכQm bD9>%- 3"7 )6ygOՕD3LM RyQ <1L D!# ".=%'>5%7&&#"76322"&5462#"&546"32654'.i!''C 1)("(;;T;<.ӕ֗eVËo,tV?&u>[nT'L ù<)*;<*);Փԗo^~Ċd(.#Q4&'"'7'7'7>37654654/3232+32+32+32++76x2sJ3!##!3J$=!%W% '=!1<J Fx]jJ<1!='  %W cv vc 8 7  F  cc  F  7 X#,!75'#"'!62v;9Fv,]) Ģ77g g773iw7463&54632.546327>32#"."'5332654."32654/&'32>3.'#.#"632>54&#"32654&'7&')0G% ++( g8W0 8, 3 !-h]e2R  >L ![%( 8  M</X K#-&&/ !&::TqAA#Yp,=z(8E2pT28:C|mS ' b % Loi ! 4 A| u* !;4x)_o~?67>776327#''#"'#"56?267327654/327#";2654.1432'7&"3677654&#"327326547326%#7654R# EL1=U J]&  \hc*O4Y8 C&B%K Bx;/:|   4X%>K ' w   <'O $xX iZ4KA8#`  T; Gg8 8!o& 8%(D FF5   $B Y :!  # V$^]>2UKO ;CN#3l  *17=2#"&5467#!"''??2654/654'%>7%>7 . 0_ $N)Q|E!yI#QBFn?q+Do ( *>>W  t|Y-%Rp/ ishGb$#&(-492"5'57!2"%5'%7654/'!!&!654'!!!6jNNee RRR(WaB|wD NOOvw   b__nmWP4()L#1l| ",39?2#"&546/763!27/4&+76%654''%.''%.'- /}Q)$U"Iy!E%FBQ p+ l ' b< =  v{r*/oQ";G ##&E7"&546;32>32#".#"7232675##"&5463235."#"'#";>8EJ:/',5hN5*$4G-&z'_0'(-_#w8(- =):8# 2U>CWK)0)xWH&-&Bb&-&:HI0"#2FK?)0)JE2-G##gL6E22#".5.#""#"'.5463232>76#&#"32?64a!8/4S3:W1,7$    1%.J?Rz1  !o *$$* HnL*?B:  ;#"&'."M T:Z-pQ%,)G4wf  7$+674&5<>76763232767632#"&'&'8 &  nm  B)4J7G k! %  ?'qW  R#J/;@/3 #  ' 7  ;; ;y;!; ; # ''7'77׮<I#"&'#"&54654&54>767.5&546323>367632>32<eBl [rT#    J H  p#[3 +  )  $S7#"&##".'#'74654"".54654.'67.'6732632>32Q Zy# .:O =   t2$M  4 D"  r  #;T hU, 2?,%O,K# #3##5#53573##5#535##33535#\ġp\\F## 3##5#535# !!'#3!5#!nnonno!nno!# 3#'53#5#5Wz# 33###53[[[][#33##'#'537#3335#5uLANkV8Z]GME|GLu|]c]# #33###53'33###537#3335#5[[2UbUʘbb#`S1;54&'5!#"732673#54.#!526=+"#;iV[HnF[ Oj,W<[HF] NkJZSnmS\G32SkiN ^Eo#  #3#'#7'337/373#/?#ZiffijffRRRRT?}A=<<==32#"&'#"&546=#"&54632.54625&'#"&546#/% 029P:2/ *&(1'99(1''3/  9P:2/3''2'990 )'(1'99(1''302:P92/$1!'99'0))2/2:(':#C%4>=#"&546323.54622>32#".##"& #*#!0,5OM5 0-!!MjM 6$3235#"&547&54632#"'3&4632632#"'#"&547#632"&547.546325##"&'#"&4632$($H&(%$%1!" 8%$$ (6' &$%% '&!%'&8 "' %&4$G $#D%$$ '& $$%% &2##"2#"'.'.'&54>7>76s x C.(& ;o12K ki 6v,(P833y* #(3#.'5>767>7.'.ǀz {-/agqT2*",)6Vf_6~ɀ|&VgX1JI0a# ''%7%77bF<gAdj # 2#"&546#7'7#ҕՒKOHՓӗ鑑#' %''7"264&R8qh'V.??X?> 俿 >,-??X?# $''%7632%'7./&547cE@f? !3hi"H$11 ,4B!&,+# 3'7'3!''!7#7'7#Ez7-tCkZMiXڨ=F'\cc\M܂܅# (23'7'372#"/#"'5'&543%7627'7'-x]"jn%Xt;=fH52uGMMGZ i qttq # !%'!5%#/%_f` aRSANY簰Scbc2b#x 3#'''!7#7'7#{R?ZVaQQKk#7'#5'7'75NNNNvmnuunmv# #553'77''7mm666V6Mz_zz_zz_zz_z#7%!'#'7!5'7 = 1%9 +;+ A"643274322#"/#"'#"54?%&543%'&5432f # #&),/7'#''7'57'777!'/'7?7'.|u 7 .xx:+15+jl/gֵ/4+ngk{6 1wv5 3yk5lܷ.6'flo16'#&#"/"/"54?'&5432762726666YPPPQ#;732#"#'#"/#"54?#"54?'&54;'&54327632+++,0',¿#7''77''٧٨⩩ک#7'''77'7''7G1}}12----2,26..62,#/3777!!'''#'7'7'7!5!'7'7'7l!`#j j#`!a$jj$ak#c!a$nn$a!c#k# ".8BK#"&54>7>32.54632#".2#"&547&54632"&54o<$*5L&1_#*5L&+H4($Z+H5'$^F22$#1U:  994 '&#iGW&#"&R"&W1F22$"DzLI|IJ#oy%4654.'&##"&54>54&54654.546323267>54&5463232>32#".#"#"&"2654&%$   *&9"BNBBNB"9()  #$#%   *(8#BNBBNB#8(* ! %#$=++<+*9w  )0'!$,   ,$!(1( +)>o   (1(!%+   +$!(1( k!)++>++ +#N%".'&5465#"'&54>7.5476324&5467>3282%@%CMMC$@$3#(>mmA8)z 6"%F6 (0&")%j$*"&0(% 22 %}3!( g  h &"|&#53"$|"& g  g (!3 $- DH5&+||+&5#Wa%4654"#"&467254#"#"&5463232654.546232>32#"/"3#"."3264& 8%:]T(  Y3 6%8II8A Y>9H C*7W$5,ICbEE`E# ?Rf{%#"&54>7#"&54632&5462>32#"'#"'&7632654&#"?3232654&#"32654.'#"/&#"327/&54323267'#"54?&>6L  )FUL5$A2%LlK%1B$5LUF)  L6q# !'6)*6^ V&8L7'KF1&6+",C>0-"+# =-&6HZ6&1!UEN6&-= #+~!3&6XJ E\ #4=Wk#"'#"'#"&547.4>7&4632632632%"264&#"&54?'32654/#"&54?'32?'#"&46327'&#"32?'&546327'&#"7'&546327654&#"76327654&#"7632#"/3264&#"#"/32654/*?+/SO/*@**>,.QP.*@)&66J55  )1"#1)f< _h02#5.>n "" nj "00" j _!; .5"2/hQ )1"#1)f< _h02"6.>n "" nj "00!j _ < . (#1/hx>-+JaaG +->-+:JaaH+5J55J5m "" mj "00" j_ < .3#1/gR, (1D1(f< _g02"5.>n "" nj "00" j_!< .4"20gR, (1D2(f< _g1#4. #  %*/4>2 &5466327#"'7.'%'%&47'>7'"264&ԓD!#$!EE%&<6 U6  >D 6JD 6QIdedeԓҔ C 6C 6RE J EE J 6 U6 `dHGeeg!:AGLSY^&547>32#"&'.547#"'&5467.547632%&#"654%>54&'3267%RRb0(IU[$5u 2&fPR/31'IT\$5s 2&ea* F\V * F!YW C9( KsW1%17/3#+[iD(& MsW1%17.3"+[d0#(ap'MG#(ap&KI$A7'/'#7'757'7'77''7'7'5'7'37?7'znadc!g Z&Z g!ceannaec!g Z&Z g!cdanXQ708 :k{QD;rr;DQ{k: 807QQ708 ;l{QD;rr;DQ{l; 807#LPTX\`d'4;73277632##"/'#'"57'#"/&54?'7'"4?6327577'5'75'7'Ä  }}  ~~rrrqssrrrqsscKKTDMLDTKKTDLMDTvCAABdBBACAABcAAB#A7'/'#7'7''7'7'77''7'7'77'7'37?7'ric\X42imM"Mmi24X\ciic\X42imM"Mmi24X\cU>"018f;yx+FhhF+xy;f810">="018f;yx+FhhF+xy;f810" " &2@N\k'>7#'&543'32.'7#"52#"&546#"'&54634>32#.2#".5476"&=>321    w  F####L & e ' tMx0N-IN-     j  ####Lx1N-|pLx1N-|% e% !   # %3@N7'7''762"&42#"&546"&54>32#".546324632#"&U8D00D0JF)' O4)F+()(4E1-!W7#D30.V;DT"By\1"!00DF1-W<!B10.#W5;T!BpF)(O3*D((*(4#P7&54632#"'62#"&547'#"&5475#"&54627'#"&546325&5462u5#%44$%H43%#4F4"#5G5#%45H #$43%#4F3F5GxM "22#$5 NN 5%#12"L=#54#>L "31#%5 NN!6%#13"M<$54#> # #-:GQ[g#'&546323#"&547'7632#"&547%57632#"'%#"&546327#"''&546322#"&546 1  X# X#l  ]  v # #&88'(88ޜ ] v # # 1  X#K X#8('88'(8$a'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! * $$ * "m "# m  * $$* m $$* !m "." m"* $$* "m "." n  #F "&546324.#"326㱭j$hC3 k\z# 3!5#!!nil* haR!# )35!#!olHh!MfG # !'!!Vw3xs@!# )7!!Vw;@sW# ''7'7%7ŕęƕ#h#hEM##M#|!|M#e4>;#"32632#"&#'=fA W9( %4&#"#"&4632e|6R( %=T\DIZ u)# TzTc#y"#"632>;632#"'#"&546>K{&#T2eL)!>ZX@b.O1D[L8PeuN5Z~Xg.9eLp$z&'3267#"'+'267#"&54632>32_K|&$T2dJ )!>YX@c,O1D[ %:lL9OeuO6Z>?Xf-9eL8N>/#q%4<%".54676;573#"'#"&5463232>7#ERx=^K1E. ! %I Mxg:8.'&547>22#"&466L(%JJ%6G* 9SS;32.'&5462"&46( *6B, 0082:'B9SSvST"  L?%5%/()6*A?LNTtTTvR#(k2>2.'&'&546/K2bsM,9 ZM NZg#Ss96$ObuZ4K:(@>=A(-=mYt#y!.54632327&#"#"&5467NJiI5F(2#23 Z>[8IgJNdb:Hg-HMO!AH*J4?fI;b#9Df#"&54632563232654&54632#"'&54>7.#"654&#"632327632#"&54632Uq;5A""$1 52+" "?2 0 uh&8n$ 66N.B$5>5$#C `@{M;b3! 7.46;32&5463232654'632>54'j>Mm% 7!L> ( $/^=/.$& #' 58<)%G #  Q-2,H/VCM7%+S+ 1)3Z 6" $$.'%4&#!  '/ E*#d&'.54676\@)hh)@\(RccR0 ,nn, )dc*#c7'>54&#Z*QccQ,X_qp *cd) # 3#&54m"2Tm/\# 3#654&#mmT&^#3#ihhifY##hhgggYZ#!3ZY#3#3ZY#w3#dddZ#w#ddddZY#'7rrNN YY#7'7#r YY N#+/";"&'&'&=4'&'5676=47676+ . #f: ! B 0mF Fm,   ' *3  0<$#+/52#5327>=47>7&'&=4&'&#h7 # Bf" .   & )2 -<$  ,mF Fm2# 2 &546#32+!5#"&5$7vM "$( ԓӗ]H  ## (# 62#"&5464&54632!5#+>54&#"326ҕ[ &%C?su%IQN2eTDX Ւԗ 3)8Q.Vc /&&9$)D0@L>/!# L2#"&546#"'632#"&54654&#"32654.'&54>54&#"32654/>32ҕ>1&18>+  bK]y!1( ")"RMF] "*Ւӗ0:(8/5L !3C]G%8  1$7<4(  .# "#2 &546"&=35##3+!5rxxK4 Ւӗ17M"* ### :2#"&5464654&#"32654&#"732>7#"'632#"&ҕ*" _F_cMN1 1*.(5,!Ւӗ "-?bICX( ,#~6B27M# >2#"&5462#"&54632654&#"&5463232654&#"(15*+6;*ҕG-Z>VrVB[9@5 \F3Q0 oB84AC43ESՒӗ)RS4iOAURYx !+9'73326ҕե &yv! ~X%$Ւӗ4"AB&% qI )$# !9'&54632#"&542#"&546>54&#"32654&/6, !,AE;+,54&#"327#"&54654&#"+78V355ҕՇ?]/xbUpXFZ6@5![KC43DA74BwՒӗ7[[/sgNBRC\w%-;#.;2"2#"&546"&5#322+35265#"||Aӕh&D:9  ܓOXNR-7LLԔӔ"  &&.rNk:# %3##532672#"&5464.#"326%54&#"#54632'2#"&5464.#"326&<=: sG/3)(0=T@BWҕ5L]HdL-G.'.4 QK.=.-97- ?STՒӗJwF.bP#+7G"#>32#"&54?32654&+53232654&'2#"&5464.#"32616J<=PDQTCGJ8GW=MD4  d1'+.++-&-ՒӗJwF.bP# )##5#53'32#"&5464.#"326K888ҕ5L]HdL2vv24ՒӗJwF.bP#(8%254&#"#3#632#"&'72#"&5464.#"326`4*#/-@ASZE8F-0%ҕ5L]HdL.8+' 2,YGLdA8 %."ՒӗJwF.bP#$0<L4>324.#"632#".7"32654&2#"&5464.#"32664e3  19 L;LS>'+)67*&//ҕ5L]HdL\Jh1k  ^Q DSAE\ 2WZ=.3C<15?EՒӗJwF.bP# &!#>7#72#"&5464.#"3268SYDmMҕ5L]HdLH*yib\ՒӗJwF.bP#)5E"&547&54632'"32654&"2654&2#"&5464.#"326KUUSZHN<;I&..%&1.+)46P41&ҕ5L]HdLKX%".547632"3254%3##5>72#"&5464.#"326$(*'A..T.*R)54&#"&5462!5ӕQ 7@=)`IG]X(F++8L%<Ւӗ*)2H+DXVA  .55+(>"6/.A" ;2#"&5464.'654&#"4632#"'632#"547326ӕ6:WB-/R& #-'"' ),)"IRWDH[Ւӗ=!1 E;N ;* ,.)&#(=*&%.U :KT##2#"&546##3353{ҕ.KHRKՒԗk1Buu# &2 &5462#"&532654&#"535!36՚P+(#&GL?LcZJ(*Gԓӗm:>/+=FfPK\_AQ# 32#"&542#"&54627&#"32654&#">cD'& $/[ҕՑLr7;#55 D[R@4. 'x:1-5=.*ՒӗѠ q2kLJf1bIDY)XA# 2#"&546!3>75ҕJe_LOՓӗkA_eo2#  62#"&462"&5462#"&546>54&#"32654& $&#$&+,F-+*ҕ$R?@W@R\EF]!'("#+)F),N11'&-nՒӗ/$9KL7H !V@UXA'3# 02"&54672#"&546#"&'32>54.#"32$/.D'&0ҕ MLn79"55E[Q?;'=.*8:1-5Ւӗ"'w3lMJg1_IEY#(2#"&54'2#"&546#+33"32654GD"'ҕ5B.0SVQLNR%ƺi[Ւӗi(#6}y#:\z3 #7!5!Bz#^U7%7%{ENSUu3p#z'' 7#PwPCβB#^U7'%'%'{XpSzN^}q2t#t &'567#k>+ް+>pPXTDZQ#|!"'.546763!'&54632#"&47FY462/7%$%&70 +, 2.&%6 !7L0#{2!55!#}j#}1!55!#ן# !55!'3#'3#'3#6fLLS--Zgg#aFR 353#5#3#3#3#3#VQaGGZ22[!!^jN#!Kh#hL!55!#aa#Ryb'#V&b #Ryb7  %#&V$~[R #r #OV"S`37!5 5!"'&5<=K6R+#_:q`S=SS#T`%5!"#5467>3!5!H-*(4(%;_T Y HES# 5#35ZBY#FPm !53#5!# v]",]#+"3 #5!!7!! vvӜ##+"3 #5!!7!! tquԜ##e@M5!57!7!!%>D;;Mu\5HM#e@O%'!'5!57%!!C}]s:aeT\vL#, '5#'3-#3zTR?QUZO#,%5#7357%#3-RT&,iPQ?dP#KHe 5!'7'!7!!7; 2DD=7D e`A!92#KHe%5!7'7!57'!!;DDDD7KZA`ֽ3##".'! !67>32خ2_Y<b8)%H <)x=7&#"467'%67"%.}*3FM#1}0yS  i!6O`  7i dCw#>!&547#53&54!67!%!!&#)7a(PV6gS@< ' K"" "!"!1D+J1"$'7.5327.'%&%467%}1#(BH4*WPt i7  bM7!wI"U%&5467&#">7'&#"%632&54'&(7e*#DI^Ni5S3fM>MMTa,@=0F.U )d+ 72WBBK 67A#{8"!>7&'!;.'>7XfkO<{R .F=+ (x "ITgIl0>O" p?A2MY("U$%&547#"'%32?.'327.547)+*aTMM7#"&546325#:'') HD32&547&5467L?a<5@&26 2'(=1;nL?MJLL"S!0/!?4&.- //#'5R27 62O*#{9$4654+"+"&54?654/&54;2;254&54632#"w!Q(0 >;,6 $R$%yk",  ;  d [ B ' ne#Kg=7"&54?654/&546;23254&54632#"&54654#"#0/  ,1;1+' & #'%"! '/9K-Z8 $^!'#1N  G#'#'#U F0"ctP 3#>7.'3!5!.5!#>75>KW>=VZMl8k4#Hm{4f"8LPvlXYD8qO5t&-%`-%n9&eXd'>>"d'@@:27:.8:'77:'88-]' '#'#'#ސ "8h8@>8fxF x.Xz<32#"&'7326ٙNk! LvIw.D*^fJosKnEw_-0W!3267#"'6327'74.#"nٙ^*D.wIvL !kNّ_wEnKsoJf>. #(75!#>%#53>23'7'7#"&%5!3.' \[ jwwj  [  [[Z8ss!!s[[4%!'7!ww|!!4=!'7'7|ww8!!4 7'7!'7'7lwwww!!!! %!'7!!!LL'=<W]]8JI =!7'!5!'7'7W<='LL8IJ8]] 7'7!'7'7%!7'LLfLLk=<<=]]]]JIIJ4 %!'7!53#wwD88!!f4 7#3!'7'7888Dww!! %#5!'7!535!8LL88=<z]]|JI"4P<'7#"#".""."#".#"#52>3232>322>3232>;'7Pw\A?F:8D.D:6CG< 5H$A>F9 6BE66DI85Acw!54________cb..854`__``__`cc./!> 2#"&546$326&#"632#"!" !ɐӑ夥" "b N> 6632#"!!>7!!.夥򥤎@ H NC w> !6632#"'7'327'654'&#"夥fO}_}cPTܬc}{^ݸNa|QR߰a{}c PN<&yX=%#"&5332653533##5#5_Lv3[c3BBHNm-VQgBB>#!#!44x,( >* 7   'D0&'0'008&0'00'02 '77'7'j8888!pT0=,H2"'&#"#"&57>54/433264'&4?#"'763232?6`$_1 +`qyE?)j\( D $[` $_P!pa+ /<%D (]i&BE\0=/@0=/0=/ @80>[32+#"=4#!"#"'#&'./&4?>;23!2=4.'#!"=543!2>J+& K8'aa'8K!`?``(:G80$323!2#!"#"'#&'./&4?>   6]' ':c<*0  ]z  BC>&`4@`4(@0=,2"'&#"#"&57>54/43326`$_1 +`qy` $_P!pa+ /0=7@0=70=7 @80>32+#"=4#!"#"'#&'./&4?>;23!2=4J+& R;@9d!!!p0,9d=89d!!p0,.9d?8 |8|}8A9Ae@A@9d !%+159=AEIMQW#5#53#53#53'#53#53%#53#53#53#53##53#5353#53#53#53#53%#53#53%#53#53#5330JtJJt00JJ00JJ]00/KK001JFJ011JJ11vJJ11JJ11KKuJ1111JC1J1YJ,1JJp1J1,JY1J1CJ11JDm!!`_Dm!!!`1_ 7#53ۮ 7#535#0zܫzz0!0wG0 ! %!0w>zG9 %%%%WW1&VS9%%%WWV s!!tWW<#".54>32ԁ܃}܃}܃} @'7'ܗܘ @'7@@'7'iijj܋@@'7 u\'7\6u3'7'3~~BBAAWWVu '7 ~C&#".54>32CM{Dfz}cd|@h?"?{OP}=>}C&#".54>324."32>CM{Dfz}cd|1nnoUZi@h?"?{OP}=>}O@f33ff37e1D#".54>32D"?i@O|>9~R@i?`{M{e_M{1D#"'&547632'&#"327D>M~M>>M~M>19@`_@99@_`@yyxxlxxllxx2:= '7'37#'#7':AAAA=aaOMMv||||1[[9Z88Zj '7'372112a_^^_j '7'37#'#7'2112 . /&$%a_^^_1****9 %%GА9 %%GuА>zxz(]#3#4&+#5>=#"#5354&'5"d&&8!"7&&d!7J6876J8(936=4&'5336=4&'53!!#4&#!5>54&'5"!"!"!d&&"!7 6876 6878J678(+'3?326=4632#"'#".5#"&54632'"32654&!"32654&Q1+'.X?COY;:/IO+/$6_X?CO!'0$&!'0()D5AG;Na^IH]1"Sd &@(ZCNa^IcB(%88')?B(%89&'A( -9"32654&2#".5#7#"&54632676"32654&!'0$&>COY;10dr)D+ 6_X?COs[e5!'0$%RB(%88')?^IH]$C+JlH ZCNa^ITN)DB(%88')?(+bS:(X,753654'#"#5!.#"#6323##"&'33267߮LdF 3 ; aE{X_YeD}cB%5F +2\+HA%'hq*L6&8z`( H"32654&!"32654&%67&#"4632632&#"2#"&5467&'#"&546!'0$&p!'0()qtJ$-EZ'2dd2'ZE-$JqDNY;6_$ XV>Y;6_XB(%88')?B(%89&'ADS&!VhhV!&S#^IH]ZC0Mmk-`H]ZCMb(q(&2#"&5463232#"&547+32674&#""32654&N T2@URECOCOY;6_à *# *!'!'0()q»^IH]ZC>-MyzWaDB(%89&'A( *1="32654&'2#"&'#5>5'#"&5463#76%"32654&p!'0()COY;$I0!"A,D6_X?OXH!'0()RB($99&'AD^IH],&W87e8ZCNaD&36(B(%89&'A(%,8'!'#"&5463!2#"&'"32654&747#%"32654&*G-D6_X?COY;"D9!'0()F!'0()"7o9ZCNa^IH]'!` B(%89&'Ax>-%2WB(%89&'A(%"&5467!32>54&'#iyf؈jޛ,9,W<=Y-I9UjTBa+cFSiM9966!!65CN( 9C#5>546736732##5>54&'#5>54&3254&#"6!!FYQ) FQeP>(!!9!!!  T.) V:ZU43`zG=+;:9tRue34V]=HVR44L]X@!%(1!!#5>=4&'5!6=4'!5>=4&'5"^"!!"!W !77-8 6%87%8 6-5 3>?8(0 ,8A"32654&!##"&546;5463232#"&547"32654&'54&#"!'0()MY;6_X?,_KOI[COY;6_!'0().'+0B(%89&'A*9H]ZCNa;M]dS.^IH]ZC>-B(%89&'AD7;GA5C( _kw"32654&"32654&%2#"&=4&#"#"&54632546754.'##"&5463!2#"&547#6"32654&"32654&!'0*/;!'0$%COY;6_.'+0Y;6_X?D8KW=5`W@ZDNV>5`O`+(!'0$&!'0*/R9'!26$:qB(%88')?D^IH]ZC;GA5H]ZCNa@W) &D%4DWV=MXUHEVV=8)=, &1DB(%88')?9'!26$:( -3264&#"#"'!53;6=!53;54&'5!2#E.>L'#;)d%'W d%'c8gdOAz@i7!b#=%"32654&Ld!COY;6_x!"A!'0()_2\8^IH]ZC>- D87B(%89&'A(2#"'#4&'53632654&#"COY;2,f!))0$&!'K^IH]&%)8%%88')?B(k(J+ #/"32654&%2#"&547##"&5463"32654&!'0$&COY;6_Y;6_X?!'0()RB(%88')?D^IH]ZC>-*9H]ZCNaDB(%89&'A(W #/Qz"32654&"32654&"32654&"32654&"&546326545#"&54632!"&546326545#"&546323#4&#!'0*/!'0*/@!'0*/!'0*/5`W@5$(45`W@#6!  #515`W@3$'35`W@"2! d"" !1R9'!26$:9'!26$:^9'!26$:9'!26$:V=MX%" V=MX.5PF17OT8.V=MX$" V=MX$*D=.b!2CP45()07#"'#5>=#"&5463254&'53632%";2654&#a!" mj!"lVME^f[LTSKl 87 vojr 87 mNZ\gghdX`(V2#"&'4&'537632654&#"COY;2\!,0$%!'K^IH]P<5F%88')?B(D (4@#"&546322654'#"&47&546"32654&"32654&D~3:;,@.(H,*0>0A$ $ $#K@6 BQ 3A@\ "^w"5:B3+%(++%(+('3#5>54'##"&5463254&'5"32654&"!"!6_X?!!'0$&7D876 6D8ZCNa8rB(%88')?(>J36=4&'5336=4&'53!#"&5467!5>=4&'5"32654&"!"!"!!#Y;6_)""!N!'0$&7 6876 6878L0H]ZC3P78rB(%88')?(  /"32654&'3"#654&'53##"&546!'0$&~;Z ]*96_XRB(%88')?D^:$/u^*ZCNa( %+1"32654&'7#>733&53!2#"&5473&'#67#?!'0$&u4;ddXCOY;6_%Gk$>#B(%88')?6bQ=GE?^IH]ZCH,F4><6@2(6136=4&'5336=4&'53!5>=4&'5"!"!"!8"!7 6876 687878( 0<H"32654&%#"&54632#"&5463267!#"&5463!&"32654&"32654&$ $,=6_X?6_X??)A.(HA0!'0$&!'0$%+%(,p0ZCNaZCNa.!#-3AA-:BB(%88')?B(%88')?(*6"#5!&'#"&54632#"&5463267"32654&"32654&%'d,=6_X?6_X??)!'0$%!'0$&!\0ZCNaZCNa."#[B(%88')?B(%88')? ,/%!5>7.'53'654/#!36=4'#% %"")Ve.V?M 7+` 7'6 6'7 u 18##!2#"&547"32654&+J COY;6_!'0()asR^^IH]ZC>-B(%89&'A"((44632>32#.#"3#32673#"&'#"&7"32654&(@6 a|C` ;%8B,%Bc}DG} 9Ce$ $3:h'1RV1+QZ8&6LgXAp+%(,(B :"32654&'632>32#.#"3#32673#"&'#"&547"#56$ $6 a|C` ;%8B,%Bc}DG} 9CSdR+%(,# h'1RV1+QZ8&6LgXA0!2\(q !'-"32654&##"&54?#&'5':#>7'/!'0$&O 0Y;6_'R1%x2(EB(%88')?/RH]ZCH1Pl/=-D$^(KNZ753654'#"#5!.#"#632632>32#.#"3#32673#"&'#"'#"&'3326?"32654&߮LdF 3 ; aE{e1 a|C` ;%8B,%Bc}DG} D"MD}cB%5F $ $+2\+HA%'hh'1RV1+QZ8&6LgX-dxL6&8z`b+%(,( #Lj"32654&"32654&%"32654&4632>32#.#"3#32673#"&'#"&#"&546326545#"&54632!'0*/!'0*/$ $t@6 a|C` ;%8B,%Bc}DG} 9CT95`W@4$)35`W@=L\9'!26$:9'!26$:h+%(,@3:h'1RV1+QZ8&6LgXAc>KV=MX*'!V=MXE=Vrz( KWc>7'':632>32#.#"3#32673#"&'#"&547##"&54?#&'5"32654&%32654&#"2(ENR1%x D a|C` ;%8B,%Bc}DG} 9C0Y;6_'Y!'0$& $ $J-D$^l/=L,h'1RV1+QZ8&6LgXA0 /RH]ZCH1PrB(%88')?%(,+(")3#4&+#"&5#"#53>32.#"#326d&&*D%@U&&d%B+?Nc'&2*uJ6YX6JPPRX*Y(0#5>5473673#5>5'#5>577B!!y\4!9N4&'!!8B!!BzW43g>gpvv34"{Y1!3*`0H5a0!ab0cc0#ad0e0'f0g0h0VTi0Tj0 k03l0im0TLn0to0 p0vq0(r0Ds0 t0au0v0w0Jx0y0z05{0J|0}05~0v0v09000r00900000V0%2>53!5>=#535#5354&'5!3#3#3b-"   07 cccc 7;"7'  !5,?,g5!!5g,?,#5354&#"5673#3##5>=#535b c<````0/bb,r#,@,)(,@f7%2>53!5>5&#"#>32354&'5!32673#"#3r-"   07 # 4& 7;" 0)7'  !5.14a5!!591 /5354&'5!2#"'!5>533254&#"3d8-TS2 #:dB'#;9f"`e,96&J406'7!!?LyMI_,8,627.5462#".54&'5!2##>54&#"K ".!@\28+NS2%8GGyqY^, :D*)5#J5!44_?54#"#"&546327327>=.N 'V< 1. "3!*L*aGL"]6.$ !(  5!"'I#2=$ GS/A$5$2  !C #327#"'#7&5#&54>76727#! 0H'$1=5*KK /+# LS- 1# tȨV4!54&'5!#.+5>=!!5>54&'5!/::"9)h: 8:::g66W! '54"?5 "?66 -#5>54&#"5767>32#&+5>=4#",+ Q"#D,{)Qe+K3W45  -'4} 3j"V95!#.+563654&/!5>54&'5!7654&'"431D2'"9) *I9j :; :=N1I"'54`8i7#>5!7͡H 757677654&'53#"#&+53254./#5>54&#"W&%S>5!Qk 6o \z  9:&!}  '$ VE)5#"#7!!#.z3B! P"9a,$!'54%#&#!5#"#7!Q - [}!7vk#$'5#"&5463273327327654#"cgNZ:/V6C:_~dl5/:,]Y932- 4_+2325##5>54&'533#"&546- &$:>#!>8XQ+8R B&mL1/M7 5Zg( $y#".#"#"'.'53>32O&{ x# fcN9-;e-+2/N$ '0#'2".#"# #.'53'.'5!>32 3''& k!"+ M}  5"-;=ZYF+ "R<" FS0*#_8".#"#"/#"'.'537.'537>325$|[pc[!#TZ#4(-;e))1+',V&P) .$$$# '"654'2654'53#"/'7&546 ')f,xRc/eU`eU)L.&:8X22/ 3<.54&'5!32673 (= 8:::<) =#5 "?66#< ]+(Z)42#".54632.#"&54>4.#">(: &;^7'.'326%*(* ! 0Z?Xp69#.DP?  yCo!#'g!3r9FI1+;-i[U7 &>E+'n)432#"/#"&54>7'.'326B77+=B)QQR,Jm* -&s1f'1{N  )r/I %/4&54632632#"'#"54&+2632654.'S3*7 CkA;Q# ;SYR-3$HH0]cALB(X@."g>kTlT, 5'VF )RaF c$-4&54632632#".'"54&#262654.'8"!& HH1E>)2%P@9=!))$1%3#"&#"#52654.54632326H>A?&!@Z[@YQ;<@[Z@XR@A*3`O.!HCGY,ST?28@I^/ap>{#3#"&#"#52654.5463232[ 1*,`+*<=*>5#.BOB<8,X,!&T6)%*@':G 0.+S2BL* )$#".54>32;%#"&'&$#  9G(<!!/Ki";#!+L%#"54>32;722#"&'.#  & #}+ ( EW+/3 %4&54632!54&54632"5!"5S3*76K3*764*n4*n."R."R9."R."R(4&54632354&54632#"=##"58""'-#"'#$',$$'-f7R8–8$ ""&54632!32>%!.#"eGV-V:;X-X+AB#.I.K3^^89]_ZPu;$8NI "&546327!32>%!.#"\}ba}~)(9 N6 igjg$==CgP(4&54632"5[3*764*n."R8."R*4&5462#"&5L" V$#&g9 f 4&54632632#"&'#"'#S3*76$-IK$,Z!d."S,@B "-#4&546327632#"'#"/#8""'&  Tg"   w !7#"&54>7'.546323#"&' #!"j %> !#G 4b 4? B /@F8:'67#"&54>7'.546323"'o#g*$0%<#+ a&2Ed B4&5463232>76754&54632"5#".'"5S3*76 ?6-3*764*n)-#66&*$4*n."T]83) -HK&#."T9."R<B63!< ."R7A4&543232>754&54632#"=#".'&'#"&58"K+-,+-##&#$',  .'$#&f*9<$,@ @(#8   ,$!  %4&546324&54632"="5S3*76K3*764*n4*n."S%tp."S8."R."R'4&543254&5432#"&=#"&58"R$#R%#& $%!g)9)9 $5#".54>32;%632#"&'.#>54#"\<  9G)+l& !/:9Z4fSMW_$4>#!. $cT]3#"&54632;7632#"&'.#>54#"v(  & ߛJ|\  ! 0)hF #[E94``  #|c* C:? "Sr !2+"5!"5#"&5463b2 !4*n4*n! 2#!N."R&."R!##2##"&5##"&5"&5463!$%!$%"" oS )K%4&#26%4&54632632#"''>5kU^b3*7 3bT45FW1 bUc|m."1U6=].f :NQ$_#4#26'4&5432632#"''>5 y@9"R Lz),/ "01r=w) KG#8  sUu2 :NQ$c#%#"&54632#"&/.#"3267c*Jo{ =*7V2.W:JY.p='.54632%0D% b '9%d<:!# f ='.54632" r"0{ &/, Ut2 :NQ !$K 4;"34&546322632#"''>=#"&54>322654&#HYc3*76 3bT4"8HK% b q!8IO(d^bkU^X."R1U60Q5%+f 8OLHxl+J3#^m_Uc$6*1"3=4&546322#"''>=#"&5463254&#s3@##&bkvG !1Nri`Tv=9h{EGR?NRWv;B w/>323#"&'#"&54>?'.54632 #_,J&s%Ѓ#l 6#9!d( >H<6+' !0&>323"/#"54>?'.5432D $>@"|0[ #J_ %Pg  p]F #! K (4&54627632#"&''>='.54632<3*n/'( b 7"9%."R@"&f 8MN"0$6)4&54327632#"&''>='.54632#R&W"i"0{ & ](8,! Uu2 :NQ  r$A#".'#".546732>54&5463232>54.'57{RKW$ !:)R{7)?& "G1%5 3*7|1G"'D.MOrrO# 57I6!,]hA)C@"&/"$.@f^.-JQ:)#4%#"&'#".546732>=4&54323254.'5'U8LI0$8U'i\%0h$#M(Ti0%\i5jMMj5_(C3%,+ !)9*7>$ K4;%2632+'>5#"#"&546;4&54632632#"'4&#26.! 2_T&! 23*7 3bT45FW1 kU^bw3!#c 9a^3!#."1U6=].aIUc|m$[4:%2632+'>=#"#"&546;4&5432632#"'74#26V(!$0  G"T Lz),/ yy@92? Tv2 :NQ" ( KG#8  ?r=$#O"&54632;654&#"#".5463232#"&+3267#".5> 7|2 !&fL@2(F .0tg]t<=2 !.) ? 3Ae'SZ19_  ' *B#!3V;A=0<7&19[NO?#!3 03,A$ 50 6< ' ()+ ,qA7"&54632;>54#"#"&5463232#"&+3267#".5>7N 7 !H+ 7NG?P98!(1(_'8 .B'dA+'! "#6U "* '%!'>5>3 6)-3? #%(%M.$ $#"&54632'>54#"327$Rbu[a|3RdFXF0(3D8 ,YQdy|)\gS D^[3B*LaM$7#"&54632'>54&#"3279KX?C] %:kD.:,%+&% =6CTmS@VF9->e>WP!&6@,4&546327632#"'#"ȷ&/#9"$'+8P+ kHVg  J $LS54&54632#"='>=&'"54&546324&54632632#"'64&#26w#&%#&%.2().$L"&$+,"& Jl",7 0909>+N78<+ :NQG857@P KG*? <6:$BI2+#"5#'>5##"5#"546;54&54632632#"'74&#26!(#&%OBO$%&(""& Jl",7 i09>+ /8vyW 9QO8S/  KG*?#<6:$=u|%#"&54632#"/&#"3267#"&54632#"/&#"32672#"&#!'>5!"#"5463!54&54632632#"&#"'74&#26=kb}}hKT  ?GM<'2=%=kb}}hKT  ?GM<'2="((&("r"& (:>" 6-  BAE>LVbh?(.1yG!GG.)Vbh?(.1yG!GG.) /#7[v+ :NQ#/  0$(8 6%.$7>:#"&+'>5#"#"54>2;54&54632632#"'74&#26Q(/(4&(g"& Jl",7 i09>+/#y[v+ :NQ#/ KG*?#<6:$M4&#26'>=#"54>?5'.54324&54632632#"'7>323"/_,8>&d(? #F[ %P)"& Kp1G- I $>@"|0v<69[v+ :NQk { " ;I KG3G  p]F+7%#"&5467!"&467!2#"/&#"3267%32654&#"=kb}9638}v^KS  J0=<'13 N?8@P?5ALVbGlfBhʁ?'.,?M/!EF,*k`UgV ;#"'732654&54>$ Na*%,T 9  qE! x# '2#"&5467"&547#"&54632!" !d I  %$$" "  )    #"&54632#4&#"t/ 3&>]"CU=!".yM(^G!`#$G ?G7 8G4=GVGQGfG =Gp2G(G(*vG&"AG6p;G5"G G\GpG(6%+|Gp :1G&3AG6G?&GA!pG"GMGG\aG[oa+RU?57+@A@@A@ eA("/&#"#63232654&#!5#"#7!!2-D !1)!l20!-'.53B! P0p\ .e $a,$!B5Je'"/&#"#>3232654&#!5#"#5!32 #7& :*''# #& - [kJ .14 #!7vk:5J eA537#"#7!3#.#!2#"/&#"#63232654&#!5".(ݹ3B! ȉ :H0p\@+F !1)!l20!-'.5YFr,$!E$B5J .e $=  e637#"#5!3#.+32#"/&#"#>3232654&#!57+"& j- [vr!,#kJ3#7& :*''# #&,'!7v}8':5J .14 # .732673#.#"#"&5467>54&#"#7332632zD7Cb% g2VvXcOD:.g5,H()4TX""_L9V74I9.2632327653#&#"#"&546?654&#"#73P:!;M5@:4-&a  T:S'-l++"+2 E6*B$!-!' L4%7@+&8C *Zl^Al3%4&#"#5>=4>75#534&'5!3#!5>5Ka$:> %H4aa!@)?#bbtq;<dgK1,L2OI1 V)7 7)O}|E76 4%4.#"#5>=4675#534&'533##5>5h (,/9KII0/IIUE))#"/88$!91OeA))<ZaV! !P)F%#"&5467'.'53>32#"'&#"%32654&'&54?4&'kerNe  fc:!# oOq,E#>*BID0$ A3= ">jlY|L% (*$ws_31WM-sBMt].B ?(\"WH%##"&54>32#"&5474654&#"326732654&#"#"&54632#"&AyM3Uh7;K ChyW<54#"3254&#"*;-`bEBe9# $5JA"88 YU"D#~k8(93.G(6YJS  +%;2654#"'32+5>54#"#"&54632 ''1_"0c_'U<(8 ;-ؑ 9#fC7(,4Y#'',u J%3254&#"4&'5!3.'5!3#.+"32#!5>54&+!5>!YU#T!@)6'".4% L@* EBe9# $5JA"8 $>?"HJS7"!#?.q(93.G(6L7!  D%;2654#"%"#5>54&'5!54&#"5673#.+"32+5>54# ''1_(((4 ?Q  %,0c_'U<(ؑ9#f44)n# }9&C7(,4""".#5>=##"&54632354&'5332654&#"g((C {W^}{b`|A(( N?8@P?5A\))s\yegbr4}k`UgV 53#5>54/!3#5>?!!5>54&'5!!3tw().D%).? 8:::R+`u)5m5 "?66.8y O%5327>'>754#"#"&54632327#"&'#"&547##5>54&'53ZH(!( +ML*aGR> 'V<.;3t(((({!>,)(  =S/AOQ!"'I73%!2654/#FwM%). W\s5m8 .  73'!5>73%324/#]- ! ;q@n $JN~&  =!.#"?#!5>=4>7'!!5>=4'#!5>=#E@|<;2Tf99iW3;<%=>#5MQLM67E8\=%%=]9E76Mk6"!7k  ;7!.#"?##5>=467'!#5>=4'##5>=#mk31s^x))\i>u;gG+++(954/#!5>?!!5>54&'5!!33'W\1M%).? 8:::WfF.#5m5 "?66.8^ .1%324/#!5>?##5>54&'53373%3'o ;q@ *((((W!]-  $Je{44))l~&n)/#5>5#"5463232>73!567654'0/ 7%I !7  )( %@  1I   ? )7#5>5#"&54632132>7632#5>54/90/6:!#  x  ?)(Z(* A2M$   Vp 4#.+"#.+"#726764&'5!;2654&+"p @L :FMME//:: ;  9  G%HX6PZYQ!&~>6 *A l 14&'5;#.+"#&+"#7>76;2654+"&ꘑ!,W(TT%0x%e_/"}8':-}}KQ $0.3#.+"!5>54&+"#"&54632327>54&'5! @L 8: (G3&4 3:G%HE5 "?}v~>)P86l1#"#"&543232654&'5!#.+"#5>541_ 0#&" $& !,W((ILp]/# /"}8':))0 a(#.+"!5>5##5>54&'53!a @L 7; $:>#!>G%HE5!#>&mL1/M7,#5>5#"&'#5>54&'53!#.+"((( ((&6!,Wf))92p))/"P}8'"'y`2'yR" !42#"&54632#"&546".546 4.#"32>93Yi&f8tK=c99b<=c;z((xSeŘVK`=`i10g_=:]h !,2#"&546'2"&54632654&#"2#"&546U*c˜T66Q=9%QzN(7>N22j  @Z@-N3&@Z:2N4+AY@33+@Z@-=N:3=N3+@ZdG!546;2;26;2+"&=#+"&d   $  $ P  P  LL h'i'13'3''B'z'Bzk6n>@>@ h #/#53#53#53535353535353533##5#522c22229?>?222222222222^>?>> l 3#'#7'3#373'7#'NMMNPMMz?@{@>{?@|>iljjlikBjmM8B #"&'7327qItBs|n7=O QQ "#"54?654'&5476?32('  @ + 1 )3     " (   Vw,@726764ᓎ=46;23!"3#.+"#;2654&+"./: 82  g8 8 FMME9  &!&~>7#K J#7W8"PZYQۑR9 *A B(97267654Ȕ=4;23!3#&+"#;2654+"%/%% %'TTx%eI0$#K J*.}}h6$0-%4&'&546323273#.#"#"&#"#'3326dbLfF*b c<.:KH]^vV2g &bB7D9u-UM^""XT4)1(2CMh!\WAB 9273#.#"#"&#"#5332654/. 54632 2+"+>x S:T  9&-?y  M;!: C8&Fx*!4L F)'!F~  6E}l"&#"3#'&'&+3!526=##"&'7326544>54&#"#7332632354!"327>32$  ?8*X-/3*" !9: [](=HZgg#=;#R6' z)aI1!9;! j)N+%0P:^ BJ"B8"%@0XYrU42:Q@FP' ?,8@!RN:K7#"8JJ <b72654.#5254&#"#5;32632354&'533267>32#"'&#"3#'&##5>=##"&'71< 4$k2)h"  LFa%((4 3 $%7@  } 0((c5b^=^7:- %]%2y =;, l))m=&+< 5G7p ))"tP6 > ?32754!"3!526=#"'#"&=4!"3267&=4!"&hHL 88 !79HI5HIfk 88 h/V 88 =7##7D6$%@=S=gYj7##7k,#,j7##7L%#".=4&'53326?&=4&'53326?54&'53#5>=#"g *.(')$6(')$3'(()8ER  ,R))P!+ R))P!+}')46m# @T#726764!"3#"&'732654.#5254&#"#54&+";2654&+"#/0: 8 8 8V"LH/H +I%. -$R& O  ME9  !&~>7##7W8"B +:(.+!  D$Z% YR9 *A  ?P7267654!#"&'732654.#5254&#"#54&+"#;2654+"%0%%&/"LH/H +I%. -$R& O  fTx%eK0$*. ," +:(.+!  D$Z% }h6$0]1%#"&543232=4#"!5>5#"#7!#.+632tb/;+')_hRL">> 6T949U6HSfkNk'+,$ȑ=7 !@/RS.=eY B32=4#"#5>5##7!#.'#3632#"&54632eOO67((4,!!,69W}9B/)52nj?A))L&8}}8&RVs:<P7#"#7!#.+32>32#"&6T949U6( 8+QY.RS-B  (g #"#7!#.+32632#"&54,!!,625)SV'8}}8'M><pjZ#"&#"#"&5463232632#"&#"326323654&#!52654!";2654!"Qc'AhT==Z;m|3W+5 0*;1978 !79  !79 =0R)"0/=!$X'#76$%@-6$%@b A 0R"&#"#"&543232632#"&#"3263232>54#!5>54&'53;254&'53aHS?-wFJ"0P -*D$.@ c(((((p,'R#-'8)))0))' HNP4#"#7!#.+3##"/.#"3267#"&54632656T949U6$< /:C4!0 =Z@ReC l.RS-8$  D8=M%oYEOaF4765#"#7!#.+##"/.#"3267#"&546325,!!,5)]  /:C4!0 =Z@ReC ")>'8}}8'4   D8=M%oYEOa/#"#7!#.+326754!"3!526=#"&56T949U6M>/ 88 !791jl.RS->U$7##7D6$%@%kU1#"#7!#.+326?54&'53#5>=#".54,!!,6=&G'(()`E07$'8}}8'-}')46m# , -4632#"54#"6323!526=4#"3!5265gsc/;+')_HSfk 88 hRL#==!l'+,$c=gYj8""8k=8"$A/74>32#"&#"3632#5>=4#"#5>P;B/)42O9W|&(M67((X)Vr8=aR$!)j?)v4.#!52654!";2654!";2654!"#"&#"#"&5463232632#"&#"3263232>o #8 !7:  !7; !79  Qc'AhT==Z;m}3W+5 0*;12?-B  #76$%@-6$?%6$%@b  =0R)"0/=!$ .0`)5>54&'53;254&'53;254&'53#"&#"#"&543232632#"&#"3263232654P(((&(((pAHS?-wFJ"0P -+JJH4))0&)0))' HN,'R#-C)8$| ?$}_ '$ # $  '$ # $  $} >$}^ 2 '2 '.2 'd2 '2 &2&32 32 32 32 3          <(& O @ 'y)-A-AҾ-A6 OZBX3!5!BXB,O6!#7#ecOM,O6!bpVb!i)Vb!fVS fBX #'#5'`BBBE7^n' 753%5`B4pJE/732654#"#"54632#"'32654#"#"54632#"'0#78  D-LXW=4- /#78  D-LXW=4-( 3&A= UL=Z 2&B= VK=Z+/732654#"#"54632#"'32654#"#"54632#"'3"&'/4=<*%"&'/4=<*%#-*;4*> #-*;4*> s#"&54632#"&#"32bCJ\zo#5-!*,C^.F,(zad{' &N:>K7#"&54632#"&#"32 -4=WXL-D  87#/"Z=KV =B&2&1!!5>54&'5!!54&'5!#"&546323265 8:::/::^S*>2;5 "?6666iq <>M &/!#"&5463232654#"#5>54&#"5767>32*>2K3,+ D/#D,{ <>MYj"45 -'e'#"#7!#.+!32>7!5!!5>56T949U6'.  |">> l.RS-k "#7 !@ C(!32>7!5!327#"5#&54>7672'.  s 0HY5*k "#/+# L- 2# ,-3#"327#"&54>7.546323273#&#"]hcS =,gEJj"1EBnS1i@6MG!U;/2a hW'>"LBO^̥K'3"327#"&5467&546323273#&#"M*1>=.MO JiTjHF{[L'D ^+6>S2@%HR= V_YG\ IZF r#"&54632326=!53r*>2:" 2"A 54/!#5>54/!3#5>733%3tw(),"().D%).kt+`o7+`u)5m8% EQ[%5327>4>754#"#"&54632632327#"&'#"&'#"&%5327>'6754#"ZH("' $18 L*aGR!3SR> 'V<%6 X=.;ZH("' #L$. {!>,)(  =S/A*+OQ!"'I("K,)( 5=S-#P44.#"32>3>32#"&/!3#5>73+:71N- ,W<=Y-tqj).D%).HHpD,*?VO)3bb<754#"#"&54632632#"&'#"&%32654&#"5327>5%$18 L*aGb=_`|^;aa7.;TN?8@P?5AZZH(!( a =S/A>>bh9137,)( 225%267654&'53#"./!3#5>73%38Z$:> 5iM8Q0 ).D%). &t+$+]K1,L;XO*-&`u)5mJ +* %FS%'5#"&'#"&54>754#"#"&5463232>=4&'533%32>5N; "*; ^;.;$18 L*aGR>, '/"mZH(!2S  *%O,)(y #'!3#5>73654&'53y%`.D%). )s ;u)5mo0%: C%5327>4>754#"#"&54632654'53#".##"&ZH(!( $18 L*aGR>h/ V<.;{!>,)(  =S/AOQ2&'I<y%(33##'!3#5>733654&'5#Ks%tZ`.D%).Pm )G. ;)u)5m_0B7%:;GJ74>754#"#"&5463237654'533##".##"&75327>7#%$18 L*aGQ>N/U_a V<.;ZH(!( Da =S/AMND24&'I,)( &33654#53#"&546322>7'!3#5>73t0 -M2 *2   ].D%).d l\! u)5m%&, N%532>4>754#"#"&54632654#53#"&5463232654'#"&ZH(($18 L*aGR>a0 )N2 *2>6G!.;{!>,)( " =S/AOQ hl\!| +/%<" )2#"&546#"&'732>54&#"#7332632%!" !pU.iv.QL-m7  ! p@" "=B=eAW!! !-%#".'732654&#"#"&546322#"&546kS!>&' $>+DWK= "[?X!" !b} 4 4*mVMa.*=" ""?5354&'5!3#7654&'"'5!!52>54&/!5>5*R :=JJN 431D2'  I9j :;65!76H 1I"`8i7#>h95673#7654&'53"#5254./#5>5#5354&#"UFcc2C15!( 46KKo6z 6-&! $  '6$">5!73!52>54'#7/!5>54&'5!7654&'"431m,Y^UD2'  O YR j :; :=N1u%O[I"WE i7#>5!7͡H 95677654&'53"7#5254./'7'#5>54&#"UF2C1HOY-5!( Y54'#7/!5>5#5354&'5!3#7654&'"431m,Y^UD2'  O YR j :;RR :=JJN1u%O[I"WE i7#>h65!76H A5673#7654&'53"73#5254./#7'#5>5#5354&#"UFcc2C1HOY.5!( Y53!5>554&'5!#3f7C-"   07 f 7;"ffy  !5 5!!5T #5>5'54&#"#567 0/S c<y)("#V(%2>53!5>5#5354&'5!3#3b-"   07 cc 7;"7'  !5c,-5!!5-,5354&#"#5673##5>5b c<``0/,:#,)(w -!32>%!.#"#".'#53>323LV -L01M/ W+84-H.AtW4"# $F(MT>))?SNO?b;'"6KHO1VL((".#"!32654%>23##"&'#5 K55A J58@ xy ))}Z\{#N^VG-Vo`U5ZnpX-aa-".:4.#"32>"&54632>32#"'32654#">+:71N- ,W<=Y-ۇL,`=/<'M2 5KN3AHHpD,*?VO)3bb<32654#"wN?8@P?5A#-C1 {U^}{bn?H7'9;'1k`UgVq6*JGZtegQ$,$X4JM"+C4.#"32>%4.#"32>"&54632>32#"&'Z+:71N- ,W<=Y-+:71N- ,W<=Y-ۇW+,VQ+,HHpD,*?VO)3bb<=#534&'5!2"`eT #:dB'MM#;9OO8-TS2OMI06'k67!!? 6q6&J' 232654&#"'567632#"&'3##5>5#534&#"E#6CC8#C?Q@PI^yY +jj"5,DDN,gSWi,% MOx]md6- -6#"N84&#"32>773#"'#7.'.546 >s_2N. (BE&1M. r%306!ycLi~Y+cY dM)?TM(XB)@UP'7`A6  #Cd7#1 &"'> +73276=4#"?373#5>7#75#"&54632n>12$]@J6 2c)3%AcDYFZ^6+PC "dg_ S9  %$[Jx_l 13254&#"#"'!5>5#53.'5!3#32"`g T #:dB(#;9IG!./$PSPxMH06( 7!!?66,b' 432654&#"5673#632#"&'#5>5#5354&#"E#6CC8#C]4hhAOI^yY + 8,FF N,gSWi, 6bNx]m/'c6' 03254&#"#"'3#!5>7#534&'5!32"`g T #:dB(SQ&2/ GI8>PxMH06(36! 667b' 432654&#"567632#"&'3##5>=#534&#"E#6CC8#C]4AOI^yY +hh 8,FF N,gSWi, Nx]md6/' 6",3;2#"&5467#"#4.#"32>" (=]P(<) +:71N- ,W<=Y-=#i*#7>32A Ig6';L6M.&*4V#1*0( ! N<)%#8O"&#"3##4&#"567>32(,2TPD%4j#: !\5),(6"#7!"#"&546327.5474.#"32)< 'F) :'yp)%+$5:[5a}^Rs('1Z-M:T@#EC),K 6Q V/bO8"5>7>32".54#"#4&#"#8A KW3$6YRl$>5gI  tF16&7?3"156(8 567>32"&=4#"#4&#"J@3;#7?%Y8I*$TO0!OG%(;a"% 8"&#"#4&"5>7>32A Ig6';L6M.&*4V#i0( ! N<)%#8O"&#"#4&#"567>32(,2TPD%4j#:!\5)y"327#"&5467#5!~m-KR.vi.U[N]nT|Ae=Bh***!#"3267#"&5467#$ '&>!Tj=2o]LVh*4 4 yaIn BAQx F @Z 7#.54632  5 tz#*PxZw #.542 !bwmMP  "$753;54&+"#7!!5>=#"O )< U6 7 9:!=( <# &C!5O>#!6#='4>3!!5>=#".%4&#"3272ST-89;#'Bd:# Te`"4J&6O?!!7'60IM _$%4&'5!# #5>54&'533 ;7 8>!#>:$Y>#!5D5 7M/1Lm&; 74&'5!!5>s!@)?#$>?"mF7 77! #5>733654&'53# # % )% )  ;1  o0 ; /a!"&54632326232654&54632mtY 6.     .@Y 462#'&"#"0 !! &h#"&54632'654#.&='"?)& S '77'',,,,,,,B,,,,,,, #.+3#526=#"#7#%8c  c8%# =1**1=6"#"/.#"3267#"&546323!#.+#5>5$&" =KWD+>$ '&>!SkX_!,5((!'!.aMVm*4 4 }bo }8'44>#<" <#A<#r<#2b!#b0!!Q~:7473327#"&Q7!9z&* %#TCF°˕Vf-#"&5463232=332>54'&=3*3*RDd$'7 5)=8DMS7gC`2NR95((   6*IXblI6@"&547.5463232=332>54'&=3264&#"*3*C%E_EB`$'7 5)=8DMS 5"""7gC`2K- 8"3AB2#84((   6*IXbl#1$#5FX"&47.463232=332>54'&=3264&+2654'#"&'0SR~Q)"2$'7 5)=8DMS*3*  $*82(!/9!\?[X~& +<((   6*IXbl7gC`2T* X8)#&5' '6!533R<$Hb|Z&2#"54654#"#"5463232>7>76N$.&;*  9 Z&F~0XC\-gJ9?GP%#"/32654&+532654&+#"'#"&5476;463232%4&"2>5#'32=#"C& C @+R'!A=GDE$MA3Il 37Z2]* å(>!c +% !  #HK/PPU;S PqCT*#,m7SP: 8;"e$A`UF_CJPY%#!"3!!"&5463!2654&+532654&+#"'#"&546;463232'4&#"25#'32=#" +1T5.5.(&$#/ @+Q("@8LSQ(JDGS[308,3,]f/(>!c(4G;"(>"$9;%DDD68,E]_E)}1CH,CPT!3QBJ=CLW2#".54>32&#"32>54&+#"&'#"&54>;4632#4&"26=#26=#"mDW0IwKE] &eJ_K+5G4L/$@f=';2^?(=(B0L=0JZ6>[H>H:\%?9%(4(.{S$GL9% #%  %7F>=Wks.$RU?1)d]gZGDBIHL#G@(/U-02J=_ioz2#".54>32.#"32654&+#"&'#"&54;4>322'654&#"#54#"&5463264.#"265#26=#"m7O",_N1JD{B'_).3"XE|<0WF)>'C7E.4!3IT%  $ /$(\,8^ (&6$Jg99'#5 B  #$.{Qma}/#R\8u06)@T-u%  *: & :6 1)PZ6!U"(#?DF;BZakt~232#'#"&547&#"#54&#"#"&5467#"&54>3464&#"2654+#"'632632'265#2654'32=#"2654'*= *?/1=C51?N3H!M@/5CF$ 0G:?/I4+)13$Q%OFN$ G/5R01#'Q@/'BQ)>:-#!CMc< ,,& K=>J."B/4A!+b.H@b.B3.C#-J(>JQ\f>32'>54&#"32#"&547##"'#"&54>;4>322654&+'4&#"3265#26=#"xdS`|1)2^J8Q 5"/+6>:C/TER'.:J!5& ;(+? *)$?%402- (7/$D!(;Ro`h$f8LuU5 9+2Ot<$gP$T54&#"32#"&547##"'#"&54>;4>323632264&+'4.#"3265#32=#" -T4#+)'L-]fQ8;F*0R0@,S& B:J82& ;(+? ;.T$:&*"?0$#.-#7/$">!c,;A3(&)45.2EQL4ECVZ$"HL0PPS=(4<@(,E6SB%(/L3"A:42:H<6lI D%@`UH_DWcjr{2#!"3!!"&5463!2654&+532654&#"32#"&547##"'#"&546;46323>2654&+'4&#"325#32=#"vS{OLRGq7043J>$$ %E4B{CC9F/-I& @+S&"@9KTT$N@+? 1 >OJ&)%4(40.13+f(>!cH@:L=>G="&:7#/30 )+B;A'9=EM=?'DDD6:,F\$;-/E#' ,;-,FD.=1H :!3QGJ.Xdmt}>32#".54632&#"32654.#"2#"&547##"'#"&54>;4>322654&+'4.#"265#'32=#"x +,6!(RH-+SX>N8VTJ?(4(V[#}$:>1SCJ# 6>:C/ @+R'!A;I 2- ;(8Z*)$?%0$#.]7/.$">!c3M&%G{LElB#' Gn<ED'2Ot<$$IK.PPR>.=?([f/!(6")S:41:lIQde%@`UJDNZbhq2# 46732>54&#"32#".5465##"'#"&54>;46323>2654&+'4.#"265#'32=#"oy;ڗ(>5#6]ZO\9`L'<.!@,Q'B#0$*4\7/¥#"?!cŠd]m8lIe$A`UJ\ht|2#"&547# 46732>54&#"32#".5465##"'#"&54>;46323>2654&+2654&#"4.#"265#'32=#"oyp)7A.1@(>5#6]ZO\9`L'<.!@,Q'B#'&(&v0$*4\7/ $#"?!cŠdc@*0@A/0lI#9$e$A`UJXdnv2"&547# 46732>54&#"32#".5465##"'#"&54;46323>2654&+2654&#"4.#"2654'#"&'265#'32=#"oy{4EU{Tm(>5#6]ZO\9`L'<.!@,Q'B#* 50$*4&R:2#!1p7/¥#"?!cŠdc P7=US?%"9(# %1+!*-lIe$A`UJ-S[dm2#"/3264.+#"'#"&54>;4>324632&#";2#"'732654&+"&4.#"265#'32=#"?H?5&"& /I6S& B:J63#$ ;(+? KN0V.!E%4>62,5V,B#0 @'00$2-]7/)$">!cK>2N/5J, 6bNPPT<'3=?(,E64-0$1$//.:4Z0lI.E+e%@`UJ0^fmv2#"/32654.+#"'#"&54>;4>32#"&547&'732654&+"&54632&#";24.#"265#'32=#"2654&"?H?5&"& 8I6S& B:J2'$ ;(+? 620$2-]7/,$">!c&%7$$K>2N/5%(6bNPPT;4>32#"&547&'732654&+"&54632&#";24.#"265#'32=#"2654'#"'2654'#"&547?H?5&"&-9I6S& B:J/+$ ;(+?  I23I6/B#0 @'0L2T0#C%4>800$2-]7/)$">!c $6+*2K>2N/5%)16bNPPT<-=?(,E624GG4@% .#4-0%0::4Z0lI.E+e%@`U  P-# *+ (#-J*RZcl2#"/32654&+#"'#"&54;4>322#"&54732654&+"54632&#"34.#"265#'32=#"?H?5&"&(8I6S& B:J$ ;(+? N1;P9_8,kM)6 yV1R/#C#!cK>2N/5%/+6bNPPT&e%@`UJ*2;Ds}2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2"&47.54732654&+"54632&#"3264&#"?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!c1;34B]A#Hf8,kM)6 yV1R/#C#2N/5%/+6bNPPT&e%@`U4"- =0A@b! aCB8,7=[ N710$#!#8%&J*2;Du2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2#"&547.54732654&+"54632&#"32654'#"'2654'#"&547?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!c1;:9I23I0D^8,kM)6 yV1R/#C#2N/5%/+6bNPPT&e%@`U4"3%B5FH3<%]AB8,7=[ N710$#! P-# )* (#-J*2;Dz2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2'654&#"#54&#"#54&#"632#"&5463263262654&#"?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!c3Sa$H4 =(%>047%".0",2_LC!9C jK>2N/5%/+6bNPPT&e%@`USFm*-W<6ж(!9;&6)(0G5W^0.,.F*2;D~2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2#"&547&#"#54&#"#54&#"632#"&5463263262654&'2654&#"?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!cKT=%'. ')#.%*4.aA=/$>;#,m!@%K>2N/5%/+6bNPPT&e%@`UkE@<@:P5 Ҵ'!1$&;( 4N-Nf00-+"'F3F&$ J\i*2;D2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"4632632632#"'732654'#"&5467&#"#54&#"#54&#"632#"&2654'264&#"?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!cCa@>/"=9$'>R%9;dD+&9T8 =$!99,2*@, =/ (1&$-%+4,V $,%K>2N/5%/+6bNPPT&e%@`U]Qd00--L V6Ob# X=ED?132E&Ҷ&" 80&;'5K&+'-#%,F@JRXa2'654&#"#".547&#"#5&##"'#"&5463>322>3262654'%4&#"25#'32=#"Hf-k0MWR^J=(;Y%R){Q oD ^LLW:K/Qn,F5TtwQ-lGKo*M6O28װHhc&=^RJ]Xbhpy"3!!"&5463!2654&#"#"&5467&#"#5'&##"'#"&546;4>322>32632#'2654'%."327#32=#"+#+26'IWXI!^J=:C3&8N* M;G#74@KO 4$&9  bD2,/=0L- #T;+%JV+*V&&*V 5T  M6,*9kOPlMeD\a;4\ Y?[e??E5;,24!%;+Ka/>:5bIxE&\;CZ'>%HD)?)M 8 2NEJ]`jqz2#!"3!!"&5463!2654&+532654&#"#"&547&#"#5&'#"'#"&546;4>322>3262654'%.#"327#32=#"ZuDEVW0%-46+SF"&& ES+^J=:CY8N*"!DH"74ALQ 4#'8  `C2/.C+%JV*),+& &W5TJ25%&C0S M6,*9<&)4%$8MeD\a;l? Y?K;:??C7;,24!$;+M]E&[54&#"#".5467&#"#5&##"'"&54;4>322>3262>54'%4.#"25#'32=#"it&MU>A)]E50:mO%Uw2`N^EB*<-,#;Z* 9&H"p=1 4$&9   eO6/2G' JW'$0PW'5T§zJrC#G# eSt [zGyDQ&9m& pD #HL/LLY9z32632#".54632.#"32>54.#"#".5467&#"#5&##"'#"&5434>3222'654&#"#54#"&546326'2>54'%4.#"265#'32=#"8 eO7.1;6S2! ,TVGE.]yC' `(?=9A"Lo8%N7^EB*;-,$;Z* 9&G#88= 4$'8 W$  #%' JW'#1P/(5TOz*D_`7QrB07FB  )<( Dnn85glB [zGyDQ&8n& oE #IK/LLY9z<@(,F5r& : & 15lGLn3-*-=IfJc C^RHD*Ycju~%>32632#".54673 7>5.#"#"&5467&#"#5'&+#"'#"&5463463222654'%4&#"32>5#32=#" eP6.1<[ "7^|nT/5 \ZɄk}oCZH>7F1,$DR* FAI! 64BRbB;s!%,F[,-)')+&!* "6TOzj 32632%2654'2654&#"4&#"32>5#32=#"*8<42?S/5 \%Vʄq1pDZH>7F1,$DR*FAI! 64BRbB;s! eP6.1<[-%,F[,&'%'-)'))'!* "6T>?+(HB.:&@gqLHo=ix>cT8D`W VNrrI4q' nF `LLU=L.Pp OzjVsIL3mFQi/I'&''/WN8J9T>I)M'<^RH*Zdo"&547#".54673 7654&#"#"&5467&#"#5&'#"'#"&546346322>32632%2654'2654&#"2654'#"&'4&#"#326%32=#"0?UxWĝT/5 \ZɄ0hpDZH>7F1,$DR*FAI! 64BRbB;s! eP6.1<[%,F[,, 2*92$!09-)')&(0"6TH O4?ST>"&&@gqLHo=ix`HaPY VNrrI4q' nF `LLU=L.Pp Ozj)L3mFQi/I:)$ %1,!*:8/WN8']5`'<^RJ*2;Dh2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2'654&#"#54&#"&546326?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!c7G4*?-)!8$(0KUF?9$%K>2N/5%/+6bNPPT&e%@`UZ@2P*Z.Bѵ 'B/[%/g=^10J*2;Dkv2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"2#"&547&#"#54&#".5463262654&'?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!cMQ9($=D-8")2!+4%E=4'.l# B(K>2N/5%/+6bNPPT&e%@`UnE;A<>P8 Ѵ'"F1GT'>]0/$'$F6C('JX*2;D2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"4632632#"'732654'#"&5467&#"#54&#".264'?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!c6P35&(>)E=9\N'% ?J; =$%3=,2N/5%/+6bNPPT&e%@`UtFU0.+ S2Dme=R$FA8/2D, ˵'"@7 G)-"Z)Z1$%#J*2;DLV^2#"/32654&+#"'#"&54;4>32#4.#"265#'32=#"4632!7354&'4&#"6?H?5&"&(8I6S& B:J$ ;(+? D0$2-]7/($">!cN:T96..*2AmK>2N/5%/+6bNPPT&e%@`URfZx*N-gK>!"TNJ .DLVdlu2#"/32654'&+#"'#"&54>;4>324>32##"&547#4.#"3265#54&'&'74&#"632=#"2654&'#?H?5&"&>I6S& B:J63!$ ;(+? k6&&B.1?&o'0$2--#7/ &*= =Am4$">!c4&K>2N/5%;6bNPPT<'3=?(,E6/$07 x0.BA/09:4Z0I;7lI g,4 -:= TN]%@`Ul$## J.DLVdlu2#"/32654'&+#"'#"&54>;4>324>32##"&547#4.#"3265#54&'&'74&#"632=#"2654&+"2654'"&547?H?5&"&>I6S& B:J44$$ ;(+? i6&*3I25G3c%0$2--#7/ &*= =Am2$">!c $6*<+2K>2N/5%;6bNPPT<&3 =?(,E6/$07 x#=4GH3=#9:4Z0I;7lI g,4 -:= TN]%@`U#P-# +*  (#-JD*1;D2!"&547327654&+#"'#"&54;462#4&#"3265#32=#";KzVFݯUT0&(XCO)!@1REHM F40-14*42% ?!cQB¸j!k|99*:lzPPHHyNslU4VNQfO0#B`UJ7>HT]#"&547#"&54732654&+#"'#"&54;4632324&#"3265#2654&#"32=#";,6@10@GpVFݯ0&(XCO)!@1REIDEM B:L40-14*42['&%%% ?!coA).CA.¸j!k|z+9lzPPHHyLulUOD%4VNQfO1%%''#B`UJp7>HUfo#"&547#"&547327654&+#"'#"&54;462324&#"3265#2654&+2654'#"&'32=#"6+:V=;V0FVFݯUT0&(XCO)!@1REHM B;K40-14*426  R92#3% ?!cs L2>TT>'#¸j!k|99*:lzPPHHyNslUQB)4VNQfOG c8+% %1)$,#B`UJ/Zblu2#"/32654'&+#"'#"&54>;4>32#"&=4&#"#"&5463232654.'4.#"3265#32=#"2654'?H?5&"&>I6S& B:J0*$ ;(+? `)K-*B-"N9"-4e@3K%6 & 0$2--#7/$">!c"EK>2N/5%;6bNPPT;4>32#"&547&=4&#"#"&5463232654.'74.#"3265#32=#"2654&#"'2654'?H?5&"&8< I6S& B:J2'$ ;(+? !B/.A-6-"N9"-4e@3K%6 & )0$2--#7/$">!c&%)$"EK>2N/5%: 6bNPPT;4>32"&547&=4&#"#"&5463232654.'74.#"3265#32=#"2654'#"'2654'#"&547'2654'?H?5&"&8< I6S& B:J63#$ ;(+? %GfI93-"N9"-4e@3K%6 & )0$2--#7/$">!c$  0%5,*2"EK>2N/5%: 6bNPPT<'3=?(,E6:$3HF5D"#E0+A?V36K6TZ@A+1)=2+5  +/%Q:4Z0I;7lI C%@`U  i-# ++ )#-+A8EOM9>JQ\g%>73!5>54&+#"'#"&546;4>323235"&5463273"54&4&#"3265#26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,EMW . !402- (7/]&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %E\b(#r 2XZ0I-0lI ,4U4!%;MDDIU`gr}%>73##"&547!5>54&+#"'#"&546;4>323235"&5463273"54&2654&#"4&#"3265#26=#"AB20CP-%* TER'"F5F?Q9 ;(+? *BG$LPB=,EMW . !3###402- (7/]&6.&AH-0EB3,@%5gPP[;-F=?(,E6R54"Y92HO_ %E\b(#r #"#U2XZ0I-0lI ,4U4!%;MDIUbt{%>73##"&547!5>54&+#"'#"&546;4>323235"&5463273"54&2654&'#2654'#"&'4&#"3265#26=#"A(*R>?Q.t-%* TER'"F5F?Q9 ;(+? *BG$LPB=,EMW . !! $)94%2:402- (7/]&6.&AH">@ZX>A#@%5gPP[;-F=?(,E6R54"Y92HO_ %E\b(#r X8*" '3!" '52XZ0I-0lI ,4U4!%;JX^gmv%>73#".54632&#"3276=&=!5>54&##"'#"&54>346323235"&5463273"544&"3265#32=#"B 8c;o;fLZRNH.:uL:$#/8F @+R'!A:J95+IEDOC&8 $A^K3C2!x-B+U7Z24*42'>!cC7SP:H?QfO=%@`UM9pu%>73!5>54&+#"'#"&546;4>323235"&546324632632632'>54&#"#54&#"#54&#"632#"&3"54&4&#"3265#2654&#"26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,EV^LD :G83()_!%6!!:)!":1 l -03+1NMW . !402- (7/Jj&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %XX]20-/+*Dm*H)>9ѵ ,#.1-.(H \b(#r 2XZ0I-0lI B,4U4!%; M9sx%>73!5>54&+#"'#"&546;4>323235"&546322"&5467&#"#54&#"#54&#"632#".546263263"54&2654&'4&#"3265#264&#"26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,E[6K) 2:/"9/#,1)$+$)$-a.#?:%.MW . !#C(402- (7/&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %>M'?<<>'J Ӷ("!>3.;'4+3Lh22/.;\b(#r b"*!H6H&'2XZ0I-0lI -+"D,4U4!%; MY9%>73!5>54&+#"'#"&546;4>323235"&546324632632632#"'732654'#"&5467&#"#54&#"#54&#"632#"&3"54&2654'4&#"3265#26=#"2654&"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,E`@?/$<:$)<(>:9bD+#  ;#&2:.5-:.::0"'I)&)$)3-MW . !%0402- (7/]&6.&V)AH@%5gPP[;-F=?(,E6R54"Y92HO_ %UQe3300+! V7Mc [>J'D>6,4E,Ҷ(",":G-=$ 3M\b(#r a(,*0$!"2XZ0I-0lI ,4U4!%;" " M DIUbip{4>32!>73!5>54&+#"'#"&546;4>323235"&5463273"54&54'&'74#"64&#"3265#26=#"5&4A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,EMW . !.7*= <,@l402- (7/]&6.&$/7 xAH@%5gPP[;-F=?(,E6R54"Y92HO_ %E\b(#r Yg@$% -:= 6TN2XZ0I-0lI ,4U4!%; M 9LQ]nv}%>73!5>54&+#"'#"&546;4>323235"&546324>32#"&547#3"54&54.'&'74&#"64&#"2654&'#3265#26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,E>;/&B]A%nMW . !$ '*<Al402-8%! (7/]&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %M.9<x`@?1/`\b(#r Yg&3 .. !TN2XZ0G%#$K-0lI ,4U4!%; M9OT`nv}%>73!5>54&+#"'#"&546;4>323235"&546324>32##"&547#3"54&54&'&'74&#"64&#"2654&+"2654'"&5473265#26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,E96&*3I25G3cMW . !) &*= =Am402- $6*<+2 (7/]&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %M$07 x#=4GH3=#`\b(#r Yg,4 -:= TN2XZ0n#P-# +*  (#--0lI ,4U4!%; M,9]bnx%>73!5>54&+#"'#"&546;4>323235"&546322>=#547632#"&54632.#"3"54&354&#'"654&4&#"3265#26=#"A-%* TER'"F5F?Q9 ;(+? *BG$LPB=,E_( /'7=\.PQ-G05MW . !/@30,` t402- (7/]&6.&AH@%5gPP[;-F=?(,E6R54"Y92HO_ %g#\& GP \b(#r $M6bR@$*0tS[$72XZ0I-0lI ,4U4!%;J.`hr{2#"/32654&+#"'#"&54>;4>32#"&=4&#"#54&#"&5463263232654&'4.#"3265#32=#"?H?5&"&8< I6S& B:J/*$ ;(+? d^<8-C-%9  6KWL28%"6+E+"*".0$2--#7/$">!cK>2N/5%: 6bNPPT< -=?(,E6-u:R<6190Ѵ"(:2c#-uAL//>39.,<0$M#:4Z0I;7lI C%@`UJ-goy2#"/32654&+#"'#"&54>;4>32#"&547&=4&#"#54&#"&5463263232654&'4.#"3265#32=#"2654&"?H?5&"&8< I6S& B:J70%$ ;(+? d^58B/.A18-%9  6KWL28%"6+E+"*".0$2--#7/$">!c&%7$$K>2N/5%: 6bNPPT<)4=?(,E6-uS' @0@?1;! D190Ѵ"(:2c#-uAL//>39.,<0$M#:4Z0I;7lI C%@`Ub$&&4&J -hpz2#"/32654&+#"'#"&54>;4>32"&547&=4&#"#54&#"&5463263232654&'74.#"3265#32=#"2654'#"'2654'#"&547?H?5&"&8< I6S& B:J71#$ ;(+?  GfI=5-%9  6KWL28%"6+E+"*".^0$2--#7/$">!c$ 0%5,*2K>2N/5%: 6bNPPT<(4=?(,E613HF5E%C190Ѵ"(:2c#-uAL//>39.,<0$M-uT:4Z0I;7lI C%@`U  i-# ++ )#-J*.z2#"/32654&+#"'#"&54>;4>322654'7#"&54632'&+"3265#"&'4'&#"#54&#".54626324.#"3265#32=#"?H?5&"&8< I6S& B:J2%$ ;(+? H%/DZ%=!cK>2N/5%: 6bNPPT;4>322'654&#".546!2'654&#".5464.#"3265#32=#"?H?5&"&>I6S& B:J36#$ ;(+? :8R8-B;'+:H (4\8R8-B;'+:H (4\0$2--#7/$">!cK>2N/5%;6bNPPT<%2 =?(,E6LJ5Q M56:3VN1KQLJ3S M56:3VN1KQ:4Z0I;7lI C%@`UJ *Ojr|2#"/32654&+#"'#"&54;4>32#"&5467'654&#".54632%2'>54&#".5464.#"3265#32=#"2654&#"?H?5&"&8< I6S& B:J$ ;(+? v&2A.0@)A;'&@ ) $, [:8R*8R8-#:(*; ) $, [&0$2--#7/$">!c %%%%K>2N/5%: 6bNPPT;4>32"&5467'654&#".54632%2'654&#".5464.#"3265#32=#"2654&''2654'#"&547?H?5&"&8< I6S& B:J0)$ ;(+? l,4GfI+#B;'+:H (4\:8R,8R8-B;'+:H (4[/0$2--#7/$">!c$0%5,*2K>2N/5%: 6bNPPT< /=?(,E6 D*3HF5(< M56:3VN1KQLJILJ3S M56:3VN1JR:4Z0I;7lI C%@`U i-# ++ )#-M61:F2!3##"&547#5>54&#"632#"&5476264&"%2654&#"7]VS&%C12C'+2 gD 5*&-<9<8@BGED0#!4"U(#&!**wflWH#fAD04"V2Uc(Q7HY61RiPGF#2#$5"1+&.'M2>O[2!3##"&547#5>54&#"632#"&54762654&#"2654'#"&'%2654&#"7]VS/.Q@?Q1+2 gD 5*&-<9<8@BGED! P:2' 0(#&!**wflWH'A@ZX>D(V2Uc(Q7HY61RiPGFX8*" %5& &5"1+&.'M<H7463233#".54632&#"32765!5654&#">32#"&2654&#"M~cbDGSR02{!HM1MNCG"$}U$d"b_IL_ +&0F?5CKy*' *,pCCV<}-0!%!#0(fGkNssV%#Y6;Fh0."&1.#"4H_>2#!"3!!"&5463!27654&#"#"&546732654&5466O(,\<4839M+,=8!48C$IqCJ?9Q1)7^'?A#QB^BR03Eda=pc4HQ>:7CJHbH4>32#!"3!!"&5463!2654&+532654&#"#".54673265W 55T04@@T]57394E7$#19$4a@+P>M@5CS0%;<%6 (*08$F2RH='$:3!3$+"6-5TLT#^ECm];LO5=H=2#".54632&#"32>54&#"#"&546732>=46anQ #?_7#>E*AlL(?K+K~Y~7L<\XDVdIE:@H@'U¯yo"-$"" ")cVhIl\MnBHc63"#YhMIk2#"&54>32.#"32>54&#"#".54732>=462'654&#"#54#"&5463265M*Z%Cc:W0IDyC'Y,1fYDAe='@=-6XE5M'{06 7&#f)%    # (<^P6}%0F1#4 B )*%-1Kfa3^OKC].IG$GVN9;%+*MKk& ! :  ' M)Q2'>54&#"#".54732=462'654&#"#".547326=46RZ >,:>D<%<^>5M'{60E@]gv9< 0'P-##@+.;V#",&#F{Y8LCn?IiKYKPP.IG$DXHMiSY],S94E%Y/@-80565?!h24/0C%,5><MX*d2'>54&#"#".547326=462+"3!!"&546;2654&#"#"&546732654&546RZ >,:>D<%;^?5M'{60E@$9gn/=I9$H!'"&0:($ A*0L-3*'6&?{Y8LCn?IiJZKMS.IG$DXHMi;HSY],08?f 2('N7+<*5!-3AB(K ?#03$) -2MZ*o2'>54&#"#".547326=462+"3!!"&546;264&+532654&#"#"&546732>=476RZ >,:>D<%;^?5M'{60E@%8gm5E((9>$Q"%' -$ ,#?,/L5*%,4 !"{Y8LCn?IiJZKMS.IG$DXHMi8KSY]+5"%,!6 2)"!* "737C@.H  <(,6"A.M,+`2'>54&#"#".547326=462#"54632&#"32>54&#"#"&546732=46RZ >,:>D<%;^?5M'{60@1$9g_@I;:lU-H4+/LQ2I%1'<:,8D(6-$/(:;{Y8LCn?IiJZKMS.IG$DXH(LB;HSY].tPdLL9+FD"C^3EV>)YL$/@k:F;/7%4632!!3!5#54#"#"&547326=463237"35&1YH`Ay8UU>G,UCA_[FYGImS0SImFTG7*z9(%45!-. (9;LT%4632!!3#".54>32&#"327>5!5#54#"#"&547326=4>3237"35&1YH`A{oHI&:4K6+3"LD$o]y87326?>32u$.m?* 1$:4(#!,+:'*BfCHf =,:>N.5.%:9Gn 7'DD<%+$:,.,I[LC[pn7F?lBWWT=;:R(J3AH;EO%"&547&/32654&+532654&#"#"&54>7326?>322654&"u$.9;D`E 1$:2*#!,+:'*BfCHf =,:>N.5.%:9Gn0#"2# 7'A%!D3AB2%"<%+$:,.,I[LC[pn7F?lBWWT=;:R(J3Ay#!#HESe%#"&547/32654&+532654&#"#"&54>7326?>322654'"+2654'#"&'u$.CBQA?P0 1$:5'#!,+:'*BfCHf =,:>N.5.%:9Gn#+84% 09 7'I$&O@ZW?D'<%+%9,.,I[LC[pn7F?lBWWT=;:R(J3A  X9)  '3& (4HDJ#".54632&#"32654&+532654&#"#"&5467326=463262xy_9@*[=W-"=Q;MPA8&&/7/6&)XDVdIE:@H@,/jW4N(7)H 3sQ"' *c?9O6;&4 !D05Il\MnBHc>V7]d,-Hl#"'#"&54>7>7654&#"#53264&#"#".54>7326=4>323265332654.'u;AlFI2Y45K   ( " %$=*-418*#0E*1"65@J7(7>7654&#"#53264&#"#".54>7326=4>323265332654.'7264&+"*D02B6$Y45K   ( " %$=*-418*#0E*1"65@J7(7>7654&#"#53264&#"#".54>7326=4>323265332654.'2654'+2654'#"&'u;A1($3R~Q6'Y45K   ( " %$=*-418*#0E*1"65@J7(3?\X>K&((-/*  *(,$?PO/F%0Y;0LF=A*LX?KI5L&E*7! 53 .,B;3^R);8%  !X9)" %5& &6Nz#".54632&#"32>5#"'#"&54>7654#"#532654#"#"&546732>76323265332654'J,"58C/vG)S&6lV5I'2AZ5iJ;' "H 4/I4,5I]F:kA2! >R8("P+JL&"5KkDxcJ|#"%" "@M32HS6# !0**3S F5SH%XyA]:;*81G 4  $-,C17654+53254&#"#"&546732>7>323265332O/#~t֍cb `]f\5i;K( #I,J#(K@J\H8jA4 0/8S7)['P2CM( )=7PnldQx]8a HS-,  /*E"?E.ErQI&Xy@^;:)=V);.H 1@"-*C2;L|y%4.'7"&547# '&5473267#"'#"&54>7654+53254&#"#"&546732>7>323265332264&#"O/#~l-7654+53254&#"#"&546732>7>3232653322654&#"2654'#"&'O/#~t 4HU=@R o֍cb `]a)]6h71( #I,J#(K@J\H8jA4 0/8S7)['P2CM( s 5,81#$/9)=7Pn R6?SU=&ldQx^=\ ES *"  /*E"?E.ErQI&Xy@^;:)=V);.H 1@"-*C2;1b9)" $2.):H<2'>54&#"#4&#"#"&54>7326=46326 Ox :*"0V1 3S<(*F_=i[f(M4;n&<15"- 1"N7S,2]732652654'PiH\8I\J\VLMg=6(&X|.%X54T\ER(0HS>RCb?I56 ;*#1L0%;O2;N1)KN77sLoLM*a9: +=h`SIKg"08:"-8EkRY;:l4HB5;,RbGUAEF&G92>F*4%4&547632!5>54&#"#".5467326%354&'UAAYbyjR.*@gB:7#GAlH*'@-FKE<)<Q/0wpZxL-'=5\Yb0^>L{ 7VQDDlB=Q)F;4>H%4&547632#"&547#5>54&#"#".5467326%354&'2654&"UAAYb!!D`E"jR.*@gB:7#GAlH*'@-FKE<)0#"2#<Q/0wp03AB2/ ZxL-'=5\Yb0^>L{ 7VQDDlB=Q)#!#F5?K\%4&547632##"&547#5>54&#"#".5467326%354&'2654&#"2654'#"&'UAAYb.,Q@?Q/jR.*@gB:7#GAlH*'@-FKE<)! P:2' 0<Q/0wp%A@ZX>A)ZxL-'=5\Yb0^>L{ 7VQDDlB=Q)3X8*" %5& &FFJ42#"&54732654&#"#"'&5467326=46V^ʻH#A*QV@;*=bBI54=7"07K-'>3.BO^H#A*QV@;*=bBI54=7"07K-'>S 1>H#A*QV@;*=bBI54=7"07K-'.  2(:2#39Z O6>TV<  ֺh\mBva9Ic8.GU87jI#q?TN93oO[e8e=:  8*#%1)$+8M*U^2'>54&#"#".547326=46#"&=4&#"#"&5463232654.'2654'RZ >,:>D<%<^>5M'{60E@%8g)K-*B-"N9#-3e@3K%7 & "E%{Y8LCn?IiKYKPP.IG$DXHMi:ISY]- +/%JG=:0+A?V36J7TZ@A+1):5+5 +A8'LOM*]hq2'>54&#"#".547326=46#"&547&=4&#"#"&5463232654.'72654&#"'2654'RZ >,:>D<%<^>5M'{60E@$9g9A.1?-6-"N9#-3e@3K%7 & )4&&)"E%{Y8LCn?IiKYKPP.IG$DXHMi;HSY]D0@A/: J0+A?V36J7TZ@A+1):5+5  +/%S$%#+A8'LOM*]j~2'>54&#"#".547326=46"&547&=4&#"#"&5463232654.'72654'#"'2654'#"&547'2654'RZ >,:>D<%;^?5M'{60E@$9g%GfI93-"N9#-3e@3K%7 & )$  0%5,*3"E%{Y8LCn?IiJZKMS.IG$DXHMi;HSY]:$3HF5D"#E0+A?V36J7TZ@A+1):5+5  +/%R  i-# ++ (#-+A8'LOL;O3<G2!!3#"&547!5#5654&#"&546323546"!5.2654&#"D(,H07:?8!1YPPSO4(7\m.SH7[bX9)" '3% &6HxEN23467632!!3!#"&54>32.#"325!5#5654&#"&546"!4'&Cb##5W<#"1SD+C=US$ L#uQ.I=+7? D[?EM(%+^D1+F]%6 02J5&M/%$*J)>H-2 1YA_*TI7u+4LGDfo2!!3#"&54632.#"326=!5#5654&#"&5463235462'654&#"#54&"&546326"!5.-) 9'(1KVDB9$#AU#@*N\;H,H07:?8!1YPPSO4(7\m(Z@#,)(\0@ѵ%"B/[%0f:a10SH7[bLG)NWb2!!3!5#5654&#"&5463235462"&547&#"#54&#".546326"!5.2654&'P8 Ѵ'"F1X"V%:a0/SH7[bR$'G6C)&LXG)bkt2!!3!5#5654&#"&5463235464632632#"'732654'#"&5467&#"#54&#"&"!5.264'"!4&Lk&a7O) S :GhZ>%)#6l^IC+,B6D!54DN)CXF0.- C1>7N,Ab71Z;Ö-H0676F1X-B!(VG7dpHRZf23432!!3#"&547!".5467!267675!5#5654&#"&54>"!4&2654&#"Lk&a7O) SB%0C.0@[2 ;(1@A.>bhAb71Z;Xw !E -H0676F1X-B!(VG7dp2'(%%HHMUcu23432!!3"&547# 467!2767675!5#5654&#"&54>"!4&2654&#"2654'#"&'Lk&a7O) SK*5VyUx%)#6+-? IC+,B6D!54DN)C *92#39XF0.- C1>e0I1=UV<.%Ab71Z;!E -H0676F1X-B!(VG7dpE c:)# %1)$,8L;+IT_%#"&547"/32654&+532654&#"#4&#"632#"&54>326322654&#"%2654&#" +86E00C 7"31:'$41B'-BSP/YV ,@6< 4#?F/NU.i-1gEdo%###"*%' *9%A$"A3AB2*:%+3,0,&*$,(6hbGR7+,jOMq<OMHt{""!4"7#.+&UL4HUfq%#"&547/32654&+532654&#"#4&#"632#"&54>326322654'+2654'#"&'%2654&#" +=FR?@Q0 7"31:'$41B'-BSP/YV ,@6< 4#?F/NU.i-1gEd!  P94% 0|*%' *9%D$#T?[X>B):%+3,0,&*$,(6hbGR7+,jOMq<OMHt! X8*# '3& &7#.+&UM07>HS2#"/32654&+#"&'#"&547.54632>32#4&#"265#';54#"26=#"v&8 E.!,'/ ^>!@ 9!2OB&K9H;%9cD@&$:7N?Ĥ.3#>%!H%!7,++*8P/;&"1g1# 0L?K' 1-JP ,cZE@?FICNW`l-'c*,4U4 +6H5<FPY%#"/3254+5324+#"'#"&547&5463263232%4&#"32>5#';54#"32=#">2:H9H&!?,P)#?9JBDT0G%OEV750,22+'09)$?)'?"b!"* !0."G*KF*PPP@P>4APPnSE^4VM=H5#';54#"32=#"|R9393}6*0DMHP)!A;HBDM7G%O,?@|/4R8:6.4,3+* Ħ=&#>))>!c4B7"':;0(-UgDDG3E4':BB#8/=,+.7@1CH,;5D.2[$"R""2QGM@HS^h2#"&54>32.#"32>54&+#"'#"&547&54632632#4&#"';54#"32>5#32=#"nIY!GZE/H@5>+(()*V]"=c<3/a9Q(!A,-#+ Ĥ##>!7,xU.[X7, " .KY.=XsnPPT32#"&5476326326322654&+532654&'$2654&#"-*`9'- ?,(/0*+$.5*LRU6E9KK=0./-#LqBC.!1;A8>AUU}b71>R)Q75TfLGHMMI1>*(.!2i:HA4 54<L;ocq%"&547&/;263654&+532654&#"#4&+#".5467&#">32#"&547632632632264&'"#%2654&+532654&'$2654&#"-*42D`E  ? 5(/0*+$.5*LRU6E9KK=0./-#LqBC.!1;A8>AUU}b715210))=5(=7"E0J(N5>R)Q75TfLGHMMI1>u#1!"*(.!2i:HA4 54<Lz`l~%"&547&/32654&+532654&#"#4&+#".5467&#">32#"&5476326326322654'#2654'#"&'%2654&+532654&'$2654&#"-*;FQ~Q8  ?,(/0*+$.5*LRU6E9KK=0./-#LqBC.!1;A8>AUU}b71>R)Q75TfLGHMMI1>" X8)!'3% '6*(.!2i:HA4 54<J7&0233##"&547!532654&"#&546264&#"7!532654&"#&5465#7!532654&"#&5465#2654&#"S233##"&547!5>7!532654&"#&5465#2654'#2654'#"&5465 6",5r&H{%B (V:H.H"E)&445Jg?F@71T> I7K( (! 0)<(,5E7&#"!53264&"#&546323&54632#'2654'd %(4&8 p&P1B!,( % +#'049G? =35BU/% "&Jjs}233!532654&"#&5462#!"3!!"&5463!254춮&#"&547&#"!532654&"#&546323&546322654'54'54'#"&5467&#"!532654&#"#&546323&233!532654&"#&5462654't(.$$!!"!2  /h<.C'1J.D`C "@9y7mR. %%!#($..K %" )ZIL7Sr12(J( , KT*61%&"$ !//$*=[2L=A.Q8 2(+>>+jL: ;?[t'V:2)L4$": A(E!,/ +. ",V:H.H"E)&445J1HUa2#!"3!!"&5463!2654&'#".54>7&#"!532654&#"#&546323&546262>54'fd$"-*>=+O`UF&B/0D.'#/Mf_((&$#- +H;@R2<}Ca$ &5I0}ge~J9*(:jMIc BH-ZG>M')F/ xLy:"D'&70$7&#"!532654&#"#&546323&5463262>54'UHJR8"#,<;*$&>."11/"Q?9J3.&;Lg2-(("(!/ +O4BP2<}\g=q 9M-{KH@(B6FI9)+=,%$6.$( DQLs]A,K1 $vN9^"D'#:-'CCZ%'+$1+ir] &&$7b9Yz`>J` 9sN=g"K)81% ;DO@B6VDO7>- 3$&LJ&zYe2# '&5467327>54.'#".5467&#"!532654&#"#&546323&5476322654'JZFlu=7 >*Oqt`o*K:*7L>*6DS,)$6"# * ?6:J*276Wv9 ''LTj+RYC+glRq/?e:aS')!N%;)(2W~;D!Fb2wH7f &J'46:FT<>7RdYGGtI;?,S(*"#Jzbn{2#"&547# '&5467327>54.'#".5467&#"!532654&#"#&546323&5476322654'264&#"JZ`)6B/.Bx=7 >*Oqt`o*K:*7L>*6DS,)$6"# * ?6:J*276Wv9 ''L9&% TjyW>*0A?1.glRq/?e:aS')!N%;)(2W~;D!Fb2wH7f &J'46:FT<>7RdYGGtI;?,S(*"#'6'Jpzbn}2#"&547# '&5467327>54.'#".5467&#"!532654&#"#&546323&5476322654'2654&#"2654'#"&'JZn/*Oqt`o*K:*7L>*6DS,)$6"# * ?6:J*276Wv9 ''L   *92#!19TjR M3?SU=glRq/?e:aS')!N%;)(2W~;D!Fb2wH7f &J'46:FT<>7RdYGGtI;?,S(*"# .c:)$ %1,!,8H0(ks|%2#!"3!!"&463!2654&'#"&547'#"&54;2654&#"#54&#"632#"&54632>32+"32>2654#"324#"UPNH*h7328EB0.7*&: ~p*+JJD;1#S@2>! /-$-7uAo1X!CX98s43V,.4Z**KZE;3<24- &(1*% C.1*H+->'P06% 0 $;8,AP7_;@-, $,>>.\fMv%2#"54732>54#52654&#"#"&547'#"&54>;2654&"#54&#"632#"&54632>32+"32>762654&#"3254#"7i**90\"SVkIF09 7+':Oh:1K+W<:]AV-S@3>  /-$,7rCq.X =[5TS)@&9"RWAg**98$ (. }} qk ;(6(!$.>2&K>M2''D;3+6A9O/6$ 0 '88,@Q7L?0E# *-A $#"I*43M ?mu~%2#"&54632&#"327654&'#"&547'#"&5476;2654&#"#54&#"632#"&54632>32+"32>2654#"324#"yaeMz{GnD76C*9J4z@A3)8*&: u*7A54hGF49,-S@3=! !--$,8uAo1\GQ`g>G(&,.3N**iDY-#*%' <;2654&#"#54&#"632#"&54632>32+"32?62'654&#"#54#"&54632672654#"324#"y"@?&̈-`M]zB' `(133XEm1,8*&: w+2F+DB :S=0/)S@3=! /-$,8uAn2X!@X)@?860-GM#% #Q.3N**#F0y9&7FB *%-l3H#)0*% H4A-#2 D8-5558@/7% 0 $;7-AP7Q@-A! $6!@!& 4:% & .\fMl%2#"&547'#"&546;2654#"#54&#"632#"'##"&5476;2654&#"#54&#"632#"&54632>32+";2>767>32>32+&#"32$2654#"324#"324#"(<7+#= I$KHN8Fnx$mg5R@3="/-$/vOWI('ZCN/8,-S@3=! /-$,8uAo1Y DX99o/9u9Ma)+oAo1\8b$1O6)?*$#?H/2F**D**4P2)''!2(,HC/b$#=.P/7% 0 $;WYF?&)\/"6:L S/7% 0 $;7-AP7Y8?0/ 4)A#.32+"32>54632>32+"32>2654#"3254#"3254#"=TZDX00D(86*n=/)'/ ]Z18EvU1MXLLH3 +* 'FhHnt2JWKN*75)( (1b?`,Q8Q''Wk]D`,O8Q,JL5_SI)dOa&+"" $$<0;E!5"($,Z0#&4." B,4+=C:,_|4^=$3&:#TL34Bc@*_44DA$0!(88-?S5R5>P{<@R5R5'8!(,&.&,X0101LD%2#!"3!!"&463!254#52654&+#"&547#"&54;2654#"#4'&#"632#"'#".54;2654#"#6=4&#"632#"&54632>32+";767654632>322654#"3254#""3267#"'#&$3254#"X`J(.%4% $11$%( -1'$2 VX'F5IVNK G2 +'"'bx7NH%/MWNN+82 )) (2c>a,N:OEm~af;_- Q6R'* !!#$>@)$/)$$#! **9,A'("#'3-#?40->(_|4\=$/"#=X[A 2%a=-_ DC$4'99,?S5Q64@Bd]@R5P7r%,," 01&!.l &01L0%2>32#"&54>32&#"32654'#"&547#"&54;2654#"#4'&#"632#"'#"'&54;2654#"#54&#"632#"&54632>32+"32767>32>32+"2654#"324#"324#": {1D1,a,P7RƱ0J43%}aa=`,N9OIJ&F/V'+####3;;&"Ky-% lhG#!*0-# >#4(9-_| \=$1 #=T^B9,]<._42FA$0!'98->T5Q6 Cb`CP5P7# --+&b""bL>32632'654&#"#"&5467&#"#4&#">32#".547+"&546;2654&#"#54&#"632#"&54632>32+";2676?>322>54'264&#"%324#"g:"8:C9o@AE70XgS$.@"=(AL:-+-=T4-+D' 0!4B>6); 8YD^?ZS]P7F/8--S@2:%!,-$,8tBs-Q%NL98b,&(*>y]O !-We1P*"#"))/**p" HIcHq!BzZx 'p@?<%vD32#".547#".54;2654#"#5654#"632#"&54632>32+";26?>76326326327654'2654&#"%2654&#"3254#"`tD@F+0C=+4[H!^I=7G5%&4M+)GT '+>07$5 <1E<.NWNNc2 &( (2e=`,K9QgU~~1g}>7OH'%H9+3-$*JW3# $"$$jUXF3=C-*AGNXx\yMrqI8t 2),(3j[X80R$:;xX ."l:,_p y$1 (8:+?S5Q6HX<7Wh,)1 .II1F-&+lHNg 0$1.!9&01NC%2#"'532654'"&547'654&#"#"&5467&#"#4&#">32#"&547#"&54;2654#"#54?4#"632#"&54632>32+";2>?>7632632632$2654'264&#"%2654&"324#">VcL=)%A(8N:&QYJ _J=:C.*&4M-(IR,.< ,>A?IHgk.OWOLd3 ((!'2c=c*L6ThU~*:[D-7PI&$J9+3;_u@J*JWLv!8$$$$$N>CTA18-0 )!1#.#Z^Yy[zPouE3r' 1*,+0nW(_1)*gP{-(.Cl:,_p  x#/"'97.>T5O8JV<7:;.,/#.IIiRUM2mGPk/ . "3-"6(bF&nw%2# '&54732>54&##"&547'#"&54>;2654&#"#54&#"632#"&54632632+"32>2654#"324#")Ehgi!^J\Mvd6-%;'"> }r+0H%<=9W>%"SB2;".-$-6hRc72U@['?;&J(-,.4P**HEnwgz"ntUR+(J6'/%&*!% C/A0!1 J8%1+@.8% /!'88,@N46H@*?('!AA//*fFy"&547# '&54732>54&##"&547'#"&54>;2654&#"#54&#"632#"&54632632+"32>32&2654#"264&#"324#")'A\CW{gi!^J\Mvd6-%;'"> }r+0H%<=9W>%"SB2;".-$-6hRc72U@['?;&J(->Eh,.4&%+&** ?/B@0gz"ntUR+(J6'/%&*!% C/A0!1 J8%1+@.8% /!'88,@N46H@*?('!AAHEdc//'6'"'h*fFIz#"&547# '&54732>54&##"&547'#"&54>;2654&#"#54&#"632#"&54632632+"32>32&2654#"324#"2654&#"2654'#"&'x(6U<>U?[gi!^J\Mvd6-%;'"> }r+0H%<=9W>%"SB2;".-$-6hRc72U@['?;&J(->Eh,.4P** 5R:2$!0J/?SU=/% gz"ntUR+(J6'/%&*!% C/A0!1 J8%1+@.8% /!'88,@N46H@*?('!AAHEnm//*f0b9)$ %1,! )LDQ^h"&547&'#"&=4&#"#"&5467&#"&54632623265332654.'2654&+%2654'X*9 G+AdBC2.S@`>;'mQH@L9/.RY^!kpiA2+S>(%;'mQH@L9/.RY^!kpiA2+S>(%4?[X>?)3L`Na:Q[yLrvCN:./Eg_!jx`>5:@C_ %(5SO@SX(+3We5+z=XsI) %($JJa?4ZzQmrG;n% pFFU_B**< +#CqiIZeK6nIQm0JLe%2654'7#"&54632.#"32>54'#"'#"'&=4&#"#".5467&#"&54632632326532'654&#"#54#".54632%2654'(BFtJJO)Bc;Y~]zC'^)?S.^,%   -1We33mH6!~v'+G07FB  )%-T|B8LL3*Q4_Y[yLr@Q(?m" sR=LecK;bO+#D/C% $:  S.nIMq.LP&^h#".54673267"'#"&'4&'&#"#"&5467&#"&5463263232653327654&'2654'r80a:_U)kK$ZxOquF5o( qCIX]_; T*"Co0<7NT%K4lGNl,LPhs}#"&547#".54673267"'#"&'4&'&#"#"&5467&#"&5463263232653327654&'7264&#"2654't+>>21@4xӞV08'=(Qwg0L&.H:K .% ]L<7F.+%a:_U)kK$ZxOquF5o( qCIX]_; T*"Co0<7P\ -hS'8%$'K4lGNl,LPft"&547#".54673267"'#"&'4&'&#"#"&5467&#"&5463263232653327654&'72654&#"2654'#"&'2654'`4FUxW }ӞV08'=(Qwg0L&.H:K .% ]L<7F.+%-4hmEk<>a:_U)kK$ZxOquF5o( qCIX]_; T*"Co0<7P\ -hS ,a9(# %1.*9wK4lGNl,LM:PMWco%#"&5467654'&#"#"&5467&#"#4&#">32#"&54632>32632%27654'2654&#"%2654&#"5B20C0H79V"mUC48Di4VWaq%"!%*' *,8/3AB2,7 PVX=A Z|OoqH32#"&54632>32627654'264&#"'327654'#"&'%2654&#"XiY[*)=?QL:F79V"mUC484VWaI=8*)5$2 f*' *,‡kbYbC+.X?=KPVX=A Z|OoqH54&#"#"&547&#"#4&#">32#"&547632>3262654'2654&#"[e_Sמ"/G;NO3,HM%0SL34:*-!7>6+CMJI`]H@)-$*A.F$*/I#$$! ))ƒY|FH"5:)HjHnFPEMt@0),)5)U;+\84+lOrOPO"+06b-U)53P3!"1.#7D;T^iu233#"&547!53>54&#"#"&547&#"#4&#">32#"&547632>3262654&"%2654'2654&#"[e_S$(D`E*"/G;NO3,HM%0SL34:*-!7>6+CMJI`]H@)-$*80#"2#.F$*/I#$$! ))ƒY|FH#03AB21""5:)HjHnFPEMt@0),)5)U;+\84+lOrOPO"+#!#06b-U)53P3!"1.#7DUar}233##"&547!53>54&#"#"&547&#"#4&#">32#"&547632>3262654&#"2654'#"&'2654'2654&#"[e_S'1Q@?Q2"/G;NO3,HM%0SL34:*-!7>6+CMJI`]H@)-$*+! P:4&1.F$*/I#$$! ))ƒY|FH&D@ZX>D*"5:)HjHnFPEMt@0),)5)U;+\84+lOrOPO"+X8*" '3% & 06b-U)53P3!"1.#7Mhs2!3#".54>32&#"326=!53>54&#"#"&5467&#"#4&#">32#"&54632>3262654'2654&#"SfZS?lq@AJ32IAlB=j!]H6o'4@;NN7:7(1/)SJ2+C' +&0F?5CKuj- B"8()G#)?%/*O*' *,xVp`!6O( !&[Q""d6HhPd?WU35P17",)4,<,%#Y6;FhQtM"+:,U3V$';P."&1.#"4P=Zep|2#"&547&#"!53>54&#"#"&547&#"#4&#"632#"&54632>326323&5462654&'%2654'2654&#"wWoF=1B_A]3%"-83CD3-8N("M?,GT%8/61=B{f[) ;0$$.H\L6s 'X' !6." !"˜_T`>\qM3n &g2EgOc;]O;eO4"+(3lXH3+2;GhQvJ-yUq[XUdwP3 hRa&IJ8+T0 \ ?P65/6P7|2#!"3!!"&5463!2654&'#"&5467&#"!5367654&#"#"&547&#"#4&#"632#"&54632>326323&5463262654'%2654'2654&#"Lfd4%"K*>=+MaVE&M=CKM9#/Mg3-޴!83CD3-8N("M?,GT%8/61=B{f[) ;0$$.H\L<~Z]Cd.&5I/ !6." !"}ge~J9*(:hOIc @JUymEBe wM9_"<.6EgOc;]O;eO4"+(3lXH3+2;GhQvJ-yU~TGv[C;IT9V8+HN8+T0 \ ?P65/6P 42#!"3!!"&'463!2654&+532654.+#"&54>7&#"!53>54&#"#"&547&#"#4&#"632#"&54632>32632322&5463262>54'%2654'2654&#"YUHJR8"K,<;*+:- "11/"Q?9J3.&;Mf2-"-83CD3-8N("M?,GT%8/61=B{f[) ;0$$.H\L3**<<}[i; r$2T- !6." !"KH@(B6EI9)+=-$$6.$( DQLs]A,K1 $vN9^&g2EgOc;]O;eO4"+(3lXH3+2;GhQvJ-yUq[Uh[J5C"O/TD+EY8+T0 \ ?P65/6L%4632#".54>32&#"32>54&'#"&5467&#"!53>54.#"#"&547&#"#4&#"3>32#"&54632>326323&2654'%2654'2654&#"qZl9HTv:K6POKF70( L^D`-.%H>3ADG":DZ6"&) , D@6.7M)"M<.%;! */;80h5vI:h &%g-6:%Mf9^P:cQ5!-'4+<*(]36MkPuJ-C:Sq[XFR29/k#LJ8,R2ZBP290<6Mow2+"32632"&547'#"&54>;2654#"#54&#"#"&547&#"#4&#">32#"&54632>3263262654#"$2654'2654&#"L>[->(?@-832#"&54632>32632632+"32>322654&"%2654'2654&#"(18S..4';:(,J5%8-">`[01Fs]1KfXT@251%(1" +HSN.+C' . 3C5?FHul+K):%)1s-m;^b@-I'4fFe39b&~***&!)) (31"! '&,$4%)2 % =(2/0 $3.# 6M<%"32>7632#!"3!!"&5463!2654ᒆ##"&547#"5476;2654#"#54&#"#"&547&#"#4&#">32#"&54632>32632632#2654#"%2654'2654&#"L+PP+>C!ME6A(),(\%66% (P8-"> %D)F. !5[f!T@251%(1" +HSN.+C' . 3C5?FHul+K):%)1s-m;^^X.2***&!))*/3!5 (&:1'#% *;%)2 %-"r`<6b "8@06G%=9+.'2+,,1,<,*Z52OkNvM$)44H:FY/*.=>0 $3.# 6MUiu2'654&#"#"&5467&#"#4&#"#"&547&#"#4&#">32#".54632632632>3262>54'!2654'2654&#"bp5'2XcZ ,A)(GAK<,(3ITE9(kOC /!(; sUB3U?03Ie:R%>,9Q#-W-82+3X,10+"$$ !))—c-?>BvR &r?J:;wC32#"&547632632632>3262654'2654&#'%2654'2654&#"bm4)%C21C&?89N mUCHY{LstB{W 0-,-,;,W8;GjPtLPLLZ#7uL5mKPo1I!" -$Q0y?m6+O/!&1.#8M^mw%"&5467654'&#"#"&5467&#"#4&#"#"&547&#"#4'&#">32#"&547632632632>326322654'2654&"2654'"&'%2654'2654&#"UW`UyTJ6F89N mUCHY{LstB{W 0-,-,;,W8;GjPtLPLLZ#7L5mKPo1I"X;'  *0),6Q0y?m6+O/!&1.#8J?092"&547&'732654&+"&54>32&#"3264&"6TH>"D`Es>_56L-5a=H&=> =j6h9R$%m0#!4"H,I+7 3AB2(? (*'G3)=' 8.,#$J0=N2#"&547&'732654&+"&54>32&#"32654&'#2654'#"&'6THJKQ@?Q+c._56L-5a=H&=> =j6h9R$%^$P:4&1H,S'#W@ZX>A&3 (*'G3)=' 8.,& X8*" '3% &J24>32&#"#".54632&#"3254&/.J*DB I)^@Y;+@@G$;(l9K%,@!E4+3.&XGY`##-*'6-R@?9\%2#"&'&54632.#"327654+.5467632&#"32'654&#"#4654#"&546326NRtXW{'ZiE^5 C$=:R-`<>i 4-#"  - &  F>7%#"&'532654&+53254&+"&54>32.#";2#.SaBui3B9%x6v32.#";22654&'#.11B31C|6i3B9%x6vJ[%"&547&'532654&+53254&+"&54>32.#";22654&#"2654'#"&'#.ICR~Q1h'i3B9%x6vF&6,$1C&$I2/.G6 # /!RX7+" '3% 'Jn/%2#".5473254&+#"54>32&#"327LUMzL1T #/4)B@ }F6h9Zw Q1$8NM)gN!W&kW#u,B G6046J3q6A%#"&547"&5473254&+#"54>32&#"327322654&#"0A;51@T #/4)B@ }F6h9Zw LU6&!' I&IA.(!gN!W&kW#u,B G6046Q1N&,"Jo6AR%#"&547.5473254&+#"54>32&#"327322654&#"2654'#"&'$KS?@R,T #/4)B@ }F6h9Zw LU5R92#3*U*gN!W&kW#u,B G6046Q1S 0c:)% %1)$*MT!.%"&547#"'&54632264&#"2654&+ (AdB _@@yaeFb_IHbc4"$  4 :&1CE/?>_ggbIbg_HGg#" M /A%#"&547.54632264&#"2654&+2654'#"&')7R>?Q"XoyaeFb_IHbc&)94% 09 A5@ZX>:" zYggu6bg_HGgX8*" '3& &6MDFQ#"&547&'#"&=4&#".546323265332654&'2654&#"V)8 L.A31BE23WBf5!1V0#*: wE0.G-)A)1L_WVI5#"'#".54754#".546323265332654&'N;J2OTQNsC6e)WM1EqD$4>c)3T87!S@Ip;KeUW(6SOCQD0'~DL}uP/'%#&# #+CJ"&JJ*R8 2mC{J"yKc}G+#CqdI9oM<n#"'#"&=4&#".546323265332654&'#"'#"&=4&#"&54632326=332654&'V)8 vMT93WDe4!1V0#*: wE0.G-), ;,E7&0J4&A=%=,':3#&> #*/)@D1hLL]YVI-ZG1V&X'9\9A07,ӹ#,?G8J1M<~#"'#"&=4&#".546323265332654&'2#"&547&'#"&=4#".54632326=33267#"&462654&#"2654&#"V)8 vMT93WCf4!1V0#*: wE0.G-) #*/)*4&&$@D1hLL^XVI-ZG1V&X'9\9A07,ӹ#,?G8J1$%&M<}#"'#"&=4&#".546323265332654&'"&547&'#"&=4#".54632326=33267#"&4632'2654&#"2654'#"'#2654'#"&547V)8 vMT93WAh4!1V0#*: wE0.G-) #*/!*.P3$ 0%5,*2@D1hLL]YVI-ZG1V&X'9\9A07,ӹ#,?G8J1L5gX i-# ++ )#-M<GT\#"'#"&=4&#".546323265332654&'4>32!754'&'74&#"6V)8 vMT93WBg4!1V0#*: wE0.G-)32##"&547#754'&'74#"62654&'#V)8 vMT93WAh4!1V0#*: wE0.G-)32##"&547#754'&'74#"62654&+"2654'"&547V)8 vMT93WA624!1V0#*: wE0.G-)=#547632#"&54632.#"354&#'"654&V)8 vMT93W>k4!1V0#*: wE0.G-)bK+?<FK3gu%K4WOB-#B7;iI(<7JgXe#"&547#".547! 7#&'#"&=4&#".546323265332654.'72654&#"+:@01@y8j!e0a'_/2VDh3!1V0$+:uH/.J,(;S7(bK+?<FK3gu%K4WOB-#B7;iI(<7,zE&' 'Ji]i{#"'&547"#".547! 7#&'#"&=4&#".546323265332654.'72654&#"2654'#"&'3CV=<*+$%9L*y8j!e0a'_/2VDh3!1V0$+:uH/.J,(;S7(bK+?<FK3gu%K4WOB-#B7;iI(<7,zEb:(& &1-!)9MFIT`2"&547&'#"&=4&#".54>323265332765#"&5462654&"2654&#"?E(*#-AdB]C6UBh5!I9"(,4+#!"$"$tP:t' :(1CD0 MNc]EL@nL+85BG35cKWcHTG0#@6E55k)T9323265332765#"&5462654&"2654&+#2654'#"&'?E11'9Q~Q&J46UBh5!I9"(,4+# ! &)94% 08tPC|% A6@ZX><&=Nc]EL@nL+85BG35cKWcHTG0#@6E55k)T95#"&2654&#"?6[2`}S?OjN<N$!`Z'u;Zq+1\PXS=Lo9MeU*;,)5SL9,A!*)3Dh@*('!B1MO0m{c,+%$%(i7LLqW?lEwM!|J^!+F/!$03.$?7D(CD%&!Z*,%!8,*HDYd2#".5473267#"'#"'&=4&#".546323265332>5#"&546264&#">N9|ґi_5b"^6[WB-1_?L,?>+3!)A=3SP5./&:3BAF"$&${Wcs<9Y[lXyNvI.7ER!-<)gAJ;?R&>iKY[G <;#0$?6E+Y>GX63K.F6)&=H_jt#"&547#".5473267#"'#"&=4&#".546323265332>5#"&54632'264&#"2654&"*+=>20B-gŚOb"^6[WB4*]AL,L\3!)A=3iKY[G?hR1#?6E+Y?GX63K%Gf.F6)&=@%'(Halv#"&547#".5473267#"'#".=4&#".546323265332>5#"&54632'264&#"2654&#"2654'#"&'4DV<=U jŚOb"^6[WB-1_?L,0E#3!)A=3SP5./&:3BA2>Nx"$&$,52*92#!19H P6=UV< 'XqlXyNvI.7ER!-)AA!AJ;?R&>iKY\F?6`0$?6E+Y>GX63K|V.F6)&=G0:)# %1+!,8L<GQ"&547632632632#"&5467&#"#4&#"#4&#"632%2654&'264&#"CMHIa_G9\Y8EXiMG:V?-/3JSI*&6SJ45:*-?-GE4+0#g9*,"'( nQrNONNJHpPh^Y>o#*(>7' ,*4)U;IPE32#".54632632>32#"&#"3262654&#"&&:AL*R0 ] _u-#%2) P :D;bSG-'3SK44:*.!6?6+(; `^H1\&T g:[b(&A %K-&!% "')%+%/3X)(0 01+:;'",)4(U;*Z:4+%;;uOM&4,.T4!-&y5#12>7H;lu%2#"&547&/324#"'&5463232654&#"#4&#"#4&#">32#".54632632>32#"&#"326264&"%2654&#"&&:60B10DB# ] _u."%2) P :D;bSG-'3SK44:*.!6?6+(; `^H1\&T g:[b(&A %K- "#2#$&!% "')%+0#<1CA3+3X)(0 01+:;'",)4(U;*Z:4+%;;uOM&4,.T4!-&$0#!4"5#12>7Hkx%2"&547&/324#"'&5463232654&#"#4&#"#4&#">32#".54632632>32#"&#"3262654&'#2654'#"&'%2654&#"&&:@@' 3X+(0 01+:;'",)4(U;*Z:4+%;;uOM&4,.T4!-&X9)" '3& (:5#12>7J5~%"32#".5467;>54&'&#"'&5463232654&#"#4&#"#4&#"632#".54632632632#"&264&#"l'?D44 (CwQwƪ81:*k3xٝ%&N/F+22)I0, O N(F`S@2$8SL0+C& +>5A 0!(; tj/.Z4SB)SB/ 9*"#!**"A2:+" ;sdDi9XSy_1  -'+#(4 ")%3(2C%$,,1+<,I\3*)%<;wLL3'ZA- 50@7.#!5J"&547!".5467;>54&'&#"'&5463232654&#"#4&#"#4&#"632#".54632632632#"&#"322654&"264&#"!/A^BzΪ81:*k3xٝ%&N/F+22)I0, O N(F`S@2$8SL0+C& +>5A 0!(; tj/.Z4SB)SB/ 9'?D44z''5'%*"#!** ;&1@?2!;sdDi9XSy_1  -'+#(4 ")%3(2C%$,,1+<,I\3*)%<;wLL3'ZA- 5"Af%'''M0@7.#!5J_%"32#"&547#".5467;>54&'&#"'&5463232654&#"#4&#"#4&#"632#".54632632632#"&2654&#"2654'#"&'264&#"l'?D44\(2V=;Vr81:*k3xٝ%&N/F+22)I0, O N(F`S@2$8SL0+C& +>5A 0!(; tj/.Z4SB)SB/ 9$4)92#!1:*"#!**"Ao5G/>TT>.%;sdDi9XSy_1  -'+#(4 ")%3(2C%$,,1+<,I\3*)%<;wLL3'ZA- 5/ b:(% %1-!)90@7.#!5LK<IS_74632632632'>54.#"#4&#"#4&#"632#"&2#"&546264&"2654&#"Lsj.0Xj.*TM| =++26++'3S@2":SP/YV +@-GI0@JPe43JHd]?4LJoJL,-**OMHJg7D=n@4L&,$1D%",(6hbGLB=FnpeLJ23_KOgLlOK59Nr,#+,+&.'LYe#"'#"&=4&"#4&#"#4&#"632#"&54632>326323265332654.'2654&#" (5jAL2+M=]3>)M?$!,NA)H[)50807326323265332654.'72654&+#%2654&#"T'E_E5#+M=]3>)M?$!,NA)H[)50807326323265332654.'72654&#"2654'#"&'%2654&#"D(1Q@?Q9'+M=]3>)M?$!,NA)H[)5080732&#"32767#"'#"&'&54#"#4&#"#4&#"632#"&5463263263232653327654'2654&#"$9<%76732>7#".'#"&'&54#"#4&#"#4&#"632#"&5476326326323265332654.'2654&#"4D)Gsz%4%&^[|} /*!3)K=R LPN8*/N?+NT$9.;9/9E8;m^**L],N8(" '$-MC/Q # ##$yGCdeF?&4],&ET7Msa="$H3JQBUZ4@(,(3}IH^2.+!B{tH"" ,!%017H1"&547! $54>76732>7#".'#"&'&54#"#4&#"#4&#"632#"&5476326326323265332654.'72654&#"2654&#"(=A^Bz%4%&^[|} /*!3)K=R LPN8*/N?+NT$9.;9/9E8;m^**L],N8(" '$-MC/Q 4D-J$%-'# ##\;/,D@0K4],&ET7Msa="$H3JQBUZ4@(,(3}IH^2.+!B{tH"" $yGu%%#%.,!%017Ht/#"&547# $54>76732>7#".'#"&'&54#"#4&#"#4&#"632#"&5476326326323265332654.'72654&#"2654'#"&'2654&#"2BT>?S:Oz%4%&^[|} /*!3)K=R LPN8*/N?+NT$9.;9/9E8;m^**L],N8(" '$-MC/Q 4D2j5R92#3 # ##j P4.+!B{tH"" $yGz 0b9)& %1)$+Q,!%017JWco2#"'#"&'&54#"#4&#"#4&#"632#"&547632632632326533265#"&5462654&#"2654&#"G?=g^`)&V>R JRM7,!,M@+IP )5-<18;C9>k[,*L_(!K0<J7L?5BD!80:9>'&"#w!!"tVqJJQ@ gY1A(,'3lXFZ61QlNoKVJJGG5VV\E1":/HqYCZ69E(& 8(2.,!#1,"5MHmx%#"&547"#"&'#".54#"#4&#"#4&#"632#"&546326326323265332>5#"&54632'264&#"2654&"$2654&#"~13G*,G&N&V 2  JRM6-/M?,)?!(6,=9.@0"%%J-%@(#Z2B',&5'4>$ HZ6;IkPvJJGG%*6 3 ;/H&?A$CZ5;ErXz.@8*4*! .$11<Hq}%#"'532654'"&547&'#"&=4#"#4&#"#4&#"632#".54632632632326533265#"&54632'2654&#"2654&#"%2654&#"t6FbM;*"C*74P8X&'UIRJQM7+ 0L>-D_(6-<8/$6 xj[,*M_(!K0;L4LC1CC 9,>9/Ik%&!"%# K5DSA0<). '?0#' BJZ9tZ2B(,'4sQH[68K(=;oJJGG2UTaE2";3ErYCW8;EG6M. <*)609,#5Ju2#"&54>32.#"3265#"&'#"'&=4#"#4'&#"#4&#"632#"&5463263263232653325#"&5462654&#"2654&#"G$4 W_54.#"#4&#"#4&#"632#"&2'654&#"#54&#"#54&#"632#"&546326326%2654&#"2654&#"Lsj.0Xj.*TM| =++26++'3S@2":SP/YV +@-GI0@Jl4Q .&F7! :) $:1 l +!,.#+1^LC! 9FB,-**BOMHJg7D=n@4L&,$1D%",(6hbGLB=FnvRG2;*Z=;ѵ"*#-5)'/H3X]21./C,#+,+&.'LK<y74632632632'>54.#"#4&#"#4&#"632#"&2#"&5467&#"#54&#"#54&#"632#".5463263262654&'2654&#"264&#"Lsj.0Xj.*TM| =++26++'3S@2":SP/YV +@-GI0@JI6K<$$>) 2:/"90! (*",#)$-b>@.#?<"/k#C%,-**OMHJg7D=n@4L&,$1D%",(6hbGLB=Fnw>M'?<<>'J Ӷ(" 7'.:( 3+3Oe22/.#) I6H"+G,#+,+&.'-+"LYX<74632632632'>54.#"#4&#"#4&#"632#"&4632632632#"'732654'#"&5467&#"#54&#"#54&#"632#"&2654'2654&#"2654&"Lsj.0Xj.*TM| =++26++'3S@2":SP/YV +@-GI0@Ja@>/$<:$(=(>9:bD+# ;T= ;$&2:.6-:.$:0"'I)",#)3-X%0>,-**)OMHJg7D=n@4L&,$1D%",(6hbGLB=FnRd3300+! X5Mc [>K$D>6,4E,Ҷ("":G-9( 3M"(,*0$!"H,#+,+&.'",!M2>IU>32!4&#"#4&#"632#"&547632632354.#'"654&2654&#"!SH#O.&5SH4+C' ,=0F>6BLDFt*F)5]3AMR42F - ,,'!))[32::%!,)4+<,IW89IhQwKO/L 0bEoKF`-2"8< '10 $3.#7MA<HS]i>32##"&47!4&#"#4&#"632#"&547632632354.#'"654&264&#"%2654&#"!SHD02B O.&5SH4+C' ,=0F>6BLDFt*F)5]3AMR42F - ,####,'!))[32,3AD`::%!,)4+<,IW89IhQwKO/L 0bEoKC`/2"8< '1#2##2#0 $3.#7M<EP\my>32#"&547!4&#"#4&#"632#"&547632632354#'"654&2654&#"2654'#"&'%2654&#"!SH.9R~Q:O.&5SH4+C' ,=0F>6BLDFt*F)5]3AMRF - ,p  $(:4%27,'!))[32 H?[X>J"::%!,)4+<,IW89IhQwKO/L 0bEoK2"8< '1 X8*" '3!" (:0 $3.#7H\?I74632632#!"3!!"&463!2654.'#"#"&5467&#".2654'Jqe866Fvx_Kl! 9<6;7j;H'O6nZ;9W>*2MT .&!0=,#;We9S}a[J'OeNPLN4^ cE1@_D58]=B^25D\MW#!"3!!"&5463!2654&+532654&#"#"&5467&#".546326322654' )K 8&J>'4,FF,eH>'&5BF2lZ;8X?*(LV5+!".{U=6:_\q$:Vf9D %&H++(J5,.5:$..2 $7Q`MROL3YfD4R68)]k <39[=C[33L@J2#".4>32&#"32>54&#"#"&5467&#".5463262654'U|9*SZId&#eL_N1#V9EJ3W:l^%oPIAK<,.N^4+!47Z:*3K-1We3[RB~kB ""`Rr [{KstD?m" rV54.#"#"&5467&#".5463262'654&#"#54#"&546326'2654'El@!cdV~^yC'Y,2e8B#]: !0K-8oI4CI80+Q[4+!47a5/0 %  "S-1We3Ak{?stF17FB )*( k['SXD, [{+RAvB2632'654&#"#"&5467&#"#4&#"#"&5467&#"&546326322654' 2654'Pf/6CnCDD61Znc1=^76[<.!1MSO7-?/16Y:-+F34_!l[@15;k##;Xf:F;Wfh(2JKcEm BuU (p>_]Y^;p#@8 ?H%p?3M)X_Lhs>BnIPn9@>BlKTj>F_ju3!!"&5463!2>54&#"#"&5467&#"#4&#"#"&5467&#"&5463262>32632#!"%2>54'!2>54'&Z.B@0-Fe*n_nLIDM=- 4JSM9-?MIFI:-)Jc_!lybA09nYO36,8Aq 8]6% #-Xf1#-Wf2}I2,.6Pl:]s \zIsmJ>m#C5 ;L%p?JrnIKc4((2q']W;/5nIPn/J15lKPn0IFmx2#!"3!!"&5463!2>54&+532654&#"#"&5467&#"#4&#"#"&5467&#"&54632632>3262>54'!2>54',!JO4RP87J_'&Z.B@0_'D9/#")c>7nLIDM=- 4JSK;lMIFI;,)Jc_!l{`A0795ZP26,;R#-Xf2#-Wf2 ;'G)*JE./I2,-7=/%:,< -9\zIsmJ?l#C5 9NZzJrnI>m# {K~?Lb4('3u15mJPn/J15lKPn0IH^gq74632632632632#".547632&#"32654&#"#"&5467&#"#4&#"#"&5467&#"&2654'2654'Hwa>4:Bh7$~%48BqEDBI/]A9\M0"U!]}nX&nOJ=P<-SE9&lI2=O;,,H13_!jV3WfK+3Wf6\ZZRPr"#+d [{HwrG;o$ u 9K[y,T?rG=m$ 88FGXM5mKRn,NM5mKQo/KH<"2'654&#"#54#"&5463264632632632632#".54632.#"32654.#"#"&5467&#"#4&#"#".5467&#"&2654'!2654'$  #dx`>4:Bj5$~&37M9_<*ccAL4]wE'Y,BU=B1[:+nTEBK<-SF8'lTE.C;,+Hd_!jG-1Wf4.0Wf2' ,: & n^ZZ3Pe`+lm 2!7FB 0#'0qqK ]yNqvC>m# u 9K[yNq@Q(?l# nHHVR0mKRn.LS/mKRn,NJF\gq2# 4732>54'&#"#".547&#"#4&#"#"&5467&#"&54632632>3262>54'!2654'0`w:es\%R:~ؖd[521R _L;+<ZlL85]M<:B.,!?UU!_gX6028]0D,8$3G' LV)V*&KV)jYU4wujhPz]1,FpKV@@\zPpEQ%N r 4OZxOqzA6o' s@GXZV&0w15kHNl'PT*kHNl+LJep{2#"&547# 4732>54'&#"#".547&#"#4&#"#"&5467&#"&54632632>3262>54'264&#"2654'0`wc)7A.1@\%R:~ؖd[521R _L;+<ZlL85]M<:B.,!?UU!_gX6028]0D,8$3G' LV)%%,&m*&KV)j[?*1@A.4wujhPz]1,FpKV@@\zPpEQ%N r 4OZxOqzA6o' s@GXZV&0w15kHNl'P'6'"'T*kHNl+LJep{2#"&547# 4732>54'&#"#".547&#"#4&#"#"&5467&#"&54632632>3262>54'2654&#"2654'#"&'2654'0`wr0AU=44HkwCxd6S#03&F;We.Y<?mV| \za\X_>m# vQ;c$wB_afJ\b4PLР8S,?BmKSm>HD@KW`2#"&547!5654&#"#"&5467&#".546326323546"!54.2654&'#$2654'"BB(AdB!=RbO&n^86Y;,.RZ2-!48qi>44HkwCxd6S#034"0F;We.Y<-1DE0/?mV| \za\X_>m# vQ;c$wB_afJ\b4PLР8S,#!!?BmKSm>H@KWhq2#"&547!5654&#"#"&5467&#".546326323546"!54.2654&#"2654'#"&'$2654'"BB($/R~Q1bRbO&n^86Y;,.RZ2-!48qi>44HkwCxd6S#03  #%)94% 094F;We.Y<C>\X>D"?mV| \za\X_>m# vQ;c$wB_afJ\b4PLР8S,X7+" '3& +7?BmKSm>MOV`2#".54>32&#"3265!5>54&#"#"&5467&#"&5463263235454#"%2654'm-MV2AK3VZ'YA!(O,TI7c_)*gK$oUD@L<,,Ge_!jx`>54Fa$S 0.We5rd9R*% "Xbe;N \zOptE?k$ nHFW^]7R4WǠǗS/lLQo1IL9B2'654&#"#4&#"#"&5467&#"&5463263262654'HJtKD+hU3&2SZ8o/08X;- F56_!kZ:67AhI:bF;WeńfI~ ?^V.$9K ]z3M)\\>n"@?M{?Mf KNo>BoIOp>HVen%2#"/3254./"&'&5463232654&#"#4&#"#"&5467&#"&54632632>32#"&#"3262654'+655KP/ V!d! -33)D:B;aSX=)&n/05Z;,$Hi_ kW;7=CuPg=Z`+%:)MmFHcDmw%2#!"3!!"&5463!2654&#"#"5463232654&#"#54.#"#"&5467&#".54632632632#"&#"3262654'(7BP " |<7<7?6)<Z;":>E#A2S-,+#mY:9X=,"Db5+ 1;zTE/?>kSE|Y12&) 9(M $#D]14FeF|%#!"3!!"&5463!254+532654&+"#"&5463232654.#"#54.#"#"&5467&#".54632632>32#"&#"326322654'> @l" {<6F, 41**! 4?2,(48,&F6S-,+#mY:9X>+ Fb4+ 1mS&u8YQ,# C D32$3#^gN($>%% !S29]>D]14H>`jt%2#"&54>32&#"32654&#"&54>32654&#"#4&#"#"&5467&#"&54632632632#"&#"%32654'JY "7bAG,>1^M3(M$#S"[^IP':1,(C0H]SOA0$nUB?N9.-Id_ ky`?49T;h>Hu\M.&5(.1XdQF,2$-"!#K\{OpsF;l' rDGW]!5'ZO>d. '1IS/lLOM~+4=F74632632632!54&#"#"&5467&#"&%354#'"654&2654'Mph;85?pHM~-iD%!o/16X<,!$P[^!jEZFA.(F;WeaZZMb[{3M)Y^?m"{Sy>M>qP1]T!7?BoISm>MD6?HS\74632632632##"&547!54&#"#"&5467&#"&%354#'"654&264&'#$2654'Mph;85?pHM~ C12B!iD%!o/16X<,!$P[^!jEZFA.(|4! F;WeaZZ,3BE0/Mb[{3M)Y^?m"{Sy>M>qP1]T!7#0 ?BoISm>M6?HSdm74632632632##"&547#54&#"#"&5467&#"&%354#'"654&264&#"2654'#"&'$2654'Mph;85?pHM~(.R>?Q1iD%!o/16X<,!$P[^!jEZFA.(e!!&)94% 09F;WeaZZC@ZX>D"Mb[{3M)Y^?m"{Sy>M>qP1]T!7 *X8*" '3& +7?BoISm>M~DOXb2#"&54>32&#"32765!54&#"#"&5467&#"&546326326354'&#'"654&2654'~tpH3MD^G5I'bX3q$$h`V%oUD@L<,,Ge_!jx`>57ClF6PO(+NF?/)0.We5`%(!)(mRX \zOptE?k$ nHFW^XXEqIx491V[!7S/lLQo1IJH6@2#"&547327654&#"#"&5467&#"&5463262654'nN.L˯[WoK&n-,<7Z=,(Hdd&jW=7o!rR=Ll u@BnIJu?;JAKV#"&547#"&547327654&#"#"&5467&#"&54632632%2654'2654&#"E*8=32?UpN.L˯[WoK&n-,<7Z=,(Hdd&jW=7o!rR=Ll x0@BnIJu?;%'&6'J~BL]o#"&547#"&547327654&#"#"&5467&#"&54632632%2654'2654&#"#2654'#"&'61>U=?S:ON.L˯[WoK&n-,<7Z=,(Hdd&jW=7o!rR=Ll x?@BnIJu?; ]9)$%1,!+8L -Wak74632632'654.#"#"&5467&#"&#"&=4&#"#"&5463232654.'%2654'2654'L[:82?uD62V'\@.A/07Y9/% Gd^!kR&. K-*B-"N9"-4e@3K%6 & $;We;3"EjdDl Cp5aH 'p@2M)Z]LT@2KG=:0+AAT36K6TZAA*1)=2+5 Y>BnIQm=<+A8EOL  -_ix74632632'654.#"#"&5467&#"&#"&547&=4&#"#"&5463232654.'%2654'2654&'+'2654'L[:82?xD62V'\@.A/07Y9/% Gd^!kR&. .LT@2O' C.BB.3!K0+AAT36K6TZAA*1)=2+5 Y>BnIQm=<$! %+A8EOL -_iw74632632'654.#"#"&5467&#"&"&547&=4&#"#"&5463232654.'72654'2654'##"'2654'#"&547'2654'L[:82?uD62V'\@.A/07Y9/% Gd^!kz(GfI<8-"N9"-4e@3K%6 & &. $;We;$ 0%5,*2"EjdDl Cp5aH 'p@2M)Z]L <%3HF5E#!I0+AAT36K6TZAA*1)=2+5 @2W9>BnIQm=<:  i-# ++ (!/+A8EOFIS%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323262654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9C#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmj?BmKMs>;FDS^h%4.'7"&547.=4&#"#4&#"#"&5467&#"&547632632>323262654&#"%2654'1# ~B CbC2E@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9C`4"&'A#;W`8*:6Iu@02CC2& XLMSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAm#  ?BmKMs>;FT`pz%4.'7#"&547.=4&#"#4&#"#"&5467&#"&547632632>323262654&'#2654'#"&'%2654'1# ~++&/Q@?Q5,3@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Cr'T82' 0#;W`8*:6I;H`j%4&'7#".54632&#"3265#"&'54&#"#4&#"#"&547&#"&54632632>323262654'H2 CQBJ2PtA9a+SH6+]1S<'7CSB?6 5O[yPsuHyU qEGU\Z$6)S9B6-ooM5mKNr2HH"2'654&#"#54#"&54632672654'7#".54>32.#"32654'#"&=4'&#"#4&#"#"&5467&#"&54632632>32$2654'%    #6Dp B< 1L|P*bT0IDyC'[,?="5/v/Q?c&&6DSF8'lRGAK;,-Ic_!jx`>4:Bj5S.56 71\0W`' , :  ' eN<l23=ifH,9(#4 B  )"t(g?QX0>7 9K[yMvyD>o! mIGV^Z(2*V<<,[S/mKPp+F T_i2!535464.'7#"&=4&#"#4&#"#"&5467&#"&547632632>32326%"!54.2654'S~ؒv1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Ch7X#//>#;W`8om"[c*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmRLι2J&?BmKMs>;FD_jt~2##"&547!535464.'7#"&=4&#"#4&#"#"&5467&#"&547632632>32326%"!54.2654'#%2654'S~D11Cv1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Ch7X#//3#//H#;W`8om*2CD1)"[c*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmRLι2J&#1 1?BmKMs>;F_jv2##"&547!535464.'7#"&=4&#"#4&#"#"&5467&#"&547632632>32326%"!54.2654&#"'327654'#"&'%2654'S~-Q@?Q0v1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Ch7X#// ! >:(,4&1#;W`8om#A@ZX>C%"[c*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmRLι2J&  +7'" '3%?BmKMs>;F'qz2##".54>32&#"3265!535464.'7#"&=4&#"#4&#"#"&5467&#"&547632632>32326%"!54&2654'&E@&xDK2V_+^G5H'd^/qPv1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Ch7XU"#;W`8/Z?h & d\"[c*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmRLιaR?BmKMs>;FImw%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323262'654&#"#54&#"&546326%2654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9CU7G3,>-) 9'(1KVDB9$#I#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmZ@3N(\0@ѵ%"B/[%0f:a10K?BmKMs>;FIoy%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323262#"&547&#"#54&#".5463262654&'2654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9CuJS>$(8D,9")2M3%C?6$.V-#BA#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmnE?=A9P8 Ѵ(!F1X"V%:a0/#(G6C((?BmKMs>;FXI%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323264632632#"'732654'#"&5467&#"#54&#"&!264'2654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9CO45&*=&E=8\N'% ?K< =$%3;.:1:""9",Zx"%3!n#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmDW0.)"T1Elg;R "FA8/.H, ˵(!@7!G,)Z1H$O?BmKMs>;F T`hr4>32!4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>3232654&'74&#"62654'6&1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9C'5*4=Am0#;W`8$07 x"*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAm@gDE.:4TN?BmKMs>;F I]iq~%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323264>32##"&47#754&'74&#"62654&'#2654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9C;FI^ow%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>323264>32##"&547#754.'&'74&#"62654&+"2654'#"&5472654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9C;/*3I23I2b '*=Am $6(+28#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAm.9<x$<5FH3=#g&3 .. TNP-#,*  (#-?BmKMs>;F,Ilw%4.'7#"&=4&#"#4&#"#"&5467&#"&547632632>32326"3276=#547632#"&4632.754'&#7"654&%2654'1# ~aS;]@(-HSI5'l^86Y;,$He_!lA@Z982Ja>N2C018#9Co6O3/&8\)UQ.8 .O:,<4$uL#;W`8*:6I_U\MSED4 9K[ya\X_?m"{Q{@NgDDZ)321ZEMAmE]&G((<  ^bC('"+<;QF]h#".5473267#"&=4&#"#4&#"#"&5467&#"&54632632>323254'2>54'~59sԅR_P323254'72654&"%2>54'(6B/1?ԅR_P323254'72654&#"2654'#"&'2>54'0=V=54#"2654'&#"T^l!"4-G T%@BϘ!##sc,1!"C1* j6M(bǙΜ'"%Y" ,>2##"&547!3354>54#"2654&#"2654'#"&'T^l)-T>;T/)T%@BϘ" $+84&#.9sc&@@YRCD&j6M(bǙΊW:'" )1+)8M 4=2!335462'654&#"#54&#"&546326"!54& RqTv=A -%?-)"8&)0 UF?9$%9X$\omj\b(`:/>)[.Bѵ"%A0 '$ /g=^10SKι]VM 3<G2!335462#"&547&#"#54&#".546326"!54&2654&' RqTvMQ9($=D-8")2!+4%E=4'.$9X$\#B(omj\b(nE;A<>P8 Ѵ'"F1GT'>]0/SKι]VX$'G6C('MX ENW2!335464632632#"'732654'#"&5467&#"#54&#"&"!54&264' RqTvO45&*=&E=8\N'% =L; <$%3<,"%3!omj\bDW0.)"R3Dmf32!"!54&54'&'74&#"6 RqTv32##"&547#"!54&54'&'74&#"62654&'# RqTvJ^2!335464>32#"&547#"!54&54'&'74&#"62654&+"2654'#"&547 RqTv3HF5=#SKι]VQg@$% -:= #TPk-# ++ )#-M, /8BK2!33546"32>=#547632#"&54632."!54&54&#7"654& RqTv5N"+/'7BV.PQ.F.:9X$\R20,R)tomj\b%\& MJ  SKι]VTbR@"+EF5?tS[$M=4>%#"&547&/32654&+532654&#"&547632264&"!B12B-83==,*;7<4C43(ED\P^LPk$#2$#6#1CD0% 7.!9,.!378pJe pNCCO1?K;"4!!#M2?P%"&547&/32654&+532654&#"&5476322654&+2654'#"&'PJLQ~Q3 -83==,*;7<4C43(ED\P^ &*84%!/9KH*!X?\X>F(7.!9,.!378pJe pNCCO1?X:(" '3%+7MF;%#"&54632&#"32654&+532654&#"&54>32{A:.=99k@M( 8[@!>ZHB,,4@9?I]( 1R4c[:W1-G* - & $HD6S4F+%=xfLc oO"DI6#Z7.MHU@c%#".54>32.#"32654&+532654.#"&546322'654&#"#4654#"&546326AX_`>B**ABq@%U)4X:;h~aQ664X4=!]l#0!|$IK/T"   ZKOP 1!"4 C  ,'( kPX4;5%/{cLb rL}<)8F& D +  # M@=%#"/32654&+532654&+532654&#"&54>32));E&I-%L*>8>44<:7;8855@,C32',HI&Dd+)..& 3'1?" !-"61.1$.78rAn xFKn9E76 D%!?MDO%"&547&/32654&+532654&+532654&#"&54>322654&#"))/1BdA2%L*>8>44<:7;8855@,C32',HI&Dd+)..&d1$#! 31"?0CD/)?" !-"61.1$.78rAn xFKn9E76 D%!?###MEEP`%#"&547&/32654&+532654&+532654&#"&54>322654&#"2654'#"&'))=AR?@Q3%L*>8>44<:7;8855@,C32',HI&Dd+)..&.!T84% 0 39%O>]X>D) ?" !-"61.1$.78rAn xFKn9E76 D%!?w9)" (2& ,JB2#"&54632&#"2>54#53254&#"53254&"&546%;eA'Q`.IJ&A|>?E%$8pKJ@53KM :X?!'pB1F$ &dB': -#$!"4(N&W4""P$**FH'>q uJxMKn%#"&54>32.#"32654&+53254.'&+5254&#"&54>322'654#"#4654#"&546326"8P]z:f"62Y2 D )FH+UjgG03#8J&*>"' .N28r  3(figA6#4 B !*(,'jKEH*W "P)%(CJ*An zE$EI6#?4F2" %"/  ! HM#"'#"&54>54+532654&#"&4>32#"32>5332654&'+< vLY:s@5N090S++(2&=e(,GJ%7654++532654&#"&4>32"32>53327654&'264&+"+< G'B30CI1s@5N*426 ++(2&?21(,GJ%7654++532654&#"&4>32"32>53327654&'2654&#"2654'#"&'+< \ZQ~Q0=&s@5N*426 ++(2&?21(,GJ%C(3!-(("" !,(!(89pJe vn:=30 %(" (B88/.U@i X:(" '3%(:Hs#"&5432&#"3267#"'#"&54>767654+532654&#"&54>3232>5332654&'!81  &$*.G^@3Duo9]Y:}35N+ S++)2&@b(*EL'32.#"3265#"'#"&54672654#532654&#"&54632#327653327654'2'654&#"#54#"&546326RG2KPIH00IDyC'Y,1ff1S0X;z51R01K3+(3%HZ(}e8X '025NM6 S6-C%&x%   #7lsV71#4 B )T)",L(&%+& #,'!(`Je vIv:6+'.!@"B1?66F3' ,:  & HOs#"'#"&54>54.+532654&#"&4>32"32>5332654&'2'654&#"#54&#"&546326+< vLY:s@5N090++(2&=e(,GJ%]10HNu#"'#"&54>54+532654&#"&4>32"32>5332654&'2"&547&#"#54&#".5463262654&'+< vLY:s@5N090S++(2&?21(,GJ%P8 Ѵ'"G0'3 V%>]0/$'$F6C)&HXN#"'#"&54>54&+532654&#"&4>32"32>5332654&'4632632#"'732654'#"&5467&#"#54&#".264'+< vLY:s@5N090*)++(2&=e(,GJ%54&+532654&#"&4>32"32>5332654&'4>32!754&#74#"6+< vLY:s@5N090&-++(2&=e(,GJ%54+532654&#"&4>32"32>5332654&'4>32##"&547#754&'74&#"62654&'#+< vLY:s@5N090S++(2&=e(,GJ%54&+532654&#"&4>32"32>5332654&'4>32#"&547#754&#74&#"62654&+"2654'#"&547+< vLY:s@5N090',++(2&=e(,GJ%3HF5=#gN= -!L8#TPP-# ++ (#-H,Mo|#"'#"&54>54+532654&#"&4>32"32>5332654&'"32>5#54632#"&54632.754&#7"654&+< vLY:s@5N090S++(2&=e(,GJ%"4@tS[$JD ^! 473267#"'#"&5467654+532654&#"&54>3232>5332>54&'?:2VP{-}=y:\/JZ+ +"5/D#)2^?0YB30I_*,S8.%7 0,(Dx}iq\Q= JV(0 -6#%#!.IG!XW fY.XS234A!.$!& &B0@#77;gJ"mw#"&547# 473267#"'#"&5467654+532654&#"&54>3232>5332>54&'7264&"*8B.0A:{;VP{-}=y:\/JZ+ +"5/D#)2^?0YB30I_*,S8.%7 0,?:''4)&J@+.BA/}iq\Q= JV(0 -6#%#!.IG!XW fY.XS234A!.$!& &B0@#77;g!(D%8&''J!kv#"&547# 473267#"'#"&5467654+532654&#"&54>3232>5332>54&'72654&#"2654'#"&'3BT=@SLnVP{-}=y:\/JZ+ +"5/D#)2^?0YB30I_*,S8.%7 0,?:. D+82#!19\ N6?SV54&+532654&#"&547632/9tT$R{1F$F555,D:@Uc,(*>=yR344 V;fs̩}m,-7T/C)'?VlC EysKL-,:(MJ@J%#"&547#"&54732>54&+532654&#"&547632264&#"/9N"+B/.BT$R{1F$F555,D:@Uc,(*>=yR344D'$%% V;m: :%0A@0!̩}m,-7T/C)'?VlC EysKL-,:(M%8%%6'JR>K]#"&547.54732>54&+532654&#"&5476322654&'2654'#"&'2%/R?>UT$R{1F$F555,D:@Uc,(*>=yR344'/9 &+82$!09F-=VV=.*˥}m,-7T/C)'?VlC EysKL-,:(M V;q Z9)$ %1,! ):MD0:%"&547&'#"'&54673265332654&'72654&".AdBJ26QK9:;O#,.K/*;S9#1U/@=C4"#2$& 7,1DE0 BLBBc;' p:_R3%9=5[\1l !zHu#""M0<M%"&547&'#"'&54673265332654&'72654&#"2654'#"&')2Q~Q08&6QK9:;O#,.K/*;S9#1U/@=C&*84% 09 C/?\X>E&3LBBc;' p:_R3%9=5[\1l !zH!X:(" '3&+7JE%4&'7#"&54>32&#"32>5#"'#"&54>73265332672DB6]k>M{+E;a<6QjI,*MJ-7NW77OJv =,".0)+#8S*(3];h2udQ&3"%1aC:LL~g7C>n>2I%)%D4>cMIm#".54632.#"326767#"'#"&54673265332>54&'2'654&#"#54&#"&546326`-C!JsGE.]yC'X.@=59bn$5 _@U;7PUiK?#--C7(=S+1,@=2n&  # RVe3pr07FB  )( G9S:JLLWMz l>Pa2&9+G>P)Ab) ,:  ' M'O#"'#"'&54673265332654&'2'654&#"#54&#"&546326`=CuIV:6QK9:;O#,.K/*;S9#1U/@=A -%?-)"8&)0 UF?9$%!zHpyLLBBc;' p:_R3%9=5[\1l C`:/>)[.Bѵ"%A0 '$ /g=^10M'NY#"'#"'&54673265332654&'2#"&547&#"#54&#".5463262654&'`=CuIV:6QK9:;O#,.K/*;S9#1U/@MQ9($=D-8")2!+4%E=4'.l#B(!zHpyLLBBc;' p:_R3%9=5[\1l CnE;A<>P8 Ѵ'"F1GT'>]0/$'G6C('MX'`i#"'#"'&54673265332654&'4632632#"'732654'#"&5467&#"#54&#"&!264'`=CuIV:6QK9:;O#,.K/*;S9#1U/@eO45&*=&E=8\N'% =L; <$%3<,F#"'#"'&54673265332654&'4>32!754'&'74&#"6`=CuIV:6QK9:;O#,.K/*;S9#1U/@32##"&547#754&'74&#"62654&'#`=CuIV:6QK9:;O#,.K/*;S9#1U/@32##"&547#754&'74&#"62654&#"2654'#"&547`=CuIV:6QK9:;O#,.K/*;S9#1U/@=#547632#"&54632.754&#7"654&`=CuIV:6QK9:;O#,.K/*;S9#1U/@ 5N"+/'7BV.PQ.F.O20,R)t!zHpyLLBBc;' p:_R3%9=5[\1l %\& MJ ^bR@"+EF5?tS[$FHp:%2654'&'7#"&5473267#"'#".546732653AO6|/Kkm>K"ErZw1&DY13S>['MC,gE<":R22`I=98mXS5нh[r_O=GLJJf6H@Jj'&D@2FpBM#"&547#"&5473267#"'#".54673265332654'&'72654&#"*8@00BRcK"ErZw1&DY13S>['MC,gE<":R2 AO6|8'(#Q@VFB/нh[r_O=GLJJf6H@Jj'&D@2`I=98m'')F~pCUg#"&547#"&5473267#"'#".54673265332654'&'72654&#"#"2654'#"&'2AU=>T9CK"ErZw1&DY13S>['MC,gE<":R2 AO6|  &*92#39` O5>UW<# нh[r_O=GLJJf6H@Jj'&D@2`I=98m Z:(! %1)$+8J%'22"&5467&#"#4&#".54763262654&'8h\m[=-0*IS5!@L=6>G65XT7H!7,(g?ŸpaZZ^>o#'-=4kL>e yI^EEIIs9<1o"Ti==JbAL74632632#"'732654&'#"&5467.#"#4&#".2654'JxMS8>^)9:\UGFs=5#,^v4-[74P]EJ,4ES5!:S7.): ; 4:P5iIG1$MhQQ*^;T +=jbRJLf!%0,=4gO=N?D3@FH(M878M=2#".54732&'#"32>54&#"#4&#".546326#Cc/K 9V2(YJQK&5AqT,Pp0\R%2S6!7U?6?GwNQ9;ZPk!+)D)$%]Nn+"=4fT>e!wHgLHO$Cf74632632#".54632.#"327654&'&#"#4&#".2'654&#"#54#"&546326OmZV:DW- ff@H0]wE'X.1f7>NO+,%5&IR4/'9 0#9F$  #bLJ8HF;WffJJEEmKEmUY}a\Y^@m!+'=3dS>g yZ?BlLRn=FeLV2#!"3!!"&5463!2>54&#"#"&5467&#"#54&#".5463263262654'Fg4lZ@8291K0E#bXmZ::V<,/.FS5!/T@6=IpJS7CW336N$:Wg9-HI&[?6!';$:;Q~ MgMQNL7Z""2+LJ9[iDYh=;39]=C]/7FeZd#!"3!!"&5463!2654&+532654&#"#"&5467&#"#54&#".546326326322654'!=FHBF82:0G8)Tn!mZ::V<,/.FS5!/T9=2@pJS7CW333G:Y3 }$:Wg93%*@,H?6!&<3 0,$?> MgMQNL7Z""2+LJ5^ID#Yh=;($39]=C]/7HQZ2#"&54>32&#"32654&#"#"&5467&#"#4&#".54763263262654'Tx7X$Bc9SYZ#YK+X5IV)ym`%n^86X;-4/*S4!6X?7>H;:NR9:Y*C4oF;WfZPo!+) % q Y}a\Y^@m! &=3dS>g yKdBBJHu?BlLRn=H&Tv2#".54632.#"32654.#"#"&5467&#"#4&#".546326322'654&#"#54&"&54632'2654'ʌnA!AK3~^yC(Y-1333D"3^;$n?*EI;-3/*S'.AM@6=IjYT7:Y+BC,% "M2,Wf2Cl}A 2!7FB *(2rpJ Z|;?'pG@m! &+EtCBcwNYJH&   :   & R/lLPp0IJC U%2654'%4632632632#".5473 4.#"#"&5467&#"#4&#".$:Vh:jYQ;kVybc7Z POm+]<*lOEGI<-,0,R(.3Z@5kj$:Vh:<&&$%8>,+E@07?]Uznai[U*,:lLZ|MpnI@n  (,DbUAdyMZJJl=DnJTl9@&$&%JT^m~"&547#".5473 4.#"#"&5467&#"#4&#".54632632632%2654'2654&#"#2654'#"&'43ATzVqbc7Z POm+]<*lOEGI<-,0,R(.3Z@5kj$:Vh:  R:2$!0J N7=TU< "?]Uznai[U*,:lLZ|MpnI@n  (,DbUAdyMZJJl!=DnJTl9@ Z9)$ &0,!)H4=2!5>54.#"#4&#".5476326323546"!54& "BB(O-0 6%'2S4!6X?7>H;:NR99NSj[xd6S"`.Y<,{82/,$=3dS>g yKdBBJJ[tP\b4PLРicHB?HR2##"&547!5>54.#"#4&#".5476326323546"!54&264&#" "BB(D02B -0 6%'2S4!6X?7>H;:NR99NSj[xd6S"`0##".Y<.3AD0.,{82/,$=3dS>g yKdBBJJ[tP\b4PLРic#2#$H?HTe2##"&547!5>54.#"#4&#".5476326323546"!54&2654&#"2654'#"&' "BB(.Q@?Q10-0 6%'2S4!6X?7>H;:NR99NSj[xd6S"`! $(:4% 07.YE#,{82/,$=3dS>g yKdBBJJ[tP\b4PLРic X8*" %5& ';HHO2#".4>32&#"325!5>54&#"#4&#"&547632632354654#"$_kF=AK21IBRG"2D'VH7}':G;3+S+$?Uv46Xg%)^Tk]n旋sc7,*"%i6Ik1-CjGqQk|ZAHHH^kPWebǗHKnw462#"&54632.#"32765!5>54.#"#4&#".54763263232'654&#"#54&#"&546326"!54&Exɉ]{~^yC' [/8_10H;:NR99NSj[q%   "~6S"`\bWH/7FB $,')NMs,{82/,$=3dS>g yKdBBJJ[tP&  ::   & PLРicH<2#"/32654&+532654&#"#4&#".54>3260CeCI"74',&76<%(60A)-BS4 @O=9*: (\@P::H:7$$G%7 :,("8,*+%*$;4jK?g?D28gJJHH;AL2"&547/32654&+532654&#"#4&#".54>3262654&#"0CeCI:8D`C,&76<%(60A)-BS4 @O=9*: (\@P::%###H:7$$GA&!C2BB2) :,("8,*+%*$;4jK?g?D28gJJH""!4"HBM]2"&547"&/32654&+532654&#"#4&#".54>3262654&#"2654'#"&'0CeCIBPR~Q4,&76<%(60A)-BS4 @O=9*: (\@P::e/!T74%2H:7$$% Z?]X?G':,("8,*+%*$;4jK?g?D28gJJHw8) '3!" (HM%#"&54>32&#"32654&+532654.#"#4&#".54>32>326,9EN-H?p<&2S/LD0r>J""B;*)/HS3!@O?7*: ']@Q9\0Ml'C5, )  fb2F4B( . +%=3jL@f?D27gKJ$$NALHDD%#".546732654+53254&#"#4&#".54632632"*:F{yU5,0&Z؝11p5E.DR4 @O8.>HkbZ(1j8M$/I1jp6UZIt9`~@Ur6k(=*$<4lK?KzL]JF0.0IHP^#"&547#".546732654+53254&#"#4&#".546326322654&+A 'A.0A J^F{yU5,0&Z؝11p5E.DR4 @O8.>HkbZ(1j8M$/%*:'' $x 9%.BA/ 6UZIt9`~@Ur6k(=*$<4lK?KzL]JF0.0II1b'&$'HfO\m"&547#".546732654+53254&#"#4&#".546326322654&#"2654'"&'0'/UxW3=F{yU5,0&Z؝11p5E.DR4 @O8.>HkbZ(1j8M$/%*:.  D):2H-:F.?ST>+'6UZIt9`~@Ur6k(=*$<4lK?KzL]JF0.0II1n%x9($ %1.*9HG#"'#"&=4'&#"#4&#".54>326323265332654&'h*: iYS:/Z>[ /(I=9@E3^LJNEU]+,3!=3lK=f?D27gKJH_OiM:6B<5gJ@iHDQ\%#"&547&'#"&=4'&#"#4&#".54>326323265332654&'72654&#"+D11CG2/Z>[ /(I=9*: 3###% <$2CD1  @JNEU]+,3!=3lK=f?D27gKJH_OiM:6B<5gJ@i@E3q#"#HQ]n#"&547&'#"&=4'&#"#4&#".54>326323265332654&'2654&#"2654'#"&'h*: 2)YQA?P06&/Z>[ /(I=9$,73%!/9@E3Ah`AZW?D'2JNEU]+,3!=3lK=f?D27gKJH_OiM:6B<5gJ@i X9)" (2% )9HX%4&'7#".4>32&#"3265#"'#"&'&54#"#4&#".54763263232653326F0Y`bYoM?]"^V*4ec*1U>St*6S+$?Uv=I46Xg%)bFY,<'7R &"H\\td9,&(0PZU8-N2%M8W:%$1N,5E.!vbMC5)J<]8#!-M"!0$%LQzT7 (F+@;Lkw#"&547"#".5473267#"'#"&=4'&#"#4&#"&54632632326533254.'72654&#"+6970A3AXtd9,&(0PZU1-N2%M8W'$1N,5E.!vbMC5)J<]8#!-M"!0$"9>&! '%K?,$LB. (F+@;%L&-%%Lju#"&547#".54732>7#"'#"&=4'&#"#4&#"&54632632326533254.'72654&#"2654'#"&'s/@V<=Uktd9,&(0PZUOv_-N2%M8W'$1N,5E.!vbMC5)J<]8#!-M"!0$"9>6&+82#!19W N4=UV<$ (F+@;%L 0Z9)" %1-! (:H42'654&#"#4&#"#4&#".546326326?TkNG'jH?&3SH-&4S4 AN@6*; g]S95][38ˆ_K}=Kh-#;:)";4iK@g?D4ZOMHHHF6A74632632632"&5467&#"#4&#"#4&#".2654&'HmVS:6\[3FX_HI]m[=,/*ISI,'3S3!@O>6*; \"6+(h?aNNJJNMoc_Z_>o#'-;;)#=3jL?g?E37>1n"Pl==HaKU74632632632#"'7327654&'#"&5467&#"#4&#"#4&#".3254'HiZS:6\[3CU6*;  1W7S^NNJJC0QhNO*ML]3[.BOuLNHeE.$;;)#=3jL?g?E495wH> JHN2#".54>32&#"32>54.#"#4&#"#4&#".5476326326?XmKeAJ10IBe<* S,TZ&Kg8 8&*4S?3*3S+$?UB2?I46Xg'0Wn+(r]p: 0b}X'JH,-#3B(#-CjG9j *zEZAHLLHHFFB2!".547327654.#"#4&#"#4.#".54632632^lɖN,*,E{vuE2#;SA1$9S &CQC1:MjXg'0Vn,]n0fxa_USnX&RR(L=%+3B#(/,lE=h'yIYLLHFO[#"&547#".547327654.#"#4&#"#4.#".54632632622654&#"%+9>2.CyɖN,*,E{vuE2#;SA1$9S &CQC1:MjXg'0Vn,(l(%$&:@+*F@020fxa_USnX&RR(L=%+3B#(/,lE=h'yIYLLHH]%'*$FNYj"&547#".547327654.#"#4&#"#4.#".54632632622654&#"2654'"&'5DUzUmɖN,*,E{vuE2#;SA1$9S &CQC1:MjXg'0Vn,(l 4&):3D0:K Q7g?E4]TV^.1L4d-"6HB2&3;F2##"&547!4&#".54632654'&#4&#"6264&#"OkrD02B3!@N<8*: lYU6EP"0F62W)#ih%%"$Ē{.2BD0.=3kK>g?E4]TV^.1L4d-"6#2#$"H6&3;FV2##"&547#4&#".54632654'&#4&#"62654&"2654'#"&'Okr$.R?@Q23!@N<8*: lYU6EP"0F62W)#iA!&"P94% 0Ē{!C?[X>E#=3kK>g?E4]TV^.1L4d-"6X8*# '3& +M04?G746323632#".54>32&#"326=!4&#".%354#4&#"6MmUl!1vAN54OGXJ 6H&ea*l[_,#?Uu:MU:%'FH*"i]RRf!!Tj0@jGmU(y'GG&$1<%3JF09A74>323632# 467!26=!4.#"&%354#4&#"6,M0m"4r44>:C'/*Z՜c &CQC1TIUFG+"i&ME+RRHIx=EFj:av5G/,lE=e `BoN0=$4J:GOZ74>323632#"&547# 467!26=!4.#"&%354'&'&#4&#"62654&#",M0m"4r44A%B.0A?L'/*Z՜c &CQC1TIU,;FG+"i4:%(+&ME+RRHIxT* 7"0BB/ Fj:av5G/,lE=e `BoNZA +0=$44$#! Ja9BJUg74>323632"&547# 467!26=!4.#"&%354#4&#"62654&"2654'#"&',M0m"4r44N",TzV7'/*Z՜c &CQC1TIUFG+"i',%+82$!0:&ME+RRHIxZ,E,=TU<1%Fj:av5G/,lE=e `BoN0=$4HZ9)$ %1-!)9HFr/2#"'&54732654&#"#4&#"&546326YrorB$:ŠXD'1T3!3\vvLS99£nloxnYgW,$?1cN2BeJJHr;I2#"&547#"'&54732654&#"#4&#"&546326264&#"Yrb)7A/0BQdorB$:ŠXD'1T3!3\vvLS99'' %£na>*2@B/loxnYgW,$?1cN2BeJJ@%8& 'H|r:IZ2"&547#"'&54732654&#"#4&#"&5463262654&#"2654'#"&'Yrt1@VyU>=orB$:ŠXD'1T3!3\vvLS99e   R92#3£n] N4?TV=# loxnYgW,$?1cN2BeJJH  Z:(% %1)$+M[8P\#"&547&#"#4&#".54632632654&#"'>322'654&#".54672>54'-0F19DsG#:S('BRu6PjXg&0V@.4 3!J.27Y8R8-B;'+:H (4\( ) 8)>%#x9.YEY8n#)(GlDoT+vEYJJ"(&$-51)LJ5Q M56:3VN1KQJ4:h;"n7$BM[8Zfq#"&547&#"#4&#".54632632654&#"'>322"&547'654&#".546322>54'264&#"-0F19DsG#:S('BRu6PjXg&0V@.4 3!J.27*,;2B;'+:H (4\:8R=7 ) 8)>%d!!#x9.YEY8n#)(GlDoT+vEYJJ"(&$-51)<+,;;,9 M56:3VN1KQLJR0b4:h;"n7$B !0"" M[8Zfq#"&547&#"#4&#".54632632654&#"'>322"&547'654&#".546322>54'2654&#"2654'#"&547'-0F19DsG#:S('BRu6PjXg&0V@.4 3!J.27?7LMlL.B;'(='! )3]98RL ) 8)>%0( 1+;. !,:#x9.YEY8n#)(GlDoT+vEYJJ"(&$-51).K77JK6='O5685)=N2LOLJ84:h;"n7$BJs8-" !+- +,9JA%/74632!3##"&47!5654&#"&264&#"JhGJ12&8T D02B H70,E4E[##$$PW21A7,H-3AD` .L,8=9A$4#2#$0$J&2C74632!3##"&547!5654&#"&2654&#"2654'#"&'JhGJ12&8T -Q@?Q0H70,E4E0  P:4% 0PW21A7,H#A@ZX>C% .L,8=9A$4X8*" %5& &J 32!3#"'&54>2&#"3265!5>54&#"&546La&>Na<=!c>,D-8<9B$4WPWJ 5X74632!3#"&54632.#"326=!5654&#"&2'654&#"#54&#"&546326JhGJ12&8TffN}^zC' Z07_YChQH70,E4E%   $PW21A7,4RSA67FB $,'$.f .L,8=9A$4%  ::  & J @74632!3!5654&#"&4632&#";2#"'732654&+"&JhGJ12&8TH70,E4EH6U.#D%4?52,5V,&K#0 @'0PW21A7,H .L,8=9A$4.30$1$//&.J HR74632!3!5654&#"&4632&#";2#"&547&'732654&+"&2654&"JhGJ12&8TH70,E4EH6U.#D%4?5298B/.A,3&K#0 @'0&%7$$PW21A7,H .L,8=9A$4.30$1:?0@?16 &.$&&4&J HUj74632!3!5654&#"&2#"&547&'732654&+"&54632&#"32654'#"'#2654'#"&5465JhGJ12&8TH70,E4ES52;=H43I8,&K#0 @'0H6U.#D%4 %  0%4*+2PW21A7,H .L,8=9A$41= D3HG4?" &.#.30$i-# +, '#-JEO74632!3!5654&#"&2'654&#"#"&5467&#"&5463262654'JhGJ12&8TH70,E4E&N]*'$:D<F<'$=(-C@HT<'$!2'8A%PW21A7,H .L,8=9A$41132&#"32>54&#"#"&5467&#"&5463262654'JhGJ12&8TH70,E4EU\{p2BB1>7$7#./";S"F= G41+3(3{Sa  B[4Jh=N1MM-'JK5R* 4^FW2!F15G3J]74632!3!5654&#"&4632632#"&54632.#"32>54.#"#"&547&#".2'654&#"#54&#"&546326'2654'JhGJ12&8TH70,E4EX@'"4Pem8YS@P, ;":.5N' ;(I7.+2D 5;> '     9!8D#PW21A7,H .L,8=9A$4?^du-"%-+ /KJ%BH/=P4JM-P8M5S) M  (   7J/6H!0J?74632!3!5654&#"&2'654&#"#54&#"&546326JhGJ12&8TH70,E4EQ7G3,>-) 9'(1KUG>9$#PW21A7,H .L,8=9A$4@Z@3N(\0@ѵ%"B/[%/g?\10JAK74632!3!5654&#"&2#"&547&#"#54&#"&5463262654&'JhGJ12&8TH70,E4E14J>$(8D,9")2MXC?6$.V-#BPW21A7,H .L,8=9A$4@54&#"&546La&7T\.#<+#.H-3@B!'62,E5Dh)cA7,: 2$(#+#979C+% B$+9=9B#3YPWJ>?J74632!3##"&547#5654&#"&54632!5!5654&#"&2654&#"JhGJ12&8T*B.1@*0#+$.G-2A BH70,E4E\$%%&PW21A7,D3.BA/3 2'($*";69B+% .L,8=9A$4P&%&5%J?K]74632!3##"&547#5654&#"&54632!5!5654&#"&2654&#"2654'#"&547JhGJ12&8T(3I23I30#+$.G-2A BH70,E4ED H6*+PW21A7,D$>5FF5>$ 2'($*";69B+% .L,8=9A$4xP-#++ (!JZ K74632!3#"&54632&#"3265!5654&#"&5463235!5654&#"&JhGJ12&8TJR/bK>2,+!+/"47/#-$.D02A9H70,E4EPW21A7,.:R 6D4)($*";4;?.$ .L,8=9A$4J :C74632!3!5654&#"&2!5654&#"&546323546"354&JhGKb&8TH70,E4E96S4.$-#.F./DmOD"8>PWd@7,H .L,8=9A$4>IF 2#(#-";5994$;C&23gE>JENX74632!3!5654&#"&2##"&547!5654&#"&546323546"354&264&"JhGKb&8TH70,E4E96S)B.1@*.$-#.F./DmOD"8>$$7%&PWd@7,H .L,8=9A$4>IF3.BA/3 2#(#-";5994$;C&23gE>x&4&&$JENYl74632!3!5654&#"&2##"&547!5654&#"&546323546"354&2654'#2654'"&547JhGKb&8TH70,E4E96S&4I23I3.$-#.F./DmOD"8>'$%5*<+2PWd@7,H .L,8=9A$4>IF=5FH3> 2#(#-";5994$;C&23gE> P-# +*  (#-HD22!3!".54732>=!5654&#"&546Df$9P=[P5vw-CP2#QG=)-E4Dh*SP>%@&Zs}q`ngH -/M44<9B$2YQVH>J"&547#".54732>=!5654&#"&54632!32654&#"Q-@`A;Q<[P5vw-CP2#QG=)-E4DhFDf$9P~'$*% 5),EB/! &Zs}q`ngH -/M44<9B$2YQVSP>%@N$*#'Hb@K]#"&547#".54732>=!5654&#"&54632!32654&#"2654'#"&'D! V=%@U1Z9($ %1+!*9JEO74632!3!5654&#"&#"&=4&#"#"&5463232654.'2654'JhGJ12&8TH70,E4El&/ J-,B,"N9".4f@3K%6 ' $DPW21A7,H .L,8=9A$4<>3LF>90,@AT27K6TZB@*1);4+5(!@9C@/JM\f74632!3!5654&#"&#"&547&=4&#"#"&5463232654.'2654&'+'2654'JhGJ12&8TH70,E4El&/ 77B.1@04,"N9".4f@3K%6 ' $#!&$DPW21A7,H .L,8=9A$4<>3U( @.BA/9!$D0,@AT27K6TZB@*1);4+5f&$$$(!@9C@/JOYcw74632!3!5654&#"&#"&5467&=4&#"#"&5463232654.'264&"'2654'2654'#"&547JhGJ12&8TH70,E4El&/ C%I23I*4,"N9".4f@3K%6 ' &$D$6+)3PW21A7,H .L,8=9A$4<>3a$:#5FF5%= F0,@AT27K6TZB@*1);4+5%(!@9C@/-# *+ (#-JL74632!3!5654&#"&4'7#"&=4&#"#54&#"&54632632326JhGJ12&8TH70,E4EQ^<7-C-%9# 7MVL28$"6-C,#)PW21A7,H .L,8=9A$4d$*y:Q>518/ѵ(!93b%.t@O0.>38.-?JTc74632!3!5654&#"&4'7#"&547&=4&#"#54&#"&546326323262654&'+JhGJ12&8TH70,E4EQ^09B.1@,7-%9# 7MVL28$"6-C,#)H$&PW21A7,H .L,8=9A$4d$*yN& @.BA/6"E18/ѵ(!93b%.t@O0.>38.-?&%$JT`t74632!3!5654&#"&4'7#"&547&=4&#"#54&#"&546326323262654'#"'2654'#"&547JhGJ12&8TH70,E4EQ^4;I23I18/ѵ(!93b%.t@O0.>38.-?  i-# ++ (#-J*c74632!3!5654&#"&2654'7#"54632&#"3265#"&'&'&#"#54&#".54632632JhGJ12&8TH70,E4EF)+DZ(N7\1F'E0RFO<70&:,/N(2D=5' 63?PW21A7,H .L,8=9A$4K)U'M*JE)3 XJ1Q/g ҵ,M*Z"P3:a0/Q,Q("=&.MJjy74632!3!5654&#"&#"&547#"&547327#"&=4&#"#54&#".5463263232654&'2654&#"JhGJ12&8TH70,E4Ej0*N ,A./A9A<9U-;0 ;#.(K).DA3# 9>1&*$)!%% %PW21A7,H .L,8=9A$4>$G/`> 3#*;<) gNB-&6!C+j95*,=<-" +FH%I=8=Q56FD.A 8#T'_3K(&5#F 4!%C  D&$# "&JD*5@2##"&547!5654&#"&546323546"!54.2654&'#Q~D11CH<+,E4EiEFg%xf6U#013#/mk*2CD1).N25=9A$4XPVVN7+\b6QKΠ8S+#! 1J)4?P2#"&547!5654&#"&546323546"!54.2654&#"2654'#"&'Q~ ,R~Q/-H<+,E4EiEFg%xf6U#01 , C*83%!0:mk$>?\W>C%.N25=9A$4XPVVN7+\b6QKΠ8S+u8)# &3%)4JMX`hq2!5654&#"&5463235462#"/32654&+"'#"&54>7632>32"!54..#"3265#32=#"Q~GH<+,E4EiEFg%x*0*#-1i,'0",#* 46U#01  #~j(>mk.N25=9A$4XPVVN7+\b1("3 # "!9]224* 5/-$QKΠ8S+#$4$0!;E/4*<8JR]dmv2!5654&#"&5463235462#"/32654&+53254+#"'#"&547634632"!54.4&#"3265#32=#"Q~GH<+,E4EiEFg%x$ #, *423+&1,E2+&386U#01$ $}j(>mk.N25=9A$4XPVVN7+\b  :JEP2!5654&#"&5463235464632&#";2#"'732654&+"&"!54.Q~GH<+,E4EiEFg%x!N0V.!E%4>62,5V,B#0 @'0E6U#01mk.N25=9A$4XPVVN7+\b4-0$1$//.$QKΠ8S+J Cb2654&#""!54.#"&547&'732654&+"&54632&#";22!5654&#"&5463235482""# 6U#/2d';,-;B%&K#0 @'0H6T0#D%4?52~GH<+,E4EiEFg%K""" QKΠ8S+M /%*>=+((&.#.30$1/mk.N25=9A$4XPVVN7+ZJP[l2!5654&#"&546323546#"&547&'732>7654&+"&54632&#";2"!54.2654&#"#2654'"&547#Q~GH<+,E4EiEFg%x)4M67J%?)$L   @(0N0W-'@%5?706U#01 *;.@-  9mk.N25=9A$4XPVVN7+\b* D-9IL64'&& 0!4-0%/'QKΠ8S+ Z;)%!+*"-*:JIT]2!5654&#"&5463235462'654&#"#"&5467&#"&546326"!54.2654'Q~GH<+,E4EiEFg%xqO\*'$9B<G<'&:(.A?GU;)""6U#01-&8Amk.N25=9A$4XPVVN7+\b,dB(K -I7Y32&#"32>54&#"#"&5467&#".546326"!54.2654'Q~GH<+,E4EiEFg%xlU\{p2BB1>7$9'';S"F> G41+3(2=?"&_;$"6U#01k!9?mk.N25=9A$4XPVVN7+\b*{Sa  B[4Jh=N1MM-'JI7R* O*GVQKΠ8S+\2!F15G3JCN2!5654&#"&5463235462'654&#"#54&#"&546326"!54.Q~GH<+,E4EiEFg%x7G4*>-) 9'(1KVDB9$#6U#01mk.N25=9A$4XPVVN7+\b(Z@2P(\0@ѵ%"B/[%0f:a10QKΠ8S+JEPZ2!5654&#"&5463235462#"&547&#"#54&#".546326"!54.2654&'Q~GH<+,E4EiEFg%xJS>$(8D,9")2M3%C?6$. 6U#01-$Bmk.N25=9A$4XPVVN7+\b(nE?=A9P8 Ѵ(!F1X"V%:a0/QKΠ8S+Z#(G6C'JXXcn2!5654&#"&5463235464632632#"'732654'#"&5467&#"#54&#"&"!54.2654'Q~GH<+,E4EiEFg%xN64&*=&E=8\N'% ?K< =$%3;.:1:""9",Z6U#01%"%3!mk.N25=9A$4XPVVN7+\bCX0.)"T1Elg;R "FA8/.H, ˵(!@7!G,QKΠ8S+Z)-*1$%#J:E2!5654&#"&546323546233!5654&#"&546"!54.Q~GH<+,E4EiEFg%xB3A;/#/$/G6U#01mk.N25=9A$4XPVVN7+\bB+$ 3(#)*";78QKΠ8S+JDOX2!5654&#"&546323546233##"&47#5654&#"&546"!54.264&"Q~GH<+,E4EiEFg%xB3A;%C..A#/#/$/G6U#017&%8#%mk.N25=9A$4XPVVN7+\bB+$ 10@@` 3(#)*";78QKΠ8S+%5&%6%JDOZm2!5654&#"&546323546233#"&547#5654&#"&546"!54.264&#"2654'#"&547Q~GH<+,E4EiEFg%xB3A;-5HgH4/#/$/G6U#01$6(+2mk.N25=9A$4XPVVN7+\bB+$ #A4GH3B" 3(#)*";78QKΠ8S+'P-#,*  '!/J)4EM2!5654&#"&5463235464>32!"!54.54.'&'74&#"6Q~GH<+,E4EiEFg%x;/h6U#01n '*<Almk.N25=9A$4XPVVN7+\bl.9<xQKΠ8S+Sg&3 .. !TNJ 2=NVb2!5654&#"&5463235464>32#"&547#"!54.54.'&'74&#"62654&'#Q~GH<+,E4EiEFg%x;/&B]A%nh6U#01n '*<Al8%mk.N25=9A$4XPVVN7+\bl.9<x`@?1/QKΠ8S+Sg&3 .. !TN%#$J3>OWcv2!5654&#"&5463235464>32#"&547#"!54.54.'&'74&#"62654&+"2654'#"&547Q~GH<+,E4EiEFg%x;/*3HgH2bh6U#01n '*<Al $6(+2mk.N25=9A$4XPVVN7+\bl.9<x$<4GH3=#QKΠ8S+Sg&3 .. !TN#P-#,*  (#-JDF=H2#".54673267!5654&#"&546323546"!54.v^r#3RNoW>|qC.6&3+;dr I;,2@4CbLK`%qK>N$ ?z^$9&%?dnJKt=4fC?\U55H0L.:C2B$1ZK\ZI=&Wh6YCΞ@C*JPCNZ#"&547# '&5467;2>75!5654&#"&54632354632"!54.2654&#"-:6/A Qxr-7&-1fhlwAI;,1A4CbLK`%pV]s>N$ ?6%&+'y 5+&IA.ZWLr>.dKHJ2&0L.:B3B$1ZJ]ZI=&Whz^EYCΞ@C*T%'! %JfOCNYj#"&547# '&5467;2>75!5654&#"&54632354632"!54.2654&"2654'#"&'%1V<=UEwr.6&3+fhmvAI;,2@4CbLK`%qU^r>N$ ? (!R:2$!0H-?SU=/#ZWKt=4fCHJ2&0L.:C2B$1ZK\ZI=&Whz^TYCΞ@C*d Y9($ %1, +JIT]2!5654&#"&546323546#"&=4&#"#"&5463232654.'"!54.2654'Q~GH<+,E4EiEFg%x&. K-*B-"N9#-3e@3K%7 & V6U#01"E%mk.N25=9A$4XPVVN7+\b,@2KG=:0+AAT36J7TZAA*1):5+5 QKΠ8S+`+A8'LOJQ\dm2!5654&#"&546323546#"&547&=4&#"#"&5463232654.'"!54.264&"'2654'Q~GH<+,E4EiEFg%x&. :5B/0?32-"N9#-3e@3K%7 & V6U#018%%8#"E%mk.N25=9A$4XPVVN7+\b,@2W(#=/AB.?!E0+AAT36J7TZAA*1):5+5 QKΠ8S+%5&&5+A8'LOJR]js2!5654&#"&546323546"&5467&=4&#"#"&5463232654.'"!54.2654'#"''2654'2654'"&547Q~GH<+,E4EiEFg%x&. ?"HgH'0-"N9#-3e@3K%7 & V6U#01# ""E%$6*<+2mk.N25=9A$4XPVVN7+\b,@2[(9!4GH3%:!C0+AAT36J7TZAA*1):5+5 QKΠ8S+  !}+A8'LO-# +*  (#-JT_2!5654&#"&546323546#"&=4&#"#54&#"&5463263232654&'"!54.Q~GH<+,E4EiEFg%x)=7/A-%9$ 7LWM17&!7+D,$(".R6U#01mk.N25=9A$4XPVVN7+\b' ,2&9R?418/ѵ]b%.tDK0.=48.->-%NQKΠ8S+J\gu2!5654&#"&546323546#"&547&=4&#"#54&#"&5463263232654&'"!54.2654&'#"'Q~GH<+,E4EiEFg%x)9/;-*=,7-%9$ 7LWM17&!7+D,$(".R6U#014"  mk.N25=9A$4XPVVN7+\b' ,2&U'8*<:,7E18/ѵ]b%.tDK0.=48.->-%NQKΠ8S+#! J]hu2!5654&#"&546323546#"&5467&=4&#"#54&#"&5463263232654&'"!54.2654'#"'2654'"&547Q~GH<+,E4EiEFg%x)6:L67K')-%9$ 7LWM17&!7+D,$(".R6U#01 ");.@-.:mk.N25=9A$4XPVVN7+\b' ,2&R($G7KL6&=;18/ѵ]b%.tDK0.=48.->-%NQKΠ8S+  #[:+% !+*" 4*;J*ju2!5654&#"&5463235462654'7#"54632&#"32>5#"=4&#"#54&#".54632632"!54.Q~GH<+,E4EiEFg%x)+DZ *E,Z2E)F2R+> *1k"#(9(3N(2D>5' 7'66U#01mk.N25=9A$4XPVVN7+\b!I+T(M <=-3 341y1:(ҵ-J-Z"O3:a0/1=!!8QKΠ8S+J8P[2!5654&#"&5463235462'654&#".546!2'654&#".546"!54.Q~GH<+,E4EiEFg%x3W8-A?#'>H $, [3W8-A?#'>H )2[N6U#01mk.N25=9A$4XPVVN7+\b(FP5Q M9276V<,*= B;'+:H (4[;8R,8R7.B;'&@ ) '[6U#012#"4"mk.N25=9A$4XPVVN7+\b$<,*<:X M56:3VN1JRLJ@LJ4R M563:!B (+"JRQKΠ8S+#$$JAZeo2!5654&#"&546323546#"&547'654&#".54632%2'654&#".546"!54.2654&#"2654'"&547Q~GH<+,E4EiEFg%x4LL67K8A?#*;G $, [:3W,3W8.A?#'>G $, [6U#01* X9.@- *mk.N25=9A$4XPVVN7+\b%JnKL6F% M9285V=.KQFP=FP4R M9276V=.KQQKΠ8S+(t<(%!+*"5*JB@JV%33##"&547#5>54.#"#4&#"632#"&547632>32264&#"%2654&#"+*HB12B/3 6%(:RG/YU +=483;AIDCi[DK)[^x$$##E#%**9l#H.1CE/.x?43+#,(6hbHU92RnOtNOP",{A"4"#2#1 !5))-(J ?K\h%33#"&547#5>54.#"#4&#"632#"&547632>322654&#"2654'#"&'%2654&#"+*H ,Q~Q0/3 6%(:RG/YU +=483;AIDCi[DK)[^O #P:4% 0#%**9l#H#A@ZX>C%x?43+#,(6hbHU92RnOtNOP",{UX8*" '3& &1 !5))-(MUa%33#".54632&#"326765!5654&#"#4&#">32#"&54632>322654&#",;'S%+$DOBN4W?J&P!m`,ABjJ=0*SH4+C' */G>6CKsk.K&Uo,''#)4f#H:L.  !, #)][iKg-!,)4+<,X79IjOxM"+0 %247J5^j%33!5>54.#"#4&#"632#"&547632>322'654&#"#".547326=46%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^o4@*P,$#@*.;U#",&#F^#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{O=&1-%Y-B-80565?!i14/0C%,5>54.#"#4&#"632#"&547632>322+"3!!"&546;2654&#"#"&546732654&546%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^g/<F<$H!'"&27($ >,-N-2*&6&=h#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{/9?f 2('P5+<*5!+5?D)J ?#03$) ,3E1 !5))-(JZ5z%33!5>54.#"#4&#"632#"&547632>322+"3!!"&546;2654&+532654&#"#"&5467326=476%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^e5F)):=$Q"&$$-$&!?,-O6*%,6&#k#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{6!%- 7 2)'!"""737AB.H  <(/3!%A.F1 !5))-(J,5iu%33!5>54.#"#4&#"632#"&547632>322#"54632&#"32>54&#"#"&546732=46%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^X@IxiU.G4+/LQ2I%2&;;,8D(6-$/(:;}#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{tPh9+FD"A`1GV>)YL$/@k:FC1 !5))-(J 5%33!5>54.#"#4&#"632#"&547632>322+"32632#"&547#"&546;2654&#"#54&#"632#"&5463262654&#"%324#"%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^|+H@J!!% " #' _V"#;=*-'"5+ $ #J4>%X   8#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{3,$;L#!  ,&1/"#9D &#-4$$  D1 !5))-(JA5%33!5>54.#"#4&#"632#"&547632>322#!"3!!"&463!2654&'#"&547#"&54;2654&#"#54&#"632#"&54632>32+"3262654#"$324#"%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^u84/2%i$" &)1 #&UU/0-&!6*") %J,J! :+;DR8: "  ~#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{10 '"' !  ,# V/)$34$&%+4#

R[ D1 !5))-(JN5%33!5>54.#"#4&#"632#"&547632>32232#!"3!!"&463!254춮&##"&547#"&54;2654#"#4'&#"632#"&54632>2654"'254""3267+&%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^i(4X o W #   r)yh 2834 0# "@+@, 6..`'+m-#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{7!L-  &*  " O#V&?R 9(*''8"  !xI1 !5))-(J&5%33!5>54.#"#4&#"632#"&547632>322#"&4632&#"32>54&'#"&547#"&546;2654&#"#54&#"632#"&54632>32+"3262654#"$324#"%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^e?Cdl$^S-H.&7N3.D#!#& YU$*BH/."&7*!* &L,K 9.6?E.* !  #%**9l#Hx?43+#,(6hbHU92RnOtNOP",{F-7\8 )+ .  /%/24* . *$&%+4#8&(A!VX D1 !5))-(J5`l%33!5>54.#"#4&#"632#"&547632>322#"/32654&+532654&#"&54>%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^w4>.0=8% ((&##$(E2/C#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{6 (0": )$ !CN5>G73K$A1 !5))-(J 5jy%33!5>54.#"#4&#"632#"&547632>322#"&547'632654&+532654&#"&54>264&'#+2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^w4>.0.0A.0@7  +((&##$(E2/$  &@#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{6 (0/!;0@B.A  #$ !CN5>G73K$P&4" $1 !5))-(J5lz%33!5>54.#"#4&#"632#"&547632>322#"&5467'6;3654&+532654&#"&54>2654'##"'2654'#"&5472654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^w4>.0.;I23I&-((&##$(E2/$  0%5(+2S#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{6 (0/%C5FH3$;  $$ !CN5>G73K$ i-#,*  (#-1 !5))-(JP5nz%33!5>54.#"#4&#"632#"&547632>32#"&5432&#"32654&+532654&"&54>32%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^*&/..Lq4&*B<(#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{ 9!$5 .   1+%5$-(4="7=K387";$51 !5))-(J 5[g%33!5>54.#"#4&#"632#"&547632>32#"'#"&54>7326=332654'%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^TM183M ,% 1&:% 6J#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{.iHQ11SE1>J&=5!϶&#<;U%R1 !5))-(J 5dr~%33!5>54.#"#4&#"632#"&547632>32#"&547&'#"&54>7326=332654'2654&'+2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^T99<*,<$#51M ,% 1&:% 6J"4! d#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{.iX*@,;=*1 1SE1>J&=5!϶&#<;U%m#!1 !5))-(J 5es%33!5>54.#"#4&#"632#"&547632>32#"&5467&'#"&54>7326=332654'2654'"'"2654'"&5472654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^TA?J86L/ #51M ,% 1&:% 6J' )<.@.-;k#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{.i^)&K6LK7-: 1SE1>J&=5!϶&#<;U%# [:+" !++! 4+:#1 !5))-(J85s%33!5>54.#"#4&#"632#"&547632>32#"&5432&#"3265#"'#"&54>7326=332654'%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^-++<1-WB& :E%>^#3;"&41M(>5 #76!?F"#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{"]O54.#"#4&#"632#"&547632>32#"&54632.#"32#"'#"&5467326=332654&'2'654&#"#54#"&5463262654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^s$2yn7XT=P, :*(< =,:$%57F2);%+(5!,-)!I    #%**9l#Hx?43+#,(6hbHU92RnOtNOP",{GU1u.!$.+&133_94P+[,H"϶1L.*B &  1 !5))-(J5^j%33!5>54.#"#4&#"632#"&547632>322'654&#"#54&#"&546326%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^m7G(?-) 9')0 UF?9#&h#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{Z@#,()[.Bѵ%"A0 '$ /g=^10E1 !5))-(J5Zdp%33!5>54.#"#4&#"632#"&547632>322"&547&#"#54&#"&5463262654&'2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^NKR=H=D,8")2!+YC?5&.U-#Bb#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{oD@<<>P8 Ѵ(!F1G-h:a0/#(G6C("1 !5))-(JX5nw%33!5>54.#"#4&#"632#"&547632>324632632#"'732654'#"&5467&#"#54&#"&!264'2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^P35&*<'F=8\N'% ?J; <$%3<,7#5>54.#"#4&#"632#"&547632>325#%2654&#"+*H*8\7 /3 6%(:RG/YU +=483;AIDCi[DK)[^h+)#%**9l# /:-x?43+#,(6hbHU92RnOtNOP",{:91 !5))-(J| GOYe%33##"&547!5>7#5>54.#"#4&#"632#"&547632>325#2654&#"2654&#"+*HD02B8\7 /3 6%(:RG/YU +=483;AIDCi[DK)[^h+)4"$#d#%**9l# )2BE/, /:-x?43+#,(6hbHU92RnOtNOP",{:9$"$0K1 !5))-(J;EMXjv%33#"&547#5>7#5>54.#"#4&#"632#"&547632>325#2654&"2654'#"&'2654&#"+*H",Q~Q.8\7 /3 6%(:RG/YU +=483;AIDCi[DK)[^h+) (" $)94%1:o#%**9l##\X=A( /:-x?43+#,(6hbHU92RnOtNOP",{:9 X:)" '3% '71 !5))-(J5s%33!5>54.#"#4&#"632#"&547632>322#"/32654&"&'&5463232654&#"&4>32#"&#"326%2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^ !4;1.*/"! *3# + **-E1/=D/2#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{$(     #CS0CJhJ$;!  1 !5))-(JDyS^33#".547;2>7!5654&#"#4&#"632#".54>326322654&"XI~-IqtX/Y)',K~`>]f?gH=&4SM14L&-@7;=6 39^:aE8[N_&(@(# eHP^ 3UYp%2cLNpB& 3&\|D\,$,-1.J7GU7:K&3/1`R3OOk."#2.#5J_kv#"&547+".547;2>75!5>54&#"#4&#"632#".54>32632332654&#"2654&">"->21@ RgtX/Y)',K~`;UiC ,;H=&4SM14L&-@7;=6 39^:aE=VM`XI g(,(&X&(@(#s =&*E@/3UYp%2cLNpB& 1&'oBD\,$,-1.J7GU7:K&3/1`R3OOiPeBB%"#'J."#2.#5Jf\gx#"&547#".547;2>75!5>54&#"#4&#"632#".54632632332654&#"2654'#"&'2654&".*6V54.#"#4&#"632#"&547632>32#"&=4&#"#"&5463232654.'2654'2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^6*J-+B-"N9"-4f>1M&6 ' %F:#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{X,LF<;0+AAT27K6UY=E*0*;4+5) B7@# /C1 !5))-(J 5gr}%33!5>54.#"#4&#"632#"&547632>32#"&547&=4&#"#"&5463232654.'2654&"'2654'2654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^6*:!B.2>26-"N9"-4f>1M&6 ' &%7$$%F:#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{X,X'4 .BB.>#G0+AAT27K6UY=E*0*;4+5b$&'&) B7@# /C1 !5))-(J 5fr}%33!5>54.#"#4&#"632#"&547632>32"&5467&=4&#"#"&5463232654.'2654'#"''2654'2654'#"&5472654&#"+*Hn/3 6%(:RG/YU +=483;AIDCi[DK)[^6*?=GfI'0-"N9"-4f>1M&6 ' ,$ "%F%5,*3]#%**9l#Hx?43+#,(6hbHU92RnOtNOP",{X,]&#G3HF5%:!C0+AAT27K6UY=E*0*;4+5  !d) B7@# /-# ++ (#-1 !5))-(H`H%2+"3!!"&546;254#"#"5463232654&#"&54>32#"&#"327'>/8##>-@>/^=MW4'AU%*1^BF{1 G*L7/AD4(*2#"&#"326'%:&0LG!^_!!%Ez"u/*0DE02)AN)*1^z/!? &J*%+2!0H$vvkt3/gb;5*2 !*/ )%P_ uK2XQ/GB.'J F%2#"&54632&#"32654'&#"&54>32654&#"&54632#'"3_Pi~vJH<;-/)_W)OQ,K.&..<&:G;.9(){wUy&$PH&p]KjS2%()! +BV',5'!) .,;/W9CeuP~_G70,J'V|%2#".54>32&#"32654&#"#"&54>3232654&#"&54632#"&#"3262'654&#"#4654#".546326IVv7?+EI"s9"j&,/7\D::!+06/ ]/0J, )x0`G=2 6&8S     gcJu{&$.1-  c[8Q8$ + 334-=32#"&#"3H$ "7`>F*J9H66.& F >K6G= &;/8,K[2Mx,#M#--.3%÷m`w'<#-+=<$6.];rC J}Ch=R?'7 "'JQ]#"&547#"&5473254&#"&546323254&#"&54>32#"&#"322654&#"f'<4.CF*J9H66.& F >K6G= &;/8,K[2Mx,#M#L3H$ V%#('>%)G@0÷m`w'<#-+=<$6.];rC J}Ch=R?'7 "'-- /(&(#&JRMZl#"&547.5473254&#"&546323254&#"&54>32#"&#"322654&'2654'#"&'^$)U=?SF*J9H66.& F >K6G= &;/8,K[2Mx,#M#L3H$)&+82#!19 F0@RV<.(¶m`w'<#-+=<$6.];rC J}Ch=R?'7 "'--.S Z9)$%1,!+8MD %-82##"&547#54654.#4&#"62654&'#!'EG+B20C_.0!E-f &e[3#/6qP+0EB3*`DY*0H!<: 4݅z#! 1M$,6F2#"&547#54654.#4&#"62654&"2654'#"&'!'EG+$-QQ0_./"E-f &e0,+R94% 06qP#A@ZX>B&`DZ)0H!<: 4݅zu9)" '3&&H(2<2#"&54632.#"32>5!54>354&#4&#"6i~NqlS'Z?('PK+*8   ,EqJ^@VBC-&1wm0&'0 ( 84+7(/AlQok.:$4@J&H)L[c74632#"&54>32.#"326=!2'654&#"#4654#"&546326754.'&#4&#"6Mmgo2% BEoVk%;6^5 H"2/0:Vb    ,E/f%!eA2.D0u?DI1#5 B!" (*o\2w#  :,$ !/H% /Jfo)$0݅zM .=E2!5462'654&#"#54&#"&546326754'&#4&#"6!&FG+Na7G4*?-)!8$(0KUF?9$%fH&)E-f &e6pP(Z@2P*Z.Bѵ 'B/[%/g=^108!0I!<: 4݅zM  0>FP2!5464632632"&547&#"#54&#".54&#4&#"62654'!&FG+Na^@63!,5B&'8B8>&6$.G%-lMJE-f &e 1="6pP@Y//67E>=<=P7 ϳ( E1X"Oz]0I!<: 4݅zK#'M/4D#+LX  CQYc2!5464632632#"'732654'#"&5467&#"#54&#"&54&#4&#"62654'!&FG+Nab<*(!/?'#, I< /<./&0!0&- =FpMJE-f &e@&6pPCX0.K 95Fke=Q'G@:-1E, ˵&#:+W%,54.#"#4&#".54>326Sk[Ik-0 6%&3S4 @O=9*: (\@R88€ZvNH+{811-#;4jK?g?D27fJHHHB:F233##"&547#5>54.#"#4&#".54>3262654&#"Sk[I D02C!-0 6%&3S4 @O=9*: (\@R88"$"$€ZvNH/3AD0.+{811-#;4jK?g?D27fJHH$"$"H9DV233#"&547#5>54.#"#4&#".54>3262654&"2654'#"&'Sk[I$-R~Q0-0 6%&3S4 @O=9*: (\@R88Z* %*85%19€ZvNH#A?\W>D&+{811-#;4jK?g?D27fJHH W8)# '2% '6ME233#".54>32&#"32>5!5654&#"#4&#"&546326"Tl^NnAM5dcO@$T9Sa+'5% `F<+2S,#ASumUg&&]jQGc!' "10*`dKi*&0@iHoSl{]HHJ:KN233#".546732>765!5>54.#"#4&#".54>326Tj[N)1NAgE8|7.-'&0n‰bt=-0?1'1S4 @O 2#=G']@Q:7[uQB'=(6j[Ut93iOKpV- 5(+{9&@3,$<4lK.91zJ7gKJJJTVb#"&547##".546732>765!5>54.#"#4&#".54>32632332654&#"".>20A M|7.-'&0n‰bt=-0?1'1S4 @O 2#=G']@Q:7NTj[Ng#%$${A)*FB/6j[Ut93iOKpV- 5(+{9&@3,$<4lK.91zJ7gKJJ[uQB]')'%JbTUbs"&547#".546732>765!5>54.#"#4&#".54>32632332654&+2654'"&'&5UxW<|7.-'&0n‰bt=-0?1'1S4 @O 2#=G']@Q:7NTj[N *. D+82H-9T1?ST>+#6j[Ut93iOKpV- 5(+{9&@3,$<4lK.91zJ7gKJJ[uQB+G x9($ %1.):H'3=>32!54632354.#'"67654&354.#4&#"6vE\zXIz7GX24 F- L45)GX24 FI)"(23ANMY@mQF`.2#:9 8EFL"7j@mQF`.2<"7;L/HA$1;GQ>32##"&47!54632354.#'"67654&264&#"354.#4&#"6vE\ D02B!VzXIz7GX24 F- L45)####EGX24 FI)"(23AN-3AD`MY@mQF`.2#:9 8EFL"7#2##2#@mQF`.2<"7;L/H$1<MYc>32#"&547!54632354.#'"67654&2654&"2654'#"&'354.#4&#"6vE\&0Q~Q3zXIz7GX24 F- L45)v!&#P:4% 0GX24 FI)"(23ANE@ZX>E#MY@mQF`.2#:9 8EFL"7X8*" '3& &@mQF`.2<"7;L/Q'08AI2#"&4632&#"3265!54>326354#4&#"6%354#4&#"6xl~\~]W9/<:Ue'dO .C--!D[FI+!iD[FI)"jd-B-d[19K).AjT3:$4|AjT3:"6HD!/674>32#".547325!%54.#4#"6-X=t45AEtO{K0B$@?yUl >-F\&aAj0RJ+HIyb-./Lkl>graDqe:{#4KA!0I_X%N|H-;BM#"&547#".54732=!54>32'54&'&#4#"6264&#"^&>31?!O{K0B$@?yU-X=t45G&,(F\&aAje$$ % 7$-DC./Lkl>graDqe:v0RJ+HIyS|[c0I_X%N|4&6' 6'HZ+7>I[#"&547".54732=!54>32'54&#4#"62654&#"2654'#"&'S4U>>SO{K0B$@?yU-X=t45G@VF\&aAj< 4&(:2#39A3>TV<2&/Lkl>graDqe:v0RJ+HIy[nr0H_X%N|G/Z8*%%1)$+8M  3AIS2!546#"&=4&#"#"&5463232654.'754&#4&#"62654'!&FG+Na3%E)(>* I3"+0`;0F"1$MJE-f &el@6pP,[)KG<;0+AAT/:K6UYC?*1)=2)8Fz]0I!<: 4݅zP,B7C OM  ;IQ[e2!546#"&547&=4&#"#"&5463232654.'754&#4&#"62654&"'2654'!&FG+Na3%87B/.A9,* I3"+0`;0F"1$LKE-f &ev&%7$$@6pP,[)]$!?0@?1B !C0+AAT/:K6UYC?*1)=2)8F{[0H!<: 4݅z$&&4&,B7C OM  <JR_i|2!546#"&5467&=4&#"#"&5463232654.'754&#4&#"62654'"'"'2654'2654'"&547!&FG+Na3%>;I23I+#(* I3"+0`;0F"1$MJE-f &e\ @$6*<+26pP,[)c"%C4GG4(<!?0+AAT/:K6UYC?*1)=2)8Fz]0I!<: 4݅z },B7C O-# ++ (#-OU.<GZ%#"&547#"'#".5463263232654'7>54.#"264&#""327.54.%.A32B 9-5Af=(TGJ-ASAT^eK%X06 *49:!#$$G). !1S5&4A#6 ;)0CD/ %9IBRpVVmALVnBN{vGd?-2 [554.#"2654&#2654'#"&'"327.54.,;R~Q--5Af=(TGJ-ASAT^eK%X706 *49:R94%2). !1S5&4A#% A7>\X>3% %9IBRpVVmALVnBN{Cn d?-2 [532&#"3267#"'#"&5463263232654'>54.#"%327.54.#"7.0_{T;J5,HI%VD33wE9-5zOLK,ASATXkK.8 *499~h&4A#$1MmU%!!*#a yMuVVmAL{ZnBd@-2 [5=hcu}<)-.+O"P^qx%2654'7#"'#".546326322#"/32654&+#"'#"&54>;>32'>54.#""327.54..#"3265#32=#"!^eK%Xs9-5Af=(TGJ-ASAT*0+"-43+).#,#* 06 *49:). !1S5&4A#y! #~j(>"VnBN{g %9IBRpVVmAL1($1 # % 80.227' 5/-$d?-2 [554.#""327.54.4&#"3265#32=#"!^eK%Xs9-5Af=(TGJ-ASAT% #,  *1&3+'05225*45IU)d?-2 [554.#""327.54.4&#"3265#32=#"!^eK%Xs9-5Af=(TGJ-ASAT%$;!+1&7-'/:O."Xfy%2654'7#"'#".546326322#"&54632&#"32>54&+#"'#"&546;4632'>54.#""327.54.4&#"26=#26=#"!^eK%Xs9-5Af=(TGJ-ASAT.;/[>;GS;>4$."0>3M&%!A'4. 3'.0<$'>06 *49:). !1S5&4A#w'&;(z%d;"VnBN{g %9IBRpVVmALQ7;:$"63(7JF338*0B;4>323>'>54.#""327.54.2654&+'.#"327#26=#"!^eK%Xs9-5Af=(TGJ-ASATn@[S$<;1"5 #*$'-1&5)'1"-#* # Bt06 *49:). !1S5&4A#M&z! @~??"VnBN{g %9IBRpVVmAL6Y@SG6J0L3#('.M' ?7226(  5/."4JNd?-2 [554&#"32#"&547##"'#"&546;>326'>54.#""327.54.2654&+'.#"327#32=#"!^eK%Xs9-5Af=(TGJ-ASATs8Z,05( $ /54&'"32#"&=##"'#"&46;4632>76'>54.#""327.54.2654&+'.#"3265#32=#"!^eK%Xs9-5Af=(TGJ-ASATAC"%ʉGnC1˖x*$J-&!+0+1.'#,*<(-& D%06 *49:). !1S5&4A#M$v2 o_#7"VnBN{g %9IBRpVVmAL7D-1!,[s(K|LWI$?.wZF'*#035 .-9<"9_008R)-S/#:@Od?-2 [554.#""327.54.!^eK%Xs9-5Af=(TGJ-ASAT.4!8R$ 206 *49:). !1S5&4A#"VnBN{g %9IBRpVVmALs9(. )! $1d?-2 [554.#""327.54.2654&"!^eK%Xs9-5Af=(TGJ-ASAT.4!8#=+*=#$ 206 *49:). !1S5&4A#4"#2#"VnBN{g %9IBRpVVmALs9(. /-::-0)! $1d?-2 [554.#""327.54.2654&#"2654'"&547!^eK%Xs9-5Af=(TGJ-ASAT.4!8#4M57K4$ 206 *49:). !1S5&4A#* T;.@-,"VnBN{g %9IBRpVVmALs9(. (@8JL6@()! $1d?-2 [554.#""327.54.2654'!^eK%Xs9-5Af=(TGJ-ASAT`N]*'$:D<F<'$=(-C@HT<&%"u06 *49:). !1S5&4A#)'8A%"VnBN{g %9IBRpVVmAL4eA(K .H8X'I O3O- 4^EYLd?-2 [554.#""327.54.2654'!^eK%Xs9-5Af=(TGJ-ASATk-A!?3(v'%%''/ 2# G54.#""327.54.2654'!^eK%Xs9-5Af=(TGJ-ASAT/*0''s ,.0&L*!E<'&:%27?HS7, $@06 *49:). !1S5&4A#0'7B""VnBN{g %9IBRpVVmAL .#73$:&$!; 0C4543 :@,F 'U=FNd?-2 [532&#"32654&#"#"&5467&#".546326'>54.#""327.54.2654'!^eK%Xs9-5Af=(TGJ-ASATVU\6^<2BC0>7$7#./"WYF= G41+3)3M1MM-'JK5R* M.FWNd?-2 [554.#""327.54.2654' 2654'!^eK%Xs9-5Af=(TGJ-ASATBMG6D6A6@4=+1+">7 4< (=8=J4&#A": #06 *49:). !1S5&4A#Q"3:"(#3:"VnBN{g %9IBRpVVmAL4bB\/ ,LR6 +#(2

>;>S5N4R* 1`GU<:Ld?-2 [554.#""327.54.2654'2654'!^eK%Xs9-5Af=(TGJ-ASAT^P; C3r##+75?=5>39,33 <4 4 /-!#K2# ">+$:!~06 *49:). !1S5&4A#W/8& /7"VnBN{g %9IBRpVVmAL8..?a2&6&O5/K+L6325J' #'"-I7335@A)%: G&=E12_d?-2 [554.#""327.54.2654'2654'!^eK%Xs9-5Af=(TGJ-ASAT 0-/(z*,,$&)%;429.1/";327%78@H1"!=*$8!:.M06 *49:). !1S5&4A#K.5-7"VnBN{g %9IBRpVVmAL 6!:1#"% + 0F6425E,#$(,J6417I) >1M %Y>F32'wd?-2 [5$ %$A&*B&O,!"z%2654'7#"'#".546326322#"&54632&#"32654&#"#"&547&#"#54&#"#"&5467&#"&546326326326'>54.#""327.54.2654'!2654'!^eK%Xs9-5Af=(TGJ-ASAT@Qeg.N_9*.7HOM>5 @0)$-< L0( >1'&, ,98=F7'(= G06 *49:). !1S5&4A#O4:2; "VnBN{g %9IBRpVVmAL;gN{ ~g>b=O3JI0K<L(0;O6GN+#KK+V0 9a>T;;Sd?-2 [554.#""327.54.!^eK%Xs9-5Af=(TGJ-ASAT8F(?-) 9')0 UF?:"&06 *49:). !1S5&4A#"VnBN{g %9IBRpVVmAL8Z@#,((\/Aѵ%"A0 '$ .h=^10Pd?-2 [554.#"2654&'"327.54.!^eK%Xs9-5Af=(TGJ-ASATk4J>$'9D+9")2M3%C?6$/o06 *49: #B(=). !1S5&4A#"VnBN{g %9IBRpVVmAL854.#""327.54.2654'!^eK%Xs9-5Af=(TGJ-ASATO45&*=&F<9\N&& ?K< <$%3;.54.#""327.54.!^eK%Xs9-5Af=(TGJ-ASATX4@;/#,$0HF06 *49:). !1S5&4A#"VnBN{g %9IBRpVVmAL`B+% 2(($*";5:xd?-2 [554.#""327.54.264&"!^eK%Xs9-5Af=(TGJ-ASATX4@;%C\A#/#,$0HF06 *49:). !1S5&4A#&%8#%"VnBN{g %9IBRpVVmAL`B+% 10@?1/ 2(($*";5:xd?-2 [554.#""327.54.2654&#"2654'#"&547!^eK%Xs9-5Af=(TGJ-ASATX4@;-5I24H4/#,$0HF06 *49:). !1S5&4A#$6(+2"VnBN{g %9IBRpVVmAL`B+% #A5FH3B" 2(($*";5:xd?-2 [554.#""327.54.!^eK%Xs9-5Af=(TGJ-ASATV3A002